@cookielab.io/oopst 0.5.0 → 0.6.1
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 +2810 -4713
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/services/sync-program.ts","../src/sync/run.ts","../src/sync/aggregate.ts","../../../packages/api/src/errors.ts","../../../packages/api/src/rpc/auth.ts","../../../packages/api/src/schemas/auth.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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/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_b88542aae6c05f0832f8498132552c4c/node_modules/src/pg-core/indexes.ts","../../../packages/db/src/schema/user.ts","../../../packages/db/src/schema/api-token.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/services/auth.ts","../../../packages/api/src/auth/sessions.ts","../../../packages/api/src/services/session-auth.ts","../../../packages/api/src/rpc/devices.ts","../../../packages/api/src/schemas/devices.ts","../../../packages/api/src/schemas/common.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/groups.ts","../../../packages/api/src/rpc/sync.ts","../../../packages/api/src/schemas/sync.ts","../src/sync/client.ts","../src/sync/errors.ts","../src/setup.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/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":["#!/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 { runSetup, SetupError } from \"./setup\";\nimport { EXIT, SyncError } from \"./sync/errors\";\nimport { buildRealParserFactory } from \"./sync/parser-factory\";\n\ntype PackageJson = {\n\tname?: string;\n\tversion?: string;\n};\n\ntype PackageMetadata = {\n\tname: string;\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\ntype SetupFlags = {\n\tapi: Option.Option<string>;\n\tserver: Option.Option<string>;\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 readPackageMetadata(): PackageMetadata {\n\tconst raw = readFileSync(new URL(\"../package.json\", import.meta.url), \"utf8\");\n\tconst parsed = JSON.parse(raw) as PackageJson;\n\treturn {\n\t\tname: typeof parsed.name === \"string\" && parsed.name.length > 0 ? parsed.name : \"@cookielab.io/oopst\",\n\t\tversion: typeof parsed.version === \"string\" && parsed.version.length > 0 ? parsed.version : \"0.0.0\",\n\t};\n}\n\nconst PACKAGE = readPackageMetadata();\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\nasync function runSetupCommand(raw: SetupFlags): Promise<number> {\n\ttry {\n\t\tconst result = await runSetup({\n\t\t\tapi: optionalValue(raw.api),\n\t\t\tserver: optionalValue(raw.server),\n\t\t\tinput: process.stdin,\n\t\t\toutput: process.stdout,\n\t\t\tpackageName: PACKAGE.name,\n\t\t\tnodePath: process.execPath,\n\t\t});\n\t\treturn result.exitCode;\n\t} catch (err) {\n\t\tif (err instanceof CliConfigError || err instanceof SetupError) {\n\t\t\twriteStderrLine(err.message);\n\t\t\treturn err instanceof SetupError ? err.exitCode : EXIT.invalidArguments;\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\tconst setup = Command.make(\n\t\t\"setup\",\n\t\t{\n\t\t\tapi: apiFlag,\n\t\t\tserver: serverFlag,\n\t\t},\n\t\t(raw) =>\n\t\t\tEffect.promise(() => runSetupCommand(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(\"Create ~/.oopst.yml and optionally install an hourly cron sync\"));\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, setup]),\n\t);\n}\n\nif (isEntrypoint()) {\n\tbuildCli().pipe(Command.run({ version: PACKAGE.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/client\";\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","// 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 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","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 { 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 { 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, 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 { 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","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 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","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 { 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 { 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, 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 {\n\ttype BucketInput,\n\ttype GetWatermarkOutput,\n\ttype SessionInput,\n\tSyncRpcs,\n\ttype UpsertBucketsOutput,\n} from \"@oopst/api/client\";\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","import { UnauthorizedError } from \"@oopst/api/client\";\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 { spawnSync } from \"node:child_process\";\nimport { randomInt } from \"node:crypto\";\nimport { chmodSync, existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir as readHomedir, hostname as readHostname } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport process from \"node:process\";\nimport { createInterface, type Interface } from \"node:readline/promises\";\nimport { CliConfigError, DEFAULT_SERVER_URL, loadCliConfig, userConfigPath } from \"./config\";\nimport { EXIT } from \"./sync/errors\";\n\nconst CRON_START_MARKER = \"# OopsT sync start\";\nconst CRON_END_MARKER = \"# OopsT sync end\";\nconst DEFAULT_CRON_PATHS = [\"/opt/homebrew/bin\", \"/usr/local/bin\", \"/usr/bin\", \"/bin\", \"/usr/sbin\", \"/sbin\"];\nconst DEFAULT_PACKAGE_NAME = \"@cookielab.io/oopst\";\nconst CONFIG_FILE_MODE = 0o600;\nconst LINE_SPLIT_PATTERN = /\\r?\\n/u;\n\ntype CommandResult = {\n\treadonly status: number | null;\n\treadonly stdout: string;\n\treadonly stderr: string;\n\treadonly error?: Error;\n};\n\ntype CommandRunner = (command: string, args: readonly string[], input?: string) => CommandResult;\n\ntype SetupOptions = {\n\treadonly api?: string;\n\treadonly server?: string;\n\treadonly homeDir?: string;\n\treadonly hostName?: string;\n\treadonly input?: NodeJS.ReadableStream;\n\treadonly output?: NodeJS.WritableStream;\n\treadonly prompts?: SetupPrompts;\n\treadonly packageName?: string;\n\treadonly nodePath?: string;\n\treadonly randomMinute?: () => number;\n\treadonly commandRunner?: CommandRunner;\n};\n\ntype SetupPrompts = {\n\treadonly askWithDefault: (label: string, defaultValue: string) => Promise<string>;\n\treadonly askRequired: (label: string) => Promise<string>;\n\treadonly askYesNo: (label: string, defaultValue: boolean) => Promise<boolean>;\n};\n\ntype SetupResult = {\n\treadonly exitCode: number;\n\treadonly configPath: string;\n\treadonly cronInstalled: boolean;\n\treadonly cronMinute?: number;\n};\n\ntype SetupErrorOptions = ErrorOptions & {\n\treadonly exitCode?: number;\n};\n\ntype CronInstallOptions = {\n\treadonly minute: number;\n\treadonly packageName: string;\n\treadonly npxPath: string;\n\treadonly nodePath: string;\n\treadonly logPath: string;\n};\n\nclass SetupError extends Error {\n\tpublic readonly exitCode: number;\n\n\tpublic constructor(message: string, options: SetupErrorOptions = {}) {\n\t\tsuper(message, options);\n\t\tthis.name = \"SetupError\";\n\t\tthis.exitCode = options.exitCode ?? EXIT.generalFailure;\n\t}\n}\n\nfunction defaultCommandRunner(command: string, args: readonly string[], input?: string): CommandResult {\n\tconst result = spawnSync(command, [...args], {\n\t\tencoding: \"utf8\",\n\t\tinput: input,\n\t});\n\n\treturn {\n\t\tstatus: result.status,\n\t\tstdout: result.stdout ?? \"\",\n\t\tstderr: result.stderr ?? \"\",\n\t\terror: result.error,\n\t};\n}\n\nfunction writeLine(output: NodeJS.WritableStream, message: string): void {\n\toutput.write(`${message}\\n`);\n}\n\nfunction normalizeInput(value: string): string {\n\treturn value.trim();\n}\n\nfunction yamlString(value: string): string {\n\treturn JSON.stringify(value);\n}\n\nfunction formatSetupConfig(options: { readonly api: string; readonly token: string; readonly device: string }): string {\n\treturn [\n\t\t\"server:\",\n\t\t` api: ${yamlString(options.api)}`,\n\t\t` token: ${yamlString(options.token)}`,\n\t\t` device: ${yamlString(options.device)}`,\n\t\t\"\",\n\t].join(\"\\n\");\n}\n\nasync function askWithDefault(rl: Interface, label: string, defaultValue: string): Promise<string> {\n\tconst answer = normalizeInput(await rl.question(`${label} (${defaultValue}): `));\n\treturn answer.length > 0 ? answer : defaultValue;\n}\n\nasync function askRequired(rl: Interface, label: string): Promise<string> {\n\tconst answer = normalizeInput(await rl.question(`${label}: `));\n\tif (answer.length > 0) {\n\t\treturn answer;\n\t}\n\treturn askRequired(rl, label);\n}\n\nasync function askYesNo(rl: Interface, label: string, defaultValue: boolean): Promise<boolean> {\n\tconst suffix = defaultValue ? \"[Y/n]\" : \"[y/N]\";\n\tconst answer = normalizeInput(await rl.question(`${label} ${suffix}: `)).toLowerCase();\n\tif (answer.length === 0) {\n\t\treturn defaultValue;\n\t}\n\tif (answer === \"y\" || answer === \"yes\") {\n\t\treturn true;\n\t}\n\tif (answer === \"n\" || answer === \"no\") {\n\t\treturn false;\n\t}\n\treturn askYesNo(rl, label, defaultValue);\n}\n\nfunction readlinePrompts(rl: Interface): SetupPrompts {\n\treturn {\n\t\taskWithDefault: (label, defaultValue) => askWithDefault(rl, label, defaultValue),\n\t\taskRequired: (label) => askRequired(rl, label),\n\t\taskYesNo: (label, defaultValue) => askYesNo(rl, label, defaultValue),\n\t};\n}\n\nfunction writeSetupConfig(\n\tpath: string,\n\toptions: { readonly api: string; readonly token: string; readonly device: string },\n): void {\n\ttry {\n\t\twriteFileSync(path, formatSetupConfig(options), { encoding: \"utf8\", mode: CONFIG_FILE_MODE });\n\t\tchmodSync(path, CONFIG_FILE_MODE);\n\t} catch (err) {\n\t\tconst reason = err instanceof Error ? err.message : String(err);\n\t\tthrow new SetupError(`failed to write ${path}: ${reason}`, { cause: err });\n\t}\n}\n\nfunction shellQuote(value: string): string {\n\treturn `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n\nfunction unique(values: readonly string[]): string[] {\n\treturn [...new Set(values.filter((value) => value.length > 0))];\n}\n\nfunction buildCronPath(options: { readonly npxPath: string; readonly nodePath: string }): string {\n\treturn unique([dirname(options.npxPath), dirname(options.nodePath), ...DEFAULT_CRON_PATHS]).join(\":\");\n}\n\nfunction buildCronBlock(options: CronInstallOptions): string {\n\tconst path = buildCronPath({ npxPath: options.npxPath, nodePath: options.nodePath });\n\tconst command = [\n\t\t`PATH=${shellQuote(path)}`,\n\t\tshellQuote(options.npxPath),\n\t\t\"-y\",\n\t\tshellQuote(options.packageName),\n\t\t\"sync\",\n\t\t\">>\",\n\t\tshellQuote(options.logPath),\n\t\t\"2>&1\",\n\t].join(\" \");\n\n\treturn [CRON_START_MARKER, `${options.minute} * * * * ${command}`, CRON_END_MARKER].join(\"\\n\");\n}\n\nfunction escapeRegex(value: string): string {\n\treturn value.replace(/[.*+?^${}()|[\\]\\\\]/gu, \"\\\\$&\");\n}\n\nfunction replaceManagedCronBlock(existingCrontab: string, managedBlock: string): string {\n\tconst blockPattern = new RegExp(\n\t\t`(?:^|\\\\n)${escapeRegex(CRON_START_MARKER)}\\\\n[\\\\s\\\\S]*?\\\\n${escapeRegex(CRON_END_MARKER)}\\\\n?`,\n\t\t\"u\",\n\t);\n\tconst withoutManagedBlock = existingCrontab.replace(blockPattern, \"\\n\").trimEnd();\n\treturn withoutManagedBlock.length > 0 ? `${withoutManagedBlock}\\n${managedBlock}\\n` : `${managedBlock}\\n`;\n}\n\nfunction findNpxPath(commandRunner: CommandRunner): string {\n\tconst result = commandRunner(\"/bin/sh\", [\"-lc\", \"command -v npx\"]);\n\tconst npxPath = result.stdout.trim().split(LINE_SPLIT_PATTERN)[0] ?? \"\";\n\tif (result.status === 0 && npxPath.length > 0) {\n\t\treturn npxPath;\n\t}\n\tconst reason = result.error?.message ?? result.stderr.trim() ?? \"npx was not found\";\n\tthrow new SetupError(`failed to set up cron: ${reason}`);\n}\n\nfunction listCrontab(commandRunner: CommandRunner): string {\n\tconst result = commandRunner(\"crontab\", [\"-l\"]);\n\tif (result.status === 0) {\n\t\treturn result.stdout;\n\t}\n\tif (result.stderr.toLowerCase().includes(\"no crontab\")) {\n\t\treturn \"\";\n\t}\n\tconst reason = result.error?.message ?? result.stderr.trim() ?? \"crontab -l failed\";\n\tthrow new SetupError(`failed to read existing crontab: ${reason}`);\n}\n\nfunction installCronBlock(commandRunner: CommandRunner, managedBlock: string): void {\n\tconst existingCrontab = listCrontab(commandRunner);\n\tconst updatedCrontab = replaceManagedCronBlock(existingCrontab, managedBlock);\n\tconst result = commandRunner(\"crontab\", [\"-\"], updatedCrontab);\n\tif (result.status !== 0) {\n\t\tconst reason = result.error?.message ?? result.stderr.trim() ?? \"crontab update failed\";\n\t\tthrow new SetupError(`failed to install cron entry: ${reason}`);\n\t}\n}\n\nfunction readExistingConfig(\n\thomeDir: string,\n\thostName: string,\n): { readonly serverUrl: string; readonly device: string | undefined } {\n\tconst path = userConfigPath(homeDir);\n\tif (!existsSync(path)) {\n\t\treturn { serverUrl: DEFAULT_SERVER_URL, device: hostName };\n\t}\n\n\ttry {\n\t\tconst config = loadCliConfig({\n\t\t\tconfigFileText: readFileSync(path, \"utf8\"),\n\t\t\tconfigPath: path,\n\t\t\tenv: {},\n\t\t\thomeDir: homeDir,\n\t\t\thostName: hostName,\n\t\t});\n\t\treturn { serverUrl: config.serverUrl, device: config.device ?? hostName };\n\t} catch (err) {\n\t\tif (err instanceof CliConfigError) {\n\t\t\tthrow err;\n\t\t}\n\t\tconst reason = err instanceof Error ? err.message : String(err);\n\t\tthrow new SetupError(`failed to read existing ${path}: ${reason}`, { cause: err });\n\t}\n}\n\nfunction resolveApiValue(\n\tapiFlag: string | undefined,\n\tprompts: SetupPrompts,\n\tdefaultServerUrl: string,\n): Promise<string> {\n\treturn apiFlag === undefined\n\t\t? prompts.askWithDefault(\"Server URL\", defaultServerUrl)\n\t\t: Promise.resolve(normalizeInput(apiFlag));\n}\n\nfunction installSetupCron(options: {\n\treadonly commandRunner: CommandRunner;\n\treadonly randomMinute: (() => number) | undefined;\n\treadonly packageName: string;\n\treadonly nodePath: string;\n\treadonly homeDir: string;\n}): { readonly minute: number; readonly npxPath: string } {\n\tconst npxPath = findNpxPath(options.commandRunner);\n\tconst minute = options.randomMinute?.() ?? randomInt(0, 60);\n\tconst logPath = join(options.homeDir, \".oopst-sync.log\");\n\tconst managedBlock = buildCronBlock({\n\t\tminute: minute,\n\t\tpackageName: options.packageName,\n\t\tnpxPath: npxPath,\n\t\tnodePath: options.nodePath,\n\t\tlogPath: logPath,\n\t});\n\tinstallCronBlock(options.commandRunner, managedBlock);\n\treturn { minute: minute, npxPath: npxPath };\n}\n\nasync function runSetup(options: SetupOptions = {}): Promise<SetupResult> {\n\tconst homeDir = options.homeDir ?? readHomedir();\n\tconst hostName = options.hostName ?? readHostname();\n\tconst input = options.input ?? process.stdin;\n\tconst output = options.output ?? process.stdout;\n\tconst packageName = options.packageName ?? DEFAULT_PACKAGE_NAME;\n\tconst commandRunner = options.commandRunner ?? defaultCommandRunner;\n\tconst nodePath = options.nodePath ?? process.execPath;\n\tconst configPath = userConfigPath(homeDir);\n\tconst defaults = readExistingConfig(homeDir, hostName);\n\tconst apiFlag = options.api ?? options.server;\n\tconst rl = options.prompts === undefined ? createInterface({ input: input, output: output }) : undefined;\n\tconst prompts = options.prompts ?? readlinePrompts(rl as Interface);\n\n\ttry {\n\t\tconst api = await resolveApiValue(apiFlag, prompts, defaults.serverUrl);\n\t\tif (api.length === 0) {\n\t\t\tthrow new SetupError(\"error: --api must be a non-empty string\", { exitCode: EXIT.invalidArguments });\n\t\t}\n\t\tconst device = await prompts.askWithDefault(\"Device name\", defaults.device ?? hostName);\n\t\tconst token = await prompts.askRequired(\"Token\");\n\t\tconst shouldInstallCron = await prompts.askYesNo(\"Setup cron?\", false);\n\n\t\twriteSetupConfig(configPath, { api: api, token: token, device: device });\n\t\twriteLine(output, `Wrote ${configPath}`);\n\n\t\tif (!shouldInstallCron) {\n\t\t\twriteLine(output, \"Cron setup skipped.\");\n\t\t\treturn { exitCode: EXIT.success, configPath: configPath, cronInstalled: false };\n\t\t}\n\n\t\tconst { minute, npxPath } = installSetupCron({\n\t\t\tcommandRunner: commandRunner,\n\t\t\trandomMinute: options.randomMinute,\n\t\t\tpackageName: packageName,\n\t\t\tnodePath: nodePath,\n\t\t\thomeDir: homeDir,\n\t\t});\n\t\twriteLine(output, `Installed cron entry for minute ${minute} of every hour.`);\n\t\twriteLine(output, `Cron uses ${npxPath} with an explicit PATH so it does not depend on your login shell.`);\n\t\treturn { exitCode: EXIT.success, configPath: configPath, cronInstalled: true, cronMinute: minute };\n\t} finally {\n\t\trl?.close();\n\t}\n}\n\nexport type { CommandRunner, SetupOptions, SetupPrompts, SetupResult };\nexport {\n\tbuildCronBlock,\n\tCRON_END_MARKER,\n\tCRON_START_MARKER,\n\tformatSetupConfig,\n\treplaceManagedCronBlock,\n\trunSetup,\n\tSetupError,\n};\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","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":["readFileSync","process","Effect","Layer","Option","key","index","Context","Effect","Layer","Effect","Schema","Context","Effect","Layer","Schema","Schema","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","Context","Effect","Layer","Effect","Effect","Effect","Effect","Effect","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","MIN_DEVICE_NAME_LENGTH","MAX_DEVICE_NAME_LENGTH","Effect","RpcGroup","Rpc","Schema","Effect","Layer","HOURS_PER_DAY","MINUTES_PER_HOUR","SECONDS_PER_MINUTE","MS_PER_SECOND","MS_PER_DAY","index","Effect","text","Context","Layer","Effect","readFileSync","readHomedir","readHostname","join","process","readFileSync","apiFlag","join","readHomedir","readHostname","process","dirname","isAbsolute","join","stat","dirname","isAbsolute","join","process","Config","ConfigProvider","Effect","Schema","runtimeEnv","toConfigEnv","join","isAbsolute","process","Effect","join","Context","Effect","Layer","Effect","createReadStream","createInterface","createInterface","key","createInterface","model","isObject","isFiniteNumber","key","createReadStream","createInterface","stat","dirname","stat","Effect","isFile","stat","Effect","readdir","stat","basename","join","isObject","isFiniteNumber","modelId","time","key","sql","stat","readdir","join","basename","stat","basename","join","createReadStream","createInterface","isObject","isFiniteNumber","NODE_SQLITE_SPECIFIER","key","modelId","positive","timestampMs","loadDatabaseSync","createReadStream","createInterface","pathKind","stat","isFile","basename","join","sessionsRoot","seenMessageIds","Effect","existsSync","homedir","Context","Effect","Layer","Context","Effect","homedir","existsSync","Layer","OPENCODE_DB_FILE_PATTERN","join","isAbsolute","Effect","dirname","readFileSync","Layer","Option","process","real","Effect"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/services/command-platform.ts","../src/services/parser-sources.ts","../src/services/sync-program.ts","../src/sync/run.ts","../src/sync/aggregate.ts","../../../packages/api/src/errors.ts","../../../packages/api/src/rpc/auth.ts","../../../packages/api/src/schemas/auth.ts","../../../packages/api/src/schemas/common.ts","../../../packages/api/src/rpc/devices.ts","../../../packages/api/src/schemas/devices.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/groups.ts","../../../packages/api/src/rpc/sync.ts","../../../packages/api/src/schemas/sync.ts","../src/sync/client.ts","../src/sync/errors.ts","../src/sync/parser-collection.ts","../src/setup.ts","../src/sync/parser-factory.ts","../../../packages/parsers/src/claude/index.ts","../../../packages/parsers/src/config.ts","../../../packages/parsers/src/effect/file-walker.ts","../../../packages/parsers/src/walk.ts","../../../packages/parsers/src/warnings.ts","../../../packages/parsers/src/claude/bucketize.ts","../../../packages/parsers/src/codex/bucketize.ts","../../../packages/parsers/src/types.ts","../../../packages/parsers/src/codex/events.ts","../../../packages/parsers/src/claude/events.ts","../../../packages/parsers/src/codex/index.ts","../../../packages/parsers/src/effect/hermes-sqlite.ts","../../../packages/parsers/src/effect/opencode-io.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"],"sourcesContent":["#!/usr/bin/env node\nimport { 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, resolveSyncConfig } from \"./config\";\nimport {\n\tCliCommandPlatformLive,\n\tCliConfigReader,\n\tCliConsole,\n\tCliPackageMetadata,\n\tCliProcess,\n} from \"./services/command-platform\";\nimport { ParserSourcesLive } from \"./services/parser-sources\";\nimport { runSyncProgram } from \"./services/sync-program\";\nimport { runSetup, SetupError } from \"./setup\";\nimport { EXIT, SyncError } from \"./sync/errors\";\nimport { buildRealParserFactoryEffect } from \"./sync/parser-factory\";\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\ntype SetupFlags = {\n\tapi: Option.Option<string>;\n\tserver: Option.Option<string>;\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\ntype OopstCommand = Command.Command<\n\t\"oopst\",\n\t{},\n\t{},\n\tCliExit,\n\tCliConfigReader | CliConsole | CliPackageMetadata | CliProcess\n>;\n\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), CliCommandPlatformLive);\n\nfunction optionalValue<A>(value: Option.Option<A>): A | undefined {\n\treturn Option.getOrUndefined(value);\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\nfunction syncCommandErrorExitCode(err: unknown): Effect.Effect<number, never, CliConsole> {\n\treturn Effect.gen(function* () {\n\t\tconst console = yield* CliConsole;\n\n\t\tif (err instanceof CliConfigError) {\n\t\t\tyield* console.writeStderrLine(err.message);\n\t\t\treturn EXIT.invalidArguments;\n\t\t}\n\t\tif (err instanceof SyncError) {\n\t\t\tyield* console.writeStderrLine(err.message);\n\t\t\treturn err.exitCode;\n\t\t}\n\t\tyield* console.writeUnknownError(err);\n\t\treturn EXIT.generalFailure;\n\t});\n}\n\nfunction setupCommandErrorExitCode(err: unknown): Effect.Effect<number, never, CliConsole> {\n\treturn Effect.gen(function* () {\n\t\tconst console = yield* CliConsole;\n\n\t\tif (err instanceof CliConfigError || err instanceof SetupError) {\n\t\t\tyield* console.writeStderrLine(err.message);\n\t\t\treturn err instanceof SetupError ? err.exitCode : EXIT.invalidArguments;\n\t\t}\n\t\tyield* console.writeUnknownError(err);\n\t\treturn EXIT.generalFailure;\n\t});\n}\n\nfunction recoverCommandExitCode<R>(\n\teffect: Effect.Effect<number, unknown, R>,\n): Effect.Effect<number, never, R | CliConsole> {\n\treturn effect.pipe(\n\t\tEffect.catch((err: unknown) => syncCommandErrorExitCode(err)),\n\t\tEffect.catchDefect((err) => syncCommandErrorExitCode(err)),\n\t);\n}\n\nfunction recoverSetupExitCode<R>(\n\teffect: Effect.Effect<number, unknown, R>,\n): Effect.Effect<number, never, R | CliConsole> {\n\treturn effect.pipe(\n\t\tEffect.catch((err: unknown) => setupCommandErrorExitCode(err)),\n\t\tEffect.catchDefect((err) => setupCommandErrorExitCode(err)),\n\t);\n}\n\nfunction exitCodeToCommandEffect(exitCode: number): Effect.Effect<void, CliExit> {\n\treturn exitCode === EXIT.success ? Effect.void : Effect.fail(new CliExit(exitCode));\n}\n\nfunction runSyncCommand(raw: SyncFlags): Effect.Effect<void, CliExit, CliConfigReader | CliConsole> {\n\treturn recoverCommandExitCode(\n\t\tEffect.gen(function* () {\n\t\t\tconst configReader = yield* CliConfigReader;\n\t\t\tconst console = yield* CliConsole;\n\t\t\tconst env = yield* configReader.read();\n\t\t\tconst config = yield* Effect.try({\n\t\t\t\ttry: () =>\n\t\t\t\t\tresolveSyncConfig(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tapi: optionalValue(raw.api),\n\t\t\t\t\t\t\ttoken: optionalValue(raw.token),\n\t\t\t\t\t\t\tdevice: optionalValue(raw.device),\n\t\t\t\t\t\t\tserver: optionalValue(raw.server),\n\t\t\t\t\t\t\tlookbackDays: optionalValue(raw.lookbackDays),\n\t\t\t\t\t\t},\n\t\t\t\t\t\tenv,\n\t\t\t\t\t),\n\t\t\t\tcatch: (err) => err,\n\t\t\t});\n\t\t\tconst { device, token } = config;\n\t\t\tconst harness = yield* Effect.try({\n\t\t\t\ttry: () => parseHarnessFilter(optionalValue(raw.harness)),\n\t\t\t\tcatch: (err) => err,\n\t\t\t});\n\n\t\t\tif (!(token && device)) {\n\t\t\t\tyield* console.writeStderrLine(\n\t\t\t\t\t\"error: --token and --device are required (or set ~/.oopst.yml / OOPST_TOKEN / OOPST_DEVICE)\",\n\t\t\t\t);\n\t\t\t\treturn EXIT.invalidArguments;\n\t\t\t}\n\n\t\t\tconst factory = yield* buildRealParserFactoryEffect({ env: env, exclude: config.exclude }).pipe(\n\t\t\t\tEffect.provide(ParserSourcesLive),\n\t\t\t);\n\t\t\tlet sourcesExistedHint = false;\n\t\t\tconst parserFactory = (ctx: Parameters<typeof factory>[0]): ReturnType<typeof factory> => {\n\t\t\t\tconst real = factory(ctx);\n\t\t\t\tsourcesExistedHint = real.anySourceExisted;\n\t\t\t\treturn real;\n\t\t\t};\n\n\t\t\tconst result = yield* runSyncProgram({\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: yield* console.stdoutIsTTY,\n\t\t\t\tlogger: console.lineLogger,\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\treturn result.exitCode;\n\t\t}),\n\t).pipe(Effect.flatMap(exitCodeToCommandEffect));\n}\n\nfunction runSetupCommand(raw: SetupFlags): Effect.Effect<void, CliExit, CliConsole | CliPackageMetadata | CliProcess> {\n\treturn recoverSetupExitCode(\n\t\tEffect.gen(function* () {\n\t\t\tconst console = yield* CliConsole;\n\t\t\tconst metadata = yield* CliPackageMetadata;\n\t\t\tconst cliProcess = yield* CliProcess;\n\t\t\tconst nodePath = yield* cliProcess.execPath;\n\t\t\tconst result = yield* Effect.tryPromise({\n\t\t\t\ttry: () =>\n\t\t\t\t\trunSetup({\n\t\t\t\t\t\tapi: optionalValue(raw.api),\n\t\t\t\t\t\tserver: optionalValue(raw.server),\n\t\t\t\t\t\tinput: console.stdin,\n\t\t\t\t\t\toutput: console.stdout,\n\t\t\t\t\t\tpackageName: metadata.name,\n\t\t\t\t\t\tnodePath: nodePath,\n\t\t\t\t\t}),\n\t\t\t\tcatch: (err) => err,\n\t\t\t});\n\t\t\treturn result.exitCode;\n\t\t}),\n\t).pipe(Effect.flatMap(exitCodeToCommandEffect));\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(): OopstCommand {\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) => runSyncCommand(raw),\n\t).pipe(Command.withDescription(\"Scan local AI coding harness logs and upload hourly usage records\"));\n\n\tconst setup = Command.make(\n\t\t\"setup\",\n\t\t{\n\t\t\tapi: apiFlag,\n\t\t\tserver: serverFlag,\n\t\t},\n\t\t(raw) => runSetupCommand(raw),\n\t).pipe(Command.withDescription(\"Create ~/.oopst.yml and optionally install an hourly cron sync\"));\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, setup]),\n\t);\n}\n\nfunction runCli(): Effect.Effect<void, unknown> {\n\treturn Effect.gen(function* () {\n\t\tconst metadata = yield* CliPackageMetadata;\n\t\tyield* buildCli().pipe(Command.run({ version: metadata.version }));\n\t}).pipe(Effect.provide(CliRuntimeLayer));\n}\n\nif (isEntrypoint()) {\n\trunCli().pipe(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, FileSystem, 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 Schema.TaggedErrorClass<CliConfigError>()(\"CliConfigError\", {\n\tmessage: Schema.String,\n\tcause: Schema.optionalKey(Schema.Defect()),\n}) {\n\tpublic constructor(message: string, options: ErrorOptions = {}) {\n\t\tsuper(options.cause === undefined ? { message: message } : { message: message, cause: options.cause });\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\n\t\t? cause\n\t\t: new CliConfigError(cause instanceof Error ? cause.message : String(cause), { cause: 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\nconst readOptionalConfigFileEffect = Effect.fn(\"CliConfig.readOptionalConfigFile\")(function* (path: string) {\n\tconst fs = yield* FileSystem.FileSystem;\n\treturn yield* fs.readFileString(path, \"utf8\").pipe(\n\t\tEffect.catchTag(\"PlatformError\", (err) => {\n\t\t\tif (err.reason._tag === \"NotFound\") {\n\t\t\t\treturn Effect.succeed(undefined);\n\t\t\t}\n\t\t\treturn Effect.fail(new CliConfigError(`failed to read ${path}: ${err.message}`, { cause: err }));\n\t\t}),\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 readCliEnvEffect(\n\toptions: Omit<LoadCliConfigOptions, \"configFileText\"> = {},\n): Effect.Effect<CliEnv, CliConfigError, FileSystem.FileSystem> {\n\tconst homeDir = options.homeDir ?? readHomedir();\n\tconst configPath = options.configPath ?? userConfigPath(homeDir);\n\tconst env = options.env ?? runtimeEnv;\n\tconst hostName = options.hostName ?? readHostname();\n\n\treturn Effect.gen(function* () {\n\t\tconst configFileText = yield* readOptionalConfigFileEffect(configPath);\n\t\treturn yield* loadCliConfigEffect({\n\t\t\tconfigFileText: configFileText,\n\t\t\tconfigPath: configPath,\n\t\t\tenv: env,\n\t\t\thomeDir: homeDir,\n\t\t\thostName: hostName,\n\t\t});\n\t});\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\treadCliEnvEffect,\n\tresolveSyncConfig,\n\tuserConfigPath,\n};\n","import { homedir as readHomedir, hostname as readHostname } from \"node:os\";\nimport process from \"node:process\";\nimport { fileURLToPath } from \"node:url\";\nimport { NodeFileSystem, NodeServices } from \"@effect/platform-node\";\nimport { Context, Effect, FileSystem, Layer, type PlatformError, Stream } from \"effect\";\nimport { ChildProcess, ChildProcessSpawner } from \"effect/unstable/process\";\nimport { type CliConfigError, type CliEnv, readCliEnvEffect } from \"../config\";\n\ntype PackageJson = {\n\tname?: string;\n\tversion?: string;\n};\n\ntype PackageMetadata = {\n\treadonly name: string;\n\treadonly version: string;\n};\n\nconst PACKAGE_JSON_PATHS = [\n\tfileURLToPath(new URL(\"../package.json\", import.meta.url)),\n\tfileURLToPath(new URL(\"../../package.json\", import.meta.url)),\n];\n\ntype CliCommandResult = {\n\treadonly status: number | null;\n\treadonly stdout: string;\n\treadonly stderr: string;\n\treadonly error?: Error;\n};\n\ntype CliWritableStream = NodeJS.WritableStream & {\n\treadonly isTTY?: boolean;\n};\n\ntype CliLineLogger = {\n\treadonly info: (message: string) => void;\n\treadonly error: (message: string) => void;\n};\n\ntype CliConsoleShape = {\n\treadonly stdin: NodeJS.ReadableStream;\n\treadonly stdout: CliWritableStream;\n\treadonly stderr: CliWritableStream;\n\treadonly lineLogger: CliLineLogger;\n\treadonly stdoutIsTTY: Effect.Effect<boolean>;\n\treadonly writeStdoutLine: (message: string) => Effect.Effect<void>;\n\treadonly writeStderrLine: (message: string) => Effect.Effect<void>;\n\treadonly writeUnknownError: (err: unknown) => Effect.Effect<void>;\n};\n\ntype CliProcessShape = {\n\treadonly execPath: Effect.Effect<string, unknown>;\n};\n\ntype CliHostShape = {\n\treadonly homeDir: Effect.Effect<string, unknown>;\n\treadonly hostName: Effect.Effect<string, unknown>;\n};\n\ntype CliCommandRunnerShape = {\n\treadonly run: (command: string, args: readonly string[], input?: string) => Effect.Effect<CliCommandResult>;\n};\n\ntype CliConfigReaderShape = {\n\treadonly read: () => Effect.Effect<CliEnv, CliConfigError>;\n};\n\nclass CliConsole extends Context.Service<CliConsole, CliConsoleShape>()(\"@oopst/cli/CliConsole\") {}\n\nclass CliProcess extends Context.Service<CliProcess, CliProcessShape>()(\"@oopst/cli/CliProcess\") {}\n\nclass CliHost extends Context.Service<CliHost, CliHostShape>()(\"@oopst/cli/CliHost\") {}\n\nclass CliCommandRunner extends Context.Service<CliCommandRunner, CliCommandRunnerShape>()(\n\t\"@oopst/cli/CliCommandRunner\",\n) {}\n\nclass CliPackageMetadata extends Context.Service<CliPackageMetadata, PackageMetadata>()(\n\t\"@oopst/cli/CliPackageMetadata\",\n) {}\n\nclass CliConfigReader extends Context.Service<CliConfigReader, CliConfigReaderShape>()(\"@oopst/cli/CliConfigReader\") {}\n\nfunction writeLine(output: NodeJS.WritableStream, message: string): void {\n\toutput.write(`${message}\\n`);\n}\n\nfunction commandError(cause: unknown): Error {\n\treturn cause instanceof Error ? cause : new Error(String(cause));\n}\n\nfunction collectCommandOutput(stream: Stream.Stream<Uint8Array, PlatformError.PlatformError>): Effect.Effect<string> {\n\treturn stream.pipe(\n\t\tStream.decodeText(),\n\t\tStream.mkString,\n\t\tEffect.orElseSucceed(() => \"\"),\n\t);\n}\n\nfunction parsePackageMetadata(raw: string): PackageMetadata {\n\tconst parsed = JSON.parse(raw) as PackageJson;\n\treturn {\n\t\tname: typeof parsed.name === \"string\" && parsed.name.length > 0 ? parsed.name : \"@cookielab.io/oopst\",\n\t\tversion: typeof parsed.version === \"string\" && parsed.version.length > 0 ? parsed.version : \"0.0.0\",\n\t};\n}\n\nconst readPackageMetadata = Effect.fn(\"CliPackageMetadata.readPackageMetadata\")(function* () {\n\tconst fs = yield* FileSystem.FileSystem;\n\tconst raw = yield* Effect.firstSuccessOf(PACKAGE_JSON_PATHS.map((path) => fs.readFileString(path, \"utf8\")));\n\treturn parsePackageMetadata(raw);\n});\n\nfunction makeCliConsole(options: {\n\treadonly stdin: NodeJS.ReadableStream;\n\treadonly stdout: CliWritableStream;\n\treadonly stderr: CliWritableStream;\n}): CliConsoleShape {\n\tconst writeStdoutLine = (message: string): void => writeLine(options.stdout, message);\n\tconst writeStderrLine = (message: string): void => writeLine(options.stderr, message);\n\n\treturn {\n\t\tstdin: options.stdin,\n\t\tstdout: options.stdout,\n\t\tstderr: options.stderr,\n\t\tlineLogger: {\n\t\t\tinfo: writeStdoutLine,\n\t\t\terror: writeStderrLine,\n\t\t},\n\t\tstdoutIsTTY: Effect.fn(\"CliConsole.stdoutIsTTY\")(() => Effect.succeed(options.stdout.isTTY === true))(),\n\t\twriteStdoutLine: Effect.fn(\"CliConsole.writeStdoutLine\")((message: string) =>\n\t\t\tEffect.sync(() => writeStdoutLine(message)),\n\t\t),\n\t\twriteStderrLine: Effect.fn(\"CliConsole.writeStderrLine\")((message: string) =>\n\t\t\tEffect.sync(() => writeStderrLine(message)),\n\t\t),\n\t\twriteUnknownError: Effect.fn(\"CliConsole.writeUnknownError\")(function* (err: unknown) {\n\t\t\tyield* Effect.sync(() => writeStderrLine(err instanceof Error ? (err.stack ?? err.message) : String(err)));\n\t\t}),\n\t};\n}\n\nconst CliConsoleLive: Layer.Layer<CliConsole> = Layer.effect(\n\tCliConsole,\n\tEffect.sync(() =>\n\t\tCliConsole.of(\n\t\t\tmakeCliConsole({\n\t\t\t\tstdin: process.stdin,\n\t\t\t\tstdout: process.stdout,\n\t\t\t\tstderr: process.stderr,\n\t\t\t}),\n\t\t),\n\t),\n);\n\nconst CliProcessLive: Layer.Layer<CliProcess> = Layer.effect(\n\tCliProcess,\n\tEffect.sync(() =>\n\t\tCliProcess.of({\n\t\t\texecPath: Effect.fn(\"CliProcess.execPath\")(() =>\n\t\t\t\tEffect.try({\n\t\t\t\t\ttry: () => process.execPath,\n\t\t\t\t\tcatch: (err) => err,\n\t\t\t\t}),\n\t\t\t)(),\n\t\t}),\n\t),\n);\n\nconst CliHostLive: Layer.Layer<CliHost> = Layer.effect(\n\tCliHost,\n\tEffect.sync(() =>\n\t\tCliHost.of({\n\t\t\thomeDir: Effect.fn(\"CliHost.homeDir\")(() =>\n\t\t\t\tEffect.try({\n\t\t\t\t\ttry: readHomedir,\n\t\t\t\t\tcatch: (err) => err,\n\t\t\t\t}),\n\t\t\t)(),\n\t\t\thostName: Effect.fn(\"CliHost.hostName\")(() =>\n\t\t\t\tEffect.try({\n\t\t\t\t\ttry: readHostname,\n\t\t\t\t\tcatch: (err) => err,\n\t\t\t\t}),\n\t\t\t)(),\n\t\t}),\n\t),\n);\n\nconst CliCommandRunnerLive: Layer.Layer<CliCommandRunner> = Layer.effect(\n\tCliCommandRunner,\n\tEffect.gen(function* () {\n\t\tconst spawner = yield* ChildProcessSpawner.ChildProcessSpawner;\n\t\treturn CliCommandRunner.of({\n\t\t\trun: Effect.fn(\"CliCommandRunner.run\")(function* (command: string, args: readonly string[], input?: string) {\n\t\t\t\tconst cmd = ChildProcess.make(command, args, {\n\t\t\t\t\tdetached: false,\n\t\t\t\t\tstderr: \"pipe\",\n\t\t\t\t\tstdin: input === undefined ? \"ignore\" : Stream.fromIterable([new TextEncoder().encode(input)]),\n\t\t\t\t\tstdout: \"pipe\",\n\t\t\t\t});\n\n\t\t\t\treturn yield* Effect.scoped(\n\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\tconst handle = yield* spawner.spawn(cmd);\n\t\t\t\t\t\tconst output = yield* Effect.all(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tstderr: collectCommandOutput(handle.stderr),\n\t\t\t\t\t\t\t\tstdout: collectCommandOutput(handle.stdout),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ concurrency: 2 },\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst status = yield* handle.exitCode;\n\t\t\t\t\t\treturn { status: Number(status), stdout: output.stdout, stderr: output.stderr };\n\t\t\t\t\t}).pipe(\n\t\t\t\t\t\tEffect.catch((err: unknown) =>\n\t\t\t\t\t\t\tEffect.succeed({ status: null, stdout: \"\", stderr: \"\", error: commandError(err) }),\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});\n\t}),\n).pipe(Layer.provide(NodeServices.layer));\n\nconst CliPackageMetadataLive: Layer.Layer<CliPackageMetadata> = Layer.effect(\n\tCliPackageMetadata,\n\tEffect.gen(function* () {\n\t\treturn CliPackageMetadata.of(yield* readPackageMetadata().pipe(Effect.orDie));\n\t}),\n).pipe(Layer.provide(NodeFileSystem.layer));\n\nconst CliConfigReaderLive: Layer.Layer<CliConfigReader> = Layer.effect(\n\tCliConfigReader,\n\tEffect.gen(function* () {\n\t\tconst fs = yield* FileSystem.FileSystem;\n\t\treturn CliConfigReader.of({\n\t\t\tread: Effect.fn(\"CliConfigReader.read\")(function* () {\n\t\t\t\treturn yield* readCliEnvEffect().pipe(Effect.provideService(FileSystem.FileSystem, fs));\n\t\t\t}),\n\t\t});\n\t}),\n).pipe(Layer.provide(NodeFileSystem.layer));\n\nconst CliCommandPlatformLive = Layer.mergeAll(\n\tCliConsoleLive,\n\tCliProcessLive,\n\tCliHostLive,\n\tCliCommandRunnerLive,\n\tCliPackageMetadataLive,\n\tCliConfigReaderLive,\n);\n\nexport type { CliCommandResult, CliConsoleShape, CliLineLogger, CliWritableStream, PackageMetadata };\nexport {\n\tCliCommandPlatformLive,\n\tCliCommandRunner,\n\tCliCommandRunnerLive,\n\tCliConfigReader,\n\tCliConfigReaderLive,\n\tCliConsole,\n\tCliConsoleLive,\n\tCliHost,\n\tCliHostLive,\n\tCliPackageMetadata,\n\tCliPackageMetadataLive,\n\tCliProcess,\n\tCliProcessLive,\n\tmakeCliConsole,\n\tparsePackageMetadata,\n\treadPackageMetadata,\n};\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { NodeFileSystem } from \"@effect/platform-node\";\nimport { Context, Effect, FileSystem, Layer, Schema } from \"effect\";\nimport { type CliConfigError, type CliEnv, readCliEnvEffect } from \"../config\";\n\ntype ParserSourceOperation = \"access\" | \"readdir\" | \"stat\";\n\ntype ParserSourcesShape = {\n\treadonly homeDir: Effect.Effect<string>;\n\treadonly cliEnv: Effect.Effect<CliEnv, CliConfigError>;\n\treadonly codexSourceExists: (root: string) => Effect.Effect<boolean>;\n\treadonly claudeSourceExists: (root: string) => Effect.Effect<boolean>;\n\treadonly piSourceExists: (root: string) => Effect.Effect<boolean>;\n\treadonly hermesSourceExists: (root: string) => Effect.Effect<boolean>;\n\treadonly openCodeSourceExists: (root: string) => Effect.Effect<boolean>;\n};\n\nclass ParserSources extends Context.Service<ParserSources, ParserSourcesShape>()(\"@oopst/cli/ParserSources\") {}\n\nclass ParserSourceError extends Schema.TaggedErrorClass<ParserSourceError>()(\"ParserSourceError\", {\n\tcause: Schema.optionalKey(Schema.Defect()),\n\tmessage: Schema.String,\n\toperation: Schema.Literals([\"access\", \"readdir\", \"stat\"]),\n\tpath: Schema.String,\n}) {}\n\nconst OPENCODE_DB_FILE_PATTERN = /^opencode(?:-[^/]+)?\\.db$/u;\n\nconst toParserSourceError =\n\t(operation: ParserSourceOperation, path: string) =>\n\t(error: unknown): ParserSourceError =>\n\t\tnew ParserSourceError({\n\t\t\tcause: error,\n\t\t\tmessage: `ParserSources.${operation} failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\toperation: operation,\n\t\t\tpath: path,\n\t\t});\n\nconst existsStrict = (fs: FileSystem.FileSystem, path: string): Effect.Effect<boolean, ParserSourceError> =>\n\tfs.access(path).pipe(Effect.as(true), Effect.mapError(toParserSourceError(\"access\", path)));\n\nconst isFileStrict = (fs: FileSystem.FileSystem, path: string): Effect.Effect<boolean, ParserSourceError> =>\n\tfs.stat(path).pipe(\n\t\tEffect.map((info) => info.type === \"File\"),\n\t\tEffect.mapError(toParserSourceError(\"stat\", path)),\n\t);\n\nconst readDirStrict = (fs: FileSystem.FileSystem, path: string): Effect.Effect<readonly string[], ParserSourceError> =>\n\tfs.readDirectory(path).pipe(Effect.mapError(toParserSourceError(\"readdir\", path)));\n\nfunction makeParserSources(fs: FileSystem.FileSystem): ParserSourcesShape {\n\tconst exists = Effect.fn(\"ParserSources.exists\")(function* (path: string) {\n\t\treturn yield* existsStrict(fs, path).pipe(Effect.orElseSucceed(() => false));\n\t});\n\tconst isFile = Effect.fn(\"ParserSources.isFile\")(function* (path: string) {\n\t\treturn yield* isFileStrict(fs, path).pipe(Effect.orElseSucceed(() => false));\n\t});\n\tconst readDir = Effect.fn(\"ParserSources.readDir\")(function* (path: string) {\n\t\treturn yield* readDirStrict(fs, path).pipe(Effect.orElseSucceed(() => []));\n\t});\n\tconst hasOpenCodeDatabase = Effect.fn(\"ParserSources.hasOpenCodeDatabase\")(function* (root: string) {\n\t\tconst entries = yield* readDir(root);\n\t\tfor (const entry of entries) {\n\t\t\tif (OPENCODE_DB_FILE_PATTERN.test(entry) && (yield* 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\treturn {\n\t\thomeDir: Effect.fn(\"ParserSources.homeDir\")(function* () {\n\t\t\treturn yield* Effect.sync(() => homedir());\n\t\t})(),\n\t\tcliEnv: Effect.fn(\"ParserSources.cliEnv\")(function* () {\n\t\t\treturn yield* readCliEnvEffect().pipe(Effect.provideService(FileSystem.FileSystem, fs));\n\t\t})(),\n\t\tcodexSourceExists: Effect.fn(\"ParserSources.codexSourceExists\")(function* (root: string) {\n\t\t\treturn yield* exists(root);\n\t\t}),\n\t\tclaudeSourceExists: Effect.fn(\"ParserSources.claudeSourceExists\")(function* (root: string) {\n\t\t\treturn yield* exists(root);\n\t\t}),\n\t\tpiSourceExists: Effect.fn(\"ParserSources.piSourceExists\")(function* (root: string) {\n\t\t\treturn yield* exists(root);\n\t\t}),\n\t\thermesSourceExists: Effect.fn(\"ParserSources.hermesSourceExists\")(function* (root: string) {\n\t\t\treturn (\n\t\t\t\t(yield* isFile(root)) ||\n\t\t\t\t(yield* exists(join(root, \"state.db\"))) ||\n\t\t\t\t(yield* exists(join(root, \"sessions\"))) ||\n\t\t\t\t(yield* exists(join(root, \"agent\", \"sessions\")))\n\t\t\t);\n\t\t}),\n\t\topenCodeSourceExists: Effect.fn(\"ParserSources.openCodeSourceExists\")(function* (root: string) {\n\t\t\tif (root === \":memory:\") {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn (\n\t\t\t\t(yield* isFile(root)) ||\n\t\t\t\t(yield* hasOpenCodeDatabase(root)) ||\n\t\t\t\t(yield* exists(join(root, \"storage\", \"message\"))) ||\n\t\t\t\t(yield* exists(join(root, \"storage\", \"session\", \"message\"))) ||\n\t\t\t\t(yield* exists(join(root, \"project\")))\n\t\t\t);\n\t\t}),\n\t};\n}\n\nconst ParserSourcesLive: Layer.Layer<ParserSources> = Layer.effect(\n\tParserSources,\n\tEffect.gen(function* () {\n\t\tconst fs = yield* FileSystem.FileSystem;\n\t\treturn ParserSources.of(makeParserSources(fs));\n\t}),\n).pipe(Layer.provide(NodeFileSystem.layer));\n\nexport type { ParserSourcesShape };\nexport { makeParserSources, ParserSourceError, ParserSources, ParserSourcesLive };\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.Layer<SyncProgram> = Layer.effect(\n\tSyncProgram,\n\tEffect.sync(() =>\n\t\tSyncProgram.of({\n\t\t\trun: Effect.fn(\"SyncProgram.run\")((options: RunSyncOptions) => runSyncEffect(options)),\n\t\t}),\n\t),\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, Stream } from \"effect\";\nimport { aggregateUsageStream, type UsageAggregationError, type UsageBatch } from \"./aggregate\";\nimport {\n\tmakeSyncRpcClientLayer,\n\ttype SyncClient,\n\tSyncRpcClient,\n\ttype SyncRpcClientShape,\n\tsyncRpcClientFromPromiseClient,\n} from \"./client\";\nimport { EXIT, type ExitCode, isNetworkError, isUnauthorizedError, SyncError } from \"./errors\";\nimport {\n\tParserCollection,\n\ttype ParserCollectionError,\n\tParserCollectionLive,\n\ttype ParserCollectionLogger,\n\ttype ParserSource,\n\ttype SelectedParserSource,\n} from \"./parser-collection\";\n\ntype Logger = ParserCollectionLogger;\n\ntype ParserBundle = {\n\tcodex: ParserSource;\n\tclaudeCode: ParserSource;\n\tpi: ParserSource;\n\thermes: ParserSource;\n\topencode: ParserSource;\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;\n\ntype WatermarkState = {\n\twatermark: Date | null;\n\tsessionKeySalt: string;\n};\n\ntype UploadTotals = {\n\tbatchesUploaded: number;\n\tbucketsUploaded: number;\n\tsessionsUploaded: number;\n};\n\ntype UsageBatchPlan = {\n\tbatchCount: number;\n\tbucketCount: number;\n\tsessionCount: number;\n};\n\ntype UploadUsageBatchStreamOptions = {\n\tbatches: UsageBatchStream;\n\tclient: SyncRpcClientShape;\n\tcolor: boolean;\n\tdevice: string;\n\tlogger: Logger;\n};\n\ntype UsageBatchStream = Stream.Stream<UsageBatch, ParserCollectionError | UsageAggregationError>;\n\ntype UploadStreamResult = {\n\tplan: UsageBatchPlan;\n\ttotals: UploadTotals;\n};\n\ntype SyncStepResult<T> = SyncStepSuccess<T> | SyncStepFailure;\n\ntype SyncStepSuccess<T> = {\n\t_tag: \"Success\";\n\tvalue: T;\n};\n\ntype SyncStepFailure = {\n\t_tag: \"SyncFailure\";\n\tresult: RunSyncResult;\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 */\nfunction runSync(options: RunSyncOptions): Promise<RunSyncResult> {\n\treturn Effect.runPromise(runSyncEffect(options));\n}\n\nfunction runSyncEffect(options: RunSyncOptions): Effect.Effect<RunSyncResult, unknown> {\n\tconst program = runSyncProgram(options).pipe(Effect.provide(ParserCollectionLive));\n\tif (options.client) {\n\t\treturn program.pipe(Effect.provideService(SyncRpcClient, syncRpcClientFromPromiseClient(options.client)));\n\t}\n\treturn Effect.scoped(\n\t\tprogram.pipe(\n\t\t\tEffect.provide(\n\t\t\t\tmakeSyncRpcClientLayer({ token: options.token, serverUrl: options.serverUrl, fetch: options.fetch }),\n\t\t\t),\n\t\t),\n\t);\n}\n\nfunction runSyncProgram(\n\toptions: RunSyncOptions,\n): Effect.Effect<RunSyncResult, unknown, ParserCollection | SyncRpcClient> {\n\treturn Effect.gen(function* () {\n\t\tyield* validateRunSyncOptions(options);\n\n\t\tconst client = yield* SyncRpcClient;\n\t\tconst parserCollection = yield* ParserCollection;\n\t\tconst color = options.color === true;\n\t\tconst watermarkResult = yield* recoverSyncFailure(fetchWatermark(options, client, color), options.logger);\n\t\tif (watermarkResult._tag === \"SyncFailure\") {\n\t\t\treturn watermarkResult.result;\n\t\t}\n\n\t\tconst { sessionKeySalt, watermark } = watermarkResult.value;\n\t\tconst cutoff = new Date((watermark?.getTime() ?? 0) - options.lookbackDays * MS_PER_DAY);\n\t\tif (options.verbose) {\n\t\t\tyield* logInfo(options.logger, `watermark=${watermark?.toISOString() ?? \"null\"} cutoff=${cutoff.toISOString()}`);\n\t\t}\n\n\t\tconst parsers = yield* Effect.sync(() => options.parserFactory({ cutoff: cutoff, device: options.device }));\n\t\tconst sources = selectSources(options.harness, parsers);\n\t\tconst parserStream = yield* parserCollection.stream({\n\t\t\tsources: sources,\n\t\t\tlogger: options.logger,\n\t\t\tcolor: color,\n\t\t});\n\t\tconst usageBatches = usageBatchStream(parserStream, sessionKeySalt);\n\n\t\tif (options.dryRun) {\n\t\t\tconst planResult = yield* recoverSyncFailure(summarizeUsageBatchStream(usageBatches), options.logger);\n\t\t\tif (planResult._tag === \"SyncFailure\") {\n\t\t\t\treturn planResult.result;\n\t\t\t}\n\n\t\t\tconst plan = planResult.value;\n\t\t\tconst dryRunResult = yield* finishDryRun(options, plan, color);\n\t\t\tif (dryRunResult) {\n\t\t\t\treturn dryRunResult;\n\t\t\t}\n\n\t\t\tyield* logInfo(\n\t\t\t\toptions.logger,\n\t\t\t\tphase(`Aggregated usage by hour and model: ${usageRecordText(plan.bucketCount)} ready.`, color),\n\t\t\t);\n\n\t\t\tconst dryRunSummary =\n\t\t\t\t`${dryRunPrefix(color)} ${usageRecordText(plan.bucketCount)} from ${localSessionText(plan.sessionCount)} ` +\n\t\t\t\t`would be uploaded in ${uploadRequestText(plan.batchCount)}.`;\n\t\t\tyield* logInfo(options.logger, dryRunSummary);\n\t\t\tyield* logInfo(options.logger, muted(\"No usage data was uploaded.\", color));\n\t\t\treturn {\n\t\t\t\texitCode: EXIT.success,\n\t\t\t\tbatchesUploaded: plan.batchCount,\n\t\t\t\tbucketsUploaded: plan.bucketCount,\n\t\t\t\tsessionsUploaded: plan.sessionCount,\n\t\t\t};\n\t\t}\n\n\t\tconst uploadResult = yield* recoverSyncFailure(\n\t\t\tuploadUsageBatchStream({\n\t\t\t\tbatches: usageBatches,\n\t\t\t\tclient: client,\n\t\t\t\tcolor: color,\n\t\t\t\tdevice: options.device,\n\t\t\t\tlogger: options.logger,\n\t\t\t}),\n\t\t\toptions.logger,\n\t\t);\n\t\tif (uploadResult._tag === \"SyncFailure\") {\n\t\t\treturn uploadResult.result;\n\t\t}\n\n\t\tconst { plan, totals } = uploadResult.value;\n\t\tif (plan.bucketCount === 0 && options.sourcesExistedHint === true) {\n\t\t\tyield* logError(\n\t\t\t\toptions.logger,\n\t\t\t\terrorLine(\n\t\t\t\t\t\"produced zero usage records but parser reported source files existed - likely parser regression\",\n\t\t\t\t\tcolor,\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn zeroBucketsButSourcesExistResult();\n\t\t}\n\n\t\tif (plan.batchCount === 0) {\n\t\t\tyield* logInfo(options.logger, `${successPrefix(color)} no usage records to upload.`);\n\t\t\treturn emptySuccessResult();\n\t\t}\n\n\t\tconst verboseUploadSuffix = options.verbose ? ` in ${uploadRequestText(totals.batchesUploaded)}` : \"\";\n\t\tconst uploadSummary =\n\t\t\t`${successPrefix(color)} uploaded ${usageRecordText(totals.bucketsUploaded)} ` +\n\t\t\t`from ${localSessionText(totals.sessionsUploaded)}${verboseUploadSuffix}.`;\n\t\tyield* logInfo(options.logger, uploadSummary);\n\n\t\treturn {\n\t\t\texitCode: EXIT.success,\n\t\t\tbatchesUploaded: totals.batchesUploaded,\n\t\t\tbucketsUploaded: totals.bucketsUploaded,\n\t\t\tsessionsUploaded: totals.sessionsUploaded,\n\t\t};\n\t});\n}\n\nfunction validateRunSyncOptions(options: RunSyncOptions): Effect.Effect<void, SyncError> {\n\treturn Effect.gen(function* () {\n\t\tif (!options.token) {\n\t\t\treturn yield* Effect.fail(new SyncError(EXIT.invalidArguments, \"missing --token\"));\n\t\t}\n\t\tif (!options.device) {\n\t\t\treturn yield* Effect.fail(new SyncError(EXIT.invalidArguments, \"missing --device\"));\n\t\t}\n\t});\n}\n\nfunction fetchWatermark(\n\toptions: RunSyncOptions,\n\tclient: SyncRpcClientShape,\n\tcolor: boolean,\n): Effect.Effect<WatermarkState, unknown> {\n\treturn Effect.gen(function* () {\n\t\tyield* logInfo(options.logger, phase(\"Checking server sync point...\", color));\n\t\tconst { sessionKeySalt, watermarkHourUtc } = yield* client.getWatermark({ device: options.device });\n\t\treturn {\n\t\t\twatermark: watermarkHourUtc ? new Date(watermarkHourUtc) : null,\n\t\t\tsessionKeySalt: sessionKeySalt,\n\t\t};\n\t});\n}\n\nfunction selectSources(harness: RunSyncOptions[\"harness\"], parsers: ParserBundle): SelectedParserSource[] {\n\tconst sources: SelectedParserSource[] = [];\n\tif (harness === undefined || harness === \"codex\") {\n\t\tsources.push({ label: \"Codex\", source: parsers.codex });\n\t}\n\tif (harness === undefined || harness === \"claude_code\") {\n\t\tsources.push({ label: \"Claude Code\", source: parsers.claudeCode });\n\t}\n\tif (harness === undefined || harness === \"pi\") {\n\t\tsources.push({ label: \"Pi\", source: parsers.pi });\n\t}\n\tif (harness === undefined || harness === \"hermes\") {\n\t\tsources.push({ label: \"Hermes\", source: parsers.hermes });\n\t}\n\tif (harness === undefined || harness === \"opencode\") {\n\t\tsources.push({ label: \"OpenCode\", source: parsers.opencode });\n\t}\n\treturn sources;\n}\n\n/**\n * aggregateUsageStream must still finish full local aggregation before it can emit\n * batches: sync.upsertBuckets is a unary, last-write-wins RPC, so partial\n * per-key flushes would overwrite totals for buckets seen later in the scan.\n * The runner consumes the emitted batch stream directly instead of folding it\n * into a second UsageBatch[] before upload.\n */\nfunction usageBatchStream(\n\tsource: Stream.Stream<ParsedBucket, ParserCollectionError>,\n\tsessionKeySalt: string,\n): UsageBatchStream {\n\treturn aggregateUsageStream(source, {\n\t\tbatchSize: SYNC_BATCH_SIZE,\n\t\tsessionKeySalt: sessionKeySalt,\n\t}).pipe(Stream.filter((batch) => batch.buckets.length > 0 || batch.sessions.length > 0));\n}\n\nconst summarizeUsageBatchStream = Effect.fn(\"RunSync.summarizeUsageBatchStream\")(\n\t(batches: UsageBatchStream): Effect.Effect<UsageBatchPlan, ParserCollectionError | UsageAggregationError> =>\n\t\tbatches.pipe(Stream.runFold(emptyUsageBatchPlan, addUsageBatchToPlan)),\n);\n\nfunction finishDryRun(\n\toptions: RunSyncOptions,\n\tplan: UsageBatchPlan,\n\tcolor: boolean,\n): Effect.Effect<RunSyncResult | undefined> {\n\treturn Effect.gen(function* () {\n\t\tif (plan.bucketCount === 0 && options.sourcesExistedHint === true) {\n\t\t\tyield* logError(\n\t\t\t\toptions.logger,\n\t\t\t\terrorLine(\n\t\t\t\t\t\"produced zero usage records but parser reported source files existed - likely parser regression\",\n\t\t\t\t\tcolor,\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn zeroBucketsButSourcesExistResult();\n\t\t}\n\n\t\tif (plan.batchCount === 0) {\n\t\t\tyield* logInfo(options.logger, `${successPrefix(color)} no usage records to upload.`);\n\t\t\treturn emptySuccessResult();\n\t\t}\n\n\t\treturn undefined;\n\t});\n}\n\nfunction emptyUsageBatchPlan(): UsageBatchPlan {\n\treturn { batchCount: 0, bucketCount: 0, sessionCount: 0 };\n}\n\nfunction addUsageBatchToPlan(plan: UsageBatchPlan, batch: UsageBatch): UsageBatchPlan {\n\treturn {\n\t\tbatchCount: plan.batchCount + 1,\n\t\tbucketCount: plan.bucketCount + batch.buckets.length,\n\t\tsessionCount: plan.sessionCount + batch.sessions.length,\n\t};\n}\n\nfunction summarizeUsageBatchArray(batches: readonly UsageBatch[]): UsageBatchPlan {\n\tlet plan = emptyUsageBatchPlan();\n\tfor (const batch of batches) {\n\t\tplan = addUsageBatchToPlan(plan, batch);\n\t}\n\treturn plan;\n}\n\nconst uploadUsageBatchStream = Effect.fn(\"RunSync.uploadUsageBatchStream\")(\n\t(options: UploadUsageBatchStreamOptions): Effect.Effect<UploadStreamResult, unknown> =>\n\t\tEffect.gen(function* () {\n\t\t\tlet plan = emptyUsageBatchPlan();\n\t\t\tlet totals: UploadTotals = {\n\t\t\t\tbatchesUploaded: 0,\n\t\t\t\tbucketsUploaded: 0,\n\t\t\t\tsessionsUploaded: 0,\n\t\t\t};\n\n\t\t\tyield* options.batches.pipe(\n\t\t\t\tStream.runForEachArray((batchChunk) =>\n\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\tconst chunkPlan = summarizeUsageBatchArray(batchChunk);\n\t\t\t\t\t\tplan = {\n\t\t\t\t\t\t\tbatchCount: plan.batchCount + chunkPlan.batchCount,\n\t\t\t\t\t\t\tbucketCount: plan.bucketCount + chunkPlan.bucketCount,\n\t\t\t\t\t\t\tsessionCount: plan.sessionCount + chunkPlan.sessionCount,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tyield* logInfo(\n\t\t\t\t\t\t\toptions.logger,\n\t\t\t\t\t\t\tphase(\n\t\t\t\t\t\t\t\t`Aggregated usage by hour and model: ${usageRecordText(chunkPlan.bucketCount)} ready.`,\n\t\t\t\t\t\t\t\toptions.color,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst batchNumberOffset = totals.batchesUploaded;\n\t\t\t\t\t\tfor (const [index, batch] of batchChunk.entries()) {\n\t\t\t\t\t\t\tyield* logInfo(\n\t\t\t\t\t\t\t\toptions.logger,\n\t\t\t\t\t\t\t\tphase(`Uploading usage... ${batchNumberOffset + index + 1}/${plan.batchCount}`, options.color),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst result = yield* options.client.upsertBuckets({\n\t\t\t\t\t\t\t\tdevice: options.device,\n\t\t\t\t\t\t\t\tbuckets: batch.buckets,\n\t\t\t\t\t\t\t\tsessions: batch.sessions,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\ttotals = {\n\t\t\t\t\t\t\t\tbatchesUploaded: totals.batchesUploaded + 1,\n\t\t\t\t\t\t\t\tbucketsUploaded: totals.bucketsUploaded + result.upserted,\n\t\t\t\t\t\t\t\tsessionsUploaded: totals.sessionsUploaded + result.upsertedSessions,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t);\n\n\t\t\treturn { plan: plan, totals: totals };\n\t\t}),\n);\n\nfunction recoverSyncFailure<A>(\n\teffect: Effect.Effect<A, unknown>,\n\tlogger: Logger,\n): Effect.Effect<SyncStepResult<A>, unknown> {\n\treturn Effect.gen(function* () {\n\t\treturn syncStepSuccess(yield* effect);\n\t}).pipe(\n\t\tEffect.catch((err: unknown) => {\n\t\t\tconst result = syncFailureResult(err, logger);\n\t\t\treturn result ? Effect.succeed(syncStepFailure(result)) : Effect.fail(err);\n\t\t}),\n\t);\n}\n\nfunction syncStepSuccess<T>(value: T): SyncStepResult<T> {\n\treturn { _tag: \"Success\", value: value };\n}\n\nfunction syncStepFailure(result: RunSyncResult): SyncStepResult<never> {\n\treturn { _tag: \"SyncFailure\", result: result };\n}\n\nfunction syncFailureResult(err: unknown, logger: Logger): RunSyncResult | undefined {\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\treturn undefined;\n}\n\nfunction zeroBucketsButSourcesExistResult(): RunSyncResult {\n\treturn { exitCode: EXIT.zeroBucketsButSourcesExist, batchesUploaded: 0, bucketsUploaded: 0, sessionsUploaded: 0 };\n}\n\nfunction emptySuccessResult(): RunSyncResult {\n\treturn { exitCode: EXIT.success, batchesUploaded: 0, bucketsUploaded: 0, sessionsUploaded: 0 };\n}\n\nfunction logInfo(logger: Logger, msg: string): Effect.Effect<void> {\n\treturn Effect.sync(() => logger.info(msg));\n}\n\nfunction logError(logger: Logger, msg: string): Effect.Effect<void> {\n\treturn Effect.sync(() => logger.error(msg));\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\nexport type { Logger, ParserBundle, ParserFactoryContext, RunSyncOptions, RunSyncResult };\nexport { runSync, runSyncEffect };\n","import { createHmac } from \"node:crypto\";\nimport type { BucketInput, SessionInput } from \"@oopst/api/client\";\nimport type { ParsedBucket } from \"@oopst/parsers\";\nimport { Effect, Schema, Stream } from \"effect\";\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\ntype UsageAggregationState = {\n\taccumulators: Map<string, Accumulator>;\n\tsessionAccumulators: Map<string, SessionAccumulator>;\n};\n\nconst UsageAggregationErrorFields = {\n\tmessage: Schema.String,\n\tcause: Schema.optionalKey(Schema.Defect()),\n};\n\nclass UsageAggregationError extends Schema.TaggedErrorClass<UsageAggregationError>()(\n\t\"UsageAggregationError\",\n\tUsageAggregationErrorFields,\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\nfunction createUsageAggregationState(): UsageAggregationState {\n\treturn {\n\t\taccumulators: new Map(),\n\t\tsessionAccumulators: new Map(),\n\t};\n}\n\nfunction addBucketToAggregationState(\n\tstate: UsageAggregationState,\n\tbucket: ParsedBucket,\n\tsessionKeySalt: string,\n): UsageAggregationState {\n\tconst k = key(bucket);\n\tlet acc = state.accumulators.get(k);\n\tif (!acc) {\n\t\tacc = {\n\t\t\tharness: bucket.harness,\n\t\t\tmodel: bucket.model,\n\t\t\thourUtc: toIso(bucket.hourUtc),\n\t\t\tinputTokens: 0,\n\t\t\toutputTokens: 0,\n\t\t\tcacheReadTokens: 0,\n\t\t\tcacheCreateTokens: 0,\n\t\t\tsessionIds: new Set(),\n\t\t};\n\t\tstate.accumulators.set(k, acc);\n\t}\n\tacc.inputTokens += bucket.inputTokens;\n\tacc.outputTokens += bucket.outputTokens;\n\tacc.cacheReadTokens += bucket.cacheReadTokens;\n\tacc.cacheCreateTokens += bucket.cacheCreateTokens;\n\tfor (const id of bucket.sessionIds) {\n\t\tacc.sessionIds.add(id);\n\t\taddSessionAccumulator(state.sessionAccumulators, bucket, id, sessionKeySalt);\n\t}\n\treturn state;\n}\n\nfunction addBucketToAggregationStateEffect(\n\tstate: UsageAggregationState,\n\tbucket: ParsedBucket,\n\tsessionKeySalt: string,\n): Effect.Effect<UsageAggregationState, UsageAggregationError> {\n\treturn Effect.try({\n\t\ttry: () => addBucketToAggregationState(state, bucket, sessionKeySalt),\n\t\tcatch: toUsageAggregationError,\n\t});\n}\n\nfunction finalizeUsageBatches(state: UsageAggregationState, batchSize: number): UsageBatch[] {\n\tconst finalized: BucketInput[] = [];\n\tfor (const acc of state.accumulators.values()) {\n\t\tfinalized.push(finalize(acc));\n\t}\n\n\tconst finalizedSessions: SessionInput[] = [];\n\tfor (const acc of state.sessionAccumulators.values()) {\n\t\tfinalizedSessions.push(finalizeSession(acc));\n\t}\n\n\tconst batches: UsageBatch[] = [];\n\tconst maxLength = Math.max(finalized.length, finalizedSessions.length);\n\tfor (let i = 0; i < maxLength; i += batchSize) {\n\t\tbatches.push({\n\t\t\tbuckets: finalized.slice(i, i + batchSize),\n\t\t\tsessions: finalizedSessions.slice(i, i + batchSize),\n\t\t});\n\t}\n\treturn batches;\n}\n\nfunction toUsageAggregationError(cause: unknown): UsageAggregationError {\n\treturn new UsageAggregationError({\n\t\tmessage: `usage aggregation failed: ${errorMessage(cause)}`,\n\t\tcause: cause,\n\t});\n}\n\nfunction errorMessage(cause: unknown): string {\n\treturn cause instanceof Error ? cause.message : \"unknown aggregation error\";\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 from an Effect stream into uploadable hourly buckets and\n * exact session facts while preserving the existing upload batch shape.\n */\nfunction aggregateUsageStream<E, R>(\n\tsource: Stream.Stream<ParsedBucket, E, R>,\n\toptions: AggregateOptions,\n): Stream.Stream<UsageBatch, E | UsageAggregationError, R> {\n\treturn Stream.fromIterableEffect(\n\t\tsource.pipe(\n\t\t\tStream.runFoldEffect(\n\t\t\t\t() => createUsageAggregationState(),\n\t\t\t\t(state, bucket) => addBucketToAggregationStateEffect(state, bucket, options.sessionKeySalt),\n\t\t\t),\n\t\t\tEffect.map((state) => finalizeUsageBatches(state, options.batchSize)),\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 state = createUsageAggregationState();\n\n\tfor await (const bucket of source) {\n\t\taddBucketToAggregationState(state, bucket, options.sessionKeySalt);\n\t}\n\n\tfor (const batch of finalizeUsageBatches(state, options.batchSize)) {\n\t\tyield batch;\n\t}\n}\n\nexport type { AggregateOptions, UsageBatch };\nexport { aggregate, aggregateUsage, aggregateUsageStream, createSessionKey, UsageAggregationError };\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\nconst InfrastructureErrorFields = {\n\t...ErrorFields,\n\tcause: Schema.optionalKey(Schema.Defect()),\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>()(\n\t\"ExternalHttpError\",\n\tInfrastructureErrorFields,\n) {}\n\nexport class DatabaseError extends Schema.TaggedErrorClass<DatabaseError>()(\n\t\"DatabaseError\",\n\tInfrastructureErrorFields,\n) {}\n\nexport class AppConfigError extends Schema.TaggedErrorClass<AppConfigError>()(\n\t\"AppConfigError\",\n\tInfrastructureErrorFields,\n) {}\n\nexport class PricingRefreshError extends Schema.TaggedErrorClass<PricingRefreshError>()(\n\t\"PricingRefreshError\",\n\tInfrastructureErrorFields,\n) {}\n\nexport class ParserSourceError extends Schema.TaggedErrorClass<ParserSourceError>()(\n\t\"ParserSourceError\",\n\tInfrastructureErrorFields,\n) {}\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 { Context, 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 { isoUtcString } from \"../schemas/common\";\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: isoUtcString,\n\t}),\n});\n\nconst LogoutResponse = Schema.Struct({\n\tok: Schema.Boolean,\n});\n\ntype WebRpcContextShape = {\n\treadonly session: SessionContext;\n};\n\nclass WebRpcContext extends Context.Service<WebRpcContext, WebRpcContextShape>()(\"@oopst/api/WebRpcContext\") {}\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\nexport { 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 { 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 { Schema } from \"effect\";\nimport { Rpc, RpcGroup } from \"effect/unstable/rpc\";\nimport { ConflictError, DatabaseError, NotFoundError, UnauthorizedError } from \"../errors\";\nimport { deleteDeviceInput, deleteDeviceOutput, 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\tRpc.make(\"devices.delete\", {\n\t\tpayload: deleteDeviceInput,\n\t\tsuccess: deleteDeviceOutput,\n\t\terror: Schema.Union([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 deleteDeviceInput = Schema.Struct({\n\tid: deviceIdSchema,\n});\ntype DeleteDeviceInput = typeof deleteDeviceInput.Type;\n\nconst renameDeviceOutput = Schema.Struct({\n\tid: deviceIdSchema,\n\tname: Schema.String,\n\tlastSeen: isoUtcString,\n});\ntype RenameDeviceOutput = typeof renameDeviceOutput.Type;\n\nconst deleteDeviceOutput = Schema.Struct({\n\tok: Schema.Boolean,\n});\ntype DeleteDeviceOutput = typeof deleteDeviceOutput.Type;\n\nexport type { DeleteDeviceInput, DeleteDeviceOutput, RenameDeviceInput, RenameDeviceOutput };\nexport { deleteDeviceInput, deleteDeviceOutput, deviceNameSchema, renameDeviceInput, renameDeviceOutput };\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\";\nimport { isoUtcString, uuidV7 } from \"./common\";\n\nconst MIN_TOKEN_NAME_LENGTH = 1;\nconst MAX_TOKEN_NAME_LENGTH = 80;\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: uuidV7,\n});\ntype RevokeTokenInput = typeof revokeTokenInput.Type;\n\nconst tokenMetadata = Schema.Struct({\n\tid: uuidV7,\n\tname: Schema.String,\n\tprefix: Schema.String,\n\tcreatedAt: isoUtcString,\n\tlastUsedAt: Schema.NullOr(isoUtcString),\n\trevokedAt: Schema.NullOr(isoUtcString),\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 { 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, 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 {\n\ttype BucketInput,\n\ttype GetWatermarkOutput,\n\ttype SessionInput,\n\tSyncRpcs,\n\ttype UpsertBucketsOutput,\n} from \"@oopst/api/client\";\nimport { Context, 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 GetWatermarkInput = {\n\treadonly device: string;\n};\n\ntype UpsertBucketsInput = {\n\treadonly device: string;\n\treadonly buckets: readonly BucketInput[];\n\treadonly sessions: readonly SessionInput[];\n};\n\ntype SyncRpcClientShape = {\n\treadonly getWatermark: (input: GetWatermarkInput) => Effect.Effect<GetWatermarkOutput, unknown>;\n\treadonly upsertBuckets: (input: UpsertBucketsInput) => Effect.Effect<UpsertBucketsOutput, unknown>;\n};\n\ntype SyncClient = {\n\treadonly sync: {\n\t\treadonly getWatermark: {\n\t\t\treadonly mutate: (input: GetWatermarkInput) => Promise<GetWatermarkOutput>;\n\t\t};\n\t\treadonly upsertBuckets: {\n\t\t\treadonly mutate: (input: UpsertBucketsInput) => Promise<UpsertBucketsOutput>;\n\t\t};\n\t};\n};\n\nclass SyncRpcClient extends Context.Service<SyncRpcClient, SyncRpcClientShape>()(\"@oopst/cli/SyncRpcClient\") {}\n\nfunction createSyncClient(options: CreateClientOptions): SyncClient {\n\tconst clientLive = makeSyncRpcClientLayer(options);\n\tconst run = <A>(effect: Effect.Effect<A, unknown, SyncRpcClient>): Promise<A> =>\n\t\tEffect.runPromise(Effect.scoped(effect.pipe(Effect.provide(clientLive))));\n\n\treturn {\n\t\tsync: {\n\t\t\tgetWatermark: {\n\t\t\t\tmutate: (input) => run(Effect.flatMap(SyncRpcClient, (client) => client.getWatermark(input))),\n\t\t\t},\n\t\t\tupsertBuckets: {\n\t\t\t\tmutate: (input) => run(Effect.flatMap(SyncRpcClient, (client) => client.upsertBuckets(input))),\n\t\t\t},\n\t\t},\n\t};\n}\n\nfunction syncRpcClientFromPromiseClient(client: SyncClient): SyncRpcClientShape {\n\tconst getWatermark = Effect.fn(\"SyncRpcClient.fromPromise.getWatermark\")((input: GetWatermarkInput) =>\n\t\tEffect.tryPromise({\n\t\t\ttry: () => client.sync.getWatermark.mutate(input),\n\t\t\tcatch: (err) => err,\n\t\t}),\n\t);\n\tconst upsertBuckets = Effect.fn(\"SyncRpcClient.fromPromise.upsertBuckets\")((input: UpsertBucketsInput) =>\n\t\tEffect.tryPromise({\n\t\t\ttry: () => client.sync.upsertBuckets.mutate(input),\n\t\t\tcatch: (err) => err,\n\t\t}),\n\t);\n\treturn SyncRpcClient.of({ getWatermark: getWatermark, upsertBuckets: upsertBuckets });\n}\n\nfunction makeSyncRpcClientLayer(options: CreateClientOptions): Layer.Layer<SyncRpcClient, never, never> {\n\treturn Layer.effect(\n\t\tSyncRpcClient,\n\t\tEffect.gen(function* () {\n\t\t\tconst client = yield* RpcClient.make(SyncRpcs);\n\t\t\tconst getWatermark = Effect.fn(\"SyncRpcClient.getWatermark\")((input: GetWatermarkInput) =>\n\t\t\t\tclient[\"sync.getWatermark\"](input),\n\t\t\t);\n\t\t\tconst upsertBuckets = Effect.fn(\"SyncRpcClient.upsertBuckets\")((input: UpsertBucketsInput) =>\n\t\t\t\tclient[\"sync.upsertBuckets\"](input),\n\t\t\t);\n\t\t\treturn SyncRpcClient.of({ getWatermark: getWatermark, upsertBuckets: upsertBuckets });\n\t\t}),\n\t).pipe(Layer.provide(makeClientLive(options)));\n}\n\nfunction makeClientLive(options: CreateClientOptions): Layer.Layer<RpcClient.Protocol, never, never> {\n\tlet clientLive = 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\tif (options.fetch) {\n\t\tclientLive = clientLive.pipe(Layer.provide(Layer.succeed(FetchHttpClient.Fetch, options.fetch)));\n\t}\n\treturn clientLive;\n}\n\nfunction stripTrailingSlash(url: string): string {\n\treturn url.endsWith(\"/\") ? url.slice(0, -1) : url;\n}\n\nconst createClient = createSyncClient;\n\nexport type { CreateClientOptions, SyncClient, SyncRpcClientShape };\nexport { createClient, createSyncClient, makeSyncRpcClientLayer, SyncRpcClient, syncRpcClientFromPromiseClient };\n","import { UnauthorizedError } from \"@oopst/api/client\";\nimport { Schema } from \"effect\";\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;\nconst EXIT_CODES = [\n\tSUCCESS_EXIT_CODE,\n\tZERO_BUCKETS_EXIT_CODE,\n\tUNAUTHORIZED_EXIT_CODE,\n\tNETWORK_ERROR_EXIT_CODE,\n\tINVALID_ARGUMENTS_EXIT_CODE,\n\tGENERAL_FAILURE_EXIT_CODE,\n] as const;\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 Schema.TaggedErrorClass<SyncError>()(\"SyncError\", {\n\tmessage: Schema.String,\n\texitCode: Schema.Literals(EXIT_CODES),\n\tcause: Schema.optionalKey(Schema.Defect()),\n}) {\n\tpublic constructor(exitCode: ExitCode, message: string, options: ErrorOptions = {}) {\n\t\tsuper(\n\t\t\toptions.cause === undefined\n\t\t\t\t? { message: message, exitCode: exitCode }\n\t\t\t\t: { message: message, exitCode: exitCode, cause: options.cause },\n\t\t);\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 type { ParsedBucket } from \"@oopst/parsers\";\nimport { Context, Effect, Layer, Schema, Stream } from \"effect\";\n\ntype ParserCollectionLogger = {\n\tinfo: (msg: string) => void;\n\terror: (msg: string) => void;\n};\n\ntype SelectedParserSource = {\n\tlabel: string;\n\tsource: ParserSource;\n};\n\ntype ParserCollectionOptions = {\n\tsources: readonly SelectedParserSource[];\n\tlogger: ParserCollectionLogger;\n\tcolor: boolean;\n};\n\ntype ParserSource = AsyncIterable<ParsedBucket> | Stream.Stream<ParsedBucket, unknown>;\n\ntype ParserCollectionShape = {\n\treadonly stream: (\n\t\toptions: ParserCollectionOptions,\n\t) => Effect.Effect<Stream.Stream<ParsedBucket, ParserCollectionError>>;\n};\n\nconst SCAN_PROGRESS_SESSION_STEP = 500;\n\nconst ParserCollectionErrorFields = {\n\tmessage: Schema.String,\n\tsource: Schema.String,\n\tcause: Schema.optionalKey(Schema.Defect()),\n};\n\nclass ParserCollectionError extends Schema.TaggedErrorClass<ParserCollectionError>()(\n\t\"ParserCollectionError\",\n\tParserCollectionErrorFields,\n) {}\n\nclass ParserCollection extends Context.Service<ParserCollection, ParserCollectionShape>()(\n\t\"@oopst/cli/ParserCollection\",\n) {}\n\nconst ParserCollectionLive: Layer.Layer<ParserCollection> = Layer.effect(\n\tParserCollection,\n\tEffect.sync(() =>\n\t\tParserCollection.of({\n\t\t\tstream: Effect.fn(\"ParserCollection.stream\")((options: ParserCollectionOptions) =>\n\t\t\t\tEffect.sync(() => {\n\t\t\t\t\tconst streams = options.sources.map((source) => parserSourceStream(source, options.logger, options.color));\n\t\t\t\t\tif (streams.length === 0) {\n\t\t\t\t\t\treturn Stream.empty;\n\t\t\t\t\t}\n\t\t\t\t\treturn Stream.mergeAll(streams, {\n\t\t\t\t\t\tconcurrency: streams.length,\n\t\t\t\t\t\tbufferSize: streams.length,\n\t\t\t\t\t}).pipe(Stream.mapError((cause) => toParserCollectionError(\"parser streams\", cause)));\n\t\t\t\t}),\n\t\t\t),\n\t\t}),\n\t),\n);\n\nfunction toParserCollectionError(source: string, cause: unknown): ParserCollectionError {\n\tif (isParserCollectionError(cause)) {\n\t\treturn cause;\n\t}\n\treturn new ParserCollectionError({\n\t\tsource: source,\n\t\tmessage: `${source} parser stream failed: ${errorMessage(cause)}`,\n\t\tcause: cause,\n\t});\n}\n\nfunction isParserCollectionError(cause: unknown): cause is ParserCollectionError {\n\treturn (\n\t\tcause instanceof ParserCollectionError ||\n\t\t(typeof cause === \"object\" &&\n\t\t\tcause !== null &&\n\t\t\t\"_tag\" in cause &&\n\t\t\t(cause as { readonly _tag: unknown })._tag === \"ParserCollectionError\")\n\t);\n}\n\nfunction errorMessage(cause: unknown): string {\n\treturn cause instanceof Error ? cause.message : \"unknown parser stream error\";\n}\n\nfunction parserSourceStream(\n\tselected: SelectedParserSource,\n\tlogger: ParserCollectionLogger,\n\tcolor: boolean,\n): Stream.Stream<ParsedBucket, ParserCollectionError> {\n\tconst sessionIds = new Set<string>();\n\tlet nextProgressAt = SCAN_PROGRESS_SESSION_STEP;\n\tconst sourceStream = parserSourceToStream(selected);\n\n\treturn Stream.fromEffectDrain(logInfo(logger, phase(`Scanning ${selected.label} sessions...`, color))).pipe(\n\t\tStream.concat(\n\t\t\tsourceStream.pipe(\n\t\t\t\tStream.mapEffect((bucket) =>\n\t\t\t\t\tEffect.sync(() => {\n\t\t\t\t\t\tfor (const id of bucket.sessionIds) {\n\t\t\t\t\t\t\tsessionIds.add(id);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (sessionIds.size >= nextProgressAt) {\n\t\t\t\t\t\t\tlogger.info(\n\t\t\t\t\t\t\t\tphase(`Scanning ${selected.label} sessions... ${localSessionText(sessionIds.size)} found`, color),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\twhile (nextProgressAt <= sessionIds.size) {\n\t\t\t\t\t\t\t\tnextProgressAt += SCAN_PROGRESS_SESSION_STEP;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn bucket;\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t\tStream.onEnd(\n\t\t\t\t\tlogInfo(\n\t\t\t\t\t\tlogger,\n\t\t\t\t\t\tphase(`Scanned ${selected.label} sessions: ${localSessionText(sessionIds.size)} found.`, color),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t),\n\t);\n}\n\nfunction parserSourceToStream(selected: SelectedParserSource): Stream.Stream<ParsedBucket, ParserCollectionError> {\n\tif (isParserStream(selected.source)) {\n\t\treturn selected.source.pipe(Stream.mapError((cause) => toParserCollectionError(selected.label, cause)));\n\t}\n\treturn Stream.fromAsyncIterable(selected.source, (cause) => toParserCollectionError(selected.label, cause));\n}\n\nfunction isParserStream(source: ParserSource): source is Stream.Stream<ParsedBucket, unknown> {\n\treturn Stream.isStream(source);\n}\n\nfunction logInfo(logger: ParserCollectionLogger, msg: string): Effect.Effect<void> {\n\treturn Effect.sync(() => logger.info(msg));\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 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 localSessionText(value: number): string {\n\treturn plural(value, \"local session\");\n}\n\nexport type { ParserCollectionLogger, ParserSource, SelectedParserSource };\nexport { isParserCollectionError, ParserCollection, ParserCollectionError, ParserCollectionLive };\n","import { dirname, join } from \"node:path\";\nimport { createInterface, type Interface } from \"node:readline/promises\";\nimport { NodeCrypto, NodeFileSystem } from \"@effect/platform-node\";\nimport { Context, Crypto, Effect, FileSystem, Layer, Schema } from \"effect\";\nimport { CliConfigError, DEFAULT_SERVER_URL, loadCliConfig, userConfigPath } from \"./config\";\nimport { CliCommandPlatformLive, CliCommandRunner, CliConsole, CliHost, CliProcess } from \"./services/command-platform\";\nimport { EXIT } from \"./sync/errors\";\n\nconst CRON_START_MARKER = \"# OopsT sync start\";\nconst CRON_END_MARKER = \"# OopsT sync end\";\nconst DEFAULT_CRON_PATHS = [\"/opt/homebrew/bin\", \"/usr/local/bin\", \"/usr/bin\", \"/bin\", \"/usr/sbin\", \"/sbin\"];\nconst DEFAULT_PACKAGE_NAME = \"@cookielab.io/oopst\";\nconst CONFIG_FILE_MODE = 0o600;\nconst LINE_SPLIT_PATTERN = /\\r?\\n/u;\n\ntype CommandResult = {\n\treadonly status: number | null;\n\treadonly stdout: string;\n\treadonly stderr: string;\n\treadonly error?: Error;\n};\n\ntype CommandRunner = (command: string, args: readonly string[], input?: string) => CommandResult;\n\ntype EffectCommandRunner = (\n\tcommand: string,\n\targs: readonly string[],\n\tinput?: string,\n) => Effect.Effect<CommandResult, SetupError>;\n\ntype SetupOptions = {\n\treadonly api?: string;\n\treadonly server?: string;\n\treadonly homeDir?: string;\n\treadonly hostName?: string;\n\treadonly input?: NodeJS.ReadableStream;\n\treadonly output?: NodeJS.WritableStream;\n\treadonly prompts?: SetupPrompts;\n\treadonly packageName?: string;\n\treadonly nodePath?: string;\n\treadonly randomMinute?: () => number;\n\treadonly commandRunner?: CommandRunner;\n};\n\ntype SetupPrompts = {\n\treadonly askWithDefault: (label: string, defaultValue: string) => Promise<string>;\n\treadonly askRequired: (label: string) => Promise<string>;\n\treadonly askYesNo: (label: string, defaultValue: boolean) => Promise<boolean>;\n};\n\ntype SetupResult = {\n\treadonly exitCode: number;\n\treadonly configPath: string;\n\treadonly cronInstalled: boolean;\n\treadonly cronMinute?: number;\n};\n\ntype SetupConfigFields = {\n\treadonly api: string;\n\treadonly token: string;\n\treadonly device: string;\n};\n\ntype ExistingSetupConfig = {\n\treadonly serverUrl: string;\n\treadonly device: string | undefined;\n};\n\ntype SetupErrorOptions = ErrorOptions & {\n\treadonly exitCode?: number;\n};\n\ntype CronInstallOptions = {\n\treadonly minute: number;\n\treadonly packageName: string;\n\treadonly npxPath: string;\n\treadonly nodePath: string;\n\treadonly logPath: string;\n};\n\ntype RunSetupEffectOptions = {\n\treadonly apiFlag: string | undefined;\n};\n\ntype SetupPromptServiceShape = {\n\treadonly askWithDefault: (label: string, defaultValue: string) => Effect.Effect<string, SetupError>;\n\treadonly askRequired: (label: string) => Effect.Effect<string, SetupError>;\n\treadonly askYesNo: (label: string, defaultValue: boolean) => Effect.Effect<boolean, SetupError>;\n};\n\ntype SetupConfigFileServiceShape = {\n\treadonly readExistingConfig: (\n\t\thomeDir: string,\n\t\thostName: string,\n\t) => Effect.Effect<ExistingSetupConfig, CliConfigError | SetupError>;\n\treadonly writeSetupConfig: (path: string, options: SetupConfigFields) => Effect.Effect<void, SetupError>;\n};\n\ntype SetupCronCommandServiceShape = {\n\treadonly findNpxPath: () => Effect.Effect<string, SetupError>;\n\treadonly installCronBlock: (managedBlock: string) => Effect.Effect<void, SetupError>;\n};\n\ntype SetupRandomServiceShape = {\n\treadonly cronMinute: () => Effect.Effect<number, SetupError>;\n};\n\ntype SetupOutputServiceShape = {\n\treadonly writeLine: (message: string) => Effect.Effect<void, SetupError>;\n};\n\ntype SetupEnvironmentServiceShape = {\n\treadonly homeDir: Effect.Effect<string, SetupError>;\n\treadonly hostName: Effect.Effect<string, SetupError>;\n\treadonly packageName: Effect.Effect<string>;\n\treadonly nodePath: Effect.Effect<string, SetupError>;\n};\n\nclass SetupError extends Schema.TaggedErrorClass<SetupError>()(\"SetupError\", {\n\tmessage: Schema.String,\n\texitCode: Schema.Number,\n\tcause: Schema.optionalKey(Schema.Defect()),\n}) {\n\tpublic constructor(message: string, options: SetupErrorOptions = {}) {\n\t\tconst exitCode = options.exitCode ?? EXIT.generalFailure;\n\t\tsuper(\n\t\t\toptions.cause === undefined\n\t\t\t\t? { message: message, exitCode: exitCode }\n\t\t\t\t: { message: message, exitCode: exitCode, cause: options.cause },\n\t\t);\n\t}\n}\n\nclass SetupPromptService extends Context.Service<SetupPromptService, SetupPromptServiceShape>()(\n\t\"@oopst/cli/SetupPromptService\",\n) {}\n\nclass SetupConfigFileService extends Context.Service<SetupConfigFileService, SetupConfigFileServiceShape>()(\n\t\"@oopst/cli/SetupConfigFileService\",\n) {}\n\nclass SetupCronCommandService extends Context.Service<SetupCronCommandService, SetupCronCommandServiceShape>()(\n\t\"@oopst/cli/SetupCronCommandService\",\n) {}\n\nclass SetupRandomService extends Context.Service<SetupRandomService, SetupRandomServiceShape>()(\n\t\"@oopst/cli/SetupRandomService\",\n) {}\n\nclass SetupOutputService extends Context.Service<SetupOutputService, SetupOutputServiceShape>()(\n\t\"@oopst/cli/SetupOutputService\",\n) {}\n\nclass SetupEnvironmentService extends Context.Service<SetupEnvironmentService, SetupEnvironmentServiceShape>()(\n\t\"@oopst/cli/SetupEnvironmentService\",\n) {}\n\nfunction errorMessage(cause: unknown): string {\n\treturn cause instanceof Error ? cause.message : String(cause);\n}\n\nfunction toSetupError(cause: unknown, fallbackMessage: string): SetupError {\n\tif (cause instanceof SetupError) {\n\t\treturn cause;\n\t}\n\tconst reason = errorMessage(cause);\n\treturn new SetupError(`${fallbackMessage}: ${reason}`, { cause: cause });\n}\n\nfunction toPromptError(cause: unknown): SetupError {\n\treturn toSetupError(cause, \"setup prompt failed\");\n}\n\nfunction writeLine(output: NodeJS.WritableStream, message: string): void {\n\toutput.write(`${message}\\n`);\n}\n\nfunction normalizeInput(value: string): string {\n\treturn value.trim();\n}\n\nfunction yamlString(value: string): string {\n\treturn JSON.stringify(value);\n}\n\nfunction formatSetupConfig(options: SetupConfigFields): string {\n\treturn [\n\t\t\"server:\",\n\t\t` api: ${yamlString(options.api)}`,\n\t\t` token: ${yamlString(options.token)}`,\n\t\t` device: ${yamlString(options.device)}`,\n\t\t\"\",\n\t].join(\"\\n\");\n}\n\nasync function askWithDefault(rl: Interface, label: string, defaultValue: string): Promise<string> {\n\tconst answer = normalizeInput(await rl.question(`${label} (${defaultValue}): `));\n\treturn answer.length > 0 ? answer : defaultValue;\n}\n\nasync function askRequired(rl: Interface, label: string): Promise<string> {\n\tconst answer = normalizeInput(await rl.question(`${label}: `));\n\tif (answer.length > 0) {\n\t\treturn answer;\n\t}\n\treturn askRequired(rl, label);\n}\n\nasync function askYesNo(rl: Interface, label: string, defaultValue: boolean): Promise<boolean> {\n\tconst suffix = defaultValue ? \"[Y/n]\" : \"[y/N]\";\n\tconst answer = normalizeInput(await rl.question(`${label} ${suffix}: `)).toLowerCase();\n\tif (answer.length === 0) {\n\t\treturn defaultValue;\n\t}\n\tif (answer === \"y\" || answer === \"yes\") {\n\t\treturn true;\n\t}\n\tif (answer === \"n\" || answer === \"no\") {\n\t\treturn false;\n\t}\n\treturn askYesNo(rl, label, defaultValue);\n}\n\nfunction readlinePrompts(rl: Interface): SetupPrompts {\n\treturn {\n\t\taskWithDefault: (label, defaultValue) => askWithDefault(rl, label, defaultValue),\n\t\taskRequired: (label) => askRequired(rl, label),\n\t\taskYesNo: (label, defaultValue) => askYesNo(rl, label, defaultValue),\n\t};\n}\n\nfunction makeSetupPromptService(prompts: SetupPrompts): SetupPromptServiceShape {\n\treturn {\n\t\taskWithDefault: Effect.fn(\"SetupPromptService.askWithDefault\")((label: string, defaultValue: string) =>\n\t\t\tEffect.tryPromise({\n\t\t\t\ttry: () => prompts.askWithDefault(label, defaultValue),\n\t\t\t\tcatch: toPromptError,\n\t\t\t}),\n\t\t),\n\t\taskRequired: Effect.fn(\"SetupPromptService.askRequired\")((label: string) =>\n\t\t\tEffect.tryPromise({\n\t\t\t\ttry: () => prompts.askRequired(label),\n\t\t\t\tcatch: toPromptError,\n\t\t\t}),\n\t\t),\n\t\taskYesNo: Effect.fn(\"SetupPromptService.askYesNo\")((label: string, defaultValue: boolean) =>\n\t\t\tEffect.tryPromise({\n\t\t\t\ttry: () => prompts.askYesNo(label, defaultValue),\n\t\t\t\tcatch: toPromptError,\n\t\t\t}),\n\t\t),\n\t};\n}\n\nfunction makeSetupPromptServiceLayer(options: {\n\treadonly input?: NodeJS.ReadableStream;\n\treadonly output?: NodeJS.WritableStream;\n\treadonly prompts?: SetupPrompts;\n}): Layer.Layer<SetupPromptService, never, CliConsole> {\n\tif (options.prompts !== undefined) {\n\t\treturn Layer.succeed(SetupPromptService, SetupPromptService.of(makeSetupPromptService(options.prompts)));\n\t}\n\n\treturn Layer.effect(\n\t\tSetupPromptService,\n\t\tEffect.gen(function* () {\n\t\t\tconst cliConsole = yield* CliConsole;\n\t\t\tconst rl = yield* Effect.acquireRelease(\n\t\t\t\tEffect.sync(() =>\n\t\t\t\t\tcreateInterface({\n\t\t\t\t\t\tinput: options.input ?? cliConsole.stdin,\n\t\t\t\t\t\toutput: options.output ?? cliConsole.stdout,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t\t(readlineInterface) => Effect.sync(() => readlineInterface.close()),\n\t\t\t);\n\t\t\treturn SetupPromptService.of(makeSetupPromptService(readlinePrompts(rl)));\n\t\t}),\n\t);\n}\n\nconst SetupConfigFileServiceLive: Layer.Layer<SetupConfigFileService, never, FileSystem.FileSystem> = Layer.effect(\n\tSetupConfigFileService,\n\tEffect.gen(function* () {\n\t\tconst fs = yield* FileSystem.FileSystem;\n\t\treturn SetupConfigFileService.of({\n\t\t\treadExistingConfig: Effect.fn(\"SetupConfigFileService.readExistingConfig\")(function* (\n\t\t\t\thomeDir: string,\n\t\t\t\tfallbackHostName: string,\n\t\t\t) {\n\t\t\t\tconst path = userConfigPath(homeDir);\n\t\t\t\tconst exists = yield* fs\n\t\t\t\t\t.exists(path)\n\t\t\t\t\t.pipe(Effect.mapError((err) => new SetupError(`failed to inspect existing ${path}: ${errorMessage(err)}`)));\n\t\t\t\tif (!exists) {\n\t\t\t\t\treturn { serverUrl: DEFAULT_SERVER_URL, device: fallbackHostName };\n\t\t\t\t}\n\n\t\t\t\tconst configFileText = yield* fs\n\t\t\t\t\t.readFileString(path, \"utf8\")\n\t\t\t\t\t.pipe(\n\t\t\t\t\t\tEffect.mapError(\n\t\t\t\t\t\t\t(err) => new SetupError(`failed to read existing ${path}: ${errorMessage(err)}`, { cause: err }),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\tconst config = yield* Effect.try({\n\t\t\t\t\ttry: () =>\n\t\t\t\t\t\tloadCliConfig({\n\t\t\t\t\t\t\tconfigFileText: configFileText,\n\t\t\t\t\t\t\tconfigPath: path,\n\t\t\t\t\t\t\tenv: {},\n\t\t\t\t\t\t\thomeDir: homeDir,\n\t\t\t\t\t\t\thostName: fallbackHostName,\n\t\t\t\t\t\t}),\n\t\t\t\t\tcatch: (err) => {\n\t\t\t\t\t\tif (err instanceof CliConfigError) {\n\t\t\t\t\t\t\treturn err;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn new SetupError(`failed to read existing ${path}: ${errorMessage(err)}`, { cause: err });\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\treturn { serverUrl: config.serverUrl, device: config.device ?? fallbackHostName };\n\t\t\t}),\n\t\t\twriteSetupConfig: Effect.fn(\"SetupConfigFileService.writeSetupConfig\")(function* (\n\t\t\t\tpath: string,\n\t\t\t\toptions: SetupConfigFields,\n\t\t\t) {\n\t\t\t\tconst writeError = (err: unknown) =>\n\t\t\t\t\tnew SetupError(`failed to write ${path}: ${errorMessage(err)}`, { cause: err });\n\t\t\t\tyield* fs\n\t\t\t\t\t.writeFileString(path, formatSetupConfig(options), { mode: CONFIG_FILE_MODE })\n\t\t\t\t\t.pipe(Effect.mapError(writeError));\n\t\t\t\tyield* fs.chmod(path, CONFIG_FILE_MODE).pipe(Effect.mapError(writeError));\n\t\t\t}),\n\t\t});\n\t}),\n);\n\nfunction shellQuote(value: string): string {\n\treturn `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n\nfunction unique(values: readonly string[]): string[] {\n\treturn [...new Set(values.filter((value) => value.length > 0))];\n}\n\nfunction buildCronPath(options: { readonly npxPath: string; readonly nodePath: string }): string {\n\treturn unique([dirname(options.npxPath), dirname(options.nodePath), ...DEFAULT_CRON_PATHS]).join(\":\");\n}\n\nfunction buildCronBlock(options: CronInstallOptions): string {\n\tconst path = buildCronPath({ npxPath: options.npxPath, nodePath: options.nodePath });\n\tconst command = [\n\t\t`PATH=${shellQuote(path)}`,\n\t\tshellQuote(options.npxPath),\n\t\t\"-y\",\n\t\tshellQuote(options.packageName),\n\t\t\"sync\",\n\t\t\">>\",\n\t\tshellQuote(options.logPath),\n\t\t\"2>&1\",\n\t].join(\" \");\n\n\treturn [CRON_START_MARKER, `${options.minute} * * * * ${command}`, CRON_END_MARKER].join(\"\\n\");\n}\n\nfunction escapeRegex(value: string): string {\n\treturn value.replace(/[.*+?^${}()|[\\]\\\\]/gu, \"\\\\$&\");\n}\n\nfunction replaceManagedCronBlock(existingCrontab: string, managedBlock: string): string {\n\tconst blockPattern = new RegExp(\n\t\t`(?:^|\\\\n)${escapeRegex(CRON_START_MARKER)}\\\\n[\\\\s\\\\S]*?\\\\n${escapeRegex(CRON_END_MARKER)}\\\\n?`,\n\t\t\"u\",\n\t);\n\tconst withoutManagedBlock = existingCrontab.replace(blockPattern, \"\\n\").trimEnd();\n\treturn withoutManagedBlock.length > 0 ? `${withoutManagedBlock}\\n${managedBlock}\\n` : `${managedBlock}\\n`;\n}\n\nfunction commandFailureOptions(result: CommandResult): SetupErrorOptions {\n\treturn result.error === undefined ? {} : { cause: result.error };\n}\n\nfunction commandFailureReason(result: CommandResult, fallback: string): string {\n\treturn result.error?.message ?? result.stderr.trim() ?? fallback;\n}\n\nfunction existingCrontabFromResult(result: CommandResult): Effect.Effect<string, SetupError> {\n\tif (result.status === 0) {\n\t\treturn Effect.succeed(result.stdout);\n\t}\n\tif (result.stderr.toLowerCase().includes(\"no crontab\")) {\n\t\treturn Effect.succeed(\"\");\n\t}\n\treturn Effect.fail(\n\t\tnew SetupError(\n\t\t\t`failed to read existing crontab: ${commandFailureReason(result, \"crontab -l failed\")}`,\n\t\t\tcommandFailureOptions(result),\n\t\t),\n\t);\n}\n\nfunction injectedCommandRunner(commandRunner: CommandRunner): EffectCommandRunner {\n\treturn (command, args, input) =>\n\t\tEffect.try({\n\t\t\ttry: () => commandRunner(command, args, input),\n\t\t\tcatch: (err) => toSetupError(err, \"setup command failed\"),\n\t\t});\n}\n\nfunction makeSetupCronCommandService(runCommand: EffectCommandRunner): SetupCronCommandServiceShape {\n\treturn {\n\t\tfindNpxPath: Effect.fn(\"SetupCronCommandService.findNpxPath\")(function* () {\n\t\t\tconst result = yield* runCommand(\"/bin/sh\", [\"-lc\", \"command -v npx\"]);\n\t\t\tconst npxPath = result.stdout.trim().split(LINE_SPLIT_PATTERN)[0] ?? \"\";\n\t\t\tif (result.status === 0 && npxPath.length > 0) {\n\t\t\t\treturn npxPath;\n\t\t\t}\n\t\t\tconst reason = commandFailureReason(result, \"npx was not found\");\n\t\t\treturn yield* Effect.fail(new SetupError(`failed to set up cron: ${reason}`, commandFailureOptions(result)));\n\t\t}),\n\t\tinstallCronBlock: Effect.fn(\"SetupCronCommandService.installCronBlock\")(function* (managedBlock: string) {\n\t\t\tconst existingCrontabResult = yield* runCommand(\"crontab\", [\"-l\"]);\n\t\t\tconst existingCrontab = yield* existingCrontabFromResult(existingCrontabResult);\n\t\t\tconst updatedCrontab = replaceManagedCronBlock(existingCrontab, managedBlock);\n\t\t\tconst updateResult = yield* runCommand(\"crontab\", [\"-\"], updatedCrontab);\n\t\t\tif (updateResult.status !== 0) {\n\t\t\t\tconst reason = commandFailureReason(updateResult, \"crontab update failed\");\n\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\tnew SetupError(`failed to install cron entry: ${reason}`, commandFailureOptions(updateResult)),\n\t\t\t\t);\n\t\t\t}\n\t\t}),\n\t};\n}\n\nfunction makeSetupCronCommandServiceLayer(\n\tcommandRunner: CommandRunner | undefined,\n): Layer.Layer<SetupCronCommandService, never, CliCommandRunner> {\n\tif (commandRunner !== undefined) {\n\t\treturn Layer.succeed(\n\t\t\tSetupCronCommandService,\n\t\t\tSetupCronCommandService.of(makeSetupCronCommandService(injectedCommandRunner(commandRunner))),\n\t\t);\n\t}\n\n\treturn Layer.effect(\n\t\tSetupCronCommandService,\n\t\tEffect.gen(function* () {\n\t\t\tconst cliCommandRunner = yield* CliCommandRunner;\n\t\t\treturn SetupCronCommandService.of(makeSetupCronCommandService(cliCommandRunner.run));\n\t\t}),\n\t);\n}\n\nfunction injectedSetupRandomService(randomMinute: () => number): SetupRandomServiceShape {\n\treturn {\n\t\tcronMinute: Effect.fn(\"SetupRandomService.cronMinute\")(() =>\n\t\t\tEffect.try({\n\t\t\t\ttry: randomMinute,\n\t\t\t\tcatch: (err) => toSetupError(err, \"cron minute selection failed\"),\n\t\t\t}),\n\t\t),\n\t};\n}\n\nconst SetupRandomServiceLive: Layer.Layer<SetupRandomService, never, Crypto.Crypto> = Layer.effect(\n\tSetupRandomService,\n\tEffect.gen(function* () {\n\t\tconst crypto = yield* Crypto.Crypto;\n\t\treturn SetupRandomService.of({\n\t\t\tcronMinute: Effect.fn(\"SetupRandomService.cronMinute\")(() =>\n\t\t\t\tcrypto\n\t\t\t\t\t.randomIntBetween(0, 60, { halfOpen: true })\n\t\t\t\t\t.pipe(Effect.catchDefect((err) => Effect.fail(toSetupError(err, \"cron minute selection failed\")))),\n\t\t\t),\n\t\t});\n\t}),\n);\n\nfunction makeSetupRandomServiceLayer(\n\trandomMinute: (() => number) | undefined,\n): Layer.Layer<SetupRandomService, never, Crypto.Crypto> {\n\tif (randomMinute !== undefined) {\n\t\treturn Layer.succeed(SetupRandomService, SetupRandomService.of(injectedSetupRandomService(randomMinute)));\n\t}\n\n\treturn SetupRandomServiceLive;\n}\n\nfunction makeSetupOutputServiceLayer(\n\toutput: NodeJS.WritableStream | undefined,\n): Layer.Layer<SetupOutputService, never, CliConsole> {\n\treturn Layer.effect(\n\t\tSetupOutputService,\n\t\tEffect.gen(function* () {\n\t\t\tconst console = yield* CliConsole;\n\t\t\tconst stream = output ?? console.stdout;\n\t\t\treturn SetupOutputService.of({\n\t\t\t\twriteLine: Effect.fn(\"SetupOutputService.writeLine\")((message: string) =>\n\t\t\t\t\tEffect.try({\n\t\t\t\t\t\ttry: () => writeLine(stream, message),\n\t\t\t\t\t\tcatch: (err) => toSetupError(err, \"setup output failed\"),\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t});\n\t\t}),\n\t);\n}\n\nfunction makeSetupEnvironmentServiceLayer(options: {\n\treadonly homeDir?: string;\n\treadonly hostName?: string;\n\treadonly packageName?: string;\n\treadonly nodePath?: string;\n}): Layer.Layer<SetupEnvironmentService, never, CliHost | CliProcess> {\n\treturn Layer.effect(\n\t\tSetupEnvironmentService,\n\t\tEffect.gen(function* () {\n\t\t\tconst host = yield* CliHost;\n\t\t\tconst cliProcess = yield* CliProcess;\n\t\t\treturn SetupEnvironmentService.of({\n\t\t\t\thomeDir: Effect.fn(\"SetupEnvironmentService.homeDir\")(() =>\n\t\t\t\t\toptions.homeDir === undefined\n\t\t\t\t\t\t? host.homeDir.pipe(Effect.mapError((err) => toSetupError(err, \"home directory lookup failed\")))\n\t\t\t\t\t\t: Effect.succeed(options.homeDir),\n\t\t\t\t)(),\n\t\t\t\thostName: Effect.fn(\"SetupEnvironmentService.hostName\")(() =>\n\t\t\t\t\toptions.hostName === undefined\n\t\t\t\t\t\t? host.hostName.pipe(Effect.mapError((err) => toSetupError(err, \"host name lookup failed\")))\n\t\t\t\t\t\t: Effect.succeed(options.hostName),\n\t\t\t\t)(),\n\t\t\t\tpackageName: Effect.fn(\"SetupEnvironmentService.packageName\")(() =>\n\t\t\t\t\tEffect.succeed(options.packageName ?? DEFAULT_PACKAGE_NAME),\n\t\t\t\t)(),\n\t\t\t\tnodePath: Effect.fn(\"SetupEnvironmentService.nodePath\")(() =>\n\t\t\t\t\toptions.nodePath === undefined\n\t\t\t\t\t\t? cliProcess.execPath.pipe(Effect.mapError((err) => toSetupError(err, \"node path lookup failed\")))\n\t\t\t\t\t\t: Effect.succeed(options.nodePath),\n\t\t\t\t)(),\n\t\t\t});\n\t\t}),\n\t);\n}\n\nconst installSetupCronEffect = Effect.fn(\"installSetupCronEffect\")(function* (options: {\n\treadonly packageName: string;\n\treadonly nodePath: string;\n\treadonly homeDir: string;\n}) {\n\tconst cronCommands = yield* SetupCronCommandService;\n\tconst random = yield* SetupRandomService;\n\tconst npxPath = yield* cronCommands.findNpxPath();\n\tconst minute = yield* random.cronMinute();\n\tconst logPath = join(options.homeDir, \".oopst-sync.log\");\n\tconst managedBlock = buildCronBlock({\n\t\tminute: minute,\n\t\tpackageName: options.packageName,\n\t\tnpxPath: npxPath,\n\t\tnodePath: options.nodePath,\n\t\tlogPath: logPath,\n\t});\n\tyield* cronCommands.installCronBlock(managedBlock);\n\treturn { minute: minute, npxPath: npxPath };\n});\n\nconst runSetupEffect = Effect.fn(\"runSetupEffect\")(function* (options: RunSetupEffectOptions) {\n\tconst environment = yield* SetupEnvironmentService;\n\tconst prompts = yield* SetupPromptService;\n\tconst configFiles = yield* SetupConfigFileService;\n\tconst output = yield* SetupOutputService;\n\tconst homeDir = yield* environment.homeDir;\n\tconst hostName = yield* environment.hostName;\n\tconst packageName = yield* environment.packageName;\n\tconst nodePath = yield* environment.nodePath;\n\tconst configPath = userConfigPath(homeDir);\n\tconst defaults = yield* configFiles.readExistingConfig(homeDir, hostName);\n\tconst api =\n\t\toptions.apiFlag === undefined\n\t\t\t? yield* prompts.askWithDefault(\"Server URL\", defaults.serverUrl)\n\t\t\t: normalizeInput(options.apiFlag);\n\n\tif (api.length === 0) {\n\t\treturn yield* Effect.fail(\n\t\t\tnew SetupError(\"error: --api must be a non-empty string\", { exitCode: EXIT.invalidArguments }),\n\t\t);\n\t}\n\n\tconst device = yield* prompts.askWithDefault(\"Device name\", defaults.device ?? hostName);\n\tconst token = yield* prompts.askRequired(\"Token\");\n\tconst shouldInstallCron = yield* prompts.askYesNo(\"Setup cron?\", false);\n\n\tyield* configFiles.writeSetupConfig(configPath, { api: api, token: token, device: device });\n\tyield* output.writeLine(`Wrote ${configPath}`);\n\n\tif (!shouldInstallCron) {\n\t\tyield* output.writeLine(\"Cron setup skipped.\");\n\t\treturn { exitCode: EXIT.success, configPath: configPath, cronInstalled: false };\n\t}\n\n\tconst { minute, npxPath } = yield* installSetupCronEffect({\n\t\tpackageName: packageName,\n\t\tnodePath: nodePath,\n\t\thomeDir: homeDir,\n\t});\n\tyield* output.writeLine(`Installed cron entry for minute ${minute} of every hour.`);\n\tyield* output.writeLine(`Cron uses ${npxPath} with an explicit PATH so it does not depend on your login shell.`);\n\treturn { exitCode: EXIT.success, configPath: configPath, cronInstalled: true, cronMinute: minute };\n});\n\nfunction runSetup(options: SetupOptions = {}): Promise<SetupResult> {\n\tconst apiFlag = options.api ?? options.server;\n\tconst setupServicesLayer = Layer.mergeAll(\n\t\tmakeSetupEnvironmentServiceLayer({\n\t\t\thomeDir: options.homeDir,\n\t\t\thostName: options.hostName,\n\t\t\tpackageName: options.packageName,\n\t\t\tnodePath: options.nodePath,\n\t\t}),\n\t\tmakeSetupPromptServiceLayer({ input: options.input, output: options.output, prompts: options.prompts }),\n\t\tSetupConfigFileServiceLive,\n\t\tmakeSetupCronCommandServiceLayer(options.commandRunner),\n\t\tmakeSetupRandomServiceLayer(options.randomMinute),\n\t\tmakeSetupOutputServiceLayer(options.output),\n\t);\n\tconst setupPlatformLayer = Layer.mergeAll(CliCommandPlatformLive, NodeFileSystem.layer, NodeCrypto.layer);\n\tconst setupLayer = setupServicesLayer.pipe(Layer.provide(setupPlatformLayer));\n\n\treturn Effect.runPromise(runSetupEffect({ apiFlag: apiFlag }).pipe(Effect.provide(setupLayer)));\n}\n\nexport type { CommandRunner, SetupOptions, SetupPrompts, SetupResult };\nexport {\n\tbuildCronBlock,\n\tCRON_END_MARKER,\n\tCRON_START_MARKER,\n\tformatSetupConfig,\n\treplaceManagedCronBlock,\n\trunSetup,\n\tSetupError,\n};\n","import { dirname, isAbsolute, join, matchesGlob, relative } from \"node:path\";\nimport {\n\ttype FileWalker,\n\tFileWalkerLive,\n\tHermesSqliteLive,\n\tOpenCodeIoLive,\n\ttype ParsedBucket,\n\tparseClaudeStream,\n\tparseCodexStream,\n\tparseHermesStream,\n\tparseOpenCodeStream,\n\tparsePiStream,\n} from \"@oopst/parsers\";\nimport { Effect, Layer, Stream } from \"effect\";\nimport type { CliConfigError, 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\treadonly env?: CliEnv;\n};\n\ntype ParserSourcePlan = {\n\treadonly anySourceExisted: boolean;\n\treadonly codexSessionsSourceExisted: boolean;\n\treadonly codexArchivedSourceExisted: boolean;\n\treadonly claudeSourceExisted: boolean;\n\treadonly piSourceExisted: boolean;\n\treadonly hermesSourceExisted: boolean;\n\treadonly opencodeSourceExisted: 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 GLOB_PATTERN = /[*?[\\]{}]/u;\nconst HermesParserLive = Layer.mergeAll(FileWalkerLive, HermesSqliteLive);\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 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, CliConfigError, ParserSources> {\n\treturn Effect.gen(function* () {\n\t\tconst sources = yield* ParserSources;\n\t\tconst home = yield* sources.homeDir;\n\t\tconst env = options.env ?? (yield* sources.cliEnv);\n\t\tconst codexSessionsRoot = join(home, \".codex\", \"sessions\");\n\t\tconst codexArchivedRoot = join(home, \".codex\", \"archived_sessions\");\n\t\tconst codexSessionsExists = yield* sources.codexSourceExists(codexSessionsRoot);\n\t\tconst codexArchivedExists = yield* sources.codexSourceExists(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.claudeSourceExists(claudeRoot);\n\n\t\tconst piRoot = sessionsRoot(env.piAgentDir, env.piSessionDir, join(home, \".pi\", \"agent\"));\n\t\tconst piExists = yield* sources.piSourceExists(piRoot);\n\n\t\tconst hermesSourceRoot = hermesRoot(home, env);\n\t\tconst hermesExists = yield* sources.hermesSourceExists(hermesSourceRoot);\n\n\t\tconst opencodeSourceRoot = openCodeRoot(home, env);\n\t\tconst opencodeExists = yield* sources.openCodeSourceExists(opencodeSourceRoot);\n\t\tconst exclude = options.exclude ?? env.exclude;\n\n\t\treturn {\n\t\t\tanySourceExisted:\n\t\t\t\tcodexSessionsExists || codexArchivedExists || claudeExists || piExists || hermesExists || opencodeExists,\n\t\t\tcodexSessionsSourceExisted: codexSessionsExists,\n\t\t\tcodexArchivedSourceExisted: codexArchivedExists,\n\t\t\tclaudeSourceExisted: claudeExists,\n\t\t\tpiSourceExisted: piExists,\n\t\t\thermesSourceExisted: hermesExists,\n\t\t\topencodeSourceExisted: 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 provideFileWalker<E>(stream: Stream.Stream<ParsedBucket, E, FileWalker>): Stream.Stream<ParsedBucket, E> {\n\treturn stream.pipe(Stream.provide(FileWalkerLive));\n}\n\nfunction concatParserStreams(\n\tstreams: readonly Stream.Stream<ParsedBucket, unknown>[],\n): Stream.Stream<ParsedBucket, unknown> {\n\tlet stream: Stream.Stream<ParsedBucket, unknown> = Stream.empty;\n\tfor (const next of streams) {\n\t\tstream = stream.pipe(Stream.concat(next));\n\t}\n\treturn stream;\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\tconst codexStreams: Stream.Stream<ParsedBucket, unknown>[] = [];\n\t\tif (plan.codexSessionsSourceExisted) {\n\t\t\tcodexStreams.push(\n\t\t\t\tprovideFileWalker(\n\t\t\t\t\tparseCodexStream({ cutoff: ctx.cutoff, excludePath: excludePath, root: plan.codexSessionsRoot }),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tif (plan.codexArchivedSourceExisted) {\n\t\t\tcodexStreams.push(\n\t\t\t\tprovideFileWalker(\n\t\t\t\t\tparseCodexStream({ cutoff: ctx.cutoff, excludePath: excludePath, root: plan.codexArchivedRoot }),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\tanySourceExisted: plan.anySourceExisted,\n\t\t\tcodex: concatParserStreams(codexStreams),\n\t\t\tclaudeCode: plan.claudeSourceExisted\n\t\t\t\t? provideFileWalker(parseClaudeStream({ cutoff: ctx.cutoff, excludePath: excludePath, root: plan.claudeRoot }))\n\t\t\t\t: Stream.empty,\n\t\t\tpi: plan.piSourceExisted\n\t\t\t\t? provideFileWalker(parsePiStream({ cutoff: ctx.cutoff, excludePath: excludePath, root: plan.piRoot }))\n\t\t\t\t: Stream.empty,\n\t\t\thermes: plan.hermesSourceExisted\n\t\t\t\t? parseHermesStream({ cutoff: ctx.cutoff, excludePath: excludePath, root: plan.hermesRoot }).pipe(\n\t\t\t\t\t\tStream.provide(HermesParserLive),\n\t\t\t\t\t)\n\t\t\t\t: Stream.empty,\n\t\t\topencode: plan.opencodeSourceExisted\n\t\t\t\t? parseOpenCodeStream({ cutoff: ctx.cutoff, excludePath: excludePath, root: plan.opencodeRoot }).pipe(\n\t\t\t\t\t\tStream.provide(OpenCodeIoLive),\n\t\t\t\t\t)\n\t\t\t\t: Stream.empty,\n\t\t};\n\t};\n}\n\nfunction buildRealParserFactoryEffect(\n\toptions: BuildRealParserFactoryOptions = {},\n): Effect.Effect<(ctx: ParserFactoryContext) => RealParserResult, CliConfigError, ParserSources> {\n\treturn Effect.map(resolveParserSourcePlanEffect(options), buildFactoryFromPlan);\n}\n\nfunction buildRealParserFactory(\n\toptions: BuildRealParserFactoryOptions = {},\n): Promise<(ctx: ParserFactoryContext) => RealParserResult> {\n\treturn buildRealParserFactoryEffect(options).pipe(Effect.provide(ParserSourcesLive), Effect.runPromise);\n}\n\nexport type { BuildRealParserFactoryOptions, ParserSourcePlan, RealParserResult };\nexport { buildRealParserFactory, buildRealParserFactoryEffect, createExcludeMatcher, resolveParserSourcePlanEffect };\n","import { basename, dirname } from \"node:path\";\nimport { Effect, Stream } from \"effect\";\nimport { resolveClaudeRoot } from \"../config\";\nimport { type FileWalker, type FileWalkerFilesystemError, FileWalkerLive } from \"../effect/file-walker\";\nimport type { LocalPathFilter, Logger, ParsedBucket, ParserSourceReadError } from \"../types\";\nimport { pathKindEffectStrict, walkStreamStrict } from \"../walk\";\nimport { silentLogger, stderrLogger } from \"../warnings\";\nimport { bucketizeClaudeFileStream } 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. Strict Effect/Stream entrypoints default to `silentLogger`. */\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\ntype ParseClaudeError = FileWalkerFilesystemError | ParserSourceReadError;\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\nfunction bucketizeClaudeSourcesStream<E, R>(\n\tfiles: Stream.Stream<string, E, R>,\n\tlogger: Logger,\n\toptions: { readonly cutoff: Date; readonly excludePath?: LocalPathFilter },\n): Stream.Stream<ParsedBucket, E | ParserSourceReadError, R> {\n\treturn Stream.suspend(() => {\n\t\tconst seenTuples = new Set<string>();\n\t\treturn files.pipe(\n\t\t\tStream.flatMap(\n\t\t\t\t(file) => {\n\t\t\t\t\tconst sessionId = sourceSessionId(file);\n\t\t\t\t\treturn bucketizeClaudeFileStream(file, logger, {\n\t\t\t\t\t\tcutoff: options.cutoff,\n\t\t\t\t\t\texcludePath: options.excludePath,\n\t\t\t\t\t\tsessionId: sessionId,\n\t\t\t\t\t\tseenTuples: seenTuples,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\t{ concurrency: 1 },\n\t\t\t),\n\t\t);\n\t});\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 */\nconst parseClaudeEffect: (\n\topts: ParseClaudeOptions,\n) => Effect.Effect<readonly ParsedBucket[], ParseClaudeError, FileWalker> = Effect.fn(\"ClaudeParser.parseClaudeEffect\")(\n\t(opts: ParseClaudeOptions) => Stream.runCollect(parseClaudeStream(opts)),\n);\n\nconst parseClaudeStream: (opts: ParseClaudeOptions) => Stream.Stream<ParsedBucket, ParseClaudeError, FileWalker> = (\n\topts: ParseClaudeOptions,\n) =>\n\tStream.unwrap(\n\t\tEffect.gen(function* () {\n\t\t\tconst logger = opts.logger ?? silentLogger;\n\t\t\tconst root = opts.root ?? resolveClaudeRoot();\n\n\t\t\tif ((yield* pathKindEffectStrict(root)) === \"file\") {\n\t\t\t\treturn bucketizeClaudeFileStream(root, logger, {\n\t\t\t\t\tcutoff: opts.cutoff,\n\t\t\t\t\texcludePath: opts.excludePath,\n\t\t\t\t\tsessionId: sourceSessionId(root),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn bucketizeClaudeSourcesStream(walkStreamStrict(root, opts.cutoff), logger, {\n\t\t\t\tcutoff: opts.cutoff,\n\t\t\t\texcludePath: opts.excludePath,\n\t\t\t});\n\t\t}),\n\t);\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 ?? stderrLogger;\n\tconst stream = parseClaudeStream({ ...opts, logger: logger }).pipe(\n\t\tStream.catchTag(\"FileWalkerFilesystemError\", () => Stream.empty),\n\t\tStream.catchTag(\"ParserSourceReadError\", () =>\n\t\t\tStream.fromEffectDrain(\n\t\t\t\tEffect.sync(() => logger.warn(\"failed to parse claude source\", { root: opts.root ?? resolveClaudeRoot() })),\n\t\t\t),\n\t\t),\n\t\tStream.provide(FileWalkerLive),\n\t);\n\tyield* Stream.toAsyncIterable(stream);\n}\n\nexport type { ParseClaudeError, ParseClaudeOptions };\nexport { parseClaude, parseClaudeEffect, parseClaudeStream };\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 { join } from \"node:path\";\nimport { NodeFileSystem } from \"@effect/platform-node\";\nimport { Context, Effect, FileSystem, Layer, Option, Schema, Stream } from \"effect\";\n\ntype FileWalkerOperation = \"readdir\" | \"stat\";\ntype FileWalkerPathKind = \"file\" | \"directory\" | \"missing\";\n\nclass FileWalkerFilesystemError extends Schema.TaggedErrorClass<FileWalkerFilesystemError>()(\n\t\"FileWalkerFilesystemError\",\n\t{\n\t\tmessage: Schema.String,\n\t\toperation: Schema.Literals([\"readdir\", \"stat\"]),\n\t\tpath: Schema.String,\n\t\tcause: Schema.optionalKey(Schema.Defect()),\n\t},\n) {}\n\ntype FileWalkerShape = {\n\treadonly pathKind: (path: string) => Effect.Effect<FileWalkerPathKind, FileWalkerFilesystemError>;\n\treadonly walk: (root: string, cutoff: Date) => Effect.Effect<AsyncIterable<string>, FileWalkerFilesystemError>;\n\treadonly walkStream: (root: string, cutoff: Date) => Stream.Stream<string, FileWalkerFilesystemError>;\n\treadonly walkMany: (\n\t\troots: readonly string[],\n\t\tcutoff: Date,\n\t) => Effect.Effect<AsyncIterable<string>, FileWalkerFilesystemError>;\n\treadonly walkManyStream: (roots: readonly string[], cutoff: Date) => Stream.Stream<string, FileWalkerFilesystemError>;\n};\n\nclass FileWalker extends Context.Service<FileWalker, FileWalkerShape>()(\"@oopst/parsers/FileWalker\") {}\n\nconst toFileWalkerFilesystemError =\n\t(operation: FileWalkerOperation, path: string) =>\n\t(error: unknown): FileWalkerFilesystemError =>\n\t\tmakeFileWalkerFilesystemError(operation, path, error);\n\nconst makeFileWalkerFilesystemError = (\n\toperation: FileWalkerOperation,\n\tpath: string,\n\terror: unknown,\n): FileWalkerFilesystemError =>\n\tnew FileWalkerFilesystemError({\n\t\tmessage: `FileWalker.${operation} failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\toperation: operation,\n\t\tpath: path,\n\t\tcause: error,\n\t});\n\nconst readDir = (\n\tfs: FileSystem.FileSystem,\n\tpath: string,\n): Effect.Effect<readonly string[], FileWalkerFilesystemError> =>\n\tfs.readDirectory(path).pipe(Effect.mapError(toFileWalkerFilesystemError(\"readdir\", path)));\n\nconst readStat = (\n\tfs: FileSystem.FileSystem,\n\tpath: string,\n): Effect.Effect<FileSystem.File.Info, FileWalkerFilesystemError> =>\n\tfs.stat(path).pipe(Effect.mapError(toFileWalkerFilesystemError(\"stat\", path)));\n\nconst isModifiedAtOrAfter = (info: FileSystem.File.Info, cutoff: Date): boolean =>\n\tOption.match(info.mtime, {\n\t\tonNone: () => false,\n\t\tonSome: (mtime) => mtime.getTime() >= cutoff.getTime(),\n\t});\n\nconst makePathKind = (fs: FileSystem.FileSystem): FileWalkerShape[\"pathKind\"] =>\n\tEffect.fn(\"FileWalker.pathKind\")(function* (path: string) {\n\t\tconst info = yield* readStat(fs, path);\n\t\tif (info.type === \"File\") {\n\t\t\treturn \"file\" as const;\n\t\t}\n\t\tif (info.type === \"Directory\") {\n\t\t\treturn \"directory\" as const;\n\t\t}\n\t\treturn \"missing\" as const;\n\t});\n\nconst toAsyncIterable = (paths: readonly string[]): AsyncIterable<string> =>\n\tStream.toAsyncIterable(Stream.fromIterable(paths));\n\nconst streamJsonlFiles: (\n\tfs: FileSystem.FileSystem,\n\troot: string,\n\tcutoff: Date,\n) => Stream.Stream<string, FileWalkerFilesystemError> = (fs: FileSystem.FileSystem, root: string, cutoff: Date) =>\n\tStream.suspend(() =>\n\t\tStream.fromIterableEffect(\n\t\t\treadDir(fs, root).pipe(Effect.catchTag(\"FileWalkerFilesystemError\", () => Effect.succeed([]))),\n\t\t).pipe(\n\t\t\tStream.flatMap((entry) => {\n\t\t\t\tconst full = join(root, entry);\n\t\t\t\treturn Stream.fromEffect(readStat(fs, full)).pipe(\n\t\t\t\t\tStream.flatMap((info) => {\n\t\t\t\t\t\tif (info.type === \"Directory\") {\n\t\t\t\t\t\t\treturn streamJsonlFiles(fs, full, cutoff);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (info.type !== \"File\") {\n\t\t\t\t\t\t\treturn Stream.empty;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!entry.endsWith(\".jsonl\")) {\n\t\t\t\t\t\t\treturn Stream.empty;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!isModifiedAtOrAfter(info, cutoff)) {\n\t\t\t\t\t\t\treturn Stream.empty;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn Stream.succeed(full);\n\t\t\t\t\t}),\n\t\t\t\t\tStream.catchTag(\"FileWalkerFilesystemError\", () => Stream.empty),\n\t\t\t\t);\n\t\t\t}),\n\t\t),\n\t);\n\nconst makeWalkManyStream =\n\t(fs: FileSystem.FileSystem) =>\n\t(roots: readonly string[], cutoff: Date): Stream.Stream<string, FileWalkerFilesystemError> =>\n\t\tStream.fromIterable(roots).pipe(Stream.flatMap((root) => streamJsonlFiles(fs, root, cutoff)));\n\nconst makeWalkMany = (fs: FileSystem.FileSystem): FileWalkerShape[\"walkMany\"] =>\n\tEffect.fn(\"FileWalker.walkMany\")(function* (roots: readonly string[], cutoff: Date) {\n\t\tconst paths = yield* Stream.runCollect(makeWalkManyStream(fs)(roots, cutoff));\n\t\treturn toAsyncIterable(paths);\n\t});\n\nconst makeWalkStream =\n\t(fs: FileSystem.FileSystem) =>\n\t(root: string, cutoff: Date): Stream.Stream<string, FileWalkerFilesystemError> =>\n\t\tstreamJsonlFiles(fs, root, cutoff);\n\nconst makeFileWalker = (fs: FileSystem.FileSystem): FileWalkerShape => {\n\tconst walkMany = makeWalkMany(fs);\n\treturn {\n\t\tpathKind: makePathKind(fs),\n\t\twalk: Effect.fn(\"FileWalker.walk\")(function* (root: string, cutoff: Date) {\n\t\t\treturn yield* walkMany([root], cutoff);\n\t\t}),\n\t\twalkStream: makeWalkStream(fs),\n\t\twalkMany: walkMany,\n\t\twalkManyStream: makeWalkManyStream(fs),\n\t};\n};\n\nconst FileWalkerLive: Layer.Layer<FileWalker> = Layer.effect(\n\tFileWalker,\n\tEffect.gen(function* () {\n\t\tconst fs = yield* FileSystem.FileSystem;\n\t\treturn FileWalker.of(makeFileWalker(fs));\n\t}),\n).pipe(Layer.provide(NodeFileSystem.layer));\n\nexport type { FileWalkerPathKind, FileWalkerShape };\nexport { FileWalker, FileWalkerFilesystemError, FileWalkerLive, makeFileWalker, makeFileWalkerFilesystemError };\n","import { Effect, Stream } from \"effect\";\nimport {\n\tFileWalker,\n\ttype FileWalkerFilesystemError,\n\tFileWalkerLive,\n\ttype FileWalkerPathKind,\n} 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 walkEffectStrict(\n\troot: string,\n\tcutoff: Date,\n): Effect.Effect<AsyncIterable<string>, FileWalkerFilesystemError, FileWalker> {\n\treturn Effect.gen(function* () {\n\t\tconst walker = yield* FileWalker;\n\t\treturn yield* walker.walk(root, cutoff);\n\t});\n}\n\nfunction walkManyEffectStrict(\n\troots: readonly string[],\n\tcutoff: Date,\n): Effect.Effect<AsyncIterable<string>, FileWalkerFilesystemError, FileWalker> {\n\treturn Effect.gen(function* () {\n\t\tconst walker = yield* FileWalker;\n\t\treturn yield* walker.walkMany(roots, cutoff);\n\t});\n}\n\nfunction pathKindEffectStrict(path: string): Effect.Effect<FileWalkerPathKind, FileWalkerFilesystemError, FileWalker> {\n\treturn Effect.gen(function* () {\n\t\tconst walker = yield* FileWalker;\n\t\treturn yield* walker.pathKind(path);\n\t});\n}\n\nfunction walkStreamStrict(root: string, cutoff: Date): Stream.Stream<string, FileWalkerFilesystemError, FileWalker> {\n\treturn Stream.unwrap(\n\t\tEffect.gen(function* () {\n\t\t\tconst walker = yield* FileWalker;\n\t\t\treturn walker.walkStream(root, cutoff);\n\t\t}),\n\t);\n}\n\nfunction walkManyStreamStrict(\n\troots: readonly string[],\n\tcutoff: Date,\n): Stream.Stream<string, FileWalkerFilesystemError, FileWalker> {\n\treturn Stream.unwrap(\n\t\tEffect.gen(function* () {\n\t\t\tconst walker = yield* FileWalker;\n\t\t\treturn walker.walkManyStream(roots, cutoff);\n\t\t}),\n\t);\n}\n\nfunction walkStream(root: string, cutoff: Date): Stream.Stream<string, never, FileWalker> {\n\treturn walkStreamStrict(root, cutoff).pipe(Stream.catchTag(\"FileWalkerFilesystemError\", () => Stream.empty));\n}\n\nfunction walkManyStream(roots: readonly string[], cutoff: Date): Stream.Stream<string, never, FileWalker> {\n\treturn Stream.fromIterable(roots).pipe(Stream.flatMap((root) => walkStream(root, cutoff)));\n}\n\nfunction walkEffect(root: string, cutoff: Date): Effect.Effect<AsyncIterable<string>, never, FileWalker> {\n\t// Preserve legacy best-effort behavior for async-iterable parser callers.\n\treturn Stream.toAsyncIterableEffect(walkStream(root, cutoff));\n}\n\nfunction walkManyEffect(\n\troots: readonly string[],\n\tcutoff: Date,\n): Effect.Effect<AsyncIterable<string>, never, FileWalker> {\n\treturn Stream.toAsyncIterableEffect(walkManyStream(roots, cutoff));\n}\n\nfunction pathKindEffect(path: string): Effect.Effect<FileWalkerPathKind, never, FileWalker> {\n\treturn pathKindEffectStrict(path).pipe(\n\t\tEffect.catchTag(\"FileWalkerFilesystemError\", () => Effect.succeed(\"missing\" as const)),\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 {\n\tpathKindEffect,\n\tpathKindEffectStrict,\n\twalkEffect,\n\twalkEffectStrict,\n\twalkManyEffect,\n\twalkManyEffectStrict,\n\twalkManyStream,\n\twalkManyStreamStrict,\n\twalkStream,\n\twalkStreamStrict,\n};\n","import { stderr } from \"node:process\";\nimport type { Logger, WarningSink } from \"./types\";\n\nfunction formatLogMeta(meta: Record<string, unknown>): string {\n\treturn JSON.stringify(meta);\n}\n\nconst createWarningLogger = (sink: WarningSink): Logger => ({\n\twarn: (msg, meta) => {\n\t\tif (meta === undefined) {\n\t\t\tsink.write(`${msg}\\n`);\n\t\t} else {\n\t\t\tsink.write(`${msg} ${formatLogMeta(meta)}\\n`);\n\t\t}\n\t},\n});\n\n/** No-op logger for strict Effect/Stream entrypoints; callers opt into warning output. */\nconst silentLogger: Logger = {\n\twarn: () => {},\n};\n\n/**\n * Compatibility logger for legacy async parser adapters.\n *\n * Local malformed-record warnings historically went to stderr. Keep that Node\n * process edge isolated here so shared parser types stay side-effect free.\n */\nconst stderrLogger: Logger = createWarningLogger(stderr);\n\n/** @deprecated Use `stderrLogger` for compatibility adapters or pass an explicit logger. */\nconst consoleLogger: Logger = stderrLogger;\n\nexport { consoleLogger, createWarningLogger, silentLogger, stderrLogger };\n","import { createReadStream } from \"node:fs\";\nimport { createInterface } from \"node:readline\";\nimport { Cause, Effect, Queue, Stream } from \"effect\";\nimport { startOfUtcHour } from \"../codex/bucketize\";\nimport {\n\ttype LocalPathFilter,\n\ttype Logger,\n\tmakeParserSourceReadError,\n\ttype ParsedBucket,\n\ttype ParserSourceReadError,\n} from \"../types\";\nimport { type ClaudeUsage, 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 cutoff?: Date;\n\treadonly sessionId?: string;\n\treadonly seenTuples?: Set<string>;\n\treadonly excludePath?: LocalPathFilter;\n};\n\ntype ClaudeFileAccumulator = {\n\tbuckets: Map<string, BucketAccumulator>;\n\texcluded: boolean;\n\tlineNo: number;\n\tseenTuples: Set<string>;\n\tsessionLastSeenAt: Date | undefined;\n\tsessionStartedAt: Date | undefined;\n};\n\ntype ClaudeLineContext = {\n\treadonly path: string;\n\treadonly logger: Logger;\n\treadonly options: BucketizeClaudeFileOptions;\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\nfunction makeClaudeFileAccumulator(options: BucketizeClaudeFileOptions): ClaudeFileAccumulator {\n\treturn {\n\t\tbuckets: new Map(),\n\t\texcluded: false,\n\t\tlineNo: 0,\n\t\tseenTuples: options.seenTuples ?? new Set(),\n\t\tsessionLastSeenAt: undefined,\n\t\tsessionStartedAt: undefined,\n\t};\n}\n\nfunction lineStreamFromFile(path: string): Stream.Stream<string, ParserSourceReadError> {\n\treturn Stream.callback<string, ParserSourceReadError>((queue) =>\n\t\tEffect.acquireRelease(\n\t\t\tEffect.sync(() => {\n\t\t\t\tlet done = false;\n\t\t\t\tconst stream = createReadStream(path, { encoding: \"utf8\" });\n\t\t\t\tconst rl = createInterface({ input: stream, crlfDelay: Number.POSITIVE_INFINITY });\n\n\t\t\t\tconst offer = (line: string): void => {\n\t\t\t\t\tif (!done) {\n\t\t\t\t\t\tQueue.offerUnsafe(queue, line);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tconst end = (): void => {\n\t\t\t\t\tif (!done) {\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t\tQueue.endUnsafe(queue);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tconst fail = (error: unknown): void => {\n\t\t\t\t\tif (!done) {\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t\tQueue.failCauseUnsafe(queue, Cause.fail(makeParserSourceReadError(path, error)));\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tstream.once(\"error\", fail);\n\t\t\t\trl.once(\"error\", fail);\n\t\t\t\trl.once(\"close\", end);\n\t\t\t\trl.on(\"line\", offer);\n\n\t\t\t\treturn {\n\t\t\t\t\tclose: () => {\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t\trl.off(\"close\", end);\n\t\t\t\t\t\trl.off(\"error\", fail);\n\t\t\t\t\t\trl.off(\"line\", offer);\n\t\t\t\t\t\tstream.off(\"error\", fail);\n\t\t\t\t\t\trl.close();\n\t\t\t\t\t\tstream.destroy();\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}),\n\t\t\t(resource) => Effect.sync(() => resource.close()),\n\t\t),\n\t);\n}\n\nfunction addToBucket(acc: ClaudeFileAccumulator, hourUtc: Date, model: string, usage: ClaudeUsage): boolean {\n\tconst inputTokens = Math.max(0, usage.input_tokens ?? 0);\n\tconst outputTokens = Math.max(0, usage.output_tokens ?? 0);\n\tconst cacheReadTokens = Math.max(0, usage.cache_read_input_tokens ?? 0);\n\tconst cacheCreateTokens = Math.max(0, usage.cache_creation_input_tokens ?? 0);\n\tif (inputTokens === 0 && outputTokens === 0 && cacheReadTokens === 0 && cacheCreateTokens === 0) {\n\t\treturn false;\n\t}\n\n\tconst k = key(hourUtc, model);\n\tconst existing = acc.buckets.get(k);\n\tif (existing === undefined) {\n\t\tacc.buckets.set(k, {\n\t\t\thourUtc: hourUtc,\n\t\t\tmodel: model,\n\t\t\tinputTokens: inputTokens,\n\t\t\toutputTokens: outputTokens,\n\t\t\tcacheReadTokens: cacheReadTokens,\n\t\t\tcacheCreateTokens: cacheCreateTokens,\n\t\t});\n\t\treturn true;\n\t}\n\n\texisting.inputTokens += inputTokens;\n\texisting.outputTokens += outputTokens;\n\texisting.cacheReadTokens += cacheReadTokens;\n\texisting.cacheCreateTokens += cacheCreateTokens;\n\treturn true;\n}\n\nfunction markSessionSeen(acc: ClaudeFileAccumulator, eventAt: Date): void {\n\tif (acc.sessionStartedAt === undefined || eventAt.getTime() < acc.sessionStartedAt.getTime()) {\n\t\tacc.sessionStartedAt = eventAt;\n\t}\n\tif (acc.sessionLastSeenAt === undefined || eventAt.getTime() > acc.sessionLastSeenAt.getTime()) {\n\t\tacc.sessionLastSeenAt = eventAt;\n\t}\n}\n\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\nfunction accumulateClaudeLine(\n\tcontext: ClaudeLineContext,\n\tacc: ClaudeFileAccumulator,\n\traw: string,\n): ClaudeFileAccumulator {\n\tconst { logger, options, path } = context;\n\tacc.lineNo += 1;\n\tif (acc.excluded) {\n\t\treturn acc;\n\t}\n\n\tconst trimmed = raw.trim();\n\tif (trimmed.length === 0) {\n\t\treturn acc;\n\t}\n\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(trimmed);\n\t} catch {\n\t\tlogger.warn(\"malformed jsonl line\", { path: path, line: acc.lineNo });\n\t\treturn acc;\n\t}\n\n\tif (!isClaudeAssistantEvent(parsed)) {\n\t\treturn acc;\n\t}\n\tif (shouldExcludePath(parsed.cwd, options.excludePath)) {\n\t\tacc.excluded = true;\n\t\tacc.buckets.clear();\n\t\treturn acc;\n\t}\n\n\tconst tsMs = Date.parse(parsed.timestamp);\n\tif (!Number.isFinite(tsMs)) {\n\t\treturn acc;\n\t}\n\tif (options.cutoff !== undefined && tsMs < options.cutoff.getTime()) {\n\t\treturn acc;\n\t}\n\n\tconst { message, requestId } = parsed;\n\tif (message.id !== undefined && requestId !== undefined) {\n\t\tconst tuple = `${message.id}::${requestId}`;\n\t\tif (acc.seenTuples.has(tuple)) {\n\t\t\treturn acc;\n\t\t}\n\t\tacc.seenTuples.add(tuple);\n\t}\n\n\tconst eventAt = new Date(tsMs);\n\tif (addToBucket(acc, startOfUtcHour(eventAt), message.model, message.usage)) {\n\t\tmarkSessionSeen(acc, eventAt);\n\t}\n\treturn acc;\n}\n\nfunction bucketsFromAccumulator(\n\tpath: string,\n\toptions: BucketizeClaudeFileOptions,\n\tacc: ClaudeFileAccumulator,\n): readonly ParsedBucket[] {\n\tif (acc.excluded || acc.sessionStartedAt === undefined || acc.sessionLastSeenAt === undefined) {\n\t\treturn [];\n\t}\n\n\tconst sessionStartedAt = acc.sessionStartedAt;\n\tconst sessionLastSeenAt = acc.sessionLastSeenAt;\n\tconst sessionIds: ReadonlySet<string> = new Set([options.sessionId ?? path]);\n\treturn Array.from(acc.buckets.values(), (bucket) => ({\n\t\tharness: \"claude_code\",\n\t\tmodel: bucket.model,\n\t\thourUtc: bucket.hourUtc,\n\t\tinputTokens: bucket.inputTokens,\n\t\toutputTokens: bucket.outputTokens,\n\t\tcacheReadTokens: bucket.cacheReadTokens,\n\t\tcacheCreateTokens: bucket.cacheCreateTokens,\n\t\tsessionIds: sessionIds,\n\t\tsessionStartedAt: sessionStartedAt,\n\t\tsessionLastSeenAt: sessionLastSeenAt,\n\t}));\n}\n\n/**\n * Parse one Claude Code 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. Emits one ParsedBucket per Map entry.\n */\nfunction bucketizeClaudeFileStream(\n\tpath: string,\n\tlogger: Logger,\n\toptions: BucketizeClaudeFileOptions = {},\n): Stream.Stream<ParsedBucket, ParserSourceReadError> {\n\tconst context: ClaudeLineContext = { logger: logger, options: options, path: path };\n\treturn Stream.unwrap(\n\t\tlineStreamFromFile(path).pipe(\n\t\t\tStream.runFold(\n\t\t\t\t() => makeClaudeFileAccumulator(options),\n\t\t\t\t(acc, raw) => accumulateClaudeLine(context, acc, raw),\n\t\t\t),\n\t\t\tEffect.map((acc) => Stream.fromIterable(bucketsFromAccumulator(path, options, acc))),\n\t\t),\n\t);\n}\n\nasync function* bucketizeClaudeFile(\n\tpath: string,\n\tlogger: Logger,\n\toptions: BucketizeClaudeFileOptions = {},\n): AsyncIterable<ParsedBucket> {\n\tyield* Stream.toAsyncIterable(bucketizeClaudeFileStream(path, logger, options));\n}\n\nexport type { BucketizeClaudeFileOptions };\nexport { bucketizeClaudeFile, bucketizeClaudeFileStream };\n","import { createReadStream } from \"node:fs\";\nimport { createInterface } from \"node:readline\";\nimport { Cause, Effect, Queue, Stream } from \"effect\";\nimport {\n\ttype LocalPathFilter,\n\ttype Logger,\n\tmakeParserSourceReadError,\n\ttype ParsedBucket,\n\ttype ParserSourceReadError,\n} 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\ntype CodexFileAccumulator = {\n\tbuckets: Map<string, BucketAccumulator>;\n\tcurrentModel: string | undefined;\n\texcluded: boolean;\n\tlineNo: number;\n\tsawTurnContext: boolean;\n\tsessionLastSeenAt: Date | undefined;\n\tsessionStartedAt: Date | undefined;\n};\n\ntype CodexLineContext = {\n\treadonly path: string;\n\treadonly logger: Logger;\n\treadonly options: BucketizeCodexFileOptions;\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\nfunction makeCodexFileAccumulator(): CodexFileAccumulator {\n\treturn {\n\t\tbuckets: new Map(),\n\t\tcurrentModel: undefined,\n\t\texcluded: false,\n\t\tlineNo: 0,\n\t\tsawTurnContext: false,\n\t\tsessionLastSeenAt: undefined,\n\t\tsessionStartedAt: undefined,\n\t};\n}\n\nfunction lineStreamFromFile(path: string): Stream.Stream<string, ParserSourceReadError> {\n\treturn Stream.callback<string, ParserSourceReadError>((queue) =>\n\t\tEffect.acquireRelease(\n\t\t\tEffect.sync(() => {\n\t\t\t\tlet done = false;\n\t\t\t\tconst stream = createReadStream(path, { encoding: \"utf8\" });\n\t\t\t\tconst rl = createInterface({ input: stream, crlfDelay: Number.POSITIVE_INFINITY });\n\n\t\t\t\tconst offer = (line: string): void => {\n\t\t\t\t\tif (!done) {\n\t\t\t\t\t\tQueue.offerUnsafe(queue, line);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tconst end = (): void => {\n\t\t\t\t\tif (!done) {\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t\tQueue.endUnsafe(queue);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tconst fail = (error: unknown): void => {\n\t\t\t\t\tif (!done) {\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t\tQueue.failCauseUnsafe(queue, Cause.fail(makeParserSourceReadError(path, error)));\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tstream.once(\"error\", fail);\n\t\t\t\trl.once(\"error\", fail);\n\t\t\t\trl.once(\"close\", end);\n\t\t\t\trl.on(\"line\", offer);\n\n\t\t\t\treturn {\n\t\t\t\t\tclose: () => {\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t\trl.off(\"close\", end);\n\t\t\t\t\t\trl.off(\"error\", fail);\n\t\t\t\t\t\trl.off(\"line\", offer);\n\t\t\t\t\t\tstream.off(\"error\", fail);\n\t\t\t\t\t\trl.close();\n\t\t\t\t\t\tstream.destroy();\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}),\n\t\t\t(resource) => Effect.sync(() => resource.close()),\n\t\t),\n\t);\n}\n\nfunction addToBucket(\n\tacc: CodexFileAccumulator,\n\thourUtc: Date,\n\tmodel: string,\n\tdelta: NonNullable<ReturnType<typeof pickCodexDelta>>,\n): boolean {\n\tconst inputTokens = Math.max(0, delta.input_tokens ?? 0);\n\tconst outputTokens = Math.max(0, delta.output_tokens ?? 0);\n\tconst cacheReadTokens = Math.max(0, delta.cached_input_tokens ?? delta.cache_read_input_tokens ?? 0);\n\tif (inputTokens === 0 && outputTokens === 0 && cacheReadTokens === 0) {\n\t\treturn false;\n\t}\n\n\tconst k = key(hourUtc, model);\n\tconst existing = acc.buckets.get(k);\n\tif (existing === undefined) {\n\t\tacc.buckets.set(k, {\n\t\t\thourUtc: hourUtc,\n\t\t\tmodel: model,\n\t\t\tinputTokens: inputTokens,\n\t\t\toutputTokens: outputTokens,\n\t\t\tcacheReadTokens: cacheReadTokens,\n\t\t\tcacheCreateTokens: 0,\n\t\t});\n\t\treturn true;\n\t}\n\n\texisting.inputTokens += inputTokens;\n\texisting.outputTokens += outputTokens;\n\texisting.cacheReadTokens += cacheReadTokens;\n\treturn true;\n}\n\nfunction markSessionSeen(acc: CodexFileAccumulator, eventAt: Date): void {\n\tif (acc.sessionStartedAt === undefined || eventAt.getTime() < acc.sessionStartedAt.getTime()) {\n\t\tacc.sessionStartedAt = eventAt;\n\t}\n\tif (acc.sessionLastSeenAt === undefined || eventAt.getTime() > acc.sessionLastSeenAt.getTime()) {\n\t\tacc.sessionLastSeenAt = eventAt;\n\t}\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: line-by-line parser with necessary branching\nfunction accumulateCodexLine(context: CodexLineContext, acc: CodexFileAccumulator, raw: string): CodexFileAccumulator {\n\tconst { logger, options, path } = context;\n\tacc.lineNo += 1;\n\tif (acc.excluded) {\n\t\treturn acc;\n\t}\n\n\tconst trimmed = raw.trim();\n\tif (trimmed.length === 0) {\n\t\treturn acc;\n\t}\n\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(trimmed);\n\t} catch {\n\t\tlogger.warn(\"malformed jsonl line\", { path: path, line: acc.lineNo });\n\t\treturn acc;\n\t}\n\n\tif (isCodexSessionMetaEvent(parsed)) {\n\t\tif (shouldExcludePath(parsed.payload.cwd, options.excludePath)) {\n\t\t\tacc.excluded = true;\n\t\t\tacc.buckets.clear();\n\t\t}\n\t\treturn acc;\n\t}\n\n\tif (isCodexTurnContextEvent(parsed)) {\n\t\tif (shouldExcludePath(parsed.payload.cwd, options.excludePath)) {\n\t\t\tacc.excluded = true;\n\t\t\tacc.buckets.clear();\n\t\t\treturn acc;\n\t\t}\n\t\tconst model = parsed.payload.model ?? parsed.payload.info?.model;\n\t\tif (model !== undefined) {\n\t\t\tacc.currentModel = model;\n\t\t\tacc.sawTurnContext = true;\n\t\t}\n\t\treturn acc;\n\t}\n\n\tif (!isCodexTokenCountEvent(parsed)) {\n\t\treturn acc;\n\t}\n\n\tconst tsMs = Date.parse(parsed.timestamp);\n\tif (!Number.isFinite(tsMs)) {\n\t\treturn acc;\n\t}\n\n\tconst eventModel = pickCodexEventModel(parsed);\n\tconst model = acc.sawTurnContext ? (acc.currentModel ?? eventModel) : (eventModel ?? acc.currentModel);\n\tif (model === undefined) {\n\t\treturn acc;\n\t}\n\n\tconst delta = pickCodexDelta(parsed);\n\tif (delta === undefined) {\n\t\treturn acc;\n\t}\n\n\tconst eventAt = new Date(tsMs);\n\tif (addToBucket(acc, startOfUtcHour(eventAt), model, delta)) {\n\t\tmarkSessionSeen(acc, eventAt);\n\t}\n\treturn acc;\n}\n\nfunction bucketsFromAccumulator(path: string, acc: CodexFileAccumulator): readonly ParsedBucket[] {\n\tif (acc.excluded || acc.sessionStartedAt === undefined || acc.sessionLastSeenAt === undefined) {\n\t\treturn [];\n\t}\n\n\tconst sessionStartedAt = acc.sessionStartedAt;\n\tconst sessionLastSeenAt = acc.sessionLastSeenAt;\n\tconst sessionIds: ReadonlySet<string> = new Set([path]);\n\treturn Array.from(acc.buckets.values(), (bucket) => ({\n\t\tharness: \"codex\",\n\t\tmodel: bucket.model,\n\t\thourUtc: bucket.hourUtc,\n\t\tinputTokens: bucket.inputTokens,\n\t\toutputTokens: bucket.outputTokens,\n\t\tcacheReadTokens: bucket.cacheReadTokens,\n\t\tcacheCreateTokens: bucket.cacheCreateTokens,\n\t\tsessionIds: sessionIds,\n\t\tsessionStartedAt: sessionStartedAt,\n\t\tsessionLastSeenAt: sessionLastSeenAt,\n\t}));\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 */\nfunction bucketizeCodexFileStream(\n\tpath: string,\n\tlogger: Logger,\n\toptions: BucketizeCodexFileOptions = {},\n): Stream.Stream<ParsedBucket, ParserSourceReadError> {\n\tconst context: CodexLineContext = { logger: logger, options: options, path: path };\n\treturn Stream.unwrap(\n\t\tlineStreamFromFile(path).pipe(\n\t\t\tStream.runFold(makeCodexFileAccumulator, (acc, raw) => accumulateCodexLine(context, acc, raw)),\n\t\t\tEffect.map((acc) => Stream.fromIterable(bucketsFromAccumulator(path, acc))),\n\t\t),\n\t);\n}\n\nasync function* bucketizeCodexFile(\n\tpath: string,\n\tlogger: Logger,\n\toptions: BucketizeCodexFileOptions = {},\n): AsyncIterable<ParsedBucket> {\n\tyield* Stream.toAsyncIterable(bucketizeCodexFileStream(path, logger, options));\n}\n\nexport type { BucketizeCodexFileOptions };\nexport { bucketizeCodexFile, bucketizeCodexFileStream, startOfUtcHour };\n","import { type Effect, Schema, Stream } from \"effect\";\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\ntype WarningSink = {\n\twrite: (chunk: string) => unknown;\n};\n\nclass ParserSourceReadError extends Schema.TaggedErrorClass<ParserSourceReadError>()(\"ParserSourceReadError\", {\n\tmessage: Schema.String,\n\tpath: Schema.String,\n\tcause: Schema.optionalKey(Schema.Defect()),\n}) {}\n\nconst makeParserSourceReadError = (path: string, error: unknown): ParserSourceReadError =>\n\tnew ParserSourceReadError({\n\t\tmessage: `Parser source read failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\tpath: path,\n\t\tcause: error,\n\t});\n\nconst parsedBucketStreamFromAsyncIterable = (\n\titerable: AsyncIterable<ParsedBucket>,\n\tsource: string,\n): Stream.Stream<ParsedBucket, ParserSourceReadError> =>\n\tStream.fromAsyncIterable(iterable, (error) => makeParserSourceReadError(source, error));\n\nconst collectParsedBucketsEffect = (\n\titerable: AsyncIterable<ParsedBucket>,\n\tsource: string,\n): Effect.Effect<readonly ParsedBucket[], ParserSourceReadError> =>\n\tStream.runCollect(parsedBucketStreamFromAsyncIterable(iterable, source));\n\nexport type { Harness, LocalPathFilter, Logger, ParsedBucket, WarningSink };\nexport {\n\tcollectParsedBucketsEffect,\n\tmakeParserSourceReadError,\n\tParserSourceReadError,\n\tparsedBucketStreamFromAsyncIterable,\n};\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 { Effect, Stream } from \"effect\";\nimport { resolveCodexArchivedRoot, resolveCodexSessionsRoot } from \"../config\";\nimport { type FileWalker, type FileWalkerFilesystemError, FileWalkerLive } from \"../effect/file-walker\";\nimport type { LocalPathFilter, Logger, ParsedBucket, ParserSourceReadError } from \"../types\";\nimport { pathKindEffect, pathKindEffectStrict, walkManyStream, walkManyStreamStrict } from \"../walk\";\nimport { silentLogger, stderrLogger } from \"../warnings\";\nimport { bucketizeCodexFileStream } 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. Strict Effect/Stream entrypoints default to `silentLogger`. */\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\ntype ParseCodexError = FileWalkerFilesystemError | ParserSourceReadError;\n\nconst codexRoots = (opts: ParseCodexOptions, root: string): readonly string[] => {\n\tconst roots: string[] = [root];\n\tif (opts.root === undefined && opts.archivedRoot === undefined) {\n\t\troots.push(resolveCodexArchivedRoot());\n\t} else if (opts.archivedRoot !== undefined) {\n\t\troots.push(opts.archivedRoot);\n\t}\n\treturn roots;\n};\n\n/**\n * Walk one or two Codex source roots and return `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 */\nconst parseCodexEffect: (\n\topts: ParseCodexOptions,\n) => Effect.Effect<readonly ParsedBucket[], ParseCodexError, FileWalker> = Effect.fn(\"CodexParser.parseCodexEffect\")(\n\t(opts: ParseCodexOptions) => Stream.runCollect(parseCodexStream(opts)),\n);\n\nconst parseCodexStream: (opts: ParseCodexOptions) => Stream.Stream<ParsedBucket, ParseCodexError, FileWalker> = (\n\topts: ParseCodexOptions,\n) =>\n\tStream.unwrap(\n\t\tEffect.gen(function* () {\n\t\t\tconst logger = opts.logger ?? silentLogger;\n\t\t\tconst root = opts.root ?? resolveCodexSessionsRoot();\n\n\t\t\tif ((yield* pathKindEffectStrict(root)) === \"file\") {\n\t\t\t\treturn bucketizeCodexFileStream(root, logger, { excludePath: opts.excludePath });\n\t\t\t}\n\n\t\t\treturn bucketizeCodexFilesStream(walkManyStreamStrict(codexRoots(opts, root), opts.cutoff), logger, {\n\t\t\t\texcludePath: opts.excludePath,\n\t\t\t});\n\t\t}),\n\t);\n\nconst parseCodexCompatibilityStream: (\n\topts: ParseCodexOptions,\n) => Stream.Stream<ParsedBucket, ParserSourceReadError, FileWalker> = (opts: ParseCodexOptions) =>\n\tStream.unwrap(\n\t\tEffect.gen(function* () {\n\t\t\tconst logger = opts.logger ?? stderrLogger;\n\t\t\tconst root = opts.root ?? resolveCodexSessionsRoot();\n\n\t\t\tif ((yield* pathKindEffect(root)) === \"file\") {\n\t\t\t\treturn bucketizeCodexFileStream(root, logger, { excludePath: opts.excludePath });\n\t\t\t}\n\n\t\t\treturn bucketizeCodexFilesStream(walkManyStream(codexRoots(opts, root), opts.cutoff), logger, {\n\t\t\t\texcludePath: opts.excludePath,\n\t\t\t});\n\t\t}),\n\t);\n\nasync function* parseCodex(opts: ParseCodexOptions): AsyncIterable<ParsedBucket> {\n\tconst logger = opts.logger ?? stderrLogger;\n\tconst stream = parseCodexCompatibilityStream({ ...opts, logger: logger }).pipe(\n\t\tStream.catchTag(\"ParserSourceReadError\", () =>\n\t\t\tStream.fromEffectDrain(\n\t\t\t\tEffect.sync(() =>\n\t\t\t\t\tlogger.warn(\"failed to parse codex source\", { root: opts.root ?? resolveCodexSessionsRoot() }),\n\t\t\t\t),\n\t\t\t),\n\t\t),\n\t\tStream.provide(FileWalkerLive),\n\t);\n\tyield* Stream.toAsyncIterable(stream);\n}\n\nfunction bucketizeCodexFilesStream<E, R>(\n\tfiles: Stream.Stream<string, E, R>,\n\tlogger: Logger,\n\toptions: { readonly excludePath?: LocalPathFilter },\n): Stream.Stream<ParsedBucket, E | ParserSourceReadError, R> {\n\treturn files.pipe(Stream.flatMap((file) => bucketizeCodexFileStream(file, logger, options)));\n}\n\nexport type { ParseCodexError, ParseCodexOptions };\nexport { parseCodex, parseCodexEffect, parseCodexStream };\n","import { Context, Effect, Layer, Schema } from \"effect\";\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;\n\nconst HERMES_SESSION_QUERY = `\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\ntype SqliteModule = typeof import(\"node:sqlite\");\ntype DatabaseSyncConstructor = SqliteModule[\"DatabaseSync\"];\ntype DatabaseSync = InstanceType<DatabaseSyncConstructor>;\ntype HermesSqliteOperation = \"load\" | \"open\" | \"query\" | \"close\";\n\ntype HermesSqliteSessionRow = {\n\treadonly id: unknown;\n\treadonly model: unknown;\n\treadonly billingProvider: unknown;\n\treadonly startedAt: unknown;\n\treadonly endedAt: unknown;\n\treadonly inputTokens: unknown;\n\treadonly outputTokens: unknown;\n\treadonly cacheReadTokens: unknown;\n\treadonly cacheWriteTokens: unknown;\n\treadonly cwd: unknown;\n};\n\ntype HermesSqliteShape = {\n\t/**\n\t * Hermes state.db parsing intentionally collects the cutoff-filtered rows at\n\t * the SQLite service boundary. node:sqlite exposes synchronous statement\n\t * APIs today; parser entrypoints stream file parsing and then adapt this\n\t * bounded database result set into buckets above this service.\n\t */\n\treadonly readSessionRows: (\n\t\tpath: string,\n\t\tcutoff: Date,\n\t) => Effect.Effect<readonly HermesSqliteSessionRow[], HermesSqliteError>;\n};\n\nclass HermesSqliteError extends Schema.TaggedErrorClass<HermesSqliteError>()(\"HermesSqliteError\", {\n\tmessage: Schema.String,\n\toperation: Schema.Literals([\"load\", \"open\", \"query\", \"close\"]),\n\tpath: Schema.optionalKey(Schema.String),\n\tcause: Schema.optionalKey(Schema.Defect()),\n}) {}\n\nclass HermesSqlite extends Context.Service<HermesSqlite, HermesSqliteShape>()(\"@oopst/parsers/HermesSqlite\") {}\n\nconst toHermesSqliteError =\n\t(operation: HermesSqliteOperation, path?: string) =>\n\t(error: unknown): HermesSqliteError =>\n\t\tnew HermesSqliteError({\n\t\t\tmessage: `HermesSqlite.${operation} failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\toperation: operation,\n\t\t\tpath: path,\n\t\t\tcause: error,\n\t\t});\n\nconst loadDatabaseSync = Effect.fn(\"HermesSqlite.loadDatabaseSync\")(function* () {\n\tconst sqliteModule = yield* Effect.tryPromise({\n\t\ttry: () => import(NODE_SQLITE_SPECIFIER) as Promise<SqliteModule>,\n\t\tcatch: toHermesSqliteError(\"load\"),\n\t});\n\treturn sqliteModule.DatabaseSync;\n});\n\nconst openDatabase = (\n\tpath: string,\n\tDatabaseSync: DatabaseSyncConstructor,\n): Effect.Effect<DatabaseSync, HermesSqliteError> =>\n\tEffect.try({\n\t\ttry: () => new DatabaseSync(path, { readOnly: true, timeout: 1000 }),\n\t\tcatch: toHermesSqliteError(\"open\", path),\n\t});\n\nconst closeDatabase = (path: string, db: DatabaseSync): Effect.Effect<void, HermesSqliteError> =>\n\tEffect.try({\n\t\ttry: () => {\n\t\t\tdb.close();\n\t\t},\n\t\tcatch: toHermesSqliteError(\"close\", path),\n\t});\n\nconst querySessionRows = (\n\tpath: string,\n\tdb: DatabaseSync,\n\tcutoff: Date,\n): Effect.Effect<readonly HermesSqliteSessionRow[], HermesSqliteError> =>\n\tEffect.try({\n\t\ttry: () => {\n\t\t\tconst statement = db.prepare(HERMES_SESSION_QUERY);\n\t\t\treturn statement.all(cutoff.getTime() / MILLISECONDS_PER_SECOND) as HermesSqliteSessionRow[];\n\t\t},\n\t\tcatch: toHermesSqliteError(\"query\", path),\n\t});\n\nconst makeHermesSqlite = (): HermesSqliteShape => ({\n\treadSessionRows: Effect.fn(\"HermesSqlite.readSessionRows\")(function* (path: string, cutoff: Date) {\n\t\tconst DatabaseSync = yield* loadDatabaseSync();\n\t\treturn yield* Effect.acquireUseRelease(\n\t\t\topenDatabase(path, DatabaseSync),\n\t\t\t(db) => querySessionRows(path, db, cutoff),\n\t\t\t(db) => closeDatabase(path, db),\n\t\t);\n\t}),\n});\n\nconst HermesSqliteLive: Layer.Layer<HermesSqlite> = Layer.effect(\n\tHermesSqlite,\n\tEffect.sync(() => HermesSqlite.of(makeHermesSqlite())),\n);\n\nexport type { HermesSqliteSessionRow, HermesSqliteShape };\nexport { HermesSqlite, HermesSqliteError, HermesSqliteLive, makeHermesSqlite };\n","import { basename, join } from \"node:path\";\nimport { NodeFileSystem } from \"@effect/platform-node\";\nimport { Context, Effect, FileSystem, Layer, Option, Schema, Stream } from \"effect\";\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 OPENCODE_DB_FILE_PATTERN = /^opencode(?:-[^/]+)?\\.db$/u;\n\nconst SESSION_MESSAGE_QUERY = `\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\nconst SESSION_PATH_QUERIES = [\n\t`select id as \"sessionId\", directory as \"path\" from \"session\" where directory is not null`,\n\t`select id as \"sessionId\", cwd as \"path\" from \"session\" where cwd is not null`,\n\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] as const;\n\ntype SqliteModule = typeof import(\"node:sqlite\");\ntype DatabaseSyncConstructor = SqliteModule[\"DatabaseSync\"];\ntype DatabaseSync = InstanceType<DatabaseSyncConstructor>;\ntype OpenCodeIoOperation = \"stat\" | \"readdir\" | \"readFile\" | \"parseJson\" | \"load\" | \"open\" | \"query\" | \"close\";\ntype OpenCodePathKind = \"file\" | \"directory\" | \"missing\";\ntype OpenCodeJsonPathStream = Stream.Stream<string>;\n\ntype OpenCodeSources =\n\t| { readonly _tag: \"Missing\" }\n\t| { readonly _tag: \"DatabaseFiles\"; readonly paths: readonly string[] }\n\t| { readonly _tag: \"JsonFile\"; readonly path: string }\n\t| { readonly _tag: \"LegacyJsonFiles\"; readonly paths: OpenCodeJsonPathStream };\n\ntype OpenCodeSessionMessageRow = {\n\treadonly sessionId: unknown;\n\treadonly timeCreated: unknown;\n\treadonly data: unknown;\n};\n\ntype OpenCodeSessionPathRow = {\n\treadonly sessionId: unknown;\n\treadonly path: unknown;\n};\n\ntype OpenCodeSqliteRows = {\n\treadonly sessionMessages: readonly OpenCodeSessionMessageRow[];\n\treadonly sessionPaths: ReadonlyMap<string, readonly string[]>;\n};\n\ntype OpenCodeIoShape = {\n\treadonly discoverSources: (root: string, cutoff: Date) => Effect.Effect<OpenCodeSources>;\n\treadonly readJsonFile: (path: string) => Effect.Effect<unknown, OpenCodeIoError>;\n\treadonly readSqlite: (path: string, cutoff: Date) => Effect.Effect<OpenCodeSqliteRows, OpenCodeIoError>;\n};\n\nclass OpenCodeIoError extends Schema.TaggedErrorClass<OpenCodeIoError>()(\"OpenCodeIoError\", {\n\tmessage: Schema.String,\n\toperation: Schema.Literals([\"stat\", \"readdir\", \"readFile\", \"parseJson\", \"load\", \"open\", \"query\", \"close\"]),\n\tpath: Schema.optionalKey(Schema.String),\n\tcause: Schema.optionalKey(Schema.Defect()),\n}) {}\n\nclass OpenCodeIo extends Context.Service<OpenCodeIo, OpenCodeIoShape>()(\"@oopst/parsers/OpenCodeIo\") {}\n\nconst toOpenCodeIoError =\n\t(operation: OpenCodeIoOperation, path?: string) =>\n\t(error: unknown): OpenCodeIoError =>\n\t\tnew OpenCodeIoError({\n\t\t\tmessage: `OpenCodeIo.${operation} failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\toperation: operation,\n\t\t\tpath: path,\n\t\t\tcause: error,\n\t\t});\n\nconst readDir = (fs: FileSystem.FileSystem, path: string): Effect.Effect<readonly string[], OpenCodeIoError> =>\n\tfs.readDirectory(path).pipe(Effect.mapError(toOpenCodeIoError(\"readdir\", path)));\n\nconst readDirBestEffort = (fs: FileSystem.FileSystem, path: string): Effect.Effect<readonly string[]> =>\n\treadDir(fs, path).pipe(Effect.catch(() => Effect.succeed([])));\n\nconst readStat = (fs: FileSystem.FileSystem, path: string): Effect.Effect<FileSystem.File.Info, OpenCodeIoError> =>\n\tfs.stat(path).pipe(Effect.mapError(toOpenCodeIoError(\"stat\", path)));\n\nconst readStatBestEffort = (fs: FileSystem.FileSystem, path: string): Effect.Effect<FileSystem.File.Info | undefined> =>\n\treadStat(fs, path).pipe(Effect.catch(() => Effect.succeed(undefined)));\n\nconst pathKind = Effect.fn(\"OpenCodeIo.pathKind\")(function* (fs: FileSystem.FileSystem, path: string) {\n\treturn yield* readStat(fs, path).pipe(\n\t\tEffect.map((info): OpenCodePathKind => {\n\t\t\tif (info.type === \"File\") {\n\t\t\t\treturn \"file\";\n\t\t\t}\n\t\t\tif (info.type === \"Directory\") {\n\t\t\t\treturn \"directory\";\n\t\t\t}\n\t\t\treturn \"missing\";\n\t\t}),\n\t\tEffect.catch(() => Effect.succeed(\"missing\" as const)),\n\t);\n});\n\nconst listOpenCodeDatabases = Effect.fn(\"OpenCodeIo.listOpenCodeDatabases\")(function* (\n\tfs: FileSystem.FileSystem,\n\troot: string,\n) {\n\tconst entries = yield* readDirBestEffort(fs, root);\n\tconst databasePaths: string[] = [];\n\tfor (const entry of entries) {\n\t\tif (!OPENCODE_DB_FILE_PATTERN.test(entry)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst full = join(root, entry);\n\t\tif ((yield* pathKind(fs, full)) === \"file\") {\n\t\t\tdatabasePaths.push(full);\n\t\t}\n\t}\n\treturn databasePaths;\n});\n\nconst listProjectLegacyRoots = Effect.fn(\"OpenCodeIo.listProjectLegacyRoots\")(function* (\n\tfs: FileSystem.FileSystem,\n\troot: string,\n) {\n\tconst projectRoot = join(root, \"project\");\n\tconst entries = yield* readDirBestEffort(fs, projectRoot);\n\tconst roots: string[] = [];\n\tfor (const entry of entries) {\n\t\tconst full = join(projectRoot, entry);\n\t\tif ((yield* pathKind(fs, full)) === \"directory\") {\n\t\t\troots.push(join(full, \"storage\", \"message\"), join(full, \"storage\", \"session\", \"message\"));\n\t\t}\n\t}\n\treturn roots;\n});\n\nconst legacyRoots = Effect.fn(\"OpenCodeIo.legacyRoots\")(function* (fs: FileSystem.FileSystem, root: string) {\n\treturn [\n\t\tjoin(root, \"storage\", \"message\"),\n\t\tjoin(root, \"storage\", \"session\", \"message\"),\n\t\t...(yield* listProjectLegacyRoots(fs, root)),\n\t];\n});\n\nconst isRecent = (info: FileSystem.File.Info, cutoff: Date): boolean =>\n\tOption.match(info.mtime, {\n\t\tonNone: () => false,\n\t\tonSome: (mtime) => mtime.getTime() >= cutoff.getTime(),\n\t});\n\nconst streamJsonFiles: (fs: FileSystem.FileSystem, root: string, cutoff: Date) => OpenCodeJsonPathStream = (\n\tfs: FileSystem.FileSystem,\n\troot: string,\n\tcutoff: Date,\n) =>\n\tStream.suspend(() =>\n\t\tStream.fromIterableEffect(readDirBestEffort(fs, root)).pipe(\n\t\t\tStream.flatMap((entry) => {\n\t\t\t\tconst full = join(root, entry);\n\t\t\t\treturn Stream.fromEffect(readStatBestEffort(fs, full)).pipe(\n\t\t\t\t\tStream.flatMap((info) => {\n\t\t\t\t\t\tif (info?.type === \"Directory\") {\n\t\t\t\t\t\t\treturn streamJsonFiles(fs, full, cutoff);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (info?.type === \"File\" && entry.endsWith(\".json\") && isRecent(info, cutoff)) {\n\t\t\t\t\t\t\treturn Stream.succeed(full);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn Stream.empty;\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}),\n\t\t),\n\t);\n\nconst streamManyJsonFiles = (\n\tfs: FileSystem.FileSystem,\n\troots: readonly string[],\n\tcutoff: Date,\n): OpenCodeJsonPathStream =>\n\tStream.fromIterable(roots).pipe(Stream.flatMap((root) => streamJsonFiles(fs, root, cutoff)));\n\nconst discoverSources = Effect.fn(\"OpenCodeIo.discoverSources\")(function* (\n\tfs: FileSystem.FileSystem,\n\troot: string,\n\tcutoff: Date,\n) {\n\tconst kind = yield* pathKind(fs, root);\n\tif (kind === \"missing\") {\n\t\treturn { _tag: \"Missing\" } as const;\n\t}\n\n\tif (kind === \"file\") {\n\t\tif (basename(root).endsWith(\".json\")) {\n\t\t\treturn { _tag: \"JsonFile\", path: root } as const;\n\t\t}\n\t\treturn { _tag: \"DatabaseFiles\", paths: [root] } as const;\n\t}\n\n\tconst databases = yield* listOpenCodeDatabases(fs, root);\n\tif (databases.length > 0) {\n\t\treturn { _tag: \"DatabaseFiles\", paths: databases } as const;\n\t}\n\n\tconst roots = yield* legacyRoots(fs, root);\n\treturn { _tag: \"LegacyJsonFiles\", paths: streamManyJsonFiles(fs, roots, cutoff) } as const;\n});\n\nconst readJsonFile = (fs: FileSystem.FileSystem, path: string): Effect.Effect<unknown, OpenCodeIoError> =>\n\tfs.readFileString(path, \"utf8\").pipe(\n\t\tEffect.mapError(toOpenCodeIoError(\"readFile\", path)),\n\t\tEffect.flatMap((text) =>\n\t\t\tEffect.try({\n\t\t\t\ttry: () => JSON.parse(text) as unknown,\n\t\t\t\tcatch: toOpenCodeIoError(\"parseJson\", path),\n\t\t\t}),\n\t\t),\n\t);\n\nconst loadDatabaseSync = Effect.fn(\"OpenCodeIo.loadDatabaseSync\")(function* () {\n\tconst sqliteModule = yield* Effect.tryPromise({\n\t\ttry: () => import(NODE_SQLITE_SPECIFIER) as Promise<SqliteModule>,\n\t\tcatch: toOpenCodeIoError(\"load\"),\n\t});\n\treturn sqliteModule.DatabaseSync;\n});\n\nconst openDatabase = (\n\tpath: string,\n\tDatabaseSync: DatabaseSyncConstructor,\n): Effect.Effect<DatabaseSync, OpenCodeIoError> =>\n\tEffect.try({\n\t\ttry: () => new DatabaseSync(path, { readOnly: true, timeout: 1000 }),\n\t\tcatch: toOpenCodeIoError(\"open\", path),\n\t});\n\nconst closeDatabase = (path: string, db: DatabaseSync): Effect.Effect<void, OpenCodeIoError> =>\n\tEffect.try({\n\t\ttry: () => {\n\t\t\tdb.close();\n\t\t},\n\t\tcatch: toOpenCodeIoError(\"close\", path),\n\t});\n\nfunction readSessionPathRows(db: DatabaseSync, sql: string): readonly OpenCodeSessionPathRow[] {\n\ttry {\n\t\treturn db.prepare(sql).all() as OpenCodeSessionPathRow[];\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nfunction readSessionPaths(db: DatabaseSync): ReadonlyMap<string, readonly string[]> {\n\tconst rows = SESSION_PATH_QUERIES.flatMap((sql) => readSessionPathRows(db, sql));\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\nconst querySqliteRows = (\n\tpath: string,\n\tdb: DatabaseSync,\n\tcutoff: Date,\n): Effect.Effect<OpenCodeSqliteRows, OpenCodeIoError> =>\n\tEffect.try({\n\t\ttry: (): OpenCodeSqliteRows => {\n\t\t\tconst statement = db.prepare(SESSION_MESSAGE_QUERY);\n\t\t\treturn {\n\t\t\t\tsessionMessages: statement.all(cutoff.getTime()) as OpenCodeSessionMessageRow[],\n\t\t\t\tsessionPaths: readSessionPaths(db),\n\t\t\t};\n\t\t},\n\t\tcatch: toOpenCodeIoError(\"query\", path),\n\t});\n\nconst readSqlite = Effect.fn(\"OpenCodeIo.readSqlite\")(function* (path: string, cutoff: Date) {\n\tconst DatabaseSync = yield* loadDatabaseSync();\n\treturn yield* Effect.acquireUseRelease(\n\t\topenDatabase(path, DatabaseSync),\n\t\t(db) => querySqliteRows(path, db, cutoff),\n\t\t(db) => closeDatabase(path, db),\n\t);\n});\n\nconst makeOpenCodeIo = (fs: FileSystem.FileSystem): OpenCodeIoShape => ({\n\tdiscoverSources: (root: string, cutoff: Date) => discoverSources(fs, root, cutoff),\n\treadJsonFile: (path: string) => readJsonFile(fs, path),\n\treadSqlite: readSqlite,\n});\n\nconst OpenCodeIoLive: Layer.Layer<OpenCodeIo> = Layer.effect(\n\tOpenCodeIo,\n\tEffect.gen(function* () {\n\t\tconst fs = yield* FileSystem.FileSystem;\n\t\treturn OpenCodeIo.of(makeOpenCodeIo(fs));\n\t}),\n).pipe(Layer.provide(NodeFileSystem.layer));\n\nexport type { OpenCodeIoShape, OpenCodeJsonPathStream, OpenCodeSessionMessageRow, OpenCodeSources, OpenCodeSqliteRows };\nexport { makeOpenCodeIo, OpenCodeIo, OpenCodeIoError, OpenCodeIoLive };\n","import { Effect, Stream } from \"effect\";\nimport { resolveOpenCodeRoot } from \"../config\";\nimport {\n\tOpenCodeIo,\n\ttype OpenCodeIoError,\n\tOpenCodeIoLive,\n\ttype OpenCodeJsonPathStream,\n\ttype OpenCodeSources,\n} from \"../effect/opencode-io\";\nimport {\n\ttype LocalPathFilter,\n\ttype Logger,\n\ttype ParsedBucket,\n\ttype ParserSourceReadError,\n\tparsedBucketStreamFromAsyncIterable,\n} from \"../types\";\nimport { silentLogger, stderrLogger } from \"../warnings\";\nimport {\n\tbucketizeOpenCodeDatabase,\n\tbucketizeOpenCodeDatabaseEffect,\n\tbucketizeOpenCodeJsonFile,\n\tbucketizeOpenCodeJsonFileEffect,\n} 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. Strict Effect/Stream entrypoints default to `silentLogger`. */\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\ntype ParseOpenCodeError = OpenCodeIoError;\n\nconst discoverOpenCodeSourcesEffect: (root: string, cutoff: Date) => Effect.Effect<OpenCodeSources, never, OpenCodeIo> =\n\tEffect.fn(\"discoverOpenCodeSourcesEffect\")(function* (root: string, cutoff: Date) {\n\t\tconst io = yield* OpenCodeIo;\n\t\treturn yield* io.discoverSources(root, cutoff);\n\t});\n\nconst parseOpenCodeEffect: (\n\topts: ParseOpenCodeOptions,\n) => Effect.Effect<readonly ParsedBucket[], ParseOpenCodeError, OpenCodeIo> = Effect.fn(\n\t\"OpenCodeParser.parseOpenCodeEffect\",\n)((opts: ParseOpenCodeOptions) => Stream.runCollect(parseOpenCodeStream(opts)));\n\nconst parseOpenCodeStream = (opts: ParseOpenCodeOptions): Stream.Stream<ParsedBucket, ParseOpenCodeError, OpenCodeIo> =>\n\tStream.unwrap(\n\t\tEffect.gen(function* () {\n\t\t\tconst logger = opts.logger ?? silentLogger;\n\t\t\tconst root = opts.root ?? resolveOpenCodeRoot();\n\t\t\tconst sources = yield* discoverOpenCodeSourcesEffect(root, opts.cutoff);\n\t\t\tif (sources._tag === \"Missing\") {\n\t\t\t\treturn Stream.empty;\n\t\t\t}\n\n\t\t\tif (sources._tag === \"JsonFile\") {\n\t\t\t\treturn openCodeJsonFileStreams(Stream.succeed(sources.path));\n\t\t\t}\n\n\t\t\tif (sources._tag === \"DatabaseFiles\") {\n\t\t\t\treturn openCodeDatabaseStreams(sources.paths, opts, logger);\n\t\t\t}\n\n\t\t\treturn openCodeJsonFileStreams(sources.paths);\n\t\t}),\n\t);\n\nfunction openCodeDatabaseStreams(\n\tpaths: readonly string[],\n\topts: ParseOpenCodeOptions,\n\tlogger: Logger,\n): Stream.Stream<ParsedBucket, OpenCodeIoError, OpenCodeIo> {\n\tlet stream: Stream.Stream<ParsedBucket, OpenCodeIoError, OpenCodeIo> = Stream.empty;\n\tfor (const dbPath of paths) {\n\t\tstream = stream.pipe(\n\t\t\tStream.concat(\n\t\t\t\tStream.fromIterableEffect(bucketizeOpenCodeDatabaseEffect(dbPath, opts.cutoff, logger, opts.excludePath)),\n\t\t\t),\n\t\t);\n\t}\n\treturn stream;\n}\n\nfunction openCodeJsonFileStreams(\n\tpaths: OpenCodeJsonPathStream,\n): Stream.Stream<ParsedBucket, OpenCodeIoError, OpenCodeIo> {\n\treturn paths.pipe(Stream.flatMap((file) => Stream.fromIterableEffect(bucketizeOpenCodeJsonFileEffect(file))));\n}\n\nconst parseOpenCodeCompatibilityStream = (\n\topts: ParseOpenCodeOptions,\n): Stream.Stream<ParsedBucket, ParserSourceReadError, OpenCodeIo> =>\n\tStream.unwrap(\n\t\tEffect.gen(function* () {\n\t\t\tconst logger = opts.logger ?? stderrLogger;\n\t\t\tconst root = opts.root ?? resolveOpenCodeRoot();\n\t\t\tconst sources = yield* discoverOpenCodeSourcesEffect(root, opts.cutoff);\n\t\t\tif (sources._tag === \"Missing\") {\n\t\t\t\treturn Stream.empty;\n\t\t\t}\n\n\t\t\tif (sources._tag === \"JsonFile\") {\n\t\t\t\treturn openCodeJsonFileCompatibilityStreams(Stream.succeed(sources.path), logger);\n\t\t\t}\n\n\t\t\tif (sources._tag === \"DatabaseFiles\") {\n\t\t\t\tlet stream: Stream.Stream<ParsedBucket, ParserSourceReadError> = Stream.empty;\n\t\t\t\tfor (const dbPath of sources.paths) {\n\t\t\t\t\tstream = stream.pipe(\n\t\t\t\t\t\tStream.concat(\n\t\t\t\t\t\t\tparsedBucketStreamFromAsyncIterable(\n\t\t\t\t\t\t\t\tbucketizeOpenCodeDatabase(dbPath, opts.cutoff, logger, opts.excludePath),\n\t\t\t\t\t\t\t\tdbPath,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn stream;\n\t\t\t}\n\n\t\t\treturn openCodeJsonFileCompatibilityStreams(sources.paths, logger);\n\t\t}),\n\t);\n\nfunction openCodeJsonFileCompatibilityStreams(\n\tpaths: OpenCodeJsonPathStream,\n\tlogger: Logger,\n): Stream.Stream<ParsedBucket, ParserSourceReadError> {\n\treturn paths.pipe(\n\t\tStream.flatMap((file) => parsedBucketStreamFromAsyncIterable(bucketizeOpenCodeJsonFile(file, logger), file)),\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 ?? stderrLogger;\n\tconst stream = parseOpenCodeCompatibilityStream({ ...opts, logger: logger }).pipe(\n\t\tStream.catchTag(\"ParserSourceReadError\", () =>\n\t\t\tStream.fromEffectDrain(\n\t\t\t\tEffect.sync(() => logger.warn(\"failed to parse opencode source\", { root: opts.root ?? resolveOpenCodeRoot() })),\n\t\t\t),\n\t\t),\n\t\tStream.provide(OpenCodeIoLive),\n\t);\n\tyield* Stream.toAsyncIterable(stream);\n}\n\nexport type { ParseOpenCodeError, ParseOpenCodeOptions };\nexport { parseOpenCode, parseOpenCodeEffect, parseOpenCodeStream };\n","import { Effect } from \"effect\";\nimport { startOfUtcHour } from \"../codex/bucketize\";\nimport { OpenCodeIo, OpenCodeIoError, OpenCodeIoLive } from \"../effect/opencode-io\";\nimport type { LocalPathFilter, Logger, ParsedBucket } from \"../types\";\nimport { type OpenCodeUsage, pickOpenCodeUsage } from \"./events\";\n\nconst MISSING_SESSION_MESSAGE_TABLE_PATTERN = /no such table: session_message/u;\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\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\tif (err instanceof OpenCodeIoError) {\n\t\treturn (\n\t\t\tMISSING_SESSION_MESSAGE_TABLE_PATTERN.test(err.message) ||\n\t\t\t(err.cause instanceof Error && MISSING_SESSION_MESSAGE_TABLE_PATTERN.test(err.cause.message))\n\t\t);\n\t}\n\treturn err instanceof Error && MISSING_SESSION_MESSAGE_TABLE_PATTERN.test(err.message);\n}\n\nconst bucketizeOpenCodeDatabaseEffect: (\n\tpath: string,\n\tcutoff: Date,\n\tlogger: Logger,\n\texcludePath?: LocalPathFilter,\n) => Effect.Effect<readonly ParsedBucket[], OpenCodeIoError, OpenCodeIo> = Effect.fn(\"bucketizeOpenCodeDatabaseEffect\")(\n\tfunction* (path: string, cutoff: Date, logger: Logger, excludePath?: LocalPathFilter) {\n\t\t// Intentionally bounded: node:sqlite DatabaseSync exposes synchronous\n\t\t// result sets, and the cutoff query bounds rows before aggregation. Legacy\n\t\t// JSON source discovery streams paths; SQLite can move once row streaming\n\t\t// exists at the IO boundary.\n\t\tconst io = yield* OpenCodeIo;\n\t\tconst rows = yield* io.readSqlite(path, cutoff);\n\t\tconst accumulators = new Map<string, BucketAccumulator>();\n\n\t\tfor (const row of rows.sessionMessages) {\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, rows.sessionPaths, excludePath)) {\n\t\t\t\taddUsage(accumulators, usage);\n\t\t\t}\n\t\t}\n\t\treturn [...finalizedBuckets(accumulators)];\n\t},\n);\n\nasync function* bucketizeOpenCodeDatabase(\n\tpath: string,\n\tcutoff: Date,\n\tlogger: Logger,\n\texcludePath?: LocalPathFilter,\n): AsyncIterable<ParsedBucket> {\n\ttry {\n\t\tconst buckets = await bucketizeOpenCodeDatabaseEffect(path, cutoff, logger, excludePath).pipe(\n\t\t\tEffect.provide(OpenCodeIoLive),\n\t\t\tEffect.runPromise,\n\t\t);\n\t\tyield* buckets;\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}\n}\n\nconst bucketizeOpenCodeJsonFileEffect: (\n\tpath: string,\n) => Effect.Effect<readonly ParsedBucket[], OpenCodeIoError, OpenCodeIo> = Effect.fn(\"bucketizeOpenCodeJsonFileEffect\")(\n\tfunction* (path: string) {\n\t\tconst io = yield* OpenCodeIo;\n\t\tconst parsed = yield* io.readJsonFile(path);\n\t\tconst usage = pickOpenCodeUsage(parsed);\n\t\tif (usage === undefined) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst accumulators = new Map<string, BucketAccumulator>();\n\t\taddUsage(accumulators, usage);\n\t\treturn [...finalizedBuckets(accumulators)];\n\t},\n);\n\nasync function* bucketizeOpenCodeJsonFile(path: string, logger: Logger): AsyncIterable<ParsedBucket> {\n\ttry {\n\t\tconst buckets = await bucketizeOpenCodeJsonFileEffect(path).pipe(Effect.provide(OpenCodeIoLive), Effect.runPromise);\n\t\tyield* buckets;\n\t} catch {\n\t\tlogger.warn(\"malformed opencode json file\", { path: path });\n\t}\n}\n\nexport {\n\tbucketizeOpenCodeDatabase,\n\tbucketizeOpenCodeDatabaseEffect,\n\tbucketizeOpenCodeJsonFile,\n\tbucketizeOpenCodeJsonFileEffect,\n};\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 { basename, join } from \"node:path\";\nimport { Effect, Layer, Stream } from \"effect\";\nimport { resolveHermesRoot, resolvePiRoot } from \"../config\";\nimport { type FileWalker, type FileWalkerFilesystemError, FileWalkerLive } from \"../effect/file-walker\";\nimport { type HermesSqlite, type HermesSqliteError, HermesSqliteLive } from \"../effect/hermes-sqlite\";\nimport type { LocalPathFilter, Logger, ParsedBucket, ParserSourceReadError } from \"../types\";\nimport { pathKindEffect, pathKindEffectStrict, walkStream, walkStreamStrict } from \"../walk\";\nimport { silentLogger, stderrLogger } from \"../warnings\";\nimport {\n\ttype BucketizePiStyleFileOptions,\n\tbucketizeHermesDatabaseEffect,\n\tbucketizePiStyleFileStream,\n\ttype PiStyleHarness,\n} 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. Strict Effect/Stream entrypoints default to `silentLogger`. */\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\ntype ParsePiError = FileWalkerFilesystemError | ParserSourceReadError;\ntype ParseHermesError = ParsePiError | HermesSqliteError;\n\nconst isFileBestEffortEffect = (path: string): Effect.Effect<boolean, never, FileWalker> =>\n\tpathKindEffect(path).pipe(Effect.map((kind) => kind === \"file\"));\n\nfunction bucketizePiStyleSourcesStream<E, R>(\n\tfiles: Stream.Stream<string, E, R>,\n\tharness: PiStyleHarness,\n\tlogger: Logger,\n\toptions: BucketizePiStyleFileOptions,\n): Stream.Stream<ParsedBucket, E | ParserSourceReadError, R> {\n\treturn files.pipe(\n\t\tStream.flatMap((file) => bucketizePiStyleFileStream(file, harness, logger, options), { concurrency: 1 }),\n\t);\n}\n\nconst parsePiStyleStream: (\n\topts: ParsePiOptions,\n\tharness: PiStyleHarness,\n\tdefaultRoot: () => string,\n) => Stream.Stream<ParsedBucket, ParsePiError, FileWalker> = (opts, harness, defaultRoot) =>\n\tStream.unwrap(\n\t\tEffect.gen(function* () {\n\t\t\tconst logger = opts.logger ?? silentLogger;\n\t\t\tconst root = opts.root ?? defaultRoot();\n\t\t\tconst kind = yield* pathKindEffectStrict(root);\n\n\t\t\tif (kind === \"file\") {\n\t\t\t\treturn bucketizePiStyleFileStream(root, harness, logger, {\n\t\t\t\t\tcutoff: opts.cutoff,\n\t\t\t\t\texcludePath: opts.excludePath,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst seenMessageIds = new Set<string>();\n\t\t\treturn bucketizePiStyleSourcesStream(walkStreamStrict(root, opts.cutoff), harness, logger, {\n\t\t\t\tcutoff: opts.cutoff,\n\t\t\t\texcludePath: opts.excludePath,\n\t\t\t\tseenMessageIds: seenMessageIds,\n\t\t\t});\n\t\t}),\n\t);\n\nconst parsePiStyleCompatibilityStream: (\n\topts: ParsePiOptions,\n\tharness: PiStyleHarness,\n\tdefaultRoot: () => string,\n) => Stream.Stream<ParsedBucket, ParserSourceReadError, FileWalker> = (opts, harness, defaultRoot) =>\n\tStream.unwrap(\n\t\tEffect.gen(function* () {\n\t\t\tconst logger = opts.logger ?? stderrLogger;\n\t\t\tconst root = opts.root ?? defaultRoot();\n\n\t\t\tif (yield* isFileBestEffortEffect(root)) {\n\t\t\t\treturn bucketizePiStyleFileStream(root, harness, logger, {\n\t\t\t\t\tcutoff: opts.cutoff,\n\t\t\t\t\texcludePath: opts.excludePath,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst seenMessageIds = new Set<string>();\n\t\t\treturn bucketizePiStyleSourcesStream(walkStream(root, opts.cutoff), harness, logger, {\n\t\t\t\tcutoff: opts.cutoff,\n\t\t\t\texcludePath: opts.excludePath,\n\t\t\t\tseenMessageIds: seenMessageIds,\n\t\t\t});\n\t\t}),\n\t);\n\nconst parsePiEffect: (opts: ParsePiOptions) => Effect.Effect<readonly ParsedBucket[], ParsePiError, FileWalker> =\n\tEffect.fn(\"PiParser.parsePiEffect\")((opts: ParsePiOptions) => Stream.runCollect(parsePiStream(opts)));\n\nconst parsePiStream = (opts: ParsePiOptions): Stream.Stream<ParsedBucket, ParsePiError, FileWalker> =>\n\tparsePiStyleStream(opts, \"pi\", resolvePiRoot);\n\nasync function* parsePiStyle(\n\topts: ParsePiOptions,\n\tharness: PiStyleHarness,\n\tdefaultRoot: () => string,\n): AsyncIterable<ParsedBucket> {\n\tconst logger = opts.logger ?? stderrLogger;\n\tconst stream = parsePiStyleCompatibilityStream({ ...opts, logger: logger }, harness, defaultRoot).pipe(\n\t\tStream.catchTag(\"ParserSourceReadError\", () =>\n\t\t\tStream.fromEffectDrain(\n\t\t\t\tEffect.sync(() =>\n\t\t\t\t\tlogger.warn(\"failed to parse pi-style source\", { root: opts.root ?? defaultRoot(), harness: harness }),\n\t\t\t\t),\n\t\t\t),\n\t\t),\n\t\tStream.provide(FileWalkerLive),\n\t);\n\tyield* Stream.toAsyncIterable(stream);\n}\n\nasync function* parsePi(opts: ParsePiOptions): AsyncIterable<ParsedBucket> {\n\tyield* parsePiStyle(opts, \"pi\", resolvePiRoot);\n}\n\nconst parserLive = Layer.mergeAll(FileWalkerLive, HermesSqliteLive);\n\nconst parseHermesEffect: (\n\topts: ParsePiOptions,\n) => Effect.Effect<readonly ParsedBucket[], ParseHermesError, FileWalker | HermesSqlite> = Effect.fn(\n\t\"HermesParser.parseHermesEffect\",\n)((opts: ParsePiOptions) => Stream.runCollect(parseHermesStream(opts)));\n\nconst parseHermesStream = (\n\topts: ParsePiOptions,\n): Stream.Stream<ParsedBucket, ParseHermesError, FileWalker | HermesSqlite> =>\n\tStream.unwrap(\n\t\tEffect.gen(function* () {\n\t\t\tconst logger = opts.logger ?? silentLogger;\n\t\t\tconst root = opts.root ?? resolveHermesRoot();\n\t\t\tconst kind = yield* pathKindEffectStrict(root);\n\t\t\tif (kind === \"missing\") {\n\t\t\t\treturn asHermesStream(Stream.empty);\n\t\t\t}\n\n\t\t\tif (kind === \"file\") {\n\t\t\t\tif (basename(root).endsWith(\".db\")) {\n\t\t\t\t\treturn asHermesStream(\n\t\t\t\t\t\tStream.fromIterableEffect(bucketizeHermesDatabaseEffect(root, opts.cutoff, opts.excludePath)),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn asHermesStream(\n\t\t\t\t\tbucketizePiStyleFileStream(root, \"hermes\", logger, { cutoff: opts.cutoff, excludePath: opts.excludePath }),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst stateDb = join(root, \"state.db\");\n\t\t\tif (yield* isFileBestEffortEffect(stateDb)) {\n\t\t\t\treturn asHermesStream(\n\t\t\t\t\tStream.fromIterableEffect(bucketizeHermesDatabaseEffect(stateDb, opts.cutoff, opts.excludePath)),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst sessionsRoot = join(root, \"sessions\");\n\t\t\tif ((yield* pathKindEffect(sessionsRoot)) === \"directory\") {\n\t\t\t\treturn asHermesStream(collectHermesPiStyleDirectoryStream(sessionsRoot, logger, opts));\n\t\t\t}\n\n\t\t\tconst agentSessionsRoot = join(root, \"agent\", \"sessions\");\n\t\t\tif ((yield* pathKindEffect(agentSessionsRoot)) === \"directory\") {\n\t\t\t\treturn asHermesStream(collectHermesPiStyleDirectoryStream(agentSessionsRoot, logger, opts));\n\t\t\t}\n\n\t\t\treturn asHermesStream(collectHermesPiStyleDirectoryStream(root, logger, opts));\n\t\t}),\n\t);\n\nfunction asHermesStream(\n\tstream: Stream.Stream<ParsedBucket, ParseHermesError, FileWalker | HermesSqlite>,\n): Stream.Stream<ParsedBucket, ParseHermesError, FileWalker | HermesSqlite> {\n\treturn stream;\n}\n\nconst collectHermesPiStyleDirectoryStream = (\n\troot: string,\n\tlogger: Logger,\n\topts: ParsePiOptions,\n): Stream.Stream<ParsedBucket, ParsePiError, FileWalker> =>\n\tStream.unwrap(\n\t\tEffect.sync(() => {\n\t\t\tconst seenMessageIds = new Set<string>();\n\t\t\treturn bucketizePiStyleSourcesStream(walkStreamStrict(root, opts.cutoff), \"hermes\", logger, {\n\t\t\t\tcutoff: opts.cutoff,\n\t\t\t\texcludePath: opts.excludePath,\n\t\t\t\tseenMessageIds: seenMessageIds,\n\t\t\t});\n\t\t}),\n\t);\n\nconst parseHermesCompatibilityStream = (\n\topts: ParsePiOptions,\n): Stream.Stream<ParsedBucket, ParserSourceReadError | HermesSqliteError, FileWalker | HermesSqlite> =>\n\tparseHermesStream(opts).pipe(\n\t\tStream.catchTag(\"FileWalkerFilesystemError\", () => Stream.empty),\n\t\tStream.catchTag(\"ParserSourceReadError\", () => Stream.empty),\n\t);\n\nasync function* parseHermes(opts: ParsePiOptions): AsyncIterable<ParsedBucket> {\n\tconst logger = opts.logger ?? stderrLogger;\n\tconst stream = parseHermesCompatibilityStream({ ...opts, logger: logger }).pipe(\n\t\tStream.catchTag(\"HermesSqliteError\", (error) =>\n\t\t\tStream.fromEffectDrain(\n\t\t\t\tEffect.sync(() => logger.warn(\"failed to parse hermes sqlite database\", { path: error.path })),\n\t\t\t),\n\t\t),\n\t\tStream.provide(parserLive),\n\t);\n\tyield* Stream.toAsyncIterable(stream);\n}\n\nexport type { ParseHermesError, ParsePiError, ParsePiOptions };\nexport { parseHermes, parseHermesEffect, parseHermesStream, parsePi, parsePiEffect, parsePiStream };\n","import { createReadStream } from \"node:fs\";\nimport { createInterface } from \"node:readline\";\nimport { Cause, Effect, Queue, Stream } from \"effect\";\nimport { startOfUtcHour } from \"../codex/bucketize\";\nimport {\n\tHermesSqlite,\n\ttype HermesSqliteError,\n\tHermesSqliteLive,\n\ttype HermesSqliteSessionRow,\n} from \"../effect/hermes-sqlite\";\nimport {\n\ttype Harness,\n\ttype LocalPathFilter,\n\ttype Logger,\n\tmakeParserSourceReadError,\n\ttype ParsedBucket,\n\ttype ParserSourceReadError,\n} from \"../types\";\nimport { isPiAssistantMessageEntry, isPiSessionEntry } from \"./events\";\n\nconst MILLISECONDS_PER_SECOND = 1000;\nconst UNIX_MILLISECONDS_THRESHOLD = 1_000_000_000_000;\n\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 cutoff?: Date;\n\treadonly seenMessageIds?: Set<string>;\n\treadonly excludePath?: LocalPathFilter;\n};\n\ntype PiStyleFileAccumulator = {\n\tbuckets: Map<string, BucketAccumulator>;\n\texcluded: boolean;\n\tlineNo: number;\n\tseenMessageIds: Set<string>;\n\tsessionLastSeenAt: Date | undefined;\n\tsessionStartedAt: Date | undefined;\n};\n\ntype PiStyleLineContext = {\n\treadonly path: string;\n\treadonly logger: Logger;\n\treadonly options: BucketizePiStyleFileOptions;\n};\n\nfunction key(hourUtc: Date, model: string): string {\n\treturn `${hourUtc.toISOString()}|${model}`;\n}\n\nfunction lineStreamFromFile(path: string): Stream.Stream<string, ParserSourceReadError> {\n\treturn Stream.callback<string, ParserSourceReadError>((queue) =>\n\t\tEffect.acquireRelease(\n\t\t\tEffect.sync(() => {\n\t\t\t\tlet done = false;\n\t\t\t\tconst stream = createReadStream(path, { encoding: \"utf8\" });\n\t\t\t\tconst rl = createInterface({ input: stream, crlfDelay: Number.POSITIVE_INFINITY });\n\n\t\t\t\tconst offer = (line: string): void => {\n\t\t\t\t\tif (!done) {\n\t\t\t\t\t\tQueue.offerUnsafe(queue, line);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tconst end = (): void => {\n\t\t\t\t\tif (!done) {\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t\tQueue.endUnsafe(queue);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tconst fail = (error: unknown): void => {\n\t\t\t\t\tif (!done) {\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t\tQueue.failCauseUnsafe(queue, Cause.fail(makeParserSourceReadError(path, error)));\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tstream.once(\"error\", fail);\n\t\t\t\trl.once(\"error\", fail);\n\t\t\t\trl.once(\"close\", end);\n\t\t\t\trl.on(\"line\", offer);\n\n\t\t\t\treturn {\n\t\t\t\t\tclose: () => {\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t\trl.off(\"close\", end);\n\t\t\t\t\t\trl.off(\"error\", fail);\n\t\t\t\t\t\trl.off(\"line\", offer);\n\t\t\t\t\t\tstream.off(\"error\", fail);\n\t\t\t\t\t\trl.close();\n\t\t\t\t\t\tstream.destroy();\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}),\n\t\t\t(resource) => Effect.sync(() => resource.close()),\n\t\t),\n\t);\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\nfunction hermesRowToBucket(\n\trow: HermesSqliteSessionRow,\n\texcludePath: LocalPathFilter | undefined,\n): 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\nfunction bucketizeHermesRows(\n\trows: readonly HermesSqliteSessionRow[],\n\texcludePath: LocalPathFilter | undefined,\n): readonly ParsedBucket[] {\n\tconst buckets: ParsedBucket[] = [];\n\tfor (const row of rows) {\n\t\tconst bucket = hermesRowToBucket(row, excludePath);\n\t\tif (bucket !== undefined) {\n\t\t\tbuckets.push(bucket);\n\t\t}\n\t}\n\treturn buckets;\n}\n\nfunction makePiStyleFileAccumulator(options: BucketizePiStyleFileOptions): PiStyleFileAccumulator {\n\treturn {\n\t\tbuckets: new Map(),\n\t\texcluded: false,\n\t\tlineNo: 0,\n\t\tseenMessageIds: options.seenMessageIds ?? new Set(),\n\t\tsessionLastSeenAt: undefined,\n\t\tsessionStartedAt: undefined,\n\t};\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: line-by-line parser with necessary branching\nfunction accumulatePiStyleLine(\n\tcontext: PiStyleLineContext,\n\tacc: PiStyleFileAccumulator,\n\traw: string,\n): PiStyleFileAccumulator {\n\tconst { logger, options, path } = context;\n\tacc.lineNo += 1;\n\tif (acc.excluded) {\n\t\treturn acc;\n\t}\n\n\tconst trimmed = raw.trim();\n\tif (trimmed.length === 0) {\n\t\treturn acc;\n\t}\n\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(trimmed);\n\t} catch {\n\t\tlogger.warn(\"malformed jsonl line\", { path: path, line: acc.lineNo });\n\t\treturn acc;\n\t}\n\n\tif (isPiSessionEntry(parsed)) {\n\t\tif (parsed.cwd !== undefined && options.excludePath?.(parsed.cwd) === true) {\n\t\t\tacc.excluded = true;\n\t\t\tacc.buckets.clear();\n\t\t}\n\t\treturn acc;\n\t}\n\n\tif (!isPiAssistantMessageEntry(parsed)) {\n\t\treturn acc;\n\t}\n\tif (parsed.message.stopReason === \"aborted\" || parsed.message.stopReason === \"error\") {\n\t\treturn acc;\n\t}\n\tif (parsed.id !== undefined) {\n\t\tif (acc.seenMessageIds.has(parsed.id)) {\n\t\t\treturn acc;\n\t\t}\n\t\tacc.seenMessageIds.add(parsed.id);\n\t}\n\n\tconst tsMs = eventTimestampMs(parsed);\n\tif (!Number.isFinite(tsMs)) {\n\t\treturn acc;\n\t}\n\tconst eventAt = new Date(tsMs);\n\tif (options.cutoff !== undefined && eventAt.getTime() < options.cutoff.getTime()) {\n\t\treturn acc;\n\t}\n\n\tconst model = modelId(parsed.message.provider, parsed.message.model);\n\tif (model === undefined) {\n\t\treturn acc;\n\t}\n\n\tconst { usage } = parsed.message;\n\tconst inputTokens = Math.max(0, usage.input ?? 0);\n\tconst outputTokens = Math.max(0, usage.output ?? 0);\n\tconst cacheReadTokens = Math.max(0, usage.cacheRead ?? 0);\n\tconst cacheCreateTokens = Math.max(0, usage.cacheWrite ?? 0);\n\tif (inputTokens === 0 && outputTokens === 0 && cacheReadTokens === 0 && cacheCreateTokens === 0) {\n\t\treturn acc;\n\t}\n\n\tif (acc.sessionStartedAt === undefined || eventAt.getTime() < acc.sessionStartedAt.getTime()) {\n\t\tacc.sessionStartedAt = eventAt;\n\t}\n\tif (acc.sessionLastSeenAt === undefined || eventAt.getTime() > acc.sessionLastSeenAt.getTime()) {\n\t\tacc.sessionLastSeenAt = eventAt;\n\t}\n\n\tconst hourUtc = startOfUtcHour(eventAt);\n\tconst k = key(hourUtc, model);\n\tconst existing = acc.buckets.get(k);\n\tif (existing === undefined) {\n\t\tacc.buckets.set(k, {\n\t\t\thourUtc: hourUtc,\n\t\t\tmodel: model,\n\t\t\tinputTokens: inputTokens,\n\t\t\toutputTokens: outputTokens,\n\t\t\tcacheReadTokens: cacheReadTokens,\n\t\t\tcacheCreateTokens: cacheCreateTokens,\n\t\t});\n\t\treturn acc;\n\t}\n\n\texisting.inputTokens += inputTokens;\n\texisting.outputTokens += outputTokens;\n\texisting.cacheReadTokens += cacheReadTokens;\n\texisting.cacheCreateTokens += cacheCreateTokens;\n\treturn acc;\n}\n\nfunction bucketsFromAccumulator(\n\tpath: string,\n\tharness: PiStyleHarness,\n\tacc: PiStyleFileAccumulator,\n): readonly ParsedBucket[] {\n\tif (acc.excluded || acc.sessionStartedAt === undefined || acc.sessionLastSeenAt === undefined) {\n\t\treturn [];\n\t}\n\n\tconst sessionStartedAt = acc.sessionStartedAt;\n\tconst sessionLastSeenAt = acc.sessionLastSeenAt;\n\tconst sessionIds: ReadonlySet<string> = new Set([path]);\n\treturn Array.from(acc.buckets.values(), (bucket) => ({\n\t\tharness: harness,\n\t\tmodel: bucket.model,\n\t\thourUtc: bucket.hourUtc,\n\t\tinputTokens: bucket.inputTokens,\n\t\toutputTokens: bucket.outputTokens,\n\t\tcacheReadTokens: bucket.cacheReadTokens,\n\t\tcacheCreateTokens: bucket.cacheCreateTokens,\n\t\tsessionIds: sessionIds,\n\t\tsessionStartedAt: sessionStartedAt,\n\t\tsessionLastSeenAt: sessionLastSeenAt,\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 */\nfunction bucketizePiStyleFileStream(\n\tpath: string,\n\tharness: PiStyleHarness,\n\tlogger: Logger,\n\toptions: BucketizePiStyleFileOptions = {},\n): Stream.Stream<ParsedBucket, ParserSourceReadError> {\n\tconst context: PiStyleLineContext = { logger: logger, options: options, path: path };\n\treturn Stream.unwrap(\n\t\tlineStreamFromFile(path).pipe(\n\t\t\tStream.runFold(\n\t\t\t\t() => makePiStyleFileAccumulator(options),\n\t\t\t\t(acc, raw) => accumulatePiStyleLine(context, acc, raw),\n\t\t\t),\n\t\t\tEffect.map((acc) => Stream.fromIterable(bucketsFromAccumulator(path, harness, acc))),\n\t\t),\n\t);\n}\n\nasync function* bucketizePiStyleFile(\n\tpath: string,\n\tharness: PiStyleHarness,\n\tlogger: Logger,\n\toptions: BucketizePiStyleFileOptions = {},\n): AsyncIterable<ParsedBucket> {\n\tyield* Stream.toAsyncIterable(bucketizePiStyleFileStream(path, harness, logger, options));\n}\n\nconst bucketizeHermesDatabaseEffect: (\n\tpath: string,\n\tcutoff: Date,\n\texcludePath?: LocalPathFilter,\n) => Effect.Effect<readonly ParsedBucket[], HermesSqliteError, HermesSqlite> = Effect.fn(\n\t\"bucketizeHermesDatabaseEffect\",\n)(function* (path: string, cutoff: Date, excludePath?: LocalPathFilter) {\n\tconst sqlite = yield* HermesSqlite;\n\t// The SQLite service owns the cutoff-bounded collection boundary; bucketizing\n\t// stays pure so the public parser can keep database access explicit.\n\tconst rows = yield* sqlite.readSessionRows(path, cutoff);\n\treturn bucketizeHermesRows(rows, excludePath);\n});\n\nasync function* bucketizeHermesDatabase(\n\tpath: string,\n\tcutoff: Date,\n\tlogger: Logger,\n\texcludePath?: LocalPathFilter,\n): AsyncIterable<ParsedBucket> {\n\ttry {\n\t\tconst buckets = await bucketizeHermesDatabaseEffect(path, cutoff, excludePath).pipe(\n\t\t\tEffect.provide(HermesSqliteLive),\n\t\t\tEffect.runPromise,\n\t\t);\n\t\tyield* buckets;\n\t} catch {\n\t\tlogger.warn(\"failed to parse hermes sqlite database\", { path: path });\n\t}\n}\n\nexport type { BucketizePiStyleFileOptions, PiStyleHarness };\nexport { bucketizeHermesDatabase, bucketizeHermesDatabaseEffect, bucketizePiStyleFile, bucketizePiStyleFileStream };\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"],"mappings":"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","names":["process","fileURLToPath","NodeServices","Effect","Layer","Option","key","readHomedir","readHostname","process","Effect","FileSystem","Effect","FileSystem","process","readHomedir","readHostname","join","NodeFileSystem","Context","Effect","FileSystem","Layer","Schema","Context","Schema","Effect","readDir","join","FileSystem","Layer","NodeFileSystem","Context","Effect","Layer","Effect","Stream","Effect","Schema","Stream","Stream","Effect","Schema","ParserSourceError","Context","Schema","Schema","Schema","Schema","Schema","Context","Schema","Rpc","RpcGroup","Schema","UUID_V7_VERSION","Schema","RpcGroup","Rpc","Schema","Schema","Rpc","RpcGroup","Effect","Schema","Schema","UUID_V7_VERSION","CIVIL_DATE_PATTERN","Effect","RpcGroup","Rpc","Schema","Schema","Rpc","RpcGroup","Schema","Schema","RpcGroup","Rpc","Schema","Schema","Rpc","RpcGroup","Effect","Schema","MIN_DEVICE_NAME_LENGTH","MAX_DEVICE_NAME_LENGTH","Schema","deviceNameSchema","MIN_DEVICE_NAME_LENGTH","MAX_DEVICE_NAME_LENGTH","Effect","RpcGroup","Rpc","Schema","Context","Effect","Layer","Effect","Layer","Schema","Context","Effect","Layer","Schema","Stream","errorMessage","HOURS_PER_DAY","MINUTES_PER_HOUR","SECONDS_PER_MINUTE","MS_PER_SECOND","MS_PER_DAY","Effect","MS_PER_DAY","logInfo","plan","phase","localSessionText","Stream","colorize","formatNumber","plural","Context","Layer","Effect","runSyncProgram","join","NodeFileSystem","Context","Effect","FileSystem","Layer","Schema","Schema","Context","errorMessage","writeLine","Effect","Layer","FileSystem","join","apiFlag","NodeFileSystem","dirname","isAbsolute","join","dirname","Effect","Stream","homedir","isAbsolute","join","process","Config","ConfigProvider","Effect","Schema","runtimeEnv","toConfigEnv","homedir","join","isAbsolute","join","NodeFileSystem","Context","Effect","FileSystem","Layer","Option","Schema","Stream","Effect","Stream","Effect","Stream","Effect","createReadStream","createInterface","Cause","Effect","Queue","Stream","createInterface","Effect","Stream","Schema","Stream","key","Stream","Effect","createInterface","model","isObject","isFiniteNumber","key","shouldExcludePath","lineStreamFromFile","Stream","Effect","createReadStream","createInterface","Queue","Cause","addToBucket","markSessionSeen","bucketsFromAccumulator","dirname","Stream","Effect","Effect","Stream","Effect","Stream","Stream","Context","Effect","Layer","Schema","basename","join","NodeFileSystem","Context","Effect","FileSystem","Layer","Option","Schema","Stream","NODE_SQLITE_SPECIFIER","OPENCODE_DB_FILE_PATTERN","readDir","readStat","loadDatabaseSync","openDatabase","closeDatabase","Effect","Stream","Effect","isObject","isFiniteNumber","modelId","key","Effect","Effect","Effect","Stream","basename","join","Effect","Layer","Stream","createReadStream","createInterface","Cause","Effect","Queue","Stream","isObject","isFiniteNumber","MILLISECONDS_PER_SECOND","key","lineStreamFromFile","Stream","Effect","createReadStream","createInterface","Queue","Cause","modelId","positive","timestampMs","bucketsFromAccumulator","Effect","Effect","Stream","Effect","Stream","Layer","Effect","Stream","basename","join","sessionsRoot","Effect","Layer","Stream","Layer","join","isAbsolute","dirname","Effect","Stream","Layer","NodeServices","Option","process","fileURLToPath","Effect","runSyncProgram"]}
|