clanka 0.7.4 → 0.7.6

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.
@@ -1 +1 @@
1
- {"version":3,"file":"SemanticSearch-O6PZBRfd.mjs","names":["TypeId","make","Effect.contextWith","Context.getOrUndefined","Effect.void","Effect.tap","Effect.gen","Effect.context","Context.get","Scope.Scope","Queue.make","Effect.runForkWith","Fiber.runIn","Scope.addFinalizer","Effect.sync","Effect.map","Stream.fromQueue","Stream.unwrap","Effect.suspend","Effect.provideService","Effect.onExit","layer","Hash.hash","make","makeUnsafe","Effect.useSpan","Effect.scoped","Effect.flatMap","Effect.provideService","Tracer.ParentSpan","Stream.unwrap","Effect.makeSpanScoped","Effect.map","Effect.succeed","Stream.provideService","internalEffect.makeSpanUnsafe","Effect.onExit","internalEffect.endSpan","Effect.withFiber","TypeId","make","Effect.flatMap","Effect.serviceOption","Option.match","Effect.succeed","Scope.make","Effect.map","Scope.provide","Statement.make","Stream.fromQueue","Stream.unwrap","Context.Service","Effect.uninterruptibleMask","Effect.useSpan","Effect.withFiber","Context.getOption","Effect.onExitPrimitive","Effect.provideContext","Context.add","Semaphore.makeUnsafe","Tracer.ParentSpan","Exit.isSuccess","Effect.orDie","Effect.void","Scope.close","Context.getUnsafe","TypeId","effect.contextWith","Proto","effect.updateContext","Context.merge","MutableHashMap.make","Duration.fromInputUnsafe","effect.succeed","make","Duration.infinity","core.withFiber","MutableHashMap.get","Option.isSome","effect.exitHasInterrupts","Duration.isFinite","effect.ClockRef","Duration.toMillis","Duration.isZero","effect.forkUnsafe","effect.onExit","effect.fiberJoin","effect.void","effect.fiberInterrupt","MutableHashMap.size","TypeId","Predicate.hasProperty","extract","Schema.isSchema","Schema.Struct","make","Struct","Schema.Class","Field","Union","Struct_.evolve","Schema.decodeTo","Schema.brand","Schema.toType","Schema.withConstructorDefault","Effect.map","Schema.Union","Schema.optionalKey","Schema.NullOr","Schema.decodeTo","Schema.Option","Schema.toType","SchemaTransformation.transformOptional","Option.filter","Predicate.isNotNull","Option.some","Option.flatten","Schema.OptionFromNullOr","Schema.BooleanFromBit","Schema.Boolean","Date","Schema.DateTimeUtc","DateTime.removeTime","DateTime.formatIsoDate","DateTime.now","Schema.DateTimeUtcFromString","Schema.DateTimeUtcFromDate","Schema.DateTimeUtcFromMillis","TypeId","Schema.String","Predicate.hasProperty","Schema.Natural","Equal.symbol","Equal.equals","Hash.symbol","Hash.hash","Effect.request","Schema.decodeUnknownEffect","Schema.Array","RequestResolver.makeGrouped","Effect.fnUntraced","Arr.isArrayNonEmpty","Effect.provideContext","Exit.succeed","MutableHashMap.get","MutableHashMap.isEmpty","Exit.void","Cause.NoSuchElementError","Arr.empty","Schema.encodeEffect","Effect.matchCauseEager","Exit.failCause","MutableHashMap.empty","Option.isSome","Context.getOrUndefined","SqlClient.SqlClient","Equal.byReferenceUnsafe","Schema.encodeEffect","Schema.decodeUnknownEffect","Schema.mutable","Schema.Array","Effect.flatMap","Effect.gen","SqlResolver.ordered","Effect.forEach","Effect.map","RequestResolver.withSpan","SqlResolver.void","SqlResolver.findById","Schema.brand","Schema.instanceOf","Schema.Array","Schema.Number","Schema.decodeTo","SchemaTransformation.transform","Model.Field","Model.Class","Model.FieldExcept","Schema.String","Context.Service","Schema.TaggedError","Schema.Union","SqlError.SqlError","layer","Layer.effect","Effect.gen","SqlClient.SqlClient","EmbeddingModel.Dimensions","SqlModel.makeResolvers","SqlSchema.findAll","Schema.Struct","SqlResolver.findById","RequestResolver.setDelay","SqlResolver.request","Effect.catchTags","Effect.die","Effect.fail","Effect.map","Effect.catchNoSuchElement","Effect.fn","Effect.void","Effect.mapError","Context.Service","normalizePath","layer","Layer.effect","Effect.gen","ChildProcessSpawner.ChildProcessSpawner","FileSystem.FileSystem","Path.Path","Effect.fn","ChildProcess.make","Stream.runCollect","Effect.map","Array.fromIterable","Effect.orDie","Effect.orElseSucceed","Stream.fromArray","Stream.flatMap","Stream.fromArrayEffect","Effect.fnUntraced","Stream.unwrap","TypeId","Predicate.hasProperty","Deferred.makeUnsafe","make","Effect.acquireRelease","Effect.sync","Effect.void","Deferred.into","Effect.asVoid","Fiber.interruptAs","Deferred.done","Exit.void","Cause.filterInterruptors","Exit.isFailure","Cause.hasInterruptsOnly","Effect.runFork","Effect.interrupt","run","Effect.isEffect","Effect.withFiber","Effect.runForkWith","Effect.succeed","make","Effect.gen","Statement.makeCompilerSqlite","Statement.defaultTransforms","scope","Effect.scope","Scope.addFinalizer","Effect.sync","Duration.toMillis","Duration.seconds","Effect.try","Cache.make","Duration.minutes","Effect.withFiber","Context.get","Client.SafeIntegers","Effect.flatMap","Cache.get","Effect.acquireUseRelease","Effect.map","Stream.die","Effect.suspend","Effect.tryPromise","backupDatabase","Semaphore.make","Effect.succeed","Effect.uninterruptibleMask","Fiber.getCurrent","Context.getUnsafe","Scope.Scope","Effect.as","Effect.tap","Client.make","layer","Layer.effectContext","Context.make","Context.add","Client.SqlClient","Layer.provide","Reactivity.layer","Effect.void","Effect.gen","Client.SqlClient","Effect.catch","Effect.map","Option.map","Option.fromNullishOr","Effect.catchDefect","Effect.fail","Effect.flatMap","Effect.isEffect","Effect.succeed","Effect.filterOrFail","Effect.die","Effect.all","Option.match","Effect.mapError","Effect.forEach","Effect.logDebug","Effect.annotateLogs","Effect.withSpan","Effect.catchTag","Effect.as","Effect.catchCause","Effect.logInfo","Order.Number","Arr.flatMapNullishOr","Arr.map","Arr.sort","layer","Layer.effectDiscard","SqliteMigrator.layer","SqliteMigrator.fromRecord","Effect.gen","SqlClient.SqlClient","Layer.provide","Layer.effectDiscard","SqliteClient.SqliteClient","Layer.provideMerge","SqliteClient.layer","FileSystem.FileSystem","Path.Path","RequestResolver.setDelay","Duration.millis","RequestResolver.batchN","Layer.effect","Effect.gen","CodeChunker.CodeChunker","ChunkRepo.ChunkRepo","EmbeddingModel.EmbeddingModel","Path.Path","FiberHandle.make","Console.Console","Option.none","Option.some","Effect.fnUntraced","Option.isSome","Effect.request","EmbeddingModel.EmbeddingRequest","Effect.ignore","Effect.annotateLogs","Effect.logInfo","Stream.tap","Stream.runDrain","Effect.withSpan","Effect.withLogSpan","Effect.provideService","FiberHandle.run","Effect.delay","Duration.minutes","Effect.forever","Effect.forkScoped","Effect.fn","Fiber.join","Effect.annotateCurrentSpan","Effect.orDie","Option.isNone","Stream.fromArray","Layer.provide","CodeChunker.layer"],"sources":["../../node_modules/.pnpm/effect@4.0.0-rc.115/node_modules/effect/dist/unstable/reactivity/Reactivity.js","../../node_modules/.pnpm/effect@4.0.0-rc.115/node_modules/effect/dist/unstable/sql/Statement.js","../../node_modules/.pnpm/effect@4.0.0-rc.115/node_modules/effect/dist/unstable/sql/SqlClient.js","../../node_modules/.pnpm/effect@4.0.0-rc.115/node_modules/effect/dist/Cache.js","../../node_modules/.pnpm/effect@4.0.0-rc.115/node_modules/effect/dist/unstable/schema/VariantSchema.js","../../node_modules/.pnpm/effect@4.0.0-rc.115/node_modules/effect/dist/unstable/schema/Model.js","../../node_modules/.pnpm/effect@4.0.0-rc.115/node_modules/effect/dist/unstable/sql/SqlError.js","../../node_modules/.pnpm/effect@4.0.0-rc.115/node_modules/effect/dist/unstable/sql/SqlResolver.js","../../node_modules/.pnpm/effect@4.0.0-rc.115/node_modules/effect/dist/unstable/sql/SqlSchema.js","../../node_modules/.pnpm/effect@4.0.0-rc.115/node_modules/effect/dist/unstable/sql/SqlModel.js","../../src/ChunkRepo.ts","../../src/CodeChunker.ts","../../node_modules/.pnpm/effect@4.0.0-rc.115/node_modules/effect/dist/FiberHandle.js","../../node_modules/.pnpm/@effect+sql-sqlite-node@4.0.0-rc.115_effect@4.0.0-rc.115/node_modules/@effect/sql-sqlite-node/dist/SqliteClient.js","../../node_modules/.pnpm/effect@4.0.0-rc.115/node_modules/effect/dist/unstable/sql/Migrator.js","../../node_modules/.pnpm/@effect+sql-sqlite-node@4.0.0-rc.115_effect@4.0.0-rc.115/node_modules/@effect/sql-sqlite-node/dist/SqliteMigrator.js","../../src/Sqlite.ts","../../src/SemanticSearch.ts"],"sourcesContent":["/**\n * Process-local invalidation for connecting writes to dependent reads.\n *\n * This module does not cache values itself. It lets callers register handlers\n * for keys, invalidate those keys, wrap successful mutations so they invalidate\n * keys, and expose effects as queues or streams that rerun when matching keys\n * change. The service can also batch invalidations so handlers run after the\n * batch completes.\n *\n * @since 4.0.0\n */\nimport * as Context from \"../../Context.js\";\nimport * as Effect from \"../../Effect.js\";\nimport * as Fiber from \"../../Fiber.js\";\nimport { dual, flow } from \"../../Function.js\";\nimport * as Hash from \"../../Hash.js\";\nimport * as Layer from \"../../Layer.js\";\nimport * as Queue from \"../../Queue.js\";\nimport * as Scope from \"../../Scope.js\";\nimport * as Stream from \"../../Stream.js\";\n/**\n * Brand for `Reactivity` implementations.\n *\n * @category type IDs\n * @since 4.0.0\n */\nexport const TypeId = \"~effect/reactivity/Reactivity\";\n/**\n * Service key for reactive invalidation.\n *\n * @category services\n * @since 4.0.0\n */\nexport const Reactivity = /*#__PURE__*/Context.Service(\"effect/reactivity/Reactivity\");\n/**\n * Creates an in-memory `Reactivity` service.\n *\n * **Details**\n *\n * The service tracks handlers by hashed keys and runs the registered handlers when\n * matching keys are invalidated.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const make = /*#__PURE__*/Effect.sync(() => {\n const handlers = new Map();\n const invalidateUnsafe = keys => {\n keysToHashes(keys, hash => {\n const set = handlers.get(hash);\n if (set === undefined) return;\n set.forEach(run => run());\n });\n };\n const invalidate = keys => Effect.contextWith(services => {\n const pending = Context.getOrUndefined(services, PendingInvalidation);\n if (pending) {\n keysToHashes(keys, hash => {\n pending.add(hash);\n });\n } else {\n invalidateUnsafe(keys);\n }\n return Effect.void;\n });\n const mutation = (keys, effect) => Effect.tap(effect, invalidate(keys));\n const registerUnsafe = (keys, handler) => {\n const resolvedKeys = [];\n keysToHashes(keys, hash => {\n resolvedKeys.push(hash);\n let set = handlers.get(hash);\n if (set === undefined) {\n set = new Set();\n handlers.set(hash, set);\n }\n set.add(handler);\n });\n return () => {\n for (let i = 0; i < resolvedKeys.length; i++) {\n const set = handlers.get(resolvedKeys[i]);\n if (set === undefined) continue;\n set.delete(handler);\n if (set.size === 0) {\n handlers.delete(resolvedKeys[i]);\n }\n }\n };\n };\n const query = (keys, effect) => Effect.gen(function* () {\n const services = yield* Effect.context();\n const scope = Context.get(services, Scope.Scope);\n const results = yield* Queue.make();\n const runFork = flow(Effect.runForkWith(services), Fiber.runIn(scope));\n let running = false;\n let pending = false;\n const handleExit = exit => {\n if (exit._tag === \"Failure\") {\n Queue.failCauseUnsafe(results, exit.cause);\n } else {\n Queue.offerUnsafe(results, exit.value);\n }\n if (pending) {\n pending = false;\n runFork(effect).addObserver(handleExit);\n } else {\n running = false;\n }\n };\n function run() {\n if (running) {\n pending = true;\n return;\n }\n running = true;\n runFork(effect).addObserver(handleExit);\n }\n const cancel = registerUnsafe(keys, run);\n yield* Scope.addFinalizer(scope, Effect.sync(cancel));\n run();\n return results;\n });\n const stream = (tables, effect) => query(tables, effect).pipe(Effect.map(Stream.fromQueue), Stream.unwrap);\n const withBatch = effect => Effect.suspend(() => {\n const pending = new Set();\n return effect.pipe(Effect.provideService(PendingInvalidation, pending), Effect.onExit(_ => Effect.sync(() => {\n pending.forEach(hash => {\n const set = handlers.get(hash);\n if (set === undefined) return;\n set.forEach(run => run());\n });\n })));\n });\n return Reactivity.of({\n [TypeId]: TypeId,\n mutation,\n query,\n stream,\n invalidateUnsafe,\n invalidate,\n registerUnsafe,\n withBatch\n });\n});\nclass PendingInvalidation extends /*#__PURE__*/Context.Service()(\"effect/reactivity/Reactivity/PendingInvalidation\") {}\n/**\n * Wraps an effect so the supplied keys are invalidated after the effect succeeds.\n *\n * **Gotchas**\n *\n * If the effect fails, the keys are not invalidated.\n *\n * @category accessors\n * @since 4.0.0\n */\nexport const mutation = /*#__PURE__*/dual(2, (effect, keys) => Reactivity.use(_ => _.mutation(keys, effect)));\n/**\n * Runs an effect as a query tied to the supplied invalidation keys.\n *\n * **Details**\n *\n * The returned queue receives the initial result and each later result after the\n * keys are invalidated. The registration is removed when the current scope closes.\n *\n * @category accessors\n * @since 4.0.0\n */\nexport const query = /*#__PURE__*/dual(2, (effect, keys) => Reactivity.use(r => r.query(keys, effect)));\n/**\n * Runs an effect as a stream of query results tied to the supplied invalidation\n * keys.\n *\n * **Details**\n *\n * The effect runs initially and reruns whenever the keys are invalidated.\n *\n * @category accessors\n * @since 4.0.0\n */\nexport const stream = /*#__PURE__*/dual(2, (effect, keys) => Reactivity.use(r => r.query(keys, effect)).pipe(Effect.map(Stream.fromQueue), Stream.unwrap));\n/**\n * Invalidates the supplied keys through the `Reactivity` service.\n *\n * **Details**\n *\n * Registered queries for matching keys are rerun immediately, or collected until\n * the enclosing reactivity batch completes.\n *\n * @category accessors\n * @since 4.0.0\n */\nexport const invalidate = keys => Reactivity.use(r => r.invalidate(keys));\n/**\n * The default layer that provides an in-memory `Reactivity` service.\n *\n * @category layers\n * @since 4.0.0\n */\nexport const layer = /*#__PURE__*/Layer.effect(Reactivity)(make);\nfunction stringOrHash(u) {\n switch (typeof u) {\n case \"string\":\n case \"number\":\n case \"bigint\":\n case \"boolean\":\n return String(u);\n default:\n return Hash.hash(u);\n }\n}\nconst keysToHashes = (keys, f) => {\n if (Array.isArray(keys)) {\n for (let i = 0; i < keys.length; i++) {\n f(stringOrHash(keys[i]));\n }\n return;\n }\n for (const key in keys) {\n f(key);\n const ids = keys[key];\n for (let i = 0; i < ids.length; i++) {\n f(`${key}:${stringOrHash(ids[i])}`);\n }\n }\n};\n//# sourceMappingURL=Reactivity.js.map","/**\n * Low-level SQL statement and fragment primitives.\n *\n * `SqlClient` uses this module to build executable, parameterized SQL from\n * reusable fragments. A statement can be executed, streamed, run without row\n * transformation, or compiled to SQL text and parameters for a specific\n * dialect. The module also contains helpers for identifiers, parameters,\n * inserts, updates, custom dialect fragments, statement compilation, and row\n * transformation.\n *\n * @since 4.0.0\n */\nimport { Clock } from \"../../Clock.js\";\nimport * as Context from \"../../Context.js\";\nimport * as Effect from \"../../Effect.js\";\nimport * as Effectable from \"../../Effectable.js\";\nimport { constUndefined } from \"../../Function.js\";\nimport * as internalEffect from \"../../internal/effect.js\";\nimport * as InternalRecord from \"../../internal/record.js\";\nimport { hasProperty } from \"../../Predicate.js\";\nimport { TracerTimingEnabled } from \"../../References.js\";\nimport * as Stream from \"../../Stream.js\";\nimport * as Tracer from \"../../Tracer.js\";\nconst FragmentTypeId = \"~effect/sql/Statement/Fragment\";\n/**\n * Constructs a SQL `Fragment` from low-level statement segments.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const fragment = segments => ({\n [FragmentTypeId]: FragmentTypeId,\n segments\n});\n/**\n * Context reference for an optional current SQL statement transformer applied\n * before statement execution.\n *\n * @category services\n * @since 4.0.0\n */\nexport const CurrentTransformer = /*#__PURE__*/Context.Reference(\"effect/sql/CurrentTransformer\", {\n defaultValue: constUndefined\n});\n/**\n * Parents driver spans under `sql.execute` for every client in the current scope,\n * including acquisition and stream pulls. Defaults to `false`; ignored when tracing is disabled.\n *\n * @category services\n * @since 4.0.0\n */\nexport const SpanPropagationEnabled = /*#__PURE__*/Context.Reference(\"effect/sql/SpanPropagationEnabled\", {\n defaultValue: () => false\n});\n/**\n * Returns `true` when a value is a SQL `Fragment`.\n *\n * @category guards\n * @since 4.0.0\n */\nexport const isFragment = u => hasProperty(u, FragmentTypeId);\n/**\n * Creates a type guard for custom SQL segments with the specified custom kind.\n *\n * @category guards\n * @since 4.0.0\n */\nexport const isCustom = kind => u => hasProperty(u, \"_tag\") && u._tag === \"Custom\" && u.kind === kind;\n/**\n * Constructs a raw SQL literal segment. The literal text is not escaped, so use\n * bound parameters for untrusted values.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const literal = (value, params) => ({\n _tag: \"Literal\",\n value,\n params\n});\n/**\n * Constructs a SQL identifier segment that will be escaped by the active\n * compiler.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const identifier = value => ({\n _tag: \"Identifier\",\n value\n});\n/**\n * Constructs a bound parameter segment for a statement value.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const parameter = value => ({\n _tag: \"Parameter\",\n value\n});\n/**\n * Constructs an `ArrayHelper` segment for an array of values or fragments.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const arrayHelper = value => ({\n _tag: \"ArrayHelper\",\n value\n});\nconst RecordInsertHelperProto = {\n _tag: \"RecordInsertHelper\",\n returning(sql) {\n const self = Object.create(Object.getPrototypeOf(this));\n Object.assign(self, this, {\n returningIdentifier: typeof sql === \"string\" || isFragment(sql) ? sql : fragment([sql])\n });\n return self;\n }\n};\n/**\n * Constructs a `RecordInsertHelper` from one or more row objects.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const recordInsertHelper = value => Object.assign(Object.create(RecordInsertHelperProto), {\n value,\n returningIdentifier: undefined\n});\nconst RecordUpdateHelperProto = {\n ...RecordInsertHelperProto,\n _tag: \"RecordUpdateHelper\"\n};\n/**\n * Constructs a `RecordUpdateHelper` for multi-row update compilation using the\n * provided alias.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const recordUpdateHelper = (value, alias) => Object.assign(Object.create(RecordUpdateHelperProto), {\n value,\n alias,\n returningIdentifier: undefined\n});\nconst RecordUpdateHelperSingleProto = {\n ...RecordInsertHelperProto,\n _tag: \"RecordUpdateHelperSingle\"\n};\n/**\n * Constructs a `RecordUpdateHelperSingle` from a record and a list of columns\n * to omit from the update.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const recordUpdateHelperSingle = (value, omit) => Object.assign(Object.create(RecordUpdateHelperSingleProto), {\n value,\n omit,\n returningIdentifier: undefined\n});\n/**\n * Creates a constructor for custom SQL segments of a specific kind handled by\n * the active compiler.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const custom = kind => (paramA, paramB, paramC) => ({\n _tag: \"Custom\",\n kind,\n paramA,\n paramB,\n paramC\n});\n/**\n * Creates a cached SQL statement constructor from a connection acquirer,\n * compiler, tracing attributes, and optional row transformation function.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const make = (acquirer, compiler, spanAttributes, transformRows, borrower) => {\n const cache = transformRows === undefined ? constructorCache.noTransforms : constructorCache.transforms;\n if (cache.has(acquirer)) {\n return cache.get(acquirer);\n }\n const self = Object.assign(function sql(strings, ...args) {\n if (typeof strings === \"string\") {\n return identifier(strings);\n } else if (Array.isArray(strings) && \"raw\" in strings) {\n return statement(acquirer, compiler, strings, args, spanAttributes, transformRows, borrower);\n }\n throw \"absurd\";\n }, {\n unsafe(sql, params) {\n return makeUnsafe([literal(sql, params)], acquirer, compiler, spanAttributes, transformRows, borrower);\n },\n literal(sql) {\n return fragment([literal(sql)]);\n },\n in: in_,\n insert(value) {\n return recordInsertHelper(Array.isArray(value) ? value : [value]);\n },\n update(value, omit) {\n return recordUpdateHelperSingle(value, omit ?? []);\n },\n updateValues(value, alias) {\n return recordUpdateHelper(value, alias);\n },\n and,\n or,\n csv,\n join,\n onDialect(options) {\n return options[compiler.dialect]();\n },\n onDialectOrElse(options) {\n return options[compiler.dialect] !== undefined ? options[compiler.dialect]() : options.orElse();\n }\n });\n cache.set(acquirer, self);\n return self;\n};\nconst constructorCache = {\n transforms: /*#__PURE__*/new WeakMap(),\n noTransforms: /*#__PURE__*/new WeakMap()\n};\n/**\n * Builds a `Statement` from template strings and arguments, preserving\n * fragments and helper segments while converting ordinary interpolated values\n * into bound parameters.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const statement = (acquirer, compiler, strings, args, spanAttributes, transformRows, borrower) => {\n const segments = strings[0].length > 0 ? [literal(strings[0])] : [];\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (isFragment(arg)) {\n segments.push(...arg.segments);\n } else if (isSegment(arg)) {\n segments.push(arg);\n } else {\n segments.push(parameter(arg));\n }\n if (strings[i + 1].length > 0) {\n segments.push(literal(strings[i + 1]));\n }\n }\n return makeUnsafe(segments, acquirer, compiler, spanAttributes, transformRows, borrower);\n};\n/**\n * Creates a helper that joins SQL clauses with a literal separator, optionally\n * wrapping multiple clauses in parentheses and using a fallback for an empty\n * list.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport function join(lit, addParens = true, fallback = \"\") {\n const literalStatement = literal(lit);\n const fallbackFragment = fragment([literal(fallback)]);\n return clauses => {\n if (clauses.length === 0) {\n return fallbackFragment;\n } else if (clauses.length === 1) {\n return fragment(convertLiteralOrFragment(clauses[0]));\n }\n const segments = [];\n if (addParens) {\n segments.push(literal(\"(\"));\n }\n segments.push.apply(segments, convertLiteralOrFragment(clauses[0]));\n for (let i = 1; i < clauses.length; i++) {\n segments.push(literalStatement);\n segments.push.apply(segments, convertLiteralOrFragment(clauses[i]));\n }\n if (addParens) {\n segments.push(literal(\")\"));\n }\n return fragment(segments);\n };\n}\n/**\n * Combines clauses with `AND`, parenthesizing multiple clauses and returning\n * `1=1` when the list is empty.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const and = /*#__PURE__*/join(\" AND \", true, \"1=1\");\n/**\n * Combines clauses with `OR`, parenthesizing multiple clauses and returning\n * `1=1` when the list is empty.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const or = /*#__PURE__*/join(\" OR \", true, \"1=1\");\n/**\n * Creates a comma-separated SQL fragment from values, optionally adding a\n * prefix, and returns an empty fragment when no values are provided.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const csv = function (...args) {\n if (args[args.length - 1].length === 0) {\n return emptyFragment;\n }\n if (args.length === 1) {\n return csvRaw(args[0]);\n }\n return fragment([literal(`${args[0]} `), ...csvRaw(args[1]).segments]);\n};\nconst csvRaw = /*#__PURE__*/join(\",\", false);\nconst emptyFragment = /*#__PURE__*/fragment([/*#__PURE__*/literal(\"\")]);\n/**\n * Creates a dialect-specific SQL `Compiler` from rendering callbacks.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const makeCompiler = options => {\n const self = Object.create(CompilerProto);\n self.options = options;\n self.dialect = options.dialect;\n self.disableTransforms = false;\n self.statementCache = new WeakMap();\n self.statementCacheNoTransform = new WeakMap();\n return self;\n};\nconst CompilerProto = {\n compile(statement, withoutTransform = false, placeholderOverride) {\n const opts = this.options;\n withoutTransform = withoutTransform || this.disableTransforms;\n const cache = withoutTransform ? this.statementCacheNoTransform : this.statementCache;\n const cached = cache.get(statement);\n if (cached !== undefined && placeholderOverride === undefined) {\n return cached;\n }\n const segments = statement.segments;\n const len = segments.length;\n let sql = \"\";\n const binds = [];\n let placeholderCount = 0;\n const placeholder = placeholderOverride ?? (u => opts.placeholder(++placeholderCount, u));\n const placeholderNoIncrement = u => opts.placeholder(placeholderCount, u);\n const placeholders = makePlaceholdersArray(placeholder);\n for (let i = 0; i < len; i++) {\n const segment = segments[i];\n switch (segment._tag) {\n case \"Literal\":\n {\n sql += segment.value;\n if (segment.params) {\n binds.push.apply(binds, segment.params);\n }\n break;\n }\n case \"Identifier\":\n {\n sql += opts.onIdentifier(segment.value, withoutTransform);\n break;\n }\n case \"Parameter\":\n {\n sql += placeholder(segment.value);\n binds.push(segment.value);\n break;\n }\n case \"ArrayHelper\":\n {\n sql += `(${placeholders(segment.value)})`;\n binds.push.apply(binds, segment.value);\n break;\n }\n case \"RecordInsertHelper\":\n {\n const keys = Object.keys(segment.value[0]);\n if (opts.onInsert) {\n const values = new Array(segment.value.length);\n let placeholders = \"\";\n for (let i = 0; i < segment.value.length; i++) {\n const row = new Array(keys.length);\n values[i] = row;\n placeholders += i === 0 ? \"(\" : \",(\";\n for (let j = 0; j < keys.length; j++) {\n const key = keys[j];\n const value = segment.value[i][key];\n const primitive = extractPrimitive(value, opts.onCustom, placeholderNoIncrement, withoutTransform);\n row[j] = primitive;\n placeholders += j === 0 ? placeholder(value) : `,${placeholder(value)}`;\n }\n placeholders += \")\";\n }\n const [s, b] = opts.onInsert(keys.map(_ => opts.onIdentifier(_, withoutTransform)), placeholders, values, typeof segment.returningIdentifier === \"string\" ? [segment.returningIdentifier, []] : segment.returningIdentifier ? this.compile(segment.returningIdentifier, withoutTransform, placeholder) : undefined);\n sql += s;\n binds.push.apply(binds, b);\n } else {\n let placeholders = \"\";\n for (let i = 0; i < segment.value.length; i++) {\n placeholders += i === 0 ? \"(\" : \",(\";\n for (let j = 0; j < keys.length; j++) {\n const value = segment.value[i][keys[j]];\n const primitive = extractPrimitive(value, opts.onCustom, placeholderNoIncrement, withoutTransform);\n binds.push(primitive);\n placeholders += j === 0 ? placeholder(value) : `,${placeholder(value)}`;\n }\n placeholders += \")\";\n }\n sql += `${generateColumns(keys, opts.onIdentifier, withoutTransform)} VALUES ${placeholders}`;\n if (typeof segment.returningIdentifier === \"string\") {\n sql += ` RETURNING ${segment.returningIdentifier}`;\n } else if (segment.returningIdentifier) {\n sql += \" RETURNING \";\n const [s, b] = this.compile(segment.returningIdentifier, withoutTransform, placeholder);\n sql += s;\n binds.push.apply(binds, b);\n }\n }\n break;\n }\n case \"RecordUpdateHelperSingle\":\n {\n let keys = Object.keys(segment.value);\n if (segment.omit.length > 0) {\n keys = keys.filter(key => !segment.omit.includes(key));\n }\n if (opts.onRecordUpdateSingle) {\n const [s, b] = opts.onRecordUpdateSingle(keys.map(_ => opts.onIdentifier(_, withoutTransform)), keys.map(key => extractPrimitive(segment.value[key], opts.onCustom, placeholderNoIncrement, withoutTransform)), typeof segment.returningIdentifier === \"string\" ? [segment.returningIdentifier, []] : segment.returningIdentifier ? this.compile(segment.returningIdentifier, withoutTransform, placeholder) : undefined);\n sql += s;\n binds.push.apply(binds, b);\n } else {\n for (let i = 0, len = keys.length; i < len; i++) {\n const column = opts.onIdentifier(keys[i], withoutTransform);\n if (i === 0) {\n sql += `${column} = ${placeholder(segment.value[keys[i]])}`;\n } else {\n sql += `, ${column} = ${placeholder(segment.value[keys[i]])}`;\n }\n binds.push(extractPrimitive(segment.value[keys[i]], opts.onCustom, placeholderNoIncrement, withoutTransform));\n }\n if (typeof segment.returningIdentifier === \"string\") {\n if (this.dialect === \"mssql\") {\n sql += ` OUTPUT ${segment.returningIdentifier === \"*\" ? \"INSERTED.*\" : segment.returningIdentifier}`;\n } else {\n sql += ` RETURNING ${segment.returningIdentifier}`;\n }\n } else if (segment.returningIdentifier) {\n sql += this.dialect === \"mssql\" ? \" OUTPUT \" : \" RETURNING \";\n const [s, b] = this.compile(segment.returningIdentifier, withoutTransform, placeholder);\n sql += s;\n binds.push.apply(binds, b);\n }\n }\n break;\n }\n case \"RecordUpdateHelper\":\n {\n const keys = Object.keys(segment.value[0]);\n const values = new Array(segment.value.length);\n let placeholders = \"\";\n for (let i = 0; i < segment.value.length; i++) {\n const row = new Array(keys.length);\n values[i] = row;\n placeholders += i === 0 ? \"(\" : \",(\";\n for (let j = 0; j < keys.length; j++) {\n const key = keys[j];\n const value = segment.value[i][key];\n row[j] = extractPrimitive(value, opts.onCustom, placeholderNoIncrement, withoutTransform);\n placeholders += j === 0 ? placeholder(value) : `,${placeholder(value)}`;\n }\n placeholders += \")\";\n }\n const [s, b] = opts.onRecordUpdate(placeholders, segment.alias, generateColumns(keys, opts.onIdentifier, withoutTransform), values, typeof segment.returningIdentifier === \"string\" ? [segment.returningIdentifier, []] : segment.returningIdentifier ? this.compile(segment.returningIdentifier, withoutTransform, placeholder) : undefined);\n sql += s;\n binds.push.apply(binds, b);\n break;\n }\n case \"Custom\":\n {\n const [s, b] = opts.onCustom(segment, placeholder, withoutTransform);\n sql += s;\n binds.push.apply(binds, b);\n break;\n }\n }\n }\n const result = [sql, binds];\n if (placeholderOverride !== undefined) {\n return result;\n }\n cache.set(statement, result);\n return result;\n },\n get withoutTransform() {\n const self = Object.create(CompilerProto);\n Object.assign(self, this, {\n disableTransforms: true\n });\n return self;\n }\n};\n/**\n * Creates a SQLite compiler that uses `?` placeholders and quoted identifiers,\n * optionally transforming identifier names before escaping.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const makeCompilerSqlite = transform => makeCompiler({\n dialect: \"sqlite\",\n placeholder(_) {\n return \"?\";\n },\n onIdentifier: transform ? function (value, withoutTransform) {\n return withoutTransform ? escapeSqlite(value) : escapeSqlite(transform(value));\n } : escapeSqlite,\n onRecordUpdate() {\n return [\"\", []];\n },\n onCustom() {\n return [\"\", []];\n }\n});\n/**\n * Creates an identifier escaping function that wraps names in the given\n * delimiter, doubles delimiter characters, and escapes dots between identifier\n * parts.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport function defaultEscape(c) {\n const re = new RegExp(c, \"g\");\n const double = c + c;\n const dot = c + \".\" + c;\n return function (str) {\n return c + str.replace(re, double).replace(/\\./g, dot) + c;\n };\n}\n/**\n * Classifies a JavaScript value as a SQL primitive kind, treating `undefined`\n * as `null` and defaulting unrecognized objects to `string`.\n *\n * @category converting\n * @since 4.0.0\n */\nexport const primitiveKind = value => {\n switch (typeof value) {\n case \"string\":\n return \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"bigint\":\n return \"bigint\";\n case \"undefined\":\n return \"null\";\n }\n if (value === null) {\n return \"null\";\n } else if (value instanceof Date) {\n return \"Date\";\n } else if (value instanceof Uint8Array) {\n return \"Uint8Array\";\n } else if (value instanceof Int8Array) {\n return \"Int8Array\";\n }\n return \"string\";\n};\n/**\n * Builds value, object, and row-array transformers that rename object keys with\n * the supplied function and optionally recurse into nested object arrays.\n *\n * @category transforming\n * @since 4.0.0\n */\nexport const defaultTransforms = (transformer, nested = true) => {\n const transformValue = value => {\n if (Array.isArray(value)) {\n if (value.length === 0 || value[0].constructor !== Object) {\n return value;\n }\n return array(value);\n } else if (value?.constructor === Object) {\n return transformObject(value);\n }\n return value;\n };\n const transformObject = obj => {\n const newObj = {};\n for (const key of Object.keys(obj)) {\n InternalRecord.assignProperty(newObj, transformer(key), transformValue(obj[key]));\n }\n return newObj;\n };\n const transformArrayNested = rows => {\n const newRows = new Array(rows.length);\n for (let i = 0, len = rows.length; i < len; i++) {\n const row = rows[i];\n if (Array.isArray(row)) {\n newRows[i] = transformArrayNested(row);\n } else {\n const obj = {};\n for (const [key, value] of Object.entries(row)) {\n InternalRecord.assignProperty(obj, transformer(key), transformValue(value));\n }\n newRows[i] = obj;\n }\n }\n return newRows;\n };\n const transformArray = rows => {\n const newRows = new Array(rows.length);\n for (let i = 0, len = rows.length; i < len; i++) {\n const row = rows[i];\n if (Array.isArray(row)) {\n newRows[i] = transformArray(row);\n } else {\n const obj = {};\n for (const [key, value] of Object.entries(row)) {\n InternalRecord.assignProperty(obj, transformer(key), value);\n }\n newRows[i] = obj;\n }\n }\n return newRows;\n };\n const array = nested ? transformArrayNested : transformArray;\n return {\n value: transformValue,\n object: transformObject,\n array\n };\n};\n// internal\nconst ATTR_DB_OPERATION_NAME = \"db.operation.name\";\nconst ATTR_DB_QUERY_TEXT = \"db.query.text\";\nconst makeUnsafe = (segments, acquirer, compiler, spanAttributes, transformRows, borrower) => {\n const self = Object.create(StatementProto);\n self.segments = segments;\n self.acquirer = acquirer;\n self.compiler = compiler;\n self.spanAttributes = spanAttributes;\n self.transformRows = transformRows;\n self.borrower = borrower;\n return self;\n};\n// TODO: figure out why these diagnostics are emitted\nconst StatementProto = {\n [FragmentTypeId]: FragmentTypeId,\n withConnection(operation, f, withoutTransform = false) {\n return Effect.useSpan(\"sql.execute\", {\n kind: \"client\"\n }, span => this.withConnectionSpan(operation, f, withoutTransform, span));\n },\n withConnectionSpan(operation, f, withoutTransform, span) {\n return withStatement(this, span, (statement, fiber) => {\n const [sql, params] = statement.compile(withoutTransform);\n for (const [key, value] of this.spanAttributes) {\n span.attribute(key, value);\n }\n span.attribute(ATTR_DB_OPERATION_NAME, operation);\n span.attribute(ATTR_DB_QUERY_TEXT, sql);\n const execute = this.borrower === undefined ? Effect.scoped(Effect.flatMap(this.acquirer, _ => f(_, sql, params))) : this.borrower(connection => f(connection, sql, params));\n return fiber.cache.tracerEnabled && fiber.getRef(SpanPropagationEnabled) ? Effect.provideService(execute, Tracer.ParentSpan, span) : execute;\n });\n },\n get withoutTransform() {\n return this.withConnection(\"executeWithoutTransform\", (connection, sql, params) => connection.execute(sql, params, undefined), true);\n },\n get raw() {\n return this.withConnection(\"executeRaw\", (connection, sql, params) => connection.executeRaw(sql, params), true);\n },\n get stream() {\n const self = this;\n return Stream.unwrap(Effect.flatMap(Effect.makeSpanScoped(\"sql.execute\", {\n kind: \"client\"\n }), span => withStatement(self, span, (statement, fiber) => {\n const [sql, params] = statement.compile();\n for (const [key, value] of self.spanAttributes) {\n span.attribute(key, value);\n }\n span.attribute(ATTR_DB_OPERATION_NAME, \"executeStream\");\n span.attribute(ATTR_DB_QUERY_TEXT, sql);\n const acquire = Effect.map(self.acquirer, _ => _.executeStream(sql, params, self.transformRows));\n return fiber.cache.tracerEnabled && fiber.getRef(SpanPropagationEnabled) ? Effect.succeed(Stream.provideService(Stream.unwrap(acquire), Tracer.ParentSpan, span)) : acquire;\n })));\n },\n get values() {\n return this.withConnection(\"executeValues\", (connection, sql, params) => connection.executeValues(sql, params));\n },\n get valuesUnprepared() {\n return this.withConnection(\"executeValuesUnprepared\", (connection, sql, params) => connection.executeValuesUnprepared(sql, params));\n },\n get unprepared() {\n const self = this;\n return self.withConnection(\"executeUnprepared\", (connection, sql, params) => connection.executeUnprepared(sql, params, self.transformRows));\n },\n ... /*#__PURE__*/Effectable.Prototype({\n label: \"Statement\",\n evaluate(fiber) {\n const span = internalEffect.makeSpanUnsafe(fiber, \"sql.execute\", {\n kind: \"client\"\n });\n const clock = fiber.getRef(Clock);\n const timingEnabled = fiber.getRef(TracerTimingEnabled);\n return Effect.onExit(this.withConnectionSpan(\"execute\", (connection, sql, params) => connection.execute(sql, params, this.transformRows), false, span), exit => internalEffect.endSpan(span, exit, clock, timingEnabled));\n }\n }),\n compile(withoutTransform) {\n return this.compiler.compile(this, withoutTransform ?? false);\n },\n toJSON() {\n const [sql, params] = this.compile();\n return {\n _id: \"Statement\",\n segments: this.segments,\n sql,\n params\n };\n }\n};\nconst withStatement = (self, span, f) => Effect.withFiber(fiber => {\n const transform = fiber.getRef(CurrentTransformer);\n if (transform === undefined) {\n return f(self, fiber);\n }\n return Effect.flatMap(transform(self, make(self.acquirer, self.compiler, self.spanAttributes, self.transformRows, self.borrower), fiber, span), statement => f(statement, fiber));\n});\nconst isSegment = u => {\n if (!hasProperty(u, \"_tag\")) {\n return false;\n }\n switch (u._tag) {\n case \"Literal\":\n case \"Parameter\":\n case \"ArrayHelper\":\n case \"RecordInsertHelper\":\n case \"RecordUpdateHelper\":\n case \"RecordUpdateHelperSingle\":\n case \"Identifier\":\n case \"Custom\":\n return true;\n default:\n return false;\n }\n};\nfunction convertLiteralOrFragment(clause) {\n if (typeof clause === \"string\") {\n return [literal(clause)];\n }\n return clause.segments;\n}\nconst makePlaceholdersArray = evaluate => values => {\n if (values.length === 0) {\n return \"\";\n }\n let result = evaluate(values[0]);\n for (let i = 1; i < values.length; i++) {\n result += `,${evaluate(values[i])}`;\n }\n return result;\n};\nconst generateColumns = (keys, escape, withoutTransform) => {\n if (keys.length === 0) {\n return \"()\";\n }\n let str = `(${escape(keys[0], withoutTransform)}`;\n for (let i = 1; i < keys.length; i++) {\n str += `,${escape(keys[i], withoutTransform)}`;\n }\n return str + \")\";\n};\nconst extractPrimitive = (value, onCustom, placeholder, withoutTransform) => {\n if (value === undefined) {\n return null;\n } else if (isFragment(value)) {\n const head = value.segments[0];\n if (head._tag === \"Custom\") {\n const compiled = onCustom(head, placeholder, withoutTransform);\n return compiled[1][0] ?? null;\n } else if (head._tag === \"Parameter\") {\n return head.value;\n }\n return null;\n }\n return value;\n};\nconst escapeSqlite = /*#__PURE__*/defaultEscape(\"\\\"\");\nfunction in_() {\n if (arguments.length === 1) {\n return arrayHelper(arguments[0]);\n }\n const column = arguments[0];\n const values = arguments[1];\n return values.length === 0 ? neverFragment : fragment([identifier(column), literal(\" IN \"), arrayHelper(values)]);\n}\nconst neverFragment = /*#__PURE__*/fragment([/*#__PURE__*/literal(\"1=0\")]);\n//# sourceMappingURL=Statement.js.map","/**\n * Main SQL client service for tagged-template queries.\n *\n * `SqlClient` combines the tagged-template statement constructor with\n * connection acquisition, dialect compilation, transactions, row transforms,\n * tracing, and reactive query helpers. Driver integrations build this service\n * from their connection and compiler pieces.\n *\n * @since 4.0.0\n */\nimport { Clock } from \"../../Clock.js\";\nimport * as Context from \"../../Context.js\";\nimport * as Effect from \"../../Effect.js\";\nimport * as Exit from \"../../Exit.js\";\nimport { identity } from \"../../Function.js\";\nimport * as Option from \"../../Option.js\";\nimport * as Scope from \"../../Scope.js\";\nimport * as Semaphore from \"../../Semaphore.js\";\nimport * as Stream from \"../../Stream.js\";\nimport * as Tracer from \"../../Tracer.js\";\nimport { Reactivity } from \"../reactivity/Reactivity.js\";\nimport * as Statement from \"./Statement.js\";\nconst TypeId = \"~effect/sql/SqlClient\";\n/**\n * Service tag for the active SQL client service.\n *\n * **When to use**\n *\n * Use to access or provide the SQL client used to build statements, stream\n * rows, reserve connections, and run transactions.\n *\n * @category services\n * @since 4.0.0\n */\nexport const SqlClient = /*#__PURE__*/Context.Service(\"effect/sql/SqlClient\");\nlet clientIdCounter = 0;\nlet transactionSemaphoreIdCounter = 0;\n/**\n * Constructs a `SqlClient` from connection acquirers, a compiler, transaction\n * commands, tracing attributes, optional row transforms, and reactive query\n * integration.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const make = /*#__PURE__*/Effect.fnUntraced(function* (options) {\n const transactionService = options.transactionService ?? TransactionConnection(clientIdCounter++);\n const getConnection = Effect.flatMap(Effect.serviceOption(transactionService), Option.match({\n onNone: () => options.acquirer,\n onSome: ([conn]) => Effect.succeed(conn)\n }));\n const beginTransaction = options.beginTransaction ?? \"BEGIN\";\n const commit = options.commit ?? \"COMMIT\";\n const savepoint = options.savepoint ?? (name => `SAVEPOINT ${name}`);\n const rollback = options.rollback ?? \"ROLLBACK\";\n const rollbackSavepoint = options.rollbackSavepoint ?? (name => `ROLLBACK TO SAVEPOINT ${name}`);\n const transactionAcquirer = options.transactionAcquirer ?? options.acquirer;\n const control = options.prepareTransactionControls === true ? (conn, sql) => conn.execute(sql, [], undefined) : (conn, sql) => conn.executeUnprepared(sql, [], undefined);\n const withTransaction = makeWithTransaction({\n transactionService,\n spanAttributes: options.spanAttributes,\n acquireConnection: Effect.flatMap(Scope.make(), scope => Effect.map(Scope.provide(transactionAcquirer, scope), conn => [scope, conn])),\n begin: conn => control(conn, beginTransaction),\n savepoint: (conn, id) => control(conn, savepoint(`effect_sql_${id}`)),\n commit: conn => control(conn, commit),\n rollback: conn => control(conn, rollback),\n rollbackSavepoint: (conn, id) => control(conn, rollbackSavepoint(`effect_sql_${id}`))\n });\n const reactivity = yield* Reactivity;\n // A statement inside a transaction has to run on that transaction's\n // connection, so borrowing is only for statements that reach the pool.\n const borrower = options.borrower === undefined ? undefined : f => Effect.flatMap(Effect.serviceOption(transactionService), Option.match({\n onNone: () => options.borrower(f),\n onSome: ([conn]) => f(conn)\n }));\n const client = Object.assign(Statement.make(getConnection, options.compiler, options.spanAttributes, options.transformRows, borrower), {\n [TypeId]: TypeId,\n safe: undefined,\n withTransaction,\n transactionService,\n reserve: transactionAcquirer,\n withoutTransforms() {\n if (options.transformRows === undefined) {\n return this;\n }\n const statement = Statement.make(getConnection, options.compiler.withoutTransform, options.spanAttributes, undefined, borrower);\n const client = Object.assign(statement, {\n ...this,\n ...statement\n });\n client.safe = client;\n client.withoutTransforms = () => client;\n return client;\n },\n reactive: options.reactiveQueue ? (keys, effect) => options.reactiveQueue(keys, effect).pipe(Effect.map(Stream.fromQueue), Stream.unwrap) : reactivity.stream,\n reactiveMailbox: options.reactiveQueue ?? reactivity.query\n });\n client.safe = client;\n return client;\n});\n/**\n * Builds a transaction wrapper that begins top-level transactions, uses\n * savepoints for nested transactions, commits on success, and rolls back on\n * failure or interruption.\n *\n * @category transactions\n * @since 4.0.0\n */\nexport const makeWithTransaction = options => {\n const transactionSemaphore = Context.Service(`effect/sql/SqlClient/TransactionSemaphore/${transactionSemaphoreIdCounter++}`);\n return effect => Effect.uninterruptibleMask(restore => Effect.useSpan(\"sql.transaction\", {\n kind: \"client\"\n }, span => Effect.withFiber(fiber => {\n for (const [key, value] of options.spanAttributes) {\n span.attribute(key, value);\n }\n const services = fiber.context;\n const clock = fiber.getRef(Clock);\n const connOption = Context.getOption(services, options.transactionService);\n const conn = connOption._tag === \"Some\" ? Effect.succeed([undefined, connOption.value[0]]) : options.acquireConnection;\n const id = connOption._tag === \"Some\" ? connOption.value[1] + 1 : 0;\n const transaction = Effect.flatMap(conn, ([scope, conn]) => (id === 0 ? options.begin(conn) : options.savepoint(conn, id)).pipe(Effect.flatMap(() => Effect.onExitPrimitive(Effect.provideContext(restore(effect), services.pipe(Context.add(options.transactionService, [conn, id]), Context.add(transactionSemaphore, Semaphore.makeUnsafe(1)), Context.add(Tracer.ParentSpan, span))), exit => {\n let effect;\n if (Exit.isSuccess(exit)) {\n if (id === 0) {\n span.event(\"db.transaction.commit\", clock.currentTimeNanosUnsafe());\n effect = Effect.orDie(options.commit(conn));\n } else {\n span.event(\"db.transaction.savepoint\", clock.currentTimeNanosUnsafe());\n effect = Effect.void;\n }\n } else {\n span.event(\"db.transaction.rollback\", clock.currentTimeNanosUnsafe());\n effect = Effect.orDie(id > 0 ? options.rollbackSavepoint(conn, id) : options.rollback(conn));\n }\n return Effect.flatMap(effect, () => exit);\n }, true)), scope ? eff => Effect.onExitPrimitive(eff, exit => Scope.close(scope, exit), true) : identity));\n return id === 0 ? transaction : Context.getUnsafe(services, transactionSemaphore).withPermit(transaction);\n })));\n};\n/**\n * Creates a unique context service tag for the active transaction connection of\n * a specific SQL client.\n *\n * @category services\n * @since 4.0.0\n */\nexport const TransactionConnection = clientId => Context.Service(`effect/sql/SqlClient/TransactionConnection/${clientId}`);\n/**\n * Context reference used by SQL integrations to opt in to safe integer\n * handling; defaults to `false`.\n *\n * @category services\n * @since 4.0.0\n */\nexport const SafeIntegers = /*#__PURE__*/Context.Reference(\"effect/sql/SqlClient/SafeIntegers\", {\n defaultValue: () => false\n});\n//# sourceMappingURL=SqlClient.js.map","/**\n * Caches values loaded by an Effect lookup function.\n *\n * A cache stores successful and failed lookup results, shares an in-progress\n * lookup when multiple callers request the same missing key, and limits entries\n * by capacity and optional time-to-live rules. This module includes helpers for\n * reading, setting, refreshing, invalidating, and inspecting cache contents.\n *\n * @since 4.0.0\n */\nimport * as Context from \"./Context.js\";\nimport * as Duration from \"./Duration.js\";\nimport { dual } from \"./Function.js\";\nimport * as core from \"./internal/core.js\";\nimport { PipeInspectableProto } from \"./internal/core.js\";\nimport * as effect from \"./internal/effect.js\";\nimport * as Iterable from \"./Iterable.js\";\nimport * as MutableHashMap from \"./MutableHashMap.js\";\nimport * as Option from \"./Option.js\";\nimport * as Result from \"./Result.js\";\nconst TypeId = \"~effect/Cache\";\n/**\n * Creates a cache with dynamic time-to-live based on the result and key.\n *\n * **When to use**\n *\n * Use when you need different cache entry lifetimes based on the lookup result\n * or key characteristics.\n *\n * **Details**\n *\n * The timeToLive function receives both the exit result and the key, allowing\n * for flexible TTL policies based on success/failure state and key characteristics.\n *\n * **Example** (Configuring dynamic time to live)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect, Exit } from \"effect\"\n *\n * // Cache with TTL based on computed value\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.makeWith(\n * (id: number) => Effect.succeed({ id, active: id % 2 === 0 }),\n * {\n * capacity: 1000,\n * timeToLive(exit) {\n * if (Exit.isSuccess(exit)) {\n * const user = exit.value\n * return user.active ? \"1 hour\" : \"5 minutes\"\n * }\n * return \"30 seconds\"\n * }\n * }\n * )\n *\n * return cache.capacity\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => 1000\n * ```\n *\n * @see {@link make} for a simpler cache constructor with a fixed time-to-live for all entries\n * @category constructors\n * @since 2.0.0\n */\nexport const makeWith = (lookup, options) => effect.contextWith(context => {\n const self = Object.create(Proto);\n self.lookup = key => effect.updateContext(lookup(key), input => Context.merge(context, input));\n self.map = MutableHashMap.make();\n self.capacity = options.capacity;\n self.timeToLive = options.timeToLive ? (exit, key) => Duration.fromInputUnsafe(options.timeToLive(exit, key)) : defaultTimeToLive;\n return effect.succeed(self);\n});\n/**\n * Creates a cache with a fixed time-to-live for all entries.\n *\n * **Details**\n *\n * This is the basic cache constructor where all entries share the same TTL.\n * The lookup function will be called when a key is not found or has expired.\n *\n * **Example** (Creating a basic cache)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * // Basic cache with string keys\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make<string, number>({\n * capacity: 100,\n * lookup: (key) => Effect.succeed(key.length)\n * })\n *\n * const result1 = yield* Cache.get(cache, \"hello\")\n * const result2 = yield* Cache.get(cache, \"world\")\n * return { result1, result2 }\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => { result1: 5, result2: 5 }\n * ```\n *\n * **Example** (Creating a cache with TTL)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const users = new Map([\n * [123, { name: \"Ada\", email: \"ada@example.com\" }],\n * [456, { name: \"Grace\", email: \"grace@example.com\" }]\n * ])\n *\n * const cache = yield* Cache.make<\n * number,\n * { name: string; email: string },\n * string\n * >({\n * capacity: 500,\n * lookup: (userId) =>\n * Effect.suspend(() => {\n * const user = users.get(userId)\n * return user === undefined\n * ? Effect.fail(`User ${userId} not found`)\n * : Effect.succeed(user)\n * }),\n * timeToLive: \"15 minutes\"\n * })\n *\n * const user1 = yield* Cache.get(cache, 123)\n * const user2 = yield* Cache.get(cache, 123)\n * return [user1, user2, user1 === user2] as const\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [{ name: \"Ada\", email: \"ada@example.com\" }, { name: \"Ada\", email: \"ada@example.com\" }, true]\n * ```\n *\n * @category constructors\n * @since 2.0.0\n */\nexport const make = options => makeWith(options.lookup, {\n ...options,\n timeToLive: options.timeToLive !== undefined ? () => options.timeToLive : defaultTimeToLive\n});\nconst Proto = {\n ...PipeInspectableProto,\n [TypeId]: TypeId,\n toJSON() {\n return {\n _id: \"Cache\",\n capacity: this.capacity,\n map: this.map\n };\n }\n};\nconst defaultTimeToLive = (_, _key) => Duration.infinity;\n/**\n * Retrieves the value for a key, invoking the lookup function on a cache miss\n * or expired entry.\n *\n * **Details**\n *\n * Concurrent `get` calls for the same missing key share the same pending\n * lookup. The cache stores the lookup `Exit`, so failed lookups are cached and\n * will fail again until the entry expires, is invalidated, or is refreshed.\n *\n * **Example** (Getting cached values)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // Cache miss - triggers lookup function\n * const result1 = yield* Cache.get(cache, \"hello\")\n *\n * // Cache hit - returns cached value without lookup\n * const result2 = yield* Cache.get(cache, \"hello\")\n *\n * return { result1, result2 }\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => { result1: 5, result2: 5 }\n * ```\n *\n * **Example** (Handling lookup failures)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect, Exit } from \"effect\"\n *\n * // Error handling when lookup fails\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make<string, number, string>({\n * capacity: 10,\n * lookup: (key: string) =>\n * key === \"error\"\n * ? Effect.fail(\"Lookup failed\")\n * : Effect.succeed(key.length)\n * })\n *\n * // Successful lookup\n * const success = yield* Cache.get(cache, \"hello\")\n *\n * // Failed lookup - returns error\n * const failure = yield* Effect.exit(Cache.get(cache, \"error\"))\n * return [success, failure] as const\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [5, Exit.fail(\"Lookup failed\")]\n * ```\n *\n * **Example** (Sharing concurrent lookups)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * // Concurrent access - multiple gets of same key only invoke lookup once\n * const program = Effect.gen(function*() {\n * let lookupCount = 0\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) =>\n * Effect.sync(() => {\n * lookupCount++\n * return key.length\n * })\n * })\n *\n * // Multiple concurrent gets\n * const results = yield* Effect.all([\n * Cache.get(cache, \"hello\"),\n * Cache.get(cache, \"hello\"),\n * Cache.get(cache, \"hello\")\n * ], { concurrency: \"unbounded\" })\n *\n * return { results, lookupCount }\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => { results: [5, 5, 5], lookupCount: 1 }\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const get = /*#__PURE__*/dual(2, (self, key) => core.withFiber(fiber => {\n const oentry = MutableHashMap.get(self.map, key);\n if (Option.isSome(oentry) && !hasExpired(oentry.value, fiber)) {\n // Move the entry to the end of the map to keep it fresh\n MutableHashMap.remove(self.map, key);\n MutableHashMap.set(self.map, key, oentry.value);\n return oentry.value.await();\n }\n const entry = new EntryImpl(fiber, self.lookup(key));\n entry.fiber.addObserver(exit => {\n if (effect.exitHasInterrupts(exit)) {\n const current = MutableHashMap.get(self.map, key);\n if (Option.isSome(current) && current.value === entry) {\n MutableHashMap.remove(self.map, key);\n }\n return;\n }\n const ttl = self.timeToLive(exit, key);\n if (Duration.isFinite(ttl)) {\n entry.expiresAt = fiber.getRef(effect.ClockRef).currentTimeMillisUnsafe() + Duration.toMillis(ttl);\n } else if (Duration.isZero(ttl)) {\n MutableHashMap.remove(self.map, key);\n }\n });\n const exit = entry.fiber.pollUnsafe();\n if (exit === undefined || !effect.exitHasInterrupts(exit)) {\n MutableHashMap.set(self.map, key, entry);\n }\n if (Number.isFinite(self.capacity)) {\n checkCapacity(self);\n }\n return entry.await();\n}));\nclass EntryImpl {\n expiresAt;\n awaiters;\n fiber;\n constructor(parent, valueEffect) {\n this.fiber = effect.forkUnsafe(parent, valueEffect, true, true);\n this.awaiters = 0;\n this.expiresAt = undefined;\n }\n await() {\n const exit = this.fiber.pollUnsafe();\n if (exit) return exit;\n this.awaiters++;\n return effect.onExit(effect.fiberJoin(this.fiber), () => {\n this.awaiters--;\n if (this.awaiters > 0 || this.fiber.pollUnsafe()) return effect.void;\n return effect.fiberInterrupt(this.fiber);\n });\n }\n}\nconst hasExpired = (entry, fiber) => {\n if (entry.expiresAt === undefined) {\n return false;\n }\n return fiber.getRef(effect.ClockRef).currentTimeMillisUnsafe() >= entry.expiresAt;\n};\nconst checkCapacity = self => {\n let diff = MutableHashMap.size(self.map) - self.capacity;\n if (diff <= 0) return;\n // MutableHashMap has insertion order, so we can remove the oldest entries\n for (const [key] of self.map) {\n MutableHashMap.remove(self.map, key);\n diff--;\n if (diff === 0) return;\n }\n};\n/**\n * Reads an existing cache entry without invoking the lookup function.\n *\n * **Details**\n *\n * Returns `Option.none()` when the key is missing or expired, and `Option.some`\n * when a cached lookup has succeeded. If the entry is still pending, waits for\n * it to complete. If the cached or pending lookup fails, this effect fails with\n * the same error.\n *\n * **Example** (Reading cached values without lookup)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect, Option } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // No value in cache yet - returns None without lookup\n * const empty = yield* Cache.getOption(cache, \"hello\")\n *\n * // Populate cache using get\n * yield* Cache.get(cache, \"hello\")\n *\n * // Now getOption returns the cached value\n * const cached = yield* Cache.getOption(cache, \"hello\")\n * return [empty, cached] as const\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [Option.none(), Option.some(5)]\n * ```\n *\n * **Example** (Skipping expired entries)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect, Option } from \"effect\"\n * import { TestClock } from \"effect/testing\"\n *\n * // Expired entries return None\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) => Effect.succeed(key.length),\n * timeToLive: \"1 hour\"\n * })\n *\n * // Add value to cache\n * yield* Cache.get(cache, \"hello\")\n *\n * // Value exists before expiration\n * const beforeExpiry = yield* Cache.getOption(cache, \"hello\")\n *\n * // Simulate time passing\n * yield* TestClock.adjust(\"2 hours\")\n *\n * // Value expired - returns None\n * const afterExpiry = yield* Cache.getOption(cache, \"hello\")\n * return [beforeExpiry, afterExpiry] as const\n * })\n *\n * const actual = await Effect.runPromise(Effect.provide(program, TestClock.layer()))\n * actual // => [Option.some(5), Option.none()]\n * ```\n *\n * **Example** (Waiting for pending lookups)\n *\n * ```ts import.meta.vitest\n * import { Cache, Deferred, Effect, Fiber, Option } from \"effect\"\n *\n * // Waits for ongoing computation to complete\n * const program = Effect.gen(function*() {\n * const deferred = yield* Deferred.make<void>()\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (_key: string) => Deferred.await(deferred).pipe(Effect.as(42))\n * })\n *\n * // Start lookup in background\n * const getFiber = yield* Effect.forkChild(Cache.get(cache, \"key\"))\n *\n * // getOption waits for ongoing computation\n * const optionFiber = yield* Effect.forkChild(Cache.getOption(cache, \"key\"))\n *\n * // Complete the computation\n * yield* Deferred.succeed(deferred, void 0)\n *\n * const result = yield* Fiber.join(optionFiber)\n * const value = yield* Fiber.join(getFiber)\n * return [result, value] as const\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [Option.some(42), 42]\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const getOption = /*#__PURE__*/dual(2, (self, key) => core.withFiber(fiber => {\n const entry = getImpl(self, key, fiber);\n return entry ? effect.asSome(entry.await()) : effect.succeedNone;\n}));\nconst getImpl = (self, key, fiber, isRead = true) => {\n const oentry = MutableHashMap.get(self.map, key);\n if (Option.isNone(oentry)) {\n return undefined;\n } else if (hasExpired(oentry.value, fiber)) {\n MutableHashMap.remove(self.map, key);\n return undefined;\n } else if (isRead) {\n MutableHashMap.remove(self.map, key);\n MutableHashMap.set(self.map, key, oentry.value);\n }\n return oentry.value;\n};\n/**\n * Retrieves the value associated with the specified key from the cache, only if\n * it contains a resolved successful value.\n *\n * **Details**\n *\n * This checks only an existing non-expired entry. It returns `Option.some` when\n * the entry has already resolved successfully, and `Option.none` for missing,\n * expired, failed, or still-pending entries.\n *\n * @see {@link get} for triggering or awaiting the cache lookup\n * @see {@link getOption} for reading an existing entry as an optional effect\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const getSuccess = /*#__PURE__*/dual(2, (self, key) => core.withFiber(fiber => {\n const exit = getImpl(self, key, fiber)?.fiber.pollUnsafe();\n if (exit && effect.exitIsSuccess(exit)) {\n return effect.succeedSome(exit.value);\n }\n return effect.succeedNone;\n}));\n/**\n * Sets the value associated with the specified key in the cache. This will\n * overwrite any existing value for that key, skipping the lookup function.\n *\n * **Example** (Setting values directly)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 100,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // Set a value directly without invoking lookup\n * yield* Cache.set(cache, \"hello\", 42)\n * return yield* Cache.get(cache, \"hello\")\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => 42\n * ```\n *\n * **Example** (Overwriting cached values)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * // Overwriting existing cached values\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 100,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // First get populates via lookup\n * const original = yield* Cache.get(cache, \"test\") // 4\n *\n * // Set overwrites the cached value\n * yield* Cache.set(cache, \"test\", 999)\n * const updated = yield* Cache.get(cache, \"test\") // 999\n *\n * return { original, updated }\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => { original: 4, updated: 999 }\n * ```\n *\n * **Example** (Applying TTL to set values)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n * import { TestClock } from \"effect/testing\"\n *\n * // TTL behavior with set operations\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 100,\n * lookup: (key: string) => Effect.succeed(key.length),\n * timeToLive: \"1 hour\"\n * })\n *\n * // Set value with TTL applied\n * yield* Cache.set(cache, \"temporary\", 123)\n * const beforeExpiry = yield* Cache.has(cache, \"temporary\")\n *\n * // Advance time past TTL\n * yield* TestClock.adjust(\"2 hours\")\n * const afterExpiry = yield* Cache.has(cache, \"temporary\")\n * return [beforeExpiry, afterExpiry]\n * })\n *\n * const actual = await Effect.runPromise(Effect.provide(program, TestClock.layer()))\n * actual // => [true, false]\n * ```\n *\n * **Example** (Enforcing capacity when setting values)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * // Capacity enforcement with set operations\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 2,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // Fill cache to capacity\n * yield* Cache.set(cache, \"a\", 1)\n * yield* Cache.set(cache, \"b\", 2)\n * const sizeBeforeEviction = yield* Cache.size(cache)\n *\n * // Adding another entry evicts oldest\n * yield* Cache.set(cache, \"c\", 3)\n * const sizeAfterEviction = yield* Cache.size(cache)\n * const hasOldest = yield* Cache.has(cache, \"a\")\n * const hasNewest = yield* Cache.has(cache, \"c\")\n * return [sizeBeforeEviction, sizeAfterEviction, hasOldest, hasNewest]\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [2, 2, false, true]\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const set = /*#__PURE__*/dual(3, (self, key, value) => core.withFiber(fiber => {\n const exit = core.exitSucceed(value);\n const entry = new EntryImpl(fiber, exit);\n const ttl = self.timeToLive(exit, key);\n if (Duration.isZero(ttl)) {\n MutableHashMap.remove(self.map, key);\n return effect.void;\n }\n entry.expiresAt = Duration.isFinite(ttl) ? fiber.getRef(effect.ClockRef).currentTimeMillisUnsafe() + Duration.toMillis(ttl) : undefined;\n MutableHashMap.set(self.map, key, entry);\n checkCapacity(self);\n return effect.void;\n}));\n/**\n * Checks whether the cache contains an entry for the specified key.\n *\n * **Details**\n *\n * This checks for an existing non-expired entry without invoking the cache\n * lookup function. Expired entries are treated as absent.\n *\n * **Example** (Checking for cached keys)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 100,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // Check non-existent key\n * const missing = yield* Cache.has(cache, \"missing\")\n *\n * // Add entry and check existence\n * yield* Cache.get(cache, \"hello\")\n * const present = yield* Cache.has(cache, \"hello\")\n * return [missing, present]\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [false, true]\n * ```\n *\n * **Example** (Checking TTL expiration)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n * import { TestClock } from \"effect/testing\"\n *\n * // TTL expiration behavior\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 100,\n * lookup: (key: string) => Effect.succeed(key.length),\n * timeToLive: \"1 hour\"\n * })\n *\n * // Add entry with TTL\n * yield* Cache.get(cache, \"expires\")\n * const initial = yield* Cache.has(cache, \"expires\")\n *\n * // Still valid before expiration\n * yield* TestClock.adjust(\"30 minutes\")\n * const beforeExpiry = yield* Cache.has(cache, \"expires\")\n *\n * // Expired after TTL\n * yield* TestClock.adjust(\"31 minutes\")\n * const afterExpiry = yield* Cache.has(cache, \"expires\")\n * return [initial, beforeExpiry, afterExpiry]\n * })\n *\n * const actual = await Effect.runPromise(Effect.provide(program, TestClock.layer()))\n * actual // => [true, true, false]\n * ```\n *\n * **Example** (Checking multiple keys)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * // Checking multiple keys efficiently\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 100,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // Populate some entries\n * yield* Cache.set(cache, \"apple\", 5)\n * yield* Cache.set(cache, \"banana\", 6)\n *\n * // Check multiple keys\n * const keys = [\"apple\", \"banana\", \"cherry\", \"date\"]\n * const results: Array<string> = []\n * for (const key of keys) {\n * const exists = yield* Cache.has(cache, key)\n * results.push(`${key}: ${exists}`)\n * }\n * return results\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [\"apple: true\", \"banana: true\", \"cherry: false\", \"date: false\"]\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const has = /*#__PURE__*/dual(2, (self, key) => core.withFiber(fiber => {\n const oentry = getImpl(self, key, fiber, false);\n return effect.succeed(oentry !== undefined);\n}));\n/**\n * Invalidates the entry associated with the specified key in the cache.\n *\n * **Example** (Invalidating cached entries)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // Add a value to the cache\n * yield* Cache.get(cache, \"hello\")\n * const beforeInvalidation = yield* Cache.has(cache, \"hello\")\n *\n * // Invalidate the entry\n * yield* Cache.invalidate(cache, \"hello\")\n * const afterInvalidation = yield* Cache.has(cache, \"hello\")\n *\n * // Invalidating non-existent keys doesn't error\n * yield* Cache.invalidate(cache, \"nonexistent\")\n *\n * // Get after invalidation will invoke lookup again\n * let lookupCount = 0\n * const cache2 = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) =>\n * Effect.sync(() => {\n * lookupCount++\n * return key.length\n * })\n * })\n *\n * yield* Cache.get(cache2, \"test\") // lookupCount = 1\n * yield* Cache.invalidate(cache2, \"test\")\n * yield* Cache.get(cache2, \"test\") // lookupCount = 2 (lookup called again)\n * return { beforeInvalidation, afterInvalidation, lookupCount }\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => { beforeInvalidation: true, afterInvalidation: false, lookupCount: 2 }\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const invalidate = /*#__PURE__*/dual(2, (self, key) => effect.sync(() => {\n MutableHashMap.remove(self.map, key);\n}));\n/**\n * Invalidates the entry associated with the specified key in the cache when the\n * predicate returns true for the cached value.\n *\n * **Example** (Invalidating entries conditionally)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // Add values to the cache\n * yield* Cache.get(cache, \"hello\") // value = 5\n * yield* Cache.get(cache, \"hi\") // value = 2\n *\n * // Invalidate when value equals 5\n * const invalidated1 = yield* Cache.invalidateWhen(\n * cache,\n * \"hello\",\n * (value) => value === 5\n * )\n * const hasHello = yield* Cache.has(cache, \"hello\")\n *\n * // Don't invalidate when predicate doesn't match\n * const invalidated2 = yield* Cache.invalidateWhen(\n * cache,\n * \"hi\",\n * (value) => value === 5\n * )\n * const hasHi = yield* Cache.has(cache, \"hi\")\n *\n * // Returns false for non-existent keys\n * const invalidated3 = yield* Cache.invalidateWhen(\n * cache,\n * \"nonexistent\",\n * () => true\n * )\n *\n * // Returns false for failed cached values\n * const cacheWithErrors = yield* Cache.make<string, number, string>({\n * capacity: 10,\n * lookup: (key: string) =>\n * key === \"fail\" ? Effect.fail(\"error\") : Effect.succeed(key.length)\n * })\n *\n * yield* Effect.exit(Cache.get(cacheWithErrors, \"fail\"))\n * const invalidated4 = yield* Cache.invalidateWhen(\n * cacheWithErrors,\n * \"fail\",\n * () => true\n * )\n * return [invalidated1, hasHello, invalidated2, hasHi, invalidated3, invalidated4]\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [true, false, false, true, false, false]\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const invalidateWhen = /*#__PURE__*/dual(3, (self, key, f) => core.withFiber(fiber => {\n const oentry = getImpl(self, key, fiber, false);\n if (oentry === undefined) {\n return effect.succeed(false);\n }\n return oentry.await().pipe(effect.map(value => {\n if (f(value)) {\n const current = MutableHashMap.get(self.map, key);\n if (Option.isNone(current) || current.value !== oentry) {\n return false;\n }\n MutableHashMap.remove(self.map, key);\n return true;\n }\n return false;\n }), effect.catchCause(() => effect.succeed(false)));\n}));\n/**\n * Forces a refresh of the value associated with the specified key in the cache.\n *\n * **Details**\n *\n * It will always invoke the lookup function to construct a new value,\n * overwriting any existing value for that key.\n *\n * **Example** (Refreshing cached values)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * // Force refresh of existing cached values\n * const program = Effect.gen(function*() {\n * let counter = 0\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) => Effect.sync(() => `${key}-${++counter}`)\n * })\n *\n * // Initial cache population\n * const value1 = yield* Cache.get(cache, \"user\")\n *\n * // Get from cache (no lookup)\n * const value2 = yield* Cache.get(cache, \"user\")\n *\n * // Force refresh - always calls lookup\n * const refreshed = yield* Cache.refresh(cache, \"user\")\n *\n * // Subsequent gets return refreshed value\n * const value3 = yield* Cache.get(cache, \"user\")\n * return [value1, value2, refreshed, value3, counter]\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [\"user-1\", \"user-1\", \"user-2\", \"user-2\", 2]\n * ```\n *\n * **Example** (Resetting TTL on refresh)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n * import { TestClock } from \"effect/testing\"\n *\n * // Refresh resets TTL (Time To Live)\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) => Effect.succeed(key.length),\n * timeToLive: \"1 hour\"\n * })\n *\n * yield* Cache.get(cache, \"test\")\n * yield* TestClock.adjust(\"45 minutes\")\n *\n * // Entry would normally expire in 15 minutes\n * const beforeRefresh = yield* Cache.has(cache, \"test\")\n *\n * // Refresh resets the TTL to full 1 hour\n * yield* Cache.refresh(cache, \"test\")\n * yield* TestClock.adjust(\"30 minutes\")\n *\n * // Still valid because TTL was reset\n * const afterRefresh = yield* Cache.has(cache, \"test\")\n * return [beforeRefresh, afterRefresh]\n * })\n *\n * const actual = await Effect.runPromise(Effect.provide(program, TestClock.layer()))\n * actual // => [true, true]\n * ```\n *\n * **Example** (Refreshing missing keys)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * // Refresh non-existent keys\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) => Effect.succeed(`value-for-${key}`)\n * })\n *\n * // Refresh non-existent key creates new entry\n * const result = yield* Cache.refresh(cache, \"newKey\")\n *\n * // Verify it's now cached\n * const cached = yield* Cache.has(cache, \"newKey\")\n * return [result, cached]\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [\"value-for-newKey\", true]\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const refresh = /*#__PURE__*/dual(2, (self, key) => core.withFiber(fiber => {\n const entry = new EntryImpl(fiber, self.lookup(key));\n const existing = getImpl(self, key, fiber, false) !== undefined;\n if (!existing) {\n MutableHashMap.set(self.map, key, entry);\n checkCapacity(self);\n }\n entry.fiber.addObserver(exit => {\n if (effect.exitHasInterrupts(exit)) {\n const current = MutableHashMap.get(self.map, key);\n if (Option.isSome(current) && current.value === entry) {\n MutableHashMap.remove(self.map, key);\n }\n return;\n }\n const ttl = self.timeToLive(exit, key);\n if (Duration.isZero(ttl)) {\n const current = MutableHashMap.get(self.map, key);\n if (existing || Option.isSome(current) && current.value === entry) {\n MutableHashMap.remove(self.map, key);\n }\n return effect.void;\n }\n entry.expiresAt = Duration.isFinite(ttl) ? fiber.getRef(effect.ClockRef).currentTimeMillisUnsafe() + Duration.toMillis(ttl) : undefined;\n if (existing) {\n MutableHashMap.set(self.map, key, entry);\n checkCapacity(self);\n }\n });\n return entry.await();\n}));\n/**\n * Invalidates all entries in the cache.\n *\n * **Example** (Invalidating all entries)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * // Clear all cached entries at once\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // Populate cache with multiple entries\n * yield* Cache.get(cache, \"apple\")\n * yield* Cache.get(cache, \"banana\")\n * yield* Cache.get(cache, \"cherry\")\n *\n * const sizeBeforeInvalidation = yield* Cache.size(cache)\n * const hasAppleBeforeInvalidation = yield* Cache.has(cache, \"apple\")\n *\n * // Clear all entries\n * yield* Cache.invalidateAll(cache)\n *\n * // Verify cache is empty\n * const sizeAfterInvalidation = yield* Cache.size(cache)\n * const hasAppleAfterInvalidation = yield* Cache.has(cache, \"apple\")\n * const hasBananaAfterInvalidation = yield* Cache.has(cache, \"banana\")\n * const hasCherryAfterInvalidation = yield* Cache.has(cache, \"cherry\")\n * return [\n * sizeBeforeInvalidation,\n * hasAppleBeforeInvalidation,\n * sizeAfterInvalidation,\n * hasAppleAfterInvalidation,\n * hasBananaAfterInvalidation,\n * hasCherryAfterInvalidation\n * ]\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [3, true, 0, false, false, false]\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const invalidateAll = self => effect.sync(() => {\n MutableHashMap.clear(self.map);\n});\n/**\n * Retrieves the approximate number of entries in the cache.\n *\n * **Details**\n *\n * Note that expired entries are counted until they are accessed and removed.\n * The size reflects the current number of entries stored, not the number\n * of valid entries.\n *\n * **Example** (Reading cache size)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // Empty cache has size 0\n * const emptySize = yield* Cache.size(cache)\n *\n * // Add entries and check size\n * yield* Cache.get(cache, \"hello\")\n * yield* Cache.get(cache, \"world\")\n * const sizeAfterAdding = yield* Cache.size(cache)\n *\n * // Size decreases after invalidation\n * yield* Cache.invalidate(cache, \"hello\")\n * const sizeAfterInvalidation = yield* Cache.size(cache)\n * return [emptySize, sizeAfterAdding, sizeAfterInvalidation]\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [0, 2, 1]\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const size = self => effect.sync(() => MutableHashMap.size(self.map));\n/**\n * Retrieves all active keys from the cache, automatically filtering out expired entries.\n *\n * **Example** (Reading active keys)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * // Basic key enumeration\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // Add some entries to the cache\n * yield* Cache.get(cache, \"hello\")\n * yield* Cache.get(cache, \"world\")\n * yield* Cache.get(cache, \"cache\")\n *\n * // Retrieve all active keys\n * const keys = yield* Cache.keys(cache)\n * return Array.from(keys).sort()\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [\"cache\", \"hello\", \"world\"]\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const keys = self => core.withFiber(fiber => {\n const now = fiber.getRef(effect.ClockRef).currentTimeMillisUnsafe();\n return effect.succeed(Iterable.filterMap(self.map, ([key, entry]) => {\n if (entry.expiresAt === undefined || entry.expiresAt > now) {\n return Result.succeed(key);\n }\n MutableHashMap.remove(self.map, key);\n return Result.failVoid;\n }));\n});\n/**\n * Retrieves all successfully cached values from the cache, excluding failed\n * lookups and expired entries.\n *\n * **Example** (Reading all cached values)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // Add some values to the cache\n * yield* Cache.get(cache, \"a\")\n * yield* Cache.get(cache, \"ab\")\n * yield* Cache.get(cache, \"abc\")\n *\n * // Retrieve all cached values\n * const values = yield* Cache.values(cache)\n * return Array.from(values).sort()\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [1, 2, 3]\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const values = self => effect.map(entries(self), Iterable.map(([, value]) => value));\n/**\n * Retrieves all key-value pairs from the cache as an iterable. This function\n * only returns entries with successfully resolved values, filtering out any\n * failed lookups or expired entries.\n *\n * **Gotchas**\n *\n * Expired entries are removed from the cache while `entries` filters them out.\n *\n * @see {@link keys} for retrieving only cached keys\n * @see {@link values} for retrieving only cached values\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const entries = self => core.withFiber(fiber => {\n const now = fiber.getRef(effect.ClockRef).currentTimeMillisUnsafe();\n return effect.succeed(Iterable.filterMap(self.map, ([key, entry]) => {\n if (entry.expiresAt === undefined || entry.expiresAt > now) {\n const exit = entry.fiber.pollUnsafe();\n return exit && exit._tag === \"Success\" ? Result.succeed([key, exit.value]) : Result.failVoid;\n }\n MutableHashMap.remove(self.map, key);\n return Result.failVoid;\n }));\n});\n//# sourceMappingURL=Cache.js.map","import * as Effect from \"../../Effect.js\";\nimport { dual } from \"../../Function.js\";\nimport * as InternalRecord from \"../../internal/record.js\";\nimport { pipeArguments } from \"../../Pipeable.js\";\nimport * as Predicate from \"../../Predicate.js\";\nimport * as Schema from \"../../Schema.js\";\nimport * as Struct_ from \"../../Struct.js\";\n/**\n * Runtime type identifier attached to variant schema structs.\n *\n * @category type IDs\n * @since 4.0.0\n */\nexport const TypeId = \"~effect/schema/VariantSchema\";\nconst cacheSymbol = /*#__PURE__*/Symbol.for(`${TypeId}/cache`);\nconst defaultCacheSymbol = /*#__PURE__*/Symbol.for(`${TypeId}/defaultCache`);\n/**\n * Returns `true` when a value is a variant schema struct.\n *\n * @category guards\n * @since 4.0.0\n */\nexport const isStruct = u => Predicate.hasProperty(u, TypeId);\nconst FieldTypeId = \"~effect/schema/VariantSchema/Field\";\n/**\n * Returns `true` when a value is a variant schema field.\n *\n * @category guards\n * @since 4.0.0\n */\nexport const isField = u => Predicate.hasProperty(u, FieldTypeId);\nconst extract = /*#__PURE__*/dual(args => isStruct(args[0]), (self, variant, options) => {\n if (options?.isDefault === true && Schema.isSchema(self)) {\n return self;\n }\n const cache = options?.isDefault === true ? self[defaultCacheSymbol] ?? (self[defaultCacheSymbol] = Object.create(null)) : self[cacheSymbol] ?? (self[cacheSymbol] = Object.create(null));\n if (Object.hasOwn(cache, variant)) {\n return cache[variant];\n }\n const fields = {};\n for (const key of Object.keys(self[TypeId])) {\n const value = self[TypeId][key];\n if (value === undefined) {\n continue;\n }\n if (TypeId in value) {\n if (options?.isDefault === true && Schema.isSchema(value)) {\n InternalRecord.assignProperty(fields, key, value);\n } else {\n InternalRecord.assignProperty(fields, key, extract(value, variant));\n }\n } else if (FieldTypeId in value) {\n if (Object.hasOwn(value.schemas, variant)) {\n const schema = value.schemas[variant];\n if (schema !== undefined) {\n InternalRecord.assignProperty(fields, key, schema);\n }\n }\n } else {\n InternalRecord.assignProperty(fields, key, value);\n }\n }\n const schema = Schema.Struct(fields);\n cache[variant] = schema;\n return schema;\n});\n/**\n * Returns the original field definitions stored on a variant schema struct.\n *\n * @category accessors\n * @since 4.0.0\n */\nexport const fields = self => self[TypeId];\n/**\n * Creates a variant schema toolkit for a fixed set of variant names and a default\n * variant.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const make = options => {\n function Class(identifier) {\n return function (fields, annotations) {\n const variantStruct = Struct(fields);\n const schema = extract(variantStruct, options.defaultVariant, {\n isDefault: true\n });\n const SClass = Schema.Class;\n class Base extends SClass(identifier)(schema.fields, annotations) {\n static [TypeId] = fields;\n }\n for (const variant of options.variants) {\n Object.defineProperty(Base, variant, {\n value: extract(variantStruct, variant).annotate({\n id: `${identifier}.${variant}`,\n title: `${identifier}.${variant}`\n })\n });\n }\n return Base;\n };\n }\n function FieldOnly(keys) {\n return function (schema) {\n const obj = {};\n for (const key of keys) {\n InternalRecord.assignProperty(obj, key, schema);\n }\n return Field(obj);\n };\n }\n function FieldExcept(keys) {\n return function (schema) {\n const obj = {};\n for (const variant of options.variants) {\n if (!keys.includes(variant)) {\n InternalRecord.assignProperty(obj, variant, schema);\n }\n }\n return Field(obj);\n };\n }\n function UnionVariants(members) {\n return Union(members, options.defaultVariant, options.variants);\n }\n const fieldEvolve = dual(2, (self, f) => {\n const field = isField(self) ? self : Field(Object.fromEntries(options.variants.map(variant => [variant, self])));\n return Field(Struct_.evolve(field.schemas, f));\n });\n const extractVariants = dual(2, (self, variant) => extract(self, variant, {\n isDefault: variant === options.defaultVariant\n }));\n return {\n Struct,\n Field,\n FieldOnly,\n FieldExcept,\n Class,\n Union: UnionVariants,\n fieldEvolve,\n // fieldFromKey,\n extract: extractVariants\n };\n};\n/**\n * Marks a value as an explicit override for an `Overrideable` schema default.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const Override = value => value;\n/**\n * Wraps a schema with an effectful constructor default while allowing explicit\n * values to be marked with `Override`.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const Overrideable = (schema, options) => schema.pipe(Schema.decodeTo(Schema.brand(\"Override\")(Schema.toType(schema))), Schema.withConstructorDefault(Effect.map(options.defaultValue, Override)));\nconst StructProto = {\n pipe() {\n return pipeArguments(this, arguments);\n }\n};\nconst Struct = fields => {\n const self = Object.create(StructProto);\n self[TypeId] = fields;\n return self;\n};\nconst FieldProto = {\n [FieldTypeId]: FieldTypeId,\n pipe() {\n return pipeArguments(this, arguments);\n }\n};\nconst Field = schemas => {\n const self = Object.create(FieldProto);\n self.schemas = schemas;\n return self;\n};\nconst Union = (members, defaultVariant, variants) => {\n const VariantUnion = Schema.Union(members.map(member => Schema.isSchema(member) ? member : extract(member, defaultVariant, {\n isDefault: true\n })));\n for (const variant of variants) {\n Object.defineProperty(VariantUnion, variant, {\n value: Schema.Union(members.map(member => extract(member, variant)))\n });\n }\n return VariantUnion;\n};\n//# sourceMappingURL=VariantSchema.js.map","import * as DateTime from \"../../DateTime.js\";\nimport * as Effect from \"../../Effect.js\";\nimport * as Uuid from \"../../internal/uuid.js\";\nimport * as Option from \"../../Option.js\";\nimport * as Predicate from \"../../Predicate.js\";\nimport * as Schema from \"../../Schema.js\";\nimport * as SchemaGetter from \"../../SchemaGetter.js\";\nimport * as SchemaTransformation from \"../../SchemaTransformation.js\";\nimport * as UndefinedOr from \"../../UndefinedOr.js\";\nimport * as VariantSchema from \"./VariantSchema.js\";\nconst {\n Class,\n Field,\n FieldExcept,\n FieldOnly,\n Struct,\n Union,\n extract,\n fieldEvolve\n} = /*#__PURE__*/VariantSchema.make({\n variants: [\"select\", \"insert\", \"update\", \"json\", \"jsonCreate\", \"jsonUpdate\"],\n defaultVariant: \"select\"\n});\nexport {\n/**\n * Creates domain model schemas with common database and JSON API variants.\n *\n * **Example** (Defining a variant model class)\n *\n * ```ts import.meta.vitest\n * import { Schema } from \"effect\"\n * import { Model } from \"effect/unstable/schema\"\n *\n * export const GroupId = Schema.Number.pipe(Schema.brand(\"GroupId\"))\n *\n * export class Group extends Model.Class<Group>(\"Group\")({\n * id: Model.GeneratedByDb(GroupId),\n * name: Schema.String,\n * createdAt: Model.DateTimeInsertFromDate,\n * updatedAt: Model.DateTimeUpdateFromDate\n * }) {}\n *\n * // schema used for selects\n * Group\n *\n * // schema used for inserts\n * Group.insert\n *\n * // schema used for updates\n * Group.update\n *\n * // schema used for json api\n * Group.json\n * Group.jsonCreate\n * Group.jsonUpdate\n *\n * // you can also turn them into classes\n * class GroupJson extends Schema.Class<GroupJson>(\"GroupJson\")(Group.json) {\n * get upperName() {\n * return this.name.toUpperCase()\n * }\n * }\n *\n * [Schema.isSchema(Group), Schema.isSchema(Group.insert), Schema.isSchema(Group.json)] // => [true, true, true]\n * ```\n *\n * @category constructors\n * @since 4.0.0\n */\nClass,\n/**\n * Extracts a generated variant schema from a model or variant struct.\n *\n * @category converting\n * @since 4.0.0\n */\nextract,\n/**\n * Creates a variant field from schemas keyed by variant name.\n *\n * @category constructors\n * @since 4.0.0\n */\nField,\n/**\n * Transforms schemas inside a variant field or plain schema by variant name.\n *\n * @category transforming\n * @since 4.0.0\n */\nfieldEvolve,\n/**\n * Creates a variant field that applies a schema to every variant except the\n * supplied keys.\n *\n * @category constructors\n * @since 4.0.0\n */\nFieldExcept,\n/**\n * Creates a variant field that applies a schema only to the supplied variants.\n *\n * @category constructors\n * @since 4.0.0\n */\nFieldOnly,\n/**\n * Creates a variant struct from model field definitions.\n *\n * @category constructors\n * @since 4.0.0\n */\nStruct,\n/**\n * Creates a union over the default and generated variant schemas of multiple\n * variant structs.\n *\n * @category constructors\n * @since 4.0.0\n */\nUnion };\n/**\n * Returns the variant field definitions stored on a model or variant struct.\n *\n * @category getters\n * @since 4.0.0\n */\nexport const fields = VariantSchema.fields;\n/**\n * Marks a value as an explicit override for fields that otherwise use an\n * overrideable default.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const Override = VariantSchema.Override;\n/**\n * Creates a variant field for a database-generated column available in read\n * variants only.\n *\n * **Details**\n *\n * The field is included in `select` and `json`, and omitted from `insert`,\n * `update`, `jsonCreate`, and `jsonUpdate`.\n *\n * @see {@link Field} for generated columns that need a custom variant set, such\n * as primary keys used in update payloads.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const GeneratedByDb = schema => Field({\n select: schema,\n json: schema\n});\n/**\n * A field that represents a value generated by the application and present in database\n * variants and the read JSON variant, but omitted from JSON create and update\n * variants.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const GeneratedByApp = schema => Field({\n select: schema,\n insert: schema,\n update: schema,\n json: schema\n});\n/**\n * A field that represents a sensitive value that should not be exposed in the\n * JSON variants.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const Sensitive = schema => Field({\n select: schema,\n insert: schema,\n update: schema\n});\n/**\n * Creates a schema for optional keys that decodes missing or null encoded values\n * through `Option` and encodes `Option` values back to optional nullable keys.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const optionalOption = schema => Schema.optionalKey(Schema.NullOr(schema)).pipe(Schema.decodeTo(Schema.Option(Schema.toType(schema)), SchemaTransformation.transformOptional({\n decode: oe => oe.pipe(Option.filter(Predicate.isNotNull), Option.some),\n encode: Option.flatten\n})));\n/**\n * Converts a field to one that is optional for all variants.\n *\n * **Details**\n *\n * For the database variants, it will accept `null`able values.\n * For the JSON variants, it will also accept missing keys.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const FieldOption = /*#__PURE__*/fieldEvolve({\n select: /*#__PURE__*/UndefinedOr.map(Schema.OptionFromNullOr),\n insert: /*#__PURE__*/UndefinedOr.map(Schema.OptionFromNullOr),\n update: /*#__PURE__*/UndefinedOr.map(Schema.OptionFromNullOr),\n json: /*#__PURE__*/UndefinedOr.map(optionalOption),\n jsonCreate: /*#__PURE__*/UndefinedOr.map(optionalOption),\n jsonUpdate: /*#__PURE__*/UndefinedOr.map(optionalOption)\n});\n/**\n * Schema for sqlite booleans that are represented as `0 | 1` in database\n * variants and `boolean` in JSON variants.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const BooleanSqlite = /*#__PURE__*/Field({\n select: Schema.BooleanFromBit,\n insert: Schema.BooleanFromBit,\n update: Schema.BooleanFromBit,\n json: Schema.Boolean,\n jsonCreate: Schema.Boolean,\n jsonUpdate: Schema.Boolean\n});\n/**\n * Schema for a `DateTime.Utc` that is serialized as a date string in the\n * format `YYYY-MM-DD`.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const Date = /*#__PURE__*/Schema.String.pipe(/*#__PURE__*/Schema.decodeTo(Schema.DateTimeUtc, {\n decode: /*#__PURE__*/SchemaGetter.dateTimeUtcFromInput().map(DateTime.removeTime),\n encode: /*#__PURE__*/SchemaGetter.transform(DateTime.formatIsoDate)\n}));\n/**\n * Schema for an overrideable UTC date-only field whose constructor default is\n * the current date with the time component removed.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const DateWithNow = /*#__PURE__*/VariantSchema.Overrideable(Date, {\n defaultValue: /*#__PURE__*/Effect.map(DateTime.now, DateTime.removeTime)\n});\n/**\n * Schema for an overrideable UTC date-time field encoded as a string and\n * defaulted to the current `DateTime.Utc`.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const DateTimeWithNow = /*#__PURE__*/VariantSchema.Overrideable(Schema.DateTimeUtcFromString, {\n defaultValue: DateTime.now\n});\n/**\n * Schema for an overrideable UTC date-time field encoded as a JavaScript `Date`\n * and defaulted to the current `DateTime.Utc`.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const DateTimeFromDateWithNow = /*#__PURE__*/VariantSchema.Overrideable(Schema.DateTimeUtcFromDate, {\n defaultValue: DateTime.now\n});\n/**\n * Schema for an overrideable UTC date-time field encoded as milliseconds and\n * defaulted to the current `DateTime.Utc`.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const DateTimeFromNumberWithNow = /*#__PURE__*/VariantSchema.Overrideable(Schema.DateTimeUtcFromMillis, {\n defaultValue: DateTime.now\n});\n/**\n * A field that represents a date-time value that is inserted as the current\n * `DateTime.Utc`. It is serialized as a string for the database.\n *\n * **Details**\n *\n * It is omitted from updates and is available for selection.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const DateTimeInsert = /*#__PURE__*/Field({\n select: Schema.DateTimeUtcFromString,\n insert: DateTimeWithNow,\n json: Schema.DateTimeUtcFromString\n});\n/**\n * A field that represents a date-time value that is inserted as the current\n * `DateTime.Utc`. It is serialized as a `Date` for the database.\n *\n * **Details**\n *\n * It is omitted from updates and is available for selection.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const DateTimeInsertFromDate = /*#__PURE__*/Field({\n select: Schema.DateTimeUtcFromDate,\n insert: DateTimeFromDateWithNow,\n json: Schema.DateTimeUtcFromString\n});\n/**\n * A field that represents a date-time value that is inserted as the current\n * `DateTime.Utc`. It is serialized as a `number`.\n *\n * **Details**\n *\n * It is omitted from updates and is available for selection.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const DateTimeInsertFromNumber = /*#__PURE__*/Field({\n select: Schema.DateTimeUtcFromMillis,\n insert: DateTimeFromNumberWithNow,\n json: Schema.DateTimeUtcFromMillis\n});\n/**\n * A field that represents a date-time value that is updated as the current\n * `DateTime.Utc`. It is serialized as a string for the database.\n *\n * **Details**\n *\n * It is set to the current `DateTime.Utc` on updates and inserts and is\n * available for selection.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const DateTimeUpdate = /*#__PURE__*/Field({\n select: Schema.DateTimeUtcFromString,\n insert: DateTimeWithNow,\n update: DateTimeWithNow,\n json: Schema.DateTimeUtcFromString\n});\n/**\n * A field that represents a date-time value that is updated as the current\n * `DateTime.Utc`. It is serialized as a `Date` for the database.\n *\n * **Details**\n *\n * It is set to the current `DateTime.Utc` on updates and inserts and is\n * available for selection.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const DateTimeUpdateFromDate = /*#__PURE__*/Field({\n select: Schema.DateTimeUtcFromDate,\n insert: DateTimeFromDateWithNow,\n update: DateTimeFromDateWithNow,\n json: Schema.DateTimeUtcFromString\n});\n/**\n * A field that represents a date-time value that is updated as the current\n * `DateTime.Utc`. It is serialized as a `number`.\n *\n * **Details**\n *\n * It is set to the current `DateTime.Utc` on updates and inserts and is\n * available for selection.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const DateTimeUpdateFromNumber = /*#__PURE__*/Field({\n select: Schema.DateTimeUtcFromMillis,\n insert: DateTimeFromNumberWithNow,\n update: DateTimeFromNumberWithNow,\n json: Schema.DateTimeUtcFromMillis\n});\n/**\n * A field that represents a JSON value stored as text in the database.\n *\n * **Details**\n *\n * The \"json\" variants will use the object schema directly.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const JsonFromString = schema => {\n const parsed = Schema.fromJsonString(Schema.toCodecJson(schema));\n return Field({\n select: parsed,\n insert: parsed,\n update: parsed,\n json: schema,\n jsonCreate: schema,\n jsonUpdate: schema\n });\n};\n/**\n * Schema for binary `Uint8Array` values backed by an `ArrayBuffer`.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const Uint8Array = Schema.Uint8Array;\n/**\n * Adds a constructor default that generates a binary UUID v4 for a branded\n * `Uint8Array` schema.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const UuidV4BytesWithGenerate = schema => schema.pipe(Schema.withConstructorDefault(Effect.sync(() => Uuid.v4Bytes())));\n/**\n * A field that represents a binary UUID v4 that is generated on inserts.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const UuidV4BytesInsert = schema => Field({\n select: schema,\n insert: UuidV4BytesWithGenerate(schema),\n update: schema,\n json: schema\n});\n/**\n * Adds a constructor default that generates a string UUID v4.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const UuidV4WithGenerate = schema => schema.pipe(Schema.withConstructorDefault(Effect.sync(Uuid.v4String)));\n/**\n * A field that represents a string UUID v4 that is generated on inserts.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const UuidV4Insert = schema => Field({\n select: schema,\n insert: UuidV4WithGenerate(schema),\n update: schema,\n json: schema\n});\n/**\n * Adds a constructor default that generates a string UUID v7.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const UuidV7WithGenerate = schema => schema.pipe(Schema.withConstructorDefault(Effect.clockWith(clock => Effect.succeed(Uuid.v7String(clock.currentTimeMillisUnsafe())))));\n/**\n * A field that represents a string UUID v7 that is generated on inserts.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const UuidV7Insert = schema => Field({\n select: schema,\n insert: UuidV7WithGenerate(schema),\n update: schema,\n json: schema\n});\n//# sourceMappingURL=Model.js.map","/**\n * Defines structured failures for SQL clients and driver integrations.\n *\n * `SqlError` wraps the different reasons a SQL operation can fail, such as\n * connection, authentication, authorization, syntax, constraint, or transaction\n * problems. Each reason keeps the original cause, optional message and\n * operation metadata, and whether retrying may succeed. This module also\n * includes schemas, guards, a SQLite error classifier, and the\n * `ResultLengthMismatch` error used by ordered batched SQL resolvers.\n *\n * @since 4.0.0\n */\nimport * as Predicate from \"../../Predicate.js\";\nimport * as Schema from \"../../Schema.js\";\nconst TypeId = \"~effect/sql/SqlError\";\nconst ReasonTypeId = \"~effect/sql/SqlError/Reason\";\nconst ReasonFields = {\n cause: /*#__PURE__*/Schema.Defect(),\n message: /*#__PURE__*/Schema.optional(Schema.String),\n operation: /*#__PURE__*/Schema.optional(Schema.String)\n};\n/**\n * SQL error reason for connection or open failures; marked retryable.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class ConnectionError extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/SqlError/ConnectionError\")(\"ConnectionError\", ReasonFields) {\n /**\n * Marks this value as a structured SQL error reason for runtime guards.\n *\n * @since 4.0.0\n */\n [ReasonTypeId] = ReasonTypeId;\n /**\n * Indicates whether retrying the failed SQL operation may succeed.\n *\n * @since 4.0.0\n */\n get isRetryable() {\n return true;\n }\n}\n/**\n * SQL error reason for authentication failures such as invalid credentials; not\n * marked retryable.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class AuthenticationError extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/SqlError/AuthenticationError\")(\"AuthenticationError\", ReasonFields) {\n /**\n * Marks this value as a structured SQL error reason for runtime guards.\n *\n * @since 4.0.0\n */\n [ReasonTypeId] = ReasonTypeId;\n /**\n * Indicates whether retrying the failed SQL operation may succeed.\n *\n * @since 4.0.0\n */\n get isRetryable() {\n return false;\n }\n}\n/**\n * SQL error reason for authorization or permission failures; not marked\n * retryable.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class AuthorizationError extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/SqlError/AuthorizationError\")(\"AuthorizationError\", ReasonFields) {\n /**\n * Marks this value as a structured SQL error reason for runtime guards.\n *\n * @since 4.0.0\n */\n [ReasonTypeId] = ReasonTypeId;\n /**\n * Indicates whether retrying the failed SQL operation may succeed.\n *\n * @since 4.0.0\n */\n get isRetryable() {\n return false;\n }\n}\n/**\n * SQL error reason for invalid SQL syntax; not marked retryable.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class SqlSyntaxError extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/SqlError/SqlSyntaxError\")(\"SqlSyntaxError\", ReasonFields) {\n /**\n * Marks this value as a structured SQL error reason for runtime guards.\n *\n * @since 4.0.0\n */\n [ReasonTypeId] = ReasonTypeId;\n /**\n * Indicates whether retrying the failed SQL operation may succeed.\n *\n * @since 4.0.0\n */\n get isRetryable() {\n return false;\n }\n}\nconst UniqueViolationFields = {\n ...ReasonFields,\n constraint: Schema.String\n};\n/**\n * SQL error reason for a unique constraint violation, including the violated\n * constraint identifier; not marked retryable.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class UniqueViolation extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/SqlError/UniqueViolation\")(\"UniqueViolation\", UniqueViolationFields) {\n /**\n * Marks this value as a structured SQL error reason for runtime guards.\n *\n * @since 4.0.0\n */\n [ReasonTypeId] = ReasonTypeId;\n /**\n * Indicates whether retrying the failed SQL operation may succeed.\n *\n * @since 4.0.0\n */\n get isRetryable() {\n return false;\n }\n}\n/**\n * SQL error reason for a non-unique constraint violation; not marked retryable.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class ConstraintError extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/SqlError/ConstraintError\")(\"ConstraintError\", ReasonFields) {\n /**\n * Marks this value as a structured SQL error reason for runtime guards.\n *\n * @since 4.0.0\n */\n [ReasonTypeId] = ReasonTypeId;\n /**\n * Indicates whether retrying the failed SQL operation may succeed.\n *\n * @since 4.0.0\n */\n get isRetryable() {\n return false;\n }\n}\n/**\n * SQL error reason for a database deadlock; marked retryable.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class DeadlockError extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/SqlError/DeadlockError\")(\"DeadlockError\", ReasonFields) {\n /**\n * Marks this value as a structured SQL error reason for runtime guards.\n *\n * @since 4.0.0\n */\n [ReasonTypeId] = ReasonTypeId;\n /**\n * Indicates whether retrying the failed SQL operation may succeed.\n *\n * @since 4.0.0\n */\n get isRetryable() {\n return true;\n }\n}\n/**\n * SQL error reason for a transaction serialization or isolation conflict;\n * marked retryable.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class SerializationError extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/SqlError/SerializationError\")(\"SerializationError\", ReasonFields) {\n /**\n * Marks this value as a structured SQL error reason for runtime guards.\n *\n * @since 4.0.0\n */\n [ReasonTypeId] = ReasonTypeId;\n /**\n * Indicates whether retrying the failed SQL operation may succeed.\n *\n * @since 4.0.0\n */\n get isRetryable() {\n return true;\n }\n}\n/**\n * SQL error reason for timing out while waiting on a database lock; marked\n * retryable.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class LockTimeoutError extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/SqlError/LockTimeoutError\")(\"LockTimeoutError\", ReasonFields) {\n /**\n * Marks this value as a structured SQL error reason for runtime guards.\n *\n * @since 4.0.0\n */\n [ReasonTypeId] = ReasonTypeId;\n /**\n * Indicates whether retrying the failed SQL operation may succeed.\n *\n * @since 4.0.0\n */\n get isRetryable() {\n return true;\n }\n}\n/**\n * SQL error reason for a statement or query timeout; marked retryable.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class StatementTimeoutError extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/SqlError/StatementTimeoutError\")(\"StatementTimeoutError\", ReasonFields) {\n /**\n * Marks this value as a structured SQL error reason for runtime guards.\n *\n * @since 4.0.0\n */\n [ReasonTypeId] = ReasonTypeId;\n /**\n * Indicates whether retrying the failed SQL operation may succeed.\n *\n * @since 4.0.0\n */\n get isRetryable() {\n return true;\n }\n}\n/**\n * SQL error reason for an unclassified database failure; not marked retryable.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class UnknownError extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/SqlError/UnknownError\")(\"UnknownError\", ReasonFields) {\n /**\n * Marks this value as a structured SQL error reason for runtime guards.\n *\n * @since 4.0.0\n */\n [ReasonTypeId] = ReasonTypeId;\n /**\n * Indicates whether retrying the failed SQL operation may succeed.\n *\n * @since 4.0.0\n */\n get isRetryable() {\n return false;\n }\n}\n/**\n * Schema for encoding and decoding SQL error reasons.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const SqlErrorReason = /*#__PURE__*/Schema.Union([ConnectionError, AuthenticationError, AuthorizationError, SqlSyntaxError, UniqueViolation, ConstraintError, DeadlockError, SerializationError, LockTimeoutError, StatementTimeoutError, UnknownError]);\n/**\n * Error wrapper for SQL failures whose `message`, `cause`, and `isRetryable`\n * values are derived from its `SqlErrorReason`.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class SqlError extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/SqlError\")(\"SqlError\", {\n reason: SqlErrorReason\n}) {\n /**\n * Marks this value as the top-level SQL error wrapper for runtime guards.\n *\n * @since 4.0.0\n */\n [TypeId] = TypeId;\n /**\n * Exposes the structured SQL reason as the JavaScript error cause.\n *\n * @since 4.0.0\n */\n cause = this.reason;\n /**\n * Uses the reason message when present, otherwise falls back to the reason tag.\n *\n * @since 4.0.0\n */\n get message() {\n return this.reason.message || this.reason._tag;\n }\n /**\n * Delegates retryability to the underlying SQL error reason.\n *\n * @since 4.0.0\n */\n get isRetryable() {\n return this.reason.isRetryable;\n }\n}\n/**\n * Returns `true` when a value is a `SqlError`.\n *\n * @category guards\n * @since 4.0.0\n */\nexport const isSqlError = u => Predicate.hasProperty(u, TypeId);\n/**\n * Returns `true` when a value is a `SqlErrorReason`.\n *\n * @category guards\n * @since 4.0.0\n */\nexport const isSqlErrorReason = u => Predicate.hasProperty(u, ReasonTypeId);\nconst sqliteCodeFromCause = cause => {\n if (!Predicate.hasProperty(cause, \"code\")) {\n return undefined;\n }\n const code = cause.code;\n return typeof code === \"string\" || typeof code === \"number\" ? code : undefined;\n};\nconst sqliteNumericCodeFromCause = cause => {\n const code = sqliteCodeFromCause(cause);\n if (typeof code === \"number\") {\n return code;\n }\n if (!Predicate.hasProperty(cause, \"errno\")) {\n return undefined;\n }\n const errno = cause.errno;\n return typeof errno === \"number\" ? errno : undefined;\n};\nconst matchesSqliteNumericCode = (cause, expected) => {\n const code = sqliteCodeFromCause(cause);\n if (code === expected) {\n return true;\n }\n if (!Predicate.hasProperty(cause, \"errno\")) {\n return false;\n }\n return cause.errno === expected;\n};\nconst matchesSqliteCode = (code, expected) => code === expected || code.startsWith(expected + \"_\");\nconst UNKNOWN_CONSTRAINT = \"unknown\";\nconst SQLITE_CONSTRAINT_UNIQUE = \"SQLITE_CONSTRAINT_UNIQUE\";\nconst SQLITE_CONSTRAINT_UNIQUE_CODE = 2067;\nconst normalizeConstraintIdentifier = identifier => {\n if (typeof identifier !== \"string\") {\n return UNKNOWN_CONSTRAINT;\n }\n const trimmed = identifier.trim();\n return trimmed.length === 0 ? UNKNOWN_CONSTRAINT : trimmed;\n};\nconst sqliteUniqueConstraintFromCause = cause => {\n if (Predicate.hasProperty(cause, \"constraint\")) {\n return normalizeConstraintIdentifier(cause.constraint);\n }\n if (!Predicate.hasProperty(cause, \"message\")) {\n return UNKNOWN_CONSTRAINT;\n }\n const message = cause.message;\n if (typeof message !== \"string\") {\n return UNKNOWN_CONSTRAINT;\n }\n const prefix = \"UNIQUE constraint failed:\";\n const index = message.indexOf(prefix);\n return index === -1 ? UNKNOWN_CONSTRAINT : normalizeConstraintIdentifier(message.slice(index + prefix.length));\n};\n/**\n * Classifies a native SQLite error cause into a `SqlErrorReason` using its\n * `code` or `errno`, with optional message and operation metadata.\n *\n * @category converting\n * @since 4.0.0\n */\nexport const classifySqliteError = (cause, {\n message,\n operation\n} = {}) => {\n const props = {\n cause,\n message,\n operation\n };\n const code = sqliteCodeFromCause(cause);\n const numericCode = sqliteNumericCodeFromCause(cause);\n if (code === SQLITE_CONSTRAINT_UNIQUE || matchesSqliteNumericCode(cause, SQLITE_CONSTRAINT_UNIQUE_CODE)) {\n return new UniqueViolation({\n ...props,\n constraint: sqliteUniqueConstraintFromCause(cause)\n });\n }\n if (typeof code === \"string\") {\n if (matchesSqliteCode(code, \"SQLITE_AUTH\")) {\n return new AuthenticationError(props);\n }\n if (matchesSqliteCode(code, \"SQLITE_PERM\")) {\n return new AuthorizationError(props);\n }\n if (matchesSqliteCode(code, \"SQLITE_CONSTRAINT\")) {\n return new ConstraintError(props);\n }\n if (matchesSqliteCode(code, \"SQLITE_BUSY\") || matchesSqliteCode(code, \"SQLITE_LOCKED\")) {\n return new LockTimeoutError(props);\n }\n if (matchesSqliteCode(code, \"SQLITE_CANTOPEN\")) {\n return new ConnectionError(props);\n }\n }\n if (typeof numericCode === \"number\") {\n const code = numericCode & 0xff;\n switch (code) {\n case 23:\n return new AuthenticationError(props);\n case 3:\n return new AuthorizationError(props);\n case 19:\n return new ConstraintError(props);\n case 5:\n case 6:\n return new LockTimeoutError(props);\n case 14:\n return new ConnectionError(props);\n default:\n return new UnknownError(props);\n }\n }\n return new UnknownError(props);\n};\n/**\n * Error raised when an ordered batched SQL resolver receives a different number\n * of result rows than requests.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class ResultLengthMismatch extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/ResultLengthMismatch\")(\"ResultLengthMismatch\", {\n expected: Schema.Natural,\n actual: Schema.Natural\n}) {\n /**\n * Explains the mismatch between expected and actual batched SQL result counts.\n *\n * @since 4.0.0\n */\n get message() {\n return `Expected ${this.expected} results but got ${this.actual}`;\n }\n}\n//# sourceMappingURL=SqlError.js.map","/**\n * Schema-aware `RequestResolver` helpers for SQL-backed data loading.\n *\n * This module represents each lookup or mutation as a `SqlRequest` and batches\n * concurrent requests into SQL operations. Request payloads are encoded with the\n * request schema before `execute` is called, and returned rows are decoded with\n * the result schema before requests are completed. It provides ordered,\n * grouped, id-based, and side-effect-only resolver constructors, and keeps\n * batches separated by the active SQL transaction connection.\n *\n * @since 4.0.0\n */\nimport * as Arr from \"../../Array.js\";\nimport * as Cause from \"../../Cause.js\";\nimport * as Context from \"../../Context.js\";\nimport * as Effect from \"../../Effect.js\";\nimport * as Equal from \"../../Equal.js\";\nimport * as Exit from \"../../Exit.js\";\nimport * as Hash from \"../../Hash.js\";\nimport * as MutableHashMap from \"../../MutableHashMap.js\";\nimport * as Option from \"../../Option.js\";\nimport * as Request from \"../../Request.js\";\nimport * as RequestResolver from \"../../RequestResolver.js\";\nimport * as Schema from \"../../Schema.js\";\nimport * as SqlClient from \"./SqlClient.js\";\nimport { ResultLengthMismatch } from \"./SqlError.js\";\nconst SqlRequestProto = {\n ...Request.Class.prototype,\n [Equal.symbol](that) {\n return Equal.equals(this.payload, that.payload);\n },\n [Hash.symbol]() {\n return Hash.hash(this.payload);\n }\n};\n/**\n * Runs a payload as a `SqlRequest` through a request resolver, either directly\n * with a payload and resolver or curried by resolver.\n *\n * @category running\n * @since 4.0.0\n */\nexport const request = function () {\n if (arguments.length === 1) {\n const resolver = arguments[0];\n return payload => Effect.request(SqlRequest(payload), resolver);\n }\n return Effect.request(SqlRequest(arguments[0]), arguments[1]);\n};\n/**\n * Constructs a `SqlRequest` from a payload. Equality and hashing are based on\n * the payload so equal requests can be batched and deduplicated.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const SqlRequest = payload => {\n const self = Object.create(SqlRequestProto);\n self.payload = payload;\n return self;\n};\n/**\n * Creates a resolver for a SQL query with a request schema and a result schema.\n *\n * **Details**\n *\n * The request schema is used to validate the input of the query, and the result\n * schema is used to validate the output of the query. Results are mapped to the\n * requests in order, so the length of the results must match the length of the\n * requests.\n *\n * @category resolvers\n * @since 4.0.0\n */\nexport const ordered = options => {\n const decodeArray = Schema.decodeUnknownEffect(Schema.Array(options.Result));\n return RequestResolver.makeGrouped({\n key: transactionKey,\n resolver: Effect.fnUntraced(function* (entries) {\n const [inputs, encodedEntries] = yield* partitionRequests(entries, options.Request);\n if (!Arr.isArrayNonEmpty(inputs)) return;\n const results = yield* options.execute(inputs).pipe(Effect.provideContext(entries[0].context));\n if (results.length !== inputs.length) {\n return yield* new ResultLengthMismatch({\n expected: inputs.length,\n actual: results.length\n });\n }\n const decodedResults = yield* decodeArray(results).pipe(Effect.provideContext(entries[0].context));\n for (let i = 0; i < encodedEntries.length; i++) {\n encodedEntries[i].completeUnsafe(Exit.succeed(decodedResults[i]));\n }\n })\n });\n};\n/**\n * Creates a batched SQL request resolver that encodes requests, decodes result\n * rows, groups decoded results by matching request and result keys, and fails a\n * request with `NoSuchElementError` when no result group exists.\n *\n * @category resolvers\n * @since 4.0.0\n */\nexport const grouped = options => {\n const decodeResults = Schema.decodeUnknownEffect(Schema.Array(options.Result));\n return RequestResolver.makeGrouped({\n key: transactionKey,\n resolver: Effect.fnUntraced(function* (entries) {\n const [inputs] = yield* partitionRequests(entries, options.Request);\n if (!Arr.isArrayNonEmpty(inputs)) return;\n const resultMap = MutableHashMap.empty();\n const results = yield* options.execute(inputs).pipe(Effect.provideContext(entries[0].context));\n const decodedResults = yield* decodeResults(results).pipe(Effect.provideContext(entries[0].context));\n for (let i = 0, len = decodedResults.length; i < len; i++) {\n const result = decodedResults[i];\n const key = options.ResultGroupKey(result, results[i]);\n const group = MutableHashMap.get(resultMap, key);\n if (group._tag === \"None\") {\n MutableHashMap.set(resultMap, key, [result]);\n } else {\n group.value.push(result);\n }\n }\n for (let i = 0, len = entries.length; i < len; i++) {\n const entry = entries[i];\n const key = options.RequestGroupKey(entry.request.payload);\n const result = MutableHashMap.get(resultMap, key);\n entry.completeUnsafe(result._tag === \"None\" ? constNoSuchElement : Exit.succeed(result.value));\n }\n })\n });\n};\n/**\n * Creates a batched resolver that fetches rows for encoded ids, decodes\n * results, completes each matching request using `ResultId`, and fails missing\n * ids with `NoSuchElementError`.\n *\n * @category resolvers\n * @since 4.0.0\n */\nexport const findById = options => {\n const decodeResults = Schema.decodeUnknownEffect(Schema.Array(options.Result));\n return RequestResolver.makeGrouped({\n key: transactionKey,\n resolver: Effect.fnUntraced(function* (entries) {\n const [inputs, idMap] = yield* partitionRequestsById(entries, options.Id);\n if (!Arr.isArrayNonEmpty(inputs)) return;\n const results = yield* options.execute(inputs).pipe(Effect.provideContext(entries[0].context));\n const decodedResults = yield* decodeResults(results).pipe(Effect.provideContext(entries[0].context));\n for (let i = 0; i < decodedResults.length; i++) {\n const result = decodedResults[i];\n const id = options.ResultId(result, results[i]);\n const request = MutableHashMap.get(idMap, id);\n if (request._tag === \"None\") {\n continue;\n }\n MutableHashMap.remove(idMap, id);\n request.value.completeUnsafe(Exit.succeed(result));\n }\n if (MutableHashMap.isEmpty(idMap)) {\n return;\n }\n MutableHashMap.forEach(idMap, request => {\n request.completeUnsafe(constNoSuchElement);\n });\n })\n });\n};\nconst void_ = options => RequestResolver.makeGrouped({\n key: transactionKey,\n resolver: Effect.fnUntraced(function* (entries) {\n const [inputs] = yield* partitionRequests(entries, options.Request);\n if (!Arr.isArrayNonEmpty(inputs)) return;\n yield* options.execute(inputs).pipe(Effect.provideContext(entries[0].context));\n for (let i = 0; i < entries.length; i++) {\n entries[i].completeUnsafe(Exit.void);\n }\n })\n});\nexport {\n/**\n * Create a resolver that performs side effects.\n *\n * @category resolvers\n * @since 4.0.0\n */\nvoid_ as void };\nconst constNoSuchElement = /*#__PURE__*/Exit.fail(/*#__PURE__*/new Cause.NoSuchElementError());\nconst partitionRequests = function* (requests, schema) {\n const len = requests.length;\n const inputs = Arr.empty();\n const encodedEntries = Arr.empty();\n let entry;\n const encode = Schema.encodeEffect(schema);\n const handle = Effect.matchCauseEager({\n onFailure(cause) {\n entry.completeUnsafe(Exit.failCause(cause));\n },\n onSuccess(value) {\n inputs.push(value);\n encodedEntries.push(entry);\n }\n });\n for (let i = 0; i < len; i++) {\n entry = requests[i];\n yield Effect.provideContext(handle(encode(entry.request.payload)), entry.context);\n }\n return [inputs, encodedEntries];\n};\nconst partitionRequestsById = function* (requests, schema) {\n const len = requests.length;\n const inputs = Arr.empty();\n const byIdMap = MutableHashMap.empty();\n for (let i = 0; i < len; i++) {\n const entry = requests[i];\n const existing = MutableHashMap.get(byIdMap, entry.request.payload);\n if (Option.isSome(existing)) {\n const previous = existing.value;\n MutableHashMap.set(byIdMap, entry.request.payload, {\n ...previous,\n completeUnsafe(exit) {\n previous.completeUnsafe(exit);\n entry.completeUnsafe(exit);\n }\n });\n } else {\n MutableHashMap.set(byIdMap, entry.request.payload, entry);\n }\n }\n const encode = Schema.encodeEffect(schema);\n for (const [, entry] of byIdMap) {\n yield* Effect.provideContext(Effect.matchCauseEager(encode(entry.request.payload), {\n onFailure(cause) {\n entry.completeUnsafe(Exit.failCause(cause));\n },\n onSuccess(value) {\n inputs.push(value);\n }\n }), entry.context);\n }\n return [inputs, byIdMap];\n};\nfunction transactionKey(entry) {\n const client = Context.getOrUndefined(entry.context, SqlClient.SqlClient);\n if (!client) return undefined;\n const conn = Context.getOrUndefined(entry.context, client.transactionService);\n if (!conn) return undefined;\n return Equal.byReferenceUnsafe(conn);\n}\n//# sourceMappingURL=SqlResolver.js.map","/**\n * Wraps SQL execution callbacks with request encoding and result decoding.\n *\n * `SqlSchema` is a small adapter between Effect Schema and SQL statements. Each\n * helper builds a function that accepts the decoded request type used by\n * application code, encodes it before calling `execute`, and decodes unknown\n * driver rows into the result schema. The helpers cover returning all rows, a\n * non-empty row list, the first row, an optional first row, or discarding the\n * SQL result for side-effect-only statements.\n *\n * @since 4.0.0\n */\nimport * as Arr from \"../../Array.js\";\nimport * as Cause from \"../../Cause.js\";\nimport * as Effect from \"../../Effect.js\";\nimport * as Schema from \"../../Schema.js\";\n/**\n * Builds a query function that encodes the request and decodes all result rows,\n * allowing an empty result set.\n *\n * **When to use**\n *\n * Use when you need to run a query that may return zero or more rows and\n * represent an empty result as an empty array.\n *\n * @see {@link findNonEmpty} for queries where an empty result is a failure\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const findAll = options => {\n const encodeRequest = Schema.encodeEffect(options.Request);\n const decode = Schema.decodeUnknownEffect(Schema.mutable(Schema.Array(options.Result)));\n return request => Effect.flatMap(Effect.flatMap(encodeRequest(request), options.execute), decode);\n};\n/**\n * Builds a query function that encodes the request, decodes all result rows,\n * and fails with `NoSuchElementError` when the result set is empty.\n *\n * **When to use**\n *\n * Use when you need to run a query that must return at least one row and treat\n * an empty result as a failure.\n *\n * @see {@link findAll} for queries where an empty result should return an empty array\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const findNonEmpty = options => {\n const find = findAll(options);\n return request => Effect.flatMap(find(request), results => Arr.isArrayNonEmpty(results) ? Effect.succeed(results) : Effect.fail(new Cause.NoSuchElementError()));\n};\nconst void_ = options => {\n const encode = Schema.encodeEffect(options.Request);\n return request => Effect.asVoid(Effect.flatMap(encode(request), options.execute));\n};\nexport {\n/**\n * Runs a sql query with a request schema and discard the result.\n *\n * @category constructors\n * @since 4.0.0\n */\nvoid_ as void };\n/**\n * Builds a query function that encodes the request, decodes the first result\n * row, and fails with `NoSuchElementError` when no rows are returned.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const findOne = options => {\n const encodeRequest = Schema.encodeEffect(options.Request);\n const decode = Schema.decodeUnknownEffect(options.Result);\n return request => Effect.flatMap(Effect.flatMap(encodeRequest(request), options.execute), arr => Arr.isReadonlyArrayNonEmpty(arr) ? decode(arr[0]) : Effect.fail(new Cause.NoSuchElementError()));\n};\n/**\n * Builds a query function that encodes the request, decodes the first result row\n * as `Option.some`, and returns `Option.none` when no rows are returned.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const findOneOption = options => {\n const encodeRequest = Schema.encodeEffect(options.Request);\n const decode = Schema.decodeUnknownEffect(options.Result);\n return request => Effect.flatMap(Effect.flatMap(encodeRequest(request), options.execute), arr => Arr.isReadonlyArrayNonEmpty(arr) ? Effect.asSome(decode(arr[0])) : Effect.succeedNone);\n};\n//# sourceMappingURL=SqlSchema.js.map","import * as Effect from \"../../Effect.js\";\nimport * as RequestResolver from \"../../RequestResolver.js\";\nimport { SqlClient } from \"./SqlClient.js\";\nimport * as SqlResolver from \"./SqlResolver.js\";\nimport * as SqlSchema from \"./SqlSchema.js\";\n/**\n * Creates a CRUD repository for a schema model backed by a SQL table, with\n * insert, update, find-by-id, and delete operations. When `softDeleteColumn` is\n * supplied, reads ignore soft-deleted rows and delete updates that column\n * instead of removing the row.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const makeRepository = (Model, options) => Effect.gen(function* () {\n const sql = yield* SqlClient;\n const idSchema = Model.fields[options.idColumn];\n const idColumn = options.idColumn;\n const softDeleteColumn = options.softDeleteColumn;\n const withSoftDeleteFilter = where => softDeleteColumn === undefined ? where : sql.and([where, sql`${sql(softDeleteColumn)} is null`]);\n const setSoftDeleted = softDeleteColumn === undefined ? undefined : sql`${sql(softDeleteColumn)} = CURRENT_TIMESTAMP`;\n const insertSchema = SqlSchema.findOne({\n Request: Model.insert,\n Result: Model,\n execute: request => sql.onDialectOrElse({\n mysql: () => sql`insert into ${sql(options.tableName)} ${sql.insert(request)};\nselect * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = LAST_INSERT_ID()`)};`.unprepared.pipe(Effect.map(([, results]) => results)),\n orElse: () => sql`insert into ${sql(options.tableName)} ${sql.insert(request).returning(\"*\")}`\n })\n });\n const insert = insert => insertSchema(insert).pipe(Effect.catchTag(\"NoSuchElementError\", Effect.die), Effect.withSpan(`${options.spanPrefix}.insert`, {}, {\n captureStackTrace: false\n }));\n const insertVoidSchema = SqlSchema.void({\n Request: Model.insert,\n execute: request => sql`insert into ${sql(options.tableName)} ${sql.insert(request)}`\n });\n const insertVoid = insert => insertVoidSchema(insert).pipe(Effect.withSpan(`${options.spanPrefix}.insertVoid`, {}, {\n captureStackTrace: false\n }));\n const updateSchema = SqlSchema.findOne({\n Request: Model.update,\n Result: Model,\n execute: request => sql.onDialectOrElse({\n mysql: () => sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${request[idColumn]}`)};\nselect * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${request[idColumn]}`)};`.unprepared.pipe(Effect.map(([, results]) => results)),\n orElse: () => sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${request[idColumn]}`)} returning *`\n })\n });\n const update = update => updateSchema(update).pipe(Effect.catchTag(\"NoSuchElementError\", Effect.die), Effect.withSpan(`${options.spanPrefix}.update`, {\n attributes: {\n id: update[idColumn]\n }\n }, {\n captureStackTrace: false\n }));\n const updateVoidSchema = SqlSchema.void({\n Request: Model.update,\n execute: request => sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${request[idColumn]}`)}`\n });\n const updateVoid = update => updateVoidSchema(update).pipe(Effect.withSpan(`${options.spanPrefix}.updateVoid`, {\n attributes: {\n id: update[idColumn]\n }\n }, {\n captureStackTrace: false\n }));\n const findByIdSchema = SqlSchema.findOne({\n Request: idSchema,\n Result: Model,\n execute: id => sql`select * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${id}`)}`\n });\n const findById = id => findByIdSchema(id).pipe(Effect.withSpan(`${options.spanPrefix}.findById`, {\n attributes: {\n id\n }\n }, {\n captureStackTrace: false\n }));\n const deleteSchema = SqlSchema.void({\n Request: idSchema,\n execute: id => softDeleteColumn === undefined ? sql`delete from ${sql(options.tableName)} where ${sql(idColumn)} = ${id}` : sql`update ${sql(options.tableName)} set ${setSoftDeleted} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${id}`)}`\n });\n const delete_ = id => deleteSchema(id).pipe(Effect.withSpan(`${options.spanPrefix}.delete`, {\n attributes: {\n id\n }\n }, {\n captureStackTrace: false\n }));\n return {\n insert,\n insertVoid,\n update,\n updateVoid,\n findById,\n delete: delete_\n };\n});\n/**\n * Creates batched request resolvers for a schema model's insert, insert-void,\n * find-by-id, and delete operations, honoring the optional soft-delete column.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const makeResolvers = (Model, options) => Effect.gen(function* () {\n const sql = yield* SqlClient;\n const idSchema = Model.fields[options.idColumn];\n const idColumn = options.idColumn;\n const softDeleteColumn = options.softDeleteColumn;\n const withSoftDeleteFilter = where => softDeleteColumn === undefined ? where : sql.and([where, sql`${sql(softDeleteColumn)} is null`]);\n const setSoftDeleted = softDeleteColumn === undefined ? undefined : sql`${sql(softDeleteColumn)} = CURRENT_TIMESTAMP`;\n const insert = SqlResolver.ordered({\n Request: Model.insert,\n Result: Model,\n execute: request => sql.onDialectOrElse({\n mysql: () => Effect.forEach(request, request => sql`insert into ${sql(options.tableName)} ${sql.insert(request)};\nselect * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = LAST_INSERT_ID()`)};`.unprepared.pipe(Effect.map(([, results]) => results[0])), {\n concurrency: 10\n }),\n orElse: () => sql`insert into ${sql(options.tableName)} ${sql.insert(request).returning(\"*\")}`\n })\n }).pipe(RequestResolver.withSpan(`${options.spanPrefix}.insertResolver`));\n const insertVoid = SqlResolver.void({\n Request: Model.insert,\n execute: request => sql`insert into ${sql(options.tableName)} ${sql.insert(request)}`\n }).pipe(RequestResolver.withSpan(`${options.spanPrefix}.insertVoidResolver`));\n const findById = SqlResolver.findById({\n Id: idSchema,\n Result: Model,\n ResultId(request) {\n return request[idColumn];\n },\n execute: ids => sql`select * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql.in(idColumn, ids))}`\n }).pipe(RequestResolver.withSpan(`${options.spanPrefix}.findByIdResolver`));\n const delete_ = SqlResolver.void({\n Request: idSchema,\n execute: ids => softDeleteColumn === undefined ? sql`delete from ${sql(options.tableName)} where ${sql.in(idColumn, ids)}` : sql`update ${sql(options.tableName)} set ${setSoftDeleted} where ${withSoftDeleteFilter(sql.in(idColumn, ids))}`\n }).pipe(RequestResolver.withSpan(`${options.spanPrefix}.deleteResolver`));\n return {\n insert,\n insertVoid,\n findById,\n delete: delete_\n };\n});\n//# sourceMappingURL=SqlModel.js.map","/** @effect-diagnostics schemaNumber:off */\nimport * as Effect from \"effect/Effect\"\nimport * as Layer from \"effect/Layer\"\nimport * as Schema from \"effect/Schema\"\nimport * as SchemaTransformation from \"effect/SchemaTransformation\"\nimport * as Context from \"effect/Context\"\nimport * as Model from \"effect/unstable/schema/Model\"\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\"\nimport * as SqlError from \"effect/unstable/sql/SqlError\"\nimport * as SqlModel from \"effect/unstable/sql/SqlModel\"\nimport * as SqlSchema from \"effect/unstable/sql/SqlSchema\"\nimport type * as Cause from \"effect/Cause\"\nimport type * as Option from \"effect/Option\"\nimport * as EmbeddingModel from \"effect/unstable/ai/EmbeddingModel\"\nimport * as SqlResolver from \"effect/unstable/sql/SqlResolver\"\nimport * as RequestResolver from \"effect/RequestResolver\"\n\n/**\n * @since 1.0.0\n * @category Models\n */\nexport const ChunkId = Schema.Number.pipe(Schema.brand(\"ChunkRepo/ChunkId\"))\n/**\n * @since 1.0.0\n * @category Models\n */\nexport type ChunkId = typeof ChunkId.Type\n\n/**\n * @since 1.0.0\n * @category Models\n */\nexport const SyncId = Schema.String.pipe(Schema.brand(\"ChunkRepo/SyncId\"))\n/**\n * @since 1.0.0\n * @category Models\n */\nexport type SyncId = typeof SyncId.Type\n\n/**\n * @since 1.0.0\n * @category Models\n */\nexport const Float32ArraySchema = Schema.instanceOf<\n Float32ArrayConstructor,\n Float32Array\n>(Float32Array)\n\n/**\n * @since 1.0.0\n * @category Models\n */\nexport const Float32ArrayFromArray = Schema.Array(Schema.Number).pipe(\n Schema.decodeTo(\n Float32ArraySchema,\n SchemaTransformation.transform({\n decode: (arr) => new Float32Array(arr),\n encode: (array) => Array.from(array),\n }),\n ),\n)\n\n/**\n * @since 1.0.0\n * @category Models\n */\nexport const Float32ArrayField = Model.Field({\n insert: Float32ArraySchema,\n update: Float32ArraySchema,\n jsonCreate: Float32ArrayFromArray,\n jsonUpdate: Float32ArrayFromArray,\n})\n\n/**\n * @since 1.0.0\n * @category Models\n */\nexport class Chunk extends Model.Class<Chunk>(\"Chunk\")({\n id: ChunkId.pipe(Model.FieldExcept([\"insert\", \"jsonCreate\"])),\n path: Schema.String,\n content: Schema.String,\n hash: Schema.String,\n vector: Float32ArrayField,\n syncId: SyncId,\n}) {}\n\n/**\n * @since 1.0.0\n * @category Services\n */\nexport class ChunkRepo extends Context.Service<\n ChunkRepo,\n {\n insert(\n chunk: typeof Chunk.insert.Type,\n ): Effect.Effect<Chunk, ChunkRepoError>\n\n findById(\n id: ChunkId,\n ): Effect.Effect<Chunk, ChunkRepoError | Cause.NoSuchElementError>\n\n exists(hash: string): Effect.Effect<Option.Option<ChunkId>, ChunkRepoError>\n\n search(options: {\n readonly vector: Float32Array\n readonly limit: number\n }): Effect.Effect<Array<Chunk>, ChunkRepoError>\n\n quantize: Effect.Effect<void, ChunkRepoError>\n\n setSyncId(\n chunkId: ChunkId,\n syncId: SyncId,\n ): Effect.Effect<void, ChunkRepoError>\n deleteByPath(path: string): Effect.Effect<void, ChunkRepoError>\n deleteForSyncId(syncId: SyncId): Effect.Effect<void, ChunkRepoError>\n }\n>()(\"clanka/ChunkRepo\") {}\n\n/**\n * @since 1.0.0\n * @category Errors\n */\nexport class ChunkRepoError extends Schema.TaggedError<ChunkRepoError>()(\n \"ChunkRepoError\",\n {\n reason: Schema.Union([SqlError.SqlError]),\n },\n) {\n readonly cause = this.reason\n readonly message = this.reason.message\n}\n\n/**\n * @since 1.0.0\n * @category Layers\n */\nexport const layer = Layer.effect(\n ChunkRepo,\n Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient\n const dimensions = yield* EmbeddingModel.Dimensions\n\n yield* Effect.gen(function* () {\n yield* sql`CREATE VIRTUAL TABLE IF NOT EXISTS chunk_vectors USING vec0(\n vector float[${sql.literal(String(dimensions))}]\n )`\n yield* sql`CREATE TRIGGER IF NOT EXISTS chunks_vector_insert\n AFTER INSERT ON chunks\n BEGIN\n INSERT INTO chunk_vectors(rowid, vector) VALUES (new.id, new.vector);\n END`\n yield* sql`CREATE TRIGGER IF NOT EXISTS chunks_vector_update\n AFTER UPDATE OF vector ON chunks\n BEGIN\n DELETE FROM chunk_vectors WHERE rowid = old.id;\n INSERT INTO chunk_vectors(rowid, vector) VALUES (new.id, new.vector);\n END`\n yield* sql`CREATE TRIGGER IF NOT EXISTS chunks_vector_delete\n AFTER DELETE ON chunks\n BEGIN\n DELETE FROM chunk_vectors WHERE rowid = old.id;\n END`\n yield* sql`DELETE FROM chunk_vectors\n WHERE rowid NOT IN (SELECT id FROM chunks)`\n yield* sql`INSERT INTO chunk_vectors(rowid, vector)\n SELECT id, vector FROM chunks\n WHERE id NOT IN (SELECT rowid FROM chunk_vectors)`\n }).pipe(sql.withTransaction)\n\n const loaders = yield* SqlModel.makeResolvers(Chunk, {\n tableName: \"chunks\",\n idColumn: \"id\",\n spanPrefix: \"ChunkRepo\",\n })\n\n const search = SqlSchema.findAll({\n Request: Schema.Struct({\n vector: Float32ArraySchema,\n limit: Schema.Number,\n }),\n Result: Chunk,\n execute: ({ vector, limit }) =>\n sql`\n select chunks.id, chunks.path, chunks.content, chunks.hash, chunks.syncId\n from chunk_vectors\n JOIN chunks ON chunks.id = chunk_vectors.rowid\n WHERE chunk_vectors.vector MATCH ${vector}\n AND k = CAST(${limit} AS INTEGER)\n ORDER BY chunk_vectors.distance\n `,\n })\n\n const exists = SqlResolver.findById({\n Id: Schema.String, // hash\n Result: Schema.Struct({\n id: ChunkId,\n hash: Schema.String,\n }),\n ResultId(result) {\n return result.hash\n },\n execute: (hashes) =>\n sql`select id, hash from chunks where ${sql.in(\"hash\", hashes)}`,\n }).pipe(RequestResolver.setDelay(5))\n\n const insertResolver = loaders.insert.pipe(RequestResolver.setDelay(5))\n const findByIdResolver = loaders.findById.pipe(RequestResolver.setDelay(5))\n\n return ChunkRepo.of({\n insert: (insert) =>\n SqlResolver.request(insert, insertResolver).pipe(\n Effect.catchTags(\n {\n SchemaError: Effect.die,\n ResultLengthMismatch: Effect.die,\n },\n (reason) => Effect.fail(new ChunkRepoError({ reason })),\n ),\n ),\n findById: (id) =>\n SqlResolver.request(id, findByIdResolver).pipe(\n Effect.catchTags({\n SchemaError: Effect.die,\n SqlError: (reason) => Effect.fail(new ChunkRepoError({ reason })),\n }),\n ),\n exists: (hash) =>\n SqlResolver.request(hash, exists).pipe(\n Effect.map((result) => result.id),\n Effect.catchNoSuchElement,\n Effect.catchTags({\n SqlError: (reason) => Effect.fail(new ChunkRepoError({ reason })),\n SchemaError: Effect.die,\n }),\n ),\n search: Effect.fn(\"ChunkRepo.search\")(function* (options) {\n return yield* search(options as any).pipe(\n Effect.catchTags({\n SqlError: (reason) => Effect.fail(new ChunkRepoError({ reason })),\n SchemaError: Effect.die,\n }),\n )\n }),\n quantize: Effect.void,\n setSyncId: (chunkId, syncId) =>\n sql`update chunks set syncId = ${syncId} where id = ${chunkId}`.pipe(\n Effect.mapError((reason) => new ChunkRepoError({ reason })),\n ),\n deleteByPath: (path) =>\n sql`delete from chunks where path = ${path}`.pipe(\n Effect.mapError((reason) => new ChunkRepoError({ reason })),\n ),\n deleteForSyncId: (syncId) =>\n sql`delete from chunks where syncId != ${syncId}`.pipe(\n Effect.mapError((reason) => new ChunkRepoError({ reason })),\n ),\n })\n }),\n)\n","/**\n * @since 1.0.0\n */\nimport * as Array from \"effect/Array\"\nimport * as Effect from \"effect/Effect\"\nimport * as FileSystem from \"effect/FileSystem\"\nimport { pipe } from \"effect/Function\"\nimport * as Layer from \"effect/Layer\"\nimport * as Path from \"effect/Path\"\nimport * as Context from \"effect/Context\"\nimport * as Stream from \"effect/Stream\"\nimport * as ChildProcess from \"effect/unstable/process/ChildProcess\"\nimport * as ChildProcessSpawner from \"effect/unstable/process/ChildProcessSpawner\"\nimport TreeSitter, { type SyntaxNode } from \"tree-sitter\"\nimport TreeSitterJavaScript from \"tree-sitter-javascript\"\nimport TreeSitterTypeScript from \"tree-sitter-typescript\"\n\n/**\n * @since 1.0.0\n * @category Models\n */\nexport interface CodeChunk {\n readonly path: string\n readonly startLine: number\n readonly endLine: number\n readonly name: string | undefined\n readonly type: ChunkType | undefined\n readonly parent: string | undefined\n readonly content: string\n}\n\n/**\n * @since 1.0.0\n * @category Models\n */\nexport type ChunkType =\n | \"function\"\n | \"method\"\n | \"class\"\n | \"namespace\"\n | \"interface\"\n | \"type-alias\"\n | \"enum\"\n | \"variable\"\n\n/**\n * @since 1.0.0\n * @category Services\n */\nexport class CodeChunker extends Context.Service<\n CodeChunker,\n {\n listFiles(options: {\n readonly root: string\n readonly maxFileSize?: string | undefined\n }): Effect.Effect<ReadonlyArray<string>>\n chunkFile(options: {\n readonly root: string\n readonly path: string\n readonly chunkSize: number\n readonly chunkOverlap: number\n readonly chunkMaxCharacters?: number | undefined\n }): Effect.Effect<ReadonlyArray<CodeChunk>>\n chunkFiles(options: {\n readonly root: string\n readonly paths: ReadonlyArray<string>\n readonly chunkSize: number\n readonly chunkOverlap: number\n readonly chunkMaxCharacters?: number | undefined\n }): Stream.Stream<CodeChunk>\n chunkCodebase(options: {\n readonly root: string\n readonly maxFileSize?: string | undefined\n readonly chunkSize: number\n readonly chunkOverlap: number\n readonly chunkMaxCharacters?: number | undefined\n }): Stream.Stream<CodeChunk>\n }\n>()(\"clanka/CodeChunker\") {}\n\nconst sourceExtensions = new Set([\n \"c\",\n \"cc\",\n \"cpp\",\n \"cs\",\n \"css\",\n \"cts\",\n \"cxx\",\n \"go\",\n \"gql\",\n \"graphql\",\n \"h\",\n \"hpp\",\n \"html\",\n \"ini\",\n \"java\",\n \"js\",\n \"jsx\",\n \"kt\",\n \"kts\",\n \"less\",\n \"lua\",\n \"mjs\",\n \"mts\",\n \"php\",\n \"py\",\n \"rb\",\n \"rs\",\n \"sass\",\n \"scala\",\n \"scss\",\n \"sh\",\n \"sql\",\n \"svelte\",\n \"swift\",\n \"ts\",\n \"tsx\",\n \"vue\",\n \"xml\",\n \"zsh\",\n])\n\nconst documentationExtensions = new Set([\n \"adoc\",\n \"asciidoc\",\n \"md\",\n \"mdx\",\n \"rst\",\n \"txt\",\n])\n\nconst ignoredDirectories = new Set([\n \".git\",\n \".next\",\n \".nuxt\",\n \".svelte-kit\",\n \".turbo\",\n \"build\",\n \"coverage\",\n \"dist\",\n \"node_modules\",\n \"target\",\n])\n\nconst normalizePath = (path: string): string => path.replace(/\\\\/g, \"/\")\n\nconst normalizeText = (content: string): string =>\n content.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\")\n\nconst meaningfulLinePattern = /[^\\s\\p{P}]/u\n\nconst isMeaningfulLine = (line: string): boolean =>\n meaningfulLinePattern.test(line)\n\ninterface LineRange {\n readonly startLine: number\n readonly endLine: number\n}\n\ninterface ChunkSettings {\n readonly chunkSize: number\n readonly chunkOverlap: number\n readonly chunkMaxCharacters: number\n}\n\ninterface ChunkRange extends LineRange {\n readonly name: string | undefined\n readonly type: ChunkType | undefined\n readonly parent: string | undefined\n}\n\nconst languageByExtension = new Map<string, unknown>([\n [\"js\", TreeSitterJavaScript],\n [\"jsx\", TreeSitterJavaScript],\n [\"ts\", TreeSitterTypeScript.typescript],\n [\"tsx\", TreeSitterTypeScript.tsx],\n])\n\n// const ignoredTopLevelNodeTypes = new Set([\"comment\", \"import_statement\"])\n\n/**\n * @since 1.0.0\n * @category Predicates\n */\nexport const isProbablyMinified = (content: string): boolean => {\n const normalized = normalizeText(content)\n if (normalized.length < 2_000) {\n return false\n }\n\n const lines = normalized.split(\"\\n\")\n if (lines.length <= 2) {\n return true\n }\n\n let longLines = 0\n for (const line of lines) {\n if (line.length >= 300) {\n longLines++\n }\n }\n\n return lines.length <= 20 && longLines / lines.length >= 0.8\n}\n\n/**\n * @since 1.0.0\n * @category Predicates\n */\nexport const isMeaningfulFile = (path: string): boolean => {\n const normalizedPath = normalizePath(path)\n const lowercasePath = normalizedPath.toLowerCase()\n const parts = lowercasePath.split(\"/\")\n const fileName = parts.at(-1)\n if (fileName === undefined || fileName.length === 0) {\n return false\n }\n\n if (parts.some((part) => ignoredDirectories.has(part))) {\n return false\n }\n\n if (/\\.min\\.(?:css|js)$/i.test(fileName)) {\n return false\n }\n\n const extensionIndex = fileName.lastIndexOf(\".\")\n if (extensionIndex === -1) {\n return false\n }\n\n const extension = fileName.slice(extensionIndex + 1)\n return (\n sourceExtensions.has(extension) || documentationExtensions.has(extension)\n )\n}\n\nconst resolveChunkSettings = (options: {\n readonly chunkSize: number\n readonly chunkOverlap: number\n readonly chunkMaxCharacters?: number | undefined\n}): ChunkSettings => {\n const chunkSize = Math.max(1, options.chunkSize)\n const chunkOverlap = Math.max(\n 0,\n Math.min(chunkSize - 1, options.chunkOverlap),\n )\n const chunkMaxCharacters =\n options.chunkMaxCharacters !== undefined &&\n Number.isFinite(options.chunkMaxCharacters)\n ? Math.max(1, Math.floor(options.chunkMaxCharacters))\n : Number.POSITIVE_INFINITY\n\n return {\n chunkSize,\n chunkOverlap,\n chunkMaxCharacters,\n }\n}\n\nconst getPathExtension = (path: string): string | undefined => {\n const fileName = path.split(\"/\").at(-1)\n if (fileName === undefined) {\n return undefined\n }\n\n const extensionIndex = fileName.lastIndexOf(\".\")\n if (extensionIndex === -1) {\n return undefined\n }\n\n return fileName.slice(extensionIndex + 1).toLowerCase()\n}\n\nconst resolveAstLanguage = (path: string): unknown => {\n const extension = getPathExtension(path)\n if (extension === undefined) {\n return undefined\n }\n\n return languageByExtension.get(extension)\n}\n\nconst lineRangeFromNode = (node: SyntaxNode): LineRange => {\n const startLine = node.startPosition.row + 1\n const endLine = Math.max(startLine, node.endPosition.row + 1)\n return {\n startLine,\n endLine,\n }\n}\n\nconst hasOnlyWhitespaceLines = (\n lines: ReadonlyArray<string>,\n startLine: number,\n endLine: number,\n): boolean => {\n if (startLine > endLine) {\n return true\n }\n\n for (let lineIndex = startLine; lineIndex <= endLine; lineIndex++) {\n if ((lines[lineIndex - 1] ?? \"\").trim().length > 0) {\n return false\n }\n }\n\n return true\n}\n\nconst lineRangeWithLeadingComments = (\n node: SyntaxNode,\n siblings: ReadonlyArray<SyntaxNode>,\n nodeIndex: number,\n lines: ReadonlyArray<string>,\n): LineRange => {\n const baseRange = lineRangeFromNode(node)\n let startLine = baseRange.startLine\n\n for (let index = nodeIndex - 1; index >= 0; index--) {\n const sibling = siblings[index]!\n if (sibling.type !== \"comment\") {\n break\n }\n\n const commentRange = lineRangeFromNode(sibling)\n if (\n !hasOnlyWhitespaceLines(lines, commentRange.endLine + 1, startLine - 1)\n ) {\n break\n }\n\n startLine = commentRange.startLine\n }\n\n return {\n startLine,\n endLine: baseRange.endLine,\n }\n}\n\nconst normalizeLineRange = (\n range: LineRange,\n lineCount: number,\n): LineRange | undefined => {\n const startLine = Math.max(1, Math.min(lineCount, range.startLine))\n const endLine = Math.max(1, Math.min(lineCount, range.endLine))\n\n if (endLine < startLine) {\n return undefined\n }\n\n return {\n startLine,\n endLine,\n }\n}\n\nconst lineLengthPrefixSums = (\n lines: ReadonlyArray<string>,\n): ReadonlyArray<number> => {\n const sums = [0] as Array<number>\n\n for (let index = 0; index < lines.length; index++) {\n sums.push(sums[index]! + lines[index]!.length)\n }\n\n return sums\n}\n\nconst lineRangeCharacterLength = (\n prefixSums: ReadonlyArray<number>,\n range: LineRange,\n): number =>\n prefixSums[range.endLine]! -\n prefixSums[range.startLine - 1]! +\n (range.endLine - range.startLine)\n\nconst resolveSegmentEndLine = (options: {\n readonly startLine: number\n readonly maxEndLine: number\n readonly settings: ChunkSettings\n readonly prefixSums: ReadonlyArray<number>\n}): number => {\n if (options.settings.chunkMaxCharacters === Number.POSITIVE_INFINITY) {\n return options.maxEndLine\n }\n\n let endLine = options.maxEndLine\n while (\n endLine > options.startLine &&\n lineRangeCharacterLength(options.prefixSums, {\n startLine: options.startLine,\n endLine,\n }) > options.settings.chunkMaxCharacters\n ) {\n endLine--\n }\n\n return endLine\n}\n\nconst splitRange = (\n range: LineRange,\n settings: ChunkSettings,\n prefixSums: ReadonlyArray<number>,\n): ReadonlyArray<LineRange> => {\n const lineCount = range.endLine - range.startLine + 1\n if (\n lineCount <= settings.chunkSize &&\n lineRangeCharacterLength(prefixSums, range) <= settings.chunkMaxCharacters\n ) {\n return [range]\n }\n const out = [] as Array<LineRange>\n\n for (let startLine = range.startLine; startLine <= range.endLine;) {\n const maxEndLine = Math.min(\n range.endLine,\n startLine + settings.chunkSize - 1,\n )\n const endLine = resolveSegmentEndLine({\n startLine,\n maxEndLine,\n settings,\n prefixSums,\n })\n\n out.push({\n startLine,\n endLine,\n })\n\n if (endLine >= range.endLine) {\n break\n }\n\n startLine = Math.max(startLine + 1, endLine - settings.chunkOverlap + 1)\n }\n\n return out\n}\n\nconst nodeText = (node: SyntaxNode | null): string | undefined => {\n if (node === null) {\n return undefined\n }\n\n const value = node.text.trim().replace(/\\s+/g, \" \")\n return value.length === 0 ? undefined : value\n}\n\nconst nodeFieldText = (\n node: SyntaxNode,\n fieldName: string,\n): string | undefined => nodeText(node.childForFieldName(fieldName))\n\nconst isNamespaceNode = (node: SyntaxNode): boolean =>\n node.type === \"internal_module\" || node.type === \"module\"\n\nconst unwrapDeclarationNode = (node: SyntaxNode): SyntaxNode => {\n let current = node\n\n while (true) {\n if (current.type === \"export_statement\") {\n const declaration =\n current.childForFieldName(\"declaration\") ?? current.namedChildren[0]\n if (declaration === undefined) {\n return current\n }\n current = declaration\n continue\n }\n\n if (current.type === \"ambient_declaration\") {\n const declaration = current.namedChildren.find(\n (child) =>\n child.type.endsWith(\"_declaration\") || isNamespaceNode(child),\n )\n if (declaration === undefined) {\n return current\n }\n current = declaration\n continue\n }\n\n return current\n }\n}\n\nconst variableDeclarators = (node: SyntaxNode): ReadonlyArray<SyntaxNode> =>\n node.namedChildren.filter((child) => child.type === \"variable_declarator\")\n\nconst variableTypeFromDeclarator = (node: SyntaxNode): ChunkType => {\n const value = node.childForFieldName(\"value\")\n if (value !== null && value.type.includes(\"function\")) {\n return \"function\"\n }\n return \"variable\"\n}\n\nconst variableTypeFromDeclaration = (node: SyntaxNode): ChunkType => {\n const declarators = variableDeclarators(node)\n if (\n declarators.some(\n (declarator) => variableTypeFromDeclarator(declarator) === \"function\",\n )\n ) {\n return \"function\"\n }\n return \"variable\"\n}\n\nconst chunkTypeFromNode = (node: SyntaxNode): ChunkType | undefined => {\n switch (node.type) {\n case \"class_declaration\":\n return \"class\"\n case \"enum_declaration\":\n return \"enum\"\n case \"function_declaration\":\n case \"generator_function_declaration\":\n return \"function\"\n case \"internal_module\":\n case \"module\":\n return \"namespace\"\n case \"interface_declaration\":\n return \"interface\"\n case \"generator_method_definition\":\n case \"method_definition\":\n return \"method\"\n case \"type_alias_declaration\":\n return \"type-alias\"\n case \"lexical_declaration\":\n case \"variable_declaration\":\n return variableTypeFromDeclaration(node)\n case \"variable_declarator\":\n return variableTypeFromDeclarator(node)\n default:\n return undefined\n }\n}\n\nconst variableNamesFromDeclaration = (node: SyntaxNode): string | undefined => {\n const names = variableDeclarators(node)\n .map((declarator) => nodeFieldText(declarator, \"name\"))\n .filter((name): name is string => name !== undefined)\n\n if (names.length === 0) {\n return undefined\n }\n\n return names.join(\", \")\n}\n\nconst nameFromNode = (node: SyntaxNode): string | undefined => {\n switch (node.type) {\n case \"class_declaration\":\n case \"enum_declaration\":\n case \"function_declaration\":\n case \"generator_function_declaration\":\n case \"internal_module\":\n case \"interface_declaration\":\n case \"module\":\n case \"generator_method_definition\":\n case \"method_definition\":\n case \"type_alias_declaration\":\n case \"variable_declarator\":\n return nodeFieldText(node, \"name\")\n case \"lexical_declaration\":\n case \"variable_declaration\":\n return variableNamesFromDeclaration(node)\n default:\n return undefined\n }\n}\n\nconst formatParent = (\n type: ChunkType | undefined,\n name: string | undefined,\n): string | undefined => {\n if (type === undefined && name === undefined) {\n return undefined\n }\n if (type === undefined) {\n return name\n }\n if (name === undefined) {\n return type\n }\n return type + \" \" + name\n}\n\nconst collectClassMethodRanges = (\n classNode: SyntaxNode,\n parent: string | undefined,\n lines: ReadonlyArray<string>,\n): ReadonlyArray<ChunkRange> => {\n const body = classNode.childForFieldName(\"body\")\n if (body === null) {\n return []\n }\n\n const out = [] as Array<ChunkRange>\n for (let index = 0; index < body.namedChildren.length; index++) {\n const child = body.namedChildren[index]!\n if (!child.type.includes(\"method\")) {\n continue\n }\n\n out.push({\n ...lineRangeWithLeadingComments(child, body.namedChildren, index, lines),\n name: nameFromNode(child),\n type: chunkTypeFromNode(child),\n parent,\n })\n }\n\n return out\n}\n\nconst collectAstRanges = (\n path: string,\n content: string,\n lines: ReadonlyArray<string>,\n): ReadonlyArray<ChunkRange> => {\n const language = resolveAstLanguage(path)\n if (language === undefined) {\n return []\n }\n\n try {\n const parser = new TreeSitter()\n parser.setLanguage(language)\n const tree = parser.parse(content, undefined, {\n bufferSize: 1024 * 1024,\n })\n const collectDeclarationRanges = (\n siblings: ReadonlyArray<SyntaxNode>,\n parent: string | undefined,\n ): ReadonlyArray<ChunkRange> => {\n const out = [] as Array<ChunkRange>\n\n for (let index = 0; index < siblings.length; index++) {\n const sibling = siblings[index]!\n if (sibling.type === \"comment\" || sibling.type.includes(\"import\")) {\n continue\n }\n\n const declarationNode = unwrapDeclarationNode(sibling)\n const type = chunkTypeFromNode(declarationNode)\n const name = nameFromNode(declarationNode)\n if (type === undefined && name === undefined) {\n continue\n }\n\n out.push({\n ...lineRangeWithLeadingComments(sibling, siblings, index, lines),\n name,\n type,\n parent,\n })\n\n if (declarationNode.type === \"class_declaration\") {\n out.push(\n ...collectClassMethodRanges(\n declarationNode,\n formatParent(type, name),\n lines,\n ),\n )\n }\n\n if (isNamespaceNode(declarationNode)) {\n const body = declarationNode.childForFieldName(\"body\")\n if (body !== null) {\n out.push(\n ...collectDeclarationRanges(\n body.namedChildren,\n formatParent(type, name),\n ),\n )\n }\n }\n }\n\n return out\n }\n\n return collectDeclarationRanges(tree.rootNode.namedChildren, undefined)\n } catch {\n return []\n }\n}\n\nconst chunksFromRanges = (\n path: string,\n lines: ReadonlyArray<string>,\n ranges: ReadonlyArray<ChunkRange>,\n settings: ChunkSettings,\n): ReadonlyArray<CodeChunk> => {\n const hasMethodChildRange = (\n classRange: LineRange & { readonly name: string | undefined },\n ) => {\n const parent = formatParent(\"class\", classRange.name)\n return ranges.some(\n (range) =>\n range.type === \"method\" &&\n range.parent === parent &&\n range.startLine >= classRange.startLine &&\n range.endLine <= classRange.endLine,\n )\n }\n\n const out = [] as Array<CodeChunk>\n const seen = new Set<string>()\n const prefixSums = lineLengthPrefixSums(lines)\n\n for (const range of ranges) {\n const normalizedRange = normalizeLineRange(range, lines.length)\n if (normalizedRange === undefined) {\n continue\n }\n\n const allSegments = splitRange(normalizedRange, settings, prefixSums)\n const segments =\n range.type === \"class\" &&\n allSegments.length > 1 &&\n hasMethodChildRange({ ...normalizedRange, name: range.name })\n ? [allSegments[0]!]\n : allSegments\n\n for (const segment of segments) {\n const key =\n String(segment.startLine) +\n \":\" +\n String(segment.endLine) +\n \":\" +\n (range.name ?? \"\") +\n \":\" +\n (range.type ?? \"\") +\n \":\" +\n (range.parent ?? \"\")\n if (seen.has(key)) {\n continue\n }\n seen.add(key)\n\n const chunkLines = lines.slice(segment.startLine - 1, segment.endLine)\n if (!chunkLines.some(isMeaningfulLine)) {\n continue\n }\n\n out.push({\n path,\n startLine: segment.startLine,\n endLine: segment.endLine,\n name: range.name,\n type: range.type,\n parent: range.parent,\n content: chunkLines.join(\"\\n\"),\n })\n }\n }\n\n return out.toSorted(\n (left, right) =>\n left.startLine - right.startLine ||\n left.endLine - right.endLine ||\n (left.name ?? \"\").localeCompare(right.name ?? \"\"),\n )\n}\n\nconst chunkWithLineWindows = (\n path: string,\n lines: ReadonlyArray<string>,\n settings: ChunkSettings,\n): ReadonlyArray<CodeChunk> => {\n const out = [] as Array<CodeChunk>\n const prefixSums = lineLengthPrefixSums(lines)\n\n for (let index = 0; index < lines.length;) {\n if (!isMeaningfulLine(lines[index]!)) {\n index++\n continue\n }\n\n const startLine = index + 1\n const maxEndLine = Math.min(\n lines.length,\n startLine + settings.chunkSize - 1,\n )\n const endLine = resolveSegmentEndLine({\n startLine,\n maxEndLine,\n settings,\n prefixSums,\n })\n const chunkLines = lines.slice(startLine - 1, endLine)\n\n out.push({\n path,\n startLine,\n endLine,\n name: undefined,\n type: undefined,\n parent: undefined,\n content: chunkLines.join(\"\\n\"),\n })\n\n if (endLine >= lines.length) {\n break\n }\n\n const nextStartLine = Math.max(\n startLine + 1,\n endLine - settings.chunkOverlap + 1,\n )\n index = nextStartLine - 1\n }\n\n return out\n}\n\nconst splitOversizedChunks = (\n chunks: ReadonlyArray<CodeChunk>,\n maxCharacters: number,\n): ReadonlyArray<CodeChunk> =>\n chunks.flatMap((chunk) => {\n if (chunk.content.length <= maxCharacters) {\n return [chunk]\n }\n\n // Line-based splitting can only exceed the limit for a single long line.\n // Each piece retains that line number and the original AST metadata.\n const pieces = [] as Array<CodeChunk>\n for (\n let offset = 0;\n offset < chunk.content.length;\n offset += maxCharacters\n ) {\n pieces.push({\n ...chunk,\n content: chunk.content.slice(offset, offset + maxCharacters),\n })\n }\n return pieces\n })\n\n/**\n * @since 1.0.0\n * @category Constructors\n */\nexport const chunkFileContent = (\n path: string,\n content: string,\n options: {\n readonly chunkSize: number\n readonly chunkOverlap: number\n readonly chunkMaxCharacters?: number | undefined\n },\n): ReadonlyArray<CodeChunk> => {\n if (content.trim().length === 0 || isProbablyMinified(content)) {\n return []\n }\n\n const normalizedPath = normalizePath(path)\n const normalizedContent = normalizeText(content)\n const lines = normalizedContent.split(\"\\n\")\n if (lines.at(-1) === \"\") {\n lines.pop()\n }\n if (lines.length === 0) {\n return []\n }\n\n const settings = resolveChunkSettings(options)\n const astRanges = collectAstRanges(normalizedPath, normalizedContent, lines)\n if (astRanges.length > 0) {\n const astChunks = chunksFromRanges(\n normalizedPath,\n lines,\n astRanges,\n settings,\n )\n if (astChunks.length > 0) {\n return splitOversizedChunks(astChunks, settings.chunkMaxCharacters)\n }\n }\n\n return splitOversizedChunks(\n chunkWithLineWindows(normalizedPath, lines, settings),\n settings.chunkMaxCharacters,\n )\n}\n\n/**\n * @since 1.0.0\n * @category Layers\n */\nexport const layer: Layer.Layer<\n CodeChunker,\n never,\n ChildProcessSpawner.ChildProcessSpawner | FileSystem.FileSystem | Path.Path\n> = Layer.effect(\n CodeChunker,\n Effect.gen(function* () {\n const spawner = yield* ChildProcessSpawner.ChildProcessSpawner\n const fs = yield* FileSystem.FileSystem\n const pathService = yield* Path.Path\n\n const listFiles: CodeChunker[\"Service\"][\"listFiles\"] = Effect.fn(\n \"CodeChunker.listFiles\",\n )(function* (options): Effect.fn.Return<ReadonlyArray<string>> {\n const root = pathService.resolve(options.root)\n const maxFileSize = options.maxFileSize ?? \"1M\"\n\n return yield* pipe(\n spawner.streamLines(\n ChildProcess.make(\n \"rg\",\n [\n \"--files\",\n \"--hidden\",\n \"--max-filesize\",\n maxFileSize,\n \"--glob\",\n \"!.git\",\n ],\n {\n cwd: root,\n stdin: \"ignore\",\n },\n ),\n ),\n Stream.runCollect,\n Effect.map(Array.fromIterable),\n Effect.map((entries) =>\n entries\n .map((entry) => normalizePath(entry.trim()))\n .filter((entry) => entry.length > 0 && isMeaningfulFile(entry))\n .toSorted((left, right) => left.localeCompare(right)),\n ),\n Effect.orDie,\n )\n })\n\n const chunkFile: CodeChunker[\"Service\"][\"chunkFile\"] = Effect.fn(\n \"CodeChunker.chunkFile\",\n )(function* (options): Effect.fn.Return<ReadonlyArray<CodeChunk>> {\n const root = pathService.resolve(options.root)\n const absolutePath = pathService.resolve(root, options.path)\n const path = normalizePath(pathService.relative(root, absolutePath))\n\n if (\n path.length === 0 ||\n path === \"..\" ||\n path.startsWith(\"../\") ||\n !isMeaningfulFile(path)\n ) {\n return []\n }\n\n return yield* pipe(\n fs.readFileString(absolutePath),\n Effect.map((content) => chunkFileContent(path, content, options)),\n Effect.orElseSucceed(() => []),\n )\n })\n\n const chunkFiles: CodeChunker[\"Service\"][\"chunkFiles\"] = (options) =>\n Stream.fromArray(options.paths).pipe(\n Stream.flatMap(\n (path) =>\n pipe(\n chunkFile({\n root: options.root,\n path,\n chunkSize: options.chunkSize,\n chunkOverlap: options.chunkOverlap,\n ...(options.chunkMaxCharacters === undefined\n ? {}\n : { chunkMaxCharacters: options.chunkMaxCharacters }),\n }),\n Stream.fromArrayEffect,\n ),\n { concurrency: 5 },\n ),\n )\n\n const chunkCodebase: CodeChunker[\"Service\"][\"chunkCodebase\"] =\n Effect.fnUntraced(function* (options) {\n const root = pathService.resolve(options.root)\n const files = yield* listFiles({\n root,\n ...(options.maxFileSize === undefined\n ? {}\n : { maxFileSize: options.maxFileSize }),\n })\n\n return chunkFiles({\n root,\n paths: files,\n chunkSize: options.chunkSize,\n chunkOverlap: options.chunkOverlap,\n ...(options.chunkMaxCharacters === undefined\n ? {}\n : { chunkMaxCharacters: options.chunkMaxCharacters }),\n })\n }, Stream.unwrap)\n\n return CodeChunker.of({\n listFiles,\n chunkFile,\n chunkFiles,\n chunkCodebase,\n })\n }),\n)\n","/**\n * Manages at most one fiber inside a scope.\n *\n * A `FiberHandle<A, E>` can hold one `Fiber<A, E>`. Installing a new fiber\n * interrupts the previous one unless the operation is configured with\n * `onlyIfMissing`, and closing the owning scope interrupts the current fiber.\n * This module includes constructors for handles and scoped runtimes, helpers\n * for setting, reading, clearing, and running fibers, and operations for joining\n * the current fiber or waiting until the handle is empty.\n *\n * @since 2.0.0\n */\nimport * as Cause from \"./Cause.js\";\nimport * as Deferred from \"./Deferred.js\";\nimport * as Effect from \"./Effect.js\";\nimport * as Exit from \"./Exit.js\";\nimport * as Fiber from \"./Fiber.js\";\nimport * as Filter from \"./Filter.js\";\nimport { dual } from \"./Function.js\";\nimport { PipeInspectableProto } from \"./internal/core.js\";\nimport * as Option from \"./Option.js\";\nimport * as Predicate from \"./Predicate.js\";\nconst TypeId = \"~effect/FiberHandle\";\n/**\n * Returns `true` if a value is a `FiberHandle` by checking for the\n * `FiberHandle` runtime marker.\n *\n * **Example** (Checking fiber handles)\n *\n * ```ts import.meta.vitest\n * import { Effect, FiberHandle } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const handle = yield* FiberHandle.make()\n *\n * return [FiberHandle.isFiberHandle(handle), FiberHandle.isFiberHandle(\"not a handle\")]\n * })\n *\n * const actual = await Effect.runPromise(Effect.scoped(program))\n * actual // => [true, false]\n * ```\n *\n * @category guards\n * @since 2.0.0\n */\nexport const isFiberHandle = u => Predicate.hasProperty(u, TypeId);\nconst Proto = {\n [TypeId]: TypeId,\n ...PipeInspectableProto,\n toJSON() {\n return {\n _id: \"FiberHandle\",\n state: this.state\n };\n }\n};\nconst makeUnsafe = () => {\n const self = Object.create(Proto);\n self.state = {\n _tag: \"Open\",\n fiber: undefined\n };\n self.deferred = Deferred.makeUnsafe();\n return self;\n};\n/**\n * Creates a scoped `FiberHandle` that can store a single fiber.\n *\n * **Details**\n *\n * When the associated `Scope` is closed, the contained fiber will be\n * interrupted. You can add a fiber to the handle using `FiberHandle.run`, and\n * the fiber will be automatically removed from the `FiberHandle` when it\n * completes.\n *\n * **Example** (Creating a scoped fiber handle)\n *\n * ```ts import.meta.vitest\n * import { Effect, FiberHandle } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const handle = yield* FiberHandle.make()\n *\n * // run some effects\n * yield* FiberHandle.run(handle, Effect.never)\n * // this will interrupt the previous fiber\n * yield* FiberHandle.run(handle, Effect.never)\n *\n * yield* Effect.yieldNow\n * return handle.state._tag === \"Open\" && handle.state.fiber !== undefined\n * }).pipe(\n * Effect.scoped // The fiber will be interrupted when the scope is closed\n * )\n *\n * const actual = await Effect.runPromise(program)\n * actual // => true\n * ```\n *\n * @category constructors\n * @since 2.0.0\n */\nexport const make = () => Effect.acquireRelease(Effect.sync(() => makeUnsafe()), handle => {\n const state = handle.state;\n if (state._tag === \"Closed\") return Effect.void;\n handle.state = {\n _tag: \"Closed\"\n };\n return state.fiber ? Deferred.into(Effect.asVoid(Fiber.interruptAs(state.fiber, internalFiberId)), handle.deferred) : Deferred.done(handle.deferred, Exit.void);\n});\n/**\n * Creates a scoped run function that forks effects into a new `FiberHandle`.\n *\n * **Details**\n *\n * Each call returns the forked fiber, stores it in the handle, and interrupts\n * the previous fiber unless `onlyIfMissing` is set. The managed fiber is\n * interrupted when the handle's scope closes.\n *\n * **Example** (Running effects with a fiber handle)\n *\n * ```ts import.meta.vitest\n * import { Cause, Effect, Exit, Fiber, FiberHandle } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const run = yield* FiberHandle.makeRuntime<never>()\n *\n * // Run effects and get fibers back\n * const fiberA = run(Effect.never)\n * const fiberB = run(Effect.succeed(\"second\"))\n *\n * // The second fiber will interrupt the first\n * const resultA = yield* Fiber.await(fiberA)\n * const resultB = yield* Fiber.await(fiberB)\n * return [resultA, resultB]\n * }).pipe(Effect.scoped)\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [Exit.failCause(Cause.interrupt(-1)), Exit.succeed(\"second\")]\n * ```\n *\n * @category constructors\n * @since 2.0.0\n */\nexport const makeRuntime = () => Effect.flatMap(make(), self => runtime(self)());\n/**\n * Creates a scoped run function that forks effects into a new `FiberHandle`\n * and returns a `Promise` for each effect result.\n *\n * **When to use**\n *\n * Use when integrating a scoped `FiberHandle` runner with Promise-based APIs\n * and Promise rejection from squashed failures is the desired boundary.\n *\n * **Details**\n *\n * Each call stores the fiber in the handle and interrupts the previous fiber\n * unless `onlyIfMissing` is set. The returned Promise resolves with the\n * effect's success value or rejects with the squashed failure cause.\n *\n * **Example** (Running effects as promises)\n *\n * ```ts import.meta.vitest\n * import { Effect, FiberHandle } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const run = yield* FiberHandle.makeRuntimePromise()\n *\n * // Run effects and get promises back\n * const promise = run(Effect.succeed(\"hello\"))\n * return yield* Effect.promise(() => promise)\n * }).pipe(Effect.scoped)\n *\n * const actual = await Effect.runPromise(program)\n * actual // => \"hello\"\n * ```\n *\n * @category constructors\n * @since 3.13.0\n */\nexport const makeRuntimePromise = () => Effect.flatMap(make(), self => runtimePromise(self)());\nconst internalFiberId = -1;\nconst isInternalInterruption = /*#__PURE__*/Filter.toPredicate(/*#__PURE__*/Filter.compose(Cause.filterInterruptors, /*#__PURE__*/Filter.has(internalFiberId)));\n/**\n * Sets the fiber in a FiberHandle. When the fiber completes, it will be removed from the FiberHandle.\n * If a fiber is already running, it will be interrupted unless `options.onlyIfMissing` is set.\n *\n * **When to use**\n *\n * Use when an existing forked fiber must be installed synchronously into a\n * handle and immediate interruption of replaced or closed fibers is acceptable.\n *\n * **Example** (Setting a fiber unsafely)\n *\n * ```ts import.meta.vitest\n * import { Effect, Fiber, FiberHandle } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const handle = yield* FiberHandle.make()\n * const fiber = Effect.runFork(Effect.succeed(\"hello\"))\n *\n * // Set the fiber directly (unsafe)\n * FiberHandle.setUnsafe(handle, fiber)\n *\n * // The fiber is now managed by the handle\n * return yield* Fiber.join(fiber)\n * })\n *\n * const actual = await Effect.runPromise(Effect.scoped(program))\n * actual // => \"hello\"\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const setUnsafe = /*#__PURE__*/dual(args => isFiberHandle(args[0]), (self, fiber, options) => {\n if (self.state._tag === \"Closed\") {\n fiber.interruptUnsafe(internalFiberId);\n return;\n } else if (self.state.fiber !== undefined) {\n if (self.state.fiber === fiber) {\n return;\n } else if (options?.onlyIfMissing === true) {\n fiber.interruptUnsafe(internalFiberId);\n return;\n }\n self.state.fiber.interruptUnsafe(internalFiberId);\n self.state.fiber = undefined;\n }\n self.state.fiber = fiber;\n fiber.addObserver(exit => {\n if (self.state._tag === \"Open\" && fiber === self.state.fiber) {\n self.state.fiber = undefined;\n }\n if (Exit.isFailure(exit) && (options?.propagateInterruption === true ? !isInternalInterruption(exit.cause) : !Cause.hasInterruptsOnly(exit.cause))) {\n Deferred.doneUnsafe(self.deferred, exit);\n }\n });\n});\n/**\n * Sets the fiber in the `FiberHandle`.\n *\n * **Details**\n *\n * When the fiber completes, it will be removed from the `FiberHandle`. If a\n * fiber already exists in the `FiberHandle`, it will be interrupted unless\n * `options.onlyIfMissing` is set.\n *\n * **Example** (Setting a fiber safely)\n *\n * ```ts import.meta.vitest\n * import { Effect, Fiber, FiberHandle } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const handle = yield* FiberHandle.make()\n * const fiber = Effect.runFork(Effect.succeed(\"hello\"))\n *\n * // Set the fiber safely\n * yield* FiberHandle.set(handle, fiber)\n *\n * // The fiber is now managed by the handle\n * return yield* Fiber.join(fiber)\n * })\n *\n * const actual = await Effect.runPromise(Effect.scoped(program))\n * actual // => \"hello\"\n * ```\n *\n * @category combinators\n * @since 2.0.0\n */\nexport const set = /*#__PURE__*/dual(args => isFiberHandle(args[0]), (self, fiber, options) => Effect.sync(() => setUnsafe(self, fiber, {\n onlyIfMissing: options?.onlyIfMissing,\n propagateInterruption: options?.propagateInterruption\n})));\n/**\n * Retrieves the fiber from the FiberHandle synchronously.\n *\n * **When to use**\n *\n * Use when synchronous inspection of the current fiber is needed and an\n * `Option` result is enough outside the Effect workflow.\n *\n * **Example** (Reading the current fiber unsafely)\n *\n * ```ts import.meta.vitest\n * import { Effect, FiberHandle, Option } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const handle = yield* FiberHandle.make()\n *\n * // No fiber initially\n * const emptyFiber = FiberHandle.getUnsafe(handle)\n *\n * // Add a fiber\n * yield* FiberHandle.run(handle, Effect.never)\n * const fiber = FiberHandle.getUnsafe(handle)\n * return [emptyFiber, Option.map(fiber, () => true)]\n * })\n *\n * const actual = await Effect.runPromise(Effect.scoped(program))\n * actual // => [Option.none(), Option.some(true)]\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport function getUnsafe(self) {\n return self.state._tag === \"Closed\" ? Option.none() : Option.fromUndefinedOr(self.state.fiber);\n}\n/**\n * Retrieves the fiber from the FiberHandle effectfully.\n *\n * **Example** (Reading the current fiber)\n *\n * ```ts import.meta.vitest\n * import { Effect, FiberHandle, Option } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const handle = yield* FiberHandle.make()\n *\n * // Add a fiber\n * yield* FiberHandle.run(handle, Effect.never)\n *\n * // Get the current fiber if present\n * const fiber = yield* FiberHandle.get(handle)\n * return Option.map(fiber, () => true)\n * })\n *\n * const actual = await Effect.runPromise(Effect.scoped(program))\n * actual // => Option.some(true)\n * ```\n *\n * @category combinators\n * @since 2.0.0\n */\nexport function get(self) {\n return Effect.suspend(() => Effect.succeed(getUnsafe(self)));\n}\n/**\n * Interrupts the fiber currently stored in the `FiberHandle`, if any, and\n * leaves the handle empty.\n *\n * **Example** (Clearing a fiber handle)\n *\n * ```ts import.meta.vitest\n * import { Effect, FiberHandle, Option } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const handle = yield* FiberHandle.make()\n *\n * // Add a fiber\n * yield* FiberHandle.run(handle, Effect.never)\n *\n * // Clear the handle, interrupting the fiber\n * yield* FiberHandle.clear(handle)\n *\n * // The handle is now empty\n * return FiberHandle.getUnsafe(handle)\n * })\n *\n * const actual = await Effect.runPromise(Effect.scoped(program))\n * actual // => Option.none()\n * ```\n *\n * @category combinators\n * @since 2.0.0\n */\nexport const clear = self => Effect.uninterruptibleMask(restore => {\n if (self.state._tag === \"Closed\" || self.state.fiber === undefined) {\n return Effect.void;\n }\n const fiber = self.state.fiber;\n return Effect.andThen(restore(Fiber.interruptAs(fiber, internalFiberId)), Effect.sync(() => {\n if (self.state._tag === \"Open\" && self.state.fiber === fiber) {\n self.state.fiber = undefined;\n }\n }));\n});\nconst constInterruptedFiber = /*#__PURE__*/function () {\n let fiber = undefined;\n return () => {\n if (fiber === undefined) {\n fiber = Effect.runFork(Effect.interrupt);\n }\n return fiber;\n };\n}();\n/**\n * Forks an Effect and stores the resulting fiber in the `FiberHandle`.\n *\n * **Details**\n *\n * The handle manages only one fiber: running a new effect interrupts the\n * previous fiber unless `onlyIfMissing` is set. When the managed fiber\n * completes, it is removed from the handle.\n *\n * **Example** (Running an effect in a fiber handle)\n *\n * ```ts import.meta.vitest\n * import { Effect, Fiber, FiberHandle } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const handle = yield* FiberHandle.make()\n *\n * // Run an effect and get the fiber\n * const fiber = yield* FiberHandle.run(handle, Effect.succeed(\"hello\"))\n * const result = yield* Fiber.join(fiber)\n *\n * // Running another effect will interrupt the previous one\n * const fiber2 = yield* FiberHandle.run(handle, Effect.succeed(\"world\"))\n * const result2 = yield* Fiber.join(fiber2)\n * return [result, result2]\n * })\n *\n * const actual = await Effect.runPromise(Effect.scoped(program))\n * actual // => [\"hello\", \"world\"]\n * ```\n *\n * @category combinators\n * @since 2.0.0\n */\nexport const run = function () {\n const self = arguments[0];\n if (Effect.isEffect(arguments[1])) {\n return runImpl(self, arguments[1], arguments[2]);\n }\n const options = arguments[1];\n return effect => runImpl(self, effect, options);\n};\nconst runImpl = (self, effect, options) => Effect.withFiber(parent => {\n if (self.state._tag === \"Closed\") {\n return Effect.interrupt;\n } else if (self.state.fiber !== undefined && options?.onlyIfMissing === true) {\n return Effect.sync(constInterruptedFiber);\n }\n const fiber = Effect.runForkWith(parent.context)(effect);\n setUnsafe(self, fiber, options);\n return Effect.succeed(fiber);\n});\n/**\n * Captures the current runtime and returns a function for forking effects into\n * an existing `FiberHandle`.\n *\n * **Details**\n *\n * Each call returns the forked fiber, stores it in the handle, and interrupts\n * the previous fiber unless `onlyIfMissing` is set.\n *\n * **Example** (Capturing a runtime for fiber handles)\n *\n * ```ts import.meta.vitest\n * import { Context, Effect, Fiber, FiberHandle } from \"effect\"\n *\n * class Users extends Context.Service<Users, {\n * readonly getAll: Effect.Effect<Array<unknown>>\n * }>()(\"Users\") {}\n *\n * const program = Effect.gen(function*() {\n * const handle = yield* FiberHandle.make()\n * const run = yield* FiberHandle.runtime(handle)<Users>()\n *\n * // run an effect and set the fiber in the handle\n * const fiberA = run(Effect.andThen(Users, (_) => _.getAll))\n *\n * // this will interrupt the previous fiber\n * const fiberB = run(Effect.andThen(Users, (_) => _.getAll))\n * yield* Fiber.await(fiberA)\n * return (yield* Fiber.join(fiberB)).length\n * }).pipe(\n * Effect.scoped // The fiber will be interrupted when the scope is closed\n * )\n *\n * const actual = await Effect.runPromise(Effect.provideService(program, Users, {\n * getAll: Effect.succeed([])\n * }))\n * actual // => 0\n * ```\n *\n * @category combinators\n * @since 2.0.0\n */\nexport const runtime = self => () => Effect.map(Effect.context(), services => {\n const runFork = Effect.runForkWith(services);\n return (effect, options) => {\n if (self.state._tag === \"Closed\") {\n return constInterruptedFiber();\n } else if (self.state.fiber !== undefined && options?.onlyIfMissing === true) {\n return constInterruptedFiber();\n }\n const fiber = runFork(effect, options);\n setUnsafe(self, fiber, options);\n return fiber;\n };\n});\n/**\n * Captures the current runtime and returns a function for running effects in\n * an existing `FiberHandle` as Promises.\n *\n * **Details**\n *\n * Each call stores the forked fiber in the handle and interrupts the previous\n * fiber unless `onlyIfMissing` is set. The Promise resolves with the effect's\n * success value or rejects with the squashed failure cause.\n *\n * **Example** (Capturing a runtime for promises)\n *\n * ```ts import.meta.vitest\n * import { Effect, FiberHandle } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const handle = yield* FiberHandle.make()\n * const runPromise = yield* FiberHandle.runtimePromise(handle)<never>()\n *\n * // Run an effect and get a promise\n * const promise = runPromise(Effect.succeed(\"hello\"))\n * return yield* Effect.promise(() => promise)\n * })\n *\n * const actual = await Effect.runPromise(Effect.scoped(program))\n * actual // => \"hello\"\n * ```\n *\n * @category combinators\n * @since 3.13.0\n */\nexport const runtimePromise = self => () => Effect.map(runtime(self)(), runFork => (effect, options) => new Promise((resolve, reject) => runFork(effect, options).addObserver(exit => {\n if (Exit.isSuccess(exit)) {\n resolve(exit.value);\n } else {\n reject(Cause.squash(exit.cause));\n }\n})));\n/**\n * Waits for the `FiberHandle` to fail or close.\n *\n * **Details**\n *\n * The returned Effect fails with the first managed fiber failure that is not\n * ignored by the handle's interruption rules. Normal successful completion of\n * a managed fiber only removes it from the handle; use `awaitEmpty` to wait\n * for the current fiber to finish.\n *\n * **Example** (Propagating fiber failures)\n *\n * ```ts import.meta.vitest\n * import { Effect, Exit, FiberHandle } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const handle = yield* FiberHandle.make()\n * yield* FiberHandle.set(handle, Effect.runFork(Effect.fail(\"error\")))\n *\n * // parent fiber will fail with \"error\"\n * yield* FiberHandle.join(handle)\n * })\n *\n * const actual = await Effect.runPromise(Effect.exit(Effect.scoped(program)))\n * actual // => Exit.fail(\"error\")\n * ```\n *\n * @category combinators\n * @since 2.0.0\n */\nexport const join = self => Deferred.await(self.deferred);\n/**\n * Waits for the fiber in the FiberHandle to complete.\n *\n * **Example** (Waiting for a fiber to complete)\n *\n * ```ts import.meta.vitest\n * import { Effect, FiberHandle, Option } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const handle = yield* FiberHandle.make()\n *\n * yield* FiberHandle.run(handle, Effect.yieldNow)\n *\n * // Wait for the fiber to complete\n * yield* FiberHandle.awaitEmpty(handle)\n *\n * return yield* FiberHandle.get(handle)\n * })\n *\n * const actual = await Effect.runPromise(Effect.scoped(program))\n * actual // => Option.none()\n * ```\n *\n * @category combinators\n * @since 3.13.0\n */\nexport const awaitEmpty = self => Effect.suspend(() => {\n if (self.state._tag === \"Closed\" || self.state.fiber === undefined) {\n return Effect.void;\n }\n return Fiber.await(self.state.fiber);\n});\n//# sourceMappingURL=FiberHandle.js.map","/**\n * Connects Effect SQL to SQLite on Node.js using `node:sqlite`.\n *\n * This module opens a SQLite database and exposes it as both `SqliteClient` and\n * the generic Effect SQL client. It serializes access through one connection,\n * caches prepared statements, enables WAL mode unless disabled, and waits up\n * to five seconds for busy databases by default. Explicit transactions on\n * writable connections use `BEGIN IMMEDIATE` to avoid read-to-write lock\n * upgrades, which serializes them behind other writers even when they only\n * read. Clients opened with `readonly: true` are unaffected. Busy waits block\n * the Node.js event loop because `node:sqlite` is synchronous. Database backup\n * and extension loading are supported; streaming queries and `updateValues`\n * are not.\n *\n * @since 4.0.0\n */\nimport * as Cache from \"effect/Cache\";\nimport * as Config from \"effect/Config\";\nimport * as Context from \"effect/Context\";\nimport * as Duration from \"effect/Duration\";\nimport * as Effect from \"effect/Effect\";\nimport * as Fiber from \"effect/Fiber\";\nimport { identity } from \"effect/Function\";\nimport * as Layer from \"effect/Layer\";\nimport * as Scope from \"effect/Scope\";\nimport * as Semaphore from \"effect/Semaphore\";\nimport * as Stream from \"effect/Stream\";\nimport * as Reactivity from \"effect/unstable/reactivity/Reactivity\";\nimport * as Client from \"effect/unstable/sql/SqlClient\";\nimport { classifySqliteError, SqlError } from \"effect/unstable/sql/SqlError\";\nimport * as Statement from \"effect/unstable/sql/Statement\";\nimport { backup as backupDatabase, DatabaseSync } from \"node:sqlite\";\nconst ATTR_DB_SYSTEM_NAME = \"db.system.name\";\nconst MAX_BUSY_TIMEOUT = 2_147_483_647;\n/**\n * Runtime type identifier used to mark Node `SqliteClient` values.\n *\n * @category type IDs\n * @since 4.0.0\n */\nexport const TypeId = \"~@effect/sql-sqlite-node/SqliteClient\";\n/**\n * Service tag for the node SQLite client implementation.\n *\n * @category services\n * @since 4.0.0\n */\nexport const SqliteClient = /*#__PURE__*/Context.Service(\"@effect/sql-sqlite-node/SqliteClient\");\n/**\n * Creates a scoped node SQLite client from the supplied configuration, using a single serialized connection with WAL and a 5-second busy timeout enabled by default. Explicit transactions on writable connections take the write lock for their duration, even when they only read; clients opened with `readonly: true` are unaffected.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const make = options => Effect.gen(function* () {\n const compiler = Statement.makeCompilerSqlite(options.transformQueryNames);\n const transformRows = options.transformResultNames ? Statement.defaultTransforms(options.transformResultNames).array : undefined;\n const makeConnection = Effect.gen(function* () {\n const scope = yield* Effect.scope;\n const db = new DatabaseSync(options.filename, {\n readOnly: options.readonly ?? false,\n allowExtension: true\n });\n yield* Scope.addFinalizer(scope, Effect.sync(() => db.close()));\n db.enableLoadExtension(false);\n const busyTimeout = Math.min(MAX_BUSY_TIMEOUT, Math.max(0, Math.round(Duration.toMillis(options.busyTimeout ?? Duration.seconds(5)))));\n db.exec(`PRAGMA busy_timeout = ${busyTimeout}`);\n if (options.disableWAL !== true) {\n db.exec(\"PRAGMA journal_mode = WAL\");\n }\n const prepare = sql => Effect.try({\n try: () => db.prepare(sql),\n catch: cause => new SqlError({\n reason: classifyError(cause, \"Failed to prepare statement\", \"prepare\")\n })\n });\n const prepareCache = yield* Cache.make({\n capacity: options.prepareCacheSize ?? 200,\n timeToLive: options.prepareCacheTTL ?? Duration.minutes(10),\n lookup: prepare\n });\n const runStatement = (statement, params, raw) => Effect.withFiber(fiber => {\n const useSafeIntegers = Context.get(fiber.context, Client.SafeIntegers);\n return Effect.try({\n try: () => {\n statement.setReadBigInts(useSafeIntegers);\n if (statement.columns().length > 0) {\n return statement.all(...params);\n }\n const result = statement.run(...params);\n return raw ? {\n changes: result.changes,\n lastInsertRowid: result.lastInsertRowid\n } : [];\n },\n catch: cause => new SqlError({\n reason: classifyError(cause, \"Failed to execute statement\", \"execute\")\n })\n });\n });\n const runStatementValues = (statement, params) => Effect.withFiber(fiber => {\n const useSafeIntegers = Context.get(fiber.context, Client.SafeIntegers);\n return Effect.try({\n try: () => {\n statement.setReadBigInts(useSafeIntegers);\n if (statement.columns().length > 0) {\n return statement.all(...params);\n }\n statement.run(...params);\n return [];\n },\n catch: cause => new SqlError({\n reason: classifyError(cause, \"Failed to execute statement\", \"execute\")\n })\n });\n });\n const runStatementValuesUnprepared = (statement, params) => Effect.withFiber(fiber => {\n const useSafeIntegers = Context.get(fiber.context, Client.SafeIntegers);\n return Effect.try({\n try: () => {\n statement.setReadBigInts(useSafeIntegers);\n statement.setReturnArrays(true);\n if (statement.columns().length > 0) {\n return statement.all(...params);\n }\n statement.run(...params);\n return [];\n },\n catch: cause => new SqlError({\n reason: classifyError(cause, \"Failed to execute statement\", \"execute\")\n })\n });\n });\n const run = (sql, params, raw = false) => Effect.flatMap(Cache.get(prepareCache, sql), s => runStatement(s, params, raw));\n const runValues = (sql, params) => Effect.acquireUseRelease(Cache.get(prepareCache, sql), statement => {\n statement.setReturnArrays(true);\n return runStatementValues(statement, params);\n }, statement => Effect.sync(() => statement.setReturnArrays(false)));\n const runValuesUnprepared = (sql, params) => Effect.flatMap(prepare(sql), statement => runStatementValuesUnprepared(statement, params));\n return identity({\n execute(sql, params, transformRows) {\n return transformRows ? Effect.map(run(sql, params), transformRows) : run(sql, params);\n },\n executeRaw(sql, params) {\n return run(sql, params, true);\n },\n executeValues(sql, params) {\n return runValues(sql, params);\n },\n executeValuesUnprepared(sql, params) {\n return runValuesUnprepared(sql, params);\n },\n executeUnprepared(sql, params, transformRows) {\n const effect = Effect.flatMap(prepare(sql), statement => runStatement(statement, params ?? [], false));\n return transformRows ? Effect.map(effect, transformRows) : effect;\n },\n executeStream(_sql, _params) {\n return Stream.die(\"executeStream not implemented\");\n },\n backup(destination) {\n return Effect.suspend(() => {\n let totalPages = 0;\n return Effect.tryPromise({\n try: () => backupDatabase(db, destination, {\n progress: progress => {\n totalPages = progress.totalPages;\n }\n }).then(pages => ({\n totalPages: totalPages || pages,\n remainingPages: 0\n })),\n catch: cause => new SqlError({\n reason: classifyError(cause, \"Failed to backup database\", \"backup\")\n })\n });\n });\n },\n loadExtension(path) {\n return Effect.acquireUseRelease(Effect.sync(() => db.enableLoadExtension(true)), () => Effect.try({\n try: () => db.loadExtension(path),\n catch: cause => new SqlError({\n reason: classifyError(cause, \"Failed to load extension\", \"loadExtension\")\n })\n }), () => Effect.sync(() => db.enableLoadExtension(false)));\n }\n });\n });\n const semaphore = yield* Semaphore.make(1);\n const connection = yield* makeConnection;\n const acquirer = semaphore.withPermits(1)(Effect.succeed(connection));\n const transactionAcquirer = Effect.uninterruptibleMask(restore => {\n const fiber = Fiber.getCurrent();\n const scope = Context.getUnsafe(fiber.context, Scope.Scope);\n return Effect.as(Effect.tap(restore(semaphore.take(1)), () => Scope.addFinalizer(scope, semaphore.release(1))), connection);\n });\n return Object.assign(yield* Client.make({\n acquirer,\n compiler,\n transactionAcquirer,\n beginTransaction: options.readonly === true ? \"BEGIN\" : \"BEGIN IMMEDIATE\",\n spanAttributes: [...(options.spanAttributes ? Object.entries(options.spanAttributes) : []), [ATTR_DB_SYSTEM_NAME, \"sqlite\"]],\n transformRows\n }), {\n [TypeId]: TypeId,\n config: options,\n backup: destination => Effect.flatMap(acquirer, _ => _.backup(destination)),\n loadExtension: path => Effect.flatMap(acquirer, _ => _.loadExtension(path))\n });\n});\n/**\n * Builds a layer from an Effect `Config` value, providing both the node `SqliteClient` service and the generic `SqlClient` service.\n *\n * @category layers\n * @since 4.0.0\n */\nexport const layerConfig = config => Layer.effectContext(Config.unwrap(config).pipe(Effect.flatMap(make), Effect.map(client => Context.make(SqliteClient, client).pipe(Context.add(Client.SqlClient, client))))).pipe(Layer.provide(Reactivity.layer));\n/**\n * Builds a layer from a node SQLite client configuration, providing both `SqliteClient` and the generic `SqlClient` service.\n *\n * @category layers\n * @since 4.0.0\n */\nexport const layer = config => Layer.effectContext(Effect.map(make(config), client => Context.make(SqliteClient, client).pipe(Context.add(Client.SqlClient, client)))).pipe(Layer.provide(Reactivity.layer));\n// internal\nconst classifyError = (cause, message, operation) => classifySqliteError(sqliteCauseWithErrno(cause), {\n message,\n operation\n});\nconst sqliteCauseWithErrno = cause => {\n if (typeof cause !== \"object\" || cause === null || !(\"errcode\" in cause) || \"errno\" in cause) {\n return cause;\n }\n const errcode = cause.errcode;\n if (typeof errcode !== \"number\") {\n return cause;\n }\n return Object.assign(cause, {\n errno: errcode\n });\n};\n//# sourceMappingURL=SqliteClient.js.map","var __rewriteRelativeImportExtension = this && this.__rewriteRelativeImportExtension || function (path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : d + ext + \".\" + cm.toLowerCase() + \"js\";\n });\n }\n return path;\n};\n/**\n * Runs SQL migrations with `SqlClient`.\n *\n * A migrator loads numbered migration effects, records completed ids in a\n * migrations table, and runs only pending migrations in a transaction. It\n * creates the table when needed, detects duplicate ids, treats concurrent runs\n * as locked, and can dump the schema after successful migrations.\n *\n * @since 4.0.0\n */\nimport * as Arr from \"../../Array.js\";\nimport * as Data from \"../../Data.js\";\nimport * as Effect from \"../../Effect.js\";\nimport { FileSystem } from \"../../FileSystem.js\";\nimport { pipe } from \"../../Function.js\";\nimport * as Option from \"../../Option.js\";\nimport * as Order from \"../../Order.js\";\nimport { Path } from \"../../Path.js\";\nimport * as Client from \"./SqlClient.js\";\n/**\n * Error raised while loading, validating, locking, or running SQL migrations.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class MigrationError extends /*#__PURE__*/Data.TaggedError(\"MigrationError\") {}\n/**\n * Creates a migrator that ensures the migrations table exists, runs pending\n * migrations in a transaction, and optionally dumps the schema after successful\n * migrations.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const make = ({\n dumpSchema = () => Effect.void\n}) => ({\n loader,\n schemaDirectory,\n table = \"effect_sql_migrations\"\n}) => Effect.gen(function* () {\n const sql = yield* Client.SqlClient;\n const ensureMigrationsTable = sql.onDialectOrElse({\n mssql: () => sql`IF OBJECT_ID(N'${sql.literal(table)}', N'U') IS NULL\n CREATE TABLE ${sql(table)} (\n migration_id INT NOT NULL PRIMARY KEY,\n name VARCHAR(255) NOT NULL,\n created_at DATETIME NOT NULL DEFAULT GETDATE()\n )`,\n mysql: () => sql`CREATE TABLE IF NOT EXISTS ${sql(table)} (\n migration_id INTEGER UNSIGNED NOT NULL,\n created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n name VARCHAR(255) NOT NULL,\n PRIMARY KEY (migration_id)\n)`,\n pg: () => Effect.catch(sql`select ${table}::regclass`, () => sql`CREATE TABLE ${sql(table)} (\n migration_id integer primary key,\n created_at timestamp with time zone not null default now(),\n name text not null\n)`),\n orElse: () => sql`CREATE TABLE IF NOT EXISTS ${sql(table)} (\n migration_id integer PRIMARY KEY NOT NULL,\n created_at datetime NOT NULL DEFAULT current_timestamp,\n name VARCHAR(255) NOT NULL\n)`\n });\n const insertMigrations = rows => sql`INSERT INTO ${sql(table)} ${sql.insert(rows.map(([migration_id, name]) => ({\n migration_id,\n name\n })))}`.withoutTransform;\n const latestMigration = Effect.map(sql`SELECT migration_id, name, created_at FROM ${sql(table)} ORDER BY migration_id DESC`.withoutTransform, _ => Option.map(Option.fromNullishOr(_[0]), ({\n created_at,\n migration_id,\n name\n }) => ({\n id: migration_id,\n name,\n createdAt: created_at\n })));\n const loadMigration = ([id, name, load]) => Effect.catchDefect(load, _ => Effect.fail(new MigrationError({\n kind: \"ImportError\",\n message: `Could not import migration \"${id}_${name}\"\\n\\n${_}`\n }))).pipe(Effect.flatMap(_ => Effect.isEffect(_) ? Effect.succeed(_) : _.default ? Effect.succeed(_.default?.default ?? _.default) : Effect.fail(new MigrationError({\n kind: \"ImportError\",\n message: `Default export not found for migration \"${id}_${name}\"`\n }))), Effect.filterOrFail(Effect.isEffect, () => new MigrationError({\n kind: \"ImportError\",\n message: `Default export was not an Effect for migration \"${id}_${name}\"`\n })));\n const runMigration = (id, name, effect) => Effect.catch(effect, error => Effect.die(new MigrationError({\n cause: error,\n kind: \"Failed\",\n message: `Migration \"${id}_${name}\" failed`\n })));\n // === run\n const run = Effect.gen(function* () {\n yield* sql.onDialectOrElse({\n pg: () => sql`LOCK TABLE ${sql(table)} IN ACCESS EXCLUSIVE MODE`,\n orElse: () => Effect.void\n });\n const [latestMigrationId, current] = yield* Effect.all([Effect.map(latestMigration, Option.match({\n onNone: () => 0,\n onSome: _ => _.id\n })), loader]);\n if (new Set(current.map(([id]) => id)).size !== current.length) {\n return yield* new MigrationError({\n kind: \"Duplicates\",\n message: \"Found duplicate migration id's\"\n });\n }\n const required = [];\n for (const resolved of current) {\n const [currentId, currentName] = resolved;\n if (currentId <= latestMigrationId) {\n continue;\n }\n required.push([currentId, currentName, yield* loadMigration(resolved)]);\n }\n if (required.length > 0) {\n yield* pipe(insertMigrations(required.map(([id, name]) => [id, name])), Effect.mapError(error => isConstraintConflict(error) ? new MigrationError({\n kind: \"Locked\",\n message: \"Migrations already running\"\n }) : error));\n }\n yield* Effect.forEach(required, ([id, name, effect]) => Effect.logDebug(`Running migration`).pipe(Effect.flatMap(() => runMigration(id, name, effect)), Effect.annotateLogs(\"migration_id\", String(id)), Effect.annotateLogs(\"migration_name\", name), Effect.withSpan(`Migrator ${id}_${name}`)), {\n discard: true\n });\n yield* pipe(latestMigration, Effect.flatMap(Option.match({\n onNone: () => Effect.logDebug(`Migrations complete`),\n onSome: _ => Effect.logDebug(`Migrations complete`).pipe(Effect.annotateLogs(\"latest_migration_id\", _.id.toString()), Effect.annotateLogs(\"latest_migration_name\", _.name))\n })));\n return required.map(([id, name]) => [id, name]);\n });\n yield* ensureMigrationsTable;\n const completed = yield* pipe(sql.withTransaction(run), Effect.catchTag(\"MigrationError\", _ => _.kind === \"Locked\" ? Effect.as(Effect.logDebug(_.message), []) : Effect.fail(_)));\n if (schemaDirectory && completed.length > 0) {\n yield* dumpSchema(`${schemaDirectory}/_schema.sql`, table).pipe(Effect.catchCause(cause => Effect.logInfo(\"Could not dump schema\", cause)));\n }\n return completed;\n});\nconst migrationOrder = /*#__PURE__*/Order.make(([a], [b]) => Order.Number(a, b));\nconst isConstraintConflict = error => error.reason._tag === \"ConstraintError\" || error.reason._tag === \"UniqueViolation\";\n/**\n * Creates a migration loader from a glob record of dynamic import functions,\n * parsing files named `<id>_<name>.js`, `<id>_<name>.ts`,\n * `<id>_<name>.mjs`, or `<id>_<name>.mts` and sorting migrations by id.\n *\n * @category loaders\n * @since 4.0.0\n */\nexport const fromGlob = migrations => pipe(Object.keys(migrations), Arr.flatMapNullishOr(_ => _.match(/^(?:.*\\/)?(\\d+)_([^.]+)\\.(js|ts|mjs|mts)$/)), Arr.map(([key, id, name]) => [Number(id), name, Effect.promise(() => migrations[key]())]), Arr.sort(migrationOrder), Effect.succeed);\n/**\n * Creates a migration loader from a Babel-style glob record, parsing keys such\n * as `_<id>_<name>Js`, `_<id>_<name>Ts`, `_<id>_<name>Mjs`, or\n * `_<id>_<name>Mts` and sorting migrations by id.\n *\n * @category loaders\n * @since 4.0.0\n */\nexport const fromBabelGlob = migrations => pipe(Object.keys(migrations), Arr.flatMapNullishOr(_ => _.match(/^_(\\d+)_([^.]+?)(Js|Ts|Mjs|Mts)?$/)), Arr.map(([key, id, name]) => [Number(id), name, Effect.succeed(migrations[key])]), Arr.sort(migrationOrder), Effect.succeed);\n/**\n * Creates a migration loader from a record of migration effects keyed by\n * `<id>_<name>`, sorted by migration id.\n *\n * @category loaders\n * @since 4.0.0\n */\nexport const fromRecord = migrations => pipe(Object.keys(migrations), Arr.flatMapNullishOr(_ => _.match(/^(\\d+)_(.+)$/)), Arr.map(([key, id, name]) => [Number(id), name, Effect.succeed(migrations[key])]), Arr.sort(migrationOrder), Effect.succeed);\n/**\n * Creates a migration loader that reads a directory with `FileSystem`, imports\n * files named `<id>_<name>.js`, `<id>_<name>.ts`,\n * `<id>_<name>.mjs`, or `<id>_<name>.mts`, and sorts migrations by id.\n *\n * **Details**\n *\n * Requires a `Path` service appropriate for the migration directory's path\n * syntax. On Windows, prefer a platform-aware implementation such as\n * `NodePath.layer`; the core `Path.layer` uses POSIX semantics and does not\n * preserve Windows drive-letter paths.\n *\n * @category loaders\n * @since 4.0.0\n */\nexport const fromFileSystem = /*#__PURE__*/Effect.fnUntraced(function* (directory) {\n const Fs = yield* FileSystem;\n const path = yield* Path;\n const files = yield* Effect.mapError(Fs.readDirectory(directory), cause => new MigrationError({\n kind: \"Failed\",\n cause,\n message: \"Failed to read migrations directory\"\n }));\n return files.map(file => Option.fromNullishOr(file.match(/^(?:.*\\/)?(\\d+)_([^.]+)\\.(js|ts|mjs|mts)$/))).flatMap(Option.match({\n onNone: () => [],\n onSome: ([basename, id, name]) => [[Number(id), name,\n // `import` needs a file URL: on Windows an absolute path such as\n // `D:\\migrations\\1_init.ts` is rejected by the ESM loader. `orDie` keeps the\n // failure a defect so `loadMigration` reports it as an import error.\n Effect.flatMap(Effect.orDie(path.toFileUrl(path.join(directory, basename))), url => Effect.promise(() => import(__rewriteRelativeImportExtension(/* @vite-ignore */\n /* webpackIgnore: true */\n url.href))))]]\n })).sort(([a], [b]) => a - b);\n});\n//# sourceMappingURL=Migrator.js.map","import * as Layer from \"effect/Layer\";\nimport * as Migrator from \"effect/unstable/sql/Migrator\";\n/**\n * @since 4.0.0\n */\nexport * from \"effect/unstable/sql/Migrator\";\n/**\n * Runs SQL migrations for a SQLite database using the shared `Migrator` implementation and the current `SqlClient`.\n *\n * @category running\n * @since 4.0.0\n */\nexport const run = /*#__PURE__*/Migrator.make({\n // dumpSchema(path, table) {\n // const dump = (args: Array<string>) =>\n // Effect.gen(function*() {\n // const sql = yield* SqliteClient\n // const dump = yield* pipe(\n // Command.make(\"sqlite3\", sql.config.filename, ...args),\n // Command.string\n // )\n // return dump.replace(/^create table sqlite_sequence\\(.*$/im, \"\")\n // .replace(/\\n{2,}/gm, \"\\n\\n\")\n // .trim()\n // }).pipe(\n // Effect.mapError((error) => new Migrator.MigrationError({ kind: \"Failed\", message: error.message }))\n // )\n //\n // const dumpSchema = dump([\".schema\"])\n //\n // const dumpMigrations = dump([\n // \"--cmd\",\n // `.mode insert ${table}`,\n // `select * from ${table}`\n // ])\n //\n // const dumpAll = Effect.map(\n // Effect.all([dumpSchema, dumpMigrations], { concurrency: 2 }),\n // ([schema, migrations]) => schema + \"\\n\\n\" + migrations\n // )\n //\n // const dumpFile = (file: string) =>\n // Effect.gen(function*() {\n // const fs = yield* FileSystem\n // const path = yield* Path\n // const dump = yield* dumpAll\n // yield* fs.makeDirectory(path.dirname(file), { recursive: true })\n // yield* fs.writeFileString(file, dump)\n // }).pipe(\n // Effect.mapError((error) => new Migrator.MigrationError({ kind: \"Failed\", message: error.message }))\n // )\n //\n // return dumpFile(path)\n // }\n});\n/**\n * Creates a layer that runs the configured SQLite migrations during layer construction and provides no services.\n *\n * @category layers\n * @since 4.0.0\n */\nexport const layer = options => Layer.effectDiscard(run(options));\n//# sourceMappingURL=SqliteMigrator.js.map","/**\n * @since 1.0.0\n */\nimport * as SqliteClient from \"@effect/sql-sqlite-node/SqliteClient\"\nimport * as SqliteMigrator from \"@effect/sql-sqlite-node/SqliteMigrator\"\nimport * as Effect from \"effect/Effect\"\nimport * as Layer from \"effect/Layer\"\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\"\nimport * as FileSystem from \"effect/FileSystem\"\nimport * as Path from \"effect/Path\"\nimport { getLoadablePath } from \"sqlite-vec\"\n\n/**\n * @since 1.0.0\n * @category Layers\n */\nexport const SqliteLayer = (database: string) =>\n SqliteMigrator.layer({\n loader: SqliteMigrator.fromRecord({\n \"0001_create_chunks\": Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient\n\n yield* sql`CREATE TABLE IF NOT EXISTS chunks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n path TEXT NOT NULL,\n content TEXT NOT NULL,\n hash TEXT NOT NULL,\n vector BLOB NOT NULL,\n syncId TEXT NOT NULL\n )`\n\n yield* sql`CREATE INDEX IF NOT EXISTS idx_chunks_hash ON chunks (hash)`\n }),\n }),\n }).pipe(\n Layer.provide(\n Layer.effectDiscard(\n Effect.gen(function* () {\n const client = yield* SqliteClient.SqliteClient\n yield* client.loadExtension(getLoadablePath())\n }),\n ),\n ),\n Layer.provideMerge(\n SqliteClient.layer({\n filename: database,\n }),\n ),\n Layer.provide(\n Layer.effectDiscard(\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem\n const path = yield* Path.Path\n const directory = path.dirname(database)\n if (directory === \".\") return\n yield* fs.makeDirectory(directory, { recursive: true })\n }),\n ),\n ),\n )\n","/**\n * @since 1.0.0\n */\nimport { createHash } from \"node:crypto\"\nimport * as Effect from \"effect/Effect\"\nimport * as ChunkRepo from \"./ChunkRepo.ts\"\nimport * as CodeChunker from \"./CodeChunker.ts\"\nimport * as Layer from \"effect/Layer\"\nimport * as Stream from \"effect/Stream\"\nimport { pipe } from \"effect/Function\"\nimport * as EmbeddingModel from \"effect/unstable/ai/EmbeddingModel\"\nimport * as RequestResolver from \"effect/RequestResolver\"\nimport * as Option from \"effect/Option\"\nimport * as Path from \"effect/Path\"\nimport * as Fiber from \"effect/Fiber\"\nimport * as Duration from \"effect/Duration\"\nimport * as FiberHandle from \"effect/FiberHandle\"\nimport { SqliteLayer } from \"./Sqlite.ts\"\nimport type * as SqlError from \"effect/unstable/sql/SqlError\"\nimport type * as SqliteMigrator from \"@effect/sql-sqlite-node/SqliteMigrator\"\nimport type * as PlatformError from \"effect/PlatformError\"\nimport type * as ChildProcessSpawner from \"effect/unstable/process/ChildProcessSpawner\"\nimport type * as FileSystem from \"effect/FileSystem\"\nimport * as Console from \"effect/Console\"\nimport { SemanticSearch } from \"./SemanticSearch/Service.ts\"\n\n/**\n * @since 1.0.0\n * @category Services\n */\nexport * from \"./SemanticSearch/Service.ts\"\n\nconst normalizePath = (path: string) => path.replace(/\\\\/g, \"/\")\n\nconst resolveChunkConfig = (options: {\n readonly chunkMaxCharacters?: number | undefined\n}) => ({\n chunkSize: 30,\n chunkOverlap: 0,\n chunkMaxCharacters: options.chunkMaxCharacters ?? 15_000,\n})\n\nexport const makeEmbeddingResolver = (\n resolver: EmbeddingModel.EmbeddingModel[\"resolver\"],\n options: {\n readonly embeddingBatchSize?: number | undefined\n readonly embeddingRequestDelay?: Duration.Input | undefined\n },\n): EmbeddingModel.EmbeddingModel[\"resolver\"] =>\n resolver.pipe(\n RequestResolver.setDelay(\n options.embeddingRequestDelay ?? Duration.millis(50),\n ),\n RequestResolver.batchN(options.embeddingBatchSize ?? 32),\n )\n\nexport const chunkEmbeddingInput = (chunk: CodeChunker.CodeChunk): string => {\n const headerLines = [\"---\", \"file: \" + chunk.path]\n\n if (chunk.name !== undefined) {\n headerLines.push(\"name: \" + chunk.name)\n }\n if (chunk.type !== undefined) {\n headerLines.push(\"type: \" + chunk.type)\n }\n if (chunk.parent !== undefined) {\n headerLines.push(\"parent: \" + chunk.parent)\n }\n headerLines.push(\"---\")\n\n const contentLines = chunk.content.split(\"\\n\")\n let contentWithLines = \"\"\n for (let i = 0; i < contentLines.length; i++) {\n if (i > 0) {\n contentWithLines += \"\\n\"\n }\n contentWithLines += `${chunk.startLine + i}: ${contentLines[i]}`\n }\n\n return headerLines.join(\"\\n\") + \"\\n\\n\" + contentWithLines\n}\n\nconst hashChunkInput = (input: string): string =>\n createHash(\"sha256\").update(input).digest(\"hex\")\n\n/**\n * @since 1.0.0\n * @category Layers\n */\nexport const layer = (options: {\n readonly directory: string\n readonly database?: string | undefined\n readonly embeddingBatchSize?: number | undefined\n readonly embeddingRequestDelay?: Duration.Input | undefined\n readonly concurrency?: number | undefined\n readonly chunkMaxCharacters?: number | undefined\n}): Layer.Layer<\n SemanticSearch,\n | SqlError.SqlError\n | SqliteMigrator.MigrationError\n | PlatformError.PlatformError,\n | EmbeddingModel.EmbeddingModel\n | Path.Path\n | ChildProcessSpawner.ChildProcessSpawner\n | FileSystem.FileSystem\n | EmbeddingModel.Dimensions\n> =>\n Layer.effect(\n SemanticSearch,\n Effect.gen(function* () {\n const chunker = yield* CodeChunker.CodeChunker\n const repo = yield* ChunkRepo.ChunkRepo\n const embeddings = yield* EmbeddingModel.EmbeddingModel\n const pathService = yield* Path.Path\n const root = pathService.resolve(options.directory)\n const resolver = makeEmbeddingResolver(embeddings.resolver, options)\n const concurrency = options.concurrency ?? 2000\n const chunkConfig = resolveChunkConfig(options)\n const indexHandle = yield* FiberHandle.make()\n const console = yield* Console.Console\n\n const resolveIndexedPath = (path: string): Option.Option<string> => {\n const absolutePath = pathService.resolve(root, path)\n const relativePath = normalizePath(\n pathService.relative(root, absolutePath),\n )\n if (\n relativePath.length === 0 ||\n relativePath === \"..\" ||\n relativePath.startsWith(\"../\")\n ) {\n return Option.none()\n }\n return Option.some(relativePath)\n }\n\n const processChunk = Effect.fnUntraced(\n function* (options: {\n readonly chunk: CodeChunker.CodeChunk\n readonly syncId: ChunkRepo.SyncId\n readonly checkExisting: boolean\n }) {\n const input = chunkEmbeddingInput(options.chunk)\n const hash = hashChunkInput(input)\n\n if (options.checkExisting) {\n const id = yield* repo.exists(hash)\n if (Option.isSome(id)) {\n yield* repo.setSyncId(id.value, options.syncId)\n return\n }\n }\n\n const result = yield* Effect.request(\n new EmbeddingModel.EmbeddingRequest({ input }),\n resolver,\n )\n const vector = new Float32Array(result.vector)\n yield* repo.insert(\n ChunkRepo.Chunk.insert.make({\n path: options.chunk.path,\n hash,\n content: input,\n vector,\n syncId: options.syncId,\n }),\n )\n },\n Effect.ignore({\n log: \"Warn\",\n message: \"Failed to process chunk for embedding\",\n }),\n (effect, options) =>\n Effect.annotateLogs(effect, {\n chunk: `${options.chunk.path}/${options.chunk.startLine}`,\n }),\n )\n\n const index = Effect.gen(function* () {\n const syncId = ChunkRepo.SyncId.make(crypto.randomUUID())\n yield* Effect.logInfo(\"Starting SemanticSearch index\")\n\n yield* pipe(\n chunker.chunkCodebase({\n root,\n ...chunkConfig,\n }),\n Stream.tap(\n (chunk) =>\n processChunk({\n chunk,\n syncId,\n checkExisting: true,\n }),\n { concurrency },\n ),\n Stream.runDrain,\n )\n\n yield* repo.deleteForSyncId(syncId)\n\n yield* Effect.logInfo(\"Finished SemanticSearch index\")\n }).pipe(\n Effect.withSpan(\"SemanticSearch.index\"),\n Effect.withLogSpan(\"SemanticSearch.index\"),\n Effect.provideService(Console.Console, console),\n )\n\n const runIndex = FiberHandle.run(indexHandle, index, {\n onlyIfMissing: true,\n })\n\n const initialIndex = yield* runIndex\n yield* runIndex.pipe(\n Effect.delay(Duration.minutes(3)),\n Effect.forever,\n Effect.forkScoped,\n )\n\n return SemanticSearch.of({\n search: Effect.fn(\"SemanticSearch.search\")(function* (options) {\n yield* Fiber.join(initialIndex)\n yield* Effect.annotateCurrentSpan(options)\n const { vector } = yield* embeddings.embed(options.query)\n const results = yield* repo.search({\n vector: new Float32Array(vector),\n limit: options.limit,\n })\n return results.map((r) => r.content).join(\"\\n\\n\")\n }, Effect.orDie),\n updateFile: Effect.fn(\"SemanticSearch.updateFile\")(function* (path) {\n yield* Fiber.join(initialIndex)\n const indexedPath = resolveIndexedPath(path)\n if (Option.isNone(indexedPath)) {\n return\n }\n\n yield* repo.deleteByPath(indexedPath.value)\n\n const chunks = yield* chunker.chunkFile({\n root,\n path: indexedPath.value,\n ...chunkConfig,\n })\n if (chunks.length === 0) {\n return\n }\n\n const syncId = ChunkRepo.SyncId.make(crypto.randomUUID())\n\n yield* pipe(\n Stream.fromArray(chunks),\n Stream.tap(\n (chunk) =>\n processChunk({\n chunk,\n syncId,\n checkExisting: false,\n }),\n { concurrency },\n ),\n Stream.runDrain,\n )\n }, Effect.orDie),\n removeFile: Effect.fn(\"SemanticSearch.removeFile\")(function* (path) {\n yield* Fiber.join(initialIndex)\n const indexedPath = resolveIndexedPath(path)\n if (Option.isNone(indexedPath)) {\n return\n }\n yield* repo.deleteByPath(indexedPath.value)\n }, Effect.orDie),\n })\n }),\n ).pipe(\n Layer.provide([\n CodeChunker.layer,\n ChunkRepo.layer.pipe(\n Layer.provide(SqliteLayer(options.database ?? \".clanka/search.sqlite\")),\n ),\n ]),\n )\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,12,13,14,15],"mappings":"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"}
1
+ {"version":3,"file":"SemanticSearch-CBs6yELV.mjs","names":["TypeId","make","Effect.contextWith","Context.getOrUndefined","Effect.void","Effect.tap","Effect.gen","Effect.context","Context.get","Scope.Scope","Queue.make","Effect.runForkWith","Fiber.runIn","Scope.addFinalizer","Effect.sync","Effect.map","Stream.fromQueue","Stream.unwrap","Effect.suspend","Effect.provideService","Effect.onExit","layer","Hash.hash","make","makeUnsafe","Effect.useSpan","Effect.scoped","Effect.flatMap","Effect.provideService","Tracer.ParentSpan","Stream.unwrap","Effect.makeSpanScoped","Effect.map","Effect.succeed","Stream.provideService","internalEffect.makeSpanUnsafe","Effect.onExit","internalEffect.endSpan","Effect.withFiber","TypeId","make","Effect.flatMap","Effect.serviceOption","Option.match","Effect.succeed","Scope.make","Effect.map","Scope.provide","Statement.make","Stream.fromQueue","Stream.unwrap","Context.Service","Effect.uninterruptibleMask","Effect.useSpan","Effect.withFiber","Context.getOption","Effect.onExitPrimitive","Effect.provideContext","Context.add","Semaphore.makeUnsafe","Tracer.ParentSpan","Exit.isSuccess","Effect.orDie","Effect.void","Scope.close","Context.getUnsafe","TypeId","effect.contextWith","Proto","effect.updateContext","Context.merge","MutableHashMap.make","Duration.fromInputUnsafe","effect.succeed","make","Duration.infinity","core.withFiber","MutableHashMap.get","Option.isSome","effect.exitHasInterrupts","Duration.isFinite","effect.ClockRef","Duration.toMillis","Duration.isZero","effect.forkUnsafe","effect.onExit","effect.fiberJoin","effect.void","effect.fiberInterrupt","MutableHashMap.size","TypeId","Predicate.hasProperty","extract","Schema.isSchema","Schema.Struct","make","Struct","Schema.Class","Field","Union","Struct_.evolve","Schema.decodeTo","Schema.brand","Schema.toType","Schema.withConstructorDefault","Effect.map","Schema.Union","Schema.optionalKey","Schema.NullOr","Schema.decodeTo","Schema.Option","Schema.toType","SchemaTransformation.transformOptional","Option.filter","Predicate.isNotNull","Option.some","Option.flatten","Schema.OptionFromNullOr","Schema.BooleanFromBit","Schema.Boolean","Date","Schema.DateTimeUtc","DateTime.removeTime","DateTime.formatIsoDate","DateTime.now","Schema.DateTimeUtcFromString","Schema.DateTimeUtcFromDate","Schema.DateTimeUtcFromMillis","TypeId","Schema.String","Predicate.hasProperty","Schema.Natural","Equal.symbol","Equal.equals","Hash.symbol","Hash.hash","Effect.request","Schema.decodeUnknownEffect","Schema.Array","RequestResolver.makeGrouped","Effect.fnUntraced","Arr.isArrayNonEmpty","Effect.provideContext","Exit.succeed","MutableHashMap.get","MutableHashMap.isEmpty","Exit.void","Cause.NoSuchElementError","Arr.empty","Schema.encodeEffect","Effect.matchCauseEager","Exit.failCause","MutableHashMap.empty","Option.isSome","Context.getOrUndefined","SqlClient.SqlClient","Equal.byReferenceUnsafe","Schema.encodeEffect","Schema.decodeUnknownEffect","Schema.mutable","Schema.Array","Effect.flatMap","Effect.gen","SqlResolver.ordered","Effect.forEach","Effect.map","RequestResolver.withSpan","SqlResolver.void","SqlResolver.findById","Schema.brand","Schema.instanceOf","Schema.Array","Schema.Number","Schema.decodeTo","SchemaTransformation.transform","Model.Field","Model.Class","Model.FieldExcept","Schema.String","Context.Service","Schema.TaggedError","Schema.Union","SqlError.SqlError","layer","Layer.effect","Effect.gen","SqlClient.SqlClient","EmbeddingModel.Dimensions","SqlModel.makeResolvers","SqlSchema.findAll","Schema.Struct","SqlResolver.findById","RequestResolver.setDelay","SqlResolver.request","Effect.catchTags","Effect.die","Effect.fail","Effect.map","Effect.catchNoSuchElement","Effect.fn","Effect.void","Effect.mapError","Context.Service","normalizePath","layer","Layer.effect","Effect.gen","ChildProcessSpawner.ChildProcessSpawner","FileSystem.FileSystem","Path.Path","Effect.fn","ChildProcess.make","Stream.runCollect","Effect.map","Array.fromIterable","Effect.orDie","Effect.orElseSucceed","Stream.fromArray","Stream.flatMap","Stream.fromArrayEffect","Effect.fnUntraced","Stream.unwrap","TypeId","Predicate.hasProperty","Deferred.makeUnsafe","make","Effect.acquireRelease","Effect.sync","Effect.void","Deferred.into","Effect.asVoid","Fiber.interruptAs","Deferred.done","Exit.void","Cause.filterInterruptors","Exit.isFailure","Cause.hasInterruptsOnly","Effect.runFork","Effect.interrupt","run","Effect.isEffect","Effect.withFiber","Effect.runForkWith","Effect.succeed","make","Effect.gen","Statement.makeCompilerSqlite","Statement.defaultTransforms","scope","Effect.scope","Scope.addFinalizer","Effect.sync","Duration.toMillis","Duration.seconds","Effect.try","Cache.make","Duration.minutes","Effect.withFiber","Context.get","Client.SafeIntegers","Effect.flatMap","Cache.get","Effect.acquireUseRelease","Effect.map","Stream.die","Effect.suspend","Effect.tryPromise","backupDatabase","Semaphore.make","Effect.succeed","Effect.uninterruptibleMask","Fiber.getCurrent","Context.getUnsafe","Scope.Scope","Effect.as","Effect.tap","Client.make","layer","Layer.effectContext","Context.make","Context.add","Client.SqlClient","Layer.provide","Reactivity.layer","Effect.void","Effect.gen","Client.SqlClient","Effect.catch","Effect.map","Option.map","Option.fromNullishOr","Effect.catchDefect","Effect.fail","Effect.flatMap","Effect.isEffect","Effect.succeed","Effect.filterOrFail","Effect.die","Effect.all","Option.match","Effect.mapError","Effect.forEach","Effect.logDebug","Effect.annotateLogs","Effect.withSpan","Effect.catchTag","Effect.as","Effect.catchCause","Effect.logInfo","Order.Number","Arr.flatMapNullishOr","Arr.map","Arr.sort","layer","Layer.effectDiscard","SqliteMigrator.layer","SqliteMigrator.fromRecord","Effect.gen","SqlClient.SqlClient","Layer.provide","Layer.effectDiscard","SqliteClient.SqliteClient","Layer.provideMerge","SqliteClient.layer","FileSystem.FileSystem","Path.Path","RequestResolver.setDelay","Duration.millis","RequestResolver.batchN","Layer.effect","Effect.gen","CodeChunker.CodeChunker","ChunkRepo.ChunkRepo","EmbeddingModel.EmbeddingModel","Path.Path","FiberHandle.make","Console.Console","Option.none","Option.some","Effect.fnUntraced","Option.isSome","Effect.request","EmbeddingModel.EmbeddingRequest","Effect.ignore","Effect.annotateLogs","Effect.logInfo","Stream.tap","Stream.runDrain","Effect.withSpan","Effect.withLogSpan","Effect.provideService","FiberHandle.run","Effect.delay","Duration.minutes","Effect.forever","Effect.forkScoped","Effect.fn","Fiber.join","Effect.annotateCurrentSpan","Effect.orDie","Option.isNone","Stream.fromArray","Layer.provide","CodeChunker.layer"],"sources":["../../node_modules/.pnpm/effect@4.0.0-rc.115/node_modules/effect/dist/unstable/reactivity/Reactivity.js","../../node_modules/.pnpm/effect@4.0.0-rc.115/node_modules/effect/dist/unstable/sql/Statement.js","../../node_modules/.pnpm/effect@4.0.0-rc.115/node_modules/effect/dist/unstable/sql/SqlClient.js","../../node_modules/.pnpm/effect@4.0.0-rc.115/node_modules/effect/dist/Cache.js","../../node_modules/.pnpm/effect@4.0.0-rc.115/node_modules/effect/dist/unstable/schema/VariantSchema.js","../../node_modules/.pnpm/effect@4.0.0-rc.115/node_modules/effect/dist/unstable/schema/Model.js","../../node_modules/.pnpm/effect@4.0.0-rc.115/node_modules/effect/dist/unstable/sql/SqlError.js","../../node_modules/.pnpm/effect@4.0.0-rc.115/node_modules/effect/dist/unstable/sql/SqlResolver.js","../../node_modules/.pnpm/effect@4.0.0-rc.115/node_modules/effect/dist/unstable/sql/SqlSchema.js","../../node_modules/.pnpm/effect@4.0.0-rc.115/node_modules/effect/dist/unstable/sql/SqlModel.js","../../src/ChunkRepo.ts","../../src/CodeChunker.ts","../../node_modules/.pnpm/effect@4.0.0-rc.115/node_modules/effect/dist/FiberHandle.js","../../node_modules/.pnpm/@effect+sql-sqlite-node@4.0.0-rc.115_effect@4.0.0-rc.115/node_modules/@effect/sql-sqlite-node/dist/SqliteClient.js","../../node_modules/.pnpm/effect@4.0.0-rc.115/node_modules/effect/dist/unstable/sql/Migrator.js","../../node_modules/.pnpm/@effect+sql-sqlite-node@4.0.0-rc.115_effect@4.0.0-rc.115/node_modules/@effect/sql-sqlite-node/dist/SqliteMigrator.js","../../src/Sqlite.ts","../../src/SemanticSearch.ts"],"sourcesContent":["/**\n * Process-local invalidation for connecting writes to dependent reads.\n *\n * This module does not cache values itself. It lets callers register handlers\n * for keys, invalidate those keys, wrap successful mutations so they invalidate\n * keys, and expose effects as queues or streams that rerun when matching keys\n * change. The service can also batch invalidations so handlers run after the\n * batch completes.\n *\n * @since 4.0.0\n */\nimport * as Context from \"../../Context.js\";\nimport * as Effect from \"../../Effect.js\";\nimport * as Fiber from \"../../Fiber.js\";\nimport { dual, flow } from \"../../Function.js\";\nimport * as Hash from \"../../Hash.js\";\nimport * as Layer from \"../../Layer.js\";\nimport * as Queue from \"../../Queue.js\";\nimport * as Scope from \"../../Scope.js\";\nimport * as Stream from \"../../Stream.js\";\n/**\n * Brand for `Reactivity` implementations.\n *\n * @category type IDs\n * @since 4.0.0\n */\nexport const TypeId = \"~effect/reactivity/Reactivity\";\n/**\n * Service key for reactive invalidation.\n *\n * @category services\n * @since 4.0.0\n */\nexport const Reactivity = /*#__PURE__*/Context.Service(\"effect/reactivity/Reactivity\");\n/**\n * Creates an in-memory `Reactivity` service.\n *\n * **Details**\n *\n * The service tracks handlers by hashed keys and runs the registered handlers when\n * matching keys are invalidated.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const make = /*#__PURE__*/Effect.sync(() => {\n const handlers = new Map();\n const invalidateUnsafe = keys => {\n keysToHashes(keys, hash => {\n const set = handlers.get(hash);\n if (set === undefined) return;\n set.forEach(run => run());\n });\n };\n const invalidate = keys => Effect.contextWith(services => {\n const pending = Context.getOrUndefined(services, PendingInvalidation);\n if (pending) {\n keysToHashes(keys, hash => {\n pending.add(hash);\n });\n } else {\n invalidateUnsafe(keys);\n }\n return Effect.void;\n });\n const mutation = (keys, effect) => Effect.tap(effect, invalidate(keys));\n const registerUnsafe = (keys, handler) => {\n const resolvedKeys = [];\n keysToHashes(keys, hash => {\n resolvedKeys.push(hash);\n let set = handlers.get(hash);\n if (set === undefined) {\n set = new Set();\n handlers.set(hash, set);\n }\n set.add(handler);\n });\n return () => {\n for (let i = 0; i < resolvedKeys.length; i++) {\n const set = handlers.get(resolvedKeys[i]);\n if (set === undefined) continue;\n set.delete(handler);\n if (set.size === 0) {\n handlers.delete(resolvedKeys[i]);\n }\n }\n };\n };\n const query = (keys, effect) => Effect.gen(function* () {\n const services = yield* Effect.context();\n const scope = Context.get(services, Scope.Scope);\n const results = yield* Queue.make();\n const runFork = flow(Effect.runForkWith(services), Fiber.runIn(scope));\n let running = false;\n let pending = false;\n const handleExit = exit => {\n if (exit._tag === \"Failure\") {\n Queue.failCauseUnsafe(results, exit.cause);\n } else {\n Queue.offerUnsafe(results, exit.value);\n }\n if (pending) {\n pending = false;\n runFork(effect).addObserver(handleExit);\n } else {\n running = false;\n }\n };\n function run() {\n if (running) {\n pending = true;\n return;\n }\n running = true;\n runFork(effect).addObserver(handleExit);\n }\n const cancel = registerUnsafe(keys, run);\n yield* Scope.addFinalizer(scope, Effect.sync(cancel));\n run();\n return results;\n });\n const stream = (tables, effect) => query(tables, effect).pipe(Effect.map(Stream.fromQueue), Stream.unwrap);\n const withBatch = effect => Effect.suspend(() => {\n const pending = new Set();\n return effect.pipe(Effect.provideService(PendingInvalidation, pending), Effect.onExit(_ => Effect.sync(() => {\n pending.forEach(hash => {\n const set = handlers.get(hash);\n if (set === undefined) return;\n set.forEach(run => run());\n });\n })));\n });\n return Reactivity.of({\n [TypeId]: TypeId,\n mutation,\n query,\n stream,\n invalidateUnsafe,\n invalidate,\n registerUnsafe,\n withBatch\n });\n});\nclass PendingInvalidation extends /*#__PURE__*/Context.Service()(\"effect/reactivity/Reactivity/PendingInvalidation\") {}\n/**\n * Wraps an effect so the supplied keys are invalidated after the effect succeeds.\n *\n * **Gotchas**\n *\n * If the effect fails, the keys are not invalidated.\n *\n * @category accessors\n * @since 4.0.0\n */\nexport const mutation = /*#__PURE__*/dual(2, (effect, keys) => Reactivity.use(_ => _.mutation(keys, effect)));\n/**\n * Runs an effect as a query tied to the supplied invalidation keys.\n *\n * **Details**\n *\n * The returned queue receives the initial result and each later result after the\n * keys are invalidated. The registration is removed when the current scope closes.\n *\n * @category accessors\n * @since 4.0.0\n */\nexport const query = /*#__PURE__*/dual(2, (effect, keys) => Reactivity.use(r => r.query(keys, effect)));\n/**\n * Runs an effect as a stream of query results tied to the supplied invalidation\n * keys.\n *\n * **Details**\n *\n * The effect runs initially and reruns whenever the keys are invalidated.\n *\n * @category accessors\n * @since 4.0.0\n */\nexport const stream = /*#__PURE__*/dual(2, (effect, keys) => Reactivity.use(r => r.query(keys, effect)).pipe(Effect.map(Stream.fromQueue), Stream.unwrap));\n/**\n * Invalidates the supplied keys through the `Reactivity` service.\n *\n * **Details**\n *\n * Registered queries for matching keys are rerun immediately, or collected until\n * the enclosing reactivity batch completes.\n *\n * @category accessors\n * @since 4.0.0\n */\nexport const invalidate = keys => Reactivity.use(r => r.invalidate(keys));\n/**\n * The default layer that provides an in-memory `Reactivity` service.\n *\n * @category layers\n * @since 4.0.0\n */\nexport const layer = /*#__PURE__*/Layer.effect(Reactivity)(make);\nfunction stringOrHash(u) {\n switch (typeof u) {\n case \"string\":\n case \"number\":\n case \"bigint\":\n case \"boolean\":\n return String(u);\n default:\n return Hash.hash(u);\n }\n}\nconst keysToHashes = (keys, f) => {\n if (Array.isArray(keys)) {\n for (let i = 0; i < keys.length; i++) {\n f(stringOrHash(keys[i]));\n }\n return;\n }\n for (const key in keys) {\n f(key);\n const ids = keys[key];\n for (let i = 0; i < ids.length; i++) {\n f(`${key}:${stringOrHash(ids[i])}`);\n }\n }\n};\n//# sourceMappingURL=Reactivity.js.map","/**\n * Low-level SQL statement and fragment primitives.\n *\n * `SqlClient` uses this module to build executable, parameterized SQL from\n * reusable fragments. A statement can be executed, streamed, run without row\n * transformation, or compiled to SQL text and parameters for a specific\n * dialect. The module also contains helpers for identifiers, parameters,\n * inserts, updates, custom dialect fragments, statement compilation, and row\n * transformation.\n *\n * @since 4.0.0\n */\nimport { Clock } from \"../../Clock.js\";\nimport * as Context from \"../../Context.js\";\nimport * as Effect from \"../../Effect.js\";\nimport * as Effectable from \"../../Effectable.js\";\nimport { constUndefined } from \"../../Function.js\";\nimport * as internalEffect from \"../../internal/effect.js\";\nimport * as InternalRecord from \"../../internal/record.js\";\nimport { hasProperty } from \"../../Predicate.js\";\nimport { TracerTimingEnabled } from \"../../References.js\";\nimport * as Stream from \"../../Stream.js\";\nimport * as Tracer from \"../../Tracer.js\";\nconst FragmentTypeId = \"~effect/sql/Statement/Fragment\";\n/**\n * Constructs a SQL `Fragment` from low-level statement segments.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const fragment = segments => ({\n [FragmentTypeId]: FragmentTypeId,\n segments\n});\n/**\n * Context reference for an optional current SQL statement transformer applied\n * before statement execution.\n *\n * @category services\n * @since 4.0.0\n */\nexport const CurrentTransformer = /*#__PURE__*/Context.Reference(\"effect/sql/CurrentTransformer\", {\n defaultValue: constUndefined\n});\n/**\n * Parents driver spans under `sql.execute` for every client in the current scope,\n * including acquisition and stream pulls. Defaults to `false`; ignored when tracing is disabled.\n *\n * @category services\n * @since 4.0.0\n */\nexport const SpanPropagationEnabled = /*#__PURE__*/Context.Reference(\"effect/sql/SpanPropagationEnabled\", {\n defaultValue: () => false\n});\n/**\n * Returns `true` when a value is a SQL `Fragment`.\n *\n * @category guards\n * @since 4.0.0\n */\nexport const isFragment = u => hasProperty(u, FragmentTypeId);\n/**\n * Creates a type guard for custom SQL segments with the specified custom kind.\n *\n * @category guards\n * @since 4.0.0\n */\nexport const isCustom = kind => u => hasProperty(u, \"_tag\") && u._tag === \"Custom\" && u.kind === kind;\n/**\n * Constructs a raw SQL literal segment. The literal text is not escaped, so use\n * bound parameters for untrusted values.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const literal = (value, params) => ({\n _tag: \"Literal\",\n value,\n params\n});\n/**\n * Constructs a SQL identifier segment that will be escaped by the active\n * compiler.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const identifier = value => ({\n _tag: \"Identifier\",\n value\n});\n/**\n * Constructs a bound parameter segment for a statement value.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const parameter = value => ({\n _tag: \"Parameter\",\n value\n});\n/**\n * Constructs an `ArrayHelper` segment for an array of values or fragments.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const arrayHelper = value => ({\n _tag: \"ArrayHelper\",\n value\n});\nconst RecordInsertHelperProto = {\n _tag: \"RecordInsertHelper\",\n returning(sql) {\n const self = Object.create(Object.getPrototypeOf(this));\n Object.assign(self, this, {\n returningIdentifier: typeof sql === \"string\" || isFragment(sql) ? sql : fragment([sql])\n });\n return self;\n }\n};\n/**\n * Constructs a `RecordInsertHelper` from one or more row objects.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const recordInsertHelper = value => Object.assign(Object.create(RecordInsertHelperProto), {\n value,\n returningIdentifier: undefined\n});\nconst RecordUpdateHelperProto = {\n ...RecordInsertHelperProto,\n _tag: \"RecordUpdateHelper\"\n};\n/**\n * Constructs a `RecordUpdateHelper` for multi-row update compilation using the\n * provided alias.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const recordUpdateHelper = (value, alias) => Object.assign(Object.create(RecordUpdateHelperProto), {\n value,\n alias,\n returningIdentifier: undefined\n});\nconst RecordUpdateHelperSingleProto = {\n ...RecordInsertHelperProto,\n _tag: \"RecordUpdateHelperSingle\"\n};\n/**\n * Constructs a `RecordUpdateHelperSingle` from a record and a list of columns\n * to omit from the update.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const recordUpdateHelperSingle = (value, omit) => Object.assign(Object.create(RecordUpdateHelperSingleProto), {\n value,\n omit,\n returningIdentifier: undefined\n});\n/**\n * Creates a constructor for custom SQL segments of a specific kind handled by\n * the active compiler.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const custom = kind => (paramA, paramB, paramC) => ({\n _tag: \"Custom\",\n kind,\n paramA,\n paramB,\n paramC\n});\n/**\n * Creates a cached SQL statement constructor from a connection acquirer,\n * compiler, tracing attributes, and optional row transformation function.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const make = (acquirer, compiler, spanAttributes, transformRows, borrower) => {\n const cache = transformRows === undefined ? constructorCache.noTransforms : constructorCache.transforms;\n if (cache.has(acquirer)) {\n return cache.get(acquirer);\n }\n const self = Object.assign(function sql(strings, ...args) {\n if (typeof strings === \"string\") {\n return identifier(strings);\n } else if (Array.isArray(strings) && \"raw\" in strings) {\n return statement(acquirer, compiler, strings, args, spanAttributes, transformRows, borrower);\n }\n throw \"absurd\";\n }, {\n unsafe(sql, params) {\n return makeUnsafe([literal(sql, params)], acquirer, compiler, spanAttributes, transformRows, borrower);\n },\n literal(sql) {\n return fragment([literal(sql)]);\n },\n in: in_,\n insert(value) {\n return recordInsertHelper(Array.isArray(value) ? value : [value]);\n },\n update(value, omit) {\n return recordUpdateHelperSingle(value, omit ?? []);\n },\n updateValues(value, alias) {\n return recordUpdateHelper(value, alias);\n },\n and,\n or,\n csv,\n join,\n onDialect(options) {\n return options[compiler.dialect]();\n },\n onDialectOrElse(options) {\n return options[compiler.dialect] !== undefined ? options[compiler.dialect]() : options.orElse();\n }\n });\n cache.set(acquirer, self);\n return self;\n};\nconst constructorCache = {\n transforms: /*#__PURE__*/new WeakMap(),\n noTransforms: /*#__PURE__*/new WeakMap()\n};\n/**\n * Builds a `Statement` from template strings and arguments, preserving\n * fragments and helper segments while converting ordinary interpolated values\n * into bound parameters.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const statement = (acquirer, compiler, strings, args, spanAttributes, transformRows, borrower) => {\n const segments = strings[0].length > 0 ? [literal(strings[0])] : [];\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (isFragment(arg)) {\n segments.push(...arg.segments);\n } else if (isSegment(arg)) {\n segments.push(arg);\n } else {\n segments.push(parameter(arg));\n }\n if (strings[i + 1].length > 0) {\n segments.push(literal(strings[i + 1]));\n }\n }\n return makeUnsafe(segments, acquirer, compiler, spanAttributes, transformRows, borrower);\n};\n/**\n * Creates a helper that joins SQL clauses with a literal separator, optionally\n * wrapping multiple clauses in parentheses and using a fallback for an empty\n * list.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport function join(lit, addParens = true, fallback = \"\") {\n const literalStatement = literal(lit);\n const fallbackFragment = fragment([literal(fallback)]);\n return clauses => {\n if (clauses.length === 0) {\n return fallbackFragment;\n } else if (clauses.length === 1) {\n return fragment(convertLiteralOrFragment(clauses[0]));\n }\n const segments = [];\n if (addParens) {\n segments.push(literal(\"(\"));\n }\n segments.push.apply(segments, convertLiteralOrFragment(clauses[0]));\n for (let i = 1; i < clauses.length; i++) {\n segments.push(literalStatement);\n segments.push.apply(segments, convertLiteralOrFragment(clauses[i]));\n }\n if (addParens) {\n segments.push(literal(\")\"));\n }\n return fragment(segments);\n };\n}\n/**\n * Combines clauses with `AND`, parenthesizing multiple clauses and returning\n * `1=1` when the list is empty.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const and = /*#__PURE__*/join(\" AND \", true, \"1=1\");\n/**\n * Combines clauses with `OR`, parenthesizing multiple clauses and returning\n * `1=1` when the list is empty.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const or = /*#__PURE__*/join(\" OR \", true, \"1=1\");\n/**\n * Creates a comma-separated SQL fragment from values, optionally adding a\n * prefix, and returns an empty fragment when no values are provided.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const csv = function (...args) {\n if (args[args.length - 1].length === 0) {\n return emptyFragment;\n }\n if (args.length === 1) {\n return csvRaw(args[0]);\n }\n return fragment([literal(`${args[0]} `), ...csvRaw(args[1]).segments]);\n};\nconst csvRaw = /*#__PURE__*/join(\",\", false);\nconst emptyFragment = /*#__PURE__*/fragment([/*#__PURE__*/literal(\"\")]);\n/**\n * Creates a dialect-specific SQL `Compiler` from rendering callbacks.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const makeCompiler = options => {\n const self = Object.create(CompilerProto);\n self.options = options;\n self.dialect = options.dialect;\n self.disableTransforms = false;\n self.statementCache = new WeakMap();\n self.statementCacheNoTransform = new WeakMap();\n return self;\n};\nconst CompilerProto = {\n compile(statement, withoutTransform = false, placeholderOverride) {\n const opts = this.options;\n withoutTransform = withoutTransform || this.disableTransforms;\n const cache = withoutTransform ? this.statementCacheNoTransform : this.statementCache;\n const cached = cache.get(statement);\n if (cached !== undefined && placeholderOverride === undefined) {\n return cached;\n }\n const segments = statement.segments;\n const len = segments.length;\n let sql = \"\";\n const binds = [];\n let placeholderCount = 0;\n const placeholder = placeholderOverride ?? (u => opts.placeholder(++placeholderCount, u));\n const placeholderNoIncrement = u => opts.placeholder(placeholderCount, u);\n const placeholders = makePlaceholdersArray(placeholder);\n for (let i = 0; i < len; i++) {\n const segment = segments[i];\n switch (segment._tag) {\n case \"Literal\":\n {\n sql += segment.value;\n if (segment.params) {\n binds.push.apply(binds, segment.params);\n }\n break;\n }\n case \"Identifier\":\n {\n sql += opts.onIdentifier(segment.value, withoutTransform);\n break;\n }\n case \"Parameter\":\n {\n sql += placeholder(segment.value);\n binds.push(segment.value);\n break;\n }\n case \"ArrayHelper\":\n {\n sql += `(${placeholders(segment.value)})`;\n binds.push.apply(binds, segment.value);\n break;\n }\n case \"RecordInsertHelper\":\n {\n const keys = Object.keys(segment.value[0]);\n if (opts.onInsert) {\n const values = new Array(segment.value.length);\n let placeholders = \"\";\n for (let i = 0; i < segment.value.length; i++) {\n const row = new Array(keys.length);\n values[i] = row;\n placeholders += i === 0 ? \"(\" : \",(\";\n for (let j = 0; j < keys.length; j++) {\n const key = keys[j];\n const value = segment.value[i][key];\n const primitive = extractPrimitive(value, opts.onCustom, placeholderNoIncrement, withoutTransform);\n row[j] = primitive;\n placeholders += j === 0 ? placeholder(value) : `,${placeholder(value)}`;\n }\n placeholders += \")\";\n }\n const [s, b] = opts.onInsert(keys.map(_ => opts.onIdentifier(_, withoutTransform)), placeholders, values, typeof segment.returningIdentifier === \"string\" ? [segment.returningIdentifier, []] : segment.returningIdentifier ? this.compile(segment.returningIdentifier, withoutTransform, placeholder) : undefined);\n sql += s;\n binds.push.apply(binds, b);\n } else {\n let placeholders = \"\";\n for (let i = 0; i < segment.value.length; i++) {\n placeholders += i === 0 ? \"(\" : \",(\";\n for (let j = 0; j < keys.length; j++) {\n const value = segment.value[i][keys[j]];\n const primitive = extractPrimitive(value, opts.onCustom, placeholderNoIncrement, withoutTransform);\n binds.push(primitive);\n placeholders += j === 0 ? placeholder(value) : `,${placeholder(value)}`;\n }\n placeholders += \")\";\n }\n sql += `${generateColumns(keys, opts.onIdentifier, withoutTransform)} VALUES ${placeholders}`;\n if (typeof segment.returningIdentifier === \"string\") {\n sql += ` RETURNING ${segment.returningIdentifier}`;\n } else if (segment.returningIdentifier) {\n sql += \" RETURNING \";\n const [s, b] = this.compile(segment.returningIdentifier, withoutTransform, placeholder);\n sql += s;\n binds.push.apply(binds, b);\n }\n }\n break;\n }\n case \"RecordUpdateHelperSingle\":\n {\n let keys = Object.keys(segment.value);\n if (segment.omit.length > 0) {\n keys = keys.filter(key => !segment.omit.includes(key));\n }\n if (opts.onRecordUpdateSingle) {\n const [s, b] = opts.onRecordUpdateSingle(keys.map(_ => opts.onIdentifier(_, withoutTransform)), keys.map(key => extractPrimitive(segment.value[key], opts.onCustom, placeholderNoIncrement, withoutTransform)), typeof segment.returningIdentifier === \"string\" ? [segment.returningIdentifier, []] : segment.returningIdentifier ? this.compile(segment.returningIdentifier, withoutTransform, placeholder) : undefined);\n sql += s;\n binds.push.apply(binds, b);\n } else {\n for (let i = 0, len = keys.length; i < len; i++) {\n const column = opts.onIdentifier(keys[i], withoutTransform);\n if (i === 0) {\n sql += `${column} = ${placeholder(segment.value[keys[i]])}`;\n } else {\n sql += `, ${column} = ${placeholder(segment.value[keys[i]])}`;\n }\n binds.push(extractPrimitive(segment.value[keys[i]], opts.onCustom, placeholderNoIncrement, withoutTransform));\n }\n if (typeof segment.returningIdentifier === \"string\") {\n if (this.dialect === \"mssql\") {\n sql += ` OUTPUT ${segment.returningIdentifier === \"*\" ? \"INSERTED.*\" : segment.returningIdentifier}`;\n } else {\n sql += ` RETURNING ${segment.returningIdentifier}`;\n }\n } else if (segment.returningIdentifier) {\n sql += this.dialect === \"mssql\" ? \" OUTPUT \" : \" RETURNING \";\n const [s, b] = this.compile(segment.returningIdentifier, withoutTransform, placeholder);\n sql += s;\n binds.push.apply(binds, b);\n }\n }\n break;\n }\n case \"RecordUpdateHelper\":\n {\n const keys = Object.keys(segment.value[0]);\n const values = new Array(segment.value.length);\n let placeholders = \"\";\n for (let i = 0; i < segment.value.length; i++) {\n const row = new Array(keys.length);\n values[i] = row;\n placeholders += i === 0 ? \"(\" : \",(\";\n for (let j = 0; j < keys.length; j++) {\n const key = keys[j];\n const value = segment.value[i][key];\n row[j] = extractPrimitive(value, opts.onCustom, placeholderNoIncrement, withoutTransform);\n placeholders += j === 0 ? placeholder(value) : `,${placeholder(value)}`;\n }\n placeholders += \")\";\n }\n const [s, b] = opts.onRecordUpdate(placeholders, segment.alias, generateColumns(keys, opts.onIdentifier, withoutTransform), values, typeof segment.returningIdentifier === \"string\" ? [segment.returningIdentifier, []] : segment.returningIdentifier ? this.compile(segment.returningIdentifier, withoutTransform, placeholder) : undefined);\n sql += s;\n binds.push.apply(binds, b);\n break;\n }\n case \"Custom\":\n {\n const [s, b] = opts.onCustom(segment, placeholder, withoutTransform);\n sql += s;\n binds.push.apply(binds, b);\n break;\n }\n }\n }\n const result = [sql, binds];\n if (placeholderOverride !== undefined) {\n return result;\n }\n cache.set(statement, result);\n return result;\n },\n get withoutTransform() {\n const self = Object.create(CompilerProto);\n Object.assign(self, this, {\n disableTransforms: true\n });\n return self;\n }\n};\n/**\n * Creates a SQLite compiler that uses `?` placeholders and quoted identifiers,\n * optionally transforming identifier names before escaping.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const makeCompilerSqlite = transform => makeCompiler({\n dialect: \"sqlite\",\n placeholder(_) {\n return \"?\";\n },\n onIdentifier: transform ? function (value, withoutTransform) {\n return withoutTransform ? escapeSqlite(value) : escapeSqlite(transform(value));\n } : escapeSqlite,\n onRecordUpdate() {\n return [\"\", []];\n },\n onCustom() {\n return [\"\", []];\n }\n});\n/**\n * Creates an identifier escaping function that wraps names in the given\n * delimiter, doubles delimiter characters, and escapes dots between identifier\n * parts.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport function defaultEscape(c) {\n const re = new RegExp(c, \"g\");\n const double = c + c;\n const dot = c + \".\" + c;\n return function (str) {\n return c + str.replace(re, double).replace(/\\./g, dot) + c;\n };\n}\n/**\n * Classifies a JavaScript value as a SQL primitive kind, treating `undefined`\n * as `null` and defaulting unrecognized objects to `string`.\n *\n * @category converting\n * @since 4.0.0\n */\nexport const primitiveKind = value => {\n switch (typeof value) {\n case \"string\":\n return \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"bigint\":\n return \"bigint\";\n case \"undefined\":\n return \"null\";\n }\n if (value === null) {\n return \"null\";\n } else if (value instanceof Date) {\n return \"Date\";\n } else if (value instanceof Uint8Array) {\n return \"Uint8Array\";\n } else if (value instanceof Int8Array) {\n return \"Int8Array\";\n }\n return \"string\";\n};\n/**\n * Builds value, object, and row-array transformers that rename object keys with\n * the supplied function and optionally recurse into nested object arrays.\n *\n * @category transforming\n * @since 4.0.0\n */\nexport const defaultTransforms = (transformer, nested = true) => {\n const transformValue = value => {\n if (Array.isArray(value)) {\n if (value.length === 0 || value[0].constructor !== Object) {\n return value;\n }\n return array(value);\n } else if (value?.constructor === Object) {\n return transformObject(value);\n }\n return value;\n };\n const transformObject = obj => {\n const newObj = {};\n for (const key of Object.keys(obj)) {\n InternalRecord.assignProperty(newObj, transformer(key), transformValue(obj[key]));\n }\n return newObj;\n };\n const transformArrayNested = rows => {\n const newRows = new Array(rows.length);\n for (let i = 0, len = rows.length; i < len; i++) {\n const row = rows[i];\n if (Array.isArray(row)) {\n newRows[i] = transformArrayNested(row);\n } else {\n const obj = {};\n for (const [key, value] of Object.entries(row)) {\n InternalRecord.assignProperty(obj, transformer(key), transformValue(value));\n }\n newRows[i] = obj;\n }\n }\n return newRows;\n };\n const transformArray = rows => {\n const newRows = new Array(rows.length);\n for (let i = 0, len = rows.length; i < len; i++) {\n const row = rows[i];\n if (Array.isArray(row)) {\n newRows[i] = transformArray(row);\n } else {\n const obj = {};\n for (const [key, value] of Object.entries(row)) {\n InternalRecord.assignProperty(obj, transformer(key), value);\n }\n newRows[i] = obj;\n }\n }\n return newRows;\n };\n const array = nested ? transformArrayNested : transformArray;\n return {\n value: transformValue,\n object: transformObject,\n array\n };\n};\n// internal\nconst ATTR_DB_OPERATION_NAME = \"db.operation.name\";\nconst ATTR_DB_QUERY_TEXT = \"db.query.text\";\nconst makeUnsafe = (segments, acquirer, compiler, spanAttributes, transformRows, borrower) => {\n const self = Object.create(StatementProto);\n self.segments = segments;\n self.acquirer = acquirer;\n self.compiler = compiler;\n self.spanAttributes = spanAttributes;\n self.transformRows = transformRows;\n self.borrower = borrower;\n return self;\n};\n// TODO: figure out why these diagnostics are emitted\nconst StatementProto = {\n [FragmentTypeId]: FragmentTypeId,\n withConnection(operation, f, withoutTransform = false) {\n return Effect.useSpan(\"sql.execute\", {\n kind: \"client\"\n }, span => this.withConnectionSpan(operation, f, withoutTransform, span));\n },\n withConnectionSpan(operation, f, withoutTransform, span) {\n return withStatement(this, span, (statement, fiber) => {\n const [sql, params] = statement.compile(withoutTransform);\n for (const [key, value] of this.spanAttributes) {\n span.attribute(key, value);\n }\n span.attribute(ATTR_DB_OPERATION_NAME, operation);\n span.attribute(ATTR_DB_QUERY_TEXT, sql);\n const execute = this.borrower === undefined ? Effect.scoped(Effect.flatMap(this.acquirer, _ => f(_, sql, params))) : this.borrower(connection => f(connection, sql, params));\n return fiber.cache.tracerEnabled && fiber.getRef(SpanPropagationEnabled) ? Effect.provideService(execute, Tracer.ParentSpan, span) : execute;\n });\n },\n get withoutTransform() {\n return this.withConnection(\"executeWithoutTransform\", (connection, sql, params) => connection.execute(sql, params, undefined), true);\n },\n get raw() {\n return this.withConnection(\"executeRaw\", (connection, sql, params) => connection.executeRaw(sql, params), true);\n },\n get stream() {\n const self = this;\n return Stream.unwrap(Effect.flatMap(Effect.makeSpanScoped(\"sql.execute\", {\n kind: \"client\"\n }), span => withStatement(self, span, (statement, fiber) => {\n const [sql, params] = statement.compile();\n for (const [key, value] of self.spanAttributes) {\n span.attribute(key, value);\n }\n span.attribute(ATTR_DB_OPERATION_NAME, \"executeStream\");\n span.attribute(ATTR_DB_QUERY_TEXT, sql);\n const acquire = Effect.map(self.acquirer, _ => _.executeStream(sql, params, self.transformRows));\n return fiber.cache.tracerEnabled && fiber.getRef(SpanPropagationEnabled) ? Effect.succeed(Stream.provideService(Stream.unwrap(acquire), Tracer.ParentSpan, span)) : acquire;\n })));\n },\n get values() {\n return this.withConnection(\"executeValues\", (connection, sql, params) => connection.executeValues(sql, params));\n },\n get valuesUnprepared() {\n return this.withConnection(\"executeValuesUnprepared\", (connection, sql, params) => connection.executeValuesUnprepared(sql, params));\n },\n get unprepared() {\n const self = this;\n return self.withConnection(\"executeUnprepared\", (connection, sql, params) => connection.executeUnprepared(sql, params, self.transformRows));\n },\n ... /*#__PURE__*/Effectable.Prototype({\n label: \"Statement\",\n evaluate(fiber) {\n const span = internalEffect.makeSpanUnsafe(fiber, \"sql.execute\", {\n kind: \"client\"\n });\n const clock = fiber.getRef(Clock);\n const timingEnabled = fiber.getRef(TracerTimingEnabled);\n return Effect.onExit(this.withConnectionSpan(\"execute\", (connection, sql, params) => connection.execute(sql, params, this.transformRows), false, span), exit => internalEffect.endSpan(span, exit, clock, timingEnabled));\n }\n }),\n compile(withoutTransform) {\n return this.compiler.compile(this, withoutTransform ?? false);\n },\n toJSON() {\n const [sql, params] = this.compile();\n return {\n _id: \"Statement\",\n segments: this.segments,\n sql,\n params\n };\n }\n};\nconst withStatement = (self, span, f) => Effect.withFiber(fiber => {\n const transform = fiber.getRef(CurrentTransformer);\n if (transform === undefined) {\n return f(self, fiber);\n }\n return Effect.flatMap(transform(self, make(self.acquirer, self.compiler, self.spanAttributes, self.transformRows, self.borrower), fiber, span), statement => f(statement, fiber));\n});\nconst isSegment = u => {\n if (!hasProperty(u, \"_tag\")) {\n return false;\n }\n switch (u._tag) {\n case \"Literal\":\n case \"Parameter\":\n case \"ArrayHelper\":\n case \"RecordInsertHelper\":\n case \"RecordUpdateHelper\":\n case \"RecordUpdateHelperSingle\":\n case \"Identifier\":\n case \"Custom\":\n return true;\n default:\n return false;\n }\n};\nfunction convertLiteralOrFragment(clause) {\n if (typeof clause === \"string\") {\n return [literal(clause)];\n }\n return clause.segments;\n}\nconst makePlaceholdersArray = evaluate => values => {\n if (values.length === 0) {\n return \"\";\n }\n let result = evaluate(values[0]);\n for (let i = 1; i < values.length; i++) {\n result += `,${evaluate(values[i])}`;\n }\n return result;\n};\nconst generateColumns = (keys, escape, withoutTransform) => {\n if (keys.length === 0) {\n return \"()\";\n }\n let str = `(${escape(keys[0], withoutTransform)}`;\n for (let i = 1; i < keys.length; i++) {\n str += `,${escape(keys[i], withoutTransform)}`;\n }\n return str + \")\";\n};\nconst extractPrimitive = (value, onCustom, placeholder, withoutTransform) => {\n if (value === undefined) {\n return null;\n } else if (isFragment(value)) {\n const head = value.segments[0];\n if (head._tag === \"Custom\") {\n const compiled = onCustom(head, placeholder, withoutTransform);\n return compiled[1][0] ?? null;\n } else if (head._tag === \"Parameter\") {\n return head.value;\n }\n return null;\n }\n return value;\n};\nconst escapeSqlite = /*#__PURE__*/defaultEscape(\"\\\"\");\nfunction in_() {\n if (arguments.length === 1) {\n return arrayHelper(arguments[0]);\n }\n const column = arguments[0];\n const values = arguments[1];\n return values.length === 0 ? neverFragment : fragment([identifier(column), literal(\" IN \"), arrayHelper(values)]);\n}\nconst neverFragment = /*#__PURE__*/fragment([/*#__PURE__*/literal(\"1=0\")]);\n//# sourceMappingURL=Statement.js.map","/**\n * Main SQL client service for tagged-template queries.\n *\n * `SqlClient` combines the tagged-template statement constructor with\n * connection acquisition, dialect compilation, transactions, row transforms,\n * tracing, and reactive query helpers. Driver integrations build this service\n * from their connection and compiler pieces.\n *\n * @since 4.0.0\n */\nimport { Clock } from \"../../Clock.js\";\nimport * as Context from \"../../Context.js\";\nimport * as Effect from \"../../Effect.js\";\nimport * as Exit from \"../../Exit.js\";\nimport { identity } from \"../../Function.js\";\nimport * as Option from \"../../Option.js\";\nimport * as Scope from \"../../Scope.js\";\nimport * as Semaphore from \"../../Semaphore.js\";\nimport * as Stream from \"../../Stream.js\";\nimport * as Tracer from \"../../Tracer.js\";\nimport { Reactivity } from \"../reactivity/Reactivity.js\";\nimport * as Statement from \"./Statement.js\";\nconst TypeId = \"~effect/sql/SqlClient\";\n/**\n * Service tag for the active SQL client service.\n *\n * **When to use**\n *\n * Use to access or provide the SQL client used to build statements, stream\n * rows, reserve connections, and run transactions.\n *\n * @category services\n * @since 4.0.0\n */\nexport const SqlClient = /*#__PURE__*/Context.Service(\"effect/sql/SqlClient\");\nlet clientIdCounter = 0;\nlet transactionSemaphoreIdCounter = 0;\n/**\n * Constructs a `SqlClient` from connection acquirers, a compiler, transaction\n * commands, tracing attributes, optional row transforms, and reactive query\n * integration.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const make = /*#__PURE__*/Effect.fnUntraced(function* (options) {\n const transactionService = options.transactionService ?? TransactionConnection(clientIdCounter++);\n const getConnection = Effect.flatMap(Effect.serviceOption(transactionService), Option.match({\n onNone: () => options.acquirer,\n onSome: ([conn]) => Effect.succeed(conn)\n }));\n const beginTransaction = options.beginTransaction ?? \"BEGIN\";\n const commit = options.commit ?? \"COMMIT\";\n const savepoint = options.savepoint ?? (name => `SAVEPOINT ${name}`);\n const rollback = options.rollback ?? \"ROLLBACK\";\n const rollbackSavepoint = options.rollbackSavepoint ?? (name => `ROLLBACK TO SAVEPOINT ${name}`);\n const transactionAcquirer = options.transactionAcquirer ?? options.acquirer;\n const control = options.prepareTransactionControls === true ? (conn, sql) => conn.execute(sql, [], undefined) : (conn, sql) => conn.executeUnprepared(sql, [], undefined);\n const withTransaction = makeWithTransaction({\n transactionService,\n spanAttributes: options.spanAttributes,\n acquireConnection: Effect.flatMap(Scope.make(), scope => Effect.map(Scope.provide(transactionAcquirer, scope), conn => [scope, conn])),\n begin: conn => control(conn, beginTransaction),\n savepoint: (conn, id) => control(conn, savepoint(`effect_sql_${id}`)),\n commit: conn => control(conn, commit),\n rollback: conn => control(conn, rollback),\n rollbackSavepoint: (conn, id) => control(conn, rollbackSavepoint(`effect_sql_${id}`))\n });\n const reactivity = yield* Reactivity;\n // A statement inside a transaction has to run on that transaction's\n // connection, so borrowing is only for statements that reach the pool.\n const borrower = options.borrower === undefined ? undefined : f => Effect.flatMap(Effect.serviceOption(transactionService), Option.match({\n onNone: () => options.borrower(f),\n onSome: ([conn]) => f(conn)\n }));\n const client = Object.assign(Statement.make(getConnection, options.compiler, options.spanAttributes, options.transformRows, borrower), {\n [TypeId]: TypeId,\n safe: undefined,\n withTransaction,\n transactionService,\n reserve: transactionAcquirer,\n withoutTransforms() {\n if (options.transformRows === undefined) {\n return this;\n }\n const statement = Statement.make(getConnection, options.compiler.withoutTransform, options.spanAttributes, undefined, borrower);\n const client = Object.assign(statement, {\n ...this,\n ...statement\n });\n client.safe = client;\n client.withoutTransforms = () => client;\n return client;\n },\n reactive: options.reactiveQueue ? (keys, effect) => options.reactiveQueue(keys, effect).pipe(Effect.map(Stream.fromQueue), Stream.unwrap) : reactivity.stream,\n reactiveMailbox: options.reactiveQueue ?? reactivity.query\n });\n client.safe = client;\n return client;\n});\n/**\n * Builds a transaction wrapper that begins top-level transactions, uses\n * savepoints for nested transactions, commits on success, and rolls back on\n * failure or interruption.\n *\n * @category transactions\n * @since 4.0.0\n */\nexport const makeWithTransaction = options => {\n const transactionSemaphore = Context.Service(`effect/sql/SqlClient/TransactionSemaphore/${transactionSemaphoreIdCounter++}`);\n return effect => Effect.uninterruptibleMask(restore => Effect.useSpan(\"sql.transaction\", {\n kind: \"client\"\n }, span => Effect.withFiber(fiber => {\n for (const [key, value] of options.spanAttributes) {\n span.attribute(key, value);\n }\n const services = fiber.context;\n const clock = fiber.getRef(Clock);\n const connOption = Context.getOption(services, options.transactionService);\n const conn = connOption._tag === \"Some\" ? Effect.succeed([undefined, connOption.value[0]]) : options.acquireConnection;\n const id = connOption._tag === \"Some\" ? connOption.value[1] + 1 : 0;\n const transaction = Effect.flatMap(conn, ([scope, conn]) => (id === 0 ? options.begin(conn) : options.savepoint(conn, id)).pipe(Effect.flatMap(() => Effect.onExitPrimitive(Effect.provideContext(restore(effect), services.pipe(Context.add(options.transactionService, [conn, id]), Context.add(transactionSemaphore, Semaphore.makeUnsafe(1)), Context.add(Tracer.ParentSpan, span))), exit => {\n let effect;\n if (Exit.isSuccess(exit)) {\n if (id === 0) {\n span.event(\"db.transaction.commit\", clock.currentTimeNanosUnsafe());\n effect = Effect.orDie(options.commit(conn));\n } else {\n span.event(\"db.transaction.savepoint\", clock.currentTimeNanosUnsafe());\n effect = Effect.void;\n }\n } else {\n span.event(\"db.transaction.rollback\", clock.currentTimeNanosUnsafe());\n effect = Effect.orDie(id > 0 ? options.rollbackSavepoint(conn, id) : options.rollback(conn));\n }\n return Effect.flatMap(effect, () => exit);\n }, true)), scope ? eff => Effect.onExitPrimitive(eff, exit => Scope.close(scope, exit), true) : identity));\n return id === 0 ? transaction : Context.getUnsafe(services, transactionSemaphore).withPermit(transaction);\n })));\n};\n/**\n * Creates a unique context service tag for the active transaction connection of\n * a specific SQL client.\n *\n * @category services\n * @since 4.0.0\n */\nexport const TransactionConnection = clientId => Context.Service(`effect/sql/SqlClient/TransactionConnection/${clientId}`);\n/**\n * Context reference used by SQL integrations to opt in to safe integer\n * handling; defaults to `false`.\n *\n * @category services\n * @since 4.0.0\n */\nexport const SafeIntegers = /*#__PURE__*/Context.Reference(\"effect/sql/SqlClient/SafeIntegers\", {\n defaultValue: () => false\n});\n//# sourceMappingURL=SqlClient.js.map","/**\n * Caches values loaded by an Effect lookup function.\n *\n * A cache stores successful and failed lookup results, shares an in-progress\n * lookup when multiple callers request the same missing key, and limits entries\n * by capacity and optional time-to-live rules. This module includes helpers for\n * reading, setting, refreshing, invalidating, and inspecting cache contents.\n *\n * @since 4.0.0\n */\nimport * as Context from \"./Context.js\";\nimport * as Duration from \"./Duration.js\";\nimport { dual } from \"./Function.js\";\nimport * as core from \"./internal/core.js\";\nimport { PipeInspectableProto } from \"./internal/core.js\";\nimport * as effect from \"./internal/effect.js\";\nimport * as Iterable from \"./Iterable.js\";\nimport * as MutableHashMap from \"./MutableHashMap.js\";\nimport * as Option from \"./Option.js\";\nimport * as Result from \"./Result.js\";\nconst TypeId = \"~effect/Cache\";\n/**\n * Creates a cache with dynamic time-to-live based on the result and key.\n *\n * **When to use**\n *\n * Use when you need different cache entry lifetimes based on the lookup result\n * or key characteristics.\n *\n * **Details**\n *\n * The timeToLive function receives both the exit result and the key, allowing\n * for flexible TTL policies based on success/failure state and key characteristics.\n *\n * **Example** (Configuring dynamic time to live)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect, Exit } from \"effect\"\n *\n * // Cache with TTL based on computed value\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.makeWith(\n * (id: number) => Effect.succeed({ id, active: id % 2 === 0 }),\n * {\n * capacity: 1000,\n * timeToLive(exit) {\n * if (Exit.isSuccess(exit)) {\n * const user = exit.value\n * return user.active ? \"1 hour\" : \"5 minutes\"\n * }\n * return \"30 seconds\"\n * }\n * }\n * )\n *\n * return cache.capacity\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => 1000\n * ```\n *\n * @see {@link make} for a simpler cache constructor with a fixed time-to-live for all entries\n * @category constructors\n * @since 2.0.0\n */\nexport const makeWith = (lookup, options) => effect.contextWith(context => {\n const self = Object.create(Proto);\n self.lookup = key => effect.updateContext(lookup(key), input => Context.merge(context, input));\n self.map = MutableHashMap.make();\n self.capacity = options.capacity;\n self.timeToLive = options.timeToLive ? (exit, key) => Duration.fromInputUnsafe(options.timeToLive(exit, key)) : defaultTimeToLive;\n return effect.succeed(self);\n});\n/**\n * Creates a cache with a fixed time-to-live for all entries.\n *\n * **Details**\n *\n * This is the basic cache constructor where all entries share the same TTL.\n * The lookup function will be called when a key is not found or has expired.\n *\n * **Example** (Creating a basic cache)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * // Basic cache with string keys\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make<string, number>({\n * capacity: 100,\n * lookup: (key) => Effect.succeed(key.length)\n * })\n *\n * const result1 = yield* Cache.get(cache, \"hello\")\n * const result2 = yield* Cache.get(cache, \"world\")\n * return { result1, result2 }\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => { result1: 5, result2: 5 }\n * ```\n *\n * **Example** (Creating a cache with TTL)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const users = new Map([\n * [123, { name: \"Ada\", email: \"ada@example.com\" }],\n * [456, { name: \"Grace\", email: \"grace@example.com\" }]\n * ])\n *\n * const cache = yield* Cache.make<\n * number,\n * { name: string; email: string },\n * string\n * >({\n * capacity: 500,\n * lookup: (userId) =>\n * Effect.suspend(() => {\n * const user = users.get(userId)\n * return user === undefined\n * ? Effect.fail(`User ${userId} not found`)\n * : Effect.succeed(user)\n * }),\n * timeToLive: \"15 minutes\"\n * })\n *\n * const user1 = yield* Cache.get(cache, 123)\n * const user2 = yield* Cache.get(cache, 123)\n * return [user1, user2, user1 === user2] as const\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [{ name: \"Ada\", email: \"ada@example.com\" }, { name: \"Ada\", email: \"ada@example.com\" }, true]\n * ```\n *\n * @category constructors\n * @since 2.0.0\n */\nexport const make = options => makeWith(options.lookup, {\n ...options,\n timeToLive: options.timeToLive !== undefined ? () => options.timeToLive : defaultTimeToLive\n});\nconst Proto = {\n ...PipeInspectableProto,\n [TypeId]: TypeId,\n toJSON() {\n return {\n _id: \"Cache\",\n capacity: this.capacity,\n map: this.map\n };\n }\n};\nconst defaultTimeToLive = (_, _key) => Duration.infinity;\n/**\n * Retrieves the value for a key, invoking the lookup function on a cache miss\n * or expired entry.\n *\n * **Details**\n *\n * Concurrent `get` calls for the same missing key share the same pending\n * lookup. The cache stores the lookup `Exit`, so failed lookups are cached and\n * will fail again until the entry expires, is invalidated, or is refreshed.\n *\n * **Example** (Getting cached values)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // Cache miss - triggers lookup function\n * const result1 = yield* Cache.get(cache, \"hello\")\n *\n * // Cache hit - returns cached value without lookup\n * const result2 = yield* Cache.get(cache, \"hello\")\n *\n * return { result1, result2 }\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => { result1: 5, result2: 5 }\n * ```\n *\n * **Example** (Handling lookup failures)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect, Exit } from \"effect\"\n *\n * // Error handling when lookup fails\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make<string, number, string>({\n * capacity: 10,\n * lookup: (key: string) =>\n * key === \"error\"\n * ? Effect.fail(\"Lookup failed\")\n * : Effect.succeed(key.length)\n * })\n *\n * // Successful lookup\n * const success = yield* Cache.get(cache, \"hello\")\n *\n * // Failed lookup - returns error\n * const failure = yield* Effect.exit(Cache.get(cache, \"error\"))\n * return [success, failure] as const\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [5, Exit.fail(\"Lookup failed\")]\n * ```\n *\n * **Example** (Sharing concurrent lookups)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * // Concurrent access - multiple gets of same key only invoke lookup once\n * const program = Effect.gen(function*() {\n * let lookupCount = 0\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) =>\n * Effect.sync(() => {\n * lookupCount++\n * return key.length\n * })\n * })\n *\n * // Multiple concurrent gets\n * const results = yield* Effect.all([\n * Cache.get(cache, \"hello\"),\n * Cache.get(cache, \"hello\"),\n * Cache.get(cache, \"hello\")\n * ], { concurrency: \"unbounded\" })\n *\n * return { results, lookupCount }\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => { results: [5, 5, 5], lookupCount: 1 }\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const get = /*#__PURE__*/dual(2, (self, key) => core.withFiber(fiber => {\n const oentry = MutableHashMap.get(self.map, key);\n if (Option.isSome(oentry) && !hasExpired(oentry.value, fiber)) {\n // Move the entry to the end of the map to keep it fresh\n MutableHashMap.remove(self.map, key);\n MutableHashMap.set(self.map, key, oentry.value);\n return oentry.value.await();\n }\n const entry = new EntryImpl(fiber, self.lookup(key));\n entry.fiber.addObserver(exit => {\n if (effect.exitHasInterrupts(exit)) {\n const current = MutableHashMap.get(self.map, key);\n if (Option.isSome(current) && current.value === entry) {\n MutableHashMap.remove(self.map, key);\n }\n return;\n }\n const ttl = self.timeToLive(exit, key);\n if (Duration.isFinite(ttl)) {\n entry.expiresAt = fiber.getRef(effect.ClockRef).currentTimeMillisUnsafe() + Duration.toMillis(ttl);\n } else if (Duration.isZero(ttl)) {\n MutableHashMap.remove(self.map, key);\n }\n });\n const exit = entry.fiber.pollUnsafe();\n if (exit === undefined || !effect.exitHasInterrupts(exit)) {\n MutableHashMap.set(self.map, key, entry);\n }\n if (Number.isFinite(self.capacity)) {\n checkCapacity(self);\n }\n return entry.await();\n}));\nclass EntryImpl {\n expiresAt;\n awaiters;\n fiber;\n constructor(parent, valueEffect) {\n this.fiber = effect.forkUnsafe(parent, valueEffect, true, true);\n this.awaiters = 0;\n this.expiresAt = undefined;\n }\n await() {\n const exit = this.fiber.pollUnsafe();\n if (exit) return exit;\n this.awaiters++;\n return effect.onExit(effect.fiberJoin(this.fiber), () => {\n this.awaiters--;\n if (this.awaiters > 0 || this.fiber.pollUnsafe()) return effect.void;\n return effect.fiberInterrupt(this.fiber);\n });\n }\n}\nconst hasExpired = (entry, fiber) => {\n if (entry.expiresAt === undefined) {\n return false;\n }\n return fiber.getRef(effect.ClockRef).currentTimeMillisUnsafe() >= entry.expiresAt;\n};\nconst checkCapacity = self => {\n let diff = MutableHashMap.size(self.map) - self.capacity;\n if (diff <= 0) return;\n // MutableHashMap has insertion order, so we can remove the oldest entries\n for (const [key] of self.map) {\n MutableHashMap.remove(self.map, key);\n diff--;\n if (diff === 0) return;\n }\n};\n/**\n * Reads an existing cache entry without invoking the lookup function.\n *\n * **Details**\n *\n * Returns `Option.none()` when the key is missing or expired, and `Option.some`\n * when a cached lookup has succeeded. If the entry is still pending, waits for\n * it to complete. If the cached or pending lookup fails, this effect fails with\n * the same error.\n *\n * **Example** (Reading cached values without lookup)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect, Option } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // No value in cache yet - returns None without lookup\n * const empty = yield* Cache.getOption(cache, \"hello\")\n *\n * // Populate cache using get\n * yield* Cache.get(cache, \"hello\")\n *\n * // Now getOption returns the cached value\n * const cached = yield* Cache.getOption(cache, \"hello\")\n * return [empty, cached] as const\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [Option.none(), Option.some(5)]\n * ```\n *\n * **Example** (Skipping expired entries)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect, Option } from \"effect\"\n * import { TestClock } from \"effect/testing\"\n *\n * // Expired entries return None\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) => Effect.succeed(key.length),\n * timeToLive: \"1 hour\"\n * })\n *\n * // Add value to cache\n * yield* Cache.get(cache, \"hello\")\n *\n * // Value exists before expiration\n * const beforeExpiry = yield* Cache.getOption(cache, \"hello\")\n *\n * // Simulate time passing\n * yield* TestClock.adjust(\"2 hours\")\n *\n * // Value expired - returns None\n * const afterExpiry = yield* Cache.getOption(cache, \"hello\")\n * return [beforeExpiry, afterExpiry] as const\n * })\n *\n * const actual = await Effect.runPromise(Effect.provide(program, TestClock.layer()))\n * actual // => [Option.some(5), Option.none()]\n * ```\n *\n * **Example** (Waiting for pending lookups)\n *\n * ```ts import.meta.vitest\n * import { Cache, Deferred, Effect, Fiber, Option } from \"effect\"\n *\n * // Waits for ongoing computation to complete\n * const program = Effect.gen(function*() {\n * const deferred = yield* Deferred.make<void>()\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (_key: string) => Deferred.await(deferred).pipe(Effect.as(42))\n * })\n *\n * // Start lookup in background\n * const getFiber = yield* Effect.forkChild(Cache.get(cache, \"key\"))\n *\n * // getOption waits for ongoing computation\n * const optionFiber = yield* Effect.forkChild(Cache.getOption(cache, \"key\"))\n *\n * // Complete the computation\n * yield* Deferred.succeed(deferred, void 0)\n *\n * const result = yield* Fiber.join(optionFiber)\n * const value = yield* Fiber.join(getFiber)\n * return [result, value] as const\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [Option.some(42), 42]\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const getOption = /*#__PURE__*/dual(2, (self, key) => core.withFiber(fiber => {\n const entry = getImpl(self, key, fiber);\n return entry ? effect.asSome(entry.await()) : effect.succeedNone;\n}));\nconst getImpl = (self, key, fiber, isRead = true) => {\n const oentry = MutableHashMap.get(self.map, key);\n if (Option.isNone(oentry)) {\n return undefined;\n } else if (hasExpired(oentry.value, fiber)) {\n MutableHashMap.remove(self.map, key);\n return undefined;\n } else if (isRead) {\n MutableHashMap.remove(self.map, key);\n MutableHashMap.set(self.map, key, oentry.value);\n }\n return oentry.value;\n};\n/**\n * Retrieves the value associated with the specified key from the cache, only if\n * it contains a resolved successful value.\n *\n * **Details**\n *\n * This checks only an existing non-expired entry. It returns `Option.some` when\n * the entry has already resolved successfully, and `Option.none` for missing,\n * expired, failed, or still-pending entries.\n *\n * @see {@link get} for triggering or awaiting the cache lookup\n * @see {@link getOption} for reading an existing entry as an optional effect\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const getSuccess = /*#__PURE__*/dual(2, (self, key) => core.withFiber(fiber => {\n const exit = getImpl(self, key, fiber)?.fiber.pollUnsafe();\n if (exit && effect.exitIsSuccess(exit)) {\n return effect.succeedSome(exit.value);\n }\n return effect.succeedNone;\n}));\n/**\n * Sets the value associated with the specified key in the cache. This will\n * overwrite any existing value for that key, skipping the lookup function.\n *\n * **Example** (Setting values directly)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 100,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // Set a value directly without invoking lookup\n * yield* Cache.set(cache, \"hello\", 42)\n * return yield* Cache.get(cache, \"hello\")\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => 42\n * ```\n *\n * **Example** (Overwriting cached values)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * // Overwriting existing cached values\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 100,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // First get populates via lookup\n * const original = yield* Cache.get(cache, \"test\") // 4\n *\n * // Set overwrites the cached value\n * yield* Cache.set(cache, \"test\", 999)\n * const updated = yield* Cache.get(cache, \"test\") // 999\n *\n * return { original, updated }\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => { original: 4, updated: 999 }\n * ```\n *\n * **Example** (Applying TTL to set values)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n * import { TestClock } from \"effect/testing\"\n *\n * // TTL behavior with set operations\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 100,\n * lookup: (key: string) => Effect.succeed(key.length),\n * timeToLive: \"1 hour\"\n * })\n *\n * // Set value with TTL applied\n * yield* Cache.set(cache, \"temporary\", 123)\n * const beforeExpiry = yield* Cache.has(cache, \"temporary\")\n *\n * // Advance time past TTL\n * yield* TestClock.adjust(\"2 hours\")\n * const afterExpiry = yield* Cache.has(cache, \"temporary\")\n * return [beforeExpiry, afterExpiry]\n * })\n *\n * const actual = await Effect.runPromise(Effect.provide(program, TestClock.layer()))\n * actual // => [true, false]\n * ```\n *\n * **Example** (Enforcing capacity when setting values)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * // Capacity enforcement with set operations\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 2,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // Fill cache to capacity\n * yield* Cache.set(cache, \"a\", 1)\n * yield* Cache.set(cache, \"b\", 2)\n * const sizeBeforeEviction = yield* Cache.size(cache)\n *\n * // Adding another entry evicts oldest\n * yield* Cache.set(cache, \"c\", 3)\n * const sizeAfterEviction = yield* Cache.size(cache)\n * const hasOldest = yield* Cache.has(cache, \"a\")\n * const hasNewest = yield* Cache.has(cache, \"c\")\n * return [sizeBeforeEviction, sizeAfterEviction, hasOldest, hasNewest]\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [2, 2, false, true]\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const set = /*#__PURE__*/dual(3, (self, key, value) => core.withFiber(fiber => {\n const exit = core.exitSucceed(value);\n const entry = new EntryImpl(fiber, exit);\n const ttl = self.timeToLive(exit, key);\n if (Duration.isZero(ttl)) {\n MutableHashMap.remove(self.map, key);\n return effect.void;\n }\n entry.expiresAt = Duration.isFinite(ttl) ? fiber.getRef(effect.ClockRef).currentTimeMillisUnsafe() + Duration.toMillis(ttl) : undefined;\n MutableHashMap.set(self.map, key, entry);\n checkCapacity(self);\n return effect.void;\n}));\n/**\n * Checks whether the cache contains an entry for the specified key.\n *\n * **Details**\n *\n * This checks for an existing non-expired entry without invoking the cache\n * lookup function. Expired entries are treated as absent.\n *\n * **Example** (Checking for cached keys)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 100,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // Check non-existent key\n * const missing = yield* Cache.has(cache, \"missing\")\n *\n * // Add entry and check existence\n * yield* Cache.get(cache, \"hello\")\n * const present = yield* Cache.has(cache, \"hello\")\n * return [missing, present]\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [false, true]\n * ```\n *\n * **Example** (Checking TTL expiration)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n * import { TestClock } from \"effect/testing\"\n *\n * // TTL expiration behavior\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 100,\n * lookup: (key: string) => Effect.succeed(key.length),\n * timeToLive: \"1 hour\"\n * })\n *\n * // Add entry with TTL\n * yield* Cache.get(cache, \"expires\")\n * const initial = yield* Cache.has(cache, \"expires\")\n *\n * // Still valid before expiration\n * yield* TestClock.adjust(\"30 minutes\")\n * const beforeExpiry = yield* Cache.has(cache, \"expires\")\n *\n * // Expired after TTL\n * yield* TestClock.adjust(\"31 minutes\")\n * const afterExpiry = yield* Cache.has(cache, \"expires\")\n * return [initial, beforeExpiry, afterExpiry]\n * })\n *\n * const actual = await Effect.runPromise(Effect.provide(program, TestClock.layer()))\n * actual // => [true, true, false]\n * ```\n *\n * **Example** (Checking multiple keys)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * // Checking multiple keys efficiently\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 100,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // Populate some entries\n * yield* Cache.set(cache, \"apple\", 5)\n * yield* Cache.set(cache, \"banana\", 6)\n *\n * // Check multiple keys\n * const keys = [\"apple\", \"banana\", \"cherry\", \"date\"]\n * const results: Array<string> = []\n * for (const key of keys) {\n * const exists = yield* Cache.has(cache, key)\n * results.push(`${key}: ${exists}`)\n * }\n * return results\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [\"apple: true\", \"banana: true\", \"cherry: false\", \"date: false\"]\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const has = /*#__PURE__*/dual(2, (self, key) => core.withFiber(fiber => {\n const oentry = getImpl(self, key, fiber, false);\n return effect.succeed(oentry !== undefined);\n}));\n/**\n * Invalidates the entry associated with the specified key in the cache.\n *\n * **Example** (Invalidating cached entries)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // Add a value to the cache\n * yield* Cache.get(cache, \"hello\")\n * const beforeInvalidation = yield* Cache.has(cache, \"hello\")\n *\n * // Invalidate the entry\n * yield* Cache.invalidate(cache, \"hello\")\n * const afterInvalidation = yield* Cache.has(cache, \"hello\")\n *\n * // Invalidating non-existent keys doesn't error\n * yield* Cache.invalidate(cache, \"nonexistent\")\n *\n * // Get after invalidation will invoke lookup again\n * let lookupCount = 0\n * const cache2 = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) =>\n * Effect.sync(() => {\n * lookupCount++\n * return key.length\n * })\n * })\n *\n * yield* Cache.get(cache2, \"test\") // lookupCount = 1\n * yield* Cache.invalidate(cache2, \"test\")\n * yield* Cache.get(cache2, \"test\") // lookupCount = 2 (lookup called again)\n * return { beforeInvalidation, afterInvalidation, lookupCount }\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => { beforeInvalidation: true, afterInvalidation: false, lookupCount: 2 }\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const invalidate = /*#__PURE__*/dual(2, (self, key) => effect.sync(() => {\n MutableHashMap.remove(self.map, key);\n}));\n/**\n * Invalidates the entry associated with the specified key in the cache when the\n * predicate returns true for the cached value.\n *\n * **Example** (Invalidating entries conditionally)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // Add values to the cache\n * yield* Cache.get(cache, \"hello\") // value = 5\n * yield* Cache.get(cache, \"hi\") // value = 2\n *\n * // Invalidate when value equals 5\n * const invalidated1 = yield* Cache.invalidateWhen(\n * cache,\n * \"hello\",\n * (value) => value === 5\n * )\n * const hasHello = yield* Cache.has(cache, \"hello\")\n *\n * // Don't invalidate when predicate doesn't match\n * const invalidated2 = yield* Cache.invalidateWhen(\n * cache,\n * \"hi\",\n * (value) => value === 5\n * )\n * const hasHi = yield* Cache.has(cache, \"hi\")\n *\n * // Returns false for non-existent keys\n * const invalidated3 = yield* Cache.invalidateWhen(\n * cache,\n * \"nonexistent\",\n * () => true\n * )\n *\n * // Returns false for failed cached values\n * const cacheWithErrors = yield* Cache.make<string, number, string>({\n * capacity: 10,\n * lookup: (key: string) =>\n * key === \"fail\" ? Effect.fail(\"error\") : Effect.succeed(key.length)\n * })\n *\n * yield* Effect.exit(Cache.get(cacheWithErrors, \"fail\"))\n * const invalidated4 = yield* Cache.invalidateWhen(\n * cacheWithErrors,\n * \"fail\",\n * () => true\n * )\n * return [invalidated1, hasHello, invalidated2, hasHi, invalidated3, invalidated4]\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [true, false, false, true, false, false]\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const invalidateWhen = /*#__PURE__*/dual(3, (self, key, f) => core.withFiber(fiber => {\n const oentry = getImpl(self, key, fiber, false);\n if (oentry === undefined) {\n return effect.succeed(false);\n }\n return oentry.await().pipe(effect.map(value => {\n if (f(value)) {\n const current = MutableHashMap.get(self.map, key);\n if (Option.isNone(current) || current.value !== oentry) {\n return false;\n }\n MutableHashMap.remove(self.map, key);\n return true;\n }\n return false;\n }), effect.catchCause(() => effect.succeed(false)));\n}));\n/**\n * Forces a refresh of the value associated with the specified key in the cache.\n *\n * **Details**\n *\n * It will always invoke the lookup function to construct a new value,\n * overwriting any existing value for that key.\n *\n * **Example** (Refreshing cached values)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * // Force refresh of existing cached values\n * const program = Effect.gen(function*() {\n * let counter = 0\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) => Effect.sync(() => `${key}-${++counter}`)\n * })\n *\n * // Initial cache population\n * const value1 = yield* Cache.get(cache, \"user\")\n *\n * // Get from cache (no lookup)\n * const value2 = yield* Cache.get(cache, \"user\")\n *\n * // Force refresh - always calls lookup\n * const refreshed = yield* Cache.refresh(cache, \"user\")\n *\n * // Subsequent gets return refreshed value\n * const value3 = yield* Cache.get(cache, \"user\")\n * return [value1, value2, refreshed, value3, counter]\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [\"user-1\", \"user-1\", \"user-2\", \"user-2\", 2]\n * ```\n *\n * **Example** (Resetting TTL on refresh)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n * import { TestClock } from \"effect/testing\"\n *\n * // Refresh resets TTL (Time To Live)\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) => Effect.succeed(key.length),\n * timeToLive: \"1 hour\"\n * })\n *\n * yield* Cache.get(cache, \"test\")\n * yield* TestClock.adjust(\"45 minutes\")\n *\n * // Entry would normally expire in 15 minutes\n * const beforeRefresh = yield* Cache.has(cache, \"test\")\n *\n * // Refresh resets the TTL to full 1 hour\n * yield* Cache.refresh(cache, \"test\")\n * yield* TestClock.adjust(\"30 minutes\")\n *\n * // Still valid because TTL was reset\n * const afterRefresh = yield* Cache.has(cache, \"test\")\n * return [beforeRefresh, afterRefresh]\n * })\n *\n * const actual = await Effect.runPromise(Effect.provide(program, TestClock.layer()))\n * actual // => [true, true]\n * ```\n *\n * **Example** (Refreshing missing keys)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * // Refresh non-existent keys\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) => Effect.succeed(`value-for-${key}`)\n * })\n *\n * // Refresh non-existent key creates new entry\n * const result = yield* Cache.refresh(cache, \"newKey\")\n *\n * // Verify it's now cached\n * const cached = yield* Cache.has(cache, \"newKey\")\n * return [result, cached]\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [\"value-for-newKey\", true]\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const refresh = /*#__PURE__*/dual(2, (self, key) => core.withFiber(fiber => {\n const entry = new EntryImpl(fiber, self.lookup(key));\n const existing = getImpl(self, key, fiber, false) !== undefined;\n if (!existing) {\n MutableHashMap.set(self.map, key, entry);\n checkCapacity(self);\n }\n entry.fiber.addObserver(exit => {\n if (effect.exitHasInterrupts(exit)) {\n const current = MutableHashMap.get(self.map, key);\n if (Option.isSome(current) && current.value === entry) {\n MutableHashMap.remove(self.map, key);\n }\n return;\n }\n const ttl = self.timeToLive(exit, key);\n if (Duration.isZero(ttl)) {\n const current = MutableHashMap.get(self.map, key);\n if (existing || Option.isSome(current) && current.value === entry) {\n MutableHashMap.remove(self.map, key);\n }\n return effect.void;\n }\n entry.expiresAt = Duration.isFinite(ttl) ? fiber.getRef(effect.ClockRef).currentTimeMillisUnsafe() + Duration.toMillis(ttl) : undefined;\n if (existing) {\n MutableHashMap.set(self.map, key, entry);\n checkCapacity(self);\n }\n });\n return entry.await();\n}));\n/**\n * Invalidates all entries in the cache.\n *\n * **Example** (Invalidating all entries)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * // Clear all cached entries at once\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // Populate cache with multiple entries\n * yield* Cache.get(cache, \"apple\")\n * yield* Cache.get(cache, \"banana\")\n * yield* Cache.get(cache, \"cherry\")\n *\n * const sizeBeforeInvalidation = yield* Cache.size(cache)\n * const hasAppleBeforeInvalidation = yield* Cache.has(cache, \"apple\")\n *\n * // Clear all entries\n * yield* Cache.invalidateAll(cache)\n *\n * // Verify cache is empty\n * const sizeAfterInvalidation = yield* Cache.size(cache)\n * const hasAppleAfterInvalidation = yield* Cache.has(cache, \"apple\")\n * const hasBananaAfterInvalidation = yield* Cache.has(cache, \"banana\")\n * const hasCherryAfterInvalidation = yield* Cache.has(cache, \"cherry\")\n * return [\n * sizeBeforeInvalidation,\n * hasAppleBeforeInvalidation,\n * sizeAfterInvalidation,\n * hasAppleAfterInvalidation,\n * hasBananaAfterInvalidation,\n * hasCherryAfterInvalidation\n * ]\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [3, true, 0, false, false, false]\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const invalidateAll = self => effect.sync(() => {\n MutableHashMap.clear(self.map);\n});\n/**\n * Retrieves the approximate number of entries in the cache.\n *\n * **Details**\n *\n * Note that expired entries are counted until they are accessed and removed.\n * The size reflects the current number of entries stored, not the number\n * of valid entries.\n *\n * **Example** (Reading cache size)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // Empty cache has size 0\n * const emptySize = yield* Cache.size(cache)\n *\n * // Add entries and check size\n * yield* Cache.get(cache, \"hello\")\n * yield* Cache.get(cache, \"world\")\n * const sizeAfterAdding = yield* Cache.size(cache)\n *\n * // Size decreases after invalidation\n * yield* Cache.invalidate(cache, \"hello\")\n * const sizeAfterInvalidation = yield* Cache.size(cache)\n * return [emptySize, sizeAfterAdding, sizeAfterInvalidation]\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [0, 2, 1]\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const size = self => effect.sync(() => MutableHashMap.size(self.map));\n/**\n * Retrieves all active keys from the cache, automatically filtering out expired entries.\n *\n * **Example** (Reading active keys)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * // Basic key enumeration\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // Add some entries to the cache\n * yield* Cache.get(cache, \"hello\")\n * yield* Cache.get(cache, \"world\")\n * yield* Cache.get(cache, \"cache\")\n *\n * // Retrieve all active keys\n * const keys = yield* Cache.keys(cache)\n * return Array.from(keys).sort()\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [\"cache\", \"hello\", \"world\"]\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const keys = self => core.withFiber(fiber => {\n const now = fiber.getRef(effect.ClockRef).currentTimeMillisUnsafe();\n return effect.succeed(Iterable.filterMap(self.map, ([key, entry]) => {\n if (entry.expiresAt === undefined || entry.expiresAt > now) {\n return Result.succeed(key);\n }\n MutableHashMap.remove(self.map, key);\n return Result.failVoid;\n }));\n});\n/**\n * Retrieves all successfully cached values from the cache, excluding failed\n * lookups and expired entries.\n *\n * **Example** (Reading all cached values)\n *\n * ```ts import.meta.vitest\n * import { Cache, Effect } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const cache = yield* Cache.make({\n * capacity: 10,\n * lookup: (key: string) => Effect.succeed(key.length)\n * })\n *\n * // Add some values to the cache\n * yield* Cache.get(cache, \"a\")\n * yield* Cache.get(cache, \"ab\")\n * yield* Cache.get(cache, \"abc\")\n *\n * // Retrieve all cached values\n * const values = yield* Cache.values(cache)\n * return Array.from(values).sort()\n * })\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [1, 2, 3]\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const values = self => effect.map(entries(self), Iterable.map(([, value]) => value));\n/**\n * Retrieves all key-value pairs from the cache as an iterable. This function\n * only returns entries with successfully resolved values, filtering out any\n * failed lookups or expired entries.\n *\n * **Gotchas**\n *\n * Expired entries are removed from the cache while `entries` filters them out.\n *\n * @see {@link keys} for retrieving only cached keys\n * @see {@link values} for retrieving only cached values\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const entries = self => core.withFiber(fiber => {\n const now = fiber.getRef(effect.ClockRef).currentTimeMillisUnsafe();\n return effect.succeed(Iterable.filterMap(self.map, ([key, entry]) => {\n if (entry.expiresAt === undefined || entry.expiresAt > now) {\n const exit = entry.fiber.pollUnsafe();\n return exit && exit._tag === \"Success\" ? Result.succeed([key, exit.value]) : Result.failVoid;\n }\n MutableHashMap.remove(self.map, key);\n return Result.failVoid;\n }));\n});\n//# sourceMappingURL=Cache.js.map","import * as Effect from \"../../Effect.js\";\nimport { dual } from \"../../Function.js\";\nimport * as InternalRecord from \"../../internal/record.js\";\nimport { pipeArguments } from \"../../Pipeable.js\";\nimport * as Predicate from \"../../Predicate.js\";\nimport * as Schema from \"../../Schema.js\";\nimport * as Struct_ from \"../../Struct.js\";\n/**\n * Runtime type identifier attached to variant schema structs.\n *\n * @category type IDs\n * @since 4.0.0\n */\nexport const TypeId = \"~effect/schema/VariantSchema\";\nconst cacheSymbol = /*#__PURE__*/Symbol.for(`${TypeId}/cache`);\nconst defaultCacheSymbol = /*#__PURE__*/Symbol.for(`${TypeId}/defaultCache`);\n/**\n * Returns `true` when a value is a variant schema struct.\n *\n * @category guards\n * @since 4.0.0\n */\nexport const isStruct = u => Predicate.hasProperty(u, TypeId);\nconst FieldTypeId = \"~effect/schema/VariantSchema/Field\";\n/**\n * Returns `true` when a value is a variant schema field.\n *\n * @category guards\n * @since 4.0.0\n */\nexport const isField = u => Predicate.hasProperty(u, FieldTypeId);\nconst extract = /*#__PURE__*/dual(args => isStruct(args[0]), (self, variant, options) => {\n if (options?.isDefault === true && Schema.isSchema(self)) {\n return self;\n }\n const cache = options?.isDefault === true ? self[defaultCacheSymbol] ?? (self[defaultCacheSymbol] = Object.create(null)) : self[cacheSymbol] ?? (self[cacheSymbol] = Object.create(null));\n if (Object.hasOwn(cache, variant)) {\n return cache[variant];\n }\n const fields = {};\n for (const key of Object.keys(self[TypeId])) {\n const value = self[TypeId][key];\n if (value === undefined) {\n continue;\n }\n if (TypeId in value) {\n if (options?.isDefault === true && Schema.isSchema(value)) {\n InternalRecord.assignProperty(fields, key, value);\n } else {\n InternalRecord.assignProperty(fields, key, extract(value, variant));\n }\n } else if (FieldTypeId in value) {\n if (Object.hasOwn(value.schemas, variant)) {\n const schema = value.schemas[variant];\n if (schema !== undefined) {\n InternalRecord.assignProperty(fields, key, schema);\n }\n }\n } else {\n InternalRecord.assignProperty(fields, key, value);\n }\n }\n const schema = Schema.Struct(fields);\n cache[variant] = schema;\n return schema;\n});\n/**\n * Returns the original field definitions stored on a variant schema struct.\n *\n * @category accessors\n * @since 4.0.0\n */\nexport const fields = self => self[TypeId];\n/**\n * Creates a variant schema toolkit for a fixed set of variant names and a default\n * variant.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const make = options => {\n function Class(identifier) {\n return function (fields, annotations) {\n const variantStruct = Struct(fields);\n const schema = extract(variantStruct, options.defaultVariant, {\n isDefault: true\n });\n const SClass = Schema.Class;\n class Base extends SClass(identifier)(schema.fields, annotations) {\n static [TypeId] = fields;\n }\n for (const variant of options.variants) {\n Object.defineProperty(Base, variant, {\n value: extract(variantStruct, variant).annotate({\n id: `${identifier}.${variant}`,\n title: `${identifier}.${variant}`\n })\n });\n }\n return Base;\n };\n }\n function FieldOnly(keys) {\n return function (schema) {\n const obj = {};\n for (const key of keys) {\n InternalRecord.assignProperty(obj, key, schema);\n }\n return Field(obj);\n };\n }\n function FieldExcept(keys) {\n return function (schema) {\n const obj = {};\n for (const variant of options.variants) {\n if (!keys.includes(variant)) {\n InternalRecord.assignProperty(obj, variant, schema);\n }\n }\n return Field(obj);\n };\n }\n function UnionVariants(members) {\n return Union(members, options.defaultVariant, options.variants);\n }\n const fieldEvolve = dual(2, (self, f) => {\n const field = isField(self) ? self : Field(Object.fromEntries(options.variants.map(variant => [variant, self])));\n return Field(Struct_.evolve(field.schemas, f));\n });\n const extractVariants = dual(2, (self, variant) => extract(self, variant, {\n isDefault: variant === options.defaultVariant\n }));\n return {\n Struct,\n Field,\n FieldOnly,\n FieldExcept,\n Class,\n Union: UnionVariants,\n fieldEvolve,\n // fieldFromKey,\n extract: extractVariants\n };\n};\n/**\n * Marks a value as an explicit override for an `Overrideable` schema default.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const Override = value => value;\n/**\n * Wraps a schema with an effectful constructor default while allowing explicit\n * values to be marked with `Override`.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const Overrideable = (schema, options) => schema.pipe(Schema.decodeTo(Schema.brand(\"Override\")(Schema.toType(schema))), Schema.withConstructorDefault(Effect.map(options.defaultValue, Override)));\nconst StructProto = {\n pipe() {\n return pipeArguments(this, arguments);\n }\n};\nconst Struct = fields => {\n const self = Object.create(StructProto);\n self[TypeId] = fields;\n return self;\n};\nconst FieldProto = {\n [FieldTypeId]: FieldTypeId,\n pipe() {\n return pipeArguments(this, arguments);\n }\n};\nconst Field = schemas => {\n const self = Object.create(FieldProto);\n self.schemas = schemas;\n return self;\n};\nconst Union = (members, defaultVariant, variants) => {\n const VariantUnion = Schema.Union(members.map(member => Schema.isSchema(member) ? member : extract(member, defaultVariant, {\n isDefault: true\n })));\n for (const variant of variants) {\n Object.defineProperty(VariantUnion, variant, {\n value: Schema.Union(members.map(member => extract(member, variant)))\n });\n }\n return VariantUnion;\n};\n//# sourceMappingURL=VariantSchema.js.map","import * as DateTime from \"../../DateTime.js\";\nimport * as Effect from \"../../Effect.js\";\nimport * as Uuid from \"../../internal/uuid.js\";\nimport * as Option from \"../../Option.js\";\nimport * as Predicate from \"../../Predicate.js\";\nimport * as Schema from \"../../Schema.js\";\nimport * as SchemaGetter from \"../../SchemaGetter.js\";\nimport * as SchemaTransformation from \"../../SchemaTransformation.js\";\nimport * as UndefinedOr from \"../../UndefinedOr.js\";\nimport * as VariantSchema from \"./VariantSchema.js\";\nconst {\n Class,\n Field,\n FieldExcept,\n FieldOnly,\n Struct,\n Union,\n extract,\n fieldEvolve\n} = /*#__PURE__*/VariantSchema.make({\n variants: [\"select\", \"insert\", \"update\", \"json\", \"jsonCreate\", \"jsonUpdate\"],\n defaultVariant: \"select\"\n});\nexport {\n/**\n * Creates domain model schemas with common database and JSON API variants.\n *\n * **Example** (Defining a variant model class)\n *\n * ```ts import.meta.vitest\n * import { Schema } from \"effect\"\n * import { Model } from \"effect/unstable/schema\"\n *\n * export const GroupId = Schema.Number.pipe(Schema.brand(\"GroupId\"))\n *\n * export class Group extends Model.Class<Group>(\"Group\")({\n * id: Model.GeneratedByDb(GroupId),\n * name: Schema.String,\n * createdAt: Model.DateTimeInsertFromDate,\n * updatedAt: Model.DateTimeUpdateFromDate\n * }) {}\n *\n * // schema used for selects\n * Group\n *\n * // schema used for inserts\n * Group.insert\n *\n * // schema used for updates\n * Group.update\n *\n * // schema used for json api\n * Group.json\n * Group.jsonCreate\n * Group.jsonUpdate\n *\n * // you can also turn them into classes\n * class GroupJson extends Schema.Class<GroupJson>(\"GroupJson\")(Group.json) {\n * get upperName() {\n * return this.name.toUpperCase()\n * }\n * }\n *\n * [Schema.isSchema(Group), Schema.isSchema(Group.insert), Schema.isSchema(Group.json)] // => [true, true, true]\n * ```\n *\n * @category constructors\n * @since 4.0.0\n */\nClass,\n/**\n * Extracts a generated variant schema from a model or variant struct.\n *\n * @category converting\n * @since 4.0.0\n */\nextract,\n/**\n * Creates a variant field from schemas keyed by variant name.\n *\n * @category constructors\n * @since 4.0.0\n */\nField,\n/**\n * Transforms schemas inside a variant field or plain schema by variant name.\n *\n * @category transforming\n * @since 4.0.0\n */\nfieldEvolve,\n/**\n * Creates a variant field that applies a schema to every variant except the\n * supplied keys.\n *\n * @category constructors\n * @since 4.0.0\n */\nFieldExcept,\n/**\n * Creates a variant field that applies a schema only to the supplied variants.\n *\n * @category constructors\n * @since 4.0.0\n */\nFieldOnly,\n/**\n * Creates a variant struct from model field definitions.\n *\n * @category constructors\n * @since 4.0.0\n */\nStruct,\n/**\n * Creates a union over the default and generated variant schemas of multiple\n * variant structs.\n *\n * @category constructors\n * @since 4.0.0\n */\nUnion };\n/**\n * Returns the variant field definitions stored on a model or variant struct.\n *\n * @category getters\n * @since 4.0.0\n */\nexport const fields = VariantSchema.fields;\n/**\n * Marks a value as an explicit override for fields that otherwise use an\n * overrideable default.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const Override = VariantSchema.Override;\n/**\n * Creates a variant field for a database-generated column available in read\n * variants only.\n *\n * **Details**\n *\n * The field is included in `select` and `json`, and omitted from `insert`,\n * `update`, `jsonCreate`, and `jsonUpdate`.\n *\n * @see {@link Field} for generated columns that need a custom variant set, such\n * as primary keys used in update payloads.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const GeneratedByDb = schema => Field({\n select: schema,\n json: schema\n});\n/**\n * A field that represents a value generated by the application and present in database\n * variants and the read JSON variant, but omitted from JSON create and update\n * variants.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const GeneratedByApp = schema => Field({\n select: schema,\n insert: schema,\n update: schema,\n json: schema\n});\n/**\n * A field that represents a sensitive value that should not be exposed in the\n * JSON variants.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const Sensitive = schema => Field({\n select: schema,\n insert: schema,\n update: schema\n});\n/**\n * Creates a schema for optional keys that decodes missing or null encoded values\n * through `Option` and encodes `Option` values back to optional nullable keys.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const optionalOption = schema => Schema.optionalKey(Schema.NullOr(schema)).pipe(Schema.decodeTo(Schema.Option(Schema.toType(schema)), SchemaTransformation.transformOptional({\n decode: oe => oe.pipe(Option.filter(Predicate.isNotNull), Option.some),\n encode: Option.flatten\n})));\n/**\n * Converts a field to one that is optional for all variants.\n *\n * **Details**\n *\n * For the database variants, it will accept `null`able values.\n * For the JSON variants, it will also accept missing keys.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const FieldOption = /*#__PURE__*/fieldEvolve({\n select: /*#__PURE__*/UndefinedOr.map(Schema.OptionFromNullOr),\n insert: /*#__PURE__*/UndefinedOr.map(Schema.OptionFromNullOr),\n update: /*#__PURE__*/UndefinedOr.map(Schema.OptionFromNullOr),\n json: /*#__PURE__*/UndefinedOr.map(optionalOption),\n jsonCreate: /*#__PURE__*/UndefinedOr.map(optionalOption),\n jsonUpdate: /*#__PURE__*/UndefinedOr.map(optionalOption)\n});\n/**\n * Schema for sqlite booleans that are represented as `0 | 1` in database\n * variants and `boolean` in JSON variants.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const BooleanSqlite = /*#__PURE__*/Field({\n select: Schema.BooleanFromBit,\n insert: Schema.BooleanFromBit,\n update: Schema.BooleanFromBit,\n json: Schema.Boolean,\n jsonCreate: Schema.Boolean,\n jsonUpdate: Schema.Boolean\n});\n/**\n * Schema for a `DateTime.Utc` that is serialized as a date string in the\n * format `YYYY-MM-DD`.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const Date = /*#__PURE__*/Schema.String.pipe(/*#__PURE__*/Schema.decodeTo(Schema.DateTimeUtc, {\n decode: /*#__PURE__*/SchemaGetter.dateTimeUtcFromInput().map(DateTime.removeTime),\n encode: /*#__PURE__*/SchemaGetter.transform(DateTime.formatIsoDate)\n}));\n/**\n * Schema for an overrideable UTC date-only field whose constructor default is\n * the current date with the time component removed.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const DateWithNow = /*#__PURE__*/VariantSchema.Overrideable(Date, {\n defaultValue: /*#__PURE__*/Effect.map(DateTime.now, DateTime.removeTime)\n});\n/**\n * Schema for an overrideable UTC date-time field encoded as a string and\n * defaulted to the current `DateTime.Utc`.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const DateTimeWithNow = /*#__PURE__*/VariantSchema.Overrideable(Schema.DateTimeUtcFromString, {\n defaultValue: DateTime.now\n});\n/**\n * Schema for an overrideable UTC date-time field encoded as a JavaScript `Date`\n * and defaulted to the current `DateTime.Utc`.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const DateTimeFromDateWithNow = /*#__PURE__*/VariantSchema.Overrideable(Schema.DateTimeUtcFromDate, {\n defaultValue: DateTime.now\n});\n/**\n * Schema for an overrideable UTC date-time field encoded as milliseconds and\n * defaulted to the current `DateTime.Utc`.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const DateTimeFromNumberWithNow = /*#__PURE__*/VariantSchema.Overrideable(Schema.DateTimeUtcFromMillis, {\n defaultValue: DateTime.now\n});\n/**\n * A field that represents a date-time value that is inserted as the current\n * `DateTime.Utc`. It is serialized as a string for the database.\n *\n * **Details**\n *\n * It is omitted from updates and is available for selection.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const DateTimeInsert = /*#__PURE__*/Field({\n select: Schema.DateTimeUtcFromString,\n insert: DateTimeWithNow,\n json: Schema.DateTimeUtcFromString\n});\n/**\n * A field that represents a date-time value that is inserted as the current\n * `DateTime.Utc`. It is serialized as a `Date` for the database.\n *\n * **Details**\n *\n * It is omitted from updates and is available for selection.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const DateTimeInsertFromDate = /*#__PURE__*/Field({\n select: Schema.DateTimeUtcFromDate,\n insert: DateTimeFromDateWithNow,\n json: Schema.DateTimeUtcFromString\n});\n/**\n * A field that represents a date-time value that is inserted as the current\n * `DateTime.Utc`. It is serialized as a `number`.\n *\n * **Details**\n *\n * It is omitted from updates and is available for selection.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const DateTimeInsertFromNumber = /*#__PURE__*/Field({\n select: Schema.DateTimeUtcFromMillis,\n insert: DateTimeFromNumberWithNow,\n json: Schema.DateTimeUtcFromMillis\n});\n/**\n * A field that represents a date-time value that is updated as the current\n * `DateTime.Utc`. It is serialized as a string for the database.\n *\n * **Details**\n *\n * It is set to the current `DateTime.Utc` on updates and inserts and is\n * available for selection.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const DateTimeUpdate = /*#__PURE__*/Field({\n select: Schema.DateTimeUtcFromString,\n insert: DateTimeWithNow,\n update: DateTimeWithNow,\n json: Schema.DateTimeUtcFromString\n});\n/**\n * A field that represents a date-time value that is updated as the current\n * `DateTime.Utc`. It is serialized as a `Date` for the database.\n *\n * **Details**\n *\n * It is set to the current `DateTime.Utc` on updates and inserts and is\n * available for selection.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const DateTimeUpdateFromDate = /*#__PURE__*/Field({\n select: Schema.DateTimeUtcFromDate,\n insert: DateTimeFromDateWithNow,\n update: DateTimeFromDateWithNow,\n json: Schema.DateTimeUtcFromString\n});\n/**\n * A field that represents a date-time value that is updated as the current\n * `DateTime.Utc`. It is serialized as a `number`.\n *\n * **Details**\n *\n * It is set to the current `DateTime.Utc` on updates and inserts and is\n * available for selection.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const DateTimeUpdateFromNumber = /*#__PURE__*/Field({\n select: Schema.DateTimeUtcFromMillis,\n insert: DateTimeFromNumberWithNow,\n update: DateTimeFromNumberWithNow,\n json: Schema.DateTimeUtcFromMillis\n});\n/**\n * A field that represents a JSON value stored as text in the database.\n *\n * **Details**\n *\n * The \"json\" variants will use the object schema directly.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const JsonFromString = schema => {\n const parsed = Schema.fromJsonString(Schema.toCodecJson(schema));\n return Field({\n select: parsed,\n insert: parsed,\n update: parsed,\n json: schema,\n jsonCreate: schema,\n jsonUpdate: schema\n });\n};\n/**\n * Schema for binary `Uint8Array` values backed by an `ArrayBuffer`.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const Uint8Array = Schema.Uint8Array;\n/**\n * Adds a constructor default that generates a binary UUID v4 for a branded\n * `Uint8Array` schema.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const UuidV4BytesWithGenerate = schema => schema.pipe(Schema.withConstructorDefault(Effect.sync(() => Uuid.v4Bytes())));\n/**\n * A field that represents a binary UUID v4 that is generated on inserts.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const UuidV4BytesInsert = schema => Field({\n select: schema,\n insert: UuidV4BytesWithGenerate(schema),\n update: schema,\n json: schema\n});\n/**\n * Adds a constructor default that generates a string UUID v4.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const UuidV4WithGenerate = schema => schema.pipe(Schema.withConstructorDefault(Effect.sync(Uuid.v4String)));\n/**\n * A field that represents a string UUID v4 that is generated on inserts.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const UuidV4Insert = schema => Field({\n select: schema,\n insert: UuidV4WithGenerate(schema),\n update: schema,\n json: schema\n});\n/**\n * Adds a constructor default that generates a string UUID v7.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const UuidV7WithGenerate = schema => schema.pipe(Schema.withConstructorDefault(Effect.clockWith(clock => Effect.succeed(Uuid.v7String(clock.currentTimeMillisUnsafe())))));\n/**\n * A field that represents a string UUID v7 that is generated on inserts.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const UuidV7Insert = schema => Field({\n select: schema,\n insert: UuidV7WithGenerate(schema),\n update: schema,\n json: schema\n});\n//# sourceMappingURL=Model.js.map","/**\n * Defines structured failures for SQL clients and driver integrations.\n *\n * `SqlError` wraps the different reasons a SQL operation can fail, such as\n * connection, authentication, authorization, syntax, constraint, or transaction\n * problems. Each reason keeps the original cause, optional message and\n * operation metadata, and whether retrying may succeed. This module also\n * includes schemas, guards, a SQLite error classifier, and the\n * `ResultLengthMismatch` error used by ordered batched SQL resolvers.\n *\n * @since 4.0.0\n */\nimport * as Predicate from \"../../Predicate.js\";\nimport * as Schema from \"../../Schema.js\";\nconst TypeId = \"~effect/sql/SqlError\";\nconst ReasonTypeId = \"~effect/sql/SqlError/Reason\";\nconst ReasonFields = {\n cause: /*#__PURE__*/Schema.Defect(),\n message: /*#__PURE__*/Schema.optional(Schema.String),\n operation: /*#__PURE__*/Schema.optional(Schema.String)\n};\n/**\n * SQL error reason for connection or open failures; marked retryable.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class ConnectionError extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/SqlError/ConnectionError\")(\"ConnectionError\", ReasonFields) {\n /**\n * Marks this value as a structured SQL error reason for runtime guards.\n *\n * @since 4.0.0\n */\n [ReasonTypeId] = ReasonTypeId;\n /**\n * Indicates whether retrying the failed SQL operation may succeed.\n *\n * @since 4.0.0\n */\n get isRetryable() {\n return true;\n }\n}\n/**\n * SQL error reason for authentication failures such as invalid credentials; not\n * marked retryable.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class AuthenticationError extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/SqlError/AuthenticationError\")(\"AuthenticationError\", ReasonFields) {\n /**\n * Marks this value as a structured SQL error reason for runtime guards.\n *\n * @since 4.0.0\n */\n [ReasonTypeId] = ReasonTypeId;\n /**\n * Indicates whether retrying the failed SQL operation may succeed.\n *\n * @since 4.0.0\n */\n get isRetryable() {\n return false;\n }\n}\n/**\n * SQL error reason for authorization or permission failures; not marked\n * retryable.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class AuthorizationError extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/SqlError/AuthorizationError\")(\"AuthorizationError\", ReasonFields) {\n /**\n * Marks this value as a structured SQL error reason for runtime guards.\n *\n * @since 4.0.0\n */\n [ReasonTypeId] = ReasonTypeId;\n /**\n * Indicates whether retrying the failed SQL operation may succeed.\n *\n * @since 4.0.0\n */\n get isRetryable() {\n return false;\n }\n}\n/**\n * SQL error reason for invalid SQL syntax; not marked retryable.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class SqlSyntaxError extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/SqlError/SqlSyntaxError\")(\"SqlSyntaxError\", ReasonFields) {\n /**\n * Marks this value as a structured SQL error reason for runtime guards.\n *\n * @since 4.0.0\n */\n [ReasonTypeId] = ReasonTypeId;\n /**\n * Indicates whether retrying the failed SQL operation may succeed.\n *\n * @since 4.0.0\n */\n get isRetryable() {\n return false;\n }\n}\nconst UniqueViolationFields = {\n ...ReasonFields,\n constraint: Schema.String\n};\n/**\n * SQL error reason for a unique constraint violation, including the violated\n * constraint identifier; not marked retryable.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class UniqueViolation extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/SqlError/UniqueViolation\")(\"UniqueViolation\", UniqueViolationFields) {\n /**\n * Marks this value as a structured SQL error reason for runtime guards.\n *\n * @since 4.0.0\n */\n [ReasonTypeId] = ReasonTypeId;\n /**\n * Indicates whether retrying the failed SQL operation may succeed.\n *\n * @since 4.0.0\n */\n get isRetryable() {\n return false;\n }\n}\n/**\n * SQL error reason for a non-unique constraint violation; not marked retryable.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class ConstraintError extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/SqlError/ConstraintError\")(\"ConstraintError\", ReasonFields) {\n /**\n * Marks this value as a structured SQL error reason for runtime guards.\n *\n * @since 4.0.0\n */\n [ReasonTypeId] = ReasonTypeId;\n /**\n * Indicates whether retrying the failed SQL operation may succeed.\n *\n * @since 4.0.0\n */\n get isRetryable() {\n return false;\n }\n}\n/**\n * SQL error reason for a database deadlock; marked retryable.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class DeadlockError extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/SqlError/DeadlockError\")(\"DeadlockError\", ReasonFields) {\n /**\n * Marks this value as a structured SQL error reason for runtime guards.\n *\n * @since 4.0.0\n */\n [ReasonTypeId] = ReasonTypeId;\n /**\n * Indicates whether retrying the failed SQL operation may succeed.\n *\n * @since 4.0.0\n */\n get isRetryable() {\n return true;\n }\n}\n/**\n * SQL error reason for a transaction serialization or isolation conflict;\n * marked retryable.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class SerializationError extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/SqlError/SerializationError\")(\"SerializationError\", ReasonFields) {\n /**\n * Marks this value as a structured SQL error reason for runtime guards.\n *\n * @since 4.0.0\n */\n [ReasonTypeId] = ReasonTypeId;\n /**\n * Indicates whether retrying the failed SQL operation may succeed.\n *\n * @since 4.0.0\n */\n get isRetryable() {\n return true;\n }\n}\n/**\n * SQL error reason for timing out while waiting on a database lock; marked\n * retryable.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class LockTimeoutError extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/SqlError/LockTimeoutError\")(\"LockTimeoutError\", ReasonFields) {\n /**\n * Marks this value as a structured SQL error reason for runtime guards.\n *\n * @since 4.0.0\n */\n [ReasonTypeId] = ReasonTypeId;\n /**\n * Indicates whether retrying the failed SQL operation may succeed.\n *\n * @since 4.0.0\n */\n get isRetryable() {\n return true;\n }\n}\n/**\n * SQL error reason for a statement or query timeout; marked retryable.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class StatementTimeoutError extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/SqlError/StatementTimeoutError\")(\"StatementTimeoutError\", ReasonFields) {\n /**\n * Marks this value as a structured SQL error reason for runtime guards.\n *\n * @since 4.0.0\n */\n [ReasonTypeId] = ReasonTypeId;\n /**\n * Indicates whether retrying the failed SQL operation may succeed.\n *\n * @since 4.0.0\n */\n get isRetryable() {\n return true;\n }\n}\n/**\n * SQL error reason for an unclassified database failure; not marked retryable.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class UnknownError extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/SqlError/UnknownError\")(\"UnknownError\", ReasonFields) {\n /**\n * Marks this value as a structured SQL error reason for runtime guards.\n *\n * @since 4.0.0\n */\n [ReasonTypeId] = ReasonTypeId;\n /**\n * Indicates whether retrying the failed SQL operation may succeed.\n *\n * @since 4.0.0\n */\n get isRetryable() {\n return false;\n }\n}\n/**\n * Schema for encoding and decoding SQL error reasons.\n *\n * @category schemas\n * @since 4.0.0\n */\nexport const SqlErrorReason = /*#__PURE__*/Schema.Union([ConnectionError, AuthenticationError, AuthorizationError, SqlSyntaxError, UniqueViolation, ConstraintError, DeadlockError, SerializationError, LockTimeoutError, StatementTimeoutError, UnknownError]);\n/**\n * Error wrapper for SQL failures whose `message`, `cause`, and `isRetryable`\n * values are derived from its `SqlErrorReason`.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class SqlError extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/SqlError\")(\"SqlError\", {\n reason: SqlErrorReason\n}) {\n /**\n * Marks this value as the top-level SQL error wrapper for runtime guards.\n *\n * @since 4.0.0\n */\n [TypeId] = TypeId;\n /**\n * Exposes the structured SQL reason as the JavaScript error cause.\n *\n * @since 4.0.0\n */\n cause = this.reason;\n /**\n * Uses the reason message when present, otherwise falls back to the reason tag.\n *\n * @since 4.0.0\n */\n get message() {\n return this.reason.message || this.reason._tag;\n }\n /**\n * Delegates retryability to the underlying SQL error reason.\n *\n * @since 4.0.0\n */\n get isRetryable() {\n return this.reason.isRetryable;\n }\n}\n/**\n * Returns `true` when a value is a `SqlError`.\n *\n * @category guards\n * @since 4.0.0\n */\nexport const isSqlError = u => Predicate.hasProperty(u, TypeId);\n/**\n * Returns `true` when a value is a `SqlErrorReason`.\n *\n * @category guards\n * @since 4.0.0\n */\nexport const isSqlErrorReason = u => Predicate.hasProperty(u, ReasonTypeId);\nconst sqliteCodeFromCause = cause => {\n if (!Predicate.hasProperty(cause, \"code\")) {\n return undefined;\n }\n const code = cause.code;\n return typeof code === \"string\" || typeof code === \"number\" ? code : undefined;\n};\nconst sqliteNumericCodeFromCause = cause => {\n const code = sqliteCodeFromCause(cause);\n if (typeof code === \"number\") {\n return code;\n }\n if (!Predicate.hasProperty(cause, \"errno\")) {\n return undefined;\n }\n const errno = cause.errno;\n return typeof errno === \"number\" ? errno : undefined;\n};\nconst matchesSqliteNumericCode = (cause, expected) => {\n const code = sqliteCodeFromCause(cause);\n if (code === expected) {\n return true;\n }\n if (!Predicate.hasProperty(cause, \"errno\")) {\n return false;\n }\n return cause.errno === expected;\n};\nconst matchesSqliteCode = (code, expected) => code === expected || code.startsWith(expected + \"_\");\nconst UNKNOWN_CONSTRAINT = \"unknown\";\nconst SQLITE_CONSTRAINT_UNIQUE = \"SQLITE_CONSTRAINT_UNIQUE\";\nconst SQLITE_CONSTRAINT_UNIQUE_CODE = 2067;\nconst normalizeConstraintIdentifier = identifier => {\n if (typeof identifier !== \"string\") {\n return UNKNOWN_CONSTRAINT;\n }\n const trimmed = identifier.trim();\n return trimmed.length === 0 ? UNKNOWN_CONSTRAINT : trimmed;\n};\nconst sqliteUniqueConstraintFromCause = cause => {\n if (Predicate.hasProperty(cause, \"constraint\")) {\n return normalizeConstraintIdentifier(cause.constraint);\n }\n if (!Predicate.hasProperty(cause, \"message\")) {\n return UNKNOWN_CONSTRAINT;\n }\n const message = cause.message;\n if (typeof message !== \"string\") {\n return UNKNOWN_CONSTRAINT;\n }\n const prefix = \"UNIQUE constraint failed:\";\n const index = message.indexOf(prefix);\n return index === -1 ? UNKNOWN_CONSTRAINT : normalizeConstraintIdentifier(message.slice(index + prefix.length));\n};\n/**\n * Classifies a native SQLite error cause into a `SqlErrorReason` using its\n * `code` or `errno`, with optional message and operation metadata.\n *\n * @category converting\n * @since 4.0.0\n */\nexport const classifySqliteError = (cause, {\n message,\n operation\n} = {}) => {\n const props = {\n cause,\n message,\n operation\n };\n const code = sqliteCodeFromCause(cause);\n const numericCode = sqliteNumericCodeFromCause(cause);\n if (code === SQLITE_CONSTRAINT_UNIQUE || matchesSqliteNumericCode(cause, SQLITE_CONSTRAINT_UNIQUE_CODE)) {\n return new UniqueViolation({\n ...props,\n constraint: sqliteUniqueConstraintFromCause(cause)\n });\n }\n if (typeof code === \"string\") {\n if (matchesSqliteCode(code, \"SQLITE_AUTH\")) {\n return new AuthenticationError(props);\n }\n if (matchesSqliteCode(code, \"SQLITE_PERM\")) {\n return new AuthorizationError(props);\n }\n if (matchesSqliteCode(code, \"SQLITE_CONSTRAINT\")) {\n return new ConstraintError(props);\n }\n if (matchesSqliteCode(code, \"SQLITE_BUSY\") || matchesSqliteCode(code, \"SQLITE_LOCKED\")) {\n return new LockTimeoutError(props);\n }\n if (matchesSqliteCode(code, \"SQLITE_CANTOPEN\")) {\n return new ConnectionError(props);\n }\n }\n if (typeof numericCode === \"number\") {\n const code = numericCode & 0xff;\n switch (code) {\n case 23:\n return new AuthenticationError(props);\n case 3:\n return new AuthorizationError(props);\n case 19:\n return new ConstraintError(props);\n case 5:\n case 6:\n return new LockTimeoutError(props);\n case 14:\n return new ConnectionError(props);\n default:\n return new UnknownError(props);\n }\n }\n return new UnknownError(props);\n};\n/**\n * Error raised when an ordered batched SQL resolver receives a different number\n * of result rows than requests.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class ResultLengthMismatch extends /*#__PURE__*/Schema.TaggedError(\"effect/sql/ResultLengthMismatch\")(\"ResultLengthMismatch\", {\n expected: Schema.Natural,\n actual: Schema.Natural\n}) {\n /**\n * Explains the mismatch between expected and actual batched SQL result counts.\n *\n * @since 4.0.0\n */\n get message() {\n return `Expected ${this.expected} results but got ${this.actual}`;\n }\n}\n//# sourceMappingURL=SqlError.js.map","/**\n * Schema-aware `RequestResolver` helpers for SQL-backed data loading.\n *\n * This module represents each lookup or mutation as a `SqlRequest` and batches\n * concurrent requests into SQL operations. Request payloads are encoded with the\n * request schema before `execute` is called, and returned rows are decoded with\n * the result schema before requests are completed. It provides ordered,\n * grouped, id-based, and side-effect-only resolver constructors, and keeps\n * batches separated by the active SQL transaction connection.\n *\n * @since 4.0.0\n */\nimport * as Arr from \"../../Array.js\";\nimport * as Cause from \"../../Cause.js\";\nimport * as Context from \"../../Context.js\";\nimport * as Effect from \"../../Effect.js\";\nimport * as Equal from \"../../Equal.js\";\nimport * as Exit from \"../../Exit.js\";\nimport * as Hash from \"../../Hash.js\";\nimport * as MutableHashMap from \"../../MutableHashMap.js\";\nimport * as Option from \"../../Option.js\";\nimport * as Request from \"../../Request.js\";\nimport * as RequestResolver from \"../../RequestResolver.js\";\nimport * as Schema from \"../../Schema.js\";\nimport * as SqlClient from \"./SqlClient.js\";\nimport { ResultLengthMismatch } from \"./SqlError.js\";\nconst SqlRequestProto = {\n ...Request.Class.prototype,\n [Equal.symbol](that) {\n return Equal.equals(this.payload, that.payload);\n },\n [Hash.symbol]() {\n return Hash.hash(this.payload);\n }\n};\n/**\n * Runs a payload as a `SqlRequest` through a request resolver, either directly\n * with a payload and resolver or curried by resolver.\n *\n * @category running\n * @since 4.0.0\n */\nexport const request = function () {\n if (arguments.length === 1) {\n const resolver = arguments[0];\n return payload => Effect.request(SqlRequest(payload), resolver);\n }\n return Effect.request(SqlRequest(arguments[0]), arguments[1]);\n};\n/**\n * Constructs a `SqlRequest` from a payload. Equality and hashing are based on\n * the payload so equal requests can be batched and deduplicated.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const SqlRequest = payload => {\n const self = Object.create(SqlRequestProto);\n self.payload = payload;\n return self;\n};\n/**\n * Creates a resolver for a SQL query with a request schema and a result schema.\n *\n * **Details**\n *\n * The request schema is used to validate the input of the query, and the result\n * schema is used to validate the output of the query. Results are mapped to the\n * requests in order, so the length of the results must match the length of the\n * requests.\n *\n * @category resolvers\n * @since 4.0.0\n */\nexport const ordered = options => {\n const decodeArray = Schema.decodeUnknownEffect(Schema.Array(options.Result));\n return RequestResolver.makeGrouped({\n key: transactionKey,\n resolver: Effect.fnUntraced(function* (entries) {\n const [inputs, encodedEntries] = yield* partitionRequests(entries, options.Request);\n if (!Arr.isArrayNonEmpty(inputs)) return;\n const results = yield* options.execute(inputs).pipe(Effect.provideContext(entries[0].context));\n if (results.length !== inputs.length) {\n return yield* new ResultLengthMismatch({\n expected: inputs.length,\n actual: results.length\n });\n }\n const decodedResults = yield* decodeArray(results).pipe(Effect.provideContext(entries[0].context));\n for (let i = 0; i < encodedEntries.length; i++) {\n encodedEntries[i].completeUnsafe(Exit.succeed(decodedResults[i]));\n }\n })\n });\n};\n/**\n * Creates a batched SQL request resolver that encodes requests, decodes result\n * rows, groups decoded results by matching request and result keys, and fails a\n * request with `NoSuchElementError` when no result group exists.\n *\n * @category resolvers\n * @since 4.0.0\n */\nexport const grouped = options => {\n const decodeResults = Schema.decodeUnknownEffect(Schema.Array(options.Result));\n return RequestResolver.makeGrouped({\n key: transactionKey,\n resolver: Effect.fnUntraced(function* (entries) {\n const [inputs] = yield* partitionRequests(entries, options.Request);\n if (!Arr.isArrayNonEmpty(inputs)) return;\n const resultMap = MutableHashMap.empty();\n const results = yield* options.execute(inputs).pipe(Effect.provideContext(entries[0].context));\n const decodedResults = yield* decodeResults(results).pipe(Effect.provideContext(entries[0].context));\n for (let i = 0, len = decodedResults.length; i < len; i++) {\n const result = decodedResults[i];\n const key = options.ResultGroupKey(result, results[i]);\n const group = MutableHashMap.get(resultMap, key);\n if (group._tag === \"None\") {\n MutableHashMap.set(resultMap, key, [result]);\n } else {\n group.value.push(result);\n }\n }\n for (let i = 0, len = entries.length; i < len; i++) {\n const entry = entries[i];\n const key = options.RequestGroupKey(entry.request.payload);\n const result = MutableHashMap.get(resultMap, key);\n entry.completeUnsafe(result._tag === \"None\" ? constNoSuchElement : Exit.succeed(result.value));\n }\n })\n });\n};\n/**\n * Creates a batched resolver that fetches rows for encoded ids, decodes\n * results, completes each matching request using `ResultId`, and fails missing\n * ids with `NoSuchElementError`.\n *\n * @category resolvers\n * @since 4.0.0\n */\nexport const findById = options => {\n const decodeResults = Schema.decodeUnknownEffect(Schema.Array(options.Result));\n return RequestResolver.makeGrouped({\n key: transactionKey,\n resolver: Effect.fnUntraced(function* (entries) {\n const [inputs, idMap] = yield* partitionRequestsById(entries, options.Id);\n if (!Arr.isArrayNonEmpty(inputs)) return;\n const results = yield* options.execute(inputs).pipe(Effect.provideContext(entries[0].context));\n const decodedResults = yield* decodeResults(results).pipe(Effect.provideContext(entries[0].context));\n for (let i = 0; i < decodedResults.length; i++) {\n const result = decodedResults[i];\n const id = options.ResultId(result, results[i]);\n const request = MutableHashMap.get(idMap, id);\n if (request._tag === \"None\") {\n continue;\n }\n MutableHashMap.remove(idMap, id);\n request.value.completeUnsafe(Exit.succeed(result));\n }\n if (MutableHashMap.isEmpty(idMap)) {\n return;\n }\n MutableHashMap.forEach(idMap, request => {\n request.completeUnsafe(constNoSuchElement);\n });\n })\n });\n};\nconst void_ = options => RequestResolver.makeGrouped({\n key: transactionKey,\n resolver: Effect.fnUntraced(function* (entries) {\n const [inputs] = yield* partitionRequests(entries, options.Request);\n if (!Arr.isArrayNonEmpty(inputs)) return;\n yield* options.execute(inputs).pipe(Effect.provideContext(entries[0].context));\n for (let i = 0; i < entries.length; i++) {\n entries[i].completeUnsafe(Exit.void);\n }\n })\n});\nexport {\n/**\n * Create a resolver that performs side effects.\n *\n * @category resolvers\n * @since 4.0.0\n */\nvoid_ as void };\nconst constNoSuchElement = /*#__PURE__*/Exit.fail(/*#__PURE__*/new Cause.NoSuchElementError());\nconst partitionRequests = function* (requests, schema) {\n const len = requests.length;\n const inputs = Arr.empty();\n const encodedEntries = Arr.empty();\n let entry;\n const encode = Schema.encodeEffect(schema);\n const handle = Effect.matchCauseEager({\n onFailure(cause) {\n entry.completeUnsafe(Exit.failCause(cause));\n },\n onSuccess(value) {\n inputs.push(value);\n encodedEntries.push(entry);\n }\n });\n for (let i = 0; i < len; i++) {\n entry = requests[i];\n yield Effect.provideContext(handle(encode(entry.request.payload)), entry.context);\n }\n return [inputs, encodedEntries];\n};\nconst partitionRequestsById = function* (requests, schema) {\n const len = requests.length;\n const inputs = Arr.empty();\n const byIdMap = MutableHashMap.empty();\n for (let i = 0; i < len; i++) {\n const entry = requests[i];\n const existing = MutableHashMap.get(byIdMap, entry.request.payload);\n if (Option.isSome(existing)) {\n const previous = existing.value;\n MutableHashMap.set(byIdMap, entry.request.payload, {\n ...previous,\n completeUnsafe(exit) {\n previous.completeUnsafe(exit);\n entry.completeUnsafe(exit);\n }\n });\n } else {\n MutableHashMap.set(byIdMap, entry.request.payload, entry);\n }\n }\n const encode = Schema.encodeEffect(schema);\n for (const [, entry] of byIdMap) {\n yield* Effect.provideContext(Effect.matchCauseEager(encode(entry.request.payload), {\n onFailure(cause) {\n entry.completeUnsafe(Exit.failCause(cause));\n },\n onSuccess(value) {\n inputs.push(value);\n }\n }), entry.context);\n }\n return [inputs, byIdMap];\n};\nfunction transactionKey(entry) {\n const client = Context.getOrUndefined(entry.context, SqlClient.SqlClient);\n if (!client) return undefined;\n const conn = Context.getOrUndefined(entry.context, client.transactionService);\n if (!conn) return undefined;\n return Equal.byReferenceUnsafe(conn);\n}\n//# sourceMappingURL=SqlResolver.js.map","/**\n * Wraps SQL execution callbacks with request encoding and result decoding.\n *\n * `SqlSchema` is a small adapter between Effect Schema and SQL statements. Each\n * helper builds a function that accepts the decoded request type used by\n * application code, encodes it before calling `execute`, and decodes unknown\n * driver rows into the result schema. The helpers cover returning all rows, a\n * non-empty row list, the first row, an optional first row, or discarding the\n * SQL result for side-effect-only statements.\n *\n * @since 4.0.0\n */\nimport * as Arr from \"../../Array.js\";\nimport * as Cause from \"../../Cause.js\";\nimport * as Effect from \"../../Effect.js\";\nimport * as Schema from \"../../Schema.js\";\n/**\n * Builds a query function that encodes the request and decodes all result rows,\n * allowing an empty result set.\n *\n * **When to use**\n *\n * Use when you need to run a query that may return zero or more rows and\n * represent an empty result as an empty array.\n *\n * @see {@link findNonEmpty} for queries where an empty result is a failure\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const findAll = options => {\n const encodeRequest = Schema.encodeEffect(options.Request);\n const decode = Schema.decodeUnknownEffect(Schema.mutable(Schema.Array(options.Result)));\n return request => Effect.flatMap(Effect.flatMap(encodeRequest(request), options.execute), decode);\n};\n/**\n * Builds a query function that encodes the request, decodes all result rows,\n * and fails with `NoSuchElementError` when the result set is empty.\n *\n * **When to use**\n *\n * Use when you need to run a query that must return at least one row and treat\n * an empty result as a failure.\n *\n * @see {@link findAll} for queries where an empty result should return an empty array\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const findNonEmpty = options => {\n const find = findAll(options);\n return request => Effect.flatMap(find(request), results => Arr.isArrayNonEmpty(results) ? Effect.succeed(results) : Effect.fail(new Cause.NoSuchElementError()));\n};\nconst void_ = options => {\n const encode = Schema.encodeEffect(options.Request);\n return request => Effect.asVoid(Effect.flatMap(encode(request), options.execute));\n};\nexport {\n/**\n * Runs a sql query with a request schema and discard the result.\n *\n * @category constructors\n * @since 4.0.0\n */\nvoid_ as void };\n/**\n * Builds a query function that encodes the request, decodes the first result\n * row, and fails with `NoSuchElementError` when no rows are returned.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const findOne = options => {\n const encodeRequest = Schema.encodeEffect(options.Request);\n const decode = Schema.decodeUnknownEffect(options.Result);\n return request => Effect.flatMap(Effect.flatMap(encodeRequest(request), options.execute), arr => Arr.isReadonlyArrayNonEmpty(arr) ? decode(arr[0]) : Effect.fail(new Cause.NoSuchElementError()));\n};\n/**\n * Builds a query function that encodes the request, decodes the first result row\n * as `Option.some`, and returns `Option.none` when no rows are returned.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const findOneOption = options => {\n const encodeRequest = Schema.encodeEffect(options.Request);\n const decode = Schema.decodeUnknownEffect(options.Result);\n return request => Effect.flatMap(Effect.flatMap(encodeRequest(request), options.execute), arr => Arr.isReadonlyArrayNonEmpty(arr) ? Effect.asSome(decode(arr[0])) : Effect.succeedNone);\n};\n//# sourceMappingURL=SqlSchema.js.map","import * as Effect from \"../../Effect.js\";\nimport * as RequestResolver from \"../../RequestResolver.js\";\nimport { SqlClient } from \"./SqlClient.js\";\nimport * as SqlResolver from \"./SqlResolver.js\";\nimport * as SqlSchema from \"./SqlSchema.js\";\n/**\n * Creates a CRUD repository for a schema model backed by a SQL table, with\n * insert, update, find-by-id, and delete operations. When `softDeleteColumn` is\n * supplied, reads ignore soft-deleted rows and delete updates that column\n * instead of removing the row.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const makeRepository = (Model, options) => Effect.gen(function* () {\n const sql = yield* SqlClient;\n const idSchema = Model.fields[options.idColumn];\n const idColumn = options.idColumn;\n const softDeleteColumn = options.softDeleteColumn;\n const withSoftDeleteFilter = where => softDeleteColumn === undefined ? where : sql.and([where, sql`${sql(softDeleteColumn)} is null`]);\n const setSoftDeleted = softDeleteColumn === undefined ? undefined : sql`${sql(softDeleteColumn)} = CURRENT_TIMESTAMP`;\n const insertSchema = SqlSchema.findOne({\n Request: Model.insert,\n Result: Model,\n execute: request => sql.onDialectOrElse({\n mysql: () => sql`insert into ${sql(options.tableName)} ${sql.insert(request)};\nselect * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = LAST_INSERT_ID()`)};`.unprepared.pipe(Effect.map(([, results]) => results)),\n orElse: () => sql`insert into ${sql(options.tableName)} ${sql.insert(request).returning(\"*\")}`\n })\n });\n const insert = insert => insertSchema(insert).pipe(Effect.catchTag(\"NoSuchElementError\", Effect.die), Effect.withSpan(`${options.spanPrefix}.insert`, {}, {\n captureStackTrace: false\n }));\n const insertVoidSchema = SqlSchema.void({\n Request: Model.insert,\n execute: request => sql`insert into ${sql(options.tableName)} ${sql.insert(request)}`\n });\n const insertVoid = insert => insertVoidSchema(insert).pipe(Effect.withSpan(`${options.spanPrefix}.insertVoid`, {}, {\n captureStackTrace: false\n }));\n const updateSchema = SqlSchema.findOne({\n Request: Model.update,\n Result: Model,\n execute: request => sql.onDialectOrElse({\n mysql: () => sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${request[idColumn]}`)};\nselect * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${request[idColumn]}`)};`.unprepared.pipe(Effect.map(([, results]) => results)),\n orElse: () => sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${request[idColumn]}`)} returning *`\n })\n });\n const update = update => updateSchema(update).pipe(Effect.catchTag(\"NoSuchElementError\", Effect.die), Effect.withSpan(`${options.spanPrefix}.update`, {\n attributes: {\n id: update[idColumn]\n }\n }, {\n captureStackTrace: false\n }));\n const updateVoidSchema = SqlSchema.void({\n Request: Model.update,\n execute: request => sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${request[idColumn]}`)}`\n });\n const updateVoid = update => updateVoidSchema(update).pipe(Effect.withSpan(`${options.spanPrefix}.updateVoid`, {\n attributes: {\n id: update[idColumn]\n }\n }, {\n captureStackTrace: false\n }));\n const findByIdSchema = SqlSchema.findOne({\n Request: idSchema,\n Result: Model,\n execute: id => sql`select * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${id}`)}`\n });\n const findById = id => findByIdSchema(id).pipe(Effect.withSpan(`${options.spanPrefix}.findById`, {\n attributes: {\n id\n }\n }, {\n captureStackTrace: false\n }));\n const deleteSchema = SqlSchema.void({\n Request: idSchema,\n execute: id => softDeleteColumn === undefined ? sql`delete from ${sql(options.tableName)} where ${sql(idColumn)} = ${id}` : sql`update ${sql(options.tableName)} set ${setSoftDeleted} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${id}`)}`\n });\n const delete_ = id => deleteSchema(id).pipe(Effect.withSpan(`${options.spanPrefix}.delete`, {\n attributes: {\n id\n }\n }, {\n captureStackTrace: false\n }));\n return {\n insert,\n insertVoid,\n update,\n updateVoid,\n findById,\n delete: delete_\n };\n});\n/**\n * Creates batched request resolvers for a schema model's insert, insert-void,\n * find-by-id, and delete operations, honoring the optional soft-delete column.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const makeResolvers = (Model, options) => Effect.gen(function* () {\n const sql = yield* SqlClient;\n const idSchema = Model.fields[options.idColumn];\n const idColumn = options.idColumn;\n const softDeleteColumn = options.softDeleteColumn;\n const withSoftDeleteFilter = where => softDeleteColumn === undefined ? where : sql.and([where, sql`${sql(softDeleteColumn)} is null`]);\n const setSoftDeleted = softDeleteColumn === undefined ? undefined : sql`${sql(softDeleteColumn)} = CURRENT_TIMESTAMP`;\n const insert = SqlResolver.ordered({\n Request: Model.insert,\n Result: Model,\n execute: request => sql.onDialectOrElse({\n mysql: () => Effect.forEach(request, request => sql`insert into ${sql(options.tableName)} ${sql.insert(request)};\nselect * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = LAST_INSERT_ID()`)};`.unprepared.pipe(Effect.map(([, results]) => results[0])), {\n concurrency: 10\n }),\n orElse: () => sql`insert into ${sql(options.tableName)} ${sql.insert(request).returning(\"*\")}`\n })\n }).pipe(RequestResolver.withSpan(`${options.spanPrefix}.insertResolver`));\n const insertVoid = SqlResolver.void({\n Request: Model.insert,\n execute: request => sql`insert into ${sql(options.tableName)} ${sql.insert(request)}`\n }).pipe(RequestResolver.withSpan(`${options.spanPrefix}.insertVoidResolver`));\n const findById = SqlResolver.findById({\n Id: idSchema,\n Result: Model,\n ResultId(request) {\n return request[idColumn];\n },\n execute: ids => sql`select * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql.in(idColumn, ids))}`\n }).pipe(RequestResolver.withSpan(`${options.spanPrefix}.findByIdResolver`));\n const delete_ = SqlResolver.void({\n Request: idSchema,\n execute: ids => softDeleteColumn === undefined ? sql`delete from ${sql(options.tableName)} where ${sql.in(idColumn, ids)}` : sql`update ${sql(options.tableName)} set ${setSoftDeleted} where ${withSoftDeleteFilter(sql.in(idColumn, ids))}`\n }).pipe(RequestResolver.withSpan(`${options.spanPrefix}.deleteResolver`));\n return {\n insert,\n insertVoid,\n findById,\n delete: delete_\n };\n});\n//# sourceMappingURL=SqlModel.js.map","/** @effect-diagnostics schemaNumber:off */\nimport * as Effect from \"effect/Effect\"\nimport * as Layer from \"effect/Layer\"\nimport * as Schema from \"effect/Schema\"\nimport * as SchemaTransformation from \"effect/SchemaTransformation\"\nimport * as Context from \"effect/Context\"\nimport * as Model from \"effect/unstable/schema/Model\"\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\"\nimport * as SqlError from \"effect/unstable/sql/SqlError\"\nimport * as SqlModel from \"effect/unstable/sql/SqlModel\"\nimport * as SqlSchema from \"effect/unstable/sql/SqlSchema\"\nimport type * as Cause from \"effect/Cause\"\nimport type * as Option from \"effect/Option\"\nimport * as EmbeddingModel from \"effect/unstable/ai/EmbeddingModel\"\nimport * as SqlResolver from \"effect/unstable/sql/SqlResolver\"\nimport * as RequestResolver from \"effect/RequestResolver\"\n\n/**\n * @since 1.0.0\n * @category Models\n */\nexport const ChunkId = Schema.Number.pipe(Schema.brand(\"ChunkRepo/ChunkId\"))\n/**\n * @since 1.0.0\n * @category Models\n */\nexport type ChunkId = typeof ChunkId.Type\n\n/**\n * @since 1.0.0\n * @category Models\n */\nexport const SyncId = Schema.String.pipe(Schema.brand(\"ChunkRepo/SyncId\"))\n/**\n * @since 1.0.0\n * @category Models\n */\nexport type SyncId = typeof SyncId.Type\n\n/**\n * @since 1.0.0\n * @category Models\n */\nexport const Float32ArraySchema = Schema.instanceOf<\n Float32ArrayConstructor,\n Float32Array\n>(Float32Array)\n\n/**\n * @since 1.0.0\n * @category Models\n */\nexport const Float32ArrayFromArray = Schema.Array(Schema.Number).pipe(\n Schema.decodeTo(\n Float32ArraySchema,\n SchemaTransformation.transform({\n decode: (arr) => new Float32Array(arr),\n encode: (array) => Array.from(array),\n }),\n ),\n)\n\n/**\n * @since 1.0.0\n * @category Models\n */\nexport const Float32ArrayField = Model.Field({\n insert: Float32ArraySchema,\n update: Float32ArraySchema,\n jsonCreate: Float32ArrayFromArray,\n jsonUpdate: Float32ArrayFromArray,\n})\n\n/**\n * @since 1.0.0\n * @category Models\n */\nexport class Chunk extends Model.Class<Chunk>(\"Chunk\")({\n id: ChunkId.pipe(Model.FieldExcept([\"insert\", \"jsonCreate\"])),\n path: Schema.String,\n content: Schema.String,\n hash: Schema.String,\n vector: Float32ArrayField,\n syncId: SyncId,\n}) {}\n\n/**\n * @since 1.0.0\n * @category Services\n */\nexport class ChunkRepo extends Context.Service<\n ChunkRepo,\n {\n insert(\n chunk: typeof Chunk.insert.Type,\n ): Effect.Effect<Chunk, ChunkRepoError>\n\n findById(\n id: ChunkId,\n ): Effect.Effect<Chunk, ChunkRepoError | Cause.NoSuchElementError>\n\n exists(hash: string): Effect.Effect<Option.Option<ChunkId>, ChunkRepoError>\n\n search(options: {\n readonly vector: Float32Array\n readonly limit: number\n }): Effect.Effect<Array<Chunk>, ChunkRepoError>\n\n quantize: Effect.Effect<void, ChunkRepoError>\n\n setSyncId(\n chunkId: ChunkId,\n syncId: SyncId,\n ): Effect.Effect<void, ChunkRepoError>\n deleteByPath(path: string): Effect.Effect<void, ChunkRepoError>\n deleteForSyncId(syncId: SyncId): Effect.Effect<void, ChunkRepoError>\n }\n>()(\"clanka/ChunkRepo\") {}\n\n/**\n * @since 1.0.0\n * @category Errors\n */\nexport class ChunkRepoError extends Schema.TaggedError<ChunkRepoError>()(\n \"ChunkRepoError\",\n {\n reason: Schema.Union([SqlError.SqlError]),\n },\n) {\n readonly cause = this.reason\n readonly message = this.reason.message\n}\n\n/**\n * @since 1.0.0\n * @category Layers\n */\nexport const layer = Layer.effect(\n ChunkRepo,\n Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient\n const dimensions = yield* EmbeddingModel.Dimensions\n\n yield* Effect.gen(function* () {\n yield* sql`CREATE VIRTUAL TABLE IF NOT EXISTS chunk_vectors USING vec0(\n vector float[${sql.literal(String(dimensions))}]\n )`\n yield* sql`CREATE TRIGGER IF NOT EXISTS chunks_vector_insert\n AFTER INSERT ON chunks\n BEGIN\n INSERT INTO chunk_vectors(rowid, vector) VALUES (new.id, new.vector);\n END`\n yield* sql`CREATE TRIGGER IF NOT EXISTS chunks_vector_update\n AFTER UPDATE OF vector ON chunks\n BEGIN\n DELETE FROM chunk_vectors WHERE rowid = old.id;\n INSERT INTO chunk_vectors(rowid, vector) VALUES (new.id, new.vector);\n END`\n yield* sql`CREATE TRIGGER IF NOT EXISTS chunks_vector_delete\n AFTER DELETE ON chunks\n BEGIN\n DELETE FROM chunk_vectors WHERE rowid = old.id;\n END`\n yield* sql`DELETE FROM chunk_vectors\n WHERE rowid NOT IN (SELECT id FROM chunks)`\n yield* sql`INSERT INTO chunk_vectors(rowid, vector)\n SELECT id, vector FROM chunks\n WHERE id NOT IN (SELECT rowid FROM chunk_vectors)`\n }).pipe(sql.withTransaction)\n\n const loaders = yield* SqlModel.makeResolvers(Chunk, {\n tableName: \"chunks\",\n idColumn: \"id\",\n spanPrefix: \"ChunkRepo\",\n })\n\n const search = SqlSchema.findAll({\n Request: Schema.Struct({\n vector: Float32ArraySchema,\n limit: Schema.Number,\n }),\n Result: Chunk,\n execute: ({ vector, limit }) =>\n sql`\n select chunks.id, chunks.path, chunks.content, chunks.hash, chunks.syncId\n from chunk_vectors\n JOIN chunks ON chunks.id = chunk_vectors.rowid\n WHERE chunk_vectors.vector MATCH ${vector}\n AND k = CAST(${limit} AS INTEGER)\n ORDER BY chunk_vectors.distance\n `,\n })\n\n const exists = SqlResolver.findById({\n Id: Schema.String, // hash\n Result: Schema.Struct({\n id: ChunkId,\n hash: Schema.String,\n }),\n ResultId(result) {\n return result.hash\n },\n execute: (hashes) =>\n sql`select id, hash from chunks where ${sql.in(\"hash\", hashes)}`,\n }).pipe(RequestResolver.setDelay(5))\n\n const insertResolver = loaders.insert.pipe(RequestResolver.setDelay(5))\n const findByIdResolver = loaders.findById.pipe(RequestResolver.setDelay(5))\n\n return ChunkRepo.of({\n insert: (insert) =>\n SqlResolver.request(insert, insertResolver).pipe(\n Effect.catchTags(\n {\n SchemaError: Effect.die,\n ResultLengthMismatch: Effect.die,\n },\n (reason) => Effect.fail(new ChunkRepoError({ reason })),\n ),\n ),\n findById: (id) =>\n SqlResolver.request(id, findByIdResolver).pipe(\n Effect.catchTags({\n SchemaError: Effect.die,\n SqlError: (reason) => Effect.fail(new ChunkRepoError({ reason })),\n }),\n ),\n exists: (hash) =>\n SqlResolver.request(hash, exists).pipe(\n Effect.map((result) => result.id),\n Effect.catchNoSuchElement,\n Effect.catchTags({\n SqlError: (reason) => Effect.fail(new ChunkRepoError({ reason })),\n SchemaError: Effect.die,\n }),\n ),\n search: Effect.fn(\"ChunkRepo.search\")(function* (options) {\n return yield* search(options as any).pipe(\n Effect.catchTags({\n SqlError: (reason) => Effect.fail(new ChunkRepoError({ reason })),\n SchemaError: Effect.die,\n }),\n )\n }),\n quantize: Effect.void,\n setSyncId: (chunkId, syncId) =>\n sql`update chunks set syncId = ${syncId} where id = ${chunkId}`.pipe(\n Effect.mapError((reason) => new ChunkRepoError({ reason })),\n ),\n deleteByPath: (path) =>\n sql`delete from chunks where path = ${path}`.pipe(\n Effect.mapError((reason) => new ChunkRepoError({ reason })),\n ),\n deleteForSyncId: (syncId) =>\n sql`delete from chunks where syncId != ${syncId}`.pipe(\n Effect.mapError((reason) => new ChunkRepoError({ reason })),\n ),\n })\n }),\n)\n","/**\n * @since 1.0.0\n */\nimport * as Array from \"effect/Array\"\nimport * as Effect from \"effect/Effect\"\nimport * as FileSystem from \"effect/FileSystem\"\nimport { pipe } from \"effect/Function\"\nimport * as Layer from \"effect/Layer\"\nimport * as Path from \"effect/Path\"\nimport * as Context from \"effect/Context\"\nimport * as Stream from \"effect/Stream\"\nimport * as ChildProcess from \"effect/unstable/process/ChildProcess\"\nimport * as ChildProcessSpawner from \"effect/unstable/process/ChildProcessSpawner\"\nimport TreeSitter, { type SyntaxNode } from \"tree-sitter\"\nimport TreeSitterJavaScript from \"tree-sitter-javascript\"\nimport TreeSitterTypeScript from \"tree-sitter-typescript\"\n\n/**\n * @since 1.0.0\n * @category Models\n */\nexport interface CodeChunk {\n readonly path: string\n readonly startLine: number\n readonly endLine: number\n readonly name: string | undefined\n readonly type: ChunkType | undefined\n readonly parent: string | undefined\n readonly content: string\n}\n\n/**\n * @since 1.0.0\n * @category Models\n */\nexport type ChunkType =\n | \"function\"\n | \"method\"\n | \"class\"\n | \"namespace\"\n | \"interface\"\n | \"type-alias\"\n | \"enum\"\n | \"variable\"\n\n/**\n * @since 1.0.0\n * @category Services\n */\nexport class CodeChunker extends Context.Service<\n CodeChunker,\n {\n listFiles(options: {\n readonly root: string\n readonly maxFileSize?: string | undefined\n }): Effect.Effect<ReadonlyArray<string>>\n chunkFile(options: {\n readonly root: string\n readonly path: string\n readonly chunkSize: number\n readonly chunkOverlap: number\n readonly chunkMaxCharacters?: number | undefined\n }): Effect.Effect<ReadonlyArray<CodeChunk>>\n chunkFiles(options: {\n readonly root: string\n readonly paths: ReadonlyArray<string>\n readonly chunkSize: number\n readonly chunkOverlap: number\n readonly chunkMaxCharacters?: number | undefined\n }): Stream.Stream<CodeChunk>\n chunkCodebase(options: {\n readonly root: string\n readonly maxFileSize?: string | undefined\n readonly chunkSize: number\n readonly chunkOverlap: number\n readonly chunkMaxCharacters?: number | undefined\n }): Stream.Stream<CodeChunk>\n }\n>()(\"clanka/CodeChunker\") {}\n\nconst sourceExtensions = new Set([\n \"c\",\n \"cc\",\n \"cpp\",\n \"cs\",\n \"css\",\n \"cts\",\n \"cxx\",\n \"go\",\n \"gql\",\n \"graphql\",\n \"h\",\n \"hpp\",\n \"html\",\n \"ini\",\n \"java\",\n \"js\",\n \"jsx\",\n \"kt\",\n \"kts\",\n \"less\",\n \"lua\",\n \"mjs\",\n \"mts\",\n \"php\",\n \"py\",\n \"rb\",\n \"rs\",\n \"sass\",\n \"scala\",\n \"scss\",\n \"sh\",\n \"sql\",\n \"svelte\",\n \"swift\",\n \"ts\",\n \"tsx\",\n \"vue\",\n \"xml\",\n \"zsh\",\n])\n\nconst documentationExtensions = new Set([\n \"adoc\",\n \"asciidoc\",\n \"md\",\n \"mdx\",\n \"rst\",\n \"txt\",\n])\n\nconst ignoredDirectories = new Set([\n \".git\",\n \".next\",\n \".nuxt\",\n \".svelte-kit\",\n \".turbo\",\n \"build\",\n \"coverage\",\n \"dist\",\n \"node_modules\",\n \"target\",\n])\n\nconst normalizePath = (path: string): string => path.replace(/\\\\/g, \"/\")\n\nconst normalizeText = (content: string): string =>\n content.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\")\n\nconst meaningfulLinePattern = /[^\\s\\p{P}]/u\n\nconst isMeaningfulLine = (line: string): boolean =>\n meaningfulLinePattern.test(line)\n\ninterface LineRange {\n readonly startLine: number\n readonly endLine: number\n}\n\ninterface ChunkSettings {\n readonly chunkSize: number\n readonly chunkOverlap: number\n readonly chunkMaxCharacters: number\n}\n\ninterface ChunkRange extends LineRange {\n readonly name: string | undefined\n readonly type: ChunkType | undefined\n readonly parent: string | undefined\n}\n\nconst languageByExtension = new Map<string, unknown>([\n [\"js\", TreeSitterJavaScript],\n [\"jsx\", TreeSitterJavaScript],\n [\"ts\", TreeSitterTypeScript.typescript],\n [\"tsx\", TreeSitterTypeScript.tsx],\n])\n\n// const ignoredTopLevelNodeTypes = new Set([\"comment\", \"import_statement\"])\n\n/**\n * @since 1.0.0\n * @category Predicates\n */\nexport const isProbablyMinified = (content: string): boolean => {\n const normalized = normalizeText(content)\n if (normalized.length < 2_000) {\n return false\n }\n\n const lines = normalized.split(\"\\n\")\n if (lines.length <= 2) {\n return true\n }\n\n let longLines = 0\n for (const line of lines) {\n if (line.length >= 300) {\n longLines++\n }\n }\n\n return lines.length <= 20 && longLines / lines.length >= 0.8\n}\n\n/**\n * @since 1.0.0\n * @category Predicates\n */\nexport const isMeaningfulFile = (path: string): boolean => {\n const normalizedPath = normalizePath(path)\n const lowercasePath = normalizedPath.toLowerCase()\n const parts = lowercasePath.split(\"/\")\n const fileName = parts.at(-1)\n if (fileName === undefined || fileName.length === 0) {\n return false\n }\n\n if (parts.some((part) => ignoredDirectories.has(part))) {\n return false\n }\n\n if (/\\.min\\.(?:css|js)$/i.test(fileName)) {\n return false\n }\n\n const extensionIndex = fileName.lastIndexOf(\".\")\n if (extensionIndex === -1) {\n return false\n }\n\n const extension = fileName.slice(extensionIndex + 1)\n return (\n sourceExtensions.has(extension) || documentationExtensions.has(extension)\n )\n}\n\nconst resolveChunkSettings = (options: {\n readonly chunkSize: number\n readonly chunkOverlap: number\n readonly chunkMaxCharacters?: number | undefined\n}): ChunkSettings => {\n const chunkSize = Math.max(1, options.chunkSize)\n const chunkOverlap = Math.max(\n 0,\n Math.min(chunkSize - 1, options.chunkOverlap),\n )\n const chunkMaxCharacters =\n options.chunkMaxCharacters !== undefined &&\n Number.isFinite(options.chunkMaxCharacters)\n ? Math.max(1, Math.floor(options.chunkMaxCharacters))\n : Number.POSITIVE_INFINITY\n\n return {\n chunkSize,\n chunkOverlap,\n chunkMaxCharacters,\n }\n}\n\nconst getPathExtension = (path: string): string | undefined => {\n const fileName = path.split(\"/\").at(-1)\n if (fileName === undefined) {\n return undefined\n }\n\n const extensionIndex = fileName.lastIndexOf(\".\")\n if (extensionIndex === -1) {\n return undefined\n }\n\n return fileName.slice(extensionIndex + 1).toLowerCase()\n}\n\nconst resolveAstLanguage = (path: string): unknown => {\n const extension = getPathExtension(path)\n if (extension === undefined) {\n return undefined\n }\n\n return languageByExtension.get(extension)\n}\n\nconst lineRangeFromNode = (node: SyntaxNode): LineRange => {\n const startLine = node.startPosition.row + 1\n const endLine = Math.max(startLine, node.endPosition.row + 1)\n return {\n startLine,\n endLine,\n }\n}\n\nconst hasOnlyWhitespaceLines = (\n lines: ReadonlyArray<string>,\n startLine: number,\n endLine: number,\n): boolean => {\n if (startLine > endLine) {\n return true\n }\n\n for (let lineIndex = startLine; lineIndex <= endLine; lineIndex++) {\n if ((lines[lineIndex - 1] ?? \"\").trim().length > 0) {\n return false\n }\n }\n\n return true\n}\n\nconst lineRangeWithLeadingComments = (\n node: SyntaxNode,\n siblings: ReadonlyArray<SyntaxNode>,\n nodeIndex: number,\n lines: ReadonlyArray<string>,\n): LineRange => {\n const baseRange = lineRangeFromNode(node)\n let startLine = baseRange.startLine\n\n for (let index = nodeIndex - 1; index >= 0; index--) {\n const sibling = siblings[index]!\n if (sibling.type !== \"comment\") {\n break\n }\n\n const commentRange = lineRangeFromNode(sibling)\n if (\n !hasOnlyWhitespaceLines(lines, commentRange.endLine + 1, startLine - 1)\n ) {\n break\n }\n\n startLine = commentRange.startLine\n }\n\n return {\n startLine,\n endLine: baseRange.endLine,\n }\n}\n\nconst normalizeLineRange = (\n range: LineRange,\n lineCount: number,\n): LineRange | undefined => {\n const startLine = Math.max(1, Math.min(lineCount, range.startLine))\n const endLine = Math.max(1, Math.min(lineCount, range.endLine))\n\n if (endLine < startLine) {\n return undefined\n }\n\n return {\n startLine,\n endLine,\n }\n}\n\nconst lineLengthPrefixSums = (\n lines: ReadonlyArray<string>,\n): ReadonlyArray<number> => {\n const sums = [0] as Array<number>\n\n for (let index = 0; index < lines.length; index++) {\n sums.push(sums[index]! + lines[index]!.length)\n }\n\n return sums\n}\n\nconst lineRangeCharacterLength = (\n prefixSums: ReadonlyArray<number>,\n range: LineRange,\n): number =>\n prefixSums[range.endLine]! -\n prefixSums[range.startLine - 1]! +\n (range.endLine - range.startLine)\n\nconst resolveSegmentEndLine = (options: {\n readonly startLine: number\n readonly maxEndLine: number\n readonly settings: ChunkSettings\n readonly prefixSums: ReadonlyArray<number>\n}): number => {\n if (options.settings.chunkMaxCharacters === Number.POSITIVE_INFINITY) {\n return options.maxEndLine\n }\n\n let endLine = options.maxEndLine\n while (\n endLine > options.startLine &&\n lineRangeCharacterLength(options.prefixSums, {\n startLine: options.startLine,\n endLine,\n }) > options.settings.chunkMaxCharacters\n ) {\n endLine--\n }\n\n return endLine\n}\n\nconst splitRange = (\n range: LineRange,\n settings: ChunkSettings,\n prefixSums: ReadonlyArray<number>,\n): ReadonlyArray<LineRange> => {\n const lineCount = range.endLine - range.startLine + 1\n if (\n lineCount <= settings.chunkSize &&\n lineRangeCharacterLength(prefixSums, range) <= settings.chunkMaxCharacters\n ) {\n return [range]\n }\n const out = [] as Array<LineRange>\n\n for (let startLine = range.startLine; startLine <= range.endLine;) {\n const maxEndLine = Math.min(\n range.endLine,\n startLine + settings.chunkSize - 1,\n )\n const endLine = resolveSegmentEndLine({\n startLine,\n maxEndLine,\n settings,\n prefixSums,\n })\n\n out.push({\n startLine,\n endLine,\n })\n\n if (endLine >= range.endLine) {\n break\n }\n\n startLine = Math.max(startLine + 1, endLine - settings.chunkOverlap + 1)\n }\n\n return out\n}\n\nconst nodeText = (node: SyntaxNode | null): string | undefined => {\n if (node === null) {\n return undefined\n }\n\n const value = node.text.trim().replace(/\\s+/g, \" \")\n return value.length === 0 ? undefined : value\n}\n\nconst nodeFieldText = (\n node: SyntaxNode,\n fieldName: string,\n): string | undefined => nodeText(node.childForFieldName(fieldName))\n\nconst isNamespaceNode = (node: SyntaxNode): boolean =>\n node.type === \"internal_module\" || node.type === \"module\"\n\nconst unwrapDeclarationNode = (node: SyntaxNode): SyntaxNode => {\n let current = node\n\n while (true) {\n if (current.type === \"export_statement\") {\n const declaration =\n current.childForFieldName(\"declaration\") ?? current.namedChildren[0]\n if (declaration === undefined) {\n return current\n }\n current = declaration\n continue\n }\n\n if (current.type === \"ambient_declaration\") {\n const declaration = current.namedChildren.find(\n (child) =>\n child.type.endsWith(\"_declaration\") || isNamespaceNode(child),\n )\n if (declaration === undefined) {\n return current\n }\n current = declaration\n continue\n }\n\n return current\n }\n}\n\nconst variableDeclarators = (node: SyntaxNode): ReadonlyArray<SyntaxNode> =>\n node.namedChildren.filter((child) => child.type === \"variable_declarator\")\n\nconst variableTypeFromDeclarator = (node: SyntaxNode): ChunkType => {\n const value = node.childForFieldName(\"value\")\n if (value !== null && value.type.includes(\"function\")) {\n return \"function\"\n }\n return \"variable\"\n}\n\nconst variableTypeFromDeclaration = (node: SyntaxNode): ChunkType => {\n const declarators = variableDeclarators(node)\n if (\n declarators.some(\n (declarator) => variableTypeFromDeclarator(declarator) === \"function\",\n )\n ) {\n return \"function\"\n }\n return \"variable\"\n}\n\nconst chunkTypeFromNode = (node: SyntaxNode): ChunkType | undefined => {\n switch (node.type) {\n case \"class_declaration\":\n return \"class\"\n case \"enum_declaration\":\n return \"enum\"\n case \"function_declaration\":\n case \"generator_function_declaration\":\n return \"function\"\n case \"internal_module\":\n case \"module\":\n return \"namespace\"\n case \"interface_declaration\":\n return \"interface\"\n case \"generator_method_definition\":\n case \"method_definition\":\n return \"method\"\n case \"type_alias_declaration\":\n return \"type-alias\"\n case \"lexical_declaration\":\n case \"variable_declaration\":\n return variableTypeFromDeclaration(node)\n case \"variable_declarator\":\n return variableTypeFromDeclarator(node)\n default:\n return undefined\n }\n}\n\nconst variableNamesFromDeclaration = (node: SyntaxNode): string | undefined => {\n const names = variableDeclarators(node)\n .map((declarator) => nodeFieldText(declarator, \"name\"))\n .filter((name): name is string => name !== undefined)\n\n if (names.length === 0) {\n return undefined\n }\n\n return names.join(\", \")\n}\n\nconst nameFromNode = (node: SyntaxNode): string | undefined => {\n switch (node.type) {\n case \"class_declaration\":\n case \"enum_declaration\":\n case \"function_declaration\":\n case \"generator_function_declaration\":\n case \"internal_module\":\n case \"interface_declaration\":\n case \"module\":\n case \"generator_method_definition\":\n case \"method_definition\":\n case \"type_alias_declaration\":\n case \"variable_declarator\":\n return nodeFieldText(node, \"name\")\n case \"lexical_declaration\":\n case \"variable_declaration\":\n return variableNamesFromDeclaration(node)\n default:\n return undefined\n }\n}\n\nconst formatParent = (\n type: ChunkType | undefined,\n name: string | undefined,\n): string | undefined => {\n if (type === undefined && name === undefined) {\n return undefined\n }\n if (type === undefined) {\n return name\n }\n if (name === undefined) {\n return type\n }\n return type + \" \" + name\n}\n\nconst collectClassMethodRanges = (\n classNode: SyntaxNode,\n parent: string | undefined,\n lines: ReadonlyArray<string>,\n): ReadonlyArray<ChunkRange> => {\n const body = classNode.childForFieldName(\"body\")\n if (body === null) {\n return []\n }\n\n const out = [] as Array<ChunkRange>\n for (let index = 0; index < body.namedChildren.length; index++) {\n const child = body.namedChildren[index]!\n if (!child.type.includes(\"method\")) {\n continue\n }\n\n out.push({\n ...lineRangeWithLeadingComments(child, body.namedChildren, index, lines),\n name: nameFromNode(child),\n type: chunkTypeFromNode(child),\n parent,\n })\n }\n\n return out\n}\n\nconst collectAstRanges = (\n path: string,\n content: string,\n lines: ReadonlyArray<string>,\n): ReadonlyArray<ChunkRange> => {\n const language = resolveAstLanguage(path)\n if (language === undefined) {\n return []\n }\n\n try {\n const parser = new TreeSitter()\n parser.setLanguage(language)\n const tree = parser.parse(content, undefined, {\n bufferSize: 1024 * 1024,\n })\n const collectDeclarationRanges = (\n siblings: ReadonlyArray<SyntaxNode>,\n parent: string | undefined,\n ): ReadonlyArray<ChunkRange> => {\n const out = [] as Array<ChunkRange>\n\n for (let index = 0; index < siblings.length; index++) {\n const sibling = siblings[index]!\n if (sibling.type === \"comment\" || sibling.type.includes(\"import\")) {\n continue\n }\n\n const declarationNode = unwrapDeclarationNode(sibling)\n const type = chunkTypeFromNode(declarationNode)\n const name = nameFromNode(declarationNode)\n if (type === undefined && name === undefined) {\n continue\n }\n\n out.push({\n ...lineRangeWithLeadingComments(sibling, siblings, index, lines),\n name,\n type,\n parent,\n })\n\n if (declarationNode.type === \"class_declaration\") {\n out.push(\n ...collectClassMethodRanges(\n declarationNode,\n formatParent(type, name),\n lines,\n ),\n )\n }\n\n if (isNamespaceNode(declarationNode)) {\n const body = declarationNode.childForFieldName(\"body\")\n if (body !== null) {\n out.push(\n ...collectDeclarationRanges(\n body.namedChildren,\n formatParent(type, name),\n ),\n )\n }\n }\n }\n\n return out\n }\n\n return collectDeclarationRanges(tree.rootNode.namedChildren, undefined)\n } catch {\n return []\n }\n}\n\nconst chunksFromRanges = (\n path: string,\n lines: ReadonlyArray<string>,\n ranges: ReadonlyArray<ChunkRange>,\n settings: ChunkSettings,\n): ReadonlyArray<CodeChunk> => {\n const hasMethodChildRange = (\n classRange: LineRange & { readonly name: string | undefined },\n ) => {\n const parent = formatParent(\"class\", classRange.name)\n return ranges.some(\n (range) =>\n range.type === \"method\" &&\n range.parent === parent &&\n range.startLine >= classRange.startLine &&\n range.endLine <= classRange.endLine,\n )\n }\n\n const out = [] as Array<CodeChunk>\n const seen = new Set<string>()\n const prefixSums = lineLengthPrefixSums(lines)\n\n for (const range of ranges) {\n const normalizedRange = normalizeLineRange(range, lines.length)\n if (normalizedRange === undefined) {\n continue\n }\n\n const allSegments = splitRange(normalizedRange, settings, prefixSums)\n const segments =\n range.type === \"class\" &&\n allSegments.length > 1 &&\n hasMethodChildRange({ ...normalizedRange, name: range.name })\n ? [allSegments[0]!]\n : allSegments\n\n for (const segment of segments) {\n const key =\n String(segment.startLine) +\n \":\" +\n String(segment.endLine) +\n \":\" +\n (range.name ?? \"\") +\n \":\" +\n (range.type ?? \"\") +\n \":\" +\n (range.parent ?? \"\")\n if (seen.has(key)) {\n continue\n }\n seen.add(key)\n\n const chunkLines = lines.slice(segment.startLine - 1, segment.endLine)\n if (!chunkLines.some(isMeaningfulLine)) {\n continue\n }\n\n out.push({\n path,\n startLine: segment.startLine,\n endLine: segment.endLine,\n name: range.name,\n type: range.type,\n parent: range.parent,\n content: chunkLines.join(\"\\n\"),\n })\n }\n }\n\n return out.toSorted(\n (left, right) =>\n left.startLine - right.startLine ||\n left.endLine - right.endLine ||\n (left.name ?? \"\").localeCompare(right.name ?? \"\"),\n )\n}\n\nconst chunkWithLineWindows = (\n path: string,\n lines: ReadonlyArray<string>,\n settings: ChunkSettings,\n): ReadonlyArray<CodeChunk> => {\n const out = [] as Array<CodeChunk>\n const prefixSums = lineLengthPrefixSums(lines)\n\n for (let index = 0; index < lines.length;) {\n if (!isMeaningfulLine(lines[index]!)) {\n index++\n continue\n }\n\n const startLine = index + 1\n const maxEndLine = Math.min(\n lines.length,\n startLine + settings.chunkSize - 1,\n )\n const endLine = resolveSegmentEndLine({\n startLine,\n maxEndLine,\n settings,\n prefixSums,\n })\n const chunkLines = lines.slice(startLine - 1, endLine)\n\n out.push({\n path,\n startLine,\n endLine,\n name: undefined,\n type: undefined,\n parent: undefined,\n content: chunkLines.join(\"\\n\"),\n })\n\n if (endLine >= lines.length) {\n break\n }\n\n const nextStartLine = Math.max(\n startLine + 1,\n endLine - settings.chunkOverlap + 1,\n )\n index = nextStartLine - 1\n }\n\n return out\n}\n\nconst splitOversizedChunks = (\n chunks: ReadonlyArray<CodeChunk>,\n maxCharacters: number,\n): ReadonlyArray<CodeChunk> =>\n chunks.flatMap((chunk) => {\n if (chunk.content.length <= maxCharacters) {\n return [chunk]\n }\n\n // Line-based splitting can only exceed the limit for a single long line.\n // Each piece retains that line number and the original AST metadata.\n const pieces = [] as Array<CodeChunk>\n for (\n let offset = 0;\n offset < chunk.content.length;\n offset += maxCharacters\n ) {\n pieces.push({\n ...chunk,\n content: chunk.content.slice(offset, offset + maxCharacters),\n })\n }\n return pieces\n })\n\n/**\n * @since 1.0.0\n * @category Constructors\n */\nexport const chunkFileContent = (\n path: string,\n content: string,\n options: {\n readonly chunkSize: number\n readonly chunkOverlap: number\n readonly chunkMaxCharacters?: number | undefined\n },\n): ReadonlyArray<CodeChunk> => {\n if (content.trim().length === 0 || isProbablyMinified(content)) {\n return []\n }\n\n const normalizedPath = normalizePath(path)\n const normalizedContent = normalizeText(content)\n const lines = normalizedContent.split(\"\\n\")\n if (lines.at(-1) === \"\") {\n lines.pop()\n }\n if (lines.length === 0) {\n return []\n }\n\n const settings = resolveChunkSettings(options)\n const astRanges = collectAstRanges(normalizedPath, normalizedContent, lines)\n if (astRanges.length > 0) {\n const astChunks = chunksFromRanges(\n normalizedPath,\n lines,\n astRanges,\n settings,\n )\n if (astChunks.length > 0) {\n return splitOversizedChunks(astChunks, settings.chunkMaxCharacters)\n }\n }\n\n return splitOversizedChunks(\n chunkWithLineWindows(normalizedPath, lines, settings),\n settings.chunkMaxCharacters,\n )\n}\n\n/**\n * @since 1.0.0\n * @category Layers\n */\nexport const layer: Layer.Layer<\n CodeChunker,\n never,\n ChildProcessSpawner.ChildProcessSpawner | FileSystem.FileSystem | Path.Path\n> = Layer.effect(\n CodeChunker,\n Effect.gen(function* () {\n const spawner = yield* ChildProcessSpawner.ChildProcessSpawner\n const fs = yield* FileSystem.FileSystem\n const pathService = yield* Path.Path\n\n const listFiles: CodeChunker[\"Service\"][\"listFiles\"] = Effect.fn(\n \"CodeChunker.listFiles\",\n )(function* (options): Effect.fn.Return<ReadonlyArray<string>> {\n const root = pathService.resolve(options.root)\n const maxFileSize = options.maxFileSize ?? \"1M\"\n\n return yield* pipe(\n spawner.streamLines(\n ChildProcess.make(\n \"rg\",\n [\n \"--files\",\n \"--hidden\",\n \"--max-filesize\",\n maxFileSize,\n \"--glob\",\n \"!.git\",\n ],\n {\n cwd: root,\n stdin: \"ignore\",\n },\n ),\n ),\n Stream.runCollect,\n Effect.map(Array.fromIterable),\n Effect.map((entries) =>\n entries\n .map((entry) => normalizePath(entry.trim()))\n .filter((entry) => entry.length > 0 && isMeaningfulFile(entry))\n .toSorted((left, right) => left.localeCompare(right)),\n ),\n Effect.orDie,\n )\n })\n\n const chunkFile: CodeChunker[\"Service\"][\"chunkFile\"] = Effect.fn(\n \"CodeChunker.chunkFile\",\n )(function* (options): Effect.fn.Return<ReadonlyArray<CodeChunk>> {\n const root = pathService.resolve(options.root)\n const absolutePath = pathService.resolve(root, options.path)\n const path = normalizePath(pathService.relative(root, absolutePath))\n\n if (\n path.length === 0 ||\n path === \"..\" ||\n path.startsWith(\"../\") ||\n !isMeaningfulFile(path)\n ) {\n return []\n }\n\n return yield* pipe(\n fs.readFileString(absolutePath),\n Effect.map((content) => chunkFileContent(path, content, options)),\n Effect.orElseSucceed(() => []),\n )\n })\n\n const chunkFiles: CodeChunker[\"Service\"][\"chunkFiles\"] = (options) =>\n Stream.fromArray(options.paths).pipe(\n Stream.flatMap(\n (path) =>\n pipe(\n chunkFile({\n root: options.root,\n path,\n chunkSize: options.chunkSize,\n chunkOverlap: options.chunkOverlap,\n ...(options.chunkMaxCharacters === undefined\n ? {}\n : { chunkMaxCharacters: options.chunkMaxCharacters }),\n }),\n Stream.fromArrayEffect,\n ),\n { concurrency: 5 },\n ),\n )\n\n const chunkCodebase: CodeChunker[\"Service\"][\"chunkCodebase\"] =\n Effect.fnUntraced(function* (options) {\n const root = pathService.resolve(options.root)\n const files = yield* listFiles({\n root,\n ...(options.maxFileSize === undefined\n ? {}\n : { maxFileSize: options.maxFileSize }),\n })\n\n return chunkFiles({\n root,\n paths: files,\n chunkSize: options.chunkSize,\n chunkOverlap: options.chunkOverlap,\n ...(options.chunkMaxCharacters === undefined\n ? {}\n : { chunkMaxCharacters: options.chunkMaxCharacters }),\n })\n }, Stream.unwrap)\n\n return CodeChunker.of({\n listFiles,\n chunkFile,\n chunkFiles,\n chunkCodebase,\n })\n }),\n)\n","/**\n * Manages at most one fiber inside a scope.\n *\n * A `FiberHandle<A, E>` can hold one `Fiber<A, E>`. Installing a new fiber\n * interrupts the previous one unless the operation is configured with\n * `onlyIfMissing`, and closing the owning scope interrupts the current fiber.\n * This module includes constructors for handles and scoped runtimes, helpers\n * for setting, reading, clearing, and running fibers, and operations for joining\n * the current fiber or waiting until the handle is empty.\n *\n * @since 2.0.0\n */\nimport * as Cause from \"./Cause.js\";\nimport * as Deferred from \"./Deferred.js\";\nimport * as Effect from \"./Effect.js\";\nimport * as Exit from \"./Exit.js\";\nimport * as Fiber from \"./Fiber.js\";\nimport * as Filter from \"./Filter.js\";\nimport { dual } from \"./Function.js\";\nimport { PipeInspectableProto } from \"./internal/core.js\";\nimport * as Option from \"./Option.js\";\nimport * as Predicate from \"./Predicate.js\";\nconst TypeId = \"~effect/FiberHandle\";\n/**\n * Returns `true` if a value is a `FiberHandle` by checking for the\n * `FiberHandle` runtime marker.\n *\n * **Example** (Checking fiber handles)\n *\n * ```ts import.meta.vitest\n * import { Effect, FiberHandle } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const handle = yield* FiberHandle.make()\n *\n * return [FiberHandle.isFiberHandle(handle), FiberHandle.isFiberHandle(\"not a handle\")]\n * })\n *\n * const actual = await Effect.runPromise(Effect.scoped(program))\n * actual // => [true, false]\n * ```\n *\n * @category guards\n * @since 2.0.0\n */\nexport const isFiberHandle = u => Predicate.hasProperty(u, TypeId);\nconst Proto = {\n [TypeId]: TypeId,\n ...PipeInspectableProto,\n toJSON() {\n return {\n _id: \"FiberHandle\",\n state: this.state\n };\n }\n};\nconst makeUnsafe = () => {\n const self = Object.create(Proto);\n self.state = {\n _tag: \"Open\",\n fiber: undefined\n };\n self.deferred = Deferred.makeUnsafe();\n return self;\n};\n/**\n * Creates a scoped `FiberHandle` that can store a single fiber.\n *\n * **Details**\n *\n * When the associated `Scope` is closed, the contained fiber will be\n * interrupted. You can add a fiber to the handle using `FiberHandle.run`, and\n * the fiber will be automatically removed from the `FiberHandle` when it\n * completes.\n *\n * **Example** (Creating a scoped fiber handle)\n *\n * ```ts import.meta.vitest\n * import { Effect, FiberHandle } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const handle = yield* FiberHandle.make()\n *\n * // run some effects\n * yield* FiberHandle.run(handle, Effect.never)\n * // this will interrupt the previous fiber\n * yield* FiberHandle.run(handle, Effect.never)\n *\n * yield* Effect.yieldNow\n * return handle.state._tag === \"Open\" && handle.state.fiber !== undefined\n * }).pipe(\n * Effect.scoped // The fiber will be interrupted when the scope is closed\n * )\n *\n * const actual = await Effect.runPromise(program)\n * actual // => true\n * ```\n *\n * @category constructors\n * @since 2.0.0\n */\nexport const make = () => Effect.acquireRelease(Effect.sync(() => makeUnsafe()), handle => {\n const state = handle.state;\n if (state._tag === \"Closed\") return Effect.void;\n handle.state = {\n _tag: \"Closed\"\n };\n return state.fiber ? Deferred.into(Effect.asVoid(Fiber.interruptAs(state.fiber, internalFiberId)), handle.deferred) : Deferred.done(handle.deferred, Exit.void);\n});\n/**\n * Creates a scoped run function that forks effects into a new `FiberHandle`.\n *\n * **Details**\n *\n * Each call returns the forked fiber, stores it in the handle, and interrupts\n * the previous fiber unless `onlyIfMissing` is set. The managed fiber is\n * interrupted when the handle's scope closes.\n *\n * **Example** (Running effects with a fiber handle)\n *\n * ```ts import.meta.vitest\n * import { Cause, Effect, Exit, Fiber, FiberHandle } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const run = yield* FiberHandle.makeRuntime<never>()\n *\n * // Run effects and get fibers back\n * const fiberA = run(Effect.never)\n * const fiberB = run(Effect.succeed(\"second\"))\n *\n * // The second fiber will interrupt the first\n * const resultA = yield* Fiber.await(fiberA)\n * const resultB = yield* Fiber.await(fiberB)\n * return [resultA, resultB]\n * }).pipe(Effect.scoped)\n *\n * const actual = await Effect.runPromise(program)\n * actual // => [Exit.failCause(Cause.interrupt(-1)), Exit.succeed(\"second\")]\n * ```\n *\n * @category constructors\n * @since 2.0.0\n */\nexport const makeRuntime = () => Effect.flatMap(make(), self => runtime(self)());\n/**\n * Creates a scoped run function that forks effects into a new `FiberHandle`\n * and returns a `Promise` for each effect result.\n *\n * **When to use**\n *\n * Use when integrating a scoped `FiberHandle` runner with Promise-based APIs\n * and Promise rejection from squashed failures is the desired boundary.\n *\n * **Details**\n *\n * Each call stores the fiber in the handle and interrupts the previous fiber\n * unless `onlyIfMissing` is set. The returned Promise resolves with the\n * effect's success value or rejects with the squashed failure cause.\n *\n * **Example** (Running effects as promises)\n *\n * ```ts import.meta.vitest\n * import { Effect, FiberHandle } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const run = yield* FiberHandle.makeRuntimePromise()\n *\n * // Run effects and get promises back\n * const promise = run(Effect.succeed(\"hello\"))\n * return yield* Effect.promise(() => promise)\n * }).pipe(Effect.scoped)\n *\n * const actual = await Effect.runPromise(program)\n * actual // => \"hello\"\n * ```\n *\n * @category constructors\n * @since 3.13.0\n */\nexport const makeRuntimePromise = () => Effect.flatMap(make(), self => runtimePromise(self)());\nconst internalFiberId = -1;\nconst isInternalInterruption = /*#__PURE__*/Filter.toPredicate(/*#__PURE__*/Filter.compose(Cause.filterInterruptors, /*#__PURE__*/Filter.has(internalFiberId)));\n/**\n * Sets the fiber in a FiberHandle. When the fiber completes, it will be removed from the FiberHandle.\n * If a fiber is already running, it will be interrupted unless `options.onlyIfMissing` is set.\n *\n * **When to use**\n *\n * Use when an existing forked fiber must be installed synchronously into a\n * handle and immediate interruption of replaced or closed fibers is acceptable.\n *\n * **Example** (Setting a fiber unsafely)\n *\n * ```ts import.meta.vitest\n * import { Effect, Fiber, FiberHandle } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const handle = yield* FiberHandle.make()\n * const fiber = Effect.runFork(Effect.succeed(\"hello\"))\n *\n * // Set the fiber directly (unsafe)\n * FiberHandle.setUnsafe(handle, fiber)\n *\n * // The fiber is now managed by the handle\n * return yield* Fiber.join(fiber)\n * })\n *\n * const actual = await Effect.runPromise(Effect.scoped(program))\n * actual // => \"hello\"\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport const setUnsafe = /*#__PURE__*/dual(args => isFiberHandle(args[0]), (self, fiber, options) => {\n if (self.state._tag === \"Closed\") {\n fiber.interruptUnsafe(internalFiberId);\n return;\n } else if (self.state.fiber !== undefined) {\n if (self.state.fiber === fiber) {\n return;\n } else if (options?.onlyIfMissing === true) {\n fiber.interruptUnsafe(internalFiberId);\n return;\n }\n self.state.fiber.interruptUnsafe(internalFiberId);\n self.state.fiber = undefined;\n }\n self.state.fiber = fiber;\n fiber.addObserver(exit => {\n if (self.state._tag === \"Open\" && fiber === self.state.fiber) {\n self.state.fiber = undefined;\n }\n if (Exit.isFailure(exit) && (options?.propagateInterruption === true ? !isInternalInterruption(exit.cause) : !Cause.hasInterruptsOnly(exit.cause))) {\n Deferred.doneUnsafe(self.deferred, exit);\n }\n });\n});\n/**\n * Sets the fiber in the `FiberHandle`.\n *\n * **Details**\n *\n * When the fiber completes, it will be removed from the `FiberHandle`. If a\n * fiber already exists in the `FiberHandle`, it will be interrupted unless\n * `options.onlyIfMissing` is set.\n *\n * **Example** (Setting a fiber safely)\n *\n * ```ts import.meta.vitest\n * import { Effect, Fiber, FiberHandle } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const handle = yield* FiberHandle.make()\n * const fiber = Effect.runFork(Effect.succeed(\"hello\"))\n *\n * // Set the fiber safely\n * yield* FiberHandle.set(handle, fiber)\n *\n * // The fiber is now managed by the handle\n * return yield* Fiber.join(fiber)\n * })\n *\n * const actual = await Effect.runPromise(Effect.scoped(program))\n * actual // => \"hello\"\n * ```\n *\n * @category combinators\n * @since 2.0.0\n */\nexport const set = /*#__PURE__*/dual(args => isFiberHandle(args[0]), (self, fiber, options) => Effect.sync(() => setUnsafe(self, fiber, {\n onlyIfMissing: options?.onlyIfMissing,\n propagateInterruption: options?.propagateInterruption\n})));\n/**\n * Retrieves the fiber from the FiberHandle synchronously.\n *\n * **When to use**\n *\n * Use when synchronous inspection of the current fiber is needed and an\n * `Option` result is enough outside the Effect workflow.\n *\n * **Example** (Reading the current fiber unsafely)\n *\n * ```ts import.meta.vitest\n * import { Effect, FiberHandle, Option } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const handle = yield* FiberHandle.make()\n *\n * // No fiber initially\n * const emptyFiber = FiberHandle.getUnsafe(handle)\n *\n * // Add a fiber\n * yield* FiberHandle.run(handle, Effect.never)\n * const fiber = FiberHandle.getUnsafe(handle)\n * return [emptyFiber, Option.map(fiber, () => true)]\n * })\n *\n * const actual = await Effect.runPromise(Effect.scoped(program))\n * actual // => [Option.none(), Option.some(true)]\n * ```\n *\n * @category combinators\n * @since 4.0.0\n */\nexport function getUnsafe(self) {\n return self.state._tag === \"Closed\" ? Option.none() : Option.fromUndefinedOr(self.state.fiber);\n}\n/**\n * Retrieves the fiber from the FiberHandle effectfully.\n *\n * **Example** (Reading the current fiber)\n *\n * ```ts import.meta.vitest\n * import { Effect, FiberHandle, Option } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const handle = yield* FiberHandle.make()\n *\n * // Add a fiber\n * yield* FiberHandle.run(handle, Effect.never)\n *\n * // Get the current fiber if present\n * const fiber = yield* FiberHandle.get(handle)\n * return Option.map(fiber, () => true)\n * })\n *\n * const actual = await Effect.runPromise(Effect.scoped(program))\n * actual // => Option.some(true)\n * ```\n *\n * @category combinators\n * @since 2.0.0\n */\nexport function get(self) {\n return Effect.suspend(() => Effect.succeed(getUnsafe(self)));\n}\n/**\n * Interrupts the fiber currently stored in the `FiberHandle`, if any, and\n * leaves the handle empty.\n *\n * **Example** (Clearing a fiber handle)\n *\n * ```ts import.meta.vitest\n * import { Effect, FiberHandle, Option } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const handle = yield* FiberHandle.make()\n *\n * // Add a fiber\n * yield* FiberHandle.run(handle, Effect.never)\n *\n * // Clear the handle, interrupting the fiber\n * yield* FiberHandle.clear(handle)\n *\n * // The handle is now empty\n * return FiberHandle.getUnsafe(handle)\n * })\n *\n * const actual = await Effect.runPromise(Effect.scoped(program))\n * actual // => Option.none()\n * ```\n *\n * @category combinators\n * @since 2.0.0\n */\nexport const clear = self => Effect.uninterruptibleMask(restore => {\n if (self.state._tag === \"Closed\" || self.state.fiber === undefined) {\n return Effect.void;\n }\n const fiber = self.state.fiber;\n return Effect.andThen(restore(Fiber.interruptAs(fiber, internalFiberId)), Effect.sync(() => {\n if (self.state._tag === \"Open\" && self.state.fiber === fiber) {\n self.state.fiber = undefined;\n }\n }));\n});\nconst constInterruptedFiber = /*#__PURE__*/function () {\n let fiber = undefined;\n return () => {\n if (fiber === undefined) {\n fiber = Effect.runFork(Effect.interrupt);\n }\n return fiber;\n };\n}();\n/**\n * Forks an Effect and stores the resulting fiber in the `FiberHandle`.\n *\n * **Details**\n *\n * The handle manages only one fiber: running a new effect interrupts the\n * previous fiber unless `onlyIfMissing` is set. When the managed fiber\n * completes, it is removed from the handle.\n *\n * **Example** (Running an effect in a fiber handle)\n *\n * ```ts import.meta.vitest\n * import { Effect, Fiber, FiberHandle } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const handle = yield* FiberHandle.make()\n *\n * // Run an effect and get the fiber\n * const fiber = yield* FiberHandle.run(handle, Effect.succeed(\"hello\"))\n * const result = yield* Fiber.join(fiber)\n *\n * // Running another effect will interrupt the previous one\n * const fiber2 = yield* FiberHandle.run(handle, Effect.succeed(\"world\"))\n * const result2 = yield* Fiber.join(fiber2)\n * return [result, result2]\n * })\n *\n * const actual = await Effect.runPromise(Effect.scoped(program))\n * actual // => [\"hello\", \"world\"]\n * ```\n *\n * @category combinators\n * @since 2.0.0\n */\nexport const run = function () {\n const self = arguments[0];\n if (Effect.isEffect(arguments[1])) {\n return runImpl(self, arguments[1], arguments[2]);\n }\n const options = arguments[1];\n return effect => runImpl(self, effect, options);\n};\nconst runImpl = (self, effect, options) => Effect.withFiber(parent => {\n if (self.state._tag === \"Closed\") {\n return Effect.interrupt;\n } else if (self.state.fiber !== undefined && options?.onlyIfMissing === true) {\n return Effect.sync(constInterruptedFiber);\n }\n const fiber = Effect.runForkWith(parent.context)(effect);\n setUnsafe(self, fiber, options);\n return Effect.succeed(fiber);\n});\n/**\n * Captures the current runtime and returns a function for forking effects into\n * an existing `FiberHandle`.\n *\n * **Details**\n *\n * Each call returns the forked fiber, stores it in the handle, and interrupts\n * the previous fiber unless `onlyIfMissing` is set.\n *\n * **Example** (Capturing a runtime for fiber handles)\n *\n * ```ts import.meta.vitest\n * import { Context, Effect, Fiber, FiberHandle } from \"effect\"\n *\n * class Users extends Context.Service<Users, {\n * readonly getAll: Effect.Effect<Array<unknown>>\n * }>()(\"Users\") {}\n *\n * const program = Effect.gen(function*() {\n * const handle = yield* FiberHandle.make()\n * const run = yield* FiberHandle.runtime(handle)<Users>()\n *\n * // run an effect and set the fiber in the handle\n * const fiberA = run(Effect.andThen(Users, (_) => _.getAll))\n *\n * // this will interrupt the previous fiber\n * const fiberB = run(Effect.andThen(Users, (_) => _.getAll))\n * yield* Fiber.await(fiberA)\n * return (yield* Fiber.join(fiberB)).length\n * }).pipe(\n * Effect.scoped // The fiber will be interrupted when the scope is closed\n * )\n *\n * const actual = await Effect.runPromise(Effect.provideService(program, Users, {\n * getAll: Effect.succeed([])\n * }))\n * actual // => 0\n * ```\n *\n * @category combinators\n * @since 2.0.0\n */\nexport const runtime = self => () => Effect.map(Effect.context(), services => {\n const runFork = Effect.runForkWith(services);\n return (effect, options) => {\n if (self.state._tag === \"Closed\") {\n return constInterruptedFiber();\n } else if (self.state.fiber !== undefined && options?.onlyIfMissing === true) {\n return constInterruptedFiber();\n }\n const fiber = runFork(effect, options);\n setUnsafe(self, fiber, options);\n return fiber;\n };\n});\n/**\n * Captures the current runtime and returns a function for running effects in\n * an existing `FiberHandle` as Promises.\n *\n * **Details**\n *\n * Each call stores the forked fiber in the handle and interrupts the previous\n * fiber unless `onlyIfMissing` is set. The Promise resolves with the effect's\n * success value or rejects with the squashed failure cause.\n *\n * **Example** (Capturing a runtime for promises)\n *\n * ```ts import.meta.vitest\n * import { Effect, FiberHandle } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const handle = yield* FiberHandle.make()\n * const runPromise = yield* FiberHandle.runtimePromise(handle)<never>()\n *\n * // Run an effect and get a promise\n * const promise = runPromise(Effect.succeed(\"hello\"))\n * return yield* Effect.promise(() => promise)\n * })\n *\n * const actual = await Effect.runPromise(Effect.scoped(program))\n * actual // => \"hello\"\n * ```\n *\n * @category combinators\n * @since 3.13.0\n */\nexport const runtimePromise = self => () => Effect.map(runtime(self)(), runFork => (effect, options) => new Promise((resolve, reject) => runFork(effect, options).addObserver(exit => {\n if (Exit.isSuccess(exit)) {\n resolve(exit.value);\n } else {\n reject(Cause.squash(exit.cause));\n }\n})));\n/**\n * Waits for the `FiberHandle` to fail or close.\n *\n * **Details**\n *\n * The returned Effect fails with the first managed fiber failure that is not\n * ignored by the handle's interruption rules. Normal successful completion of\n * a managed fiber only removes it from the handle; use `awaitEmpty` to wait\n * for the current fiber to finish.\n *\n * **Example** (Propagating fiber failures)\n *\n * ```ts import.meta.vitest\n * import { Effect, Exit, FiberHandle } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const handle = yield* FiberHandle.make()\n * yield* FiberHandle.set(handle, Effect.runFork(Effect.fail(\"error\")))\n *\n * // parent fiber will fail with \"error\"\n * yield* FiberHandle.join(handle)\n * })\n *\n * const actual = await Effect.runPromise(Effect.exit(Effect.scoped(program)))\n * actual // => Exit.fail(\"error\")\n * ```\n *\n * @category combinators\n * @since 2.0.0\n */\nexport const join = self => Deferred.await(self.deferred);\n/**\n * Waits for the fiber in the FiberHandle to complete.\n *\n * **Example** (Waiting for a fiber to complete)\n *\n * ```ts import.meta.vitest\n * import { Effect, FiberHandle, Option } from \"effect\"\n *\n * const program = Effect.gen(function*() {\n * const handle = yield* FiberHandle.make()\n *\n * yield* FiberHandle.run(handle, Effect.yieldNow)\n *\n * // Wait for the fiber to complete\n * yield* FiberHandle.awaitEmpty(handle)\n *\n * return yield* FiberHandle.get(handle)\n * })\n *\n * const actual = await Effect.runPromise(Effect.scoped(program))\n * actual // => Option.none()\n * ```\n *\n * @category combinators\n * @since 3.13.0\n */\nexport const awaitEmpty = self => Effect.suspend(() => {\n if (self.state._tag === \"Closed\" || self.state.fiber === undefined) {\n return Effect.void;\n }\n return Fiber.await(self.state.fiber);\n});\n//# sourceMappingURL=FiberHandle.js.map","/**\n * Connects Effect SQL to SQLite on Node.js using `node:sqlite`.\n *\n * This module opens a SQLite database and exposes it as both `SqliteClient` and\n * the generic Effect SQL client. It serializes access through one connection,\n * caches prepared statements, enables WAL mode unless disabled, and waits up\n * to five seconds for busy databases by default. Explicit transactions on\n * writable connections use `BEGIN IMMEDIATE` to avoid read-to-write lock\n * upgrades, which serializes them behind other writers even when they only\n * read. Clients opened with `readonly: true` are unaffected. Busy waits block\n * the Node.js event loop because `node:sqlite` is synchronous. Database backup\n * and extension loading are supported; streaming queries and `updateValues`\n * are not.\n *\n * @since 4.0.0\n */\nimport * as Cache from \"effect/Cache\";\nimport * as Config from \"effect/Config\";\nimport * as Context from \"effect/Context\";\nimport * as Duration from \"effect/Duration\";\nimport * as Effect from \"effect/Effect\";\nimport * as Fiber from \"effect/Fiber\";\nimport { identity } from \"effect/Function\";\nimport * as Layer from \"effect/Layer\";\nimport * as Scope from \"effect/Scope\";\nimport * as Semaphore from \"effect/Semaphore\";\nimport * as Stream from \"effect/Stream\";\nimport * as Reactivity from \"effect/unstable/reactivity/Reactivity\";\nimport * as Client from \"effect/unstable/sql/SqlClient\";\nimport { classifySqliteError, SqlError } from \"effect/unstable/sql/SqlError\";\nimport * as Statement from \"effect/unstable/sql/Statement\";\nimport { backup as backupDatabase, DatabaseSync } from \"node:sqlite\";\nconst ATTR_DB_SYSTEM_NAME = \"db.system.name\";\nconst MAX_BUSY_TIMEOUT = 2_147_483_647;\n/**\n * Runtime type identifier used to mark Node `SqliteClient` values.\n *\n * @category type IDs\n * @since 4.0.0\n */\nexport const TypeId = \"~@effect/sql-sqlite-node/SqliteClient\";\n/**\n * Service tag for the node SQLite client implementation.\n *\n * @category services\n * @since 4.0.0\n */\nexport const SqliteClient = /*#__PURE__*/Context.Service(\"@effect/sql-sqlite-node/SqliteClient\");\n/**\n * Creates a scoped node SQLite client from the supplied configuration, using a single serialized connection with WAL and a 5-second busy timeout enabled by default. Explicit transactions on writable connections take the write lock for their duration, even when they only read; clients opened with `readonly: true` are unaffected.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const make = options => Effect.gen(function* () {\n const compiler = Statement.makeCompilerSqlite(options.transformQueryNames);\n const transformRows = options.transformResultNames ? Statement.defaultTransforms(options.transformResultNames).array : undefined;\n const makeConnection = Effect.gen(function* () {\n const scope = yield* Effect.scope;\n const db = new DatabaseSync(options.filename, {\n readOnly: options.readonly ?? false,\n allowExtension: true\n });\n yield* Scope.addFinalizer(scope, Effect.sync(() => db.close()));\n db.enableLoadExtension(false);\n const busyTimeout = Math.min(MAX_BUSY_TIMEOUT, Math.max(0, Math.round(Duration.toMillis(options.busyTimeout ?? Duration.seconds(5)))));\n db.exec(`PRAGMA busy_timeout = ${busyTimeout}`);\n if (options.disableWAL !== true) {\n db.exec(\"PRAGMA journal_mode = WAL\");\n }\n const prepare = sql => Effect.try({\n try: () => db.prepare(sql),\n catch: cause => new SqlError({\n reason: classifyError(cause, \"Failed to prepare statement\", \"prepare\")\n })\n });\n const prepareCache = yield* Cache.make({\n capacity: options.prepareCacheSize ?? 200,\n timeToLive: options.prepareCacheTTL ?? Duration.minutes(10),\n lookup: prepare\n });\n const runStatement = (statement, params, raw) => Effect.withFiber(fiber => {\n const useSafeIntegers = Context.get(fiber.context, Client.SafeIntegers);\n return Effect.try({\n try: () => {\n statement.setReadBigInts(useSafeIntegers);\n if (statement.columns().length > 0) {\n return statement.all(...params);\n }\n const result = statement.run(...params);\n return raw ? {\n changes: result.changes,\n lastInsertRowid: result.lastInsertRowid\n } : [];\n },\n catch: cause => new SqlError({\n reason: classifyError(cause, \"Failed to execute statement\", \"execute\")\n })\n });\n });\n const runStatementValues = (statement, params) => Effect.withFiber(fiber => {\n const useSafeIntegers = Context.get(fiber.context, Client.SafeIntegers);\n return Effect.try({\n try: () => {\n statement.setReadBigInts(useSafeIntegers);\n if (statement.columns().length > 0) {\n return statement.all(...params);\n }\n statement.run(...params);\n return [];\n },\n catch: cause => new SqlError({\n reason: classifyError(cause, \"Failed to execute statement\", \"execute\")\n })\n });\n });\n const runStatementValuesUnprepared = (statement, params) => Effect.withFiber(fiber => {\n const useSafeIntegers = Context.get(fiber.context, Client.SafeIntegers);\n return Effect.try({\n try: () => {\n statement.setReadBigInts(useSafeIntegers);\n statement.setReturnArrays(true);\n if (statement.columns().length > 0) {\n return statement.all(...params);\n }\n statement.run(...params);\n return [];\n },\n catch: cause => new SqlError({\n reason: classifyError(cause, \"Failed to execute statement\", \"execute\")\n })\n });\n });\n const run = (sql, params, raw = false) => Effect.flatMap(Cache.get(prepareCache, sql), s => runStatement(s, params, raw));\n const runValues = (sql, params) => Effect.acquireUseRelease(Cache.get(prepareCache, sql), statement => {\n statement.setReturnArrays(true);\n return runStatementValues(statement, params);\n }, statement => Effect.sync(() => statement.setReturnArrays(false)));\n const runValuesUnprepared = (sql, params) => Effect.flatMap(prepare(sql), statement => runStatementValuesUnprepared(statement, params));\n return identity({\n execute(sql, params, transformRows) {\n return transformRows ? Effect.map(run(sql, params), transformRows) : run(sql, params);\n },\n executeRaw(sql, params) {\n return run(sql, params, true);\n },\n executeValues(sql, params) {\n return runValues(sql, params);\n },\n executeValuesUnprepared(sql, params) {\n return runValuesUnprepared(sql, params);\n },\n executeUnprepared(sql, params, transformRows) {\n const effect = Effect.flatMap(prepare(sql), statement => runStatement(statement, params ?? [], false));\n return transformRows ? Effect.map(effect, transformRows) : effect;\n },\n executeStream(_sql, _params) {\n return Stream.die(\"executeStream not implemented\");\n },\n backup(destination) {\n return Effect.suspend(() => {\n let totalPages = 0;\n return Effect.tryPromise({\n try: () => backupDatabase(db, destination, {\n progress: progress => {\n totalPages = progress.totalPages;\n }\n }).then(pages => ({\n totalPages: totalPages || pages,\n remainingPages: 0\n })),\n catch: cause => new SqlError({\n reason: classifyError(cause, \"Failed to backup database\", \"backup\")\n })\n });\n });\n },\n loadExtension(path) {\n return Effect.acquireUseRelease(Effect.sync(() => db.enableLoadExtension(true)), () => Effect.try({\n try: () => db.loadExtension(path),\n catch: cause => new SqlError({\n reason: classifyError(cause, \"Failed to load extension\", \"loadExtension\")\n })\n }), () => Effect.sync(() => db.enableLoadExtension(false)));\n }\n });\n });\n const semaphore = yield* Semaphore.make(1);\n const connection = yield* makeConnection;\n const acquirer = semaphore.withPermits(1)(Effect.succeed(connection));\n const transactionAcquirer = Effect.uninterruptibleMask(restore => {\n const fiber = Fiber.getCurrent();\n const scope = Context.getUnsafe(fiber.context, Scope.Scope);\n return Effect.as(Effect.tap(restore(semaphore.take(1)), () => Scope.addFinalizer(scope, semaphore.release(1))), connection);\n });\n return Object.assign(yield* Client.make({\n acquirer,\n compiler,\n transactionAcquirer,\n beginTransaction: options.readonly === true ? \"BEGIN\" : \"BEGIN IMMEDIATE\",\n spanAttributes: [...(options.spanAttributes ? Object.entries(options.spanAttributes) : []), [ATTR_DB_SYSTEM_NAME, \"sqlite\"]],\n transformRows\n }), {\n [TypeId]: TypeId,\n config: options,\n backup: destination => Effect.flatMap(acquirer, _ => _.backup(destination)),\n loadExtension: path => Effect.flatMap(acquirer, _ => _.loadExtension(path))\n });\n});\n/**\n * Builds a layer from an Effect `Config` value, providing both the node `SqliteClient` service and the generic `SqlClient` service.\n *\n * @category layers\n * @since 4.0.0\n */\nexport const layerConfig = config => Layer.effectContext(Config.unwrap(config).pipe(Effect.flatMap(make), Effect.map(client => Context.make(SqliteClient, client).pipe(Context.add(Client.SqlClient, client))))).pipe(Layer.provide(Reactivity.layer));\n/**\n * Builds a layer from a node SQLite client configuration, providing both `SqliteClient` and the generic `SqlClient` service.\n *\n * @category layers\n * @since 4.0.0\n */\nexport const layer = config => Layer.effectContext(Effect.map(make(config), client => Context.make(SqliteClient, client).pipe(Context.add(Client.SqlClient, client)))).pipe(Layer.provide(Reactivity.layer));\n// internal\nconst classifyError = (cause, message, operation) => classifySqliteError(sqliteCauseWithErrno(cause), {\n message,\n operation\n});\nconst sqliteCauseWithErrno = cause => {\n if (typeof cause !== \"object\" || cause === null || !(\"errcode\" in cause) || \"errno\" in cause) {\n return cause;\n }\n const errcode = cause.errcode;\n if (typeof errcode !== \"number\") {\n return cause;\n }\n return Object.assign(cause, {\n errno: errcode\n });\n};\n//# sourceMappingURL=SqliteClient.js.map","var __rewriteRelativeImportExtension = this && this.__rewriteRelativeImportExtension || function (path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : d + ext + \".\" + cm.toLowerCase() + \"js\";\n });\n }\n return path;\n};\n/**\n * Runs SQL migrations with `SqlClient`.\n *\n * A migrator loads numbered migration effects, records completed ids in a\n * migrations table, and runs only pending migrations in a transaction. It\n * creates the table when needed, detects duplicate ids, treats concurrent runs\n * as locked, and can dump the schema after successful migrations.\n *\n * @since 4.0.0\n */\nimport * as Arr from \"../../Array.js\";\nimport * as Data from \"../../Data.js\";\nimport * as Effect from \"../../Effect.js\";\nimport { FileSystem } from \"../../FileSystem.js\";\nimport { pipe } from \"../../Function.js\";\nimport * as Option from \"../../Option.js\";\nimport * as Order from \"../../Order.js\";\nimport { Path } from \"../../Path.js\";\nimport * as Client from \"./SqlClient.js\";\n/**\n * Error raised while loading, validating, locking, or running SQL migrations.\n *\n * @category errors\n * @since 4.0.0\n */\nexport class MigrationError extends /*#__PURE__*/Data.TaggedError(\"MigrationError\") {}\n/**\n * Creates a migrator that ensures the migrations table exists, runs pending\n * migrations in a transaction, and optionally dumps the schema after successful\n * migrations.\n *\n * @category constructors\n * @since 4.0.0\n */\nexport const make = ({\n dumpSchema = () => Effect.void\n}) => ({\n loader,\n schemaDirectory,\n table = \"effect_sql_migrations\"\n}) => Effect.gen(function* () {\n const sql = yield* Client.SqlClient;\n const ensureMigrationsTable = sql.onDialectOrElse({\n mssql: () => sql`IF OBJECT_ID(N'${sql.literal(table)}', N'U') IS NULL\n CREATE TABLE ${sql(table)} (\n migration_id INT NOT NULL PRIMARY KEY,\n name VARCHAR(255) NOT NULL,\n created_at DATETIME NOT NULL DEFAULT GETDATE()\n )`,\n mysql: () => sql`CREATE TABLE IF NOT EXISTS ${sql(table)} (\n migration_id INTEGER UNSIGNED NOT NULL,\n created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n name VARCHAR(255) NOT NULL,\n PRIMARY KEY (migration_id)\n)`,\n pg: () => Effect.catch(sql`select ${table}::regclass`, () => sql`CREATE TABLE ${sql(table)} (\n migration_id integer primary key,\n created_at timestamp with time zone not null default now(),\n name text not null\n)`),\n orElse: () => sql`CREATE TABLE IF NOT EXISTS ${sql(table)} (\n migration_id integer PRIMARY KEY NOT NULL,\n created_at datetime NOT NULL DEFAULT current_timestamp,\n name VARCHAR(255) NOT NULL\n)`\n });\n const insertMigrations = rows => sql`INSERT INTO ${sql(table)} ${sql.insert(rows.map(([migration_id, name]) => ({\n migration_id,\n name\n })))}`.withoutTransform;\n const latestMigration = Effect.map(sql`SELECT migration_id, name, created_at FROM ${sql(table)} ORDER BY migration_id DESC`.withoutTransform, _ => Option.map(Option.fromNullishOr(_[0]), ({\n created_at,\n migration_id,\n name\n }) => ({\n id: migration_id,\n name,\n createdAt: created_at\n })));\n const loadMigration = ([id, name, load]) => Effect.catchDefect(load, _ => Effect.fail(new MigrationError({\n kind: \"ImportError\",\n message: `Could not import migration \"${id}_${name}\"\\n\\n${_}`\n }))).pipe(Effect.flatMap(_ => Effect.isEffect(_) ? Effect.succeed(_) : _.default ? Effect.succeed(_.default?.default ?? _.default) : Effect.fail(new MigrationError({\n kind: \"ImportError\",\n message: `Default export not found for migration \"${id}_${name}\"`\n }))), Effect.filterOrFail(Effect.isEffect, () => new MigrationError({\n kind: \"ImportError\",\n message: `Default export was not an Effect for migration \"${id}_${name}\"`\n })));\n const runMigration = (id, name, effect) => Effect.catch(effect, error => Effect.die(new MigrationError({\n cause: error,\n kind: \"Failed\",\n message: `Migration \"${id}_${name}\" failed`\n })));\n // === run\n const run = Effect.gen(function* () {\n yield* sql.onDialectOrElse({\n pg: () => sql`LOCK TABLE ${sql(table)} IN ACCESS EXCLUSIVE MODE`,\n orElse: () => Effect.void\n });\n const [latestMigrationId, current] = yield* Effect.all([Effect.map(latestMigration, Option.match({\n onNone: () => 0,\n onSome: _ => _.id\n })), loader]);\n if (new Set(current.map(([id]) => id)).size !== current.length) {\n return yield* new MigrationError({\n kind: \"Duplicates\",\n message: \"Found duplicate migration id's\"\n });\n }\n const required = [];\n for (const resolved of current) {\n const [currentId, currentName] = resolved;\n if (currentId <= latestMigrationId) {\n continue;\n }\n required.push([currentId, currentName, yield* loadMigration(resolved)]);\n }\n if (required.length > 0) {\n yield* pipe(insertMigrations(required.map(([id, name]) => [id, name])), Effect.mapError(error => isConstraintConflict(error) ? new MigrationError({\n kind: \"Locked\",\n message: \"Migrations already running\"\n }) : error));\n }\n yield* Effect.forEach(required, ([id, name, effect]) => Effect.logDebug(`Running migration`).pipe(Effect.flatMap(() => runMigration(id, name, effect)), Effect.annotateLogs(\"migration_id\", String(id)), Effect.annotateLogs(\"migration_name\", name), Effect.withSpan(`Migrator ${id}_${name}`)), {\n discard: true\n });\n yield* pipe(latestMigration, Effect.flatMap(Option.match({\n onNone: () => Effect.logDebug(`Migrations complete`),\n onSome: _ => Effect.logDebug(`Migrations complete`).pipe(Effect.annotateLogs(\"latest_migration_id\", _.id.toString()), Effect.annotateLogs(\"latest_migration_name\", _.name))\n })));\n return required.map(([id, name]) => [id, name]);\n });\n yield* ensureMigrationsTable;\n const completed = yield* pipe(sql.withTransaction(run), Effect.catchTag(\"MigrationError\", _ => _.kind === \"Locked\" ? Effect.as(Effect.logDebug(_.message), []) : Effect.fail(_)));\n if (schemaDirectory && completed.length > 0) {\n yield* dumpSchema(`${schemaDirectory}/_schema.sql`, table).pipe(Effect.catchCause(cause => Effect.logInfo(\"Could not dump schema\", cause)));\n }\n return completed;\n});\nconst migrationOrder = /*#__PURE__*/Order.make(([a], [b]) => Order.Number(a, b));\nconst isConstraintConflict = error => error.reason._tag === \"ConstraintError\" || error.reason._tag === \"UniqueViolation\";\n/**\n * Creates a migration loader from a glob record of dynamic import functions,\n * parsing files named `<id>_<name>.js`, `<id>_<name>.ts`,\n * `<id>_<name>.mjs`, or `<id>_<name>.mts` and sorting migrations by id.\n *\n * @category loaders\n * @since 4.0.0\n */\nexport const fromGlob = migrations => pipe(Object.keys(migrations), Arr.flatMapNullishOr(_ => _.match(/^(?:.*\\/)?(\\d+)_([^.]+)\\.(js|ts|mjs|mts)$/)), Arr.map(([key, id, name]) => [Number(id), name, Effect.promise(() => migrations[key]())]), Arr.sort(migrationOrder), Effect.succeed);\n/**\n * Creates a migration loader from a Babel-style glob record, parsing keys such\n * as `_<id>_<name>Js`, `_<id>_<name>Ts`, `_<id>_<name>Mjs`, or\n * `_<id>_<name>Mts` and sorting migrations by id.\n *\n * @category loaders\n * @since 4.0.0\n */\nexport const fromBabelGlob = migrations => pipe(Object.keys(migrations), Arr.flatMapNullishOr(_ => _.match(/^_(\\d+)_([^.]+?)(Js|Ts|Mjs|Mts)?$/)), Arr.map(([key, id, name]) => [Number(id), name, Effect.succeed(migrations[key])]), Arr.sort(migrationOrder), Effect.succeed);\n/**\n * Creates a migration loader from a record of migration effects keyed by\n * `<id>_<name>`, sorted by migration id.\n *\n * @category loaders\n * @since 4.0.0\n */\nexport const fromRecord = migrations => pipe(Object.keys(migrations), Arr.flatMapNullishOr(_ => _.match(/^(\\d+)_(.+)$/)), Arr.map(([key, id, name]) => [Number(id), name, Effect.succeed(migrations[key])]), Arr.sort(migrationOrder), Effect.succeed);\n/**\n * Creates a migration loader that reads a directory with `FileSystem`, imports\n * files named `<id>_<name>.js`, `<id>_<name>.ts`,\n * `<id>_<name>.mjs`, or `<id>_<name>.mts`, and sorts migrations by id.\n *\n * **Details**\n *\n * Requires a `Path` service appropriate for the migration directory's path\n * syntax. On Windows, prefer a platform-aware implementation such as\n * `NodePath.layer`; the core `Path.layer` uses POSIX semantics and does not\n * preserve Windows drive-letter paths.\n *\n * @category loaders\n * @since 4.0.0\n */\nexport const fromFileSystem = /*#__PURE__*/Effect.fnUntraced(function* (directory) {\n const Fs = yield* FileSystem;\n const path = yield* Path;\n const files = yield* Effect.mapError(Fs.readDirectory(directory), cause => new MigrationError({\n kind: \"Failed\",\n cause,\n message: \"Failed to read migrations directory\"\n }));\n return files.map(file => Option.fromNullishOr(file.match(/^(?:.*\\/)?(\\d+)_([^.]+)\\.(js|ts|mjs|mts)$/))).flatMap(Option.match({\n onNone: () => [],\n onSome: ([basename, id, name]) => [[Number(id), name,\n // `import` needs a file URL: on Windows an absolute path such as\n // `D:\\migrations\\1_init.ts` is rejected by the ESM loader. `orDie` keeps the\n // failure a defect so `loadMigration` reports it as an import error.\n Effect.flatMap(Effect.orDie(path.toFileUrl(path.join(directory, basename))), url => Effect.promise(() => import(__rewriteRelativeImportExtension(/* @vite-ignore */\n /* webpackIgnore: true */\n url.href))))]]\n })).sort(([a], [b]) => a - b);\n});\n//# sourceMappingURL=Migrator.js.map","import * as Layer from \"effect/Layer\";\nimport * as Migrator from \"effect/unstable/sql/Migrator\";\n/**\n * @since 4.0.0\n */\nexport * from \"effect/unstable/sql/Migrator\";\n/**\n * Runs SQL migrations for a SQLite database using the shared `Migrator` implementation and the current `SqlClient`.\n *\n * @category running\n * @since 4.0.0\n */\nexport const run = /*#__PURE__*/Migrator.make({\n // dumpSchema(path, table) {\n // const dump = (args: Array<string>) =>\n // Effect.gen(function*() {\n // const sql = yield* SqliteClient\n // const dump = yield* pipe(\n // Command.make(\"sqlite3\", sql.config.filename, ...args),\n // Command.string\n // )\n // return dump.replace(/^create table sqlite_sequence\\(.*$/im, \"\")\n // .replace(/\\n{2,}/gm, \"\\n\\n\")\n // .trim()\n // }).pipe(\n // Effect.mapError((error) => new Migrator.MigrationError({ kind: \"Failed\", message: error.message }))\n // )\n //\n // const dumpSchema = dump([\".schema\"])\n //\n // const dumpMigrations = dump([\n // \"--cmd\",\n // `.mode insert ${table}`,\n // `select * from ${table}`\n // ])\n //\n // const dumpAll = Effect.map(\n // Effect.all([dumpSchema, dumpMigrations], { concurrency: 2 }),\n // ([schema, migrations]) => schema + \"\\n\\n\" + migrations\n // )\n //\n // const dumpFile = (file: string) =>\n // Effect.gen(function*() {\n // const fs = yield* FileSystem\n // const path = yield* Path\n // const dump = yield* dumpAll\n // yield* fs.makeDirectory(path.dirname(file), { recursive: true })\n // yield* fs.writeFileString(file, dump)\n // }).pipe(\n // Effect.mapError((error) => new Migrator.MigrationError({ kind: \"Failed\", message: error.message }))\n // )\n //\n // return dumpFile(path)\n // }\n});\n/**\n * Creates a layer that runs the configured SQLite migrations during layer construction and provides no services.\n *\n * @category layers\n * @since 4.0.0\n */\nexport const layer = options => Layer.effectDiscard(run(options));\n//# sourceMappingURL=SqliteMigrator.js.map","/**\n * @since 1.0.0\n */\nimport * as SqliteClient from \"@effect/sql-sqlite-node/SqliteClient\"\nimport * as SqliteMigrator from \"@effect/sql-sqlite-node/SqliteMigrator\"\nimport * as Effect from \"effect/Effect\"\nimport * as Layer from \"effect/Layer\"\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\"\nimport * as FileSystem from \"effect/FileSystem\"\nimport * as Path from \"effect/Path\"\nimport { getLoadablePath } from \"sqlite-vec\"\n\n/**\n * @since 1.0.0\n * @category Layers\n */\nexport const SqliteLayer = (database: string) =>\n SqliteMigrator.layer({\n loader: SqliteMigrator.fromRecord({\n \"0001_create_chunks\": Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient\n\n yield* sql`CREATE TABLE IF NOT EXISTS chunks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n path TEXT NOT NULL,\n content TEXT NOT NULL,\n hash TEXT NOT NULL,\n vector BLOB NOT NULL,\n syncId TEXT NOT NULL\n )`\n\n yield* sql`CREATE INDEX IF NOT EXISTS idx_chunks_hash ON chunks (hash)`\n }),\n }),\n }).pipe(\n Layer.provide(\n Layer.effectDiscard(\n Effect.gen(function* () {\n const client = yield* SqliteClient.SqliteClient\n yield* client.loadExtension(getLoadablePath())\n }),\n ),\n ),\n Layer.provideMerge(\n SqliteClient.layer({\n filename: database,\n }),\n ),\n Layer.provide(\n Layer.effectDiscard(\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem\n const path = yield* Path.Path\n const directory = path.dirname(database)\n if (directory === \".\") return\n yield* fs.makeDirectory(directory, { recursive: true })\n }),\n ),\n ),\n )\n","/**\n * @since 1.0.0\n */\nimport { createHash } from \"node:crypto\"\nimport * as Effect from \"effect/Effect\"\nimport * as ChunkRepo from \"./ChunkRepo.ts\"\nimport * as CodeChunker from \"./CodeChunker.ts\"\nimport * as Layer from \"effect/Layer\"\nimport * as Stream from \"effect/Stream\"\nimport { pipe } from \"effect/Function\"\nimport * as EmbeddingModel from \"effect/unstable/ai/EmbeddingModel\"\nimport * as RequestResolver from \"effect/RequestResolver\"\nimport * as Option from \"effect/Option\"\nimport * as Path from \"effect/Path\"\nimport * as Fiber from \"effect/Fiber\"\nimport * as Duration from \"effect/Duration\"\nimport * as FiberHandle from \"effect/FiberHandle\"\nimport { SqliteLayer } from \"./Sqlite.ts\"\nimport type * as SqlError from \"effect/unstable/sql/SqlError\"\nimport type * as SqliteMigrator from \"@effect/sql-sqlite-node/SqliteMigrator\"\nimport type * as PlatformError from \"effect/PlatformError\"\nimport type * as ChildProcessSpawner from \"effect/unstable/process/ChildProcessSpawner\"\nimport type * as FileSystem from \"effect/FileSystem\"\nimport * as Console from \"effect/Console\"\nimport { SemanticSearch } from \"./SemanticSearch/Service.ts\"\n\n/**\n * @since 1.0.0\n * @category Services\n */\nexport * from \"./SemanticSearch/Service.ts\"\n\nconst normalizePath = (path: string) => path.replace(/\\\\/g, \"/\")\n\nconst resolveChunkConfig = (options: {\n readonly chunkMaxCharacters?: number | undefined\n}) => ({\n chunkSize: 30,\n chunkOverlap: 0,\n chunkMaxCharacters: options.chunkMaxCharacters ?? 15_000,\n})\n\nexport const makeEmbeddingResolver = (\n resolver: EmbeddingModel.EmbeddingModel[\"resolver\"],\n options: {\n readonly embeddingBatchSize?: number | undefined\n readonly embeddingRequestDelay?: Duration.Input | undefined\n },\n): EmbeddingModel.EmbeddingModel[\"resolver\"] =>\n resolver.pipe(\n RequestResolver.setDelay(\n options.embeddingRequestDelay ?? Duration.millis(50),\n ),\n RequestResolver.batchN(options.embeddingBatchSize ?? 32),\n )\n\nexport const chunkEmbeddingInput = (chunk: CodeChunker.CodeChunk): string => {\n const headerLines = [\"---\", \"file: \" + chunk.path]\n\n if (chunk.name !== undefined) {\n headerLines.push(\"name: \" + chunk.name)\n }\n if (chunk.type !== undefined) {\n headerLines.push(\"type: \" + chunk.type)\n }\n if (chunk.parent !== undefined) {\n headerLines.push(\"parent: \" + chunk.parent)\n }\n headerLines.push(\"---\")\n\n const contentLines = chunk.content.split(\"\\n\")\n let contentWithLines = \"\"\n for (let i = 0; i < contentLines.length; i++) {\n if (i > 0) {\n contentWithLines += \"\\n\"\n }\n contentWithLines += `${chunk.startLine + i}: ${contentLines[i]}`\n }\n\n return headerLines.join(\"\\n\") + \"\\n\\n\" + contentWithLines\n}\n\nconst hashChunkInput = (input: string): string =>\n createHash(\"sha256\").update(input).digest(\"hex\")\n\n/**\n * @since 1.0.0\n * @category Layers\n */\nexport const layer = (options: {\n readonly directory: string\n readonly database?: string | undefined\n readonly embeddingBatchSize?: number | undefined\n readonly embeddingRequestDelay?: Duration.Input | undefined\n readonly concurrency?: number | undefined\n readonly chunkMaxCharacters?: number | undefined\n}): Layer.Layer<\n SemanticSearch,\n | SqlError.SqlError\n | SqliteMigrator.MigrationError\n | PlatformError.PlatformError,\n | EmbeddingModel.EmbeddingModel\n | Path.Path\n | ChildProcessSpawner.ChildProcessSpawner\n | FileSystem.FileSystem\n | EmbeddingModel.Dimensions\n> =>\n Layer.effect(\n SemanticSearch,\n Effect.gen(function* () {\n const chunker = yield* CodeChunker.CodeChunker\n const repo = yield* ChunkRepo.ChunkRepo\n const embeddings = yield* EmbeddingModel.EmbeddingModel\n const pathService = yield* Path.Path\n const root = pathService.resolve(options.directory)\n const resolver = makeEmbeddingResolver(embeddings.resolver, options)\n const concurrency = options.concurrency ?? 2000\n const chunkConfig = resolveChunkConfig(options)\n const indexHandle = yield* FiberHandle.make()\n const console = yield* Console.Console\n\n const resolveIndexedPath = (path: string): Option.Option<string> => {\n const absolutePath = pathService.resolve(root, path)\n const relativePath = normalizePath(\n pathService.relative(root, absolutePath),\n )\n if (\n relativePath.length === 0 ||\n relativePath === \"..\" ||\n relativePath.startsWith(\"../\")\n ) {\n return Option.none()\n }\n return Option.some(relativePath)\n }\n\n const processChunk = Effect.fnUntraced(\n function* (options: {\n readonly chunk: CodeChunker.CodeChunk\n readonly syncId: ChunkRepo.SyncId\n readonly checkExisting: boolean\n }) {\n const input = chunkEmbeddingInput(options.chunk)\n const hash = hashChunkInput(input)\n\n if (options.checkExisting) {\n const id = yield* repo.exists(hash)\n if (Option.isSome(id)) {\n yield* repo.setSyncId(id.value, options.syncId)\n return\n }\n }\n\n const result = yield* Effect.request(\n new EmbeddingModel.EmbeddingRequest({ input }),\n resolver,\n )\n const vector = new Float32Array(result.vector)\n yield* repo.insert(\n ChunkRepo.Chunk.insert.make({\n path: options.chunk.path,\n hash,\n content: input,\n vector,\n syncId: options.syncId,\n }),\n )\n },\n Effect.ignore({\n log: \"Warn\",\n message: \"Failed to process chunk for embedding\",\n }),\n (effect, options) =>\n Effect.annotateLogs(effect, {\n chunk: `${options.chunk.path}/${options.chunk.startLine}`,\n }),\n )\n\n const index = Effect.gen(function* () {\n const syncId = ChunkRepo.SyncId.make(crypto.randomUUID())\n yield* Effect.logInfo(\"Starting SemanticSearch index\")\n\n yield* pipe(\n chunker.chunkCodebase({\n root,\n ...chunkConfig,\n }),\n Stream.tap(\n (chunk) =>\n processChunk({\n chunk,\n syncId,\n checkExisting: true,\n }),\n { concurrency },\n ),\n Stream.runDrain,\n )\n\n yield* repo.deleteForSyncId(syncId)\n\n yield* Effect.logInfo(\"Finished SemanticSearch index\")\n }).pipe(\n Effect.withSpan(\"SemanticSearch.index\"),\n Effect.withLogSpan(\"SemanticSearch.index\"),\n Effect.provideService(Console.Console, console),\n )\n\n const runIndex = FiberHandle.run(indexHandle, index, {\n onlyIfMissing: true,\n })\n\n const initialIndex = yield* runIndex\n yield* runIndex.pipe(\n Effect.delay(Duration.minutes(3)),\n Effect.forever,\n Effect.forkScoped,\n )\n\n return SemanticSearch.of({\n search: Effect.fn(\"SemanticSearch.search\")(function* (options) {\n yield* Fiber.join(initialIndex)\n yield* Effect.annotateCurrentSpan(options)\n const { vector } = yield* embeddings.embed(options.query)\n const results = yield* repo.search({\n vector: new Float32Array(vector),\n limit: options.limit,\n })\n return results.map((r) => r.content).join(\"\\n\\n\")\n }, Effect.orDie),\n updateFile: Effect.fn(\"SemanticSearch.updateFile\")(function* (path) {\n yield* Fiber.join(initialIndex)\n const indexedPath = resolveIndexedPath(path)\n if (Option.isNone(indexedPath)) {\n return\n }\n\n yield* repo.deleteByPath(indexedPath.value)\n\n const chunks = yield* chunker.chunkFile({\n root,\n path: indexedPath.value,\n ...chunkConfig,\n })\n if (chunks.length === 0) {\n return\n }\n\n const syncId = ChunkRepo.SyncId.make(crypto.randomUUID())\n\n yield* pipe(\n Stream.fromArray(chunks),\n Stream.tap(\n (chunk) =>\n processChunk({\n chunk,\n syncId,\n checkExisting: false,\n }),\n { concurrency },\n ),\n Stream.runDrain,\n )\n }, Effect.orDie),\n removeFile: Effect.fn(\"SemanticSearch.removeFile\")(function* (path) {\n yield* Fiber.join(initialIndex)\n const indexedPath = resolveIndexedPath(path)\n if (Option.isNone(indexedPath)) {\n return\n }\n yield* repo.deleteByPath(indexedPath.value)\n }, Effect.orDie),\n })\n }),\n ).pipe(\n Layer.provide([\n CodeChunker.layer,\n ChunkRepo.layer.pipe(\n Layer.provide(SqliteLayer(options.database ?? \".clanka/search.sqlite\")),\n ),\n ]),\n )\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,12,13,14,15],"mappings":"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"}