@cookielab.io/oopst 0.6.2 → 0.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2304 -882
- package/dist/index.js.map +1 -1
- package/package.json +3 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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\ttype CodexUsageCounters,\n\textractCodexUsageSnapshot,\n\tisCodexSessionMetaEvent,\n\tisCodexTokenCountEvent,\n\tisCodexTurnContextEvent,\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 NormalizedUsage = {\n\treadonly inputTokens: number;\n\treadonly outputTokens: number;\n\treadonly cacheReadTokens: number;\n};\n\ntype PendingCodexUsage = {\n\treadonly eventAt: Date;\n\treadonly usage: NormalizedUsage;\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\tpreviousTotalUsage: NormalizedUsage | undefined;\n\tpendingUsage: PendingCodexUsage[];\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\tpreviousTotalUsage: undefined,\n\t\tpendingUsage: [],\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 normalizeUsage(usage: CodexUsageCounters): NormalizedUsage {\n\treturn {\n\t\tinputTokens: Math.max(0, usage.input_tokens ?? 0),\n\t\toutputTokens: Math.max(0, usage.output_tokens ?? 0),\n\t\tcacheReadTokens: Math.max(0, usage.cached_input_tokens ?? usage.cache_read_input_tokens ?? 0),\n\t};\n}\n\nfunction sameUsage(a: NormalizedUsage, b: NormalizedUsage): boolean {\n\treturn (\n\t\ta.inputTokens === b.inputTokens && a.outputTokens === b.outputTokens && a.cacheReadTokens === b.cacheReadTokens\n\t);\n}\n\nfunction positiveUsage(usage: NormalizedUsage): boolean {\n\treturn usage.inputTokens > 0 || usage.outputTokens > 0 || usage.cacheReadTokens > 0;\n}\n\nfunction cumulativeDelta(current: NormalizedUsage, previous: NormalizedUsage | undefined): NormalizedUsage {\n\tif (previous === undefined) {\n\t\treturn current;\n\t}\n\treturn {\n\t\tinputTokens:\n\t\t\tcurrent.inputTokens < previous.inputTokens ? current.inputTokens : current.inputTokens - previous.inputTokens,\n\t\toutputTokens:\n\t\t\tcurrent.outputTokens < previous.outputTokens\n\t\t\t\t? current.outputTokens\n\t\t\t\t: current.outputTokens - previous.outputTokens,\n\t\tcacheReadTokens:\n\t\t\tcurrent.cacheReadTokens < previous.cacheReadTokens\n\t\t\t\t? current.cacheReadTokens\n\t\t\t\t: current.cacheReadTokens - previous.cacheReadTokens,\n\t};\n}\n\nfunction usageIncrement(\n\tacc: CodexFileAccumulator,\n\tlast: CodexUsageCounters | undefined,\n\ttotal: CodexUsageCounters | undefined,\n): NormalizedUsage | undefined {\n\tconst normalizedTotal = total === undefined ? undefined : normalizeUsage(total);\n\tif (normalizedTotal !== undefined) {\n\t\tif (acc.previousTotalUsage !== undefined && sameUsage(acc.previousTotalUsage, normalizedTotal)) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst increment =\n\t\t\tlast === undefined ? cumulativeDelta(normalizedTotal, acc.previousTotalUsage) : normalizeUsage(last);\n\t\tacc.previousTotalUsage = normalizedTotal;\n\t\treturn positiveUsage(increment) ? increment : undefined;\n\t}\n\n\tif (last === undefined) {\n\t\treturn undefined;\n\t}\n\tconst increment = normalizeUsage(last);\n\treturn positiveUsage(increment) ? increment : undefined;\n}\n\nfunction addToBucket(acc: CodexFileAccumulator, hourUtc: Date, model: string, delta: NormalizedUsage): boolean {\n\tconst { inputTokens, outputTokens, cacheReadTokens } = delta;\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 flushPendingUsage(acc: CodexFileAccumulator, model: string): void {\n\tfor (const pending of acc.pendingUsage) {\n\t\tif (addToBucket(acc, startOfUtcHour(pending.eventAt), model, pending.usage)) {\n\t\t\tmarkSessionSeen(acc, pending.eventAt);\n\t\t}\n\t}\n\tacc.pendingUsage = [];\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\tacc.pendingUsage = [];\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\tacc.pendingUsage = [];\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\tflushPendingUsage(acc, model);\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 snapshot = extractCodexUsageSnapshot(parsed);\n\tconst delta = usageIncrement(acc, snapshot.last, snapshot.total);\n\tif (delta === undefined) {\n\t\treturn acc;\n\t}\n\n\tconst eventAt = new Date(tsMs);\n\tconst eventModel = pickCodexEventModel(parsed);\n\tconst model = acc.sawTurnContext ? (acc.currentModel ?? eventModel) : (eventModel ?? acc.currentModel);\n\tif (model === undefined) {\n\t\tacc.pendingUsage.push({ eventAt: eventAt, usage: delta });\n\t\treturn acc;\n\t}\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?: CodexUsageCounters;\n\t\t\t// biome-ignore lint/style/useNamingConvention: JSON field names from Codex log format\n\t\t\treadonly total_token_usage?: CodexUsageCounters;\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 CodexUsageCounters = {\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 isCodexUsageCounters(value: unknown): value is CodexUsageCounters {\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 && !isCodexUsageCounters(info[\"last_token_usage\"])) {\n\t\t\treturn false;\n\t\t}\n\t\tif (info[\"total_token_usage\"] !== undefined && !isCodexUsageCounters(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\ntype CodexUsageSnapshot = {\n\treadonly last: CodexUsageCounters | undefined;\n\treadonly total: CodexUsageCounters | undefined;\n};\n\nfunction extractCodexUsageSnapshot(event: CodexTokenCountEvent): CodexUsageSnapshot {\n\treturn {\n\t\tlast: event.payload.info?.last_token_usage,\n\t\ttotal: event.payload.info?.total_token_usage,\n\t};\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 {\n\tCodexEvent,\n\tCodexSessionMetaEvent,\n\tCodexTokenCountEvent,\n\tCodexTurnContextEvent,\n\tCodexUsageCounters,\n\tCodexUsageSnapshot,\n};\nexport {\n\textractCodexUsageSnapshot,\n\tisCodexSessionMetaEvent,\n\tisCodexTokenCountEvent,\n\tisCodexTurnContextEvent,\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","increment","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"]}
|
|
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","../../../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","../../../packages/api/src/sync-replacement-canonical.ts","../src/sync/aggregate.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/codex/counters.ts","../../../packages/parsers/src/codex/events.ts","../../../packages/parsers/src/codex/lineage.ts","../../../packages/parsers/src/types.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\treplaceStart: Option.Option<string>;\n\treplaceEnd: Option.Option<string>;\n\treplaceHarnesses: Option.Option<string>;\n\tconfirmReplacement: boolean;\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 parseReplacementFlags(raw: SyncFlags):\n\t| {\n\t\t\treadonly startHourUtc: string;\n\t\t\treadonly endHourUtc: string;\n\t\t\treadonly harnesses: readonly Harness[];\n\t }\n\t| undefined {\n\tconst startHourUtc = optionalValue(raw.replaceStart);\n\tconst endHourUtc = optionalValue(raw.replaceEnd);\n\tconst harnessList = optionalValue(raw.replaceHarnesses);\n\tif (startHourUtc === undefined && endHourUtc === undefined && harnessList === undefined) {\n\t\tif (raw.confirmReplacement) {\n\t\t\tthrow new SyncError(EXIT.invalidArguments, \"error: --confirm-replacement requires an atomic replacement scope\");\n\t\t}\n\t\treturn undefined;\n\t}\n\tif (!(startHourUtc && endHourUtc && harnessList)) {\n\t\tthrow new SyncError(\n\t\t\tEXIT.invalidArguments,\n\t\t\t\"error: --replace-start, --replace-end, and --replace-harnesses must be provided together\",\n\t\t);\n\t}\n\tconst harnesses = harnessList.split(\",\").map((value) => parseHarnessFilter(value.trim()));\n\tif (harnesses.some((harness) => harness === undefined)) {\n\t\tthrow new SyncError(EXIT.invalidArguments, \"error: replacement harness list cannot be empty\");\n\t}\n\tif (!(raw.dryRun || raw.confirmReplacement)) {\n\t\tthrow new SyncError(\n\t\t\tEXIT.invalidArguments,\n\t\t\t\"error: atomic replacement uploads require --confirm-replacement (use --dry-run to inspect first)\",\n\t\t);\n\t}\n\treturn {\n\t\tstartHourUtc: startHourUtc,\n\t\tendHourUtc: endHourUtc,\n\t\tharnesses: harnesses as Harness[],\n\t};\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\t\t\tconst replacement = yield* Effect.try({\n\t\t\t\ttry: () => parseReplacementFlags(raw),\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\treplacement: replacement,\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 replaceStartFlag = Flag.string(\"replace-start\").pipe(\n\tFlag.withDescription(\"Atomic replacement start as an inclusive UTC hour\"),\n\tFlag.optional,\n);\nconst replaceEndFlag = Flag.string(\"replace-end\").pipe(\n\tFlag.withDescription(\"Atomic replacement end as an exclusive UTC hour\"),\n\tFlag.optional,\n);\nconst replaceHarnessesFlag = Flag.string(\"replace-harnesses\").pipe(\n\tFlag.withDescription(\"Comma-separated harness set for an atomic replacement\"),\n\tFlag.optional,\n);\nconst confirmReplacementFlag = Flag.boolean(\"confirm-replacement\").pipe(\n\tFlag.withDescription(\"Confirm that the declared replacement scope may overwrite live facts\"),\n\tFlag.withDefault(false),\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\treplaceStart: replaceStartFlag,\n\t\t\treplaceEnd: replaceEndFlag,\n\t\t\treplaceHarnesses: replaceHarnessesFlag,\n\t\t\tconfirmReplacement: confirmReplacementFlag,\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 { createHash } from \"node:crypto\";\nimport { canonicalReplacementPayload, type Harness } from \"@oopst/api/client\";\nimport type { ParsedBucket } from \"@oopst/parsers\";\nimport { Effect, Stream } from \"effect\";\nimport {\n\taggregateUsageStream,\n\ttype UsageAggregationError,\n\ttype UsageBatch,\n\ttype UsageReplacementRange,\n} 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\treplacement?: UsageReplacementOptions;\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 UsageReplacementOptions = {\n\treadonly startHourUtc: string;\n\treadonly endHourUtc: string;\n\treadonly harnesses: readonly Harness[];\n};\n\ntype ValidatedUsageReplacement = UsageReplacementOptions & {\n\treadonly aggregationRange: UsageReplacementRange;\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 UploadUsageReplacementOptions = {\n\treadonly batches: readonly UsageBatch[];\n\treadonly client: SyncRpcClientShape;\n\treadonly color: boolean;\n\treadonly device: string;\n\treadonly logger: Logger;\n\treadonly replacement: ValidatedUsageReplacement;\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\t\tconst replacement = yield* validateUsageReplacement(options.replacement, options.harness);\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 = replacement\n\t\t\t? new Date(0)\n\t\t\t: 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, replacement?.harnesses);\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, replacement?.aggregationRange);\n\n\t\tif (replacement) {\n\t\t\treturn yield* runReplacementUsage({\n\t\t\t\toptions: options,\n\t\t\t\tclient: client,\n\t\t\t\tcolor: color,\n\t\t\t\treplacement: replacement,\n\t\t\t\tusageBatches: usageBatches,\n\t\t\t});\n\t\t}\n\t\treturn yield* runOrdinaryUsage(options, client, color, usageBatches);\n\t});\n}\n\nfunction runReplacementUsage(input: {\n\treadonly options: RunSyncOptions;\n\treadonly client: SyncRpcClientShape;\n\treadonly color: boolean;\n\treadonly replacement: ValidatedUsageReplacement;\n\treadonly usageBatches: UsageBatchStream;\n}): Effect.Effect<RunSyncResult, unknown> {\n\treturn Effect.gen(function* () {\n\t\tconst { client, color, options, replacement, usageBatches } = input;\n\t\tconst batchesResult = yield* recoverSyncFailure(usageBatches.pipe(Stream.runCollect), options.logger);\n\t\tif (batchesResult._tag === \"SyncFailure\") {\n\t\t\treturn batchesResult.result;\n\t\t}\n\t\tconst batches = batchesResult.value;\n\t\tconst plan = summarizeUsageBatchArray(batches);\n\t\tif (options.dryRun) {\n\t\t\tyield* logInfo(\n\t\t\t\toptions.logger,\n\t\t\t\t`${dryRunPrefix(color)} atomic replacement would stage ${usageRecordText(plan.bucketCount)} ` +\n\t\t\t\t\t`and ${localSessionText(plan.sessionCount)} in ${uploadRequestText(plan.batchCount)}.`,\n\t\t\t);\n\t\t\tyield* logInfo(options.logger, muted(\"No usage data was uploaded.\", color));\n\t\t\treturn resultFromPlan(plan);\n\t\t}\n\t\tconst uploadResult = yield* recoverSyncFailure(\n\t\t\tuploadUsageReplacement({\n\t\t\t\tbatches: batches,\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\treplacement: replacement,\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\t\tyield* logInfo(\n\t\t\toptions.logger,\n\t\t\t`${successPrefix(color)} atomically replaced ${usageRecordText(plan.bucketCount)} ` +\n\t\t\t\t`and ${localSessionText(plan.sessionCount)}.`,\n\t\t);\n\t\treturn uploadResult.value;\n\t});\n}\n\nfunction runOrdinaryUsage(\n\toptions: RunSyncOptions,\n\tclient: SyncRpcClientShape,\n\tcolor: boolean,\n\tusageBatches: UsageBatchStream,\n): Effect.Effect<RunSyncResult, unknown> {\n\treturn options.dryRun\n\t\t? runOrdinaryDryRun(options, color, usageBatches)\n\t\t: uploadOrdinaryUsage(options, client, color, usageBatches);\n}\n\nfunction runOrdinaryDryRun(\n\toptions: RunSyncOptions,\n\tcolor: boolean,\n\tusageBatches: UsageBatchStream,\n): Effect.Effect<RunSyncResult, unknown> {\n\treturn Effect.gen(function* () {\n\t\tconst planResult = yield* recoverSyncFailure(summarizeUsageBatchStream(usageBatches), options.logger);\n\t\tif (planResult._tag === \"SyncFailure\") {\n\t\t\treturn planResult.result;\n\t\t}\n\t\tconst plan = planResult.value;\n\t\tconst earlyResult = yield* finishDryRun(options, plan, color);\n\t\tif (earlyResult) {\n\t\t\treturn earlyResult;\n\t\t}\n\t\tyield* logInfo(\n\t\t\toptions.logger,\n\t\t\tphase(`Aggregated usage by hour and model: ${usageRecordText(plan.bucketCount)} ready.`, color),\n\t\t);\n\t\tconst summary =\n\t\t\t`${dryRunPrefix(color)} ${usageRecordText(plan.bucketCount)} from ${localSessionText(plan.sessionCount)} ` +\n\t\t\t`would be uploaded in ${uploadRequestText(plan.batchCount)}.`;\n\t\tyield* logInfo(options.logger, summary);\n\t\tyield* logInfo(options.logger, muted(\"No usage data was uploaded.\", color));\n\t\treturn resultFromPlan(plan);\n\t});\n}\n\nfunction uploadOrdinaryUsage(\n\toptions: RunSyncOptions,\n\tclient: SyncRpcClientShape,\n\tcolor: boolean,\n\tusageBatches: UsageBatchStream,\n): Effect.Effect<RunSyncResult, unknown> {\n\treturn Effect.gen(function* () {\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\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\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\t\tconst verboseUploadSuffix = options.verbose ? ` in ${uploadRequestText(totals.batchesUploaded)}` : \"\";\n\t\tyield* logInfo(\n\t\t\toptions.logger,\n\t\t\t`${successPrefix(color)} uploaded ${usageRecordText(totals.bucketsUploaded)} ` +\n\t\t\t\t`from ${localSessionText(totals.sessionsUploaded)}${verboseUploadSuffix}.`,\n\t\t);\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 resultFromPlan(plan: UsageBatchPlan): RunSyncResult {\n\treturn {\n\t\texitCode: EXIT.success,\n\t\tbatchesUploaded: plan.batchCount,\n\t\tbucketsUploaded: plan.bucketCount,\n\t\tsessionsUploaded: plan.sessionCount,\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 validateUsageReplacement(\n\treplacement: UsageReplacementOptions | undefined,\n\tharness: RunSyncOptions[\"harness\"],\n): Effect.Effect<ValidatedUsageReplacement | undefined, SyncError> {\n\tif (!replacement) {\n\t\treturn Effect.succeed(undefined);\n\t}\n\treturn Effect.try({\n\t\ttry: () => {\n\t\t\tif (harness !== undefined) {\n\t\t\t\tthrow new SyncError(EXIT.invalidArguments, \"--harness cannot be combined with replacement harnesses\");\n\t\t\t}\n\t\t\tconst start = parseUtcHour(\"replacement start\", replacement.startHourUtc);\n\t\t\tconst end = parseUtcHour(\"replacement end\", replacement.endHourUtc);\n\t\t\tif (end.getTime() <= start.getTime()) {\n\t\t\t\tthrow new SyncError(EXIT.invalidArguments, \"replacement end must be later than replacement start\");\n\t\t\t}\n\t\t\tconst harnesses = [...new Set(replacement.harnesses)].sort();\n\t\t\tif (harnesses.length === 0 || harnesses.length !== replacement.harnesses.length) {\n\t\t\t\tthrow new SyncError(EXIT.invalidArguments, \"replacement harnesses must be a non-empty set without duplicates\");\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstartHourUtc: start.toISOString(),\n\t\t\t\tendHourUtc: end.toISOString(),\n\t\t\t\tharnesses: harnesses,\n\t\t\t\taggregationRange: {\n\t\t\t\t\tstartHourUtc: start,\n\t\t\t\t\tendHourUtc: end,\n\t\t\t\t\tharnesses: new Set(harnesses),\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\tcatch: (error) =>\n\t\t\terror instanceof SyncError\n\t\t\t\t? error\n\t\t\t\t: new SyncError(EXIT.invalidArguments, \"replacement bounds must be exact UTC hours\"),\n\t});\n}\n\nfunction parseUtcHour(field: string, value: string): Date {\n\tconst parsed = new Date(value);\n\tif (\n\t\tNumber.isNaN(parsed.getTime()) ||\n\t\tparsed.toISOString() !== value ||\n\t\tparsed.getUTCMinutes() !== 0 ||\n\t\tparsed.getUTCSeconds() !== 0 ||\n\t\tparsed.getUTCMilliseconds() !== 0\n\t) {\n\t\tthrow new SyncError(EXIT.invalidArguments, `${field} must be an ISO UTC timestamp aligned to an hour`);\n\t}\n\treturn parsed;\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(\n\tharness: RunSyncOptions[\"harness\"],\n\tparsers: ParserBundle,\n\treplacementHarnesses?: readonly Harness[],\n): SelectedParserSource[] {\n\tconst replacementSet = replacementHarnesses ? new Set(replacementHarnesses) : undefined;\n\tconst candidates: ReadonlyArray<SelectedParserSource & { readonly harness: Harness }> = [\n\t\t{ harness: \"codex\", label: \"Codex\", source: parsers.codex },\n\t\t{ harness: \"claude_code\", label: \"Claude Code\", source: parsers.claudeCode },\n\t\t{ harness: \"pi\", label: \"Pi\", source: parsers.pi },\n\t\t{ harness: \"hermes\", label: \"Hermes\", source: parsers.hermes },\n\t\t{ harness: \"opencode\", label: \"OpenCode\", source: parsers.opencode },\n\t];\n\treturn candidates\n\t\t.filter((candidate) =>\n\t\t\treplacementSet ? replacementSet.has(candidate.harness) : harness === undefined || harness === candidate.harness,\n\t\t)\n\t\t.map(({ label, source }) => ({ label: label, source: source }));\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\treplacementRange?: UsageReplacementRange,\n): UsageBatchStream {\n\treturn aggregateUsageStream(source, {\n\t\tbatchSize: SYNC_BATCH_SIZE,\n\t\tsessionKeySalt: sessionKeySalt,\n\t\treplacementRange: replacementRange,\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\nconst uploadUsageReplacement = Effect.fn(\"RunSync.uploadUsageReplacement\")(\n\t(options: UploadUsageReplacementOptions): Effect.Effect<RunSyncResult, unknown> =>\n\t\tEffect.gen(function* () {\n\t\t\tyield* logInfo(options.logger, phase(\"Creating atomic replacement scope...\", options.color));\n\t\t\tconst created = yield* options.client.createUsageReplacement({\n\t\t\t\tdevice: options.device,\n\t\t\t\tstartHourUtc: options.replacement.startHourUtc,\n\t\t\t\tendHourUtc: options.replacement.endHourUtc,\n\t\t\t\tharnesses: options.replacement.harnesses,\n\t\t\t});\n\t\t\tconst buckets = options.batches.flatMap((batch) => batch.buckets);\n\t\t\tconst sessions = options.batches.flatMap((batch) => batch.sessions);\n\t\t\tfor (const [batchIndex, batch] of options.batches.entries()) {\n\t\t\t\tyield* logInfo(\n\t\t\t\t\toptions.logger,\n\t\t\t\t\tphase(`Staging corrected usage... ${batchIndex + 1}/${options.batches.length}`, options.color),\n\t\t\t\t);\n\t\t\t\tyield* options.client.stageUsageReplacementBatch({\n\t\t\t\t\tdevice: options.device,\n\t\t\t\t\treplacementId: created.replacementId,\n\t\t\t\t\tbatchIndex: batchIndex,\n\t\t\t\t\tbatchDigest: usageReplacementDigest(batch),\n\t\t\t\t\tbuckets: batch.buckets,\n\t\t\t\t\tsessions: batch.sessions,\n\t\t\t\t});\n\t\t\t}\n\t\t\tyield* logInfo(options.logger, phase(\"Finalizing corrected usage atomically...\", options.color));\n\t\t\tyield* options.client.finalizeUsageReplacement({\n\t\t\t\tdevice: options.device,\n\t\t\t\treplacementId: created.replacementId,\n\t\t\t\texpectedBatchCount: options.batches.length,\n\t\t\t\texpectedBucketCount: buckets.length,\n\t\t\t\texpectedSessionCount: sessions.length,\n\t\t\t\tdigest: usageReplacementDigest({ buckets: buckets, sessions: sessions }),\n\t\t\t});\n\t\t\treturn {\n\t\t\t\texitCode: EXIT.success,\n\t\t\t\tbatchesUploaded: options.batches.length,\n\t\t\t\tbucketsUploaded: buckets.length,\n\t\t\t\tsessionsUploaded: sessions.length,\n\t\t\t};\n\t\t}),\n);\n\nfunction usageReplacementDigest(facts: UsageBatch): string {\n\treturn createHash(\"sha256\").update(canonicalReplacementPayload(facts)).digest(\"hex\");\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","// 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 {\n\tConflictError,\n\tDatabaseError,\n\tNotFoundError,\n\tSyncQuotaExceededError,\n\tSyncTimestampRejectedError,\n\tUnauthorizedError,\n\tValidationError,\n} from \"../errors\";\nimport {\n\tcreateUsageReplacementInput,\n\tcreateUsageReplacementOutput,\n\tfinalizeUsageReplacementInput,\n\tfinalizeUsageReplacementOutput,\n\tgetWatermarkInput,\n\tgetWatermarkOutput,\n\tstageUsageReplacementBatchInput,\n\tstageUsageReplacementBatchOutput,\n\tupsertBucketsInput,\n\tupsertBucketsOutput,\n} from \"../schemas/sync\";\n\nconst replacementErrors = Schema.Union([\n\tConflictError,\n\tDatabaseError,\n\tNotFoundError,\n\tSyncQuotaExceededError,\n\tSyncTimestampRejectedError,\n\tUnauthorizedError,\n\tValidationError,\n]);\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\tRpc.make(\"sync.createUsageReplacement\", {\n\t\tpayload: createUsageReplacementInput,\n\t\tsuccess: createUsageReplacementOutput,\n\t\terror: replacementErrors,\n\t}),\n\tRpc.make(\"sync.stageUsageReplacementBatch\", {\n\t\tpayload: stageUsageReplacementBatchInput,\n\t\tsuccess: stageUsageReplacementBatchOutput,\n\t\terror: replacementErrors,\n\t}),\n\tRpc.make(\"sync.finalizeUsageReplacement\", {\n\t\tpayload: finalizeUsageReplacementInput,\n\t\tsuccess: finalizeUsageReplacementOutput,\n\t\terror: replacementErrors,\n\t}),\n);\n\nexport { SyncRpcs };\n","import { Effect, Schema } from \"effect\";\nimport { hex64, isoUtcString, nonNegativeSafeInteger, uuidV7 } 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_REPLACEMENT_BATCHES = 10_000;\nconst MAX_REPLACEMENT_FACTS = 100_000;\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 MAX_REPLACEMENT_HARNESSES = HARNESSES.length;\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\nconst replacementId = uuidV7;\n\nconst createUsageReplacementInput = Schema.Struct({\n\tdevice: deviceNameSchema,\n\tstartHourUtc: isoUtcString,\n\tendHourUtc: isoUtcString,\n\tharnesses: Schema.Array(harnessEnum).check(Schema.isMinLength(1), Schema.isMaxLength(MAX_REPLACEMENT_HARNESSES)),\n});\n\nconst createUsageReplacementOutput = Schema.Struct({\n\treplacementId: replacementId,\n\tstartHourUtc: isoUtcString,\n\tendHourUtc: isoUtcString,\n\tharnesses: Schema.Array(harnessEnum),\n\texpiresAt: isoUtcString,\n});\ntype CreateUsageReplacementOutput = typeof createUsageReplacementOutput.Type;\n\nconst stageUsageReplacementBatchInput = Schema.Struct({\n\tdevice: deviceNameSchema,\n\treplacementId: replacementId,\n\tbatchIndex: boundedInteger(MAX_REPLACEMENT_BATCHES),\n\tbatchDigest: hex64,\n\tbuckets: Schema.Array(bucketInput).check(Schema.isMaxLength(MAX_BUCKETS_PER_SYNC)),\n\tsessions: Schema.Array(sessionInput).check(Schema.isMaxLength(MAX_SESSIONS_PER_SYNC)),\n});\n\nconst stageUsageReplacementBatchOutput = Schema.Struct({\n\tstagedBuckets: boundedInteger(MAX_BUCKETS_PER_SYNC),\n\tstagedSessions: boundedInteger(MAX_SESSIONS_PER_SYNC),\n\talreadyStaged: Schema.Boolean,\n});\ntype StageUsageReplacementBatchOutput = typeof stageUsageReplacementBatchOutput.Type;\n\nconst finalizeUsageReplacementInput = Schema.Struct({\n\tdevice: deviceNameSchema,\n\treplacementId: replacementId,\n\texpectedBatchCount: boundedInteger(MAX_REPLACEMENT_BATCHES),\n\texpectedBucketCount: boundedInteger(MAX_REPLACEMENT_FACTS),\n\texpectedSessionCount: boundedInteger(MAX_REPLACEMENT_FACTS),\n\tdigest: hex64,\n});\n\nconst finalizeUsageReplacementOutput = Schema.Struct({\n\treplacementId: replacementId,\n\tcommittedAt: isoUtcString,\n\treplacedBuckets: boundedInteger(MAX_REPLACEMENT_FACTS),\n\treplacedSessions: boundedInteger(MAX_REPLACEMENT_FACTS),\n\tdigest: hex64,\n});\ntype FinalizeUsageReplacementOutput = typeof finalizeUsageReplacementOutput.Type;\n\nexport type {\n\tBucketInput,\n\tCreateUsageReplacementOutput,\n\tFinalizeUsageReplacementOutput,\n\tGetWatermarkOutput,\n\tHarness,\n\tSessionInput,\n\tStageUsageReplacementBatchOutput,\n\tUpsertBucketsOutput,\n};\nexport {\n\tbucketInput,\n\tcreateUsageReplacementInput,\n\tcreateUsageReplacementOutput,\n\tdeviceNameSchema,\n\tfinalizeUsageReplacementInput,\n\tfinalizeUsageReplacementOutput,\n\tgetWatermarkInput,\n\tgetWatermarkOutput,\n\tHARNESSES,\n\tharnessEnum,\n\tsessionInput,\n\tstageUsageReplacementBatchInput,\n\tstageUsageReplacementBatchOutput,\n\tsyncUploadLimits,\n\tupsertBucketsInput,\n\tupsertBucketsOutput,\n};\n","import type { BucketInput, SessionInput } from \"./schemas/sync\";\n\ntype ReplacementFacts = {\n\treadonly buckets: readonly BucketInput[];\n\treadonly sessions: readonly SessionInput[];\n};\n\nfunction normalizedIso(value: string): string {\n\treturn new Date(value).toISOString();\n}\n\nfunction canonicalReplacementLines(facts: ReplacementFacts): readonly string[] {\n\tconst lines = [\n\t\t...facts.buckets.map((bucket) =>\n\t\t\tJSON.stringify([\n\t\t\t\t\"bucket\",\n\t\t\t\tbucket.harness,\n\t\t\t\tbucket.model,\n\t\t\t\tnormalizedIso(bucket.hourUtc),\n\t\t\t\tbucket.inputTokens,\n\t\t\t\tbucket.outputTokens,\n\t\t\t\tbucket.cacheReadTokens,\n\t\t\t\tbucket.cacheCreateTokens,\n\t\t\t\tbucket.sessionCount,\n\t\t\t]),\n\t\t),\n\t\t...facts.sessions.map((session) =>\n\t\t\tJSON.stringify([\n\t\t\t\t\"session\",\n\t\t\t\tsession.harness,\n\t\t\t\tsession.sessionKey,\n\t\t\t\tnormalizedIso(session.startedAt),\n\t\t\t\tnormalizedIso(session.lastSeenAt),\n\t\t\t]),\n\t\t),\n\t];\n\treturn lines.sort();\n}\n\nfunction canonicalReplacementPayload(facts: ReplacementFacts): string {\n\treturn canonicalReplacementLines(facts).join(\"\\n\");\n}\n\nexport type { ReplacementFacts };\nexport { canonicalReplacementLines, canonicalReplacementPayload };\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\treplacementRange?: UsageReplacementRange;\n};\n\ntype UsageReplacementRange = {\n\treadonly startHourUtc: Date;\n\treadonly endHourUtc: Date;\n\treadonly harnesses: ReadonlySet<ParsedBucket[\"harness\"]>;\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\treplacementRange?: UsageReplacementRange,\n): UsageAggregationState {\n\tconst includeBucket = isReplacementBucketEligible(bucket, replacementRange);\n\tif (includeBucket) {\n\t\tconst k = key(bucket);\n\t\tlet acc = state.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\tstate.accumulators.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}\n\t}\n\tif (isReplacementSessionEligible(bucket, replacementRange)) {\n\t\tfor (const id of bucket.sessionIds) {\n\t\t\taddSessionAccumulator(state.sessionAccumulators, bucket, id, sessionKeySalt);\n\t\t}\n\t}\n\treturn state;\n}\n\nfunction isReplacementBucketEligible(bucket: ParsedBucket, range: UsageReplacementRange | undefined): boolean {\n\tif (!range) {\n\t\treturn true;\n\t}\n\tconst hourMs = bucket.hourUtc.getTime();\n\treturn (\n\t\trange.harnesses.has(bucket.harness) && hourMs >= range.startHourUtc.getTime() && hourMs < range.endHourUtc.getTime()\n\t);\n}\n\nfunction isReplacementSessionEligible(bucket: ParsedBucket, range: UsageReplacementRange | undefined): boolean {\n\tif (!range) {\n\t\treturn true;\n\t}\n\treturn (\n\t\trange.harnesses.has(bucket.harness) &&\n\t\tbucket.sessionStartedAt.getTime() < range.endHourUtc.getTime() &&\n\t\tbucket.sessionLastSeenAt.getTime() >= range.startHourUtc.getTime()\n\t);\n}\n\nfunction addBucketToAggregationStateEffect(\n\tstate: UsageAggregationState,\n\tbucket: ParsedBucket,\n\tsessionKeySalt: string,\n\treplacementRange?: UsageReplacementRange,\n): Effect.Effect<UsageAggregationState, UsageAggregationError> {\n\treturn Effect.try({\n\t\ttry: () => addBucketToAggregationState(state, bucket, sessionKeySalt, replacementRange),\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) =>\n\t\t\t\t\taddBucketToAggregationStateEffect(state, bucket, options.sessionKeySalt, options.replacementRange),\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, options.replacementRange);\n\t}\n\n\tfor (const batch of finalizeUsageBatches(state, options.batchSize)) {\n\t\tyield batch;\n\t}\n}\n\nexport type { AggregateOptions, UsageBatch, UsageReplacementRange };\nexport { aggregate, aggregateUsage, aggregateUsageStream, createSessionKey, UsageAggregationError };\n","import {\n\ttype BucketInput,\n\ttype CreateUsageReplacementOutput,\n\ttype FinalizeUsageReplacementOutput,\n\ttype GetWatermarkOutput,\n\ttype Harness,\n\ttype SessionInput,\n\ttype StageUsageReplacementBatchOutput,\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 CreateUsageReplacementInput = {\n\treadonly device: string;\n\treadonly startHourUtc: string;\n\treadonly endHourUtc: string;\n\treadonly harnesses: readonly Harness[];\n};\n\ntype StageUsageReplacementBatchInput = {\n\treadonly device: string;\n\treadonly replacementId: CreateUsageReplacementOutput[\"replacementId\"];\n\treadonly batchIndex: number;\n\treadonly batchDigest: string;\n\treadonly buckets: readonly BucketInput[];\n\treadonly sessions: readonly SessionInput[];\n};\n\ntype FinalizeUsageReplacementInput = {\n\treadonly device: string;\n\treadonly replacementId: CreateUsageReplacementOutput[\"replacementId\"];\n\treadonly expectedBatchCount: number;\n\treadonly expectedBucketCount: number;\n\treadonly expectedSessionCount: number;\n\treadonly digest: string;\n};\n\ntype SyncRpcClientShape = {\n\treadonly getWatermark: (input: GetWatermarkInput) => Effect.Effect<GetWatermarkOutput, unknown>;\n\treadonly upsertBuckets: (input: UpsertBucketsInput) => Effect.Effect<UpsertBucketsOutput, unknown>;\n\treadonly createUsageReplacement: (\n\t\tinput: CreateUsageReplacementInput,\n\t) => Effect.Effect<CreateUsageReplacementOutput, unknown>;\n\treadonly stageUsageReplacementBatch: (\n\t\tinput: StageUsageReplacementBatchInput,\n\t) => Effect.Effect<StageUsageReplacementBatchOutput, unknown>;\n\treadonly finalizeUsageReplacement: (\n\t\tinput: FinalizeUsageReplacementInput,\n\t) => Effect.Effect<FinalizeUsageReplacementOutput, 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\treadonly createUsageReplacement: {\n\t\t\treadonly mutate: (input: CreateUsageReplacementInput) => Promise<CreateUsageReplacementOutput>;\n\t\t};\n\t\treadonly stageUsageReplacementBatch: {\n\t\t\treadonly mutate: (input: StageUsageReplacementBatchInput) => Promise<StageUsageReplacementBatchOutput>;\n\t\t};\n\t\treadonly finalizeUsageReplacement: {\n\t\t\treadonly mutate: (input: FinalizeUsageReplacementInput) => Promise<FinalizeUsageReplacementOutput>;\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\tcreateUsageReplacement: {\n\t\t\t\tmutate: (input) => run(Effect.flatMap(SyncRpcClient, (client) => client.createUsageReplacement(input))),\n\t\t\t},\n\t\t\tfinalizeUsageReplacement: {\n\t\t\t\tmutate: (input) => run(Effect.flatMap(SyncRpcClient, (client) => client.finalizeUsageReplacement(input))),\n\t\t\t},\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\tstageUsageReplacementBatch: {\n\t\t\t\tmutate: (input) => run(Effect.flatMap(SyncRpcClient, (client) => client.stageUsageReplacementBatch(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\tconst createUsageReplacement = Effect.fn(\"SyncRpcClient.fromPromise.createUsageReplacement\")(\n\t\t(input: CreateUsageReplacementInput) =>\n\t\t\tEffect.tryPromise({\n\t\t\t\ttry: () => client.sync.createUsageReplacement.mutate(input),\n\t\t\t\tcatch: (err) => err,\n\t\t\t}),\n\t);\n\tconst stageUsageReplacementBatch = Effect.fn(\"SyncRpcClient.fromPromise.stageUsageReplacementBatch\")(\n\t\t(input: StageUsageReplacementBatchInput) =>\n\t\t\tEffect.tryPromise({\n\t\t\t\ttry: () => client.sync.stageUsageReplacementBatch.mutate(input),\n\t\t\t\tcatch: (err) => err,\n\t\t\t}),\n\t);\n\tconst finalizeUsageReplacement = Effect.fn(\"SyncRpcClient.fromPromise.finalizeUsageReplacement\")(\n\t\t(input: FinalizeUsageReplacementInput) =>\n\t\t\tEffect.tryPromise({\n\t\t\t\ttry: () => client.sync.finalizeUsageReplacement.mutate(input),\n\t\t\t\tcatch: (err) => err,\n\t\t\t}),\n\t);\n\treturn SyncRpcClient.of({\n\t\tcreateUsageReplacement: createUsageReplacement,\n\t\tfinalizeUsageReplacement: finalizeUsageReplacement,\n\t\tgetWatermark: getWatermark,\n\t\tstageUsageReplacementBatch: stageUsageReplacementBatch,\n\t\tupsertBuckets: upsertBuckets,\n\t});\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\tconst createUsageReplacement = Effect.fn(\"SyncRpcClient.createUsageReplacement\")(\n\t\t\t\t(input: CreateUsageReplacementInput) => client[\"sync.createUsageReplacement\"](input),\n\t\t\t);\n\t\t\tconst stageUsageReplacementBatch = Effect.fn(\"SyncRpcClient.stageUsageReplacementBatch\")(\n\t\t\t\t(input: StageUsageReplacementBatchInput) => client[\"sync.stageUsageReplacementBatch\"](input),\n\t\t\t);\n\t\t\tconst finalizeUsageReplacement = Effect.fn(\"SyncRpcClient.finalizeUsageReplacement\")(\n\t\t\t\t(input: FinalizeUsageReplacementInput) => client[\"sync.finalizeUsageReplacement\"](input),\n\t\t\t);\n\t\t\treturn SyncRpcClient.of({\n\t\t\t\tcreateUsageReplacement: createUsageReplacement,\n\t\t\t\tfinalizeUsageReplacement: finalizeUsageReplacement,\n\t\t\t\tgetWatermark: getWatermark,\n\t\t\t\tstageUsageReplacementBatch: stageUsageReplacementBatch,\n\t\t\t\tupsertBuckets: upsertBuckets,\n\t\t\t});\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 codexStreamForPlan(\n\tplan: ParserSourcePlan,\n\tcutoff: Date,\n\texcludePath: (path: string) => boolean,\n): Stream.Stream<ParsedBucket, unknown> {\n\tif (plan.codexSessionsSourceExisted) {\n\t\treturn provideFileWalker(\n\t\t\tparseCodexStream({\n\t\t\t\tarchivedRoot: plan.codexArchivedSourceExisted ? plan.codexArchivedRoot : undefined,\n\t\t\t\tcutoff: cutoff,\n\t\t\t\texcludePath: excludePath,\n\t\t\t\troot: plan.codexSessionsRoot,\n\t\t\t}),\n\t\t);\n\t}\n\tif (plan.codexArchivedSourceExisted) {\n\t\treturn provideFileWalker(\n\t\t\tparseCodexStream({ cutoff: cutoff, excludePath: excludePath, root: plan.codexArchivedRoot }),\n\t\t);\n\t}\n\treturn Stream.empty;\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: codexStreamForPlan(plan, ctx.cutoff, excludePath),\n\t\tclaudeCode: plan.claudeSourceExisted\n\t\t\t? provideFileWalker(parseClaudeStream({ cutoff: ctx.cutoff, excludePath: excludePath, root: plan.claudeRoot }))\n\t\t\t: Stream.empty,\n\t\tpi: plan.piSourceExisted\n\t\t\t? provideFileWalker(parsePiStream({ cutoff: ctx.cutoff, excludePath: excludePath, root: plan.piRoot }))\n\t\t\t: Stream.empty,\n\t\thermes: plan.hermesSourceExisted\n\t\t\t? parseHermesStream({ cutoff: ctx.cutoff, excludePath: excludePath, root: plan.hermesRoot }).pipe(\n\t\t\t\t\tStream.provide(HermesParserLive),\n\t\t\t\t)\n\t\t\t: Stream.empty,\n\t\topencode: plan.opencodeSourceExisted\n\t\t\t? parseOpenCodeStream({ cutoff: ctx.cutoff, excludePath: excludePath, root: plan.opencodeRoot }).pipe(\n\t\t\t\t\tStream.provide(OpenCodeIoLive),\n\t\t\t\t)\n\t\t\t: Stream.empty,\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 {\n\tbucketizeClaudeCandidates,\n\tbucketizeClaudeFileStream,\n\ttype ClaudePathRole,\n\tcollectClaudeFileCandidates,\n} 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/** Optional exclusive event-time bound used by aggregate-only audit scans. */\n\treadonly endExclusive?: 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 sourceContext(path: string): { readonly pathRole: ClaudePathRole; readonly sessionId: string } {\n\tconst fileDir = dirname(path);\n\tif (basename(fileDir) !== \"subagents\") {\n\t\treturn { pathRole: \"parent\", sessionId: path };\n\t}\n\n\tconst sessionDir = dirname(fileDir);\n\treturn { pathRole: \"subagent\", sessionId: `${sessionDir}.jsonl` };\n}\n\nfunction bucketizeClaudeSourcesStream<E, R>(\n\tfiles: Stream.Stream<string, E, R>,\n\tlogger: Logger,\n\toptions: { readonly cutoff: Date; readonly endExclusive?: Date; readonly excludePath?: LocalPathFilter },\n): Stream.Stream<ParsedBucket, E | ParserSourceReadError, R> {\n\treturn Stream.unwrap(\n\t\tfiles.pipe(\n\t\t\tStream.runCollect,\n\t\t\tEffect.map((paths) => [...paths].sort()),\n\t\t\tEffect.flatMap((paths) =>\n\t\t\t\tEffect.forEach(paths, (path) => {\n\t\t\t\t\tconst source = sourceContext(path);\n\t\t\t\t\treturn collectClaudeFileCandidates(path, logger, {\n\t\t\t\t\t\t...options,\n\t\t\t\t\t\tpathRole: source.pathRole,\n\t\t\t\t\t\tsessionId: source.sessionId,\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t\t),\n\t\t\tEffect.map((filesCandidates) => Stream.fromIterable(bucketizeClaudeCandidates(filesCandidates.flat()))),\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\tconst source = sourceContext(root);\n\t\t\t\treturn bucketizeClaudeFileStream(root, logger, {\n\t\t\t\t\tcutoff: opts.cutoff,\n\t\t\t\t\tendExclusive: opts.endExclusive,\n\t\t\t\t\texcludePath: opts.excludePath,\n\t\t\t\t\tpathRole: source.pathRole,\n\t\t\t\t\tsessionId: source.sessionId,\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\tendExclusive: opts.endExclusive,\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 { normalize } from \"node:path\";\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 ClaudePathRole = \"parent\" | \"subagent\";\n\ntype BucketizeClaudeFileOptions = {\n\treadonly cutoff?: Date;\n\treadonly endExclusive?: Date;\n\treadonly sessionId?: string;\n\treadonly pathRole?: ClaudePathRole;\n\treadonly excludePath?: LocalPathFilter;\n};\n\ntype ClaudeUsageCandidate = {\n\treadonly eventAt: Date;\n\treadonly eventOrder: number;\n\treadonly isSidechain: boolean;\n\treadonly model: string;\n\treadonly pathRole: ClaudePathRole;\n\treadonly sessionId: string;\n\treadonly sourceOrder: string;\n\treadonly tupleKey: string | undefined;\n\treadonly usage: ClaudeUsage;\n};\n\ntype ClaudeFileCandidateAccumulator = {\n\texcluded: boolean;\n\tidentified: Map<string, ClaudeUsageCandidate>;\n\tlineNo: number;\n\tunidentified: ClaudeUsageCandidate[];\n};\n\ntype ClaudeSessionAccumulator = {\n\tbuckets: Map<string, BucketAccumulator>;\n\tsessionLastSeenAt: Date | undefined;\n\tsessionStartedAt: Date | undefined;\n};\n\ntype NormalizedClaudeUsage = {\n\treadonly cacheCreateTokens: number;\n\treadonly cacheReadTokens: number;\n\treadonly inputTokens: number;\n\treadonly outputTokens: number;\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 makeClaudeFileCandidateAccumulator(): ClaudeFileCandidateAccumulator {\n\treturn { excluded: false, identified: new Map(), lineNo: 0, unidentified: [] };\n}\n\nfunction makeClaudeSessionAccumulator(): ClaudeSessionAccumulator {\n\treturn { buckets: new Map(), sessionLastSeenAt: undefined, sessionStartedAt: undefined };\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 lines = 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\tlines.once(\"error\", fail);\n\t\t\t\tlines.once(\"close\", end);\n\t\t\t\tlines.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\tlines.off(\"close\", end);\n\t\t\t\t\t\tlines.off(\"error\", fail);\n\t\t\t\t\t\tlines.off(\"line\", offer);\n\t\t\t\t\t\tstream.off(\"error\", fail);\n\t\t\t\t\t\tlines.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 eventIsEligible(timestampMs: number, options: BucketizeClaudeFileOptions): boolean {\n\tif (options.cutoff !== undefined && timestampMs < options.cutoff.getTime()) {\n\t\treturn false;\n\t}\n\treturn options.endExclusive === undefined || timestampMs < options.endExclusive.getTime();\n}\n\nfunction accumulateClaudeCandidate(\n\tcontext: ClaudeLineContext,\n\tacc: ClaudeFileCandidateAccumulator,\n\traw: string,\n): ClaudeFileCandidateAccumulator {\n\tconst { logger, options, path } = context;\n\tacc.lineNo += 1;\n\tif (acc.excluded) {\n\t\treturn acc;\n\t}\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\tif (!isClaudeAssistantEvent(parsed)) {\n\t\treturn acc;\n\t}\n\tif (shouldExcludePath(parsed.cwd, options.excludePath)) {\n\t\tacc.excluded = true;\n\t\tacc.identified.clear();\n\t\tacc.unidentified = [];\n\t\treturn acc;\n\t}\n\n\tconst timestampMs = Date.parse(parsed.timestamp);\n\tif (!(Number.isFinite(timestampMs) && eventIsEligible(timestampMs, options))) {\n\t\treturn acc;\n\t}\n\tconst tupleKey =\n\t\tparsed.message.id === undefined || parsed.requestId === undefined\n\t\t\t? undefined\n\t\t\t: JSON.stringify([parsed.message.id, parsed.requestId]);\n\tconst candidate: ClaudeUsageCandidate = {\n\t\teventAt: new Date(timestampMs),\n\t\teventOrder: acc.lineNo,\n\t\tisSidechain: parsed.isSidechain === true,\n\t\tmodel: parsed.message.model,\n\t\tpathRole: options.pathRole ?? \"parent\",\n\t\tsessionId: options.sessionId ?? path,\n\t\tsourceOrder: normalize(path),\n\t\ttupleKey: tupleKey,\n\t\tusage: parsed.message.usage,\n\t};\n\tif (tupleKey === undefined) {\n\t\tacc.unidentified.push(candidate);\n\t} else {\n\t\tacc.identified.set(tupleKey, candidate);\n\t}\n\treturn acc;\n}\n\nfunction candidatesFromAccumulator(acc: ClaudeFileCandidateAccumulator): readonly ClaudeUsageCandidate[] {\n\treturn acc.excluded ? [] : [...acc.identified.values(), ...acc.unidentified];\n}\n\nfunction collectClaudeFileCandidates(\n\tpath: string,\n\tlogger: Logger,\n\toptions: BucketizeClaudeFileOptions = {},\n): Effect.Effect<readonly ClaudeUsageCandidate[], ParserSourceReadError> {\n\tconst context: ClaudeLineContext = { logger: logger, options: options, path: path };\n\treturn lineStreamFromFile(path).pipe(\n\t\tStream.runFold(makeClaudeFileCandidateAccumulator, (acc, raw) => accumulateClaudeCandidate(context, acc, raw)),\n\t\tEffect.map(candidatesFromAccumulator),\n\t);\n}\n\nfunction normalizedUsage(usage: ClaudeUsage): NormalizedClaudeUsage {\n\treturn {\n\t\tinputTokens: Math.max(0, usage.input_tokens ?? 0),\n\t\toutputTokens: Math.max(0, usage.output_tokens ?? 0),\n\t\tcacheReadTokens: Math.max(0, usage.cache_read_input_tokens ?? 0),\n\t\tcacheCreateTokens: Math.max(0, usage.cache_creation_input_tokens ?? 0),\n\t};\n}\n\nfunction sameUsage(left: ClaudeUsage, right: ClaudeUsage): boolean {\n\tconst a = normalizedUsage(left);\n\tconst b = normalizedUsage(right);\n\treturn (\n\t\ta.inputTokens === b.inputTokens &&\n\t\ta.outputTokens === b.outputTokens &&\n\t\ta.cacheReadTokens === b.cacheReadTokens &&\n\t\ta.cacheCreateTokens === b.cacheCreateTokens\n\t);\n}\n\nfunction candidateWins(next: ClaudeUsageCandidate, current: ClaudeUsageCandidate): boolean {\n\tif (next.model === current.model && sameUsage(next.usage, current.usage)) {\n\t\tif (next.isSidechain !== current.isSidechain) {\n\t\t\treturn !next.isSidechain;\n\t\t}\n\t\tif (next.pathRole !== current.pathRole) {\n\t\t\treturn next.pathRole === \"parent\";\n\t\t}\n\t}\n\tconst timestampOrder = next.eventAt.getTime() - current.eventAt.getTime();\n\tif (timestampOrder !== 0) {\n\t\treturn timestampOrder > 0;\n\t}\n\tif (next.eventOrder !== current.eventOrder) {\n\t\treturn next.eventOrder > current.eventOrder;\n\t}\n\treturn next.sourceOrder.localeCompare(current.sourceOrder) < 0;\n}\n\nfunction reconcileClaudeCandidates(candidates: readonly ClaudeUsageCandidate[]): readonly ClaudeUsageCandidate[] {\n\tconst identified = new Map<string, ClaudeUsageCandidate>();\n\tconst unidentified: ClaudeUsageCandidate[] = [];\n\tfor (const candidate of candidates) {\n\t\tif (candidate.tupleKey === undefined) {\n\t\t\t// Historical rows missing either response ID have no safe copied-history\n\t\t\t// identity. Preserve the established behavior by keeping each row\n\t\t\t// distinct instead of risking suppression of legitimate equal usage.\n\t\t\tunidentified.push(candidate);\n\t\t\tcontinue;\n\t\t}\n\t\tconst current = identified.get(candidate.tupleKey);\n\t\tif (current === undefined || candidateWins(candidate, current)) {\n\t\t\tidentified.set(candidate.tupleKey, candidate);\n\t\t}\n\t}\n\treturn [...identified.values(), ...unidentified];\n}\n\nfunction addToBucket(acc: ClaudeSessionAccumulator, candidate: ClaudeUsageCandidate): boolean {\n\tconst usage = normalizedUsage(candidate.usage);\n\tconst { cacheCreateTokens, cacheReadTokens, inputTokens, outputTokens } = usage;\n\tif (inputTokens === 0 && outputTokens === 0 && cacheReadTokens === 0 && cacheCreateTokens === 0) {\n\t\treturn false;\n\t}\n\n\tconst hourUtc = startOfUtcHour(candidate.eventAt);\n\tconst bucketKey = key(hourUtc, candidate.model);\n\tconst existing = acc.buckets.get(bucketKey);\n\tif (existing === undefined) {\n\t\tacc.buckets.set(bucketKey, {\n\t\t\thourUtc: hourUtc,\n\t\t\tmodel: candidate.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\texisting.inputTokens += inputTokens;\n\texisting.outputTokens += outputTokens;\n\texisting.cacheReadTokens += cacheReadTokens;\n\texisting.cacheCreateTokens += cacheCreateTokens;\n\treturn true;\n}\n\nfunction markSessionSeen(acc: ClaudeSessionAccumulator, 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\nfunction bucketsForSession(sessionId: string, acc: ClaudeSessionAccumulator): readonly ParsedBucket[] {\n\tconst { sessionLastSeenAt, sessionStartedAt } = acc;\n\tif (sessionStartedAt === undefined || sessionLastSeenAt === undefined) {\n\t\treturn [];\n\t}\n\tconst sessionIds: ReadonlySet<string> = new Set([sessionId]);\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\nfunction bucketizeClaudeCandidates(candidates: readonly ClaudeUsageCandidate[]): readonly ParsedBucket[] {\n\tconst sessions = new Map<string, ClaudeSessionAccumulator>();\n\tfor (const candidate of reconcileClaudeCandidates(candidates)) {\n\t\tconst acc = sessions.get(candidate.sessionId) ?? makeClaudeSessionAccumulator();\n\t\tif (addToBucket(acc, candidate)) {\n\t\t\tmarkSessionSeen(acc, candidate.eventAt);\n\t\t}\n\t\tsessions.set(candidate.sessionId, acc);\n\t}\n\treturn [...sessions.entries()].flatMap(([sessionId, acc]) => bucketsForSession(sessionId, acc));\n}\n\nfunction bucketizeClaudeFileStream(\n\tpath: string,\n\tlogger: Logger,\n\toptions: BucketizeClaudeFileOptions = {},\n): Stream.Stream<ParsedBucket, ParserSourceReadError> {\n\treturn Stream.unwrap(\n\t\tcollectClaudeFileCandidates(path, logger, options).pipe(\n\t\t\tEffect.map((candidates) => Stream.fromIterable(bucketizeClaudeCandidates(candidates))),\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, ClaudePathRole, ClaudeUsageCandidate };\nexport {\n\tbucketizeClaudeCandidates,\n\tbucketizeClaudeFile,\n\tbucketizeClaudeFileStream,\n\tcollectClaudeFileCandidates,\n\treconcileClaudeCandidates,\n};\n","import { Effect, Stream } from \"effect\";\nimport type { LocalPathFilter, Logger, ParsedBucket, ParserSourceReadError } from \"../types\";\nimport {\n\tapplyCodexContainedSnapshot,\n\tapplyCodexUnresolvedSnapshot,\n\ttype CodexContainmentState,\n\tcumulativeCodexDelta,\n\tmakeCodexContainmentState,\n\ttype NormalizedCodexUsage,\n\tnormalizeCodexUsage,\n\tpositiveCodexUsage,\n\tsameCodexUsage,\n\tsubtractCodexUsageFloorZero,\n} from \"./counters\";\nimport {\n\ttype CodexUsageCounters,\n\textractCodexUsageSnapshot,\n\tisCodexSessionMetaEvent,\n\tisCodexTaskStartedEvent,\n\tisCodexTokenCountEvent,\n\tisCodexTurnContextEvent,\n\tpickCodexEventModel,\n\tpickCodexTurnId,\n} from \"./events\";\nimport { type CodexLineageBaseline, lineStreamFromFile } from \"./lineage\";\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 PendingCodexUsage = {\n\treadonly eventAt: Date;\n\treadonly eventIndex: number;\n\treadonly turnId: string | undefined;\n\treadonly usage: NormalizedCodexUsage;\n};\n\ntype AccumulatedCodexUsageCandidate = PendingCodexUsage & {\n\treadonly model: string;\n};\n\ntype CodexUsageCandidate = {\n\treadonly cacheReadTokens: number;\n\treadonly canonicalSessionIdentity: string;\n\treadonly eventIndex: number;\n\treadonly hourUtc: Date;\n\treadonly inputTokens: number;\n\treadonly model: string;\n\treadonly outputTokens: number;\n\treadonly sessionIdentity: string;\n\treadonly sessionLastSeenAt: Date;\n\treadonly sessionStartedAt: Date;\n\treadonly turnId: string | undefined;\n};\n\ntype CodexFileUsage = {\n\treadonly buckets: readonly ParsedBucket[];\n\treadonly candidates: readonly CodexUsageCandidate[];\n};\n\ntype BucketizeCodexFileOptions = {\n\treadonly containInterleavedTotals?: boolean;\n\treadonly canonicalSessionIdentity?: string;\n\treadonly excludePath?: LocalPathFilter;\n\treadonly lineageBaseline?: CodexLineageBaseline;\n\treadonly sessionIdentity?: string;\n};\n\ntype CodexFileAccumulator = {\n\tbuckets: Map<string, BucketAccumulator>;\n\tcandidates: AccumulatedCodexUsageCandidate[];\n\tcurrentModel: string | undefined;\n\tcurrentTurnId: string | undefined;\n\tcontainment: CodexContainmentState | undefined;\n\texcluded: boolean;\n\tlineNo: number;\n\tnextEventIndex: number;\n\tlineageKind: CodexLineageBaseline[\"_tag\"];\n\tinheritedBaselineUsage: NormalizedCodexUsage | undefined;\n\tsawTurnContext: boolean;\n\tpreviousTotalUsage: NormalizedCodexUsage | undefined;\n\tremainingInheritedUsage: NormalizedCodexUsage | undefined;\n\tpendingUsage: PendingCodexUsage[];\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(options: BucketizeCodexFileOptions): CodexFileAccumulator {\n\tconst lineageBaseline = options.lineageBaseline ?? { _tag: \"Root\" };\n\treturn {\n\t\tbuckets: new Map(),\n\t\tcandidates: [],\n\t\tcurrentModel: undefined,\n\t\tcurrentTurnId: undefined,\n\t\tcontainment: options.containInterleavedTotals === true ? makeCodexContainmentState() : undefined,\n\t\texcluded: false,\n\t\tlineNo: 0,\n\t\tnextEventIndex: 0,\n\t\tlineageKind: lineageBaseline._tag,\n\t\tinheritedBaselineUsage: lineageBaseline._tag === \"Resolved\" ? lineageBaseline.usage : undefined,\n\t\tsawTurnContext: false,\n\t\tpreviousTotalUsage: lineageBaseline._tag === \"Resolved\" ? lineageBaseline.usage : undefined,\n\t\tremainingInheritedUsage: lineageBaseline._tag === \"Resolved\" ? lineageBaseline.usage : undefined,\n\t\tpendingUsage: [],\n\t\tsessionLastSeenAt: undefined,\n\t\tsessionStartedAt: undefined,\n\t};\n}\n\nfunction subtractRemainingInheritedUsage(\n\tacc: CodexFileAccumulator,\n\trawIncrement: NormalizedCodexUsage,\n): NormalizedCodexUsage {\n\tconst remaining = acc.remainingInheritedUsage;\n\tif (remaining === undefined) {\n\t\treturn rawIncrement;\n\t}\n\tacc.remainingInheritedUsage = subtractCodexUsageFloorZero(remaining, rawIncrement);\n\treturn subtractCodexUsageFloorZero(rawIncrement, remaining);\n}\n\nfunction positiveIncrement(increment: NormalizedCodexUsage): NormalizedCodexUsage | undefined {\n\treturn positiveCodexUsage(increment) ? increment : undefined;\n}\n\nfunction unresolvedUsageIncrement(\n\tacc: CodexFileAccumulator,\n\ttotal: NormalizedCodexUsage | undefined,\n): NormalizedCodexUsage | undefined {\n\tif (total === undefined) {\n\t\treturn undefined;\n\t}\n\tconst previous = acc.previousTotalUsage;\n\tacc.previousTotalUsage = total;\n\tif (previous === undefined || sameCodexUsage(previous, total)) {\n\t\treturn undefined;\n\t}\n\treturn positiveIncrement(cumulativeCodexDelta(total, previous));\n}\n\nfunction resolvedUsageIncrement(\n\tacc: CodexFileAccumulator,\n\tlast: CodexUsageCounters | undefined,\n\ttotal: NormalizedCodexUsage | undefined,\n): NormalizedCodexUsage | undefined {\n\tif (total !== undefined) {\n\t\tconst previous = acc.previousTotalUsage;\n\t\tif (previous !== undefined && sameCodexUsage(previous, total)) {\n\t\t\treturn undefined;\n\t\t}\n\t\tacc.previousTotalUsage = total;\n\t\tacc.remainingInheritedUsage = undefined;\n\t\treturn positiveIncrement(cumulativeCodexDelta(total, previous));\n\t}\n\tif (last === undefined) {\n\t\treturn undefined;\n\t}\n\tconst rawIncrement = normalizeCodexUsage(last);\n\treturn positiveIncrement(subtractRemainingInheritedUsage(acc, rawIncrement));\n}\n\nfunction containedUsageIncrement(\n\tacc: CodexFileAccumulator,\n\tlast: CodexUsageCounters | undefined,\n\ttotal: CodexUsageCounters | undefined,\n): NormalizedCodexUsage | undefined {\n\tconst { containment } = acc;\n\tif (containment === undefined) {\n\t\treturn undefined;\n\t}\n\tconst normalizedTotal = total === undefined ? undefined : normalizeCodexUsage(total);\n\tconst normalizedLast = last === undefined ? undefined : normalizeCodexUsage(last);\n\tif (acc.lineageKind === \"Unresolved\") {\n\t\treturn applyCodexUnresolvedSnapshot(containment, normalizedLast, normalizedTotal);\n\t}\n\tif (acc.lineageKind === \"Resolved\") {\n\t\tconst adjustedTotal =\n\t\t\tnormalizedTotal === undefined || acc.inheritedBaselineUsage === undefined\n\t\t\t\t? normalizedTotal\n\t\t\t\t: subtractCodexUsageFloorZero(normalizedTotal, acc.inheritedBaselineUsage);\n\t\tconst adjustedLast =\n\t\t\tnormalizedTotal === undefined && normalizedLast !== undefined\n\t\t\t\t? subtractRemainingInheritedUsage(acc, normalizedLast)\n\t\t\t\t: normalizedLast;\n\t\tconst increment = applyCodexContainedSnapshot(containment, adjustedLast, adjustedTotal, {\n\t\t\ttotalOnlyBeforeInterleaving: true,\n\t\t});\n\t\tif (normalizedTotal !== undefined) {\n\t\t\tacc.remainingInheritedUsage = undefined;\n\t\t}\n\t\treturn increment;\n\t}\n\treturn applyCodexContainedSnapshot(containment, normalizedLast, normalizedTotal);\n}\n\nfunction rootUsageIncrement(\n\tacc: CodexFileAccumulator,\n\tlast: CodexUsageCounters | undefined,\n\ttotal: NormalizedCodexUsage | undefined,\n): NormalizedCodexUsage | undefined {\n\tif (total !== undefined) {\n\t\tconst previous = acc.previousTotalUsage;\n\t\tif (previous !== undefined && sameCodexUsage(previous, total)) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst increment = last === undefined ? cumulativeCodexDelta(total, previous) : normalizeCodexUsage(last);\n\t\tacc.previousTotalUsage = total;\n\t\treturn positiveIncrement(increment);\n\t}\n\treturn last === undefined ? undefined : positiveIncrement(normalizeCodexUsage(last));\n}\n\nfunction usageIncrement(\n\tacc: CodexFileAccumulator,\n\tlast: CodexUsageCounters | undefined,\n\ttotal: CodexUsageCounters | undefined,\n): NormalizedCodexUsage | undefined {\n\tif (acc.containment !== undefined) {\n\t\treturn containedUsageIncrement(acc, last, total);\n\t}\n\tconst normalizedTotal = total === undefined ? undefined : normalizeCodexUsage(total);\n\tif (acc.lineageKind === \"Resolved\") {\n\t\treturn resolvedUsageIncrement(acc, last, normalizedTotal);\n\t}\n\tif (acc.lineageKind === \"Unresolved\") {\n\t\treturn unresolvedUsageIncrement(acc, normalizedTotal);\n\t}\n\treturn rootUsageIncrement(acc, last, normalizedTotal);\n}\n\nfunction addToBucket(acc: CodexFileAccumulator, hourUtc: Date, model: string, delta: NormalizedCodexUsage): boolean {\n\tconst { inputTokens, outputTokens, cacheReadTokens } = delta;\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 recordUsageCandidate(acc: CodexFileAccumulator, usage: PendingCodexUsage, model: string): void {\n\tif (!addToBucket(acc, startOfUtcHour(usage.eventAt), model, usage.usage)) {\n\t\treturn;\n\t}\n\tacc.candidates.push({ ...usage, model: model });\n\tmarkSessionSeen(acc, usage.eventAt);\n}\n\nfunction flushPendingUsage(acc: CodexFileAccumulator, model: string): void {\n\tfor (const pending of acc.pendingUsage) {\n\t\trecordUsageCandidate(acc, pending, model);\n\t}\n\tacc.pendingUsage = [];\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\tacc.candidates = [];\n\t\t\tacc.pendingUsage = [];\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\tacc.candidates = [];\n\t\t\tacc.pendingUsage = [];\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\tflushPendingUsage(acc, model);\n\t\t}\n\t\treturn acc;\n\t}\n\n\tif (isCodexTaskStartedEvent(parsed)) {\n\t\tacc.currentTurnId = pickCodexTurnId(parsed);\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 snapshot = extractCodexUsageSnapshot(parsed);\n\tconst delta = usageIncrement(acc, snapshot.last, snapshot.total);\n\tif (delta === undefined) {\n\t\treturn acc;\n\t}\n\n\tconst eventAt = new Date(tsMs);\n\tconst eventIndex = acc.nextEventIndex;\n\tacc.nextEventIndex += 1;\n\tconst turnId = pickCodexTurnId(parsed) ?? acc.currentTurnId;\n\tconst candidate = { eventAt: eventAt, eventIndex: eventIndex, turnId: turnId, usage: delta };\n\tconst eventModel = pickCodexEventModel(parsed);\n\tconst model = acc.sawTurnContext ? (acc.currentModel ?? eventModel) : (eventModel ?? acc.currentModel);\n\tif (model === undefined) {\n\t\tacc.pendingUsage.push(candidate);\n\t\treturn acc;\n\t}\n\trecordUsageCandidate(acc, candidate, model);\n\treturn acc;\n}\n\nfunction bucketsFromAccumulator(\n\tpath: string,\n\toptions: BucketizeCodexFileOptions,\n\tacc: CodexFileAccumulator,\n): readonly ParsedBucket[] {\n\tif (acc.excluded || acc.sessionStartedAt === undefined || acc.sessionLastSeenAt === undefined) {\n\t\treturn [];\n\t}\n\n\tconst { sessionLastSeenAt, sessionStartedAt } = acc;\n\tconst sessionIds: ReadonlySet<string> = new Set([options.sessionIdentity ?? 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\nfunction candidatesFromAccumulator(\n\tpath: string,\n\toptions: BucketizeCodexFileOptions,\n\tacc: CodexFileAccumulator,\n): readonly CodexUsageCandidate[] {\n\tif (acc.excluded || acc.sessionStartedAt === undefined || acc.sessionLastSeenAt === undefined) {\n\t\treturn [];\n\t}\n\tconst sessionIdentity = options.sessionIdentity ?? path;\n\tconst canonicalSessionIdentity = options.canonicalSessionIdentity ?? sessionIdentity;\n\treturn acc.candidates.map((candidate) => ({\n\t\tcacheReadTokens: candidate.usage.cacheReadTokens,\n\t\tcanonicalSessionIdentity: canonicalSessionIdentity,\n\t\teventIndex: candidate.eventIndex,\n\t\thourUtc: startOfUtcHour(candidate.eventAt),\n\t\tinputTokens: candidate.usage.inputTokens,\n\t\tmodel: candidate.model,\n\t\toutputTokens: candidate.usage.outputTokens,\n\t\tsessionIdentity: sessionIdentity,\n\t\tsessionLastSeenAt: acc.sessionLastSeenAt as Date,\n\t\tsessionStartedAt: acc.sessionStartedAt as Date,\n\t\tturnId: candidate.turnId,\n\t}));\n}\n\nfunction codexFileUsageEffect(\n\tpath: string,\n\tlogger: Logger,\n\toptions: BucketizeCodexFileOptions = {},\n): Effect.Effect<CodexFileUsage, ParserSourceReadError> {\n\tconst context: CodexLineContext = { logger: logger, options: options, path: path };\n\treturn lineStreamFromFile(path).pipe(\n\t\tStream.runFold(\n\t\t\t() => makeCodexFileAccumulator(options),\n\t\t\t(acc, raw) => accumulateCodexLine(context, acc, raw),\n\t\t),\n\t\tEffect.map((acc) => ({\n\t\t\tbuckets: bucketsFromAccumulator(path, options, acc),\n\t\t\tcandidates: candidatesFromAccumulator(path, options, acc),\n\t\t})),\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\treturn Stream.unwrap(\n\t\tcodexFileUsageEffect(path, logger, options).pipe(Effect.map((usage) => Stream.fromIterable(usage.buckets))),\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, CodexFileUsage, CodexUsageCandidate };\nexport { bucketizeCodexFile, bucketizeCodexFileStream, codexFileUsageEffect, startOfUtcHour };\n","import type { CodexUsageCounters } from \"./events\";\n\ntype NormalizedCodexUsage = {\n\treadonly inputTokens: number;\n\treadonly outputTokens: number;\n\treadonly cacheReadTokens: number;\n};\n\ntype CodexContainmentState = {\n\tcountedUsage: NormalizedCodexUsage | undefined;\n\trawBaseline: NormalizedCodexUsage | undefined;\n\twatermark: NormalizedCodexUsage | undefined;\n\tseenRawTotals: NormalizedCodexUsage[];\n\tsawDivergentTotals: boolean;\n\tsawInterleavedTotals: boolean;\n\tsawUnresolvedTotal: boolean;\n};\n\ntype CodexContainmentOptions = {\n\treadonly totalOnlyBeforeInterleaving?: boolean;\n};\n\nconst SEEN_RAW_TOTALS_LIMIT = 64;\n\nconst ZERO_CODEX_USAGE: NormalizedCodexUsage = {\n\tinputTokens: 0,\n\toutputTokens: 0,\n\tcacheReadTokens: 0,\n};\n\nfunction normalizeCodexUsage(usage: CodexUsageCounters): NormalizedCodexUsage {\n\treturn {\n\t\tinputTokens: Math.max(0, usage.input_tokens ?? 0),\n\t\toutputTokens: Math.max(0, usage.output_tokens ?? 0),\n\t\tcacheReadTokens: Math.max(0, usage.cached_input_tokens ?? usage.cache_read_input_tokens ?? 0),\n\t};\n}\n\nfunction sameCodexUsage(a: NormalizedCodexUsage, b: NormalizedCodexUsage): boolean {\n\treturn (\n\t\ta.inputTokens === b.inputTokens && a.outputTokens === b.outputTokens && a.cacheReadTokens === b.cacheReadTokens\n\t);\n}\n\nfunction positiveCodexUsage(usage: NormalizedCodexUsage): boolean {\n\treturn usage.inputTokens > 0 || usage.outputTokens > 0 || usage.cacheReadTokens > 0;\n}\n\nfunction addCodexUsage(a: NormalizedCodexUsage, b: NormalizedCodexUsage): NormalizedCodexUsage {\n\treturn {\n\t\tinputTokens: a.inputTokens + b.inputTokens,\n\t\toutputTokens: a.outputTokens + b.outputTokens,\n\t\tcacheReadTokens: a.cacheReadTokens + b.cacheReadTokens,\n\t};\n}\n\nfunction minCodexUsage(a: NormalizedCodexUsage, b: NormalizedCodexUsage): NormalizedCodexUsage {\n\treturn {\n\t\tinputTokens: Math.min(a.inputTokens, b.inputTokens),\n\t\toutputTokens: Math.min(a.outputTokens, b.outputTokens),\n\t\tcacheReadTokens: Math.min(a.cacheReadTokens, b.cacheReadTokens),\n\t};\n}\n\nfunction maxCodexUsage(a: NormalizedCodexUsage | undefined, b: NormalizedCodexUsage): NormalizedCodexUsage {\n\tif (a === undefined) {\n\t\treturn b;\n\t}\n\treturn {\n\t\tinputTokens: Math.max(a.inputTokens, b.inputTokens),\n\t\toutputTokens: Math.max(a.outputTokens, b.outputTokens),\n\t\tcacheReadTokens: Math.max(a.cacheReadTokens, b.cacheReadTokens),\n\t};\n}\n\nfunction subtractCodexUsageFloorZero(\n\tcurrent: NormalizedCodexUsage,\n\tbaseline: NormalizedCodexUsage,\n): NormalizedCodexUsage {\n\treturn {\n\t\tinputTokens: Math.max(0, current.inputTokens - baseline.inputTokens),\n\t\toutputTokens: Math.max(0, current.outputTokens - baseline.outputTokens),\n\t\tcacheReadTokens: Math.max(0, current.cacheReadTokens - baseline.cacheReadTokens),\n\t};\n}\n\nfunction codexUsageContains(current: NormalizedCodexUsage, baseline: NormalizedCodexUsage): boolean {\n\treturn (\n\t\tcurrent.inputTokens >= baseline.inputTokens &&\n\t\tcurrent.outputTokens >= baseline.outputTokens &&\n\t\tcurrent.cacheReadTokens >= baseline.cacheReadTokens\n\t);\n}\n\nfunction codexUsageAtMost(current: NormalizedCodexUsage, ceiling: NormalizedCodexUsage): boolean {\n\treturn (\n\t\tcurrent.inputTokens <= ceiling.inputTokens &&\n\t\tcurrent.outputTokens <= ceiling.outputTokens &&\n\t\tcurrent.cacheReadTokens <= ceiling.cacheReadTokens\n\t);\n}\n\nfunction makeCodexContainmentState(): CodexContainmentState {\n\treturn {\n\t\tcountedUsage: undefined,\n\t\trawBaseline: undefined,\n\t\twatermark: undefined,\n\t\tseenRawTotals: [],\n\t\tsawDivergentTotals: false,\n\t\tsawInterleavedTotals: false,\n\t\tsawUnresolvedTotal: false,\n\t};\n}\n\nfunction containedCodexDelta(\n\twatermark: NormalizedCodexUsage | undefined,\n\tcounted: NormalizedCodexUsage | undefined,\n\tcurrent: NormalizedCodexUsage,\n): NormalizedCodexUsage {\n\tconst water = watermark ?? ZERO_CODEX_USAGE;\n\tconst accepted = counted ?? ZERO_CODEX_USAGE;\n\tconst component = (highWatermark: number, countedUsage: number, currentUsage: number): number =>\n\t\tcurrentUsage >= highWatermark\n\t\t\t? Math.max(0, currentUsage - Math.max(highWatermark, countedUsage))\n\t\t\t: Math.max(0, currentUsage - countedUsage);\n\treturn {\n\t\tinputTokens: component(water.inputTokens, accepted.inputTokens, current.inputTokens),\n\t\toutputTokens: component(water.outputTokens, accepted.outputTokens, current.outputTokens),\n\t\tcacheReadTokens: component(water.cacheReadTokens, accepted.cacheReadTokens, current.cacheReadTokens),\n\t};\n}\n\nfunction divergentCodexDelta(\n\trawBaseline: NormalizedCodexUsage | undefined,\n\tcountedBaseline: NormalizedCodexUsage | undefined,\n\tcurrent: NormalizedCodexUsage,\n): NormalizedCodexUsage {\n\tconst raw = rawBaseline ?? ZERO_CODEX_USAGE;\n\tconst counted = countedBaseline ?? ZERO_CODEX_USAGE;\n\tconst component = (rawUsage: number, countedUsage: number, currentUsage: number): number =>\n\t\tcurrentUsage >= rawUsage ? Math.max(0, currentUsage - rawUsage) : Math.max(0, currentUsage - countedUsage);\n\treturn {\n\t\tinputTokens: component(raw.inputTokens, counted.inputTokens, current.inputTokens),\n\t\toutputTokens: component(raw.outputTokens, counted.outputTokens, current.outputTokens),\n\t\tcacheReadTokens: component(raw.cacheReadTokens, counted.cacheReadTokens, current.cacheReadTokens),\n\t};\n}\n\nfunction rememberCodexTotal(state: CodexContainmentState, total: NormalizedCodexUsage): void {\n\tstate.watermark = maxCodexUsage(state.watermark, total);\n\tif (state.seenRawTotals.some((seen) => sameCodexUsage(seen, total))) {\n\t\treturn;\n\t}\n\tstate.seenRawTotals.push(total);\n\tif (state.seenRawTotals.length > SEEN_RAW_TOTALS_LIMIT) {\n\t\tstate.seenRawTotals.splice(0, state.seenRawTotals.length - SEEN_RAW_TOTALS_LIMIT);\n\t}\n}\n\nfunction applyCodexSnapshotWithLast(\n\tstate: CodexContainmentState,\n\tlast: NormalizedCodexUsage,\n\ttotal: NormalizedCodexUsage | undefined,\n\twatermarkBaseline: NormalizedCodexUsage | undefined,\n): NormalizedCodexUsage {\n\tconst base = state.countedUsage ?? ZERO_CODEX_USAGE;\n\tif (total === undefined) {\n\t\tstate.countedUsage = addCodexUsage(base, last);\n\t\tstate.rawBaseline = state.countedUsage;\n\t\tstate.watermark = maxCodexUsage(state.watermark, state.countedUsage);\n\t\treturn last;\n\t}\n\n\tlet delta = last;\n\tif (state.sawInterleavedTotals) {\n\t\tdelta = minCodexUsage(last, containedCodexDelta(watermarkBaseline, state.countedUsage, total));\n\t} else {\n\t\tconst totalDelta = subtractCodexUsageFloorZero(total, watermarkBaseline ?? ZERO_CODEX_USAGE);\n\t\tconst useTotalDelta =\n\t\t\t!state.sawDivergentTotals &&\n\t\t\twatermarkBaseline !== undefined &&\n\t\t\tcodexUsageContains(total, watermarkBaseline) &&\n\t\t\tcodexUsageAtMost(totalDelta, last);\n\t\tif (useTotalDelta) {\n\t\t\tdelta = totalDelta;\n\t\t}\n\t}\n\tstate.countedUsage = addCodexUsage(base, delta);\n\tstate.rawBaseline = total;\n\tstate.sawDivergentTotals ||= !sameCodexUsage(total, state.countedUsage);\n\treturn delta;\n}\n\nfunction applyCodexTotalOnlySnapshot(\n\tstate: CodexContainmentState,\n\ttotal: NormalizedCodexUsage,\n\twatermarkBaseline: NormalizedCodexUsage | undefined,\n): NormalizedCodexUsage {\n\tlet delta: NormalizedCodexUsage;\n\tif (state.sawInterleavedTotals) {\n\t\tdelta = containedCodexDelta(watermarkBaseline, state.countedUsage, total);\n\t} else if (state.sawDivergentTotals) {\n\t\tdelta = divergentCodexDelta(watermarkBaseline, state.countedUsage, total);\n\t} else {\n\t\tdelta = subtractCodexUsageFloorZero(total, watermarkBaseline ?? ZERO_CODEX_USAGE);\n\t}\n\tstate.countedUsage = addCodexUsage(state.countedUsage ?? ZERO_CODEX_USAGE, delta);\n\tstate.rawBaseline = total;\n\tstate.sawDivergentTotals ||= !sameCodexUsage(total, state.countedUsage);\n\treturn delta;\n}\n\nfunction applyCodexContainedSnapshot(\n\tstate: CodexContainmentState,\n\tlast: NormalizedCodexUsage | undefined,\n\ttotal: NormalizedCodexUsage | undefined,\n\toptions: CodexContainmentOptions = {},\n): NormalizedCodexUsage | undefined {\n\tif (total !== undefined && state.seenRawTotals.some((seen) => sameCodexUsage(seen, total))) {\n\t\treturn undefined;\n\t}\n\tif (total !== undefined && state.watermark !== undefined && !codexUsageContains(total, state.watermark)) {\n\t\tstate.sawInterleavedTotals = true;\n\t}\n\n\tconst watermarkBaseline = state.watermark ?? state.rawBaseline;\n\tconst effectiveLast =\n\t\ttotal !== undefined && options.totalOnlyBeforeInterleaving === true && !state.sawInterleavedTotals\n\t\t\t? undefined\n\t\t\t: last;\n\tlet delta: NormalizedCodexUsage | undefined;\n\tif (effectiveLast !== undefined) {\n\t\tdelta = applyCodexSnapshotWithLast(state, effectiveLast, total, watermarkBaseline);\n\t} else if (total !== undefined) {\n\t\tdelta = applyCodexTotalOnlySnapshot(state, total, watermarkBaseline);\n\t}\n\n\tif (total !== undefined) {\n\t\trememberCodexTotal(state, total);\n\t}\n\treturn delta !== undefined && positiveCodexUsage(delta) ? delta : undefined;\n}\n\nfunction applyCodexUnresolvedSnapshot(\n\tstate: CodexContainmentState,\n\tlast: NormalizedCodexUsage | undefined,\n\ttotal: NormalizedCodexUsage | undefined,\n): NormalizedCodexUsage | undefined {\n\tif (total === undefined) {\n\t\treturn applyCodexContainedSnapshot(state, last, undefined);\n\t}\n\tif (state.seenRawTotals.some((seen) => sameCodexUsage(seen, total))) {\n\t\treturn undefined;\n\t}\n\tif (state.watermark !== undefined && !codexUsageContains(total, state.watermark)) {\n\t\tstate.sawInterleavedTotals = true;\n\t}\n\n\tconst watermarkBaseline = state.watermark ?? state.rawBaseline;\n\tlet delta: NormalizedCodexUsage | undefined;\n\tif (state.sawUnresolvedTotal && last !== undefined) {\n\t\tdelta = minCodexUsage(last, subtractCodexUsageFloorZero(total, watermarkBaseline ?? ZERO_CODEX_USAGE));\n\t\tstate.countedUsage = addCodexUsage(state.countedUsage ?? ZERO_CODEX_USAGE, delta);\n\t\tstate.rawBaseline = state.countedUsage;\n\t}\n\tstate.sawUnresolvedTotal = true;\n\trememberCodexTotal(state, total);\n\treturn delta !== undefined && positiveCodexUsage(delta) ? delta : undefined;\n}\n\nfunction cumulativeCodexDelta(\n\tcurrent: NormalizedCodexUsage,\n\tprevious: NormalizedCodexUsage | undefined,\n): NormalizedCodexUsage {\n\tif (previous === undefined) {\n\t\treturn current;\n\t}\n\treturn {\n\t\tinputTokens:\n\t\t\tcurrent.inputTokens < previous.inputTokens ? current.inputTokens : current.inputTokens - previous.inputTokens,\n\t\toutputTokens:\n\t\t\tcurrent.outputTokens < previous.outputTokens\n\t\t\t\t? current.outputTokens\n\t\t\t\t: current.outputTokens - previous.outputTokens,\n\t\tcacheReadTokens:\n\t\t\tcurrent.cacheReadTokens < previous.cacheReadTokens\n\t\t\t\t? current.cacheReadTokens\n\t\t\t\t: current.cacheReadTokens - previous.cacheReadTokens,\n\t};\n}\n\nexport type { CodexContainmentState, NormalizedCodexUsage };\nexport {\n\taddCodexUsage,\n\tapplyCodexContainedSnapshot,\n\tapplyCodexUnresolvedSnapshot,\n\tcodexUsageContains,\n\tcumulativeCodexDelta,\n\tmakeCodexContainmentState,\n\tnormalizeCodexUsage,\n\tpositiveCodexUsage,\n\tsameCodexUsage,\n\tsubtractCodexUsageFloorZero,\n\tZERO_CODEX_USAGE,\n};\n","/**\n * Subset of Codex jsonl event shapes that the parser consumes.\n *\n * The full Codex format carries many other event types; they are silently\n * ignored. We never look at any field that could contain prompt or tool-call\n * 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 id?: string;\n\t\t// biome-ignore lint/style/useNamingConvention: JSON field names from Codex log format\n\t\treadonly turn_id?: string;\n\t\treadonly turnId?: string;\n\t\treadonly info?: {\n\t\t\treadonly id?: string;\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 turn_id?: string;\n\t\t\treadonly turnId?: string;\n\t\t\t// biome-ignore lint/style/useNamingConvention: JSON field names from Codex log format\n\t\t\treadonly last_token_usage?: CodexUsageCounters;\n\t\t\t// biome-ignore lint/style/useNamingConvention: JSON field names from Codex log format\n\t\t\treadonly total_token_usage?: CodexUsageCounters;\n\t\t};\n\t\treadonly model?: string;\n\t};\n\treadonly model?: string;\n};\n\ntype CodexTaskStartedEvent = {\n\treadonly type: \"event_msg\";\n\treadonly timestamp: string;\n\treadonly payload: {\n\t\treadonly type: \"task_started\";\n\t\treadonly id?: string;\n\t\t// biome-ignore lint/style/useNamingConvention: JSON field names from Codex log format\n\t\treadonly turn_id?: string;\n\t\treadonly turnId?: string;\n\t\treadonly info?: {\n\t\t\treadonly id?: string;\n\t\t\t// biome-ignore lint/style/useNamingConvention: JSON field names from Codex log format\n\t\t\treadonly turn_id?: string;\n\t\t\treadonly turnId?: string;\n\t\t};\n\t};\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 id?: string;\n\t// biome-ignore lint/style/useNamingConvention: JSON field names from Codex log format\n\treadonly session_id?: string;\n\treadonly sessionId?: string;\n\treadonly payload: {\n\t\treadonly cwd?: string;\n\t\treadonly id?: string;\n\t\t// biome-ignore lint/style/useNamingConvention: JSON field names from Codex log format\n\t\treadonly session_id?: string;\n\t\treadonly sessionId?: string;\n\t\t// biome-ignore lint/style/useNamingConvention: JSON field names from Codex log format\n\t\treadonly forked_from_id?: string;\n\t\treadonly forkedFromId?: string;\n\t\t// biome-ignore lint/style/useNamingConvention: JSON field names from Codex log format\n\t\treadonly parent_thread_id?: string;\n\t\t// biome-ignore lint/style/useNamingConvention: JSON field names from Codex log format\n\t\treadonly parent_session_id?: string;\n\t\treadonly parentSessionId?: string;\n\t\treadonly timestamp?: string;\n\t};\n};\n\ntype CodexSourceMetadata = {\n\treadonly sourceSessionId: string | undefined;\n\treadonly canonicalSessionId: string | undefined;\n\treadonly lineageSessionId: string | undefined;\n\treadonly parentSourceSessionId: string | undefined;\n\treadonly parentThreadId: string | undefined;\n\treadonly forkedAt: string | undefined;\n\treadonly cwd: string | undefined;\n};\n\ntype CodexUsageCounters = {\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 | CodexTaskStartedEvent | 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\nconst MAX_CODEX_SOURCE_ID_LENGTH = 512;\nconst MAX_CODEX_TIMESTAMP_LENGTH = 128;\nconst MAX_CODEX_LOCAL_PATH_LENGTH = 4096;\n\nfunction isOptionalBoundedString(value: unknown, maxLength: number): value is string | undefined {\n\treturn value === undefined || (typeof value === \"string\" && value.length <= maxLength);\n}\n\nfunction isCodexUsageCounters(value: unknown): value is CodexUsageCounters {\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\tfor (const key of [\"id\", \"turn_id\", \"turnId\"] as const) {\n\t\tif (!isOptionalBoundedString(payload[key], MAX_CODEX_SOURCE_ID_LENGTH)) {\n\t\t\treturn false;\n\t\t}\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\tfor (const key of [\"id\", \"turn_id\", \"turnId\"] as const) {\n\t\t\tif (!isOptionalBoundedString(info[key], MAX_CODEX_SOURCE_ID_LENGTH)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tif (info[\"last_token_usage\"] !== undefined && !isCodexUsageCounters(info[\"last_token_usage\"])) {\n\t\t\treturn false;\n\t\t}\n\t\tif (info[\"total_token_usage\"] !== undefined && !isCodexUsageCounters(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 isCodexTaskStartedEvent(value: unknown): value is CodexTaskStartedEvent {\n\tif (!isObject(value) || value[\"type\"] !== \"event_msg\" || typeof value[\"timestamp\"] !== \"string\") {\n\t\treturn false;\n\t}\n\tconst payload = value[\"payload\"];\n\tif (!isObject(payload) || payload[\"type\"] !== \"task_started\") {\n\t\treturn false;\n\t}\n\tfor (const key of [\"id\", \"turn_id\", \"turnId\"] as const) {\n\t\tif (!isOptionalBoundedString(payload[key], MAX_CODEX_SOURCE_ID_LENGTH)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\tconst info = payload[\"info\"];\n\tif (info === undefined) {\n\t\treturn true;\n\t}\n\tif (!isObject(info)) {\n\t\treturn false;\n\t}\n\treturn [\"id\", \"turn_id\", \"turnId\"].every((key) => isOptionalBoundedString(info[key], MAX_CODEX_SOURCE_ID_LENGTH));\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 (!isOptionalBoundedString(value[\"timestamp\"], MAX_CODEX_TIMESTAMP_LENGTH)) {\n\t\treturn false;\n\t}\n\tfor (const key of [\"id\", \"session_id\", \"sessionId\"] as const) {\n\t\tif (!isOptionalBoundedString(value[key], MAX_CODEX_SOURCE_ID_LENGTH)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\tconst payload = value[\"payload\"];\n\tif (!isObject(payload)) {\n\t\treturn false;\n\t}\n\tif (!isOptionalBoundedString(payload[\"cwd\"], MAX_CODEX_LOCAL_PATH_LENGTH)) {\n\t\treturn false;\n\t}\n\tfor (const key of [\n\t\t\"id\",\n\t\t\"session_id\",\n\t\t\"sessionId\",\n\t\t\"forked_from_id\",\n\t\t\"forkedFromId\",\n\t\t\"parent_thread_id\",\n\t\t\"parent_session_id\",\n\t\t\"parentSessionId\",\n\t] as const) {\n\t\tif (!isOptionalBoundedString(payload[key], MAX_CODEX_SOURCE_ID_LENGTH)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\tif (!isOptionalBoundedString(payload[\"timestamp\"], MAX_CODEX_TIMESTAMP_LENGTH)) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nfunction nonEmpty(value: string | undefined): string | undefined {\n\tconst trimmed = value?.trim();\n\treturn trimmed === undefined || trimmed.length === 0 ? undefined : trimmed;\n}\n\nfunction extractCodexSourceMetadata(event: CodexSessionMetaEvent): CodexSourceMetadata {\n\tconst sourceSessionId = nonEmpty(\n\t\tevent.payload.id ??\n\t\t\tevent.id ??\n\t\t\tevent.payload.session_id ??\n\t\t\tevent.payload.sessionId ??\n\t\t\tevent.session_id ??\n\t\t\tevent.sessionId,\n\t);\n\tconst canonicalSessionId = nonEmpty(\n\t\tevent.payload.session_id ?? event.payload.sessionId ?? event.session_id ?? event.sessionId,\n\t);\n\treturn {\n\t\tsourceSessionId: sourceSessionId,\n\t\tcanonicalSessionId: canonicalSessionId,\n\t\tlineageSessionId: canonicalSessionId ?? sourceSessionId,\n\t\tparentSourceSessionId: nonEmpty(\n\t\t\tevent.payload.forked_from_id ??\n\t\t\t\tevent.payload.forkedFromId ??\n\t\t\t\tevent.payload.parent_session_id ??\n\t\t\t\tevent.payload.parentSessionId,\n\t\t),\n\t\t// Native agent files also carry parent_thread_id for structural thread\n\t\t// ownership. It is not evidence that token counters share a cumulative\n\t\t// scale, so retain it as bounded metadata without using it as a baseline.\n\t\tparentThreadId: nonEmpty(event.payload.parent_thread_id),\n\t\tforkedAt: nonEmpty(event.payload.timestamp ?? event.timestamp),\n\t\tcwd: event.payload.cwd,\n\t};\n}\n\ntype CodexUsageSnapshot = {\n\treadonly last: CodexUsageCounters | undefined;\n\treadonly total: CodexUsageCounters | undefined;\n};\n\nfunction extractCodexUsageSnapshot(event: CodexTokenCountEvent): CodexUsageSnapshot {\n\treturn {\n\t\tlast: event.payload.info?.last_token_usage,\n\t\ttotal: event.payload.info?.total_token_usage,\n\t};\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\nfunction pickCodexTurnId(event: CodexTaskStartedEvent | CodexTokenCountEvent): string | undefined {\n\treturn nonEmpty(\n\t\tevent.payload.turn_id ??\n\t\t\tevent.payload.turnId ??\n\t\t\tevent.payload.id ??\n\t\t\tevent.payload.info?.turn_id ??\n\t\t\tevent.payload.info?.turnId ??\n\t\t\tevent.payload.info?.id,\n\t);\n}\n\nexport type {\n\tCodexEvent,\n\tCodexSessionMetaEvent,\n\tCodexSourceMetadata,\n\tCodexTaskStartedEvent,\n\tCodexTokenCountEvent,\n\tCodexTurnContextEvent,\n\tCodexUsageCounters,\n\tCodexUsageSnapshot,\n};\nexport {\n\textractCodexSourceMetadata,\n\textractCodexUsageSnapshot,\n\tisCodexSessionMetaEvent,\n\tisCodexTaskStartedEvent,\n\tisCodexTokenCountEvent,\n\tisCodexTurnContextEvent,\n\tpickCodexEventModel,\n\tpickCodexTurnId,\n};\n","import { createReadStream } from \"node:fs\";\nimport { open, stat } from \"node:fs/promises\";\nimport { normalize } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport { Cause, Effect, Queue, Stream } from \"effect\";\nimport { type Logger, makeParserSourceReadError, type ParserSourceReadError } from \"../types\";\nimport {\n\taddCodexUsage,\n\tapplyCodexContainedSnapshot,\n\ttype CodexContainmentState,\n\tcumulativeCodexDelta,\n\tmakeCodexContainmentState,\n\ttype NormalizedCodexUsage,\n\tnormalizeCodexUsage,\n\tpositiveCodexUsage,\n\tsameCodexUsage,\n\tZERO_CODEX_USAGE,\n} from \"./counters\";\nimport {\n\ttype CodexSourceMetadata,\n\textractCodexSourceMetadata,\n\textractCodexUsageSnapshot,\n\tisCodexSessionMetaEvent,\n\tisCodexTokenCountEvent,\n} from \"./events\";\n\nconst CANDIDATE_TAIL_BYTES = 262_144;\nconst CANDIDATE_INSPECTION_CONCURRENCY = 8;\n\ntype CodexSourceCandidate = {\n\treadonly path: string;\n\treadonly normalizedPath: string;\n\treadonly metadata: CodexSourceMetadata | undefined;\n\treadonly containsMultipleSessionIds: boolean;\n\treadonly complete: boolean;\n\treadonly mtimeMs: number;\n\treadonly size: number;\n};\n\ntype IndexedCodexSource = {\n\treadonly path: string;\n\treadonly sourceIdentity: string;\n\treadonly sourceSessionId: string | undefined;\n\treadonly lineageSessionId: string | undefined;\n\treadonly parentSourceSessionId: string | undefined;\n\treadonly forkedAt: string | undefined;\n\treadonly cwd: string | undefined;\n\treadonly containsMultipleSessionIds: boolean;\n\treadonly eligible: boolean;\n};\n\ntype CodexSourceIndex = {\n\treadonly sources: readonly IndexedCodexSource[];\n\treadonly bySessionId: ReadonlyMap<string, IndexedCodexSource>;\n\treadonly cycleSessionIds: ReadonlySet<string>;\n};\n\ntype CodexLineageBaseline =\n\t| { readonly _tag: \"Root\" }\n\t| { readonly _tag: \"Resolved\"; readonly usage: NormalizedCodexUsage }\n\t| { readonly _tag: \"Unresolved\"; readonly reason: CodexLineageUnresolvedReason };\n\ntype CodexLineageUnresolvedReason = \"cycle\" | \"invalid_fork_boundary\" | \"missing_parent\";\n\ntype TimestampedCodexUsage = {\n\treadonly timestamp: string;\n\treadonly timestampMs: number | undefined;\n\treadonly usage: NormalizedCodexUsage;\n};\n\ntype SnapshotState = {\n\treadonly snapshots: TimestampedCodexUsage[];\n\treadonly containment: CodexContainmentState | undefined;\n\tcounted: NormalizedCodexUsage;\n\tpreviousTotal: NormalizedCodexUsage | undefined;\n};\n\ntype InspectedCodexMetadata = {\n\treadonly first: CodexSourceMetadata | undefined;\n\treadonly containsMultipleSessionIds: boolean;\n};\n\ntype CodexLineageRequest =\n\t| CodexLineageBaseline\n\t| {\n\t\t\treadonly _tag: \"Ready\";\n\t\t\treadonly forkedAt: string;\n\t\t\treadonly forkedAtMs: number;\n\t\t\treadonly parent: IndexedCodexSource;\n\t\t\treadonly parentId: string;\n\t };\n\ntype CodexLineageResolver = {\n\treadonly baselineFor: (source: IndexedCodexSource) => Effect.Effect<CodexLineageBaseline, ParserSourceReadError>;\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\nasync function inspectSourceMetadata(path: string): Promise<InspectedCodexMetadata> {\n\tconst stream = createReadStream(path, { encoding: \"utf8\" });\n\tconst lines = createInterface({ input: stream, crlfDelay: Number.POSITIVE_INFINITY });\n\tlet first: CodexSourceMetadata | undefined;\n\tconst sourceSessionIds = new Set<string>();\n\ttry {\n\t\tfor await (const line of lines) {\n\t\t\tif (!line.includes(\"session_meta\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlet parsed: unknown;\n\t\t\ttry {\n\t\t\t\tparsed = JSON.parse(line);\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (isCodexSessionMetaEvent(parsed)) {\n\t\t\t\tconst metadata = extractCodexSourceMetadata(parsed);\n\t\t\t\tfirst ??= metadata;\n\t\t\t\tif (metadata.sourceSessionId !== undefined) {\n\t\t\t\t\tsourceSessionIds.add(metadata.sourceSessionId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn { first: first, containsMultipleSessionIds: sourceSessionIds.size > 1 };\n\t} finally {\n\t\tlines.close();\n\t\tstream.destroy();\n\t}\n}\n\nasync function hasCompleteTail(path: string, size: number): Promise<boolean> {\n\tif (size <= 0) {\n\t\treturn false;\n\t}\n\tconst handle = await open(path, \"r\");\n\ttry {\n\t\tconst bytesToRead = Math.min(size, CANDIDATE_TAIL_BYTES);\n\t\tconst tail = Buffer.allocUnsafe(bytesToRead);\n\t\tawait handle.read(tail, 0, bytesToRead, size - bytesToRead);\n\t\tconst lastLine = tail\n\t\t\t.toString(\"utf8\")\n\t\t\t.split(\"\\n\")\n\t\t\t.findLast((line) => line.trim().length > 0)\n\t\t\t?.trim();\n\t\tif (!lastLine) {\n\t\t\treturn false;\n\t\t}\n\t\ttry {\n\t\t\tJSON.parse(lastLine);\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t} finally {\n\t\tawait handle.close();\n\t}\n}\n\nfunction inspectCodexSourceCandidate(path: string): Effect.Effect<CodexSourceCandidate, ParserSourceReadError> {\n\treturn Effect.tryPromise({\n\t\ttry: async () => {\n\t\t\tconst info = await stat(path);\n\t\t\tconst inspectedMetadata = await inspectSourceMetadata(path);\n\t\t\treturn {\n\t\t\t\tpath: path,\n\t\t\t\tnormalizedPath: normalize(path),\n\t\t\t\tmetadata: inspectedMetadata.first,\n\t\t\t\tcontainsMultipleSessionIds: inspectedMetadata.containsMultipleSessionIds,\n\t\t\t\tcomplete: await hasCompleteTail(path, info.size),\n\t\t\t\tmtimeMs: info.mtimeMs,\n\t\t\t\tsize: info.size,\n\t\t\t};\n\t\t},\n\t\tcatch: (error) => makeParserSourceReadError(path, error),\n\t});\n}\n\nfunction candidateComesFirst(a: CodexSourceCandidate, b: CodexSourceCandidate): number {\n\tif (a.complete !== b.complete) {\n\t\treturn a.complete ? -1 : 1;\n\t}\n\tif (a.size !== b.size) {\n\t\treturn b.size - a.size;\n\t}\n\tif (a.mtimeMs !== b.mtimeMs) {\n\t\treturn b.mtimeMs - a.mtimeMs;\n\t}\n\treturn a.normalizedPath.localeCompare(b.normalizedPath);\n}\n\nfunction candidateConflictKind(candidates: readonly CodexSourceCandidate[]): \"fork_boundary\" | \"parent\" | undefined {\n\tconst parents = new Set(candidates.map((candidate) => candidate.metadata?.parentSourceSessionId ?? \"\"));\n\tif (parents.size > 1) {\n\t\treturn \"parent\";\n\t}\n\tconst forkBoundaries = new Set(candidates.map((candidate) => candidate.metadata?.forkedAt ?? \"\"));\n\treturn forkBoundaries.size > 1 ? \"fork_boundary\" : undefined;\n}\n\nfunction cycleSessionIds(sources: readonly IndexedCodexSource[]): ReadonlySet<string> {\n\tconst parents = new Map<string, string>();\n\tconst knownIds = new Set(\n\t\tsources.flatMap((source) => (source.sourceSessionId === undefined ? [] : [source.sourceSessionId])),\n\t);\n\tfor (const source of sources) {\n\t\tif (\n\t\t\tsource.sourceSessionId !== undefined &&\n\t\t\tsource.parentSourceSessionId !== undefined &&\n\t\t\tknownIds.has(source.parentSourceSessionId)\n\t\t) {\n\t\t\tparents.set(source.sourceSessionId, source.parentSourceSessionId);\n\t\t}\n\t}\n\n\tconst cycles = new Set<string>();\n\tfor (const sourceId of [...knownIds].sort()) {\n\t\tconst positions = new Map<string, number>();\n\t\tconst chain: string[] = [];\n\t\tlet current: string | undefined = sourceId;\n\t\twhile (current !== undefined) {\n\t\t\tconst cycleStart = positions.get(current);\n\t\t\tif (cycleStart !== undefined) {\n\t\t\t\tfor (const member of chain.slice(cycleStart)) {\n\t\t\t\t\tcycles.add(member);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tpositions.set(current, chain.length);\n\t\t\tchain.push(current);\n\t\t\tcurrent = parents.get(current);\n\t\t}\n\t}\n\treturn cycles;\n}\n\nfunction groupCodexSourceCandidates(\n\tcandidates: readonly CodexSourceCandidate[],\n): ReadonlyMap<string, CodexSourceCandidate[]> {\n\tconst groups = new Map<string, CodexSourceCandidate[]>();\n\tfor (const candidate of candidates) {\n\t\tconst sourceId = candidate.metadata?.sourceSessionId;\n\t\tconst groupKey = sourceId === undefined ? `path:${candidate.normalizedPath}` : `session:${sourceId}`;\n\t\tconst group = groups.get(groupKey) ?? [];\n\t\tgroup.push(candidate);\n\t\tgroups.set(groupKey, group);\n\t}\n\treturn groups;\n}\n\nfunction indexedSourceFromCandidates(\n\tgroup: CodexSourceCandidate[],\n\tcutoffMs: number,\n\tlogger: Logger,\n): IndexedCodexSource | undefined {\n\tgroup.sort(candidateComesFirst);\n\tconst [canonical] = group;\n\tif (canonical === undefined) {\n\t\treturn undefined;\n\t}\n\tconst conflict = candidateConflictKind(group);\n\tif (conflict !== undefined) {\n\t\tlogger.warn(\"conflicting codex source candidates\", {\n\t\t\tcandidateCount: group.length,\n\t\t\tconflict: conflict,\n\t\t});\n\t}\n\tconst sourceSessionId = canonical.metadata?.sourceSessionId;\n\treturn {\n\t\tpath: canonical.path,\n\t\tsourceIdentity: sourceSessionId ?? canonical.normalizedPath,\n\t\tsourceSessionId: sourceSessionId,\n\t\tlineageSessionId: canonical.metadata?.lineageSessionId,\n\t\tparentSourceSessionId: canonical.metadata?.parentSourceSessionId,\n\t\tforkedAt: canonical.metadata?.forkedAt,\n\t\tcwd: canonical.metadata?.cwd,\n\t\tcontainsMultipleSessionIds:\n\t\t\tcanonical.containsMultipleSessionIds || canonical.metadata?.canonicalSessionId !== undefined,\n\t\teligible: group.some((candidate) => candidate.mtimeMs >= cutoffMs),\n\t};\n}\n\nfunction indexCodexLineageSessions(sources: readonly IndexedCodexSource[]): ReadonlyMap<string, IndexedCodexSource> {\n\tconst bySessionId = new Map<string, IndexedCodexSource>();\n\tfor (const source of sources) {\n\t\tconst { lineageSessionId } = source;\n\t\tif (lineageSessionId === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst existing = bySessionId.get(lineageSessionId);\n\t\tif (\n\t\t\texisting === undefined ||\n\t\t\t(source.sourceSessionId === lineageSessionId && existing.sourceSessionId !== lineageSessionId)\n\t\t) {\n\t\t\tbySessionId.set(lineageSessionId, source);\n\t\t}\n\t}\n\treturn bySessionId;\n}\n\nconst buildCodexSourceIndex: (\n\tpaths: readonly string[],\n\tcutoff: Date,\n\tlogger: Logger,\n) => Effect.Effect<CodexSourceIndex, ParserSourceReadError> = Effect.fn(\"CodexLineage.buildSourceIndex\")(function* (\n\tpaths: readonly string[],\n\tcutoff: Date,\n\tlogger: Logger,\n) {\n\tconst uniquePaths = [...new Set(paths.map(normalize))].sort();\n\tconst candidates = yield* Effect.forEach(uniquePaths, inspectCodexSourceCandidate, {\n\t\tconcurrency: CANDIDATE_INSPECTION_CONCURRENCY,\n\t});\n\tconst groups = groupCodexSourceCandidates(candidates);\n\n\tconst sources: IndexedCodexSource[] = [];\n\tfor (const groupKey of [...groups.keys()].sort()) {\n\t\tconst group = groups.get(groupKey) ?? [];\n\t\tconst source = indexedSourceFromCandidates(group, cutoff.getTime(), logger);\n\t\tif (source !== undefined) {\n\t\t\tsources.push(source);\n\t\t}\n\t}\n\n\tsources.sort((a, b) => a.sourceIdentity.localeCompare(b.sourceIdentity));\n\treturn {\n\t\tsources: sources,\n\t\tbySessionId: indexCodexLineageSessions(sources),\n\t\tcycleSessionIds: cycleSessionIds(sources),\n\t};\n});\n\nfunction parseTimestamp(timestamp: string): number | undefined {\n\tconst parsed = Date.parse(timestamp);\n\treturn Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction parseSnapshotIncrement(\n\tstate: SnapshotState,\n\tlast: ReturnType<typeof extractCodexUsageSnapshot>[\"last\"],\n\ttotal: NormalizedCodexUsage | undefined,\n): NormalizedCodexUsage | undefined {\n\tif (last !== undefined) {\n\t\treturn normalizeCodexUsage(last);\n\t}\n\treturn total === undefined ? undefined : cumulativeCodexDelta(total, state.previousTotal);\n}\n\nfunction accumulateCodexSnapshot(state: SnapshotState, raw: string): SnapshotState {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch {\n\t\treturn state;\n\t}\n\tif (!isCodexTokenCountEvent(parsed)) {\n\t\treturn state;\n\t}\n\tconst snapshot = extractCodexUsageSnapshot(parsed);\n\tconst total = snapshot.total === undefined ? undefined : normalizeCodexUsage(snapshot.total);\n\tif (state.containment !== undefined) {\n\t\tconst last = snapshot.last === undefined ? undefined : normalizeCodexUsage(snapshot.last);\n\t\tconst increment = applyCodexContainedSnapshot(state.containment, last, total);\n\t\tif (increment === undefined) {\n\t\t\treturn state;\n\t\t}\n\t\tstate.counted = addCodexUsage(state.counted, increment);\n\t\tstate.snapshots.push({\n\t\t\ttimestamp: parsed.timestamp,\n\t\t\ttimestampMs: parseTimestamp(parsed.timestamp),\n\t\t\tusage: state.counted,\n\t\t});\n\t\treturn state;\n\t}\n\tif (total !== undefined && state.previousTotal !== undefined && sameCodexUsage(total, state.previousTotal)) {\n\t\treturn state;\n\t}\n\tconst increment = parseSnapshotIncrement(state, snapshot.last, total);\n\tif (total !== undefined) {\n\t\tstate.previousTotal = total;\n\t}\n\tif (increment === undefined || !positiveCodexUsage(increment)) {\n\t\treturn state;\n\t}\n\tstate.counted = addCodexUsage(state.counted, increment);\n\tstate.snapshots.push({\n\t\ttimestamp: parsed.timestamp,\n\t\ttimestampMs: parseTimestamp(parsed.timestamp),\n\t\tusage: state.counted,\n\t});\n\treturn state;\n}\n\nfunction collectCodexSnapshots(\n\tpath: string,\n\tcontainsMultipleSessionIds: boolean,\n): Effect.Effect<readonly TimestampedCodexUsage[], ParserSourceReadError> {\n\treturn lineStreamFromFile(path).pipe(\n\t\tStream.runFold(\n\t\t\t(): SnapshotState => ({\n\t\t\t\tsnapshots: [],\n\t\t\t\tcontainment: containsMultipleSessionIds ? makeCodexContainmentState() : undefined,\n\t\t\t\tcounted: ZERO_CODEX_USAGE,\n\t\t\t\tpreviousTotal: undefined,\n\t\t\t}),\n\t\t\taccumulateCodexSnapshot,\n\t\t),\n\t\tEffect.map((state) => state.snapshots),\n\t);\n}\n\nfunction selectInheritedUsage(\n\tsnapshots: readonly TimestampedCodexUsage[],\n\tforkedAt: string,\n\tforkedAtMs: number,\n): NormalizedCodexUsage {\n\tlet inherited = ZERO_CODEX_USAGE;\n\tfor (const snapshot of snapshots) {\n\t\tconst atOrBefore =\n\t\t\tsnapshot.timestampMs === undefined ? snapshot.timestamp <= forkedAt : snapshot.timestampMs <= forkedAtMs;\n\t\tif (atOrBefore) {\n\t\t\tinherited = snapshot.usage;\n\t\t}\n\t}\n\treturn inherited;\n}\n\nfunction makeCodexLineageResolver(index: CodexSourceIndex, logger: Logger): CodexLineageResolver {\n\tconst snapshotsBySessionId = new Map<string, readonly TimestampedCodexUsage[]>();\n\tconst warned = new Set<string>();\n\n\tconst unresolved = (source: IndexedCodexSource, reason: CodexLineageUnresolvedReason): CodexLineageBaseline => {\n\t\tconst warningKey = `${source.sourceIdentity}:${reason}`;\n\t\tif (!warned.has(warningKey)) {\n\t\t\twarned.add(warningKey);\n\t\t\tlogger.warn(\"codex fork baseline unresolved\", { reason: reason });\n\t\t}\n\t\treturn { _tag: \"Unresolved\", reason: reason };\n\t};\n\tconst requestFor = (source: IndexedCodexSource): CodexLineageRequest => {\n\t\tconst parentId = source.parentSourceSessionId;\n\t\tif (parentId === undefined) {\n\t\t\treturn { _tag: \"Root\" };\n\t\t}\n\t\tif (source.sourceSessionId !== undefined && index.cycleSessionIds.has(source.sourceSessionId)) {\n\t\t\treturn unresolved(source, \"cycle\");\n\t\t}\n\t\tconst parent = index.bySessionId.get(parentId);\n\t\tif (parent === undefined) {\n\t\t\treturn unresolved(source, \"missing_parent\");\n\t\t}\n\t\tconst { forkedAt } = source;\n\t\tconst forkedAtMs = forkedAt === undefined ? undefined : parseTimestamp(forkedAt);\n\t\tif (forkedAt === undefined || forkedAtMs === undefined) {\n\t\t\treturn unresolved(source, \"invalid_fork_boundary\");\n\t\t}\n\t\treturn { _tag: \"Ready\", forkedAt: forkedAt, forkedAtMs: forkedAtMs, parent: parent, parentId: parentId };\n\t};\n\n\treturn {\n\t\tbaselineFor: Effect.fn(\"CodexLineage.baselineFor\")(function* (source: IndexedCodexSource) {\n\t\t\tconst request = requestFor(source);\n\t\t\tif (request._tag !== \"Ready\") {\n\t\t\t\treturn request;\n\t\t\t}\n\n\t\t\tlet snapshots = snapshotsBySessionId.get(request.parentId);\n\t\t\tif (snapshots === undefined) {\n\t\t\t\tsnapshots = yield* collectCodexSnapshots(request.parent.path, request.parent.containsMultipleSessionIds);\n\t\t\t\tsnapshotsBySessionId.set(request.parentId, snapshots);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t_tag: \"Resolved\",\n\t\t\t\tusage: selectInheritedUsage(snapshots, request.forkedAt, request.forkedAtMs),\n\t\t\t} as const;\n\t\t}),\n\t};\n}\n\nexport type {\n\tCodexLineageBaseline,\n\tCodexLineageResolver,\n\tCodexLineageUnresolvedReason,\n\tCodexSourceIndex,\n\tIndexedCodexSource,\n};\nexport { buildCodexSourceIndex, lineStreamFromFile, makeCodexLineageResolver };\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 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 isSidechain?: boolean;\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\nconst MAX_CLAUDE_SOURCE_ID_LENGTH = 512;\nconst MAX_CLAUDE_TIMESTAMP_LENGTH = 128;\nconst MAX_CLAUDE_LOCAL_PATH_LENGTH = 4096;\n\nfunction isOptionalBoundedString(value: unknown, maxLength: number): value is string | undefined {\n\treturn value === undefined || (typeof value === \"string\" && value.length <= maxLength);\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\" || value[\"timestamp\"].length > MAX_CLAUDE_TIMESTAMP_LENGTH) {\n\t\treturn false;\n\t}\n\tif (!isOptionalBoundedString(value[\"cwd\"], MAX_CLAUDE_LOCAL_PATH_LENGTH)) {\n\t\treturn false;\n\t}\n\tif (!isOptionalBoundedString(value[\"requestId\"], MAX_CLAUDE_SOURCE_ID_LENGTH)) {\n\t\treturn false;\n\t}\n\tif (value[\"isSidechain\"] !== undefined && typeof value[\"isSidechain\"] !== \"boolean\") {\n\t\treturn false;\n\t}\n\tconst message = value[\"message\"];\n\tif (!isObject(message)) {\n\t\treturn false;\n\t}\n\tif (!isOptionalBoundedString(message[\"id\"], MAX_CLAUDE_SOURCE_ID_LENGTH)) {\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 { type CodexUsageCandidate, codexFileUsageEffect } from \"./bucketize\";\nimport { buildCodexSourceIndex, makeCodexLineageResolver } from \"./lineage\";\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\ntype MutableCodexBucket = {\n\tcacheReadTokens: number;\n\thourUtc: Date;\n\tinputTokens: number;\n\tmodel: string;\n\toutputTokens: number;\n\tsessionIdentity: string;\n\tsessionLastSeenAt: Date;\n\tsessionStartedAt: Date;\n};\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\nfunction candidateIdentity(candidate: CodexUsageCandidate): string {\n\treturn [\n\t\tcandidate.canonicalSessionIdentity,\n\t\tcandidate.turnId ?? \"\",\n\t\tString(candidate.eventIndex),\n\t\tcandidate.hourUtc.toISOString().slice(0, 10),\n\t\tcandidate.model,\n\t\tString(candidate.inputTokens),\n\t\tString(candidate.cacheReadTokens),\n\t\tString(candidate.outputTokens),\n\t].join(\"\\u001f\");\n}\n\nfunction reconcileCodexCandidates(candidates: readonly CodexUsageCandidate[]): readonly CodexUsageCandidate[] {\n\tconst seen = new Set<string>();\n\tconst winners: CodexUsageCandidate[] = [];\n\tfor (const candidate of candidates) {\n\t\tconst identity = candidateIdentity(candidate);\n\t\tif (seen.has(identity)) {\n\t\t\tcontinue;\n\t\t}\n\t\tseen.add(identity);\n\t\twinners.push(candidate);\n\t}\n\treturn winners;\n}\n\nfunction bucketsFromCodexCandidates(candidates: readonly CodexUsageCandidate[]): readonly ParsedBucket[] {\n\tconst buckets = new Map<string, MutableCodexBucket>();\n\tfor (const candidate of candidates) {\n\t\tconst identity = `${candidate.sessionIdentity}\\u001f${candidate.hourUtc.toISOString()}\\u001f${candidate.model}`;\n\t\tconst existing = buckets.get(identity);\n\t\tif (existing === undefined) {\n\t\t\tbuckets.set(identity, {\n\t\t\t\tcacheReadTokens: candidate.cacheReadTokens,\n\t\t\t\thourUtc: candidate.hourUtc,\n\t\t\t\tinputTokens: candidate.inputTokens,\n\t\t\t\tmodel: candidate.model,\n\t\t\t\toutputTokens: candidate.outputTokens,\n\t\t\t\tsessionIdentity: candidate.sessionIdentity,\n\t\t\t\tsessionLastSeenAt: candidate.sessionLastSeenAt,\n\t\t\t\tsessionStartedAt: candidate.sessionStartedAt,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\texisting.inputTokens += candidate.inputTokens;\n\t\texisting.outputTokens += candidate.outputTokens;\n\t\texisting.cacheReadTokens += candidate.cacheReadTokens;\n\t}\n\treturn [...buckets.values()].map((bucket) => ({\n\t\tharness: \"codex\" as const,\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: 0,\n\t\tsessionIds: new Set([bucket.sessionIdentity]),\n\t\tsessionStartedAt: bucket.sessionStartedAt,\n\t\tsessionLastSeenAt: bucket.sessionLastSeenAt,\n\t}));\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 bucketizeIndexedCodexFilesStream(Stream.succeed(root), opts.cutoff, logger, {\n\t\t\t\t\texcludePath: opts.excludePath,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn bucketizeIndexedCodexFilesStream(\n\t\t\t\twalkManyStreamStrict(codexRoots(opts, root), new Date(0)),\n\t\t\t\topts.cutoff,\n\t\t\t\tlogger,\n\t\t\t\t{ excludePath: 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 bucketizeIndexedCodexFilesStream(Stream.succeed(root), opts.cutoff, logger, {\n\t\t\t\t\texcludePath: opts.excludePath,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn bucketizeIndexedCodexFilesStream(\n\t\t\t\twalkManyStream(codexRoots(opts, root), new Date(0)),\n\t\t\t\topts.cutoff,\n\t\t\t\tlogger,\n\t\t\t\t{ excludePath: 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 bucketizeIndexedCodexFilesStream<E, R>(\n\tfiles: Stream.Stream<string, E, R>,\n\tcutoff: Date,\n\tlogger: Logger,\n\toptions: { readonly excludePath?: LocalPathFilter },\n): Stream.Stream<ParsedBucket, E | ParserSourceReadError, R> {\n\treturn Stream.unwrap(\n\t\tfiles.pipe(\n\t\t\tStream.runCollect,\n\t\t\tEffect.map((paths) => [...paths]),\n\t\t\tEffect.flatMap((paths) => buildCodexSourceIndex(paths, cutoff, logger)),\n\t\t\tEffect.flatMap((index) =>\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst resolver = makeCodexLineageResolver(index, logger);\n\t\t\t\t\tconst usages = yield* Effect.forEach(\n\t\t\t\t\t\tindex.sources.filter((source) => source.eligible),\n\t\t\t\t\t\t(source) =>\n\t\t\t\t\t\t\tresolver.baselineFor(source).pipe(\n\t\t\t\t\t\t\t\tEffect.flatMap((lineageBaseline) =>\n\t\t\t\t\t\t\t\t\tcodexFileUsageEffect(source.path, logger, {\n\t\t\t\t\t\t\t\t\t\t...options,\n\t\t\t\t\t\t\t\t\t\tcanonicalSessionIdentity: source.lineageSessionId ?? source.sourceIdentity,\n\t\t\t\t\t\t\t\t\t\tcontainInterleavedTotals: source.containsMultipleSessionIds,\n\t\t\t\t\t\t\t\t\t\tlineageBaseline: lineageBaseline,\n\t\t\t\t\t\t\t\t\t\tsessionIdentity: source.sourceIdentity,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tconst candidates = usages.flatMap((usage) => usage.candidates);\n\t\t\t\t\treturn Stream.fromIterable(bucketsFromCodexCandidates(reconcileCodexCandidates(candidates)));\n\t\t\t\t}),\n\t\t\t),\n\t\t),\n\t);\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\ntype SqliteModule = typeof import(\"node:sqlite\");\ntype DatabaseSyncConstructor = SqliteModule[\"DatabaseSync\"];\ntype DatabaseSync = InstanceType<DatabaseSyncConstructor>;\ntype HermesSqliteOperation = \"close\" | \"load\" | \"open\" | \"query\" | \"schema\";\n\ntype HermesSqliteModelUsageRow = {\n\treadonly sessionId: unknown;\n\treadonly model: unknown;\n\treadonly billingProvider: unknown;\n\treadonly firstSeen: unknown;\n\treadonly lastSeen: unknown;\n\treadonly inputTokens: unknown;\n\treadonly outputTokens: unknown;\n\treadonly cacheReadTokens: unknown;\n\treadonly cacheWriteTokens: unknown;\n\treadonly reasoningTokens?: unknown;\n};\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 reasoningTokens?: unknown;\n\treadonly cwd: unknown;\n\treadonly modelUsageRows?: readonly HermesSqliteModelUsageRow[];\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([\"close\", \"load\", \"open\", \"query\", \"schema\"]),\n\tpath: Schema.optionalKey(Schema.String),\n\tcause: Schema.optionalKey(Schema.Defect()),\n}) {}\n\ntype UnsupportedHermesSchema = {\n\treadonly _tag: \"UnsupportedHermesSchema\";\n\treadonly message: string;\n};\n\nfunction unsupportedSchema(message: string): UnsupportedHermesSchema {\n\treturn { _tag: \"UnsupportedHermesSchema\", message: message };\n}\n\nfunction isUnsupportedSchema(value: unknown): value is UnsupportedHermesSchema {\n\treturn typeof value === \"object\" && value !== null && \"_tag\" in value && value._tag === \"UnsupportedHermesSchema\";\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\nfunction tableNames(db: DatabaseSync): ReadonlySet<string> {\n\tconst rows = db.prepare(\"select name from sqlite_master where type = 'table'\").all() as Array<{ name?: unknown }>;\n\treturn new Set(rows.flatMap((row) => (typeof row.name === \"string\" ? [row.name] : [])));\n}\n\nfunction tableColumns(db: DatabaseSync, table: \"sessions\" | \"session_model_usage\"): ReadonlySet<string> {\n\tconst rows = db.prepare(`pragma table_info(${table})`).all() as Array<{ name?: unknown }>;\n\treturn new Set(rows.flatMap((row) => (typeof row.name === \"string\" ? [row.name] : [])));\n}\n\nfunction requireColumns(table: string, columns: ReadonlySet<string>, required: readonly string[]): void {\n\tconst missing = required.filter((column) => !columns.has(column));\n\tif (missing.length > 0) {\n\t\tthrow unsupportedSchema(`${table} is missing required accounting columns`);\n\t}\n}\n\nfunction selectedColumn(columns: ReadonlySet<string>, column: string, alias: string, qualifier?: string): string {\n\tconst source = qualifier === undefined ? column : `${qualifier}.${column}`;\n\treturn columns.has(column) ? `${source} as \"${alias}\"` : `null as \"${alias}\"`;\n}\n\nfunction sessionRows(db: DatabaseSync, cutoffSeconds: number): HermesSqliteSessionRow[] {\n\tconst columns = tableColumns(db, \"sessions\");\n\trequireColumns(\"sessions\", columns, [\"id\", \"model\", \"started_at\", \"ended_at\", \"input_tokens\", \"output_tokens\"]);\n\tconst query = `\n select\n id,\n model,\n ${selectedColumn(columns, \"billing_provider\", \"billingProvider\")},\n started_at as \"startedAt\",\n ended_at as \"endedAt\",\n input_tokens as \"inputTokens\",\n output_tokens as \"outputTokens\",\n ${selectedColumn(columns, \"cache_read_tokens\", \"cacheReadTokens\")},\n ${selectedColumn(columns, \"cache_write_tokens\", \"cacheWriteTokens\")},\n ${selectedColumn(columns, \"reasoning_tokens\", \"reasoningTokens\")},\n ${selectedColumn(columns, \"cwd\", \"cwd\")}\n from sessions\n where ended_at is null or ended_at >= ?\n order by started_at asc, id asc\n `;\n\treturn db.prepare(query).all(cutoffSeconds) as unknown as HermesSqliteSessionRow[];\n}\n\nfunction modelUsageRows(db: DatabaseSync, cutoffSeconds: number): HermesSqliteModelUsageRow[] {\n\tconst columns = tableColumns(db, \"session_model_usage\");\n\trequireColumns(\"session_model_usage\", columns, [\"session_id\", \"model\", \"input_tokens\", \"output_tokens\"]);\n\tconst query = `\n select\n usage.session_id as \"sessionId\",\n usage.model,\n\t\t${selectedColumn(columns, \"billing_provider\", \"billingProvider\", \"usage\")},\n\t\t${selectedColumn(columns, \"first_seen\", \"firstSeen\", \"usage\")},\n\t\t${selectedColumn(columns, \"last_seen\", \"lastSeen\", \"usage\")},\n usage.input_tokens as \"inputTokens\",\n usage.output_tokens as \"outputTokens\",\n\t\t${selectedColumn(columns, \"cache_read_tokens\", \"cacheReadTokens\", \"usage\")},\n\t\t${selectedColumn(columns, \"cache_write_tokens\", \"cacheWriteTokens\", \"usage\")},\n\t\t${selectedColumn(columns, \"reasoning_tokens\", \"reasoningTokens\", \"usage\")}\n from session_model_usage as usage\n inner join sessions on sessions.id = usage.session_id\n where sessions.ended_at is null or sessions.ended_at >= ?\n order by usage.session_id asc, usage.model asc\n `;\n\treturn db.prepare(query).all(cutoffSeconds) as unknown as HermesSqliteModelUsageRow[];\n}\n\nfunction attachModelUsageRows(\n\tsessions: readonly HermesSqliteSessionRow[],\n\tusageRows: readonly HermesSqliteModelUsageRow[],\n): readonly HermesSqliteSessionRow[] {\n\tconst bySession = new Map<string, HermesSqliteModelUsageRow[]>();\n\tfor (const row of usageRows) {\n\t\tif (typeof row.sessionId !== \"string\") {\n\t\t\tcontinue;\n\t\t}\n\t\tconst rows = bySession.get(row.sessionId) ?? [];\n\t\trows.push(row);\n\t\tbySession.set(row.sessionId, rows);\n\t}\n\treturn sessions.map((row) => ({\n\t\t...row,\n\t\tmodelUsageRows: typeof row.id === \"string\" ? (bySession.get(row.id) ?? []) : [],\n\t}));\n}\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 tables = tableNames(db);\n\t\t\tif (!tables.has(\"sessions\")) {\n\t\t\t\tthrow unsupportedSchema(\"sessions table is unavailable\");\n\t\t\t}\n\t\t\tconst cutoffSeconds = cutoff.getTime() / MILLISECONDS_PER_SECOND;\n\t\t\tconst sessions = sessionRows(db, cutoffSeconds);\n\t\t\tif (!tables.has(\"session_model_usage\")) {\n\t\t\t\treturn sessions;\n\t\t\t}\n\t\t\treturn attachModelUsageRows(sessions, modelUsageRows(db, cutoffSeconds));\n\t\t},\n\t\tcatch: (error) =>\n\t\t\tisUnsupportedSchema(error)\n\t\t\t\t? new HermesSqliteError({\n\t\t\t\t\t\tmessage: \"Hermes SQLite schema does not expose supported accounting aggregates\",\n\t\t\t\t\t\toperation: \"schema\",\n\t\t\t\t\t\tpath: path,\n\t\t\t\t\t\tcause: error,\n\t\t\t\t\t})\n\t\t\t\t: toHermesSqliteError(\"query\", path)(error),\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 { HermesSqliteModelUsageRow, 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(collectHermesDatabaseStream(root, logger, opts));\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(collectHermesDatabaseStream(stateDb, logger, opts));\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\nfunction collectHermesDatabaseStream(\n\tpath: string,\n\tlogger: Logger,\n\topts: ParsePiOptions,\n): Stream.Stream<ParsedBucket, HermesSqliteError, HermesSqlite> {\n\treturn Stream.fromIterableEffect(bucketizeHermesDatabaseEffect(path, opts.cutoff, opts.excludePath)).pipe(\n\t\tStream.catchTag(\"HermesSqliteError\", (error) => {\n\t\t\tif (error.operation !== \"schema\") {\n\t\t\t\treturn Stream.fail(error);\n\t\t\t}\n\t\t\treturn Stream.fromEffectDrain(\n\t\t\t\tEffect.sync(() => logger.warn(\"unsupported hermes sqlite schema\", { reason: \"unsupported_schema\" })),\n\t\t\t);\n\t\t}),\n\t);\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(() => {\n\t\t\t\t\tif (error.operation === \"schema\") {\n\t\t\t\t\t\tlogger.warn(\"unsupported hermes sqlite schema\", { reason: \"unsupported_schema\" });\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlogger.warn(\"failed to parse hermes sqlite database\", { path: error.path });\n\t\t\t\t}),\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 HermesSqliteModelUsageRow,\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 hermesModelId(provider: unknown, model: unknown, fallbackProvider?: unknown): string | undefined {\n\tif (typeof model !== \"string\") {\n\t\treturn undefined;\n\t}\n\tconst trimmedModel = model.trim();\n\tif (trimmedModel.length === 0) {\n\t\treturn undefined;\n\t}\n\tconst directProvider = typeof provider === \"string\" ? provider.trim() : \"\";\n\tconst fallback = typeof fallbackProvider === \"string\" ? fallbackProvider.trim() : \"\";\n\tconst sourceProvider = directProvider.length > 0 ? directProvider : fallback;\n\tif (sourceProvider.length > 0) {\n\t\tconst normalizedProvider = normalizeProvider(sourceProvider);\n\t\tif (trimmedModel.startsWith(`${sourceProvider}/`)) {\n\t\t\treturn `${normalizedProvider}/${trimmedModel.slice(sourceProvider.length + 1)}`;\n\t\t}\n\t\tif (trimmedModel.startsWith(`${normalizedProvider}/`)) {\n\t\t\treturn trimmedModel;\n\t\t}\n\t\treturn `${normalizedProvider}/${trimmedModel}`;\n\t}\n\tconst separator = trimmedModel.indexOf(\"/\");\n\tif (separator <= 0) {\n\t\treturn undefined;\n\t}\n\treturn `${normalizeProvider(trimmedModel.slice(0, separator))}/${trimmedModel.slice(separator + 1)}`;\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\ntype NormalizedHermesUsage = {\n\treadonly cacheCreateTokens: number;\n\treadonly cacheReadTokens: number;\n\treadonly inputTokens: number;\n\treadonly outputTokens: number;\n};\n\nfunction normalizeHermesUsage(row: {\n\treadonly inputTokens: unknown;\n\treadonly outputTokens: unknown;\n\treadonly cacheReadTokens: unknown;\n\treadonly cacheWriteTokens: unknown;\n}): NormalizedHermesUsage {\n\treturn {\n\t\tinputTokens: positive(row.inputTokens),\n\t\toutputTokens: positive(row.outputTokens),\n\t\tcacheReadTokens: positive(row.cacheReadTokens),\n\t\tcacheCreateTokens: positive(row.cacheWriteTokens),\n\t};\n}\n\nfunction addHermesUsage(left: NormalizedHermesUsage, right: NormalizedHermesUsage): NormalizedHermesUsage {\n\treturn {\n\t\tinputTokens: left.inputTokens + right.inputTokens,\n\t\toutputTokens: left.outputTokens + right.outputTokens,\n\t\tcacheReadTokens: left.cacheReadTokens + right.cacheReadTokens,\n\t\tcacheCreateTokens: left.cacheCreateTokens + right.cacheCreateTokens,\n\t};\n}\n\nfunction subtractHermesUsageFloorZero(\n\tcurrent: NormalizedHermesUsage,\n\tbaseline: NormalizedHermesUsage,\n): NormalizedHermesUsage {\n\treturn {\n\t\tinputTokens: Math.max(0, current.inputTokens - baseline.inputTokens),\n\t\toutputTokens: Math.max(0, current.outputTokens - baseline.outputTokens),\n\t\tcacheReadTokens: Math.max(0, current.cacheReadTokens - baseline.cacheReadTokens),\n\t\tcacheCreateTokens: Math.max(0, current.cacheCreateTokens - baseline.cacheCreateTokens),\n\t};\n}\n\nfunction hasHermesUsage(usage: NormalizedHermesUsage): boolean {\n\treturn usage.inputTokens > 0 || usage.outputTokens > 0 || usage.cacheReadTokens > 0 || usage.cacheCreateTokens > 0;\n}\n\nfunction maxModelLastSeen(rows: readonly HermesSqliteModelUsageRow[]): number | undefined {\n\tlet latest: number | undefined;\n\tfor (const row of rows) {\n\t\tconst at = timestampMs(row.lastSeen) ?? timestampMs(row.firstSeen);\n\t\tif (at !== undefined && (latest === undefined || at > latest)) {\n\t\t\tlatest = at;\n\t\t}\n\t}\n\treturn latest;\n}\n\nfunction makeHermesBucket(options: {\n\treadonly attributedAtMs: number;\n\treadonly lastSeenAtMs: number;\n\treadonly model: string;\n\treadonly sessionId: string;\n\treadonly startedAtMs: number;\n\treadonly usage: NormalizedHermesUsage;\n}): ParsedBucket | undefined {\n\tif (!hasHermesUsage(options.usage)) {\n\t\treturn undefined;\n\t}\n\tconst startedAt = new Date(options.startedAtMs);\n\treturn {\n\t\tharness: \"hermes\",\n\t\tmodel: options.model,\n\t\thourUtc: startOfUtcHour(new Date(options.attributedAtMs)),\n\t\tinputTokens: options.usage.inputTokens,\n\t\toutputTokens: options.usage.outputTokens,\n\t\tcacheReadTokens: options.usage.cacheReadTokens,\n\t\tcacheCreateTokens: options.usage.cacheCreateTokens,\n\t\tsessionIds: new Set([`hermes:${options.sessionId}`]),\n\t\tsessionStartedAt: startedAt,\n\t\tsessionLastSeenAt: new Date(options.lastSeenAtMs),\n\t};\n}\n\nfunction bucketizeHermesModelUsage(options: {\n\treadonly fallbackProvider: unknown;\n\treadonly lastSeenAtMs: number;\n\treadonly rows: readonly HermesSqliteModelUsageRow[];\n\treadonly sessionId: string;\n\treadonly startedAtMs: number;\n}): { readonly attributedUsage: NormalizedHermesUsage; readonly buckets: readonly ParsedBucket[] } {\n\tconst buckets: ParsedBucket[] = [];\n\tlet attributedUsage: NormalizedHermesUsage = {\n\t\tcacheCreateTokens: 0,\n\t\tcacheReadTokens: 0,\n\t\tinputTokens: 0,\n\t\toutputTokens: 0,\n\t};\n\tfor (const usageRow of options.rows) {\n\t\tconst model = hermesModelId(usageRow.billingProvider, usageRow.model, options.fallbackProvider);\n\t\tif (model === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst usage = normalizeHermesUsage(usageRow);\n\t\tconst bucket = makeHermesBucket({\n\t\t\tattributedAtMs: timestampMs(usageRow.firstSeen) ?? options.startedAtMs,\n\t\t\tlastSeenAtMs: options.lastSeenAtMs,\n\t\t\tmodel: model,\n\t\t\tsessionId: options.sessionId,\n\t\t\tstartedAtMs: options.startedAtMs,\n\t\t\tusage: usage,\n\t\t});\n\t\tif (bucket !== undefined) {\n\t\t\tbuckets.push(bucket);\n\t\t\tattributedUsage = addHermesUsage(attributedUsage, usage);\n\t\t}\n\t}\n\treturn { attributedUsage: attributedUsage, buckets: buckets };\n}\n\nfunction hermesRowToBuckets(\n\trow: HermesSqliteSessionRow,\n\texcludePath: LocalPathFilter | undefined,\n): readonly ParsedBucket[] {\n\tif (typeof row.cwd === \"string\" && excludePath?.(row.cwd) === true) {\n\t\treturn [];\n\t}\n\n\tconst sessionId = typeof row.id === \"string\" ? row.id : undefined;\n\tconst startedAtMs = timestampMs(row.startedAt);\n\tif (sessionId === undefined || startedAtMs === undefined) {\n\t\treturn [];\n\t}\n\tconst modelUsageRows = row.modelUsageRows ?? [];\n\tconst lastSeenAtMs = timestampMs(row.endedAt) ?? maxModelLastSeen(modelUsageRows) ?? startedAtMs;\n\tconst modelUsage = bucketizeHermesModelUsage({\n\t\tfallbackProvider: row.billingProvider,\n\t\tlastSeenAtMs: lastSeenAtMs,\n\t\trows: modelUsageRows,\n\t\tsessionId: sessionId,\n\t\tstartedAtMs: startedAtMs,\n\t});\n\tconst buckets = [...modelUsage.buckets];\n\n\tconst aggregateUsage = normalizeHermesUsage(row);\n\tconst residualUsage = subtractHermesUsageFloorZero(aggregateUsage, modelUsage.attributedUsage);\n\tconst residualModel = hermesModelId(row.billingProvider, row.model);\n\tif (residualModel !== undefined) {\n\t\tconst residual = makeHermesBucket({\n\t\t\tattributedAtMs: startedAtMs,\n\t\t\tlastSeenAtMs: lastSeenAtMs,\n\t\t\tmodel: residualModel,\n\t\t\tsessionId: sessionId,\n\t\t\tstartedAtMs: startedAtMs,\n\t\t\tusage: residualUsage,\n\t\t});\n\t\tif (residual !== undefined) {\n\t\t\tbuckets.push(residual);\n\t\t}\n\t}\n\treturn buckets;\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\tbuckets.push(...hermesRowToBuckets(row, excludePath));\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 { sessionLastSeenAt, sessionStartedAt } = acc;\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","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","Schema","RpcGroup","Rpc","Effect","Stream","Effect","Schema","Stream","Stream","Effect","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","Stream","localSessionText","phase","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","normalize","createInterface","Cause","Effect","Queue","Stream","Effect","Stream","key","normalize","createInterface","Effect","Stream","Schema","Stream","Stream","Effect","createInterface","normalize","increment","key","model","Stream","Effect","isObject","isFiniteNumber","isOptionalBoundedString","key","shouldExcludePath","lineStreamFromFile","Stream","Effect","createReadStream","createInterface","Queue","Cause","timestampMs","normalize","candidatesFromAccumulator","addToBucket","markSessionSeen","dirname","Stream","Effect","Effect","Stream","Effect","Stream","Stream","Effect","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","modelUsageRows","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"]}
|