@cookielab.io/oopst 0.3.3 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +7388 -5955
- package/dist/index.js.map +1 -1
- package/package.json +8 -5
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../../../node_modules/.pnpm/commander@15.0.0/node_modules/commander/lib/error.js","../../../node_modules/.pnpm/commander@15.0.0/node_modules/commander/lib/argument.js","../../../node_modules/.pnpm/commander@15.0.0/node_modules/commander/lib/command.js","../../../node_modules/.pnpm/commander@15.0.0/node_modules/commander/lib/help.js","../../../node_modules/.pnpm/commander@15.0.0/node_modules/commander/lib/option.js","../../../node_modules/.pnpm/commander@15.0.0/node_modules/commander/lib/suggestSimilar.js","../../../node_modules/.pnpm/commander@15.0.0/node_modules/commander/index.js","../src/config.ts","../src/sync/errors.ts","../src/sync/parser-factory.ts","../../../packages/parsers/src/claude/index.ts","../../../packages/parsers/src/config.ts","../../../packages/parsers/src/types.ts","../../../packages/parsers/src/walk.ts","../../../packages/parsers/src/claude/bucketize.ts","../../../packages/parsers/src/codex/bucketize.ts","../../../packages/parsers/src/codex/events.ts","../../../packages/parsers/src/claude/events.ts","../../../packages/parsers/src/codex/index.ts","../../../packages/parsers/src/opencode/index.ts","../../../packages/parsers/src/opencode/bucketize.ts","../../../packages/parsers/src/opencode/events.ts","../../../packages/parsers/src/pi/index.ts","../../../packages/parsers/src/pi/bucketize.ts","../../../packages/parsers/src/pi/events.ts","../src/sync/aggregate.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/typeof.js","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPrimitive.js","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPropertyKey.js","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/defineProperty.js","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/objectSpread2.js","../../../node_modules/.pnpm/@trpc+server@11.17.0_typescript@6.0.3/node_modules/@trpc/server/src/observable/observable.ts","../../../node_modules/.pnpm/@trpc+server@11.17.0_typescript@6.0.3/node_modules/@trpc/server/src/observable/operators.ts","../../../node_modules/.pnpm/@trpc+server@11.17.0_typescript@6.0.3/node_modules/@trpc/server/src/observable/behaviorSubject.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/links/internals/createChain.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/links/splitLink.ts","../../../node_modules/.pnpm/@trpc+server@11.17.0_typescript@6.0.3/node_modules/@trpc/server/src/unstable-core-do-not-import/utils.ts","../../../node_modules/.pnpm/@trpc+server@11.17.0_typescript@6.0.3/node_modules/@trpc/server/src/unstable-core-do-not-import/rpc/codes.ts","../../../node_modules/.pnpm/@trpc+server@11.17.0_typescript@6.0.3/node_modules/@trpc/server/src/unstable-core-do-not-import/createProxy.ts","../../../node_modules/.pnpm/@trpc+server@11.17.0_typescript@6.0.3/node_modules/@trpc/server/src/unstable-core-do-not-import/http/getHTTPStatusCode.ts","../../../node_modules/.pnpm/@trpc+server@11.17.0_typescript@6.0.3/node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/typeof.js","../../../node_modules/.pnpm/@trpc+server@11.17.0_typescript@6.0.3/node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPrimitive.js","../../../node_modules/.pnpm/@trpc+server@11.17.0_typescript@6.0.3/node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPropertyKey.js","../../../node_modules/.pnpm/@trpc+server@11.17.0_typescript@6.0.3/node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/defineProperty.js","../../../node_modules/.pnpm/@trpc+server@11.17.0_typescript@6.0.3/node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/objectSpread2.js","../../../node_modules/.pnpm/@trpc+server@11.17.0_typescript@6.0.3/node_modules/@trpc/server/src/unstable-core-do-not-import/error/getErrorShape.ts","../../../node_modules/.pnpm/@trpc+server@11.17.0_typescript@6.0.3/node_modules/@trpc/server/src/unstable-core-do-not-import/error/formatter.ts","../../../node_modules/.pnpm/@trpc+server@11.17.0_typescript@6.0.3/node_modules/@trpc/server/src/unstable-core-do-not-import/error/TRPCError.ts","../../../node_modules/.pnpm/@trpc+server@11.17.0_typescript@6.0.3/node_modules/@trpc/server/src/unstable-core-do-not-import/transformer.ts","../../../node_modules/.pnpm/@trpc+server@11.17.0_typescript@6.0.3/node_modules/@trpc/server/src/unstable-core-do-not-import/router.ts","../../../node_modules/.pnpm/@trpc+server@11.17.0_typescript@6.0.3/node_modules/@trpc/server/src/unstable-core-do-not-import/stream/tracked.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/TRPCClientError.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/internals/transformer.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/getFetch.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/links/internals/httpUtils.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/internals/dataLoader.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/internals/signals.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/links/httpBatchLink.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/links/wsLink/wsClient/encoder.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/links/wsLink/wsClient/options.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/links/internals/urlWithConnectionParams.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/links/wsLink/wsClient/utils.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/links/wsLink/wsClient/requestManager.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/links/wsLink/wsClient/wsConnection.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/links/wsLink/wsClient/wsClient.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/links/wsLink/createWsClient.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/links/wsLink/wsLink.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/internals/TRPCUntypedClient.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/createTRPCUntypedClient.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/createTRPCClient.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/links/httpBatchStreamLink.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/internals/inputWithTrackedEventId.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/asyncIterator.js","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/links/httpSubscriptionLink.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/links/retryLink.ts","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/usingCtx.js","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/OverloadYield.js","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/awaitAsyncGenerator.js","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/wrapAsyncGenerator.js","../../../node_modules/.pnpm/@trpc+client@11.17.0_@trpc+server@11.17.0_typescript@6.0.3__typescript@6.0.3/node_modules/@trpc/client/src/links/localLink.ts","../src/sync/client.ts","../src/sync/run.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { readFileSync, realpathSync } from \"node:fs\";\nimport process from \"node:process\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Harness } from \"@oopst/parsers\";\nimport { Command } from \"commander\";\nimport { DEFAULT_LOOKBACK_DAYS, readCliEnv } from \"./config\";\nimport { EXIT, SyncError } from \"./sync/errors\";\nimport { buildRealParserFactory } from \"./sync/parser-factory\";\nimport { runSync } from \"./sync/run\";\n\ntype PackageJson = {\n\tversion?: string;\n};\n\nfunction readPackageVersion(): string {\n\tconst raw = readFileSync(new URL(\"../package.json\", import.meta.url), \"utf8\");\n\tconst parsed = JSON.parse(raw) as PackageJson;\n\tif (typeof parsed.version === \"string\" && parsed.version.length > 0) {\n\t\treturn parsed.version;\n\t}\n\treturn \"0.0.0\";\n}\n\nconst VERSION = readPackageVersion();\nconst SUPPORTED_HARNESSES = [\"codex\", \"claude_code\", \"pi\", \"hermes\", \"opencode\"] as const satisfies readonly Harness[];\n\nfunction writeStdoutLine(msg: string): void {\n\tprocess.stdout.write(`${msg}\\n`);\n}\n\nfunction writeStderrLine(msg: string): void {\n\tprocess.stderr.write(`${msg}\\n`);\n}\n\nfunction writeUnknownError(err: unknown): void {\n\twriteStderrLine(err instanceof Error ? (err.stack ?? err.message) : String(err));\n}\n\nfunction isEntrypoint(): boolean {\n\tconst [, argvPath] = process.argv;\n\treturn argvPath ? realpathSync(fileURLToPath(import.meta.url)) === realpathSync(argvPath) : false;\n}\n\nfunction isCommanderInfoExit(err: unknown): boolean {\n\tconst { code } = err as { code?: string };\n\treturn code === \"commander.version\" || code === \"commander.help\" || code === \"commander.helpDisplayed\";\n}\n\nfunction parseHarnessFilter(value: string | undefined): Harness | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\tif ((SUPPORTED_HARNESSES as readonly string[]).includes(value)) {\n\t\treturn value as Harness;\n\t}\n\twriteStderrLine(`error: --harness must be one of ${SUPPORTED_HARNESSES.join(\"|\")}`);\n\tprocess.exit(EXIT.invalidArguments);\n}\n\nfunction buildCli(): Command {\n\tconst env = readCliEnv();\n\tconst program = new Command();\n\n\tprogram\n\t\t.name(\"oopst\")\n\t\t.description(\"OopsT — track AI coding token usage across users and devices\")\n\t\t.version(VERSION)\n\t\t.exitOverride();\n\n\tprogram\n\t\t.command(\"sync\")\n\t\t.description(\"Scan local AI coding harness logs and upload hourly usage records\")\n\t\t.option(\"--token <token>\", \"CLI API token (or OOPST_TOKEN env)\")\n\t\t.option(\"--device <name>\", \"Device name (or OOPST_DEVICE env)\")\n\t\t.option(\"--server <url>\", \"Server base URL\", env.serverUrl)\n\t\t.option(\"--lookback-days <days>\", \"Override watermark lookback\", DEFAULT_LOOKBACK_DAYS)\n\t\t.option(\"--harness <harness>\", \"Restrict to codex|claude_code|pi|hermes|opencode\")\n\t\t.option(\"--dry-run\", \"Parse and print without uploading\", false)\n\t\t.option(\"--verbose\", \"Verbose logs\", false)\n\t\t.action(\n\t\t\tasync (raw: {\n\t\t\t\ttoken?: string;\n\t\t\t\tdevice?: string;\n\t\t\t\tserver: string;\n\t\t\t\tlookbackDays: string;\n\t\t\t\tharness?: string;\n\t\t\t\tdryRun: boolean;\n\t\t\t\tverbose: boolean;\n\t\t\t}) => {\n\t\t\t\tconst token = raw.token ?? env.token;\n\t\t\t\tconst device = raw.device ?? env.device;\n\t\t\t\tconst harness = parseHarnessFilter(raw.harness);\n\n\t\t\t\tif (!(token && device)) {\n\t\t\t\t\twriteStderrLine(\"error: --token and --device are required (or set OOPST_TOKEN / OOPST_DEVICE)\");\n\t\t\t\t\tprocess.exit(EXIT.invalidArguments);\n\t\t\t\t}\n\n\t\t\t\tconst lookbackDays = Number.parseInt(raw.lookbackDays, 10);\n\t\t\t\tif (!Number.isFinite(lookbackDays) || lookbackDays < 0) {\n\t\t\t\t\twriteStderrLine(\"error: --lookback-days must be a non-negative integer\");\n\t\t\t\t\tprocess.exit(EXIT.invalidArguments);\n\t\t\t\t}\n\n\t\t\t\tconst factory = buildRealParserFactory();\n\t\t\t\tlet sourcesExistedHint = false;\n\t\t\t\tconst parserFactory = (ctx: Parameters<typeof factory>[0]): ReturnType<typeof factory> => {\n\t\t\t\t\tconst real = factory(ctx);\n\t\t\t\t\tsourcesExistedHint = real.anySourceExisted;\n\t\t\t\t\treturn real;\n\t\t\t\t};\n\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await runSync({\n\t\t\t\t\t\ttoken: token,\n\t\t\t\t\t\tdevice: device,\n\t\t\t\t\t\tserverUrl: raw.server,\n\t\t\t\t\t\tlookbackDays: lookbackDays,\n\t\t\t\t\t\tharness: harness,\n\t\t\t\t\t\tdryRun: raw.dryRun,\n\t\t\t\t\t\tverbose: raw.verbose,\n\t\t\t\t\t\tcolor: process.stdout.isTTY === true,\n\t\t\t\t\t\tlogger: {\n\t\t\t\t\t\t\tinfo: writeStdoutLine,\n\t\t\t\t\t\t\terror: writeStderrLine,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tparserFactory: parserFactory,\n\t\t\t\t\t\tget sourcesExistedHint() {\n\t\t\t\t\t\t\treturn sourcesExistedHint;\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\tprocess.exit(result.exitCode);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (err instanceof SyncError) {\n\t\t\t\t\t\twriteStderrLine(err.message);\n\t\t\t\t\t\tprocess.exit(err.exitCode);\n\t\t\t\t\t}\n\t\t\t\t\twriteUnknownError(err);\n\t\t\t\t\tprocess.exit(EXIT.generalFailure);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\n\treturn program;\n}\n\nif (isEntrypoint()) {\n\tbuildCli()\n\t\t.parseAsync(process.argv)\n\t\t.catch((err: unknown) => {\n\t\t\tif (isCommanderInfoExit(err)) {\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t\twriteUnknownError(err);\n\t\t\tprocess.exit(EXIT.generalFailure);\n\t\t});\n}\n\nexport { buildCli };\n","/**\n * CommanderError class\n */\nexport class CommanderError extends Error {\n /**\n * Constructs the CommanderError class\n * @param {number} exitCode suggested exit code which could be used with process.exit\n * @param {string} code an id string representing the error\n * @param {string} message human-readable description of the error\n */\n constructor(exitCode, code, message) {\n super(message);\n // properly capture stack trace in Node.js\n Error.captureStackTrace(this, this.constructor);\n this.name = this.constructor.name;\n this.code = code;\n this.exitCode = exitCode;\n this.nestedError = undefined;\n }\n}\n\n/**\n * InvalidArgumentError class\n */\nexport class InvalidArgumentError extends CommanderError {\n /**\n * Constructs the InvalidArgumentError class\n * @param {string} [message] explanation of why argument is invalid\n */\n constructor(message) {\n super(1, 'commander.invalidArgument', message);\n // properly capture stack trace in Node.js\n Error.captureStackTrace(this, this.constructor);\n this.name = this.constructor.name;\n }\n}\n","import { InvalidArgumentError } from './error.js';\n\nexport class Argument {\n /**\n * Initialize a new command argument with the given name and description.\n * The default is that the argument is required, and you can explicitly\n * indicate this with <> around the name. Put [] around the name for an optional argument.\n *\n * @param {string} name\n * @param {string} [description]\n */\n\n constructor(name, description) {\n this.description = description || '';\n this.variadic = false;\n this.parseArg = undefined;\n this.defaultValue = undefined;\n this.defaultValueDescription = undefined;\n this.argChoices = undefined;\n\n switch (name[0]) {\n case '<': // e.g. <required>\n this.required = true;\n this._name = name.slice(1, -1);\n break;\n case '[': // e.g. [optional]\n this.required = false;\n this._name = name.slice(1, -1);\n break;\n default:\n this.required = true;\n this._name = name;\n break;\n }\n\n if (this._name.endsWith('...')) {\n this.variadic = true;\n this._name = this._name.slice(0, -3);\n }\n }\n\n /**\n * Return argument name.\n *\n * @return {string}\n */\n\n name() {\n return this._name;\n }\n\n /**\n * @package\n */\n\n _collectValue(value, previous) {\n if (previous === this.defaultValue || !Array.isArray(previous)) {\n return [value];\n }\n\n previous.push(value);\n return previous;\n }\n\n /**\n * Set the default value, and optionally supply the description to be displayed in the help.\n *\n * @param {*} value\n * @param {string} [description]\n * @return {Argument}\n */\n\n default(value, description) {\n this.defaultValue = value;\n this.defaultValueDescription = description;\n return this;\n }\n\n /**\n * Set the custom handler for processing CLI command arguments into argument values.\n *\n * @param {Function} [fn]\n * @return {Argument}\n */\n\n argParser(fn) {\n this.parseArg = fn;\n return this;\n }\n\n /**\n * Only allow argument value to be one of choices.\n *\n * @param {string[]} values\n * @return {Argument}\n */\n\n choices(values) {\n this.argChoices = values.slice();\n this.parseArg = (arg, previous) => {\n if (!this.argChoices.includes(arg)) {\n throw new InvalidArgumentError(\n `Allowed choices are ${this.argChoices.join(', ')}.`,\n );\n }\n if (this.variadic) {\n return this._collectValue(arg, previous);\n }\n return arg;\n };\n return this;\n }\n\n /**\n * Make argument required.\n *\n * @returns {Argument}\n */\n argRequired() {\n this.required = true;\n return this;\n }\n\n /**\n * Make argument optional.\n *\n * @returns {Argument}\n */\n argOptional() {\n this.required = false;\n return this;\n }\n}\n\n/**\n * Takes an argument and returns its human readable equivalent for help usage.\n *\n * @param {Argument} arg\n * @return {string}\n * @private\n */\n\nexport function humanReadableArgName(arg) {\n const nameOutput = arg.name() + (arg.variadic === true ? '...' : '');\n\n return arg.required ? '<' + nameOutput + '>' : '[' + nameOutput + ']';\n}\n","import { EventEmitter } from 'node:events';\nimport childProcess from 'node:child_process';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport process from 'node:process';\nimport { stripVTControlCharacters } from 'node:util';\n\nimport { Argument, humanReadableArgName } from './argument.js';\nimport { CommanderError } from './error.js';\nimport { Help } from './help.js';\nimport { Option, DualOptions } from './option.js';\nimport { suggestSimilar } from './suggestSimilar.js';\n\nexport class Command extends EventEmitter {\n /**\n * Initialize a new `Command`.\n *\n * @param {string} [name]\n */\n\n constructor(name) {\n super();\n /** @type {Command[]} */\n this.commands = [];\n /** @type {Option[]} */\n this.options = [];\n this.parent = null;\n this._allowUnknownOption = false;\n this._allowExcessArguments = false;\n /** @type {Argument[]} */\n this.registeredArguments = [];\n this._args = this.registeredArguments; // deprecated old name\n /** @type {string[]} */\n this.args = []; // cli args with options removed\n this.rawArgs = [];\n this.processedArgs = []; // like .args but after custom processing and collecting variadic\n this._scriptPath = null;\n this._name = name || '';\n this._optionValues = {};\n this._optionValueSources = {}; // default, env, cli etc\n this._storeOptionsAsProperties = false;\n this._actionHandler = null;\n this._executableHandler = false;\n this._executableFile = null; // custom name for executable\n this._executableDir = null; // custom search directory for subcommands\n this._defaultCommandName = null;\n this._exitCallback = null;\n this._aliases = [];\n this._combineFlagAndOptionalValue = true;\n this._description = '';\n this._summary = '';\n this._argsDescription = undefined; // legacy\n this._enablePositionalOptions = false;\n this._passThroughOptions = false;\n this._lifeCycleHooks = {}; // a hash of arrays\n /** @type {(boolean | string)} */\n this._showHelpAfterError = false;\n this._showSuggestionAfterError = true;\n this._savedState = null; // used in save/restoreStateBeforeParse\n\n // see configureOutput() for docs\n this._outputConfiguration = {\n writeOut: (str) => process.stdout.write(str),\n writeErr: (str) => process.stderr.write(str),\n outputError: (str, write) => write(str),\n getOutHelpWidth: () =>\n process.stdout.isTTY ? process.stdout.columns : undefined,\n getErrHelpWidth: () =>\n process.stderr.isTTY ? process.stderr.columns : undefined,\n getOutHasColors: () =>\n useColor() ?? (process.stdout.isTTY && process.stdout.hasColors?.()),\n getErrHasColors: () =>\n useColor() ?? (process.stderr.isTTY && process.stderr.hasColors?.()),\n stripColor: (str) => stripVTControlCharacters(str),\n };\n\n this._hidden = false;\n /** @type {(Option | null | undefined)} */\n this._helpOption = undefined; // Lazy created on demand. May be null if help option is disabled.\n this._addImplicitHelpCommand = undefined; // undecided whether true or false yet, not inherited\n /** @type {Command} */\n this._helpCommand = undefined; // lazy initialised, inherited\n this._helpConfiguration = {};\n /** @type {string | undefined} */\n this._helpGroupHeading = undefined; // soft initialised when added to parent\n /** @type {string | undefined} */\n this._defaultCommandGroup = undefined;\n /** @type {string | undefined} */\n this._defaultOptionGroup = undefined;\n }\n\n /**\n * Copy settings that are useful to have in common across root command and subcommands.\n *\n * (Used internally when adding a command using `.command()` so subcommands inherit parent settings.)\n *\n * @param {Command} sourceCommand\n * @return {Command} `this` command for chaining\n */\n copyInheritedSettings(sourceCommand) {\n this._outputConfiguration = sourceCommand._outputConfiguration;\n this._helpOption = sourceCommand._helpOption;\n this._helpCommand = sourceCommand._helpCommand;\n this._helpConfiguration = sourceCommand._helpConfiguration;\n this._exitCallback = sourceCommand._exitCallback;\n this._storeOptionsAsProperties = sourceCommand._storeOptionsAsProperties;\n this._combineFlagAndOptionalValue =\n sourceCommand._combineFlagAndOptionalValue;\n this._allowExcessArguments = sourceCommand._allowExcessArguments;\n this._enablePositionalOptions = sourceCommand._enablePositionalOptions;\n this._showHelpAfterError = sourceCommand._showHelpAfterError;\n this._showSuggestionAfterError = sourceCommand._showSuggestionAfterError;\n\n return this;\n }\n\n /**\n * @returns {Command[]}\n * @private\n */\n\n _getCommandAndAncestors() {\n const result = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n for (let command = this; command; command = command.parent) {\n result.push(command);\n }\n return result;\n }\n\n /**\n * Define a command.\n *\n * There are two styles of command: pay attention to where to put the description.\n *\n * @example\n * // Command implemented using action handler (description is supplied separately to `.command`)\n * program\n * .command('clone <source> [destination]')\n * .description('clone a repository into a newly created directory')\n * .action((source, destination) => {\n * console.log('clone command called');\n * });\n *\n * // Command implemented using separate executable file (description is second parameter to `.command`)\n * program\n * .command('start <service>', 'start named service')\n * .command('stop [service]', 'stop named service, or all if no name supplied');\n *\n * @param {string} nameAndArgs - command name and arguments, args are `<required>` or `[optional]` and last may also be `variadic...`\n * @param {(object | string)} [actionOptsOrExecDesc] - configuration options (for action), or description (for executable)\n * @param {object} [execOpts] - configuration options (for executable)\n * @return {Command} returns new command for action handler, or `this` for executable command\n */\n\n command(nameAndArgs, actionOptsOrExecDesc, execOpts) {\n let desc = actionOptsOrExecDesc;\n let opts = execOpts;\n if (typeof desc === 'object' && desc !== null) {\n opts = desc;\n desc = null;\n }\n opts = opts || {};\n const [, name, args] = nameAndArgs.match(/([^ ]+) *(.*)/);\n\n const cmd = this.createCommand(name);\n if (desc) {\n cmd.description(desc);\n cmd._executableHandler = true;\n }\n if (opts.isDefault) this._defaultCommandName = cmd._name;\n cmd._hidden = !!(opts.noHelp || opts.hidden); // noHelp is deprecated old name for hidden\n cmd._executableFile = opts.executableFile || null; // Custom name for executable file, set missing to null to match constructor\n if (args) cmd.arguments(args);\n this._registerCommand(cmd);\n cmd.parent = this;\n cmd.copyInheritedSettings(this);\n\n if (desc) return this;\n return cmd;\n }\n\n /**\n * Factory routine to create a new unattached command.\n *\n * See .command() for creating an attached subcommand, which uses this routine to\n * create the command. You can override createCommand to customise subcommands.\n *\n * @param {string} [name]\n * @return {Command} new command\n */\n\n createCommand(name) {\n return new Command(name);\n }\n\n /**\n * You can customise the help with a subclass of Help by overriding createHelp,\n * or by overriding Help properties using configureHelp().\n *\n * @return {Help}\n */\n\n createHelp() {\n return Object.assign(new Help(), this.configureHelp());\n }\n\n /**\n * You can customise the help by overriding Help properties using configureHelp(),\n * or with a subclass of Help by overriding createHelp().\n *\n * @param {object} [configuration] - configuration options\n * @return {(Command | object)} `this` command for chaining, or stored configuration\n */\n\n configureHelp(configuration) {\n if (configuration === undefined) return this._helpConfiguration;\n\n this._helpConfiguration = configuration;\n return this;\n }\n\n /**\n * The default output goes to stdout and stderr. You can customise this for special\n * applications. You can also customise the display of errors by overriding outputError.\n *\n * The configuration properties are all functions:\n *\n * // change how output being written, defaults to stdout and stderr\n * writeOut(str)\n * writeErr(str)\n * // change how output being written for errors, defaults to writeErr\n * outputError(str, write) // used for displaying errors and not used for displaying help\n * // specify width for wrapping help\n * getOutHelpWidth()\n * getErrHelpWidth()\n * // color support, currently only used with Help\n * getOutHasColors()\n * getErrHasColors()\n * stripColor() // used to remove ANSI escape codes if output does not have colors\n *\n * @param {object} [configuration] - configuration options\n * @return {(Command | object)} `this` command for chaining, or stored configuration\n */\n\n configureOutput(configuration) {\n if (configuration === undefined) return this._outputConfiguration;\n\n this._outputConfiguration = {\n ...this._outputConfiguration,\n ...configuration,\n };\n return this;\n }\n\n /**\n * Display the help or a custom message after an error occurs.\n *\n * @param {(boolean|string)} [displayHelp]\n * @return {Command} `this` command for chaining\n */\n showHelpAfterError(displayHelp = true) {\n if (typeof displayHelp !== 'string') displayHelp = !!displayHelp;\n this._showHelpAfterError = displayHelp;\n return this;\n }\n\n /**\n * Display suggestion of similar commands for unknown commands, or options for unknown options.\n *\n * @param {boolean} [displaySuggestion]\n * @return {Command} `this` command for chaining\n */\n showSuggestionAfterError(displaySuggestion = true) {\n this._showSuggestionAfterError = !!displaySuggestion;\n return this;\n }\n\n /**\n * Add a prepared subcommand.\n *\n * See .command() for creating an attached subcommand which inherits settings from its parent.\n *\n * @param {Command} cmd - new subcommand\n * @param {object} [opts] - configuration options\n * @return {Command} `this` command for chaining\n */\n\n addCommand(cmd, opts) {\n if (!cmd._name) {\n throw new Error(`Command passed to .addCommand() must have a name\n- specify the name in Command constructor or using .name()`);\n }\n\n opts = opts || {};\n if (opts.isDefault) this._defaultCommandName = cmd._name;\n if (opts.noHelp || opts.hidden) cmd._hidden = true; // modifying passed command due to existing implementation\n\n this._registerCommand(cmd);\n cmd.parent = this;\n cmd._checkForBrokenPassThrough();\n\n return this;\n }\n\n /**\n * Factory routine to create a new unattached argument.\n *\n * See .argument() for creating an attached argument, which uses this routine to\n * create the argument. You can override createArgument to return a custom argument.\n *\n * @param {string} name\n * @param {string} [description]\n * @return {Argument} new argument\n */\n\n createArgument(name, description) {\n return new Argument(name, description);\n }\n\n /**\n * Define argument syntax for command.\n *\n * The default is that the argument is required, and you can explicitly\n * indicate this with <> around the name. Put [] around the name for an optional argument.\n *\n * @example\n * program.argument('<input-file>');\n * program.argument('[output-file]');\n *\n * @param {string} name\n * @param {string} [description]\n * @param {(Function|*)} [parseArg] - custom argument processing function or default value\n * @param {*} [defaultValue]\n * @return {Command} `this` command for chaining\n */\n argument(name, description, parseArg, defaultValue) {\n const argument = this.createArgument(name, description);\n if (typeof parseArg === 'function') {\n argument.default(defaultValue).argParser(parseArg);\n } else {\n argument.default(parseArg);\n }\n this.addArgument(argument);\n return this;\n }\n\n /**\n * Define argument syntax for command, adding multiple at once (without descriptions).\n *\n * See also .argument().\n *\n * @example\n * program.arguments('<cmd> [env]');\n *\n * @param {string} names\n * @return {Command} `this` command for chaining\n */\n\n arguments(names) {\n names\n .trim()\n .split(/ +/)\n .forEach((detail) => {\n this.argument(detail);\n });\n return this;\n }\n\n /**\n * Define argument syntax for command, adding a prepared argument.\n *\n * @param {Argument} argument\n * @return {Command} `this` command for chaining\n */\n addArgument(argument) {\n const previousArgument = this.registeredArguments.slice(-1)[0];\n if (previousArgument?.variadic) {\n throw new Error(\n `only the last argument can be variadic '${previousArgument.name()}'`,\n );\n }\n if (\n argument.required &&\n argument.defaultValue !== undefined &&\n argument.parseArg === undefined\n ) {\n throw new Error(\n `a default value for a required argument is never used: '${argument.name()}'`,\n );\n }\n this.registeredArguments.push(argument);\n return this;\n }\n\n /**\n * Customise or override default help command. By default a help command is automatically added if your command has subcommands.\n *\n * @example\n * program.helpCommand('help [cmd]');\n * program.helpCommand('help [cmd]', 'show help');\n * program.helpCommand(false); // suppress default help command\n * program.helpCommand(true); // add help command even if no subcommands\n *\n * @param {string|boolean} enableOrNameAndArgs - enable with custom name and/or arguments, or boolean to override whether added\n * @param {string} [description] - custom description\n * @return {Command} `this` command for chaining\n */\n\n helpCommand(enableOrNameAndArgs, description) {\n if (typeof enableOrNameAndArgs === 'boolean') {\n this._addImplicitHelpCommand = enableOrNameAndArgs;\n if (enableOrNameAndArgs && this._defaultCommandGroup) {\n // make the command to store the group\n this._initCommandGroup(this._getHelpCommand());\n }\n return this;\n }\n\n const nameAndArgs = enableOrNameAndArgs ?? 'help [command]';\n const [, helpName, helpArgs] = nameAndArgs.match(/([^ ]+) *(.*)/);\n const helpDescription = description ?? 'display help for command';\n\n const helpCommand = this.createCommand(helpName);\n helpCommand.helpOption(false);\n if (helpArgs) helpCommand.arguments(helpArgs);\n if (helpDescription) helpCommand.description(helpDescription);\n\n this._addImplicitHelpCommand = true;\n this._helpCommand = helpCommand;\n // init group unless lazy create\n if (enableOrNameAndArgs || description) this._initCommandGroup(helpCommand);\n\n return this;\n }\n\n /**\n * Add prepared custom help command.\n *\n * @param {(Command|string|boolean)} helpCommand - custom help command, or deprecated enableOrNameAndArgs as for `.helpCommand()`\n * @param {string} [deprecatedDescription] - deprecated custom description used with custom name only\n * @return {Command} `this` command for chaining\n */\n addHelpCommand(helpCommand, deprecatedDescription) {\n // If not passed an object, call through to helpCommand for backwards compatibility,\n // as addHelpCommand was originally used like helpCommand is now.\n if (typeof helpCommand !== 'object') {\n this.helpCommand(helpCommand, deprecatedDescription);\n return this;\n }\n\n this._addImplicitHelpCommand = true;\n this._helpCommand = helpCommand;\n this._initCommandGroup(helpCommand);\n return this;\n }\n\n /**\n * Lazy create help command.\n *\n * @return {(Command|null)}\n * @package\n */\n _getHelpCommand() {\n const hasImplicitHelpCommand =\n this._addImplicitHelpCommand ??\n (this.commands.length &&\n !this._actionHandler &&\n !this._findCommand('help'));\n\n if (hasImplicitHelpCommand) {\n if (this._helpCommand === undefined) {\n this.helpCommand(undefined, undefined); // use default name and description\n }\n return this._helpCommand;\n }\n return null;\n }\n\n /**\n * Add hook for life cycle event.\n *\n * @param {string} event\n * @param {Function} listener\n * @return {Command} `this` command for chaining\n */\n\n hook(event, listener) {\n const allowedValues = ['preSubcommand', 'preAction', 'postAction'];\n if (!allowedValues.includes(event)) {\n throw new Error(`Unexpected value for event passed to hook : '${event}'.\nExpecting one of '${allowedValues.join(\"', '\")}'`);\n }\n if (this._lifeCycleHooks[event]) {\n this._lifeCycleHooks[event].push(listener);\n } else {\n this._lifeCycleHooks[event] = [listener];\n }\n return this;\n }\n\n /**\n * Register callback to use as replacement for calling process.exit.\n *\n * @param {Function} [fn] optional callback which will be passed a CommanderError, defaults to throwing\n * @return {Command} `this` command for chaining\n */\n\n exitOverride(fn) {\n if (fn) {\n this._exitCallback = fn;\n } else {\n this._exitCallback = (err) => {\n if (err.code !== 'commander.executeSubCommandAsync') {\n throw err;\n } else {\n // Async callback from spawn events, not useful to throw.\n }\n };\n }\n return this;\n }\n\n /**\n * Call process.exit, and _exitCallback if defined.\n *\n * @param {number} exitCode exit code for using with process.exit\n * @param {string} code an id string representing the error\n * @param {string} message human-readable description of the error\n * @return never\n * @private\n */\n\n _exit(exitCode, code, message) {\n if (this._exitCallback) {\n this._exitCallback(new CommanderError(exitCode, code, message));\n // Expecting this line is not reached.\n }\n process.exit(exitCode);\n }\n\n /**\n * Register callback `fn` for the command.\n *\n * @example\n * program\n * .command('serve')\n * .description('start service')\n * .action(function() {\n * // do work here\n * });\n *\n * @param {Function} fn\n * @return {Command} `this` command for chaining\n */\n\n action(fn) {\n const listener = (args) => {\n // The .action callback takes an extra parameter which is the command or options.\n const expectedArgsCount = this.registeredArguments.length;\n const actionArgs = args.slice(0, expectedArgsCount);\n if (this._storeOptionsAsProperties) {\n actionArgs[expectedArgsCount] = this; // backwards compatible \"options\"\n } else {\n actionArgs[expectedArgsCount] = this.opts();\n }\n actionArgs.push(this);\n\n return fn.apply(this, actionArgs);\n };\n this._actionHandler = listener;\n return this;\n }\n\n /**\n * Factory routine to create a new unattached option.\n *\n * See .option() for creating an attached option, which uses this routine to\n * create the option. You can override createOption to return a custom option.\n *\n * @param {string} flags\n * @param {string} [description]\n * @return {Option} new option\n */\n\n createOption(flags, description) {\n return new Option(flags, description);\n }\n\n /**\n * Wrap parseArgs to catch 'commander.invalidArgument'.\n *\n * @param {(Option | Argument)} target\n * @param {string} value\n * @param {*} previous\n * @param {string} invalidArgumentMessage\n * @private\n */\n\n _callParseArg(target, value, previous, invalidArgumentMessage) {\n try {\n return target.parseArg(value, previous);\n } catch (err) {\n if (err.code === 'commander.invalidArgument') {\n const message = `${invalidArgumentMessage} ${err.message}`;\n this.error(message, { exitCode: err.exitCode, code: err.code });\n }\n throw err;\n }\n }\n\n /**\n * Check for option flag conflicts.\n * Register option if no conflicts found, or throw on conflict.\n *\n * @param {Option} option\n * @private\n */\n\n _registerOption(option) {\n const matchingOption =\n (option.short && this._findOption(option.short)) ||\n (option.long && this._findOption(option.long));\n if (matchingOption) {\n const matchingFlag =\n option.long && this._findOption(option.long)\n ? option.long\n : option.short;\n throw new Error(`Cannot add option '${option.flags}'${this._name && ` to command '${this._name}'`} due to conflicting flag '${matchingFlag}'\n- already used by option '${matchingOption.flags}'`);\n }\n\n this._initOptionGroup(option);\n this.options.push(option);\n }\n\n /**\n * Check for command name and alias conflicts with existing commands.\n * Register command if no conflicts found, or throw on conflict.\n *\n * @param {Command} command\n * @private\n */\n\n _registerCommand(command) {\n const knownBy = (cmd) => {\n return [cmd.name()].concat(cmd.aliases());\n };\n\n const alreadyUsed = knownBy(command).find((name) =>\n this._findCommand(name),\n );\n if (alreadyUsed) {\n const existingCmd = knownBy(this._findCommand(alreadyUsed)).join('|');\n const newCmd = knownBy(command).join('|');\n throw new Error(\n `cannot add command '${newCmd}' as already have command '${existingCmd}'`,\n );\n }\n\n this._initCommandGroup(command);\n this.commands.push(command);\n }\n\n /**\n * Add an option.\n *\n * @param {Option} option\n * @return {Command} `this` command for chaining\n */\n addOption(option) {\n this._registerOption(option);\n\n const oname = option.name();\n const name = option.attributeName();\n\n // store default value\n if (option.defaultValue !== undefined) {\n this.setOptionValueWithSource(name, option.defaultValue, 'default');\n }\n\n // handler for cli and env supplied values\n const handleOptionValue = (val, invalidValueMessage, valueSource) => {\n // val is null for optional option used without an optional-argument.\n // val is undefined for boolean and negated option.\n if (val == null && option.presetArg !== undefined) {\n val = option.presetArg;\n }\n\n // custom processing\n const oldValue = this.getOptionValue(name);\n if (val !== null && option.parseArg) {\n val = this._callParseArg(option, val, oldValue, invalidValueMessage);\n } else if (val !== null && option.variadic) {\n val = option._collectValue(val, oldValue);\n }\n\n // Fill-in appropriate missing values. Long winded but easy to follow.\n if (val == null) {\n if (option.negate) {\n val = false;\n } else if (option.isBoolean() || option.optional) {\n val = true;\n } else {\n val = ''; // not normal, parseArg might have failed or be a mock function for testing\n }\n }\n this.setOptionValueWithSource(name, val, valueSource);\n };\n\n this.on('option:' + oname, (val) => {\n const invalidValueMessage = `error: option '${option.flags}' argument '${val}' is invalid.`;\n handleOptionValue(val, invalidValueMessage, 'cli');\n });\n\n if (option.envVar) {\n this.on('optionEnv:' + oname, (val) => {\n const invalidValueMessage = `error: option '${option.flags}' value '${val}' from env '${option.envVar}' is invalid.`;\n handleOptionValue(val, invalidValueMessage, 'env');\n });\n }\n\n return this;\n }\n\n /**\n * Internal implementation shared by .option() and .requiredOption()\n *\n * @return {Command} `this` command for chaining\n * @private\n */\n _optionEx(config, flags, description, fn, defaultValue) {\n if (typeof flags === 'object' && flags instanceof Option) {\n throw new Error(\n 'To add an Option object use addOption() instead of option() or requiredOption()',\n );\n }\n const option = this.createOption(flags, description);\n option.makeOptionMandatory(!!config.mandatory);\n if (typeof fn === 'function') {\n option.default(defaultValue).argParser(fn);\n } else if (fn instanceof RegExp) {\n // deprecated\n const regex = fn;\n fn = (val, def) => {\n const m = regex.exec(val);\n return m ? m[0] : def;\n };\n option.default(defaultValue).argParser(fn);\n } else {\n option.default(fn);\n }\n\n return this.addOption(option);\n }\n\n /**\n * Define option with `flags`, `description`, and optional argument parsing function or `defaultValue` or both.\n *\n * The `flags` string contains the short and/or long flags, separated by comma, a pipe or space. A required\n * option-argument is indicated by `<>` and an optional option-argument by `[]`.\n *\n * See the README for more details, and see also addOption() and requiredOption().\n *\n * @example\n * program\n * .option('-p, --pepper', 'add pepper')\n * .option('--pt, --pizza-type <TYPE>', 'type of pizza') // required option-argument\n * .option('-c, --cheese [CHEESE]', 'add extra cheese', 'mozzarella') // optional option-argument with default\n * .option('-t, --tip <VALUE>', 'add tip to purchase cost', parseFloat) // custom parse function\n *\n * @param {string} flags\n * @param {string} [description]\n * @param {(Function|*)} [parseArg] - custom option processing function or default value\n * @param {*} [defaultValue]\n * @return {Command} `this` command for chaining\n */\n\n option(flags, description, parseArg, defaultValue) {\n return this._optionEx({}, flags, description, parseArg, defaultValue);\n }\n\n /**\n * Add a required option which must have a value after parsing. This usually means\n * the option must be specified on the command line. (Otherwise the same as .option().)\n *\n * The `flags` string contains the short and/or long flags, separated by comma, a pipe or space.\n *\n * @param {string} flags\n * @param {string} [description]\n * @param {(Function|*)} [parseArg] - custom option processing function or default value\n * @param {*} [defaultValue]\n * @return {Command} `this` command for chaining\n */\n\n requiredOption(flags, description, parseArg, defaultValue) {\n return this._optionEx(\n { mandatory: true },\n flags,\n description,\n parseArg,\n defaultValue,\n );\n }\n\n /**\n * Alter parsing of short flags with optional values.\n *\n * @example\n * // for `.option('-f,--flag [value]'):\n * program.combineFlagAndOptionalValue(true); // `-f80` is treated like `--flag=80`, this is the default behaviour\n * program.combineFlagAndOptionalValue(false) // `-fb` is treated like `-f -b`\n *\n * @param {boolean} [combine] - if `true` or omitted, an optional value can be specified directly after the flag.\n * @return {Command} `this` command for chaining\n */\n combineFlagAndOptionalValue(combine = true) {\n this._combineFlagAndOptionalValue = !!combine;\n return this;\n }\n\n /**\n * Allow unknown options on the command line.\n *\n * @param {boolean} [allowUnknown] - if `true` or omitted, no error will be thrown for unknown options.\n * @return {Command} `this` command for chaining\n */\n allowUnknownOption(allowUnknown = true) {\n this._allowUnknownOption = !!allowUnknown;\n return this;\n }\n\n /**\n * Allow excess command-arguments on the command line. Pass false to make excess arguments an error.\n *\n * @param {boolean} [allowExcess] - if `true` or omitted, no error will be thrown for excess arguments.\n * @return {Command} `this` command for chaining\n */\n allowExcessArguments(allowExcess = true) {\n this._allowExcessArguments = !!allowExcess;\n return this;\n }\n\n /**\n * Enable positional options. Positional means global options are specified before subcommands which lets\n * subcommands reuse the same option names, and also enables subcommands to turn on passThroughOptions.\n * The default behaviour is non-positional and global options may appear anywhere on the command line.\n *\n * @param {boolean} [positional]\n * @return {Command} `this` command for chaining\n */\n enablePositionalOptions(positional = true) {\n this._enablePositionalOptions = !!positional;\n return this;\n }\n\n /**\n * Pass through options that come after command-arguments rather than treat them as command-options,\n * so actual command-options come before command-arguments. Turning this on for a subcommand requires\n * positional options to have been enabled on the program (parent commands).\n * The default behaviour is non-positional and options may appear before or after command-arguments.\n *\n * @param {boolean} [passThrough] for unknown options.\n * @return {Command} `this` command for chaining\n */\n passThroughOptions(passThrough = true) {\n this._passThroughOptions = !!passThrough;\n this._checkForBrokenPassThrough();\n return this;\n }\n\n /**\n * @private\n */\n\n _checkForBrokenPassThrough() {\n if (\n this.parent &&\n this._passThroughOptions &&\n !this.parent._enablePositionalOptions\n ) {\n throw new Error(\n `passThroughOptions cannot be used for '${this._name}' without turning on enablePositionalOptions for parent command(s)`,\n );\n }\n }\n\n /**\n * Whether to store option values as properties on command object,\n * or store separately (specify false). In both cases the option values can be accessed using .opts().\n *\n * @param {boolean} [storeAsProperties=true]\n * @return {Command} `this` command for chaining\n */\n\n storeOptionsAsProperties(storeAsProperties = true) {\n if (this.options.length) {\n throw new Error('call .storeOptionsAsProperties() before adding options');\n }\n if (Object.keys(this._optionValues).length) {\n throw new Error(\n 'call .storeOptionsAsProperties() before setting option values',\n );\n }\n this._storeOptionsAsProperties = !!storeAsProperties;\n return this;\n }\n\n /**\n * Retrieve option value.\n *\n * @param {string} key\n * @return {object} value\n */\n\n getOptionValue(key) {\n if (this._storeOptionsAsProperties) {\n return this[key];\n }\n return this._optionValues[key];\n }\n\n /**\n * Store option value.\n *\n * @param {string} key\n * @param {object} value\n * @return {Command} `this` command for chaining\n */\n\n setOptionValue(key, value) {\n return this.setOptionValueWithSource(key, value, undefined);\n }\n\n /**\n * Store option value and where the value came from.\n *\n * @param {string} key\n * @param {object} value\n * @param {string} source - expected values are default/config/env/cli/implied\n * @return {Command} `this` command for chaining\n */\n\n setOptionValueWithSource(key, value, source) {\n if (this._storeOptionsAsProperties) {\n this[key] = value;\n } else {\n this._optionValues[key] = value;\n }\n this._optionValueSources[key] = source;\n return this;\n }\n\n /**\n * Get source of option value.\n * Expected values are default | config | env | cli | implied\n *\n * @param {string} key\n * @return {string}\n */\n\n getOptionValueSource(key) {\n return this._optionValueSources[key];\n }\n\n /**\n * Get source of option value. See also .optsWithGlobals().\n * Expected values are default | config | env | cli | implied\n *\n * @param {string} key\n * @return {string}\n */\n\n getOptionValueSourceWithGlobals(key) {\n // global overwrites local, like optsWithGlobals\n let source;\n this._getCommandAndAncestors().forEach((cmd) => {\n if (cmd.getOptionValueSource(key) !== undefined) {\n source = cmd.getOptionValueSource(key);\n }\n });\n return source;\n }\n\n /**\n * Get user arguments from implied or explicit arguments.\n * Side-effects: set _scriptPath if args included script. Used for default program name, and subcommand searches.\n *\n * @private\n */\n\n _prepareUserArgs(argv, parseOptions) {\n if (argv !== undefined && !Array.isArray(argv)) {\n throw new Error('first parameter to parse must be array or undefined');\n }\n parseOptions = parseOptions || {};\n\n // auto-detect argument conventions if nothing supplied\n if (argv === undefined && parseOptions.from === undefined) {\n if (process.versions?.electron) {\n parseOptions.from = 'electron';\n }\n // check node specific options for scenarios where user CLI args follow executable without scriptname\n const execArgv = process.execArgv ?? [];\n if (\n execArgv.includes('-e') ||\n execArgv.includes('--eval') ||\n execArgv.includes('-p') ||\n execArgv.includes('--print')\n ) {\n parseOptions.from = 'eval'; // internal usage, not documented\n }\n }\n\n // default to using process.argv\n if (argv === undefined) {\n argv = process.argv;\n }\n this.rawArgs = argv.slice();\n\n // extract the user args and scriptPath\n let userArgs;\n switch (parseOptions.from) {\n case undefined:\n case 'node':\n this._scriptPath = argv[1];\n userArgs = argv.slice(2);\n break;\n case 'electron':\n // @ts-ignore: because defaultApp is an unknown property\n if (process.defaultApp) {\n this._scriptPath = argv[1];\n userArgs = argv.slice(2);\n } else {\n userArgs = argv.slice(1);\n }\n break;\n case 'user':\n userArgs = argv.slice(0);\n break;\n case 'eval':\n userArgs = argv.slice(1);\n break;\n default:\n throw new Error(\n `unexpected parse option { from: '${parseOptions.from}' }`,\n );\n }\n\n // Find default name for program from arguments.\n if (!this._name && this._scriptPath)\n this.nameFromFilename(this._scriptPath);\n this._name = this._name || 'program';\n\n return userArgs;\n }\n\n /**\n * Parse `argv`, setting options and invoking commands when defined.\n *\n * Use parseAsync instead of parse if any of your action handlers are async.\n *\n * Call with no parameters to parse `process.argv`. Detects Electron and special node options like `node --eval`. Easy mode!\n *\n * Or call with an array of strings to parse, and optionally where the user arguments start by specifying where the arguments are `from`:\n * - `'node'`: default, `argv[0]` is the application and `argv[1]` is the script being run, with user arguments after that\n * - `'electron'`: `argv[0]` is the application and `argv[1]` varies depending on whether the electron application is packaged\n * - `'user'`: just user arguments\n *\n * @example\n * program.parse(); // parse process.argv and auto-detect electron and special node flags\n * program.parse(process.argv); // assume argv[0] is app and argv[1] is script\n * program.parse(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]\n *\n * @param {string[]} [argv] - optional, defaults to process.argv\n * @param {object} [parseOptions] - optionally specify style of options with from: node/user/electron\n * @param {string} [parseOptions.from] - where the args are from: 'node', 'user', 'electron'\n * @return {Command} `this` command for chaining\n */\n\n parse(argv, parseOptions) {\n this._prepareForParse();\n const userArgs = this._prepareUserArgs(argv, parseOptions);\n this._parseCommand([], userArgs);\n\n return this;\n }\n\n /**\n * Parse `argv`, setting options and invoking commands when defined.\n *\n * Call with no parameters to parse `process.argv`. Detects Electron and special node options like `node --eval`. Easy mode!\n *\n * Or call with an array of strings to parse, and optionally where the user arguments start by specifying where the arguments are `from`:\n * - `'node'`: default, `argv[0]` is the application and `argv[1]` is the script being run, with user arguments after that\n * - `'electron'`: `argv[0]` is the application and `argv[1]` varies depending on whether the electron application is packaged\n * - `'user'`: just user arguments\n *\n * @example\n * await program.parseAsync(); // parse process.argv and auto-detect electron and special node flags\n * await program.parseAsync(process.argv); // assume argv[0] is app and argv[1] is script\n * await program.parseAsync(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]\n *\n * @param {string[]} [argv]\n * @param {object} [parseOptions]\n * @param {string} parseOptions.from - where the args are from: 'node', 'user', 'electron'\n * @return {Promise}\n */\n\n async parseAsync(argv, parseOptions) {\n this._prepareForParse();\n const userArgs = this._prepareUserArgs(argv, parseOptions);\n await this._parseCommand([], userArgs);\n\n return this;\n }\n\n _prepareForParse() {\n // Save the state the first time, then restore the state before each subsequent parse.\n if (this._savedState === null) {\n // Do the special default of lone negated option to true, now that we have all the options.\n // Filter for negated options that have not been processed already.\n this.options\n .filter(\n (option) =>\n option.negate &&\n option.defaultValue === undefined &&\n this.getOptionValue(option.attributeName()) === undefined,\n )\n .forEach((option) => {\n // check for lone negated option: --no-foo without a --foo option\n const positiveLongFlag = option.long.replace(/^--no-/, '--');\n if (!this._findOption(positiveLongFlag)) {\n this.setOptionValueWithSource(\n option.attributeName(),\n true,\n 'default',\n );\n }\n });\n\n this.saveStateBeforeParse();\n } else {\n this.restoreStateBeforeParse();\n }\n }\n\n /**\n * Called the first time parse is called to save state and allow a restore before subsequent calls to parse.\n * Not usually called directly, but available for subclasses to save their custom state.\n *\n * This is called in a lazy way. Only commands used in parsing chain will have state saved.\n */\n saveStateBeforeParse() {\n this._savedState = {\n // name is stable if supplied by author, but may be unspecified for root command and deduced during parsing\n _name: this._name,\n // option values before parse have default values (including false for negated options)\n // shallow clones\n _optionValues: { ...this._optionValues },\n _optionValueSources: { ...this._optionValueSources },\n };\n }\n\n /**\n * Restore state before parse for calls after the first.\n * Not usually called directly, but available for subclasses to save their custom state.\n *\n * This is called in a lazy way. Only commands used in parsing chain will have state restored.\n */\n restoreStateBeforeParse() {\n if (this._storeOptionsAsProperties)\n throw new Error(`Can not call parse again when storeOptionsAsProperties is true.\n- either make a new Command for each call to parse, or stop storing options as properties`);\n\n // clear state from _prepareUserArgs\n this._name = this._savedState._name;\n this._scriptPath = null;\n this.rawArgs = [];\n // clear state from setOptionValueWithSource\n this._optionValues = { ...this._savedState._optionValues };\n this._optionValueSources = { ...this._savedState._optionValueSources };\n // clear state from _parseCommand\n this.args = [];\n // clear state from _processArguments\n this.processedArgs = [];\n }\n\n /**\n * Throw if expected executable is missing. Add lots of help for author.\n *\n * @param {string} executableFile\n * @param {string} executableDir\n * @param {string} subcommandName\n */\n _checkForMissingExecutable(executableFile, executableDir, subcommandName) {\n if (fs.existsSync(executableFile)) return;\n\n const executableDirMessage = executableDir\n ? `searched for local subcommand relative to directory '${executableDir}'`\n : 'no directory for search for local subcommand, use .executableDir() to supply a custom directory';\n const executableMissing = `'${executableFile}' does not exist\n - if '${subcommandName}' is not meant to be an executable command, remove description parameter from '.command()' and use '.description()' instead\n - if the default executable name is not suitable, use the executableFile option to supply a custom name or path\n - ${executableDirMessage}`;\n throw new Error(executableMissing);\n }\n\n /**\n * Execute a sub-command executable.\n *\n * @private\n */\n\n _executeSubCommand(subcommand, args) {\n args = args.slice();\n const sourceExt = ['.js', '.ts', '.tsx', '.mjs', '.cjs'];\n\n function findFile(baseDir, baseName) {\n // Look for specified file\n const localBin = path.resolve(baseDir, baseName);\n if (fs.existsSync(localBin)) return localBin;\n\n // Stop looking if candidate already has an expected extension.\n if (sourceExt.includes(path.extname(baseName))) return undefined;\n\n // Try all the extensions.\n const foundExt = sourceExt.find((ext) =>\n fs.existsSync(`${localBin}${ext}`),\n );\n if (foundExt) return `${localBin}${foundExt}`;\n\n return undefined;\n }\n\n // Not checking for help first. Unlikely to have mandatory and executable, and can't robustly test for help flags in external command.\n this._checkForMissingMandatoryOptions();\n this._checkForConflictingOptions();\n\n // executableFile and executableDir might be full path, or just a name\n let executableFile =\n subcommand._executableFile || `${this._name}-${subcommand._name}`;\n let executableDir = this._executableDir || '';\n if (this._scriptPath) {\n let resolvedScriptPath; // resolve possible symlink for installed npm binary\n try {\n resolvedScriptPath = fs.realpathSync(this._scriptPath);\n } catch {\n resolvedScriptPath = this._scriptPath;\n }\n executableDir = path.resolve(\n path.dirname(resolvedScriptPath),\n executableDir,\n );\n }\n\n // Look for a local file in preference to a command in PATH.\n if (executableDir) {\n let localFile = findFile(executableDir, executableFile);\n\n // Legacy search using prefix of script name instead of command name\n if (!localFile && !subcommand._executableFile && this._scriptPath) {\n const legacyName = path.basename(\n this._scriptPath,\n path.extname(this._scriptPath),\n );\n if (legacyName !== this._name) {\n localFile = findFile(\n executableDir,\n `${legacyName}-${subcommand._name}`,\n );\n }\n }\n executableFile = localFile || executableFile;\n }\n\n const launchWithNode = sourceExt.includes(path.extname(executableFile));\n\n let proc;\n if (process.platform !== 'win32') {\n if (launchWithNode) {\n args.unshift(executableFile);\n // add executable arguments to spawn\n args = incrementNodeInspectorPort(process.execArgv).concat(args);\n\n proc = childProcess.spawn(process.argv[0], args, { stdio: 'inherit' });\n } else {\n proc = childProcess.spawn(executableFile, args, { stdio: 'inherit' });\n }\n } else {\n this._checkForMissingExecutable(\n executableFile,\n executableDir,\n subcommand._name,\n );\n args.unshift(executableFile);\n // add executable arguments to spawn\n args = incrementNodeInspectorPort(process.execArgv).concat(args);\n proc = childProcess.spawn(process.execPath, args, { stdio: 'inherit' });\n }\n\n if (!proc.killed) {\n // testing mainly to avoid leak warnings during unit tests with mocked spawn\n const signals = ['SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGINT', 'SIGHUP'];\n signals.forEach((signal) => {\n process.on(signal, () => {\n if (proc.killed === false && proc.exitCode === null) {\n // @ts-ignore because signals not typed to known strings\n proc.kill(signal);\n }\n });\n });\n }\n\n // By default terminate process when spawned process terminates.\n const exitCallback = this._exitCallback;\n proc.on('close', (code) => {\n code = code ?? 1; // code is null if spawned process terminated due to a signal\n if (!exitCallback) {\n process.exit(code);\n } else {\n exitCallback(\n new CommanderError(\n code,\n 'commander.executeSubCommandAsync',\n '(close)',\n ),\n );\n }\n });\n proc.on('error', (err) => {\n // @ts-ignore: because err.code is an unknown property\n if (err.code === 'ENOENT') {\n this._checkForMissingExecutable(\n executableFile,\n executableDir,\n subcommand._name,\n );\n // @ts-ignore: because err.code is an unknown property\n } else if (err.code === 'EACCES') {\n throw new Error(`'${executableFile}' not executable`);\n }\n if (!exitCallback) {\n process.exit(1);\n } else {\n const wrappedError = new CommanderError(\n 1,\n 'commander.executeSubCommandAsync',\n '(error)',\n );\n wrappedError.nestedError = err;\n exitCallback(wrappedError);\n }\n });\n\n // Store the reference to the child process\n this.runningCommand = proc;\n }\n\n /**\n * @private\n */\n\n _dispatchSubcommand(commandName, operands, unknown) {\n const subCommand = this._findCommand(commandName);\n if (!subCommand) this.help({ error: true });\n\n subCommand._prepareForParse();\n let promiseChain;\n promiseChain = this._chainOrCallSubCommandHook(\n promiseChain,\n subCommand,\n 'preSubcommand',\n );\n promiseChain = this._chainOrCall(promiseChain, () => {\n if (subCommand._executableHandler) {\n this._executeSubCommand(subCommand, operands.concat(unknown));\n } else {\n return subCommand._parseCommand(operands, unknown);\n }\n });\n return promiseChain;\n }\n\n /**\n * Invoke help directly if possible, or dispatch if necessary.\n * e.g. help foo\n *\n * @private\n */\n\n _dispatchHelpCommand(subcommandName) {\n if (!subcommandName) {\n this.help();\n }\n const subCommand = this._findCommand(subcommandName);\n if (subCommand && !subCommand._executableHandler) {\n subCommand.help();\n }\n\n // Fallback to parsing the help flag to invoke the help.\n return this._dispatchSubcommand(\n subcommandName,\n [],\n [this._getHelpOption()?.long ?? this._getHelpOption()?.short ?? '--help'],\n );\n }\n\n /**\n * Check this.args against expected this.registeredArguments.\n *\n * @private\n */\n\n _checkNumberOfArguments() {\n // too few\n this.registeredArguments.forEach((arg, i) => {\n if (arg.required && this.args[i] == null) {\n this.missingArgument(arg.name());\n }\n });\n // too many\n if (\n this.registeredArguments.length > 0 &&\n this.registeredArguments[this.registeredArguments.length - 1].variadic\n ) {\n return;\n }\n if (this.args.length > this.registeredArguments.length) {\n this._excessArguments(this.args);\n }\n }\n\n /**\n * Process this.args using this.registeredArguments and save as this.processedArgs!\n *\n * @private\n */\n\n _processArguments() {\n const myParseArg = (argument, value, previous) => {\n // Extra processing for nice error message on parsing failure.\n let parsedValue = value;\n if (value !== null && argument.parseArg) {\n const invalidValueMessage = `error: command-argument value '${value}' is invalid for argument '${argument.name()}'.`;\n parsedValue = this._callParseArg(\n argument,\n value,\n previous,\n invalidValueMessage,\n );\n }\n return parsedValue;\n };\n\n this._checkNumberOfArguments();\n\n const processedArgs = [];\n this.registeredArguments.forEach((declaredArg, index) => {\n let value = declaredArg.defaultValue;\n if (declaredArg.variadic) {\n // Collect together remaining arguments for passing together as an array.\n if (index < this.args.length) {\n value = this.args.slice(index);\n if (declaredArg.parseArg) {\n value = value.reduce((processed, v) => {\n return myParseArg(declaredArg, v, processed);\n }, declaredArg.defaultValue);\n }\n } else if (value === undefined) {\n value = [];\n }\n } else if (index < this.args.length) {\n value = this.args[index];\n if (declaredArg.parseArg) {\n value = myParseArg(declaredArg, value, declaredArg.defaultValue);\n }\n }\n processedArgs[index] = value;\n });\n this.processedArgs = processedArgs;\n }\n\n /**\n * Once we have a promise we chain, but call synchronously until then.\n *\n * @param {(Promise|undefined)} promise\n * @param {Function} fn\n * @return {(Promise|undefined)}\n * @private\n */\n\n _chainOrCall(promise, fn) {\n // thenable\n if (promise?.then && typeof promise.then === 'function') {\n // already have a promise, chain callback\n return promise.then(() => fn());\n }\n // callback might return a promise\n return fn();\n }\n\n /**\n *\n * @param {(Promise|undefined)} promise\n * @param {string} event\n * @return {(Promise|undefined)}\n * @private\n */\n\n _chainOrCallHooks(promise, event) {\n let result = promise;\n const hooks = [];\n this._getCommandAndAncestors()\n .reverse()\n .filter((cmd) => cmd._lifeCycleHooks[event] !== undefined)\n .forEach((hookedCommand) => {\n hookedCommand._lifeCycleHooks[event].forEach((callback) => {\n hooks.push({ hookedCommand, callback });\n });\n });\n if (event === 'postAction') {\n hooks.reverse();\n }\n\n hooks.forEach((hookDetail) => {\n result = this._chainOrCall(result, () => {\n return hookDetail.callback(hookDetail.hookedCommand, this);\n });\n });\n return result;\n }\n\n /**\n *\n * @param {(Promise|undefined)} promise\n * @param {Command} subCommand\n * @param {string} event\n * @return {(Promise|undefined)}\n * @private\n */\n\n _chainOrCallSubCommandHook(promise, subCommand, event) {\n let result = promise;\n if (this._lifeCycleHooks[event] !== undefined) {\n this._lifeCycleHooks[event].forEach((hook) => {\n result = this._chainOrCall(result, () => {\n return hook(this, subCommand);\n });\n });\n }\n return result;\n }\n\n /**\n * Process arguments in context of this command.\n * Returns action result, in case it is a promise.\n *\n * @private\n */\n\n _parseCommand(operands, unknown) {\n const parsed = this.parseOptions(unknown);\n this._parseOptionsEnv(); // after cli, so parseArg not called on both cli and env\n this._parseOptionsImplied();\n operands = operands.concat(parsed.operands);\n unknown = parsed.unknown;\n this.args = operands.concat(unknown);\n\n if (operands && this._findCommand(operands[0])) {\n return this._dispatchSubcommand(operands[0], operands.slice(1), unknown);\n }\n if (\n this._getHelpCommand() &&\n operands[0] === this._getHelpCommand().name()\n ) {\n return this._dispatchHelpCommand(operands[1]);\n }\n if (this._defaultCommandName) {\n this._outputHelpIfRequested(unknown); // Run the help for default command from parent rather than passing to default command\n return this._dispatchSubcommand(\n this._defaultCommandName,\n operands,\n unknown,\n );\n }\n if (\n this.commands.length &&\n this.args.length === 0 &&\n !this._actionHandler &&\n !this._defaultCommandName\n ) {\n // probably missing subcommand and no handler, user needs help (and exit)\n this.help({ error: true });\n }\n\n this._outputHelpIfRequested(parsed.unknown);\n this._checkForMissingMandatoryOptions();\n this._checkForConflictingOptions();\n\n // We do not always call this check to avoid masking a \"better\" error, like unknown command.\n const checkForUnknownOptions = () => {\n if (parsed.unknown.length > 0) {\n this.unknownOption(parsed.unknown[0]);\n }\n };\n\n const commandEvent = `command:${this.name()}`;\n if (this._actionHandler) {\n checkForUnknownOptions();\n this._processArguments();\n\n let promiseChain;\n promiseChain = this._chainOrCallHooks(promiseChain, 'preAction');\n promiseChain = this._chainOrCall(promiseChain, () =>\n this._actionHandler(this.processedArgs),\n );\n if (this.parent) {\n promiseChain = this._chainOrCall(promiseChain, () => {\n this.parent.emit(commandEvent, operands, unknown); // legacy\n });\n }\n promiseChain = this._chainOrCallHooks(promiseChain, 'postAction');\n return promiseChain;\n }\n if (this.parent?.listenerCount(commandEvent)) {\n checkForUnknownOptions();\n this._processArguments();\n this.parent.emit(commandEvent, operands, unknown); // legacy\n } else if (operands.length) {\n if (this._findCommand('*')) {\n // legacy default command\n return this._dispatchSubcommand('*', operands, unknown);\n }\n if (this.listenerCount('command:*')) {\n // skip option check, emit event for possible misspelling suggestion\n this.emit('command:*', operands, unknown);\n } else if (this.commands.length) {\n this.unknownCommand();\n } else {\n checkForUnknownOptions();\n this._processArguments();\n }\n } else if (this.commands.length) {\n checkForUnknownOptions();\n // This command has subcommands and nothing hooked up at this level, so display help (and exit).\n this.help({ error: true });\n } else {\n checkForUnknownOptions();\n this._processArguments();\n // fall through for caller to handle after calling .parse()\n }\n }\n\n /**\n * Find matching command.\n *\n * @private\n * @return {Command | undefined}\n */\n _findCommand(name) {\n if (!name) return undefined;\n return this.commands.find(\n (cmd) => cmd._name === name || cmd._aliases.includes(name),\n );\n }\n\n /**\n * Return an option matching `arg` if any.\n *\n * @param {string} arg\n * @return {Option}\n * @package\n */\n\n _findOption(arg) {\n return this.options.find((option) => option.is(arg));\n }\n\n /**\n * Display an error message if a mandatory option does not have a value.\n * Called after checking for help flags in leaf subcommand.\n *\n * @private\n */\n\n _checkForMissingMandatoryOptions() {\n // Walk up hierarchy so can call in subcommand after checking for displaying help.\n this._getCommandAndAncestors().forEach((cmd) => {\n cmd.options.forEach((anOption) => {\n if (\n anOption.mandatory &&\n cmd.getOptionValue(anOption.attributeName()) === undefined\n ) {\n cmd.missingMandatoryOptionValue(anOption);\n }\n });\n });\n }\n\n /**\n * Display an error message if conflicting options are used together in this.\n *\n * @private\n */\n _checkForConflictingLocalOptions() {\n const definedNonDefaultOptions = this.options.filter((option) => {\n const optionKey = option.attributeName();\n if (this.getOptionValue(optionKey) === undefined) {\n return false;\n }\n return this.getOptionValueSource(optionKey) !== 'default';\n });\n\n const optionsWithConflicting = definedNonDefaultOptions.filter(\n (option) => option.conflictsWith.length > 0,\n );\n\n optionsWithConflicting.forEach((option) => {\n const conflictingAndDefined = definedNonDefaultOptions.find((defined) =>\n option.conflictsWith.includes(defined.attributeName()),\n );\n if (conflictingAndDefined) {\n this._conflictingOption(option, conflictingAndDefined);\n }\n });\n }\n\n /**\n * Display an error message if conflicting options are used together.\n * Called after checking for help flags in leaf subcommand.\n *\n * @private\n */\n _checkForConflictingOptions() {\n // Walk up hierarchy so can call in subcommand after checking for displaying help.\n this._getCommandAndAncestors().forEach((cmd) => {\n cmd._checkForConflictingLocalOptions();\n });\n }\n\n /**\n * Parse options from `argv` removing known options,\n * and return argv split into operands and unknown arguments.\n *\n * Side effects: modifies command by storing options. Does not reset state if called again.\n *\n * Examples:\n *\n * argv => operands, unknown\n * --known kkk op => [op], []\n * op --known kkk => [op], []\n * sub --unknown uuu op => [sub], [--unknown uuu op]\n * sub -- --unknown uuu op => [sub --unknown uuu op], []\n *\n * @param {string[]} args\n * @return {{operands: string[], unknown: string[]}}\n */\n\n parseOptions(args) {\n const operands = []; // operands, not options or values\n const unknown = []; // first unknown option and remaining unknown args\n let dest = operands;\n\n function maybeOption(arg) {\n return arg.length > 1 && arg[0] === '-';\n }\n\n const negativeNumberArg = (arg) => {\n // return false if not a negative number\n if (!/^-(\\d+|\\d*\\.\\d+)(e[+-]?\\d+)?$/.test(arg)) return false;\n // negative number is ok unless digit used as an option in command hierarchy\n return !this._getCommandAndAncestors().some((cmd) =>\n cmd.options\n .map((opt) => opt.short)\n .some((short) => /^-\\d$/.test(short)),\n );\n };\n\n // parse options\n let activeVariadicOption = null;\n let activeGroup = null; // working through group of short options, like -abc\n let i = 0;\n while (i < args.length || activeGroup) {\n const arg = activeGroup ?? args[i++];\n activeGroup = null;\n\n // literal\n if (arg === '--') {\n if (dest === unknown) dest.push(arg);\n dest.push(...args.slice(i));\n break;\n }\n\n if (\n activeVariadicOption &&\n (!maybeOption(arg) || negativeNumberArg(arg))\n ) {\n this.emit(`option:${activeVariadicOption.name()}`, arg);\n continue;\n }\n activeVariadicOption = null;\n\n if (maybeOption(arg)) {\n const option = this._findOption(arg);\n // recognised option, call listener to assign value with possible custom processing\n if (option) {\n if (option.required) {\n const value = args[i++];\n if (value === undefined) this.optionMissingArgument(option);\n this.emit(`option:${option.name()}`, value);\n } else if (option.optional) {\n let value = null;\n // historical behaviour is optional value is following arg unless an option\n if (\n i < args.length &&\n (!maybeOption(args[i]) || negativeNumberArg(args[i]))\n ) {\n value = args[i++];\n }\n this.emit(`option:${option.name()}`, value);\n } else {\n // boolean flag\n this.emit(`option:${option.name()}`);\n }\n activeVariadicOption = option.variadic ? option : null;\n continue;\n }\n }\n\n // Look for combo options following single dash, eat first one if known.\n if (arg.length > 2 && arg[0] === '-' && arg[1] !== '-') {\n const option = this._findOption(`-${arg[1]}`);\n if (option) {\n if (\n option.required ||\n (option.optional && this._combineFlagAndOptionalValue)\n ) {\n // option with value following in same argument\n this.emit(`option:${option.name()}`, arg.slice(2));\n } else {\n // boolean option\n this.emit(`option:${option.name()}`);\n // remove the processed option and keep processing group\n activeGroup = `-${arg.slice(2)}`;\n }\n continue;\n }\n }\n\n // Look for known long flag with value, like --foo=bar\n if (/^--[^=]+=/.test(arg)) {\n const index = arg.indexOf('=');\n const option = this._findOption(arg.slice(0, index));\n if (option && (option.required || option.optional)) {\n this.emit(`option:${option.name()}`, arg.slice(index + 1));\n continue;\n }\n }\n\n // Not a recognised option by this command.\n // Might be a command-argument, or subcommand option, or unknown option, or help command or option.\n\n // An unknown option means further arguments also classified as unknown so can be reprocessed by subcommands.\n // A negative number in a leaf command is not an unknown option.\n if (\n dest === operands &&\n maybeOption(arg) &&\n !(this.commands.length === 0 && negativeNumberArg(arg))\n ) {\n dest = unknown;\n }\n\n // If using positionalOptions, stop processing our options at subcommand.\n if (\n (this._enablePositionalOptions || this._passThroughOptions) &&\n operands.length === 0 &&\n unknown.length === 0\n ) {\n if (this._findCommand(arg)) {\n operands.push(arg);\n unknown.push(...args.slice(i));\n break;\n } else if (\n this._getHelpCommand() &&\n arg === this._getHelpCommand().name()\n ) {\n operands.push(arg, ...args.slice(i));\n break;\n } else if (this._defaultCommandName) {\n unknown.push(arg, ...args.slice(i));\n break;\n }\n }\n\n // If using passThroughOptions, stop processing options at first command-argument.\n if (this._passThroughOptions) {\n dest.push(arg, ...args.slice(i));\n break;\n }\n\n // add arg\n dest.push(arg);\n }\n\n return { operands, unknown };\n }\n\n /**\n * Return an object containing local option values as key-value pairs.\n *\n * @return {object}\n */\n opts() {\n if (this._storeOptionsAsProperties) {\n // Preserve original behaviour so backwards compatible when still using properties\n const result = {};\n const len = this.options.length;\n\n for (let i = 0; i < len; i++) {\n const key = this.options[i].attributeName();\n result[key] =\n key === this._versionOptionName ? this._version : this[key];\n }\n return result;\n }\n\n return this._optionValues;\n }\n\n /**\n * Return an object containing merged local and global option values as key-value pairs.\n *\n * @return {object}\n */\n optsWithGlobals() {\n // globals overwrite locals\n return this._getCommandAndAncestors().reduce(\n (combinedOptions, cmd) => Object.assign(combinedOptions, cmd.opts()),\n {},\n );\n }\n\n /**\n * Display error message and exit (or call exitOverride).\n *\n * @param {string} message\n * @param {object} [errorOptions]\n * @param {string} [errorOptions.code] - an id string representing the error\n * @param {number} [errorOptions.exitCode] - used with process.exit\n */\n error(message, errorOptions) {\n // output handling\n this._outputConfiguration.outputError(\n `${message}\\n`,\n this._outputConfiguration.writeErr,\n );\n if (typeof this._showHelpAfterError === 'string') {\n this._outputConfiguration.writeErr(`${this._showHelpAfterError}\\n`);\n } else if (this._showHelpAfterError) {\n this._outputConfiguration.writeErr('\\n');\n this.outputHelp({ error: true });\n }\n\n // exit handling\n const config = errorOptions || {};\n const exitCode = config.exitCode || 1;\n const code = config.code || 'commander.error';\n this._exit(exitCode, code, message);\n }\n\n /**\n * Apply any option related environment variables, if option does\n * not have a value from cli or client code.\n *\n * @private\n */\n _parseOptionsEnv() {\n this.options.forEach((option) => {\n if (option.envVar && option.envVar in process.env) {\n const optionKey = option.attributeName();\n // Priority check. Do not overwrite cli or options from unknown source (client-code).\n if (\n this.getOptionValue(optionKey) === undefined ||\n ['default', 'config', 'env'].includes(\n this.getOptionValueSource(optionKey),\n )\n ) {\n if (option.required || option.optional) {\n // option can take a value\n // keep very simple, optional always takes value\n this.emit(`optionEnv:${option.name()}`, process.env[option.envVar]);\n } else {\n // boolean\n // keep very simple, only care that envVar defined and not the value\n this.emit(`optionEnv:${option.name()}`);\n }\n }\n }\n });\n }\n\n /**\n * Apply any implied option values, if option is undefined or default value.\n *\n * @private\n */\n _parseOptionsImplied() {\n const dualHelper = new DualOptions(this.options);\n const hasCustomOptionValue = (optionKey) => {\n return (\n this.getOptionValue(optionKey) !== undefined &&\n !['default', 'implied'].includes(this.getOptionValueSource(optionKey))\n );\n };\n this.options\n .filter(\n (option) =>\n option.implied !== undefined &&\n hasCustomOptionValue(option.attributeName()) &&\n dualHelper.valueFromOption(\n this.getOptionValue(option.attributeName()),\n option,\n ),\n )\n .forEach((option) => {\n Object.keys(option.implied)\n .filter((impliedKey) => !hasCustomOptionValue(impliedKey))\n .forEach((impliedKey) => {\n this.setOptionValueWithSource(\n impliedKey,\n option.implied[impliedKey],\n 'implied',\n );\n });\n });\n }\n\n /**\n * Argument `name` is missing.\n *\n * @param {string} name\n * @private\n */\n\n missingArgument(name) {\n const message = `error: missing required argument '${name}'`;\n this.error(message, { code: 'commander.missingArgument' });\n }\n\n /**\n * `Option` is missing an argument.\n *\n * @param {Option} option\n * @private\n */\n\n optionMissingArgument(option) {\n const message = `error: option '${option.flags}' argument missing`;\n this.error(message, { code: 'commander.optionMissingArgument' });\n }\n\n /**\n * `Option` does not have a value, and is a mandatory option.\n *\n * @param {Option} option\n * @private\n */\n\n missingMandatoryOptionValue(option) {\n const message = `error: required option '${option.flags}' not specified`;\n this.error(message, { code: 'commander.missingMandatoryOptionValue' });\n }\n\n /**\n * `Option` conflicts with another option.\n *\n * @param {Option} option\n * @param {Option} conflictingOption\n * @private\n */\n _conflictingOption(option, conflictingOption) {\n // The calling code does not know whether a negated option is the source of the\n // value, so do some work to take an educated guess.\n const findBestOptionFromValue = (option) => {\n const optionKey = option.attributeName();\n const optionValue = this.getOptionValue(optionKey);\n const negativeOption = this.options.find(\n (target) => target.negate && optionKey === target.attributeName(),\n );\n const positiveOption = this.options.find(\n (target) => !target.negate && optionKey === target.attributeName(),\n );\n if (\n negativeOption &&\n ((negativeOption.presetArg === undefined && optionValue === false) ||\n (negativeOption.presetArg !== undefined &&\n optionValue === negativeOption.presetArg))\n ) {\n return negativeOption;\n }\n return positiveOption || option;\n };\n\n const getErrorMessage = (option) => {\n const bestOption = findBestOptionFromValue(option);\n const optionKey = bestOption.attributeName();\n const source = this.getOptionValueSource(optionKey);\n if (source === 'env') {\n return `environment variable '${bestOption.envVar}'`;\n }\n return `option '${bestOption.flags}'`;\n };\n\n const message = `error: ${getErrorMessage(option)} cannot be used with ${getErrorMessage(conflictingOption)}`;\n this.error(message, { code: 'commander.conflictingOption' });\n }\n\n /**\n * Unknown option `flag`.\n *\n * @param {string} flag\n * @private\n */\n\n unknownOption(flag) {\n if (this._allowUnknownOption) return;\n let suggestion = '';\n\n if (flag.startsWith('--') && this._showSuggestionAfterError) {\n // Looping to pick up the global options too\n let candidateFlags = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let command = this;\n do {\n const moreFlags = command\n .createHelp()\n .visibleOptions(command)\n .filter((option) => option.long)\n .map((option) => option.long);\n candidateFlags = candidateFlags.concat(moreFlags);\n command = command.parent;\n } while (command && !command._enablePositionalOptions);\n suggestion = suggestSimilar(flag, candidateFlags);\n }\n\n const message = `error: unknown option '${flag}'${suggestion}`;\n this.error(message, { code: 'commander.unknownOption' });\n }\n\n /**\n * Excess arguments, more than expected.\n *\n * @param {string[]} receivedArgs\n * @private\n */\n\n _excessArguments(receivedArgs) {\n if (this._allowExcessArguments) return;\n\n const expected = this.registeredArguments.length;\n const s = expected === 1 ? '' : 's';\n const received = receivedArgs.length;\n const forSubcommand = this.parent ? ` for '${this.name()}'` : '';\n const details = receivedArgs.join(', ');\n const message = `error: too many arguments${forSubcommand}. Expected ${expected} argument${s} but got ${received}: ${details}.`;\n this.error(message, { code: 'commander.excessArguments' });\n }\n\n /**\n * Unknown command.\n *\n * @private\n */\n\n unknownCommand() {\n const unknownName = this.args[0];\n let suggestion = '';\n\n if (this._showSuggestionAfterError) {\n const candidateNames = [];\n this.createHelp()\n .visibleCommands(this)\n .forEach((command) => {\n candidateNames.push(command.name());\n // just visible alias\n if (command.alias()) candidateNames.push(command.alias());\n });\n suggestion = suggestSimilar(unknownName, candidateNames);\n }\n\n const message = `error: unknown command '${unknownName}'${suggestion}`;\n this.error(message, { code: 'commander.unknownCommand' });\n }\n\n /**\n * Get or set the program version.\n *\n * This method auto-registers the \"-V, --version\" option which will print the version number.\n *\n * You can optionally supply the flags and description to override the defaults.\n *\n * @param {string} [str]\n * @param {string} [flags]\n * @param {string} [description]\n * @return {(this | string | undefined)} `this` command for chaining, or version string if no arguments\n */\n\n version(str, flags, description) {\n if (str === undefined) return this._version;\n this._version = str;\n flags = flags || '-V, --version';\n description = description || 'output the version number';\n const versionOption = this.createOption(flags, description);\n this._versionOptionName = versionOption.attributeName();\n this._registerOption(versionOption);\n\n this.on('option:' + versionOption.name(), () => {\n this._outputConfiguration.writeOut(`${str}\\n`);\n this._exit(0, 'commander.version', str);\n });\n return this;\n }\n\n /**\n * Set the description.\n *\n * @param {string} [str]\n * @param {object} [argsDescription]\n * @return {(string|Command)}\n */\n description(str, argsDescription) {\n if (str === undefined && argsDescription === undefined)\n return this._description;\n this._description = str;\n if (argsDescription) {\n this._argsDescription = argsDescription;\n }\n return this;\n }\n\n /**\n * Set the summary. Used when listed as subcommand of parent.\n *\n * @param {string} [str]\n * @return {(string|Command)}\n */\n summary(str) {\n if (str === undefined) return this._summary;\n this._summary = str;\n return this;\n }\n\n /**\n * Set an alias for the command.\n *\n * You may call more than once to add multiple aliases. Only the first alias is shown in the auto-generated help.\n *\n * @param {string} [alias]\n * @return {(string|Command)}\n */\n\n alias(alias) {\n if (alias === undefined) return this._aliases[0]; // just return first, for backwards compatibility\n\n /** @type {Command} */\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let command = this;\n if (\n this.commands.length !== 0 &&\n this.commands[this.commands.length - 1]._executableHandler\n ) {\n // assume adding alias for last added executable subcommand, rather than this\n command = this.commands[this.commands.length - 1];\n }\n\n if (alias === command._name)\n throw new Error(\"Command alias can't be the same as its name\");\n const matchingCommand = this.parent?._findCommand(alias);\n if (matchingCommand) {\n // c.f. _registerCommand\n const existingCmd = [matchingCommand.name()]\n .concat(matchingCommand.aliases())\n .join('|');\n throw new Error(\n `cannot add alias '${alias}' to command '${this.name()}' as already have command '${existingCmd}'`,\n );\n }\n\n command._aliases.push(alias);\n return this;\n }\n\n /**\n * Set aliases for the command.\n *\n * Only the first alias is shown in the auto-generated help.\n *\n * @param {string[]} [aliases]\n * @return {(string[]|Command)}\n */\n\n aliases(aliases) {\n // Getter for the array of aliases is the main reason for having aliases() in addition to alias().\n if (aliases === undefined) return this._aliases;\n\n aliases.forEach((alias) => this.alias(alias));\n return this;\n }\n\n /**\n * Set / get the command usage `str`.\n *\n * @param {string} [str]\n * @return {(string|Command)}\n */\n\n usage(str) {\n if (str === undefined) {\n if (this._usage) return this._usage;\n\n const args = this.registeredArguments.map((arg) => {\n return humanReadableArgName(arg);\n });\n return []\n .concat(\n this.options.length || this._helpOption !== null ? '[options]' : [],\n this.commands.length ? '[command]' : [],\n this.registeredArguments.length ? args : [],\n )\n .join(' ');\n }\n\n this._usage = str;\n return this;\n }\n\n /**\n * Get or set the name of the command.\n *\n * @param {string} [str]\n * @return {(string|Command)}\n */\n\n name(str) {\n if (str === undefined) return this._name;\n this._name = str;\n return this;\n }\n\n /**\n * Set/get the help group heading for this subcommand in parent command's help.\n *\n * @param {string} [heading]\n * @return {Command | string}\n */\n\n helpGroup(heading) {\n if (heading === undefined) return this._helpGroupHeading ?? '';\n this._helpGroupHeading = heading;\n return this;\n }\n\n /**\n * Set/get the default help group heading for subcommands added to this command.\n * (This does not override a group set directly on the subcommand using .helpGroup().)\n *\n * @example\n * program.commandsGroup('Development Commands:);\n * program.command('watch')...\n * program.command('lint')...\n * ...\n *\n * @param {string} [heading]\n * @returns {Command | string}\n */\n commandsGroup(heading) {\n if (heading === undefined) return this._defaultCommandGroup ?? '';\n this._defaultCommandGroup = heading;\n return this;\n }\n\n /**\n * Set/get the default help group heading for options added to this command.\n * (This does not override a group set directly on the option using .helpGroup().)\n *\n * @example\n * program\n * .optionsGroup('Development Options:')\n * .option('-d, --debug', 'output extra debugging')\n * .option('-p, --profile', 'output profiling information')\n *\n * @param {string} [heading]\n * @returns {Command | string}\n */\n optionsGroup(heading) {\n if (heading === undefined) return this._defaultOptionGroup ?? '';\n this._defaultOptionGroup = heading;\n return this;\n }\n\n /**\n * @param {Option} option\n * @private\n */\n _initOptionGroup(option) {\n if (this._defaultOptionGroup && !option.helpGroupHeading)\n option.helpGroup(this._defaultOptionGroup);\n }\n\n /**\n * @param {Command} cmd\n * @private\n */\n _initCommandGroup(cmd) {\n if (this._defaultCommandGroup && !cmd.helpGroup())\n cmd.helpGroup(this._defaultCommandGroup);\n }\n\n /**\n * Set the name of the command from script filename, such as process.argv[1],\n * or import.meta.filename.\n *\n * (Used internally and public although not documented in README.)\n *\n * @example\n * program.nameFromFilename(import.meta.filename);\n *\n * @param {string} filename\n * @return {Command}\n */\n\n nameFromFilename(filename) {\n this._name = path.basename(filename, path.extname(filename));\n\n return this;\n }\n\n /**\n * Get or set the directory for searching for executable subcommands of this command.\n *\n * @example\n * program.executableDir(import.meta.dirname);\n * // or\n * program.executableDir('subcommands');\n *\n * @param {string} [path]\n * @return {(string|null|Command)}\n */\n\n executableDir(path) {\n if (path === undefined) return this._executableDir;\n this._executableDir = path;\n return this;\n }\n\n /**\n * Return program help documentation.\n *\n * @param {{ error: boolean }} [contextOptions] - pass {error:true} to wrap for stderr instead of stdout\n * @return {string}\n */\n\n helpInformation(contextOptions) {\n const helper = this.createHelp();\n const context = this._getOutputContext(contextOptions);\n helper.prepareContext({\n error: context.error,\n helpWidth: context.helpWidth,\n outputHasColors: context.hasColors,\n });\n const text = helper.formatHelp(this, helper);\n if (context.hasColors) return text;\n return this._outputConfiguration.stripColor(text);\n }\n\n /**\n * @typedef HelpContext\n * @type {object}\n * @property {boolean} error\n * @property {number} helpWidth\n * @property {boolean} hasColors\n * @property {function} write - includes stripColor if needed\n *\n * @returns {HelpContext}\n * @private\n */\n\n _getOutputContext(contextOptions) {\n contextOptions = contextOptions || {};\n const error = !!contextOptions.error;\n let baseWrite;\n let hasColors;\n let helpWidth;\n if (error) {\n baseWrite = (str) => this._outputConfiguration.writeErr(str);\n hasColors = this._outputConfiguration.getErrHasColors();\n helpWidth = this._outputConfiguration.getErrHelpWidth();\n } else {\n baseWrite = (str) => this._outputConfiguration.writeOut(str);\n hasColors = this._outputConfiguration.getOutHasColors();\n helpWidth = this._outputConfiguration.getOutHelpWidth();\n }\n const write = (str) => {\n if (!hasColors) str = this._outputConfiguration.stripColor(str);\n return baseWrite(str);\n };\n return { error, write, hasColors, helpWidth };\n }\n\n /**\n * Output help information for this command.\n *\n * Outputs built-in help, and custom text added using `.addHelpText()`.\n *\n * @param {{ error: boolean } | Function} [contextOptions] - pass {error:true} to write to stderr instead of stdout\n */\n\n outputHelp(contextOptions) {\n let deprecatedCallback;\n if (typeof contextOptions === 'function') {\n deprecatedCallback = contextOptions;\n contextOptions = undefined;\n }\n\n const outputContext = this._getOutputContext(contextOptions);\n /** @type {HelpTextEventContext} */\n const eventContext = {\n error: outputContext.error,\n write: outputContext.write,\n command: this,\n };\n\n this._getCommandAndAncestors()\n .reverse()\n .forEach((command) => command.emit('beforeAllHelp', eventContext));\n this.emit('beforeHelp', eventContext);\n\n let helpInformation = this.helpInformation({ error: outputContext.error });\n if (deprecatedCallback) {\n helpInformation = deprecatedCallback(helpInformation);\n if (\n typeof helpInformation !== 'string' &&\n !Buffer.isBuffer(helpInformation)\n ) {\n throw new Error('outputHelp callback must return a string or a Buffer');\n }\n }\n outputContext.write(helpInformation);\n\n if (this._getHelpOption()?.long) {\n this.emit(this._getHelpOption().long); // deprecated\n }\n this.emit('afterHelp', eventContext);\n this._getCommandAndAncestors().forEach((command) =>\n command.emit('afterAllHelp', eventContext),\n );\n }\n\n /**\n * You can pass in flags and a description to customise the built-in help option.\n * Pass in false to disable the built-in help option.\n *\n * @example\n * program.helpOption('-?, --help' 'show help'); // customise\n * program.helpOption(false); // disable\n *\n * @param {(string | boolean)} flags\n * @param {string} [description]\n * @return {Command} `this` command for chaining\n */\n\n helpOption(flags, description) {\n // Support enabling/disabling built-in help option.\n if (typeof flags === 'boolean') {\n if (flags) {\n if (this._helpOption === null) this._helpOption = undefined; // reenable\n if (this._defaultOptionGroup) {\n // make the option to store the group\n this._initOptionGroup(this._getHelpOption());\n }\n } else {\n this._helpOption = null; // disable\n }\n return this;\n }\n\n // Customise flags and description.\n this._helpOption = this.createOption(\n flags ?? '-h, --help',\n description ?? 'display help for command',\n );\n // init group unless lazy create\n if (flags || description) this._initOptionGroup(this._helpOption);\n\n return this;\n }\n\n /**\n * Lazy create help option.\n * Returns null if has been disabled with .helpOption(false).\n *\n * @returns {(Option | null)} the help option\n * @package\n */\n _getHelpOption() {\n // Lazy create help option on demand.\n if (this._helpOption === undefined) {\n this.helpOption(undefined, undefined);\n }\n return this._helpOption;\n }\n\n /**\n * Supply your own option to use for the built-in help option.\n * This is an alternative to using helpOption() to customise the flags and description etc.\n *\n * @param {Option} option\n * @return {Command} `this` command for chaining\n */\n addHelpOption(option) {\n this._helpOption = option;\n this._initOptionGroup(option);\n return this;\n }\n\n /**\n * Output help information and exit.\n *\n * Outputs built-in help, and custom text added using `.addHelpText()`.\n *\n * @param {{ error: boolean }} [contextOptions] - pass {error:true} to write to stderr instead of stdout\n */\n\n help(contextOptions) {\n this.outputHelp(contextOptions);\n let exitCode = Number(process.exitCode ?? 0); // process.exitCode does allow a string or an integer, but we prefer just a number\n if (\n exitCode === 0 &&\n contextOptions &&\n typeof contextOptions !== 'function' &&\n contextOptions.error\n ) {\n exitCode = 1;\n }\n // message: do not have all displayed text available so only passing placeholder.\n this._exit(exitCode, 'commander.help', '(outputHelp)');\n }\n\n /**\n * // Do a little typing to coordinate emit and listener for the help text events.\n * @typedef HelpTextEventContext\n * @type {object}\n * @property {boolean} error\n * @property {Command} command\n * @property {function} write\n */\n\n /**\n * Add additional text to be displayed with the built-in help.\n *\n * Position is 'before' or 'after' to affect just this command,\n * and 'beforeAll' or 'afterAll' to affect this command and all its subcommands.\n *\n * @param {string} position - before or after built-in help\n * @param {(string | Function)} text - string to add, or a function returning a string\n * @return {Command} `this` command for chaining\n */\n\n addHelpText(position, text) {\n const allowedValues = ['beforeAll', 'before', 'after', 'afterAll'];\n if (!allowedValues.includes(position)) {\n throw new Error(`Unexpected value for position to addHelpText.\nExpecting one of '${allowedValues.join(\"', '\")}'`);\n }\n\n const helpEvent = `${position}Help`;\n this.on(helpEvent, (/** @type {HelpTextEventContext} */ context) => {\n let helpStr;\n if (typeof text === 'function') {\n helpStr = text({ error: context.error, command: context.command });\n } else {\n helpStr = text;\n }\n // Ignore falsy value when nothing to output.\n if (helpStr) {\n context.write(`${helpStr}\\n`);\n }\n });\n return this;\n }\n\n /**\n * Output help information if help flags specified\n *\n * @param {Array} args - array of options to search for help flags\n * @private\n */\n\n _outputHelpIfRequested(args) {\n const helpOption = this._getHelpOption();\n const helpRequested = helpOption && args.find((arg) => helpOption.is(arg));\n if (helpRequested) {\n this.outputHelp();\n // (Do not have all displayed text available so only passing placeholder.)\n this._exit(0, 'commander.helpDisplayed', '(outputHelp)');\n }\n }\n}\n\n/**\n * Scan arguments and increment port number for inspect calls (to avoid conflicts when spawning new command).\n *\n * @param {string[]} args - array of arguments from node.execArgv\n * @returns {string[]}\n * @private\n */\n\nfunction incrementNodeInspectorPort(args) {\n // Testing for these options:\n // --inspect[=[host:]port]\n // --inspect-brk[=[host:]port]\n // --inspect-port=[host:]port\n return args.map((arg) => {\n if (!arg.startsWith('--inspect')) {\n return arg;\n }\n let debugOption;\n let debugHost = '127.0.0.1';\n let debugPort = '9229';\n let match;\n if ((match = arg.match(/^(--inspect(-brk)?)$/)) !== null) {\n // e.g. --inspect\n debugOption = match[1];\n } else if (\n (match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+)$/)) !== null\n ) {\n debugOption = match[1];\n if (/^\\d+$/.test(match[3])) {\n // e.g. --inspect=1234\n debugPort = match[3];\n } else {\n // e.g. --inspect=localhost\n debugHost = match[3];\n }\n } else if (\n (match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+):(\\d+)$/)) !== null\n ) {\n // e.g. --inspect=localhost:1234\n debugOption = match[1];\n debugHost = match[3];\n debugPort = match[4];\n }\n\n if (debugOption && debugPort !== '0') {\n return `${debugOption}=${debugHost}:${parseInt(debugPort) + 1}`;\n }\n return arg;\n });\n}\n\n/**\n * Exported for using from tests, not otherwise used outside this file.\n *\n * @returns {boolean | undefined}\n * @package\n */\nexport function useColor() {\n // Test for common conventions.\n // NB: the observed behaviour is in combination with how author adds color! For example:\n // - we do not test NODE_DISABLE_COLORS, but util:styletext does\n // - we do test NO_COLOR, but Chalk does not\n //\n // References:\n // https://no-color.org\n // https://bixense.com/clicolors/\n // https://github.com/nodejs/node/blob/0a00217a5f67ef4a22384cfc80eb6dd9a917fdc1/lib/internal/tty.js#L109\n // https://github.com/chalk/supports-color/blob/c214314a14bcb174b12b3014b2b0a8de375029ae/index.js#L33\n // (https://force-color.org recent web page from 2023, does not match major javascript implementations)\n\n if (\n process.env.NO_COLOR ||\n process.env.FORCE_COLOR === '0' ||\n process.env.FORCE_COLOR === 'false'\n )\n return false;\n if (process.env.FORCE_COLOR || process.env.CLICOLOR_FORCE !== undefined)\n return true;\n return undefined;\n}\n","import { humanReadableArgName } from './argument.js';\nimport { stripVTControlCharacters } from 'node:util';\n\n/**\n * TypeScript import types for JSDoc, used by Visual Studio Code IntelliSense and `npm run typescript-checkJS`\n * https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html#import-types\n * @typedef { import(\"./argument.js\").Argument } Argument\n * @typedef { import(\"./command.js\").Command } Command\n * @typedef { import(\"./option.js\").Option } Option\n */\n\n// Although this is a class, methods are static in style to allow override using subclass or just functions.\nexport class Help {\n constructor() {\n this.helpWidth = undefined;\n this.minWidthToWrap = 40;\n this.sortSubcommands = false;\n this.sortOptions = false;\n this.showGlobalOptions = false;\n }\n\n /**\n * prepareContext is called by Commander after applying overrides from `Command.configureHelp()`\n * and just before calling `formatHelp()`.\n *\n * Commander just uses the helpWidth and the rest is provided for optional use by more complex subclasses.\n *\n * @param {{ error?: boolean, helpWidth?: number, outputHasColors?: boolean }} contextOptions\n */\n prepareContext(contextOptions) {\n this.helpWidth = this.helpWidth ?? contextOptions.helpWidth ?? 80;\n }\n\n /**\n * Get an array of the visible subcommands. Includes a placeholder for the implicit help command, if there is one.\n *\n * @param {Command} cmd\n * @returns {Command[]}\n */\n\n visibleCommands(cmd) {\n const visibleCommands = cmd.commands.filter((cmd) => !cmd._hidden);\n const helpCommand = cmd._getHelpCommand();\n if (helpCommand && !helpCommand._hidden) {\n visibleCommands.push(helpCommand);\n }\n if (this.sortSubcommands) {\n visibleCommands.sort((a, b) => {\n // @ts-ignore: because overloaded return type\n return a.name().localeCompare(b.name());\n });\n }\n return visibleCommands;\n }\n\n /**\n * Compare options for sort.\n *\n * @param {Option} a\n * @param {Option} b\n * @returns {number}\n */\n compareOptions(a, b) {\n const getSortKey = (option) => {\n // WYSIWYG for order displayed in help. Short used for comparison if present. No special handling for negated.\n return option.short\n ? option.short.replace(/^-/, '')\n : option.long.replace(/^--/, '');\n };\n return getSortKey(a).localeCompare(getSortKey(b));\n }\n\n /**\n * Get an array of the visible options. Includes a placeholder for the implicit help option, if there is one.\n *\n * @param {Command} cmd\n * @returns {Option[]}\n */\n\n visibleOptions(cmd) {\n const visibleOptions = cmd.options.filter((option) => !option.hidden);\n // Built-in help option.\n const helpOption = cmd._getHelpOption();\n if (helpOption && !helpOption.hidden) {\n // Automatically hide conflicting flags. Bit dubious but a historical behaviour that is convenient for single-command programs.\n const removeShort = helpOption.short && cmd._findOption(helpOption.short);\n const removeLong = helpOption.long && cmd._findOption(helpOption.long);\n if (!removeShort && !removeLong) {\n visibleOptions.push(helpOption); // no changes needed\n } else if (helpOption.long && !removeLong) {\n visibleOptions.push(\n cmd.createOption(helpOption.long, helpOption.description),\n );\n } else if (helpOption.short && !removeShort) {\n visibleOptions.push(\n cmd.createOption(helpOption.short, helpOption.description),\n );\n }\n }\n if (this.sortOptions) {\n visibleOptions.sort(this.compareOptions);\n }\n return visibleOptions;\n }\n\n /**\n * Get an array of the visible global options. (Not including help.)\n *\n * @param {Command} cmd\n * @returns {Option[]}\n */\n\n visibleGlobalOptions(cmd) {\n if (!this.showGlobalOptions) return [];\n\n const globalOptions = [];\n for (\n let ancestorCmd = cmd.parent;\n ancestorCmd;\n ancestorCmd = ancestorCmd.parent\n ) {\n const visibleOptions = ancestorCmd.options.filter(\n (option) => !option.hidden,\n );\n globalOptions.push(...visibleOptions);\n }\n if (this.sortOptions) {\n globalOptions.sort(this.compareOptions);\n }\n return globalOptions;\n }\n\n /**\n * Get an array of the arguments if any have a description.\n *\n * @param {Command} cmd\n * @returns {Argument[]}\n */\n\n visibleArguments(cmd) {\n // Side effect! Apply the legacy descriptions before the arguments are displayed.\n if (cmd._argsDescription) {\n cmd.registeredArguments.forEach((argument) => {\n argument.description =\n argument.description || cmd._argsDescription[argument.name()] || '';\n });\n }\n\n // If there are any arguments with a description then return all the arguments.\n if (cmd.registeredArguments.find((argument) => argument.description)) {\n return cmd.registeredArguments;\n }\n return [];\n }\n\n /**\n * Get the command term to show in the list of subcommands.\n *\n * @param {Command} cmd\n * @returns {string}\n */\n\n subcommandTerm(cmd) {\n // Legacy. Ignores custom usage string, and nested commands.\n const args = cmd.registeredArguments\n .map((arg) => humanReadableArgName(arg))\n .join(' ');\n return (\n cmd._name +\n (cmd._aliases[0] ? '|' + cmd._aliases[0] : '') +\n (cmd.options.length ? ' [options]' : '') + // simplistic check for non-help option\n (args ? ' ' + args : '')\n );\n }\n\n /**\n * Get the option term to show in the list of options.\n *\n * @param {Option} option\n * @returns {string}\n */\n\n optionTerm(option) {\n return option.flags;\n }\n\n /**\n * Get the argument term to show in the list of arguments.\n *\n * @param {Argument} argument\n * @returns {string}\n */\n\n argumentTerm(argument) {\n return argument.name();\n }\n\n /**\n * Get the longest command term length.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {number}\n */\n\n longestSubcommandTermLength(cmd, helper) {\n return helper.visibleCommands(cmd).reduce((max, command) => {\n return Math.max(\n max,\n this.displayWidth(\n helper.styleSubcommandTerm(helper.subcommandTerm(command)),\n ),\n );\n }, 0);\n }\n\n /**\n * Get the longest option term length.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {number}\n */\n\n longestOptionTermLength(cmd, helper) {\n return helper.visibleOptions(cmd).reduce((max, option) => {\n return Math.max(\n max,\n this.displayWidth(helper.styleOptionTerm(helper.optionTerm(option))),\n );\n }, 0);\n }\n\n /**\n * Get the longest global option term length.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {number}\n */\n\n longestGlobalOptionTermLength(cmd, helper) {\n return helper.visibleGlobalOptions(cmd).reduce((max, option) => {\n return Math.max(\n max,\n this.displayWidth(helper.styleOptionTerm(helper.optionTerm(option))),\n );\n }, 0);\n }\n\n /**\n * Get the longest argument term length.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {number}\n */\n\n longestArgumentTermLength(cmd, helper) {\n return helper.visibleArguments(cmd).reduce((max, argument) => {\n return Math.max(\n max,\n this.displayWidth(\n helper.styleArgumentTerm(helper.argumentTerm(argument)),\n ),\n );\n }, 0);\n }\n\n /**\n * Get the command usage to be displayed at the top of the built-in help.\n *\n * @param {Command} cmd\n * @returns {string}\n */\n\n commandUsage(cmd) {\n // Usage\n let cmdName = cmd._name;\n if (cmd._aliases[0]) {\n cmdName = cmdName + '|' + cmd._aliases[0];\n }\n let ancestorCmdNames = '';\n for (\n let ancestorCmd = cmd.parent;\n ancestorCmd;\n ancestorCmd = ancestorCmd.parent\n ) {\n ancestorCmdNames = ancestorCmd.name() + ' ' + ancestorCmdNames;\n }\n return ancestorCmdNames + cmdName + ' ' + cmd.usage();\n }\n\n /**\n * Get the description for the command.\n *\n * @param {Command} cmd\n * @returns {string}\n */\n\n commandDescription(cmd) {\n // @ts-ignore: because overloaded return type\n return cmd.description();\n }\n\n /**\n * Get the subcommand summary to show in the list of subcommands.\n * (Fallback to description for backwards compatibility.)\n *\n * @param {Command} cmd\n * @returns {string}\n */\n\n subcommandDescription(cmd) {\n // @ts-ignore: because overloaded return type\n return cmd.summary() || cmd.description();\n }\n\n /**\n * Get the option description to show in the list of options.\n *\n * @param {Option} option\n * @return {string}\n */\n\n optionDescription(option) {\n const extraInfo = [];\n\n if (option.argChoices) {\n extraInfo.push(\n // use stringify to match the display of the default value\n `choices: ${option.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`,\n );\n }\n if (option.defaultValue !== undefined) {\n // default for boolean and negated more for programmer than end user,\n // but show true/false for boolean option as may be for hand-rolled env or config processing.\n const showDefault =\n option.required ||\n option.optional ||\n (option.isBoolean() && typeof option.defaultValue === 'boolean');\n if (showDefault) {\n extraInfo.push(\n `default: ${option.defaultValueDescription || JSON.stringify(option.defaultValue)}`,\n );\n }\n }\n // preset for boolean and negated are more for programmer than end user\n if (option.presetArg !== undefined && option.optional) {\n extraInfo.push(`preset: ${JSON.stringify(option.presetArg)}`);\n }\n if (option.envVar !== undefined) {\n extraInfo.push(`env: ${option.envVar}`);\n }\n if (extraInfo.length > 0) {\n const extraDescription = `(${extraInfo.join(', ')})`;\n if (option.description) {\n return `${option.description} ${extraDescription}`;\n }\n return extraDescription;\n }\n\n return option.description;\n }\n\n /**\n * Get the argument description to show in the list of arguments.\n *\n * @param {Argument} argument\n * @return {string}\n */\n\n argumentDescription(argument) {\n const extraInfo = [];\n if (argument.argChoices) {\n extraInfo.push(\n // use stringify to match the display of the default value\n `choices: ${argument.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`,\n );\n }\n if (argument.defaultValue !== undefined) {\n extraInfo.push(\n `default: ${argument.defaultValueDescription || JSON.stringify(argument.defaultValue)}`,\n );\n }\n if (extraInfo.length > 0) {\n const extraDescription = `(${extraInfo.join(', ')})`;\n if (argument.description) {\n return `${argument.description} ${extraDescription}`;\n }\n return extraDescription;\n }\n return argument.description;\n }\n\n /**\n * Format a list of items, given a heading and an array of formatted items.\n *\n * @param {string} heading\n * @param {string[]} items\n * @param {Help} helper\n * @returns string[]\n */\n formatItemList(heading, items, helper) {\n if (items.length === 0) return [];\n\n return [helper.styleTitle(heading), ...items, ''];\n }\n\n /**\n * Group items by their help group heading.\n *\n * @param {Command[] | Option[]} unsortedItems\n * @param {Command[] | Option[]} visibleItems\n * @param {Function} getGroup\n * @returns {Map<string, Command[] | Option[]>}\n */\n groupItems(unsortedItems, visibleItems, getGroup) {\n const result = new Map();\n // Add groups in order of appearance in unsortedItems.\n unsortedItems.forEach((item) => {\n const group = getGroup(item);\n if (!result.has(group)) result.set(group, []);\n });\n // Add items in order of appearance in visibleItems.\n visibleItems.forEach((item) => {\n const group = getGroup(item);\n if (!result.has(group)) {\n result.set(group, []);\n }\n result.get(group).push(item);\n });\n return result;\n }\n\n /**\n * Generate the built-in help text.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {string}\n */\n\n formatHelp(cmd, helper) {\n const termWidth = helper.padWidth(cmd, helper);\n const helpWidth = helper.helpWidth ?? 80; // in case prepareContext() was not called\n\n function callFormatItem(term, description) {\n return helper.formatItem(term, termWidth, description, helper);\n }\n\n // Usage\n let output = [\n `${helper.styleTitle('Usage:')} ${helper.styleUsage(helper.commandUsage(cmd))}`,\n '',\n ];\n\n // Description\n const commandDescription = helper.commandDescription(cmd);\n if (commandDescription.length > 0) {\n output = output.concat([\n helper.boxWrap(\n helper.styleCommandDescription(commandDescription),\n helpWidth,\n ),\n '',\n ]);\n }\n\n // Arguments\n const argumentList = helper.visibleArguments(cmd).map((argument) => {\n return callFormatItem(\n helper.styleArgumentTerm(helper.argumentTerm(argument)),\n helper.styleArgumentDescription(helper.argumentDescription(argument)),\n );\n });\n output = output.concat(\n this.formatItemList('Arguments:', argumentList, helper),\n );\n\n // Options\n const optionGroups = this.groupItems(\n cmd.options,\n helper.visibleOptions(cmd),\n (option) => option.helpGroupHeading ?? 'Options:',\n );\n optionGroups.forEach((options, group) => {\n const optionList = options.map((option) => {\n return callFormatItem(\n helper.styleOptionTerm(helper.optionTerm(option)),\n helper.styleOptionDescription(helper.optionDescription(option)),\n );\n });\n output = output.concat(this.formatItemList(group, optionList, helper));\n });\n\n if (helper.showGlobalOptions) {\n const globalOptionList = helper\n .visibleGlobalOptions(cmd)\n .map((option) => {\n return callFormatItem(\n helper.styleOptionTerm(helper.optionTerm(option)),\n helper.styleOptionDescription(helper.optionDescription(option)),\n );\n });\n output = output.concat(\n this.formatItemList('Global Options:', globalOptionList, helper),\n );\n }\n\n // Commands\n const commandGroups = this.groupItems(\n cmd.commands,\n helper.visibleCommands(cmd),\n (sub) => sub.helpGroup() || 'Commands:',\n );\n commandGroups.forEach((commands, group) => {\n const commandList = commands.map((sub) => {\n return callFormatItem(\n helper.styleSubcommandTerm(helper.subcommandTerm(sub)),\n helper.styleSubcommandDescription(helper.subcommandDescription(sub)),\n );\n });\n output = output.concat(this.formatItemList(group, commandList, helper));\n });\n\n return output.join('\\n');\n }\n\n /**\n * Return display width of string, ignoring ANSI escape sequences. Used in padding and wrapping calculations.\n *\n * @param {string} str\n * @returns {number}\n */\n displayWidth(str) {\n return stripVTControlCharacters(str).length;\n }\n\n /**\n * Style the title for displaying in the help. Called with 'Usage:', 'Options:', etc.\n *\n * @param {string} str\n * @returns {string}\n */\n styleTitle(str) {\n return str;\n }\n\n styleUsage(str) {\n // Usage has lots of parts the user might like to color separately! Assume default usage string which is formed like:\n // command subcommand [options] [command] <foo> [bar]\n return str\n .split(' ')\n .map((word) => {\n if (word === '[options]') return this.styleOptionText(word);\n if (word === '[command]') return this.styleSubcommandText(word);\n if (word[0] === '[' || word[0] === '<')\n return this.styleArgumentText(word);\n return this.styleCommandText(word); // Restrict to initial words?\n })\n .join(' ');\n }\n styleCommandDescription(str) {\n return this.styleDescriptionText(str);\n }\n styleOptionDescription(str) {\n return this.styleDescriptionText(str);\n }\n styleSubcommandDescription(str) {\n return this.styleDescriptionText(str);\n }\n styleArgumentDescription(str) {\n return this.styleDescriptionText(str);\n }\n styleDescriptionText(str) {\n return str;\n }\n styleOptionTerm(str) {\n return this.styleOptionText(str);\n }\n styleSubcommandTerm(str) {\n // This is very like usage with lots of parts! Assume default string which is formed like:\n // subcommand [options] <foo> [bar]\n return str\n .split(' ')\n .map((word) => {\n if (word === '[options]') return this.styleOptionText(word);\n if (word[0] === '[' || word[0] === '<')\n return this.styleArgumentText(word);\n return this.styleSubcommandText(word); // Restrict to initial words?\n })\n .join(' ');\n }\n styleArgumentTerm(str) {\n return this.styleArgumentText(str);\n }\n styleOptionText(str) {\n return str;\n }\n styleArgumentText(str) {\n return str;\n }\n styleSubcommandText(str) {\n return str;\n }\n styleCommandText(str) {\n return str;\n }\n\n /**\n * Calculate the pad width from the maximum term length.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {number}\n */\n\n padWidth(cmd, helper) {\n return Math.max(\n helper.longestOptionTermLength(cmd, helper),\n helper.longestGlobalOptionTermLength(cmd, helper),\n helper.longestSubcommandTermLength(cmd, helper),\n helper.longestArgumentTermLength(cmd, helper),\n );\n }\n\n /**\n * Detect manually wrapped and indented strings by checking for line break followed by whitespace.\n *\n * @param {string} str\n * @returns {boolean}\n */\n preformatted(str) {\n return /\\n[^\\S\\r\\n]/.test(str);\n }\n\n /**\n * Format the \"item\", which consists of a term and description. Pad the term and wrap the description, indenting the following lines.\n *\n * So \"TTT\", 5, \"DDD DDDD DD DDD\" might be formatted for this.helpWidth=17 like so:\n * TTT DDD DDDD\n * DD DDD\n *\n * @param {string} term\n * @param {number} termWidth\n * @param {string} description\n * @param {Help} helper\n * @returns {string}\n */\n formatItem(term, termWidth, description, helper) {\n const itemIndent = 2;\n const itemIndentStr = ' '.repeat(itemIndent);\n if (!description) return itemIndentStr + term;\n\n // Pad the term out to a consistent width, so descriptions are aligned.\n const paddedTerm = term.padEnd(\n termWidth + term.length - helper.displayWidth(term),\n );\n\n // Format the description.\n const spacerWidth = 2; // between term and description\n const helpWidth = this.helpWidth ?? 80; // in case prepareContext() was not called\n const remainingWidth = helpWidth - termWidth - spacerWidth - itemIndent;\n let formattedDescription;\n if (\n remainingWidth < this.minWidthToWrap ||\n helper.preformatted(description)\n ) {\n formattedDescription = description;\n } else {\n const wrappedDescription = helper.boxWrap(description, remainingWidth);\n formattedDescription = wrappedDescription.replace(\n /\\n/g,\n '\\n' + ' '.repeat(termWidth + spacerWidth),\n );\n }\n\n // Construct and overall indent.\n return (\n itemIndentStr +\n paddedTerm +\n ' '.repeat(spacerWidth) +\n formattedDescription.replace(/\\n/g, `\\n${itemIndentStr}`)\n );\n }\n\n /**\n * Wrap a string at whitespace, preserving existing line breaks.\n * Wrapping is skipped if the width is less than `minWidthToWrap`.\n *\n * @param {string} str\n * @param {number} width\n * @returns {string}\n */\n boxWrap(str, width) {\n if (width < this.minWidthToWrap) return str;\n\n const rawLines = str.split(/\\r\\n|\\n/);\n // split up text by whitespace\n const chunkPattern = /[\\s]*[^\\s]+/g;\n const wrappedLines = [];\n rawLines.forEach((line) => {\n const chunks = line.match(chunkPattern);\n if (chunks === null) {\n wrappedLines.push('');\n return;\n }\n\n let sumChunks = [chunks.shift()];\n let sumWidth = this.displayWidth(sumChunks[0]);\n chunks.forEach((chunk) => {\n const visibleWidth = this.displayWidth(chunk);\n // Accumulate chunks while they fit into width.\n if (sumWidth + visibleWidth <= width) {\n sumChunks.push(chunk);\n sumWidth += visibleWidth;\n return;\n }\n wrappedLines.push(sumChunks.join(''));\n\n const nextChunk = chunk.trimStart(); // trim space at line break\n sumChunks = [nextChunk];\n sumWidth = this.displayWidth(nextChunk);\n });\n wrappedLines.push(sumChunks.join(''));\n });\n\n return wrappedLines.join('\\n');\n }\n}\n","import { InvalidArgumentError } from './error.js';\n\nexport class Option {\n /**\n * Initialize a new `Option` with the given `flags` and `description`.\n *\n * @param {string} flags\n * @param {string} [description]\n */\n\n constructor(flags, description) {\n this.flags = flags;\n this.description = description || '';\n\n this.required = flags.includes('<'); // A value must be supplied when the option is specified.\n this.optional = flags.includes('['); // A value is optional when the option is specified.\n // variadic test ignores <value,...> et al which might be used to describe custom splitting of single argument\n this.variadic = /\\w\\.\\.\\.[>\\]]$/.test(flags); // The option can take multiple values.\n this.mandatory = false; // The option must have a value after parsing, which usually means it must be specified on command line.\n const optionFlags = splitOptionFlags(flags);\n this.short = optionFlags.shortFlag; // May be a short flag, undefined, or even a long flag (if option has two long flags).\n this.long = optionFlags.longFlag;\n this.negate = false;\n if (this.long) {\n this.negate = this.long.startsWith('--no-');\n }\n this.defaultValue = undefined;\n this.defaultValueDescription = undefined;\n this.presetArg = undefined;\n this.envVar = undefined;\n this.parseArg = undefined;\n this.hidden = false;\n this.argChoices = undefined;\n this.conflictsWith = [];\n this.implied = undefined;\n this.helpGroupHeading = undefined; // soft initialised when option added to command\n }\n\n /**\n * Set the default value, and optionally supply the description to be displayed in the help.\n *\n * @param {*} value\n * @param {string} [description]\n * @return {Option}\n */\n\n default(value, description) {\n this.defaultValue = value;\n this.defaultValueDescription = description;\n return this;\n }\n\n /**\n * Preset to use when option used without option-argument, especially optional but also boolean and negated.\n * The custom processing (parseArg) is called.\n *\n * @example\n * new Option('--color').default('GREYSCALE').preset('RGB');\n * new Option('--donate [amount]').preset('20').argParser(parseFloat);\n *\n * @param {*} arg\n * @return {Option}\n */\n\n preset(arg) {\n this.presetArg = arg;\n return this;\n }\n\n /**\n * Add option name(s) that conflict with this option.\n * An error will be displayed if conflicting options are found during parsing.\n *\n * @example\n * new Option('--rgb').conflicts('cmyk');\n * new Option('--js').conflicts(['ts', 'jsx']);\n *\n * @param {(string | string[])} names\n * @return {Option}\n */\n\n conflicts(names) {\n this.conflictsWith = this.conflictsWith.concat(names);\n return this;\n }\n\n /**\n * Specify implied option values for when this option is set and the implied options are not.\n *\n * The custom processing (parseArg) is not called on the implied values.\n *\n * @example\n * program\n * .addOption(new Option('--log', 'write logging information to file'))\n * .addOption(new Option('--trace', 'log extra details').implies({ log: 'trace.txt' }));\n *\n * @param {object} impliedOptionValues\n * @return {Option}\n */\n implies(impliedOptionValues) {\n let newImplied = impliedOptionValues;\n if (typeof impliedOptionValues === 'string') {\n // string is not documented, but easy mistake and we can do what user probably intended.\n newImplied = { [impliedOptionValues]: true };\n }\n this.implied = Object.assign(this.implied || {}, newImplied);\n return this;\n }\n\n /**\n * Set environment variable to check for option value.\n *\n * An environment variable is only used if when processed the current option value is\n * undefined, or the source of the current value is 'default' or 'config' or 'env'.\n *\n * @param {string} name\n * @return {Option}\n */\n\n env(name) {\n this.envVar = name;\n return this;\n }\n\n /**\n * Set the custom handler for processing CLI option arguments into option values.\n *\n * @param {Function} [fn]\n * @return {Option}\n */\n\n argParser(fn) {\n this.parseArg = fn;\n return this;\n }\n\n /**\n * Whether the option is mandatory and must have a value after parsing.\n *\n * @param {boolean} [mandatory=true]\n * @return {Option}\n */\n\n makeOptionMandatory(mandatory = true) {\n this.mandatory = !!mandatory;\n return this;\n }\n\n /**\n * Hide option in help.\n *\n * @param {boolean} [hide=true]\n * @return {Option}\n */\n\n hideHelp(hide = true) {\n this.hidden = !!hide;\n return this;\n }\n\n /**\n * @package\n */\n\n _collectValue(value, previous) {\n if (previous === this.defaultValue || !Array.isArray(previous)) {\n return [value];\n }\n\n previous.push(value);\n return previous;\n }\n\n /**\n * Only allow option value to be one of choices.\n *\n * @param {string[]} values\n * @return {Option}\n */\n\n choices(values) {\n this.argChoices = values.slice();\n this.parseArg = (arg, previous) => {\n if (!this.argChoices.includes(arg)) {\n throw new InvalidArgumentError(\n `Allowed choices are ${this.argChoices.join(', ')}.`,\n );\n }\n if (this.variadic) {\n return this._collectValue(arg, previous);\n }\n return arg;\n };\n return this;\n }\n\n /**\n * Return option name.\n *\n * @return {string}\n */\n\n name() {\n if (this.long) {\n return this.long.replace(/^--/, '');\n }\n return this.short.replace(/^-/, '');\n }\n\n /**\n * Return option name, in a camelcase format that can be used\n * as an object attribute key.\n *\n * @return {string}\n */\n\n attributeName() {\n if (this.negate) {\n return camelcase(this.name().replace(/^no-/, ''));\n }\n return camelcase(this.name());\n }\n\n /**\n * Set the help group heading.\n *\n * @param {string} heading\n * @return {Option}\n */\n helpGroup(heading) {\n this.helpGroupHeading = heading;\n return this;\n }\n\n /**\n * Check if `arg` matches the short or long flag.\n *\n * @param {string} arg\n * @return {boolean}\n * @package\n */\n\n is(arg) {\n return this.short === arg || this.long === arg;\n }\n\n /**\n * Return whether a boolean option.\n *\n * Options are one of boolean, negated, required argument, or optional argument.\n *\n * @return {boolean}\n * @package\n */\n\n isBoolean() {\n return !this.required && !this.optional && !this.negate;\n }\n}\n\n/**\n * This class is to make it easier to work with dual options, without changing the existing\n * implementation. We support separate dual options for separate positive and negative options,\n * like `--build` and `--no-build`, which share a single option value. This works nicely for some\n * use cases, but is tricky for others where we want separate behaviours despite\n * the single shared option value.\n */\nexport class DualOptions {\n /**\n * @param {Option[]} options\n */\n constructor(options) {\n this.positiveOptions = new Map();\n this.negativeOptions = new Map();\n this.dualOptions = new Set();\n options.forEach((option) => {\n if (option.negate) {\n this.negativeOptions.set(option.attributeName(), option);\n } else {\n this.positiveOptions.set(option.attributeName(), option);\n }\n });\n this.negativeOptions.forEach((value, key) => {\n if (this.positiveOptions.has(key)) {\n this.dualOptions.add(key);\n }\n });\n }\n\n /**\n * Did the value come from the option, and not from possible matching dual option?\n *\n * @param {*} value\n * @param {Option} option\n * @returns {boolean}\n */\n valueFromOption(value, option) {\n const optionKey = option.attributeName();\n if (!this.dualOptions.has(optionKey)) return true;\n\n // Use the value to deduce if (probably) came from the option.\n const preset = this.negativeOptions.get(optionKey).presetArg;\n const negativeValue = preset !== undefined ? preset : false;\n return option.negate === (negativeValue === value);\n }\n}\n\n/**\n * Convert string from kebab-case to camelCase.\n *\n * @param {string} str\n * @return {string}\n * @private\n */\n\nfunction camelcase(str) {\n return str.split('-').reduce((str, word) => {\n return str + word[0].toUpperCase() + word.slice(1);\n });\n}\n\n/**\n * Split the short and long flag out of something like '-m,--mixed <value>'\n *\n * @private\n */\n\nfunction splitOptionFlags(flags) {\n let shortFlag;\n let longFlag;\n // short flag, single dash and single character\n const shortFlagExp = /^-[^-]$/;\n // long flag, double dash and at least one character\n const longFlagExp = /^--[^-]/;\n\n const flagParts = flags.split(/[ |,]+/).concat('guard');\n // Normal is short and/or long.\n if (shortFlagExp.test(flagParts[0])) shortFlag = flagParts.shift();\n if (longFlagExp.test(flagParts[0])) longFlag = flagParts.shift();\n // Long then short. Rarely used but fine.\n if (!shortFlag && shortFlagExp.test(flagParts[0]))\n shortFlag = flagParts.shift();\n // Allow two long flags, like '--ws, --workspace'\n // This is the supported way to have a shortish option flag.\n if (!shortFlag && longFlagExp.test(flagParts[0])) {\n shortFlag = longFlag;\n longFlag = flagParts.shift();\n }\n\n // Check for unprocessed flag. Fail noisily rather than silently ignore.\n if (flagParts[0].startsWith('-')) {\n const unsupportedFlag = flagParts[0];\n const baseError = `option creation failed due to '${unsupportedFlag}' in option flags '${flags}'`;\n if (/^-[^-][^-]/.test(unsupportedFlag))\n throw new Error(\n `${baseError}\n- a short flag is a single dash and a single character\n - either use a single dash and a single character (for a short flag)\n - or use a double dash for a long option (and can have two, like '--ws, --workspace')`,\n );\n if (shortFlagExp.test(unsupportedFlag))\n throw new Error(`${baseError}\n- too many short flags`);\n if (longFlagExp.test(unsupportedFlag))\n throw new Error(`${baseError}\n- too many long flags`);\n\n throw new Error(`${baseError}\n- unrecognised flag format`);\n }\n if (shortFlag === undefined && longFlag === undefined)\n throw new Error(\n `option creation failed due to no flags found in '${flags}'.`,\n );\n\n return { shortFlag, longFlag };\n}\n","const maxDistance = 3;\n\nfunction editDistance(a, b) {\n // https://en.wikipedia.org/wiki/Damerau–Levenshtein_distance\n // Calculating optimal string alignment distance, no substring is edited more than once.\n // (Simple implementation.)\n\n // Quick early exit, return worst case.\n if (Math.abs(a.length - b.length) > maxDistance)\n return Math.max(a.length, b.length);\n\n // distance between prefix substrings of a and b\n const d = [];\n\n // pure deletions turn a into empty string\n for (let i = 0; i <= a.length; i++) {\n d[i] = [i];\n }\n // pure insertions turn empty string into b\n for (let j = 0; j <= b.length; j++) {\n d[0][j] = j;\n }\n\n // fill matrix\n for (let j = 1; j <= b.length; j++) {\n for (let i = 1; i <= a.length; i++) {\n let cost;\n if (a[i - 1] === b[j - 1]) {\n cost = 0;\n } else {\n cost = 1;\n }\n d[i][j] = Math.min(\n d[i - 1][j] + 1, // deletion\n d[i][j - 1] + 1, // insertion\n d[i - 1][j - 1] + cost, // substitution\n );\n // transposition\n if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) {\n d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + 1);\n }\n }\n }\n\n return d[a.length][b.length];\n}\n\n/**\n * Find close matches, restricted to same number of edits.\n *\n * @param {string} word\n * @param {string[]} candidates\n * @returns {string}\n */\n\nexport function suggestSimilar(word, candidates) {\n if (!candidates || candidates.length === 0) return '';\n // remove possible duplicates\n candidates = Array.from(new Set(candidates));\n\n const searchingOptions = word.startsWith('--');\n if (searchingOptions) {\n word = word.slice(2);\n candidates = candidates.map((candidate) => candidate.slice(2));\n }\n\n let similar = [];\n let bestDistance = maxDistance;\n const minSimilarity = 0.4;\n candidates.forEach((candidate) => {\n if (candidate.length <= 1) return; // no one character guesses\n\n const distance = editDistance(word, candidate);\n const length = Math.max(word.length, candidate.length);\n const similarity = (length - distance) / length;\n if (similarity > minSimilarity) {\n if (distance < bestDistance) {\n // better edit distance, throw away previous worse matches\n bestDistance = distance;\n similar = [candidate];\n } else if (distance === bestDistance) {\n similar.push(candidate);\n }\n }\n });\n\n similar.sort((a, b) => a.localeCompare(b));\n if (searchingOptions) {\n similar = similar.map((candidate) => `--${candidate}`);\n }\n\n if (similar.length > 1) {\n return `\\n(Did you mean one of ${similar.join(', ')}?)`;\n }\n if (similar.length === 1) {\n return `\\n(Did you mean ${similar[0]}?)`;\n }\n return '';\n}\n","import { Argument } from './lib/argument.js';\nimport { Command } from './lib/command.js';\nimport { CommanderError, InvalidArgumentError } from './lib/error.js';\nimport { Help } from './lib/help.js';\nimport { Option } from './lib/option.js';\n\nexport const program = new Command();\n\nexport const createCommand = (name) => new Command(name);\nexport const createOption = (flags, description) =>\n new Option(flags, description);\nexport const createArgument = (name, description) =>\n new Argument(name, description);\n\n/**\n * Expose classes\n */\n\nexport { Command, Option, Argument, Help };\nexport { CommanderError, InvalidArgumentError };\nexport { InvalidArgumentError as InvalidOptionArgumentError }; // Deprecated\n","import process from \"node:process\";\n\nconst DEFAULT_SERVER_URL = \"http://localhost:15433\";\nconst DEFAULT_LOOKBACK_DAYS = \"2\";\nconst runtimeEnv = process[\"env\"] as Record<string, string | undefined>;\n\ntype CliEnv = {\n\ttoken: string | undefined;\n\tdevice: string | undefined;\n\tserverUrl: string;\n\tclaudeConfigDir: string | undefined;\n\tpiAgentDir: string | undefined;\n\tpiSessionDir: string | undefined;\n\thermesAgentDir: string | undefined;\n\thermesSessionDir: string | undefined;\n\topencodeDataDir: string | undefined;\n\topencodeDbPath: string | undefined;\n};\n\nfunction readCliEnv(): CliEnv {\n\treturn {\n\t\ttoken: runtimeEnv[\"OOPST_TOKEN\"],\n\t\tdevice: runtimeEnv[\"OOPST_DEVICE\"],\n\t\tserverUrl: runtimeEnv[\"OOPST_SERVER\"] ?? DEFAULT_SERVER_URL,\n\t\tclaudeConfigDir: runtimeEnv[\"CLAUDE_CONFIG_DIR\"],\n\t\tpiAgentDir: runtimeEnv[\"PI_CODING_AGENT_DIR\"],\n\t\tpiSessionDir: runtimeEnv[\"PI_CODING_AGENT_SESSION_DIR\"],\n\t\thermesAgentDir: runtimeEnv[\"HERMES_CODING_AGENT_DIR\"],\n\t\thermesSessionDir: runtimeEnv[\"HERMES_CODING_AGENT_SESSION_DIR\"],\n\t\topencodeDataDir: runtimeEnv[\"OPENCODE_DATA_DIR\"],\n\t\topencodeDbPath: runtimeEnv[\"OPENCODE_DB\"],\n\t};\n}\n\nexport type { CliEnv };\nexport { DEFAULT_LOOKBACK_DAYS, DEFAULT_SERVER_URL, readCliEnv };\n","/**\n * Phase-4 CLI exit codes. The mapping is part of the public contract — schedulers\n * (cron, launchd) rely on these to distinguish transient from permanent failures.\n */\nconst SUCCESS_EXIT_CODE = 0;\nconst ZERO_BUCKETS_EXIT_CODE = 1;\nconst UNAUTHORIZED_EXIT_CODE = 2;\nconst NETWORK_ERROR_EXIT_CODE = 3;\nconst INVALID_ARGUMENTS_EXIT_CODE = 4;\nconst GENERAL_FAILURE_EXIT_CODE = 5;\n\nconst EXIT = {\n\tsuccess: SUCCESS_EXIT_CODE,\n\tzeroBucketsButSourcesExist: ZERO_BUCKETS_EXIT_CODE,\n\tunauthorized: UNAUTHORIZED_EXIT_CODE,\n\tnetworkError: NETWORK_ERROR_EXIT_CODE,\n\tinvalidArguments: INVALID_ARGUMENTS_EXIT_CODE,\n\tgeneralFailure: GENERAL_FAILURE_EXIT_CODE,\n} as const;\n\ntype ExitCode = (typeof EXIT)[keyof typeof EXIT];\n\nclass SyncError extends Error {\n\tpublic readonly exitCode: ExitCode;\n\tpublic constructor(exitCode: ExitCode, message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"SyncError\";\n\t\tthis.exitCode = exitCode;\n\t}\n}\n\nfunction isTrpcUnauthorized(err: unknown): boolean {\n\tif (typeof err !== \"object\" || err === null) {\n\t\treturn false;\n\t}\n\tconst candidate = err as { data?: { code?: string }; message?: string };\n\treturn candidate.data?.code === \"UNAUTHORIZED\";\n}\n\nconst NETWORK_ERROR_CODES = [\"ECONNREFUSED\", \"ENOTFOUND\", \"ECONNRESET\", \"EAI_AGAIN\", \"ETIMEDOUT\"];\nconst NETWORK_ERROR_PATTERN = /fetch failed|network|ECONN|ENOTFOUND|ETIMEDOUT/iu;\n\nfunction isNetworkError(err: unknown): boolean {\n\tif (typeof err !== \"object\" || err === null) {\n\t\treturn false;\n\t}\n\tconst code = (err as { cause?: { code?: string } }).cause?.code;\n\tif (code && NETWORK_ERROR_CODES.includes(code)) {\n\t\treturn true;\n\t}\n\tconst message = (err as Error).message ?? \"\";\n\treturn NETWORK_ERROR_PATTERN.test(message);\n}\n\nexport type { ExitCode };\nexport { EXIT, isNetworkError, isTrpcUnauthorized, SyncError };\n","import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { isAbsolute, join } from \"node:path\";\nimport { parseClaude, parseCodex, parseHermes, parseOpenCode, parsePi } from \"@oopst/parsers\";\nimport { readCliEnv } from \"../config\";\nimport type { ParserBundle, ParserFactoryContext } from \"./run\";\n\ntype RealParserResult = ParserBundle & {\n\t/** Reports whether ANY source root existed for any harness. */\n\tanySourceExisted: boolean;\n};\n\nconst OPENCODE_DB_FILE_PATTERN = /^opencode(?:-[^/]+)?\\.db$/u;\n\nfunction sessionsRoot(agentDir: string | undefined, sessionDir: string | undefined, fallbackAgentDir: string): string {\n\treturn sessionDir ?? join(agentDir ?? fallbackAgentDir, \"sessions\");\n}\n\nfunction hermesRoot(\n\thome: string,\n\tenv: { hermesAgentDir: string | undefined; hermesSessionDir: string | undefined },\n): string {\n\treturn env.hermesSessionDir ?? env.hermesAgentDir ?? join(home, \".hermes\");\n}\n\nfunction isFile(path: string): boolean {\n\ttry {\n\t\treturn statSync(path).isFile();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction defaultOpenCodeDataRoot(home: string): string {\n\treturn join(home, \".local\", \"share\", \"opencode\");\n}\n\nfunction openCodeRoot(\n\thome: string,\n\tenv: { opencodeDataDir: string | undefined; opencodeDbPath: string | undefined },\n): string {\n\tconst dataRoot = env.opencodeDataDir ?? defaultOpenCodeDataRoot(home);\n\tconst dbPath = env.opencodeDbPath;\n\tif (dbPath === undefined || dbPath === \":memory:\") {\n\t\treturn dbPath ?? dataRoot;\n\t}\n\treturn isAbsolute(dbPath) ? dbPath : join(dataRoot, dbPath);\n}\n\nfunction hasOpenCodeDatabase(root: string): boolean {\n\tlet entries: string[];\n\ttry {\n\t\tentries = readdirSync(root);\n\t} catch {\n\t\treturn false;\n\t}\n\treturn entries.some((entry) => OPENCODE_DB_FILE_PATTERN.test(entry) && isFile(join(root, entry)));\n}\n\nfunction openCodeSourceExists(root: string): boolean {\n\tif (root === \":memory:\") {\n\t\treturn false;\n\t}\n\tif (isFile(root)) {\n\t\treturn true;\n\t}\n\treturn (\n\t\thasOpenCodeDatabase(root) ||\n\t\texistsSync(join(root, \"storage\", \"message\")) ||\n\t\texistsSync(join(root, \"storage\", \"session\", \"message\")) ||\n\t\texistsSync(join(root, \"project\"))\n\t);\n}\n\nfunction hermesSourceExists(root: string): boolean {\n\treturn (\n\t\tisFile(root) ||\n\t\texistsSync(join(root, \"state.db\")) ||\n\t\texistsSync(join(root, \"sessions\")) ||\n\t\texistsSync(join(root, \"agent\", \"sessions\"))\n\t);\n}\n\nfunction buildRealParserFactory(): (ctx: ParserFactoryContext) => RealParserResult {\n\treturn (ctx) => {\n\t\tconst home = homedir();\n\t\tconst env = readCliEnv();\n\t\tconst codexSessionsRoot = join(home, \".codex\", \"sessions\");\n\t\tconst codexArchivedRoot = join(home, \".codex\", \"archived_sessions\");\n\t\tconst codexExists = existsSync(codexSessionsRoot) || existsSync(codexArchivedRoot);\n\n\t\tconst envDir = env.claudeConfigDir;\n\t\tconst claudeRoot = envDir == null ? join(home, \".claude\", \"projects\") : join(envDir, \"projects\");\n\t\tconst claudeExists = existsSync(claudeRoot);\n\n\t\tconst piRoot = sessionsRoot(env.piAgentDir, env.piSessionDir, join(home, \".pi\", \"agent\"));\n\t\tconst piExists = existsSync(piRoot);\n\n\t\tconst hermesSourceRoot = hermesRoot(home, env);\n\t\tconst hermesExists = hermesSourceExists(hermesSourceRoot);\n\n\t\tconst opencodeRoot = openCodeRoot(home, env);\n\t\tconst opencodeExists = openCodeSourceExists(opencodeRoot);\n\n\t\treturn {\n\t\t\tanySourceExisted: codexExists || claudeExists || piExists || hermesExists || opencodeExists,\n\t\t\tcodex: parseCodex({ cutoff: ctx.cutoff }),\n\t\t\tclaudeCode: parseClaude({ cutoff: ctx.cutoff, root: claudeRoot }),\n\t\t\tpi: parsePi({ cutoff: ctx.cutoff, root: piRoot }),\n\t\t\thermes: parseHermes({ cutoff: ctx.cutoff, root: hermesSourceRoot }),\n\t\t\topencode: parseOpenCode({ cutoff: ctx.cutoff, root: opencodeRoot }),\n\t\t};\n\t};\n}\n\nexport type { RealParserResult };\nexport { buildRealParserFactory };\n","import { stat } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, join } from \"node:path\";\nimport { readClaudeConfigDir } from \"../config\";\nimport { consoleLogger, type Logger, type ParsedBucket } from \"../types\";\nimport { walk } from \"../walk\";\nimport { bucketizeClaudeFile } from \"./bucketize\";\n\ntype ParseClaudeOptions = {\n\t/**\n\t * Absolute path to the Claude `projects` root. Defaults are derived in this order:\n\t * 1. `$CLAUDE_CONFIG_DIR/projects` if `CLAUDE_CONFIG_DIR` is set\n\t * 2. `~/.claude/projects`\n\t */\n\treadonly root?: string;\n\t/** Files with mtime < cutoff are skipped. */\n\treadonly cutoff: Date;\n\t/** Logger for malformed-line warnings. Defaults to `consoleLogger`. */\n\treadonly logger?: Logger;\n};\n\nasync function isFile(path: string): Promise<boolean> {\n\ttry {\n\t\treturn (await stat(path)).isFile();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction defaultRoot(): string {\n\tconst envDir = readClaudeConfigDir();\n\tif (envDir !== undefined) {\n\t\treturn join(envDir, \"projects\");\n\t}\n\treturn join(homedir(), \".claude\", \"projects\");\n}\n\nfunction sourceSessionId(path: string): string {\n\tconst fileDir = dirname(path);\n\tif (basename(fileDir) !== \"subagents\") {\n\t\treturn path;\n\t}\n\n\tconst sessionDir = dirname(fileDir);\n\treturn `${sessionDir}.jsonl`;\n}\n\n/**\n * Walk the Claude `projects` root and yield `ParsedBucket` values for every\n * (model, hourUtc) tuple encountered. Passing a single `.jsonl` file as `root`\n * parses just that file (useful for tests).\n */\nasync function* parseClaude(opts: ParseClaudeOptions): AsyncIterable<ParsedBucket> {\n\tconst logger = opts.logger ?? consoleLogger;\n\tconst root = opts.root ?? defaultRoot();\n\n\tif (await isFile(root)) {\n\t\tyield* bucketizeClaudeFile(root, logger, { sessionId: sourceSessionId(root) });\n\t\treturn;\n\t}\n\n\tconst seenTuplesBySession = new Map<string, Set<string>>();\n\tfor await (const file of walk(root, opts.cutoff)) {\n\t\tconst sessionId = sourceSessionId(file);\n\t\tlet seenTuples = seenTuplesBySession.get(sessionId);\n\t\tif (seenTuples === undefined) {\n\t\t\tseenTuples = new Set();\n\t\t\tseenTuplesBySession.set(sessionId, seenTuples);\n\t\t}\n\t\tyield* bucketizeClaudeFile(file, logger, { sessionId: sessionId, seenTuples: seenTuples });\n\t}\n}\n\nexport type { ParseClaudeOptions };\nexport { parseClaude };\n","import process from \"node:process\";\n\nconst runtimeEnv = process[\"env\"] as Record<string, string | undefined>;\n\nfunction readClaudeConfigDir(): string | undefined {\n\tconst value = runtimeEnv[\"CLAUDE_CONFIG_DIR\"]?.trim();\n\treturn value === undefined || value.length === 0 ? undefined : value;\n}\n\nfunction readPiAgentDir(): string | undefined {\n\tconst value = runtimeEnv[\"PI_CODING_AGENT_DIR\"]?.trim();\n\treturn value === undefined || value.length === 0 ? undefined : value;\n}\n\nfunction readPiSessionDir(): string | undefined {\n\tconst value = runtimeEnv[\"PI_CODING_AGENT_SESSION_DIR\"]?.trim();\n\treturn value === undefined || value.length === 0 ? undefined : value;\n}\n\nfunction readHermesAgentDir(): string | undefined {\n\tconst value = runtimeEnv[\"HERMES_CODING_AGENT_DIR\"]?.trim();\n\treturn value === undefined || value.length === 0 ? undefined : value;\n}\n\nfunction readHermesSessionDir(): string | undefined {\n\tconst value = runtimeEnv[\"HERMES_CODING_AGENT_SESSION_DIR\"]?.trim();\n\treturn value === undefined || value.length === 0 ? undefined : value;\n}\n\nfunction readOpenCodeDataDir(): string | undefined {\n\tconst value = runtimeEnv[\"OPENCODE_DATA_DIR\"]?.trim();\n\treturn value === undefined || value.length === 0 ? undefined : value;\n}\n\nfunction readOpenCodeDbPath(): string | undefined {\n\tconst value = runtimeEnv[\"OPENCODE_DB\"]?.trim();\n\treturn value === undefined || value.length === 0 ? undefined : value;\n}\n\nexport {\n\treadClaudeConfigDir,\n\treadHermesAgentDir,\n\treadHermesSessionDir,\n\treadOpenCodeDataDir,\n\treadOpenCodeDbPath,\n\treadPiAgentDir,\n\treadPiSessionDir,\n};\n","import process from \"node:process\";\n\n/** Top-level AI coding harness the bucket originates from. */\ntype Harness = \"codex\" | \"claude_code\" | \"pi\" | \"hermes\" | \"opencode\";\n\n/**\n * One hourly bucket of token usage emitted by a parser.\n *\n * PRIVACY CONTRACT (enforced by test/privacy.test.ts):\n * No string field beyond `harness` (a literal union) and `model` (the raw model\n * id from the source log) may appear on this type. `sessionIds` holds local-only\n * source identities that may include absolute paths. The CLI MUST translate them\n * to `sessionCount` for hourly buckets and HMAC-derived `sessionKey` values for\n * session facts before upload.\n */\ntype ParsedBucket = {\n\t/** Harness that produced the underlying events. */\n\treadonly harness: Harness;\n\t/** Raw model id from the source log (e.g. \"gpt-5\", \"claude-sonnet-4-5-20250929\"). */\n\treadonly model: string;\n\t/** Start of the UTC hour the events fall into. */\n\treadonly hourUtc: Date;\n\t/** Sum of input tokens, >= 0. */\n\treadonly inputTokens: number;\n\t/** Sum of output tokens, >= 0. */\n\treadonly outputTokens: number;\n\t/** Sum of cache-read tokens, >= 0. */\n\treadonly cacheReadTokens: number;\n\t/** Sum of cache-create / cache-write tokens, >= 0. */\n\treadonly cacheCreateTokens: number;\n\t/** Opaque session identifiers contributing to this bucket. CLI uses `.size` as `session_count`. */\n\treadonly sessionIds: ReadonlySet<string>;\n\t/** First token-bearing event timestamp for the source session. */\n\treadonly sessionStartedAt: Date;\n\t/** Last token-bearing event timestamp for the source session. */\n\treadonly sessionLastSeenAt: Date;\n};\n\n/** Logger shape used by parsers to report skipped lines, malformed events, etc. */\ntype Logger = {\n\twarn: (msg: string, meta?: Record<string, unknown>) => void;\n};\n\nfunction formatLogMeta(meta: Record<string, unknown>): string {\n\treturn JSON.stringify(meta);\n}\n\n/** Default logger writing warnings to stderr. */\nconst consoleLogger: Logger = {\n\twarn: (msg, meta) => {\n\t\tif (meta === undefined) {\n\t\t\tprocess.stderr.write(`${msg}\\n`);\n\t\t} else {\n\t\t\tprocess.stderr.write(`${msg} ${formatLogMeta(meta)}\\n`);\n\t\t}\n\t},\n};\n\nexport type { Harness, Logger, ParsedBucket };\nexport { consoleLogger };\n","import { readdir, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\n/**\n * Yield absolute paths of all `.jsonl` files under `root` whose mtime is at or\n * after `cutoff`. A missing or unreadable root yields nothing (no throw).\n * Subdirectories are recursed; symlinks are followed by `stat`.\n */\nexport async function* walk(root: string, cutoff: Date): AsyncIterable<string> {\n\tlet entries: { name: string; isDirectory: () => boolean; isFile: () => boolean }[];\n\ttry {\n\t\tentries = await readdir(root, { withFileTypes: true });\n\t} catch {\n\t\treturn;\n\t}\n\n\tfor (const entry of entries) {\n\t\tconst full = join(root, String(entry.name));\n\t\tif (entry.isDirectory()) {\n\t\t\tyield* walk(full, cutoff);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!entry.isFile()) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (!entry.name.endsWith(\".jsonl\")) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet mtime: Date;\n\t\ttry {\n\t\t\t// biome-ignore lint/performance/noAwaitInLoops: sequential stat per file is intentional\n\t\t\t({ mtime } = await stat(full));\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\tif (mtime.getTime() >= cutoff.getTime()) {\n\t\t\tyield full;\n\t\t}\n\t}\n}\n","import { createReadStream } from \"node:fs\";\nimport { createInterface } from \"node:readline\";\nimport { startOfUtcHour } from \"../codex/bucketize\";\nimport type { Logger, ParsedBucket } from \"../types\";\nimport { isClaudeAssistantEvent } from \"./events\";\n\ntype BucketAccumulator = {\n\thourUtc: Date;\n\tmodel: string;\n\tinputTokens: number;\n\toutputTokens: number;\n\tcacheReadTokens: number;\n\tcacheCreateTokens: number;\n};\n\ntype BucketizeClaudeFileOptions = {\n\treadonly sessionId?: string;\n\treadonly seenTuples?: Set<string>;\n};\n\nfunction key(hourUtc: Date, model: string): string {\n\treturn `${hourUtc.toISOString()}|${model}`;\n}\n\n/**\n * Parse one Claude Code jsonl file into per-(model, hourUtc) buckets.\n *\n * Dedup rule: when both `message.id` and root `requestId` are present, the\n * tuple is recorded on first sight; subsequent lines with the same tuple are\n * ignored (their token counts are dropped). When either is missing, every\n * line contributes (matches CodexBar's behaviour for older logs).\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: line-by-line parser with necessary branching\nexport async function* bucketizeClaudeFile(\n\tpath: string,\n\tlogger: Logger,\n\toptions: BucketizeClaudeFileOptions = {},\n): AsyncIterable<ParsedBucket> {\n\tconst buckets = new Map<string, BucketAccumulator>();\n\tconst seenTuples = options.seenTuples ?? new Set<string>();\n\tlet lineNo = 0;\n\tlet sessionStartedAt: Date | undefined;\n\tlet sessionLastSeenAt: Date | undefined;\n\n\tconst stream = createReadStream(path, { encoding: \"utf8\" });\n\tconst rl = createInterface({ input: stream, crlfDelay: Number.POSITIVE_INFINITY });\n\n\ttry {\n\t\tfor await (const raw of rl) {\n\t\t\tlineNo += 1;\n\t\t\tconst trimmed = raw.trim();\n\t\t\tif (trimmed.length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet parsed: unknown;\n\t\t\ttry {\n\t\t\t\tparsed = JSON.parse(trimmed);\n\t\t\t} catch {\n\t\t\t\tlogger.warn(\"malformed jsonl line\", { path: path, line: lineNo });\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!isClaudeAssistantEvent(parsed)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst tsMs = Date.parse(parsed.timestamp);\n\t\t\tif (!Number.isFinite(tsMs)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst { message, requestId } = parsed;\n\t\t\tif (message.id !== undefined && requestId !== undefined) {\n\t\t\t\tconst tuple = `${message.id}::${requestId}`;\n\t\t\t\tif (seenTuples.has(tuple)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tseenTuples.add(tuple);\n\t\t\t}\n\n\t\t\tconst { usage } = message;\n\t\t\tconst inputTokens = Math.max(0, usage.input_tokens ?? 0);\n\t\t\tconst outputTokens = Math.max(0, usage.output_tokens ?? 0);\n\t\t\tconst cacheReadTokens = Math.max(0, usage.cache_read_input_tokens ?? 0);\n\t\t\tconst cacheCreateTokens = Math.max(0, usage.cache_creation_input_tokens ?? 0);\n\t\t\tif (inputTokens === 0 && outputTokens === 0 && cacheReadTokens === 0 && cacheCreateTokens === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst eventAt = new Date(tsMs);\n\t\t\tif (sessionStartedAt === undefined || eventAt.getTime() < sessionStartedAt.getTime()) {\n\t\t\t\tsessionStartedAt = eventAt;\n\t\t\t}\n\t\t\tif (sessionLastSeenAt === undefined || eventAt.getTime() > sessionLastSeenAt.getTime()) {\n\t\t\t\tsessionLastSeenAt = eventAt;\n\t\t\t}\n\n\t\t\tconst hourUtc = startOfUtcHour(eventAt);\n\t\t\tconst k = key(hourUtc, message.model);\n\t\t\tconst existing = buckets.get(k);\n\t\t\tif (existing === undefined) {\n\t\t\t\tbuckets.set(k, {\n\t\t\t\t\thourUtc: hourUtc,\n\t\t\t\t\tmodel: message.model,\n\t\t\t\t\tinputTokens: inputTokens,\n\t\t\t\t\toutputTokens: outputTokens,\n\t\t\t\t\tcacheReadTokens: cacheReadTokens,\n\t\t\t\t\tcacheCreateTokens: cacheCreateTokens,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\texisting.inputTokens += inputTokens;\n\t\t\t\texisting.outputTokens += outputTokens;\n\t\t\t\texisting.cacheReadTokens += cacheReadTokens;\n\t\t\t\texisting.cacheCreateTokens += cacheCreateTokens;\n\t\t\t}\n\t\t}\n\t} finally {\n\t\trl.close();\n\t\tstream.destroy();\n\t}\n\n\tif (sessionStartedAt === undefined || sessionLastSeenAt === undefined) {\n\t\treturn;\n\t}\n\n\tconst sessionIds: ReadonlySet<string> = new Set([options.sessionId ?? path]);\n\tfor (const acc of buckets.values()) {\n\t\tyield {\n\t\t\tharness: \"claude_code\",\n\t\t\tmodel: acc.model,\n\t\t\thourUtc: acc.hourUtc,\n\t\t\tinputTokens: acc.inputTokens,\n\t\t\toutputTokens: acc.outputTokens,\n\t\t\tcacheReadTokens: acc.cacheReadTokens,\n\t\t\tcacheCreateTokens: acc.cacheCreateTokens,\n\t\t\tsessionIds: sessionIds,\n\t\t\tsessionStartedAt: sessionStartedAt,\n\t\t\tsessionLastSeenAt: sessionLastSeenAt,\n\t\t};\n\t}\n}\n","import { createReadStream } from \"node:fs\";\nimport { createInterface } from \"node:readline\";\nimport type { Logger, ParsedBucket } from \"../types\";\nimport { isCodexTokenCountEvent, isCodexTurnContextEvent, pickCodexDelta, pickCodexEventModel } from \"./events\";\n\n/** Truncate a Date to the start of its UTC hour. Returns a new Date. */\nfunction startOfUtcHour(d: Date): Date {\n\treturn new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(), d.getUTCHours(), 0, 0, 0));\n}\n\ntype BucketAccumulator = {\n\thourUtc: Date;\n\tmodel: string;\n\tinputTokens: number;\n\toutputTokens: number;\n\tcacheReadTokens: number;\n\tcacheCreateTokens: number;\n};\n\nfunction key(hourUtc: Date, model: string): string {\n\treturn `${hourUtc.toISOString()}|${model}`;\n}\n\n/**\n * Parse one Codex jsonl file into per-(model, hourUtc) buckets.\n * Malformed JSON lines are skipped; each skip is reported to `logger.warn`\n * once with `{ path, line }` metadata. Yields one ParsedBucket per Map entry.\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: line-by-line parser with necessary branching\nasync function* bucketizeCodexFile(path: string, logger: Logger): AsyncIterable<ParsedBucket> {\n\tconst buckets = new Map<string, BucketAccumulator>();\n\tlet currentModel: string | undefined;\n\tlet sawTurnContext = false;\n\tlet lineNo = 0;\n\tlet sessionStartedAt: Date | undefined;\n\tlet sessionLastSeenAt: Date | undefined;\n\n\tconst stream = createReadStream(path, { encoding: \"utf8\" });\n\tconst rl = createInterface({ input: stream, crlfDelay: Number.POSITIVE_INFINITY });\n\n\ttry {\n\t\tfor await (const raw of rl) {\n\t\t\tlineNo += 1;\n\t\t\tconst trimmed = raw.trim();\n\t\t\tif (trimmed.length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet parsed: unknown;\n\t\t\ttry {\n\t\t\t\tparsed = JSON.parse(trimmed);\n\t\t\t} catch {\n\t\t\t\tlogger.warn(\"malformed jsonl line\", { path: path, line: lineNo });\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isCodexTurnContextEvent(parsed)) {\n\t\t\t\tconst model = parsed.payload.model ?? parsed.payload.info?.model;\n\t\t\t\tif (model !== undefined) {\n\t\t\t\t\tcurrentModel = model;\n\t\t\t\t\tsawTurnContext = true;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!isCodexTokenCountEvent(parsed)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst tsMs = Date.parse(parsed.timestamp);\n\t\t\tif (!Number.isFinite(tsMs)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst eventModel = pickCodexEventModel(parsed);\n\t\t\tconst model = sawTurnContext ? (currentModel ?? eventModel) : (eventModel ?? currentModel);\n\t\t\tif (model === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst delta = pickCodexDelta(parsed);\n\t\t\tif (delta === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst inputTokens = Math.max(0, delta.input_tokens ?? 0);\n\t\t\tconst outputTokens = Math.max(0, delta.output_tokens ?? 0);\n\t\t\tconst cacheReadTokens = Math.max(0, delta.cached_input_tokens ?? delta.cache_read_input_tokens ?? 0);\n\t\t\tif (inputTokens === 0 && outputTokens === 0 && cacheReadTokens === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst eventAt = new Date(tsMs);\n\t\t\tif (sessionStartedAt === undefined || eventAt.getTime() < sessionStartedAt.getTime()) {\n\t\t\t\tsessionStartedAt = eventAt;\n\t\t\t}\n\t\t\tif (sessionLastSeenAt === undefined || eventAt.getTime() > sessionLastSeenAt.getTime()) {\n\t\t\t\tsessionLastSeenAt = eventAt;\n\t\t\t}\n\n\t\t\tconst hourUtc = startOfUtcHour(eventAt);\n\t\t\tconst k = key(hourUtc, model);\n\t\t\tconst existing = buckets.get(k);\n\t\t\tif (existing === undefined) {\n\t\t\t\tbuckets.set(k, {\n\t\t\t\t\thourUtc: hourUtc,\n\t\t\t\t\tmodel: model,\n\t\t\t\t\tinputTokens: inputTokens,\n\t\t\t\t\toutputTokens: outputTokens,\n\t\t\t\t\tcacheReadTokens: cacheReadTokens,\n\t\t\t\t\tcacheCreateTokens: 0,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\texisting.inputTokens += inputTokens;\n\t\t\t\texisting.outputTokens += outputTokens;\n\t\t\t\texisting.cacheReadTokens += cacheReadTokens;\n\t\t\t}\n\t\t}\n\t} finally {\n\t\trl.close();\n\t\tstream.destroy();\n\t}\n\n\tif (sessionStartedAt === undefined || sessionLastSeenAt === undefined) {\n\t\treturn;\n\t}\n\n\tconst sessionIds: ReadonlySet<string> = new Set([path]);\n\tfor (const acc of buckets.values()) {\n\t\tyield {\n\t\t\tharness: \"codex\",\n\t\t\tmodel: acc.model,\n\t\t\thourUtc: acc.hourUtc,\n\t\t\tinputTokens: acc.inputTokens,\n\t\t\toutputTokens: acc.outputTokens,\n\t\t\tcacheReadTokens: acc.cacheReadTokens,\n\t\t\tcacheCreateTokens: acc.cacheCreateTokens,\n\t\t\tsessionIds: sessionIds,\n\t\t\tsessionStartedAt: sessionStartedAt,\n\t\t\tsessionLastSeenAt: sessionLastSeenAt,\n\t\t};\n\t}\n}\n\nexport { bucketizeCodexFile, startOfUtcHour };\n","/**\n * Subset of Codex jsonl event shapes that the parser consumes.\n *\n * The full Codex format carries many other event types (`session_meta`,\n * `task_started`, etc.); they are silently ignored. We never look at any\n * field that could contain prompt or tool-call text.\n */\n\ntype CodexTokenCountEvent = {\n\treadonly type: \"event_msg\";\n\treadonly timestamp: string;\n\treadonly payload: {\n\t\treadonly type: \"token_count\";\n\t\treadonly info?: {\n\t\t\treadonly model?: string;\n\t\t\t// biome-ignore lint/style/useNamingConvention: JSON field names from Codex log format\n\t\t\treadonly last_token_usage?: CodexUsageDelta;\n\t\t\t// biome-ignore lint/style/useNamingConvention: JSON field names from Codex log format\n\t\t\treadonly total_token_usage?: CodexUsageDelta;\n\t\t};\n\t\treadonly model?: string;\n\t};\n\treadonly model?: string;\n};\n\ntype CodexTurnContextEvent = {\n\treadonly type: \"turn_context\";\n\treadonly timestamp: string;\n\treadonly payload: {\n\t\treadonly model?: string;\n\t\treadonly info?: {\n\t\t\treadonly model?: string;\n\t\t};\n\t};\n};\n\ntype CodexUsageDelta = {\n\t// biome-ignore lint/style/useNamingConvention: JSON field names from Codex log format\n\treadonly input_tokens?: number;\n\t// biome-ignore lint/style/useNamingConvention: JSON field names from Codex log format\n\treadonly output_tokens?: number;\n\t// biome-ignore lint/style/useNamingConvention: JSON field names from Codex log format\n\treadonly cached_input_tokens?: number;\n\t// biome-ignore lint/style/useNamingConvention: JSON field names from Codex log format\n\treadonly cache_read_input_tokens?: number;\n};\n\ntype CodexEvent = CodexTokenCountEvent | CodexTurnContextEvent;\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction isCodexUsageDelta(value: unknown): value is CodexUsageDelta {\n\tif (!isObject(value)) {\n\t\treturn false;\n\t}\n\tconst keys = [\"input_tokens\", \"output_tokens\", \"cached_input_tokens\", \"cache_read_input_tokens\"] as const;\n\tfor (const k of keys) {\n\t\tconst v = value[k];\n\t\tif (v !== undefined && !isFiniteNumber(v)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: type guard for nested jsonl structure\nfunction isCodexTokenCountEvent(value: unknown): value is CodexTokenCountEvent {\n\tif (!isObject(value)) {\n\t\treturn false;\n\t}\n\tif (value[\"type\"] !== \"event_msg\") {\n\t\treturn false;\n\t}\n\tif (typeof value[\"timestamp\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tconst payload = value[\"payload\"];\n\tif (!isObject(payload)) {\n\t\treturn false;\n\t}\n\tif (payload[\"type\"] !== \"token_count\") {\n\t\treturn false;\n\t}\n\tconst info = payload[\"info\"];\n\tif (info !== undefined) {\n\t\tif (!isObject(info)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (info[\"model\"] !== undefined && typeof info[\"model\"] !== \"string\") {\n\t\t\treturn false;\n\t\t}\n\t\tif (info[\"last_token_usage\"] !== undefined && !isCodexUsageDelta(info[\"last_token_usage\"])) {\n\t\t\treturn false;\n\t\t}\n\t\tif (info[\"total_token_usage\"] !== undefined && !isCodexUsageDelta(info[\"total_token_usage\"])) {\n\t\t\treturn false;\n\t\t}\n\t}\n\tif (payload[\"model\"] !== undefined && typeof payload[\"model\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tif (value[\"model\"] !== undefined && typeof value[\"model\"] !== \"string\") {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nfunction isCodexTurnContextEvent(value: unknown): value is CodexTurnContextEvent {\n\tif (!isObject(value)) {\n\t\treturn false;\n\t}\n\tif (value[\"type\"] !== \"turn_context\") {\n\t\treturn false;\n\t}\n\tif (typeof value[\"timestamp\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tconst payload = value[\"payload\"];\n\tif (!isObject(payload)) {\n\t\treturn false;\n\t}\n\tif (payload[\"model\"] !== undefined && typeof payload[\"model\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tconst info = payload[\"info\"];\n\tif (info !== undefined) {\n\t\tif (!isObject(info)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (info[\"model\"] !== undefined && typeof info[\"model\"] !== \"string\") {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n/** Convenience: extract `last_token_usage` if present, otherwise `total_token_usage`. */\nfunction pickCodexDelta(event: CodexTokenCountEvent): CodexUsageDelta | undefined {\n\treturn event.payload.info?.last_token_usage ?? event.payload.info?.total_token_usage;\n}\n\n/** Convenience: extract the model attribution from a token_count event (excluding turn_context). */\nfunction pickCodexEventModel(event: CodexTokenCountEvent): string | undefined {\n\treturn event.payload.info?.model ?? event.payload.model ?? event.model;\n}\n\nexport type { CodexEvent, CodexTokenCountEvent, CodexTurnContextEvent, CodexUsageDelta };\nexport { isCodexTokenCountEvent, isCodexTurnContextEvent, pickCodexDelta, pickCodexEventModel };\n","/**\n * Subset of Claude Code jsonl event shapes the parser consumes.\n *\n * We never read `message.content`, `text`, or anything that could carry\n * prompt or completion text. Only ids and numeric usage counts.\n */\n\ntype ClaudeAssistantEvent = {\n\treadonly type: \"assistant\";\n\treadonly timestamp: string;\n\treadonly requestId?: string;\n\treadonly message: {\n\t\treadonly id?: string;\n\t\treadonly model: string;\n\t\treadonly usage: ClaudeUsage;\n\t};\n};\n\ntype ClaudeUsage = {\n\t// biome-ignore lint/style/useNamingConvention: JSON field names from Claude Code log format\n\treadonly input_tokens?: number;\n\t// biome-ignore lint/style/useNamingConvention: JSON field names from Claude Code log format\n\treadonly output_tokens?: number;\n\t// biome-ignore lint/style/useNamingConvention: JSON field names from Claude Code log format\n\treadonly cache_creation_input_tokens?: number;\n\t// biome-ignore lint/style/useNamingConvention: JSON field names from Claude Code log format\n\treadonly cache_read_input_tokens?: number;\n};\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction isClaudeUsage(value: unknown): value is ClaudeUsage {\n\tif (!isObject(value)) {\n\t\treturn false;\n\t}\n\tconst keys = [\"input_tokens\", \"output_tokens\", \"cache_creation_input_tokens\", \"cache_read_input_tokens\"] as const;\n\tfor (const k of keys) {\n\t\tconst v = value[k];\n\t\tif (v !== undefined && !isFiniteNumber(v)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\nfunction isClaudeAssistantEvent(value: unknown): value is ClaudeAssistantEvent {\n\tif (!isObject(value)) {\n\t\treturn false;\n\t}\n\tif (value[\"type\"] !== \"assistant\") {\n\t\treturn false;\n\t}\n\tif (typeof value[\"timestamp\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tif (value[\"requestId\"] !== undefined && typeof value[\"requestId\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tconst message = value[\"message\"];\n\tif (!isObject(message)) {\n\t\treturn false;\n\t}\n\tif (message[\"id\"] !== undefined && typeof message[\"id\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tif (typeof message[\"model\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tif (!isClaudeUsage(message[\"usage\"])) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nexport type { ClaudeAssistantEvent, ClaudeUsage };\nexport { isClaudeAssistantEvent };\n","import { stat } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { consoleLogger, type Logger, type ParsedBucket } from \"../types\";\nimport { walk } from \"../walk\";\nimport { bucketizeCodexFile } from \"./bucketize\";\n\ntype ParseCodexOptions = {\n\t/** Absolute path to the Codex sessions root. Defaults to `~/.codex/sessions`. */\n\treadonly root?: string;\n\t/** Additional root scanned alongside `root`. Defaults to `~/.codex/archived_sessions`. */\n\treadonly archivedRoot?: string;\n\t/** Files with mtime < cutoff are skipped. */\n\treadonly cutoff: Date;\n\t/** Logger for malformed-line warnings. Defaults to `consoleLogger`. */\n\treadonly logger?: Logger;\n};\n\nasync function isFile(path: string): Promise<boolean> {\n\ttry {\n\t\treturn (await stat(path)).isFile();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Walk one or two Codex source roots and yield `ParsedBucket` values for\n * every (model, hourUtc) tuple encountered. Passing a single `.jsonl` file\n * as `root` parses just that file (useful for tests).\n */\nasync function* parseCodex(opts: ParseCodexOptions): AsyncIterable<ParsedBucket> {\n\tconst logger = opts.logger ?? consoleLogger;\n\tconst home = homedir();\n\tconst root = opts.root ?? join(home, \".codex\", \"sessions\");\n\n\tif (await isFile(root)) {\n\t\tyield* bucketizeCodexFile(root, logger);\n\t\treturn;\n\t}\n\n\tconst roots: string[] = [root];\n\tif (opts.root === undefined && opts.archivedRoot === undefined) {\n\t\troots.push(join(home, \".codex\", \"archived_sessions\"));\n\t} else if (opts.archivedRoot !== undefined) {\n\t\troots.push(opts.archivedRoot);\n\t}\n\n\tfor (const r of roots) {\n\t\t// biome-ignore lint/performance/noAwaitInLoops: sequential root scanning is intentional\n\t\tfor await (const file of walk(r, opts.cutoff)) {\n\t\t\tyield* bucketizeCodexFile(file, logger);\n\t\t}\n\t}\n}\n\nexport type { ParseCodexOptions };\nexport { parseCodex };\n","import { readdir, stat } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { basename, isAbsolute, join } from \"node:path\";\nimport { readOpenCodeDataDir, readOpenCodeDbPath } from \"../config\";\nimport { consoleLogger, type Logger, type ParsedBucket } from \"../types\";\nimport { bucketizeOpenCodeDatabase, bucketizeOpenCodeJsonFile } from \"./bucketize\";\n\ntype ParseOpenCodeOptions = {\n\t/** OpenCode data directory or a specific `opencode*.db` / legacy message `.json` file. */\n\treadonly root?: string;\n\t/** Files or rows older than cutoff are skipped. */\n\treadonly cutoff: Date;\n\t/** Logger for malformed input warnings. Defaults to `consoleLogger`. */\n\treadonly logger?: Logger;\n};\n\nconst OPENCODE_DB_FILE_PATTERN = /^opencode(?:-[^/]+)?\\.db$/u;\n\nasync function pathKind(path: string): Promise<\"file\" | \"directory\" | \"missing\"> {\n\ttry {\n\t\tconst s = await stat(path);\n\t\tif (s.isFile()) {\n\t\t\treturn \"file\";\n\t\t}\n\t\tif (s.isDirectory()) {\n\t\t\treturn \"directory\";\n\t\t}\n\t\treturn \"missing\";\n\t} catch {\n\t\treturn \"missing\";\n\t}\n}\n\nfunction defaultDataRoot(): string {\n\treturn readOpenCodeDataDir() ?? join(homedir(), \".local\", \"share\", \"opencode\");\n}\n\nfunction resolveDefaultRoot(): string {\n\tconst dbPath = readOpenCodeDbPath();\n\tif (dbPath === undefined) {\n\t\treturn defaultDataRoot();\n\t}\n\tif (dbPath === \":memory:\") {\n\t\treturn dbPath;\n\t}\n\tif (isAbsolute(dbPath)) {\n\t\treturn dbPath;\n\t}\n\treturn join(defaultDataRoot(), dbPath);\n}\n\nasync function listOpenCodeDatabases(root: string): Promise<string[]> {\n\tlet entries: { name: string; isFile: () => boolean }[];\n\ttry {\n\t\tentries = await readdir(root, { withFileTypes: true });\n\t} catch {\n\t\treturn [];\n\t}\n\n\treturn entries\n\t\t.filter((entry) => entry.isFile() && OPENCODE_DB_FILE_PATTERN.test(String(entry.name)))\n\t\t.map((entry) => join(root, String(entry.name)));\n}\n\nasync function listProjectLegacyRoots(root: string): Promise<string[]> {\n\tconst projectRoot = join(root, \"project\");\n\tlet entries: { name: string; isDirectory: () => boolean }[];\n\ttry {\n\t\tentries = await readdir(projectRoot, { withFileTypes: true });\n\t} catch {\n\t\treturn [];\n\t}\n\n\treturn entries\n\t\t.filter((entry) => entry.isDirectory())\n\t\t.flatMap((entry) => [\n\t\t\tjoin(projectRoot, String(entry.name), \"storage\", \"message\"),\n\t\t\tjoin(projectRoot, String(entry.name), \"storage\", \"session\", \"message\"),\n\t\t]);\n}\n\nasync function legacyRoots(root: string): Promise<string[]> {\n\treturn [\n\t\tjoin(root, \"storage\", \"message\"),\n\t\tjoin(root, \"storage\", \"session\", \"message\"),\n\t\t...(await listProjectLegacyRoots(root)),\n\t];\n}\n\nasync function* walkJson(root: string, cutoff: Date): AsyncIterable<string> {\n\tlet entries: { name: string; isDirectory: () => boolean; isFile: () => boolean }[];\n\ttry {\n\t\tentries = await readdir(root, { withFileTypes: true });\n\t} catch {\n\t\treturn;\n\t}\n\n\tfor (const entry of entries) {\n\t\tconst full = join(root, String(entry.name));\n\t\tif (entry.isDirectory()) {\n\t\t\tyield* walkJson(full, cutoff);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!(entry.isFile() && entry.name.endsWith(\".json\"))) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet mtime: Date;\n\t\ttry {\n\t\t\t// biome-ignore lint/performance/noAwaitInLoops: sequential stat per file is intentional.\n\t\t\t({ mtime } = await stat(full));\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\tif (mtime.getTime() >= cutoff.getTime()) {\n\t\t\tyield full;\n\t\t}\n\t}\n}\n\n/**\n * Walk OpenCode's SQLite database, or legacy JSON message storage when no\n * database is present, and yield one bucket per (session, model, hourUtc).\n */\nasync function* parseOpenCode(opts: ParseOpenCodeOptions): AsyncIterable<ParsedBucket> {\n\tconst logger = opts.logger ?? consoleLogger;\n\tconst root = opts.root ?? resolveDefaultRoot();\n\tconst kind = await pathKind(root);\n\tif (kind === \"missing\") {\n\t\treturn;\n\t}\n\n\tif (kind === \"file\") {\n\t\tif (basename(root).endsWith(\".json\")) {\n\t\t\tyield* bucketizeOpenCodeJsonFile(root, logger);\n\t\t\treturn;\n\t\t}\n\t\tyield* bucketizeOpenCodeDatabase(root, opts.cutoff, logger);\n\t\treturn;\n\t}\n\n\tconst databases = await listOpenCodeDatabases(root);\n\tif (databases.length > 0) {\n\t\tfor (const dbPath of databases) {\n\t\t\tyield* bucketizeOpenCodeDatabase(dbPath, opts.cutoff, logger);\n\t\t}\n\t\treturn;\n\t}\n\n\tfor (const legacyRoot of await legacyRoots(root)) {\n\t\t// biome-ignore lint/performance/noAwaitInLoops: roots are scanned sequentially to keep memory bounded.\n\t\tfor await (const file of walkJson(legacyRoot, opts.cutoff)) {\n\t\t\tyield* bucketizeOpenCodeJsonFile(file, logger);\n\t\t}\n\t}\n}\n\nexport type { ParseOpenCodeOptions };\nexport { parseOpenCode };\n","import { readFile } from \"node:fs/promises\";\nimport { startOfUtcHour } from \"../codex/bucketize\";\nimport type { Logger, ParsedBucket } from \"../types\";\nimport { type OpenCodeUsage, pickOpenCodeUsage } from \"./events\";\n\n// Keep this dynamic. esbuild does not currently recognise node:sqlite as a\n// built-in and rewrites static imports to the bare \"sqlite\" package.\nconst NODE_SQLITE_SPECIFIER = [\"node\", \"sqlite\"].join(\":\");\nconst MISSING_SESSION_MESSAGE_TABLE_PATTERN = /no such table: session_message/u;\n\ntype SqliteModule = typeof import(\"node:sqlite\");\ntype DatabaseSyncConstructor = SqliteModule[\"DatabaseSync\"];\ntype DatabaseSync = InstanceType<DatabaseSyncConstructor>;\n\ntype BucketAccumulator = {\n\thourUtc: Date;\n\tmodel: string;\n\tsessionId: string;\n\tinputTokens: number;\n\toutputTokens: number;\n\tcacheReadTokens: number;\n\tcacheCreateTokens: number;\n\tsessionStartedAt: Date;\n\tsessionLastSeenAt: Date;\n};\n\ntype SessionMessageRow = {\n\tsessionId: unknown;\n\ttimeCreated: unknown;\n\tdata: unknown;\n};\n\nfunction key(hourUtc: Date, model: string, sessionId: string): string {\n\treturn `${hourUtc.toISOString()}|${model}|${sessionId}`;\n}\n\nfunction modelId(provider: string, model: string): string | undefined {\n\tconst trimmedProvider = provider.trim();\n\tconst trimmedModel = model.trim();\n\tif (trimmedProvider.length === 0 || trimmedModel.length === 0) {\n\t\treturn undefined;\n\t}\n\treturn `${trimmedProvider}/${trimmedModel}`;\n}\n\nfunction finiteTimestampMs(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction positive(value: number | undefined): number {\n\treturn Math.max(0, value ?? 0);\n}\n\nfunction addUsage(accumulators: Map<string, BucketAccumulator>, usage: OpenCodeUsage): void {\n\tconst model = modelId(usage.providerId, usage.modelId);\n\tif (model === undefined) {\n\t\treturn;\n\t}\n\tconst inputTokens = positive(usage.tokens.input);\n\tconst outputTokens = positive(usage.tokens.output) + positive(usage.tokens.reasoning);\n\tconst cacheReadTokens = positive(usage.tokens.cache?.read);\n\tconst cacheCreateTokens = positive(usage.tokens.cache?.write);\n\tif (inputTokens === 0 && outputTokens === 0 && cacheReadTokens === 0 && cacheCreateTokens === 0) {\n\t\treturn;\n\t}\n\n\tconst eventAt = new Date(usage.timestampMs);\n\tconst hourUtc = startOfUtcHour(eventAt);\n\tconst sessionId = `opencode:${usage.sessionId}`;\n\tconst accumulatorKey = key(hourUtc, model, sessionId);\n\tconst existing = accumulators.get(accumulatorKey);\n\tif (existing === undefined) {\n\t\taccumulators.set(accumulatorKey, {\n\t\t\thourUtc: hourUtc,\n\t\t\tmodel: model,\n\t\t\tsessionId: sessionId,\n\t\t\tinputTokens: inputTokens,\n\t\t\toutputTokens: outputTokens,\n\t\t\tcacheReadTokens: cacheReadTokens,\n\t\t\tcacheCreateTokens: cacheCreateTokens,\n\t\t\tsessionStartedAt: eventAt,\n\t\t\tsessionLastSeenAt: eventAt,\n\t\t});\n\t\treturn;\n\t}\n\n\texisting.inputTokens += inputTokens;\n\texisting.outputTokens += outputTokens;\n\texisting.cacheReadTokens += cacheReadTokens;\n\texisting.cacheCreateTokens += cacheCreateTokens;\n\tif (eventAt.getTime() < existing.sessionStartedAt.getTime()) {\n\t\texisting.sessionStartedAt = eventAt;\n\t}\n\tif (eventAt.getTime() > existing.sessionLastSeenAt.getTime()) {\n\t\texisting.sessionLastSeenAt = eventAt;\n\t}\n}\n\nfunction* finalizedBuckets(accumulators: Map<string, BucketAccumulator>): Iterable<ParsedBucket> {\n\tfor (const acc of accumulators.values()) {\n\t\tyield {\n\t\t\tharness: \"opencode\",\n\t\t\tmodel: acc.model,\n\t\t\thourUtc: acc.hourUtc,\n\t\t\tinputTokens: acc.inputTokens,\n\t\t\toutputTokens: acc.outputTokens,\n\t\t\tcacheReadTokens: acc.cacheReadTokens,\n\t\t\tcacheCreateTokens: acc.cacheCreateTokens,\n\t\t\tsessionIds: new Set([acc.sessionId]),\n\t\t\tsessionStartedAt: acc.sessionStartedAt,\n\t\t\tsessionLastSeenAt: acc.sessionLastSeenAt,\n\t\t};\n\t}\n}\n\nfunction parseJson(value: unknown): unknown {\n\treturn typeof value === \"string\" ? JSON.parse(value) : value;\n}\n\nfunction isMissingTableError(err: unknown): boolean {\n\treturn err instanceof Error && MISSING_SESSION_MESSAGE_TABLE_PATTERN.test(err.message);\n}\n\nasync function loadDatabaseSync(): Promise<DatabaseSyncConstructor> {\n\tconst sqliteModule = (await import(NODE_SQLITE_SPECIFIER)) as SqliteModule;\n\treturn sqliteModule.DatabaseSync;\n}\n\nfunction* readSessionMessageRows(db: DatabaseSync, cutoff: Date): Iterable<SessionMessageRow> {\n\tconst statement = db.prepare(`\n select session_id as \"sessionId\", time_created as \"timeCreated\", data\n from session_message\n where type = 'assistant' and time_created >= ?\n order by time_created asc, id asc\n `);\n\tyield* statement.all(cutoff.getTime()) as SessionMessageRow[];\n}\n\nasync function* bucketizeOpenCodeDatabase(path: string, cutoff: Date, logger: Logger): AsyncIterable<ParsedBucket> {\n\tconst accumulators = new Map<string, BucketAccumulator>();\n\tconst DatabaseSync = await loadDatabaseSync();\n\tlet db: DatabaseSync | undefined;\n\ttry {\n\t\tdb = new DatabaseSync(path, { readOnly: true, timeout: 1000 });\n\t\tfor (const row of readSessionMessageRows(db, cutoff)) {\n\t\t\tconst sessionId = typeof row.sessionId === \"string\" ? row.sessionId : undefined;\n\t\t\tconst fallbackTimestampMs = finiteTimestampMs(row.timeCreated);\n\t\t\tlet parsed: unknown;\n\t\t\ttry {\n\t\t\t\tparsed = parseJson(row.data);\n\t\t\t} catch {\n\t\t\t\tlogger.warn(\"malformed opencode sqlite message\", { path: path });\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst usage = pickOpenCodeUsage(parsed, sessionId, fallbackTimestampMs);\n\t\t\tif (usage !== undefined) {\n\t\t\t\taddUsage(accumulators, usage);\n\t\t\t}\n\t\t}\n\t} catch (err) {\n\t\tif (!isMissingTableError(err)) {\n\t\t\tlogger.warn(\"failed to parse opencode sqlite database\", { path: path });\n\t\t}\n\t} finally {\n\t\tdb?.close();\n\t}\n\n\tyield* finalizedBuckets(accumulators);\n}\n\nasync function* bucketizeOpenCodeJsonFile(path: string, logger: Logger): AsyncIterable<ParsedBucket> {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(await readFile(path, \"utf8\"));\n\t} catch {\n\t\tlogger.warn(\"malformed opencode json file\", { path: path });\n\t\treturn;\n\t}\n\n\tconst usage = pickOpenCodeUsage(parsed);\n\tif (usage === undefined) {\n\t\treturn;\n\t}\n\n\tconst accumulators = new Map<string, BucketAccumulator>();\n\taddUsage(accumulators, usage);\n\tyield* finalizedBuckets(accumulators);\n}\n\nexport { bucketizeOpenCodeDatabase, bucketizeOpenCodeJsonFile };\n","type OpenCodeTokens = {\n\treadonly input?: number;\n\treadonly output?: number;\n\treadonly reasoning?: number;\n\treadonly cache?: {\n\t\treadonly read?: number;\n\t\treadonly write?: number;\n\t};\n};\n\ntype OpenCodeUsage = {\n\treadonly sessionId: string;\n\treadonly providerId: string;\n\treadonly modelId: string;\n\treadonly timestampMs: number;\n\treadonly tokens: OpenCodeTokens;\n};\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction timestampMs(value: unknown): number | undefined {\n\tif (isFiniteNumber(value)) {\n\t\treturn value;\n\t}\n\tif (typeof value !== \"string\") {\n\t\treturn undefined;\n\t}\n\tconst parsed = Date.parse(value);\n\treturn Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction isOpenCodeTokens(value: unknown): value is OpenCodeTokens {\n\tif (!isObject(value)) {\n\t\treturn false;\n\t}\n\tconst keys = [\"input\", \"output\", \"reasoning\"] as const;\n\tfor (const k of keys) {\n\t\tconst v = value[k];\n\t\tif (v !== undefined && !isFiniteNumber(v)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\tconst cache = value[\"cache\"];\n\tif (cache !== undefined) {\n\t\tif (!isObject(cache)) {\n\t\t\treturn false;\n\t\t}\n\t\tfor (const k of [\"read\", \"write\"] as const) {\n\t\t\tconst v = cache[k];\n\t\t\tif (v !== undefined && !isFiniteNumber(v)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn true;\n}\n\nfunction usageFromModernMessage(\n\tvalue: Record<string, unknown>,\n\tfallbackSessionId: string | undefined,\n\tfallbackTimestampMs: number | undefined,\n): OpenCodeUsage | undefined {\n\tconst model = value[\"model\"];\n\tif (!isObject(model)) {\n\t\treturn undefined;\n\t}\n\tconst providerId = model[\"providerID\"];\n\tconst modelId = model[\"modelID\"] ?? model[\"id\"];\n\tif (typeof providerId !== \"string\" || typeof modelId !== \"string\") {\n\t\treturn undefined;\n\t}\n\tconst tokens = value[\"tokens\"];\n\tif (!isOpenCodeTokens(tokens)) {\n\t\treturn undefined;\n\t}\n\n\tconst time = value[\"time\"];\n\tconst messageTimestampMs = isObject(time) ? timestampMs(time[\"created\"] ?? time[\"completed\"]) : undefined;\n\tconst sessionId = typeof value[\"sessionID\"] === \"string\" ? value[\"sessionID\"] : fallbackSessionId;\n\tconst tsMs = messageTimestampMs ?? fallbackTimestampMs;\n\tif (sessionId === undefined || tsMs === undefined) {\n\t\treturn undefined;\n\t}\n\n\treturn {\n\t\tsessionId: sessionId,\n\t\tproviderId: providerId,\n\t\tmodelId: modelId,\n\t\ttimestampMs: tsMs,\n\t\ttokens: tokens,\n\t};\n}\n\nfunction usageFromLegacyMessage(\n\tvalue: Record<string, unknown>,\n\tfallbackSessionId: string | undefined,\n\tfallbackTimestampMs: number | undefined,\n): OpenCodeUsage | undefined {\n\tif (value[\"role\"] !== \"assistant\") {\n\t\treturn undefined;\n\t}\n\n\tconst providerId = value[\"providerID\"];\n\tconst modelId = value[\"modelID\"];\n\tconst tokens = value[\"tokens\"];\n\tif (typeof providerId !== \"string\" || typeof modelId !== \"string\" || !isOpenCodeTokens(tokens)) {\n\t\treturn undefined;\n\t}\n\n\tconst time = value[\"time\"];\n\tconst messageTimestampMs = isObject(time) ? timestampMs(time[\"created\"] ?? time[\"completed\"]) : undefined;\n\tconst sessionId = typeof value[\"sessionID\"] === \"string\" ? value[\"sessionID\"] : fallbackSessionId;\n\tconst tsMs = messageTimestampMs ?? fallbackTimestampMs;\n\tif (sessionId === undefined || tsMs === undefined) {\n\t\treturn undefined;\n\t}\n\n\treturn {\n\t\tsessionId: sessionId,\n\t\tproviderId: providerId,\n\t\tmodelId: modelId,\n\t\ttimestampMs: tsMs,\n\t\ttokens: tokens,\n\t};\n}\n\nfunction usageFromMetadataMessage(\n\tvalue: Record<string, unknown>,\n\tfallbackSessionId: string | undefined,\n\tfallbackTimestampMs: number | undefined,\n): OpenCodeUsage | undefined {\n\tif (value[\"role\"] !== \"assistant\") {\n\t\treturn undefined;\n\t}\n\tconst metadata = value[\"metadata\"];\n\tif (!isObject(metadata)) {\n\t\treturn undefined;\n\t}\n\tconst assistant = metadata[\"assistant\"];\n\tif (!isObject(assistant)) {\n\t\treturn undefined;\n\t}\n\tconst providerId = assistant[\"providerID\"];\n\tconst modelId = assistant[\"modelID\"];\n\tconst tokens = assistant[\"tokens\"];\n\tif (typeof providerId !== \"string\" || typeof modelId !== \"string\" || !isOpenCodeTokens(tokens)) {\n\t\treturn undefined;\n\t}\n\n\tconst time = metadata[\"time\"];\n\tconst messageTimestampMs = isObject(time) ? timestampMs(time[\"created\"] ?? time[\"completed\"]) : undefined;\n\tconst sessionId = typeof metadata[\"sessionID\"] === \"string\" ? metadata[\"sessionID\"] : fallbackSessionId;\n\tconst tsMs = messageTimestampMs ?? fallbackTimestampMs;\n\tif (sessionId === undefined || tsMs === undefined) {\n\t\treturn undefined;\n\t}\n\n\treturn {\n\t\tsessionId: sessionId,\n\t\tproviderId: providerId,\n\t\tmodelId: modelId,\n\t\ttimestampMs: tsMs,\n\t\ttokens: tokens,\n\t};\n}\n\nfunction pickOpenCodeUsage(\n\tvalue: unknown,\n\tfallbackSessionId?: string,\n\tfallbackTimestampMs?: number,\n): OpenCodeUsage | undefined {\n\tif (!isObject(value)) {\n\t\treturn undefined;\n\t}\n\n\treturn (\n\t\tusageFromModernMessage(value, fallbackSessionId, fallbackTimestampMs) ??\n\t\tusageFromLegacyMessage(value, fallbackSessionId, fallbackTimestampMs) ??\n\t\tusageFromMetadataMessage(value, fallbackSessionId, fallbackTimestampMs)\n\t);\n}\n\nexport type { OpenCodeTokens, OpenCodeUsage };\nexport { pickOpenCodeUsage };\n","import { stat } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { basename, join } from \"node:path\";\nimport { readHermesAgentDir, readHermesSessionDir, readPiAgentDir, readPiSessionDir } from \"../config\";\nimport { consoleLogger, type Logger, type ParsedBucket } from \"../types\";\nimport { walk } from \"../walk\";\nimport { bucketizeHermesDatabase, bucketizePiStyleFile, type PiStyleHarness } from \"./bucketize\";\n\ntype ParsePiOptions = {\n\t/** Absolute path to the Pi/Hermes sessions root. Defaults to the harness-specific session directory. */\n\treadonly root?: string;\n\t/** Files with mtime < cutoff are skipped. */\n\treadonly cutoff: Date;\n\t/** Logger for malformed-line warnings. Defaults to `consoleLogger`. */\n\treadonly logger?: Logger;\n};\n\nasync function pathKind(path: string): Promise<\"file\" | \"directory\" | \"missing\"> {\n\ttry {\n\t\tconst s = await stat(path);\n\t\tif (s.isFile()) {\n\t\t\treturn \"file\";\n\t\t}\n\t\tif (s.isDirectory()) {\n\t\t\treturn \"directory\";\n\t\t}\n\t\treturn \"missing\";\n\t} catch {\n\t\treturn \"missing\";\n\t}\n}\n\nasync function isFile(path: string): Promise<boolean> {\n\treturn (await pathKind(path)) === \"file\";\n}\n\nfunction defaultPiRoot(): string {\n\tconst sessionDir = readPiSessionDir();\n\tif (sessionDir !== undefined) {\n\t\treturn sessionDir;\n\t}\n\treturn join(readPiAgentDir() ?? join(homedir(), \".pi\", \"agent\"), \"sessions\");\n}\n\nfunction defaultHermesRoot(): string {\n\tconst sessionDir = readHermesSessionDir();\n\tif (sessionDir !== undefined) {\n\t\treturn sessionDir;\n\t}\n\treturn readHermesAgentDir() ?? join(homedir(), \".hermes\");\n}\n\nasync function* parsePiStyle(\n\topts: ParsePiOptions,\n\tharness: PiStyleHarness,\n\tdefaultRoot: () => string,\n): AsyncIterable<ParsedBucket> {\n\tconst logger = opts.logger ?? consoleLogger;\n\tconst root = opts.root ?? defaultRoot();\n\n\tif (await isFile(root)) {\n\t\tyield* bucketizePiStyleFile(root, harness, logger);\n\t\treturn;\n\t}\n\n\tfor await (const file of walk(root, opts.cutoff)) {\n\t\tyield* bucketizePiStyleFile(file, harness, logger);\n\t}\n}\n\nasync function* parsePi(opts: ParsePiOptions): AsyncIterable<ParsedBucket> {\n\tyield* parsePiStyle(opts, \"pi\", defaultPiRoot);\n}\n\nasync function* parseHermes(opts: ParsePiOptions): AsyncIterable<ParsedBucket> {\n\tconst logger = opts.logger ?? consoleLogger;\n\tconst root = opts.root ?? defaultHermesRoot();\n\tconst kind = await pathKind(root);\n\tif (kind === \"missing\") {\n\t\treturn;\n\t}\n\n\tif (kind === \"file\") {\n\t\tif (basename(root).endsWith(\".db\")) {\n\t\t\tyield* bucketizeHermesDatabase(root, opts.cutoff, logger);\n\t\t\treturn;\n\t\t}\n\t\tyield* bucketizePiStyleFile(root, \"hermes\", logger);\n\t\treturn;\n\t}\n\n\tconst stateDb = join(root, \"state.db\");\n\tif (await isFile(stateDb)) {\n\t\tyield* bucketizeHermesDatabase(stateDb, opts.cutoff, logger);\n\t\treturn;\n\t}\n\n\tconst sessionsRoot = join(root, \"sessions\");\n\tif ((await pathKind(sessionsRoot)) === \"directory\") {\n\t\tfor await (const file of walk(sessionsRoot, opts.cutoff)) {\n\t\t\tyield* bucketizePiStyleFile(file, \"hermes\", logger);\n\t\t}\n\t\treturn;\n\t}\n\n\tconst agentSessionsRoot = join(root, \"agent\", \"sessions\");\n\tif ((await pathKind(agentSessionsRoot)) === \"directory\") {\n\t\tfor await (const file of walk(agentSessionsRoot, opts.cutoff)) {\n\t\t\tyield* bucketizePiStyleFile(file, \"hermes\", logger);\n\t\t}\n\t\treturn;\n\t}\n\n\tfor await (const file of walk(root, opts.cutoff)) {\n\t\tyield* bucketizePiStyleFile(file, \"hermes\", logger);\n\t}\n}\n\nexport type { ParsePiOptions };\nexport { parseHermes, parsePi };\n","import { createReadStream } from \"node:fs\";\nimport { createInterface } from \"node:readline\";\nimport { startOfUtcHour } from \"../codex/bucketize\";\nimport type { Harness, Logger, ParsedBucket } from \"../types\";\nimport { isPiAssistantMessageEntry } from \"./events\";\n\n// Keep this dynamic. esbuild does not currently recognise node:sqlite as a\n// built-in and rewrites static imports to the bare \"sqlite\" package.\nconst NODE_SQLITE_SPECIFIER = [\"node\", \"sqlite\"].join(\":\");\nconst MILLISECONDS_PER_SECOND = 1000;\nconst UNIX_MILLISECONDS_THRESHOLD = 1_000_000_000_000;\n\ntype SqliteModule = typeof import(\"node:sqlite\");\ntype DatabaseSyncConstructor = SqliteModule[\"DatabaseSync\"];\ntype DatabaseSync = InstanceType<DatabaseSyncConstructor>;\ntype PiStyleHarness = Extract<Harness, \"pi\" | \"hermes\">;\n\ntype BucketAccumulator = {\n\thourUtc: Date;\n\tmodel: string;\n\tinputTokens: number;\n\toutputTokens: number;\n\tcacheReadTokens: number;\n\tcacheCreateTokens: number;\n};\n\ntype HermesSessionRow = {\n\tid: unknown;\n\tmodel: unknown;\n\tbillingProvider: unknown;\n\tstartedAt: unknown;\n\tendedAt: unknown;\n\tinputTokens: unknown;\n\toutputTokens: unknown;\n\tcacheReadTokens: unknown;\n\tcacheWriteTokens: unknown;\n};\n\nfunction key(hourUtc: Date, model: string): string {\n\treturn `${hourUtc.toISOString()}|${model}`;\n}\n\nfunction eventTimestampMs(entry: { timestamp: string; message: { timestamp?: number } }): number {\n\tif (entry.message.timestamp !== undefined) {\n\t\treturn entry.message.timestamp;\n\t}\n\treturn Date.parse(entry.timestamp);\n}\n\nfunction modelId(provider: string, model: string): string | undefined {\n\tconst trimmedProvider = normalizeProvider(provider.trim());\n\tconst trimmedModel = model.trim();\n\tif (trimmedProvider.length === 0 || trimmedModel.length === 0) {\n\t\treturn undefined;\n\t}\n\treturn `${trimmedProvider}/${trimmedModel}`;\n}\n\nfunction normalizeProvider(provider: string): string {\n\treturn provider === \"openai-codex\" ? \"openai\" : provider;\n}\n\nfunction finiteNumber(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction positive(value: unknown): number {\n\treturn Math.max(0, finiteNumber(value) ?? 0);\n}\n\nfunction timestampMs(value: unknown): number | undefined {\n\tconst n = finiteNumber(value);\n\tif (n === undefined) {\n\t\treturn undefined;\n\t}\n\treturn Math.abs(n) < UNIX_MILLISECONDS_THRESHOLD ? n * MILLISECONDS_PER_SECOND : n;\n}\n\nasync function loadDatabaseSync(): Promise<DatabaseSyncConstructor> {\n\tconst sqliteModule = (await import(NODE_SQLITE_SPECIFIER)) as SqliteModule;\n\treturn sqliteModule.DatabaseSync;\n}\n\nfunction* readHermesSessionRows(db: DatabaseSync, cutoff: Date): Iterable<HermesSessionRow> {\n\tconst statement = db.prepare(`\n select\n id,\n model,\n billing_provider as \"billingProvider\",\n started_at as \"startedAt\",\n ended_at as \"endedAt\",\n input_tokens as \"inputTokens\",\n output_tokens as \"outputTokens\",\n cache_read_tokens as \"cacheReadTokens\",\n cache_write_tokens as \"cacheWriteTokens\"\n from sessions\n where coalesce(ended_at, started_at) >= ?\n order by started_at asc, id asc\n `);\n\tyield* statement.all(cutoff.getTime() / MILLISECONDS_PER_SECOND) as HermesSessionRow[];\n}\n\nfunction hermesRowToBucket(row: HermesSessionRow): ParsedBucket | undefined {\n\tconst sessionId = typeof row.id === \"string\" ? row.id : undefined;\n\tconst startedAtMs = timestampMs(row.startedAt);\n\tconst lastSeenAtMs = timestampMs(row.endedAt) ?? startedAtMs;\n\tconst provider = typeof row.billingProvider === \"string\" ? row.billingProvider : undefined;\n\tconst sourceModel = typeof row.model === \"string\" ? row.model : undefined;\n\tif (\n\t\tsessionId === undefined ||\n\t\tstartedAtMs === undefined ||\n\t\tlastSeenAtMs === undefined ||\n\t\tprovider === undefined ||\n\t\tsourceModel === undefined\n\t) {\n\t\treturn undefined;\n\t}\n\n\tconst model = modelId(provider, sourceModel);\n\tif (model === undefined) {\n\t\treturn undefined;\n\t}\n\n\tconst inputTokens = positive(row.inputTokens);\n\tconst outputTokens = positive(row.outputTokens);\n\tconst cacheReadTokens = positive(row.cacheReadTokens);\n\tconst cacheCreateTokens = positive(row.cacheWriteTokens);\n\tif (inputTokens === 0 && outputTokens === 0 && cacheReadTokens === 0 && cacheCreateTokens === 0) {\n\t\treturn undefined;\n\t}\n\n\tconst startedAt = new Date(startedAtMs);\n\treturn {\n\t\tharness: \"hermes\",\n\t\tmodel: model,\n\t\thourUtc: startOfUtcHour(startedAt),\n\t\tinputTokens: inputTokens,\n\t\toutputTokens: outputTokens,\n\t\tcacheReadTokens: cacheReadTokens,\n\t\tcacheCreateTokens: cacheCreateTokens,\n\t\tsessionIds: new Set([`hermes:${sessionId}`]),\n\t\tsessionStartedAt: startedAt,\n\t\tsessionLastSeenAt: new Date(lastSeenAtMs),\n\t};\n}\n\n/**\n * Parse one Pi-style session JSONL file into per-(provider/model, hourUtc)\n * buckets. Pi and Hermes share the same session format; callers choose the\n * harness label.\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: line-by-line parser with necessary branching\nasync function* bucketizePiStyleFile(\n\tpath: string,\n\tharness: PiStyleHarness,\n\tlogger: Logger,\n): AsyncIterable<ParsedBucket> {\n\tconst buckets = new Map<string, BucketAccumulator>();\n\tlet lineNo = 0;\n\tlet sessionStartedAt: Date | undefined;\n\tlet sessionLastSeenAt: Date | undefined;\n\n\tconst stream = createReadStream(path, { encoding: \"utf8\" });\n\tconst rl = createInterface({ input: stream, crlfDelay: Number.POSITIVE_INFINITY });\n\n\ttry {\n\t\tfor await (const raw of rl) {\n\t\t\tlineNo += 1;\n\t\t\tconst trimmed = raw.trim();\n\t\t\tif (trimmed.length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet parsed: unknown;\n\t\t\ttry {\n\t\t\t\tparsed = JSON.parse(trimmed);\n\t\t\t} catch {\n\t\t\t\tlogger.warn(\"malformed jsonl line\", { path: path, line: lineNo });\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!isPiAssistantMessageEntry(parsed)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (parsed.message.stopReason === \"aborted\" || parsed.message.stopReason === \"error\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst tsMs = eventTimestampMs(parsed);\n\t\t\tif (!Number.isFinite(tsMs)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst model = modelId(parsed.message.provider, parsed.message.model);\n\t\t\tif (model === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst { usage } = parsed.message;\n\t\t\tconst inputTokens = Math.max(0, usage.input ?? 0);\n\t\t\tconst outputTokens = Math.max(0, usage.output ?? 0);\n\t\t\tconst cacheReadTokens = Math.max(0, usage.cacheRead ?? 0);\n\t\t\tconst cacheCreateTokens = Math.max(0, usage.cacheWrite ?? 0);\n\t\t\tif (inputTokens === 0 && outputTokens === 0 && cacheReadTokens === 0 && cacheCreateTokens === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst eventAt = new Date(tsMs);\n\t\t\tif (sessionStartedAt === undefined || eventAt.getTime() < sessionStartedAt.getTime()) {\n\t\t\t\tsessionStartedAt = eventAt;\n\t\t\t}\n\t\t\tif (sessionLastSeenAt === undefined || eventAt.getTime() > sessionLastSeenAt.getTime()) {\n\t\t\t\tsessionLastSeenAt = eventAt;\n\t\t\t}\n\n\t\t\tconst hourUtc = startOfUtcHour(eventAt);\n\t\t\tconst k = key(hourUtc, model);\n\t\t\tconst existing = buckets.get(k);\n\t\t\tif (existing === undefined) {\n\t\t\t\tbuckets.set(k, {\n\t\t\t\t\thourUtc: hourUtc,\n\t\t\t\t\tmodel: model,\n\t\t\t\t\tinputTokens: inputTokens,\n\t\t\t\t\toutputTokens: outputTokens,\n\t\t\t\t\tcacheReadTokens: cacheReadTokens,\n\t\t\t\t\tcacheCreateTokens: cacheCreateTokens,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\texisting.inputTokens += inputTokens;\n\t\t\t\texisting.outputTokens += outputTokens;\n\t\t\t\texisting.cacheReadTokens += cacheReadTokens;\n\t\t\t\texisting.cacheCreateTokens += cacheCreateTokens;\n\t\t\t}\n\t\t}\n\t} finally {\n\t\trl.close();\n\t\tstream.destroy();\n\t}\n\n\tif (sessionStartedAt === undefined || sessionLastSeenAt === undefined) {\n\t\treturn;\n\t}\n\n\tconst sessionIds: ReadonlySet<string> = new Set([path]);\n\tfor (const acc of buckets.values()) {\n\t\tyield {\n\t\t\tharness: harness,\n\t\t\tmodel: acc.model,\n\t\t\thourUtc: acc.hourUtc,\n\t\t\tinputTokens: acc.inputTokens,\n\t\t\toutputTokens: acc.outputTokens,\n\t\t\tcacheReadTokens: acc.cacheReadTokens,\n\t\t\tcacheCreateTokens: acc.cacheCreateTokens,\n\t\t\tsessionIds: sessionIds,\n\t\t\tsessionStartedAt: sessionStartedAt,\n\t\t\tsessionLastSeenAt: sessionLastSeenAt,\n\t\t};\n\t}\n}\n\nasync function* bucketizeHermesDatabase(path: string, cutoff: Date, logger: Logger): AsyncIterable<ParsedBucket> {\n\tconst DatabaseSync = await loadDatabaseSync();\n\tlet db: DatabaseSync | undefined;\n\ttry {\n\t\tdb = new DatabaseSync(path, { readOnly: true, timeout: 1000 });\n\t\tfor (const row of readHermesSessionRows(db, cutoff)) {\n\t\t\tconst bucket = hermesRowToBucket(row);\n\t\t\tif (bucket !== undefined) {\n\t\t\t\tyield bucket;\n\t\t\t}\n\t\t}\n\t} catch {\n\t\tlogger.warn(\"failed to parse hermes sqlite database\", { path: path });\n\t} finally {\n\t\tdb?.close();\n\t}\n}\n\nexport type { PiStyleHarness };\nexport { bucketizeHermesDatabase, bucketizePiStyleFile };\n","/**\n * Subset of Pi/Hermes session entries the parser consumes.\n *\n * We intentionally ignore session headers, message content, tool details, cwd,\n * and extension data. Only assistant message metadata and numeric usage counts\n * are read.\n */\n\ntype PiAssistantMessageEntry = {\n\treadonly type: \"message\";\n\treadonly timestamp: string;\n\treadonly message: {\n\t\treadonly role: \"assistant\";\n\t\treadonly provider: string;\n\t\treadonly model: string;\n\t\treadonly usage: PiUsage;\n\t\treadonly stopReason?: string;\n\t\treadonly timestamp?: number;\n\t};\n};\n\ntype PiUsage = {\n\treadonly input?: number;\n\treadonly output?: number;\n\treadonly cacheRead?: number;\n\treadonly cacheWrite?: number;\n};\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction isPiUsage(value: unknown): value is PiUsage {\n\tif (!isObject(value)) {\n\t\treturn false;\n\t}\n\tconst keys = [\"input\", \"output\", \"cacheRead\", \"cacheWrite\"] as const;\n\tfor (const k of keys) {\n\t\tconst v = value[k];\n\t\tif (v !== undefined && !isFiniteNumber(v)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\nfunction isPiAssistantMessageEntry(value: unknown): value is PiAssistantMessageEntry {\n\tif (!isObject(value)) {\n\t\treturn false;\n\t}\n\tif (value[\"type\"] !== \"message\") {\n\t\treturn false;\n\t}\n\tif (typeof value[\"timestamp\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tconst message = value[\"message\"];\n\tif (!isObject(message)) {\n\t\treturn false;\n\t}\n\tif (message[\"role\"] !== \"assistant\") {\n\t\treturn false;\n\t}\n\tif (typeof message[\"provider\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tif (typeof message[\"model\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tif (message[\"stopReason\"] !== undefined && typeof message[\"stopReason\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tif (message[\"timestamp\"] !== undefined && !isFiniteNumber(message[\"timestamp\"])) {\n\t\treturn false;\n\t}\n\tif (!isPiUsage(message[\"usage\"])) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nexport type { PiAssistantMessageEntry, PiUsage };\nexport { isPiAssistantMessageEntry };\n","import { createHmac } from \"node:crypto\";\nimport type { BucketInput, SessionInput } from \"@oopst/api\";\nimport type { ParsedBucket } from \"@oopst/parsers\";\n\ntype AggregateOptions = {\n\tbatchSize: number;\n\tsessionKeySalt: string;\n};\n\ntype Accumulator = {\n\tharness: BucketInput[\"harness\"];\n\tmodel: string;\n\thourUtc: string;\n\tinputTokens: number;\n\toutputTokens: number;\n\tcacheReadTokens: number;\n\tcacheCreateTokens: number;\n\tsessionIds: Set<string>;\n};\n\ntype SessionAccumulator = {\n\tharness: SessionInput[\"harness\"];\n\tsessionKey: string;\n\tstartedAt: Date;\n\tlastSeenAt: Date;\n};\n\ntype UsageBatch = {\n\tbuckets: BucketInput[];\n\tsessions: SessionInput[];\n};\n\nfunction toIso(hourUtc: Date | string): string {\n\treturn hourUtc instanceof Date ? hourUtc.toISOString() : hourUtc;\n}\n\nfunction key(b: { harness: string; model: string; hourUtc: Date | string }): string {\n\treturn `${b.harness} ${b.model} ${toIso(b.hourUtc)}`;\n}\n\nfunction finalize(acc: Accumulator): BucketInput {\n\treturn {\n\t\tharness: acc.harness,\n\t\tmodel: acc.model,\n\t\thourUtc: acc.hourUtc,\n\t\tinputTokens: acc.inputTokens,\n\t\toutputTokens: acc.outputTokens,\n\t\tcacheReadTokens: acc.cacheReadTokens,\n\t\tcacheCreateTokens: acc.cacheCreateTokens,\n\t\tsessionCount: acc.sessionIds.size,\n\t};\n}\n\nconst SESSION_KEY_SALT_PATTERN = /^[a-f0-9]{64}$/u;\n\nfunction createSessionKey(harness: string, localSessionId: string, sessionKeySalt: string): string {\n\tif (!SESSION_KEY_SALT_PATTERN.test(sessionKeySalt)) {\n\t\tthrow new Error(\"invalid session key salt\");\n\t}\n\n\treturn createHmac(\"sha256\", Buffer.from(sessionKeySalt, \"hex\"))\n\t\t.update(\"oopst/session-key/v1\")\n\t\t.update(\"\\0\")\n\t\t.update(harness)\n\t\t.update(\"\\0\")\n\t\t.update(localSessionId)\n\t\t.digest(\"hex\");\n}\n\nfunction sessionMapKey(harness: string, sessionKey: string): string {\n\treturn `${harness} ${sessionKey}`;\n}\n\nfunction finalizeSession(acc: SessionAccumulator): SessionInput {\n\treturn {\n\t\tharness: acc.harness,\n\t\tsessionKey: acc.sessionKey,\n\t\tstartedAt: acc.startedAt.toISOString(),\n\t\tlastSeenAt: acc.lastSeenAt.toISOString(),\n\t};\n}\n\nfunction addSessionAccumulator(\n\tsessionAccumulators: Map<string, SessionAccumulator>,\n\tbucket: ParsedBucket,\n\tlocalSessionId: string,\n\tsessionKeySalt: string,\n): void {\n\tconst sessionKey = createSessionKey(bucket.harness, localSessionId, sessionKeySalt);\n\tconst sessionAccumulatorKey = sessionMapKey(bucket.harness, sessionKey);\n\tconst existingSession = sessionAccumulators.get(sessionAccumulatorKey);\n\tif (existingSession) {\n\t\tif (bucket.sessionStartedAt.getTime() < existingSession.startedAt.getTime()) {\n\t\t\texistingSession.startedAt = bucket.sessionStartedAt;\n\t\t}\n\t\tif (bucket.sessionLastSeenAt.getTime() > existingSession.lastSeenAt.getTime()) {\n\t\t\texistingSession.lastSeenAt = bucket.sessionLastSeenAt;\n\t\t}\n\t\treturn;\n\t}\n\n\tsessionAccumulators.set(sessionAccumulatorKey, {\n\t\tharness: bucket.harness,\n\t\tsessionKey: sessionKey,\n\t\tstartedAt: bucket.sessionStartedAt,\n\t\tlastSeenAt: bucket.sessionLastSeenAt,\n\t});\n}\n\n/**\n * Group an async iterable of parser-emitted buckets by (harness, model, hourUtc),\n * summing token columns and counting distinct sessionIds → sessionCount.\n * Yields batches of at most `batchSize` finalized buckets.\n */\nasync function* aggregate(\n\tsource: AsyncIterable<ParsedBucket>,\n\toptions: AggregateOptions,\n): AsyncIterable<BucketInput[]> {\n\tfor await (const batch of aggregateUsage(source, options)) {\n\t\tif (batch.buckets.length > 0) {\n\t\t\tyield batch.buckets;\n\t\t}\n\t}\n}\n\n/**\n * Group parser output into uploadable hourly buckets and exact session facts.\n * Session facts use privacy-safe deterministic HMAC keys derived on-device\n * from local-only parser session ids plus the server-owned per-device salt.\n */\nasync function* aggregateUsage(\n\tsource: AsyncIterable<ParsedBucket>,\n\toptions: AggregateOptions,\n): AsyncIterable<UsageBatch> {\n\tconst accumulators = new Map<string, Accumulator>();\n\tconst sessionAccumulators = new Map<string, SessionAccumulator>();\n\n\tfor await (const bucket of source) {\n\t\tconst k = key(bucket);\n\t\tlet acc = accumulators.get(k);\n\t\tif (!acc) {\n\t\t\tacc = {\n\t\t\t\tharness: bucket.harness,\n\t\t\t\tmodel: bucket.model,\n\t\t\t\thourUtc: toIso(bucket.hourUtc),\n\t\t\t\tinputTokens: 0,\n\t\t\t\toutputTokens: 0,\n\t\t\t\tcacheReadTokens: 0,\n\t\t\t\tcacheCreateTokens: 0,\n\t\t\t\tsessionIds: new Set(),\n\t\t\t};\n\t\t\taccumulators.set(k, acc);\n\t\t}\n\t\tacc.inputTokens += bucket.inputTokens;\n\t\tacc.outputTokens += bucket.outputTokens;\n\t\tacc.cacheReadTokens += bucket.cacheReadTokens;\n\t\tacc.cacheCreateTokens += bucket.cacheCreateTokens;\n\t\tfor (const id of bucket.sessionIds) {\n\t\t\tacc.sessionIds.add(id);\n\t\t\taddSessionAccumulator(sessionAccumulators, bucket, id, options.sessionKeySalt);\n\t\t}\n\t}\n\n\tconst finalized: BucketInput[] = [];\n\tfor (const acc of accumulators.values()) {\n\t\tfinalized.push(finalize(acc));\n\t}\n\n\tconst finalizedSessions: SessionInput[] = [];\n\tfor (const acc of sessionAccumulators.values()) {\n\t\tfinalizedSessions.push(finalizeSession(acc));\n\t}\n\n\tconst maxLength = Math.max(finalized.length, finalizedSessions.length);\n\tfor (let i = 0; i < maxLength; i += options.batchSize) {\n\t\tyield {\n\t\t\tbuckets: finalized.slice(i, i + options.batchSize),\n\t\t\tsessions: finalizedSessions.slice(i, i + options.batchSize),\n\t\t};\n\t}\n}\n\nexport type { AggregateOptions, UsageBatch };\nexport { aggregate, aggregateUsage, createSessionKey };\n","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nmodule.exports = toPrimitive, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nvar toPrimitive = require(\"./toPrimitive.js\");\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nmodule.exports = toPropertyKey, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var toPropertyKey = require(\"./toPropertyKey.js\");\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nmodule.exports = _defineProperty, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var defineProperty = require(\"./defineProperty.js\");\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nfunction _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}\nmodule.exports = _objectSpread2, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","import type { Result } from '../unstable-core-do-not-import';\nimport type {\n Observable,\n Observer,\n OperatorFunction,\n TeardownLogic,\n UnaryFunction,\n Unsubscribable,\n} from './types';\n\n/** @public */\nexport type inferObservableValue<TObservable> =\n TObservable extends Observable<infer TValue, unknown> ? TValue : never;\n\n/** @public */\nexport function isObservable(x: unknown): x is Observable<unknown, unknown> {\n return typeof x === 'object' && x !== null && 'subscribe' in x;\n}\n\n/** @public */\nexport function observable<TValue, TError = unknown>(\n subscribe: (observer: Observer<TValue, TError>) => TeardownLogic,\n): Observable<TValue, TError> {\n const self: Observable<TValue, TError> = {\n subscribe(observer) {\n let teardownRef: TeardownLogic | null = null;\n let isDone = false;\n let unsubscribed = false;\n let teardownImmediately = false;\n function unsubscribe() {\n if (teardownRef === null) {\n teardownImmediately = true;\n return;\n }\n if (unsubscribed) {\n return;\n }\n unsubscribed = true;\n\n if (typeof teardownRef === 'function') {\n teardownRef();\n } else if (teardownRef) {\n teardownRef.unsubscribe();\n }\n }\n teardownRef = subscribe({\n next(value) {\n if (isDone) {\n return;\n }\n observer.next?.(value);\n },\n error(err) {\n if (isDone) {\n return;\n }\n isDone = true;\n observer.error?.(err);\n unsubscribe();\n },\n complete() {\n if (isDone) {\n return;\n }\n isDone = true;\n observer.complete?.();\n unsubscribe();\n },\n });\n if (teardownImmediately) {\n unsubscribe();\n }\n return {\n unsubscribe,\n };\n },\n pipe(\n ...operations: OperatorFunction<any, any, any, any>[]\n ): Observable<any, any> {\n return operations.reduce(pipeReducer, self);\n },\n };\n return self;\n}\n\nfunction pipeReducer(prev: any, fn: UnaryFunction<any, any>) {\n return fn(prev);\n}\n\n/** @internal */\nexport function observableToPromise<TValue>(\n observable: Observable<TValue, unknown>,\n) {\n const ac = new AbortController();\n const promise = new Promise<TValue>((resolve, reject) => {\n let isDone = false;\n function onDone() {\n if (isDone) {\n return;\n }\n isDone = true;\n obs$.unsubscribe();\n }\n ac.signal.addEventListener('abort', () => {\n reject(ac.signal.reason);\n });\n const obs$ = observable.subscribe({\n next(data) {\n isDone = true;\n resolve(data);\n onDone();\n },\n error(data) {\n reject(data);\n },\n complete() {\n ac.abort();\n onDone();\n },\n });\n });\n return promise;\n}\n\n/**\n * @internal\n */\nfunction observableToReadableStream<TValue>(\n observable: Observable<TValue, unknown>,\n signal: AbortSignal,\n): ReadableStream<Result<TValue>> {\n let unsub: Unsubscribable | null = null;\n\n const onAbort = () => {\n unsub?.unsubscribe();\n unsub = null;\n signal.removeEventListener('abort', onAbort);\n };\n\n return new ReadableStream<Result<TValue>>({\n start(controller) {\n unsub = observable.subscribe({\n next(data) {\n controller.enqueue({ ok: true, value: data });\n },\n error(error) {\n controller.enqueue({ ok: false, error });\n controller.close();\n },\n complete() {\n controller.close();\n },\n });\n\n if (signal.aborted) {\n onAbort();\n } else {\n signal.addEventListener('abort', onAbort, { once: true });\n }\n },\n cancel() {\n onAbort();\n },\n });\n}\n\n/** @internal */\nexport function observableToAsyncIterable<TValue>(\n observable: Observable<TValue, unknown>,\n signal: AbortSignal,\n): AsyncIterable<TValue> {\n const stream = observableToReadableStream(observable, signal);\n\n const reader = stream.getReader();\n const iterator: AsyncIterator<TValue> = {\n async next() {\n const value = await reader.read();\n if (value.done) {\n return {\n value: undefined,\n done: true,\n };\n }\n const { value: result } = value;\n if (!result.ok) {\n throw result.error;\n }\n return {\n value: result.value,\n done: false,\n };\n },\n async return() {\n await reader.cancel();\n return {\n value: undefined,\n done: true,\n };\n },\n };\n return {\n [Symbol.asyncIterator]() {\n return iterator;\n },\n };\n}\n","import { observable } from './observable';\nimport type {\n MonoTypeOperatorFunction,\n Observer,\n OperatorFunction,\n Unsubscribable,\n} from './types';\n\nexport function map<TValueBefore, TError, TValueAfter>(\n project: (value: TValueBefore, index: number) => TValueAfter,\n): OperatorFunction<TValueBefore, TError, TValueAfter, TError> {\n return (source) => {\n return observable((destination) => {\n let index = 0;\n const subscription = source.subscribe({\n next(value) {\n destination.next(project(value, index++));\n },\n error(error) {\n destination.error(error);\n },\n complete() {\n destination.complete();\n },\n });\n return subscription;\n });\n };\n}\n\ninterface ShareConfig {}\nexport function share<TValue, TError>(\n _opts?: ShareConfig,\n): MonoTypeOperatorFunction<TValue, TError> {\n return (source) => {\n let refCount = 0;\n\n let subscription: Unsubscribable | null = null;\n const observers: Partial<Observer<TValue, TError>>[] = [];\n\n function startIfNeeded() {\n if (subscription) {\n return;\n }\n subscription = source.subscribe({\n next(value) {\n for (const observer of observers) {\n observer.next?.(value);\n }\n },\n error(error) {\n for (const observer of observers) {\n observer.error?.(error);\n }\n },\n complete() {\n for (const observer of observers) {\n observer.complete?.();\n }\n },\n });\n }\n function resetIfNeeded() {\n // \"resetOnRefCountZero\"\n if (refCount === 0 && subscription) {\n const _sub = subscription;\n subscription = null;\n _sub.unsubscribe();\n }\n }\n\n return observable((subscriber) => {\n refCount++;\n\n observers.push(subscriber);\n startIfNeeded();\n return {\n unsubscribe() {\n refCount--;\n resetIfNeeded();\n\n const index = observers.findIndex((v) => v === subscriber);\n\n if (index > -1) {\n observers.splice(index, 1);\n }\n },\n };\n });\n };\n}\n\nexport function tap<TValue, TError>(\n observer: Partial<Observer<TValue, TError>>,\n): MonoTypeOperatorFunction<TValue, TError> {\n return (source) => {\n return observable((destination) => {\n return source.subscribe({\n next(value) {\n observer.next?.(value);\n destination.next(value);\n },\n error(error) {\n observer.error?.(error);\n destination.error(error);\n },\n complete() {\n observer.complete?.();\n destination.complete();\n },\n });\n });\n };\n}\n\nconst distinctUnsetMarker = Symbol();\nexport function distinctUntilChanged<TValue, TError>(\n compare: (a: TValue, b: TValue) => boolean = (a, b) => a === b,\n): MonoTypeOperatorFunction<TValue, TError> {\n return (source) => {\n return observable((destination) => {\n let lastValue: TValue | typeof distinctUnsetMarker = distinctUnsetMarker;\n\n return source.subscribe({\n next(value) {\n if (lastValue !== distinctUnsetMarker && compare(lastValue, value)) {\n return;\n }\n lastValue = value;\n destination.next(value);\n },\n error(error) {\n destination.error(error);\n },\n complete() {\n destination.complete();\n },\n });\n });\n };\n}\n\nconst isDeepEqual = <T>(a: T, b: T): boolean => {\n if (a === b) {\n return true;\n }\n const bothAreObjects =\n a && b && typeof a === 'object' && typeof b === 'object';\n\n return (\n !!bothAreObjects &&\n Object.keys(a).length === Object.keys(b).length &&\n Object.entries(a).every(([k, v]) => isDeepEqual(v, b[k as keyof T]))\n );\n};\nexport function distinctUntilDeepChanged<\n TValue,\n TError,\n>(): MonoTypeOperatorFunction<TValue, TError> {\n return distinctUntilChanged(isDeepEqual);\n}\n","import { observable } from './observable';\nimport type { Observable, Observer } from './types';\n\nexport interface BehaviorSubject<TValue> extends Observable<TValue, never> {\n observable: Observable<TValue, never>;\n next: (value: TValue) => void;\n get: () => TValue;\n}\n\nexport interface ReadonlyBehaviorSubject<TValue>\n extends Omit<BehaviorSubject<TValue>, 'next'> {}\n\n/**\n * @internal\n * An observable that maintains and provides a \"current value\" to subscribers\n * @see https://www.learnrxjs.io/learn-rxjs/subjects/behaviorsubject\n */\nexport function behaviorSubject<TValue>(\n initialValue: TValue,\n): BehaviorSubject<TValue> {\n let value: TValue = initialValue;\n\n const observerList: Observer<TValue, never>[] = [];\n\n const addObserver = (observer: Observer<TValue, never>) => {\n if (value !== undefined) {\n observer.next(value);\n }\n observerList.push(observer);\n };\n const removeObserver = (observer: Observer<TValue, never>) => {\n observerList.splice(observerList.indexOf(observer), 1);\n };\n\n const obs = observable<TValue, never>((observer) => {\n addObserver(observer);\n return () => {\n removeObserver(observer);\n };\n }) as BehaviorSubject<TValue>;\n\n obs.next = (nextValue: TValue) => {\n if (value === nextValue) {\n return;\n }\n value = nextValue;\n for (const observer of observerList) {\n observer.next(nextValue);\n }\n };\n\n obs.get = () => value;\n\n return obs;\n}\n","import { observable } from '@trpc/server/observable';\nimport type { AnyRouter } from '@trpc/server/unstable-core-do-not-import';\nimport type {\n Operation,\n OperationLink,\n OperationResultObservable,\n} from '../types';\n\n/** @internal */\nexport function createChain<\n TRouter extends AnyRouter,\n TInput = unknown,\n TOutput = unknown,\n>(opts: {\n links: OperationLink<TRouter, TInput, TOutput>[];\n op: Operation<TInput>;\n}): OperationResultObservable<TRouter, TOutput> {\n return observable((observer) => {\n function execute(index = 0, op = opts.op) {\n const next = opts.links[index];\n if (!next) {\n throw new Error(\n 'No more links to execute - did you forget to add an ending link?',\n );\n }\n const subscription = next({\n op,\n next(nextOp) {\n const nextObserver = execute(index + 1, nextOp);\n\n return nextObserver;\n },\n });\n return subscription;\n }\n\n const obs$ = execute();\n return obs$.subscribe(observer);\n });\n}\n","import { observable } from '@trpc/server/observable';\nimport type { AnyRouter } from '@trpc/server/unstable-core-do-not-import';\nimport { createChain } from './internals/createChain';\nimport type { Operation, TRPCLink } from './types';\n\nfunction asArray<TType>(value: TType | TType[]) {\n return Array.isArray(value) ? value : [value];\n}\nexport function splitLink<TRouter extends AnyRouter = AnyRouter>(opts: {\n condition: (op: Operation) => boolean;\n /**\n * The link to execute next if the test function returns `true`.\n */\n true: TRPCLink<TRouter> | TRPCLink<TRouter>[];\n /**\n * The link to execute next if the test function returns `false`.\n */\n false: TRPCLink<TRouter> | TRPCLink<TRouter>[];\n}): TRPCLink<TRouter> {\n return (runtime) => {\n const yes = asArray(opts.true).map((link) => link(runtime));\n const no = asArray(opts.false).map((link) => link(runtime));\n return (props) => {\n return observable((observer) => {\n const links = opts.condition(props.op) ? yes : no;\n return createChain({ op: props.op, links }).subscribe(observer);\n });\n };\n };\n}\n","/** @internal */\nexport type UnsetMarker = 'unsetMarker' & {\n __brand: 'unsetMarker';\n};\n\n/**\n * Ensures there are no duplicate keys when building a procedure.\n * @internal\n */\nexport function mergeWithoutOverrides<TType extends Record<string, unknown>>(\n obj1: TType,\n ...objs: Partial<TType>[]\n): TType {\n const newObj: TType = Object.assign(emptyObject(), obj1);\n\n for (const overrides of objs) {\n for (const key in overrides) {\n if (key in newObj && newObj[key] !== overrides[key]) {\n throw new Error(`Duplicate key ${key}`);\n }\n newObj[key as keyof TType] = overrides[key] as TType[keyof TType];\n }\n }\n return newObj;\n}\n\n/**\n * Check that value is object\n * @internal\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return !!value && !Array.isArray(value) && typeof value === 'object';\n}\n\ntype AnyFn = ((...args: any[]) => unknown) & Record<keyof any, unknown>;\nexport function isFunction(fn: unknown): fn is AnyFn {\n return typeof fn === 'function';\n}\n\n/**\n * Create an object without inheriting anything from `Object.prototype`\n * @internal\n */\nexport function emptyObject<TObj extends Record<string, unknown>>(): TObj {\n return Object.create(null);\n}\n\nconst asyncIteratorsSupported =\n typeof Symbol === 'function' && !!Symbol.asyncIterator;\n\nexport function isAsyncIterable<TValue>(\n value: unknown,\n): value is AsyncIterable<TValue> {\n return (\n asyncIteratorsSupported && isObject(value) && Symbol.asyncIterator in value\n );\n}\n\n/**\n * Run an IIFE\n */\nexport const run = <TValue>(fn: () => TValue): TValue => fn();\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport function noop(): void {}\n\nexport function identity<T>(it: T): T {\n return it;\n}\n\n/**\n * Generic runtime assertion function. Throws, if the condition is not `true`.\n *\n * Can be used as a slightly less dangerous variant of type assertions. Code\n * mistakes would be revealed at runtime then (hopefully during testing).\n */\nexport function assert(\n condition: boolean,\n msg = 'no additional info',\n): asserts condition {\n if (!condition) {\n throw new Error(`AssertionError: ${msg}`);\n }\n}\n\nexport function sleep(ms = 0): Promise<void> {\n return new Promise<void>((res) => setTimeout(res, ms));\n}\n\n/**\n * Ponyfill for\n * [`AbortSignal.any`](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/any_static).\n */\nexport function abortSignalsAnyPonyfill(signals: AbortSignal[]): AbortSignal {\n if (typeof AbortSignal.any === 'function') {\n return AbortSignal.any(signals);\n }\n\n const ac = new AbortController();\n\n for (const signal of signals) {\n if (signal.aborted) {\n trigger();\n break;\n }\n signal.addEventListener('abort', trigger, { once: true });\n }\n\n return ac.signal;\n\n function trigger() {\n ac.abort();\n for (const signal of signals) {\n signal.removeEventListener('abort', trigger);\n }\n }\n}\n","import type { InvertKeyValue, ValueOf } from '../types';\n\n// reference: https://www.jsonrpc.org/specification\n\n/**\n * JSON-RPC 2.0 Error codes\n *\n * `-32000` to `-32099` are reserved for implementation-defined server-errors.\n * For tRPC we're copying the last digits of HTTP 4XX errors.\n */\nexport const TRPC_ERROR_CODES_BY_KEY = {\n /**\n * Invalid JSON was received by the server.\n * An error occurred on the server while parsing the JSON text.\n */\n PARSE_ERROR: -32700,\n /**\n * The JSON sent is not a valid Request object.\n */\n BAD_REQUEST: -32600, // 400\n\n // Internal JSON-RPC error\n INTERNAL_SERVER_ERROR: -32603, // 500\n NOT_IMPLEMENTED: -32603, // 501\n BAD_GATEWAY: -32603, // 502\n SERVICE_UNAVAILABLE: -32603, // 503\n GATEWAY_TIMEOUT: -32603, // 504\n\n // Implementation specific errors\n UNAUTHORIZED: -32001, // 401\n PAYMENT_REQUIRED: -32002, // 402\n FORBIDDEN: -32003, // 403\n NOT_FOUND: -32004, // 404\n METHOD_NOT_SUPPORTED: -32005, // 405\n TIMEOUT: -32008, // 408\n CONFLICT: -32009, // 409\n PRECONDITION_FAILED: -32012, // 412\n PAYLOAD_TOO_LARGE: -32013, // 413\n UNSUPPORTED_MEDIA_TYPE: -32015, // 415\n UNPROCESSABLE_CONTENT: -32022, // 422\n PRECONDITION_REQUIRED: -32028, // 428\n TOO_MANY_REQUESTS: -32029, // 429\n CLIENT_CLOSED_REQUEST: -32099, // 499\n} as const;\n\n// pure\nexport const TRPC_ERROR_CODES_BY_NUMBER: InvertKeyValue<\n typeof TRPC_ERROR_CODES_BY_KEY\n> = {\n [-32700]: 'PARSE_ERROR',\n [-32600]: 'BAD_REQUEST',\n [-32603]: 'INTERNAL_SERVER_ERROR',\n [-32001]: 'UNAUTHORIZED',\n [-32002]: 'PAYMENT_REQUIRED',\n [-32003]: 'FORBIDDEN',\n [-32004]: 'NOT_FOUND',\n [-32005]: 'METHOD_NOT_SUPPORTED',\n [-32008]: 'TIMEOUT',\n [-32009]: 'CONFLICT',\n [-32012]: 'PRECONDITION_FAILED',\n [-32013]: 'PAYLOAD_TOO_LARGE',\n [-32015]: 'UNSUPPORTED_MEDIA_TYPE',\n [-32022]: 'UNPROCESSABLE_CONTENT',\n [-32028]: 'PRECONDITION_REQUIRED',\n [-32029]: 'TOO_MANY_REQUESTS',\n [-32099]: 'CLIENT_CLOSED_REQUEST',\n};\n\nexport type TRPC_ERROR_CODE_NUMBER = ValueOf<typeof TRPC_ERROR_CODES_BY_KEY>;\nexport type TRPC_ERROR_CODE_KEY = keyof typeof TRPC_ERROR_CODES_BY_KEY;\n\n/**\n * tRPC error codes that are considered retryable\n * With out of the box SSE, the client will reconnect when these errors are encountered\n */\nexport const retryableRpcCodes: TRPC_ERROR_CODE_NUMBER[] = [\n TRPC_ERROR_CODES_BY_KEY.BAD_GATEWAY,\n TRPC_ERROR_CODES_BY_KEY.SERVICE_UNAVAILABLE,\n TRPC_ERROR_CODES_BY_KEY.GATEWAY_TIMEOUT,\n TRPC_ERROR_CODES_BY_KEY.INTERNAL_SERVER_ERROR,\n];\n","import { emptyObject } from './utils';\n\ninterface ProxyCallbackOptions {\n path: readonly string[];\n args: readonly unknown[];\n}\ntype ProxyCallback = (opts: ProxyCallbackOptions) => unknown;\n\nconst noop = () => {\n // noop\n};\n\nconst freezeIfAvailable = (obj: object) => {\n if (Object.freeze) {\n Object.freeze(obj);\n }\n};\n\nfunction createInnerProxy(\n callback: ProxyCallback,\n path: readonly string[],\n memo: Record<string, unknown>,\n) {\n const cacheKey = path.join('.');\n\n memo[cacheKey] ??= new Proxy(noop, {\n get(_obj, key) {\n if (typeof key !== 'string' || key === 'then') {\n // special case for if the proxy is accidentally treated\n // like a PromiseLike (like in `Promise.resolve(proxy)`)\n return undefined;\n }\n return createInnerProxy(callback, [...path, key], memo);\n },\n apply(_1, _2, args) {\n const lastOfPath = path[path.length - 1];\n\n // React 19 may call valueOf / toString / toJSON when coercing a proxy\n // to a primitive (e.g. during rendering or logging). Return a debug\n // string so the coercion does not recurse into the proxy. This only\n // triggers for direct calls (proxy.toString()), not for chained access\n // (proxy.toString.query()), preserving route naming freedom.\n if (\n lastOfPath === 'valueOf' ||\n lastOfPath === 'toString' ||\n lastOfPath === 'toJSON'\n ) {\n const debugPath = path.slice(0, -1).join('.');\n return `tRPC.proxy(${debugPath})`;\n }\n\n let opts = { args, path };\n // special handling for e.g. `trpc.hello.call(this, 'there')` and `trpc.hello.apply(this, ['there'])\n if (lastOfPath === 'call') {\n opts = {\n args: args.length >= 2 ? [args[1]] : [],\n path: path.slice(0, -1),\n };\n } else if (lastOfPath === 'apply') {\n opts = {\n args: args.length >= 2 ? args[1] : [],\n path: path.slice(0, -1),\n };\n }\n freezeIfAvailable(opts.args);\n freezeIfAvailable(opts.path);\n return callback(opts);\n },\n });\n\n return memo[cacheKey];\n}\n\n/**\n * Creates a proxy that calls the callback with the path and arguments\n *\n * @internal\n */\nexport const createRecursiveProxy = <TFaux = unknown>(\n callback: ProxyCallback,\n): TFaux => createInnerProxy(callback, [], emptyObject()) as TFaux;\n\n/**\n * Used in place of `new Proxy` where each handler will map 1 level deep to another value.\n *\n * @internal\n */\nexport const createFlatProxy = <TFaux>(\n callback: (path: keyof TFaux) => any,\n): TFaux => {\n return new Proxy(noop, {\n get(_obj, name) {\n if (name === 'then') {\n // special case for if the proxy is accidentally treated\n // like a PromiseLike (like in `Promise.resolve(proxy)`)\n return undefined;\n }\n return callback(name as any);\n },\n }) as TFaux;\n};\n","import type { TRPCError } from '../error/TRPCError';\nimport type { TRPC_ERROR_CODES_BY_KEY, TRPCResponse } from '../rpc';\nimport { TRPC_ERROR_CODES_BY_NUMBER } from '../rpc';\nimport type { InvertKeyValue, ValueOf } from '../types';\nimport { isObject } from '../utils';\n\nexport const JSONRPC2_TO_HTTP_CODE: Record<\n keyof typeof TRPC_ERROR_CODES_BY_KEY,\n number\n> = {\n PARSE_ERROR: 400,\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n PAYMENT_REQUIRED: 402,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n METHOD_NOT_SUPPORTED: 405,\n TIMEOUT: 408,\n CONFLICT: 409,\n PRECONDITION_FAILED: 412,\n PAYLOAD_TOO_LARGE: 413,\n UNSUPPORTED_MEDIA_TYPE: 415,\n UNPROCESSABLE_CONTENT: 422,\n PRECONDITION_REQUIRED: 428,\n TOO_MANY_REQUESTS: 429,\n CLIENT_CLOSED_REQUEST: 499,\n INTERNAL_SERVER_ERROR: 500,\n NOT_IMPLEMENTED: 501,\n BAD_GATEWAY: 502,\n SERVICE_UNAVAILABLE: 503,\n GATEWAY_TIMEOUT: 504,\n};\n\nexport const HTTP_CODE_TO_JSONRPC2: InvertKeyValue<\n typeof JSONRPC2_TO_HTTP_CODE\n> = {\n 400: 'BAD_REQUEST',\n 401: 'UNAUTHORIZED',\n 402: 'PAYMENT_REQUIRED',\n 403: 'FORBIDDEN',\n 404: 'NOT_FOUND',\n 405: 'METHOD_NOT_SUPPORTED',\n 408: 'TIMEOUT',\n 409: 'CONFLICT',\n 412: 'PRECONDITION_FAILED',\n 413: 'PAYLOAD_TOO_LARGE',\n 415: 'UNSUPPORTED_MEDIA_TYPE',\n 422: 'UNPROCESSABLE_CONTENT',\n 428: 'PRECONDITION_REQUIRED',\n 429: 'TOO_MANY_REQUESTS',\n 499: 'CLIENT_CLOSED_REQUEST',\n 500: 'INTERNAL_SERVER_ERROR',\n 501: 'NOT_IMPLEMENTED',\n 502: 'BAD_GATEWAY',\n 503: 'SERVICE_UNAVAILABLE',\n 504: 'GATEWAY_TIMEOUT',\n} as const;\n\nexport function getStatusCodeFromKey(\n code: keyof typeof TRPC_ERROR_CODES_BY_KEY,\n) {\n return JSONRPC2_TO_HTTP_CODE[code] ?? 500;\n}\n\nexport function getStatusKeyFromCode(\n code: keyof typeof HTTP_CODE_TO_JSONRPC2,\n): ValueOf<typeof HTTP_CODE_TO_JSONRPC2> {\n return HTTP_CODE_TO_JSONRPC2[code] ?? 'INTERNAL_SERVER_ERROR';\n}\n\nexport function getHTTPStatusCode(json: TRPCResponse | TRPCResponse[]) {\n const arr = Array.isArray(json) ? json : [json];\n const httpStatuses = new Set<number>(\n arr.map((res) => {\n if ('error' in res && isObject(res.error.data)) {\n if (typeof res.error.data?.['httpStatus'] === 'number') {\n return res.error.data['httpStatus'];\n }\n const code = TRPC_ERROR_CODES_BY_NUMBER[res.error.code];\n return getStatusCodeFromKey(code);\n }\n return 200;\n }),\n );\n\n if (httpStatuses.size !== 1) {\n return 207;\n }\n\n const httpStatus = httpStatuses.values().next().value;\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return httpStatus!;\n}\n\nexport function getHTTPStatusCodeFromError(error: TRPCError) {\n return getStatusCodeFromKey(error.code);\n}\n","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nmodule.exports = toPrimitive, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nvar toPrimitive = require(\"./toPrimitive.js\");\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nmodule.exports = toPropertyKey, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var toPropertyKey = require(\"./toPropertyKey.js\");\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nmodule.exports = _defineProperty, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var defineProperty = require(\"./defineProperty.js\");\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nfunction _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}\nmodule.exports = _objectSpread2, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","import { getHTTPStatusCodeFromError } from '../http/getHTTPStatusCode';\nimport type { ProcedureType } from '../procedure';\nimport type { AnyRootTypes, RootConfig } from '../rootConfig';\nimport { TRPC_ERROR_CODES_BY_KEY } from '../rpc';\nimport type { DefaultErrorShape } from './formatter';\nimport type { TRPCError } from './TRPCError';\n\n/**\n * @internal\n */\nexport function getErrorShape<TRoot extends AnyRootTypes>(opts: {\n config: RootConfig<TRoot>;\n error: TRPCError;\n type: ProcedureType | 'unknown';\n path: string | undefined;\n input: unknown;\n ctx: TRoot['ctx'] | undefined;\n}): TRoot['errorShape'] {\n const { path, error, config } = opts;\n const { code } = opts.error;\n const shape: DefaultErrorShape = {\n message: error.message,\n code: TRPC_ERROR_CODES_BY_KEY[code],\n data: {\n code,\n httpStatus: getHTTPStatusCodeFromError(error),\n },\n };\n if (config.isDev && typeof opts.error.stack === 'string') {\n shape.data.stack = opts.error.stack;\n }\n if (typeof path === 'string') {\n shape.data.path = path;\n }\n return config.errorFormatter({ ...opts, shape });\n}\n","import type { ProcedureType } from '../procedure';\nimport type {\n TRPC_ERROR_CODE_KEY,\n TRPC_ERROR_CODE_NUMBER,\n TRPCErrorShape,\n} from '../rpc';\nimport type { TRPCError } from './TRPCError';\n\n/**\n * @internal\n */\nexport type ErrorFormatter<TContext, TShape extends TRPCErrorShape> = (opts: {\n error: TRPCError;\n type: ProcedureType | 'unknown';\n path: string | undefined;\n input: unknown;\n ctx: TContext | undefined;\n shape: DefaultErrorShape;\n}) => TShape;\n\n/**\n * @internal\n */\nexport type DefaultErrorData = {\n code: TRPC_ERROR_CODE_KEY;\n httpStatus: number;\n /**\n * Path to the procedure that threw the error\n */\n path?: string;\n /**\n * Stack trace of the error (only in development)\n */\n stack?: string;\n};\n\n/**\n * @internal\n */\nexport interface DefaultErrorShape extends TRPCErrorShape<DefaultErrorData> {\n message: string;\n code: TRPC_ERROR_CODE_NUMBER;\n}\n\nexport const defaultFormatter: ErrorFormatter<any, any> = ({ shape }) => {\n return shape;\n};\n","import type { TRPC_ERROR_CODE_KEY } from '../rpc/codes';\nimport { isObject } from '../utils';\n\nclass UnknownCauseError extends Error {\n [key: string]: unknown;\n\n constructor(cause: object) {\n super(getMessage(cause));\n Object.assign(this, cause);\n }\n}\n\nfunction getMessage(cause: object) {\n if ('message' in cause) return String(cause.message);\n\n return undefined;\n}\n\nexport function getCauseFromUnknown(cause: unknown): Error | undefined {\n if (cause instanceof Error) {\n return cause;\n }\n\n const type = typeof cause;\n if (type === 'undefined' || type === 'function' || cause === null) {\n return undefined;\n }\n\n // Primitive types just get wrapped in an error\n if (type !== 'object') {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n return new Error(String(cause));\n }\n\n // If it's an object, we'll create a synthetic error\n if (isObject(cause)) {\n return new UnknownCauseError(cause);\n }\n\n return undefined;\n}\n\nexport function getTRPCErrorFromUnknown(cause: unknown): TRPCError {\n if (cause instanceof TRPCError) {\n return cause;\n }\n if (cause instanceof Error && cause.name === 'TRPCError') {\n // https://github.com/trpc/trpc/pull/4848\n return cause as TRPCError;\n }\n\n const trpcError = new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n cause,\n });\n\n // Inherit stack from error\n if (cause instanceof Error && cause.stack) {\n trpcError.stack = cause.stack;\n }\n\n return trpcError;\n}\n\nexport class TRPCError extends Error {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore override doesn't work in all environments due to \"This member cannot have an 'override' modifier because it is not declared in the base class 'Error'\"\n public override readonly cause?: Error;\n public readonly code;\n\n constructor(opts: {\n message?: string;\n code: TRPC_ERROR_CODE_KEY;\n cause?: unknown;\n }) {\n const cause = getCauseFromUnknown(opts.cause);\n const message = opts.message ?? cause?.message ?? opts.code;\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore https://github.com/tc39/proposal-error-cause\n super(message, { cause });\n\n this.code = opts.code;\n this.name = 'TRPCError';\n this.cause ??= cause;\n }\n}\n","import type { AnyRootTypes, RootConfig } from './rootConfig';\nimport type { AnyRouter, inferRouterError } from './router';\nimport type {\n TRPCResponse,\n TRPCResponseMessage,\n TRPCResultMessage,\n} from './rpc';\nimport { isObject } from './utils';\n\n/**\n * @public\n */\nexport interface DataTransformer {\n serialize(object: any): any;\n deserialize(object: any): any;\n}\n\ninterface InputDataTransformer extends DataTransformer {\n /**\n * This function runs **on the client** before sending the data to the server.\n */\n serialize(object: any): any;\n /**\n * This function runs **on the server** to transform the data before it is passed to the resolver\n */\n deserialize(object: any): any;\n}\n\ninterface OutputDataTransformer extends DataTransformer {\n /**\n * This function runs **on the server** before sending the data to the client.\n */\n serialize(object: any): any;\n /**\n * This function runs **only on the client** to transform the data sent from the server.\n */\n deserialize(object: any): any;\n}\n\n/**\n * @public\n */\nexport interface CombinedDataTransformer {\n /**\n * Specify how the data sent from the client to the server should be transformed.\n */\n input: InputDataTransformer;\n /**\n * Specify how the data sent from the server to the client should be transformed.\n */\n output: OutputDataTransformer;\n}\n\n/**\n * @public\n */\nexport type CombinedDataTransformerClient = {\n input: Pick<CombinedDataTransformer['input'], 'serialize'>;\n output: Pick<CombinedDataTransformer['output'], 'deserialize'>;\n};\n\n/**\n * @public\n */\nexport type DataTransformerOptions = CombinedDataTransformer | DataTransformer;\n\n/**\n * @internal\n */\nexport function getDataTransformer(\n transformer: DataTransformerOptions,\n): CombinedDataTransformer {\n if ('input' in transformer) {\n return transformer;\n }\n return { input: transformer, output: transformer };\n}\n\n/**\n * @internal\n */\nexport const defaultTransformer: CombinedDataTransformer = {\n input: { serialize: (obj) => obj, deserialize: (obj) => obj },\n output: { serialize: (obj) => obj, deserialize: (obj) => obj },\n};\n\nfunction transformTRPCResponseItem<\n TResponseItem extends TRPCResponse | TRPCResponseMessage,\n>(config: RootConfig<AnyRootTypes>, item: TResponseItem): TResponseItem {\n if ('error' in item) {\n return {\n ...item,\n error: config.transformer.output.serialize(item.error),\n };\n }\n\n if ('data' in item.result) {\n return {\n ...item,\n result: {\n ...item.result,\n data: config.transformer.output.serialize(item.result.data),\n },\n };\n }\n\n return item;\n}\n\n/**\n * Takes a unserialized `TRPCResponse` and serializes it with the router's transformers\n **/\nexport function transformTRPCResponse<\n TResponse extends\n | TRPCResponse\n | TRPCResponse[]\n | TRPCResponseMessage\n | TRPCResponseMessage[],\n>(config: RootConfig<AnyRootTypes>, itemOrItems: TResponse) {\n return Array.isArray(itemOrItems)\n ? itemOrItems.map((item) => transformTRPCResponseItem(config, item))\n : transformTRPCResponseItem(config, itemOrItems);\n}\n\n// FIXME:\n// - the generics here are probably unnecessary\n// - the RPC-spec could probably be simplified to combine HTTP + WS\n/** @internal */\nfunction transformResultInner<TRouter extends AnyRouter, TOutput>(\n response:\n | TRPCResponse<TOutput, inferRouterError<TRouter>>\n | TRPCResponseMessage<TOutput, inferRouterError<TRouter>>,\n transformer: DataTransformer,\n) {\n if ('error' in response) {\n const error = transformer.deserialize(\n response.error,\n ) as inferRouterError<TRouter>;\n return {\n ok: false,\n error: {\n ...response,\n error,\n },\n } as const;\n }\n\n const result = {\n ...response.result,\n ...((!response.result.type || response.result.type === 'data') && {\n type: 'data',\n data: transformer.deserialize(response.result.data),\n }),\n } as TRPCResultMessage<TOutput>['result'];\n return { ok: true, result } as const;\n}\n\nclass TransformResultError extends Error {\n constructor() {\n super('Unable to transform response from server');\n }\n}\n\n/**\n * Transforms and validates that the result is a valid TRPCResponse\n * @internal\n */\nexport function transformResult<TRouter extends AnyRouter, TOutput>(\n response:\n | TRPCResponse<TOutput, inferRouterError<TRouter>>\n | TRPCResponseMessage<TOutput, inferRouterError<TRouter>>,\n transformer: DataTransformer,\n): ReturnType<typeof transformResultInner> {\n let result: ReturnType<typeof transformResultInner>;\n try {\n // Use the data transformers on the JSON-response\n result = transformResultInner(response, transformer);\n } catch {\n throw new TransformResultError();\n }\n\n // check that output of the transformers is a valid TRPCResponse\n if (\n !result.ok &&\n (!isObject(result.error.error) ||\n typeof result.error.error['code'] !== 'number')\n ) {\n throw new TransformResultError();\n }\n if (result.ok && !isObject(result.result)) {\n throw new TransformResultError();\n }\n return result;\n}\n","import type { Observable } from '../observable';\nimport { createRecursiveProxy } from './createProxy';\nimport { defaultFormatter } from './error/formatter';\nimport { getTRPCErrorFromUnknown, TRPCError } from './error/TRPCError';\nimport type {\n AnyProcedure,\n ErrorHandlerOptions,\n inferProcedureInput,\n inferProcedureOutput,\n LegacyObservableSubscriptionProcedure,\n} from './procedure';\nimport type { ProcedureCallOptions } from './procedureBuilder';\nimport type { AnyRootTypes, RootConfig } from './rootConfig';\nimport { defaultTransformer } from './transformer';\nimport type { MaybePromise, ValueOf } from './types';\nimport {\n emptyObject,\n isFunction,\n isObject,\n mergeWithoutOverrides,\n} from './utils';\n\nexport interface RouterRecord {\n [key: string]: AnyProcedure | RouterRecord;\n}\n\ntype DecorateProcedure<TProcedure extends AnyProcedure> = (\n input: inferProcedureInput<TProcedure>,\n) => Promise<\n TProcedure['_def']['type'] extends 'subscription'\n ? TProcedure extends LegacyObservableSubscriptionProcedure<any>\n ? Observable<inferProcedureOutput<TProcedure>, TRPCError>\n : inferProcedureOutput<TProcedure>\n : inferProcedureOutput<TProcedure>\n>;\n\n/**\n * @internal\n */\nexport type DecorateRouterRecord<TRecord extends RouterRecord> = {\n [TKey in keyof TRecord]: TRecord[TKey] extends infer $Value\n ? $Value extends AnyProcedure\n ? DecorateProcedure<$Value>\n : $Value extends RouterRecord\n ? DecorateRouterRecord<$Value>\n : never\n : never;\n};\n\n/**\n * @internal\n */\n\nexport type RouterCallerErrorHandler<TContext> = (\n opts: ErrorHandlerOptions<TContext>,\n) => void;\n\n/**\n * @internal\n */\nexport type RouterCaller<\n TRoot extends AnyRootTypes,\n TRecord extends RouterRecord,\n> = (\n /**\n * @note\n * If passing a function, we recommend it's a cached function\n * e.g. wrapped in `React.cache` to avoid unnecessary computations\n */\n ctx: TRoot['ctx'] | (() => MaybePromise<TRoot['ctx']>),\n options?: {\n onError?: RouterCallerErrorHandler<TRoot['ctx']>;\n signal?: AbortSignal;\n },\n) => DecorateRouterRecord<TRecord>;\n\n/**\n * @internal\n */\nconst lazyMarker = 'lazyMarker' as 'lazyMarker' & {\n __brand: 'lazyMarker';\n};\nexport type Lazy<TAny> = (() => Promise<TAny>) & { [lazyMarker]: true };\n\ntype LazyLoader<TAny> = {\n load: () => Promise<void>;\n ref: Lazy<TAny>;\n};\n\nfunction once<T>(fn: () => T): () => T {\n const uncalled = Symbol();\n let result: T | typeof uncalled = uncalled;\n return (): T => {\n if (result === uncalled) {\n result = fn();\n }\n return result;\n };\n}\n\n/**\n * Lazy load a router\n * @see https://trpc.io/docs/server/merging-routers#lazy-load\n */\nexport function lazy<TRouter extends AnyRouter>(\n importRouter: () => Promise<\n | TRouter\n | {\n [key: string]: TRouter;\n }\n >,\n): Lazy<NoInfer<TRouter>> {\n async function resolve(): Promise<TRouter> {\n const mod = await importRouter();\n\n // if the module is a router, return it\n if (isRouter(mod)) {\n return mod;\n }\n\n const routers = Object.values(mod);\n\n if (routers.length !== 1 || !isRouter(routers[0])) {\n throw new Error(\n \"Invalid router module - either define exactly 1 export or return the router directly.\\nExample: `lazy(() => import('./slow.js').then((m) => m.slowRouter))`\",\n );\n }\n\n return routers[0];\n }\n\n (resolve as Lazy<NoInfer<TRouter>>)[lazyMarker] = true as const;\n\n return resolve as Lazy<NoInfer<TRouter>>;\n}\n\nfunction isLazy<TAny>(input: unknown): input is Lazy<TAny> {\n return typeof input === 'function' && lazyMarker in input;\n}\n\n/**\n * @internal\n */\nexport interface RouterDef<\n TRoot extends AnyRootTypes,\n TRecord extends RouterRecord,\n> {\n _config: RootConfig<TRoot>;\n router: true;\n procedure?: never;\n procedures: TRecord;\n record: TRecord;\n lazy: Record<string, LazyLoader<AnyRouter>>;\n}\n\nexport interface Router<\n TRoot extends AnyRootTypes,\n TRecord extends RouterRecord,\n> {\n _def: RouterDef<TRoot, TRecord>;\n /**\n * @see https://trpc.io/docs/v11/server/server-side-calls\n */\n createCaller: RouterCaller<TRoot, TRecord>;\n}\n\nexport type BuiltRouter<\n TRoot extends AnyRootTypes,\n TRecord extends RouterRecord,\n> = Router<TRoot, TRecord> & TRecord;\n\nexport interface RouterBuilder<TRoot extends AnyRootTypes> {\n <TIn extends CreateRouterOptions>(\n _: TIn,\n ): BuiltRouter<TRoot, DecorateCreateRouterOptions<TIn>>;\n}\n\nexport type AnyRouter = Router<any, any>;\n\nexport type inferRouterRootTypes<TRouter extends AnyRouter> =\n TRouter['_def']['_config']['$types'];\n\nexport type inferRouterContext<TRouter extends AnyRouter> =\n inferRouterRootTypes<TRouter>['ctx'];\nexport type inferRouterError<TRouter extends AnyRouter> =\n inferRouterRootTypes<TRouter>['errorShape'];\nexport type inferRouterMeta<TRouter extends AnyRouter> =\n inferRouterRootTypes<TRouter>['meta'];\n\nfunction isRouter(value: unknown): value is AnyRouter {\n return (\n isObject(value) && isObject(value['_def']) && 'router' in value['_def']\n );\n}\n\nconst emptyRouter = {\n _ctx: null as any,\n _errorShape: null as any,\n _meta: null as any,\n queries: {},\n mutations: {},\n subscriptions: {},\n errorFormatter: defaultFormatter,\n transformer: defaultTransformer,\n};\n\n/**\n * Reserved words that can't be used as router or procedure names\n */\nconst reservedWords = [\n /**\n * Then is a reserved word because otherwise we can't return a promise that returns a Proxy\n * since JS will think that `.then` is something that exists\n */\n 'then',\n /**\n * `fn.call()` and `fn.apply()` are reserved words because otherwise we can't call a function using `.call` or `.apply`\n */\n 'call',\n 'apply',\n];\n\n/** @internal */\nexport type CreateRouterOptions = {\n [key: string]:\n | AnyProcedure\n | AnyRouter\n | CreateRouterOptions\n | Lazy<AnyRouter>;\n};\n\n/** @internal */\nexport type DecorateCreateRouterOptions<\n TRouterOptions extends CreateRouterOptions,\n> = {\n [K in keyof TRouterOptions]: TRouterOptions[K] extends infer $Value\n ? $Value extends AnyProcedure\n ? $Value\n : $Value extends Router<any, infer TRecord>\n ? TRecord\n : $Value extends Lazy<Router<any, infer TRecord>>\n ? TRecord\n : $Value extends CreateRouterOptions\n ? DecorateCreateRouterOptions<$Value>\n : never\n : never;\n};\n\n/**\n * @internal\n */\nexport function createRouterFactory<TRoot extends AnyRootTypes>(\n config: RootConfig<TRoot>,\n) {\n function createRouterInner<TInput extends CreateRouterOptions>(\n input: TInput,\n ): BuiltRouter<TRoot, DecorateCreateRouterOptions<TInput>> {\n const reservedWordsUsed = new Set(\n Object.keys(input).filter((v) => reservedWords.includes(v)),\n );\n if (reservedWordsUsed.size > 0) {\n throw new Error(\n 'Reserved words used in `router({})` call: ' +\n Array.from(reservedWordsUsed).join(', '),\n );\n }\n\n const procedures: Record<string, AnyProcedure> = emptyObject();\n const lazy: Record<string, LazyLoader<AnyRouter>> = emptyObject();\n\n function createLazyLoader(opts: {\n ref: Lazy<AnyRouter>;\n path: readonly string[];\n key: string;\n aggregate: RouterRecord;\n }): LazyLoader<AnyRouter> {\n return {\n ref: opts.ref,\n load: once(async () => {\n const router = await opts.ref();\n const lazyPath = [...opts.path, opts.key];\n const lazyKey = lazyPath.join('.');\n\n opts.aggregate[opts.key] = step(router._def.record, lazyPath);\n\n delete lazy[lazyKey];\n\n // add lazy loaders for nested routers\n for (const [nestedKey, nestedItem] of Object.entries(\n router._def.lazy,\n )) {\n const nestedRouterKey = [...lazyPath, nestedKey].join('.');\n\n // console.log('adding lazy', nestedRouterKey);\n lazy[nestedRouterKey] = createLazyLoader({\n ref: nestedItem.ref,\n path: lazyPath,\n key: nestedKey,\n aggregate: opts.aggregate[opts.key] as RouterRecord,\n });\n }\n }),\n };\n }\n\n function step(from: CreateRouterOptions, path: readonly string[] = []) {\n const aggregate: RouterRecord = emptyObject();\n for (const [key, item] of Object.entries(from ?? {})) {\n if (isLazy(item)) {\n lazy[[...path, key].join('.')] = createLazyLoader({\n path,\n ref: item,\n key,\n aggregate,\n });\n continue;\n }\n if (isRouter(item)) {\n aggregate[key] = step(item._def.record, [...path, key]);\n continue;\n }\n if (!isProcedure(item)) {\n // RouterRecord\n aggregate[key] = step(item, [...path, key]);\n continue;\n }\n\n const newPath = [...path, key].join('.');\n\n if (procedures[newPath]) {\n throw new Error(`Duplicate key: ${newPath}`);\n }\n\n procedures[newPath] = item;\n aggregate[key] = item;\n }\n\n return aggregate;\n }\n const record = step(input);\n\n const _def: AnyRouter['_def'] = {\n _config: config,\n router: true,\n procedures,\n lazy,\n ...emptyRouter,\n record,\n };\n\n const router: BuiltRouter<TRoot, {}> = {\n ...(record as {}),\n _def,\n createCaller: createCallerFactory<TRoot>()({\n _def,\n }),\n };\n return router as BuiltRouter<TRoot, DecorateCreateRouterOptions<TInput>>;\n }\n\n return createRouterInner;\n}\n\nfunction isProcedure(\n procedureOrRouter: ValueOf<CreateRouterOptions>,\n): procedureOrRouter is AnyProcedure {\n return typeof procedureOrRouter === 'function';\n}\n\n/**\n * @internal\n */\nexport async function getProcedureAtPath(\n router: Pick<Router<any, any>, '_def'>,\n path: string,\n): Promise<AnyProcedure | null> {\n const { _def } = router;\n let procedure = _def.procedures[path];\n\n while (!procedure) {\n const key = Object.keys(_def.lazy).find((key) => path.startsWith(key));\n // console.log(`found lazy: ${key ?? 'NOPE'} (fullPath: ${fullPath})`);\n\n if (!key) {\n return null;\n }\n // console.log('loading', key, '.......');\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const lazyRouter = _def.lazy[key]!;\n await lazyRouter.load();\n\n procedure = _def.procedures[path];\n }\n\n return procedure;\n}\n\n/**\n * @internal\n */\nexport async function callProcedure(\n opts: ProcedureCallOptions<unknown> & {\n router: AnyRouter;\n allowMethodOverride?: boolean;\n },\n) {\n const { type, path } = opts;\n const proc = await getProcedureAtPath(opts.router, path);\n if (\n !proc ||\n !isProcedure(proc) ||\n (proc._def.type !== type && !opts.allowMethodOverride)\n ) {\n throw new TRPCError({\n code: 'NOT_FOUND',\n message: `No \"${type}\"-procedure on path \"${path}\"`,\n });\n }\n\n /* istanbul ignore if -- @preserve */\n if (\n proc._def.type !== type &&\n opts.allowMethodOverride &&\n proc._def.type === 'subscription'\n ) {\n throw new TRPCError({\n code: 'METHOD_NOT_SUPPORTED',\n message: `Method override is not supported for subscriptions`,\n });\n }\n\n return proc(opts);\n}\n\nexport interface RouterCallerFactory<TRoot extends AnyRootTypes> {\n <TRecord extends RouterRecord>(\n router: Pick<Router<TRoot, TRecord>, '_def'>,\n ): RouterCaller<TRoot, TRecord>;\n}\n\nexport function createCallerFactory<\n TRoot extends AnyRootTypes,\n>(): RouterCallerFactory<TRoot> {\n return function createCallerInner<TRecord extends RouterRecord>(\n router: Pick<Router<TRoot, TRecord>, '_def'>,\n ): RouterCaller<TRoot, TRecord> {\n const { _def } = router;\n type Context = TRoot['ctx'];\n\n return function createCaller(ctxOrCallback, opts) {\n return createRecursiveProxy<ReturnType<RouterCaller<any, any>>>(\n async (innerOpts) => {\n const { path, args } = innerOpts;\n const fullPath = path.join('.');\n\n if (path.length === 1 && path[0] === '_def') {\n return _def;\n }\n\n const procedure = await getProcedureAtPath(router, fullPath);\n\n let ctx: Context | undefined = undefined;\n try {\n if (!procedure) {\n throw new TRPCError({\n code: 'NOT_FOUND',\n message: `No procedure found on path \"${path}\"`,\n });\n }\n ctx = isFunction(ctxOrCallback)\n ? await Promise.resolve(ctxOrCallback())\n : ctxOrCallback;\n\n return await procedure({\n path: fullPath,\n getRawInput: async () => args[0],\n ctx,\n type: procedure._def.type,\n signal: opts?.signal,\n batchIndex: 0,\n });\n } catch (cause) {\n opts?.onError?.({\n ctx,\n error: getTRPCErrorFromUnknown(cause),\n input: args[0],\n path: fullPath,\n type: procedure?._def.type ?? 'unknown',\n });\n throw cause;\n }\n },\n );\n };\n };\n}\n\n/** @internal */\nexport type MergeRouters<\n TRouters extends AnyRouter[],\n TRoot extends AnyRootTypes = TRouters[0]['_def']['_config']['$types'],\n TRecord extends RouterRecord = {},\n> = TRouters extends [\n infer Head extends AnyRouter,\n ...infer Tail extends AnyRouter[],\n]\n ? MergeRouters<Tail, TRoot, Head['_def']['record'] & TRecord>\n : BuiltRouter<TRoot, TRecord>;\n\nexport function mergeRouters<TRouters extends AnyRouter[]>(\n ...routerList: [...TRouters]\n): MergeRouters<TRouters> {\n const record = mergeWithoutOverrides(\n {},\n ...routerList.map((r) => r._def.record),\n );\n const errorFormatter = routerList.reduce(\n (currentErrorFormatter, nextRouter) => {\n if (\n nextRouter._def._config.errorFormatter &&\n nextRouter._def._config.errorFormatter !== defaultFormatter\n ) {\n if (\n currentErrorFormatter !== defaultFormatter &&\n currentErrorFormatter !== nextRouter._def._config.errorFormatter\n ) {\n throw new Error('You seem to have several error formatters');\n }\n return nextRouter._def._config.errorFormatter;\n }\n return currentErrorFormatter;\n },\n defaultFormatter,\n );\n\n const transformer = routerList.reduce((prev, current) => {\n if (\n current._def._config.transformer &&\n current._def._config.transformer !== defaultTransformer\n ) {\n if (\n prev !== defaultTransformer &&\n prev !== current._def._config.transformer\n ) {\n throw new Error('You seem to have several transformers');\n }\n return current._def._config.transformer;\n }\n return prev;\n }, defaultTransformer);\n\n const router = createRouterFactory({\n errorFormatter,\n transformer,\n isDev: routerList.every((r) => r._def._config.isDev),\n allowOutsideOfServer: routerList.every(\n (r) => r._def._config.allowOutsideOfServer,\n ),\n isServer: routerList.every((r) => r._def._config.isServer),\n $types: routerList[0]?._def._config.$types,\n sse: routerList[0]?._def._config.sse,\n })(record);\n\n return router as MergeRouters<TRouters>;\n}\n","const trackedSymbol = Symbol();\n\ntype TrackedId = string & {\n __brand: 'TrackedId';\n};\nexport type TrackedEnvelope<TData> = [TrackedId, TData, typeof trackedSymbol];\n\nexport interface TrackedData<TData> {\n /**\n * The id of the message to keep track of in case the connection gets lost\n */\n id: string;\n /**\n * The data field of the message\n */\n data: TData;\n}\n/**\n * Produce a typed server-sent event message\n * @deprecated use `tracked(id, data)` instead\n */\nexport function sse<TData>(event: { id: string; data: TData }) {\n return tracked(event.id, event.data);\n}\n\nexport function isTrackedEnvelope<TData>(\n value: unknown,\n): value is TrackedEnvelope<TData> {\n return Array.isArray(value) && value[2] === trackedSymbol;\n}\n\n/**\n * Automatically track an event so that it can be resumed from a given id if the connection is lost\n */\nexport function tracked<TData>(\n id: string,\n data: TData,\n): TrackedEnvelope<TData> {\n if (id === '') {\n // This limitation could be removed by using different SSE event names / channels for tracked event and non-tracked event\n throw new Error(\n '`id` must not be an empty string as empty string is the same as not setting the id at all',\n );\n }\n return [id as TrackedId, data, trackedSymbol];\n}\n\nexport type inferTrackedOutput<TData> =\n TData extends TrackedEnvelope<infer $Data> ? TrackedData<$Data> : TData;\n","import type {\n inferClientTypes,\n InferrableClientTypes,\n Maybe,\n TRPCErrorResponse,\n} from '@trpc/server/unstable-core-do-not-import';\nimport {\n isObject,\n type DefaultErrorShape,\n} from '@trpc/server/unstable-core-do-not-import';\n\ntype inferErrorShape<TInferrable extends InferrableClientTypes> =\n inferClientTypes<TInferrable>['errorShape'];\nexport interface TRPCClientErrorBase<TShape extends DefaultErrorShape> {\n readonly message: string;\n readonly shape: Maybe<TShape>;\n readonly data: Maybe<TShape['data']>;\n}\nexport type TRPCClientErrorLike<TInferrable extends InferrableClientTypes> =\n TRPCClientErrorBase<inferErrorShape<TInferrable>>;\n\nexport function isTRPCClientError<TInferrable extends InferrableClientTypes>(\n cause: unknown,\n): cause is TRPCClientError<TInferrable> {\n return cause instanceof TRPCClientError;\n}\n\nfunction isTRPCErrorResponse(obj: unknown): obj is TRPCErrorResponse<any> {\n return (\n isObject(obj) &&\n isObject(obj['error']) &&\n typeof obj['error']['code'] === 'number' &&\n typeof obj['error']['message'] === 'string'\n );\n}\n\nfunction getMessageFromUnknownError(err: unknown, fallback: string): string {\n if (typeof err === 'string') {\n return err;\n }\n if (isObject(err) && typeof err['message'] === 'string') {\n return err['message'];\n }\n return fallback;\n}\n\nexport class TRPCClientError<TRouterOrProcedure extends InferrableClientTypes>\n extends Error\n implements TRPCClientErrorBase<inferErrorShape<TRouterOrProcedure>>\n{\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore override doesn't work in all environments due to \"This member cannot have an 'override' modifier because it is not declared in the base class 'Error'\"\n public override readonly cause;\n public readonly shape: Maybe<inferErrorShape<TRouterOrProcedure>>;\n public readonly data: Maybe<inferErrorShape<TRouterOrProcedure>['data']>;\n\n /**\n * Additional meta data about the error\n * In the case of HTTP-errors, we'll have `response` and potentially `responseJSON` here\n */\n public meta;\n\n constructor(\n message: string,\n opts?: {\n result?: Maybe<TRPCErrorResponse<inferErrorShape<TRouterOrProcedure>>>;\n cause?: Error;\n meta?: Record<string, unknown>;\n },\n ) {\n const cause = opts?.cause;\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore https://github.com/tc39/proposal-error-cause\n super(message, { cause });\n\n this.meta = opts?.meta;\n\n this.cause = cause;\n this.shape = opts?.result?.error;\n this.data = opts?.result?.error.data;\n this.name = 'TRPCClientError';\n\n Object.setPrototypeOf(this, TRPCClientError.prototype);\n }\n\n public static from<TRouterOrProcedure extends InferrableClientTypes>(\n _cause: Error | TRPCErrorResponse<any> | object,\n opts: { meta?: Record<string, unknown>; cause?: Error } = {},\n ): TRPCClientError<TRouterOrProcedure> {\n const cause = _cause as unknown;\n\n if (isTRPCClientError(cause)) {\n if (opts.meta) {\n // Decorate with meta error data\n cause.meta = {\n ...cause.meta,\n ...opts.meta,\n };\n }\n return cause;\n }\n if (isTRPCErrorResponse(cause)) {\n return new TRPCClientError(cause.error.message, {\n ...opts,\n result: cause,\n cause: opts.cause,\n });\n }\n return new TRPCClientError(\n getMessageFromUnknownError(cause, 'Unknown error'),\n {\n ...opts,\n cause: cause as any,\n },\n );\n }\n}\n","import type {\n AnyClientTypes,\n CombinedDataTransformer,\n DataTransformerOptions,\n TypeError,\n} from '@trpc/server/unstable-core-do-not-import';\n\n/**\n * @internal\n */\nexport type CoercedTransformerParameters = {\n transformer?: DataTransformerOptions;\n};\n\ntype TransformerOptionYes = {\n /**\n * Data transformer\n *\n * You must use the same transformer on the backend and frontend\n * @see https://trpc.io/docs/v11/data-transformers\n **/\n transformer: DataTransformerOptions;\n};\ntype TransformerOptionNo = {\n /**\n * Data transformer\n *\n * You must use the same transformer on the backend and frontend\n * @see https://trpc.io/docs/v11/data-transformers\n **/\n transformer?: TypeError<'You must define a transformer on your your `initTRPC`-object first'>;\n};\n\n/**\n * @internal\n */\nexport type TransformerOptions<\n TRoot extends Pick<AnyClientTypes, 'transformer'>,\n> = TRoot['transformer'] extends true\n ? TransformerOptionYes\n : TransformerOptionNo;\n/**\n * @internal\n */\n\n/**\n * @internal\n */\nexport function getTransformer(\n transformer:\n | TransformerOptions<{ transformer: false }>['transformer']\n | TransformerOptions<{ transformer: true }>['transformer']\n | undefined,\n): CombinedDataTransformer {\n const _transformer =\n transformer as CoercedTransformerParameters['transformer'];\n if (!_transformer) {\n return {\n input: {\n serialize: (data) => data,\n deserialize: (data) => data,\n },\n output: {\n serialize: (data) => data,\n deserialize: (data) => data,\n },\n };\n }\n if ('input' in _transformer) {\n return _transformer;\n }\n return {\n input: _transformer,\n output: _transformer,\n };\n}\n","import type { FetchEsque, NativeFetchEsque } from './internals/types';\n\ntype AnyFn = (...args: any[]) => unknown;\n\nconst isFunction = (fn: unknown): fn is AnyFn => typeof fn === 'function';\n\nexport function getFetch(\n customFetchImpl?: FetchEsque | NativeFetchEsque,\n): FetchEsque {\n if (customFetchImpl) {\n return customFetchImpl as FetchEsque;\n }\n\n if (typeof window !== 'undefined' && isFunction(window.fetch)) {\n return window.fetch as FetchEsque;\n }\n\n if (typeof globalThis !== 'undefined' && isFunction(globalThis.fetch)) {\n return globalThis.fetch as FetchEsque;\n }\n\n throw new Error('No fetch implementation found');\n}\n","import type {\n AnyClientTypes,\n CombinedDataTransformer,\n Maybe,\n ProcedureType,\n TRPCAcceptHeader,\n TRPCResponse,\n} from '@trpc/server/unstable-core-do-not-import';\nimport { getFetch } from '../../getFetch';\nimport type {\n FetchEsque,\n RequestInitEsque,\n ResponseEsque,\n} from '../../internals/types';\nimport type { TransformerOptions } from '../../unstable-internals';\nimport { getTransformer } from '../../unstable-internals';\nimport type { HTTPHeaders } from '../types';\n\n/**\n * @internal\n */\nexport type HTTPLinkBaseOptions<\n TRoot extends Pick<AnyClientTypes, 'transformer'>,\n> = {\n url: string | URL;\n /**\n * Add ponyfill for fetch\n */\n fetch?: FetchEsque;\n /**\n * Send all requests `as POST`s requests regardless of the procedure type\n * The HTTP handler must separately allow overriding the method. See:\n * @see https://trpc.io/docs/rpc\n */\n methodOverride?: 'POST';\n} & TransformerOptions<TRoot>;\n\nexport interface ResolvedHTTPLinkOptions {\n url: string;\n fetch?: FetchEsque;\n transformer: CombinedDataTransformer;\n methodOverride?: 'POST';\n}\n\nexport function resolveHTTPLinkOptions(\n opts: HTTPLinkBaseOptions<AnyClientTypes>,\n): ResolvedHTTPLinkOptions {\n return {\n url: opts.url.toString(),\n fetch: opts.fetch,\n transformer: getTransformer(opts.transformer),\n methodOverride: opts.methodOverride,\n };\n}\n\n// https://github.com/trpc/trpc/pull/669\nfunction arrayToDict(array: unknown[]) {\n const dict: Record<number, unknown> = {};\n for (let index = 0; index < array.length; index++) {\n const element = array[index];\n dict[index] = element;\n }\n return dict;\n}\n\nconst METHOD = {\n query: 'GET',\n mutation: 'POST',\n subscription: 'PATCH',\n} as const;\n\nexport interface HTTPResult {\n json: TRPCResponse;\n meta: {\n response: ResponseEsque;\n responseJSON?: unknown;\n };\n}\n\ntype GetInputOptions = {\n transformer: CombinedDataTransformer;\n} & ({ input: unknown } | { inputs: unknown[] });\n\nexport function getInput(opts: GetInputOptions) {\n return 'input' in opts\n ? opts.transformer.input.serialize(opts.input)\n : arrayToDict(\n opts.inputs.map((_input) => opts.transformer.input.serialize(_input)),\n );\n}\n\nexport type HTTPBaseRequestOptions = GetInputOptions &\n ResolvedHTTPLinkOptions & {\n type: ProcedureType;\n path: string;\n signal: Maybe<AbortSignal>;\n };\n\ntype GetUrl = (opts: HTTPBaseRequestOptions) => string;\ntype GetBody = (opts: HTTPBaseRequestOptions) => RequestInitEsque['body'];\n\nexport type ContentOptions = {\n trpcAcceptHeader?: TRPCAcceptHeader;\n trpcAcceptHeaderKey?: 'trpc-accept' | 'accept';\n contentTypeHeader?: string;\n getUrl: GetUrl;\n getBody: GetBody;\n};\n\nexport const getUrl: GetUrl = (opts) => {\n const parts = opts.url.split('?') as [string, string?];\n const base = parts[0].replace(/\\/$/, ''); // Remove any trailing slashes\n\n let url = base + '/' + opts.path;\n const queryParts: string[] = [];\n\n if (parts[1]) {\n queryParts.push(parts[1]);\n }\n if ('inputs' in opts) {\n queryParts.push('batch=1');\n }\n if (opts.type === 'query' || opts.type === 'subscription') {\n const input = getInput(opts);\n if (input !== undefined && opts.methodOverride !== 'POST') {\n queryParts.push(`input=${encodeURIComponent(JSON.stringify(input))}`);\n }\n }\n if (queryParts.length) {\n url += '?' + queryParts.join('&');\n }\n return url;\n};\n\nexport const getBody: GetBody = (opts) => {\n if (opts.type === 'query' && opts.methodOverride !== 'POST') {\n return undefined;\n }\n const input = getInput(opts);\n return input !== undefined ? JSON.stringify(input) : undefined;\n};\n\nexport type Requester = (\n opts: HTTPBaseRequestOptions & {\n headers: () => HTTPHeaders | Promise<HTTPHeaders>;\n },\n) => Promise<HTTPResult>;\n\nexport const jsonHttpRequester: Requester = (opts) => {\n return httpRequest({\n ...opts,\n contentTypeHeader: 'application/json',\n getUrl,\n getBody,\n });\n};\n\n/**\n * Polyfill for DOMException with AbortError name\n */\nclass AbortError extends Error {\n constructor() {\n const name = 'AbortError';\n super(name);\n this.name = name;\n this.message = name;\n }\n}\n\nexport type HTTPRequestOptions = ContentOptions &\n HTTPBaseRequestOptions & {\n headers: () => HTTPHeaders | Promise<HTTPHeaders>;\n };\n\n/**\n * Polyfill for `signal.throwIfAborted()`\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/throwIfAborted\n */\nconst throwIfAborted = (signal: Maybe<AbortSignal>) => {\n if (!signal?.aborted) {\n return;\n }\n // If available, use the native implementation\n signal.throwIfAborted?.();\n\n // If we have `DOMException`, use it\n if (typeof DOMException !== 'undefined') {\n throw new DOMException('AbortError', 'AbortError');\n }\n\n // Otherwise, use our own implementation\n throw new AbortError();\n};\n\nexport async function fetchHTTPResponse(opts: HTTPRequestOptions) {\n throwIfAborted(opts.signal);\n\n const url = opts.getUrl(opts);\n const body = opts.getBody(opts);\n const method = opts.methodOverride ?? METHOD[opts.type];\n const resolvedHeaders = await (async () => {\n const heads = await opts.headers();\n if (Symbol.iterator in heads) {\n return Object.fromEntries(heads);\n }\n return heads;\n })();\n const headers = {\n ...(opts.contentTypeHeader && method !== 'GET'\n ? { 'content-type': opts.contentTypeHeader }\n : {}),\n ...(opts.trpcAcceptHeader\n ? { [opts.trpcAcceptHeaderKey ?? 'trpc-accept']: opts.trpcAcceptHeader }\n : undefined),\n ...resolvedHeaders,\n };\n\n return getFetch(opts.fetch)(url, {\n method,\n signal: opts.signal,\n body,\n headers,\n });\n}\n\nexport async function httpRequest(\n opts: HTTPRequestOptions,\n): Promise<HTTPResult> {\n const meta = {} as HTTPResult['meta'];\n\n const res = await fetchHTTPResponse(opts);\n meta.response = res;\n\n const json = await res.json();\n\n meta.responseJSON = json;\n\n return {\n json: json as TRPCResponse,\n meta,\n };\n}\n","/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\ntype BatchItem<TKey, TValue> = {\n aborted: boolean;\n key: TKey;\n resolve: ((value: TValue) => void) | null;\n reject: ((error: Error) => void) | null;\n batch: Batch<TKey, TValue> | null;\n};\ntype Batch<TKey, TValue> = {\n items: BatchItem<TKey, TValue>[];\n};\nexport type BatchLoader<TKey, TValue> = {\n validate: (keys: TKey[]) => boolean;\n fetch: (keys: TKey[]) => Promise<TValue[] | Promise<TValue>[]>;\n};\n\n/**\n * A function that should never be called unless we messed something up.\n */\nconst throwFatalError = () => {\n throw new Error(\n 'Something went wrong. Please submit an issue at https://github.com/trpc/trpc/issues/new',\n );\n};\n\n/**\n * Dataloader that's very inspired by https://github.com/graphql/dataloader\n * Less configuration, no caching, and allows you to cancel requests\n * When cancelling a single fetch the whole batch will be cancelled only when _all_ items are cancelled\n */\nexport function dataLoader<TKey, TValue>(\n batchLoader: BatchLoader<TKey, TValue>,\n) {\n let pendingItems: BatchItem<TKey, TValue>[] | null = null;\n let dispatchTimer: ReturnType<typeof setTimeout> | null = null;\n\n const destroyTimerAndPendingItems = () => {\n clearTimeout(dispatchTimer as any);\n dispatchTimer = null;\n pendingItems = null;\n };\n\n /**\n * Iterate through the items and split them into groups based on the `batchLoader`'s validate function\n */\n function groupItems(items: BatchItem<TKey, TValue>[]) {\n const groupedItems: BatchItem<TKey, TValue>[][] = [[]];\n let index = 0;\n while (true) {\n const item = items[index];\n if (!item) {\n // we're done\n break;\n }\n const lastGroup = groupedItems[groupedItems.length - 1]!;\n\n if (item.aborted) {\n // Item was aborted before it was dispatched\n item.reject?.(new Error('Aborted'));\n index++;\n continue;\n }\n\n const isValid = batchLoader.validate(\n lastGroup.concat(item).map((it) => it.key),\n );\n\n if (isValid) {\n lastGroup.push(item);\n index++;\n continue;\n }\n\n if (lastGroup.length === 0) {\n item.reject?.(new Error('Input is too big for a single dispatch'));\n index++;\n continue;\n }\n // Create new group, next iteration will try to add the item to that\n groupedItems.push([]);\n }\n return groupedItems;\n }\n\n function dispatch() {\n const groupedItems = groupItems(pendingItems!);\n destroyTimerAndPendingItems();\n\n // Create batches for each group of items\n for (const items of groupedItems) {\n if (!items.length) {\n continue;\n }\n const batch: Batch<TKey, TValue> = {\n items,\n };\n for (const item of items) {\n item.batch = batch;\n }\n const promise = batchLoader.fetch(batch.items.map((_item) => _item.key));\n\n promise\n .then(async (result) => {\n await Promise.all(\n result.map(async (valueOrPromise, index) => {\n const item = batch.items[index]!;\n try {\n const value = await Promise.resolve(valueOrPromise);\n\n item.resolve?.(value);\n } catch (cause) {\n item.reject?.(cause as Error);\n }\n\n item.batch = null;\n item.reject = null;\n item.resolve = null;\n }),\n );\n\n for (const item of batch.items) {\n item.reject?.(new Error('Missing result'));\n item.batch = null;\n }\n })\n .catch((cause) => {\n for (const item of batch.items) {\n item.reject?.(cause);\n item.batch = null;\n }\n });\n }\n }\n function load(key: TKey): Promise<TValue> {\n const item: BatchItem<TKey, TValue> = {\n aborted: false,\n key,\n batch: null,\n resolve: throwFatalError,\n reject: throwFatalError,\n };\n\n const promise = new Promise<TValue>((resolve, reject) => {\n item.reject = reject;\n item.resolve = resolve;\n\n pendingItems ??= [];\n pendingItems.push(item);\n });\n\n dispatchTimer ??= setTimeout(dispatch);\n\n return promise;\n }\n\n return {\n load,\n };\n}\n","import type { Maybe } from '@trpc/server/unstable-core-do-not-import';\n\n/**\n * Like `Promise.all()` but for abort signals\n * - When all signals have been aborted, the merged signal will be aborted\n * - If one signal is `null`, no signal will be aborted\n */\nexport function allAbortSignals(...signals: Maybe<AbortSignal>[]): AbortSignal {\n const ac = new AbortController();\n\n const count = signals.length;\n\n let abortedCount = 0;\n\n const onAbort = () => {\n if (++abortedCount === count) {\n ac.abort();\n }\n };\n\n for (const signal of signals) {\n if (signal?.aborted) {\n onAbort();\n } else {\n signal?.addEventListener('abort', onAbort, {\n once: true,\n });\n }\n }\n\n return ac.signal;\n}\n\n/**\n * Like `Promise.race` but for abort signals\n *\n * Basically, a ponyfill for\n * [`AbortSignal.any`](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/any_static).\n */\nexport function raceAbortSignals(\n ...signals: Maybe<AbortSignal>[]\n): AbortSignal {\n const ac = new AbortController();\n\n for (const signal of signals) {\n if (signal?.aborted) {\n ac.abort();\n } else {\n signal?.addEventListener('abort', () => ac.abort(), { once: true });\n }\n }\n\n return ac.signal;\n}\n\nexport function abortSignalToPromise(signal: AbortSignal): Promise<never> {\n return new Promise((_, reject) => {\n if (signal.aborted) {\n reject(signal.reason);\n return;\n }\n signal.addEventListener(\n 'abort',\n () => {\n reject(signal.reason);\n },\n { once: true },\n );\n });\n}\n","import type { AnyRouter, ProcedureType } from '@trpc/server';\nimport { observable } from '@trpc/server/observable';\nimport { transformResult } from '@trpc/server/unstable-core-do-not-import';\nimport type { BatchLoader } from '../internals/dataLoader';\nimport { dataLoader } from '../internals/dataLoader';\nimport { allAbortSignals } from '../internals/signals';\nimport type { NonEmptyArray } from '../internals/types';\nimport { TRPCClientError } from '../TRPCClientError';\nimport type { HTTPBatchLinkOptions } from './HTTPBatchLinkOptions';\nimport type { HTTPResult } from './internals/httpUtils';\nimport {\n getUrl,\n jsonHttpRequester,\n resolveHTTPLinkOptions,\n} from './internals/httpUtils';\nimport type { Operation, TRPCLink } from './types';\n\n/**\n * @see https://trpc.io/docs/client/links/httpBatchLink\n */\nexport function httpBatchLink<TRouter extends AnyRouter>(\n opts: HTTPBatchLinkOptions<TRouter['_def']['_config']['$types']>,\n): TRPCLink<TRouter> {\n const resolvedOpts = resolveHTTPLinkOptions(opts);\n const maxURLLength = opts.maxURLLength ?? Infinity;\n const maxItems = opts.maxItems ?? Infinity;\n\n return () => {\n const batchLoader = (\n type: ProcedureType,\n ): BatchLoader<Operation, HTTPResult> => {\n return {\n validate(batchOps) {\n if (maxURLLength === Infinity && maxItems === Infinity) {\n // escape hatch for quick calcs\n return true;\n }\n if (batchOps.length > maxItems) {\n return false;\n }\n const path = batchOps.map((op) => op.path).join(',');\n const inputs = batchOps.map((op) => op.input);\n\n const url = getUrl({\n ...resolvedOpts,\n type,\n path,\n inputs,\n signal: null,\n });\n\n return url.length <= maxURLLength;\n },\n async fetch(batchOps) {\n const path = batchOps.map((op) => op.path).join(',');\n const inputs = batchOps.map((op) => op.input);\n const signal = allAbortSignals(...batchOps.map((op) => op.signal));\n\n const res = await jsonHttpRequester({\n ...resolvedOpts,\n path,\n inputs,\n type,\n headers() {\n if (!opts.headers) {\n return {};\n }\n if (typeof opts.headers === 'function') {\n return opts.headers({\n opList: batchOps as NonEmptyArray<Operation>,\n });\n }\n return opts.headers;\n },\n signal,\n });\n const resJSON = Array.isArray(res.json)\n ? res.json\n : batchOps.map(() => res.json);\n const result = resJSON.map((item) => ({\n meta: res.meta,\n json: item,\n }));\n return result;\n },\n };\n };\n\n const query = dataLoader(batchLoader('query'));\n const mutation = dataLoader(batchLoader('mutation'));\n\n const loaders = { query, mutation };\n return ({ op }) => {\n return observable((observer) => {\n /* istanbul ignore if -- @preserve */\n if (op.type === 'subscription') {\n throw new Error(\n 'Subscriptions are unsupported by `httpLink` - use `httpSubscriptionLink` or `wsLink`',\n );\n }\n const loader = loaders[op.type];\n const promise = loader.load(op);\n\n let _res = undefined as HTTPResult | undefined;\n promise\n .then((res) => {\n _res = res;\n const transformed = transformResult(\n res.json,\n resolvedOpts.transformer.output,\n );\n\n if (!transformed.ok) {\n observer.error(\n TRPCClientError.from(transformed.error, {\n meta: res.meta,\n }),\n );\n return;\n }\n observer.next({\n context: res.meta,\n result: transformed.result,\n });\n observer.complete();\n })\n .catch((err) => {\n observer.error(\n TRPCClientError.from(err, {\n meta: _res?.meta,\n }),\n );\n });\n\n return () => {\n // noop\n };\n });\n };\n };\n}\n","import type { Encoder } from '@trpc/server/adapters/ws';\n\nexport type { Encoder };\n\nexport const jsonEncoder: Encoder = {\n encode: (data) => JSON.stringify(data),\n decode: (data) => {\n if (typeof data !== 'string') {\n throw new Error(\n 'jsonEncoder received binary data. JSON uses text frames. ' +\n 'Use a binary encoder for binary data.',\n );\n }\n return JSON.parse(data);\n },\n};\n","import type { UrlOptionsWithConnectionParams } from '../../internals/urlWithConnectionParams';\nimport type { Encoder } from './encoder';\n\nexport interface WebSocketClientOptions extends UrlOptionsWithConnectionParams {\n /**\n * Ponyfill which WebSocket implementation to use\n */\n WebSocket?: typeof WebSocket;\n /**\n * The number of milliseconds before a reconnect is attempted.\n * @default {@link exponentialBackoff}\n */\n retryDelayMs?: (attemptIndex: number) => number;\n /**\n * Triggered when a WebSocket connection is established\n */\n onOpen?: () => void;\n /**\n * Triggered when a WebSocket connection encounters an error\n */\n onError?: (evt?: Event) => void;\n /**\n * Triggered when a WebSocket connection is closed\n */\n onClose?: (cause?: { code?: number }) => void;\n /**\n * Lazy mode will close the WebSocket automatically after a period of inactivity (no messages sent or received and no pending requests)\n */\n lazy?: {\n /**\n * Enable lazy mode\n * @default false\n */\n enabled: boolean;\n /**\n * Close the WebSocket after this many milliseconds\n * @default 0\n */\n closeMs: number;\n };\n /**\n * Send ping messages to the server and kill the connection if no pong message is returned\n */\n keepAlive?: {\n /**\n * @default false\n */\n enabled: boolean;\n /**\n * Send a ping message every this many milliseconds\n * @default 5_000\n */\n intervalMs?: number;\n /**\n * Close the WebSocket after this many milliseconds if the server does not respond\n * @default 1_000\n */\n pongTimeoutMs?: number;\n };\n /**\n * Custom encoder for wire encoding (e.g. custom binary formats)\n * @default jsonEncoder\n */\n experimental_encoder?: Encoder;\n}\n\n/**\n * Default options for lazy WebSocket connections.\n * Determines whether the connection should be established lazily and defines the delay before closure.\n */\nexport type LazyOptions = Required<NonNullable<WebSocketClientOptions['lazy']>>;\nexport const lazyDefaults: LazyOptions = {\n enabled: false,\n closeMs: 0,\n};\n\n/**\n * Default options for the WebSocket keep-alive mechanism.\n * Configures whether keep-alive is enabled and specifies the timeout and interval for ping-pong messages.\n */\nexport type KeepAliveOptions = Required<\n NonNullable<WebSocketClientOptions['keepAlive']>\n>;\nexport const keepAliveDefaults: KeepAliveOptions = {\n enabled: false,\n pongTimeoutMs: 1_000,\n intervalMs: 5_000,\n};\n\n/**\n * Calculates a delay for exponential backoff based on the retry attempt index.\n * The delay starts at 0 for the first attempt and doubles for each subsequent attempt,\n * capped at 30 seconds.\n */\nexport const exponentialBackoff = (attemptIndex: number) => {\n return attemptIndex === 0 ? 0 : Math.min(1000 * 2 ** attemptIndex, 30000);\n};\n","import { type TRPCRequestInfo } from '@trpc/server/http';\n\n/**\n * Get the result of a value or function that returns a value\n * It also optionally accepts typesafe arguments for the function\n */\nexport const resultOf = <T, TArgs extends any[]>(\n value: T | ((...args: TArgs) => T),\n ...args: TArgs\n): T => {\n return typeof value === 'function'\n ? (value as (...args: TArgs) => T)(...args)\n : value;\n};\n\n/**\n * A value that can be wrapped in callback\n */\nexport type CallbackOrValue<T> = T | (() => T | Promise<T>);\n\nexport interface UrlOptionsWithConnectionParams {\n /**\n * The URL to connect to (can be a function that returns a URL)\n */\n url: CallbackOrValue<string>;\n\n /**\n * Connection params that are available in `createContext()`\n * - For `wsLink`/`wsClient`, these are sent as the first message\n * - For `httpSubscriptionLink`, these are serialized as part of the URL under the `connectionParams` query\n */\n connectionParams?: CallbackOrValue<TRPCRequestInfo['connectionParams']>;\n}\n","import type {\n TRPCConnectionParamsMessage,\n TRPCRequestInfo,\n} from '@trpc/server/unstable-core-do-not-import';\nimport type {\n CallbackOrValue,\n UrlOptionsWithConnectionParams,\n} from '../../internals/urlWithConnectionParams';\nimport { resultOf } from '../../internals/urlWithConnectionParams';\nimport type { Encoder } from './encoder';\n\nexport class TRPCWebSocketClosedError extends Error {\n constructor(opts: { message: string; cause?: unknown }) {\n super(opts.message, {\n cause: opts.cause,\n });\n this.name = 'TRPCWebSocketClosedError';\n Object.setPrototypeOf(this, TRPCWebSocketClosedError.prototype);\n }\n}\n\n/**\n * Utility class for managing a timeout that can be started, stopped, and reset.\n * Useful for scenarios where the timeout duration is reset dynamically based on events.\n */\nexport class ResettableTimeout {\n private timeout: ReturnType<typeof setTimeout> | undefined;\n\n constructor(\n private readonly onTimeout: () => void,\n private readonly timeoutMs: number,\n ) {}\n\n /**\n * Resets the current timeout, restarting it with the same duration.\n * Does nothing if no timeout is active.\n */\n public reset() {\n if (!this.timeout) return;\n\n clearTimeout(this.timeout);\n this.timeout = setTimeout(this.onTimeout, this.timeoutMs);\n }\n\n public start() {\n clearTimeout(this.timeout);\n this.timeout = setTimeout(this.onTimeout, this.timeoutMs);\n }\n\n public stop() {\n clearTimeout(this.timeout);\n this.timeout = undefined;\n }\n}\n\n// Ponyfill for Promise.withResolvers https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers\nexport function withResolvers<T>() {\n let resolve: (value: T | PromiseLike<T>) => void;\n let reject: (reason?: any) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return { promise, resolve: resolve!, reject: reject! };\n}\n\n/**\n * Resolves a WebSocket URL and optionally appends connection parameters.\n *\n * If connectionParams are provided, appends 'connectionParams=1' query parameter.\n */\nexport async function prepareUrl(urlOptions: UrlOptionsWithConnectionParams) {\n const url = await resultOf(urlOptions.url);\n\n if (!urlOptions.connectionParams) return url;\n\n // append `?connectionParams=1` when connection params are used\n const prefix = url.includes('?') ? '&' : '?';\n const connectionParams = `${prefix}connectionParams=1`;\n\n return url + connectionParams;\n}\n\nexport async function buildConnectionMessage(\n connectionParams: CallbackOrValue<TRPCRequestInfo['connectionParams']>,\n encoder: Encoder,\n) {\n const message: TRPCConnectionParamsMessage = {\n method: 'connectionParams',\n data: await resultOf(connectionParams),\n };\n\n return encoder.encode(message);\n}\n","import type { AnyTRPCRouter, inferRouterError } from '@trpc/server';\nimport type { Observer } from '@trpc/server/observable';\nimport type {\n TRPCClientOutgoingMessage,\n TRPCResponseMessage,\n} from '@trpc/server/unstable-core-do-not-import';\nimport type { TRPCClientError } from '../../../TRPCClientError';\nimport { withResolvers } from './utils';\n\nexport type TCallbacks = Observer<\n TRPCResponseMessage<unknown, inferRouterError<AnyTRPCRouter>>,\n TRPCClientError<AnyTRPCRouter>\n>;\n\ntype MessageId = string;\ntype MessageIdLike = string | number | null;\n\n/**\n * Represents a WebSocket request managed by the RequestManager.\n * Combines the network message, a utility promise (`end`) that mirrors the lifecycle\n * handled by `callbacks`, and a set of state monitoring callbacks.\n */\ninterface Request {\n message: TRPCClientOutgoingMessage;\n end: Promise<void>;\n callbacks: TCallbacks;\n}\n\n/**\n * Manages WebSocket requests, tracking their lifecycle and providing utility methods\n * for handling outgoing and pending requests.\n *\n * - **Outgoing requests**: Requests that are queued and waiting to be sent.\n * - **Pending requests**: Requests that have been sent and are in flight awaiting a response.\n * For subscriptions, multiple responses may be received until the subscription is closed.\n */\nexport class RequestManager {\n /**\n * Stores requests that are outgoing, meaning they are registered but not yet sent over the WebSocket.\n */\n private outgoingRequests = new Array<Request & { id: MessageId }>();\n\n /**\n * Stores requests that are pending (in flight), meaning they have been sent over the WebSocket\n * and are awaiting responses. For subscriptions, this includes requests\n * that may receive multiple responses.\n */\n private pendingRequests: Record<MessageId, Request> = {};\n\n /**\n * Registers a new request by adding it to the outgoing queue and setting up\n * callbacks for lifecycle events such as completion or error.\n *\n * @param message - The outgoing message to be sent.\n * @param callbacks - Callback functions to observe the request's state.\n * @returns A cleanup function to manually remove the request.\n */\n public register(message: TRPCClientOutgoingMessage, callbacks: TCallbacks) {\n const { promise: end, resolve } = withResolvers<void>();\n\n this.outgoingRequests.push({\n id: String(message.id),\n message,\n end,\n callbacks: {\n next: callbacks.next,\n complete: () => {\n callbacks.complete();\n resolve();\n },\n error: (e) => {\n callbacks.error(e);\n resolve();\n },\n },\n });\n\n return () => {\n this.delete(message.id);\n callbacks.complete();\n resolve();\n };\n }\n\n /**\n * Deletes a request from both the outgoing and pending collections, if it exists.\n */\n public delete(messageId: MessageIdLike) {\n if (messageId === null) return;\n\n this.outgoingRequests = this.outgoingRequests.filter(\n ({ id }) => id !== String(messageId),\n );\n delete this.pendingRequests[String(messageId)];\n }\n\n /**\n * Moves all outgoing requests to the pending state and clears the outgoing queue.\n *\n * The caller is expected to handle the actual sending of the requests\n * (e.g., sending them over the network) after this method is called.\n *\n * @returns The list of requests that were transitioned to the pending state.\n */\n public flush() {\n const requests = this.outgoingRequests;\n this.outgoingRequests = [];\n\n for (const request of requests) {\n this.pendingRequests[request.id] = request;\n }\n return requests;\n }\n\n /**\n * Retrieves all currently pending requests, which are in flight awaiting responses\n * or handling ongoing subscriptions.\n */\n public getPendingRequests() {\n return Object.values(this.pendingRequests);\n }\n\n /**\n * Retrieves a specific pending request by its message ID.\n */\n public getPendingRequest(messageId: MessageIdLike) {\n if (messageId === null) return null;\n\n return this.pendingRequests[String(messageId)];\n }\n\n /**\n * Retrieves all outgoing requests, which are waiting to be sent.\n */\n public getOutgoingRequests() {\n return this.outgoingRequests;\n }\n\n /**\n * Retrieves all requests, both outgoing and pending, with their respective states.\n *\n * @returns An array of all requests with their state (\"outgoing\" or \"pending\").\n */\n public getRequests() {\n return [\n ...this.getOutgoingRequests().map((request) => ({\n state: 'outgoing' as const,\n message: request.message,\n end: request.end,\n callbacks: request.callbacks,\n })),\n ...this.getPendingRequests().map((request) => ({\n state: 'pending' as const,\n message: request.message,\n end: request.end,\n callbacks: request.callbacks,\n })),\n ];\n }\n\n /**\n * Checks if there are any pending requests, including ongoing subscriptions.\n */\n public hasPendingRequests() {\n return this.getPendingRequests().length > 0;\n }\n\n /**\n * Checks if there are any pending subscriptions\n */\n public hasPendingSubscriptions() {\n return this.getPendingRequests().some(\n (request) => request.message.method === 'subscription',\n );\n }\n\n /**\n * Checks if there are any outgoing requests waiting to be sent.\n */\n public hasOutgoingRequests() {\n return this.outgoingRequests.length > 0;\n }\n}\n","import { behaviorSubject } from '@trpc/server/observable';\nimport type { UrlOptionsWithConnectionParams } from '../../internals/urlWithConnectionParams';\nimport type { Encoder } from './encoder';\nimport { buildConnectionMessage, prepareUrl, withResolvers } from './utils';\n\n/**\n * Opens a WebSocket connection asynchronously and returns a promise\n * that resolves when the connection is successfully established.\n * The promise rejects if an error occurs during the connection attempt.\n */\nfunction asyncWsOpen(ws: WebSocket) {\n const { promise, resolve, reject } = withResolvers<void>();\n\n ws.addEventListener('open', () => {\n ws.removeEventListener('error', reject);\n resolve();\n });\n ws.addEventListener('error', reject);\n\n return promise;\n}\n\ninterface PingPongOptions {\n /**\n * The interval (in milliseconds) between \"PING\" messages.\n */\n intervalMs: number;\n\n /**\n * The timeout (in milliseconds) to wait for a \"PONG\" response before closing the connection.\n */\n pongTimeoutMs: number;\n}\n\n/**\n * Sets up a periodic ping-pong mechanism to keep the WebSocket connection alive.\n *\n * - Sends \"PING\" messages at regular intervals defined by `intervalMs`.\n * - If a \"PONG\" response is not received within the `pongTimeoutMs`, the WebSocket is closed.\n * - The ping timer resets upon receiving any message to maintain activity.\n * - Automatically starts the ping process when the WebSocket connection is opened.\n * - Cleans up timers when the WebSocket is closed.\n *\n * @param ws - The WebSocket instance to manage.\n * @param options - Configuration options for ping-pong intervals and timeouts.\n */\nfunction setupPingInterval(\n ws: WebSocket,\n { intervalMs, pongTimeoutMs }: PingPongOptions,\n) {\n let pingTimeout: ReturnType<typeof setTimeout> | undefined;\n let pongTimeout: ReturnType<typeof setTimeout> | undefined;\n\n function start() {\n pingTimeout = setTimeout(() => {\n ws.send('PING');\n pongTimeout = setTimeout(() => {\n ws.close();\n }, pongTimeoutMs);\n }, intervalMs);\n }\n\n function reset() {\n clearTimeout(pingTimeout);\n start();\n }\n\n function pong() {\n clearTimeout(pongTimeout);\n reset();\n }\n\n ws.addEventListener('open', start);\n ws.addEventListener('message', ({ data }) => {\n clearTimeout(pingTimeout);\n start();\n\n if (data === 'PONG') {\n pong();\n }\n });\n ws.addEventListener('close', () => {\n clearTimeout(pingTimeout);\n clearTimeout(pongTimeout);\n });\n}\n\nexport interface WebSocketConnectionOptions {\n WebSocketPonyfill?: typeof WebSocket;\n urlOptions: UrlOptionsWithConnectionParams;\n keepAlive: PingPongOptions & {\n enabled: boolean;\n };\n encoder: Encoder;\n}\n\n/**\n * Manages a WebSocket connection with support for reconnection, keep-alive mechanisms,\n * and observable state tracking.\n */\nexport class WsConnection {\n static connectCount = 0;\n public id = ++WsConnection.connectCount;\n\n private readonly WebSocketPonyfill: typeof WebSocket;\n private readonly urlOptions: UrlOptionsWithConnectionParams;\n private readonly keepAliveOpts: WebSocketConnectionOptions['keepAlive'];\n private readonly encoder: Encoder;\n public readonly wsObservable = behaviorSubject<WebSocket | null>(null);\n\n constructor(opts: WebSocketConnectionOptions) {\n this.WebSocketPonyfill = opts.WebSocketPonyfill ?? WebSocket;\n if (!this.WebSocketPonyfill) {\n throw new Error(\n \"No WebSocket implementation found - you probably don't want to use this on the server, but if you do you need to pass a `WebSocket`-ponyfill\",\n );\n }\n\n this.urlOptions = opts.urlOptions;\n this.keepAliveOpts = opts.keepAlive;\n this.encoder = opts.encoder;\n }\n\n public get ws() {\n return this.wsObservable.get();\n }\n\n private set ws(ws) {\n this.wsObservable.next(ws);\n }\n\n /**\n * Checks if the WebSocket connection is open and ready to communicate.\n */\n public isOpen(): this is { ws: WebSocket } {\n return (\n !!this.ws &&\n this.ws.readyState === this.WebSocketPonyfill.OPEN &&\n !this.openPromise\n );\n }\n\n /**\n * Checks if the WebSocket connection is closed or in the process of closing.\n */\n public isClosed(): this is { ws: WebSocket } {\n return (\n !!this.ws &&\n (this.ws.readyState === this.WebSocketPonyfill.CLOSING ||\n this.ws.readyState === this.WebSocketPonyfill.CLOSED)\n );\n }\n\n /**\n * Manages the WebSocket opening process, ensuring that only one open operation\n * occurs at a time. Tracks the ongoing operation with `openPromise` to avoid\n * redundant calls and ensure proper synchronization.\n *\n * Sets up the keep-alive mechanism and necessary event listeners for the connection.\n *\n * @returns A promise that resolves once the WebSocket connection is successfully opened.\n */\n private openPromise: Promise<void> | null = null;\n public async open() {\n if (this.openPromise) return this.openPromise;\n\n this.id = ++WsConnection.connectCount;\n const wsPromise = prepareUrl(this.urlOptions).then(\n (url) => new this.WebSocketPonyfill(url),\n );\n this.openPromise = wsPromise.then(async (ws) => {\n this.ws = ws;\n\n // Set binaryType to handle both text and binary messages consistently\n ws.binaryType = 'arraybuffer';\n\n // Setup ping listener\n ws.addEventListener('message', function ({ data }) {\n if (data === 'PING') {\n this.send('PONG');\n }\n });\n\n if (this.keepAliveOpts.enabled) {\n setupPingInterval(ws, this.keepAliveOpts);\n }\n\n ws.addEventListener('close', () => {\n if (this.ws === ws) {\n this.ws = null;\n }\n });\n\n await asyncWsOpen(ws);\n\n if (this.urlOptions.connectionParams) {\n ws.send(\n await buildConnectionMessage(\n this.urlOptions.connectionParams,\n this.encoder,\n ),\n );\n }\n });\n\n try {\n await this.openPromise;\n } finally {\n this.openPromise = null;\n }\n }\n\n /**\n * Closes the WebSocket connection gracefully.\n * Waits for any ongoing open operation to complete before closing.\n */\n public async close() {\n try {\n await this.openPromise;\n } finally {\n this.ws?.close();\n }\n }\n}\n\n/**\n * Provides a backward-compatible representation of the connection state.\n */\nexport function backwardCompatibility(connection: WsConnection) {\n if (connection.isOpen()) {\n return {\n id: connection.id,\n state: 'open',\n ws: connection.ws,\n } as const;\n }\n\n if (connection.isClosed()) {\n return {\n id: connection.id,\n state: 'closed',\n ws: connection.ws,\n } as const;\n }\n\n if (!connection.ws) {\n return null;\n }\n\n return {\n id: connection.id,\n state: 'connecting',\n ws: connection.ws,\n } as const;\n}\n","import type { AnyTRPCRouter } from '@trpc/server';\nimport type { BehaviorSubject } from '@trpc/server/observable';\nimport { behaviorSubject, observable } from '@trpc/server/observable';\nimport type {\n CombinedDataTransformer,\n TRPCClientIncomingMessage,\n TRPCClientIncomingRequest,\n TRPCClientOutgoingMessage,\n TRPCResponseMessage,\n} from '@trpc/server/unstable-core-do-not-import';\nimport {\n run,\n sleep,\n transformResult,\n} from '@trpc/server/unstable-core-do-not-import';\nimport { TRPCClientError } from '../../../TRPCClientError';\nimport type { TRPCConnectionState } from '../../internals/subscriptions';\nimport type { Operation, OperationResultEnvelope } from '../../types';\nimport type { Encoder } from './encoder';\nimport { jsonEncoder } from './encoder';\nimport type { WebSocketClientOptions } from './options';\nimport { exponentialBackoff, keepAliveDefaults, lazyDefaults } from './options';\nimport type { TCallbacks } from './requestManager';\nimport { RequestManager } from './requestManager';\nimport { ResettableTimeout, TRPCWebSocketClosedError } from './utils';\nimport { backwardCompatibility, WsConnection } from './wsConnection';\n\n/**\n * A WebSocket client for managing TRPC operations, supporting lazy initialization,\n * reconnection, keep-alive, and request management.\n */\nexport class WsClient {\n /**\n * Observable tracking the current connection state, including errors.\n */\n public readonly connectionState: BehaviorSubject<\n TRPCConnectionState<TRPCClientError<AnyTRPCRouter>>\n >;\n\n private allowReconnect = false;\n private requestManager = new RequestManager();\n private readonly activeConnection: WsConnection;\n private readonly reconnectRetryDelay: (attemptIndex: number) => number;\n private inactivityTimeout: ResettableTimeout;\n private readonly callbacks: Pick<\n WebSocketClientOptions,\n 'onOpen' | 'onClose' | 'onError'\n >;\n private readonly lazyMode: boolean;\n private readonly encoder: Encoder;\n\n constructor(opts: WebSocketClientOptions) {\n this.encoder = opts.experimental_encoder ?? jsonEncoder;\n // Initialize callbacks, connection parameters, and options.\n this.callbacks = {\n onOpen: opts.onOpen,\n onClose: opts.onClose,\n onError: opts.onError,\n };\n\n const lazyOptions = {\n ...lazyDefaults,\n ...opts.lazy,\n };\n\n // Set up inactivity timeout for lazy connections.\n this.inactivityTimeout = new ResettableTimeout(() => {\n if (\n this.requestManager.hasOutgoingRequests() ||\n this.requestManager.hasPendingRequests()\n ) {\n this.inactivityTimeout.reset();\n return;\n }\n\n this.close().catch(() => null);\n }, lazyOptions.closeMs);\n\n // Initialize the WebSocket connection.\n this.activeConnection = new WsConnection({\n WebSocketPonyfill: opts.WebSocket,\n urlOptions: opts,\n keepAlive: {\n ...keepAliveDefaults,\n ...opts.keepAlive,\n },\n encoder: this.encoder,\n });\n this.activeConnection.wsObservable.subscribe({\n next: (ws) => {\n if (!ws) return;\n this.setupWebSocketListeners(ws);\n },\n });\n this.reconnectRetryDelay = opts.retryDelayMs ?? exponentialBackoff;\n\n this.lazyMode = lazyOptions.enabled;\n\n this.connectionState = behaviorSubject<\n TRPCConnectionState<TRPCClientError<AnyTRPCRouter>>\n >({\n type: 'state',\n state: lazyOptions.enabled ? 'idle' : 'connecting',\n error: null,\n });\n\n // Automatically open the connection if lazy mode is disabled.\n if (!this.lazyMode) {\n this.open().catch(() => null);\n }\n }\n\n /**\n * Opens the WebSocket connection. Handles reconnection attempts and updates\n * the connection state accordingly.\n */\n private async open() {\n this.allowReconnect = true;\n if (this.connectionState.get().state === 'idle') {\n this.connectionState.next({\n type: 'state',\n state: 'connecting',\n error: null,\n });\n }\n\n try {\n await this.activeConnection.open();\n } catch (error) {\n this.reconnect(\n new TRPCWebSocketClosedError({\n message: 'Initialization error',\n cause: error,\n }),\n );\n return this.reconnecting;\n }\n }\n\n /**\n * Closes the WebSocket connection and stops managing requests.\n * Ensures all outgoing and pending requests are properly finalized.\n */\n public async close() {\n this.allowReconnect = false;\n this.inactivityTimeout.stop();\n\n const requestsToAwait: Promise<void>[] = [];\n for (const request of this.requestManager.getRequests()) {\n if (request.message.method === 'subscription') {\n request.callbacks.complete();\n } else if (request.state === 'outgoing') {\n request.callbacks.error(\n TRPCClientError.from(\n new TRPCWebSocketClosedError({\n message: 'Closed before connection was established',\n }),\n ),\n );\n } else {\n requestsToAwait.push(request.end);\n }\n }\n\n await Promise.all(requestsToAwait).catch(() => null);\n await this.activeConnection.close().catch(() => null);\n\n this.connectionState.next({\n type: 'state',\n state: 'idle',\n error: null,\n });\n }\n\n /**\n * Method to request the server.\n * Handles data transformation, batching of requests, and subscription lifecycle.\n *\n * @param op - The operation details including id, type, path, input and signal\n * @param transformer - Data transformer for serializing requests and deserializing responses\n * @param lastEventId - Optional ID of the last received event for subscriptions\n *\n * @returns An observable that emits operation results and handles cleanup\n */\n public request({\n op: { id, type, path, input, signal },\n transformer,\n lastEventId,\n }: {\n op: Pick<Operation, 'id' | 'type' | 'path' | 'input' | 'signal'>;\n transformer: CombinedDataTransformer;\n lastEventId?: string;\n }) {\n return observable<\n OperationResultEnvelope<unknown, TRPCClientError<AnyTRPCRouter>>,\n TRPCClientError<AnyTRPCRouter>\n >((observer) => {\n const abort = this.batchSend(\n {\n id,\n method: type,\n params: {\n input: transformer.input.serialize(input),\n path,\n lastEventId,\n },\n },\n {\n ...observer,\n next(event) {\n const transformed = transformResult(event, transformer.output);\n\n if (!transformed.ok) {\n observer.error(TRPCClientError.from(transformed.error));\n return;\n }\n\n observer.next({\n result: transformed.result,\n });\n },\n },\n );\n\n return () => {\n abort();\n\n if (type === 'subscription' && this.activeConnection.isOpen()) {\n this.send({\n id,\n method: 'subscription.stop',\n });\n }\n\n signal?.removeEventListener('abort', abort);\n };\n });\n }\n\n public get connection() {\n return backwardCompatibility(this.activeConnection);\n }\n\n /**\n * Manages the reconnection process for the WebSocket using retry logic.\n * Ensures that only one reconnection attempt is active at a time by tracking the current\n * reconnection state in the `reconnecting` promise.\n */\n private reconnecting: Promise<void> | null = null;\n private reconnect(closedError: TRPCWebSocketClosedError) {\n this.connectionState.next({\n type: 'state',\n state: 'connecting',\n error: TRPCClientError.from(closedError),\n });\n if (this.reconnecting) return;\n\n const tryReconnect = async (attemptIndex: number) => {\n try {\n await sleep(this.reconnectRetryDelay(attemptIndex));\n if (this.allowReconnect) {\n await this.activeConnection.close();\n await this.activeConnection.open();\n\n if (this.requestManager.hasPendingRequests()) {\n this.send(\n this.requestManager\n .getPendingRequests()\n .map(({ message }) => message),\n );\n }\n }\n this.reconnecting = null;\n } catch {\n await tryReconnect(attemptIndex + 1);\n }\n };\n\n this.reconnecting = tryReconnect(0);\n }\n\n private setupWebSocketListeners(ws: WebSocket) {\n const handleCloseOrError = (cause: unknown) => {\n const reqs = this.requestManager.getPendingRequests();\n for (const { message, callbacks } of reqs) {\n if (message.method === 'subscription') continue;\n\n callbacks.error(\n TRPCClientError.from(\n cause ??\n new TRPCWebSocketClosedError({\n message: 'WebSocket closed',\n cause,\n }),\n ),\n );\n this.requestManager.delete(message.id);\n }\n };\n\n ws.addEventListener('open', () => {\n run(async () => {\n if (this.lazyMode) {\n this.inactivityTimeout.start();\n }\n\n this.callbacks.onOpen?.();\n\n this.connectionState.next({\n type: 'state',\n state: 'pending',\n error: null,\n });\n }).catch((error) => {\n ws.close(3000);\n handleCloseOrError(error);\n });\n });\n\n ws.addEventListener('message', ({ data }) => {\n this.inactivityTimeout.reset();\n\n // Handle PING/PONG as text regardless of encoder\n if (['PING', 'PONG'].includes(data)) return;\n\n const incomingMessage = this.encoder.decode(\n data,\n ) as TRPCClientIncomingMessage;\n if ('method' in incomingMessage) {\n this.handleIncomingRequest(incomingMessage);\n return;\n }\n\n this.handleResponseMessage(incomingMessage);\n });\n\n ws.addEventListener('close', (event) => {\n handleCloseOrError(event);\n this.callbacks.onClose?.(event);\n\n if (!this.lazyMode || this.requestManager.hasPendingSubscriptions()) {\n this.reconnect(\n new TRPCWebSocketClosedError({\n message: 'WebSocket closed',\n cause: event,\n }),\n );\n }\n });\n\n ws.addEventListener('error', (event) => {\n handleCloseOrError(event);\n this.callbacks.onError?.(event);\n\n this.reconnect(\n new TRPCWebSocketClosedError({\n message: 'WebSocket closed',\n cause: event,\n }),\n );\n });\n }\n\n private handleResponseMessage(message: TRPCResponseMessage) {\n const request = this.requestManager.getPendingRequest(message.id);\n if (!request) return;\n\n request.callbacks.next(message);\n\n let completed = true;\n if ('result' in message && request.message.method === 'subscription') {\n if (message.result.type === 'data') {\n request.message.params.lastEventId = message.result.id;\n }\n\n if (message.result.type !== 'stopped') {\n completed = false;\n }\n }\n\n if (completed) {\n request.callbacks.complete();\n this.requestManager.delete(message.id);\n }\n }\n\n private handleIncomingRequest(message: TRPCClientIncomingRequest) {\n if (message.method === 'reconnect') {\n this.reconnect(\n new TRPCWebSocketClosedError({\n message: 'Server requested reconnect',\n }),\n );\n }\n }\n\n /**\n * Sends a message or batch of messages directly to the server.\n */\n private send(\n messageOrMessages: TRPCClientOutgoingMessage | TRPCClientOutgoingMessage[],\n ) {\n if (!this.activeConnection.isOpen()) {\n throw new Error('Active connection is not open');\n }\n\n const messages =\n messageOrMessages instanceof Array\n ? messageOrMessages\n : [messageOrMessages];\n this.activeConnection.ws.send(\n this.encoder.encode(messages.length === 1 ? messages[0] : messages),\n );\n }\n\n /**\n * Groups requests for batch sending.\n *\n * @returns A function to abort the batched request.\n */\n private batchSend(message: TRPCClientOutgoingMessage, callbacks: TCallbacks) {\n this.inactivityTimeout.reset();\n\n run(async () => {\n if (!this.activeConnection.isOpen()) {\n await this.open();\n }\n await sleep(0);\n\n if (!this.requestManager.hasOutgoingRequests()) return;\n\n this.send(this.requestManager.flush().map(({ message }) => message));\n }).catch((err) => {\n this.requestManager.delete(message.id);\n callbacks.error(TRPCClientError.from(err));\n });\n\n return this.requestManager.register(message, callbacks);\n }\n}\n","import type { Encoder } from './wsClient/encoder';\nimport { jsonEncoder } from './wsClient/encoder';\nimport type { WebSocketClientOptions } from './wsClient/options';\nimport { WsClient } from './wsClient/wsClient';\n\nexport function createWSClient(opts: WebSocketClientOptions) {\n return new WsClient(opts);\n}\n\nexport type TRPCWebSocketClient = ReturnType<typeof createWSClient>;\n\nexport { jsonEncoder, type Encoder, type WebSocketClientOptions };\n","import { observable } from '@trpc/server/observable';\nimport type {\n AnyRouter,\n inferClientTypes,\n} from '@trpc/server/unstable-core-do-not-import';\nimport type { TransformerOptions } from '../../unstable-internals';\nimport { getTransformer } from '../../unstable-internals';\nimport type { TRPCLink } from '../types';\nimport type {\n Encoder,\n TRPCWebSocketClient,\n WebSocketClientOptions,\n} from './createWsClient';\nimport { createWSClient, jsonEncoder } from './createWsClient';\n\nexport type WebSocketLinkOptions<TRouter extends AnyRouter> = {\n client: TRPCWebSocketClient;\n} & TransformerOptions<inferClientTypes<TRouter>>;\n\nexport function wsLink<TRouter extends AnyRouter>(\n opts: WebSocketLinkOptions<TRouter>,\n): TRPCLink<TRouter> {\n const { client } = opts;\n const transformer = getTransformer(opts.transformer);\n return () => {\n return ({ op }) => {\n return observable((observer) => {\n const connStateSubscription =\n op.type === 'subscription'\n ? client.connectionState.subscribe({\n next(result) {\n observer.next({\n result,\n context: op.context,\n });\n },\n })\n : null;\n\n const requestSubscription = client\n .request({\n op,\n transformer,\n })\n .subscribe(observer);\n\n return () => {\n requestSubscription.unsubscribe();\n connStateSubscription?.unsubscribe();\n };\n });\n };\n };\n}\n\nexport {\n createWSClient,\n jsonEncoder,\n type Encoder,\n type TRPCWebSocketClient,\n type WebSocketClientOptions,\n};\n","import type {\n inferObservableValue,\n Unsubscribable,\n} from '@trpc/server/observable';\nimport { observableToPromise, share } from '@trpc/server/observable';\nimport type {\n AnyRouter,\n inferAsyncIterableYield,\n InferrableClientTypes,\n Maybe,\n TypeError,\n} from '@trpc/server/unstable-core-do-not-import';\nimport { createChain } from '../links/internals/createChain';\nimport type { TRPCConnectionState } from '../links/internals/subscriptions';\nimport type {\n OperationContext,\n OperationLink,\n TRPCClientRuntime,\n TRPCLink,\n} from '../links/types';\nimport { TRPCClientError } from '../TRPCClientError';\n\ntype TRPCType = 'mutation' | 'query' | 'subscription';\nexport interface TRPCRequestOptions {\n /**\n * Pass additional context to links\n */\n context?: OperationContext;\n signal?: AbortSignal;\n}\n\nexport interface TRPCSubscriptionObserver<TValue, TError> {\n onStarted: (opts: { context: OperationContext | undefined }) => void;\n onData: (value: inferAsyncIterableYield<TValue>) => void;\n onError: (err: TError) => void;\n onStopped: () => void;\n onComplete: () => void;\n onConnectionStateChange: (state: TRPCConnectionState<TError>) => void;\n}\n\n/** @internal */\nexport type CreateTRPCClientOptions<TRouter extends InferrableClientTypes> = {\n links: TRPCLink<TRouter>[];\n transformer?: TypeError<'The transformer property has moved to httpLink/httpBatchLink/wsLink'>;\n};\n\nexport class TRPCUntypedClient<TInferrable extends InferrableClientTypes> {\n private readonly links: OperationLink<TInferrable>[];\n public readonly runtime: TRPCClientRuntime;\n private requestId: number;\n\n constructor(opts: CreateTRPCClientOptions<TInferrable>) {\n this.requestId = 0;\n\n this.runtime = {};\n\n // Initialize the links\n this.links = opts.links.map((link) => link(this.runtime));\n }\n\n private $request<TInput = unknown, TOutput = unknown>(opts: {\n type: TRPCType;\n input: TInput;\n path: string;\n context?: OperationContext;\n signal: Maybe<AbortSignal>;\n }) {\n const chain$ = createChain<AnyRouter, TInput, TOutput>({\n links: this.links as OperationLink<any, any, any>[],\n op: {\n ...opts,\n context: opts.context ?? {},\n id: ++this.requestId,\n },\n });\n return chain$.pipe(share());\n }\n\n private async requestAsPromise<TInput = unknown, TOutput = unknown>(opts: {\n type: TRPCType;\n input: TInput;\n path: string;\n context?: OperationContext;\n signal: Maybe<AbortSignal>;\n }): Promise<TOutput> {\n try {\n const req$ = this.$request<TInput, TOutput>(opts);\n type TValue = inferObservableValue<typeof req$>;\n\n const envelope = await observableToPromise<TValue>(req$);\n const data = (envelope.result as any).data;\n return data;\n } catch (err) {\n throw TRPCClientError.from(err as Error);\n }\n }\n public query(path: string, input?: unknown, opts?: TRPCRequestOptions) {\n return this.requestAsPromise<unknown, unknown>({\n type: 'query',\n path,\n input,\n context: opts?.context,\n signal: opts?.signal,\n });\n }\n public mutation(path: string, input?: unknown, opts?: TRPCRequestOptions) {\n return this.requestAsPromise<unknown, unknown>({\n type: 'mutation',\n path,\n input,\n context: opts?.context,\n signal: opts?.signal,\n });\n }\n public subscription(\n path: string,\n input: unknown,\n opts: Partial<\n TRPCSubscriptionObserver<unknown, TRPCClientError<AnyRouter>>\n > &\n TRPCRequestOptions,\n ): Unsubscribable {\n const observable$ = this.$request({\n type: 'subscription',\n path,\n input,\n context: opts.context,\n signal: opts.signal,\n });\n return observable$.subscribe({\n next(envelope) {\n switch (envelope.result.type) {\n case 'state': {\n opts.onConnectionStateChange?.(envelope.result);\n break;\n }\n case 'started': {\n opts.onStarted?.({\n context: envelope.context,\n });\n break;\n }\n case 'stopped': {\n opts.onStopped?.();\n break;\n }\n case 'data':\n case undefined: {\n opts.onData?.(envelope.result.data);\n break;\n }\n }\n },\n error(err) {\n opts.onError?.(err);\n },\n complete() {\n opts.onComplete?.();\n },\n });\n }\n}\n","import type { AnyRouter } from '@trpc/server/unstable-core-do-not-import';\nimport type { CreateTRPCClientOptions } from './internals/TRPCUntypedClient';\nimport { TRPCUntypedClient } from './internals/TRPCUntypedClient';\n\nexport function createTRPCUntypedClient<TRouter extends AnyRouter>(\n opts: CreateTRPCClientOptions<TRouter>,\n): TRPCUntypedClient<TRouter> {\n return new TRPCUntypedClient(opts);\n}\n\nexport type {\n CreateTRPCClientOptions,\n TRPCRequestOptions,\n} from './internals/TRPCUntypedClient';\nexport { TRPCUntypedClient } from './internals/TRPCUntypedClient';\n","/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport type { Unsubscribable } from '@trpc/server/observable';\nimport type {\n AnyProcedure,\n AnyRouter,\n inferClientTypes,\n inferProcedureInput,\n InferrableClientTypes,\n inferTransformedProcedureOutput,\n ProcedureType,\n RouterRecord,\n} from '@trpc/server/unstable-core-do-not-import';\nimport {\n createFlatProxy,\n createRecursiveProxy,\n} from '@trpc/server/unstable-core-do-not-import';\nimport type { CreateTRPCClientOptions } from './createTRPCUntypedClient';\nimport type { TRPCSubscriptionObserver } from './internals/TRPCUntypedClient';\nimport { TRPCUntypedClient } from './internals/TRPCUntypedClient';\nimport type { TRPCProcedureOptions } from './internals/types';\nimport type { TRPCClientError } from './TRPCClientError';\n\n/**\n * @public\n * @deprecated use {@link TRPCClient} instead, will be removed in v12\n **/\nexport type inferRouterClient<TRouter extends AnyRouter> = TRPCClient<TRouter>;\n\n/**\n * @public\n * @deprecated use {@link TRPCClient} instead, will be removed in v12\n **/\nexport type CreateTRPCClient<TRouter extends AnyRouter> = TRPCClient<TRouter>;\n\nconst untypedClientSymbol = Symbol.for('trpc_untypedClient');\n\n/**\n * @public\n **/\nexport type TRPCClient<TRouter extends AnyRouter> = DecoratedProcedureRecord<\n {\n transformer: TRouter['_def']['_config']['$types']['transformer'];\n errorShape: TRouter['_def']['_config']['$types']['errorShape'];\n },\n TRouter['_def']['record']\n> & {\n [untypedClientSymbol]: TRPCUntypedClient<TRouter>;\n};\n\n/** @internal */\nexport type TRPCResolverDef = {\n input: any;\n output: any;\n transformer: boolean;\n errorShape: any;\n};\n\ntype coerceAsyncGeneratorToIterable<T> =\n T extends AsyncGenerator<infer $T, infer $Return, infer $Next>\n ? AsyncIterable<$T, $Return, $Next>\n : T;\n\n/** @internal */\nexport type Resolver<TDef extends TRPCResolverDef> = (\n input: TDef['input'],\n opts?: TRPCProcedureOptions,\n) => Promise<coerceAsyncGeneratorToIterable<TDef['output']>>;\n\n/** @internal */\nexport type SubscriptionResolver<TDef extends TRPCResolverDef> = (\n input: TDef['input'],\n opts: Partial<\n TRPCSubscriptionObserver<TDef['output'], TRPCClientError<TDef>>\n > &\n TRPCProcedureOptions,\n) => Unsubscribable;\n\ntype DecorateProcedure<\n TType extends ProcedureType,\n TDef extends TRPCResolverDef,\n> = TType extends 'query'\n ? {\n query: Resolver<TDef>;\n }\n : TType extends 'mutation'\n ? {\n mutate: Resolver<TDef>;\n }\n : TType extends 'subscription'\n ? {\n subscribe: SubscriptionResolver<TDef>;\n }\n : never;\n\n/**\n * @internal\n */\ntype DecoratedProcedureRecord<\n TRoot extends InferrableClientTypes,\n TRecord extends RouterRecord,\n> = {\n [TKey in keyof TRecord]: TRecord[TKey] extends infer $Value\n ? $Value extends AnyProcedure\n ? DecorateProcedure<\n $Value['_def']['type'],\n {\n input: inferProcedureInput<$Value>;\n output: inferTransformedProcedureOutput<\n inferClientTypes<TRoot>,\n $Value\n >;\n errorShape: inferClientTypes<TRoot>['errorShape'];\n transformer: inferClientTypes<TRoot>['transformer'];\n }\n >\n : $Value extends RouterRecord\n ? DecoratedProcedureRecord<TRoot, $Value>\n : never\n : never;\n};\n\nconst clientCallTypeMap: Record<\n keyof DecorateProcedure<any, any>,\n ProcedureType\n> = {\n query: 'query',\n mutate: 'mutation',\n subscribe: 'subscription',\n};\n\n/** @internal */\nexport const clientCallTypeToProcedureType = (\n clientCallType: string,\n): ProcedureType => {\n return clientCallTypeMap[clientCallType as keyof typeof clientCallTypeMap];\n};\n\n/**\n * @internal\n */\nexport function createTRPCClientProxy<TRouter extends AnyRouter>(\n client: TRPCUntypedClient<TRouter>,\n): TRPCClient<TRouter> {\n const proxy = createRecursiveProxy<TRPCClient<TRouter>>(({ path, args }) => {\n const pathCopy = [...path];\n const procedureType = clientCallTypeToProcedureType(pathCopy.pop()!);\n\n const fullPath = pathCopy.join('.');\n\n return (client[procedureType] as any)(fullPath, ...(args as any));\n });\n return createFlatProxy<TRPCClient<TRouter>>((key) => {\n if (key === untypedClientSymbol) {\n return client;\n }\n return proxy[key];\n });\n}\n\nexport function createTRPCClient<TRouter extends AnyRouter>(\n opts: CreateTRPCClientOptions<TRouter>,\n): TRPCClient<TRouter> {\n const client = new TRPCUntypedClient(opts);\n const proxy = createTRPCClientProxy<TRouter>(client);\n return proxy;\n}\n\n/**\n * Get an untyped client from a proxy client\n * @internal\n */\nexport function getUntypedClient<TRouter extends AnyRouter>(\n client: TRPCClient<TRouter>,\n): TRPCUntypedClient<TRouter> {\n return client[untypedClientSymbol];\n}\n","import type { AnyRouter, ProcedureType } from '@trpc/server';\nimport { observable } from '@trpc/server/observable';\nimport type { TRPCErrorShape, TRPCResponse } from '@trpc/server/rpc';\nimport type { AnyClientTypes } from '@trpc/server/unstable-core-do-not-import';\nimport { jsonlStreamConsumer } from '@trpc/server/unstable-core-do-not-import';\nimport type { BatchLoader } from '../internals/dataLoader';\nimport { dataLoader } from '../internals/dataLoader';\nimport { allAbortSignals, raceAbortSignals } from '../internals/signals';\nimport type { NonEmptyArray } from '../internals/types';\nimport { TRPCClientError } from '../TRPCClientError';\nimport type { HTTPBatchLinkOptions } from './HTTPBatchLinkOptions';\nimport type { HTTPResult } from './internals/httpUtils';\nimport {\n fetchHTTPResponse,\n getBody,\n getUrl,\n resolveHTTPLinkOptions,\n} from './internals/httpUtils';\nimport type { Operation, TRPCLink } from './types';\n\nexport type HTTPBatchStreamLinkOptions<TRoot extends AnyClientTypes> =\n HTTPBatchLinkOptions<TRoot> & {\n /**\n * Which header to use to signal the server that the client wants a streaming response.\n * - `'trpc-accept'` (default): sends `trpc-accept: application/jsonl` header\n * - `'accept'`: sends `Accept: application/jsonl` header, which can avoid CORS preflight for cross-origin streaming queries. Be aware that `application/jsonl` is not an official MIME type and so this is not completely spec-compliant - you should test that your infrastructure supports this value.\n * @default 'trpc-accept'\n */\n streamHeader?: 'trpc-accept' | 'accept';\n };\n\n/**\n * @see https://trpc.io/docs/client/links/httpBatchStreamLink\n */\nexport function httpBatchStreamLink<TRouter extends AnyRouter>(\n opts: HTTPBatchStreamLinkOptions<TRouter['_def']['_config']['$types']>,\n): TRPCLink<TRouter> {\n const resolvedOpts = resolveHTTPLinkOptions(opts);\n const maxURLLength = opts.maxURLLength ?? Infinity;\n const maxItems = opts.maxItems ?? Infinity;\n\n return () => {\n const batchLoader = (\n type: ProcedureType,\n ): BatchLoader<Operation, HTTPResult> => {\n return {\n validate(batchOps) {\n if (maxURLLength === Infinity && maxItems === Infinity) {\n // escape hatch for quick calcs\n return true;\n }\n if (batchOps.length > maxItems) {\n return false;\n }\n const path = batchOps.map((op) => op.path).join(',');\n const inputs = batchOps.map((op) => op.input);\n\n const url = getUrl({\n ...resolvedOpts,\n type,\n path,\n inputs,\n signal: null,\n });\n\n return url.length <= maxURLLength;\n },\n async fetch(batchOps) {\n const path = batchOps.map((op) => op.path).join(',');\n const inputs = batchOps.map((op) => op.input);\n\n const batchSignals = allAbortSignals(\n ...batchOps.map((op) => op.signal),\n );\n const abortController = new AbortController();\n\n const responsePromise = fetchHTTPResponse({\n ...resolvedOpts,\n signal: raceAbortSignals(batchSignals, abortController.signal),\n type,\n contentTypeHeader: 'application/json',\n trpcAcceptHeader: 'application/jsonl',\n trpcAcceptHeaderKey: opts.streamHeader ?? 'trpc-accept',\n getUrl,\n getBody,\n inputs,\n path,\n headers() {\n if (!opts.headers) {\n return {};\n }\n if (typeof opts.headers === 'function') {\n return opts.headers({\n opList: batchOps as NonEmptyArray<Operation>,\n });\n }\n return opts.headers;\n },\n });\n\n const res = await responsePromise;\n\n if (!res.ok) {\n // Server returned a non-2xx response (e.g. batching disabled).\n // The body is plain JSON, not JSONL, so parse it directly and\n // propagate the same error to every operation in the batch.\n const json = (await res.json()) as TRPCResponse;\n if ('error' in json) {\n json.error = resolvedOpts.transformer.output.deserialize(\n json.error,\n );\n }\n\n return batchOps.map(\n (): Promise<HTTPResult> =>\n Promise.resolve({\n json,\n meta: {\n response: res,\n },\n }),\n );\n }\n\n const [head] = await jsonlStreamConsumer<\n Record<string, Promise<any>>\n >({\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n from: res.body!,\n deserialize: (data) =>\n resolvedOpts.transformer.output.deserialize(data),\n // onError: console.error,\n formatError(opts) {\n const error = opts.error as TRPCErrorShape;\n return TRPCClientError.from({\n error,\n });\n },\n abortController,\n });\n const promises = Object.keys(batchOps).map(\n async (key): Promise<HTTPResult> => {\n let json: TRPCResponse = await Promise.resolve(head[key]);\n\n if ('result' in json) {\n /**\n * Not very pretty, but we need to unwrap nested data as promises\n * Our stream producer will only resolve top-level async values or async values that are directly nested in another async value\n */\n const result = await Promise.resolve(json.result);\n json = {\n result: {\n data: await Promise.resolve(result.data),\n },\n };\n }\n\n return {\n json,\n meta: {\n response: res,\n },\n };\n },\n );\n return promises;\n },\n };\n };\n\n const query = dataLoader(batchLoader('query'));\n const mutation = dataLoader(batchLoader('mutation'));\n\n const loaders = { query, mutation };\n return ({ op }) => {\n return observable((observer) => {\n /* istanbul ignore if -- @preserve */\n if (op.type === 'subscription') {\n throw new Error(\n 'Subscriptions are unsupported by `httpBatchStreamLink` - use `httpSubscriptionLink` or `wsLink`',\n );\n }\n const loader = loaders[op.type];\n const promise = loader.load(op);\n\n let _res = undefined as HTTPResult | undefined;\n promise\n .then((res) => {\n _res = res;\n if ('error' in res.json) {\n observer.error(\n TRPCClientError.from(res.json, {\n meta: res.meta,\n }),\n );\n return;\n } else if ('result' in res.json) {\n observer.next({\n context: res.meta,\n result: res.json.result,\n });\n observer.complete();\n return;\n }\n\n observer.complete();\n })\n .catch((err) => {\n observer.error(\n TRPCClientError.from(err, {\n meta: _res?.meta,\n }),\n );\n });\n\n return () => {\n // noop\n };\n });\n };\n };\n}\n\n/**\n * @deprecated use {@link httpBatchStreamLink} instead\n */\nexport const unstable_httpBatchStreamLink = httpBatchStreamLink;\n","export function inputWithTrackedEventId(\n input: unknown,\n lastEventId: string | undefined,\n) {\n if (!lastEventId) {\n return input;\n }\n if (input != null && typeof input !== 'object') {\n return input;\n }\n return {\n ...(input ?? {}),\n lastEventId,\n };\n}\n","function _asyncIterator(r) {\n var n,\n t,\n o,\n e = 2;\n for (\"undefined\" != typeof Symbol && (t = Symbol.asyncIterator, o = Symbol.iterator); e--;) {\n if (t && null != (n = r[t])) return n.call(r);\n if (o && null != (n = r[o])) return new AsyncFromSyncIterator(n.call(r));\n t = \"@@asyncIterator\", o = \"@@iterator\";\n }\n throw new TypeError(\"Object is not async iterable\");\n}\nfunction AsyncFromSyncIterator(r) {\n function AsyncFromSyncIteratorContinuation(r) {\n if (Object(r) !== r) return Promise.reject(new TypeError(r + \" is not an object.\"));\n var n = r.done;\n return Promise.resolve(r.value).then(function (r) {\n return {\n value: r,\n done: n\n };\n });\n }\n return AsyncFromSyncIterator = function AsyncFromSyncIterator(r) {\n this.s = r, this.n = r.next;\n }, AsyncFromSyncIterator.prototype = {\n s: null,\n n: null,\n next: function next() {\n return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments));\n },\n \"return\": function _return(r) {\n var n = this.s[\"return\"];\n return void 0 === n ? Promise.resolve({\n value: r,\n done: !0\n }) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments));\n },\n \"throw\": function _throw(r) {\n var n = this.s[\"return\"];\n return void 0 === n ? Promise.reject(r) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments));\n }\n }, new AsyncFromSyncIterator(r);\n}\nmodule.exports = _asyncIterator, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","import { behaviorSubject, observable } from '@trpc/server/observable';\nimport type { TRPCErrorShape, TRPCResult } from '@trpc/server/rpc';\nimport type {\n AnyClientTypes,\n EventSourceLike,\n inferClientTypes,\n InferrableClientTypes,\n} from '@trpc/server/unstable-core-do-not-import';\nimport {\n retryableRpcCodes,\n run,\n sseStreamConsumer,\n} from '@trpc/server/unstable-core-do-not-import';\nimport { inputWithTrackedEventId } from '../internals/inputWithTrackedEventId';\nimport { raceAbortSignals } from '../internals/signals';\nimport { TRPCClientError } from '../TRPCClientError';\nimport type { TRPCConnectionState } from '../unstable-internals';\nimport { getTransformer, type TransformerOptions } from '../unstable-internals';\nimport { getUrl } from './internals/httpUtils';\nimport {\n resultOf,\n type UrlOptionsWithConnectionParams,\n} from './internals/urlWithConnectionParams';\nimport type { Operation, TRPCLink } from './types';\n\nasync function urlWithConnectionParams(\n opts: UrlOptionsWithConnectionParams,\n): Promise<string> {\n let url = await resultOf(opts.url);\n if (opts.connectionParams) {\n const params = await resultOf(opts.connectionParams);\n\n const prefix = url.includes('?') ? '&' : '?';\n url +=\n prefix + 'connectionParams=' + encodeURIComponent(JSON.stringify(params));\n }\n\n return url;\n}\n\ntype HTTPSubscriptionLinkOptions<\n TRoot extends AnyClientTypes,\n TEventSource extends EventSourceLike.AnyConstructor = typeof EventSource,\n> = {\n /**\n * EventSource ponyfill\n */\n EventSource?: TEventSource;\n /**\n * EventSource options or a callback that returns them\n */\n eventSourceOptions?:\n | EventSourceLike.InitDictOf<TEventSource>\n | ((opts: {\n op: Operation;\n }) =>\n | EventSourceLike.InitDictOf<TEventSource>\n | Promise<EventSourceLike.InitDictOf<TEventSource>>);\n} & TransformerOptions<TRoot> &\n UrlOptionsWithConnectionParams;\n\n/**\n * @see https://trpc.io/docs/client/links/httpSubscriptionLink\n */\nexport function httpSubscriptionLink<\n TInferrable extends InferrableClientTypes,\n TEventSource extends EventSourceLike.AnyConstructor,\n>(\n opts: HTTPSubscriptionLinkOptions<\n inferClientTypes<TInferrable>,\n TEventSource\n >,\n): TRPCLink<TInferrable> {\n const transformer = getTransformer(opts.transformer);\n\n return () => {\n return ({ op }) => {\n return observable((observer) => {\n const { type, path, input } = op;\n\n /* istanbul ignore if -- @preserve */\n if (type !== 'subscription') {\n throw new Error('httpSubscriptionLink only supports subscriptions');\n }\n\n let lastEventId: string | undefined = undefined;\n const ac = new AbortController();\n const signal = raceAbortSignals(op.signal, ac.signal);\n const eventSourceStream = sseStreamConsumer<{\n EventSource: TEventSource;\n data: Partial<{\n id?: string;\n data: unknown;\n }>;\n error: TRPCErrorShape;\n }>({\n url: async () =>\n getUrl({\n transformer,\n url: await urlWithConnectionParams(opts),\n input: inputWithTrackedEventId(input, lastEventId),\n path,\n type,\n signal: null,\n }),\n init: () => resultOf(opts.eventSourceOptions, { op }),\n signal,\n deserialize: (data) => transformer.output.deserialize(data),\n EventSource:\n opts.EventSource ??\n (globalThis.EventSource as never as TEventSource),\n });\n\n const connectionState = behaviorSubject<\n TRPCConnectionState<TRPCClientError<any>>\n >({\n type: 'state',\n state: 'connecting',\n error: null,\n });\n\n const connectionSub = connectionState.subscribe({\n next(state) {\n observer.next({\n result: state,\n });\n },\n });\n run(async () => {\n for await (const chunk of eventSourceStream) {\n switch (chunk.type) {\n case 'ping':\n // do nothing\n break;\n case 'data':\n const chunkData = chunk.data;\n\n let result: TRPCResult<unknown>;\n if (chunkData.id) {\n // if the `tracked()`-helper is used, we always have an `id` field\n lastEventId = chunkData.id;\n result = {\n id: chunkData.id,\n data: chunkData,\n };\n } else {\n result = {\n data: chunkData.data,\n };\n }\n\n observer.next({\n result,\n context: {\n eventSource: chunk.eventSource,\n },\n });\n break;\n case 'connected': {\n observer.next({\n result: {\n type: 'started',\n },\n context: {\n eventSource: chunk.eventSource,\n },\n });\n connectionState.next({\n type: 'state',\n state: 'pending',\n error: null,\n });\n break;\n }\n case 'serialized-error': {\n const error = TRPCClientError.from({ error: chunk.error });\n\n if (retryableRpcCodes.includes(chunk.error.code)) {\n //\n connectionState.next({\n type: 'state',\n state: 'connecting',\n error,\n });\n break;\n }\n //\n // non-retryable error, cancel the subscription\n throw error;\n }\n case 'connecting': {\n const lastState = connectionState.get();\n\n const error = chunk.event && TRPCClientError.from(chunk.event);\n if (!error && lastState.state === 'connecting') {\n break;\n }\n\n connectionState.next({\n type: 'state',\n state: 'connecting',\n error,\n });\n break;\n }\n case 'timeout': {\n connectionState.next({\n type: 'state',\n state: 'connecting',\n error: new TRPCClientError(\n `Timeout of ${chunk.ms}ms reached while waiting for a response`,\n ),\n });\n }\n }\n }\n observer.next({\n result: {\n type: 'stopped',\n },\n });\n connectionState.next({\n type: 'state',\n state: 'idle',\n error: null,\n });\n observer.complete();\n }).catch((error) => {\n observer.error(TRPCClientError.from(error));\n });\n\n return () => {\n observer.complete();\n ac.abort();\n connectionSub.unsubscribe();\n };\n });\n };\n };\n}\n\n/**\n * @deprecated use {@link httpSubscriptionLink} instead\n */\nexport const unstable_httpSubscriptionLink = httpSubscriptionLink;\n","/* istanbul ignore file -- @preserve */\n// We're not actually exporting this link\nimport type { Unsubscribable } from '@trpc/server/observable';\nimport { observable } from '@trpc/server/observable';\nimport type { InferrableClientTypes } from '@trpc/server/unstable-core-do-not-import';\nimport { inputWithTrackedEventId } from '../internals/inputWithTrackedEventId';\nimport type { TRPCClientError } from '../TRPCClientError';\nimport type { Operation, TRPCLink } from './types';\n\ninterface RetryLinkOptions<TInferrable extends InferrableClientTypes> {\n /**\n * The retry function\n */\n retry: (opts: RetryFnOptions<TInferrable>) => boolean;\n /**\n * The delay between retries in ms (defaults to 0)\n */\n retryDelayMs?: (attempt: number) => number;\n}\n\ninterface RetryFnOptions<TInferrable extends InferrableClientTypes> {\n /**\n * The operation that failed\n */\n op: Operation;\n /**\n * The error that occurred\n */\n error: TRPCClientError<TInferrable>;\n /**\n * The number of attempts that have been made (including the first call)\n */\n attempts: number;\n}\n\n/**\n * @see https://trpc.io/docs/v11/client/links/retryLink\n */\nexport function retryLink<TInferrable extends InferrableClientTypes>(\n opts: RetryLinkOptions<TInferrable>,\n): TRPCLink<TInferrable> {\n // initialized config\n return () => {\n // initialized in app\n return (callOpts) => {\n // initialized for request\n return observable((observer) => {\n let next$: Unsubscribable;\n let callNextTimeout: ReturnType<typeof setTimeout> | undefined =\n undefined;\n\n let lastEventId: string | undefined = undefined;\n\n attempt(1);\n\n function opWithLastEventId() {\n const op = callOpts.op;\n if (!lastEventId) {\n return op;\n }\n\n return {\n ...op,\n input: inputWithTrackedEventId(op.input, lastEventId),\n };\n }\n\n function attempt(attempts: number) {\n const op = opWithLastEventId();\n\n next$ = callOpts.next(op).subscribe({\n error(error) {\n const shouldRetry = opts.retry({\n op,\n attempts,\n error,\n });\n if (!shouldRetry) {\n observer.error(error);\n return;\n }\n const delayMs = opts.retryDelayMs?.(attempts) ?? 0;\n\n if (delayMs <= 0) {\n attempt(attempts + 1);\n return;\n }\n callNextTimeout = setTimeout(\n () => attempt(attempts + 1),\n delayMs,\n );\n },\n next(envelope) {\n //\n if (\n (!envelope.result.type || envelope.result.type === 'data') &&\n envelope.result.id\n ) {\n //\n lastEventId = envelope.result.id;\n }\n\n observer.next(envelope);\n },\n complete() {\n observer.complete();\n },\n });\n }\n return () => {\n next$.unsubscribe();\n clearTimeout(callNextTimeout);\n };\n });\n };\n };\n}\n","function _usingCtx() {\n var r = \"function\" == typeof SuppressedError ? SuppressedError : function (r, e) {\n var n = Error();\n return n.name = \"SuppressedError\", n.error = r, n.suppressed = e, n;\n },\n e = {},\n n = [];\n function using(r, e) {\n if (null != e) {\n if (Object(e) !== e) throw new TypeError(\"using declarations can only be used with objects, functions, null, or undefined.\");\n if (r) var o = e[Symbol.asyncDispose || Symbol[\"for\"](\"Symbol.asyncDispose\")];\n if (void 0 === o && (o = e[Symbol.dispose || Symbol[\"for\"](\"Symbol.dispose\")], r)) var t = o;\n if (\"function\" != typeof o) throw new TypeError(\"Object is not disposable.\");\n t && (o = function o() {\n try {\n t.call(e);\n } catch (r) {\n return Promise.reject(r);\n }\n }), n.push({\n v: e,\n d: o,\n a: r\n });\n } else r && n.push({\n d: e,\n a: r\n });\n return e;\n }\n return {\n e: e,\n u: using.bind(null, !1),\n a: using.bind(null, !0),\n d: function d() {\n var o,\n t = this.e,\n s = 0;\n function next() {\n for (; o = n.pop();) try {\n if (!o.a && 1 === s) return s = 0, n.push(o), Promise.resolve().then(next);\n if (o.d) {\n var r = o.d.call(o.v);\n if (o.a) return s |= 2, Promise.resolve(r).then(next, err);\n } else s |= 1;\n } catch (r) {\n return err(r);\n }\n if (1 === s) return t !== e ? Promise.reject(t) : Promise.resolve();\n if (t !== e) throw t;\n }\n function err(n) {\n return t = t !== e ? new r(n, t) : n, next();\n }\n return next();\n }\n };\n}\nmodule.exports = _usingCtx, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _OverloadYield(e, d) {\n this.v = e, this.k = d;\n}\nmodule.exports = _OverloadYield, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var OverloadYield = require(\"./OverloadYield.js\");\nfunction _awaitAsyncGenerator(e) {\n return new OverloadYield(e, 0);\n}\nmodule.exports = _awaitAsyncGenerator, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var OverloadYield = require(\"./OverloadYield.js\");\nfunction _wrapAsyncGenerator(e) {\n return function () {\n return new AsyncGenerator(e.apply(this, arguments));\n };\n}\nfunction AsyncGenerator(e) {\n var r, t;\n function resume(r, t) {\n try {\n var n = e[r](t),\n o = n.value,\n u = o instanceof OverloadYield;\n Promise.resolve(u ? o.v : o).then(function (t) {\n if (u) {\n var i = \"return\" === r ? \"return\" : \"next\";\n if (!o.k || t.done) return resume(i, t);\n t = e[i](t).value;\n }\n settle(n.done ? \"return\" : \"normal\", t);\n }, function (e) {\n resume(\"throw\", e);\n });\n } catch (e) {\n settle(\"throw\", e);\n }\n }\n function settle(e, n) {\n switch (e) {\n case \"return\":\n r.resolve({\n value: n,\n done: !0\n });\n break;\n case \"throw\":\n r.reject(n);\n break;\n default:\n r.resolve({\n value: n,\n done: !1\n });\n }\n (r = r.next) ? resume(r.key, r.arg) : t = null;\n }\n this._invoke = function (e, n) {\n return new Promise(function (o, u) {\n var i = {\n key: e,\n arg: n,\n resolve: o,\n reject: u,\n next: null\n };\n t ? t = t.next = i : (r = t = i, resume(e, n));\n });\n }, \"function\" != typeof e[\"return\"] && (this[\"return\"] = void 0);\n}\nAsyncGenerator.prototype[\"function\" == typeof Symbol && Symbol.asyncIterator || \"@@asyncIterator\"] = function () {\n return this;\n}, AsyncGenerator.prototype.next = function (e) {\n return this._invoke(\"next\", e);\n}, AsyncGenerator.prototype[\"throw\"] = function (e) {\n return this._invoke(\"throw\", e);\n}, AsyncGenerator.prototype[\"return\"] = function (e) {\n return this._invoke(\"return\", e);\n};\nmodule.exports = _wrapAsyncGenerator, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","import {\n getTRPCErrorFromUnknown,\n getTRPCErrorShape,\n isTrackedEnvelope,\n} from '@trpc/server';\nimport { behaviorSubject, observable } from '@trpc/server/observable';\nimport { TRPC_ERROR_CODES_BY_KEY, type TRPCResult } from '@trpc/server/rpc';\nimport {\n callProcedure,\n isAbortError,\n isAsyncIterable,\n iteratorResource,\n makeResource,\n retryableRpcCodes,\n run,\n type AnyRouter,\n type ErrorHandlerOptions,\n type inferClientTypes,\n type inferRouterContext,\n} from '@trpc/server/unstable-core-do-not-import';\nimport { inputWithTrackedEventId } from '../internals/inputWithTrackedEventId';\nimport { abortSignalToPromise, raceAbortSignals } from '../internals/signals';\nimport { getTransformer } from '../internals/transformer';\nimport type { TransformerOptions } from '../internals/transformer';\nimport { isTRPCClientError, TRPCClientError } from '../TRPCClientError';\nimport type { TRPCConnectionState } from './internals/subscriptions';\nimport type { TRPCLink } from './types';\n\nexport type LocalLinkOptions<TRouter extends AnyRouter> = {\n router: TRouter;\n createContext: () => Promise<inferRouterContext<TRouter>>;\n onError?: (opts: ErrorHandlerOptions<inferRouterContext<TRouter>>) => void;\n} & TransformerOptions<inferClientTypes<TRouter>>;\n\n/**\n * localLink is a terminating link that allows you to make tRPC procedure calls directly in your application without going through HTTP.\n *\n * @see https://trpc.io/docs/links/localLink\n */\nexport function unstable_localLink<TRouter extends AnyRouter>(\n opts: LocalLinkOptions<TRouter>,\n): TRPCLink<TRouter> {\n const transformer = getTransformer(opts.transformer);\n\n const transformChunk = (chunk: unknown) => {\n if (opts.transformer) {\n // assume transformer will do the right thing\n return chunk;\n }\n // Special case for undefined, because `JSON.stringify(undefined)` throws\n if (chunk === undefined) {\n return chunk;\n }\n const serialized = JSON.stringify(transformer.input.serialize(chunk));\n const deserialized = JSON.parse(transformer.output.deserialize(serialized));\n return deserialized;\n };\n\n return () =>\n ({ op }) =>\n observable((observer) => {\n let ctx: inferRouterContext<TRouter> | undefined = undefined;\n const ac = new AbortController();\n\n const signal = raceAbortSignals(op.signal, ac.signal);\n const signalPromise = abortSignalToPromise(signal);\n\n signalPromise.catch(() => {\n // prevent unhandled rejection\n });\n\n let input = op.input;\n async function runProcedure(newInput: unknown): Promise<unknown> {\n input = newInput;\n\n ctx = await opts.createContext();\n\n return callProcedure({\n router: opts.router,\n path: op.path,\n getRawInput: async () => newInput,\n ctx,\n type: op.type,\n signal,\n batchIndex: 0,\n });\n }\n\n function onErrorCallback(cause: unknown) {\n if (isAbortError(cause)) {\n return;\n }\n opts.onError?.({\n error: getTRPCErrorFromUnknown(cause),\n type: op.type,\n path: op.path,\n input,\n ctx,\n });\n }\n\n function coerceToTRPCClientError(cause: unknown) {\n if (isTRPCClientError<TRouter>(cause)) {\n return cause;\n }\n const error = getTRPCErrorFromUnknown(cause);\n\n const shape = getTRPCErrorShape({\n config: opts.router._def._config,\n ctx,\n error,\n input,\n path: op.path,\n type: op.type,\n });\n return TRPCClientError.from(\n { error: transformChunk(shape) },\n { cause: cause instanceof Error ? cause : undefined },\n );\n }\n\n run(async () => {\n switch (op.type) {\n case 'query':\n case 'mutation': {\n const result = await runProcedure(op.input);\n if (!isAsyncIterable(result)) {\n observer.next({\n result: { data: transformChunk(result) },\n });\n observer.complete();\n break;\n }\n\n observer.next({\n result: {\n data: (async function* () {\n await using iterator = iteratorResource(result);\n using _finally = makeResource({}, () => {\n observer.complete();\n });\n try {\n while (true) {\n const res = await Promise.race([\n iterator.next(),\n signalPromise,\n ]);\n if (res.done) {\n return transformChunk(res.value);\n }\n yield transformChunk(res.value);\n }\n } catch (cause) {\n onErrorCallback(cause);\n throw coerceToTRPCClientError(cause);\n }\n })(),\n },\n });\n break;\n }\n case 'subscription': {\n const connectionState = behaviorSubject<\n TRPCConnectionState<TRPCClientError<any>>\n >({\n type: 'state',\n state: 'connecting',\n error: null,\n });\n\n const connectionSub = connectionState.subscribe({\n next(state) {\n observer.next({\n result: state,\n });\n },\n });\n let lastEventId: string | undefined = undefined;\n\n using _finally = makeResource({}, async () => {\n observer.complete();\n\n connectionState.next({\n type: 'state',\n state: 'idle',\n error: null,\n });\n connectionSub.unsubscribe();\n });\n while (true) {\n const result = await runProcedure(\n inputWithTrackedEventId(op.input, lastEventId),\n );\n if (!isAsyncIterable(result)) {\n throw new Error('Expected an async iterable');\n }\n await using iterator = iteratorResource(result);\n\n observer.next({\n result: {\n type: 'started',\n },\n });\n connectionState.next({\n type: 'state',\n state: 'pending',\n error: null,\n });\n\n // Use a while loop to handle errors and reconnects\n while (true) {\n let res;\n try {\n res = await Promise.race([iterator.next(), signalPromise]);\n } catch (cause) {\n if (isAbortError(cause)) {\n return;\n }\n const error = getTRPCErrorFromUnknown(cause);\n\n if (\n !retryableRpcCodes.includes(\n TRPC_ERROR_CODES_BY_KEY[error.code],\n )\n ) {\n throw coerceToTRPCClientError(error);\n }\n\n onErrorCallback(error);\n connectionState.next({\n type: 'state',\n state: 'connecting',\n error: coerceToTRPCClientError(error),\n });\n\n break;\n }\n\n if (res.done) {\n return;\n }\n let chunk: TRPCResult<unknown>;\n if (isTrackedEnvelope(res.value)) {\n lastEventId = res.value[0];\n\n chunk = {\n id: res.value[0],\n data: {\n id: res.value[0],\n data: res.value[1],\n },\n };\n } else {\n chunk = {\n data: res.value,\n };\n }\n\n observer.next({\n result: {\n ...chunk,\n data: transformChunk(chunk.data),\n },\n });\n }\n }\n break;\n }\n }\n }).catch((cause) => {\n onErrorCallback(cause);\n observer.error(coerceToTRPCClientError(cause));\n });\n\n return () => {\n ac.abort();\n };\n });\n}\n/**\n * @deprecated Renamed to `unstable_localLink`. This alias will be removed in a future major release.\n */\nexport const experimental_localLink: typeof unstable_localLink =\n unstable_localLink;\n","import type { AppRouter } from \"@oopst/api\";\nimport { createTRPCClient, httpBatchLink, type TRPCClient } from \"@trpc/client\";\n\nconst AUTHORIZATION_HEADER = \"Authorization\";\n\ntype CreateClientOptions = {\n\ttoken: string;\n\tserverUrl: string;\n\t/** Allow tests to inject a fetch mock; defaults to global fetch (Node 24+). */\n\tfetch?: typeof fetch;\n};\n\nfunction createClient(options: CreateClientOptions): TRPCClient<AppRouter> {\n\treturn createTRPCClient<AppRouter>({\n\t\tlinks: [\n\t\t\thttpBatchLink({\n\t\t\t\turl: `${stripTrailingSlash(options.serverUrl)}/trpc`,\n\t\t\t\theaders: () => ({\n\t\t\t\t\t[AUTHORIZATION_HEADER]: `Bearer ${options.token}`,\n\t\t\t\t}),\n\t\t\t\tfetch: options.fetch ?? fetch,\n\t\t\t}),\n\t\t],\n\t});\n}\n\nfunction stripTrailingSlash(url: string): string {\n\treturn url.endsWith(\"/\") ? url.slice(0, -1) : url;\n}\n\nexport type { CreateClientOptions };\nexport { createClient };\n","import type { AppRouter } from \"@oopst/api\";\nimport type { ParsedBucket } from \"@oopst/parsers\";\nimport type { TRPCClient } from \"@trpc/client\";\nimport { aggregateUsage, type UsageBatch } from \"./aggregate\";\nimport { createClient } from \"./client\";\nimport { EXIT, type ExitCode, isNetworkError, isTrpcUnauthorized, SyncError } from \"./errors\";\n\ntype Logger = {\n\tinfo: (msg: string) => void;\n\terror: (msg: string) => void;\n};\n\ntype ParserBundle = {\n\tcodex: AsyncIterable<ParsedBucket>;\n\tclaudeCode: AsyncIterable<ParsedBucket>;\n\tpi: AsyncIterable<ParsedBucket>;\n\thermes: AsyncIterable<ParsedBucket>;\n\topencode: AsyncIterable<ParsedBucket>;\n};\n\ntype ParserFactoryContext = {\n\tcutoff: Date;\n\tdevice: string;\n};\n\ntype RunSyncOptions = {\n\ttoken: string;\n\tdevice: string;\n\tserverUrl: string;\n\tlookbackDays: number;\n\tharness: ParsedBucket[\"harness\"] | undefined;\n\tdryRun: boolean;\n\tverbose: boolean;\n\tcolor?: boolean;\n\tlogger: Logger;\n\t/**\n\t * DI seam: injectors supply a parser bundle keyed on the (cutoff, device).\n\t * The CLI entrypoint passes a factory that drives the real local harness parsers.\n\t * Tests pass a factory returning fixture async iterables.\n\t */\n\tparserFactory: (ctx: ParserFactoryContext) => ParserBundle;\n\t/** Signal that source files were found on disk even though parsing yielded nothing. */\n\tsourcesExistedHint?: boolean;\n\t/** Optional override; defaults to globalThis.fetch. */\n\tfetch?: typeof fetch;\n\t/** Optional override for tests that need a constructed client. */\n\tclient?: TRPCClient<AppRouter>;\n};\n\ntype RunSyncResult = {\n\texitCode: ExitCode;\n\tbatchesUploaded: number;\n\tbucketsUploaded: number;\n\tsessionsUploaded: number;\n};\n\nconst HOURS_PER_DAY = 24;\nconst MINUTES_PER_HOUR = 60;\nconst SECONDS_PER_MINUTE = 60;\nconst MS_PER_SECOND = 1000;\nconst SYNC_BATCH_SIZE = 500;\nconst MS_PER_DAY = HOURS_PER_DAY * MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MS_PER_SECOND;\nconst SCAN_PROGRESS_SESSION_STEP = 500;\n\ntype SelectedSource = {\n\tlabel: string;\n\tsource: AsyncIterable<ParsedBucket>;\n};\n\ntype PendingNext<T> = {\n\tindex: number;\n\tresult: IteratorResult<T>;\n};\n\n/**\n * Run one CLI sync cycle: fetch watermark, parse local sources newer than\n * (watermark - lookbackDays), aggregate to hourly buckets, batch-upload to\n * the server. Returns an exit-code result; callers map this to process.exit.\n *\n * Exit codes (also in src/sync/errors.ts):\n * 0 success\n * 1 zero buckets produced but parser reported source files existed\n * 2 tRPC UNAUTHORIZED — token rejected\n * 3 network error reaching the server\n * 4 missing / invalid CLI arguments\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: orchestration function inherently combines multiple flow paths\nasync function runSync(options: RunSyncOptions): Promise<RunSyncResult> {\n\tif (!options.token) {\n\t\tthrow new SyncError(EXIT.invalidArguments, \"missing --token\");\n\t}\n\tif (!options.device) {\n\t\tthrow new SyncError(EXIT.invalidArguments, \"missing --device\");\n\t}\n\n\tconst client =\n\t\toptions.client ?? createClient({ token: options.token, serverUrl: options.serverUrl, fetch: options.fetch });\n\n\tconst color = options.color === true;\n\tlet watermark: Date | null = null;\n\tlet sessionKeySalt: string;\n\ttry {\n\t\toptions.logger.info(phase(\"Checking server sync point...\", color));\n\t\tconst { sessionKeySalt: returnedSessionKeySalt, watermarkHourUtc } = await client.sync.getWatermark.mutate({\n\t\t\tdevice: options.device,\n\t\t});\n\t\twatermark = watermarkHourUtc ? new Date(watermarkHourUtc) : null;\n\t\tsessionKeySalt = returnedSessionKeySalt;\n\t} catch (err) {\n\t\treturn failureFromTrpcError(err, options.logger);\n\t}\n\n\tconst cutoff = new Date((watermark?.getTime() ?? 0) - options.lookbackDays * MS_PER_DAY);\n\n\tif (options.verbose) {\n\t\toptions.logger.info(`watermark=${watermark?.toISOString() ?? \"null\"} cutoff=${cutoff.toISOString()}`);\n\t}\n\n\tconst parsers = options.parserFactory({ cutoff: cutoff, device: options.device });\n\n\tconst sources: SelectedSource[] = [];\n\tif (options.harness === undefined || options.harness === \"codex\") {\n\t\tsources.push({ label: \"Codex\", source: parsers.codex });\n\t}\n\tif (options.harness === undefined || options.harness === \"claude_code\") {\n\t\tsources.push({ label: \"Claude Code\", source: parsers.claudeCode });\n\t}\n\tif (options.harness === undefined || options.harness === \"pi\") {\n\t\tsources.push({ label: \"Pi\", source: parsers.pi });\n\t}\n\tif (options.harness === undefined || options.harness === \"hermes\") {\n\t\tsources.push({ label: \"Hermes\", source: parsers.hermes });\n\t}\n\tif (options.harness === undefined || options.harness === \"opencode\") {\n\t\tsources.push({ label: \"OpenCode\", source: parsers.opencode });\n\t}\n\n\tlet bucketsUploaded = 0;\n\tlet sessionsUploaded = 0;\n\tlet batchesUploaded = 0;\n\tconst batches: UsageBatch[] = [];\n\n\ttry {\n\t\tconst progressSources = sources.map((source) => withScanProgress(source, options.logger, color));\n\t\tfor await (const batch of aggregateUsage(merge(progressSources), {\n\t\t\tbatchSize: SYNC_BATCH_SIZE,\n\t\t\tsessionKeySalt: sessionKeySalt,\n\t\t})) {\n\t\t\tif (batch.buckets.length === 0 && batch.sessions.length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tbatches.push(batch);\n\t\t}\n\t} catch (err) {\n\t\treturn failureFromTrpcError(err, options.logger);\n\t}\n\n\tconst plannedBuckets = batches.reduce((sum, batch) => sum + batch.buckets.length, 0);\n\tconst plannedSessions = batches.reduce((sum, batch) => sum + batch.sessions.length, 0);\n\n\tif (plannedBuckets === 0 && options.sourcesExistedHint === true) {\n\t\toptions.logger.error(\n\t\t\terrorLine(\n\t\t\t\t\"produced zero usage records but parser reported source files existed - likely parser regression\",\n\t\t\t\tcolor,\n\t\t\t),\n\t\t);\n\t\treturn { exitCode: EXIT.zeroBucketsButSourcesExist, batchesUploaded: 0, bucketsUploaded: 0, sessionsUploaded: 0 };\n\t}\n\n\tif (batches.length === 0) {\n\t\toptions.logger.info(`${successPrefix(color)} no usage records to upload.`);\n\t\treturn { exitCode: EXIT.success, batchesUploaded: 0, bucketsUploaded: 0, sessionsUploaded: 0 };\n\t}\n\n\toptions.logger.info(phase(`Aggregated usage by hour and model: ${usageRecordText(plannedBuckets)} ready.`, color));\n\n\tif (options.dryRun) {\n\t\toptions.logger.info(\n\t\t\t`${dryRunPrefix(color)} ${usageRecordText(plannedBuckets)} from ${localSessionText(plannedSessions)} would be uploaded in ${uploadRequestText(batches.length)}.`,\n\t\t);\n\t\toptions.logger.info(muted(\"No usage data was uploaded.\", color));\n\t\treturn {\n\t\t\texitCode: EXIT.success,\n\t\t\tbatchesUploaded: batches.length,\n\t\t\tbucketsUploaded: plannedBuckets,\n\t\t\tsessionsUploaded: plannedSessions,\n\t\t};\n\t}\n\n\ttry {\n\t\tfor (const [index, batch] of batches.entries()) {\n\t\t\toptions.logger.info(phase(`Uploading usage... ${index + 1}/${batches.length}`, color));\n\t\t\t// biome-ignore lint/performance/noAwaitInLoops: upload requests are sequential so progress reflects completed writes.\n\t\t\tconst result = await client.sync.upsertBuckets.mutate({\n\t\t\t\tdevice: options.device,\n\t\t\t\tbuckets: batch.buckets,\n\t\t\t\tsessions: batch.sessions,\n\t\t\t});\n\t\t\tbucketsUploaded += result.upserted;\n\t\t\tsessionsUploaded += result.upsertedSessions;\n\t\t\tbatchesUploaded += 1;\n\t\t}\n\t} catch (err) {\n\t\treturn failureFromTrpcError(err, options.logger);\n\t}\n\n\toptions.logger.info(\n\t\t`${successPrefix(color)} uploaded ${usageRecordText(bucketsUploaded)} from ${localSessionText(sessionsUploaded)}${options.verbose ? ` in ${uploadRequestText(batchesUploaded)}` : \"\"}.`,\n\t);\n\n\treturn {\n\t\texitCode: EXIT.success,\n\t\tbatchesUploaded: batchesUploaded,\n\t\tbucketsUploaded: bucketsUploaded,\n\t\tsessionsUploaded: sessionsUploaded,\n\t};\n}\n\nfunction colorize(enabled: boolean, code: string, text: string): string {\n\treturn enabled ? `\\x1b[${code}m${text}\\x1b[0m` : text;\n}\n\nfunction phase(text: string, color: boolean): string {\n\treturn colorize(color, \"36\", text);\n}\n\nfunction muted(text: string, color: boolean): string {\n\treturn colorize(color, \"2\", text);\n}\n\nfunction successPrefix(color: boolean): string {\n\treturn colorize(color, \"32\", \"Done:\");\n}\n\nfunction dryRunPrefix(color: boolean): string {\n\treturn colorize(color, \"33\", \"Dry run complete:\");\n}\n\nfunction errorLine(text: string, color: boolean): string {\n\treturn colorize(color, \"31\", text);\n}\n\nfunction formatNumber(value: number): string {\n\treturn new Intl.NumberFormat(\"en-US\").format(value);\n}\n\nfunction plural(value: number, noun: string): string {\n\treturn `${formatNumber(value)} ${noun}${value === 1 ? \"\" : \"s\"}`;\n}\n\nfunction usageRecordText(value: number): string {\n\treturn plural(value, \"hourly usage record\");\n}\n\nfunction localSessionText(value: number): string {\n\treturn plural(value, \"local session\");\n}\n\nfunction uploadRequestText(value: number): string {\n\treturn plural(value, \"upload request\");\n}\n\nasync function* withScanProgress(\n\tselected: SelectedSource,\n\tlogger: Logger,\n\tcolor: boolean,\n): AsyncIterable<ParsedBucket> {\n\tconst sessionIds = new Set<string>();\n\tlet nextProgressAt = SCAN_PROGRESS_SESSION_STEP;\n\n\tlogger.info(phase(`Scanning ${selected.label} sessions...`, color));\n\n\tfor await (const bucket of selected.source) {\n\t\tfor (const id of bucket.sessionIds) {\n\t\t\tsessionIds.add(id);\n\t\t}\n\n\t\tif (sessionIds.size >= nextProgressAt) {\n\t\t\tlogger.info(phase(`Scanning ${selected.label} sessions... ${localSessionText(sessionIds.size)} found`, color));\n\t\t\twhile (nextProgressAt <= sessionIds.size) {\n\t\t\t\tnextProgressAt += SCAN_PROGRESS_SESSION_STEP;\n\t\t\t}\n\t\t}\n\n\t\tyield bucket;\n\t}\n\n\tlogger.info(phase(`Scanned ${selected.label} sessions: ${localSessionText(sessionIds.size)} found.`, color));\n}\n\nasync function* merge<T>(sources: AsyncIterable<T>[]): AsyncIterable<T> {\n\tconst iterators = sources.map((source) => source[Symbol.asyncIterator]());\n\tconst pending = new Map<number, Promise<PendingNext<T>>>();\n\n\tconst queueNext = (index: number): void => {\n\t\tconst iterator = iterators[index];\n\t\tif (!iterator) {\n\t\t\treturn;\n\t\t}\n\t\tpending.set(\n\t\t\tindex,\n\t\t\titerator.next().then((result) => ({ index: index, result: result })),\n\t\t);\n\t};\n\n\tfor (const index of iterators.keys()) {\n\t\tqueueNext(index);\n\t}\n\n\ttry {\n\t\twhile (pending.size > 0) {\n\t\t\t// biome-ignore lint/performance/noAwaitInLoops: each race advances whichever parser is ready next.\n\t\t\tconst next = await Promise.race(pending.values());\n\t\t\tpending.delete(next.index);\n\n\t\t\tif (next.result.done === true) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tyield next.result.value;\n\t\t\tqueueNext(next.index);\n\t\t}\n\t} finally {\n\t\tawait Promise.allSettled(iterators.map((iterator) => iterator.return?.()));\n\t}\n}\n\nfunction failureFromTrpcError(err: unknown, logger: Logger): RunSyncResult {\n\tif (isTrpcUnauthorized(err)) {\n\t\tlogger.error(\"auth failure: token rejected by server\");\n\t\treturn { exitCode: EXIT.unauthorized, batchesUploaded: 0, bucketsUploaded: 0, sessionsUploaded: 0 };\n\t}\n\tif (isNetworkError(err)) {\n\t\tlogger.error(`network error: ${(err as Error).message}`);\n\t\treturn { exitCode: EXIT.networkError, batchesUploaded: 0, bucketsUploaded: 0, sessionsUploaded: 0 };\n\t}\n\tthrow err;\n}\n\nexport type { Logger, ParserBundle, ParserFactoryContext, RunSyncOptions, RunSyncResult };\nexport { runSync };\n"],"mappings":"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","names":["process","stripVTControlCharacters","cmd","key","str","stripVTControlCharacters","key","option","path","process","homedir","isAbsolute","join","stat","join","process","runtimeEnv","process","createReadStream","createInterface","path","model","isObject","isFiniteNumber","key","path","createReadStream","createInterface","path","stat","join","stat","homedir","join","isFile","path","stat","homedir","join","readdir","stat","homedir","basename","join","isObject","isFiniteNumber","modelId","key","path","path","stat","join","homedir","readdir","basename","stat","homedir","basename","join","createReadStream","createInterface","isObject","isFiniteNumber","NODE_SQLITE_SPECIFIER","key","modelId","positive","timestampMs","loadDatabaseSync","path","createReadStream","createInterface","pathKind","path","stat","isFile","join","homedir","defaultRoot","basename","sessionsRoot","OPENCODE_DB_FILE_PATTERN","join","isFile","path","isAbsolute","homedir","key","key","_typeof","o","toPrimitive","toPropertyKey","r","subscribe: (observer: Observer<TValue, TError>) => TeardownLogic","self: Observable<TValue, TError>","teardownRef: TeardownLogic | null","prev: any","fn: UnaryFunction<any, any>","observable: Observable<TValue, unknown>","_opts?: ShareConfig","subscription: Unsubscribable | null","observers: Partial<Observer<TValue, TError>>[]","initialValue: TValue","value: TValue","observerList: Observer<TValue, never>[]","observer: Observer<TValue, never>","nextValue: TValue","opts: {\n links: OperationLink<TRouter, TInput, TOutput>[];\n op: Operation<TInput>;\n}","isObject","value: unknown","retryableRpcCodes: TRPC_ERROR_CODE_NUMBER[]","obj: object","callback: ProxyCallback","path: readonly string[]","memo: Record<string, unknown>","path","key","callback: (path: keyof TFaux) => any","_typeof","o","toPrimitive","require_typeof","require_toPrimitive","toPropertyKey","require_toPropertyKey","require_defineProperty","r","response:\n | TRPCResponse<TOutput, inferRouterError<TRouter>>\n | TRPCResponseMessage<TOutput, inferRouterError<TRouter>>","transformer: DataTransformer","result: ReturnType<typeof transformResultInner>","isObject","cause: unknown","obj: unknown","isObject","err: unknown","fallback: string","TRPCClientError","message: string","opts?: {\n result?: Maybe<TRPCErrorResponse<inferErrorShape<TRouterOrProcedure>>>;\n cause?: Error;\n meta?: Record<string, unknown>;\n }","_cause: Error | TRPCErrorResponse<any> | object","opts: { meta?: Record<string, unknown>; cause?: Error }","import_objectSpread2","transformer:\n | TransformerOptions<{ transformer: false }>['transformer']\n | TransformerOptions<{ transformer: true }>['transformer']\n | undefined","isFunction","fn: unknown","customFetchImpl?: FetchEsque | NativeFetchEsque","opts: HTTPLinkBaseOptions<AnyClientTypes>","array: unknown[]","dict: Record<number, unknown>","opts: GetInputOptions","getUrl: GetUrl","queryParts: string[]","getBody: GetBody","jsonHttpRequester: Requester","import_objectSpread2","signal: Maybe<AbortSignal>","opts: HTTPRequestOptions","batchLoader: BatchLoader<TKey, TValue>","pendingItems: BatchItem<TKey, TValue>[] | null","dispatchTimer: ReturnType<typeof setTimeout> | null","items: BatchItem<TKey, TValue>[]","groupedItems: BatchItem<TKey, TValue>[][]","batch: Batch<TKey, TValue>","key: TKey","item: BatchItem<TKey, TValue>","key","opts: HTTPBatchLinkOptions<TRouter['_def']['_config']['$types']>","type: ProcedureType","path","import_objectSpread2","value: T | ((...args: TArgs) => T)","resolve: (value: T | PromiseLike<T>) => void","reject: (reason?: any) => void","urlOptions: UrlOptionsWithConnectionParams","connectionParams: CallbackOrValue<TRPCRequestInfo['connectionParams']>","encoder: Encoder","message: TRPCConnectionParamsMessage","ws: WebSocket","pingTimeout: ReturnType<typeof setTimeout> | undefined","pongTimeout: ReturnType<typeof setTimeout> | undefined","WsConnection","opts: WebSocketConnectionOptions","this","opts: CreateTRPCClientOptions<TInferrable>","opts: {\n type: TRPCType;\n input: TInput;\n path: string;\n context?: OperationContext;\n signal: Maybe<AbortSignal>;\n }","path: string","input?: unknown","opts?: TRPCRequestOptions","path","input: unknown","opts: Partial<\n TRPCSubscriptionObserver<unknown, TRPCClientError<AnyRouter>>\n > &\n TRPCRequestOptions","clientCallTypeMap: Record<\n keyof DecorateProcedure<any, any>,\n ProcedureType\n>","clientCallType: string","client: TRPCUntypedClient<TRouter>","path","key","opts: CreateTRPCClientOptions<TRouter>","_asyncIterator","r","AsyncFromSyncIterator","r","e","n","o","OverloadYield","_awaitAsyncGenerator","_wrapAsyncGenerator","t","process","program"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_postcss@8.5.15_tsx@4.22.4_typescript@6.0.3_yaml@2.9.0/node_modules/tsup/assets/esm_shims.js","../../../node_modules/.pnpm/@phc+format@1.0.0/node_modules/@phc/format/index.js","../../../node_modules/.pnpm/node-gyp-build@4.8.4/node_modules/node-gyp-build/node-gyp-build.js","../../../node_modules/.pnpm/node-gyp-build@4.8.4/node_modules/node-gyp-build/index.js","../../../node_modules/.pnpm/argon2@0.44.0/node_modules/argon2/argon2.cjs","../src/index.ts","../src/config.ts","../src/services/sync-program.ts","../src/sync/run.ts","../src/sync/aggregate.ts","../src/sync/client.ts","../../../packages/api/src/index.ts","../../../packages/api/src/auth/argon.ts","../../../packages/api/src/auth/sessions.ts","../../../packages/api/src/services/session-auth.ts","../../../packages/db/src/schema/index.ts","../../../packages/db/src/schema/api-token.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/drizzle-orm/index.js","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/entity.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/subquery.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/column-common.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/column.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/table.utils.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/table.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/tracing-utils.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/tracing.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/view-common.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/sql/sql.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/sql/expressions/conditions.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/sql/expressions/select.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/utils.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/sql/functions/aggregate.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/drizzle-orm/pg-core/index.js","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/foreign-keys.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/common.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/int.common.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/bigint.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/bigserial.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/boolean.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/char.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/cidr.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/array.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/postgis_extension/utils.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/codecs.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/custom.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/date.common.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/date.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/double-precision.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/inet.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/integer.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/interval.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/json.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/jsonb.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/line.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/macaddr.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/macaddr8.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/numeric.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/point.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/postgis_extension/geometry.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/real.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/serial.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/smallint.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/smallserial.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/text.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/time.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/timestamp.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/uuid.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/varchar.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/vector_extension/bit.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/vector_extension/halfvec.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/vector_extension/sparsevec.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/vector_extension/vector.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/columns/all.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/casing.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/table.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/primary-keys.ts","../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.3_@effect+sql-pg@4.0.0-beta.92_effect@4.0.0-beta.92__@types+pg@8.2_ddee5fb76746466f3ac889c123576420/node_modules/src/pg-core/indexes.ts","../../../packages/db/src/schema/user.ts","../../../packages/db/src/schema/device.ts","../../../packages/db/src/schema/model-price.ts","../../../packages/db/src/schema/session.ts","../../../packages/db/src/schema/usage-hour.ts","../../../packages/db/src/schema/usage-session.ts","../../../packages/api/src/errors.ts","../../../packages/api/src/auth/tokens.ts","../../../packages/api/src/queries/cost.ts","../../../packages/api/src/rpc/auth.ts","../../../packages/api/src/schemas/auth.ts","../../../packages/api/src/services/auth.ts","../../../packages/api/src/rpc/devices.ts","../../../packages/api/src/schemas/devices.ts","../../../packages/api/src/schemas/common.ts","../../../packages/api/src/rpc/groups.ts","../../../packages/api/src/rpc/stats.ts","../../../packages/api/src/schemas/stats.ts","../../../packages/api/src/rpc/tokens.ts","../../../packages/api/src/schemas/tokens.ts","../../../packages/api/src/rpc/sync.ts","../../../packages/api/src/schemas/sync.ts","../../../packages/api/src/rpc/system.ts","../../../packages/api/src/services/devices.ts","../../../packages/api/src/services/stats.ts","../../../packages/api/src/queries/missing-prices.ts","../../../packages/api/src/services/sync.ts","../../../packages/api/src/services/token-auth.ts","../../../packages/api/src/services/tokens.ts","../src/sync/errors.ts","../src/sync/parser-factory.ts","../../../packages/parsers/src/index.ts","../../../packages/parsers/src/claude/index.ts","../../../packages/parsers/src/config.ts","../../../packages/parsers/src/types.ts","../../../packages/parsers/src/walk.ts","../../../packages/parsers/src/effect/file-walker.ts","../../../packages/parsers/src/claude/bucketize.ts","../../../packages/parsers/src/codex/bucketize.ts","../../../packages/parsers/src/codex/events.ts","../../../packages/parsers/src/claude/events.ts","../../../packages/parsers/src/codex/index.ts","../../../packages/parsers/src/opencode/index.ts","../../../packages/parsers/src/opencode/bucketize.ts","../../../packages/parsers/src/opencode/events.ts","../../../packages/parsers/src/pi/index.ts","../../../packages/parsers/src/pi/bucketize.ts","../../../packages/parsers/src/pi/events.ts","../src/services/parser-sources.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","const idRegex = /^[a-z0-9-]{1,32}$/;\nconst nameRegex = /^[a-z0-9-]{1,32}$/;\nconst valueRegex = /^[a-zA-Z0-9/+.-]+$/;\nconst b64Regex = /^([a-zA-Z0-9/+.-]+|)$/;\nconst decimalRegex = /^((-)?[1-9]\\d*|0)$/;\nconst versionRegex = /^v=(\\d+)$/;\n\nfunction objToKeyVal(obj) {\n return objectKeys(obj)\n .map(k => [k, obj[k]].join('='))\n .join(',');\n}\n\nfunction keyValtoObj(str) {\n const obj = {};\n str.split(',').forEach(ps => {\n const pss = ps.split('=');\n if (pss.length < 2) {\n throw new TypeError(`params must be in the format name=value`);\n }\n\n obj[pss.shift()] = pss.join('=');\n });\n return obj;\n}\n\nfunction objectKeys(object) {\n /* istanbul ignore next */\n return Object.keys(object);\n}\n\nfunction objectValues(object) {\n /* istanbul ignore next */\n if (typeof Object.values === 'function') return Object.values(object);\n /* istanbul ignore next */\n return objectKeys(object).map(k => object[k]);\n}\n\n/**\n * Generates a PHC string using the data provided.\n * @param {Object} opts Object that holds the data needed to generate the PHC\n * string.\n * @param {string} opts.id Symbolic name for the function.\n * @param {Number} [opts.version] The version of the function.\n * @param {Object} [opts.params] Parameters of the function.\n * @param {Buffer} [opts.salt] The salt as a binary buffer.\n * @param {Buffer} [opts.hash] The hash as a binary buffer.\n * @return {string} The hash string adhering to the PHC format.\n */\nfunction serialize(opts) {\n const fields = [''];\n\n if (typeof opts !== 'object' || opts === null) {\n throw new TypeError('opts must be an object');\n }\n\n // Identifier Validation\n if (typeof opts.id !== 'string') {\n throw new TypeError('id must be a string');\n }\n\n if (!idRegex.test(opts.id)) {\n throw new TypeError(`id must satisfy ${idRegex}`);\n }\n\n fields.push(opts.id);\n\n if (typeof opts.version !== 'undefined') {\n if (\n typeof opts.version !== 'number' ||\n opts.version < 0 ||\n !Number.isInteger(opts.version)\n ) {\n throw new TypeError('version must be a positive integer number');\n }\n\n fields.push(`v=${opts.version}`);\n }\n\n // Parameters Validation\n if (typeof opts.params !== 'undefined') {\n if (typeof opts.params !== 'object' || opts.params === null) {\n throw new TypeError('params must be an object');\n }\n\n const pk = objectKeys(opts.params);\n if (!pk.every(p => nameRegex.test(p))) {\n throw new TypeError(`params names must satisfy ${nameRegex}`);\n }\n\n // Convert Numbers into Numeric Strings and Buffers into B64 encoded strings.\n pk.forEach(k => {\n if (typeof opts.params[k] === 'number') {\n opts.params[k] = opts.params[k].toString();\n } else if (Buffer.isBuffer(opts.params[k])) {\n opts.params[k] = opts.params[k].toString('base64').split('=')[0];\n }\n });\n const pv = objectValues(opts.params);\n if (!pv.every(v => typeof v === 'string')) {\n throw new TypeError('params values must be strings');\n }\n\n if (!pv.every(v => valueRegex.test(v))) {\n throw new TypeError(`params values must satisfy ${valueRegex}`);\n }\n\n const strpar = objToKeyVal(opts.params);\n fields.push(strpar);\n }\n\n if (typeof opts.salt !== 'undefined') {\n // Salt Validation\n if (!Buffer.isBuffer(opts.salt)) {\n throw new TypeError('salt must be a Buffer');\n }\n\n fields.push(opts.salt.toString('base64').split('=')[0]);\n\n if (typeof opts.hash !== 'undefined') {\n // Hash Validation\n if (!Buffer.isBuffer(opts.hash)) {\n throw new TypeError('hash must be a Buffer');\n }\n\n fields.push(opts.hash.toString('base64').split('=')[0]);\n }\n }\n\n // Create the PHC formatted string\n const phcstr = fields.join('$');\n\n return phcstr;\n}\n\n/**\n * Parses data from a PHC string.\n * @param {string} phcstr A PHC string to parse.\n * @return {Object} The object containing the data parsed from the PHC string.\n */\nfunction deserialize(phcstr) {\n if (typeof phcstr !== 'string' || phcstr === '') {\n throw new TypeError('pchstr must be a non-empty string');\n }\n\n if (phcstr[0] !== '$') {\n throw new TypeError('pchstr must contain a $ as first char');\n }\n\n const fields = phcstr.split('$');\n // Remove first empty $\n fields.shift();\n\n // Parse Fields\n let maxf = 5;\n if (!versionRegex.test(fields[1])) maxf--;\n if (fields.length > maxf) {\n throw new TypeError(\n `pchstr contains too many fileds: ${fields.length}/${maxf}`\n );\n }\n\n // Parse Identifier\n const id = fields.shift();\n if (!idRegex.test(id)) {\n throw new TypeError(`id must satisfy ${idRegex}`);\n }\n\n let version;\n // Parse Version\n if (versionRegex.test(fields[0])) {\n version = parseInt(fields.shift().match(versionRegex)[1], 10);\n }\n\n let hash;\n let salt;\n if (b64Regex.test(fields[fields.length - 1])) {\n if (fields.length > 1 && b64Regex.test(fields[fields.length - 2])) {\n // Parse Hash\n hash = Buffer.from(fields.pop(), 'base64');\n // Parse Salt\n salt = Buffer.from(fields.pop(), 'base64');\n } else {\n // Parse Salt\n salt = Buffer.from(fields.pop(), 'base64');\n }\n }\n\n // Parse Parameters\n let params;\n if (fields.length > 0) {\n const parstr = fields.pop();\n params = keyValtoObj(parstr);\n if (!objectKeys(params).every(p => nameRegex.test(p))) {\n throw new TypeError(`params names must satisfy ${nameRegex}`);\n }\n\n const pv = objectValues(params);\n if (!pv.every(v => valueRegex.test(v))) {\n throw new TypeError(`params values must satisfy ${valueRegex}`);\n }\n\n const pk = objectKeys(params);\n // Convert Decimal Strings into Numbers\n pk.forEach(k => {\n params[k] = decimalRegex.test(params[k])\n ? parseInt(params[k], 10)\n : params[k];\n });\n }\n\n if (fields.length > 0) {\n throw new TypeError(`pchstr contains unrecognized fileds: ${fields}`);\n }\n\n // Build the output object\n const phcobj = {id};\n if (version) phcobj.version = version;\n if (params) phcobj.params = params;\n if (salt) phcobj.salt = salt;\n if (hash) phcobj.hash = hash;\n\n return phcobj;\n}\n\nmodule.exports = {\n serialize,\n deserialize\n};\n","var fs = require('fs')\nvar path = require('path')\nvar os = require('os')\n\n// Workaround to fix webpack's build warnings: 'the request of a dependency is an expression'\nvar runtimeRequire = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require // eslint-disable-line\n\nvar vars = (process.config && process.config.variables) || {}\nvar prebuildsOnly = !!process.env.PREBUILDS_ONLY\nvar abi = process.versions.modules // TODO: support old node where this is undef\nvar runtime = isElectron() ? 'electron' : (isNwjs() ? 'node-webkit' : 'node')\n\nvar arch = process.env.npm_config_arch || os.arch()\nvar platform = process.env.npm_config_platform || os.platform()\nvar libc = process.env.LIBC || (isAlpine(platform) ? 'musl' : 'glibc')\nvar armv = process.env.ARM_VERSION || (arch === 'arm64' ? '8' : vars.arm_version) || ''\nvar uv = (process.versions.uv || '').split('.')[0]\n\nmodule.exports = load\n\nfunction load (dir) {\n return runtimeRequire(load.resolve(dir))\n}\n\nload.resolve = load.path = function (dir) {\n dir = path.resolve(dir || '.')\n\n try {\n var name = runtimeRequire(path.join(dir, 'package.json')).name.toUpperCase().replace(/-/g, '_')\n if (process.env[name + '_PREBUILD']) dir = process.env[name + '_PREBUILD']\n } catch (err) {}\n\n if (!prebuildsOnly) {\n var release = getFirst(path.join(dir, 'build/Release'), matchBuild)\n if (release) return release\n\n var debug = getFirst(path.join(dir, 'build/Debug'), matchBuild)\n if (debug) return debug\n }\n\n var prebuild = resolve(dir)\n if (prebuild) return prebuild\n\n var nearby = resolve(path.dirname(process.execPath))\n if (nearby) return nearby\n\n var target = [\n 'platform=' + platform,\n 'arch=' + arch,\n 'runtime=' + runtime,\n 'abi=' + abi,\n 'uv=' + uv,\n armv ? 'armv=' + armv : '',\n 'libc=' + libc,\n 'node=' + process.versions.node,\n process.versions.electron ? 'electron=' + process.versions.electron : '',\n typeof __webpack_require__ === 'function' ? 'webpack=true' : '' // eslint-disable-line\n ].filter(Boolean).join(' ')\n\n throw new Error('No native build was found for ' + target + '\\n loaded from: ' + dir + '\\n')\n\n function resolve (dir) {\n // Find matching \"prebuilds/<platform>-<arch>\" directory\n var tuples = readdirSync(path.join(dir, 'prebuilds')).map(parseTuple)\n var tuple = tuples.filter(matchTuple(platform, arch)).sort(compareTuples)[0]\n if (!tuple) return\n\n // Find most specific flavor first\n var prebuilds = path.join(dir, 'prebuilds', tuple.name)\n var parsed = readdirSync(prebuilds).map(parseTags)\n var candidates = parsed.filter(matchTags(runtime, abi))\n var winner = candidates.sort(compareTags(runtime))[0]\n if (winner) return path.join(prebuilds, winner.file)\n }\n}\n\nfunction readdirSync (dir) {\n try {\n return fs.readdirSync(dir)\n } catch (err) {\n return []\n }\n}\n\nfunction getFirst (dir, filter) {\n var files = readdirSync(dir).filter(filter)\n return files[0] && path.join(dir, files[0])\n}\n\nfunction matchBuild (name) {\n return /\\.node$/.test(name)\n}\n\nfunction parseTuple (name) {\n // Example: darwin-x64+arm64\n var arr = name.split('-')\n if (arr.length !== 2) return\n\n var platform = arr[0]\n var architectures = arr[1].split('+')\n\n if (!platform) return\n if (!architectures.length) return\n if (!architectures.every(Boolean)) return\n\n return { name, platform, architectures }\n}\n\nfunction matchTuple (platform, arch) {\n return function (tuple) {\n if (tuple == null) return false\n if (tuple.platform !== platform) return false\n return tuple.architectures.includes(arch)\n }\n}\n\nfunction compareTuples (a, b) {\n // Prefer single-arch prebuilds over multi-arch\n return a.architectures.length - b.architectures.length\n}\n\nfunction parseTags (file) {\n var arr = file.split('.')\n var extension = arr.pop()\n var tags = { file: file, specificity: 0 }\n\n if (extension !== 'node') return\n\n for (var i = 0; i < arr.length; i++) {\n var tag = arr[i]\n\n if (tag === 'node' || tag === 'electron' || tag === 'node-webkit') {\n tags.runtime = tag\n } else if (tag === 'napi') {\n tags.napi = true\n } else if (tag.slice(0, 3) === 'abi') {\n tags.abi = tag.slice(3)\n } else if (tag.slice(0, 2) === 'uv') {\n tags.uv = tag.slice(2)\n } else if (tag.slice(0, 4) === 'armv') {\n tags.armv = tag.slice(4)\n } else if (tag === 'glibc' || tag === 'musl') {\n tags.libc = tag\n } else {\n continue\n }\n\n tags.specificity++\n }\n\n return tags\n}\n\nfunction matchTags (runtime, abi) {\n return function (tags) {\n if (tags == null) return false\n if (tags.runtime && tags.runtime !== runtime && !runtimeAgnostic(tags)) return false\n if (tags.abi && tags.abi !== abi && !tags.napi) return false\n if (tags.uv && tags.uv !== uv) return false\n if (tags.armv && tags.armv !== armv) return false\n if (tags.libc && tags.libc !== libc) return false\n\n return true\n }\n}\n\nfunction runtimeAgnostic (tags) {\n return tags.runtime === 'node' && tags.napi\n}\n\nfunction compareTags (runtime) {\n // Precedence: non-agnostic runtime, abi over napi, then by specificity.\n return function (a, b) {\n if (a.runtime !== b.runtime) {\n return a.runtime === runtime ? -1 : 1\n } else if (a.abi !== b.abi) {\n return a.abi ? -1 : 1\n } else if (a.specificity !== b.specificity) {\n return a.specificity > b.specificity ? -1 : 1\n } else {\n return 0\n }\n }\n}\n\nfunction isNwjs () {\n return !!(process.versions && process.versions.nw)\n}\n\nfunction isElectron () {\n if (process.versions && process.versions.electron) return true\n if (process.env.ELECTRON_RUN_AS_NODE) return true\n return typeof window !== 'undefined' && window.process && window.process.type === 'renderer'\n}\n\nfunction isAlpine (platform) {\n return platform === 'linux' && fs.existsSync('/etc/alpine-release')\n}\n\n// Exposed for unit tests\n// TODO: move to lib\nload.parseTags = parseTags\nload.matchTags = matchTags\nload.compareTags = compareTags\nload.parseTuple = parseTuple\nload.matchTuple = matchTuple\nload.compareTuples = compareTuples\n","const runtimeRequire = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require // eslint-disable-line\nif (typeof runtimeRequire.addon === 'function') { // if the platform supports native resolving prefer that\n module.exports = runtimeRequire.addon.bind(runtimeRequire)\n} else { // else use the runtime version here\n module.exports = require('./node-gyp-build.js')\n}\n","const { randomBytes, timingSafeEqual } = require(\"node:crypto\");\nconst { promisify } = require(\"node:util\");\nconst { deserialize, serialize } = require(\"@phc/format\");\nconst gypBuild = require(\"node-gyp-build\");\n\nconst { hash: bindingsHash } = gypBuild(__dirname);\n\n/** @type {(size: number) => Promise<Buffer>} */\nconst generateSalt = promisify(randomBytes);\n\nconst argon2d = 0;\nconst argon2i = 1;\nconst argon2id = 2;\n\nmodule.exports.argon2d = argon2d;\nmodule.exports.argon2i = argon2i;\nmodule.exports.argon2id = argon2id;\n\n/** @enum {argon2i | argon2d | argon2id} */\nconst types = Object.freeze({ argon2d, argon2i, argon2id });\n\n/** @enum {'argon2d' | 'argon2i' | 'argon2id'} */\nconst names = Object.freeze({\n [types.argon2d]: \"argon2d\",\n [types.argon2i]: \"argon2i\",\n [types.argon2id]: \"argon2id\",\n});\n\nconst defaults = {\n hashLength: 32,\n timeCost: 3,\n memoryCost: 1 << 16,\n parallelism: 4,\n type: argon2id,\n version: 0x13,\n};\n\n/**\n * @typedef {Object} Options\n * @property {number} [hashLength=32]\n * @property {number} [timeCost=3]\n * @property {number} [memoryCost=65536]\n * @property {number} [parallelism=4]\n * @property {keyof typeof names} [type=argon2id]\n * @property {number} [version=19]\n * @property {Buffer} [salt]\n * @property {Buffer} [associatedData]\n * @property {Buffer} [secret]\n */\n\n/**\n * Hashes a password with Argon2, producing a raw hash\n *\n * @overload\n * @param {Buffer | string} password The plaintext password to be hashed\n * @param {Options & { raw: true }} options The parameters for Argon2\n * @returns {Promise<Buffer>} The raw hash generated from `password`\n */\n/**\n * Hashes a password with Argon2, producing an encoded hash\n *\n * @overload\n * @param {Buffer | string} password The plaintext password to be hashed\n * @param {Options & { raw?: boolean }} [options] The parameters for Argon2\n * @returns {Promise<string>} The encoded hash generated from `password`\n */\n/**\n * @param {Buffer | string} password The plaintext password to be hashed\n * @param {Options & { raw?: boolean }} [options] The parameters for Argon2\n */\nasync function hash(password, options) {\n let { raw, salt, ...rest } = { ...defaults, ...options };\n\n if (rest.hashLength > 2 ** 32 - 1) {\n throw new RangeError(\"Hash length is too large\");\n }\n\n if (rest.memoryCost > 2 ** 32 - 1) {\n throw new RangeError(\"Memory cost is too large\");\n }\n\n if (rest.timeCost > 2 ** 32 - 1) {\n throw new RangeError(\"Time cost is too large\");\n }\n\n if (rest.parallelism > 2 ** 24 - 1) {\n throw new RangeError(\"Parallelism is too large\");\n }\n\n salt = salt ?? (await generateSalt(16));\n\n const {\n hashLength,\n secret = Buffer.alloc(0),\n type,\n version,\n memoryCost: m,\n timeCost: t,\n parallelism: p,\n associatedData: data = Buffer.alloc(0),\n } = rest;\n\n const hash = await bindingsHash({\n password: Buffer.from(password),\n salt,\n secret,\n data,\n hashLength,\n m,\n t,\n p,\n version,\n type,\n });\n if (raw) {\n return hash;\n }\n\n return serialize({\n id: names[type],\n version,\n params: { m, t, p, ...(data.byteLength > 0 ? { data } : {}) },\n salt,\n hash,\n });\n}\nmodule.exports.hash = hash;\n\n/**\n * @param {string} digest The digest to be checked\n * @param {Object} [options] The current parameters for Argon2\n * @param {number} [options.timeCost=3]\n * @param {number} [options.memoryCost=65536]\n * @param {number} [options.parallelism=4]\n * @param {number} [options.version=0x13]\n * @returns {boolean} `true` if the digest parameters do not match the parameters in `options`, otherwise `false`\n */\nfunction needsRehash(digest, options = {}) {\n const { memoryCost, timeCost, parallelism, version } = {\n ...defaults,\n ...options,\n };\n\n const {\n version: v,\n params: { m, t, p },\n } = deserialize(digest);\n\n return (\n +v !== +version ||\n +m !== +memoryCost ||\n +t !== +timeCost ||\n +p !== +parallelism\n );\n}\nmodule.exports.needsRehash = needsRehash;\n\n/**\n * @param {string} digest The digest to be checked\n * @param {Buffer | string} password The plaintext password to be verified\n * @param {Object} [options] The current parameters for Argon2\n * @param {Buffer} [options.secret]\n * @returns {Promise<boolean>} `true` if the digest parameters matches the hash generated from `password`, otherwise `false`\n */\nasync function verify(digest, password, options = {}) {\n const { id, ...rest } = deserialize(digest);\n if (!(id in types)) {\n return false;\n }\n\n const {\n version = 0x10,\n params: { m, t, p, data = \"\" },\n salt,\n hash,\n } = rest;\n\n const { secret = Buffer.alloc(0) } = options;\n\n return timingSafeEqual(\n await bindingsHash({\n password: Buffer.from(password),\n salt,\n secret,\n data: Buffer.from(data, \"base64\"),\n hashLength: hash.byteLength,\n m: +m,\n t: +t,\n p: +p,\n version: +version,\n type: types[id],\n }),\n hash,\n );\n}\nmodule.exports.verify = verify;\n","#!/usr/bin/env node\nimport { readFileSync, realpathSync } from \"node:fs\";\nimport process from \"node:process\";\nimport { fileURLToPath } from \"node:url\";\nimport { NodeRuntime, NodeServices } from \"@effect/platform-node\";\nimport type { Harness } from \"@oopst/parsers\";\nimport { Effect, Layer, Option, Runtime } from \"effect\";\nimport { CliOutput, Command, Flag } from \"effect/unstable/cli\";\nimport { CliConfigError, readCliEnv, resolveSyncConfig } from \"./config\";\nimport { runSyncProgram } from \"./services/sync-program\";\nimport { EXIT, SyncError } from \"./sync/errors\";\nimport { buildRealParserFactory } from \"./sync/parser-factory\";\n\ntype PackageJson = {\n\tversion?: string;\n};\n\ntype SyncFlags = {\n\tapi: Option.Option<string>;\n\ttoken: Option.Option<string>;\n\tdevice: Option.Option<string>;\n\tserver: Option.Option<string>;\n\tlookbackDays: Option.Option<string>;\n\tharness: Option.Option<string>;\n\tdryRun: boolean;\n\tverbose: boolean;\n};\n\nclass CliExit extends Error {\n\tpublic override readonly [Runtime.errorExitCode]: number;\n\tpublic override readonly [Runtime.errorReported] = false;\n\n\tpublic constructor(exitCode: number) {\n\t\tsuper(`Command exited with status ${exitCode}`);\n\t\tthis[Runtime.errorExitCode] = exitCode;\n\t}\n}\n\nfunction readPackageVersion(): string {\n\tconst raw = readFileSync(new URL(\"../package.json\", import.meta.url), \"utf8\");\n\tconst parsed = JSON.parse(raw) as PackageJson;\n\tif (typeof parsed.version === \"string\" && parsed.version.length > 0) {\n\t\treturn parsed.version;\n\t}\n\treturn \"0.0.0\";\n}\n\nconst VERSION = readPackageVersion();\nconst SUPPORTED_HARNESSES = [\"codex\", \"claude_code\", \"pi\", \"hermes\", \"opencode\"] as const satisfies readonly Harness[];\nconst cliOutputFormatter = {\n\t...CliOutput.defaultFormatter({ colors: false }),\n\tformatVersion: (_name: string, version: string): string => version,\n};\nconst CliRuntimeLayer = Layer.mergeAll(NodeServices.layer, CliOutput.layer(cliOutputFormatter));\n\nfunction optionalValue<A>(value: Option.Option<A>): A | undefined {\n\treturn Option.getOrUndefined(value);\n}\n\nfunction writeStdoutLine(msg: string): void {\n\tprocess.stdout.write(`${msg}\\n`);\n}\n\nfunction writeStderrLine(msg: string): void {\n\tprocess.stderr.write(`${msg}\\n`);\n}\n\nfunction writeUnknownError(err: unknown): void {\n\twriteStderrLine(err instanceof Error ? (err.stack ?? err.message) : String(err));\n}\n\nfunction isEntrypoint(): boolean {\n\tconst [, argvPath] = process.argv;\n\treturn argvPath ? realpathSync(fileURLToPath(import.meta.url)) === realpathSync(argvPath) : false;\n}\n\nfunction parseHarnessFilter(value: string | undefined): Harness | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\tif ((SUPPORTED_HARNESSES as readonly string[]).includes(value)) {\n\t\treturn value as Harness;\n\t}\n\tthrow new SyncError(EXIT.invalidArguments, `error: --harness must be one of ${SUPPORTED_HARNESSES.join(\"|\")}`);\n}\n\nasync function runSyncCommand(raw: SyncFlags): Promise<number> {\n\ttry {\n\t\tconst env = readCliEnv();\n\t\tconst config = resolveSyncConfig(\n\t\t\t{\n\t\t\t\tapi: optionalValue(raw.api),\n\t\t\t\ttoken: optionalValue(raw.token),\n\t\t\t\tdevice: optionalValue(raw.device),\n\t\t\t\tserver: optionalValue(raw.server),\n\t\t\t\tlookbackDays: optionalValue(raw.lookbackDays),\n\t\t\t},\n\t\t\tenv,\n\t\t);\n\t\tconst { device, token } = config;\n\t\tconst harness = parseHarnessFilter(optionalValue(raw.harness));\n\n\t\tif (!(token && device)) {\n\t\t\twriteStderrLine(\"error: --token and --device are required (or set ~/.oopst.yml / OOPST_TOKEN / OOPST_DEVICE)\");\n\t\t\treturn EXIT.invalidArguments;\n\t\t}\n\n\t\tconst factory = buildRealParserFactory({ exclude: config.exclude });\n\t\tlet sourcesExistedHint = false;\n\t\tconst parserFactory = (ctx: Parameters<typeof factory>[0]): ReturnType<typeof factory> => {\n\t\t\tconst real = factory(ctx);\n\t\t\tsourcesExistedHint = real.anySourceExisted;\n\t\t\treturn real;\n\t\t};\n\n\t\tconst result = await Effect.runPromise(\n\t\t\trunSyncProgram({\n\t\t\t\ttoken: token,\n\t\t\t\tdevice: device,\n\t\t\t\tserverUrl: config.serverUrl,\n\t\t\t\tlookbackDays: config.lookbackDays,\n\t\t\t\tharness: harness,\n\t\t\t\tdryRun: raw.dryRun,\n\t\t\t\tverbose: raw.verbose,\n\t\t\t\tcolor: process.stdout.isTTY === true,\n\t\t\t\tlogger: {\n\t\t\t\t\tinfo: writeStdoutLine,\n\t\t\t\t\terror: writeStderrLine,\n\t\t\t\t},\n\t\t\t\tparserFactory: parserFactory,\n\t\t\t\tget sourcesExistedHint() {\n\t\t\t\t\treturn config.exclude.length === 0 && sourcesExistedHint;\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t\treturn result.exitCode;\n\t} catch (err) {\n\t\tif (err instanceof CliConfigError) {\n\t\t\twriteStderrLine(err.message);\n\t\t\treturn EXIT.invalidArguments;\n\t\t}\n\t\tif (err instanceof SyncError) {\n\t\t\twriteStderrLine(err.message);\n\t\t\treturn err.exitCode;\n\t\t}\n\t\twriteUnknownError(err);\n\t\treturn EXIT.generalFailure;\n\t}\n}\n\nconst apiFlag = Flag.string(\"api\").pipe(\n\tFlag.withDescription(\"API base URL (or server.api / OOPST_SERVER)\"),\n\tFlag.optional,\n);\nconst tokenFlag = Flag.string(\"token\").pipe(\n\tFlag.withDescription(\"CLI API token (or server.token / OOPST_TOKEN)\"),\n\tFlag.optional,\n);\nconst deviceFlag = Flag.string(\"device\").pipe(\n\tFlag.withDescription(\"Device name (or server.device / OOPST_DEVICE)\"),\n\tFlag.optional,\n);\nconst serverFlag = Flag.string(\"server\").pipe(Flag.withDescription(\"Server base URL alias for --api\"), Flag.optional);\nconst lookbackDaysFlag = Flag.string(\"lookback-days\").pipe(\n\tFlag.withDescription(\"Override sessions.lookbackDays\"),\n\tFlag.optional,\n);\nconst harnessFlag = Flag.string(\"harness\").pipe(\n\tFlag.withDescription(\"Restrict to codex|claude_code|pi|hermes|opencode\"),\n\tFlag.optional,\n);\nconst dryRunFlag = Flag.boolean(\"dry-run\").pipe(\n\tFlag.withDescription(\"Parse and print without uploading\"),\n\tFlag.withDefault(false),\n);\nconst verboseFlag = Flag.boolean(\"verbose\").pipe(Flag.withDescription(\"Verbose logs\"), Flag.withDefault(false));\n\nfunction buildCli(): Command.Command<\"oopst\", {}, {}, CliExit, never> {\n\tconst sync = Command.make(\n\t\t\"sync\",\n\t\t{\n\t\t\tapi: apiFlag,\n\t\t\ttoken: tokenFlag,\n\t\t\tdevice: deviceFlag,\n\t\t\tserver: serverFlag,\n\t\t\tlookbackDays: lookbackDaysFlag,\n\t\t\tharness: harnessFlag,\n\t\t\tdryRun: dryRunFlag,\n\t\t\tverbose: verboseFlag,\n\t\t},\n\t\t(raw) =>\n\t\t\tEffect.promise(() => runSyncCommand(raw)).pipe(\n\t\t\t\tEffect.flatMap((exitCode) => (exitCode === EXIT.success ? Effect.void : Effect.fail(new CliExit(exitCode)))),\n\t\t\t),\n\t).pipe(Command.withDescription(\"Scan local AI coding harness logs and upload hourly usage records\"));\n\n\treturn Command.make(\"oopst\").pipe(\n\t\tCommand.withDescription(\"OopsT — track AI coding token usage across users and devices\"),\n\t\tCommand.withSubcommands([sync]),\n\t);\n}\n\nif (isEntrypoint()) {\n\tbuildCli().pipe(Command.run({ version: VERSION }), Effect.provide(CliRuntimeLayer), NodeRuntime.runMain);\n}\n\nexport { buildCli };\n","import { readFileSync } from \"node:fs\";\nimport { homedir as readHomedir, hostname as readHostname } from \"node:os\";\nimport { isAbsolute, join, normalize, resolve } from \"node:path\";\nimport process from \"node:process\";\nimport { Config, ConfigProvider, Effect, Option, Schema } from \"effect\";\nimport { parse as parseYaml } from \"yaml\";\n\nconst DEFAULT_SERVER_URL = \"http://localhost:15433\";\nconst DEFAULT_LOOKBACK_DAYS = 2;\nconst USER_CONFIG_FILE = \".oopst.yml\";\nconst runtimeEnv = process[\"env\"] as Record<string, string | undefined>;\nconst NonEmptyString = Schema.String.check(Schema.isNonEmpty());\nconst NonNegativeInteger = Schema.Number.check(Schema.isInt(), Schema.isGreaterThanOrEqualTo(0));\n\nconst CliConfigSourceSchema = Schema.Struct({\n\tapi: Schema.optional(Schema.String),\n\ttoken: Schema.optional(Schema.String),\n\tdevice: Schema.optional(Schema.NullOr(Schema.String)),\n\tlookbackDays: Schema.optional(Schema.Union([Schema.Number, Schema.String])),\n\texclude: Schema.optional(Schema.Array(Schema.String)),\n\tclaudeConfigDir: Schema.optional(Schema.String),\n\tpiAgentDir: Schema.optional(Schema.String),\n\tpiSessionDir: Schema.optional(Schema.String),\n\thermesAgentDir: Schema.optional(Schema.String),\n\thermesSessionDir: Schema.optional(Schema.String),\n\topencodeDataDir: Schema.optional(Schema.String),\n\topencodeDbPath: Schema.optional(Schema.String),\n});\n\ntype CliConfigSource = typeof CliConfigSourceSchema.Type;\n\ntype CliEnv = {\n\ttoken: string | undefined;\n\tdevice: string | undefined;\n\tserverUrl: string;\n\tlookbackDays: number;\n\texclude: readonly string[];\n\tclaudeConfigDir: string | undefined;\n\tpiAgentDir: string | undefined;\n\tpiSessionDir: string | undefined;\n\thermesAgentDir: string | undefined;\n\thermesSessionDir: string | undefined;\n\topencodeDataDir: string | undefined;\n\topencodeDbPath: string | undefined;\n};\n\ntype LoadCliConfigOptions = {\n\tenv?: Record<string, string | undefined>;\n\thomeDir?: string;\n\thostName?: string;\n\tconfigFileText?: string | undefined;\n\tconfigPath?: string;\n};\n\ntype SyncFlagConfig = {\n\tapi?: string;\n\tserver?: string;\n\ttoken?: string;\n\tdevice?: string;\n\tlookbackDays?: string;\n};\n\ntype ResolvedSyncConfig = {\n\ttoken: string | undefined;\n\tdevice: string | undefined;\n\tserverUrl: string;\n\tlookbackDays: number;\n\texclude: readonly string[];\n};\n\nclass CliConfigError extends Error {\n\tpublic constructor(message: string, options?: ErrorOptions) {\n\t\tsuper(message, options);\n\t\tthis.name = \"CliConfigError\";\n\t}\n}\n\nconst toConfigEnv = (env: Record<string, string | undefined>): Record<string, string> =>\n\tObject.fromEntries(Object.entries(env).filter((entry): entry is [string, string] => entry[1] !== undefined));\n\nconst toCliConfigError = (cause: unknown): CliConfigError =>\n\tcause instanceof CliConfigError ? cause : new CliConfigError(cause instanceof Error ? cause.message : String(cause));\n\nfunction userConfigPath(homeDir: string): string {\n\treturn join(homeDir, USER_CONFIG_FILE);\n}\n\nfunction readOptionalConfigFile(path: string): string | undefined {\n\ttry {\n\t\treturn readFileSync(path, \"utf8\");\n\t} catch (err) {\n\t\tconst code = err instanceof Error && \"code\" in err ? (err as NodeJS.ErrnoException).code : undefined;\n\t\tif (code === \"ENOENT\") {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst reason = err instanceof Error ? err.message : String(err);\n\t\tthrow new CliConfigError(`failed to read ${path}: ${reason}`, { cause: err });\n\t}\n}\n\nfunction optionalNonEmpty(value: string | null | undefined, fieldPath: string, configPath: string): string | undefined {\n\tif (value == null) {\n\t\treturn undefined;\n\t}\n\ttry {\n\t\treturn Schema.decodeUnknownSync(NonEmptyString)(value);\n\t} catch (cause) {\n\t\tthrow new CliConfigError(`${configPath}: ${fieldPath} must be a non-empty string`, { cause: cause });\n\t}\n}\n\nfunction parseLookbackDays(value: number | string | undefined, fieldPath: string, configPath: string): number {\n\tif (value == null) {\n\t\treturn DEFAULT_LOOKBACK_DAYS;\n\t}\n\tconst parsed = typeof value === \"number\" ? value : Number(value.trim());\n\ttry {\n\t\treturn Schema.decodeUnknownSync(NonNegativeInteger)(parsed);\n\t} catch (cause) {\n\t\tthrow new CliConfigError(`${configPath}: ${fieldPath} must be a non-negative integer`, { cause: cause });\n\t}\n}\n\nfunction readEnvConfigEffect(env: Record<string, string | undefined>): Effect.Effect<CliConfigSource, CliConfigError> {\n\tconst provider = ConfigProvider.fromEnv({ env: toConfigEnv(env) });\n\treturn Effect.gen(function* () {\n\t\treturn {\n\t\t\tapi: yield* readOptionalEnv(provider, \"OOPST_SERVER\"),\n\t\t\ttoken: yield* readOptionalEnv(provider, \"OOPST_TOKEN\"),\n\t\t\tdevice: yield* readOptionalEnv(provider, \"OOPST_DEVICE\"),\n\t\t\tclaudeConfigDir: yield* readOptionalEnv(provider, \"CLAUDE_CONFIG_DIR\"),\n\t\t\tpiAgentDir: yield* readOptionalEnv(provider, \"PI_CODING_AGENT_DIR\"),\n\t\t\tpiSessionDir: yield* readOptionalEnv(provider, \"PI_CODING_AGENT_SESSION_DIR\"),\n\t\t\thermesAgentDir: yield* readOptionalEnv(provider, \"HERMES_CODING_AGENT_DIR\"),\n\t\t\thermesSessionDir: yield* readOptionalEnv(provider, \"HERMES_CODING_AGENT_SESSION_DIR\"),\n\t\t\topencodeDataDir: yield* readOptionalEnv(provider, \"OPENCODE_DATA_DIR\"),\n\t\t\topencodeDbPath: yield* readOptionalEnv(provider, \"OPENCODE_DB\"),\n\t\t};\n\t}).pipe(Effect.mapError(toCliConfigError));\n}\n\nfunction readFileConfigEffect(options: {\n\treadonly text: string | undefined;\n\treadonly hostName: string;\n\treadonly configPath: string;\n}): Effect.Effect<CliConfigSource, CliConfigError> {\n\treturn Effect.try({\n\t\ttry: () => readFileConfig(options),\n\t\tcatch: toCliConfigError,\n\t});\n}\n\nfunction mergeCliConfig(options: {\n\treadonly env: CliConfigSource;\n\treadonly file: CliConfigSource;\n\treadonly homeDir: string;\n}): CliEnv {\n\tconst merged: CliConfigSource = { ...options.file, ...withoutUndefined(options.env) };\n\tconst exclude = merged.exclude ?? [];\n\treturn {\n\t\ttoken: optionalNonEmpty(merged.token, \"server.token\", \"CLI\"),\n\t\tdevice: optionalNonEmpty(merged.device, \"server.device\", \"CLI\"),\n\t\tserverUrl: optionalNonEmpty(merged.api, \"server.api\", \"CLI\") ?? DEFAULT_SERVER_URL,\n\t\tlookbackDays: parseLookbackDays(merged.lookbackDays, \"sessions.lookbackDays\", \"CLI\"),\n\t\texclude: exclude.map((path) => normalizeConfigPath(path, options.homeDir)),\n\t\tclaudeConfigDir: merged.claudeConfigDir,\n\t\tpiAgentDir: merged.piAgentDir,\n\t\tpiSessionDir: merged.piSessionDir,\n\t\thermesAgentDir: merged.hermesAgentDir,\n\t\thermesSessionDir: merged.hermesSessionDir,\n\t\topencodeDataDir: merged.opencodeDataDir,\n\t\topencodeDbPath: merged.opencodeDbPath,\n\t};\n}\n\nfunction readOptionalEnv(\n\tprovider: ConfigProvider.ConfigProvider,\n\tkey: string,\n): Effect.Effect<string | undefined, Config.ConfigError> {\n\treturn Config.schema(Schema.String, key).pipe(Config.option).parse(provider).pipe(Effect.map(Option.getOrUndefined));\n}\n\nfunction readFileConfig(options: {\n\treadonly text: string | undefined;\n\treadonly hostName: string;\n\treadonly configPath: string;\n}): CliConfigSource {\n\tif (options.text === undefined || options.text.trim().length === 0) {\n\t\treturn {};\n\t}\n\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = parseYaml(options.text);\n\t} catch (err) {\n\t\tconst reason = err instanceof Error ? err.message : String(err);\n\t\tthrow new CliConfigError(`invalid ${options.configPath}: ${reason}`, { cause: err });\n\t}\n\n\tif (parsed == null) {\n\t\treturn {};\n\t}\n\tif (!isRecord(parsed)) {\n\t\tthrow new CliConfigError(`${options.configPath}: expected a YAML object`);\n\t}\n\n\treturn Schema.decodeUnknownSync(CliConfigSourceSchema)(\n\t\tflattenConfigFile(parsed, options.hostName, options.configPath),\n\t);\n}\n\nfunction flattenConfigFile(root: Record<string, unknown>, hostName: string, configPath: string): CliConfigSource {\n\tconst server = section(root, \"server\", configPath);\n\tconst sessions = section(root, \"sessions\", configPath);\n\tlet device = server[\"device\"];\n\tif (device === null) {\n\t\tdevice = hostName;\n\t}\n\n\treturn {\n\t\tapi: optionalYamlString(server[\"api\"], \"server.api\", configPath),\n\t\ttoken: optionalYamlString(server[\"token\"], \"server.token\", configPath),\n\t\tdevice: optionalYamlString(device, \"server.device\", configPath),\n\t\tlookbackDays: sessions[\"lookbackDays\"] as number | string | undefined,\n\t\texclude: optionalStringArray(sessions[\"exclude\"], \"sessions.exclude\", configPath),\n\t};\n}\n\nfunction section(\n\troot: Record<string, unknown>,\n\tkey: \"server\" | \"sessions\",\n\tconfigPath: string,\n): Record<string, unknown> {\n\tconst value = root[key];\n\tif (value == null) {\n\t\treturn {};\n\t}\n\tif (!isRecord(value)) {\n\t\tthrow new CliConfigError(`${configPath}: ${key} must be a YAML object`);\n\t}\n\treturn value;\n}\n\nfunction optionalYamlString(value: unknown, fieldPath: string, configPath: string): string | undefined {\n\tif (value == null) {\n\t\treturn undefined;\n\t}\n\tif (typeof value === \"string\" && value.length > 0) {\n\t\treturn value;\n\t}\n\tthrow new CliConfigError(`${configPath}: ${fieldPath} must be a non-empty string`);\n}\n\nfunction optionalStringArray(value: unknown, fieldPath: string, configPath: string): readonly string[] | undefined {\n\tif (value == null) {\n\t\treturn undefined;\n\t}\n\tif (!Array.isArray(value)) {\n\t\tthrow new CliConfigError(`${configPath}: ${fieldPath} must be a list of paths`);\n\t}\n\treturn value.map((entry, index) => {\n\t\tconst parsed = optionalYamlString(entry, `${fieldPath}[${index}]`, configPath);\n\t\tif (parsed === undefined) {\n\t\t\tthrow new CliConfigError(`${configPath}: ${fieldPath}[${index}] must be a non-empty string`);\n\t\t}\n\t\treturn parsed;\n\t});\n}\n\nfunction withoutUndefined(config: CliConfigSource): CliConfigSource {\n\treturn Object.fromEntries(Object.entries(config).filter((entry) => entry[1] !== undefined)) as CliConfigSource;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction expandHomePath(path: string, homeDir: string): string {\n\tif (path === \"~\") {\n\t\treturn homeDir;\n\t}\n\tif (path.startsWith(\"~/\")) {\n\t\treturn join(homeDir, path.slice(2));\n\t}\n\treturn path;\n}\n\nfunction normalizeConfigPath(path: string, homeDir: string): string {\n\tconst expanded = expandHomePath(path, homeDir);\n\treturn normalize(isAbsolute(expanded) ? expanded : resolve(homeDir, expanded));\n}\n\nfunction loadCliConfigEffect(options: LoadCliConfigOptions = {}): Effect.Effect<CliEnv, CliConfigError> {\n\tconst env = options.env ?? runtimeEnv;\n\tconst homeDir = options.homeDir ?? readHomedir();\n\tconst hostName = options.hostName ?? readHostname();\n\tconst configPath = options.configPath ?? userConfigPath(homeDir);\n\n\treturn Effect.gen(function* () {\n\t\tconst envSource = yield* readEnvConfigEffect(env);\n\t\tconst fileConfig = yield* readFileConfigEffect({\n\t\t\ttext: options.configFileText,\n\t\t\thostName: hostName,\n\t\t\tconfigPath: configPath,\n\t\t});\n\t\treturn mergeCliConfig({ env: envSource, file: fileConfig, homeDir: homeDir });\n\t});\n}\n\nfunction loadCliConfig(options: LoadCliConfigOptions = {}): CliEnv {\n\treturn Effect.runSync(loadCliConfigEffect(options));\n}\n\nfunction readCliEnv(): CliEnv {\n\tconst homeDir = readHomedir();\n\tconst configPath = userConfigPath(homeDir);\n\treturn loadCliConfig({\n\t\tconfigFileText: readOptionalConfigFile(configPath),\n\t\tconfigPath: configPath,\n\t\tenv: runtimeEnv,\n\t\thomeDir: homeDir,\n\t\thostName: readHostname(),\n\t});\n}\n\nfunction resolveSyncConfig(flags: SyncFlagConfig, env: CliEnv): ResolvedSyncConfig {\n\treturn {\n\t\ttoken: flags.token ?? env.token,\n\t\tdevice: flags.device ?? env.device,\n\t\tserverUrl: flags.api ?? flags.server ?? env.serverUrl,\n\t\tlookbackDays:\n\t\t\tflags.lookbackDays === undefined\n\t\t\t\t? env.lookbackDays\n\t\t\t\t: parseLookbackDays(flags.lookbackDays, \"--lookback-days\", \"CLI\"),\n\t\texclude: env.exclude,\n\t};\n}\n\nexport type { CliEnv, ResolvedSyncConfig, SyncFlagConfig };\nexport {\n\tCliConfigError,\n\tDEFAULT_LOOKBACK_DAYS,\n\tDEFAULT_SERVER_URL,\n\tloadCliConfig,\n\tloadCliConfigEffect,\n\tnormalizeConfigPath,\n\treadCliEnv,\n\tresolveSyncConfig,\n\tuserConfigPath,\n};\n","import { Context, Effect, Layer } from \"effect\";\nimport { type RunSyncOptions, type RunSyncResult, runSyncEffect } from \"../sync/run\";\n\ntype SyncProgramShape = {\n\treadonly run: (options: RunSyncOptions) => Effect.Effect<RunSyncResult, unknown>;\n};\n\nclass SyncProgram extends Context.Service<SyncProgram, SyncProgramShape>()(\"@oopst/cli/SyncProgram\") {}\n\nconst SyncProgramLive = Layer.succeed(SyncProgram, {\n\trun: runSyncEffect,\n});\n\nfunction runSyncProgram(options: RunSyncOptions): Effect.Effect<RunSyncResult, unknown> {\n\treturn Effect.gen(function* () {\n\t\tconst program = yield* SyncProgram;\n\t\treturn yield* program.run(options);\n\t}).pipe(Effect.provide(SyncProgramLive));\n}\n\nexport { runSyncProgram, SyncProgram, SyncProgramLive };\n","import type { ParsedBucket } from \"@oopst/parsers\";\nimport { Effect } from \"effect\";\nimport { aggregateUsage, type UsageBatch } from \"./aggregate\";\nimport { createClient, type SyncClient } from \"./client\";\nimport { EXIT, type ExitCode, isNetworkError, isUnauthorizedError, SyncError } from \"./errors\";\n\ntype Logger = {\n\tinfo: (msg: string) => void;\n\terror: (msg: string) => void;\n};\n\ntype ParserBundle = {\n\tcodex: AsyncIterable<ParsedBucket>;\n\tclaudeCode: AsyncIterable<ParsedBucket>;\n\tpi: AsyncIterable<ParsedBucket>;\n\thermes: AsyncIterable<ParsedBucket>;\n\topencode: AsyncIterable<ParsedBucket>;\n};\n\ntype ParserFactoryContext = {\n\tcutoff: Date;\n\tdevice: string;\n};\n\ntype RunSyncOptions = {\n\ttoken: string;\n\tdevice: string;\n\tserverUrl: string;\n\tlookbackDays: number;\n\tharness: ParsedBucket[\"harness\"] | undefined;\n\tdryRun: boolean;\n\tverbose: boolean;\n\tcolor?: boolean;\n\tlogger: Logger;\n\t/**\n\t * DI seam: injectors supply a parser bundle keyed on the (cutoff, device).\n\t * The CLI entrypoint passes a factory that drives the real local harness parsers.\n\t * Tests pass a factory returning fixture async iterables.\n\t */\n\tparserFactory: (ctx: ParserFactoryContext) => ParserBundle;\n\t/** Signal that source files were found on disk even though parsing yielded nothing. */\n\tsourcesExistedHint?: boolean;\n\t/** Optional override; defaults to globalThis.fetch. */\n\tfetch?: typeof fetch;\n\t/** Optional override for tests that need a constructed client. */\n\tclient?: SyncClient;\n};\n\ntype RunSyncResult = {\n\texitCode: ExitCode;\n\tbatchesUploaded: number;\n\tbucketsUploaded: number;\n\tsessionsUploaded: number;\n};\n\nconst HOURS_PER_DAY = 24;\nconst MINUTES_PER_HOUR = 60;\nconst SECONDS_PER_MINUTE = 60;\nconst MS_PER_SECOND = 1000;\nconst SYNC_BATCH_SIZE = 500;\nconst MS_PER_DAY = HOURS_PER_DAY * MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MS_PER_SECOND;\nconst SCAN_PROGRESS_SESSION_STEP = 500;\n\ntype SelectedSource = {\n\tlabel: string;\n\tsource: AsyncIterable<ParsedBucket>;\n};\n\ntype PendingNext<T> = {\n\tindex: number;\n\tresult: IteratorResult<T>;\n};\n\n/**\n * Run one CLI sync cycle: fetch watermark, parse local sources newer than\n * (watermark - lookbackDays), aggregate to hourly buckets, batch-upload to\n * the server. Returns an exit-code result; callers map this to process.exit.\n *\n * Exit codes (also in src/sync/errors.ts):\n * 0 success\n * 1 zero buckets produced but parser reported source files existed\n * 2 RPC UNAUTHORIZED — token rejected\n * 3 network error reaching the server\n * 4 missing / invalid CLI arguments\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: orchestration function inherently combines multiple flow paths\nasync function runSync(options: RunSyncOptions): Promise<RunSyncResult> {\n\tif (!options.token) {\n\t\tthrow new SyncError(EXIT.invalidArguments, \"missing --token\");\n\t}\n\tif (!options.device) {\n\t\tthrow new SyncError(EXIT.invalidArguments, \"missing --device\");\n\t}\n\n\tconst client =\n\t\toptions.client ?? createClient({ token: options.token, serverUrl: options.serverUrl, fetch: options.fetch });\n\n\tconst color = options.color === true;\n\tlet watermark: Date | null = null;\n\tlet sessionKeySalt: string;\n\ttry {\n\t\toptions.logger.info(phase(\"Checking server sync point...\", color));\n\t\tconst { sessionKeySalt: returnedSessionKeySalt, watermarkHourUtc } = await client.sync.getWatermark.mutate({\n\t\t\tdevice: options.device,\n\t\t});\n\t\twatermark = watermarkHourUtc ? new Date(watermarkHourUtc) : null;\n\t\tsessionKeySalt = returnedSessionKeySalt;\n\t} catch (err) {\n\t\treturn failureFromSyncError(err, options.logger);\n\t}\n\n\tconst cutoff = new Date((watermark?.getTime() ?? 0) - options.lookbackDays * MS_PER_DAY);\n\n\tif (options.verbose) {\n\t\toptions.logger.info(`watermark=${watermark?.toISOString() ?? \"null\"} cutoff=${cutoff.toISOString()}`);\n\t}\n\n\tconst parsers = options.parserFactory({ cutoff: cutoff, device: options.device });\n\n\tconst sources: SelectedSource[] = [];\n\tif (options.harness === undefined || options.harness === \"codex\") {\n\t\tsources.push({ label: \"Codex\", source: parsers.codex });\n\t}\n\tif (options.harness === undefined || options.harness === \"claude_code\") {\n\t\tsources.push({ label: \"Claude Code\", source: parsers.claudeCode });\n\t}\n\tif (options.harness === undefined || options.harness === \"pi\") {\n\t\tsources.push({ label: \"Pi\", source: parsers.pi });\n\t}\n\tif (options.harness === undefined || options.harness === \"hermes\") {\n\t\tsources.push({ label: \"Hermes\", source: parsers.hermes });\n\t}\n\tif (options.harness === undefined || options.harness === \"opencode\") {\n\t\tsources.push({ label: \"OpenCode\", source: parsers.opencode });\n\t}\n\n\tlet bucketsUploaded = 0;\n\tlet sessionsUploaded = 0;\n\tlet batchesUploaded = 0;\n\tconst batches: UsageBatch[] = [];\n\n\ttry {\n\t\tconst progressSources = sources.map((source) => withScanProgress(source, options.logger, color));\n\t\tfor await (const batch of aggregateUsage(merge(progressSources), {\n\t\t\tbatchSize: SYNC_BATCH_SIZE,\n\t\t\tsessionKeySalt: sessionKeySalt,\n\t\t})) {\n\t\t\tif (batch.buckets.length === 0 && batch.sessions.length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tbatches.push(batch);\n\t\t}\n\t} catch (err) {\n\t\treturn failureFromSyncError(err, options.logger);\n\t}\n\n\tconst plannedBuckets = batches.reduce((sum, batch) => sum + batch.buckets.length, 0);\n\tconst plannedSessions = batches.reduce((sum, batch) => sum + batch.sessions.length, 0);\n\n\tif (plannedBuckets === 0 && options.sourcesExistedHint === true) {\n\t\toptions.logger.error(\n\t\t\terrorLine(\n\t\t\t\t\"produced zero usage records but parser reported source files existed - likely parser regression\",\n\t\t\t\tcolor,\n\t\t\t),\n\t\t);\n\t\treturn { exitCode: EXIT.zeroBucketsButSourcesExist, batchesUploaded: 0, bucketsUploaded: 0, sessionsUploaded: 0 };\n\t}\n\n\tif (batches.length === 0) {\n\t\toptions.logger.info(`${successPrefix(color)} no usage records to upload.`);\n\t\treturn { exitCode: EXIT.success, batchesUploaded: 0, bucketsUploaded: 0, sessionsUploaded: 0 };\n\t}\n\n\toptions.logger.info(phase(`Aggregated usage by hour and model: ${usageRecordText(plannedBuckets)} ready.`, color));\n\n\tif (options.dryRun) {\n\t\toptions.logger.info(\n\t\t\t`${dryRunPrefix(color)} ${usageRecordText(plannedBuckets)} from ${localSessionText(plannedSessions)} would be uploaded in ${uploadRequestText(batches.length)}.`,\n\t\t);\n\t\toptions.logger.info(muted(\"No usage data was uploaded.\", color));\n\t\treturn {\n\t\t\texitCode: EXIT.success,\n\t\t\tbatchesUploaded: batches.length,\n\t\t\tbucketsUploaded: plannedBuckets,\n\t\t\tsessionsUploaded: plannedSessions,\n\t\t};\n\t}\n\n\ttry {\n\t\tfor (const [index, batch] of batches.entries()) {\n\t\t\toptions.logger.info(phase(`Uploading usage... ${index + 1}/${batches.length}`, color));\n\t\t\t// biome-ignore lint/performance/noAwaitInLoops: upload requests are sequential so progress reflects completed writes.\n\t\t\tconst result = await client.sync.upsertBuckets.mutate({\n\t\t\t\tdevice: options.device,\n\t\t\t\tbuckets: batch.buckets,\n\t\t\t\tsessions: batch.sessions,\n\t\t\t});\n\t\t\tbucketsUploaded += result.upserted;\n\t\t\tsessionsUploaded += result.upsertedSessions;\n\t\t\tbatchesUploaded += 1;\n\t\t}\n\t} catch (err) {\n\t\treturn failureFromSyncError(err, options.logger);\n\t}\n\n\toptions.logger.info(\n\t\t`${successPrefix(color)} uploaded ${usageRecordText(bucketsUploaded)} from ${localSessionText(sessionsUploaded)}${options.verbose ? ` in ${uploadRequestText(batchesUploaded)}` : \"\"}.`,\n\t);\n\n\treturn {\n\t\texitCode: EXIT.success,\n\t\tbatchesUploaded: batchesUploaded,\n\t\tbucketsUploaded: bucketsUploaded,\n\t\tsessionsUploaded: sessionsUploaded,\n\t};\n}\n\nfunction runSyncEffect(options: RunSyncOptions): Effect.Effect<RunSyncResult, unknown> {\n\treturn Effect.tryPromise({\n\t\ttry: () => runSync(options),\n\t\tcatch: (err) => err,\n\t});\n}\n\nfunction colorize(enabled: boolean, code: string, text: string): string {\n\treturn enabled ? `\\x1b[${code}m${text}\\x1b[0m` : text;\n}\n\nfunction phase(text: string, color: boolean): string {\n\treturn colorize(color, \"36\", text);\n}\n\nfunction muted(text: string, color: boolean): string {\n\treturn colorize(color, \"2\", text);\n}\n\nfunction successPrefix(color: boolean): string {\n\treturn colorize(color, \"32\", \"Done:\");\n}\n\nfunction dryRunPrefix(color: boolean): string {\n\treturn colorize(color, \"33\", \"Dry run complete:\");\n}\n\nfunction errorLine(text: string, color: boolean): string {\n\treturn colorize(color, \"31\", text);\n}\n\nfunction formatNumber(value: number): string {\n\treturn new Intl.NumberFormat(\"en-US\").format(value);\n}\n\nfunction plural(value: number, noun: string): string {\n\treturn `${formatNumber(value)} ${noun}${value === 1 ? \"\" : \"s\"}`;\n}\n\nfunction usageRecordText(value: number): string {\n\treturn plural(value, \"hourly usage record\");\n}\n\nfunction localSessionText(value: number): string {\n\treturn plural(value, \"local session\");\n}\n\nfunction uploadRequestText(value: number): string {\n\treturn plural(value, \"upload request\");\n}\n\nasync function* withScanProgress(\n\tselected: SelectedSource,\n\tlogger: Logger,\n\tcolor: boolean,\n): AsyncIterable<ParsedBucket> {\n\tconst sessionIds = new Set<string>();\n\tlet nextProgressAt = SCAN_PROGRESS_SESSION_STEP;\n\n\tlogger.info(phase(`Scanning ${selected.label} sessions...`, color));\n\n\tfor await (const bucket of selected.source) {\n\t\tfor (const id of bucket.sessionIds) {\n\t\t\tsessionIds.add(id);\n\t\t}\n\n\t\tif (sessionIds.size >= nextProgressAt) {\n\t\t\tlogger.info(phase(`Scanning ${selected.label} sessions... ${localSessionText(sessionIds.size)} found`, color));\n\t\t\twhile (nextProgressAt <= sessionIds.size) {\n\t\t\t\tnextProgressAt += SCAN_PROGRESS_SESSION_STEP;\n\t\t\t}\n\t\t}\n\n\t\tyield bucket;\n\t}\n\n\tlogger.info(phase(`Scanned ${selected.label} sessions: ${localSessionText(sessionIds.size)} found.`, color));\n}\n\nasync function* merge<T>(sources: AsyncIterable<T>[]): AsyncIterable<T> {\n\tconst iterators = sources.map((source) => source[Symbol.asyncIterator]());\n\tconst pending = new Map<number, Promise<PendingNext<T>>>();\n\n\tconst queueNext = (index: number): void => {\n\t\tconst iterator = iterators[index];\n\t\tif (!iterator) {\n\t\t\treturn;\n\t\t}\n\t\tpending.set(\n\t\t\tindex,\n\t\t\titerator.next().then((result) => ({ index: index, result: result })),\n\t\t);\n\t};\n\n\tfor (const index of iterators.keys()) {\n\t\tqueueNext(index);\n\t}\n\n\ttry {\n\t\twhile (pending.size > 0) {\n\t\t\t// biome-ignore lint/performance/noAwaitInLoops: each race advances whichever parser is ready next.\n\t\t\tconst next = await Promise.race(pending.values());\n\t\t\tpending.delete(next.index);\n\n\t\t\tif (next.result.done === true) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tyield next.result.value;\n\t\t\tqueueNext(next.index);\n\t\t}\n\t} finally {\n\t\tawait Promise.allSettled(iterators.map((iterator) => iterator.return?.()));\n\t}\n}\n\nfunction failureFromSyncError(err: unknown, logger: Logger): RunSyncResult {\n\tif (isUnauthorizedError(err)) {\n\t\tlogger.error(\"auth failure: token rejected by server\");\n\t\treturn { exitCode: EXIT.unauthorized, batchesUploaded: 0, bucketsUploaded: 0, sessionsUploaded: 0 };\n\t}\n\tif (isNetworkError(err)) {\n\t\tlogger.error(`network error: ${(err as Error).message}`);\n\t\treturn { exitCode: EXIT.networkError, batchesUploaded: 0, bucketsUploaded: 0, sessionsUploaded: 0 };\n\t}\n\tthrow err;\n}\n\nexport type { Logger, ParserBundle, ParserFactoryContext, RunSyncOptions, RunSyncResult };\nexport { runSync, runSyncEffect };\n","import { createHmac } from \"node:crypto\";\nimport type { BucketInput, SessionInput } from \"@oopst/api\";\nimport type { ParsedBucket } from \"@oopst/parsers\";\n\ntype AggregateOptions = {\n\tbatchSize: number;\n\tsessionKeySalt: string;\n};\n\ntype Accumulator = {\n\tharness: BucketInput[\"harness\"];\n\tmodel: string;\n\thourUtc: string;\n\tinputTokens: number;\n\toutputTokens: number;\n\tcacheReadTokens: number;\n\tcacheCreateTokens: number;\n\tsessionIds: Set<string>;\n};\n\ntype SessionAccumulator = {\n\tharness: SessionInput[\"harness\"];\n\tsessionKey: string;\n\tstartedAt: Date;\n\tlastSeenAt: Date;\n};\n\ntype UsageBatch = {\n\tbuckets: BucketInput[];\n\tsessions: SessionInput[];\n};\n\nfunction toIso(hourUtc: Date | string): string {\n\treturn hourUtc instanceof Date ? hourUtc.toISOString() : hourUtc;\n}\n\nfunction key(b: { harness: string; model: string; hourUtc: Date | string }): string {\n\treturn `${b.harness} ${b.model} ${toIso(b.hourUtc)}`;\n}\n\nfunction finalize(acc: Accumulator): BucketInput {\n\treturn {\n\t\tharness: acc.harness,\n\t\tmodel: acc.model,\n\t\thourUtc: acc.hourUtc,\n\t\tinputTokens: acc.inputTokens,\n\t\toutputTokens: acc.outputTokens,\n\t\tcacheReadTokens: acc.cacheReadTokens,\n\t\tcacheCreateTokens: acc.cacheCreateTokens,\n\t\tsessionCount: acc.sessionIds.size,\n\t};\n}\n\nconst SESSION_KEY_SALT_PATTERN = /^[a-f0-9]{64}$/u;\n\nfunction createSessionKey(harness: string, localSessionId: string, sessionKeySalt: string): string {\n\tif (!SESSION_KEY_SALT_PATTERN.test(sessionKeySalt)) {\n\t\tthrow new Error(\"invalid session key salt\");\n\t}\n\n\treturn createHmac(\"sha256\", Buffer.from(sessionKeySalt, \"hex\"))\n\t\t.update(\"oopst/session-key/v1\")\n\t\t.update(\"\\0\")\n\t\t.update(harness)\n\t\t.update(\"\\0\")\n\t\t.update(localSessionId)\n\t\t.digest(\"hex\");\n}\n\nfunction sessionMapKey(harness: string, sessionKey: string): string {\n\treturn `${harness} ${sessionKey}`;\n}\n\nfunction finalizeSession(acc: SessionAccumulator): SessionInput {\n\treturn {\n\t\tharness: acc.harness,\n\t\tsessionKey: acc.sessionKey,\n\t\tstartedAt: acc.startedAt.toISOString(),\n\t\tlastSeenAt: acc.lastSeenAt.toISOString(),\n\t};\n}\n\nfunction addSessionAccumulator(\n\tsessionAccumulators: Map<string, SessionAccumulator>,\n\tbucket: ParsedBucket,\n\tlocalSessionId: string,\n\tsessionKeySalt: string,\n): void {\n\tconst sessionKey = createSessionKey(bucket.harness, localSessionId, sessionKeySalt);\n\tconst sessionAccumulatorKey = sessionMapKey(bucket.harness, sessionKey);\n\tconst existingSession = sessionAccumulators.get(sessionAccumulatorKey);\n\tif (existingSession) {\n\t\tif (bucket.sessionStartedAt.getTime() < existingSession.startedAt.getTime()) {\n\t\t\texistingSession.startedAt = bucket.sessionStartedAt;\n\t\t}\n\t\tif (bucket.sessionLastSeenAt.getTime() > existingSession.lastSeenAt.getTime()) {\n\t\t\texistingSession.lastSeenAt = bucket.sessionLastSeenAt;\n\t\t}\n\t\treturn;\n\t}\n\n\tsessionAccumulators.set(sessionAccumulatorKey, {\n\t\tharness: bucket.harness,\n\t\tsessionKey: sessionKey,\n\t\tstartedAt: bucket.sessionStartedAt,\n\t\tlastSeenAt: bucket.sessionLastSeenAt,\n\t});\n}\n\n/**\n * Group an async iterable of parser-emitted buckets by (harness, model, hourUtc),\n * summing token columns and counting distinct sessionIds → sessionCount.\n * Yields batches of at most `batchSize` finalized buckets.\n */\nasync function* aggregate(\n\tsource: AsyncIterable<ParsedBucket>,\n\toptions: AggregateOptions,\n): AsyncIterable<BucketInput[]> {\n\tfor await (const batch of aggregateUsage(source, options)) {\n\t\tif (batch.buckets.length > 0) {\n\t\t\tyield batch.buckets;\n\t\t}\n\t}\n}\n\n/**\n * Group parser output into uploadable hourly buckets and exact session facts.\n * Session facts use privacy-safe deterministic HMAC keys derived on-device\n * from local-only parser session ids plus the server-owned per-device salt.\n */\nasync function* aggregateUsage(\n\tsource: AsyncIterable<ParsedBucket>,\n\toptions: AggregateOptions,\n): AsyncIterable<UsageBatch> {\n\tconst accumulators = new Map<string, Accumulator>();\n\tconst sessionAccumulators = new Map<string, SessionAccumulator>();\n\n\tfor await (const bucket of source) {\n\t\tconst k = key(bucket);\n\t\tlet acc = accumulators.get(k);\n\t\tif (!acc) {\n\t\t\tacc = {\n\t\t\t\tharness: bucket.harness,\n\t\t\t\tmodel: bucket.model,\n\t\t\t\thourUtc: toIso(bucket.hourUtc),\n\t\t\t\tinputTokens: 0,\n\t\t\t\toutputTokens: 0,\n\t\t\t\tcacheReadTokens: 0,\n\t\t\t\tcacheCreateTokens: 0,\n\t\t\t\tsessionIds: new Set(),\n\t\t\t};\n\t\t\taccumulators.set(k, acc);\n\t\t}\n\t\tacc.inputTokens += bucket.inputTokens;\n\t\tacc.outputTokens += bucket.outputTokens;\n\t\tacc.cacheReadTokens += bucket.cacheReadTokens;\n\t\tacc.cacheCreateTokens += bucket.cacheCreateTokens;\n\t\tfor (const id of bucket.sessionIds) {\n\t\t\tacc.sessionIds.add(id);\n\t\t\taddSessionAccumulator(sessionAccumulators, bucket, id, options.sessionKeySalt);\n\t\t}\n\t}\n\n\tconst finalized: BucketInput[] = [];\n\tfor (const acc of accumulators.values()) {\n\t\tfinalized.push(finalize(acc));\n\t}\n\n\tconst finalizedSessions: SessionInput[] = [];\n\tfor (const acc of sessionAccumulators.values()) {\n\t\tfinalizedSessions.push(finalizeSession(acc));\n\t}\n\n\tconst maxLength = Math.max(finalized.length, finalizedSessions.length);\n\tfor (let i = 0; i < maxLength; i += options.batchSize) {\n\t\tyield {\n\t\t\tbuckets: finalized.slice(i, i + options.batchSize),\n\t\t\tsessions: finalizedSessions.slice(i, i + options.batchSize),\n\t\t};\n\t}\n}\n\nexport type { AggregateOptions, UsageBatch };\nexport { aggregate, aggregateUsage, createSessionKey };\n","import {\n\ttype BucketInput,\n\ttype GetWatermarkOutput,\n\ttype SessionInput,\n\tSyncRpcs,\n\ttype UpsertBucketsOutput,\n} from \"@oopst/api\";\nimport { Effect, Layer } from \"effect\";\nimport { FetchHttpClient, HttpClient, HttpClientRequest } from \"effect/unstable/http\";\nimport { RpcClient, RpcSerialization } from \"effect/unstable/rpc\";\n\nconst AUTHORIZATION_HEADER = \"authorization\";\nconst SYNC_RPC_PATH = \"/rpc/sync\";\n\ntype CreateClientOptions = {\n\ttoken: string;\n\tserverUrl: string;\n\t/** Allow tests to inject a fetch mock; defaults to global fetch (Node 24+). */\n\tfetch?: typeof fetch;\n};\n\ntype SyncClient = {\n\treadonly sync: {\n\t\treadonly getWatermark: {\n\t\t\treadonly mutate: (input: { readonly device: string }) => Promise<GetWatermarkOutput>;\n\t\t};\n\t\treadonly upsertBuckets: {\n\t\t\treadonly mutate: (input: {\n\t\t\t\treadonly device: string;\n\t\t\t\treadonly buckets: readonly BucketInput[];\n\t\t\t\treadonly sessions: readonly SessionInput[];\n\t\t\t}) => Promise<UpsertBucketsOutput>;\n\t\t};\n\t};\n};\n\nfunction createClient(options: CreateClientOptions): SyncClient {\n\tconst clientLive = makeClientLive(options);\n\treturn {\n\t\tsync: {\n\t\t\tgetWatermark: {\n\t\t\t\tmutate: (input) =>\n\t\t\t\t\tEffect.runPromise(\n\t\t\t\t\t\tEffect.scoped(\n\t\t\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\t\t\tconst client = yield* RpcClient.make(SyncRpcs);\n\t\t\t\t\t\t\t\treturn yield* client[\"sync.getWatermark\"](input);\n\t\t\t\t\t\t\t}).pipe(Effect.provide(clientLive)),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t},\n\t\t\tupsertBuckets: {\n\t\t\t\tmutate: (input) =>\n\t\t\t\t\tEffect.runPromise(\n\t\t\t\t\t\tEffect.scoped(\n\t\t\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\t\t\tconst client = yield* RpcClient.make(SyncRpcs);\n\t\t\t\t\t\t\t\treturn yield* client[\"sync.upsertBuckets\"](input);\n\t\t\t\t\t\t\t}).pipe(Effect.provide(clientLive)),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t},\n\t\t},\n\t};\n}\n\nfunction makeClientLive(options: CreateClientOptions): Layer.Layer<RpcClient.Protocol, never, never> {\n\treturn RpcClient.layerProtocolHttp({\n\t\turl: stripTrailingSlash(options.serverUrl),\n\t\ttransformClient: HttpClient.mapRequest((request) =>\n\t\t\trequest.pipe(\n\t\t\t\tHttpClientRequest.appendUrl(SYNC_RPC_PATH),\n\t\t\t\tHttpClientRequest.setHeader(AUTHORIZATION_HEADER, `Bearer ${options.token}`),\n\t\t\t),\n\t\t),\n\t}).pipe(Layer.provide(RpcSerialization.layerJson), Layer.provide(FetchHttpClient.layer));\n}\n\nfunction stripTrailingSlash(url: string): string {\n\treturn url.endsWith(\"/\") ? url.slice(0, -1) : url;\n}\n\nexport type { CreateClientOptions, SyncClient };\nexport { createClient };\n","export { hashPassword, verifyPassword } from \"./auth/argon\";\nexport {\n\ttype CreatedSession,\n\ttype CreateSessionOptions,\n\tcreateSession,\n\tdeleteSession,\n\tfindActiveSession,\n} from \"./auth/sessions\";\nexport { extractPrefix, type GeneratedToken, generateToken, hashToken, verifyToken } from \"./auth/tokens\";\nexport type { Context, SessionContext, TokenAuthContext } from \"./context\";\nexport {\n\tAppConfigError,\n\tConflictError,\n\tDatabaseError,\n\tExternalHttpError,\n\tForbiddenError,\n\tNotFoundError,\n\tParserSourceError,\n\tPricingRefreshError,\n\tRateLimitedError,\n\tSyncQuotaExceededError,\n\tSyncTimestampRejectedError,\n\tUnauthorizedError,\n\tValidationError,\n} from \"./errors\";\nexport { costExpr } from \"./queries/cost\";\nexport { AuthRpcHandlers, AuthRpcs, AuthUserResponse, LogoutResponse, WebRpcContext } from \"./rpc/auth\";\nexport { DevicesRpcs } from \"./rpc/devices\";\nexport { WebRpcs } from \"./rpc/groups\";\nexport { StatsRpcs } from \"./rpc/stats\";\nexport { SyncRpcs } from \"./rpc/sync\";\nexport { SystemPingResponse, SystemRpcHandlers, SystemRpcs } from \"./rpc/system\";\nexport { TokensRpcs } from \"./rpc/tokens\";\nexport { type UpdateProfileInput, updateProfileInput } from \"./schemas/auth\";\nexport {\n\tapiUrl,\n\tboundedString,\n\tcivilDate,\n\ttype GeneralUuid,\n\tgeneralUuid,\n\thex64,\n\tianaTimezone,\n\tisoUtcString,\n\tnonEmptyTrimmedString,\n\tnonNegativeSafeInteger,\n\tsafeInteger,\n\ttype UuidV7,\n\tuuidV7,\n} from \"./schemas/common\";\nexport { type RenameDeviceInput, type RenameDeviceOutput, renameDeviceInput } from \"./schemas/devices\";\nexport type {\n\tDailyCostInput,\n\tDailyPoint,\n\tDailySessionsInput,\n\tDailySessionsPoint,\n\tDeviceSummary,\n\tHourlySessionsInput,\n\tHourlySessionsPoint,\n\tLeaderboardInput,\n\tLeaderboardRow,\n\tParticipantSync,\n\tSummary,\n\tSummaryInput,\n\tTopDimensions,\n\tUsageDetailsInput,\n\tUsageDetailsRow,\n\tWeekdaySessionsInput,\n\tWeekdaySessionsPoint,\n} from \"./schemas/stats\";\nexport type { BucketInput, GetWatermarkOutput, SessionInput, UpsertBucketsOutput } from \"./schemas/sync\";\nexport {\n\ttype CreateTokenInput,\n\ttype CreateTokenOutput,\n\tcreateTokenInput,\n\ttype ListTokensOutput,\n\ttype RevokeTokenInput,\n\ttype RevokeTokenOutput,\n\trevokeTokenInput,\n\ttype TokenMetadata,\n} from \"./schemas/tokens\";\nexport { AuthService, AuthServiceLive } from \"./services/auth\";\nexport { DeviceService, DeviceServiceLive } from \"./services/devices\";\nexport { StatsService, StatsServiceLive } from \"./services/stats\";\nexport { SyncService, SyncServiceLive } from \"./services/sync\";\nexport {\n\ttype AuthenticatedToken,\n\ttype AuthenticateTokenCommand,\n\tTokenAuthService,\n\tTokenAuthServiceLive,\n} from \"./services/token-auth\";\nexport { TokenService, TokenServiceLive } from \"./services/tokens\";\n","// biome-ignore lint/correctness/noUnresolvedImports: argon2 is a native addon resolved at runtime\nimport argon2 from \"argon2\";\n\nconst MEMORY_COST = 65_536;\n\nconst OPTIONS = {\n\ttype: argon2.argon2id,\n\tmemoryCost: MEMORY_COST,\n\ttimeCost: 3,\n\tparallelism: 1,\n} as const;\n\n// biome-ignore lint/suspicious/useAwait: async for consistent Promise return type\nexport async function hashPassword(plain: string): Promise<string> {\n\treturn argon2.hash(plain, OPTIONS);\n}\n\nexport async function verifyPassword(plain: string, hash: string): Promise<boolean> {\n\ttry {\n\t\treturn await argon2.verify(hash, plain);\n\t} catch {\n\t\treturn false;\n\t}\n}\n","import type { DbClient } from \"@oopst/db\";\nimport type { User } from \"@oopst/db/schema\";\nimport { Effect } from \"effect\";\nimport type {\n\tCreatedSession as SessionAuthCreatedSession,\n\tCreateSessionOptions as SessionAuthCreateSessionOptions,\n} from \"../services/session-auth\";\nimport { SessionAuthService, SessionAuthServiceLive } from \"../services/session-auth\";\n\nconst runSessionAuth = <A, E>(effect: Effect.Effect<A, E, SessionAuthService>): Promise<A> =>\n\teffect.pipe(Effect.provide(SessionAuthServiceLive), Effect.runPromise);\n\nasync function createSession(\n\tdb: DbClient,\n\tuserId: string,\n\toptions: SessionAuthCreateSessionOptions = {},\n): Promise<SessionAuthCreatedSession> {\n\treturn runSessionAuth(\n\t\tEffect.gen(function* () {\n\t\t\tconst service = yield* SessionAuthService;\n\t\t\treturn yield* service.create({ db: db, userId: userId, expiresAt: options.expiresAt });\n\t\t}),\n\t);\n}\n\nasync function findActiveSession(db: DbClient, sessionId: string): Promise<{ id: string; user: User } | null> {\n\treturn runSessionAuth(\n\t\tEffect.gen(function* () {\n\t\t\tconst service = yield* SessionAuthService;\n\t\t\treturn yield* service.findActive({ db: db, sessionId: sessionId });\n\t\t}),\n\t);\n}\n\nasync function deleteSession(db: DbClient, sessionId: string): Promise<void> {\n\treturn runSessionAuth(\n\t\tEffect.gen(function* () {\n\t\t\tconst service = yield* SessionAuthService;\n\t\t\treturn yield* service.delete({ db: db, sessionId: sessionId });\n\t\t}),\n\t);\n}\n\nexport type { CreatedSession, CreateSessionOptions } from \"../services/session-auth\";\nexport { createSession, deleteSession, findActiveSession };\n","import type { DbClient } from \"@oopst/db\";\nimport type { User } from \"@oopst/db/schema\";\nimport { sessionTable, userTable } from \"@oopst/db/schema\";\nimport { and, eq, gt } from \"drizzle-orm\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { DatabaseError } from \"../errors\";\n\ntype CreateSessionOptions = {\n\treadonly expiresAt?: Date;\n};\n\ntype CreateSessionCommand = CreateSessionOptions & {\n\treadonly db: DbClient;\n\treadonly userId: string;\n};\n\ntype FindActiveSessionCommand = {\n\treadonly db: DbClient;\n\treadonly sessionId: string;\n};\n\ntype DeleteSessionCommand = {\n\treadonly db: DbClient;\n\treadonly sessionId: string;\n};\n\ntype CreatedSession = {\n\treadonly id: string;\n\treadonly expiresAt: Date;\n};\n\ntype ActiveSession = {\n\treadonly id: string;\n\treadonly user: User;\n};\n\ntype SessionAuthServiceShape = {\n\treadonly create: (input: CreateSessionCommand) => Effect.Effect<CreatedSession, DatabaseError>;\n\treadonly findActive: (input: FindActiveSessionCommand) => Effect.Effect<ActiveSession | null, DatabaseError>;\n\treadonly delete: (input: DeleteSessionCommand) => Effect.Effect<void, DatabaseError>;\n};\n\nconst SESSION_TTL_DAYS = 30;\nconst HOURS_PER_DAY = 24;\nconst MINUTES_PER_HOUR = 60;\nconst SECONDS_PER_MINUTE = 60;\nconst MS_PER_SECOND = 1000;\nconst ACTIVE_SESSION_LIMIT = 1;\nconst THIRTY_DAYS_MS = SESSION_TTL_DAYS * HOURS_PER_DAY * MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MS_PER_SECOND;\n\nclass SessionAuthService extends Context.Service<SessionAuthService, SessionAuthServiceShape>()(\n\t\"@oopst/api/SessionAuthService\",\n) {}\n\nconst databaseError = (err: unknown): DatabaseError =>\n\tnew DatabaseError({ message: err instanceof Error ? err.message : \"Session database operation failed\" });\n\nconst makeSessionAuthService = (): SessionAuthServiceShape => ({\n\tcreate: (input) =>\n\t\tEffect.tryPromise({\n\t\t\ttry: async () => {\n\t\t\t\tconst expiresAt = input.expiresAt ?? new Date(Date.now() + THIRTY_DAYS_MS);\n\t\t\t\tconst rows = await input.db\n\t\t\t\t\t.insert(sessionTable)\n\t\t\t\t\t.values({ userId: input.userId, expiresAt: expiresAt })\n\t\t\t\t\t.returning({ id: sessionTable.id, expiresAt: sessionTable.expiresAt });\n\t\t\t\t// biome-ignore lint/nursery/useDestructuring: guard needed before destructuring.\n\t\t\t\tconst row = rows[0];\n\t\t\t\tif (!row) {\n\t\t\t\t\tthrow new Error(\"Failed to insert session\");\n\t\t\t\t}\n\t\t\t\treturn { id: row.id, expiresAt: row.expiresAt };\n\t\t\t},\n\t\t\tcatch: databaseError,\n\t\t}),\n\tfindActive: (input) =>\n\t\tEffect.tryPromise({\n\t\t\ttry: async () => {\n\t\t\t\tconst rows = await input.db\n\t\t\t\t\t.select({ id: sessionTable.id, user: userTable })\n\t\t\t\t\t.from(sessionTable)\n\t\t\t\t\t.innerJoin(userTable, eq(sessionTable.userId, userTable.id))\n\t\t\t\t\t.where(and(eq(sessionTable.id, input.sessionId), gt(sessionTable.expiresAt, new Date())))\n\t\t\t\t\t.limit(ACTIVE_SESSION_LIMIT);\n\t\t\t\tif (rows.length === 0 || !rows[0]) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\treturn { id: rows[0].id, user: rows[0].user };\n\t\t\t},\n\t\t\tcatch: databaseError,\n\t\t}),\n\tdelete: (input) =>\n\t\tEffect.tryPromise({\n\t\t\ttry: async () => {\n\t\t\t\tawait input.db.delete(sessionTable).where(eq(sessionTable.id, input.sessionId));\n\t\t\t},\n\t\t\tcatch: databaseError,\n\t\t}),\n});\n\nconst SessionAuthServiceLive = Layer.succeed(SessionAuthService, makeSessionAuthService());\n\nexport type {\n\tActiveSession,\n\tCreatedSession,\n\tCreateSessionCommand,\n\tCreateSessionOptions,\n\tDeleteSessionCommand,\n\tFindActiveSessionCommand,\n};\nexport { SessionAuthService, SessionAuthServiceLive };\n","export type { ApiToken, NewApiToken } from \"./api-token\";\nexport { apiTokenTable } from \"./api-token\";\nexport type { Device, NewDevice } from \"./device\";\nexport { deviceTable } from \"./device\";\nexport type { ModelPrice, NewModelPrice } from \"./model-price\";\nexport { modelPriceTable } from \"./model-price\";\nexport type { NewSession, Session } from \"./session\";\nexport { sessionTable } from \"./session\";\nexport type { NewUsageHour, UsageHour } from \"./usage-hour\";\nexport { usageHourTable } from \"./usage-hour\";\nexport type { NewUsageSession, UsageSession } from \"./usage-session\";\nexport { usageSessionTable } from \"./usage-session\";\nexport type { NewUser, User } from \"./user\";\nexport { userTable } from \"./user\";\n","import { sql } from \"drizzle-orm\";\nimport { pgTable, text, timestamp, uuid } from \"drizzle-orm/pg-core\";\nimport { userTable } from \"./user\";\n\nexport const apiTokenTable = pgTable(\"api_token\", {\n\tid: uuid(\"id\").primaryKey().default(sql`uuidv7()`),\n\tuserId: uuid(\"user_id\")\n\t\t.notNull()\n\t\t.references(() => userTable.id, { onDelete: \"cascade\" }),\n\tname: text(\"name\").notNull(),\n\ttokenHash: text(\"token_hash\").notNull().unique(),\n\tprefix: text(\"prefix\").notNull(),\n\tlastUsedAt: timestamp(\"last_used_at\", { withTimezone: true }),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n\trevokedAt: timestamp(\"revoked_at\", { withTimezone: true }),\n});\n\nexport type ApiToken = typeof apiTokenTable.$inferSelect;\nexport type NewApiToken = typeof apiTokenTable.$inferInsert;\n","import { entityKind, hasOwnEntityKind, is } from \"./entity.js\";\nimport { Subquery, WithSubquery } from \"./subquery.js\";\nimport { Column, getColumnTable } from \"./column.js\";\nimport { BaseName, ExtraConfigBuilder, ExtraConfigColumns, IsAlias, OriginalName, Table, TableColumns, TableSchema, getTableName, getTableUniqueName, isTable } from \"./table.js\";\nimport { FakePrimitiveParam, Name, Param, Placeholder, SQL, StringChunk, View, fillPlaceholders, getViewName, isDriverValueEncoder, isNoop, isSQLWrapper, isView, name, noopDecoder, noopEncoder, noopMapper, param, placeholder, sql, sqlCommenter } from \"./sql/sql.js\";\nimport { ViewBaseConfig } from \"./view-common.js\";\nimport { ColumnAliasProxyHandler, ColumnTableAliasProxyHandler, RelationTableAliasProxyHandler, TableAliasProxyHandler, ViewSelectionAliasProxyHandler, aliasedColumn, aliasedRelation, aliasedTable, aliasedTableColumn, getOriginalColumnFromAlias, mapColumnsInAliasedSQLToAlias, mapColumnsInSQLToAlias } from \"./alias.js\";\nimport { ColumnBuilder, extractExtendedColumnType } from \"./column-builder.js\";\nimport { DrizzleError, DrizzleQueryError, TransactionRollbackError } from \"./errors.js\";\nimport { ConsoleLogWriter, DefaultLogger, NoopLogger } from \"./logger.js\";\nimport { QueryPromise } from \"./query-promise.js\";\nimport { and, arrayContained, arrayContains, arrayOverlaps, between, bindIfParam, eq, exists, gt, gte, ilike, inArray, isNotNull, isNull, like, lt, lte, ne, not, notBetween, notExists, notIlike, notInArray, notLike, or } from \"./sql/expressions/conditions.js\";\nimport { asc, desc } from \"./sql/expressions/select.js\";\nimport { CONSTANTS, FnConstructor, applyMixins, assertUnreachable, base64ToUint8Array, getColumnNameAndConfig, getColumns, getTableColumns, getTableLikeName, getViewSelectedFields, haveSameKeys, isConfig, isWithEnum, jitCompatCheck, make$ReturningResponseMapper, makeDefaultQueryMapper, makeJitQueryMapper, mapResultRow, mapUpdateSet, orderSelectedFields, textDecoder } from \"./utils.js\";\nimport { AggregatedField, Count, Many, One, Relation, RelationsBuilderColumn, RelationsBuilderJunctionColumn, RelationsBuilderTable, RelationsHelperStatic, buildRelations, buildRelationsParts, createRelationsHelper, defineRelations, defineRelationsPart, extractTablesFromSchema, fieldSelectionToSQL, getOrderByOperators, getTableAsAliasSQL, makeDefaultRqbMapper, makeJitRqbMapper, mapRelationalRow, mapRelationalRowFromArrays, operators, orderByOperators, processRelations, relationExtrasToSQL, relationToSQL, relationsFilterToSQL, relationsOrderToSQL } from \"./relations.js\";\nimport { avg, avgDistinct, count, countDistinct, max, min, sum, sumDistinct } from \"./sql/functions/aggregate.js\";\nimport { cosineDistance, hammingDistance, innerProduct, jaccardDistance, l1Distance, l2Distance } from \"./sql/functions/vector.js\";\n\nexport { AggregatedField, BaseName, CONSTANTS, Column, ColumnAliasProxyHandler, ColumnBuilder, ColumnTableAliasProxyHandler, ConsoleLogWriter, Count, DefaultLogger, DrizzleError, DrizzleQueryError, ExtraConfigBuilder, ExtraConfigColumns, FakePrimitiveParam, FnConstructor, IsAlias, Many, Name, NoopLogger, One, OriginalName, Param, Placeholder, QueryPromise, Relation, RelationTableAliasProxyHandler, RelationsBuilderColumn, RelationsBuilderJunctionColumn, RelationsBuilderTable, RelationsHelperStatic, SQL, StringChunk, Subquery, Table, TableAliasProxyHandler, TableColumns, TableSchema, TransactionRollbackError, View, ViewBaseConfig, ViewSelectionAliasProxyHandler, WithSubquery, aliasedColumn, aliasedRelation, aliasedTable, aliasedTableColumn, and, applyMixins, arrayContained, arrayContains, arrayOverlaps, asc, assertUnreachable, avg, avgDistinct, base64ToUint8Array, between, bindIfParam, buildRelations, buildRelationsParts, cosineDistance, count, countDistinct, createRelationsHelper, defineRelations, defineRelationsPart, desc, entityKind, eq, exists, extractExtendedColumnType, extractTablesFromSchema, fieldSelectionToSQL, fillPlaceholders, getColumnNameAndConfig, getColumnTable, getColumns, getOrderByOperators, getOriginalColumnFromAlias, getTableAsAliasSQL, getTableColumns, getTableLikeName, getTableName, getTableUniqueName, getViewName, getViewSelectedFields, gt, gte, hammingDistance, hasOwnEntityKind, haveSameKeys, ilike, inArray, innerProduct, is, isConfig, isDriverValueEncoder, isNoop, isNotNull, isNull, isSQLWrapper, isTable, isView, isWithEnum, jaccardDistance, jitCompatCheck, l1Distance, l2Distance, like, lt, lte, make$ReturningResponseMapper, makeDefaultQueryMapper, makeDefaultRqbMapper, makeJitQueryMapper, makeJitRqbMapper, mapColumnsInAliasedSQLToAlias, mapColumnsInSQLToAlias, mapRelationalRow, mapRelationalRowFromArrays, mapResultRow, mapUpdateSet, max, min, name, ne, noopDecoder, noopEncoder, noopMapper, not, notBetween, notExists, notIlike, notInArray, notLike, operators, or, orderByOperators, orderSelectedFields, param, placeholder, processRelations, relationExtrasToSQL, relationToSQL, relationsFilterToSQL, relationsOrderToSQL, sql, sqlCommenter, sum, sumDistinct, textDecoder };","export const entityKind = Symbol.for('drizzle:entityKind');\nexport const hasOwnEntityKind = Symbol.for('drizzle:hasOwnEntityKind');\n\nexport interface DrizzleEntity {\n\t[entityKind]: string;\n}\n\nexport type DrizzleEntityClass<T> =\n\t& ((abstract new(...args: any[]) => T) | (new(...args: any[]) => T))\n\t& DrizzleEntity;\n\nexport function is<T extends DrizzleEntityClass<any>>(value: any, type: T): value is InstanceType<T> {\n\tif (!value || typeof value !== 'object') {\n\t\treturn false;\n\t}\n\n\tif (value instanceof type) { // oxlint-disable-line drizzle-internal/no-instanceof\n\t\treturn true;\n\t}\n\n\tif (!Object.prototype.hasOwnProperty.call(type, entityKind)) {\n\t\tthrow new Error(\n\t\t\t`Class \"${\n\t\t\t\ttype.name ?? '<unknown>'\n\t\t\t}\" doesn't look like a Drizzle entity. If this is incorrect and the class is provided by Drizzle, please report this as a bug.`,\n\t\t);\n\t}\n\n\tlet cls = Object.getPrototypeOf(value)?.constructor;\n\tif (cls) {\n\t\t// Traverse the prototype chain to find the entityKind\n\t\twhile (cls) {\n\t\t\tif (entityKind in cls && cls[entityKind] === type[entityKind]) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tcls = Object.getPrototypeOf(cls);\n\t\t}\n\t}\n\n\treturn false;\n}\n","import { entityKind } from './entity.ts';\nimport type { SQL, SQLWrapper } from './sql/sql.ts';\n\nexport interface Subquery<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTAlias extends string = string,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTSelectedFields extends Record<string, unknown> = Record<string, unknown>,\n> extends SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n}\nexport class Subquery<\n\tTAlias extends string = string,\n\tTSelectedFields extends Record<string, unknown> = Record<string, unknown>,\n> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Subquery';\n\n\tdeclare _: {\n\t\tbrand: 'Subquery';\n\t\tsql: SQL;\n\t\tselectedFields: TSelectedFields;\n\t\talias: TAlias;\n\t\tisWith: boolean;\n\t\tusedTables?: string[];\n\t};\n\n\tconstructor(sql: SQL, fields: TSelectedFields, alias: string, isWith = false, usedTables: string[] = []) {\n\t\tthis._ = {\n\t\t\tbrand: 'Subquery',\n\t\t\tsql,\n\t\t\tselectedFields: fields as TSelectedFields,\n\t\t\talias: alias as TAlias,\n\t\t\tisWith,\n\t\t\tusedTables,\n\t\t};\n\t}\n\n\t// getSQL(): SQL<unknown> {\n\t// \treturn new SQL([this]);\n\t// }\n}\n\nexport class WithSubquery<\n\tTAlias extends string = string,\n\tTSelection extends Record<string, unknown> = Record<string, unknown>,\n> extends Subquery<TAlias, TSelection> {\n\tstatic override readonly [entityKind]: string = 'WithSubquery';\n}\n\nexport type WithSubqueryWithoutSelection<TAlias extends string> = WithSubquery<TAlias, {}>;\n","export const OriginalColumn = Symbol.for('drizzle:OriginalColumn');\n","import type {\n\tColumnBuilderRuntimeConfig,\n\tColumnType,\n\tGeneratedColumnConfig,\n\tGeneratedIdentityConfig,\n} from './column-builder.ts';\nimport { OriginalColumn } from './column-common.ts';\nimport { entityKind } from './entity.ts';\nimport type { DriverValueDecoderFn, DriverValueEncoderFn, DriverValueMapper, SQL, SQLWrapper } from './sql/sql.ts';\nimport type { Table } from './table.ts';\nimport type { Update } from './utils.ts';\n\nexport type Columns = Record<string, Column<any>>;\n\nexport interface ColumnBaseConfig<TDataType extends ColumnType> {\n\tname: string;\n\tdataType: TDataType;\n\ttableName: string;\n\tnotNull: boolean;\n\thasDefault: boolean;\n\tisPrimaryKey: boolean;\n\tisAutoincrement: boolean;\n\thasRuntimeDefault: boolean;\n\tdata: unknown;\n\tdriverParam: unknown;\n\tenumValues: string[] | undefined;\n\tgenerated: unknown;\n\tidentity: undefined | 'always' | 'byDefault';\n}\n\nconst noop: DriverValueDecoderFn<any, any> | DriverValueEncoderFn<any, any> = (v) => v;\nnoop.isNoop = true;\n\nexport interface Column<\n\tout T extends ColumnBaseConfig<ColumnType> = ColumnBaseConfig<ColumnType>,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tout TRuntimeConfig extends object = object,\n> extends DriverValueMapper<T['data'], T['driverParam']>, SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n\t// `as` runtime implementation is defined in 'alias.ts'\n\tas(alias: string): this;\n}\n\n/*\n\t`Column` only accepts a full `ColumnConfig` as its generic.\n\tTo infer parts of the config, use `AnyColumn` that accepts a partial config.\n\tSee `GetColumnData` for example usage of inferring.\n*/\nexport abstract class Column<\n\tout T extends ColumnBaseConfig<ColumnType> = ColumnBaseConfig<ColumnType>,\n\tout TRuntimeConfig extends object = object,\n> implements DriverValueMapper<T['data'], T['driverParam']>, SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Column';\n\n\tdeclare readonly _: T;\n\n\t/** @internal */\n\treadonly codec?: string;\n\n\treadonly name: string;\n\treadonly keyAsName: boolean;\n\treadonly primary: boolean;\n\treadonly notNull: boolean;\n\treadonly default: T['data'] | SQL | undefined;\n\treadonly defaultFn: (() => T['data'] | SQL) | undefined;\n\treadonly onUpdateFn: (() => T['data'] | SQL) | undefined;\n\treadonly hasDefault: boolean;\n\treadonly isUnique: boolean;\n\treadonly uniqueName: string | undefined;\n\treadonly uniqueType: string | undefined;\n\treadonly dataType: T['dataType'];\n\treadonly columnType: string;\n\treadonly enumValues: T['enumValues'] = undefined;\n\treadonly generated: GeneratedColumnConfig<T['data']> | undefined = undefined;\n\treadonly generatedIdentity: GeneratedIdentityConfig | undefined = undefined;\n\treadonly length: number | undefined;\n\treadonly isLengthExact: boolean | undefined;\n\treadonly isAlias: boolean;\n\n\t/** @internal */\n\tprotected config: ColumnBuilderRuntimeConfig<T['data']> & TRuntimeConfig;\n\n\t/** @internal */\n\treadonly table: Table;\n\n\t/** @internal */\n\tprotected onInit(): void {}\n\n\tconstructor(\n\t\ttable: Table,\n\t\tconfig: ColumnBuilderRuntimeConfig<T['data']> & TRuntimeConfig,\n\t) {\n\t\tthis.config = config;\n\t\tthis.onInit();\n\t\tthis.table = table;\n\n\t\tthis.name = config.name;\n\t\tthis.isAlias = false;\n\t\tthis.keyAsName = config.keyAsName;\n\t\tthis.notNull = config.notNull;\n\t\tthis.default = config.default;\n\t\tthis.defaultFn = config.defaultFn;\n\t\tthis.onUpdateFn = config.onUpdateFn;\n\t\tthis.hasDefault = config.hasDefault;\n\t\tthis.primary = config.primaryKey;\n\t\tthis.isUnique = config.isUnique;\n\t\tthis.uniqueName = config.uniqueName;\n\t\tthis.uniqueType = config.uniqueType;\n\t\tthis.dataType = config.dataType as T['dataType'];\n\t\tthis.columnType = config.columnType;\n\t\tthis.generated = config.generated;\n\t\tthis.generatedIdentity = config.generatedIdentity;\n\t\tthis.length = (<{ length?: number }> config)['length'];\n\t\tthis.isLengthExact = (<{ isLengthExact?: boolean }> config)['isLengthExact'];\n\t}\n\n\tabstract getSQLType(): string;\n\n\tmapFromDriverValue = noop;\n\n\tmapToDriverValue = noop;\n\n\t// TODO: Revisit\n\t/** @internal */\n\tpostBuild() {\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tshouldDisableInsert(): boolean {\n\t\treturn this.config.generated !== undefined && this.config.generated.type !== 'byDefault';\n\t}\n\n\t/** @internal */\n\t[OriginalColumn](): this {\n\t\treturn this;\n\t}\n}\n\nexport type UpdateColConfig<\n\tT extends ColumnBaseConfig<ColumnType>,\n\tTUpdate extends Partial<ColumnBaseConfig<ColumnType>>,\n> = Update<T, TUpdate>;\n\nexport type AnyColumn<TPartial extends Partial<ColumnBaseConfig<ColumnType>> = {}> = Column<\n\tRequired<Update<ColumnBaseConfig<ColumnType>, TPartial>>\n>;\n\nexport type GetColumnData<TColumn extends Column, TInferMode extends 'query' | 'raw' = 'query'> =\n\t// dprint-ignore\n\tTInferMode extends 'raw' // Raw mode\n\t\t? TColumn['_']['data'] // Just return the underlying type\n\t\t: TColumn['_']['notNull'] extends true // Query mode\n\t\t? TColumn['_']['data'] // Query mode, not null\n\t\t: TColumn['_']['data'] | null; // Query mode, nullable\n\nexport type InferColumnsDataTypes<TColumns extends Record<string, Column>> = {\n\t[Key in keyof TColumns]: GetColumnData<TColumns[Key], 'query'>;\n};\n\nexport function getColumnTable<TTable extends Table<any> = Table<any>>(column: Column<any>): TTable {\n\treturn column.table as TTable;\n}\n","/** @internal */\nexport const TableName = Symbol.for('drizzle:Name');\n","import type { Column, Columns, GetColumnData } from './column.ts';\nimport { entityKind } from './entity.ts';\nimport type { OptionalKeyOnly, RequiredKeyOnly } from './operations.ts';\nimport type { View } from './sql/sql.ts';\nimport { TableName } from './table.utils.ts';\nimport type { Simplify, Update } from './utils.ts';\n\nexport interface TableConfig<TColumns extends Columns = Columns> {\n\tname: string;\n\tschema: string | undefined;\n\tcolumns: TColumns;\n\tdialect: string;\n}\n\nexport type UpdateTableConfig<T extends TableConfig, TUpdate extends Partial<TableConfig>> = Required<\n\tUpdate<T, TUpdate>\n>;\n\n/** @internal */\nexport const TableSchema = Symbol.for('drizzle:Schema');\n\n/** @internal */\nexport const TableColumns = Symbol.for('drizzle:Columns');\n\n/** @internal */\nexport const ExtraConfigColumns = Symbol.for('drizzle:ExtraConfigColumns');\n\n/** @internal */\nexport const OriginalName = Symbol.for('drizzle:OriginalName');\n\n/** @internal */\nexport const BaseName = Symbol.for('drizzle:BaseName');\n\n/** @internal */\nexport const IsAlias = Symbol.for('drizzle:IsAlias');\n\n/** @internal */\nexport const ExtraConfigBuilder = Symbol.for('drizzle:ExtraConfigBuilder');\n\nconst IsDrizzleTable = Symbol.for('drizzle:IsDrizzleTable');\n\nexport interface TableTypeConfig<T extends TableConfig> {\n\treadonly brand: 'Table';\n\treadonly name: T['name'];\n\treadonly schema: T['schema'];\n\treadonly columns: T['columns'];\n\treadonly dialect: T['dialect'];\n}\n\nexport class Table<out T extends TableConfig = TableConfig> {\n\tstatic readonly [entityKind]: string = 'Table';\n\n\tdeclare readonly _: TableTypeConfig<T>;\n\n\t/** @internal */\n\tstatic readonly Symbol = {\n\t\tName: TableName as typeof TableName,\n\t\tSchema: TableSchema as typeof TableSchema,\n\t\tOriginalName: OriginalName as typeof OriginalName,\n\t\tColumns: TableColumns as typeof TableColumns,\n\t\tExtraConfigColumns: ExtraConfigColumns as typeof ExtraConfigColumns,\n\t\tBaseName: BaseName as typeof BaseName,\n\t\tIsAlias: IsAlias as typeof IsAlias,\n\t\tExtraConfigBuilder: ExtraConfigBuilder as typeof ExtraConfigBuilder,\n\t};\n\n\t/**\n\t * @internal\n\t * Can be changed if the table is aliased.\n\t */\n\t[TableName]: string;\n\n\t/**\n\t * @internal\n\t * Used to store the original name of the table, before any aliasing.\n\t */\n\t[OriginalName]: string;\n\n\t/** @internal */\n\t[TableSchema]: string | undefined;\n\n\t/** @internal */\n\t[TableColumns]!: T['columns'];\n\n\t/** @internal */\n\t[ExtraConfigColumns]!: Record<string, unknown>;\n\n\t/**\n\t * @internal\n\t * Used to store the table name before the transformation via the `tableCreator` functions.\n\t */\n\t[BaseName]: string;\n\n\t/** @internal */\n\t[IsAlias] = false;\n\n\t/** @internal */\n\t[IsDrizzleTable] = true;\n\n\t/** @internal */\n\t[ExtraConfigBuilder]: ((self: any) => Record<string, unknown> | unknown[]) | undefined = undefined;\n\n\tconstructor(name: string, schema: string | undefined, baseName: string) {\n\t\tthis[TableName] = this[OriginalName] = name;\n\t\tthis[TableSchema] = schema;\n\t\tthis[BaseName] = baseName;\n\t}\n}\n\nexport function isTable(table: unknown): table is Table {\n\treturn typeof table === 'object' && table !== null && IsDrizzleTable in table;\n}\n\n/**\n * Any table with a specified boundary.\n *\n * @example\n\t```ts\n\t// Any table with a specific name\n\ttype AnyUsersTable = AnyTable<{ name: 'users' }>;\n\t```\n *\n * To describe any table with any config, simply use `Table` without any type arguments, like this:\n *\n\t```ts\n\tfunction needsTable(table: Table) {\n\t\t...\n\t}\n\t```\n */\nexport type AnyTable<TPartial extends Partial<TableConfig>> = Table<UpdateTableConfig<TableConfig, TPartial>>;\n\nexport function getTableName<T extends Table>(table: T): T['_']['name'] {\n\treturn table[TableName];\n}\n\nexport function getTableUniqueName<\n\tT extends Table | View,\n\tTResult extends string = T extends Table ? T['_']['schema'] extends undefined ? `public.${T['_']['name']}`\n\t\t: `${T['_']['schema']}.${T['_']['name']}`\n\t\t// Views don't have type-level schema names, to be added\n\t\t: `${string}.${T['_']['name']}`,\n>(\n\ttable: T,\n): TResult {\n\treturn `${table[TableSchema] ?? 'public'}.${table[TableName]}` as TResult;\n}\n\nexport type MapColumnName<TName extends string, TColumn extends Column, TDBColumNames extends boolean> =\n\tTDBColumNames extends true ? TColumn['_']['name']\n\t\t: TName;\n\nexport type InferModelFromColumns<\n\tTColumns extends Columns,\n\tTInferMode extends 'select' | 'insert' = 'select',\n\tTConfig extends { override?: boolean } = { dbColumnNames: false; override: false },\n> = Simplify<\n\tTInferMode extends 'insert' ?\n\t\t\t& {\n\t\t\t\t[\n\t\t\t\t\tKey in keyof TColumns & string as RequiredKeyOnly<\n\t\t\t\t\t\tKey,\n\t\t\t\t\t\tTColumns[Key]\n\t\t\t\t\t>\n\t\t\t\t]: GetColumnData<TColumns[Key], 'query'>;\n\t\t\t}\n\t\t\t& {\n\t\t\t\t[\n\t\t\t\t\tKey in keyof TColumns & string as OptionalKeyOnly<\n\t\t\t\t\t\tKey,\n\t\t\t\t\t\tTColumns[Key],\n\t\t\t\t\t\tTConfig['override']\n\t\t\t\t\t>\n\t\t\t\t]?: GetColumnData<TColumns[Key], 'query'> | undefined;\n\t\t\t}\n\t\t: {\n\t\t\t[\n\t\t\t\tKey in keyof TColumns & string\n\t\t\t]: GetColumnData<TColumns[Key], 'query'>;\n\t\t}\n>;\n\n/** @deprecated Use one of the alternatives: {@link InferSelectModel} / {@link InferInsertModel}, or `table.$inferSelect` / `table.$inferInsert`\n */\nexport type InferModel<\n\tTTable extends Table,\n\tTInferMode extends 'select' | 'insert' = 'select',\n> = InferModelFromColumns<TTable['_']['columns'], TInferMode>;\n\nexport type InferSelectModel<\n\tTTable extends Table,\n> = InferModelFromColumns<TTable['_']['columns'], 'select'>;\n\nexport type InferInsertModel<\n\tTTable extends Table,\n\tTOverride extends { override?: boolean } = { override: false },\n> = InferModelFromColumns<TTable['_']['columns'], 'insert', TOverride>;\n\nexport type InferEnum<T> = T extends { enumValues: readonly (infer U)[] } ? U\n\t: never;\n\nexport interface InferTableColumnsModels<TColumns extends Columns> {\n\treadonly $inferSelect: InferModelFromColumns<TColumns, 'select'>;\n\treadonly $inferInsert: InferModelFromColumns<TColumns, 'insert', { override: false }>;\n}\n","export function iife<T extends unknown[], U>(fn: (...args: T) => U, ...args: T): U {\n\treturn fn(...args);\n}\n","import type { Span, Tracer } from '@opentelemetry/api';\nimport { iife } from '~/tracing-utils.ts';\nimport { npmVersion } from '~/version.ts';\n\nlet otel: typeof import('@opentelemetry/api') | undefined; // oxlint-disable-line\nlet rawTracer: Tracer | undefined;\n// try {\n// \totel = await import('@opentelemetry/api');\n// } catch (err: any) {\n// \tif (err.code !== 'MODULE_NOT_FOUND' && err.code !== 'ERR_MODULE_NOT_FOUND') {\n// \t\tthrow err;\n// \t}\n// }\n\ntype SpanName =\n\t| 'drizzle.operation'\n\t| 'drizzle.prepareQuery'\n\t| 'drizzle.buildSQL'\n\t| 'drizzle.execute'\n\t| 'drizzle.driver.execute'\n\t| 'drizzle.mapResponse';\n\nexport const hasTelemetry = !!otel;\n\n/** @internal */\nexport const tracer = {\n\tstartActiveSpan<F extends (span?: Span) => unknown>(name: SpanName, fn: F): ReturnType<F> {\n\t\tif (!otel) {\n\t\t\treturn fn() as ReturnType<F>;\n\t\t}\n\n\t\tif (!rawTracer) {\n\t\t\trawTracer = otel.trace.getTracer('drizzle-orm', npmVersion);\n\t\t}\n\n\t\treturn iife(\n\t\t\t(otel, rawTracer) =>\n\t\t\t\trawTracer.startActiveSpan(\n\t\t\t\t\tname,\n\t\t\t\t\t((span: Span) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\treturn fn(span);\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tspan.setStatus({\n\t\t\t\t\t\t\t\tcode: otel.SpanStatusCode.ERROR,\n\t\t\t\t\t\t\t\tmessage: e instanceof Error ? e.message : 'Unknown error', // oxlint-disable-line drizzle-internal/no-instanceof\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tspan.end();\n\t\t\t\t\t\t}\n\t\t\t\t\t}) as F,\n\t\t\t\t),\n\t\t\totel,\n\t\t\trawTracer,\n\t\t);\n\t},\n};\n","export const ViewBaseConfig = Symbol.for('drizzle:ViewBaseConfig');\n","import type { CodecsCollection } from '~/codecs.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { SelectResult } from '~/query-builders/select.types.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { TableName } from '~/table.utils.ts';\nimport { tracer } from '~/tracing.ts';\nimport type { Assume, Equal } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { AnyColumn } from '../column.ts';\nimport { Column } from '../column.ts';\nimport { IsAlias, OriginalName, Table, TableColumns, TableSchema } from '../table.ts';\n\n/**\n * This class is used to indicate a primitive param value that is used in `sql` tag.\n * It is only used on type level and is never instantiated at runtime.\n * If you see a value of this type in the code, its runtime value is actually the primitive param value.\n */\nexport class FakePrimitiveParam {\n\tstatic readonly [entityKind]: string = 'FakePrimitiveParam';\n}\n\nexport type Chunk =\n\t| string\n\t| Table\n\t| View\n\t| AnyColumn\n\t| Name\n\t| Param\n\t| Placeholder\n\t| SQL;\n\nexport interface BuildQueryConfig {\n\tescapeName(name: string): string;\n\tescapeParam(num: number, value: unknown): string;\n\tescapeString(str: string): string;\n\tcodecs?: CodecsCollection;\n\tparamStartIndex?: { value: number };\n\tinlineParams?: boolean;\n\tinvokeSource?: 'indexes' | 'mssql-check' | 'mssql-view-with-schemabinding' | undefined;\n\ttagged?: true;\n}\n\nexport interface Query {\n\tsql: string;\n\tparams: unknown[];\n\t_sql?: TemplateStringsArray;\n\t// ^ TODO: revisit\n\t// for Bun.SQL cache performance\n}\n\n/**\n * Any value that implements the `getSQL` method. The implementations include:\n * - `Table`\n * - `Column`\n * - `View`\n * - `Subquery`\n * - `SQL`\n * - `SQL.Aliased`\n * - `Placeholder`\n * - `Param`\n */\nexport interface SQLWrapper<T = unknown> {\n\tgetSQL(): SQL<T>;\n\tshouldOmitSQLParens?(): boolean;\n}\n\nexport function isSQLWrapper(value: unknown): value is SQLWrapper {\n\treturn value !== null && value !== undefined && typeof (value as any).getSQL === 'function';\n}\n\nfunction mergeQueries(queries: Query[]): Query {\n\tconst result: Query = { sql: '', params: [] };\n\tfor (const query of queries) {\n\t\tresult.sql += query.sql;\n\t\tresult.params.push(...query.params);\n\t}\n\treturn result;\n}\n\nfunction _mergeQueries(queries: Query[]): Query {\n\tconst result: Query = { sql: '', params: [] };\n\tconst sqls = [] as string[];\n\tfor (const query of queries) {\n\t\tsqls.push(query.sql);\n\t\tresult.params.push(...query.params);\n\t}\n\tresult._sql = Object.assign(sqls, { raw: sqls }) as unknown as TemplateStringsArray;\n\treturn result;\n}\n\nexport class StringChunk implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'StringChunk';\n\n\treadonly value: string[];\n\n\tconstructor(value: string | string[]) {\n\t\tthis.value = Array.isArray(value) ? value : [value];\n\t}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\nexport class SQL<T = unknown> implements SQLWrapper<T> {\n\tstatic readonly [entityKind]: string = 'SQL';\n\n\tdeclare _: {\n\t\tbrand: 'SQL';\n\t\ttype: T;\n\t};\n\n\t/** @internal */\n\tdecoder: DriverValueDecoder<T, any> = noopDecoder;\n\t/** @internal */\n\tpublic shouldInlineParams = false;\n\n\t/** @internal */\n\tusedTables: string[] = [];\n\n\tconstructor(readonly queryChunks: SQLChunk[]) {\n\t\tfor (const chunk of queryChunks) {\n\t\t\tif (is(chunk, Table)) {\n\t\t\t\tconst schemaName = chunk[Table.Symbol.Schema];\n\n\t\t\t\tthis.usedTables.push(\n\t\t\t\t\tschemaName === undefined\n\t\t\t\t\t\t? chunk[Table.Symbol.Name]\n\t\t\t\t\t\t: schemaName + '.' + chunk[Table.Symbol.Name],\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tappend(query: SQL): this {\n\t\tthis.queryChunks.push(...query.queryChunks);\n\t\treturn this;\n\t}\n\n\ttoQuery(config: BuildQueryConfig): Query {\n\t\treturn tracer.startActiveSpan('drizzle.buildSQL', (span) => {\n\t\t\tconst query = this.buildQueryFromSourceParams(this.queryChunks, config);\n\t\t\tspan?.setAttributes({\n\t\t\t\t'drizzle.query.text': query.sql,\n\t\t\t\t'drizzle.query.params': JSON.stringify(query.params),\n\t\t\t});\n\t\t\treturn query;\n\t\t});\n\t}\n\n\tbuildQueryFromSourceParams(chunks: SQLChunk[], _config: BuildQueryConfig): Query {\n\t\tconst config = Object.assign({}, _config, {\n\t\t\tinlineParams: _config.inlineParams || this.shouldInlineParams,\n\t\t\tparamStartIndex: _config.paramStartIndex || { value: 0 },\n\t\t});\n\n\t\tconst {\n\t\t\tescapeName,\n\t\t\tescapeParam,\n\t\t\tcodecs,\n\t\t\tinlineParams,\n\t\t\tparamStartIndex,\n\t\t\tinvokeSource,\n\t\t} = config;\n\n\t\tconst mappedChunks = chunks.map((chunk): Query => {\n\t\t\tif (is(chunk, StringChunk)) {\n\t\t\t\treturn { sql: chunk.value.join(''), params: [] };\n\t\t\t}\n\n\t\t\tif (is(chunk, Name)) {\n\t\t\t\treturn { sql: escapeName(chunk.value), params: [] };\n\t\t\t}\n\n\t\t\tif (chunk === undefined) {\n\t\t\t\treturn { sql: '', params: [] };\n\t\t\t}\n\n\t\t\tif (Array.isArray(chunk)) {\n\t\t\t\tconst result: SQLChunk[] = [new StringChunk('(')];\n\t\t\t\tfor (const [i, p] of chunk.entries()) {\n\t\t\t\t\tresult.push(p);\n\t\t\t\t\tif (i < chunk.length - 1) {\n\t\t\t\t\t\tresult.push(new StringChunk(', '));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tresult.push(new StringChunk(')'));\n\t\t\t\treturn this.buildQueryFromSourceParams(result, config);\n\t\t\t}\n\n\t\t\tif (is(chunk, SQL)) {\n\t\t\t\treturn this.buildQueryFromSourceParams(chunk.queryChunks, {\n\t\t\t\t\t...config,\n\t\t\t\t\tinlineParams: inlineParams || chunk.shouldInlineParams,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (is(chunk, Table)) {\n\t\t\t\tconst schemaName = chunk[Table.Symbol.Schema];\n\t\t\t\tconst tableName = chunk[Table.Symbol.Name];\n\n\t\t\t\tif (invokeSource === 'mssql-view-with-schemabinding') {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsql: (schemaName === undefined ? escapeName('dbo') : escapeName(schemaName)) + '.'\n\t\t\t\t\t\t\t+ escapeName(tableName),\n\t\t\t\t\t\tparams: [],\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tsql: schemaName === undefined || chunk[IsAlias]\n\t\t\t\t\t\t? escapeName(tableName)\n\t\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(tableName),\n\t\t\t\t\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, Column)) {\n\t\t\t\tconst columnName = chunk.name;\n\t\t\t\tif (_config.invokeSource === 'indexes') {\n\t\t\t\t\treturn { sql: escapeName(columnName), params: [] };\n\t\t\t\t}\n\n\t\t\t\tconst schemaName = invokeSource === 'mssql-check' ? undefined : chunk.table[Table.Symbol.Schema];\n\t\t\t\treturn {\n\t\t\t\t\tsql: chunk.isAlias ? escapeName(chunk.name) : chunk.table[IsAlias] || schemaName === undefined\n\t\t\t\t\t\t? escapeName(chunk.table[Table.Symbol.Name]) + '.' + escapeName(columnName)\n\t\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(chunk.table[Table.Symbol.Name]) + '.'\n\t\t\t\t\t\t\t+ escapeName(columnName),\n\t\t\t\t\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, View)) {\n\t\t\t\tconst schemaName = chunk[ViewBaseConfig].schema;\n\t\t\t\tconst viewName = chunk[ViewBaseConfig].name;\n\t\t\t\treturn {\n\t\t\t\t\tsql: schemaName === undefined || chunk[ViewBaseConfig].isAlias\n\t\t\t\t\t\t? escapeName(viewName)\n\t\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(viewName),\n\t\t\t\t\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, Param)) {\n\t\t\t\tif (is(chunk.value, SQL)) {\n\t\t\t\t\treturn this.buildQueryFromSourceParams([chunk.value], config);\n\t\t\t\t}\n\n\t\t\t\tconst useCodecs = codecs && is(chunk.encoder, Column);\n\n\t\t\t\tif (is(chunk.value, Placeholder)) {\n\t\t\t\t\tconst escaped = escapeParam(paramStartIndex.value++, chunk);\n\t\t\t\t\tchunk.codec = useCodecs\n\t\t\t\t\t\t? (value) => codecs.apply(chunk.encoder as Column, 'normalizeParam', value)\n\t\t\t\t\t\t: undefined;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsql: useCodecs\n\t\t\t\t\t\t\t? codecs.apply(chunk.encoder, 'castParam', escaped)\n\t\t\t\t\t\t\t: escaped,\n\t\t\t\t\t\tparams: [chunk],\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tlet mappedValue: any;\n\t\t\t\tif (chunk.value === null) {\n\t\t\t\t\tmappedValue = chunk.value;\n\t\t\t\t} else {\n\t\t\t\t\tmappedValue = chunk.encoder.mapToDriverValue.isNoop\n\t\t\t\t\t\t? chunk.value\n\t\t\t\t\t\t: chunk.encoder.mapToDriverValue(chunk.value);\n\n\t\t\t\t\tif (is(mappedValue, SQL)) {\n\t\t\t\t\t\treturn this.buildQueryFromSourceParams([mappedValue], config);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (useCodecs) {\n\t\t\t\t\t\tmappedValue = codecs.apply(\n\t\t\t\t\t\t\tchunk.encoder,\n\t\t\t\t\t\t\t'normalizeParam',\n\t\t\t\t\t\t\tmappedValue,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (inlineParams) {\n\t\t\t\t\treturn { sql: this.mapInlineParam(mappedValue, config), params: [] };\n\t\t\t\t}\n\n\t\t\t\tconst escaped = escapeParam(paramStartIndex.value++, mappedValue);\n\t\t\t\treturn {\n\t\t\t\t\tsql: useCodecs\n\t\t\t\t\t\t? codecs.apply(chunk.encoder, 'castParam', escaped)\n\t\t\t\t\t\t: escaped,\n\t\t\t\t\tparams: [mappedValue],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, Placeholder)) {\n\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk] };\n\t\t\t}\n\n\t\t\tif (is(chunk, SQL.Aliased) && chunk.fieldAlias !== undefined) {\n\t\t\t\treturn {\n\t\t\t\t\tsql: (chunk.origin !== undefined ? escapeName(chunk.origin) + '.' : '') + escapeName(chunk.fieldAlias),\n\t\t\t\t\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, Subquery)) {\n\t\t\t\tif (chunk._.isWith) {\n\t\t\t\t\treturn { sql: escapeName(chunk._.alias), params: [] };\n\t\t\t\t}\n\t\t\t\treturn this.buildQueryFromSourceParams([\n\t\t\t\t\tnew StringChunk('('),\n\t\t\t\t\tchunk._.sql,\n\t\t\t\t\tnew StringChunk(') '),\n\t\t\t\t\tnew Name(chunk._.alias),\n\t\t\t\t], config);\n\t\t\t}\n\n\t\t\tif (typeof chunk === 'function' && 'enumName' in chunk) {\n\t\t\t\tif ('schema' in chunk && chunk.schema) {\n\t\t\t\t\treturn { sql: escapeName(chunk.schema as string) + '.' + escapeName(chunk.enumName as string), params: [] };\n\t\t\t\t}\n\t\t\t\treturn { sql: escapeName(chunk.enumName as string), params: [] };\n\t\t\t}\n\n\t\t\tif (isSQLWrapper(chunk)) {\n\t\t\t\tif (chunk.shouldOmitSQLParens?.()) {\n\t\t\t\t\treturn this.buildQueryFromSourceParams([chunk.getSQL()], config);\n\t\t\t\t}\n\t\t\t\treturn this.buildQueryFromSourceParams([\n\t\t\t\t\tnew StringChunk('('),\n\t\t\t\t\tchunk.getSQL(),\n\t\t\t\t\tnew StringChunk(')'),\n\t\t\t\t], config);\n\t\t\t}\n\n\t\t\tif (inlineParams) {\n\t\t\t\treturn { sql: this.mapInlineParam(chunk, config), params: [] };\n\t\t\t}\n\n\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk] };\n\t\t});\n\n\t\tif (_config.tagged) {\n\t\t\treturn _mergeQueries(mappedChunks);\n\t\t}\n\n\t\treturn mergeQueries(mappedChunks);\n\t}\n\n\tprivate mapInlineParam(\n\t\tchunk: unknown,\n\t\t{ escapeString }: BuildQueryConfig,\n\t): string {\n\t\tif (chunk === null) {\n\t\t\treturn 'null';\n\t\t}\n\t\tif (typeof chunk === 'number' || typeof chunk === 'boolean' || typeof chunk === 'bigint') {\n\t\t\treturn chunk.toString();\n\t\t}\n\t\tif (typeof chunk === 'string') {\n\t\t\treturn escapeString(chunk);\n\t\t}\n\t\tif (typeof chunk === 'object') {\n\t\t\tconst mappedValueAsString = chunk.toString();\n\t\t\tif (mappedValueAsString === '[object Object]') {\n\t\t\t\treturn escapeString(JSON.stringify(chunk));\n\t\t\t}\n\t\t\treturn escapeString(mappedValueAsString);\n\t\t}\n\t\tthrow new Error('Unexpected param value: ' + chunk);\n\t}\n\n\tgetSQL(): SQL<T> {\n\t\treturn this;\n\t}\n\n\tas(alias: string): SQL.Aliased<T>;\n\t/**\n\t * @deprecated\n\t * Use ``sql<DataType>`query`.as(alias)`` instead.\n\t */\n\tas<TData>(): SQL<TData>;\n\t/**\n\t * @deprecated\n\t * Use ``sql<DataType>`query`.as(alias)`` instead.\n\t */\n\tas<TData>(alias: string): SQL.Aliased<TData>;\n\tas(alias?: string): SQL<T> | SQL.Aliased<T> {\n\t\t// TODO: remove with deprecated overloads\n\t\tif (alias === undefined) {\n\t\t\treturn this;\n\t\t}\n\n\t\treturn new SQL.Aliased(this, alias);\n\t}\n\n\tmapWith<\n\t\tTDecoder extends\n\t\t\t| DriverValueDecoder<any, any>\n\t\t\t| DriverValueDecoder<any, any>['mapFromDriverValue'],\n\t>(decoder: TDecoder): SQL<GetDecoderResult<TDecoder>> {\n\t\tthis.decoder = typeof decoder === 'function' ? { mapFromDriverValue: decoder } : decoder;\n\t\treturn this as SQL<GetDecoderResult<TDecoder>>;\n\t}\n\n\tinlineParams(): this {\n\t\tthis.shouldInlineParams = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * This method is used to conditionally include a part of the query.\n\t *\n\t * @param condition - Condition to check\n\t * @returns itself if the condition is `true`, otherwise `undefined`\n\t */\n\tif(condition: any | undefined): this | undefined {\n\t\treturn condition ? this : undefined;\n\t}\n}\n\nexport type GetDecoderResult<T> = T extends Column ? T['_']['data'] : T extends\n\t| DriverValueDecoder<infer TData, any>\n\t| DriverValueDecoder<infer TData, any>['mapFromDriverValue'] ? TData\n: never;\n\n/**\n * Any DB name (table, column, index etc.)\n */\nexport class Name implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Name';\n\n\tprotected brand!: 'Name';\n\n\tconstructor(readonly value: string) {}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/**\n * Any DB name (table, column, index etc.)\n * @deprecated Use `sql.identifier` instead.\n */\nexport function name(value: string): Name {\n\treturn new Name(value);\n}\n\nexport interface DriverValueDecoderFn<TData, TDriverParam> {\n\t(value: TDriverParam): TData;\n\t/** @internal */\n\tisNoop?: true | undefined;\n}\n\nexport interface DriverValueDecoder<TData, TDriverParam> {\n\tmapFromDriverValue: DriverValueDecoderFn<TData, TDriverParam>;\n}\n\nexport interface DriverValueEncoderFn<TData, TDriverParam> {\n\t(value: TData): TDriverParam;\n\t/** @internal */\n\tisNoop?: true | undefined;\n}\n\nexport interface DriverValueEncoder<TData, TDriverParam> {\n\tmapToDriverValue: DriverValueEncoderFn<TData, TDriverParam>;\n}\n\nexport function isDriverValueEncoder(value: unknown): value is DriverValueEncoder<any, any> {\n\treturn typeof value === 'object' && value !== null && 'mapToDriverValue' in value\n\t\t&& typeof (value as any).mapToDriverValue === 'function';\n}\n\nexport const noopDecoder: DriverValueDecoder<any, any> = {\n\tmapFromDriverValue: (value) => value,\n};\n\nnoopDecoder.mapFromDriverValue.isNoop = true;\n\nexport const noopEncoder: DriverValueEncoder<any, any> = {\n\tmapToDriverValue: (value) => value,\n};\n\nnoopEncoder.mapToDriverValue.isNoop = true;\n\nexport interface DriverValueMapper<TData, TDriverParam>\n\textends DriverValueDecoder<TData, TDriverParam>, DriverValueEncoder<TData, TDriverParam>\n{}\n\nexport function isNoop(mapper: DriverValueEncoderFn<any, any> | DriverValueDecoderFn<any, any>) {\n\treturn mapper.isNoop;\n}\n\nexport const noopMapper: DriverValueMapper<any, any> = {\n\t...noopDecoder,\n\t...noopEncoder,\n};\n\n/** Parameter value that is optionally bound to an encoder (for example, a column). */\nexport class Param<TDataType = any, TDriverParamType = TDataType> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Param';\n\n\tprotected brand!: 'BoundParamValue';\n\n\t/**\n\t * @param value - Parameter value\n\t * @param encoder - Encoder to convert the value to a driver parameter\n\t */\n\tconstructor(\n\t\treadonly value: TDataType,\n\t\treadonly encoder: DriverValueEncoder<TDataType, TDriverParamType> = noopEncoder,\n\t\tpublic codec?: (value: any) => any,\n\t) {}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/** @deprecated Use `sql.param` instead. */\nexport function param<TData, TDriver>(\n\tvalue: TData,\n\tencoder?: DriverValueEncoder<TData, TDriver>,\n): Param<TData, TDriver> {\n\treturn new Param(value, encoder);\n}\n\n/**\n * Anything that can be passed to the `` sql`...` `` tagged function.\n */\nexport type SQLChunk =\n\t| StringChunk\n\t| SQLChunk[]\n\t| SQLWrapper\n\t| SQL\n\t| Table\n\t| View\n\t| Subquery\n\t| AnyColumn\n\t| Param\n\t| Name\n\t| undefined\n\t| FakePrimitiveParam\n\t| Placeholder;\n\nexport type SQLGenerator<T = unknown> = typeof sql<T>;\n\nexport function sql<T>(strings: TemplateStringsArray, ...params: any[]): SQL<T>;\n/*\n\tThe type of `params` is specified as `SQLChunk[]`, but that's slightly incorrect -\n\tin runtime, users won't pass `FakePrimitiveParam` instances as `params` - they will pass primitive values\n\twhich will be wrapped in `Param`. That's why the overload specifies `params` as `any[]` and not as `SQLSourceParam[]`.\n\tThis type is used to make our lives easier and the type checker happy.\n*/\nexport function sql(strings: TemplateStringsArray, ...params: SQLChunk[]): SQL {\n\tconst queryChunks: SQLChunk[] = [];\n\tif (params.length > 0 || (strings.length > 0 && strings[0] !== '')) {\n\t\tqueryChunks.push(new StringChunk(strings[0]!));\n\t}\n\tfor (const [paramIndex, param] of params.entries()) {\n\t\tqueryChunks.push(param, new StringChunk(strings[paramIndex + 1]!));\n\t}\n\n\treturn new SQL(queryChunks);\n}\n\nexport namespace sql {\n\texport function empty(): SQL {\n\t\treturn new SQL([]);\n\t}\n\n\t/** @deprecated - use `sql.join()` */\n\texport function fromList(list: SQLChunk[]): SQL {\n\t\treturn new SQL(list);\n\t}\n\n\t/**\n\t * Convenience function to create an SQL query from a raw string.\n\t * @param str The raw SQL query string.\n\t */\n\texport function raw(str: string): SQL {\n\t\treturn new SQL([new StringChunk(str)]);\n\t}\n\n\t/**\n\t * Join a list of SQL chunks with a separator.\n\t * @example\n\t * ```ts\n\t * const query = sql.join([sql`a`, sql`b`, sql`c`]);\n\t * // sql`abc`\n\t * ```\n\t * @example\n\t * ```ts\n\t * const query = sql.join([sql`a`, sql`b`, sql`c`], sql`, `);\n\t * // sql`a, b, c`\n\t * ```\n\t */\n\texport function join(chunks: SQLChunk[], separator?: SQLChunk): SQL {\n\t\tconst result: SQLChunk[] = [];\n\t\tfor (const [i, chunk] of chunks.entries()) {\n\t\t\tif (i > 0 && separator !== undefined) {\n\t\t\t\tresult.push(separator);\n\t\t\t}\n\t\t\tresult.push(chunk);\n\t\t}\n\t\treturn new SQL(result);\n\t}\n\n\t/**\n\t * Create a SQL chunk that represents a DB identifier (table, column, index etc.).\n\t * When used in a query, the identifier will be escaped based on the DB engine.\n\t * For example, in PostgreSQL, identifiers are escaped with double quotes.\n\t *\n\t * **WARNING: This function does not offer any protection against SQL injections, so you must validate any user input beforehand.**\n\t *\n\t * @example ```ts\n\t * const query = sql`SELECT * FROM ${sql.identifier('my-table')}`;\n\t * // 'SELECT * FROM \"my-table\"'\n\t * ```\n\t */\n\texport function identifier(value: string): Name {\n\t\treturn new Name(value);\n\t}\n\n\texport function placeholder<TName extends string>(name: TName): Placeholder<TName> {\n\t\treturn new Placeholder(name);\n\t}\n\n\texport function param<TData, TDriver>(\n\t\tvalue: TData,\n\t\tencoder?: DriverValueEncoder<TData, TDriver>,\n\t): Param<TData, TDriver> {\n\t\treturn new Param(value, encoder);\n\t}\n\n\t/**\n\t * Attach [sqlcommenter](https://google.github.io/sqlcommenter) comment to a query\n\t */\n\texport function comment(input: CommentInput): SQL | undefined {\n\t\tconst encoded = sqlCommenter(input);\n\t\tif (!encoded.length) return undefined;\n\n\t\treturn sql.raw(encoded);\n\t}\n}\n\nexport function sqlCommenter(input: CommentInput): string {\n\tconst encoded = sqlCommenter.encodeInput(input);\n\tif (!encoded.length) return '';\n\n\treturn `/*${encoded}*/`;\n}\n\nexport namespace sqlCommenter {\n\texport function merge(input1: CommentInput | undefined, input2: CommentInput | undefined) {\n\t\tlet encoded: CommentInput;\n\t\tif (typeof input1 === 'object' && typeof input2 === 'object') {\n\t\t\tencoded = encodeInput({ ...input1, ...input2 });\n\t\t} else if (input1 && input2) {\n\t\t\tencoded = [encodeInput(input1), encodeInput(input2)].filter((i) => i.length).join(',');\n\t\t} else if (input2) {\n\t\t\tencoded = encodeInput(input2);\n\t\t} else if (input1) {\n\t\t\tencoded = encodeInput(input1);\n\t\t} else {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (!encoded.length) return '';\n\n\t\treturn `/*${encoded}*/`;\n\t}\n\n\texport function encodeInput(input: CommentInput): string {\n\t\tif (typeof input === 'string') {\n\t\t\tif (!input.length) return input;\n\n\t\t\treturn sanitizeStringInput(input);\n\t\t}\n\n\t\tconst parts: string[] = [];\n\n\t\tfor (const [key, value] of Object.entries(input)) {\n\t\t\tif (value === null || value === undefined || value === '') continue;\n\n\t\t\tconst encodedKey = sanitizeObjectElement(key);\n\t\t\tconst encodedValue = sanitizeObjectElement(String(value));\n\n\t\t\tparts.push(`${encodedKey}='${encodedValue}'`);\n\t\t}\n\n\t\tif (!parts.length) return '';\n\n\t\treturn parts.sort().join(',');\n\t}\n\n\texport function sanitizeObjectElement(key: string): string {\n\t\tconst urlEncoded = encodeURIComponent(key);\n\t\treturn urlEncoded.replace(/'/g, `\\\\'`);\n\t}\n\n\texport function sanitizeStringInput(input: string): string {\n\t\treturn input.replace(/\\/\\*/g, '/ *').replace(/\\*\\//g, '* /');\n\t}\n}\n\nexport type CommentInput = string | SqlCommenterInput;\n\nexport type SqlCommenterInput = Record<\n\tstring,\n\tstring | number | bigint | boolean | null | undefined\n>;\n\nexport namespace SQL {\n\texport class Aliased<T = unknown> implements SQLWrapper<T> {\n\t\tstatic readonly [entityKind]: string = 'SQL.Aliased';\n\n\t\tdeclare _: {\n\t\t\tbrand: 'SQL.Aliased';\n\t\t\ttype: T;\n\t\t};\n\n\t\t/** @internal */\n\t\tisSelectionField = false;\n\t\t/** @internal */\n\t\torigin?: string;\n\n\t\tconstructor(\n\t\t\treadonly sql: SQL<T>,\n\t\t\treadonly fieldAlias: string,\n\t\t) {}\n\n\t\tgetSQL(): SQL<T> {\n\t\t\treturn this.sql as SQL<T>;\n\t\t}\n\n\t\t/** @internal */\n\t\tclone() {\n\t\t\treturn new Aliased<T>(this.sql, this.fieldAlias);\n\t\t}\n\t}\n}\n\nexport class Placeholder<TName extends string = string, TValue = any> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Placeholder';\n\n\tdeclare protected: TValue;\n\n\tconstructor(readonly name: TName) {}\n\n\tgetSQL(): SQL {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/** @deprecated Use `sql.placeholder` instead. */\nexport function placeholder<TName extends string>(name: TName): Placeholder<TName> {\n\treturn new Placeholder(name);\n}\n\nexport function fillPlaceholders(params: unknown[], values: Record<string, unknown>): unknown[] {\n\treturn params.map((p) => {\n\t\tif (is(p, Placeholder)) {\n\t\t\tif (!(p.name in values)) {\n\t\t\t\tthrow new Error(`No value for placeholder \"${p.name}\" was provided`);\n\t\t\t}\n\n\t\t\treturn values[p.name];\n\t\t}\n\n\t\tif (is(p, Param) && is(p.value, Placeholder)) {\n\t\t\tif (!(p.value.name in values)) {\n\t\t\t\tthrow new Error(`No value for placeholder \"${p.value.name}\" was provided`);\n\t\t\t}\n\n\t\t\tif (values[p.value.name] === null) return values[p.value.name];\n\n\t\t\tconst mapped = p.encoder.mapToDriverValue.isNoop\n\t\t\t\t? values[p.value.name]\n\t\t\t\t: p.encoder.mapToDriverValue(values[p.value.name]);\n\n\t\t\treturn p.codec ? p.codec(mapped) : mapped;\n\t\t}\n\n\t\treturn p;\n\t});\n}\n\nexport type ColumnsSelection = Record<string, unknown>;\n\nconst IsDrizzleView = Symbol.for('drizzle:IsDrizzleView');\n\nexport abstract class View<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelection extends ColumnsSelection = ColumnsSelection,\n> {\n\tstatic readonly [entityKind]: string = 'View';\n\n\tdeclare _: {\n\t\tbrand: 'View';\n\t\tviewBrand: string;\n\t\tname: TName;\n\t\texisting: TExisting;\n\t\tselectedFields: TSelection;\n\t};\n\n\t/** @internal */\n\t[ViewBaseConfig]: {\n\t\tname: TName;\n\t\toriginalName: TName;\n\t\tschema: string | undefined;\n\t\tselectedFields: ColumnsSelection;\n\t\tisExisting: TExisting;\n\t\tquery: TExisting extends true ? undefined : SQL;\n\t\tisAlias: boolean;\n\t};\n\n\t/** @internal */\n\t[IsDrizzleView] = true;\n\n\t/** @internal */\n\tpublic get [TableName]() {\n\t\treturn this[ViewBaseConfig].name;\n\t}\n\n\t/** @internal */\n\tpublic get [TableSchema]() {\n\t\treturn this[ViewBaseConfig].schema;\n\t}\n\n\t/** @internal */\n\tpublic get [IsAlias]() {\n\t\treturn this[ViewBaseConfig].isAlias;\n\t}\n\n\t/** @internal */\n\tpublic get [OriginalName]() {\n\t\treturn this[ViewBaseConfig].originalName;\n\t}\n\n\t/** @internal */\n\tpublic get [TableColumns]() {\n\t\treturn (this[ViewBaseConfig].selectedFields) as any as Record<string, unknown>;\n\t}\n\n\tdeclare readonly $inferSelect: InferSelectViewModel<View<Assume<TName, string>, TExisting, TSelection>>;\n\n\tconstructor(\n\t\t{ name, schema, selectedFields, query }: {\n\t\t\tname: TName;\n\t\t\tschema: string | undefined;\n\t\t\tselectedFields: ColumnsSelection;\n\t\t\tquery: SQL | undefined;\n\t\t},\n\t) {\n\t\tthis[ViewBaseConfig] = {\n\t\t\tname,\n\t\t\toriginalName: name,\n\t\t\tschema,\n\t\t\tselectedFields,\n\t\t\tquery: query as (TExisting extends true ? undefined : SQL),\n\t\t\tisExisting: !query as TExisting,\n\t\t\tisAlias: false,\n\t\t};\n\t}\n}\n\nexport function isView(view: unknown): view is View {\n\treturn typeof view === 'object' && view !== null && IsDrizzleView in view;\n}\n\nexport function getViewName<T extends View>(view: T): T['_']['name'] {\n\treturn view[ViewBaseConfig].name;\n}\n\nexport type InferSelectViewModel<TView extends View> =\n\tEqual<TView['_']['selectedFields'], { [x: string]: unknown }> extends true ? { [x: string]: unknown }\n\t\t: SelectResult<\n\t\t\tTView['_']['selectedFields'],\n\t\t\t'single',\n\t\t\tRecord<TView['_']['name'], 'not-null'>\n\t\t>;\n\n// Defined separately from the Column class to resolve circular dependency\nColumn.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n// Defined separately from the Column class to resolve circular dependency\nSubquery.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n\nexport type SQLEntity = SQL | SQLWrapper | SQL.Aliased | Table | View;\n","import { type AnyColumn, Column, type GetColumnData } from '~/column.ts';\nimport { is } from '~/entity.ts';\nimport { Table } from '~/table.ts';\nimport {\n\tisDriverValueEncoder,\n\tisSQLWrapper,\n\tParam,\n\tPlaceholder,\n\tSQL,\n\tsql,\n\ttype SQLChunk,\n\ttype SQLWrapper,\n\tStringChunk,\n\tView,\n} from '../sql.ts';\n\nexport function bindIfParam(value: unknown, column: SQLWrapper): SQLChunk {\n\tif (\n\t\tisDriverValueEncoder(column)\n\t\t&& !isSQLWrapper(value)\n\t\t&& !is(value, Param)\n\t\t&& !is(value, Placeholder)\n\t\t&& !is(value, Column)\n\t\t&& !is(value, Table)\n\t\t&& !is(value, View)\n\t) {\n\t\treturn new Param(value, column);\n\t}\n\treturn value as SQLChunk;\n}\n\nexport interface BinaryOperator {\n\t<TColumn extends Column>(\n\t\tleft: TColumn,\n\t\tright: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n\t): SQL;\n\t<T>(left: SQL.Aliased<T>, right: T | SQLWrapper): SQL;\n\t<T extends SQLWrapper>(\n\t\tleft: Exclude<T, SQL.Aliased | Column>,\n\t\tright: unknown,\n\t): SQL;\n}\n\n/**\n * Test that two values are equal.\n *\n * Remember that the SQL standard dictates that\n * two NULL values are not equal, so if you want to test\n * whether a value is null, you may want to use\n * `isNull` instead.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made by Ford\n * db.select().from(cars)\n * .where(eq(cars.make, 'Ford'))\n * ```\n *\n * @see isNull for a way to test equality to NULL.\n */\nexport const eq: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} = ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that two values are not equal.\n *\n * Remember that the SQL standard dictates that\n * two NULL values are not equal, so if you want to test\n * whether a value is not null, you may want to use\n * `isNotNull` instead.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars not made by Ford\n * db.select().from(cars)\n * .where(ne(cars.make, 'Ford'))\n * ```\n *\n * @see isNotNull for a way to test whether a value is not null.\n */\nexport const ne: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} <> ${bindIfParam(right, left)}`;\n};\n\n/**\n * Combine a list of conditions with the `and` operator. Conditions\n * that are equal `undefined` are automatically ignored.\n *\n * ## Examples\n *\n * ```ts\n * db.select().from(cars)\n * .where(\n * and(\n * eq(cars.make, 'Volvo'),\n * eq(cars.year, 1950),\n * )\n * )\n * ```\n */\nexport function and(...conditions: (SQLWrapper | undefined)[]): SQL | undefined;\nexport function and(\n\t...unfilteredConditions: (SQLWrapper | undefined)[]\n): SQL | undefined {\n\tconst conditions = unfilteredConditions.filter(\n\t\t(c): c is Exclude<typeof c, undefined> => c !== undefined,\n\t);\n\n\tif (conditions.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (conditions.length === 1) {\n\t\treturn new SQL(conditions);\n\t}\n\n\treturn new SQL([\n\t\tnew StringChunk('('),\n\t\tsql.join(conditions.map((c) => sql`(${c})`), new StringChunk(' and ')),\n\t\tnew StringChunk(')'),\n\t]);\n}\n\n/**\n * Combine a list of conditions with the `or` operator. Conditions\n * that are equal `undefined` are automatically ignored.\n *\n * ## Examples\n *\n * ```ts\n * db.select().from(cars)\n * .where(\n * or(\n * eq(cars.make, 'GM'),\n * eq(cars.make, 'Ford'),\n * )\n * )\n * ```\n */\nexport function or(...conditions: (SQLWrapper | undefined)[]): SQL | undefined;\nexport function or(\n\t...unfilteredConditions: (SQLWrapper | undefined)[]\n): SQL | undefined {\n\tconst conditions = unfilteredConditions.filter(\n\t\t(c): c is Exclude<typeof c, undefined> => c !== undefined,\n\t);\n\n\tif (conditions.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (conditions.length === 1) {\n\t\treturn new SQL(conditions);\n\t}\n\n\treturn new SQL([\n\t\tnew StringChunk('('),\n\t\tsql.join(conditions.map((c) => sql`(${c})`), new StringChunk(' or ')),\n\t\tnew StringChunk(')'),\n\t]);\n}\n\n/**\n * Negate the meaning of an expression using the `not` keyword.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars _not_ made by GM or Ford.\n * db.select().from(cars)\n * .where(not(inArray(cars.make, ['GM', 'Ford'])))\n * ```\n */\nexport function not(condition: SQLWrapper): SQL {\n\treturn is(condition, SQL) ? sql`not (${condition})` : sql`not ${condition}`;\n}\n\n/**\n * Test that the first expression passed is greater than\n * the second expression.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made after 2000.\n * db.select().from(cars)\n * .where(gt(cars.year, 2000))\n * ```\n *\n * @see gte for greater-than-or-equal\n */\nexport const gt: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} > ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that the first expression passed is greater than\n * or equal to the second expression. Use `gt` to\n * test whether an expression is strictly greater\n * than another.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made on or after 2000.\n * db.select().from(cars)\n * .where(gte(cars.year, 2000))\n * ```\n *\n * @see gt for a strictly greater-than condition\n */\nexport const gte: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} >= ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that the first expression passed is less than\n * the second expression.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made before 2000.\n * db.select().from(cars)\n * .where(lt(cars.year, 2000))\n * ```\n *\n * @see lte for less-than-or-equal\n */\nexport const lt: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} < ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that the first expression passed is less than\n * or equal to the second expression.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made before 2000.\n * db.select().from(cars)\n * .where(lte(cars.year, 2000))\n * ```\n *\n * @see lt for a strictly less-than condition\n */\nexport const lte: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} <= ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test whether the first parameter, a column or expression,\n * has a value from a list passed as the second argument.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made by Ford or GM.\n * db.select().from(cars)\n * .where(inArray(cars.make, ['Ford', 'GM']))\n * ```\n *\n * @see notInArray for the inverse of this test\n */\nexport function inArray<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function inArray<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: ReadonlyArray<GetColumnData<TColumn, 'raw'> | Placeholder> | SQLWrapper,\n): SQL;\nexport function inArray<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: ReadonlyArray<unknown | Placeholder> | SQLWrapper,\n): SQL;\nexport function inArray(\n\tcolumn: SQLWrapper,\n\tvalues: ReadonlyArray<unknown | Placeholder> | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\treturn sql`false`;\n\t\t}\n\t\treturn sql`${column} in ${values.map((v) => bindIfParam(v, column))}`;\n\t}\n\n\treturn sql`${column} in ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test whether the first parameter, a column or expression,\n * has a value that is not present in a list passed as the\n * second argument.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made by any company except Ford or GM.\n * db.select().from(cars)\n * .where(notInArray(cars.make, ['Ford', 'GM']))\n * ```\n *\n * @see inArray for the inverse of this test\n */\nexport function notInArray<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function notInArray<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function notInArray<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function notInArray(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\treturn sql`true`;\n\t\t}\n\t\treturn sql`${column} not in ${values.map((v) => bindIfParam(v, column))}`;\n\t}\n\n\treturn sql`${column} not in ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test whether an expression is NULL. By the SQL standard,\n * NULL is neither equal nor not equal to itself, so\n * it's recommended to use `isNull` and `notIsNull` for\n * comparisons to NULL.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars that have no discontinuedAt date.\n * db.select().from(cars)\n * .where(isNull(cars.discontinuedAt))\n * ```\n *\n * @see isNotNull for the inverse of this test\n */\nexport function isNull(value: SQLWrapper): SQL {\n\treturn sql`(${value} is null)`;\n}\n\n/**\n * Test whether an expression is not NULL. By the SQL standard,\n * NULL is neither equal nor not equal to itself, so\n * it's recommended to use `isNull` and `notIsNull` for\n * comparisons to NULL.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars that have been discontinued.\n * db.select().from(cars)\n * .where(isNotNull(cars.discontinuedAt))\n * ```\n *\n * @see isNull for the inverse of this test\n */\nexport function isNotNull(value: SQLWrapper): SQL {\n\treturn sql`(${value} is not null)`;\n}\n\n/**\n * Test whether a subquery evaluates to have any rows.\n *\n * ## Examples\n *\n * ```ts\n * // Users whose `homeCity` column has a match in a cities\n * // table.\n * db\n * .select()\n * .from(users)\n * .where(\n * exists(db.select()\n * .from(cities)\n * .where(eq(users.homeCity, cities.id))),\n * );\n * ```\n *\n * @see notExists for the inverse of this test\n */\nexport function exists(subquery: SQLWrapper): SQL {\n\treturn sql`exists ${subquery}`;\n}\n\n/**\n * Test whether a subquery doesn't include any result\n * rows.\n *\n * ## Examples\n *\n * ```ts\n * // Users whose `homeCity` column doesn't match\n * // a row in the cities table.\n * db\n * .select()\n * .from(users)\n * .where(\n * notExists(db.select()\n * .from(cities)\n * .where(eq(users.homeCity, cities.id))),\n * );\n * ```\n *\n * @see exists for the inverse of this test\n */\nexport function notExists(subquery: SQLWrapper): SQL {\n\treturn sql`not exists ${subquery}`;\n}\n\n/**\n * Test whether an expression is between two values. This\n * is an easier way to express range tests, which would be\n * expressed mathematically as `x <= a <= y` but in SQL\n * would have to be like `a >= x AND a <= y`.\n *\n * Between is inclusive of the endpoints: if `column`\n * is equal to `min` or `max`, it will be TRUE.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made between 1990 and 2000\n * db.select().from(cars)\n * .where(between(cars.year, 1990, 2000))\n * ```\n *\n * @see notBetween for the inverse of this test\n */\nexport function between<T>(\n\tcolumn: SQL.Aliased,\n\tmin: T | SQLWrapper,\n\tmax: T | SQLWrapper,\n): SQL;\nexport function between<TColumn extends AnyColumn>(\n\tcolumn: TColumn,\n\tmin: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n\tmax: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n): SQL;\nexport function between<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tmin: unknown,\n\tmax: unknown,\n): SQL;\nexport function between(column: SQLWrapper, min: unknown, max: unknown): SQL {\n\treturn sql`${column} between ${bindIfParam(min, column)} and ${\n\t\tbindIfParam(\n\t\t\tmax,\n\t\t\tcolumn,\n\t\t)\n\t}`;\n}\n\n/**\n * Test whether an expression is not between two values.\n *\n * This, like `between`, includes its endpoints, so if\n * the `column` is equal to `min` or `max`, in this case\n * it will evaluate to FALSE.\n *\n * ## Examples\n *\n * ```ts\n * // Exclude cars made in the 1970s\n * db.select().from(cars)\n * .where(notBetween(cars.year, 1970, 1979))\n * ```\n *\n * @see between for the inverse of this test\n */\nexport function notBetween<T>(\n\tcolumn: SQL.Aliased,\n\tmin: T | SQLWrapper,\n\tmax: T | SQLWrapper,\n): SQL;\nexport function notBetween<TColumn extends AnyColumn>(\n\tcolumn: TColumn,\n\tmin: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n\tmax: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n): SQL;\nexport function notBetween<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tmin: unknown,\n\tmax: unknown,\n): SQL;\nexport function notBetween(\n\tcolumn: SQLWrapper,\n\tmin: unknown,\n\tmax: unknown,\n): SQL {\n\treturn sql`${column} not between ${\n\t\tbindIfParam(\n\t\t\tmin,\n\t\t\tcolumn,\n\t\t)\n\t} and ${bindIfParam(max, column)}`;\n}\n\n/**\n * Compare a column to a pattern, which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars with 'Turbo' in their names.\n * db.select().from(cars)\n * .where(like(cars.name, '%Turbo%'))\n * ```\n *\n * @see ilike for a case-insensitive version of this condition\n */\nexport function like(column: Column | SQL.Aliased | SQL | SQLWrapper, value: string | SQLWrapper): SQL {\n\treturn sql`${column} like ${value}`;\n}\n\n/**\n * The inverse of like - this tests that a given column\n * does not match a pattern, which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars that don't have \"ROver\" in their name.\n * db.select().from(cars)\n * .where(notLike(cars.name, '%Rover%'))\n * ```\n *\n * @see like for the inverse condition\n * @see notIlike for a case-insensitive version of this condition\n */\nexport function notLike(column: Column | SQL.Aliased | SQL | SQLWrapper, value: string | SQLWrapper): SQL {\n\treturn sql`${column} not like ${value}`;\n}\n\n/**\n * Case-insensitively compare a column to a pattern,\n * which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * Unlike like, this performs a case-insensitive comparison.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars with 'Turbo' in their names.\n * db.select().from(cars)\n * .where(ilike(cars.name, '%Turbo%'))\n * ```\n *\n * @see like for a case-sensitive version of this condition\n */\nexport function ilike(column: Column | SQL.Aliased | SQL | SQLWrapper, value: string | SQLWrapper): SQL {\n\treturn sql`${column} ilike ${value}`;\n}\n\n/**\n * The inverse of ilike - this case-insensitively tests that a given column\n * does not match a pattern, which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars that don't have \"Rover\" in their name.\n * db.select().from(cars)\n * .where(notLike(cars.name, '%Rover%'))\n * ```\n *\n * @see ilike for the inverse condition\n * @see notLike for a case-sensitive version of this condition\n */\nexport function notIlike(column: Column | SQL.Aliased | SQL | SQLWrapper, value: string | SQLWrapper): SQL {\n\treturn sql`${column} not ilike ${value}`;\n}\n\n/**\n * Test that a column or expression contains all elements of\n * the list passed as the second argument.\n *\n * ## Throws\n *\n * The argument passed in the second array can't be empty:\n * if an empty is provided, this method will throw.\n *\n * ## Examples\n *\n * ```ts\n * // Select posts where its tags contain \"Typescript\" and \"ORM\".\n * db.select().from(posts)\n * .where(arrayContains(posts.tags, ['Typescript', 'ORM']))\n * ```\n *\n * @see arrayContained to find if an array contains all elements of a column or expression\n * @see arrayOverlaps to find if a column or expression contains any elements of an array\n */\nexport function arrayContains<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContains<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContains<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function arrayContains(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('arrayContains requires at least one value');\n\t\t}\n\t\tconst par = bindIfParam(values, column);\n\t\tconst array = sql`${Array.isArray(par) ? new Param(par) : par}`;\n\t\treturn sql`${column} @> ${array}`;\n\t}\n\n\treturn sql`${column} @> ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test that the list passed as the second argument contains\n * all elements of a column or expression.\n *\n * ## Throws\n *\n * The argument passed in the second array can't be empty:\n * if an empty is provided, this method will throw.\n *\n * ## Examples\n *\n * ```ts\n * // Select posts where its tags contain \"Typescript\", \"ORM\" or both,\n * // but filtering posts that have additional tags.\n * db.select().from(posts)\n * .where(arrayContained(posts.tags, ['Typescript', 'ORM']))\n * ```\n *\n * @see arrayContains to find if a column or expression contains all elements of an array\n * @see arrayOverlaps to find if a column or expression contains any elements of an array\n */\nexport function arrayContained<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContained<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContained<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function arrayContained(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('arrayContained requires at least one value');\n\t\t}\n\t\tconst par = bindIfParam(values, column);\n\t\tconst array = sql`${Array.isArray(par) ? new Param(par) : par}`;\n\t\treturn sql`${column} <@ ${array}`;\n\t}\n\n\treturn sql`${column} <@ ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test that a column or expression contains any elements of\n * the list passed as the second argument.\n *\n * ## Throws\n *\n * The argument passed in the second array can't be empty:\n * if an empty is provided, this method will throw.\n *\n * ## Examples\n *\n * ```ts\n * // Select posts where its tags contain \"Typescript\", \"ORM\" or both.\n * db.select().from(posts)\n * .where(arrayOverlaps(posts.tags, ['Typescript', 'ORM']))\n * ```\n *\n * @see arrayContains to find if a column or expression contains all elements of an array\n * @see arrayContained to find if an array contains all elements of a column or expression\n */\nexport function arrayOverlaps<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayOverlaps<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayOverlaps<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function arrayOverlaps(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('arrayOverlaps requires at least one value');\n\t\t}\n\t\tconst par = bindIfParam(values, column);\n\t\tconst array = sql`${Array.isArray(par) ? new Param(par) : par}`;\n\t\treturn sql`${column} && ${array}`;\n\t}\n\n\treturn sql`${column} && ${bindIfParam(values, column)}`;\n}\n","import type { AnyColumn } from '../../column.ts';\nimport type { SQL, SQLWrapper } from '../sql.ts';\nimport { sql } from '../sql.ts';\n\n/**\n * Used in sorting, this specifies that the given\n * column or expression should be sorted in ascending\n * order. By the SQL standard, ascending order is the\n * default, so it is not usually necessary to specify\n * ascending sort order.\n *\n * ## Examples\n *\n * ```ts\n * // Return cars, starting with the oldest models\n * // and going in ascending order to the newest.\n * db.select().from(cars)\n * .orderBy(asc(cars.year));\n * ```\n *\n * @see desc to sort in descending order\n */\nexport function asc(column: AnyColumn | SQLWrapper): SQL {\n\treturn sql`${column} asc`;\n}\n\n/**\n * Used in sorting, this specifies that the given\n * column or expression should be sorted in descending\n * order.\n *\n * ## Examples\n *\n * ```ts\n * // Select users, with the most recently created\n * // records coming first.\n * db.select().from(users)\n * .orderBy(desc(users.createdAt));\n * ```\n *\n * @see asc to sort in ascending order\n */\nexport function desc(column: AnyColumn | SQLWrapper): SQL {\n\treturn sql`${column} desc`;\n}\n","import type { Cache } from './cache/core/cache.ts';\nimport type { CodecsCollection } from './codecs.ts';\nimport type { AnyColumn } from './column.ts';\nimport { Column } from './column.ts';\nimport { is } from './entity.ts';\nimport type { Logger } from './logger.ts';\nimport type { SelectedFieldsFlat, SelectedFieldsOrdered } from './operations.ts';\nimport type { TableLike } from './query-builders/select.types.ts';\nimport type { AnyRelations, EmptyRelations } from './relations.ts';\nimport { Param, SQL, View } from './sql/sql.ts';\nimport type { DriverValueDecoder } from './sql/sql.ts';\nimport { Subquery } from './subquery.ts';\nimport { getTableName, Table } from './table.ts';\nimport { ViewBaseConfig } from './view-common.ts';\n\n/** @internal */\nexport function mapResultRow<TResult>(\n\tcolumns: SelectedFieldsOrdered<AnyColumn>,\n\trow: unknown[] | (readonly unknown[]),\n\tjoinsNotNullableMap: Record<string, boolean> | undefined,\n): TResult {\n\t// Key -> nested object key, value -> table name if all fields in the nested object are from the same table, false otherwise\n\tconst nullifyMap: Record<string, string | false> = {};\n\n\tconst result = columns.reduce<Record<string, any>>(\n\t\t(result, { path, field, codec, arrayDimensions }, columnIndex) => {\n\t\t\tlet decoder: DriverValueDecoder<unknown, unknown>;\n\t\t\tif (is(field, Column)) {\n\t\t\t\tdecoder = field;\n\t\t\t} else if (is(field, SQL)) {\n\t\t\t\tdecoder = field.decoder;\n\t\t\t} else if (is(field, Subquery)) {\n\t\t\t\tdecoder = field._.sql.decoder;\n\t\t\t} else {\n\t\t\t\tdecoder = field.sql.decoder;\n\t\t\t}\n\t\t\tlet node = result;\n\t\t\tfor (const [pathChunkIndex, pathChunk] of path.entries()) {\n\t\t\t\tif (pathChunkIndex < path.length - 1) {\n\t\t\t\t\tif (!(pathChunk in node)) {\n\t\t\t\t\t\tnode[pathChunk] = {};\n\t\t\t\t\t}\n\t\t\t\t\tnode = node[pathChunk];\n\t\t\t\t} else {\n\t\t\t\t\tconst rawValue = row[columnIndex]!;\n\t\t\t\t\tconst value = node[pathChunk] = rawValue === null\n\t\t\t\t\t\t? null\n\t\t\t\t\t\t: decoder.mapFromDriverValue(codec ? codec(rawValue, arrayDimensions!) : rawValue);\n\n\t\t\t\t\tif (joinsNotNullableMap && is(field, Column) && path.length === 2) {\n\t\t\t\t\t\tconst objectName = path[0]!;\n\t\t\t\t\t\tif (!(objectName in nullifyMap)) {\n\t\t\t\t\t\t\tnullifyMap[objectName] = value === null ? getTableName(field.table) : false;\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\ttypeof nullifyMap[objectName] === 'string' && nullifyMap[objectName] !== getTableName(field.table)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tnullifyMap[objectName] = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\t{},\n\t);\n\n\t// Nullify all nested objects from nullifyMap that are nullable\n\tif (joinsNotNullableMap && Object.keys(nullifyMap).length > 0) {\n\t\tfor (const [objectName, tableName] of Object.entries(nullifyMap)) {\n\t\t\tif (typeof tableName === 'string' && !joinsNotNullableMap[tableName]) {\n\t\t\t\tresult[objectName] = null;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result as TResult;\n}\n\n/** @internal bypass bundle-time filtering */\nexport const FnConstructor = Object.getPrototypeOf(() => null).constructor as typeof Function;\n\n/** @internal */\nfunction makeJitQueryMapperInner(\n\tcolumns: SelectedFieldsOrdered<AnyColumn>,\n\tjoinsNotNullableMap: Record<string, boolean> = {},\n): string {\n\tconst preFn = [] as string[];\n\tconst fn = [] as string[];\n\tfn.push(`const [ ${columns.map((_, i) => `c${i}`).join(', ')} ] = rows[i];`);\n\n\tconst nullifyMap: Record<string, string | false> = {};\n\tconst objectIds: Record<string, string[]> = {};\n\tconst decodes = Array.from<string>({ length: columns.length });\n\n\tfor (let idx = 0; idx < columns.length; ++idx) {\n\t\tconst { field, path, codec, arrayDimensions } = columns[idx]!;\n\t\tlet decoder: DriverValueDecoder<unknown, unknown>;\n\t\tlet decoderStr: string;\n\t\tlet decoderFieldDestructure: string;\n\t\tlet isColumn = false;\n\t\tif (is(field, Column)) {\n\t\t\tisColumn = true;\n\t\t\tdecoder = field;\n\t\t\tdecoderFieldDestructure = `field: decoder${idx}`;\n\t\t} else if (is(field, SQL)) {\n\t\t\tdecoder = field.decoder;\n\t\t\tdecoderFieldDestructure = `field: { decoder: decoder${idx} }`;\n\t\t} else if (is(field, Subquery)) {\n\t\t\tdecoder = field._.sql.decoder;\n\t\t\tdecoderFieldDestructure = `field: { _: { sql: { decoder: decoder${idx} } } }`;\n\t\t} else {\n\t\t\tdecoder = field.sql.decoder;\n\t\t\tdecoderFieldDestructure = `field: { sql: { decoder: decoder${idx} } }`;\n\t\t}\n\t\tdecoderStr = `decoder${idx}.mapFromDriverValue`;\n\t\tif (decoder.mapFromDriverValue.isNoop) decoderStr = '';\n\t\tif (decoderStr) {\n\t\t\tpreFn.push(`const { ${decoderFieldDestructure}${codec ? `, codec: codec${idx}` : ''} } = columns[${idx}];`);\n\t\t} else if (codec) {\n\t\t\tpreFn.push(`const { codec: codec${idx} } = columns[${idx}];`);\n\t\t}\n\n\t\tconst colStr = `c${idx}`;\n\t\tlet decodedValue = colStr;\n\t\tif (codec) decodedValue = `codec${idx}(${decodedValue}, ${arrayDimensions})`;\n\t\tif (decoderStr) decodedValue = `${decoderStr}(${decodedValue})`;\n\t\tdecodes[idx] = colStr === decodedValue\n\t\t\t? `${colStr}`\n\t\t\t: `${colStr} === null ? ${colStr} : ${decodedValue}`;\n\n\t\tif (path.length !== 2 || !isColumn) continue;\n\t\tif (objectIds[path[0]!] === undefined) objectIds[path[0]!] = [`c${idx}`];\n\t\telse objectIds[path[0]!]?.push(`c${idx}`);\n\t\tconst [objectName] = path as [string];\n\t\tconst tableName = getTableName((<Column> field).table);\n\t\tnullifyMap[objectName] = joinsNotNullableMap[tableName] ? false : typeof nullifyMap[objectName] === 'string'\n\t\t\t? nullifyMap[objectName] === tableName ? tableName : false\n\t\t\t: tableName;\n\t}\n\n\tfn.push(`mapped[i] = {`);\n\tlet currentObjectPath: string[] = [];\n\tfor (let idx = 0; idx < columns.length; ++idx) {\n\t\tconst { path } = columns[idx]!;\n\t\tconst jsonPath = path.map((e) => JSON.stringify(e));\n\t\tconst decodedValue = decodes[idx]!;\n\n\t\tconst objectPath = path.slice(0, -1);\n\t\tlet commonLen = 0;\n\t\twhile (\n\t\t\tcommonLen < currentObjectPath.length\n\t\t\t&& commonLen < objectPath.length\n\t\t\t&& currentObjectPath[commonLen] === objectPath[commonLen]\n\t\t) commonLen++;\n\n\t\tfor (let d = currentObjectPath.length - 1; d >= commonLen; --d) {\n\t\t\tfn.push(`${'\\t'.repeat(d + 1)}},`);\n\t\t}\n\n\t\tfor (let d = commonLen; d < objectPath.length; ++d) {\n\t\t\tfn.push(\n\t\t\t\t`${'\\t'.repeat(d + 1)}${jsonPath[d]}: ${\n\t\t\t\t\td === 0 && objectPath.length === 1 && typeof nullifyMap[path[0]!] === 'string'\n\t\t\t\t\t\t? `${objectIds[path[0]!]?.map((c) => `${c} === null`).join(' && ')} ? null : {`\n\t\t\t\t\t\t: '{'\n\t\t\t\t}`,\n\t\t\t);\n\t\t}\n\n\t\tcurrentObjectPath = objectPath;\n\t\tfn.push(`${'\\t'.repeat(path.length)}${jsonPath[path.length - 1]}: ${decodedValue},`);\n\t}\n\n\tfor (let d = currentObjectPath.length - 1; d >= 0; --d) {\n\t\tfn.push(`${'\\t'.repeat(d + 1)}},`);\n\t}\n\tfn.push(`};`);\n\n\treturn `${preFn.length ? `${preFn.join('\\n\\t')}\\n\\t` : ''}for (let i = 0; i < length; ++i) {\n\t\t${fn.join('\\n\\t\\t')}\n\t}`;\n}\n\nexport type RowsMapperGenerator = <TResult = any>(\n\tcolumns: SelectedFieldsOrdered<AnyColumn>,\n\tjoinsNotNullableMap: Record<string, boolean> | undefined,\n) => RowsMapper<TResult>;\nexport interface RowsMapper<TResult = Record<string, unknown>[]> {\n\t(rows: unknown[][]): TResult;\n\t/** @internal jit mapper's function body for debugging */\n\tbody?: string;\n}\n\nexport function makeJitQueryMapper<TResult>(\n\tcolumns: SelectedFieldsOrdered<AnyColumn>,\n\tjoinsNotNullableMap: Record<string, boolean> | undefined,\n): RowsMapper<TResult> {\n\tconst internals = `\\t\"use strict\";\n\tconst { columns } = this;\n\tconst { length } = rows;\n\tconst mapped = Array.from({ length });\n\t${makeJitQueryMapperInner(columns, joinsNotNullableMap)}\n\treturn mapped;\n\t//# sourceURL=drizzle:jit-query-mapper`;\n\n\tconst fn = Object.assign(\n\t\tnew FnConstructor(\n\t\t\t'rows',\n\t\t\tinternals,\n\t\t).bind({\n\t\t\tcolumns,\n\t\t}),\n\t\t{ body: `function jitQueryMapper (rows) {\\n${internals}\\n}` },\n\t) as RowsMapper<TResult>;\n\n\treturn fn;\n}\n\n/** @internal */\nexport function jitCompatCheck(isEnabled?: boolean): boolean {\n\tif (!isEnabled) return false;\n\n\ttry {\n\t\tconst res = new FnConstructor('input', '\"use strict\"; return input;')(true);\n\t\tif (res !== true) {\n\t\t\t// In case it's broken in runtime but not forbidden\n\t\t\tconsole.warn(\n\t\t\t\t'Unable to use jit mappers due to incompatibility: corrupted jit function output.\\nFalling back to premade mappers.\\nError details:',\n\t\t\t);\n\t\t\tconsole.error(`Expected to receive \\`true\\`, got: ${res}`);\n\t\t}\n\t\treturn true;\n\t} catch (e) {\n\t\tconsole.warn(\n\t\t\t'Unable to use jit mappers due to incompatibility.\\nFalling back to premade mappers.\\nError details:',\n\t\t);\n\t\tconsole.error(e);\n\t\treturn false;\n\t}\n}\n\nexport function makeDefaultQueryMapper<TResult>(\n\tcolumns: SelectedFieldsOrdered<AnyColumn>,\n\tjoinsNotNullableMap: Record<string, boolean> | undefined,\n): RowsMapper<TResult> {\n\tconst interpretedData = columns.map(({ field, codec, arrayDimensions, path }) => {\n\t\tlet processNullifyMap: ((nullifyMap: Record<string, string | false>, value: any) => void) | undefined;\n\t\tlet decoderSrc: DriverValueDecoder<unknown, unknown>;\n\t\tif (is(field, Column)) {\n\t\t\tdecoderSrc = field;\n\n\t\t\tif (joinsNotNullableMap && path.length === 2) {\n\t\t\t\tconst objectName = path[0]!;\n\t\t\t\tprocessNullifyMap = (nullifyMap, value) => {\n\t\t\t\t\tif (!(objectName in nullifyMap)) {\n\t\t\t\t\t\tnullifyMap[objectName] = value === null ? getTableName(field.table) : false;\n\t\t\t\t\t} else if (\n\t\t\t\t\t\ttypeof nullifyMap[objectName] === 'string' && nullifyMap[objectName] !== getTableName(field.table)\n\t\t\t\t\t) {\n\t\t\t\t\t\tnullifyMap[objectName] = false;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\t\t} else if (is(field, SQL)) {\n\t\t\tdecoderSrc = field.decoder;\n\t\t} else if (is(field, Subquery)) {\n\t\t\tdecoderSrc = field._.sql.decoder;\n\t\t} else {\n\t\t\tdecoderSrc = field.sql.decoder;\n\t\t}\n\n\t\tlet decoder: ((v: any) => any) | undefined;\n\t\tif (decoderSrc.mapFromDriverValue.isNoop) {\n\t\t\tdecoder = codec ? (v: any) => codec(v, arrayDimensions!) : undefined;\n\t\t} else {\n\t\t\tdecoder = codec\n\t\t\t\t? (v: any) => decoderSrc.mapFromDriverValue(codec(v, arrayDimensions!))\n\t\t\t\t: (v: any) => decoderSrc.mapFromDriverValue(v);\n\t\t}\n\n\t\treturn [decoder, processNullifyMap] as const;\n\t});\n\n\treturn ((rows) =>\n\t\trows.map((row) => {\n\t\t\t// Key -> nested object key, value -> table name if all fields in the nested object are from the same table, false otherwise\n\t\t\tconst nullifyMap: Record<string, string | false> = {};\n\n\t\t\tconst result = columns.reduce<Record<string, any>>(\n\t\t\t\t(result, { path }, columnIndex) => {\n\t\t\t\t\tlet node = result;\n\t\t\t\t\tfor (const [pathChunkIndex, pathChunk] of path.entries()) {\n\t\t\t\t\t\tif (pathChunkIndex < path.length - 1) {\n\t\t\t\t\t\t\tif (!(pathChunk in node)) {\n\t\t\t\t\t\t\t\tnode[pathChunk] = {};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tnode = node[pathChunk];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst [decoder, processNullifyMap] = interpretedData[columnIndex]!;\n\n\t\t\t\t\t\t\tconst rawValue = row[columnIndex]!;\n\t\t\t\t\t\t\tconst value = node[pathChunk] = rawValue === null\n\t\t\t\t\t\t\t\t? null\n\t\t\t\t\t\t\t\t: decoder\n\t\t\t\t\t\t\t\t? decoder(rawValue)\n\t\t\t\t\t\t\t\t: rawValue;\n\n\t\t\t\t\t\t\tprocessNullifyMap?.(nullifyMap, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t},\n\t\t\t\t{},\n\t\t\t);\n\n\t\t\t// Nullify all nested objects from nullifyMap that are nullable\n\t\t\tif (joinsNotNullableMap && Object.keys(nullifyMap).length > 0) {\n\t\t\t\tfor (const [objectName, tableName] of Object.entries(nullifyMap)) {\n\t\t\t\t\tif (typeof tableName === 'string' && !joinsNotNullableMap[tableName]) {\n\t\t\t\t\t\tresult[objectName] = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result as TResult;\n\t\t})) as RowsMapper<TResult>;\n}\n\nexport function make$ReturningResponseMapper(\n\treturningIds: SelectedFieldsOrdered<Column> | undefined,\n\tgeneratedIds?: Record<string, unknown>[],\n) {\n\tif (!returningIds) return;\n\n\treturn ({ insertId, affectedRows }: {\n\t\tinsertId: number;\n\t\taffectedRows: number;\n\t}) => {\n\t\tconst returningResponse = [];\n\t\tlet j = 0;\n\t\tfor (let i = insertId; i < insertId + affectedRows; i++) {\n\t\t\tfor (const column of returningIds) {\n\t\t\t\tconst key = returningIds[0]!.path[0]!;\n\t\t\t\tif (is(column.field, Column)) {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tif (column.field.primary && column.field.autoIncrement) {\n\t\t\t\t\t\treturningResponse.push({ [key]: i });\n\t\t\t\t\t}\n\t\t\t\t\tif (column.field.defaultFn && generatedIds) {\n\t\t\t\t\t\t// generatedIds[rowIdx][key]\n\t\t\t\t\t\treturningResponse.push({ [key]: generatedIds[j]![key] });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tj++;\n\t\t}\n\n\t\treturn returningResponse;\n\t};\n}\n\n/** @internal */\nexport function orderSelectedFields<TColumn extends AnyColumn>(\n\tfields: Record<string, unknown>,\n\tpathPrefix?: string[],\n\tcodecs?: CodecsCollection,\n): SelectedFieldsOrdered<TColumn> {\n\treturn Object.entries(fields).reduce<SelectedFieldsOrdered<AnyColumn>>((result, [name, field]) => {\n\t\tif (typeof name !== 'string') {\n\t\t\treturn result;\n\t\t}\n\n\t\tconst newPath = pathPrefix ? [...pathPrefix, name] : [name];\n\t\tif (is(field, Column)) {\n\t\t\tresult.push({\n\t\t\t\tpath: newPath,\n\t\t\t\tfield,\n\t\t\t\tcodec: codecs?.get(field, 'normalize'),\n\t\t\t\tarrayDimensions: (<any> field).dimensions,\n\t\t\t});\n\t\t} else if (is(field, Column) || is(field, SQL) || is(field, SQL.Aliased) || is(field, Subquery)) {\n\t\t\tresult.push({ path: newPath, field });\n\t\t} else if (is(field, Table)) {\n\t\t\tresult.push(...orderSelectedFields(field[Table.Symbol.Columns], newPath, codecs));\n\t\t} else {\n\t\t\tresult.push(...orderSelectedFields(field as Record<string, unknown>, newPath, codecs));\n\t\t}\n\t\treturn result;\n\t}, []) as SelectedFieldsOrdered<TColumn>;\n}\n\nexport function haveSameKeys(left: Record<string, unknown>, right: Record<string, unknown>) {\n\tconst leftKeys = Object.keys(left);\n\tconst rightKeys = Object.keys(right);\n\n\tif (leftKeys.length !== rightKeys.length) {\n\t\treturn false;\n\t}\n\n\tfor (const [index, key] of leftKeys.entries()) {\n\t\tif (key !== rightKeys[index]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/** @internal */\nexport function mapUpdateSet(table: Table, values: Record<string, unknown>): UpdateSet {\n\tconst entries: [string, UpdateSet[string]][] = Object.entries(values)\n\t\t.filter(([, value]) => value !== undefined)\n\t\t.map(([key, value]) => {\n\t\t\t// eslint-disable-next-line unicorn/prefer-ternary\n\t\t\tif (is(value, SQL) || is(value, Column)) {\n\t\t\t\treturn [key, value];\n\t\t\t} else {\n\t\t\t\treturn [key, new Param(value, table[Table.Symbol.Columns][key])];\n\t\t\t}\n\t\t});\n\n\tif (entries.length === 0) {\n\t\tthrow new Error('No values to set');\n\t}\n\n\treturn Object.fromEntries(entries);\n}\n\nexport type UpdateSet = Record<string, SQL | Param | AnyColumn | null | undefined>;\n\nexport type OneOrMany<T> = T | T[];\n\nexport type Update<T, TUpdate> =\n\t& {\n\t\t[K in Exclude<keyof T, keyof TUpdate>]: T[K];\n\t}\n\t& TUpdate;\n\nexport type Simplify<T> =\n\t& {\n\t\t// @ts-ignore - \"Type parameter 'K' has a circular constraint\", not sure why\n\t\t[K in keyof T]: T[K];\n\t}\n\t& {};\n\nexport type Not<T extends boolean> = T extends true ? false : true;\n\nexport type IsNever<T> = [T] extends [never] ? true : false;\n\nexport type IsUnion<T, U extends T = T> = (T extends any ? (U extends T ? false : true) : never) extends false ? false\n\t: true;\n\nexport type SingleKeyObject<T, TError extends string, K = keyof T> = IsNever<K> extends true ? never\n\t: IsUnion<K> extends true ? DrizzleTypeError<TError>\n\t: T;\n\nexport type FromSingleKeyObject<T, Result, TError extends string, K = keyof T> = IsNever<K> extends true ? never\n\t: IsUnion<K> extends true ? DrizzleTypeError<TError>\n\t: Result;\n\nexport type SimplifyMappedType<T> = [T] extends [unknown] ? T : never;\n\nexport type ShallowRecord<K extends keyof any, T> = SimplifyMappedType<{ [P in K]: T }>;\n\nexport type Assume<T, U> = T extends U ? T : U;\n\nexport type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true : false;\n\nexport interface DrizzleTypeError<T extends string> {\n\t$drizzleTypeError: T;\n}\n\nexport type ValueOrArray<T> = T | T[];\n\n/** @internal */\nexport function applyMixins(baseClass: any, extendedClasses: any[]) {\n\tfor (const extendedClass of extendedClasses) {\n\t\tfor (const name of Object.getOwnPropertyNames(extendedClass.prototype)) {\n\t\t\tif (name === 'constructor') continue;\n\n\t\t\tObject.defineProperty(\n\t\t\t\tbaseClass.prototype,\n\t\t\t\tname,\n\t\t\t\tObject.getOwnPropertyDescriptor(extendedClass.prototype, name) || Object.create(null),\n\t\t\t);\n\t\t}\n\t}\n}\n\nexport type Or<T1, T2> = T1 extends true ? true : T2 extends true ? true : false;\n\nexport type IfThenElse<If, Then, Else> = If extends true ? Then : Else;\n\nexport type PromiseOf<T> = T extends Promise<infer U> ? U : T;\n\nexport type Writable<T> = {\n\t-readonly [P in keyof T]: T[P];\n};\n\nexport type NonArray<T> = T extends any[] ? never : T;\n\n/**\n * @deprecated\n * Use `getColumns` instead\n */\nexport function getTableColumns<T extends Table>(table: T): T['_']['columns'] {\n\treturn table[Table.Symbol.Columns];\n}\n\nexport function getViewSelectedFields<T extends View>(view: T): T['_']['selectedFields'] {\n\treturn view[ViewBaseConfig].selectedFields;\n}\n\nexport function getColumns<T extends Table | View | Subquery>(\n\ttable: T,\n): T extends Table ? T['_']['columns']\n\t: T extends View ? T['_']['selectedFields']\n\t: T extends Subquery ? T['_']['selectedFields']\n\t: never\n{\n\treturn (is(table, Table)\n\t\t? table[Table.Symbol.Columns]\n\t\t: is(table, View)\n\t\t? table[ViewBaseConfig].selectedFields\n\t\t: table._.selectedFields) as any;\n}\n\n/** @internal */\nexport function getTableLikeName(table: TableLike): string | undefined {\n\treturn is(table, Subquery)\n\t\t? table._.alias\n\t\t: is(table, View)\n\t\t? table[ViewBaseConfig].name\n\t\t: is(table, SQL)\n\t\t? undefined\n\t\t: table[Table.Symbol.IsAlias]\n\t\t? table[Table.Symbol.Name]\n\t\t: table[Table.Symbol.BaseName];\n}\n\nexport type ColumnsWithTable<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends AnyColumn<{ tableName: TTableName }>[],\n> = { [Key in keyof TColumns]: AnyColumn<{ tableName: TForeignTableName }> };\n\nexport interface DrizzleConfig<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTRelationConfigs extends AnyRelations = EmptyRelations,\n> {\n\tlogger?: boolean | Logger | undefined;\n\tschema?: TSchema | undefined;\n\trelations?: TRelationConfigs | undefined;\n\tcache?: Cache | undefined;\n\tjit?: boolean | undefined;\n}\nexport type ValidateShape<T, ValidShape, TResult = T> = T extends ValidShape\n\t? Exclude<keyof T, keyof ValidShape> extends never ? TResult\n\t: DrizzleTypeError<\n\t\t`Invalid key(s): ${Exclude<(keyof T) & (string | number | bigint | boolean | null | undefined), keyof ValidShape>}`\n\t>\n\t: never;\n\nexport type KnownKeysOnly<T, U> = {\n\t[K in keyof T]: K extends keyof U ? T[K] : never;\n};\n\nexport type IsAny<T> = 0 extends (1 & T) ? true : false;\n\n/** @internal */\nexport function getColumnNameAndConfig<\n\tTConfig extends Record<string, any> | undefined,\n>(a: string | TConfig | undefined, b: TConfig | undefined) {\n\treturn {\n\t\tname: typeof a === 'string' && a.length > 0 ? a : '' as string,\n\t\tconfig: typeof a === 'object' ? a : b as TConfig,\n\t};\n}\n\nexport type IfNotImported<T, Y, N> = unknown extends T ? Y : N;\n\nexport type ImportTypeError<TPackageName extends string> =\n\t`Please install \\`${TPackageName}\\` to allow Drizzle ORM to connect to the database`;\n\nexport type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Keys extends any\n\t? Required<Pick<T, Keys>> & Partial<Omit<T, Keys>>\n\t: never;\n\ntype ExpectedConfigShape = {\n\tlogger?: boolean | {\n\t\tlogQuery(query: string, params: unknown[]): void;\n\t} | undefined;\n\tschema?: Record<string, never> | undefined;\n\trelations?: AnyRelations | undefined;\n};\n\n// If this errors, you must update config shape checker function with new config specs\nconst _: DrizzleConfig<any, any> = {} as ExpectedConfigShape;\nconst __: ExpectedConfigShape = {} as DrizzleConfig;\n\nexport function isConfig(data: any): boolean {\n\tif (typeof data !== 'object' || data === null) return false;\n\n\tif (data.constructor.name !== 'Object') return false;\n\n\tif ('logger' in data) {\n\t\tconst type = typeof data['logger'];\n\t\tif (\n\t\t\ttype !== 'boolean' && (type !== 'object' || typeof data['logger']['logQuery'] !== 'function')\n\t\t\t&& type !== 'undefined'\n\t\t) return false;\n\n\t\treturn true;\n\t}\n\n\tif ('schema' in data) {\n\t\tconst type = typeof data['schema'];\n\t\tif (type !== 'object' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif ('relations' in data) {\n\t\tconst type = typeof data['relations'];\n\t\tif (type !== 'object' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif ('connection' in data) {\n\t\tconst type = typeof data['connection'];\n\t\tif (type !== 'string' && type !== 'object' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif ('client' in data) {\n\t\tconst type = typeof data['client'];\n\t\tif (type !== 'object' && type !== 'function' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif ('jit' in data) {\n\t\tconst type = typeof data['jit'];\n\t\tif (type !== 'boolean' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif ('codecs' in data) {\n\t\tconst type = typeof data['connection'];\n\t\tif (type !== 'object' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif (Object.keys(data).length === 0) return true;\n\n\treturn false;\n}\n\nexport type NeonAuthToken = string | (() => string | Promise<string>);\n\nexport const textDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder();\n\nexport function assertUnreachable(_x: never | undefined): never {\n\tthrow new Error(\"Didn't expect to get here\");\n}\n\nexport function isWithEnum(column: Column<any>): column is typeof column & { enumValues: [string, ...string[]] };\nexport function isWithEnum(value: unknown): value is { enumValues: [string, ...string[]] };\nexport function isWithEnum(value: unknown): boolean {\n\treturn ((typeof value === 'object' && value !== null) || typeof value === 'function') && 'enumValues' in value\n\t\t&& Array.isArray(value.enumValues)\n\t\t&& value.enumValues.length > 0;\n}\n\nexport type Literal = string | number | boolean | null;\nexport type Json = Literal | { [key: string]: any } | any[];\n\nexport type ColumnIsGeneratedAlwaysAs<TColumn> = TColumn extends Column<any>\n\t? TColumn['_']['identity'] extends 'always' ? true\n\t: TColumn['_'] extends { generated: undefined } ? false\n\t: TColumn['_']['generated'] extends { type: 'byDefault' } ? false\n\t: true\n\t: false;\n\nexport type GetSelection<T extends SelectedFieldsFlat<Column<any>> | Table<any> | View> = T extends Table<any>\n\t? T['_']['columns']\n\t: T extends View ? T['_']['selectedFields']\n\t: T;\n\nexport type RemoveNeverElements<T extends any[]> = T extends [infer First, ...infer Rest]\n\t? IsNever<First> extends true ? RemoveNeverElements<Rest>\n\t: [First, ...RemoveNeverElements<Rest>]\n\t: [];\n\nexport type HasBaseColumn<TColumn> = TColumn extends { _: { baseColumn: Column | undefined } }\n\t? IsNever<TColumn['_']['baseColumn']> extends false ? true\n\t: false\n\t: false;\n\nexport type EnumValuesToEnum<TEnumValues extends [string, ...string[]]> = { [K in TEnumValues[number]]: K };\n\nexport type EnumValuesToReadonlyEnum<TEnumValues extends [string, ...string[]]> = {\n\treadonly [K in TEnumValues[number]]: K;\n};\n\nexport const CONSTANTS = {\n\tINT8_MIN: -128,\n\tINT8_MAX: 127,\n\tINT8_UNSIGNED_MAX: 255,\n\tINT16_MIN: -32768,\n\tINT16_MAX: 32767,\n\tINT16_UNSIGNED_MAX: 65535,\n\tINT24_MIN: -8388608,\n\tINT24_MAX: 8388607,\n\tINT24_UNSIGNED_MAX: 16777215,\n\tINT32_MIN: -2147483648,\n\tINT32_MAX: 2147483647,\n\tINT32_UNSIGNED_MAX: 4294967295,\n\tINT48_MIN: -140737488355328,\n\tINT48_MAX: 140737488355327,\n\tINT48_UNSIGNED_MAX: 281474976710655,\n\tINT64_MIN: -9223372036854775808n,\n\tINT64_MAX: 9223372036854775807n,\n\tINT64_UNSIGNED_MAX: 18446744073709551615n,\n};\n\nexport function base64ToUint8Array(base64: string): Uint8Array {\n\tif (!base64) return new Uint8Array(0);\n\tconst binary = atob(base64);\n\tconst len = binary.length;\n\tconst bytes = new Uint8Array(len);\n\n\tfor (let i = 0; i < len; ++i) {\n\t\tbytes[i] = binary.charCodeAt(i);\n\t}\n\n\treturn bytes;\n}\n\nexport type PartialWithUndefined<T> = {\n\t[K in keyof T]?: T[K] | undefined;\n};\n","import { type AnyColumn, Column } from '~/column.ts';\nimport { is } from '~/entity.ts';\nimport { type SQL, sql, type SQLWrapper } from '../sql.ts';\n\n/**\n * Returns the number of values in `expression`.\n *\n * ## Examples\n *\n * ```ts\n * // Number employees with null values\n * db.select({ value: count() }).from(employees)\n * // Number of employees where `name` is not null\n * db.select({ value: count(employees.name) }).from(employees)\n * ```\n *\n * @see countDistinct to get the number of non-duplicate values in `expression`\n */\nexport function count(expression?: SQLWrapper): SQL<number> {\n\treturn sql`count(${expression || sql.raw('*')})`.mapWith(Number);\n}\n\n/**\n * Returns the number of non-duplicate values in `expression`.\n *\n * ## Examples\n *\n * ```ts\n * // Number of employees where `name` is distinct\n * db.select({ value: countDistinct(employees.name) }).from(employees)\n * ```\n *\n * @see count to get the number of values in `expression`, including duplicates\n */\nexport function countDistinct(expression: SQLWrapper): SQL<number> {\n\treturn sql`count(distinct ${expression})`.mapWith(Number);\n}\n\n/**\n * Returns the average (arithmetic mean) of all non-null values in `expression`.\n *\n * ## Examples\n *\n * ```ts\n * // Average salary of an employee\n * db.select({ value: avg(employees.salary) }).from(employees)\n * ```\n *\n * @see avgDistinct to get the average of all non-null and non-duplicate values in `expression`\n */\nexport function avg(expression: SQLWrapper): SQL<string | null> {\n\treturn sql`avg(${expression})`.mapWith(String);\n}\n\n/**\n * Returns the average (arithmetic mean) of all non-null and non-duplicate values in `expression`.\n *\n * ## Examples\n *\n * ```ts\n * // Average salary of an employee where `salary` is distinct\n * db.select({ value: avgDistinct(employees.salary) }).from(employees)\n * ```\n *\n * @see avg to get the average of all non-null values in `expression`, including duplicates\n */\nexport function avgDistinct(expression: SQLWrapper): SQL<string | null> {\n\treturn sql`avg(distinct ${expression})`.mapWith(String);\n}\n\n/**\n * Returns the sum of all non-null values in `expression`.\n *\n * ## Examples\n *\n * ```ts\n * // Sum of every employee's salary\n * db.select({ value: sum(employees.salary) }).from(employees)\n * ```\n *\n * @see sumDistinct to get the sum of all non-null and non-duplicate values in `expression`\n */\nexport function sum(expression: SQLWrapper): SQL<string | null> {\n\treturn sql`sum(${expression})`.mapWith(String);\n}\n\n/**\n * Returns the sum of all non-null and non-duplicate values in `expression`.\n *\n * ## Examples\n *\n * ```ts\n * // Sum of every employee's salary where `salary` is distinct (no duplicates)\n * db.select({ value: sumDistinct(employees.salary) }).from(employees)\n * ```\n *\n * @see sum to get the sum of all non-null values in `expression`, including duplicates\n */\nexport function sumDistinct(expression: SQLWrapper): SQL<string | null> {\n\treturn sql`sum(distinct ${expression})`.mapWith(String);\n}\n\n/**\n * Returns the maximum value in `expression`.\n *\n * ## Examples\n *\n * ```ts\n * // The employee with the highest salary\n * db.select({ value: max(employees.salary) }).from(employees)\n * ```\n */\nexport function max<T extends SQLWrapper>(expression: T): SQL<(T extends AnyColumn ? T['_']['data'] : string) | null> {\n\treturn sql`max(${expression})`.mapWith(is(expression, Column) ? expression : String) as any;\n}\n\n/**\n * Returns the minimum value in `expression`.\n *\n * ## Examples\n *\n * ```ts\n * // The employee with the lowest salary\n * db.select({ value: min(employees.salary) }).from(employees)\n * ```\n */\nexport function min<T extends SQLWrapper>(expression: T): SQL<(T extends AnyColumn ? T['_']['data'] : string) | null> {\n\treturn sql`min(${expression})`.mapWith(is(expression, Column) ? expression : String) as any;\n}\n","import { ExtraConfigColumn, IndexedColumn, PgColumn, PgColumnBuilder } from \"./columns/common.js\";\nimport { PgBigInt53, PgBigInt53Builder, PgBigInt64, PgBigInt64Builder, PgBigIntString, PgBigIntStringBuilder, bigint } from \"./columns/bigint.js\";\nimport { PgBigSerial53, PgBigSerial53Builder, PgBigSerial64, PgBigSerial64Builder, bigserial } from \"./columns/bigserial.js\";\nimport { PgBoolean, PgBooleanBuilder, boolean } from \"./columns/boolean.js\";\nimport { PgChar, PgCharBuilder, char } from \"./columns/char.js\";\nimport { PgCidr, PgCidrBuilder, cidr } from \"./columns/cidr.js\";\nimport { makePgArray, parsePgArray, parsePgNestedArray } from \"./array.js\";\nimport { PgCustomColumn, PgCustomColumnBuilder, customType } from \"./columns/custom.js\";\nimport { PgDate, PgDateBuilder, PgDateString, PgDateStringBuilder, date } from \"./columns/date.js\";\nimport { PgDoublePrecision, PgDoublePrecisionBuilder, doublePrecision } from \"./columns/double-precision.js\";\nimport { PgInet, PgInetBuilder, inet } from \"./columns/inet.js\";\nimport { PgInteger, PgIntegerBuilder, integer } from \"./columns/integer.js\";\nimport { PgInterval, PgIntervalBuilder, interval } from \"./columns/interval.js\";\nimport { PgJson, PgJsonBuilder, json } from \"./columns/json.js\";\nimport { PgJsonb, PgJsonbBuilder, jsonb } from \"./columns/jsonb.js\";\nimport { PgLineABC, PgLineABCBuilder, PgLineBuilder, PgLineTuple, line } from \"./columns/line.js\";\nimport { PgMacaddr, PgMacaddrBuilder, macaddr } from \"./columns/macaddr.js\";\nimport { PgMacaddr8, PgMacaddr8Builder, macaddr8 } from \"./columns/macaddr8.js\";\nimport { PgNumeric, PgNumericBigInt, PgNumericBigIntBuilder, PgNumericBuilder, PgNumericNumber, PgNumericNumberBuilder, decimal, numeric } from \"./columns/numeric.js\";\nimport { PgPointObject, PgPointObjectBuilder, PgPointTuple, PgPointTupleBuilder, point } from \"./columns/point.js\";\nimport { PgGeometry, PgGeometryBuilder, PgGeometryObject, PgGeometryObjectBuilder, geometry } from \"./columns/postgis_extension/geometry.js\";\nimport { PgReal, PgRealBuilder, real } from \"./columns/real.js\";\nimport { PgSerial, PgSerialBuilder, serial } from \"./columns/serial.js\";\nimport { PgSmallInt, PgSmallIntBuilder, smallint } from \"./columns/smallint.js\";\nimport { PgSmallSerial, PgSmallSerialBuilder, smallserial } from \"./columns/smallserial.js\";\nimport { PgText, PgTextBuilder, text } from \"./columns/text.js\";\nimport { PgTime, PgTimeBuilder, time } from \"./columns/time.js\";\nimport { PgTimestamp, PgTimestampBuilder, PgTimestampString, PgTimestampStringBuilder, timestamp } from \"./columns/timestamp.js\";\nimport { PgUUID, PgUUIDBuilder, uuid } from \"./columns/uuid.js\";\nimport { PgVarchar, PgVarcharBuilder, varchar } from \"./columns/varchar.js\";\nimport { PgBinaryVector, PgBinaryVectorBuilder, bit } from \"./columns/vector_extension/bit.js\";\nimport { PgHalfVector, PgHalfVectorBuilder, halfvec } from \"./columns/vector_extension/halfvec.js\";\nimport { PgSparseVector, PgSparseVectorBuilder, sparsevec } from \"./columns/vector_extension/sparsevec.js\";\nimport { PgVector, PgVectorBuilder, vector } from \"./columns/vector_extension/vector.js\";\nimport { EnableRLS, InlineForeignKeys, PgTable, pgTable, pgTableCreator, pgTableWithCasing, pgTableWithSchema } from \"./table.js\";\nimport { PrimaryKey, PrimaryKeyBuilder, primaryKey } from \"./primary-keys.js\";\nimport { alias } from \"./alias.js\";\nimport { PgAsyncCountBuilder } from \"./async/count.js\";\nimport { PgDeleteBase } from \"./query-builders/delete.js\";\nimport { Check, CheckBuilder, check } from \"./checks.js\";\nimport { ForeignKey, ForeignKeyBuilder, foreignKey } from \"./foreign-keys.js\";\nimport { PgBytea, PgByteaBuilder, bytea } from \"./columns/bytea.js\";\nimport { PgEnumColumn, PgEnumColumnBuilder, PgEnumObjectColumn, PgEnumObjectColumnBuilder, isPgEnum, pgEnum, pgEnumObjectWithSchema, pgEnumWithSchema } from \"./columns/enum.js\";\nimport { Index, IndexBuilder, IndexBuilderOn, index, uniqueIndex } from \"./indexes.js\";\nimport { PgPolicy, pgPolicy } from \"./policies.js\";\nimport { UniqueConstraint, UniqueConstraintBuilder, UniqueOnConstraintBuilder, unique, uniqueKeyName } from \"./unique-constraint.js\";\nimport { PgMaterializedViewConfig, PgViewConfig } from \"./view-common.js\";\nimport { extractUsedTable, getMaterializedViewConfig, getTableConfig, getViewConfig } from \"./utils.js\";\nimport { PgAsyncDeleteBase } from \"./async/delete.js\";\nimport { PgSelectBase, PgSelectBuilder, except, exceptAll, intersect, intersectAll, union, unionAll } from \"./query-builders/select.js\";\nimport { QueryBuilder } from \"./query-builders/query-builder.js\";\nimport { PgInsertBase, PgInsertBuilder } from \"./query-builders/insert.js\";\nimport { PgAsyncInsertBase } from \"./async/insert.js\";\nimport { PgAsyncRelationalQuery } from \"./async/query.js\";\nimport { PgAsyncRaw } from \"./async/raw.js\";\nimport { PgRefreshMaterializedView } from \"./query-builders/refresh-materialized-view.js\";\nimport { PgAsyncRefreshMaterializedView } from \"./async/refresh-materialized-view.js\";\nimport { PgAsyncSelectBase } from \"./async/select.js\";\nimport { PgUpdateBase, PgUpdateBuilder } from \"./query-builders/update.js\";\nimport { PgAsyncUpdateBase } from \"./async/update.js\";\nimport { PgAsyncDatabase, withReplicas } from \"./async/db.js\";\nimport { PgBasePreparedQuery, PgSession } from \"./session.js\";\nimport { PgAsyncPreparedQuery, PgAsyncSession, PgAsyncTransaction, migrate } from \"./async/session.js\";\nimport { PgSequence, isPgSequence, pgSequence, pgSequenceWithSchema } from \"./sequence.js\";\nimport { DefaultViewBuilderCore, ManualMaterializedViewBuilder, ManualViewBuilder, MaterializedViewBuilder, MaterializedViewBuilderCore, PgMaterializedView, PgView, ViewBuilder, isPgMaterializedView, isPgView, pgMaterializedView, pgMaterializedViewWithCasing, pgMaterializedViewWithSchema, pgView, pgViewWithCasing, pgViewWithSchema } from \"./view.js\";\nimport { PgSchema, isPgSchema, pgSchema } from \"./schema.js\";\nimport { camelCase, snakeCase } from \"./casing.js\";\nimport { PgDialect } from \"./dialect.js\";\nimport { PgRole, pgRole } from \"./roles.js\";\n\nexport { Check, CheckBuilder, DefaultViewBuilderCore, EnableRLS, ExtraConfigColumn, ForeignKey, ForeignKeyBuilder, Index, IndexBuilder, IndexBuilderOn, IndexedColumn, InlineForeignKeys, ManualMaterializedViewBuilder, ManualViewBuilder, MaterializedViewBuilder, MaterializedViewBuilderCore, PgAsyncCountBuilder, PgAsyncDatabase, PgAsyncDeleteBase, PgAsyncInsertBase, PgAsyncPreparedQuery, PgAsyncRaw, PgAsyncRefreshMaterializedView, PgAsyncRelationalQuery, PgAsyncSelectBase, PgAsyncSession, PgAsyncTransaction, PgAsyncUpdateBase, PgBasePreparedQuery, PgBigInt53, PgBigInt53Builder, PgBigInt64, PgBigInt64Builder, PgBigIntString, PgBigIntStringBuilder, PgBigSerial53, PgBigSerial53Builder, PgBigSerial64, PgBigSerial64Builder, PgBinaryVector, PgBinaryVectorBuilder, PgBoolean, PgBooleanBuilder, PgBytea, PgByteaBuilder, PgChar, PgCharBuilder, PgCidr, PgCidrBuilder, PgColumn, PgColumnBuilder, PgCustomColumn, PgCustomColumnBuilder, PgDate, PgDateBuilder, PgDateString, PgDateStringBuilder, PgDeleteBase, PgDialect, PgDoublePrecision, PgDoublePrecisionBuilder, PgEnumColumn, PgEnumColumnBuilder, PgEnumObjectColumn, PgEnumObjectColumnBuilder, PgGeometry, PgGeometryBuilder, PgGeometryObject, PgGeometryObjectBuilder, PgHalfVector, PgHalfVectorBuilder, PgInet, PgInetBuilder, PgInsertBase, PgInsertBuilder, PgInteger, PgIntegerBuilder, PgInterval, PgIntervalBuilder, PgJson, PgJsonBuilder, PgJsonb, PgJsonbBuilder, PgLineABC, PgLineABCBuilder, PgLineBuilder, PgLineTuple, PgMacaddr, PgMacaddr8, PgMacaddr8Builder, PgMacaddrBuilder, PgMaterializedView, PgMaterializedViewConfig, PgNumeric, PgNumericBigInt, PgNumericBigIntBuilder, PgNumericBuilder, PgNumericNumber, PgNumericNumberBuilder, PgPointObject, PgPointObjectBuilder, PgPointTuple, PgPointTupleBuilder, PgPolicy, PgReal, PgRealBuilder, PgRefreshMaterializedView, PgRole, PgSchema, PgSelectBase, PgSelectBuilder, PgSequence, PgSerial, PgSerialBuilder, PgSession, PgSmallInt, PgSmallIntBuilder, PgSmallSerial, PgSmallSerialBuilder, PgSparseVector, PgSparseVectorBuilder, PgTable, PgText, PgTextBuilder, PgTime, PgTimeBuilder, PgTimestamp, PgTimestampBuilder, PgTimestampString, PgTimestampStringBuilder, PgUUID, PgUUIDBuilder, PgUpdateBase, PgUpdateBuilder, PgVarchar, PgVarcharBuilder, PgVector, PgVectorBuilder, PgView, PgViewConfig, PrimaryKey, PrimaryKeyBuilder, QueryBuilder, UniqueConstraint, UniqueConstraintBuilder, UniqueOnConstraintBuilder, ViewBuilder, alias, bigint, bigserial, bit, boolean, bytea, camelCase, char, check, cidr, customType, date, decimal, doublePrecision, except, exceptAll, extractUsedTable, foreignKey, geometry, getMaterializedViewConfig, getTableConfig, getViewConfig, halfvec, index, inet, integer, intersect, intersectAll, interval, isPgEnum, isPgMaterializedView, isPgSchema, isPgSequence, isPgView, json, jsonb, line, macaddr, macaddr8, makePgArray, migrate, numeric, parsePgArray, parsePgNestedArray, pgEnum, pgEnumObjectWithSchema, pgEnumWithSchema, pgMaterializedView, pgMaterializedViewWithCasing, pgMaterializedViewWithSchema, pgPolicy, pgRole, pgSchema, pgSequence, pgSequenceWithSchema, pgTable, pgTableCreator, pgTableWithCasing, pgTableWithSchema, pgView, pgViewWithCasing, pgViewWithSchema, point, primaryKey, real, serial, smallint, smallserial, snakeCase, sparsevec, text, time, timestamp, union, unionAll, unique, uniqueIndex, uniqueKeyName, uuid, varchar, vector, withReplicas };","import { entityKind } from '~/entity.ts';\nimport { TableName } from '~/table.utils.ts';\nimport type { AnyPgColumn, PgColumn } from './columns/index.ts';\nimport type { PgTable } from './table.ts';\n\nexport type UpdateDeleteAction = 'cascade' | 'restrict' | 'no action' | 'set null' | 'set default';\n\nexport type Reference = () => {\n\treadonly name?: string;\n\treadonly columns: PgColumn[];\n\treadonly foreignTable: PgTable;\n\treadonly foreignColumns: PgColumn[];\n};\n\nexport class ForeignKeyBuilder {\n\tstatic readonly [entityKind]: string = 'PgForeignKeyBuilder';\n\n\t/** @internal */\n\treference: Reference;\n\n\t/** @internal */\n\t_onUpdate: UpdateDeleteAction | undefined = 'no action';\n\n\t/** @internal */\n\t_onDelete: UpdateDeleteAction | undefined = 'no action';\n\n\tconstructor(\n\t\tconfig: () => {\n\t\t\tname?: string;\n\t\t\tcolumns: PgColumn[];\n\t\t\tforeignColumns: PgColumn[];\n\t\t},\n\t\tactions?: {\n\t\t\tonUpdate?: UpdateDeleteAction;\n\t\t\tonDelete?: UpdateDeleteAction;\n\t\t} | undefined,\n\t) {\n\t\tthis.reference = () => {\n\t\t\tconst { name, columns, foreignColumns } = config();\n\t\t\treturn { name, columns, foreignTable: foreignColumns[0]!.table as PgTable, foreignColumns };\n\t\t};\n\t\tif (actions) {\n\t\t\tthis._onUpdate = actions.onUpdate;\n\t\t\tthis._onDelete = actions.onDelete;\n\t\t}\n\t}\n\n\tonUpdate(action: UpdateDeleteAction): this {\n\t\tthis._onUpdate = action === undefined ? 'no action' : action;\n\t\treturn this;\n\t}\n\n\tonDelete(action: UpdateDeleteAction): this {\n\t\tthis._onDelete = action === undefined ? 'no action' : action;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: PgTable): ForeignKey {\n\t\treturn new ForeignKey(table, this);\n\t}\n}\n\nexport type AnyForeignKeyBuilder = ForeignKeyBuilder;\n\nexport class ForeignKey {\n\tstatic readonly [entityKind]: string = 'PgForeignKey';\n\n\treadonly reference: Reference;\n\treadonly onUpdate: UpdateDeleteAction | undefined;\n\treadonly onDelete: UpdateDeleteAction | undefined;\n\treadonly name?: string;\n\n\tconstructor(readonly table: PgTable, builder: ForeignKeyBuilder) {\n\t\tthis.reference = builder.reference;\n\t\tthis.onUpdate = builder._onUpdate;\n\t\tthis.onDelete = builder._onDelete;\n\t}\n\n\tgetName(): string {\n\t\tconst { name, columns, foreignColumns } = this.reference();\n\t\tconst columnNames = columns.map((column) => column.name);\n\t\tconst foreignColumnNames = foreignColumns.map((column) => column.name);\n\t\tconst chunks = [\n\t\t\tthis.table[TableName],\n\t\t\t...columnNames,\n\t\t\tforeignColumns[0]!.table[TableName],\n\t\t\t...foreignColumnNames,\n\t\t];\n\t\treturn name ?? `${chunks.join('_')}_fk`;\n\t}\n\n\tisNameExplicit(): boolean {\n\t\treturn !!this.reference().name;\n\t}\n}\n\ntype ColumnsWithTable<\n\tTTableName extends string,\n\tTColumns extends PgColumn[],\n> = { [Key in keyof TColumns]: AnyPgColumn<{ tableName: TTableName }> };\n\nexport function foreignKey<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends [AnyPgColumn<{ tableName: TTableName }>, ...AnyPgColumn<{ tableName: TTableName }>[]],\n>(\n\tconfig: {\n\t\tname?: string;\n\t\tcolumns: TColumns;\n\t\tforeignColumns: ColumnsWithTable<TForeignTableName, TColumns>;\n\t},\n): ForeignKeyBuilder {\n\tfunction mappedConfig() {\n\t\tconst { name, columns, foreignColumns } = config;\n\t\treturn {\n\t\t\tname,\n\t\t\tcolumns,\n\t\t\tforeignColumns,\n\t\t};\n\t}\n\n\treturn new ForeignKeyBuilder(mappedConfig);\n}\n","import type { ColumnType, GeneratedColumnConfig, GeneratedIdentityConfig } from '~/column-builder.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { ForeignKey, UpdateDeleteAction } from '~/pg-core/foreign-keys.ts';\nimport { ForeignKeyBuilder } from '~/pg-core/foreign-keys.ts';\nimport type { AnyPgTable, PgTable } from '~/pg-core/table.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport { iife } from '~/tracing-utils.ts';\nimport type { Update } from '~/utils.ts';\nimport type { PostgresType } from '../codecs.ts';\nimport type { PgIndexOpClass } from '../indexes.ts';\n\nexport type PgArrayDimension = 0 | 1 | 2 | 3 | 4 | 5;\ntype PgArrayDimensionString = '[]' | '[][]' | '[][][]' | '[][][][]' | '[][][][][]';\n\ntype ArrayDimensionStringToNumber<T extends PgArrayDimensionString> = T extends '[]' ? 1\n\t: T extends '[][]' ? 2\n\t: T extends '[][][]' ? 3\n\t: T extends '[][][][]' ? 4\n\t: T extends '[][][][][]' ? 5\n\t: never;\n\nexport interface PgColumnBuilderConfig {\n\tdataType: ColumnType;\n\tdata: unknown;\n\tdriverParam: unknown;\n\t// Optional - set via chain methods\n\tnotNull?: boolean;\n\thasDefault?: boolean;\n\tisPrimaryKey?: boolean;\n\tisAutoincrement?: boolean;\n\thasRuntimeDefault?: boolean;\n\tenumValues?: string[];\n\tidentity?: 'always' | 'byDefault';\n\tgenerated?: unknown;\n\tdimensions?: PgArrayDimension;\n\t$type?: unknown;\n}\n\nexport interface PgColumnBuilderRuntimeConfig<TData> {\n\tname: string;\n\tkeyAsName: boolean;\n\tnotNull: boolean;\n\tdefault: TData | SQL | undefined;\n\tdefaultFn: (() => TData | SQL) | undefined;\n\tonUpdateFn: (() => TData | SQL) | undefined;\n\thasDefault: boolean;\n\tprimaryKey: boolean;\n\tisUnique: boolean;\n\tuniqueName: string | undefined;\n\tuniqueType: string | undefined;\n\tdataType: string;\n\tcolumnType: string;\n\tgenerated: GeneratedColumnConfig<TData> | undefined;\n\tgeneratedIdentity: GeneratedIdentityConfig | undefined;\n\tdimensions?: PgArrayDimension;\n}\n\n// TODO: remove isAutoincrement and hasRuntimeDefault\nexport interface PgColumnBaseConfig<out TDataType extends ColumnType = ColumnType> {\n\tname: string;\n\tdataType: TDataType;\n\ttableName: string;\n\tnotNull: boolean;\n\thasDefault: boolean;\n\tisPrimaryKey: boolean;\n\tisAutoincrement: boolean;\n\thasRuntimeDefault: boolean;\n\tdata: unknown;\n\tdriverParam: unknown;\n\tenumValues: string[] | undefined;\n\tgenerated: unknown;\n\tidentity: undefined | 'always' | 'byDefault';\n}\n\ntype WrapArray<T, N extends number> = N extends 1 ? T[]\n\t: N extends 2 ? T[][]\n\t: N extends 3 ? T[][][]\n\t: N extends 4 ? T[][][][]\n\t: N extends 5 ? T[][][][][]\n\t: T;\n\nexport type SetNotNull<T> = T & { readonly _: { notNull: true } };\nexport type SetHasDefault<T> = T & { readonly _: { hasDefault: true } };\nexport type SetIsPrimaryKey<T> = T & { readonly _: { isPrimaryKey: true; notNull: true } };\nexport type SetHasRuntimeDefault<T> = T & {\n\treadonly _: { hasRuntimeDefault: true; hasDefault: true };\n};\nexport type Set$Type<T, TType> = T & { readonly _: { $type: TType } };\nexport type SetHasGenerated<T> = T & {\n\treadonly _: { hasDefault: true; generated: true };\n};\nexport type SetDimensions<T, TDim extends PgArrayDimension> = T & {\n\treadonly _: { dimensions: TDim };\n};\nexport type SetIdentity<T, TType extends 'always' | 'byDefault'> = T & {\n\treadonly _: { notNull: true; hasDefault: true; identity: TType };\n};\n\nexport type HasIdentity<T, TType extends 'always' | 'byDefault'> = SetIdentity<T, TType>;\n\ntype GetBaseData<T> = T extends { $type: infer U } ? U : T extends { data: infer D } ? D : unknown;\n\nexport type ResolvePgColumnConfig<\n\tout T extends PgColumnBuilderConfig,\n\tout TTableName extends string,\n\tout TData = T['dimensions'] extends 1 | 2 | 3 | 4 | 5 ? WrapArray<GetBaseData<T>, T['dimensions']>\n\t\t: GetBaseData<T>,\n> = {\n\tname: string;\n\ttableName: TTableName;\n\tdataType: T['dataType'];\n\tdata: TData;\n\tdriverParam: T['dimensions'] extends 1 | 2 | 3 | 4 | 5 ? WrapArray<T['driverParam'], T['dimensions']> | string\n\t\t: T['driverParam'];\n\tnotNull: T['notNull'] extends true ? true : false;\n\thasDefault: T['hasDefault'] extends true ? true : false;\n\tisPrimaryKey: false;\n\tisAutoincrement: false;\n\thasRuntimeDefault: false;\n\tenumValues: T extends { enumValues: infer E extends string[] } ? E : undefined;\n\tidentity: T['identity'] extends 'always' | 'byDefault' ? T['identity'] : undefined;\n\tgenerated: T['generated'] extends true ? true : undefined;\n} & {};\n\nexport interface AnyPgColumnBuilder {\n\treadonly _: PgColumnBuilderConfig;\n}\n\nexport type PgBuildColumn<\n\tTTableName extends string,\n\tTBuilder extends AnyPgColumnBuilder,\n\tTBuiltConfig extends PgColumnBaseConfig<ColumnType> = ResolvePgColumnConfig<\n\t\tTBuilder['_'],\n\t\tTTableName\n\t>,\n> = PgColumn<ColumnType, TBuiltConfig, {}>;\n\nexport type PgBuildColumns<\n\tout TTableName extends string,\n\tout TConfigMap extends Record<string, AnyPgColumnBuilder>,\n> =\n\t& {\n\t\t[Key in keyof TConfigMap]: PgBuildColumn<TTableName, TConfigMap[Key]>;\n\t}\n\t& {};\n\nexport type PgBuildExtraConfigColumns<\n\tout TConfigMap extends Record<string, AnyPgColumnBuilder>,\n> =\n\t& {\n\t\t[Key in keyof TConfigMap]: ExtraConfigColumn;\n\t}\n\t& {};\n\nexport type PgColumns = Record<string, PgColumn>;\n\nexport interface ReferenceConfig {\n\tref: () => PgColumn;\n\tconfig: {\n\t\tname?: string;\n\t\tonUpdate?: UpdateDeleteAction;\n\t\tonDelete?: UpdateDeleteAction;\n\t};\n}\n\nexport abstract class PgColumnBuilder<\n\tout T extends PgColumnBuilderConfig = PgColumnBuilderConfig,\n\tout TRuntimeConfig extends object = object,\n> {\n\tstatic readonly [entityKind]: string = 'PgColumnBuilder';\n\n\tdeclare readonly _: T;\n\n\tprivate foreignKeyConfigs: ReferenceConfig[] = [];\n\n\tprotected config: PgColumnBuilderRuntimeConfig<T['data']> & TRuntimeConfig;\n\n\tconstructor(name: string, dataType: ColumnType, columnType: string) {\n\t\tthis.config = {\n\t\t\tname,\n\t\t\tkeyAsName: name === '',\n\t\t\tnotNull: false,\n\t\t\tdefault: undefined,\n\t\t\thasDefault: false,\n\t\t\tprimaryKey: false,\n\t\t\tisUnique: false,\n\t\t\tuniqueName: undefined,\n\t\t\tuniqueType: undefined,\n\t\t\tdataType,\n\t\t\tcolumnType,\n\t\t\tgenerated: undefined,\n\t\t\tdefaultFn: undefined,\n\t\t\tonUpdateFn: undefined,\n\t\t\tgeneratedIdentity: undefined,\n\t\t} as PgColumnBuilderRuntimeConfig<T['data']> & TRuntimeConfig;\n\t}\n\n\t/**\n\t * Changes the data type of the column. Commonly used with `json` columns. Also, useful for branded types.\n\t *\n\t * @example\n\t * ```ts\n\t * const users = pgTable('users', {\n\t * \tid: integer('id').$type<UserId>().primaryKey(),\n\t * \tdetails: json('details').$type<UserDetails>().notNull(),\n\t * });\n\t * ```\n\t */\n\t$type<TType>(): Set$Type<this, TType> {\n\t\treturn this as Set$Type<this, TType>;\n\t}\n\n\t/**\n\t * Adds a `not null` clause to the column definition.\n\t *\n\t * Affects the `select` model of the table - columns *without* `not null` will be nullable on select.\n\t */\n\tnotNull(): SetNotNull<this> {\n\t\tthis.config.notNull = true;\n\t\treturn this as SetNotNull<this>;\n\t}\n\n\t/**\n\t * Adds a `default <value>` clause to the column definition.\n\t *\n\t * Affects the `insert` model of the table - columns *with* `default` are optional on insert.\n\t *\n\t * If you need to set a dynamic default value, use {@link $defaultFn} instead.\n\t */\n\tdefault(\n\t\tvalue:\n\t\t\t| (this['_'] extends { dimensions: 1 | 2 | 3 | 4 | 5 } ? WrapArray<\n\t\t\t\t\tthis['_'] extends { $type: infer U } ? U : this['_']['data'],\n\t\t\t\t\tthis['_']['dimensions']\n\t\t\t\t>\n\t\t\t\t: this['_'] extends { $type: infer U } ? U\n\t\t\t\t: this['_']['data'])\n\t\t\t| SQL,\n\t): SetHasDefault<this> {\n\t\tthis.config.default = value;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as SetHasDefault<this>;\n\t}\n\n\t/**\n\t * Adds a dynamic default value to the column.\n\t * The function will be called when the row is inserted, and the returned value will be used as the column value.\n\t *\n\t * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.\n\t */\n\t$defaultFn(\n\t\tfn: () =>\n\t\t\t| (this['_'] extends { dimensions: 1 | 2 | 3 | 4 | 5 } ? WrapArray<\n\t\t\t\t\tthis['_'] extends { $type: infer U } ? U : this['_']['data'],\n\t\t\t\t\tthis['_']['dimensions']\n\t\t\t\t>\n\t\t\t\t: this['_'] extends { $type: infer U } ? U\n\t\t\t\t: this['_']['data'])\n\t\t\t| SQL,\n\t): SetHasRuntimeDefault<this> {\n\t\tthis.config.defaultFn = fn;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as SetHasRuntimeDefault<this>;\n\t}\n\n\t/**\n\t * Alias for {@link $defaultFn}.\n\t */\n\t$default = this.$defaultFn;\n\n\t/**\n\t * Adds a dynamic update value to the column.\n\t * The function will be called when the row is updated, and the returned value will be used as the column value if none is provided.\n\t * If no `default` (or `$defaultFn`) value is provided, the function will be called when the row is inserted as well, and the returned value will be used as the column value.\n\t *\n\t * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.\n\t */\n\t$onUpdateFn(\n\t\tfn: () =>\n\t\t\t| (this['_'] extends { dimensions: 1 | 2 | 3 | 4 | 5 } ? WrapArray<\n\t\t\t\t\tthis['_'] extends { $type: infer U } ? U : this['_']['data'],\n\t\t\t\t\tthis['_']['dimensions']\n\t\t\t\t>\n\t\t\t\t: this['_'] extends { $type: infer U } ? U\n\t\t\t\t: this['_']['data'])\n\t\t\t| SQL,\n\t): SetHasDefault<this> {\n\t\tthis.config.onUpdateFn = fn;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as SetHasDefault<this>;\n\t}\n\n\t/**\n\t * Alias for {@link $onUpdateFn}.\n\t */\n\t$onUpdate = this.$onUpdateFn;\n\n\t/**\n\t * Adds a `primary key` clause to the column definition. This implicitly makes the column `not null`.\n\t *\n\t * In SQLite, `integer primary key` implicitly makes the column auto-incrementing.\n\t */\n\tprimaryKey(): SetIsPrimaryKey<this> {\n\t\tthis.config.primaryKey = true;\n\t\tthis.config.notNull = true;\n\t\treturn this as SetIsPrimaryKey<this>;\n\t}\n\n\t/** @internal Sets the name of the column to the key within the table definition if a name was not given. */\n\tsetName(name: string, casingFn: (name: string) => string) {\n\t\tif (this.config.name !== '') return;\n\t\tthis.config.name = casingFn(name);\n\t}\n\n\t/**\n\t * Makes this column a PostgreSQL array column.\n\t *\n\t * @example\n\t * ```ts\n\t * const t = pgTable('t', {\n\t * // 1D array: number[]\n\t * tags: integer().array(),\n\t * // Or explicitly: integer().array('[]')\n\t * // 2D array: number[][]\n\t * matrix: integer().array('[][]'),\n\t * });\n\t * ```\n\t */\n\tarray(): SetDimensions<this, 1>;\n\tarray<TDim extends PgArrayDimensionString>(\n\t\tdimensions: TDim,\n\t): SetDimensions<this, ArrayDimensionStringToNumber<TDim>>;\n\tarray<TDim extends PgArrayDimensionString>(\n\t\tdimensions?: TDim,\n\t): SetDimensions<this, ArrayDimensionStringToNumber<TDim>> {\n\t\t// Calculate dimensions as number from string notation\n\t\tconst dim = dimensions ?? '[]';\n\t\t(this.config as any).dimensions = (dim.length / 2) as PgArrayDimension;\n\t\treturn this as SetDimensions<this, ArrayDimensionStringToNumber<TDim>>;\n\t}\n\n\treferences(\n\t\tref: ReferenceConfig['ref'],\n\t\tconfig: ReferenceConfig['config'] = {},\n\t): this {\n\t\tthis.foreignKeyConfigs.push({ ref, config });\n\t\treturn this;\n\t}\n\n\tunique(\n\t\tname?: string,\n\t\tconfig?: { nulls: 'distinct' | 'not distinct' },\n\t): this {\n\t\tthis.config.isUnique = true;\n\t\tthis.config.uniqueName = name;\n\t\tthis.config.uniqueType = config?.nulls;\n\t\treturn this;\n\t}\n\n\tgeneratedAlwaysAs(\n\t\tas:\n\t\t\t| SQL\n\t\t\t| (() => SQL),\n\t): SetHasGenerated<this> {\n\t\tthis.config.generated = {\n\t\t\tas,\n\t\t\ttype: 'always',\n\t\t\tmode: 'stored',\n\t\t};\n\t\treturn this as SetHasGenerated<this>;\n\t}\n\n\t/** @internal */\n\tbuildForeignKeys(column: PgColumn, table: PgTable): ForeignKey[] {\n\t\treturn this.foreignKeyConfigs.map(({ ref, config }) => {\n\t\t\treturn iife(\n\t\t\t\t(ref, config) => {\n\t\t\t\t\tconst builder = new ForeignKeyBuilder(() => {\n\t\t\t\t\t\tconst foreignColumn = ref();\n\t\t\t\t\t\treturn { name: config.name, columns: [column], foreignColumns: [foreignColumn] };\n\t\t\t\t\t});\n\t\t\t\t\tif (config.onUpdate) {\n\t\t\t\t\t\tbuilder.onUpdate(config.onUpdate);\n\t\t\t\t\t}\n\t\t\t\t\tif (config.onDelete) {\n\t\t\t\t\t\tbuilder.onDelete(config.onDelete);\n\t\t\t\t\t}\n\t\t\t\t\treturn builder.build(table);\n\t\t\t\t},\n\t\t\t\tref,\n\t\t\t\tconfig,\n\t\t\t);\n\t\t});\n\t}\n\n\t/** @internal */\n\tabstract build(table: PgTable): PgColumn<any>;\n\n\t/** @internal */\n\tbuildExtraConfigColumn<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): ExtraConfigColumn {\n\t\treturn new ExtraConfigColumn(table, { ...this.config, dimensions: (this.config as any).dimensions ?? 0 });\n\t}\n}\n\n// TODO: we should potenitally do column to be\n// in charge of map value/array of values/json value and json array of values in 1 place\nexport abstract class PgColumn<\n\tout TColumnType extends ColumnType = any,\n\tout T extends PgColumnBaseConfig<TColumnType> = PgColumnBaseConfig<TColumnType>,\n\tout TRuntimeConfig extends object = {},\n> extends Column<T, TRuntimeConfig> {\n\tstatic override readonly [entityKind]: string = 'PgColumn';\n\n\t/** @internal */\n\tabstract override readonly codec?: PostgresType;\n\n\t/** @internal */\n\toverride readonly table: PgTable;\n\n\treadonly dimensions: PgArrayDimension;\n\n\tconstructor(\n\t\ttable: PgTable,\n\t\tconfig: PgColumnBuilderRuntimeConfig<T['data']> & TRuntimeConfig,\n\t) {\n\t\tsuper(table, config);\n\t\tthis.table = table;\n\t\tthis.dimensions = config.dimensions ?? 0;\n\t}\n\n\t/** @internal */\n\toverride postBuild() {\n\t\tif (this.dimensions) {\n\t\t\tconst originalFromDriver = this.mapFromDriverValue.bind(this);\n\t\t\tconst originalToDriver = this.mapToDriverValue.bind(this);\n\n\t\t\tthis.mapFromDriverValue = this.mapFromDriverValue.isNoop\n\t\t\t\t? this.mapFromDriverValue\n\t\t\t\t: (value: unknown): unknown => {\n\t\t\t\t\treturn this.mapArrayElements(value, originalFromDriver, this.dimensions);\n\t\t\t\t};\n\n\t\t\tthis.mapToDriverValue = this.mapToDriverValue.isNoop\n\t\t\t\t? this.mapToDriverValue\n\t\t\t\t: (value: unknown): unknown => {\n\t\t\t\t\treturn this.mapArrayElements(value as unknown[], originalToDriver, this.dimensions);\n\t\t\t\t};\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tprivate mapArrayElements(value: unknown, mapper: (v: unknown) => unknown, depth: number): unknown {\n\t\tif (depth > 0 && Array.isArray(value)) {\n\t\t\treturn value.map((v) => v === null ? null : this.mapArrayElements(v, mapper, depth - 1));\n\t\t}\n\t\treturn mapper(value);\n\t}\n}\n\nexport type IndexedExtraConfigType = { order?: 'asc' | 'desc'; nulls?: 'first' | 'last'; opClass?: string };\n\nexport class ExtraConfigColumn<\n\tout T extends PgColumnBaseConfig<ColumnType> = PgColumnBaseConfig<ColumnType>,\n> extends PgColumn<ColumnType, T, IndexedExtraConfigType> {\n\tstatic override readonly [entityKind]: string = 'ExtraConfigColumn';\n\n\t/** @itnernal */\n\toverride readonly codec = undefined;\n\n\toverride getSQLType(): string {\n\t\treturn this.getSQLType();\n\t}\n\n\tindexConfig: IndexedExtraConfigType = {\n\t\torder: this.config.order ?? 'asc',\n\t\tnulls: this.config.nulls ?? 'last',\n\t\topClass: this.config.opClass,\n\t};\n\tdefaultConfig: IndexedExtraConfigType = {\n\t\torder: 'asc',\n\t\tnulls: 'last',\n\t\topClass: undefined,\n\t};\n\n\tasc(): Omit<this, 'asc' | 'desc'> {\n\t\tthis.indexConfig.order = 'asc';\n\t\treturn this;\n\t}\n\n\tdesc(): Omit<this, 'asc' | 'desc'> {\n\t\tthis.indexConfig.order = 'desc';\n\t\treturn this;\n\t}\n\n\tnullsFirst(): Omit<this, 'nullsFirst' | 'nullsLast'> {\n\t\tthis.indexConfig.nulls = 'first';\n\t\treturn this;\n\t}\n\n\tnullsLast(): Omit<this, 'nullsFirst' | 'nullsLast'> {\n\t\tthis.indexConfig.nulls = 'last';\n\t\treturn this;\n\t}\n\n\t/**\n\t * ### PostgreSQL documentation quote\n\t *\n\t * > An operator class with optional parameters can be specified for each column of an index.\n\t * The operator class identifies the operators to be used by the index for that column.\n\t * For example, a B-tree index on four-byte integers would use the int4_ops class;\n\t * this operator class includes comparison functions for four-byte integers.\n\t * In practice the default operator class for the column's data type is usually sufficient.\n\t * The main point of having operator classes is that for some data types, there could be more than one meaningful ordering.\n\t * For example, we might want to sort a complex-number data type either by absolute value or by real part.\n\t * We could do this by defining two operator classes for the data type and then selecting the proper class when creating an index.\n\t * More information about operator classes check:\n\t *\n\t * ### Useful links\n\t * https://www.postgresql.org/docs/current/sql-createindex.html\n\t *\n\t * https://www.postgresql.org/docs/current/indexes-opclass.html\n\t *\n\t * https://www.postgresql.org/docs/current/xindex.html\n\t *\n\t * ### Additional types\n\t * If you have the `pg_vector` extension installed in your database, you can use the\n\t * `vector_l2_ops`, `vector_ip_ops`, `vector_cosine_ops`, `vector_l1_ops`, `bit_hamming_ops`, `bit_jaccard_ops`, `halfvec_l2_ops`, `sparsevec_l2_ops` options, which are predefined types.\n\t *\n\t * **You can always specify any string you want in the operator class, in case Drizzle doesn't have it natively in its types**\n\t *\n\t * @param opClass\n\t * @returns\n\t */\n\top(opClass: PgIndexOpClass): Omit<this, 'op'> {\n\t\tthis.indexConfig.opClass = opClass;\n\t\treturn this;\n\t}\n}\n\nexport class IndexedColumn {\n\tstatic readonly [entityKind]: string = 'IndexedColumn';\n\tconstructor(\n\t\tname: string,\n\t\tkeyAsName: boolean,\n\t\ttype: string,\n\t\tindexConfig: IndexedExtraConfigType,\n\t) {\n\t\tthis.name = name;\n\t\tthis.keyAsName = keyAsName;\n\t\tthis.type = type;\n\t\tthis.indexConfig = indexConfig;\n\t}\n\n\tname: string;\n\tkeyAsName: boolean;\n\ttype: string;\n\tindexConfig: IndexedExtraConfigType;\n}\n\nexport type AnyPgColumn<\n\tTPartial extends Partial<PgColumnBaseConfig<ColumnType>> = {},\n> = PgColumn<\n\tany,\n\tRequired<Update<PgColumnBaseConfig<ColumnType>, TPartial>>\n>;\n","import type { GeneratedIdentityConfig } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { PgSequenceOptions } from '../sequence.ts';\nimport type { HasIdentity, PgColumnBuilderConfig } from './common.ts';\nimport { PgColumnBuilder } from './common.ts';\n\nexport abstract class PgIntColumnBuilder<\n\tout T extends PgColumnBuilderConfig = PgColumnBuilderConfig,\n\tout TRuntimeConfig extends object = object,\n> extends PgColumnBuilder<T, TRuntimeConfig> {\n\tstatic override readonly [entityKind]: string = 'PgIntColumnBaseBuilder';\n\n\t/**\n\t * Adds an `ALWAYS AS IDENTITY` clause to the column definition.\n\t * Available for integer column types.\n\t */\n\tgeneratedAlwaysAsIdentity(\n\t\tsequence?: PgSequenceOptions & { name?: string },\n\t): HasIdentity<this, 'always'> {\n\t\tif (sequence) {\n\t\t\tconst { name, ...options } = sequence;\n\t\t\t(this.config as any).generatedIdentity = {\n\t\t\t\ttype: 'always',\n\t\t\t\tsequenceName: name,\n\t\t\t\tsequenceOptions: options,\n\t\t\t} satisfies GeneratedIdentityConfig;\n\t\t} else {\n\t\t\t(this.config as any).generatedIdentity = {\n\t\t\t\ttype: 'always',\n\t\t\t} satisfies GeneratedIdentityConfig;\n\t\t}\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.notNull = true;\n\t\treturn this as HasIdentity<this, 'always'>;\n\t}\n\n\t/**\n\t * Adds a `BY DEFAULT AS IDENTITY` clause to the column definition.\n\t * Available for integer column types.\n\t */\n\tgeneratedByDefaultAsIdentity(\n\t\tsequence?: PgSequenceOptions & { name?: string },\n\t): HasIdentity<this, 'byDefault'> {\n\t\tif (sequence) {\n\t\t\tconst { name, ...options } = sequence;\n\t\t\t(this.config as any).generatedIdentity = {\n\t\t\t\ttype: 'byDefault',\n\t\t\t\tsequenceName: name,\n\t\t\t\tsequenceOptions: options,\n\t\t\t} satisfies GeneratedIdentityConfig;\n\t\t} else {\n\t\t\t(this.config as any).generatedIdentity = {\n\t\t\t\ttype: 'byDefault',\n\t\t\t} satisfies GeneratedIdentityConfig;\n\t\t}\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.notNull = true;\n\t\treturn this as HasIdentity<this, 'byDefault'>;\n\t}\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn } from './common.ts';\nimport { PgIntColumnBuilder } from './int.common.ts';\n\nexport class PgBigInt53Builder extends PgIntColumnBuilder<{\n\tdataType: 'number int53';\n\tdata: number;\n\tdriverParam: number | string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgBigInt53Builder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'number int53', 'PgBigInt53');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgBigInt53(table, this.config as any);\n\t}\n}\n\nexport class PgBigInt53 extends PgColumn<'number int53'> {\n\tstatic override readonly [entityKind]: string = 'PgBigInt53';\n\n\t/** @internal */\n\toverride readonly codec = 'bigint:number';\n\n\tgetSQLType(): string {\n\t\treturn 'bigint';\n\t}\n}\n\nexport class PgBigInt64Builder extends PgIntColumnBuilder<{\n\tdataType: 'bigint int64';\n\tdata: bigint;\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgBigInt64Builder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'bigint int64', 'PgBigInt64');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgBigInt64(table, this.config as any);\n\t}\n}\n\nexport class PgBigInt64 extends PgColumn<'bigint int64'> {\n\tstatic override readonly [entityKind]: string = 'PgBigInt64';\n\n\t/** @internal */\n\toverride readonly codec = 'bigint';\n\n\tgetSQLType(): string {\n\t\treturn 'bigint';\n\t}\n}\n\nexport class PgBigIntStringBuilder extends PgIntColumnBuilder<{\n\tdataType: 'string int64';\n\tdata: string;\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgBigIntStringBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'string int64', 'PgBigIntString');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgBigIntString(table, this.config as any);\n\t}\n}\n\nexport class PgBigIntString extends PgColumn<'string int64'> {\n\tstatic override readonly [entityKind]: string = 'PgBigIntString';\n\n\t/** @internal */\n\toverride readonly codec = 'bigint:string';\n\n\tgetSQLType(): string {\n\t\treturn 'bigint';\n\t}\n}\n\nexport interface PgBigIntConfig<T extends 'number' | 'bigint' | 'string' = 'number' | 'bigint' | 'string'> {\n\tmode: T;\n}\n\nexport function bigint<TMode extends PgBigIntConfig['mode']>(\n\tconfig: PgBigIntConfig<TMode>,\n): TMode extends 'string' ? PgBigIntStringBuilder : TMode extends 'bigint' ? PgBigInt64Builder : PgBigInt53Builder;\nexport function bigint<TMode extends PgBigIntConfig['mode']>(\n\tname: string,\n\tconfig: PgBigIntConfig<TMode>,\n): TMode extends 'string' ? PgBigIntStringBuilder : TMode extends 'bigint' ? PgBigInt64Builder : PgBigInt53Builder;\nexport function bigint(a: string | PgBigIntConfig, b?: PgBigIntConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgBigIntConfig>(a, b);\n\tif (config.mode === 'number') {\n\t\treturn new PgBigInt53Builder(name);\n\t}\n\tif (config.mode === 'string') {\n\t\treturn new PgBigIntStringBuilder(name);\n\t}\n\treturn new PgBigInt64Builder(name);\n}\n","import { entityKind } from '~/entity.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport type { PgTable } from '../table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgBigSerial53Builder extends PgColumnBuilder<{\n\tdataType: 'number int53';\n\tdata: number;\n\tdriverParam: number;\n\tnotNull: true;\n\thasDefault: true;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgBigSerial53Builder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'number int53', 'PgBigSerial53');\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.notNull = true;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgBigSerial53(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgBigSerial53 extends PgColumn<'number int53'> {\n\tstatic override readonly [entityKind]: string = 'PgBigSerial53';\n\n\t/** @internal */\n\toverride readonly codec = 'bigserial:number';\n\n\tgetSQLType(): string {\n\t\treturn 'bigserial';\n\t}\n}\n\nexport class PgBigSerial64Builder extends PgColumnBuilder<{\n\tdataType: 'bigint int64';\n\tdata: bigint;\n\tdriverParam: string;\n\tnotNull: true;\n\thasDefault: true;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgBigSerial64Builder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'bigint int64', 'PgBigSerial64');\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.notNull = true;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgBigSerial64(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgBigSerial64 extends PgColumn<'bigint int64'> {\n\tstatic override readonly [entityKind]: string = 'PgBigSerial64';\n\n\t/** @internal */\n\toverride readonly codec = 'bigserial';\n\n\tgetSQLType(): string {\n\t\treturn 'bigserial';\n\t}\n}\n\nexport interface PgBigSerialConfig<T extends 'number' | 'bigint' = 'number' | 'bigint'> {\n\tmode: T;\n}\n\nexport function bigserial<TMode extends PgBigSerialConfig['mode']>(\n\tconfig: PgBigSerialConfig<TMode>,\n): TMode extends 'number' ? PgBigSerial53Builder : PgBigSerial64Builder;\nexport function bigserial<TMode extends PgBigSerialConfig['mode']>(\n\tname: string,\n\tconfig: PgBigSerialConfig<TMode>,\n): TMode extends 'number' ? PgBigSerial53Builder : PgBigSerial64Builder;\nexport function bigserial(a: string | PgBigSerialConfig, b?: PgBigSerialConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgBigSerialConfig>(a, b);\n\tif (config.mode === 'number') {\n\t\treturn new PgBigSerial53Builder(name);\n\t}\n\treturn new PgBigSerial64Builder(name);\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgBooleanBuilder extends PgColumnBuilder<{\n\tdataType: 'boolean';\n\tdata: boolean;\n\tdriverParam: boolean;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgBooleanBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'boolean', 'PgBoolean');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgBoolean(table, this.config as any);\n\t}\n}\n\nexport class PgBoolean extends PgColumn<'boolean'> {\n\tstatic override readonly [entityKind]: string = 'PgBoolean';\n\n\t/** @internal */\n\toverride readonly codec = 'bool';\n\n\tgetSQLType(): string {\n\t\treturn 'boolean';\n\t}\n}\n\nexport function boolean(name?: string): PgBooleanBuilder {\n\treturn new PgBooleanBuilder(name ?? '');\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { type Equal, getColumnNameAndConfig, type Writable } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\ntype PgCharBuilderConfig<TEnum extends [string, ...string[]]> = Equal<TEnum, [string, ...string[]]> extends true\n\t? { dataType: 'string'; data: string; driverParam: string }\n\t: { dataType: 'string enum'; data: TEnum[number]; enumValues: TEnum; driverParam: string };\n\nexport class PgCharBuilder<TEnum extends [string, ...string[]] = [string, ...string[]]> extends PgColumnBuilder<\n\tPgCharBuilderConfig<TEnum>,\n\t{ enumValues: TEnum; length: number; setLength: boolean }\n> {\n\tstatic override readonly [entityKind]: string = 'PgCharBuilder';\n\n\tconstructor(name: string, config: PgCharConfig<TEnum>) {\n\t\tsuper(name, config.enum?.length ? 'string enum' : 'string', 'PgChar');\n\t\tthis.config.length = config.length ?? 1;\n\t\tthis.config.setLength = config.length !== undefined;\n\t\tthis.config.enumValues = config.enum as TEnum;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgChar(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgChar<TEnum extends [string, ...string[]] = [string, ...string[]]>\n\textends PgColumn<Equal<TEnum, [string, ...string[]]> extends true ? 'string' : 'string enum'>\n{\n\tstatic override readonly [entityKind]: string = 'PgChar';\n\n\t/** @internal */\n\toverride readonly codec = 'char';\n\n\toverride readonly enumValues: TEnum;\n\tprivate readonly setLength: boolean;\n\n\tconstructor(table: PgTable<any>, config: PgCharBuilder<TEnum>['config']) {\n\t\tsuper(table, config as any);\n\t\tthis.enumValues = config.enumValues;\n\t\tthis.setLength = config.setLength;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.setLength ? `char(${this.length})` : `char`;\n\t}\n}\n\nexport interface PgCharConfig<\n\tTEnum extends readonly string[] | string[] | undefined = readonly string[] | string[] | undefined,\n> {\n\tenum?: TEnum;\n\tlength?: number;\n}\n\nexport function char(): PgCharBuilder;\nexport function char(name: string): PgCharBuilder;\nexport function char(config: { length?: number }): PgCharBuilder;\nexport function char(name: string, config: { length?: number }): PgCharBuilder;\nexport function char<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tconfig: PgCharConfig<T | Writable<T>> & { enum: T | Writable<T> },\n): PgCharBuilder<Writable<T>>;\nexport function char<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tname: string,\n\tconfig: PgCharConfig<T | Writable<T>> & { enum: T | Writable<T> },\n): PgCharBuilder<Writable<T>>;\nexport function char(a?: string | PgCharConfig, b: PgCharConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<PgCharConfig>(a, b);\n\treturn new PgCharBuilder(name, config as any);\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '../table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgCidrBuilder extends PgColumnBuilder<{\n\tdataType: 'string cidr';\n\tdata: string;\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgCidrBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'string cidr', 'PgCidr');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgCidr(table, this.config as any);\n\t}\n}\n\nexport class PgCidr extends PgColumn<'string cidr'> {\n\tstatic override readonly [entityKind]: string = 'PgCidr';\n\n\t/** @internal */\n\toverride readonly codec = 'cidr';\n\n\tgetSQLType(): string {\n\t\treturn 'cidr';\n\t}\n}\n\nexport function cidr(name?: string): PgCidrBuilder {\n\treturn new PgCidrBuilder(name ?? '');\n}\n","function parsePgArrayValue(arrayString: string, startFrom: number, inQuotes: boolean): [string, number] {\n\tfor (let i = startFrom; i < arrayString.length; i++) {\n\t\tconst char = arrayString[i];\n\n\t\tif (char === '\\\\') {\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"') {\n\t\t\treturn [arrayString.slice(startFrom, i).replace(/\\\\/g, ''), i + 1];\n\t\t}\n\n\t\tif (inQuotes) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === ',' || char === '}') {\n\t\t\treturn [arrayString.slice(startFrom, i).replace(/\\\\/g, ''), i];\n\t\t}\n\t}\n\n\treturn [arrayString.slice(startFrom).replace(/\\\\/g, ''), arrayString.length];\n}\n\nexport function parsePgNestedArray(arrayString: string, startFrom = 0): [any[], number] {\n\tconst result: any[] = [];\n\tlet i = startFrom;\n\tlet lastCharIsComma = false;\n\n\twhile (i < arrayString.length) {\n\t\tconst char = arrayString[i];\n\n\t\tif (char === ',') {\n\t\t\tif (lastCharIsComma || i === startFrom) {\n\t\t\t\tresult.push('');\n\t\t\t}\n\t\t\tlastCharIsComma = true;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tlastCharIsComma = false;\n\n\t\tif (char === '\\\\') {\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"') {\n\t\t\tconst [value, startFrom] = parsePgArrayValue(arrayString, i + 1, true);\n\t\t\tresult.push(value);\n\t\t\ti = startFrom;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '}') {\n\t\t\treturn [result, i + 1];\n\t\t}\n\n\t\tif (char === '{') {\n\t\t\tconst [value, startFrom] = parsePgNestedArray(arrayString, i + 1);\n\t\t\tresult.push(value);\n\t\t\ti = startFrom;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst [value, newStartFrom] = parsePgArrayValue(arrayString, i, false);\n\t\tresult.push(value);\n\t\ti = newStartFrom;\n\t}\n\n\treturn [result, i];\n}\n\nexport function parsePgArray(arrayString: string): any[] {\n\tconst [result] = parsePgNestedArray(arrayString, 1);\n\treturn result;\n}\n\nexport function makePgArray(array: any[]): string {\n\treturn `{${\n\t\tarray.map((item) => {\n\t\t\tif (Array.isArray(item)) {\n\t\t\t\treturn makePgArray(item);\n\t\t\t}\n\n\t\t\tif (typeof item === 'string') {\n\t\t\t\treturn `\"${item.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n\t\t\t}\n\n\t\t\treturn `${item}`;\n\t\t}).join(',')\n\t}}`;\n}\n","function hexToBytes(hex: string): Uint8Array {\n\tconst bytes: number[] = [];\n\tfor (let c = 0; c < hex.length; c += 2) {\n\t\tbytes.push(Number.parseInt(hex.slice(c, c + 2), 16));\n\t}\n\treturn new Uint8Array(bytes);\n}\n\nfunction bytesToFloat64(bytes: Uint8Array, offset: number): number {\n\tconst buffer = new ArrayBuffer(8);\n\tconst view = new DataView(buffer);\n\tfor (let i = 0; i < 8; i++) {\n\t\tview.setUint8(i, bytes[offset + i]!);\n\t}\n\treturn view.getFloat64(0, true);\n}\n\nexport function parseEWKB(hex: string): { srid: number | undefined; point: [number, number] } {\n\tconst bytes = hexToBytes(hex);\n\n\tlet offset = 0;\n\n\t// Byte order: 1 is little-endian, 0 is big-endian\n\tconst byteOrder = bytes[offset];\n\toffset += 1;\n\n\tconst view = new DataView(bytes.buffer);\n\tconst geomType = view.getUint32(offset, byteOrder === 1);\n\toffset += 4;\n\n\tlet srid: number | undefined;\n\tif (geomType & 0x20000000) { // SRID flag\n\t\tsrid = view.getUint32(offset, byteOrder === 1);\n\t\toffset += 4;\n\t}\n\n\tif ((geomType & 0xFFFF) === 1) {\n\t\tconst x = bytesToFloat64(bytes, offset);\n\t\toffset += 8;\n\t\tconst y = bytesToFloat64(bytes, offset);\n\t\toffset += 8;\n\n\t\treturn { srid, point: [x, y] };\n\t}\n\n\tthrow new Error('Unsupported geometry type');\n}\n","import {\n\ttype CastArrayCodec,\n\ttype CastCodec,\n\ttype Codecs,\n\ttype NormalizeArrayCodec,\n\ttype NormalizeCodec,\n\trefineCodecs,\n} from '~/codecs.ts';\nimport { type Name, sql, type SQLChunk } from '~/sql/sql.ts';\nimport type { PartialWithUndefined } from '~/utils.ts';\nimport { makePgArray, parsePgArray } from './array.ts';\nimport { parseEWKB } from './columns/postgis_extension/utils.ts';\n\nexport type PostGISType =\n\t| 'geometry(point)'\n\t| 'geometry(pointz)'\n\t| 'geometry(pointm)'\n\t| 'geometry(pointzm)'\n\t| 'geometry(linestring)'\n\t| 'geometry(linestringz)'\n\t| 'geometry(linestringm)'\n\t| 'geometry(linestringzm)'\n\t| 'geometry(polygon)'\n\t| 'geometry(polygonz)'\n\t| 'geometry(polygonm)'\n\t| 'geometry(polygonzm)'\n\t| 'geometry(multipoint)'\n\t| 'geometry(multipointz)'\n\t| 'geometry(multipointm)'\n\t| 'geometry(multipointzm)'\n\t| 'geometry(multilinestring)'\n\t| 'geometry(multilinestringz)'\n\t| 'geometry(multilinestringm)'\n\t| 'geometry(multilinestringzm)'\n\t| 'geometry(multipolygon)'\n\t| 'geometry(multipolygonz)'\n\t| 'geometry(multipolygonm)'\n\t| 'geometry(multipolygonzm)'\n\t| 'geometry(geometrycollection)'\n\t| 'geometry(geometrycollectionz)'\n\t| 'geometry(geometrycollectionm)'\n\t| 'geometry(geometrycollectionzm)'\n\t| 'geometry(circularstring)'\n\t| 'geometry(circularstringz)'\n\t| 'geometry(circularstringm)'\n\t| 'geometry(circularstringzm)'\n\t| 'geometry(compoundcurve)'\n\t| 'geometry(compoundcurvez)'\n\t| 'geometry(compoundcurvem)'\n\t| 'geometry(compoundcurvezm)'\n\t| 'geometry(curvepolygon)'\n\t| 'geometry(curvepolygonz)'\n\t| 'geometry(curvepolygonm)'\n\t| 'geometry(curvepolygonzm)'\n\t| 'geometry(multicurve)'\n\t| 'geometry(multicurvez)'\n\t| 'geometry(multicurvem)'\n\t| 'geometry(multicurvezm)'\n\t| 'geometry(multisurface)'\n\t| 'geometry(multisurfacez)'\n\t| 'geometry(multisurfacem)'\n\t| 'geometry(multisurfacezm)'\n\t| 'geometry(polyhedralsurface)'\n\t| 'geometry(polyhedralsurfacez)'\n\t| 'geometry(polyhedralsurfacem)'\n\t| 'geometry(polyhedralsurfacezm)'\n\t| 'geometry(tin)'\n\t| 'geometry(tinz)'\n\t| 'geometry(tinm)'\n\t| 'geometry(tinzm)'\n\t| 'geometry(triangle)'\n\t| 'geometry(trianglez)'\n\t| 'geometry(trianglem)'\n\t| 'geometry(trianglezm)'\n\t| 'geography(point)'\n\t| 'geography(linestring)'\n\t| 'geography(polygon)'\n\t| 'geography(multipoint)'\n\t| 'geography(multilinestring)'\n\t| 'geography(multipolygon)'\n\t| 'geography(geometrycollection)'\n\t| 'box2d'\n\t| 'box3d'\n\t| 'raster';\n\nexport type PostgresType =\n\t// Numeric\n\t| 'smallint'\n\t| 'int'\n\t| 'bigint'\n\t| 'bigint:number'\n\t| 'bigint:string'\n\t| 'numeric'\n\t| 'numeric:number'\n\t| 'numeric:bigint'\n\t| 'float4'\n\t| 'float8'\n\t| 'money'\n\t| 'smallserial'\n\t| 'serial'\n\t| 'bigserial'\n\t| 'bigserial:number'\n\t// Text\n\t| 'char'\n\t| 'varchar'\n\t| 'text'\n\t// Binary\n\t| 'bytea'\n\t// Datetime\n\t| 'date'\n\t| 'date:string'\n\t| 'time'\n\t| 'timetz'\n\t| 'timestamp'\n\t| 'timestamptz'\n\t| 'timestamp:string'\n\t| 'timestamptz:string'\n\t| 'interval'\n\t| 'interval:tuple'\n\t// Boolean\n\t| 'bool'\n\t// Enumerated\n\t| 'enum'\n\t// Geometric\n\t| 'point'\n\t| 'point:tuple'\n\t| 'line'\n\t| 'line:tuple'\n\t| 'lseg'\n\t| 'box'\n\t| 'path'\n\t| 'polygon'\n\t| 'circle'\n\t// Network Address\n\t| 'cidr'\n\t| 'inet'\n\t| 'macaddr'\n\t| 'macaddr8'\n\t// Bit String\n\t| 'bit'\n\t| 'varbit'\n\t// Full-Text Search\n\t| 'tsvector'\n\t| 'tsquery'\n\t// UUID\n\t| 'uuid'\n\t// XML\n\t| 'xml'\n\t// JSON\n\t| 'json'\n\t| 'jsonb'\n\t// Range\n\t| 'int4range'\n\t| 'int8range'\n\t| 'numrange'\n\t| 'tsrange'\n\t| 'tstzrange'\n\t| 'daterange'\n\t// Multirange\n\t| 'int4multirange'\n\t| 'int8multirange'\n\t| 'nummultirange'\n\t| 'tsmultirange'\n\t| 'tstzmultirange'\n\t| 'datemultirange'\n\t// Object Identifier / System Reference\n\t| 'oid'\n\t| 'regproc'\n\t| 'regprocedure'\n\t| 'regoper'\n\t| 'regoperator'\n\t| 'regclass'\n\t| 'regtype'\n\t| 'regrole'\n\t| 'regnamespace'\n\t| 'regconfig'\n\t| 'regdictionary'\n\t// PostGIS\n\t| PostGISType\n\t| `${PostGISType}:tuple`\n\t// pgvector\n\t| 'halfvec'\n\t| 'sparsevec'\n\t| 'vector';\n\n// Some originals were swapped with aliases for simpler keys\nexport type PostgresAliasType =\n\t// Numeric\n\t| 'int2' // smallint\n\t| 'integer' // int\n\t| 'int4' // int\n\t| 'int8' // bigint\n\t| 'decimal' // numeric\n\t| 'real' // float4\n\t| 'double' // float8\n\t| 'double precision' // float8\n\t| 'serial2' // smallserial\n\t| 'serial4' // serial\n\t| 'serial8' // bigserial\n\t// Text\n\t| 'character' // char\n\t| 'character varying' // varchar\n\t// Datetime\n\t| 'time with time zone' // timetz\n\t| 'time without time zone' // timetz\n\t| 'timestamp with time zone' // timestamptz\n\t| 'timestamp without time zone' // timestamptz\n\t// Boolean\n\t| 'boolean' // bool\n\t// Bit String\n\t| 'bit varying'; // varbit;\n\nexport type PostgresColumnType =\n\t| PostgresType\n\t| PostgresAliasType;\n\nconst PG_ALIAS_TO_TYPE_MAP: Record<PostgresAliasType, PostgresType> = {\n\tint2: 'smallint',\n\tinteger: 'int',\n\tint4: 'int',\n\tint8: 'bigint',\n\tdecimal: 'numeric',\n\treal: 'float4',\n\tdouble: 'float8',\n\t'double precision': 'float8',\n\tserial2: 'smallserial',\n\tserial4: 'serial',\n\tserial8: 'bigserial',\n\tcharacter: 'char',\n\t'character varying': 'varchar',\n\t'time with time zone': 'timetz',\n\t'time without time zone': 'time',\n\t'timestamp with time zone': 'timestamptz',\n\t'timestamp without time zone': 'timestamp',\n\tboolean: 'bool',\n\t'bit varying': 'varbit',\n};\n\nexport function resolvePgTypeAlias(type: string) {\n\treturn (PG_ALIAS_TO_TYPE_MAP as Record<string, PostgresType | undefined>)[type] ?? type;\n}\n\nexport type PgCodecs = Codecs<PostgresType>;\n\nexport const castToText: CastCodec = (name) => sql`${name}::text`;\nexport const castToTextArr: CastArrayCodec = (name, arrayDimensions) =>\n\tsql`${name}::text${sql.raw('[]'.repeat(arrayDimensions))}`;\n\n/** Used for cases when casting requires to unwrap and rebuild arrays\n *\n * @example\n * string_mtx::text[][] // can be casted to array directly\n *\n * encode(bytea_mtx, 'base64')[][] // invalid syntax, cast requires unwrapping and rebuilding array\n */\nexport const arrayCompatCast = (cast: CastCodec) =>\n(\n\tname: SQLChunk,\n\tarrayDimensions: number | undefined,\n): SQLChunk => {\n\tif (!arrayDimensions) return cast(name);\n\n\tconst aliases: Name[] = [];\n\tfor (let i = 0; i < arrayDimensions; i++) {\n\t\taliases.push(sql.identifier(`s${i}`));\n\t}\n\n\tlet indexed = name;\n\tfor (const alias of aliases) {\n\t\tindexed = sql`${indexed}[${alias}]`;\n\t}\n\n\tlet expression = sql`array(\\\nselect ${cast(indexed)} \\\nfrom generate_subscripts(${name}, ${sql.raw(arrayDimensions.toString())}) ${aliases[arrayDimensions - 1]} \\\norder by ${aliases[arrayDimensions - 1]})`;\n\n\tfor (let dim = arrayDimensions - 1; dim > 0; dim--) {\n\t\texpression = sql`array(\\\nselect ${expression} \\\nfrom generate_subscripts(${name}, ${sql.raw(dim.toString())}) ${aliases[dim - 1]} \\\norder by ${aliases[dim - 1]})`;\n\t}\n\n\t// Otherwise null returns as []\n\treturn sql`case when ${name} is null then null else ${expression} end`;\n};\n\n/** Used to recursively apply value normalizer to array of unknown dimensions */\nexport const arrayCompatNormalize = (normalize: NormalizeCodec) => {\n\tconst loop: NormalizeArrayCodec = (value, arrayDimensions) => {\n\t\tconst innerDimensions = arrayDimensions - 1;\n\t\tif (arrayDimensions > 1) {\n\t\t\tfor (let i = 0; i < (value as unknown[][]).length; ++i) {\n\t\t\t\tloop((value as unknown[][])[i]!, innerDimensions);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (let i = 0; i < (value as unknown[][]).length; ++i) {\n\t\t\t\tvalue[i] = normalize((value as unknown[][])[i]!);\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t};\n\n\treturn loop;\n};\n\n/** Doesn't mutate original data - used for insertions */\nexport const arrayCompatNormalizeInput = (normalize: NormalizeCodec, transformToPgArray = false) => {\n\tconst loop: NormalizeArrayCodec = (value, arrayDimensions): any => {\n\t\tconst innerDimensions = arrayDimensions - 1;\n\t\tconst out = Array.from({ length: value.length });\n\t\tif (arrayDimensions > 1) {\n\t\t\tfor (let i = 0; i < (value as unknown[][]).length; ++i) {\n\t\t\t\tout[i] = loop((value as unknown[][])[i]!, innerDimensions);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (let i = 0; i < (value as unknown[][]).length; ++i) {\n\t\t\t\tout[i] = normalize((value as unknown[][])[i]!);\n\t\t\t}\n\t\t}\n\n\t\treturn out;\n\t};\n\n\treturn transformToPgArray ? (v: any, d: number) => makePgArray(loop(v, d)) : loop;\n};\n\n/** Parses a raw PG array text representation, then applies a per-item normalizer */\nexport const parsePgArrayAndNormalize = (normalize: NormalizeCodec): NormalizeArrayCodec => {\n\tconst codec = arrayCompatNormalize(normalize);\n\treturn (value, arrayDimensions) => codec(parsePgArray(value), arrayDimensions);\n};\n\nexport const parseLineTuple = (v: string): [number, number, number] => {\n\tconst [a, b, c] = v.slice(1, -1).split(',');\n\treturn [Number.parseFloat(a!), Number.parseFloat(b!), Number.parseFloat(c!)];\n};\n\nexport const parseLineABC = (v: string): { a: number; b: number; c: number } => {\n\tconst [a, b, c] = v.slice(1, -1).split(',');\n\treturn { a: Number.parseFloat(a!), b: Number.parseFloat(b!), c: Number.parseFloat(c!) };\n};\n\nexport const parsePointTuple = (v: string): [number, number] => {\n\tconst [x, y] = v.slice(1, -1).split(',');\n\treturn [Number.parseFloat(x!), Number.parseFloat(y!)];\n};\n\nexport const parsePointXY = (v: string): { x: number; y: number } => {\n\tconst [x, y] = v.slice(1, -1).split(',');\n\treturn { x: Number.parseFloat(x!), y: Number.parseFloat(y!) };\n};\n\nexport const parseGeometryTuple = (v: string): [number, number] => parseEWKB(v).point;\n\nexport const parseGeometryXY = (v: string): { x: number; y: number } => {\n\tconst parsed = parseEWKB(v);\n\treturn { x: parsed.point[0], y: parsed.point[1] };\n};\n\nexport const textToDate = (v: string): Date => new Date(v);\nexport const textToDateWithTz = (v: string): Date => new Date(v + '+0000');\n\nexport const parsePgVector = (v: string): number[] => {\n\tconst body = v.slice(1, -1);\n\tif (body.length === 0) return [];\n\treturn body.split(',').map(Number.parseFloat);\n};\n\nexport const genericPgCodecs = {\n\tbytea: {\n\t\tcastInJson: (name) => sql`encode(${name}, 'base64')`,\n\t\tcastArrayInJson: arrayCompatCast((name) => sql`encode(${name}, 'base64')`),\n\t\tnormalizeInJson: (v: string) => Buffer.from(v, 'base64'),\n\t\tnormalizeArrayInJson: arrayCompatNormalize((v: string) => Buffer.from(v, 'base64')),\n\t},\n\tbigint: {\n\t\tcastInJson: castToText,\n\t\tcastArrayInJson: castToTextArr,\n\t\tnormalizeInJson: BigInt,\n\t\tnormalizeArrayInJson: arrayCompatNormalize(BigInt),\n\t},\n\t'bigint:number': {\n\t\tcastInJson: castToText,\n\t\tcastArrayInJson: castToTextArr,\n\t\tnormalize: Number,\n\t\tnormalizeArray: arrayCompatNormalize(Number),\n\t\tnormalizeInJson: Number,\n\t\tnormalizeArrayInJson: arrayCompatNormalize(Number),\n\t},\n\t'bigint:string': {\n\t\tcastInJson: castToText,\n\t\tcastArrayInJson: castToTextArr,\n\t},\n\tbigserial: {\n\t\tcastInJson: castToText,\n\t\tcastArrayInJson: castToTextArr,\n\t\tnormalizeInJson: BigInt,\n\t\tnormalizeArrayInJson: arrayCompatNormalize(BigInt),\n\t\tnormalize: BigInt,\n\t\tnormalizeArray: arrayCompatNormalize(BigInt),\n\t},\n\t'bigserial:number': {\n\t\tcastInJson: castToText,\n\t\tcastArrayInJson: castToTextArr,\n\t\tnormalize: Number,\n\t\tnormalizeArray: arrayCompatNormalize(Number),\n\t\tnormalizeInJson: Number,\n\t\tnormalizeArrayInJson: arrayCompatNormalize(Number),\n\t},\n\tdate: {\n\t\tnormalizeInJson: textToDate,\n\t\tnormalizeArrayInJson: arrayCompatNormalize(textToDate),\n\t},\n\t'date:string': {},\n\tenum: {\n\t\tcastArray: castToTextArr,\n\t\tnormalizeParamArray: makePgArray,\n\t},\n\t'geometry(point)': {\n\t\tcastInJson: castToText,\n\t\tcastArrayInJson: castToTextArr,\n\t\tnormalize: parseGeometryXY,\n\t\tnormalizeArray: arrayCompatNormalize(parseGeometryXY),\n\t\tnormalizeInJson: parseGeometryXY,\n\t\tnormalizeArrayInJson: arrayCompatNormalize(parseGeometryXY),\n\t},\n\t'geometry(point):tuple': {\n\t\tcastInJson: castToText,\n\t\tcastArrayInJson: castToTextArr,\n\t\tnormalize: parseGeometryTuple,\n\t\tnormalizeArray: arrayCompatNormalize(parseGeometryTuple),\n\t\tnormalizeInJson: parseGeometryTuple,\n\t\tnormalizeArrayInJson: arrayCompatNormalize(parseGeometryTuple),\n\t},\n\tinterval: {\n\t\tcastArrayInJson: castToTextArr,\n\t},\n\tjson: {\n\t\tnormalizeParamArray: arrayCompatNormalizeInput((v) => JSON.stringify(v), true),\n\t},\n\tjsonb: {\n\t\tnormalizeParamArray: arrayCompatNormalizeInput((v) => JSON.stringify(v), true),\n\t},\n\tline: {\n\t\tcastInJson: castToText,\n\t\tcastArrayInJson: castToTextArr,\n\t\tnormalize: parseLineABC,\n\t\tnormalizeArray: arrayCompatNormalize(parseLineABC),\n\t\tnormalizeInJson: parseLineABC,\n\t\tnormalizeArrayInJson: arrayCompatNormalize(parseLineABC),\n\t},\n\t'line:tuple': {\n\t\tcastInJson: castToText,\n\t\tcastArrayInJson: castToTextArr,\n\t\tnormalize: parseLineTuple,\n\t\tnormalizeArray: arrayCompatNormalize(parseLineTuple),\n\t\tnormalizeInJson: parseLineTuple,\n\t\tnormalizeArrayInJson: arrayCompatNormalize(parseLineTuple),\n\t},\n\tnumeric: {\n\t\tcastInJson: castToText,\n\t\tcastArrayInJson: castToTextArr,\n\t\tcastArray: castToTextArr,\n\t},\n\t'numeric:number': {\n\t\tcastInJson: castToText,\n\t\tcastArrayInJson: castToTextArr,\n\t\tcastArray: castToTextArr,\n\t\tnormalize: Number,\n\t\tnormalizeArray: arrayCompatNormalize(Number),\n\t\tnormalizeInJson: Number,\n\t\tnormalizeArrayInJson: arrayCompatNormalize(Number),\n\t},\n\t'numeric:bigint': {\n\t\tcastInJson: castToText,\n\t\tcastArrayInJson: castToTextArr,\n\t\tcastArray: castToTextArr,\n\t\tnormalize: BigInt,\n\t\tnormalizeArray: arrayCompatNormalize(BigInt),\n\t\tnormalizeInJson: BigInt,\n\t\tnormalizeArrayInJson: arrayCompatNormalize(BigInt),\n\t},\n\tpoint: {\n\t\tcastInJson: castToText,\n\t\tcastArrayInJson: castToTextArr,\n\t\tnormalize: parsePointXY,\n\t\tnormalizeArray: arrayCompatNormalize(parsePointXY),\n\t\tnormalizeInJson: parsePointXY,\n\t\tnormalizeArrayInJson: arrayCompatNormalize(parsePointXY),\n\t},\n\t'point:tuple': {\n\t\tcastInJson: castToText,\n\t\tcastArrayInJson: castToTextArr,\n\t\tnormalize: parsePointTuple,\n\t\tnormalizeArray: arrayCompatNormalize(parsePointTuple),\n\t\tnormalizeInJson: parsePointTuple,\n\t\tnormalizeArrayInJson: arrayCompatNormalize(parsePointTuple),\n\t},\n\ttimestamp: {\n\t\tcastInJson: castToText,\n\t\tcastArrayInJson: castToTextArr,\n\t\tnormalizeInJson: textToDateWithTz,\n\t\tnormalizeArrayInJson: arrayCompatNormalize(textToDateWithTz),\n\t},\n\ttimestamptz: {\n\t\tcastInJson: castToText,\n\t\tcastArrayInJson: castToTextArr,\n\t\tnormalizeInJson: textToDate,\n\t\tnormalizeArrayInJson: arrayCompatNormalize(textToDate),\n\t},\n\t'timestamp:string': {\n\t\tcastInJson: castToText,\n\t\tcastArrayInJson: castToTextArr,\n\t},\n\t'timestamptz:string': {\n\t\tcastInJson: castToText,\n\t\tcastArrayInJson: castToTextArr,\n\t},\n\thalfvec: {\n\t\tnormalize: parsePgVector,\n\t\tnormalizeArray: parsePgArrayAndNormalize(parsePgVector),\n\t\tnormalizeInJson: parsePgVector,\n\t\tnormalizeArrayInJson: arrayCompatNormalize(parsePgVector),\n\t},\n\tvector: {\n\t\tnormalize: parsePgVector,\n\t\tnormalizeArray: parsePgArrayAndNormalize(parsePgVector),\n\t\tnormalizeInJson: parsePgVector,\n\t\tnormalizeArrayInJson: arrayCompatNormalize(parsePgVector),\n\t},\n} as const satisfies PgCodecs;\n\nexport const refineGenericPgCodecs = (extension?: PartialWithUndefined<PgCodecs>): PgCodecs =>\n\trefineCodecs<PostgresType>(genericPgCodecs, extension);\n","import type { ColumnBuilderBaseConfig } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport type { SQL, SQLGenerator } from '~/sql/sql.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { parsePgArray } from '../array.ts';\nimport { type PostgresColumnType, type PostgresType, resolvePgTypeAlias } from '../codecs.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type ConvertCustomConfig<T extends Partial<CustomTypeValues>> =\n\t& {\n\t\tdataType: 'custom';\n\t\tdata: T['data'];\n\t\tdriverParam: T['driverData'];\n\t}\n\t& (T['notNull'] extends true ? { notNull: true } : {})\n\t& (T['default'] extends true ? { hasDefault: true } : {});\n\nexport interface PgCustomColumnInnerConfig {\n\tcustomTypeValues: CustomTypeValues;\n}\n\nexport class PgCustomColumnBuilder<T extends ColumnBuilderBaseConfig<'custom'>> extends PgColumnBuilder<\n\tT,\n\t{\n\t\tfieldConfig: CustomTypeValues['config'];\n\t\tcustomTypeParams: CustomTypeParams<any>;\n\t}\n> {\n\tstatic override readonly [entityKind]: string = 'PgCustomColumnBuilder';\n\n\tconstructor(\n\t\tname: string,\n\t\tfieldConfig: CustomTypeValues['config'],\n\t\tcustomTypeParams: CustomTypeParams<any>,\n\t) {\n\t\tsuper(name, 'custom', 'PgCustomColumn');\n\t\tthis.config.fieldConfig = fieldConfig;\n\t\tthis.config.customTypeParams = customTypeParams;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgCustomColumn(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgCustomColumn<T extends ColumnBuilderBaseConfig<'custom'>> extends PgColumn<'custom'> {\n\tstatic override readonly [entityKind]: string = 'PgCustomColumn';\n\n\t/** @internal */\n\toverride readonly codec?: PostgresType | undefined;\n\n\tprivate sqlName: string;\n\treadonly mapFromJsonValue?: (value: unknown) => T['data'];\n\treadonly jsonSelectIdentifier?: (identifier: SQL, sql: SQLGenerator, arrayDimensions?: number) => SQL;\n\n\tconstructor(\n\t\ttable: PgTable<any>,\n\t\tconfig: PgCustomColumnBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config as any);\n\t\tthis.sqlName = config.customTypeParams.dataType(config.fieldConfig);\n\t\tthis.mapToDriverValue = config.customTypeParams.toDriver ?? this.mapToDriverValue;\n\t\tthis.mapFromDriverValue = config.customTypeParams.fromDriver ?? this.mapFromDriverValue;\n\t\tthis.mapFromJsonValue = config.customTypeParams.fromJson;\n\t\tthis.jsonSelectIdentifier = config.customTypeParams.forJsonSelect;\n\t\tconst cfgCodec =\n\t\t\ttypeof config.customTypeParams.codec === 'string' || typeof config.customTypeParams.codec === 'undefined'\n\t\t\t\t? config.customTypeParams.codec\n\t\t\t\t: config.customTypeParams.codec(config.fieldConfig);\n\t\tthis.codec = typeof cfgCodec === 'string'\n\t\t\t? resolvePgTypeAlias(cfgCodec) as PostgresType // If it isn't `PostgresType`, codec search will simply resolve to no codec, which is supported behaviour\n\t\t\t: undefined;\n\n\t\tif (this.dimensions && config.customTypeParams.fromJson) {\n\t\t\tthis.mapFromJsonValue = (value: unknown): unknown => {\n\t\t\t\tif (value === null) return value;\n\t\t\t\tconst arr = typeof value === 'string' ? parsePgArray(value) : value as unknown[];\n\t\t\t\treturn this.mapJsonArrayElements(arr, config.customTypeParams.fromJson!, this.dimensions);\n\t\t\t};\n\t\t}\n\t}\n\n\t/** @internal */\n\tprivate mapJsonArrayElements(value: unknown, mapper: (v: unknown) => unknown, depth: number): unknown {\n\t\tif (depth > 0 && Array.isArray(value)) {\n\t\t\treturn value.map((v) => v === null ? null : this.mapJsonArrayElements(v, mapper, depth - 1));\n\t\t}\n\t\treturn mapper(value);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.sqlName;\n\t}\n}\n\nexport interface CustomTypeValues {\n\t/**\n\t * Required type for custom column, that will infer proper type model\n\t *\n\t * Examples:\n\t *\n\t * If you want your column to be `string` type after selecting/or on inserting - use `data: string`. Like `text`, `varchar`\n\t *\n\t * If you want your column to be `number` type after selecting/or on inserting - use `data: number`. Like `integer`\n\t */\n\tdata: unknown;\n\n\t/**\n\t * Type helper, that represents what type database driver is accepting for specific database data type\n\t */\n\tdriverData?: unknown;\n\n\t/**\n\t * @deprecated Use codecs instead\n\t *\n\t * Type helper, that represents what type database driver is returning for specific database data type\n\t *\n\t * Needed only in case driver's output and input for type differ\n\t *\n\t * Defaults to {@link driverData}\n\t */\n\tdriverOutput?: unknown;\n\n\t/**\n\t * @deprecated Use codecs instead\n\t *\n\t * Type helper, that represents what type field returns after being aggregated to JSON\n\t */\n\tjsonData?: unknown;\n\n\t/**\n\t * What config type should be used for {@link CustomTypeParams} `dataType` generation\n\t */\n\tconfig?: Record<string, any>;\n\n\t/**\n\t * Whether the config argument should be required or not\n\t * @default false\n\t */\n\tconfigRequired?: boolean;\n\n\t/**\n\t * If your custom data type should be notNull by default you can use `notNull: true`\n\t *\n\t * @example\n\t * const customSerial = customType<{ data: number, notNull: true, default: true }>({\n\t * \t dataType() {\n\t * \t return 'serial';\n\t * },\n\t * });\n\t */\n\tnotNull?: boolean;\n\n\t/**\n\t * If your custom data type has default you can use `default: true`\n\t *\n\t * @example\n\t * const customSerial = customType<{ data: number, notNull: true, default: true }>({\n\t * \t dataType() {\n\t * \t return 'serial';\n\t * },\n\t * });\n\t */\n\tdefault?: boolean;\n}\n\nexport interface CustomTypeParams<T extends CustomTypeValues> {\n\t/**\n\t * Database data type string representation, that is used for migrations\n\t * @example\n\t * ```\n\t * `jsonb`, `text`\n\t * ```\n\t *\n\t * If database data type needs additional params you can use them from `config` param\n\t * @example\n\t * ```\n\t * `varchar(256)`, `numeric(2,3)`\n\t * ```\n\t *\n\t * To make `config` be of specific type please use config generic in {@link CustomTypeValues}\n\t *\n\t * @example\n\t * Usage example\n\t * ```\n\t * dataType() {\n\t * return 'boolean';\n\t * },\n\t * ```\n\t * Or\n\t * ```\n\t * dataType(config) {\n\t * \t return typeof config.length !== 'undefined' ? `varchar(${config.length})` : `varchar`;\n\t * \t }\n\t * ```\n\t */\n\tdataType: (config: T['config'] | (Equal<T['configRequired'], true> extends true ? never : undefined)) => string;\n\n\t/**\n\t * Optional mapping function, that is used to transform inputs from desired to be used in code format to one suitable for driver\n\t * @example\n\t * For example, when using jsonb we need to map JS/TS object to string before writing to database\n\t * ```\n\t * toDriver(value: TData): string {\n\t * \t return JSON.stringify(value);\n\t * }\n\t * ```\n\t */\n\ttoDriver?: (value: T['data']) => T['driverData'] | SQL;\n\n\t/**\n\t * Optional mapping function, that is used for transforming data returned by driver to desired column's output format\n\t * @example\n\t * For example, when using timestamp we need to map string Date representation to JS Date\n\t * ```\n\t * fromDriver(value: string): Date {\n\t * \treturn new Date(value);\n\t * }\n\t * ```\n\t *\n\t * It'll cause the returned data to change from:\n\t * ```\n\t * {\n\t * \tcustomField: \"2025-04-07T03:25:16.635Z\";\n\t * }\n\t * ```\n\t * to:\n\t * ```\n\t * {\n\t * \tcustomField: new Date(\"2025-04-07T03:25:16.635Z\");\n\t * }\n\t * ```\n\t */\n\tfromDriver?: (value: 'driverOutput' extends keyof T ? T['driverOutput'] : T['driverData']) => T['data'];\n\n\t/**\n\t * @deprecated Use codecs instead; bypasses JSON codecs if used\n\t *\n\t * Optional mapping function, that is used for transforming data returned by transofmed to JSON in database data to desired format\n\t *\n\t * Used by [relational queries](https://orm.drizzle.team/docs/rqb-v2)\n\t *\n\t * Defaults to {@link fromDriver} function\n\t * @example\n\t * For example, when querying bigint column via [RQB](https://orm.drizzle.team/docs/rqb-v2) or [JSON functions](https://orm.drizzle.team/docs/json-functions), the result field will be returned as it's string representation, as opposed to bigint from regular query\n\t * To handle that, we need a separate function to handle such field's mapping:\n\t * ```\n\t * fromJson(value: string): bigint {\n\t * \treturn BigInt(value);\n\t * },\n\t * ```\n\t *\n\t * It'll cause the returned data to change from:\n\t * ```\n\t * {\n\t * \tcustomField: \"5044565289845416380\";\n\t * }\n\t * ```\n\t * to:\n\t * ```\n\t * {\n\t * \tcustomField: 5044565289845416380n;\n\t * }\n\t * ```\n\t */\n\tfromJson?: (value: T['jsonData']) => T['data'];\n\n\t/**\n\t * @deprecated Use codecs instead; bypasses JSON codecs if used\n\t *\n\t * Optional selection modifier function, that is used for modifying selection of column inside [JSON functions](https://orm.drizzle.team/docs/json-functions)\n\t *\n\t * Additional mapping that could be required for such scenarios can be handled using {@link fromJson} function\n\t *\n\t * Used by [relational queries](https://orm.drizzle.team/docs/rqb-v2)\n\t *\n\t * Following types are being casted to text by default: `bytea`, `geometry`, `timestamp`, `numeric`, `bigint`\n\t * @example\n\t * For example, when using bigint we need to cast field to text to preserve data integrity\n\t * ```\n\t * forJsonSelect(identifier: SQL, sql: SQLGenerator, arrayDimensions?: number): SQL {\n\t * \treturn sql`${identifier}::text`\n\t * },\n\t * ```\n\t *\n\t * This will change query from:\n\t * ```\n\t * SELECT\n\t * \trow_to_json(\"t\".*)\n\t * \tFROM\n\t * \t(\n\t * \t\tSELECT\n\t * \t\t\"table\".\"custom_bigint\" AS \"bigint\"\n\t * \t\tFROM\n\t * \t\t\"table\"\n\t * \t) AS \"t\"\n\t * ```\n\t * to:\n\t * ```\n\t * SELECT\n\t * \trow_to_json(\"t\".*)\n\t * \tFROM\n\t * \t(\n\t * \t\tSELECT\n\t * \t\t\"table\".\"custom_bigint\"::text AS \"bigint\"\n\t * \t\tFROM\n\t * \t\t\"table\"\n\t * \t) AS \"t\"\n\t * ```\n\t *\n\t * Returned by query object will change from:\n\t * ```\n\t * {\n\t * \tbigint: 5044565289845416000; // Partial data loss due to direct conversion to JSON format\n\t * }\n\t * ```\n\t * to:\n\t * ```\n\t * {\n\t * \tbigint: \"5044565289845416380\"; // Data is preserved due to conversion of field to text before JSON-ification\n\t * }\n\t * ```\n\t */\n\tforJsonSelect?: (identifier: SQL, sql: SQLGenerator, arrayDimensions?: number) => SQL;\n\n\t/**\n\t * Select which column type codec will be used for this column\n\t */\n\tcodec?:\n\t\t| PostgresColumnType\n\t\t| undefined\n\t\t| ((\n\t\t\tconfig: T['config'] | (Equal<T['configRequired'], true> extends true ? never : undefined),\n\t\t) => PostgresColumnType | undefined);\n}\n\n/**\n * Custom pg database data type generator\n */\nexport function customType<T extends CustomTypeValues = CustomTypeValues>(\n\tcustomTypeParams: CustomTypeParams<T>,\n): Equal<T['configRequired'], true> extends true ? {\n\t\t<TConfig extends Record<string, any> & T['config']>(\n\t\t\tfieldConfig: TConfig,\n\t\t): PgCustomColumnBuilder<ConvertCustomConfig<T>>;\n\t\t(\n\t\t\tdbName: string,\n\t\t\tfieldConfig: T['config'],\n\t\t): PgCustomColumnBuilder<ConvertCustomConfig<T>>;\n\t}\n\t: {\n\t\t<TConfig extends Record<string, any> & T['config']>(\n\t\t\tfieldConfig?: TConfig,\n\t\t): PgCustomColumnBuilder<ConvertCustomConfig<T>>;\n\t\t(\n\t\t\tdbName: string,\n\t\t\tfieldConfig?: T['config'],\n\t\t): PgCustomColumnBuilder<ConvertCustomConfig<T>>;\n\t}\n{\n\treturn (\n\t\ta?: string | T['config'],\n\t\tb?: T['config'],\n\t): PgCustomColumnBuilder<ConvertCustomConfig<T>> => {\n\t\tconst { name, config } = getColumnNameAndConfig<T['config']>(a, b);\n\t\treturn new PgCustomColumnBuilder(name, config, customTypeParams);\n\t};\n}\n","import { entityKind } from '~/entity.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { PgColumnBuilderConfig, SetHasDefault } from './common.ts';\nimport { PgColumnBuilder } from './common.ts';\n\nexport abstract class PgDateColumnBuilder<\n\tout T extends PgColumnBuilderConfig = PgColumnBuilderConfig,\n\tout TRuntimeConfig extends object = object,\n> extends PgColumnBuilder<T, TRuntimeConfig> {\n\tstatic override readonly [entityKind]: string = 'PgDateColumnBaseBuilder';\n\n\t/**\n\t * Adds a `default now()` clause to the column definition.\n\t * Available for date/time column types.\n\t */\n\tdefaultNow(): SetHasDefault<this> {\n\t\treturn this.default(sql`now()`);\n\t}\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn } from './common.ts';\nimport { PgDateColumnBuilder } from './date.common.ts';\n\nexport class PgDateBuilder extends PgDateColumnBuilder<{\n\tdataType: 'object date';\n\tdata: Date;\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgDateBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'object date', 'PgDate');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgDate(table, this.config as any);\n\t}\n}\n\nexport class PgDate extends PgColumn<'object date'> {\n\tstatic override readonly [entityKind]: string = 'PgDate';\n\n\t/** @internal */\n\toverride readonly codec = 'date';\n\n\tgetSQLType(): string {\n\t\treturn 'date';\n\t}\n\n\toverride mapToDriverValue = function(value: Date | string): string {\n\t\tif (typeof value === 'string') return value;\n\t\treturn value.toISOString();\n\t};\n}\n\nexport class PgDateStringBuilder extends PgDateColumnBuilder<{\n\tdataType: 'string date';\n\tdata: string;\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgDateStringBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'string date', 'PgDateString');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgDateString(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgDateString extends PgColumn<'string date'> {\n\tstatic override readonly [entityKind]: string = 'PgDateString';\n\n\t/** @internal */\n\toverride readonly codec = 'date:string';\n\n\tgetSQLType(): string {\n\t\treturn 'date';\n\t}\n\n\toverride mapToDriverValue = (value: Date | string): string => {\n\t\tif (typeof value === 'string') return value;\n\t\treturn value.toISOString();\n\t};\n}\n\nexport interface PgDateConfig<T extends 'date' | 'string' = 'date' | 'string'> {\n\tmode: T;\n}\n\nexport function date<TMode extends PgDateConfig['mode'] & {}>(\n\tconfig?: PgDateConfig<TMode>,\n): Equal<TMode, 'date'> extends true ? PgDateBuilder : PgDateStringBuilder;\nexport function date<TMode extends PgDateConfig['mode'] & {}>(\n\tname: string,\n\tconfig?: PgDateConfig<TMode>,\n): Equal<TMode, 'date'> extends true ? PgDateBuilder : PgDateStringBuilder;\nexport function date(a?: string | PgDateConfig, b?: PgDateConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgDateConfig>(a, b);\n\tif (config?.mode === 'date') {\n\t\treturn new PgDateBuilder(name);\n\t}\n\treturn new PgDateStringBuilder(name);\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgDoublePrecisionBuilder extends PgColumnBuilder<{\n\tdataType: 'number double';\n\tdata: number;\n\tdriverParam: string | number;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgDoublePrecisionBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'number double', 'PgDoublePrecision');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgDoublePrecision(\n\t\t\ttable,\n\t\t\tthis.config,\n\t\t);\n\t}\n}\n\nexport class PgDoublePrecision extends PgColumn<'number double'> {\n\tstatic override readonly [entityKind]: string = 'PgDoublePrecision';\n\n\t/** @internal */\n\toverride readonly codec = 'float8';\n\n\tgetSQLType(): string {\n\t\treturn 'double precision';\n\t}\n}\n\nexport function doublePrecision(name?: string): PgDoublePrecisionBuilder {\n\treturn new PgDoublePrecisionBuilder(name ?? '');\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '../table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgInetBuilder extends PgColumnBuilder<{\n\tdataType: 'string inet';\n\tdata: string;\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgInetBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'string inet', 'PgInet');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgInet(table, this.config as any);\n\t}\n}\n\nexport class PgInet extends PgColumn<'string inet'> {\n\tstatic override readonly [entityKind]: string = 'PgInet';\n\n\t/** @internal */\n\toverride readonly codec = 'inet';\n\n\tgetSQLType(): string {\n\t\treturn 'inet';\n\t}\n}\n\nexport function inet(name?: string): PgInetBuilder {\n\treturn new PgInetBuilder(name ?? '');\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '../table.ts';\nimport { PgColumn } from './common.ts';\nimport { PgIntColumnBuilder } from './int.common.ts';\n\nexport class PgIntegerBuilder extends PgIntColumnBuilder<{\n\tdataType: 'number int32';\n\tdata: number;\n\tdriverParam: number | string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgIntegerBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'number int32', 'PgInteger');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgInteger(table, this.config as any);\n\t}\n}\n\nexport class PgInteger extends PgColumn<'number int32'> {\n\tstatic override readonly [entityKind]: string = 'PgInteger';\n\n\t/** @internal */\n\toverride readonly codec = 'int';\n\n\tgetSQLType(): string {\n\t\treturn 'integer';\n\t}\n}\n\nexport function integer(name?: string): PgIntegerBuilder {\n\treturn new PgIntegerBuilder(name ?? '');\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\nimport type { Precision } from './timestamp.ts';\n\nexport class PgIntervalBuilder extends PgColumnBuilder<{\n\tdataType: 'string interval';\n\tdata: string;\n\tdriverParam: string;\n}, { intervalConfig: IntervalConfig }> {\n\tstatic override readonly [entityKind]: string = 'PgIntervalBuilder';\n\n\tconstructor(\n\t\tname: string,\n\t\tintervalConfig: IntervalConfig,\n\t) {\n\t\tsuper(name, 'string interval', 'PgInterval');\n\t\tthis.config.intervalConfig = intervalConfig;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgInterval(table, this.config as any);\n\t}\n}\n\nexport class PgInterval extends PgColumn<'string interval'> {\n\tstatic override readonly [entityKind]: string = 'PgInterval';\n\n\t/** @internal */\n\toverride readonly codec = 'interval';\n\n\treadonly fields: IntervalConfig['fields'];\n\treadonly precision: IntervalConfig['precision'];\n\n\tconstructor(table: PgTable<any>, config: PgIntervalBuilder['config']) {\n\t\tsuper(table, config);\n\t\tthis.fields = config.intervalConfig.fields;\n\t\tthis.precision = config.intervalConfig.precision;\n\t}\n\n\tgetSQLType(): string {\n\t\tconst fields = this.fields ? ` ${this.fields}` : '';\n\t\tconst precision = this.precision ? `(${this.precision})` : '';\n\t\treturn `interval${fields}${precision}`;\n\t}\n}\n\nexport interface IntervalConfig {\n\tfields?:\n\t\t| 'year'\n\t\t| 'month'\n\t\t| 'day'\n\t\t| 'hour'\n\t\t| 'minute'\n\t\t| 'second'\n\t\t| 'year to month'\n\t\t| 'day to hour'\n\t\t| 'day to minute'\n\t\t| 'day to second'\n\t\t| 'hour to minute'\n\t\t| 'hour to second'\n\t\t| 'minute to second';\n\tprecision?: Precision;\n}\n\nexport function interval(\n\tconfig?: IntervalConfig,\n): PgIntervalBuilder;\nexport function interval(\n\tname: string,\n\tconfig?: IntervalConfig,\n): PgIntervalBuilder;\nexport function interval(a?: string | IntervalConfig, b: IntervalConfig = {}) {\n\tconst { name, config } = getColumnNameAndConfig<IntervalConfig>(a, b);\n\treturn new PgIntervalBuilder(name, config);\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgJsonBuilder extends PgColumnBuilder<\n\t{\n\t\tdataType: 'object json';\n\t\tdata: unknown;\n\t\tdriverParam: unknown;\n\t}\n> {\n\tstatic override readonly [entityKind]: string = 'PgJsonBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'object json', 'PgJson');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgJson(table, this.config as any);\n\t}\n}\n\nexport class PgJson extends PgColumn<'object json'> {\n\tstatic override readonly [entityKind]: string = 'PgJson';\n\n\t/** @internal */\n\toverride readonly codec = 'json';\n\n\tconstructor(table: PgTable<any>, config: PgJsonBuilder['config']) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn 'json';\n\t}\n}\n\nexport function json(name?: string): PgJsonBuilder {\n\treturn new PgJsonBuilder(name ?? '');\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgJsonbBuilder extends PgColumnBuilder<{\n\tdataType: 'object json';\n\tdata: unknown;\n\tdriverParam: unknown;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgJsonbBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'object json', 'PgJsonb');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgJsonb(table, this.config as any);\n\t}\n}\n\nexport class PgJsonb extends PgColumn<'object json'> {\n\tstatic override readonly [entityKind]: string = 'PgJsonb';\n\n\t/** @internal */\n\toverride readonly codec = 'jsonb';\n\n\tconstructor(table: PgTable<any>, config: PgJsonbBuilder['config']) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn 'jsonb';\n\t}\n}\n\nexport function jsonb(name?: string): PgJsonbBuilder {\n\treturn new PgJsonbBuilder(name ?? '');\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgLineBuilder extends PgColumnBuilder<{\n\tdataType: 'array line';\n\tdata: [number, number, number];\n\tdriverParam: number | string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgLineBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'array line', 'PgLine');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgLineTuple(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgLineTuple extends PgColumn<'array line'> {\n\tstatic override readonly [entityKind]: string = 'PgLine';\n\n\t/** @internal */\n\toverride readonly codec = 'line:tuple';\n\n\treadonly mode = 'tuple';\n\n\tgetSQLType(): string {\n\t\treturn 'line';\n\t}\n\n\toverride mapToDriverValue = (value: [number, number, number]): string => {\n\t\treturn `{${value[0]},${value[1]},${value[2]}}`;\n\t};\n}\n\nexport class PgLineABCBuilder extends PgColumnBuilder<{\n\tdataType: 'object line';\n\tdata: { a: number; b: number; c: number };\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgLineABCBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'object line', 'PgLineABC');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgLineABC(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgLineABC extends PgColumn<'object line'> {\n\tstatic override readonly [entityKind]: string = 'PgLineABC';\n\n\t/** @internal */\n\toverride readonly codec = 'line';\n\n\treadonly mode = 'abc';\n\n\tgetSQLType(): string {\n\t\treturn 'line';\n\t}\n\n\toverride mapToDriverValue = (value: { a: number; b: number; c: number }): string => {\n\t\treturn `{${value.a},${value.b},${value.c}}`;\n\t};\n}\n\nexport interface PgLineTypeConfig<T extends 'tuple' | 'abc' = 'tuple' | 'abc'> {\n\tmode?: T;\n}\n\nexport function line<TMode extends PgLineTypeConfig['mode'] & {}>(\n\tconfig?: PgLineTypeConfig<TMode>,\n): Equal<TMode, 'abc'> extends true ? PgLineABCBuilder\n\t: PgLineBuilder;\nexport function line<TMode extends PgLineTypeConfig['mode'] & {}>(\n\tname: string,\n\tconfig?: PgLineTypeConfig<TMode>,\n): Equal<TMode, 'abc'> extends true ? PgLineABCBuilder\n\t: PgLineBuilder;\nexport function line(a?: string | PgLineTypeConfig, b?: PgLineTypeConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgLineTypeConfig>(a, b);\n\tif (!config?.mode || config.mode === 'tuple') {\n\t\treturn new PgLineBuilder(name);\n\t}\n\treturn new PgLineABCBuilder(name);\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '../table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgMacaddrBuilder extends PgColumnBuilder<{\n\tdataType: 'string macaddr';\n\tdata: string;\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgMacaddrBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'string macaddr', 'PgMacaddr');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgMacaddr(table, this.config as any);\n\t}\n}\n\nexport class PgMacaddr extends PgColumn<'string macaddr'> {\n\tstatic override readonly [entityKind]: string = 'PgMacaddr';\n\n\t/** @internal */\n\toverride readonly codec = 'macaddr';\n\n\tgetSQLType(): string {\n\t\treturn 'macaddr';\n\t}\n}\n\nexport function macaddr(name?: string): PgMacaddrBuilder {\n\treturn new PgMacaddrBuilder(name ?? '');\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '../table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgMacaddr8Builder extends PgColumnBuilder<{\n\tdataType: 'string macaddr8';\n\tdata: string;\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgMacaddr8Builder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'string macaddr8', 'PgMacaddr8');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgMacaddr8(table, this.config as any);\n\t}\n}\n\nexport class PgMacaddr8 extends PgColumn<'string macaddr8'> {\n\tstatic override readonly [entityKind]: string = 'PgMacaddr8';\n\n\t/** @internal */\n\toverride readonly codec = 'macaddr8';\n\n\tgetSQLType(): string {\n\t\treturn 'macaddr8';\n\t}\n}\n\nexport function macaddr8(name?: string): PgMacaddr8Builder {\n\treturn new PgMacaddr8Builder(name ?? '');\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgNumericBuilder extends PgColumnBuilder<\n\t{\n\t\tdataType: 'string numeric';\n\t\tdata: string;\n\t\tdriverParam: string;\n\t},\n\t{\n\t\tprecision: number | undefined;\n\t\tscale: number | undefined;\n\t}\n> {\n\tstatic override readonly [entityKind]: string = 'PgNumericBuilder';\n\n\tconstructor(name: string, precision?: number, scale?: number) {\n\t\tsuper(name, 'string numeric', 'PgNumeric');\n\t\tthis.config.precision = precision;\n\t\tthis.config.scale = scale;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgNumeric(table, this.config as any);\n\t}\n}\n\nexport class PgNumeric extends PgColumn<'string numeric'> {\n\tstatic override readonly [entityKind]: string = 'PgNumeric';\n\n\t/** @internal */\n\toverride readonly codec = 'numeric';\n\n\treadonly precision: number | undefined;\n\treadonly scale: number | undefined;\n\n\tconstructor(table: PgTable<any>, config: PgNumericBuilder['config']) {\n\t\tsuper(table, config);\n\t\tthis.precision = config.precision;\n\t\tthis.scale = config.scale;\n\t}\n\n\tgetSQLType(): string {\n\t\tif (this.precision !== undefined && this.scale !== undefined) {\n\t\t\treturn `numeric(${this.precision}, ${this.scale})`;\n\t\t} else if (this.precision === undefined) {\n\t\t\treturn 'numeric';\n\t\t} else {\n\t\t\treturn `numeric(${this.precision})`;\n\t\t}\n\t}\n}\n\nexport class PgNumericNumberBuilder extends PgColumnBuilder<\n\t{\n\t\tdataType: 'number';\n\t\tdata: number;\n\t\tdriverParam: string;\n\t},\n\t{\n\t\tprecision: number | undefined;\n\t\tscale: number | undefined;\n\t}\n> {\n\tstatic override readonly [entityKind]: string = 'PgNumericNumberBuilder';\n\n\tconstructor(name: string, precision?: number, scale?: number) {\n\t\tsuper(name, 'number', 'PgNumericNumber');\n\t\tthis.config.precision = precision;\n\t\tthis.config.scale = scale;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgNumericNumber(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgNumericNumber extends PgColumn<'number'> {\n\tstatic override readonly [entityKind]: string = 'PgNumericNumber';\n\n\t/** @internal */\n\toverride readonly codec = 'numeric:number';\n\n\treadonly precision: number | undefined;\n\treadonly scale: number | undefined;\n\n\tconstructor(table: PgTable<any>, config: PgNumericNumberBuilder['config']) {\n\t\tsuper(table, config);\n\t\tthis.precision = config.precision;\n\t\tthis.scale = config.scale;\n\t}\n\n\toverride mapToDriverValue = String;\n\n\tgetSQLType(): string {\n\t\tif (this.precision !== undefined && this.scale !== undefined) {\n\t\t\treturn `numeric(${this.precision}, ${this.scale})`;\n\t\t} else if (this.precision === undefined) {\n\t\t\treturn 'numeric';\n\t\t} else {\n\t\t\treturn `numeric(${this.precision})`;\n\t\t}\n\t}\n}\n\nexport class PgNumericBigIntBuilder extends PgColumnBuilder<\n\t{\n\t\tdataType: 'bigint int64';\n\t\tdata: bigint;\n\t\tdriverParam: string;\n\t},\n\t{\n\t\tprecision: number | undefined;\n\t\tscale: number | undefined;\n\t}\n> {\n\tstatic override readonly [entityKind]: string = 'PgNumericBigIntBuilder';\n\n\tconstructor(name: string, precision?: number, scale?: number) {\n\t\tsuper(name, 'bigint int64', 'PgNumericBigInt');\n\t\tthis.config.precision = precision;\n\t\tthis.config.scale = scale;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgNumericBigInt(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgNumericBigInt extends PgColumn<'bigint int64'> {\n\tstatic override readonly [entityKind]: string = 'PgNumericBigInt';\n\n\t/** @internal */\n\toverride readonly codec = 'numeric:bigint';\n\n\treadonly precision: number | undefined;\n\treadonly scale: number | undefined;\n\n\tconstructor(table: PgTable<any>, config: PgNumericBigIntBuilder['config']) {\n\t\tsuper(table, config);\n\t\tthis.precision = config.precision;\n\t\tthis.scale = config.scale;\n\t}\n\n\toverride mapToDriverValue = String;\n\n\tgetSQLType(): string {\n\t\tif (this.precision !== undefined && this.scale !== undefined) {\n\t\t\treturn `numeric(${this.precision}, ${this.scale})`;\n\t\t} else if (this.precision === undefined) {\n\t\t\treturn 'numeric';\n\t\t} else {\n\t\t\treturn `numeric(${this.precision})`;\n\t\t}\n\t}\n}\n\nexport type PgNumericConfig<T extends 'string' | 'number' | 'bigint' = 'string' | 'number' | 'bigint'> =\n\t| { precision: number; scale?: number; mode?: T }\n\t| { precision?: number; scale: number; mode?: T }\n\t| { precision?: number; scale?: number; mode: T };\n\nexport function numeric<TMode extends 'string' | 'number' | 'bigint'>(\n\tconfig?: PgNumericConfig<TMode>,\n): Equal<TMode, 'number'> extends true ? PgNumericNumberBuilder\n\t: Equal<TMode, 'bigint'> extends true ? PgNumericBigIntBuilder\n\t: PgNumericBuilder;\nexport function numeric<TMode extends 'string' | 'number' | 'bigint'>(\n\tname: string,\n\tconfig?: PgNumericConfig<TMode>,\n): Equal<TMode, 'number'> extends true ? PgNumericNumberBuilder\n\t: Equal<TMode, 'bigint'> extends true ? PgNumericBigIntBuilder\n\t: PgNumericBuilder;\nexport function numeric(a?: string | PgNumericConfig, b?: PgNumericConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgNumericConfig>(a, b);\n\tconst mode = config?.mode;\n\treturn mode === 'number'\n\t\t? new PgNumericNumberBuilder(name, config?.precision, config?.scale)\n\t\t: mode === 'bigint'\n\t\t? new PgNumericBigIntBuilder(name, config?.precision, config?.scale)\n\t\t: new PgNumericBuilder(name, config?.precision, config?.scale);\n}\n\nexport const decimal = numeric;\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgPointTupleBuilder extends PgColumnBuilder<{\n\tdataType: 'array point';\n\tdata: [number, number];\n\tdriverParam: number | string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgPointTupleBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'array point', 'PgPointTuple');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgPointTuple(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgPointTuple extends PgColumn<'array point'> {\n\tstatic override readonly [entityKind]: string = 'PgPointTuple';\n\n\t/** @internal */\n\toverride readonly codec = 'point:tuple';\n\n\treadonly mode = 'tuple';\n\n\tgetSQLType(): string {\n\t\treturn 'point';\n\t}\n\n\toverride mapToDriverValue = (value: [number, number]): string => {\n\t\treturn `(${value[0]},${value[1]})`;\n\t};\n}\n\nexport class PgPointObjectBuilder extends PgColumnBuilder<{\n\tdataType: 'object point';\n\tdata: { x: number; y: number };\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgPointObjectBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'object point', 'PgPointObject');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgPointObject(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgPointObject extends PgColumn<'object point'> {\n\tstatic override readonly [entityKind]: string = 'PgPointObject';\n\n\t/** @internal */\n\toverride readonly codec = 'point';\n\n\treadonly mode = 'xy';\n\n\tgetSQLType(): string {\n\t\treturn 'point';\n\t}\n\n\toverride mapToDriverValue = (value: { x: number; y: number }): string => {\n\t\treturn `(${value.x},${value.y})`;\n\t};\n}\n\nexport interface PgPointConfig<T extends 'tuple' | 'xy' = 'tuple' | 'xy'> {\n\tmode?: T;\n}\n\nexport function point<TMode extends PgPointConfig['mode'] & {}>(\n\tconfig?: PgPointConfig<TMode>,\n): Equal<TMode, 'xy'> extends true ? PgPointObjectBuilder\n\t: PgPointTupleBuilder;\nexport function point<TMode extends PgPointConfig['mode'] & {}>(\n\tname: string,\n\tconfig?: PgPointConfig<TMode>,\n): Equal<TMode, 'xy'> extends true ? PgPointObjectBuilder\n\t: PgPointTupleBuilder;\nexport function point(a?: string | PgPointConfig, b?: PgPointConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgPointConfig>(a, b);\n\tif (!config?.mode || config.mode === 'tuple') {\n\t\treturn new PgPointTupleBuilder(name);\n\t}\n\treturn new PgPointObjectBuilder(name);\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport type { PgColumnBaseConfig } from '../common.ts';\nimport { PgColumn, PgColumnBuilder } from '../common.ts';\n\nexport class PgGeometryBuilder extends PgColumnBuilder<{\n\tdataType: 'array geometry';\n\tdata: [number, number];\n\tdriverParam: string;\n}, { srid: number | undefined }> {\n\tstatic override readonly [entityKind]: string = 'PgGeometryBuilder';\n\n\tconstructor(name: string, srid?: number) {\n\t\tsuper(name, 'array geometry', 'PgGeometry');\n\t\tthis.config.srid = srid;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgGeometry(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgGeometry\n\textends PgColumn<'array geometry', PgColumnBaseConfig<'array geometry'>, { srid: number | undefined }>\n{\n\tstatic override readonly [entityKind]: string = 'PgGeometry';\n\n\t/** @internal */\n\toverride readonly codec = 'geometry(point):tuple';\n\n\treadonly srid = this.config.srid;\n\treadonly mode = 'tuple';\n\n\tgetSQLType(): string {\n\t\treturn `geometry(point${this.srid === undefined ? '' : `,${this.srid}`})`;\n\t}\n\n\toverride mapToDriverValue = (value: [number, number]): string => {\n\t\treturn `point(${value[0]} ${value[1]})`;\n\t};\n}\n\nexport class PgGeometryObjectBuilder extends PgColumnBuilder<{\n\tdataType: 'object geometry';\n\tdata: { x: number; y: number };\n\tdriverParam: string;\n}, { srid?: number }> {\n\tstatic override readonly [entityKind]: string = 'PgGeometryObjectBuilder';\n\n\tconstructor(name: string, srid: number | undefined) {\n\t\tsuper(name, 'object geometry', 'PgGeometryObject');\n\t\tthis.config.srid = srid;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgGeometryObject(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgGeometryObject\n\textends PgColumn<'object geometry', PgColumnBaseConfig<'object geometry'>, { srid: number | undefined }>\n{\n\tstatic override readonly [entityKind]: string = 'PgGeometryObject';\n\n\t/** @internal */\n\toverride readonly codec = 'geometry(point)';\n\n\treadonly srid = this.config.srid;\n\treadonly mode = 'object';\n\n\tgetSQLType(): string {\n\t\treturn `geometry(point${this.srid === undefined ? '' : `,${this.srid}`})`;\n\t}\n\n\toverride mapToDriverValue = (value: { x: number; y: number }): string => {\n\t\treturn `point(${value.x} ${value.y})`;\n\t};\n}\n\nexport interface PgGeometryConfig<T extends 'tuple' | 'xy' = 'tuple' | 'xy'> {\n\tmode?: T;\n\ttype?: 'point' | (string & {});\n\tsrid?: number;\n}\n\nexport function geometry<TMode extends PgGeometryConfig['mode'] & {}>(\n\tconfig?: PgGeometryConfig<TMode>,\n): Equal<TMode, 'xy'> extends true ? PgGeometryObjectBuilder : PgGeometryBuilder;\nexport function geometry<TMode extends PgGeometryConfig['mode'] & {}>(\n\tname: string,\n\tconfig?: PgGeometryConfig<TMode>,\n): Equal<TMode, 'xy'> extends true ? PgGeometryObjectBuilder : PgGeometryBuilder;\nexport function geometry(a?: string | PgGeometryConfig, b?: PgGeometryConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgGeometryConfig>(a, b);\n\tif (!config?.mode || config.mode === 'tuple') {\n\t\treturn new PgGeometryBuilder(name, config?.srid);\n\t}\n\treturn new PgGeometryObjectBuilder(name, config?.srid);\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgRealBuilder extends PgColumnBuilder<\n\t{\n\t\tdataType: 'number float';\n\t\tdata: number;\n\t\tdriverParam: string | number;\n\t},\n\t{ length: number | undefined }\n> {\n\tstatic override readonly [entityKind]: string = 'PgRealBuilder';\n\n\tconstructor(name: string, length?: number) {\n\t\tsuper(name, 'number float', 'PgReal');\n\t\tthis.config.length = length;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgReal(table, this.config as any);\n\t}\n}\n\nexport class PgReal extends PgColumn<'number float'> {\n\tstatic override readonly [entityKind]: string = 'PgReal';\n\n\t/** @internal */\n\toverride readonly codec = 'float4';\n\n\tconstructor(table: PgTable<any>, config: PgRealBuilder['config']) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn 'real';\n\t}\n}\n\nexport function real(name?: string): PgRealBuilder {\n\treturn new PgRealBuilder(name ?? '');\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgSerialBuilder extends PgColumnBuilder<{\n\tdataType: 'number int32';\n\tdata: number;\n\tdriverParam: number;\n\n\tnotNull: true;\n\thasDefault: true;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgSerialBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'number int32', 'PgSerial');\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.notNull = true;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgSerial(table, this.config as any);\n\t}\n}\n\nexport class PgSerial extends PgColumn<'number int32'> {\n\tstatic override readonly [entityKind]: string = 'PgSerial';\n\n\t/** @internal */\n\toverride readonly codec = 'serial';\n\n\tgetSQLType(): string {\n\t\treturn 'serial';\n\t}\n}\n\nexport function serial(name?: string): PgSerialBuilder {\n\treturn new PgSerialBuilder(name ?? '');\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { PgColumn } from './common.ts';\nimport { PgIntColumnBuilder } from './int.common.ts';\n\nexport class PgSmallIntBuilder extends PgIntColumnBuilder<{\n\tdataType: 'number int16';\n\tdata: number;\n\tdriverParam: number | string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgSmallIntBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'number int16', 'PgSmallInt');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgSmallInt(table, this.config as any);\n\t}\n}\n\nexport class PgSmallInt extends PgColumn<'number int16'> {\n\tstatic override readonly [entityKind]: string = 'PgSmallInt';\n\n\t/** @internal */\n\toverride readonly codec = 'smallint';\n\n\tgetSQLType(): string {\n\t\treturn 'smallint';\n\t}\n}\nexport function smallint(name?: string): PgSmallIntBuilder {\n\treturn new PgSmallIntBuilder(name ?? '');\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgSmallSerialBuilder extends PgColumnBuilder<{\n\tdataType: 'number int16';\n\tdata: number;\n\tdriverParam: number;\n\tnotNull: true;\n\thasDefault: true;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgSmallSerialBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'number int16', 'PgSmallSerial');\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.notNull = true;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgSmallSerial(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgSmallSerial extends PgColumn<'number int16'> {\n\tstatic override readonly [entityKind]: string = 'PgSmallSerial';\n\n\t/** @internal */\n\toverride readonly codec = 'smallserial';\n\n\tgetSQLType(): string {\n\t\treturn 'smallserial';\n\t}\n}\n\nexport function smallserial(name?: string): PgSmallSerialBuilder {\n\treturn new PgSmallSerialBuilder(name ?? '');\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { type Equal, getColumnNameAndConfig, type Writable } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\ntype PgTextBuilderConfig<TEnum extends [string, ...string[]]> = Equal<TEnum, [string, ...string[]]> extends true\n\t? { dataType: 'string'; data: string; driverParam: string }\n\t: { dataType: 'string enum'; data: TEnum[number]; enumValues: TEnum; driverParam: string };\n\nexport class PgTextBuilder<TEnum extends [string, ...string[]] = [string, ...string[]]> extends PgColumnBuilder<\n\tPgTextBuilderConfig<TEnum>,\n\t{ enumValues: TEnum }\n> {\n\tstatic override readonly [entityKind]: string = 'PgTextBuilder';\n\n\tconstructor(\n\t\tname: string,\n\t\tconfig: PgTextConfig<TEnum>,\n\t) {\n\t\tsuper(name, config.enum?.length ? 'string enum' : 'string', 'PgText');\n\t\tthis.config.enumValues = config.enum as TEnum;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgText(table, this.config as any, this.config.enumValues);\n\t}\n}\n\nexport class PgText<TEnum extends [string, ...string[]] = [string, ...string[]]> extends PgColumn<\n\tEqual<TEnum, [string, ...string[]]> extends true ? 'string' : 'string enum'\n> {\n\tstatic override readonly [entityKind]: string = 'PgText';\n\toverride readonly enumValues;\n\n\t/** @internal */\n\toverride readonly codec = 'text';\n\n\tconstructor(\n\t\ttable: PgTable<any>,\n\t\tconfig: any,\n\t\tenumValues?: string[],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.enumValues = enumValues;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn 'text';\n\t}\n}\n\nexport interface PgTextConfig<\n\tTEnum extends readonly string[] | undefined = readonly string[] | undefined,\n> {\n\tenum?: TEnum;\n}\n\n// Original function overloads style\nexport function text(): PgTextBuilder;\nexport function text(name: string): PgTextBuilder;\nexport function text<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tconfig: PgTextConfig<T | Writable<T>>,\n): PgTextBuilder<Writable<T>>;\nexport function text<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tname: string,\n\tconfig: PgTextConfig<T | Writable<T>>,\n): PgTextBuilder<Writable<T>>;\nexport function text(a?: string | PgTextConfig, b: PgTextConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<PgTextConfig>(a, b);\n\treturn new PgTextBuilder(name, config as any);\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn } from './common.ts';\nimport { PgDateColumnBuilder } from './date.common.ts';\nimport type { Precision } from './timestamp.ts';\n\nexport class PgTimeBuilder extends PgDateColumnBuilder<\n\t{\n\t\tdataType: 'string time';\n\t\tdata: string;\n\t\tdriverParam: string;\n\t},\n\t{ withTimezone: boolean; precision: number | undefined }\n> {\n\tstatic override readonly [entityKind]: string = 'PgTimeBuilder';\n\n\tconstructor(\n\t\tname: string,\n\t\treadonly withTimezone: boolean,\n\t\treadonly precision: number | undefined,\n\t) {\n\t\tsuper(name, 'string time', 'PgTime');\n\t\tthis.config.withTimezone = withTimezone;\n\t\tthis.config.precision = precision;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgTime(table, this.config as any);\n\t}\n}\n\nexport class PgTime extends PgColumn<'string time'> {\n\tstatic override readonly [entityKind]: string = 'PgTime';\n\n\t/** @internal */\n\toverride readonly codec = 'time';\n\n\treadonly withTimezone: boolean;\n\treadonly precision: number | undefined;\n\n\tconstructor(table: PgTable<any>, config: PgTimeBuilder['config']) {\n\t\tsuper(table, config);\n\t\tthis.withTimezone = config.withTimezone;\n\t\tthis.precision = config.precision;\n\t}\n\n\tgetSQLType(): string {\n\t\tconst precision = this.precision === undefined ? '' : `(${this.precision})`;\n\t\treturn `time${precision}${this.withTimezone ? ' with time zone' : ''}`;\n\t}\n}\n\nexport interface TimeConfig {\n\tprecision?: Precision;\n\twithTimezone?: boolean;\n}\n\nexport function time(config?: TimeConfig): PgTimeBuilder;\nexport function time(name: string, config?: TimeConfig): PgTimeBuilder;\nexport function time(a?: string | TimeConfig, b: TimeConfig = {}) {\n\tconst { name, config } = getColumnNameAndConfig<TimeConfig>(a, b);\n\treturn new PgTimeBuilder(name, config.withTimezone ?? false, config.precision);\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn } from './common.ts';\nimport { PgDateColumnBuilder } from './date.common.ts';\n\nexport class PgTimestampBuilder extends PgDateColumnBuilder<\n\t{\n\t\tdataType: 'object date';\n\t\tdata: Date;\n\t\tdriverParam: string;\n\t},\n\t{ withTimezone: boolean; precision: number | undefined }\n> {\n\tstatic override readonly [entityKind]: string = 'PgTimestampBuilder';\n\n\tconstructor(\n\t\tname: string,\n\t\twithTimezone: boolean,\n\t\tprecision: number | undefined,\n\t) {\n\t\tsuper(name, 'object date', 'PgTimestamp');\n\t\tthis.config.withTimezone = withTimezone;\n\t\tthis.config.precision = precision;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgTimestamp(table, this.config as any);\n\t}\n}\n\nexport class PgTimestamp extends PgColumn<'object date'> {\n\tstatic override readonly [entityKind]: string = 'PgTimestamp';\n\n\t/** @internal */\n\toverride readonly codec: 'timestamp' | 'timestamptz';\n\n\treadonly withTimezone: boolean;\n\treadonly precision: number | undefined;\n\n\tconstructor(table: PgTable<any>, config: PgTimestampBuilder['config']) {\n\t\tsuper(table, config);\n\t\tthis.withTimezone = config.withTimezone;\n\t\tthis.precision = config.precision;\n\t\tthis.codec = this.withTimezone ? 'timestamptz' : 'timestamp';\n\t}\n\n\tgetSQLType(): string {\n\t\tconst precision = this.precision === undefined ? '' : ` (${this.precision})`;\n\t\treturn `timestamp${precision}${this.withTimezone ? ' with time zone' : ''}`;\n\t}\n\n\toverride mapToDriverValue = (value: Date | string): string => {\n\t\tif (typeof value === 'string') return value;\n\t\treturn value.toISOString();\n\t};\n}\n\nexport class PgTimestampStringBuilder extends PgDateColumnBuilder<\n\t{\n\t\tdataType: 'string timestamp';\n\t\tdata: string;\n\t\tdriverParam: string;\n\t},\n\t{ withTimezone: boolean; precision: number | undefined }\n> {\n\tstatic override readonly [entityKind]: string = 'PgTimestampStringBuilder';\n\n\tconstructor(\n\t\tname: string,\n\t\twithTimezone: boolean,\n\t\tprecision: number | undefined,\n\t) {\n\t\tsuper(name, 'string timestamp', 'PgTimestampString');\n\t\tthis.config.withTimezone = withTimezone;\n\t\tthis.config.precision = precision;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgTimestampString(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgTimestampString extends PgColumn<'string timestamp'> {\n\tstatic override readonly [entityKind]: string = 'PgTimestampString';\n\n\t/** @internal */\n\toverride readonly codec: 'timestamp:string' | 'timestamptz:string';\n\n\treadonly withTimezone: boolean;\n\treadonly precision: number | undefined;\n\n\tconstructor(table: PgTable<any>, config: PgTimestampStringBuilder['config']) {\n\t\tsuper(table, config);\n\t\tthis.withTimezone = config.withTimezone;\n\t\tthis.precision = config.precision;\n\t\tthis.codec = this.withTimezone ? 'timestamptz:string' : 'timestamp:string';\n\t}\n\n\tgetSQLType(): string {\n\t\tconst precision = this.precision === undefined ? '' : `(${this.precision})`;\n\t\treturn `timestamp${precision}${this.withTimezone ? ' with time zone' : ''}`;\n\t}\n\n\toverride mapToDriverValue = (value: Date | string): string => {\n\t\tif (typeof value === 'string') return value;\n\t\treturn value.toISOString();\n\t};\n}\n\nexport type Precision = 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\nexport interface PgTimestampConfig<TMode extends 'date' | 'string' = 'date' | 'string'> {\n\tmode?: TMode;\n\tprecision?: Precision;\n\twithTimezone?: boolean;\n}\n\nexport function timestamp<TMode extends PgTimestampConfig['mode'] & {}>(\n\tconfig?: PgTimestampConfig<TMode>,\n): Equal<TMode, 'string'> extends true ? PgTimestampStringBuilder : PgTimestampBuilder;\nexport function timestamp<TMode extends PgTimestampConfig['mode'] & {}>(\n\tname: string,\n\tconfig?: PgTimestampConfig<TMode>,\n): Equal<TMode, 'string'> extends true ? PgTimestampStringBuilder : PgTimestampBuilder;\nexport function timestamp(a?: string | PgTimestampConfig, b: PgTimestampConfig = {}) {\n\tconst { name, config } = getColumnNameAndConfig<PgTimestampConfig | undefined>(a, b);\n\tif (config?.mode === 'string') {\n\t\treturn new PgTimestampStringBuilder(name, config.withTimezone ?? false, config.precision);\n\t}\n\treturn new PgTimestampBuilder(name, config?.withTimezone ?? false, config?.precision);\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgUUIDBuilder extends PgColumnBuilder<{\n\tdataType: 'string uuid';\n\tdata: string;\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgUUIDBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'string uuid', 'PgUUID');\n\t}\n\n\t/**\n\t * Adds `default gen_random_uuid()` to the column definition.\n\t */\n\tdefaultRandom(): ReturnType<this['default']> {\n\t\treturn this.default(sql`gen_random_uuid()`) as ReturnType<this['default']>;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgUUID(table, this.config as any);\n\t}\n}\n\nexport class PgUUID extends PgColumn<'string uuid'> {\n\tstatic override readonly [entityKind]: string = 'PgUUID';\n\n\t/** @internal */\n\toverride readonly codec = 'uuid';\n\n\tgetSQLType(): string {\n\t\treturn 'uuid';\n\t}\n}\n\nexport function uuid(name?: string): PgUUIDBuilder {\n\treturn new PgUUIDBuilder(name ?? '');\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { type Equal, getColumnNameAndConfig, type Writable } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\ntype PgVarcharBuilderConfig<TEnum extends [string, ...string[]]> = Equal<TEnum, [string, ...string[]]> extends true\n\t? { dataType: 'string'; data: string; driverParam: string }\n\t: { dataType: 'string enum'; data: TEnum[number]; enumValues: TEnum; driverParam: string };\n\nexport class PgVarcharBuilder<TEnum extends [string, ...string[]] = [string, ...string[]]> extends PgColumnBuilder<\n\tPgVarcharBuilderConfig<TEnum>,\n\t{ length: number | undefined; enumValues: TEnum }\n> {\n\tstatic override readonly [entityKind]: string = 'PgVarcharBuilder';\n\n\tconstructor(name: string, config: PgVarcharConfig<TEnum>) {\n\t\tsuper(name, config.enum?.length ? 'string enum' : 'string', 'PgVarchar');\n\t\tthis.config.length = config.length!;\n\t\tthis.config.enumValues = config.enum as TEnum;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgVarchar(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgVarchar<TEnum extends [string, ...string[]] = [string, ...string[]]>\n\textends PgColumn<Equal<TEnum, [string, ...string[]]> extends true ? 'string' : 'string enum'>\n{\n\tstatic override readonly [entityKind]: string = 'PgVarchar';\n\n\t/** @internal */\n\toverride readonly codec = 'varchar';\n\n\toverride readonly enumValues: TEnum;\n\n\tconstructor(table: PgTable<any>, config: PgVarcharBuilder<TEnum>['config']) {\n\t\tsuper(table, config as any);\n\t\tthis.enumValues = config.enumValues;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.length === undefined ? `varchar` : `varchar(${this.length})`;\n\t}\n}\n\nexport interface PgVarcharConfig<\n\tTEnum extends readonly string[] | string[] | undefined = readonly string[] | string[] | undefined,\n> {\n\tenum?: TEnum;\n\tlength?: number;\n}\n\nexport function varchar(): PgVarcharBuilder;\nexport function varchar(name: string): PgVarcharBuilder;\nexport function varchar(config: { length?: number }): PgVarcharBuilder;\nexport function varchar(name: string, config: { length?: number }): PgVarcharBuilder;\nexport function varchar<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tconfig: PgVarcharConfig<T | Writable<T>> & { enum: T | Writable<T> },\n): PgVarcharBuilder<Writable<T>>;\nexport function varchar<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tname: string,\n\tconfig: PgVarcharConfig<T | Writable<T>> & { enum: T | Writable<T> },\n): PgVarcharBuilder<Writable<T>>;\nexport function varchar(a?: string | PgVarcharConfig, b: PgVarcharConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<PgVarcharConfig>(a, b);\n\treturn new PgVarcharBuilder(name, config as any);\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from '../common.ts';\n\nexport class PgBinaryVectorBuilder extends PgColumnBuilder<\n\t{\n\t\tdataType: 'string binary';\n\t\tdata: string;\n\t\tdriverParam: string;\n\t},\n\t{ length: number; isLengthExact: true }\n> {\n\tstatic override readonly [entityKind]: string = 'PgBinaryVectorBuilder';\n\n\tconstructor(name: string, config: PgBinaryVectorConfig) {\n\t\tsuper(name, 'string binary', 'PgBinaryVector');\n\t\tthis.config.length = config.dimensions;\n\t\tthis.config.isLengthExact = true;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgBinaryVector(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgBinaryVector extends PgColumn<'string binary'> {\n\tstatic override readonly [entityKind]: string = 'PgBinaryVector';\n\n\t/** @internal */\n\toverride readonly codec = 'bit';\n\n\tgetSQLType(): string {\n\t\treturn `bit(${this.length})`;\n\t}\n}\n\nexport interface PgBinaryVectorConfig {\n\tdimensions: number;\n}\n\nexport function bit(\n\tconfig: PgBinaryVectorConfig,\n): PgBinaryVectorBuilder;\nexport function bit(\n\tname: string,\n\tconfig: PgBinaryVectorConfig,\n): PgBinaryVectorBuilder;\nexport function bit(a: string | PgBinaryVectorConfig, b?: PgBinaryVectorConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgBinaryVectorConfig>(a, b);\n\treturn new PgBinaryVectorBuilder(name, config);\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from '../common.ts';\n\nexport class PgHalfVectorBuilder extends PgColumnBuilder<\n\t{\n\t\tdataType: 'array halfvector';\n\t\tdata: number[];\n\t\tdriverParam: string;\n\t},\n\t{ length: number; isLengthExact: true }\n> {\n\tstatic override readonly [entityKind]: string = 'PgHalfVectorBuilder';\n\n\tconstructor(name: string, config: PgHalfVectorConfig) {\n\t\tsuper(name, 'array halfvector', 'PgHalfVector');\n\t\tthis.config.length = config.dimensions;\n\t\tthis.config.isLengthExact = true;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgHalfVector(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgHalfVector extends PgColumn<'array halfvector'> {\n\tstatic override readonly [entityKind]: string = 'PgHalfVector';\n\n\t/** @internal */\n\toverride readonly codec = 'halfvec';\n\n\tgetSQLType(): string {\n\t\treturn `halfvec(${this.length})`;\n\t}\n\n\toverride mapToDriverValue = (value: unknown): unknown => {\n\t\treturn JSON.stringify(value);\n\t};\n}\n\nexport interface PgHalfVectorConfig {\n\tdimensions: number;\n}\n\nexport function halfvec(\n\tconfig: PgHalfVectorConfig,\n): PgHalfVectorBuilder;\nexport function halfvec(\n\tname: string,\n\tconfig: PgHalfVectorConfig,\n): PgHalfVectorBuilder;\nexport function halfvec(a: string | PgHalfVectorConfig, b?: PgHalfVectorConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgHalfVectorConfig>(a, b);\n\treturn new PgHalfVectorBuilder(name, config);\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport type { PgColumnBaseConfig } from '../common.ts';\nimport { PgColumn, PgColumnBuilder } from '../common.ts';\n\nexport class PgSparseVectorBuilder extends PgColumnBuilder<\n\t{\n\t\tdataType: 'string sparsevec';\n\t\tdata: string;\n\t\tdriverParam: string;\n\t},\n\t{ vectorDimensions: number | undefined }\n> {\n\tstatic override readonly [entityKind]: string = 'PgSparseVectorBuilder';\n\n\tconstructor(name: string, config: PgSparseVectorConfig) {\n\t\tsuper(name, 'string sparsevec', 'PgSparseVector');\n\t\tthis.config.vectorDimensions = config.dimensions;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgSparseVector(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgSparseVector\n\textends PgColumn<'string sparsevec', PgColumnBaseConfig<'string sparsevec'>, { vectorDimensions: number | undefined }>\n{\n\tstatic override readonly [entityKind]: string = 'PgSparseVector';\n\n\t/** @internal */\n\toverride readonly codec = 'sparsevec';\n\n\treadonly vectorDimensions = this.config.vectorDimensions;\n\n\tgetSQLType(): string {\n\t\treturn `sparsevec(${this.vectorDimensions})`;\n\t}\n}\n\nexport interface PgSparseVectorConfig {\n\tdimensions: number;\n}\n\nexport function sparsevec(\n\tconfig: PgSparseVectorConfig,\n): PgSparseVectorBuilder;\nexport function sparsevec(\n\tname: string,\n\tconfig: PgSparseVectorConfig,\n): PgSparseVectorBuilder;\nexport function sparsevec(a: string | PgSparseVectorConfig, b?: PgSparseVectorConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgSparseVectorConfig>(a, b);\n\treturn new PgSparseVectorBuilder(name, config);\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from '../common.ts';\n\nexport class PgVectorBuilder extends PgColumnBuilder<\n\t{\n\t\tdataType: 'array vector';\n\t\tdata: number[];\n\t\tdriverParam: string;\n\t},\n\t{ length: number; isLengthExact: true }\n> {\n\tstatic override readonly [entityKind]: string = 'PgVectorBuilder';\n\n\tconstructor(name: string, config: PgVectorConfig) {\n\t\tsuper(name, 'array vector', 'PgVector');\n\t\tthis.config.length = config.dimensions;\n\t\tthis.config.isLengthExact = true;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgVector(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgVector extends PgColumn<'array vector'> {\n\tstatic override readonly [entityKind]: string = 'PgVector';\n\n\t/** @internal */\n\toverride readonly codec = 'vector';\n\n\tgetSQLType(): string {\n\t\treturn `vector(${this.length})`;\n\t}\n\n\toverride mapToDriverValue = (value: unknown): unknown => {\n\t\treturn JSON.stringify(value);\n\t};\n}\n\nexport interface PgVectorConfig {\n\tdimensions: number;\n}\n\nexport function vector(\n\tconfig: PgVectorConfig,\n): PgVectorBuilder;\nexport function vector(\n\tname: string,\n\tconfig: PgVectorConfig,\n): PgVectorBuilder;\nexport function vector(a: string | PgVectorConfig, b?: PgVectorConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgVectorConfig>(a, b);\n\treturn new PgVectorBuilder(name, config);\n}\n","import { bigint } from './bigint.ts';\nimport { bigserial } from './bigserial.ts';\nimport { boolean } from './boolean.ts';\nimport { char } from './char.ts';\nimport { cidr } from './cidr.ts';\nimport { customType } from './custom.ts';\nimport { date } from './date.ts';\nimport { doublePrecision } from './double-precision.ts';\nimport { inet } from './inet.ts';\nimport { integer } from './integer.ts';\nimport { interval } from './interval.ts';\nimport { json } from './json.ts';\nimport { jsonb } from './jsonb.ts';\nimport { line } from './line.ts';\nimport { macaddr } from './macaddr.ts';\nimport { macaddr8 } from './macaddr8.ts';\nimport { numeric } from './numeric.ts';\nimport { point } from './point.ts';\nimport { geometry } from './postgis_extension/geometry.ts';\nimport { real } from './real.ts';\nimport { serial } from './serial.ts';\nimport { smallint } from './smallint.ts';\nimport { smallserial } from './smallserial.ts';\nimport { text } from './text.ts';\nimport { time } from './time.ts';\nimport { timestamp } from './timestamp.ts';\nimport { uuid } from './uuid.ts';\nimport { varchar } from './varchar.ts';\nimport { bit } from './vector_extension/bit.ts';\nimport { halfvec } from './vector_extension/halfvec.ts';\nimport { sparsevec } from './vector_extension/sparsevec.ts';\nimport { vector } from './vector_extension/vector.ts';\n\nexport function getPgColumnBuilders() {\n\treturn {\n\t\tbigint,\n\t\tbigserial,\n\t\tboolean,\n\t\tchar,\n\t\tcidr,\n\t\tcustomType,\n\t\tdate,\n\t\tdoublePrecision,\n\t\tinet,\n\t\tinteger,\n\t\tinterval,\n\t\tjson,\n\t\tjsonb,\n\t\tline,\n\t\tmacaddr,\n\t\tmacaddr8,\n\t\tnumeric,\n\t\tpoint,\n\t\tgeometry,\n\t\treal,\n\t\tserial,\n\t\tsmallint,\n\t\tsmallserial,\n\t\ttext,\n\t\ttime,\n\t\ttimestamp,\n\t\tuuid,\n\t\tvarchar,\n\t\tbit,\n\t\thalfvec,\n\t\tsparsevec,\n\t\tvector,\n\t};\n}\n\nexport type PgColumnsBuilders = ReturnType<typeof getPgColumnBuilders>;\n","export type Casing = 'snake_case' | 'camelCase';\n\nexport function toSnakeCase(input: string) {\n\tconst words = input\n\t\t.replace(/['\\u2019]/g, '')\n\t\t.match(/[\\da-z]+|[A-Z]+(?![a-z])|[A-Z][\\da-z]+/g) ?? [];\n\n\treturn words.map((word) => word.toLowerCase()).join('_');\n}\n\nexport function toCamelCase(input: string) {\n\tconst words = input\n\t\t.replace(/['\\u2019]/g, '')\n\t\t.match(/[\\da-z]+|[A-Z]+(?![a-z])|[A-Z][\\da-z]+/g) ?? [];\n\n\treturn words.reduce((acc, word, i) => {\n\t\tconst formattedWord = i === 0 ? word.toLowerCase() : `${word[0]!.toUpperCase()}${word.slice(1)}`;\n\t\treturn acc + formattedWord;\n\t}, '');\n}\n\nexport function getCasingFn(casing: Casing | undefined) {\n\tif (casing === 'snake_case') return toSnakeCase;\n\tif (casing === 'camelCase') return toCamelCase;\n\treturn (name: string) => name;\n}\n","import { type Casing, getCasingFn } from '~/casing.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { InferModelFromColumns } from '~/table.ts';\nimport { Table, type TableConfig as TableConfigBase, type UpdateTableConfig } from '~/table.ts';\nimport type { CheckBuilder } from './checks.ts';\nimport { getPgColumnBuilders, type PgColumnsBuilders } from './columns/all.ts';\nimport type {\n\tAnyPgColumnBuilder,\n\tExtraConfigColumn,\n\tPgBuildColumns,\n\tPgBuildExtraConfigColumns,\n\tPgColumn,\n\tPgColumnBuilder,\n\tPgColumns,\n} from './columns/common.ts';\nimport type { ForeignKey, ForeignKeyBuilder } from './foreign-keys.ts';\nimport type { AnyIndexBuilder } from './indexes.ts';\nimport type { PgPolicy } from './policies.ts';\nimport type { PrimaryKeyBuilder } from './primary-keys.ts';\nimport type { UniqueConstraintBuilder } from './unique-constraint.ts';\n\nexport type PgTableExtraConfigValue =\n\t| AnyIndexBuilder\n\t| CheckBuilder\n\t| ForeignKeyBuilder\n\t| PrimaryKeyBuilder\n\t| UniqueConstraintBuilder\n\t| PgPolicy;\n\nexport type PgTableExtraConfig = Record<string, PgTableExtraConfigValue>;\n\nexport type TableConfig = TableConfigBase<PgColumns>;\n\n/** @internal */\nexport const InlineForeignKeys = Symbol.for('drizzle:PgInlineForeignKeys');\n/** @internal */\nexport const EnableRLS = Symbol.for('drizzle:EnableRLS');\n\nexport class PgTable<out T extends TableConfig = TableConfig> extends Table<T> {\n\tstatic override readonly [entityKind]: string = 'PgTable';\n\n\t/** @internal */\n\tstatic override readonly Symbol = Object.assign({}, Table.Symbol, {\n\t\tInlineForeignKeys: InlineForeignKeys as typeof InlineForeignKeys,\n\t\tEnableRLS: EnableRLS as typeof EnableRLS,\n\t});\n\n\t/**@internal */\n\t[InlineForeignKeys]: ForeignKey[] = [];\n\n\t/** @internal */\n\t[EnableRLS]: boolean = false;\n\n\t/** @internal */\n\toverride [Table.Symbol.ExtraConfigBuilder]: ((self: Record<string, PgColumn>) => PgTableExtraConfig) | undefined =\n\t\tundefined;\n\n\t/** @internal */\n\toverride [Table.Symbol.ExtraConfigColumns]: Record<string, ExtraConfigColumn> = {};\n}\n\nexport type AnyPgTable<TPartial extends Partial<TableConfig> = {}> = PgTable<UpdateTableConfig<TableConfig, TPartial>>;\n\nexport type PgTableWithColumns<T extends TableConfig> =\n\t& PgTable<T>\n\t& T['columns']\n\t& {\n\t\treadonly $inferSelect: InferModelFromColumns<T['columns'], 'select'>;\n\t\treadonly $inferInsert: InferModelFromColumns<T['columns'], 'insert'>;\n\t}\n\t& {\n\t\t/** @deprecated use `pgTable.withRLS()` instead*/\n\t\tenableRLS: () => Omit<\n\t\t\tPgTableWithColumns<T>,\n\t\t\t'enableRLS'\n\t\t>;\n\t};\n\n/** @internal */\nexport function pgTableWithSchema<\n\tTTableName extends string,\n\tTSchemaName extends string | undefined,\n\tTColumnsMap extends Record<string, AnyPgColumnBuilder>,\n>(\n\tname: TTableName,\n\tcolumns: TColumnsMap | ((columnTypes: PgColumnsBuilders) => TColumnsMap),\n\textraConfig:\n\t\t| ((self: PgBuildExtraConfigColumns<TColumnsMap>) => PgTableExtraConfig | PgTableExtraConfigValue[])\n\t\t| undefined,\n\tschema: TSchemaName,\n\tcasing: Casing | undefined,\n\tbaseName = name,\n): PgTableWithColumns<{\n\tname: TTableName;\n\tschema: TSchemaName;\n\tcolumns: PgBuildColumns<TTableName, TColumnsMap>;\n\tdialect: 'pg';\n}> {\n\tconst casingFn = getCasingFn(casing);\n\tconst rawTable = new PgTable<{\n\t\tname: TTableName;\n\t\tschema: TSchemaName;\n\t\tcolumns: PgBuildColumns<TTableName, TColumnsMap>;\n\t\tdialect: 'pg';\n\t}>(name, schema, baseName);\n\n\tconst parsedColumns: TColumnsMap = typeof columns === 'function' ? columns(getPgColumnBuilders()) : columns;\n\n\tconst builtColumns = Object.fromEntries(\n\t\tObject.entries(parsedColumns).map(([name, colBuilderBase]) => {\n\t\t\tconst colBuilder = colBuilderBase as PgColumnBuilder;\n\t\t\tcolBuilder.setName(name, casingFn);\n\t\t\tconst column = colBuilder.build(rawTable).postBuild();\n\t\t\trawTable[InlineForeignKeys].push(...colBuilder.buildForeignKeys(column, rawTable));\n\t\t\treturn [name, column];\n\t\t}),\n\t) as unknown as PgBuildColumns<TTableName, TColumnsMap>;\n\n\tconst builtColumnsForExtraConfig = Object.fromEntries(\n\t\tObject.entries(parsedColumns).map(([name, colBuilderBase]) => {\n\t\t\tconst colBuilder = colBuilderBase as PgColumnBuilder;\n\t\t\tcolBuilder.setName(name, casingFn);\n\t\t\tconst column = colBuilder.buildExtraConfigColumn(rawTable);\n\t\t\treturn [name, column];\n\t\t}),\n\t) as unknown as PgBuildExtraConfigColumns<TColumnsMap>;\n\n\tconst table = Object.assign(rawTable, builtColumns);\n\n\ttable[Table.Symbol.Columns] = builtColumns;\n\ttable[Table.Symbol.ExtraConfigColumns] = builtColumnsForExtraConfig;\n\n\tif (extraConfig) {\n\t\ttable[PgTable.Symbol.ExtraConfigBuilder] = extraConfig as any;\n\t}\n\n\treturn Object.assign(table, {\n\t\tenableRLS: () => {\n\t\t\ttable[PgTable.Symbol.EnableRLS] = true;\n\t\t\treturn table as PgTableWithColumns<{\n\t\t\t\tname: TTableName;\n\t\t\t\tschema: TSchemaName;\n\t\t\t\tcolumns: PgBuildColumns<TTableName, TColumnsMap>;\n\t\t\t\tdialect: 'pg';\n\t\t\t}>;\n\t\t},\n\t}) as any;\n}\nexport interface PgTableFnInternal<TSchema extends string | undefined = undefined> {\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, AnyPgColumnBuilder>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig?: (\n\t\t\tself: PgBuildExtraConfigColumns<TColumnsMap>,\n\t\t) => PgTableExtraConfigValue[],\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: PgBuildColumns<TTableName, TColumnsMap>;\n\t\tdialect: 'pg';\n\t}>;\n\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, AnyPgColumnBuilder>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: PgColumnsBuilders) => TColumnsMap,\n\t\textraConfig?: (self: PgBuildExtraConfigColumns<TColumnsMap>) => PgTableExtraConfigValue[],\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: PgBuildColumns<TTableName, TColumnsMap>;\n\t\tdialect: 'pg';\n\t}>;\n\t/**\n\t * @deprecated The third parameter of pgTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = pgTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = pgTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, AnyPgColumnBuilder>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig: (\n\t\t\tself: PgBuildExtraConfigColumns<TColumnsMap>,\n\t\t) => PgTableExtraConfig,\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: PgBuildColumns<TTableName, TColumnsMap>;\n\t\tdialect: 'pg';\n\t}>;\n\n\t/**\n\t * @deprecated The third parameter of pgTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = pgTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = pgTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, AnyPgColumnBuilder>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: PgColumnsBuilders) => TColumnsMap,\n\t\textraConfig: (self: PgBuildExtraConfigColumns<TColumnsMap>) => PgTableExtraConfig,\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: PgBuildColumns<TTableName, TColumnsMap>;\n\t\tdialect: 'pg';\n\t}>;\n}\n\nexport interface PgTableFn<TSchema extends string | undefined = undefined> extends PgTableFnInternal<TSchema> {\n\twithRLS: PgTableFnInternal<TSchema>;\n}\n\n/** @internal */\nexport function pgTableWithCasing(casing: Casing | undefined): PgTableFn {\n\tconst pgTableInternal: PgTableFnInternal = (name, columns, extraConfig) => {\n\t\treturn pgTableWithSchema(name, columns, extraConfig, undefined, casing);\n\t};\n\n\tconst pgTableWithRLS: PgTableFn['withRLS'] = (name, columns, extraConfig) => {\n\t\tconst table = pgTableWithSchema(name, columns, extraConfig, undefined, casing);\n\t\ttable[EnableRLS] = true;\n\n\t\treturn table;\n\t};\n\n\treturn Object.assign(pgTableInternal, { withRLS: pgTableWithRLS });\n}\n\nexport const pgTable = pgTableWithCasing(undefined);\n\nexport function pgTableCreator(customizeTableName: (name: string) => string, casing?: Casing | undefined): PgTableFn {\n\tconst fn: PgTableFnInternal = (name, columns, extraConfig) => {\n\t\treturn pgTableWithSchema(customizeTableName(name) as typeof name, columns, extraConfig, undefined, casing, name);\n\t};\n\n\treturn Object.assign(fn, {\n\t\twithRLS: ((name, columns, extraConfig) => {\n\t\t\tconst table = pgTableWithSchema(\n\t\t\t\tcustomizeTableName(name) as typeof name,\n\t\t\t\tcolumns,\n\t\t\t\textraConfig,\n\t\t\t\tundefined,\n\t\t\t\tcasing,\n\t\t\t\tname,\n\t\t\t);\n\t\t\ttable[EnableRLS] = true;\n\n\t\t\treturn table;\n\t\t}) as PgTableFnInternal,\n\t});\n}\n","import { entityKind } from '~/entity.ts';\nimport type { AnyPgColumn, PgColumn } from './columns/index.ts';\nimport { PgTable } from './table.ts';\n\nexport function primaryKey<\n\tTTableName extends string,\n\tTColumn extends AnyPgColumn<{ tableName: TTableName }>,\n\tTColumns extends AnyPgColumn<{ tableName: TTableName }>[],\n>(config: { name?: string; columns: [TColumn, ...TColumns] }): PrimaryKeyBuilder;\n/**\n * @deprecated: Please use primaryKey({ columns: [] }) instead of this function\n * @param columns\n */\nexport function primaryKey<\n\tTTableName extends string,\n\tTColumns extends AnyPgColumn<{ tableName: TTableName }>[],\n>(...columns: TColumns): PrimaryKeyBuilder;\nexport function primaryKey(...config: any) {\n\tif (config[0].columns) {\n\t\treturn new PrimaryKeyBuilder(config[0].columns, config[0].name);\n\t}\n\treturn new PrimaryKeyBuilder(config);\n}\n\nexport class PrimaryKeyBuilder {\n\tstatic readonly [entityKind]: string = 'PgPrimaryKeyBuilder';\n\n\t/** @internal */\n\tcolumns: PgColumn[];\n\n\t/** @internal */\n\tname?: string;\n\n\tconstructor(\n\t\tcolumns: PgColumn[],\n\t\tname?: string,\n\t) {\n\t\tthis.columns = columns;\n\t\tthis.name = name;\n\t}\n\n\t/** @internal */\n\tbuild(table: PgTable): PrimaryKey {\n\t\treturn new PrimaryKey(table, this.columns, this.name);\n\t}\n}\n\nexport class PrimaryKey {\n\tstatic readonly [entityKind]: string = 'PgPrimaryKey';\n\n\treadonly columns: AnyPgColumn<{}>[];\n\treadonly name?: string;\n\treadonly isNameExplicit: boolean;\n\n\tconstructor(readonly table: PgTable, columns: AnyPgColumn<{}>[], name?: string) {\n\t\tthis.columns = columns;\n\t\tthis.name = name;\n\t\tthis.isNameExplicit = !!name;\n\t}\n\n\tgetName(): string {\n\t\treturn this.name ?? `${this.table[PgTable.Symbol.Name]}_${this.columns.map((column) => column.name).join('_')}_pk`;\n\t}\n}\n","import { entityKind, is } from '~/entity.ts';\nimport { SQL } from '~/sql/sql.ts';\nimport { ExtraConfigColumn } from './columns/index.ts';\nimport type { PgColumn } from './columns/index.ts';\nimport { IndexedColumn } from './columns/index.ts';\nimport type { PgTable } from './table.ts';\n\ninterface IndexConfig {\n\tname?: string;\n\n\tcolumns: Partial<IndexedColumn | SQL>[];\n\n\t/**\n\t * If true, the index will be created as `create unique index` instead of `create index`.\n\t */\n\tunique: boolean;\n\n\t/**\n\t * If true, the index will be created as `create index concurrently` instead of `create index`.\n\t */\n\tconcurrently?: boolean;\n\n\t/**\n\t * If true, the index will be created as `create index ... on only <table>` instead of `create index ... on <table>`.\n\t */\n\tonly: boolean;\n\n\t/**\n\t * Condition for partial index.\n\t */\n\twhere?: SQL;\n\n\t/**\n\t * The optional WITH clause specifies storage parameters for the index\n\t */\n\twith?: Record<string, any>;\n\n\t/**\n\t * The optional WITH clause method for the index\n\t */\n\tmethod?: 'btree' | string;\n}\n\nexport type IndexColumn = PgColumn;\n\nexport type PgIndexMethod = 'btree' | 'hash' | 'gist' | 'spgist' | 'gin' | 'brin' | 'hnsw' | 'ivfflat' | (string & {});\n\nexport type PgIndexOpClass =\n\t| 'abstime_ops'\n\t| 'access_method'\n\t| 'anyarray_eq'\n\t| 'anyarray_ge'\n\t| 'anyarray_gt'\n\t| 'anyarray_le'\n\t| 'anyarray_lt'\n\t| 'anyarray_ne'\n\t| 'bigint_ops'\n\t| 'bit_ops'\n\t| 'bool_ops'\n\t| 'box_ops'\n\t| 'bpchar_ops'\n\t| 'char_ops'\n\t| 'cidr_ops'\n\t| 'cstring_ops'\n\t| 'date_ops'\n\t| 'float_ops'\n\t| 'int2_ops'\n\t| 'int4_ops'\n\t| 'int8_ops'\n\t| 'interval_ops'\n\t| 'jsonb_ops'\n\t| 'macaddr_ops'\n\t| 'name_ops'\n\t| 'numeric_ops'\n\t| 'oid_ops'\n\t| 'oidint4_ops'\n\t| 'oidint8_ops'\n\t| 'oidname_ops'\n\t| 'oidvector_ops'\n\t| 'point_ops'\n\t| 'polygon_ops'\n\t| 'range_ops'\n\t| 'record_eq'\n\t| 'record_ge'\n\t| 'record_gt'\n\t| 'record_le'\n\t| 'record_lt'\n\t| 'record_ne'\n\t| 'text_ops'\n\t| 'time_ops'\n\t| 'timestamp_ops'\n\t| 'timestamptz_ops'\n\t| 'timetz_ops'\n\t| 'uuid_ops'\n\t| 'varbit_ops'\n\t| 'varchar_ops'\n\t// pg_vector types\n\t| 'xml_ops'\n\t| 'vector_l2_ops'\n\t| 'vector_ip_ops'\n\t| 'vector_cosine_ops'\n\t| 'vector_l1_ops'\n\t| 'bit_hamming_ops'\n\t| 'bit_jaccard_ops'\n\t| 'halfvec_l2_ops'\n\t| 'sparsevec_l2_op'\n\t| (string & {});\n\nexport class IndexBuilderOn {\n\tstatic readonly [entityKind]: string = 'PgIndexBuilderOn';\n\n\tconstructor(private unique: boolean, private name?: string) {}\n\n\ton(\n\t\t...columns: [Partial<ExtraConfigColumn> | SQL | PgColumn, ...(Partial<ExtraConfigColumn | SQL | PgColumn>)[]]\n\t): IndexBuilder {\n\t\treturn new IndexBuilder(\n\t\t\tcolumns.map((it) => {\n\t\t\t\tif (is(it, SQL)) {\n\t\t\t\t\treturn it;\n\t\t\t\t}\n\n\t\t\t\tif (is(it, ExtraConfigColumn)) {\n\t\t\t\t\tconst clonedIndexedColumn = new IndexedColumn(\n\t\t\t\t\t\tit.name,\n\t\t\t\t\t\t!!it.keyAsName,\n\t\t\t\t\t\tit.columnType!,\n\t\t\t\t\t\tit.indexConfig!,\n\t\t\t\t\t);\n\t\t\t\t\tit.indexConfig = JSON.parse(JSON.stringify(it.defaultConfig));\n\t\t\t\t\treturn clonedIndexedColumn;\n\t\t\t\t}\n\n\t\t\t\tit = it as PgColumn;\n\n\t\t\t\treturn new IndexedColumn(\n\t\t\t\t\tit.name!,\n\t\t\t\t\t!!it.keyAsName,\n\t\t\t\t\tit.columnType!,\n\t\t\t\t\t{},\n\t\t\t\t);\n\t\t\t}),\n\t\t\tthis.unique,\n\t\t\tfalse,\n\t\t\tthis.name,\n\t\t);\n\t}\n\n\tonOnly(\n\t\t...columns: [Partial<ExtraConfigColumn | SQL | PgColumn>, ...Partial<ExtraConfigColumn | SQL | PgColumn>[]]\n\t): IndexBuilder {\n\t\treturn new IndexBuilder(\n\t\t\tcolumns.map((it) => {\n\t\t\t\tif (is(it, SQL)) {\n\t\t\t\t\treturn it;\n\t\t\t\t}\n\n\t\t\t\tif (is(it, ExtraConfigColumn)) {\n\t\t\t\t\tconst clonedIndexedColumn = new IndexedColumn(\n\t\t\t\t\t\tit.name,\n\t\t\t\t\t\t!!it.keyAsName,\n\t\t\t\t\t\tit.columnType!,\n\t\t\t\t\t\tit.indexConfig!,\n\t\t\t\t\t);\n\t\t\t\t\tit.indexConfig = JSON.parse(JSON.stringify(it.defaultConfig));\n\t\t\t\t\treturn clonedIndexedColumn;\n\t\t\t\t}\n\n\t\t\t\tit = it as PgColumn;\n\n\t\t\t\treturn new IndexedColumn(\n\t\t\t\t\tit.name!,\n\t\t\t\t\t!!it.keyAsName,\n\t\t\t\t\tit.columnType!,\n\t\t\t\t\t{},\n\t\t\t\t);\n\t\t\t}),\n\t\t\tthis.unique,\n\t\t\ttrue,\n\t\t\tthis.name,\n\t\t);\n\t}\n\n\t/**\n\t * Specify what index method to use. Choices are `btree`, `hash`, `gist`, `spgist`, `gin`, `brin`, or user-installed access methods like `bloom`. The default method is `btree.\n\t *\n\t * If you have the `pg_vector` extension installed in your database, you can use the `hnsw` and `ivfflat` options, which are predefined types.\n\t *\n\t * **You can always specify any string you want in the method, in case Drizzle doesn't have it natively in its types**\n\t *\n\t * @param method The name of the index method to be used\n\t * @param columns\n\t * @returns\n\t */\n\tusing(\n\t\tmethod: PgIndexMethod,\n\t\t...columns: [Partial<ExtraConfigColumn | SQL | PgColumn>, ...Partial<ExtraConfigColumn | SQL | PgColumn>[]]\n\t): IndexBuilder {\n\t\treturn new IndexBuilder(\n\t\t\tcolumns.map((it) => {\n\t\t\t\tif (is(it, SQL)) {\n\t\t\t\t\treturn it;\n\t\t\t\t}\n\t\t\t\tif (is(it, ExtraConfigColumn)) {\n\t\t\t\t\tconst clonedIndexedColumn = new IndexedColumn(\n\t\t\t\t\t\tit.name,\n\t\t\t\t\t\t!!it.keyAsName,\n\t\t\t\t\t\tit.columnType!,\n\t\t\t\t\t\tit.indexConfig!,\n\t\t\t\t\t);\n\t\t\t\t\tit.indexConfig = JSON.parse(JSON.stringify(it.defaultConfig));\n\t\t\t\t\treturn clonedIndexedColumn;\n\t\t\t\t}\n\n\t\t\t\tit = it as PgColumn;\n\n\t\t\t\treturn new IndexedColumn(\n\t\t\t\t\tit.name!,\n\t\t\t\t\t!!it.keyAsName,\n\t\t\t\t\tit.columnType!,\n\t\t\t\t\t{},\n\t\t\t\t);\n\t\t\t}),\n\t\t\tthis.unique,\n\t\t\ttrue,\n\t\t\tthis.name,\n\t\t\tmethod,\n\t\t);\n\t}\n}\n\nexport interface AnyIndexBuilder {\n\tbuild(table: PgTable): Index;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface IndexBuilder extends AnyIndexBuilder {}\n\nexport class IndexBuilder implements AnyIndexBuilder {\n\tstatic readonly [entityKind]: string = 'PgIndexBuilder';\n\n\t/** @internal */\n\tconfig: IndexConfig;\n\n\tconstructor(\n\t\tcolumns: Partial<IndexedColumn | SQL>[],\n\t\tunique: boolean,\n\t\tonly: boolean,\n\t\tname?: string,\n\t\tmethod: string = 'btree',\n\t) {\n\t\tthis.config = {\n\t\t\tname,\n\t\t\tcolumns,\n\t\t\tunique,\n\t\t\tonly,\n\t\t\tmethod,\n\t\t};\n\t}\n\n\tconcurrently(): this {\n\t\tthis.config.concurrently = true;\n\t\treturn this;\n\t}\n\n\twith(obj: Record<string, any>): this {\n\t\tthis.config.with = obj;\n\t\treturn this;\n\t}\n\n\twhere(condition: SQL): this {\n\t\tthis.config.where = condition;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: PgTable): Index {\n\t\treturn new Index(this.config, table);\n\t}\n}\n\nexport class Index {\n\tstatic readonly [entityKind]: string = 'PgIndex';\n\n\treadonly config: IndexConfig & { table: PgTable };\n\treadonly isNameExplicit: boolean;\n\n\tconstructor(config: IndexConfig, table: PgTable) {\n\t\tthis.config = { ...config, table };\n\t\tthis.isNameExplicit = !!config.name;\n\t}\n}\n\nexport type GetColumnsTableName<TColumns> = TColumns extends PgColumn ? TColumns['_']['name']\n\t: TColumns extends PgColumn[] ? TColumns[number]['_']['name']\n\t: never;\n\nexport function index(name?: string): IndexBuilderOn {\n\treturn new IndexBuilderOn(false, name);\n}\n\nexport function uniqueIndex(name?: string): IndexBuilderOn {\n\treturn new IndexBuilderOn(true, name);\n}\n","import { sql } from \"drizzle-orm\";\nimport { pgTable, text, timestamp, uuid } from \"drizzle-orm/pg-core\";\n\nexport const userTable = pgTable(\"user\", {\n\tid: uuid(\"id\").primaryKey().default(sql`uuidv7()`),\n\temail: text(\"email\").notNull().unique(),\n\tpasswordHash: text(\"password_hash\"),\n\tdisplayName: text(\"display_name\"),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n});\n\nexport type User = typeof userTable.$inferSelect;\nexport type NewUser = typeof userTable.$inferInsert;\n","import { sql } from \"drizzle-orm\";\nimport { pgTable, text, timestamp, uniqueIndex, uuid } from \"drizzle-orm/pg-core\";\nimport { userTable } from \"./user\";\n\nexport const deviceTable = pgTable(\n\t\"device\",\n\t{\n\t\tid: uuid(\"id\").primaryKey().default(sql`uuidv7()`),\n\t\tuserId: uuid(\"user_id\")\n\t\t\t.notNull()\n\t\t\t.references(() => userTable.id, { onDelete: \"cascade\" }),\n\t\tname: text(\"name\").notNull(),\n\t\tsessionKeySalt: text(\"session_key_salt\").notNull().default(sql`encode(gen_random_bytes(32), 'hex')`),\n\t\tfirstSeen: timestamp(\"first_seen\", { withTimezone: true }).notNull().defaultNow(),\n\t\tlastSeen: timestamp(\"last_seen\", { withTimezone: true }).notNull().defaultNow(),\n\t},\n\t(table) => ({\n\t\tuserNameIdx: uniqueIndex(\"device_user_id_name_idx\").on(table.userId, table.name),\n\t}),\n);\n\nexport type Device = typeof deviceTable.$inferSelect;\nexport type NewDevice = typeof deviceTable.$inferInsert;\n","import { numeric, pgTable, primaryKey, text, timestamp } from \"drizzle-orm/pg-core\";\n\nexport const modelPriceTable = pgTable(\n\t\"model_price\",\n\t{\n\t\tprovider: text(\"provider\").notNull(),\n\t\tmodel: text(\"model\").notNull(),\n\t\tinputPerMillion: numeric(\"input_per_million\", { precision: 12, scale: 6 }),\n\t\toutputPerMillion: numeric(\"output_per_million\", { precision: 12, scale: 6 }),\n\t\tcacheReadPerMillion: numeric(\"cache_read_per_million\", { precision: 12, scale: 6 }),\n\t\tcacheWritePerMillion: numeric(\"cache_write_per_million\", { precision: 12, scale: 6 }),\n\t\tfetchedAt: timestamp(\"fetched_at\", { withTimezone: true }).notNull().defaultNow(),\n\t},\n\t(table) => ({\n\t\tpk: primaryKey({ columns: [table.provider, table.model] }),\n\t}),\n);\n\nexport type ModelPrice = typeof modelPriceTable.$inferSelect;\nexport type NewModelPrice = typeof modelPriceTable.$inferInsert;\n","import { sql } from \"drizzle-orm\";\nimport { pgTable, timestamp, uuid } from \"drizzle-orm/pg-core\";\nimport { userTable } from \"./user\";\n\nexport const sessionTable = pgTable(\"session\", {\n\tid: uuid(\"id\").primaryKey().default(sql`uuidv7()`),\n\tuserId: uuid(\"user_id\")\n\t\t.notNull()\n\t\t.references(() => userTable.id, { onDelete: \"cascade\" }),\n\texpiresAt: timestamp(\"expires_at\", { withTimezone: true }).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n});\n\nexport type Session = typeof sessionTable.$inferSelect;\nexport type NewSession = typeof sessionTable.$inferInsert;\n","import { bigint, index, integer, pgTable, primaryKey, text, timestamp, uuid } from \"drizzle-orm/pg-core\";\nimport { deviceTable } from \"./device\";\nimport { userTable } from \"./user\";\n\nexport const usageHourTable = pgTable(\n\t\"usage_hour\",\n\t{\n\t\tuserId: uuid(\"user_id\")\n\t\t\t.notNull()\n\t\t\t.references(() => userTable.id, { onDelete: \"cascade\" }),\n\t\tdeviceId: uuid(\"device_id\")\n\t\t\t.notNull()\n\t\t\t.references(() => deviceTable.id, { onDelete: \"cascade\" }),\n\t\tharness: text(\"harness\").notNull(),\n\t\tmodel: text(\"model\").notNull(),\n\t\thourUtc: timestamp(\"hour_utc\", { withTimezone: true }).notNull(),\n\t\tinputTokens: bigint(\"input_tokens\", { mode: \"number\" }).notNull().default(0),\n\t\toutputTokens: bigint(\"output_tokens\", { mode: \"number\" }).notNull().default(0),\n\t\tcacheReadTokens: bigint(\"cache_read_tokens\", { mode: \"number\" }).notNull().default(0),\n\t\tcacheCreateTokens: bigint(\"cache_create_tokens\", { mode: \"number\" }).notNull().default(0),\n\t\tsessionCount: integer(\"session_count\").notNull().default(0),\n\t\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n\t},\n\t(table) => ({\n\t\tpk: primaryKey({\n\t\t\tcolumns: [table.userId, table.deviceId, table.harness, table.model, table.hourUtc],\n\t\t}),\n\t\thourIdx: index(\"usage_hour_hour_utc_idx\").on(table.hourUtc),\n\t\tuserHourIdx: index(\"usage_hour_user_hour_idx\").on(table.userId, table.hourUtc),\n\t}),\n);\n\nexport type UsageHour = typeof usageHourTable.$inferSelect;\nexport type NewUsageHour = typeof usageHourTable.$inferInsert;\n","import { index, pgTable, primaryKey, text, timestamp, uuid } from \"drizzle-orm/pg-core\";\nimport { deviceTable } from \"./device\";\nimport { userTable } from \"./user\";\n\nexport const usageSessionTable = pgTable(\n\t\"usage_session\",\n\t{\n\t\tuserId: uuid(\"user_id\")\n\t\t\t.notNull()\n\t\t\t.references(() => userTable.id, { onDelete: \"cascade\" }),\n\t\tdeviceId: uuid(\"device_id\")\n\t\t\t.notNull()\n\t\t\t.references(() => deviceTable.id, { onDelete: \"cascade\" }),\n\t\tharness: text(\"harness\").notNull(),\n\t\tsessionKey: text(\"session_key\").notNull(),\n\t\tstartedAt: timestamp(\"started_at\", { withTimezone: true }).notNull(),\n\t\tlastSeenAt: timestamp(\"last_seen_at\", { withTimezone: true }).notNull(),\n\t\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n\t},\n\t(table) => ({\n\t\tpk: primaryKey({\n\t\t\tcolumns: [table.userId, table.deviceId, table.harness, table.sessionKey],\n\t\t}),\n\t\tstartedAtIdx: index(\"usage_session_started_at_idx\").on(table.startedAt),\n\t\tuserStartedAtIdx: index(\"usage_session_user_started_at_idx\").on(table.userId, table.startedAt),\n\t\tdeviceStartedAtIdx: index(\"usage_session_device_started_at_idx\").on(table.deviceId, table.startedAt),\n\t}),\n);\n\nexport type UsageSession = typeof usageSessionTable.$inferSelect;\nexport type NewUsageSession = typeof usageSessionTable.$inferInsert;\n","// biome-ignore lint/nursery/noExcessiveClassesPerFile: Shared migration error vocabulary belongs in one module.\nimport { Schema } from \"effect\";\n\nconst ErrorFields = {\n\tmessage: Schema.String,\n};\n\nexport class UnauthorizedError extends Schema.TaggedErrorClass<UnauthorizedError>()(\"UnauthorizedError\", ErrorFields) {}\n\nexport class ForbiddenError extends Schema.TaggedErrorClass<ForbiddenError>()(\"ForbiddenError\", ErrorFields) {}\n\nexport class NotFoundError extends Schema.TaggedErrorClass<NotFoundError>()(\"NotFoundError\", ErrorFields) {}\n\nexport class ConflictError extends Schema.TaggedErrorClass<ConflictError>()(\"ConflictError\", ErrorFields) {}\n\nexport class ValidationError extends Schema.TaggedErrorClass<ValidationError>()(\"ValidationError\", ErrorFields) {}\n\nexport class RateLimitedError extends Schema.TaggedErrorClass<RateLimitedError>()(\"RateLimitedError\", ErrorFields) {}\n\nexport class ExternalHttpError extends Schema.TaggedErrorClass<ExternalHttpError>()(\"ExternalHttpError\", ErrorFields) {}\n\nexport class DatabaseError extends Schema.TaggedErrorClass<DatabaseError>()(\"DatabaseError\", ErrorFields) {}\n\nexport class AppConfigError extends Schema.TaggedErrorClass<AppConfigError>()(\"AppConfigError\", ErrorFields) {}\n\nexport class PricingRefreshError extends Schema.TaggedErrorClass<PricingRefreshError>()(\n\t\"PricingRefreshError\",\n\tErrorFields,\n) {}\n\nexport class ParserSourceError extends Schema.TaggedErrorClass<ParserSourceError>()(\"ParserSourceError\", ErrorFields) {}\n\nexport class SyncQuotaExceededError extends Schema.TaggedErrorClass<SyncQuotaExceededError>()(\n\t\"SyncQuotaExceededError\",\n\tErrorFields,\n) {}\n\nexport class SyncTimestampRejectedError extends Schema.TaggedErrorClass<SyncTimestampRejectedError>()(\n\t\"SyncTimestampRejectedError\",\n\tErrorFields,\n) {}\n","import { randomBytes } from \"node:crypto\";\n// biome-ignore lint/correctness/noUnresolvedImports: argon2 is a native addon resolved at runtime\nimport argon2 from \"argon2\";\n\nconst ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\nconst BRAND_PREFIX = \"oopst_\";\nconst BODY_LENGTH = 32;\nconst PREFIX_LENGTH = 6;\nconst MEMORY_COST = 65_536;\n\nconst HASH_OPTIONS = {\n\ttype: argon2.argon2id,\n\tmemoryCost: MEMORY_COST,\n\ttimeCost: 3,\n\tparallelism: 1,\n} as const;\n\ntype GeneratedToken = {\n\ttoken: string;\n\tprefix: string;\n\thash: Promise<string>;\n};\n\nfunction randomBase62(length: number): string {\n\tconst bytes = randomBytes(length);\n\tlet out = \"\";\n\tfor (let i = 0; i < length; i += 1) {\n\t\t// biome-ignore lint/style/noNonNullAssertion: buffer index is bounded by length\n\t\tout += ALPHABET[bytes[i]! % ALPHABET.length] ?? \"\";\n\t}\n\treturn out;\n}\n\nfunction generateToken(): GeneratedToken {\n\tconst body = randomBase62(BODY_LENGTH);\n\tconst token = `${BRAND_PREFIX}${body}`;\n\tconst prefix = body.slice(0, PREFIX_LENGTH);\n\treturn {\n\t\ttoken: token,\n\t\tprefix: prefix,\n\t\thash: argon2.hash(token, HASH_OPTIONS),\n\t};\n}\n\n// biome-ignore lint/suspicious/useAwait: async for consistent Promise return type\nasync function hashToken(plain: string): Promise<string> {\n\treturn argon2.hash(plain, HASH_OPTIONS);\n}\n\nasync function verifyToken(plain: string, hash: string): Promise<boolean> {\n\ttry {\n\t\treturn await argon2.verify(hash, plain);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction extractPrefix(token: string): string | null {\n\tif (!token.startsWith(BRAND_PREFIX)) {\n\t\treturn null;\n\t}\n\tconst body = token.slice(BRAND_PREFIX.length);\n\tif (body.length !== BODY_LENGTH) {\n\t\treturn null;\n\t}\n\treturn body.slice(0, PREFIX_LENGTH);\n}\n\nexport type { GeneratedToken };\nexport { extractPrefix, generateToken, hashToken, verifyToken };\n","import { sql } from \"drizzle-orm\";\n\n/**\n * SQL fragment that computes USD cost for one row of `usage_hour uh`, expecting\n * `model_price mp` to be joined with `priceJoinCondition`.\n *\n * Any null per-million component contributes 0 via coalesce on the outer sum,\n * matching `computeCost` in @oopst/pricing.\n */\nconst costExpr = sql<number>`\n coalesce(\n (\n case\n when mp.provider = 'openai' then greatest(uh.input_tokens::numeric - uh.cache_read_tokens::numeric, 0)\n else uh.input_tokens::numeric\n end\n ) * mp.input_per_million / 1000000,\n 0\n )\n + coalesce(uh.output_tokens::numeric * mp.output_per_million / 1000000, 0)\n + coalesce(uh.cache_read_tokens::numeric * mp.cache_read_per_million / 1000000, 0)\n + coalesce(uh.cache_create_tokens::numeric * mp.cache_write_per_million / 1000000, 0)\n`;\n\nfunction priceProviderExpr(harnessExpr = sql`uh.harness`, modelExpr = sql`uh.model`): ReturnType<typeof sql<string>> {\n\treturn sql<string>`case\n when ${harnessExpr} = 'codex' then 'openai'\n when ${harnessExpr} = 'claude_code' then 'anthropic'\n when ${harnessExpr} in ('pi', 'hermes', 'opencode')\n and position('/' in ${modelExpr}) > 0\n and split_part(${modelExpr}, '/', 1) = 'openai-codex'\n then 'openai'\n when ${harnessExpr} in ('pi', 'hermes', 'opencode') and position('/' in ${modelExpr}) > 0\n then split_part(${modelExpr}, '/', 1)\n end`;\n}\n\nfunction priceModelExpr(harnessExpr = sql`uh.harness`, modelExpr = sql`uh.model`): ReturnType<typeof sql<string>> {\n\treturn sql<string>`case\n when ${harnessExpr} in ('pi', 'hermes', 'opencode') and position('/' in ${modelExpr}) > 0\n then substring(${modelExpr} from position('/' in ${modelExpr}) + 1)\n else ${modelExpr}\n\tend`;\n}\n\nfunction canonicalModelExpr(harnessExpr = sql`uh.harness`, modelExpr = sql`uh.model`): ReturnType<typeof sql<string>> {\n\treturn sql<string>`case\n when ${harnessExpr} in ('pi', 'hermes', 'opencode')\n and position('/' in ${modelExpr}) > 0\n and ${priceProviderExpr(harnessExpr, modelExpr)} = 'openai'\n then ${priceModelExpr(harnessExpr, modelExpr)}\n when ${harnessExpr} in ('pi', 'hermes', 'opencode') and position('/' in ${modelExpr}) > 0\n then ${priceProviderExpr(harnessExpr, modelExpr)} || '/' || ${priceModelExpr(harnessExpr, modelExpr)}\n else ${modelExpr}\n end`;\n}\n\nconst priceJoinCondition = sql`\n mp.provider = ${priceProviderExpr()}\n and mp.model = ${priceModelExpr()}\n`;\n\nexport { canonicalModelExpr, costExpr, priceJoinCondition, priceModelExpr, priceProviderExpr };\n","import type { DbClient } from \"@oopst/db\";\nimport { Context, Effect, Layer, Schema } from \"effect\";\nimport { Rpc, RpcGroup } from \"effect/unstable/rpc\";\nimport type { SessionContext } from \"../context\";\nimport { DatabaseError, UnauthorizedError } from \"../errors\";\nimport { updateProfileInput } from \"../schemas/auth\";\nimport { AuthService, AuthServiceLive } from \"../services/auth\";\n\nconst AuthUserResponse = Schema.Struct({\n\tuser: Schema.Struct({\n\t\tid: Schema.String,\n\t\temail: Schema.String,\n\t\tdisplayName: Schema.NullOr(Schema.String),\n\t\tcreatedAt: Schema.Date,\n\t}),\n});\n\nconst LogoutResponse = Schema.Struct({\n\tok: Schema.Boolean,\n});\n\ntype WebRpcContextShape = {\n\treadonly db?: DbClient;\n\treadonly session: SessionContext;\n};\n\nclass WebRpcContext extends Context.Service<WebRpcContext, WebRpcContextShape>()(\"@oopst/api/WebRpcContext\") {}\n\nconst missingDbError = (): DatabaseError => new DatabaseError({ message: \"Web RPC database context required\" });\n\nfunction requireDb(context: WebRpcContextShape): Effect.Effect<DbClient, DatabaseError> {\n\treturn context.db ? Effect.succeed(context.db) : Effect.fail(missingDbError());\n}\n\nconst AuthRpcs = RpcGroup.make(\n\tRpc.make(\"auth.logout\", {\n\t\tsuccess: LogoutResponse,\n\t\terror: Schema.Union([DatabaseError, UnauthorizedError]),\n\t}),\n\tRpc.make(\"auth.me\", {\n\t\tsuccess: AuthUserResponse,\n\t\terror: UnauthorizedError,\n\t}),\n\tRpc.make(\"auth.updateProfile\", {\n\t\tpayload: updateProfileInput,\n\t\tsuccess: AuthUserResponse,\n\t\terror: Schema.Union([DatabaseError, UnauthorizedError]),\n\t}),\n);\n\nconst AuthRpcHandlers = AuthRpcs.toLayer({\n\t\"auth.logout\": () =>\n\t\tEffect.gen(function* () {\n\t\t\tconst context = yield* WebRpcContext;\n\t\t\tconst db = yield* requireDb(context);\n\t\t\tconst service = yield* AuthService;\n\t\t\treturn yield* service.logout({ db: db, sessionId: context.session.id });\n\t\t}),\n\t\"auth.me\": () =>\n\t\tEffect.gen(function* () {\n\t\t\tconst context = yield* WebRpcContext;\n\t\t\tconst service = yield* AuthService;\n\t\t\treturn yield* service.me({ session: context.session });\n\t\t}),\n\t\"auth.updateProfile\": (input) =>\n\t\tEffect.gen(function* () {\n\t\t\tconst context = yield* WebRpcContext;\n\t\t\tconst db = yield* requireDb(context);\n\t\t\tconst service = yield* AuthService;\n\t\t\treturn yield* service.updateProfile({\n\t\t\t\tdb: db,\n\t\t\t\tdisplayName: input.displayName,\n\t\t\t\tuserId: context.session.user.id,\n\t\t\t});\n\t\t}),\n}).pipe(Layer.provide(AuthServiceLive));\n\nexport { AuthRpcHandlers, AuthRpcs, AuthUserResponse, LogoutResponse, WebRpcContext };\n","import { Schema, SchemaGetter } from \"effect\";\n\nconst MAX_DISPLAY_NAME_LENGTH = 80;\n\nconst displayNameInput = Schema.String.check(Schema.isMaxLength(MAX_DISPLAY_NAME_LENGTH)).pipe(\n\tSchema.decodeTo(Schema.NullOr(Schema.String), {\n\t\tdecode: SchemaGetter.transform((value: string) => {\n\t\t\tconst trimmed = value.trim();\n\t\t\treturn trimmed.length === 0 ? null : trimmed;\n\t\t}),\n\t\tencode: SchemaGetter.transform((value: string | null) => value ?? \"\"),\n\t}),\n);\n\nconst updateProfileInput = Schema.Struct({\n\tdisplayName: displayNameInput,\n});\ntype UpdateProfileInput = typeof updateProfileInput.Type;\n\nexport type { UpdateProfileInput };\nexport { updateProfileInput };\n","import type { DbClient } from \"@oopst/db\";\nimport type { User } from \"@oopst/db/schema\";\nimport { userTable } from \"@oopst/db/schema\";\nimport { eq } from \"drizzle-orm\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { deleteSession } from \"../auth/sessions\";\nimport type { SessionContext } from \"../context\";\nimport { DatabaseError } from \"../errors\";\n\ntype AuthUserOutput = {\n\treadonly user: {\n\t\treadonly id: User[\"id\"];\n\t\treadonly email: User[\"email\"];\n\t\treadonly displayName: User[\"displayName\"];\n\t\treadonly createdAt: User[\"createdAt\"];\n\t};\n};\n\ntype LogoutCommand = {\n\treadonly db: DbClient;\n\treadonly sessionId: string;\n};\n\ntype UpdateProfileCommand = {\n\treadonly db: DbClient;\n\treadonly userId: string;\n\treadonly displayName: string | null;\n};\n\ntype AuthServiceShape = {\n\treadonly logout: (input: LogoutCommand) => Effect.Effect<{ readonly ok: true }, DatabaseError>;\n\treadonly me: (input: { readonly session: SessionContext }) => Effect.Effect<AuthUserOutput>;\n\treadonly updateProfile: (input: UpdateProfileCommand) => Effect.Effect<AuthUserOutput, DatabaseError>;\n};\n\nclass AuthService extends Context.Service<AuthService, AuthServiceShape>()(\"@oopst/api/AuthService\") {}\n\nconst databaseError = (err: unknown): DatabaseError =>\n\tnew DatabaseError({ message: err instanceof Error ? err.message : \"Auth database operation failed\" });\n\nconst failedUpdateProfileError = (): DatabaseError => new DatabaseError({ message: \"Failed to update profile\" });\n\nfunction toAuthUserOutput(user: Pick<User, \"id\" | \"email\" | \"displayName\" | \"createdAt\">): AuthUserOutput {\n\treturn {\n\t\tuser: {\n\t\t\tid: user.id,\n\t\t\temail: user.email,\n\t\t\tdisplayName: user.displayName,\n\t\t\tcreatedAt: user.createdAt,\n\t\t},\n\t};\n}\n\nfunction normalizeDisplayName(displayName: string | null): string | null {\n\tif (displayName === null) {\n\t\treturn null;\n\t}\n\tconst trimmed = displayName.trim();\n\treturn trimmed.length === 0 ? null : trimmed;\n}\n\nconst makeAuthService = (): AuthServiceShape => ({\n\tlogout: (input) =>\n\t\tEffect.tryPromise({\n\t\t\ttry: async () => {\n\t\t\t\tawait deleteSession(input.db, input.sessionId);\n\t\t\t\treturn { ok: true as const };\n\t\t\t},\n\t\t\tcatch: databaseError,\n\t\t}),\n\n\tme: (input) => Effect.succeed(toAuthUserOutput(input.session.user)),\n\n\tupdateProfile: (input) =>\n\t\tEffect.gen(function* () {\n\t\t\tconst row = yield* Effect.tryPromise({\n\t\t\t\ttry: async () => {\n\t\t\t\t\tconst [updated] = await input.db\n\t\t\t\t\t\t.update(userTable)\n\t\t\t\t\t\t.set({ displayName: normalizeDisplayName(input.displayName) })\n\t\t\t\t\t\t.where(eq(userTable.id, input.userId))\n\t\t\t\t\t\t.returning({\n\t\t\t\t\t\t\tid: userTable.id,\n\t\t\t\t\t\t\temail: userTable.email,\n\t\t\t\t\t\t\tdisplayName: userTable.displayName,\n\t\t\t\t\t\t\tcreatedAt: userTable.createdAt,\n\t\t\t\t\t\t});\n\t\t\t\t\treturn updated;\n\t\t\t\t},\n\t\t\t\tcatch: databaseError,\n\t\t\t});\n\t\t\tif (!row) {\n\t\t\t\treturn yield* Effect.fail(failedUpdateProfileError());\n\t\t\t}\n\t\t\treturn toAuthUserOutput(row);\n\t\t}),\n});\n\nconst AuthServiceLive = Layer.succeed(AuthService, makeAuthService());\n\nexport type { LogoutCommand, UpdateProfileCommand };\nexport { AuthService, AuthServiceLive };\n","import { Schema } from \"effect\";\nimport { Rpc, RpcGroup } from \"effect/unstable/rpc\";\nimport { ConflictError, DatabaseError, NotFoundError, UnauthorizedError } from \"../errors\";\nimport { renameDeviceInput, renameDeviceOutput } from \"../schemas/devices\";\n\nconst DevicesRpcs = RpcGroup.make(\n\tRpc.make(\"devices.rename\", {\n\t\tpayload: renameDeviceInput,\n\t\tsuccess: renameDeviceOutput,\n\t\terror: Schema.Union([ConflictError, DatabaseError, NotFoundError, UnauthorizedError]),\n\t}),\n);\n\nexport { DevicesRpcs };\n","import { Schema } from \"effect\";\nimport { isoUtcString } from \"./common\";\n\nconst MIN_DEVICE_NAME_LENGTH = 1;\nconst MAX_DEVICE_NAME_LENGTH = 80;\nconst UUID_V7_VERSION = 7;\n\nconst deviceNameSchema = Schema.String.check(\n\tSchema.isMinLength(MIN_DEVICE_NAME_LENGTH),\n\tSchema.isMaxLength(MAX_DEVICE_NAME_LENGTH),\n);\nconst editableDeviceNameSchema = Schema.Trim.check(\n\tSchema.isMinLength(MIN_DEVICE_NAME_LENGTH),\n\tSchema.isMaxLength(MAX_DEVICE_NAME_LENGTH),\n);\nconst deviceIdSchema = Schema.String.check(Schema.isUUID(UUID_V7_VERSION));\n\nconst renameDeviceInput = Schema.Struct({\n\tid: deviceIdSchema,\n\tname: editableDeviceNameSchema,\n});\ntype RenameDeviceInput = typeof renameDeviceInput.Type;\n\nconst renameDeviceOutput = Schema.Struct({\n\tid: deviceIdSchema,\n\tname: Schema.String,\n\tlastSeen: isoUtcString,\n});\ntype RenameDeviceOutput = typeof renameDeviceOutput.Type;\n\nexport type { RenameDeviceInput, RenameDeviceOutput };\nexport { deviceNameSchema, renameDeviceInput, renameDeviceOutput };\n","import { Schema } from \"effect\";\n\nconst ISO_UTC_PATTERN = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/u;\nconst CIVIL_DATE_PATTERN = /^\\d{4}-\\d{2}-\\d{2}$/u;\nconst HEX64_PATTERN = /^[0-9a-f]{64}$/u;\nconst YEAR_START = 0;\nconst YEAR_END = 4;\nconst MONTH_START = 5;\nconst MONTH_END = 7;\nconst DAY_START = 8;\nconst DAY_END = 10;\nconst UUID_V7_VERSION = 7;\n\nconst isExactUtcInstant = (value: string): boolean => {\n\tif (!ISO_UTC_PATTERN.test(value)) {\n\t\treturn false;\n\t}\n\n\tconst date = new Date(value);\n\treturn !Number.isNaN(date.getTime()) && date.toISOString() === value;\n};\n\nconst isCivilDate = (value: string): boolean => {\n\tconst match = CIVIL_DATE_PATTERN.exec(value);\n\tif (match === null) {\n\t\treturn false;\n\t}\n\n\tconst year = Number(value.slice(YEAR_START, YEAR_END));\n\tconst month = Number(value.slice(MONTH_START, MONTH_END));\n\tconst day = Number(value.slice(DAY_START, DAY_END));\n\tconst date = new Date(Date.UTC(year, month - 1, day));\n\treturn date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day;\n};\n\nconst isIanaTimezone = (value: string): boolean => {\n\ttry {\n\t\tnew Intl.DateTimeFormat(\"en-US\", { timeZone: value }).format(new Date(0));\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n};\n\nconst isApiUrl = (value: string): boolean => {\n\ttry {\n\t\tconst url = new URL(value);\n\t\treturn url.protocol === \"http:\" || url.protocol === \"https:\";\n\t} catch {\n\t\treturn false;\n\t}\n};\n\nexport const nonEmptyTrimmedString = Schema.String.check(\n\tSchema.isTrimmed(),\n\tSchema.isNonEmpty({ message: \"Expected a non-empty string\" }),\n);\n\nexport const boundedString = (name: string, maxLength: number): typeof Schema.String =>\n\tSchema.String.check(Schema.isMaxLength(maxLength, { message: `${name} must be at most ${maxLength} characters` }));\n\nexport const safeInteger = Schema.Number.check(\n\tSchema.isInt(),\n\tSchema.isBetween({ minimum: Number.MIN_SAFE_INTEGER, maximum: Number.MAX_SAFE_INTEGER }),\n);\n\nexport const nonNegativeSafeInteger = safeInteger.check(Schema.isGreaterThanOrEqualTo(0));\n\nexport const isoUtcString = Schema.String.check(\n\tSchema.makeFilter(isExactUtcInstant, { expected: \"an ISO-8601 UTC timestamp with millisecond precision\" }),\n);\n\nexport const civilDate = Schema.String.check(\n\tSchema.makeFilter(isCivilDate, { expected: \"a valid calendar date formatted as YYYY-MM-DD\" }),\n);\n\nexport const ianaTimezone = Schema.String.check(\n\tSchema.makeFilter(isIanaTimezone, { expected: \"an IANA timezone identifier\" }),\n);\n\nexport const uuidV7 = Schema.String.check(Schema.isUUID(UUID_V7_VERSION)).pipe(Schema.brand(\"UuidV7\"));\n\nexport const generalUuid = Schema.String.check(Schema.isUUID()).pipe(Schema.brand(\"GeneralUuid\"));\n\nexport const hex64 = Schema.String.check(\n\tSchema.isPattern(HEX64_PATTERN, { expected: \"a 64-character lowercase hex string\" }),\n);\n\nexport const apiUrl = Schema.String.check(Schema.makeFilter(isApiUrl, { expected: \"an HTTP(S) URL\" }));\n\nexport type UuidV7 = typeof uuidV7.Type;\nexport type GeneralUuid = typeof generalUuid.Type;\n","import { AuthRpcs } from \"./auth\";\nimport { DevicesRpcs } from \"./devices\";\nimport { StatsRpcs } from \"./stats\";\nimport { TokensRpcs } from \"./tokens\";\n\nconst WebRpcs = AuthRpcs.merge(StatsRpcs).merge(TokensRpcs).merge(DevicesRpcs);\n\nexport { WebRpcs };\n","import { Schema } from \"effect\";\nimport { Rpc, RpcGroup } from \"effect/unstable/rpc\";\nimport { DatabaseError, UnauthorizedError } from \"../errors\";\nimport {\n\tdailyCostInput,\n\tdailyCostOutput,\n\tdailySessionsInput,\n\tdailySessionsOutput,\n\tdevicesOutput,\n\thourlySessionsInput,\n\thourlySessionsOutput,\n\tleaderboardInput,\n\tleaderboardOutput,\n\tparticipantsOutput,\n\tsummaryInput,\n\tsummaryOutput,\n\ttopDimensionsInput,\n\ttopDimensionsOutput,\n\tusageDetailsInput,\n\tusageDetailsOutput,\n\tweekdaySessionsInput,\n\tweekdaySessionsOutput,\n} from \"../schemas/stats\";\n\nconst StatsRpcs = RpcGroup.make(\n\tRpc.make(\"stats.devices\", {\n\t\tsuccess: devicesOutput,\n\t\terror: Schema.Union([DatabaseError, UnauthorizedError]),\n\t}),\n\tRpc.make(\"stats.participants\", {\n\t\tsuccess: participantsOutput,\n\t\terror: Schema.Union([DatabaseError, UnauthorizedError]),\n\t}),\n\tRpc.make(\"stats.leaderboard\", {\n\t\tpayload: leaderboardInput,\n\t\tsuccess: leaderboardOutput,\n\t\terror: Schema.Union([DatabaseError, UnauthorizedError]),\n\t}),\n\tRpc.make(\"stats.topDimensions\", {\n\t\tpayload: topDimensionsInput,\n\t\tsuccess: topDimensionsOutput,\n\t\terror: Schema.Union([DatabaseError, UnauthorizedError]),\n\t}),\n\tRpc.make(\"stats.summary\", {\n\t\tpayload: summaryInput,\n\t\tsuccess: summaryOutput,\n\t\terror: Schema.Union([DatabaseError, UnauthorizedError]),\n\t}),\n\tRpc.make(\"stats.dailyCost\", {\n\t\tpayload: dailyCostInput,\n\t\tsuccess: dailyCostOutput,\n\t\terror: Schema.Union([DatabaseError, UnauthorizedError]),\n\t}),\n\tRpc.make(\"stats.dailySessions\", {\n\t\tpayload: dailySessionsInput,\n\t\tsuccess: dailySessionsOutput,\n\t\terror: Schema.Union([DatabaseError, UnauthorizedError]),\n\t}),\n\tRpc.make(\"stats.weekdaySessions\", {\n\t\tpayload: weekdaySessionsInput,\n\t\tsuccess: weekdaySessionsOutput,\n\t\terror: Schema.Union([DatabaseError, UnauthorizedError]),\n\t}),\n\tRpc.make(\"stats.hourlySessions\", {\n\t\tpayload: hourlySessionsInput,\n\t\tsuccess: hourlySessionsOutput,\n\t\terror: Schema.Union([DatabaseError, UnauthorizedError]),\n\t}),\n\tRpc.make(\"stats.usageDetails\", {\n\t\tpayload: usageDetailsInput,\n\t\tsuccess: usageDetailsOutput,\n\t\terror: Schema.Union([DatabaseError, UnauthorizedError]),\n\t}),\n);\n\nexport { StatsRpcs };\n","import { Effect, Schema } from \"effect\";\nimport { civilDate, ianaTimezone, isoUtcString, nonNegativeSafeInteger, safeInteger } from \"./common\";\n\n/**\n * Whether the caller wants org-wide totals ('all') or only their own data ('me').\n * Harness and model cost stacking are supported for both scopes; device stacking is scoped to 'me'.\n */\nconst scopeEnum = Schema.Literals([\"all\", \"me\"]);\ntype Scope = typeof scopeEnum.Type;\n\n/**\n * Optional so 'undefined' collapses every stack dimension into one row per day with\n * seriesName = null.\n */\nconst costStackByValueEnum = Schema.Literals([\"device\", \"harness\", \"model\"]);\nconst costStackByEnum = Schema.optional(costStackByValueEnum);\ntype CostStackBy = typeof costStackByEnum.Type;\n\nconst usageDetailStackByEnum = Schema.Literals([\"device\", \"harness\", \"model\"]);\ntype UsageDetailStackBy = typeof usageDetailStackByEnum.Type;\n\nconst stackByValueEnum = Schema.Literals([\"device\", \"harness\"]);\nconst stackByEnum = Schema.optional(stackByValueEnum);\ntype StackBy = typeof stackByEnum.Type;\n\nconst MAX_TIME_ZONE_LENGTH = 64;\nconst DEFAULT_DAYS = 90;\nconst MAX_DAYS = 365;\nconst HOURS_PER_DAY = 24;\nconst MINUTES_PER_HOUR = 60;\nconst SECONDS_PER_MINUTE = 60;\nconst MS_PER_SECOND = 1000;\nconst MS_PER_DAY = HOURS_PER_DAY * MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MS_PER_SECOND;\nconst MIN_ISO_WEEKDAY = 1;\nconst MAX_ISO_WEEKDAY = 7;\nconst MIN_HOUR_OF_DAY = 0;\nconst MAX_HOUR_OF_DAY = 23;\nconst MIN_LEADERBOARD_LIMIT = 1;\nconst MAX_LEADERBOARD_LIMIT = 50;\nconst DEFAULT_LEADERBOARD_LIMIT = 10;\nconst UUID_V7_VERSION = 7;\nconst CIVIL_DATE_PATTERN = /^(?<year>\\d{4})-(?<month>\\d{2})-(?<day>\\d{2})$/u;\n\nconst timeZoneSchema = ianaTimezone.check(Schema.isMaxLength(MAX_TIME_ZONE_LENGTH));\ntype TimeZone = typeof timeZoneSchema.Type;\n\nconst civilDateSchema = civilDate;\nconst daysSchema = safeInteger\n\t.check(Schema.isBetween({ minimum: MIN_LEADERBOARD_LIMIT, maximum: MAX_DAYS }))\n\t.pipe(Schema.withDecodingDefaultTypeKey(Effect.succeed(DEFAULT_DAYS)));\nconst leaderboardLimitSchema = safeInteger\n\t.check(Schema.isBetween({ minimum: MIN_LEADERBOARD_LIMIT, maximum: MAX_LEADERBOARD_LIMIT }))\n\t.pipe(Schema.withDecodingDefaultTypeKey(Effect.succeed(DEFAULT_LEADERBOARD_LIMIT)));\nconst defaultTimeZoneSchema = timeZoneSchema.pipe(Schema.withDecodingDefaultTypeKey(Effect.succeed(\"UTC\")));\nconst uuidSchema = Schema.String.check(Schema.isUUID(UUID_V7_VERSION));\n\nconst rangeFields = {\n\tdays: daysSchema,\n\tendDate: Schema.optional(civilDateSchema),\n\tstartDate: Schema.optional(civilDateSchema),\n};\n\nfunction validateDateRange(input: { readonly endDate?: string; readonly startDate?: string }): Schema.FilterOutput {\n\tif (!(input.startDate || input.endDate)) {\n\t\treturn undefined;\n\t}\n\n\tif (!(input.startDate && input.endDate)) {\n\t\treturn {\n\t\t\tpath: input.startDate ? [\"endDate\"] : [\"startDate\"],\n\t\t\tissue: \"Expected both startDate and endDate\",\n\t\t};\n\t}\n\n\tconst start = parseCivilDateUtcMs(input.startDate);\n\tconst end = parseCivilDateUtcMs(input.endDate);\n\tif (start === undefined || end === undefined) {\n\t\treturn undefined;\n\t}\n\n\tif (start > end) {\n\t\treturn { path: [\"startDate\"], issue: \"Expected startDate to be on or before endDate\" };\n\t}\n\n\tconst days = Math.floor((end - start) / MS_PER_DAY) + 1;\n\tif (days > MAX_DAYS) {\n\t\treturn { path: [\"endDate\"], issue: `Date range cannot exceed ${MAX_DAYS} days` };\n\t}\n\n\treturn undefined;\n}\n\nfunction parseCivilDateUtcMs(date: string): number | undefined {\n\tconst groups = CIVIL_DATE_PATTERN.exec(date)?.groups;\n\tif (!groups) {\n\t\treturn undefined;\n\t}\n\n\tconst year = Number(groups[\"year\"]);\n\tconst month = Number(groups[\"month\"]);\n\tconst day = Number(groups[\"day\"]);\n\tconst parsed = new Date(Date.UTC(year, month - 1, day));\n\tif (parsed.getUTCFullYear() !== year || parsed.getUTCMonth() !== month - 1 || parsed.getUTCDate() !== day) {\n\t\treturn undefined;\n\t}\n\n\treturn parsed.getTime();\n}\n\nconst dailyCostInput = Schema.Struct({\n\tscope: scopeEnum,\n\tstackBy: costStackByEnum,\n\t...rangeFields,\n\ttimeZone: defaultTimeZoneSchema,\n}).check(Schema.makeFilter(validateDateRange));\ntype DailyCostInput = typeof dailyCostInput.Type;\n\nconst dailyPointSchema = Schema.Struct({\n\t/** Local civil date in YYYY-MM-DD for the requested stats timezone. */\n\tdate: civilDateSchema,\n\t/** null when stackBy is undefined. */\n\tseriesName: Schema.NullOr(Schema.String),\n\t/** USD; 0 or positive. */\n\tusd: Schema.Number,\n});\ntype DailyPoint = typeof dailyPointSchema.Type;\n\nconst dailyCostOutput = Schema.Array(dailyPointSchema);\n\nconst dailySessionsInput = Schema.Struct({\n\tscope: scopeEnum,\n\tstackBy: stackByEnum,\n\t...rangeFields,\n\ttimeZone: defaultTimeZoneSchema,\n}).check(Schema.makeFilter(validateDateRange));\ntype DailySessionsInput = typeof dailySessionsInput.Type;\n\nconst dailySessionsPointSchema = Schema.Struct({\n\tdate: civilDateSchema,\n\tseriesName: Schema.NullOr(Schema.String),\n\tsessions: nonNegativeSafeInteger,\n});\ntype DailySessionsPoint = typeof dailySessionsPointSchema.Type;\n\nconst dailySessionsOutput = Schema.Array(dailySessionsPointSchema);\n\nconst weekdaySessionsInput = dailySessionsInput;\ntype WeekdaySessionsInput = typeof weekdaySessionsInput.Type;\n\nconst weekdaySessionsPointSchema = Schema.Struct({\n\t/** Local ISO weekday for the requested stats timezone: 1=Monday, 7=Sunday. */\n\tweekday: safeInteger.check(Schema.isBetween({ minimum: MIN_ISO_WEEKDAY, maximum: MAX_ISO_WEEKDAY })),\n\tseriesName: Schema.NullOr(Schema.String),\n\tsessions: nonNegativeSafeInteger,\n});\ntype WeekdaySessionsPoint = typeof weekdaySessionsPointSchema.Type;\n\nconst weekdaySessionsOutput = Schema.Array(weekdaySessionsPointSchema);\n\nconst hourlySessionsInput = dailySessionsInput;\ntype HourlySessionsInput = typeof hourlySessionsInput.Type;\n\nconst hourlySessionsPointSchema = Schema.Struct({\n\t/** Local hour of day for the requested stats timezone: 0-23. */\n\thour: safeInteger.check(Schema.isBetween({ minimum: MIN_HOUR_OF_DAY, maximum: MAX_HOUR_OF_DAY })),\n\tseriesName: Schema.NullOr(Schema.String),\n\tsessions: nonNegativeSafeInteger,\n});\ntype HourlySessionsPoint = typeof hourlySessionsPointSchema.Type;\n\nconst hourlySessionsOutput = Schema.Array(hourlySessionsPointSchema);\n\nconst summaryInput = Schema.Struct({\n\t...rangeFields,\n\tscope: scopeEnum,\n\ttimeZone: defaultTimeZoneSchema,\n}).check(Schema.makeFilter(validateDateRange));\ntype SummaryInput = typeof summaryInput.Type;\n\nconst summaryOutput = Schema.Struct({\n\trangeUsd: Schema.Number.check(Schema.isGreaterThanOrEqualTo(0)),\n\trangeSessions: nonNegativeSafeInteger,\n\trangeSubjectCount: nonNegativeSafeInteger,\n\ttotalUsd: Schema.Number.check(Schema.isGreaterThanOrEqualTo(0)),\n\ttotalSessions: nonNegativeSafeInteger,\n});\ntype Summary = typeof summaryOutput.Type;\n\nconst deviceSummarySchema = Schema.Struct({\n\tid: uuidSchema,\n\tname: Schema.String,\n\t/** ISO-8601 UTC. */\n\tlastSeen: isoUtcString,\n});\ntype DeviceSummary = typeof deviceSummarySchema.Type;\n\nconst devicesOutput = Schema.Array(deviceSummarySchema);\n\nconst participantSyncSchema = Schema.Struct({\n\tuserId: uuidSchema,\n\tuserLabel: Schema.String,\n\t/** ISO-8601 UTC, null when the participant has no synced devices yet. */\n\tlatestSyncAt: Schema.NullOr(isoUtcString),\n});\ntype ParticipantSync = typeof participantSyncSchema.Type;\n\nconst participantsOutput = Schema.Array(participantSyncSchema);\n\nconst leaderboardInput = Schema.Struct({\n\t...rangeFields,\n\tlimit: leaderboardLimitSchema,\n\ttimeZone: defaultTimeZoneSchema,\n}).check(Schema.makeFilter(validateDateRange));\ntype LeaderboardInput = typeof leaderboardInput.Type;\n\nconst leaderboardRowSchema = Schema.Struct({\n\trank: safeInteger.check(Schema.isGreaterThanOrEqualTo(1)),\n\tuserId: uuidSchema,\n\tuserLabel: Schema.String,\n\tusd: Schema.Number.check(Schema.isGreaterThanOrEqualTo(0)),\n\ttokens: nonNegativeSafeInteger,\n\tsessions: nonNegativeSafeInteger,\n});\ntype LeaderboardRow = typeof leaderboardRowSchema.Type;\n\nconst leaderboardOutput = Schema.Array(leaderboardRowSchema);\n\nconst topDimensionsInput = leaderboardInput;\ntype TopDimensionsInput = typeof topDimensionsInput.Type;\n\nconst topDimensionRowSchema = Schema.Struct({\n\trank: safeInteger.check(Schema.isGreaterThanOrEqualTo(1)),\n\tname: Schema.String,\n\tusd: Schema.Number.check(Schema.isGreaterThanOrEqualTo(0)),\n\ttokens: nonNegativeSafeInteger,\n\tsessions: Schema.NullOr(nonNegativeSafeInteger),\n});\ntype TopDimensionRow = typeof topDimensionRowSchema.Type;\n\nconst topDimensionsOutput = Schema.Struct({\n\tharnesses: Schema.Array(topDimensionRowSchema),\n\tmodels: Schema.Array(topDimensionRowSchema),\n});\ntype TopDimensions = typeof topDimensionsOutput.Type;\n\nconst usageDetailsInput = Schema.Struct({\n\t...rangeFields,\n\tstackBy: usageDetailStackByEnum,\n\ttimeZone: defaultTimeZoneSchema,\n}).check(Schema.makeFilter(validateDateRange));\ntype UsageDetailsInput = typeof usageDetailsInput.Type;\n\nconst usageDetailsRowSchema = Schema.Struct({\n\tid: Schema.String,\n\tname: Schema.String,\n\ttokens: nonNegativeSafeInteger,\n\tsessions: Schema.NullOr(nonNegativeSafeInteger),\n\tusd: Schema.Number.check(Schema.isGreaterThanOrEqualTo(0)),\n\ttotalUsd: Schema.Number.check(Schema.isGreaterThanOrEqualTo(0)),\n});\ntype UsageDetailsRow = typeof usageDetailsRowSchema.Type;\n\nconst usageDetailsOutput = Schema.Array(usageDetailsRowSchema);\n\nexport type {\n\tCostStackBy,\n\tDailyCostInput,\n\tDailyPoint,\n\tDailySessionsInput,\n\tDailySessionsPoint,\n\tDeviceSummary,\n\tHourlySessionsInput,\n\tHourlySessionsPoint,\n\tLeaderboardInput,\n\tLeaderboardRow,\n\tParticipantSync,\n\tScope,\n\tStackBy,\n\tSummary,\n\tSummaryInput,\n\tTimeZone,\n\tTopDimensionRow,\n\tTopDimensions,\n\tTopDimensionsInput,\n\tUsageDetailStackBy,\n\tUsageDetailsInput,\n\tUsageDetailsRow,\n\tWeekdaySessionsInput,\n\tWeekdaySessionsPoint,\n};\nexport {\n\tcostStackByEnum,\n\tdailyCostInput,\n\tdailyCostOutput,\n\tdailyPointSchema,\n\tdailySessionsInput,\n\tdailySessionsOutput,\n\tdailySessionsPointSchema,\n\tdeviceSummarySchema,\n\tdevicesOutput,\n\thourlySessionsInput,\n\thourlySessionsOutput,\n\thourlySessionsPointSchema,\n\tleaderboardInput,\n\tleaderboardOutput,\n\tleaderboardRowSchema,\n\tparticipantSyncSchema,\n\tparticipantsOutput,\n\tscopeEnum,\n\tstackByEnum,\n\tsummaryInput,\n\tsummaryOutput,\n\ttimeZoneSchema,\n\ttopDimensionRowSchema,\n\ttopDimensionsInput,\n\ttopDimensionsOutput,\n\tusageDetailStackByEnum,\n\tusageDetailsInput,\n\tusageDetailsOutput,\n\tusageDetailsRowSchema,\n\tweekdaySessionsInput,\n\tweekdaySessionsOutput,\n\tweekdaySessionsPointSchema,\n};\n","import { Schema } from \"effect\";\nimport { Rpc, RpcGroup } from \"effect/unstable/rpc\";\nimport { DatabaseError, NotFoundError, UnauthorizedError } from \"../errors\";\nimport {\n\tcreateTokenInput,\n\tcreateTokenOutput,\n\tlistTokensOutput,\n\trevokeTokenInput,\n\trevokeTokenOutput,\n} from \"../schemas/tokens\";\n\nconst TokensRpcs = RpcGroup.make(\n\tRpc.make(\"tokens.list\", {\n\t\tsuccess: listTokensOutput,\n\t\terror: Schema.Union([DatabaseError, UnauthorizedError]),\n\t}),\n\tRpc.make(\"tokens.create\", {\n\t\tpayload: createTokenInput,\n\t\tsuccess: createTokenOutput,\n\t\terror: Schema.Union([DatabaseError, UnauthorizedError]),\n\t}),\n\tRpc.make(\"tokens.revoke\", {\n\t\tpayload: revokeTokenInput,\n\t\tsuccess: revokeTokenOutput,\n\t\terror: Schema.Union([DatabaseError, NotFoundError, UnauthorizedError]),\n\t}),\n);\n\nexport { TokensRpcs };\n","import { Schema } from \"effect\";\n\nconst MIN_TOKEN_NAME_LENGTH = 1;\nconst MAX_TOKEN_NAME_LENGTH = 80;\nconst UUID_V7_VERSION = 7;\n\nconst createTokenInput = Schema.Struct({\n\tname: Schema.String.check(Schema.isMinLength(MIN_TOKEN_NAME_LENGTH), Schema.isMaxLength(MAX_TOKEN_NAME_LENGTH)),\n});\ntype CreateTokenInput = typeof createTokenInput.Type;\n\nconst revokeTokenInput = Schema.Struct({\n\tid: Schema.String.check(Schema.isUUID(UUID_V7_VERSION)),\n});\ntype RevokeTokenInput = typeof revokeTokenInput.Type;\nconst tokenIdOutput = Schema.String.check(Schema.isUUID(UUID_V7_VERSION));\n\nconst tokenMetadata = Schema.Struct({\n\tid: tokenIdOutput,\n\tname: Schema.String,\n\tprefix: Schema.String,\n\tcreatedAt: Schema.Date,\n\tlastUsedAt: Schema.NullOr(Schema.Date),\n\trevokedAt: Schema.NullOr(Schema.Date),\n});\ntype TokenMetadata = typeof tokenMetadata.Type;\n\nconst listTokensOutput = Schema.Struct({\n\ttokens: Schema.Array(tokenMetadata),\n});\ntype ListTokensOutput = typeof listTokensOutput.Type;\n\nconst createTokenOutput = Schema.Struct({\n\ttoken: Schema.String,\n\tmetadata: tokenMetadata,\n});\ntype CreateTokenOutput = typeof createTokenOutput.Type;\n\nconst revokeTokenOutput = Schema.Struct({\n\tok: Schema.Boolean,\n});\ntype RevokeTokenOutput = typeof revokeTokenOutput.Type;\n\nexport type {\n\tCreateTokenInput,\n\tCreateTokenOutput,\n\tListTokensOutput,\n\tRevokeTokenInput,\n\tRevokeTokenOutput,\n\tTokenMetadata,\n};\nexport { createTokenInput, createTokenOutput, listTokensOutput, revokeTokenInput, revokeTokenOutput, tokenMetadata };\n","import { Schema } from \"effect\";\nimport { Rpc, RpcGroup } from \"effect/unstable/rpc\";\nimport { DatabaseError, SyncQuotaExceededError, SyncTimestampRejectedError, UnauthorizedError } from \"../errors\";\nimport { getWatermarkInput, getWatermarkOutput, upsertBucketsInput, upsertBucketsOutput } from \"../schemas/sync\";\n\nconst SyncRpcs = RpcGroup.make(\n\tRpc.make(\"sync.getWatermark\", {\n\t\tpayload: getWatermarkInput,\n\t\tsuccess: getWatermarkOutput,\n\t\terror: Schema.Union([DatabaseError, UnauthorizedError]),\n\t}),\n\tRpc.make(\"sync.upsertBuckets\", {\n\t\tpayload: upsertBucketsInput,\n\t\tsuccess: upsertBucketsOutput,\n\t\terror: Schema.Union([DatabaseError, SyncQuotaExceededError, SyncTimestampRejectedError, UnauthorizedError]),\n\t}),\n);\n\nexport { SyncRpcs };\n","import { Effect, Schema } from \"effect\";\nimport { hex64, isoUtcString, nonNegativeSafeInteger } from \"./common\";\n\nconst MIN_DEVICE_NAME_LENGTH = 1;\nconst MAX_DEVICE_NAME_LENGTH = 80;\nconst MIN_MODEL_LENGTH = 1;\nconst MAX_MODEL_LENGTH = 200;\nconst SESSION_KEY_LENGTH = 64;\nconst SESSION_KEY_SALT_LENGTH = 64;\nconst MAX_BUCKETS_PER_SYNC = 5000;\nconst MAX_SESSIONS_PER_SYNC = 5000;\nconst MAX_BUCKET_SESSION_COUNT = 1000;\n// Temporarily disabled until initial sync data gives us realistic quota values.\nconst MAX_BUCKET_TOKEN_COUNT: number | null = null;\nconst MAX_TOKENS_PER_SYNC: number | null = null;\nconst MAX_DEVICE_DAY_TOKENS: number | null = null;\nconst MAX_DEVICE_DAY_SESSIONS = 1000;\nconst MAX_TIMESTAMP_PAST_DAYS = 3650;\nconst MAX_TIMESTAMP_FUTURE_HOURS = 6;\nconst MAX_SESSION_DURATION_DAYS: number | null = null;\n\nconst syncUploadLimits = {\n\tmaxBucketsPerSync: MAX_BUCKETS_PER_SYNC,\n\tmaxSessionsPerSync: MAX_SESSIONS_PER_SYNC,\n\tmaxBucketTokenCount: MAX_BUCKET_TOKEN_COUNT,\n\tmaxBucketSessionCount: MAX_BUCKET_SESSION_COUNT,\n\tmaxTokensPerSync: MAX_TOKENS_PER_SYNC,\n\tmaxDeviceDayTokens: MAX_DEVICE_DAY_TOKENS,\n\tmaxDeviceDaySessions: MAX_DEVICE_DAY_SESSIONS,\n\tmaxTimestampPastDays: MAX_TIMESTAMP_PAST_DAYS,\n\tmaxTimestampFutureHours: MAX_TIMESTAMP_FUTURE_HOURS,\n\tmaxSessionDurationDays: MAX_SESSION_DURATION_DAYS,\n} as const;\n\nconst HARNESSES = [\"codex\", \"claude_code\", \"pi\", \"hermes\", \"opencode\"] as const;\nconst harnessEnum = Schema.Literals(HARNESSES);\ntype Harness = typeof harnessEnum.Type;\n\nconst deviceNameSchema = Schema.String.check(\n\tSchema.isMinLength(MIN_DEVICE_NAME_LENGTH),\n\tSchema.isMaxLength(MAX_DEVICE_NAME_LENGTH),\n);\n\nconst getWatermarkInput = Schema.Struct({\n\tdevice: deviceNameSchema,\n});\n\nconst getWatermarkOutput = Schema.Struct({\n\twatermarkHourUtc: Schema.NullOr(isoUtcString),\n\tsessionKeySalt: hex64.check(Schema.isLengthBetween(SESSION_KEY_SALT_LENGTH, SESSION_KEY_SALT_LENGTH)),\n});\ntype GetWatermarkOutput = typeof getWatermarkOutput.Type;\n\nfunction boundedInteger(max: number | null): typeof nonNegativeSafeInteger {\n\tif (max === null) {\n\t\treturn nonNegativeSafeInteger;\n\t}\n\treturn nonNegativeSafeInteger.check(Schema.isLessThanOrEqualTo(max));\n}\n\nconst bucketInput = Schema.Struct({\n\tharness: harnessEnum,\n\tmodel: Schema.String.check(Schema.isMinLength(MIN_MODEL_LENGTH), Schema.isMaxLength(MAX_MODEL_LENGTH)),\n\thourUtc: isoUtcString,\n\tinputTokens: boundedInteger(MAX_BUCKET_TOKEN_COUNT),\n\toutputTokens: boundedInteger(MAX_BUCKET_TOKEN_COUNT),\n\tcacheReadTokens: boundedInteger(MAX_BUCKET_TOKEN_COUNT),\n\tcacheCreateTokens: boundedInteger(MAX_BUCKET_TOKEN_COUNT),\n\tsessionCount: boundedInteger(MAX_BUCKET_SESSION_COUNT),\n});\n\ntype BucketInput = typeof bucketInput.Type;\n\nconst sessionInput = Schema.Struct({\n\tharness: harnessEnum,\n\tsessionKey: hex64.check(Schema.isLengthBetween(SESSION_KEY_LENGTH, SESSION_KEY_LENGTH)),\n\tstartedAt: isoUtcString,\n\tlastSeenAt: isoUtcString,\n});\n\ntype SessionInput = typeof sessionInput.Type;\n\nconst upsertBucketsInput = Schema.Struct({\n\tdevice: deviceNameSchema,\n\tbuckets: Schema.Array(bucketInput).check(Schema.isMaxLength(MAX_BUCKETS_PER_SYNC)),\n\tsessions: Schema.Array(sessionInput)\n\t\t.check(Schema.isMaxLength(MAX_SESSIONS_PER_SYNC))\n\t\t.pipe(Schema.withDecodingDefaultTypeKey(Effect.succeed([]))),\n});\n\nconst upsertBucketsOutput = Schema.Struct({\n\tupserted: boundedInteger(null),\n\tupsertedSessions: boundedInteger(null),\n});\ntype UpsertBucketsOutput = typeof upsertBucketsOutput.Type;\n\nexport type { BucketInput, GetWatermarkOutput, Harness, SessionInput, UpsertBucketsOutput };\nexport {\n\tbucketInput,\n\tdeviceNameSchema,\n\tgetWatermarkInput,\n\tgetWatermarkOutput,\n\tHARNESSES,\n\tharnessEnum,\n\tsessionInput,\n\tsyncUploadLimits,\n\tupsertBucketsInput,\n\tupsertBucketsOutput,\n};\n","import { Effect, Schema } from \"effect\";\nimport { Rpc, RpcGroup } from \"effect/unstable/rpc\";\n\nconst SystemPingResponse = Schema.Struct({\n\tok: Schema.Boolean,\n});\n\nconst SystemRpcs = RpcGroup.make(\n\tRpc.make(\"system.ping\", {\n\t\tsuccess: SystemPingResponse,\n\t}),\n);\n\nconst SystemRpcHandlers = SystemRpcs.toLayer({\n\t\"system.ping\": () => Effect.succeed({ ok: true }),\n});\n\nexport { SystemPingResponse, SystemRpcHandlers, SystemRpcs };\n","import type { DbClient } from \"@oopst/db\";\nimport { deviceTable } from \"@oopst/db/schema\";\nimport { and, eq, ne } from \"drizzle-orm\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { ConflictError, DatabaseError, NotFoundError } from \"../errors\";\nimport type { RenameDeviceOutput } from \"../schemas/devices\";\n\nconst DUPLICATE_DEVICE_NAME_MESSAGE = \"A device with this name already exists\";\nconst DEVICE_NOT_FOUND_MESSAGE = \"Device not found\";\nconst PG_UNIQUE_VIOLATION = \"23505\";\n\ntype RenameDeviceCommand = {\n\treadonly db: DbClient;\n\treadonly userId: string;\n\treadonly id: string;\n\treadonly name: string;\n};\n\ntype DeviceServiceShape = {\n\treadonly rename: (\n\t\tinput: RenameDeviceCommand,\n\t) => Effect.Effect<RenameDeviceOutput, ConflictError | DatabaseError | NotFoundError>;\n};\n\nclass DeviceService extends Context.Service<DeviceService, DeviceServiceShape>()(\"@oopst/api/DeviceService\") {}\n\nfunction isUniqueViolation(err: unknown): boolean {\n\treturn (\n\t\ttypeof err === \"object\" && err !== null && \"code\" in err && (err as { code?: unknown }).code === PG_UNIQUE_VIOLATION\n\t);\n}\n\nconst duplicateDeviceNameError = (): ConflictError => new ConflictError({ message: DUPLICATE_DEVICE_NAME_MESSAGE });\n\nconst deviceNotFoundError = (): NotFoundError => new NotFoundError({ message: DEVICE_NOT_FOUND_MESSAGE });\n\nconst databaseError = (err: unknown): DatabaseError =>\n\tnew DatabaseError({ message: err instanceof Error ? err.message : \"Device database operation failed\" });\n\nconst makeDeviceService = (): DeviceServiceShape => ({\n\trename: (input) =>\n\t\tEffect.gen(function* () {\n\t\t\tconst duplicate = yield* Effect.tryPromise({\n\t\t\t\ttry: async () => {\n\t\t\t\t\tconst [row] = await input.db\n\t\t\t\t\t\t.select({ id: deviceTable.id })\n\t\t\t\t\t\t.from(deviceTable)\n\t\t\t\t\t\t.where(\n\t\t\t\t\t\t\tand(eq(deviceTable.userId, input.userId), eq(deviceTable.name, input.name), ne(deviceTable.id, input.id)),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.limit(1);\n\t\t\t\t\treturn row;\n\t\t\t\t},\n\t\t\t\tcatch: databaseError,\n\t\t\t});\n\t\t\tif (duplicate) {\n\t\t\t\treturn yield* Effect.fail(duplicateDeviceNameError());\n\t\t\t}\n\n\t\t\tconst row = yield* Effect.tryPromise({\n\t\t\t\ttry: async () => {\n\t\t\t\t\tconst [updated] = await input.db\n\t\t\t\t\t\t.update(deviceTable)\n\t\t\t\t\t\t.set({ name: input.name })\n\t\t\t\t\t\t.where(and(eq(deviceTable.id, input.id), eq(deviceTable.userId, input.userId)))\n\t\t\t\t\t\t.returning({\n\t\t\t\t\t\t\tid: deviceTable.id,\n\t\t\t\t\t\t\tname: deviceTable.name,\n\t\t\t\t\t\t\tlastSeen: deviceTable.lastSeen,\n\t\t\t\t\t\t});\n\t\t\t\t\treturn updated;\n\t\t\t\t},\n\t\t\t\tcatch: (err) => (isUniqueViolation(err) ? duplicateDeviceNameError() : databaseError(err)),\n\t\t\t});\n\t\t\tif (!row) {\n\t\t\t\treturn yield* Effect.fail(deviceNotFoundError());\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tid: row.id,\n\t\t\t\tname: row.name,\n\t\t\t\tlastSeen: row.lastSeen.toISOString(),\n\t\t\t};\n\t\t}),\n});\n\nconst DeviceServiceLive = Layer.succeed(DeviceService, makeDeviceService());\n\nexport type { RenameDeviceCommand };\nexport { DeviceService, DeviceServiceLive };\n","import type { DbClient } from \"@oopst/db\";\nimport { deviceTable, userTable } from \"@oopst/db/schema\";\nimport { desc, eq, sql } from \"drizzle-orm\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { DatabaseError } from \"../errors\";\nimport { canonicalModelExpr, costExpr, priceJoinCondition } from \"../queries/cost\";\nimport { logMissingPrices } from \"../queries/missing-prices\";\nimport type {\n\tCostStackBy,\n\tDailyCostInput,\n\tDailyPoint,\n\tDailySessionsInput,\n\tDailySessionsPoint,\n\tDeviceSummary,\n\tHourlySessionsInput,\n\tHourlySessionsPoint,\n\tLeaderboardInput,\n\tLeaderboardRow,\n\tParticipantSync,\n\tSummary,\n\tSummaryInput,\n\tTopDimensionRow,\n\tTopDimensions,\n\tTopDimensionsInput,\n\tUsageDetailsInput,\n\tUsageDetailsRow,\n\tWeekdaySessionsInput,\n\tWeekdaySessionsPoint,\n} from \"../schemas/stats\";\n\ntype DailyCostCommand = {\n\treadonly db: DbClient;\n\treadonly userId: string;\n\treadonly input: DailyCostInput;\n};\n\ntype DailySessionsCommand = {\n\treadonly db: DbClient;\n\treadonly userId: string;\n\treadonly input: DailySessionsInput;\n};\n\ntype WeekdaySessionsCommand = {\n\treadonly db: DbClient;\n\treadonly userId: string;\n\treadonly input: WeekdaySessionsInput;\n};\n\ntype HourlySessionsCommand = {\n\treadonly db: DbClient;\n\treadonly userId: string;\n\treadonly input: HourlySessionsInput;\n};\n\ntype SummaryCommand = {\n\treadonly db: DbClient;\n\treadonly userId: string;\n\treadonly input: SummaryInput;\n};\n\ntype DevicesCommand = {\n\treadonly db: DbClient;\n\treadonly userId: string;\n};\n\ntype ParticipantsCommand = {\n\treadonly db: DbClient;\n};\n\ntype LeaderboardCommand = {\n\treadonly db: DbClient;\n\treadonly input: LeaderboardInput;\n};\n\ntype TopDimensionsCommand = {\n\treadonly db: DbClient;\n\treadonly input: TopDimensionsInput;\n};\n\ntype UsageDetailsCommand = {\n\treadonly db: DbClient;\n\treadonly userId: string;\n\treadonly input: UsageDetailsInput;\n};\n\ntype ParticipantSyncQueryRow = {\n\tuserId: string;\n\tuserLabel: string;\n\tlatestSyncAt: Date | string | null;\n};\n\ntype LeaderboardQueryRow = {\n\trank: number;\n\tuserId: string;\n\tuserLabel: string;\n\tusd: number;\n\ttokens: number;\n\tsessions: number;\n};\n\ntype TopDimensionQueryRow = {\n\trank: number;\n\tname: string;\n\tusd: number;\n\ttokens: number;\n\tsessions: number | null;\n};\n\ntype UsageDetailsQueryRow = {\n\tid: string;\n\tname: string;\n\ttokens: number;\n\tsessions: number | null;\n\tusd: number;\n\ttotalUsd: number;\n};\n\ntype DailyCostQueryRow = {\n\tdate: string;\n\tseriesName: string | null;\n\tusd: number;\n};\n\ntype DailySessionsQueryRow = {\n\tdate: string;\n\tseriesName: string | null;\n\tsessions: number;\n};\n\ntype SessionDistributionQueryRow = {\n\tbucket: number;\n\tseriesName: string | null;\n\tsessions: number;\n};\n\ntype SessionDistributionCommand = DailySessionsCommand | WeekdaySessionsCommand | HourlySessionsCommand;\n\ntype StatsServiceShape = {\n\treadonly dailyCost: (input: DailyCostCommand) => Effect.Effect<DailyPoint[], DatabaseError>;\n\treadonly dailySessions: (input: DailySessionsCommand) => Effect.Effect<DailySessionsPoint[], DatabaseError>;\n\treadonly devices: (input: DevicesCommand) => Effect.Effect<DeviceSummary[], DatabaseError>;\n\treadonly hourlySessions: (input: HourlySessionsCommand) => Effect.Effect<HourlySessionsPoint[], DatabaseError>;\n\treadonly leaderboard: (input: LeaderboardCommand) => Effect.Effect<LeaderboardRow[], DatabaseError>;\n\treadonly participants: (input: ParticipantsCommand) => Effect.Effect<ParticipantSync[], DatabaseError>;\n\treadonly summary: (input: SummaryCommand) => Effect.Effect<Summary, DatabaseError>;\n\treadonly topDimensions: (input: TopDimensionsCommand) => Effect.Effect<TopDimensions, DatabaseError>;\n\treadonly usageDetails: (input: UsageDetailsCommand) => Effect.Effect<UsageDetailsRow[], DatabaseError>;\n\treadonly weekdaySessions: (input: WeekdaySessionsCommand) => Effect.Effect<WeekdaySessionsPoint[], DatabaseError>;\n};\n\nclass StatsService extends Context.Service<StatsService, StatsServiceShape>()(\"@oopst/api/StatsService\") {}\n\nconst noopLogger = { warn: () => undefined };\n\nconst databaseError = (err: unknown): DatabaseError =>\n\tnew DatabaseError({ message: err instanceof Error ? err.message : \"Stats database operation failed\" });\n\nconst usageTokensExpr = sql<number>`\n uh.input_tokens\n + uh.output_tokens\n + uh.cache_read_tokens\n + uh.cache_create_tokens\n`;\n\nfunction timestampRangeClause(\n\tinput: Pick<SummaryInput, \"days\" | \"endDate\" | \"startDate\" | \"timeZone\">,\n\ttimestampExpr: ReturnType<typeof sql<Date>>,\n): ReturnType<typeof sql> {\n\tif (input.startDate && input.endDate) {\n\t\treturn sql`(${timestampExpr} at time zone ${input.timeZone})::date between ${input.startDate}::date and ${input.endDate}::date`;\n\t}\n\n\treturn sql`${timestampExpr} >= now() - (${input.days} || ' days')::interval`;\n}\n\nfunction toIsoString(value: Date | string | null | undefined): string | null {\n\tif (!value) {\n\t\treturn null;\n\t}\n\treturn (value instanceof Date ? value : new Date(value)).toISOString();\n}\n\nfunction harnessSeriesExpr(harnessExpr = sql`uh.harness`): ReturnType<typeof sql<string>> {\n\treturn sql<string>`case ${harnessExpr}\n when 'codex' then 'Codex'\n when 'claude_code' then 'Claude Code'\n when 'pi' then 'Pi'\n when 'hermes' then 'Hermes'\n when 'opencode' then 'OpenCode'\n else ${harnessExpr}\n end`;\n}\n\nfunction localDayExpr(timeZone: string, timestampExpr = sql`uh.hour_utc`): ReturnType<typeof sql<string>> {\n\treturn sql<string>`to_char(date_trunc('day', ${timestampExpr} at time zone ${timeZone}), 'YYYY-MM-DD')`;\n}\n\nfunction localIsoWeekdayExpr(timeZone: string, timestampExpr = sql`uh.hour_utc`): ReturnType<typeof sql<number>> {\n\treturn sql<number>`extract(isodow from (${timestampExpr} at time zone ${timeZone}))::int`;\n}\n\nfunction localHourExpr(timeZone: string, timestampExpr = sql`uh.hour_utc`): ReturnType<typeof sql<number>> {\n\treturn sql<number>`extract(hour from (${timestampExpr} at time zone ${timeZone}))::int`;\n}\n\nfunction stackByForScope(scope: DailyCostInput[\"scope\"], stackBy: CostStackBy): CostStackBy {\n\tif (scope === \"all\" && stackBy === \"device\") {\n\t\treturn undefined;\n\t}\n\treturn stackBy;\n}\n\nfunction toTopDimensionRow(row: TopDimensionQueryRow): TopDimensionRow {\n\treturn {\n\t\trank: row.rank,\n\t\tname: row.name,\n\t\tusd: row.usd,\n\t\ttokens: row.tokens,\n\t\tsessions: row.sessions,\n\t};\n}\n\nasync function selectSessionDistribution(\n\tcommand: SessionDistributionCommand,\n\tbucketExpr: ReturnType<typeof sql<number>>,\n): Promise<SessionDistributionQueryRow[]> {\n\tconst stackBy = stackByForScope(command.input.scope, command.input.stackBy);\n\tconst rangeClause = timestampRangeClause(command.input, sql`us.started_at`);\n\tconst meClause = command.input.scope === \"me\" ? sql`and us.user_id = ${command.userId}` : sql``;\n\n\tlet result: { rows: SessionDistributionQueryRow[] };\n\tif (stackBy === \"device\") {\n\t\tresult = await command.db.execute<SessionDistributionQueryRow>(sql`\n select\n ${bucketExpr} as bucket,\n d.name as \"seriesName\",\n count(*)::int as sessions\n from usage_session us\n join device d on d.id = us.device_id\n where ${rangeClause}\n ${meClause}\n group by 1, d.name\n order by 1 asc, d.name asc\n `);\n\t} else if (stackBy === \"harness\") {\n\t\tresult = await command.db.execute<SessionDistributionQueryRow>(sql`\n select\n ${bucketExpr} as bucket,\n ${harnessSeriesExpr(sql`us.harness`)} as \"seriesName\",\n count(*)::int as sessions\n from usage_session us\n where ${rangeClause}\n ${meClause}\n group by 1, us.harness\n order by 1 asc, us.harness asc\n `);\n\t} else {\n\t\tresult = await command.db.execute<SessionDistributionQueryRow>(sql`\n select\n ${bucketExpr} as bucket,\n null::text as \"seriesName\",\n count(*)::int as sessions\n from usage_session us\n where ${rangeClause}\n ${meClause}\n group by 1\n order by 1 asc\n `);\n\t}\n\n\treturn result.rows;\n}\n\nconst makeStatsService = (): StatsServiceShape => ({\n\tdailyCost: (command) =>\n\t\tEffect.tryPromise({\n\t\t\ttry: async () => {\n\t\t\t\tconst stackBy = stackByForScope(command.input.scope, command.input.stackBy);\n\t\t\t\tconst rangeClause = timestampRangeClause(command.input, sql`uh.hour_utc`);\n\t\t\t\tconst meClause = command.input.scope === \"me\" ? sql`and uh.user_id = ${command.userId}` : sql``;\n\t\t\t\tconst dateExpr = localDayExpr(command.input.timeZone);\n\n\t\t\t\tlet result: { rows: DailyCostQueryRow[] };\n\t\t\t\tif (stackBy === \"device\") {\n\t\t\t\t\tresult = await command.db.execute<DailyCostQueryRow>(sql`\n select\n ${dateExpr} as date,\n d.name as \"seriesName\",\n coalesce(sum(${costExpr}), 0)::float as usd\n from usage_hour uh\n join device d on d.id = uh.device_id\n left join model_price mp\n on ${priceJoinCondition}\n where ${rangeClause}\n ${meClause}\n group by 1, d.name\n order by 1 asc, d.name asc\n `);\n\t\t\t\t} else if (stackBy === \"harness\") {\n\t\t\t\t\tresult = await command.db.execute<DailyCostQueryRow>(sql`\n select\n ${dateExpr} as date,\n ${harnessSeriesExpr()} as \"seriesName\",\n coalesce(sum(${costExpr}), 0)::float as usd\n from usage_hour uh\n left join model_price mp\n on ${priceJoinCondition}\n where ${rangeClause}\n ${meClause}\n group by 1, uh.harness\n order by 1 asc, uh.harness asc\n `);\n\t\t\t\t} else if (stackBy === \"model\") {\n\t\t\t\t\tconst modelNameExpr = canonicalModelExpr();\n\t\t\t\t\tresult = await command.db.execute<DailyCostQueryRow>(sql`\n select\n ${dateExpr} as date,\n ${modelNameExpr} as \"seriesName\",\n coalesce(sum(${costExpr}), 0)::float as usd\n from usage_hour uh\n left join model_price mp\n on ${priceJoinCondition}\n where ${rangeClause}\n ${meClause}\n group by 1, 2\n order by 1 asc, 2 asc\n `);\n\t\t\t\t} else {\n\t\t\t\t\tresult = await command.db.execute<DailyCostQueryRow>(sql`\n select\n ${dateExpr} as date,\n null::text as \"seriesName\",\n coalesce(sum(${costExpr}), 0)::float as usd\n from usage_hour uh\n left join model_price mp\n on ${priceJoinCondition}\n where ${rangeClause}\n ${meClause}\n group by 1\n order by 1 asc\n `);\n\t\t\t\t}\n\n\t\t\t\treturn result.rows.map((row) => ({\n\t\t\t\t\tdate: row.date,\n\t\t\t\t\tseriesName: row.seriesName,\n\t\t\t\t\tusd: row.usd,\n\t\t\t\t}));\n\t\t\t},\n\t\t\tcatch: databaseError,\n\t\t}),\n\tdailySessions: (command) =>\n\t\tEffect.tryPromise({\n\t\t\ttry: async () => {\n\t\t\t\tconst stackBy = stackByForScope(command.input.scope, command.input.stackBy);\n\t\t\t\tconst rangeClause = timestampRangeClause(command.input, sql`us.started_at`);\n\t\t\t\tconst meClause = command.input.scope === \"me\" ? sql`and us.user_id = ${command.userId}` : sql``;\n\t\t\t\tconst dateExpr = localDayExpr(command.input.timeZone, sql`us.started_at`);\n\n\t\t\t\tlet result: { rows: DailySessionsQueryRow[] };\n\t\t\t\tif (stackBy === \"device\") {\n\t\t\t\t\tresult = await command.db.execute<DailySessionsQueryRow>(sql`\n select\n ${dateExpr} as date,\n d.name as \"seriesName\",\n count(*)::int as sessions\n from usage_session us\n join device d on d.id = us.device_id\n where ${rangeClause}\n ${meClause}\n group by 1, d.name\n order by 1 asc, d.name asc\n `);\n\t\t\t\t} else if (stackBy === \"harness\") {\n\t\t\t\t\tresult = await command.db.execute<DailySessionsQueryRow>(sql`\n select\n ${dateExpr} as date,\n ${harnessSeriesExpr(sql`us.harness`)} as \"seriesName\",\n count(*)::int as sessions\n from usage_session us\n where ${rangeClause}\n ${meClause}\n group by 1, us.harness\n order by 1 asc, us.harness asc\n `);\n\t\t\t\t} else {\n\t\t\t\t\tresult = await command.db.execute<DailySessionsQueryRow>(sql`\n select\n ${dateExpr} as date,\n null::text as \"seriesName\",\n count(*)::int as sessions\n from usage_session us\n where ${rangeClause}\n ${meClause}\n group by 1\n order by 1 asc\n `);\n\t\t\t\t}\n\n\t\t\t\treturn result.rows.map((row) => ({\n\t\t\t\t\tdate: row.date,\n\t\t\t\t\tseriesName: row.seriesName,\n\t\t\t\t\tsessions: row.sessions,\n\t\t\t\t}));\n\t\t\t},\n\t\t\tcatch: databaseError,\n\t\t}),\n\tdevices: (command) =>\n\t\tEffect.tryPromise({\n\t\t\ttry: async () => {\n\t\t\t\tconst rows = await command.db\n\t\t\t\t\t.select({\n\t\t\t\t\t\tid: deviceTable.id,\n\t\t\t\t\t\tname: deviceTable.name,\n\t\t\t\t\t\tlastSeen: deviceTable.lastSeen,\n\t\t\t\t\t})\n\t\t\t\t\t.from(deviceTable)\n\t\t\t\t\t.where(eq(deviceTable.userId, command.userId))\n\t\t\t\t\t.orderBy(desc(deviceTable.lastSeen));\n\n\t\t\t\treturn rows.map((row) => ({\n\t\t\t\t\tid: row.id,\n\t\t\t\t\tname: row.name,\n\t\t\t\t\tlastSeen: row.lastSeen.toISOString(),\n\t\t\t\t}));\n\t\t\t},\n\t\t\tcatch: databaseError,\n\t\t}),\n\thourlySessions: (command) =>\n\t\tEffect.tryPromise({\n\t\t\ttry: async () => {\n\t\t\t\tconst rows = await selectSessionDistribution(\n\t\t\t\t\tcommand,\n\t\t\t\t\tlocalHourExpr(command.input.timeZone, sql`us.started_at`),\n\t\t\t\t);\n\t\t\t\treturn rows.map((row) => ({\n\t\t\t\t\thour: row.bucket,\n\t\t\t\t\tseriesName: row.seriesName,\n\t\t\t\t\tsessions: row.sessions,\n\t\t\t\t}));\n\t\t\t},\n\t\t\tcatch: databaseError,\n\t\t}),\n\tleaderboard: (command) =>\n\t\tEffect.tryPromise({\n\t\t\ttry: async () => {\n\t\t\t\tconst usageRangeClause = timestampRangeClause(command.input, sql`uh.hour_utc`);\n\t\t\t\tconst sessionRangeClause = timestampRangeClause(command.input, sql`us.started_at`);\n\t\t\t\tconst result = await command.db.execute<LeaderboardQueryRow>(sql`\n with cost_by_user as (\n select\n uh.user_id,\n coalesce(sum(${costExpr}), 0)::float as usd,\n coalesce(sum(\n uh.input_tokens\n + uh.output_tokens\n + uh.cache_read_tokens\n + uh.cache_create_tokens\n ), 0)::float as tokens\n from usage_hour uh\n left join model_price mp\n on ${priceJoinCondition}\n where ${usageRangeClause}\n group by uh.user_id\n ),\n sessions_by_user as (\n select\n us.user_id,\n count(*)::int as sessions\n from usage_session us\n where ${sessionRangeClause}\n group by us.user_id\n ),\n leaderboard as (\n select\n u.id as \"userId\",\n coalesce(nullif(u.display_name, ''), u.email) as \"userLabel\",\n coalesce(c.usd, 0)::float as usd,\n coalesce(c.tokens, 0)::float as tokens,\n coalesce(s.sessions, 0)::int as sessions\n from \"user\" u\n left join cost_by_user c on c.user_id = u.id\n left join sessions_by_user s on s.user_id = u.id\n where c.user_id is not null\n or s.user_id is not null\n )\n select\n row_number() over (\n order by usd desc, tokens desc, sessions desc, \"userLabel\" asc\n )::int as rank,\n \"userId\",\n \"userLabel\",\n usd,\n tokens,\n sessions\n from leaderboard\n order by rank asc\n limit ${command.input.limit}\n `);\n\n\t\t\t\treturn result.rows.map((row) => ({\n\t\t\t\t\trank: row.rank,\n\t\t\t\t\tuserId: row.userId,\n\t\t\t\t\tuserLabel: row.userLabel,\n\t\t\t\t\tusd: row.usd,\n\t\t\t\t\ttokens: row.tokens,\n\t\t\t\t\tsessions: row.sessions,\n\t\t\t\t}));\n\t\t\t},\n\t\t\tcatch: databaseError,\n\t\t}),\n\tparticipants: (command) =>\n\t\tEffect.tryPromise({\n\t\t\ttry: async () => {\n\t\t\t\tconst result = await command.db.execute<ParticipantSyncQueryRow>(sql`\n select\n u.id as \"userId\",\n coalesce(nullif(u.display_name, ''), u.email) as \"userLabel\",\n max(d.last_seen) as \"latestSyncAt\"\n from ${userTable} u\n left join ${deviceTable} d on d.user_id = u.id\n group by u.id, u.display_name, u.email\n order by max(d.last_seen) desc nulls last, \"userLabel\" asc\n `);\n\n\t\t\t\treturn result.rows.map((row) => ({\n\t\t\t\t\tuserId: row.userId,\n\t\t\t\t\tuserLabel: row.userLabel,\n\t\t\t\t\tlatestSyncAt: toIsoString(row.latestSyncAt),\n\t\t\t\t}));\n\t\t\t},\n\t\t\tcatch: databaseError,\n\t\t}),\n\tsummary: (command) =>\n\t\tEffect.tryPromise({\n\t\t\ttry: async () => {\n\t\t\t\tconst meClause = command.input.scope === \"me\" ? sql`and uh.user_id = ${command.userId}` : sql``;\n\t\t\t\tconst subjectExpr = command.input.scope === \"me\" ? sql`uh.device_id` : sql`uh.user_id`;\n\t\t\t\tconst rangeClause = timestampRangeClause(command.input, sql`uh.hour_utc`);\n\t\t\t\tconst costResult = await command.db.execute<{\n\t\t\t\t\trangeUsd: number;\n\t\t\t\t\trangeSubjectCount: number;\n\t\t\t\t\ttotalUsd: number;\n\t\t\t\t}>(sql`\n select\n coalesce(sum(${costExpr}) filter (where ${rangeClause}), 0)::float as \"rangeUsd\",\n (count(distinct ${subjectExpr}) filter (where ${rangeClause}))::int as \"rangeSubjectCount\",\n coalesce(sum(${costExpr}), 0)::float as \"totalUsd\"\n from usage_hour uh\n left join model_price mp\n on ${priceJoinCondition}\n where true\n ${meClause}\n `);\n\t\t\t\tconst sessionMeClause = command.input.scope === \"me\" ? sql`and us.user_id = ${command.userId}` : sql``;\n\t\t\t\tconst sessionRangeClause = timestampRangeClause(command.input, sql`us.started_at`);\n\t\t\t\tconst sessionResult = await command.db.execute<{ rangeSessions: number; totalSessions: number }>(sql`\n select\n (count(*) filter (where ${sessionRangeClause}))::int as \"rangeSessions\",\n count(*)::int as \"totalSessions\"\n from usage_session us\n where true\n ${sessionMeClause}\n `);\n\n\t\t\t\tconst [row] = costResult.rows;\n\t\t\t\tconst [sessionRow] = sessionResult.rows;\n\t\t\t\treturn {\n\t\t\t\t\trangeUsd: row?.rangeUsd ?? 0,\n\t\t\t\t\trangeSessions: sessionRow?.rangeSessions ?? 0,\n\t\t\t\t\trangeSubjectCount: row?.rangeSubjectCount ?? 0,\n\t\t\t\t\ttotalUsd: row?.totalUsd ?? 0,\n\t\t\t\t\ttotalSessions: sessionRow?.totalSessions ?? 0,\n\t\t\t\t};\n\t\t\t},\n\t\t\tcatch: databaseError,\n\t\t}),\n\ttopDimensions: (command) =>\n\t\tEffect.tryPromise({\n\t\t\ttry: async () => {\n\t\t\t\tconst usageRangeClause = timestampRangeClause(command.input, sql`uh.hour_utc`);\n\t\t\t\tconst sessionRangeClause = timestampRangeClause(command.input, sql`us.started_at`);\n\t\t\t\tconst modelNameExpr = canonicalModelExpr();\n\t\t\t\tconst models = await command.db.execute<TopDimensionQueryRow>(sql`\n with model_totals as (\n select\n ${modelNameExpr} as name,\n coalesce(sum(${costExpr}), 0)::float as usd,\n coalesce(sum(\n uh.input_tokens\n + uh.output_tokens\n + uh.cache_read_tokens\n + uh.cache_create_tokens\n ), 0)::float as tokens\n from usage_hour uh\n left join model_price mp\n on ${priceJoinCondition}\n where ${usageRangeClause}\n group by 1\n )\n select\n row_number() over (order by usd desc, tokens desc, name asc)::int as rank,\n name,\n usd,\n tokens,\n null::int as sessions\n from model_totals\n order by rank asc\n limit ${command.input.limit}\n `);\n\t\t\t\tconst harnesses = await command.db.execute<TopDimensionQueryRow>(sql`\n with cost_by_harness as (\n select\n uh.harness,\n ${harnessSeriesExpr()} as name,\n coalesce(sum(${costExpr}), 0)::float as usd,\n coalesce(sum(\n uh.input_tokens\n + uh.output_tokens\n + uh.cache_read_tokens\n + uh.cache_create_tokens\n ), 0)::float as tokens\n from usage_hour uh\n left join model_price mp\n on ${priceJoinCondition}\n where ${usageRangeClause}\n group by uh.harness\n ),\n sessions_by_harness as (\n select\n us.harness,\n count(*)::int as sessions\n from usage_session us\n where ${sessionRangeClause}\n group by us.harness\n ),\n harness_totals as (\n select\n coalesce(c.name, ${harnessSeriesExpr(sql`s.harness`)}) as name,\n coalesce(c.usd, 0)::float as usd,\n coalesce(c.tokens, 0)::float as tokens,\n coalesce(s.sessions, 0)::int as sessions\n from cost_by_harness c\n full outer join sessions_by_harness s on s.harness = c.harness\n )\n select\n row_number() over (order by usd desc, tokens desc, sessions desc, name asc)::int as rank,\n name,\n usd,\n tokens,\n sessions\n from harness_totals\n order by rank asc\n limit ${command.input.limit}\n `);\n\n\t\t\t\tlogMissingPrices(command.db, noopLogger).catch(() => undefined);\n\n\t\t\t\treturn {\n\t\t\t\t\tharnesses: harnesses.rows.map(toTopDimensionRow),\n\t\t\t\t\tmodels: models.rows.map(toTopDimensionRow),\n\t\t\t\t};\n\t\t\t},\n\t\t\tcatch: databaseError,\n\t\t}),\n\tusageDetails: (command) =>\n\t\tEffect.tryPromise({\n\t\t\ttry: async () => {\n\t\t\t\tconst usageRangeClause = timestampRangeClause(command.input, sql`uh.hour_utc`);\n\t\t\t\tconst sessionRangeClause = timestampRangeClause(command.input, sql`us.started_at`);\n\n\t\t\t\tlet result: { rows: UsageDetailsQueryRow[] };\n\t\t\t\tif (command.input.stackBy === \"device\") {\n\t\t\t\t\tresult = await command.db.execute<UsageDetailsQueryRow>(sql`\n with usage_totals as (\n select\n uh.device_id::text as key,\n d.name as name,\n coalesce(sum(${usageTokensExpr}) filter (where ${usageRangeClause}), 0)::float as tokens,\n coalesce(sum(${costExpr}) filter (where ${usageRangeClause}), 0)::float as usd,\n coalesce(sum(${costExpr}), 0)::float as \"totalUsd\"\n from usage_hour uh\n join device d on d.id = uh.device_id\n left join model_price mp\n on ${priceJoinCondition}\n where uh.user_id = ${command.userId}\n group by uh.device_id, d.name\n ),\n session_totals as (\n select\n us.device_id::text as key,\n d.name as name,\n count(*)::int as sessions\n from usage_session us\n join device d on d.id = us.device_id\n where us.user_id = ${command.userId}\n and ${sessionRangeClause}\n group by us.device_id, d.name\n )\n select\n coalesce(u.key, s.key) as id,\n coalesce(u.name, s.name) as name,\n coalesce(u.tokens, 0)::float as tokens,\n coalesce(s.sessions, 0)::int as sessions,\n coalesce(u.usd, 0)::float as usd,\n coalesce(u.\"totalUsd\", 0)::float as \"totalUsd\"\n from usage_totals u\n full outer join session_totals s on s.key = u.key\n where coalesce(u.tokens, 0) > 0\n or coalesce(s.sessions, 0) > 0\n or coalesce(u.usd, 0) > 0\n order by usd desc, tokens desc, sessions desc, name asc\n `);\n\t\t\t\t} else if (command.input.stackBy === \"harness\") {\n\t\t\t\t\tresult = await command.db.execute<UsageDetailsQueryRow>(sql`\n with usage_totals as (\n select\n uh.harness as key,\n ${harnessSeriesExpr()} as name,\n coalesce(sum(${usageTokensExpr}) filter (where ${usageRangeClause}), 0)::float as tokens,\n coalesce(sum(${costExpr}) filter (where ${usageRangeClause}), 0)::float as usd,\n coalesce(sum(${costExpr}), 0)::float as \"totalUsd\"\n from usage_hour uh\n left join model_price mp\n on ${priceJoinCondition}\n where uh.user_id = ${command.userId}\n group by uh.harness\n ),\n session_totals as (\n select\n us.harness as key,\n ${harnessSeriesExpr(sql`us.harness`)} as name,\n count(*)::int as sessions\n from usage_session us\n where us.user_id = ${command.userId}\n and ${sessionRangeClause}\n group by us.harness\n )\n select\n coalesce(u.key, s.key) as id,\n coalesce(u.name, s.name) as name,\n coalesce(u.tokens, 0)::float as tokens,\n coalesce(s.sessions, 0)::int as sessions,\n coalesce(u.usd, 0)::float as usd,\n coalesce(u.\"totalUsd\", 0)::float as \"totalUsd\"\n from usage_totals u\n full outer join session_totals s on s.key = u.key\n where coalesce(u.tokens, 0) > 0\n or coalesce(s.sessions, 0) > 0\n or coalesce(u.usd, 0) > 0\n order by usd desc, tokens desc, sessions desc, name asc\n `);\n\t\t\t\t} else {\n\t\t\t\t\tconst modelNameExpr = canonicalModelExpr();\n\t\t\t\t\tresult = await command.db.execute<UsageDetailsQueryRow>(sql`\n with usage_totals as (\n select\n ${modelNameExpr} as name,\n coalesce(sum(${usageTokensExpr}) filter (where ${usageRangeClause}), 0)::float as tokens,\n coalesce(sum(${costExpr}) filter (where ${usageRangeClause}), 0)::float as usd,\n coalesce(sum(${costExpr}), 0)::float as \"totalUsd\"\n from usage_hour uh\n left join model_price mp\n on ${priceJoinCondition}\n where uh.user_id = ${command.userId}\n group by 1\n )\n select\n name as id,\n name,\n tokens,\n null::int as sessions,\n usd,\n \"totalUsd\"\n from usage_totals\n where tokens > 0\n or usd > 0\n order by usd desc, tokens desc, name asc\n `);\n\t\t\t\t}\n\n\t\t\t\treturn result.rows.map((row) => ({\n\t\t\t\t\tid: row.id,\n\t\t\t\t\tname: row.name,\n\t\t\t\t\ttokens: row.tokens,\n\t\t\t\t\tsessions: row.sessions,\n\t\t\t\t\tusd: row.usd,\n\t\t\t\t\ttotalUsd: row.totalUsd,\n\t\t\t\t}));\n\t\t\t},\n\t\t\tcatch: databaseError,\n\t\t}),\n\tweekdaySessions: (command) =>\n\t\tEffect.tryPromise({\n\t\t\ttry: async () => {\n\t\t\t\tconst rows = await selectSessionDistribution(\n\t\t\t\t\tcommand,\n\t\t\t\t\tlocalIsoWeekdayExpr(command.input.timeZone, sql`us.started_at`),\n\t\t\t\t);\n\t\t\t\treturn rows.map((row) => ({\n\t\t\t\t\tweekday: row.bucket,\n\t\t\t\t\tseriesName: row.seriesName,\n\t\t\t\t\tsessions: row.sessions,\n\t\t\t\t}));\n\t\t\t},\n\t\t\tcatch: databaseError,\n\t\t}),\n});\n\nconst StatsServiceLive = Layer.succeed(StatsService, makeStatsService());\n\nexport type {\n\tDailyCostCommand,\n\tDailySessionsCommand,\n\tDevicesCommand,\n\tHourlySessionsCommand,\n\tLeaderboardCommand,\n\tParticipantsCommand,\n\tSummaryCommand,\n\tTopDimensionsCommand,\n\tUsageDetailsCommand,\n\tWeekdaySessionsCommand,\n};\nexport { StatsService, StatsServiceLive };\n","import type { DbClient } from \"@oopst/db\";\nimport { sql } from \"drizzle-orm\";\nimport { priceJoinCondition } from \"./cost\";\n\n/**\n * Provider mapping mirrors the cost expression in queries/cost.ts.\n */\n/**\n * Module-level dedup. Lives for the lifetime of the Node process.\n * Per ADR 0006: one log line per unknown (harness, model) per boot.\n */\nconst seen = new Set<string>();\n\n/** Test hook — never call from runtime code. */\nexport function __resetMissingPriceCacheForTests(): void {\n\tseen.clear();\n}\n\nexport type MissingPriceLogger = {\n\twarn: (obj: Record<string, unknown>, msg: string) => void;\n};\n\n/**\n * Find every (harness, model) used in the last 90 days that has no row in\n * model_price under the mapped provider. For each not yet seen this boot,\n * emit one `logger.warn({ harness, model }, 'missing price')` call and record it.\n *\n * Wraps everything in a try/catch — observability must never crash a request.\n */\nexport async function logMissingPrices(db: DbClient, logger: MissingPriceLogger): Promise<void> {\n\ttry {\n\t\tconst { rows } = await db.execute<{ harness: string; model: string }>(sql`\n select distinct uh.harness, uh.model\n from usage_hour uh\n left join model_price mp\n on ${priceJoinCondition}\n where uh.hour_utc >= now() - interval '90 days'\n and mp.model is null\n `);\n\n\t\tfor (const row of rows) {\n\t\t\tconst key = `${row.harness}:${row.model}`;\n\t\t\tif (seen.has(key)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tseen.add(key);\n\t\t\ttry {\n\t\t\t\tlogger.warn({ harness: row.harness, model: row.model }, \"missing price\");\n\t\t\t} catch {\n\t\t\t\t// logger.warn must never propagate; observability is best-effort.\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// db error or anything else: swallow per ADR 0006 + PRD \"no broken cells\".\n\t}\n}\n","import type { DbClient } from \"@oopst/db\";\nimport { deviceTable, usageHourTable, usageSessionTable } from \"@oopst/db/schema\";\nimport { and, eq, max, type SQL, sql } from \"drizzle-orm\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { DatabaseError, SyncQuotaExceededError, SyncTimestampRejectedError } from \"../errors\";\nimport {\n\ttype BucketInput,\n\ttype GetWatermarkOutput,\n\ttype SessionInput,\n\tsyncUploadLimits,\n\ttype UpsertBucketsOutput,\n} from \"../schemas/sync\";\n\nconst HOURS_PER_DAY = 24;\nconst MINUTES_PER_HOUR = 60;\nconst SECONDS_PER_MINUTE = 60;\nconst MS_PER_SECOND = 1000;\nconst MS_PER_HOUR = MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MS_PER_SECOND;\nconst MS_PER_DAY = HOURS_PER_DAY * MS_PER_HOUR;\nconst MAX_SYNC_TIMESTAMP_AGE_MS = syncUploadLimits.maxTimestampPastDays * MS_PER_DAY;\nconst MAX_SYNC_FUTURE_SKEW_MS = syncUploadLimits.maxTimestampFutureHours * MS_PER_HOUR;\nconst MAX_SESSION_DURATION_MS =\n\tsyncUploadLimits.maxSessionDurationDays === null ? null : syncUploadLimits.maxSessionDurationDays * MS_PER_DAY;\nconst UTC_DAY_LENGTH = 10;\nconst UPSERT_CHUNK_SIZE = 500;\n\ntype GetWatermarkCommand = {\n\treadonly db: DbClient;\n\treadonly userId: string;\n\treadonly device: string;\n};\n\ntype UpsertBucketsCommand = {\n\treadonly db: DbClient;\n\treadonly userId: string;\n\treadonly device: string;\n\treadonly buckets: readonly BucketInput[];\n\treadonly sessions: readonly SessionInput[];\n};\n\ntype SyncTx = Parameters<Parameters<DbClient[\"transaction\"]>[0]>[0];\ntype SyncValidationError = SyncQuotaExceededError | SyncTimestampRejectedError;\n\ntype SyncServiceShape = {\n\treadonly getWatermark: (input: GetWatermarkCommand) => Effect.Effect<GetWatermarkOutput, DatabaseError>;\n\treadonly upsertBuckets: (\n\t\tinput: UpsertBucketsCommand,\n\t) => Effect.Effect<UpsertBucketsOutput, DatabaseError | SyncValidationError>;\n};\n\nclass SyncService extends Context.Service<SyncService, SyncServiceShape>()(\"@oopst/api/SyncService\") {}\n\nconst databaseError = (err: unknown): DatabaseError =>\n\tnew DatabaseError({ message: err instanceof Error ? err.message : \"Sync database operation failed\" });\n\nconst syncValidationError = (err: unknown): SyncValidationError => {\n\tif (err instanceof SyncQuotaExceededError || err instanceof SyncTimestampRejectedError) {\n\t\treturn err;\n\t}\n\treturn new SyncTimestampRejectedError({ message: err instanceof Error ? err.message : \"Invalid sync payload\" });\n};\n\nfunction toIsoString(value: Date | string | null | undefined): string | null {\n\tif (!value) {\n\t\treturn null;\n\t}\n\treturn (value instanceof Date ? value : new Date(value)).toISOString();\n}\n\nfunction bucketTokenTotal(bucket: BucketInput): number {\n\treturn bucket.inputTokens + bucket.outputTokens + bucket.cacheReadTokens + bucket.cacheCreateTokens;\n}\n\nfunction parseSyncTimestamp(field: string, value: string, nowMs: number): Date {\n\tconst date = new Date(value);\n\tconst time = date.getTime();\n\tif (Number.isNaN(time)) {\n\t\tthrow new SyncTimestampRejectedError({ message: `${field} must be a valid UTC timestamp` });\n\t}\n\tif (time < nowMs - MAX_SYNC_TIMESTAMP_AGE_MS || time > nowMs + MAX_SYNC_FUTURE_SKEW_MS) {\n\t\tthrow new SyncTimestampRejectedError({ message: `${field} is outside the allowed sync timestamp window` });\n\t}\n\treturn date;\n}\n\nfunction assertUtcHour(field: string, value: string, nowMs: number): Date {\n\tconst date = parseSyncTimestamp(field, value, nowMs);\n\tif (date.getUTCMinutes() !== 0 || date.getUTCSeconds() !== 0 || date.getUTCMilliseconds() !== 0) {\n\t\tthrow new SyncTimestampRejectedError({ message: `${field} must be aligned to the start of a UTC hour` });\n\t}\n\treturn date;\n}\n\nfunction assertSessionRange(field: string, session: SessionInput, nowMs: number): void {\n\tconst startedAt = parseSyncTimestamp(`${field}.startedAt`, session.startedAt, nowMs);\n\tconst lastSeenAt = parseSyncTimestamp(`${field}.lastSeenAt`, session.lastSeenAt, nowMs);\n\tconst durationMs = lastSeenAt.getTime() - startedAt.getTime();\n\tif (durationMs < 0) {\n\t\tthrow new SyncTimestampRejectedError({ message: `${field}.lastSeenAt must be greater than or equal to startedAt` });\n\t}\n\tif (MAX_SESSION_DURATION_MS !== null && durationMs > MAX_SESSION_DURATION_MS) {\n\t\tthrow new SyncTimestampRejectedError({ message: `${field} exceeds the maximum session duration` });\n\t}\n}\n\nfunction assertSyncPayload(input: { buckets: readonly BucketInput[]; sessions: readonly SessionInput[] }): void {\n\tconst nowMs = Date.now();\n\tlet uploadTokens = 0;\n\n\tfor (const [index, bucket] of input.buckets.entries()) {\n\t\tassertUtcHour(`buckets[${index}].hourUtc`, bucket.hourUtc, nowMs);\n\t\tuploadTokens += bucketTokenTotal(bucket);\n\t}\n\n\tif (syncUploadLimits.maxTokensPerSync !== null && uploadTokens > syncUploadLimits.maxTokensPerSync) {\n\t\tthrow new SyncQuotaExceededError({\n\t\t\tmessage: `sync upload exceeds the per-token/device upload quota of ${syncUploadLimits.maxTokensPerSync} tokens`,\n\t\t});\n\t}\n\n\tfor (const [index, session] of input.sessions.entries()) {\n\t\tassertSessionRange(`sessions[${index}]`, session, nowMs);\n\t}\n}\n\nfunction utcDay(value: string): string {\n\treturn new Date(value).toISOString().slice(0, UTC_DAY_LENGTH);\n}\n\nfunction unique(values: string[]): string[] {\n\treturn Array.from(new Set(values));\n}\n\nfunction daySqlList(days: string[]): SQL {\n\treturn sql.join(\n\t\tdays.map((day) => sql`${day}::date`),\n\t\tsql`, `,\n\t);\n}\n\nasync function upsertUsageHourChunks(\n\ttx: SyncTx,\n\tinput: { buckets: readonly BucketInput[]; userId: string; deviceId: string },\n): Promise<void> {\n\tfor (let i = 0; i < input.buckets.length; i += UPSERT_CHUNK_SIZE) {\n\t\tconst slice = input.buckets.slice(i, i + UPSERT_CHUNK_SIZE);\n\t\tif (slice.length === 0) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// biome-ignore lint/performance/noAwaitInLoops: sequential chunked inserts are intentional\n\t\tawait tx\n\t\t\t.insert(usageHourTable)\n\t\t\t.values(\n\t\t\t\tslice.map((bucket) => ({\n\t\t\t\t\tuserId: input.userId,\n\t\t\t\t\tdeviceId: input.deviceId,\n\t\t\t\t\tharness: bucket.harness,\n\t\t\t\t\tmodel: bucket.model,\n\t\t\t\t\thourUtc: new Date(bucket.hourUtc),\n\t\t\t\t\tinputTokens: bucket.inputTokens,\n\t\t\t\t\toutputTokens: bucket.outputTokens,\n\t\t\t\t\tcacheReadTokens: bucket.cacheReadTokens,\n\t\t\t\t\tcacheCreateTokens: bucket.cacheCreateTokens,\n\t\t\t\t\tsessionCount: bucket.sessionCount,\n\t\t\t\t})),\n\t\t\t)\n\t\t\t.onConflictDoUpdate({\n\t\t\t\ttarget: [\n\t\t\t\t\tusageHourTable.userId,\n\t\t\t\t\tusageHourTable.deviceId,\n\t\t\t\t\tusageHourTable.harness,\n\t\t\t\t\tusageHourTable.model,\n\t\t\t\t\tusageHourTable.hourUtc,\n\t\t\t\t],\n\t\t\t\tset: {\n\t\t\t\t\tinputTokens: sql`excluded.input_tokens`,\n\t\t\t\t\toutputTokens: sql`excluded.output_tokens`,\n\t\t\t\t\tcacheReadTokens: sql`excluded.cache_read_tokens`,\n\t\t\t\t\tcacheCreateTokens: sql`excluded.cache_create_tokens`,\n\t\t\t\t\tsessionCount: sql`excluded.session_count`,\n\t\t\t\t\tupdatedAt: sql`now()`,\n\t\t\t\t},\n\t\t\t});\n\t}\n}\n\nasync function upsertUsageSessionChunks(\n\ttx: SyncTx,\n\tinput: { sessions: readonly SessionInput[]; userId: string; deviceId: string },\n): Promise<void> {\n\tfor (let i = 0; i < input.sessions.length; i += UPSERT_CHUNK_SIZE) {\n\t\tconst slice = input.sessions.slice(i, i + UPSERT_CHUNK_SIZE);\n\t\tif (slice.length === 0) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// biome-ignore lint/performance/noAwaitInLoops: sequential chunked inserts are intentional\n\t\tawait tx\n\t\t\t.insert(usageSessionTable)\n\t\t\t.values(\n\t\t\t\tslice.map((session) => ({\n\t\t\t\t\tuserId: input.userId,\n\t\t\t\t\tdeviceId: input.deviceId,\n\t\t\t\t\tharness: session.harness,\n\t\t\t\t\tsessionKey: session.sessionKey,\n\t\t\t\t\tstartedAt: new Date(session.startedAt),\n\t\t\t\t\tlastSeenAt: new Date(session.lastSeenAt),\n\t\t\t\t})),\n\t\t\t)\n\t\t\t.onConflictDoUpdate({\n\t\t\t\ttarget: [\n\t\t\t\t\tusageSessionTable.userId,\n\t\t\t\t\tusageSessionTable.deviceId,\n\t\t\t\t\tusageSessionTable.harness,\n\t\t\t\t\tusageSessionTable.sessionKey,\n\t\t\t\t],\n\t\t\t\tset: {\n\t\t\t\t\tstartedAt: sql`least(${usageSessionTable.startedAt}, excluded.started_at)`,\n\t\t\t\t\tlastSeenAt: sql`greatest(${usageSessionTable.lastSeenAt}, excluded.last_seen_at)`,\n\t\t\t\t\tupdatedAt: sql`now()`,\n\t\t\t\t},\n\t\t\t});\n\t}\n}\n\nasync function assertDeviceDayTokenQuota(\n\ttx: SyncTx,\n\tinput: { userId: string; deviceId: string; deviceName: string; days: string[] },\n): Promise<void> {\n\tif (input.days.length === 0 || syncUploadLimits.maxDeviceDayTokens === null) {\n\t\treturn;\n\t}\n\n\tconst { maxDeviceDayTokens } = syncUploadLimits;\n\tconst tokenQuotaRows = await tx.execute<{ day: string; totalTokens: string }>(sql`\n\t\tselect\n\t\t\t(uh.hour_utc at time zone 'UTC')::date::text as day,\n\t\t\tsum(uh.input_tokens + uh.output_tokens + uh.cache_read_tokens + uh.cache_create_tokens)::text as \"totalTokens\"\n\t\tfrom usage_hour uh\n\t\twhere uh.user_id = ${input.userId}\n\t\t\tand uh.device_id = ${input.deviceId}\n\t\t\tand (uh.hour_utc at time zone 'UTC')::date in (${daySqlList(input.days)})\n\t\tgroup by 1\n\t\thaving sum(uh.input_tokens + uh.output_tokens + uh.cache_read_tokens + uh.cache_create_tokens) > ${maxDeviceDayTokens}\n\t`);\n\tconst [quotaRow] = tokenQuotaRows.rows;\n\tif (quotaRow) {\n\t\tthrow new SyncQuotaExceededError({\n\t\t\tmessage: `device ${input.deviceName} exceeds the daily token quota for ${quotaRow.day}: ${quotaRow.totalTokens} tokens`,\n\t\t});\n\t}\n}\n\nasync function assertDeviceDaySessionQuota(\n\ttx: SyncTx,\n\tinput: { userId: string; deviceId: string; deviceName: string; days: string[] },\n): Promise<void> {\n\tif (input.days.length === 0) {\n\t\treturn;\n\t}\n\n\tconst sessionQuotaRows = await tx.execute<{ day: string; sessionCount: number }>(sql`\n\t\tselect\n\t\t\t(us.started_at at time zone 'UTC')::date::text as day,\n\t\t\tcount(*)::int as \"sessionCount\"\n\t\tfrom usage_session us\n\t\twhere us.user_id = ${input.userId}\n\t\t\tand us.device_id = ${input.deviceId}\n\t\t\tand (us.started_at at time zone 'UTC')::date in (${daySqlList(input.days)})\n\t\tgroup by 1\n\t\thaving count(*) > ${syncUploadLimits.maxDeviceDaySessions}\n\t`);\n\tconst [quotaRow] = sessionQuotaRows.rows;\n\tif (quotaRow) {\n\t\tthrow new SyncQuotaExceededError({\n\t\t\tmessage: `device ${input.deviceName} exceeds the daily session quota for ${quotaRow.day}: ${quotaRow.sessionCount} sessions`,\n\t\t});\n\t}\n}\n\nconst makeSyncService = (): SyncServiceShape => ({\n\tgetWatermark: (input) =>\n\t\tEffect.tryPromise({\n\t\t\ttry: async () => {\n\t\t\t\tconst [device] = await input.db\n\t\t\t\t\t.insert(deviceTable)\n\t\t\t\t\t.values({ userId: input.userId, name: input.device })\n\t\t\t\t\t.onConflictDoUpdate({\n\t\t\t\t\t\ttarget: [deviceTable.userId, deviceTable.name],\n\t\t\t\t\t\tset: { lastSeen: sql`now()` },\n\t\t\t\t\t})\n\t\t\t\t\t.returning({ id: deviceTable.id, sessionKeySalt: deviceTable.sessionKeySalt });\n\n\t\t\t\tif (!device) {\n\t\t\t\t\tthrow new Error(\"device upsert returned no rows\");\n\t\t\t\t}\n\n\t\t\t\tconst [row] = await input.db\n\t\t\t\t\t.select({ hourUtc: max(usageHourTable.hourUtc) })\n\t\t\t\t\t.from(usageHourTable)\n\t\t\t\t\t.where(and(eq(usageHourTable.userId, input.userId), eq(usageHourTable.deviceId, device.id)));\n\n\t\t\t\treturn {\n\t\t\t\t\twatermarkHourUtc: toIsoString(row?.hourUtc),\n\t\t\t\t\tsessionKeySalt: device.sessionKeySalt,\n\t\t\t\t};\n\t\t\t},\n\t\t\tcatch: databaseError,\n\t\t}),\n\tupsertBuckets: (input) =>\n\t\tEffect.gen(function* () {\n\t\t\tyield* Effect.try({\n\t\t\t\ttry: () => assertSyncPayload(input),\n\t\t\t\tcatch: syncValidationError,\n\t\t\t});\n\n\t\t\treturn yield* Effect.tryPromise({\n\t\t\t\ttry: async () =>\n\t\t\t\t\tawait input.db.transaction(async (tx) => {\n\t\t\t\t\t\tconst [device] = await tx\n\t\t\t\t\t\t\t.insert(deviceTable)\n\t\t\t\t\t\t\t.values({ userId: input.userId, name: input.device })\n\t\t\t\t\t\t\t.onConflictDoUpdate({\n\t\t\t\t\t\t\t\ttarget: [deviceTable.userId, deviceTable.name],\n\t\t\t\t\t\t\t\tset: { lastSeen: sql`now()` },\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.returning({ id: deviceTable.id });\n\n\t\t\t\t\t\tif (!device) {\n\t\t\t\t\t\t\tthrow new Error(\"device upsert returned no rows\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tawait upsertUsageHourChunks(tx, { buckets: input.buckets, userId: input.userId, deviceId: device.id });\n\t\t\t\t\t\tawait upsertUsageSessionChunks(tx, {\n\t\t\t\t\t\t\tsessions: input.sessions,\n\t\t\t\t\t\t\tuserId: input.userId,\n\t\t\t\t\t\t\tdeviceId: device.id,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst bucketDays = unique(input.buckets.map((bucket) => utcDay(bucket.hourUtc)));\n\t\t\t\t\t\tconst sessionDays = unique(input.sessions.map((session) => utcDay(session.startedAt)));\n\t\t\t\t\t\tawait assertDeviceDayTokenQuota(tx, {\n\t\t\t\t\t\t\tuserId: input.userId,\n\t\t\t\t\t\t\tdeviceId: device.id,\n\t\t\t\t\t\t\tdeviceName: input.device,\n\t\t\t\t\t\t\tdays: bucketDays,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tawait assertDeviceDaySessionQuota(tx, {\n\t\t\t\t\t\t\tuserId: input.userId,\n\t\t\t\t\t\t\tdeviceId: device.id,\n\t\t\t\t\t\t\tdeviceName: input.device,\n\t\t\t\t\t\t\tdays: sessionDays,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn { upserted: input.buckets.length, upsertedSessions: input.sessions.length };\n\t\t\t\t\t}),\n\t\t\t\tcatch: (err) => {\n\t\t\t\t\tif (err instanceof SyncQuotaExceededError || err instanceof SyncTimestampRejectedError) {\n\t\t\t\t\t\treturn err;\n\t\t\t\t\t}\n\t\t\t\t\treturn databaseError(err);\n\t\t\t\t},\n\t\t\t});\n\t\t}),\n});\n\nconst SyncServiceLive = Layer.succeed(SyncService, makeSyncService());\n\nexport type { GetWatermarkCommand, UpsertBucketsCommand };\nexport { SyncService, SyncServiceLive };\n","import type { DbClient } from \"@oopst/db\";\nimport type { User } from \"@oopst/db/schema\";\nimport { apiTokenTable, userTable } from \"@oopst/db/schema\";\nimport { and, eq, isNull } from \"drizzle-orm\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { extractPrefix, verifyToken } from \"../auth/tokens\";\nimport { DatabaseError } from \"../errors\";\n\ntype AuthenticateTokenCommand = {\n\treadonly db: DbClient;\n\treadonly authorizationHeader: string | null;\n};\n\ntype AuthenticatedToken = {\n\treadonly user: User;\n\treadonly tokenId: string;\n};\n\ntype TokenAuthServiceShape = {\n\treadonly authenticate: (input: AuthenticateTokenCommand) => Effect.Effect<AuthenticatedToken | null, DatabaseError>;\n};\n\nconst BEARER_PREFIX = \"Bearer \";\nconst TOKEN_LOOKUP_LIMIT = 5;\n\nclass TokenAuthService extends Context.Service<TokenAuthService, TokenAuthServiceShape>()(\n\t\"@oopst/api/TokenAuthService\",\n) {}\n\nconst databaseError = (err: unknown): DatabaseError =>\n\tnew DatabaseError({ message: err instanceof Error ? err.message : \"Token auth database operation failed\" });\n\nconst makeTokenAuthService = (): TokenAuthServiceShape => ({\n\tauthenticate: (input) =>\n\t\tEffect.tryPromise({\n\t\t\ttry: async () => {\n\t\t\t\tif (!input.authorizationHeader?.startsWith(BEARER_PREFIX)) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tconst raw = input.authorizationHeader.slice(BEARER_PREFIX.length).trim();\n\t\t\t\tconst prefix = extractPrefix(raw);\n\t\t\t\tif (prefix === null) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tconst rows = await input.db\n\t\t\t\t\t.select({ token: apiTokenTable, user: userTable })\n\t\t\t\t\t.from(apiTokenTable)\n\t\t\t\t\t.innerJoin(userTable, eq(apiTokenTable.userId, userTable.id))\n\t\t\t\t\t.where(and(eq(apiTokenTable.prefix, prefix), isNull(apiTokenTable.revokedAt)))\n\t\t\t\t\t.limit(TOKEN_LOOKUP_LIMIT);\n\n\t\t\t\tfor (const row of rows) {\n\t\t\t\t\t// biome-ignore lint/performance/noAwaitInLoops: sequential argon2id verification must stay in order.\n\t\t\t\t\tconst ok = await verifyToken(raw, row.token.tokenHash);\n\t\t\t\t\tif (ok) {\n\t\t\t\t\t\tawait input.db\n\t\t\t\t\t\t\t.update(apiTokenTable)\n\t\t\t\t\t\t\t.set({ lastUsedAt: new Date() })\n\t\t\t\t\t\t\t.where(eq(apiTokenTable.id, row.token.id));\n\t\t\t\t\t\treturn { user: row.user, tokenId: row.token.id };\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t},\n\t\t\tcatch: databaseError,\n\t\t}),\n});\n\nconst TokenAuthServiceLive = Layer.succeed(TokenAuthService, makeTokenAuthService());\n\nexport type { AuthenticatedToken, AuthenticateTokenCommand };\nexport { TokenAuthService, TokenAuthServiceLive };\n","import type { DbClient } from \"@oopst/db\";\nimport { apiTokenTable } from \"@oopst/db/schema\";\nimport { and, eq } from \"drizzle-orm\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { generateToken } from \"../auth/tokens\";\nimport { DatabaseError, NotFoundError } from \"../errors\";\n\ntype TokenMetadata = {\n\treadonly id: string;\n\treadonly name: string;\n\treadonly prefix: string;\n\treadonly lastUsedAt: Date | null;\n\treadonly createdAt: Date;\n\treadonly revokedAt: Date | null;\n};\n\ntype ListTokensCommand = {\n\treadonly db: DbClient;\n\treadonly userId: string;\n};\n\ntype CreateTokenCommand = {\n\treadonly db: DbClient;\n\treadonly userId: string;\n\treadonly name: string;\n};\n\ntype RevokeTokenCommand = {\n\treadonly db: DbClient;\n\treadonly userId: string;\n\treadonly id: string;\n};\n\ntype ListTokensOutput = {\n\treadonly tokens: readonly TokenMetadata[];\n};\n\ntype CreateTokenOutput = {\n\treadonly token: string;\n\treadonly metadata: TokenMetadata;\n};\n\ntype RevokeTokenOutput = {\n\treadonly ok: true;\n};\n\ntype TokenServiceShape = {\n\treadonly list: (input: ListTokensCommand) => Effect.Effect<ListTokensOutput, DatabaseError>;\n\treadonly create: (input: CreateTokenCommand) => Effect.Effect<CreateTokenOutput, DatabaseError>;\n\treadonly revoke: (input: RevokeTokenCommand) => Effect.Effect<RevokeTokenOutput, DatabaseError | NotFoundError>;\n};\n\nclass TokenService extends Context.Service<TokenService, TokenServiceShape>()(\"@oopst/api/TokenService\") {}\n\nconst tokenMetadataSelection = {\n\tid: apiTokenTable.id,\n\tname: apiTokenTable.name,\n\tprefix: apiTokenTable.prefix,\n\tlastUsedAt: apiTokenTable.lastUsedAt,\n\tcreatedAt: apiTokenTable.createdAt,\n\trevokedAt: apiTokenTable.revokedAt,\n};\n\nconst databaseError = (err: unknown): DatabaseError =>\n\tnew DatabaseError({ message: err instanceof Error ? err.message : \"Token database operation failed\" });\n\nconst failedCreateTokenError = (): DatabaseError => new DatabaseError({ message: \"Failed to create token\" });\n\nconst tokenNotFoundError = (): NotFoundError => new NotFoundError({ message: \"Token not found\" });\n\nconst makeTokenService = (): TokenServiceShape => ({\n\tlist: (input) =>\n\t\tEffect.tryPromise({\n\t\t\ttry: async () => {\n\t\t\t\tconst rows = await input.db\n\t\t\t\t\t.select(tokenMetadataSelection)\n\t\t\t\t\t.from(apiTokenTable)\n\t\t\t\t\t.where(eq(apiTokenTable.userId, input.userId));\n\t\t\t\treturn { tokens: rows };\n\t\t\t},\n\t\t\tcatch: databaseError,\n\t\t}),\n\n\tcreate: (input) =>\n\t\tEffect.gen(function* () {\n\t\t\tconst generated = generateToken();\n\t\t\tconst row = yield* Effect.tryPromise({\n\t\t\t\ttry: async () => {\n\t\t\t\t\tconst tokenHash = await generated.hash;\n\t\t\t\t\tconst [created] = await input.db\n\t\t\t\t\t\t.insert(apiTokenTable)\n\t\t\t\t\t\t.values({\n\t\t\t\t\t\t\tuserId: input.userId,\n\t\t\t\t\t\t\tname: input.name,\n\t\t\t\t\t\t\ttokenHash: tokenHash,\n\t\t\t\t\t\t\tprefix: generated.prefix,\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.returning(tokenMetadataSelection);\n\t\t\t\t\treturn created;\n\t\t\t\t},\n\t\t\t\tcatch: databaseError,\n\t\t\t});\n\t\t\tif (!row) {\n\t\t\t\treturn yield* Effect.fail(failedCreateTokenError());\n\t\t\t}\n\t\t\treturn { token: generated.token, metadata: row };\n\t\t}),\n\n\trevoke: (input) =>\n\t\tEffect.gen(function* () {\n\t\t\tconst result = yield* Effect.tryPromise({\n\t\t\t\ttry: () =>\n\t\t\t\t\tinput.db\n\t\t\t\t\t\t.update(apiTokenTable)\n\t\t\t\t\t\t.set({ revokedAt: new Date() })\n\t\t\t\t\t\t.where(and(eq(apiTokenTable.id, input.id), eq(apiTokenTable.userId, input.userId)))\n\t\t\t\t\t\t.returning({ id: apiTokenTable.id }),\n\t\t\t\tcatch: databaseError,\n\t\t\t});\n\t\t\tif (result.length === 0) {\n\t\t\t\treturn yield* Effect.fail(tokenNotFoundError());\n\t\t\t}\n\t\t\treturn { ok: true as const };\n\t\t}),\n});\n\nconst TokenServiceLive = Layer.succeed(TokenService, makeTokenService());\n\nexport type { CreateTokenCommand, CreateTokenOutput, ListTokensCommand, ListTokensOutput, RevokeTokenCommand };\nexport { TokenService, TokenServiceLive };\n","import { UnauthorizedError } from \"@oopst/api\";\n\n/**\n * Phase-4 CLI exit codes. The mapping is part of the public contract — schedulers\n * (cron, launchd) rely on these to distinguish transient from permanent failures.\n */\nconst SUCCESS_EXIT_CODE = 0;\nconst ZERO_BUCKETS_EXIT_CODE = 1;\nconst UNAUTHORIZED_EXIT_CODE = 2;\nconst NETWORK_ERROR_EXIT_CODE = 3;\nconst INVALID_ARGUMENTS_EXIT_CODE = 4;\nconst GENERAL_FAILURE_EXIT_CODE = 5;\n\nconst EXIT = {\n\tsuccess: SUCCESS_EXIT_CODE,\n\tzeroBucketsButSourcesExist: ZERO_BUCKETS_EXIT_CODE,\n\tunauthorized: UNAUTHORIZED_EXIT_CODE,\n\tnetworkError: NETWORK_ERROR_EXIT_CODE,\n\tinvalidArguments: INVALID_ARGUMENTS_EXIT_CODE,\n\tgeneralFailure: GENERAL_FAILURE_EXIT_CODE,\n} as const;\n\ntype ExitCode = (typeof EXIT)[keyof typeof EXIT];\n\nclass SyncError extends Error {\n\tpublic readonly exitCode: ExitCode;\n\tpublic constructor(exitCode: ExitCode, message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"SyncError\";\n\t\tthis.exitCode = exitCode;\n\t}\n}\n\nfunction isUnauthorizedError(err: unknown): boolean {\n\tif (err instanceof UnauthorizedError) {\n\t\treturn true;\n\t}\n\tif (typeof err !== \"object\" || err === null) {\n\t\treturn false;\n\t}\n\tconst candidate = err as { _tag?: string; data?: { code?: string }; message?: string };\n\treturn candidate._tag === \"UnauthorizedError\" || candidate.data?.code === \"UNAUTHORIZED\";\n}\n\nconst NETWORK_ERROR_CODES = [\"ECONNREFUSED\", \"ENOTFOUND\", \"ECONNRESET\", \"EAI_AGAIN\", \"ETIMEDOUT\"];\nconst NETWORK_ERROR_PATTERN = /fetch failed|network|ECONN|ENOTFOUND|ETIMEDOUT/iu;\nconst NETWORK_HTTP_ERROR_KINDS = [\"InvalidUrlError\", \"TransportError\"];\n\nfunction isNetworkError(err: unknown): boolean {\n\tif (typeof err !== \"object\" || err === null) {\n\t\treturn false;\n\t}\n\tconst rpcReason = (err as { reason?: { _tag?: string; kind?: string } }).reason;\n\tif (rpcReason?._tag === \"HttpError\" && rpcReason.kind && NETWORK_HTTP_ERROR_KINDS.includes(rpcReason.kind)) {\n\t\treturn true;\n\t}\n\tconst code = (err as { cause?: { code?: string } }).cause?.code;\n\tif (code && NETWORK_ERROR_CODES.includes(code)) {\n\t\treturn true;\n\t}\n\tconst message = (err as Error).message ?? \"\";\n\treturn NETWORK_ERROR_PATTERN.test(message);\n}\n\nexport type { ExitCode };\nexport { EXIT, isNetworkError, isUnauthorizedError, SyncError };\n","import { dirname, isAbsolute, join, matchesGlob, relative } from \"node:path\";\nimport { parseClaude, parseCodex, parseHermes, parseOpenCode, parsePi } from \"@oopst/parsers\";\nimport { Effect } from \"effect\";\nimport type { CliEnv } from \"../config\";\nimport { normalizeConfigPath } from \"../config\";\nimport { ParserSources, ParserSourcesLive } from \"../services/parser-sources\";\nimport type { ParserBundle, ParserFactoryContext } from \"./run\";\n\ntype RealParserResult = ParserBundle & {\n\t/** Reports whether ANY source root existed for any harness. */\n\tanySourceExisted: boolean;\n};\n\ntype BuildRealParserFactoryOptions = {\n\treadonly exclude?: readonly string[];\n};\n\ntype ParserSourcePlan = {\n\treadonly anySourceExisted: boolean;\n\treadonly codexSessionsRoot: string;\n\treadonly codexArchivedRoot: string;\n\treadonly claudeRoot: string;\n\treadonly piRoot: string;\n\treadonly hermesRoot: string;\n\treadonly opencodeRoot: string;\n\treadonly home: string;\n\treadonly env: CliEnv;\n\treadonly exclude: readonly string[];\n};\n\nconst OPENCODE_DB_FILE_PATTERN = /^opencode(?:-[^/]+)?\\.db$/u;\nconst GLOB_PATTERN = /[*?[\\]{}]/u;\n\nfunction sessionsRoot(agentDir: string | undefined, sessionDir: string | undefined, fallbackAgentDir: string): string {\n\treturn sessionDir ?? join(agentDir ?? fallbackAgentDir, \"sessions\");\n}\n\nfunction hermesRoot(\n\thome: string,\n\tenv: { hermesAgentDir: string | undefined; hermesSessionDir: string | undefined },\n): string {\n\treturn env.hermesSessionDir ?? env.hermesAgentDir ?? join(home, \".hermes\");\n}\n\nfunction defaultOpenCodeDataRoot(home: string): string {\n\treturn join(home, \".local\", \"share\", \"opencode\");\n}\n\nfunction openCodeRoot(\n\thome: string,\n\tenv: { opencodeDataDir: string | undefined; opencodeDbPath: string | undefined },\n): string {\n\tconst dataRoot = env.opencodeDataDir ?? defaultOpenCodeDataRoot(home);\n\tconst dbPath = env.opencodeDbPath;\n\tif (dbPath === undefined || dbPath === \":memory:\") {\n\t\treturn dbPath ?? dataRoot;\n\t}\n\treturn isAbsolute(dbPath) ? dbPath : join(dataRoot, dbPath);\n}\n\nfunction hasOpenCodeDatabaseEffect(root: string): Effect.Effect<boolean, never, ParserSources> {\n\treturn Effect.gen(function* () {\n\t\tconst sources = yield* ParserSources;\n\t\tconst entries = yield* sources.readDir(root);\n\t\tfor (const entry of entries) {\n\t\t\tif (OPENCODE_DB_FILE_PATTERN.test(entry) && (yield* sources.isFile(join(root, entry)))) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t});\n}\n\nfunction openCodeSourceExistsEffect(root: string): Effect.Effect<boolean, never, ParserSources> {\n\tif (root === \":memory:\") {\n\t\treturn Effect.succeed(false);\n\t}\n\treturn Effect.gen(function* () {\n\t\tconst sources = yield* ParserSources;\n\t\tif (yield* sources.isFile(root)) {\n\t\t\treturn true;\n\t\t}\n\t\treturn (\n\t\t\t(yield* hasOpenCodeDatabaseEffect(root)) ||\n\t\t\t(yield* sources.exists(join(root, \"storage\", \"message\"))) ||\n\t\t\t(yield* sources.exists(join(root, \"storage\", \"session\", \"message\"))) ||\n\t\t\t(yield* sources.exists(join(root, \"project\")))\n\t\t);\n\t});\n}\n\nfunction hermesSourceExistsEffect(root: string): Effect.Effect<boolean, never, ParserSources> {\n\treturn Effect.gen(function* () {\n\t\tconst sources = yield* ParserSources;\n\t\treturn (\n\t\t\t(yield* sources.isFile(root)) ||\n\t\t\t(yield* sources.exists(join(root, \"state.db\"))) ||\n\t\t\t(yield* sources.exists(join(root, \"sessions\"))) ||\n\t\t\t(yield* sources.exists(join(root, \"agent\", \"sessions\")))\n\t\t);\n\t});\n}\n\nfunction isPathInsideOrEqual(path: string, parent: string): boolean {\n\tconst rel = relative(parent, path);\n\treturn rel === \"\" || !(rel.startsWith(\"..\") || isAbsolute(rel));\n}\n\nfunction comparableLocalPath(path: string, home: string): string | undefined {\n\tif (!(path === \"~\" || path.startsWith(\"~/\") || isAbsolute(path))) {\n\t\treturn undefined;\n\t}\n\treturn normalizeConfigPath(path, home);\n}\n\nfunction hasGlobPattern(path: string): boolean {\n\treturn GLOB_PATTERN.test(path);\n}\n\nfunction matchesPathOrAncestorGlob(path: string, pattern: string): boolean {\n\tlet current = path;\n\tfor (;;) {\n\t\tif (matchesGlob(current, pattern)) {\n\t\t\treturn true;\n\t\t}\n\t\tconst parent = dirname(current);\n\t\tif (parent === current) {\n\t\t\treturn false;\n\t\t}\n\t\tcurrent = parent;\n\t}\n}\n\nfunction createExcludeMatcher(options: {\n\treadonly exclude: readonly string[];\n\treadonly home: string;\n}): (path: string) => boolean {\n\tconst normalizedExclude = options.exclude.map((path) => {\n\t\tconst normalizedPath = normalizeConfigPath(path, options.home);\n\t\treturn {\n\t\t\tisGlob: hasGlobPattern(normalizedPath),\n\t\t\tpath: normalizedPath,\n\t\t};\n\t});\n\n\treturn (path) => {\n\t\tconst comparable = comparableLocalPath(path, options.home);\n\t\tif (comparable === undefined) {\n\t\t\treturn false;\n\t\t}\n\t\treturn normalizedExclude.some((exclude) =>\n\t\t\texclude.isGlob\n\t\t\t\t? matchesPathOrAncestorGlob(comparable, exclude.path)\n\t\t\t\t: isPathInsideOrEqual(comparable, exclude.path),\n\t\t);\n\t};\n}\n\nfunction resolveParserSourcePlanEffect(\n\toptions: BuildRealParserFactoryOptions = {},\n): Effect.Effect<ParserSourcePlan, never, ParserSources> {\n\treturn Effect.gen(function* () {\n\t\tconst sources = yield* ParserSources;\n\t\tconst home = yield* sources.homeDir;\n\t\tconst env = yield* sources.cliEnv;\n\t\tconst codexSessionsRoot = join(home, \".codex\", \"sessions\");\n\t\tconst codexArchivedRoot = join(home, \".codex\", \"archived_sessions\");\n\t\tconst codexExists = (yield* sources.exists(codexSessionsRoot)) || (yield* sources.exists(codexArchivedRoot));\n\n\t\tconst envDir = env.claudeConfigDir;\n\t\tconst claudeRoot = envDir == null ? join(home, \".claude\", \"projects\") : join(envDir, \"projects\");\n\t\tconst claudeExists = yield* sources.exists(claudeRoot);\n\n\t\tconst piRoot = sessionsRoot(env.piAgentDir, env.piSessionDir, join(home, \".pi\", \"agent\"));\n\t\tconst piExists = yield* sources.exists(piRoot);\n\n\t\tconst hermesSourceRoot = hermesRoot(home, env);\n\t\tconst hermesExists = yield* hermesSourceExistsEffect(hermesSourceRoot);\n\n\t\tconst opencodeSourceRoot = openCodeRoot(home, env);\n\t\tconst opencodeExists = yield* openCodeSourceExistsEffect(opencodeSourceRoot);\n\t\tconst exclude = options.exclude ?? env.exclude;\n\n\t\treturn {\n\t\t\tanySourceExisted: codexExists || claudeExists || piExists || hermesExists || opencodeExists,\n\t\t\tcodexSessionsRoot: codexSessionsRoot,\n\t\t\tcodexArchivedRoot: codexArchivedRoot,\n\t\t\tclaudeRoot: claudeRoot,\n\t\t\tpiRoot: piRoot,\n\t\t\thermesRoot: hermesSourceRoot,\n\t\t\topencodeRoot: opencodeSourceRoot,\n\t\t\thome: home,\n\t\t\tenv: env,\n\t\t\texclude: exclude,\n\t\t};\n\t});\n}\n\nfunction buildFactoryFromPlan(plan: ParserSourcePlan): (ctx: ParserFactoryContext) => RealParserResult {\n\tconst excludePath = createExcludeMatcher({ exclude: plan.exclude, home: plan.home });\n\n\treturn (ctx) => ({\n\t\tanySourceExisted: plan.anySourceExisted,\n\t\tcodex: parseCodex({\n\t\t\tcutoff: ctx.cutoff,\n\t\t\texcludePath: excludePath,\n\t\t\troot: plan.codexSessionsRoot,\n\t\t\tarchivedRoot: plan.codexArchivedRoot,\n\t\t}),\n\t\tclaudeCode: parseClaude({ cutoff: ctx.cutoff, excludePath: excludePath, root: plan.claudeRoot }),\n\t\tpi: parsePi({ cutoff: ctx.cutoff, excludePath: excludePath, root: plan.piRoot }),\n\t\thermes: parseHermes({ cutoff: ctx.cutoff, excludePath: excludePath, root: plan.hermesRoot }),\n\t\topencode: parseOpenCode({ cutoff: ctx.cutoff, excludePath: excludePath, root: plan.opencodeRoot }),\n\t});\n}\n\nfunction buildRealParserFactoryEffect(\n\toptions: BuildRealParserFactoryOptions = {},\n): Effect.Effect<(ctx: ParserFactoryContext) => RealParserResult, never, ParserSources> {\n\treturn Effect.map(resolveParserSourcePlanEffect(options), buildFactoryFromPlan);\n}\n\nfunction buildRealParserFactory(\n\toptions: BuildRealParserFactoryOptions = {},\n): (ctx: ParserFactoryContext) => RealParserResult {\n\treturn buildRealParserFactoryEffect(options).pipe(Effect.provide(ParserSourcesLive), Effect.runSync);\n}\n\nexport type { BuildRealParserFactoryOptions, ParserSourcePlan, RealParserResult };\nexport { buildRealParserFactory, buildRealParserFactoryEffect, createExcludeMatcher, resolveParserSourcePlanEffect };\n","export { parseClaude } from \"./claude/index\";\nexport { parseCodex } from \"./codex/index\";\nexport type { FileWalkerShape } from \"./effect/file-walker\";\nexport { FileWalker, FileWalkerLive, makeFileWalker } from \"./effect/file-walker\";\nexport { parseOpenCode } from \"./opencode/index\";\nexport { parseHermes, parsePi } from \"./pi/index\";\nexport type { Harness, LocalPathFilter, Logger, ParsedBucket } from \"./types\";\nexport { consoleLogger } from \"./types\";\nexport { walk } from \"./walk\";\n","import { stat } from \"node:fs/promises\";\nimport { basename, dirname } from \"node:path\";\nimport { resolveClaudeRoot } from \"../config\";\nimport { consoleLogger, type LocalPathFilter, type Logger, type ParsedBucket } from \"../types\";\nimport { walk } from \"../walk\";\nimport { bucketizeClaudeFile } from \"./bucketize\";\n\ntype ParseClaudeOptions = {\n\t/**\n\t * Absolute path to the Claude `projects` root. Defaults are derived in this order:\n\t * 1. `$CLAUDE_CONFIG_DIR/projects` if `CLAUDE_CONFIG_DIR` is set\n\t * 2. `~/.claude/projects`\n\t */\n\treadonly root?: string;\n\t/** Files with mtime < cutoff are skipped. */\n\treadonly cutoff: Date;\n\t/** Logger for malformed-line warnings. Defaults to `consoleLogger`. */\n\treadonly logger?: Logger;\n\t/** Local-only project/worktree path filter. Matching sessions are skipped before upload aggregation. */\n\treadonly excludePath?: LocalPathFilter;\n};\n\nasync function isFile(path: string): Promise<boolean> {\n\ttry {\n\t\treturn (await stat(path)).isFile();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction sourceSessionId(path: string): string {\n\tconst fileDir = dirname(path);\n\tif (basename(fileDir) !== \"subagents\") {\n\t\treturn path;\n\t}\n\n\tconst sessionDir = dirname(fileDir);\n\treturn `${sessionDir}.jsonl`;\n}\n\n/**\n * Walk the Claude `projects` root and yield `ParsedBucket` values for every\n * (model, hourUtc) tuple encountered. Passing a single `.jsonl` file as `root`\n * parses just that file (useful for tests).\n */\nasync function* parseClaude(opts: ParseClaudeOptions): AsyncIterable<ParsedBucket> {\n\tconst logger = opts.logger ?? consoleLogger;\n\tconst root = opts.root ?? resolveClaudeRoot();\n\n\tif (await isFile(root)) {\n\t\tyield* bucketizeClaudeFile(root, logger, { excludePath: opts.excludePath, sessionId: sourceSessionId(root) });\n\t\treturn;\n\t}\n\n\tconst seenTuplesBySession = new Map<string, Set<string>>();\n\tfor await (const file of walk(root, opts.cutoff)) {\n\t\tconst sessionId = sourceSessionId(file);\n\t\tlet seenTuples = seenTuplesBySession.get(sessionId);\n\t\tif (seenTuples === undefined) {\n\t\t\tseenTuples = new Set();\n\t\t\tseenTuplesBySession.set(sessionId, seenTuples);\n\t\t}\n\t\tyield* bucketizeClaudeFile(file, logger, {\n\t\t\texcludePath: opts.excludePath,\n\t\t\tsessionId: sessionId,\n\t\t\tseenTuples: seenTuples,\n\t\t});\n\t}\n}\n\nexport type { ParseClaudeOptions };\nexport { parseClaude };\n","import { homedir } from \"node:os\";\nimport { isAbsolute, join } from \"node:path\";\nimport process from \"node:process\";\nimport { Config, ConfigProvider, Effect, Schema } from \"effect\";\n\nconst runtimeEnv = process[\"env\"] as Record<string, string | undefined>;\n\nconst RawParserEnvSchema = Schema.Struct({\n\t// biome-ignore lint/style/useNamingConvention: ENV vars are SCREAMING_SNAKE_CASE by convention\n\tCLAUDE_CONFIG_DIR: Schema.optional(Schema.Trim),\n\t// biome-ignore lint/style/useNamingConvention: ENV vars are SCREAMING_SNAKE_CASE by convention\n\tHERMES_CODING_AGENT_DIR: Schema.optional(Schema.Trim),\n\t// biome-ignore lint/style/useNamingConvention: ENV vars are SCREAMING_SNAKE_CASE by convention\n\tHERMES_CODING_AGENT_SESSION_DIR: Schema.optional(Schema.Trim),\n\t// biome-ignore lint/style/useNamingConvention: ENV vars are SCREAMING_SNAKE_CASE by convention\n\tOPENCODE_DATA_DIR: Schema.optional(Schema.Trim),\n\t// biome-ignore lint/style/useNamingConvention: ENV vars are SCREAMING_SNAKE_CASE by convention\n\tOPENCODE_DB: Schema.optional(Schema.Trim),\n\t// biome-ignore lint/style/useNamingConvention: ENV vars are SCREAMING_SNAKE_CASE by convention\n\tPI_CODING_AGENT_DIR: Schema.optional(Schema.Trim),\n\t// biome-ignore lint/style/useNamingConvention: ENV vars are SCREAMING_SNAKE_CASE by convention\n\tPI_CODING_AGENT_SESSION_DIR: Schema.optional(Schema.Trim),\n});\n\ntype ParserConfig = {\n\tclaudeConfigDir: string | undefined;\n\thermesAgentDir: string | undefined;\n\thermesSessionDir: string | undefined;\n\topenCodeDataDir: string | undefined;\n\topenCodeDbPath: string | undefined;\n\tpiAgentDir: string | undefined;\n\tpiSessionDir: string | undefined;\n};\n\nconst parserEnvConfig = Config.schema(RawParserEnvSchema);\n\nconst emptyToUndefined = (value: string | undefined): string | undefined =>\n\tvalue === undefined || value.length === 0 ? undefined : value;\n\nconst toConfigEnv = (env: Record<string, string | undefined>): Record<string, string> =>\n\tObject.fromEntries(Object.entries(env).filter((entry): entry is [string, string] => entry[1] !== undefined));\n\nconst toParserConfig = (raw: Schema.Schema.Type<typeof RawParserEnvSchema>): ParserConfig => ({\n\tclaudeConfigDir: emptyToUndefined(raw.CLAUDE_CONFIG_DIR),\n\thermesAgentDir: emptyToUndefined(raw.HERMES_CODING_AGENT_DIR),\n\thermesSessionDir: emptyToUndefined(raw.HERMES_CODING_AGENT_SESSION_DIR),\n\topenCodeDataDir: emptyToUndefined(raw.OPENCODE_DATA_DIR),\n\topenCodeDbPath: emptyToUndefined(raw.OPENCODE_DB),\n\tpiAgentDir: emptyToUndefined(raw.PI_CODING_AGENT_DIR),\n\tpiSessionDir: emptyToUndefined(raw.PI_CODING_AGENT_SESSION_DIR),\n});\n\nfunction loadParserConfigEffect(\n\tenv: Record<string, string | undefined> = runtimeEnv,\n): Effect.Effect<ParserConfig, Config.ConfigError> {\n\tconst provider = ConfigProvider.fromEnv({ env: toConfigEnv(env) });\n\treturn parserEnvConfig.parse(provider).pipe(Effect.map(toParserConfig));\n}\n\nfunction loadParserConfig(env: Record<string, string | undefined> = runtimeEnv): ParserConfig {\n\treturn Effect.runSync(loadParserConfigEffect(env));\n}\n\nfunction readClaudeConfigDir(): string | undefined {\n\treturn loadParserConfig().claudeConfigDir;\n}\n\nfunction readPiAgentDir(): string | undefined {\n\treturn loadParserConfig().piAgentDir;\n}\n\nfunction readPiSessionDir(): string | undefined {\n\treturn loadParserConfig().piSessionDir;\n}\n\nfunction readHermesAgentDir(): string | undefined {\n\treturn loadParserConfig().hermesAgentDir;\n}\n\nfunction readHermesSessionDir(): string | undefined {\n\treturn loadParserConfig().hermesSessionDir;\n}\n\nfunction readOpenCodeDataDir(): string | undefined {\n\treturn loadParserConfig().openCodeDataDir;\n}\n\nfunction readOpenCodeDbPath(): string | undefined {\n\treturn loadParserConfig().openCodeDbPath;\n}\n\nfunction readParserHomeDir(): string {\n\treturn homedir();\n}\n\nfunction resolveCodexSessionsRoot(homeDir: string = readParserHomeDir()): string {\n\treturn join(homeDir, \".codex\", \"sessions\");\n}\n\nfunction resolveCodexArchivedRoot(homeDir: string = readParserHomeDir()): string {\n\treturn join(homeDir, \".codex\", \"archived_sessions\");\n}\n\nfunction resolveClaudeRoot(\n\tconfig: Pick<ParserConfig, \"claudeConfigDir\"> = loadParserConfig(),\n\thomeDir: string = readParserHomeDir(),\n): string {\n\treturn config.claudeConfigDir === undefined\n\t\t? join(homeDir, \".claude\", \"projects\")\n\t\t: join(config.claudeConfigDir, \"projects\");\n}\n\nfunction resolvePiRoot(\n\tconfig: Pick<ParserConfig, \"piAgentDir\" | \"piSessionDir\"> = loadParserConfig(),\n\thomeDir: string = readParserHomeDir(),\n): string {\n\treturn config.piSessionDir ?? join(config.piAgentDir ?? join(homeDir, \".pi\", \"agent\"), \"sessions\");\n}\n\nfunction resolveHermesRoot(\n\tconfig: Pick<ParserConfig, \"hermesAgentDir\" | \"hermesSessionDir\"> = loadParserConfig(),\n\thomeDir: string = readParserHomeDir(),\n): string {\n\treturn config.hermesSessionDir ?? config.hermesAgentDir ?? join(homeDir, \".hermes\");\n}\n\nfunction resolveOpenCodeDataRoot(\n\tconfig: Pick<ParserConfig, \"openCodeDataDir\"> = loadParserConfig(),\n\thomeDir: string = readParserHomeDir(),\n): string {\n\treturn config.openCodeDataDir ?? join(homeDir, \".local\", \"share\", \"opencode\");\n}\n\nfunction resolveOpenCodeRoot(\n\tconfig: Pick<ParserConfig, \"openCodeDataDir\" | \"openCodeDbPath\"> = loadParserConfig(),\n\thomeDir: string = readParserHomeDir(),\n): string {\n\tconst dataRoot = resolveOpenCodeDataRoot(config, homeDir);\n\tconst dbPath = config.openCodeDbPath;\n\tif (dbPath === undefined || dbPath === \":memory:\") {\n\t\treturn dbPath ?? dataRoot;\n\t}\n\treturn isAbsolute(dbPath) ? dbPath : join(dataRoot, dbPath);\n}\n\nexport type { ParserConfig };\nexport {\n\tloadParserConfig,\n\tloadParserConfigEffect,\n\treadClaudeConfigDir,\n\treadHermesAgentDir,\n\treadHermesSessionDir,\n\treadOpenCodeDataDir,\n\treadOpenCodeDbPath,\n\treadParserHomeDir,\n\treadPiAgentDir,\n\treadPiSessionDir,\n\tresolveClaudeRoot,\n\tresolveCodexArchivedRoot,\n\tresolveCodexSessionsRoot,\n\tresolveHermesRoot,\n\tresolveOpenCodeDataRoot,\n\tresolveOpenCodeRoot,\n\tresolvePiRoot,\n};\n","import process from \"node:process\";\n\n/** Top-level AI coding harness the bucket originates from. */\ntype Harness = \"codex\" | \"claude_code\" | \"pi\" | \"hermes\" | \"opencode\";\n\n/** Local-only predicate used by parsers to skip sessions by project/worktree path. */\ntype LocalPathFilter = (path: string) => boolean;\n\n/**\n * One hourly bucket of token usage emitted by a parser.\n *\n * PRIVACY CONTRACT (enforced by test/privacy.test.ts):\n * No string field beyond `harness` (a literal union) and `model` (the raw model\n * id from the source log) may appear on this type. `sessionIds` holds local-only\n * source identities that may include absolute paths. The CLI MUST translate them\n * to `sessionCount` for hourly buckets and HMAC-derived `sessionKey` values for\n * session facts before upload.\n */\ntype ParsedBucket = {\n\t/** Harness that produced the underlying events. */\n\treadonly harness: Harness;\n\t/** Raw model id from the source log (e.g. \"gpt-5\", \"claude-sonnet-4-5-20250929\"). */\n\treadonly model: string;\n\t/** Start of the UTC hour the events fall into. */\n\treadonly hourUtc: Date;\n\t/** Sum of input tokens, >= 0. */\n\treadonly inputTokens: number;\n\t/** Sum of output tokens, >= 0. */\n\treadonly outputTokens: number;\n\t/** Sum of cache-read tokens, >= 0. */\n\treadonly cacheReadTokens: number;\n\t/** Sum of cache-create / cache-write tokens, >= 0. */\n\treadonly cacheCreateTokens: number;\n\t/** Opaque session identifiers contributing to this bucket. CLI uses `.size` as `session_count`. */\n\treadonly sessionIds: ReadonlySet<string>;\n\t/** First token-bearing event timestamp for the source session. */\n\treadonly sessionStartedAt: Date;\n\t/** Last token-bearing event timestamp for the source session. */\n\treadonly sessionLastSeenAt: Date;\n};\n\n/** Logger shape used by parsers to report skipped lines, malformed events, etc. */\ntype Logger = {\n\twarn: (msg: string, meta?: Record<string, unknown>) => void;\n};\n\nfunction formatLogMeta(meta: Record<string, unknown>): string {\n\treturn JSON.stringify(meta);\n}\n\n/** Default logger writing warnings to stderr. */\nconst consoleLogger: Logger = {\n\twarn: (msg, meta) => {\n\t\tif (meta === undefined) {\n\t\t\tprocess.stderr.write(`${msg}\\n`);\n\t\t} else {\n\t\t\tprocess.stderr.write(`${msg} ${formatLogMeta(meta)}\\n`);\n\t\t}\n\t},\n};\n\nexport type { Harness, LocalPathFilter, Logger, ParsedBucket };\nexport { consoleLogger };\n","import { Effect } from \"effect\";\nimport { FileWalker, FileWalkerLive } from \"./effect/file-walker\";\n\n/**\n * Yield absolute paths of all `.jsonl` files under `root` whose mtime is at or\n * after `cutoff`. A missing or unreadable root yields nothing (no throw).\n * Subdirectories are recursed; symlinks are followed by `stat`.\n */\nfunction walkEffect(root: string, cutoff: Date): Effect.Effect<AsyncIterable<string>, never, FileWalker> {\n\treturn Effect.gen(function* () {\n\t\tconst walker = yield* FileWalker;\n\t\treturn yield* walker.walk(root, cutoff);\n\t});\n}\n\nexport async function* walk(root: string, cutoff: Date): AsyncIterable<string> {\n\tconst iterable = await walkEffect(root, cutoff).pipe(Effect.provide(FileWalkerLive), Effect.runPromise);\n\tyield* iterable;\n}\n\nexport { walkEffect };\n","import { readdir, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { Context, Effect, Layer } from \"effect\";\n\ntype FileWalkerShape = {\n\treadonly walk: (root: string, cutoff: Date) => Effect.Effect<AsyncIterable<string>>;\n};\n\nclass FileWalker extends Context.Service<FileWalker, FileWalkerShape>()(\"@oopst/parsers/FileWalker\") {}\n\nasync function* walkJsonlFiles(root: string, cutoff: Date): AsyncIterable<string> {\n\tlet entries: { name: string; isDirectory: () => boolean; isFile: () => boolean }[];\n\ttry {\n\t\tentries = await readdir(root, { withFileTypes: true });\n\t} catch {\n\t\treturn;\n\t}\n\n\tfor (const entry of entries) {\n\t\tconst full = join(root, String(entry.name));\n\t\tif (entry.isDirectory()) {\n\t\t\tyield* walkJsonlFiles(full, cutoff);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!entry.isFile()) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (!entry.name.endsWith(\".jsonl\")) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet mtime: Date;\n\t\ttry {\n\t\t\t// biome-ignore lint/performance/noAwaitInLoops: sequential stat per file preserves existing traversal behavior\n\t\t\t({ mtime } = await stat(full));\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\tif (mtime.getTime() >= cutoff.getTime()) {\n\t\t\tyield full;\n\t\t}\n\t}\n}\n\nconst makeFileWalker = (): FileWalkerShape => ({\n\twalk: (root, cutoff) => Effect.succeed(walkJsonlFiles(root, cutoff)),\n});\n\nconst FileWalkerLive: Layer.Layer<FileWalker> = Layer.succeed(FileWalker, makeFileWalker());\n\nexport type { FileWalkerShape };\nexport { FileWalker, FileWalkerLive, makeFileWalker };\n","import { createReadStream } from \"node:fs\";\nimport { createInterface } from \"node:readline\";\nimport { startOfUtcHour } from \"../codex/bucketize\";\nimport type { LocalPathFilter, Logger, ParsedBucket } from \"../types\";\nimport { isClaudeAssistantEvent } from \"./events\";\n\ntype BucketAccumulator = {\n\thourUtc: Date;\n\tmodel: string;\n\tinputTokens: number;\n\toutputTokens: number;\n\tcacheReadTokens: number;\n\tcacheCreateTokens: number;\n};\n\ntype BucketizeClaudeFileOptions = {\n\treadonly sessionId?: string;\n\treadonly seenTuples?: Set<string>;\n\treadonly excludePath?: LocalPathFilter;\n};\n\nfunction key(hourUtc: Date, model: string): string {\n\treturn `${hourUtc.toISOString()}|${model}`;\n}\n\n/**\n * Parse one Claude Code jsonl file into per-(model, hourUtc) buckets.\n *\n * Dedup rule: when both `message.id` and root `requestId` are present, the\n * tuple is recorded on first sight; subsequent lines with the same tuple are\n * ignored (their token counts are dropped). When either is missing, every\n * line contributes (matches CodexBar's behaviour for older logs).\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: line-by-line parser with necessary branching\nexport async function* bucketizeClaudeFile(\n\tpath: string,\n\tlogger: Logger,\n\toptions: BucketizeClaudeFileOptions = {},\n): AsyncIterable<ParsedBucket> {\n\tconst buckets = new Map<string, BucketAccumulator>();\n\tconst seenTuples = options.seenTuples ?? new Set<string>();\n\tlet lineNo = 0;\n\tlet sessionStartedAt: Date | undefined;\n\tlet sessionLastSeenAt: Date | undefined;\n\n\tconst stream = createReadStream(path, { encoding: \"utf8\" });\n\tconst rl = createInterface({ input: stream, crlfDelay: Number.POSITIVE_INFINITY });\n\n\ttry {\n\t\tfor await (const raw of rl) {\n\t\t\tlineNo += 1;\n\t\t\tconst trimmed = raw.trim();\n\t\t\tif (trimmed.length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet parsed: unknown;\n\t\t\ttry {\n\t\t\t\tparsed = JSON.parse(trimmed);\n\t\t\t} catch {\n\t\t\t\tlogger.warn(\"malformed jsonl line\", { path: path, line: lineNo });\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!isClaudeAssistantEvent(parsed)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (parsed.cwd !== undefined && options.excludePath?.(parsed.cwd) === true) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst tsMs = Date.parse(parsed.timestamp);\n\t\t\tif (!Number.isFinite(tsMs)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst { message, requestId } = parsed;\n\t\t\tif (message.id !== undefined && requestId !== undefined) {\n\t\t\t\tconst tuple = `${message.id}::${requestId}`;\n\t\t\t\tif (seenTuples.has(tuple)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tseenTuples.add(tuple);\n\t\t\t}\n\n\t\t\tconst { usage } = message;\n\t\t\tconst inputTokens = Math.max(0, usage.input_tokens ?? 0);\n\t\t\tconst outputTokens = Math.max(0, usage.output_tokens ?? 0);\n\t\t\tconst cacheReadTokens = Math.max(0, usage.cache_read_input_tokens ?? 0);\n\t\t\tconst cacheCreateTokens = Math.max(0, usage.cache_creation_input_tokens ?? 0);\n\t\t\tif (inputTokens === 0 && outputTokens === 0 && cacheReadTokens === 0 && cacheCreateTokens === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst eventAt = new Date(tsMs);\n\t\t\tif (sessionStartedAt === undefined || eventAt.getTime() < sessionStartedAt.getTime()) {\n\t\t\t\tsessionStartedAt = eventAt;\n\t\t\t}\n\t\t\tif (sessionLastSeenAt === undefined || eventAt.getTime() > sessionLastSeenAt.getTime()) {\n\t\t\t\tsessionLastSeenAt = eventAt;\n\t\t\t}\n\n\t\t\tconst hourUtc = startOfUtcHour(eventAt);\n\t\t\tconst k = key(hourUtc, message.model);\n\t\t\tconst existing = buckets.get(k);\n\t\t\tif (existing === undefined) {\n\t\t\t\tbuckets.set(k, {\n\t\t\t\t\thourUtc: hourUtc,\n\t\t\t\t\tmodel: message.model,\n\t\t\t\t\tinputTokens: inputTokens,\n\t\t\t\t\toutputTokens: outputTokens,\n\t\t\t\t\tcacheReadTokens: cacheReadTokens,\n\t\t\t\t\tcacheCreateTokens: cacheCreateTokens,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\texisting.inputTokens += inputTokens;\n\t\t\t\texisting.outputTokens += outputTokens;\n\t\t\t\texisting.cacheReadTokens += cacheReadTokens;\n\t\t\t\texisting.cacheCreateTokens += cacheCreateTokens;\n\t\t\t}\n\t\t}\n\t} finally {\n\t\trl.close();\n\t\tstream.destroy();\n\t}\n\n\tif (sessionStartedAt === undefined || sessionLastSeenAt === undefined) {\n\t\treturn;\n\t}\n\n\tconst sessionIds: ReadonlySet<string> = new Set([options.sessionId ?? path]);\n\tfor (const acc of buckets.values()) {\n\t\tyield {\n\t\t\tharness: \"claude_code\",\n\t\t\tmodel: acc.model,\n\t\t\thourUtc: acc.hourUtc,\n\t\t\tinputTokens: acc.inputTokens,\n\t\t\toutputTokens: acc.outputTokens,\n\t\t\tcacheReadTokens: acc.cacheReadTokens,\n\t\t\tcacheCreateTokens: acc.cacheCreateTokens,\n\t\t\tsessionIds: sessionIds,\n\t\t\tsessionStartedAt: sessionStartedAt,\n\t\t\tsessionLastSeenAt: sessionLastSeenAt,\n\t\t};\n\t}\n}\n","import { createReadStream } from \"node:fs\";\nimport { createInterface } from \"node:readline\";\nimport type { LocalPathFilter, Logger, ParsedBucket } from \"../types\";\nimport {\n\tisCodexSessionMetaEvent,\n\tisCodexTokenCountEvent,\n\tisCodexTurnContextEvent,\n\tpickCodexDelta,\n\tpickCodexEventModel,\n} from \"./events\";\n\n/** Truncate a Date to the start of its UTC hour. Returns a new Date. */\nfunction startOfUtcHour(d: Date): Date {\n\treturn new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(), d.getUTCHours(), 0, 0, 0));\n}\n\ntype BucketAccumulator = {\n\thourUtc: Date;\n\tmodel: string;\n\tinputTokens: number;\n\toutputTokens: number;\n\tcacheReadTokens: number;\n\tcacheCreateTokens: number;\n};\n\ntype BucketizeCodexFileOptions = {\n\treadonly excludePath?: LocalPathFilter;\n};\n\nfunction key(hourUtc: Date, model: string): string {\n\treturn `${hourUtc.toISOString()}|${model}`;\n}\n\nfunction shouldExcludePath(path: string | undefined, excludePath: LocalPathFilter | undefined): boolean {\n\treturn path !== undefined && excludePath?.(path) === true;\n}\n\n/**\n * Parse one Codex jsonl file into per-(model, hourUtc) buckets.\n * Malformed JSON lines are skipped; each skip is reported to `logger.warn`\n * once with `{ path, line }` metadata. Yields one ParsedBucket per Map entry.\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: line-by-line parser with necessary branching\nasync function* bucketizeCodexFile(\n\tpath: string,\n\tlogger: Logger,\n\toptions: BucketizeCodexFileOptions = {},\n): AsyncIterable<ParsedBucket> {\n\tconst buckets = new Map<string, BucketAccumulator>();\n\tlet currentModel: string | undefined;\n\tlet sawTurnContext = false;\n\tlet lineNo = 0;\n\tlet sessionStartedAt: Date | undefined;\n\tlet sessionLastSeenAt: Date | undefined;\n\n\tconst stream = createReadStream(path, { encoding: \"utf8\" });\n\tconst rl = createInterface({ input: stream, crlfDelay: Number.POSITIVE_INFINITY });\n\n\ttry {\n\t\tfor await (const raw of rl) {\n\t\t\tlineNo += 1;\n\t\t\tconst trimmed = raw.trim();\n\t\t\tif (trimmed.length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet parsed: unknown;\n\t\t\ttry {\n\t\t\t\tparsed = JSON.parse(trimmed);\n\t\t\t} catch {\n\t\t\t\tlogger.warn(\"malformed jsonl line\", { path: path, line: lineNo });\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isCodexSessionMetaEvent(parsed)) {\n\t\t\t\tif (shouldExcludePath(parsed.payload.cwd, options.excludePath)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isCodexTurnContextEvent(parsed)) {\n\t\t\t\tif (shouldExcludePath(parsed.payload.cwd, options.excludePath)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst model = parsed.payload.model ?? parsed.payload.info?.model;\n\t\t\t\tif (model !== undefined) {\n\t\t\t\t\tcurrentModel = model;\n\t\t\t\t\tsawTurnContext = true;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!isCodexTokenCountEvent(parsed)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst tsMs = Date.parse(parsed.timestamp);\n\t\t\tif (!Number.isFinite(tsMs)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst eventModel = pickCodexEventModel(parsed);\n\t\t\tconst model = sawTurnContext ? (currentModel ?? eventModel) : (eventModel ?? currentModel);\n\t\t\tif (model === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst delta = pickCodexDelta(parsed);\n\t\t\tif (delta === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst inputTokens = Math.max(0, delta.input_tokens ?? 0);\n\t\t\tconst outputTokens = Math.max(0, delta.output_tokens ?? 0);\n\t\t\tconst cacheReadTokens = Math.max(0, delta.cached_input_tokens ?? delta.cache_read_input_tokens ?? 0);\n\t\t\tif (inputTokens === 0 && outputTokens === 0 && cacheReadTokens === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst eventAt = new Date(tsMs);\n\t\t\tif (sessionStartedAt === undefined || eventAt.getTime() < sessionStartedAt.getTime()) {\n\t\t\t\tsessionStartedAt = eventAt;\n\t\t\t}\n\t\t\tif (sessionLastSeenAt === undefined || eventAt.getTime() > sessionLastSeenAt.getTime()) {\n\t\t\t\tsessionLastSeenAt = eventAt;\n\t\t\t}\n\n\t\t\tconst hourUtc = startOfUtcHour(eventAt);\n\t\t\tconst k = key(hourUtc, model);\n\t\t\tconst existing = buckets.get(k);\n\t\t\tif (existing === undefined) {\n\t\t\t\tbuckets.set(k, {\n\t\t\t\t\thourUtc: hourUtc,\n\t\t\t\t\tmodel: model,\n\t\t\t\t\tinputTokens: inputTokens,\n\t\t\t\t\toutputTokens: outputTokens,\n\t\t\t\t\tcacheReadTokens: cacheReadTokens,\n\t\t\t\t\tcacheCreateTokens: 0,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\texisting.inputTokens += inputTokens;\n\t\t\t\texisting.outputTokens += outputTokens;\n\t\t\t\texisting.cacheReadTokens += cacheReadTokens;\n\t\t\t}\n\t\t}\n\t} finally {\n\t\trl.close();\n\t\tstream.destroy();\n\t}\n\n\tif (sessionStartedAt === undefined || sessionLastSeenAt === undefined) {\n\t\treturn;\n\t}\n\n\tconst sessionIds: ReadonlySet<string> = new Set([path]);\n\tfor (const acc of buckets.values()) {\n\t\tyield {\n\t\t\tharness: \"codex\",\n\t\t\tmodel: acc.model,\n\t\t\thourUtc: acc.hourUtc,\n\t\t\tinputTokens: acc.inputTokens,\n\t\t\toutputTokens: acc.outputTokens,\n\t\t\tcacheReadTokens: acc.cacheReadTokens,\n\t\t\tcacheCreateTokens: acc.cacheCreateTokens,\n\t\t\tsessionIds: sessionIds,\n\t\t\tsessionStartedAt: sessionStartedAt,\n\t\t\tsessionLastSeenAt: sessionLastSeenAt,\n\t\t};\n\t}\n}\n\nexport type { BucketizeCodexFileOptions };\nexport { bucketizeCodexFile, startOfUtcHour };\n","/**\n * Subset of Codex jsonl event shapes that the parser consumes.\n *\n * The full Codex format carries many other event types (`session_meta`,\n * `task_started`, etc.); they are silently ignored. We never look at any\n * field that could contain prompt or tool-call text.\n */\n\ntype CodexTokenCountEvent = {\n\treadonly type: \"event_msg\";\n\treadonly timestamp: string;\n\treadonly payload: {\n\t\treadonly type: \"token_count\";\n\t\treadonly info?: {\n\t\t\treadonly model?: string;\n\t\t\t// biome-ignore lint/style/useNamingConvention: JSON field names from Codex log format\n\t\t\treadonly last_token_usage?: CodexUsageDelta;\n\t\t\t// biome-ignore lint/style/useNamingConvention: JSON field names from Codex log format\n\t\t\treadonly total_token_usage?: CodexUsageDelta;\n\t\t};\n\t\treadonly model?: string;\n\t};\n\treadonly model?: string;\n};\n\ntype CodexTurnContextEvent = {\n\treadonly type: \"turn_context\";\n\treadonly timestamp: string;\n\treadonly payload: {\n\t\treadonly cwd?: string;\n\t\treadonly model?: string;\n\t\treadonly info?: {\n\t\t\treadonly model?: string;\n\t\t};\n\t};\n};\n\ntype CodexSessionMetaEvent = {\n\treadonly type: \"session_meta\";\n\treadonly timestamp?: string;\n\treadonly payload: {\n\t\treadonly cwd?: string;\n\t};\n};\n\ntype CodexUsageDelta = {\n\t// biome-ignore lint/style/useNamingConvention: JSON field names from Codex log format\n\treadonly input_tokens?: number;\n\t// biome-ignore lint/style/useNamingConvention: JSON field names from Codex log format\n\treadonly output_tokens?: number;\n\t// biome-ignore lint/style/useNamingConvention: JSON field names from Codex log format\n\treadonly cached_input_tokens?: number;\n\t// biome-ignore lint/style/useNamingConvention: JSON field names from Codex log format\n\treadonly cache_read_input_tokens?: number;\n};\n\ntype CodexEvent = CodexSessionMetaEvent | CodexTokenCountEvent | CodexTurnContextEvent;\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction isCodexUsageDelta(value: unknown): value is CodexUsageDelta {\n\tif (!isObject(value)) {\n\t\treturn false;\n\t}\n\tconst keys = [\"input_tokens\", \"output_tokens\", \"cached_input_tokens\", \"cache_read_input_tokens\"] as const;\n\tfor (const k of keys) {\n\t\tconst v = value[k];\n\t\tif (v !== undefined && !isFiniteNumber(v)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: type guard for nested jsonl structure\nfunction isCodexTokenCountEvent(value: unknown): value is CodexTokenCountEvent {\n\tif (!isObject(value)) {\n\t\treturn false;\n\t}\n\tif (value[\"type\"] !== \"event_msg\") {\n\t\treturn false;\n\t}\n\tif (typeof value[\"timestamp\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tconst payload = value[\"payload\"];\n\tif (!isObject(payload)) {\n\t\treturn false;\n\t}\n\tif (payload[\"type\"] !== \"token_count\") {\n\t\treturn false;\n\t}\n\tconst info = payload[\"info\"];\n\tif (info !== undefined) {\n\t\tif (!isObject(info)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (info[\"model\"] !== undefined && typeof info[\"model\"] !== \"string\") {\n\t\t\treturn false;\n\t\t}\n\t\tif (info[\"last_token_usage\"] !== undefined && !isCodexUsageDelta(info[\"last_token_usage\"])) {\n\t\t\treturn false;\n\t\t}\n\t\tif (info[\"total_token_usage\"] !== undefined && !isCodexUsageDelta(info[\"total_token_usage\"])) {\n\t\t\treturn false;\n\t\t}\n\t}\n\tif (payload[\"model\"] !== undefined && typeof payload[\"model\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tif (value[\"model\"] !== undefined && typeof value[\"model\"] !== \"string\") {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nfunction isCodexTurnContextEvent(value: unknown): value is CodexTurnContextEvent {\n\tif (!isObject(value)) {\n\t\treturn false;\n\t}\n\tif (value[\"type\"] !== \"turn_context\") {\n\t\treturn false;\n\t}\n\tif (typeof value[\"timestamp\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tconst payload = value[\"payload\"];\n\tif (!isObject(payload)) {\n\t\treturn false;\n\t}\n\tif (payload[\"cwd\"] !== undefined && typeof payload[\"cwd\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tif (payload[\"model\"] !== undefined && typeof payload[\"model\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tconst info = payload[\"info\"];\n\tif (info !== undefined) {\n\t\tif (!isObject(info)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (info[\"model\"] !== undefined && typeof info[\"model\"] !== \"string\") {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\nfunction isCodexSessionMetaEvent(value: unknown): value is CodexSessionMetaEvent {\n\tif (!isObject(value)) {\n\t\treturn false;\n\t}\n\tif (value[\"type\"] !== \"session_meta\") {\n\t\treturn false;\n\t}\n\tif (value[\"timestamp\"] !== undefined && typeof value[\"timestamp\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tconst payload = value[\"payload\"];\n\tif (!isObject(payload)) {\n\t\treturn false;\n\t}\n\tif (payload[\"cwd\"] !== undefined && typeof payload[\"cwd\"] !== \"string\") {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n/** Convenience: extract `last_token_usage` if present, otherwise `total_token_usage`. */\nfunction pickCodexDelta(event: CodexTokenCountEvent): CodexUsageDelta | undefined {\n\treturn event.payload.info?.last_token_usage ?? event.payload.info?.total_token_usage;\n}\n\n/** Convenience: extract the model attribution from a token_count event (excluding turn_context). */\nfunction pickCodexEventModel(event: CodexTokenCountEvent): string | undefined {\n\treturn event.payload.info?.model ?? event.payload.model ?? event.model;\n}\n\nexport type { CodexEvent, CodexSessionMetaEvent, CodexTokenCountEvent, CodexTurnContextEvent, CodexUsageDelta };\nexport {\n\tisCodexSessionMetaEvent,\n\tisCodexTokenCountEvent,\n\tisCodexTurnContextEvent,\n\tpickCodexDelta,\n\tpickCodexEventModel,\n};\n","/**\n * Subset of Claude Code jsonl event shapes the parser consumes.\n *\n * We never read `message.content`, `text`, or anything that could carry\n * prompt or completion text. Only ids and numeric usage counts.\n */\n\ntype ClaudeAssistantEvent = {\n\treadonly type: \"assistant\";\n\treadonly timestamp: string;\n\treadonly cwd?: string;\n\treadonly requestId?: string;\n\treadonly message: {\n\t\treadonly id?: string;\n\t\treadonly model: string;\n\t\treadonly usage: ClaudeUsage;\n\t};\n};\n\ntype ClaudeUsage = {\n\t// biome-ignore lint/style/useNamingConvention: JSON field names from Claude Code log format\n\treadonly input_tokens?: number;\n\t// biome-ignore lint/style/useNamingConvention: JSON field names from Claude Code log format\n\treadonly output_tokens?: number;\n\t// biome-ignore lint/style/useNamingConvention: JSON field names from Claude Code log format\n\treadonly cache_creation_input_tokens?: number;\n\t// biome-ignore lint/style/useNamingConvention: JSON field names from Claude Code log format\n\treadonly cache_read_input_tokens?: number;\n};\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction isClaudeUsage(value: unknown): value is ClaudeUsage {\n\tif (!isObject(value)) {\n\t\treturn false;\n\t}\n\tconst keys = [\"input_tokens\", \"output_tokens\", \"cache_creation_input_tokens\", \"cache_read_input_tokens\"] as const;\n\tfor (const k of keys) {\n\t\tconst v = value[k];\n\t\tif (v !== undefined && !isFiniteNumber(v)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\nfunction isClaudeAssistantEvent(value: unknown): value is ClaudeAssistantEvent {\n\tif (!isObject(value)) {\n\t\treturn false;\n\t}\n\tif (value[\"type\"] !== \"assistant\") {\n\t\treturn false;\n\t}\n\tif (typeof value[\"timestamp\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tif (value[\"cwd\"] !== undefined && typeof value[\"cwd\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tif (value[\"requestId\"] !== undefined && typeof value[\"requestId\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tconst message = value[\"message\"];\n\tif (!isObject(message)) {\n\t\treturn false;\n\t}\n\tif (message[\"id\"] !== undefined && typeof message[\"id\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tif (typeof message[\"model\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tif (!isClaudeUsage(message[\"usage\"])) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nexport type { ClaudeAssistantEvent, ClaudeUsage };\nexport { isClaudeAssistantEvent };\n","import { stat } from \"node:fs/promises\";\nimport { Effect } from \"effect\";\nimport { resolveCodexArchivedRoot, resolveCodexSessionsRoot } from \"../config\";\nimport { type FileWalker, FileWalkerLive } from \"../effect/file-walker\";\nimport { consoleLogger, type LocalPathFilter, type Logger, type ParsedBucket } from \"../types\";\nimport { walkEffect } from \"../walk\";\nimport { bucketizeCodexFile } from \"./bucketize\";\n\ntype ParseCodexOptions = {\n\t/** Absolute path to the Codex sessions root. Defaults to `~/.codex/sessions`. */\n\treadonly root?: string;\n\t/** Additional root scanned alongside `root`. Defaults to `~/.codex/archived_sessions`. */\n\treadonly archivedRoot?: string;\n\t/** Files with mtime < cutoff are skipped. */\n\treadonly cutoff: Date;\n\t/** Logger for malformed-line warnings. Defaults to `consoleLogger`. */\n\treadonly logger?: Logger;\n\t/** Local-only project/worktree path filter. Matching sessions are skipped before upload aggregation. */\n\treadonly excludePath?: LocalPathFilter;\n};\n\nasync function isFile(path: string): Promise<boolean> {\n\ttry {\n\t\treturn (await stat(path)).isFile();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Walk one or two Codex source roots and yield `ParsedBucket` values for\n * every (model, hourUtc) tuple encountered. Passing a single `.jsonl` file\n * as `root` parses just that file (useful for tests).\n */\nfunction parseCodexEffect(opts: ParseCodexOptions): Effect.Effect<AsyncIterable<ParsedBucket>, unknown, FileWalker> {\n\tconst logger = opts.logger ?? consoleLogger;\n\tconst root = opts.root ?? resolveCodexSessionsRoot();\n\n\treturn Effect.gen(function* () {\n\t\tif (yield* Effect.tryPromise({ try: () => isFile(root), catch: (error) => error })) {\n\t\t\treturn bucketizeCodexFile(root, logger, { excludePath: opts.excludePath });\n\t\t}\n\n\t\tconst roots: string[] = [root];\n\t\tif (opts.root === undefined && opts.archivedRoot === undefined) {\n\t\t\troots.push(resolveCodexArchivedRoot());\n\t\t} else if (opts.archivedRoot !== undefined) {\n\t\t\troots.push(opts.archivedRoot);\n\t\t}\n\n\t\tconst sources: AsyncIterable<string>[] = [];\n\t\tfor (const r of roots) {\n\t\t\tsources.push(yield* walkEffect(r, opts.cutoff));\n\t\t}\n\n\t\treturn bucketizeCodexSources(sources, logger, { excludePath: opts.excludePath });\n\t});\n}\n\nasync function* bucketizeCodexSources(\n\tsources: readonly AsyncIterable<string>[],\n\tlogger: Logger,\n\toptions: { readonly excludePath?: LocalPathFilter },\n): AsyncIterable<ParsedBucket> {\n\tfor (const source of sources) {\n\t\t// biome-ignore lint/performance/noAwaitInLoops: sequential source scanning preserves existing parser behavior.\n\t\tfor await (const file of source) {\n\t\t\tyield* bucketizeCodexFile(file, logger, options);\n\t\t}\n\t}\n}\n\nasync function* parseCodex(opts: ParseCodexOptions): AsyncIterable<ParsedBucket> {\n\tconst iterable = await parseCodexEffect(opts).pipe(Effect.provide(FileWalkerLive), Effect.runPromise);\n\tyield* iterable;\n}\n\nexport type { ParseCodexOptions };\nexport { parseCodex, parseCodexEffect };\n","import { readdir, stat } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\nimport { resolveOpenCodeRoot } from \"../config\";\nimport { consoleLogger, type LocalPathFilter, type Logger, type ParsedBucket } from \"../types\";\nimport { bucketizeOpenCodeDatabase, bucketizeOpenCodeJsonFile } from \"./bucketize\";\n\ntype ParseOpenCodeOptions = {\n\t/** OpenCode data directory or a specific `opencode*.db` / legacy message `.json` file. */\n\treadonly root?: string;\n\t/** Files or rows older than cutoff are skipped. */\n\treadonly cutoff: Date;\n\t/** Logger for malformed input warnings. Defaults to `consoleLogger`. */\n\treadonly logger?: Logger;\n\t/** Local-only project/worktree path filter. Matching sessions are skipped before upload aggregation. */\n\treadonly excludePath?: LocalPathFilter;\n};\n\nconst OPENCODE_DB_FILE_PATTERN = /^opencode(?:-[^/]+)?\\.db$/u;\n\nasync function pathKind(path: string): Promise<\"file\" | \"directory\" | \"missing\"> {\n\ttry {\n\t\tconst s = await stat(path);\n\t\tif (s.isFile()) {\n\t\t\treturn \"file\";\n\t\t}\n\t\tif (s.isDirectory()) {\n\t\t\treturn \"directory\";\n\t\t}\n\t\treturn \"missing\";\n\t} catch {\n\t\treturn \"missing\";\n\t}\n}\n\nasync function listOpenCodeDatabases(root: string): Promise<string[]> {\n\tlet entries: { name: string; isFile: () => boolean }[];\n\ttry {\n\t\tentries = await readdir(root, { withFileTypes: true });\n\t} catch {\n\t\treturn [];\n\t}\n\n\treturn entries\n\t\t.filter((entry) => entry.isFile() && OPENCODE_DB_FILE_PATTERN.test(String(entry.name)))\n\t\t.map((entry) => join(root, String(entry.name)));\n}\n\nasync function listProjectLegacyRoots(root: string): Promise<string[]> {\n\tconst projectRoot = join(root, \"project\");\n\tlet entries: { name: string; isDirectory: () => boolean }[];\n\ttry {\n\t\tentries = await readdir(projectRoot, { withFileTypes: true });\n\t} catch {\n\t\treturn [];\n\t}\n\n\treturn entries\n\t\t.filter((entry) => entry.isDirectory())\n\t\t.flatMap((entry) => [\n\t\t\tjoin(projectRoot, String(entry.name), \"storage\", \"message\"),\n\t\t\tjoin(projectRoot, String(entry.name), \"storage\", \"session\", \"message\"),\n\t\t]);\n}\n\nasync function legacyRoots(root: string): Promise<string[]> {\n\treturn [\n\t\tjoin(root, \"storage\", \"message\"),\n\t\tjoin(root, \"storage\", \"session\", \"message\"),\n\t\t...(await listProjectLegacyRoots(root)),\n\t];\n}\n\nasync function* walkJson(root: string, cutoff: Date): AsyncIterable<string> {\n\tlet entries: { name: string; isDirectory: () => boolean; isFile: () => boolean }[];\n\ttry {\n\t\tentries = await readdir(root, { withFileTypes: true });\n\t} catch {\n\t\treturn;\n\t}\n\n\tfor (const entry of entries) {\n\t\tconst full = join(root, String(entry.name));\n\t\tif (entry.isDirectory()) {\n\t\t\tyield* walkJson(full, cutoff);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!(entry.isFile() && entry.name.endsWith(\".json\"))) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet mtime: Date;\n\t\ttry {\n\t\t\t// biome-ignore lint/performance/noAwaitInLoops: sequential stat per file is intentional.\n\t\t\t({ mtime } = await stat(full));\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\tif (mtime.getTime() >= cutoff.getTime()) {\n\t\t\tyield full;\n\t\t}\n\t}\n}\n\n/**\n * Walk OpenCode's SQLite database, or legacy JSON message storage when no\n * database is present, and yield one bucket per (session, model, hourUtc).\n */\nasync function* parseOpenCode(opts: ParseOpenCodeOptions): AsyncIterable<ParsedBucket> {\n\tconst logger = opts.logger ?? consoleLogger;\n\tconst root = opts.root ?? resolveOpenCodeRoot();\n\tconst kind = await pathKind(root);\n\tif (kind === \"missing\") {\n\t\treturn;\n\t}\n\n\tif (kind === \"file\") {\n\t\tif (basename(root).endsWith(\".json\")) {\n\t\t\tyield* bucketizeOpenCodeJsonFile(root, logger);\n\t\t\treturn;\n\t\t}\n\t\tyield* bucketizeOpenCodeDatabase(root, opts.cutoff, logger, opts.excludePath);\n\t\treturn;\n\t}\n\n\tconst databases = await listOpenCodeDatabases(root);\n\tif (databases.length > 0) {\n\t\tfor (const dbPath of databases) {\n\t\t\tyield* bucketizeOpenCodeDatabase(dbPath, opts.cutoff, logger, opts.excludePath);\n\t\t}\n\t\treturn;\n\t}\n\n\tfor (const legacyRoot of await legacyRoots(root)) {\n\t\t// biome-ignore lint/performance/noAwaitInLoops: roots are scanned sequentially to keep memory bounded.\n\t\tfor await (const file of walkJson(legacyRoot, opts.cutoff)) {\n\t\t\tyield* bucketizeOpenCodeJsonFile(file, logger);\n\t\t}\n\t}\n}\n\nexport type { ParseOpenCodeOptions };\nexport { parseOpenCode };\n","import { readFile } from \"node:fs/promises\";\nimport { startOfUtcHour } from \"../codex/bucketize\";\nimport type { LocalPathFilter, Logger, ParsedBucket } from \"../types\";\nimport { type OpenCodeUsage, pickOpenCodeUsage } from \"./events\";\n\n// Keep this dynamic. esbuild does not currently recognise node:sqlite as a\n// built-in and rewrites static imports to the bare \"sqlite\" package.\nconst NODE_SQLITE_SPECIFIER = [\"node\", \"sqlite\"].join(\":\");\nconst MISSING_SESSION_MESSAGE_TABLE_PATTERN = /no such table: session_message/u;\n\ntype SqliteModule = typeof import(\"node:sqlite\");\ntype DatabaseSyncConstructor = SqliteModule[\"DatabaseSync\"];\ntype DatabaseSync = InstanceType<DatabaseSyncConstructor>;\n\ntype BucketAccumulator = {\n\thourUtc: Date;\n\tmodel: string;\n\tsessionId: string;\n\tinputTokens: number;\n\toutputTokens: number;\n\tcacheReadTokens: number;\n\tcacheCreateTokens: number;\n\tsessionStartedAt: Date;\n\tsessionLastSeenAt: Date;\n};\n\ntype SessionMessageRow = {\n\tsessionId: unknown;\n\ttimeCreated: unknown;\n\tdata: unknown;\n};\n\ntype SessionPathRow = {\n\tsessionId: unknown;\n\tpath: unknown;\n};\n\nfunction key(hourUtc: Date, model: string, sessionId: string): string {\n\treturn `${hourUtc.toISOString()}|${model}|${sessionId}`;\n}\n\nfunction modelId(provider: string, model: string): string | undefined {\n\tconst trimmedProvider = provider.trim();\n\tconst trimmedModel = model.trim();\n\tif (trimmedProvider.length === 0 || trimmedModel.length === 0) {\n\t\treturn undefined;\n\t}\n\treturn `${trimmedProvider}/${trimmedModel}`;\n}\n\nfunction finiteTimestampMs(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction positive(value: number | undefined): number {\n\treturn Math.max(0, value ?? 0);\n}\n\nfunction addUsage(accumulators: Map<string, BucketAccumulator>, usage: OpenCodeUsage): void {\n\tconst model = modelId(usage.providerId, usage.modelId);\n\tif (model === undefined) {\n\t\treturn;\n\t}\n\tconst inputTokens = positive(usage.tokens.input);\n\tconst outputTokens = positive(usage.tokens.output) + positive(usage.tokens.reasoning);\n\tconst cacheReadTokens = positive(usage.tokens.cache?.read);\n\tconst cacheCreateTokens = positive(usage.tokens.cache?.write);\n\tif (inputTokens === 0 && outputTokens === 0 && cacheReadTokens === 0 && cacheCreateTokens === 0) {\n\t\treturn;\n\t}\n\n\tconst eventAt = new Date(usage.timestampMs);\n\tconst hourUtc = startOfUtcHour(eventAt);\n\tconst sessionId = `opencode:${usage.sessionId}`;\n\tconst accumulatorKey = key(hourUtc, model, sessionId);\n\tconst existing = accumulators.get(accumulatorKey);\n\tif (existing === undefined) {\n\t\taccumulators.set(accumulatorKey, {\n\t\t\thourUtc: hourUtc,\n\t\t\tmodel: model,\n\t\t\tsessionId: sessionId,\n\t\t\tinputTokens: inputTokens,\n\t\t\toutputTokens: outputTokens,\n\t\t\tcacheReadTokens: cacheReadTokens,\n\t\t\tcacheCreateTokens: cacheCreateTokens,\n\t\t\tsessionStartedAt: eventAt,\n\t\t\tsessionLastSeenAt: eventAt,\n\t\t});\n\t\treturn;\n\t}\n\n\texisting.inputTokens += inputTokens;\n\texisting.outputTokens += outputTokens;\n\texisting.cacheReadTokens += cacheReadTokens;\n\texisting.cacheCreateTokens += cacheCreateTokens;\n\tif (eventAt.getTime() < existing.sessionStartedAt.getTime()) {\n\t\texisting.sessionStartedAt = eventAt;\n\t}\n\tif (eventAt.getTime() > existing.sessionLastSeenAt.getTime()) {\n\t\texisting.sessionLastSeenAt = eventAt;\n\t}\n}\n\nfunction shouldExcludeUsage(\n\tusage: OpenCodeUsage,\n\tsessionPaths: ReadonlyMap<string, readonly string[]>,\n\texcludePath: LocalPathFilter | undefined,\n): boolean {\n\tconst paths = sessionPaths.get(usage.sessionId);\n\treturn paths?.some((path) => excludePath?.(path) === true) === true;\n}\n\nfunction* finalizedBuckets(accumulators: Map<string, BucketAccumulator>): Iterable<ParsedBucket> {\n\tfor (const acc of accumulators.values()) {\n\t\tyield {\n\t\t\tharness: \"opencode\",\n\t\t\tmodel: acc.model,\n\t\t\thourUtc: acc.hourUtc,\n\t\t\tinputTokens: acc.inputTokens,\n\t\t\toutputTokens: acc.outputTokens,\n\t\t\tcacheReadTokens: acc.cacheReadTokens,\n\t\t\tcacheCreateTokens: acc.cacheCreateTokens,\n\t\t\tsessionIds: new Set([acc.sessionId]),\n\t\t\tsessionStartedAt: acc.sessionStartedAt,\n\t\t\tsessionLastSeenAt: acc.sessionLastSeenAt,\n\t\t};\n\t}\n}\n\nfunction parseJson(value: unknown): unknown {\n\treturn typeof value === \"string\" ? JSON.parse(value) : value;\n}\n\nfunction isMissingTableError(err: unknown): boolean {\n\treturn err instanceof Error && MISSING_SESSION_MESSAGE_TABLE_PATTERN.test(err.message);\n}\n\nasync function loadDatabaseSync(): Promise<DatabaseSyncConstructor> {\n\tconst sqliteModule = (await import(NODE_SQLITE_SPECIFIER)) as SqliteModule;\n\treturn sqliteModule.DatabaseSync;\n}\n\nfunction* readSessionMessageRows(db: DatabaseSync, cutoff: Date): Iterable<SessionMessageRow> {\n\tconst statement = db.prepare(`\n select session_id as \"sessionId\", time_created as \"timeCreated\", data\n from session_message\n where type = 'assistant' and time_created >= ?\n order by time_created asc, id asc\n `);\n\tyield* statement.all(cutoff.getTime()) as SessionMessageRow[];\n}\n\nfunction readSessionPathRows(db: DatabaseSync, sql: string): SessionPathRow[] {\n\ttry {\n\t\treturn db.prepare(sql).all() as SessionPathRow[];\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nfunction readSessionPaths(db: DatabaseSync): Map<string, readonly string[]> {\n\tconst rows = [\n\t\t...readSessionPathRows(\n\t\t\tdb,\n\t\t\t`select id as \"sessionId\", directory as \"path\" from \"session\" where directory is not null`,\n\t\t),\n\t\t...readSessionPathRows(db, `select id as \"sessionId\", cwd as \"path\" from \"session\" where cwd is not null`),\n\t\t...readSessionPathRows(\n\t\t\tdb,\n\t\t\t`select s.id as \"sessionId\", p.worktree as \"path\"\n from \"session\" s\n join project p on p.id = s.project_id\n where p.worktree is not null`,\n\t\t),\n\t];\n\tconst paths = new Map<string, string[]>();\n\tfor (const row of rows) {\n\t\tif (typeof row.sessionId === \"string\" && typeof row.path === \"string\") {\n\t\t\tconst existing = paths.get(row.sessionId) ?? [];\n\t\t\texisting.push(row.path);\n\t\t\tpaths.set(row.sessionId, existing);\n\t\t}\n\t}\n\treturn paths;\n}\n\nasync function* bucketizeOpenCodeDatabase(\n\tpath: string,\n\tcutoff: Date,\n\tlogger: Logger,\n\texcludePath?: LocalPathFilter,\n): AsyncIterable<ParsedBucket> {\n\tconst accumulators = new Map<string, BucketAccumulator>();\n\tconst DatabaseSync = await loadDatabaseSync();\n\tlet db: DatabaseSync | undefined;\n\ttry {\n\t\tdb = new DatabaseSync(path, { readOnly: true, timeout: 1000 });\n\t\tconst sessionPaths = readSessionPaths(db);\n\t\tfor (const row of readSessionMessageRows(db, cutoff)) {\n\t\t\tconst sessionId = typeof row.sessionId === \"string\" ? row.sessionId : undefined;\n\t\t\tconst fallbackTimestampMs = finiteTimestampMs(row.timeCreated);\n\t\t\tlet parsed: unknown;\n\t\t\ttry {\n\t\t\t\tparsed = parseJson(row.data);\n\t\t\t} catch {\n\t\t\t\tlogger.warn(\"malformed opencode sqlite message\", { path: path });\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst usage = pickOpenCodeUsage(parsed, sessionId, fallbackTimestampMs);\n\t\t\tif (usage !== undefined && !shouldExcludeUsage(usage, sessionPaths, excludePath)) {\n\t\t\t\taddUsage(accumulators, usage);\n\t\t\t}\n\t\t}\n\t} catch (err) {\n\t\tif (!isMissingTableError(err)) {\n\t\t\tlogger.warn(\"failed to parse opencode sqlite database\", { path: path });\n\t\t}\n\t} finally {\n\t\tdb?.close();\n\t}\n\n\tyield* finalizedBuckets(accumulators);\n}\n\nasync function* bucketizeOpenCodeJsonFile(path: string, logger: Logger): AsyncIterable<ParsedBucket> {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(await readFile(path, \"utf8\"));\n\t} catch {\n\t\tlogger.warn(\"malformed opencode json file\", { path: path });\n\t\treturn;\n\t}\n\n\tconst usage = pickOpenCodeUsage(parsed);\n\tif (usage === undefined) {\n\t\treturn;\n\t}\n\n\tconst accumulators = new Map<string, BucketAccumulator>();\n\taddUsage(accumulators, usage);\n\tyield* finalizedBuckets(accumulators);\n}\n\nexport { bucketizeOpenCodeDatabase, bucketizeOpenCodeJsonFile };\n","type OpenCodeTokens = {\n\treadonly input?: number;\n\treadonly output?: number;\n\treadonly reasoning?: number;\n\treadonly cache?: {\n\t\treadonly read?: number;\n\t\treadonly write?: number;\n\t};\n};\n\ntype OpenCodeUsage = {\n\treadonly sessionId: string;\n\treadonly providerId: string;\n\treadonly modelId: string;\n\treadonly timestampMs: number;\n\treadonly tokens: OpenCodeTokens;\n};\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction timestampMs(value: unknown): number | undefined {\n\tif (isFiniteNumber(value)) {\n\t\treturn value;\n\t}\n\tif (typeof value !== \"string\") {\n\t\treturn undefined;\n\t}\n\tconst parsed = Date.parse(value);\n\treturn Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction isOpenCodeTokens(value: unknown): value is OpenCodeTokens {\n\tif (!isObject(value)) {\n\t\treturn false;\n\t}\n\tconst keys = [\"input\", \"output\", \"reasoning\"] as const;\n\tfor (const k of keys) {\n\t\tconst v = value[k];\n\t\tif (v !== undefined && !isFiniteNumber(v)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\tconst cache = value[\"cache\"];\n\tif (cache !== undefined) {\n\t\tif (!isObject(cache)) {\n\t\t\treturn false;\n\t\t}\n\t\tfor (const k of [\"read\", \"write\"] as const) {\n\t\t\tconst v = cache[k];\n\t\t\tif (v !== undefined && !isFiniteNumber(v)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn true;\n}\n\nfunction usageFromModernMessage(\n\tvalue: Record<string, unknown>,\n\tfallbackSessionId: string | undefined,\n\tfallbackTimestampMs: number | undefined,\n): OpenCodeUsage | undefined {\n\tconst model = value[\"model\"];\n\tif (!isObject(model)) {\n\t\treturn undefined;\n\t}\n\tconst providerId = model[\"providerID\"];\n\tconst modelId = model[\"modelID\"] ?? model[\"id\"];\n\tif (typeof providerId !== \"string\" || typeof modelId !== \"string\") {\n\t\treturn undefined;\n\t}\n\tconst tokens = value[\"tokens\"];\n\tif (!isOpenCodeTokens(tokens)) {\n\t\treturn undefined;\n\t}\n\n\tconst time = value[\"time\"];\n\tconst messageTimestampMs = isObject(time) ? timestampMs(time[\"created\"] ?? time[\"completed\"]) : undefined;\n\tconst sessionId = typeof value[\"sessionID\"] === \"string\" ? value[\"sessionID\"] : fallbackSessionId;\n\tconst tsMs = messageTimestampMs ?? fallbackTimestampMs;\n\tif (sessionId === undefined || tsMs === undefined) {\n\t\treturn undefined;\n\t}\n\n\treturn {\n\t\tsessionId: sessionId,\n\t\tproviderId: providerId,\n\t\tmodelId: modelId,\n\t\ttimestampMs: tsMs,\n\t\ttokens: tokens,\n\t};\n}\n\nfunction usageFromLegacyMessage(\n\tvalue: Record<string, unknown>,\n\tfallbackSessionId: string | undefined,\n\tfallbackTimestampMs: number | undefined,\n): OpenCodeUsage | undefined {\n\tif (value[\"role\"] !== \"assistant\") {\n\t\treturn undefined;\n\t}\n\n\tconst providerId = value[\"providerID\"];\n\tconst modelId = value[\"modelID\"];\n\tconst tokens = value[\"tokens\"];\n\tif (typeof providerId !== \"string\" || typeof modelId !== \"string\" || !isOpenCodeTokens(tokens)) {\n\t\treturn undefined;\n\t}\n\n\tconst time = value[\"time\"];\n\tconst messageTimestampMs = isObject(time) ? timestampMs(time[\"created\"] ?? time[\"completed\"]) : undefined;\n\tconst sessionId = typeof value[\"sessionID\"] === \"string\" ? value[\"sessionID\"] : fallbackSessionId;\n\tconst tsMs = messageTimestampMs ?? fallbackTimestampMs;\n\tif (sessionId === undefined || tsMs === undefined) {\n\t\treturn undefined;\n\t}\n\n\treturn {\n\t\tsessionId: sessionId,\n\t\tproviderId: providerId,\n\t\tmodelId: modelId,\n\t\ttimestampMs: tsMs,\n\t\ttokens: tokens,\n\t};\n}\n\nfunction usageFromMetadataMessage(\n\tvalue: Record<string, unknown>,\n\tfallbackSessionId: string | undefined,\n\tfallbackTimestampMs: number | undefined,\n): OpenCodeUsage | undefined {\n\tif (value[\"role\"] !== \"assistant\") {\n\t\treturn undefined;\n\t}\n\tconst metadata = value[\"metadata\"];\n\tif (!isObject(metadata)) {\n\t\treturn undefined;\n\t}\n\tconst assistant = metadata[\"assistant\"];\n\tif (!isObject(assistant)) {\n\t\treturn undefined;\n\t}\n\tconst providerId = assistant[\"providerID\"];\n\tconst modelId = assistant[\"modelID\"];\n\tconst tokens = assistant[\"tokens\"];\n\tif (typeof providerId !== \"string\" || typeof modelId !== \"string\" || !isOpenCodeTokens(tokens)) {\n\t\treturn undefined;\n\t}\n\n\tconst time = metadata[\"time\"];\n\tconst messageTimestampMs = isObject(time) ? timestampMs(time[\"created\"] ?? time[\"completed\"]) : undefined;\n\tconst sessionId = typeof metadata[\"sessionID\"] === \"string\" ? metadata[\"sessionID\"] : fallbackSessionId;\n\tconst tsMs = messageTimestampMs ?? fallbackTimestampMs;\n\tif (sessionId === undefined || tsMs === undefined) {\n\t\treturn undefined;\n\t}\n\n\treturn {\n\t\tsessionId: sessionId,\n\t\tproviderId: providerId,\n\t\tmodelId: modelId,\n\t\ttimestampMs: tsMs,\n\t\ttokens: tokens,\n\t};\n}\n\nfunction pickOpenCodeUsage(\n\tvalue: unknown,\n\tfallbackSessionId?: string,\n\tfallbackTimestampMs?: number,\n): OpenCodeUsage | undefined {\n\tif (!isObject(value)) {\n\t\treturn undefined;\n\t}\n\n\treturn (\n\t\tusageFromModernMessage(value, fallbackSessionId, fallbackTimestampMs) ??\n\t\tusageFromLegacyMessage(value, fallbackSessionId, fallbackTimestampMs) ??\n\t\tusageFromMetadataMessage(value, fallbackSessionId, fallbackTimestampMs)\n\t);\n}\n\nexport type { OpenCodeTokens, OpenCodeUsage };\nexport { pickOpenCodeUsage };\n","import { stat } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\nimport { resolveHermesRoot, resolvePiRoot } from \"../config\";\nimport { consoleLogger, type LocalPathFilter, type Logger, type ParsedBucket } from \"../types\";\nimport { walk } from \"../walk\";\nimport { bucketizeHermesDatabase, bucketizePiStyleFile, type PiStyleHarness } from \"./bucketize\";\n\ntype ParsePiOptions = {\n\t/** Absolute path to the Pi/Hermes sessions root. Defaults to the harness-specific session directory. */\n\treadonly root?: string;\n\t/** Files with mtime < cutoff are skipped. */\n\treadonly cutoff: Date;\n\t/** Logger for malformed-line warnings. Defaults to `consoleLogger`. */\n\treadonly logger?: Logger;\n\t/** Local-only project/worktree path filter. Matching sessions are skipped before upload aggregation. */\n\treadonly excludePath?: LocalPathFilter;\n};\n\nasync function pathKind(path: string): Promise<\"file\" | \"directory\" | \"missing\"> {\n\ttry {\n\t\tconst s = await stat(path);\n\t\tif (s.isFile()) {\n\t\t\treturn \"file\";\n\t\t}\n\t\tif (s.isDirectory()) {\n\t\t\treturn \"directory\";\n\t\t}\n\t\treturn \"missing\";\n\t} catch {\n\t\treturn \"missing\";\n\t}\n}\n\nasync function isFile(path: string): Promise<boolean> {\n\treturn (await pathKind(path)) === \"file\";\n}\n\nasync function* parsePiStyle(\n\topts: ParsePiOptions,\n\tharness: PiStyleHarness,\n\tdefaultRoot: () => string,\n): AsyncIterable<ParsedBucket> {\n\tconst logger = opts.logger ?? consoleLogger;\n\tconst root = opts.root ?? defaultRoot();\n\n\tif (await isFile(root)) {\n\t\tyield* bucketizePiStyleFile(root, harness, logger, { excludePath: opts.excludePath });\n\t\treturn;\n\t}\n\n\tconst seenMessageIds = new Set<string>();\n\tfor await (const file of walk(root, opts.cutoff)) {\n\t\tyield* bucketizePiStyleFile(file, harness, logger, {\n\t\t\texcludePath: opts.excludePath,\n\t\t\tseenMessageIds: seenMessageIds,\n\t\t});\n\t}\n}\n\nasync function* parsePi(opts: ParsePiOptions): AsyncIterable<ParsedBucket> {\n\tyield* parsePiStyle(opts, \"pi\", resolvePiRoot);\n}\n\nasync function* parseHermes(opts: ParsePiOptions): AsyncIterable<ParsedBucket> {\n\tconst logger = opts.logger ?? consoleLogger;\n\tconst root = opts.root ?? resolveHermesRoot();\n\tconst kind = await pathKind(root);\n\tif (kind === \"missing\") {\n\t\treturn;\n\t}\n\n\tif (kind === \"file\") {\n\t\tif (basename(root).endsWith(\".db\")) {\n\t\t\tyield* bucketizeHermesDatabase(root, opts.cutoff, logger, opts.excludePath);\n\t\t\treturn;\n\t\t}\n\t\tyield* bucketizePiStyleFile(root, \"hermes\", logger, { excludePath: opts.excludePath });\n\t\treturn;\n\t}\n\n\tconst stateDb = join(root, \"state.db\");\n\tif (await isFile(stateDb)) {\n\t\tyield* bucketizeHermesDatabase(stateDb, opts.cutoff, logger, opts.excludePath);\n\t\treturn;\n\t}\n\n\tconst sessionsRoot = join(root, \"sessions\");\n\tif ((await pathKind(sessionsRoot)) === \"directory\") {\n\t\tconst seenMessageIds = new Set<string>();\n\t\tfor await (const file of walk(sessionsRoot, opts.cutoff)) {\n\t\t\tyield* bucketizePiStyleFile(file, \"hermes\", logger, {\n\t\t\t\texcludePath: opts.excludePath,\n\t\t\t\tseenMessageIds: seenMessageIds,\n\t\t\t});\n\t\t}\n\t\treturn;\n\t}\n\n\tconst agentSessionsRoot = join(root, \"agent\", \"sessions\");\n\tif ((await pathKind(agentSessionsRoot)) === \"directory\") {\n\t\tconst seenMessageIds = new Set<string>();\n\t\tfor await (const file of walk(agentSessionsRoot, opts.cutoff)) {\n\t\t\tyield* bucketizePiStyleFile(file, \"hermes\", logger, {\n\t\t\t\texcludePath: opts.excludePath,\n\t\t\t\tseenMessageIds: seenMessageIds,\n\t\t\t});\n\t\t}\n\t\treturn;\n\t}\n\n\tconst seenMessageIds = new Set<string>();\n\tfor await (const file of walk(root, opts.cutoff)) {\n\t\tyield* bucketizePiStyleFile(file, \"hermes\", logger, {\n\t\t\texcludePath: opts.excludePath,\n\t\t\tseenMessageIds: seenMessageIds,\n\t\t});\n\t}\n}\n\nexport type { ParsePiOptions };\nexport { parseHermes, parsePi };\n","import { createReadStream } from \"node:fs\";\nimport { createInterface } from \"node:readline\";\nimport { startOfUtcHour } from \"../codex/bucketize\";\nimport type { Harness, LocalPathFilter, Logger, ParsedBucket } from \"../types\";\nimport { isPiAssistantMessageEntry, isPiSessionEntry } from \"./events\";\n\n// Keep this dynamic. esbuild does not currently recognise node:sqlite as a\n// built-in and rewrites static imports to the bare \"sqlite\" package.\nconst NODE_SQLITE_SPECIFIER = [\"node\", \"sqlite\"].join(\":\");\nconst MILLISECONDS_PER_SECOND = 1000;\nconst UNIX_MILLISECONDS_THRESHOLD = 1_000_000_000_000;\n\ntype SqliteModule = typeof import(\"node:sqlite\");\ntype DatabaseSyncConstructor = SqliteModule[\"DatabaseSync\"];\ntype DatabaseSync = InstanceType<DatabaseSyncConstructor>;\ntype PiStyleHarness = Extract<Harness, \"pi\" | \"hermes\">;\n\ntype BucketAccumulator = {\n\thourUtc: Date;\n\tmodel: string;\n\tinputTokens: number;\n\toutputTokens: number;\n\tcacheReadTokens: number;\n\tcacheCreateTokens: number;\n};\n\ntype BucketizePiStyleFileOptions = {\n\treadonly seenMessageIds?: Set<string>;\n\treadonly excludePath?: LocalPathFilter;\n};\n\ntype HermesSessionRow = {\n\tid: unknown;\n\tmodel: unknown;\n\tbillingProvider: unknown;\n\tstartedAt: unknown;\n\tendedAt: unknown;\n\tinputTokens: unknown;\n\toutputTokens: unknown;\n\tcacheReadTokens: unknown;\n\tcacheWriteTokens: unknown;\n\tcwd: unknown;\n};\n\nfunction key(hourUtc: Date, model: string): string {\n\treturn `${hourUtc.toISOString()}|${model}`;\n}\n\nfunction eventTimestampMs(entry: { timestamp: string; message: { timestamp?: number } }): number {\n\tif (entry.message.timestamp !== undefined) {\n\t\treturn entry.message.timestamp;\n\t}\n\treturn Date.parse(entry.timestamp);\n}\n\nfunction modelId(provider: string, model: string): string | undefined {\n\tconst trimmedProvider = normalizeProvider(provider.trim());\n\tconst trimmedModel = model.trim();\n\tif (trimmedProvider.length === 0 || trimmedModel.length === 0) {\n\t\treturn undefined;\n\t}\n\treturn `${trimmedProvider}/${trimmedModel}`;\n}\n\nfunction normalizeProvider(provider: string): string {\n\treturn provider === \"openai-codex\" ? \"openai\" : provider;\n}\n\nfunction finiteNumber(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction positive(value: unknown): number {\n\treturn Math.max(0, finiteNumber(value) ?? 0);\n}\n\nfunction timestampMs(value: unknown): number | undefined {\n\tconst n = finiteNumber(value);\n\tif (n === undefined) {\n\t\treturn undefined;\n\t}\n\treturn Math.abs(n) < UNIX_MILLISECONDS_THRESHOLD ? n * MILLISECONDS_PER_SECOND : n;\n}\n\nasync function loadDatabaseSync(): Promise<DatabaseSyncConstructor> {\n\tconst sqliteModule = (await import(NODE_SQLITE_SPECIFIER)) as SqliteModule;\n\treturn sqliteModule.DatabaseSync;\n}\n\nfunction* readHermesSessionRows(db: DatabaseSync, cutoff: Date): Iterable<HermesSessionRow> {\n\tconst statement = db.prepare(`\n select\n id,\n model,\n billing_provider as \"billingProvider\",\n started_at as \"startedAt\",\n ended_at as \"endedAt\",\n input_tokens as \"inputTokens\",\n output_tokens as \"outputTokens\",\n cache_read_tokens as \"cacheReadTokens\",\n cache_write_tokens as \"cacheWriteTokens\",\n cwd\n from sessions\n where coalesce(ended_at, started_at) >= ?\n order by started_at asc, id asc\n `);\n\tyield* statement.all(cutoff.getTime() / MILLISECONDS_PER_SECOND) as HermesSessionRow[];\n}\n\nfunction hermesRowToBucket(row: HermesSessionRow, excludePath: LocalPathFilter | undefined): ParsedBucket | undefined {\n\tif (typeof row.cwd === \"string\" && excludePath?.(row.cwd) === true) {\n\t\treturn undefined;\n\t}\n\n\tconst sessionId = typeof row.id === \"string\" ? row.id : undefined;\n\tconst startedAtMs = timestampMs(row.startedAt);\n\tconst lastSeenAtMs = timestampMs(row.endedAt) ?? startedAtMs;\n\tconst provider = typeof row.billingProvider === \"string\" ? row.billingProvider : undefined;\n\tconst sourceModel = typeof row.model === \"string\" ? row.model : undefined;\n\tif (\n\t\tsessionId === undefined ||\n\t\tstartedAtMs === undefined ||\n\t\tlastSeenAtMs === undefined ||\n\t\tprovider === undefined ||\n\t\tsourceModel === undefined\n\t) {\n\t\treturn undefined;\n\t}\n\n\tconst model = modelId(provider, sourceModel);\n\tif (model === undefined) {\n\t\treturn undefined;\n\t}\n\n\tconst inputTokens = positive(row.inputTokens);\n\tconst outputTokens = positive(row.outputTokens);\n\tconst cacheReadTokens = positive(row.cacheReadTokens);\n\tconst cacheCreateTokens = positive(row.cacheWriteTokens);\n\tif (inputTokens === 0 && outputTokens === 0 && cacheReadTokens === 0 && cacheCreateTokens === 0) {\n\t\treturn undefined;\n\t}\n\n\tconst startedAt = new Date(startedAtMs);\n\treturn {\n\t\tharness: \"hermes\",\n\t\tmodel: model,\n\t\thourUtc: startOfUtcHour(startedAt),\n\t\tinputTokens: inputTokens,\n\t\toutputTokens: outputTokens,\n\t\tcacheReadTokens: cacheReadTokens,\n\t\tcacheCreateTokens: cacheCreateTokens,\n\t\tsessionIds: new Set([`hermes:${sessionId}`]),\n\t\tsessionStartedAt: startedAt,\n\t\tsessionLastSeenAt: new Date(lastSeenAtMs),\n\t};\n}\n\n/**\n * Parse one Pi-style session JSONL file into per-(provider/model, hourUtc)\n * buckets. Pi and Hermes share the same session format; callers choose the\n * harness label.\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: line-by-line parser with necessary branching\nasync function* bucketizePiStyleFile(\n\tpath: string,\n\tharness: PiStyleHarness,\n\tlogger: Logger,\n\toptions: BucketizePiStyleFileOptions = {},\n): AsyncIterable<ParsedBucket> {\n\tconst buckets = new Map<string, BucketAccumulator>();\n\tconst seenMessageIds = options.seenMessageIds ?? new Set<string>();\n\tlet lineNo = 0;\n\tlet sessionStartedAt: Date | undefined;\n\tlet sessionLastSeenAt: Date | undefined;\n\n\tconst stream = createReadStream(path, { encoding: \"utf8\" });\n\tconst rl = createInterface({ input: stream, crlfDelay: Number.POSITIVE_INFINITY });\n\n\ttry {\n\t\tfor await (const raw of rl) {\n\t\t\tlineNo += 1;\n\t\t\tconst trimmed = raw.trim();\n\t\t\tif (trimmed.length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet parsed: unknown;\n\t\t\ttry {\n\t\t\t\tparsed = JSON.parse(trimmed);\n\t\t\t} catch {\n\t\t\t\tlogger.warn(\"malformed jsonl line\", { path: path, line: lineNo });\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isPiSessionEntry(parsed)) {\n\t\t\t\tif (parsed.cwd !== undefined && options.excludePath?.(parsed.cwd) === true) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!isPiAssistantMessageEntry(parsed)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (parsed.message.stopReason === \"aborted\" || parsed.message.stopReason === \"error\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (parsed.id !== undefined) {\n\t\t\t\tif (seenMessageIds.has(parsed.id)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tseenMessageIds.add(parsed.id);\n\t\t\t}\n\n\t\t\tconst tsMs = eventTimestampMs(parsed);\n\t\t\tif (!Number.isFinite(tsMs)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst model = modelId(parsed.message.provider, parsed.message.model);\n\t\t\tif (model === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst { usage } = parsed.message;\n\t\t\tconst inputTokens = Math.max(0, usage.input ?? 0);\n\t\t\tconst outputTokens = Math.max(0, usage.output ?? 0);\n\t\t\tconst cacheReadTokens = Math.max(0, usage.cacheRead ?? 0);\n\t\t\tconst cacheCreateTokens = Math.max(0, usage.cacheWrite ?? 0);\n\t\t\tif (inputTokens === 0 && outputTokens === 0 && cacheReadTokens === 0 && cacheCreateTokens === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst eventAt = new Date(tsMs);\n\t\t\tif (sessionStartedAt === undefined || eventAt.getTime() < sessionStartedAt.getTime()) {\n\t\t\t\tsessionStartedAt = eventAt;\n\t\t\t}\n\t\t\tif (sessionLastSeenAt === undefined || eventAt.getTime() > sessionLastSeenAt.getTime()) {\n\t\t\t\tsessionLastSeenAt = eventAt;\n\t\t\t}\n\n\t\t\tconst hourUtc = startOfUtcHour(eventAt);\n\t\t\tconst k = key(hourUtc, model);\n\t\t\tconst existing = buckets.get(k);\n\t\t\tif (existing === undefined) {\n\t\t\t\tbuckets.set(k, {\n\t\t\t\t\thourUtc: hourUtc,\n\t\t\t\t\tmodel: model,\n\t\t\t\t\tinputTokens: inputTokens,\n\t\t\t\t\toutputTokens: outputTokens,\n\t\t\t\t\tcacheReadTokens: cacheReadTokens,\n\t\t\t\t\tcacheCreateTokens: cacheCreateTokens,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\texisting.inputTokens += inputTokens;\n\t\t\t\texisting.outputTokens += outputTokens;\n\t\t\t\texisting.cacheReadTokens += cacheReadTokens;\n\t\t\t\texisting.cacheCreateTokens += cacheCreateTokens;\n\t\t\t}\n\t\t}\n\t} finally {\n\t\trl.close();\n\t\tstream.destroy();\n\t}\n\n\tif (sessionStartedAt === undefined || sessionLastSeenAt === undefined) {\n\t\treturn;\n\t}\n\n\tconst sessionIds: ReadonlySet<string> = new Set([path]);\n\tfor (const acc of buckets.values()) {\n\t\tyield {\n\t\t\tharness: harness,\n\t\t\tmodel: acc.model,\n\t\t\thourUtc: acc.hourUtc,\n\t\t\tinputTokens: acc.inputTokens,\n\t\t\toutputTokens: acc.outputTokens,\n\t\t\tcacheReadTokens: acc.cacheReadTokens,\n\t\t\tcacheCreateTokens: acc.cacheCreateTokens,\n\t\t\tsessionIds: sessionIds,\n\t\t\tsessionStartedAt: sessionStartedAt,\n\t\t\tsessionLastSeenAt: sessionLastSeenAt,\n\t\t};\n\t}\n}\n\nasync function* bucketizeHermesDatabase(\n\tpath: string,\n\tcutoff: Date,\n\tlogger: Logger,\n\texcludePath?: LocalPathFilter,\n): AsyncIterable<ParsedBucket> {\n\tconst DatabaseSync = await loadDatabaseSync();\n\tlet db: DatabaseSync | undefined;\n\ttry {\n\t\tdb = new DatabaseSync(path, { readOnly: true, timeout: 1000 });\n\t\tfor (const row of readHermesSessionRows(db, cutoff)) {\n\t\t\tconst bucket = hermesRowToBucket(row, excludePath);\n\t\t\tif (bucket !== undefined) {\n\t\t\t\tyield bucket;\n\t\t\t}\n\t\t}\n\t} catch {\n\t\tlogger.warn(\"failed to parse hermes sqlite database\", { path: path });\n\t} finally {\n\t\tdb?.close();\n\t}\n}\n\nexport type { PiStyleHarness };\nexport { bucketizeHermesDatabase, bucketizePiStyleFile };\n","/**\n * Subset of Pi/Hermes session entries the parser consumes.\n *\n * We intentionally ignore message content, tool details, and extension data.\n * Session cwd is read only for local exclude filtering and is never uploaded.\n */\n\ntype PiSessionEntry = {\n\treadonly type: \"session\";\n\treadonly cwd?: string;\n};\n\ntype PiAssistantMessageEntry = {\n\treadonly type: \"message\";\n\treadonly id?: string;\n\treadonly timestamp: string;\n\treadonly message: {\n\t\treadonly role: \"assistant\";\n\t\treadonly provider: string;\n\t\treadonly model: string;\n\t\treadonly usage: PiUsage;\n\t\treadonly stopReason?: string;\n\t\treadonly timestamp?: number;\n\t};\n};\n\ntype PiUsage = {\n\treadonly input?: number;\n\treadonly output?: number;\n\treadonly cacheRead?: number;\n\treadonly cacheWrite?: number;\n};\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction isPiUsage(value: unknown): value is PiUsage {\n\tif (!isObject(value)) {\n\t\treturn false;\n\t}\n\tconst keys = [\"input\", \"output\", \"cacheRead\", \"cacheWrite\"] as const;\n\tfor (const k of keys) {\n\t\tconst v = value[k];\n\t\tif (v !== undefined && !isFiniteNumber(v)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\nfunction isPiSessionEntry(value: unknown): value is PiSessionEntry {\n\tif (!isObject(value)) {\n\t\treturn false;\n\t}\n\tif (value[\"type\"] !== \"session\") {\n\t\treturn false;\n\t}\n\tif (value[\"cwd\"] !== undefined && typeof value[\"cwd\"] !== \"string\") {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nfunction isPiAssistantMessageEntry(value: unknown): value is PiAssistantMessageEntry {\n\tif (!isObject(value)) {\n\t\treturn false;\n\t}\n\tif (value[\"type\"] !== \"message\") {\n\t\treturn false;\n\t}\n\tif (value[\"id\"] !== undefined && typeof value[\"id\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tif (typeof value[\"timestamp\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tconst message = value[\"message\"];\n\tif (!isObject(message)) {\n\t\treturn false;\n\t}\n\tif (message[\"role\"] !== \"assistant\") {\n\t\treturn false;\n\t}\n\tif (typeof message[\"provider\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tif (typeof message[\"model\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tif (message[\"stopReason\"] !== undefined && typeof message[\"stopReason\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tif (message[\"timestamp\"] !== undefined && !isFiniteNumber(message[\"timestamp\"])) {\n\t\treturn false;\n\t}\n\tif (!isPiUsage(message[\"usage\"])) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nexport type { PiAssistantMessageEntry, PiSessionEntry, PiUsage };\nexport { isPiAssistantMessageEntry, isPiSessionEntry };\n","import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { type CliEnv, readCliEnv } from \"../config\";\n\ntype ParserSourcesShape = {\n\treadonly homeDir: Effect.Effect<string>;\n\treadonly cliEnv: Effect.Effect<CliEnv>;\n\treadonly exists: (path: string) => Effect.Effect<boolean>;\n\treadonly isFile: (path: string) => Effect.Effect<boolean>;\n\treadonly readDir: (path: string) => Effect.Effect<readonly string[]>;\n};\n\nclass ParserSources extends Context.Service<ParserSources, ParserSourcesShape>()(\"@oopst/cli/ParserSources\") {}\n\nfunction makeParserSources(): ParserSourcesShape {\n\treturn {\n\t\thomeDir: Effect.sync(() => homedir()),\n\t\tcliEnv: Effect.sync(() => readCliEnv()),\n\t\texists: (path) => Effect.sync(() => existsSync(path)),\n\t\tisFile: (path) =>\n\t\t\tEffect.sync(() => {\n\t\t\t\ttry {\n\t\t\t\t\treturn statSync(path).isFile();\n\t\t\t\t} catch {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}),\n\t\treadDir: (path) =>\n\t\t\tEffect.sync(() => {\n\t\t\t\ttry {\n\t\t\t\t\treturn readdirSync(path);\n\t\t\t\t} catch {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t}),\n\t};\n}\n\nconst ParserSourcesLive: Layer.Layer<ParserSources> = Layer.succeed(ParserSources, makeParserSources());\n\nexport type { ParserSourcesShape };\nexport { ParserSources, ParserSourcesLive };\n"],"mappings":"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","names":["path","name","resolve","dir","readdirSync","platform","arch","runtime","abi","require_node_gyp_build","randomBytes","hash","readFileSync","process","fileURLToPath","Effect","Layer","Option","process","path","key","index","Context","Effect","Layer","Effect","argon2","Effect","sql","name","name","SQL","escaped","param","join","placeholder","name","merge","key","sql","name","name","name","ref","config","name","name","name","name","name","name","char","value","startFrom","name","normalize","name","name","name","name","name","name","name","name","name","name","name","name","name","name","name","name","name","name","name","name","name","name","name","name","name","name","name","name","name","name","unique","name","Effect","Schema","Effect","Effect","Effect","import_argon2","MEMORY_COST","argon2","argon2","Context","Effect","Layer","Schema","Schema","Context","Effect","Layer","Context","databaseError","Effect","Layer","Schema","Context","Effect","Layer","Schema","Rpc","RpcGroup","Schema","Schema","date","Schema","UUID_V7_VERSION","Schema","RpcGroup","Rpc","Schema","Schema","Rpc","RpcGroup","Effect","Schema","Schema","HOURS_PER_DAY","MINUTES_PER_HOUR","SECONDS_PER_MINUTE","MS_PER_SECOND","UUID_V7_VERSION","CIVIL_DATE_PATTERN","Effect","date","RpcGroup","Rpc","Schema","Schema","Rpc","RpcGroup","Schema","UUID_V7_VERSION","RpcGroup","Rpc","Schema","Schema","Rpc","RpcGroup","Effect","Schema","MIN_DEVICE_NAME_LENGTH","MAX_DEVICE_NAME_LENGTH","Schema","deviceNameSchema","max","Effect","RpcGroup","Rpc","Schema","Effect","Schema","Rpc","RpcGroup","Context","Effect","Layer","Context","databaseError","Effect","row","Layer","Context","Effect","Layer","key","Context","databaseError","Effect","Layer","Context","Effect","Layer","HOURS_PER_DAY","MINUTES_PER_HOUR","SECONDS_PER_MINUTE","MS_PER_SECOND","MS_PER_DAY","Context","databaseError","toIsoString","date","time","index","Effect","Layer","Context","Effect","Layer","Context","databaseError","Effect","Layer","Context","Effect","Layer","Context","databaseError","Effect","Layer","Effect","Layer","HOURS_PER_DAY","MINUTES_PER_HOUR","SECONDS_PER_MINUTE","MS_PER_SECOND","MS_PER_DAY","sum","index","Effect","text","Context","Layer","Effect","dirname","isAbsolute","join","stat","isAbsolute","join","process","Config","ConfigProvider","Effect","Schema","runtimeEnv","toConfigEnv","join","isAbsolute","process","Effect","join","Context","Effect","Layer","Effect","createReadStream","createInterface","key","path","model","isObject","isFiniteNumber","key","path","createReadStream","createInterface","path","stat","stat","Effect","isFile","path","stat","Effect","readdir","stat","basename","join","isObject","isFiniteNumber","modelId","time","key","path","sql","path","stat","readdir","join","basename","stat","basename","join","createReadStream","createInterface","isObject","isFiniteNumber","NODE_SQLITE_SPECIFIER","key","modelId","positive","timestampMs","loadDatabaseSync","path","createReadStream","createInterface","pathKind","path","stat","isFile","basename","join","sessionsRoot","seenMessageIds","Effect","homedir","Context","Effect","Layer","Context","Effect","homedir","path","Layer","OPENCODE_DB_FILE_PATTERN","join","isAbsolute","Effect","path","dirname","readFileSync","Layer","Option","process","fileURLToPath","real","Effect"]}
|