@cleocode/core 2026.4.99 → 2026.4.100
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/gc/daemon.js +481 -0
- package/dist/gc/daemon.js.map +7 -0
- package/dist/gc/index.js +669 -0
- package/dist/gc/index.js.map +7 -0
- package/dist/gc/runner.js +360 -0
- package/dist/gc/runner.js.map +7 -0
- package/dist/gc/state.js +49 -0
- package/dist/gc/state.js.map +7 -0
- package/dist/gc/transcript.js +209 -0
- package/dist/gc/transcript.js.map +7 -0
- package/dist/memory/brain-backfill.js +14643 -0
- package/dist/memory/brain-backfill.js.map +7 -0
- package/dist/memory/precompact-flush.js +47725 -0
- package/dist/memory/precompact-flush.js.map +7 -0
- package/dist/sentient/daemon.js +1100 -0
- package/dist/sentient/daemon.js.map +7 -0
- package/dist/sentient/index.js +1162 -0
- package/dist/sentient/index.js.map +7 -0
- package/dist/sentient/propose-tick.js +549 -0
- package/dist/sentient/propose-tick.js.map +7 -0
- package/dist/sentient/state.js +85 -0
- package/dist/sentient/state.js.map +7 -0
- package/dist/sentient/tick.js +396 -0
- package/dist/sentient/tick.js.map +7 -0
- package/dist/system/platform-paths.js +36 -0
- package/dist/system/platform-paths.js.map +7 -0
- package/package.json +8 -8
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/entity.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/column-common.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/column.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/table.utils.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/table.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/subquery.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/tracing-utils.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/tracing.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/view-common.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sql/sql.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sql/expressions/conditions.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sql/expressions/select.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/utils/array.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/foreign-keys.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/common.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/int.common.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/utils.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/bigint.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/bigserial.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/boolean.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/char.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/cidr.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/custom.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/date.common.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/date.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/double-precision.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/inet.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/integer.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/interval.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/json.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/jsonb.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/line.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/macaddr.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/macaddr8.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/numeric.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/point.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/postgis_extension/utils.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/postgis_extension/geometry.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/real.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/serial.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/smallint.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/smallserial.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/text.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/time.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/timestamp.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/uuid.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/varchar.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/vector_extension/bit.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/vector_extension/halfvec.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/vector_extension/sparsevec.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/vector_extension/vector.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/columns/all.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/table.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/pg-core/primary-keys.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/_relations.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/query-promise.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/query-builders/_query.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/query-builders/count.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/alias.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/errors.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/relations.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/query-builders/query.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/query-builders/raw.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/selection-proxy.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/foreign-keys.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/unique-constraint.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/column-builder.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/columns/common.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/columns/blob.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/columns/custom.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/columns/integer.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/columns/numeric.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/columns/real.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/columns/text.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/columns/all.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/table.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/primary-keys.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/indexes.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/utils.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/query-builders/delete.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/view-base.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/query-builders/query-builder.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/query-builders/select.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/migrator.utils.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/casing.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/drizzle-orm/sql/index.js", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/drizzle-orm/sqlite-core/columns/index.js", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/up-migrations/utils.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/up-migrations/sqlite.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/dialect.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/query-builders/query-builder.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/query-builders/insert.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/query-builders/update.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/drizzle-orm/sqlite-core/query-builders/index.js", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/db.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/cache/core/cache.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/sqlite-core/session.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/drizzle-orm/sqlite-core/index.js", "../../src/store/memory-schema.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/logger.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/node-sqlite/session.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/node-sqlite/driver.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/drizzle-orm/node-sqlite/index.js", "../../../contracts/src/acceptance-gate-schema.ts", "../../../contracts/src/attachment-schema.ts", "../../../contracts/src/exit-codes.ts", "../../../contracts/src/errors.ts", "../../../contracts/src/evidence-record-schema.ts", "../../../contracts/src/facade.ts", "../../../contracts/src/lafs.ts", "../../../contracts/src/operations/brain.ts", "../../../contracts/src/operations/conduit.ts", "../../../contracts/src/operations/issues.ts", "../../../contracts/src/operations/lifecycle.ts", "../../../contracts/src/operations/memory.ts", "../../../contracts/src/operations/nexus.ts", "../../../contracts/src/operations/orchestrate.ts", "../../../contracts/src/operations/params.ts", "../../../contracts/src/operations/release.ts", "../../../contracts/src/operations/research.ts", "../../../contracts/src/operations/session.ts", "../../../contracts/src/operations/skills.ts", "../../../contracts/src/operations/system.ts", "../../../contracts/src/operations/tasks.ts", "../../../contracts/src/operations/validate.ts", "../../../contracts/src/operations/index.ts", "../../../contracts/src/orchestration-hierarchy.ts", "../../../contracts/src/session.ts", "../../../contracts/src/status-registry.ts", "../../../contracts/src/task-evidence.ts", "../../../contracts/src/index.ts", "../../src/error-catalog.ts", "../../src/errors.ts", "../../src/system/platform-paths.ts", "../../src/paths.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/migrator.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-beta.22-ec7b61d_@opentelemetry+api@1.9.0_@sinclair+typebox@0.34.49_@t_a07afdeca00339cf8cd15f0f0c1cd4e1/node_modules/src/node-sqlite/migrator.ts", "../../src/logger.ts", "../../src/store/migration-manager.ts", "../../src/store/conduit-sqlite.ts", "../../src/store/global-salt.ts", "../../src/store/nexus-schema.ts", "../../src/store/nexus-sqlite.ts", "../../src/store/signaldock-sqlite.ts", "../../src/store/sqlite-backup.ts", "../../src/store/status-registry.ts", "../../src/agents/agent-schema.ts", "../../src/store/chain-schema.ts", "../../src/store/tasks-schema.ts", "../../src/store/sqlite.ts", "../../src/store/atomic.ts", "../../src/store/backup.ts", "../../src/store/lock.ts", "../../src/hooks/registry.ts", "../../src/store/json.ts", "../../src/config.ts", "../../src/memory/embedding-local.ts", "../../src/memory/brain-embedding.ts", "../../src/store/memory-sqlite.ts", "../../src/memory/brain-backfill.ts", "../../src/store/memory-accessor.ts"],
|
|
4
|
+
"sourcesContent": ["export const entityKind = Symbol.for('drizzle:entityKind');\nexport const hasOwnEntityKind = Symbol.for('drizzle:hasOwnEntityKind');\n\nexport interface DrizzleEntity {\n\t[entityKind]: string;\n}\n\nexport type DrizzleEntityClass<T> =\n\t& ((abstract new(...args: any[]) => T) | (new(...args: any[]) => T))\n\t& DrizzleEntity;\n\nexport function is<T extends DrizzleEntityClass<any>>(value: any, type: T): value is InstanceType<T> {\n\tif (!value || typeof value !== 'object') {\n\t\treturn false;\n\t}\n\n\tif (value instanceof type) { // oxlint-disable-line drizzle-internal/no-instanceof\n\t\treturn true;\n\t}\n\n\tif (!Object.prototype.hasOwnProperty.call(type, entityKind)) {\n\t\tthrow new Error(\n\t\t\t`Class \"${\n\t\t\t\ttype.name ?? '<unknown>'\n\t\t\t}\" doesn't look like a Drizzle entity. If this is incorrect and the class is provided by Drizzle, please report this as a bug.`,\n\t\t);\n\t}\n\n\tlet cls = Object.getPrototypeOf(value)?.constructor;\n\tif (cls) {\n\t\t// Traverse the prototype chain to find the entityKind\n\t\twhile (cls) {\n\t\t\tif (entityKind in cls && cls[entityKind] === type[entityKind]) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tcls = Object.getPrototypeOf(cls);\n\t\t}\n\t}\n\n\treturn false;\n}\n", "export const OriginalColumn = Symbol.for('drizzle:OriginalColumn');\n", "import type {\n\tColumnBuilderRuntimeConfig,\n\tColumnType,\n\tGeneratedColumnConfig,\n\tGeneratedIdentityConfig,\n} from './column-builder.ts';\nimport { OriginalColumn } from './column-common.ts';\nimport { entityKind } from './entity.ts';\nimport type { DriverValueMapper, SQL, SQLWrapper } from './sql/sql.ts';\nimport type { Table } from './table.ts';\nimport type { Update } from './utils.ts';\n\nexport type Columns = Record<string, Column<any>>;\n\nexport interface ColumnBaseConfig<TDataType extends ColumnType> {\n\tname: string;\n\tdataType: TDataType;\n\ttableName: string;\n\tnotNull: boolean;\n\thasDefault: boolean;\n\tisPrimaryKey: boolean;\n\tisAutoincrement: boolean;\n\thasRuntimeDefault: boolean;\n\tdata: unknown;\n\tdriverParam: unknown;\n\tenumValues: string[] | undefined;\n\tgenerated: unknown;\n\tidentity: undefined | 'always' | 'byDefault';\n}\n\nexport interface Column<\n\tout T extends ColumnBaseConfig<ColumnType> = ColumnBaseConfig<ColumnType>,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tout TRuntimeConfig extends object = object,\n> extends DriverValueMapper<T['data'], T['driverParam']>, SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n\t// `as` runtime implementation is defined in 'alias.ts'\n\tas(alias: string): this;\n}\n\n/*\n\t`Column` only accepts a full `ColumnConfig` as its generic.\n\tTo infer parts of the config, use `AnyColumn` that accepts a partial config.\n\tSee `GetColumnData` for example usage of inferring.\n*/\nexport abstract class Column<\n\tout T extends ColumnBaseConfig<ColumnType> = ColumnBaseConfig<ColumnType>,\n\tout TRuntimeConfig extends object = object,\n> implements DriverValueMapper<T['data'], T['driverParam']>, SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Column';\n\n\tdeclare readonly _: T;\n\n\treadonly name: string;\n\treadonly keyAsName: boolean;\n\treadonly primary: boolean;\n\treadonly notNull: boolean;\n\treadonly default: T['data'] | SQL | undefined;\n\treadonly defaultFn: (() => T['data'] | SQL) | undefined;\n\treadonly onUpdateFn: (() => T['data'] | SQL) | undefined;\n\treadonly hasDefault: boolean;\n\treadonly isUnique: boolean;\n\treadonly uniqueName: string | undefined;\n\treadonly uniqueType: string | undefined;\n\treadonly dataType: T['dataType'];\n\treadonly columnType: string;\n\treadonly enumValues: T['enumValues'] = undefined;\n\treadonly generated: GeneratedColumnConfig<T['data']> | undefined = undefined;\n\treadonly generatedIdentity: GeneratedIdentityConfig | undefined = undefined;\n\treadonly length: number | undefined;\n\treadonly isLengthExact: boolean | undefined;\n\treadonly isAlias: boolean;\n\n\t/** @internal */\n\tprotected config: ColumnBuilderRuntimeConfig<T['data']> & TRuntimeConfig;\n\n\t/** @internal */\n\treadonly table: Table;\n\n\t/** @internal */\n\tprotected onInit(): void {}\n\n\tconstructor(\n\t\ttable: Table,\n\t\tconfig: ColumnBuilderRuntimeConfig<T['data']> & TRuntimeConfig,\n\t) {\n\t\tthis.config = config;\n\t\tthis.onInit();\n\t\tthis.table = table;\n\n\t\tthis.name = config.name;\n\t\tthis.isAlias = false;\n\t\tthis.keyAsName = config.keyAsName;\n\t\tthis.notNull = config.notNull;\n\t\tthis.default = config.default;\n\t\tthis.defaultFn = config.defaultFn;\n\t\tthis.onUpdateFn = config.onUpdateFn;\n\t\tthis.hasDefault = config.hasDefault;\n\t\tthis.primary = config.primaryKey;\n\t\tthis.isUnique = config.isUnique;\n\t\tthis.uniqueName = config.uniqueName;\n\t\tthis.uniqueType = config.uniqueType;\n\t\tthis.dataType = config.dataType as T['dataType'];\n\t\tthis.columnType = config.columnType;\n\t\tthis.generated = config.generated;\n\t\tthis.generatedIdentity = config.generatedIdentity;\n\t\tthis.length = (<{ length?: number }> config)['length'];\n\t\tthis.isLengthExact = (<{ isLengthExact?: boolean }> config)['isLengthExact'];\n\t}\n\n\tabstract getSQLType(): string;\n\n\tmapFromDriverValue(value: unknown): unknown {\n\t\treturn value;\n\t}\n\n\tmapToDriverValue(value: unknown): unknown {\n\t\treturn value;\n\t}\n\n\t// ** @internal */\n\tshouldDisableInsert(): boolean {\n\t\treturn this.config.generated !== undefined && this.config.generated.type !== 'byDefault';\n\t}\n\n\t/** @internal */\n\t[OriginalColumn](): this {\n\t\treturn this;\n\t}\n}\n\nexport type UpdateColConfig<\n\tT extends ColumnBaseConfig<ColumnType>,\n\tTUpdate extends Partial<ColumnBaseConfig<ColumnType>>,\n> = Update<T, TUpdate>;\n\nexport type AnyColumn<TPartial extends Partial<ColumnBaseConfig<ColumnType>> = {}> = Column<\n\tRequired<Update<ColumnBaseConfig<ColumnType>, TPartial>>\n>;\n\nexport type GetColumnData<TColumn extends Column, TInferMode extends 'query' | 'raw' = 'query'> =\n\t// dprint-ignore\n\tTInferMode extends 'raw' // Raw mode\n\t\t? TColumn['_']['data'] // Just return the underlying type\n\t\t: TColumn['_']['notNull'] extends true // Query mode\n\t\t? TColumn['_']['data'] // Query mode, not null\n\t\t: TColumn['_']['data'] | null; // Query mode, nullable\n\nexport type InferColumnsDataTypes<TColumns extends Record<string, Column>> = {\n\t[Key in keyof TColumns]: GetColumnData<TColumns[Key], 'query'>;\n};\n\nexport function getColumnTable<TTable extends Table<any> = Table<any>>(column: Column<any>): TTable {\n\treturn column.table as TTable;\n}\n", "/** @internal */\nexport const TableName = Symbol.for('drizzle:Name');\n", "import type { Column, Columns, GetColumnData } from './column.ts';\nimport { entityKind } from './entity.ts';\nimport type { OptionalKeyOnly, RequiredKeyOnly } from './operations.ts';\nimport type { View } from './sql/sql.ts';\nimport { TableName } from './table.utils.ts';\nimport type { Simplify, Update } from './utils.ts';\n\nexport interface TableConfig<TColumns extends Columns = Columns> {\n\tname: string;\n\tschema: string | undefined;\n\tcolumns: TColumns;\n\tdialect: string;\n}\n\nexport type UpdateTableConfig<T extends TableConfig, TUpdate extends Partial<TableConfig>> = Required<\n\tUpdate<T, TUpdate>\n>;\n\n/** @internal */\nexport const TableSchema = Symbol.for('drizzle:Schema');\n\n/** @internal */\nexport const TableColumns = Symbol.for('drizzle:Columns');\n\n/** @internal */\nexport const ExtraConfigColumns = Symbol.for('drizzle:ExtraConfigColumns');\n\n/** @internal */\nexport const OriginalName = Symbol.for('drizzle:OriginalName');\n\n/** @internal */\nexport const BaseName = Symbol.for('drizzle:BaseName');\n\n/** @internal */\nexport const IsAlias = Symbol.for('drizzle:IsAlias');\n\n/** @internal */\nexport const ExtraConfigBuilder = Symbol.for('drizzle:ExtraConfigBuilder');\n\nconst IsDrizzleTable = Symbol.for('drizzle:IsDrizzleTable');\n\nexport interface TableTypeConfig<T extends TableConfig> {\n\treadonly brand: 'Table';\n\treadonly name: T['name'];\n\treadonly schema: T['schema'];\n\treadonly columns: T['columns'];\n\treadonly dialect: T['dialect'];\n}\n\nexport class Table<out T extends TableConfig = TableConfig> {\n\tstatic readonly [entityKind]: string = 'Table';\n\n\tdeclare readonly _: TableTypeConfig<T>;\n\n\t/** @internal */\n\tstatic readonly Symbol = {\n\t\tName: TableName as typeof TableName,\n\t\tSchema: TableSchema as typeof TableSchema,\n\t\tOriginalName: OriginalName as typeof OriginalName,\n\t\tColumns: TableColumns as typeof TableColumns,\n\t\tExtraConfigColumns: ExtraConfigColumns as typeof ExtraConfigColumns,\n\t\tBaseName: BaseName as typeof BaseName,\n\t\tIsAlias: IsAlias as typeof IsAlias,\n\t\tExtraConfigBuilder: ExtraConfigBuilder as typeof ExtraConfigBuilder,\n\t};\n\n\t/**\n\t * @internal\n\t * Can be changed if the table is aliased.\n\t */\n\t[TableName]: string;\n\n\t/**\n\t * @internal\n\t * Used to store the original name of the table, before any aliasing.\n\t */\n\t[OriginalName]: string;\n\n\t/** @internal */\n\t[TableSchema]: string | undefined;\n\n\t/** @internal */\n\t[TableColumns]!: T['columns'];\n\n\t/** @internal */\n\t[ExtraConfigColumns]!: Record<string, unknown>;\n\n\t/**\n\t * @internal\n\t * Used to store the table name before the transformation via the `tableCreator` functions.\n\t */\n\t[BaseName]: string;\n\n\t/** @internal */\n\t[IsAlias] = false;\n\n\t/** @internal */\n\t[IsDrizzleTable] = true;\n\n\t/** @internal */\n\t[ExtraConfigBuilder]: ((self: any) => Record<string, unknown> | unknown[]) | undefined = undefined;\n\n\tconstructor(name: string, schema: string | undefined, baseName: string) {\n\t\tthis[TableName] = this[OriginalName] = name;\n\t\tthis[TableSchema] = schema;\n\t\tthis[BaseName] = baseName;\n\t}\n}\n\nexport function isTable(table: unknown): table is Table {\n\treturn typeof table === 'object' && table !== null && IsDrizzleTable in table;\n}\n\n/**\n * Any table with a specified boundary.\n *\n * @example\n\t```ts\n\t// Any table with a specific name\n\ttype AnyUsersTable = AnyTable<{ name: 'users' }>;\n\t```\n *\n * To describe any table with any config, simply use `Table` without any type arguments, like this:\n *\n\t```ts\n\tfunction needsTable(table: Table) {\n\t\t...\n\t}\n\t```\n */\nexport type AnyTable<TPartial extends Partial<TableConfig>> = Table<UpdateTableConfig<TableConfig, TPartial>>;\n\nexport function getTableName<T extends Table>(table: T): T['_']['name'] {\n\treturn table[TableName];\n}\n\nexport function getTableUniqueName<\n\tT extends Table | View,\n\tTResult extends string = T extends Table ? T['_']['schema'] extends undefined ? `public.${T['_']['name']}`\n\t\t: `${T['_']['schema']}.${T['_']['name']}`\n\t\t// Views don't have type-level schema names, to be added\n\t\t: `${string}.${T['_']['name']}`,\n>(\n\ttable: T,\n): TResult {\n\treturn `${table[TableSchema] ?? 'public'}.${table[TableName]}` as TResult;\n}\n\nexport type MapColumnName<TName extends string, TColumn extends Column, TDBColumNames extends boolean> =\n\tTDBColumNames extends true ? TColumn['_']['name']\n\t\t: TName;\n\nexport type InferModelFromColumns<\n\tTColumns extends Columns,\n\tTInferMode extends 'select' | 'insert' = 'select',\n\tTConfig extends { override?: boolean } = { dbColumnNames: false; override: false },\n> = Simplify<\n\tTInferMode extends 'insert' ?\n\t\t\t& {\n\t\t\t\t[\n\t\t\t\t\tKey in keyof TColumns & string as RequiredKeyOnly<\n\t\t\t\t\t\tKey,\n\t\t\t\t\t\tTColumns[Key]\n\t\t\t\t\t>\n\t\t\t\t]: GetColumnData<TColumns[Key], 'query'>;\n\t\t\t}\n\t\t\t& {\n\t\t\t\t[\n\t\t\t\t\tKey in keyof TColumns & string as OptionalKeyOnly<\n\t\t\t\t\t\tKey,\n\t\t\t\t\t\tTColumns[Key],\n\t\t\t\t\t\tTConfig['override']\n\t\t\t\t\t>\n\t\t\t\t]?: GetColumnData<TColumns[Key], 'query'> | undefined;\n\t\t\t}\n\t\t: {\n\t\t\t[\n\t\t\t\tKey in keyof TColumns & string\n\t\t\t]: GetColumnData<TColumns[Key], 'query'>;\n\t\t}\n>;\n\n/** @deprecated Use one of the alternatives: {@link InferSelectModel} / {@link InferInsertModel}, or `table.$inferSelect` / `table.$inferInsert`\n */\nexport type InferModel<\n\tTTable extends Table,\n\tTInferMode extends 'select' | 'insert' = 'select',\n> = InferModelFromColumns<TTable['_']['columns'], TInferMode>;\n\nexport type InferSelectModel<\n\tTTable extends Table,\n> = InferModelFromColumns<TTable['_']['columns'], 'select'>;\n\nexport type InferInsertModel<\n\tTTable extends Table,\n\tTOverride extends { override?: boolean } = { override: false },\n> = InferModelFromColumns<TTable['_']['columns'], 'insert', TOverride>;\n\nexport type InferEnum<T> = T extends { enumValues: readonly (infer U)[] } ? U\n\t: never;\n\nexport interface InferTableColumnsModels<TColumns extends Columns> {\n\treadonly $inferSelect: InferModelFromColumns<TColumns, 'select'>;\n\treadonly $inferInsert: InferModelFromColumns<TColumns, 'insert', { override: false }>;\n}\n", "import { entityKind } from './entity.ts';\nimport type { SQL, SQLWrapper } from './sql/sql.ts';\n\nexport interface Subquery<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTAlias extends string = string,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTSelectedFields extends Record<string, unknown> = Record<string, unknown>,\n> extends SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n}\nexport class Subquery<\n\tTAlias extends string = string,\n\tTSelectedFields extends Record<string, unknown> = Record<string, unknown>,\n> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Subquery';\n\n\tdeclare _: {\n\t\tbrand: 'Subquery';\n\t\tsql: SQL;\n\t\tselectedFields: TSelectedFields;\n\t\talias: TAlias;\n\t\tisWith: boolean;\n\t\tusedTables?: string[];\n\t};\n\n\tconstructor(sql: SQL, fields: TSelectedFields, alias: string, isWith = false, usedTables: string[] = []) {\n\t\tthis._ = {\n\t\t\tbrand: 'Subquery',\n\t\t\tsql,\n\t\t\tselectedFields: fields as TSelectedFields,\n\t\t\talias: alias as TAlias,\n\t\t\tisWith,\n\t\t\tusedTables,\n\t\t};\n\t}\n\n\t// getSQL(): SQL<unknown> {\n\t// \treturn new SQL([this]);\n\t// }\n}\n\nexport class WithSubquery<\n\tTAlias extends string = string,\n\tTSelection extends Record<string, unknown> = Record<string, unknown>,\n> extends Subquery<TAlias, TSelection> {\n\tstatic override readonly [entityKind]: string = 'WithSubquery';\n}\n\nexport type WithSubqueryWithoutSelection<TAlias extends string> = WithSubquery<TAlias, {}>;\n", "export function iife<T extends unknown[], U>(fn: (...args: T) => U, ...args: T): U {\n\treturn fn(...args);\n}\n", "import type { Span, Tracer } from '@opentelemetry/api';\nimport { iife } from '~/tracing-utils.ts';\nimport { npmVersion } from '~/version.ts';\n\nlet otel: typeof import('@opentelemetry/api') | undefined; // oxlint-disable-line\nlet rawTracer: Tracer | undefined;\n// try {\n// \totel = await import('@opentelemetry/api');\n// } catch (err: any) {\n// \tif (err.code !== 'MODULE_NOT_FOUND' && err.code !== 'ERR_MODULE_NOT_FOUND') {\n// \t\tthrow err;\n// \t}\n// }\n\ntype SpanName =\n\t| 'drizzle.operation'\n\t| 'drizzle.prepareQuery'\n\t| 'drizzle.buildSQL'\n\t| 'drizzle.execute'\n\t| 'drizzle.driver.execute'\n\t| 'drizzle.mapResponse';\n\n/** @internal */\nexport const tracer = {\n\tstartActiveSpan<F extends (span?: Span) => unknown>(name: SpanName, fn: F): ReturnType<F> {\n\t\tif (!otel) {\n\t\t\treturn fn() as ReturnType<F>;\n\t\t}\n\n\t\tif (!rawTracer) {\n\t\t\trawTracer = otel.trace.getTracer('drizzle-orm', npmVersion);\n\t\t}\n\n\t\treturn iife(\n\t\t\t(otel, rawTracer) =>\n\t\t\t\trawTracer.startActiveSpan(\n\t\t\t\t\tname,\n\t\t\t\t\t((span: Span) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\treturn fn(span);\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tspan.setStatus({\n\t\t\t\t\t\t\t\tcode: otel.SpanStatusCode.ERROR,\n\t\t\t\t\t\t\t\tmessage: e instanceof Error ? e.message : 'Unknown error', // oxlint-disable-line drizzle-internal/no-instanceof\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tspan.end();\n\t\t\t\t\t\t}\n\t\t\t\t\t}) as F,\n\t\t\t\t),\n\t\t\totel,\n\t\t\trawTracer,\n\t\t);\n\t},\n};\n", "export const ViewBaseConfig = Symbol.for('drizzle:ViewBaseConfig');\n", "import type { CasingCache } from '~/casing.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { SelectResult } from '~/query-builders/select.types.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { TableName } from '~/table.utils.ts';\nimport { tracer } from '~/tracing.ts';\nimport type { Assume, Equal } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { AnyColumn } from '../column.ts';\nimport { Column } from '../column.ts';\nimport { IsAlias, OriginalName, Table, TableColumns, TableSchema } from '../table.ts';\n\n/**\n * This class is used to indicate a primitive param value that is used in `sql` tag.\n * It is only used on type level and is never instantiated at runtime.\n * If you see a value of this type in the code, its runtime value is actually the primitive param value.\n */\nexport class FakePrimitiveParam {\n\tstatic readonly [entityKind]: string = 'FakePrimitiveParam';\n}\n\nexport type Chunk =\n\t| string\n\t| Table\n\t| View\n\t| AnyColumn\n\t| Name\n\t| Param\n\t| Placeholder\n\t| SQL;\n\nexport interface BuildQueryConfig {\n\tcasing: CasingCache;\n\tescapeName(name: string): string;\n\tescapeParam(num: number, value: unknown): string;\n\tescapeString(str: string): string;\n\tprepareTyping?: (encoder: DriverValueEncoder<unknown, unknown>) => QueryTypingsValue;\n\tparamStartIndex?: { value: number };\n\tinlineParams?: boolean;\n\tinvokeSource?: 'indexes' | 'mssql-check' | 'mssql-view-with-schemabinding' | undefined;\n}\n\nexport type QueryTypingsValue = 'json' | 'decimal' | 'time' | 'timestamp' | 'uuid' | 'date' | 'none';\n\nexport interface Query {\n\tsql: string;\n\tparams: unknown[];\n}\n\nexport interface QueryWithTypings extends Query {\n\ttypings?: QueryTypingsValue[];\n}\n\n/**\n * Any value that implements the `getSQL` method. The implementations include:\n * - `Table`\n * - `Column`\n * - `View`\n * - `Subquery`\n * - `SQL`\n * - `SQL.Aliased`\n * - `Placeholder`\n * - `Param`\n */\nexport interface SQLWrapper<T = unknown> {\n\tgetSQL(): SQL<T>;\n\tshouldOmitSQLParens?(): boolean;\n}\n\nexport function isSQLWrapper(value: unknown): value is SQLWrapper {\n\treturn value !== null && value !== undefined && typeof (value as any).getSQL === 'function';\n}\n\nfunction mergeQueries(queries: QueryWithTypings[]): QueryWithTypings {\n\tconst result: QueryWithTypings = { sql: '', params: [] };\n\tfor (const query of queries) {\n\t\tresult.sql += query.sql;\n\t\tresult.params.push(...query.params);\n\t\tif (query.typings?.length) {\n\t\t\tif (!result.typings) {\n\t\t\t\tresult.typings = [];\n\t\t\t}\n\t\t\tresult.typings.push(...query.typings);\n\t\t}\n\t}\n\treturn result;\n}\n\nexport class StringChunk implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'StringChunk';\n\n\treadonly value: string[];\n\n\tconstructor(value: string | string[]) {\n\t\tthis.value = Array.isArray(value) ? value : [value];\n\t}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\nexport class SQL<T = unknown> implements SQLWrapper<T> {\n\tstatic readonly [entityKind]: string = 'SQL';\n\n\tdeclare _: {\n\t\tbrand: 'SQL';\n\t\ttype: T;\n\t};\n\n\t/** @internal */\n\tdecoder: DriverValueDecoder<T, any> = noopDecoder;\n\t/** @internal */\n\tpublic shouldInlineParams = false;\n\n\t/** @internal */\n\tusedTables: string[] = [];\n\n\tconstructor(readonly queryChunks: SQLChunk[]) {\n\t\tfor (const chunk of queryChunks) {\n\t\t\tif (is(chunk, Table)) {\n\t\t\t\tconst schemaName = chunk[Table.Symbol.Schema];\n\n\t\t\t\tthis.usedTables.push(\n\t\t\t\t\tschemaName === undefined\n\t\t\t\t\t\t? chunk[Table.Symbol.Name]\n\t\t\t\t\t\t: schemaName + '.' + chunk[Table.Symbol.Name],\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tappend(query: SQL): this {\n\t\tthis.queryChunks.push(...query.queryChunks);\n\t\treturn this;\n\t}\n\n\ttoQuery(config: BuildQueryConfig): QueryWithTypings {\n\t\treturn tracer.startActiveSpan('drizzle.buildSQL', (span) => {\n\t\t\tconst query = this.buildQueryFromSourceParams(this.queryChunks, config);\n\t\t\tspan?.setAttributes({\n\t\t\t\t'drizzle.query.text': query.sql,\n\t\t\t\t'drizzle.query.params': JSON.stringify(query.params),\n\t\t\t});\n\t\t\treturn query;\n\t\t});\n\t}\n\n\tbuildQueryFromSourceParams(chunks: SQLChunk[], _config: BuildQueryConfig): Query {\n\t\tconst config = Object.assign({}, _config, {\n\t\t\tinlineParams: _config.inlineParams || this.shouldInlineParams,\n\t\t\tparamStartIndex: _config.paramStartIndex || { value: 0 },\n\t\t});\n\n\t\tconst {\n\t\t\tcasing,\n\t\t\tescapeName,\n\t\t\tescapeParam,\n\t\t\tprepareTyping,\n\t\t\tinlineParams,\n\t\t\tparamStartIndex,\n\t\t\tinvokeSource,\n\t\t} = config;\n\n\t\treturn mergeQueries(chunks.map((chunk): QueryWithTypings => {\n\t\t\tif (is(chunk, StringChunk)) {\n\t\t\t\treturn { sql: chunk.value.join(''), params: [] };\n\t\t\t}\n\n\t\t\tif (is(chunk, Name)) {\n\t\t\t\treturn { sql: escapeName(chunk.value), params: [] };\n\t\t\t}\n\n\t\t\tif (chunk === undefined) {\n\t\t\t\treturn { sql: '', params: [] };\n\t\t\t}\n\n\t\t\tif (Array.isArray(chunk)) {\n\t\t\t\tconst result: SQLChunk[] = [new StringChunk('(')];\n\t\t\t\tfor (const [i, p] of chunk.entries()) {\n\t\t\t\t\tresult.push(p);\n\t\t\t\t\tif (i < chunk.length - 1) {\n\t\t\t\t\t\tresult.push(new StringChunk(', '));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tresult.push(new StringChunk(')'));\n\t\t\t\treturn this.buildQueryFromSourceParams(result, config);\n\t\t\t}\n\n\t\t\tif (is(chunk, SQL)) {\n\t\t\t\treturn this.buildQueryFromSourceParams(chunk.queryChunks, {\n\t\t\t\t\t...config,\n\t\t\t\t\tinlineParams: inlineParams || chunk.shouldInlineParams,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (is(chunk, Table)) {\n\t\t\t\tconst schemaName = chunk[Table.Symbol.Schema];\n\t\t\t\tconst tableName = chunk[Table.Symbol.Name];\n\n\t\t\t\tif (invokeSource === 'mssql-view-with-schemabinding') {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsql: (schemaName === undefined ? escapeName('dbo') : escapeName(schemaName)) + '.'\n\t\t\t\t\t\t\t+ escapeName(tableName),\n\t\t\t\t\t\tparams: [],\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tsql: schemaName === undefined || chunk[IsAlias]\n\t\t\t\t\t\t? escapeName(tableName)\n\t\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(tableName),\n\t\t\t\t\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, Column)) {\n\t\t\t\tconst columnName = casing.getColumnCasing(chunk);\n\t\t\t\tif (_config.invokeSource === 'indexes') {\n\t\t\t\t\treturn { sql: escapeName(columnName), params: [] };\n\t\t\t\t}\n\n\t\t\t\tconst schemaName = invokeSource === 'mssql-check' ? undefined : chunk.table[Table.Symbol.Schema];\n\t\t\t\treturn {\n\t\t\t\t\tsql: chunk.isAlias ? escapeName(chunk.name) : chunk.table[IsAlias] || schemaName === undefined\n\t\t\t\t\t\t? escapeName(chunk.table[Table.Symbol.Name]) + '.' + escapeName(columnName)\n\t\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(chunk.table[Table.Symbol.Name]) + '.'\n\t\t\t\t\t\t\t+ escapeName(columnName),\n\t\t\t\t\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, View)) {\n\t\t\t\tconst schemaName = chunk[ViewBaseConfig].schema;\n\t\t\t\tconst viewName = chunk[ViewBaseConfig].name;\n\t\t\t\treturn {\n\t\t\t\t\tsql: schemaName === undefined || chunk[ViewBaseConfig].isAlias\n\t\t\t\t\t\t? escapeName(viewName)\n\t\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(viewName),\n\t\t\t\t\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, Param)) {\n\t\t\t\tif (is(chunk.value, Placeholder)) {\n\t\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\n\t\t\t\t}\n\n\t\t\t\tconst mappedValue = chunk.value === null ? null : chunk.encoder.mapToDriverValue(chunk.value);\n\n\t\t\t\tif (is(mappedValue, SQL)) {\n\t\t\t\t\treturn this.buildQueryFromSourceParams([mappedValue], config);\n\t\t\t\t}\n\n\t\t\t\tif (inlineParams) {\n\t\t\t\t\treturn { sql: this.mapInlineParam(mappedValue, config), params: [] };\n\t\t\t\t}\n\n\t\t\t\tlet typings: QueryTypingsValue[] = ['none'];\n\t\t\t\tif (prepareTyping) {\n\t\t\t\t\ttypings = [prepareTyping(chunk.encoder)];\n\t\t\t\t}\n\n\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, mappedValue), params: [mappedValue], typings };\n\t\t\t}\n\n\t\t\tif (is(chunk, Placeholder)) {\n\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\n\t\t\t}\n\n\t\t\tif (is(chunk, SQL.Aliased) && chunk.fieldAlias !== undefined) {\n\t\t\t\treturn {\n\t\t\t\t\tsql: (chunk.origin !== undefined ? escapeName(chunk.origin) + '.' : '') + escapeName(chunk.fieldAlias),\n\t\t\t\t\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, Subquery)) {\n\t\t\t\tif (chunk._.isWith) {\n\t\t\t\t\treturn { sql: escapeName(chunk._.alias), params: [] };\n\t\t\t\t}\n\t\t\t\treturn this.buildQueryFromSourceParams([\n\t\t\t\t\tnew StringChunk('('),\n\t\t\t\t\tchunk._.sql,\n\t\t\t\t\tnew StringChunk(') '),\n\t\t\t\t\tnew Name(chunk._.alias),\n\t\t\t\t], config);\n\t\t\t}\n\n\t\t\tif (typeof chunk === 'function' && 'enumName' in chunk) {\n\t\t\t\tif ('schema' in chunk && chunk.schema) {\n\t\t\t\t\treturn { sql: escapeName(chunk.schema as string) + '.' + escapeName(chunk.enumName as string), params: [] };\n\t\t\t\t}\n\t\t\t\treturn { sql: escapeName(chunk.enumName as string), params: [] };\n\t\t\t}\n\n\t\t\tif (isSQLWrapper(chunk)) {\n\t\t\t\tif (chunk.shouldOmitSQLParens?.()) {\n\t\t\t\t\treturn this.buildQueryFromSourceParams([chunk.getSQL()], config);\n\t\t\t\t}\n\t\t\t\treturn this.buildQueryFromSourceParams([\n\t\t\t\t\tnew StringChunk('('),\n\t\t\t\t\tchunk.getSQL(),\n\t\t\t\t\tnew StringChunk(')'),\n\t\t\t\t], config);\n\t\t\t}\n\n\t\t\tif (inlineParams) {\n\t\t\t\treturn { sql: this.mapInlineParam(chunk, config), params: [] };\n\t\t\t}\n\n\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\n\t\t}));\n\t}\n\n\tprivate mapInlineParam(\n\t\tchunk: unknown,\n\t\t{ escapeString }: BuildQueryConfig,\n\t): string {\n\t\tif (chunk === null) {\n\t\t\treturn 'null';\n\t\t}\n\t\tif (typeof chunk === 'number' || typeof chunk === 'boolean' || typeof chunk === 'bigint') {\n\t\t\treturn chunk.toString();\n\t\t}\n\t\tif (typeof chunk === 'string') {\n\t\t\treturn escapeString(chunk);\n\t\t}\n\t\tif (typeof chunk === 'object') {\n\t\t\tconst mappedValueAsString = chunk.toString();\n\t\t\tif (mappedValueAsString === '[object Object]') {\n\t\t\t\treturn escapeString(JSON.stringify(chunk));\n\t\t\t}\n\t\t\treturn escapeString(mappedValueAsString);\n\t\t}\n\t\tthrow new Error('Unexpected param value: ' + chunk);\n\t}\n\n\tgetSQL(): SQL<T> {\n\t\treturn this;\n\t}\n\n\tas(alias: string): SQL.Aliased<T>;\n\t/**\n\t * @deprecated\n\t * Use ``sql<DataType>`query`.as(alias)`` instead.\n\t */\n\tas<TData>(): SQL<TData>;\n\t/**\n\t * @deprecated\n\t * Use ``sql<DataType>`query`.as(alias)`` instead.\n\t */\n\tas<TData>(alias: string): SQL.Aliased<TData>;\n\tas(alias?: string): SQL<T> | SQL.Aliased<T> {\n\t\t// TODO: remove with deprecated overloads\n\t\tif (alias === undefined) {\n\t\t\treturn this;\n\t\t}\n\n\t\treturn new SQL.Aliased(this, alias);\n\t}\n\n\tmapWith<\n\t\tTDecoder extends\n\t\t\t| DriverValueDecoder<any, any>\n\t\t\t| DriverValueDecoder<any, any>['mapFromDriverValue'],\n\t>(decoder: TDecoder): SQL<GetDecoderResult<TDecoder>> {\n\t\tthis.decoder = typeof decoder === 'function' ? { mapFromDriverValue: decoder } : decoder;\n\t\treturn this as SQL<GetDecoderResult<TDecoder>>;\n\t}\n\n\tinlineParams(): this {\n\t\tthis.shouldInlineParams = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * This method is used to conditionally include a part of the query.\n\t *\n\t * @param condition - Condition to check\n\t * @returns itself if the condition is `true`, otherwise `undefined`\n\t */\n\tif(condition: any | undefined): this | undefined {\n\t\treturn condition ? this : undefined;\n\t}\n}\n\nexport type GetDecoderResult<T> = T extends Column ? T['_']['data'] : T extends\n\t| DriverValueDecoder<infer TData, any>\n\t| DriverValueDecoder<infer TData, any>['mapFromDriverValue'] ? TData\n: never;\n\n/**\n * Any DB name (table, column, index etc.)\n */\nexport class Name implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Name';\n\n\tprotected brand!: 'Name';\n\n\tconstructor(readonly value: string) {}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/**\n * Any DB name (table, column, index etc.)\n * @deprecated Use `sql.identifier` instead.\n */\nexport function name(value: string): Name {\n\treturn new Name(value);\n}\n\nexport interface DriverValueDecoder<TData, TDriverParam> {\n\tmapFromDriverValue(value: TDriverParam): TData;\n}\n\nexport interface DriverValueEncoder<TData, TDriverParam> {\n\tmapToDriverValue(value: TData): TDriverParam | SQL;\n}\n\nexport function isDriverValueEncoder(value: unknown): value is DriverValueEncoder<any, any> {\n\treturn typeof value === 'object' && value !== null && 'mapToDriverValue' in value\n\t\t&& typeof (value as any).mapToDriverValue === 'function';\n}\n\nexport const noopDecoder: DriverValueDecoder<any, any> = {\n\tmapFromDriverValue: (value) => value,\n};\n\nexport const noopEncoder: DriverValueEncoder<any, any> = {\n\tmapToDriverValue: (value) => value,\n};\n\nexport interface DriverValueMapper<TData, TDriverParam>\n\textends DriverValueDecoder<TData, TDriverParam>, DriverValueEncoder<TData, TDriverParam>\n{}\n\nexport const noopMapper: DriverValueMapper<any, any> = {\n\t...noopDecoder,\n\t...noopEncoder,\n};\n\n/** Parameter value that is optionally bound to an encoder (for example, a column). */\nexport class Param<TDataType = unknown, TDriverParamType = TDataType> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Param';\n\n\tprotected brand!: 'BoundParamValue';\n\n\t/**\n\t * @param value - Parameter value\n\t * @param encoder - Encoder to convert the value to a driver parameter\n\t */\n\tconstructor(\n\t\treadonly value: TDataType,\n\t\treadonly encoder: DriverValueEncoder<TDataType, TDriverParamType> = noopEncoder,\n\t) {}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/** @deprecated Use `sql.param` instead. */\nexport function param<TData, TDriver>(\n\tvalue: TData,\n\tencoder?: DriverValueEncoder<TData, TDriver>,\n): Param<TData, TDriver> {\n\treturn new Param(value, encoder);\n}\n\n/**\n * Anything that can be passed to the `` sql`...` `` tagged function.\n */\nexport type SQLChunk =\n\t| StringChunk\n\t| SQLChunk[]\n\t| SQLWrapper\n\t| SQL\n\t| Table\n\t| View\n\t| Subquery\n\t| AnyColumn\n\t| Param\n\t| Name\n\t| undefined\n\t| FakePrimitiveParam\n\t| Placeholder;\n\nexport type SQLGenerator<T = unknown> = typeof sql<T>;\n\nexport function sql<T>(strings: TemplateStringsArray, ...params: any[]): SQL<T>;\n/*\n\tThe type of `params` is specified as `SQLChunk[]`, but that's slightly incorrect -\n\tin runtime, users won't pass `FakePrimitiveParam` instances as `params` - they will pass primitive values\n\twhich will be wrapped in `Param`. That's why the overload specifies `params` as `any[]` and not as `SQLSourceParam[]`.\n\tThis type is used to make our lives easier and the type checker happy.\n*/\nexport function sql(strings: TemplateStringsArray, ...params: SQLChunk[]): SQL {\n\tconst queryChunks: SQLChunk[] = [];\n\tif (params.length > 0 || (strings.length > 0 && strings[0] !== '')) {\n\t\tqueryChunks.push(new StringChunk(strings[0]!));\n\t}\n\tfor (const [paramIndex, param] of params.entries()) {\n\t\tqueryChunks.push(param, new StringChunk(strings[paramIndex + 1]!));\n\t}\n\n\treturn new SQL(queryChunks);\n}\n\nexport namespace sql {\n\texport function empty(): SQL {\n\t\treturn new SQL([]);\n\t}\n\n\t/** @deprecated - use `sql.join()` */\n\texport function fromList(list: SQLChunk[]): SQL {\n\t\treturn new SQL(list);\n\t}\n\n\t/**\n\t * Convenience function to create an SQL query from a raw string.\n\t * @param str The raw SQL query string.\n\t */\n\texport function raw(str: string): SQL {\n\t\treturn new SQL([new StringChunk(str)]);\n\t}\n\n\t/**\n\t * Join a list of SQL chunks with a separator.\n\t * @example\n\t * ```ts\n\t * const query = sql.join([sql`a`, sql`b`, sql`c`]);\n\t * // sql`abc`\n\t * ```\n\t * @example\n\t * ```ts\n\t * const query = sql.join([sql`a`, sql`b`, sql`c`], sql`, `);\n\t * // sql`a, b, c`\n\t * ```\n\t */\n\texport function join(chunks: SQLChunk[], separator?: SQLChunk): SQL {\n\t\tconst result: SQLChunk[] = [];\n\t\tfor (const [i, chunk] of chunks.entries()) {\n\t\t\tif (i > 0 && separator !== undefined) {\n\t\t\t\tresult.push(separator);\n\t\t\t}\n\t\t\tresult.push(chunk);\n\t\t}\n\t\treturn new SQL(result);\n\t}\n\n\t/**\n\t * Create a SQL chunk that represents a DB identifier (table, column, index etc.).\n\t * When used in a query, the identifier will be escaped based on the DB engine.\n\t * For example, in PostgreSQL, identifiers are escaped with double quotes.\n\t *\n\t * **WARNING: This function does not offer any protection against SQL injections, so you must validate any user input beforehand.**\n\t *\n\t * @example ```ts\n\t * const query = sql`SELECT * FROM ${sql.identifier('my-table')}`;\n\t * // 'SELECT * FROM \"my-table\"'\n\t * ```\n\t */\n\texport function identifier(value: string): Name {\n\t\treturn new Name(value);\n\t}\n\n\texport function placeholder<TName extends string>(name: TName): Placeholder<TName> {\n\t\treturn new Placeholder(name);\n\t}\n\n\texport function param<TData, TDriver>(\n\t\tvalue: TData,\n\t\tencoder?: DriverValueEncoder<TData, TDriver>,\n\t): Param<TData, TDriver> {\n\t\treturn new Param(value, encoder);\n\t}\n\n\t/**\n\t * Attach [sqlcommenter](https://google.github.io/sqlcommenter) comment to a query\n\t */\n\texport function comment(input: CommentInput): SQL | undefined {\n\t\tconst encoded = sqlCommenter(input);\n\t\tif (!encoded.length) return undefined;\n\n\t\treturn sql.raw(encoded);\n\t}\n}\n\nexport function sqlCommenter(input: CommentInput): string {\n\tconst encoded = sqlCommenter.encodeInput(input);\n\tif (!encoded.length) return '';\n\n\treturn `/*${encoded}*/`;\n}\n\nexport namespace sqlCommenter {\n\texport function merge(input1: CommentInput | undefined, input2: CommentInput | undefined) {\n\t\tlet encoded: CommentInput;\n\t\tif (typeof input1 === 'object' && typeof input2 === 'object') {\n\t\t\tencoded = encodeInput({ ...input1, ...input2 });\n\t\t} else if (input1 && input2) {\n\t\t\tencoded = [encodeInput(input1), encodeInput(input2)].filter((i) => i.length).join(',');\n\t\t} else if (input2) {\n\t\t\tencoded = encodeInput(input2);\n\t\t} else if (input1) {\n\t\t\tencoded = encodeInput(input1);\n\t\t} else {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (!encoded.length) return '';\n\n\t\treturn `/*${encoded}*/`;\n\t}\n\n\texport function encodeInput(input: CommentInput): string {\n\t\tif (typeof input === 'string') {\n\t\t\tif (!input.length) return input;\n\n\t\t\treturn sanitizeStringInput(input);\n\t\t}\n\n\t\tconst parts: string[] = [];\n\n\t\tfor (const [key, value] of Object.entries(input)) {\n\t\t\tif (value === null || value === undefined || value === '') continue;\n\n\t\t\tconst encodedKey = sanitizeObjectElement(key);\n\t\t\tconst encodedValue = sanitizeObjectElement(String(value));\n\n\t\t\tparts.push(`${encodedKey}='${encodedValue}'`);\n\t\t}\n\n\t\tif (!parts.length) return '';\n\n\t\treturn parts.sort().join(',');\n\t}\n\n\texport function sanitizeObjectElement(key: string): string {\n\t\tconst urlEncoded = encodeURIComponent(key);\n\t\treturn urlEncoded.replace(/'/g, `\\\\'`);\n\t}\n\n\texport function sanitizeStringInput(input: string): string {\n\t\treturn input.replace(/\\/\\*/g, '/ *').replace(/\\*\\//g, '* /');\n\t}\n}\n\nexport type CommentInput = string | SqlCommenterInput;\n\nexport type SqlCommenterInput = Record<\n\tstring,\n\tstring | number | bigint | boolean | null | undefined\n>;\n\nexport namespace SQL {\n\texport class Aliased<T = unknown> implements SQLWrapper<T> {\n\t\tstatic readonly [entityKind]: string = 'SQL.Aliased';\n\n\t\tdeclare _: {\n\t\t\tbrand: 'SQL.Aliased';\n\t\t\ttype: T;\n\t\t};\n\n\t\t/** @internal */\n\t\tisSelectionField = false;\n\t\t/** @internal */\n\t\torigin?: string;\n\n\t\tconstructor(\n\t\t\treadonly sql: SQL<T>,\n\t\t\treadonly fieldAlias: string,\n\t\t) {}\n\n\t\tgetSQL(): SQL<T> {\n\t\t\treturn this.sql as SQL<T>;\n\t\t}\n\n\t\t/** @internal */\n\t\tclone() {\n\t\t\treturn new Aliased<T>(this.sql, this.fieldAlias);\n\t\t}\n\t}\n}\n\nexport class Placeholder<TName extends string = string, TValue = any> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Placeholder';\n\n\tdeclare protected: TValue;\n\n\tconstructor(readonly name: TName) {}\n\n\tgetSQL(): SQL {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/** @deprecated Use `sql.placeholder` instead. */\nexport function placeholder<TName extends string>(name: TName): Placeholder<TName> {\n\treturn new Placeholder(name);\n}\n\nexport function fillPlaceholders(params: unknown[], values: Record<string, unknown>): unknown[] {\n\treturn params.map((p) => {\n\t\tif (is(p, Placeholder)) {\n\t\t\tif (!(p.name in values)) {\n\t\t\t\tthrow new Error(`No value for placeholder \"${p.name}\" was provided`);\n\t\t\t}\n\n\t\t\treturn values[p.name];\n\t\t}\n\n\t\tif (is(p, Param) && is(p.value, Placeholder)) {\n\t\t\tif (!(p.value.name in values)) {\n\t\t\t\tthrow new Error(`No value for placeholder \"${p.value.name}\" was provided`);\n\t\t\t}\n\n\t\t\treturn p.encoder.mapToDriverValue(values[p.value.name]);\n\t\t}\n\n\t\treturn p;\n\t});\n}\n\nexport type ColumnsSelection = Record<string, unknown>;\n\nconst IsDrizzleView = Symbol.for('drizzle:IsDrizzleView');\n\nexport abstract class View<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelection extends ColumnsSelection = ColumnsSelection,\n> {\n\tstatic readonly [entityKind]: string = 'View';\n\n\tdeclare _: {\n\t\tbrand: 'View';\n\t\tviewBrand: string;\n\t\tname: TName;\n\t\texisting: TExisting;\n\t\tselectedFields: TSelection;\n\t};\n\n\t/** @internal */\n\t[ViewBaseConfig]: {\n\t\tname: TName;\n\t\toriginalName: TName;\n\t\tschema: string | undefined;\n\t\tselectedFields: ColumnsSelection;\n\t\tisExisting: TExisting;\n\t\tquery: TExisting extends true ? undefined : SQL;\n\t\tisAlias: boolean;\n\t};\n\n\t/** @internal */\n\t[IsDrizzleView] = true;\n\n\t/** @internal */\n\tpublic get [TableName]() {\n\t\treturn this[ViewBaseConfig].name;\n\t}\n\n\t/** @internal */\n\tpublic get [TableSchema]() {\n\t\treturn this[ViewBaseConfig].schema;\n\t}\n\n\t/** @internal */\n\tpublic get [IsAlias]() {\n\t\treturn this[ViewBaseConfig].isAlias;\n\t}\n\n\t/** @internal */\n\tpublic get [OriginalName]() {\n\t\treturn this[ViewBaseConfig].originalName;\n\t}\n\n\t/** @internal */\n\tpublic get [TableColumns]() {\n\t\treturn (this[ViewBaseConfig].selectedFields) as any as Record<string, unknown>;\n\t}\n\n\tdeclare readonly $inferSelect: InferSelectViewModel<View<Assume<TName, string>, TExisting, TSelection>>;\n\n\tconstructor(\n\t\t{ name, schema, selectedFields, query }: {\n\t\t\tname: TName;\n\t\t\tschema: string | undefined;\n\t\t\tselectedFields: ColumnsSelection;\n\t\t\tquery: SQL | undefined;\n\t\t},\n\t) {\n\t\tthis[ViewBaseConfig] = {\n\t\t\tname,\n\t\t\toriginalName: name,\n\t\t\tschema,\n\t\t\tselectedFields,\n\t\t\tquery: query as (TExisting extends true ? undefined : SQL),\n\t\t\tisExisting: !query as TExisting,\n\t\t\tisAlias: false,\n\t\t};\n\t}\n}\n\nexport function isView(view: unknown): view is View {\n\treturn typeof view === 'object' && view !== null && IsDrizzleView in view;\n}\n\nexport function getViewName<T extends View>(view: T): T['_']['name'] {\n\treturn view[ViewBaseConfig].name;\n}\n\nexport type InferSelectViewModel<TView extends View> =\n\tEqual<TView['_']['selectedFields'], { [x: string]: unknown }> extends true ? { [x: string]: unknown }\n\t\t: SelectResult<\n\t\t\tTView['_']['selectedFields'],\n\t\t\t'single',\n\t\t\tRecord<TView['_']['name'], 'not-null'>\n\t\t>;\n\n// Defined separately from the Column class to resolve circular dependency\nColumn.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n// Defined separately from the Column class to resolve circular dependency\nSubquery.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n\nexport type SQLEntity = SQL | SQLWrapper | SQL.Aliased | Table | View;\n", "import { type AnyColumn, Column, type GetColumnData } from '~/column.ts';\nimport { is } from '~/entity.ts';\nimport { Table } from '~/table.ts';\nimport {\n\tisDriverValueEncoder,\n\tisSQLWrapper,\n\tParam,\n\tPlaceholder,\n\tSQL,\n\tsql,\n\ttype SQLChunk,\n\ttype SQLWrapper,\n\tStringChunk,\n\tView,\n} from '../sql.ts';\n\nexport function bindIfParam(value: unknown, column: SQLWrapper): SQLChunk {\n\tif (\n\t\tisDriverValueEncoder(column)\n\t\t&& !isSQLWrapper(value)\n\t\t&& !is(value, Param)\n\t\t&& !is(value, Placeholder)\n\t\t&& !is(value, Column)\n\t\t&& !is(value, Table)\n\t\t&& !is(value, View)\n\t) {\n\t\treturn new Param(value, column);\n\t}\n\treturn value as SQLChunk;\n}\n\nexport interface BinaryOperator {\n\t<TColumn extends Column>(\n\t\tleft: TColumn,\n\t\tright: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n\t): SQL;\n\t<T>(left: SQL.Aliased<T>, right: T | SQLWrapper): SQL;\n\t<T extends SQLWrapper>(\n\t\tleft: Exclude<T, SQL.Aliased | Column>,\n\t\tright: unknown,\n\t): SQL;\n}\n\n/**\n * Test that two values are equal.\n *\n * Remember that the SQL standard dictates that\n * two NULL values are not equal, so if you want to test\n * whether a value is null, you may want to use\n * `isNull` instead.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made by Ford\n * db.select().from(cars)\n * .where(eq(cars.make, 'Ford'))\n * ```\n *\n * @see isNull for a way to test equality to NULL.\n */\nexport const eq: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} = ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that two values are not equal.\n *\n * Remember that the SQL standard dictates that\n * two NULL values are not equal, so if you want to test\n * whether a value is not null, you may want to use\n * `isNotNull` instead.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars not made by Ford\n * db.select().from(cars)\n * .where(ne(cars.make, 'Ford'))\n * ```\n *\n * @see isNotNull for a way to test whether a value is not null.\n */\nexport const ne: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} <> ${bindIfParam(right, left)}`;\n};\n\n/**\n * Combine a list of conditions with the `and` operator. Conditions\n * that are equal `undefined` are automatically ignored.\n *\n * ## Examples\n *\n * ```ts\n * db.select().from(cars)\n * .where(\n * and(\n * eq(cars.make, 'Volvo'),\n * eq(cars.year, 1950),\n * )\n * )\n * ```\n */\nexport function and(...conditions: (SQLWrapper | undefined)[]): SQL | undefined;\nexport function and(\n\t...unfilteredConditions: (SQLWrapper | undefined)[]\n): SQL | undefined {\n\tconst conditions = unfilteredConditions.filter(\n\t\t(c): c is Exclude<typeof c, undefined> => c !== undefined,\n\t);\n\n\tif (conditions.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (conditions.length === 1) {\n\t\treturn new SQL(conditions);\n\t}\n\n\treturn new SQL([\n\t\tnew StringChunk('('),\n\t\tsql.join(conditions.map((c) => sql`(${c})`), new StringChunk(' and ')),\n\t\tnew StringChunk(')'),\n\t]);\n}\n\n/**\n * Combine a list of conditions with the `or` operator. Conditions\n * that are equal `undefined` are automatically ignored.\n *\n * ## Examples\n *\n * ```ts\n * db.select().from(cars)\n * .where(\n * or(\n * eq(cars.make, 'GM'),\n * eq(cars.make, 'Ford'),\n * )\n * )\n * ```\n */\nexport function or(...conditions: (SQLWrapper | undefined)[]): SQL | undefined;\nexport function or(\n\t...unfilteredConditions: (SQLWrapper | undefined)[]\n): SQL | undefined {\n\tconst conditions = unfilteredConditions.filter(\n\t\t(c): c is Exclude<typeof c, undefined> => c !== undefined,\n\t);\n\n\tif (conditions.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (conditions.length === 1) {\n\t\treturn new SQL(conditions);\n\t}\n\n\treturn new SQL([\n\t\tnew StringChunk('('),\n\t\tsql.join(conditions.map((c) => sql`(${c})`), new StringChunk(' or ')),\n\t\tnew StringChunk(')'),\n\t]);\n}\n\n/**\n * Negate the meaning of an expression using the `not` keyword.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars _not_ made by GM or Ford.\n * db.select().from(cars)\n * .where(not(inArray(cars.make, ['GM', 'Ford'])))\n * ```\n */\nexport function not(condition: SQLWrapper): SQL {\n\treturn is(condition, SQL) ? sql`not (${condition})` : sql`not ${condition}`;\n}\n\n/**\n * Test that the first expression passed is greater than\n * the second expression.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made after 2000.\n * db.select().from(cars)\n * .where(gt(cars.year, 2000))\n * ```\n *\n * @see gte for greater-than-or-equal\n */\nexport const gt: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} > ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that the first expression passed is greater than\n * or equal to the second expression. Use `gt` to\n * test whether an expression is strictly greater\n * than another.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made on or after 2000.\n * db.select().from(cars)\n * .where(gte(cars.year, 2000))\n * ```\n *\n * @see gt for a strictly greater-than condition\n */\nexport const gte: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} >= ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that the first expression passed is less than\n * the second expression.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made before 2000.\n * db.select().from(cars)\n * .where(lt(cars.year, 2000))\n * ```\n *\n * @see lte for less-than-or-equal\n */\nexport const lt: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} < ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that the first expression passed is less than\n * or equal to the second expression.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made before 2000.\n * db.select().from(cars)\n * .where(lte(cars.year, 2000))\n * ```\n *\n * @see lt for a strictly less-than condition\n */\nexport const lte: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} <= ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test whether the first parameter, a column or expression,\n * has a value from a list passed as the second argument.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made by Ford or GM.\n * db.select().from(cars)\n * .where(inArray(cars.make, ['Ford', 'GM']))\n * ```\n *\n * @see notInArray for the inverse of this test\n */\nexport function inArray<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function inArray<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: ReadonlyArray<GetColumnData<TColumn, 'raw'> | Placeholder> | SQLWrapper,\n): SQL;\nexport function inArray<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: ReadonlyArray<unknown | Placeholder> | SQLWrapper,\n): SQL;\nexport function inArray(\n\tcolumn: SQLWrapper,\n\tvalues: ReadonlyArray<unknown | Placeholder> | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\treturn sql`false`;\n\t\t}\n\t\treturn sql`${column} in ${values.map((v) => bindIfParam(v, column))}`;\n\t}\n\n\treturn sql`${column} in ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test whether the first parameter, a column or expression,\n * has a value that is not present in a list passed as the\n * second argument.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made by any company except Ford or GM.\n * db.select().from(cars)\n * .where(notInArray(cars.make, ['Ford', 'GM']))\n * ```\n *\n * @see inArray for the inverse of this test\n */\nexport function notInArray<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function notInArray<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function notInArray<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function notInArray(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\treturn sql`true`;\n\t\t}\n\t\treturn sql`${column} not in ${values.map((v) => bindIfParam(v, column))}`;\n\t}\n\n\treturn sql`${column} not in ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test whether an expression is NULL. By the SQL standard,\n * NULL is neither equal nor not equal to itself, so\n * it's recommended to use `isNull` and `notIsNull` for\n * comparisons to NULL.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars that have no discontinuedAt date.\n * db.select().from(cars)\n * .where(isNull(cars.discontinuedAt))\n * ```\n *\n * @see isNotNull for the inverse of this test\n */\nexport function isNull(value: SQLWrapper): SQL {\n\treturn sql`(${value} is null)`;\n}\n\n/**\n * Test whether an expression is not NULL. By the SQL standard,\n * NULL is neither equal nor not equal to itself, so\n * it's recommended to use `isNull` and `notIsNull` for\n * comparisons to NULL.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars that have been discontinued.\n * db.select().from(cars)\n * .where(isNotNull(cars.discontinuedAt))\n * ```\n *\n * @see isNull for the inverse of this test\n */\nexport function isNotNull(value: SQLWrapper): SQL {\n\treturn sql`(${value} is not null)`;\n}\n\n/**\n * Test whether a subquery evaluates to have any rows.\n *\n * ## Examples\n *\n * ```ts\n * // Users whose `homeCity` column has a match in a cities\n * // table.\n * db\n * .select()\n * .from(users)\n * .where(\n * exists(db.select()\n * .from(cities)\n * .where(eq(users.homeCity, cities.id))),\n * );\n * ```\n *\n * @see notExists for the inverse of this test\n */\nexport function exists(subquery: SQLWrapper): SQL {\n\treturn sql`exists ${subquery}`;\n}\n\n/**\n * Test whether a subquery doesn't include any result\n * rows.\n *\n * ## Examples\n *\n * ```ts\n * // Users whose `homeCity` column doesn't match\n * // a row in the cities table.\n * db\n * .select()\n * .from(users)\n * .where(\n * notExists(db.select()\n * .from(cities)\n * .where(eq(users.homeCity, cities.id))),\n * );\n * ```\n *\n * @see exists for the inverse of this test\n */\nexport function notExists(subquery: SQLWrapper): SQL {\n\treturn sql`not exists ${subquery}`;\n}\n\n/**\n * Test whether an expression is between two values. This\n * is an easier way to express range tests, which would be\n * expressed mathematically as `x <= a <= y` but in SQL\n * would have to be like `a >= x AND a <= y`.\n *\n * Between is inclusive of the endpoints: if `column`\n * is equal to `min` or `max`, it will be TRUE.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made between 1990 and 2000\n * db.select().from(cars)\n * .where(between(cars.year, 1990, 2000))\n * ```\n *\n * @see notBetween for the inverse of this test\n */\nexport function between<T>(\n\tcolumn: SQL.Aliased,\n\tmin: T | SQLWrapper,\n\tmax: T | SQLWrapper,\n): SQL;\nexport function between<TColumn extends AnyColumn>(\n\tcolumn: TColumn,\n\tmin: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n\tmax: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n): SQL;\nexport function between<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tmin: unknown,\n\tmax: unknown,\n): SQL;\nexport function between(column: SQLWrapper, min: unknown, max: unknown): SQL {\n\treturn sql`${column} between ${bindIfParam(min, column)} and ${\n\t\tbindIfParam(\n\t\t\tmax,\n\t\t\tcolumn,\n\t\t)\n\t}`;\n}\n\n/**\n * Test whether an expression is not between two values.\n *\n * This, like `between`, includes its endpoints, so if\n * the `column` is equal to `min` or `max`, in this case\n * it will evaluate to FALSE.\n *\n * ## Examples\n *\n * ```ts\n * // Exclude cars made in the 1970s\n * db.select().from(cars)\n * .where(notBetween(cars.year, 1970, 1979))\n * ```\n *\n * @see between for the inverse of this test\n */\nexport function notBetween<T>(\n\tcolumn: SQL.Aliased,\n\tmin: T | SQLWrapper,\n\tmax: T | SQLWrapper,\n): SQL;\nexport function notBetween<TColumn extends AnyColumn>(\n\tcolumn: TColumn,\n\tmin: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n\tmax: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n): SQL;\nexport function notBetween<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tmin: unknown,\n\tmax: unknown,\n): SQL;\nexport function notBetween(\n\tcolumn: SQLWrapper,\n\tmin: unknown,\n\tmax: unknown,\n): SQL {\n\treturn sql`${column} not between ${\n\t\tbindIfParam(\n\t\t\tmin,\n\t\t\tcolumn,\n\t\t)\n\t} and ${bindIfParam(max, column)}`;\n}\n\n/**\n * Compare a column to a pattern, which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars with 'Turbo' in their names.\n * db.select().from(cars)\n * .where(like(cars.name, '%Turbo%'))\n * ```\n *\n * @see ilike for a case-insensitive version of this condition\n */\nexport function like(column: Column | SQL.Aliased | SQL | SQLWrapper, value: string | SQLWrapper): SQL {\n\treturn sql`${column} like ${value}`;\n}\n\n/**\n * The inverse of like - this tests that a given column\n * does not match a pattern, which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars that don't have \"ROver\" in their name.\n * db.select().from(cars)\n * .where(notLike(cars.name, '%Rover%'))\n * ```\n *\n * @see like for the inverse condition\n * @see notIlike for a case-insensitive version of this condition\n */\nexport function notLike(column: Column | SQL.Aliased | SQL | SQLWrapper, value: string | SQLWrapper): SQL {\n\treturn sql`${column} not like ${value}`;\n}\n\n/**\n * Case-insensitively compare a column to a pattern,\n * which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * Unlike like, this performs a case-insensitive comparison.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars with 'Turbo' in their names.\n * db.select().from(cars)\n * .where(ilike(cars.name, '%Turbo%'))\n * ```\n *\n * @see like for a case-sensitive version of this condition\n */\nexport function ilike(column: Column | SQL.Aliased | SQL | SQLWrapper, value: string | SQLWrapper): SQL {\n\treturn sql`${column} ilike ${value}`;\n}\n\n/**\n * The inverse of ilike - this case-insensitively tests that a given column\n * does not match a pattern, which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars that don't have \"Rover\" in their name.\n * db.select().from(cars)\n * .where(notLike(cars.name, '%Rover%'))\n * ```\n *\n * @see ilike for the inverse condition\n * @see notLike for a case-sensitive version of this condition\n */\nexport function notIlike(column: Column | SQL.Aliased | SQL | SQLWrapper, value: string | SQLWrapper): SQL {\n\treturn sql`${column} not ilike ${value}`;\n}\n\n/**\n * Test that a column or expression contains all elements of\n * the list passed as the second argument.\n *\n * ## Throws\n *\n * The argument passed in the second array can't be empty:\n * if an empty is provided, this method will throw.\n *\n * ## Examples\n *\n * ```ts\n * // Select posts where its tags contain \"Typescript\" and \"ORM\".\n * db.select().from(posts)\n * .where(arrayContains(posts.tags, ['Typescript', 'ORM']))\n * ```\n *\n * @see arrayContained to find if an array contains all elements of a column or expression\n * @see arrayOverlaps to find if a column or expression contains any elements of an array\n */\nexport function arrayContains<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContains<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContains<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function arrayContains(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('arrayContains requires at least one value');\n\t\t}\n\t\tconst par = bindIfParam(values, column);\n\t\tconst array = sql`${Array.isArray(par) ? new Param(par) : par}`;\n\t\treturn sql`${column} @> ${array}`;\n\t}\n\n\treturn sql`${column} @> ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test that the list passed as the second argument contains\n * all elements of a column or expression.\n *\n * ## Throws\n *\n * The argument passed in the second array can't be empty:\n * if an empty is provided, this method will throw.\n *\n * ## Examples\n *\n * ```ts\n * // Select posts where its tags contain \"Typescript\", \"ORM\" or both,\n * // but filtering posts that have additional tags.\n * db.select().from(posts)\n * .where(arrayContained(posts.tags, ['Typescript', 'ORM']))\n * ```\n *\n * @see arrayContains to find if a column or expression contains all elements of an array\n * @see arrayOverlaps to find if a column or expression contains any elements of an array\n */\nexport function arrayContained<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContained<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContained<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function arrayContained(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('arrayContained requires at least one value');\n\t\t}\n\t\tconst par = bindIfParam(values, column);\n\t\tconst array = sql`${Array.isArray(par) ? new Param(par) : par}`;\n\t\treturn sql`${column} <@ ${array}`;\n\t}\n\n\treturn sql`${column} <@ ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test that a column or expression contains any elements of\n * the list passed as the second argument.\n *\n * ## Throws\n *\n * The argument passed in the second array can't be empty:\n * if an empty is provided, this method will throw.\n *\n * ## Examples\n *\n * ```ts\n * // Select posts where its tags contain \"Typescript\", \"ORM\" or both.\n * db.select().from(posts)\n * .where(arrayOverlaps(posts.tags, ['Typescript', 'ORM']))\n * ```\n *\n * @see arrayContains to find if a column or expression contains all elements of an array\n * @see arrayContained to find if an array contains all elements of a column or expression\n */\nexport function arrayOverlaps<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayOverlaps<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayOverlaps<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function arrayOverlaps(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('arrayOverlaps requires at least one value');\n\t\t}\n\t\tconst par = bindIfParam(values, column);\n\t\tconst array = sql`${Array.isArray(par) ? new Param(par) : par}`;\n\t\treturn sql`${column} && ${array}`;\n\t}\n\n\treturn sql`${column} && ${bindIfParam(values, column)}`;\n}\n", "import type { AnyColumn } from '../../column.ts';\nimport type { SQL, SQLWrapper } from '../sql.ts';\nimport { sql } from '../sql.ts';\n\n/**\n * Used in sorting, this specifies that the given\n * column or expression should be sorted in ascending\n * order. By the SQL standard, ascending order is the\n * default, so it is not usually necessary to specify\n * ascending sort order.\n *\n * ## Examples\n *\n * ```ts\n * // Return cars, starting with the oldest models\n * // and going in ascending order to the newest.\n * db.select().from(cars)\n * .orderBy(asc(cars.year));\n * ```\n *\n * @see desc to sort in descending order\n */\nexport function asc(column: AnyColumn | SQLWrapper): SQL {\n\treturn sql`${column} asc`;\n}\n\n/**\n * Used in sorting, this specifies that the given\n * column or expression should be sorted in descending\n * order.\n *\n * ## Examples\n *\n * ```ts\n * // Select users, with the most recently created\n * // records coming first.\n * db.select().from(users)\n * .orderBy(desc(users.createdAt));\n * ```\n *\n * @see asc to sort in ascending order\n */\nexport function desc(column: AnyColumn | SQLWrapper): SQL {\n\treturn sql`${column} desc`;\n}\n", "function parsePgArrayValue(arrayString: string, startFrom: number, inQuotes: boolean): [string, number] {\n\tfor (let i = startFrom; i < arrayString.length; i++) {\n\t\tconst char = arrayString[i];\n\n\t\tif (char === '\\\\') {\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"') {\n\t\t\treturn [arrayString.slice(startFrom, i).replace(/\\\\/g, ''), i + 1];\n\t\t}\n\n\t\tif (inQuotes) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === ',' || char === '}') {\n\t\t\treturn [arrayString.slice(startFrom, i).replace(/\\\\/g, ''), i];\n\t\t}\n\t}\n\n\treturn [arrayString.slice(startFrom).replace(/\\\\/g, ''), arrayString.length];\n}\n\nexport function parsePgNestedArray(arrayString: string, startFrom = 0): [any[], number] {\n\tconst result: any[] = [];\n\tlet i = startFrom;\n\tlet lastCharIsComma = false;\n\n\twhile (i < arrayString.length) {\n\t\tconst char = arrayString[i];\n\n\t\tif (char === ',') {\n\t\t\tif (lastCharIsComma || i === startFrom) {\n\t\t\t\tresult.push('');\n\t\t\t}\n\t\t\tlastCharIsComma = true;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tlastCharIsComma = false;\n\n\t\tif (char === '\\\\') {\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"') {\n\t\t\tconst [value, startFrom] = parsePgArrayValue(arrayString, i + 1, true);\n\t\t\tresult.push(value);\n\t\t\ti = startFrom;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '}') {\n\t\t\treturn [result, i + 1];\n\t\t}\n\n\t\tif (char === '{') {\n\t\t\tconst [value, startFrom] = parsePgNestedArray(arrayString, i + 1);\n\t\t\tresult.push(value);\n\t\t\ti = startFrom;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst [value, newStartFrom] = parsePgArrayValue(arrayString, i, false);\n\t\tresult.push(value);\n\t\ti = newStartFrom;\n\t}\n\n\treturn [result, i];\n}\n\nexport function parsePgArray(arrayString: string): any[] {\n\tconst [result] = parsePgNestedArray(arrayString, 1);\n\treturn result;\n}\n\nexport function makePgArray(array: any[]): string {\n\treturn `{${\n\t\tarray.map((item) => {\n\t\t\tif (Array.isArray(item)) {\n\t\t\t\treturn makePgArray(item);\n\t\t\t}\n\n\t\t\tif (typeof item === 'string') {\n\t\t\t\treturn `\"${item.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n\t\t\t}\n\n\t\t\treturn `${item}`;\n\t\t}).join(',')\n\t}}`;\n}\n", "import { entityKind } from '~/entity.ts';\nimport { TableName } from '~/table.utils.ts';\nimport type { AnyPgColumn, PgColumn } from './columns/index.ts';\nimport type { PgTable } from './table.ts';\n\nexport type UpdateDeleteAction = 'cascade' | 'restrict' | 'no action' | 'set null' | 'set default';\n\nexport type Reference = () => {\n\treadonly name?: string;\n\treadonly columns: PgColumn[];\n\treadonly foreignTable: PgTable;\n\treadonly foreignColumns: PgColumn[];\n};\n\nexport class ForeignKeyBuilder {\n\tstatic readonly [entityKind]: string = 'PgForeignKeyBuilder';\n\n\t/** @internal */\n\treference: Reference;\n\n\t/** @internal */\n\t_onUpdate: UpdateDeleteAction | undefined = 'no action';\n\n\t/** @internal */\n\t_onDelete: UpdateDeleteAction | undefined = 'no action';\n\n\tconstructor(\n\t\tconfig: () => {\n\t\t\tname?: string;\n\t\t\tcolumns: PgColumn[];\n\t\t\tforeignColumns: PgColumn[];\n\t\t},\n\t\tactions?: {\n\t\t\tonUpdate?: UpdateDeleteAction;\n\t\t\tonDelete?: UpdateDeleteAction;\n\t\t} | undefined,\n\t) {\n\t\tthis.reference = () => {\n\t\t\tconst { name, columns, foreignColumns } = config();\n\t\t\treturn { name, columns, foreignTable: foreignColumns[0]!.table as PgTable, foreignColumns };\n\t\t};\n\t\tif (actions) {\n\t\t\tthis._onUpdate = actions.onUpdate;\n\t\t\tthis._onDelete = actions.onDelete;\n\t\t}\n\t}\n\n\tonUpdate(action: UpdateDeleteAction): this {\n\t\tthis._onUpdate = action === undefined ? 'no action' : action;\n\t\treturn this;\n\t}\n\n\tonDelete(action: UpdateDeleteAction): this {\n\t\tthis._onDelete = action === undefined ? 'no action' : action;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: PgTable): ForeignKey {\n\t\treturn new ForeignKey(table, this);\n\t}\n}\n\nexport type AnyForeignKeyBuilder = ForeignKeyBuilder;\n\nexport class ForeignKey {\n\tstatic readonly [entityKind]: string = 'PgForeignKey';\n\n\treadonly reference: Reference;\n\treadonly onUpdate: UpdateDeleteAction | undefined;\n\treadonly onDelete: UpdateDeleteAction | undefined;\n\treadonly name?: string;\n\n\tconstructor(readonly table: PgTable, builder: ForeignKeyBuilder) {\n\t\tthis.reference = builder.reference;\n\t\tthis.onUpdate = builder._onUpdate;\n\t\tthis.onDelete = builder._onDelete;\n\t}\n\n\tgetName(): string {\n\t\tconst { name, columns, foreignColumns } = this.reference();\n\t\tconst columnNames = columns.map((column) => column.name);\n\t\tconst foreignColumnNames = foreignColumns.map((column) => column.name);\n\t\tconst chunks = [\n\t\t\tthis.table[TableName],\n\t\t\t...columnNames,\n\t\t\tforeignColumns[0]!.table[TableName],\n\t\t\t...foreignColumnNames,\n\t\t];\n\t\treturn name ?? `${chunks.join('_')}_fk`;\n\t}\n\n\tisNameExplicit(): boolean {\n\t\treturn !!this.reference().name;\n\t}\n}\n\ntype ColumnsWithTable<\n\tTTableName extends string,\n\tTColumns extends PgColumn[],\n> = { [Key in keyof TColumns]: AnyPgColumn<{ tableName: TTableName }> };\n\nexport function foreignKey<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends [AnyPgColumn<{ tableName: TTableName }>, ...AnyPgColumn<{ tableName: TTableName }>[]],\n>(\n\tconfig: {\n\t\tname?: string;\n\t\tcolumns: TColumns;\n\t\tforeignColumns: ColumnsWithTable<TForeignTableName, TColumns>;\n\t},\n): ForeignKeyBuilder {\n\tfunction mappedConfig() {\n\t\tconst { name, columns, foreignColumns } = config;\n\t\treturn {\n\t\t\tname,\n\t\t\tcolumns,\n\t\t\tforeignColumns,\n\t\t};\n\t}\n\n\treturn new ForeignKeyBuilder(mappedConfig);\n}\n", "import type { ColumnType, GeneratedColumnConfig, GeneratedIdentityConfig } from '~/column-builder.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { ForeignKey, UpdateDeleteAction } from '~/pg-core/foreign-keys.ts';\nimport { ForeignKeyBuilder } from '~/pg-core/foreign-keys.ts';\nimport type { AnyPgTable, PgTable } from '~/pg-core/table.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport { iife } from '~/tracing-utils.ts';\nimport type { Update } from '~/utils.ts';\nimport type { PgIndexOpClass } from '../indexes.ts';\nimport { makePgArray, parsePgArray } from '../utils/array.ts';\n\ndeclare const PgColumnBuilderBrand: unique symbol;\nexport type PgColumnBuilderBrand = typeof PgColumnBuilderBrand;\n\ndeclare const PgColumnBrand: unique symbol;\nexport type PgColumnBrand = typeof PgColumnBrand;\n\nexport type PgArrayDimension = 0 | 1 | 2 | 3 | 4 | 5;\ntype PgArrayDimensionString = '[]' | '[][]' | '[][][]' | '[][][][]' | '[][][][][]';\n\ntype ArrayDimensionStringToNumber<T extends PgArrayDimensionString> = T extends '[]' ? 1\n\t: T extends '[][]' ? 2\n\t: T extends '[][][]' ? 3\n\t: T extends '[][][][]' ? 4\n\t: T extends '[][][][][]' ? 5\n\t: never;\n\nexport interface PgColumnBuilderConfig {\n\tdataType: ColumnType;\n\tdata: unknown;\n\tdriverParam: unknown;\n\t// Optional - set via chain methods\n\tnotNull?: boolean;\n\thasDefault?: boolean;\n\tisPrimaryKey?: boolean;\n\tisAutoincrement?: boolean;\n\thasRuntimeDefault?: boolean;\n\tenumValues?: string[];\n\tidentity?: 'always' | 'byDefault';\n\tgenerated?: unknown;\n\tdimensions?: PgArrayDimension;\n\t$type?: unknown;\n}\n\nexport interface PgColumnBuilderRuntimeConfig<TData> {\n\tname: string;\n\tkeyAsName: boolean;\n\tnotNull: boolean;\n\tdefault: TData | SQL | undefined;\n\tdefaultFn: (() => TData | SQL) | undefined;\n\tonUpdateFn: (() => TData | SQL) | undefined;\n\thasDefault: boolean;\n\tprimaryKey: boolean;\n\tisUnique: boolean;\n\tuniqueName: string | undefined;\n\tuniqueType: string | undefined;\n\tdataType: string;\n\tcolumnType: string;\n\tgenerated: GeneratedColumnConfig<TData> | undefined;\n\tgeneratedIdentity: GeneratedIdentityConfig | undefined;\n\tdimensions?: PgArrayDimension;\n}\n\n// TODO: remove isAutoincrement and hasRuntimeDefault\nexport interface PgColumnBaseConfig<out TDataType extends ColumnType = ColumnType> {\n\tname: string;\n\tdataType: TDataType;\n\ttableName: string;\n\tnotNull: boolean;\n\thasDefault: boolean;\n\tisPrimaryKey: boolean;\n\tisAutoincrement: boolean;\n\thasRuntimeDefault: boolean;\n\tdata: unknown;\n\tdriverParam: unknown;\n\tenumValues: string[] | undefined;\n\tgenerated: unknown;\n\tidentity: undefined | 'always' | 'byDefault';\n\t// insertType: unknown;\n}\n\ntype WrapArray<T, N extends number> = N extends 1 ? T[]\n\t: N extends 2 ? T[][]\n\t: N extends 3 ? T[][][]\n\t: N extends 4 ? T[][][][]\n\t: N extends 5 ? T[][][][][]\n\t: T;\n\nexport type SetNotNull<T> = T & { readonly [PgColumnBuilderBrand]: { notNull: true } };\nexport type SetHasDefault<T> = T & { readonly [PgColumnBuilderBrand]: { hasDefault: true } };\nexport type SetIsPrimaryKey<T> = T & { readonly [PgColumnBuilderBrand]: { isPrimaryKey: true; notNull: true } };\nexport type SetHasRuntimeDefault<T> = T & {\n\treadonly [PgColumnBuilderBrand]: { hasRuntimeDefault: true; hasDefault: true };\n};\nexport type Set$Type<T, TType> = T & { readonly [PgColumnBuilderBrand]: { $type: TType } };\nexport type SetHasGenerated<T> = T & {\n\treadonly [PgColumnBuilderBrand]: { hasDefault: true; generated: true };\n};\nexport type SetDimensions<T, TDim extends PgArrayDimension> = T & {\n\treadonly [PgColumnBuilderBrand]: { dimensions: TDim };\n};\nexport type SetIdentity<T, TType extends 'always' | 'byDefault'> = T & {\n\treadonly [PgColumnBuilderBrand]: { notNull: true; hasDefault: true; identity: TType };\n};\n\nexport type HasIdentity<T, TType extends 'always' | 'byDefault'> = SetIdentity<T, TType>;\n\ntype GetBaseData<T> = T extends { $type: infer U } ? U : T extends { data: infer D } ? D : unknown;\n\nexport type ResolvePgColumnConfig<\n\tout T extends PgColumnBuilderConfig,\n\tout TTableName extends string,\n\tout TData = T['dimensions'] extends 1 | 2 | 3 | 4 | 5 ? WrapArray<GetBaseData<T>, T['dimensions']>\n\t\t: GetBaseData<T>,\n> = {\n\tname: string;\n\ttableName: TTableName;\n\tdataType: T['dataType'];\n\tdata: TData;\n\tdriverParam: T['dimensions'] extends 1 | 2 | 3 | 4 | 5 ? WrapArray<T['driverParam'], T['dimensions']> | string\n\t\t: T['driverParam'];\n\tnotNull: T['notNull'] extends true ? true : false;\n\thasDefault: T['hasDefault'] extends true ? true : false;\n\tisPrimaryKey: false;\n\tisAutoincrement: false;\n\thasRuntimeDefault: false;\n\tenumValues: T extends { enumValues: infer E extends string[] } ? E : undefined;\n\tidentity: T['identity'] extends 'always' | 'byDefault' ? T['identity'] : undefined;\n\tgenerated: T['generated'] extends true ? true : undefined;\n\t// insertType: T['generated'] extends true ? never\n\t// \t: T['identity'] extends 'always' ? never\n\t// \t: T['notNull'] extends true ? T['hasDefault'] extends true ? TData | undefined : TData\n\t// \t: TData | null | undefined;\n} & {};\n\nexport interface AnyPgColumnBuilder {\n\treadonly [PgColumnBuilderBrand]: PgColumnBuilderConfig;\n}\n\nexport interface AnyPostgresColumn {\n\treadonly [PgColumnBrand]: PgColumnBaseConfig;\n}\n\nexport type PgBuildColumn<\n\tTTableName extends string,\n\tTBuilder extends AnyPgColumnBuilder,\n\tTBuiltConfig extends PgColumnBaseConfig<ColumnType> = ResolvePgColumnConfig<\n\t\tTBuilder[PgColumnBuilderBrand],\n\t\tTTableName\n\t>,\n> = PgColumn<ColumnType, TBuiltConfig, {}>;\n\nexport type PgBuildColumns<\n\tout TTableName extends string,\n\tout TConfigMap extends Record<string, AnyPgColumnBuilder>,\n> =\n\t& {\n\t\t[Key in keyof TConfigMap]: PgBuildColumn<TTableName, TConfigMap[Key]>;\n\t}\n\t& {};\n\nexport type PgBuildExtraConfigColumns<\n\tout TConfigMap extends Record<string, AnyPgColumnBuilder>,\n> =\n\t& {\n\t\t[Key in keyof TConfigMap]: ExtraConfigColumn;\n\t}\n\t& {};\n\nexport type PgColumns = Record<string, PgColumn>;\n\nexport interface ReferenceConfig {\n\tref: () => PgColumn;\n\tconfig: {\n\t\tname?: string;\n\t\tonUpdate?: UpdateDeleteAction;\n\t\tonDelete?: UpdateDeleteAction;\n\t};\n}\n\nexport abstract class PgColumnBuilder<\n\tout T extends PgColumnBuilderConfig = PgColumnBuilderConfig,\n\tout TRuntimeConfig extends object = object,\n> {\n\tstatic readonly [entityKind]: string = 'PgColumnBuilder';\n\n\tdeclare readonly [PgColumnBuilderBrand]: T;\n\n\tprivate foreignKeyConfigs: ReferenceConfig[] = [];\n\n\tprotected config: PgColumnBuilderRuntimeConfig<T['data']> & TRuntimeConfig;\n\n\tconstructor(name: string, dataType: ColumnType, columnType: string) {\n\t\tthis.config = {\n\t\t\tname,\n\t\t\tkeyAsName: name === '',\n\t\t\tnotNull: false,\n\t\t\tdefault: undefined,\n\t\t\thasDefault: false,\n\t\t\tprimaryKey: false,\n\t\t\tisUnique: false,\n\t\t\tuniqueName: undefined,\n\t\t\tuniqueType: undefined,\n\t\t\tdataType,\n\t\t\tcolumnType,\n\t\t\tgenerated: undefined,\n\t\t\tdefaultFn: undefined,\n\t\t\tonUpdateFn: undefined,\n\t\t\tgeneratedIdentity: undefined,\n\t\t} as PgColumnBuilderRuntimeConfig<T['data']> & TRuntimeConfig;\n\t}\n\n\t/**\n\t * Changes the data type of the column. Commonly used with `json` columns. Also, useful for branded types.\n\t *\n\t * @example\n\t * ```ts\n\t * const users = pgTable('users', {\n\t * \tid: integer('id').$type<UserId>().primaryKey(),\n\t * \tdetails: json('details').$type<UserDetails>().notNull(),\n\t * });\n\t * ```\n\t */\n\t$type<TType>(): Set$Type<this, TType> {\n\t\treturn this as Set$Type<this, TType>;\n\t}\n\n\t/**\n\t * Adds a `not null` clause to the column definition.\n\t *\n\t * Affects the `select` model of the table - columns *without* `not null` will be nullable on select.\n\t */\n\tnotNull(): SetNotNull<this> {\n\t\tthis.config.notNull = true;\n\t\treturn this as SetNotNull<this>;\n\t}\n\n\t/**\n\t * Adds a `default <value>` clause to the column definition.\n\t *\n\t * Affects the `insert` model of the table - columns *with* `default` are optional on insert.\n\t *\n\t * If you need to set a dynamic default value, use {@link $defaultFn} instead.\n\t */\n\tdefault(\n\t\tvalue:\n\t\t\t| (this[PgColumnBuilderBrand] extends { dimensions: 1 | 2 | 3 | 4 | 5 } ? WrapArray<\n\t\t\t\t\tthis[PgColumnBuilderBrand] extends { $type: infer U } ? U : this[PgColumnBuilderBrand]['data'],\n\t\t\t\t\tthis[PgColumnBuilderBrand]['dimensions']\n\t\t\t\t>\n\t\t\t\t: this[PgColumnBuilderBrand] extends { $type: infer U } ? U\n\t\t\t\t: this[PgColumnBuilderBrand]['data'])\n\t\t\t| SQL,\n\t): SetHasDefault<this> {\n\t\tthis.config.default = value;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as SetHasDefault<this>;\n\t}\n\n\t/**\n\t * Adds a dynamic default value to the column.\n\t * The function will be called when the row is inserted, and the returned value will be used as the column value.\n\t *\n\t * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.\n\t */\n\t$defaultFn(\n\t\tfn: () =>\n\t\t\t| (this[PgColumnBuilderBrand] extends { dimensions: 1 | 2 | 3 | 4 | 5 } ? WrapArray<\n\t\t\t\t\tthis[PgColumnBuilderBrand] extends { $type: infer U } ? U : this[PgColumnBuilderBrand]['data'],\n\t\t\t\t\tthis[PgColumnBuilderBrand]['dimensions']\n\t\t\t\t>\n\t\t\t\t: this[PgColumnBuilderBrand] extends { $type: infer U } ? U\n\t\t\t\t: this[PgColumnBuilderBrand]['data'])\n\t\t\t| SQL,\n\t): SetHasRuntimeDefault<this> {\n\t\tthis.config.defaultFn = fn;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as SetHasRuntimeDefault<this>;\n\t}\n\n\t/**\n\t * Alias for {@link $defaultFn}.\n\t */\n\t$default = this.$defaultFn;\n\n\t/**\n\t * Adds a dynamic update value to the column.\n\t * The function will be called when the row is updated, and the returned value will be used as the column value if none is provided.\n\t * If no `default` (or `$defaultFn`) value is provided, the function will be called when the row is inserted as well, and the returned value will be used as the column value.\n\t *\n\t * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.\n\t */\n\t$onUpdateFn(\n\t\tfn: () =>\n\t\t\t| (this[PgColumnBuilderBrand] extends { dimensions: 1 | 2 | 3 | 4 | 5 } ? WrapArray<\n\t\t\t\t\tthis[PgColumnBuilderBrand] extends { $type: infer U } ? U : this[PgColumnBuilderBrand]['data'],\n\t\t\t\t\tthis[PgColumnBuilderBrand]['dimensions']\n\t\t\t\t>\n\t\t\t\t: this[PgColumnBuilderBrand] extends { $type: infer U } ? U\n\t\t\t\t: this[PgColumnBuilderBrand]['data'])\n\t\t\t| SQL,\n\t): SetHasDefault<this> {\n\t\tthis.config.onUpdateFn = fn;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as SetHasDefault<this>;\n\t}\n\n\t/**\n\t * Alias for {@link $onUpdateFn}.\n\t */\n\t$onUpdate = this.$onUpdateFn;\n\n\t/**\n\t * Adds a `primary key` clause to the column definition. This implicitly makes the column `not null`.\n\t *\n\t * In SQLite, `integer primary key` implicitly makes the column auto-incrementing.\n\t */\n\tprimaryKey(): SetIsPrimaryKey<this> {\n\t\tthis.config.primaryKey = true;\n\t\tthis.config.notNull = true;\n\t\treturn this as SetIsPrimaryKey<this>;\n\t}\n\n\t/** @internal Sets the name of the column to the key within the table definition if a name was not given. */\n\tsetName(name: string) {\n\t\tif (this.config.name !== '') return;\n\t\tthis.config.name = name;\n\t}\n\n\t/**\n\t * Makes this column a PostgreSQL array column.\n\t *\n\t * @example\n\t * ```ts\n\t * const t = pgTable('t', {\n\t * // 1D array: number[]\n\t * tags: integer().array(),\n\t * // Or explicitly: integer().array('[]')\n\t * // 2D array: number[][]\n\t * matrix: integer().array('[][]'),\n\t * });\n\t * ```\n\t */\n\tarray(): SetDimensions<this, 1>;\n\tarray<TDim extends PgArrayDimensionString>(\n\t\tdimensions: TDim,\n\t): SetDimensions<this, ArrayDimensionStringToNumber<TDim>>;\n\tarray<TDim extends PgArrayDimensionString>(\n\t\tdimensions?: TDim,\n\t): SetDimensions<this, ArrayDimensionStringToNumber<TDim>> {\n\t\t// Calculate dimensions as number from string notation\n\t\tconst dim = dimensions ?? '[]';\n\t\t(this.config as any).dimensions = (dim.length / 2) as PgArrayDimension;\n\t\treturn this as SetDimensions<this, ArrayDimensionStringToNumber<TDim>>;\n\t}\n\n\treferences(\n\t\tref: ReferenceConfig['ref'],\n\t\tconfig: ReferenceConfig['config'] = {},\n\t): this {\n\t\tthis.foreignKeyConfigs.push({ ref, config });\n\t\treturn this;\n\t}\n\n\tunique(\n\t\tname?: string,\n\t\tconfig?: { nulls: 'distinct' | 'not distinct' },\n\t): this {\n\t\tthis.config.isUnique = true;\n\t\tthis.config.uniqueName = name;\n\t\tthis.config.uniqueType = config?.nulls;\n\t\treturn this;\n\t}\n\n\tgeneratedAlwaysAs(\n\t\tas:\n\t\t\t| SQL\n\t\t\t| (() => SQL),\n\t): SetHasGenerated<this> {\n\t\tthis.config.generated = {\n\t\t\tas,\n\t\t\ttype: 'always',\n\t\t\tmode: 'stored',\n\t\t};\n\t\treturn this as SetHasGenerated<this>;\n\t}\n\n\t/** @internal */\n\tbuildForeignKeys(column: PgColumn, table: PgTable): ForeignKey[] {\n\t\treturn this.foreignKeyConfigs.map(({ ref, config }) => {\n\t\t\treturn iife(\n\t\t\t\t(ref, config) => {\n\t\t\t\t\tconst builder = new ForeignKeyBuilder(() => {\n\t\t\t\t\t\tconst foreignColumn = ref();\n\t\t\t\t\t\treturn { name: config.name, columns: [column], foreignColumns: [foreignColumn] };\n\t\t\t\t\t});\n\t\t\t\t\tif (config.onUpdate) {\n\t\t\t\t\t\tbuilder.onUpdate(config.onUpdate);\n\t\t\t\t\t}\n\t\t\t\t\tif (config.onDelete) {\n\t\t\t\t\t\tbuilder.onDelete(config.onDelete);\n\t\t\t\t\t}\n\t\t\t\t\treturn builder.build(table);\n\t\t\t\t},\n\t\t\t\tref,\n\t\t\t\tconfig,\n\t\t\t);\n\t\t});\n\t}\n\n\t/** @internal */\n\tabstract build(table: PgTable): PgColumn<any>;\n\n\t/** @internal */\n\tbuildExtraConfigColumn<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): ExtraConfigColumn {\n\t\treturn new ExtraConfigColumn(table, { ...this.config, dimensions: (this.config as any).dimensions ?? 0 });\n\t}\n}\n\n// TODO: we should potenitally do column to be\n// in charge of map value/array of values/json value and json array of values in 1 place\nexport abstract class PgColumn<\n\tout TColumnType extends ColumnType = any,\n\tout T extends PgColumnBaseConfig<TColumnType> = PgColumnBaseConfig<TColumnType>,\n\tout TRuntimeConfig extends object = {},\n> extends Column<T, TRuntimeConfig> {\n\tstatic override readonly [entityKind]: string = 'PgColumn';\n\n\t/** @internal */\n\toverride readonly table: PgTable;\n\n\treadonly dimensions: PgArrayDimension;\n\n\tconstructor(\n\t\ttable: PgTable,\n\t\tconfig: PgColumnBuilderRuntimeConfig<T['data']> & TRuntimeConfig,\n\t) {\n\t\tsuper(table, config);\n\t\tthis.table = table;\n\t\tthis.dimensions = config.dimensions ?? 0;\n\n\t\t// Wrap mapFromDriverValue/mapToDriverValue with array handling if this is an array column\n\t\tif (this.dimensions) {\n\t\t\tconst originalFromDriver = this.mapFromDriverValue.bind(this);\n\t\t\tconst originalToDriver = this.mapToDriverValue.bind(this);\n\n\t\t\tthis.mapFromDriverValue = (value: unknown): unknown => {\n\t\t\t\tif (value === null) return value;\n\t\t\t\t// Parse string representation if needed (e.g., from node-postgres for enum arrays)\n\t\t\t\tconst arr = typeof value === 'string' ? parsePgArray(value) : value as unknown[];\n\t\t\t\treturn this.mapArrayElements(arr, originalFromDriver, this.dimensions);\n\t\t\t};\n\n\t\t\tthis.mapToDriverValue = (value: unknown): unknown => {\n\t\t\t\tif (value === null) return value;\n\t\t\t\tconst mapped = this.mapArrayElements(value as unknown[], originalToDriver, this.dimensions);\n\t\t\t\treturn makePgArray(mapped as any[]);\n\t\t\t};\n\t\t}\n\t}\n\n\t/** @internal */\n\tprivate mapArrayElements(value: unknown, mapper: (v: unknown) => unknown, depth: number): unknown {\n\t\tif (depth > 0 && Array.isArray(value)) {\n\t\t\treturn value.map((v) => v === null ? null : this.mapArrayElements(v, mapper, depth - 1));\n\t\t}\n\t\treturn mapper(value);\n\t}\n}\n\nexport type IndexedExtraConfigType = { order?: 'asc' | 'desc'; nulls?: 'first' | 'last'; opClass?: string };\n\nexport class ExtraConfigColumn<\n\tout T extends PgColumnBaseConfig<ColumnType> = PgColumnBaseConfig<ColumnType>,\n> extends PgColumn<ColumnType, T, IndexedExtraConfigType> {\n\tstatic override readonly [entityKind]: string = 'ExtraConfigColumn';\n\n\toverride getSQLType(): string {\n\t\treturn this.getSQLType();\n\t}\n\n\tindexConfig: IndexedExtraConfigType = {\n\t\torder: this.config.order ?? 'asc',\n\t\tnulls: this.config.nulls ?? 'last',\n\t\topClass: this.config.opClass,\n\t};\n\tdefaultConfig: IndexedExtraConfigType = {\n\t\torder: 'asc',\n\t\tnulls: 'last',\n\t\topClass: undefined,\n\t};\n\n\tasc(): Omit<this, 'asc' | 'desc'> {\n\t\tthis.indexConfig.order = 'asc';\n\t\treturn this;\n\t}\n\n\tdesc(): Omit<this, 'asc' | 'desc'> {\n\t\tthis.indexConfig.order = 'desc';\n\t\treturn this;\n\t}\n\n\tnullsFirst(): Omit<this, 'nullsFirst' | 'nullsLast'> {\n\t\tthis.indexConfig.nulls = 'first';\n\t\treturn this;\n\t}\n\n\tnullsLast(): Omit<this, 'nullsFirst' | 'nullsLast'> {\n\t\tthis.indexConfig.nulls = 'last';\n\t\treturn this;\n\t}\n\n\t/**\n\t * ### PostgreSQL documentation quote\n\t *\n\t * > An operator class with optional parameters can be specified for each column of an index.\n\t * The operator class identifies the operators to be used by the index for that column.\n\t * For example, a B-tree index on four-byte integers would use the int4_ops class;\n\t * this operator class includes comparison functions for four-byte integers.\n\t * In practice the default operator class for the column's data type is usually sufficient.\n\t * The main point of having operator classes is that for some data types, there could be more than one meaningful ordering.\n\t * For example, we might want to sort a complex-number data type either by absolute value or by real part.\n\t * We could do this by defining two operator classes for the data type and then selecting the proper class when creating an index.\n\t * More information about operator classes check:\n\t *\n\t * ### Useful links\n\t * https://www.postgresql.org/docs/current/sql-createindex.html\n\t *\n\t * https://www.postgresql.org/docs/current/indexes-opclass.html\n\t *\n\t * https://www.postgresql.org/docs/current/xindex.html\n\t *\n\t * ### Additional types\n\t * If you have the `pg_vector` extension installed in your database, you can use the\n\t * `vector_l2_ops`, `vector_ip_ops`, `vector_cosine_ops`, `vector_l1_ops`, `bit_hamming_ops`, `bit_jaccard_ops`, `halfvec_l2_ops`, `sparsevec_l2_ops` options, which are predefined types.\n\t *\n\t * **You can always specify any string you want in the operator class, in case Drizzle doesn't have it natively in its types**\n\t *\n\t * @param opClass\n\t * @returns\n\t */\n\top(opClass: PgIndexOpClass): Omit<this, 'op'> {\n\t\tthis.indexConfig.opClass = opClass;\n\t\treturn this;\n\t}\n}\n\nexport class IndexedColumn {\n\tstatic readonly [entityKind]: string = 'IndexedColumn';\n\tconstructor(\n\t\tname: string | undefined,\n\t\tkeyAsName: boolean,\n\t\ttype: string,\n\t\tindexConfig: IndexedExtraConfigType,\n\t) {\n\t\tthis.name = name;\n\t\tthis.keyAsName = keyAsName;\n\t\tthis.type = type;\n\t\tthis.indexConfig = indexConfig;\n\t}\n\n\tname: string | undefined;\n\tkeyAsName: boolean;\n\ttype: string;\n\tindexConfig: IndexedExtraConfigType;\n}\n\nexport type AnyPgColumn<\n\tTPartial extends Partial<PgColumnBaseConfig<ColumnType>> = {},\n> = PgColumn<\n\tany,\n\tRequired<Update<PgColumnBaseConfig<ColumnType>, TPartial>>\n>;\n", "import type { GeneratedIdentityConfig } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { PgSequenceOptions } from '../sequence.ts';\nimport type { HasIdentity, PgColumnBuilderConfig } from './common.ts';\nimport { PgColumnBuilder } from './common.ts';\n\nexport abstract class PgIntColumnBuilder<\n\tout T extends PgColumnBuilderConfig = PgColumnBuilderConfig,\n\tout TRuntimeConfig extends object = object,\n> extends PgColumnBuilder<T, TRuntimeConfig> {\n\tstatic override readonly [entityKind]: string = 'PgIntColumnBaseBuilder';\n\n\t/**\n\t * Adds an `ALWAYS AS IDENTITY` clause to the column definition.\n\t * Available for integer column types.\n\t */\n\tgeneratedAlwaysAsIdentity(\n\t\tsequence?: PgSequenceOptions & { name?: string },\n\t): HasIdentity<this, 'always'> {\n\t\tif (sequence) {\n\t\t\tconst { name, ...options } = sequence;\n\t\t\t(this.config as any).generatedIdentity = {\n\t\t\t\ttype: 'always',\n\t\t\t\tsequenceName: name,\n\t\t\t\tsequenceOptions: options,\n\t\t\t} satisfies GeneratedIdentityConfig;\n\t\t} else {\n\t\t\t(this.config as any).generatedIdentity = {\n\t\t\t\ttype: 'always',\n\t\t\t} satisfies GeneratedIdentityConfig;\n\t\t}\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.notNull = true;\n\t\treturn this as HasIdentity<this, 'always'>;\n\t}\n\n\t/**\n\t * Adds a `BY DEFAULT AS IDENTITY` clause to the column definition.\n\t * Available for integer column types.\n\t */\n\tgeneratedByDefaultAsIdentity(\n\t\tsequence?: PgSequenceOptions & { name?: string },\n\t): HasIdentity<this, 'byDefault'> {\n\t\tif (sequence) {\n\t\t\tconst { name, ...options } = sequence;\n\t\t\t(this.config as any).generatedIdentity = {\n\t\t\t\ttype: 'byDefault',\n\t\t\t\tsequenceName: name,\n\t\t\t\tsequenceOptions: options,\n\t\t\t} satisfies GeneratedIdentityConfig;\n\t\t} else {\n\t\t\t(this.config as any).generatedIdentity = {\n\t\t\t\ttype: 'byDefault',\n\t\t\t} satisfies GeneratedIdentityConfig;\n\t\t}\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.notNull = true;\n\t\treturn this as HasIdentity<this, 'byDefault'>;\n\t}\n}\n", "import type { Cache } from './cache/core/cache.ts';\nimport type { AnyColumn } from './column.ts';\nimport { Column } from './column.ts';\nimport { is } from './entity.ts';\nimport type { Logger } from './logger.ts';\nimport type { SelectedFieldsFlat, SelectedFieldsOrdered } from './operations.ts';\nimport type { TableLike } from './query-builders/select.types.ts';\nimport type { AnyRelations, EmptyRelations } from './relations.ts';\nimport { Param, SQL, View } from './sql/sql.ts';\nimport type { DriverValueDecoder } from './sql/sql.ts';\nimport { Subquery } from './subquery.ts';\nimport { getTableName, Table } from './table.ts';\nimport { ViewBaseConfig } from './view-common.ts';\n\n/** @internal */\nexport function mapResultRow<TResult>(\n\tcolumns: SelectedFieldsOrdered<AnyColumn>,\n\trow: unknown[] | (readonly unknown[]),\n\tjoinsNotNullableMap: Record<string, boolean> | undefined,\n): TResult {\n\t// Key -> nested object key, value -> table name if all fields in the nested object are from the same table, false otherwise\n\tconst nullifyMap: Record<string, string | false> = {};\n\n\tconst result = columns.reduce<Record<string, any>>(\n\t\t(result, { path, field }, columnIndex) => {\n\t\t\tlet decoder: DriverValueDecoder<unknown, unknown>;\n\t\t\tif (is(field, Column)) {\n\t\t\t\tdecoder = field;\n\t\t\t} else if (is(field, SQL)) {\n\t\t\t\tdecoder = field.decoder;\n\t\t\t} else if (is(field, Subquery)) {\n\t\t\t\tdecoder = field._.sql.decoder;\n\t\t\t} else {\n\t\t\t\tdecoder = field.sql.decoder;\n\t\t\t}\n\t\t\tlet node = result;\n\t\t\tfor (const [pathChunkIndex, pathChunk] of path.entries()) {\n\t\t\t\tif (pathChunkIndex < path.length - 1) {\n\t\t\t\t\tif (!(pathChunk in node)) {\n\t\t\t\t\t\tnode[pathChunk] = {};\n\t\t\t\t\t}\n\t\t\t\t\tnode = node[pathChunk];\n\t\t\t\t} else {\n\t\t\t\t\tconst rawValue = row[columnIndex]!;\n\t\t\t\t\tconst value = node[pathChunk] = rawValue === null ? null : decoder.mapFromDriverValue(rawValue);\n\n\t\t\t\t\tif (joinsNotNullableMap && is(field, Column) && path.length === 2) {\n\t\t\t\t\t\tconst objectName = path[0]!;\n\t\t\t\t\t\tif (!(objectName in nullifyMap)) {\n\t\t\t\t\t\t\tnullifyMap[objectName] = value === null ? getTableName(field.table) : false;\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\ttypeof nullifyMap[objectName] === 'string' && nullifyMap[objectName] !== getTableName(field.table)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tnullifyMap[objectName] = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\t{},\n\t);\n\n\t// Nullify all nested objects from nullifyMap that are nullable\n\tif (joinsNotNullableMap && Object.keys(nullifyMap).length > 0) {\n\t\tfor (const [objectName, tableName] of Object.entries(nullifyMap)) {\n\t\t\tif (typeof tableName === 'string' && !joinsNotNullableMap[tableName]) {\n\t\t\t\tresult[objectName] = null;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result as TResult;\n}\n\n/** @internal */\nexport function orderSelectedFields<TColumn extends AnyColumn>(\n\tfields: Record<string, unknown>,\n\tpathPrefix?: string[],\n): SelectedFieldsOrdered<TColumn> {\n\treturn Object.entries(fields).reduce<SelectedFieldsOrdered<AnyColumn>>((result, [name, field]) => {\n\t\tif (typeof name !== 'string') {\n\t\t\treturn result;\n\t\t}\n\n\t\tconst newPath = pathPrefix ? [...pathPrefix, name] : [name];\n\t\tif (is(field, Column) || is(field, SQL) || is(field, SQL.Aliased) || is(field, Subquery)) {\n\t\t\tresult.push({ path: newPath, field });\n\t\t} else if (is(field, Table)) {\n\t\t\tresult.push(...orderSelectedFields(field[Table.Symbol.Columns], newPath));\n\t\t} else {\n\t\t\tresult.push(...orderSelectedFields(field as Record<string, unknown>, newPath));\n\t\t}\n\t\treturn result;\n\t}, []) as SelectedFieldsOrdered<TColumn>;\n}\n\nexport function haveSameKeys(left: Record<string, unknown>, right: Record<string, unknown>) {\n\tconst leftKeys = Object.keys(left);\n\tconst rightKeys = Object.keys(right);\n\n\tif (leftKeys.length !== rightKeys.length) {\n\t\treturn false;\n\t}\n\n\tfor (const [index, key] of leftKeys.entries()) {\n\t\tif (key !== rightKeys[index]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/** @internal */\nexport function mapUpdateSet(table: Table, values: Record<string, unknown>): UpdateSet {\n\tconst entries: [string, UpdateSet[string]][] = Object.entries(values)\n\t\t.filter(([, value]) => value !== undefined)\n\t\t.map(([key, value]) => {\n\t\t\t// eslint-disable-next-line unicorn/prefer-ternary\n\t\t\tif (is(value, SQL) || is(value, Column)) {\n\t\t\t\treturn [key, value];\n\t\t\t} else {\n\t\t\t\treturn [key, new Param(value, table[Table.Symbol.Columns][key])];\n\t\t\t}\n\t\t});\n\n\tif (entries.length === 0) {\n\t\tthrow new Error('No values to set');\n\t}\n\n\treturn Object.fromEntries(entries);\n}\n\nexport type UpdateSet = Record<string, SQL | Param | AnyColumn | null | undefined>;\n\nexport type OneOrMany<T> = T | T[];\n\nexport type Update<T, TUpdate> =\n\t& {\n\t\t[K in Exclude<keyof T, keyof TUpdate>]: T[K];\n\t}\n\t& TUpdate;\n\nexport type Simplify<T> =\n\t& {\n\t\t// @ts-ignore - \"Type parameter 'K' has a circular constraint\", not sure why\n\t\t[K in keyof T]: T[K];\n\t}\n\t& {};\n\nexport type Not<T extends boolean> = T extends true ? false : true;\n\nexport type IsNever<T> = [T] extends [never] ? true : false;\n\nexport type IsUnion<T, U extends T = T> = (T extends any ? (U extends T ? false : true) : never) extends false ? false\n\t: true;\n\nexport type SingleKeyObject<T, TError extends string, K = keyof T> = IsNever<K> extends true ? never\n\t: IsUnion<K> extends true ? DrizzleTypeError<TError>\n\t: T;\n\nexport type FromSingleKeyObject<T, Result, TError extends string, K = keyof T> = IsNever<K> extends true ? never\n\t: IsUnion<K> extends true ? DrizzleTypeError<TError>\n\t: Result;\n\nexport type SimplifyMappedType<T> = [T] extends [unknown] ? T : never;\n\nexport type ShallowRecord<K extends keyof any, T> = SimplifyMappedType<{ [P in K]: T }>;\n\nexport type Assume<T, U> = T extends U ? T : U;\n\nexport type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true : false;\n\nexport interface DrizzleTypeError<T extends string> {\n\t$drizzleTypeError: T;\n}\n\nexport type ValueOrArray<T> = T | T[];\n\n/** @internal */\nexport function applyMixins(baseClass: any, extendedClasses: any[]) {\n\tfor (const extendedClass of extendedClasses) {\n\t\tfor (const name of Object.getOwnPropertyNames(extendedClass.prototype)) {\n\t\t\tif (name === 'constructor') continue;\n\n\t\t\tObject.defineProperty(\n\t\t\t\tbaseClass.prototype,\n\t\t\t\tname,\n\t\t\t\tObject.getOwnPropertyDescriptor(extendedClass.prototype, name) || Object.create(null),\n\t\t\t);\n\t\t}\n\t}\n}\n\nexport type Or<T1, T2> = T1 extends true ? true : T2 extends true ? true : false;\n\nexport type IfThenElse<If, Then, Else> = If extends true ? Then : Else;\n\nexport type PromiseOf<T> = T extends Promise<infer U> ? U : T;\n\nexport type Writable<T> = {\n\t-readonly [P in keyof T]: T[P];\n};\n\nexport type NonArray<T> = T extends any[] ? never : T;\n\n/**\n * @deprecated\n * Use `getColumns` instead\n */\nexport function getTableColumns<T extends Table>(table: T): T['_']['columns'] {\n\treturn table[Table.Symbol.Columns];\n}\n\nexport function getViewSelectedFields<T extends View>(view: T): T['_']['selectedFields'] {\n\treturn view[ViewBaseConfig].selectedFields;\n}\n\nexport function getColumns<T extends Table | View | Subquery>(\n\ttable: T,\n): T extends Table ? T['_']['columns']\n\t: T extends View ? T['_']['selectedFields']\n\t: T extends Subquery ? T['_']['selectedFields']\n\t: never\n{\n\treturn (is(table, Table)\n\t\t? table[Table.Symbol.Columns]\n\t\t: is(table, View)\n\t\t? table[ViewBaseConfig].selectedFields\n\t\t: table._.selectedFields) as any;\n}\n\n/** @internal */\nexport function getTableLikeName(table: TableLike): string | undefined {\n\treturn is(table, Subquery)\n\t\t? table._.alias\n\t\t: is(table, View)\n\t\t? table[ViewBaseConfig].name\n\t\t: is(table, SQL)\n\t\t? undefined\n\t\t: table[Table.Symbol.IsAlias]\n\t\t? table[Table.Symbol.Name]\n\t\t: table[Table.Symbol.BaseName];\n}\n\nexport type ColumnsWithTable<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends AnyColumn<{ tableName: TTableName }>[],\n> = { [Key in keyof TColumns]: AnyColumn<{ tableName: TForeignTableName }> };\n\nexport type Casing = 'snake_case' | 'camelCase';\n\nexport interface DrizzleConfig<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTRelationConfigs extends AnyRelations = EmptyRelations,\n> {\n\tlogger?: boolean | Logger | undefined;\n\tschema?: TSchema | undefined;\n\tcasing?: Casing | undefined;\n\trelations?: TRelationConfigs | undefined;\n\tcache?: Cache | undefined;\n}\nexport type ValidateShape<T, ValidShape, TResult = T> = T extends ValidShape\n\t? Exclude<keyof T, keyof ValidShape> extends never ? TResult\n\t: DrizzleTypeError<\n\t\t`Invalid key(s): ${Exclude<(keyof T) & (string | number | bigint | boolean | null | undefined), keyof ValidShape>}`\n\t>\n\t: never;\n\nexport type KnownKeysOnly<T, U> = {\n\t[K in keyof T]: K extends keyof U ? T[K] : never;\n};\n\nexport type IsAny<T> = 0 extends (1 & T) ? true : false;\n\n/** @internal */\nexport function getColumnNameAndConfig<\n\tTConfig extends Record<string, any> | undefined,\n>(a: string | TConfig | undefined, b: TConfig | undefined) {\n\treturn {\n\t\tname: typeof a === 'string' && a.length > 0 ? a : '' as string,\n\t\tconfig: typeof a === 'object' ? a : b as TConfig,\n\t};\n}\n\nexport type IfNotImported<T, Y, N> = unknown extends T ? Y : N;\n\nexport type ImportTypeError<TPackageName extends string> =\n\t`Please install \\`${TPackageName}\\` to allow Drizzle ORM to connect to the database`;\n\nexport type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Keys extends any\n\t? Required<Pick<T, Keys>> & Partial<Omit<T, Keys>>\n\t: never;\n\ntype ExpectedConfigShape = {\n\tlogger?: boolean | {\n\t\tlogQuery(query: string, params: unknown[]): void;\n\t} | undefined;\n\tschema?: Record<string, never> | undefined;\n\trelations?: AnyRelations | undefined;\n\tcasing?: 'snake_case' | 'camelCase' | undefined;\n};\n\n// If this errors, you must update config shape checker function with new config specs\nconst _: DrizzleConfig<any, any> = {} as ExpectedConfigShape;\nconst __: ExpectedConfigShape = {} as DrizzleConfig;\n\nexport function isConfig(data: any): boolean {\n\tif (typeof data !== 'object' || data === null) return false;\n\n\tif (data.constructor.name !== 'Object') return false;\n\n\tif ('logger' in data) {\n\t\tconst type = typeof data['logger'];\n\t\tif (\n\t\t\ttype !== 'boolean' && (type !== 'object' || typeof data['logger']['logQuery'] !== 'function')\n\t\t\t&& type !== 'undefined'\n\t\t) return false;\n\n\t\treturn true;\n\t}\n\n\tif ('schema' in data) {\n\t\tconst type = typeof data['schema'];\n\t\tif (type !== 'object' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif ('relations' in data) {\n\t\tconst type = typeof data['relations'];\n\t\tif (type !== 'object' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif ('casing' in data) {\n\t\tconst type = typeof data['casing'];\n\t\tif (type !== 'string' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif ('mode' in data) {\n\t\tif (data['mode'] !== 'default' || data['mode'] !== 'planetscale' || data['mode'] !== undefined) return false;\n\n\t\treturn true;\n\t}\n\n\tif ('connection' in data) {\n\t\tconst type = typeof data['connection'];\n\t\tif (type !== 'string' && type !== 'object' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif ('client' in data) {\n\t\tconst type = typeof data['client'];\n\t\tif (type !== 'object' && type !== 'function' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif (Object.keys(data).length === 0) return true;\n\n\treturn false;\n}\n\nexport type NeonAuthToken = string | (() => string | Promise<string>);\n\nexport const textDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder();\n\nexport function assertUnreachable(_x: never | undefined): never {\n\tthrow new Error(\"Didn't expect to get here\");\n}\n\nexport function isWithEnum(column: Column<any>): column is typeof column & { enumValues: [string, ...string[]] };\nexport function isWithEnum(value: unknown): value is { enumValues: [string, ...string[]] };\nexport function isWithEnum(value: unknown): boolean {\n\treturn ((typeof value === 'object' && value !== null) || typeof value === 'function') && 'enumValues' in value\n\t\t&& Array.isArray(value.enumValues)\n\t\t&& value.enumValues.length > 0;\n}\n\nexport type Literal = string | number | boolean | null;\nexport type Json = Literal | { [key: string]: any } | any[];\n\nexport type ColumnIsGeneratedAlwaysAs<TColumn> = TColumn extends Column<any>\n\t? TColumn['_']['identity'] extends 'always' ? true\n\t: TColumn['_'] extends { generated: undefined } ? false\n\t: TColumn['_']['generated'] extends { type: 'byDefault' } ? false\n\t: true\n\t: false;\n\nexport type GetSelection<T extends SelectedFieldsFlat<Column<any>> | Table<any> | View> = T extends Table<any>\n\t? T['_']['columns']\n\t: T extends View ? T['_']['selectedFields']\n\t: T;\n\nexport type RemoveNeverElements<T extends any[]> = T extends [infer First, ...infer Rest]\n\t? IsNever<First> extends true ? RemoveNeverElements<Rest>\n\t: [First, ...RemoveNeverElements<Rest>]\n\t: [];\n\nexport type HasBaseColumn<TColumn> = TColumn extends { _: { baseColumn: Column | undefined } }\n\t? IsNever<TColumn['_']['baseColumn']> extends false ? true\n\t: false\n\t: false;\n\nexport type EnumValuesToEnum<TEnumValues extends [string, ...string[]]> = { [K in TEnumValues[number]]: K };\n\nexport type EnumValuesToReadonlyEnum<TEnumValues extends [string, ...string[]]> = {\n\treadonly [K in TEnumValues[number]]: K;\n};\n\nexport const CONSTANTS = {\n\tINT8_MIN: -128,\n\tINT8_MAX: 127,\n\tINT8_UNSIGNED_MAX: 255,\n\tINT16_MIN: -32768,\n\tINT16_MAX: 32767,\n\tINT16_UNSIGNED_MAX: 65535,\n\tINT24_MIN: -8388608,\n\tINT24_MAX: 8388607,\n\tINT24_UNSIGNED_MAX: 16777215,\n\tINT32_MIN: -2147483648,\n\tINT32_MAX: 2147483647,\n\tINT32_UNSIGNED_MAX: 4294967295,\n\tINT48_MIN: -140737488355328,\n\tINT48_MAX: 140737488355327,\n\tINT48_UNSIGNED_MAX: 281474976710655,\n\tINT64_MIN: -9223372036854775808n,\n\tINT64_MAX: 9223372036854775807n,\n\tINT64_UNSIGNED_MAX: 18446744073709551615n,\n};\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn } from './common.ts';\nimport { PgIntColumnBuilder } from './int.common.ts';\n\nexport class PgBigInt53Builder extends PgIntColumnBuilder<{\n\tdataType: 'number int53';\n\tdata: number;\n\tdriverParam: number | string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgBigInt53Builder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'number int53', 'PgBigInt53');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgBigInt53(table, this.config as any);\n\t}\n}\n\nexport class PgBigInt53 extends PgColumn<'number int53'> {\n\tstatic override readonly [entityKind]: string = 'PgBigInt53';\n\n\tgetSQLType(): string {\n\t\treturn 'bigint';\n\t}\n\n\toverride mapFromDriverValue(value: number | string): number {\n\t\tif (typeof value === 'number') {\n\t\t\treturn value;\n\t\t}\n\t\treturn Number(value);\n\t}\n}\n\nexport class PgBigInt64Builder extends PgIntColumnBuilder<{\n\tdataType: 'bigint int64';\n\tdata: bigint;\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgBigInt64Builder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'bigint int64', 'PgBigInt64');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgBigInt64(table, this.config as any);\n\t}\n}\n\nexport class PgBigInt64 extends PgColumn<'bigint int64'> {\n\tstatic override readonly [entityKind]: string = 'PgBigInt64';\n\n\tgetSQLType(): string {\n\t\treturn 'bigint';\n\t}\n\n\t// eslint-disable-next-line unicorn/prefer-native-coercion-functions\n\toverride mapFromDriverValue(value: string): bigint {\n\t\treturn BigInt(value);\n\t}\n}\n\nexport class PgBigIntStringBuilder extends PgIntColumnBuilder<{\n\tdataType: 'string int64';\n\tdata: string;\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgBigIntStringBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'string int64', 'PgBigIntString');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgBigIntString(table, this.config as any);\n\t}\n}\n\nexport class PgBigIntString extends PgColumn<'string int64'> {\n\tstatic override readonly [entityKind]: string = 'PgBigIntString';\n\n\tgetSQLType(): string {\n\t\treturn 'bigint';\n\t}\n\n\toverride mapFromDriverValue(value: string | number): string {\n\t\tif (typeof value === 'string') return value;\n\n\t\treturn String(value);\n\t}\n}\n\nexport interface PgBigIntConfig<T extends 'number' | 'bigint' | 'string' = 'number' | 'bigint' | 'string'> {\n\tmode: T;\n}\n\nexport function bigint<TMode extends PgBigIntConfig['mode']>(\n\tconfig: PgBigIntConfig<TMode>,\n): TMode extends 'string' ? PgBigIntStringBuilder : TMode extends 'bigint' ? PgBigInt64Builder : PgBigInt53Builder;\nexport function bigint<TMode extends PgBigIntConfig['mode']>(\n\tname: string,\n\tconfig: PgBigIntConfig<TMode>,\n): TMode extends 'string' ? PgBigIntStringBuilder : TMode extends 'bigint' ? PgBigInt64Builder : PgBigInt53Builder;\nexport function bigint(a: string | PgBigIntConfig, b?: PgBigIntConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgBigIntConfig>(a, b);\n\tif (config.mode === 'number') {\n\t\treturn new PgBigInt53Builder(name);\n\t}\n\tif (config.mode === 'string') {\n\t\treturn new PgBigIntStringBuilder(name);\n\t}\n\treturn new PgBigInt64Builder(name);\n}\n", "import { entityKind } from '~/entity.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport type { PgTable } from '../table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgBigSerial53Builder extends PgColumnBuilder<{\n\tdataType: 'number int53';\n\tdata: number;\n\tdriverParam: number;\n\n\tnotNull: true;\n\thasDefault: true;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgBigSerial53Builder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'number int53', 'PgBigSerial53');\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.notNull = true;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgBigSerial53(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgBigSerial53 extends PgColumn<'number int53'> {\n\tstatic override readonly [entityKind]: string = 'PgBigSerial53';\n\n\tgetSQLType(): string {\n\t\treturn 'bigserial';\n\t}\n\n\toverride mapFromDriverValue(value: number): number {\n\t\tif (typeof value === 'number') {\n\t\t\treturn value;\n\t\t}\n\t\treturn Number(value);\n\t}\n}\n\nexport class PgBigSerial64Builder extends PgColumnBuilder<{\n\tdataType: 'bigint int64';\n\tdata: bigint;\n\tdriverParam: string;\n\tnotNull: true;\n\thasDefault: true;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgBigSerial64Builder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'bigint int64', 'PgBigSerial64');\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.notNull = true;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgBigSerial64(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgBigSerial64 extends PgColumn<'bigint int64'> {\n\tstatic override readonly [entityKind]: string = 'PgBigSerial64';\n\n\tgetSQLType(): string {\n\t\treturn 'bigserial';\n\t}\n\n\t// eslint-disable-next-line unicorn/prefer-native-coercion-functions\n\toverride mapFromDriverValue(value: string): bigint {\n\t\treturn BigInt(value);\n\t}\n}\n\nexport interface PgBigSerialConfig<T extends 'number' | 'bigint' = 'number' | 'bigint'> {\n\tmode: T;\n}\n\nexport function bigserial<TMode extends PgBigSerialConfig['mode']>(\n\tconfig: PgBigSerialConfig<TMode>,\n): TMode extends 'number' ? PgBigSerial53Builder : PgBigSerial64Builder;\nexport function bigserial<TMode extends PgBigSerialConfig['mode']>(\n\tname: string,\n\tconfig: PgBigSerialConfig<TMode>,\n): TMode extends 'number' ? PgBigSerial53Builder : PgBigSerial64Builder;\nexport function bigserial(a: string | PgBigSerialConfig, b?: PgBigSerialConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgBigSerialConfig>(a, b);\n\tif (config.mode === 'number') {\n\t\treturn new PgBigSerial53Builder(name);\n\t}\n\treturn new PgBigSerial64Builder(name);\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgBooleanBuilder extends PgColumnBuilder<{\n\tdataType: 'boolean';\n\tdata: boolean;\n\tdriverParam: boolean;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgBooleanBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'boolean', 'PgBoolean');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgBoolean(table, this.config as any);\n\t}\n}\n\nexport class PgBoolean extends PgColumn<'boolean'> {\n\tstatic override readonly [entityKind]: string = 'PgBoolean';\n\n\tgetSQLType(): string {\n\t\treturn 'boolean';\n\t}\n}\n\nexport function boolean(name?: string): PgBooleanBuilder {\n\treturn new PgBooleanBuilder(name ?? '');\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { type Equal, getColumnNameAndConfig, type Writable } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\ntype PgCharBuilderConfig<TEnum extends [string, ...string[]]> = Equal<TEnum, [string, ...string[]]> extends true\n\t? { dataType: 'string'; data: string; driverParam: string }\n\t: { dataType: 'string enum'; data: TEnum[number]; enumValues: TEnum; driverParam: string };\n\nexport class PgCharBuilder<TEnum extends [string, ...string[]] = [string, ...string[]]> extends PgColumnBuilder<\n\tPgCharBuilderConfig<TEnum>,\n\t{ enumValues: TEnum; length: number; setLength: boolean }\n> {\n\tstatic override readonly [entityKind]: string = 'PgCharBuilder';\n\n\tconstructor(name: string, config: PgCharConfig<TEnum>) {\n\t\tsuper(name, config.enum?.length ? 'string enum' : 'string', 'PgChar');\n\t\tthis.config.length = config.length ?? 1;\n\t\tthis.config.setLength = config.length !== undefined;\n\t\tthis.config.enumValues = config.enum as TEnum;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgChar(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgChar<TEnum extends [string, ...string[]] = [string, ...string[]]>\n\textends PgColumn<Equal<TEnum, [string, ...string[]]> extends true ? 'string' : 'string enum'>\n{\n\tstatic override readonly [entityKind]: string = 'PgChar';\n\n\toverride readonly enumValues: TEnum;\n\tprivate readonly setLength: boolean;\n\n\tconstructor(table: PgTable<any>, config: PgCharBuilder<TEnum>['config']) {\n\t\tsuper(table, config as any);\n\t\tthis.enumValues = config.enumValues;\n\t\tthis.setLength = config.setLength;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.setLength ? `char(${this.length})` : `char`;\n\t}\n}\n\nexport interface PgCharConfig<\n\tTEnum extends readonly string[] | string[] | undefined = readonly string[] | string[] | undefined,\n> {\n\tenum?: TEnum;\n\tlength?: number;\n}\n\nexport function char(): PgCharBuilder;\nexport function char(name: string): PgCharBuilder;\nexport function char(config: { length?: number }): PgCharBuilder;\nexport function char(name: string, config: { length?: number }): PgCharBuilder;\nexport function char<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tconfig: PgCharConfig<T | Writable<T>> & { enum: T | Writable<T> },\n): PgCharBuilder<Writable<T>>;\nexport function char<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tname: string,\n\tconfig: PgCharConfig<T | Writable<T>> & { enum: T | Writable<T> },\n): PgCharBuilder<Writable<T>>;\nexport function char(a?: string | PgCharConfig, b: PgCharConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<PgCharConfig>(a, b);\n\treturn new PgCharBuilder(name, config as any);\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '../table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgCidrBuilder extends PgColumnBuilder<{\n\tdataType: 'string cidr';\n\tdata: string;\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgCidrBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'string cidr', 'PgCidr');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgCidr(table, this.config as any);\n\t}\n}\n\nexport class PgCidr extends PgColumn<'string cidr'> {\n\tstatic override readonly [entityKind]: string = 'PgCidr';\n\n\tgetSQLType(): string {\n\t\treturn 'cidr';\n\t}\n}\n\nexport function cidr(name?: string): PgCidrBuilder {\n\treturn new PgCidrBuilder(name ?? '');\n}\n", "import type { ColumnBuilderBaseConfig } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport type { SQL, SQLGenerator } from '~/sql/sql.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { parsePgArray } from '../utils/array.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type ConvertCustomConfig<T extends Partial<CustomTypeValues>> =\n\t& {\n\t\tdataType: 'custom';\n\t\tdata: T['data'];\n\t\tdriverParam: T['driverData'];\n\t}\n\t& (T['notNull'] extends true ? { notNull: true } : {})\n\t& (T['default'] extends true ? { hasDefault: true } : {});\n\nexport interface PgCustomColumnInnerConfig {\n\tcustomTypeValues: CustomTypeValues;\n}\n\nexport class PgCustomColumnBuilder<T extends ColumnBuilderBaseConfig<'custom'>> extends PgColumnBuilder<\n\tT,\n\t{\n\t\tfieldConfig: CustomTypeValues['config'];\n\t\tcustomTypeParams: CustomTypeParams<any>;\n\t}\n> {\n\tstatic override readonly [entityKind]: string = 'PgCustomColumnBuilder';\n\n\tconstructor(\n\t\tname: string,\n\t\tfieldConfig: CustomTypeValues['config'],\n\t\tcustomTypeParams: CustomTypeParams<any>,\n\t) {\n\t\tsuper(name, 'custom', 'PgCustomColumn');\n\t\tthis.config.fieldConfig = fieldConfig;\n\t\tthis.config.customTypeParams = customTypeParams;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgCustomColumn(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgCustomColumn<T extends ColumnBuilderBaseConfig<'custom'>> extends PgColumn<'custom'> {\n\tstatic override readonly [entityKind]: string = 'PgCustomColumn';\n\n\tprivate sqlName: string;\n\tprivate mapTo?: (value: T['data']) => T['driverParam'];\n\tprivate mapFrom?: (value: T['driverParam']) => T['data'];\n\tprivate mapJson?: (value: unknown) => T['data'];\n\tprivate forJsonSelect?: (identifier: SQL, sql: SQLGenerator, arrayDimensions?: number) => SQL;\n\n\tconstructor(\n\t\ttable: PgTable<any>,\n\t\tconfig: PgCustomColumnBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config as any);\n\t\tthis.sqlName = config.customTypeParams.dataType(config.fieldConfig);\n\t\tthis.mapTo = config.customTypeParams.toDriver;\n\t\tthis.mapFrom = config.customTypeParams.fromDriver;\n\t\tthis.mapJson = config.customTypeParams.fromJson;\n\t\tthis.forJsonSelect = config.customTypeParams.forJsonSelect;\n\n\t\t// Wrap mapFromJsonValue with array handling if this is an array column\n\t\tif (this.dimensions) {\n\t\t\t// Create a mapper function that handles a single element\n\t\t\t// This uses the raw mapJson or mapFrom functions, not the wrapped mapFromDriverValue\n\t\t\tconst elementMapper = (value: unknown): unknown => {\n\t\t\t\tif (typeof this.mapJson === 'function') {\n\t\t\t\t\treturn this.mapJson(value);\n\t\t\t\t}\n\t\t\t\tif (typeof this.mapFrom === 'function') {\n\t\t\t\t\treturn this.mapFrom(value as T['driverParam']);\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t};\n\n\t\t\tthis.mapFromJsonValue = (value: unknown): unknown => {\n\t\t\t\tif (value === null) return value;\n\t\t\t\t// Parse string representation if needed\n\t\t\t\tconst arr = typeof value === 'string' ? parsePgArray(value) : value as unknown[];\n\t\t\t\treturn this.mapJsonArrayElements(arr, elementMapper, this.dimensions);\n\t\t\t};\n\t\t}\n\t}\n\n\t/** @internal */\n\tprivate mapJsonArrayElements(value: unknown, mapper: (v: unknown) => unknown, depth: number): unknown {\n\t\tif (depth > 0 && Array.isArray(value)) {\n\t\t\treturn value.map((v) => v === null ? null : this.mapJsonArrayElements(v, mapper, depth - 1));\n\t\t}\n\t\treturn mapper(value);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.sqlName;\n\t}\n\n\toverride mapFromDriverValue(value: T['driverParam']): T['data'] {\n\t\treturn typeof this.mapFrom === 'function' ? this.mapFrom(value) : value as T['data'];\n\t}\n\n\tmapFromJsonValue(value: unknown): T['data'] {\n\t\treturn typeof this.mapJson === 'function' ? this.mapJson(value) : this.mapFromDriverValue(value) as T['data'];\n\t}\n\n\tjsonSelectIdentifier(identifier: SQL, sql: SQLGenerator, arrayDimensions?: number): SQL {\n\t\tif (typeof this.forJsonSelect === 'function') return this.forJsonSelect(identifier, sql, arrayDimensions);\n\n\t\tconst rawType = this.getSQLType().toLowerCase();\n\t\tconst parenPos = rawType.indexOf('(');\n\t\tconst type = (parenPos + 1) ? rawType.slice(0, parenPos) : rawType;\n\n\t\tswitch (type) {\n\t\t\tcase 'bytea':\n\t\t\tcase 'geometry':\n\t\t\tcase 'timestamp':\n\t\t\tcase 'numeric':\n\t\t\tcase 'bigint': {\n\t\t\t\tconst arrVal = '[]'.repeat(arrayDimensions ?? 0);\n\n\t\t\t\treturn sql`${identifier}::text${sql.raw(arrVal).if(arrayDimensions)}`;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\treturn identifier;\n\t\t\t}\n\t\t}\n\t}\n\n\toverride mapToDriverValue(value: T['data']): T['driverParam'] {\n\t\treturn typeof this.mapTo === 'function' ? this.mapTo(value) : value as T['data'];\n\t}\n}\n\nexport interface CustomTypeValues {\n\t/**\n\t * Required type for custom column, that will infer proper type model\n\t *\n\t * Examples:\n\t *\n\t * If you want your column to be `string` type after selecting/or on inserting - use `data: string`. Like `text`, `varchar`\n\t *\n\t * If you want your column to be `number` type after selecting/or on inserting - use `data: number`. Like `integer`\n\t */\n\tdata: unknown;\n\n\t/**\n\t * Type helper, that represents what type database driver is accepting for specific database data type\n\t */\n\tdriverData?: unknown;\n\n\t/**\n\t * Type helper, that represents what type database driver is returning for specific database data type\n\t *\n\t * Needed only in case driver's output and input for type differ\n\t *\n\t * Defaults to {@link driverData}\n\t */\n\tdriverOutput?: unknown;\n\n\t/**\n\t * Type helper, that represents what type field returns after being aggregated to JSON\n\t */\n\tjsonData?: unknown;\n\n\t/**\n\t * What config type should be used for {@link CustomTypeParams} `dataType` generation\n\t */\n\tconfig?: Record<string, any>;\n\n\t/**\n\t * Whether the config argument should be required or not\n\t * @default false\n\t */\n\tconfigRequired?: boolean;\n\n\t/**\n\t * If your custom data type should be notNull by default you can use `notNull: true`\n\t *\n\t * @example\n\t * const customSerial = customType<{ data: number, notNull: true, default: true }>({\n\t * \t dataType() {\n\t * \t return 'serial';\n\t * },\n\t * });\n\t */\n\tnotNull?: boolean;\n\n\t/**\n\t * If your custom data type has default you can use `default: true`\n\t *\n\t * @example\n\t * const customSerial = customType<{ data: number, notNull: true, default: true }>({\n\t * \t dataType() {\n\t * \t return 'serial';\n\t * },\n\t * });\n\t */\n\tdefault?: boolean;\n}\n\nexport interface CustomTypeParams<T extends CustomTypeValues> {\n\t/**\n\t * Database data type string representation, that is used for migrations\n\t * @example\n\t * ```\n\t * `jsonb`, `text`\n\t * ```\n\t *\n\t * If database data type needs additional params you can use them from `config` param\n\t * @example\n\t * ```\n\t * `varchar(256)`, `numeric(2,3)`\n\t * ```\n\t *\n\t * To make `config` be of specific type please use config generic in {@link CustomTypeValues}\n\t *\n\t * @example\n\t * Usage example\n\t * ```\n\t * dataType() {\n\t * return 'boolean';\n\t * },\n\t * ```\n\t * Or\n\t * ```\n\t * dataType(config) {\n\t * \t return typeof config.length !== 'undefined' ? `varchar(${config.length})` : `varchar`;\n\t * \t }\n\t * ```\n\t */\n\tdataType: (config: T['config'] | (Equal<T['configRequired'], true> extends true ? never : undefined)) => string;\n\n\t/**\n\t * Optional mapping function, that is used to transform inputs from desired to be used in code format to one suitable for driver\n\t * @example\n\t * For example, when using jsonb we need to map JS/TS object to string before writing to database\n\t * ```\n\t * toDriver(value: TData): string {\n\t * \t return JSON.stringify(value);\n\t * }\n\t * ```\n\t */\n\ttoDriver?: (value: T['data']) => T['driverData'] | SQL;\n\n\t/**\n\t * Optional mapping function, that is used for transforming data returned by driver to desired column's output format\n\t * @example\n\t * For example, when using timestamp we need to map string Date representation to JS Date\n\t * ```\n\t * fromDriver(value: string): Date {\n\t * \treturn new Date(value);\n\t * }\n\t * ```\n\t *\n\t * It'll cause the returned data to change from:\n\t * ```\n\t * {\n\t * \tcustomField: \"2025-04-07T03:25:16.635Z\";\n\t * }\n\t * ```\n\t * to:\n\t * ```\n\t * {\n\t * \tcustomField: new Date(\"2025-04-07T03:25:16.635Z\");\n\t * }\n\t * ```\n\t */\n\tfromDriver?: (value: 'driverOutput' extends keyof T ? T['driverOutput'] : T['driverData']) => T['data'];\n\n\t/**\n\t * Optional mapping function, that is used for transforming data returned by transofmed to JSON in database data to desired format\n\t *\n\t * Used by [relational queries](https://orm.drizzle.team/docs/rqb-v2)\n\t *\n\t * Defaults to {@link fromDriver} function\n\t * @example\n\t * For example, when querying bigint column via [RQB](https://orm.drizzle.team/docs/rqb-v2) or [JSON functions](https://orm.drizzle.team/docs/json-functions), the result field will be returned as it's string representation, as opposed to bigint from regular query\n\t * To handle that, we need a separate function to handle such field's mapping:\n\t * ```\n\t * fromJson(value: string): bigint {\n\t * \treturn BigInt(value);\n\t * },\n\t * ```\n\t *\n\t * It'll cause the returned data to change from:\n\t * ```\n\t * {\n\t * \tcustomField: \"5044565289845416380\";\n\t * }\n\t * ```\n\t * to:\n\t * ```\n\t * {\n\t * \tcustomField: 5044565289845416380n;\n\t * }\n\t * ```\n\t */\n\tfromJson?: (value: T['jsonData']) => T['data'];\n\n\t/**\n\t * Optional selection modifier function, that is used for modifying selection of column inside [JSON functions](https://orm.drizzle.team/docs/json-functions)\n\t *\n\t * Additional mapping that could be required for such scenarios can be handled using {@link fromJson} function\n\t *\n\t * Used by [relational queries](https://orm.drizzle.team/docs/rqb-v2)\n\t *\n\t * Following types are being casted to text by default: `bytea`, `geometry`, `timestamp`, `numeric`, `bigint`\n\t * @example\n\t * For example, when using bigint we need to cast field to text to preserve data integrity\n\t * ```\n\t * forJsonSelect(identifier: SQL, sql: SQLGenerator, arrayDimensions?: number): SQL {\n\t * \treturn sql`${identifier}::text`\n\t * },\n\t * ```\n\t *\n\t * This will change query from:\n\t * ```\n\t * SELECT\n\t * \trow_to_json(\"t\".*)\n\t * \tFROM\n\t * \t(\n\t * \t\tSELECT\n\t * \t\t\"table\".\"custom_bigint\" AS \"bigint\"\n\t * \t\tFROM\n\t * \t\t\"table\"\n\t * \t) AS \"t\"\n\t * ```\n\t * to:\n\t * ```\n\t * SELECT\n\t * \trow_to_json(\"t\".*)\n\t * \tFROM\n\t * \t(\n\t * \t\tSELECT\n\t * \t\t\"table\".\"custom_bigint\"::text AS \"bigint\"\n\t * \t\tFROM\n\t * \t\t\"table\"\n\t * \t) AS \"t\"\n\t * ```\n\t *\n\t * Returned by query object will change from:\n\t * ```\n\t * {\n\t * \tbigint: 5044565289845416000; // Partial data loss due to direct conversion to JSON format\n\t * }\n\t * ```\n\t * to:\n\t * ```\n\t * {\n\t * \tbigint: \"5044565289845416380\"; // Data is preserved due to conversion of field to text before JSON-ification\n\t * }\n\t * ```\n\t */\n\tforJsonSelect?: (identifier: SQL, sql: SQLGenerator, arrayDimensions?: number) => SQL;\n}\n\n/**\n * Custom pg database data type generator\n */\nexport function customType<T extends CustomTypeValues = CustomTypeValues>(\n\tcustomTypeParams: CustomTypeParams<T>,\n): Equal<T['configRequired'], true> extends true ? {\n\t\t<TConfig extends Record<string, any> & T['config']>(\n\t\t\tfieldConfig: TConfig,\n\t\t): PgCustomColumnBuilder<ConvertCustomConfig<T>>;\n\t\t(\n\t\t\tdbName: string,\n\t\t\tfieldConfig: T['config'],\n\t\t): PgCustomColumnBuilder<ConvertCustomConfig<T>>;\n\t}\n\t: {\n\t\t<TConfig extends Record<string, any> & T['config']>(\n\t\t\tfieldConfig?: TConfig,\n\t\t): PgCustomColumnBuilder<ConvertCustomConfig<T>>;\n\t\t(\n\t\t\tdbName: string,\n\t\t\tfieldConfig?: T['config'],\n\t\t): PgCustomColumnBuilder<ConvertCustomConfig<T>>;\n\t}\n{\n\treturn (\n\t\ta?: string | T['config'],\n\t\tb?: T['config'],\n\t): PgCustomColumnBuilder<ConvertCustomConfig<T>> => {\n\t\tconst { name, config } = getColumnNameAndConfig<T['config']>(a, b);\n\t\treturn new PgCustomColumnBuilder(name, config, customTypeParams);\n\t};\n}\n", "import { entityKind } from '~/entity.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { PgColumnBuilderConfig, SetHasDefault } from './common.ts';\nimport { PgColumnBuilder } from './common.ts';\n\nexport abstract class PgDateColumnBuilder<\n\tout T extends PgColumnBuilderConfig = PgColumnBuilderConfig,\n\tout TRuntimeConfig extends object = object,\n> extends PgColumnBuilder<T, TRuntimeConfig> {\n\tstatic override readonly [entityKind]: string = 'PgDateColumnBaseBuilder';\n\n\t/**\n\t * Adds a `default now()` clause to the column definition.\n\t * Available for date/time column types.\n\t */\n\tdefaultNow(): SetHasDefault<this> {\n\t\treturn this.default(sql`now()`);\n\t}\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn } from './common.ts';\nimport { PgDateColumnBuilder } from './date.common.ts';\n\nexport class PgDateBuilder extends PgDateColumnBuilder<{\n\tdataType: 'object date';\n\tdata: Date;\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgDateBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'object date', 'PgDate');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgDate(table, this.config as any);\n\t}\n}\n\nexport class PgDate extends PgColumn<'object date'> {\n\tstatic override readonly [entityKind]: string = 'PgDate';\n\n\tgetSQLType(): string {\n\t\treturn 'date';\n\t}\n\n\toverride mapFromDriverValue(value: string | Date): Date {\n\t\tif (typeof value === 'string') return new Date(value);\n\t\treturn value;\n\t}\n\n\toverride mapToDriverValue(value: Date | string): string {\n\t\tif (typeof value === 'string') return value;\n\t\treturn value.toISOString();\n\t}\n}\n\nexport class PgDateStringBuilder extends PgDateColumnBuilder<{\n\tdataType: 'string date';\n\tdata: string;\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgDateStringBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'string date', 'PgDateString');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgDateString(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgDateString extends PgColumn<'string date'> {\n\tstatic override readonly [entityKind]: string = 'PgDateString';\n\n\tgetSQLType(): string {\n\t\treturn 'date';\n\t}\n\n\toverride mapFromDriverValue(value: Date | string): string {\n\t\tif (typeof value === 'string') return value;\n\t\treturn value.toISOString().slice(0, -14);\n\t}\n\n\toverride mapToDriverValue(value: Date | string): string {\n\t\tif (typeof value === 'string') return value;\n\t\treturn value.toISOString();\n\t}\n}\n\nexport interface PgDateConfig<T extends 'date' | 'string' = 'date' | 'string'> {\n\tmode: T;\n}\n\nexport function date<TMode extends PgDateConfig['mode'] & {}>(\n\tconfig?: PgDateConfig<TMode>,\n): Equal<TMode, 'date'> extends true ? PgDateBuilder : PgDateStringBuilder;\nexport function date<TMode extends PgDateConfig['mode'] & {}>(\n\tname: string,\n\tconfig?: PgDateConfig<TMode>,\n): Equal<TMode, 'date'> extends true ? PgDateBuilder : PgDateStringBuilder;\nexport function date(a?: string | PgDateConfig, b?: PgDateConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgDateConfig>(a, b);\n\tif (config?.mode === 'date') {\n\t\treturn new PgDateBuilder(name);\n\t}\n\treturn new PgDateStringBuilder(name);\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgDoublePrecisionBuilder extends PgColumnBuilder<{\n\tdataType: 'number double';\n\tdata: number;\n\tdriverParam: string | number;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgDoublePrecisionBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'number double', 'PgDoublePrecision');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgDoublePrecision(\n\t\t\ttable,\n\t\t\tthis.config,\n\t\t);\n\t}\n}\n\nexport class PgDoublePrecision extends PgColumn<'number double'> {\n\tstatic override readonly [entityKind]: string = 'PgDoublePrecision';\n\n\tgetSQLType(): string {\n\t\treturn 'double precision';\n\t}\n\n\toverride mapFromDriverValue(value: string | number): number {\n\t\tif (typeof value === 'string') {\n\t\t\treturn Number.parseFloat(value);\n\t\t}\n\t\treturn value;\n\t}\n}\n\nexport function doublePrecision(name?: string): PgDoublePrecisionBuilder {\n\treturn new PgDoublePrecisionBuilder(name ?? '');\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '../table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgInetBuilder extends PgColumnBuilder<{\n\tdataType: 'string inet';\n\tdata: string;\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgInetBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'string inet', 'PgInet');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgInet(table, this.config as any);\n\t}\n}\n\nexport class PgInet extends PgColumn<'string inet'> {\n\tstatic override readonly [entityKind]: string = 'PgInet';\n\n\tgetSQLType(): string {\n\t\treturn 'inet';\n\t}\n}\n\nexport function inet(name?: string): PgInetBuilder {\n\treturn new PgInetBuilder(name ?? '');\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '../table.ts';\nimport { PgColumn } from './common.ts';\nimport { PgIntColumnBuilder } from './int.common.ts';\n\nexport class PgIntegerBuilder extends PgIntColumnBuilder<{\n\tdataType: 'number int32';\n\tdata: number;\n\tdriverParam: number | string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgIntegerBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'number int32', 'PgInteger');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgInteger(table, this.config as any);\n\t}\n}\n\nexport class PgInteger extends PgColumn<'number int32'> {\n\tstatic override readonly [entityKind]: string = 'PgInteger';\n\n\tgetSQLType(): string {\n\t\treturn 'integer';\n\t}\n\n\toverride mapFromDriverValue(value: number | string): number {\n\t\tif (typeof value === 'string') {\n\t\t\treturn Number.parseInt(value);\n\t\t}\n\t\treturn value;\n\t}\n}\nexport function integer(name?: string): PgIntegerBuilder {\n\treturn new PgIntegerBuilder(name ?? '');\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\nimport type { Precision } from './timestamp.ts';\n\nexport class PgIntervalBuilder extends PgColumnBuilder<{\n\tdataType: 'string interval';\n\tdata: string;\n\tdriverParam: string;\n}, { intervalConfig: IntervalConfig }> {\n\tstatic override readonly [entityKind]: string = 'PgIntervalBuilder';\n\n\tconstructor(\n\t\tname: string,\n\t\tintervalConfig: IntervalConfig,\n\t) {\n\t\tsuper(name, 'string interval', 'PgInterval');\n\t\tthis.config.intervalConfig = intervalConfig;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgInterval(table, this.config as any);\n\t}\n}\n\nexport class PgInterval extends PgColumn<'string interval'> {\n\tstatic override readonly [entityKind]: string = 'PgInterval';\n\n\treadonly fields: IntervalConfig['fields'];\n\treadonly precision: IntervalConfig['precision'];\n\n\tconstructor(table: PgTable<any>, config: PgIntervalBuilder['config']) {\n\t\tsuper(table, config);\n\t\tthis.fields = config.intervalConfig.fields;\n\t\tthis.precision = config.intervalConfig.precision;\n\t}\n\n\tgetSQLType(): string {\n\t\tconst fields = this.fields ? ` ${this.fields}` : '';\n\t\tconst precision = this.precision ? `(${this.precision})` : '';\n\t\treturn `interval${fields}${precision}`;\n\t}\n}\n\nexport interface IntervalConfig {\n\tfields?:\n\t\t| 'year'\n\t\t| 'month'\n\t\t| 'day'\n\t\t| 'hour'\n\t\t| 'minute'\n\t\t| 'second'\n\t\t| 'year to month'\n\t\t| 'day to hour'\n\t\t| 'day to minute'\n\t\t| 'day to second'\n\t\t| 'hour to minute'\n\t\t| 'hour to second'\n\t\t| 'minute to second';\n\tprecision?: Precision;\n}\n\nexport function interval(\n\tconfig?: IntervalConfig,\n): PgIntervalBuilder;\nexport function interval(\n\tname: string,\n\tconfig?: IntervalConfig,\n): PgIntervalBuilder;\nexport function interval(a?: string | IntervalConfig, b: IntervalConfig = {}) {\n\tconst { name, config } = getColumnNameAndConfig<IntervalConfig>(a, b);\n\treturn new PgIntervalBuilder(name, config);\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgJsonBuilder extends PgColumnBuilder<\n\t{\n\t\tdataType: 'object json';\n\t\tdata: unknown;\n\t\tdriverParam: unknown;\n\t}\n> {\n\tstatic override readonly [entityKind]: string = 'PgJsonBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'object json', 'PgJson');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgJson(table, this.config as any);\n\t}\n}\n\nexport class PgJson extends PgColumn<'object json'> {\n\tstatic override readonly [entityKind]: string = 'PgJson';\n\n\tconstructor(table: PgTable<any>, config: PgJsonBuilder['config']) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn 'json';\n\t}\n\n\toverride mapToDriverValue(value: unknown): string {\n\t\treturn JSON.stringify(value);\n\t}\n\n\toverride mapFromDriverValue(value: unknown): unknown {\n\t\tif (typeof value === 'string') {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(value);\n\t\t\t} catch {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t\treturn value;\n\t}\n}\n\nexport function json(name?: string): PgJsonBuilder {\n\treturn new PgJsonBuilder(name ?? '');\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgJsonbBuilder extends PgColumnBuilder<{\n\tdataType: 'object json';\n\tdata: unknown;\n\tdriverParam: unknown;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgJsonbBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'object json', 'PgJsonb');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgJsonb(table, this.config as any);\n\t}\n}\n\nexport class PgJsonb extends PgColumn<'object json'> {\n\tstatic override readonly [entityKind]: string = 'PgJsonb';\n\n\tconstructor(table: PgTable<any>, config: PgJsonbBuilder['config']) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn 'jsonb';\n\t}\n\n\toverride mapToDriverValue(value: unknown): string {\n\t\treturn JSON.stringify(value);\n\t}\n\n\toverride mapFromDriverValue(value: unknown): unknown {\n\t\tif (typeof value === 'string') {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(value);\n\t\t\t} catch {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t\treturn value;\n\t}\n}\n\nexport function jsonb(name?: string): PgJsonbBuilder {\n\treturn new PgJsonbBuilder(name ?? '');\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgLineBuilder extends PgColumnBuilder<{\n\tdataType: 'array line';\n\tdata: [number, number, number];\n\tdriverParam: number | string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgLineBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'array line', 'PgLine');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgLineTuple(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgLineTuple extends PgColumn<'array line'> {\n\tstatic override readonly [entityKind]: string = 'PgLine';\n\n\treadonly mode = 'tuple';\n\n\tgetSQLType(): string {\n\t\treturn 'line';\n\t}\n\n\toverride mapFromDriverValue(value: string): [number, number, number] {\n\t\tconst [a, b, c] = value.slice(1, -1).split(',');\n\t\treturn [Number.parseFloat(a!), Number.parseFloat(b!), Number.parseFloat(c!)];\n\t}\n\n\toverride mapToDriverValue(value: [number, number, number]): string {\n\t\treturn `{${value[0]},${value[1]},${value[2]}}`;\n\t}\n}\n\nexport class PgLineABCBuilder extends PgColumnBuilder<{\n\tdataType: 'object line';\n\tdata: { a: number; b: number; c: number };\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgLineABCBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'object line', 'PgLineABC');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgLineABC(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgLineABC extends PgColumn<'object line'> {\n\tstatic override readonly [entityKind]: string = 'PgLineABC';\n\n\treadonly mode = 'abc';\n\n\tgetSQLType(): string {\n\t\treturn 'line';\n\t}\n\n\toverride mapFromDriverValue(value: string): { a: number; b: number; c: number } {\n\t\tconst [a, b, c] = value.slice(1, -1).split(',');\n\t\treturn { a: Number.parseFloat(a!), b: Number.parseFloat(b!), c: Number.parseFloat(c!) };\n\t}\n\n\toverride mapToDriverValue(value: { a: number; b: number; c: number }): string {\n\t\treturn `{${value.a},${value.b},${value.c}}`;\n\t}\n}\n\nexport interface PgLineTypeConfig<T extends 'tuple' | 'abc' = 'tuple' | 'abc'> {\n\tmode?: T;\n}\n\nexport function line<TMode extends PgLineTypeConfig['mode'] & {}>(\n\tconfig?: PgLineTypeConfig<TMode>,\n): Equal<TMode, 'abc'> extends true ? PgLineABCBuilder\n\t: PgLineBuilder;\nexport function line<TMode extends PgLineTypeConfig['mode'] & {}>(\n\tname: string,\n\tconfig?: PgLineTypeConfig<TMode>,\n): Equal<TMode, 'abc'> extends true ? PgLineABCBuilder\n\t: PgLineBuilder;\nexport function line(a?: string | PgLineTypeConfig, b?: PgLineTypeConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgLineTypeConfig>(a, b);\n\tif (!config?.mode || config.mode === 'tuple') {\n\t\treturn new PgLineBuilder(name);\n\t}\n\treturn new PgLineABCBuilder(name);\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '../table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgMacaddrBuilder extends PgColumnBuilder<{\n\tdataType: 'string macaddr';\n\tdata: string;\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgMacaddrBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'string macaddr', 'PgMacaddr');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgMacaddr(table, this.config as any);\n\t}\n}\n\nexport class PgMacaddr extends PgColumn<'string macaddr'> {\n\tstatic override readonly [entityKind]: string = 'PgMacaddr';\n\n\tgetSQLType(): string {\n\t\treturn 'macaddr';\n\t}\n}\n\nexport function macaddr(name?: string): PgMacaddrBuilder {\n\treturn new PgMacaddrBuilder(name ?? '');\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '../table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgMacaddr8Builder extends PgColumnBuilder<{\n\tdataType: 'string macaddr8';\n\tdata: string;\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgMacaddr8Builder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'string macaddr8', 'PgMacaddr8');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgMacaddr8(table, this.config as any);\n\t}\n}\n\nexport class PgMacaddr8 extends PgColumn<'string macaddr8'> {\n\tstatic override readonly [entityKind]: string = 'PgMacaddr8';\n\n\tgetSQLType(): string {\n\t\treturn 'macaddr8';\n\t}\n}\n\nexport function macaddr8(name?: string): PgMacaddr8Builder {\n\treturn new PgMacaddr8Builder(name ?? '');\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgNumericBuilder extends PgColumnBuilder<\n\t{\n\t\tdataType: 'string numeric';\n\t\tdata: string;\n\t\tdriverParam: string;\n\t},\n\t{\n\t\tprecision: number | undefined;\n\t\tscale: number | undefined;\n\t}\n> {\n\tstatic override readonly [entityKind]: string = 'PgNumericBuilder';\n\n\tconstructor(name: string, precision?: number, scale?: number) {\n\t\tsuper(name, 'string numeric', 'PgNumeric');\n\t\tthis.config.precision = precision;\n\t\tthis.config.scale = scale;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgNumeric(table, this.config as any);\n\t}\n}\n\nexport class PgNumeric extends PgColumn<'string numeric'> {\n\tstatic override readonly [entityKind]: string = 'PgNumeric';\n\n\treadonly precision: number | undefined;\n\treadonly scale: number | undefined;\n\n\tconstructor(table: PgTable<any>, config: PgNumericBuilder['config']) {\n\t\tsuper(table, config);\n\t\tthis.precision = config.precision;\n\t\tthis.scale = config.scale;\n\t}\n\n\toverride mapFromDriverValue(value: unknown): string {\n\t\tif (typeof value === 'string') return value;\n\n\t\treturn String(value);\n\t}\n\n\tgetSQLType(): string {\n\t\tif (this.precision !== undefined && this.scale !== undefined) {\n\t\t\treturn `numeric(${this.precision}, ${this.scale})`;\n\t\t} else if (this.precision === undefined) {\n\t\t\treturn 'numeric';\n\t\t} else {\n\t\t\treturn `numeric(${this.precision})`;\n\t\t}\n\t}\n}\n\nexport class PgNumericNumberBuilder extends PgColumnBuilder<\n\t{\n\t\tdataType: 'number';\n\t\tdata: number;\n\t\tdriverParam: string;\n\t},\n\t{\n\t\tprecision: number | undefined;\n\t\tscale: number | undefined;\n\t}\n> {\n\tstatic override readonly [entityKind]: string = 'PgNumericNumberBuilder';\n\n\tconstructor(name: string, precision?: number, scale?: number) {\n\t\tsuper(name, 'number', 'PgNumericNumber');\n\t\tthis.config.precision = precision;\n\t\tthis.config.scale = scale;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgNumericNumber(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgNumericNumber extends PgColumn<'number'> {\n\tstatic override readonly [entityKind]: string = 'PgNumericNumber';\n\n\treadonly precision: number | undefined;\n\treadonly scale: number | undefined;\n\n\tconstructor(table: PgTable<any>, config: PgNumericNumberBuilder['config']) {\n\t\tsuper(table, config);\n\t\tthis.precision = config.precision;\n\t\tthis.scale = config.scale;\n\t}\n\n\toverride mapFromDriverValue(value: unknown): number {\n\t\tif (typeof value === 'number') return value;\n\n\t\treturn Number(value);\n\t}\n\n\toverride mapToDriverValue(value: number): string {\n\t\treturn String(value);\n\t}\n\n\tgetSQLType(): string {\n\t\tif (this.precision !== undefined && this.scale !== undefined) {\n\t\t\treturn `numeric(${this.precision}, ${this.scale})`;\n\t\t} else if (this.precision === undefined) {\n\t\t\treturn 'numeric';\n\t\t} else {\n\t\t\treturn `numeric(${this.precision})`;\n\t\t}\n\t}\n}\n\nexport class PgNumericBigIntBuilder extends PgColumnBuilder<\n\t{\n\t\tdataType: 'bigint int64';\n\t\tdata: bigint;\n\t\tdriverParam: string;\n\t},\n\t{\n\t\tprecision: number | undefined;\n\t\tscale: number | undefined;\n\t}\n> {\n\tstatic override readonly [entityKind]: string = 'PgNumericBigIntBuilder';\n\n\tconstructor(name: string, precision?: number, scale?: number) {\n\t\tsuper(name, 'bigint int64', 'PgNumericBigInt');\n\t\tthis.config.precision = precision;\n\t\tthis.config.scale = scale;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgNumericBigInt(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgNumericBigInt extends PgColumn<'bigint int64'> {\n\tstatic override readonly [entityKind]: string = 'PgNumericBigInt';\n\n\treadonly precision: number | undefined;\n\treadonly scale: number | undefined;\n\n\tconstructor(table: PgTable<any>, config: PgNumericBigIntBuilder['config']) {\n\t\tsuper(table, config);\n\t\tthis.precision = config.precision;\n\t\tthis.scale = config.scale;\n\t}\n\n\toverride mapFromDriverValue(value: string | number): bigint {\n\t\treturn BigInt(value);\n\t}\n\n\toverride mapToDriverValue(value: bigint): string {\n\t\treturn String(value);\n\t}\n\n\tgetSQLType(): string {\n\t\tif (this.precision !== undefined && this.scale !== undefined) {\n\t\t\treturn `numeric(${this.precision}, ${this.scale})`;\n\t\t} else if (this.precision === undefined) {\n\t\t\treturn 'numeric';\n\t\t} else {\n\t\t\treturn `numeric(${this.precision})`;\n\t\t}\n\t}\n}\n\nexport type PgNumericConfig<T extends 'string' | 'number' | 'bigint' = 'string' | 'number' | 'bigint'> =\n\t| { precision: number; scale?: number; mode?: T }\n\t| { precision?: number; scale: number; mode?: T }\n\t| { precision?: number; scale?: number; mode: T };\n\nexport function numeric<TMode extends 'string' | 'number' | 'bigint'>(\n\tconfig?: PgNumericConfig<TMode>,\n): Equal<TMode, 'number'> extends true ? PgNumericNumberBuilder\n\t: Equal<TMode, 'bigint'> extends true ? PgNumericBigIntBuilder\n\t: PgNumericBuilder;\nexport function numeric<TMode extends 'string' | 'number' | 'bigint'>(\n\tname: string,\n\tconfig?: PgNumericConfig<TMode>,\n): Equal<TMode, 'number'> extends true ? PgNumericNumberBuilder\n\t: Equal<TMode, 'bigint'> extends true ? PgNumericBigIntBuilder\n\t: PgNumericBuilder;\nexport function numeric(a?: string | PgNumericConfig, b?: PgNumericConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgNumericConfig>(a, b);\n\tconst mode = config?.mode;\n\treturn mode === 'number'\n\t\t? new PgNumericNumberBuilder(name, config?.precision, config?.scale)\n\t\t: mode === 'bigint'\n\t\t? new PgNumericBigIntBuilder(name, config?.precision, config?.scale)\n\t\t: new PgNumericBuilder(name, config?.precision, config?.scale);\n}\n\nexport const decimal = numeric;\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgPointTupleBuilder extends PgColumnBuilder<{\n\tdataType: 'array point';\n\tdata: [number, number];\n\tdriverParam: number | string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgPointTupleBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'array point', 'PgPointTuple');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgPointTuple(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgPointTuple extends PgColumn<'array point'> {\n\tstatic override readonly [entityKind]: string = 'PgPointTuple';\n\n\treadonly mode = 'tuple';\n\n\tgetSQLType(): string {\n\t\treturn 'point';\n\t}\n\n\toverride mapFromDriverValue(value: string | { x: number; y: number }): [number, number] {\n\t\tif (typeof value === 'string') {\n\t\t\tconst [x, y] = value.slice(1, -1).split(',');\n\t\t\treturn [Number.parseFloat(x!), Number.parseFloat(y!)];\n\t\t}\n\t\treturn [value.x, value.y];\n\t}\n\n\toverride mapToDriverValue(value: [number, number]): string {\n\t\treturn `(${value[0]},${value[1]})`;\n\t}\n}\n\nexport class PgPointObjectBuilder extends PgColumnBuilder<{\n\tdataType: 'object point';\n\tdata: { x: number; y: number };\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgPointObjectBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'object point', 'PgPointObject');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgPointObject(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgPointObject extends PgColumn<'object point'> {\n\tstatic override readonly [entityKind]: string = 'PgPointObject';\n\n\treadonly mode = 'xy';\n\n\tgetSQLType(): string {\n\t\treturn 'point';\n\t}\n\n\toverride mapFromDriverValue(value: string | { x: number; y: number }): { x: number; y: number } {\n\t\tif (typeof value === 'string') {\n\t\t\tconst [x, y] = value.slice(1, -1).split(',');\n\t\t\treturn { x: Number.parseFloat(x!), y: Number.parseFloat(y!) };\n\t\t}\n\t\treturn value;\n\t}\n\n\toverride mapToDriverValue(value: { x: number; y: number }): string {\n\t\treturn `(${value.x},${value.y})`;\n\t}\n}\n\nexport interface PgPointConfig<T extends 'tuple' | 'xy' = 'tuple' | 'xy'> {\n\tmode?: T;\n}\n\nexport function point<TMode extends PgPointConfig['mode'] & {}>(\n\tconfig?: PgPointConfig<TMode>,\n): Equal<TMode, 'xy'> extends true ? PgPointObjectBuilder\n\t: PgPointTupleBuilder;\nexport function point<TMode extends PgPointConfig['mode'] & {}>(\n\tname: string,\n\tconfig?: PgPointConfig<TMode>,\n): Equal<TMode, 'xy'> extends true ? PgPointObjectBuilder\n\t: PgPointTupleBuilder;\nexport function point(a?: string | PgPointConfig, b?: PgPointConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgPointConfig>(a, b);\n\tif (!config?.mode || config.mode === 'tuple') {\n\t\treturn new PgPointTupleBuilder(name);\n\t}\n\treturn new PgPointObjectBuilder(name);\n}\n", "function hexToBytes(hex: string): Uint8Array {\n\tconst bytes: number[] = [];\n\tfor (let c = 0; c < hex.length; c += 2) {\n\t\tbytes.push(Number.parseInt(hex.slice(c, c + 2), 16));\n\t}\n\treturn new Uint8Array(bytes);\n}\n\nfunction bytesToFloat64(bytes: Uint8Array, offset: number): number {\n\tconst buffer = new ArrayBuffer(8);\n\tconst view = new DataView(buffer);\n\tfor (let i = 0; i < 8; i++) {\n\t\tview.setUint8(i, bytes[offset + i]!);\n\t}\n\treturn view.getFloat64(0, true);\n}\n\nexport function parseEWKB(hex: string): { srid: number | undefined; point: [number, number] } {\n\tconst bytes = hexToBytes(hex);\n\n\tlet offset = 0;\n\n\t// Byte order: 1 is little-endian, 0 is big-endian\n\tconst byteOrder = bytes[offset];\n\toffset += 1;\n\n\tconst view = new DataView(bytes.buffer);\n\tconst geomType = view.getUint32(offset, byteOrder === 1);\n\toffset += 4;\n\n\tlet srid: number | undefined;\n\tif (geomType & 0x20000000) { // SRID flag\n\t\tsrid = view.getUint32(offset, byteOrder === 1);\n\t\toffset += 4;\n\t}\n\n\tif ((geomType & 0xFFFF) === 1) {\n\t\tconst x = bytesToFloat64(bytes, offset);\n\t\toffset += 8;\n\t\tconst y = bytesToFloat64(bytes, offset);\n\t\toffset += 8;\n\n\t\treturn { srid, point: [x, y] };\n\t}\n\n\tthrow new Error('Unsupported geometry type');\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport type { PgColumnBaseConfig } from '../common.ts';\nimport { PgColumn, PgColumnBuilder } from '../common.ts';\nimport { parseEWKB } from './utils.ts';\n\nexport class PgGeometryBuilder extends PgColumnBuilder<{\n\tdataType: 'array geometry';\n\tdata: [number, number];\n\tdriverParam: string;\n}, { srid: number | undefined }> {\n\tstatic override readonly [entityKind]: string = 'PgGeometryBuilder';\n\n\tconstructor(name: string, srid?: number) {\n\t\tsuper(name, 'array geometry', 'PgGeometry');\n\t\tthis.config.srid = srid;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgGeometry(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgGeometry\n\textends PgColumn<'array geometry', PgColumnBaseConfig<'array geometry'>, { srid: number | undefined }>\n{\n\tstatic override readonly [entityKind]: string = 'PgGeometry';\n\n\treadonly srid = this.config.srid;\n\treadonly mode = 'tuple';\n\n\tgetSQLType(): string {\n\t\treturn `geometry(point${this.srid === undefined ? '' : `,${this.srid}`})`;\n\t}\n\n\toverride mapFromDriverValue(value: string | [number, number]): [number, number] {\n\t\tif (typeof value !== 'string') return value as [number, number];\n\n\t\treturn parseEWKB(value).point;\n\t}\n\n\toverride mapToDriverValue(value: [number, number]): string {\n\t\treturn `point(${value[0]} ${value[1]})`;\n\t}\n}\n\nexport class PgGeometryObjectBuilder extends PgColumnBuilder<{\n\tdataType: 'object geometry';\n\tdata: { x: number; y: number };\n\tdriverParam: string;\n}, { srid?: number }> {\n\tstatic override readonly [entityKind]: string = 'PgGeometryObjectBuilder';\n\n\tconstructor(name: string, srid: number | undefined) {\n\t\tsuper(name, 'object geometry', 'PgGeometryObject');\n\t\tthis.config.srid = srid;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgGeometryObject(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgGeometryObject\n\textends PgColumn<'object geometry', PgColumnBaseConfig<'object geometry'>, { srid: number | undefined }>\n{\n\tstatic override readonly [entityKind]: string = 'PgGeometryObject';\n\n\treadonly srid = this.config.srid;\n\treadonly mode = 'object';\n\n\tgetSQLType(): string {\n\t\treturn `geometry(point${this.srid === undefined ? '' : `,${this.srid}`})`;\n\t}\n\n\toverride mapFromDriverValue(value: string): { x: number; y: number } {\n\t\tconst parsed = parseEWKB(value);\n\t\treturn { x: parsed.point[0], y: parsed.point[1] };\n\t}\n\n\toverride mapToDriverValue(value: { x: number; y: number }): string {\n\t\treturn `point(${value.x} ${value.y})`;\n\t}\n}\n\nexport interface PgGeometryConfig<T extends 'tuple' | 'xy' = 'tuple' | 'xy'> {\n\tmode?: T;\n\ttype?: 'point' | (string & {});\n\tsrid?: number;\n}\n\nexport function geometry<TMode extends PgGeometryConfig['mode'] & {}>(\n\tconfig?: PgGeometryConfig<TMode>,\n): Equal<TMode, 'xy'> extends true ? PgGeometryObjectBuilder : PgGeometryBuilder;\nexport function geometry<TMode extends PgGeometryConfig['mode'] & {}>(\n\tname: string,\n\tconfig?: PgGeometryConfig<TMode>,\n): Equal<TMode, 'xy'> extends true ? PgGeometryObjectBuilder : PgGeometryBuilder;\nexport function geometry(a?: string | PgGeometryConfig, b?: PgGeometryConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgGeometryConfig>(a, b);\n\tif (!config?.mode || config.mode === 'tuple') {\n\t\treturn new PgGeometryBuilder(name, config?.srid);\n\t}\n\treturn new PgGeometryObjectBuilder(name, config?.srid);\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgRealBuilder extends PgColumnBuilder<\n\t{\n\t\tdataType: 'number float';\n\t\tdata: number;\n\t\tdriverParam: string | number;\n\t},\n\t{ length: number | undefined }\n> {\n\tstatic override readonly [entityKind]: string = 'PgRealBuilder';\n\n\tconstructor(name: string, length?: number) {\n\t\tsuper(name, 'number float', 'PgReal');\n\t\tthis.config.length = length;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgReal(table, this.config as any);\n\t}\n}\n\nexport class PgReal extends PgColumn<'number float'> {\n\tstatic override readonly [entityKind]: string = 'PgReal';\n\n\tconstructor(table: PgTable<any>, config: PgRealBuilder['config']) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn 'real';\n\t}\n\n\toverride mapFromDriverValue(value: string | number): number {\n\t\tif (typeof value === 'string') {\n\t\t\treturn Number.parseFloat(value);\n\t\t}\n\t\treturn value;\n\t}\n}\n\nexport function real(name?: string): PgRealBuilder {\n\treturn new PgRealBuilder(name ?? '');\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgSerialBuilder extends PgColumnBuilder<{\n\tdataType: 'number int32';\n\tdata: number;\n\tdriverParam: number;\n\n\tnotNull: true;\n\thasDefault: true;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgSerialBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'number int32', 'PgSerial');\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.notNull = true;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgSerial(table, this.config as any);\n\t}\n}\n\nexport class PgSerial extends PgColumn<'number int32'> {\n\tstatic override readonly [entityKind]: string = 'PgSerial';\n\n\tgetSQLType(): string {\n\t\treturn 'serial';\n\t}\n}\n\nexport function serial(name?: string): PgSerialBuilder {\n\treturn new PgSerialBuilder(name ?? '');\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { PgColumn } from './common.ts';\nimport { PgIntColumnBuilder } from './int.common.ts';\n\nexport class PgSmallIntBuilder extends PgIntColumnBuilder<{\n\tdataType: 'number int16';\n\tdata: number;\n\tdriverParam: number | string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgSmallIntBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'number int16', 'PgSmallInt');\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgSmallInt(table, this.config as any);\n\t}\n}\n\nexport class PgSmallInt extends PgColumn<'number int16'> {\n\tstatic override readonly [entityKind]: string = 'PgSmallInt';\n\n\tgetSQLType(): string {\n\t\treturn 'smallint';\n\t}\n\n\toverride mapFromDriverValue(value: number | string): number {\n\t\tif (typeof value === 'string') {\n\t\t\treturn Number(value);\n\t\t}\n\t\treturn value;\n\t}\n}\nexport function smallint(name?: string): PgSmallIntBuilder {\n\treturn new PgSmallIntBuilder(name ?? '');\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgSmallSerialBuilder extends PgColumnBuilder<{\n\tdataType: 'number int16';\n\tdata: number;\n\tdriverParam: number;\n\tnotNull: true;\n\thasDefault: true;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgSmallSerialBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'number int16', 'PgSmallSerial');\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.notNull = true;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgSmallSerial(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgSmallSerial extends PgColumn<'number int16'> {\n\tstatic override readonly [entityKind]: string = 'PgSmallSerial';\n\n\tgetSQLType(): string {\n\t\treturn 'smallserial';\n\t}\n}\n\nexport function smallserial(name?: string): PgSmallSerialBuilder {\n\treturn new PgSmallSerialBuilder(name ?? '');\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { type Equal, getColumnNameAndConfig, type Writable } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\ntype PgTextBuilderConfig<TEnum extends [string, ...string[]]> = Equal<TEnum, [string, ...string[]]> extends true\n\t? { dataType: 'string'; data: string; driverParam: string }\n\t: { dataType: 'string enum'; data: TEnum[number]; enumValues: TEnum; driverParam: string };\n\nexport class PgTextBuilder<TEnum extends [string, ...string[]] = [string, ...string[]]> extends PgColumnBuilder<\n\tPgTextBuilderConfig<TEnum>,\n\t{ enumValues: TEnum }\n> {\n\tstatic override readonly [entityKind]: string = 'PgTextBuilder';\n\n\tconstructor(\n\t\tname: string,\n\t\tconfig: PgTextConfig<TEnum>,\n\t) {\n\t\tsuper(name, config.enum?.length ? 'string enum' : 'string', 'PgText');\n\t\tthis.config.enumValues = config.enum as TEnum;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgText(table, this.config as any, this.config.enumValues);\n\t}\n}\n\nexport class PgText<TEnum extends [string, ...string[]] = [string, ...string[]]> extends PgColumn<\n\tEqual<TEnum, [string, ...string[]]> extends true ? 'string' : 'string enum'\n> {\n\tstatic override readonly [entityKind]: string = 'PgText';\n\toverride readonly enumValues;\n\n\tconstructor(\n\t\ttable: PgTable<any>,\n\t\tconfig: any,\n\t\tenumValues?: string[],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.enumValues = enumValues;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn 'text';\n\t}\n}\n\nexport interface PgTextConfig<\n\tTEnum extends readonly string[] | undefined = readonly string[] | undefined,\n> {\n\tenum?: TEnum;\n}\n\n// Original function overloads style\nexport function text(): PgTextBuilder;\nexport function text(name: string): PgTextBuilder;\nexport function text<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tconfig: PgTextConfig<T | Writable<T>>,\n): PgTextBuilder<Writable<T>>;\nexport function text<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tname: string,\n\tconfig: PgTextConfig<T | Writable<T>>,\n): PgTextBuilder<Writable<T>>;\nexport function text(a?: string | PgTextConfig, b: PgTextConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<PgTextConfig>(a, b);\n\treturn new PgTextBuilder(name, config as any);\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn } from './common.ts';\nimport { PgDateColumnBuilder } from './date.common.ts';\nimport type { Precision } from './timestamp.ts';\n\nexport class PgTimeBuilder extends PgDateColumnBuilder<\n\t{\n\t\tdataType: 'string time';\n\t\tdata: string;\n\t\tdriverParam: string;\n\t},\n\t{ withTimezone: boolean; precision: number | undefined }\n> {\n\tstatic override readonly [entityKind]: string = 'PgTimeBuilder';\n\n\tconstructor(\n\t\tname: string,\n\t\treadonly withTimezone: boolean,\n\t\treadonly precision: number | undefined,\n\t) {\n\t\tsuper(name, 'string time', 'PgTime');\n\t\tthis.config.withTimezone = withTimezone;\n\t\tthis.config.precision = precision;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgTime(table, this.config as any);\n\t}\n}\n\nexport class PgTime extends PgColumn<'string time'> {\n\tstatic override readonly [entityKind]: string = 'PgTime';\n\n\treadonly withTimezone: boolean;\n\treadonly precision: number | undefined;\n\n\tconstructor(table: PgTable<any>, config: PgTimeBuilder['config']) {\n\t\tsuper(table, config);\n\t\tthis.withTimezone = config.withTimezone;\n\t\tthis.precision = config.precision;\n\t}\n\n\tgetSQLType(): string {\n\t\tconst precision = this.precision === undefined ? '' : `(${this.precision})`;\n\t\treturn `time${precision}${this.withTimezone ? ' with time zone' : ''}`;\n\t}\n}\n\nexport interface TimeConfig {\n\tprecision?: Precision;\n\twithTimezone?: boolean;\n}\n\nexport function time(config?: TimeConfig): PgTimeBuilder;\nexport function time(name: string, config?: TimeConfig): PgTimeBuilder;\nexport function time(a?: string | TimeConfig, b: TimeConfig = {}) {\n\tconst { name, config } = getColumnNameAndConfig<TimeConfig>(a, b);\n\treturn new PgTimeBuilder(name, config.withTimezone ?? false, config.precision);\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn } from './common.ts';\nimport { PgDateColumnBuilder } from './date.common.ts';\n\nexport class PgTimestampBuilder extends PgDateColumnBuilder<\n\t{\n\t\tdataType: 'object date';\n\t\tdata: Date;\n\t\tdriverParam: string;\n\t},\n\t{ withTimezone: boolean; precision: number | undefined }\n> {\n\tstatic override readonly [entityKind]: string = 'PgTimestampBuilder';\n\n\tconstructor(\n\t\tname: string,\n\t\twithTimezone: boolean,\n\t\tprecision: number | undefined,\n\t) {\n\t\tsuper(name, 'object date', 'PgTimestamp');\n\t\tthis.config.withTimezone = withTimezone;\n\t\tthis.config.precision = precision;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgTimestamp(table, this.config as any);\n\t}\n}\n\nexport class PgTimestamp extends PgColumn<'object date'> {\n\tstatic override readonly [entityKind]: string = 'PgTimestamp';\n\n\treadonly withTimezone: boolean;\n\treadonly precision: number | undefined;\n\n\tconstructor(table: PgTable<any>, config: PgTimestampBuilder['config']) {\n\t\tsuper(table, config);\n\t\tthis.withTimezone = config.withTimezone;\n\t\tthis.precision = config.precision;\n\t}\n\n\tgetSQLType(): string {\n\t\tconst precision = this.precision === undefined ? '' : ` (${this.precision})`;\n\t\treturn `timestamp${precision}${this.withTimezone ? ' with time zone' : ''}`;\n\t}\n\n\toverride mapFromDriverValue(value: Date | string): Date {\n\t\tif (typeof value === 'string') return new Date(this.withTimezone ? value : value + '+0000');\n\n\t\treturn value;\n\t}\n\n\toverride mapToDriverValue(value: Date | string): string {\n\t\tif (typeof value === 'string') return value;\n\t\treturn value.toISOString();\n\t}\n}\n\nexport class PgTimestampStringBuilder extends PgDateColumnBuilder<\n\t{\n\t\tdataType: 'string timestamp';\n\t\tdata: string;\n\t\tdriverParam: string;\n\t},\n\t{ withTimezone: boolean; precision: number | undefined }\n> {\n\tstatic override readonly [entityKind]: string = 'PgTimestampStringBuilder';\n\n\tconstructor(\n\t\tname: string,\n\t\twithTimezone: boolean,\n\t\tprecision: number | undefined,\n\t) {\n\t\tsuper(name, 'string timestamp', 'PgTimestampString');\n\t\tthis.config.withTimezone = withTimezone;\n\t\tthis.config.precision = precision;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgTimestampString(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgTimestampString extends PgColumn<'string timestamp'> {\n\tstatic override readonly [entityKind]: string = 'PgTimestampString';\n\n\treadonly withTimezone: boolean;\n\treadonly precision: number | undefined;\n\n\tconstructor(table: PgTable<any>, config: PgTimestampStringBuilder['config']) {\n\t\tsuper(table, config);\n\t\tthis.withTimezone = config.withTimezone;\n\t\tthis.precision = config.precision;\n\t}\n\n\tgetSQLType(): string {\n\t\tconst precision = this.precision === undefined ? '' : `(${this.precision})`;\n\t\treturn `timestamp${precision}${this.withTimezone ? ' with time zone' : ''}`;\n\t}\n\n\toverride mapFromDriverValue(value: Date | string): string {\n\t\tif (typeof value === 'string') return value;\n\n\t\tconst shortened = value.toISOString().slice(0, -1).replace('T', ' ');\n\t\tif (this.withTimezone) {\n\t\t\treturn `${shortened}+00`;\n\t\t}\n\n\t\treturn shortened;\n\t}\n\n\toverride mapToDriverValue(value: Date | string): string {\n\t\tif (typeof value === 'string') return value;\n\t\treturn value.toISOString();\n\t}\n}\n\nexport type Precision = 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\nexport interface PgTimestampConfig<TMode extends 'date' | 'string' = 'date' | 'string'> {\n\tmode?: TMode;\n\tprecision?: Precision;\n\twithTimezone?: boolean;\n}\n\nexport function timestamp<TMode extends PgTimestampConfig['mode'] & {}>(\n\tconfig?: PgTimestampConfig<TMode>,\n): Equal<TMode, 'string'> extends true ? PgTimestampStringBuilder : PgTimestampBuilder;\nexport function timestamp<TMode extends PgTimestampConfig['mode'] & {}>(\n\tname: string,\n\tconfig?: PgTimestampConfig<TMode>,\n): Equal<TMode, 'string'> extends true ? PgTimestampStringBuilder : PgTimestampBuilder;\nexport function timestamp(a?: string | PgTimestampConfig, b: PgTimestampConfig = {}) {\n\tconst { name, config } = getColumnNameAndConfig<PgTimestampConfig | undefined>(a, b);\n\tif (config?.mode === 'string') {\n\t\treturn new PgTimestampStringBuilder(name, config.withTimezone ?? false, config.precision);\n\t}\n\treturn new PgTimestampBuilder(name, config?.withTimezone ?? false, config?.precision);\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport class PgUUIDBuilder extends PgColumnBuilder<{\n\tdataType: 'string uuid';\n\tdata: string;\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'PgUUIDBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'string uuid', 'PgUUID');\n\t}\n\n\t/**\n\t * Adds `default gen_random_uuid()` to the column definition.\n\t */\n\tdefaultRandom(): ReturnType<this['default']> {\n\t\treturn this.default(sql`gen_random_uuid()`) as ReturnType<this['default']>;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgUUID(table, this.config as any);\n\t}\n}\n\nexport class PgUUID extends PgColumn<'string uuid'> {\n\tstatic override readonly [entityKind]: string = 'PgUUID';\n\n\tgetSQLType(): string {\n\t\treturn 'uuid';\n\t}\n}\n\nexport function uuid(name?: string): PgUUIDBuilder {\n\treturn new PgUUIDBuilder(name ?? '');\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { type Equal, getColumnNameAndConfig, type Writable } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\ntype PgVarcharBuilderConfig<TEnum extends [string, ...string[]]> = Equal<TEnum, [string, ...string[]]> extends true\n\t? { dataType: 'string'; data: string; driverParam: string }\n\t: { dataType: 'string enum'; data: TEnum[number]; enumValues: TEnum; driverParam: string };\n\nexport class PgVarcharBuilder<TEnum extends [string, ...string[]] = [string, ...string[]]> extends PgColumnBuilder<\n\tPgVarcharBuilderConfig<TEnum>,\n\t{ length: number | undefined; enumValues: TEnum }\n> {\n\tstatic override readonly [entityKind]: string = 'PgVarcharBuilder';\n\n\tconstructor(name: string, config: PgVarcharConfig<TEnum>) {\n\t\tsuper(name, config.enum?.length ? 'string enum' : 'string', 'PgVarchar');\n\t\tthis.config.length = config.length!;\n\t\tthis.config.enumValues = config.enum as TEnum;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgVarchar(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgVarchar<TEnum extends [string, ...string[]] = [string, ...string[]]>\n\textends PgColumn<Equal<TEnum, [string, ...string[]]> extends true ? 'string' : 'string enum'>\n{\n\tstatic override readonly [entityKind]: string = 'PgVarchar';\n\n\toverride readonly enumValues: TEnum;\n\n\tconstructor(table: PgTable<any>, config: PgVarcharBuilder<TEnum>['config']) {\n\t\tsuper(table, config as any);\n\t\tthis.enumValues = config.enumValues;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.length === undefined ? `varchar` : `varchar(${this.length})`;\n\t}\n}\n\nexport interface PgVarcharConfig<\n\tTEnum extends readonly string[] | string[] | undefined = readonly string[] | string[] | undefined,\n> {\n\tenum?: TEnum;\n\tlength?: number;\n}\n\nexport function varchar(): PgVarcharBuilder;\nexport function varchar(name: string): PgVarcharBuilder;\nexport function varchar(config: { length?: number }): PgVarcharBuilder;\nexport function varchar(name: string, config: { length?: number }): PgVarcharBuilder;\nexport function varchar<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tconfig: PgVarcharConfig<T | Writable<T>> & { enum: T | Writable<T> },\n): PgVarcharBuilder<Writable<T>>;\nexport function varchar<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tname: string,\n\tconfig: PgVarcharConfig<T | Writable<T>> & { enum: T | Writable<T> },\n): PgVarcharBuilder<Writable<T>>;\nexport function varchar(a?: string | PgVarcharConfig, b: PgVarcharConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<PgVarcharConfig>(a, b);\n\treturn new PgVarcharBuilder(name, config as any);\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from '../common.ts';\n\nexport class PgBinaryVectorBuilder extends PgColumnBuilder<\n\t{\n\t\tdataType: 'string binary';\n\t\tdata: string;\n\t\tdriverParam: string;\n\t},\n\t{ length: number; isLengthExact: true }\n> {\n\tstatic override readonly [entityKind]: string = 'PgBinaryVectorBuilder';\n\n\tconstructor(name: string, config: PgBinaryVectorConfig) {\n\t\tsuper(name, 'string binary', 'PgBinaryVector');\n\t\tthis.config.length = config.dimensions;\n\t\tthis.config.isLengthExact = true;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgBinaryVector(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgBinaryVector extends PgColumn<'string binary'> {\n\tstatic override readonly [entityKind]: string = 'PgBinaryVector';\n\n\tgetSQLType(): string {\n\t\treturn `bit(${this.length})`;\n\t}\n}\n\nexport interface PgBinaryVectorConfig {\n\tdimensions: number;\n}\n\nexport function bit(\n\tconfig: PgBinaryVectorConfig,\n): PgBinaryVectorBuilder;\nexport function bit(\n\tname: string,\n\tconfig: PgBinaryVectorConfig,\n): PgBinaryVectorBuilder;\nexport function bit(a: string | PgBinaryVectorConfig, b?: PgBinaryVectorConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgBinaryVectorConfig>(a, b);\n\treturn new PgBinaryVectorBuilder(name, config);\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from '../common.ts';\n\nexport class PgHalfVectorBuilder extends PgColumnBuilder<\n\t{\n\t\tdataType: 'array halfvector';\n\t\tdata: number[];\n\t\tdriverParam: string;\n\t},\n\t{ length: number; isLengthExact: true }\n> {\n\tstatic override readonly [entityKind]: string = 'PgHalfVectorBuilder';\n\n\tconstructor(name: string, config: PgHalfVectorConfig) {\n\t\tsuper(name, 'array halfvector', 'PgHalfVector');\n\t\tthis.config.length = config.dimensions;\n\t\tthis.config.isLengthExact = true;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgHalfVector(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgHalfVector extends PgColumn<'array halfvector'> {\n\tstatic override readonly [entityKind]: string = 'PgHalfVector';\n\n\tgetSQLType(): string {\n\t\treturn `halfvec(${this.length})`;\n\t}\n\n\toverride mapToDriverValue(value: unknown): unknown {\n\t\treturn JSON.stringify(value);\n\t}\n\n\toverride mapFromDriverValue(value: string): unknown {\n\t\treturn value\n\t\t\t.slice(1, -1)\n\t\t\t.split(',')\n\t\t\t.map((v) => Number.parseFloat(v));\n\t}\n}\n\nexport interface PgHalfVectorConfig {\n\tdimensions: number;\n}\n\nexport function halfvec(\n\tconfig: PgHalfVectorConfig,\n): PgHalfVectorBuilder;\nexport function halfvec(\n\tname: string,\n\tconfig: PgHalfVectorConfig,\n): PgHalfVectorBuilder;\nexport function halfvec(a: string | PgHalfVectorConfig, b?: PgHalfVectorConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgHalfVectorConfig>(a, b);\n\treturn new PgHalfVectorBuilder(name, config);\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport type { PgColumnBaseConfig } from '../common.ts';\nimport { PgColumn, PgColumnBuilder } from '../common.ts';\n\nexport class PgSparseVectorBuilder extends PgColumnBuilder<\n\t{\n\t\tdataType: 'string sparsevec';\n\t\tdata: string;\n\t\tdriverParam: string;\n\t},\n\t{ vectorDimensions: number | undefined }\n> {\n\tstatic override readonly [entityKind]: string = 'PgSparseVectorBuilder';\n\n\tconstructor(name: string, config: PgSparseVectorConfig) {\n\t\tsuper(name, 'string sparsevec', 'PgSparseVector');\n\t\tthis.config.vectorDimensions = config.dimensions;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgSparseVector(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgSparseVector\n\textends PgColumn<'string sparsevec', PgColumnBaseConfig<'string sparsevec'>, { vectorDimensions: number | undefined }>\n{\n\tstatic override readonly [entityKind]: string = 'PgSparseVector';\n\n\treadonly vectorDimensions = this.config.vectorDimensions;\n\n\tgetSQLType(): string {\n\t\treturn `sparsevec(${this.vectorDimensions})`;\n\t}\n}\n\nexport interface PgSparseVectorConfig {\n\tdimensions: number;\n}\n\nexport function sparsevec(\n\tconfig: PgSparseVectorConfig,\n): PgSparseVectorBuilder;\nexport function sparsevec(\n\tname: string,\n\tconfig: PgSparseVectorConfig,\n): PgSparseVectorBuilder;\nexport function sparsevec(a: string | PgSparseVectorConfig, b?: PgSparseVectorConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgSparseVectorConfig>(a, b);\n\treturn new PgSparseVectorBuilder(name, config);\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from '../common.ts';\n\nexport class PgVectorBuilder extends PgColumnBuilder<\n\t{\n\t\tdataType: 'array vector';\n\t\tdata: number[];\n\t\tdriverParam: string;\n\t},\n\t{ length: number; isLengthExact: true }\n> {\n\tstatic override readonly [entityKind]: string = 'PgVectorBuilder';\n\n\tconstructor(name: string, config: PgVectorConfig) {\n\t\tsuper(name, 'array vector', 'PgVector');\n\t\tthis.config.length = config.dimensions;\n\t\tthis.config.isLengthExact = true;\n\t}\n\n\t/** @internal */\n\toverride build(table: PgTable<any>) {\n\t\treturn new PgVector(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class PgVector extends PgColumn<'array vector'> {\n\tstatic override readonly [entityKind]: string = 'PgVector';\n\n\tgetSQLType(): string {\n\t\treturn `vector(${this.length})`;\n\t}\n\n\toverride mapToDriverValue(value: unknown): unknown {\n\t\treturn JSON.stringify(value);\n\t}\n\n\toverride mapFromDriverValue(value: string): unknown {\n\t\treturn value\n\t\t\t.slice(1, -1)\n\t\t\t.split(',')\n\t\t\t.map((v) => Number.parseFloat(v));\n\t}\n}\n\nexport interface PgVectorConfig {\n\tdimensions: number;\n}\n\nexport function vector(\n\tconfig: PgVectorConfig,\n): PgVectorBuilder;\nexport function vector(\n\tname: string,\n\tconfig: PgVectorConfig,\n): PgVectorBuilder;\nexport function vector(a: string | PgVectorConfig, b?: PgVectorConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgVectorConfig>(a, b);\n\treturn new PgVectorBuilder(name, config);\n}\n", "import { bigint } from './bigint.ts';\nimport { bigserial } from './bigserial.ts';\nimport { boolean } from './boolean.ts';\nimport { char } from './char.ts';\nimport { cidr } from './cidr.ts';\nimport { customType } from './custom.ts';\nimport { date } from './date.ts';\nimport { doublePrecision } from './double-precision.ts';\nimport { inet } from './inet.ts';\nimport { integer } from './integer.ts';\nimport { interval } from './interval.ts';\nimport { json } from './json.ts';\nimport { jsonb } from './jsonb.ts';\nimport { line } from './line.ts';\nimport { macaddr } from './macaddr.ts';\nimport { macaddr8 } from './macaddr8.ts';\nimport { numeric } from './numeric.ts';\nimport { point } from './point.ts';\nimport { geometry } from './postgis_extension/geometry.ts';\nimport { real } from './real.ts';\nimport { serial } from './serial.ts';\nimport { smallint } from './smallint.ts';\nimport { smallserial } from './smallserial.ts';\nimport { text } from './text.ts';\nimport { time } from './time.ts';\nimport { timestamp } from './timestamp.ts';\nimport { uuid } from './uuid.ts';\nimport { varchar } from './varchar.ts';\nimport { bit } from './vector_extension/bit.ts';\nimport { halfvec } from './vector_extension/halfvec.ts';\nimport { sparsevec } from './vector_extension/sparsevec.ts';\nimport { vector } from './vector_extension/vector.ts';\n\nexport function getPgColumnBuilders() {\n\treturn {\n\t\tbigint,\n\t\tbigserial,\n\t\tboolean,\n\t\tchar,\n\t\tcidr,\n\t\tcustomType,\n\t\tdate,\n\t\tdoublePrecision,\n\t\tinet,\n\t\tinteger,\n\t\tinterval,\n\t\tjson,\n\t\tjsonb,\n\t\tline,\n\t\tmacaddr,\n\t\tmacaddr8,\n\t\tnumeric,\n\t\tpoint,\n\t\tgeometry,\n\t\treal,\n\t\tserial,\n\t\tsmallint,\n\t\tsmallserial,\n\t\ttext,\n\t\ttime,\n\t\ttimestamp,\n\t\tuuid,\n\t\tvarchar,\n\t\tbit,\n\t\thalfvec,\n\t\tsparsevec,\n\t\tvector,\n\t};\n}\n\nexport type PgColumnsBuilders = ReturnType<typeof getPgColumnBuilders>;\n", "import { entityKind } from '~/entity.ts';\nimport type { InferModelFromColumns } from '~/table.ts';\nimport { Table, type TableConfig as TableConfigBase, type UpdateTableConfig } from '~/table.ts';\nimport type { CheckBuilder } from './checks.ts';\nimport { getPgColumnBuilders, type PgColumnsBuilders } from './columns/all.ts';\nimport type {\n\tAnyPgColumnBuilder,\n\tExtraConfigColumn,\n\tPgBuildColumns,\n\tPgBuildExtraConfigColumns,\n\tPgColumn,\n\tPgColumnBuilder,\n\tPgColumns,\n} from './columns/common.ts';\nimport type { ForeignKey, ForeignKeyBuilder } from './foreign-keys.ts';\nimport type { AnyIndexBuilder } from './indexes.ts';\nimport type { PgPolicy } from './policies.ts';\nimport type { PrimaryKeyBuilder } from './primary-keys.ts';\nimport type { UniqueConstraintBuilder } from './unique-constraint.ts';\n\nexport type PgTableExtraConfigValue =\n\t| AnyIndexBuilder\n\t| CheckBuilder\n\t| ForeignKeyBuilder\n\t| PrimaryKeyBuilder\n\t| UniqueConstraintBuilder\n\t| PgPolicy;\n\nexport type PgTableExtraConfig = Record<string, PgTableExtraConfigValue>;\n\nexport type TableConfig = TableConfigBase<PgColumns>;\n\n/** @internal */\nexport const InlineForeignKeys = Symbol.for('drizzle:PgInlineForeignKeys');\n/** @internal */\nexport const EnableRLS = Symbol.for('drizzle:EnableRLS');\n\nexport class PgTable<out T extends TableConfig = TableConfig> extends Table<T> {\n\tstatic override readonly [entityKind]: string = 'PgTable';\n\n\t/** @internal */\n\tstatic override readonly Symbol = Object.assign({}, Table.Symbol, {\n\t\tInlineForeignKeys: InlineForeignKeys as typeof InlineForeignKeys,\n\t\tEnableRLS: EnableRLS as typeof EnableRLS,\n\t});\n\n\t/**@internal */\n\t[InlineForeignKeys]: ForeignKey[] = [];\n\n\t/** @internal */\n\t[EnableRLS]: boolean = false;\n\n\t/** @internal */\n\toverride [Table.Symbol.ExtraConfigBuilder]: ((self: Record<string, PgColumn>) => PgTableExtraConfig) | undefined =\n\t\tundefined;\n\n\t/** @internal */\n\toverride [Table.Symbol.ExtraConfigColumns]: Record<string, ExtraConfigColumn> = {};\n}\n\nexport type AnyPgTable<TPartial extends Partial<TableConfig> = {}> = PgTable<UpdateTableConfig<TableConfig, TPartial>>;\n\n// type InferInsertColumns<TColumns extends PgColumns> = Simplify<\n// \t& {\n// \t\t// Required keys: insertType does not include undefined or null\n// \t\t[\n// \t\t\tKey in keyof TColumns & string as TColumns[Key]['_']['insertType'] extends never ? never\n// \t\t\t\t// Check doesn't work properly with `\"strictNullChecks\": false`, to be reworked\n// \t\t\t\t: undefined extends TColumns[Key]['_']['insertType'] ? never\n// \t\t\t\t: Key\n// \t\t]: TColumns[Key]['_']['insertType'];\n// \t}\n// \t& {\n// \t\t// Optional keys: insertType includes undefined\n// \t\t[\n// \t\t\tKey in keyof TColumns & string as TColumns[Key]['_']['insertType'] extends never ? never\n// \t\t\t\t// Check doesn't work properly with `\"strictNullChecks\": false`, to be reworked\n// \t\t\t\t: undefined extends TColumns[Key]['_']['insertType'] ? Key\n// \t\t\t\t: never\n// \t\t]?: TColumns[Key]['_']['insertType'];\n// \t}\n// >;\n\nexport type PgTableWithColumns<T extends TableConfig> =\n\t& PgTable<T>\n\t& T['columns']\n\t& {\n\t\treadonly $inferSelect: InferModelFromColumns<T['columns'], 'select'>;\n\t\treadonly $inferInsert: InferModelFromColumns<T['columns'], 'insert'>;\n\t}\n\t& {\n\t\t/** @deprecated use `pgTable.withRLS()` instead*/\n\t\tenableRLS: () => Omit<\n\t\t\tPgTableWithColumns<T>,\n\t\t\t'enableRLS'\n\t\t>;\n\t};\n\n/** @internal */\nexport function pgTableWithSchema<\n\tTTableName extends string,\n\tTSchemaName extends string | undefined,\n\tTColumnsMap extends Record<string, AnyPgColumnBuilder>,\n>(\n\tname: TTableName,\n\tcolumns: TColumnsMap | ((columnTypes: PgColumnsBuilders) => TColumnsMap),\n\textraConfig:\n\t\t| ((self: PgBuildExtraConfigColumns<TColumnsMap>) => PgTableExtraConfig | PgTableExtraConfigValue[])\n\t\t| undefined,\n\tschema: TSchemaName,\n\tbaseName = name,\n): PgTableWithColumns<{\n\tname: TTableName;\n\tschema: TSchemaName;\n\tcolumns: PgBuildColumns<TTableName, TColumnsMap>;\n\tdialect: 'pg';\n}> {\n\tconst rawTable = new PgTable<{\n\t\tname: TTableName;\n\t\tschema: TSchemaName;\n\t\tcolumns: PgBuildColumns<TTableName, TColumnsMap>;\n\t\tdialect: 'pg';\n\t}>(name, schema, baseName);\n\n\tconst parsedColumns: TColumnsMap = typeof columns === 'function' ? columns(getPgColumnBuilders()) : columns;\n\n\tconst builtColumns = Object.fromEntries(\n\t\tObject.entries(parsedColumns).map(([name, colBuilderBase]) => {\n\t\t\tconst colBuilder = colBuilderBase as PgColumnBuilder;\n\t\t\tcolBuilder.setName(name);\n\t\t\tconst column = colBuilder.build(rawTable);\n\t\t\trawTable[InlineForeignKeys].push(...colBuilder.buildForeignKeys(column, rawTable));\n\t\t\treturn [name, column];\n\t\t}),\n\t) as unknown as PgBuildColumns<TTableName, TColumnsMap>;\n\n\tconst builtColumnsForExtraConfig = Object.fromEntries(\n\t\tObject.entries(parsedColumns).map(([name, colBuilderBase]) => {\n\t\t\tconst colBuilder = colBuilderBase as PgColumnBuilder;\n\t\t\tcolBuilder.setName(name);\n\t\t\tconst column = colBuilder.buildExtraConfigColumn(rawTable);\n\t\t\treturn [name, column];\n\t\t}),\n\t) as unknown as PgBuildExtraConfigColumns<TColumnsMap>;\n\n\tconst table = Object.assign(rawTable, builtColumns);\n\n\ttable[Table.Symbol.Columns] = builtColumns;\n\ttable[Table.Symbol.ExtraConfigColumns] = builtColumnsForExtraConfig;\n\n\tif (extraConfig) {\n\t\ttable[PgTable.Symbol.ExtraConfigBuilder] = extraConfig as any;\n\t}\n\n\treturn Object.assign(table, {\n\t\tenableRLS: () => {\n\t\t\ttable[PgTable.Symbol.EnableRLS] = true;\n\t\t\treturn table as PgTableWithColumns<{\n\t\t\t\tname: TTableName;\n\t\t\t\tschema: TSchemaName;\n\t\t\t\tcolumns: PgBuildColumns<TTableName, TColumnsMap>;\n\t\t\t\tdialect: 'pg';\n\t\t\t}>;\n\t\t},\n\t}) as any;\n}\n\nexport interface PgTableFnInternal<TSchema extends string | undefined = undefined> {\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, AnyPgColumnBuilder>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig?: (\n\t\t\tself: PgBuildExtraConfigColumns<TColumnsMap>,\n\t\t) => PgTableExtraConfigValue[],\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: PgBuildColumns<TTableName, TColumnsMap>;\n\t\tdialect: 'pg';\n\t}>;\n\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, AnyPgColumnBuilder>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: PgColumnsBuilders) => TColumnsMap,\n\t\textraConfig?: (self: PgBuildExtraConfigColumns<TColumnsMap>) => PgTableExtraConfigValue[],\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: PgBuildColumns<TTableName, TColumnsMap>;\n\t\tdialect: 'pg';\n\t}>;\n\t/**\n\t * @deprecated The third parameter of pgTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = pgTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = pgTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, AnyPgColumnBuilder>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig: (\n\t\t\tself: PgBuildExtraConfigColumns<TColumnsMap>,\n\t\t) => PgTableExtraConfig,\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: PgBuildColumns<TTableName, TColumnsMap>;\n\t\tdialect: 'pg';\n\t}>;\n\n\t/**\n\t * @deprecated The third parameter of pgTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = pgTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = pgTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, AnyPgColumnBuilder>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: PgColumnsBuilders) => TColumnsMap,\n\t\textraConfig: (self: PgBuildExtraConfigColumns<TColumnsMap>) => PgTableExtraConfig,\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: PgBuildColumns<TTableName, TColumnsMap>;\n\t\tdialect: 'pg';\n\t}>;\n}\n\nexport interface PgTableFn<TSchema extends string | undefined = undefined> extends PgTableFnInternal<TSchema> {\n\twithRLS: PgTableFnInternal<TSchema>;\n}\n\nconst pgTableInternal: PgTableFnInternal = (name, columns, extraConfig) => {\n\treturn pgTableWithSchema(name, columns, extraConfig, undefined);\n};\n\nconst pgTableWithRLS: PgTableFn['withRLS'] = (name, columns, extraConfig) => {\n\tconst table = pgTableWithSchema(name, columns, extraConfig, undefined);\n\ttable[EnableRLS] = true;\n\n\treturn table;\n};\n\nexport const pgTable: PgTableFn = Object.assign(pgTableInternal, { withRLS: pgTableWithRLS });\n\nexport function pgTableCreator(customizeTableName: (name: string) => string): PgTableFn {\n\tconst fn: PgTableFnInternal = (name, columns, extraConfig) => {\n\t\treturn pgTableWithSchema(customizeTableName(name) as typeof name, columns, extraConfig, undefined, name);\n\t};\n\n\treturn Object.assign(fn, {\n\t\twithRLS: ((name, columns, extraConfig) => {\n\t\t\tconst table = pgTableWithSchema(customizeTableName(name) as typeof name, columns, extraConfig, undefined, name);\n\t\t\ttable[EnableRLS] = true;\n\n\t\t\treturn table;\n\t\t}) as PgTableFnInternal,\n\t});\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { AnyPgColumn, PgColumn } from './columns/index.ts';\nimport { PgTable } from './table.ts';\n\nexport function primaryKey<\n\tTTableName extends string,\n\tTColumn extends AnyPgColumn<{ tableName: TTableName }>,\n\tTColumns extends AnyPgColumn<{ tableName: TTableName }>[],\n>(config: { name?: string; columns: [TColumn, ...TColumns] }): PrimaryKeyBuilder;\n/**\n * @deprecated: Please use primaryKey({ columns: [] }) instead of this function\n * @param columns\n */\nexport function primaryKey<\n\tTTableName extends string,\n\tTColumns extends AnyPgColumn<{ tableName: TTableName }>[],\n>(...columns: TColumns): PrimaryKeyBuilder;\nexport function primaryKey(...config: any) {\n\tif (config[0].columns) {\n\t\treturn new PrimaryKeyBuilder(config[0].columns, config[0].name);\n\t}\n\treturn new PrimaryKeyBuilder(config);\n}\n\nexport class PrimaryKeyBuilder {\n\tstatic readonly [entityKind]: string = 'PgPrimaryKeyBuilder';\n\n\t/** @internal */\n\tcolumns: PgColumn[];\n\n\t/** @internal */\n\tname?: string;\n\n\tconstructor(\n\t\tcolumns: PgColumn[],\n\t\tname?: string,\n\t) {\n\t\tthis.columns = columns;\n\t\tthis.name = name;\n\t}\n\n\t/** @internal */\n\tbuild(table: PgTable): PrimaryKey {\n\t\treturn new PrimaryKey(table, this.columns, this.name);\n\t}\n}\n\nexport class PrimaryKey {\n\tstatic readonly [entityKind]: string = 'PgPrimaryKey';\n\n\treadonly columns: AnyPgColumn<{}>[];\n\treadonly name?: string;\n\treadonly isNameExplicit: boolean;\n\n\tconstructor(readonly table: PgTable, columns: AnyPgColumn<{}>[], name?: string) {\n\t\tthis.columns = columns;\n\t\tthis.name = name;\n\t\tthis.isNameExplicit = !!name;\n\t}\n\n\tgetName(): string {\n\t\treturn this.name ?? `${this.table[PgTable.Symbol.Name]}_${this.columns.map((column) => column.name).join('_')}_pk`;\n\t}\n}\n", "import { type AnyTable, getTableUniqueName, type InferModelFromColumns, Table } from '~/table.ts';\nimport { type AnyColumn, Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport { PrimaryKeyBuilder } from './pg-core/primary-keys.ts';\nimport {\n\tand,\n\tasc,\n\tbetween,\n\tdesc,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tisNotNull,\n\tisNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotIlike,\n\tnotInArray,\n\tnotLike,\n\tor,\n} from './sql/expressions/index.ts';\nimport { type CommentInput, type Placeholder, SQL, sql } from './sql/sql.ts';\nimport type { Assume, ColumnsWithTable, Equal, Simplify, ValueOrArray } from './utils.ts';\n\nexport abstract class Relation<TTableName extends string = string> {\n\tstatic readonly [entityKind]: string = 'Relation';\n\n\tdeclare readonly $brand: 'Relation';\n\treadonly referencedTableName: TTableName;\n\tfieldName!: string;\n\n\tconstructor(\n\t\treadonly sourceTable: Table,\n\t\treadonly referencedTable: AnyTable<{ name: TTableName }>,\n\t\treadonly relationName: string | undefined,\n\t) {\n\t\tthis.referencedTableName = referencedTable[Table.Symbol.Name] as TTableName;\n\t}\n\n\tabstract withFieldName(fieldName: string): Relation<TTableName>;\n}\n\nexport class Relations<\n\tTTableName extends string = string,\n\tTConfig extends Record<string, Relation> = Record<string, Relation>,\n> {\n\tstatic readonly [entityKind]: string = 'Relations';\n\n\tdeclare readonly $brand: 'Relations';\n\n\tconstructor(\n\t\treadonly table: AnyTable<{ name: TTableName }>,\n\t\treadonly config: (helpers: TableRelationsHelpers<TTableName>) => TConfig,\n\t) {}\n}\n\nexport class One<\n\tTTableName extends string = string,\n\tTIsNullable extends boolean = boolean,\n> extends Relation<TTableName> {\n\tstatic override readonly [entityKind]: string = 'One';\n\n\tdeclare protected $relationBrand: 'One';\n\n\tconstructor(\n\t\tsourceTable: Table,\n\t\treferencedTable: AnyTable<{ name: TTableName }>,\n\t\treadonly config:\n\t\t\t| RelationConfig<\n\t\t\t\tTTableName,\n\t\t\t\tstring,\n\t\t\t\tAnyColumn<{ tableName: TTableName }>[]\n\t\t\t>\n\t\t\t| undefined,\n\t\treadonly isNullable: TIsNullable,\n\t) {\n\t\tsuper(sourceTable, referencedTable, config?.relationName);\n\t}\n\n\twithFieldName(fieldName: string): One<TTableName> {\n\t\tconst relation = new One(\n\t\t\tthis.sourceTable,\n\t\t\tthis.referencedTable,\n\t\t\tthis.config,\n\t\t\tthis.isNullable,\n\t\t);\n\t\trelation.fieldName = fieldName;\n\t\treturn relation;\n\t}\n}\n\nexport class Many<TTableName extends string> extends Relation<TTableName> {\n\tstatic override readonly [entityKind]: string = 'Many';\n\n\tdeclare protected $relationBrand: 'Many';\n\n\tconstructor(\n\t\tsourceTable: Table,\n\t\treferencedTable: AnyTable<{ name: TTableName }>,\n\t\treadonly config: { relationName: string } | undefined,\n\t) {\n\t\tsuper(sourceTable, referencedTable, config?.relationName);\n\t}\n\n\twithFieldName(fieldName: string): Many<TTableName> {\n\t\tconst relation = new Many(\n\t\t\tthis.sourceTable,\n\t\t\tthis.referencedTable,\n\t\t\tthis.config,\n\t\t);\n\t\trelation.fieldName = fieldName;\n\t\treturn relation;\n\t}\n}\n\nexport type TableRelationsKeysOnly<\n\tTSchema extends Record<string, unknown>,\n\tTTableName extends string,\n\tK extends keyof TSchema,\n> = TSchema[K] extends Relations<TTableName> ? K : never;\n\nexport type ExtractTableRelationsFromSchema<\n\tTSchema extends Record<string, unknown>,\n\tTTableName extends string,\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TSchema as TableRelationsKeysOnly<\n\t\t\t\tTSchema,\n\t\t\t\tTTableName,\n\t\t\t\tK\n\t\t\t>\n\t\t]: TSchema[K] extends Relations<TTableName, infer TConfig> ? TConfig : never;\n\t}\n>;\n\nexport type ExtractObjectValues<T> = T[keyof T];\n\nexport type ExtractRelationsFromTableExtraConfigSchema<\n\tTConfig extends unknown[],\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TConfig as TConfig[K] extends Relations<any> ? K\n\t\t\t\t: never\n\t\t]: TConfig[K] extends Relations<infer TRelationConfig> ? TRelationConfig\n\t\t\t: never;\n\t}\n>;\n\nexport function getOperators() {\n\treturn {\n\t\tand,\n\t\tbetween,\n\t\teq,\n\t\texists,\n\t\tgt,\n\t\tgte,\n\t\tilike,\n\t\tinArray,\n\t\tisNull,\n\t\tisNotNull,\n\t\tlike,\n\t\tlt,\n\t\tlte,\n\t\tne,\n\t\tnot,\n\t\tnotBetween,\n\t\tnotExists,\n\t\tnotLike,\n\t\tnotIlike,\n\t\tnotInArray,\n\t\tor,\n\t\tsql,\n\t};\n}\n\nexport type Operators = ReturnType<typeof getOperators>;\n\nexport function getOrderByOperators() {\n\treturn {\n\t\tsql,\n\t\tasc,\n\t\tdesc,\n\t};\n}\n\nexport type OrderByOperators = ReturnType<typeof getOrderByOperators>;\n\nexport type FindTableByDBName<\n\tTSchema extends TablesRelationalConfig,\n\tTTableName extends string,\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TSchema as TSchema[K]['dbName'] extends TTableName ? K\n\t\t\t\t: never\n\t\t]: TSchema[K];\n\t}\n>;\n\nexport type DBQueryConfig<\n\tTRelationType extends 'one' | 'many' = 'one' | 'many',\n\tTIsRoot extends boolean = boolean,\n\tTSchema extends TablesRelationalConfig = TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig = TableRelationalConfig,\n> =\n\t& {\n\t\tcolumns?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['columns']]?: boolean;\n\t\t\t}\n\t\t\t| undefined;\n\t\twith?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['relations']]?:\n\t\t\t\t\t| true\n\t\t\t\t\t| DBQueryConfig<\n\t\t\t\t\t\tTTableConfig['relations'][K] extends One ? 'one' : 'many',\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\tFindTableByDBName<\n\t\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\t\tTTableConfig['relations'][K]['referencedTableName']\n\t\t\t\t\t\t>\n\t\t\t\t\t>\n\t\t\t\t\t| undefined;\n\t\t\t}\n\t\t\t| undefined;\n\t\textras?:\n\t\t\t| Record<string, SQL.Aliased>\n\t\t\t| ((\n\t\t\t\tfields: Simplify<\n\t\t\t\t\t[TTableConfig['columns']] extends [never] ? {}\n\t\t\t\t\t\t: TTableConfig['columns']\n\t\t\t\t>,\n\t\t\t\toperators: { sql: Operators['sql'] },\n\t\t\t) => Record<string, SQL.Aliased>)\n\t\t\t| undefined;\n\t}\n\t& (TRelationType extends 'many' ?\n\t\t\t& {\n\t\t\t\twhere?:\n\t\t\t\t\t| SQL\n\t\t\t\t\t| undefined\n\t\t\t\t\t| ((\n\t\t\t\t\t\tfields: Simplify<\n\t\t\t\t\t\t\t[TTableConfig['columns']] extends [never] ? {}\n\t\t\t\t\t\t\t\t: TTableConfig['columns']\n\t\t\t\t\t\t>,\n\t\t\t\t\t\toperators: Operators,\n\t\t\t\t\t) => SQL | undefined);\n\t\t\t\torderBy?:\n\t\t\t\t\t| ValueOrArray<AnyColumn | SQL>\n\t\t\t\t\t| ((\n\t\t\t\t\t\tfields: Simplify<\n\t\t\t\t\t\t\t[TTableConfig['columns']] extends [never] ? {}\n\t\t\t\t\t\t\t\t: TTableConfig['columns']\n\t\t\t\t\t\t>,\n\t\t\t\t\t\toperators: OrderByOperators,\n\t\t\t\t\t) => ValueOrArray<AnyColumn | SQL>)\n\t\t\t\t\t| undefined;\n\t\t\t\tlimit?: number | Placeholder | undefined;\n\t\t\t}\n\t\t\t& (TIsRoot extends true ? {\n\t\t\t\t\toffset?: number | Placeholder | undefined;\n\t\t\t\t}\n\t\t\t\t: {})\n\t\t: {});\n\nexport type DBQueryConfigWithComment<\n\tTRelationType extends 'one' | 'many' = 'one' | 'many',\n\tTIsRoot extends boolean = boolean,\n\tTSchema extends TablesRelationalConfig = TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig = TableRelationalConfig,\n> =\n\t& {\n\t\tcolumns?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['columns']]?: boolean;\n\t\t\t}\n\t\t\t| undefined;\n\t\twith?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['relations']]?:\n\t\t\t\t\t| true\n\t\t\t\t\t| DBQueryConfig<\n\t\t\t\t\t\tTTableConfig['relations'][K] extends One ? 'one' : 'many',\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\tFindTableByDBName<\n\t\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\t\tTTableConfig['relations'][K]['referencedTableName']\n\t\t\t\t\t\t>\n\t\t\t\t\t>\n\t\t\t\t\t| undefined;\n\t\t\t}\n\t\t\t| undefined;\n\t\textras?:\n\t\t\t| Record<string, SQL.Aliased>\n\t\t\t| ((\n\t\t\t\tfields: Simplify<\n\t\t\t\t\t[TTableConfig['columns']] extends [never] ? {}\n\t\t\t\t\t\t: TTableConfig['columns']\n\t\t\t\t>,\n\t\t\t\toperators: { sql: Operators['sql'] },\n\t\t\t) => Record<string, SQL.Aliased>)\n\t\t\t| undefined;\n\t\tcomment?: CommentInput | undefined;\n\t}\n\t& (TRelationType extends 'many' ?\n\t\t\t& {\n\t\t\t\twhere?:\n\t\t\t\t\t| SQL\n\t\t\t\t\t| undefined\n\t\t\t\t\t| ((\n\t\t\t\t\t\tfields: Simplify<\n\t\t\t\t\t\t\t[TTableConfig['columns']] extends [never] ? {}\n\t\t\t\t\t\t\t\t: TTableConfig['columns']\n\t\t\t\t\t\t>,\n\t\t\t\t\t\toperators: Operators,\n\t\t\t\t\t) => SQL | undefined);\n\t\t\t\torderBy?:\n\t\t\t\t\t| ValueOrArray<AnyColumn | SQL>\n\t\t\t\t\t| ((\n\t\t\t\t\t\tfields: Simplify<\n\t\t\t\t\t\t\t[TTableConfig['columns']] extends [never] ? {}\n\t\t\t\t\t\t\t\t: TTableConfig['columns']\n\t\t\t\t\t\t>,\n\t\t\t\t\t\toperators: OrderByOperators,\n\t\t\t\t\t) => ValueOrArray<AnyColumn | SQL>)\n\t\t\t\t\t| undefined;\n\t\t\t\tlimit?: number | Placeholder | undefined;\n\t\t\t}\n\t\t\t& (TIsRoot extends true ? {\n\t\t\t\t\toffset?: number | Placeholder | undefined;\n\t\t\t\t}\n\t\t\t\t: {})\n\t\t: {});\n\nexport interface TableRelationalConfig {\n\ttsName: string;\n\tdbName: string;\n\tcolumns: Record<string, Column>;\n\trelations: Record<string, Relation>;\n\tprimaryKey: AnyColumn[];\n\tschema?: string;\n}\n\nexport type TablesRelationalConfig = Record<string, TableRelationalConfig>;\n\nexport interface RelationalSchemaConfig<\n\tTSchema extends TablesRelationalConfig,\n> {\n\tfullSchema: Record<string, unknown>;\n\tschema: TSchema;\n\ttableNamesMap: Record<string, string>;\n}\n\nexport type ExtractTablesWithRelations<\n\tTSchema extends Record<string, unknown>,\n> = {\n\t[\n\t\tK in keyof TSchema as TSchema[K] extends Table ? K\n\t\t\t: never\n\t]: TSchema[K] extends Table ? {\n\t\t\ttsName: K & string;\n\t\t\tdbName: TSchema[K]['_']['name'];\n\t\t\tcolumns: TSchema[K]['_']['columns'];\n\t\t\trelations: ExtractTableRelationsFromSchema<\n\t\t\t\tTSchema,\n\t\t\t\tTSchema[K]['_']['name']\n\t\t\t>;\n\t\t\tprimaryKey: AnyColumn[];\n\t\t}\n\t\t: never;\n};\n\nexport type ReturnTypeOrValue<T> = T extends (...args: any[]) => infer R ? R\n\t: T;\n\nexport type BuildRelationResult<\n\tTSchema extends TablesRelationalConfig,\n\tTInclude,\n\tTRelations extends Record<string, Relation>,\n> = {\n\t[\n\t\tK in\n\t\t\t& NonUndefinedKeysOnly<TInclude>\n\t\t\t& keyof TRelations\n\t]: TRelations[K] extends infer TRel extends Relation ? BuildQueryResult<\n\t\t\tTSchema,\n\t\t\tFindTableByDBName<TSchema, TRel['referencedTableName']>,\n\t\t\tAssume<TInclude[K], true | Record<string, unknown>>\n\t\t> extends infer TResult ? TRel extends One ?\n\t\t\t\t\t| TResult\n\t\t\t\t\t| (Equal<TRel['isNullable'], false> extends true ? null : never)\n\t\t\t: TResult[]\n\t\t: never\n\t\t: never;\n};\n\nexport type NonUndefinedKeysOnly<T> =\n\t& ExtractObjectValues<\n\t\t{\n\t\t\t[K in keyof T as T[K] extends undefined ? never : K]: K;\n\t\t}\n\t>\n\t& keyof T;\n\nexport type BuildQueryResult<\n\tTSchema extends TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig,\n\tTFullSelection extends true | Record<string, unknown>,\n> = Equal<TFullSelection, true> extends true ? InferModelFromColumns<TTableConfig['columns']>\n\t: TFullSelection extends Record<string, unknown> ? Simplify<\n\t\t\t& (TFullSelection['columns'] extends Record<string, unknown> ? InferModelFromColumns<\n\t\t\t\t\t{\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tK in Equal<\n\t\t\t\t\t\t\t\tExclude<\n\t\t\t\t\t\t\t\t\tTFullSelection['columns'][\n\t\t\t\t\t\t\t\t\t\t& keyof TFullSelection['columns']\n\t\t\t\t\t\t\t\t\t\t& keyof TTableConfig['columns']\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tundefined\n\t\t\t\t\t\t\t\t>,\n\t\t\t\t\t\t\t\tfalse\n\t\t\t\t\t\t\t> extends true ? Exclude<\n\t\t\t\t\t\t\t\t\tkeyof TTableConfig['columns'],\n\t\t\t\t\t\t\t\t\tNonUndefinedKeysOnly<TFullSelection['columns']>\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t:\n\t\t\t\t\t\t\t\t\t& {\n\t\t\t\t\t\t\t\t\t\t[K in keyof TFullSelection['columns']]: Equal<\n\t\t\t\t\t\t\t\t\t\t\tTFullSelection['columns'][K],\n\t\t\t\t\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t\t\t\t\t> extends true ? K\n\t\t\t\t\t\t\t\t\t\t\t: never;\n\t\t\t\t\t\t\t\t\t}[keyof TFullSelection['columns']]\n\t\t\t\t\t\t\t\t\t& keyof TTableConfig['columns']\n\t\t\t\t\t\t]: TTableConfig['columns'][K];\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t: InferModelFromColumns<TTableConfig['columns']>)\n\t\t\t& (TFullSelection['extras'] extends\n\t\t\t\t| Record<string, unknown>\n\t\t\t\t| ((...args: any[]) => Record<string, unknown>) ? {\n\t\t\t\t\t[\n\t\t\t\t\t\tK in NonUndefinedKeysOnly<\n\t\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras']>\n\t\t\t\t\t\t>\n\t\t\t\t\t]: Assume<\n\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras']>[K],\n\t\t\t\t\t\tSQL.Aliased\n\t\t\t\t\t>['_']['type'];\n\t\t\t\t}\n\t\t\t\t: {})\n\t\t\t& (TFullSelection['with'] extends Record<string, unknown> ? BuildRelationResult<\n\t\t\t\t\tTSchema,\n\t\t\t\t\tTFullSelection['with'],\n\t\t\t\t\tTTableConfig['relations']\n\t\t\t\t>\n\t\t\t\t: {})\n\t\t>\n\t: never;\n\nexport interface RelationConfig<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends AnyColumn<{ tableName: TTableName }>[],\n> {\n\trelationName?: string;\n\tfields: TColumns;\n\treferences: ColumnsWithTable<TTableName, TForeignTableName, TColumns>;\n}\n\nexport function extractTablesRelationalConfig<\n\tTTables extends TablesRelationalConfig,\n>(\n\tschema: Record<string, unknown>,\n\tconfigHelpers: (table: Table) => any,\n): { tables: TTables; tableNamesMap: Record<string, string> } {\n\tif (\n\t\tObject.keys(schema).length === 1\n\t\t&& 'default' in schema\n\t\t&& !is(schema['default'], Table)\n\t) {\n\t\tschema = schema['default'] as Record<string, unknown>;\n\t}\n\n\t// table DB name -> schema table key\n\tconst tableNamesMap: Record<string, string> = {};\n\t// Table relations found before their tables - need to buffer them until we know the schema table key\n\tconst relationsBuffer: Record<\n\t\tstring,\n\t\t{ relations: Record<string, Relation>; primaryKey?: AnyColumn[] }\n\t> = {};\n\tconst tablesConfig: TablesRelationalConfig = {};\n\tfor (const [key, value] of Object.entries(schema)) {\n\t\tif (is(value, Table)) {\n\t\t\tconst dbName = getTableUniqueName(value);\n\t\t\tconst bufferedRelations = relationsBuffer[dbName];\n\t\t\ttableNamesMap[dbName] = key;\n\t\t\ttablesConfig[key] = {\n\t\t\t\ttsName: key,\n\t\t\t\tdbName: value[Table.Symbol.Name],\n\t\t\t\tschema: value[Table.Symbol.Schema],\n\t\t\t\tcolumns: value[Table.Symbol.Columns],\n\t\t\t\trelations: bufferedRelations?.relations ?? {},\n\t\t\t\tprimaryKey: bufferedRelations?.primaryKey ?? [],\n\t\t\t};\n\n\t\t\t// Fill in primary keys\n\t\t\tfor (\n\t\t\t\tconst column of Object.values(\n\t\t\t\t\t(value as Table)[Table.Symbol.Columns],\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tif (column.primary) {\n\t\t\t\t\ttablesConfig[key]!.primaryKey.push(column);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst extraConfig = value[Table.Symbol.ExtraConfigBuilder]?.((value as Table)[Table.Symbol.ExtraConfigColumns]);\n\t\t\tif (extraConfig) {\n\t\t\t\tfor (const configEntry of Object.values(extraConfig)) {\n\t\t\t\t\tif (is(configEntry, PrimaryKeyBuilder)) {\n\t\t\t\t\t\ttablesConfig[key]!.primaryKey.push(...configEntry.columns);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (is(value, Relations)) {\n\t\t\tconst dbName = getTableUniqueName(value.table);\n\t\t\tconst tableName = tableNamesMap[dbName];\n\t\t\tconst relations: Record<string, Relation> = value.config(\n\t\t\t\tconfigHelpers(value.table),\n\t\t\t);\n\t\t\t// let primaryKey: AnyColumn[] | undefined;\n\n\t\t\tfor (const [relationName, relation] of Object.entries(relations)) {\n\t\t\t\tif (tableName) {\n\t\t\t\t\tconst tableConfig = tablesConfig[tableName]!;\n\t\t\t\t\ttableConfig.relations[relationName] = relation;\n\t\t\t\t\t// if (primaryKey) {\n\t\t\t\t\t// \ttableConfig.primaryKey.push(...primaryKey);\n\t\t\t\t\t// }\n\t\t\t\t} else {\n\t\t\t\t\tif (!(dbName in relationsBuffer)) {\n\t\t\t\t\t\trelationsBuffer[dbName] = {\n\t\t\t\t\t\t\trelations: {},\n\t\t\t\t\t\t\t// primaryKey,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\trelationsBuffer[dbName]!.relations[relationName] = relation;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { tables: tablesConfig as TTables, tableNamesMap };\n}\n\nexport function relations<\n\tTTableName extends string,\n\tTRelations extends Record<string, Relation<any>>,\n>(\n\ttable: AnyTable<{ name: TTableName }>,\n\trelations: (helpers: TableRelationsHelpers<TTableName>) => TRelations,\n): Relations<TTableName, TRelations> {\n\treturn new Relations<TTableName, TRelations>(\n\t\ttable,\n\t\t(helpers: TableRelationsHelpers<TTableName>) =>\n\t\t\tObject.fromEntries(\n\t\t\t\tObject.entries(relations(helpers)).map(([key, value]) => [\n\t\t\t\t\tkey,\n\t\t\t\t\tvalue.withFieldName(key),\n\t\t\t\t]),\n\t\t\t) as TRelations,\n\t);\n}\n\nexport function createOne<TTableName extends string>(sourceTable: Table) {\n\treturn function one<\n\t\tTForeignTable extends Table,\n\t\tTColumns extends [\n\t\t\tAnyColumn<{ tableName: TTableName }>,\n\t\t\t...AnyColumn<{ tableName: TTableName }>[],\n\t\t],\n\t>(\n\t\ttable: TForeignTable,\n\t\tconfig?: RelationConfig<TTableName, TForeignTable['_']['name'], TColumns>,\n\t): One<\n\t\tTForeignTable['_']['name'],\n\t\tEqual<TColumns[number]['_']['notNull'], true>\n\t> {\n\t\treturn new One(\n\t\t\tsourceTable,\n\t\t\ttable,\n\t\t\tconfig,\n\t\t\t(config?.fields.reduce<boolean>((res, f) => res && f.notNull, true)\n\t\t\t\t?? false) as Equal<TColumns[number]['_']['notNull'], true>,\n\t\t);\n\t};\n}\n\nexport function createMany(sourceTable: Table) {\n\treturn function many<TForeignTable extends Table>(\n\t\treferencedTable: TForeignTable,\n\t\tconfig?: { relationName: string },\n\t): Many<TForeignTable['_']['name']> {\n\t\treturn new Many(sourceTable, referencedTable, config);\n\t};\n}\n\nexport interface NormalizedRelation {\n\tfields: AnyColumn[];\n\treferences: AnyColumn[];\n}\n\nexport function normalizeRelation(\n\tschema: TablesRelationalConfig,\n\ttableNamesMap: Record<string, string>,\n\trelation: Relation,\n): NormalizedRelation {\n\tif (is(relation, One) && relation.config) {\n\t\treturn {\n\t\t\tfields: relation.config.fields,\n\t\t\treferences: relation.config.references,\n\t\t};\n\t}\n\n\tconst referencedTableTsName = tableNamesMap[getTableUniqueName(relation.referencedTable)];\n\tif (!referencedTableTsName) {\n\t\tthrow new Error(\n\t\t\t`Table \"${relation.referencedTable[Table.Symbol.Name]}\" not found in schema`,\n\t\t);\n\t}\n\n\tconst referencedTableConfig = schema[referencedTableTsName];\n\tif (!referencedTableConfig) {\n\t\tthrow new Error(`Table \"${referencedTableTsName}\" not found in schema`);\n\t}\n\n\tconst sourceTable = relation.sourceTable;\n\tconst sourceTableTsName = tableNamesMap[getTableUniqueName(sourceTable)];\n\tif (!sourceTableTsName) {\n\t\tthrow new Error(\n\t\t\t`Table \"${sourceTable[Table.Symbol.Name]}\" not found in schema`,\n\t\t);\n\t}\n\n\tconst reverseRelations: Relation[] = [];\n\tfor (\n\t\tconst referencedTableRelation of Object.values(\n\t\t\treferencedTableConfig.relations,\n\t\t)\n\t) {\n\t\tif (\n\t\t\t(relation.relationName\n\t\t\t\t&& relation !== referencedTableRelation\n\t\t\t\t&& referencedTableRelation.relationName === relation.relationName)\n\t\t\t|| (!relation.relationName\n\t\t\t\t&& referencedTableRelation.referencedTable === relation.sourceTable)\n\t\t) {\n\t\t\treverseRelations.push(referencedTableRelation);\n\t\t}\n\t}\n\n\tif (reverseRelations.length > 1) {\n\t\tthrow relation.relationName\n\t\t\t? new Error(\n\t\t\t\t`There are multiple relations with name \"${relation.relationName}\" in table \"${referencedTableTsName}\"`,\n\t\t\t)\n\t\t\t: new Error(\n\t\t\t\t`There are multiple relations between \"${referencedTableTsName}\" and \"${\n\t\t\t\t\trelation.sourceTable[Table.Symbol.Name]\n\t\t\t\t}\". Please specify relation name`,\n\t\t\t);\n\t}\n\n\tif (\n\t\treverseRelations[0]\n\t\t&& is(reverseRelations[0], One)\n\t\t&& reverseRelations[0].config\n\t) {\n\t\treturn {\n\t\t\tfields: reverseRelations[0].config.references,\n\t\t\treferences: reverseRelations[0].config.fields,\n\t\t};\n\t}\n\n\tthrow new Error(\n\t\t`There is not enough information to infer relation \"${sourceTableTsName}.${relation.fieldName}\"`,\n\t);\n}\n\nexport function createTableRelationsHelpers<TTableName extends string>(\n\tsourceTable: AnyTable<{ name: TTableName }>,\n) {\n\treturn {\n\t\tone: createOne<TTableName>(sourceTable),\n\t\tmany: createMany(sourceTable),\n\t};\n}\n\nexport type TableRelationsHelpers<TTableName extends string> = ReturnType<\n\ttypeof createTableRelationsHelpers<TTableName>\n>;\n\nexport interface BuildRelationalQueryResult<\n\tTTable extends Table = Table,\n\tTColumn extends Column = Column,\n> {\n\ttableTsKey: string;\n\tselection: {\n\t\tdbKey: string;\n\t\ttsKey: string;\n\t\tfield: TColumn | SQL | SQL.Aliased;\n\t\trelationTableTsKey: string | undefined;\n\t\tisJson: boolean;\n\t\tisExtra?: boolean;\n\t\tselection: BuildRelationalQueryResult<TTable>['selection'];\n\t}[];\n\tsql: TTable | SQL;\n}\n\nexport function mapRelationalRow(\n\ttablesConfig: TablesRelationalConfig,\n\ttableConfig: TableRelationalConfig,\n\trow: unknown[],\n\tbuildQueryResultSelection: BuildRelationalQueryResult['selection'],\n\tmapColumnValue: (value: unknown) => unknown = (value) => value,\n): Record<string, unknown> {\n\tconst result: Record<string, unknown> = {};\n\n\tfor (\n\t\tconst [\n\t\t\tselectionItemIndex,\n\t\t\tselectionItem,\n\t\t] of buildQueryResultSelection.entries()\n\t) {\n\t\tif (selectionItem.isJson) {\n\t\t\tconst relation = tableConfig.relations[selectionItem.tsKey]!;\n\t\t\tconst rawSubRows = row[selectionItemIndex] as\n\t\t\t\t| unknown[]\n\t\t\t\t| null\n\t\t\t\t| [null]\n\t\t\t\t| string;\n\t\t\tconst subRows = typeof rawSubRows === 'string'\n\t\t\t\t? (JSON.parse(rawSubRows) as unknown[])\n\t\t\t\t: rawSubRows;\n\t\t\tresult[selectionItem.tsKey] = is(relation, One)\n\t\t\t\t? subRows\n\t\t\t\t\t&& mapRelationalRow(\n\t\t\t\t\t\ttablesConfig,\n\t\t\t\t\t\ttablesConfig[selectionItem.relationTableTsKey!]!,\n\t\t\t\t\t\tsubRows,\n\t\t\t\t\t\tselectionItem.selection,\n\t\t\t\t\t\tmapColumnValue,\n\t\t\t\t\t)\n\t\t\t\t: (subRows as unknown[][]).map((subRow) =>\n\t\t\t\t\tmapRelationalRow(\n\t\t\t\t\t\ttablesConfig,\n\t\t\t\t\t\ttablesConfig[selectionItem.relationTableTsKey!]!,\n\t\t\t\t\t\tsubRow,\n\t\t\t\t\t\tselectionItem.selection,\n\t\t\t\t\t\tmapColumnValue,\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t} else {\n\t\t\tconst value = mapColumnValue(row[selectionItemIndex]);\n\t\t\tconst field = selectionItem.field!;\n\t\t\tlet decoder;\n\t\t\tif (is(field, Column)) {\n\t\t\t\tdecoder = field;\n\t\t\t} else if (is(field, SQL)) {\n\t\t\t\tdecoder = field.decoder;\n\t\t\t} else {\n\t\t\t\tdecoder = field.sql.decoder;\n\t\t\t}\n\t\t\tresult[selectionItem.tsKey] = value === null ? null : decoder.mapFromDriverValue(value);\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function mapRelationalRowFromObj(\n\ttablesConfig: TablesRelationalConfig,\n\ttableConfig: TableRelationalConfig,\n\trow: unknown[],\n\tbuildQueryResultSelection: BuildRelationalQueryResult['selection'],\n\tmapColumnValue: (value: unknown) => unknown = (value) => value,\n): Record<string, unknown> {\n\tconst result: Record<string, unknown> = {};\n\n\tfor (\n\t\tconst [\n\t\t\tselectionItemIndex,\n\t\t\tselectionItem,\n\t\t] of buildQueryResultSelection.entries()\n\t) {\n\t\tif (selectionItem.isJson) {\n\t\t\tconst relation = tableConfig.relations[selectionItem.tsKey]!;\n\t\t\tconst isOne = is(relation, One);\n\t\t\tconst rawSubRows = row[selectionItemIndex] as unknown[] | null | [null] | string;\n\n\t\t\tlet subRows = rawSubRows as unknown[] | null;\n\t\t\tif (subRows || Array.isArray(subRows)) {\n\t\t\t\tsubRows = (typeof rawSubRows === 'string' ? JSON.parse(rawSubRows) : rawSubRows) as unknown[];\n\n\t\t\t\tsubRows = isOne\n\t\t\t\t\t? subRows.flatMap((r) => Array.isArray(r) ? r : Object.values(r as any))\n\t\t\t\t\t: subRows.map((r) => Array.isArray(r) ? r : Object.values(r as any));\n\t\t\t}\n\n\t\t\tresult[selectionItem.tsKey] = isOne\n\t\t\t\t? subRows\n\t\t\t\t\t&& mapRelationalRowFromObj(\n\t\t\t\t\t\ttablesConfig,\n\t\t\t\t\t\ttablesConfig[selectionItem.relationTableTsKey!]!,\n\t\t\t\t\t\tsubRows,\n\t\t\t\t\t\tselectionItem.selection,\n\t\t\t\t\t\tmapColumnValue,\n\t\t\t\t\t)\n\t\t\t\t: ((subRows ?? []) as unknown[][]).map((subRow) =>\n\t\t\t\t\tmapRelationalRowFromObj(\n\t\t\t\t\t\ttablesConfig,\n\t\t\t\t\t\ttablesConfig[selectionItem.relationTableTsKey!]!,\n\t\t\t\t\t\tsubRow,\n\t\t\t\t\t\tselectionItem.selection,\n\t\t\t\t\t\tmapColumnValue,\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t} else {\n\t\t\tconst value = mapColumnValue(row[selectionItemIndex]);\n\t\t\tconst field = selectionItem.field!;\n\t\t\tlet decoder;\n\t\t\tif (is(field, Column)) {\n\t\t\t\tdecoder = field;\n\t\t\t} else if (is(field, SQL)) {\n\t\t\t\tdecoder = field.decoder;\n\t\t\t} else {\n\t\t\t\tdecoder = field.sql.decoder;\n\t\t\t}\n\t\t\tresult[selectionItem.tsKey] = value === null ? null : decoder.mapFromDriverValue(value);\n\t\t}\n\t}\n\n\treturn result;\n}\n", "import { entityKind } from '~/entity.ts';\n\nexport abstract class QueryPromise<T> implements Promise<T> {\n\tstatic readonly [entityKind]: string = 'QueryPromise';\n\n\t[Symbol.toStringTag] = 'QueryPromise';\n\n\tcatch<TResult = never>(\n\t\tonRejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined,\n\t): Promise<T | TResult> {\n\t\treturn this.then(undefined, onRejected);\n\t}\n\n\tfinally(onFinally?: (() => void) | null | undefined): Promise<T> {\n\t\treturn this.then(\n\t\t\t(value) => {\n\t\t\t\tonFinally?.();\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\t(reason) => {\n\t\t\t\tonFinally?.();\n\t\t\t\tthrow reason;\n\t\t\t},\n\t\t);\n\t}\n\n\tthen<TResult1 = T, TResult2 = never>(\n\t\tonFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null,\n\t\tonRejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null,\n\t): Promise<TResult1 | TResult2> {\n\t\treturn this.execute().then(onFulfilled, onRejected);\n\t}\n\n\tabstract execute(): Promise<T>;\n}\n", "import * as V1 from '~/_relations.ts';\nimport { entityKind } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { Query, QueryWithTypings, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { KnownKeysOnly } from '~/utils.ts';\nimport type { SQLiteDialect } from '../dialect.ts';\nimport type { PreparedQueryConfig, SQLitePreparedQuery, SQLiteSession } from '../session.ts';\nimport type { SQLiteTable } from '../table.ts';\n\nexport type SQLiteRelationalQueryKind<TMode extends 'sync' | 'async', TResult> = TMode extends 'async'\n\t? SQLiteRelationalQuery<TMode, TResult>\n\t: SQLiteSyncRelationalQuery<TResult>;\n\nexport class _RelationalQueryBuilder<\n\tTMode extends 'sync' | 'async',\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends V1.TablesRelationalConfig,\n\tTFields extends V1.TableRelationalConfig,\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteAsyncRelationalQueryBuilder';\n\n\tconstructor(\n\t\tprotected mode: TMode,\n\t\tprotected fullSchema: Record<string, unknown>,\n\t\tprotected schema: TSchema,\n\t\tprotected tableNamesMap: Record<string, string>,\n\t\tprotected table: SQLiteTable,\n\t\tprotected tableConfig: V1.TableRelationalConfig,\n\t\tprotected dialect: SQLiteDialect,\n\t\tprotected session: SQLiteSession<'async', unknown, TFullSchema, any, TSchema>,\n\t) {}\n\n\tfindMany<TConfig extends V1.DBQueryConfig<'many', true, TSchema, TFields>>(\n\t\tconfig?: KnownKeysOnly<TConfig, V1.DBQueryConfig<'many', true, TSchema, TFields>>,\n\t): SQLiteRelationalQueryKind<TMode, V1.BuildQueryResult<TSchema, TFields, TConfig>[]> {\n\t\treturn (this.mode === 'sync'\n\t\t\t? new SQLiteSyncRelationalQuery(\n\t\t\t\tthis.fullSchema,\n\t\t\t\tthis.schema,\n\t\t\t\tthis.tableNamesMap,\n\t\t\t\tthis.table,\n\t\t\t\tthis.tableConfig,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.session,\n\t\t\t\tconfig ? (config as V1.DBQueryConfig<'many', true>) : {},\n\t\t\t\t'many',\n\t\t\t)\n\t\t\t: new SQLiteRelationalQuery(\n\t\t\t\tthis.fullSchema,\n\t\t\t\tthis.schema,\n\t\t\t\tthis.tableNamesMap,\n\t\t\t\tthis.table,\n\t\t\t\tthis.tableConfig,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.session,\n\t\t\t\tconfig ? (config as V1.DBQueryConfig<'many', true>) : {},\n\t\t\t\t'many',\n\t\t\t)) as SQLiteRelationalQueryKind<TMode, V1.BuildQueryResult<TSchema, TFields, TConfig>[]>;\n\t}\n\n\tfindFirst<TSelection extends Omit<V1.DBQueryConfig<'many', true, TSchema, TFields>, 'limit'>>(\n\t\tconfig?: KnownKeysOnly<TSelection, Omit<V1.DBQueryConfig<'many', true, TSchema, TFields>, 'limit'>>,\n\t): SQLiteRelationalQueryKind<TMode, V1.BuildQueryResult<TSchema, TFields, TSelection> | undefined> {\n\t\treturn (this.mode === 'sync'\n\t\t\t? new SQLiteSyncRelationalQuery(\n\t\t\t\tthis.fullSchema,\n\t\t\t\tthis.schema,\n\t\t\t\tthis.tableNamesMap,\n\t\t\t\tthis.table,\n\t\t\t\tthis.tableConfig,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.session,\n\t\t\t\tconfig ? { ...(config as V1.DBQueryConfig<'many', true> | undefined), limit: 1 } : { limit: 1 },\n\t\t\t\t'first',\n\t\t\t)\n\t\t\t: new SQLiteRelationalQuery(\n\t\t\t\tthis.fullSchema,\n\t\t\t\tthis.schema,\n\t\t\t\tthis.tableNamesMap,\n\t\t\t\tthis.table,\n\t\t\t\tthis.tableConfig,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.session,\n\t\t\t\tconfig ? { ...(config as V1.DBQueryConfig<'many', true> | undefined), limit: 1 } : { limit: 1 },\n\t\t\t\t'first',\n\t\t\t)) as SQLiteRelationalQueryKind<TMode, V1.BuildQueryResult<TSchema, TFields, TSelection> | undefined>;\n\t}\n}\n\nexport class SQLiteRelationalQuery<TType extends 'sync' | 'async', TResult> extends QueryPromise<TResult>\n\timplements RunnableQuery<TResult, 'sqlite'>, SQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteAsyncRelationalQuery';\n\n\tdeclare readonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly type: TType;\n\t\treadonly result: TResult;\n\t};\n\n\t/** @internal */\n\tmode: 'many' | 'first';\n\n\tconstructor(\n\t\tprivate fullSchema: Record<string, unknown>,\n\t\tprivate schema: V1.TablesRelationalConfig,\n\t\tprivate tableNamesMap: Record<string, string>,\n\t\t/** @internal */\n\t\tpublic table: SQLiteTable,\n\t\tprivate tableConfig: V1.TableRelationalConfig,\n\t\tprivate dialect: SQLiteDialect,\n\t\tprivate session: SQLiteSession<\n\t\t\t'sync' | 'async',\n\t\t\tunknown,\n\t\t\tRecord<string, unknown>,\n\t\t\tany,\n\t\t\tV1.TablesRelationalConfig\n\t\t>,\n\t\tprivate config: V1.DBQueryConfig<'many', true> | true,\n\t\tmode: 'many' | 'first',\n\t) {\n\t\tsuper();\n\t\tthis.mode = mode;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect._buildRelationalQuery({\n\t\t\tfullSchema: this.fullSchema,\n\t\t\tschema: this.schema,\n\t\t\ttableNamesMap: this.tableNamesMap,\n\t\t\ttable: this.table,\n\t\t\ttableConfig: this.tableConfig,\n\t\t\tqueryConfig: this.config,\n\t\t\ttableAlias: this.tableConfig.tsName,\n\t\t}).sql as SQL;\n\t}\n\n\t/** @internal */\n\t_prepare(\n\t\tisOneTimeQuery = false,\n\t): SQLitePreparedQuery<PreparedQueryConfig & { type: TType; all: TResult; get: TResult; execute: TResult }> {\n\t\tconst { query, builtQuery } = this._toSQL();\n\n\t\treturn this.session[isOneTimeQuery ? 'prepareOneTimeQuery' : 'prepareQuery'](\n\t\t\tbuiltQuery,\n\t\t\tundefined,\n\t\t\tthis.mode === 'first' ? 'get' : 'all',\n\t\t\ttrue,\n\t\t\t(rawRows, mapColumnValue) => {\n\t\t\t\tconst rows = rawRows.map((row) =>\n\t\t\t\t\tV1.mapRelationalRow(this.schema, this.tableConfig, row, query.selection, mapColumnValue)\n\t\t\t\t);\n\t\t\t\tif (this.mode === 'first') {\n\t\t\t\t\treturn rows[0] as TResult;\n\t\t\t\t}\n\t\t\t\treturn rows as TResult;\n\t\t\t},\n\t\t) as SQLitePreparedQuery<PreparedQueryConfig & { type: TType; all: TResult; get: TResult; execute: TResult }>;\n\t}\n\n\tprepare(): SQLitePreparedQuery<PreparedQueryConfig & { type: TType; all: TResult; get: TResult; execute: TResult }> {\n\t\treturn this._prepare(false);\n\t}\n\n\tprivate _toSQL(): { query: V1.BuildRelationalQueryResult; builtQuery: QueryWithTypings } {\n\t\tconst query = this.dialect._buildRelationalQuery({\n\t\t\tfullSchema: this.fullSchema,\n\t\t\tschema: this.schema,\n\t\t\ttableNamesMap: this.tableNamesMap,\n\t\t\ttable: this.table,\n\t\t\ttableConfig: this.tableConfig,\n\t\t\tqueryConfig: this.config,\n\t\t\ttableAlias: this.tableConfig.tsName,\n\t\t});\n\n\t\tconst builtQuery = this.dialect.sqlToQuery(query.sql as SQL);\n\n\t\treturn { query, builtQuery };\n\t}\n\n\ttoSQL(): Query {\n\t\treturn this._toSQL().builtQuery;\n\t}\n\n\t/** @internal */\n\texecuteRaw(): TResult {\n\t\tif (this.mode === 'first') {\n\t\t\treturn this._prepare(false).get() as TResult;\n\t\t}\n\t\treturn this._prepare(false).all() as TResult;\n\t}\n\n\toverride async execute(): Promise<TResult> {\n\t\treturn this.executeRaw();\n\t}\n}\n\nexport class SQLiteSyncRelationalQuery<TResult> extends SQLiteRelationalQuery<'sync', TResult> {\n\tstatic override readonly [entityKind]: string = 'SQLiteSyncRelationalQuery';\n\n\tsync(): TResult {\n\t\treturn this.executeRaw();\n\t}\n}\n", "import { entityKind } from '~/entity.ts';\nimport { SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteSession } from '../session.ts';\nimport type { SQLiteTable } from '../table.ts';\nimport type { SQLiteView } from '../view.ts';\n\nexport class SQLiteCountBuilder<\n\tTSession extends SQLiteSession<any, any, any, any>,\n> extends SQL<number> implements Promise<number>, SQLWrapper<number> {\n\tprivate sql: SQL<number>;\n\n\tstatic override readonly [entityKind]: string = 'SQLiteCountBuilderAsync';\n\t[Symbol.toStringTag] = 'SQLiteCountBuilderAsync';\n\n\tprivate session: TSession;\n\n\tprivate static buildEmbeddedCount(\n\t\tsource: SQLiteTable | SQLiteView | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t): SQL<number> {\n\t\treturn sql<number>`(select count(*) from ${source}${sql.raw(' where ').if(filters)}${filters})`;\n\t}\n\n\tprivate static buildCount(\n\t\tsource: SQLiteTable | SQLiteView | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t): SQL<number> {\n\t\treturn sql<number>`select count(*) from ${source}${sql.raw(' where ').if(filters)}${filters}`;\n\t}\n\n\tconstructor(\n\t\treadonly params: {\n\t\t\tsource: SQLiteTable | SQLiteView | SQL | SQLWrapper;\n\t\t\tfilters?: SQL<unknown>;\n\t\t\tsession: TSession;\n\t\t},\n\t) {\n\t\tsuper(SQLiteCountBuilder.buildEmbeddedCount(params.source, params.filters).queryChunks);\n\n\t\tthis.session = params.session;\n\n\t\tthis.sql = SQLiteCountBuilder.buildCount(\n\t\t\tparams.source,\n\t\t\tparams.filters,\n\t\t);\n\t}\n\n\tthen<TResult1 = number, TResult2 = never>(\n\t\tonfulfilled?: ((value: number) => TResult1 | PromiseLike<TResult1>) | null | undefined,\n\t\tonrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined,\n\t): Promise<TResult1 | TResult2> {\n\t\treturn Promise.resolve(this.session.count(this.sql)).then(\n\t\t\tonfulfilled,\n\t\t\tonrejected,\n\t\t);\n\t}\n\n\tcatch(\n\t\tonRejected?: ((reason: any) => never | PromiseLike<never>) | null | undefined,\n\t): Promise<number> {\n\t\treturn this.then(undefined, onRejected);\n\t}\n\n\tfinally(onFinally?: (() => void) | null | undefined): Promise<number> {\n\t\treturn this.then(\n\t\t\t(value) => {\n\t\t\t\tonFinally?.();\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\t(reason) => {\n\t\t\t\tonFinally?.();\n\t\t\t\tthrow reason;\n\t\t\t},\n\t\t);\n\t}\n}\n", "import type * as V1 from './_relations.ts';\nimport { OriginalColumn } from './column-common.ts';\nimport type { AnyColumn } from './column.ts';\nimport { Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport { View } from './sql/sql.ts';\nimport { isSQLWrapper, SQL, sql } from './sql/sql.ts';\nimport { Subquery } from './subquery.ts';\nimport { Table } from './table.ts';\nimport { ViewBaseConfig } from './view-common.ts';\n\nexport class ColumnTableAliasProxyHandler<TColumn extends Column> implements ProxyHandler<TColumn> {\n\tstatic readonly [entityKind]: string = 'ColumnTableAliasProxyHandler';\n\n\tconstructor(private table: Table | View, private ignoreColumnAlias?: boolean) {}\n\n\tget(columnObj: TColumn, prop: string | symbol): any {\n\t\tif (prop === 'table') {\n\t\t\treturn this.table;\n\t\t}\n\n\t\tif (prop === 'isAlias' && this.ignoreColumnAlias) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn columnObj[prop as keyof TColumn];\n\t}\n}\n\nexport class ViewSelectionAliasProxyHandler<TSelection extends Record<string, unknown>>\n\timplements ProxyHandler<TSelection>\n{\n\tstatic readonly [entityKind]: string = 'ViewSelectionAliasProxyHandler';\n\n\tconstructor(protected view: View, protected selection: TSelection, private ignoreColumnAlias?: boolean) {}\n\n\tget(selection: TSelection, prop: string | symbol): any {\n\t\tconst value = selection[prop as keyof TSelection];\n\n\t\tif (is(value, Column)) return new Proxy(value, new ColumnTableAliasProxyHandler(this.view, this.ignoreColumnAlias));\n\t\tif (\n\t\t\tis(value, Subquery) || is(value, SQL) || is(value, SQL.Aliased) || isSQLWrapper(value)\n\t\t\t|| (typeof value !== 'object' || value === null)\n\t\t) return value;\n\n\t\treturn new Proxy(value as Record<string, unknown>, this);\n\t}\n}\n\nexport class TableAliasProxyHandler<T extends Table | View> implements ProxyHandler<T> {\n\tstatic readonly [entityKind]: string = 'TableAliasProxyHandler';\n\n\tconstructor(private alias: string, private replaceOriginalName: boolean, private ignoreColumnAlias?: boolean) {}\n\n\tget(target: T, prop: string | symbol): any {\n\t\tif (prop === Table.Symbol.IsAlias) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (prop === Table.Symbol.Name) {\n\t\t\treturn this.alias;\n\t\t}\n\n\t\tif (this.replaceOriginalName && prop === Table.Symbol.OriginalName) {\n\t\t\treturn this.alias;\n\t\t}\n\n\t\tif (prop === ViewBaseConfig) {\n\t\t\treturn {\n\t\t\t\t...target[ViewBaseConfig as keyof typeof target],\n\t\t\t\tname: this.alias,\n\t\t\t\tisAlias: true,\n\t\t\t\tselectedFields: new Proxy(\n\t\t\t\t\t(<View> target)[ViewBaseConfig].selectedFields,\n\t\t\t\t\tnew ViewSelectionAliasProxyHandler(\n\t\t\t\t\t\tnew Proxy(target, this) as View,\n\t\t\t\t\t\t(<View> target)[ViewBaseConfig].selectedFields,\n\t\t\t\t\t\tthis.ignoreColumnAlias,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\n\t\tif (prop === Table.Symbol.Columns) {\n\t\t\tconst columns = (target as Table)[Table.Symbol.Columns];\n\t\t\tif (!columns) {\n\t\t\t\treturn columns;\n\t\t\t}\n\n\t\t\tif (is(target, View)) {\n\t\t\t\treturn new Proxy(\n\t\t\t\t\t(<View> target)[Table.Symbol.Columns],\n\t\t\t\t\tnew ViewSelectionAliasProxyHandler(\n\t\t\t\t\t\tnew Proxy(target, this) as View,\n\t\t\t\t\t\t(<View> target)[Table.Symbol.Columns],\n\t\t\t\t\t\tthis.ignoreColumnAlias,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst proxiedColumns: { [key: string]: any } = {};\n\n\t\t\tObject.keys(columns).map((key) => {\n\t\t\t\tproxiedColumns[key] = new Proxy(\n\t\t\t\t\tcolumns[key]!,\n\t\t\t\t\tnew ColumnTableAliasProxyHandler(new Proxy(target, this), this.ignoreColumnAlias),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn proxiedColumns;\n\t\t}\n\n\t\tconst value = target[prop as keyof typeof target];\n\t\tif (is(value, Column)) {\n\t\t\treturn new Proxy(\n\t\t\t\tvalue as AnyColumn,\n\t\t\t\tnew ColumnTableAliasProxyHandler(new Proxy(target, this), this.ignoreColumnAlias),\n\t\t\t);\n\t\t}\n\n\t\treturn value;\n\t}\n}\n\nexport class ColumnAliasProxyHandler<T extends Column> implements ProxyHandler<T> {\n\tstatic readonly [entityKind]: string = 'ColumnAliasProxyHandler';\n\n\tconstructor(private alias: string) {}\n\n\tget(target: T, prop: keyof Column): any {\n\t\tif (prop === 'isAlias') {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (prop === 'name') {\n\t\t\treturn this.alias;\n\t\t}\n\n\t\tif (prop === 'keyAsName') {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (prop === OriginalColumn) {\n\t\t\treturn () => target;\n\t\t}\n\n\t\treturn target[prop];\n\t}\n}\n\nexport class RelationTableAliasProxyHandler<T extends V1.Relation> implements ProxyHandler<T> {\n\tstatic readonly [entityKind]: string = 'RelationTableAliasProxyHandler';\n\n\tconstructor(private alias: string) {}\n\n\tget(target: T, prop: string | symbol): any {\n\t\tif (prop === 'sourceTable') {\n\t\t\treturn aliasedTable(target.sourceTable, this.alias);\n\t\t}\n\n\t\treturn target[prop as keyof typeof target];\n\t}\n}\n\nexport function aliasedTable<T extends Table | View>(table: T, tableAlias: string): T {\n\treturn new Proxy(table, new TableAliasProxyHandler(tableAlias, false, false));\n}\n\nexport function aliasedColumn<T extends Column>(column: T, alias: string): T {\n\treturn new Proxy(column, new ColumnAliasProxyHandler(alias));\n}\n\nexport function aliasedRelation<T extends V1.Relation>(relation: T, tableAlias: string): T {\n\treturn new Proxy(relation, new RelationTableAliasProxyHandler(tableAlias));\n}\n\nexport function aliasedTableColumn<T extends AnyColumn>(column: T, tableAlias: string): T {\n\treturn new Proxy(\n\t\tcolumn,\n\t\tnew ColumnTableAliasProxyHandler(\n\t\t\tnew Proxy(column.table, new TableAliasProxyHandler(tableAlias, false, false)),\n\t\t\tfalse,\n\t\t),\n\t);\n}\n\nexport function mapColumnsInAliasedSQLToAlias(query: SQL.Aliased, alias: string): SQL.Aliased {\n\treturn new SQL.Aliased(mapColumnsInSQLToAlias(query.sql, alias), query.fieldAlias);\n}\n\nexport function mapColumnsInSQLToAlias(query: SQL, alias: string): SQL {\n\treturn sql.join(query.queryChunks.map((c) => {\n\t\tif (is(c, Column)) {\n\t\t\treturn aliasedTableColumn(c, alias);\n\t\t}\n\t\tif (is(c, SQL)) {\n\t\t\treturn mapColumnsInSQLToAlias(c, alias);\n\t\t}\n\t\tif (is(c, SQL.Aliased)) {\n\t\t\treturn mapColumnsInAliasedSQLToAlias(c, alias);\n\t\t}\n\t\treturn c;\n\t}));\n}\n\n// Defined separately from the Column class to resolve circular dependency\nColumn.prototype.as = function(alias: string): Column {\n\treturn aliasedColumn(this, alias);\n};\n\nexport function getOriginalColumnFromAlias<T extends Column>(column: T): T {\n\treturn column[OriginalColumn]();\n}\n", "import { entityKind } from '~/entity.ts';\n\nexport class DrizzleError extends Error {\n\tstatic readonly [entityKind]: string = 'DrizzleError';\n\n\tconstructor({ message, cause }: { message?: string; cause?: unknown }) {\n\t\tsuper(message);\n\t\tthis.name = 'DrizzleError';\n\t\tthis.cause = cause;\n\t}\n}\n\nexport class DrizzleQueryError extends Error {\n\tstatic readonly [entityKind]: string = 'DrizzleQueryError';\n\n\tconstructor(\n\t\tpublic query: string,\n\t\tpublic params: any[],\n\t\tpublic override cause?: Error,\n\t) {\n\t\tsuper(`Failed query: ${query}\\nparams: ${params}`);\n\t\tError.captureStackTrace(this, DrizzleQueryError);\n\n\t\t// ES2022+: preserves original error on `.cause`\n\t\tif (cause) (this as any).cause = cause;\n\t}\n}\n\nexport class TransactionRollbackError extends DrizzleError {\n\tstatic override readonly [entityKind]: string = 'TransactionRollbackError';\n\n\tconstructor() {\n\t\tsuper({ message: 'Rollback' });\n\t}\n}\n", "import { IsAlias, OriginalName, Table, TableColumns, TableSchema } from '~/table.ts';\nimport { aliasedTable } from './alias.ts';\nimport type { CasingCache } from './casing.ts';\nimport { type AnyColumn, Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport { DrizzleError } from './errors.ts';\nimport {\n\tand,\n\tarrayContained,\n\tarrayContains,\n\tarrayOverlaps,\n\tasc,\n\tbetween,\n\tdesc,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tisNotNull,\n\tisNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotIlike,\n\tnotInArray,\n\tnotLike,\n\tor,\n} from './sql/expressions/index.ts';\nimport { type CommentInput, noopDecoder, Placeholder, SQL, sql, type SQLWrapper, View } from './sql/sql.ts';\nimport type { Assume, DrizzleTypeError, Equal, Simplify, ValueOrArray } from './utils.ts';\n\nexport type FilteredSchemaEntry = Table<any> | View<string, boolean, FieldSelection>;\n\nexport type SchemaEntry = Table<any> | View<string, boolean, any>;\n\nexport type Schema = Record<string, SchemaEntry>;\n\nexport type GetTableViewColumns<T extends SchemaEntry> = T extends View<string, boolean, any> ? T['_']['selectedFields']\n\t: T extends Table<any> ? T['_']['columns']\n\t: never;\n\nexport type GetTableViewFieldSelection<T extends SchemaEntry> = T extends View<string, boolean, FieldSelection>\n\t? T['_']['selectedFields']\n\t: T extends Table<any> ? T['_']['columns']\n\t: never;\n\nexport type FieldValue =\n\t| Column<any>\n\t| SQLWrapper\n\t| SQL.Aliased\n\t| SQL;\n\nexport type FieldSelection = Record<string, FieldValue>;\n\nexport function processRelations(tablesConfig: TablesRelationalConfig, tables: Schema) {\n\tfor (const tableConfig of Object.values(tablesConfig)) {\n\t\tfor (const [relationFieldName, relation] of Object.entries(tableConfig.relations)) {\n\t\t\tif (!is(relation, Relation)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\trelation.sourceTable = tableConfig.table;\n\t\t\trelation.fieldName = relationFieldName;\n\t\t}\n\t}\n\n\tfor (const [sourceTableName, tableConfig] of Object.entries(tablesConfig)) {\n\t\tfor (const [relationFieldName, relation] of Object.entries(tableConfig.relations)) {\n\t\t\tif (!is(relation, Relation)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet reverseRelation: Relation | undefined;\n\t\t\tconst {\n\t\t\t\ttargetTableName,\n\t\t\t\talias,\n\t\t\t\tsourceColumns,\n\t\t\t\ttargetColumns,\n\t\t\t\tthroughTable,\n\t\t\t\tsourceTable,\n\t\t\t\tthrough,\n\t\t\t\twhere,\n\t\t\t\tsourceColumnTableNames,\n\t\t\t\ttargetColumnTableNames,\n\t\t\t} = relation;\n\t\t\tconst relationPrintName = `relations -> ${tableConfig.name}: { ${relationFieldName}: r.${\n\t\t\t\tis(relation, One) ? 'one' : 'many'\n\t\t\t}.${targetTableName}(...) }`;\n\n\t\t\tif (relationFieldName in tableConfig.table[TableColumns]) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`${relationPrintName}: relation name collides with column \"${relationFieldName}\" of table \"${tableConfig.name}\"`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (typeof alias === 'string' && !alias) {\n\t\t\t\tthrow new Error(`${relationPrintName}: \"alias\" cannot be an empty string - omit it if you don't need it`);\n\t\t\t}\n\n\t\t\tif (sourceColumns?.length === 0) {\n\t\t\t\tthrow new Error(`${relationPrintName}: \"from\" cannot be empty`);\n\t\t\t}\n\n\t\t\tif (targetColumns?.length === 0) {\n\t\t\t\tthrow new Error(`${relationPrintName}: \"to\" cannot be empty`);\n\t\t\t}\n\n\t\t\tif (sourceColumns && targetColumns) {\n\t\t\t\tif (sourceColumns.length !== targetColumns.length && !throughTable) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: \"from\" and \"to\" fields without \"through\" must have the same length`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tfor (const sName of sourceColumnTableNames) {\n\t\t\t\t\tif (sName !== sourceTableName) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: all \"from\" columns must belong to table \"${sourceTableName}\", found column of table \"${sName}\"`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (const tName of targetColumnTableNames) {\n\t\t\t\t\tif (tName !== targetTableName) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: all \"to\" columns must belong to table \"${targetTableName}\", found column of table \"${tName}\"`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (through) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tthrough.source.length !== sourceColumns.length\n\t\t\t\t\t\t|| through.target.length !== targetColumns.length\n\t\t\t\t\t) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: \".through(column)\" must be used either on all columns in \"from\" and \"to\" or not defined on any of them`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const column of through.source) {\n\t\t\t\t\t\tif (tables[column._.tableName] !== throughTable) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`${relationPrintName}: \".through(column)\" must be used on the same table by all columns of the relation`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const column of through.target) {\n\t\t\t\t\t\tif (tables[column._.tableName] !== throughTable) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`${relationPrintName}: \".through(column)\" must be used on the same table by all columns of the relation`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (sourceColumns || targetColumns) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`${relationPrintName}: relation must have either both \"from\" and \"to\" defined, or none of them`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst reverseTableConfig = tablesConfig[targetTableName];\n\t\t\tif (!reverseTableConfig) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and no reverse relations of table \"${targetTableName}\" were found\"`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (alias) {\n\t\t\t\tconst reverseRelations = Object.values(reverseTableConfig.relations).filter((it): it is Relation =>\n\t\t\t\t\tis(it, Relation) && it.alias === alias && it !== relation\n\t\t\t\t);\n\t\t\t\tif (reverseRelations.length > 1) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and multiple relations with alias \"${alias}\" found in table \"${targetTableName}\": ${\n\t\t\t\t\t\t\treverseRelations.map((it) => `\"${it.fieldName}\"`).join(', ')\n\t\t\t\t\t\t}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treverseRelation = reverseRelations[0];\n\t\t\t\tif (!reverseRelation) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and there is no reverse relation of table \"${targetTableName}\" with alias \"${alias}\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst reverseRelations = Object.values(reverseTableConfig.relations).filter((it): it is Relation =>\n\t\t\t\t\tis(it, Relation) && it.targetTable === sourceTable && !it.alias && it !== relation\n\t\t\t\t);\n\t\t\t\tif (reverseRelations.length > 1) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and multiple relations between \"${targetTableName}\" and \"${sourceTableName}\" were found.\\nHint: you can specify \"alias\" on both sides of the relation with the same value`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treverseRelation = reverseRelations[0];\n\t\t\t\tif (!reverseRelation) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and no reverse relation of table \"${targetTableName}\" with target table \"${sourceTableName}\" was found`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!reverseRelation.sourceColumns || !reverseRelation.targetColumns) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and reverse relation \"${targetTableName}.${reverseRelation.fieldName}\" does not have \"from\"/\"to\" defined`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\trelation.sourceColumns = reverseRelation.targetColumns;\n\t\t\trelation.targetColumns = reverseRelation.sourceColumns;\n\t\t\trelation.through = reverseRelation.through\n\t\t\t\t? {\n\t\t\t\t\tsource: reverseRelation.through.target,\n\t\t\t\t\ttarget: reverseRelation.through.source,\n\t\t\t\t}\n\t\t\t\t: undefined;\n\t\t\trelation.throughTable = reverseRelation.throughTable;\n\t\t\trelation.isReversed = !where;\n\t\t\trelation.where = where ?? reverseRelation.where;\n\t\t}\n\t}\n\n\treturn tablesConfig;\n}\n\n/** Builds relational config for every table in schema */\nexport function buildRelations<TTables extends Schema, TConfig extends AnyRelationsBuilderConfig>(\n\ttables: TTables,\n\tconfig: TConfig,\n): ExtractTablesWithRelations<TConfig, TTables> {\n\tconst tablesConfig = {} as TablesRelationalConfig;\n\n\tfor (const [tsName, table] of Object.entries(tables)) {\n\t\ttablesConfig[tsName] = {\n\t\t\ttable,\n\t\t\tname: tsName,\n\t\t\trelations: config[tsName] ?? {},\n\t\t};\n\t}\n\n\treturn processRelations(tablesConfig, tables) as any;\n}\n\n/** Builds relational config only for tables present in relational config */\nexport function buildRelationsParts<TTables extends Schema, TConfig extends AnyRelationsBuilderConfig>(\n\ttables: TTables,\n\tconfig: TConfig,\n): ExtractTablesWithRelationsParts<TConfig, TTables> {\n\tconst tablesConfig = {} as TablesRelationalConfig;\n\n\tfor (const [tsName, relations] of Object.entries(config)) {\n\t\tif (!relations || !tables[tsName]) continue;\n\t\ttablesConfig[tsName] = {\n\t\t\ttable: tables[tsName],\n\t\t\tname: tsName,\n\t\t\trelations,\n\t\t};\n\t}\n\n\treturn processRelations(tablesConfig, tables) as any;\n}\n\nexport type RelationsRecord = Record<string, AnyRelation>;\nexport type EmptyRelations = {};\nexport type AnyRelations = TablesRelationalConfig;\n\nexport abstract class Relation<\n\tTTargetTableName extends string = string,\n> {\n\tstatic readonly [entityKind]: string = 'RelationV2';\n\tdeclare readonly $brand: 'RelationV2';\n\tdeclare public readonly relationType: 'many' | 'one';\n\n\tfieldName!: string;\n\tsourceColumns!: Column<any>[];\n\ttargetColumns!: Column<any>[];\n\talias: string | undefined;\n\twhere: AnyTableFilter | undefined;\n\tsourceTable!: SchemaEntry;\n\ttargetTable: SchemaEntry;\n\tthrough?: {\n\t\tsource: RelationsBuilderColumnBase[];\n\t\ttarget: RelationsBuilderColumnBase[];\n\t};\n\tthroughTable?: SchemaEntry;\n\tisReversed?: boolean;\n\n\t/** @internal */\n\tsourceColumnTableNames: string[] = [];\n\t/** @internal */\n\ttargetColumnTableNames: string[] = [];\n\n\tconstructor(\n\t\ttargetTable: SchemaEntry,\n\t\treadonly targetTableName: TTargetTableName,\n\t) {\n\t\tthis.targetTable = targetTable;\n\t}\n}\n\nexport type AnyRelation = Relation<string>;\n\nexport class One<\n\tTTargetTableName extends string,\n\tTOptional extends boolean = boolean,\n> extends Relation<TTargetTableName> {\n\tstatic override readonly [entityKind]: string = 'OneV2';\n\tdeclare protected $relationBrand: 'OneV2';\n\n\tpublic override readonly relationType = 'one' as const;\n\n\treadonly optional: TOptional;\n\n\tconstructor(\n\t\ttables: Schema,\n\t\ttargetTable: SchemaEntry,\n\t\ttargetTableName: TTargetTableName,\n\t\tconfig: AnyOneConfig | undefined,\n\t) {\n\t\tsuper(targetTable, targetTableName);\n\t\tthis.alias = config?.alias;\n\t\tthis.where = config?.where;\n\t\tif (config?.from) {\n\t\t\tthis.sourceColumns = ((Array.isArray(config.from)\n\t\t\t\t? config.from\n\t\t\t\t: [config.from]) as RelationsBuilderColumnBase[]).map((it: RelationsBuilderColumnBase) => {\n\t\t\t\t\tthis.throughTable ??= it._.through ? tables[it._.through._.tableName]! as SchemaEntry : undefined;\n\t\t\t\t\tthis.sourceColumnTableNames.push(it._.tableName);\n\t\t\t\t\treturn it._.column as Column;\n\t\t\t\t});\n\t\t}\n\t\tif (config?.to) {\n\t\t\tthis.targetColumns = (Array.isArray(config.to)\n\t\t\t\t? config.to\n\t\t\t\t: [config.to]).map((it: RelationsBuilderColumnBase) => {\n\t\t\t\t\tthis.throughTable ??= it._.through ? tables[it._.through._.tableName]! as SchemaEntry : undefined;\n\t\t\t\t\tthis.targetColumnTableNames.push(it._.tableName);\n\t\t\t\t\treturn it._.column as Column;\n\t\t\t\t});\n\t\t}\n\n\t\tif (this.throughTable) {\n\t\t\tthis.through = {\n\t\t\t\tsource: (Array.isArray(config?.from) ? config.from : config?.from ? [config.from] : []).map((\n\t\t\t\t\tc,\n\t\t\t\t) => c._.through!),\n\t\t\t\ttarget: (Array.isArray(config?.to) ? config.to : config?.to ? [config.to] : []).map((c) => c._.through!),\n\t\t\t};\n\t\t}\n\t\tthis.optional = (config?.optional ?? true) as TOptional;\n\t}\n}\n\nexport type AnyOne = One<string, boolean>;\n\nexport class Many<TTargetTableName extends string> extends Relation<TTargetTableName> {\n\tstatic override readonly [entityKind]: string = 'ManyV2';\n\tdeclare protected $relationBrand: 'ManyV2';\n\n\tpublic override readonly relationType = 'many' as const;\n\n\tconstructor(\n\t\ttables: Schema,\n\t\ttargetTable: SchemaEntry,\n\t\ttargetTableName: TTargetTableName,\n\t\treadonly config: AnyManyConfig | undefined,\n\t) {\n\t\tsuper(targetTable, targetTableName);\n\t\tthis.alias = config?.alias;\n\t\tthis.where = config?.where;\n\t\tif (config?.from) {\n\t\t\tthis.sourceColumns = ((Array.isArray(config.from)\n\t\t\t\t? config.from\n\t\t\t\t: [config.from]) as RelationsBuilderColumnBase[]).map((it: RelationsBuilderColumnBase) => {\n\t\t\t\t\tthis.throughTable ??= it._.through ? tables[it._.through._.tableName]! as SchemaEntry : undefined;\n\t\t\t\t\tthis.sourceColumnTableNames.push(it._.tableName);\n\t\t\t\t\treturn it._.column as Column;\n\t\t\t\t});\n\t\t}\n\t\tif (config?.to) {\n\t\t\tthis.targetColumns = (Array.isArray(config.to)\n\t\t\t\t? config.to\n\t\t\t\t: [config.to]).map((it: RelationsBuilderColumnBase) => {\n\t\t\t\t\tthis.throughTable ??= it._.through ? tables[it._.through._.tableName]! as SchemaEntry : undefined;\n\t\t\t\t\tthis.targetColumnTableNames.push(it._.tableName);\n\t\t\t\t\treturn it._.column as Column;\n\t\t\t\t});\n\t\t}\n\t\tif (this.throughTable) {\n\t\t\tthis.through = {\n\t\t\t\tsource: (Array.isArray(config?.from) ? config.from : config?.from ? [config.from] : []).map((\n\t\t\t\t\tc,\n\t\t\t\t) => c._.through!),\n\t\t\t\ttarget: (Array.isArray(config?.to) ? config.to : config?.to ? [config.to] : []).map((c) => c._.through!),\n\t\t\t};\n\t\t}\n\t}\n}\n\nexport type AnyMany = Many<string>;\n\nexport abstract class AggregatedField<T = unknown> implements SQLWrapper<T> {\n\tstatic readonly [entityKind]: string = 'AggregatedField';\n\n\tdeclare readonly $brand: 'AggregatedField';\n\n\tdeclare readonly _: {\n\t\treadonly data: T;\n\t};\n\n\tprotected table: SchemaEntry | undefined;\n\n\tonTable(table: SchemaEntry) {\n\t\tthis.table = table;\n\n\t\treturn this;\n\t}\n\n\tabstract getSQL(): SQL<T>;\n}\n\nexport class Count extends AggregatedField<number> {\n\tstatic override readonly [entityKind]: string = 'AggregatedFieldCount';\n\n\tdeclare protected $aggregatedFieldBrand: 'Count';\n\n\tprivate query: SQL<number> | undefined;\n\n\tgetSQL(): SQL<number> {\n\t\tif (!this.query) {\n\t\t\tif (!this.table) throw new Error('Table must be set before building aggregate field');\n\t\t\tthis.query = sql`select count(*) as ${sql.identifier('r')} from ${getTableAsAliasSQL(this.table)}`\n\t\t\t\t.mapWith(Number);\n\t\t}\n\n\t\treturn this.query;\n\t}\n}\n\nexport type ExtractObjectValues<T> = T[keyof T];\n\nexport const operators = {\n\tand,\n\tbetween,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tarrayContains,\n\tarrayContained,\n\tarrayOverlaps,\n\tisNull,\n\tisNotNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotLike,\n\tnotIlike,\n\tnotInArray,\n\tor,\n\tsql,\n};\n\nexport type Operators = typeof operators;\n\nexport const orderByOperators = {\n\tsql,\n\tasc,\n\tdesc,\n};\n\nexport type OrderByOperators = typeof orderByOperators;\n\nexport function getOrderByOperators(): OrderByOperators {\n\treturn orderByOperators;\n}\n\nexport type FindTargetTableInRelationalConfig<\n\tTConfig extends TablesRelationalConfig,\n\tTRelation extends AnyRelation,\n> = TConfig[TRelation['targetTableName']];\n\nexport interface SQLOperator {\n\tsql: Operators['sql'];\n}\n\nexport type DBQueryConfigColumns<TColumns extends FieldSelection> = {\n\t[K in keyof TColumns]?: boolean | undefined;\n};\n\nexport type DBQueryConfigExtras<TTable extends SchemaEntry> = Record<\n\tstring,\n\t| SQLWrapper\n\t| ((\n\t\ttable: TTable,\n\t\toperators: SQLOperator,\n\t) => SQLWrapper)\n>;\n\nexport type DBQueryConfigOrderByCallback<TTable extends SchemaEntry> = (\n\ttable: TTable,\n\toperators: OrderByOperators,\n) => ValueOrArray<AnyColumn | SQL>;\n\nexport type DBQueryConfigOrderByObject<TColumns extends FieldSelection> = {\n\t[K in keyof TColumns]?: 'asc' | 'desc' | undefined;\n};\n\nexport type DBQueryConfigOrderBy<TTable extends SchemaEntry, TColumns extends FieldSelection> =\n\t| DBQueryConfigOrderByCallback<TTable>\n\t| DBQueryConfigOrderByObject<TColumns>;\n\nexport type DBQueryConfigWith<TSchema extends TablesRelationalConfig, TRelations extends RelationsRecord> = {\n\t[K in keyof TRelations]?:\n\t\t| boolean\n\t\t| (DBQueryConfig<\n\t\t\tTRelations[K]['relationType'],\n\t\t\tTSchema,\n\t\t\tFindTargetTableInRelationalConfig<TSchema, TRelations[K]>\n\t\t>)\n\t\t| undefined;\n};\n\nexport type DBQueryConfig<\n\tTRelationType extends 'one' | 'many' = 'one' | 'many',\n\tTSchema extends TablesRelationalConfig = TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig = TableRelationalConfig,\n> =\n\t& (TTableConfig['relations'] extends Record<string, never> ? {}\n\t\t: {\n\t\t\twith?:\n\t\t\t\t| DBQueryConfigWith<TSchema, TTableConfig['relations']>\n\t\t\t\t| undefined;\n\t\t})\n\t& {\n\t\tcolumns?: DBQueryConfigColumns<GetTableViewFieldSelection<TTableConfig['table']>> | undefined;\n\t\twhere?: RelationsFilter<TTableConfig, TSchema> | undefined;\n\t\textras?:\n\t\t\t| DBQueryConfigExtras<TTableConfig['table']>\n\t\t\t| undefined;\n\t\torderBy?:\n\t\t\t| DBQueryConfigOrderBy<TTableConfig['table'], GetTableViewFieldSelection<TTableConfig['table']>>\n\t\t\t| undefined;\n\t\toffset?: number | Placeholder | undefined;\n\t}\n\t& (TRelationType extends 'many' ? {\n\t\t\tlimit?: number | Placeholder | undefined;\n\t\t}\n\t\t: {});\n\nexport type DBQueryConfigWithComment<\n\tTRelationType extends 'one' | 'many' = 'one' | 'many',\n\tTSchema extends TablesRelationalConfig = TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig = TableRelationalConfig,\n> =\n\t& (TTableConfig['relations'] extends Record<string, never> ? {}\n\t\t: {\n\t\t\twith?:\n\t\t\t\t| DBQueryConfigWith<TSchema, TTableConfig['relations']>\n\t\t\t\t| undefined;\n\t\t})\n\t& {\n\t\tcolumns?: DBQueryConfigColumns<GetTableViewFieldSelection<TTableConfig['table']>> | undefined;\n\t\twhere?: RelationsFilter<TTableConfig, TSchema> | undefined;\n\t\textras?:\n\t\t\t| DBQueryConfigExtras<TTableConfig['table']>\n\t\t\t| undefined;\n\t\torderBy?:\n\t\t\t| DBQueryConfigOrderBy<TTableConfig['table'], GetTableViewFieldSelection<TTableConfig['table']>>\n\t\t\t| undefined;\n\t\toffset?: number | Placeholder | undefined;\n\t\t/**\n\t\t * Attach [sqlcommenter](https://google.github.io/sqlcommenter) comment to a query\n\t\t */\n\t\tcomment?: CommentInput | undefined;\n\t}\n\t& (TRelationType extends 'many' ? {\n\t\t\tlimit?: number | Placeholder | undefined;\n\t\t}\n\t\t: {});\n\nexport type AnyDBQueryConfig = {\n\tcolumns?:\n\t\t| DBQueryConfigColumns<GetTableViewFieldSelection<TableRelationalConfig['table']>>\n\t\t| undefined;\n\twhere?: RelationsFilter<TableRelationalConfig, TablesRelationalConfig> | undefined;\n\textras?:\n\t\t| DBQueryConfigExtras<TableRelationalConfig['table']>\n\t\t| undefined;\n\twith?:\n\t\t| Record<string, AnyDBQueryConfig>\n\t\t| undefined;\n\torderBy?:\n\t\t| DBQueryConfigOrderBy<TableRelationalConfig['table'], GetTableViewFieldSelection<TableRelationalConfig['table']>>\n\t\t| undefined;\n\toffset?: number | Placeholder | undefined;\n\tlimit?: number | Placeholder | undefined;\n\tcomment?: CommentInput | undefined;\n};\n\nexport interface TableRelationalConfig {\n\ttable: SchemaEntry;\n\tname: string;\n\trelations: RelationsRecord;\n}\n\nexport type TablesRelationalConfig = Record<string, TableRelationalConfig>;\n\nexport type ExtractTablesWithRelations<\n\tTConfig extends AnyRelationsBuilderConfig,\n\tTTables extends Schema,\n> = {\n\t[K in keyof TTables]: {\n\t\ttable: TTables[K];\n\t\tname: K & string;\n\t\trelations: TConfig extends { [CK in K]: Record<string, any> } ? TConfig[K] : {};\n\t};\n};\n\nexport type ExtractTablesWithRelationsParts<\n\tTConfig extends AnyRelationsBuilderConfig,\n\tTTables extends Schema,\n> = {\n\t[K in NonUndefinedKeysOnly<TConfig> & keyof TTables]: {\n\t\ttable: TTables[K & string];\n\t\tname: K & string;\n\t\trelations: TConfig[K] extends Record<string, any> ? TConfig[K] : {};\n\t};\n};\n\nexport type ReturnTypeOrValue<T> = T extends (...args: any[]) => infer R ? R\n\t: T;\n\nexport type RelationResultKind<TResult, TInclude, TRelation extends AnyRelation> = TRelation extends AnyOne ? (\n\t\t| TResult\n\t\t| (Equal<TRelation['optional'], true> extends true ? null\n\t\t\t: TInclude extends Record<string, unknown> ? TInclude['where'] extends Record<string, any> ? null\n\t\t\t\t: never\n\t\t\t: never)\n\t)\n\t: TResult[];\n\nexport type BuildRelationResult<\n\tTConfig extends TablesRelationalConfig,\n\tTInclude,\n\tTRelations extends RelationsRecord,\n> = {\n\t[\n\t\tK in\n\t\t\t& TruthyKeysOnly<TInclude>\n\t\t\t& keyof TRelations\n\t]: TRelations[K] extends infer TRel extends AnyRelation ? RelationResultKind<\n\t\t\tBuildQueryResult<\n\t\t\t\tTConfig,\n\t\t\t\tFindTargetTableInRelationalConfig<TConfig, TRel>,\n\t\t\t\tAssume<TInclude[K], true | Record<string, unknown>>\n\t\t\t>,\n\t\t\tTInclude[K],\n\t\t\tTRel\n\t\t>\n\t\t: TRelations[K] extends AggregatedField<infer TData> ? TData\n\t\t: never;\n};\n\nexport type NonUndefinedKeysOnly<T> = {\n\t[K in keyof T]: T[K] extends undefined ? never : K;\n}[keyof T];\n\nexport type TruthyKeysOnly<T> = {\n\t[K in keyof T]: T[K] extends undefined | false ? never : K;\n}[keyof T];\n\nexport type InferRelationalQueryTableResult<\n\tTRawSelection extends Record<string, unknown>,\n\tTSelectedFields extends Record<string, unknown> | 'Full' = 'Full',\n> = TSelectedFields extends 'Full' ? TRawSelection : {\n\t[\n\t\tK in Equal<\n\t\t\tExclude<\n\t\t\t\tTSelectedFields[\n\t\t\t\t\t& keyof TSelectedFields\n\t\t\t\t\t& keyof TRawSelection\n\t\t\t\t],\n\t\t\t\tundefined\n\t\t\t>,\n\t\t\tfalse\n\t\t> extends true ? Exclude<\n\t\t\t\tkeyof TRawSelection,\n\t\t\t\tNonUndefinedKeysOnly<TSelectedFields>\n\t\t\t>\n\t\t\t:\n\t\t\t\t& {\n\t\t\t\t\t[K in keyof TSelectedFields]: Equal<\n\t\t\t\t\t\tTSelectedFields[K],\n\t\t\t\t\t\ttrue\n\t\t\t\t\t> extends true ? K\n\t\t\t\t\t\t: never;\n\t\t\t\t}[keyof TSelectedFields]\n\t\t\t\t& keyof TRawSelection\n\t]: TRawSelection[K];\n};\n\nexport type BuildQueryResult<\n\tTSchema extends TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig,\n\tTFullSelection extends true | Record<string, unknown>,\n\tTModel extends Record<string, unknown> = Assume<\n\t\tTTableConfig['table'],\n\t\t{ $inferSelect: Record<string, unknown> }\n\t>['$inferSelect'],\n> = TFullSelection extends true | Record<string, never> ? TModel\n\t: TFullSelection extends Record<string, unknown> ? Simplify<\n\t\t\t& (InferRelationalQueryTableResult<\n\t\t\t\tTModel,\n\t\t\t\tTFullSelection['columns'] extends Record<string, unknown> ? TFullSelection['columns'] : 'Full'\n\t\t\t>)\n\t\t\t& (TFullSelection['extras'] extends Record<string, SQLWrapper | ((...args: any[]) => SQLWrapper)> ? {\n\t\t\t\t\t[\n\t\t\t\t\t\tK in NonUndefinedKeysOnly<\n\t\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras']>\n\t\t\t\t\t\t>\n\t\t\t\t\t]: ReturnType<\n\t\t\t\t\t\tAssume<\n\t\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras'][K & string]>,\n\t\t\t\t\t\t\tSQLWrapper\n\t\t\t\t\t\t>['getSQL']\n\t\t\t\t\t>['_']['type'];\n\t\t\t\t}\n\t\t\t\t: {})\n\t\t\t& (TFullSelection['with'] extends Record<string, unknown> ? BuildRelationResult<\n\t\t\t\t\tTSchema,\n\t\t\t\t\tTFullSelection['with'],\n\t\t\t\t\tTTableConfig['relations']\n\t\t\t\t>\n\t\t\t\t: {})\n\t\t>\n\t: never;\n\nexport interface BuildRelationalQueryResult {\n\tselection: {\n\t\tkey: string;\n\t\tfield: Column<any> | Table | View | SQL | SQL.Aliased | SQLWrapper | AggregatedField;\n\t\tisArray?: boolean;\n\t\tselection?: BuildRelationalQueryResult['selection'];\n\t\tisOptional?: boolean;\n\t}[];\n\tsql: SQL;\n}\n\nexport function mapRelationalRow(\n\trow: Record<string, unknown>,\n\tbuildQueryResultSelection: BuildRelationalQueryResult['selection'],\n\tmapColumnValue: (value: unknown) => unknown = (value) => value,\n\t/** Needed for SQLite as it returns JSON values as strings */\n\tparseJson: boolean = false,\n\t/** Needed for SingleStore as it returns JSON arrays as strings */\n\tparseJsonIfString: boolean = false,\n\tpath?: string,\n): Record<string, unknown> {\n\tfor (const selectionItem of buildQueryResultSelection) {\n\t\tif (selectionItem.selection) {\n\t\t\tconst currentPath = `${path ? `${path}.` : ''}${selectionItem.key}`;\n\n\t\t\tif (row[selectionItem.key] === null) continue;\n\n\t\t\tif (parseJson) {\n\t\t\t\trow[selectionItem.key] = JSON.parse(row[selectionItem.key] as string);\n\t\t\t\tif (row[selectionItem.key] === null) continue;\n\t\t\t}\n\t\t\tif (parseJsonIfString && typeof row[selectionItem.key] === 'string') {\n\t\t\t\trow[selectionItem.key] = JSON.parse(row[selectionItem.key] as string);\n\t\t\t}\n\n\t\t\tif (selectionItem.isArray) {\n\t\t\t\tfor (const item of (row[selectionItem.key] as Array<Record<string, unknown>>)) {\n\t\t\t\t\tmapRelationalRow(\n\t\t\t\t\t\titem,\n\t\t\t\t\t\tselectionItem.selection!,\n\t\t\t\t\t\tmapColumnValue,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tparseJsonIfString,\n\t\t\t\t\t\tcurrentPath,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tmapRelationalRow(\n\t\t\t\trow[selectionItem.key] as Record<string, unknown>,\n\t\t\t\tselectionItem.selection!,\n\t\t\t\tmapColumnValue,\n\t\t\t\tfalse,\n\t\t\t\tparseJsonIfString,\n\t\t\t\tcurrentPath,\n\t\t\t);\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst field = selectionItem.field!;\n\t\tconst value = mapColumnValue(row[selectionItem.key]);\n\t\tif (value === null) continue;\n\n\t\tlet decoder;\n\t\tif (is(field, Column)) {\n\t\t\tdecoder = field;\n\t\t} else if (is(field, SQL)) {\n\t\t\tdecoder = field.decoder;\n\t\t} else if (is(field, SQL.Aliased)) {\n\t\t\tdecoder = field.sql.decoder;\n\t\t} else if (is(field, Table) || is(field, View)) {\n\t\t\tdecoder = noopDecoder;\n\t\t} else {\n\t\t\tdecoder = field.getSQL().decoder;\n\t\t}\n\n\t\trow[selectionItem.key] = 'mapFromJsonValue' in decoder\n\t\t\t? (<(value: unknown) => unknown> decoder.mapFromJsonValue)(value)\n\t\t\t: decoder.mapFromDriverValue(value);\n\t}\n\n\treturn row;\n}\n\nexport class RelationsBuilderTable<TTableName extends string = string> {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderTable';\n\n\tprotected readonly _: {\n\t\treadonly name: TTableName;\n\t\treadonly table: SchemaEntry;\n\t};\n\n\tconstructor(table: SchemaEntry, name: TTableName) {\n\t\tthis._ = {\n\t\t\tname,\n\t\t\ttable,\n\t\t};\n\t}\n}\n\nexport interface RelationsBuilderColumnConfig<\n\tTTableName extends string = string,\n> {\n\treadonly tableName: TTableName;\n\treadonly column: FieldValue;\n\treadonly through?: RelationsBuilderColumnBase;\n\treadonly key: string;\n}\n\nexport interface RelationsBuilderColumnBase<\n\tTTableName extends string = string,\n> {\n\t_: RelationsBuilderColumnConfig<TTableName>;\n}\n\nexport class RelationsBuilderColumn<\n\tTTableName extends string = string,\n> implements RelationsBuilderColumnBase<TTableName> {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderColumn';\n\n\treadonly _: {\n\t\treadonly tableName: TTableName;\n\t\treadonly column: FieldValue;\n\t\treadonly key: string;\n\t};\n\n\tconstructor(\n\t\tcolumn: FieldValue,\n\t\ttableName: TTableName,\n\t\tkey: string,\n\t) {\n\t\tthis._ = {\n\t\t\ttableName: tableName,\n\t\t\tcolumn,\n\t\t\tkey,\n\t\t};\n\t}\n\n\tthrough(column: RelationsBuilderColumn): RelationsBuilderJunctionColumn<TTableName> {\n\t\treturn new RelationsBuilderJunctionColumn(\n\t\t\tthis._.column,\n\t\t\tthis._.tableName,\n\t\t\tthis._.key,\n\t\t\tcolumn,\n\t\t);\n\t}\n}\n\nexport class RelationsBuilderJunctionColumn<\n\tTTableName extends string = string,\n> implements RelationsBuilderColumnBase<TTableName> {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderColumn';\n\n\treadonly _: {\n\t\treadonly tableName: TTableName;\n\t\treadonly column: FieldValue;\n\t\treadonly through: RelationsBuilderColumnBase;\n\t\treadonly key: string;\n\t};\n\n\tconstructor(\n\t\tcolumn: FieldValue,\n\t\ttableName: TTableName,\n\t\tkey: string,\n\t\tthrough: RelationsBuilderColumnBase,\n\t) {\n\t\tthis._ = {\n\t\t\ttableName: tableName,\n\t\t\tcolumn,\n\t\t\tthrough,\n\t\t\tkey,\n\t\t};\n\t}\n}\n\nexport interface RelationFieldsFilterInternals<T> {\n\teq?: T | Placeholder | undefined;\n\tne?: T | Placeholder | undefined;\n\tgt?: T | Placeholder | undefined;\n\tgte?: T | Placeholder | undefined;\n\tlt?: T | Placeholder | undefined;\n\tlte?: T | Placeholder | undefined;\n\tin?: (T | Placeholder)[] | Placeholder | undefined;\n\tnotIn?: (T | Placeholder)[] | Placeholder | undefined;\n\tarrayContains?: (T extends Array<infer E> ? (E | Placeholder)[] : (T | Placeholder)[]) | Placeholder | undefined;\n\tarrayContained?: (T extends Array<infer E> ? (E | Placeholder)[] : (T | Placeholder)[]) | Placeholder | undefined;\n\tarrayOverlaps?: (T extends Array<infer E> ? (E | Placeholder)[] : (T | Placeholder)[]) | Placeholder | undefined;\n\tlike?: string | Placeholder | undefined;\n\tilike?: string | Placeholder | undefined;\n\tnotLike?: string | Placeholder | undefined;\n\tnotIlike?: string | Placeholder | undefined;\n\tisNull?: true | undefined;\n\tisNotNull?: true | undefined;\n\tNOT?: RelationsFieldFilter<T> | undefined;\n\tOR?: RelationsFieldFilter<T>[] | undefined;\n\tAND?: RelationsFieldFilter<T>[] | undefined;\n}\n\nexport type RelationsFieldFilter<T = unknown> =\n\t| RelationFieldsFilterInternals<T>\n\t| (\n\t\tunknown extends T ? never : T extends object ? never : T\n\t)\n\t// Bleeds into filters - discuss removal\n\t| Placeholder;\n\nexport interface RelationsFilterCommons<\n\tTTable extends TableRelationalConfig = TableRelationalConfig,\n\tTSchema extends TablesRelationalConfig = TablesRelationalConfig,\n> {\n\tOR?: RelationsFilter<TTable, TSchema>[] | undefined;\n\tNOT?: RelationsFilter<TTable, TSchema> | undefined;\n\tAND?: RelationsFilter<TTable, TSchema>[] | undefined;\n\tRAW?:\n\t\t| SQLWrapper\n\t\t| ((\n\t\t\ttable: TTable['table'],\n\t\t\toperators: Operators,\n\t\t) => SQL)\n\t\t| undefined;\n}\n\nexport type RelationsFilterColumns<\n\tTColumns extends Record<string, unknown>,\n> = {\n\t[K in keyof TColumns]?:\n\t\t| (TColumns[K] extends { _: { data: infer Data } } ? RelationsFieldFilter<Data>\n\t\t\t: RelationsFieldFilter<unknown>)\n\t\t| undefined;\n};\n\nexport type RelationsFilterRelations<\n\tTTable extends TableRelationalConfig,\n\tTSchema extends TablesRelationalConfig,\n\tTRelations extends RelationsRecord = TTable['relations'],\n> = {\n\t[K in keyof TRelations]?:\n\t\t| boolean\n\t\t| RelationsFilter<FindTargetTableInRelationalConfig<TSchema, TRelations[K]>, TSchema>\n\t\t| undefined;\n};\n\nexport type RelationsFilter<\n\tTTable extends TableRelationalConfig,\n\tTSchema extends TablesRelationalConfig,\n\tTColumns extends FieldSelection = GetTableViewFieldSelection<TTable['table']>,\n> = TTable['relations'] extends Record<string, never> ? TableFilter<TTable['table']>\n\t:\n\t\t& RelationsFilterColumns<TColumns>\n\t\t& RelationsFilterRelations<TTable, TSchema>\n\t\t& RelationsFilterCommons<TTable, TSchema>;\n\nexport interface TableFilterCommons<\n\tTTable extends SchemaEntry = SchemaEntry,\n\tTColumns extends Record<string, unknown> = GetTableViewColumns<TTable>,\n> {\n\tOR?: TableFilter<TTable, TColumns>[] | undefined;\n\tNOT?: TableFilter<TTable, TColumns> | undefined;\n\tAND?: TableFilter<TTable, TColumns>[] | undefined;\n\tRAW?:\n\t\t| SQLWrapper\n\t\t| ((\n\t\t\ttable: TTable,\n\t\t\toperators: Operators,\n\t\t) => SQL)\n\t\t| undefined;\n}\n\nexport type TableFilterColumns<\n\tTColumns extends Record<string, unknown>,\n> = {\n\t[K in keyof TColumns]?:\n\t\t| (TColumns[K] extends { _: { data: infer Data } } ? RelationsFieldFilter<Data>\n\t\t\t: RelationsFieldFilter<unknown>)\n\t\t| undefined;\n};\n\nexport type TableFilter<\n\tTTable extends SchemaEntry = SchemaEntry,\n\tTColumns extends Record<string, unknown> = GetTableViewColumns<TTable>,\n> =\n\t& TableFilterColumns<TColumns>\n\t& TableFilterCommons<TTable, TColumns>;\n\nexport type AnyRelationsFilter = RelationsFilter<\n\tTableRelationalConfig,\n\tTablesRelationalConfig,\n\tFieldSelection\n>;\n\nexport type AnyTableFilter = TableFilter<\n\tSchemaEntry,\n\tFieldSelection\n>;\n\nexport interface OneConfig<TTargetTable extends SchemaEntry, TOptional extends boolean> {\n\tfrom?: RelationsBuilderColumnBase | [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]];\n\tto?: RelationsBuilderColumnBase | [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]];\n\twhere?: TableFilter<TTargetTable>;\n\toptional?: TOptional;\n\talias?: string;\n}\n\nexport type AnyOneConfig = OneConfig<\n\tSchemaEntry,\n\tboolean\n>;\n\nexport interface ManyConfig<TTargetTable extends SchemaEntry> {\n\tfrom?: RelationsBuilderColumnBase | [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]];\n\tto?: RelationsBuilderColumnBase | [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]];\n\twhere?: TableFilter<TTargetTable>;\n\talias?: string;\n}\n\nexport type AnyManyConfig = ManyConfig<SchemaEntry>;\n\nexport interface OneFn<TTargetTable extends SchemaEntry, TTargetTableName extends string> {\n\t<TOptional extends boolean = true>(config?: OneConfig<TTargetTable, TOptional>): One<TTargetTableName, TOptional>;\n}\n\nexport interface ManyFn<TTargetTable extends SchemaEntry, TTargetTableName extends string> {\n\t(config?: ManyConfig<TTargetTable>): Many<TTargetTableName>;\n}\n\nexport class RelationsHelperStatic<TTables extends Schema> {\n\tstatic readonly [entityKind]: string = 'RelationsHelperStatic';\n\t// declare readonly $brand: 'RelationsHelperStatic';\n\n\tprivate readonly _: {\n\t\treadonly tables: TTables;\n\t};\n\n\tconstructor(tables: TTables) {\n\t\tthis._ = {\n\t\t\ttables,\n\t\t};\n\n\t\tconst one: Record<string, OneFn<TTables[string], string>> = {};\n\t\tconst many: Record<string, ManyFn<TTables[string], string>> = {};\n\n\t\tfor (const [tableName, table] of Object.entries(tables)) {\n\t\t\tone[tableName] = (config) => {\n\t\t\t\treturn new One(tables, table, tableName, config as unknown as AnyOneConfig);\n\t\t\t};\n\n\t\t\tmany[tableName] = (config) => {\n\t\t\t\treturn new Many(tables, table, tableName, config as AnyManyConfig);\n\t\t\t};\n\t\t}\n\n\t\tthis.one = one as any as this['one'];\n\t\tthis.many = many as any as this['many'];\n\t}\n\n\tone: {\n\t\t[K in keyof TTables]: TTables[K] extends FilteredSchemaEntry ? OneFn<TTables[K], K & string>\n\t\t\t: DrizzleTypeError<'Views with nested selections are not supported by the relational query builder'>;\n\t};\n\n\tmany: {\n\t\t[K in keyof TTables]: TTables[K] extends FilteredSchemaEntry ? ManyFn<TTables[K], K & string>\n\t\t\t: DrizzleTypeError<'Views with nested selections are not supported by the relational query builder'>;\n\t};\n\n\t/** @internal - to be reworked */\n\taggs = {\n\t\tcount(): Count {\n\t\t\treturn new Count();\n\t\t},\n\t};\n}\n\nexport type RelationsBuilderColumns<TTable extends SchemaEntry, TTableName extends string> = {\n\t[\n\t\tTColumnName in keyof GetTableViewColumns<TTable>\n\t]: RelationsBuilderColumn<\n\t\tTTableName\n\t>;\n};\n\nexport type RelationsBuilderTables<TSchema extends Schema> = {\n\t[TTableName in keyof TSchema]: TSchema[TTableName] extends FilteredSchemaEntry ? (\n\t\t\t& RelationsBuilderColumns<TSchema[TTableName], TTableName & string>\n\t\t\t& RelationsBuilderTable<TTableName & string>\n\t\t)\n\t\t: DrizzleTypeError<'Views with nested selections are not supported by the relational query builder'>;\n};\n\nexport type RelationsBuilder<TSchema extends Schema> =\n\t& RelationsBuilderTables<TSchema>\n\t& RelationsHelperStatic<TSchema>;\n\nexport type RelationsBuilderConfigValue =\n\t| RelationsRecord\n\t| undefined;\n\nexport type RelationsBuilderConfig<TTables extends Schema> = {\n\t[TTableName in keyof TTables]?: RelationsBuilderConfigValue;\n};\n\nexport type AnyRelationsBuilderConfig = Record<string, RelationsBuilderConfigValue>;\n\nexport type ExtractTablesFromSchema<TSchema extends Record<string, unknown>> = {\n\t[K in keyof TSchema as TSchema[K] extends SchemaEntry ? K extends string ? K : never : never]: Assume<\n\t\tTSchema[K],\n\t\tSchemaEntry\n\t>;\n};\n\nexport function createRelationsHelper<\n\tTTables extends Schema,\n>(tables: TTables): RelationsBuilder<TTables> {\n\tconst helperStatic = new RelationsHelperStatic(tables);\n\tconst relationsTables = Object.entries(tables).reduce<Record<string, RelationsBuilderTable>>((acc, [tKey, value]) => {\n\t\tconst rTable = new RelationsBuilderTable(value, tKey);\n\t\tconst columns = Object.entries(value[TableColumns]).reduce<\n\t\t\tRecord<string, RelationsBuilderColumnBase>\n\t\t>(\n\t\t\t(acc, [cKey, column]) => {\n\t\t\t\tconst rbColumn = new RelationsBuilderColumn(column as FieldValue, tKey, cKey);\n\t\t\t\tacc[cKey] = rbColumn;\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{},\n\t\t);\n\n\t\tacc[tKey] = Object.assign(rTable, columns);\n\n\t\treturn acc;\n\t}, {});\n\n\treturn Object.assign(helperStatic, relationsTables) as any;\n}\n\nexport function extractTablesFromSchema<TSchema extends Record<string, unknown>>(\n\tschema: TSchema,\n): ExtractTablesFromSchema<TSchema> {\n\treturn Object.fromEntries(\n\t\tObject.entries(schema).filter(([_, e]) => is(e, Table) || is(e, View)),\n\t) as ExtractTablesFromSchema<TSchema>;\n}\n\nexport type IncludeEveryTable<TTables extends Schema> = { [K in keyof TTables]: {} };\n\n/** Builds relational config for every table in schema */\nexport function defineRelations<\n\tTSchema extends Record<string, unknown>,\n\tTTables extends Schema = ExtractTablesFromSchema<TSchema>,\n>(\n\tschema: TSchema,\n): ExtractTablesWithRelations<{}, TTables>;\n/** Builds relational config for every table in schema */\nexport function defineRelations<\n\tTSchema extends Record<string, unknown>,\n\tTConfig extends RelationsBuilderConfig<TTables>,\n\tTTables extends Schema = ExtractTablesFromSchema<TSchema>,\n>(\n\tschema: TSchema,\n\trelations: (helpers: RelationsBuilder<TTables>) => TConfig,\n): ExtractTablesWithRelations<TConfig, TTables>;\nexport function defineRelations(\n\tschema: Record<string, unknown>,\n\trelations?: (helpers: RelationsBuilder<Schema>) => AnyRelationsBuilderConfig,\n): TablesRelationalConfig {\n\tconst tables = extractTablesFromSchema(schema);\n\tconst config = relations\n\t\t? relations(\n\t\t\tcreateRelationsHelper(tables) as RelationsBuilder<Schema>,\n\t\t)\n\t\t: {};\n\n\treturn buildRelations(tables, config);\n}\n\n/** Builds relational config for every table in schema */\nexport function defineRelationsPart<\n\tTSchema extends Record<string, unknown>,\n\tTTables extends Schema = ExtractTablesFromSchema<TSchema>,\n>(\n\tschema: TSchema,\n): ExtractTablesWithRelationsParts<IncludeEveryTable<TTables>, TTables>;\n/** Builds relational config only for tables present in relational config */\nexport function defineRelationsPart<\n\tTSchema extends Record<string, unknown>,\n\tTConfig extends RelationsBuilderConfig<TTables>,\n\tTTables extends Schema = ExtractTablesFromSchema<TSchema>,\n>(\n\tschema: TSchema,\n\trelations: (helpers: RelationsBuilder<TTables>) => TConfig,\n): ExtractTablesWithRelationsParts<TConfig, TTables>;\nexport function defineRelationsPart(\n\tschema: Record<string, unknown>,\n\trelations?: (helpers: RelationsBuilder<Schema>) => AnyRelationsBuilderConfig,\n): TablesRelationalConfig {\n\tconst tables = extractTablesFromSchema(schema);\n\tconst config = relations\n\t\t? relations(\n\t\t\tcreateRelationsHelper(tables) as RelationsBuilder<Schema>,\n\t\t)\n\t\t: Object.fromEntries(Object.keys(tables).map((k) => [k, {}])) as AnyRelationsBuilderConfig;\n\n\treturn buildRelationsParts(tables, config);\n}\n\nexport interface WithContainer {\n\twith?: Record<string, boolean | AnyDBQueryConfig | undefined>;\n}\n\nexport interface ColumnWithTSName {\n\tcolumn: Table | View | Column<any> | SQL | SQLWrapper | SQL.Aliased;\n\ttsName: string;\n}\n\nexport type RelationsOrder<TColumns extends FieldSelection> = {\n\t[K in keyof TColumns]?: 'asc' | 'desc';\n};\n\nexport type OrderBy = Exclude<AnyDBQueryConfig['orderBy'], undefined>;\n\nexport type Extras = Exclude<AnyDBQueryConfig['extras'], undefined>;\n\n/** @internal */\nexport function fieldSelectionToSQL(table: SchemaEntry, target: string) {\n\tconst field = table[TableColumns][target];\n\n\treturn field\n\t\t? is(field, Column)\n\t\t\t? field\n\t\t\t: is(field, SQL.Aliased)\n\t\t\t? sql`${table}.${sql.identifier(field.fieldAlias)}`\n\t\t\t: sql`${table}.${sql.identifier(target)}`\n\t\t: sql`${table}.${sql.identifier(target)}`;\n}\n\nfunction relationsFieldFilterToSQL(column: SQLWrapper, filter: RelationsFieldFilter<unknown>): SQL | undefined {\n\tif (typeof filter !== 'object' || is(filter, Placeholder)) return eq(column, filter);\n\n\tconst entries = Object.entries(filter as RelationFieldsFilterInternals<unknown>);\n\tif (!entries.length) return undefined;\n\n\tconst parts: (SQL)[] = [];\n\tfor (const [target, value] of entries) {\n\t\tif (value === undefined) continue;\n\n\t\tswitch (target as keyof RelationFieldsFilterInternals<unknown>) {\n\t\t\tcase 'NOT': {\n\t\t\t\tconst res = relationsFieldFilterToSQL(column, value as RelationsFieldFilter<unknown>);\n\t\t\t\tif (!res) continue;\n\n\t\t\t\tparts.push(not(res));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'OR': {\n\t\t\t\tif (!(value as RelationsFieldFilter<unknown>[]).length) continue;\n\n\t\t\t\tparts.push(\n\t\t\t\t\tor(\n\t\t\t\t\t\t...(value as AnyRelationsFilter[]).map((subFilter) => relationsFieldFilterToSQL(column, subFilter)),\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'AND': {\n\t\t\t\tif (!(value as RelationsFieldFilter<unknown>[]).length) continue;\n\n\t\t\t\tparts.push(\n\t\t\t\t\tand(\n\t\t\t\t\t\t...(value as AnyRelationsFilter[]).map((subFilter) => relationsFieldFilterToSQL(column, subFilter)),\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'isNotNull':\n\t\t\tcase 'isNull': {\n\t\t\t\tif (!value) continue;\n\n\t\t\t\tparts.push(operators[target as 'isNull' | 'isNotNull'](column));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'in': {\n\t\t\t\tparts.push(operators.inArray(column, value as any[] | Placeholder));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'notIn': {\n\t\t\t\tparts.push(operators.notInArray(column, value as any[] | Placeholder));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tparts.push(\n\t\t\t\t\t(operators[target as keyof typeof operators] as ((col: SQLWrapper, data: any) => SQL | undefined))(\n\t\t\t\t\t\tcolumn,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!parts.length) return undefined;\n\n\treturn and(...parts);\n}\n\nexport function relationsFilterToSQL(\n\ttable: SchemaEntry,\n\tfilter: AnyRelationsFilter | AnyTableFilter,\n): SQL | undefined;\nexport function relationsFilterToSQL(\n\ttable: SchemaEntry,\n\tfilter: AnyRelationsFilter | AnyTableFilter,\n\ttableRelations: RelationsRecord,\n\ttablesRelations: TablesRelationalConfig,\n\tcasing: CasingCache,\n\tdepth?: number,\n): SQL | undefined;\nexport function relationsFilterToSQL(\n\ttable: SchemaEntry,\n\tfilter: AnyRelationsFilter | AnyTableFilter,\n\ttableRelations: RelationsRecord = {},\n\ttablesRelations: TablesRelationalConfig = {},\n\tcasing?: CasingCache,\n\tdepth: number = 0,\n): SQL | undefined {\n\tconst entries = Object.entries(filter);\n\tif (!entries.length) return undefined;\n\n\tconst parts: SQL[] = [];\n\tfor (const [target, value] of entries) {\n\t\tif (value === undefined) continue;\n\n\t\tswitch (target) {\n\t\t\tcase 'RAW': {\n\t\t\t\tconst processed = typeof value === 'function'\n\t\t\t\t\t? (value as unknown as (table: FieldSelection, operators: Operators) => SQL)(table as any, operators)\n\t\t\t\t\t: (value as SQLWrapper).getSQL();\n\n\t\t\t\tparts.push(processed);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'OR': {\n\t\t\t\tif (!(value as AnyRelationsFilter[] | undefined)?.length) continue;\n\n\t\t\t\tparts.push(\n\t\t\t\t\tor(\n\t\t\t\t\t\t...(value as AnyRelationsFilter[]).map((subFilter) =>\n\t\t\t\t\t\t\trelationsFilterToSQL(table, subFilter, tableRelations, tablesRelations, casing!, depth)\n\t\t\t\t\t\t),\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'AND': {\n\t\t\t\tif (!(value as AnyRelationsFilter[] | undefined)?.length) continue;\n\n\t\t\t\tparts.push(\n\t\t\t\t\tand(\n\t\t\t\t\t\t...(value as AnyRelationsFilter[]).map((subFilter) =>\n\t\t\t\t\t\t\trelationsFilterToSQL(table, subFilter, tableRelations, tablesRelations, casing!, depth)\n\t\t\t\t\t\t),\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'NOT': {\n\t\t\t\tif (value === undefined) continue;\n\n\t\t\t\tconst built = relationsFilterToSQL(\n\t\t\t\t\ttable,\n\t\t\t\t\tvalue as AnyRelationsFilter,\n\t\t\t\t\ttableRelations,\n\t\t\t\t\ttablesRelations,\n\t\t\t\t\tcasing!,\n\t\t\t\t\tdepth,\n\t\t\t\t);\n\t\t\t\tif (!built) continue;\n\n\t\t\t\tparts.push(not(built));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tif (table[TableColumns][target]) {\n\t\t\t\t\tconst column = fieldSelectionToSQL(table, target);\n\n\t\t\t\t\tconst colFilter = relationsFieldFilterToSQL(\n\t\t\t\t\t\tcolumn,\n\t\t\t\t\t\tvalue as RelationsFieldFilter,\n\t\t\t\t\t);\n\t\t\t\t\tif (colFilter) parts.push(colFilter);\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst relation = tableRelations[target];\n\t\t\t\tif (!relation) {\n\t\t\t\t\t// Should never trigger unless the types've been violated\n\t\t\t\t\tthrow new DrizzleError({\n\t\t\t\t\t\tmessage: `Unknown relational filter field: \"${target}\"`,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst targetTable = aliasedTable(relation.targetTable, `f${depth}`);\n\t\t\t\tconst throughTable = relation.throughTable ? aliasedTable(relation.throughTable, `ft${depth}`) : undefined;\n\t\t\t\tconst targetConfig = tablesRelations[relation.targetTableName]!;\n\n\t\t\t\tconst {\n\t\t\t\t\tfilter: relationFilter,\n\t\t\t\t\tjoinCondition,\n\t\t\t\t} = relationToSQL(casing!, relation, table, targetTable, throughTable);\n\t\t\t\tconst subfilter = typeof value === 'boolean' ? undefined : relationsFilterToSQL(\n\t\t\t\t\ttargetTable,\n\t\t\t\t\tvalue as AnyRelationsFilter,\n\t\t\t\t\ttargetConfig.relations,\n\t\t\t\t\ttablesRelations,\n\t\t\t\t\tcasing!,\n\t\t\t\t\tdepth + 1,\n\t\t\t\t);\n\t\t\t\tconst filter = and(\n\t\t\t\t\trelationFilter,\n\t\t\t\t\tsubfilter,\n\t\t\t\t);\n\n\t\t\t\tconst subquery = throughTable\n\t\t\t\t\t? sql`(select * from ${getTableAsAliasSQL(targetTable)} inner join ${\n\t\t\t\t\t\tgetTableAsAliasSQL(throughTable)\n\t\t\t\t\t} on ${joinCondition}${sql` where ${filter}`.if(filter)} limit 1)`\n\t\t\t\t\t: sql`(select * from ${getTableAsAliasSQL(targetTable)}${sql` where ${filter}`.if(filter)} limit 1)`;\n\t\t\t\tif (filter) parts.push((value ? exists : notExists)(subquery));\n\t\t\t}\n\t\t}\n\t}\n\n\treturn and(...parts)!;\n}\n\nexport function relationsOrderToSQL(\n\ttable: SchemaEntry,\n\torders: OrderBy,\n): SQL | undefined {\n\tif (typeof orders === 'function') {\n\t\tconst data = orders(table as any, orderByOperators);\n\n\t\treturn is(data, SQL)\n\t\t\t? data\n\t\t\t: Array.isArray(data)\n\t\t\t? data.length\n\t\t\t\t? sql.join(data.map((o) => is(o, SQL) ? o : asc(o)), sql`, `)\n\t\t\t\t: undefined\n\t\t\t: is(data, Column)\n\t\t\t? asc(data)\n\t\t\t: undefined;\n\t}\n\n\tconst entries = Object.entries(orders).filter(([_, value]) => value);\n\tif (!entries.length) return undefined;\n\n\treturn sql.join(\n\t\tentries.map(([target, value]) => (value === 'asc' ? asc : desc)(fieldSelectionToSQL(table, target))),\n\t\tsql`, `,\n\t);\n}\n\nexport function relationExtrasToSQL(\n\ttable: SchemaEntry,\n\textras: Extras,\n) {\n\tconst subqueries: SQL[] = [];\n\tconst selection: BuildRelationalQueryResult['selection'] = [];\n\n\tfor (\n\t\tconst [key, field] of Object.entries(extras)\n\t) {\n\t\tif (!field) continue;\n\t\tconst extra = typeof field === 'function' ? field(table as any, { sql: operators.sql }) : field;\n\n\t\tconst query = sql`(${extra.getSQL()}) as ${sql.identifier(key)}`;\n\n\t\tquery.decoder = extra.getSQL().decoder;\n\n\t\tsubqueries.push(query);\n\t\tselection.push({\n\t\t\tkey,\n\t\t\tfield: query,\n\t\t});\n\t}\n\n\treturn {\n\t\tsql: subqueries.length ? sql.join(subqueries, sql`, `) : undefined,\n\t\tselection,\n\t};\n}\n\nexport interface BuiltRelationFilters {\n\tfilter?: SQL;\n\tjoinCondition?: SQL;\n}\n\nexport function relationToSQL(\n\tcasing: CasingCache,\n\trelation: Relation,\n\tsourceTable: SchemaEntry,\n\ttargetTable: SchemaEntry,\n\tthroughTable?: SchemaEntry,\n): BuiltRelationFilters {\n\tif (relation.through) {\n\t\tconst outerColumnWhere = relation.sourceColumns.map((s, i) => {\n\t\t\tconst t = relation.through!.source[i]!;\n\n\t\t\treturn eq(\n\t\t\t\tsql`${sourceTable}.${sql.identifier(casing.getColumnCasing(s))}`,\n\t\t\t\tsql`${throughTable!}.${sql.identifier(is(t._.column, Column) ? casing.getColumnCasing(t._.column) : t._.key)}`,\n\t\t\t);\n\t\t});\n\n\t\tconst innerColumnWhere = relation.targetColumns.map((s, i) => {\n\t\t\tconst t = relation.through!.target[i]!;\n\n\t\t\treturn eq(\n\t\t\t\tsql`${throughTable!}.${sql.identifier(is(t._.column, Column) ? casing.getColumnCasing(t._.column) : t._.key)}`,\n\t\t\t\tsql`${targetTable}.${sql.identifier(casing.getColumnCasing(s))}`,\n\t\t\t);\n\t\t});\n\n\t\treturn {\n\t\t\tfilter: and(\n\t\t\t\trelation.where\n\t\t\t\t\t? relationsFilterToSQL(relation.isReversed ? sourceTable : targetTable, relation.where)\n\t\t\t\t\t: undefined,\n\t\t\t\t...outerColumnWhere,\n\t\t\t),\n\t\t\tjoinCondition: and(...innerColumnWhere),\n\t\t};\n\t}\n\n\tconst columnWhere = relation.sourceColumns.map((s, i) => {\n\t\tconst t = relation.targetColumns[i]!;\n\n\t\treturn eq(\n\t\t\tsql`${sourceTable}.${sql.identifier(casing.getColumnCasing(s))}`,\n\t\t\tsql`${targetTable}.${sql.identifier(casing.getColumnCasing(t))}`,\n\t\t);\n\t});\n\n\tconst fullWhere = and(\n\t\t...columnWhere,\n\t\trelation.where\n\t\t\t? relationsFilterToSQL(relation.isReversed ? sourceTable : targetTable, relation.where)\n\t\t\t: undefined,\n\t)!;\n\n\treturn { filter: fullWhere };\n}\n\nexport function getTableAsAliasSQL(table: SchemaEntry) {\n\treturn sql`${\n\t\ttable[IsAlias]\n\t\t\t? sql`${sql`${sql.identifier(table[TableSchema] ?? '')}.`.if(table[TableSchema])}${\n\t\t\t\tsql.identifier(table[OriginalName])\n\t\t\t} as ${table}`\n\t\t\t: table\n\t}`;\n}\n", "import { entityKind } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport {\n\ttype BuildQueryResult,\n\ttype BuildRelationalQueryResult,\n\ttype DBQueryConfig,\n\tmapRelationalRow,\n\ttype TableRelationalConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport { type Query, type QueryWithTypings, type SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport type { KnownKeysOnly } from '~/utils.ts';\nimport type { SQLiteDialect } from '../dialect.ts';\nimport type { PreparedQueryConfig, SQLitePreparedQuery, SQLiteSession } from '../session.ts';\nimport type { SQLiteTable } from '../table.ts';\n\nexport type SQLiteRelationalQueryKind<TMode extends 'sync' | 'async', TResult> = TMode extends 'async'\n\t? SQLiteRelationalQuery<TMode, TResult>\n\t: SQLiteSyncRelationalQuery<TResult>;\n\nexport class RelationalQueryBuilder<\n\tTMode extends 'sync' | 'async',\n\tTSchema extends TablesRelationalConfig,\n\tTFields extends TableRelationalConfig,\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteAsyncRelationalQueryBuilderV2';\n\n\tconstructor(\n\t\tprivate mode: TMode,\n\t\tprivate schema: TSchema,\n\t\tprivate table: SQLiteTable,\n\t\tprivate tableConfig: TableRelationalConfig,\n\t\tprivate dialect: SQLiteDialect,\n\t\tprivate session: SQLiteSession<any, any, any, any, any>,\n\t\tprivate rowMode?: boolean,\n\t\tprivate forbidJsonb?: boolean,\n\t) {\n\t}\n\n\tfindMany<TConfig extends DBQueryConfig<'many', TSchema, TFields>>(\n\t\tconfig?: KnownKeysOnly<TConfig, DBQueryConfig<'many', TSchema, TFields>>,\n\t): SQLiteRelationalQueryKind<TMode, BuildQueryResult<TSchema, TFields, TConfig>[]> {\n\t\treturn this.mode === 'sync'\n\t\t\t? new SQLiteSyncRelationalQuery(\n\t\t\t\tthis.schema,\n\t\t\t\tthis.table,\n\t\t\t\tthis.tableConfig,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.session,\n\t\t\t\tconfig as DBQueryConfig<'many'> | undefined ?? true,\n\t\t\t\t'many',\n\t\t\t\tthis.rowMode,\n\t\t\t\tthis.forbidJsonb,\n\t\t\t) as SQLiteRelationalQueryKind<TMode, BuildQueryResult<TSchema, TFields, TConfig>[]>\n\t\t\t: new SQLiteRelationalQuery(\n\t\t\t\tthis.schema,\n\t\t\t\tthis.table,\n\t\t\t\tthis.tableConfig,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.session,\n\t\t\t\tconfig as DBQueryConfig<'many'> | undefined ?? true,\n\t\t\t\t'many',\n\t\t\t\tthis.rowMode,\n\t\t\t\tthis.forbidJsonb,\n\t\t\t) as SQLiteRelationalQueryKind<TMode, BuildQueryResult<TSchema, TFields, TConfig>[]>;\n\t}\n\n\tfindFirst<TConfig extends DBQueryConfig<'one', TSchema, TFields>>(\n\t\tconfig?: KnownKeysOnly<TConfig, DBQueryConfig<'one', TSchema, TFields>>,\n\t): SQLiteRelationalQueryKind<TMode, BuildQueryResult<TSchema, TFields, TConfig> | undefined> {\n\t\treturn this.mode === 'sync'\n\t\t\t? new SQLiteSyncRelationalQuery(\n\t\t\t\tthis.schema,\n\t\t\t\tthis.table,\n\t\t\t\tthis.tableConfig,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.session,\n\t\t\t\tconfig as DBQueryConfig<'one'> | undefined ?? true,\n\t\t\t\t'first',\n\t\t\t\tthis.rowMode,\n\t\t\t\tthis.forbidJsonb,\n\t\t\t) as SQLiteRelationalQueryKind<TMode, BuildQueryResult<TSchema, TFields, TConfig> | undefined>\n\t\t\t: new SQLiteRelationalQuery(\n\t\t\t\tthis.schema,\n\t\t\t\tthis.table,\n\t\t\t\tthis.tableConfig,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.session,\n\t\t\t\tconfig as DBQueryConfig<'one'> | undefined ?? true,\n\t\t\t\t'first',\n\t\t\t\tthis.rowMode,\n\t\t\t\tthis.forbidJsonb,\n\t\t\t) as SQLiteRelationalQueryKind<TMode, BuildQueryResult<TSchema, TFields, TConfig> | undefined>;\n\t}\n}\n\nexport class SQLiteRelationalQuery<TType extends 'sync' | 'async', TResult> extends QueryPromise<TResult>\n\timplements RunnableQuery<TResult, 'sqlite'>, SQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteAsyncRelationalQueryV2';\n\n\tdeclare readonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly type: TType;\n\t\treadonly result: TResult;\n\t};\n\n\t/** @internal */\n\tmode: 'many' | 'first';\n\t/** @internal */\n\ttable: SQLiteTable;\n\n\tconstructor(\n\t\tprivate schema: TablesRelationalConfig,\n\t\ttable: SQLiteTable,\n\t\tprivate tableConfig: TableRelationalConfig,\n\t\tprivate dialect: SQLiteDialect,\n\t\tprivate session: SQLiteSession<TType, any, any, any, any>,\n\t\tprivate config: DBQueryConfig<'many' | 'one'> | true,\n\t\tmode: 'many' | 'first',\n\t\tprivate rowMode?: boolean,\n\t\tprivate forbidJsonb?: boolean,\n\t) {\n\t\tsuper();\n\t\tthis.mode = mode;\n\t\tthis.table = table;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\tconst query = this.dialect.buildRelationalQuery({\n\t\t\tschema: this.schema,\n\t\t\ttable: this.table,\n\t\t\ttableConfig: this.tableConfig,\n\t\t\tqueryConfig: this.config,\n\t\t\tmode: this.mode,\n\t\t\tjsonb: this.forbidJsonb ? sql`json` : sql`jsonb`,\n\t\t});\n\n\t\treturn query.sql;\n\t}\n\n\t/** @internal */\n\t_prepare(\n\t\tisOneTimeQuery = true,\n\t): SQLitePreparedQuery<PreparedQueryConfig & { type: TType; all: TResult; get: TResult; execute: TResult }> {\n\t\tconst { query, builtQuery } = this._toSQL();\n\n\t\treturn this.session[isOneTimeQuery ? 'prepareOneTimeRelationalQuery' : 'prepareRelationalQuery'](\n\t\t\tbuiltQuery,\n\t\t\tundefined,\n\t\t\tthis.mode === 'first' ? 'get' : 'all',\n\t\t\t(rawRows, mapColumnValue) => {\n\t\t\t\tconst rows = rawRows.map((row) => mapRelationalRow(row, query.selection, mapColumnValue, !this.rowMode));\n\t\t\t\tif (this.mode === 'first') {\n\t\t\t\t\treturn rows[0] as TResult;\n\t\t\t\t}\n\t\t\t\treturn rows as TResult;\n\t\t\t},\n\t\t) as SQLitePreparedQuery<PreparedQueryConfig & { type: TType; all: TResult; get: TResult; execute: TResult }>;\n\t}\n\n\tprepare(): SQLitePreparedQuery<PreparedQueryConfig & { type: TType; all: TResult; get: TResult; execute: TResult }> {\n\t\treturn this._prepare(false);\n\t}\n\n\tprivate _getQuery() {\n\t\tconst jsonb = this.forbidJsonb ? sql`json` : sql`jsonb`;\n\n\t\tconst query = this.dialect.buildRelationalQuery({\n\t\t\tschema: this.schema,\n\t\t\ttable: this.table,\n\t\t\ttableConfig: this.tableConfig,\n\t\t\tqueryConfig: this.config,\n\t\t\tmode: this.mode,\n\t\t\tisNested: this.rowMode,\n\t\t\tjsonb,\n\t\t});\n\n\t\tif (this.rowMode) {\n\t\t\tconst jsonColumns = sql.join(\n\t\t\t\tquery.selection.map((s) => {\n\t\t\t\t\treturn sql`${sql.raw(this.dialect.escapeString(s.key))}, ${\n\t\t\t\t\t\ts.selection ? sql`${jsonb}(${sql.identifier(s.key)})` : sql.identifier(s.key)\n\t\t\t\t\t}`;\n\t\t\t\t}),\n\t\t\t\tsql`, `,\n\t\t\t);\n\n\t\t\tquery.sql = sql`select json_object(${jsonColumns}) as ${sql.identifier('r')} from (${query.sql}) as ${\n\t\t\t\tsql.identifier('t')\n\t\t\t}`;\n\t\t}\n\n\t\treturn query;\n\t}\n\n\tprivate _toSQL(): { query: BuildRelationalQueryResult; builtQuery: QueryWithTypings } {\n\t\tconst query = this._getQuery();\n\n\t\tconst builtQuery = this.dialect.sqlToQuery(query.sql);\n\n\t\treturn { query, builtQuery };\n\t}\n\n\ttoSQL(): Query {\n\t\treturn this._toSQL().builtQuery;\n\t}\n\n\t/** @internal */\n\texecuteRaw(): TResult {\n\t\tif (this.mode === 'first') {\n\t\t\treturn this._prepare().get() as TResult;\n\t\t}\n\t\treturn this._prepare().all() as TResult;\n\t}\n\n\toverride async execute(): Promise<TResult> {\n\t\treturn this.executeRaw();\n\t}\n}\n\nexport class SQLiteSyncRelationalQuery<TResult> extends SQLiteRelationalQuery<'sync', TResult> {\n\tstatic override readonly [entityKind]: string = 'SQLiteSyncRelationalQueryV2';\n\n\tsync(): TResult {\n\t\treturn this.executeRaw();\n\t}\n}\n", "import { entityKind } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { PreparedQuery } from '~/session.ts';\nimport type { SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteAsyncDialect } from '../dialect.ts';\n\ntype SQLiteRawAction = 'all' | 'get' | 'values' | 'run';\nexport interface SQLiteRawConfig {\n\taction: SQLiteRawAction;\n}\n\nexport interface SQLiteRaw<TResult> extends QueryPromise<TResult>, RunnableQuery<TResult, 'sqlite'>, SQLWrapper {}\n\nexport class SQLiteRaw<TResult> extends QueryPromise<TResult>\n\timplements RunnableQuery<TResult, 'sqlite'>, SQLWrapper, PreparedQuery\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteRaw';\n\n\tdeclare readonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly result: TResult;\n\t};\n\n\t/** @internal */\n\tconfig: SQLiteRawConfig;\n\n\tconstructor(\n\t\tpublic execute: () => Promise<TResult>,\n\t\t/** @internal */\n\t\tpublic getSQL: () => SQL,\n\t\taction: SQLiteRawAction,\n\t\tprivate dialect: SQLiteAsyncDialect,\n\t\tprivate mapBatchResult: (result: unknown) => unknown,\n\t) {\n\t\tsuper();\n\t\tthis.config = { action };\n\t}\n\n\tgetQuery() {\n\t\treturn { ...this.dialect.sqlToQuery(this.getSQL()), method: this.config.action };\n\t}\n\n\tmapResult(result: unknown, isFromBatch?: boolean) {\n\t\treturn isFromBatch ? this.mapBatchResult(result) : result;\n\t}\n\n\t_prepare(): PreparedQuery {\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn false;\n\t}\n}\n", "import { ColumnTableAliasProxyHandler, TableAliasProxyHandler } from './alias.ts';\nimport { Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport { SQL, View } from './sql/sql.ts';\nimport { Subquery } from './subquery.ts';\nimport { ViewBaseConfig } from './view-common.ts';\n\nexport class SelectionProxyHandler<T extends Subquery | Record<string, unknown> | View>\n\timplements ProxyHandler<Subquery | Record<string, unknown> | View>\n{\n\tstatic readonly [entityKind]: string = 'SelectionProxyHandler';\n\n\tprivate config: {\n\t\t/**\n\t\t * Table alias for the columns\n\t\t */\n\t\talias?: string;\n\t\t/**\n\t\t * What to do when a field is an instance of `SQL.Aliased` and it's not a selection field (from a subquery)\n\t\t *\n\t\t * `sql` - return the underlying SQL expression\n\t\t *\n\t\t * `alias` - return the field alias\n\t\t */\n\t\tsqlAliasedBehavior: 'sql' | 'alias';\n\t\t/**\n\t\t * What to do when a field is an instance of `SQL` and it doesn't have an alias declared\n\t\t *\n\t\t * `sql` - return the underlying SQL expression\n\t\t *\n\t\t * `error` - return a DrizzleTypeError on type level and throw an error on runtime\n\t\t */\n\t\tsqlBehavior: 'sql' | 'error';\n\n\t\t/**\n\t\t * Whether to replace the original name of the column with the alias\n\t\t * Should be set to `true` for views creation\n\t\t * @default false\n\t\t */\n\t\treplaceOriginalName?: boolean;\n\t};\n\n\tconstructor(config: SelectionProxyHandler<T>['config']) {\n\t\tthis.config = { ...config };\n\t}\n\n\tget(subquery: T, prop: string | symbol): any {\n\t\tif (prop === '_') {\n\t\t\treturn {\n\t\t\t\t...subquery['_' as keyof typeof subquery],\n\t\t\t\tselectedFields: new Proxy(\n\t\t\t\t\t(subquery as Subquery)._.selectedFields,\n\t\t\t\t\tthis as ProxyHandler<Record<string, unknown>>,\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\n\t\tif (prop === ViewBaseConfig) {\n\t\t\treturn {\n\t\t\t\t...subquery[ViewBaseConfig as keyof typeof subquery],\n\t\t\t\tselectedFields: new Proxy(\n\t\t\t\t\t(subquery as View)[ViewBaseConfig].selectedFields,\n\t\t\t\t\tthis as ProxyHandler<Record<string, unknown>>,\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\n\t\tif (typeof prop === 'symbol') {\n\t\t\treturn subquery[prop as keyof typeof subquery];\n\t\t}\n\n\t\tconst columns = is(subquery, Subquery)\n\t\t\t? subquery._.selectedFields\n\t\t\t: is(subquery, View)\n\t\t\t? subquery[ViewBaseConfig].selectedFields\n\t\t\t: subquery;\n\t\tconst value: unknown = columns[prop as keyof typeof columns];\n\n\t\tif (is(value, SQL.Aliased)) {\n\t\t\t// Never return the underlying SQL expression for a field previously selected in a subquery\n\t\t\tif (this.config.sqlAliasedBehavior === 'sql' && !value.isSelectionField) {\n\t\t\t\treturn value.sql;\n\t\t\t}\n\n\t\t\tconst newValue = value.clone();\n\t\t\tnewValue.isSelectionField = true;\n\t\t\tnewValue.origin = this.config.alias;\n\t\t\treturn newValue;\n\t\t}\n\n\t\tif (is(value, SQL)) {\n\t\t\tif (this.config.sqlBehavior === 'sql') {\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\tthrow new Error(\n\t\t\t\t`You tried to reference \"${prop}\" field from a subquery, which is a raw SQL field, but it doesn't have an alias declared. Please add an alias to the field using \".as('alias')\" method.`,\n\t\t\t);\n\t\t}\n\n\t\tif (is(value, Column)) {\n\t\t\tif (this.config.alias) {\n\t\t\t\treturn new Proxy(\n\t\t\t\t\tvalue,\n\t\t\t\t\tnew ColumnTableAliasProxyHandler(\n\t\t\t\t\t\tnew Proxy(\n\t\t\t\t\t\t\tvalue.table,\n\t\t\t\t\t\t\tnew TableAliasProxyHandler(this.config.alias, this.config.replaceOriginalName ?? false, true),\n\t\t\t\t\t\t),\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\n\t\tif (typeof value !== 'object' || value === null) {\n\t\t\treturn value;\n\t\t}\n\n\t\treturn new Proxy(value, new SelectionProxyHandler(this.config));\n\t}\n}\n", "import { entityKind } from '~/entity.ts';\nimport { TableName } from '~/table.utils.ts';\nimport type { AnySQLiteColumn, SQLiteColumn } from './columns/index.ts';\nimport type { SQLiteTable } from './table.ts';\n\nexport type UpdateDeleteAction = 'cascade' | 'restrict' | 'no action' | 'set null' | 'set default';\n\nexport type Reference = () => {\n\treadonly name?: string;\n\treadonly columns: SQLiteColumn[];\n\treadonly foreignTable: SQLiteTable;\n\treadonly foreignColumns: SQLiteColumn[];\n};\n\nexport class ForeignKeyBuilder {\n\tstatic readonly [entityKind]: string = 'SQLiteForeignKeyBuilder';\n\n\tdeclare _: {\n\t\tbrand: 'SQLiteForeignKeyBuilder';\n\t\tforeignTableName: 'TForeignTableName';\n\t};\n\n\t/** @internal */\n\treference: Reference;\n\n\t/** @internal */\n\t_onUpdate: UpdateDeleteAction | undefined;\n\n\t/** @internal */\n\t_onDelete: UpdateDeleteAction | undefined;\n\n\tconstructor(\n\t\tconfig: () => {\n\t\t\tname?: string;\n\t\t\tcolumns: SQLiteColumn[];\n\t\t\tforeignColumns: SQLiteColumn[];\n\t\t},\n\t\tactions?: {\n\t\t\tonUpdate?: UpdateDeleteAction;\n\t\t\tonDelete?: UpdateDeleteAction;\n\t\t} | undefined,\n\t) {\n\t\tthis.reference = () => {\n\t\t\tconst { name, columns, foreignColumns } = config();\n\t\t\treturn { name, columns, foreignTable: foreignColumns[0]!.table as SQLiteTable, foreignColumns };\n\t\t};\n\t\tif (actions) {\n\t\t\tthis._onUpdate = actions.onUpdate;\n\t\t\tthis._onDelete = actions.onDelete;\n\t\t}\n\t}\n\n\tonUpdate(action: UpdateDeleteAction): this {\n\t\tthis._onUpdate = action;\n\t\treturn this;\n\t}\n\n\tonDelete(action: UpdateDeleteAction): this {\n\t\tthis._onDelete = action;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: SQLiteTable): ForeignKey {\n\t\treturn new ForeignKey(table, this);\n\t}\n}\n\nexport class ForeignKey {\n\tstatic readonly [entityKind]: string = 'SQLiteForeignKey';\n\n\treadonly reference: Reference;\n\treadonly onUpdate: UpdateDeleteAction | undefined;\n\treadonly onDelete: UpdateDeleteAction | undefined;\n\n\tconstructor(readonly table: SQLiteTable, builder: ForeignKeyBuilder) {\n\t\tthis.reference = builder.reference;\n\t\tthis.onUpdate = builder._onUpdate;\n\t\tthis.onDelete = builder._onDelete;\n\t}\n\n\tgetName(): string {\n\t\tconst { name, columns, foreignColumns } = this.reference();\n\t\tconst columnNames = columns.map((column) => column.name);\n\t\tconst foreignColumnNames = foreignColumns.map((column) => column.name);\n\t\tconst chunks = [\n\t\t\tthis.table[TableName],\n\t\t\t...columnNames,\n\t\t\tforeignColumns[0]!.table[TableName],\n\t\t\t...foreignColumnNames,\n\t\t];\n\t\treturn name ?? `${chunks.join('_')}_fk`;\n\t}\n\n\tisNameExplicit() {\n\t\treturn !!this.reference().name;\n\t}\n}\n\ntype ColumnsWithTable<\n\tTTableName extends string,\n\tTColumns extends SQLiteColumn[],\n> = { [Key in keyof TColumns]: AnySQLiteColumn<{ tableName: TTableName }> };\n\nexport function foreignKey<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends [AnySQLiteColumn<{ tableName: TTableName }>, ...AnySQLiteColumn<{ tableName: TTableName }>[]],\n>(\n\tconfig: {\n\t\tname?: string;\n\t\tcolumns: TColumns;\n\t\tforeignColumns: ColumnsWithTable<TForeignTableName, TColumns>;\n\t},\n): ForeignKeyBuilder;\nexport function foreignKey(\n\tconfig: any,\n): ForeignKeyBuilder {\n\tfunction mappedConfig() {\n\t\tif (typeof config === 'function') {\n\t\t\tconst { name, columns, foreignColumns } = config();\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tcolumns,\n\t\t\t\tforeignColumns,\n\t\t\t};\n\t\t}\n\t\treturn config;\n\t}\n\n\treturn new ForeignKeyBuilder(mappedConfig);\n}\n", "import { entityKind } from '~/entity.ts';\nimport { TableName } from '~/table.utils.ts';\nimport type { SQLiteColumn } from './columns/common.ts';\nimport type { SQLiteTable } from './table.ts';\n\nexport function uniqueKeyName(table: SQLiteTable, columns: string[]) {\n\treturn `${table[TableName]}_${columns.join('_')}_unique`;\n}\n\nexport function unique(name?: string): UniqueOnConstraintBuilder {\n\treturn new UniqueOnConstraintBuilder(name);\n}\n\nexport class UniqueConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'SQLiteUniqueConstraintBuilder';\n\n\t/** @internal */\n\tcolumns: SQLiteColumn[];\n\n\tconstructor(\n\t\tcolumns: SQLiteColumn[],\n\t\tprivate name?: string,\n\t) {\n\t\tthis.columns = columns;\n\t}\n\n\t/** @internal */\n\tbuild(table: SQLiteTable): UniqueConstraint {\n\t\treturn new UniqueConstraint(table, this.columns, this.name);\n\t}\n}\n\nexport class UniqueOnConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'SQLiteUniqueOnConstraintBuilder';\n\n\t/** @internal */\n\tname?: string;\n\n\tconstructor(\n\t\tname?: string,\n\t) {\n\t\tthis.name = name;\n\t}\n\n\ton(...columns: [SQLiteColumn, ...SQLiteColumn[]]) {\n\t\treturn new UniqueConstraintBuilder(columns, this.name);\n\t}\n}\n\nexport class UniqueConstraint {\n\tstatic readonly [entityKind]: string = 'SQLiteUniqueConstraint';\n\n\treadonly columns: SQLiteColumn[];\n\treadonly name: string;\n\treadonly isNameExplicit: boolean;\n\n\tconstructor(readonly table: SQLiteTable, columns: SQLiteColumn[], name?: string) {\n\t\tthis.columns = columns;\n\t\tthis.isNameExplicit = !!name;\n\t\tthis.name = name ?? uniqueKeyName(this.table, this.columns.map((column) => column.name));\n\t}\n\n\tgetName() {\n\t\treturn this.name;\n\t}\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { CockroachColumn, ExtraConfigColumn as CockroachExtraConfigColumn } from './cockroach-core/index.ts';\nimport type { Column, ColumnBaseConfig } from './column.ts';\nimport type { GelColumn, GelExtraConfigColumn } from './gel-core/index.ts';\nimport type { MsSqlColumn } from './mssql-core/index.ts';\nimport type { MySqlColumn } from './mysql-core/index.ts';\nimport type { ExtraConfigColumn, PgColumn, PgSequenceOptions } from './pg-core/index.ts';\nimport type { SingleStoreColumn } from './singlestore-core/index.ts';\nimport type { SQL } from './sql/sql.ts';\nimport type { SQLiteColumn } from './sqlite-core/index.ts';\nimport type { Assume } from './utils.ts';\n\nexport type ColumnDataType =\n\t| 'array'\n\t| 'bigint'\n\t| 'boolean'\n\t| 'custom'\n\t| 'number'\n\t| 'object'\n\t| 'string';\n\nexport type ColumnDataArrayConstraint =\n\t| 'vector'\n\t| 'int64vector'\n\t| 'halfvector'\n\t| 'basecolumn'\n\t| 'point'\n\t| 'geometry'\n\t| 'line';\n\nexport type ColumnDataBigIntConstraint = 'int64' | 'uint64';\n\nexport type ColumnDataNumberConstraint =\n\t| 'double'\n\t| 'float'\n\t| 'int8'\n\t| 'int16'\n\t| 'int24'\n\t| 'int32'\n\t| 'int53'\n\t| 'udouble'\n\t| 'ufloat'\n\t| 'uint8'\n\t| 'uint16'\n\t| 'uint24'\n\t| 'uint32'\n\t| 'uint53'\n\t| 'unsigned'\n\t| 'year';\n\nexport type ColumnDataObjectConstraint =\n\t| 'buffer'\n\t| 'date'\n\t| 'geometry'\n\t| 'json'\n\t| 'line'\n\t| 'point'\n\t// Gel-specific\n\t| 'dateDuration'\n\t| 'duration'\n\t| 'localDate'\n\t| 'localDateTime'\n\t| 'localTime'\n\t| 'relDuration';\n\nexport type ColumnDataStringConstraint =\n\t| 'binary'\n\t| 'cidr'\n\t| 'date'\n\t| 'datetime'\n\t| 'enum'\n\t| 'inet'\n\t| 'int64'\n\t| 'interval'\n\t| 'macaddr'\n\t| 'macaddr8'\n\t| 'numeric'\n\t| 'sparsevec'\n\t| 'time'\n\t| 'timestamp'\n\t| 'uint64'\n\t| 'unumeric'\n\t| 'uuid';\n\nexport type ColumnDataConstraint =\n\t| ColumnDataArrayConstraint\n\t| ColumnDataBigIntConstraint\n\t| ColumnDataNumberConstraint\n\t| ColumnDataObjectConstraint\n\t| ColumnDataStringConstraint;\n\nexport type ColumnType =\n\t| ColumnDataType\n\t| `array ${ColumnDataArrayConstraint}`\n\t| `bigint ${ColumnDataBigIntConstraint}`\n\t| `number ${ColumnDataNumberConstraint}`\n\t| `object ${ColumnDataObjectConstraint}`\n\t| `string ${ColumnDataStringConstraint}`;\n\nexport interface ColumnTypeData<\n\tTType extends ColumnDataType = ColumnDataType,\n\tTConstraint extends ColumnDataConstraint | undefined = ColumnDataConstraint | undefined,\n> {\n\ttype: TType;\n\tconstraint: TConstraint;\n}\n\nexport type ExtractColumnTypeData<T extends ColumnType> = T extends\n\t`${infer Type extends ColumnDataType} ${infer Constraint extends ColumnDataConstraint}`\n\t? ColumnTypeData<Type, Constraint>\n\t: ColumnTypeData<Assume<T, ColumnDataType>, undefined>;\n\nexport function extractExtendedColumnType<TColumn extends Column>(\n\tcolumn: TColumn,\n): ExtractColumnTypeData<TColumn['_']['dataType']> {\n\tconst [type, constraint] = column.dataType.split(' ');\n\n\treturn { type, constraint } as any;\n}\n\nexport type Dialect = 'pg' | 'mysql' | 'sqlite' | 'singlestore' | 'mssql' | 'common' | 'gel' | 'cockroach';\n\n// TODO update description\n// 'virtual' | 'stored' for postgres\n// 'stored' for mysql\n// 'virtual' | 'persisted' for mssql\n// We should remove this option from common Column and store it per dialect common\n// Was discussed with Andrew\nexport type GeneratedStorageMode = 'virtual' | 'stored' | 'persisted';\n\nexport type GeneratedType = 'always' | 'byDefault';\n\nexport interface GeneratedColumnConfig<TDataType> {\n\tas: TDataType | SQL | (() => SQL);\n\ttype?: GeneratedType;\n\tmode?: GeneratedStorageMode;\n}\n\nexport interface GeneratedIdentityConfig {\n\tsequenceName?: string;\n\tsequenceOptions?: PgSequenceOptions;\n\ttype: 'always' | 'byDefault';\n}\n\nexport interface ColumnBuilderBaseConfig<TDataType extends ColumnType> {\n\tdataType: TDataType;\n\tdata: unknown;\n\tdriverParam: unknown;\n\tnotNull?: boolean;\n\thasDefault?: boolean;\n}\n\nexport type MakeColumnConfig<\n\tT extends ColumnBuilderBaseConfig<ColumnType>,\n\tTTableName extends string,\n\tTDialect extends Dialect = 'common',\n\tTData = T extends { $type: infer U } ? U : T['data'],\n> = {\n\tname: string;\n\ttableName: TTableName;\n\tdataType: T['dataType'];\n\tdata: TData;\n\tdriverParam: T['driverParam'];\n\tnotNull: T['notNull'] extends true ? true : false;\n\thasDefault: T['hasDefault'] extends true ? true : false;\n\tisPrimaryKey: T extends { isPrimaryKey: true } ? true : false;\n\tisAutoincrement: T extends { isAutoincrement: true } ? true : false;\n\thasRuntimeDefault: T extends { hasRuntimeDefault: true } ? true : false;\n\tenumValues: T extends { enumValues: [string, ...string[]] } ? T['enumValues'] : undefined;\n\tbaseColumn: T extends { baseBuilder: infer U extends ColumnBuilderBase } ? BuildColumn<TTableName, U, TDialect>\n\t\t: never;\n\tidentity: T extends { identity: 'always' } ? 'always' : T extends { identity: 'byDefault' } ? 'byDefault' : undefined;\n\tgenerated: T extends { generated: infer G } ? unknown extends G ? undefined\n\t\t: G extends undefined ? undefined\n\t\t: G\n\t\t: undefined;\n} & {};\n\nexport interface ColumnBuilderRuntimeConfig<TData> {\n\tname: string;\n\tkeyAsName: boolean;\n\tnotNull: boolean;\n\tdefault: TData | SQL | undefined;\n\tdefaultFn: (() => TData | SQL) | undefined;\n\tonUpdateFn: (() => TData | SQL) | undefined;\n\thasDefault: boolean;\n\tprimaryKey: boolean;\n\tisUnique: boolean;\n\tuniqueName: string | undefined;\n\tuniqueType: string | undefined;\n\tdataType: string;\n\tcolumnType: string;\n\tgenerated: GeneratedColumnConfig<TData> | undefined;\n\tgeneratedIdentity: GeneratedIdentityConfig | undefined;\n}\n\nexport interface ColumnBuilderExtraConfig {\n\tprimaryKeyHasDefault?: boolean;\n}\n\nexport type NotNull<T> = T & {\n\t_: {\n\t\tnotNull: true;\n\t};\n};\n\nexport type HasDefault<T> = T & {\n\t_: {\n\t\thasDefault: true;\n\t};\n};\n\nexport type IsPrimaryKey<T> = T & {\n\t_: {\n\t\tisPrimaryKey: true;\n\t\tnotNull: true;\n\t};\n};\n\nexport type IsAutoincrement<T> = T & {\n\t_: {\n\t\tisAutoincrement: true;\n\t};\n};\n\nexport type HasRuntimeDefault<T> = T & {\n\t_: {\n\t\thasRuntimeDefault: true;\n\t};\n};\n\nexport type $Type<T, TType> = T & {\n\t_: {\n\t\t$type: TType;\n\t};\n};\n\nexport type HasGenerated<T, TGenerated = {}> = T & {\n\t_: {\n\t\thasDefault: true;\n\t\tgenerated: TGenerated;\n\t};\n};\n\nexport type IsIdentity<T, TType extends 'always' | 'byDefault'> = T & {\n\t_: {\n\t\tnotNull: true;\n\t\thasDefault: true;\n\t\tidentity: TType;\n\t};\n};\n\nexport interface ColumnBuilderBase<\n\tout T extends ColumnBuilderBaseConfig<ColumnType> = ColumnBuilderBaseConfig<ColumnType>,\n> {\n\t_: T;\n}\n\n// To understand how to use `ColumnBuilder` and `AnyColumnBuilder`, see `Column` and `AnyColumn` documentation.\nexport abstract class ColumnBuilder<\n\tout T extends ColumnBuilderBaseConfig<ColumnType>,\n\tTRuntimeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = ColumnBuilderExtraConfig,\n> implements ColumnBuilderBase<T> {\n\tstatic readonly [entityKind]: string = 'ColumnBuilder';\n\n\tdeclare _: T;\n\n\t/** @internal */\n\tprotected config: ColumnBuilderRuntimeConfig<T['data']> & TRuntimeConfig;\n\n\tconstructor(name: string, dataType: ColumnType, columnType: string) {\n\t\tthis.config = {\n\t\t\tname,\n\t\t\tkeyAsName: name === '',\n\t\t\tnotNull: false,\n\t\t\tdefault: undefined,\n\t\t\thasDefault: false,\n\t\t\tprimaryKey: false,\n\t\t\tisUnique: false,\n\t\t\tuniqueName: undefined,\n\t\t\tuniqueType: undefined,\n\t\t\tdataType,\n\t\t\tcolumnType,\n\t\t\tgenerated: undefined,\n\t\t} as ColumnBuilderRuntimeConfig<T['data']> & TRuntimeConfig; // TODO: ??\n\t}\n\n\t/**\n\t * Changes the data type of the column. Commonly used with `json` columns. Also, useful for branded types.\n\t *\n\t * @example\n\t * ```ts\n\t * const users = pgTable('users', {\n\t * \tid: integer('id').$type<UserId>().primaryKey(),\n\t * \tdetails: json('details').$type<UserDetails>().notNull(),\n\t * });\n\t * ```\n\t */\n\t$type<TType>(): $Type<this, TType> {\n\t\treturn this as $Type<this, TType>;\n\t}\n\n\t/**\n\t * Adds a `not null` clause to the column definition.\n\t *\n\t * Affects the `select` model of the table - columns *without* `not null` will be nullable on select.\n\t */\n\tnotNull(): NotNull<this> {\n\t\tthis.config.notNull = true;\n\t\treturn this as NotNull<this>;\n\t}\n\n\t/**\n\t * Adds a `default <value>` clause to the column definition.\n\t *\n\t * Affects the `insert` model of the table - columns *with* `default` are optional on insert.\n\t *\n\t * If you need to set a dynamic default value, use {@link $defaultFn} instead.\n\t */\n\tdefault(value: (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL): HasDefault<this> {\n\t\tthis.config.default = value;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as HasDefault<this>;\n\t}\n\n\t/**\n\t * Adds a dynamic default value to the column.\n\t * The function will be called when the row is inserted, and the returned value will be used as the column value.\n\t *\n\t * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.\n\t */\n\t$defaultFn(\n\t\tfn: () => (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL,\n\t): HasRuntimeDefault<HasDefault<this>> {\n\t\tthis.config.defaultFn = fn;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as HasRuntimeDefault<HasDefault<this>>;\n\t}\n\n\t/**\n\t * Alias for {@link $defaultFn}.\n\t */\n\t$default = this.$defaultFn;\n\n\t/**\n\t * Adds a dynamic update value to the column.\n\t * The function will be called when the row is updated, and the returned value will be used as the column value if none is provided.\n\t * If no `default` (or `$defaultFn`) value is provided, the function will be called when the row is inserted as well, and the returned value will be used as the column value.\n\t *\n\t * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.\n\t */\n\t$onUpdateFn(\n\t\tfn: () => (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL,\n\t): HasDefault<this> {\n\t\tthis.config.onUpdateFn = fn;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as HasDefault<this>;\n\t}\n\n\t/**\n\t * Alias for {@link $onUpdateFn}.\n\t */\n\t$onUpdate = this.$onUpdateFn;\n\n\t/**\n\t * Adds a `primary key` clause to the column definition. This implicitly makes the column `not null`.\n\t *\n\t * In SQLite, `integer primary key` implicitly makes the column auto-incrementing.\n\t */\n\tprimaryKey(): TExtraConfig['primaryKeyHasDefault'] extends true ? IsPrimaryKey<HasDefault<this>>\n\t\t: IsPrimaryKey<this>\n\t{\n\t\tthis.config.primaryKey = true;\n\t\tthis.config.notNull = true;\n\t\treturn this as TExtraConfig['primaryKeyHasDefault'] extends true ? IsPrimaryKey<HasDefault<this>>\n\t\t\t: IsPrimaryKey<this>;\n\t}\n\n\tabstract generatedAlwaysAs(\n\t\tas: SQL | T['data'] | (() => SQL),\n\t\tconfig?: Partial<GeneratedColumnConfig<unknown>>,\n\t): HasGenerated<this, {\n\t\ttype: 'always';\n\t}>;\n\n\t/** @internal Sets the name of the column to the key within the table definition if a name was not given. */\n\tsetName(name: string) {\n\t\tif (this.config.name !== '') return;\n\t\tthis.config.name = name;\n\t}\n}\n\nexport type BuildColumn<\n\tTTableName extends string,\n\tTBuilder extends ColumnBuilderBase,\n\tTDialect extends Dialect,\n\tTBuiltConfig extends ColumnBaseConfig<ColumnType> = MakeColumnConfig<TBuilder['_'], TTableName, TDialect>,\n> =\n\t// TDialect extends 'pg' ? PgColumn<TBuiltConfig, {}>\n\tTDialect extends 'mysql' ? MySqlColumn<TBuiltConfig, {}>\n\t\t: TDialect extends 'mssql' ? MsSqlColumn<TBuiltConfig, {}>\n\t\t: TDialect extends 'sqlite' ? SQLiteColumn<TBuiltConfig, {}>\n\t\t: TDialect extends 'singlestore' ? SingleStoreColumn<TBuiltConfig, {}>\n\t\t: TDialect extends 'gel' ? GelColumn<TBuiltConfig, {}>\n\t\t: TDialect extends 'cockroach' ? CockroachColumn<TBuiltConfig, {}>\n\t\t: TDialect extends 'common' ? Column<TBuiltConfig, {}>\n\t\t: never;\n\nexport type BuildIndexColumn<\n\tTDialect extends Dialect,\n> = TDialect extends 'pg' ? ExtraConfigColumn\n\t: TDialect extends 'cockroach' ? CockroachExtraConfigColumn\n\t: TDialect extends 'gel' ? GelExtraConfigColumn\n\t: never;\n\n// TODO\n// try to make sql as well + indexRaw\n\n// optional after everything will be working as expected\n// also try to leave only needed methods for extraConfig\n// make an error if I pass .asc() to fk and so on\n\nexport type BuildColumns<\n\tTTableName extends string,\n\tTConfigMap extends Record<string, ColumnBuilderBase>,\n\tTDialect extends Dialect,\n> =\n\t& {\n\t\t[Key in keyof TConfigMap]: BuildColumn<\n\t\t\tTTableName,\n\t\t\tTConfigMap[Key],\n\t\t\tTDialect\n\t\t>;\n\t}\n\t& {};\n\nexport type BuildExtraConfigColumns<\n\t_TTableName extends string,\n\tTConfigMap extends Record<string, ColumnBuilderBase>,\n\tTDialect extends Dialect,\n> =\n\t& {\n\t\t[Key in keyof TConfigMap]: BuildIndexColumn<TDialect>;\n\t}\n\t& {};\n\nexport type ChangeColumnTableName<\n\tTColumn extends Column,\n\tTAlias extends string,\n\tTDialect extends Dialect,\n> =\n\t// TODO: optimise\n\tTDialect extends 'pg' ? PgColumn<\n\t\t\tTColumn['_']['dataType'],\n\t\t\tOmit<TColumn['_'], 'tableName'> & { tableName: TAlias; insertType: unknown }\n\t\t>\n\t\t: TDialect extends 'mysql' ? MySqlColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: TDialect extends 'singlestore' ? SingleStoreColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: TDialect extends 'sqlite' ? SQLiteColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: TDialect extends 'gel' ? GelColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: TDialect extends 'mssql' ? MsSqlColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: TDialect extends 'cockroach' ? CockroachColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: never;\n", "import type {\n\tColumnBuilderBaseConfig,\n\tColumnBuilderExtraConfig,\n\tColumnBuilderRuntimeConfig,\n\tColumnType,\n\tHasGenerated,\n} from '~/column-builder.ts';\nimport { ColumnBuilder } from '~/column-builder.ts';\nimport { Column } from '~/column.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport type { ForeignKey, UpdateDeleteAction } from '~/sqlite-core/foreign-keys.ts';\nimport { ForeignKeyBuilder } from '~/sqlite-core/foreign-keys.ts';\nimport type { SQLiteTable } from '~/sqlite-core/table.ts';\nimport type { Update } from '~/utils.ts';\n\nexport type SQLiteColumns = Record<string, SQLiteColumn<any>>;\n\nexport interface ReferenceConfig {\n\tref: () => SQLiteColumn;\n\tactions: {\n\t\tonUpdate?: UpdateDeleteAction;\n\t\tonDelete?: UpdateDeleteAction;\n\t};\n}\n\nexport interface SQLiteGeneratedColumnConfig {\n\tmode?: 'virtual' | 'stored';\n}\n\nexport abstract class SQLiteColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnType> = ColumnBuilderBaseConfig<ColumnType>,\n\tTRuntimeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = object,\n> extends ColumnBuilder<T, TRuntimeConfig, TExtraConfig> {\n\tstatic override readonly [entityKind]: string = 'SQLiteColumnBuilder';\n\n\tprivate foreignKeyConfigs: ReferenceConfig[] = [];\n\n\treferences(\n\t\tref: ReferenceConfig['ref'],\n\t\tactions: ReferenceConfig['actions'] = {},\n\t): this {\n\t\tthis.foreignKeyConfigs.push({ ref, actions });\n\t\treturn this;\n\t}\n\n\tunique(\n\t\tname?: string,\n\t): this {\n\t\tthis.config.isUnique = true;\n\t\tthis.config.uniqueName = name;\n\t\treturn this;\n\t}\n\n\tgeneratedAlwaysAs(as: SQL | (() => SQL), config?: SQLiteGeneratedColumnConfig): HasGenerated<this, {\n\t\ttype: 'always';\n\t}> {\n\t\tthis.config.generated = {\n\t\t\tas,\n\t\t\ttype: 'always',\n\t\t\tmode: config?.mode ?? 'virtual',\n\t\t};\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tbuildForeignKeys(column: SQLiteColumn, table: SQLiteTable): ForeignKey[] {\n\t\treturn this.foreignKeyConfigs.map(({ ref, actions }) => {\n\t\t\treturn ((ref, actions) => {\n\t\t\t\tconst builder = new ForeignKeyBuilder(() => {\n\t\t\t\t\tconst foreignColumn = ref();\n\t\t\t\t\treturn { columns: [column], foreignColumns: [foreignColumn] };\n\t\t\t\t});\n\t\t\t\tif (actions.onUpdate) {\n\t\t\t\t\tbuilder.onUpdate(actions.onUpdate);\n\t\t\t\t}\n\t\t\t\tif (actions.onDelete) {\n\t\t\t\t\tbuilder.onDelete(actions.onDelete);\n\t\t\t\t}\n\t\t\t\treturn builder.build(table);\n\t\t\t})(ref, actions);\n\t\t});\n\t}\n\n\t/** @internal */\n\tabstract build(table: SQLiteTable): SQLiteColumn;\n}\n\n// To understand how to use `SQLiteColumn` and `AnySQLiteColumn`, see `Column` and `AnyColumn` documentation.\nexport abstract class SQLiteColumn<\n\tT extends ColumnBaseConfig<ColumnType> = ColumnBaseConfig<ColumnType>,\n\tTRuntimeConfig extends object = {},\n> extends Column<T, TRuntimeConfig> {\n\tstatic override readonly [entityKind]: string = 'SQLiteColumn';\n\n\t/** @internal */\n\toverride readonly table: SQLiteTable;\n\n\tconstructor(\n\t\ttable: SQLiteTable,\n\t\tconfig: ColumnBuilderRuntimeConfig<T['data']> & TRuntimeConfig,\n\t) {\n\t\tsuper(table, config);\n\t\tthis.table = table;\n\t}\n}\n\nexport type AnySQLiteColumn<TPartial extends Partial<ColumnBaseConfig<ColumnType>> = {}> = SQLiteColumn<\n\tRequired<Update<ColumnBaseConfig<ColumnType>, TPartial>>\n>;\n", "import type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { type Equal, getColumnNameAndConfig, textDecoder } from '~/utils.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\ntype BlobMode = 'buffer' | 'json' | 'bigint';\n\nfunction hexToText(hexString: string) {\n\tlet result = '';\n\tfor (let i = 0; i < hexString.length; i += 2) {\n\t\tconst hexPair = hexString.slice(i, i + 2);\n\t\tconst decimalValue = Number.parseInt(hexPair, 16);\n\t\tresult += String.fromCodePoint(decimalValue);\n\t}\n\treturn result;\n}\n\nexport class SQLiteBigIntBuilder extends SQLiteColumnBuilder<{\n\tdataType: 'bigint int64';\n\tdata: bigint;\n\tdriverParam: Buffer;\n}> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBigIntBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'bigint int64', 'SQLiteBigInt');\n\t}\n\n\t/** @internal */\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteBigInt(table, this.config as any);\n\t}\n}\n\nexport class SQLiteBigInt<T extends ColumnBaseConfig<'bigint int64'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBigInt';\n\n\tgetSQLType(): string {\n\t\treturn 'blob';\n\t}\n\n\toverride mapFromDriverValue(value: Buffer | Uint8Array | ArrayBuffer | string): bigint {\n\t\t// For RQBv2\n\t\tif (typeof value === 'string') {\n\t\t\treturn BigInt(hexToText(value));\n\t\t}\n\n\t\tif (typeof Buffer !== 'undefined' && Buffer.from) {\n\t\t\tconst buf = Buffer.isBuffer(value)\n\t\t\t\t? value\n\t\t\t\t// oxlint-disable-next-line drizzle-internal/no-instanceof\n\t\t\t\t: value instanceof ArrayBuffer\n\t\t\t\t? Buffer.from(value)\n\t\t\t\t: value.buffer\n\t\t\t\t? Buffer.from(value.buffer, value.byteOffset, value.byteLength)\n\t\t\t\t: Buffer.from(value);\n\t\t\treturn BigInt(buf.toString('utf8'));\n\t\t}\n\n\t\treturn BigInt(textDecoder!.decode(value as ArrayBuffer));\n\t}\n\n\toverride mapToDriverValue(value: bigint): Buffer {\n\t\treturn Buffer.from(value.toString());\n\t}\n}\n\nexport class SQLiteBlobJsonBuilder extends SQLiteColumnBuilder<{\n\tdataType: 'object json';\n\tdata: unknown;\n\tdriverParam: Buffer;\n}> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBlobJsonBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'object json', 'SQLiteBlobJson');\n\t}\n\n\t/** @internal */\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteBlobJson(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class SQLiteBlobJson<T extends ColumnBaseConfig<'object json'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBlobJson';\n\n\tgetSQLType(): string {\n\t\treturn 'blob';\n\t}\n\n\toverride mapFromDriverValue(value: Buffer | Uint8Array | ArrayBuffer | string): T['data'] {\n\t\t// For RQBv2\n\t\tif (typeof value === 'string') {\n\t\t\treturn JSON.parse(hexToText(value));\n\t\t}\n\n\t\tif (typeof Buffer !== 'undefined' && Buffer.from) {\n\t\t\tconst buf = Buffer.isBuffer(value)\n\t\t\t\t? value\n\t\t\t\t// oxlint-disable-next-line drizzle-internal/no-instanceof\n\t\t\t\t: value instanceof ArrayBuffer\n\t\t\t\t? Buffer.from(value)\n\t\t\t\t: value.buffer\n\t\t\t\t? Buffer.from(value.buffer, value.byteOffset, value.byteLength)\n\t\t\t\t: Buffer.from(value);\n\t\t\treturn JSON.parse(buf.toString('utf8'));\n\t\t}\n\n\t\treturn JSON.parse(textDecoder!.decode(value as ArrayBuffer));\n\t}\n\n\toverride mapToDriverValue(value: T['data']): Buffer {\n\t\treturn Buffer.from(JSON.stringify(value));\n\t}\n}\n\nexport class SQLiteBlobBufferBuilder extends SQLiteColumnBuilder<{\n\tdataType: 'object buffer';\n\tdata: Buffer;\n\tdriverParam: Buffer;\n}> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBlobBufferBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'object buffer', 'SQLiteBlobBuffer');\n\t}\n\n\t/** @internal */\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteBlobBuffer(table, this.config as any);\n\t}\n}\n\nexport class SQLiteBlobBuffer<T extends ColumnBaseConfig<'object buffer'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBlobBuffer';\n\n\toverride mapFromDriverValue(value: Buffer | Uint8Array | ArrayBuffer): T['data'] {\n\t\tif (Buffer.isBuffer(value)) {\n\t\t\treturn value;\n\t\t}\n\n\t\t// For RQBv2\n\t\tif (typeof value === 'string') {\n\t\t\treturn Buffer.from(value, 'hex');\n\t\t}\n\n\t\treturn Buffer.from(value as Uint8Array);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn 'blob';\n\t}\n}\n\nexport interface BlobConfig<TMode extends BlobMode = BlobMode> {\n\tmode: TMode;\n}\n\n/**\n * It's recommended to use `text('...', { mode: 'json' })` instead of `blob` in JSON mode, because it supports JSON functions:\n * >All JSON functions currently throw an error if any of their arguments are BLOBs because BLOBs are reserved for a future enhancement in which BLOBs will store the binary encoding for JSON.\n *\n * https://www.sqlite.org/json1.html\n */\nexport function blob<TMode extends BlobMode = BlobMode>(\n\tconfig?: BlobConfig<TMode>,\n): Equal<TMode, 'bigint'> extends true ? SQLiteBigIntBuilder\n\t: Equal<TMode, 'buffer'> extends true ? SQLiteBlobBufferBuilder\n\t: SQLiteBlobJsonBuilder;\nexport function blob<TMode extends BlobMode = BlobMode>(\n\tname: string,\n\tconfig?: BlobConfig<TMode>,\n): Equal<TMode, 'bigint'> extends true ? SQLiteBigIntBuilder\n\t: Equal<TMode, 'buffer'> extends true ? SQLiteBlobBufferBuilder\n\t: SQLiteBlobJsonBuilder;\nexport function blob(a?: string | BlobConfig, b?: BlobConfig) {\n\tconst { name, config } = getColumnNameAndConfig<BlobConfig | undefined>(a, b);\n\tif (config?.mode === 'json') {\n\t\treturn new SQLiteBlobJsonBuilder(name);\n\t}\n\tif (config?.mode === 'bigint') {\n\t\treturn new SQLiteBigIntBuilder(name);\n\t}\n\treturn new SQLiteBlobBufferBuilder(name);\n}\n", "import type { ColumnBuilderBaseConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { SQL, SQLGenerator } from '~/sql/sql.ts';\nimport type { AnySQLiteTable, SQLiteTable } from '~/sqlite-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\nexport type ConvertCustomConfig<T extends Partial<CustomTypeValues>> =\n\t& {\n\t\tdataType: 'custom';\n\t\tdata: T['data'];\n\t\tdriverParam: T['driverData'];\n\t}\n\t& (T['notNull'] extends true ? { notNull: true } : {})\n\t& (T['default'] extends true ? { hasDefault: true } : {});\n\nexport interface SQLiteCustomColumnInnerConfig {\n\tcustomTypeValues: CustomTypeValues;\n}\n\nexport class SQLiteCustomColumnBuilder<T extends ColumnBuilderBaseConfig<'custom'>> extends SQLiteColumnBuilder<\n\tT,\n\t{\n\t\tfieldConfig: CustomTypeValues['config'];\n\t\tcustomTypeParams: CustomTypeParams<any>;\n\t}\n> {\n\tstatic override readonly [entityKind]: string = 'SQLiteCustomColumnBuilder';\n\n\tconstructor(\n\t\tname: string,\n\t\tfieldConfig: CustomTypeValues['config'],\n\t\tcustomTypeParams: CustomTypeParams<any>,\n\t) {\n\t\tsuper(name, 'custom', 'SQLiteCustomColumn');\n\t\tthis.config.fieldConfig = fieldConfig;\n\t\tthis.config.customTypeParams = customTypeParams;\n\t}\n\n\t/** @internal */\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteCustomColumn(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class SQLiteCustomColumn<T extends ColumnBaseConfig<'custom'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteCustomColumn';\n\n\tprivate sqlName: string;\n\tprivate mapTo?: (value: T['data']) => T['driverParam'];\n\tprivate mapFrom?: (value: T['driverParam']) => T['data'];\n\tprivate mapJson?: (value: unknown) => T['data'];\n\tprivate forJsonSelect?: (name: SQL, sql: SQLGenerator) => SQL;\n\n\tconstructor(\n\t\ttable: AnySQLiteTable<{ name: T['tableName'] }>,\n\t\tconfig: SQLiteCustomColumnBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.sqlName = config.customTypeParams.dataType(config.fieldConfig);\n\t\tthis.mapTo = config.customTypeParams.toDriver;\n\t\tthis.mapFrom = config.customTypeParams.fromDriver;\n\t\tthis.mapJson = config.customTypeParams.fromJson;\n\t\tthis.forJsonSelect = config.customTypeParams.forJsonSelect;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.sqlName;\n\t}\n\n\toverride mapFromDriverValue(value: T['driverParam']): T['data'] {\n\t\treturn typeof this.mapFrom === 'function' ? this.mapFrom(value) : value as T['data'];\n\t}\n\n\tmapFromJsonValue(value: unknown): T['data'] {\n\t\treturn typeof this.mapJson === 'function' ? this.mapJson(value) : this.mapFromDriverValue(value) as T['data'];\n\t}\n\n\tjsonSelectIdentifier(identifier: SQL, sql: SQLGenerator): SQL {\n\t\tif (typeof this.forJsonSelect === 'function') return this.forJsonSelect(identifier, sql);\n\n\t\tconst rawType = this.getSQLType().toLowerCase();\n\t\tconst parenPos = rawType.indexOf('(');\n\t\tconst type = (parenPos + 1) ? rawType.slice(0, parenPos) : rawType;\n\n\t\tswitch (type) {\n\t\t\tcase 'numeric':\n\t\t\tcase 'decimal':\n\t\t\tcase 'bigint': {\n\t\t\t\treturn sql`cast(${identifier} as text)`;\n\t\t\t}\n\t\t\tcase 'blob': {\n\t\t\t\treturn sql`hex(${identifier})`;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\treturn identifier;\n\t\t\t}\n\t\t}\n\t}\n\n\toverride mapToDriverValue(value: T['data']): T['driverParam'] {\n\t\treturn typeof this.mapTo === 'function' ? this.mapTo(value) : value as T['data'];\n\t}\n}\n\nexport interface CustomTypeValues {\n\t/**\n\t * Required type for custom column, that will infer proper type model\n\t *\n\t * Examples:\n\t *\n\t * If you want your column to be `string` type after selecting/or on inserting - use `data: string`. Like `text`, `varchar`\n\t *\n\t * If you want your column to be `number` type after selecting/or on inserting - use `data: number`. Like `integer`\n\t */\n\tdata: unknown;\n\n\t/**\n\t * Type helper, that represents what type database driver is accepting for specific database data type\n\t */\n\tdriverData?: unknown;\n\n\t/**\n\t * Type helper, that represents what type database driver is returning for specific database data type\n\t *\n\t * Needed only in case driver's output and input for type differ\n\t *\n\t * Defaults to {@link driverData}\n\t */\n\tdriverOutput?: unknown;\n\n\t/**\n\t * Type helper, that represents what type field returns after being aggregated to JSON\n\t */\n\tjsonData?: unknown;\n\n\t/**\n\t * What config type should be used for {@link CustomTypeParams} `dataType` generation\n\t */\n\tconfig?: Record<string, any>;\n\n\t/**\n\t * Whether the config argument should be required or not\n\t * @default false\n\t */\n\tconfigRequired?: boolean;\n\n\t/**\n\t * If your custom data type should be notNull by default you can use `notNull: true`\n\t *\n\t * @example\n\t * const customSerial = customType<{ data: number, notNull: true, default: true }>({\n\t * \t dataType() {\n\t * \t return 'serial';\n\t * },\n\t * });\n\t */\n\tnotNull?: boolean;\n\n\t/**\n\t * If your custom data type has default you can use `default: true`\n\t *\n\t * @example\n\t * const customSerial = customType<{ data: number, notNull: true, default: true }>({\n\t * \t dataType() {\n\t * \t return 'serial';\n\t * },\n\t * });\n\t */\n\tdefault?: boolean;\n}\n\nexport interface CustomTypeParams<T extends CustomTypeValues> {\n\t/**\n\t * Database data type string representation, that is used for migrations\n\t * @example\n\t * ```\n\t * `jsonb`, `text`\n\t * ```\n\t *\n\t * If database data type needs additional params you can use them from `config` param\n\t * @example\n\t * ```\n\t * `varchar(256)`, `numeric(2,3)`\n\t * ```\n\t *\n\t * To make `config` be of specific type please use config generic in {@link CustomTypeValues}\n\t *\n\t * @example\n\t * Usage example\n\t * ```\n\t * dataType() {\n\t * return 'boolean';\n\t * },\n\t * ```\n\t * Or\n\t * ```\n\t * dataType(config) {\n\t * \t return typeof config.length !== 'undefined' ? `varchar(${config.length})` : `varchar`;\n\t * \t }\n\t * ```\n\t */\n\tdataType: (config: T['config'] | (Equal<T['configRequired'], true> extends true ? never : undefined)) => string;\n\n\t/**\n\t * Optional mapping function, that is used to transform inputs from desired to be used in code format to one suitable for driver\n\t * @example\n\t * For example, when using jsonb we need to map JS/TS object to string before writing to database\n\t * ```\n\t * toDriver(value: TData): string {\n\t * \t return JSON.stringify(value);\n\t * }\n\t * ```\n\t */\n\ttoDriver?: (value: T['data']) => T['driverData'] | SQL;\n\n\t/**\n\t * Optional mapping function, that is used for transforming data returned by driver to desired column's output format\n\t * @example\n\t * For example, when using timestamp we need to map string Date representation to JS Date\n\t * ```\n\t * fromDriver(value: string): Date {\n\t * \treturn new Date(value);\n\t * }\n\t * ```\n\t *\n\t * It'll cause the returned data to change from:\n\t * ```\n\t * {\n\t * \tcustomField: \"2025-04-07T03:25:16.635Z\";\n\t * }\n\t * ```\n\t * to:\n\t * ```\n\t * {\n\t * \tcustomField: new Date(\"2025-04-07T03:25:16.635Z\");\n\t * }\n\t * ```\n\t */\n\tfromDriver?: (value: 'driverOutput' extends keyof T ? T['driverOutput'] : T['driverData']) => T['data'];\n\n\t/**\n\t * Optional mapping function, that is used for transforming data returned by transofmed to JSON in database data to desired format\n\t *\n\t * Used by [relational queries](https://orm.drizzle.team/docs/rqb-v2)\n\t *\n\t * Defaults to {@link fromDriver} function\n\t * @example\n\t * For example, when querying blob column via [RQB](https://orm.drizzle.team/docs/rqb-v2) or [JSON functions](https://orm.drizzle.team/docs/json-functions), the result field will be returned as it's hex string representation, as opposed to Buffer from regular query\n\t * To handle that, we need a separate function to handle such field's mapping:\n\t * ```\n\t * fromJson(value: string): Buffer {\n\t * \treturn Buffer.from(value, 'hex');\n\t * },\n\t * ```\n\t *\n\t * It'll cause the returned data to change from:\n\t * ```\n\t * {\n\t * \tcustomField: \"04A8...\";\n\t * }\n\t * ```\n\t * to:\n\t * ```\n\t * {\n\t * \tcustomField: Buffer([...]);\n\t * }\n\t * ```\n\t */\n\tfromJson?: (value: T['jsonData']) => T['data'];\n\n\t/**\n\t * Optional selection modifier function, that is used for modifying selection of column inside [JSON functions](https://orm.drizzle.team/docs/json-functions)\n\t *\n\t * Additional mapping that could be required for such scenarios can be handled using {@link fromJson} function\n\t *\n\t * Used by [relational queries](https://orm.drizzle.team/docs/rqb-v2)\n\t *\n\t * Following types are being casted to text by default: `numeric`, `decimal`, `bigint`, `blob` (via `hex()` function)\n\t * @example\n\t * For example, when using numeric field for bigint storage we need to cast field to text to preserve data integrity\n\t * ```\n\t * forJsonSelect(identifier: SQL, sql: SQLGenerator): SQL {\n\t * \treturn sql`cast(${identifier} as text)`\n\t * },\n\t * ```\n\t *\n\t * This will change query from:\n\t * ```\n\t * SELECT\n\t * \tjson_object('bigint', `t`.`bigint`)\n\t * \tFROM\n\t * \t(\n\t * \t\tSELECT\n\t * \t\t`table`.`custom_bigint` AS \"bigint\"\n\t * \t\tFROM\n\t * \t\t`table`\n\t * \t) AS `t`\n\t * ```\n\t * to:\n\t * ```\n\t * SELECT\n\t * \tjson_object('bigint', `t`.`bigint`)\n\t * \tFROM\n\t * \t(\n\t * \t\tSELECT\n\t * \t\tcast(`table`.`custom_bigint` as text) AS `bigint`\n\t * \t\tFROM\n\t * \t\t`table`\n\t * \t) AS `t`\n\t * ```\n\t *\n\t * Returned by query object will change from:\n\t * ```\n\t * {\n\t * \tbigint: 5044565289845416000; // Partial data loss due to direct conversion to JSON format\n\t * }\n\t * ```\n\t * to:\n\t * ```\n\t * {\n\t * \tbigint: \"5044565289845416380\"; // Data is preserved due to conversion of field to text before JSON-ification\n\t * }\n\t * ```\n\t */\n\tforJsonSelect?: (identifier: SQL, sql: SQLGenerator) => SQL;\n}\n\n/**\n * Custom sqlite database data type generator\n */\nexport function customType<T extends CustomTypeValues = CustomTypeValues>(\n\tcustomTypeParams: CustomTypeParams<T>,\n): Equal<T['configRequired'], true> extends true ? {\n\t\t<TConfig extends Record<string, any> & T['config']>(\n\t\t\tfieldConfig: TConfig,\n\t\t): SQLiteCustomColumnBuilder<ConvertCustomConfig<T>>;\n\t\t(\n\t\t\tdbname: string,\n\t\t\tfieldConfig: T['config'],\n\t\t): SQLiteCustomColumnBuilder<ConvertCustomConfig<T>>;\n\t}\n\t: {\n\t\t(): SQLiteCustomColumnBuilder<ConvertCustomConfig<T>>;\n\t\t<TConfig extends Record<string, any> & T['config']>(\n\t\t\tfieldConfig?: TConfig,\n\t\t): SQLiteCustomColumnBuilder<ConvertCustomConfig<T>>;\n\t\t(\n\t\t\tdbname: string,\n\t\t\tfieldConfig?: T['config'],\n\t\t): SQLiteCustomColumnBuilder<ConvertCustomConfig<T>>;\n\t}\n{\n\treturn (\n\t\ta?: string | T['config'],\n\t\tb?: T['config'],\n\t): SQLiteCustomColumnBuilder<ConvertCustomConfig<T>> => {\n\t\tconst { name, config } = getColumnNameAndConfig<T['config']>(a, b);\n\t\treturn new SQLiteCustomColumnBuilder(\n\t\t\tname,\n\t\t\tconfig,\n\t\t\tcustomTypeParams,\n\t\t);\n\t};\n}\n", "import type { ColumnBuilderBaseConfig, ColumnType, HasDefault, IsPrimaryKey, NotNull } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { OnConflict } from '~/sqlite-core/utils.ts';\nimport { type Equal, getColumnNameAndConfig, type Or } from '~/utils.ts';\nimport type { SQLiteTable } from '../table.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\nexport interface PrimaryKeyConfig {\n\tautoIncrement?: boolean;\n\tonConflict?: OnConflict;\n}\n\nexport abstract class SQLiteBaseIntegerBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnType>,\n\tTRuntimeConfig extends object = object,\n> extends SQLiteColumnBuilder<\n\tT,\n\tTRuntimeConfig & { autoIncrement: boolean },\n\t{ primaryKeyHasDefault: true }\n> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBaseIntegerBuilder';\n\n\tconstructor(name: string, dataType: T['dataType'], columnType: string) {\n\t\tsuper(name, dataType, columnType);\n\t\tthis.config.autoIncrement = false;\n\t}\n\n\toverride primaryKey(config?: PrimaryKeyConfig): IsPrimaryKey<HasDefault<NotNull<this>>> {\n\t\tif (config?.autoIncrement) {\n\t\t\tthis.config.autoIncrement = true;\n\t\t}\n\t\tthis.config.hasDefault = true;\n\t\treturn super.primaryKey() as IsPrimaryKey<HasDefault<NotNull<this>>>;\n\t}\n}\n\nexport abstract class SQLiteBaseInteger<\n\tT extends ColumnBaseConfig<ColumnType>,\n\tTRuntimeConfig extends object = object,\n> extends SQLiteColumn<T, TRuntimeConfig & { autoIncrement: boolean }> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBaseInteger';\n\n\treadonly autoIncrement: boolean = this.config.autoIncrement;\n\n\tgetSQLType(): string {\n\t\treturn 'integer';\n\t}\n}\n\nexport class SQLiteIntegerBuilder extends SQLiteBaseIntegerBuilder<{\n\tdataType: 'number int53';\n\tdata: number;\n\tdriverParam: number;\n}> {\n\tstatic override readonly [entityKind]: string = 'SQLiteIntegerBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'number int53', 'SQLiteInteger');\n\t}\n\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteInteger(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class SQLiteInteger<T extends ColumnBaseConfig<'number int53'>> extends SQLiteBaseInteger<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteInteger';\n}\n\nexport class SQLiteTimestampBuilder extends SQLiteBaseIntegerBuilder<{\n\tdataType: 'object date';\n\tdata: Date;\n\tdriverParam: number;\n}, { mode: 'timestamp' | 'timestamp_ms' }> {\n\tstatic override readonly [entityKind]: string = 'SQLiteTimestampBuilder';\n\n\tconstructor(name: string, mode: 'timestamp' | 'timestamp_ms') {\n\t\tsuper(name, 'object date', 'SQLiteTimestamp');\n\t\tthis.config.mode = mode;\n\t}\n\n\t/**\n\t * @deprecated Use `default()` with your own expression instead.\n\t *\n\t * Adds `DEFAULT (cast((julianday('now') - 2440587.5)*86400000 as integer))` to the column, which is the current epoch timestamp in milliseconds.\n\t */\n\tdefaultNow(): HasDefault<this> {\n\t\treturn this.default(sql`(cast((julianday('now') - 2440587.5)*86400000 as integer))`) as any;\n\t}\n\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteTimestamp(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class SQLiteTimestamp<T extends ColumnBaseConfig<'object date'>>\n\textends SQLiteBaseInteger<T, { mode: 'timestamp' | 'timestamp_ms' }>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteTimestamp';\n\n\treadonly mode: 'timestamp' | 'timestamp_ms' = this.config.mode;\n\n\toverride mapFromDriverValue(value: number | string): Date {\n\t\t// legacy issue if integer had string date format\n\t\t// old kit generated defaults as quoted strings \"<string>\"\n\t\tif (typeof value === 'string') return new Date(value.replaceAll('\"', ''));\n\t\tif (this.config.mode === 'timestamp') {\n\t\t\treturn new Date(value * 1000);\n\t\t}\n\t\treturn new Date(value);\n\t}\n\n\toverride mapToDriverValue(value: Date | number): number {\n\t\tif (typeof value === 'number') return value;\n\t\tconst unix = value.getTime();\n\t\tif (this.config.mode === 'timestamp') {\n\t\t\treturn Math.floor(unix / 1000);\n\t\t}\n\t\treturn unix;\n\t}\n}\n\nexport class SQLiteBooleanBuilder extends SQLiteBaseIntegerBuilder<{\n\tdataType: 'boolean';\n\tdata: boolean;\n\tdriverParam: number;\n}, { mode: 'boolean' }> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBooleanBuilder';\n\n\tconstructor(name: string, mode: 'boolean') {\n\t\tsuper(name, 'boolean', 'SQLiteBoolean');\n\t\tthis.config.mode = mode;\n\t}\n\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteBoolean(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class SQLiteBoolean<T extends ColumnBaseConfig<'boolean'>> extends SQLiteBaseInteger<T, { mode: 'boolean' }> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBoolean';\n\n\treadonly mode: 'boolean' = this.config.mode;\n\n\toverride mapFromDriverValue(value: number): boolean {\n\t\treturn Number(value) === 1;\n\t}\n\n\toverride mapToDriverValue(value: boolean): number {\n\t\treturn value ? 1 : 0;\n\t}\n}\n\nexport interface IntegerConfig<\n\tTMode extends 'number' | 'timestamp' | 'timestamp_ms' | 'boolean' =\n\t\t| 'number'\n\t\t| 'timestamp'\n\t\t| 'timestamp_ms'\n\t\t| 'boolean',\n> {\n\tmode: TMode;\n}\n\nexport function integer<TMode extends IntegerConfig['mode']>(\n\tconfig?: IntegerConfig<TMode>,\n): Or<Equal<TMode, 'timestamp'>, Equal<TMode, 'timestamp_ms'>> extends true ? SQLiteTimestampBuilder\n\t: Equal<TMode, 'boolean'> extends true ? SQLiteBooleanBuilder\n\t: SQLiteIntegerBuilder;\nexport function integer<TMode extends IntegerConfig['mode']>(\n\tname: string,\n\tconfig?: IntegerConfig<TMode>,\n): Or<Equal<TMode, 'timestamp'>, Equal<TMode, 'timestamp_ms'>> extends true ? SQLiteTimestampBuilder\n\t: Equal<TMode, 'boolean'> extends true ? SQLiteBooleanBuilder\n\t: SQLiteIntegerBuilder;\nexport function integer(a?: string | IntegerConfig, b?: IntegerConfig) {\n\tconst { name, config } = getColumnNameAndConfig<IntegerConfig | undefined>(a, b);\n\tif (config?.mode === 'timestamp' || config?.mode === 'timestamp_ms') {\n\t\treturn new SQLiteTimestampBuilder(name, config.mode);\n\t}\n\tif (config?.mode === 'boolean') {\n\t\treturn new SQLiteBooleanBuilder(name, config.mode);\n\t}\n\treturn new SQLiteIntegerBuilder(name);\n}\n\nexport const int = integer;\n", "import type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\nexport class SQLiteNumericBuilder extends SQLiteColumnBuilder<{\n\tdataType: 'string numeric';\n\tdata: string;\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'SQLiteNumericBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'string numeric', 'SQLiteNumeric');\n\t}\n\n\t/** @internal */\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteNumeric(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class SQLiteNumeric<T extends ColumnBaseConfig<'string numeric'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteNumeric';\n\n\toverride mapFromDriverValue(value: unknown): string {\n\t\tif (typeof value === 'string') return value;\n\n\t\treturn String(value);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn 'numeric';\n\t}\n}\nexport class SQLiteNumericNumberBuilder extends SQLiteColumnBuilder<{\n\tdataType: 'number';\n\tdata: number;\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'SQLiteNumericNumberBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'number', 'SQLiteNumericNumber');\n\t}\n\n\t/** @internal */\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteNumericNumber(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class SQLiteNumericNumber<T extends ColumnBaseConfig<'number'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteNumericNumber';\n\n\toverride mapFromDriverValue(value: unknown): number {\n\t\tif (typeof value === 'number') return value;\n\n\t\treturn Number(value);\n\t}\n\n\toverride mapToDriverValue = String;\n\n\tgetSQLType(): string {\n\t\treturn 'numeric';\n\t}\n}\n\nexport class SQLiteNumericBigIntBuilder extends SQLiteColumnBuilder<{\n\tdataType: 'bigint int64';\n\tdata: bigint;\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'SQLiteNumericBigIntBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'bigint int64', 'SQLiteNumericBigInt');\n\t}\n\n\t/** @internal */\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteNumericBigInt(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class SQLiteNumericBigInt<T extends ColumnBaseConfig<'bigint int64'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteNumericBigInt';\n\n\toverride mapFromDriverValue = BigInt;\n\n\toverride mapToDriverValue = String;\n\n\tgetSQLType(): string {\n\t\treturn 'numeric';\n\t}\n}\n\nexport type SQLiteNumericConfig<T extends 'string' | 'number' | 'bigint' = 'string' | 'number' | 'bigint'> = {\n\tmode: T;\n};\n\nexport function numeric<TMode extends SQLiteNumericConfig['mode']>(\n\tconfig?: SQLiteNumericConfig<TMode>,\n): Equal<TMode, 'number'> extends true ? SQLiteNumericNumberBuilder\n\t: Equal<TMode, 'bigint'> extends true ? SQLiteNumericBigIntBuilder\n\t: SQLiteNumericBuilder;\nexport function numeric<TMode extends SQLiteNumericConfig['mode']>(\n\tname: string,\n\tconfig?: SQLiteNumericConfig<TMode>,\n): Equal<TMode, 'number'> extends true ? SQLiteNumericNumberBuilder\n\t: Equal<TMode, 'bigint'> extends true ? SQLiteNumericBigIntBuilder\n\t: SQLiteNumericBuilder;\nexport function numeric(a?: string | SQLiteNumericConfig, b?: SQLiteNumericConfig) {\n\tconst { name, config } = getColumnNameAndConfig<SQLiteNumericConfig>(a, b);\n\tconst mode = config?.mode;\n\treturn mode === 'number'\n\t\t? new SQLiteNumericNumberBuilder(name)\n\t\t: mode === 'bigint'\n\t\t? new SQLiteNumericBigIntBuilder(name)\n\t\t: new SQLiteNumericBuilder(name);\n}\n", "import type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { SQLiteTable } from '../table.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\nexport class SQLiteRealBuilder extends SQLiteColumnBuilder<{\n\tdataType: 'number double';\n\tdata: number;\n\tdriverParam: number;\n}> {\n\tstatic override readonly [entityKind]: string = 'SQLiteRealBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'number double', 'SQLiteReal');\n\t}\n\n\t/** @internal */\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteReal(table, this.config as any);\n\t}\n}\n\nexport class SQLiteReal<T extends ColumnBaseConfig<'number double'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteReal';\n\n\tgetSQLType(): string {\n\t\treturn 'real';\n\t}\n}\n\nexport function real(name?: string): SQLiteRealBuilder {\n\treturn new SQLiteRealBuilder(name ?? '');\n}\n", "import type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySQLiteTable, SQLiteTable } from '~/sqlite-core/table.ts';\nimport { type Assume, type Equal, getColumnNameAndConfig, type Writable } from '~/utils.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\nexport class SQLiteTextBuilder<\n\tTEnum extends [string, ...string[]],\n> extends SQLiteColumnBuilder<\n\t{\n\t\tdataType: Equal<TEnum, [string, ...string[]]> extends true ? 'string' : 'string enum';\n\t\tdata: TEnum[number];\n\t\tdriverParam: string;\n\t\tenumValues: TEnum;\n\t},\n\t{ enumValues: TEnum; length: number | undefined }\n> {\n\tstatic override readonly [entityKind]: string = 'SQLiteTextBuilder';\n\n\tconstructor(name: string, config: SQLiteTextConfig<'text', TEnum>) {\n\t\tsuper(name, config.enum?.length ? 'string enum' : 'string', 'SQLiteText');\n\t\tthis.config.enumValues = config.enum!;\n\t\tthis.config.length = config.length!;\n\t}\n\n\t/** @internal */\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteText(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class SQLiteText<T extends ColumnBaseConfig<'string' | 'string enum'>>\n\textends SQLiteColumn<T, { length: number | undefined; enumValues: T['enumValues'] }>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteText';\n\n\toverride readonly enumValues = this.config.enumValues;\n\n\tconstructor(\n\t\ttable: AnySQLiteTable<{ name: T['tableName'] }>,\n\t\tconfig: SQLiteTextBuilder<Assume<T['enumValues'], [string, ...string[]]>>['config'],\n\t) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn `text${this.config.length ? `(${this.config.length})` : ''}`;\n\t}\n}\n\nexport class SQLiteTextJsonBuilder extends SQLiteColumnBuilder<{\n\tdataType: 'object json';\n\tdata: unknown;\n\tdriverParam: string;\n\n\tgenerated: undefined;\n}> {\n\tstatic override readonly [entityKind]: string = 'SQLiteTextJsonBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'object json', 'SQLiteTextJson');\n\t}\n\n\t/** @internal */\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteTextJson(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class SQLiteTextJson<T extends ColumnBaseConfig<'object json'>>\n\textends SQLiteColumn<T, { length: number | undefined; enumValues: T['enumValues'] }>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteTextJson';\n\n\tgetSQLType(): string {\n\t\treturn 'text';\n\t}\n\n\toverride mapFromDriverValue(value: string): T['data'] {\n\t\treturn JSON.parse(value);\n\t}\n\n\toverride mapToDriverValue(value: T['data']): string {\n\t\treturn JSON.stringify(value);\n\t}\n}\n\nexport type SQLiteTextConfig<\n\tTMode extends 'text' | 'json' = 'text' | 'json',\n\tTEnum extends readonly string[] | string[] | undefined = readonly string[] | string[] | undefined,\n> = TMode extends 'text' ? {\n\t\tmode?: TMode;\n\t\tlength?: number;\n\t\tenum?: TEnum;\n\t}\n\t: {\n\t\tmode?: TMode;\n\t};\n\nexport function text<\n\tU extends string,\n\tT extends Readonly<[U, ...U[]]>,\n\tTMode extends 'text' | 'json' = 'text' | 'json',\n>(\n\tconfig?: SQLiteTextConfig<TMode, T | Writable<T>>,\n): Equal<TMode, 'json'> extends true ? SQLiteTextJsonBuilder\n\t: SQLiteTextBuilder<Writable<T>>;\nexport function text<\n\tU extends string,\n\tT extends Readonly<[U, ...U[]]>,\n\tTMode extends 'text' | 'json' = 'text' | 'json',\n>(\n\tname: string,\n\tconfig?: SQLiteTextConfig<TMode, T | Writable<T>>,\n): Equal<TMode, 'json'> extends true ? SQLiteTextJsonBuilder\n\t: SQLiteTextBuilder<Writable<T>>;\nexport function text(a?: string | SQLiteTextConfig, b: SQLiteTextConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<SQLiteTextConfig>(a, b);\n\tif (config.mode === 'json') {\n\t\treturn new SQLiteTextJsonBuilder(name);\n\t}\n\treturn new SQLiteTextBuilder(name, config as any);\n}\n", "import { blob } from './blob.ts';\nimport { customType } from './custom.ts';\nimport { integer } from './integer.ts';\nimport { numeric } from './numeric.ts';\nimport { real } from './real.ts';\nimport { text } from './text.ts';\n\nexport function getSQLiteColumnBuilders() {\n\treturn {\n\t\tblob,\n\t\tcustomType,\n\t\tinteger,\n\t\tnumeric,\n\t\treal,\n\t\ttext,\n\t};\n}\n\nexport type SQLiteColumnBuilders = ReturnType<typeof getSQLiteColumnBuilders>;\n", "import type { BuildColumns, BuildExtraConfigColumns, ColumnBuilderBase } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport {\n\ttype InferTableColumnsModels,\n\tTable,\n\ttype TableConfig as TableConfigBase,\n\ttype UpdateTableConfig,\n} from '~/table.ts';\nimport type { CheckBuilder } from './checks.ts';\nimport { getSQLiteColumnBuilders, type SQLiteColumnBuilders } from './columns/all.ts';\nimport type { SQLiteColumn, SQLiteColumnBuilder, SQLiteColumns } from './columns/common.ts';\nimport type { ForeignKey, ForeignKeyBuilder } from './foreign-keys.ts';\nimport type { IndexBuilder } from './indexes.ts';\nimport type { PrimaryKeyBuilder } from './primary-keys.ts';\nimport type { UniqueConstraintBuilder } from './unique-constraint.ts';\n\nexport type SQLiteTableExtraConfigValue =\n\t| IndexBuilder\n\t| CheckBuilder\n\t| ForeignKeyBuilder\n\t| PrimaryKeyBuilder\n\t| UniqueConstraintBuilder;\n\nexport type SQLiteTableExtraConfig = Record<\n\tstring,\n\tSQLiteTableExtraConfigValue\n>;\n\nexport type TableConfig = TableConfigBase<SQLiteColumns>;\n\n/** @internal */\nexport const InlineForeignKeys = Symbol.for('drizzle:SQLiteInlineForeignKeys');\n\nexport class SQLiteTable<T extends TableConfig = TableConfig> extends Table<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteTable';\n\n\t/** @internal */\n\tstatic override readonly Symbol = Object.assign({}, Table.Symbol, {\n\t\tInlineForeignKeys: InlineForeignKeys as typeof InlineForeignKeys,\n\t});\n\n\t/** @internal */\n\toverride [Table.Symbol.Columns]!: NonNullable<T['columns']>;\n\n\t/** @internal */\n\t[InlineForeignKeys]: ForeignKey[] = [];\n\n\t/** @internal */\n\toverride [Table.Symbol.ExtraConfigBuilder]:\n\t\t| ((self: Record<string, SQLiteColumn>) => SQLiteTableExtraConfig)\n\t\t| undefined = undefined;\n}\n\nexport type AnySQLiteTable<TPartial extends Partial<TableConfig> = {}> = SQLiteTable<\n\tUpdateTableConfig<TableConfig, TPartial>\n>;\n\nexport type SQLiteTableWithColumns<T extends TableConfig> =\n\t& SQLiteTable<T>\n\t& T['columns']\n\t& InferTableColumnsModels<T['columns']>;\n\nexport interface SQLiteTableFn<TSchema extends string | undefined = undefined> {\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, ColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig?: (\n\t\t\tself: BuildColumns<TTableName, TColumnsMap, 'sqlite'>,\n\t\t) => SQLiteTableExtraConfigValue[],\n\t): SQLiteTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\t\tdialect: 'sqlite';\n\t}>;\n\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, ColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: SQLiteColumnBuilders) => TColumnsMap,\n\t\textraConfig?: (self: BuildColumns<TTableName, TColumnsMap, 'sqlite'>) => SQLiteTableExtraConfigValue[],\n\t): SQLiteTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\t\tdialect: 'sqlite';\n\t}>;\n\t/**\n\t * @deprecated The third parameter of sqliteTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = sqliteTable(\"users\", {\n\t * \tid: int(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = sqliteTable(\"users\", {\n\t * \tid: int(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, ColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig?: (self: BuildColumns<TTableName, TColumnsMap, 'sqlite'>) => SQLiteTableExtraConfig,\n\t): SQLiteTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\t\tdialect: 'sqlite';\n\t}>;\n\n\t/**\n\t * @deprecated The third parameter of sqliteTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = sqliteTable(\"users\", {\n\t * \tid: int(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = sqliteTable(\"users\", {\n\t * \tid: int(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, ColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: SQLiteColumnBuilders) => TColumnsMap,\n\t\textraConfig?: (self: BuildColumns<TTableName, TColumnsMap, 'sqlite'>) => SQLiteTableExtraConfig,\n\t): SQLiteTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\t\tdialect: 'sqlite';\n\t}>;\n}\n\nfunction sqliteTableBase<\n\tTTableName extends string,\n\tTColumnsMap extends Record<string, ColumnBuilderBase>,\n\tTSchema extends string | undefined,\n>(\n\tname: TTableName,\n\tcolumns: TColumnsMap | ((columnTypes: SQLiteColumnBuilders) => TColumnsMap),\n\textraConfig:\n\t\t| ((\n\t\t\tself: BuildColumns<TTableName, TColumnsMap, 'sqlite'>,\n\t\t) => SQLiteTableExtraConfig | SQLiteTableExtraConfigValue[])\n\t\t| undefined,\n\tschema?: TSchema,\n\tbaseName = name,\n): SQLiteTableWithColumns<{\n\tname: TTableName;\n\tschema: TSchema;\n\tcolumns: BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\tdialect: 'sqlite';\n}> {\n\tconst rawTable = new SQLiteTable<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\t\tdialect: 'sqlite';\n\t}>(name, schema, baseName);\n\n\tconst parsedColumns: TColumnsMap = typeof columns === 'function' ? columns(getSQLiteColumnBuilders()) : columns;\n\n\tconst builtColumns = Object.fromEntries(\n\t\tObject.entries(parsedColumns).map(([name, colBuilderBase]) => {\n\t\t\tconst colBuilder = colBuilderBase as SQLiteColumnBuilder;\n\t\t\tcolBuilder.setName(name);\n\t\t\tconst column = colBuilder.build(rawTable);\n\t\t\trawTable[InlineForeignKeys].push(...colBuilder.buildForeignKeys(column, rawTable));\n\t\t\treturn [name, column];\n\t\t}),\n\t) as unknown as BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\n\tconst table = Object.assign(rawTable, builtColumns);\n\n\ttable[Table.Symbol.Columns] = builtColumns;\n\ttable[Table.Symbol.ExtraConfigColumns] = builtColumns as unknown as BuildExtraConfigColumns<\n\t\tTTableName,\n\t\tTColumnsMap,\n\t\t'sqlite'\n\t>;\n\n\tif (extraConfig) {\n\t\ttable[SQLiteTable.Symbol.ExtraConfigBuilder] = extraConfig as (\n\t\t\tself: Record<string, SQLiteColumn>,\n\t\t) => SQLiteTableExtraConfig;\n\t}\n\n\treturn table as any;\n}\n\nexport const sqliteTable: SQLiteTableFn = (name, columns, extraConfig) => {\n\treturn sqliteTableBase(name, columns, extraConfig);\n};\n\nexport function sqliteTableCreator(customizeTableName: (name: string) => string): SQLiteTableFn {\n\treturn (name, columns, extraConfig) => {\n\t\treturn sqliteTableBase(customizeTableName(name) as typeof name, columns, extraConfig, undefined, name);\n\t};\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { AnySQLiteColumn, SQLiteColumn } from './columns/index.ts';\nimport { SQLiteTable } from './table.ts';\n\nexport function primaryKey<\n\tTTableName extends string,\n\tTColumn extends AnySQLiteColumn<{ tableName: TTableName }>,\n\tTColumns extends AnySQLiteColumn<{ tableName: TTableName }>[],\n>(config: { name?: string; columns: [TColumn, ...TColumns] }): PrimaryKeyBuilder;\n/**\n * @deprecated: Please use primaryKey({ columns: [] }) instead of this function\n * @param columns\n */\nexport function primaryKey<\n\tTTableName extends string,\n\tTColumns extends AnySQLiteColumn<{ tableName: TTableName }>[],\n>(...columns: TColumns): PrimaryKeyBuilder;\nexport function primaryKey(...config: any) {\n\tif (config[0].columns) {\n\t\treturn new PrimaryKeyBuilder(config[0].columns, config[0].name);\n\t}\n\treturn new PrimaryKeyBuilder(config);\n}\nexport class PrimaryKeyBuilder {\n\tstatic readonly [entityKind]: string = 'SQLitePrimaryKeyBuilder';\n\n\tdeclare _: {\n\t\tbrand: 'SQLitePrimaryKeyBuilder';\n\t};\n\n\t/** @internal */\n\tcolumns: SQLiteColumn[];\n\n\t/** @internal */\n\tname?: string;\n\n\tconstructor(\n\t\tcolumns: SQLiteColumn[],\n\t\tname?: string,\n\t) {\n\t\tthis.columns = columns;\n\t\tthis.name = name;\n\t}\n\n\t/** @internal */\n\tbuild(table: SQLiteTable): PrimaryKey {\n\t\treturn new PrimaryKey(table, this.columns, this.name);\n\t}\n}\n\nexport class PrimaryKey {\n\tstatic readonly [entityKind]: string = 'SQLitePrimaryKey';\n\n\treadonly columns: SQLiteColumn[];\n\treadonly name?: string;\n\treadonly isNameExplicit: boolean;\n\n\tconstructor(readonly table: SQLiteTable, columns: SQLiteColumn[], name?: string) {\n\t\tthis.columns = columns;\n\t\tthis.name = name;\n\t\tthis.isNameExplicit = !!name;\n\t}\n\n\tgetName(): string {\n\t\treturn this.name\n\t\t\t?? `${this.table[SQLiteTable.Symbol.Name]}_${this.columns.map((column) => column.name).join('_')}_pk`;\n\t}\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport type { SQLiteColumn } from './columns/index.ts';\nimport type { SQLiteTable } from './table.ts';\n\nexport interface IndexConfig {\n\tname: string;\n\tcolumns: IndexColumn[];\n\tunique: boolean;\n\twhere: SQL | undefined;\n}\n\nexport type IndexColumn = SQLiteColumn | SQL;\n\nexport class IndexBuilderOn {\n\tstatic readonly [entityKind]: string = 'SQLiteIndexBuilderOn';\n\n\tconstructor(private name: string, private unique: boolean) {}\n\n\ton(...columns: [IndexColumn, ...IndexColumn[]]): IndexBuilder {\n\t\treturn new IndexBuilder(this.name, columns, this.unique);\n\t}\n}\n\nexport class IndexBuilder {\n\tstatic readonly [entityKind]: string = 'SQLiteIndexBuilder';\n\n\tdeclare _: {\n\t\tbrand: 'SQLiteIndexBuilder';\n\t};\n\n\t/** @internal */\n\tconfig: IndexConfig;\n\n\tconstructor(name: string, columns: IndexColumn[], unique: boolean) {\n\t\tthis.config = {\n\t\t\tname,\n\t\t\tcolumns,\n\t\t\tunique,\n\t\t\twhere: undefined,\n\t\t};\n\t}\n\n\t/**\n\t * Condition for partial index.\n\t */\n\twhere(condition: SQL): this {\n\t\tthis.config.where = condition;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: SQLiteTable): Index {\n\t\treturn new Index(this.config, table);\n\t}\n}\n\nexport class Index {\n\tstatic readonly [entityKind]: string = 'SQLiteIndex';\n\n\tdeclare _: {\n\t\tbrand: 'SQLiteIndex';\n\t};\n\n\treadonly config: IndexConfig & { table: SQLiteTable };\n\treadonly isNameExplicit: boolean;\n\n\tconstructor(config: IndexConfig, table: SQLiteTable) {\n\t\tthis.config = { ...config, table };\n\t\tthis.isNameExplicit = !!config.name;\n\t}\n}\n\nexport function index(name: string): IndexBuilderOn {\n\treturn new IndexBuilderOn(name, false);\n}\n\nexport function uniqueIndex(name: string): IndexBuilderOn {\n\treturn new IndexBuilderOn(name, true);\n}\n", "import { is } from '~/entity.ts';\nimport { SQL } from '~/sql/sql.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { Check } from './checks.ts';\nimport { CheckBuilder } from './checks.ts';\nimport type { ForeignKey } from './foreign-keys.ts';\nimport { ForeignKeyBuilder } from './foreign-keys.ts';\nimport type { Index } from './indexes.ts';\nimport { IndexBuilder } from './indexes.ts';\nimport type { PrimaryKey } from './primary-keys.ts';\nimport { PrimaryKeyBuilder } from './primary-keys.ts';\nimport { SQLiteTable } from './table.ts';\nimport { type UniqueConstraint, UniqueConstraintBuilder } from './unique-constraint.ts';\nimport type { SQLiteViewBase } from './view-base.ts';\nimport type { SQLiteView } from './view.ts';\n\nexport function getTableConfig<TTable extends SQLiteTable>(table: TTable) {\n\tconst columns = Object.values(table[SQLiteTable.Symbol.Columns]);\n\tconst indexes: Index[] = [];\n\tconst checks: Check[] = [];\n\tconst primaryKeys: PrimaryKey[] = [];\n\tconst uniqueConstraints: UniqueConstraint[] = [];\n\tconst foreignKeys: ForeignKey[] = Object.values(table[SQLiteTable.Symbol.InlineForeignKeys]);\n\tconst name = table[Table.Symbol.Name];\n\n\tconst extraConfigBuilder = table[SQLiteTable.Symbol.ExtraConfigBuilder];\n\n\tif (extraConfigBuilder !== undefined) {\n\t\tconst extraConfig = extraConfigBuilder(table[SQLiteTable.Symbol.Columns]);\n\t\tconst extraValues = Array.isArray(extraConfig) ? extraConfig.flat(1) as any[] : Object.values(extraConfig);\n\t\tfor (const builder of Object.values(extraValues)) {\n\t\t\tif (is(builder, IndexBuilder)) {\n\t\t\t\tindexes.push(builder.build(table));\n\t\t\t} else if (is(builder, CheckBuilder)) {\n\t\t\t\tchecks.push(builder.build(table));\n\t\t\t} else if (is(builder, UniqueConstraintBuilder)) {\n\t\t\t\tuniqueConstraints.push(builder.build(table));\n\t\t\t} else if (is(builder, PrimaryKeyBuilder)) {\n\t\t\t\tprimaryKeys.push(builder.build(table));\n\t\t\t} else if (is(builder, ForeignKeyBuilder)) {\n\t\t\t\tforeignKeys.push(builder.build(table));\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tcolumns,\n\t\tindexes,\n\t\tforeignKeys,\n\t\tchecks,\n\t\tprimaryKeys,\n\t\tuniqueConstraints,\n\t\tname,\n\t};\n}\n\nexport function extractUsedTable(table: SQLiteTable | Subquery | SQLiteViewBase | SQL): string[] {\n\tif (is(table, SQLiteTable)) {\n\t\treturn [`${table[Table.Symbol.BaseName]}`];\n\t}\n\tif (is(table, Subquery)) {\n\t\treturn table._.usedTables ?? [];\n\t}\n\tif (is(table, SQL)) {\n\t\treturn table.usedTables ?? [];\n\t}\n\treturn [];\n}\n\nexport type OnConflict = 'rollback' | 'abort' | 'fail' | 'ignore' | 'replace';\n\nexport function getViewConfig<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n>(view: SQLiteView<TName, TExisting>) {\n\treturn {\n\t\t...view[ViewBaseConfig],\n\t\t// ...view[SQLiteViewConfig],\n\t};\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { SelectResultFields } from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { Placeholder, Query, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteDialect } from '~/sqlite-core/dialect.ts';\nimport type { SQLitePreparedQuery, SQLiteSession } from '~/sqlite-core/session.ts';\nimport { SQLiteTable } from '~/sqlite-core/table.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport { type DrizzleTypeError, orderSelectedFields, type ValueOrArray } from '~/utils.ts';\nimport type { SQLiteColumn } from '../columns/common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport type { SelectedFieldsFlat, SelectedFieldsOrdered } from './select.types.ts';\n\nexport type SQLiteDeleteWithout<\n\tT extends AnySQLiteDeleteBase,\n\tTDynamic extends boolean,\n\tK extends keyof T & string,\n> = TDynamic extends true ? T\n\t: Omit<\n\t\tSQLiteDeleteBase<\n\t\t\tT['_']['table'],\n\t\t\tT['_']['resultType'],\n\t\t\tT['_']['runResult'],\n\t\t\tT['_']['returning'],\n\t\t\tTDynamic,\n\t\t\tT['_']['excludedMethods'] | K\n\t\t>,\n\t\tT['_']['excludedMethods'] | K\n\t>;\n\nexport type SQLiteDelete<\n\tTTable extends SQLiteTable = SQLiteTable,\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = unknown,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n> = SQLiteDeleteBase<TTable, TResultType, TRunResult, TReturning, true, never>;\n\nexport interface SQLiteDeleteConfig {\n\twhere?: SQL | undefined;\n\tlimit?: number | Placeholder;\n\torderBy?: (SQLiteColumn | SQL | SQL.Aliased)[];\n\ttable: SQLiteTable;\n\treturning?: SelectedFieldsOrdered;\n\twithList?: Subquery[];\n}\n\nexport type SQLiteDeleteReturningAll<\n\tT extends AnySQLiteDeleteBase,\n\tTDynamic extends boolean,\n> = SQLiteDeleteWithout<\n\tSQLiteDeleteBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tT['_']['table']['$inferSelect'],\n\t\tT['_']['dynamic'],\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteDeleteReturning<\n\tT extends AnySQLiteDeleteBase,\n\tTDynamic extends boolean,\n\tTSelectedFields extends SelectedFieldsFlat,\n> = SQLiteDeleteWithout<\n\tSQLiteDeleteBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tSelectResultFields<TSelectedFields>,\n\t\tT['_']['dynamic'],\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteDeleteExecute<T extends AnySQLiteDeleteBase> = T['_']['returning'] extends undefined\n\t? T['_']['runResult']\n\t: T['_']['returning'][];\n\nexport type SQLiteDeletePrepare<T extends AnySQLiteDeleteBase> = SQLitePreparedQuery<{\n\ttype: T['_']['resultType'];\n\trun: T['_']['runResult'];\n\tall: T['_']['returning'] extends undefined ? DrizzleTypeError<'.all() cannot be used without .returning()'>\n\t\t: T['_']['returning'][];\n\tget: T['_']['returning'] extends undefined ? DrizzleTypeError<'.get() cannot be used without .returning()'>\n\t\t: T['_']['returning'] | undefined;\n\tvalues: T['_']['returning'] extends undefined ? DrizzleTypeError<'.values() cannot be used without .returning()'>\n\t\t: any[][];\n\texecute: SQLiteDeleteExecute<T>;\n}>;\n\nexport type SQLiteDeleteDynamic<T extends AnySQLiteDeleteBase> = SQLiteDelete<\n\tT['_']['table'],\n\tT['_']['resultType'],\n\tT['_']['runResult'],\n\tT['_']['returning']\n>;\n\nexport type AnySQLiteDeleteBase = SQLiteDeleteBase<any, any, any, any, any, any>;\n\nexport interface SQLiteDeleteBase<\n\tTTable extends SQLiteTable,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends\n\tQueryPromise<TReturning extends undefined ? TRunResult : TReturning[]>,\n\tRunnableQuery<TReturning extends undefined ? TRunResult : TReturning[], 'sqlite'>,\n\tSQLWrapper\n{\n\treadonly _: {\n\t\tdialect: 'sqlite';\n\t\treadonly table: TTable;\n\t\treadonly resultType: TResultType;\n\t\treadonly runResult: TRunResult;\n\t\treadonly returning: TReturning;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TReturning extends undefined ? TRunResult : TReturning[];\n\t};\n}\n\nexport class SQLiteDeleteBase<\n\tTTable extends SQLiteTable,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<TReturning extends undefined ? TRunResult : TReturning[]>\n\timplements RunnableQuery<TReturning extends undefined ? TRunResult : TReturning[], 'sqlite'>, SQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteDelete';\n\n\t/** @internal */\n\tconfig: SQLiteDeleteConfig;\n\n\tconstructor(\n\t\tprivate table: TTable,\n\t\tprivate session: SQLiteSession<any, any, any, any, any>,\n\t\tprivate dialect: SQLiteDialect,\n\t\twithList?: Subquery[],\n\t) {\n\t\tsuper();\n\t\tthis.config = { table, withList };\n\t}\n\n\t/**\n\t * Adds a `where` clause to the query.\n\t *\n\t * Calling this method will delete only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t *\n\t * @param where the `where` clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be deleted.\n\t *\n\t * ```ts\n\t * // Delete all cars with green color\n\t * db.delete(cars).where(eq(cars.color, 'green'));\n\t * // or\n\t * db.delete(cars).where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Delete all BMW cars with a green color\n\t * db.delete(cars).where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Delete all cars with the green or blue color\n\t * db.delete(cars).where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(where: SQL | undefined): SQLiteDeleteWithout<this, TDynamic, 'where'> {\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\torderBy(\n\t\tbuilder: (deleteTable: TTable) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>,\n\t): SQLiteDeleteWithout<this, TDynamic, 'orderBy'>;\n\torderBy(...columns: (SQLiteColumn | SQL | SQL.Aliased)[]): SQLiteDeleteWithout<this, TDynamic, 'orderBy'>;\n\torderBy(\n\t\t...columns:\n\t\t\t| [(deleteTable: TTable) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>]\n\t\t\t| (SQLiteColumn | SQL | SQL.Aliased)[]\n\t): SQLiteDeleteWithout<this, TDynamic, 'orderBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst orderBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.table[Table.Symbol.Columns],\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as any,\n\t\t\t);\n\n\t\t\tconst orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t} else {\n\t\t\tconst orderByArray = columns as (SQLiteColumn | SQL | SQL.Aliased)[];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\tlimit(limit: number | Placeholder): SQLiteDeleteWithout<this, TDynamic, 'limit'> {\n\t\tthis.config.limit = limit;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `returning` clause to the query.\n\t *\n\t * Calling this method will return the specified fields of the deleted rows. If no fields are specified, all fields will be returned.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete#delete-with-return}\n\t *\n\t * @example\n\t * ```ts\n\t * // Delete all cars with the green color and return all fields\n\t * const deletedCars: Car[] = await db.delete(cars)\n\t * .where(eq(cars.color, 'green'))\n\t * .returning();\n\t *\n\t * // Delete all cars with the green color and return only their id and brand fields\n\t * const deletedCarsIdsAndBrands: { id: number, brand: string }[] = await db.delete(cars)\n\t * .where(eq(cars.color, 'green'))\n\t * .returning({ id: cars.id, brand: cars.brand });\n\t * ```\n\t */\n\treturning(): SQLiteDeleteReturningAll<this, TDynamic>;\n\treturning<TSelectedFields extends SelectedFieldsFlat>(\n\t\tfields: TSelectedFields,\n\t): SQLiteDeleteReturning<this, TDynamic, TSelectedFields>;\n\treturning(\n\t\tfields: SelectedFieldsFlat = this.table[SQLiteTable.Symbol.Columns],\n\t): SQLiteDeleteReturning<this, TDynamic, any> | SQLiteDeleteReturningAll<this, TDynamic> {\n\t\tthis.config.returning = orderSelectedFields<SQLiteColumn>(fields);\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildDeleteQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\t/** @internal */\n\t_prepare(isOneTimeQuery = true): SQLiteDeletePrepare<this> {\n\t\treturn this.session[isOneTimeQuery ? 'prepareOneTimeQuery' : 'prepareQuery'](\n\t\t\tthis.dialect.sqlToQuery(this.getSQL()),\n\t\t\tthis.config.returning,\n\t\t\tthis.config.returning ? 'all' : 'run',\n\t\t\ttrue,\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\ttype: 'delete',\n\t\t\t\ttables: extractUsedTable(this.config.table),\n\t\t\t},\n\t\t) as SQLiteDeletePrepare<this>;\n\t}\n\n\tprepare(): SQLiteDeletePrepare<this> {\n\t\treturn this._prepare(false);\n\t}\n\n\trun: ReturnType<this['prepare']>['run'] = (placeholderValues) => {\n\t\treturn this._prepare().run(placeholderValues);\n\t};\n\n\tall: ReturnType<this['prepare']>['all'] = (placeholderValues) => {\n\t\treturn this._prepare().all(placeholderValues);\n\t};\n\n\tget: ReturnType<this['prepare']>['get'] = (placeholderValues) => {\n\t\treturn this._prepare().get(placeholderValues);\n\t};\n\n\tvalues: ReturnType<this['prepare']>['values'] = (placeholderValues) => {\n\t\treturn this._prepare().values(placeholderValues);\n\t};\n\n\toverride async execute(placeholderValues?: Record<string, unknown>): Promise<SQLiteDeleteExecute<this>> {\n\t\treturn this._prepare().execute(placeholderValues) as SQLiteDeleteExecute<this>;\n\t}\n\n\t$dynamic(): SQLiteDeleteDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { ColumnsSelection } from '~/sql/sql.ts';\nimport { View } from '~/sql/sql.ts';\n\nexport abstract class SQLiteViewBase<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelection extends ColumnsSelection = ColumnsSelection,\n> extends View<TName, TExisting, TSelection> {\n\tstatic override readonly [entityKind]: string = 'SQLiteViewBase';\n\n\tdeclare _: View<TName, TExisting, TSelection>['_'] & {\n\t\tviewBrand: 'SQLiteView';\n\t};\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { SQL, SQLWrapper } from '~/sql/index.ts';\n\nexport abstract class TypedQueryBuilder<TSelection, TResult = unknown, TConfig = unknown> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'TypedQueryBuilder';\n\n\tdeclare _: {\n\t\tselectedFields: TSelection;\n\t\tresult: TResult;\n\t\tconfig?: TConfig;\n\t};\n\n\t/** @internal */\n\tgetSelectedFields(): TSelection {\n\t\treturn this._.selectedFields;\n\t}\n\n\tabstract getSQL(): SQL;\n}\n", "import type { CacheConfig, WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type {\n\tBuildSubquerySelection,\n\tGetSelectTableName,\n\tGetSelectTableSelection,\n\tJoinNullability,\n\tJoinType,\n\tSelectMode,\n\tSelectResult,\n\tSetOperator,\n} from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport { SQL, View } from '~/sql/sql.ts';\nimport type { ColumnsSelection, Placeholder, Query, SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteColumn } from '~/sqlite-core/columns/index.ts';\nimport type { SQLiteDialect } from '~/sqlite-core/dialect.ts';\nimport type { SQLiteSession } from '~/sqlite-core/session.ts';\nimport type { SubqueryWithSelection } from '~/sqlite-core/subquery.ts';\nimport type { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport {\n\tapplyMixins,\n\tgetTableColumns,\n\tgetTableLikeName,\n\thaveSameKeys,\n\torderSelectedFields,\n\ttype ValueOrArray,\n} from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport { SQLiteViewBase } from '../view-base.ts';\nimport type {\n\tAnySQLiteSelect,\n\tCreateSQLiteSelectFromBuilderMode,\n\tGetSQLiteSetOperators,\n\tSelectedFields,\n\tSetOperatorRightSelect,\n\tSQLiteCreateSetOperatorFn,\n\tSQLiteSelectConfig,\n\tSQLiteSelectCrossJoinFn,\n\tSQLiteSelectDynamic,\n\tSQLiteSelectExecute,\n\tSQLiteSelectHKT,\n\tSQLiteSelectHKTBase,\n\tSQLiteSelectJoinFn,\n\tSQLiteSelectPrepare,\n\tSQLiteSelectWithout,\n\tSQLiteSetOperatorExcludedMethods,\n\tSQLiteSetOperatorWithResult,\n} from './select.types.ts';\n\nexport class SQLiteSelectBuilder<\n\tTSelection extends SelectedFields | undefined,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTBuilderMode extends 'db' | 'qb' = 'db',\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteSelectBuilder';\n\n\tprivate fields: TSelection;\n\tprivate session: SQLiteSession<any, any, any, any, any> | undefined;\n\tprivate dialect: SQLiteDialect;\n\tprivate withList: Subquery[] | undefined;\n\tprivate distinct: boolean | undefined;\n\n\tconstructor(\n\t\tconfig: {\n\t\t\tfields: TSelection;\n\t\t\tsession: SQLiteSession<any, any, any, any, any> | undefined;\n\t\t\tdialect: SQLiteDialect;\n\t\t\twithList?: Subquery[];\n\t\t\tdistinct?: boolean;\n\t\t},\n\t) {\n\t\tthis.fields = config.fields;\n\t\tthis.session = config.session;\n\t\tthis.dialect = config.dialect;\n\t\tthis.withList = config.withList;\n\t\tthis.distinct = config.distinct;\n\t}\n\n\tfrom<TFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL>(\n\t\tsource: TFrom,\n\t): CreateSQLiteSelectFromBuilderMode<\n\t\tTBuilderMode,\n\t\tGetSelectTableName<TFrom>,\n\t\tTResultType,\n\t\tTRunResult,\n\t\tTSelection extends undefined ? GetSelectTableSelection<TFrom> : TSelection,\n\t\tTSelection extends undefined ? 'single' : 'partial'\n\t> {\n\t\tconst isPartialSelect = !!this.fields;\n\n\t\tlet fields: SelectedFields;\n\t\tif (this.fields) {\n\t\t\tfields = this.fields;\n\t\t} else if (is(source, Subquery)) {\n\t\t\t// This is required to use the proxy handler to get the correct field values from the subquery\n\t\t\tfields = Object.fromEntries(\n\t\t\t\tObject.keys(source._.selectedFields).map((\n\t\t\t\t\tkey,\n\t\t\t\t) => [key, source[key as unknown as keyof typeof source] as unknown as SelectedFields[string]]),\n\t\t\t);\n\t\t} else if (is(source, SQLiteViewBase)) {\n\t\t\tfields = source[ViewBaseConfig].selectedFields as SelectedFields;\n\t\t} else if (is(source, SQL)) {\n\t\t\tfields = {};\n\t\t} else {\n\t\t\tfields = getTableColumns<SQLiteTable>(source);\n\t\t}\n\n\t\treturn new SQLiteSelectBase({\n\t\t\ttable: source,\n\t\t\tfields,\n\t\t\tisPartialSelect,\n\t\t\tsession: this.session,\n\t\t\tdialect: this.dialect,\n\t\t\twithList: this.withList,\n\t\t\tdistinct: this.distinct,\n\t\t}) as any;\n\t}\n}\n\nexport abstract class SQLiteSelectQueryBuilderBase<\n\tTHKT extends SQLiteSelectHKTBase,\n\tTTableName extends string | undefined,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends TypedQueryBuilder<TSelectedFields, TResult> {\n\tstatic override readonly [entityKind]: string = 'SQLiteSelectQueryBuilder';\n\n\toverride readonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly hkt: THKT;\n\t\treadonly tableName: TTableName;\n\t\treadonly resultType: TResultType;\n\t\treadonly runResult: TRunResult;\n\t\treadonly selection: TSelection;\n\t\treadonly selectMode: TSelectMode;\n\t\treadonly nullabilityMap: TNullabilityMap;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TResult;\n\t\treadonly selectedFields: TSelectedFields;\n\t\treadonly config: SQLiteSelectConfig;\n\t};\n\n\t/** @internal */\n\tconfig: SQLiteSelectConfig;\n\tprotected joinsNotNullableMap: Record<string, boolean>;\n\tprivate tableName: string | undefined;\n\tprivate isPartialSelect: boolean;\n\tprotected session: SQLiteSession<any, any, any, any, any> | undefined;\n\tprotected dialect: SQLiteDialect;\n\tprotected cacheConfig?: WithCacheConfig = undefined;\n\tprotected usedTables: Set<string> = new Set();\n\n\tconstructor(\n\t\t{ table, fields, isPartialSelect, session, dialect, withList, distinct }: {\n\t\t\ttable: SQLiteSelectConfig['table'];\n\t\t\tfields: SQLiteSelectConfig['fields'];\n\t\t\tisPartialSelect: boolean;\n\t\t\tsession: SQLiteSession<any, any, any, any, any> | undefined;\n\t\t\tdialect: SQLiteDialect;\n\t\t\twithList: Subquery[] | undefined;\n\t\t\tdistinct: boolean | undefined;\n\t\t},\n\t) {\n\t\tsuper();\n\t\tthis.config = {\n\t\t\twithList,\n\t\t\ttable,\n\t\t\tfields: { ...fields },\n\t\t\tdistinct,\n\t\t\tsetOperators: [],\n\t\t};\n\t\tthis.isPartialSelect = isPartialSelect;\n\t\tthis.session = session;\n\t\tthis.dialect = dialect;\n\t\tthis._ = {\n\t\t\tselectedFields: fields as TSelectedFields,\n\t\t\tconfig: this.config,\n\t\t} as this['_'];\n\t\tthis.tableName = getTableLikeName(table);\n\t\tthis.joinsNotNullableMap = typeof this.tableName === 'string' ? { [this.tableName]: true } : {};\n\t\tfor (const item of extractUsedTable(table)) this.usedTables.add(item);\n\t}\n\n\t/** @internal */\n\tgetUsedTables() {\n\t\treturn [...this.usedTables];\n\t}\n\n\tprivate createJoin<TJoinType extends JoinType>(\n\t\tjoinType: TJoinType,\n\t): 'cross' extends TJoinType ? SQLiteSelectCrossJoinFn<this, TDynamic>\n\t\t: SQLiteSelectJoinFn<this, TDynamic, TJoinType>\n\t{\n\t\treturn (\n\t\t\ttable: SQLiteTable | Subquery | SQLiteViewBase | SQL,\n\t\t\ton?: ((aliases: TSelection) => SQL | undefined) | SQL | undefined,\n\t\t) => {\n\t\t\tconst baseTableName = this.tableName;\n\t\t\tconst tableName = getTableLikeName(table);\n\n\t\t\t// store all tables used in a query\n\t\t\tfor (const item of extractUsedTable(table)) this.usedTables.add(item);\n\n\t\t\tif (typeof tableName === 'string' && this.config.joins?.some((join) => join.alias === tableName)) {\n\t\t\t\tthrow new Error(`Alias \"${tableName}\" is already used in this query`);\n\t\t\t}\n\n\t\t\tif (!this.isPartialSelect) {\n\t\t\t\t// If this is the first join and this is not a partial select and we're not selecting from raw SQL, \"move\" the fields from the main table to the nested object\n\t\t\t\tif (Object.keys(this.joinsNotNullableMap).length === 1 && typeof baseTableName === 'string') {\n\t\t\t\t\tthis.config.fields = {\n\t\t\t\t\t\t[baseTableName]: this.config.fields,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (typeof tableName === 'string' && !is(table, SQL)) {\n\t\t\t\t\tconst selection = is(table, Subquery)\n\t\t\t\t\t\t? table._.selectedFields\n\t\t\t\t\t\t: is(table, View)\n\t\t\t\t\t\t? table[ViewBaseConfig].selectedFields\n\t\t\t\t\t\t: table[Table.Symbol.Columns];\n\t\t\t\t\tthis.config.fields[tableName] = selection;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (typeof on === 'function') {\n\t\t\t\ton = on(\n\t\t\t\t\tnew Proxy(\n\t\t\t\t\t\tthis.config.fields,\n\t\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t\t) as TSelection,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (!this.config.joins) {\n\t\t\t\tthis.config.joins = [];\n\t\t\t}\n\t\t\tthis.config.joins.push({ on, table, joinType, alias: tableName });\n\n\t\t\tif (typeof tableName === 'string') {\n\t\t\t\tswitch (joinType) {\n\t\t\t\t\tcase 'left': {\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'right': {\n\t\t\t\t\t\tthis.joinsNotNullableMap = Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(this.joinsNotNullableMap).map(([key]) => [key, false]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'cross':\n\t\t\t\t\tcase 'inner': {\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'full': {\n\t\t\t\t\t\tthis.joinsNotNullableMap = Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(this.joinsNotNullableMap).map(([key]) => [key, false]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this as any;\n\t\t};\n\t}\n\n\t/**\n\t * Executes a `left join` operation by adding another table to the current query.\n\t *\n\t * Calling this method associates each row of the table with the corresponding row from the joined table, if a match is found. If no matching row exists, it sets all columns of the joined table to null.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#left-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User; pets: Pet | null; }[] = await db.select()\n\t * .from(users)\n\t * .leftJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number; petId: number | null; }[] = await db.select({\n\t * userId: users.id,\n\t * petId: pets.id,\n\t * })\n\t * .from(users)\n\t * .leftJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\tleftJoin = this.createJoin('left');\n\n\t/**\n\t * Executes a `right join` operation by adding another table to the current query.\n\t *\n\t * Calling this method associates each row of the joined table with the corresponding row from the main table, if a match is found. If no matching row exists, it sets all columns of the main table to null.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#right-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User | null; pets: Pet; }[] = await db.select()\n\t * .from(users)\n\t * .rightJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number | null; petId: number; }[] = await db.select({\n\t * userId: users.id,\n\t * petId: pets.id,\n\t * })\n\t * .from(users)\n\t * .rightJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\trightJoin = this.createJoin('right');\n\n\t/**\n\t * Executes an `inner join` operation, creating a new table by combining rows from two tables that have matching values.\n\t *\n\t * Calling this method retrieves rows that have corresponding entries in both joined tables. Rows without matching entries in either table are excluded, resulting in a table that includes only matching pairs.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#inner-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User; pets: Pet; }[] = await db.select()\n\t * .from(users)\n\t * .innerJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number; petId: number; }[] = await db.select({\n\t * userId: users.id,\n\t * petId: pets.id,\n\t * })\n\t * .from(users)\n\t * .innerJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\tinnerJoin = this.createJoin('inner');\n\n\t/**\n\t * Executes a `full join` operation by combining rows from two tables into a new table.\n\t *\n\t * Calling this method retrieves all rows from both main and joined tables, merging rows with matching values and filling in `null` for non-matching columns.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#full-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User | null; pets: Pet | null; }[] = await db.select()\n\t * .from(users)\n\t * .fullJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number | null; petId: number | null; }[] = await db.select({\n\t * userId: users.id,\n\t * petId: pets.id,\n\t * })\n\t * .from(users)\n\t * .fullJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\tfullJoin = this.createJoin('full');\n\n\t/**\n\t * Executes a `cross join` operation by combining rows from two tables into a new table.\n\t *\n\t * Calling this method retrieves all rows from both main and joined tables, merging all rows from each table.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#cross-join}\n\t *\n\t * @param table the table to join.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users, each user with every pet\n\t * const usersWithPets: { user: User; pets: Pet; }[] = await db.select()\n\t * .from(users)\n\t * .crossJoin(pets)\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number; petId: number; }[] = await db.select({\n\t * userId: users.id,\n\t * petId: pets.id,\n\t * })\n\t * .from(users)\n\t * .crossJoin(pets)\n\t * ```\n\t */\n\tcrossJoin = this.createJoin('cross');\n\n\tprivate createSetOperator(\n\t\ttype: SetOperator,\n\t\tisAll: boolean,\n\t): <TValue extends SQLiteSetOperatorWithResult<TResult>>(\n\t\trightSelection:\n\t\t\t| ((setOperators: GetSQLiteSetOperators) => SetOperatorRightSelect<TValue, TResult>)\n\t\t\t| SetOperatorRightSelect<TValue, TResult>,\n\t) => SQLiteSelectWithout<\n\t\tthis,\n\t\tTDynamic,\n\t\tSQLiteSetOperatorExcludedMethods,\n\t\ttrue\n\t> {\n\t\treturn (rightSelection) => {\n\t\t\tconst rightSelect = (typeof rightSelection === 'function'\n\t\t\t\t? rightSelection(getSQLiteSetOperators())\n\t\t\t\t: rightSelection) as TypedQueryBuilder<\n\t\t\t\t\tany,\n\t\t\t\t\tTResult\n\t\t\t\t>;\n\n\t\t\tif (!haveSameKeys(this.getSelectedFields(), rightSelect.getSelectedFields())) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Set operator error (union / intersect / except): selected fields are not the same or are in a different order',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.config.setOperators.push({ type, isAll, rightSelect });\n\t\t\treturn this as any;\n\t\t};\n\t}\n\n\t/**\n\t * Adds `union` set operator to the query.\n\t *\n\t * Calling this method will combine the result sets of the `select` statements and remove any duplicate rows that appear across them.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#union}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all unique names from customers and users tables\n\t * await db.select({ name: users.name })\n\t * .from(users)\n\t * .union(\n\t * db.select({ name: customers.name }).from(customers)\n\t * );\n\t * // or\n\t * import { union } from 'drizzle-orm/sqlite-core'\n\t *\n\t * await union(\n\t * db.select({ name: users.name }).from(users),\n\t * db.select({ name: customers.name }).from(customers)\n\t * );\n\t * ```\n\t */\n\tunion = this.createSetOperator('union', false);\n\n\t/**\n\t * Adds `union all` set operator to the query.\n\t *\n\t * Calling this method will combine the result-set of the `select` statements and keep all duplicate rows that appear across them.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#union-all}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all transaction ids from both online and in-store sales\n\t * await db.select({ transaction: onlineSales.transactionId })\n\t * .from(onlineSales)\n\t * .unionAll(\n\t * db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n\t * );\n\t * // or\n\t * import { unionAll } from 'drizzle-orm/sqlite-core'\n\t *\n\t * await unionAll(\n\t * db.select({ transaction: onlineSales.transactionId }).from(onlineSales),\n\t * db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n\t * );\n\t * ```\n\t */\n\tunionAll = this.createSetOperator('union', true);\n\n\t/**\n\t * Adds `intersect` set operator to the query.\n\t *\n\t * Calling this method will retain only the rows that are present in both result sets and eliminate duplicates.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select course names that are offered in both departments A and B\n\t * await db.select({ courseName: depA.courseName })\n\t * .from(depA)\n\t * .intersect(\n\t * db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * // or\n\t * import { intersect } from 'drizzle-orm/sqlite-core'\n\t *\n\t * await intersect(\n\t * db.select({ courseName: depA.courseName }).from(depA),\n\t * db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * ```\n\t */\n\tintersect = this.createSetOperator('intersect', false);\n\n\t/**\n\t * Adds `except` set operator to the query.\n\t *\n\t * Calling this method will retrieve all unique rows from the left query, except for the rows that are present in the result set of the right query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#except}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all courses offered in department A but not in department B\n\t * await db.select({ courseName: depA.courseName })\n\t * .from(depA)\n\t * .except(\n\t * db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * // or\n\t * import { except } from 'drizzle-orm/sqlite-core'\n\t *\n\t * await except(\n\t * db.select({ courseName: depA.courseName }).from(depA),\n\t * db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * ```\n\t */\n\texcept = this.createSetOperator('except', false);\n\n\t/** @internal */\n\taddSetOperators(setOperators: SQLiteSelectConfig['setOperators']): SQLiteSelectWithout<\n\t\tthis,\n\t\tTDynamic,\n\t\tSQLiteSetOperatorExcludedMethods,\n\t\ttrue\n\t> {\n\t\tthis.config.setOperators.push(...setOperators);\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `where` clause to the query.\n\t *\n\t * Calling this method will select only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#filtering}\n\t *\n\t * @param where the `where` clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be selected.\n\t *\n\t * ```ts\n\t * // Select all cars with green color\n\t * await db.select().from(cars).where(eq(cars.color, 'green'));\n\t * // or\n\t * await db.select().from(cars).where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Select all BMW cars with a green color\n\t * await db.select().from(cars).where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Select all cars with the green or blue color\n\t * await db.select().from(cars).where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(\n\t\twhere: ((aliases: TSelection) => SQL | undefined) | SQL | undefined,\n\t): SQLiteSelectWithout<this, TDynamic, 'where'> {\n\t\tif (typeof where === 'function') {\n\t\t\twhere = where(\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t}\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `having` clause to the query.\n\t *\n\t * Calling this method will select only those rows that fulfill a specified condition. It is typically used with aggregate functions to filter the aggregated data based on a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#aggregations}\n\t *\n\t * @param having the `having` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all brands with more than one car\n\t * await db.select({\n\t * \tbrand: cars.brand,\n\t * \tcount: sql<number>`cast(count(${cars.id}) as int)`,\n\t * })\n\t * .from(cars)\n\t * .groupBy(cars.brand)\n\t * .having(({ count }) => gt(count, 1));\n\t * ```\n\t */\n\thaving(\n\t\thaving: ((aliases: this['_']['selection']) => SQL | undefined) | SQL | undefined,\n\t): SQLiteSelectWithout<this, TDynamic, 'having'> {\n\t\tif (typeof having === 'function') {\n\t\t\thaving = having(\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t}\n\t\tthis.config.having = having;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `group by` clause to the query.\n\t *\n\t * Calling this method will group rows that have the same values into summary rows, often used for aggregation purposes.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#aggregations}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Group and count people by their last names\n\t * await db.select({\n\t * lastName: people.lastName,\n\t * count: sql<number>`cast(count(*) as int)`\n\t * })\n\t * .from(people)\n\t * .groupBy(people.lastName);\n\t * ```\n\t */\n\tgroupBy(\n\t\tbuilder: (aliases: this['_']['selection']) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>,\n\t): SQLiteSelectWithout<this, TDynamic, 'groupBy'>;\n\tgroupBy(...columns: (SQLiteColumn | SQL | SQL.Aliased)[]): SQLiteSelectWithout<this, TDynamic, 'groupBy'>;\n\tgroupBy(\n\t\t...columns:\n\t\t\t| [(aliases: this['_']['selection']) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>]\n\t\t\t| (SQLiteColumn | SQL | SQL.Aliased)[]\n\t): SQLiteSelectWithout<this, TDynamic, 'groupBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst groupBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t\tthis.config.groupBy = Array.isArray(groupBy) ? groupBy : [groupBy];\n\t\t} else {\n\t\t\tthis.config.groupBy = columns as (SQLiteColumn | SQL | SQL.Aliased)[];\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `order by` clause to the query.\n\t *\n\t * Calling this method will sort the result-set in ascending or descending order. By default, the sort order is ascending.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#order-by}\n\t *\n\t * @example\n\t *\n\t * ```\n\t * // Select cars ordered by year\n\t * await db.select().from(cars).orderBy(cars.year);\n\t * ```\n\t *\n\t * You can specify whether results are in ascending or descending order with the `asc()` and `desc()` operators.\n\t *\n\t * ```ts\n\t * // Select cars ordered by year in descending order\n\t * await db.select().from(cars).orderBy(desc(cars.year));\n\t *\n\t * // Select cars ordered by year and price\n\t * await db.select().from(cars).orderBy(asc(cars.year), desc(cars.price));\n\t * ```\n\t */\n\torderBy(\n\t\tbuilder: (aliases: this['_']['selection']) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>,\n\t): SQLiteSelectWithout<this, TDynamic, 'orderBy'>;\n\torderBy(...columns: (SQLiteColumn | SQL | SQL.Aliased)[]): SQLiteSelectWithout<this, TDynamic, 'orderBy'>;\n\torderBy(\n\t\t...columns:\n\t\t\t| [(aliases: this['_']['selection']) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>]\n\t\t\t| (SQLiteColumn | SQL | SQL.Aliased)[]\n\t): SQLiteSelectWithout<this, TDynamic, 'orderBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst orderBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\n\t\t\tconst orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];\n\n\t\t\tif (this.config.setOperators.length > 0) {\n\t\t\t\tthis.config.setOperators.at(-1)!.orderBy = orderByArray;\n\t\t\t} else {\n\t\t\t\tthis.config.orderBy = orderByArray;\n\t\t\t}\n\t\t} else {\n\t\t\tconst orderByArray = columns as (SQLiteColumn | SQL | SQL.Aliased)[];\n\n\t\t\tif (this.config.setOperators.length > 0) {\n\t\t\t\tthis.config.setOperators.at(-1)!.orderBy = orderByArray;\n\t\t\t} else {\n\t\t\t\tthis.config.orderBy = orderByArray;\n\t\t\t}\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `limit` clause to the query.\n\t *\n\t * Calling this method will set the maximum number of rows that will be returned by this query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#limit--offset}\n\t *\n\t * @param limit the `limit` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Get the first 10 people from this query.\n\t * await db.select().from(people).limit(10);\n\t * ```\n\t */\n\tlimit(limit: number | Placeholder): SQLiteSelectWithout<this, TDynamic, 'limit'> {\n\t\tif (this.config.setOperators.length > 0) {\n\t\t\tthis.config.setOperators.at(-1)!.limit = limit;\n\t\t} else {\n\t\t\tthis.config.limit = limit;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `offset` clause to the query.\n\t *\n\t * Calling this method will skip a number of rows when returning results from this query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#limit--offset}\n\t *\n\t * @param offset the `offset` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Get the 10th-20th people from this query.\n\t * await db.select().from(people).offset(10).limit(10);\n\t * ```\n\t */\n\toffset(offset: number | Placeholder): SQLiteSelectWithout<this, TDynamic, 'offset'> {\n\t\tif (this.config.setOperators.length > 0) {\n\t\t\tthis.config.setOperators.at(-1)!.offset = offset;\n\t\t} else {\n\t\t\tthis.config.offset = offset;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildSelectQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\tas<TAlias extends string>(\n\t\talias: TAlias,\n\t): SubqueryWithSelection<this['_']['selectedFields'], TAlias> {\n\t\tconst usedTables: string[] = [];\n\t\tusedTables.push(...extractUsedTable(this.config.table));\n\t\tif (this.config.joins) { for (const it of this.config.joins) usedTables.push(...extractUsedTable(it.table)); }\n\n\t\treturn new Proxy(\n\t\t\tnew Subquery(this.getSQL(), this.config.fields, alias, false, [...new Set(usedTables)]),\n\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t) as SubqueryWithSelection<this['_']['selectedFields'], TAlias>;\n\t}\n\n\t/** @internal */\n\toverride getSelectedFields(): this['_']['selectedFields'] {\n\t\treturn new Proxy(\n\t\t\tthis.config.fields,\n\t\t\tnew SelectionProxyHandler({ alias: this.tableName, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t) as this['_']['selectedFields'];\n\t}\n\n\t$dynamic(): SQLiteSelectDynamic<this> {\n\t\treturn this;\n\t}\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface SQLiteSelectBase<\n\tTTableName extends string | undefined,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode = 'single',\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends\n\tSQLiteSelectQueryBuilderBase<\n\t\tSQLiteSelectHKT,\n\t\tTTableName,\n\t\tTResultType,\n\t\tTRunResult,\n\t\tTSelection,\n\t\tTSelectMode,\n\t\tTNullabilityMap,\n\t\tTDynamic,\n\t\tTExcludedMethods,\n\t\tTResult,\n\t\tTSelectedFields\n\t>,\n\tQueryPromise<TResult>\n{}\n\nexport class SQLiteSelectBase<\n\tTTableName extends string | undefined,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTSelection,\n\tTSelectMode extends SelectMode = 'single',\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends SQLiteSelectQueryBuilderBase<\n\tSQLiteSelectHKT,\n\tTTableName,\n\tTResultType,\n\tTRunResult,\n\tTSelection,\n\tTSelectMode,\n\tTNullabilityMap,\n\tTDynamic,\n\tTExcludedMethods,\n\tTResult,\n\tTSelectedFields\n> implements RunnableQuery<TResult, 'sqlite'>, SQLWrapper {\n\tstatic override readonly [entityKind]: string = 'SQLiteSelect';\n\n\t/** @internal */\n\t_prepare(isOneTimeQuery = true): SQLiteSelectPrepare<this> {\n\t\tif (!this.session) {\n\t\t\tthrow new Error('Cannot execute a query on a query builder. Please use a database instance instead.');\n\t\t}\n\t\tconst fieldsList = orderSelectedFields<SQLiteColumn>(this.config.fields);\n\t\tconst query = this.session[isOneTimeQuery ? 'prepareOneTimeQuery' : 'prepareQuery'](\n\t\t\tthis.dialect.sqlToQuery(this.getSQL()),\n\t\t\tfieldsList,\n\t\t\t'all',\n\t\t\ttrue,\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\ttype: 'select',\n\t\t\t\ttables: [...this.usedTables],\n\t\t\t},\n\t\t\tthis.cacheConfig,\n\t\t);\n\t\tquery.joinsNotNullableMap = this.joinsNotNullableMap;\n\t\treturn query as ReturnType<this['prepare']>;\n\t}\n\n\t$withCache(config?: { config?: CacheConfig; tag?: string; autoInvalidate?: boolean } | false) {\n\t\tthis.cacheConfig = config === undefined\n\t\t\t? { config: {}, enabled: true, autoInvalidate: true }\n\t\t\t: config === false\n\t\t\t? { enabled: false }\n\t\t\t: { enabled: true, autoInvalidate: true, ...config };\n\t\treturn this;\n\t}\n\n\tprepare(): SQLiteSelectPrepare<this> {\n\t\treturn this._prepare(false);\n\t}\n\n\trun: ReturnType<this['prepare']>['run'] = (placeholderValues) => {\n\t\treturn this._prepare().run(placeholderValues);\n\t};\n\n\tall: ReturnType<this['prepare']>['all'] = (placeholderValues) => {\n\t\treturn this._prepare().all(placeholderValues);\n\t};\n\n\tget: ReturnType<this['prepare']>['get'] = (placeholderValues) => {\n\t\treturn this._prepare().get(placeholderValues);\n\t};\n\n\tvalues: ReturnType<this['prepare']>['values'] = (placeholderValues) => {\n\t\treturn this._prepare().values(placeholderValues);\n\t};\n\n\tasync execute(): Promise<SQLiteSelectExecute<this>> {\n\t\treturn this.all() as SQLiteSelectExecute<this>;\n\t}\n}\n\napplyMixins(SQLiteSelectBase, [QueryPromise]);\n\nfunction createSetOperator(type: SetOperator, isAll: boolean): SQLiteCreateSetOperatorFn {\n\treturn (leftSelect, rightSelect, ...restSelects) => {\n\t\tconst setOperators = [rightSelect, ...restSelects].map((select) => ({\n\t\t\ttype,\n\t\t\tisAll,\n\t\t\trightSelect: select as AnySQLiteSelect,\n\t\t}));\n\n\t\tfor (const setOperator of setOperators) {\n\t\t\tif (!haveSameKeys((leftSelect as any).getSelectedFields(), setOperator.rightSelect.getSelectedFields())) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Set operator error (union / intersect / except): selected fields are not the same or are in a different order',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn (leftSelect as AnySQLiteSelect).addSetOperators(setOperators) as any;\n\t};\n}\n\nconst getSQLiteSetOperators = () => ({\n\tunion,\n\tunionAll,\n\tintersect,\n\texcept,\n});\n\n/**\n * Adds `union` set operator to the query.\n *\n * Calling this method will combine the result sets of the `select` statements and remove any duplicate rows that appear across them.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#union}\n *\n * @example\n *\n * ```ts\n * // Select all unique names from customers and users tables\n * import { union } from 'drizzle-orm/sqlite-core'\n *\n * await union(\n * db.select({ name: users.name }).from(users),\n * db.select({ name: customers.name }).from(customers)\n * );\n * // or\n * await db.select({ name: users.name })\n * .from(users)\n * .union(\n * db.select({ name: customers.name }).from(customers)\n * );\n * ```\n */\nexport const union = createSetOperator('union', false);\n\n/**\n * Adds `union all` set operator to the query.\n *\n * Calling this method will combine the result-set of the `select` statements and keep all duplicate rows that appear across them.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#union-all}\n *\n * @example\n *\n * ```ts\n * // Select all transaction ids from both online and in-store sales\n * import { unionAll } from 'drizzle-orm/sqlite-core'\n *\n * await unionAll(\n * db.select({ transaction: onlineSales.transactionId }).from(onlineSales),\n * db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n * );\n * // or\n * await db.select({ transaction: onlineSales.transactionId })\n * .from(onlineSales)\n * .unionAll(\n * db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n * );\n * ```\n */\nexport const unionAll = createSetOperator('union', true);\n\n/**\n * Adds `intersect` set operator to the query.\n *\n * Calling this method will retain only the rows that are present in both result sets and eliminate duplicates.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect}\n *\n * @example\n *\n * ```ts\n * // Select course names that are offered in both departments A and B\n * import { intersect } from 'drizzle-orm/sqlite-core'\n *\n * await intersect(\n * db.select({ courseName: depA.courseName }).from(depA),\n * db.select({ courseName: depB.courseName }).from(depB)\n * );\n * // or\n * await db.select({ courseName: depA.courseName })\n * .from(depA)\n * .intersect(\n * db.select({ courseName: depB.courseName }).from(depB)\n * );\n * ```\n */\nexport const intersect = createSetOperator('intersect', false);\n\n/**\n * Adds `except` set operator to the query.\n *\n * Calling this method will retrieve all unique rows from the left query, except for the rows that are present in the result set of the right query.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#except}\n *\n * @example\n *\n * ```ts\n * // Select all courses offered in department A but not in department B\n * import { except } from 'drizzle-orm/sqlite-core'\n *\n * await except(\n * db.select({ courseName: depA.courseName }).from(depA),\n * db.select({ courseName: depB.courseName }).from(depB)\n * );\n * // or\n * await db.select({ courseName: depA.courseName })\n * .from(depA)\n * .except(\n * db.select({ courseName: depB.courseName }).from(depB)\n * );\n * ```\n */\nexport const except = createSetOperator('except', false);\n", "import type { MigrationMeta } from './migrator';\n\nexport function formatToMillis(dateStr: string): number {\n\tconst year = parseInt(dateStr.slice(0, 4), 10);\n\tconst month = parseInt(dateStr.slice(4, 6), 10) - 1;\n\tconst day = parseInt(dateStr.slice(6, 8), 10);\n\tconst hour = parseInt(dateStr.slice(8, 10), 10);\n\tconst minute = parseInt(dateStr.slice(10, 12), 10);\n\tconst second = parseInt(dateStr.slice(12, 14), 10);\n\n\treturn Date.UTC(year, month, day, hour, minute, second);\n}\n\nexport function getMigrationsToRun(params: {\n\tlocalMigrations: MigrationMeta[];\n\tdbMigrations: { id: number; hash: string; created_at: string; name: string | null }[];\n}): MigrationMeta[] {\n\tconst { localMigrations, dbMigrations } = params;\n\n\tconst dbNamesSet = new Set(\n\t\tdbMigrations.map((m) => m.name).filter((n): n is string => n !== null),\n\t);\n\treturn localMigrations.filter((lm) => !lm.name || !dbNamesSet.has(lm.name));\n}\n", "import { Column } from '~/column.ts';\nimport { entityKind, is } from './entity.ts';\nimport type { View } from './sql/index.ts';\nimport { Table } from './table.ts';\nimport type { Casing } from './utils.ts';\n\nexport function toSnakeCase(input: string) {\n\tconst words = input\n\t\t.replace(/['\\u2019]/g, '')\n\t\t.match(/[\\da-z]+|[A-Z]+(?![a-z])|[A-Z][\\da-z]+/g) ?? [];\n\n\treturn words.map((word) => word.toLowerCase()).join('_');\n}\n\nexport function toCamelCase(input: string) {\n\tconst words = input\n\t\t.replace(/['\\u2019]/g, '')\n\t\t.match(/[\\da-z]+|[A-Z]+(?![a-z])|[A-Z][\\da-z]+/g) ?? [];\n\n\treturn words.reduce((acc, word, i) => {\n\t\tconst formattedWord = i === 0 ? word.toLowerCase() : `${word[0]!.toUpperCase()}${word.slice(1)}`;\n\t\treturn acc + formattedWord;\n\t}, '');\n}\n\nfunction noopCase(input: string) {\n\treturn input;\n}\n\nexport class CasingCache {\n\tstatic readonly [entityKind]: string = 'CasingCache';\n\n\t/** @internal */\n\tcache: Record<string, string> = {};\n\tprivate cachedTables: Record<string, true> = {};\n\tprivate convert: (input: string) => string;\n\n\tconstructor(casing?: Casing) {\n\t\tthis.convert = casing === 'snake_case'\n\t\t\t? toSnakeCase\n\t\t\t: casing === 'camelCase'\n\t\t\t? toCamelCase\n\t\t\t: noopCase;\n\t}\n\n\tgetColumnCasing(column: Column): string {\n\t\tif (!column.keyAsName) return column.name;\n\n\t\tconst schema = column.table[Table.Symbol.Schema] ?? 'public';\n\t\tconst tableName = column.table[Table.Symbol.OriginalName];\n\t\tconst key = `${schema}.${tableName}.${column.name}`;\n\n\t\tif (!this.cache[key]) {\n\t\t\tthis.cacheTable(column.table);\n\t\t}\n\t\treturn this.cache[key]!;\n\t}\n\n\tprivate cacheTable(table: Table | View) {\n\t\tconst schema = table[Table.Symbol.Schema] ?? 'public';\n\t\tconst tableName = table[Table.Symbol.OriginalName];\n\t\tconst tableKey = `${schema}.${tableName}`;\n\n\t\tif (!this.cachedTables[tableKey]) {\n\t\t\tfor (const column of Object.values(table[Table.Symbol.Columns])) {\n\t\t\t\tif (!is(column, Column)) continue;\n\n\t\t\t\tconst columnKey = `${tableKey}.${column.name}`;\n\t\t\t\tthis.cache[columnKey] = this.convert(column.name);\n\t\t\t}\n\t\t\tthis.cachedTables[tableKey] = true;\n\t\t}\n\t}\n\n\tclearCache() {\n\t\tthis.cache = {};\n\t\tthis.cachedTables = {};\n\t}\n}\n", "import { FakePrimitiveParam, Name, Param, Placeholder, SQL, StringChunk, View, fillPlaceholders, getViewName, isDriverValueEncoder, isSQLWrapper, isView, name, noopDecoder, noopEncoder, noopMapper, param, placeholder, sql, sqlCommenter } from \"./sql.js\";\nimport { and, arrayContained, arrayContains, arrayOverlaps, between, bindIfParam, eq, exists, gt, gte, ilike, inArray, isNotNull, isNull, like, lt, lte, ne, not, notBetween, notExists, notIlike, notInArray, notLike, or } from \"./expressions/conditions.js\";\nimport { asc, desc } from \"./expressions/select.js\";\nimport { avg, avgDistinct, count, countDistinct, max, min, sum, sumDistinct } from \"./functions/aggregate.js\";\nimport { cosineDistance, hammingDistance, innerProduct, jaccardDistance, l1Distance, l2Distance } from \"./functions/vector.js\";\n\nexport { FakePrimitiveParam, Name, Param, Placeholder, SQL, StringChunk, View, and, arrayContained, arrayContains, arrayOverlaps, asc, avg, avgDistinct, between, bindIfParam, cosineDistance, count, countDistinct, desc, eq, exists, fillPlaceholders, getViewName, gt, gte, hammingDistance, ilike, inArray, innerProduct, isDriverValueEncoder, isNotNull, isNull, isSQLWrapper, isView, jaccardDistance, l1Distance, l2Distance, like, lt, lte, max, min, name, ne, noopDecoder, noopEncoder, noopMapper, not, notBetween, notExists, notIlike, notInArray, notLike, or, param, placeholder, sql, sqlCommenter, sum, sumDistinct };", "import { SQLiteColumn, SQLiteColumnBuilder } from \"./common.js\";\nimport { SQLiteBigInt, SQLiteBigIntBuilder, SQLiteBlobBuffer, SQLiteBlobBufferBuilder, SQLiteBlobJson, SQLiteBlobJsonBuilder, blob } from \"./blob.js\";\nimport { SQLiteCustomColumn, SQLiteCustomColumnBuilder, customType } from \"./custom.js\";\nimport { SQLiteBaseInteger, SQLiteBaseIntegerBuilder, SQLiteBoolean, SQLiteBooleanBuilder, SQLiteInteger, SQLiteIntegerBuilder, SQLiteTimestamp, SQLiteTimestampBuilder, int, integer } from \"./integer.js\";\nimport { SQLiteNumeric, SQLiteNumericBigInt, SQLiteNumericBigIntBuilder, SQLiteNumericBuilder, SQLiteNumericNumber, SQLiteNumericNumberBuilder, numeric } from \"./numeric.js\";\nimport { SQLiteReal, SQLiteRealBuilder, real } from \"./real.js\";\nimport { SQLiteText, SQLiteTextBuilder, SQLiteTextJson, SQLiteTextJsonBuilder, text } from \"./text.js\";\n\nexport { SQLiteBaseInteger, SQLiteBaseIntegerBuilder, SQLiteBigInt, SQLiteBigIntBuilder, SQLiteBlobBuffer, SQLiteBlobBufferBuilder, SQLiteBlobJson, SQLiteBlobJsonBuilder, SQLiteBoolean, SQLiteBooleanBuilder, SQLiteColumn, SQLiteColumnBuilder, SQLiteCustomColumn, SQLiteCustomColumnBuilder, SQLiteInteger, SQLiteIntegerBuilder, SQLiteNumeric, SQLiteNumericBigInt, SQLiteNumericBigIntBuilder, SQLiteNumericBuilder, SQLiteNumericNumber, SQLiteNumericNumberBuilder, SQLiteReal, SQLiteRealBuilder, SQLiteText, SQLiteTextBuilder, SQLiteTextJson, SQLiteTextJsonBuilder, SQLiteTimestamp, SQLiteTimestampBuilder, blob, customType, int, integer, numeric, real, text };", "export interface UpgradeResult {\n\tnewDb: boolean;\n}\n\nexport const MIGRATIONS_TABLE_VERSIONS = {\n\tsqlite: 1,\n\tpg: 1,\n\teffect: 1,\n\tmysql: 1,\n\tmssql: 1,\n\tcockroach: 1,\n\tsinglestore: 1,\n} as const;\n\nexport const GET_VERSION_FOR = {\n\tmysql: (columns: string[]): number => {\n\t\tif (columns.includes('name')) return 1;\n\t\treturn 0;\n\t},\n\tpg: (columns: string[]): number => {\n\t\tif (columns.includes('name')) return 1;\n\t\treturn 0;\n\t},\n\teffect: (columns: string[]): number => {\n\t\tif (columns.includes('name')) return 1;\n\t\treturn 0;\n\t},\n\tmssql: (columns: string[]): number => {\n\t\tif (columns.includes('name')) return 1;\n\t\treturn 0;\n\t},\n\tcockroach: (columns: string[]): number => {\n\t\tif (columns.includes('name')) return 1;\n\t\treturn 0;\n\t},\n\tsinglestore: (columns: string[]): number => {\n\t\tif (columns.includes('name')) return 1;\n\t\treturn 0;\n\t},\n\tsqlite: (columns: string[]): number => {\n\t\tif (columns.includes('name')) return 1;\n\t\treturn 0;\n\t},\n} as const;\n", "import type { TablesRelationalConfig } from '~/_relations.ts';\nimport type { MigrationMeta } from '~/migrator.ts';\nimport type { AnyRelations } from '~/relations.ts';\nimport { type SQL, sql } from '~/sql/sql.ts';\nimport type { BaseSQLiteDatabase } from '~/sqlite-core/index.ts';\nimport type { SQLiteSession } from '~/sqlite-core/session.ts';\nimport { GET_VERSION_FOR, MIGRATIONS_TABLE_VERSIONS, type UpgradeResult } from './utils.ts';\n\n/**\n * Detects the current version of the migrations table schema and upgrades it if needed.\n *\n * Version 0: Original schema (id, hash, created_at)\n * Version 1: Extended schema (id, hash, created_at, name, applied_at)\n */\nexport function upgradeSyncIfNeeded(\n\tmigrationsTable: string,\n\tsession: SQLiteSession<\n\t\t'sync',\n\t\tunknown,\n\t\tRecord<string, unknown>,\n\t\tAnyRelations,\n\t\tTablesRelationalConfig\n\t>,\n\tlocalMigrations: MigrationMeta[],\n): UpgradeResult {\n\tconst tableExists = session.all(\n\t\tsql`SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ${migrationsTable}`,\n\t);\n\n\tif (tableExists.length === 0) {\n\t\treturn { newDb: true };\n\t}\n\n\t// Table exists, check table shape\n\tconst rows = session.all<{ column_name: string }>(\n\t\tsql`SELECT name as column_name FROM pragma_table_info(${migrationsTable})`,\n\t);\n\n\tconst version = GET_VERSION_FOR.sqlite(rows.map((r) => r.column_name));\n\n\tfor (let v = version; v < MIGRATIONS_TABLE_VERSIONS.sqlite; v++) {\n\t\tconst upgradeFn = upgradeSyncFunctions[v];\n\t\tif (!upgradeFn) {\n\t\t\tthrow new Error(`No upgrade path from migration table version ${v} to ${v + 1}`);\n\t\t}\n\t\tupgradeFn(migrationsTable, session, localMigrations);\n\t}\n\n\treturn { newDb: false };\n}\n\nconst upgradeSyncFunctions: Record<\n\tnumber,\n\t(\n\t\tmigrationsTable: string,\n\t\tsession: SQLiteSession<\n\t\t\t'sync',\n\t\t\tunknown,\n\t\t\tRecord<string, unknown>,\n\t\t\tAnyRelations,\n\t\t\tTablesRelationalConfig\n\t\t>,\n\t\tlocalMigrations: MigrationMeta[],\n\t) => void\n> = {\n\t/**\n\t * Upgrade from version 0 to version 1:\n\t * 1. Read all existing DB migrations\n\t * 2. Sort localMigrations ASC by millis and if the same - sort by name\n\t * 3. Match each DB row to a local migration\n\t * If multiple migrations share the same second, use hash matching as a tiebreaker\n\t * Not implemented for now -> If hash matching fails, fall back to serial id ordering\n\t * 5. Create extra column and backfill names for matched migrations\n\t */\n\t0: (migrationsTable, session, localMigrations) => {\n\t\tconst table = sql`${sql.identifier(migrationsTable)}`;\n\n\t\t// 1. Read all existing DB migrations\n\t\t// Sort them by ids asc (order how they were applied)\n\t\t// this can be null from legacy implementation where id was serial\n\t\tconst dbRows = session.all<{ id: number | null; hash: string; created_at: number }>(\n\t\t\tsql`SELECT id, hash, created_at FROM ${table} ORDER BY id ASC`,\n\t\t);\n\n\t\t// 2. Sort ASC by millis and if the same - sort by name\n\t\tlocalMigrations.sort((a, b) =>\n\t\t\ta.folderMillis !== b.folderMillis ? a.folderMillis - b.folderMillis : (a.name ?? '').localeCompare(b.name ?? '')\n\t\t);\n\n\t\tconst byMillis = new Map<number, MigrationMeta[]>();\n\t\tconst byHash = new Map<string, MigrationMeta>();\n\t\tfor (const lm of localMigrations) {\n\t\t\tif (!byMillis.has(lm.folderMillis)) {\n\t\t\t\tbyMillis.set(lm.folderMillis, []);\n\t\t\t}\n\t\t\tbyMillis.get(lm.folderMillis)!.push(lm);\n\t\t\tbyHash.set(lm.hash, lm);\n\t\t}\n\n\t\t// \t3. Match each DB row to a local migration\n\t\t// \tPriority: millis -> hash\n\n\t\t// id can be null from legacy implementation where id was serial\n\t\tconst toApply: {\n\t\t\tid: number | null;\n\t\t\tname: string;\n\t\t\thash: string;\n\t\t\tcreated_at: string;\n\t\t\tmatchedBy: 'id' | 'hash' | 'millis';\n\t\t}[] = [];\n\n\t\t// id can be null from legacy implementation where id was serial\n\t\t// hash can only be '' for bun-sqlite journal entries\n\t\tlet unmatched: { id: number | null; hash: string; created_at: number }[] = [];\n\n\t\tfor (const dbRow of dbRows) {\n\t\t\tconst stringified = String(dbRow.created_at);\n\t\t\tconst millis = Number(stringified.substring(0, stringified.length - 3) + '000');\n\t\t\tconst candidates = byMillis.get(millis);\n\n\t\t\tlet matched: MigrationMeta | undefined;\n\t\t\tlet matchedBy: 'hash' | 'millis' | null = null;\n\t\t\tif (candidates && candidates.length === 1) {\n\t\t\t\tmatched = candidates[0];\n\t\t\t\tmatchedBy = 'millis';\n\t\t\t} else if (candidates && candidates.length > 1) {\n\t\t\t\tmatched = candidates.find((c) => c.hash && dbRow.hash && c.hash === dbRow.hash); // for bun-sqlite cases (journal had empty hash)\n\t\t\t\tif (matched) matchedBy = 'hash';\n\t\t\t} else {\n\t\t\t\tmatched = byHash.get(dbRow.hash);\n\t\t\t\tif (matched) matchedBy = 'hash';\n\t\t\t}\n\n\t\t\tif (matched) {\n\t\t\t\ttoApply.push({\n\t\t\t\t\tid: dbRow.id,\n\t\t\t\t\tname: matched.name,\n\t\t\t\t\thash: dbRow.hash,\n\t\t\t\t\tcreated_at: stringified,\n\t\t\t\t\tmatchedBy: dbRow.id ? 'id' : matchedBy!,\n\t\t\t\t});\n\t\t\t} else unmatched.push(dbRow);\n\t\t}\n\n\t\t// 4. Check for unmatched\n\t\t// Our assumption on this migration flow is that all DB entries should be matched to a local migration\n\t\t// (if same seconds - fallback to hash, if hash fails - corner case)\n\t\t// If there are unmatched entries, it means that the local environment is missing migrations that have been applied to the DB,\n\t\t// which can lead to inconsistencies and potential issues when running future migrations\n\t\tif (unmatched.length > 0) {\n\t\t\tthrow Error(\n\t\t\t\t`While upgrading your database migrations table we found ${unmatched.length} (${\n\t\t\t\t\tunmatched.map((it) => `[id: ${it.id}, created_at: ${it.created_at}]`).join(', ')\n\t\t\t\t}) migrations in the database that do not match any local migration. This means that some migrations were applied to the database but are missing from the local environment`,\n\t\t\t);\n\t\t}\n\n\t\t// 5. Create extra column and backfill names for matched migrations\n\t\tsession.transaction((tx) => {\n\t\t\ttx.run(sql`ALTER TABLE ${table} ADD COLUMN ${sql.identifier('name')} text`);\n\t\t\ttx.run(\n\t\t\t\tsql`ALTER TABLE ${table} ADD COLUMN ${sql.identifier('applied_at')} TEXT`,\n\t\t\t);\n\n\t\t\tfor (const backfillEntry of toApply) {\n\t\t\t\tconst updateQuery = sql`UPDATE ${table} SET ${sql.identifier('name')} = ${backfillEntry.name}, ${\n\t\t\t\t\tsql.identifier('applied_at')\n\t\t\t\t} = NULL WHERE`;\n\n\t\t\t\t// id\n\t\t\t\t// created_at\n\t\t\t\t// hash\n\t\t\t\tif (backfillEntry.id) updateQuery.append(sql` ${sql.identifier('id')} = ${backfillEntry.id}`);\n\t\t\t\telse if (backfillEntry.matchedBy === 'millis') {\n\t\t\t\t\tupdateQuery.append(sql` ${sql.identifier('created_at')} = ${backfillEntry.created_at}`);\n\t\t\t\t} else updateQuery.append(sql` ${sql.identifier('hash')} = ${backfillEntry.hash}`);\n\n\t\t\t\ttx.run(updateQuery);\n\t\t\t}\n\t\t});\n\t},\n};\n\n/**\n * Detects the current version of the migrations table schema and upgrades it if needed.\n *\n * Version 0: Original schema (id, hash, created_at)\n * Version 1: Extended schema (id, hash, created_at, name, applied_at)\n */\nexport async function upgradeAsyncIfNeeded(\n\tmigrationsTable: string,\n\tdb: BaseSQLiteDatabase<'async', unknown, Record<string, unknown>>,\n\tlocalMigrations: MigrationMeta[],\n): Promise<UpgradeResult> {\n\t// Check if the table exists at all\n\tconst tableExists = await db.session.all(\n\t\tsql`SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ${migrationsTable}`,\n\t);\n\n\tif (tableExists.length === 0) {\n\t\treturn { newDb: true };\n\t}\n\n\tconst rows = await db.session.all<{ column_name: string }>(\n\t\tsql`SELECT name as column_name FROM pragma_table_info(${migrationsTable})`,\n\t);\n\n\tconst version = GET_VERSION_FOR.sqlite(rows.map((r) => r.column_name));\n\n\tfor (let v = version; v < MIGRATIONS_TABLE_VERSIONS.sqlite; v++) {\n\t\tconst upgradeFn = upgradeAsyncFunctions[v];\n\t\tif (!upgradeFn) {\n\t\t\tthrow new Error(`No upgrade path from migration table version ${v} to ${v + 1}`);\n\t\t}\n\t\tawait upgradeFn(migrationsTable, db, localMigrations);\n\t}\n\n\treturn { newDb: false };\n}\n\nconst upgradeAsyncFunctions: Record<\n\tnumber,\n\t(\n\t\tmigrationsTable: string,\n\t\tdb: BaseSQLiteDatabase<'async', unknown, Record<string, unknown>>,\n\t\tlocalMigrations: MigrationMeta[],\n\t) => Promise<void>\n> = {\n\t/**\n\t * Upgrade from version 0 to version 1:\n\t * 1. Read all existing DB migrations\n\t * 2. Sort localMigrations ASC by millis and if the same - sort by name\n\t * 3. Match each DB row to a local migration\n\t * If multiple migrations share the same second, use hash matching as a tiebreaker\n\t * Not implemented for now -> If hash matching fails, fall back to serial id ordering\n\t * 5. Create extra column and backfill names for matched migrations\n\t */\n\t0: async (migrationsTable, db, localMigrations) => {\n\t\tconst table = sql`${sql.identifier(migrationsTable)}`;\n\n\t\t// 1. Read all existing DB migrations\n\t\t// Sort them by ids asc (order how they were applied)\n\t\t// this can be null from legacy implementation where id was serial\n\t\tconst dbRows = await db.session.all<{ id: number | null; hash: string; created_at: number }>(\n\t\t\tsql`SELECT id, hash, created_at FROM ${table} ORDER BY id ASC`,\n\t\t);\n\n\t\t// 2. Sort ASC by millis and if the same - sort by name\n\t\tlocalMigrations.sort((a, b) =>\n\t\t\ta.folderMillis !== b.folderMillis ? a.folderMillis - b.folderMillis : (a.name ?? '').localeCompare(b.name ?? '')\n\t\t);\n\n\t\tconst byMillis = new Map<number, MigrationMeta[]>();\n\t\tconst byHash = new Map<string, MigrationMeta>();\n\t\tfor (const lm of localMigrations) {\n\t\t\tif (!byMillis.has(lm.folderMillis)) {\n\t\t\t\tbyMillis.set(lm.folderMillis, []);\n\t\t\t}\n\t\t\tbyMillis.get(lm.folderMillis)!.push(lm);\n\t\t\tbyHash.set(lm.hash, lm);\n\t\t}\n\n\t\t// \t3. Match each DB row to a local migration\n\t\t// \tPriority: millis -> hash\n\n\t\t// id can be null from legacy implementation where id was serial\n\t\tconst toApply: {\n\t\t\tid: number | null;\n\t\t\tname: string;\n\t\t\thash: string;\n\t\t\tcreated_at: string;\n\t\t\tmatchedBy: 'id' | 'hash' | 'millis';\n\t\t}[] = [];\n\n\t\t// id can be null from legacy implementation where id was serial\n\t\t// hash can only be '' for bun-sqlite journal entries\n\t\tlet unmatched: { id: number | null; hash: string; created_at: number }[] = [];\n\n\t\tfor (const dbRow of dbRows) {\n\t\t\tconst stringified = String(dbRow.created_at);\n\t\t\tconst millis = Number(stringified.substring(0, stringified.length - 3) + '000');\n\t\t\tconst candidates = byMillis.get(millis);\n\n\t\t\tlet matched: MigrationMeta | undefined;\n\t\t\tlet matchedBy: 'hash' | 'millis' | null = null;\n\t\t\tif (candidates && candidates.length === 1) {\n\t\t\t\tmatched = candidates[0];\n\t\t\t\tmatchedBy = 'millis';\n\t\t\t} else if (candidates && candidates.length > 1) {\n\t\t\t\tmatched = candidates.find((c) => c.hash && dbRow.hash && c.hash === dbRow.hash); // for bun-sqlite cases (journal had empty hash)\n\t\t\t\tif (matched) matchedBy = 'hash';\n\t\t\t} else {\n\t\t\t\tmatched = byHash.get(dbRow.hash);\n\t\t\t\tif (matched) matchedBy = 'hash';\n\t\t\t}\n\n\t\t\tif (matched) {\n\t\t\t\ttoApply.push({\n\t\t\t\t\tid: dbRow.id,\n\t\t\t\t\tname: matched.name,\n\t\t\t\t\thash: dbRow.hash,\n\t\t\t\t\tcreated_at: stringified,\n\t\t\t\t\tmatchedBy: dbRow.id ? 'id' : matchedBy!,\n\t\t\t\t});\n\t\t\t} else unmatched.push(dbRow);\n\t\t}\n\n\t\t// 4. Check for unmatched\n\t\t// Our assumption on this migration flow is that all DB entries should be matched to a local migration\n\t\t// (if same seconds - fallback to hash, if hash fails - corner case)\n\t\t// If there are unmatched entries, it means that the local environment is missing migrations that have been applied to the DB,\n\t\t// which can lead to inconsistencies and potential issues when running future migrations\n\t\tif (unmatched.length > 0) {\n\t\t\tthrow Error(\n\t\t\t\t`While upgrading your database migrations table we found ${unmatched.length} (${\n\t\t\t\t\tunmatched.map((it) => `[id: ${it.id}, created_at: ${it.created_at}]`).join(', ')\n\t\t\t\t}) migrations in the database that do not match any local migration. This means that some migrations were applied to the database but are missing from the local environment`,\n\t\t\t);\n\t\t}\n\n\t\t// 5. Create extra column and backfill names for matched migrations\n\t\tconst statements: SQL[] = [\n\t\t\tsql`ALTER TABLE ${table} ADD COLUMN ${sql.identifier('name')} text`,\n\t\t\tsql`ALTER TABLE ${table} ADD COLUMN ${sql.identifier('applied_at')} TEXT`,\n\t\t];\n\t\tfor (const backfillEntry of toApply) {\n\t\t\tconst updateQuery = sql`UPDATE ${table} SET ${sql.identifier('name')} = ${backfillEntry.name}, ${\n\t\t\t\tsql.identifier('applied_at')\n\t\t\t} = NULL WHERE`;\n\n\t\t\t// id\n\t\t\t// created_at\n\t\t\t// hash\n\t\t\tif (backfillEntry.id) updateQuery.append(sql` ${sql.identifier('id')} = ${backfillEntry.id}`);\n\t\t\telse if (backfillEntry.matchedBy === 'millis') {\n\t\t\t\tupdateQuery.append(sql` ${sql.identifier('created_at')} = ${backfillEntry.created_at}`);\n\t\t\t} else updateQuery.append(sql` ${sql.identifier('hash')} = ${backfillEntry.hash}`);\n\n\t\t\tstatements.push(updateQuery);\n\t\t}\n\n\t\tawait db.transaction(async (tx) => {\n\t\t\tfor (const statement of statements) {\n\t\t\t\tawait tx.run(statement);\n\t\t\t}\n\t\t});\n\t},\n};\n", "import * as V1 from '~/_relations.ts';\nimport {\n\taliasedTable,\n\taliasedTableColumn,\n\tgetOriginalColumnFromAlias,\n\tmapColumnsInAliasedSQLToAlias,\n\tmapColumnsInSQLToAlias,\n} from '~/alias.ts';\nimport { CasingCache } from '~/casing.ts';\nimport type { AnyColumn } from '~/column.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleError } from '~/errors.ts';\nimport type { MigrationConfig, MigrationMeta, MigratorInitFailResponse } from '~/migrator.ts';\nimport { getMigrationsToRun } from '~/migrator.utils.ts';\nimport {\n\ttype AnyOne,\n\t// AggregatedField,\n\ttype AnyRelations,\n\ttype BuildRelationalQueryResult,\n\ttype ColumnWithTSName,\n\ttype DBQueryConfig,\n\tgetTableAsAliasSQL,\n\tOne,\n\ttype Relation,\n\trelationExtrasToSQL,\n\trelationsFilterToSQL,\n\trelationsOrderToSQL,\n\trelationToSQL,\n\ttype TableRelationalConfig,\n\ttype TablesRelationalConfig,\n\ttype WithContainer,\n} from '~/relations.ts';\nimport type { Name, Placeholder, SQLWrapper } from '~/sql/index.ts';\nimport { and, eq, isSQLWrapper } from '~/sql/index.ts';\nimport { Param, type QueryWithTypings, SQL, sql, type SQLChunk, View } from '~/sql/sql.ts';\nimport { SQLiteColumn, type SQLiteCustomColumn } from '~/sqlite-core/columns/index.ts';\nimport type {\n\tAnySQLiteSelectQueryBuilder,\n\tSQLiteDeleteConfig,\n\tSQLiteInsertConfig,\n\tSQLiteUpdateConfig,\n} from '~/sqlite-core/query-builders/index.ts';\nimport { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { getTableName, getTableUniqueName, Table, TableColumns } from '~/table.ts';\nimport { upgradeAsyncIfNeeded, upgradeSyncIfNeeded } from '~/up-migrations/sqlite.ts';\nimport { type Casing, orderSelectedFields, type UpdateSet } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { BaseSQLiteDatabase } from './db.ts';\nimport type {\n\tSelectedFieldsOrdered,\n\tSQLiteSelectConfig,\n\tSQLiteSelectJoinConfig,\n} from './query-builders/select.types.ts';\nimport type { SQLiteSession } from './session.ts';\nimport { SQLiteViewBase } from './view-base.ts';\nimport type { SQLiteView } from './view.ts';\n\nexport interface SQLiteDialectConfig {\n\tcasing?: Casing;\n}\n\nexport abstract class SQLiteDialect {\n\tstatic readonly [entityKind]: string = 'SQLiteDialect';\n\n\t/** @internal */\n\treadonly casing: CasingCache;\n\n\tconstructor(config?: SQLiteDialectConfig) {\n\t\tthis.casing = new CasingCache(config?.casing);\n\t}\n\n\tescapeName(name: string): string {\n\t\treturn `\"${name.replace(/\"/g, '\"\"')}\"`;\n\t}\n\n\tescapeParam(_num: number): string {\n\t\treturn '?';\n\t}\n\n\tescapeString(str: string): string {\n\t\treturn `'${str.replace(/'/g, \"''\")}'`;\n\t}\n\n\tprivate buildWithCTE(queries: Subquery[] | undefined): SQL | undefined {\n\t\tif (!queries?.length) return undefined;\n\n\t\tconst withSqlChunks = [sql`with `];\n\t\tfor (const [i, w] of queries.entries()) {\n\t\t\twithSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`);\n\t\t\tif (i < queries.length - 1) {\n\t\t\t\twithSqlChunks.push(sql`, `);\n\t\t\t}\n\t\t}\n\t\twithSqlChunks.push(sql` `);\n\t\treturn sql.join(withSqlChunks);\n\t}\n\n\tbuildDeleteQuery({\n\t\ttable,\n\t\twhere,\n\t\treturning,\n\t\twithList,\n\t\tlimit,\n\t\torderBy,\n\t}: SQLiteDeleteConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\treturn sql`${withSql}delete from ${table}${whereSql}${returningSql}${orderBySql}${limitSql}`;\n\t}\n\n\tbuildUpdateSet(table: SQLiteTable, set: UpdateSet): SQL {\n\t\tconst tableColumns = table[Table.Symbol.Columns];\n\n\t\tconst columnNames = Object.keys(tableColumns).filter(\n\t\t\t(colName) =>\n\t\t\t\tset[colName] !== undefined\n\t\t\t\t|| tableColumns[colName]?.onUpdateFn !== undefined,\n\t\t);\n\n\t\tconst setLength = columnNames.length;\n\t\treturn sql.join(\n\t\t\tcolumnNames.flatMap((colName, i) => {\n\t\t\t\tconst col = tableColumns[colName]!;\n\n\t\t\t\tconst onUpdateFnResult = col.onUpdateFn?.();\n\t\t\t\tconst value = set[colName]\n\t\t\t\t\t?? (is(onUpdateFnResult, SQL)\n\t\t\t\t\t\t? onUpdateFnResult\n\t\t\t\t\t\t: sql.param(onUpdateFnResult, col));\n\t\t\t\tconst res = sql`${sql.identifier(this.casing.getColumnCasing(col))} = ${value}`;\n\n\t\t\t\tif (i < setLength - 1) {\n\t\t\t\t\treturn [res, sql.raw(', ')];\n\t\t\t\t}\n\t\t\t\treturn [res];\n\t\t\t}),\n\t\t);\n\t}\n\n\tbuildUpdateQuery({\n\t\ttable,\n\t\tset,\n\t\twhere,\n\t\treturning,\n\t\twithList,\n\t\tjoins,\n\t\tfrom,\n\t\tlimit,\n\t\torderBy,\n\t}: SQLiteUpdateConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst setSql = this.buildUpdateSet(table, set);\n\n\t\tconst fromSql = from && sql.join([sql.raw(' from '), this.buildFromTable(from)]);\n\n\t\tconst joinsSql = this.buildJoins(joins);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\treturn sql`${withSql}update ${table} set ${setSql}${fromSql}${joinsSql}${whereSql}${returningSql}${orderBySql}${limitSql}`;\n\t}\n\n\t/**\n\t * Builds selection SQL with provided fields/expressions\n\t *\n\t * Examples:\n\t *\n\t * `select <selection> from`\n\t *\n\t * `insert ... returning <selection>`\n\t *\n\t * If `isSingleTable` is true, then columns won't be prefixed with table name\n\t */\n\tprivate buildSelection(\n\t\tfields: SelectedFieldsOrdered,\n\t\t{ isSingleTable = false }: { isSingleTable?: boolean } = {},\n\t): SQL {\n\t\tconst columnsLen = fields.length;\n\n\t\tconst chunks = fields.flatMap(({ field }, i) => {\n\t\t\tconst chunk: SQLChunk[] = [];\n\n\t\t\tif (is(field, SQL.Aliased) && field.isSelectionField) {\n\t\t\t\tif (!isSingleTable && field.origin !== undefined) {\n\t\t\t\t\tchunk.push(sql.identifier(field.origin), sql.raw('.'));\n\t\t\t\t}\n\t\t\t\tchunk.push(sql.identifier(field.fieldAlias));\n\t\t\t} else if (is(field, SQL.Aliased) || is(field, SQL)) {\n\t\t\t\tconst query = is(field, SQL.Aliased) ? field.sql : field;\n\n\t\t\t\tif (isSingleTable) {\n\t\t\t\t\tconst newSql = new SQL(\n\t\t\t\t\t\tquery.queryChunks.map((c) => {\n\t\t\t\t\t\t\tif (is(c, Column)) {\n\t\t\t\t\t\t\t\treturn sql.identifier(this.casing.getColumnCasing(c));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn c;\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\n\t\t\t\t\tchunk.push(query.shouldInlineParams ? newSql.inlineParams() : newSql);\n\t\t\t\t} else {\n\t\t\t\t\tchunk.push(query);\n\t\t\t\t}\n\n\t\t\t\tif (is(field, SQL.Aliased)) {\n\t\t\t\t\tchunk.push(sql` as ${sql.identifier(field.fieldAlias)}`);\n\t\t\t\t}\n\t\t\t} else if (is(field, Column)) {\n\t\t\t\tif (field.columnType === 'SQLiteNumericBigInt') {\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunk.push(\n\t\t\t\t\t\t\tfield.isAlias\n\t\t\t\t\t\t\t\t? sql`cast(${\n\t\t\t\t\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\t\t\t\t\tthis.casing.getColumnCasing(\n\t\t\t\t\t\t\t\t\t\t\tgetOriginalColumnFromAlias(field),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t} as text) as ${field}`\n\t\t\t\t\t\t\t\t: sql`cast(${sql.identifier(this.casing.getColumnCasing(field))} as text)`,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunk.push(\n\t\t\t\t\t\t\tfield.isAlias\n\t\t\t\t\t\t\t\t? sql`cast(${getOriginalColumnFromAlias(field)} as text) as ${field}`\n\t\t\t\t\t\t\t\t: sql`cast(${field} as text)`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunk.push(\n\t\t\t\t\t\t\tfield.isAlias\n\t\t\t\t\t\t\t\t? sql`${sql.identifier(this.casing.getColumnCasing(getOriginalColumnFromAlias(field)))} as ${field}`\n\t\t\t\t\t\t\t\t: sql.identifier(this.casing.getColumnCasing(field)),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunk.push(\n\t\t\t\t\t\t\tfield.isAlias\n\t\t\t\t\t\t\t\t? sql`${getOriginalColumnFromAlias(field)} as ${field}`\n\t\t\t\t\t\t\t\t: field,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (is(field, Subquery)) {\n\t\t\t\tconst entries = Object.entries(field._.selectedFields) as [\n\t\t\t\t\tstring,\n\t\t\t\t\tSQL.Aliased | Column | SQL,\n\t\t\t\t][];\n\n\t\t\t\tif (entries.length === 1) {\n\t\t\t\t\tconst entry = entries[0]![1];\n\n\t\t\t\t\tconst fieldDecoder = is(entry, SQL)\n\t\t\t\t\t\t? entry.decoder\n\t\t\t\t\t\t: is(entry, Column)\n\t\t\t\t\t\t? { mapFromDriverValue: (v: any) => entry.mapFromDriverValue(v) }\n\t\t\t\t\t\t: entry.sql.decoder;\n\t\t\t\t\tif (fieldDecoder) field._.sql.decoder = fieldDecoder;\n\t\t\t\t}\n\t\t\t\tchunk.push(field);\n\t\t\t}\n\n\t\t\tif (i < columnsLen - 1) {\n\t\t\t\tchunk.push(sql`, `);\n\t\t\t}\n\n\t\t\treturn chunk;\n\t\t});\n\n\t\treturn sql.join(chunks);\n\t}\n\n\tprivate buildJoins(\n\t\tjoins: SQLiteSelectJoinConfig[] | undefined,\n\t): SQL | undefined {\n\t\tif (!joins || joins.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst joinsArray: SQL[] = [];\n\n\t\tif (joins) {\n\t\t\tfor (const [index, joinMeta] of joins.entries()) {\n\t\t\t\tif (index === 0) {\n\t\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t\t}\n\t\t\t\tconst table = joinMeta.table;\n\t\t\t\tconst onSql = joinMeta.on ? sql` on ${joinMeta.on}` : undefined;\n\n\t\t\t\tif (is(table, SQLiteTable)) {\n\t\t\t\t\tconst tableName = table[SQLiteTable.Symbol.Name];\n\t\t\t\t\tconst tableSchema = table[SQLiteTable.Symbol.Schema];\n\t\t\t\t\tconst origTableName = table[SQLiteTable.Symbol.OriginalName];\n\t\t\t\t\tconst alias = tableName === origTableName ? undefined : joinMeta.alias;\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join ${tableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined}${\n\t\t\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\t\t\torigTableName,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}${alias && sql` ${sql.identifier(alias)}`}${onSql}`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join ${table}${onSql}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (index < joins.length - 1) {\n\t\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn sql.join(joinsArray);\n\t}\n\n\tprivate buildLimit(limit: number | Placeholder | undefined): SQL | undefined {\n\t\treturn typeof limit === 'object'\n\t\t\t\t|| (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\t}\n\n\tprivate buildOrderBy(\n\t\torderBy: (SQLiteColumn | SQL | SQL.Aliased)[] | undefined,\n\t): SQL | undefined {\n\t\tconst orderByList: (SQLiteColumn | SQL | SQL.Aliased)[] = [];\n\n\t\tif (orderBy) {\n\t\t\tfor (const [index, orderByValue] of orderBy.entries()) {\n\t\t\t\torderByList.push(orderByValue);\n\n\t\t\t\tif (index < orderBy.length - 1) {\n\t\t\t\t\torderByList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn orderByList.length > 0\n\t\t\t? sql` order by ${sql.join(orderByList)}`\n\t\t\t: undefined;\n\t}\n\n\tprivate buildFromTable(\n\t\ttable: SQL | Subquery | SQLiteViewBase | SQLiteTable | undefined,\n\t): SQL | Subquery | SQLiteViewBase | SQLiteTable | undefined {\n\t\tif (is(table, Table) && table[Table.Symbol.IsAlias]) {\n\t\t\treturn sql`${sql`${sql.identifier(table[Table.Symbol.Schema] ?? '')}.`.if(table[Table.Symbol.Schema])}${\n\t\t\t\tsql.identifier(\n\t\t\t\t\ttable[Table.Symbol.OriginalName],\n\t\t\t\t)\n\t\t\t} ${sql.identifier(table[Table.Symbol.Name])}`;\n\t\t}\n\n\t\tif (is(table, View) && table[ViewBaseConfig].isAlias) {\n\t\t\tlet fullName = sql`${sql.identifier(table[ViewBaseConfig].originalName)}`;\n\t\t\tif (table[ViewBaseConfig].schema) {\n\t\t\t\tfullName = sql`${sql.identifier(table[ViewBaseConfig].schema)}.${fullName}`;\n\t\t\t}\n\t\t\treturn sql`${fullName} ${sql.identifier(table[ViewBaseConfig].name)}`;\n\t\t}\n\n\t\treturn table;\n\t}\n\n\tbuildSelectQuery({\n\t\twithList,\n\t\tfields,\n\t\tfieldsFlat,\n\t\twhere,\n\t\thaving,\n\t\ttable,\n\t\tjoins,\n\t\torderBy,\n\t\tgroupBy,\n\t\tlimit,\n\t\toffset,\n\t\tdistinct,\n\t\tsetOperators,\n\t}: SQLiteSelectConfig): SQL {\n\t\tconst fieldsList = fieldsFlat ?? orderSelectedFields<SQLiteColumn>(fields);\n\t\tfor (const f of fieldsList) {\n\t\t\tif (\n\t\t\t\tis(f.field, Column)\n\t\t\t\t&& getTableName(f.field.table)\n\t\t\t\t\t!== (is(table, Subquery)\n\t\t\t\t\t\t? table._.alias\n\t\t\t\t\t\t: is(table, SQLiteViewBase)\n\t\t\t\t\t\t? table[ViewBaseConfig].name\n\t\t\t\t\t\t: is(table, SQL)\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: getTableName(table))\n\t\t\t\t&& !((table) =>\n\t\t\t\t\tjoins?.some(\n\t\t\t\t\t\t({ alias }) =>\n\t\t\t\t\t\t\talias\n\t\t\t\t\t\t\t\t=== (table[Table.Symbol.IsAlias]\n\t\t\t\t\t\t\t\t\t? getTableName(table)\n\t\t\t\t\t\t\t\t\t: table[Table.Symbol.BaseName]),\n\t\t\t\t\t))(f.field.table)\n\t\t\t) {\n\t\t\t\tconst tableName = getTableName(f.field.table);\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Your \"${\n\t\t\t\t\t\tf.path.join(\n\t\t\t\t\t\t\t'->',\n\t\t\t\t\t\t)\n\t\t\t\t\t}\" field references a column \"${tableName}\".\"${f.field.name}\", but the table \"${tableName}\" is not part of the query! Did you forget to join it?`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst isSingleTable = !joins || joins.length === 0;\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst distinctSql = distinct ? sql` distinct` : undefined;\n\n\t\tconst selection = this.buildSelection(fieldsList, { isSingleTable });\n\n\t\tconst tableSql = this.buildFromTable(table);\n\n\t\tconst joinsSql = this.buildJoins(joins);\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst havingSql = having ? sql` having ${having}` : undefined;\n\n\t\tconst groupByList: (SQL | AnyColumn | SQL.Aliased)[] = [];\n\t\tif (groupBy) {\n\t\t\tfor (const [index, groupByValue] of groupBy.entries()) {\n\t\t\t\tgroupByList.push(groupByValue);\n\n\t\t\t\tif (index < groupBy.length - 1) {\n\t\t\t\t\tgroupByList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst groupBySql = groupByList.length > 0\n\t\t\t? sql` group by ${sql.join(groupByList)}`\n\t\t\t: undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\tconst finalQuery =\n\t\t\tsql`${withSql}select${distinctSql} ${selection} from ${tableSql}${joinsSql}${whereSql}${groupBySql}${havingSql}${orderBySql}${limitSql}${offsetSql}`;\n\n\t\tif (setOperators.length > 0) {\n\t\t\treturn this.buildSetOperations(finalQuery, setOperators);\n\t\t}\n\n\t\treturn finalQuery;\n\t}\n\n\tbuildSetOperations(\n\t\tleftSelect: SQL,\n\t\tsetOperators: SQLiteSelectConfig['setOperators'],\n\t): SQL {\n\t\tconst [setOperator, ...rest] = setOperators;\n\n\t\tif (!setOperator) {\n\t\t\tthrow new Error('Cannot pass undefined values to any set operator');\n\t\t}\n\n\t\tif (rest.length === 0) {\n\t\t\treturn this.buildSetOperationQuery({ leftSelect, setOperator });\n\t\t}\n\n\t\t// Some recursive magic here\n\t\treturn this.buildSetOperations(\n\t\t\tthis.buildSetOperationQuery({ leftSelect, setOperator }),\n\t\t\trest,\n\t\t);\n\t}\n\n\tbuildSetOperationQuery({\n\t\tleftSelect,\n\t\tsetOperator: { type, isAll, rightSelect, limit, orderBy, offset },\n\t}: {\n\t\tleftSelect: SQL;\n\t\tsetOperator: SQLiteSelectConfig['setOperators'][number];\n\t}): SQL {\n\t\t// SQLite doesn't support parenthesis in set operations\n\t\tconst leftChunk = sql`${leftSelect.getSQL()} `;\n\t\tconst rightChunk = sql`${rightSelect.getSQL()}`;\n\n\t\tlet orderBySql;\n\t\tif (orderBy && orderBy.length > 0) {\n\t\t\tconst orderByValues: (SQL<unknown> | Name)[] = [];\n\n\t\t\t// The next bit is necessary because the sql operator replaces ${table.column} with `table`.`column`\n\t\t\t// which is invalid Sql syntax, Table from one of the SELECTs cannot be used in global ORDER clause\n\t\t\tfor (const singleOrderBy of orderBy) {\n\t\t\t\tif (is(singleOrderBy, SQLiteColumn)) {\n\t\t\t\t\torderByValues.push(sql.identifier(singleOrderBy.name));\n\t\t\t\t} else if (is(singleOrderBy, SQL)) {\n\t\t\t\t\tfor (let i = 0; i < singleOrderBy.queryChunks.length; i++) {\n\t\t\t\t\t\tconst chunk = singleOrderBy.queryChunks[i];\n\n\t\t\t\t\t\tif (is(chunk, SQLiteColumn)) {\n\t\t\t\t\t\t\tsingleOrderBy.queryChunks[i] = sql.identifier(\n\t\t\t\t\t\t\t\tthis.casing.getColumnCasing(chunk),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\torderByValues.push(sql`${singleOrderBy}`);\n\t\t\t\t} else {\n\t\t\t\t\torderByValues.push(sql`${singleOrderBy}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\torderBySql = sql` order by ${sql.join(orderByValues, sql`, `)}`;\n\t\t}\n\n\t\tconst limitSql = typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\n\t\tconst operatorChunk = sql.raw(`${type} ${isAll ? 'all ' : ''}`);\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\treturn sql`${leftChunk}${operatorChunk}${rightChunk}${orderBySql}${limitSql}${offsetSql}`;\n\t}\n\n\tbuildInsertQuery({\n\t\ttable,\n\t\tvalues: valuesOrSelect,\n\t\tonConflict,\n\t\treturning,\n\t\twithList,\n\t\tselect,\n\t}: SQLiteInsertConfig): SQL {\n\t\t// const isSingleValue = values.length === 1;\n\t\tconst valuesSqlList: ((SQLChunk | SQL)[] | SQL)[] = [];\n\t\tconst columns: Record<string, SQLiteColumn> = table[Table.Symbol.Columns];\n\n\t\tconst colEntries: [string, SQLiteColumn][] = Object.entries(columns).filter(\n\t\t\t([_, col]) => !col.shouldDisableInsert(),\n\t\t);\n\t\tconst insertOrder = colEntries.map(([, column]) => sql.identifier(this.casing.getColumnCasing(column)));\n\n\t\tif (select) {\n\t\t\tconst select = valuesOrSelect as AnySQLiteSelectQueryBuilder | SQL;\n\n\t\t\tif (is(select, SQL)) {\n\t\t\t\tvaluesSqlList.push(select);\n\t\t\t} else {\n\t\t\t\tvaluesSqlList.push(select.getSQL());\n\t\t\t}\n\t\t} else {\n\t\t\tconst values = valuesOrSelect as Record<string, Param | SQL>[];\n\t\t\tvaluesSqlList.push(sql.raw('values '));\n\n\t\t\tfor (const [valueIndex, value] of values.entries()) {\n\t\t\t\tconst valueList: (SQLChunk | SQL)[] = [];\n\t\t\t\tfor (const [fieldName, col] of colEntries) {\n\t\t\t\t\tconst colValue = value[fieldName];\n\t\t\t\t\tif (\n\t\t\t\t\t\tcolValue === undefined\n\t\t\t\t\t\t|| (is(colValue, Param) && colValue.value === undefined)\n\t\t\t\t\t) {\n\t\t\t\t\t\tlet defaultValue;\n\t\t\t\t\t\tif (col.default !== null && col.default !== undefined) {\n\t\t\t\t\t\t\tdefaultValue = is(col.default, SQL)\n\t\t\t\t\t\t\t\t? col.default\n\t\t\t\t\t\t\t\t: sql.param(col.default, col);\n\t\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\t} else if (col.defaultFn !== undefined) {\n\t\t\t\t\t\t\tconst defaultFnResult = col.defaultFn();\n\t\t\t\t\t\t\tdefaultValue = is(defaultFnResult, SQL)\n\t\t\t\t\t\t\t\t? defaultFnResult\n\t\t\t\t\t\t\t\t: sql.param(defaultFnResult, col);\n\t\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\t} else if (!col.default && col.onUpdateFn !== undefined) {\n\t\t\t\t\t\t\tconst onUpdateFnResult = col.onUpdateFn();\n\t\t\t\t\t\t\tdefaultValue = is(onUpdateFnResult, SQL)\n\t\t\t\t\t\t\t\t? onUpdateFnResult\n\t\t\t\t\t\t\t\t: sql.param(onUpdateFnResult, col);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdefaultValue = sql`null`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvalueList.push(defaultValue);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalueList.push(colValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvaluesSqlList.push(valueList);\n\t\t\t\tif (valueIndex < values.length - 1) {\n\t\t\t\t\tvaluesSqlList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst valuesSql = sql.join(valuesSqlList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst onConflictSql = onConflict?.length ? sql.join(onConflict) : undefined;\n\n\t\t// if (isSingleValue && valuesSqlList.length === 0){\n\t\t// \treturn sql`insert into ${table} default values ${onConflictSql}${returningSql}`;\n\t\t// }\n\n\t\treturn sql`${withSql}insert into ${table} ${insertOrder} ${valuesSql}${onConflictSql}${returningSql}`;\n\t}\n\n\tsqlToQuery(sql: SQL, invokeSource?: 'indexes' | undefined): QueryWithTypings {\n\t\treturn sql.toQuery({\n\t\t\tcasing: this.casing,\n\t\t\tescapeName: this.escapeName,\n\t\t\tescapeParam: this.escapeParam,\n\t\t\tescapeString: this.escapeString,\n\t\t\tinvokeSource,\n\t\t});\n\t}\n\n\t/** @deprecated */\n\t_buildRelationalQuery({\n\t\tfullSchema,\n\t\tschema,\n\t\ttableNamesMap,\n\t\ttable,\n\t\ttableConfig,\n\t\tqueryConfig: config,\n\t\ttableAlias,\n\t\tnestedQueryRelation,\n\t\tjoinOn,\n\t}: {\n\t\tfullSchema: Record<string, unknown>;\n\t\tschema: V1.TablesRelationalConfig;\n\t\ttableNamesMap: Record<string, string>;\n\t\ttable: SQLiteTable;\n\t\ttableConfig: V1.TableRelationalConfig;\n\t\tqueryConfig: true | V1.DBQueryConfig<'many', true>;\n\t\ttableAlias: string;\n\t\tnestedQueryRelation?: V1.Relation;\n\t\tjoinOn?: SQL;\n\t}): V1.BuildRelationalQueryResult<SQLiteTable, SQLiteColumn> {\n\t\tlet selection: V1.BuildRelationalQueryResult<\n\t\t\tSQLiteTable,\n\t\t\tSQLiteColumn\n\t\t>['selection'] = [];\n\t\tlet limit,\n\t\t\toffset,\n\t\t\torderBy: SQLiteSelectConfig['orderBy'] = [],\n\t\t\twhere;\n\t\tconst joins: SQLiteSelectJoinConfig[] = [];\n\n\t\tif (config === true) {\n\t\t\tconst selectionEntries = Object.entries(tableConfig.columns);\n\t\t\tselection = selectionEntries.map(([key, value]) => ({\n\t\t\t\tdbKey: value.name,\n\t\t\t\ttsKey: key,\n\t\t\t\tfield: aliasedTableColumn(value as SQLiteColumn, tableAlias),\n\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\tisJson: false,\n\t\t\t\tselection: [],\n\t\t\t}));\n\t\t} else {\n\t\t\tconst aliasedColumns = Object.fromEntries(\n\t\t\t\tObject.entries(tableConfig.columns).map(([key, value]) => [\n\t\t\t\t\tkey,\n\t\t\t\t\taliasedTableColumn(value, tableAlias),\n\t\t\t\t]),\n\t\t\t);\n\n\t\t\tif (config.where) {\n\t\t\t\tconst whereSql = typeof config.where === 'function'\n\t\t\t\t\t? config.where(aliasedColumns, V1.getOperators())\n\t\t\t\t\t: config.where;\n\t\t\t\twhere = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);\n\t\t\t}\n\n\t\t\tconst fieldsSelection: {\n\t\t\t\ttsKey: string;\n\t\t\t\tvalue: SQLiteColumn | SQL.Aliased;\n\t\t\t}[] = [];\n\t\t\tlet selectedColumns: string[] = [];\n\n\t\t\t// Figure out which columns to select\n\t\t\tif (config.columns) {\n\t\t\t\tlet isIncludeMode = false;\n\n\t\t\t\tfor (const [field, value] of Object.entries(config.columns)) {\n\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (field in tableConfig.columns) {\n\t\t\t\t\t\tif (!isIncludeMode && value === true) {\n\t\t\t\t\t\t\tisIncludeMode = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tselectedColumns.push(field);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (selectedColumns.length > 0) {\n\t\t\t\t\tselectedColumns = isIncludeMode\n\t\t\t\t\t\t? selectedColumns.filter((c) => config.columns?.[c] === true)\n\t\t\t\t\t\t: Object.keys(tableConfig.columns).filter(\n\t\t\t\t\t\t\t(key) => !selectedColumns.includes(key),\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Select all columns if selection is not specified\n\t\t\t\tselectedColumns = Object.keys(tableConfig.columns);\n\t\t\t}\n\n\t\t\tfor (const field of selectedColumns) {\n\t\t\t\tconst column = tableConfig.columns[field]! as SQLiteColumn;\n\t\t\t\tfieldsSelection.push({ tsKey: field, value: column });\n\t\t\t}\n\n\t\t\tlet selectedRelations: {\n\t\t\t\ttsKey: string;\n\t\t\t\tqueryConfig: true | V1.DBQueryConfig<'many', false>;\n\t\t\t\trelation: V1.Relation;\n\t\t\t}[] = [];\n\n\t\t\t// Figure out which relations to select\n\t\t\tif (config.with) {\n\t\t\t\tselectedRelations = Object.entries(config.with)\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\tentry,\n\t\t\t\t\t\t): entry is [(typeof entry)[0], NonNullable<(typeof entry)[1]>] => !!entry[1],\n\t\t\t\t\t)\n\t\t\t\t\t.map(([tsKey, queryConfig]) => ({\n\t\t\t\t\t\ttsKey,\n\t\t\t\t\t\tqueryConfig,\n\t\t\t\t\t\trelation: tableConfig.relations[tsKey]!,\n\t\t\t\t\t}));\n\t\t\t}\n\n\t\t\tlet extras;\n\n\t\t\t// Figure out which extras to select\n\t\t\tif (config.extras) {\n\t\t\t\textras = typeof config.extras === 'function'\n\t\t\t\t\t? config.extras(aliasedColumns, { sql })\n\t\t\t\t\t: config.extras;\n\t\t\t\tfor (const [tsKey, value] of Object.entries(extras)) {\n\t\t\t\t\tfieldsSelection.push({\n\t\t\t\t\t\ttsKey,\n\t\t\t\t\t\tvalue: mapColumnsInAliasedSQLToAlias(value, tableAlias),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Transform `fieldsSelection` into `selection`\n\t\t\t// `fieldsSelection` shouldn't be used after this point\n\t\t\tfor (const { tsKey, value } of fieldsSelection) {\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: is(value, SQL.Aliased)\n\t\t\t\t\t\t? value.fieldAlias\n\t\t\t\t\t\t: tableConfig.columns[tsKey]!.name,\n\t\t\t\t\ttsKey,\n\t\t\t\t\tfield: is(value, Column)\n\t\t\t\t\t\t? aliasedTableColumn(value, tableAlias)\n\t\t\t\t\t\t: value,\n\t\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\t\tisJson: false,\n\t\t\t\t\tselection: [],\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet orderByOrig = typeof config.orderBy === 'function'\n\t\t\t\t? config.orderBy(aliasedColumns, V1.getOrderByOperators())\n\t\t\t\t: (config.orderBy ?? []);\n\t\t\tif (!Array.isArray(orderByOrig)) {\n\t\t\t\torderByOrig = [orderByOrig];\n\t\t\t}\n\t\t\torderBy = orderByOrig.map((orderByValue) => {\n\t\t\t\tif (is(orderByValue, Column)) {\n\t\t\t\t\treturn aliasedTableColumn(orderByValue, tableAlias) as SQLiteColumn;\n\t\t\t\t}\n\t\t\t\treturn mapColumnsInSQLToAlias(orderByValue, tableAlias);\n\t\t\t});\n\n\t\t\tlimit = config.limit;\n\t\t\toffset = config.offset;\n\n\t\t\t// Process all relations\n\t\t\tfor (\n\t\t\t\tconst {\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tqueryConfig: selectedRelationConfigValue,\n\t\t\t\t\trelation,\n\t\t\t\t} of selectedRelations\n\t\t\t) {\n\t\t\t\tconst normalizedRelation = V1.normalizeRelation(\n\t\t\t\t\tschema,\n\t\t\t\t\ttableNamesMap,\n\t\t\t\t\trelation,\n\t\t\t\t);\n\t\t\t\tconst relationTableName = getTableUniqueName(relation.referencedTable);\n\t\t\t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t\t\t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t\t\t\t// const relationTable = schema[relationTableTsName]!;\n\t\t\t\tconst joinOn = and(\n\t\t\t\t\t...normalizedRelation.fields.map((field, i) =>\n\t\t\t\t\t\teq(\n\t\t\t\t\t\t\taliasedTableColumn(\n\t\t\t\t\t\t\t\tnormalizedRelation.references[i]!,\n\t\t\t\t\t\t\t\trelationTableAlias,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tconst builtRelation = this._buildRelationalQuery({\n\t\t\t\t\tfullSchema,\n\t\t\t\t\tschema,\n\t\t\t\t\ttableNamesMap,\n\t\t\t\t\ttable: fullSchema[relationTableTsName] as SQLiteTable,\n\t\t\t\t\ttableConfig: schema[relationTableTsName]!,\n\t\t\t\t\tqueryConfig: is(relation, V1.One)\n\t\t\t\t\t\t? selectedRelationConfigValue === true\n\t\t\t\t\t\t\t? { limit: 1 }\n\t\t\t\t\t\t\t: { ...selectedRelationConfigValue, limit: 1 }\n\t\t\t\t\t\t: selectedRelationConfigValue,\n\t\t\t\t\ttableAlias: relationTableAlias,\n\t\t\t\t\tjoinOn,\n\t\t\t\t\tnestedQueryRelation: relation,\n\t\t\t\t});\n\t\t\t\tconst field = sql`(${builtRelation.sql})`.as(selectedRelationTsKey);\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: selectedRelationTsKey,\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tfield,\n\t\t\t\t\trelationTableTsKey: relationTableTsName,\n\t\t\t\t\tisJson: true,\n\t\t\t\t\tselection: builtRelation.selection,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (selection.length === 0) {\n\t\t\tthrow new DrizzleError({\n\t\t\t\tmessage:\n\t\t\t\t\t`No fields selected for table \"${tableConfig.tsName}\" (\"${tableAlias}\"). You need to have at least one item in \"columns\", \"with\" or \"extras\". If you need to select all columns, omit the \"columns\" key or set it to undefined.`,\n\t\t\t});\n\t\t}\n\n\t\tlet result;\n\n\t\twhere = and(joinOn, where);\n\n\t\tif (nestedQueryRelation) {\n\t\t\tlet field = sql`json_array(${\n\t\t\t\tsql.join(\n\t\t\t\t\tselection.map(({ field }) =>\n\t\t\t\t\t\tis(field, SQLiteColumn)\n\t\t\t\t\t\t\t? sql.identifier(this.casing.getColumnCasing(field))\n\t\t\t\t\t\t\t: is(field, SQL.Aliased)\n\t\t\t\t\t\t\t? field.sql\n\t\t\t\t\t\t\t: field\n\t\t\t\t\t),\n\t\t\t\t\tsql`, `,\n\t\t\t\t)\n\t\t\t})`;\n\t\t\tif (is(nestedQueryRelation, V1.Many)) {\n\t\t\t\tfield = sql`coalesce(json_group_array(${field}), json_array())`;\n\t\t\t}\n\t\t\tconst nestedSelection = [\n\t\t\t\t{\n\t\t\t\t\tdbKey: 'data',\n\t\t\t\t\ttsKey: 'data',\n\t\t\t\t\tfield: field.as('data'),\n\t\t\t\t\tisJson: true,\n\t\t\t\t\trelationTableTsKey: tableConfig.tsName,\n\t\t\t\t\tselection,\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tconst needsSubquery = limit !== undefined || offset !== undefined || orderBy.length > 0;\n\n\t\t\tif (needsSubquery) {\n\t\t\t\tresult = this.buildSelectQuery({\n\t\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\t\tfields: {},\n\t\t\t\t\tfieldsFlat: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: [],\n\t\t\t\t\t\t\tfield: sql.raw('*'),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\twhere,\n\t\t\t\t\tlimit,\n\t\t\t\t\toffset,\n\t\t\t\t\torderBy,\n\t\t\t\t\tsetOperators: [],\n\t\t\t\t});\n\n\t\t\t\twhere = undefined;\n\t\t\t\tlimit = undefined;\n\t\t\t\toffset = undefined;\n\t\t\t\torderBy = undefined;\n\t\t\t} else {\n\t\t\t\tresult = aliasedTable(table, tableAlias);\n\t\t\t}\n\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: is(result, SQLiteTable)\n\t\t\t\t\t? result\n\t\t\t\t\t: new Subquery(result, {}, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: nestedSelection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column)\n\t\t\t\t\t\t? aliasedTableColumn(field, tableAlias)\n\t\t\t\t\t\t: field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t} else {\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: selection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column)\n\t\t\t\t\t\t? aliasedTableColumn(field, tableAlias)\n\t\t\t\t\t\t: field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\ttableTsKey: tableConfig.tsName,\n\t\t\tsql: result,\n\t\t\tselection,\n\t\t};\n\t}\n\n\tprivate nestedSelectionerror() {\n\t\tthrow new DrizzleError({\n\t\t\tmessage: `Views with nested selections are not supported by the relational query builder`,\n\t\t});\n\t}\n\n\tprivate buildRqbColumn(table: Table | View, column: unknown, key: string) {\n\t\tif (is(column, Column)) {\n\t\t\tconst name = sql`${table}.${sql.identifier(this.casing.getColumnCasing(column))}`;\n\n\t\t\tswitch (column.columnType) {\n\t\t\t\tcase 'SQLiteBigInt':\n\t\t\t\tcase 'SQLiteBlobJson':\n\t\t\t\tcase 'SQLiteBlobBuffer': {\n\t\t\t\t\treturn sql`hex(${name}) as ${sql.identifier(key)}`;\n\t\t\t\t}\n\n\t\t\t\tcase 'SQLiteNumeric':\n\t\t\t\tcase 'SQLiteNumericNumber':\n\t\t\t\tcase 'SQLiteNumericBigInt': {\n\t\t\t\t\treturn sql`cast(${name} as text) as ${sql.identifier(key)}`;\n\t\t\t\t}\n\n\t\t\t\tcase 'SQLiteCustomColumn': {\n\t\t\t\t\treturn sql`${(<SQLiteCustomColumn<any>> column).jsonSelectIdentifier(name, sql)} as ${sql.identifier(key)}`;\n\t\t\t\t}\n\n\t\t\t\tdefault: {\n\t\t\t\t\treturn sql`${name} as ${sql.identifier(key)}`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn sql`${table}.${\n\t\t\tis(column, SQL.Aliased)\n\t\t\t\t? sql.identifier(column.fieldAlias)\n\t\t\t\t: isSQLWrapper(column)\n\t\t\t\t? sql.identifier(key)\n\t\t\t\t: this.nestedSelectionerror()\n\t\t} as ${sql.identifier(key)}`;\n\t}\n\n\tprivate unwrapAllColumns = (\n\t\ttable: Table | View,\n\t\tselection: BuildRelationalQueryResult['selection'],\n\t) => {\n\t\treturn sql.join(\n\t\t\tObject.entries(table[TableColumns]).map(([k, v]) => {\n\t\t\t\tselection.push({\n\t\t\t\t\tkey: k,\n\t\t\t\t\tfield: v as Column | SQL | SQLWrapper | SQL.Aliased,\n\t\t\t\t});\n\n\t\t\t\treturn this.buildRqbColumn(table, v, k);\n\t\t\t}),\n\t\t\tsql`, `,\n\t\t);\n\t};\n\n\tprivate getSelectedTableColumns = (\n\t\ttable: Table | View,\n\t\tcolumns: Record<string, boolean | undefined>,\n\t) => {\n\t\tconst selectedColumns: ColumnWithTSName[] = [];\n\t\tconst columnContainer = table[TableColumns];\n\t\tconst entries = Object.entries(columns);\n\n\t\tlet colSelectionMode: boolean | undefined;\n\t\tfor (const [k, v] of entries) {\n\t\t\tif (v === undefined) continue;\n\t\t\tcolSelectionMode = colSelectionMode || v;\n\n\t\t\tif (v) {\n\t\t\t\tconst column = columnContainer[k]!;\n\n\t\t\t\tselectedColumns.push({\n\t\t\t\t\tcolumn: column as Column | SQL | SQLWrapper | SQL.Aliased,\n\t\t\t\t\ttsName: k,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (colSelectionMode === false) {\n\t\t\tfor (const [k, v] of Object.entries(columnContainer)) {\n\t\t\t\tif (columns[k] === false) continue;\n\n\t\t\t\tselectedColumns.push({\n\t\t\t\t\tcolumn: v as Column | SQL | SQLWrapper | SQL.Aliased | Table,\n\t\t\t\t\ttsName: k,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn selectedColumns;\n\t};\n\n\tprivate buildColumns = (\n\t\ttable: SQLiteTable | SQLiteView,\n\t\tselection: BuildRelationalQueryResult['selection'],\n\t\tparams?: DBQueryConfig<'many'>,\n\t) =>\n\t\tparams?.columns\n\t\t\t? (() => {\n\t\t\t\tconst columnIdentifiers: SQL[] = [];\n\n\t\t\t\tconst selectedColumns = this.getSelectedTableColumns(\n\t\t\t\t\ttable,\n\t\t\t\t\tparams?.columns,\n\t\t\t\t);\n\n\t\t\t\tfor (const { column, tsName } of selectedColumns) {\n\t\t\t\t\tcolumnIdentifiers.push(this.buildRqbColumn(table, column, tsName));\n\t\t\t\t\tselection.push({\n\t\t\t\t\t\tkey: tsName,\n\t\t\t\t\t\tfield: column,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn columnIdentifiers.length\n\t\t\t\t\t? sql.join(columnIdentifiers, sql`, `)\n\t\t\t\t\t: undefined;\n\t\t\t})()\n\t\t\t: this.unwrapAllColumns(table, selection);\n\n\tbuildRelationalQuery({\n\t\tschema,\n\t\ttable,\n\t\ttableConfig,\n\t\tqueryConfig: config,\n\t\trelationWhere,\n\t\tmode,\n\t\tisNested,\n\t\terrorPath,\n\t\tdepth,\n\t\tthroughJoin,\n\t\tjsonb,\n\t}: {\n\t\tschema: TablesRelationalConfig;\n\t\ttable: SQLiteTable | SQLiteView;\n\t\ttableConfig: TableRelationalConfig;\n\t\tqueryConfig?: DBQueryConfig<'many'> | true;\n\t\trelationWhere?: SQL;\n\t\tmode: 'first' | 'many';\n\t\tisNested?: boolean;\n\t\terrorPath?: string;\n\t\tdepth?: number;\n\t\tthroughJoin?: SQL;\n\t\tjsonb: SQL;\n\t}): BuildRelationalQueryResult {\n\t\tconst selection: BuildRelationalQueryResult['selection'] = [];\n\t\tconst isSingle = mode === 'first';\n\t\tconst params = config === true ? undefined : config;\n\t\tconst currentPath = errorPath ?? '';\n\t\tconst currentDepth = depth ?? 0;\n\t\tif (!currentDepth) table = aliasedTable(table, `d${currentDepth}`);\n\n\t\tconst limit = isSingle ? 1 : params?.limit;\n\t\tconst offset = params?.offset;\n\n\t\tconst columns = this.buildColumns(table, selection, params);\n\n\t\tconst where: SQL | undefined = params?.where && relationWhere\n\t\t\t? and(\n\t\t\t\trelationsFilterToSQL(\n\t\t\t\t\ttable,\n\t\t\t\t\tparams.where,\n\t\t\t\t\ttableConfig.relations,\n\t\t\t\t\tschema,\n\t\t\t\t\tthis.casing,\n\t\t\t\t),\n\t\t\t\trelationWhere,\n\t\t\t)\n\t\t\t: params?.where\n\t\t\t? relationsFilterToSQL(\n\t\t\t\ttable,\n\t\t\t\tparams.where,\n\t\t\t\ttableConfig.relations,\n\t\t\t\tschema,\n\t\t\t\tthis.casing,\n\t\t\t)\n\t\t\t: relationWhere;\n\t\tconst order = params?.orderBy\n\t\t\t? relationsOrderToSQL(table, params.orderBy)\n\t\t\t: undefined;\n\t\tconst extras = params?.extras\n\t\t\t? relationExtrasToSQL(table, params.extras)\n\t\t\t: undefined;\n\t\tif (extras) selection.push(...extras.selection);\n\n\t\tconst joins = params\n\t\t\t? (() => {\n\t\t\t\tconst { with: joins } = params as WithContainer;\n\t\t\t\tif (!joins) return;\n\n\t\t\t\tconst withEntries = Object.entries(joins).filter(([_, v]) => v);\n\t\t\t\tif (!withEntries.length) return;\n\n\t\t\t\treturn sql.join(\n\t\t\t\t\twithEntries.map(([k, join]) => {\n\t\t\t\t\t\t// if (is(tableConfig.relations[k]!, AggregatedField)) {\n\t\t\t\t\t\t// \tconst relation = tableConfig.relations[k]!;\n\n\t\t\t\t\t\t// \trelation.onTable(table);\n\t\t\t\t\t\t// \tconst query = relation.getSQL();\n\n\t\t\t\t\t\t// \tselection.push({\n\t\t\t\t\t\t// \t\tkey: k,\n\t\t\t\t\t\t// \t\tfield: relation,\n\t\t\t\t\t\t// \t});\n\n\t\t\t\t\t\t// \treturn sql`(${query}) as ${sql.identifier(k)}`;\n\t\t\t\t\t\t// }\n\n\t\t\t\t\t\tconst relation = tableConfig.relations[k]! as Relation;\n\t\t\t\t\t\tconst isSingle = is(relation, One);\n\t\t\t\t\t\tconst targetTable = aliasedTable(\n\t\t\t\t\t\t\trelation.targetTable,\n\t\t\t\t\t\t\t`d${currentDepth + 1}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst throughTable = relation.throughTable\n\t\t\t\t\t\t\t? aliasedTable(relation.throughTable, `tr${currentDepth}`)\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\tconst { filter, joinCondition } = relationToSQL(\n\t\t\t\t\t\t\tthis.casing,\n\t\t\t\t\t\t\trelation,\n\t\t\t\t\t\t\ttable,\n\t\t\t\t\t\t\ttargetTable,\n\t\t\t\t\t\t\tthroughTable,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst throughJoin = throughTable\n\t\t\t\t\t\t\t? sql` inner join ${getTableAsAliasSQL(throughTable)} on ${joinCondition!}`\n\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\tconst innerQuery = this.buildRelationalQuery({\n\t\t\t\t\t\t\ttable: targetTable as SQLiteTable | SQLiteView,\n\t\t\t\t\t\t\tmode: isSingle ? 'first' : 'many',\n\t\t\t\t\t\t\tschema,\n\t\t\t\t\t\t\tqueryConfig: join as DBQueryConfig,\n\t\t\t\t\t\t\ttableConfig: schema[relation.targetTableName]!,\n\t\t\t\t\t\t\trelationWhere: filter,\n\t\t\t\t\t\t\tisNested: true,\n\t\t\t\t\t\t\terrorPath: `${currentPath.length ? `${currentPath}.` : ''}${k}`,\n\t\t\t\t\t\t\tdepth: currentDepth + 1,\n\t\t\t\t\t\t\tthroughJoin,\n\t\t\t\t\t\t\tjsonb,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tselection.push({\n\t\t\t\t\t\t\tfield: targetTable,\n\t\t\t\t\t\t\tkey: k,\n\t\t\t\t\t\t\tselection: innerQuery.selection,\n\t\t\t\t\t\t\tisArray: !isSingle,\n\t\t\t\t\t\t\tisOptional: ((relation as AnyOne).optional ?? false)\n\t\t\t\t\t\t\t\t|| (join !== true\n\t\t\t\t\t\t\t\t\t&& !!(join as Exclude<typeof join, boolean | undefined>)\n\t\t\t\t\t\t\t\t\t\t.where),\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst jsonColumns = sql.join(\n\t\t\t\t\t\t\tinnerQuery.selection.map((s) => {\n\t\t\t\t\t\t\t\treturn sql`${sql.raw(this.escapeString(s.key))}, ${\n\t\t\t\t\t\t\t\t\ts.selection\n\t\t\t\t\t\t\t\t\t\t? sql`${jsonb}(${sql.identifier(s.key)})`\n\t\t\t\t\t\t\t\t\t\t: sql.identifier(s.key)\n\t\t\t\t\t\t\t\t}`;\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tsql`, `,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst json = isNested ? jsonb : sql`json`;\n\n\t\t\t\t\t\tconst joinQuery = isSingle\n\t\t\t\t\t\t\t? sql`(select ${json}_object(${jsonColumns}) as ${sql.identifier('r')} from (${innerQuery.sql}) as ${\n\t\t\t\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\t\t\t\t't',\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}) as ${sql.identifier(k)}`\n\t\t\t\t\t\t\t: sql`coalesce((select ${json}_group_array(json_object(${jsonColumns})) as ${\n\t\t\t\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\t\t\t\t'r',\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} from (${innerQuery.sql}) as ${sql.identifier('t')}), ${jsonb}_array()) as ${sql.identifier(k)}`;\n\n\t\t\t\t\t\treturn joinQuery;\n\t\t\t\t\t}),\n\t\t\t\t\tsql`, `,\n\t\t\t\t);\n\t\t\t})()\n\t\t\t: undefined;\n\n\t\tconst selectionArr = [columns, extras?.sql, joins].filter(\n\t\t\t(e) => e !== undefined,\n\t\t);\n\t\tif (!selectionArr.length) {\n\t\t\tthrow new DrizzleError({\n\t\t\t\tmessage: `No fields selected for table \"${tableConfig.name}\"${currentPath ? ` (\"${currentPath}\")` : ''}`,\n\t\t\t});\n\t\t}\n\t\tconst selectionSet = sql.join(selectionArr, sql`, `);\n\n\t\tconst query = sql`select ${selectionSet} from ${getTableAsAliasSQL(table)}${throughJoin}${\n\t\t\tsql` where ${where}`.if(\n\t\t\t\twhere,\n\t\t\t)\n\t\t}${sql` order by ${order}`.if(order)}${sql` limit ${limit}`.if(limit !== undefined)}${\n\t\t\tsql` offset ${offset}`.if(\n\t\t\t\toffset !== undefined,\n\t\t\t)\n\t\t}`;\n\n\t\treturn {\n\t\t\tsql: query,\n\t\t\tselection,\n\t\t};\n\t}\n}\n\nexport class SQLiteSyncDialect extends SQLiteDialect {\n\tstatic override readonly [entityKind]: string = 'SQLiteSyncDialect';\n\n\tmigrate(\n\t\tmigrations: MigrationMeta[],\n\t\tsession: SQLiteSession<\n\t\t\t'sync',\n\t\t\tunknown,\n\t\t\tRecord<string, unknown>,\n\t\t\tAnyRelations,\n\t\t\tV1.TablesRelationalConfig\n\t\t>,\n\t\tconfig?: string | Omit<MigrationConfig, 'migrationsFolder'>,\n\t): void | MigratorInitFailResponse {\n\t\tconst migrationsTable = config === undefined\n\t\t\t? '__drizzle_migrations'\n\t\t\t: typeof config === 'string'\n\t\t\t? '__drizzle_migrations'\n\t\t\t: (config.migrationsTable ?? '__drizzle_migrations');\n\n\t\t// Detect DB version and upgrade table schema if needed\n\t\tconst { newDb } = upgradeSyncIfNeeded(migrationsTable, session, migrations);\n\n\t\tif (newDb) {\n\t\t\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\t\tid INTEGER PRIMARY KEY,\n\t\t\t\thash text NOT NULL,\n\t\t\t\tcreated_at numeric,\n\t\t\t\tname text,\n\t\t\t\tapplied_at TEXT\n\t\t\t)`;\n\t\t\tsession.run(migrationTableCreate);\n\t\t}\n\n\t\tconst dbMigrations = session.all<{\n\t\t\tid: number;\n\t\t\thash: string;\n\t\t\tcreated_at: string;\n\t\t\tname: string | null;\n\t\t}>(\n\t\t\tsql`SELECT id, hash, created_at, name FROM ${sql.identifier(migrationsTable)}`,\n\t\t);\n\n\t\tif (typeof config === 'object' && config.init) {\n\t\t\tif (dbMigrations.length) {\n\t\t\t\treturn { exitCode: 'databaseMigrations' as const };\n\t\t\t}\n\n\t\t\tif (migrations.length > 1) {\n\t\t\t\treturn { exitCode: 'localMigrations' as const };\n\t\t\t}\n\n\t\t\tconst [migration] = migrations;\n\n\t\t\tif (!migration) return;\n\n\t\t\tsession.run(\n\t\t\t\tsql`insert into ${\n\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\tmigrationsTable,\n\t\t\t\t\t)\n\t\t\t\t} (\"hash\", \"created_at\", \"name\", \"applied_at\") values(${migration.hash}, ${migration.folderMillis}, ${migration.name}, ${\n\t\t\t\t\tnew Date().toISOString()\n\t\t\t\t})`,\n\t\t\t);\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst migrationsToRun = getMigrationsToRun({\n\t\t\tlocalMigrations: migrations,\n\t\t\tdbMigrations,\n\t\t});\n\t\tsession.run(sql`BEGIN`);\n\n\t\ttry {\n\t\t\tfor (const migration of migrationsToRun) {\n\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\tsession.run(sql.raw(stmt));\n\t\t\t\t}\n\t\t\t\tsession.run(\n\t\t\t\t\tsql`INSERT INTO ${\n\t\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\t\tmigrationsTable,\n\t\t\t\t\t\t)\n\t\t\t\t\t} (\"hash\", \"created_at\", \"name\", \"applied_at\") values(${migration.hash}, ${migration.folderMillis}, ${migration.name}, ${\n\t\t\t\t\t\tnew Date().toISOString()\n\t\t\t\t\t})`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tsession.run(sql`COMMIT`);\n\t\t} catch (e) {\n\t\t\tsession.run(sql`ROLLBACK`);\n\t\t\tthrow e;\n\t\t}\n\t}\n}\n\nexport class SQLiteAsyncDialect extends SQLiteDialect {\n\tstatic override readonly [entityKind]: string = 'SQLiteAsyncDialect';\n\n\tasync migrate(\n\t\tmigrations: MigrationMeta[],\n\t\tdb: BaseSQLiteDatabase<'async', unknown, Record<string, unknown>>,\n\t\tconfig?: string | Omit<MigrationConfig, 'migrationsFolder'>,\n\t): Promise<void | MigratorInitFailResponse> {\n\t\tconst migrationsTable = config === undefined\n\t\t\t? '__drizzle_migrations'\n\t\t\t: typeof config === 'string'\n\t\t\t? '__drizzle_migrations'\n\t\t\t: (config.migrationsTable ?? '__drizzle_migrations');\n\n\t\t// Detect DB version and upgrade table schema if needed\n\t\tconst { newDb } = await upgradeAsyncIfNeeded(\n\t\t\tmigrationsTable,\n\t\t\tdb,\n\t\t\tmigrations,\n\t\t);\n\n\t\tif (newDb) {\n\t\t\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\t\tid INTEGER PRIMARY KEY,\n\t\t\t\thash text NOT NULL,\n\t\t\t\tcreated_at numeric,\n\t\t\t\tname text,\n\t\t\t\tapplied_at TEXT\n\t\t)\n\t\t`;\n\t\t\tawait db.session.run(migrationTableCreate);\n\t\t}\n\n\t\tconst dbMigrations = await db.session.all<{\n\t\t\tid: number;\n\t\t\thash: string;\n\t\t\tcreated_at: string;\n\t\t\tname: string | null;\n\t\t}>(\n\t\t\tsql`SELECT id, hash, created_at, name FROM ${sql.identifier(migrationsTable)};`,\n\t\t);\n\n\t\tif (typeof config === 'object' && config.init) {\n\t\t\tif (dbMigrations.length) {\n\t\t\t\treturn { exitCode: 'databaseMigrations' as const };\n\t\t\t}\n\n\t\t\tif (migrations.length > 1) {\n\t\t\t\treturn { exitCode: 'localMigrations' as const };\n\t\t\t}\n\n\t\t\tconst [migration] = migrations;\n\n\t\t\tif (!migration) return;\n\n\t\t\tawait db.session.run(\n\t\t\t\tsql`insert into ${\n\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\tmigrationsTable,\n\t\t\t\t\t)\n\t\t\t\t} (\"hash\", \"created_at\", \"name\", \"applied_at\") values(${migration.hash}, ${migration.folderMillis}, ${migration.name}, ${\n\t\t\t\t\tnew Date().toISOString()\n\t\t\t\t})`,\n\t\t\t);\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst migrationsToRun = getMigrationsToRun({\n\t\t\tlocalMigrations: migrations,\n\t\t\tdbMigrations,\n\t\t});\n\t\tawait db.session.transaction(async (tx) => {\n\t\t\tfor (const migration of migrationsToRun) {\n\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\tawait tx.run(sql.raw(stmt));\n\t\t\t\t}\n\t\t\t\tawait tx.run(\n\t\t\t\t\tsql`insert into ${\n\t\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\t\tmigrationsTable,\n\t\t\t\t\t\t)\n\t\t\t\t\t} (\"hash\", \"created_at\", \"name\", \"applied_at\") values(${migration.hash}, ${migration.folderMillis}, ${migration.name}, ${\n\t\t\t\t\t\tnew Date().toISOString()\n\t\t\t\t\t})`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n}\n", "import { entityKind, is } from '~/entity.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { ColumnsSelection, SQL } from '~/sql/sql.ts';\nimport type { SQLiteDialectConfig } from '~/sqlite-core/dialect.ts';\nimport { SQLiteDialect, SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\nimport type { WithBuilder } from '~/sqlite-core/subquery.ts';\nimport { WithSubquery } from '~/subquery.ts';\nimport { SQLiteSelectBuilder } from './select.ts';\nimport type { SelectedFields } from './select.types.ts';\n\nexport class QueryBuilder {\n\tstatic readonly [entityKind]: string = 'SQLiteQueryBuilder';\n\n\tprivate dialect: SQLiteDialect | undefined;\n\tprivate dialectConfig: SQLiteDialectConfig | undefined;\n\n\tconstructor(dialect?: SQLiteDialect | SQLiteDialectConfig) {\n\t\tthis.dialect = is(dialect, SQLiteDialect) ? dialect : undefined;\n\t\tthis.dialectConfig = is(dialect, SQLiteDialect) ? undefined : dialect;\n\t}\n\n\t$with: WithBuilder = (alias: string, selection?: ColumnsSelection) => {\n\t\tconst queryBuilder = this;\n\t\tconst as = (\n\t\t\tqb:\n\t\t\t\t| TypedQueryBuilder<ColumnsSelection | undefined>\n\t\t\t\t| SQL\n\t\t\t\t| ((qb: QueryBuilder) => TypedQueryBuilder<ColumnsSelection | undefined> | SQL),\n\t\t) => {\n\t\t\tif (typeof qb === 'function') {\n\t\t\t\tqb = qb(queryBuilder);\n\t\t\t}\n\n\t\t\treturn new Proxy(\n\t\t\t\tnew WithSubquery(\n\t\t\t\t\tqb.getSQL(),\n\t\t\t\t\tselection ?? ('getSelectedFields' in qb ? qb.getSelectedFields() ?? {} : {}) as SelectedFields,\n\t\t\t\t\talias,\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t\t) as any;\n\t\t};\n\t\treturn { as };\n\t};\n\n\twith(...queries: WithSubquery[]) {\n\t\tconst self = this;\n\n\t\tfunction select(): SQLiteSelectBuilder<undefined, 'sync', void, 'qb'>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection, 'sync', void, 'qb'>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields?: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection | undefined, 'sync', void, 'qb'> {\n\t\t\treturn new SQLiteSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: undefined,\n\t\t\t\tdialect: self.getDialect(),\n\t\t\t\twithList: queries,\n\t\t\t});\n\t\t}\n\n\t\tfunction selectDistinct(): SQLiteSelectBuilder<undefined, 'sync', void, 'qb'>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection, 'sync', void, 'qb'>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields?: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection | undefined, 'sync', void, 'qb'> {\n\t\t\treturn new SQLiteSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: undefined,\n\t\t\t\tdialect: self.getDialect(),\n\t\t\t\twithList: queries,\n\t\t\t\tdistinct: true,\n\t\t\t});\n\t\t}\n\n\t\treturn { select, selectDistinct };\n\t}\n\n\tselect(): SQLiteSelectBuilder<undefined, 'sync', void, 'qb'>;\n\tselect<TSelection extends SelectedFields>(\n\t\tfields: TSelection,\n\t): SQLiteSelectBuilder<TSelection, 'sync', void, 'qb'>;\n\tselect<TSelection extends SelectedFields>(\n\t\tfields?: TSelection,\n\t): SQLiteSelectBuilder<TSelection | undefined, 'sync', void, 'qb'> {\n\t\treturn new SQLiteSelectBuilder({ fields: fields ?? undefined, session: undefined, dialect: this.getDialect() });\n\t}\n\n\tselectDistinct(): SQLiteSelectBuilder<undefined, 'sync', void, 'qb'>;\n\tselectDistinct<TSelection extends SelectedFields>(\n\t\tfields: TSelection,\n\t): SQLiteSelectBuilder<TSelection, 'sync', void, 'qb'>;\n\tselectDistinct<TSelection extends SelectedFields>(\n\t\tfields?: TSelection,\n\t): SQLiteSelectBuilder<TSelection | undefined, 'sync', void, 'qb'> {\n\t\treturn new SQLiteSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: undefined,\n\t\t\tdialect: this.getDialect(),\n\t\t\tdistinct: true,\n\t\t});\n\t}\n\n\t// Lazy load dialect to avoid circular dependency\n\tprivate getDialect() {\n\t\tif (!this.dialect) {\n\t\t\tthis.dialect = new SQLiteSyncDialect(this.dialectConfig);\n\t\t}\n\n\t\treturn this.dialect;\n\t}\n}\n", "import { entityKind, is } from '~/entity.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { SelectResultFields } from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { Placeholder, Query, SQLWrapper } from '~/sql/sql.ts';\nimport { Param, SQL, sql } from '~/sql/sql.ts';\nimport type { SQLiteDialect } from '~/sqlite-core/dialect.ts';\nimport type { IndexColumn } from '~/sqlite-core/indexes.ts';\nimport type { SQLitePreparedQuery, SQLiteSession } from '~/sqlite-core/session.ts';\nimport { SQLiteTable } from '~/sqlite-core/table.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport { type InferInsertModel, Table, TableColumns } from '~/table.ts';\nimport { type DrizzleTypeError, haveSameKeys, mapUpdateSet, orderSelectedFields, type Simplify } from '~/utils.ts';\nimport type { AnySQLiteColumn, SQLiteColumn } from '../columns/common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport { QueryBuilder } from './query-builder.ts';\nimport type { SelectedFieldsFlat, SelectedFieldsOrdered } from './select.types.ts';\nimport type { SQLiteUpdateSetSource } from './update.ts';\n\nexport interface SQLiteInsertConfig<TTable extends SQLiteTable = SQLiteTable> {\n\ttable: TTable;\n\tvalues: Record<string, Param | SQL>[] | SQLiteInsertSelectQueryBuilder<TTable> | SQL;\n\twithList?: Subquery[];\n\tonConflict?: SQL[];\n\treturning?: SelectedFieldsOrdered;\n\tselect?: boolean;\n}\n\nexport type SQLiteInsertValue<\n\tTTable extends SQLiteTable,\n\tTModel extends Record<string, any> = InferInsertModel<TTable>,\n> = Simplify<\n\t{\n\t\t[Key in keyof TModel]: TModel[Key] | SQL | Placeholder;\n\t}\n>;\n\nexport type SQLiteInsertSelectQueryBuilder<\n\tTTable extends SQLiteTable,\n\tTModel extends Record<string, any> = InferInsertModel<TTable>,\n> = TypedQueryBuilder<\n\t{ [K in keyof TModel]: AnySQLiteColumn | SQL | SQL.Aliased | TModel[K] }\n>;\n\nexport class SQLiteInsertBuilder<\n\tTTable extends SQLiteTable,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteInsertBuilder';\n\n\tconstructor(\n\t\tprotected table: TTable,\n\t\tprotected session: SQLiteSession<any, any, any, any, any>,\n\t\tprotected dialect: SQLiteDialect,\n\t\tprivate withList?: Subquery[],\n\t) {}\n\n\tvalues(value: SQLiteInsertValue<TTable>): SQLiteInsertBase<TTable, TResultType, TRunResult>;\n\tvalues(values: SQLiteInsertValue<TTable>[]): SQLiteInsertBase<TTable, TResultType, TRunResult>;\n\tvalues(\n\t\tvalues: SQLiteInsertValue<TTable> | SQLiteInsertValue<TTable>[],\n\t): SQLiteInsertBase<TTable, TResultType, TRunResult> {\n\t\tvalues = Array.isArray(values) ? values : [values];\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('values() must be called with at least one value');\n\t\t}\n\t\tconst mappedValues = values.map((entry) => {\n\t\t\tconst result: Record<string, Param | SQL> = {};\n\t\t\tconst cols = this.table[Table.Symbol.Columns];\n\t\t\tfor (const colKey of Object.keys(entry)) {\n\t\t\t\tconst colValue = entry[colKey as keyof typeof entry];\n\t\t\t\tresult[colKey] = is(colValue, SQL) ? colValue : new Param(colValue, cols[colKey]);\n\t\t\t}\n\t\t\treturn result;\n\t\t});\n\n\t\t// if (mappedValues.length > 1 && mappedValues.some((t) => Object.keys(t).length === 0)) {\n\t\t// \tthrow new Error(\n\t\t// \t\t`One of the values you want to insert is empty. In SQLite you can insert only one empty object per statement. For this case Drizzle with use \"INSERT INTO ... DEFAULT VALUES\" syntax`,\n\t\t// \t);\n\t\t// }\n\n\t\treturn new SQLiteInsertBase(this.table, mappedValues, this.session, this.dialect, this.withList);\n\t}\n\n\tselect(\n\t\tselectQuery: (qb: QueryBuilder) => SQLiteInsertSelectQueryBuilder<TTable>,\n\t): SQLiteInsertBase<TTable, TResultType, TRunResult>;\n\tselect(selectQuery: (qb: QueryBuilder) => SQL): SQLiteInsertBase<TTable, TResultType, TRunResult>;\n\tselect(selectQuery: SQL): SQLiteInsertBase<TTable, TResultType, TRunResult>;\n\tselect(selectQuery: SQLiteInsertSelectQueryBuilder<TTable>): SQLiteInsertBase<TTable, TResultType, TRunResult>;\n\tselect(\n\t\tselectQuery:\n\t\t\t| SQL\n\t\t\t| SQLiteInsertSelectQueryBuilder<TTable>\n\t\t\t| ((qb: QueryBuilder) => SQLiteInsertSelectQueryBuilder<TTable> | SQL),\n\t): SQLiteInsertBase<TTable, TResultType, TRunResult> {\n\t\tconst select = typeof selectQuery === 'function' ? selectQuery(new QueryBuilder()) : selectQuery;\n\n\t\tif (\n\t\t\t!is(select, SQL)\n\t\t\t&& !haveSameKeys(this.table[TableColumns], select._.selectedFields)\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t'Insert select error: selected fields are not the same or are in a different order compared to the table definition',\n\t\t\t);\n\t\t}\n\n\t\treturn new SQLiteInsertBase(this.table, select, this.session, this.dialect, this.withList, true);\n\t}\n}\n\nexport type SQLiteInsertWithout<T extends AnySQLiteInsert, TDynamic extends boolean, K extends keyof T & string> =\n\tTDynamic extends true ? T\n\t\t: Omit<\n\t\t\tSQLiteInsertBase<\n\t\t\t\tT['_']['table'],\n\t\t\t\tT['_']['resultType'],\n\t\t\t\tT['_']['runResult'],\n\t\t\t\tT['_']['returning'],\n\t\t\t\tTDynamic,\n\t\t\t\tT['_']['excludedMethods'] | K\n\t\t\t>,\n\t\t\tT['_']['excludedMethods'] | K\n\t\t>;\n\nexport type SQLiteInsertReturning<\n\tT extends AnySQLiteInsert,\n\tTDynamic extends boolean,\n\tTSelectedFields extends SelectedFieldsFlat,\n> = SQLiteInsertWithout<\n\tSQLiteInsertBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tSelectResultFields<TSelectedFields>,\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteInsertReturningAll<\n\tT extends AnySQLiteInsert,\n\tTDynamic extends boolean,\n> = SQLiteInsertWithout<\n\tSQLiteInsertBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tT['_']['table']['$inferSelect'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteInsertOnConflictDoUpdateConfig<T extends AnySQLiteInsert> = {\n\ttarget: IndexColumn | IndexColumn[];\n\t/** @deprecated - use either `targetWhere` or `setWhere` */\n\twhere?: SQL;\n\t// TODO: add tests for targetWhere and setWhere\n\ttargetWhere?: SQL;\n\tsetWhere?: SQL;\n\tset: SQLiteUpdateSetSource<T['_']['table']>;\n};\n\nexport type SQLiteInsertDynamic<T extends AnySQLiteInsert> = SQLiteInsert<\n\tT['_']['table'],\n\tT['_']['resultType'],\n\tT['_']['runResult'],\n\tT['_']['returning']\n>;\n\nexport type SQLiteInsertExecute<T extends AnySQLiteInsert> = T['_']['returning'] extends undefined ? T['_']['runResult']\n\t: T['_']['returning'][];\n\nexport type SQLiteInsertPrepare<T extends AnySQLiteInsert> = SQLitePreparedQuery<\n\t{\n\t\ttype: T['_']['resultType'];\n\t\trun: T['_']['runResult'];\n\t\tall: T['_']['returning'] extends undefined ? DrizzleTypeError<'.all() cannot be used without .returning()'>\n\t\t\t: T['_']['returning'][];\n\t\tget: T['_']['returning'] extends undefined ? DrizzleTypeError<'.get() cannot be used without .returning()'>\n\t\t\t: T['_']['returning'];\n\t\tvalues: T['_']['returning'] extends undefined ? DrizzleTypeError<'.values() cannot be used without .returning()'>\n\t\t\t: any[][];\n\t\texecute: SQLiteInsertExecute<T>;\n\t}\n>;\n\nexport type AnySQLiteInsert = SQLiteInsertBase<any, any, any, any, any, any>;\n\nexport type SQLiteInsert<\n\tTTable extends SQLiteTable = SQLiteTable,\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = unknown,\n\tTReturning = any,\n> = SQLiteInsertBase<TTable, TResultType, TRunResult, TReturning, true, never>;\n\nexport interface SQLiteInsertBase<\n\tTTable extends SQLiteTable,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTReturning = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends\n\tSQLWrapper,\n\tQueryPromise<TReturning extends undefined ? TRunResult : TReturning[]>,\n\tRunnableQuery<TReturning extends undefined ? TRunResult : TReturning[], 'sqlite'>\n{\n\treadonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly table: TTable;\n\t\treadonly resultType: TResultType;\n\t\treadonly runResult: TRunResult;\n\t\treadonly returning: TReturning;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TReturning extends undefined ? TRunResult : TReturning[];\n\t};\n}\n\nexport class SQLiteInsertBase<\n\tTTable extends SQLiteTable,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTReturning = undefined,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<TReturning extends undefined ? TRunResult : TReturning[]>\n\timplements RunnableQuery<TReturning extends undefined ? TRunResult : TReturning[], 'sqlite'>, SQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteInsert';\n\n\t/** @internal */\n\tconfig: SQLiteInsertConfig<TTable>;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tvalues: SQLiteInsertConfig['values'],\n\t\tprivate session: SQLiteSession<any, any, any, any, any>,\n\t\tprivate dialect: SQLiteDialect,\n\t\twithList?: Subquery[],\n\t\tselect?: boolean,\n\t) {\n\t\tsuper();\n\t\tthis.config = { table, values: values as any, withList, select };\n\t}\n\n\t/**\n\t * Adds a `returning` clause to the query.\n\t *\n\t * Calling this method will return the specified fields of the inserted rows. If no fields are specified, all fields will be returned.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert#insert-returning}\n\t *\n\t * @example\n\t * ```ts\n\t * // Insert one row and return all fields\n\t * const insertedCar: Car[] = await db.insert(cars)\n\t * .values({ brand: 'BMW' })\n\t * .returning();\n\t *\n\t * // Insert one row and return only the id\n\t * const insertedCarId: { id: number }[] = await db.insert(cars)\n\t * .values({ brand: 'BMW' })\n\t * .returning({ id: cars.id });\n\t * ```\n\t */\n\treturning(): SQLiteInsertReturningAll<this, TDynamic>;\n\treturning<TSelectedFields extends SelectedFieldsFlat>(\n\t\tfields: TSelectedFields,\n\t): SQLiteInsertReturning<this, TDynamic, TSelectedFields>;\n\treturning(\n\t\tfields: SelectedFieldsFlat = this.config.table[SQLiteTable.Symbol.Columns],\n\t): SQLiteInsertWithout<AnySQLiteInsert, TDynamic, 'returning'> {\n\t\tthis.config.returning = orderSelectedFields<SQLiteColumn>(fields);\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `on conflict do nothing` clause to the query.\n\t *\n\t * Calling this method simply avoids inserting a row as its alternative action.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert#on-conflict-do-nothing}\n\t *\n\t * @param config The `target` and `where` clauses.\n\t *\n\t * @example\n\t * ```ts\n\t * // Insert one row and cancel the insert if there's a conflict\n\t * await db.insert(cars)\n\t * .values({ id: 1, brand: 'BMW' })\n\t * .onConflictDoNothing();\n\t *\n\t * // Explicitly specify conflict target\n\t * await db.insert(cars)\n\t * .values({ id: 1, brand: 'BMW' })\n\t * .onConflictDoNothing({ target: cars.id });\n\t * ```\n\t */\n\tonConflictDoNothing(config: { target?: IndexColumn | IndexColumn[]; where?: SQL } = {}): this {\n\t\tif (!this.config.onConflict) this.config.onConflict = [];\n\n\t\tif (config.target === undefined) {\n\t\t\tthis.config.onConflict.push(sql` on conflict do nothing`);\n\t\t} else {\n\t\t\tconst targetSql = Array.isArray(config.target) ? sql`${config.target}` : sql`${[config.target]}`;\n\t\t\tconst whereSql = config.where ? sql` where ${config.where}` : sql``;\n\t\t\tthis.config.onConflict.push(sql` on conflict ${targetSql} do nothing${whereSql}`);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds an `on conflict do update` clause to the query.\n\t *\n\t * Calling this method will update the existing row that conflicts with the row proposed for insertion as its alternative action.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert#upserts-and-conflicts}\n\t *\n\t * @param config The `target`, `set` and `where` clauses.\n\t *\n\t * @example\n\t * ```ts\n\t * // Update the row if there's a conflict\n\t * await db.insert(cars)\n\t * .values({ id: 1, brand: 'BMW' })\n\t * .onConflictDoUpdate({\n\t * target: cars.id,\n\t * set: { brand: 'Porsche' }\n\t * });\n\t *\n\t * // Upsert with 'where' clause\n\t * await db.insert(cars)\n\t * .values({ id: 1, brand: 'BMW' })\n\t * .onConflictDoUpdate({\n\t * target: cars.id,\n\t * set: { brand: 'newBMW' },\n\t * where: sql`${cars.createdAt} > '2023-01-01'::date`,\n\t * });\n\t * ```\n\t */\n\tonConflictDoUpdate(config: SQLiteInsertOnConflictDoUpdateConfig<this>): this {\n\t\tif (config.where && (config.targetWhere || config.setWhere)) {\n\t\t\tthrow new Error(\n\t\t\t\t'You cannot use both \"where\" and \"targetWhere\"/\"setWhere\" at the same time - \"where\" is deprecated, use \"targetWhere\" or \"setWhere\" instead.',\n\t\t\t);\n\t\t}\n\n\t\tif (!this.config.onConflict) this.config.onConflict = [];\n\n\t\tconst whereSql = config.where ? sql` where ${config.where}` : undefined;\n\t\tconst targetWhereSql = config.targetWhere ? sql` where ${config.targetWhere}` : undefined;\n\t\tconst setWhereSql = config.setWhere ? sql` where ${config.setWhere}` : undefined;\n\t\tconst targetSql = Array.isArray(config.target) ? sql`${config.target}` : sql`${[config.target]}`;\n\t\tconst setSql = this.dialect.buildUpdateSet(this.config.table, mapUpdateSet(this.config.table, config.set));\n\t\tthis.config.onConflict.push(\n\t\t\tsql` on conflict ${targetSql}${targetWhereSql} do update set ${setSql}${whereSql}${setWhereSql}`,\n\t\t);\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildInsertQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\t/** @internal */\n\t_prepare(isOneTimeQuery = true): SQLiteInsertPrepare<this> {\n\t\treturn this.session[isOneTimeQuery ? 'prepareOneTimeQuery' : 'prepareQuery'](\n\t\t\tthis.dialect.sqlToQuery(this.getSQL()),\n\t\t\tthis.config.returning,\n\t\t\tthis.config.returning ? 'all' : 'run',\n\t\t\ttrue,\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\ttype: 'insert',\n\t\t\t\ttables: extractUsedTable(this.config.table),\n\t\t\t},\n\t\t) as SQLiteInsertPrepare<this>;\n\t}\n\n\tprepare(): SQLiteInsertPrepare<this> {\n\t\treturn this._prepare(false);\n\t}\n\n\trun: ReturnType<this['prepare']>['run'] = (placeholderValues) => {\n\t\treturn this._prepare().run(placeholderValues);\n\t};\n\n\tall: ReturnType<this['prepare']>['all'] = (placeholderValues) => {\n\t\treturn this._prepare().all(placeholderValues);\n\t};\n\n\tget: ReturnType<this['prepare']>['get'] = (placeholderValues) => {\n\t\treturn this._prepare().get(placeholderValues);\n\t};\n\n\tvalues: ReturnType<this['prepare']>['values'] = (placeholderValues) => {\n\t\treturn this._prepare().values(placeholderValues);\n\t};\n\n\toverride async execute(): Promise<SQLiteInsertExecute<this>> {\n\t\treturn (this.config.returning ? this.all() : this.run()) as SQLiteInsertExecute<this>;\n\t}\n\n\t$dynamic(): SQLiteInsertDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n", "import type { GetColumnData } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { JoinType, SelectResultFields } from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { Placeholder, Query, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteDialect } from '~/sqlite-core/dialect.ts';\nimport type { SQLitePreparedQuery, SQLiteSession } from '~/sqlite-core/session.ts';\nimport { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { type InferInsertModel, Table } from '~/table.ts';\nimport {\n\ttype DrizzleTypeError,\n\tgetTableLikeName,\n\tmapUpdateSet,\n\torderSelectedFields,\n\ttype UpdateSet,\n\ttype ValueOrArray,\n} from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { SQLiteColumn } from '../columns/common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport { SQLiteViewBase } from '../view-base.ts';\nimport type { SelectedFields, SelectedFieldsOrdered, SQLiteSelectJoinConfig } from './select.types.ts';\n\nexport interface SQLiteUpdateConfig {\n\twhere?: SQL | undefined;\n\tlimit?: number | Placeholder;\n\torderBy?: (SQLiteColumn | SQL | SQL.Aliased)[];\n\tset: UpdateSet;\n\ttable: SQLiteTable;\n\tfrom?: SQLiteTable | Subquery | SQLiteViewBase | SQL;\n\tjoins: SQLiteSelectJoinConfig[];\n\treturning?: SelectedFieldsOrdered;\n\twithList?: Subquery[];\n}\n\nexport type SQLiteUpdateSetSource<\n\tTTable extends SQLiteTable,\n\tTModel extends Record<string, any> = InferInsertModel<TTable>,\n> =\n\t& {\n\t\t[Key in keyof TModel & string]?:\n\t\t\t| GetColumnData<TTable['_']['columns'][Key], 'query'>\n\t\t\t| SQL\n\t\t\t| SQLiteColumn\n\t\t\t| Placeholder\n\t\t\t| undefined;\n\t}\n\t& {};\n\nexport class SQLiteUpdateBuilder<\n\tTTable extends SQLiteTable,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteUpdateBuilder';\n\n\tdeclare readonly _: {\n\t\treadonly table: TTable;\n\t};\n\n\tconstructor(\n\t\tprotected table: TTable,\n\t\tprotected session: SQLiteSession<any, any, any, any, any>,\n\t\tprotected dialect: SQLiteDialect,\n\t\tprivate withList?: Subquery[],\n\t) {}\n\n\tset(\n\t\tvalues: SQLiteUpdateSetSource<TTable>,\n\t): SQLiteUpdateWithout<\n\t\tSQLiteUpdateBase<TTable, TResultType, TRunResult>,\n\t\tfalse,\n\t\t'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin'\n\t> {\n\t\treturn new SQLiteUpdateBase(\n\t\t\tthis.table,\n\t\t\tmapUpdateSet(this.table, values),\n\t\t\tthis.session,\n\t\t\tthis.dialect,\n\t\t\tthis.withList,\n\t\t) as any;\n\t}\n}\n\nexport type SQLiteUpdateWithout<\n\tT extends AnySQLiteUpdate,\n\tTDynamic extends boolean,\n\tK extends keyof T & string,\n> = TDynamic extends true ? T : Omit<\n\tSQLiteUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tT['_']['from'],\n\t\tT['_']['returning'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods'] | K\n\t>,\n\tT['_']['excludedMethods'] | K\n>;\n\nexport type SQLiteUpdateWithJoins<\n\tT extends AnySQLiteUpdate,\n\tTDynamic extends boolean,\n\tTFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL,\n> = TDynamic extends true ? T : Omit<\n\tSQLiteUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tTFrom,\n\t\tT['_']['returning'],\n\t\tTDynamic,\n\t\tExclude<T['_']['excludedMethods'] | 'from', 'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin'>\n\t>,\n\tExclude<T['_']['excludedMethods'] | 'from', 'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin'>\n>;\n\nexport type SQLiteUpdateReturningAll<T extends AnySQLiteUpdate, TDynamic extends boolean> = SQLiteUpdateWithout<\n\tSQLiteUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tT['_']['from'],\n\t\tT['_']['table']['$inferSelect'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteUpdateReturning<\n\tT extends AnySQLiteUpdate,\n\tTDynamic extends boolean,\n\tTSelectedFields extends SelectedFields,\n> = SQLiteUpdateWithout<\n\tSQLiteUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tT['_']['from'],\n\t\tSelectResultFields<TSelectedFields>,\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteUpdateExecute<T extends AnySQLiteUpdate> = T['_']['returning'] extends undefined ? T['_']['runResult']\n\t: T['_']['returning'][];\n\nexport type SQLiteUpdatePrepare<T extends AnySQLiteUpdate> = SQLitePreparedQuery<\n\t{\n\t\ttype: T['_']['resultType'];\n\t\trun: T['_']['runResult'];\n\t\tall: T['_']['returning'] extends undefined ? DrizzleTypeError<'.all() cannot be used without .returning()'>\n\t\t\t: T['_']['returning'][];\n\t\tget: T['_']['returning'] extends undefined ? DrizzleTypeError<'.get() cannot be used without .returning()'>\n\t\t\t: T['_']['returning'];\n\t\tvalues: T['_']['returning'] extends undefined ? DrizzleTypeError<'.values() cannot be used without .returning()'>\n\t\t\t: any[][];\n\t\texecute: SQLiteUpdateExecute<T>;\n\t}\n>;\n\nexport type SQLiteUpdateJoinFn<\n\tT extends AnySQLiteUpdate,\n> = <\n\tTJoinedTable extends SQLiteTable | Subquery | SQLiteViewBase | SQL,\n>(\n\ttable: TJoinedTable,\n\ton:\n\t\t| (\n\t\t\t(\n\t\t\t\tupdateTable: T['_']['table']['_']['columns'],\n\t\t\t\tfrom: T['_']['from'] extends SQLiteTable ? T['_']['from']['_']['columns']\n\t\t\t\t\t: T['_']['from'] extends Subquery | SQLiteViewBase ? T['_']['from']['_']['selectedFields']\n\t\t\t\t\t: never,\n\t\t\t) => SQL | undefined\n\t\t)\n\t\t| SQL\n\t\t| undefined,\n) => T;\n\nexport type SQLiteUpdateDynamic<T extends AnySQLiteUpdate> = SQLiteUpdate<\n\tT['_']['table'],\n\tT['_']['resultType'],\n\tT['_']['runResult'],\n\tT['_']['returning']\n>;\n\nexport type SQLiteUpdate<\n\tTTable extends SQLiteTable = SQLiteTable,\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = any,\n\tTFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined = undefined,\n\tTReturning extends Record<string, unknown> | undefined = Record<string, unknown> | undefined,\n> = SQLiteUpdateBase<TTable, TResultType, TRunResult, TFrom, TReturning, true, never>;\n\nexport type AnySQLiteUpdate = SQLiteUpdateBase<any, any, any, any, any, any, any>;\n\nexport interface SQLiteUpdateBase<\n\tTTable extends SQLiteTable = SQLiteTable,\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = unknown,\n\tTFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined = undefined,\n\tTReturning = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends SQLWrapper, QueryPromise<TReturning extends undefined ? TRunResult : TReturning[]> {\n\treadonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly table: TTable;\n\t\treadonly resultType: TResultType;\n\t\treadonly runResult: TRunResult;\n\t\treadonly from: TFrom;\n\t\treadonly returning: TReturning;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TReturning extends undefined ? TRunResult : TReturning[];\n\t};\n}\n\nexport class SQLiteUpdateBase<\n\tTTable extends SQLiteTable = SQLiteTable,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = unknown,\n\tTFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined = undefined,\n\tTReturning = undefined,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<TReturning extends undefined ? TRunResult : TReturning[]>\n\timplements RunnableQuery<TReturning extends undefined ? TRunResult : TReturning[], 'sqlite'>, SQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteUpdate';\n\n\t/** @internal */\n\tconfig: SQLiteUpdateConfig;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tset: UpdateSet,\n\t\tprivate session: SQLiteSession<any, any, any, any, any>,\n\t\tprivate dialect: SQLiteDialect,\n\t\twithList?: Subquery[],\n\t) {\n\t\tsuper();\n\t\tthis.config = { set, table, withList, joins: [] };\n\t}\n\n\tfrom<TFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL>(\n\t\tsource: TFrom,\n\t): SQLiteUpdateWithJoins<this, TDynamic, TFrom> {\n\t\tthis.config.from = source;\n\t\treturn this as any;\n\t}\n\n\tprivate createJoin<TJoinType extends JoinType>(\n\t\tjoinType: TJoinType,\n\t): SQLiteUpdateJoinFn<this> {\n\t\treturn ((\n\t\t\ttable: SQLiteTable | Subquery | SQLiteViewBase | SQL,\n\t\t\ton: ((updateTable: TTable, from: TFrom) => SQL | undefined) | SQL | undefined,\n\t\t) => {\n\t\t\tconst tableName = getTableLikeName(table);\n\n\t\t\tif (typeof tableName === 'string' && this.config.joins.some((join) => join.alias === tableName)) {\n\t\t\t\tthrow new Error(`Alias \"${tableName}\" is already used in this query`);\n\t\t\t}\n\n\t\t\tif (typeof on === 'function') {\n\t\t\t\tconst from = this.config.from\n\t\t\t\t\t? is(table, SQLiteTable)\n\t\t\t\t\t\t? table[Table.Symbol.Columns]\n\t\t\t\t\t\t: is(table, Subquery)\n\t\t\t\t\t\t? table._.selectedFields\n\t\t\t\t\t\t: is(table, SQLiteViewBase)\n\t\t\t\t\t\t? table[ViewBaseConfig].selectedFields\n\t\t\t\t\t\t: undefined\n\t\t\t\t\t: undefined;\n\t\t\t\ton = on(\n\t\t\t\t\tnew Proxy(\n\t\t\t\t\t\tthis.config.table[Table.Symbol.Columns],\n\t\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t\t) as any,\n\t\t\t\t\tfrom && new Proxy(\n\t\t\t\t\t\tfrom,\n\t\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t\t) as any,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.config.joins.push({ on, table, joinType, alias: tableName });\n\n\t\t\treturn this as any;\n\t\t}) as any;\n\t}\n\n\tleftJoin = this.createJoin('left');\n\n\trightJoin = this.createJoin('right');\n\n\tinnerJoin = this.createJoin('inner');\n\n\tfullJoin = this.createJoin('full');\n\n\t/**\n\t * Adds a 'where' clause to the query.\n\t *\n\t * Calling this method will update only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t *\n\t * @param where the 'where' clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be updated.\n\t *\n\t * ```ts\n\t * // Update all cars with green color\n\t * db.update(cars).set({ color: 'red' })\n\t * .where(eq(cars.color, 'green'));\n\t * // or\n\t * db.update(cars).set({ color: 'red' })\n\t * .where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Update all BMW cars with a green color\n\t * db.update(cars).set({ color: 'red' })\n\t * .where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Update all cars with the green or blue color\n\t * db.update(cars).set({ color: 'red' })\n\t * .where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(where: SQL | undefined): SQLiteUpdateWithout<this, TDynamic, 'where'> {\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\torderBy(\n\t\tbuilder: (updateTable: TTable) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>,\n\t): SQLiteUpdateWithout<this, TDynamic, 'orderBy'>;\n\torderBy(...columns: (SQLiteColumn | SQL | SQL.Aliased)[]): SQLiteUpdateWithout<this, TDynamic, 'orderBy'>;\n\torderBy(\n\t\t...columns:\n\t\t\t| [(updateTable: TTable) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>]\n\t\t\t| (SQLiteColumn | SQL | SQL.Aliased)[]\n\t): SQLiteUpdateWithout<this, TDynamic, 'orderBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst orderBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.table[Table.Symbol.Columns],\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as any,\n\t\t\t);\n\n\t\t\tconst orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t} else {\n\t\t\tconst orderByArray = columns as (SQLiteColumn | SQL | SQL.Aliased)[];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\tlimit(limit: number | Placeholder): SQLiteUpdateWithout<this, TDynamic, 'limit'> {\n\t\tthis.config.limit = limit;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `returning` clause to the query.\n\t *\n\t * Calling this method will return the specified fields of the updated rows. If no fields are specified, all fields will be returned.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update#update-with-returning}\n\t *\n\t * @example\n\t * ```ts\n\t * // Update all cars with the green color and return all fields\n\t * const updatedCars: Car[] = await db.update(cars)\n\t * .set({ color: 'red' })\n\t * .where(eq(cars.color, 'green'))\n\t * .returning();\n\t *\n\t * // Update all cars with the green color and return only their id and brand fields\n\t * const updatedCarsIdsAndBrands: { id: number, brand: string }[] = await db.update(cars)\n\t * .set({ color: 'red' })\n\t * .where(eq(cars.color, 'green'))\n\t * .returning({ id: cars.id, brand: cars.brand });\n\t * ```\n\t */\n\treturning(): SQLiteUpdateReturningAll<this, TDynamic>;\n\treturning<TSelectedFields extends SelectedFields>(\n\t\tfields: TSelectedFields,\n\t): SQLiteUpdateReturning<this, TDynamic, TSelectedFields>;\n\treturning(\n\t\tfields: SelectedFields = this.config.table[SQLiteTable.Symbol.Columns],\n\t): SQLiteUpdateWithout<AnySQLiteUpdate, TDynamic, 'returning'> {\n\t\tthis.config.returning = orderSelectedFields<SQLiteColumn>(fields);\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildUpdateQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\t/** @internal */\n\t_prepare(isOneTimeQuery = true): SQLiteUpdatePrepare<this> {\n\t\treturn this.session[isOneTimeQuery ? 'prepareOneTimeQuery' : 'prepareQuery'](\n\t\t\tthis.dialect.sqlToQuery(this.getSQL()),\n\t\t\tthis.config.returning,\n\t\t\tthis.config.returning ? 'all' : 'run',\n\t\t\ttrue,\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\ttype: 'insert',\n\t\t\t\ttables: extractUsedTable(this.config.table),\n\t\t\t},\n\t\t) as SQLiteUpdatePrepare<this>;\n\t}\n\n\tprepare(): SQLiteUpdatePrepare<this> {\n\t\treturn this._prepare(false);\n\t}\n\n\trun: ReturnType<this['prepare']>['run'] = (placeholderValues) => {\n\t\treturn this._prepare().run(placeholderValues);\n\t};\n\n\tall: ReturnType<this['prepare']>['all'] = (placeholderValues) => {\n\t\treturn this._prepare().all(placeholderValues);\n\t};\n\n\tget: ReturnType<this['prepare']>['get'] = (placeholderValues) => {\n\t\treturn this._prepare().get(placeholderValues);\n\t};\n\n\tvalues: ReturnType<this['prepare']>['values'] = (placeholderValues) => {\n\t\treturn this._prepare().values(placeholderValues);\n\t};\n\n\toverride async execute(): Promise<SQLiteUpdateExecute<this>> {\n\t\treturn (this.config.returning ? this.all() : this.run()) as SQLiteUpdateExecute<this>;\n\t}\n\n\t$dynamic(): SQLiteUpdateDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n", "import { SQLiteDeleteBase } from \"./delete.js\";\nimport { SQLiteSelectBase, SQLiteSelectBuilder, SQLiteSelectQueryBuilderBase, except, intersect, union, unionAll } from \"./select.js\";\nimport { QueryBuilder } from \"./query-builder.js\";\nimport { SQLiteInsertBase, SQLiteInsertBuilder } from \"./insert.js\";\nimport { SQLiteUpdateBase, SQLiteUpdateBuilder } from \"./update.js\";\n\nexport { QueryBuilder, SQLiteDeleteBase, SQLiteInsertBase, SQLiteInsertBuilder, SQLiteSelectBase, SQLiteSelectBuilder, SQLiteSelectQueryBuilderBase, SQLiteUpdateBase, SQLiteUpdateBuilder, except, intersect, union, unionAll };", "import type * as V1 from '~/_relations.ts';\nimport type { Cache } from '~/cache/core/cache.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { AnyRelations, EmptyRelations } from '~/relations.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport { type ColumnsSelection, type SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteAsyncDialect, SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\nimport {\n\tQueryBuilder,\n\tSQLiteDeleteBase,\n\tSQLiteInsertBuilder,\n\tSQLiteSelectBuilder,\n\tSQLiteUpdateBuilder,\n} from '~/sqlite-core/query-builders/index.ts';\nimport type {\n\tDBResult,\n\tResult,\n\tSQLiteSession,\n\tSQLiteTransaction,\n\tSQLiteTransactionConfig,\n} from '~/sqlite-core/session.ts';\nimport type { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { WithSubquery } from '~/subquery.ts';\nimport type { DrizzleTypeError } from '~/utils.ts';\nimport { _RelationalQueryBuilder } from './query-builders/_query.ts';\nimport { SQLiteCountBuilder } from './query-builders/count.ts';\nimport { RelationalQueryBuilder } from './query-builders/query.ts';\nimport { SQLiteRaw } from './query-builders/raw.ts';\nimport type { SelectedFields } from './query-builders/select.types.ts';\nimport type { WithBuilder } from './subquery.ts';\nimport type { SQLiteViewBase } from './view-base.ts';\n\nexport class BaseSQLiteDatabase<\n\tTResultKind extends 'sync' | 'async',\n\tTRunResult,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTRelations extends AnyRelations = EmptyRelations,\n\tTSchema extends V1.TablesRelationalConfig = V1.ExtractTablesWithRelations<TFullSchema>,\n> {\n\tstatic readonly [entityKind]: string = 'BaseSQLiteDatabase';\n\n\tdeclare readonly _: {\n\t\treadonly schema: TSchema | undefined;\n\t\treadonly fullSchema: TFullSchema;\n\t\treadonly tableNamesMap: Record<string, string>;\n\t\treadonly relations: TRelations;\n\t};\n\n\t/** @deprecated */\n\t_query: TFullSchema extends Record<string, never>\n\t\t? DrizzleTypeError<'Seems like the schema generic is missing - did you forget to add it to your DB type?'>\n\t\t: {\n\t\t\t[K in keyof TSchema]: _RelationalQueryBuilder<TResultKind, TFullSchema, TSchema, TSchema[K]>;\n\t\t};\n\n\t// TO-DO: Figure out how to pass DrizzleTypeError without breaking withReplicas\n\tquery: {\n\t\t[K in keyof TRelations]: RelationalQueryBuilder<\n\t\t\tTResultKind,\n\t\t\tTRelations,\n\t\t\tTRelations[K]\n\t\t>;\n\t};\n\n\tconstructor(\n\t\tprivate resultKind: TResultKind,\n\t\t/** @internal */\n\t\treadonly dialect: { sync: SQLiteSyncDialect; async: SQLiteAsyncDialect }[TResultKind],\n\t\t/** @internal */\n\t\treadonly session: SQLiteSession<TResultKind, TRunResult, TFullSchema, TRelations, TSchema>,\n\t\trelations: TRelations,\n\t\t_schema: V1.RelationalSchemaConfig<TSchema> | undefined,\n\t\treadonly rowModeRQB?: boolean,\n\t\treadonly forbidJsonb?: boolean,\n\t) {\n\t\tthis._ = _schema\n\t\t\t? {\n\t\t\t\tschema: _schema.schema,\n\t\t\t\tfullSchema: _schema.fullSchema as TFullSchema,\n\t\t\t\ttableNamesMap: _schema.tableNamesMap,\n\t\t\t\trelations,\n\t\t\t}\n\t\t\t: {\n\t\t\t\tschema: undefined,\n\t\t\t\tfullSchema: {} as TFullSchema,\n\t\t\t\ttableNamesMap: {},\n\t\t\t\trelations,\n\t\t\t};\n\n\t\tthis._query = {} as typeof this['_query'];\n\t\tconst query = this._query as {\n\t\t\t[K in keyof TSchema]: _RelationalQueryBuilder<TResultKind, TFullSchema, TSchema, TSchema[K]>;\n\t\t};\n\t\tif (this._.schema) {\n\t\t\tfor (const [tableName, columns] of Object.entries(this._.schema)) {\n\t\t\t\tquery[tableName as keyof TSchema] = new _RelationalQueryBuilder(\n\t\t\t\t\tresultKind,\n\t\t\t\t\t_schema!.fullSchema,\n\t\t\t\t\tthis._.schema,\n\t\t\t\t\tthis._.tableNamesMap,\n\t\t\t\t\t_schema!.fullSchema[tableName] as SQLiteTable,\n\t\t\t\t\tcolumns,\n\t\t\t\t\tdialect,\n\t\t\t\t\tsession as SQLiteSession<any, any, any, any, any>,\n\t\t\t\t) as typeof query[keyof TSchema];\n\t\t\t}\n\t\t}\n\t\tthis.query = {} as typeof this['query'];\n\t\tfor (const [tableName, relation] of Object.entries(relations)) {\n\t\t\t(this.query as BaseSQLiteDatabase<\n\t\t\t\tTResultKind,\n\t\t\t\tTRunResult,\n\t\t\t\tTSchema,\n\t\t\t\tAnyRelations,\n\t\t\t\tV1.TablesRelationalConfig\n\t\t\t>['query'])[tableName] = new RelationalQueryBuilder(\n\t\t\t\tresultKind,\n\t\t\t\trelations,\n\t\t\t\trelations[relation.name]!.table as SQLiteTable,\n\t\t\t\trelation,\n\t\t\t\tdialect,\n\t\t\t\tsession as SQLiteSession<any, any, any, any, any>,\n\t\t\t\trowModeRQB,\n\t\t\t\tforbidJsonb,\n\t\t\t);\n\t\t}\n\t\tthis.$cache = { invalidate: async (_params: any) => {} };\n\t}\n\n\t/**\n\t * Creates a subquery that defines a temporary named result set as a CTE.\n\t *\n\t * It is useful for breaking down complex queries into simpler parts and for reusing the result set in subsequent parts of the query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#with-clause}\n\t *\n\t * @param alias The alias for the subquery.\n\t *\n\t * Failure to provide an alias will result in a DrizzleTypeError, preventing the subquery from being referenced in other queries.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Create a subquery with alias 'sq' and use it in the select query\n\t * const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42)));\n\t *\n\t * const result = await db.with(sq).select().from(sq);\n\t * ```\n\t *\n\t * To select arbitrary SQL values as fields in a CTE and reference them in other CTEs or in the main query, you need to add aliases to them:\n\t *\n\t * ```ts\n\t * // Select an arbitrary SQL value as a field in a CTE and reference it in the main query\n\t * const sq = db.$with('sq').as(db.select({\n\t * name: sql<string>`upper(${users.name})`.as('name'),\n\t * })\n\t * .from(users));\n\t *\n\t * const result = await db.with(sq).select({ name: sq.name }).from(sq);\n\t * ```\n\t */\n\t$with: WithBuilder = (alias: string, selection?: ColumnsSelection) => {\n\t\tconst self = this;\n\t\tconst as = (\n\t\t\tqb:\n\t\t\t\t| TypedQueryBuilder<ColumnsSelection | undefined>\n\t\t\t\t| SQL\n\t\t\t\t| ((qb: QueryBuilder) => TypedQueryBuilder<ColumnsSelection | undefined> | SQL),\n\t\t) => {\n\t\t\tif (typeof qb === 'function') {\n\t\t\t\tqb = qb(new QueryBuilder(self.dialect));\n\t\t\t}\n\n\t\t\treturn new Proxy(\n\t\t\t\tnew WithSubquery(\n\t\t\t\t\tqb.getSQL(),\n\t\t\t\t\tselection ?? ('getSelectedFields' in qb ? qb.getSelectedFields() ?? {} : {}) as SelectedFields,\n\t\t\t\t\talias,\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t\t);\n\t\t};\n\t\treturn { as };\n\t};\n\n\t$count(\n\t\tsource: SQLiteTable | SQLiteViewBase | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t) {\n\t\treturn new SQLiteCountBuilder({ source, filters, session: this.session });\n\t}\n\n\t/**\n\t * Incorporates a previously defined CTE (using `$with`) into the main query.\n\t *\n\t * This method allows the main query to reference a temporary named result set.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#with-clause}\n\t *\n\t * @param queries The CTEs to incorporate into the main query.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Define a subquery 'sq' as a CTE using $with\n\t * const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42)));\n\t *\n\t * // Incorporate the CTE 'sq' into the main query and select from it\n\t * const result = await db.with(sq).select().from(sq);\n\t * ```\n\t */\n\twith(...queries: WithSubquery[]) {\n\t\tconst self = this;\n\n\t\t/**\n\t\t * Creates a select query.\n\t\t *\n\t\t * Calling this method with no arguments will select all columns from the table. Pass a selection object to specify the columns you want to select.\n\t\t *\n\t\t * Use `.from()` method to specify which table to select from.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/select}\n\t\t *\n\t\t * @param fields The selection object.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Select all columns and all rows from the 'cars' table\n\t\t * const allCars: Car[] = await db.select().from(cars);\n\t\t *\n\t\t * // Select specific columns and all rows from the 'cars' table\n\t\t * const carsIdsAndBrands: { id: number; brand: string }[] = await db.select({\n\t\t * id: cars.id,\n\t\t * brand: cars.brand\n\t\t * })\n\t\t * .from(cars);\n\t\t * ```\n\t\t *\n\t\t * Like in SQL, you can use arbitrary expressions as selection fields, not just table columns:\n\t\t *\n\t\t * ```ts\n\t\t * // Select specific columns along with expression and all rows from the 'cars' table\n\t\t * const carsIdsAndLowerNames: { id: number; lowerBrand: string }[] = await db.select({\n\t\t * id: cars.id,\n\t\t * lowerBrand: sql<string>`lower(${cars.brand})`,\n\t\t * })\n\t\t * .from(cars);\n\t\t * ```\n\t\t */\n\t\tfunction select(): SQLiteSelectBuilder<undefined, TResultKind, TRunResult>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection, TResultKind, TRunResult>;\n\t\tfunction select(\n\t\t\tfields?: SelectedFields,\n\t\t): SQLiteSelectBuilder<SelectedFields | undefined, TResultKind, TRunResult> {\n\t\t\treturn new SQLiteSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: self.session,\n\t\t\t\tdialect: self.dialect,\n\t\t\t\twithList: queries,\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Adds `distinct` expression to the select query.\n\t\t *\n\t\t * Calling this method will return only unique values. When multiple columns are selected, it returns rows with unique combinations of values in these columns.\n\t\t *\n\t\t * Use `.from()` method to specify which table to select from.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t\t *\n\t\t * @param fields The selection object.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Select all unique rows from the 'cars' table\n\t\t * await db.selectDistinct()\n\t\t * .from(cars)\n\t\t * .orderBy(cars.id, cars.brand, cars.color);\n\t\t *\n\t\t * // Select all unique brands from the 'cars' table\n\t\t * await db.selectDistinct({ brand: cars.brand })\n\t\t * .from(cars)\n\t\t * .orderBy(cars.brand);\n\t\t * ```\n\t\t */\n\t\tfunction selectDistinct(): SQLiteSelectBuilder<undefined, TResultKind, TRunResult>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection, TResultKind, TRunResult>;\n\t\tfunction selectDistinct(\n\t\t\tfields?: SelectedFields,\n\t\t): SQLiteSelectBuilder<SelectedFields | undefined, TResultKind, TRunResult> {\n\t\t\treturn new SQLiteSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: self.session,\n\t\t\t\tdialect: self.dialect,\n\t\t\t\twithList: queries,\n\t\t\t\tdistinct: true,\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Creates an update query.\n\t\t *\n\t\t * Calling this method without `.where()` clause will update all rows in a table. The `.where()` clause specifies which rows should be updated.\n\t\t *\n\t\t * Use `.set()` method to specify which values to update.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t\t *\n\t\t * @param table The table to update.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Update all rows in the 'cars' table\n\t\t * await db.update(cars).set({ color: 'red' });\n\t\t *\n\t\t * // Update rows with filters and conditions\n\t\t * await db.update(cars).set({ color: 'red' }).where(eq(cars.brand, 'BMW'));\n\t\t *\n\t\t * // Update with returning clause\n\t\t * const updatedCar: Car[] = await db.update(cars)\n\t\t * .set({ color: 'red' })\n\t\t * .where(eq(cars.id, 1))\n\t\t * .returning();\n\t\t * ```\n\t\t */\n\t\tfunction update<TTable extends SQLiteTable>(table: TTable): SQLiteUpdateBuilder<TTable, TResultKind, TRunResult> {\n\t\t\treturn new SQLiteUpdateBuilder(table, self.session, self.dialect, queries);\n\t\t}\n\n\t\t/**\n\t\t * Creates an insert query.\n\t\t *\n\t\t * Calling this method will create new rows in a table. Use `.values()` method to specify which values to insert.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/insert}\n\t\t *\n\t\t * @param table The table to insert into.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Insert one row\n\t\t * await db.insert(cars).values({ brand: 'BMW' });\n\t\t *\n\t\t * // Insert multiple rows\n\t\t * await db.insert(cars).values([{ brand: 'BMW' }, { brand: 'Porsche' }]);\n\t\t *\n\t\t * // Insert with returning clause\n\t\t * const insertedCar: Car[] = await db.insert(cars)\n\t\t * .values({ brand: 'BMW' })\n\t\t * .returning();\n\t\t * ```\n\t\t */\n\t\tfunction insert<TTable extends SQLiteTable>(into: TTable): SQLiteInsertBuilder<TTable, TResultKind, TRunResult> {\n\t\t\treturn new SQLiteInsertBuilder(into, self.session, self.dialect, queries);\n\t\t}\n\n\t\t/**\n\t\t * Creates a delete query.\n\t\t *\n\t\t * Calling this method without `.where()` clause will delete all rows in a table. The `.where()` clause specifies which rows should be deleted.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t\t *\n\t\t * @param table The table to delete from.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Delete all rows in the 'cars' table\n\t\t * await db.delete(cars);\n\t\t *\n\t\t * // Delete rows with filters and conditions\n\t\t * await db.delete(cars).where(eq(cars.color, 'green'));\n\t\t *\n\t\t * // Delete with returning clause\n\t\t * const deletedCar: Car[] = await db.delete(cars)\n\t\t * .where(eq(cars.id, 1))\n\t\t * .returning();\n\t\t * ```\n\t\t */\n\t\tfunction delete_<TTable extends SQLiteTable>(from: TTable): SQLiteDeleteBase<TTable, TResultKind, TRunResult> {\n\t\t\treturn new SQLiteDeleteBase(from, self.session, self.dialect, queries);\n\t\t}\n\n\t\treturn { select, selectDistinct, update, insert, delete: delete_ };\n\t}\n\n\t/**\n\t * Creates a select query.\n\t *\n\t * Calling this method with no arguments will select all columns from the table. Pass a selection object to specify the columns you want to select.\n\t *\n\t * Use `.from()` method to specify which table to select from.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select}\n\t *\n\t * @param fields The selection object.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all columns and all rows from the 'cars' table\n\t * const allCars: Car[] = await db.select().from(cars);\n\t *\n\t * // Select specific columns and all rows from the 'cars' table\n\t * const carsIdsAndBrands: { id: number; brand: string }[] = await db.select({\n\t * id: cars.id,\n\t * brand: cars.brand\n\t * })\n\t * .from(cars);\n\t * ```\n\t *\n\t * Like in SQL, you can use arbitrary expressions as selection fields, not just table columns:\n\t *\n\t * ```ts\n\t * // Select specific columns along with expression and all rows from the 'cars' table\n\t * const carsIdsAndLowerNames: { id: number; lowerBrand: string }[] = await db.select({\n\t * id: cars.id,\n\t * lowerBrand: sql<string>`lower(${cars.brand})`,\n\t * })\n\t * .from(cars);\n\t * ```\n\t */\n\tselect(): SQLiteSelectBuilder<undefined, TResultKind, TRunResult>;\n\tselect<TSelection extends SelectedFields>(\n\t\tfields: TSelection,\n\t): SQLiteSelectBuilder<TSelection, TResultKind, TRunResult>;\n\tselect(fields?: SelectedFields): SQLiteSelectBuilder<SelectedFields | undefined, TResultKind, TRunResult> {\n\t\treturn new SQLiteSelectBuilder({ fields: fields ?? undefined, session: this.session, dialect: this.dialect });\n\t}\n\n\t/**\n\t * Adds `distinct` expression to the select query.\n\t *\n\t * Calling this method will return only unique values. When multiple columns are selected, it returns rows with unique combinations of values in these columns.\n\t *\n\t * Use `.from()` method to specify which table to select from.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t *\n\t * @param fields The selection object.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all unique rows from the 'cars' table\n\t * await db.selectDistinct()\n\t * .from(cars)\n\t * .orderBy(cars.id, cars.brand, cars.color);\n\t *\n\t * // Select all unique brands from the 'cars' table\n\t * await db.selectDistinct({ brand: cars.brand })\n\t * .from(cars)\n\t * .orderBy(cars.brand);\n\t * ```\n\t */\n\tselectDistinct(): SQLiteSelectBuilder<undefined, TResultKind, TRunResult>;\n\tselectDistinct<TSelection extends SelectedFields>(\n\t\tfields: TSelection,\n\t): SQLiteSelectBuilder<TSelection, TResultKind, TRunResult>;\n\tselectDistinct(\n\t\tfields?: SelectedFields,\n\t): SQLiteSelectBuilder<SelectedFields | undefined, TResultKind, TRunResult> {\n\t\treturn new SQLiteSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: this.session,\n\t\t\tdialect: this.dialect,\n\t\t\tdistinct: true,\n\t\t});\n\t}\n\n\t/**\n\t * Creates an update query.\n\t *\n\t * Calling this method without `.where()` clause will update all rows in a table. The `.where()` clause specifies which rows should be updated.\n\t *\n\t * Use `.set()` method to specify which values to update.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t *\n\t * @param table The table to update.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Update all rows in the 'cars' table\n\t * await db.update(cars).set({ color: 'red' });\n\t *\n\t * // Update rows with filters and conditions\n\t * await db.update(cars).set({ color: 'red' }).where(eq(cars.brand, 'BMW'));\n\t *\n\t * // Update with returning clause\n\t * const updatedCar: Car[] = await db.update(cars)\n\t * .set({ color: 'red' })\n\t * .where(eq(cars.id, 1))\n\t * .returning();\n\t * ```\n\t */\n\tupdate<TTable extends SQLiteTable>(table: TTable): SQLiteUpdateBuilder<TTable, TResultKind, TRunResult> {\n\t\treturn new SQLiteUpdateBuilder(table, this.session, this.dialect);\n\t}\n\n\t$cache: { invalidate: Cache['onMutate'] };\n\n\t/**\n\t * Creates an insert query.\n\t *\n\t * Calling this method will create new rows in a table. Use `.values()` method to specify which values to insert.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert}\n\t *\n\t * @param table The table to insert into.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Insert one row\n\t * await db.insert(cars).values({ brand: 'BMW' });\n\t *\n\t * // Insert multiple rows\n\t * await db.insert(cars).values([{ brand: 'BMW' }, { brand: 'Porsche' }]);\n\t *\n\t * // Insert with returning clause\n\t * const insertedCar: Car[] = await db.insert(cars)\n\t * .values({ brand: 'BMW' })\n\t * .returning();\n\t * ```\n\t */\n\tinsert<TTable extends SQLiteTable>(into: TTable): SQLiteInsertBuilder<TTable, TResultKind, TRunResult> {\n\t\treturn new SQLiteInsertBuilder(into, this.session, this.dialect);\n\t}\n\n\t/**\n\t * Creates a delete query.\n\t *\n\t * Calling this method without `.where()` clause will delete all rows in a table. The `.where()` clause specifies which rows should be deleted.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t *\n\t * @param table The table to delete from.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Delete all rows in the 'cars' table\n\t * await db.delete(cars);\n\t *\n\t * // Delete rows with filters and conditions\n\t * await db.delete(cars).where(eq(cars.color, 'green'));\n\t *\n\t * // Delete with returning clause\n\t * const deletedCar: Car[] = await db.delete(cars)\n\t * .where(eq(cars.id, 1))\n\t * .returning();\n\t * ```\n\t */\n\tdelete<TTable extends SQLiteTable>(from: TTable): SQLiteDeleteBase<TTable, TResultKind, TRunResult> {\n\t\treturn new SQLiteDeleteBase(from, this.session, this.dialect);\n\t}\n\n\trun(query: SQLWrapper | string): DBResult<TResultKind, TRunResult> {\n\t\tconst sequel = typeof query === 'string' ? sql.raw(query) : query.getSQL();\n\t\tif (this.resultKind === 'async') {\n\t\t\treturn new SQLiteRaw(\n\t\t\t\tasync () => this.session.run(sequel),\n\t\t\t\t() => sequel,\n\t\t\t\t'run',\n\t\t\t\tthis.dialect as SQLiteAsyncDialect,\n\t\t\t\tthis.session.extractRawRunValueFromBatchResult.bind(this.session),\n\t\t\t) as DBResult<TResultKind, TRunResult>;\n\t\t}\n\t\treturn this.session.run(sequel) as DBResult<TResultKind, TRunResult>;\n\t}\n\n\tall<T = unknown>(query: SQLWrapper | string): DBResult<TResultKind, T[]> {\n\t\tconst sequel = typeof query === 'string' ? sql.raw(query) : query.getSQL();\n\t\tif (this.resultKind === 'async') {\n\t\t\treturn new SQLiteRaw(\n\t\t\t\tasync () => this.session.all(sequel),\n\t\t\t\t() => sequel,\n\t\t\t\t'all',\n\t\t\t\tthis.dialect as SQLiteAsyncDialect,\n\t\t\t\tthis.session.extractRawAllValueFromBatchResult.bind(this.session),\n\t\t\t) as any;\n\t\t}\n\t\treturn this.session.all(sequel) as DBResult<TResultKind, T[]>;\n\t}\n\n\tget<T = unknown>(query: SQLWrapper | string): DBResult<TResultKind, T> {\n\t\tconst sequel = typeof query === 'string' ? sql.raw(query) : query.getSQL();\n\t\tif (this.resultKind === 'async') {\n\t\t\treturn new SQLiteRaw(\n\t\t\t\tasync () => this.session.get(sequel),\n\t\t\t\t() => sequel,\n\t\t\t\t'get',\n\t\t\t\tthis.dialect as SQLiteAsyncDialect,\n\t\t\t\tthis.session.extractRawGetValueFromBatchResult.bind(this.session),\n\t\t\t) as DBResult<TResultKind, T>;\n\t\t}\n\t\treturn this.session.get(sequel) as DBResult<TResultKind, T>;\n\t}\n\n\tvalues<T extends unknown[] = unknown[]>(query: SQLWrapper | string): DBResult<TResultKind, T[]> {\n\t\tconst sequel = typeof query === 'string' ? sql.raw(query) : query.getSQL();\n\t\tif (this.resultKind === 'async') {\n\t\t\treturn new SQLiteRaw(\n\t\t\t\tasync () => this.session.values(sequel),\n\t\t\t\t() => sequel,\n\t\t\t\t'values',\n\t\t\t\tthis.dialect as SQLiteAsyncDialect,\n\t\t\t\tthis.session.extractRawValuesValueFromBatchResult.bind(this.session),\n\t\t\t) as any;\n\t\t}\n\t\treturn this.session.values(sequel) as DBResult<TResultKind, T[]>;\n\t}\n\n\ttransaction<T>(\n\t\ttransaction: (\n\t\t\ttx: SQLiteTransaction<TResultKind, TRunResult, TFullSchema, TRelations, TSchema>,\n\t\t) => TResultKind extends 'sync'\n\t\t\t? T extends Promise<any> ? DrizzleTypeError<\"Sync drivers can't use async functions in transactions!\"> : T\n\t\t\t: Result<TResultKind, T>,\n\t\tconfig?: SQLiteTransactionConfig,\n\t): Result<TResultKind, T> {\n\t\treturn this.session.transaction(\n\t\t\ttransaction as (\n\t\t\t\ttx: SQLiteTransaction<TResultKind, TRunResult, TFullSchema, TRelations, TSchema>,\n\t\t\t) => Result<TResultKind, T>,\n\t\t\tconfig,\n\t\t);\n\t}\n}\n\nexport type SQLiteWithReplicas<Q> = Q & { $primary: Q; $replicas: Q[] };\n\nexport const withReplicas = <\n\tTResultKind extends 'sync' | 'async',\n\tTRunResult,\n\tTFullSchema extends Record<string, unknown>,\n\tTRelations extends AnyRelations,\n\tTSchema extends V1.TablesRelationalConfig,\n\tQ extends BaseSQLiteDatabase<\n\t\tTResultKind,\n\t\tTRunResult,\n\t\tTFullSchema,\n\t\tTRelations,\n\t\tTSchema extends Record<string, unknown> ? V1.ExtractTablesWithRelations<TFullSchema> : TSchema\n\t>,\n>(\n\tprimary: Q,\n\treplicas: [Q, ...Q[]],\n\tgetReplica: (replicas: Q[]) => Q = () => replicas[Math.floor(Math.random() * replicas.length)]!,\n): SQLiteWithReplicas<Q> => {\n\tconst select: Q['select'] = (...args: []) => getReplica(replicas).select(...args);\n\tconst selectDistinct: Q['selectDistinct'] = (...args: []) => getReplica(replicas).selectDistinct(...args);\n\tconst $count: Q['$count'] = (...args: [any]) => getReplica(replicas).$count(...args);\n\tconst $with: Q['with'] = (...args: []) => getReplica(replicas).with(...args);\n\n\tconst update: Q['update'] = (...args: [any]) => primary.update(...args);\n\tconst insert: Q['insert'] = (...args: [any]) => primary.insert(...args);\n\tconst $delete: Q['delete'] = (...args: [any]) => primary.delete(...args);\n\tconst run: Q['run'] = (...args: [any]) => primary.run(...args);\n\tconst all: Q['all'] = (...args: [any]) => primary.all(...args);\n\tconst get: Q['get'] = (...args: [any]) => primary.get(...args);\n\tconst values: Q['values'] = (...args: [any]) => primary.values(...args);\n\tconst transaction: Q['transaction'] = (...args: [any]) => primary.transaction(...args);\n\n\treturn {\n\t\t...primary,\n\t\tupdate,\n\t\tinsert,\n\t\tdelete: $delete,\n\t\trun,\n\t\tall,\n\t\tget,\n\t\tvalues,\n\t\ttransaction,\n\t\t$primary: primary,\n\t\t$replicas: replicas,\n\t\tselect,\n\t\tselectDistinct,\n\t\t$count,\n\t\twith: $with,\n\t\tget _query() {\n\t\t\treturn getReplica(replicas)._query;\n\t\t},\n\t\tget query() {\n\t\t\treturn getReplica(replicas).query;\n\t\t},\n\t};\n};\n", "import { entityKind } from '~/entity.ts';\nimport type { Table } from '~/table.ts';\nimport type { CacheConfig, WithCacheConfig } from './types.ts';\n\nexport abstract class Cache {\n\tstatic readonly [entityKind]: string = 'Cache';\n\n\tabstract strategy(): 'explicit' | 'all';\n\n\t/**\n\t * Invoked if we should check cache for cached response\n\t * @param sql\n\t * @param tables\n\t */\n\tabstract get(\n\t\tkey: string,\n\t\ttables: string[],\n\t\tisTag: boolean,\n\t\tisAutoInvalidate?: boolean,\n\t): Promise<any[] | undefined>;\n\n\t/**\n\t * Invoked if new query should be inserted to cache\n\t * @param sql\n\t * @param tables\n\t */\n\tabstract put(\n\t\thashedQuery: string,\n\t\tresponse: any,\n\t\ttables: string[],\n\t\tisTag: boolean,\n\t\tconfig?: CacheConfig,\n\t): Promise<void>;\n\n\t/**\n\t * Invoked if insert, update, delete was invoked\n\t * @param tables\n\t */\n\tabstract onMutate(\n\t\tparams: MutationOption,\n\t): Promise<void>;\n}\n\nexport class NoopCache extends Cache {\n\tstatic override readonly [entityKind]: string = 'NoopCache';\n\n\toverride strategy() {\n\t\treturn 'all' as const;\n\t}\n\n\toverride async get(_key: string): Promise<any[] | undefined> {\n\t\treturn undefined;\n\t}\n\toverride async put(\n\t\t_hashedQuery: string,\n\t\t_response: any,\n\t\t_tables: string[],\n\t\t_config?: any,\n\t): Promise<void> {\n\t\t// noop\n\t}\n\toverride async onMutate(_params: MutationOption): Promise<void> {\n\t\t// noop\n\t}\n}\n\n// TODO: one place for all dialects\nexport const strategyFor = async (\n\tquery: string,\n\tparams: any[] | undefined,\n\tqueryMetadata: {\n\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\ttables: string[];\n\t} | undefined,\n\twithCacheConfig?: WithCacheConfig,\n) => {\n\tif (!queryMetadata) return { type: 'skip' as const };\n\n\tconst { type, tables } = queryMetadata;\n\n\tif ((type === 'insert' || type === 'update' || type === 'delete') && tables.length > 0) {\n\t\treturn { type: 'invalidate' as const, tables };\n\t}\n\n\tif (!withCacheConfig) return { type: 'skip' as const };\n\tif (!withCacheConfig.enabled) return { type: 'skip' as const };\n\n\tif (type === 'select') {\n\t\tconst tag = withCacheConfig.tag ?? await hashQuery(query, params);\n\n\t\treturn {\n\t\t\ttype: 'try' as const,\n\t\t\tkey: tag,\n\t\t\tisTag: typeof withCacheConfig.tag !== 'undefined',\n\t\t\tautoInvalidate: withCacheConfig.autoInvalidate,\n\t\t\ttables: queryMetadata.tables,\n\t\t\tconfig: withCacheConfig.config,\n\t\t};\n\t}\n\treturn { type: 'skip' as const };\n};\n\nexport type MutationOption = { tags?: string | string[]; tables?: Table<any> | Table<any>[] | string | string[] };\n\nexport async function hashQuery(sql: string, params?: any[]) {\n\tconst dataToHash = `${sql}-${JSON.stringify(params, (_, v) => typeof v === 'bigint' ? `${v}n` : v)}`;\n\tconst encoder = new TextEncoder();\n\tconst data = encoder.encode(dataToHash);\n\tconst hashBuffer = await crypto.subtle.digest('SHA-256', data);\n\tconst hashArray = [...new Uint8Array(hashBuffer)];\n\tconst hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n\n\treturn hashHex;\n}\n", "import type * as V1 from '~/_relations.ts';\nimport { type Cache, hashQuery, NoopCache } from '~/cache/core/cache.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleError, DrizzleQueryError, TransactionRollbackError } from '~/errors.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { AnyRelations, EmptyRelations } from '~/relations.ts';\nimport type { PreparedQuery } from '~/session.ts';\nimport type { Query, SQL } from '~/sql/sql.ts';\nimport type { SQLiteAsyncDialect, SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\nimport { BaseSQLiteDatabase } from './db.ts';\nimport type { SQLiteRaw } from './query-builders/raw.ts';\nimport type { SelectedFieldsOrdered } from './query-builders/select.types.ts';\n\nexport interface PreparedQueryConfig {\n\ttype: 'sync' | 'async';\n\trun: unknown;\n\tall: unknown;\n\tget: unknown;\n\tvalues: unknown;\n\texecute: unknown;\n}\n\nexport class ExecuteResultSync<T> extends QueryPromise<T> {\n\tstatic override readonly [entityKind]: string = 'ExecuteResultSync';\n\n\tconstructor(private resultCb: () => T) {\n\t\tsuper();\n\t}\n\n\toverride async execute(): Promise<T> {\n\t\treturn this.resultCb();\n\t}\n\n\tsync(): T {\n\t\treturn this.resultCb();\n\t}\n}\n\nexport type ExecuteResult<TType extends 'sync' | 'async', TResult> = TType extends 'async' ? Promise<TResult>\n\t: ExecuteResultSync<TResult>;\n\nexport abstract class SQLitePreparedQuery<T extends PreparedQueryConfig> implements PreparedQuery {\n\tstatic readonly [entityKind]: string = 'PreparedQuery';\n\n\t/** @internal */\n\tjoinsNotNullableMap?: Record<string, boolean>;\n\n\tconstructor(\n\t\tprivate mode: 'sync' | 'async',\n\t\tprivate executeMethod: SQLiteExecuteMethod,\n\t\tprotected query: Query,\n\t\tprivate cache?: Cache,\n\t\t// per query related metadata\n\t\tprivate queryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\t// config that was passed through $withCache\n\t\tprivate cacheConfig?: WithCacheConfig,\n\t) {\n\t\t// it means that no $withCache options were passed and it should be just enabled\n\t\tif (cache && cache.strategy() === 'all' && cacheConfig === undefined) {\n\t\t\tthis.cacheConfig = { enabled: true, autoInvalidate: true };\n\t\t}\n\t\tif (!this.cacheConfig?.enabled) {\n\t\t\tthis.cacheConfig = undefined;\n\t\t}\n\t}\n\n\t/** @internal */\n\tprotected async queryWithCache<T>(\n\t\tqueryString: string,\n\t\tparams: any[],\n\t\tquery: () => Promise<T>,\n\t): Promise<T> {\n\t\tif (this.cache === undefined || is(this.cache, NoopCache) || this.queryMetadata === undefined) {\n\t\t\ttry {\n\t\t\t\treturn await query();\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\t// don't do any mutations, if globally is false\n\t\tif (this.cacheConfig && !this.cacheConfig.enabled) {\n\t\t\ttry {\n\t\t\t\treturn await query();\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\t// For mutate queries, we should query the database, wait for a response, and then perform invalidation\n\t\tif (\n\t\t\t(\n\t\t\t\tthis.queryMetadata.type === 'insert' || this.queryMetadata.type === 'update'\n\t\t\t\t|| this.queryMetadata.type === 'delete'\n\t\t\t) && this.queryMetadata.tables.length > 0\n\t\t) {\n\t\t\ttry {\n\t\t\t\tconst [res] = await Promise.all([\n\t\t\t\t\tquery(),\n\t\t\t\t\tthis.cache.onMutate({ tables: this.queryMetadata.tables }),\n\t\t\t\t]);\n\t\t\t\treturn res;\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\t// don't do any reads if globally disabled\n\t\tif (!this.cacheConfig) {\n\t\t\ttry {\n\t\t\t\treturn await query();\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\tif (this.queryMetadata.type === 'select') {\n\t\t\tconst fromCache = await this.cache.get(\n\t\t\t\tthis.cacheConfig.tag ?? await hashQuery(queryString, params),\n\t\t\t\tthis.queryMetadata.tables,\n\t\t\t\tthis.cacheConfig.tag !== undefined,\n\t\t\t\tthis.cacheConfig.autoInvalidate,\n\t\t\t);\n\t\t\tif (fromCache === undefined) {\n\t\t\t\tlet result;\n\t\t\t\ttry {\n\t\t\t\t\tresult = await query();\n\t\t\t\t} catch (e) {\n\t\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t\t}\n\n\t\t\t\t// put actual key\n\t\t\t\tawait this.cache.put(\n\t\t\t\t\tthis.cacheConfig.tag ?? await hashQuery(queryString, params),\n\t\t\t\t\tresult,\n\t\t\t\t\t// make sure we send tables that were used in a query only if user wants to invalidate it on each write\n\t\t\t\t\tthis.cacheConfig.autoInvalidate ? this.queryMetadata.tables : [],\n\t\t\t\t\tthis.cacheConfig.tag !== undefined,\n\t\t\t\t\tthis.cacheConfig.config,\n\t\t\t\t);\n\t\t\t\t// put flag if we should invalidate or not\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\treturn fromCache as unknown as T;\n\t\t}\n\t\ttry {\n\t\t\treturn await query();\n\t\t} catch (e) {\n\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t}\n\t}\n\n\tgetQuery(): Query {\n\t\treturn this.query;\n\t}\n\n\tabstract run(placeholderValues?: Record<string, unknown>): Result<T['type'], T['run']>;\n\n\tmapRunResult(result: unknown, _isFromBatch?: boolean): unknown {\n\t\treturn result;\n\t}\n\n\tabstract all(placeholderValues?: Record<string, unknown>): Result<T['type'], T['all']>;\n\n\tmapAllResult(_result: unknown, _isFromBatch?: boolean): unknown {\n\t\tthrow new Error('Not implemented');\n\t}\n\n\tabstract get(placeholderValues?: Record<string, unknown>): Result<T['type'], T['get']>;\n\n\tmapGetResult(_result: unknown, _isFromBatch?: boolean): unknown {\n\t\tthrow new Error('Not implemented');\n\t}\n\n\tabstract values(placeholderValues?: Record<string, unknown>): Result<T['type'], T['values']>;\n\n\texecute(placeholderValues?: Record<string, unknown>): ExecuteResult<T['type'], T['execute']> {\n\t\tif (this.mode === 'async') {\n\t\t\treturn this[this.executeMethod](placeholderValues) as ExecuteResult<T['type'], T['execute']>;\n\t\t}\n\t\treturn new ExecuteResultSync(() => this[this.executeMethod](placeholderValues));\n\t}\n\n\tmapResult(response: unknown, isFromBatch?: boolean) {\n\t\tswitch (this.executeMethod) {\n\t\t\tcase 'run': {\n\t\t\t\treturn this.mapRunResult(response, isFromBatch);\n\t\t\t}\n\t\t\tcase 'all': {\n\t\t\t\treturn this.mapAllResult(response, isFromBatch);\n\t\t\t}\n\t\t\tcase 'get': {\n\t\t\t\treturn this.mapGetResult(response, isFromBatch);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** @internal */\n\tabstract isResponseInArrayMode(): boolean;\n}\n\nexport interface SQLiteTransactionConfig {\n\tbehavior?: 'deferred' | 'immediate' | 'exclusive';\n}\n\nexport type SQLiteExecuteMethod = 'run' | 'all' | 'get';\n\nexport abstract class SQLiteSession<\n\tTResultKind extends 'sync' | 'async',\n\tTRunResult,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTRelations extends AnyRelations = EmptyRelations,\n\tTSchema extends V1.TablesRelationalConfig = V1.ExtractTablesWithRelations<TFullSchema>,\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteSession';\n\n\tconstructor(\n\t\t/** @internal */\n\t\treadonly dialect: { sync: SQLiteSyncDialect; async: SQLiteAsyncDialect }[TResultKind],\n\t) {}\n\n\tabstract prepareQuery(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][], mapColumnValue?: (value: unknown) => unknown) => unknown,\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): SQLitePreparedQuery<PreparedQueryConfig & { type: TResultKind }>;\n\n\tprepareOneTimeQuery(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][], mapColumnValue?: (value: unknown) => unknown) => unknown,\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): SQLitePreparedQuery<PreparedQueryConfig & { type: TResultKind }> {\n\t\treturn this.prepareQuery(\n\t\t\tquery,\n\t\t\tfields,\n\t\t\texecuteMethod,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t);\n\t}\n\n\tabstract prepareRelationalQuery(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tcustomResultMapper: (rows: Record<string, unknown>[], mapColumnValue?: (value: unknown) => unknown) => unknown,\n\t): SQLitePreparedQuery<PreparedQueryConfig & { type: TResultKind }>;\n\n\tprepareOneTimeRelationalQuery(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tcustomResultMapper: (rows: Record<string, unknown>[], mapColumnValue?: (value: unknown) => unknown) => unknown,\n\t): SQLitePreparedQuery<PreparedQueryConfig & { type: TResultKind }> {\n\t\treturn this.prepareRelationalQuery(query, fields, executeMethod, customResultMapper);\n\t}\n\n\tabstract transaction<T>(\n\t\ttransaction: (\n\t\t\ttx: SQLiteTransaction<TResultKind, TRunResult, TFullSchema, TRelations, TSchema>,\n\t\t) => Result<TResultKind, T>,\n\t\tconfig?: SQLiteTransactionConfig,\n\t): Result<TResultKind, T>;\n\n\trun(query: SQL): Result<TResultKind, TRunResult> {\n\t\tconst staticQuery = this.dialect.sqlToQuery(query);\n\t\ttry {\n\t\t\treturn this.prepareOneTimeQuery(staticQuery, undefined, 'run', false).run() as Result<TResultKind, TRunResult>;\n\t\t} catch (err) {\n\t\t\tthrow new DrizzleError({ cause: err, message: `Failed to run the query '${staticQuery.sql}'` });\n\t\t}\n\t}\n\n\t/** @internal */\n\textractRawRunValueFromBatchResult(result: unknown) {\n\t\treturn result;\n\t}\n\n\tall<T = unknown>(query: SQL): Result<TResultKind, T[]> {\n\t\treturn this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, 'run', false).all() as Result<\n\t\t\tTResultKind,\n\t\t\tT[]\n\t\t>;\n\t}\n\n\t/** @internal */\n\textractRawAllValueFromBatchResult(_result: unknown): unknown {\n\t\tthrow new Error('Not implemented');\n\t}\n\n\tget<T = unknown>(query: SQL): Result<TResultKind, T> {\n\t\treturn this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, 'run', false).get() as Result<\n\t\t\tTResultKind,\n\t\t\tT\n\t\t>;\n\t}\n\n\t/** @internal */\n\textractRawGetValueFromBatchResult(_result: unknown): unknown {\n\t\tthrow new Error('Not implemented');\n\t}\n\n\tvalues<T extends any[] = unknown[]>(\n\t\tquery: SQL,\n\t): Result<TResultKind, T[]> {\n\t\treturn this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, 'run', false).values() as Result<\n\t\t\tTResultKind,\n\t\t\tT[]\n\t\t>;\n\t}\n\n\tasync count(sql: SQL) {\n\t\tconst result = await this.values(sql) as [[number]];\n\n\t\treturn result[0][0];\n\t}\n\n\t/** @internal */\n\textractRawValuesValueFromBatchResult(_result: unknown): unknown {\n\t\tthrow new Error('Not implemented');\n\t}\n}\n\nexport type Result<TKind extends 'sync' | 'async', TResult> = { sync: TResult; async: Promise<TResult> }[TKind];\n\nexport type DBResult<TKind extends 'sync' | 'async', TResult> = { sync: TResult; async: SQLiteRaw<TResult> }[TKind];\n\nexport abstract class SQLiteTransaction<\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTRelations extends AnyRelations = EmptyRelations,\n\tTSchema extends V1.TablesRelationalConfig = V1.ExtractTablesWithRelations<TFullSchema>,\n> extends BaseSQLiteDatabase<TResultType, TRunResult, TFullSchema, TRelations, TSchema> {\n\tstatic override readonly [entityKind]: string = 'SQLiteTransaction';\n\n\tconstructor(\n\t\tresultType: TResultType,\n\t\tdialect: { sync: SQLiteSyncDialect; async: SQLiteAsyncDialect }[TResultType],\n\t\tsession: SQLiteSession<TResultType, TRunResult, TFullSchema, TRelations, TSchema>,\n\t\tprotected relations: TRelations,\n\t\tprotected schema: {\n\t\t\tfullSchema: Record<string, unknown>;\n\t\t\tschema: TSchema;\n\t\t\ttableNamesMap: Record<string, string>;\n\t\t} | undefined,\n\t\tprotected readonly nestedIndex = 0,\n\t\trowModeRQB?: boolean,\n\t\tforbidJsonb?: boolean,\n\t) {\n\t\tsuper(resultType, dialect, session, relations, schema, rowModeRQB, forbidJsonb);\n\t}\n\n\trollback(): never {\n\t\tthrow new TransactionRollbackError();\n\t}\n}\n", "import { BaseSQLiteDatabase, withReplicas } from \"./db.js\";\nimport { ExecuteResultSync, SQLitePreparedQuery, SQLiteSession, SQLiteTransaction } from \"./session.js\";\nimport { ForeignKey, ForeignKeyBuilder, foreignKey } from \"./foreign-keys.js\";\nimport { UniqueConstraint, UniqueConstraintBuilder, UniqueOnConstraintBuilder, unique, uniqueKeyName } from \"./unique-constraint.js\";\nimport { SQLiteColumn, SQLiteColumnBuilder } from \"./columns/common.js\";\nimport { SQLiteBigInt, SQLiteBigIntBuilder, SQLiteBlobBuffer, SQLiteBlobBufferBuilder, SQLiteBlobJson, SQLiteBlobJsonBuilder, blob } from \"./columns/blob.js\";\nimport { SQLiteCustomColumn, SQLiteCustomColumnBuilder, customType } from \"./columns/custom.js\";\nimport { SQLiteBaseInteger, SQLiteBaseIntegerBuilder, SQLiteBoolean, SQLiteBooleanBuilder, SQLiteInteger, SQLiteIntegerBuilder, SQLiteTimestamp, SQLiteTimestampBuilder, int, integer } from \"./columns/integer.js\";\nimport { SQLiteNumeric, SQLiteNumericBigInt, SQLiteNumericBigIntBuilder, SQLiteNumericBuilder, SQLiteNumericNumber, SQLiteNumericNumberBuilder, numeric } from \"./columns/numeric.js\";\nimport { SQLiteReal, SQLiteRealBuilder, real } from \"./columns/real.js\";\nimport { SQLiteText, SQLiteTextBuilder, SQLiteTextJson, SQLiteTextJsonBuilder, text } from \"./columns/text.js\";\nimport { InlineForeignKeys, SQLiteTable, sqliteTable, sqliteTableCreator } from \"./table.js\";\nimport { PrimaryKey, PrimaryKeyBuilder, primaryKey } from \"./primary-keys.js\";\nimport { Index, IndexBuilder, IndexBuilderOn, index, uniqueIndex } from \"./indexes.js\";\nimport { alias } from \"./alias.js\";\nimport { Check, CheckBuilder, check } from \"./checks.js\";\nimport { SQLiteAsyncDialect, SQLiteDialect, SQLiteSyncDialect } from \"./dialect.js\";\nimport { extractUsedTable, getTableConfig, getViewConfig } from \"./utils.js\";\nimport { SQLiteDeleteBase } from \"./query-builders/delete.js\";\nimport { SQLiteSelectBase, SQLiteSelectBuilder, SQLiteSelectQueryBuilderBase, except, intersect, union, unionAll } from \"./query-builders/select.js\";\nimport { QueryBuilder } from \"./query-builders/query-builder.js\";\nimport { SQLiteInsertBase, SQLiteInsertBuilder } from \"./query-builders/insert.js\";\nimport { SQLiteUpdateBase, SQLiteUpdateBuilder } from \"./query-builders/update.js\";\nimport { ManualViewBuilder, SQLiteView, ViewBuilder, ViewBuilderCore, sqliteView, view } from \"./view.js\";\n\nexport { BaseSQLiteDatabase, Check, CheckBuilder, ExecuteResultSync, ForeignKey, ForeignKeyBuilder, Index, IndexBuilder, IndexBuilderOn, InlineForeignKeys, ManualViewBuilder, PrimaryKey, PrimaryKeyBuilder, QueryBuilder, SQLiteAsyncDialect, SQLiteBaseInteger, SQLiteBaseIntegerBuilder, SQLiteBigInt, SQLiteBigIntBuilder, SQLiteBlobBuffer, SQLiteBlobBufferBuilder, SQLiteBlobJson, SQLiteBlobJsonBuilder, SQLiteBoolean, SQLiteBooleanBuilder, SQLiteColumn, SQLiteColumnBuilder, SQLiteCustomColumn, SQLiteCustomColumnBuilder, SQLiteDeleteBase, SQLiteDialect, SQLiteInsertBase, SQLiteInsertBuilder, SQLiteInteger, SQLiteIntegerBuilder, SQLiteNumeric, SQLiteNumericBigInt, SQLiteNumericBigIntBuilder, SQLiteNumericBuilder, SQLiteNumericNumber, SQLiteNumericNumberBuilder, SQLitePreparedQuery, SQLiteReal, SQLiteRealBuilder, SQLiteSelectBase, SQLiteSelectBuilder, SQLiteSelectQueryBuilderBase, SQLiteSession, SQLiteSyncDialect, SQLiteTable, SQLiteText, SQLiteTextBuilder, SQLiteTextJson, SQLiteTextJsonBuilder, SQLiteTimestamp, SQLiteTimestampBuilder, SQLiteTransaction, SQLiteUpdateBase, SQLiteUpdateBuilder, SQLiteView, UniqueConstraint, UniqueConstraintBuilder, UniqueOnConstraintBuilder, ViewBuilder, ViewBuilderCore, alias, blob, check, customType, except, extractUsedTable, foreignKey, getTableConfig, getViewConfig, index, int, integer, intersect, numeric, primaryKey, real, sqliteTable, sqliteTableCreator, sqliteView, text, union, unionAll, unique, uniqueIndex, uniqueKeyName, view, withReplicas };", "/**\n * Drizzle ORM schema for CLEO brain.db (SQLite via node:sqlite + sqlite-proxy).\n *\n * Tables: brain_decisions, brain_patterns, brain_learnings, brain_memory_links, brain_schema_meta\n * Stores cognitive infrastructure: decisions, patterns, and learnings extracted\n * from CLEO task execution. Cross-references tasks in tasks.db via soft FKs.\n *\n * @epic T5149\n * @task T5127\n */\n\nimport { sql } from 'drizzle-orm';\nimport { index, integer, primaryKey, real, sqliteTable, text } from 'drizzle-orm/sqlite-core';\n\n// === ENUM CONSTANTS ===\n\n/**\n * Memory retention tiers for the tiered cognitive memory model (T549).\n *\n * - `short` \u2014 Session-scoped working context. Volatile; auto-evicted after 48h if not promoted.\n * - `medium` \u2014 Project-scoped verified facts. Retained for weeks; decays if unverified.\n * - `long` \u2014 Architectural bedrock. Permanent; supersession-only eviction.\n *\n * NULL semantics for legacy rows: treat NULL as 'medium' at query time.\n * (Legacy rows survived the T523 purge, so medium is a safe tier assumption.)\n */\nexport const BRAIN_MEMORY_TIERS = ['short', 'medium', 'long'] as const;\n\n/** Discriminated union of all memory retention tiers. */\nexport type BrainMemoryTier = (typeof BRAIN_MEMORY_TIERS)[number];\n\n/**\n * Cognitive type taxonomy for the tiered memory model (T549).\n *\n * Uses `BRAIN_COGNITIVE_TYPES` (not `BRAIN_MEMORY_TYPES`) to avoid collision\n * with the link table enum `BRAIN_MEMORY_TYPES` (which stores entity type names).\n *\n * - `semantic` \u2014 Declarative facts: \"what is true about this project\"\n * \u2192 brain_decisions (always), brain_learnings (default)\n * - `episodic` \u2014 Event records: \"what happened and when\"\n * \u2192 brain_observations (always), brain_learnings (transcript-derived)\n * - `procedural` \u2014 Process knowledge: \"how to do things\"\n * \u2192 brain_patterns (always)\n */\nexport const BRAIN_COGNITIVE_TYPES = ['semantic', 'episodic', 'procedural'] as const;\n\n/** Discriminated union of all cognitive memory types. */\nexport type BrainCognitiveType = (typeof BRAIN_COGNITIVE_TYPES)[number];\n\n/**\n * Source reliability levels for the tiered memory model (T549).\n *\n * Separate dimension from content `quality_score` \u2014 captures source trustworthiness.\n * Each level drives a quality multiplier applied at scoring time.\n *\n * | Level | Meaning | Quality multiplier |\n * |---------------|-----------------------------------------|--------------------|\n * | `owner` | Owner explicitly stated this fact | 1.0 |\n * | `task-outcome`| Verified by completed task with result | 0.90 |\n * | `agent` | Agent-inferred during work (default) | 0.70 |\n * | `speculative` | Agent hypothesis, not yet corroborated | 0.40 |\n */\nexport const BRAIN_SOURCE_CONFIDENCE = ['owner', 'task-outcome', 'agent', 'speculative'] as const;\n\n/** Discriminated union of all source confidence levels. */\nexport type BrainSourceConfidence = (typeof BRAIN_SOURCE_CONFIDENCE)[number];\n\n/** Decision types from ADR-009. */\nexport const BRAIN_DECISION_TYPES = [\n 'architecture',\n 'technical',\n 'process',\n 'strategic',\n 'tactical',\n] as const;\n\n/** Confidence levels for decisions. */\nexport const BRAIN_CONFIDENCE_LEVELS = ['low', 'medium', 'high'] as const;\n\n/** Outcome types for decision tracking. */\nexport const BRAIN_OUTCOME_TYPES = ['success', 'failure', 'mixed', 'pending'] as const;\n\n/** Pattern types for workflow analysis. */\nexport const BRAIN_PATTERN_TYPES = [\n 'workflow',\n 'blocker',\n 'success',\n 'failure',\n 'optimization',\n] as const;\n\n/** Impact levels for patterns. */\nexport const BRAIN_IMPACT_LEVELS = ['low', 'medium', 'high'] as const;\n\n/** Link types for cross-referencing BRAIN entries with tasks. */\nexport const BRAIN_LINK_TYPES = [\n 'produced_by',\n 'applies_to',\n 'informed_by',\n 'contradicts',\n] as const;\n\n/** Observation types for claude-mem compatible observations. */\nexport const BRAIN_OBSERVATION_TYPES = [\n 'discovery',\n 'change',\n 'feature',\n 'bugfix',\n 'decision',\n 'refactor',\n 'diary',\n] as const;\n\n/** Source types for observations (how the observation was created). */\nexport const BRAIN_OBSERVATION_SOURCE_TYPES = [\n 'agent',\n 'session-debrief',\n 'claude-mem',\n 'manual',\n] as const;\n\n/** Memory entity types for the links table. */\nexport const BRAIN_MEMORY_TYPES = ['decision', 'pattern', 'learning', 'observation'] as const;\n\n/** Sticky note status values. */\nexport const BRAIN_STICKY_STATUSES = ['active', 'converted', 'archived'] as const;\n\n/** Sticky note colors. */\nexport const BRAIN_STICKY_COLORS = ['yellow', 'blue', 'green', 'red', 'purple'] as const;\n\n/** Sticky note priority levels. */\nexport const BRAIN_STICKY_PRIORITIES = ['low', 'medium', 'high'] as const;\n\n// === BRAIN_DECISIONS TABLE ===\n\nexport const brainDecisions = sqliteTable(\n 'brain_decisions',\n {\n id: text('id').primaryKey(),\n type: text('type', { enum: BRAIN_DECISION_TYPES }).notNull(),\n decision: text('decision').notNull(),\n rationale: text('rationale').notNull(),\n confidence: text('confidence', { enum: BRAIN_CONFIDENCE_LEVELS }).notNull(),\n outcome: text('outcome', { enum: BRAIN_OUTCOME_TYPES }),\n alternativesJson: text('alternatives_json'),\n contextEpicId: text('context_epic_id'), // soft FK to tasks.id in tasks.db\n contextTaskId: text('context_task_id'), // soft FK to tasks.id in tasks.db\n contextPhase: text('context_phase'),\n /**\n * Quality score: 0.0 (noise) \u2013 1.0 (canonical). Null for legacy entries.\n * Computed at insert time from confidence, content richness, and context.\n * Entries below 0.3 are excluded from search results (T531).\n */\n qualityScore: real('quality_score'),\n createdAt: text('created_at').notNull().default(sql`(datetime('now'))`),\n updatedAt: text('updated_at'),\n\n // T549: Tiered + Typed Memory columns\n\n /**\n * Memory retention tier. NULL on legacy rows \u2192 treat as 'medium' at query time.\n * T746: decisions skip short-tier entirely \u2014 writers always assign 'medium' (see decisions.ts).\n * The Drizzle DEFAULT is 'medium' to match the write-path behaviour.\n */\n memoryTier: text('memory_tier', { enum: BRAIN_MEMORY_TIERS }).default('medium'),\n\n /** Cognitive type. Decisions are always 'semantic' (declarative architectural facts). */\n memoryType: text('memory_type', { enum: BRAIN_COGNITIVE_TYPES }).default('semantic'),\n\n /**\n * Ground-truth verification flag.\n * false = agent-inferred, pending verification.\n * true = confirmed via owner statement, task outcome, corroboration, or manual `cleo memory verify`.\n */\n verified: integer('verified', { mode: 'boolean' }).notNull().default(false),\n\n /**\n * Bitemporal: when this decision became valid (ISO 8601 text).\n * Defaults to creation time. Can be backdated for historical facts.\n */\n validAt: text('valid_at').notNull().default(sql`(datetime('now'))`),\n\n /**\n * Bitemporal: when this decision stopped being valid.\n * NULL = currently valid. Prefer `supersedes` graph edges for decision supersession\n * (ADR-009); this column is a convenience gate for bulk eviction queries.\n */\n invalidAt: text('invalid_at'),\n\n /**\n * Source reliability level \u2014 separate from content quality_score (T549 \u00A73.1.5).\n * Drives quality multiplier at scoring time.\n */\n sourceConfidence: text('source_confidence', { enum: BRAIN_SOURCE_CONFIDENCE }).default('agent'),\n\n /**\n * Number of times this decision has been cited/retrieved (T549 CONFLICT-03).\n * Used by the consolidator for citation-based medium\u2192long promotion.\n */\n citationCount: integer('citation_count').notNull().default(0),\n\n // T726 Wave 1A: tier promotion audit columns\n\n /**\n * ISO 8601 timestamp when this decision was last promoted to a higher tier.\n * Null = never promoted (still at its initial tier).\n * Set by runTierPromotion at the moment of promotion.\n */\n tierPromotedAt: text('tier_promoted_at'),\n\n /**\n * Human-readable reason for the most recent tier promotion.\n * Examples: \"citationCount=5 >= 5, age > 7d\", \"qualityScore=0.82 >= 0.70, age > 24h\".\n * Null = never promoted.\n */\n tierPromotionReason: text('tier_promotion_reason'),\n\n /**\n * SHA-256 prefix (first 16 hex chars) of the normalised decision content.\n * Computed at insert time; used by hashDedupCheck to prevent exact-duplicate decisions.\n * Null on legacy rows (pre-T726).\n */\n contentHash: text('content_hash'),\n },\n (table) => [\n index('idx_brain_decisions_type').on(table.type),\n index('idx_brain_decisions_confidence').on(table.confidence),\n index('idx_brain_decisions_outcome').on(table.outcome),\n index('idx_brain_decisions_context_epic').on(table.contextEpicId),\n index('idx_brain_decisions_context_task').on(table.contextTaskId),\n index('idx_brain_decisions_quality').on(table.qualityScore),\n // T549 indexes\n index('idx_brain_decisions_tier').on(table.memoryTier),\n index('idx_brain_decisions_mem_type').on(table.memoryType),\n index('idx_brain_decisions_verified').on(table.verified),\n index('idx_brain_decisions_valid_at').on(table.validAt),\n index('idx_brain_decisions_source_conf').on(table.sourceConfidence),\n // T726 indexes\n index('idx_brain_decisions_tier_promoted_at').on(table.tierPromotedAt),\n index('idx_brain_decisions_content_hash').on(table.contentHash),\n ],\n);\n\n// === BRAIN_PATTERNS TABLE ===\n\nexport const brainPatterns = sqliteTable(\n 'brain_patterns',\n {\n id: text('id').primaryKey(),\n type: text('type', { enum: BRAIN_PATTERN_TYPES }).notNull(),\n pattern: text('pattern').notNull(),\n context: text('context').notNull(),\n frequency: integer('frequency').notNull().default(1),\n successRate: real('success_rate'),\n impact: text('impact', { enum: BRAIN_IMPACT_LEVELS }),\n antiPattern: text('anti_pattern'),\n mitigation: text('mitigation'),\n examplesJson: text('examples_json').default('[]'),\n extractedAt: text('extracted_at').notNull().default(sql`(datetime('now'))`),\n updatedAt: text('updated_at'),\n /**\n * Quality score: 0.0 (noise) \u2013 1.0 (canonical). Null for legacy entries.\n * Computed at insert time from type, content richness, and examples.\n * Entries below 0.3 are excluded from search results (T531).\n */\n qualityScore: real('quality_score'),\n\n // T549: Tiered + Typed Memory columns\n\n /**\n * Memory retention tier. NULL on legacy rows \u2192 treat as 'medium' at query time.\n * T746: patterns skip short-tier entirely \u2014 writers always assign 'medium' (see patterns.ts).\n * The Drizzle DEFAULT is 'medium' to match the write-path behaviour.\n */\n memoryTier: text('memory_tier', { enum: BRAIN_MEMORY_TIERS }).default('medium'),\n\n /** Cognitive type. Patterns are always 'procedural' (process/workflow knowledge). */\n memoryType: text('memory_type', { enum: BRAIN_COGNITIVE_TYPES }).default('procedural'),\n\n /**\n * Ground-truth verification flag.\n * For patterns, this is complementary to frequency+successRate verification.\n * false = agent-inferred. true = confirmed via owner statement or task outcome.\n */\n verified: integer('verified', { mode: 'boolean' }).notNull().default(false),\n\n /**\n * Bitemporal: when this pattern became valid (ISO 8601 text).\n * Defaults to extraction time.\n */\n validAt: text('valid_at').notNull().default(sql`(datetime('now'))`),\n\n /**\n * Bitemporal: when this pattern stopped being valid.\n * NULL = currently valid. Set by consolidator when frequency+successRate drops below threshold.\n */\n invalidAt: text('invalid_at'),\n\n /**\n * Source reliability level \u2014 separate from content quality_score (T549 \u00A73.1.5).\n * Drives quality multiplier at scoring time.\n */\n sourceConfidence: text('source_confidence', { enum: BRAIN_SOURCE_CONFIDENCE }).default('agent'),\n\n /**\n * Number of times this pattern has been cited/retrieved (T549 CONFLICT-03).\n * Used by the consolidator for citation-based medium\u2192long promotion.\n */\n citationCount: integer('citation_count').notNull().default(0),\n\n // T726 Wave 1A: tier promotion audit columns\n\n /**\n * ISO 8601 timestamp when this pattern was last promoted to a higher tier.\n * Null = never promoted.\n */\n tierPromotedAt: text('tier_promoted_at'),\n\n /**\n * Human-readable reason for the most recent tier promotion.\n * Null = never promoted.\n */\n tierPromotionReason: text('tier_promotion_reason'),\n\n /**\n * SHA-256 prefix (first 16 hex chars) of the normalised pattern content.\n * Computed at insert time; used by hashDedupCheck to prevent exact-duplicate patterns.\n * Null on legacy rows (pre-T726).\n */\n contentHash: text('content_hash'),\n },\n (table) => [\n index('idx_brain_patterns_type').on(table.type),\n index('idx_brain_patterns_impact').on(table.impact),\n index('idx_brain_patterns_frequency').on(table.frequency),\n index('idx_brain_patterns_quality').on(table.qualityScore),\n // T549 indexes\n index('idx_brain_patterns_tier').on(table.memoryTier),\n index('idx_brain_patterns_mem_type').on(table.memoryType),\n index('idx_brain_patterns_verified').on(table.verified),\n index('idx_brain_patterns_valid_at').on(table.validAt),\n index('idx_brain_patterns_source_conf').on(table.sourceConfidence),\n // T726 indexes\n index('idx_brain_patterns_tier_promoted_at').on(table.tierPromotedAt),\n index('idx_brain_patterns_content_hash').on(table.contentHash),\n ],\n);\n\n// === BRAIN_LEARNINGS TABLE ===\n\nexport const brainLearnings = sqliteTable(\n 'brain_learnings',\n {\n id: text('id').primaryKey(),\n insight: text('insight').notNull(),\n source: text('source').notNull(),\n confidence: real('confidence').notNull(), // 0.0-1.0\n actionable: integer('actionable', { mode: 'boolean' }).notNull().default(false),\n application: text('application'),\n applicableTypesJson: text('applicable_types_json'),\n createdAt: text('created_at').notNull().default(sql`(datetime('now'))`),\n updatedAt: text('updated_at'),\n /**\n * Quality score: 0.0 (noise) \u2013 1.0 (canonical). Null for legacy entries.\n * Computed at insert time from confidence, actionability, and content richness.\n * Entries below 0.3 are excluded from search results (T531).\n */\n qualityScore: real('quality_score'),\n\n // T549: Tiered + Typed Memory columns\n\n /** Memory retention tier. NULL on legacy rows \u2192 treat as 'medium' at query time. */\n memoryTier: text('memory_tier', { enum: BRAIN_MEMORY_TIERS }).default('short'),\n\n /**\n * Cognitive type. Learnings are 'semantic' by default (declarative facts).\n * Transcript-derived learnings with source containing 'transcript:ses_' are 'episodic'.\n */\n memoryType: text('memory_type', { enum: BRAIN_COGNITIVE_TYPES }).default('semantic'),\n\n /**\n * Ground-truth verification flag.\n * false = agent-inferred, pending verification.\n * true = confirmed via owner statement, task outcome, corroboration, or manual verify.\n */\n verified: integer('verified', { mode: 'boolean' }).notNull().default(false),\n\n /**\n * Bitemporal: when this learning became valid (ISO 8601 text).\n * Defaults to creation time. Facts can change \u2014 use invalidAt to retire stale ones.\n */\n validAt: text('valid_at').notNull().default(sql`(datetime('now'))`),\n\n /**\n * Bitemporal: when this learning stopped being valid.\n * NULL = currently valid. Set by consolidator on contradiction detection or TTL decay.\n */\n invalidAt: text('invalid_at'),\n\n /**\n * Source reliability level \u2014 separate from content quality_score (T549 \u00A73.1.5).\n * Drives quality multiplier at scoring time.\n */\n sourceConfidence: text('source_confidence', { enum: BRAIN_SOURCE_CONFIDENCE }).default('agent'),\n\n /**\n * Number of times this learning has been cited/retrieved (T549 CONFLICT-03).\n * Used by the consolidator for citation-based medium\u2192long promotion.\n */\n citationCount: integer('citation_count').notNull().default(0),\n\n // T726 Wave 1A: tier promotion audit columns\n\n /**\n * ISO 8601 timestamp when this learning was last promoted to a higher tier.\n * Null = never promoted.\n */\n tierPromotedAt: text('tier_promoted_at'),\n\n /**\n * Human-readable reason for the most recent tier promotion.\n * Null = never promoted.\n */\n tierPromotionReason: text('tier_promotion_reason'),\n\n /**\n * SHA-256 prefix (first 16 hex chars) of the normalised learning content.\n * Computed at insert time; used by hashDedupCheck to prevent exact-duplicate learnings.\n * Null on legacy rows (pre-T726).\n */\n contentHash: text('content_hash'),\n },\n (table) => [\n index('idx_brain_learnings_confidence').on(table.confidence),\n index('idx_brain_learnings_actionable').on(table.actionable),\n index('idx_brain_learnings_quality').on(table.qualityScore),\n // T549 indexes\n index('idx_brain_learnings_tier').on(table.memoryTier),\n index('idx_brain_learnings_mem_type').on(table.memoryType),\n index('idx_brain_learnings_verified').on(table.verified),\n index('idx_brain_learnings_valid_at').on(table.validAt),\n index('idx_brain_learnings_invalid').on(table.invalidAt),\n index('idx_brain_learnings_source_conf').on(table.sourceConfidence),\n // T726 indexes\n index('idx_brain_learnings_tier_promoted_at').on(table.tierPromotedAt),\n index('idx_brain_learnings_content_hash').on(table.contentHash),\n ],\n);\n\n// === BRAIN_OBSERVATIONS TABLE ===\n\n/** General-purpose observations \u2014 replaces claude-mem's observations table. */\nexport const brainObservations = sqliteTable(\n 'brain_observations',\n {\n id: text('id').primaryKey(),\n type: text('type', { enum: BRAIN_OBSERVATION_TYPES }).notNull(),\n title: text('title').notNull(),\n subtitle: text('subtitle'),\n narrative: text('narrative'),\n factsJson: text('facts_json'), // JSON array of fact strings\n conceptsJson: text('concepts_json'), // JSON array of concept strings\n project: text('project'),\n filesReadJson: text('files_read_json'), // JSON array of file paths\n filesModifiedJson: text('files_modified_json'), // JSON array of file paths\n sourceSessionId: text('source_session_id'), // soft FK to sessions\n sourceType: text('source_type', { enum: BRAIN_OBSERVATION_SOURCE_TYPES })\n .notNull()\n .default('agent'),\n /** T383/T417: agent provenance \u2014 identifies the spawned agent that produced this observation. Null for legacy entries. */\n agent: text('agent'), // nullable \u2014 null for legacy observations\n contentHash: text('content_hash'), // SHA-256 prefix for dedup\n discoveryTokens: integer('discovery_tokens'), // cost to produce this observation\n /**\n * Quality score: 0.0 (noise) \u2013 1.0 (canonical). Null for legacy entries.\n * Computed at insert time from content richness and title length.\n * Entries below 0.3 are excluded from search results (T531).\n */\n qualityScore: real('quality_score'),\n createdAt: text('created_at').notNull().default(sql`(datetime('now'))`),\n updatedAt: text('updated_at'),\n\n // T549: Tiered + Typed Memory columns\n\n /** Memory retention tier. NULL on legacy rows \u2192 treat as 'medium' at query time. */\n memoryTier: text('memory_tier', { enum: BRAIN_MEMORY_TIERS }).default('short'),\n\n /** Cognitive type. Observations are always 'episodic' (time-anchored event records). */\n memoryType: text('memory_type', { enum: BRAIN_COGNITIVE_TYPES }).default('episodic'),\n\n /**\n * Ground-truth verification flag.\n * false = agent-inferred, pending verification.\n * true = confirmed via owner statement, task outcome, corroboration, or manual verify.\n */\n verified: integer('verified', { mode: 'boolean' }).notNull().default(false),\n\n /**\n * Bitemporal: when this observation became valid (ISO 8601 text).\n * Defaults to creation time. Can be backdated for historical facts.\n */\n validAt: text('valid_at').notNull().default(sql`(datetime('now'))`),\n\n /**\n * Bitemporal: when this observation stopped being valid.\n * NULL = currently valid. Set by consolidator on contradiction detection.\n * Temporal query pattern: WHERE valid_at <= :t AND (invalid_at IS NULL OR invalid_at > :t)\n */\n invalidAt: text('invalid_at'),\n\n /**\n * Source reliability level \u2014 separate from content quality_score (T549 \u00A73.1.5).\n * Drives quality multiplier at scoring time.\n */\n sourceConfidence: text('source_confidence', { enum: BRAIN_SOURCE_CONFIDENCE }).default('agent'),\n\n /**\n * Number of times this observation has been cited/retrieved (T549 CONFLICT-03).\n * Used by the consolidator for citation-based medium\u2192long promotion.\n */\n citationCount: integer('citation_count').notNull().default(0),\n\n // T726 Wave 1A: tier promotion audit columns\n\n /**\n * ISO 8601 timestamp when this observation was last promoted to a higher tier.\n * Null = never promoted.\n */\n tierPromotedAt: text('tier_promoted_at'),\n\n /**\n * Human-readable reason for the most recent tier promotion.\n * Null = never promoted.\n */\n tierPromotionReason: text('tier_promotion_reason'),\n\n /**\n * T799: JSON array of attachment SHA-256 refs linked to this observation.\n *\n * Stored as a JSON-encoded string (e.g. `[\"a1b2...\",\"c3d4...\"]`).\n * Null means no attachment refs. Use `cleo memory observe --attach <sha256>`\n * to populate this column.\n *\n * The referenced attachments are stored in the tasks.db attachment registry\n * (same store used by `cleo docs`). This column is a soft reference only \u2014\n * CLEO does not enforce referential integrity here.\n */\n attachmentsJson: text('attachments_json'),\n\n /**\n * T1001: Biological-analog stability score: 0.0 (unstable) \u2013 1.0 (consolidated).\n *\n * Mirrors brain_page_edges.stability_score but tracks observation-level consolidation\n * rather than edge-level plasticity. Used as one of the 6 signals in the composite\n * promotion scorer (promotion-score.ts).\n *\n * Default 0.5 = neutral/unknown stability on new observations.\n * Updated by runConsolidation decay pass and STDP backfill.\n *\n * Added via ensureColumns() in runBrainMigrations() \u2014 idempotent.\n *\n * @task T1001\n */\n stabilityScore: real('stability_score').default(0.5),\n },\n (table) => [\n index('idx_brain_observations_type').on(table.type),\n index('idx_brain_observations_project').on(table.project),\n index('idx_brain_observations_created_at').on(table.createdAt),\n index('idx_brain_observations_source_type').on(table.sourceType),\n index('idx_brain_observations_source_session').on(table.sourceSessionId),\n // T033: composite replaces single-col content_hash; see brain migration\n index('idx_brain_observations_content_hash_created_at').on(table.contentHash, table.createdAt),\n // T033: type + project compound filter optimization\n index('idx_brain_observations_type_project').on(table.type, table.project),\n // T417: agent provenance index for memory.find --agent filter\n index('idx_brain_observations_agent').on(table.agent),\n // T531: quality score filter index\n index('idx_brain_observations_quality').on(table.qualityScore),\n // T549 indexes\n index('idx_brain_observations_tier').on(table.memoryTier),\n index('idx_brain_observations_mem_type').on(table.memoryType),\n index('idx_brain_observations_verified').on(table.verified),\n index('idx_brain_observations_valid_at').on(table.validAt),\n index('idx_brain_observations_invalid').on(table.invalidAt),\n index('idx_brain_observations_source_conf').on(table.sourceConfidence),\n // T726 indexes\n index('idx_brain_observations_tier_promoted_at').on(table.tierPromotedAt),\n // T1001 indexes\n index('idx_brain_observations_stability_score').on(table.stabilityScore),\n ],\n);\n\n// === BRAIN_STICKY_NOTES TABLE ===\n\n/** Ephemeral sticky notes for quick capture before formal classification. */\nexport const brainStickyNotes = sqliteTable(\n 'brain_sticky_notes',\n {\n id: text('id').primaryKey(),\n content: text('content').notNull(),\n createdAt: text('created_at').notNull().default(sql`(datetime('now'))`),\n updatedAt: text('updated_at'),\n tagsJson: text('tags_json'),\n status: text('status', { enum: BRAIN_STICKY_STATUSES }).notNull().default('active'),\n convertedToJson: text('converted_to_json'),\n color: text('color', { enum: BRAIN_STICKY_COLORS }),\n priority: text('priority', { enum: BRAIN_STICKY_PRIORITIES }),\n sourceType: text('source_type').default('sticky-note'),\n },\n (table) => [\n index('idx_brain_sticky_status').on(table.status),\n index('idx_brain_sticky_created').on(table.createdAt),\n index('idx_brain_sticky_tags').on(table.tagsJson),\n ],\n);\n\n// === BRAIN_MEMORY_LINKS TABLE ===\n\n/** Cross-references between BRAIN entries and tasks in tasks.db. */\nexport const brainMemoryLinks = sqliteTable(\n 'brain_memory_links',\n {\n memoryType: text('memory_type', { enum: BRAIN_MEMORY_TYPES }).notNull(),\n memoryId: text('memory_id').notNull(),\n taskId: text('task_id').notNull(), // soft FK to tasks.id in tasks.db\n linkType: text('link_type', { enum: BRAIN_LINK_TYPES }).notNull(),\n createdAt: text('created_at').notNull().default(sql`(datetime('now'))`),\n },\n (table) => [\n primaryKey({ columns: [table.memoryType, table.memoryId, table.taskId, table.linkType] }),\n index('idx_brain_links_task').on(table.taskId),\n index('idx_brain_links_memory').on(table.memoryType, table.memoryId),\n ],\n);\n\n// === SCHEMA METADATA ===\n\nexport const brainSchemaMeta = sqliteTable('brain_schema_meta', {\n key: text('key').primaryKey(),\n value: text('value').notNull(),\n});\n\n// === PAGEINDEX GRAPH TABLES (T5160, expanded T528) ===\n\n/**\n * Node types for the graph-native memory model.\n * Mirrors typed tables (decision, pattern, learning, observation, sticky),\n * adds task provenance (task, session, epic), codebase bridging (file, symbol),\n * abstract/synthesized types (concept, summary), cross-substrate bridges\n * (msg, llmtxt, commit), and fills in the universal semantic graph for T945.\n *\n * Node ID format: `<type>:<source-id>`.\n *\n * Supported prefixes:\n * - `decision:D-<hash>` \u2014 brain_decisions row\n * - `pattern:P-<hash>` \u2014 brain_patterns row\n * - `learning:L-<hash>` \u2014 brain_learnings row\n * - `observation:O-<hash>-<n>` \u2014 brain_observations row\n * - `sticky:<id>` \u2014 brain_sticky row (scratchpad)\n * - `task:T###` \u2014 tasks.db row (soft FK)\n * - `session:ses_<ts>_<rand>` \u2014 tasks.db session row (soft FK)\n * - `epic:T###` \u2014 tasks.db epic row (soft FK)\n * - `file:<relative-path>` \u2014 nexus.db file node (soft FK)\n * - `symbol:<path>::<name>` \u2014 nexus.db symbol node (soft FK)\n * - `concept:<slug>` \u2014 abstract concept (synthesized)\n * - `summary:<hash>` \u2014 synthesized summary node\n * - `msg:<messageId>` \u2014 CONDUIT message (T945 Stage A) \u2014 soft FK into conduit.db\n * - `llmtxt:<sha256>` \u2014 llmtxt blob attachment (T945 Stage A) \u2014 content-addressable\n * - `commit:<sha>` \u2014 git commit (T945 Stage A) \u2014 Tier 3 autonomy audit\n *\n * @task T945\n */\nexport const BRAIN_NODE_TYPES = [\n // Memory entity types (mirror typed tables)\n 'decision',\n 'pattern',\n 'learning',\n 'observation',\n 'sticky',\n // Task provenance (soft FK into tasks.db)\n 'task',\n 'session',\n 'epic',\n // Codebase integration (bridge to nexus.db code_index)\n 'file',\n 'symbol',\n // Abstract / synthesized\n 'concept',\n 'summary',\n // Cross-substrate bridges (T945 Stage A \u2014 universal semantic graph)\n 'msg', // CONDUIT message node \u2014 `msg:<messageId>`\n 'llmtxt', // llmtxt attachment blob \u2014 `llmtxt:<sha256>` (content-addressable)\n 'commit', // git commit node \u2014 `commit:<sha>` (Tier 3 autonomy audit)\n] as const;\n\n/** Discriminated union of all supported brain graph node types. */\nexport type BrainNodeType = (typeof BRAIN_NODE_TYPES)[number];\n\n/**\n * Edge types for the graph-native memory model.\n * Covers provenance/derivation, semantic relationships, structural links,\n * graph bridging between memory entities and codebase nodes, plastic\n * Hebbian/STDP edges, and T945 Stage A cross-substrate relationships.\n *\n * Directionality convention: `from_id` is the source/subject; `to_id` is\n * the target/object. The edge type phrase reads naturally left-to-right\n * (e.g. `task:T1 \u2192 blocks \u2192 task:T2` means T1 blocks T2).\n *\n * @task T945\n */\nexport const BRAIN_EDGE_TYPES = [\n // Provenance / derivation\n 'derived_from', // learning \u2190 derived_from \u2190 observation\n 'produced_by', // observation \u2190 produced_by \u2190 session\n 'informed_by', // decision \u2190 informed_by \u2190 pattern\n // Semantic relationship\n 'supports', // observation \u2192 supports \u2192 decision\n 'contradicts', // observation \u2192 contradicts \u2192 decision\n 'supersedes', // decision \u2192 supersedes \u2192 decision (older)\n 'applies_to', // decision/pattern \u2192 applies_to \u2192 task/file/symbol\n // Structural\n 'documents', // observation \u2192 documents \u2192 symbol/file\n 'summarizes', // summary \u2192 summarizes \u2192 observation (consolidation)\n 'part_of', // task \u2192 part_of \u2192 epic\n // Graph bridging (memory \u2194 code)\n 'references', // observation \u2192 references \u2192 symbol\n 'modified_by', // file \u2192 modified_by \u2192 session\n 'code_reference', // memory node \u2192 code_reference \u2192 nexus symbol/file (T645)\n 'affects', // observation \u2192 affects \u2192 symbol/file (impact tracking)\n 'mentions', // observation \u2192 mentions \u2192 symbol name (weak reference)\n // Plasticity (Hebbian + STDP co-retrieval)\n 'co_retrieved', // A \u2192 co_retrieved \u2192 B (Hebbian: frequently retrieved together)\n // T945 Stage A \u2014 universal semantic graph\n 'blocks', // task \u2192 blocks \u2192 task (dependency: A blocks B = B waits on A)\n 'discusses', // msg \u2192 discusses \u2192 task/decision/epic (CONDUIT message bridge)\n 'cites', // decision/observation \u2192 cites \u2192 llmtxt/file (research citation)\n 'embeds', // task/observation \u2192 embeds \u2192 llmtxt (attachment ownership)\n 'touches_code', // task \u2192 touches_code \u2192 file/symbol (more specific than code_reference)\n] as const;\n\n/** Discriminated union of all supported brain graph edge types. */\nexport type BrainEdgeType = (typeof BRAIN_EDGE_TYPES)[number];\n\n/**\n * Graph nodes table \u2014 the traversable knowledge graph layer.\n *\n * Every entity row in a typed table (decisions, patterns, learnings,\n * observations) gets a corresponding node here. The typed table row is\n * the source of truth; the graph node is the index entry for traversal\n * and cross-entity reasoning.\n *\n * Node ID convention: '<type>:<source-id>' \u2014 see BRAIN_NODE_TYPES docstring\n * for the authoritative prefix list.\n *\n * Examples: 'decision:D-abc123', 'observation:O-mntphoj6-0',\n * 'task:T523', 'symbol:src/store/memory-schema.ts::brainPageNodes',\n * 'msg:msg_abc123', 'llmtxt:9f2a...sha256', 'commit:04021568a'\n */\nexport const brainPageNodes = sqliteTable(\n 'brain_page_nodes',\n {\n /** Stable composite ID: '<type>:<source-id>' */\n id: text('id').primaryKey(),\n\n /** Discriminated type from BRAIN_NODE_TYPES. */\n nodeType: text('node_type', { enum: BRAIN_NODE_TYPES }).notNull(),\n\n /** Human-readable label (title, name, or generated summary). */\n label: text('label').notNull(),\n\n /**\n * Quality score: 0.0 (noise) \u2013 1.0 (canonical).\n * Derived from: source confidence, edge density, age decay, agent provenance.\n * Default 0.5 for unknown provenance; 0.0 triggers exclusion from traversal.\n */\n qualityScore: real('quality_score').notNull().default(0.5),\n\n /**\n * SHA-256 prefix (first 16 hex chars) of the canonical content.\n * Computed at insert time; duplicate hashes are rejected.\n * Null for external references (task, session, symbol nodes).\n */\n contentHash: text('content_hash'),\n\n /**\n * ISO 8601 timestamp of last activity on this node.\n * Updated when new edges are added, quality changes, or content is revised.\n */\n lastActivityAt: text('last_activity_at').notNull().default(sql`(datetime('now'))`),\n\n /**\n * Extensible JSON metadata blob \u2014 type-specific payload.\n * decision: { type, confidence, outcome }\n * observation: { sourceType, agent, sessionId }\n * symbol: { filePath, kind, startLine, endLine, language }\n * task: { status, priority, epicId }\n */\n metadataJson: text('metadata_json'),\n\n createdAt: text('created_at').notNull().default(sql`(datetime('now'))`),\n updatedAt: text('updated_at'),\n },\n (table) => [\n index('idx_brain_nodes_type').on(table.nodeType),\n index('idx_brain_nodes_quality').on(table.qualityScore),\n index('idx_brain_nodes_content_hash').on(table.contentHash),\n index('idx_brain_nodes_last_activity').on(table.lastActivityAt),\n ],\n);\n\n/**\n * Graph edges table \u2014 directed, typed, weighted, provenance-aware links\n * between brain_page_nodes entries (or external nexus node IDs).\n *\n * The composite primary key (fromId, toId, edgeType) prevents duplicate\n * edges of the same type between the same pair of nodes.\n */\nexport const brainPageEdges = sqliteTable(\n 'brain_page_edges',\n {\n fromId: text('from_id').notNull(), // brain_page_nodes.id\n toId: text('to_id').notNull(), // brain_page_nodes.id or nexus node id\n edgeType: text('edge_type', { enum: BRAIN_EDGE_TYPES }).notNull(),\n\n /**\n * Edge weight / confidence: 0.0 \u2013 1.0.\n * Semantic edges use extractor confidence (similarity score).\n * Structural edges use 1.0 (deterministic).\n * Contradiction edges store the overlap score that triggered detection.\n */\n weight: real('weight').notNull().default(1.0),\n\n /**\n * Human-readable note on why this edge was emitted.\n * Examples: 'auto:task-complete' | 'auto:session-end' |\n * 'auto:contradiction-detected' | 'auto:consolidation' | 'manual'\n */\n provenance: text('provenance'),\n\n createdAt: text('created_at').notNull().default(sql`(datetime('now'))`),\n\n // === T673-M3: Plasticity tracking columns ===\n\n /**\n * ISO 8601 timestamp of the last LTP event applied to this edge.\n * Used by the decay pass: edges with (now - last_reinforced_at) > decay_threshold_days\n * receive a per-day weight decay. Null = never reinforced (structural/semantic edges).\n * Only populated when plasticity_class IN ('hebbian', 'stdp').\n *\n * @task T706\n */\n lastReinforcedAt: text('last_reinforced_at'),\n\n /**\n * Count of LTP (potentiation) events applied to this edge lifetime.\n * Incremented on every LTP write. Used to compute stability_score.\n *\n * @task T706\n */\n reinforcementCount: integer('reinforcement_count').notNull().default(0),\n\n /**\n * Plasticity class governing which algorithm(s) write to this edge.\n *\n * - 'static': Non-plastic edge (structural, semantic, etc.). Immune to decay.\n * - 'hebbian': Written by strengthenCoRetrievedEdges. Subject to decay.\n * - 'stdp': Written or refined by applyStdpPlasticity. Subject to decay + LTD.\n *\n * Edges start 'static' for all non-co_retrieved types.\n * co_retrieved edges start 'hebbian' (seeded by M3 migration), can upgrade to 'stdp'.\n *\n * @task T706\n */\n plasticityClass: text('plasticity_class', {\n enum: ['static', 'hebbian', 'stdp'] as const,\n })\n .notNull()\n .default('static'),\n\n /**\n * ISO 8601 timestamp of the last LTD (depression) event on this edge.\n * Null = never depressed. Used for debugging and Studio viz animation.\n *\n * @task T706\n */\n lastDepressedAt: text('last_depressed_at'),\n\n /**\n * Count of LTD (depression) events applied to this edge lifetime.\n * Enables analysis of edges that are persistently weakened.\n *\n * @task T706\n */\n depressionCount: integer('depression_count').notNull().default(0),\n\n /**\n * Biological-analog stability score: 0.0 (unstable) \u2013 1.0 (consolidated).\n *\n * Computed by runConsolidation decay pass as:\n * stability = tanh(reinforcement_count / 10) \u00D7 exp(-(days_since_reinforced / 30))\n *\n * Null = not yet computed (new edges). Enables fast filtering in decay pass:\n * edges with stability > 0.9 skip the full decay recalculation.\n * Updated at session-end consolidation, NOT per-event.\n *\n * @task T706\n */\n stabilityScore: real('stability_score'),\n },\n (table) => [\n primaryKey({ columns: [table.fromId, table.toId, table.edgeType] }),\n index('idx_brain_edges_from').on(table.fromId),\n index('idx_brain_edges_to').on(table.toId),\n index('idx_brain_edges_type').on(table.edgeType),\n index('idx_brain_edges_last_reinforced').on(table.lastReinforcedAt),\n index('idx_brain_edges_plasticity_class').on(table.plasticityClass),\n index('idx_brain_edges_stability').on(table.stabilityScore),\n ],\n);\n\n// ============================================================================\n// RETRIEVAL LOG \u2014 tracks which entries are retrieved together (T549 \u00A76)\n// ============================================================================\n\n/**\n * Retrieval log tracks which brain entries are returned together in search\n * results. This data drives:\n * - Co-retrieval edge strengthening (consolidation step 6)\n * - Memory quality instrumentation (retrieval frequency tracking)\n * - Citation count validation (corroboration for tier promotion)\n * - STDP plasticity \u2014 spike-timing pairs derived from retrieval timestamps (T673)\n *\n * Each row records one retrieval event: the query, which entries were returned,\n * and the retrieval source (find/fetch/hybrid).\n *\n * Column notes (T673-M1):\n * entry_ids \u2014 stored as JSON array string '[\"id1\",\"id2\"]' (never CSV).\n * Writer: JSON.stringify(entryIds). Readers: JSON.parse(row.entry_ids).\n * M1 migration converts existing CSV rows to JSON format.\n * session_id \u2014 synced to live table via M1 ALTER (was missing from live DDL).\n * reward_signal \u2014 R-STDP third-factor: +1.0 verified | +0.5 done | -0.5 cancelled | null.\n * retrieval_order \u2014 existed in live table via self-healing DDL but was absent in Drizzle.\n * M1 brings Drizzle into sync (schema drift fix).\n * delta_ms \u2014 same schema drift resolution as retrieval_order.\n */\nexport const brainRetrievalLog = sqliteTable(\n 'brain_retrieval_log',\n {\n id: integer('id').primaryKey({ autoIncrement: true }),\n\n /** The search query or fetch IDs that triggered this retrieval. */\n query: text('query').notNull(),\n\n /**\n * JSON array of entry IDs returned in this retrieval.\n * Stored as JSON array string: '[\"obs:A\",\"obs:B\"]'.\n * Always write with JSON.stringify() \u2014 NEVER join(',').\n * Readers call JSON.parse(). Migration M1 converts any pre-existing CSV rows.\n */\n entryIds: text('entry_ids').notNull(),\n\n /** Number of entries returned. */\n entryCount: integer('entry_count').notNull(),\n\n /** Retrieval source: 'find' | 'fetch' | 'hybrid' | 'timeline' | 'budget' */\n source: text('source').notNull(),\n\n /** Estimated tokens consumed by this retrieval. */\n tokensUsed: integer('tokens_used'),\n\n /** Session ID (soft FK to tasks.db sessions). Enables grouping retrievals by session for STDP analysis. */\n sessionId: text('session_id'),\n\n createdAt: text('created_at').notNull().default(sql`(datetime('now'))`),\n\n // === T673-M1: STDP plasticity columns ===\n\n /** Sequence position of this retrieval within a batch query (0-based). */\n retrievalOrder: integer('retrieval_order'),\n\n /** Wall-clock ms since the previous retrieval row in the same batch. */\n deltaMs: integer('delta_ms'),\n\n /**\n * R-STDP reward signal: scalar [-1.0, +1.0], null = unlabeled.\n * Populated by backfillRewardSignals() at session end (Step 9a).\n * +1.0 = task verified and passed | +0.5 = done (unverified) | -0.5 = cancelled.\n * Per D-BRAIN-VIZ-13. backfillRewardSignals MUST skip rows where\n * session_id LIKE 'ses_backfill_%' (synthetic historical sessions, no task correlation).\n */\n rewardSignal: real('reward_signal'),\n },\n (table) => [\n index('idx_retrieval_log_created').on(table.createdAt),\n index('idx_retrieval_log_source').on(table.source),\n index('idx_retrieval_log_session').on(table.sessionId),\n index('idx_retrieval_log_reward').on(table.rewardSignal),\n ],\n);\n\n// ============================================================================\n// PLASTICITY EVENTS \u2014 STDP weight-change audit log (T626 phase 5)\n// ============================================================================\n\n/**\n * Records every STDP weight-change event applied to a brain_page_edges row.\n *\n * Each row captures the causal pair (source_node, target_node), the signed\n * delta applied to the edge weight, whether it was a potentiation or\n * depression event, and which session and timestamp triggered it.\n *\n * @task T626\n * @epic T626\n */\nexport const brainPlasticityEvents = sqliteTable(\n 'brain_plasticity_events',\n {\n id: integer('id').primaryKey({ autoIncrement: true }),\n /** from_id of the affected brain_page_edges row. */\n sourceNode: text('source_node').notNull(),\n /** to_id of the affected brain_page_edges row. */\n targetNode: text('target_node').notNull(),\n /**\n * Signed weight delta applied to the edge.\n * Positive = potentiation (LTP), negative = depression (LTD).\n */\n deltaW: real('delta_w').notNull(),\n /**\n * STDP event kind: `ltp` (Long-Term Potentiation) or `ltd` (Long-Term\n * Depression).\n */\n kind: text('kind', { enum: ['ltp', 'ltd'] }).notNull(),\n /** ISO 8601 timestamp when this event was applied. */\n timestamp: text('timestamp').notNull().default(sql`(datetime('now'))`),\n /** Session ID that triggered the STDP pass, if available. */\n sessionId: text('session_id'),\n\n // === T673-M2: Observability columns ===\n\n /**\n * Edge weight immediately BEFORE this plasticity event was applied.\n * Null on the first LTP event that inserts a new edge (edge didn't exist).\n * Enables \"show learning history\" in Studio viz without querying brain_weight_history.\n *\n * @task T696\n */\n weightBefore: real('weight_before'),\n\n /**\n * Edge weight immediately AFTER this plasticity event was applied.\n * Computed as CLAMP(weight_before + delta_w, 0.0, 1.0).\n * Redundant with delta_w but enables fast before/after display without arithmetic.\n *\n * @task T696\n */\n weightAfter: real('weight_after'),\n\n /**\n * Soft FK to brain_retrieval_log.id \u2014 the retrieval row that triggered this pair.\n * Null for externally-triggered or legacy events.\n * Enables: \"which memory retrieval caused this edge to strengthen?\"\n *\n * @task T696\n */\n retrievalLogId: integer('retrieval_log_id'),\n\n /**\n * R-STDP reward signal active when this event fired.\n * Copied from the retrieval_log row's reward_signal at time of plasticity pass.\n * Null = unmodulated. Denormalized for fast filtering without a JOIN.\n *\n * @task T696\n */\n rewardSignal: real('reward_signal'),\n\n /**\n * Wall-clock milliseconds between the two spikes that generated this event.\n * Pre-computed at INSERT time \u2014 avoids re-deriving from retrieval timestamps.\n * Enables analysis of STDP window distribution.\n *\n * @task T696\n */\n deltaTMs: integer('delta_t_ms'),\n },\n (table) => [\n index('idx_plasticity_source').on(table.sourceNode),\n index('idx_plasticity_target').on(table.targetNode),\n index('idx_plasticity_timestamp').on(table.timestamp),\n index('idx_plasticity_session').on(table.sessionId),\n index('idx_plasticity_kind').on(table.kind),\n index('idx_plasticity_retrieval_log').on(table.retrievalLogId),\n index('idx_plasticity_reward').on(table.rewardSignal),\n ],\n);\n\n// ============================================================================\n// WEIGHT HISTORY \u2014 immutable per-edge \u0394w audit log (T673-M4, T697)\n// ============================================================================\n\n/**\n * Immutable audit log of every edge weight change (LTP, LTD, Hebbian, prune,\n * external). Routine exponential decay writes do NOT appear here \u2014 only discrete\n * plasticity events that cross the 1e-6 negligibility threshold.\n *\n * Retention policy: rolling 90 days. runConsolidation Step 9d DELETE sweep\n * purges rows older than 90 days. Actual pruning wired in Wave 3 (T690).\n *\n * Spec: docs/specs/stdp-wire-up-spec.md \u00A72.1.4 (owner Q4 mandate \u2014 in scope).\n *\n * @task T697\n * @epic T673\n */\nexport const brainWeightHistory = sqliteTable(\n 'brain_weight_history',\n {\n id: integer('id').primaryKey({ autoIncrement: true }),\n\n /** from_id of the affected brain_page_edges row. */\n edgeFromId: text('edge_from_id').notNull(),\n\n /** to_id of the affected brain_page_edges row. */\n edgeToId: text('edge_to_id').notNull(),\n\n /** Edge type of the affected brain_page_edges row (e.g. 'co_retrieved'). */\n edgeType: text('edge_type').notNull(),\n\n /** Edge weight immediately before this event. Null if the edge was just created. */\n weightBefore: real('weight_before'),\n\n /** Edge weight after this event. CLAMP(weightBefore + deltaWeight, 0, 1). NOT NULL. */\n weightAfter: real('weight_after').notNull(),\n\n /**\n * Signed weight delta applied to the edge.\n * Positive = potentiation (LTP/Hebbian), negative = depression (LTD).\n * Prune events record the final weight that triggered deletion (negative).\n */\n deltaWeight: real('delta_weight').notNull(),\n\n /**\n * Plasticity event kind.\n * 'ltp' \u2014 Long-Term Potentiation (STDP pre-before-post)\n * 'ltd' \u2014 Long-Term Depression (STDP post-before-pre)\n * 'hebbian' \u2014 Co-retrieval Hebbian strengthening\n * 'decay' \u2014 Temporal decay (only prune-triggering decays written here)\n * 'prune' \u2014 Edge deleted (weight fell below min_weight threshold)\n * 'external' \u2014 Manually-applied external weight change\n */\n eventKind: text('event_kind').notNull(),\n\n /** Soft FK to brain_plasticity_events.id \u2014 the STDP event that caused this. */\n sourcePlasticityEventId: integer('source_plasticity_event_id'),\n\n /** Soft FK to brain_retrieval_log.id \u2014 the retrieval batch that triggered this. */\n retrievalLogId: integer('retrieval_log_id'),\n\n /** R-STDP reward signal at time of event (copied from retrieval_log.reward_signal). */\n rewardSignal: real('reward_signal'),\n\n /** ISO 8601 timestamp when this weight change was applied. */\n changedAt: text('changed_at').notNull().default(sql`(datetime('now'))`),\n },\n (table) => [\n index('idx_weight_history_edge').on(table.edgeFromId, table.edgeToId, table.edgeType),\n index('idx_weight_history_from').on(table.edgeFromId),\n index('idx_weight_history_to').on(table.edgeToId),\n index('idx_weight_history_changed_at').on(table.changedAt),\n index('idx_weight_history_event_kind').on(table.eventKind),\n index('idx_weight_history_plasticity_event').on(table.sourcePlasticityEventId),\n ],\n);\n\n// ============================================================================\n// BRAIN MODULATORS \u2014 R-STDP neuromodulator event log (T673-M4, T699)\n// ============================================================================\n\n/**\n * Discrete neuromodulator event log for R-STDP third-factor gating.\n * Records every reward/correction/feedback signal that modulates plasticity.\n * Inserted by backfillRewardSignals for each task outcome it processes.\n *\n * Both writes (retrieval_log UPDATE and modulators INSERT) use two separate\n * SQLite connections \u2014 no ATTACH \u2014 matching the cross-db-cleanup.ts pattern.\n *\n * Spec: docs/specs/stdp-wire-up-spec.md \u00A72.1.5 (Lead A \u00A74.5).\n *\n * @task T699\n * @epic T673\n */\nexport const brainModulators = sqliteTable(\n 'brain_modulators',\n {\n id: integer('id').primaryKey({ autoIncrement: true }),\n\n /**\n * Modulator event type. String (not enum constraint) for extensibility.\n * Expected values: 'task_verified'|'task_completed'|'task_cancelled'|\n * 'owner_verify'|'session_success'|'session_blocker'|'external'\n */\n modulatorType: text('modulator_type').notNull(),\n\n /**\n * Reward valence in range [-1.0, +1.0].\n * +1.0 = strong reward (verified correct task)\n * +0.5 = moderate reward (done, unverified)\n * -0.5 = mild correction (cancelled task)\n * -1.0 = strong correction (explicit invalidation)\n * 0.0 = neutral signal\n */\n valence: real('valence').notNull(),\n\n /**\n * Magnitude 0.0\u20131.0 confidence scaling.\n * Effective reward = valence \u00D7 magnitude.\n * Defaults to 1.0 (full confidence).\n */\n magnitude: real('magnitude').notNull().default(1.0),\n\n /** Polymorphic source event ID \u2014 task ID, memory entry ID, or other string ref. */\n sourceEventId: text('source_event_id'),\n\n /** Session ID (soft FK to tasks.db sessions). */\n sessionId: text('session_id'),\n\n /** Human-readable description of why this modulator was emitted. */\n description: text('description'),\n\n /** ISO 8601 timestamp when this modulator event was recorded. */\n createdAt: text('created_at').notNull().default(sql`(datetime('now'))`),\n },\n (table) => [\n index('idx_modulators_type').on(table.modulatorType),\n index('idx_modulators_session').on(table.sessionId),\n index('idx_modulators_created_at').on(table.createdAt),\n index('idx_modulators_source_event').on(table.sourceEventId),\n index('idx_modulators_valence').on(table.valence),\n ],\n);\n\n// ============================================================================\n// BRAIN CONSOLIDATION EVENTS \u2014 pipeline run audit log (T673-M4, T701)\n// ============================================================================\n\n/**\n * One row per runConsolidation execution. Enables T628 auto-dream scheduling\n * and pipeline observability. Required by the auto-dream cycle for scheduling.\n *\n * runConsolidation in brain-lifecycle.ts MUST accept an optional trigger\n * parameter and INSERT one row per run with step_results_json + duration_ms.\n *\n * Spec: docs/specs/stdp-wire-up-spec.md \u00A72.1.6 (Lead A + Lead C joint).\n *\n * @task T701\n * @epic T673\n */\nexport const brainConsolidationEvents = sqliteTable(\n 'brain_consolidation_events',\n {\n id: integer('id').primaryKey({ autoIncrement: true }),\n\n /**\n * What triggered this consolidation run. String (not enum constraint) for\n * forward compatibility with T628 scheduler.\n * Expected values: 'session_end' | 'maintenance' | 'scheduled' | 'manual'\n */\n trigger: text('trigger').notNull(),\n\n /** Session ID that initiated this consolidation (soft FK to tasks.db sessions). */\n sessionId: text('session_id'),\n\n /**\n * JSON-serialized ConsolidationResult \u2014 all per-step counts and metrics.\n * Shape: { [stepName: string]: { count: number, durationMs?: number } }\n * Required NOT NULL \u2014 every run must record its results for T628 scheduling.\n */\n stepResultsJson: text('step_results_json').notNull(),\n\n /** Wall-clock milliseconds from start to completion. Null if run did not complete. */\n durationMs: integer('duration_ms'),\n\n /**\n * Whether the run succeeded.\n * Stored as integer(boolean) per Drizzle SQLite boolean convention.\n * true = completed without unhandled error, false = partial or error.\n */\n succeeded: integer('succeeded', { mode: 'boolean' }).notNull().default(true),\n\n /** ISO 8601 timestamp when this consolidation run started. */\n startedAt: text('started_at').notNull().default(sql`(datetime('now'))`),\n },\n (table) => [\n index('idx_consolidation_events_started_at').on(table.startedAt),\n index('idx_consolidation_events_trigger').on(table.trigger),\n index('idx_consolidation_events_session').on(table.sessionId),\n ],\n);\n\n// ============================================================================\n// BRAIN TRANSCRIPT EVENTS \u2014 full-fidelity Claude session ingestion (T1002)\n// ============================================================================\n\n/**\n * Full-fidelity transcript event store for Claude session JSONL ingestion.\n *\n * Each row represents one content block from a Claude session transcript:\n * text, tool_use, tool_result, thinking, or system entries. Blocks that\n * contain secrets are flagged via redacted_at before persistence.\n *\n * The (session_id, seq) pair is unique \u2014 re-ingesting the same session is\n * idempotent via INSERT OR IGNORE.\n *\n * @task T1002\n * @epic T1000\n */\nexport const brainTranscriptEvents = sqliteTable(\n 'brain_transcript_events',\n {\n id: text('id').primaryKey(),\n /** Session ID sourced from the JSONL filename (ses_YYYYMMDD_xxxxx). */\n sessionId: text('session_id').notNull(),\n /** Ordinal position of this block within the session (0-based). */\n seq: integer('seq').notNull(),\n /**\n * Message role: 'user' | 'assistant' | 'system'.\n * Matches the 'role' field from the Claude message object.\n */\n role: text('role').notNull(),\n /**\n * Content block type: 'text' | 'tool_use' | 'tool_result' | 'thinking'.\n * Preserved exactly from the Claude JSONL block.type field.\n */\n blockType: text('block_type').notNull(),\n /**\n * Serialised block content. For text blocks this is the raw string.\n * For tool_use / tool_result / thinking blocks this is JSON.stringify of\n * the block minus any redacted fields.\n */\n content: text('content').notNull(),\n /** Approximate token count for the block (null when not computable). */\n tokens: integer('tokens'),\n /**\n * ISO 8601 timestamp when this row was redacted (PII/secret scrub applied).\n * Null = block was clean and stored as-is.\n */\n redactedAt: text('redacted_at'),\n createdAt: text('created_at').notNull().default(sql`(datetime('now'))`),\n },\n (table) => [\n index('idx_transcript_events_session').on(table.sessionId),\n index('idx_transcript_events_role').on(table.role),\n index('idx_transcript_events_block_type').on(table.blockType),\n index('idx_transcript_events_created_at').on(table.createdAt),\n ],\n);\n\n// ============================================================================\n// BRAIN PROMOTION LOG \u2014 typed promotion audit trail (T1001)\n// ============================================================================\n\n/**\n * Audit log for observation-to-typed-entry promotions.\n *\n * Every time promoteObservationsToTyped() promotes a brain_observations row\n * to a typed entry (brain_learnings, brain_patterns), one row is written here\n * to record what was promoted, why, and the full composite score breakdown.\n *\n * Pairs with T997 promote-explain CLI which reads this table.\n *\n * @task T1001\n * @epic T1000\n */\nexport const brainPromotionLog = sqliteTable(\n 'brain_promotion_log',\n {\n /** Unique promotion event ID. Format: `promo-<timestamp36>-<rand>`. */\n id: text('id').primaryKey(),\n\n /** ID of the brain_observations row that was evaluated. */\n observationId: text('observation_id').notNull(),\n\n /**\n * Source tier (always 'observation' for this table \u2014 reserved for future\n * multi-source promotion pipelines).\n */\n fromTier: text('from_tier').notNull(),\n\n /**\n * Target typed entity: 'learning' | 'pattern' | 'decision' | 'diary'.\n * Determines which table the promoted entry lands in.\n */\n toTier: text('to_tier').notNull(),\n\n /**\n * Composite promotion score at the time of promotion (0.0\u20131.0).\n * Computed by computePromotionScore() in promotion-score.ts.\n */\n score: real('score').notNull(),\n\n /** ISO 8601 timestamp when this promotion was decided. */\n decidedAt: text('decided_at').notNull().default(sql`(datetime('now'))`),\n\n /**\n * Who or what made the promotion decision.\n * 'composite-scorer' = automatic via promoteObservationsToTyped.\n * 'owner' = manually triggered via `cleo memory promote`.\n */\n decidedBy: text('decided_by').notNull().default('composite-scorer'),\n\n /**\n * JSON-serialized PromotionRationale from promotion-score.ts.\n * Contains per-signal breakdowns and weighted contributions.\n * Null for legacy rows.\n */\n rationaleJson: text('rationale_json'),\n },\n (table) => [\n index('idx_promotion_log_observation').on(table.observationId),\n index('idx_promotion_log_decided_at').on(table.decidedAt),\n index('idx_promotion_log_to_tier').on(table.toTier),\n index('idx_promotion_log_score').on(table.score),\n ],\n);\n\n// ============================================================================\n// BRAIN BACKFILL RUNS \u2014 staged backfill audit log (T1003)\n// ============================================================================\n\n/**\n * Staged backfill run registry.\n *\n * Records every staged backfill operation: what was staged, from which source,\n * targeting which table, how many rows, and the current workflow status.\n *\n * A backfill run is immutable once `approved` or `rolled-back`. Attempting\n * to approve/rollback a completed run is a no-op that returns success with\n * an `alreadySettled` flag set to `true`.\n *\n * Rollback safety: `rollback_snapshot_json` contains the full array of\n * row IDs that were staged so approve/rollback are deterministic with no\n * additional DB lookup required.\n *\n * @task T1003\n * @epic T1000\n */\nexport const brainBackfillRuns = sqliteTable(\n 'brain_backfill_runs',\n {\n /** Unique run identifier. Format: `bfr-<timestamp36>-<rand>`. */\n id: text('id').primaryKey(),\n\n /**\n * Backfill kind \u2014 what type of data this run is populating.\n *\n * - `observation-promotion` \u2014 promoting brain_observations to typed entries\n * - `transcript-ingest` \u2014 ingesting Claude JSONL session transcripts\n * - `graph-backfill` \u2014 populating brain_page_nodes/edges from typed tables\n * - `custom` \u2014 ad-hoc runs initiated by the owner\n */\n kind: text('kind').notNull(),\n\n /**\n * Workflow status of this run.\n *\n * - `staged` \u2014 run has been created; rows are held in a shadow scope (not live).\n * - `approved` \u2014 run was approved; staged rows have been committed to live tables.\n * - `rolled-back` \u2014 run was rolled back; staged rows were discarded.\n */\n status: text('status').notNull().default('staged'),\n\n /** ISO 8601 timestamp when this run was created. */\n createdAt: text('created_at').notNull().default(sql`(datetime('now'))`),\n\n /**\n * ISO 8601 timestamp when this run was approved (status \u2192 'approved').\n * Null if not yet approved.\n */\n approvedAt: text('approved_at'),\n\n /**\n * Number of rows that were staged (and would be / were committed on approve).\n * Updated after staging completes.\n */\n rowsAffected: integer('rows_affected').notNull().default(0),\n\n /**\n * JSON-serialized snapshot of the staged row IDs.\n * Shape: `string[]` \u2014 list of target-table primary keys that were staged.\n * Used by rollback to remove committed rows deterministically.\n * Null for large backfills that use cursor-based rollback instead.\n */\n rollbackSnapshotJson: text('rollback_snapshot_json'),\n\n /**\n * Source descriptor \u2014 file path, session ID, or other identifier\n * indicating where the data came from (e.g. a JSONL transcript path).\n */\n source: text('source').notNull().default('unknown'),\n\n /**\n * Target table name in brain.db (e.g. `brain_observations`, `brain_page_nodes`).\n * Used by rollback to issue DELETE WHERE id IN (...) against the right table.\n */\n targetTable: text('target_table').notNull().default('brain_observations'),\n\n /**\n * Identity of the agent or human who approved this run.\n * Null if not yet approved or rolled back.\n */\n approvedBy: text('approved_by'),\n },\n (table) => [\n index('idx_backfill_runs_status').on(table.status),\n index('idx_backfill_runs_kind').on(table.kind),\n index('idx_backfill_runs_created_at').on(table.createdAt),\n ],\n);\n\n// === TYPE EXPORTS ===\n\nexport type BrainTranscriptEventRow = typeof brainTranscriptEvents.$inferSelect;\nexport type NewBrainTranscriptEventRow = typeof brainTranscriptEvents.$inferInsert;\n\nexport type BrainRetrievalLogRow = typeof brainRetrievalLog.$inferSelect;\nexport type NewBrainRetrievalLogRow = typeof brainRetrievalLog.$inferInsert;\nexport type BrainDecisionRow = typeof brainDecisions.$inferSelect;\nexport type NewBrainDecisionRow = typeof brainDecisions.$inferInsert;\nexport type BrainPatternRow = typeof brainPatterns.$inferSelect;\nexport type NewBrainPatternRow = typeof brainPatterns.$inferInsert;\nexport type BrainLearningRow = typeof brainLearnings.$inferSelect;\nexport type NewBrainLearningRow = typeof brainLearnings.$inferInsert;\nexport type BrainObservationRow = typeof brainObservations.$inferSelect;\nexport type NewBrainObservationRow = typeof brainObservations.$inferInsert;\nexport type BrainMemoryLinkRow = typeof brainMemoryLinks.$inferSelect;\nexport type NewBrainMemoryLinkRow = typeof brainMemoryLinks.$inferInsert;\nexport type BrainPageNodeRow = typeof brainPageNodes.$inferSelect;\nexport type NewBrainPageNodeRow = typeof brainPageNodes.$inferInsert;\nexport type BrainPageEdgeRow = typeof brainPageEdges.$inferSelect;\nexport type NewBrainPageEdgeRow = typeof brainPageEdges.$inferInsert;\nexport type BrainStickyNoteRow = typeof brainStickyNotes.$inferSelect;\nexport type NewBrainStickyNoteRow = typeof brainStickyNotes.$inferInsert;\nexport type BrainPlasticityEventRow = typeof brainPlasticityEvents.$inferSelect;\nexport type NewBrainPlasticityEventRow = typeof brainPlasticityEvents.$inferInsert;\n\n/** Row type for brain_weight_history SELECT queries. */\nexport type BrainWeightHistoryRow = typeof brainWeightHistory.$inferSelect;\n/** Row type for brain_weight_history INSERT operations. */\nexport type BrainWeightHistoryInsert = typeof brainWeightHistory.$inferInsert;\n\n/** Row type for brain_modulators SELECT queries. */\nexport type BrainModulatorRow = typeof brainModulators.$inferSelect;\n/** Row type for brain_modulators INSERT operations. */\nexport type BrainModulatorInsert = typeof brainModulators.$inferInsert;\n\n/** Row type for brain_consolidation_events SELECT queries. */\nexport type BrainConsolidationEventRow = typeof brainConsolidationEvents.$inferSelect;\n/** Row type for brain_consolidation_events INSERT operations. */\nexport type BrainConsolidationEventInsert = typeof brainConsolidationEvents.$inferInsert;\n\n/** Row type for brain_promotion_log SELECT queries. */\nexport type BrainPromotionLogRow = typeof brainPromotionLog.$inferSelect;\n/** Row type for brain_promotion_log INSERT operations. */\nexport type BrainPromotionLogInsert = typeof brainPromotionLog.$inferInsert;\n\n/** Row type for brain_backfill_runs SELECT queries. */\nexport type BrainBackfillRunRow = typeof brainBackfillRuns.$inferSelect;\n/** Row type for brain_backfill_runs INSERT operations. */\nexport type BrainBackfillRunInsert = typeof brainBackfillRuns.$inferInsert;\n\n/** Valid status values for brain_backfill_runs.status. */\nexport const BRAIN_BACKFILL_RUN_STATUSES = ['staged', 'approved', 'rolled-back'] as const;\n/** Discriminated union of all backfill run statuses. */\nexport type BrainBackfillRunStatus = (typeof BRAIN_BACKFILL_RUN_STATUSES)[number];\n\n// BrainNodeType and BrainEdgeType are declared alongside their enum arrays above.\n", "import { entityKind } from '~/entity.ts';\n\nexport interface Logger {\n\tlogQuery(query: string, params: unknown[]): void;\n}\n\nexport interface LogWriter {\n\twrite(message: string): void;\n}\n\nexport class ConsoleLogWriter implements LogWriter {\n\tstatic readonly [entityKind]: string = 'ConsoleLogWriter';\n\n\twrite(message: string) {\n\t\tconsole.log(message);\n\t}\n}\n\nexport class DefaultLogger implements Logger {\n\tstatic readonly [entityKind]: string = 'DefaultLogger';\n\n\treadonly writer: LogWriter;\n\n\tconstructor(config?: { writer: LogWriter }) {\n\t\tthis.writer = config?.writer ?? new ConsoleLogWriter();\n\t}\n\n\tlogQuery(query: string, params: unknown[]): void {\n\t\tconst stringifiedParams = params.map((p) => {\n\t\t\ttry {\n\t\t\t\treturn JSON.stringify(p);\n\t\t\t} catch {\n\t\t\t\treturn String(p);\n\t\t\t}\n\t\t});\n\t\tconst paramsStr = stringifiedParams.length ? ` -- params: [${stringifiedParams.join(', ')}]` : '';\n\t\tthis.writer.write(`Query: ${query}${paramsStr}`);\n\t}\n}\n\nexport class NoopLogger implements Logger {\n\tstatic readonly [entityKind]: string = 'NoopLogger';\n\n\tlogQuery(): void {\n\t\t// noop\n\t}\n}\n", "import type { DatabaseSync, SQLInputValue, StatementResultingChanges, StatementSync } from 'node:sqlite';\nimport type * as V1 from '~/_relations.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { AnyRelations } from '~/relations.ts';\nimport { fillPlaceholders, type Query, sql } from '~/sql/sql.ts';\nimport type { SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\nimport { SQLiteTransaction } from '~/sqlite-core/index.ts';\nimport type { SelectedFieldsOrdered } from '~/sqlite-core/query-builders/select.types.ts';\nimport type {\n\tPreparedQueryConfig as PreparedQueryConfigBase,\n\tSQLiteExecuteMethod,\n\tSQLiteTransactionConfig,\n} from '~/sqlite-core/session.ts';\nimport { SQLitePreparedQuery as PreparedQueryBase, SQLiteSession } from '~/sqlite-core/session.ts';\nimport { type DrizzleTypeError, mapResultRow } from '~/utils.ts';\n\nexport interface NodeSQLiteSessionOptions {\n\tlogger?: Logger;\n}\n\ntype PreparedQueryConfig = Omit<PreparedQueryConfigBase, 'statement' | 'run'>;\n\nexport class NodeSQLiteSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTRelations extends AnyRelations,\n\tTSchema extends V1.TablesRelationalConfig,\n> extends SQLiteSession<'sync', StatementResultingChanges, TFullSchema, TRelations, TSchema> {\n\tstatic override readonly [entityKind]: string = 'SQLJsSession';\n\n\tprivate logger: Logger;\n\n\tconstructor(\n\t\tprivate client: DatabaseSync,\n\t\tdialect: SQLiteSyncDialect,\n\t\tprivate relations: TRelations,\n\t\tprivate schema: V1.RelationalSchemaConfig<TSchema> | undefined,\n\t\toptions: NodeSQLiteSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t}\n\n\tprepareQuery<T extends Omit<PreparedQueryConfig, 'run'>>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tisResponseInArrayMode: boolean,\n\t): NodeSQLitePreparedQuery<T> {\n\t\tconst stmt = this.client.prepare(query.sql);\n\t\treturn new NodeSQLitePreparedQuery(stmt, query, this.logger, fields, executeMethod, isResponseInArrayMode);\n\t}\n\n\tprepareRelationalQuery<T extends Omit<PreparedQueryConfig, 'run'>>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tcustomResultMapper: (rows: Record<string, unknown>[]) => unknown,\n\t): NodeSQLitePreparedQuery<T, true> {\n\t\tconst stmt = this.client.prepare(query.sql);\n\t\treturn new NodeSQLitePreparedQuery(\n\t\t\tstmt,\n\t\t\tquery,\n\t\t\tthis.logger,\n\t\t\tfields,\n\t\t\texecuteMethod,\n\t\t\tfalse,\n\t\t\tcustomResultMapper,\n\t\t\ttrue,\n\t\t);\n\t}\n\n\toverride transaction<T>(\n\t\ttransaction: (tx: NodeSQLiteTransaction<TFullSchema, TRelations, TSchema>) => T,\n\t\tconfig: SQLiteTransactionConfig = {},\n\t): T {\n\t\tconst tx = new NodeSQLiteTransaction('sync', this.dialect, this, this.relations, this.schema);\n\t\tthis.run(sql.raw(`begin${config.behavior ? ` ${config.behavior}` : ''}`));\n\t\ttry {\n\t\t\tconst result = transaction(tx);\n\t\t\tthis.run(sql`commit`);\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tthis.run(sql`rollback`);\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport class NodeSQLiteTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTRelations extends AnyRelations,\n\tTSchema extends V1.TablesRelationalConfig,\n> extends SQLiteTransaction<'sync', StatementResultingChanges, TFullSchema, TRelations, TSchema> {\n\tstatic override readonly [entityKind]: string = 'SQLJsTransaction';\n\n\toverride transaction<T>(\n\t\ttransaction: (\n\t\t\ttx: NodeSQLiteTransaction<TFullSchema, TRelations, TSchema>,\n\t\t) => T extends Promise<any> ? DrizzleTypeError<\"Sync drivers can't use async functions in transactions!\">\n\t\t\t: T,\n\t): T {\n\t\tconst savepointName = `sp${this.nestedIndex + 1}`;\n\t\tconst tx = new NodeSQLiteTransaction(\n\t\t\t'sync',\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tthis.relations,\n\t\t\tthis.schema,\n\t\t\tthis.nestedIndex + 1,\n\t\t);\n\t\ttx.run(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = transaction(tx);\n\t\t\ttx.run(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result as T;\n\t\t} catch (err) {\n\t\t\ttx.run(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport class NodeSQLitePreparedQuery<\n\tT extends PreparedQueryConfig = PreparedQueryConfig,\n\tTIsRqbV2 extends boolean = false,\n> extends PreparedQueryBase<\n\t{ type: 'sync'; run: void; all: T['all']; get: T['get']; values: T['values']; execute: T['execute'] }\n> {\n\tstatic override readonly [entityKind]: string = 'SQLJsPreparedQuery';\n\n\tconstructor(\n\t\tprivate stmt: StatementSync,\n\t\tquery: Query,\n\t\tprivate logger: Logger,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tprivate customResultMapper?: (\n\t\t\trows: TIsRqbV2 extends true ? Record<string, unknown>[] : unknown[][],\n\t\t\tmapColumnValue?: (value: unknown) => unknown,\n\t\t) => unknown,\n\t\tprivate isRqbV2Query?: TIsRqbV2,\n\t) {\n\t\tsuper('sync', executeMethod, query);\n\t}\n\n\trun(placeholderValues: Record<string, unknown> = {}): StatementResultingChanges {\n\t\tconst { stmt } = this;\n\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues);\n\t\tthis.logger.logQuery(this.query.sql, params);\n\n\t\tconst result = stmt.run(...params as SQLInputValue[]);\n\n\t\treturn result;\n\t}\n\n\tall(placeholderValues: Record<string, unknown> = {}): T['all'] {\n\t\tif (this.isRqbV2Query) return this.allRqbV2(placeholderValues);\n\t\tconst { stmt } = this;\n\n\t\tconst { fields, joinsNotNullableMap, logger, query, customResultMapper } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\tconst params = fillPlaceholders(query.params, placeholderValues);\n\t\t\tlogger.logQuery(query.sql, params);\n\n\t\t\tstmt.setReturnArrays(false);\n\t\t\tconst rows = stmt.all(...params as SQLInputValue[]);\n\n\t\t\treturn rows;\n\t\t}\n\n\t\tstmt.setReturnArrays(true);\n\t\tconst rows = this.values(placeholderValues) as unknown[][];\n\n\t\tif (customResultMapper) {\n\t\t\treturn (customResultMapper as (\n\t\t\t\trows: unknown[][],\n\t\t\t\tmapColumnValue?: (value: unknown) => unknown,\n\t\t\t) => unknown)(rows) as T['all'];\n\t\t}\n\n\t\treturn rows.map((row) => mapResultRow(fields!, row, joinsNotNullableMap));\n\t}\n\n\tprivate allRqbV2(placeholderValues: Record<string, unknown> = {}): T['all'] {\n\t\tconst { stmt } = this;\n\n\t\tconst { logger, query, customResultMapper } = this;\n\t\tconst params = fillPlaceholders(query.params, placeholderValues);\n\t\tlogger.logQuery(query.sql, params);\n\n\t\tstmt.setReturnArrays(false);\n\t\tconst rows = stmt.all(...params as SQLInputValue[]).map((row) => ({ ...row })); // [Object: null prototype] => Object\n\n\t\treturn (customResultMapper as (\n\t\t\trows: Record<string, unknown>[],\n\t\t\tmapColumnValue?: (value: unknown) => unknown,\n\t\t) => unknown)(rows) as T['all'];\n\t}\n\n\tget(placeholderValues: Record<string, unknown> = {}): T['get'] {\n\t\tif (this.isRqbV2Query) return this.getRqbV2(placeholderValues);\n\t\tconst { stmt } = this;\n\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues);\n\t\tthis.logger.logQuery(this.query.sql, params);\n\n\t\tconst { fields, joinsNotNullableMap, customResultMapper } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\tstmt.setReturnArrays(false);\n\t\t\tconst result = stmt.get(...params as SQLInputValue[]);\n\n\t\t\treturn result;\n\t\t}\n\n\t\tstmt.setReturnArrays(true);\n\t\tconst row = stmt.get(...params as SQLInputValue[]) as any as unknown[];\n\n\t\tif (!row) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (customResultMapper) {\n\t\t\treturn (customResultMapper as (\n\t\t\t\trows: unknown[][],\n\t\t\t\tmapColumnValue?: (value: unknown) => unknown,\n\t\t\t) => unknown)([row]) as T['get'];\n\t\t}\n\n\t\treturn mapResultRow(fields!, row, joinsNotNullableMap);\n\t}\n\n\tprivate getRqbV2(placeholderValues: Record<string, unknown> = {}): T['get'] {\n\t\tconst { stmt } = this;\n\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues);\n\t\tthis.logger.logQuery(this.query.sql, params);\n\n\t\tconst { customResultMapper } = this;\n\n\t\tstmt.setReturnArrays(false);\n\t\tconst row = stmt.get(...params as SQLInputValue[]);\n\n\t\tif (!row) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn (customResultMapper as (\n\t\t\trows: Record<string, unknown>[],\n\t\t\tmapColumnValue?: (value: unknown) => unknown,\n\t\t) => unknown)([{ ...row }]) as T['get']; // [Object: null prototype] => Object\n\t}\n\n\tvalues(placeholderValues: Record<string, unknown> = {}): T['values'] {\n\t\tconst { stmt } = this;\n\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues);\n\t\tthis.logger.logQuery(this.query.sql, params);\n\n\t\tstmt.setReturnArrays(true);\n\t\treturn stmt.all(...params as SQLInputValue[]);\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n", "import { DatabaseSync, type DatabaseSyncOptions, type StatementResultingChanges } from 'node:sqlite';\nimport * as V1 from '~/_relations.ts';\nimport { entityKind } from '~/entity.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport type { AnyRelations, EmptyRelations } from '~/relations.ts';\nimport { BaseSQLiteDatabase } from '~/sqlite-core/db.ts';\nimport { SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\nimport type { DrizzleConfig } from '~/utils.ts';\nimport { NodeSQLiteSession } from './session.ts';\n\nexport class NodeSQLiteDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTRelations extends AnyRelations = EmptyRelations,\n> extends BaseSQLiteDatabase<'sync', StatementResultingChanges, TSchema, TRelations> {\n\tstatic override readonly [entityKind]: string = 'NodeSQLiteDatabase';\n}\n\nexport type DrizzleNodeSQLiteDatabaseConfig =\n\t| ({\n\t\tpath?: string;\n\t} & DatabaseSyncOptions)\n\t| string\n\t| undefined;\n\nfunction construct<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTRelations extends AnyRelations = EmptyRelations,\n>(\n\tclient: DatabaseSync,\n\tconfig: DrizzleConfig<TSchema, TRelations> = {},\n): NodeSQLiteDatabase<TSchema, TRelations> & {\n\t$client: DatabaseSync;\n} {\n\tconst dialect = new SQLiteSyncDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: V1.RelationalSchemaConfig<V1.TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = V1.extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tV1.createTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst relations = config.relations ?? {} as TRelations;\n\tconst session = new NodeSQLiteSession<\n\t\tTSchema,\n\t\tTRelations,\n\t\tV1.ExtractTablesWithRelations<TSchema>\n\t>(client, dialect, relations, schema as V1.RelationalSchemaConfig<any>, { logger });\n\tconst db = new NodeSQLiteDatabase(\n\t\t'sync',\n\t\tdialect,\n\t\tsession,\n\t\trelations,\n\t\tschema as V1.RelationalSchemaConfig<any>,\n\t) as NodeSQLiteDatabase<\n\t\tTSchema,\n\t\tTRelations\n\t>;\n\t(<any> db).$client = client;\n\n\treturn db as any;\n}\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTRelations extends AnyRelations = EmptyRelations,\n\tTClient extends DatabaseSync = DatabaseSync,\n>(\n\t...params:\n\t\t| []\n\t\t| [\n\t\t\tstring,\n\t\t]\n\t\t| [\n\t\t\tstring,\n\t\t\tDrizzleConfig<TSchema, TRelations>,\n\t\t]\n\t\t| [\n\t\t\t(\n\t\t\t\t& DrizzleConfig<TSchema, TRelations>\n\t\t\t\t& ({\n\t\t\t\t\tconnection?: DrizzleNodeSQLiteDatabaseConfig | string;\n\t\t\t\t} | {\n\t\t\t\t\tclient: TClient;\n\t\t\t\t})\n\t\t\t),\n\t\t]\n): NodeSQLiteDatabase<TSchema, TRelations> & {\n\t$client: TClient;\n} {\n\tif (params[0] === undefined || typeof params[0] === 'string') {\n\t\tconst instance = params[0] === undefined ? new DatabaseSync(':memory:') : new DatabaseSync(params[0]);\n\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tconst { connection, client, ...drizzleConfig } = params[0] as\n\t\t& ({\n\t\t\tconnection?: DrizzleNodeSQLiteDatabaseConfig | string;\n\t\t\tclient?: TClient;\n\t\t})\n\t\t& DrizzleConfig<TSchema, TRelations>;\n\n\tif (client) return construct(client, drizzleConfig) as any;\n\n\tif (typeof connection === 'object') {\n\t\tconst { path, ...options } = connection;\n\n\t\tconst instance = new DatabaseSync(path ?? ':memory:', options);\n\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\tconst instance = new DatabaseSync(connection ?? ':memory:');\n\n\treturn construct(instance, drizzleConfig) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<\n\t\tTSchema extends Record<string, unknown> = Record<string, never>,\n\t\tTRelations extends AnyRelations = EmptyRelations,\n\t>(\n\t\tconfig?: DrizzleConfig<TSchema, TRelations>,\n\t): NodeSQLiteDatabase<TSchema, TRelations> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n", "import { NodeSQLitePreparedQuery, NodeSQLiteSession, NodeSQLiteTransaction } from \"./session.js\";\nimport { NodeSQLiteDatabase, drizzle } from \"./driver.js\";\n\nexport { NodeSQLiteDatabase, NodeSQLitePreparedQuery, NodeSQLiteSession, NodeSQLiteTransaction, drizzle };", "/**\n * Zod validation schemas for {@link AcceptanceGate} and related types.\n *\n * Kept in a separate file from the plain TypeScript types so that consumers\n * that do not need runtime validation (e.g. type-only imports) pay zero cost.\n *\n * All schemas are named `*Schema` and derive their inferred types from the\n * canonical TypeScript interfaces in `./acceptance-gate.ts`.\n *\n * @epic T760\n * @task T763\n * @task T779\n */\n\nimport { z } from 'zod';\n\n// \u2500\u2500\u2500 Base schema \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Zod schema for {@link GateBase} \u2014 fields every gate variant carries.\n *\n * Not exported as a standalone validator because it is always composed into a\n * full gate schema via `z.discriminatedUnion`. Exported so downstream packages\n * can extend it (e.g. for migration or testing).\n */\nexport const gateBaseSchema = z.object({\n /** Optional GSD-style REQ-ID, e.g. `\"TIMER-03\"`. */\n req: z.string().optional(),\n /** Human-readable description of what the gate checks. Required. */\n description: z.string().min(1),\n /** When true, failure is recorded as a warning rather than a block. */\n advisory: z.boolean().optional(),\n /** Per-gate timeout override in milliseconds. */\n timeoutMs: z.number().int().positive().optional(),\n});\n\n// \u2500\u2500\u2500 File assertion schemas \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Zod schema for {@link FileAssertion}.\n *\n * Each variant carries a `type` literal that drives the discriminated union.\n */\nexport const fileAssertionSchema = z.discriminatedUnion('type', [\n z.object({ type: z.literal('exists') }),\n z.object({ type: z.literal('absent') }),\n z.object({ type: z.literal('nonEmpty') }),\n z.object({ type: z.literal('maxBytes'), value: z.number().int().nonnegative() }),\n z.object({ type: z.literal('minBytes'), value: z.number().int().nonnegative() }),\n z.object({ type: z.literal('contains'), value: z.string() }),\n z.object({\n type: z.literal('matches'),\n /** Serialized `RegExp` source string. */\n regex: z.string().min(1),\n /** Optional `RegExp` flags, e.g. `\"gim\"`. */\n flags: z.string().optional(),\n }),\n z.object({ type: z.literal('sha256'), value: z.string().length(64) }),\n]);\n\n/** Inferred TypeScript type from {@link fileAssertionSchema}. */\nexport type FileAssertionInput = z.input<typeof fileAssertionSchema>;\n\n// \u2500\u2500\u2500 Individual gate schemas \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Zod schema for {@link TestGate}.\n *\n * Validates that `command` is present and `expect` is one of the two allowed\n * literal values.\n */\nexport const testGateSchema = gateBaseSchema.extend({\n kind: z.literal('test'),\n command: z.string().min(1),\n args: z.array(z.string()).optional(),\n expect: z.enum(['pass', 'exit0']),\n minCount: z.number().int().nonnegative().optional(),\n cwd: z.string().optional(),\n env: z.record(z.string(), z.string()).optional(),\n});\n\n/** Zod schema for {@link FileGate}. */\nexport const fileGateSchema = gateBaseSchema.extend({\n kind: z.literal('file'),\n /** Absolute or project-root-relative file path. Mutually exclusive with `attachmentSha256`. */\n path: z.string().min(1).optional(),\n /**\n * SHA-256 hex of an attachment blob. Gate runner resolves the on-disk path\n * via AttachmentStore. Mutually exclusive with `path`.\n */\n attachmentSha256: z\n .string()\n .regex(/^[0-9a-f]{64}$/i, 'attachmentSha256 must be a 64-char hex string')\n .optional(),\n assertions: z.array(fileAssertionSchema).min(1),\n});\n\n/** Zod schema for {@link CommandGate}. */\nexport const commandGateSchema = gateBaseSchema.extend({\n kind: z.literal('command'),\n cmd: z.string().min(1),\n args: z.array(z.string()).optional(),\n exitCode: z.number().int().optional(),\n stdoutMatches: z.string().optional(),\n stderrMatches: z.string().optional(),\n cwd: z.string().optional(),\n env: z.record(z.string(), z.string()).optional(),\n});\n\n/** Zod schema for {@link LintGate}. */\nexport const lintGateSchema = gateBaseSchema.extend({\n kind: z.literal('lint'),\n tool: z.enum(['biome', 'eslint', 'tsc', 'prettier', 'rustc', 'clippy']),\n args: z.array(z.string()).optional(),\n expect: z.enum(['clean', 'noErrors']),\n cwd: z.string().optional(),\n});\n\n/** Zod schema for {@link HttpGate}. */\nexport const httpGateSchema = gateBaseSchema.extend({\n kind: z.literal('http'),\n url: z.string().url(),\n method: z.enum(['GET', 'HEAD', 'POST', 'PUT', 'DELETE']).optional(),\n status: z.number().int().min(100).max(599),\n bodyMatches: z.string().optional(),\n headers: z.record(z.string(), z.string()).optional(),\n startCommand: z.string().optional(),\n startupDelayMs: z.number().int().nonnegative().optional(),\n});\n\n/** Zod schema for {@link ManualGate}. */\nexport const manualGateSchema = gateBaseSchema.extend({\n kind: z.literal('manual'),\n prompt: z.string().min(1),\n verdicts: z.array(z.enum(['pass', 'fail', 'warn'])).optional(),\n});\n\n// \u2500\u2500\u2500 Discriminated union \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Zod discriminated-union schema for {@link AcceptanceGate}.\n *\n * Uses `z.discriminatedUnion('kind', [...])` for O(1) variant lookup.\n * Parse with `acceptanceGateSchema.parse(input)` or\n * `acceptanceGateSchema.safeParse(input)`.\n *\n * @example\n * ```ts\n * const gate = acceptanceGateSchema.parse({\n * kind: 'test',\n * command: 'pnpm test',\n * expect: 'pass',\n * description: 'Test suite must pass',\n * });\n * ```\n */\nexport const acceptanceGateSchema = z.discriminatedUnion('kind', [\n testGateSchema,\n fileGateSchema,\n commandGateSchema,\n lintGateSchema,\n httpGateSchema,\n manualGateSchema,\n]);\n\n/** Inferred TypeScript type from {@link acceptanceGateSchema}. */\nexport type AcceptanceGateSchemaInput = z.input<typeof acceptanceGateSchema>;\n\n// \u2500\u2500\u2500 GateResultDetails schema (T802) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Zod discriminated-union schema for {@link GateResultDetails}.\n *\n * Each variant mirrors the corresponding {@link AcceptanceGate} kind so\n * callers can narrow `details` using the `kind` discriminant.\n *\n * @epic T760\n * @task T802\n */\nexport const gateResultDetailsSchema = z.discriminatedUnion('kind', [\n z.object({\n kind: z.literal('test'),\n exitCode: z.number().int(),\n stdout: z.string(),\n stderr: z.string(),\n duration: z.number().nonnegative(),\n }),\n z.object({\n kind: z.literal('file'),\n path: z.string().min(1),\n passedAssertions: z.array(z.string()),\n failedAssertions: z.array(z.string()),\n }),\n z.object({\n kind: z.literal('command'),\n cmd: z.string().min(1),\n exitCode: z.number().int(),\n stdout: z.string(),\n }),\n z.object({\n kind: z.literal('lint'),\n tool: z.string().min(1),\n warnings: z.number().int().nonnegative(),\n errors: z.number().int().nonnegative(),\n }),\n z.object({\n kind: z.literal('http'),\n url: z.string(),\n status: z.number().int().min(100).max(599),\n body: z.string(),\n }),\n z.object({\n kind: z.literal('manual'),\n prompt: z.string().min(1),\n accepted: z.boolean(),\n }),\n]);\n\n/** Inferred TypeScript type from {@link gateResultDetailsSchema}. */\nexport type GateResultDetailsInput = z.input<typeof gateResultDetailsSchema>;\n\n// \u2500\u2500\u2500 Result schema \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Zod schema for {@link AcceptanceGateResult}.\n *\n * Validates the shape produced by the gate runner and stored in\n * `lifecycle_gate_results`.\n */\nexport const acceptanceGateResultSchema = z.object({\n index: z.number().int().nonnegative(),\n req: z.string().optional(),\n kind: z.enum(['test', 'file', 'command', 'lint', 'http', 'manual']),\n result: z.enum(['pass', 'fail', 'warn', 'skipped', 'error']),\n durationMs: z.number().nonnegative(),\n /** Typed kind-specific detail payload (T802). */\n details: gateResultDetailsSchema.optional(),\n evidence: z.string().optional(),\n errorMessage: z.string().optional(),\n /** ISO 8601 timestamp. */\n checkedAt: z.string().datetime(),\n checkedBy: z.string().min(1),\n});\n\n/** Inferred TypeScript type from {@link acceptanceGateResultSchema}. */\nexport type AcceptanceGateResultInput = z.input<typeof acceptanceGateResultSchema>;\n\n// \u2500\u2500\u2500 Mixed acceptance item schema (T780 + T800) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Zod schema for a single acceptance criterion \u2014 either a non-empty string\n * (legacy) or a structured {@link AcceptanceGate} (machine-verifiable).\n *\n * **Tightened (T800)**: Rejects empty strings, whitespace-only strings, and\n * any non-gate objects. Clear error messages guide callers toward valid input.\n *\n * Strings are validated with `z.string().trim().min(1)` to eliminate empty\n * and whitespace-only criteria. The gate branch uses the existing discriminated-union\n * schema so all six gate kinds (`test`, `file`, `command`, `lint`, `http`, `manual`)\n * are accepted.\n *\n * @example\n * ```ts\n * acceptanceItemSchema.parse('must render in <100ms'); // => 'must render in <100ms'\n * acceptanceItemSchema.parse({ kind: 'test', command: 'pnpm test', expect: 'pass', description: '...' }); // => TestGate\n * acceptanceItemSchema.parse(''); // ERROR: string must be non-empty\n * acceptanceItemSchema.parse({ foo: 'bar' }); // ERROR: invalid gate object\n * ```\n *\n * @epic T760\n * @task T780\n * @task T800\n */\nexport const acceptanceItemSchema = z.union([\n z\n .string()\n .trim()\n .min(1, {\n message:\n 'Acceptance string criterion must be non-empty. Provide a non-blank description or a valid AcceptanceGate object.',\n })\n .describe('Free-text legacy acceptance criterion (non-empty string)'),\n acceptanceGateSchema.describe('Structured machine-verifiable acceptance gate'),\n]);\n\n/** Inferred TypeScript type from {@link acceptanceItemSchema}. */\nexport type AcceptanceItemInput = z.input<typeof acceptanceItemSchema>;\n\n/**\n * Zod schema for a mixed acceptance array \u2014 `(string | AcceptanceGate)[]`.\n *\n * **Tightened (T800)**:\n * - Requires at least 1 item (matching CLEO's anti-hallucination policy).\n * - Rejects duplicate `req:` GSD-style REQ-IDs within the same array.\n *\n * Use this to validate the full `Task.acceptance` field after widening (T780).\n *\n * @example\n * ```ts\n * // Valid: mixed types with unique req IDs\n * acceptanceArraySchema.parse([\n * 'must render in <100ms',\n * { kind: 'test', command: 'pnpm test', expect: 'pass', description: 'Tests pass', req: 'TEST-01' }\n * ]);\n *\n * // ERROR: empty array\n * acceptanceArraySchema.parse([]);\n *\n * // ERROR: duplicate req:'TEST-01' across two gates\n * acceptanceArraySchema.parse([\n * { kind: 'test', command: 'pnpm test', expect: 'pass', description: 'Tests pass', req: 'TEST-01' },\n * { kind: 'file', path: 'README.md', assertions: [{ type: 'exists' }], description: 'README exists', req: 'TEST-01' }\n * ]);\n * ```\n *\n * @epic T760\n * @task T780\n * @task T800\n */\nexport const acceptanceArraySchema = z\n .array(acceptanceItemSchema)\n .min(1, {\n message:\n 'Task must have at least one acceptance criterion. Provide a non-empty string or a valid AcceptanceGate object.',\n })\n .refine(\n (items) => {\n // Extract all req: values from gates (skip plain strings)\n const reqIds = new Set<string>();\n for (const item of items) {\n if (typeof item === 'object' && item !== null && 'req' in item && item.req) {\n if (reqIds.has(item.req)) {\n return false; // Duplicate found\n }\n reqIds.add(item.req);\n }\n }\n return true; // No duplicates\n },\n {\n message:\n 'Duplicate req: (REQ-ID) values within the same acceptance array. Each GSD-style requirement ID must be unique. Check for repeated req fields and ensure each gate has a distinct identifier.',\n },\n );\n\n/** Inferred TypeScript type from {@link acceptanceArraySchema}. */\nexport type AcceptanceArrayInput = z.input<typeof acceptanceArraySchema>;\n", "/**\n * Zod validation schemas for {@link Attachment} and related types.\n *\n * Kept in a separate file from the plain TypeScript types so that consumers\n * that do not need runtime validation (e.g. type-only imports) pay zero cost.\n *\n * All schemas are named `*Schema` and their inferred types are compatible with\n * the canonical TypeScript interfaces in `./attachment.ts`.\n *\n * Uses `z.discriminatedUnion('kind', [...])` for O(1) variant lookup on the\n * `kind` discriminant.\n *\n * @epic T760\n * @task T795\n */\n\nimport { z } from 'zod';\n\n// \u2500\u2500\u2500 Shared field schemas \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Common optional fields shared by all attachment variants.\n *\n * Not exported as a standalone validator \u2014 always composed into full variant\n * schemas via `.extend()`.\n */\nconst attachmentCommonSchema = z.object({\n /** Free-text description of what this attachment contains. */\n description: z.string().optional(),\n /** Labels for filtering (e.g., `[\"rfc\", \"spec\"]`). */\n labels: z.array(z.string()).optional(),\n});\n\n// \u2500\u2500\u2500 Variant schemas \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Zod schema for {@link LocalFileAttachment}.\n *\n * Validates that `path` is non-empty, `sha256` is a 64-character hex string,\n * and `size` is a non-negative integer.\n */\nexport const localFileAttachmentSchema = attachmentCommonSchema.extend({\n kind: z.literal('local-file'),\n /** Path to the file (absolute or project-root-relative, forward-slashes only). */\n path: z.string().min(1),\n /** SHA-256 hex digest (64 hex characters). */\n sha256: z.string().length(64),\n /** IANA MIME type. */\n mime: z.string().min(1),\n /** File size in bytes (non-negative integer). */\n size: z.number().int().nonnegative(),\n});\n\n/**\n * Zod schema for {@link UrlAttachment}.\n *\n * Validates that `url` is a well-formed absolute URL. The optional `cachedSha256`\n * is validated as a 64-character hex string when present.\n */\nexport const urlAttachmentSchema = attachmentCommonSchema.extend({\n kind: z.literal('url'),\n /** The remote URL \u2014 must be a valid absolute URL. */\n url: z.string().url(),\n /** SHA-256 of the cached body (64 hex characters). */\n cachedSha256: z.string().length(64).optional(),\n /** ISO 8601 timestamp when the body was cached. */\n cachedAt: z.string().datetime().optional(),\n /** IANA MIME type detected from the Content-Type header. */\n mime: z.string().optional(),\n});\n\n/**\n * Zod schema for {@link BlobAttachment}.\n *\n * Validates that `sha256` is 64 hex characters, `storageKey` is non-empty,\n * and `size` is a non-negative integer.\n */\nexport const blobAttachmentSchema = attachmentCommonSchema.extend({\n kind: z.literal('blob'),\n /** SHA-256 hex digest of the uncompressed content (64 hex characters). */\n sha256: z.string().length(64),\n /** Storage key inside `.cleo/attachments/sha256/`. */\n storageKey: z.string().min(1),\n /** IANA MIME type. */\n mime: z.string().min(1),\n /** Size of the uncompressed content in bytes. */\n size: z.number().int().nonnegative(),\n});\n\n/**\n * Zod schema for {@link LlmsTxtAttachment}.\n *\n * Validates that `content` is non-empty, `sha256` is 64 hex characters, and\n * `source` is one of the two allowed literal values.\n */\nexport const llmsTxtAttachmentSchema = attachmentCommonSchema.extend({\n kind: z.literal('llms-txt'),\n /** Where the llms.txt content originated. */\n source: z.enum(['url', 'generated']),\n /** Full markdown content of the llms.txt (stored inline). */\n content: z.string().min(1),\n /** SHA-256 hex digest of `content` (64 hex characters). */\n sha256: z.string().length(64),\n});\n\n/**\n * Zod schema for {@link LlmtxtDocAttachment}.\n *\n * Validates that `slug` is non-empty and `backend` is one of the two allowed\n * literal values. `pinnedVersion` is an opaque string when present.\n */\nexport const llmtxtDocAttachmentSchema = attachmentCommonSchema.extend({\n kind: z.literal('llmtxt-doc'),\n /** Document slug from the llmtxt backend. */\n slug: z.string().min(1),\n /** Which backend owns the document. */\n backend: z.enum(['local', 'remote']),\n /**\n * Version string pinned at attach time.\n *\n * Opaque: integer version for local backends, API-assigned string for remote.\n */\n pinnedVersion: z.string().optional(),\n});\n\n// \u2500\u2500\u2500 Discriminated union \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Zod discriminated-union schema for {@link Attachment}.\n *\n * Uses `z.discriminatedUnion('kind', [...])` for O(1) variant lookup.\n * Parse with `attachmentSchema.parse(input)` or\n * `attachmentSchema.safeParse(input)`.\n *\n * @example\n * ```ts\n * const att = attachmentSchema.parse({\n * kind: 'local-file',\n * path: 'docs/rfc-003.md',\n * sha256: 'a'.repeat(64),\n * mime: 'text/markdown',\n * size: 8192,\n * description: 'RFC draft v3',\n * });\n * ```\n */\nexport const attachmentSchema = z.discriminatedUnion('kind', [\n localFileAttachmentSchema,\n urlAttachmentSchema,\n blobAttachmentSchema,\n llmsTxtAttachmentSchema,\n llmtxtDocAttachmentSchema,\n]);\n\n/** Inferred TypeScript type from {@link attachmentSchema}. */\nexport type AttachmentSchemaInput = z.input<typeof attachmentSchema>;\n\n// \u2500\u2500\u2500 AttachmentMetadata schema \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Zod schema for {@link AttachmentMetadata}.\n *\n * Validates the persisted registry row. The embedded `attachment` field is\n * validated recursively through the discriminated union.\n */\nexport const attachmentMetadataSchema = z.object({\n /**\n * Unique attachment ID.\n *\n * Pattern: `att_<base62>` or UUID fallback. Must be non-empty.\n */\n id: z.string().min(1),\n /**\n * Content hash \u2014 SHA-256 hex (64 chars) for byte-backed kinds, empty string\n * for kinds that delegate content storage externally.\n */\n sha256: z.string(),\n /** The full attachment value (validated through the discriminated union). */\n attachment: attachmentSchema,\n /** ISO 8601 creation timestamp. */\n createdAt: z.string().datetime(),\n /**\n * Reference count \u2014 how many `AttachmentRef` rows point at this attachment.\n *\n * Must be a non-negative integer.\n */\n refCount: z.number().int().nonnegative(),\n});\n\n/** Inferred TypeScript type from {@link attachmentMetadataSchema}. */\nexport type AttachmentMetadataSchemaInput = z.input<typeof attachmentMetadataSchema>;\n\n// \u2500\u2500\u2500 AttachmentRef schema \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Zod schema for {@link AttachmentRef}.\n *\n * Validates the junction row linking one attachment to one owner. `ownerType`\n * is restricted to the six supported CLEO entity types.\n */\nexport const attachmentRefSchema = z.object({\n /** ID of the attachment (\u2192 `attachments.id`). Must be non-empty. */\n attachmentId: z.string().min(1),\n /**\n * The domain entity type that owns this attachment.\n *\n * Restricted to the six supported CLEO entity types.\n */\n ownerType: z.enum(['task', 'observation', 'session', 'decision', 'learning', 'pattern']),\n /** ID of the owning entity. Must be non-empty. */\n ownerId: z.string().min(1),\n /** ISO 8601 timestamp when the ref was created. */\n attachedAt: z.string().datetime(),\n /**\n * Agent identity (or `\"human\"`) that created the ref.\n *\n * Optional; populated from the active session credential when available.\n */\n attachedBy: z.string().optional(),\n});\n\n/** Inferred TypeScript type from {@link attachmentRefSchema}. */\nexport type AttachmentRefSchemaInput = z.input<typeof attachmentRefSchema>;\n", "/**\n * CLEO exit codes \u2014 canonical definitions shared across all layers.\n *\n * Ranges: 0 = success, 1-99 = errors, 100+ = special (non-error) states.\n *\n * @epic T4454\n * @task T4456\n * @task T5710\n */\n\nexport enum ExitCode {\n // === SUCCESS (0) ===\n SUCCESS = 0,\n\n // === GENERAL ERRORS (1-9) ===\n GENERAL_ERROR = 1,\n INVALID_INPUT = 2,\n FILE_ERROR = 3,\n NOT_FOUND = 4,\n DEPENDENCY_ERROR = 5,\n VALIDATION_ERROR = 6,\n LOCK_TIMEOUT = 7,\n CONFIG_ERROR = 8,\n\n // === HIERARCHY ERRORS (10-19) ===\n PARENT_NOT_FOUND = 10,\n DEPTH_EXCEEDED = 11,\n SIBLING_LIMIT = 12,\n INVALID_PARENT_TYPE = 13,\n CIRCULAR_REFERENCE = 14,\n ORPHAN_DETECTED = 15,\n HAS_CHILDREN = 16,\n TASK_COMPLETED = 17,\n CASCADE_FAILED = 18,\n HAS_DEPENDENTS = 19,\n\n // === CONCURRENCY ERRORS (20-29) ===\n CHECKSUM_MISMATCH = 20,\n CONCURRENT_MODIFICATION = 21,\n ID_COLLISION = 22,\n\n // === SESSION ERRORS (30-39) ===\n SESSION_EXISTS = 30,\n SESSION_NOT_FOUND = 31,\n SCOPE_CONFLICT = 32,\n SCOPE_INVALID = 33,\n TASK_NOT_IN_SCOPE = 34,\n TASK_CLAIMED = 35,\n SESSION_REQUIRED = 36,\n SESSION_CLOSE_BLOCKED = 37,\n ACTIVE_TASK_REQUIRED = 38,\n NOTES_REQUIRED = 39,\n\n // === VERIFICATION ERRORS (40-47) ===\n VERIFICATION_INIT_FAILED = 40,\n GATE_UPDATE_FAILED = 41,\n INVALID_GATE = 42,\n INVALID_AGENT = 43,\n MAX_ROUNDS_EXCEEDED = 44,\n GATE_DEPENDENCY = 45,\n VERIFICATION_LOCKED = 46,\n ROUND_MISMATCH = 47,\n\n // === CONTEXT SAFEGUARD (50-54) ===\n CONTEXT_WARNING = 50,\n CONTEXT_CAUTION = 51,\n CONTEXT_CRITICAL = 52,\n CONTEXT_EMERGENCY = 53,\n CONTEXT_STALE = 54,\n\n // === ORCHESTRATOR ERRORS (60-68) ===\n PROTOCOL_MISSING = 60,\n INVALID_RETURN_MESSAGE = 61,\n MANIFEST_ENTRY_MISSING = 62,\n SPAWN_VALIDATION_FAILED = 63,\n AUTONOMOUS_BOUNDARY = 64,\n HANDOFF_REQUIRED = 65,\n RESUME_FAILED = 66,\n CONCURRENT_SESSION = 67,\n /**\n * E_THIN_AGENT_VIOLATION \u2014 A worker or lead agent attempted to spawn another\n * agent, violating the thin-agent inversion-of-control rule (ORC-012).\n * Only orchestrators may spawn subagents; non-orchestrator roles must\n * escalate via the playbook approval gate.\n *\n * @task T889 Orchestration Coherence v3\n * @task T907 Thin-agent enforcement\n */\n THIN_AGENT_VIOLATION = 68,\n\n /**\n * E_ATOMICITY_VIOLATION \u2014 A worker-role spawn was attempted for a task that\n * exceeds the atomicity budget (more than {@link MAX_WORKER_FILES} files) or\n * lacks an explicit file-scope declaration on its acceptance criteria.\n *\n * Workers MUST remain atomic (\u2264 3 files with declared AC.files). Violations\n * should be split into child tasks or promoted to a lead role.\n *\n * @task T889 Orchestration Coherence v3\n * @task T894 Atomicity guard (W3-3)\n */\n ATOMICITY_VIOLATION = 69,\n\n // === NEXUS ERRORS (70-79) ===\n NEXUS_NOT_INITIALIZED = 70,\n NEXUS_PROJECT_NOT_FOUND = 71,\n NEXUS_PERMISSION_DENIED = 72,\n NEXUS_INVALID_SYNTAX = 73,\n NEXUS_SYNC_FAILED = 74,\n NEXUS_REGISTRY_CORRUPT = 75,\n NEXUS_PROJECT_EXISTS = 76,\n NEXUS_QUERY_FAILED = 77,\n NEXUS_GRAPH_ERROR = 78,\n NEXUS_RESERVED = 79,\n\n // === LIFECYCLE ENFORCEMENT (80-84) ===\n LIFECYCLE_GATE_FAILED = 80,\n AUDIT_MISSING = 81,\n CIRCULAR_VALIDATION = 82,\n LIFECYCLE_TRANSITION_INVALID = 83,\n PROVENANCE_REQUIRED = 84,\n\n // === ARTIFACT PUBLISH (85-89) ===\n ARTIFACT_TYPE_UNKNOWN = 85,\n ARTIFACT_VALIDATION_FAILED = 86,\n ARTIFACT_BUILD_FAILED = 87,\n ARTIFACT_PUBLISH_FAILED = 88,\n ARTIFACT_ROLLBACK_FAILED = 89,\n\n // === PROVENANCE (90-94) ===\n PROVENANCE_CONFIG_INVALID = 90,\n SIGNING_KEY_MISSING = 91,\n SIGNATURE_INVALID = 92,\n DIGEST_MISMATCH = 93,\n ATTESTATION_INVALID = 94,\n\n // === ADAPTER ERRORS (95-99) ===\n ADAPTER_NOT_FOUND = 95,\n ADAPTER_INIT_FAILED = 96,\n ADAPTER_HOOK_FAILED = 97,\n ADAPTER_SPAWN_FAILED = 98,\n ADAPTER_INSTALL_FAILED = 99,\n\n // === SPECIAL CODES (100+) - NOT errors ===\n NO_DATA = 100,\n ALREADY_EXISTS = 101,\n NO_CHANGE = 102,\n TESTS_SKIPPED = 103,\n\n // === LAFS ENVELOPE VALIDATION (Phase 6) ===\n /**\n * E_LAFS_VIOLATION \u2014 CLI output did not conform to the LAFS envelope\n * schema. Emitted by the CLI renderer middleware when `zod.parse()` on\n * the emitted envelope fails. This is an INTERNAL failure: CLEO itself\n * produced a malformed envelope.\n *\n * @task Phase 6 \u2014 LAFS formalization + schema consolidation\n */\n LAFS_VIOLATION = 104,\n}\n\n/** Check if an exit code represents an error (1-99). */\nexport function isErrorCode(code: ExitCode): boolean {\n return code >= 1 && code < 100;\n}\n\n/** Check if an exit code represents success (0 or 100+). */\nexport function isSuccessCode(code: ExitCode): boolean {\n return code === 0 || code >= 100;\n}\n\n/** Check if an exit code indicates no change (idempotent operation). */\nexport function isNoChangeCode(code: ExitCode): boolean {\n return code === ExitCode.NO_CHANGE;\n}\n\n/** Check if an exit code is recoverable (retry may succeed). */\nexport function isRecoverableCode(code: ExitCode): boolean {\n const nonRecoverable = new Set<ExitCode>([\n ExitCode.FILE_ERROR,\n ExitCode.DEPENDENCY_ERROR,\n ExitCode.CIRCULAR_REFERENCE,\n ExitCode.CASCADE_FAILED,\n ExitCode.SESSION_CLOSE_BLOCKED,\n ExitCode.VERIFICATION_LOCKED,\n ExitCode.CONTEXT_WARNING,\n ExitCode.CONTEXT_CAUTION,\n ExitCode.CONTEXT_CRITICAL,\n ExitCode.CONTEXT_EMERGENCY,\n ExitCode.CONTEXT_STALE,\n ExitCode.AUTONOMOUS_BOUNDARY,\n ExitCode.HANDOFF_REQUIRED,\n ExitCode.NEXUS_PERMISSION_DENIED,\n ExitCode.NEXUS_REGISTRY_CORRUPT,\n ExitCode.CIRCULAR_VALIDATION,\n ExitCode.LIFECYCLE_TRANSITION_INVALID,\n ExitCode.ARTIFACT_TYPE_UNKNOWN,\n ExitCode.ARTIFACT_ROLLBACK_FAILED,\n ExitCode.DIGEST_MISMATCH,\n ]);\n\n if (!isErrorCode(code)) return false;\n return !nonRecoverable.has(code);\n}\n\n/** Human-readable name for an exit code. */\nexport function getExitCodeName(code: ExitCode): string {\n return ExitCode[code] ?? 'UNKNOWN';\n}\n", "/**\n * Central error utilities for CLEO.\n *\n * Provides consistent error handling patterns across the codebase.\n * DRY error formatting, normalization, and transformation utilities.\n *\n * @task T5702\n */\n\nimport { ExitCode } from './exit-codes.js';\n\n/**\n * Thrown when a non-orchestrator role attempts to spawn another agent,\n * violating the thin-agent inversion-of-control rule (ORC-012).\n *\n * Only orchestrators may spawn subagents. Leads and workers must escalate\n * via the playbook approval gate defined in T889 Orchestration Coherence v3.\n *\n * @remarks\n * Emitted by the spawn-guard middleware when an agent's declared role does\n * not satisfy the orchestrator precondition. Carries `exitCode` aligned with\n * {@link ExitCode.THIN_AGENT_VIOLATION} so the CLI can surface exit 68 to\n * callers without additional mapping.\n *\n * @example\n * ```typescript\n * throw new ThinAgentViolationError('worker-42', 'lead', 'orchestrate spawn');\n * ```\n *\n * @task T889 Orchestration Coherence v3\n * @task T907 Thin-agent enforcement\n */\nexport class ThinAgentViolationError extends Error {\n /** Stable LAFS error code string for envelope emission. */\n readonly code = 'E_THIN_AGENT_VIOLATION';\n /** Numeric exit code aligned with {@link ExitCode.THIN_AGENT_VIOLATION}. */\n readonly exitCode: ExitCode = ExitCode.THIN_AGENT_VIOLATION;\n\n /**\n * @param agentId - The offending agent's unique identifier.\n * @param role - The offending agent's declared role (lead, worker, etc.).\n * @param attemptedAction - The spawn action that was blocked.\n */\n constructor(\n public readonly agentId: string,\n public readonly role: string,\n public readonly attemptedAction: string,\n ) {\n super(\n `E_THIN_AGENT_VIOLATION: agent '${agentId}' (role=${role}) attempted '${attemptedAction}'. ` +\n 'Only orchestrators may spawn. Escalate via playbook approval gate.',\n );\n this.name = 'ThinAgentViolationError';\n }\n}\n\n/**\n * Normalize any thrown value into a standardized error object.\n *\n * Handles:\n * - Error instances (preserves stack trace info)\n * - Strings (wraps in Error)\n * - Objects with message property\n * - null/undefined (provides fallback)\n *\n * @param error - The thrown value to normalize\n * @param fallbackMessage - Message to use if error provides none\n * @returns Normalized error with consistent shape\n *\n * @remarks\n * This function is safe to call on any value thrown by a `catch` clause.\n * It guarantees the returned object is always an `Error` instance with a\n * non-empty `message` property.\n *\n * @example\n * ```typescript\n * try {\n * await riskyOperation();\n * } catch (err) {\n * const error = normalizeError(err, 'Operation failed');\n * console.error(error.message);\n * }\n * ```\n */\nexport function normalizeError(\n error: unknown,\n fallbackMessage = 'An unexpected error occurred',\n): Error {\n if (error instanceof Error) {\n return error;\n }\n\n if (typeof error === 'string') {\n return new Error(error);\n }\n\n if (\n error !== null &&\n typeof error === 'object' &&\n 'message' in error &&\n typeof error.message === 'string'\n ) {\n return new Error(error.message);\n }\n\n return new Error(fallbackMessage);\n}\n\n/**\n * Extract a human-readable message from any error value.\n *\n * Safe to use on unknown thrown values without type guards.\n *\n * @param error - The error value\n * @param fallback - Fallback message if extraction fails\n * @returns The error message string\n *\n * @remarks\n * Inspects the value for an `Error` instance, a plain string, or an object\n * with a `message` property before falling back to the provided default.\n *\n * @example\n * ```typescript\n * const message = getErrorMessage(err, 'Unknown error');\n * ```\n */\nexport function getErrorMessage(error: unknown, fallback = 'Unknown error'): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n if (\n error !== null &&\n typeof error === 'object' &&\n 'message' in error &&\n typeof error.message === 'string'\n ) {\n return error.message;\n }\n\n return fallback;\n}\n\n/**\n * Format error details for logging or display.\n *\n * Includes stack trace for Error instances when includeStack is true.\n *\n * @param error - The error to format\n * @param context - Optional context to prepend\n * @param includeStack - Whether to include stack traces (default: false)\n * @returns Formatted error string\n *\n * @remarks\n * When `context` is provided it is prefixed in square brackets (e.g.\n * `[Database] Connection refused`). Stack traces are appended on a new line\n * only when `includeStack` is `true` and the value is an `Error` with a stack.\n *\n * @example\n * ```typescript\n * console.error(formatError(err, 'Database connection'));\n * // Output: [Database connection] Connection refused\n * ```\n */\nexport function formatError(error: unknown, context?: string, includeStack = false): string {\n const message = getErrorMessage(error);\n const prefix = context ? `[${context}] ` : '';\n let result = `${prefix}${message}`;\n\n if (includeStack && error instanceof Error && error.stack) {\n result += `\\n${error.stack}`;\n }\n\n return result;\n}\n\n/**\n * Check if an error represents a specific error type by code or name.\n *\n * Useful for conditional error handling based on error types.\n *\n * @param error - The error to check\n * @param codeOrName - The error code or name to match\n * @returns True if the error matches\n *\n * @remarks\n * Checks both `Error.name` and a custom `code` property, supporting both\n * standard and LAFS-style error codes (e.g. `\"E_NOT_FOUND\"`).\n *\n * @example\n * ```typescript\n * if (isErrorType(err, 'E_NOT_FOUND')) {\n * // Handle not found specifically\n * }\n * ```\n */\nexport function isErrorType(error: unknown, codeOrName: string): boolean {\n if (error instanceof Error) {\n if (error.name === codeOrName) {\n return true;\n }\n // Check for custom code property\n if ('code' in error && error.code === codeOrName) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Create a standardized error result object.\n *\n * Common pattern for operations that return { success: boolean, error?: string }\n *\n * @param error - The error value\n * @returns Error result object\n *\n * @remarks\n * Pairs with {@link createSuccessResult} and {@link isErrorResult} to provide\n * a consistent result-or-error pattern without exceptions.\n *\n * @example\n * ```typescript\n * return createErrorResult(err);\n * // Returns: { success: false, error: \"Something went wrong\" }\n * ```\n */\nexport function createErrorResult(error: unknown): { success: false; error: string } {\n return {\n success: false,\n error: getErrorMessage(error),\n };\n}\n\n/**\n * Create a standardized success result object.\n *\n * @returns Success result object\n *\n * @remarks\n * Pairs with {@link createErrorResult} and {@link isErrorResult} to provide\n * a consistent result-or-error pattern without exceptions.\n *\n * @example\n * ```typescript\n * return createSuccessResult();\n * // Returns: { success: true }\n * ```\n */\nexport function createSuccessResult(): { success: true } {\n return { success: true };\n}\n\n/**\n * Type guard for error results.\n *\n * @param result - The result to check\n * @returns True if the result is an error result\n *\n * @remarks\n * Narrows the result type so that `result.error` is guaranteed to be a string\n * after the guard returns `true`.\n *\n * @example\n * ```typescript\n * const result = await someOperation();\n * if (isErrorResult(result)) {\n * console.error(result.error);\n * }\n * ```\n */\nexport function isErrorResult(result: {\n success: boolean;\n error?: string;\n}): result is { success: false; error: string } {\n return !result.success;\n}\n", "/**\n * Zod validation schemas for {@link EvidenceRecord} and its variants.\n *\n * Kept in a separate file from the plain TypeScript types so that consumers\n * that do not need runtime validation (e.g. type-only imports) pay zero cost.\n *\n * All schemas are named `*RecordSchema` and derive their inferred types from\n * the canonical TypeScript interfaces in `./evidence-record.ts`.\n *\n * The top-level {@link evidenceRecordSchema} is a `z.discriminatedUnion` on\n * `\"kind\"` so Zod can route to the correct variant in O(1).\n *\n * @epic T810\n * @task T816\n */\n\nimport { z } from 'zod';\n\n// \u2500\u2500\u2500 Shared base fields \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Zod schema for the provenance fields shared by every EvidenceRecord variant.\n *\n * Not exported as a standalone validator; always composed into a full record\n * schema via `.extend()`.\n */\nconst evidenceBaseSchema = z.object({\n /** Identity string of the agent that produced this record. */\n agentIdentity: z.string().min(1),\n /** SHA-256 hex digest (64 chars) of the attached artifact. */\n attachmentSha256: z.string().length(64),\n /** ISO 8601 timestamp at which the action ran. */\n ranAt: z.string().datetime(),\n /** Wall-clock duration of the action in milliseconds. */\n durationMs: z.number().nonnegative(),\n});\n\n// \u2500\u2500\u2500 Individual variant schemas \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Zod schema for {@link ImplDiffRecord}.\n *\n * Validates that `filesChanged` is a non-empty array and that `linesAdded` /\n * `linesRemoved` are non-negative integers.\n */\nexport const implDiffRecordSchema = evidenceBaseSchema.extend({\n kind: z.literal('impl-diff'),\n phase: z.literal('implement'),\n filesChanged: z.array(z.string().min(1)).min(1),\n linesAdded: z.number().int().nonnegative(),\n linesRemoved: z.number().int().nonnegative(),\n});\n\n/** Inferred TypeScript type from {@link implDiffRecordSchema}. */\nexport type ImplDiffRecordInput = z.input<typeof implDiffRecordSchema>;\n\n/**\n * Zod schema for {@link ValidateSpecCheckRecord}.\n *\n * Validates that `reqIdsChecked` is non-empty and `details` is non-blank.\n */\nexport const validateSpecCheckRecordSchema = evidenceBaseSchema.extend({\n kind: z.literal('validate-spec-check'),\n phase: z.literal('validate'),\n reqIdsChecked: z.array(z.string().min(1)).min(1),\n passed: z.boolean(),\n details: z.string().min(1),\n});\n\n/** Inferred TypeScript type from {@link validateSpecCheckRecordSchema}. */\nexport type ValidateSpecCheckRecordInput = z.input<typeof validateSpecCheckRecordSchema>;\n\n/**\n * Zod schema for {@link TestOutputRecord}.\n *\n * Validates that `command` is non-blank and test counts are non-negative.\n */\nexport const testOutputRecordSchema = evidenceBaseSchema.extend({\n kind: z.literal('test-output'),\n phase: z.literal('test'),\n command: z.string().min(1),\n exitCode: z.number().int(),\n testsPassed: z.number().int().nonnegative(),\n testsFailed: z.number().int().nonnegative(),\n});\n\n/** Inferred TypeScript type from {@link testOutputRecordSchema}. */\nexport type TestOutputRecordInput = z.input<typeof testOutputRecordSchema>;\n\n/**\n * Zod schema for {@link LintReportRecord}.\n *\n * `phase` is restricted to `'implement' | 'test'`.\n * `warnings` and `errors` are non-negative integers.\n */\nexport const lintReportRecordSchema = evidenceBaseSchema.extend({\n kind: z.literal('lint-report'),\n phase: z.enum(['implement', 'test']),\n tool: z.string().min(1),\n passed: z.boolean(),\n warnings: z.number().int().nonnegative(),\n errors: z.number().int().nonnegative(),\n});\n\n/** Inferred TypeScript type from {@link lintReportRecordSchema}. */\nexport type LintReportRecordInput = z.input<typeof lintReportRecordSchema>;\n\n/**\n * Zod schema for {@link CommandOutputRecord}.\n *\n * `phase` can be `'implement'`, `'validate'`, or `'test'`.\n * `cmd` must be non-blank.\n */\nexport const commandOutputRecordSchema = evidenceBaseSchema.extend({\n kind: z.literal('command-output'),\n phase: z.enum(['implement', 'validate', 'test']),\n cmd: z.string().min(1),\n exitCode: z.number().int(),\n});\n\n/** Inferred TypeScript type from {@link commandOutputRecordSchema}. */\nexport type CommandOutputRecordInput = z.input<typeof commandOutputRecordSchema>;\n\n// \u2500\u2500\u2500 Discriminated union \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Zod discriminated-union schema for {@link EvidenceRecord}.\n *\n * Uses `z.discriminatedUnion('kind', [...])` for O(1) variant lookup.\n * Parse with `evidenceRecordSchema.parse(input)` or\n * `evidenceRecordSchema.safeParse(input)`.\n *\n * @example\n * ```ts\n * const rec = evidenceRecordSchema.parse({\n * kind: 'test-output',\n * phase: 'test',\n * agentIdentity: 'T816-worker',\n * attachmentSha256: 'a'.repeat(64),\n * command: 'pnpm test',\n * exitCode: 0,\n * testsPassed: 10,\n * testsFailed: 0,\n * ranAt: '2026-04-16T00:00:00.000Z',\n * durationMs: 1234,\n * });\n * ```\n */\nexport const evidenceRecordSchema = z.discriminatedUnion('kind', [\n implDiffRecordSchema,\n validateSpecCheckRecordSchema,\n testOutputRecordSchema,\n lintReportRecordSchema,\n commandOutputRecordSchema,\n]);\n\n/** Inferred TypeScript type from {@link evidenceRecordSchema}. */\nexport type EvidenceRecordInput = z.input<typeof evidenceRecordSchema>;\n", "/**\n * Facade API interfaces for the Cleo class.\n *\n * These define the public API surface that consumers (e.g. CleoOS) use\n * to interact with @cleocode/core via the `Cleo` facade. Defined here\n * in contracts so downstream packages can import types without depending\n * on core directly.\n *\n * @module facade\n */\n\nimport type { ConduitMessage } from './conduit.js';\nimport type {\n DataAccessor,\n ExternalTask,\n ExternalTaskLink,\n ReconcileOptions,\n ReconcileResult,\n Task,\n TaskPriority,\n TaskSize,\n TaskStatus,\n TaskType,\n} from './index.js';\n\n// ============================================================================\n// Supporting types (previously scattered across core modules)\n// ============================================================================\n\n// --- Brain / Memory ---\n\n/** Observation type categories for brain entries. */\nexport const BRAIN_OBSERVATION_TYPES = [\n 'discovery',\n 'change',\n 'feature',\n 'bugfix',\n 'decision',\n 'refactor',\n 'diary',\n] as const;\n\n/** Brain observation type. */\nexport type BrainObservationType = (typeof BRAIN_OBSERVATION_TYPES)[number];\n\n/** Options for hybrid (FTS + vector + graph) brain search. */\nexport interface HybridSearchOptions {\n /** Weight for full-text search results (0-1). */\n ftsWeight?: number;\n /** Weight for vector similarity results (0-1). */\n vecWeight?: number;\n /** Weight for graph-based results (0-1). */\n graphWeight?: number;\n /** Maximum number of results to return. */\n limit?: number;\n}\n\n// --- Admin / Import ---\n\n/** Strategy for handling duplicate tasks during import. */\nexport type DuplicateStrategy = 'skip' | 'overwrite' | 'rename';\n\n/** Parameters for task import operations. */\nexport interface ImportParams {\n /** Path to the import file. */\n file: string;\n /** Parent task ID for imported tasks. */\n parent?: string;\n /** Phase assignment for imported tasks. */\n phase?: string;\n /** Strategy when a duplicate task ID is found. */\n onDuplicate?: DuplicateStrategy;\n /** Label to add to all imported tasks. */\n addLabel?: string;\n /** If true, simulate the import without persisting. */\n dryRun?: boolean;\n /** Working directory for resolving paths. */\n cwd?: string;\n}\n\n// --- Agents ---\n\n/** Agent instance status values. */\nexport const AGENT_INSTANCE_STATUSES = [\n 'starting',\n 'active',\n 'idle',\n 'error',\n 'crashed',\n 'stopped',\n] as const;\n\n/** Agent instance status type. */\nexport type AgentInstanceStatus = (typeof AGENT_INSTANCE_STATUSES)[number];\n\n/** Agent type classification values. */\nexport const AGENT_TYPES = [\n 'orchestrator',\n 'executor',\n 'researcher',\n 'architect',\n 'validator',\n 'documentor',\n 'custom',\n] as const;\n\n/** Agent type classification. */\nexport type AgentType = (typeof AGENT_TYPES)[number];\n\n/**\n * Row shape for the `agent_instances` table.\n *\n * Manually defined to avoid Drizzle dependency in contracts.\n * Must stay in sync with `packages/core/src/agents/agent-schema.ts`.\n */\nexport interface AgentInstanceRow {\n /** Unique agent instance ID. */\n id: string;\n /** Agent type classification. */\n agentType: AgentType;\n /** Current status. */\n status: AgentInstanceStatus;\n /** Associated session ID (nullable). */\n sessionId: string | null;\n /** Associated task ID (nullable). */\n taskId: string | null;\n /** ISO timestamp when the agent started. */\n startedAt: string;\n /** ISO timestamp of the last heartbeat. */\n lastHeartbeat: string;\n /** ISO timestamp when the agent stopped (nullable). */\n stoppedAt: string | null;\n /** Number of errors encountered. */\n errorCount: number;\n /** Total tasks completed by this agent. */\n totalTasksCompleted: number;\n /** Agent capacity as a string (e.g. \"1.0\"). */\n capacity: string;\n /** JSON-encoded metadata. */\n metadataJson: string | null;\n /** Parent agent ID for hierarchical orchestration (nullable). */\n parentAgentId: string | null;\n}\n\n/** Options for registering a new agent instance. */\nexport interface RegisterAgentOptions {\n /** Agent type classification. */\n agentType: AgentType;\n /** Session to associate with. */\n sessionId?: string;\n /** Task to associate with. */\n taskId?: string;\n /** Parent agent ID for hierarchical orchestration. */\n parentAgentId?: string;\n /** Arbitrary metadata. */\n metadata?: Record<string, unknown>;\n}\n\n/** Agent capacity information. */\nexport interface AgentCapacity {\n /** Agent instance ID. */\n agentId: string;\n /** Agent type classification. */\n agentType: AgentType;\n /** Current status of the agent. */\n status: AgentInstanceStatus;\n /** Number of tasks currently assigned to this agent. */\n activeTasks: number;\n /** Number of additional tasks this agent can accept (max - active). */\n remainingCapacity: number;\n /** Maximum tasks this agent can hold. */\n maxCapacity: number;\n /** Whether this agent can accept new tasks. */\n available: boolean;\n}\n\n/** Agent health status from heartbeat monitoring. */\nexport interface AgentHealthStatus {\n /** Agent instance ID. */\n agentId: string;\n /** Current DB status. */\n status: AgentInstanceStatus;\n /** ISO timestamp of the last recorded heartbeat. */\n lastHeartbeat: string;\n /** Milliseconds since the last recorded heartbeat (at call time). */\n heartbeatAgeMs: number;\n /** Whether the agent is considered healthy (heartbeat within threshold). */\n healthy: boolean;\n /** Whether the agent is considered stale (heartbeat older than threshold). */\n stale: boolean;\n /** Threshold used for staleness determination (ms). */\n thresholdMs: number;\n}\n\n// --- Intelligence ---\n\n/** Severity classification for blast radius. */\nexport type BlastRadiusSeverity = 'isolated' | 'moderate' | 'widespread' | 'critical';\n\n/** A single task predicted to be affected by a change. */\nexport interface ImpactedTask {\n /** Task ID. */\n id: string;\n /** Task title. */\n title: string;\n /** Current task status. */\n status: string;\n /** Current task priority. */\n priority: string;\n /** Severity of exposure to the change. */\n exposure: 'direct' | 'dependent' | 'transitive';\n /** Number of downstream tasks that depend on this task. */\n downstreamCount: number;\n /** Why this task is predicted to be affected. */\n reason: string;\n}\n\n/** Full impact prediction report for a free-text change description. */\nexport interface ImpactReport {\n /** The original free-text change description. */\n change: string;\n /** Tasks directly matched by the change description (fuzzy search). */\n matchedTasks: ImpactedTask[];\n /** All tasks predicted to be affected, ordered by exposure severity. */\n affectedTasks: ImpactedTask[];\n /** Total count of distinct affected tasks (including direct matches). */\n totalAffected: number;\n /** Human-readable summary of predicted impact scope. */\n summary: string;\n}\n\n/** Quantified scope of a task's impact across the project. */\nexport interface BlastRadius {\n /** Number of direct dependents. */\n directCount: number;\n /** Number of transitive dependents (full downstream tree). */\n transitiveCount: number;\n /** Number of distinct epics affected. */\n epicCount: number;\n /** Percentage of the total project impacted (0-100). */\n projectPercentage: number;\n /** Classification of impact severity. */\n severity: BlastRadiusSeverity;\n}\n\n// ============================================================================\n// Task work types\n// ============================================================================\n\n/** Result of starting work on a task. */\nexport interface TaskStartResult {\n /** The task ID that was started. */\n taskId: string;\n /** The task title. */\n title: string;\n /** Previous task ID if one was active (auto-stopped). */\n previousTask?: string | null;\n}\n\n// ============================================================================\n// Facade API interfaces\n// ============================================================================\n\n/** Tasks domain API. */\nexport interface TasksAPI {\n /** Add a new task. */\n add(params: {\n title: string;\n description: string;\n parent?: string;\n priority?: TaskPriority;\n type?: TaskType;\n size?: TaskSize;\n phase?: string;\n labels?: string[];\n depends?: string[];\n notes?: string;\n }): Promise<unknown>;\n /** Find tasks by query, ID, status, or limit. */\n find(params: {\n query?: string;\n id?: string;\n status?: TaskStatus;\n limit?: number;\n }): Promise<unknown>;\n /** Show full details of a task. */\n show(taskId: string): Promise<unknown>;\n /**\n * List tasks with optional filters.\n *\n * @remarks\n * - `type` narrows by {@link TaskType} (`epic` | `task` | `subtask`).\n * - `excludeArchived` is a convenience flag that translates to\n * `excludeStatus: ['archived']` in the underlying query. Default `false`\n * for backward compatibility; pass `true` from surfaces (e.g. Studio\n * kanban) that must hide archived rows.\n * - `sortByPriority` opts into `ORDER BY priority` (critical \u2192 low) instead\n * of the default position-based ordering. Used by Studio's /tasks and\n * /tasks/pipeline views to preserve the historic priority-first sort.\n */\n list(params?: {\n status?: TaskStatus;\n priority?: TaskPriority;\n type?: TaskType;\n parentId?: string;\n phase?: string;\n limit?: number;\n excludeArchived?: boolean;\n sortByPriority?: boolean;\n }): Promise<unknown>;\n /** Update task fields. */\n update(params: {\n taskId: string;\n title?: string;\n status?: TaskStatus;\n priority?: TaskPriority;\n description?: string;\n notes?: string;\n }): Promise<unknown>;\n /** Complete a task with optional notes. */\n complete(params: { taskId: string; notes?: string }): Promise<unknown>;\n /** Delete a task. */\n delete(params: { taskId: string; force?: boolean }): Promise<unknown>;\n /** Archive tasks by date or IDs. */\n archive(params?: { before?: string; taskIds?: string[]; dryRun?: boolean }): Promise<unknown>;\n /** Start working on a specific task (sets focus). */\n start(taskId: string): Promise<unknown>;\n /** Stop working on the current task (clears focus). */\n stop(): Promise<{ previousTask: string | null }>;\n /** Get the current task work state. */\n current(): Promise<unknown>;\n}\n\n/** Sessions domain API. */\nexport interface SessionsAPI {\n /** Start a new session. */\n start(params: {\n name: string;\n scope: string;\n agent?: string;\n startTask?: string;\n }): Promise<unknown>;\n /** End the current session. */\n end(params?: { note?: string }): Promise<unknown>;\n /** Get current session status. */\n status(): Promise<unknown>;\n /** Resume an existing session. */\n resume(sessionId: string): Promise<unknown>;\n /** List sessions with optional filters. */\n list(params?: { status?: string; limit?: number }): Promise<unknown>;\n /** Find sessions by criteria. */\n find(params?: {\n status?: string;\n scope?: string;\n query?: string;\n limit?: number;\n }): Promise<unknown>;\n /** Show full details of a session. */\n show(sessionId: string): Promise<unknown>;\n /** Suspend a session. */\n suspend(sessionId: string, reason?: string): Promise<unknown>;\n /** Compute session briefing. */\n briefing(params?: { maxNextTasks?: number; scope?: string }): Promise<unknown>;\n /** Compute session handoff. */\n handoff(sessionId: string, options?: { note?: string; nextAction?: string }): Promise<unknown>;\n /** Garbage-collect stale sessions. */\n gc(maxAgeHours?: number): Promise<unknown>;\n /** Record a decision in a session. */\n recordDecision(params: {\n sessionId: string;\n taskId: string;\n decision: string;\n rationale: string;\n alternatives?: string[];\n }): Promise<unknown>;\n /** Record an assumption. */\n recordAssumption(params: {\n assumption: string;\n confidence: 'high' | 'medium' | 'low';\n sessionId?: string;\n taskId?: string;\n }): Promise<unknown>;\n /** Get context drift metrics. */\n contextDrift(params?: { sessionId?: string }): Promise<unknown>;\n /** Get decision log. */\n decisionLog(params?: { sessionId?: string; taskId?: string }): Promise<unknown>;\n /** Get last handoff for a scope. */\n lastHandoff(scope?: { type: string; epicId?: string }): Promise<unknown>;\n /** Serialize a session into a complete snapshot for persistence. */\n serialize(params?: { sessionId?: string; maxObservations?: number }): Promise<unknown>;\n /** Restore a session from a previously serialized snapshot. */\n restore(snapshot: unknown, params?: { agent?: string; activate?: boolean }): Promise<unknown>;\n}\n\n/** Memory/Brain domain API. */\nexport interface MemoryAPI {\n /** Record a brain observation. */\n observe(params: { text: string; title?: string; type?: BrainObservationType }): Promise<unknown>;\n /** Find brain entries by query. */\n find(params: {\n query: string;\n limit?: number;\n tables?: Array<'decisions' | 'patterns' | 'learnings' | 'observations'>;\n }): Promise<unknown>;\n /** Fetch brain entries by IDs. */\n fetch(params: { ids: string[] }): Promise<unknown>;\n /** Get temporal context around an anchor entry. */\n timeline(params: { anchor: string; depthBefore?: number; depthAfter?: number }): Promise<unknown>;\n /** Search brain entries. */\n search(query: string, options?: { limit?: number }): Promise<unknown>;\n /** Hybrid search combining FTS, vector, and graph. */\n hybridSearch(query: string, options?: HybridSearchOptions): Promise<unknown>;\n}\n\n/** Orchestration domain API. */\nexport interface OrchestrationAPI {\n /** Start orchestration for an epic. */\n start(epicId: string): Promise<unknown>;\n /** Analyze an epic's structure and dependencies. */\n analyze(epicId: string): Promise<unknown>;\n /** Get tasks ready to execute in an epic. */\n readyTasks(epicId: string): Promise<unknown>;\n /** Get the next recommended task in an epic. */\n nextTask(epicId: string): Promise<unknown>;\n /** Get orchestrator context for an epic. */\n context(epicId: string): Promise<unknown>;\n /** Build a dependency graph from tasks. */\n dependencyGraph(tasks: Task[]): unknown;\n /** Compute epic status summary. */\n epicStatus(epicId: string, title: string, children: Task[]): unknown;\n /** Compute progress metrics for tasks. */\n progress(tasks: Task[]): unknown;\n}\n\n/** Lifecycle pipeline domain API. */\nexport interface LifecycleAPI {\n /** Get lifecycle status for an epic. */\n status(epicId: string): Promise<unknown>;\n /** Start a pipeline stage. */\n startStage(epicId: string, stage: string): Promise<unknown>;\n /** Complete a pipeline stage. */\n completeStage(epicId: string, stage: string, artifacts?: string[]): Promise<unknown>;\n /** Skip a pipeline stage. */\n skipStage(epicId: string, stage: string, reason: string): Promise<unknown>;\n /** Check gate requirements for a stage. */\n checkGate(epicId: string, targetStage: string): Promise<unknown>;\n /** Get lifecycle history for an epic. */\n history(epicId: string): Promise<unknown>;\n /** Reset a pipeline stage. */\n resetStage(epicId: string, stage: string, reason: string): Promise<unknown>;\n /** Pass a gate check. */\n passGate(epicId: string, gateName: string, agent?: string): Promise<unknown>;\n /** Fail a gate check. */\n failGate(epicId: string, gateName: string, reason?: string): Promise<unknown>;\n /** Available pipeline stages. */\n stages: readonly string[];\n /**\n * Compute the canonical {@link TaskRollupPayload} for a single task.\n *\n * @remarks\n * T948: exposes `computeTaskRollup` (core) through the facade so Studio\n * and other consumers see the same projection the CLI sees. Returns\n * `null` when the task does not exist.\n */\n computeRollup(taskId: string): Promise<TaskRollupPayload | null>;\n /**\n * Compute rollups for many tasks in a single batch.\n *\n * @remarks\n * Order preserved; missing ids omitted. See `computeTaskRollups` for\n * the underlying batched implementation.\n */\n computeRollupsBatch(taskIds: string[]): Promise<TaskRollupPayload[]>;\n}\n\n/**\n * Public rollup payload shape re-exposed on the facade.\n *\n * Mirrors `TaskRollup` from `@cleocode/core/lifecycle/rollup`. Declared in\n * contracts so downstream consumers (Studio, CleoOS) type their view layer\n * without importing core.\n *\n * @task T948\n */\nexport interface TaskRollupPayload {\n /** Task identifier. */\n id: string;\n /**\n * Canonical execution status \u2014 mirrors `TaskStatus` plus the forward-looking\n * `'proposed'` intake value from T947+.\n */\n execStatus: 'pending' | 'active' | 'blocked' | 'done' | 'cancelled' | 'archived' | 'proposed';\n /** Pipeline stage the task is parked on, or null. */\n pipelineStage: string | null;\n /** Names of gates with at least one `pass` result. */\n gatesVerified: string[];\n /** Count of non-archived direct children whose status is `done`. */\n childrenDone: number;\n /** Count of non-archived direct children. */\n childrenTotal: number;\n /** Tokens parsed from `tasks.blocked_by`. */\n blockedBy: string[];\n /** ISO timestamp of the most recent activity, or null. */\n lastActivityAt: string | null;\n}\n\n/** Release management domain API. */\nexport interface ReleaseAPI {\n /** Prepare a release. */\n prepare(params: { version: string; tasks?: string[]; notes?: string }): Promise<unknown>;\n /** Commit a release. */\n commit(params: { version: string }): Promise<unknown>;\n /** Tag a release. */\n tag(params: { version: string }): Promise<unknown>;\n /** Push a release. */\n push(params: { version: string; remote?: string; explicitPush?: boolean }): Promise<unknown>;\n /** Rollback a release. */\n rollback(params: { version: string; reason?: string }): Promise<unknown>;\n /** Calculate new version from bump type. */\n calculateVersion(current: string, bumpType: string): string;\n /** Bump version from config. */\n bumpVersion(): Promise<unknown>;\n}\n\n/** Admin domain API. */\nexport interface AdminAPI {\n /** Export tasks. */\n export(params?: Record<string, unknown>): Promise<unknown>;\n /** Import tasks from file. */\n import(params: Omit<ImportParams, 'cwd'>): Promise<unknown>;\n}\n\n/** Sticky notes domain API. */\nexport interface StickyAPI {\n /** Add a sticky note. */\n add(params: {\n content: string;\n tags?: string[];\n priority?: string;\n color?: string;\n }): Promise<unknown>;\n /** Show a sticky note. */\n show(stickyId: string): Promise<unknown>;\n /** List sticky notes with optional filters. */\n list(params?: {\n status?: string;\n color?: string;\n priority?: string;\n limit?: number;\n }): Promise<unknown>;\n /** Archive a sticky note. */\n archive(stickyId: string): Promise<unknown>;\n /** Purge a sticky note. */\n purge(stickyId: string): Promise<unknown>;\n /** Convert a sticky note to task or memory. */\n convert(params: {\n stickyId: string;\n targetType: 'task' | 'memory' | 'task_note' | 'session_note';\n title?: string;\n memoryType?: string;\n taskId?: string;\n }): Promise<unknown>;\n}\n\n/** Cross-project Nexus domain API. */\nexport interface NexusAPI {\n /** Initialize nexus for the current project. */\n init(): Promise<unknown>;\n /** Register a project in the nexus. */\n register(params: { path: string; name?: string; permissions?: string }): Promise<unknown>;\n /** Unregister a project from the nexus. */\n unregister(params: { name: string }): Promise<unknown>;\n /** List registered projects. */\n list(): Promise<unknown>;\n /** Show details of a registered project. */\n show(params: { name: string }): Promise<unknown>;\n /** Sync a project or all projects. */\n sync(params?: { name?: string }): Promise<unknown>;\n /** Discover related content across projects. */\n discover(params: { query: string; method?: string; limit?: number }): Promise<unknown>;\n /** Search across registered projects. */\n search(params: { pattern: string; project?: string; limit?: number }): Promise<unknown>;\n /** Set permission level for a project. */\n setPermission(params: { name: string; level: 'read' | 'write' | 'execute' }): Promise<unknown>;\n /** Get sharing status. */\n sharingStatus(): Promise<unknown>;\n /** Route a Conduit directive message to the correct project (ORCH-PLAN B.2). */\n route(message: ConduitMessage): Promise<unknown>;\n /** Get aggregated task status across all registered projects (ORCH-PLAN B.3). */\n workspaceStatus(): Promise<unknown>;\n /** Get all agents registered across all projects (ORCH-PLAN B.4). */\n workspaceAgents(): Promise<unknown>;\n}\n\n/** Task reconciliation / sync domain API. */\nexport interface SyncAPI {\n /** Reconcile external tasks with CLEO as SSoT. */\n reconcile(params: {\n externalTasks: ExternalTask[];\n providerId: string;\n dryRun?: boolean;\n conflictPolicy?: ReconcileOptions['conflictPolicy'];\n defaultPhase?: string;\n defaultLabels?: string[];\n }): Promise<ReconcileResult>;\n /** Get all external task links for a provider. */\n getLinks(providerId: string): Promise<ExternalTaskLink[]>;\n /** Get all external task links for a CLEO task. */\n getTaskLinks(taskId: string): Promise<ExternalTaskLink[]>;\n /** Remove all external task links for a provider. */\n removeProviderLinks(providerId: string): Promise<number>;\n}\n\n/** Agent registry domain API. */\nexport interface AgentsAPI {\n /** Register a new agent instance. */\n register(options: RegisterAgentOptions): Promise<AgentInstanceRow>;\n /** Deregister an agent instance. */\n deregister(agentId: string): Promise<AgentInstanceRow | null>;\n /** Get health status for a specific agent. */\n health(agentId: string): Promise<AgentHealthStatus | null>;\n /** Detect agents that have crashed (missed heartbeats). */\n detectCrashed(thresholdMs?: number): Promise<AgentInstanceRow[]>;\n /** Record a heartbeat for an agent. */\n recordHeartbeat(agentId: string): Promise<unknown>;\n /** Get capacity info for an agent. */\n capacity(agentId: string): Promise<AgentCapacity | null>;\n /** Check if system is overloaded (available capacity below threshold). */\n isOverloaded(threshold?: number): Promise<boolean>;\n /** List all agent instances with optional filters. */\n list(params?: { status?: string; agentType?: string }): Promise<AgentInstanceRow[]>;\n}\n\n/** Intelligence / impact analysis domain API. */\nexport interface IntelligenceAPI {\n /** Predict impact of a change description on related tasks. */\n predictImpact(change: string): Promise<ImpactReport>;\n /** Calculate blast radius for a task change. */\n blastRadius(taskId: string): Promise<BlastRadius>;\n}\n\n/** Options for initializing the Cleo facade. */\nexport interface CleoInitOptions {\n /** Custom data accessor (store backend). */\n store?: DataAccessor;\n /** Enable CAAMP injection. */\n caamp?: boolean;\n}\n", "/**\n * LAFS (LLM-Agent-First Schema) unified envelope types.\n *\n * Defines canonical LAFS types inline (contracts has ZERO external dependencies).\n * In the main CLEO codebase these are re-exported from @cleocode/lafs;\n * here they are defined as plain interfaces for maximum portability.\n *\n * @epic T4654\n * @task T4655\n */\n\n// ---------------------------------------------------------------------------\n// Canonical LAFS types (inlined from @cleocode/lafs)\n// ---------------------------------------------------------------------------\n\n/** LAFS error category. */\nexport type LAFSErrorCategory =\n | 'validation'\n | 'not_found'\n | 'conflict'\n | 'authorization'\n | 'internal'\n | 'rate_limit'\n | 'timeout'\n | 'dependency';\n\n/** LAFS error object. */\nexport interface LAFSError {\n /** Stable error code (numeric HTTP status or string identifier). */\n code: number | string;\n /** High-level error classification category. */\n category: LAFSErrorCategory;\n /** Human-readable error description. */\n message: string;\n /**\n * Suggested fix or recovery action for the caller.\n *\n * @defaultValue undefined\n */\n fix?: string;\n /**\n * Arbitrary key-value pairs with additional error context.\n *\n * @defaultValue undefined\n */\n details?: Record<string, unknown>;\n}\n\n/** LAFS warning. */\nexport interface Warning {\n /** Machine-readable warning code. */\n code: string;\n /** Human-readable warning description. */\n message: string;\n}\n\n/** LAFS transport metadata. */\nexport type LAFSTransport = 'cli' | 'http' | 'sdk';\n\n/** MVI (Minimal Viable Information) level. */\nexport type MVILevel = 'minimal' | 'standard' | 'full';\n\n/** LAFS page \u2014 no pagination. */\nexport interface LAFSPageNone {\n /** Discriminant indicating no pagination is applied. */\n strategy: 'none';\n}\n\n/** LAFS page \u2014 offset-based pagination. */\nexport interface LAFSPageOffset {\n /** Discriminant identifying offset-based pagination. */\n strategy: 'offset';\n /** Zero-based index of the first item in this page. */\n offset: number;\n /** Maximum number of items per page. */\n limit: number;\n /** Total number of items across all pages. */\n total: number;\n /** Whether additional pages exist beyond the current one. */\n hasMore: boolean;\n}\n\n/** LAFS page union. */\nexport type LAFSPage = LAFSPageNone | LAFSPageOffset;\n\n/** LAFS metadata block. */\nexport interface LAFSMeta {\n /** Transport protocol used for this envelope. */\n transport: LAFSTransport;\n /** Minimum Viable Information level controlling verbosity. */\n mvi: MVILevel;\n /**\n * Pagination metadata when the result is a paginated collection.\n *\n * @defaultValue undefined\n */\n page?: LAFSPage;\n /**\n * Non-fatal warnings to surface to the consuming agent.\n *\n * @defaultValue undefined\n */\n warnings?: Warning[];\n /**\n * Operation duration in milliseconds.\n *\n * @defaultValue undefined\n */\n durationMs?: number;\n}\n\n/** LAFS envelope (canonical protocol type). */\nexport interface LAFSEnvelope<T = unknown> {\n /** Whether the operation completed successfully. */\n success: boolean;\n /**\n * Operation result payload on success.\n *\n * @defaultValue undefined\n */\n data?: T;\n /**\n * Structured error payload on failure.\n *\n * @defaultValue undefined\n */\n error?: LAFSError;\n /**\n * Protocol and transport metadata.\n *\n * @defaultValue undefined\n */\n _meta?: LAFSMeta;\n}\n\n/** Flag input for conformance checks. */\nexport interface FlagInput {\n /** Name of the flag being checked. */\n flag: string;\n /** Value of the flag to validate. */\n value: unknown;\n}\n\n/** Conformance report. */\nexport interface ConformanceReport {\n /** Whether all conformance checks passed. */\n valid: boolean;\n /** List of conformance violation descriptions. */\n violations: string[];\n /** List of non-fatal warning descriptions. */\n warnings: string[];\n}\n\n// ---------------------------------------------------------------------------\n// CLEO-specific error detail (backward compatible)\n// ---------------------------------------------------------------------------\n\n/** Actionable alternative the caller can try. */\nexport interface LafsAlternative {\n /** Description of the alternative action. */\n action: string;\n /** CLI command the caller can run instead. */\n command: string;\n}\n\n/** LAFS error detail shared between CLI and gateway. */\nexport interface LafsErrorDetail {\n /** Stable error code (numeric HTTP status or string identifier). */\n code: number | string;\n /**\n * Optional human-readable error name (e.g. `\"NOT_FOUND\"`).\n *\n * @defaultValue undefined\n */\n name?: string;\n /** Human-readable error description. */\n message: string;\n /**\n * Suggested fix or recovery action for the caller.\n *\n * @defaultValue undefined\n */\n fix?: string;\n /**\n * Alternative commands the caller can try.\n *\n * @defaultValue undefined\n */\n alternatives?: LafsAlternative[];\n /**\n * Arbitrary key-value pairs with additional error context.\n *\n * @defaultValue undefined\n */\n details?: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// CLI envelope (base) - backward compatible\n// ---------------------------------------------------------------------------\n\n/** LAFS success envelope (CLI). */\nexport interface LafsSuccess<T = unknown> {\n /** Discriminant: always `true` for success envelopes. */\n success: true;\n /** Operation result payload. */\n data: T;\n /**\n * Optional human-readable summary of the operation outcome.\n *\n * @defaultValue undefined\n */\n message?: string;\n /**\n * When `true`, the operation was a no-op (data is unchanged).\n *\n * @defaultValue undefined\n */\n noChange?: boolean;\n}\n\n/** LAFS error envelope (CLI). */\nexport interface LafsError {\n /** Discriminant: always `false` for error envelopes. */\n success: false;\n /** Structured error detail with code, message, and fix guidance. */\n error: LafsErrorDetail;\n}\n\n/** CLI envelope union type. */\nexport type LafsEnvelope<T = unknown> = LafsSuccess<T> | LafsError;\n\n// ---------------------------------------------------------------------------\n// Gateway envelope extension (extends LAFSMeta)\n// ---------------------------------------------------------------------------\n\n/**\n * Metadata attached to every gateway response.\n * Extends the canonical LAFSMeta with CLEO gateway-specific fields.\n *\n * @task T4655\n */\nexport interface GatewayMeta extends LAFSMeta {\n /** Gateway identifier that processed this request. */\n gateway: string;\n /** CLEO domain that handled the operation (e.g. `\"tasks\"`, `\"session\"`). */\n domain: string;\n /** Operation duration in milliseconds. */\n duration_ms: number;\n}\n\n/** Gateway success envelope (extends CLI base with _meta). */\nexport interface GatewaySuccess<T = unknown> extends LafsSuccess<T> {\n /** Gateway-specific metadata including domain and timing. */\n _meta: GatewayMeta;\n}\n\n/** Gateway error envelope (extends CLI base with _meta). */\nexport interface GatewayError extends LafsError {\n /** Gateway-specific metadata including domain and timing. */\n _meta: GatewayMeta;\n}\n\n/** Gateway envelope union type. */\nexport type GatewayEnvelope<T = unknown> = GatewaySuccess<T> | GatewayError;\n\n// ---------------------------------------------------------------------------\n// Unified envelope (covers both CLI and Gateway)\n// ---------------------------------------------------------------------------\n\n/**\n * Unified CLEO response envelope.\n *\n * Every CLEO response (CLI or Gateway) is a CleoResponse. Gateway responses\n * include the _meta field; CLI responses do not.\n */\nexport type CleoResponse<T = unknown> = LafsEnvelope<T> | GatewayEnvelope<T>;\n\n// ---------------------------------------------------------------------------\n// Type guards\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for success responses.\n *\n * @typeParam T - The data payload type of the envelope.\n * @param envelope - The envelope to check.\n * @returns `true` if the envelope represents a successful operation.\n *\n * @remarks\n * Narrows a {@link LafsEnvelope} to {@link LafsSuccess} so that `envelope.data`\n * is accessible without additional type assertions.\n *\n * @example\n * ```ts\n * const result: LafsEnvelope<Task[]> = await fetchTasks();\n * if (isLafsSuccess(result)) {\n * console.log(result.data); // Task[]\n * }\n * ```\n */\nexport function isLafsSuccess<T>(envelope: LafsEnvelope<T>): envelope is LafsSuccess<T> {\n return envelope.success === true;\n}\n\n/**\n * Type guard for error responses.\n *\n * @typeParam T - The data payload type of the envelope.\n * @param envelope - The envelope to check.\n * @returns `true` if the envelope represents a failed operation.\n *\n * @remarks\n * Narrows a {@link LafsEnvelope} to {@link LafsError} so that `envelope.error`\n * is accessible without additional type assertions.\n *\n * @example\n * ```ts\n * const result: LafsEnvelope<Task[]> = await fetchTasks();\n * if (isLafsError(result)) {\n * console.error(result.error.message);\n * }\n * ```\n */\nexport function isLafsError<T>(envelope: LafsEnvelope<T>): envelope is LafsError {\n return envelope.success === false;\n}\n\n/**\n * Type guard for gateway responses (has _meta).\n *\n * @typeParam T - The data payload type of the envelope.\n * @param envelope - The response to check.\n * @returns `true` if the response includes gateway metadata.\n *\n * @remarks\n * Distinguishes gateway responses from plain CLI responses by checking for the\n * presence of the `_meta` field, which carries gateway-specific routing and timing data.\n *\n * @example\n * ```ts\n * const response: CleoResponse<Task> = await handleRequest();\n * if (isGatewayEnvelope(response)) {\n * console.log(response._meta.gateway);\n * }\n * ```\n */\nexport function isGatewayEnvelope<T>(envelope: CleoResponse<T>): envelope is GatewayEnvelope<T> {\n return '_meta' in envelope && envelope._meta !== undefined;\n}\n", "/**\n * BRAIN Super-Domain Operations (8 operations)\n *\n * BRAIN is the **unified cross-substrate graph** wrapping\n * `memory + nexus + tasks + conduit + signaldock` into a single\n * super-graph substrate. It is distinct from (and layered above) the\n * memory-only operations in `./memory.ts` which own observations,\n * patterns, decisions, learnings, tiers, and the PageIndex graph\n * scoped to `brain.db`.\n *\n * These wire-format contracts are the API surface consumed by:\n * - `@cleocode/brain` (T969 \u2014 living-brain package extraction)\n * - `packages/studio/src/routes/api/brain/*` HTTP routes (T970 \u2014 renamed\n * from `/api/living-brain` as the canonical unified super-graph surface)\n * - CLI / SDK clients performing cross-substrate graph queries\n *\n * Node IDs are **substrate-prefixed** (`\"task:T949\"`, `\"memory:O-abc\"`,\n * `\"code:symbol:foo\"`) so cross-substrate edges are unambiguous and\n * deduplication is safe by ID equality alone. The substrate-specific\n * payload on `BrainNode.data` / `BrainEdge.data` is the ONE place where\n * `Record<string, unknown>` is legitimate \u2014 super-graph callers treat\n * it opaquely; individual substrate adapters own the concrete shape.\n *\n * SYNC: Canonical runtime implementation now lives at\n * `@cleocode/brain` (BrainNode, BrainEdge, BrainGraph, adapters, SSE\n * stream). The runtime shapes there are intentionally structurally\n * distinct from these wire-format contracts \u2014 runtime `BrainNode` uses\n * `kind: BrainNodeKind` + `meta` + optional adapter-produced `weight`,\n * whereas contract `BrainNode` below uses `type: string` + `data`.\n *\n * @task T962 \u2014 Orchestration Coherence v4 (BRAIN super-domain)\n * @task T968 \u2014 operations/brain.ts contract authoring (Wave B)\n * @task T969 \u2014 `@cleocode/brain` package extraction\n * @task T973 \u2014 runtime LB* \u2192 Brain* rename\n * @see packages/brain/src/types.ts (runtime shapes)\n * @see packages/contracts/src/operations/memory.ts (distinct domain)\n */\n\n// ============================================================================\n// Shared BRAIN types (super-graph wire format)\n// ============================================================================\n\n/**\n * Substrate name enum \u2014 which underlying database a node/edge came from.\n *\n * @remarks\n * Intentionally distinct from the runtime\n * `@cleocode/brain :: BrainSubstrate` type \u2014 the contracts layer uses\n * `memory` (aligning with the cognitive-memory domain rename produced by\n * `./memory.ts` in T965), while the runtime layer uses the legacy\n * `brain` literal to match the on-disk `brain.db` file name. Callers\n * translate between the two naming planes when bridging API wire format\n * to live adapter output.\n *\n * @task T962 / T968\n */\nexport type BrainSubstrateName = 'memory' | 'nexus' | 'tasks' | 'conduit' | 'signaldock';\n\n/**\n * Concrete node type within a substrate (e.g. `observation`, `symbol`,\n * `task`, `session`, `agent`, `message`). Not constrained here because the\n * set is substrate-owned and open-ended; each substrate adapter documents\n * its own vocabulary.\n *\n * @task T962 / T968\n */\nexport type BrainNodeType = string;\n\n/**\n * Substrate-prefixed node identifier.\n *\n * @example\n * \"task:T949\"\n * \"memory:O-mo4abc123\"\n * \"nexus:packages/core/src/store/sqlite-data-accessor.ts::createSqliteDataAccessor\"\n * \"conduit:msg-7f3a2b1c\"\n * \"signaldock:agent-cleo-prime\"\n *\n * @remarks\n * The substrate prefix (before the first `:`) MUST match one of\n * `BrainSubstrateName`. The remainder is substrate-specific and opaque\n * to super-graph callers.\n *\n * @task T962 / T968\n */\nexport type BrainNodeId = string;\n\n/**\n * Edge kind taxonomy used across the super-graph.\n *\n * @remarks\n * Concrete built-ins are enumerated for tooling autocompletion; the\n * `string` fallback keeps the type open-ended because substrate\n * adapters may introduce new kinds (e.g. `touches_code`, `authored_by`,\n * `supersedes`, `derived_from`) without a schema migration at this\n * layer.\n *\n * @task T962 / T968\n */\nexport type BrainEdgeKind =\n | 'parent'\n | 'depends'\n | 'blocks'\n | 'references'\n | 'discusses'\n | 'cites'\n | 'embeds'\n | 'touches_code'\n | 'messages'\n | string;\n\n/**\n * A single node in the BRAIN super-graph.\n *\n * @remarks\n * The `data` field carries substrate-specific metadata (memory-tier info,\n * task status, nexus symbol kind, conduit message preview, etc.). This\n * is the ONE place `Record<string, unknown>` is justified: the\n * super-graph is polymorphic across substrates by definition, and the\n * statically-typed payload belongs inside each substrate adapter.\n *\n * @task T962 / T968\n */\nexport interface BrainNode {\n /** Substrate-prefixed identifier (see {@link BrainNodeId}). */\n id: BrainNodeId;\n /** Source substrate. */\n substrate: BrainSubstrateName;\n /** Concrete node type within the substrate (e.g. `observation`, `symbol`). */\n type: BrainNodeType;\n /** Human-readable display label. */\n label: string;\n /**\n * Substrate-specific payload. Shape is owned by the substrate adapter;\n * super-graph callers treat it opaquely.\n */\n data: Record<string, unknown>;\n /** ISO 8601 creation timestamp, when exposed by the substrate. */\n createdAt?: string;\n /** ISO 8601 last-update timestamp, when exposed by the substrate. */\n updatedAt?: string;\n}\n\n/**\n * A directed edge between two super-graph nodes.\n *\n * @remarks\n * Both endpoints reference {@link BrainNodeId} values. Edges may be\n * in-substrate (both endpoints share the same prefix) or cross-substrate\n * (bridges between e.g. `memory:\u2026` and `nexus:\u2026`).\n *\n * @task T962 / T968\n */\nexport interface BrainEdge {\n /** Source node id. */\n from: BrainNodeId;\n /** Target node id. */\n to: BrainNodeId;\n /** Semantic edge kind (see {@link BrainEdgeKind}). */\n kind: BrainEdgeKind;\n /**\n * Normalised weight in `[0, 1]`. Higher = stronger/more confident.\n * Produced by Hebbian/STDP training on memory edges, relation\n * confidence on nexus edges, and substrate-specific heuristics\n * elsewhere.\n */\n weight?: number;\n /** Substrate-specific payload (opaque at super-graph level). */\n data?: Record<string, unknown>;\n}\n\n/**\n * Per-substrate node and edge counters returned inside query results.\n *\n * @task T962 / T968\n */\nexport interface BrainSubstrateStats {\n /** Number of nodes contributed by the substrate. */\n nodes: number;\n /** Number of edges contributed by the substrate. */\n edges: number;\n}\n\n/**\n * Predicate bag applied per-substrate when filtering graph queries.\n *\n * @remarks\n * Each field is optional; adapters apply them in-substrate and ignore\n * any dimension they don't support. When multiple fields are set the\n * filter is an AND (e.g. `nodeType` \u2208 {\u2026} AND `labels` \u2286 node.labels\n * AND `textMatch` matches).\n *\n * @task T962 / T968\n */\nexport interface BrainGraphFilter {\n /** Restrict to these node types (per-substrate vocabulary). */\n nodeType?: string[];\n /** Restrict to nodes carrying all of these labels. */\n labels?: string[];\n /** Free-text filter applied to the node label (substrate-dependent matcher). */\n textMatch?: string;\n}\n\n// ============================================================================\n// 1. brain.query \u2014 fetch unified graph\n// ============================================================================\n\n/**\n * Parameters for `brain.query`.\n *\n * @remarks\n * `limit` is a cross-substrate total cap; adapters share the budget\n * evenly (`limit / substrates.length`). Omitting `substrates`\n * requests all five.\n *\n * @task T962 / T968\n */\nexport interface BrainQueryParams {\n /** Filter by substrate names. Default: all substrates. */\n substrates?: BrainSubstrateName[];\n /**\n * Maximum total nodes to return across all requested substrates.\n * Per-substrate budget is `limit / substrates.length`. Default `500`.\n */\n limit?: number;\n /** Predicate bag applied per-substrate. */\n filter?: BrainGraphFilter;\n}\n\n/**\n * Result of `brain.query`.\n *\n * @task T962 / T968\n */\nexport interface BrainQueryResult {\n /** Merged, deduplicated nodes across substrates. */\n nodes: BrainNode[];\n /** Edges (may reference stub nodes injected for cross-substrate targets). */\n edges: BrainEdge[];\n /** Aggregate and per-substrate counters. */\n stats: {\n /** Per-substrate node/edge contribution. */\n perSubstrate: Record<BrainSubstrateName, BrainSubstrateStats>;\n /** Deduplicated total node count. */\n totalNodes: number;\n /** Edge count (no dedup \u2014 edges are unique by (from,to,kind)). */\n totalEdges: number;\n };\n}\n\n// ============================================================================\n// 2. brain.node \u2014 fetch single node by substrate-prefixed id\n// ============================================================================\n\n/**\n * Parameters for `brain.node`.\n *\n * @task T962 / T968\n */\nexport interface BrainNodeParams {\n /**\n * Substrate-prefixed id to fetch.\n *\n * @example `\"task:T949\"`, `\"memory:O-abc\"`, `\"code:symbol:foo\"`.\n */\n id: BrainNodeId;\n}\n\n/**\n * Result of `brain.node`.\n *\n * @task T962 / T968\n */\nexport interface BrainNodeResult {\n /** The requested node. */\n node: BrainNode;\n /** Neighbour edges partitioned by direction relative to `node.id`. */\n neighbors: {\n /** Edges whose `to` equals the requested node. */\n inbound: BrainEdge[];\n /** Edges whose `from` equals the requested node. */\n outbound: BrainEdge[];\n };\n}\n\n// ============================================================================\n// 3. brain.substrate \u2014 fetch all nodes/edges for one substrate\n// ============================================================================\n\n/**\n * Parameters for `brain.substrate`.\n *\n * @remarks\n * Equivalent to `brain.query` with `substrates: [substrate]`, but\n * provides a cleaner URL binding at the HTTP layer and emits a\n * structured 400 error for unknown substrate names.\n *\n * @task T962 / T968\n */\nexport interface BrainSubstrateParams {\n /** Which substrate to project. */\n substrate: BrainSubstrateName;\n /** Maximum nodes to return. Default `500`. */\n limit?: number;\n /** Predicate bag applied to the substrate. */\n filter?: BrainGraphFilter;\n}\n\n/**\n * Result of `brain.substrate`.\n *\n * @task T962 / T968\n */\nexport interface BrainSubstrateResult {\n /** The substrate that was projected. */\n substrate: BrainSubstrateName;\n /** Nodes contributed by this substrate. */\n nodes: BrainNode[];\n /** Edges contributed by this substrate. */\n edges: BrainEdge[];\n /** True when the result was capped by `limit`. */\n truncated: boolean;\n}\n\n// ============================================================================\n// 4. brain.stream \u2014 SSE stream of graph mutation events\n// ============================================================================\n\n/**\n * Discriminated union of BRAIN super-graph mutation events.\n *\n * @remarks\n * Emitted as Server-Sent Events by the `brain.stream` endpoint. Every\n * variant carries an ISO 8601 `ts` field so clients can sequence events\n * even when they arrive out-of-order.\n *\n * - `hello` \u2014 sent immediately on connect; confirms the stream is live.\n * - `heartbeat` \u2014 sent every 30 s to prevent connection timeout.\n * - `node.create` \u2014 a new node appeared in any substrate.\n * - `node.update` \u2014 an existing node's metadata changed.\n * - `edge.strengthen` \u2014 an edge weight was updated (Hebbian/STDP or relation).\n * - `edge.create` \u2014 a new edge appeared.\n * - `task.status` \u2014 shortcut for tasks-substrate status changes.\n * - `message.send` \u2014 shortcut for conduit-substrate message inserts.\n *\n * Mirrors `@cleocode/brain :: BrainStreamEvent` with super-graph-aligned\n * identifiers (ids are substrate-prefixed).\n *\n * @task T962 / T968\n */\nexport type BrainStreamEvent =\n | { type: 'hello'; ts: string }\n | { type: 'heartbeat'; ts: string }\n | { type: 'node.create'; node: BrainNode; ts: string }\n | { type: 'node.update'; node: BrainNode; ts: string }\n | {\n type: 'edge.strengthen';\n from: BrainNodeId;\n to: BrainNodeId;\n kind: BrainEdgeKind;\n weight: number;\n ts: string;\n }\n | {\n type: 'edge.create';\n from: BrainNodeId;\n to: BrainNodeId;\n kind: BrainEdgeKind;\n weight?: number;\n ts: string;\n }\n | { type: 'task.status'; taskId: string; status: string; ts: string }\n | {\n type: 'message.send';\n messageId: string;\n fromAgentId: string;\n toAgentId: string;\n preview: string;\n ts: string;\n };\n\n/**\n * Parameters for `brain.stream`.\n *\n * @remarks\n * Clients may filter by substrate (only emit events from those DBs) and\n * by event kind (only emit e.g. `node.create`). Both default to \"all\".\n * `sinceTs` resumes from a prior ISO 8601 cursor when reconnecting.\n *\n * @task T962 / T968\n */\nexport interface BrainStreamParams {\n /** Restrict events to these substrates. Default: all. */\n substrates?: BrainSubstrateName[];\n /** Restrict to these event kinds (e.g. `['node.create', 'edge.strengthen']`). */\n kinds?: Array<BrainStreamEvent['type']>;\n /**\n * ISO 8601 resume cursor. When set, the server replays events emitted\n * at or after `sinceTs` before tailing the live stream.\n */\n sinceTs?: string;\n}\n\n/**\n * Result of `brain.stream`.\n *\n * @remarks\n * The stream is transport-flexible (HTTP SSE in the reference adapter,\n * WebSocket or long-poll in alternates). The `Result` shape describes\n * the **per-frame** payload clients receive; transport framing is an\n * adapter concern.\n *\n * @task T962 / T968\n */\nexport interface BrainStreamResult {\n /** One decoded SSE frame. */\n event: BrainStreamEvent;\n}\n\n// ============================================================================\n// 5. brain.bridges \u2014 list cross-substrate edges\n// ============================================================================\n\n/**\n * Parameters for `brain.bridges`.\n *\n * @remarks\n * Returns edges whose endpoints are in **different** substrates \u2014 e.g.\n * `memory:O-abc \u2192 nexus:symbol:foo` (cognitive memory citing code) or\n * `task:T949 \u2192 memory:D-decision-123` (task grounded in a decision).\n * These are the substrate bridges that let the super-graph behave as a\n * single knowledge surface rather than five isolated databases.\n *\n * @task T962 / T968\n */\nexport interface BrainBridgesParams {\n /**\n * Restrict to bridges whose endpoints lie in this substrate set.\n * When set, only bridges where **both** endpoints fall inside\n * `substrates` are returned. Default: all substrates.\n */\n substrates?: BrainSubstrateName[];\n /** Restrict to these edge kinds. Default: all kinds. */\n kinds?: BrainEdgeKind[];\n /** Minimum edge weight to include. Default `0`. */\n minWeight?: number;\n /** Max edges to return. Default `500`. */\n limit?: number;\n}\n\n/**\n * Result of `brain.bridges`.\n *\n * @task T962 / T968\n */\nexport interface BrainBridgesResult {\n /** Cross-substrate edges matching the query. */\n bridges: BrainEdge[];\n /** Per-pair counts keyed by `\"${fromSubstrate}->${toSubstrate}\"`. */\n pairCounts: Record<string, number>;\n /** Total bridges returned. */\n total: number;\n}\n\n// ============================================================================\n// 6. brain.neighborhood \u2014 BFS expand from a seed node, N hops\n// ============================================================================\n\n/**\n * Parameters for `brain.neighborhood`.\n *\n * @remarks\n * Breadth-first expansion from `seed` up to `hops` edges. Callers that\n * need only direct neighbours should use `hops: 1`. Deep traversals\n * should pair `hops` with `maxNodes` to bound fan-out.\n *\n * @task T962 / T968\n */\nexport interface BrainNeighborhoodParams {\n /** Seed node id. */\n seed: BrainNodeId;\n /** Max hops (BFS depth). Default `1`. */\n hops?: number;\n /** Cap on total returned nodes. Default `200`. */\n maxNodes?: number;\n /** Restrict traversal to these edge kinds. Default: all. */\n edgeKinds?: BrainEdgeKind[];\n /** Restrict traversal to these substrates. Default: all. */\n substrates?: BrainSubstrateName[];\n /** Minimum edge weight to traverse. Default `0`. */\n minWeight?: number;\n}\n\n/**\n * A single node visited during neighborhood expansion.\n *\n * @task T962 / T968\n */\nexport interface BrainNeighborhoodNode {\n /** The visited node. */\n node: BrainNode;\n /** BFS distance from the seed (`0` = seed itself). */\n depth: number;\n}\n\n/**\n * Result of `brain.neighborhood`.\n *\n * @task T962 / T968\n */\nexport interface BrainNeighborhoodResult {\n /** Seed node id that was expanded. */\n seed: BrainNodeId;\n /** Nodes visited, annotated with BFS depth. */\n nodes: BrainNeighborhoodNode[];\n /** Edges traversed during expansion. */\n edges: BrainEdge[];\n /** Maximum depth actually reached (\u2264 requested `hops`). */\n reachedDepth: number;\n /** True when the traversal was capped by `maxNodes`. */\n truncated: boolean;\n}\n\n// ============================================================================\n// 7. brain.search \u2014 text/label search across all substrates\n// ============================================================================\n\n/**\n * Parameters for `brain.search`.\n *\n * @remarks\n * Cross-substrate text search. Each adapter picks the best available\n * matcher (FTS5 for memory.db, identifier-substring for nexus, title\n * match for tasks, etc.) and contributes hits scored on a normalised\n * `[0, 1]` relevance axis. Results are fused by relevance desc.\n *\n * @task T962 / T968\n */\nexport interface BrainSearchParams {\n /** Search query (required, non-empty). */\n query: string;\n /** Restrict to these substrates. Default: all. */\n substrates?: BrainSubstrateName[];\n /** Restrict to these node types. Default: all. */\n nodeTypes?: BrainNodeType[];\n /** Max results. Default `50`. */\n limit?: number;\n}\n\n/**\n * A single fused search hit.\n *\n * @task T962 / T968\n */\nexport interface BrainSearchHit {\n /** The matched node. */\n node: BrainNode;\n /** Normalised relevance in `[0, 1]`. Higher = better. */\n score: number;\n /** Which substrate contributed this hit. */\n substrate: BrainSubstrateName;\n /** Adapter that produced the score (e.g. `fts`, `identifier`, `title`). */\n matcher: string;\n}\n\n/**\n * Result of `brain.search`.\n *\n * @task T962 / T968\n */\nexport interface BrainSearchResult {\n /** Hits ranked by `score` desc. */\n hits: BrainSearchHit[];\n /** Total hit count (may exceed `hits.length` when `limit` applied). */\n total: number;\n /** Estimated token weight of the payload (for JIT retrieval budgeting). */\n tokensEstimated: number;\n}\n\n// ============================================================================\n// 8. brain.stats \u2014 graph statistics per substrate\n// ============================================================================\n\n/**\n * Parameters for `brain.stats`.\n *\n * @remarks\n * Zero required params \u2014 returns the full super-graph telemetry\n * snapshot. `substrates` narrows the report when only part of the\n * graph matters to the caller.\n *\n * @task T962 / T968\n */\nexport interface BrainStatsParams {\n /** Restrict the report to these substrates. Default: all. */\n substrates?: BrainSubstrateName[];\n}\n\n/**\n * Per-substrate statistics returned inside `BrainStatsResult`.\n *\n * @task T962 / T968\n */\nexport interface BrainSubstrateReport {\n /** Substrate name. */\n substrate: BrainSubstrateName;\n /** Node count by {@link BrainNodeType}. */\n nodesByType: Array<{ type: BrainNodeType; count: number }>;\n /** Edge count by {@link BrainEdgeKind}. */\n edgesByKind: Array<{ kind: BrainEdgeKind; count: number }>;\n /** Total nodes for the substrate. */\n totalNodes: number;\n /** Total edges for the substrate. */\n totalEdges: number;\n /** ISO 8601 timestamp of the most recent mutation, when known. */\n lastMutationAt: string | null;\n}\n\n/**\n * Result of `brain.stats`.\n *\n * @task T962 / T968\n */\nexport interface BrainStatsResult {\n /** Per-substrate telemetry. */\n perSubstrate: BrainSubstrateReport[];\n /** Total nodes across all reported substrates. */\n totalNodes: number;\n /** Total edges across all reported substrates. */\n totalEdges: number;\n /** Count of cross-substrate bridges included in `totalEdges`. */\n bridgeCount: number;\n /** ISO 8601 timestamp when the report was computed. */\n generatedAt: string;\n}\n", "/**\n * Conduit Domain Operations (5 operations)\n *\n * Query operations: 2\n * Mutate operations: 3\n *\n * CONDUIT is the agent-to-agent messaging subsystem. The protocol wraps a\n * pluggable Transport (HTTP to cloud SignalDock, LocalTransport over\n * `conduit.db`, future SSE). These wire-format contracts describe the CLI +\n * HTTP dispatch surface for `cleo agent` and equivalent programmatic calls.\n *\n * SYNC: Canonical runtime implementation at\n * packages/cleo/src/dispatch/domains/conduit.ts (ConduitHandler)\n * and the lower-level interfaces at\n * packages/contracts/src/conduit.ts (Conduit, ConduitMessage, ...).\n *\n * Registry note (T964 \u2014 supersedes ADR-042 Decision 1): the dispatcher\n * registers these operations under `domain: 'conduit'` with short operation\n * names (`status`, `peek`, `start`, `stop`, `send`). The public/HTTP identifier\n * `conduit.<op>` remains the stable wire-format surface and what these\n * contracts describe; CLI and HTTP adapters map between the two forms.\n *\n * @task T910 \u2014 Orchestration Coherence v4 (contract surface completion)\n * @task T964 \u2014 CONDUIT promotion to canonical domain #15\n * @see packages/cleo/src/dispatch/domains/conduit.ts\n * @see packages/contracts/src/conduit.ts\n */\n\n// ============================================================================\n// Shared Conduit wire-format types\n// ============================================================================\n\n/** Transport implementation backing a conduit call. */\nexport type ConduitTransportKind = 'local' | 'http' | 'sse' | 'ws';\n\n/**\n * Compact inbox message projection returned by `conduit.peek`.\n *\n * @remarks\n * This is the LAFS-friendly wire format \u2014 a reduction of the richer\n * `ConduitMessage` interface at `../conduit.ts` that drops internal fields\n * (tags, metadata, threadId) unless the receiving client needs them. Clients\n * that want the full envelope should use the transport directly.\n */\nexport interface ConduitInboxMessage {\n /** Unique message id. */\n id: string;\n /** Sender agent id. */\n from: string;\n /** Message content (text). */\n content: string;\n /** Conversation / thread id when the message belongs to one. */\n conversationId?: string;\n /** ISO 8601 timestamp of delivery. */\n timestamp?: string;\n}\n\n// ============================================================================\n// Query Operations\n// ============================================================================\n\n// --------------------------------------------------------------------------\n// conduit.status \u2192 connection + unread count\n// --------------------------------------------------------------------------\n\n/** Parameters for `conduit.status`. */\nexport interface ConduitStatusParams {\n /** Agent id to check. Omit to use the registry's active agent. */\n agentId?: string;\n}\n/** Result of `conduit.status`. */\nexport interface ConduitStatusResult {\n /** The agent id checked. */\n agentId: string;\n /** Whether the transport reports a healthy connection. */\n connected: boolean;\n /** Transport backing this call. */\n transport: ConduitTransportKind;\n /** True if a long-running polling loop is active for this agent. */\n pollerRunning: boolean;\n /** Total unread messages in the agent's inbox. */\n unreadTotal?: number;\n /** Count of action-required messages (subset of unread). */\n actionItems?: number;\n /** Error summary when `connected=false`. */\n error?: string;\n}\n\n// --------------------------------------------------------------------------\n// conduit.peek \u2192 one-shot poll for new messages (ACKs as it reads)\n// --------------------------------------------------------------------------\n\n/** Parameters for `conduit.peek`. */\nexport interface ConduitPeekParams {\n /** Agent id to poll as. Omit to use the active agent. */\n agentId?: string;\n /** Max messages to fetch (default 20). */\n limit?: number;\n}\n/** Result of `conduit.peek`. */\nexport interface ConduitPeekResult {\n /** The agent id polled. */\n agentId: string;\n /** Messages retrieved. Empty array when the inbox is empty. */\n messages: ConduitInboxMessage[];\n}\n\n// ============================================================================\n// Mutate Operations\n// ============================================================================\n\n// --------------------------------------------------------------------------\n// conduit.start \u2192 begin continuous polling\n// --------------------------------------------------------------------------\n\n/** Parameters for `conduit.start`. */\nexport interface ConduitStartParams {\n /** Agent id to poll as. Omit to use the active agent. */\n agentId?: string;\n /** Poll interval in milliseconds (default 5000). */\n pollIntervalMs?: number;\n /** Group conversation ids to monitor for @-mentions. */\n groupConversationIds?: string[];\n}\n/** Result of `conduit.start`. */\nexport interface ConduitStartResult {\n /** Agent id polling was started for. */\n agentId: string;\n /** Effective poll interval (after defaulting). */\n pollIntervalMs: number;\n /** Group conversation ids being watched. */\n groupConversationIds: string[];\n /** Transport backing the poller. */\n transport: ConduitTransportKind;\n /** Human-readable status line. */\n message: string;\n /** True when `start` was a no-op because a poller was already running. */\n alreadyRunning?: boolean;\n}\n\n// --------------------------------------------------------------------------\n// conduit.stop \u2192 terminate active polling loop\n// --------------------------------------------------------------------------\n\n/** Parameters for `conduit.stop` \u2014 none. */\nexport type ConduitStopParams = Record<string, never>;\n/** Result of `conduit.stop`. */\nexport interface ConduitStopResult {\n /** Agent id whose poller was stopped (null if no poller was active). */\n agentId: string | null;\n /** Human-readable status line. */\n message: string;\n}\n\n// --------------------------------------------------------------------------\n// conduit.send \u2192 send a message to an agent or conversation\n// --------------------------------------------------------------------------\n\n/**\n * Parameters for `conduit.send`.\n *\n * @remarks\n * Caller MUST provide exactly one of `to` (direct message) or\n * `conversationId` (group/thread message). Supplying neither yields\n * `E_ARGS`; supplying both is a client-side mistake.\n */\nexport interface ConduitSendParams {\n /** Message content (required). */\n content: string;\n /** Target agent id for a direct message. */\n to?: string;\n /** Target conversation id for a group / thread message. */\n conversationId?: string;\n /** Send as this agent. Omit to use the active agent from the registry. */\n agentId?: string;\n}\n/** Result of `conduit.send`. */\nexport interface ConduitSendResult {\n /** The assigned message id. */\n messageId: string;\n /** Sender agent id. */\n from: string;\n /** Target of the send \u2014 agent id or conversation id. */\n to: string;\n /** Transport that was used. */\n transport: ConduitTransportKind;\n /** ISO 8601 send timestamp. */\n sentAt: string;\n}\n", "/**\n * Issues Domain Operations (4 operations)\n *\n * Query operations: 1 (diagnostics)\n * Mutate operations: 3 (add.bug, add.feature, add.help)\n *\n * @task T4494\n */\n\n/**\n * Common issue types\n */\nexport type IssueSeverity = 'low' | 'medium' | 'high' | 'critical';\nexport type IssueArea = 'cli' | 'dispatch' | 'docs' | 'tests' | 'other';\nexport type IssueType = 'bug' | 'feature' | 'help';\n\nexport interface Diagnostics {\n cleoVersion: string;\n bashVersion: string;\n jqVersion: string;\n os: string;\n shell: string;\n cleoHome: string;\n ghVersion: string;\n installLocation: string;\n}\n\n/**\n * Query Operations\n */\n\n// issues.diagnostics\nexport type IssuesDiagnosticsParams = Record<string, never>;\nexport interface IssuesDiagnosticsResult {\n diagnostics: Diagnostics;\n}\n\n/**\n * Mutate Operations\n */\n\n// issues.add.bug (alias: create.bug)\nexport interface IssuesCreateBugParams {\n title: string;\n body: string;\n severity?: IssueSeverity;\n area?: IssueArea;\n dryRun?: boolean;\n}\nexport interface IssuesCreateBugResult {\n type: 'bug';\n url: string;\n number: number;\n title: string;\n labels: string[];\n}\n\n// issues.add.feature (alias: create.feature)\nexport interface IssuesCreateFeatureParams {\n title: string;\n body: string;\n area?: IssueArea;\n dryRun?: boolean;\n}\nexport interface IssuesCreateFeatureResult {\n type: 'feature';\n url: string;\n number: number;\n title: string;\n labels: string[];\n}\n\n// issues.add.help (alias: create.help)\nexport interface IssuesCreateHelpParams {\n title: string;\n body: string;\n area?: IssueArea;\n dryRun?: boolean;\n}\nexport interface IssuesCreateHelpResult {\n type: 'help';\n url: string;\n number: number;\n title: string;\n labels: string[];\n}\n", "/**\n * Lifecycle Domain Operations (10 operations)\n *\n * Query operations: 5\n * Mutate operations: 5\n */\n\nimport type { StageStatus } from '../status-registry.js';\n\nexport type { StageStatus };\n\n/**\n * Common lifecycle types\n */\nexport type LifecycleStage =\n | 'research'\n | 'consensus'\n | 'architecture_decision'\n | 'specification'\n | 'decomposition'\n | 'implementation'\n | 'validation'\n | 'testing'\n | 'release';\n\nexport type GateStatus = 'passed' | 'failed' | 'blocked' | null;\n\nexport interface StageRecord {\n stage: LifecycleStage;\n status: StageStatus;\n started?: string;\n completed?: string;\n agent?: string;\n notes?: string;\n}\n\nexport interface Gate {\n name: string;\n stage: LifecycleStage;\n status: GateStatus;\n agent?: string;\n timestamp?: string;\n reason?: string;\n}\n\n/**\n * Query Operations\n */\n\n// lifecycle.check\n/**\n * Parameters for `lifecycle.check`.\n *\n * @remarks\n * Re-synced to match `lifecycleCheck(epicId, targetStage)` in\n * `packages/cleo/src/dispatch/engines/lifecycle-engine.ts`. The legacy\n * contract used `taskId`; the engine operates on the epic/pipeline\n * container. Both forms accept a task ID string \u2014 the parameter is named\n * after its semantic role (the epic whose pipeline stage is being checked).\n *\n * @task T963 \u2014 contract\u2194impl drift reconciliation (T910 audit)\n */\nexport interface LifecycleCheckParams {\n /**\n * Epic (or task with a pipeline) whose stage prerequisites should be\n * checked. Matches `epicId` in the engine signature.\n * @task T963\n */\n epicId: string;\n /** Target lifecycle stage to validate prerequisites for. @task T963 */\n targetStage: LifecycleStage;\n}\nexport interface LifecycleCheckResult {\n /**\n * The epic ID that was checked (mirrors `epicId` param). Named\n * `taskId` historically for wire compatibility; new callers should use\n * the param name `epicId`.\n * @task T963\n */\n taskId: string;\n /** The target stage that was checked. @task T963 */\n targetStage: LifecycleStage;\n /** True when prerequisites are satisfied and the stage can be entered. @task T963 */\n canProceed: boolean;\n /** Ordered list of stages that must complete first. @task T963 */\n missingPrerequisites: LifecycleStage[];\n /** Current gate status for the target stage. @task T963 */\n gateStatus: 'passed' | 'failed' | 'pending';\n}\n\n// lifecycle.status\nexport interface LifecycleStatusParams {\n taskId?: string;\n epicId?: string;\n}\nexport interface LifecycleStatusResult {\n id: string;\n currentStage: LifecycleStage;\n stages: StageRecord[];\n completedStages: LifecycleStage[];\n pendingStages: LifecycleStage[];\n}\n\n// lifecycle.history\nexport interface LifecycleHistoryParams {\n taskId: string;\n}\nexport interface LifecycleHistoryEntry {\n stage: LifecycleStage;\n from: StageStatus;\n to: StageStatus;\n timestamp: string;\n agent?: string;\n notes?: string;\n}\nexport type LifecycleHistoryResult = LifecycleHistoryEntry[];\n\n// lifecycle.gates\nexport interface LifecycleGatesParams {\n taskId: string;\n}\nexport type LifecycleGatesResult = Gate[];\n\n// lifecycle.prerequisites\nexport interface LifecyclePrerequisitesParams {\n targetStage: LifecycleStage;\n}\nexport interface LifecyclePrerequisitesResult {\n targetStage: LifecycleStage;\n prerequisites: LifecycleStage[];\n optional: LifecycleStage[];\n}\n\n/**\n * Mutate Operations\n */\n\n// lifecycle.progress\nexport interface LifecycleProgressParams {\n taskId: string;\n stage: LifecycleStage;\n status: StageStatus;\n notes?: string;\n}\nexport interface LifecycleProgressResult {\n taskId: string;\n stage: LifecycleStage;\n status: StageStatus;\n timestamp: string;\n}\n\n// lifecycle.skip\nexport interface LifecycleSkipParams {\n taskId: string;\n stage: LifecycleStage;\n reason: string;\n}\nexport interface LifecycleSkipResult {\n taskId: string;\n stage: LifecycleStage;\n skipped: string;\n reason: string;\n}\n\n// lifecycle.reset\nexport interface LifecycleResetParams {\n taskId: string;\n stage: LifecycleStage;\n reason: string;\n}\nexport interface LifecycleResetResult {\n taskId: string;\n stage: LifecycleStage;\n reset: string;\n reason: string;\n warning: string;\n}\n\n// lifecycle.gate.pass\nexport interface LifecycleGatePassParams {\n taskId: string;\n gateName: string;\n agent: string;\n notes?: string;\n}\nexport interface LifecycleGatePassResult {\n taskId: string;\n gateName: string;\n status: 'passed';\n timestamp: string;\n}\n\n// lifecycle.gate.fail\nexport interface LifecycleGateFailParams {\n taskId: string;\n gateName: string;\n reason: string;\n}\nexport interface LifecycleGateFailResult {\n taskId: string;\n gateName: string;\n status: 'failed';\n reason: string;\n timestamp: string;\n}\n", "/**\n * Memory Domain Operations (31 operations)\n *\n * Query operations: 21\n * Mutate operations: 10\n *\n * memory is the cognitive memory subsystem backed by `brain.db` (SQLite + FTS5\n * + vector + graph). It surfaces observations, decisions, patterns, learnings,\n * a PageIndex graph, RRF hybrid search, causal reasoning, and quality/health\n * telemetry. CLI identifiers start with `memory.*` and are routed through the\n * `memory` domain handler.\n *\n * Distinct from BRAIN (super-domain) \u2014 a NEW `operations/brain.ts` will be\n * authored in T962 Wave B for the unified cross-substrate graph operations\n * (wraps memory + nexus + tasks + conduit + signaldock).\n *\n * SYNC: Canonical implementations at packages/core/src/memory/*.\n * Wire-format types live here; they are the contract for CLI + HTTP dispatch.\n *\n * @task T910 \u2014 Orchestration Coherence v4 (contract surface completion)\n * @task T965 \u2014 operations/brain.ts \u2192 operations/memory.ts rename\n * @see packages/cleo/src/dispatch/domains/memory.ts\n * @see packages/contracts/src/brain.ts\n */\n\nimport type { BrainCognitiveType, BrainMemoryTier, BrainSourceConfidence } from '../brain.js';\nimport type { LAFSPage } from '../lafs.js';\n\n// ============================================================================\n// Shared Memory types (API wire format)\n// ============================================================================\n\n/**\n * Cognitive type of a memory entry.\n *\n * @remarks\n * Mirrors the CLI-facing taxonomy accepted by `memory.observe`. Distinct from\n * `BrainCognitiveType` from `../brain.js` which carries the 3-axis\n * semantic/episodic/procedural cognitive model used internally.\n */\nexport type MemoryEntryType = 'observation' | 'decision' | 'pattern' | 'learning' | 'reference';\n\n/** Memory observation subtype categories (from `brain_observations.type`). */\nexport type MemoryObservationKind =\n | 'discovery'\n | 'change'\n | 'feature'\n | 'bugfix'\n | 'decision'\n | 'refactor';\n\n/** Origin tag distinguishing where an observation was captured. */\nexport type MemoryObservationSourceType =\n | 'manual'\n | 'session-debrief'\n | 'observer'\n | 'reflector'\n | 'transcript';\n\n/** Pattern taxonomy (from `brain_patterns.type`). */\nexport type MemoryPatternType = 'workflow' | 'blocker' | 'success' | 'failure' | 'optimization';\n\n/** Severity/impact level for a stored pattern. */\nexport type MemoryPatternImpact = 'low' | 'medium' | 'high';\n\n/** Compact hit returned from `memory.find` / `memory.search.hybrid` layer-0 search. */\nexport interface MemoryCompactHit {\n /** Memory entry identifier (e.g. `O-abc123`, `D-def456`). */\n id: string;\n /** Table this hit was drawn from. */\n type: 'decision' | 'pattern' | 'learning' | 'observation';\n /** Normalized display title for the entry. */\n title: string;\n /** ISO 8601 timestamp of entry creation. */\n date: string;\n /** Relevance score (table-specific; higher = better). */\n relevance?: number;\n /** Reciprocal Rank Fusion score (only when RRF path engaged). */\n rrfScore?: number;\n /** BM25 normalized score from FTS path (0..1). */\n bm25Score?: number;\n}\n\n/** Full memory entry body returned by `memory.fetch` (layer-2 retrieval). */\nexport interface MemoryFetchedEntry {\n /** Memory entry identifier. */\n id: string;\n /** Table the entry was drawn from. */\n type: string;\n /** Raw entry payload \u2014 columns vary by table. */\n data: unknown;\n}\n\n/** Timeline neighbor tuple returned by `memory.timeline`. */\nexport interface MemoryTimelineNeighbor {\n /** Memory entry identifier. */\n id: string;\n /** Entry table type. */\n type: string;\n /** ISO 8601 timestamp. */\n date: string;\n}\n\n/** Anchor entry (shape is table-dependent). */\nexport type MemoryAnchor = Record<string, unknown>;\n\n/** PageIndex graph node (projection of `brain_page_nodes`). */\nexport interface MemoryGraphNode {\n /** Node identifier. */\n id: string;\n /** Node type classification (e.g. `symbol`, `file`, `concept`). */\n nodeType: string;\n /** Human-readable label. */\n label: string;\n /** Quality score [0..1] used by PageIndex ranking. */\n qualityScore: number;\n /** SHA-256 hash of the referenced content (if applicable). */\n contentHash: string | null;\n /** ISO 8601 timestamp of last activity touching this node. */\n lastActivityAt: string;\n /** Optional JSON-encoded metadata string. */\n metadataJson: string | null;\n /** ISO 8601 timestamp of creation. */\n createdAt: string;\n /** ISO 8601 timestamp of last update (nullable). */\n updatedAt: string | null;\n}\n\n/** PageIndex graph edge (projection of `brain_page_edges`). */\nexport interface MemoryGraphEdge {\n /** Source node id. */\n fromId: string;\n /** Target node id. */\n toId: string;\n /** Edge type classification. */\n edgeType: string;\n /** Edge weight/confidence [0..1]. */\n weight: number;\n /** Optional JSON-encoded metadata string. */\n metadataJson: string | null;\n /** ISO 8601 creation timestamp. */\n createdAt: string;\n}\n\n/** Decision node returned by reasoning queries. */\nexport interface MemoryDecisionNode {\n /** Decision entry identifier (`D-...`). */\n id: string;\n /** The decision statement. */\n title: string;\n /** Rationale for the decision. */\n rationale: string;\n}\n\n// ============================================================================\n// Query Operations\n// ============================================================================\n\n// --------------------------------------------------------------------------\n// memory.find \u2192 cross-table FTS5 / RRF search (handler: memory.find)\n// --------------------------------------------------------------------------\n\n/**\n * Parameters for `memory.find`.\n *\n * @remarks\n * Preconditions: `query` must be non-empty. Returns compact hits suitable for\n * follow-up `memory.fetch` batching (3-layer retrieval: find \u2192 filter \u2192 fetch).\n */\nexport interface MemoryFindParams {\n /** Full-text query string (required). */\n query: string;\n /** Max results to return. */\n limit?: number;\n /** Tables to search (defaults to all four). */\n tables?: Array<'decisions' | 'patterns' | 'learnings' | 'observations'>;\n /** ISO 8601 lower bound on entry date. */\n dateStart?: string;\n /** ISO 8601 upper bound on entry date. */\n dateEnd?: string;\n /** Filter to observations produced by a specific agent (T418 mental models). */\n agent?: string;\n /** When true (default), apply Reciprocal Rank Fusion across FTS + vector sources. */\n useRRF?: boolean;\n}\n/** Result of `memory.find`. */\nexport interface MemoryFindResult {\n /** Ranked matches. */\n results: MemoryCompactHit[];\n /** Total match count (may exceed `results.length` when limit applied). */\n total: number;\n /** Estimated token weight of the payload. */\n tokensEstimated: number;\n}\n\n// --------------------------------------------------------------------------\n// memory.timeline \u2192 chronological context around anchor\n// --------------------------------------------------------------------------\n\n/** Parameters for `memory.timeline`. */\nexport interface MemoryTimelineParams {\n /** Anchor entry id (required). */\n anchor: string;\n /** Number of entries to retrieve before the anchor. */\n depthBefore?: number;\n /** Number of entries to retrieve after the anchor. */\n depthAfter?: number;\n}\n/** Result of `memory.timeline`. */\nexport interface MemoryTimelineResult {\n /** The anchor entry (or null if not found). */\n anchor: MemoryAnchor | null;\n /** Entries preceding the anchor (chronological). */\n before: MemoryTimelineNeighbor[];\n /** Entries following the anchor (chronological). */\n after: MemoryTimelineNeighbor[];\n}\n\n// --------------------------------------------------------------------------\n// memory.fetch \u2192 batch fetch by IDs (layer-2 retrieval)\n// --------------------------------------------------------------------------\n\n/** Parameters for `memory.fetch`. */\nexport interface MemoryFetchParams {\n /** One or more memory entry IDs to retrieve. Must be non-empty. */\n ids: string[];\n}\n/** Result of `memory.fetch`. */\nexport interface MemoryFetchResult {\n /** Full entry bodies. */\n results: MemoryFetchedEntry[];\n /** IDs that could not be located. */\n notFound: string[];\n /** Estimated token weight of the payload. */\n tokensEstimated: number;\n}\n\n// --------------------------------------------------------------------------\n// memory.decision.find \u2192 decision memory search\n// --------------------------------------------------------------------------\n\n/** Parameters for `memory.decision.find`. */\nexport interface MemoryDecisionFindParams {\n /** Optional free-text filter. */\n query?: string;\n /** Filter decisions linked to a specific task. */\n taskId?: string;\n /** Max results. */\n limit?: number;\n}\n/** A single decision entry returned by the API. */\nexport interface MemoryDecisionEntry {\n /** Decision id (`D-...`). */\n id: string;\n /** Decision statement. */\n decision: string;\n /** Rationale body. */\n rationale: string;\n /** Alternatives considered at decision time. */\n alternatives?: string[];\n /** ISO 8601 creation timestamp. */\n createdAt: string;\n /** Epic context, if captured. */\n contextEpicId?: string;\n /** Task context, if captured. */\n contextTaskId?: string;\n /** Phase context, if captured. */\n contextPhase?: string;\n /** Source confidence (T549). */\n sourceConfidence?: BrainSourceConfidence;\n}\n/** Result of `memory.decision.find`. */\nexport type MemoryDecisionFindResult = MemoryDecisionEntry[];\n\n// --------------------------------------------------------------------------\n// memory.pattern.find \u2192 pattern memory search\n// --------------------------------------------------------------------------\n\n/** Parameters for `memory.pattern.find`. */\nexport interface MemoryPatternFindParams {\n /** Filter by pattern type. */\n type?: MemoryPatternType;\n /** Filter by pattern impact. */\n impact?: MemoryPatternImpact;\n /** Optional free-text query. */\n query?: string;\n /** Minimum reinforcement frequency. */\n minFrequency?: number;\n /** Max results. */\n limit?: number;\n}\n/** A single pattern entry returned by the API. */\nexport interface MemoryPatternEntry {\n /** Pattern id (`P-...`). */\n id: string;\n /** Pattern classification. */\n type: MemoryPatternType;\n /** Pattern description. */\n pattern: string;\n /** Surrounding context. */\n context: string;\n /** Impact level. */\n impact: MemoryPatternImpact;\n /** Anti-pattern counter-example (if applicable). */\n antiPattern?: string;\n /** Mitigation guidance (if applicable). */\n mitigation?: string;\n /** Concrete examples. */\n examples?: string[];\n /** Empirical success rate [0..1]. */\n successRate?: number;\n /** How often this pattern has been observed. */\n frequency: number;\n /** ISO 8601 creation timestamp. */\n createdAt: string;\n}\n/** Result of `memory.pattern.find`. */\nexport interface MemoryPatternFindResult {\n /** Matching pattern entries. */\n patterns: MemoryPatternEntry[];\n /** Count of matches. */\n total: number;\n}\n\n// --------------------------------------------------------------------------\n// memory.learning.find \u2192 learning memory search\n// --------------------------------------------------------------------------\n\n/** Parameters for `memory.learning.find`. */\nexport interface MemoryLearningFindParams {\n /** Optional free-text query. */\n query?: string;\n /** Minimum confidence threshold [0..1]. */\n minConfidence?: number;\n /** Restrict to learnings marked actionable. */\n actionableOnly?: boolean;\n /** Filter by applicable task/entry type. */\n applicableType?: string;\n /** Max results. */\n limit?: number;\n}\n/** A single learning entry returned by the API. */\nexport interface MemoryLearningEntry {\n /** Learning id (`L-...`). */\n id: string;\n /** Insight statement. */\n insight: string;\n /** Source reference for the insight. */\n source: string;\n /** Confidence score [0..1]. */\n confidence: number;\n /** Whether the learning is actionable. */\n actionable: boolean;\n /** How to apply the insight. */\n application?: string;\n /** Types this insight applies to. */\n applicableTypes?: string[];\n /** ISO 8601 creation timestamp. */\n createdAt: string;\n}\n/** Result of `memory.learning.find`. */\nexport type MemoryLearningFindResult = MemoryLearningEntry[];\n\n// --------------------------------------------------------------------------\n// memory.graph.* \u2192 PageIndex graph queries\n// --------------------------------------------------------------------------\n\n/** Parameters for `memory.graph.show`. */\nexport interface MemoryGraphShowParams {\n /** Node identifier. */\n nodeId: string;\n}\n/** Result of `memory.graph.show`. */\nexport interface MemoryGraphShowResult {\n /** The node, if found. */\n node: MemoryGraphNode | null;\n /** In-edges (node is target). */\n inEdges: MemoryGraphEdge[];\n /** Out-edges (node is source). */\n outEdges: MemoryGraphEdge[];\n}\n\n/** Parameters for `memory.graph.neighbors`. */\nexport interface MemoryGraphNeighborsParams {\n /** Node identifier. */\n nodeId: string;\n /** Optional filter to a single edge type. */\n edgeType?: string;\n}\n/** Result of `memory.graph.neighbors`. */\nexport interface MemoryGraphNeighbor {\n /** The neighbor node. */\n node: MemoryGraphNode;\n /** Edge type connecting the query node to this neighbor. */\n edgeType: string;\n /** Relative to the queried node: `out` = outbound, `in` = inbound. */\n direction: 'out' | 'in';\n /** Edge weight/confidence. */\n weight: number;\n}\n/** Result payload for `memory.graph.neighbors`. */\nexport type MemoryGraphNeighborsResult = MemoryGraphNeighbor[];\n\n/** Parameters for `memory.graph.trace` (BFS traversal). */\nexport interface MemoryGraphTraceParams {\n /** Seed node identifier. */\n nodeId: string;\n /** Max traversal depth. */\n maxDepth?: number;\n}\n/** A node visited during BFS traversal. */\nexport interface MemoryGraphTraceNode extends MemoryGraphNode {\n /** Distance from the seed (0 = seed itself). */\n depth: number;\n}\n/** Result of `memory.graph.trace`. */\nexport type MemoryGraphTraceResult = MemoryGraphTraceNode[];\n\n/** Parameters for `memory.graph.related` (1-hop typed neighbors). */\nexport interface MemoryGraphRelatedParams {\n /** Node identifier. */\n nodeId: string;\n /** Optional filter to a single edge type. */\n edgeType?: string;\n}\n/** Result of `memory.graph.related`. */\nexport type MemoryGraphRelatedResult = MemoryGraphNeighbor[];\n\n/** Parameters for `memory.graph.context` (360-degree view). */\nexport interface MemoryGraphContextParams {\n /** Node identifier. */\n nodeId: string;\n}\n/** Result of `memory.graph.context`. */\nexport interface MemoryGraphContextResult {\n /** The node itself. */\n node: MemoryGraphNode;\n /** In-edges (this node is target). */\n inEdges: MemoryGraphEdge[];\n /** Out-edges (this node is source). */\n outEdges: MemoryGraphEdge[];\n /** Deduplicated neighbour list with direction + edge metadata. */\n neighbors: MemoryGraphNeighbor[];\n}\n\n/** Parameters for `memory.graph.stats` \u2014 none. */\nexport type MemoryGraphStatsParams = Record<string, never>;\n/** Result of `memory.graph.stats`. */\nexport interface MemoryGraphStatsResult {\n /** Per-type node counts. */\n nodesByType: Array<{ nodeType: string; count: number }>;\n /** Per-type edge counts. */\n edgesByType: Array<{ edgeType: string; count: number }>;\n /** Total node count. */\n totalNodes: number;\n /** Total edge count. */\n totalEdges: number;\n}\n\n// --------------------------------------------------------------------------\n// memory.reason.* \u2192 causal / similarity reasoning\n// --------------------------------------------------------------------------\n\n/** Parameters for `memory.reason.why` (causal trace). */\nexport interface MemoryReasonWhyParams {\n /** Task identifier whose blocker chain should be traced. */\n taskId: string;\n}\n/** A single blocker in a causal trace. */\nexport interface MemoryBlockerNode {\n /** Blocking task identifier. */\n taskId: string;\n /** Task status at time of trace. */\n status: string;\n /** Free-text reason (if captured). */\n reason?: string;\n /** Decisions linked to this blocker. */\n decisions: MemoryDecisionNode[];\n}\n/** Result of `memory.reason.why`. */\nexport interface MemoryReasonWhyResult {\n /** Root task ID that triggered the trace. */\n taskId: string;\n /** Walk of unresolved blockers (depth-ordered). */\n blockers: MemoryBlockerNode[];\n /** Leaf blocker IDs flagged as root causes. */\n rootCauses: string[];\n /** Maximum traversal depth reached. */\n depth: number;\n}\n\n/** Parameters for `memory.reason.similar`. */\nexport interface MemoryReasonSimilarParams {\n /** Source entry id to compare against. */\n entryId: string;\n /** Maximum results to return. */\n limit?: number;\n}\n/** A similar entry with a distance score. */\nexport interface MemorySimilarEntry {\n /** Matched entry id. */\n id: string;\n /** Cosine / vector distance (lower = more similar). */\n distance: number;\n /** Entry type/table. */\n type: string;\n /** Display title. */\n title: string;\n /** Truncated text preview. */\n text: string;\n}\n/** Result of `memory.reason.similar`. */\nexport type MemoryReasonSimilarResult = MemorySimilarEntry[];\n\n// --------------------------------------------------------------------------\n// memory.search.hybrid \u2192 FTS + vector + graph fusion (RRF)\n// --------------------------------------------------------------------------\n\n/** Parameters for `memory.search.hybrid`. */\nexport interface MemorySearchHybridParams {\n /** Query string (required). */\n query: string;\n /** RRF weight for FTS results [0..1]. */\n ftsWeight?: number;\n /** RRF weight for vector results [0..1]. */\n vecWeight?: number;\n /** RRF weight for graph-expansion results [0..1]. */\n graphWeight?: number;\n /** Max results to return. */\n limit?: number;\n}\n/** A fused result from hybrid search. */\nexport interface MemoryHybridHit {\n /** Memory entry id. */\n id: string;\n /** Fused RRF score. */\n score: number;\n /** Entry type/table. */\n type: string;\n /** Display title. */\n title: string;\n /** Truncated text preview. */\n text: string;\n /** Retrieval sources that contributed. */\n sources: Array<'fts' | 'vec' | 'graph'>;\n /** Rank from FTS source (0-based; undefined if absent). */\n ftsRank?: number;\n /** Rank from vector source (0-based; undefined if absent). */\n vecRank?: number;\n}\n/** Result of `memory.search.hybrid`. */\nexport type MemorySearchHybridResult = MemoryHybridHit[];\n\n// --------------------------------------------------------------------------\n// memory.quality \u2192 memory quality report\n// --------------------------------------------------------------------------\n\n/** Parameters for `memory.quality` \u2014 none. */\nexport type MemoryQualityParams = Record<string, never>;\n/** Result of `memory.quality`. */\nexport interface MemoryQualityResult {\n /** Per-tier entry counts. */\n tierDistribution: Record<BrainMemoryTier, number>;\n /** Per-cognitive-type counts. */\n cognitiveDistribution: Record<BrainCognitiveType, number>;\n /** Fraction of entries classified as noise [0..1]. */\n noiseRatio: number;\n /** Retrieval hit-rate stats for the last sampling window. */\n retrievalStats: {\n /** Count of retrieval requests. */\n totalQueries: number;\n /** Fraction returning at least one hit [0..1]. */\n hitRate: number;\n };\n /** ISO 8601 timestamp when the report was computed. */\n generatedAt: string;\n}\n\n// --------------------------------------------------------------------------\n// memory.code.* \u2192 code_reference edges between memory & nexus\n// --------------------------------------------------------------------------\n\n/** Parameters for `memory.code.links` \u2014 none. */\nexport type MemoryCodeLinksParams = Record<string, never>;\n/** A single code_reference edge. */\nexport interface MemoryCodeLink {\n /** Memory entry id. */\n memoryId: string;\n /** Nexus code symbol identifier. */\n codeSymbol: string;\n /** ISO 8601 creation timestamp. */\n createdAt: string;\n}\n/** Result of `memory.code.links`. */\nexport type MemoryCodeLinksResult = MemoryCodeLink[];\n\n/** Parameters for `memory.code.memories-for-code`. */\nexport interface MemoryCodeMemoriesForCodeParams {\n /** Code symbol identifier. */\n symbol: string;\n}\n/** Result of `memory.code.memories-for-code`. */\nexport interface MemoryCodeMemoriesForCodeResult {\n /** Code symbol that was queried. */\n symbol: string;\n /** Memory entries referencing this symbol. */\n memories: Array<{ id: string; type: string; title: string }>;\n}\n\n/** Parameters for `memory.code.for-memory`. */\nexport interface MemoryCodeForMemoryParams {\n /** Memory entry id. */\n memoryId: string;\n}\n/** Result of `memory.code.for-memory`. */\nexport interface MemoryCodeForMemoryResult {\n /** Memory entry id that was queried. */\n memoryId: string;\n /** Code symbols referenced by this memory. */\n codeSymbols: string[];\n}\n\n// --------------------------------------------------------------------------\n// memory.llm-status \u2192 LLM extraction backend status\n// --------------------------------------------------------------------------\n\n/** Parameters for `memory.llm-status` \u2014 none. */\nexport type MemoryLlmStatusParams = Record<string, never>;\n/** Result of `memory.llm-status`. */\nexport interface MemoryLlmStatusResult {\n /** Where the Anthropic API key was resolved from (env, config, keychain, etc.). */\n resolvedSource: string;\n /** True when LLM-assisted extraction is wired and key is present. */\n extractionEnabled: boolean;\n /** ISO 8601 timestamp of the most recent extraction run; null if none. */\n lastExtractionRun: string | null;\n /** Suggested CLI command to trigger a test extraction. */\n testCommand: string;\n}\n\n// --------------------------------------------------------------------------\n// memory.pending-verify \u2192 unverified-but-cited entries queue\n// --------------------------------------------------------------------------\n\n/** Parameters for `memory.pending-verify`. */\nexport interface MemoryPendingVerifyParams {\n /** Minimum citation count to surface an entry (default 5). */\n minCitations?: number;\n /** Max entries to return (default 50). */\n limit?: number;\n}\n/** A single pending-verify row. */\nexport interface MemoryPendingEntry {\n /** Entry id (prefix varies by table). */\n id: string;\n /** Normalized display title. */\n title: string | null;\n /** Source confidence (nullable when never scored). */\n sourceConfidence: string | null;\n /** Times this entry has been cited by retrieval/reasoning. */\n citationCount: number;\n /** Memory tier (nullable when never assigned). */\n memoryTier: string | null;\n /** ISO 8601 creation timestamp. */\n createdAt: string;\n /** Source table name (e.g. `observations`, `decisions`). */\n table: string;\n}\n/** Result of `memory.pending-verify`. */\nexport interface MemoryPendingVerifyResult {\n /** Count of entries returned. */\n count: number;\n /** Minimum citation threshold applied. */\n minCitations: number;\n /** Pending entries ordered by citation count desc. */\n items: MemoryPendingEntry[];\n /** Human-readable next-step hint. */\n hint: string;\n}\n\n// ============================================================================\n// Mutate Operations\n// ============================================================================\n\n// --------------------------------------------------------------------------\n// memory.observe \u2192 save observation\n// --------------------------------------------------------------------------\n\n/** Parameters for `memory.observe`. */\nexport interface MemoryObserveParams {\n /** Observation text body (required). */\n text: string;\n /** Short display title. */\n title?: string;\n /** Observation kind (default inferred from content). */\n type?: MemoryObservationKind;\n /** Project context override. */\n project?: string;\n /** Originating session id. */\n sourceSessionId?: string;\n /** Observation source classification. */\n sourceType?: MemoryObservationSourceType;\n /** Agent that captured this observation (T417 mental models). */\n agent?: string;\n /** Source confidence override (T549). */\n sourceConfidence?: BrainSourceConfidence;\n /** Attachment SHA-256 refs to link to this observation (T799). */\n attachmentRefs?: string[];\n /** Cross-reference to other memory or external IDs (T794). */\n crossRef?: string[];\n}\n/** Result of `memory.observe`. */\nexport interface MemoryObserveResult {\n /** Newly-created observation id (`O-...`). */\n id: string;\n /** Entry table this was written to. */\n type: string;\n /** ISO 8601 creation timestamp. */\n createdAt: string;\n}\n\n// --------------------------------------------------------------------------\n// memory.decision.store \u2192 store a decision\n// --------------------------------------------------------------------------\n\n/** Parameters for `memory.decision.store`. */\nexport interface MemoryDecisionStoreParams {\n /** Decision statement (required). */\n decision: string;\n /** Rationale for the decision (required). */\n rationale: string;\n /** Alternatives considered at decision time. */\n alternatives?: string[];\n /** Task ID providing decision context. */\n taskId?: string;\n /** Session ID providing decision context. */\n sessionId?: string;\n /** Epic context. */\n contextEpicId?: string;\n /** Phase context. */\n contextPhase?: string;\n}\n/** Result of `memory.decision.store`. */\nexport interface MemoryDecisionStoreResult {\n /** New decision id (`D-...` or sequential `D001`). */\n id: string;\n /** ISO 8601 creation timestamp. */\n createdAt: string;\n}\n\n// --------------------------------------------------------------------------\n// memory.pattern.store \u2192 store a pattern\n// --------------------------------------------------------------------------\n\n/** Parameters for `memory.pattern.store`. */\nexport interface MemoryPatternStoreParams {\n /** Pattern description (required). */\n pattern: string;\n /** Surrounding context (required). */\n context: string;\n /** Pattern classification (default `workflow`). */\n type?: MemoryPatternType;\n /** Pattern impact level. */\n impact?: MemoryPatternImpact;\n /** Counter-example anti-pattern. */\n antiPattern?: string;\n /** Mitigation guidance. */\n mitigation?: string;\n /** Concrete examples. */\n examples?: string[];\n /** Empirical success rate [0..1]. */\n successRate?: number;\n /** Origin tag (e.g. `auto`, `agent`). Routes source confidence. */\n source?: string;\n}\n/** Result of `memory.pattern.store`. */\nexport interface MemoryPatternStoreResult {\n /** New pattern id (`P-...`). */\n id: string;\n /** True when this store call incremented frequency on a duplicate match. */\n deduplicated: boolean;\n /** ISO 8601 creation timestamp. */\n createdAt: string;\n}\n\n// --------------------------------------------------------------------------\n// memory.learning.store \u2192 store a learning\n// --------------------------------------------------------------------------\n\n/** Parameters for `memory.learning.store`. */\nexport interface MemoryLearningStoreParams {\n /** Insight statement (required). */\n insight: string;\n /** Source reference for the insight (required). */\n source: string;\n /** Confidence [0..1] (default 0.5). */\n confidence?: number;\n /** Marks the learning as actionable. */\n actionable?: boolean;\n /** How to apply the insight. */\n application?: string;\n /** Types/domains this learning applies to. */\n applicableTypes?: string[];\n}\n/** Result of `memory.learning.store`. */\nexport interface MemoryLearningStoreResult {\n /** New learning id (`L-...`). */\n id: string;\n /** True when this store call updated an existing duplicate. */\n deduplicated: boolean;\n /** ISO 8601 creation timestamp. */\n createdAt: string;\n}\n\n// --------------------------------------------------------------------------\n// memory.link \u2192 link memory entry to a task\n// --------------------------------------------------------------------------\n\n/** Parameters for `memory.link`. */\nexport interface MemoryLinkParams {\n /** Task id to link. */\n taskId: string;\n /** Memory entry id to link. */\n entryId: string;\n}\n/** Result of `memory.link`. */\nexport interface MemoryLinkResult {\n /** Task id that was linked. */\n taskId: string;\n /** Entry id that was linked. */\n entryId: string;\n /** True when the edge was newly created (false if already present). */\n linked: boolean;\n}\n\n// --------------------------------------------------------------------------\n// memory.graph.add / memory.graph.remove \u2192 PageIndex graph mutations\n// --------------------------------------------------------------------------\n\n/**\n * Parameters for `memory.graph.add`.\n *\n * @remarks\n * Either a node-insert shape (`nodeId` + `nodeType` + `label`) or an\n * edge-insert shape (`fromId` + `toId` + `edgeType`). Caller MUST supply\n * exactly one of those two variants.\n */\nexport interface MemoryGraphAddParams {\n /** Node id (node-insert mode). */\n nodeId?: string;\n /** Node type classification (node-insert mode). */\n nodeType?: string;\n /** Display label (node-insert mode). */\n label?: string;\n /** JSON-encoded metadata string. */\n metadataJson?: string;\n /** Source node id (edge-insert mode). */\n fromId?: string;\n /** Target node id (edge-insert mode). */\n toId?: string;\n /** Edge type (edge-insert mode). */\n edgeType?: string;\n /** Edge weight [0..1] (edge-insert mode). */\n weight?: number;\n}\n/** Result of `memory.graph.add`. */\nexport interface MemoryGraphAddResult {\n /** Variant applied. */\n mode: 'node' | 'edge';\n /** Id of the node or `fromId:toId:edgeType` edge key. */\n id: string;\n /** ISO 8601 creation timestamp. */\n createdAt: string;\n}\n\n/** Parameters for `memory.graph.remove`. */\nexport interface MemoryGraphRemoveParams {\n /** Node id (node-remove mode). */\n nodeId?: string;\n /** Source node id (edge-remove mode). */\n fromId?: string;\n /** Target node id (edge-remove mode). */\n toId?: string;\n /** Edge type (edge-remove mode). */\n edgeType?: string;\n}\n/** Result of `memory.graph.remove`. */\nexport interface MemoryGraphRemoveResult {\n /** Variant applied. */\n mode: 'node' | 'edge';\n /** Number of rows deleted. */\n removed: number;\n}\n\n// --------------------------------------------------------------------------\n// memory.code.link / memory.code.auto-link \u2192 code_reference edges\n// --------------------------------------------------------------------------\n\n/** Parameters for `memory.code.link`. */\nexport interface MemoryCodeLinkParams {\n /** Memory entry id. */\n memoryId: string;\n /** Nexus code symbol identifier. */\n codeSymbol: string;\n}\n/** Result of `memory.code.link`. */\nexport interface MemoryCodeLinkResult {\n /** True when the edge was newly created (false when it already existed). */\n linked: boolean;\n}\n\n/** Parameters for `memory.code.auto-link` \u2014 none. */\nexport type MemoryCodeAutoLinkParams = Record<string, never>;\n/** Result of `memory.code.auto-link`. */\nexport interface MemoryCodeAutoLinkResult {\n /** Count of memory entries scanned. */\n scanned: number;\n /** Count of new edges created by the scan. */\n linked: number;\n /** Count of edges skipped because they already existed. */\n skipped: number;\n}\n\n// --------------------------------------------------------------------------\n// memory.verify \u2192 ground-truth promote (owner / cleo-prime only)\n// --------------------------------------------------------------------------\n\n/** Parameters for `memory.verify`. */\nexport interface MemoryVerifyParams {\n /** Memory entry id to promote to verified=1. */\n id: string;\n /** Caller identity (`cleo-prime` or `owner`). Omit for terminal invocation. */\n agent?: string;\n}\n/** Result of `memory.verify`. */\nexport interface MemoryVerifyResult {\n /** Entry id that was verified. */\n id: string;\n /** Table the entry lives in. */\n table: string;\n /** True when verified=0 \u2192 1 transition occurred. False when already verified. */\n promoted: boolean;\n /** ISO 8601 timestamp of the verify attempt. */\n verifiedAt: string;\n}\n\n// --------------------------------------------------------------------------\n// memory.promote-explain \u2192 read-only view over STDP + retrieval + citation\n// --------------------------------------------------------------------------\n\n/**\n * Parameters for `memory.promote-explain`.\n *\n * @remarks\n * Read-only. Accepts the `id` of any typed brain entry (`O-*`, `D-*`, `P-*`,\n * `L-*`) and returns a score breakdown explaining why the entry was (or was\n * not) promoted to a higher memory tier.\n *\n * @task T997\n */\nexport interface MemoryPromoteExplainParams {\n /** Brain entry identifier (e.g. `O-abc123`, `D-def456`). */\n id: string;\n}\n\n/**\n * A single STDP edge weight record relevant to this entry.\n *\n * @task T997\n */\nexport interface MemoryStdpWeight {\n /** Source node id. */\n fromId: string;\n /** Target node id. */\n toId: string;\n /** Edge type (e.g. `co_retrieved`, `semantic`). */\n edgeType: string;\n /** Edge weight [0..1]. */\n weight: number;\n /** Number of LTP reinforcement events applied to this edge. */\n reinforcementCount: number;\n /** ISO 8601 timestamp of last reinforcement (or null if never reinforced). */\n lastReinforcedAt: string | null;\n}\n\n/**\n * Breakdown of factors that determine promotion eligibility.\n *\n * @task T997\n */\nexport interface MemoryPromoteScoreBreakdown {\n /** Aggregate STDP weight (max edge weight across all co-retrieved edges; 0 if none). */\n stdpWeightMax: number;\n /** Number of retrieval log entries that included this entry. */\n retrievalCount: number;\n /** ISO 8601 timestamp of the most recent retrieval (or null if never retrieved). */\n lastAccessedAt: string | null;\n /** Number of citations (from `citation_count` column). */\n citationCount: number;\n /** Content quality score [0..1] from the typed table. */\n qualityScore: number | null;\n /** Whether this entry has been flagged as a prune candidate. */\n pruneCandidate: boolean;\n /** Whether this entry has been manually verified (ground-truth promoted). */\n verified: boolean;\n}\n\n/**\n * Promotion tier decision.\n *\n * - `promoted` \u2014 entry has been elevated to a longer-lived memory tier.\n * - `rejected` \u2014 entry is flagged for pruning (prune_candidate=1).\n * - `pending` \u2014 entry has not yet been promoted or rejected.\n *\n * @task T997\n */\nexport type MemoryPromotionTier = 'promoted' | 'rejected' | 'pending';\n\n/**\n * Result of `memory.promote-explain`.\n *\n * @task T997\n */\nexport interface MemoryPromoteExplainResult {\n /** Brain entry identifier queried. */\n id: string;\n /** Table the entry lives in (without `brain_` prefix). */\n table: string;\n /** Promotion tier decision. */\n tier: MemoryPromotionTier;\n /** Human-readable explanation of the tier decision. */\n explanation: string;\n /** ISO 8601 timestamp when tier was promoted (null if never promoted or rejected). */\n promotedAt: string | null;\n /** STDP edge weights involving this entry's page-node (may be empty). */\n stdpWeights: MemoryStdpWeight[];\n /** Score breakdown used to determine promotion eligibility. */\n scoreBreakdown: MemoryPromoteScoreBreakdown;\n}\n\n// ============================================================================\n// Paginated result helper (for HTTP list surfaces that opt into LAFSPage)\n// ============================================================================\n\n/** Generic paginated envelope reused by future list variants. */\nexport interface MemoryPagedResult<T> {\n /** Items for this page. */\n items: T[];\n /** Total count across all pages. */\n total: number;\n /** Pagination descriptor. */\n page: LAFSPage;\n}\n", "/**\n * Nexus Domain Operations (22 operations)\n *\n * Query operations: 13\n * Mutate operations: 9\n *\n * NEXUS is the cross-project coordination layer (the BRAIN Network). It tracks\n * registered projects in a global registry (`nexus.db`), serves cross-project\n * task references (`project:taskId` syntax), answers dependency / blocker /\n * orphan queries, and orchestrates cross-project transfers. These wire-format\n * contracts describe the CLI + HTTP dispatch surface.\n *\n * SYNC: Canonical implementations at\n * packages/core/src/nexus/* and packages/nexus/*\n * Engine adapter at\n * packages/cleo/src/dispatch/engines/nexus-engine.ts\n *\n * @task T910 \u2014 Orchestration Coherence v4 (contract surface completion)\n * @see packages/cleo/src/dispatch/domains/nexus.ts\n */\n\nimport type { LAFSPage } from '../lafs.js';\n\n// ============================================================================\n// Shared Nexus wire-format types\n// ============================================================================\n\n/** Permission level granted to a registered project. */\nexport type NexusPermissionLevel = 'read' | 'write' | 'execute';\n\n/** Health status surfaced by `nexus.show` / `nexus.status`. */\nexport type NexusHealthStatus = 'unknown' | 'healthy' | 'degraded' | 'unreachable';\n\n/** Cross-project transfer mode. */\nexport type NexusTransferMode = 'copy' | 'move';\n\n/** Cross-project transfer scope. */\nexport type NexusTransferScope = 'single' | 'subtree';\n\n/** Conflict resolution strategy for transfers. */\nexport type NexusTransferOnConflict = 'duplicate' | 'rename' | 'skip' | 'fail';\n\n/** Handling strategy when deps are missing in the target project. */\nexport type NexusTransferOnMissingDep = 'strip' | 'fail';\n\n/** Per-project code intelligence statistics. */\nexport interface NexusProjectStats {\n /** Indexed node count. */\n nodeCount: number;\n /** Indexed relation (edge) count. */\n relationCount: number;\n /** Indexed file count. */\n fileCount: number;\n}\n\n/** Domain representation of a registered Nexus project. */\nexport interface NexusProjectRecord {\n /** Stable content hash for the project. */\n hash: string;\n /** Human-friendly project identifier (unique). */\n projectId: string;\n /** Absolute filesystem path. */\n path: string;\n /** Display name. */\n name: string;\n /** ISO 8601 registration timestamp. */\n registeredAt: string;\n /** ISO 8601 last-seen timestamp. */\n lastSeen: string;\n /** Current health status. */\n healthStatus: NexusHealthStatus;\n /** ISO 8601 timestamp of the last health check (nullable). */\n healthLastCheck: string | null;\n /** Permission level on this project. */\n permissions: NexusPermissionLevel;\n /** ISO 8601 timestamp of the last metadata sync. */\n lastSync: string;\n /** Total task count (projection). */\n taskCount: number;\n /** Project-level labels. */\n labels: string[];\n /** Absolute path to project's brain.db (nullable until populated). */\n brainDbPath: string | null;\n /** Absolute path to project's tasks.db (nullable until populated). */\n tasksDbPath: string | null;\n /** ISO 8601 timestamp of the last code-intelligence index run. */\n lastIndexed: string | null;\n /** Code intelligence stats from the last index run. */\n stats: NexusProjectStats;\n}\n\n/** A single cross-project task reference tuple. */\nexport interface NexusTaskRef {\n /** Task identifier (e.g. `T001`). */\n taskId: string;\n /** Project identifier this task belongs to. */\n project: string;\n}\n\n/** A dependency entry (upstream or downstream) from `nexus.deps`. */\nexport interface NexusDepsEntry {\n /** Canonical `project:taskId` string. */\n query: string;\n /** Project identifier. */\n project: string;\n /** Task status snapshot. */\n status: string;\n /** Optional task title (when resolvable). */\n title?: string;\n}\n\n/** A node in the global cross-project dependency graph. */\nexport interface NexusGraphNode {\n /** Node identifier (`project:taskId`). */\n id: string;\n /** Project this task belongs to. */\n project: string;\n /** Task status snapshot. */\n status: string;\n /** Task title. */\n title: string;\n}\n\n/** An edge in the global cross-project dependency graph. */\nexport interface NexusGraphEdge {\n /** Source node identifier. */\n from: string;\n /** Source project. */\n fromProject: string;\n /** Target node identifier. */\n to: string;\n /** Target project. */\n toProject: string;\n}\n\n/** An orphaned cross-project reference (unresolved). */\nexport interface NexusOrphanEntry {\n /** Source project holding the reference. */\n sourceProject: string;\n /** Source task id holding the reference. */\n sourceTask: string;\n /** Target project (unresolved). */\n targetProject: string;\n /** Target task id (unresolved). */\n targetTask: string;\n /** Why this entry is orphaned. */\n reason: 'project_not_registered' | 'task_not_found';\n}\n\n/** A single discover result from `nexus.discover`. */\nexport interface NexusDiscoverHit {\n /** Project containing the match. */\n project: string;\n /** Matched task id. */\n taskId: string;\n /** Task title. */\n title: string;\n /** Similarity score [0..1]. */\n score: number;\n /** Discovery method attribution (e.g. `keyword`, `semantic`). */\n type: string;\n /** Rationale string shown to humans. */\n reason: string;\n}\n\n/** A single search hit from `nexus.search`. */\nexport interface NexusSearchHit {\n /** Task id. */\n id: string;\n /** Task title. */\n title: string;\n /** Task status. */\n status: string;\n /** Task priority (when set). */\n priority?: string;\n /** Task description (may be truncated). */\n description?: string;\n /** Project identifier. */\n _project: string;\n}\n\n/** A single entry in the cross-project transfer manifest. */\nexport interface NexusTransferManifestEntry {\n /** Source task id. */\n sourceId: string;\n /** Target task id (post-transfer). */\n targetId: string;\n /** Task title. */\n title: string;\n /** Task type (task/epic/milestone/...). */\n type: string;\n}\n\n/** Transfer manifest describing what was (or would be) transferred. */\nexport interface NexusTransferManifest {\n /** Source project name. */\n sourceProject: string;\n /** Target project name. */\n targetProject: string;\n /** Transfer mode applied. */\n mode: NexusTransferMode;\n /** Transfer scope applied. */\n scope: NexusTransferScope;\n /** Tasks included in the manifest. */\n entries: NexusTransferManifestEntry[];\n /** Source id \u2192 target id remap table. */\n idRemap: Record<string, string>;\n /** Count of brain observations carried over. */\n brainObservationsTransferred: number;\n}\n\n/** Sharing status for the current project (multi-contributor mode). */\nexport interface NexusSharingStatus {\n /** Sharing mode identifier. */\n mode: string;\n /** Allow-list patterns. */\n allowlist: string[];\n /** Deny-list patterns. */\n denylist: string[];\n /** Tracked files (currently committed). */\n tracked: string[];\n /** Ignored files (excluded by config). */\n ignored: string[];\n /** Whether `.cleo/.git` is initialized. */\n hasGit: boolean;\n /** Configured git remote names. */\n remotes: string[];\n /** Whether the `.cleo/.git` worktree has uncommitted changes. */\n pendingChanges: boolean;\n /** ISO 8601 timestamp of last push/pull, or null. */\n lastSync: string | null;\n}\n\n// ============================================================================\n// Query Operations\n// ============================================================================\n\n// --------------------------------------------------------------------------\n// nexus.status \u2192 registry health\n// --------------------------------------------------------------------------\n\n/** Parameters for `nexus.status` \u2014 none. */\nexport type NexusStatusParams = Record<string, never>;\n/** Result of `nexus.status`. */\nexport interface NexusStatusResult {\n /** True when nexus.db has been initialised. */\n initialized: boolean;\n /** Count of registered projects. */\n projectCount: number;\n /** ISO 8601 timestamp of last registry update, or null. */\n lastUpdated: string | null;\n}\n\n// --------------------------------------------------------------------------\n// nexus.list \u2192 all registered projects (paginated)\n// --------------------------------------------------------------------------\n\n/** Parameters for `nexus.list`. */\nexport interface NexusListParams {\n /** Max results per page. */\n limit?: number;\n /** Offset into the result set. */\n offset?: number;\n}\n/** Result of `nexus.list`. */\nexport interface NexusListResult {\n /** Projects on this page. */\n projects: NexusProjectRecord[];\n /** Count of items on this page. */\n count: number;\n /** Total registered projects. */\n total: number;\n /** Filtered count (post-limit). */\n filtered: number;\n /** Pagination descriptor. */\n page: LAFSPage;\n}\n\n// --------------------------------------------------------------------------\n// nexus.show \u2192 single project lookup by name or hash\n// --------------------------------------------------------------------------\n\n/** Parameters for `nexus.show`. */\nexport interface NexusShowParams {\n /** Project name or hash (required). */\n name: string;\n}\n/** Result of `nexus.show`. */\nexport type NexusShowResult = NexusProjectRecord;\n\n// --------------------------------------------------------------------------\n// nexus.resolve \u2192 resolve `project:taskId` reference\n// --------------------------------------------------------------------------\n\n/** Parameters for `nexus.resolve`. */\nexport interface NexusResolveParams {\n /** Cross-project reference (e.g. `my-app:T001`, `.:T001`, `*:T001`). */\n query: string;\n /** Current project name (used for `.` and bare id resolution). */\n currentProject?: string;\n}\n/** Result of `nexus.resolve`. */\nexport interface NexusResolveResult {\n /** Parsed query descriptor. */\n parsed: {\n /** Project identifier. */\n project: string;\n /** Task id. */\n taskId: string;\n /** True when the query was `*:...`. */\n wildcard: boolean;\n };\n /** Resolved task records (one per matching project for wildcards). */\n resolved: Array<{\n /** Fully-qualified identifier. */\n id: string;\n /** Project the task belongs to. */\n project: string;\n /** Task title. */\n title: string;\n /** Task status. */\n status: string;\n }>;\n}\n\n// --------------------------------------------------------------------------\n// nexus.deps \u2192 cross-project dependency analysis\n// --------------------------------------------------------------------------\n\n/** Parameters for `nexus.deps`. */\nexport interface NexusDepsParams {\n /** Cross-project reference (required). */\n query: string;\n /** Direction to walk (default `forward`). */\n direction?: 'forward' | 'reverse';\n}\n/** Result of `nexus.deps`. */\nexport interface NexusDepsResult {\n /** Task id queried. */\n task: string;\n /** Project of the queried task. */\n project: string;\n /** Upstream deps (things this task depends on). */\n depends: NexusDepsEntry[];\n /** Downstream deps (things that depend on this task). */\n blocking: NexusDepsEntry[];\n}\n\n// --------------------------------------------------------------------------\n// nexus.graph \u2192 full cross-project graph\n// --------------------------------------------------------------------------\n\n/** Parameters for `nexus.graph` \u2014 none. */\nexport type NexusGraphParams = Record<string, never>;\n/** Result of `nexus.graph`. */\nexport interface NexusGraphResult {\n /** All nodes in the graph. */\n nodes: NexusGraphNode[];\n /** All edges in the graph. */\n edges: NexusGraphEdge[];\n}\n\n// --------------------------------------------------------------------------\n// nexus.path.show \u2192 critical path across projects\n// --------------------------------------------------------------------------\n\n/** Parameters for `nexus.path.show` \u2014 none. */\nexport type NexusPathShowParams = Record<string, never>;\n/** Result of `nexus.path.show`. */\nexport interface NexusPathShowResult {\n /** Ordered path entries (upstream \u2192 downstream). */\n criticalPath: Array<{ query: string; title: string }>;\n /** Length of the critical path. */\n length: number;\n /** The root blocker id that seeded the path. */\n blockedBy: string;\n}\n\n// --------------------------------------------------------------------------\n// nexus.blockers.show \u2192 blocking impact for a task query\n// --------------------------------------------------------------------------\n\n/** Parameters for `nexus.blockers.show`. */\nexport interface NexusBlockersShowParams {\n /** Cross-project reference (required). */\n query: string;\n}\n/** Result of `nexus.blockers.show`. */\nexport interface NexusBlockersShowResult {\n /** Task id queried. */\n task: string;\n /** Tasks this one is blocking. */\n blocking: Array<{ query: string; project: string }>;\n /** Aggregate impact score. */\n impactScore: number;\n}\n\n// --------------------------------------------------------------------------\n// nexus.orphans.list \u2192 list orphaned cross-project references\n// --------------------------------------------------------------------------\n\n/** Parameters for `nexus.orphans.list`. */\nexport interface NexusOrphansListParams {\n /** Max results per page. */\n limit?: number;\n /** Offset into the result set. */\n offset?: number;\n}\n/** Result of `nexus.orphans.list`. */\nexport interface NexusOrphansListResult {\n /** Orphan entries on this page. */\n orphans: NexusOrphanEntry[];\n /** Count on this page. */\n count: number;\n /** Total orphan count. */\n total: number;\n /** Filtered count. */\n filtered: number;\n /** Pagination descriptor. */\n page: LAFSPage;\n}\n\n// --------------------------------------------------------------------------\n// nexus.discover \u2192 discover related tasks across projects\n// --------------------------------------------------------------------------\n\n/** Parameters for `nexus.discover`. */\nexport interface NexusDiscoverParams {\n /** Free-text query (required). */\n query: string;\n /** Discovery method (`auto`, `keyword`, `semantic`, ...). Default `auto`. */\n method?: string;\n /** Max results (default 10). */\n limit?: number;\n}\n/** Result of `nexus.discover`. */\nexport interface NexusDiscoverResult {\n /** Query that was executed. */\n query: string;\n /** Method that was selected. */\n method: string;\n /** Ranked matches. */\n results: NexusDiscoverHit[];\n /** Total match count. */\n total: number;\n}\n\n// --------------------------------------------------------------------------\n// nexus.search \u2192 pattern search across projects\n// --------------------------------------------------------------------------\n\n/** Parameters for `nexus.search`. */\nexport interface NexusSearchParams {\n /** Search pattern (required). */\n pattern: string;\n /** Optional project name/hash filter. */\n project?: string;\n /** Max results (default 20). */\n limit?: number;\n}\n/** Result of `nexus.search`. */\nexport interface NexusSearchResult {\n /** Pattern that was searched. */\n pattern: string;\n /** Matching tasks. */\n results: NexusSearchHit[];\n /** Count of matches. */\n resultCount: number;\n}\n\n// --------------------------------------------------------------------------\n// nexus.share.status \u2192 multi-contributor sharing status\n// --------------------------------------------------------------------------\n\n/** Parameters for `nexus.share.status` \u2014 none. */\nexport type NexusShareStatusParams = Record<string, never>;\n/** Result of `nexus.share.status`. */\nexport type NexusShareStatusResult = NexusSharingStatus;\n\n// --------------------------------------------------------------------------\n// nexus.transfer.preview \u2192 dry-run of a cross-project transfer\n// --------------------------------------------------------------------------\n\n/** Parameters for `nexus.transfer.preview`. */\nexport interface NexusTransferPreviewParams {\n /** Task IDs to transfer (required, non-empty). */\n taskIds: string[];\n /** Source project name or hash (required). */\n sourceProject: string;\n /** Target project name or hash (required). */\n targetProject: string;\n /** Transfer mode (default `copy`). */\n mode?: NexusTransferMode;\n /** Transfer scope (default `subtree`). */\n scope?: NexusTransferScope;\n /** Conflict resolution strategy. */\n onConflict?: NexusTransferOnConflict;\n /** Missing-dependency strategy. */\n onMissingDep?: NexusTransferOnMissingDep;\n /** Carry over brain observations linked to transferred tasks. */\n transferBrain?: boolean;\n /** Override parent id in target project. */\n targetParent?: string;\n}\n/** Result of `nexus.transfer.preview`. */\nexport interface NexusTransferPreviewResult {\n /** Always `true` for preview (dry-run). */\n dryRun: true;\n /** Tasks that would be transferred. */\n transferred: number;\n /** Tasks that would be skipped (by conflict rule). */\n skipped: number;\n /** Source tasks that would be archived (move mode). */\n archived: number;\n /** Cross-project link count that would be created. */\n linksCreated: number;\n /** Count of brain observations that would be transferred. */\n brainObservationsTransferred: number;\n /** Manifest for inspection. */\n manifest: NexusTransferManifest;\n}\n\n// ============================================================================\n// Mutate Operations\n// ============================================================================\n\n// --------------------------------------------------------------------------\n// nexus.init \u2192 initialise the global registry\n// --------------------------------------------------------------------------\n\n/** Parameters for `nexus.init` \u2014 none. */\nexport type NexusInitParams = Record<string, never>;\n/** Result of `nexus.init`. */\nexport interface NexusInitResult {\n /** Human-readable status line. */\n message: string;\n}\n\n// --------------------------------------------------------------------------\n// nexus.register \u2192 add a project to the registry\n// --------------------------------------------------------------------------\n\n/** Parameters for `nexus.register`. */\nexport interface NexusRegisterParams {\n /** Absolute project path (required). */\n path: string;\n /** Optional explicit name (defaults to directory basename). */\n name?: string;\n /** Permission level to grant (default `read`). */\n permission?: NexusPermissionLevel;\n}\n/** Result of `nexus.register`. */\nexport interface NexusRegisterResult {\n /** Generated project hash. */\n hash: string;\n /** Human-readable status line. */\n message: string;\n}\n\n// --------------------------------------------------------------------------\n// nexus.unregister \u2192 remove a project from the registry\n// --------------------------------------------------------------------------\n\n/** Parameters for `nexus.unregister`. */\nexport interface NexusUnregisterParams {\n /** Project name or hash (required). */\n name: string;\n}\n/** Result of `nexus.unregister`. */\nexport interface NexusUnregisterResult {\n /** Human-readable status line. */\n message: string;\n}\n\n// --------------------------------------------------------------------------\n// nexus.sync \u2192 resync a project (or all projects)\n// --------------------------------------------------------------------------\n\n/** Parameters for `nexus.sync`. */\nexport interface NexusSyncParams {\n /** Project name to sync. Omit to sync all. */\n name?: string;\n}\n/** Result of `nexus.sync`. */\nexport interface NexusSyncResult {\n /** Human-readable status line. */\n message: string;\n /** Projects actually synced (populated when `name` omitted). */\n synced?: string[];\n}\n\n// --------------------------------------------------------------------------\n// nexus.permission.set \u2192 update project permission level\n// --------------------------------------------------------------------------\n\n/** Parameters for `nexus.permission.set`. */\nexport interface NexusPermissionSetParams {\n /** Project name (required). */\n name: string;\n /** New permission level (required; read|write|execute). */\n level: NexusPermissionLevel;\n}\n/** Result of `nexus.permission.set`. */\nexport interface NexusPermissionSetResult {\n /** Human-readable status line. */\n message: string;\n}\n\n// --------------------------------------------------------------------------\n// nexus.reconcile \u2192 reconcile project identity with global registry\n// --------------------------------------------------------------------------\n\n/** Parameters for `nexus.reconcile`. */\nexport interface NexusReconcileParams {\n /** Override project root (defaults to cwd). */\n projectRoot?: string;\n}\n/** Result of `nexus.reconcile`. */\nexport interface NexusReconcileResult {\n /** Whether the registry entry was created or updated. */\n changed: boolean;\n /** The reconciled hash. */\n hash: string;\n /** Project identifier. */\n projectId: string;\n /** Human-readable status line. */\n message: string;\n}\n\n// --------------------------------------------------------------------------\n// nexus.share.snapshot.export \u2192 export .cleo state snapshot\n// --------------------------------------------------------------------------\n\n/** Parameters for `nexus.share.snapshot.export`. */\nexport interface NexusShareSnapshotExportParams {\n /** Override output path (defaults to .cleo/snapshots/...). */\n outputPath?: string;\n}\n/** Result of `nexus.share.snapshot.export`. */\nexport interface NexusShareSnapshotExportResult {\n /** Final output path written. */\n path: string;\n /** Tasks included in the snapshot. */\n taskCount: number;\n /** SHA-256 checksum of the snapshot payload. */\n checksum: string;\n}\n\n// --------------------------------------------------------------------------\n// nexus.share.snapshot.import \u2192 import .cleo state snapshot\n// --------------------------------------------------------------------------\n\n/** Parameters for `nexus.share.snapshot.import`. */\nexport interface NexusShareSnapshotImportParams {\n /** Input snapshot file path (required). */\n inputPath: string;\n}\n/** Result of `nexus.share.snapshot.import`. */\nexport interface NexusShareSnapshotImportResult {\n /** Tasks written to the local store. */\n imported: number;\n /** Tasks skipped (duplicates, etc.). */\n skipped: number;\n /** Source id \u2192 target id remap table. */\n idRemap: Record<string, string>;\n}\n\n// --------------------------------------------------------------------------\n// nexus.transfer \u2192 execute a cross-project transfer\n// --------------------------------------------------------------------------\n\n/** Parameters for `nexus.transfer`. */\nexport interface NexusTransferParams {\n /** Task IDs to transfer (required, non-empty). */\n taskIds: string[];\n /** Source project name or hash (required). */\n sourceProject: string;\n /** Target project name or hash (required). */\n targetProject: string;\n /** Transfer mode (default `copy`). */\n mode?: NexusTransferMode;\n /** Transfer scope (default `subtree`). */\n scope?: NexusTransferScope;\n /** Conflict resolution strategy (default `rename`). */\n onConflict?: NexusTransferOnConflict;\n /** Missing-dependency strategy. */\n onMissingDep?: NexusTransferOnMissingDep;\n /** Carry over brain observations linked to transferred tasks (default false). */\n transferBrain?: boolean;\n /** Override parent id in target project. */\n targetParent?: string;\n /** Attach provenance notes to transferred tasks. */\n provenance?: boolean;\n}\n/** Result of `nexus.transfer`. */\nexport interface NexusTransferResult {\n /** Always `false` for execute (as opposed to `nexus.transfer.preview`). */\n dryRun: false;\n /** Tasks actually transferred. */\n transferred: number;\n /** Tasks skipped by conflict rule. */\n skipped: number;\n /** Source tasks archived (move mode). */\n archived: number;\n /** Cross-project links created. */\n linksCreated: number;\n /** Brain observations transferred. */\n brainObservationsTransferred: number;\n /** Manifest describing what was moved. */\n manifest: NexusTransferManifest;\n}\n", "/**\n * Orchestrate Domain Operations (13 operations)\n *\n * Query operations: 7\n * Mutate operations: 6\n *\n * SYNC: Canonical implementations at\n * packages/cleo/src/dispatch/engines/orchestrate-engine.ts\n * packages/core/src/orchestration/*.ts\n *\n * @task T963 \u2014 contract\u2194impl drift reconciliation (T910 audit)\n */\n\n/**\n * Common orchestration types\n */\nexport interface Wave {\n /** 1-based wave number. @task T963 */\n wave: number;\n /** Task IDs scheduled in this wave. @task T963 */\n taskIds: string[];\n /** True when every task in the wave can run in parallel. @task T963 */\n canRunParallel: boolean;\n /** Upstream wave/task dependencies. @task T963 */\n dependencies: string[];\n}\n\nexport interface SkillDefinition {\n /** Skill name. @task T963 */\n name: string;\n /** Skill description. @task T963 */\n description: string;\n /** Skill tags. @task T963 */\n tags: string[];\n /** Preferred model. @task T963 */\n model?: string;\n /** Supported protocol phases. @task T963 */\n protocols: string[];\n}\n\n/**\n * Query Operations\n */\n\n// orchestrate.status\n/**\n * Parameters for `orchestrate.status`.\n *\n * @remarks\n * Re-synced to match `orchestrateStatus(epicId?, projectRoot?)` in\n * `packages/cleo/src/dispatch/engines/orchestrate-engine.ts`. When `epicId`\n * is omitted, the engine returns an overall status envelope across all\n * tasks in the project.\n *\n * @task T963 \u2014 contract\u2194impl drift reconciliation (T910 audit)\n */\nexport interface OrchestrateStatusParams {\n /** Epic to scope the status to. Omit for project-wide status. @task T963 */\n epicId?: string;\n}\n/** Per-status task counts. @task T963 */\nexport interface OrchestrateStatusCounts {\n /** Pending tasks. @task T963 */\n pending: number;\n /** Active tasks. @task T963 */\n active: number;\n /** Blocked tasks. @task T963 */\n blocked: number;\n /** Completed tasks. @task T963 */\n done: number;\n /** Cancelled tasks (epic scope only). @task T963 */\n cancelled?: number;\n}\n/**\n * Epic-scoped status (returned when `epicId` is supplied). Mirrors\n * `EpicStatus` in `packages/core/src/orchestration/status.ts`.\n * @task T963\n */\nexport interface OrchestrateEpicStatus {\n /** Epic task id. @task T963 */\n epicId: string;\n /** Epic title. @task T963 */\n epicTitle: string;\n /** Count of direct children. @task T963 */\n totalTasks: number;\n /** Per-status breakdown of the children. @task T963 */\n byStatus: OrchestrateStatusCounts;\n /** Total wave count computed for the epic. @task T963 */\n waves: number;\n /** First non-completed wave number, or `null` when all waves done. @task T963 */\n currentWave: number | null;\n}\n/**\n * Project-wide status (returned when `epicId` is omitted). Mirrors\n * `OverallStatus` in `packages/core/src/orchestration/status.ts`.\n * @task T963\n */\nexport interface OrchestrateOverallStatus {\n /** Count of detected root epics. @task T963 */\n totalEpics: number;\n /** Total tasks in the project. @task T963 */\n totalTasks: number;\n /** Per-status breakdown of the project. @task T963 */\n byStatus: OrchestrateStatusCounts;\n}\n/** Result of `orchestrate.status` \u2014 union of epic-scoped and overall. @task T963 */\nexport type OrchestrateStatusResult = OrchestrateEpicStatus | OrchestrateOverallStatus;\n\n// orchestrate.next\n/** Parameters for `orchestrate.next`. @task T963 */\nexport interface OrchestrateNextParams {\n /** Epic to pull the next task from (required). @task T963 */\n epicId: string;\n}\n/**\n * Result of `orchestrate.next`.\n *\n * @remarks\n * Re-synced to match `orchestrateNext(epicId, projectRoot?)` in the engine.\n * The legacy `{taskId, title, recommendedSkill, reasoning}` shape was never\n * implemented \u2014 the engine returns a `nextTask | null` + alternatives\n * envelope.\n *\n * @task T963 \u2014 contract\u2194impl drift reconciliation (T910 audit)\n */\nexport interface OrchestrateNextResult {\n /** Epic id that was queried. @task T963 */\n epicId: string;\n /** Next task to work on, or `null` when nothing ready. @task T963 */\n nextTask: {\n /** Task id. @task T963 */\n id: string;\n /** Task title. @task T963 */\n title: string;\n /** Priority rollup from the engine. @task T963 */\n priority: string;\n } | null;\n /** Other ready alternatives (up to 3). Absent when `nextTask` is null. @task T963 */\n alternatives?: Array<{ id: string; title: string; priority: string }>;\n /** Total ready tasks for the epic. Absent when `nextTask` is null. @task T963 */\n totalReady?: number;\n /** Human-readable hint when nothing is ready. @task T963 */\n message?: string;\n}\n\n// orchestrate.ready\n/** Parameters for `orchestrate.ready`. @task T963 */\nexport interface OrchestrateReadyParams {\n /** Epic to compute the ready set for (required). @task T963 */\n epicId: string;\n}\n/**\n * A single ready-task descriptor as returned by `orchestrate.ready`.\n * @task T963\n */\nexport interface OrchestrateReadyTask {\n /** Task id. @task T963 */\n id: string;\n /** Task title. @task T963 */\n title: string;\n /** Engine-rolled priority. @task T963 */\n priority: string;\n /** IDs of tasks this one depends on (blocker/depends chain). @task T963 */\n depends: string[];\n}\n/**\n * Result of `orchestrate.ready`.\n *\n * @remarks\n * Re-synced to match `orchestrateReady(epicId, projectRoot?)`. Returns\n * the filtered ready set from `getReadyTasks` + a diagnostic `reason`\n * when empty.\n *\n * @task T963 \u2014 contract\u2194impl drift reconciliation (T910 audit)\n */\nexport interface OrchestrateReadyResult {\n /** Epic id that was queried. @task T963 */\n epicId: string;\n /** Ready task set (filtered to `ready === true`). @task T963 */\n readyTasks: OrchestrateReadyTask[];\n /** Count of ready tasks (may be zero). @task T963 */\n total: number;\n /** Diagnostic reason populated when `total === 0`. @task T963 */\n reason?: string;\n}\n\n// orchestrate.analyze\n/**\n * Parameters for `orchestrate.analyze`.\n *\n * @remarks\n * Re-synced: engine signature is\n * `orchestrateAnalyze(epicId?, projectRoot?, mode?)`. Mode\n * `critical-path` delegates to `orchestrateCriticalPath` \u2014 callers may\n * branch on `mode` at the dispatch layer.\n *\n * @task T963 \u2014 contract\u2194impl drift reconciliation (T910 audit)\n */\nexport interface OrchestrateAnalyzeParams {\n /**\n * Epic to analyze. Required for standard mode; optional for\n * `mode: 'critical-path'` which operates across the whole project.\n * @task T963\n */\n epicId?: string;\n /** Analysis mode \u2014 `undefined` | `'critical-path'`. @task T963 */\n mode?: 'critical-path';\n}\n/**\n * Result of `orchestrate.analyze` (standard mode).\n *\n * @remarks\n * Returns the wave plan + dependency diagnostics from\n * `analyzeEpic` + `analyzeDependencies`.\n *\n * @task T963 \u2014 contract\u2194impl drift reconciliation (T910 audit)\n */\nexport interface OrchestrateAnalyzeResult {\n /** Epic task id that was analyzed. @task T963 */\n epicId: string;\n /** Epic title (falls back to `epicId` when title unresolvable). @task T963 */\n epicTitle: string;\n /** Count of direct children. @task T963 */\n totalTasks: number;\n /** Computed wave plan. @task T963 */\n waves: Wave[];\n /** Detected circular dependency chains. @task T963 */\n circularDependencies: string[][];\n /** Dependencies that point at nonexistent task ids. @task T963 */\n missingDependencies: string[];\n /**\n * Adjacency-list dependency graph (taskId \u2192 depends-on ids).\n * @task T963\n */\n dependencyGraph: Record<string, string[]>;\n}\n\n// orchestrate.context\n/**\n * Parameters for `orchestrate.context`.\n *\n * @remarks\n * Re-synced to match `orchestrateContext(epicId?, projectRoot?)` in the\n * engine. The legacy `tokens` field was unused; the real parameter is\n * an optional `epicId` that scopes the task-count basis of the estimate.\n *\n * @task T963 \u2014 contract\u2194impl drift reconciliation (T910 audit)\n */\nexport interface OrchestrateContextParams {\n /** Epic id to scope the context estimate. Omit for project-wide. @task T963 */\n epicId?: string;\n}\n/**\n * Result of `orchestrate.context`.\n *\n * @remarks\n * Mirrors `ContextEstimation` in `packages/core/src/orchestration/context.ts`.\n *\n * @task T963 \u2014 contract\u2194impl drift reconciliation (T910 audit)\n */\nexport interface OrchestrateContextResult {\n /** Epic id the estimate was scoped to, or `null` for project-wide. @task T963 */\n epicId: string | null;\n /** Count of tasks included in the estimate. @task T963 */\n taskCount: number;\n /** Count of MANIFEST.jsonl entries. @task T963 */\n manifestEntries: number;\n /** Rough estimated token count (taskCount * per-task weight). @task T963 */\n estimatedTokens: number;\n /** Human-readable recommendation. @task T963 */\n recommendation: string;\n /** Context budget limits + current usage. @task T963 */\n limits: {\n /** Maximum orchestrator context budget. @task T963 */\n orchestratorBudget: number;\n /** Max files a single agent should read. @task T963 */\n maxFilesPerAgent: number;\n /** Current token usage (mirrors `estimatedTokens`). @task T963 */\n currentUsage: number;\n };\n}\n\n// orchestrate.waves\n/** Parameters for `orchestrate.waves`. @task T963 */\nexport interface OrchestrateWavesParams {\n /** Epic to compute waves for. @task T963 */\n epicId: string;\n}\nexport type OrchestrateWavesResult = Wave[];\n\n// orchestrate.skill.list\n/** Parameters for `orchestrate.skill.list`. @task T963 */\nexport interface OrchestrateSkillListParams {\n /** Free-text filter across skill name/tags. @task T963 */\n filter?: string;\n}\nexport type OrchestrateSkillListResult = SkillDefinition[];\n\n// orchestrate.bootstrap\n/** Parameters for `orchestrate.bootstrap`. @task T963 */\nexport interface OrchestrateBootstrapParams {\n /** Bootstrap verbosity mode. @task T963 */\n speed?: 'fast' | 'full' | 'complete';\n}\nexport interface BrainState {\n /** Currently active session summary. @task T963 */\n session?: { id: string; name: string; status: string; startedAt: string };\n /** Current task context. @task T963 */\n currentTask?: { id: string; title: string; status: string };\n /** Suggested next task with score. @task T963 */\n nextSuggestion?: { id: string; title: string; score: number };\n /** Recent decisions for the brain-state rollup. @task T963 */\n recentDecisions?: Array<{ id: string; decision: string; timestamp: string }>;\n /** Blockers currently affecting progress. @task T963 */\n blockers?: Array<{ taskId: string; title: string; blockedBy: string[] }>;\n /** Progress rollup. @task T963 */\n progress?: { total: number; done: number; active: number; blocked: number; pending: number };\n /** Context drift score + contributing factors. @task T963 */\n contextDrift?: { score: number; factors: string[] };\n /** Bootstrap envelope metadata. @task T963 */\n _meta: { speed: 'fast' | 'full' | 'complete'; generatedAt: string; version: string };\n}\n\n/**\n * Mutate Operations\n */\n\n// orchestrate.startup\n/** Parameters for `orchestrate.startup`. @task T963 */\nexport interface OrchestrateStartupParams {\n /** Epic id to initialize. @task T963 */\n epicId: string;\n}\n/**\n * Result of `orchestrate.startup`.\n *\n * @remarks\n * Re-synced to match `orchestrateStartup(epicId, projectRoot?)` + the\n * `computeStartupSummary` output + auto-init fields. The legacy shape\n * assumed nested status/analysis/firstTask envelopes; the engine actually\n * returns a flat summary + auto-init metadata.\n *\n * @task T963 \u2014 contract\u2194impl drift reconciliation (T910 audit)\n */\nexport interface OrchestrateStartupResult {\n /** Epic id that was initialized. @task T963 */\n epicId: string;\n /** Epic title. @task T963 */\n epicTitle: string;\n /** Always true once startup reaches return \u2014 pipeline + research stage recorded. @task T963 */\n initialized: true;\n /** Summary rollup of the epic's children. @task T963 */\n summary: {\n /** Total child count. @task T963 */\n totalTasks: number;\n /** Wave count. @task T963 */\n totalWaves: number;\n /** Count of tasks ready to spawn. @task T963 */\n readyTasks: number;\n /** Per-status breakdown. @task T963 */\n byStatus: OrchestrateStatusCounts;\n };\n /** First wave payload, or `null` when epic has no children. @task T963 */\n firstWave: Wave | null;\n /**\n * True when this startup call auto-initialized the lifecycle to the\n * `research` stage. False when the epic already had a pipeline.\n * @task T963\n */\n autoInitialized: boolean;\n /**\n * Current pipeline stage after startup \u2014 `research` when auto-initialized,\n * `already-initialized` marker string otherwise.\n * @task T963\n */\n currentStage: string;\n}\n\n// orchestrate.spawn\n/**\n * Parameters for `orchestrate.spawn` (T882 canonical spawn contract).\n *\n * @remarks\n * Re-synced to match `orchestrateSpawn(taskId, protocolType, projectRoot, tier)`\n * in `packages/cleo/src/dispatch/engines/orchestrate-engine.ts`. The legacy\n * `{skill, model}` fields from earlier drafts were never implemented \u2014 the\n * T882 rebuild (v2026.4.85) introduced `protocolType` + `tier` as the\n * authoritative inputs.\n *\n * @task T963 \u2014 contract\u2194impl drift reconciliation (T910 audit)\n * @task T882 \u2014 canonical spawn-prompt rebuild\n */\nexport interface OrchestrateSpawnParams {\n /** Task ID to spawn a worker for (required). @task T963 */\n taskId: string;\n /**\n * Protocol phase dispatched to the worker (e.g. `'research'`,\n * `'implementation'`, `'validation'`). When omitted, the composer runs\n * `autoDispatch` to classify the task.\n * @task T963\n */\n protocolType?: string;\n /**\n * Spawn prompt tier per T882 (0=minimal, 1=standard with CLEO-INJECTION\n * embed, 2=full with skill excerpts + SUBAGENT-PROTOCOL-BLOCK). When\n * omitted, resolved from the agent role (orchestrator=2, lead=1, worker=0).\n * @task T963\n */\n tier?: 0 | 1 | 2;\n}\n/**\n * Result of `orchestrate.spawn`.\n *\n * @remarks\n * Re-synced to match the T932 `composeSpawnForTask` payload envelope returned\n * by the orchestrate engine (prompt + atomicity verdict + traceability meta).\n * Mirrors `SpawnPayload` in `packages/core/src/orchestration/spawn.ts`.\n *\n * @task T963 \u2014 contract\u2194impl drift reconciliation (T910 audit)\n */\nexport interface OrchestrateSpawnResult {\n /** Task ID the spawn is about (mirrors `task.id`). @task T963 */\n taskId: string;\n /**\n * Fully-resolved spawn prompt, copy-pastable into any LLM runtime\n * (Claude, GPT-4, Gemini, open-source). Primary payload every caller\n * should consume.\n * @task T963\n */\n prompt: string;\n /** Agent id the spawn is routed to. @task T963 */\n agentId: string;\n /** Role the agent will execute as (`orchestrator` | `lead` | `worker`). @task T963 */\n role: string;\n /** Tier of the rendered prompt (0/1/2). @task T963 */\n tier: 0 | 1 | 2;\n /** Harness hint driving dedup decisions (`claude-code` | `generic` | `bare`). @task T963 */\n harnessHint: string;\n /**\n * Atomicity gate verdict from the worker file-scope guard. When\n * `allowed=false`, the spawn was rejected and the orchestrate engine\n * surfaces an `E_ATOMICITY_VIOLATION` error envelope.\n * @task T963\n */\n atomicity: {\n /** Whether the spawn is permitted. @task T963 */\n allowed: boolean;\n /** Error code when the spawn was rejected. @task T963 */\n code?: string;\n /** Diagnostic message. @task T963 */\n message?: string;\n /** Fix hint for the violation. @task T963 */\n fixHint?: string;\n };\n /**\n * Traceability / accounting metadata. Mirrors `SpawnPayloadMeta` \u2014\n * pinned `composerVersion: '3.0.0'` on every call.\n * @task T963\n */\n meta: {\n /** Tier the resolved agent was sourced from. @task T963 */\n sourceTier: string;\n /** Characters saved by skipping the tier-1 CLEO-INJECTION embed. @task T963 */\n dedupSavedChars: number;\n /** Character length of the final prompt. @task T963 */\n promptChars: number;\n /** Protocol phase the prompt was rendered for. @task T963 */\n protocol: string;\n /** ISO 8601 timestamp when the payload was generated. @task T963 */\n generatedAt: string;\n /** Pinned composer contract version. @task T963 */\n composerVersion: '3.0.0';\n };\n /**\n * Mirror of `meta.protocol` at the top level for legacy callers. Equals\n * the resolved protocol phase (from `protocolType` param or auto-dispatch).\n * @task T963\n */\n protocolType: string;\n /**\n * Active session id threaded into the prompt, or `null` when the\n * orchestrator had no active session at spawn time.\n * @task T963\n */\n sessionId: string | null;\n /**\n * Legacy mirror of the prompt/protocolType/tier bundle for readers that\n * still consume `spawnContext.*`.\n * @task T963\n */\n spawnContext: {\n /** Task id mirrored from top level. @task T963 */\n taskId: string;\n /** Protocol string from the composer. @task T963 */\n protocol: string;\n /** Resolved protocol type. @task T963 */\n protocolType: string;\n /** Tier mirror. @task T963 */\n tier: 0 | 1 | 2;\n /** Prompt mirror. @task T963 */\n prompt: string;\n };\n}\n\n// orchestrate.handoff\n/** Parameters for `orchestrate.handoff`. @task T963 */\nexport interface OrchestrateHandoffParams {\n /** Task id to hand off to. @task T963 */\n taskId: string;\n /** Protocol phase for the successor spawn. @task T963 */\n protocolType: string;\n /** Free-form session-end note. @task T963 */\n note?: string;\n /** Next-action hint for the successor. @task T963 */\n nextAction?: string;\n /** Context injection variant (skill preset). @task T963 */\n variant?: string;\n /** Tier override for the spawn prompt. @task T963 */\n tier?: 0 | 1 | 2;\n /** Client-supplied idempotency key for handoff retries. @task T963 */\n idempotencyKey?: string;\n}\n/** Result of `orchestrate.handoff`. @task T963 */\nexport interface OrchestrateHandoffResult {\n /** Task id that was handed off to. @task T963 */\n taskId: string;\n /** Session id that was active before handoff. @task T963 */\n predecessorSessionId: string;\n /** Session id that was ended. @task T963 */\n endedSessionId: string;\n /** Protocol type resolved for the successor. @task T963 */\n protocolType: string;\n}\n\n// orchestrate.validate\n/** Validation issue surfaced by `orchestrate.validate`. @task T963 */\nexport interface OrchestrateValidationIssue {\n /** Stable issue code (e.g. `V_NOT_FOUND`, `V_UNMET_DEP`, `V_MISSING_TITLE`). @task T963 */\n code: string;\n /** Human-readable diagnostic message. @task T963 */\n message: string;\n /** Issue severity (`error` | `warning` | `info`). @task T963 */\n severity: string;\n}\n/** Parameters for `orchestrate.validate`. @task T963 */\nexport interface OrchestrateValidateParams {\n /** Task id to validate. @task T963 */\n taskId: string;\n}\n/**\n * Result of `orchestrate.validate`.\n *\n * @remarks\n * Re-synced to match `validateSpawnReadiness` in\n * `packages/core/src/orchestration/validate-spawn.ts`. The legacy shape\n * (`{blockers, lifecycleGate, recommendations}`) never matched the engine;\n * the real output is a `{ready, issues}` envelope.\n *\n * @task T963 \u2014 contract\u2194impl drift reconciliation (T910 audit)\n */\nexport interface OrchestrateValidateResult {\n /** Task id that was validated. @task T963 */\n taskId: string;\n /** Task title snapshot. @task T963 */\n title: string;\n /** True when the task passed every readiness check. @task T963 */\n ready: boolean;\n /** Issues preventing spawn (empty array when `ready === true`). @task T963 */\n issues: OrchestrateValidationIssue[];\n}\n\n// orchestrate.parallel.start\n/** Parameters for `orchestrate.parallel.start`. @task T963 */\nexport interface OrchestrateParallelStartParams {\n /** Epic id. @task T963 */\n epicId: string;\n /** Wave number to launch. @task T963 */\n wave: number;\n}\n/** Result of `orchestrate.parallel.start`. @task T963 */\nexport interface OrchestrateParallelStartResult {\n /** Wave number launched. @task T963 */\n wave: number;\n /** Task IDs in the wave. @task T963 */\n taskIds: string[];\n /** ISO 8601 start timestamp. @task T963 */\n started: string;\n}\n\n// orchestrate.parallel.end\n/** Parameters for `orchestrate.parallel.end`. @task T963 */\nexport interface OrchestrateParallelEndParams {\n /** Epic id. @task T963 */\n epicId: string;\n /** Wave number that ended. @task T963 */\n wave: number;\n}\n/** Result of `orchestrate.parallel.end`. @task T963 */\nexport interface OrchestrateParallelEndResult {\n /** Wave number. @task T963 */\n wave: number;\n /** Tasks that completed successfully. @task T963 */\n completed: number;\n /** Tasks that failed. @task T963 */\n failed: number;\n /** Wave duration (ISO 8601 duration string). @task T963 */\n duration: string;\n}\n", "/**\n * ParamDef contract \u2014 canonical parameter descriptor for all CLEO operations.\n *\n * This module is the SINGLE SOURCE OF TRUTH for the `ParamDef` type.\n * All packages that describe operation parameters MUST import from here.\n *\n * @packageDocumentation\n * @module @cleocode/contracts/operations/params\n */\n\n// ---------------------------------------------------------------------------\n// Core types\n// ---------------------------------------------------------------------------\n\n/**\n * The concrete value types a parameter can carry at runtime.\n * Drives JSON Schema `type` and citty argument/option parsing.\n */\nexport type ParamType = 'string' | 'number' | 'boolean' | 'array';\n\n/**\n * CLI-specific decoration for a single parameter.\n *\n * Omit the entire `cli` key for parameters that have no CLI surface\n * (e.g. parameters only used internally by the dispatch engine).\n */\nexport interface ParamCliDef {\n /**\n * When `true`, the parameter is registered as a positional argument\n * (`<name>` or `[name]`) rather than a named option flag (`--name`).\n *\n * @default false\n */\n positional?: boolean;\n\n /**\n * Short single-character flag alias, e.g. `'-t'` for `--type`.\n * Only meaningful when `positional` is `false` or omitted.\n */\n short?: string;\n\n /**\n * Override the CLI flag name when it differs from the param `name`.\n * For example: `name: 'includeArchive'` but `flag: 'include-archive'`.\n * Defaults to the kebab-case form of `name`.\n */\n flag?: string;\n\n /**\n * For `array`-type params: when `true` the flag may be repeated on the CLI.\n * When `false` / omitted, the CLI accepts a single comma-separated string.\n *\n * @default false\n */\n variadic?: boolean;\n}\n\n/**\n * A fully-described parameter definition for a CLEO operation.\n *\n * One `ParamDef` entry drives:\n * - citty CLI: `.argument()` (positional) or `.option()` (named flag)\n * - JSON Schema generation for API clients\n * - Dispatch-layer validation against `requiredParams`\n */\nexport interface ParamDef {\n /**\n * Canonical camelCase parameter name.\n * Must match the key in the `params` dict sent to the dispatcher.\n */\n name: string;\n\n /** Runtime value type. Drives JSON Schema `type` and CLI parsing. */\n type: ParamType;\n\n /**\n * Whether this parameter must be present in every request.\n * Required parameters are also listed in `OperationDef.requiredParams`.\n */\n required: boolean;\n\n /** Human-readable description used in CLI help text and API docs. */\n description: string;\n\n /**\n * CLI-specific metadata.\n * Omit when the parameter is not exposed on the CLI surface.\n */\n cli?: ParamCliDef;\n\n /**\n * Allowed string values (JSON Schema `enum` constraint).\n * Use only for `string`-typed params with a finite set of valid values.\n */\n enum?: readonly string[];\n\n /**\n * When `true`, the parameter is excluded from JSON Schema generation.\n * Use for CLI-only params (e.g. `--dry-run`, `--offset`) that are not\n * part of the public API surface.\n *\n * @default false\n */\n hidden?: boolean;\n}\n\n/**\n * Ordered list of parameter definitions for a single operation.\n *\n * An empty array means \"no declared params\" \u2014 NOT \"no params accepted\".\n * Operations using `requiredParams: []` with no `params` key are legacy\n * entries that have not yet been migrated to the full `ParamDef` shape.\n */\nexport type OperationParams = ParamDef[];\n\n// ---------------------------------------------------------------------------\n// Citty integration\n// ---------------------------------------------------------------------------\n\n/**\n * Subset of citty's `ArgDef` used by the converter.\n * Only the fields that `ParamDef` can supply are included.\n */\nexport interface CittyArgDef {\n /** citty arg type ('boolean' | 'string' | 'enum' | 'positional') */\n type?: 'boolean' | 'string' | 'enum' | 'positional';\n /** Human-readable description shown in `--help` output */\n description?: string;\n /** Short flag alias (single character, without leading dash) */\n alias?: string;\n /** Whether the argument is required */\n required?: boolean;\n /** Allowed values for `enum`-typed args */\n options?: string[];\n}\n\n/**\n * Convert an array of `ParamDef` entries into a `Record<string, CittyArgDef>`\n * that can be passed directly to `defineCommand({ args: ... })`.\n *\n * Mapping rules:\n * - `type: 'boolean'` \u2192 citty `type: 'boolean'`\n * - `type: 'string'` \u2192 citty `type: 'string'`; `type: 'enum'` when `enum` is set\n * - `type: 'number'` \u2192 citty `type: 'string'` (caller must `parseInt`/`parseFloat`)\n * - `type: 'array'` \u2192 citty `type: 'string'` (caller handles splitting)\n * - `cli.positional` \u2192 citty `type: 'positional'`\n * - `cli.short` \u2192 citty `alias`\n * - `enum` \u2192 citty `options` with citty `type: 'enum'`\n *\n * @param params - The `ParamDef[]` from an `OperationDef`.\n * @returns A `Record<string, CittyArgDef>` ready for use as `args` in `defineCommand`.\n */\nexport function paramsToCittyArgs(params: OperationParams): Record<string, CittyArgDef> {\n const result: Record<string, CittyArgDef> = {};\n\n for (const param of params) {\n const argName = param.cli?.flag ?? param.name;\n const arg: CittyArgDef = {\n description: param.description,\n };\n\n if (param.cli?.positional === true) {\n arg.type = 'positional';\n arg.required = param.required;\n } else if (param.enum !== undefined && param.enum.length > 0) {\n arg.type = 'enum';\n arg.options = [...param.enum];\n if (param.required) arg.required = true;\n } else if (param.type === 'boolean') {\n arg.type = 'boolean';\n } else {\n // string, number, and array all map to citty 'string'\n // (number/array require caller-side parsing after arg extraction)\n arg.type = 'string';\n if (param.required) arg.required = true;\n }\n\n if (param.cli?.short !== undefined) {\n arg.alias = param.cli.short.replace(/^-/, '');\n }\n\n result[argName] = arg;\n }\n\n return result;\n}\n", "/**\n * Release Domain Operations (7 operations)\n *\n * All mutate operations\n */\n\n/**\n * Common release types\n */\nexport type ReleaseType = 'major' | 'minor' | 'patch';\n\nexport interface ReleaseGate {\n name: string;\n description: string;\n passed: boolean;\n reason?: string;\n}\n\nexport interface ChangelogSection {\n type: 'feat' | 'fix' | 'docs' | 'test' | 'refactor' | 'chore';\n entries: Array<{\n taskId: string;\n message: string;\n }>;\n}\n\n/**\n * Mutate Operations\n */\n\n// release.prepare\n/**\n * Parameters for `release.prepare`.\n *\n * @remarks\n * Re-synced to match `prepareRelease(version, tasks?, notes?)` in\n * `packages/core/src/release/release-manifest.ts`. The legacy `type` field\n * was never accepted by the engine \u2014 the release manifest persists the\n * version as-is after normalization. Task filtering happens via the\n * optional `tasks` array (defaults to all tasks with `status=done`).\n *\n * @task T963 \u2014 contract\u2194impl drift reconciliation (T910 audit)\n */\nexport interface ReleasePrepareParams {\n /** Version string (e.g. `YYYY.M.patch` or `X.Y.Z`). @task T963 */\n version: string;\n /**\n * Specific task IDs to bundle into the release. When omitted, all\n * completed tasks with `completedAt` are included.\n * @task T963\n */\n tasks?: string[];\n /** Free-form release notes persisted onto the manifest entry. @task T963 */\n notes?: string;\n}\n/** Result of `release.prepare`. @task T963 */\nexport interface ReleasePrepareResult {\n /** Normalized version string. @task T963 */\n version: string;\n /** Manifest status \u2014 always `'prepared'` on success. @task T963 */\n status: string;\n /** Task IDs committed to the manifest. @task T963 */\n tasks: string[];\n /** Count of tasks in the release. @task T963 */\n taskCount: number;\n}\n\n// release.changelog\n/** Parameters for `release.changelog`. @task T963 */\nexport interface ReleaseChangelogParams {\n /** Version to build the changelog for (must match an existing manifest). @task T963 */\n version: string;\n /** Filter emitted sections. @task T963 */\n sections?: Array<'feat' | 'fix' | 'docs' | 'test' | 'refactor' | 'chore'>;\n}\n/** Result of `release.changelog`. @task T963 */\nexport interface ReleaseChangelogResult {\n /** Version. @task T963 */\n version: string;\n /** Rendered changelog content (Markdown). @task T963 */\n content: string;\n /** Grouped changelog sections. @task T963 */\n sections: ChangelogSection[];\n /** Count of commits aggregated. @task T963 */\n commitCount: number;\n}\n\n// release.commit\n/** Parameters for `release.commit`. @task T963 */\nexport interface ReleaseCommitParams {\n /** Version tag being committed. @task T963 */\n version: string;\n /** Files associated with the commit. @task T963 */\n files?: string[];\n}\n/** Result of `release.commit`. @task T963 */\nexport interface ReleaseCommitResult {\n /** Version. @task T963 */\n version: string;\n /** Git commit hash. @task T963 */\n commitHash: string;\n /** Commit message. @task T963 */\n message: string;\n /** Files actually committed. @task T963 */\n filesCommitted: string[];\n}\n\n// release.tag\n/** Parameters for `release.tag`. @task T963 */\nexport interface ReleaseTagParams {\n /** Version being tagged. @task T963 */\n version: string;\n /** Tag message (annotated tag). @task T963 */\n message?: string;\n}\n/** Result of `release.tag`. @task T963 */\nexport interface ReleaseTagResult {\n /** Version. @task T963 */\n version: string;\n /** Tag name created. @task T963 */\n tagName: string;\n /** ISO 8601 creation timestamp. @task T963 */\n created: string;\n}\n\n// release.push\n/** Parameters for `release.push`. @task T963 */\nexport interface ReleasePushParams {\n /** Version being pushed. @task T963 */\n version: string;\n /** Git remote name. Defaults to `origin`. @task T963 */\n remote?: string;\n}\n/** Result of `release.push`. @task T963 */\nexport interface ReleasePushResult {\n /** Version. @task T963 */\n version: string;\n /** Remote that received the push. @task T963 */\n remote: string;\n /** ISO 8601 push timestamp. @task T963 */\n pushed: string;\n /** Tags that were pushed alongside. @task T963 */\n tagsPushed: string[];\n}\n\n// release.gates.run\n/** Parameters for `release.gates.run`. @task T963 */\nexport interface ReleaseGatesRunParams {\n /** Specific gate names to run. Omit to run all. @task T963 */\n gates?: string[];\n}\n/** Result of `release.gates.run`. @task T963 */\nexport interface ReleaseGatesRunResult {\n /** Total gates evaluated. @task T963 */\n total: number;\n /** Gates that passed. @task T963 */\n passed: number;\n /** Gates that failed. @task T963 */\n failed: number;\n /** Full per-gate report. @task T963 */\n gates: ReleaseGate[];\n /** True when every gate passed. @task T963 */\n canRelease: boolean;\n}\n\n// release.rollback\n/** Parameters for `release.rollback`. @task T963 */\nexport interface ReleaseRollbackParams {\n /** Version to roll back. @task T963 */\n version: string;\n /** Human-readable reason for the rollback. @task T963 */\n reason: string;\n}\n/** Result of `release.rollback`. @task T963 */\nexport interface ReleaseRollbackResult {\n /** Version that was rolled back. @task T963 */\n version: string;\n /** ISO 8601 rollback timestamp. @task T963 */\n rolledBack: string;\n /** Version that is now current. @task T963 */\n restoredVersion: string;\n /** Rollback reason. @task T963 */\n reason: string;\n}\n", "/**\n * Research Domain Operations (legacy alias for memory domain)\n *\n * Query operations: 12 (derived from memory domain)\n * Mutate operations: 5 (derived from memory domain)\n *\n * Note: manifest.* operations moved to pipeline domain (T5241).\n * inject operation moved to session.context.inject (T5241).\n */\n\n/**\n * Common research types\n */\nexport interface ResearchEntry {\n id: string;\n taskId: string;\n title: string;\n file: string;\n date: string;\n status: 'completed' | 'partial' | 'blocked';\n agentType: string;\n topics: string[];\n keyFindings: string[];\n actionable: boolean;\n needsFollowup: string[];\n linkedTasks: string[];\n confidence?: number;\n}\n\nexport interface ManifestEntry {\n id: string;\n file: string;\n title: string;\n date: string;\n status: 'completed' | 'partial' | 'blocked';\n agent_type: string;\n topics: string[];\n key_findings: string[];\n actionable: boolean;\n needs_followup: string[];\n linked_tasks: string[];\n}\n\n/**\n * Query Operations\n */\n\n// research.show\nexport interface ResearchShowParams {\n researchId: string;\n}\nexport type ResearchShowResult = ResearchEntry;\n\n// research.list\nexport interface ResearchListParams {\n epicId?: string;\n status?: 'completed' | 'partial' | 'blocked';\n}\nexport type ResearchListResult = ResearchEntry[];\n\n// research.query\nexport interface ResearchQueryParams {\n query: string;\n confidence?: number;\n}\nexport interface ResearchQueryResult {\n entries: ResearchEntry[];\n matchCount: number;\n avgConfidence: number;\n}\n\n// research.pending\nexport interface ResearchPendingParams {\n epicId?: string;\n}\nexport type ResearchPendingResult = ResearchEntry[];\n\n// research.stats\nexport interface ResearchStatsParams {\n epicId?: string;\n}\nexport interface ResearchStatsResult {\n total: number;\n complete: number;\n partial: number;\n blocked: number;\n byAgentType: Record<string, number>;\n byTopic: Record<string, number>;\n avgConfidence: number;\n}\n\n// pipeline.manifest.list (was research.manifest.read, moved to pipeline T5241)\nexport interface ResearchManifestReadParams {\n filter?: string;\n limit?: number;\n offset?: number;\n}\nexport type ResearchManifestReadResult = ManifestEntry[];\n\n/**\n * Mutate Operations\n */\n\n// session.context.inject (was research.inject, moved to session domain T5241)\nexport interface ResearchInjectParams {\n protocolType:\n | 'research'\n | 'consensus'\n | 'specification'\n | 'decomposition'\n | 'implementation'\n | 'contribution'\n | 'release';\n taskId?: string;\n variant?: string;\n}\nexport interface ResearchInjectResult {\n protocol: string;\n content: string;\n tokensUsed: number;\n}\n\n// research.link\nexport interface ResearchLinkParams {\n researchId: string;\n taskId: string;\n relationship?: 'supports' | 'blocks' | 'references' | 'supersedes';\n}\nexport interface ResearchLinkResult {\n researchId: string;\n taskId: string;\n relationship: string;\n linked: string;\n}\n\n// pipeline.manifest.append (was research.manifest.append, moved to pipeline T5241)\nexport interface ResearchManifestAppendParams {\n entry: ManifestEntry;\n validateFile?: boolean;\n}\nexport interface ResearchManifestAppendResult {\n id: string;\n appended: string;\n validated: boolean;\n}\n\n// pipeline.manifest.archive (was research.manifest.archive, moved to pipeline T5241)\nexport interface ResearchManifestArchiveParams {\n beforeDate?: string;\n moveFiles?: boolean;\n}\nexport interface ResearchManifestArchiveResult {\n archived: number;\n entryIds: string[];\n filesMovedCount?: number;\n}\n", "/**\n * Session Domain Operations (9 operations)\n *\n * Query operations: 4\n * Mutate operations: 5\n *\n * SYNC: Canonical type definitions live in the CLI package at:\n * src/types/session.ts (Session, SessionScope, etc.)\n * These operation types are the API contract (wire format).\n */\n\n/**\n * Common session types\n */\nexport interface SessionOp {\n id: string;\n name: string;\n scope: string;\n started: string;\n ended?: string;\n startedTask?: string;\n status: 'active' | 'suspended' | 'ended';\n notes?: string[];\n}\n\n/**\n * Query Operations\n */\n\n// session.status\nexport type SessionStatusParams = Record<string, never>;\n/**\n * Result of `session.status`.\n *\n * @remarks\n * Re-synced to match the envelope returned by `sessionStatus` in\n * `packages/cleo/src/dispatch/engines/session-engine.ts`. The legacy\n * contract's `{current, hasStartedTask, startedTask}` shape predated the\n * current engine and never matched dispatch output \u2014 agents reading the\n * contract would never find their data.\n *\n * @task T963 \u2014 contract\u2194impl drift reconciliation (T910 audit)\n */\nexport interface SessionStatusResult {\n /** True when a session is currently active. @task T963 */\n hasActiveSession: boolean;\n /**\n * Active session record (full shape per `Session` contract) or `null`\n * when none active.\n * @task T963\n */\n session?: SessionOp | null;\n /**\n * Current task work state from `meta.focus_state` \u2014 tracks the\n * task the orchestrator is focused on within the session.\n * @task T963\n */\n taskWork?: import('../task.js').TaskWorkState | null;\n}\n\n// session.list\nexport interface SessionListParams {\n active?: boolean;\n status?: string;\n limit?: number;\n offset?: number;\n}\nexport interface SessionListResult {\n sessions: SessionOp[];\n total: number;\n filtered: number;\n}\n\n// session.show\nexport interface SessionShowParams {\n sessionId: string;\n}\nexport type SessionShowResult = SessionOp;\n\n// session.history\nexport interface SessionHistoryParams {\n limit?: number;\n}\nexport interface SessionHistoryEntry {\n sessionId: string;\n name: string;\n started: string;\n ended: string;\n tasksCompleted: number;\n duration: string;\n}\nexport type SessionHistoryResult = SessionHistoryEntry[];\n\n/**\n * Mutate Operations\n */\n\n// session.start\nexport interface SessionStartParams {\n scope: string;\n name?: string;\n autoStart?: boolean;\n startTask?: string;\n}\nexport type SessionStartResult = SessionOp;\n\n// session.end\nexport interface SessionEndParams {\n notes?: string;\n /**\n * Structured session summary for direct ingestion into brain.db.\n * When provided, CLEO persists key learnings, decisions, patterns, and next actions.\n * @task T140 @epic T134\n */\n sessionSummary?: import('../config.js').SessionSummaryInput;\n}\nexport interface SessionEndResult {\n session: SessionOp;\n summary: {\n duration: string;\n tasksCompleted: number;\n tasksCreated: number;\n };\n /**\n * A summarization prompt built from this session's debrief data.\n * Populated when `brain.summarization.enabled` is true.\n * @task T140 @epic T134\n */\n memoryPrompt?: string;\n}\n\n// session.resume\nexport interface SessionResumeParams {\n sessionId: string;\n}\nexport type SessionResumeResult = SessionOp;\n\n// session.suspend\nexport interface SessionSuspendParams {\n notes?: string;\n}\nexport interface SessionSuspendResult {\n sessionId: string;\n suspended: string;\n}\n\n// session.gc\nexport interface SessionGcParams {\n olderThan?: string;\n}\nexport interface SessionGcResult {\n cleaned: number;\n sessionIds: string[];\n}\n", "/**\n * Skills Domain Operations (12 operations)\n *\n * Query operations: 6 (list, show, find, dispatch, verify, dependencies)\n * Mutate operations: 6 (install, uninstall, enable, disable, configure, refresh)\n *\n * @task T4387\n */\n\n/**\n * Common skill types\n */\nexport type SkillCategory = 'core' | 'recommended' | 'specialist' | 'composition' | 'meta';\nexport type SkillStatus = 'active' | 'disabled' | 'deprecated' | 'missing';\nexport type DispatchStrategy = 'label' | 'type' | 'keyword' | 'fallback';\n\nexport interface SkillSummary {\n name: string;\n version: string;\n description: string;\n category: SkillCategory;\n core: boolean;\n tier: number;\n status: SkillStatus;\n protocol: string | null;\n}\n\nexport interface SkillDetail extends SkillSummary {\n path: string;\n references: string[];\n dependencies: string[];\n sharedResources: string[];\n compatibility: string[];\n license: string;\n metadata: Record<string, unknown>;\n capabilities?: {\n inputs: string[];\n outputs: string[];\n dispatch_triggers: string[];\n compatible_subagent_types: string[];\n chains_to: string[];\n dispatch_keywords: {\n primary: string[];\n secondary: string[];\n };\n };\n constraints?: {\n max_context_tokens: number;\n requires_session: boolean;\n requires_epic: boolean;\n };\n}\n\nexport interface DispatchCandidate {\n skill: string;\n score: number;\n strategy: DispatchStrategy;\n reason: string;\n}\n\nexport interface DependencyNode {\n name: string;\n version: string;\n direct: boolean;\n depth: number;\n}\n\nexport interface ValidationIssue {\n level: 'error' | 'warn';\n field: string;\n message: string;\n}\n\n/**\n * Query Operations\n */\n\n// skills.list\nexport interface SkillsListParams {\n category?: SkillCategory;\n core?: boolean;\n filter?: string;\n}\nexport type SkillsListResult = SkillSummary[];\n\n// skills.show\nexport interface SkillsShowParams {\n name: string;\n}\nexport type SkillsShowResult = SkillDetail;\n\n// skills.find\nexport interface SkillsFindParams {\n query: string;\n limit?: number;\n}\nexport interface SkillsFindResult {\n query: string;\n results: Array<SkillSummary & { score: number; matchReason: string }>;\n}\n\n// skills.dispatch\nexport interface SkillsDispatchParams {\n taskId?: string;\n taskType?: string;\n labels?: string[];\n title?: string;\n description?: string;\n}\nexport interface SkillsDispatchResult {\n selectedSkill: string;\n reason: string;\n strategy: DispatchStrategy;\n candidates: DispatchCandidate[];\n}\n\n// skills.verify\nexport interface SkillsVerifyParams {\n name?: string;\n}\nexport interface SkillsVerifyResult {\n valid: boolean;\n total: number;\n passed: number;\n failed: number;\n results: Array<{\n name: string;\n valid: boolean;\n issues: ValidationIssue[];\n }>;\n}\n\n// skills.dependencies\nexport interface SkillsDependenciesParams {\n name: string;\n transitive?: boolean;\n}\nexport interface SkillsDependenciesResult {\n name: string;\n dependencies: DependencyNode[];\n resolved: string[];\n}\n\n/**\n * Mutate Operations\n */\n\n// skills.install\nexport interface SkillsInstallParams {\n name: string;\n source?: string;\n}\nexport interface SkillsInstallResult {\n name: string;\n installed: boolean;\n version: string;\n path: string;\n}\n\n// skills.uninstall\nexport interface SkillsUninstallParams {\n name: string;\n force?: boolean;\n}\nexport interface SkillsUninstallResult {\n name: string;\n uninstalled: boolean;\n}\n\n// skills.enable\nexport interface SkillsEnableParams {\n name: string;\n}\nexport interface SkillsEnableResult {\n name: string;\n enabled: boolean;\n status: SkillStatus;\n}\n\n// skills.disable\nexport interface SkillsDisableParams {\n name: string;\n reason?: string;\n}\nexport interface SkillsDisableResult {\n name: string;\n disabled: boolean;\n status: SkillStatus;\n}\n\n// skills.configure\nexport interface SkillsConfigureParams {\n name: string;\n config: Record<string, unknown>;\n}\nexport interface SkillsConfigureResult {\n name: string;\n configured: boolean;\n config: Record<string, unknown>;\n}\n\n// skills.refresh\nexport interface SkillsRefreshParams {\n force?: boolean;\n}\nexport interface SkillsRefreshResult {\n refreshed: boolean;\n skillCount: number;\n timestamp: string;\n}\n", "/**\n * System Domain Operations (12 operations)\n *\n * Query operations: 5\n * Mutate operations: 7\n */\n\n/**\n * Common system types\n */\nexport interface HealthCheck {\n component: string;\n healthy: boolean;\n message?: string;\n}\n\nexport interface ProjectStats {\n tasks: {\n total: number;\n pending: number;\n active: number;\n blocked: number;\n done: number;\n };\n sessions: {\n total: number;\n active: number;\n };\n research: {\n total: number;\n complete: number;\n };\n}\n\n/**\n * Query Operations\n */\n\n// system.version\nexport type SystemVersionParams = Record<string, never>;\nexport interface SystemVersionResult {\n version: string;\n schemaVersion: string;\n buildDate: string;\n}\n\n// system.doctor\nexport type SystemDoctorParams = Record<string, never>;\nexport interface SystemDoctorResult {\n healthy: boolean;\n checks: HealthCheck[];\n warnings: string[];\n errors: string[];\n}\n\n// system.config.get\nexport interface SystemConfigGetParams {\n key: string;\n}\nexport interface SystemConfigGetResult {\n key: string;\n value: unknown;\n type: string;\n}\n\n// system.stats\nexport type SystemStatsParams = Record<string, never>;\nexport type SystemStatsResult = ProjectStats;\n\n// system.context\nexport type SystemContextParams = Record<string, never>;\nexport interface SystemContextResult {\n currentTokens: number;\n maxTokens: number;\n percentUsed: number;\n level: 'safe' | 'medium' | 'high' | 'critical';\n estimatedFiles: number;\n largestFile: {\n path: string;\n tokens: number;\n };\n}\n\n/**\n * Mutate Operations\n */\n\n// system.init\nexport interface SystemInitParams {\n projectType?: 'nodejs' | 'python' | 'bash' | 'typescript' | 'rust' | 'go';\n detect?: boolean;\n}\nexport interface SystemInitResult {\n initialized: boolean;\n projectType?: string;\n filesCreated: string[];\n detectedFeatures?: Record<string, boolean>;\n}\n\n// system.config.set\nexport interface SystemConfigSetParams {\n key: string;\n value: unknown;\n}\nexport interface SystemConfigSetResult {\n key: string;\n value: unknown;\n previousValue?: unknown;\n}\n\n// system.backup\nexport interface SystemBackupParams {\n type?: 'snapshot' | 'safety' | 'archive' | 'migration';\n note?: string;\n}\nexport interface SystemBackupResult {\n backupId: string;\n type: string;\n timestamp: string;\n files: string[];\n size: number;\n}\n\n// system.restore\nexport interface SystemRestoreParams {\n backupId: string;\n}\nexport interface SystemRestoreResult {\n backupId: string;\n restored: string;\n filesRestored: string[];\n}\n\n// system.migrate\nexport interface SystemMigrateParams {\n version?: string;\n dryRun?: boolean;\n}\nexport interface SystemMigrateResult {\n fromVersion: string;\n toVersion: string;\n migrations: Array<{\n name: string;\n applied: boolean;\n error?: string;\n }>;\n dryRun: boolean;\n}\n\n// system.sync\nexport interface SystemSyncParams {\n direction?: 'push' | 'pull' | 'bidirectional';\n}\nexport interface SystemSyncResult {\n direction: string;\n synced: string;\n tasksSynced: number;\n conflicts: Array<{\n taskId: string;\n resolution: string;\n }>;\n}\n\n// system.cleanup\nexport interface SystemCleanupParams {\n type: 'backups' | 'logs' | 'archive' | 'sessions';\n olderThan?: string;\n}\nexport interface SystemCleanupResult {\n type: string;\n cleaned: number;\n freed: number;\n items: string[];\n}\n", "/**\n * Tasks Domain Operations (22 operations)\n *\n * Query operations: 10\n * Mutate operations: 12\n *\n * SYNC: Canonical type definitions live in the CLI package at:\n * src/types/task.ts (TaskStatus, TaskPriority, Task, etc.)\n * These operation types are the API contract (wire format).\n * Internal domain types must stay aligned with CLI definitions.\n */\n\n/**\n * Common task types (API contract \u2014 matches CLI src/types/task.ts)\n */\nimport type { TaskStatus } from '../status-registry.js';\n\nexport type { TaskStatus };\nexport type TaskPriority = 'low' | 'medium' | 'high' | 'critical';\n\nexport interface TaskOp {\n id: string;\n title: string;\n description: string;\n status: TaskStatus;\n priority?: TaskPriority;\n parent?: string;\n depends?: string[];\n labels?: string[];\n created: string;\n updated: string;\n completed?: string;\n notes?: string[];\n}\n\nexport interface MinimalTask {\n id: string;\n title: string;\n status: TaskStatus;\n parent?: string;\n}\n\n/**\n * Query Operations\n */\n\n// tasks.get\nexport interface TasksGetParams {\n taskId: string;\n}\nexport type TasksGetResult = TaskOp;\n\n// tasks.list\nexport interface TasksListParams {\n parent?: string;\n status?: TaskStatus;\n priority?: TaskPriority;\n type?: string;\n phase?: string;\n label?: string;\n children?: boolean;\n limit?: number;\n offset?: number;\n compact?: boolean;\n}\nexport interface TasksListResult {\n tasks: TaskOp[];\n total: number;\n filtered: number;\n}\n\n// tasks.find\n/**\n * Parameters for `tasks.find`.\n *\n * @remarks\n * Re-synced to match `taskFind(projectRoot, query, limit, options)` in the\n * dispatch layer. Legacy contract exposed only `{query, limit}` and hid\n * the 7 additional filter options agents actually need.\n *\n * @task T963 \u2014 contract\u2194impl drift reconciliation (T910 audit)\n */\nexport interface TasksFindParams {\n /** Free-text search query. @task T963 */\n query: string;\n /** Max results. @task T963 */\n limit?: number;\n /** Exact task ID lookup (bypasses search). @task T963 */\n id?: string;\n /** When true, require exact string match instead of fuzzy. @task T963 */\n exact?: boolean;\n /** Filter by status. @task T963 */\n status?: TaskStatus;\n /** When true, include archived tasks in the search. @task T963 */\n includeArchive?: boolean;\n /** Offset into the results (pagination). @task T963 */\n offset?: number;\n /**\n * Comma-separated field projection (e.g. `'id,title,status'`) to shrink\n * the wire payload.\n * @task T963\n */\n fields?: string;\n /** When true, emit verbose per-match diagnostic fields. @task T963 */\n verbose?: boolean;\n}\nexport type TasksFindResult = MinimalTask[];\n\n// tasks.exists\nexport interface TasksExistsParams {\n taskId: string;\n}\nexport interface TasksExistsResult {\n exists: boolean;\n taskId: string;\n}\n\n// tasks.tree\nexport interface TasksTreeParams {\n rootId?: string;\n depth?: number;\n}\nexport interface TaskTreeNode {\n task: TaskOp;\n children: TaskTreeNode[];\n depth: number;\n}\nexport type TasksTreeResult = TaskTreeNode[];\n\n// tasks.blockers\nexport interface TasksBlockersParams {\n taskId: string;\n}\nexport interface Blocker {\n taskId: string;\n title: string;\n status: TaskStatus;\n blockType: 'dependency' | 'parent' | 'gate';\n}\nexport type TasksBlockersResult = Blocker[];\n\n// tasks.deps\nexport interface TasksDepsParams {\n taskId: string;\n direction?: 'upstream' | 'downstream' | 'both';\n}\nexport interface TaskDependencyNode {\n taskId: string;\n title: string;\n status: TaskStatus;\n distance: number;\n}\nexport interface TasksDepsResult {\n taskId: string;\n upstream: TaskDependencyNode[];\n downstream: TaskDependencyNode[];\n}\n\n// tasks.analyze\nexport interface TasksAnalyzeParams {\n epicId?: string;\n}\nexport interface TriageRecommendation {\n taskId: string;\n title: string;\n priority: number;\n reason: string;\n readiness: 'ready' | 'blocked' | 'pending';\n}\nexport type TasksAnalyzeResult = TriageRecommendation[];\n\n// tasks.next\nexport interface TasksNextParams {\n epicId?: string;\n count?: number;\n}\nexport interface SuggestedTask {\n taskId: string;\n title: string;\n score: number;\n rationale: string;\n}\nexport type TasksNextResult = SuggestedTask[];\n\n/**\n * Mutate Operations\n */\n\n// tasks.create\n/**\n * Parameters for `tasks.create` / `tasks.add`.\n *\n * @remarks\n * Re-synced to match `AddTaskOptions` in `packages/core/src/tasks/add.ts`\n * and the dispatch handler in `packages/cleo/src/dispatch/domains/tasks.ts`.\n * The legacy contract was missing 8 fields (`type`, `acceptance`, `phase`,\n * `size`, `notes`, `files`, `dryRun`, `parentSearch`) \u2014 agents following\n * the contract would omit them and fail CLEO's anti-hallucination + epic\n * creation enforcement.\n *\n * @task T963 \u2014 contract\u2194impl drift reconciliation (T910 audit)\n */\nexport interface TasksCreateParams {\n /** Task title (required, 1..200 chars). @task T963 */\n title: string;\n /**\n * Task description (required by anti-hallucination rule T5698 \u2014 must\n * differ from `title`). The legacy contract marked this required; kept\n * required here to preserve behavior.\n * @task T963\n */\n description: string;\n /** Parent task id (`T###`). Omit for root-level tasks (epics only). @task T963 */\n parent?: string;\n /** Task IDs this task depends on. @task T963 */\n depends?: string[];\n /** Priority (`critical`|`high`|`medium`|`low`). Defaults to `medium`. @task T963 */\n priority?: TaskPriority;\n /** Label tags (lowercase alphanumeric + hyphens/periods). @task T963 */\n labels?: string[];\n /**\n * Task type. When omitted, inferred from parent (epic-child \u2192 `task`,\n * task-child \u2192 `subtask`, rootless \u2192 `task`). @task T963\n */\n type?: 'epic' | 'task' | 'subtask';\n /**\n * Acceptance criteria (pipe-separated strings). Minimum 3 required by\n * enforcement layer; epics require minimum 5.\n * @task T963\n */\n acceptance?: string[];\n /** Phase slug (lowercase alphanumeric + hyphens). @task T963 */\n phase?: string;\n /** Task size (`small`|`medium`|`large`). Defaults to `medium`. @task T963 */\n size?: 'small' | 'medium' | 'large';\n /** Initial note text (timestamped at insertion). @task T963 */\n notes?: string;\n /** File paths associated with the task. @task T963 */\n files?: string[];\n /**\n * When true, validate + preview the task without allocating a task id or\n * writing to the DB. Preview returns an `id: 'T???'` placeholder.\n * @task T963\n */\n dryRun?: boolean;\n /**\n * CLI helper for parent resolution via search term \u2014 when set, dispatch\n * layer resolves the search to a parent id before calling core.\n * @task T963\n */\n parentSearch?: string;\n}\nexport type TasksCreateResult = TaskOp;\n\n// tasks.update\n/**\n * Parameters for `tasks.update`.\n *\n * @remarks\n * Re-synced to match `UpdateTaskOptions` in\n * `packages/core/src/tasks/update.ts` and the dispatch handler in\n * `packages/cleo/src/dispatch/domains/tasks.ts`. The legacy contract was\n * missing `acceptance`, `pipelineStage` (T834 / ADR-051 Decision 4),\n * `files`, `blockedBy`, `phase`, `noAutoComplete`, the narrow typing of\n * `type`/`size`, and the `addDepends`/`removeDepends` array mutators.\n *\n * @task T963 \u2014 contract\u2194impl drift reconciliation (T910 audit)\n */\nexport interface TasksUpdateParams {\n /** Task ID to update (required). @task T963 */\n taskId: string;\n /** Replace title. @task T963 */\n title?: string;\n /** Replace description. @task T963 */\n description?: string;\n /** Target status \u2014 `done` transitions route through complete flow. @task T963 */\n status?: TaskStatus;\n /** Replace priority. @task T963 */\n priority?: TaskPriority;\n /** Append a timestamped note. @task T963 */\n notes?: string;\n /** Set parent ID, or null/\"\" to promote to root. @task T963 */\n parent?: string | null;\n /** Replace labels wholesale. @task T963 */\n labels?: string[];\n /** Additive label insert. @task T963 */\n addLabels?: string[];\n /** Label removal set. @task T963 */\n removeLabels?: string[];\n /** Replace dependency list. @task T963 */\n depends?: string[];\n /** Additive dependency insert. @task T963 */\n addDepends?: string[];\n /** Dependency removal set. @task T963 */\n removeDepends?: string[];\n /** Task type (`epic`|`task`|`subtask`). @task T963 */\n type?: 'epic' | 'task' | 'subtask';\n /** Task size (`small`|`medium`|`large`). @task T963 */\n size?: 'small' | 'medium' | 'large';\n /**\n * Replace acceptance criteria. Subject to AC enforcement \u2014 min 3 for\n * all tasks, min 5 for epics.\n * @task T963\n */\n acceptance?: string[];\n /** Replace files attached to the task. @task T963 */\n files?: string[];\n /** Phase slug (lowercase alphanumeric + hyphens). @task T963 */\n phase?: string;\n /** Blocking reason (set when status=`blocked`). @task T963 */\n blockedBy?: string;\n /**\n * When true, skip auto-complete cascading when all children complete.\n * @task T963\n */\n noAutoComplete?: boolean;\n /**\n * RCASD-IVTR+C pipeline stage transition target. Forward-only\n * (validated by `validatePipelineTransition`); epic advancements are\n * additionally gated by `validateEpicStageAdvancement`; non-epic tasks\n * are gated by `validateChildStageCeiling` against their ancestor epic.\n * @task T963 / T834 / ADR-051 Decision 4\n */\n pipelineStage?: string;\n}\nexport type TasksUpdateResult = TaskOp;\n\n// tasks.complete\nexport interface TasksCompleteParams {\n taskId: string;\n notes?: string;\n archive?: boolean;\n}\nexport interface TasksCompleteResult {\n taskId: string;\n completed: string;\n archived: boolean;\n}\n\n// tasks.delete\nexport interface TasksDeleteParams {\n taskId: string;\n force?: boolean;\n}\nexport interface TasksDeleteResult {\n taskId: string;\n deleted: true;\n}\n\n// tasks.archive\nexport interface TasksArchiveParams {\n taskId?: string;\n before?: string;\n}\nexport interface TasksArchiveResult {\n archived: number;\n taskIds: string[];\n}\n\n// tasks.unarchive\nexport interface TasksUnarchiveParams {\n taskId: string;\n}\nexport type TasksUnarchiveResult = TaskOp;\n\n// tasks.reparent\nexport interface TasksReparentParams {\n taskId: string;\n newParent: string;\n}\nexport type TasksReparentResult = TaskOp;\n\n// tasks.promote\nexport interface TasksPromoteParams {\n taskId: string;\n}\nexport type TasksPromoteResult = TaskOp;\n\n// tasks.reorder\nexport interface TasksReorderParams {\n taskId: string;\n position: number;\n}\nexport interface TasksReorderResult {\n taskId: string;\n newPosition: number;\n}\n\n// tasks.restore (completed tasks) \u2014 alias: reopen\nexport interface TasksReopenParams {\n taskId: string;\n}\nexport type TasksReopenResult = TaskOp;\n\n// tasks.start (begin working on a task)\nexport interface TasksStartParams {\n taskId: string;\n}\nexport interface TasksStartResult {\n taskId: string;\n sessionId: string;\n timestamp: string;\n}\n\n// tasks.stop (stop working on current task)\nexport type TasksStopParams = Record<string, never>;\nexport interface TasksStopResult {\n stopped: true;\n previousTask?: string;\n}\n\n// tasks.current (get currently active task)\nexport type TasksCurrentParams = Record<string, never>;\nexport interface TasksCurrentResult {\n taskId: string | null;\n since?: string;\n sessionId?: string;\n}\n", "/**\n * Validate Domain Operations (11 operations)\n *\n * Query operations: 9\n * Mutate operations: 2\n */\n\n/**\n * Common validation types\n */\nexport type ValidationSeverity = 'error' | 'warning' | 'info';\n\nexport interface ValidationViolation {\n rule: string;\n severity: ValidationSeverity;\n message: string;\n field?: string;\n value?: unknown;\n expected?: unknown;\n line?: number;\n}\n\nexport interface ComplianceMetrics {\n total: number;\n passed: number;\n failed: number;\n score: number;\n byProtocol: Record<string, { passed: number; failed: number }>;\n bySeverity: Record<ValidationSeverity, number>;\n}\n\n/**\n * Query Operations\n */\n\n// validate.schema\nexport interface ValidateSchemaParams {\n fileType: 'todo' | 'config' | 'archive' | 'log' | 'manifest';\n filePath?: string;\n}\nexport interface ValidateSchemaResult {\n valid: boolean;\n schemaVersion: string;\n violations: ValidationViolation[];\n}\n\n// validate.protocol\nexport interface ValidateProtocolParams {\n taskId: string;\n protocolType:\n | 'research'\n | 'consensus'\n | 'specification'\n | 'decomposition'\n | 'implementation'\n | 'contribution'\n | 'release';\n}\nexport interface ValidateProtocolResult {\n taskId: string;\n protocol: string;\n passed: boolean;\n score: number;\n violations: ValidationViolation[];\n requirements: {\n total: number;\n met: number;\n failed: number;\n };\n}\n\n// validate.task\nexport interface ValidateTaskParams {\n taskId: string;\n checkMode: 'basic' | 'strict' | 'anti-hallucination';\n}\nexport interface ValidateTaskResult {\n taskId: string;\n valid: boolean;\n violations: ValidationViolation[];\n checks: {\n idUniqueness: boolean;\n titleDescriptionDifferent: boolean;\n validStatus: boolean;\n noFutureTimestamps: boolean;\n noDuplicateDescription: boolean;\n };\n}\n\n// validate.manifest\nexport interface ValidateManifestParams {\n entry?: string;\n taskId?: string;\n}\nexport interface ValidateManifestResult {\n valid: boolean;\n entry: {\n id: string;\n file: string;\n exists: boolean;\n };\n violations: ValidationViolation[];\n}\n\n// validate.output\nexport interface ValidateOutputParams {\n taskId: string;\n filePath: string;\n}\nexport interface ValidateOutputResult {\n taskId: string;\n filePath: string;\n valid: boolean;\n checks: {\n fileExists: boolean;\n hasTaskHeader: boolean;\n hasStatus: boolean;\n hasSummary: boolean;\n linkedToTask: boolean;\n };\n violations: ValidationViolation[];\n}\n\n// validate.compliance.summary\nexport interface ValidateComplianceSummaryParams {\n scope?: string;\n since?: string;\n}\nexport type ValidateComplianceSummaryResult = ComplianceMetrics;\n\n// validate.compliance.violations\nexport interface ValidateComplianceViolationsParams {\n severity?: ValidationSeverity;\n protocol?: string;\n}\nexport interface ValidateComplianceViolationsResult {\n violations: Array<\n ValidationViolation & {\n taskId: string;\n protocol: string;\n timestamp: string;\n }\n >;\n total: number;\n}\n\n// validate.test.status\nexport interface ValidateTestStatusParams {\n taskId?: string;\n}\nexport interface ValidateTestStatusResult {\n total: number;\n passed: number;\n failed: number;\n skipped: number;\n passRate: number;\n byTask?: Record<string, { passed: number; failed: number }>;\n}\n\n// validate.test.coverage\nexport interface ValidateTestCoverageParams {\n taskId?: string;\n}\nexport interface ValidateTestCoverageResult {\n lineCoverage: number;\n branchCoverage: number;\n functionCoverage: number;\n statementCoverage: number;\n threshold: number;\n meetsThreshold: boolean;\n}\n\n/**\n * Mutate Operations\n */\n\n// validate.compliance.record\nexport interface ValidateComplianceRecordParams {\n taskId: string;\n result: ValidateProtocolResult;\n}\nexport interface ValidateComplianceRecordResult {\n taskId: string;\n recorded: string;\n metrics: ComplianceMetrics;\n}\n\n// validate.test.run\nexport interface ValidateTestRunParams {\n scope?: string;\n pattern?: string;\n parallel?: boolean;\n}\nexport interface ValidateTestRunResult {\n status: ValidateTestStatusResult;\n coverage: ValidateTestCoverageResult;\n duration: string;\n output?: string;\n}\n", "/**\n * Operations types barrel \u2014 API wire format types for all CLEO domains.\n *\n * These are re-exported under `ops` namespace from the package root\n * to avoid name collisions with canonical domain types.\n */\n\nexport * from './brain.js';\nexport * from './conduit.js';\nexport * from './issues.js';\nexport * from './lifecycle.js';\nexport * from './memory.js';\nexport * from './nexus.js';\nexport * from './orchestrate.js';\nexport * from './params.js';\nexport * from './release.js';\nexport * from './research.js';\nexport * from './session.js';\nexport * from './skills.js';\nexport * from './system.js';\nexport * from './tasks.js';\nexport * from './validate.js';\n", "/**\n * Orchestration Hierarchy \u2014 5-level agent hierarchy types.\n *\n * Codifies the agent authority chain from ORCH-PLAN.md:\n * Level 0: HITL (Human-In-The-Loop) \u2014 Owner, final authority\n * Level 1: Prime Orchestrator \u2014 Cross-project coordination\n * Level 2: Project Lead \u2014 Project-level architecture decisions\n * Level 3: Team Lead \u2014 Team-level task management, can spawn ephemeral agents\n * Level 4: Ephemeral \u2014 Task-scoped agents spawned by Team Leads\n *\n * @see docs/specs/CLEO-ORCH-PLAN.md\n * @task T217\n */\n\n// ============================================================================\n// Hierarchy levels\n// ============================================================================\n\n/** The 5 orchestration levels in order of authority. */\nexport enum OrchestrationLevel {\n /** Level 0: Human owner. Final authority. Never contacted by agents directly. */\n HITL = 0,\n /** Level 1: Prime Orchestrator. Cross-project coordination. Breaks ties. */\n Prime = 1,\n /** Level 2: Project Lead. Architecture decisions within a project. */\n ProjectLead = 2,\n /** Level 3: Team Lead. Task management. Can spawn ephemeral agents. */\n TeamLead = 3,\n /** Level 4: Ephemeral agent. Task-scoped, short-lived. */\n Ephemeral = 4,\n}\n\n// ============================================================================\n// Agent hierarchy membership\n// ============================================================================\n\n/** An agent's position in the orchestration hierarchy. */\nexport interface AgentHierarchyEntry {\n /** The agent's unique ID (e.g. 'cleo-rust-lead'). */\n agentId: string;\n /** Display name for human-readable output. */\n displayName: string;\n /** The agent's orchestration level. */\n level: OrchestrationLevel;\n /** The agent's direct superior (null for HITL). */\n reportsTo: string | null;\n /** Agents this agent directly manages (empty for Ephemeral). */\n manages: string[];\n /** Project scope (null for cross-project agents like Prime). */\n projectId: string | null;\n /** Team scope within a project (e.g. 'cleocode', 'signaldock'). */\n teamId: string | null;\n /** Whether this agent can spawn ephemeral sub-agents. */\n canSpawn: boolean;\n}\n\n/** The full agent hierarchy tree. */\nexport interface AgentHierarchy {\n /** All agents in the hierarchy, keyed by agentId. */\n agents: Record<string, AgentHierarchyEntry>;\n /** The Prime Orchestrator agent ID. */\n primeId: string;\n /** Project IDs in this hierarchy. */\n projectIds: string[];\n}\n\n// ============================================================================\n// Escalation chain\n// ============================================================================\n\n/** An escalation path from an agent to its authority chain. */\nexport interface EscalationChain {\n /** The requesting agent. */\n fromAgentId: string;\n /** Ordered list of agents to escalate to (nearest first). */\n chain: string[];\n /** The final authority (PRIME or HITL). */\n finalAuthority: string;\n}\n\n// ============================================================================\n// Hierarchy API\n// ============================================================================\n\n/** API for querying and managing the agent hierarchy. */\nexport interface OrchestrationHierarchyAPI {\n /** Get the full hierarchy. */\n getHierarchy(): AgentHierarchy;\n\n /** Get a single agent's hierarchy entry. */\n getAgent(agentId: string): AgentHierarchyEntry | null;\n\n /** Get all agents at a specific level. */\n getAgentsAtLevel(level: OrchestrationLevel): AgentHierarchyEntry[];\n\n /** Get the escalation chain for an agent. */\n getEscalationChain(agentId: string): EscalationChain;\n\n /** Get all agents managed by a specific agent (direct reports). */\n getDirectReports(agentId: string): AgentHierarchyEntry[];\n\n /** Check if agent A has authority over agent B. */\n hasAuthority(agentIdA: string, agentIdB: string): boolean;\n\n /** Get all agents scoped to a project. */\n getProjectAgents(projectId: string): AgentHierarchyEntry[];\n}\n", "/**\n * Session type definitions for CLEO V2.\n *\n * Plain TypeScript interfaces derived from the Drizzle/Zod schemas\n * in src/store/validation-schemas.ts. Contracts must not depend on Zod/Drizzle.\n *\n * @epic T4454\n */\n\nimport type { SessionStatus } from './status-registry.js';\n\nexport type { SessionStatus };\n\n/** Session scope JSON blob shape. */\nexport interface SessionScope {\n /** Scope type (e.g. `\"global\"`, `\"epic\"`, `\"task\"`, `\"custom\"`). */\n type: string;\n /**\n * Epic ID when scope type is `\"epic\"`.\n * @defaultValue undefined\n */\n epicId?: string;\n /**\n * Root task ID when scope is narrowed to a subtree.\n * @defaultValue undefined\n */\n rootTaskId?: string;\n /**\n * Whether to include descendant tasks of the root task.\n * @defaultValue undefined\n */\n includeDescendants?: boolean;\n /**\n * Phase slug to filter tasks by.\n * @defaultValue undefined\n */\n phaseFilter?: string | null;\n /**\n * Label filter to narrow the scope to specific labels.\n * @defaultValue undefined\n */\n labelFilter?: string[] | null;\n /**\n * Maximum hierarchy depth to include.\n * @defaultValue undefined\n */\n maxDepth?: number | null;\n /**\n * Explicit task IDs to include regardless of other filters.\n * @defaultValue undefined\n */\n explicitTaskIds?: string[] | null;\n /**\n * Task IDs to exclude from the scope.\n * @defaultValue undefined\n */\n excludeTaskIds?: string[] | null;\n /**\n * Task IDs computed from the scope definition at resolution time.\n * @defaultValue undefined\n */\n computedTaskIds?: string[];\n /**\n * ISO 8601 timestamp of when computed task IDs were last resolved.\n * @defaultValue undefined\n */\n computedAt?: string;\n}\n\n/** Session statistics. */\nexport interface SessionStats {\n /** Number of tasks completed during this session. */\n tasksCompleted: number;\n /** Number of new tasks created during this session. */\n tasksCreated: number;\n /** Number of task updates performed during this session. */\n tasksUpdated: number;\n /** Number of times the focus task was changed. */\n focusChanges: number;\n /** Total minutes the session was in active status. */\n totalActiveMinutes: number;\n /** Number of times the session was suspended and resumed. */\n suspendCount: number;\n}\n\n/** Active task work state within a session. */\nexport interface SessionTaskWork {\n /** ID of the task currently being worked on, or `null` if none. */\n taskId: string | null;\n /** ISO 8601 timestamp of when the current task was set, or `null`. */\n setAt: string | null;\n}\n\n/** Session domain type \u2014 plain interface aligned with Drizzle sessions table. */\nexport interface Session {\n /** Unique session identifier (e.g. `\"ses_20260401...\"`) . */\n id: string;\n /** Human-readable session name. */\n name: string;\n /** Current session lifecycle status. */\n status: SessionStatus;\n /** Scope definition controlling which tasks are visible. */\n scope: SessionScope;\n /** Active task work state within the session. */\n taskWork: SessionTaskWork;\n /** ISO 8601 timestamp of when the session started. */\n startedAt: string;\n /** ISO 8601 timestamp of when the session ended. @defaultValue undefined */\n endedAt?: string;\n /** Agent identifier that owns this session. @defaultValue undefined */\n agent?: string;\n /** Timestamped notes appended during the session. @defaultValue undefined */\n notes?: string[];\n /** IDs of tasks completed during this session. @defaultValue undefined */\n tasksCompleted?: string[];\n /** IDs of tasks created during this session. @defaultValue undefined */\n tasksCreated?: string[];\n /** Serialized handoff JSON for session continuity. @defaultValue undefined */\n handoffJson?: string | null;\n /** ID of the session that preceded this one. @defaultValue undefined */\n previousSessionId?: string | null;\n /** ID of the session that follows this one. @defaultValue undefined */\n nextSessionId?: string | null;\n /** Provider-specific agent identifier string. @defaultValue undefined */\n agentIdentifier?: string | null;\n /** ISO 8601 timestamp of when the handoff was consumed. @defaultValue undefined */\n handoffConsumedAt?: string | null;\n /** Agent that consumed the handoff. @defaultValue undefined */\n handoffConsumedBy?: string | null;\n /** Serialized debrief JSON from session end. @defaultValue undefined */\n debriefJson?: string | null;\n /** Aggregate session statistics. @defaultValue undefined */\n stats?: SessionStats;\n /** Number of times this session has been resumed. @defaultValue undefined */\n resumeCount?: number;\n /** Whether this session is in grade/evaluation mode. @defaultValue undefined */\n gradeMode?: boolean;\n /** ID of the provider adapter used for this session. @defaultValue undefined */\n providerId?: string | null;\n}\n\n/**\n * Result of a session start operation.\n *\n * The `sessionId` field is a convenience alias for `session.id`,\n * provided for consumers that expect it at the top level of the result.\n */\nexport interface SessionStartResult {\n /** The newly created or resumed session. */\n session: Session;\n /** Convenience alias for `session.id`. */\n sessionId: string;\n}\n\n/**\n * SessionView \u2014 typed wrapper over Session[] with collection helpers.\n *\n * Provides discoverable query methods for common session lookups.\n * Does NOT change the DataAccessor interface \u2014 consumers create views from Session[].\n *\n * @remarks\n * SessionView is a read-only collection wrapper that provides convenience\n * methods for filtering, searching, and sorting sessions. It does not own\n * the data and performs no mutations on the underlying array.\n */\nexport class SessionView {\n private readonly _sessions: Session[];\n\n constructor(sessions: Session[]) {\n this._sessions = sessions;\n }\n\n /** Create a SessionView from a Session array. */\n static from(sessions: Session[]): SessionView {\n return new SessionView(sessions);\n }\n\n /** All sessions in the view (readonly). */\n get all(): readonly Session[] {\n return this._sessions;\n }\n\n /** Number of sessions. */\n get length(): number {\n return this._sessions.length;\n }\n\n /** Find the currently active session (if any). */\n findActive(): Session | undefined {\n return this._sessions.find((s) => s.status === 'active');\n }\n\n /** Find a session by ID. */\n findById(id: string): Session | undefined {\n return this._sessions.find((s) => s.id === id);\n }\n\n /** Filter sessions by one or more statuses. */\n filterByStatus(...statuses: SessionStatus[]): Session[] {\n return this._sessions.filter((s) => (statuses as string[]).includes(s.status));\n }\n\n /** Find sessions matching a scope type and optional rootTaskId. */\n findByScope(type: string, rootTaskId?: string): Session[] {\n return this._sessions.filter((s) => {\n if (s.scope?.type !== type) return false;\n if (rootTaskId && s.scope?.rootTaskId !== rootTaskId) return false;\n return true;\n });\n }\n\n /** Sort sessions by a date field. Returns a new array (does not mutate). */\n sortByDate(field: 'startedAt' | 'endedAt', descending = true): Session[] {\n return [...this._sessions].sort((a, b) => {\n const aDate = new Date(a[field] || '').getTime();\n const bDate = new Date(b[field] || '').getTime();\n return descending ? bDate - aDate : aDate - bDate;\n });\n }\n\n /** Get the most recently started session. */\n mostRecent(): Session | undefined {\n if (this._sessions.length === 0) return undefined;\n return this.sortByDate('startedAt', true)[0];\n }\n\n /** Convert back to a plain Session array (shallow copy). */\n toArray(): Session[] {\n return [...this._sessions];\n }\n\n /** Support for-of iteration. */\n [Symbol.iterator](): Iterator<Session> {\n return this._sessions[Symbol.iterator]();\n }\n}\n", "/**\n * Unified Status Registry \u2014 single source of truth for all status enums.\n *\n * ADR-018: All status constants and types MUST be defined here.\n * No other file may define status enum arrays as constants.\n *\n * Dependency direction:\n * status-registry.ts \u2192 schema.ts, types/task.ts, validation/engine.ts,\n * dispatch/lib/security.ts, ...\n */\n\n// === WORKFLOW NAMESPACE ===\n// Statuses for entities representing work being performed.\n\nexport const TASK_STATUSES = [\n 'pending',\n 'active',\n 'blocked',\n 'done',\n 'cancelled',\n 'archived',\n 'proposed',\n] as const;\n\nexport const SESSION_STATUSES = ['active', 'ended', 'orphaned', 'suspended'] as const;\n\nexport const LIFECYCLE_PIPELINE_STATUSES = [\n 'active',\n 'completed',\n 'blocked',\n 'failed',\n 'cancelled',\n 'aborted',\n] as const;\n\nexport const LIFECYCLE_STAGE_STATUSES = [\n 'not_started',\n 'in_progress',\n 'blocked',\n 'completed',\n 'skipped',\n 'failed',\n] as const;\n\n// === GOVERNANCE NAMESPACE ===\n// Statuses for decisions and approvals.\n\nexport const ADR_STATUSES = ['proposed', 'accepted', 'superseded', 'deprecated'] as const;\n\nexport const GATE_STATUSES = ['pending', 'passed', 'failed', 'waived'] as const;\n\n// === MANIFEST NAMESPACE ===\n// Statuses for protocol output artifacts.\n// NOTE: 'complete' was the old value \u2014 it is now 'completed' everywhere.\n\nexport const MANIFEST_STATUSES = ['completed', 'partial', 'blocked', 'archived'] as const;\n\n// === DERIVED TYPES ===\n\nexport type TaskStatus = (typeof TASK_STATUSES)[number];\nexport type SessionStatus = (typeof SESSION_STATUSES)[number];\nexport type PipelineStatus = (typeof LIFECYCLE_PIPELINE_STATUSES)[number];\nexport type StageStatus = (typeof LIFECYCLE_STAGE_STATUSES)[number];\nexport type AdrStatus = (typeof ADR_STATUSES)[number];\nexport type GateStatus = (typeof GATE_STATUSES)[number];\nexport type ManifestStatus = (typeof MANIFEST_STATUSES)[number];\n\n// === TERMINAL STATE SETS ===\n\nexport const TERMINAL_TASK_STATUSES: ReadonlySet<TaskStatus> = new Set([\n 'done',\n 'cancelled',\n 'archived',\n]);\n\nexport const TERMINAL_PIPELINE_STATUSES: ReadonlySet<PipelineStatus> = new Set([\n 'completed',\n 'failed',\n 'cancelled',\n 'aborted',\n]);\n\nexport const TERMINAL_STAGE_STATUSES: ReadonlySet<StageStatus> = new Set([\n 'completed',\n 'skipped',\n 'failed',\n]);\n\n// === REGISTRY (for runtime queryability) ===\n\nexport type EntityType =\n | 'task'\n | 'session'\n | 'lifecycle_pipeline'\n | 'lifecycle_stage'\n | 'adr'\n | 'gate'\n | 'manifest';\n\nexport const STATUS_REGISTRY: Record<EntityType, readonly string[]> = {\n task: TASK_STATUSES,\n session: SESSION_STATUSES,\n lifecycle_pipeline: LIFECYCLE_PIPELINE_STATUSES,\n lifecycle_stage: LIFECYCLE_STAGE_STATUSES,\n adr: ADR_STATUSES,\n gate: GATE_STATUSES,\n manifest: MANIFEST_STATUSES,\n} as const;\n\nexport function isValidStatus(entityType: EntityType, value: string): boolean {\n return (STATUS_REGISTRY[entityType] as readonly string[]).includes(value);\n}\n\n// === DISPLAY ICONS ===\n// Typed Record maps \u2014 exhaustiveness is enforced by the compiler.\n// All icon consumers MUST import from here instead of hardcoding comparisons.\n\n/**\n * Pipeline status \u2192 Unicode progress icon.\n * Used wherever lifecycle pipeline status is rendered to a terminal.\n */\nexport const PIPELINE_STATUS_ICONS: Record<PipelineStatus, string> = {\n active: '\\u25b6', // pipeline is running\n completed: '\\u2713', // all stages done successfully\n blocked: '\\u23f8', // cannot advance; waiting\n failed: '\\u2717', // terminal failure\n cancelled: '\\u2298', // user-initiated abandonment\n aborted: '\\u23f9', // system-forced termination\n};\n\n/**\n * Stage status \u2192 Unicode progress icon.\n * Used wherever pipeline stage status is rendered to a terminal.\n */\nexport const STAGE_STATUS_ICONS: Record<StageStatus, string> = {\n not_started: '\\u23f9', // not yet entered\n in_progress: '\\u25b6', // actively running\n blocked: '\\u23f8', // paused / waiting\n completed: '\\u2713', // finished successfully\n skipped: '\\u23ed', // intentionally bypassed\n failed: '\\u2717', // terminal failure\n};\n\n/**\n * Task status \u2192 Unicode symbol (rich terminal / Unicode-enabled).\n * Falls back to TASK_STATUS_SYMBOLS_ASCII when Unicode is unavailable.\n */\nexport const TASK_STATUS_SYMBOLS_UNICODE: Record<TaskStatus, string> = {\n pending: '\\u25cb', // \u25CB not yet started\n active: '\\u25c9', // \u25C9 in progress\n blocked: '\\u2297', // \u2297 cannot advance\n done: '\\u2713', // \u2713 complete\n cancelled: '\\u2717', // \u2717 abandoned\n archived: '\\u25a3', // \u25A3 stored, inactive\n proposed: '\\u25c7', // \u25C7 tier-2 proposal queue (T946)\n};\n\n/**\n * Task status \u2192 ASCII fallback symbol (non-Unicode terminals, CI output).\n */\nexport const TASK_STATUS_SYMBOLS_ASCII: Record<TaskStatus, string> = {\n pending: '-',\n active: '*',\n blocked: 'x',\n done: '+',\n cancelled: '~',\n archived: '#',\n proposed: '?',\n};\n", "/**\n * TaskEvidence discriminated union \u2014 typed evidence references for verification records.\n *\n * Replaces free-text evidence fields in verification records with structured,\n * kind-specific evidence artifacts. Each variant carries a SHA-256 attachment\n * reference, a timestamp, and optional description.\n *\n * Five evidence kinds are supported:\n * - `file` \u2014 a file artifact (source file, output artifact, config)\n * - `log` \u2014 a log stream captured from a process\n * - `screenshot` \u2014 a visual capture (PNG/JPEG/WEBP)\n * - `test-output` \u2014 structured test-runner output\n * - `command-output` \u2014 raw stdout/stderr from a shell command\n *\n * @epic T760\n * @task T801\n * @see {@link AcceptanceGateResult} \u2014 `evidence` field\n */\n\nimport { z } from 'zod';\n\n// \u2500\u2500\u2500 Variant interfaces \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Evidence for a file artifact produced or inspected during verification.\n *\n * The `sha256` is the content hash of the file at capture time, used to\n * look up the blob in the attachment store.\n */\nexport interface FileEvidence {\n kind: 'file';\n /** SHA-256 hex digest of the file at capture time (attachment ref). */\n sha256: string;\n /** ISO 8601 timestamp when evidence was captured. */\n timestamp: string;\n /** Path to the file, relative to the project root. */\n path: string;\n /** IANA MIME type of the file (e.g. `\"text/typescript\"`, `\"application/pdf\"`). */\n mime?: string;\n /** Optional human-readable note about this evidence artifact. */\n description?: string;\n}\n\n/**\n * Evidence for a log stream captured from a running process.\n *\n * The `sha256` is the content hash of the captured log text.\n */\nexport interface LogEvidence {\n kind: 'log';\n /** SHA-256 hex digest of the captured log content. */\n sha256: string;\n /** ISO 8601 timestamp when evidence was captured. */\n timestamp: string;\n /**\n * Source process name or description (e.g. `\"pnpm test\"`, `\"node server.js\"`).\n */\n source: string;\n /** Optional human-readable note about this log artifact. */\n description?: string;\n}\n\n/**\n * Evidence for a screenshot or visual capture taken during verification.\n *\n * Used for manual gates and UI smoke tests. The `sha256` references the\n * image blob in the attachment store.\n */\nexport interface ScreenshotEvidence {\n kind: 'screenshot';\n /** SHA-256 hex digest of the image file. */\n sha256: string;\n /** ISO 8601 timestamp when evidence was captured. */\n timestamp: string;\n /**\n * MIME type of the image.\n *\n * @defaultValue \"image/png\"\n */\n mime?: 'image/png' | 'image/jpeg' | 'image/webp';\n /** Optional human-readable note (e.g. `\"dark mode toggle on macOS Chrome\"`). */\n description?: string;\n}\n\n/**\n * Evidence for structured test-runner output.\n *\n * Carries the summary metrics from the test run alongside the SHA-256\n * reference to the full output blob.\n */\nexport interface TestOutputEvidence {\n kind: 'test-output';\n /** SHA-256 hex digest of the full test-runner output. */\n sha256: string;\n /** ISO 8601 timestamp when evidence was captured. */\n timestamp: string;\n /** Number of tests that passed. */\n passed: number;\n /** Number of tests that failed. */\n failed: number;\n /** Number of tests skipped or pending. */\n skipped: number;\n /** Exit code of the test process. */\n exitCode: number;\n /** Optional human-readable note about the test run. */\n description?: string;\n}\n\n/**\n * Evidence for raw stdout/stderr output from a shell command.\n *\n * The `sha256` references the full output blob in the attachment store.\n */\nexport interface CommandOutputEvidence {\n kind: 'command-output';\n /** SHA-256 hex digest of the full command output. */\n sha256: string;\n /** ISO 8601 timestamp when evidence was captured. */\n timestamp: string;\n /** The command that was run (e.g. `\"pnpm run build\"`). */\n cmd: string;\n /** Exit code of the command process. */\n exitCode: number;\n /** Optional human-readable note about the command run. */\n description?: string;\n}\n\n// \u2500\u2500\u2500 Discriminated union \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * A typed evidence artifact attached to a verification record.\n *\n * Replaces the bare `evidence?: string` field on {@link AcceptanceGateResult}\n * with structured, kind-specific references backed by the attachment store.\n *\n * The `kind` field is the discriminant. All variants carry `sha256` (the\n * attachment store ref), `timestamp`, and optional `description`.\n *\n * @example\n * ```ts\n * const ev: TaskEvidence = {\n * kind: 'test-output',\n * sha256: 'a1b2c3...ff',\n * timestamp: '2026-04-15T10:00:00.000Z',\n * passed: 42,\n * failed: 0,\n * skipped: 2,\n * exitCode: 0,\n * };\n * ```\n */\nexport type TaskEvidence =\n | FileEvidence\n | LogEvidence\n | ScreenshotEvidence\n | TestOutputEvidence\n | CommandOutputEvidence;\n\n/** All valid `kind` discriminants for `TaskEvidence`. */\nexport type TaskEvidenceKind = TaskEvidence['kind'];\n\n// \u2500\u2500\u2500 Zod schemas \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Zod schema for {@link FileEvidence}. */\nexport const fileEvidenceSchema = z.object({\n kind: z.literal('file'),\n sha256: z.string().length(64),\n timestamp: z.string().datetime(),\n path: z.string().min(1),\n mime: z.string().optional(),\n description: z.string().optional(),\n});\n\n/** Zod schema for {@link LogEvidence}. */\nexport const logEvidenceSchema = z.object({\n kind: z.literal('log'),\n sha256: z.string().length(64),\n timestamp: z.string().datetime(),\n source: z.string().min(1),\n description: z.string().optional(),\n});\n\n/** Zod schema for {@link ScreenshotEvidence}. */\nexport const screenshotEvidenceSchema = z.object({\n kind: z.literal('screenshot'),\n sha256: z.string().length(64),\n timestamp: z.string().datetime(),\n mime: z.enum(['image/png', 'image/jpeg', 'image/webp']).optional(),\n description: z.string().optional(),\n});\n\n/** Zod schema for {@link TestOutputEvidence}. */\nexport const testOutputEvidenceSchema = z.object({\n kind: z.literal('test-output'),\n sha256: z.string().length(64),\n timestamp: z.string().datetime(),\n passed: z.number().int().nonnegative(),\n failed: z.number().int().nonnegative(),\n skipped: z.number().int().nonnegative(),\n exitCode: z.number().int(),\n description: z.string().optional(),\n});\n\n/** Zod schema for {@link CommandOutputEvidence}. */\nexport const commandOutputEvidenceSchema = z.object({\n kind: z.literal('command-output'),\n sha256: z.string().length(64),\n timestamp: z.string().datetime(),\n cmd: z.string().min(1),\n exitCode: z.number().int(),\n description: z.string().optional(),\n});\n\n/**\n * Zod discriminated-union schema for {@link TaskEvidence}.\n *\n * Uses `z.discriminatedUnion('kind', [...])` for O(1) variant lookup.\n *\n * @example\n * ```ts\n * const ev = taskEvidenceSchema.parse({\n * kind: 'command-output',\n * sha256: 'a'.repeat(64),\n * timestamp: '2026-04-15T10:00:00.000Z',\n * cmd: 'pnpm run build',\n * exitCode: 0,\n * });\n * ```\n */\nexport const taskEvidenceSchema = z.discriminatedUnion('kind', [\n fileEvidenceSchema,\n logEvidenceSchema,\n screenshotEvidenceSchema,\n testOutputEvidenceSchema,\n commandOutputEvidenceSchema,\n]);\n\n/** Inferred TypeScript type from {@link taskEvidenceSchema}. */\nexport type TaskEvidenceInput = z.input<typeof taskEvidenceSchema>;\n", "/**\n * @cleocode/contracts \u2014 Domain types, interfaces, and contracts for the CLEO ecosystem.\n *\n * This is the LEAF package in the dependency graph \u2014 ZERO runtime dependencies.\n * All domain types (Task, Session, DataAccessor, etc.) are defined here.\n * Implementation packages (@cleocode/core, @cleocode/cleo) import from here.\n */\n\n// === Acceptance Gate Types (machine-verifiable criteria) ===\nexport type {\n AcceptanceGate,\n AcceptanceGateKind,\n AcceptanceGateResult,\n CommandGate,\n FileAssertion,\n FileGate,\n GateBase,\n GateResultDetails,\n HttpGate,\n LintGate,\n ManualGate,\n TestGate,\n} from './acceptance-gate.js';\nexport type {\n AcceptanceArrayInput,\n AcceptanceGateResultInput,\n AcceptanceGateSchemaInput,\n AcceptanceItemInput,\n FileAssertionInput,\n GateResultDetailsInput,\n} from './acceptance-gate-schema.js';\n// === Acceptance Gate Zod Schemas (runtime validation) ===\nexport {\n acceptanceArraySchema,\n acceptanceGateResultSchema,\n acceptanceGateSchema,\n acceptanceItemSchema,\n commandGateSchema,\n fileAssertionSchema,\n fileGateSchema,\n gateBaseSchema,\n gateResultDetailsSchema,\n httpGateSchema,\n lintGateSchema,\n manualGateSchema,\n testGateSchema,\n} from './acceptance-gate-schema.js';\n// === Provider Adapter Contracts ===\nexport type { AdapterHealthStatus, CLEOProviderAdapter } from './adapter.js';\n// === Agent Registry (credential management) ===\nexport type {\n AgentCredential,\n AgentListFilter,\n AgentRegistryAPI,\n AgentWithProjectOverride,\n ProjectAgentRef,\n TransportConfig,\n} from './agent-registry.js';\n// === Agent Registry v3 (T889 / T897 \u2014 tier-aware resolution extensions) ===\nexport type {\n AgentDoctorCode,\n AgentDoctorFinding,\n AgentRegistryExtendedFields,\n AgentSkillSource,\n AgentSpawnCapability,\n AgentTier,\n DoctorReport,\n ResolvedAgent,\n} from './agent-registry-v3.js';\n// === Archive Types ===\nexport type {\n ArchiveCycleTimesReport,\n ArchiveDailyTrend,\n ArchivedTask,\n ArchiveLabelEntry,\n ArchiveMetadata,\n ArchiveMonthlyTrend,\n ArchivePhaseEntry,\n ArchivePriorityEntry,\n ArchiveReportType,\n ArchiveStatsEnvelope,\n ArchiveSummaryReport,\n ArchiveTrendsReport,\n CycleTimeDistribution,\n CycleTimePercentiles,\n} from './archive.js';\n// === Attachment Types ===\nexport type {\n Attachment,\n AttachmentKind,\n AttachmentMetadata,\n AttachmentRef,\n BlobAttachment,\n LlmsTxtAttachment,\n LlmtxtDocAttachment,\n LocalFileAttachment,\n UrlAttachment,\n} from './attachment.js';\n// === Attachment Zod Schemas (runtime validation) ===\nexport type {\n AttachmentMetadataSchemaInput,\n AttachmentRefSchemaInput,\n AttachmentSchemaInput,\n} from './attachment-schema.js';\nexport {\n attachmentMetadataSchema,\n attachmentRefSchema,\n attachmentSchema,\n blobAttachmentSchema,\n llmsTxtAttachmentSchema,\n llmtxtDocAttachmentSchema,\n localFileAttachmentSchema,\n urlAttachmentSchema,\n} from './attachment-schema.js';\n// === Backup Manifest Types ===\nexport type {\n BackupDatabaseEntry,\n BackupGlobalFileEntry,\n BackupIntegrity,\n BackupJsonEntry,\n BackupManifest,\n BackupMetadata,\n BackupScope,\n} from './backup-manifest.js';\n// === Brain/Memory Types ===\nexport type {\n BrainCognitiveType,\n BrainEntryRef,\n BrainEntrySummary,\n BrainMemoryTier,\n BrainSourceConfidence,\n ContradictionDetail,\n SupersededEntry,\n} from './brain.js';\nexport type { AdapterCapabilities } from './capabilities.js';\n// === Code Symbol Types (tree-sitter AST) ===\nexport type {\n BatchParseResult,\n CodeSymbol,\n CodeSymbolKind,\n ParseResult,\n} from './code-symbol.js';\n// === Conduit Protocol (agent-to-agent communication) ===\nexport type {\n Conduit,\n ConduitConfig,\n ConduitMessage,\n ConduitSendOptions,\n ConduitSendResult,\n ConduitState,\n ConduitStateChange,\n ConduitUnsubscribe,\n} from './conduit.js';\n// === Configuration Types ===\nexport type {\n BackupConfig,\n BrainConfig,\n BrainEmbeddingConfig,\n BrainLlmExtractionConfig,\n BrainMemoryBridgeConfig,\n BrainSummarizationConfig,\n BrainTieringConfig,\n ClaudeProviderConfig,\n ClaudeSpawnMode,\n CleoConfig,\n ConfigSource,\n DateFormat,\n EnforcementProfile,\n HierarchyConfig,\n LifecycleConfig,\n LifecycleEnforcementMode,\n LoggingConfig,\n LogLevel,\n OutputConfig,\n OutputFormat,\n ProviderConfig,\n ResolvedValue,\n SessionConfig,\n SessionSummaryInput,\n SharingConfig,\n SharingMode,\n SignalDockConfig,\n SignalDockMode,\n} from './config.js';\nexport type { AdapterContextMonitorProvider } from './context-monitor.js';\n// === DataAccessor Interface ===\nexport type {\n ArchiveFields,\n ArchiveFile,\n DataAccessor,\n DataAccessorAgentInstance,\n QueryTasksResult,\n TaskFieldUpdates,\n TaskQueryFilters,\n TransactionAccessor,\n} from './data-accessor.js';\n// === Dependency Registry Contracts ===\nexport type {\n DependencyCategory,\n DependencyCheckResult,\n DependencyReport,\n DependencySpec,\n} from './dependency.js';\nexport type { AdapterManifest, DetectionPattern } from './discovery.js';\n// === Error Utilities ===\nexport {\n createErrorResult,\n createSuccessResult,\n formatError,\n getErrorMessage,\n isErrorResult,\n isErrorType,\n normalizeError,\n ThinAgentViolationError,\n} from './errors.js';\n// === Evidence Record Types (IVTR typed proof artifacts) ===\nexport type {\n CommandOutputRecord,\n EvidenceRecord,\n EvidenceRecordKind,\n ImplDiffRecord,\n LintReportRecord,\n TestOutputRecord,\n ValidateSpecCheckRecord,\n} from './evidence-record.js';\nexport type {\n CommandOutputRecordInput,\n EvidenceRecordInput,\n ImplDiffRecordInput,\n LintReportRecordInput,\n TestOutputRecordInput,\n ValidateSpecCheckRecordInput,\n} from './evidence-record-schema.js';\n// === Evidence Record Zod Schemas (runtime validation) ===\nexport {\n commandOutputRecordSchema,\n evidenceRecordSchema,\n implDiffRecordSchema,\n lintReportRecordSchema,\n testOutputRecordSchema,\n validateSpecCheckRecordSchema,\n} from './evidence-record-schema.js';\n// === Exit Codes ===\nexport {\n ExitCode,\n getExitCodeName,\n isErrorCode,\n isNoChangeCode,\n isRecoverableCode,\n isSuccessCode,\n} from './exit-codes.js';\nexport type {\n AdminAPI,\n AgentCapacity,\n AgentHealthStatus,\n AgentInstanceRow,\n AgentInstanceStatus,\n AgentsAPI,\n AgentType,\n BlastRadius,\n BlastRadiusSeverity,\n BrainObservationType,\n CleoInitOptions,\n DuplicateStrategy,\n HybridSearchOptions,\n ImpactedTask,\n ImpactReport,\n ImportParams,\n IntelligenceAPI,\n LifecycleAPI,\n MemoryAPI,\n NexusAPI,\n OrchestrationAPI,\n RegisterAgentOptions,\n ReleaseAPI,\n SessionsAPI,\n StickyAPI,\n SyncAPI,\n TaskRollupPayload,\n TaskStartResult,\n TasksAPI,\n} from './facade.js';\n// === Facade API Interfaces ===\nexport {\n AGENT_INSTANCE_STATUSES,\n AGENT_TYPES,\n BRAIN_OBSERVATION_TYPES,\n} from './facade.js';\n// === Graph Intelligence Types (T512, T529) ===\nexport type {\n CommunityNode,\n GraphNode,\n GraphNodeKind,\n GraphRelation,\n GraphRelationType,\n ImpactResult,\n KnowledgeGraph,\n ProcessNode,\n SymbolIndex,\n} from './graph.js';\nexport type { AdapterHookProvider } from './hooks.js';\nexport type { AdapterInstallProvider, InstallOptions, InstallResult } from './install.js';\nexport type {\n CleoResponse,\n ConformanceReport,\n FlagInput,\n GatewayEnvelope,\n GatewayError,\n GatewayMeta,\n GatewaySuccess,\n LAFSEnvelope,\n LAFSError,\n LAFSErrorCategory,\n LAFSMeta,\n LAFSPage,\n LAFSPageNone,\n LAFSPageOffset,\n LAFSTransport,\n LafsAlternative,\n LafsEnvelope,\n LafsError,\n LafsErrorDetail,\n LafsSuccess,\n MVILevel,\n Warning,\n} from './lafs.js';\n// === LAFS Envelope Types ===\nexport {\n isGatewayEnvelope,\n isLafsError,\n isLafsSuccess,\n} from './lafs.js';\nexport type {\n BridgeDecision,\n BridgeLearning,\n BridgeObservation,\n BridgePattern,\n MemoryBridgeConfig,\n MemoryBridgeContent,\n SessionSummary,\n} from './memory.js';\n// === Operations Types (API wire format, namespaced to avoid collision with domain types) ===\nexport * as ops from './operations/index.js';\n// Commonly used ops types re-exported at top level for convenience\nexport type { BrainState } from './operations/orchestrate.js';\n// ParamDef contract \u2014 re-exported at top level (SSoT for all operation param descriptors)\nexport type {\n CittyArgDef,\n OperationParams,\n ParamCliDef,\n ParamDef,\n ParamType,\n} from './operations/params.js';\nexport { paramsToCittyArgs } from './operations/params.js';\n// === Orchestration Hierarchy ===\nexport {\n type AgentHierarchy,\n type AgentHierarchyEntry,\n type EscalationChain,\n type OrchestrationHierarchyAPI,\n OrchestrationLevel,\n} from './orchestration-hierarchy.js';\n// === Playbook DSL Types (T889 / T904 / W4-6) ===\nexport type {\n PlaybookAgenticNode,\n PlaybookApproval,\n PlaybookApprovalNode,\n PlaybookApprovalStatus,\n PlaybookDefinition,\n PlaybookDeterministicNode,\n PlaybookEdge,\n PlaybookEnsures,\n PlaybookErrorHandler,\n PlaybookInput,\n PlaybookNode,\n PlaybookNodeBase,\n PlaybookNodeOnFailure,\n PlaybookNodeType,\n PlaybookPolicy,\n PlaybookRequires,\n PlaybookRun,\n PlaybookRunStatus,\n} from './playbook.js';\nexport type { AdapterPathProvider } from './provider-paths.js';\n// === Result Types (Dashboard, Stats, Log, Context, Sequence, Analysis, Deps) ===\nexport type {\n BottleneckTask,\n CompleteTaskUnblocked,\n ContextResult,\n DashboardResult,\n LabelCount,\n LeveragedTask,\n LogQueryResult,\n SequenceResult,\n StatsActivityMetrics,\n StatsAllTime,\n StatsCompletionMetrics,\n StatsCurrentState,\n StatsCycleTimes,\n StatsResult,\n TaskAnalysisResult,\n TaskDepsResult,\n TaskRef,\n TaskRefPriority,\n TaskSummary,\n} from './results.js';\n// === Sentient Tier-2 Types (T1008) ===\nexport type {\n ProposalCandidate,\n ProposalSource,\n ProposedTaskMeta,\n Tier2Stats,\n} from './sentient.js';\n// === Session Start Result ===\nexport type {\n Session,\n SessionScope,\n SessionStartResult,\n SessionStats,\n SessionTaskWork,\n} from './session.js';\n// === Session Types ===\nexport { SessionView } from './session.js';\nexport type { AdapterSpawnProvider, SpawnContext, SpawnResult } from './spawn.js';\n// === CLEO Spawn Types (distinct from adapter spawn) ===\nexport type {\n CAAMPSpawnOptions,\n CAAMPSpawnResult,\n CLEOSpawnAdapter,\n CLEOSpawnContext,\n CLEOSpawnResult,\n Provider,\n SpawnStatus,\n TokenResolution,\n} from './spawn-types.js';\n// === Status Registry (MUST be first \u2014 everything depends on this) ===\nexport {\n ADR_STATUSES,\n type AdrStatus,\n // Registry\n type EntityType,\n GATE_STATUSES,\n type GateStatus,\n isValidStatus,\n LIFECYCLE_PIPELINE_STATUSES,\n LIFECYCLE_STAGE_STATUSES,\n MANIFEST_STATUSES,\n type ManifestStatus,\n // Display icons\n PIPELINE_STATUS_ICONS,\n type PipelineStatus,\n SESSION_STATUSES,\n type SessionStatus,\n STAGE_STATUS_ICONS,\n STATUS_REGISTRY,\n type StageStatus,\n TASK_STATUS_SYMBOLS_ASCII,\n TASK_STATUS_SYMBOLS_UNICODE,\n // Constants\n TASK_STATUSES,\n // Derived types\n type TaskStatus,\n TERMINAL_PIPELINE_STATUSES,\n TERMINAL_STAGE_STATUSES,\n // Terminal state sets\n TERMINAL_TASK_STATUSES,\n} from './status-registry.js';\n// === Task Types ===\nexport type {\n AcceptanceItem,\n CancelledTask,\n CompletedTask,\n EpicLifecycle,\n EvidenceAtom,\n FileMeta,\n GateEvidence,\n Phase,\n PhaseStatus,\n PhaseTransition,\n ProjectMeta,\n Release,\n ReleaseStatus,\n SessionNote,\n Task,\n TaskCreate,\n TaskOrigin,\n TaskPriority,\n TaskProvenance,\n TaskRelation,\n // T944 new axes\n TaskRole,\n TaskScope,\n TaskSeverity,\n TaskSize,\n TaskType,\n TaskVerification,\n TaskWorkState,\n VerificationAgent,\n VerificationFailure,\n VerificationGate,\n} from './task.js';\n// === Task Evidence Types (T801) ===\nexport type {\n CommandOutputEvidence,\n FileEvidence,\n LogEvidence,\n ScreenshotEvidence,\n TaskEvidence,\n TaskEvidenceInput,\n TaskEvidenceKind,\n TestOutputEvidence,\n} from './task-evidence.js';\nexport {\n commandOutputEvidenceSchema,\n fileEvidenceSchema,\n logEvidenceSchema,\n screenshotEvidenceSchema,\n taskEvidenceSchema,\n testOutputEvidenceSchema,\n} from './task-evidence.js';\n// === TaskRecord Types (string-widened for dispatch/LAFS) ===\nexport type {\n MinimalTaskRecord,\n TaskRecord,\n TaskRecordRelation,\n ValidationHistoryEntry,\n} from './task-record.js';\n// === Task Sync Types (provider-agnostic reconciliation) ===\nexport type {\n ConflictPolicy,\n ExternalLinkType,\n ExternalTask,\n ExternalTaskLink,\n ExternalTaskProvider,\n ExternalTaskStatus,\n ReconcileAction,\n ReconcileActionType,\n ReconcileOptions,\n ReconcileResult,\n SyncDirection,\n} from './task-sync.js';\n// === Tessera Types ===\nexport type {\n TesseraInstantiationInput,\n TesseraTemplate,\n TesseraVariable,\n} from './tessera.js';\n// === Transport (low-level wire protocol) ===\nexport type {\n AdapterTransportProvider,\n Transport,\n TransportConnectConfig,\n} from './transport.js';\n// === WarpChain Types ===\nexport type {\n ChainShape,\n ChainValidation,\n GateCheck,\n GateContract,\n GateName,\n GateResult,\n ProtocolType,\n WarpChain,\n WarpChainExecution,\n WarpChainInstance,\n WarpLink,\n WarpStage,\n} from './warp-chain.js';\n// === WASM SDK (Rust crate bindings) ===\n", "/**\n * Unified Error Catalog -- single source of truth for all CLEO error definitions.\n *\n * Merges previously scattered error registries into one canonical catalog\n * keyed by ExitCode.\n *\n * Consumers should import from here instead of the legacy registries.\n *\n * @task T5240\n */\n\nimport { ExitCode } from '@cleocode/contracts';\nimport type { LAFSErrorCategory } from '@cleocode/lafs';\n\n/**\n * A single entry in the unified error catalog.\n */\nexport interface ErrorDefinition {\n /** Numeric exit code from ExitCode enum. */\n code: number;\n /** Machine-readable name (matches ExitCode enum key). */\n name: string;\n /** LAFS error category for protocol conformance. */\n category: LAFSErrorCategory;\n /** Default human-readable message. */\n message: string;\n /** Default fix suggestion (copy-paste command or instruction). */\n fix?: string;\n /** HTTP status code for API responses. */\n httpStatus: number;\n /** Whether retry may succeed. */\n recoverable: boolean;\n /** LAFS-style string error code (E_CLEO_*). */\n lafsCode: string;\n}\n\nfunction def(\n code: ExitCode,\n name: string,\n category: LAFSErrorCategory,\n message: string,\n httpStatus: number,\n recoverable: boolean,\n lafsCode: string,\n fix?: string,\n): ErrorDefinition {\n return { code, name, category, message, httpStatus, recoverable, lafsCode, fix };\n}\n\n/**\n * The unified error catalog. Keyed by numeric ExitCode value.\n */\nexport const ERROR_CATALOG: ReadonlyMap<number, ErrorDefinition> = new Map<number, ErrorDefinition>(\n [\n // === SUCCESS (0) ===\n [\n ExitCode.SUCCESS,\n def(ExitCode.SUCCESS, 'SUCCESS', 'INTERNAL', 'Success', 200, false, 'E_CLEO_SUCCESS'),\n ],\n\n // === GENERAL ERRORS (1-9) ===\n [\n ExitCode.GENERAL_ERROR,\n def(\n ExitCode.GENERAL_ERROR,\n 'GENERAL_ERROR',\n 'INTERNAL',\n 'General error',\n 500,\n true,\n 'E_CLEO_GENERAL',\n 'Check command syntax and parameters',\n ),\n ],\n [\n ExitCode.INVALID_INPUT,\n def(\n ExitCode.INVALID_INPUT,\n 'INVALID_INPUT',\n 'VALIDATION',\n 'Invalid input',\n 400,\n false,\n 'E_CLEO_INVALID_INPUT',\n 'Verify command parameters',\n ),\n ],\n [\n ExitCode.FILE_ERROR,\n def(\n ExitCode.FILE_ERROR,\n 'FILE_ERROR',\n 'INTERNAL',\n 'File system error',\n 500,\n false,\n 'E_CLEO_FILE_ERROR',\n 'Check file permissions and disk space',\n ),\n ],\n [\n ExitCode.NOT_FOUND,\n def(\n ExitCode.NOT_FOUND,\n 'NOT_FOUND',\n 'NOT_FOUND',\n 'Task or resource not found',\n 404,\n false,\n 'E_CLEO_NOT_FOUND',\n ),\n ],\n [\n ExitCode.DEPENDENCY_ERROR,\n def(\n ExitCode.DEPENDENCY_ERROR,\n 'DEPENDENCY_ERROR',\n 'VALIDATION',\n 'Dependency error',\n 422,\n false,\n 'E_CLEO_DEPENDENCY',\n ),\n ],\n [\n ExitCode.VALIDATION_ERROR,\n def(\n ExitCode.VALIDATION_ERROR,\n 'VALIDATION_ERROR',\n 'VALIDATION',\n 'Validation error',\n 422,\n false,\n 'E_CLEO_VALIDATION',\n ),\n ],\n [\n ExitCode.LOCK_TIMEOUT,\n def(\n ExitCode.LOCK_TIMEOUT,\n 'LOCK_TIMEOUT',\n 'CONFLICT',\n 'File lock timeout',\n 409,\n true,\n 'E_CLEO_LOCK_TIMEOUT',\n 'Wait for concurrent operation to complete, then retry',\n ),\n ],\n [\n ExitCode.CONFIG_ERROR,\n def(\n ExitCode.CONFIG_ERROR,\n 'CONFIG_ERROR',\n 'VALIDATION',\n 'Configuration error',\n 422,\n false,\n 'E_CLEO_CONFIG',\n 'Check configuration file: .cleo/config.json',\n ),\n ],\n\n // === HIERARCHY ERRORS (10-19) ===\n [\n ExitCode.PARENT_NOT_FOUND,\n def(\n ExitCode.PARENT_NOT_FOUND,\n 'PARENT_NOT_FOUND',\n 'NOT_FOUND',\n 'Parent task not found',\n 404,\n false,\n 'E_CLEO_PARENT_NOT_FOUND',\n 'Create parent task first or remove --parent flag',\n ),\n ],\n [\n ExitCode.DEPTH_EXCEEDED,\n def(\n ExitCode.DEPTH_EXCEEDED,\n 'DEPTH_EXCEEDED',\n 'VALIDATION',\n 'Max hierarchy depth exceeded',\n 422,\n false,\n 'E_CLEO_DEPTH_EXCEEDED',\n ),\n ],\n [\n ExitCode.SIBLING_LIMIT,\n def(\n ExitCode.SIBLING_LIMIT,\n 'SIBLING_LIMIT',\n 'VALIDATION',\n 'Max sibling count exceeded',\n 422,\n false,\n 'E_CLEO_SIBLING_LIMIT',\n ),\n ],\n [\n ExitCode.INVALID_PARENT_TYPE,\n def(\n ExitCode.INVALID_PARENT_TYPE,\n 'INVALID_PARENT_TYPE',\n 'VALIDATION',\n 'Invalid parent task type',\n 422,\n false,\n 'E_CLEO_INVALID_PARENT_TYPE',\n ),\n ],\n [\n ExitCode.CIRCULAR_REFERENCE,\n def(\n ExitCode.CIRCULAR_REFERENCE,\n 'CIRCULAR_REFERENCE',\n 'VALIDATION',\n 'Circular dependency detected',\n 422,\n false,\n 'E_CLEO_CIRCULAR_REF',\n ),\n ],\n [\n ExitCode.ORPHAN_DETECTED,\n def(\n ExitCode.ORPHAN_DETECTED,\n 'ORPHAN_DETECTED',\n 'VALIDATION',\n 'Orphan task detected',\n 422,\n false,\n 'E_CLEO_ORPHAN',\n ),\n ],\n [\n ExitCode.HAS_CHILDREN,\n def(\n ExitCode.HAS_CHILDREN,\n 'HAS_CHILDREN',\n 'CONFLICT',\n 'Task has children',\n 409,\n false,\n 'E_CLEO_HAS_CHILDREN',\n ),\n ],\n [\n ExitCode.TASK_COMPLETED,\n def(\n ExitCode.TASK_COMPLETED,\n 'TASK_COMPLETED',\n 'CONFLICT',\n 'Task already completed',\n 409,\n false,\n 'E_CLEO_TASK_COMPLETED',\n ),\n ],\n [\n ExitCode.CASCADE_FAILED,\n def(\n ExitCode.CASCADE_FAILED,\n 'CASCADE_FAILED',\n 'INTERNAL',\n 'Cascade operation failed',\n 500,\n false,\n 'E_CLEO_CASCADE_FAILED',\n ),\n ],\n [\n ExitCode.HAS_DEPENDENTS,\n def(\n ExitCode.HAS_DEPENDENTS,\n 'HAS_DEPENDENTS',\n 'CONFLICT',\n 'Task has dependents',\n 409,\n false,\n 'E_CLEO_HAS_DEPENDENTS',\n ),\n ],\n\n // === CONCURRENCY ERRORS (20-29) ===\n [\n ExitCode.CHECKSUM_MISMATCH,\n def(\n ExitCode.CHECKSUM_MISMATCH,\n 'CHECKSUM_MISMATCH',\n 'CONFLICT',\n 'Checksum mismatch',\n 409,\n true,\n 'E_CLEO_CHECKSUM_MISMATCH',\n ),\n ],\n [\n ExitCode.CONCURRENT_MODIFICATION,\n def(\n ExitCode.CONCURRENT_MODIFICATION,\n 'CONCURRENT_MODIFICATION',\n 'CONFLICT',\n 'Concurrent modification',\n 409,\n true,\n 'E_CLEO_CONCURRENT_MOD',\n ),\n ],\n [\n ExitCode.ID_COLLISION,\n def(\n ExitCode.ID_COLLISION,\n 'ID_COLLISION',\n 'CONFLICT',\n 'ID collision',\n 409,\n true,\n 'E_CLEO_ID_COLLISION',\n ),\n ],\n\n // === SESSION ERRORS (30-39) ===\n [\n ExitCode.SESSION_EXISTS,\n def(\n ExitCode.SESSION_EXISTS,\n 'SESSION_EXISTS',\n 'CONFLICT',\n 'Session already exists',\n 409,\n false,\n 'E_CLEO_SESSION_EXISTS',\n ),\n ],\n [\n ExitCode.SESSION_NOT_FOUND,\n def(\n ExitCode.SESSION_NOT_FOUND,\n 'SESSION_NOT_FOUND',\n 'NOT_FOUND',\n 'Session not found',\n 404,\n false,\n 'E_CLEO_SESSION_NOT_FOUND',\n ),\n ],\n [\n ExitCode.SCOPE_CONFLICT,\n def(\n ExitCode.SCOPE_CONFLICT,\n 'SCOPE_CONFLICT',\n 'CONFLICT',\n 'Session scope conflict',\n 409,\n false,\n 'E_CLEO_SCOPE_CONFLICT',\n ),\n ],\n [\n ExitCode.SCOPE_INVALID,\n def(\n ExitCode.SCOPE_INVALID,\n 'SCOPE_INVALID',\n 'VALIDATION',\n 'Invalid scope',\n 422,\n false,\n 'E_CLEO_SCOPE_INVALID',\n ),\n ],\n [\n ExitCode.TASK_NOT_IN_SCOPE,\n def(\n ExitCode.TASK_NOT_IN_SCOPE,\n 'TASK_NOT_IN_SCOPE',\n 'VALIDATION',\n 'Task not in session scope',\n 422,\n false,\n 'E_CLEO_TASK_NOT_IN_SCOPE',\n ),\n ],\n [\n ExitCode.TASK_CLAIMED,\n def(\n ExitCode.TASK_CLAIMED,\n 'TASK_CLAIMED',\n 'CONFLICT',\n 'Task claimed by another session',\n 409,\n false,\n 'E_CLEO_TASK_CLAIMED',\n ),\n ],\n [\n ExitCode.SESSION_REQUIRED,\n def(\n ExitCode.SESSION_REQUIRED,\n 'SESSION_REQUIRED',\n 'CONTRACT',\n 'Active session required',\n 428,\n false,\n 'E_CLEO_SESSION_REQUIRED',\n ),\n ],\n [\n ExitCode.SESSION_CLOSE_BLOCKED,\n def(\n ExitCode.SESSION_CLOSE_BLOCKED,\n 'SESSION_CLOSE_BLOCKED',\n 'CONFLICT',\n 'Session close blocked',\n 409,\n false,\n 'E_CLEO_SESSION_CLOSE_BLOCKED',\n ),\n ],\n [\n ExitCode.ACTIVE_TASK_REQUIRED,\n def(\n ExitCode.ACTIVE_TASK_REQUIRED,\n 'ACTIVE_TASK_REQUIRED',\n 'CONTRACT',\n 'Active task required',\n 428,\n false,\n 'E_CLEO_ACTIVE_TASK_REQUIRED',\n ),\n ],\n [\n ExitCode.NOTES_REQUIRED,\n def(\n ExitCode.NOTES_REQUIRED,\n 'NOTES_REQUIRED',\n 'VALIDATION',\n 'Notes required',\n 422,\n false,\n 'E_CLEO_NOTES_REQUIRED',\n ),\n ],\n\n // === VERIFICATION ERRORS (40-47) ===\n [\n ExitCode.VERIFICATION_INIT_FAILED,\n def(\n ExitCode.VERIFICATION_INIT_FAILED,\n 'VERIFICATION_INIT_FAILED',\n 'VALIDATION',\n 'Verification initialization failed',\n 422,\n false,\n 'E_CLEO_VERIFICATION_INIT_FAILED',\n ),\n ],\n [\n ExitCode.GATE_UPDATE_FAILED,\n def(\n ExitCode.GATE_UPDATE_FAILED,\n 'GATE_UPDATE_FAILED',\n 'VALIDATION',\n 'Gate update failed',\n 422,\n false,\n 'E_CLEO_GATE_UPDATE_FAILED',\n ),\n ],\n [\n ExitCode.INVALID_GATE,\n def(\n ExitCode.INVALID_GATE,\n 'INVALID_GATE',\n 'VALIDATION',\n 'Invalid gate name',\n 422,\n false,\n 'E_CLEO_INVALID_GATE',\n ),\n ],\n [\n ExitCode.INVALID_AGENT,\n def(\n ExitCode.INVALID_AGENT,\n 'INVALID_AGENT',\n 'VALIDATION',\n 'Invalid agent name',\n 422,\n false,\n 'E_CLEO_INVALID_AGENT',\n ),\n ],\n [\n ExitCode.MAX_ROUNDS_EXCEEDED,\n def(\n ExitCode.MAX_ROUNDS_EXCEEDED,\n 'MAX_ROUNDS_EXCEEDED',\n 'VALIDATION',\n 'Maximum implementation rounds exceeded',\n 422,\n false,\n 'E_CLEO_MAX_ROUNDS_EXCEEDED',\n ),\n ],\n [\n ExitCode.GATE_DEPENDENCY,\n def(\n ExitCode.GATE_DEPENDENCY,\n 'GATE_DEPENDENCY',\n 'VALIDATION',\n 'Gate dependency not met',\n 422,\n false,\n 'E_CLEO_GATE_DEPENDENCY',\n ),\n ],\n [\n ExitCode.VERIFICATION_LOCKED,\n def(\n ExitCode.VERIFICATION_LOCKED,\n 'VERIFICATION_LOCKED',\n 'CONFLICT',\n 'Verification locked',\n 409,\n false,\n 'E_CLEO_VERIFICATION_LOCKED',\n ),\n ],\n [\n ExitCode.ROUND_MISMATCH,\n def(\n ExitCode.ROUND_MISMATCH,\n 'ROUND_MISMATCH',\n 'VALIDATION',\n 'Round number mismatch',\n 422,\n false,\n 'E_CLEO_ROUND_MISMATCH',\n ),\n ],\n\n // === CONTEXT SAFEGUARD (50-54) ===\n [\n ExitCode.CONTEXT_WARNING,\n def(\n ExitCode.CONTEXT_WARNING,\n 'CONTEXT_WARNING',\n 'CONTRACT',\n 'Context warning threshold reached',\n 429,\n false,\n 'E_CLEO_CONTEXT_WARNING',\n ),\n ],\n [\n ExitCode.CONTEXT_CAUTION,\n def(\n ExitCode.CONTEXT_CAUTION,\n 'CONTEXT_CAUTION',\n 'CONTRACT',\n 'Context caution threshold reached',\n 429,\n false,\n 'E_CLEO_CONTEXT_CAUTION',\n ),\n ],\n [\n ExitCode.CONTEXT_CRITICAL,\n def(\n ExitCode.CONTEXT_CRITICAL,\n 'CONTEXT_CRITICAL',\n 'CONTRACT',\n 'Context critical threshold reached',\n 429,\n false,\n 'E_CLEO_CONTEXT_CRITICAL',\n ),\n ],\n [\n ExitCode.CONTEXT_EMERGENCY,\n def(\n ExitCode.CONTEXT_EMERGENCY,\n 'CONTEXT_EMERGENCY',\n 'CONTRACT',\n 'Context emergency threshold reached',\n 429,\n false,\n 'E_CLEO_CONTEXT_EMERGENCY',\n ),\n ],\n [\n ExitCode.CONTEXT_STALE,\n def(\n ExitCode.CONTEXT_STALE,\n 'CONTEXT_STALE',\n 'CONTRACT',\n 'Context state file is stale',\n 429,\n false,\n 'E_CLEO_CONTEXT_STALE',\n ),\n ],\n\n // === ORCHESTRATOR ERRORS (60-67) ===\n [\n ExitCode.PROTOCOL_MISSING,\n def(\n ExitCode.PROTOCOL_MISSING,\n 'PROTOCOL_MISSING',\n 'CONTRACT',\n 'Protocol missing',\n 422,\n false,\n 'E_CLEO_PROTOCOL_MISSING',\n ),\n ],\n [\n ExitCode.INVALID_RETURN_MESSAGE,\n def(\n ExitCode.INVALID_RETURN_MESSAGE,\n 'INVALID_RETURN_MESSAGE',\n 'CONTRACT',\n 'Invalid return message',\n 422,\n false,\n 'E_CLEO_INVALID_RETURN',\n ),\n ],\n [\n ExitCode.MANIFEST_ENTRY_MISSING,\n def(\n ExitCode.MANIFEST_ENTRY_MISSING,\n 'MANIFEST_ENTRY_MISSING',\n 'CONTRACT',\n 'Manifest entry missing',\n 422,\n false,\n 'E_CLEO_MANIFEST_MISSING',\n ),\n ],\n [\n ExitCode.SPAWN_VALIDATION_FAILED,\n def(\n ExitCode.SPAWN_VALIDATION_FAILED,\n 'SPAWN_VALIDATION_FAILED',\n 'VALIDATION',\n 'Spawn validation failed',\n 422,\n true,\n 'E_CLEO_SPAWN_FAILED',\n ),\n ],\n [\n ExitCode.AUTONOMOUS_BOUNDARY,\n def(\n ExitCode.AUTONOMOUS_BOUNDARY,\n 'AUTONOMOUS_BOUNDARY',\n 'CONTRACT',\n 'Autonomous boundary reached',\n 403,\n false,\n 'E_CLEO_AUTONOMOUS_BOUNDARY',\n ),\n ],\n [\n ExitCode.HANDOFF_REQUIRED,\n def(\n ExitCode.HANDOFF_REQUIRED,\n 'HANDOFF_REQUIRED',\n 'CONTRACT',\n 'Human handoff required',\n 403,\n false,\n 'E_CLEO_HANDOFF_REQUIRED',\n ),\n ],\n [\n ExitCode.RESUME_FAILED,\n def(\n ExitCode.RESUME_FAILED,\n 'RESUME_FAILED',\n 'INTERNAL',\n 'Session resume failed',\n 500,\n true,\n 'E_CLEO_RESUME_FAILED',\n ),\n ],\n [\n ExitCode.CONCURRENT_SESSION,\n def(\n ExitCode.CONCURRENT_SESSION,\n 'CONCURRENT_SESSION',\n 'CONFLICT',\n 'Concurrent session detected',\n 409,\n false,\n 'E_CLEO_CONCURRENT_SESSION',\n ),\n ],\n\n // === NEXUS ERRORS (70-79) ===\n [\n ExitCode.NEXUS_NOT_INITIALIZED,\n def(\n ExitCode.NEXUS_NOT_INITIALIZED,\n 'NEXUS_NOT_INITIALIZED',\n 'INTERNAL',\n 'Nexus not initialized',\n 500,\n false,\n 'E_CLEO_NEXUS_NOT_INITIALIZED',\n 'Initialize Nexus: cleo nexus init',\n ),\n ],\n [\n ExitCode.NEXUS_PROJECT_NOT_FOUND,\n def(\n ExitCode.NEXUS_PROJECT_NOT_FOUND,\n 'NEXUS_PROJECT_NOT_FOUND',\n 'NOT_FOUND',\n 'Project not found in global registry',\n 404,\n false,\n 'E_CLEO_NEXUS_PROJECT_NOT_FOUND',\n ),\n ],\n [\n ExitCode.NEXUS_PERMISSION_DENIED,\n def(\n ExitCode.NEXUS_PERMISSION_DENIED,\n 'NEXUS_PERMISSION_DENIED',\n 'PERMISSION',\n 'Insufficient permission for cross-project operation',\n 403,\n false,\n 'E_CLEO_NEXUS_PERMISSION_DENIED',\n ),\n ],\n [\n ExitCode.NEXUS_INVALID_SYNTAX,\n def(\n ExitCode.NEXUS_INVALID_SYNTAX,\n 'NEXUS_INVALID_SYNTAX',\n 'VALIDATION',\n 'Invalid task reference syntax',\n 422,\n false,\n 'E_CLEO_NEXUS_INVALID_SYNTAX',\n ),\n ],\n [\n ExitCode.NEXUS_SYNC_FAILED,\n def(\n ExitCode.NEXUS_SYNC_FAILED,\n 'NEXUS_SYNC_FAILED',\n 'TRANSIENT',\n 'Failed to sync project metadata',\n 503,\n true,\n 'E_CLEO_NEXUS_SYNC_FAILED',\n ),\n ],\n [\n ExitCode.NEXUS_REGISTRY_CORRUPT,\n def(\n ExitCode.NEXUS_REGISTRY_CORRUPT,\n 'NEXUS_REGISTRY_CORRUPT',\n 'INTERNAL',\n 'Nexus registry corrupted',\n 500,\n false,\n 'E_CLEO_NEXUS_REGISTRY_CORRUPT',\n ),\n ],\n [\n ExitCode.NEXUS_PROJECT_EXISTS,\n def(\n ExitCode.NEXUS_PROJECT_EXISTS,\n 'NEXUS_PROJECT_EXISTS',\n 'CONFLICT',\n 'Project already registered',\n 409,\n false,\n 'E_CLEO_NEXUS_PROJECT_EXISTS',\n ),\n ],\n [\n ExitCode.NEXUS_QUERY_FAILED,\n def(\n ExitCode.NEXUS_QUERY_FAILED,\n 'NEXUS_QUERY_FAILED',\n 'TRANSIENT',\n 'Cross-project query failed',\n 503,\n true,\n 'E_CLEO_NEXUS_QUERY_FAILED',\n ),\n ],\n [\n ExitCode.NEXUS_GRAPH_ERROR,\n def(\n ExitCode.NEXUS_GRAPH_ERROR,\n 'NEXUS_GRAPH_ERROR',\n 'INTERNAL',\n 'Graph operation error',\n 500,\n true,\n 'E_CLEO_NEXUS_GRAPH_ERROR',\n ),\n ],\n [\n ExitCode.NEXUS_RESERVED,\n def(\n ExitCode.NEXUS_RESERVED,\n 'NEXUS_RESERVED',\n 'INTERNAL',\n 'Reserved nexus code',\n 500,\n false,\n 'E_CLEO_NEXUS_RESERVED',\n ),\n ],\n\n // === LIFECYCLE ENFORCEMENT (80-84) ===\n [\n ExitCode.LIFECYCLE_GATE_FAILED,\n def(\n ExitCode.LIFECYCLE_GATE_FAILED,\n 'LIFECYCLE_GATE_FAILED',\n 'CONTRACT',\n 'Lifecycle gate failed',\n 422,\n false,\n 'E_CLEO_LIFECYCLE_GATE',\n ),\n ],\n [\n ExitCode.AUDIT_MISSING,\n def(\n ExitCode.AUDIT_MISSING,\n 'AUDIT_MISSING',\n 'CONTRACT',\n 'Audit trail missing',\n 422,\n false,\n 'E_CLEO_AUDIT_MISSING',\n ),\n ],\n [\n ExitCode.CIRCULAR_VALIDATION,\n def(\n ExitCode.CIRCULAR_VALIDATION,\n 'CIRCULAR_VALIDATION',\n 'CONTRACT',\n 'Circular validation detected',\n 422,\n false,\n 'E_CLEO_CIRCULAR_VALIDATION',\n ),\n ],\n [\n ExitCode.LIFECYCLE_TRANSITION_INVALID,\n def(\n ExitCode.LIFECYCLE_TRANSITION_INVALID,\n 'LIFECYCLE_TRANSITION_INVALID',\n 'CONTRACT',\n 'Invalid lifecycle transition',\n 422,\n false,\n 'E_CLEO_LIFECYCLE_INVALID',\n ),\n ],\n [\n ExitCode.PROVENANCE_REQUIRED,\n def(\n ExitCode.PROVENANCE_REQUIRED,\n 'PROVENANCE_REQUIRED',\n 'CONTRACT',\n 'Provenance metadata required',\n 422,\n false,\n 'E_CLEO_PROVENANCE_REQUIRED',\n ),\n ],\n\n // === ARTIFACT PUBLISH (85-89) ===\n [\n ExitCode.ARTIFACT_TYPE_UNKNOWN,\n def(\n ExitCode.ARTIFACT_TYPE_UNKNOWN,\n 'ARTIFACT_TYPE_UNKNOWN',\n 'VALIDATION',\n 'Unknown artifact type',\n 422,\n false,\n 'E_CLEO_ARTIFACT_TYPE_UNKNOWN',\n ),\n ],\n [\n ExitCode.ARTIFACT_VALIDATION_FAILED,\n def(\n ExitCode.ARTIFACT_VALIDATION_FAILED,\n 'ARTIFACT_VALIDATION_FAILED',\n 'VALIDATION',\n 'Artifact validation failed',\n 422,\n false,\n 'E_CLEO_ARTIFACT_VALIDATION_FAILED',\n ),\n ],\n [\n ExitCode.ARTIFACT_BUILD_FAILED,\n def(\n ExitCode.ARTIFACT_BUILD_FAILED,\n 'ARTIFACT_BUILD_FAILED',\n 'INTERNAL',\n 'Artifact build failed',\n 500,\n true,\n 'E_CLEO_ARTIFACT_BUILD_FAILED',\n ),\n ],\n [\n ExitCode.ARTIFACT_PUBLISH_FAILED,\n def(\n ExitCode.ARTIFACT_PUBLISH_FAILED,\n 'ARTIFACT_PUBLISH_FAILED',\n 'INTERNAL',\n 'Artifact publish failed',\n 500,\n true,\n 'E_CLEO_ARTIFACT_PUBLISH_FAILED',\n ),\n ],\n [\n ExitCode.ARTIFACT_ROLLBACK_FAILED,\n def(\n ExitCode.ARTIFACT_ROLLBACK_FAILED,\n 'ARTIFACT_ROLLBACK_FAILED',\n 'INTERNAL',\n 'Artifact rollback failed',\n 500,\n false,\n 'E_CLEO_ARTIFACT_ROLLBACK_FAILED',\n ),\n ],\n\n // === PROVENANCE (90-94) ===\n [\n ExitCode.PROVENANCE_CONFIG_INVALID,\n def(\n ExitCode.PROVENANCE_CONFIG_INVALID,\n 'PROVENANCE_CONFIG_INVALID',\n 'VALIDATION',\n 'Provenance config invalid',\n 422,\n false,\n 'E_CLEO_PROVENANCE_CONFIG_INVALID',\n ),\n ],\n [\n ExitCode.SIGNING_KEY_MISSING,\n def(\n ExitCode.SIGNING_KEY_MISSING,\n 'SIGNING_KEY_MISSING',\n 'VALIDATION',\n 'Signing key missing',\n 422,\n false,\n 'E_CLEO_SIGNING_KEY_MISSING',\n ),\n ],\n [\n ExitCode.SIGNATURE_INVALID,\n def(\n ExitCode.SIGNATURE_INVALID,\n 'SIGNATURE_INVALID',\n 'VALIDATION',\n 'Signature invalid',\n 422,\n false,\n 'E_CLEO_SIGNATURE_INVALID',\n ),\n ],\n [\n ExitCode.DIGEST_MISMATCH,\n def(\n ExitCode.DIGEST_MISMATCH,\n 'DIGEST_MISMATCH',\n 'VALIDATION',\n 'Digest mismatch',\n 422,\n false,\n 'E_CLEO_DIGEST_MISMATCH',\n ),\n ],\n [\n ExitCode.ATTESTATION_INVALID,\n def(\n ExitCode.ATTESTATION_INVALID,\n 'ATTESTATION_INVALID',\n 'VALIDATION',\n 'Attestation invalid',\n 422,\n false,\n 'E_CLEO_ATTESTATION_INVALID',\n ),\n ],\n\n // === ADAPTER ERRORS (95-99) ===\n [\n ExitCode.ADAPTER_NOT_FOUND,\n def(\n ExitCode.ADAPTER_NOT_FOUND,\n 'ADAPTER_NOT_FOUND',\n 'NOT_FOUND',\n 'Provider adapter not found',\n 404,\n false,\n 'E_CLEO_ADAPTER_NOT_FOUND',\n ),\n ],\n [\n ExitCode.ADAPTER_INIT_FAILED,\n def(\n ExitCode.ADAPTER_INIT_FAILED,\n 'ADAPTER_INIT_FAILED',\n 'INTERNAL',\n 'Provider adapter initialization failed',\n 500,\n true,\n 'E_CLEO_ADAPTER_INIT_FAILED',\n ),\n ],\n [\n ExitCode.ADAPTER_HOOK_FAILED,\n def(\n ExitCode.ADAPTER_HOOK_FAILED,\n 'ADAPTER_HOOK_FAILED',\n 'INTERNAL',\n 'Provider adapter hook execution failed',\n 500,\n true,\n 'E_CLEO_ADAPTER_HOOK_FAILED',\n ),\n ],\n [\n ExitCode.ADAPTER_SPAWN_FAILED,\n def(\n ExitCode.ADAPTER_SPAWN_FAILED,\n 'ADAPTER_SPAWN_FAILED',\n 'INTERNAL',\n 'Provider adapter process spawn failed',\n 500,\n true,\n 'E_CLEO_ADAPTER_SPAWN_FAILED',\n ),\n ],\n [\n ExitCode.ADAPTER_INSTALL_FAILED,\n def(\n ExitCode.ADAPTER_INSTALL_FAILED,\n 'ADAPTER_INSTALL_FAILED',\n 'INTERNAL',\n 'Provider adapter installation failed',\n 500,\n false,\n 'E_CLEO_ADAPTER_INSTALL_FAILED',\n ),\n ],\n\n // === SPECIAL CODES (100+) ===\n [\n ExitCode.NO_DATA,\n def(\n ExitCode.NO_DATA,\n 'NO_DATA',\n 'INTERNAL',\n 'No data to process',\n 200,\n false,\n 'E_CLEO_NO_DATA',\n ),\n ],\n [\n ExitCode.ALREADY_EXISTS,\n def(\n ExitCode.ALREADY_EXISTS,\n 'ALREADY_EXISTS',\n 'CONFLICT',\n 'Resource already exists',\n 200,\n false,\n 'E_CLEO_ALREADY_EXISTS',\n ),\n ],\n [\n ExitCode.NO_CHANGE,\n def(\n ExitCode.NO_CHANGE,\n 'NO_CHANGE',\n 'INTERNAL',\n 'No changes needed',\n 200,\n false,\n 'E_CLEO_NO_CHANGE',\n ),\n ],\n [\n ExitCode.TESTS_SKIPPED,\n def(\n ExitCode.TESTS_SKIPPED,\n 'TESTS_SKIPPED',\n 'INTERNAL',\n 'Tests skipped',\n 200,\n false,\n 'E_CLEO_TESTS_SKIPPED',\n ),\n ],\n ],\n);\n\n/**\n * Look up an error definition by exit code.\n */\nexport function getErrorDefinition(code: number): ErrorDefinition | undefined {\n return ERROR_CATALOG.get(code);\n}\n\n/**\n * Look up an error definition by LAFS string code.\n */\nexport function getErrorDefinitionByLafsCode(lafsCode: string): ErrorDefinition | undefined {\n for (const entry of ERROR_CATALOG.values()) {\n if (entry.lafsCode === lafsCode) return entry;\n }\n return undefined;\n}\n\n/**\n * Get all error definitions as an array.\n */\nexport function getAllErrorDefinitions(): ErrorDefinition[] {\n return [...ERROR_CATALOG.values()];\n}\n", "/**\n * CLEO error types with exit code integration, LAFS error shape,\n * and RFC 9457 Problem Details support.\n *\n * @epic T4654\n * @task T4655\n * @task T5240\n */\n\nimport { ExitCode, getExitCodeName, isRecoverableCode } from '@cleocode/contracts';\nimport type { LAFSError, LAFSErrorCategory } from '@cleocode/lafs';\nimport { getErrorDefinition } from './error-catalog.js';\n\n/**\n * RFC 9457 Problem Details object.\n * Structured error representation for API responses.\n *\n * @task T5240\n */\nexport interface ProblemDetails {\n type: string;\n title: string;\n status: number;\n detail: string;\n instance?: string;\n extensions?: Record<string, unknown>;\n}\n\n/**\n * Map numeric exit codes to LAFS error category.\n *\n * @task T4655\n */\nfunction exitCodeToCategory(code: ExitCode): LAFSErrorCategory {\n const def = getErrorDefinition(code);\n if (def) return def.category;\n\n if (code >= 1 && code <= 9) {\n switch (code) {\n case ExitCode.NOT_FOUND:\n return 'NOT_FOUND';\n case ExitCode.VALIDATION_ERROR:\n return 'VALIDATION';\n case ExitCode.CONFIG_ERROR:\n return 'VALIDATION';\n case ExitCode.LOCK_TIMEOUT:\n return 'CONFLICT';\n default:\n return 'INTERNAL';\n }\n }\n if (code >= 10 && code <= 19) return 'VALIDATION'; // hierarchy\n if (code >= 20 && code <= 29) return 'CONFLICT'; // concurrency\n if (code >= 30 && code <= 39) return 'CONTRACT'; // session\n if (code >= 40 && code <= 47) return 'VALIDATION'; // verification\n if (code >= 50 && code <= 54) return 'CONTRACT'; // context safeguard\n if (code >= 60 && code <= 67) return 'CONTRACT'; // orchestrator\n if (code >= 70 && code <= 79) return 'INTERNAL'; // nexus\n if (code >= 80 && code <= 84) return 'CONTRACT'; // lifecycle\n if (code >= 85 && code <= 89) return 'VALIDATION'; // artifact\n if (code >= 90 && code <= 94) return 'VALIDATION'; // provenance\n if (code >= 95 && code <= 99) return 'INTERNAL'; // adapter\n return 'INTERNAL';\n}\n\n/**\n * Map numeric exit code to LAFS string error code (E_CATEGORY_DETAIL).\n *\n * @task T4655\n */\nfunction exitCodeToLafsCode(code: ExitCode): string {\n const def = getErrorDefinition(code);\n if (def) return def.lafsCode;\n\n const name = getExitCodeName(code);\n const category = exitCodeToCategory(code);\n return `E_${category}_${name}`;\n}\n\n/**\n * Structured field-level details for constraint-violation errors.\n * Surfaces in the LAFS envelope so agents can recover programmatically.\n *\n * @task T341\n */\nexport interface CleoErrorDetails {\n /** The specific field that failed validation. */\n field: string;\n /** The expected value or constraint (e.g. max length, valid enum members). */\n expected?: unknown;\n /** The actual value that was provided. */\n actual?: unknown;\n /** Additional context keys. */\n [key: string]: unknown;\n}\n\n/**\n * Structured error class for CLEO operations.\n * Carries an exit code, human-readable message, and optional fix suggestions.\n * Produces LAFS-conformant error shapes via toLAFSError() and RFC 9457\n * Problem Details via toProblemDetails().\n */\nexport class CleoError extends Error {\n readonly code: ExitCode;\n readonly fix?: string;\n readonly alternatives?: Array<{ action: string; command: string }>;\n /** Field-level details for constraint-violation errors. @task T341 */\n readonly details?: CleoErrorDetails;\n\n constructor(\n code: ExitCode,\n message: string,\n options?: {\n fix?: string;\n alternatives?: Array<{ action: string; command: string }>;\n details?: CleoErrorDetails;\n cause?: unknown;\n },\n ) {\n super(message, { cause: options?.cause });\n this.name = 'CleoError';\n this.code = code;\n this.fix = options?.fix;\n this.alternatives = options?.alternatives;\n this.details = options?.details;\n }\n\n /**\n * Produce a LAFS-conformant error object.\n *\n * @task T4655\n */\n toLAFSError(): LAFSError {\n return {\n code: exitCodeToLafsCode(this.code),\n message: this.message,\n category: exitCodeToCategory(this.code),\n retryable: isRecoverableCode(this.code),\n retryAfterMs: null,\n details: {\n exitCode: this.code,\n name: getExitCodeName(this.code),\n ...(this.fix && { fix: this.fix }),\n ...(this.alternatives && { alternatives: this.alternatives }),\n ...(this.details && { fieldDetails: this.details }),\n },\n };\n }\n\n /**\n * Produce an RFC 9457 Problem Details object.\n *\n * @task T5240\n */\n toProblemDetails(): ProblemDetails {\n const def = getErrorDefinition(this.code);\n return {\n type: `urn:cleo:error:${this.code}`,\n title: getExitCodeName(this.code),\n status: def?.httpStatus ?? this.getHttpStatus(),\n detail: this.message,\n instance: undefined,\n extensions: {\n code: this.code,\n lafsCode: exitCodeToLafsCode(this.code),\n category: exitCodeToCategory(this.code),\n recoverable: isRecoverableCode(this.code),\n ...(this.fix && { fix: this.fix }),\n ...(this.alternatives && { alternatives: this.alternatives }),\n ...(this.details && { fieldDetails: this.details }),\n },\n };\n }\n\n /** Structured JSON representation for LAFS output (backward compatible). */\n toJSON(): Record<string, unknown> {\n return {\n success: false,\n error: {\n code: this.code,\n name: getExitCodeName(this.code),\n message: this.message,\n ...(this.fix && { fix: this.fix }),\n ...(this.alternatives && { alternatives: this.alternatives }),\n ...(this.details && { details: this.details }),\n },\n };\n }\n\n /**\n * Derive HTTP status from exit code range.\n * Used as fallback when catalog lookup misses.\n */\n private getHttpStatus(): number {\n const c = this.code;\n if (c === 0 || c >= 100) return 200;\n if (\n c === ExitCode.NOT_FOUND ||\n c === ExitCode.PARENT_NOT_FOUND ||\n c === ExitCode.SESSION_NOT_FOUND\n )\n return 404;\n if (c >= 20 && c <= 29) return 409; // conflict\n if (c === ExitCode.LOCK_TIMEOUT) return 409;\n if (c >= 50 && c <= 54) return 429; // rate limit / context\n if (c >= 1 && c <= 9) return 500;\n return 422;\n }\n}\n", "/**\n * Central OS platform path resolution using env-paths.\n *\n * Provides OS-appropriate paths for CLEO's global directories using\n * XDG conventions on Linux, standard conventions on macOS/Windows.\n * Results are cached for the process lifetime. Env vars take precedence.\n *\n * Platform path defaults (no env vars set):\n * data: ~/.local/share/cleo | ~/Library/Application Support/cleo | %LOCALAPPDATA%\\cleo\\Data\n * config: ~/.config/cleo | ~/Library/Preferences/cleo | %APPDATA%\\cleo\\Config\n * cache: ~/.cache/cleo | ~/Library/Caches/cleo | %LOCALAPPDATA%\\cleo\\Cache\n * log: ~/.local/state/cleo | ~/Library/Logs/cleo | %LOCALAPPDATA%\\cleo\\Log\n * temp: /tmp/<user>/cleo | /var/folders/.../cleo | %TEMP%\\cleo\n *\n * CLEO_HOME env var overrides the data path for backward compatibility\n * with existing ~/.cleo installations.\n */\n\nimport { arch, hostname, platform, release } from 'node:os';\nimport envPaths from 'env-paths';\n\nconst APP_NAME = 'cleo';\n\n/** OS-appropriate paths for CLEO's global directories. */\nexport interface PlatformPaths {\n /** User data dir. Override with CLEO_HOME env var. */\n data: string;\n /** User config dir (XDG_CONFIG_HOME / Library/Preferences / %APPDATA%). */\n config: string;\n /** User cache dir (XDG_CACHE_HOME / Library/Caches / %LOCALAPPDATA%). */\n cache: string;\n /** User log dir (XDG_STATE_HOME / Library/Logs / %LOCALAPPDATA%). */\n log: string;\n /** Temp dir for ephemeral files. */\n temp: string;\n}\n\n/** Immutable system information snapshot, captured once per process. */\nexport interface SystemInfo {\n platform: NodeJS.Platform;\n arch: string;\n release: string;\n hostname: string;\n nodeVersion: string;\n paths: PlatformPaths;\n}\n\nlet _sysInfo: SystemInfo | null = null;\n\n/**\n * Get OS-appropriate paths for CLEO's global directories.\n *\n * Reads fresh on every call \u2014 env-paths is fast (microseconds) and a\n * process-wide cache would skip XDG / APPDATA env-var changes that test\n * code and long-running CLI sessions legitimately make. CLEO_HOME env\n * var overrides the data path for backward compatibility.\n */\nexport function getPlatformPaths(): PlatformPaths {\n const ep = envPaths(APP_NAME, { suffix: '' });\n return {\n data: process.env['CLEO_HOME'] ?? ep.data,\n config: ep.config,\n cache: ep.cache,\n log: ep.log,\n temp: ep.temp,\n };\n}\n\n/**\n * Get a cached system information snapshot.\n * Captured once and reused for the process lifetime.\n * Useful for diagnostics, issue reports, and log enrichment.\n */\nexport function getSystemInfo(): SystemInfo {\n if (_sysInfo) return _sysInfo;\n\n _sysInfo = {\n platform: platform(),\n arch: arch(),\n release: release(),\n hostname: hostname(),\n nodeVersion: process.version,\n paths: getPlatformPaths(),\n };\n\n return _sysInfo;\n}\n\n/**\n * Invalidate the system info cache.\n * Use in tests that need a fresh platform snapshot.\n * @internal\n */\nexport function _resetPlatformPathsCache(): void {\n _sysInfo = null;\n}\n", "/**\n * XDG-compliant path resolution for CLEO V2.\n *\n * Global data directory is resolved via env-paths (XDG on Linux, platform\n * conventions on macOS and Windows):\n * Linux: ~/.local/share/cleo\n * macOS: ~/Library/Application Support/cleo\n * Windows: %LOCALAPPDATA%\\cleo\n *\n * Environment variables:\n * CLEO_HOME - Override global installation directory\n * CLEO_DIR - Project data directory (default: .cleo)\n *\n * @epic T4454\n * @task T4458\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join, resolve } from 'node:path';\nimport { ExitCode } from '@cleocode/contracts';\nimport { CleoError } from './errors.js';\nimport { getPlatformPaths } from './system/platform-paths.js';\n\n// ============================================================================\n// Worktree Scope (T380/ADR-041 \u00A7D3)\n// ============================================================================\n\n/**\n * Async context payload set by the spawn adapter when launching a subagent\n * inside a git worktree (ADR-041 \u00A7D3).\n *\n * @remarks\n * When `worktreeScope.run(scope, fn)` is active, `getProjectRoot()` returns\n * `scope.worktreeRoot` instead of walking ancestors. All DB path functions\n * that delegate to `getProjectRoot()` therefore direct their I/O to the\n * worktree's `.cleo/` directory, closing the T335 worktree-leak root cause.\n *\n * For processes that were spawned with `CLEO_WORKTREE_ROOT` in their\n * environment (but where AsyncLocalStorage is not in scope), callers should\n * populate the store via:\n * ```ts\n * worktreeScope.run(\n * { worktreeRoot: process.env.CLEO_WORKTREE_ROOT, projectHash: process.env.CLEO_PROJECT_HASH },\n * () => { ... }\n * );\n * ```\n *\n * @task T380\n * @public\n */\nexport interface WorktreeScope {\n /**\n * Absolute path to the worktree directory (value of `CLEO_WORKTREE_ROOT`).\n */\n worktreeRoot: string;\n /**\n * Project hash used to scope the worktree under the XDG worktree root\n * (value of `CLEO_PROJECT_HASH`).\n */\n projectHash: string;\n}\n\n/**\n * AsyncLocalStorage instance that carries the active {@link WorktreeScope}\n * for the current async execution context.\n *\n * @remarks\n * Set by the spawn adapter (or any caller that wants to redirect CLEO path\n * resolution to a worktree directory) before invoking subagent logic.\n * `getProjectRoot()` checks this store BEFORE the `CLEO_ROOT` env-var and\n * ancestor-walk, so scoped callers transparently receive the worktree root.\n *\n * Callers outside a worktree context receive `undefined` from\n * `worktreeScope.getStore()` and fall through to the existing resolution\n * order unchanged.\n *\n * @example\n * ```ts\n * import { worktreeScope } from '@cleocode/core/paths';\n *\n * worktreeScope.run(\n * { worktreeRoot: '/path/to/worktree', projectHash: 'abc123' },\n * async () => {\n * const root = getProjectRoot(); // returns '/path/to/worktree'\n * }\n * );\n * ```\n *\n * @task T380\n * @public\n */\nexport const worktreeScope = new AsyncLocalStorage<WorktreeScope>();\n\n/**\n * Check if a CLEO project is initialized at the given root.\n * Checks for tasks.db.\n *\n * @param projectRoot - Absolute path to check; defaults to the resolved project root\n * @returns True if .cleo/ and tasks.db exist at the given root\n *\n * @remarks\n * A project is considered initialized when both the .cleo/ directory and\n * the tasks.db SQLite database file are present.\n *\n * @example\n * ```typescript\n * if (isProjectInitialized('/my/project')) {\n * console.log('CLEO project found');\n * }\n * ```\n */\nexport function isProjectInitialized(projectRoot?: string): boolean {\n const root = projectRoot ?? getProjectRoot();\n const cleoDir = join(root, '.cleo');\n return existsSync(cleoDir) && existsSync(join(cleoDir, 'tasks.db'));\n}\n\n/**\n * Get the global CLEO home directory.\n * Respects CLEO_HOME env var; otherwise uses the OS-appropriate data path\n * via env-paths (XDG_DATA_HOME on Linux, Library/Application Support on macOS,\n * %LOCALAPPDATA% on Windows).\n *\n * @returns Absolute path to the global CLEO data directory\n *\n * @remarks\n * Delegates to `getPlatformPaths().data` which uses the `env-paths` package\n * for XDG-compliant path resolution across operating systems.\n *\n * @example\n * ```typescript\n * const home = getCleoHome(); // e.g. \"/home/user/.local/share/cleo\"\n * ```\n */\nexport function getCleoHome(): string {\n return getPlatformPaths().data;\n}\n\n/**\n * Get the global CLEO templates directory.\n *\n * @returns Absolute path to the templates directory under CLEO home\n *\n * @remarks\n * Returns `{cleoHome}/templates` where CLEO-INJECTION.md and other global\n * templates are stored.\n *\n * @example\n * ```typescript\n * const dir = getCleoTemplatesDir(); // e.g. \"/home/user/.local/share/cleo/templates\"\n * ```\n */\nexport function getCleoTemplatesDir(): string {\n return join(getCleoHome(), 'templates');\n}\n\n/**\n * Get the global CLEO schemas directory.\n *\n * @returns Absolute path to the schemas directory under CLEO home\n *\n * @remarks\n * Returns `{cleoHome}/schemas`. Note that schemas are typically read at\n * runtime from the npm package root, not this global directory.\n *\n * @example\n * ```typescript\n * const dir = getCleoSchemasDir();\n * ```\n */\nexport function getCleoSchemasDir(): string {\n return join(getCleoHome(), 'schemas');\n}\n\n/**\n * Get the global CLEO docs directory.\n *\n * @returns Absolute path to the docs directory under CLEO home\n *\n * @remarks\n * Returns `{cleoHome}/docs` for global documentation storage.\n *\n * @example\n * ```typescript\n * const dir = getCleoDocsDir();\n * ```\n */\nexport function getCleoDocsDir(): string {\n return join(getCleoHome(), 'docs');\n}\n\n/**\n * Get the project CLEO data directory (relative).\n * Respects CLEO_DIR env var, defaults to \".cleo\".\n *\n * @param cwd - Optional working directory; when provided, returns absolute path\n * @returns Relative or absolute path to the project's .cleo directory\n *\n * @remarks\n * If `cwd` is provided, delegates to `getCleoDirAbsolute`. Otherwise returns\n * the `CLEO_DIR` env var or the default \".cleo\" relative path.\n *\n * @example\n * ```typescript\n * const rel = getCleoDir(); // \".cleo\"\n * const abs = getCleoDir('/project'); // \"/project/.cleo\"\n * ```\n */\nexport function getCleoDir(cwd?: string): string {\n if (cwd) {\n return getCleoDirAbsolute(cwd);\n }\n return process.env['CLEO_DIR'] ?? '.cleo';\n}\n\n/**\n * Get the absolute path to the project CLEO directory.\n *\n * @param cwd - Optional working directory to resolve against; defaults to process.cwd()\n * @returns Absolute path to the project's .cleo directory\n *\n * @remarks\n * If CLEO_DIR is already absolute, returns it directly. Otherwise resolves\n * it relative to the provided cwd or process.cwd().\n *\n * @example\n * ```typescript\n * const dir = getCleoDirAbsolute('/my/project'); // \"/my/project/.cleo\"\n * ```\n */\nexport function getCleoDirAbsolute(cwd?: string): string {\n const cleoDir = getCleoDir();\n if (isAbsolutePath(cleoDir)) {\n return cleoDir;\n }\n return resolve(cwd ?? process.cwd(), cleoDir);\n}\n\n/**\n * Get the project root by walking ancestor directories for `.cleo/` or `.git/`.\n *\n * Stops at the **first** ancestor directory that contains either sentinel\n * directory and never drifts past it \u2014 even when multiple nested projects\n * exist above the starting directory.\n *\n * Resolution order:\n * 1. `CLEO_ROOT` env var \u2014 bypasses walk entirely (CI / test override)\n * 2. `CLEO_DIR` env var (absolute path only) \u2014 derives project root from dirname\n * 3. Walk ancestors from `cwd` (or `process.cwd()`) toward filesystem root:\n * - `.cleo/` found \u2192 return that directory (project root)\n * - `.git/` found (without `.cleo/` sibling) \u2192 throw `E_NOT_INITIALIZED`\n * 4. Filesystem root reached without either \u2192 throw `E_NO_PROJECT`\n *\n * @param cwd - Optional starting directory; defaults to `process.cwd()`\n * @returns Absolute path to the project root directory (parent of `.cleo/`)\n * @throws {CleoError} `ExitCode.CONFIG_ERROR` (`E_NOT_INITIALIZED`) when a\n * `.git/` is found but no `.cleo/` is present at that level.\n * @throws {CleoError} `ExitCode.NOT_FOUND` (`E_NO_PROJECT`) when neither\n * sentinel is found in any ancestor.\n *\n * @remarks\n * `CLEO_ROOT` is an absolute-path escape hatch for environments where the\n * working directory is unrelated to the project (CI tmpdirs, monorepo scripts,\n * test harnesses). When set it is returned as-is without scanning ancestors.\n *\n * `CLEO_DIR` set to an absolute path (e.g. `/project/.cleo`) also bypasses\n * the walk: the project root is derived as its `dirname`. This preserves\n * backward compatibility for test harnesses that use `CLEO_DIR` to pin the\n * project root.\n *\n * NEVER auto-creates `.cleo/`. Project initialisation is an explicit opt-in\n * via `cleo init`.\n *\n * @example\n * ```typescript\n * // Running from packages/core inside the monorepo:\n * const root = getProjectRoot(); // \"/mnt/projects/cleocode\"\n * ```\n */\nexport function getProjectRoot(cwd?: string): string {\n // 0. AsyncLocalStorage worktree scope (T380/ADR-041 \u00A7D3) \u2014 checked FIRST.\n // When a spawn adapter wraps execution in worktreeScope.run(...), the\n // scoped root wins over all env-var and walk-based resolution.\n const scope = worktreeScope.getStore();\n if (scope !== undefined) {\n return scope.worktreeRoot;\n }\n\n // 1. Honour CLEO_ROOT / CLEO_PROJECT_ROOT env var \u2014 bypass walk entirely.\n // CLEO_PROJECT_ROOT is the agent-friendly alias (T090).\n const envRoot = process.env['CLEO_ROOT'] ?? process.env['CLEO_PROJECT_ROOT'];\n if (envRoot) {\n return envRoot;\n }\n\n // 2. If CLEO_DIR is an absolute path, derive the project root from it.\n // This preserves backward compatibility for test harnesses that set\n // CLEO_DIR=/some/absolute/path/.cleo to pin the project root.\n const cleoDirEnv = process.env['CLEO_DIR'];\n if (cleoDirEnv && isAbsolutePath(cleoDirEnv)) {\n if (cleoDirEnv.endsWith('/.cleo') || cleoDirEnv.endsWith('\\\\.cleo')) {\n return dirname(cleoDirEnv);\n }\n return cleoDirEnv;\n }\n\n const start = resolve(cwd ?? process.cwd());\n let current = start;\n\n // T889/T909 guard: snapshot $HOME and filesystem root sentinels.\n //\n // Historical bug: when `cleo` ran with `cwd=$HOME` and a stray\n // `~/.cleo/` existed (from a prior buggy run or user mistake), the\n // walk-up returned `$HOME` as the project root. This silently created\n // `~/.cleo/conduit.db`, `~/.cleo/tasks.db`, etc. \u2014 diverging from the\n // real project DBs and losing data on branch switch. See ADR-037\n // (conduit.db is project-tier-only) and the orphan-conduit remediation.\n //\n // Contract: `getProjectRoot` MUST NEVER resolve to `$HOME` or `/`.\n // If the walk would land there, treat it as \"no project\" rather than\n // silently accepting a pathological root. Users who legitimately want\n // `$HOME` as a project root must set `CLEO_ROOT=$HOME` explicitly \u2014 the\n // env-var path above bypasses this guard, making the opt-in explicit.\n const homeRoot = homedir();\n\n // 2. Walk ancestors toward filesystem root\n while (true) {\n const cleoDir = join(current, '.cleo');\n const gitDir = join(current, '.git');\n\n // T889/T909: refuse to accept $HOME or / as a project root, even if a\n // `.cleo/` sentinel exists there. This blocks the orphan-DB vector.\n const isDangerousRoot = current === homeRoot || current === '/' || current === '';\n\n if (existsSync(cleoDir) && !isDangerousRoot) {\n // .cleo/ found \u2014 this is the project root\n return current;\n }\n\n if (existsSync(gitDir) && !isDangerousRoot) {\n // .git/ found but no .cleo/ sibling \u2014 not initialised\n throw new CleoError(ExitCode.CONFIG_ERROR, `Run cleo init at ${current}`, {\n fix: `cd ${current} && cleo init`,\n });\n }\n\n // Move up one level\n const parent = dirname(current);\n if (parent === current) {\n // Reached filesystem root without finding either sentinel\n break;\n }\n current = parent;\n }\n\n // 3. No sentinel found in any ancestor\n throw new CleoError(\n ExitCode.NOT_FOUND,\n 'Not inside a CLEO project. Run cleo init or cd to an existing project',\n {\n fix: 'cleo init',\n },\n );\n}\n\n/**\n * Resolve a project-relative path to an absolute path.\n *\n * @param relativePath - Path to resolve (relative, absolute, or tilde-prefixed)\n * @param cwd - Optional working directory for project root resolution\n * @returns Absolute resolved path\n *\n * @remarks\n * Returns absolute paths unchanged. Expands leading tilde (`~/`) to the user's\n * home directory. Resolves other relative paths against the project root.\n *\n * @example\n * ```typescript\n * resolveProjectPath('src/index.ts'); // \"/project/src/index.ts\"\n * resolveProjectPath('~/notes.md'); // \"/home/user/notes.md\"\n * resolveProjectPath('/absolute/path'); // \"/absolute/path\"\n * ```\n */\nexport function resolveProjectPath(relativePath: string, cwd?: string): string {\n if (isAbsolutePath(relativePath)) {\n return relativePath;\n }\n // Expand leading tilde (handles both ~/ on Unix and ~\\ on Windows)\n if (relativePath.startsWith('~/') || relativePath.startsWith('~\\\\') || relativePath === '~') {\n return resolve(homedir(), relativePath.slice(2));\n }\n return resolve(getProjectRoot(cwd), relativePath);\n}\n\n/**\n * Get the path to the project's tasks.db file (SQLite database).\n * @deprecated Use getAccessor() from './store/data-accessor.js' instead. This function\n * returns the database file path for legacy compatibility, but all task data access\n * should go through the DataAccessor interface to ensure proper SQLite interaction.\n * Example:\n * // OLD (deprecated):\n * const taskPath = getTaskPath(cwd);\n * const data = await readJsonFile<TaskFile>(taskPath);\n * // NEW (correct):\n * const accessor = await getAccessor(cwd);\n * const data = await accessor.queryTasks({});\n *\n * @param cwd - Optional working directory for path resolution\n * @returns Absolute path to the tasks.db file\n *\n * @remarks\n * Returns `{cleoDir}/tasks.db`. Prefer `getAccessor()` for actual data access.\n *\n * @example\n * ```typescript\n * const dbPath = getTaskPath('/project');\n * ```\n */\nexport function getTaskPath(cwd?: string): string {\n return join(getCleoDirAbsolute(cwd), 'tasks.db');\n}\n\n/**\n * Get the path to the project's config.json file.\n *\n * @param cwd - Optional working directory for path resolution\n * @returns Absolute path to the project config.json\n *\n * @remarks\n * Returns `{cleoDir}/config.json`.\n *\n * @example\n * ```typescript\n * const configPath = getConfigPath('/project');\n * ```\n */\nexport function getConfigPath(cwd?: string): string {\n return join(getCleoDirAbsolute(cwd), 'config.json');\n}\n\n/**\n * Get the path to the project's sessions.json file.\n *\n * @param cwd - Optional working directory for path resolution\n * @returns Absolute path to the sessions.json file\n *\n * @remarks\n * Returns `{cleoDir}/sessions.json`.\n *\n * @example\n * ```typescript\n * const sessionsPath = getSessionsPath('/project');\n * ```\n */\nexport function getSessionsPath(cwd?: string): string {\n return join(getCleoDirAbsolute(cwd), 'sessions.json');\n}\n\n/**\n * Get the path to the project's archive file.\n *\n * @param cwd - Optional working directory for path resolution\n * @returns Absolute path to the tasks-archive.json file\n *\n * @remarks\n * Returns `{cleoDir}/tasks-archive.json` where archived tasks are stored.\n *\n * @example\n * ```typescript\n * const archivePath = getArchivePath('/project');\n * ```\n */\nexport function getArchivePath(cwd?: string): string {\n return join(getCleoDirAbsolute(cwd), 'tasks-archive.json');\n}\n\n/**\n * Get the path to the project's log file.\n * Canonical structured runtime log path (pino).\n *\n * @param cwd - Optional working directory for path resolution\n * @returns Absolute path to the cleo.log file\n *\n * @remarks\n * Returns `{cleoDir}/logs/cleo.log`. Used by pino for structured JSON logging.\n *\n * @example\n * ```typescript\n * const logPath = getLogPath('/project');\n * ```\n *\n * @task T4644\n */\nexport function getLogPath(cwd?: string): string {\n return join(getCleoDirAbsolute(cwd), 'logs', 'cleo.log');\n}\n\n/**\n * Get the backup directory for operational backups.\n *\n * @param cwd - Optional working directory for path resolution\n * @returns Absolute path to the operational backups directory\n *\n * @remarks\n * Returns `{cleoDir}/backups/operational`.\n *\n * @example\n * ```typescript\n * const backupDir = getBackupDir('/project');\n * ```\n */\nexport function getBackupDir(cwd?: string): string {\n return join(getCleoDirAbsolute(cwd), 'backups', 'operational');\n}\n\n/**\n * Get the global config file path.\n *\n * @returns Absolute path to the global config.json in CLEO home\n *\n * @remarks\n * Returns `{cleoHome}/config.json` for global CLEO configuration.\n *\n * @example\n * ```typescript\n * const globalConfig = getGlobalConfigPath();\n * ```\n */\nexport function getGlobalConfigPath(): string {\n return join(getCleoHome(), 'config.json');\n}\n\n// ============================================================================\n// CleoOS Hub Paths (Phase 1)\n// ============================================================================\n\n/**\n * Get the Global Justfile Hub directory.\n *\n * The hub stores cross-project recipe libraries agents can run in ANY project\n * (cleo-bootstrap, rcasd-init, schema-validate, lint-standard). Both humans\n * (via editor) and the meta Cleo Chef Agent write recipes here.\n *\n * @returns Absolute path to the global-recipes directory under CLEO home\n *\n * @remarks\n * Returns `{cleoHome}/global-recipes`. Created by `ensureGlobalHome()`.\n *\n * @example\n * ```typescript\n * const dir = getCleoGlobalRecipesDir();\n * // Linux: \"/home/user/.local/share/cleo/global-recipes\"\n * ```\n */\nexport function getCleoGlobalRecipesDir(): string {\n return join(getCleoHome(), 'global-recipes');\n}\n\n/**\n * Get the absolute path to the primary global justfile.\n *\n * @returns Absolute path to `{cleoHome}/global-recipes/justfile`\n *\n * @remarks\n * This is the single-file entry point for the Justfile Hub. Additional\n * domain-specific justfiles live alongside it in the same directory.\n *\n * @example\n * ```typescript\n * const path = getCleoGlobalJustfilePath();\n * ```\n */\nexport function getCleoGlobalJustfilePath(): string {\n return join(getCleoGlobalRecipesDir(), 'justfile');\n}\n\n/**\n * Get the Global Pi Extensions Hub directory.\n *\n * Houses the Pi extensions that drive the CleoOS UI and tools:\n * orchestrator.ts (Conductor Loop), project-manager.ts (TUI dashboard),\n * tilldone.ts (work visualization), cant-bridge.ts (CANT runtime),\n * stage-guide.ts (before_agent_start hook).\n *\n * @returns Absolute path to the pi-extensions directory under CLEO home\n *\n * @remarks\n * Returns `{cleoHome}/pi-extensions`. Pi is configured to load extensions\n * from this directory via settings.json or the PI extension path setting.\n *\n * @example\n * ```typescript\n * const dir = getCleoPiExtensionsDir();\n * // Linux: \"/home/user/.local/share/cleo/pi-extensions\"\n * ```\n */\nexport function getCleoPiExtensionsDir(): string {\n return join(getCleoHome(), 'pi-extensions');\n}\n\n/**\n * Get the Global CANT Workflows Hub directory.\n *\n * Stores compiled and parsed `.cant` workflows that agents can invoke\n * globally across projects. Project-local agents still live in `.cleo/agents/`.\n *\n * @returns Absolute path to the cant-workflows directory under CLEO home\n *\n * @remarks\n * Returns `{cleoHome}/cant-workflows`. Used by the CANT runtime bridge\n * to resolve globally-available workflow definitions.\n *\n * @example\n * ```typescript\n * const dir = getCleoCantWorkflowsDir();\n * ```\n */\nexport function getCleoCantWorkflowsDir(): string {\n return join(getCleoHome(), 'cant-workflows');\n}\n\n/**\n * Get the Global CLEO Agents directory.\n *\n * Holds globally-available CANT agent definitions (`.cant` files).\n * Project-local agents still live in `{projectRoot}/.cleo/agents/`.\n *\n * @returns Absolute path to the agents directory under CLEO home\n *\n * @remarks\n * Returns `{cleoHome}/agents`. Loaded when `cleo agent start <id>` resolves\n * agent IDs that aren't found in the project-local registry.\n *\n * @example\n * ```typescript\n * const dir = getCleoGlobalAgentsDir();\n * ```\n */\nexport function getCleoGlobalAgentsDir(): string {\n return join(getCleoHome(), 'agents');\n}\n\n/**\n * Get the Global CLEO CANT Agents directory.\n *\n * Holds globally-available `.cant` persona files seeded from\n * `@cleocode/agents/seed-agents/` during postinstall. `cleo agent start <id>`\n * and `cleo orchestrate spawn` resolve agent IDs that aren't found in the\n * project-local registry against this directory.\n *\n * Project-local CANT agents still live in `{projectRoot}/.cleo/cant/agents/`.\n *\n * @returns Absolute path to the `cant/agents` directory under CLEO home\n *\n * @remarks\n * Returns `{cleoHome}/cant/agents` \u2014 e.g. `~/.local/share/cleo/cant/agents`\n * on Linux. This is the target of both the npm postinstall seed hook (W2-5)\n * and the `cleo agent install --global` CLI command.\n *\n * @example\n * ```typescript\n * const dir = getCleoGlobalCantAgentsDir();\n * // Linux: \"/home/user/.local/share/cleo/cant/agents\"\n * ```\n *\n * @task T889 / T897 / W2-5\n */\nexport function getCleoGlobalCantAgentsDir(): string {\n return join(getCleoHome(), 'cant', 'agents');\n}\n\n// ============================================================================\n// Agent Outputs\n// ============================================================================\n\nconst DEFAULT_AGENT_OUTPUTS_DIR = '.cleo/agent-outputs';\n\n/**\n * Get the agent outputs directory (relative path) from config or default.\n *\n * Config lookup priority:\n * 1. config.agentOutputs.directory\n * 2. config.research.outputDir (deprecated)\n * 3. config.directories.agentOutputs (deprecated)\n * 4. Default: '.cleo/agent-outputs'\n *\n * @param cwd - Optional working directory for path resolution\n * @returns Relative or absolute path to the agent outputs directory\n *\n * @remarks\n * Checks config fields in priority order: `agentOutputs.directory`, `research.outputDir`,\n * `directories.agentOutputs`. Falls back to `.cleo/agent-outputs`.\n *\n * @example\n * ```typescript\n * const dir = getAgentOutputsDir('/project');\n * ```\n *\n * @task T4700\n */\nexport function getAgentOutputsDir(cwd?: string): string {\n const projectRoot = getProjectRoot(cwd);\n const configPath = join(projectRoot, '.cleo', 'config.json');\n\n if (existsSync(configPath)) {\n try {\n const config = JSON.parse(readFileSync(configPath, 'utf-8'));\n\n // Priority 1: agentOutputs.directory (canonical)\n if (typeof config.agentOutputs === 'object' && config.agentOutputs?.directory) {\n return config.agentOutputs.directory;\n }\n // Also support agentOutputs as a plain string\n if (typeof config.agentOutputs === 'string' && config.agentOutputs) {\n return config.agentOutputs;\n }\n\n // Priority 2: research.outputDir (deprecated)\n if (config.research?.outputDir) {\n return config.research.outputDir;\n }\n\n // Priority 3: directories.agentOutputs (deprecated)\n if (config.directories?.agentOutputs) {\n return config.directories.agentOutputs;\n }\n } catch {\n // fallback to default\n }\n }\n\n return DEFAULT_AGENT_OUTPUTS_DIR;\n}\n\n/**\n * Get the absolute path to the agent outputs directory.\n *\n * @param cwd - Optional working directory for path resolution\n * @returns Absolute path to the agent outputs directory\n *\n * @remarks\n * Resolves the output of `getAgentOutputsDir()` against the project root\n * if it is not already absolute.\n *\n * @example\n * ```typescript\n * const absDir = getAgentOutputsAbsolute('/project');\n * ```\n *\n * @task T4700\n */\nexport function getAgentOutputsAbsolute(cwd?: string): string {\n const dir = getAgentOutputsDir(cwd);\n if (isAbsolutePath(dir)) {\n return dir;\n }\n return resolve(getProjectRoot(cwd), dir);\n}\n\n/**\n * Get the absolute path to the MANIFEST.jsonl file.\n *\n * Checks config.agentOutputs.manifestFile for custom filename,\n * defaults to 'MANIFEST.jsonl'.\n *\n * @param cwd - Optional working directory for path resolution\n * @returns Absolute path to the MANIFEST.jsonl file\n *\n * @remarks\n * Checks `config.agentOutputs.manifestFile` for a custom filename,\n * defaults to `MANIFEST.jsonl` in the agent outputs directory.\n *\n * @example\n * ```typescript\n * const manifestPath = getManifestPath('/project');\n * ```\n *\n * @task T4700\n */\nexport function getManifestPath(cwd?: string): string {\n const outputDir = getAgentOutputsDir(cwd);\n const projectRoot = getProjectRoot(cwd);\n const configPath = join(projectRoot, '.cleo', 'config.json');\n\n let manifestFile = 'MANIFEST.jsonl';\n if (existsSync(configPath)) {\n try {\n const config = JSON.parse(readFileSync(configPath, 'utf-8'));\n const customFile = config.agentOutputs?.manifestFile ?? config.research?.manifestFile;\n if (customFile) {\n manifestFile = customFile;\n }\n } catch {\n // fallback\n }\n }\n\n return resolve(projectRoot, outputDir, manifestFile);\n}\n\n/**\n * Get the absolute path to the MANIFEST.archive.jsonl file.\n *\n * @param cwd - Optional working directory for path resolution\n * @returns Absolute path to the MANIFEST.archive.jsonl file\n *\n * @remarks\n * Returns the archive manifest path in the agent outputs directory.\n *\n * @example\n * ```typescript\n * const archivePath = getManifestArchivePath('/project');\n * ```\n *\n * @task T4700\n */\nexport function getManifestArchivePath(cwd?: string): string {\n const outputDir = getAgentOutputsDir(cwd);\n const projectRoot = getProjectRoot(cwd);\n return resolve(projectRoot, outputDir, 'MANIFEST.archive.jsonl');\n}\n\n// ============================================================================\n// Path Utilities\n// ============================================================================\n\n/**\n * Check if a path is absolute (POSIX or Windows).\n *\n * @param path - Filesystem path to check\n * @returns True if the path is absolute on any supported OS\n *\n * @remarks\n * Recognizes POSIX absolute paths (`/...`), Windows drive letters (`C:\\...`),\n * and UNC paths (`\\\\...`).\n *\n * @example\n * ```typescript\n * isAbsolutePath('/usr/bin'); // true\n * isAbsolutePath('C:\\\\Users'); // true\n * isAbsolutePath('./relative'); // false\n * ```\n */\nexport function isAbsolutePath(path: string): boolean {\n // POSIX absolute\n if (path.startsWith('/')) return true;\n // Windows drive letter (C:\\, D:/)\n if (/^[A-Za-z]:[\\\\/]/.test(path)) return true;\n // UNC path\n if (path.startsWith('\\\\\\\\')) return true;\n return false;\n}\n\n// ============================================================================\n// OS-Aware Global Paths (via env-paths)\n// ============================================================================\n\n/**\n * Get the OS log directory for CLEO global logs.\n * Linux: ~/.local/state/cleo | macOS: ~/Library/Logs/cleo | Windows: %LOCALAPPDATA%\\cleo\\Log\n *\n * @returns Absolute path to the OS-appropriate log directory\n *\n * @remarks\n * Delegates to `getPlatformPaths().log` for XDG-compliant resolution.\n *\n * @example\n * ```typescript\n * const logDir = getCleoLogDir();\n * ```\n */\nexport function getCleoLogDir(): string {\n return getPlatformPaths().log;\n}\n\n/**\n * Get the OS cache directory for CLEO.\n * Linux: ~/.cache/cleo | macOS: ~/Library/Caches/cleo | Windows: %LOCALAPPDATA%\\cleo\\Cache\n *\n * @returns Absolute path to the OS-appropriate cache directory\n *\n * @remarks\n * Delegates to `getPlatformPaths().cache` for XDG-compliant resolution.\n *\n * @example\n * ```typescript\n * const cacheDir = getCleoCacheDir();\n * ```\n */\nexport function getCleoCacheDir(): string {\n return getPlatformPaths().cache;\n}\n\n/**\n * Get the OS temp directory for CLEO ephemeral files.\n *\n * @returns Absolute path to the OS-appropriate temp directory\n *\n * @remarks\n * Delegates to `getPlatformPaths().temp` for platform-specific resolution.\n *\n * @example\n * ```typescript\n * const tempDir = getCleoTempDir();\n * ```\n */\nexport function getCleoTempDir(): string {\n return getPlatformPaths().temp;\n}\n\n/**\n * Get the OS config directory for CLEO.\n * Linux: ~/.config/cleo | macOS: ~/Library/Preferences/cleo | Windows: %APPDATA%\\cleo\\Config\n *\n * @returns Absolute path to the OS-appropriate config directory\n *\n * @remarks\n * Delegates to `getPlatformPaths().config` for XDG-compliant resolution.\n *\n * @example\n * ```typescript\n * const configDir = getCleoConfigDir();\n * ```\n */\nexport function getCleoConfigDir(): string {\n return getPlatformPaths().config;\n}\n\n/**\n * Get the CLEO templates directory as a tilde-prefixed path for use\n * in `@` references (AGENTS.md, CLAUDE.md, etc.). Cross-platform:\n * replaces the user's home directory with `~` so the reference works\n * when loaded by LLM providers that resolve `~` at runtime.\n *\n * Linux: ~/.local/share/cleo/templates\n * macOS: ~/Library/Application Support/cleo/templates\n * Windows: ~/AppData/Local/cleo/Data/templates (approximate)\n *\n * @returns Tilde-prefixed path like \"~/.local/share/cleo/templates\"\n *\n * @remarks\n * Returns the absolute path if the home directory is not a prefix\n * (unlikely but handled). Always uses forward slashes after the tilde\n * for cross-platform compatibility in `@`-reference resolution.\n *\n * @example\n * ```typescript\n * const tildePath = getCleoTemplatesTildePath();\n * // \"~/.local/share/cleo/templates\"\n * ```\n */\nexport function getCleoTemplatesTildePath(): string {\n const absPath = getCleoTemplatesDir();\n const home = homedir();\n if (absPath.startsWith(home)) {\n // Always use forward slash after tilde for cross-platform @-reference resolution\n const relative = absPath.slice(home.length).replace(/\\\\/g, '/');\n return `~${relative}`;\n }\n return absPath;\n}\n\n// ============================================================================\n// Third-Party Tool Paths (OS-aware)\n// ============================================================================\n\n/**\n * Get the global agents hub directory.\n * Respects AGENTS_HOME env var, defaults to ~/.agents.\n *\n * @returns Absolute path to the agents hub directory\n *\n * @remarks\n * Returns `AGENTS_HOME` env var if set, otherwise `~/.agents`.\n *\n * @example\n * ```typescript\n * const agentsHome = getAgentsHome(); // \"/home/user/.agents\"\n * ```\n */\nexport function getAgentsHome(): string {\n return process.env['AGENTS_HOME'] ?? join(homedir(), '.agents');\n}\n\n/**\n * Get the Claude Code agents directory (~/.claude/agents by default).\n *\n * @returns Absolute path to the Claude agents directory\n *\n * @remarks\n * Respects `CLAUDE_HOME` env var for the parent directory.\n *\n * @example\n * ```typescript\n * const dir = getClaudeAgentsDir();\n * ```\n *\n * @deprecated Use AdapterPathProvider.getAgentInstallDir() from the active adapter instead.\n */\nexport function getClaudeAgentsDir(): string {\n const claudeDir = process.env['CLAUDE_HOME'] ?? join(homedir(), '.claude');\n return join(claudeDir, 'agents');\n}\n\n/**\n * Get the claude-mem SQLite database path.\n *\n * @returns Absolute path to the claude-mem.db file\n *\n * @remarks\n * Respects `CLAUDE_MEM_DB` env var, defaults to `~/.claude-mem/claude-mem.db`.\n * This is a third-party tool path; homedir() is correct here (no env-paths standard).\n *\n * @example\n * ```typescript\n * const dbPath = getClaudeMemDbPath();\n * ```\n *\n * @deprecated Use AdapterPathProvider.getMemoryDbPath() from the active adapter instead.\n */\nexport function getClaudeMemDbPath(): string {\n return process.env['CLAUDE_MEM_DB'] ?? join(homedir(), '.claude-mem', 'claude-mem.db');\n}\n", "import crypto from 'node:crypto';\nimport fs, { existsSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { formatToMillis } from './migrator.utils';\n\nexport interface KitConfig {\n\tout: string;\n\tschema: string;\n}\n\nexport interface MigrationConfig {\n\tmigrationsFolder: string;\n\tmigrationsTable?: string;\n\tmigrationsSchema?: string;\n\t/** @internal */\n\tinit?: boolean;\n}\n\nexport interface MigrationMeta {\n\tsql: string[];\n\tfolderMillis: number;\n\thash: string;\n\tbps: boolean;\n\tname: string;\n}\n\nexport interface MigrationFromJournalConfig {\n\tmigrationsJournal: MigrationsJournal;\n\tmigrationsTable?: string;\n}\n\nexport type MigrationsJournal = {\n\tsql: string;\n\ttimestamp: number;\n\tname: string;\n}[];\n\n/** Only gets returned if migrator failed with `init: true` used by `drizzle-kit pull --init`*/\nexport interface MigratorInitFailResponse {\n\texitCode: 'databaseMigrations' | 'localMigrations';\n}\n\n/** Only gets returned if migrator failed with `init: true` used by `drizzle-kit pull --init`*/\nexport interface MigratorInitFailResponse {\n\texitCode: 'databaseMigrations' | 'localMigrations';\n}\n\nexport function readMigrationFiles(config: MigrationConfig): MigrationMeta[] {\n\tif (fs.existsSync(`${config.migrationsFolder}/meta/_journal.json`)) {\n\t\t// it means user has folders V2\n\t\t// we need to warn to up the folders\n\t\tthrow Error(\n\t\t\t'We detected that you have old drizzle-kit migration folders. You must upgrade drizzle-kit and run \"drizzle-kit up\"',\n\t\t);\n\t}\n\n\tconst migrationFolderTo = config.migrationsFolder;\n\n\tconst migrationQueries: MigrationMeta[] = [];\n\n\tconst migrations = readdirSync(migrationFolderTo)\n\t\t.map((subdir) => ({ path: join(migrationFolderTo, subdir, 'migration.sql'), name: subdir }))\n\t\t.filter((it) => existsSync(it.path));\n\n\tmigrations.sort((a, b) => a.name.localeCompare(b.name));\n\n\tfor (const migration of migrations) {\n\t\tconst migrationPath = migration.path;\n\t\tconst migrationDate = migration.name.slice(0, 14);\n\t\tconst query = fs.readFileSync(migrationPath).toString();\n\n\t\tconst result = query.split('--> statement-breakpoint').map((it) => {\n\t\t\treturn it;\n\t\t});\n\n\t\tconst millis = formatToMillis(migrationDate);\n\n\t\tmigrationQueries.push({\n\t\t\tsql: result,\n\t\t\tbps: true,\n\t\t\tfolderMillis: millis,\n\t\t\thash: crypto.createHash('sha256').update(query).digest('hex'),\n\t\t\tname: migration.name,\n\t\t});\n\t}\n\n\treturn migrationQueries;\n}\n", "import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport type { AnyRelations, EmptyRelations } from '~/relations.ts';\nimport type { NodeSQLiteDatabase } from './driver.ts';\n\nexport function migrate<TSchema extends Record<string, unknown>, TRelations extends AnyRelations = EmptyRelations>(\n\tdb: NodeSQLiteDatabase<TSchema, TRelations>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\treturn db.dialect.migrate(migrations, db.session, config);\n}\n", "/**\n * Centralized pino logger factory for CLEO.\n *\n * Singleton pattern. Uses pino-roll for automatic file rotation and retention.\n * Custom formatters for uppercase level labels and ISO timestamps.\n * Context via child loggers (getLogger('subsystem')).\n *\n * All diagnostic logging goes to files \u2014 stdout is reserved for structured\n * CLI output. Fallback stderr logger if not yet initialized.\n */\n\nimport { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport pino from 'pino';\n\nlet rootLogger: pino.Logger | null = null;\nlet currentLogDir: string | null = null;\n\nexport interface LoggerConfig {\n level: string;\n filePath: string;\n maxFileSize: number;\n maxFiles: number;\n}\n\n/**\n * Convert bytes to a human-readable size string for pino-roll.\n * pino-roll accepts '10m', '1g', '500k', etc.\n */\nfunction bytesToSizeString(bytes: number): string {\n if (bytes >= 1024 * 1024 * 1024) return `${Math.floor(bytes / (1024 * 1024 * 1024))}g`;\n if (bytes >= 1024 * 1024) return `${Math.floor(bytes / (1024 * 1024))}m`;\n if (bytes >= 1024) return `${Math.floor(bytes / 1024)}k`;\n return `${bytes}`;\n}\n\n/**\n * Initialize the root logger. Call once at startup.\n *\n * Uses pino-roll for automatic size+daily rotation with built-in retention.\n * No custom rotation code needed.\n *\n * @param cleoDir - Absolute path to .cleo directory\n * @param config - Logging configuration from CleoConfig.logging\n * @param projectHash - Stable project identity token bound to every log entry.\n * Optional for backward compatibility; warns if absent.\n * @returns The root pino logger instance\n */\nexport function initLogger(\n cleoDir: string,\n config: LoggerConfig,\n projectHash?: string,\n): pino.Logger {\n const dest = join(cleoDir, config.filePath);\n currentLogDir = dirname(dest);\n\n // Log directory should already exist via ensureCleoStructure() which\n // creates all REQUIRED_CLEO_SUBDIRS including 'logs'. The pino-roll\n // transport has mkdir: true as a safety net for edge cases where the\n // logger is initialized before scaffold (e.g. early startup fallback).\n if (!existsSync(currentLogDir)) {\n // Emit to stderr \u2014 stdout is reserved for structured output\n process.stderr.write(\n `[cleo:logger] Log directory missing: ${currentLogDir} \u2014 pino-roll will create it\\n`,\n );\n }\n\n // Use pino-roll transport for automatic rotation and retention.\n // pino.transport() runs in a worker thread; sync: true ensures\n // no log loss on process exit (critical for CLI tools).\n const transport = pino.transport({\n target: 'pino-roll',\n options: {\n file: dest,\n size: bytesToSizeString(config.maxFileSize),\n frequency: 'daily',\n dateFormat: 'yyyy-MM-dd',\n mkdir: true,\n limit: {\n count: config.maxFiles,\n removeOtherLogFiles: true,\n },\n },\n });\n\n // Build base object: projectHash and platform info appear in every log entry.\n // Pino merges base with pid/hostname by default; we add our fields alongside.\n const base: Record<string, unknown> = {\n platform: process.platform,\n arch: process.arch,\n nodeVersion: process.version,\n };\n if (projectHash) {\n base.projectHash = projectHash;\n }\n\n rootLogger = pino(\n {\n level: config.level,\n base,\n formatters: {\n level: (label: string) => ({ level: label.toUpperCase() }),\n },\n timestamp: pino.stdTimeFunctions.isoTime,\n },\n transport,\n );\n\n // Warn after logger is initialized so the message goes to the log file\n if (!projectHash) {\n getLogger('engine').warn(\n 'projectHash not provided to initLogger; audit correlation will be incomplete',\n );\n }\n\n return rootLogger;\n}\n\n/**\n * Get a child logger bound to a subsystem name.\n *\n * Safe to call before initLogger \u2014 returns a stderr fallback logger\n * so early startup code and tests never crash.\n *\n * @param subsystem - Logical subsystem name (e.g. 'audit', 'dispatch', 'migration')\n */\nexport function getLogger(subsystem: string): pino.Logger {\n if (!rootLogger) {\n // Fallback: stderr logger (stdout reserved for structured output)\n return pino(\n {\n level: 'warn',\n formatters: { level: (label: string) => ({ level: label.toUpperCase() }) },\n },\n pino.destination(2),\n ).child({ subsystem });\n }\n return rootLogger.child({ subsystem });\n}\n\n/**\n * Get the current log directory path.\n * Useful for read APIs that need to scan log files.\n */\nexport function getLogDir(): string | null {\n return currentLogDir;\n}\n\n/**\n * Flush and close the logger. Call during graceful shutdown.\n *\n * Returns a Promise that resolves once the pino transport worker thread\n * has processed all pending writes. Callers that cannot await (e.g. sync\n * shutdown handlers) may fire-and-forget safely \u2014 the underlying flush\n * will still occur before the process exits.\n */\nexport function closeLogger(): Promise<void> {\n return new Promise<void>((resolve) => {\n if (rootLogger) {\n rootLogger.flush(() => {\n rootLogger = null;\n currentLogDir = null;\n resolve();\n });\n } else {\n resolve();\n }\n });\n}\n", "/**\n * Unified migration manager for SQLite databases.\n *\n * Consolidates duplicated reconciliation, bootstrap, retry, and column-safety\n * logic that was previously copy-pasted between sqlite.ts (tasks.db) and\n * memory-sqlite.ts (brain.db). Both modules now delegate to these shared functions.\n *\n * @task T132\n * @see https://github.com/anthropics/cleo/issues/82\n * @see https://github.com/anthropics/cleo/issues/63\n * @see https://github.com/anthropics/cleo/issues/65\n */\n\nimport { copyFileSync, existsSync } from 'node:fs';\nimport type { DatabaseSync } from 'node:sqlite';\nimport { readMigrationFiles } from 'drizzle-orm/migrator';\nimport type { NodeSQLiteDatabase } from 'drizzle-orm/node-sqlite';\nimport { migrate } from 'drizzle-orm/node-sqlite/migrator';\nimport { getLogger } from '../logger.js';\n\n/** Required column definition for ensureColumns(). */\nexport interface RequiredColumn {\n name: string;\n /** ALTER TABLE ADD COLUMN DDL suffix (e.g., 'text', 'integer DEFAULT 0'). */\n ddl: string;\n}\n\n/** Migration retry constants for SQLITE_BUSY handling (T5185). */\nconst MAX_MIGRATION_RETRIES = 5;\nconst MIGRATION_RETRY_BASE_DELAY_MS = 100;\nconst MIGRATION_RETRY_MAX_DELAY_MS = 2000;\n\n/**\n * Check whether a table exists in a SQLite database.\n */\nexport function tableExists(nativeDb: DatabaseSync, tableName: string): boolean {\n const result = nativeDb\n .prepare(\"SELECT name FROM sqlite_master WHERE type='table' AND name=?\")\n .get(tableName) as Record<string, unknown> | undefined;\n return !!result;\n}\n\n/**\n * Check if an error is a SQLite BUSY error (database locked by another process).\n * node:sqlite throws native Error with message containing the SQLite error code.\n * @task T5185\n */\nexport function isSqliteBusy(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n const msg = err.message.toLowerCase();\n return msg.includes('sqlite_busy') || msg.includes('database is locked');\n}\n\n/**\n * Create a pre-migration safety backup of the database file.\n *\n * Only creates the backup once (idempotent). Non-fatal on failure.\n */\nexport function createSafetyBackup(dbPath: string): void {\n const backupPath = dbPath.replace(/\\.db$/, '-pre-cleo.db.bak');\n if (!existsSync(backupPath)) {\n try {\n copyFileSync(dbPath, backupPath);\n } catch {\n /* non-fatal */\n }\n }\n}\n\n/**\n * Insert a journal entry including `name` so Drizzle v1 beta (which checks by name,\n * not hash) correctly identifies the migration as already applied.\n *\n * Emits INSERT OR IGNORE to avoid duplicate-row errors when called defensively.\n */\nfunction insertJournalEntry(\n nativeDb: DatabaseSync,\n hash: string,\n createdAt: number,\n name: string,\n): void {\n // Ensure the name and applied_at columns exist (Drizzle v1 beta schema).\n // These are added by upgradeSyncIfNeeded, but reconcileJournal may run before\n // the first migrate() call that triggers the upgrade.\n const columns = nativeDb.prepare('PRAGMA table_info(\"__drizzle_migrations\")').all() as Array<{\n name: string;\n }>;\n const colNames = new Set(columns.map((c) => c.name));\n if (!colNames.has('name')) {\n nativeDb.exec('ALTER TABLE \"__drizzle_migrations\" ADD COLUMN \"name\" text');\n }\n if (!colNames.has('applied_at')) {\n nativeDb.exec('ALTER TABLE \"__drizzle_migrations\" ADD COLUMN \"applied_at\" TEXT');\n }\n\n nativeDb.exec(\n `INSERT OR IGNORE INTO \"__drizzle_migrations\" (\"hash\", \"created_at\", \"name\") VALUES ('${hash}', ${createdAt}, '${name}')`,\n );\n}\n\n/**\n * Probe a migration's DDL against the live schema and mark the journal entry\n * applied IF AND ONLY IF all DDL targets already exist in the database.\n *\n * Supports three DDL forms commonly emitted by drizzle migrations:\n * - `ALTER TABLE foo ADD COLUMN bar text` \u2192 mark applied if column foo.bar exists\n * - `CREATE TABLE foo (...)` \u2192 mark applied if table foo exists\n * - `CREATE INDEX [IF NOT EXISTS] idx_foo ON foo(...)` \u2192 mark applied if index exists\n *\n * If the migration contains DDL that doesn't fall into these patterns, or if any\n * target is missing, the function returns false and DOES NOT mark applied \u2014\n * leaving the migration for Drizzle's normal `migrate()` to run.\n *\n * Used by:\n * - Scenario 2 Sub-case B (after journal reset, decide what was already applied)\n * - Scenario 3 (originally inline; now extracted for reuse)\n *\n * Replaces the broken \"wholesale mark applied\" pattern that was the root cause\n * of the ensureColumns band-aid sprawl (T632).\n *\n * @param nativeDb - Native SQLite database handle\n * @param migration - One entry from drizzle's readMigrationFiles\n * @param logSubsystem - Logger subsystem name\n * @returns true if the journal entry was inserted; false if migration must run\n */\nfunction probeAndMarkApplied(\n nativeDb: DatabaseSync,\n migration: { hash: string; folderMillis: number; name?: string; sql?: string | string[] },\n logSubsystem: string,\n): boolean {\n const sqlStatements = Array.isArray(migration.sql) ? migration.sql : [migration.sql ?? ''];\n const fullSql = sqlStatements.join('\\n');\n\n // Extract DDL targets we can probe.\n const alterColumnRegex = /ALTER\\s+TABLE\\s+[`\"]?(\\w+)[`\"]?\\s+ADD\\s+COLUMN\\s+[`\"]?(\\w+)[`\"]?/gi;\n const createTableRegex = /CREATE\\s+TABLE\\s+(?:IF\\s+NOT\\s+EXISTS\\s+)?[`\"]?(\\w+)[`\"]?/gi;\n const createIndexRegex =\n /CREATE\\s+(?:UNIQUE\\s+)?INDEX\\s+(?:IF\\s+NOT\\s+EXISTS\\s+)?[`\"]?(\\w+)[`\"]?/gi;\n\n const alterTargets: Array<{ table: string; column: string }> = [];\n for (const m of fullSql.matchAll(alterColumnRegex)) {\n alterTargets.push({ table: m[1] as string, column: m[2] as string });\n }\n const tableTargets: string[] = [];\n for (const m of fullSql.matchAll(createTableRegex)) {\n tableTargets.push(m[1] as string);\n }\n const indexTargets: string[] = [];\n for (const m of fullSql.matchAll(createIndexRegex)) {\n indexTargets.push(m[1] as string);\n }\n\n const totalTargets = alterTargets.length + tableTargets.length + indexTargets.length;\n if (totalTargets === 0) {\n // No probable DDL \u2014 could be UPDATE/INSERT/DELETE/etc. Leave for migrate().\n return false;\n }\n\n // Probe each target.\n const allAltersPresent = alterTargets.every(({ table, column }) => {\n if (!tableExists(nativeDb, table)) return false;\n const cols = nativeDb.prepare(`PRAGMA table_info(${table})`).all() as Array<{\n name: string;\n }>;\n return cols.some((c) => c.name === column);\n });\n const allTablesPresent = tableTargets.every((t) => tableExists(nativeDb, t));\n const allIndexesPresent = indexTargets.every((idx) => {\n const rows = nativeDb\n .prepare(`SELECT name FROM sqlite_master WHERE type='index' AND name=?`)\n .all(idx) as Array<{ name: string }>;\n return rows.length > 0;\n });\n\n if (allAltersPresent && allTablesPresent && allIndexesPresent) {\n insertJournalEntry(nativeDb, migration.hash, migration.folderMillis, migration.name ?? '');\n const log = getLogger(logSubsystem);\n log.debug(\n {\n migration: migration.name,\n alters: alterTargets.length,\n tables: tableTargets.length,\n indexes: indexTargets.length,\n },\n `Migration ${migration.name} DDL already present in schema \u2014 marked applied.`,\n );\n return true;\n }\n\n // At least one target missing \u2014 leave for drizzle migrate() to run.\n return false;\n}\n\n/**\n * Bootstrap and reconcile the Drizzle migration journal.\n *\n * Handles four scenarios:\n * 1. Tables exist but no __drizzle_migrations \u2014 bootstrap baseline as applied\n * 2. Journal has orphaned hashes (from older CLEO version) \u2014 clear and re-mark all as applied\n * 3. Journal exists but is missing entries for migrations whose DDL has already been applied\n * (e.g., ALTER TABLE ADD COLUMN ran but journal entry was never written \u2014 happens when\n * migrations are cherry-picked from worktrees or the process crashes mid-migration).\n * Auto-inserts the missing journal entry so Drizzle skips the migration instead of\n * re-running ALTER TABLE and crashing on \"duplicate column name\".\n * 4. Journal entries exist but have null `name` \u2014 Drizzle v1 beta identifies applied\n * migrations by name, so entries without a name are invisible to it, causing already-\n * applied migrations to be re-run and fail with \"duplicate column name\". Backfills\n * the name from the local migration file matched by hash.\n *\n * @param nativeDb - Native SQLite database handle\n * @param migrationsFolder - Path to the drizzle migrations folder\n * @param existenceTable - A table name used to detect if the DB has data (e.g., 'tasks' or 'brain_decisions')\n * @param logSubsystem - Logger subsystem name for reconciliation warnings\n */\nexport function reconcileJournal(\n nativeDb: DatabaseSync,\n migrationsFolder: string,\n existenceTable: string,\n logSubsystem: string,\n): void {\n // Scenario 1: Tables exist but no migration journal \u2014 bootstrap baseline\n if (tableExists(nativeDb, existenceTable) && !tableExists(nativeDb, '__drizzle_migrations')) {\n const migrations = readMigrationFiles({ migrationsFolder });\n const baseline = migrations[0];\n if (baseline) {\n nativeDb.exec(`\n CREATE TABLE IF NOT EXISTS \"__drizzle_migrations\" (\n id INTEGER PRIMARY KEY,\n hash text NOT NULL,\n created_at numeric,\n name text,\n applied_at TEXT\n )\n `);\n insertJournalEntry(nativeDb, baseline.hash, baseline.folderMillis, baseline.name ?? '');\n }\n }\n\n // Scenario 2: Journal has orphaned entries from a previous CLEO version\n //\n // Two distinct sub-cases require different handling:\n //\n // A) DB is AHEAD of this install (forward-compatibility): all local hashes\n // are present in the DB, but the DB also has additional entries for\n // migrations this install does not know about. This happens when a user\n // runs a globally-installed (older) cleo binary against a DB that was\n // last written by a newer cleo version. Deleting those entries would\n // cause an infinite reconciliation cycle: Drizzle re-runs the \"missing\"\n // migrations, hits duplicate-column errors (Scenario 3 recovers), writes\n // them back \u2014 only for this install to delete them again on the next run.\n // ACTION: skip reconciliation, log at debug only.\n //\n // B) DB has stale hashes from a genuinely old CLEO version whose checksum\n // algorithm produced different hashes for the same migration files (i.e.,\n // at least one local hash is MISSING from the DB while other DB entries\n // are unrecognised). ACTION: delete and re-seed as before, log at warn.\n if (tableExists(nativeDb, '__drizzle_migrations') && tableExists(nativeDb, existenceTable)) {\n const localMigrations = readMigrationFiles({ migrationsFolder });\n const localHashes = new Set(localMigrations.map((m) => m.hash));\n const dbEntries = nativeDb.prepare('SELECT hash FROM \"__drizzle_migrations\"').all() as Array<{\n hash: string;\n }>;\n const orphanedEntries = dbEntries.filter((e) => !localHashes.has(e.hash));\n const hasOrphanedEntries = orphanedEntries.length > 0;\n\n if (hasOrphanedEntries) {\n const dbHashes = new Set(dbEntries.map((e) => e.hash));\n const allLocalHashesPresentInDb = localMigrations.every((m) => dbHashes.has(m.hash));\n\n if (allLocalHashesPresentInDb) {\n // Sub-case A: DB is ahead \u2014 this install is older than the DB.\n // Do NOT modify the journal; log at debug so we can trace if needed.\n const log = getLogger(logSubsystem);\n log.debug(\n { extra: orphanedEntries.length },\n `Migration journal has ${orphanedEntries.length} entries for migrations not known to this install (DB is ahead). Skipping reconciliation.`,\n );\n } else {\n // Sub-case B: Genuine stale hashes from an older CLEO version.\n // ROOT-CAUSE FIX (T632): The previous implementation DELETEd the journal\n // and INSERTed all local migrations as applied WITHOUT running their SQL.\n // That meant ALTER TABLE migrations (T417 agent, T528 provenance, etc.)\n // got marked applied but their columns were never added \u2014 forcing\n // ensureColumns band-aids in memory-sqlite.ts to patch the missing schema.\n //\n // Real fix: clear orphaned entries, then PROBE each local migration's\n // DDL. Mark applied ONLY if the DDL targets already exist in the schema.\n // Drizzle's migrate() (called next) will run whatever remains unjournaled.\n const log = getLogger(logSubsystem);\n log.warn(\n { orphaned: orphanedEntries.length },\n `Detected stale migration journal entries from a previous CLEO version. Reconciling via DDL probe.`,\n );\n nativeDb.exec('DELETE FROM \"__drizzle_migrations\"');\n for (const m of localMigrations) {\n probeAndMarkApplied(nativeDb, m, logSubsystem);\n }\n }\n }\n }\n\n // Scenario 3: Journal exists but is missing entries for already-applied migrations.\n // Detects migrations whose DDL columns already exist in the database but whose\n // journal entry was never written (e.g., cherry-picked from a worktree, or process\n // crashed after the ALTER TABLE succeeded but before the journal INSERT committed).\n //\n // T920: Extended to handle PARTIAL application \u2014 when SOME ALTER targets exist but\n // not all (e.g., T528 where brain_page_nodes ALTERs ran but brain_page_edges.provenance\n // did not). In this case the migration also has DROP TABLE + CREATE TABLE statements,\n // so the full migration cannot be re-run (the existing columns cause duplicate-column\n // errors). Fix: add any missing ALTER columns via idempotent ALTER TABLE, then mark\n // the migration as applied so Drizzle skips it.\n if (tableExists(nativeDb, '__drizzle_migrations') && tableExists(nativeDb, existenceTable)) {\n const localMigrations = readMigrationFiles({ migrationsFolder });\n const journalEntries = nativeDb\n .prepare('SELECT hash FROM \"__drizzle_migrations\"')\n .all() as Array<{ hash: string }>;\n const journaledHashes = new Set(journalEntries.map((e) => e.hash));\n\n for (const migration of localMigrations) {\n if (journaledHashes.has(migration.hash)) continue;\n\n // Parse the migration SQL for ALTER TABLE ... ADD COLUMN statements.\n // drizzle's readMigrationFiles returns sql as string[] (one entry per\n // statement-breakpoint-separated statement), so join them for regex scanning.\n const alterColumnRegex =\n /ALTER\\s+TABLE\\s+[`\"]?(\\w+)[`\"]?\\s+ADD\\s+COLUMN\\s+[`\"]?(\\w+)[`\"]?\\s*(.*?)(?:;|$)/gi;\n const alterMatches: Array<{ table: string; column: string; ddl: string }> = [];\n const sqlStatements = Array.isArray(migration.sql) ? migration.sql : [migration.sql ?? ''];\n const fullSql = sqlStatements.join('\\n');\n for (const m of fullSql.matchAll(alterColumnRegex)) {\n alterMatches.push({\n table: m[1] as string,\n column: m[2] as string,\n ddl: ((m[3] as string) || '').trim(),\n });\n }\n\n // Only auto-reconcile migrations that have at least one ALTER TABLE ADD COLUMN.\n // Pure CREATE INDEX / DROP INDEX migrations that have no journal entry are\n // genuinely pending and must run normally.\n if (alterMatches.length === 0) continue;\n\n // Check which ADD COLUMN targets already exist and which are missing.\n const existingColumns: Array<{ table: string; column: string; ddl: string }> = [];\n const missingColumns: Array<{ table: string; column: string; ddl: string }> = [];\n\n for (const target of alterMatches) {\n if (!tableExists(nativeDb, target.table)) {\n missingColumns.push(target);\n continue;\n }\n const cols = nativeDb.prepare(`PRAGMA table_info(${target.table})`).all() as Array<{\n name: string;\n }>;\n if (cols.some((c) => c.name === target.column)) {\n existingColumns.push(target);\n } else {\n missingColumns.push(target);\n }\n }\n\n // Case A: All ALTER targets already exist \u2014 mark as applied (original behaviour).\n if (missingColumns.length === 0) {\n const log = getLogger(logSubsystem);\n log.warn(\n { migration: migration.name, columns: alterMatches },\n `Detected partially-applied migration ${migration.name} \u2014 columns exist but journal entry missing. Auto-reconciling.`,\n );\n insertJournalEntry(nativeDb, migration.hash, migration.folderMillis, migration.name ?? '');\n continue;\n }\n\n // Case B (T920): SOME columns exist but others are missing \u2014 the migration was\n // partially applied. If at least one column already exists from this migration's\n // ALTER TABLE set, Drizzle cannot re-run the migration (the existing columns cause\n // \"duplicate column name\"). Idempotently add the missing columns, then mark applied.\n //\n // We do NOT attempt to run DROP TABLE / CREATE TABLE statements from the migration\n // (e.g., T528's brain_page_edges table recreation for weight NOT NULL), because\n // the table already has data-compatible columns from the partial apply. The\n // ensureColumns call in memory-sqlite.ts provides any remaining structural safety net.\n if (existingColumns.length > 0 && missingColumns.length > 0) {\n const log = getLogger(logSubsystem);\n log.warn(\n {\n migration: migration.name,\n existingColumns: existingColumns.map((c) => `${c.table}.${c.column}`),\n missingColumns: missingColumns.map((c) => `${c.table}.${c.column}`),\n },\n `T920: Detected partial migration ${migration.name} \u2014 some ALTER columns exist, some missing. Adding missing columns and marking applied.`,\n );\n\n // Add each missing column only if its table exists (guard against DROP TABLE\n // mid-migration removing the table entirely).\n for (const { table, column, ddl } of missingColumns) {\n if (!tableExists(nativeDb, table)) continue;\n try {\n nativeDb.exec(`ALTER TABLE ${table} ADD COLUMN ${column}${ddl ? ` ${ddl}` : ''}`);\n log.warn(\n { migration: migration.name, table, column },\n `T920: Added missing column ${table}.${column} to complete partial migration.`,\n );\n } catch {\n // Column add failed (e.g., NOT NULL without default on non-empty table).\n // Log and continue \u2014 the subsequent migrate() call may still succeed or\n // fall through to the duplicate-column retry handler.\n log.warn(\n { migration: migration.name, table, column },\n `T920: Could not add missing column ${table}.${column} \u2014 will let Drizzle migrate() handle it.`,\n );\n }\n }\n\n insertJournalEntry(nativeDb, migration.hash, migration.folderMillis, migration.name ?? '');\n }\n }\n }\n\n // Scenario 4: Journal entries exist but have null `name`.\n //\n // Drizzle v1 beta changed getMigrationsToRun to filter by `name` (not hash).\n // Journal entries inserted by older CLEO code (INSERT without \"name\") have\n // name = null, which Drizzle filters out \u2014 making it treat those migrations as\n // unapplied and re-run them. This causes \"duplicate column name\" failures for\n // migrations whose DDL has already been applied.\n //\n // Fix: backfill `name` for any journal entries that have name = null but whose\n // hash matches a known local migration file.\n if (tableExists(nativeDb, '__drizzle_migrations') && tableExists(nativeDb, existenceTable)) {\n // Check if the name column exists before querying it\n const migCols = nativeDb.prepare('PRAGMA table_info(\"__drizzle_migrations\")').all() as Array<{\n name: string;\n }>;\n const hasMigNameCol = migCols.some((c) => c.name === 'name');\n if (!hasMigNameCol) return; // name column absent \u2014 upgradeSyncIfNeeded will handle it\n\n const localMigrations = readMigrationFiles({ migrationsFolder });\n const hashToName = new Map(localMigrations.map((m) => [m.hash, m.name ?? '']));\n\n const unnamedEntries = nativeDb\n .prepare('SELECT id, hash FROM \"__drizzle_migrations\" WHERE name IS NULL')\n .all() as Array<{ id: number; hash: string }>;\n\n for (const entry of unnamedEntries) {\n const migrationName = hashToName.get(entry.hash);\n if (!migrationName) continue; // orphaned entry \u2014 leave for Scenario 2\n\n const log = getLogger(logSubsystem);\n log.warn(\n { id: entry.id, hash: entry.hash, name: migrationName },\n `Backfilling missing name on journal entry id=${entry.id} \u2014 Drizzle v1 beta requires name for applied-migration detection.`,\n );\n nativeDb.exec(\n `UPDATE \"__drizzle_migrations\" SET \"name\" = '${migrationName}' WHERE id = ${entry.id}`,\n );\n }\n }\n}\n\n/**\n * Check whether an error is a SQLite \"duplicate column name\" error.\n *\n * These are thrown when an ALTER TABLE ADD COLUMN statement is re-executed\n * after the column was already added (Scenario 3 in reconcileJournal).\n */\nexport function isDuplicateColumnError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n return /duplicate column name/i.test(err.message);\n}\n\n/**\n * Run Drizzle migrations with SQLITE_BUSY retry and exponential backoff.\n *\n * Also handles \"duplicate column name\" errors (Scenario 3): if Drizzle tries to\n * re-apply a migration whose DDL columns already exist (journal entry missing),\n * this function calls reconcileJournal again to insert the missing entry and\n * retries migrate() once more. This is the belt-and-suspenders safety net for\n * any partial migration that slips through the proactive reconcileJournal check.\n *\n * @param db - Drizzle database instance\n * @param migrationsFolder - Path to the drizzle migrations folder\n * @param nativeDb - Optional native SQLite handle for duplicate-column auto-reconcile\n * @param existenceTable - Optional existence-check table name for auto-reconcile\n * @param logSubsystem - Optional logger subsystem name for auto-reconcile warnings\n */\nexport function migrateWithRetry(\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle's NodeSQLiteDatabase is generic \u2014 accepting any schema avoids coupling to a specific schema type\n db: NodeSQLiteDatabase<any>,\n migrationsFolder: string,\n nativeDb?: DatabaseSync,\n existenceTable?: string,\n logSubsystem?: string,\n): void {\n let duplicateColumnReconciled = false;\n\n for (let attempt = 1; attempt <= MAX_MIGRATION_RETRIES; attempt++) {\n try {\n migrate(db, { migrationsFolder });\n return;\n } catch (err) {\n // Belt-and-suspenders: if Drizzle hits a duplicate column name error on\n // the first attempt and we have the native DB handle, run Scenario 3\n // reconcileJournal and retry once. This catches any partial migration that\n // slipped through the proactive check run before migrateWithRetry.\n if (\n isDuplicateColumnError(err) &&\n !duplicateColumnReconciled &&\n nativeDb !== undefined &&\n existenceTable !== undefined &&\n logSubsystem !== undefined\n ) {\n duplicateColumnReconciled = true;\n reconcileJournal(nativeDb, migrationsFolder, existenceTable, logSubsystem);\n continue;\n }\n\n if (!isSqliteBusy(err) || attempt === MAX_MIGRATION_RETRIES) {\n throw err;\n }\n const delay = Math.min(\n MIGRATION_RETRY_BASE_DELAY_MS * 2 ** (attempt - 1) * (1 + Math.random() * 0.5),\n MIGRATION_RETRY_MAX_DELAY_MS,\n );\n Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, Math.round(delay));\n }\n }\n}\n\n/**\n * Ensure all required columns exist on a table.\n *\n * Uses PRAGMA table_info to inspect the schema and adds any missing columns\n * via ALTER TABLE ADD COLUMN. Safety net for databases where Drizzle migrations\n * could not run due to journal corruption or version skew.\n *\n * @param nativeDb - Native SQLite database handle\n * @param tableName - Table to check (e.g., 'tasks')\n * @param requiredColumns - Columns that must exist\n * @param logSubsystem - Logger subsystem name\n */\nexport function ensureColumns(\n nativeDb: DatabaseSync,\n tableName: string,\n requiredColumns: RequiredColumn[],\n logSubsystem: string,\n): void {\n if (!tableExists(nativeDb, tableName)) return;\n if (requiredColumns.length === 0) return;\n\n const columns = nativeDb.prepare(`PRAGMA table_info(${tableName})`).all() as Array<{\n name: string;\n }>;\n const existingCols = new Set(columns.map((c) => c.name));\n\n for (const req of requiredColumns) {\n if (!existingCols.has(req.name)) {\n const log = getLogger(logSubsystem);\n log.warn(\n { column: req.name },\n `Adding missing column ${tableName}.${req.name} via ALTER TABLE`,\n );\n nativeDb.exec(`ALTER TABLE ${tableName} ADD COLUMN ${req.name} ${req.ddl}`);\n }\n }\n}\n", "/**\n * SQLite store for conduit.db \u2014 project-tier messaging and agent-ref database.\n *\n * Creates and manages .cleo/conduit.db using node:sqlite directly.\n * Applies the full conduit.db DDL (from spec \u00A72.1) to bootstrap all\n * project-local messaging tables and the project_agent_refs override table.\n *\n * Architecture (ADR-037):\n * conduit.db \u2014 project-scoped (this module) \u2014 messaging, delivery, attachments,\n * project_agent_refs\n * signaldock.db \u2014 global-scoped (T346) \u2014 agents, capabilities, cloud-sync tables\n *\n * CRUD accessors for project_agent_refs land in T353.\n * Cross-DB join accessor changes land in T355.\n * Migration executor from signaldock.db \u2192 conduit.db lands in T358.\n *\n * @task T344\n * @epic T310\n * @why ADR-037 splits single signaldock.db into project-tier conduit.db\n * (this module) and global-tier signaldock.db (T346). This module owns\n * the project-tier path helper, initializer, schema DDL, and health check.\n * @what Path helper, database initializer, schema applier, health check, and\n * native DB accessor for project-local tables. No CRUD, no migrations.\n */\n\nimport { existsSync, mkdirSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { dirname, join } from 'node:path';\n// underscore-import: node:sqlite type alias required for createRequire interop.\n// Vitest/Vite cannot resolve `node:sqlite` as an ESM import (strips `node:` prefix).\n// Use createRequire as the runtime loader; keep type-only import for annotations.\nimport type { DatabaseSync as _DatabaseSyncType } from 'node:sqlite';\nimport type { ProjectAgentRef } from '@cleocode/contracts';\n\nconst _require = createRequire(import.meta.url);\ntype DatabaseSync = _DatabaseSyncType;\nconst { DatabaseSync } = _require('node:sqlite') as {\n DatabaseSync: new (...args: ConstructorParameters<typeof _DatabaseSyncType>) => DatabaseSync;\n};\n\n/** Database file name within .cleo/ directory. */\nexport const CONDUIT_DB_FILENAME = 'conduit.db';\n\n/** Schema version for conduit.db \u2014 updated when DDL changes. */\nexport const CONDUIT_SCHEMA_VERSION = '2026.4.12';\n\n// ---------------------------------------------------------------------------\n// Singleton state\n// ---------------------------------------------------------------------------\n\nlet _conduitNativeDb: DatabaseSync | null = null;\nlet _conduitDbPath: string | null = null;\n\n// ---------------------------------------------------------------------------\n// DDL\n// ---------------------------------------------------------------------------\n\n/**\n * Full conduit.db schema SQL.\n *\n * All tables use CREATE TABLE IF NOT EXISTS / CREATE INDEX IF NOT EXISTS /\n * CREATE TRIGGER IF NOT EXISTS for idempotency. Carried over verbatim from\n * the project-local tables in signaldock-sqlite.ts (migration\n * `2026-03-28-000000_initial` + subsequent migrations), minus the global-\n * identity tables (agents, capabilities, skills, agent_capabilities,\n * agent_skills, agent_connections, users, organization, accounts, sessions,\n * verifications, claim_codes, org_agent_keys) which move to global-tier\n * signaldock.db (T346).\n *\n * Additional new table: project_agent_refs (ADR-037 \u00A73, Q6=A).\n *\n * NOTE: The `connections` table from the original migration is a cross-agent\n * social graph that references `agents(id)` \u2014 it is a global-identity\n * concern and stays with signaldock.db (T346). It is NOT included here.\n */\nconst CONDUIT_SCHEMA_SQL = `\n-- -------------------------------------------------------------------------\n-- Project-scoped conversations (LocalTransport DM threads).\n-- -------------------------------------------------------------------------\nCREATE TABLE IF NOT EXISTS conversations (\n id TEXT PRIMARY KEY,\n participants TEXT NOT NULL,\n visibility TEXT NOT NULL DEFAULT 'private',\n message_count INTEGER NOT NULL DEFAULT 0,\n last_message_at INTEGER,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n);\n\n-- -------------------------------------------------------------------------\n-- Project-scoped agent-to-agent messages (LocalTransport content).\n-- -------------------------------------------------------------------------\nCREATE TABLE IF NOT EXISTS messages (\n id TEXT PRIMARY KEY,\n conversation_id TEXT NOT NULL REFERENCES conversations(id),\n from_agent_id TEXT NOT NULL,\n to_agent_id TEXT NOT NULL,\n content TEXT NOT NULL,\n content_type TEXT NOT NULL DEFAULT 'text',\n status TEXT NOT NULL DEFAULT 'pending',\n attachments TEXT NOT NULL DEFAULT '[]',\n group_id TEXT,\n metadata TEXT DEFAULT '{}',\n reply_to TEXT,\n created_at INTEGER NOT NULL,\n delivered_at INTEGER,\n read_at INTEGER\n);\nCREATE INDEX IF NOT EXISTS messages_conversation_idx ON messages(conversation_id);\nCREATE INDEX IF NOT EXISTS messages_from_agent_idx ON messages(from_agent_id);\nCREATE INDEX IF NOT EXISTS messages_to_agent_idx ON messages(to_agent_id);\nCREATE INDEX IF NOT EXISTS messages_created_at_idx ON messages(created_at);\nCREATE INDEX IF NOT EXISTS idx_messages_group_id ON messages(group_id) WHERE group_id IS NOT NULL;\nCREATE INDEX IF NOT EXISTS idx_messages_reply_to ON messages(reply_to) WHERE reply_to IS NOT NULL;\n\n-- -------------------------------------------------------------------------\n-- FTS5 virtual table for full-text search on message content.\n-- NOTE: Must be migrated using VACUUM INTO, not DDL-only copy, to preserve\n-- triggers. The INSERT INTO messages_fts(messages_fts) VALUES('rebuild')\n-- is idempotent \u2014 safe to run on every open.\n-- -------------------------------------------------------------------------\nCREATE VIRTUAL TABLE IF NOT EXISTS messages_fts\n USING fts5(content, from_agent_id, content='messages', content_rowid='rowid');\nINSERT INTO messages_fts(messages_fts) VALUES('rebuild');\nCREATE TRIGGER IF NOT EXISTS messages_ai AFTER INSERT ON messages BEGIN\n INSERT INTO messages_fts(rowid, content, from_agent_id)\n VALUES (new.rowid, new.content, new.from_agent_id);\nEND;\nCREATE TRIGGER IF NOT EXISTS messages_ad AFTER DELETE ON messages BEGIN\n INSERT INTO messages_fts(messages_fts, rowid, content, from_agent_id)\n VALUES('delete', old.rowid, old.content, old.from_agent_id);\nEND;\nCREATE TRIGGER IF NOT EXISTS messages_au AFTER UPDATE ON messages BEGIN\n INSERT INTO messages_fts(messages_fts, rowid, content, from_agent_id)\n VALUES('delete', old.rowid, old.content, old.from_agent_id);\n INSERT INTO messages_fts(rowid, content, from_agent_id)\n VALUES (new.rowid, new.content, new.from_agent_id);\nEND;\n\n-- -------------------------------------------------------------------------\n-- Async delivery queue for deferred message dispatch.\n-- -------------------------------------------------------------------------\nCREATE TABLE IF NOT EXISTS delivery_jobs (\n id TEXT PRIMARY KEY,\n message_id TEXT NOT NULL,\n payload TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n attempts INTEGER NOT NULL DEFAULT 0,\n max_attempts INTEGER NOT NULL DEFAULT 6,\n next_attempt_at INTEGER NOT NULL,\n last_error TEXT,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n);\nCREATE INDEX IF NOT EXISTS idx_delivery_jobs_status ON delivery_jobs(status, next_attempt_at);\n\n-- -------------------------------------------------------------------------\n-- Dead-letter queue for messages that exceeded max delivery attempts.\n-- -------------------------------------------------------------------------\nCREATE TABLE IF NOT EXISTS dead_letters (\n id TEXT PRIMARY KEY,\n message_id TEXT NOT NULL,\n job_id TEXT NOT NULL,\n reason TEXT NOT NULL,\n attempts INTEGER NOT NULL,\n created_at INTEGER NOT NULL\n);\nCREATE INDEX IF NOT EXISTS idx_dead_letters_message ON dead_letters(message_id);\n\n-- -------------------------------------------------------------------------\n-- Pinned messages within a conversation.\n-- -------------------------------------------------------------------------\nCREATE TABLE IF NOT EXISTS message_pins (\n id TEXT PRIMARY KEY,\n message_id TEXT NOT NULL,\n conversation_id TEXT NOT NULL,\n pinned_by TEXT NOT NULL,\n note TEXT,\n created_at INTEGER NOT NULL,\n UNIQUE(message_id, pinned_by)\n);\nCREATE INDEX IF NOT EXISTS idx_pins_conversation ON message_pins(conversation_id);\nCREATE INDEX IF NOT EXISTS idx_pins_agent ON message_pins(pinned_by);\n\n-- -------------------------------------------------------------------------\n-- File/blob attachments associated with messages.\n-- -------------------------------------------------------------------------\nCREATE TABLE IF NOT EXISTS attachments (\n slug TEXT PRIMARY KEY,\n conversation_id TEXT NOT NULL,\n from_agent_id TEXT NOT NULL,\n content BLOB NOT NULL,\n original_size INTEGER NOT NULL,\n compressed_size INTEGER NOT NULL,\n content_hash TEXT NOT NULL,\n format TEXT NOT NULL DEFAULT 'text',\n title TEXT,\n tokens INTEGER NOT NULL DEFAULT 0,\n expires_at INTEGER NOT NULL DEFAULT 0,\n storage_key TEXT,\n mode TEXT NOT NULL DEFAULT 'draft',\n version_count INTEGER NOT NULL DEFAULT 1,\n current_version INTEGER NOT NULL DEFAULT 1,\n created_at INTEGER NOT NULL\n);\nCREATE INDEX IF NOT EXISTS attachments_conversation_idx ON attachments(conversation_id);\nCREATE INDEX IF NOT EXISTS attachments_agent_idx ON attachments(from_agent_id);\n\n-- -------------------------------------------------------------------------\n-- Version history for attachments (collaborative editing).\n-- -------------------------------------------------------------------------\nCREATE TABLE IF NOT EXISTS attachment_versions (\n id TEXT PRIMARY KEY,\n slug TEXT NOT NULL REFERENCES attachments(slug) ON DELETE CASCADE,\n version_number INTEGER NOT NULL,\n author_agent_id TEXT NOT NULL,\n change_type TEXT NOT NULL DEFAULT 'patch',\n patch_text TEXT,\n storage_key TEXT NOT NULL,\n content_hash TEXT NOT NULL,\n original_size INTEGER NOT NULL,\n compressed_size INTEGER NOT NULL,\n tokens INTEGER NOT NULL,\n change_summary TEXT,\n sections_modified TEXT NOT NULL DEFAULT '[]',\n tokens_added INTEGER NOT NULL DEFAULT 0,\n tokens_removed INTEGER NOT NULL DEFAULT 0,\n created_at INTEGER NOT NULL,\n UNIQUE(slug, version_number)\n);\nCREATE INDEX IF NOT EXISTS idx_attachment_versions_slug ON attachment_versions(slug);\nCREATE INDEX IF NOT EXISTS idx_attachment_versions_author ON attachment_versions(author_agent_id);\n\n-- -------------------------------------------------------------------------\n-- Approval records for attachment content review.\n-- -------------------------------------------------------------------------\nCREATE TABLE IF NOT EXISTS attachment_approvals (\n id TEXT PRIMARY KEY,\n slug TEXT NOT NULL REFERENCES attachments(slug) ON DELETE CASCADE,\n reviewer_agent_id TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n comment TEXT,\n version_reviewed INTEGER NOT NULL,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n UNIQUE(slug, reviewer_agent_id)\n);\nCREATE INDEX IF NOT EXISTS idx_attachment_approvals_slug ON attachment_approvals(slug);\n\n-- -------------------------------------------------------------------------\n-- Contributor statistics per attachment (who edited, how much).\n-- -------------------------------------------------------------------------\nCREATE TABLE IF NOT EXISTS attachment_contributors (\n slug TEXT NOT NULL REFERENCES attachments(slug) ON DELETE CASCADE,\n agent_id TEXT NOT NULL,\n version_count INTEGER NOT NULL DEFAULT 0,\n total_tokens_added INTEGER NOT NULL DEFAULT 0,\n total_tokens_removed INTEGER NOT NULL DEFAULT 0,\n first_contribution_at INTEGER NOT NULL,\n last_contribution_at INTEGER NOT NULL,\n PRIMARY KEY (slug, agent_id)\n);\n\n-- -------------------------------------------------------------------------\n-- NEW: Per-project agent reference overrides (ADR-037 \u00A73, Q6=A).\n-- agent_id is a SOFT FK to global signaldock.db:agents.agent_id.\n-- Cross-DB FK enforcement is not possible in SQLite; the accessor layer\n-- (T355) validates on every cross-DB join.\n-- -------------------------------------------------------------------------\nCREATE TABLE IF NOT EXISTS project_agent_refs (\n agent_id TEXT PRIMARY KEY,\n attached_at TEXT NOT NULL,\n role TEXT,\n capabilities_override TEXT,\n last_used_at TEXT,\n enabled INTEGER NOT NULL DEFAULT 1\n);\n-- Partial index: covers the dominant query path (list enabled agents).\nCREATE INDEX IF NOT EXISTS idx_project_agent_refs_enabled\n ON project_agent_refs(enabled) WHERE enabled = 1;\n\n-- -------------------------------------------------------------------------\n-- Schema tracking tables (mirrors _signaldock_meta / _signaldock_migrations).\n-- -------------------------------------------------------------------------\nCREATE TABLE IF NOT EXISTS _conduit_meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL,\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\n);\nCREATE TABLE IF NOT EXISTS _conduit_migrations (\n name TEXT PRIMARY KEY,\n applied_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\n);\n`;\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Returns the project-tier conduit.db path.\n *\n * Always resolves to `<projectRoot>/.cleo/conduit.db`. The caller is\n * responsible for supplying the absolute project root (e.g. via\n * `getProjectRoot()` from `../paths.js`).\n *\n * @task T344\n * @epic T310\n * @param projectRoot - Absolute path to the project root directory.\n * @returns Absolute path to `<projectRoot>/.cleo/conduit.db`.\n */\nexport function getConduitDbPath(projectRoot: string): string {\n return join(projectRoot, '.cleo', CONDUIT_DB_FILENAME);\n}\n\n/**\n * Applies the conduit.db schema idempotently using CREATE TABLE IF NOT EXISTS.\n *\n * Exposed for the migration executor (T358) which needs to apply the schema\n * to a newly created conduit.db during the signaldock.db \u2192 conduit.db\n * migration. Also called internally by `ensureConduitDb` on every open.\n *\n * @task T344\n * @epic T310\n * @param db - An open node:sqlite DatabaseSync instance.\n */\nexport function applyConduitSchema(db: DatabaseSync): void {\n db.exec(CONDUIT_SCHEMA_SQL);\n}\n\n/**\n * Opens or creates conduit.db for the given project root.\n *\n * On first call for a given projectRoot:\n * 1. Creates `<projectRoot>/.cleo/` directory if missing.\n * 2. Opens (or creates) the SQLite file.\n * 3. Sets WAL mode and enables foreign keys.\n * 4. Applies all DDL via `applyConduitSchema` (idempotent).\n * 5. Records `schema_version` in `_conduit_meta`.\n * 6. Records the initial migration in `_conduit_migrations`.\n * 7. Stores the open handle in the module singleton.\n *\n * On subsequent calls the existing singleton is returned immediately if the\n * resolved path matches; otherwise the previous handle is closed and a new\n * one is opened (test-isolation safety).\n *\n * Caller MUST call `closeConduitDb()` when done to release the handle.\n *\n * @task T344\n * @epic T310\n * @param projectRoot - Absolute path to the project root directory.\n * @returns Object with `action` (`'created'` | `'exists'`) and `path`.\n */\nexport function ensureConduitDb(projectRoot: string): {\n action: 'created' | 'exists';\n path: string;\n} {\n const dbPath = getConduitDbPath(projectRoot);\n\n // If singleton already open at the same path, skip re-initialization.\n if (_conduitNativeDb && _conduitDbPath === dbPath) {\n return { action: 'exists', path: dbPath };\n }\n\n // Close any stale singleton pointing at a different path (e.g. between tests).\n if (_conduitNativeDb) {\n closeConduitDb();\n }\n\n const alreadyExists = existsSync(dbPath);\n\n // Ensure parent .cleo/ directory exists.\n mkdirSync(dirname(dbPath), { recursive: true });\n\n const db = new DatabaseSync(dbPath);\n\n db.exec('PRAGMA journal_mode = WAL');\n db.exec('PRAGMA busy_timeout = 5000');\n db.exec('PRAGMA synchronous = NORMAL');\n db.exec('PRAGMA foreign_keys = ON');\n db.exec('PRAGMA cache_size = -64000'); // 64 MB\n\n // Check whether the schema sentinel table already exists before applying DDL.\n const hasSchema = (() => {\n try {\n const result = db\n .prepare(\"SELECT name FROM sqlite_master WHERE type='table' AND name='conversations'\")\n .get() as { name: string } | undefined;\n return !!result;\n } catch {\n return false;\n }\n })();\n\n // Apply schema (idempotent \u2014 all statements use IF NOT EXISTS).\n applyConduitSchema(db);\n\n // Record schema version and initial migration.\n db.exec(\n `INSERT OR REPLACE INTO _conduit_meta (key, value, updated_at)\n VALUES ('schema_version', '${CONDUIT_SCHEMA_VERSION}', strftime('%s', 'now'))`,\n );\n db.prepare(\n `INSERT OR IGNORE INTO _conduit_migrations (name, applied_at)\n VALUES (?, strftime('%s', 'now'))`,\n ).run('2026-04-12-000000_initial_conduit');\n\n _conduitNativeDb = db;\n _conduitDbPath = dbPath;\n\n return {\n action: alreadyExists && hasSchema ? 'exists' : 'created',\n path: dbPath,\n };\n}\n\n/**\n * Returns the live node:sqlite DatabaseSync handle for conduit.db.\n *\n * Returns `null` if `ensureConduitDb` has not been called yet for this\n * process, or if `closeConduitDb` has been called since the last open.\n *\n * @task T344\n * @epic T310\n * @returns The open DatabaseSync instance, or `null` if not initialized.\n */\nexport function getConduitNativeDb(): DatabaseSync | null {\n return _conduitNativeDb;\n}\n\n/**\n * Closes the conduit.db connection and resets the module singleton.\n *\n * Safe to call multiple times. No-op if the database is already closed.\n *\n * @task T344\n * @epic T310\n */\nexport function closeConduitDb(): void {\n if (_conduitNativeDb) {\n try {\n if (_conduitNativeDb.isOpen) {\n _conduitNativeDb.close();\n }\n } catch {\n // Ignore close errors \u2014 the handle is being discarded regardless.\n }\n _conduitNativeDb = null;\n }\n _conduitDbPath = null;\n}\n\n// ---------------------------------------------------------------------------\n// project_agent_refs CRUD accessors (T353)\n// ---------------------------------------------------------------------------\n\n/**\n * Attaches an agent to the current project. If a row exists with enabled=0,\n * re-enables it (update attached_at timestamp). If a row exists with enabled=1,\n * no-op. Inserts a new row otherwise.\n *\n * @param db - conduit.db handle (from ensureConduitDb).\n * @param agentId - Global signaldock.db:agents.id (soft FK, not validated here).\n * @param opts - Optional role and capabilities override.\n * @task T353\n * @epic T310\n */\nexport function attachAgentToProject(\n db: DatabaseSync,\n agentId: string,\n opts?: { role?: string | null; capabilitiesOverride?: string | null },\n): void {\n const now = new Date().toISOString();\n db.prepare(\n `INSERT INTO project_agent_refs (agent_id, attached_at, role, capabilities_override, last_used_at, enabled)\n VALUES (?, ?, ?, ?, NULL, 1)\n ON CONFLICT(agent_id) DO UPDATE SET\n enabled = 1,\n attached_at = CASE WHEN project_agent_refs.enabled = 0 THEN excluded.attached_at ELSE project_agent_refs.attached_at END,\n role = excluded.role,\n capabilities_override = excluded.capabilities_override`,\n ).run(agentId, now, opts?.role ?? null, opts?.capabilitiesOverride ?? null);\n}\n\n/**\n * Detaches an agent from the current project by setting enabled=0.\n * Does NOT delete the row (preserves attachment history for audit).\n *\n * @param db - conduit.db handle (from ensureConduitDb).\n * @param agentId - Agent ID to detach.\n * @task T353\n * @epic T310\n */\nexport function detachAgentFromProject(db: DatabaseSync, agentId: string): void {\n db.prepare(`UPDATE project_agent_refs SET enabled = 0 WHERE agent_id = ?`).run(agentId);\n}\n\n/**\n * Lists project_agent_refs rows. By default returns only enabled=1 rows.\n * Pass enabledOnly=false to return all rows regardless of enabled state.\n *\n * @param db - conduit.db handle (from ensureConduitDb).\n * @param opts - Filter options. Defaults to `{ enabledOnly: true }`.\n * @returns Array of ProjectAgentRef rows ordered by attached_at DESC.\n * @task T353\n * @epic T310\n */\nexport function listProjectAgentRefs(\n db: DatabaseSync,\n opts?: { enabledOnly?: boolean },\n): ProjectAgentRef[] {\n const enabledOnly = opts?.enabledOnly ?? true;\n const sql = enabledOnly\n ? `SELECT agent_id, attached_at, role, capabilities_override, last_used_at, enabled\n FROM project_agent_refs WHERE enabled = 1\n ORDER BY attached_at DESC`\n : `SELECT agent_id, attached_at, role, capabilities_override, last_used_at, enabled\n FROM project_agent_refs\n ORDER BY attached_at DESC`;\n const rows = db.prepare(sql).all() as Array<{\n agent_id: string;\n attached_at: string;\n role: string | null;\n capabilities_override: string | null;\n last_used_at: string | null;\n enabled: number;\n }>;\n return rows.map((r) => ({\n agentId: r.agent_id,\n attachedAt: r.attached_at,\n role: r.role,\n capabilitiesOverride: r.capabilities_override,\n lastUsedAt: r.last_used_at,\n enabled: r.enabled,\n }));\n}\n\n/**\n * Returns a single project_agent_refs row by agentId, or null if not found.\n *\n * @param db - conduit.db handle (from ensureConduitDb).\n * @param agentId - Agent ID to look up.\n * @returns The ProjectAgentRef row, or null if the agent is not attached.\n * @task T353\n * @epic T310\n */\nexport function getProjectAgentRef(db: DatabaseSync, agentId: string): ProjectAgentRef | null {\n const row = db\n .prepare(\n `SELECT agent_id, attached_at, role, capabilities_override, last_used_at, enabled\n FROM project_agent_refs WHERE agent_id = ?`,\n )\n .get(agentId) as\n | {\n agent_id: string;\n attached_at: string;\n role: string | null;\n capabilities_override: string | null;\n last_used_at: string | null;\n enabled: number;\n }\n | undefined;\n if (!row) return null;\n return {\n agentId: row.agent_id,\n attachedAt: row.attached_at,\n role: row.role,\n capabilitiesOverride: row.capabilities_override,\n lastUsedAt: row.last_used_at,\n enabled: row.enabled,\n };\n}\n\n/**\n * Updates the last_used_at timestamp for an agent to now.\n * No-op if the agent_id does not exist in project_agent_refs.\n *\n * @param db - conduit.db handle (from ensureConduitDb).\n * @param agentId - Agent ID to update.\n * @task T353\n * @epic T310\n */\nexport function updateProjectAgentLastUsed(db: DatabaseSync, agentId: string): void {\n db.prepare(`UPDATE project_agent_refs SET last_used_at = ? WHERE agent_id = ?`).run(\n new Date().toISOString(),\n agentId,\n );\n}\n\n/**\n * Checks conduit.db health \u2014 table count, WAL mode, schema version, and\n * foreign keys status.\n *\n * Used by `cleo doctor` to verify conduit.db integrity. Does NOT require\n * `ensureConduitDb` to have been called; opens and closes the DB internally.\n *\n * @task T344\n * @epic T310\n * @param projectRoot - Absolute path to the project root directory.\n * @returns Health report object. `exists: false` when conduit.db is absent.\n */\nexport function checkConduitDbHealth(projectRoot: string): {\n exists: boolean;\n path: string;\n tableCount: number;\n walMode: boolean;\n schemaVersion: string | null;\n foreignKeysEnabled: boolean;\n} {\n const dbPath = getConduitDbPath(projectRoot);\n\n if (!existsSync(dbPath)) {\n return {\n exists: false,\n path: dbPath,\n tableCount: 0,\n walMode: false,\n schemaVersion: null,\n foreignKeysEnabled: false,\n };\n }\n\n const db = new DatabaseSync(dbPath);\n try {\n const tables = db\n .prepare(\n \"SELECT COUNT(*) as count FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'\",\n )\n .get() as { count: number };\n\n const journalMode = db.prepare('PRAGMA journal_mode').get() as { journal_mode: string };\n const fkEnabled = db.prepare('PRAGMA foreign_keys').get() as { foreign_keys: number };\n\n let schemaVersion: string | null = null;\n try {\n const meta = db\n .prepare(\"SELECT value FROM _conduit_meta WHERE key = 'schema_version'\")\n .get() as { value: string } | undefined;\n schemaVersion = meta?.value ?? null;\n } catch {\n // _conduit_meta may not exist on a partially-initialized DB.\n }\n\n return {\n exists: true,\n path: dbPath,\n tableCount: tables.count,\n walMode: journalMode.journal_mode === 'wal',\n schemaVersion,\n foreignKeysEnabled: fkEnabled.foreign_keys === 1,\n };\n } finally {\n db.close();\n }\n}\n", "/**\n * Global-salt subsystem for the CLEO API key KDF.\n *\n * @task T348\n * @epic T310\n * @why ADR-037 \u00A75 \u2014 API key KDF uses machine-key + global-salt + agentId.\n * global-salt must persist across process restarts but is machine-local.\n * @what Atomic first-run generation, memoized read, permission/size validation.\n */\n\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { getCleoHome } from '../paths.js';\n\n/** Filename for the global salt file under CLEO home. */\nexport const GLOBAL_SALT_FILENAME = 'global-salt';\n\n/** Required size of the global salt in bytes. */\nexport const GLOBAL_SALT_SIZE = 32;\n\n/** Required file permission mode for the global salt file (POSIX). */\nconst SALT_FILE_MODE = 0o600;\n\n/**\n * In-process memoization. Invalidated only by process restart.\n * Cleared in tests via `__clearGlobalSaltCache()` (test-only export).\n */\nlet cached: Buffer | null = null;\n\n/**\n * Returns the absolute path to the global-salt file.\n *\n * @returns Absolute path: `{cleoHome}/global-salt`\n *\n * @task T348\n * @epic T310\n *\n * @example\n * ```typescript\n * const saltPath = getGlobalSaltPath();\n * // Linux: \"/home/user/.local/share/cleo/global-salt\"\n * ```\n */\nexport function getGlobalSaltPath(): string {\n return path.join(getCleoHome(), GLOBAL_SALT_FILENAME);\n}\n\n/**\n * Returns the 32-byte global salt. Generates and persists atomically on first\n * call when the file does not exist. Subsequent calls return the memoized value.\n *\n * Never overwrites an existing salt \u2014 doing so would invalidate every stored\n * API key derived from it.\n *\n * @returns A 32-byte Buffer containing the global salt\n * @throws {Error} If the salt file exists with wrong size or wrong permissions\n *\n * @task T348\n * @epic T310\n *\n * @example\n * ```typescript\n * const salt = getGlobalSalt(); // Buffer(32) [...]\n * ```\n */\nexport function getGlobalSalt(): Buffer {\n if (cached !== null) return cached;\n\n const saltPath = getGlobalSaltPath();\n const cleoHome = getCleoHome();\n\n if (!fs.existsSync(saltPath)) {\n // First-run generation: ensure the directory exists\n if (!fs.existsSync(cleoHome)) {\n fs.mkdirSync(cleoHome, { recursive: true });\n }\n\n const salt = crypto.randomBytes(GLOBAL_SALT_SIZE);\n\n // Atomic write: write to tmp file, chmod, then rename into place\n const tmpPath = `${saltPath}.tmp-${process.pid}-${Date.now()}`;\n fs.writeFileSync(tmpPath, salt, { mode: SALT_FILE_MODE });\n // Explicit chmod in case writeFileSync's mode arg is ignored on some FS\n fs.chmodSync(tmpPath, SALT_FILE_MODE);\n fs.renameSync(tmpPath, saltPath);\n\n cached = salt;\n return cached;\n }\n\n // Existing file \u2014 validate before trusting\n const stat = fs.statSync(saltPath);\n\n if (stat.size !== GLOBAL_SALT_SIZE) {\n throw new Error(\n `global-salt at ${saltPath} has wrong size: expected ${GLOBAL_SALT_SIZE} bytes, got ${stat.size}. ` +\n `Refusing to use a corrupted salt file. Delete the file manually if you intend to regenerate it ` +\n `(this will invalidate all stored API keys).`,\n );\n }\n\n // Permission check: only meaningful on POSIX; Windows does not support mode bits\n if (process.platform !== 'win32') {\n const mode = stat.mode & 0o777;\n if (mode !== SALT_FILE_MODE) {\n throw new Error(\n `global-salt at ${saltPath} has wrong permissions: expected 0o600, got 0o${mode.toString(8)}. ` +\n `Fix with: chmod 600 ${saltPath}`,\n );\n }\n }\n\n const salt = fs.readFileSync(saltPath);\n cached = salt;\n return cached;\n}\n\n/**\n * Runtime validation helper for startup integrity checks.\n *\n * Throws if the salt file exists but is malformed (wrong size or permissions).\n * Safe to call when the file does not yet exist \u2014 returns silently in that case\n * because first-run generation is handled lazily by `getGlobalSalt()`.\n *\n * @throws {Error} If the salt file exists with wrong size or wrong permissions\n *\n * @task T348\n * @epic T310\n *\n * @example\n * ```typescript\n * // Called at process startup to catch accidental salt corruption early\n * validateGlobalSalt();\n * ```\n */\nexport function validateGlobalSalt(): void {\n const saltPath = getGlobalSaltPath();\n\n if (!fs.existsSync(saltPath)) {\n // Not yet generated \u2014 first-run case; no error\n return;\n }\n\n const stat = fs.statSync(saltPath);\n\n if (stat.size !== GLOBAL_SALT_SIZE) {\n throw new Error(\n `global-salt validation failed: size ${stat.size}, expected ${GLOBAL_SALT_SIZE}`,\n );\n }\n\n if (process.platform !== 'win32') {\n const mode = stat.mode & 0o777;\n if (mode !== SALT_FILE_MODE) {\n throw new Error(\n `global-salt validation failed: permissions 0o${mode.toString(8)}, expected 0o600`,\n );\n }\n }\n}\n\n/**\n * Clears the in-process memoization cache so tests can exercise the\n * first-call generation path independently.\n *\n * @internal TEST ONLY \u2014 do NOT export through internal.ts or re-export\n * from any public barrel. This symbol must never appear in production call paths.\n *\n * @task T348\n * @epic T310\n */\nexport function __clearGlobalSaltCache(): void {\n cached = null;\n}\n", "/**\n * Drizzle ORM schema for CLEO nexus.db (SQLite via node:sqlite + sqlite-proxy).\n *\n * Tables: project_registry, nexus_audit_log, nexus_schema_meta,\n * nexus_nodes, nexus_relations\n * Stores cross-project registry and audit infrastructure for the Nexus domain,\n * plus the code intelligence graph layer (nodes + directed edges).\n *\n * @task T5365\n * @task T529\n */\n\nimport { sql } from 'drizzle-orm';\nimport { index, integer, real, sqliteTable, text } from 'drizzle-orm/sqlite-core';\n\n// === PROJECT_REGISTRY TABLE ===\n\n/** Central registry of all CLEO projects known to the Nexus. */\nexport const projectRegistry = sqliteTable(\n 'project_registry',\n {\n projectId: text('project_id').primaryKey(),\n projectHash: text('project_hash').notNull().unique(),\n projectPath: text('project_path').notNull().unique(),\n name: text('name').notNull(),\n registeredAt: text('registered_at').notNull().default(sql`(datetime('now'))`),\n lastSeen: text('last_seen').notNull().default(sql`(datetime('now'))`),\n healthStatus: text('health_status').notNull().default('unknown'),\n healthLastCheck: text('health_last_check'),\n permissions: text('permissions').notNull().default('read'),\n lastSync: text('last_sync').notNull().default(sql`(datetime('now'))`),\n taskCount: integer('task_count').notNull().default(0),\n labelsJson: text('labels_json').notNull().default('[]'),\n /** Absolute path to the project's brain.db file. */\n brainDbPath: text('brain_db_path'),\n /** Absolute path to the project's tasks.db file. */\n tasksDbPath: text('tasks_db_path'),\n /** ISO 8601 timestamp of the last successful code intelligence index run. */\n lastIndexed: text('last_indexed'),\n /** JSON object with per-project code intelligence stats (node_count, relation_count, file_count). */\n statsJson: text('stats_json').notNull().default('{}'),\n },\n (table) => [\n index('idx_project_registry_hash').on(table.projectHash),\n index('idx_project_registry_health').on(table.healthStatus),\n index('idx_project_registry_name').on(table.name),\n index('idx_project_registry_last_indexed').on(table.lastIndexed),\n ],\n);\n\n// === NEXUS_AUDIT_LOG TABLE ===\n\n/** Append-only audit log for all Nexus operations across projects. */\nexport const nexusAuditLog = sqliteTable(\n 'nexus_audit_log',\n {\n id: text('id').primaryKey(),\n timestamp: text('timestamp').notNull().default(sql`(datetime('now'))`),\n action: text('action').notNull(),\n projectHash: text('project_hash'),\n projectId: text('project_id'),\n domain: text('domain'),\n operation: text('operation'),\n sessionId: text('session_id'),\n requestId: text('request_id'),\n source: text('source'),\n gateway: text('gateway'),\n success: integer('success'),\n durationMs: integer('duration_ms'),\n detailsJson: text('details_json').default('{}'),\n errorMessage: text('error_message'),\n },\n (table) => [\n index('idx_nexus_audit_timestamp').on(table.timestamp),\n index('idx_nexus_audit_action').on(table.action),\n index('idx_nexus_audit_project_hash').on(table.projectHash),\n index('idx_nexus_audit_project_id').on(table.projectId),\n index('idx_nexus_audit_session').on(table.sessionId),\n ],\n);\n\n// === SCHEMA METADATA ===\n\n/** Key-value store for nexus.db schema versioning and metadata. */\nexport const nexusSchemaMeta = sqliteTable('nexus_schema_meta', {\n key: text('key').primaryKey(),\n value: text('value').notNull(),\n});\n\n// === NEXUS_NODES TABLE ===\n\n/**\n * All node kind values \u2014 matches GraphNodeKind in @cleocode/contracts.\n *\n * Kept as a const tuple for use in Drizzle enum column definitions.\n * The ordering is intentional: structural \u2192 module \u2192 callable \u2192 type \u2192\n * value-level \u2192 language-specific \u2192 graph-level \u2192 legacy.\n */\nexport const NEXUS_NODE_KINDS = [\n // Structural\n 'file',\n 'folder',\n // Module-level\n 'module',\n 'namespace',\n // Callable\n 'function',\n 'method',\n 'constructor',\n // Type hierarchy\n 'class',\n 'interface',\n 'struct',\n 'trait',\n 'impl',\n 'type_alias',\n 'enum',\n // Value-level\n 'property',\n 'constant',\n 'variable',\n 'static',\n 'record',\n 'delegate',\n // Language-specific constructs\n 'macro',\n 'union',\n 'typedef',\n 'annotation',\n 'template',\n // Graph-level (synthetic nodes from analysis phases)\n 'community',\n 'process',\n 'route',\n // External references\n 'tool',\n 'section',\n // Legacy (kept for T506 compatibility)\n 'import',\n 'export',\n 'type',\n] as const;\n\n/** TypeScript type derived from NEXUS_NODE_KINDS. */\nexport type NexusNodeKind = (typeof NEXUS_NODE_KINDS)[number];\n\n/**\n * Graph nodes table \u2014 one row per symbol or structural element.\n *\n * Stores all code intelligence graph nodes indexed per project.\n * Synthetic nodes (community, process) share this table with\n * source-derived nodes (function, class, file).\n *\n * Both this table and `code_index` are populated from the same parse pass.\n * They serve complementary roles \u2014 do NOT merge them.\n *\n * @task T529\n */\nexport const nexusNodes = sqliteTable(\n 'nexus_nodes',\n {\n /** Stable node ID. Format: `<filePath>::<name>` for symbols,\n * `<filePath>` for file nodes, `community:<n>` for community nodes,\n * `process:<slug>` for execution flow nodes. */\n id: text('id').primaryKey(),\n\n /** Foreign key to project_registry.project_id. Scopes the node. */\n projectId: text('project_id').notNull(),\n\n /** Node kind from GraphNodeKind union. */\n kind: text('kind', { enum: NEXUS_NODE_KINDS }).notNull(),\n\n /** Human-readable label for display. For symbols, same as name.\n * For communities, the inferred folder label. For processes, the\n * entry point function name. */\n label: text('label').notNull(),\n\n /** Symbol name as it appears in source code. Null for file/folder nodes. */\n name: text('name'),\n\n /** File path relative to project root. Null for community/process nodes. */\n filePath: text('file_path'),\n\n /** Start line in source file (1-based). Null for structural nodes. */\n startLine: integer('start_line'),\n\n /** End line in source file (1-based). Null for structural nodes. */\n endLine: integer('end_line'),\n\n /** Source language (typescript, python, go, rust, etc.). */\n language: text('language'),\n\n /** Whether the symbol is publicly exported from its module. */\n isExported: integer('is_exported', { mode: 'boolean' }).notNull().default(false),\n\n /** Parent node ID for nested symbols (e.g., method inside class).\n * References nexus_nodes.id in the same project. Soft FK. */\n parentId: text('parent_id'),\n\n /** JSON array of parameter name strings for functions/methods.\n * Stored as `[\"param1\",\"param2\"]`. Null if not applicable. */\n parametersJson: text('parameters_json'),\n\n /** Return type annotation text (e.g., \"Promise<void>\"). */\n returnType: text('return_type'),\n\n /** First line of the TSDoc/JSDoc comment for this symbol. */\n docSummary: text('doc_summary'),\n\n /** Community membership ID \u2014 references the community node's id.\n * Set during Phase 4.5 community detection. Null until then. */\n communityId: text('community_id'),\n\n /** JSON blob for kind-specific metadata.\n * For `process` nodes: `{\"stepCount\": 7, \"entryScore\": 0.92}`.\n * For `community` nodes: `{\"memberCount\": 14, \"topFolders\": [\"src/core\"]}`.\n * For `route` nodes: `{\"method\": \"GET\", \"path\": \"/api/v1/tasks\"}`.\n * For all others: null. */\n metaJson: text('meta_json'),\n\n /** ISO 8601 timestamp when this node was last indexed. */\n indexedAt: text('indexed_at').notNull().default(sql`(datetime('now'))`),\n },\n (table) => [\n index('idx_nexus_nodes_project').on(table.projectId),\n index('idx_nexus_nodes_kind').on(table.kind),\n index('idx_nexus_nodes_file').on(table.filePath),\n index('idx_nexus_nodes_name').on(table.name),\n index('idx_nexus_nodes_project_kind').on(table.projectId, table.kind),\n index('idx_nexus_nodes_project_file').on(table.projectId, table.filePath),\n index('idx_nexus_nodes_community').on(table.communityId),\n index('idx_nexus_nodes_parent').on(table.parentId),\n index('idx_nexus_nodes_exported').on(table.isExported),\n ],\n);\n\n// === NEXUS_RELATIONS TABLE ===\n\n/**\n * All relation type values \u2014 matches GraphRelationType in @cleocode/contracts.\n *\n * Kept as a const tuple for use in Drizzle enum column definitions.\n */\nexport const NEXUS_RELATION_TYPES = [\n // Structural\n 'contains',\n // Definition / usage\n 'defines',\n 'imports',\n 'accesses',\n // Callable\n 'calls',\n // Type hierarchy\n 'extends',\n 'implements',\n 'method_overrides',\n 'method_implements',\n // Class structure\n 'has_method',\n 'has_property',\n // Graph-level (synthetic, from analysis phases)\n 'member_of', // symbol \u2192 community\n 'step_in_process', // symbol \u2192 process\n // Web / API\n 'handles_route', // function \u2192 route node\n 'fetches', // function \u2192 external API\n // Tool / agent\n 'handles_tool',\n 'entry_point_of', // function \u2192 process\n // Wrapping / delegation\n 'wraps',\n // Data access\n 'queries',\n // Cross-graph (brain link)\n 'documents', // brain_page_node \u2192 nexus_nodes\n 'applies_to', // brain_page_node \u2192 nexus_nodes\n // Plasticity co-access relations (T998)\n 'co_changed', // nodes frequently changed together in the same commit\n 'co_cited_in_task', // nodes co-cited in the same task description\n] as const;\n\n/** TypeScript type derived from NEXUS_RELATION_TYPES. */\nexport type NexusRelationType = (typeof NEXUS_RELATION_TYPES)[number];\n\n/**\n * Graph relations table \u2014 one row per directed edge.\n *\n * All graph traversal (impact, context, process detection) reads from\n * this table after ingestion completes.\n *\n * Source and target reference nexus_nodes.id. They are soft FKs \u2014\n * unresolved targets (e.g., external packages) are stored as raw specifiers.\n *\n * @task T529\n */\nexport const nexusRelations = sqliteTable(\n 'nexus_relations',\n {\n /** UUID v4 row identifier. */\n id: text('id').primaryKey(),\n\n /** Foreign key to project_registry.project_id. */\n projectId: text('project_id').notNull(),\n\n /** Source node ID (nexus_nodes.id). */\n sourceId: text('source_id').notNull(),\n\n /** Target node ID (nexus_nodes.id) or raw module specifier for\n * unresolved imports. Example: `@cleocode/contracts` or\n * `src/core/parser.ts::parseFile`. */\n targetId: text('target_id').notNull(),\n\n /** Semantic relation type. */\n type: text('type', { enum: NEXUS_RELATION_TYPES }).notNull(),\n\n /** Extractor confidence (0.0 to 1.0). */\n confidence: real('confidence').notNull(),\n\n /** Human-readable note explaining why this relation was emitted. */\n reason: text('reason'),\n\n /** Step index within an execution flow (for step_in_process relations). */\n step: integer('step'),\n\n /** ISO 8601 timestamp when this relation was last indexed. */\n indexedAt: text('indexed_at').notNull().default(sql`(datetime('now'))`),\n\n // T998: Plasticity columns for Hebbian co-access strengthening.\n // Edges strengthen over time as nodes are accessed together during retrieval.\n /** Plasticity weight in [0.0, 1.0]. Starts at 0.0; increments 0.05 per co-access; capped at 1.0. */\n weight: real('weight').default(0.0),\n /** ISO 8601 timestamp of the last co-access strengthening event. NULL until first strengthen. */\n lastAccessedAt: text('last_accessed_at'),\n /** Number of times this edge has been co-access strengthened. */\n coAccessedCount: integer('co_accessed_count').default(0),\n },\n (table) => [\n index('idx_nexus_relations_project').on(table.projectId),\n index('idx_nexus_relations_source').on(table.sourceId),\n index('idx_nexus_relations_target').on(table.targetId),\n index('idx_nexus_relations_type').on(table.type),\n index('idx_nexus_relations_project_type').on(table.projectId, table.type),\n index('idx_nexus_relations_source_type').on(table.sourceId, table.type),\n index('idx_nexus_relations_target_type').on(table.targetId, table.type),\n index('idx_nexus_relations_confidence').on(table.confidence),\n // T998: index for plasticity decay queries and temporal access tracking\n index('idx_nexus_relations_last_accessed').on(table.lastAccessedAt),\n ],\n);\n\n// === TYPE EXPORTS ===\n\nexport type ProjectRegistryRow = typeof projectRegistry.$inferSelect;\nexport type NewProjectRegistryRow = typeof projectRegistry.$inferInsert;\nexport type NexusAuditLogRow = typeof nexusAuditLog.$inferSelect;\nexport type NewNexusAuditLogRow = typeof nexusAuditLog.$inferInsert;\nexport type NexusSchemaMetaRow = typeof nexusSchemaMeta.$inferSelect;\nexport type NewNexusSchemaMetaRow = typeof nexusSchemaMeta.$inferInsert;\nexport type NexusNodeRow = typeof nexusNodes.$inferSelect;\nexport type NewNexusNodeRow = typeof nexusNodes.$inferInsert;\nexport type NexusRelationRow = typeof nexusRelations.$inferSelect;\nexport type NewNexusRelationRow = typeof nexusRelations.$inferInsert;\n", "/**\n * SQLite store for nexus.db via drizzle-orm/node-sqlite + node:sqlite (DatabaseSync).\n *\n * Separate database from tasks.db and brain.db for cross-project registry\n * and audit infrastructure. Follows the same singleton + WAL + migration\n * pattern as memory-sqlite.ts.\n *\n * nexus.db lives in ~/.cleo/ (global home) rather than per-project .cleo/,\n * since it stores cross-project data.\n *\n * @task T5365\n */\n\nimport { copyFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport type { DatabaseSync } from 'node:sqlite';\nimport { fileURLToPath } from 'node:url';\nimport { readMigrationFiles } from 'drizzle-orm/migrator';\nimport type { NodeSQLiteDatabase } from 'drizzle-orm/node-sqlite';\nimport { drizzle } from 'drizzle-orm/node-sqlite';\nimport { migrate } from 'drizzle-orm/node-sqlite/migrator';\nimport { getCleoHome } from '../paths.js';\nimport { ensureColumns } from './migration-manager.js';\nimport * as nexusSchema from './nexus-schema.js';\nimport { isSqliteBusy, openNativeDatabase } from './sqlite.js';\n\n/** Database file name within ~/.cleo/ directory. */\nconst DB_FILENAME = 'nexus.db';\n\n/** Schema version for newly created nexus databases. Single source of truth. */\nexport const NEXUS_SCHEMA_VERSION = '1.0.0';\n\n/** Singleton state for lazy initialization. */\nlet _nexusDb: NodeSQLiteDatabase<typeof nexusSchema> | null = null;\nlet _nexusNativeDb: DatabaseSync | null = null;\nlet _nexusDbPath: string | null = null;\n/** Guard against concurrent initialization (async migration). */\nlet _nexusInitPromise: Promise<NodeSQLiteDatabase<typeof nexusSchema>> | null = null;\n\n/**\n * Returns the global-tier nexus.db path. ALWAYS under `getCleoHome()`.\n *\n * nexus.db is a cross-project registry and must live in the global CLEO\n * home directory (`~/.local/share/cleo/` on Linux via XDG). It is NEVER\n * written to a per-project `.cleo/` directory.\n *\n * @task T307\n * @epic T299\n * @why ADR-036 \u00A7Decision/Global-Tier: nexus.db is global-only. This guard\n * throws immediately if path resolution ever drifts outside getCleoHome(),\n * preventing silent creation of project-tier stray nexus.db files.\n * @throws {Error} If the resolved path is not under `getCleoHome()` \u2014 this\n * indicates a code path that bypasses canonical path resolution and is a\n * bug that must be fixed rather than silently tolerated.\n */\nexport function getNexusDbPath(): string {\n const cleoHome = getCleoHome();\n const nexusPath = join(cleoHome, DB_FILENAME);\n\n // Guard: the resolved path MUST be under the global tier.\n // Under normal operation this invariant is always satisfied because we\n // build nexusPath from cleoHome above. The assertion catches hypothetical\n // future regressions where getCleoHome() is monkey-patched or join()\n // produces an unexpected result on exotic platforms.\n if (!nexusPath.startsWith(cleoHome)) {\n throw new Error(\n `BUG: getNexusDbPath() resolved to \"${nexusPath}\" which is NOT under ` +\n `getCleoHome() (\"${cleoHome}\"). nexus.db is global-only per ADR-036. ` +\n `This indicates a code path that bypasses canonical path resolution \u2014 ` +\n `fix the caller, do not suppress this error.`,\n );\n }\n\n return nexusPath;\n}\n\n/**\n * Resolve the path to the drizzle-nexus migrations folder.\n * Works from both src/ (dev via tsx) and dist/ (compiled via esbuild bundle).\n *\n * - Source layout: __dirname = src/store/ \u2192 need ../../migrations/drizzle-nexus\n * - Bundled layout: __dirname = dist/ \u2192 need ../migrations/drizzle-nexus\n */\nexport function resolveNexusMigrationsFolder(): string {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const isBundled = __dirname.endsWith('/dist') || __dirname.endsWith('\\\\dist');\n const pkgRoot = isBundled ? join(__dirname, '..') : join(__dirname, '..', '..');\n return join(pkgRoot, 'migrations', 'drizzle-nexus');\n}\n\n/**\n * Check whether a table exists in the SQLite database.\n */\nfunction tableExists(nativeDb: DatabaseSync, tableName: string): boolean {\n const result = nativeDb\n .prepare(\"SELECT name FROM sqlite_master WHERE type='table' AND name=?\")\n .get(tableName) as Record<string, unknown> | undefined;\n return !!result;\n}\n\n/**\n * Run drizzle migrations to create/update nexus.db tables.\n *\n * Uses IMMEDIATE transactions to prevent concurrent migration races.\n * Follows the same pattern as memory-sqlite.ts runBrainMigrations().\n *\n * @task T5365\n */\nfunction runNexusMigrations(\n nativeDb: DatabaseSync,\n db: NodeSQLiteDatabase<typeof nexusSchema>,\n): void {\n const migrationsFolder = resolveNexusMigrationsFolder();\n\n // If existing DB with pending migrations, create safety backup (cleo compat)\n if (tableExists(nativeDb, 'project_registry') && _nexusDbPath) {\n const backupPath = _nexusDbPath.replace(/\\.db$/, '-pre-cleo.db.bak');\n if (!existsSync(backupPath)) {\n try {\n copyFileSync(_nexusDbPath, backupPath);\n } catch {\n /* non-fatal */\n }\n }\n }\n\n // Bootstrap existing databases that predate drizzle migrations.\n // Mark baseline migration as already applied if tables exist but\n // __drizzle_migrations doesn't.\n if (tableExists(nativeDb, 'project_registry') && !tableExists(nativeDb, '__drizzle_migrations')) {\n const migrations = readMigrationFiles({ migrationsFolder });\n const baseline = migrations[0];\n if (baseline) {\n nativeDb\n .prepare(\n `CREATE TABLE IF NOT EXISTS \"__drizzle_migrations\" (id SERIAL PRIMARY KEY, hash text NOT NULL, created_at numeric)`,\n )\n .run();\n nativeDb\n .prepare(\n `INSERT INTO \"__drizzle_migrations\" (\"hash\", \"created_at\") VALUES ('${baseline.hash}', ${baseline.folderMillis})`,\n )\n .run();\n }\n }\n\n // T998: idempotent safety net for plasticity columns \u2014 covers pre-migration\n // nexus.db instances that were created before the drizzle migration runs.\n // ensureColumns is a no-op when the columns already exist.\n ensureColumns(\n nativeDb,\n 'nexus_relations',\n [\n { name: 'weight', ddl: 'real DEFAULT 0.0' },\n { name: 'last_accessed_at', ddl: 'text' },\n { name: 'co_accessed_count', ddl: 'integer DEFAULT 0' },\n ],\n 'nexus',\n );\n\n // Run pending migrations via drizzle-orm/node-sqlite/migrator (synchronous).\n const MAX_RETRIES = 5;\n const BASE_DELAY_MS = 100;\n const MAX_DELAY_MS = 2000;\n let lastError: unknown;\n for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {\n try {\n migrate(db, { migrationsFolder });\n return;\n } catch (err) {\n if (!isSqliteBusy(err) || attempt === MAX_RETRIES) throw err;\n lastError = err;\n const delay = Math.min(\n BASE_DELAY_MS * 2 ** (attempt - 1) * (1 + Math.random() * 0.5),\n MAX_DELAY_MS,\n );\n Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, Math.round(delay));\n }\n }\n /* c8 ignore next */\n throw lastError;\n}\n\n/**\n * Initialize the nexus.db SQLite database (lazy, singleton).\n * Creates the database file and tables if they don't exist.\n * Returns the drizzle ORM instance (async via sqlite-proxy).\n *\n * Uses a promise guard so concurrent callers wait for the same\n * initialization to complete (migrations are async).\n */\nexport async function getNexusDb(): Promise<NodeSQLiteDatabase<typeof nexusSchema>> {\n const requestedPath = getNexusDbPath();\n\n // If singleton exists but points to different path, reset it\n if (_nexusDb && _nexusDbPath !== requestedPath) {\n resetNexusDbState();\n }\n\n if (_nexusDb) return _nexusDb;\n\n // If already initializing, wait for the in-flight init\n if (_nexusInitPromise) return _nexusInitPromise;\n\n _nexusInitPromise = (async () => {\n const dbPath = requestedPath;\n _nexusDbPath = dbPath;\n\n // Ensure directory exists\n mkdirSync(dirname(dbPath), { recursive: true });\n\n // Open file-backed SQLite via node:sqlite with WAL mode.\n const nativeDb = openNativeDatabase(dbPath);\n _nexusNativeDb = nativeDb;\n\n // Create drizzle ORM wrapper via node-sqlite\n const db = drizzle({ client: nativeDb, schema: nexusSchema });\n\n // Run drizzle migrations (creates/updates tables)\n runNexusMigrations(nativeDb, db);\n\n // Seed schema version for new databases (no-op if already set)\n nativeDb\n .prepare(\n `INSERT OR IGNORE INTO nexus_schema_meta (key, value) VALUES ('schemaVersion', '${NEXUS_SCHEMA_VERSION}')`,\n )\n .run();\n\n // Set singleton only after migrations complete\n _nexusDb = db;\n return db;\n })();\n\n try {\n return await _nexusInitPromise;\n } finally {\n _nexusInitPromise = null;\n }\n}\n\n/**\n * Close the nexus.db database connection and release resources.\n */\nexport function closeNexusDb(): void {\n if (_nexusNativeDb) {\n try {\n if (_nexusNativeDb.isOpen) {\n _nexusNativeDb.close();\n }\n } catch {\n // Ignore close errors\n }\n _nexusNativeDb = null;\n }\n _nexusDb = null;\n _nexusDbPath = null;\n}\n\n/**\n * Reset nexus.db singleton state without saving.\n * Used during tests or when database file is recreated.\n * Safe to call multiple times.\n */\nexport function resetNexusDbState(): void {\n if (_nexusNativeDb) {\n try {\n if (_nexusNativeDb.isOpen) {\n _nexusNativeDb.close();\n }\n } catch {\n // Ignore close errors\n }\n _nexusNativeDb = null;\n }\n _nexusDb = null;\n _nexusDbPath = null;\n _nexusInitPromise = null;\n}\n\n/**\n * Get the underlying node:sqlite DatabaseSync instance for nexus.db.\n * Useful for direct PRAGMA calls or raw SQL operations.\n * Returns null if the database hasn't been initialized.\n */\nexport function getNexusNativeDb(): DatabaseSync | null {\n return _nexusNativeDb;\n}\n\nexport type { NodeSQLiteDatabase };\n/**\n * Re-export nexus schema for external use.\n */\nexport { nexusSchema };\n", "/**\n * SQLite store for global-tier signaldock.db \u2014 canonical agent identity database.\n *\n * Post-T310 (ADR-037), signaldock.db lives at `$XDG_DATA_HOME/cleo/signaldock.db`\n * (resolved via getCleoHome()). It holds cross-project agent identity, capabilities\n * catalog, and cloud-sync tables. Project-local messaging state has moved to\n * conduit.db (managed by conduit-sqlite.ts, T344).\n *\n * GLOBAL-TIER ONLY. This module MUST NOT resolve paths under any project's .cleo/\n * directory. The path guard in getGlobalSignaldockDbPath() enforces this invariant.\n *\n * @task T346\n * @epic T310\n * @related ADR-037\n */\n\nimport { existsSync, mkdirSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { join } from 'node:path';\nimport type { DatabaseSync } from 'node:sqlite';\nimport { getCleoHome } from '../paths.js';\n\nconst _require = createRequire(import.meta.url);\nconst { DatabaseSync: DatabaseSyncClass } = _require('node:sqlite') as {\n DatabaseSync: new (...args: ConstructorParameters<typeof DatabaseSync>) => DatabaseSync;\n};\n\n/**\n * Database file name within the global cleo home directory.\n *\n * @task T346\n * @epic T310\n */\nexport const GLOBAL_SIGNALDOCK_DB_FILENAME = 'signaldock.db';\n\n/**\n * Schema version for global signaldock databases.\n *\n * @task T346\n * @epic T310\n */\nexport const GLOBAL_SIGNALDOCK_SCHEMA_VERSION = '2026.4.12';\n\n/**\n * @deprecated Use GLOBAL_SIGNALDOCK_SCHEMA_VERSION. Retained during T310\n * migration window. Will be removed after all callers migrate (T355).\n */\nexport const SIGNALDOCK_SCHEMA_VERSION = GLOBAL_SIGNALDOCK_SCHEMA_VERSION;\n\n// ---------------------------------------------------------------------------\n// Path helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Returns the GLOBAL-tier signaldock.db path. Post-T310, signaldock.db\n * holds canonical agent identity + cloud-sync tables. Project-local\n * messaging state lives in conduit.db (T344).\n *\n * Resolves to `getCleoHome() + '/signaldock.db'`.\n * Guard: asserts the resolved path starts with getCleoHome() (defense in depth,\n * mirrors the ADR-036 pattern used by getNexusDbPath in nexus-sqlite.ts).\n *\n * @task T346\n * @epic T310\n * @why ADR-037 split single signaldock.db into project conduit + global signaldock\n * @throws {Error} If resolved path is not under getCleoHome() \u2014 indicates a code\n * path that bypasses canonical path resolution. Fix the caller, do not suppress.\n */\nexport function getGlobalSignaldockDbPath(): string {\n const cleoHome = getCleoHome();\n const dbPath = join(cleoHome, GLOBAL_SIGNALDOCK_DB_FILENAME);\n if (!dbPath.startsWith(cleoHome)) {\n throw new Error(\n `BUG: getGlobalSignaldockDbPath() resolved to \"${dbPath}\" which is NOT under ` +\n `getCleoHome() (\"${cleoHome}\"). signaldock.db is global-only per ADR-037. ` +\n `This indicates a code path that bypasses path resolution \u2014 ` +\n `fix the caller, do not suppress this error.`,\n );\n }\n return dbPath;\n}\n\n/**\n * @deprecated Use getGlobalSignaldockDbPath() directly. Retained during T310\n * migration window so the TypeScript build does not break until all callers\n * are updated (tracked in T355 accessor refactor).\n *\n * When called WITHOUT arguments: returns the global-tier path (forwards to\n * getGlobalSignaldockDbPath()).\n *\n * When called WITH a non-undefined `cwd` argument: throws a migration error\n * immediately. The project-tier path is now owned by conduit-sqlite.ts (T344).\n *\n * @param cwd - Must be undefined. Any other value throws a migration error.\n * @task T346\n * @epic T310\n */\nexport function getSignaldockDbPath(cwd?: string): string {\n if (cwd !== undefined) {\n throw new Error(\n 'getSignaldockDbPath(cwd) is removed as of T310 (v2026.4.12). ' +\n 'signaldock.db is now global-only at $XDG_DATA_HOME/cleo/signaldock.db. ' +\n 'Use getGlobalSignaldockDbPath(), or for project-local messaging use ' +\n 'getConduitDbPath() from conduit-sqlite.ts (T344).',\n );\n }\n return getGlobalSignaldockDbPath();\n}\n\n// ---------------------------------------------------------------------------\n// Embedded migration SQL \u2014 consolidated global-tier schema.\n// Source: spec \u00A72.2, ADR-037.\n// All incremental ALTER TABLE migrations from the pre-T310 schema are\n// collapsed into the single initial migration below. This avoids the\n// multi-step ALTER pattern and ensures fresh installs get the full schema\n// in one idempotent pass.\n// ---------------------------------------------------------------------------\n\n/**\n * Ordered migration entries for the global signaldock.db.\n * Add new migrations to the END of this array.\n *\n * @task T346\n * @epic T310\n */\nconst GLOBAL_EMBEDDED_MIGRATIONS: Array<{\n name: string;\n sql: string;\n /**\n * Optional pre-SQL hook that runs inside the migration transaction before\n * the embedded SQL block. Used by T897 to filter `ADD COLUMN` statements\n * through PRAGMA table_info() because SQLite lacks\n * `ALTER TABLE ... ADD COLUMN IF NOT EXISTS`.\n */\n preApply?: (db: DatabaseSync) => void;\n}> = [\n {\n name: '2026-04-12-000000_initial_global_signaldock',\n sql: `-- Global-tier signaldock.db initial migration (T310, ADR-037 \u00A72.2).\n-- Consolidated from pre-T310 incremental migrations. Global identity and\n-- cloud-sync tables only. Project-local messaging state is in conduit.db.\n\n-- Cloud-sync: user accounts (zero rows in pure-local mode).\nCREATE TABLE IF NOT EXISTS users (\n id TEXT PRIMARY KEY,\n email TEXT NOT NULL UNIQUE,\n password_hash TEXT NOT NULL,\n name TEXT,\n slug TEXT,\n default_agent_id TEXT,\n username TEXT,\n display_username TEXT,\n email_verified INTEGER NOT NULL DEFAULT 0,\n image TEXT,\n role TEXT NOT NULL DEFAULT 'user',\n banned INTEGER NOT NULL DEFAULT 0,\n ban_reason TEXT,\n ban_expires TEXT,\n two_factor_enabled INTEGER NOT NULL DEFAULT 0,\n metadata TEXT,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_users_slug ON users(slug);\n\n-- Cloud-sync: organization/team records.\nCREATE TABLE IF NOT EXISTS organization (\n id TEXT PRIMARY KEY NOT NULL,\n name TEXT NOT NULL,\n slug TEXT,\n logo TEXT,\n metadata TEXT,\n owner_id TEXT,\n created_at INTEGER NOT NULL DEFAULT (strftime('%s','now')),\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s','now'))\n);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_organization_slug ON organization(slug);\n\n-- Global identity: canonical agent registry (cross-project).\n-- api_key_encrypted uses KDF: HMAC-SHA256(machine-key || global-salt, agentId) \u2014 ADR-037 \u00A75.\n-- requires_reauth=1 is set during T310 migration for all pre-existing agents.\nCREATE TABLE IF NOT EXISTS agents (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL UNIQUE,\n name TEXT NOT NULL,\n description TEXT,\n class TEXT NOT NULL DEFAULT 'custom',\n privacy_tier TEXT NOT NULL DEFAULT 'public',\n owner_id TEXT REFERENCES users(id),\n endpoint TEXT,\n webhook_secret TEXT,\n capabilities TEXT NOT NULL DEFAULT '[]',\n skills TEXT NOT NULL DEFAULT '[]',\n avatar TEXT,\n messages_sent INTEGER NOT NULL DEFAULT 0,\n messages_received INTEGER NOT NULL DEFAULT 0,\n conversation_count INTEGER NOT NULL DEFAULT 0,\n friend_count INTEGER NOT NULL DEFAULT 0,\n status TEXT NOT NULL DEFAULT 'online',\n last_seen INTEGER,\n payment_config TEXT,\n api_key_hash TEXT,\n organization_id TEXT REFERENCES organization(id) ON DELETE SET NULL,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n transport_type TEXT NOT NULL DEFAULT 'http',\n api_key_encrypted TEXT,\n api_base_url TEXT NOT NULL DEFAULT 'https://api.signaldock.io',\n classification TEXT,\n transport_config TEXT NOT NULL DEFAULT '{}',\n is_active INTEGER NOT NULL DEFAULT 1,\n last_used_at INTEGER,\n requires_reauth INTEGER NOT NULL DEFAULT 0\n);\nCREATE UNIQUE INDEX IF NOT EXISTS agents_agent_id_idx ON agents(agent_id);\nCREATE INDEX IF NOT EXISTS agents_owner_idx ON agents(owner_id);\nCREATE INDEX IF NOT EXISTS agents_class_idx ON agents(class);\nCREATE INDEX IF NOT EXISTS agents_privacy_idx ON agents(privacy_tier);\nCREATE INDEX IF NOT EXISTS agents_org_idx ON agents(organization_id);\nCREATE INDEX IF NOT EXISTS idx_agents_transport_type ON agents(transport_type);\nCREATE INDEX IF NOT EXISTS idx_agents_is_active ON agents(is_active);\nCREATE INDEX IF NOT EXISTS idx_agents_last_used ON agents(last_used_at);\nCREATE INDEX IF NOT EXISTS idx_agents_reauth ON agents(requires_reauth) WHERE requires_reauth = 1;\n\n-- Cloud-sync: one-time agent claim tokens (api.signaldock.io provisioning).\nCREATE TABLE IF NOT EXISTS claim_codes (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL REFERENCES agents(id),\n code TEXT NOT NULL UNIQUE,\n expires_at INTEGER NOT NULL,\n used_at INTEGER,\n used_by TEXT REFERENCES users(id),\n created_at INTEGER NOT NULL\n);\nCREATE UNIQUE INDEX IF NOT EXISTS claim_codes_code_idx ON claim_codes(code);\nCREATE INDEX IF NOT EXISTS claim_codes_agent_idx ON claim_codes(agent_id);\n\n-- Identity catalog: pre-seeded capability slugs (19 entries).\nCREATE TABLE IF NOT EXISTS capabilities (\n id TEXT PRIMARY KEY,\n slug TEXT NOT NULL UNIQUE,\n name TEXT NOT NULL,\n description TEXT NOT NULL,\n category TEXT NOT NULL,\n created_at INTEGER NOT NULL\n);\n\n-- Identity catalog: pre-seeded skill slugs (36 entries).\nCREATE TABLE IF NOT EXISTS skills (\n id TEXT PRIMARY KEY,\n slug TEXT NOT NULL UNIQUE,\n name TEXT NOT NULL,\n description TEXT NOT NULL,\n category TEXT NOT NULL,\n created_at INTEGER NOT NULL\n);\n\n-- Junction: agent <-> capability catalog bindings.\nCREATE TABLE IF NOT EXISTS agent_capabilities (\n agent_id TEXT NOT NULL REFERENCES agents(id),\n capability_id TEXT NOT NULL REFERENCES capabilities(id),\n PRIMARY KEY (agent_id, capability_id)\n);\n\n-- Junction: agent <-> skill catalog bindings.\nCREATE TABLE IF NOT EXISTS agent_skills (\n agent_id TEXT NOT NULL REFERENCES agents(id),\n skill_id TEXT NOT NULL REFERENCES skills(id),\n PRIMARY KEY (agent_id, skill_id)\n);\n\n-- Live transport connection tracking (heartbeat state).\nCREATE TABLE IF NOT EXISTS agent_connections (\n id TEXT PRIMARY KEY NOT NULL,\n agent_id TEXT NOT NULL,\n transport_type TEXT NOT NULL DEFAULT 'http',\n connection_id TEXT,\n connected_at BIGINT NOT NULL,\n last_heartbeat BIGINT NOT NULL,\n connection_metadata TEXT,\n created_at BIGINT NOT NULL,\n FOREIGN KEY (agent_id) REFERENCES agents(agent_id) ON DELETE CASCADE,\n UNIQUE(agent_id, connection_id)\n);\nCREATE INDEX IF NOT EXISTS idx_agent_connections_agent ON agent_connections(agent_id);\nCREATE INDEX IF NOT EXISTS idx_agent_connections_transport ON agent_connections(transport_type);\nCREATE INDEX IF NOT EXISTS idx_agent_connections_heartbeat ON agent_connections(last_heartbeat);\n\n-- Cloud-sync: OAuth/provider accounts.\nCREATE TABLE IF NOT EXISTS accounts (\n id TEXT PRIMARY KEY NOT NULL,\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\n account_id TEXT NOT NULL,\n provider_id TEXT NOT NULL,\n access_token TEXT,\n refresh_token TEXT,\n id_token TEXT,\n access_token_expires_at TEXT,\n refresh_token_expires_at TEXT,\n scope TEXT,\n password TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS idx_accounts_user_id ON accounts(user_id);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_accounts_provider ON accounts(provider_id, account_id);\n\n-- Cloud-sync: authenticated sessions.\nCREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY NOT NULL,\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\n token TEXT NOT NULL UNIQUE,\n ip_address TEXT,\n user_agent TEXT,\n expires_at TEXT NOT NULL,\n active_organization_id TEXT,\n impersonated_by TEXT,\n active INTEGER NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_sessions_token ON sessions(token);\nCREATE INDEX IF NOT EXISTS idx_sessions_user_id ON sessions(user_id);\n\n-- Cloud-sync: email/2FA verification tokens.\nCREATE TABLE IF NOT EXISTS verifications (\n id TEXT PRIMARY KEY NOT NULL,\n identifier TEXT NOT NULL,\n value TEXT NOT NULL,\n expires_at TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS idx_verifications_identifier ON verifications(identifier);\n\n-- Org-scoped agent API keys (cloud use; zero rows locally).\nCREATE TABLE IF NOT EXISTS org_agent_keys (\n id TEXT PRIMARY KEY NOT NULL,\n organization_id TEXT NOT NULL REFERENCES organization(id) ON DELETE CASCADE,\n agent_id TEXT NOT NULL REFERENCES agents(id) ON DELETE CASCADE,\n created_by TEXT NOT NULL,\n created_at INTEGER NOT NULL\n);\nCREATE INDEX IF NOT EXISTS org_agent_keys_org_idx ON org_agent_keys(organization_id);\nCREATE INDEX IF NOT EXISTS org_agent_keys_agent_idx ON org_agent_keys(agent_id);`,\n },\n {\n name: '2026-04-17-213120_T897_agent_registry_v3',\n sql: `-- T889 / T897: agent_registry v3 \u2014 add tier, canSpawn, cantPath, checksum, orch fields.\n-- Column additions are filtered at application time by applyV3ColumnAlters()\n-- because SQLite does NOT support \\`ADD COLUMN IF NOT EXISTS\\`. Index creates\n-- use IF NOT EXISTS natively.\n\nCREATE INDEX IF NOT EXISTS idx_agents_tier ON agents(tier);\nCREATE INDEX IF NOT EXISTS idx_agents_cant_path ON agents(cant_path);\nCREATE INDEX IF NOT EXISTS idx_agent_skills_source ON agent_skills(source);`,\n preApply: applyV3ColumnAlters,\n },\n];\n\n// ---------------------------------------------------------------------------\n// T897 v3 column additions \u2014 SQLite lacks ADD COLUMN IF NOT EXISTS, so we\n// introspect PRAGMA table_info() and only emit ALTER statements for the\n// columns that are actually missing. This preserves both-sides idempotency\n// (fresh installs + upgraded installs) without needing SAVEPOINT/retry.\n// ---------------------------------------------------------------------------\n\n/**\n * Column additions for the T897 v3 migration, keyed by table.\n *\n * @task T897\n * @epic T889\n */\nconst V3_COLUMN_ADDITIONS: Record<string, ReadonlyArray<{ name: string; ddl: string }>> = {\n agents: [\n {\n name: 'tier',\n ddl: \"ADD COLUMN tier TEXT NOT NULL DEFAULT 'global' CHECK (tier IN ('project','global','packaged','fallback'))\",\n },\n {\n name: 'can_spawn',\n ddl: 'ADD COLUMN can_spawn INTEGER NOT NULL DEFAULT 0 CHECK (can_spawn IN (0,1))',\n },\n {\n name: 'orch_level',\n ddl: 'ADD COLUMN orch_level INTEGER NOT NULL DEFAULT 2 CHECK (orch_level BETWEEN 0 AND 2)',\n },\n { name: 'reports_to', ddl: 'ADD COLUMN reports_to TEXT' },\n { name: 'cant_path', ddl: 'ADD COLUMN cant_path TEXT' },\n { name: 'cant_sha256', ddl: 'ADD COLUMN cant_sha256 TEXT' },\n {\n name: 'installed_from',\n ddl: \"ADD COLUMN installed_from TEXT CHECK (installed_from IN ('seed','user','manual') OR installed_from IS NULL)\",\n },\n { name: 'installed_at', ddl: 'ADD COLUMN installed_at TEXT' },\n ],\n agent_skills: [\n {\n name: 'source',\n ddl: \"ADD COLUMN source TEXT NOT NULL DEFAULT 'manual' CHECK (source IN ('cant','manual','computed'))\",\n },\n {\n name: 'attached_at',\n ddl: \"ADD COLUMN attached_at TEXT NOT NULL DEFAULT (datetime('now'))\",\n },\n ],\n};\n\n/**\n * Read column names currently defined on `table`.\n *\n * @param db - open DatabaseSync handle\n * @param table - SQL table identifier\n * @returns Set of column names present in the live schema\n * @task T897\n * @epic T889\n */\nfunction readColumnSet(db: DatabaseSync, table: string): Set<string> {\n const rows = db.prepare(`PRAGMA table_info(${table})`).all() as Array<{ name: string }>;\n return new Set(rows.map((r) => r.name));\n}\n\n/**\n * Apply the T897 v3 column additions only for columns missing from the live\n * schema. Invoked as the `preApply` hook for the v3 migration entry so the\n * migration remains idempotent across fresh installs, partially-upgraded\n * installs, and already-upgraded installs.\n *\n * @param db - open DatabaseSync handle inside the migration's transaction\n * @task T897\n * @epic T889\n */\nfunction applyV3ColumnAlters(db: DatabaseSync): void {\n for (const [table, additions] of Object.entries(V3_COLUMN_ADDITIONS)) {\n const existing = readColumnSet(db, table);\n for (const { name, ddl } of additions) {\n if (!existing.has(name)) {\n db.exec(`ALTER TABLE ${table} ${ddl}`);\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Database lifecycle\n// ---------------------------------------------------------------------------\n\n/** Singleton native DatabaseSync handle for the current process. */\nlet _globalSignaldockNativeDb: DatabaseSync | null = null;\n\n/**\n * Apply the global signaldock schema to an already-open database.\n * Idempotent \u2014 uses `CREATE TABLE IF NOT EXISTS` and migration tracking.\n *\n * @param db - An open DatabaseSync instance at the global path\n * @task T346\n * @epic T310\n */\nfunction applyGlobalSignaldockSchema(db: DatabaseSync): void {\n // Ensure migration tracking tables exist\n db.exec(`\n CREATE TABLE IF NOT EXISTS _signaldock_meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL,\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\n )\n `);\n db.exec(`\n CREATE TABLE IF NOT EXISTS _signaldock_migrations (\n name TEXT PRIMARY KEY,\n applied_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\n )\n `);\n\n // Apply embedded migrations (skips already-applied ones)\n for (const migration of GLOBAL_EMBEDDED_MIGRATIONS) {\n const applied = db\n .prepare('SELECT name FROM _signaldock_migrations WHERE name = ?')\n .get(migration.name) as { name: string } | undefined;\n if (applied) continue;\n\n db.exec('BEGIN TRANSACTION');\n try {\n if (migration.preApply) {\n migration.preApply(db);\n }\n db.exec(migration.sql);\n db.prepare('INSERT INTO _signaldock_migrations (name) VALUES (?)').run(migration.name);\n db.exec('COMMIT');\n } catch (err) {\n db.exec('ROLLBACK');\n throw err;\n }\n }\n\n // Record schema version\n db.exec(`\n INSERT OR REPLACE INTO _signaldock_meta (key, value, updated_at)\n VALUES ('schema_version', '${GLOBAL_SIGNALDOCK_SCHEMA_VERSION}', strftime('%s', 'now'))\n `);\n}\n\n/**\n * Ensure global signaldock.db exists with the full global schema applied.\n * Creates the global cleo home directory if it doesn't exist.\n * Idempotent \u2014 safe to call multiple times.\n *\n * @returns Object with action ('created' | 'exists') and the database path\n * @task T346\n * @epic T310\n */\nexport async function ensureGlobalSignaldockDb(): Promise<{\n action: 'created' | 'exists';\n path: string;\n}> {\n const dbPath = getGlobalSignaldockDbPath();\n const alreadyExists = existsSync(dbPath);\n\n // Ensure global cleo home directory exists\n const cleoHome = getCleoHome();\n if (!existsSync(cleoHome)) {\n mkdirSync(cleoHome, { recursive: true });\n }\n\n const db = new DatabaseSyncClass(dbPath);\n try {\n db.exec('PRAGMA journal_mode = WAL');\n db.exec('PRAGMA busy_timeout = 5000');\n db.exec('PRAGMA synchronous = NORMAL');\n db.exec('PRAGMA foreign_keys = ON');\n db.exec('PRAGMA cache_size = -64000'); // 64 MB\n\n // Check if schema already applied (agents table as sentinel)\n const hasSchema = (() => {\n try {\n const result = db\n .prepare(\"SELECT name FROM sqlite_master WHERE type='table' AND name='agents'\")\n .get() as { name: string } | undefined;\n return !!result;\n } catch {\n return false;\n }\n })();\n\n applyGlobalSignaldockSchema(db);\n\n // Store native handle for backup integration (getGlobalSignaldockNativeDb)\n _globalSignaldockNativeDb = db;\n\n return {\n action: alreadyExists && hasSchema ? 'exists' : 'created',\n path: dbPath,\n };\n } catch (err) {\n db.close();\n _globalSignaldockNativeDb = null;\n throw err;\n }\n // NOTE: We intentionally do NOT close `db` here \u2014 the native handle is\n // retained as _globalSignaldockNativeDb for backup integration. Callers\n // that need a short-lived open/close pattern should open the DB themselves.\n}\n\n/**\n * @deprecated Use ensureGlobalSignaldockDb(). Retained during T310 migration\n * window for callers in init.ts and agent-registry-accessor.ts.\n *\n * When called WITHOUT arguments: forwards to ensureGlobalSignaldockDb().\n * When called WITH a non-undefined `cwd` argument: throws a migration error.\n *\n * @param cwd - Must be undefined. Any other value throws a migration error.\n * @task T346\n * @epic T310\n */\nexport async function ensureSignaldockDb(\n cwd?: string,\n): Promise<{ action: 'created' | 'exists'; path: string }> {\n if (cwd !== undefined) {\n throw new Error(\n 'ensureSignaldockDb(cwd) is removed as of T310 (v2026.4.12). ' +\n 'signaldock.db is now global-only. ' +\n 'Use ensureGlobalSignaldockDb() for global identity, or ' +\n 'ensureConduitDb(cwd) from conduit-sqlite.ts for project messaging (T344).',\n );\n }\n return ensureGlobalSignaldockDb();\n}\n\n/**\n * Check global signaldock.db health: table count, WAL mode, schema version.\n * Used by `cleo doctor` to verify global signaldock.db integrity.\n *\n * @returns Health report object, or object with exists=false if the DB does not exist.\n * @task T346\n * @epic T310\n */\nexport async function checkGlobalSignaldockDbHealth(): Promise<{\n exists: boolean;\n path: string;\n tableCount: number;\n walMode: boolean;\n schemaVersion: string | null;\n foreignKeysEnabled: boolean;\n} | null> {\n const dbPath = getGlobalSignaldockDbPath();\n if (!existsSync(dbPath)) {\n return {\n exists: false,\n path: dbPath,\n tableCount: 0,\n walMode: false,\n schemaVersion: null,\n foreignKeysEnabled: false,\n };\n }\n\n const db = new DatabaseSyncClass(dbPath);\n try {\n const tables = db\n .prepare(\n \"SELECT COUNT(*) as count FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'\",\n )\n .get() as { count: number };\n\n const journalMode = db.prepare('PRAGMA journal_mode').get() as { journal_mode: string };\n const fkEnabled = db.prepare('PRAGMA foreign_keys').get() as { foreign_keys: number };\n\n let schemaVersion: string | null = null;\n try {\n const meta = db\n .prepare(\"SELECT value FROM _signaldock_meta WHERE key = 'schema_version'\")\n .get() as { value: string } | undefined;\n schemaVersion = meta?.value ?? null;\n } catch {\n // Meta table may not exist on very old or partially-initialized DBs\n }\n\n return {\n exists: true,\n path: dbPath,\n tableCount: tables.count,\n walMode: journalMode.journal_mode === 'wal',\n schemaVersion,\n foreignKeysEnabled: fkEnabled.foreign_keys === 1,\n };\n } finally {\n db.close();\n }\n}\n\n/**\n * @deprecated Use checkGlobalSignaldockDbHealth(). Retained during T310 migration\n * window for callers in `cleo doctor` and other diagnostics.\n *\n * When called WITHOUT arguments: forwards to checkGlobalSignaldockDbHealth().\n * When called WITH a non-undefined `cwd` argument: throws a migration error.\n *\n * @param cwd - Must be undefined. Any other value throws a migration error.\n * @task T346\n * @epic T310\n */\nexport async function checkSignaldockDbHealth(cwd?: string): Promise<{\n exists: boolean;\n path: string;\n tableCount: number;\n walMode: boolean;\n schemaVersion: string | null;\n foreignKeysEnabled: boolean;\n} | null> {\n if (cwd !== undefined) {\n throw new Error(\n 'checkSignaldockDbHealth(cwd) is removed as of T310 (v2026.4.12). ' +\n 'signaldock.db is now global-only. ' +\n 'Use checkGlobalSignaldockDbHealth() for global signaldock health, or ' +\n 'checkConduitDbHealth(cwd) from conduit-sqlite.ts for project conduit health (T344).',\n );\n }\n return checkGlobalSignaldockDbHealth();\n}\n\n/**\n * Get the underlying node:sqlite DatabaseSync instance for global signaldock.db.\n * Returns the handle stored by the most recent ensureGlobalSignaldockDb() call,\n * or null if the database has not yet been initialized in this process.\n *\n * Used by sqlite-backup.ts to activate the signaldock GLOBAL_SNAPSHOT_TARGET\n * (spec \u00A76.2, T310).\n *\n * @task T346\n * @epic T310\n */\nexport function getGlobalSignaldockNativeDb(): DatabaseSync | null {\n return _globalSignaldockNativeDb;\n}\n\n/**\n * Reset the in-process global signaldock.db singleton.\n * ONLY for use in test isolation \u2014 never call in production code.\n *\n * @task T346\n * @epic T310\n */\nexport function _resetGlobalSignaldockDb_TESTING_ONLY(): void {\n if (_globalSignaldockNativeDb) {\n try {\n if (_globalSignaldockNativeDb.isOpen) {\n _globalSignaldockNativeDb.close();\n }\n } catch {\n // Ignore close errors\n }\n _globalSignaldockNativeDb = null;\n }\n}\n", "/**\n * SQLite backup via VACUUM INTO with snapshot rotation.\n *\n * Produces self-contained, WAL-free copies of CLEO SQLite databases\n * (tasks.db, brain.db, conduit.db at project tier; nexus.db, signaldock.db at\n * global tier) into `.cleo/backups/sqlite/` (project) or\n * `$XDG_DATA_HOME/cleo/backups/sqlite/` (global) with a configurable rotation\n * limit. Also provides raw-file backup for the global-salt binary (not SQLite).\n * All errors are swallowed \u2014 backup failure must never interrupt normal operation.\n *\n * @task T4873\n * @task T5158 \u2014 extended to cover brain.db\n * @task T306 \u2014 extended to cover global-tier nexus.db (epic T299)\n * @task T369 \u2014 extended to cover conduit.db (project), signaldock.db (global),\n * and global-salt raw-file backup (epic T310)\n * @epic T4867\n */\n\nimport {\n chmodSync,\n copyFileSync,\n existsSync,\n mkdirSync,\n readdirSync,\n statSync,\n unlinkSync,\n} from 'node:fs';\nimport { join } from 'node:path';\nimport { getCleoDir, getCleoHome } from '../paths.js';\nimport { getConduitNativeDb } from './conduit-sqlite.js';\nimport { getGlobalSaltPath } from './global-salt.js';\nimport { getBrainNativeDb } from './memory-sqlite.js';\nimport { getNexusNativeDb } from './nexus-sqlite.js';\nimport { getGlobalSignaldockNativeDb } from './signaldock-sqlite.js';\nimport { getNativeDb } from './sqlite.js';\n\n/** Maximum number of snapshots retained per database (oldest rotated out). */\nconst MAX_SNAPSHOTS = 10;\n/** Debounce window (ms) during which duplicate snapshot requests are suppressed. */\nconst DEBOUNCE_MS = 30_000; // 30 seconds\n\n/**\n * Per-database snapshot book-keeping: last snapshot timestamp (epoch ms)\n * keyed by the canonical snapshot prefix (e.g. `\"tasks\"` / `\"brain\"`).\n */\nconst _lastBackupEpoch: Record<string, number> = {};\n\n/**\n * Registered snapshot target \u2014 each one maps a logical key (prefix used in\n * snapshot filenames) to a function returning the live {@link DatabaseSync}\n * handle. `null` means the database has not been initialized in the current\n * process and its snapshot step should be skipped.\n */\ninterface SnapshotTarget {\n /** Canonical name used in snapshot filenames, e.g. `\"tasks\"` or `\"brain\"`. */\n prefix: string;\n /** Resolves the live native handle, or `null` if not yet initialized. */\n getDb: () => { exec: (sql: string) => void } | null;\n}\n\n/**\n * Canonical list of snapshot targets. Ordering is insertion order \u2014 tasks.db\n * snapshots first (highest-value operational state), then brain.db, then\n * conduit.db (project messaging state).\n *\n * @task T369\n * @epic T310\n */\nconst SNAPSHOT_TARGETS: SnapshotTarget[] = [\n { prefix: 'tasks', getDb: getNativeDb },\n { prefix: 'brain', getDb: getBrainNativeDb },\n { prefix: 'conduit', getDb: getConduitNativeDb }, // Added T369 \u2014 project messaging DB\n];\n\n/**\n * Format a Date as `YYYYMMDD-HHmmss` (local time) for snapshot filenames.\n *\n * Matches the regex `/^(?:tasks|brain)-\\d{8}-\\d{6}\\.db$/` used by the rotation\n * and listing logic below.\n */\nfunction formatTimestamp(d: Date): string {\n const pad = (n: number, len = 2) => String(n).padStart(len, '0');\n return (\n `${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}` +\n `-${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}`\n );\n}\n\n/**\n * Build the regex that matches snapshot filenames for the given prefix.\n * Isolated so both {@link rotateSnapshots} and {@link listSqliteBackupsForPrefix}\n * share a single source of truth.\n */\nfunction snapshotPattern(prefix: string): RegExp {\n // Escape the prefix in case it ever contains regex metacharacters.\n const safe = prefix.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return new RegExp(`^${safe}-\\\\d{8}-\\\\d{6}\\\\.db$`);\n}\n\n/**\n * Rotate snapshots for a single prefix: delete the oldest files until fewer\n * than {@link MAX_SNAPSHOTS} remain. Non-fatal on any filesystem error.\n */\nfunction rotateSnapshots(backupDir: string, prefix: string): void {\n try {\n const pattern = snapshotPattern(prefix);\n const files = readdirSync(backupDir)\n .filter((f) => pattern.test(f))\n .map((f) => ({\n name: f,\n path: join(backupDir, f),\n mtimeMs: statSync(join(backupDir, f)).mtimeMs,\n }))\n .sort((a, b) => a.mtimeMs - b.mtimeMs); // oldest first\n\n while (files.length >= MAX_SNAPSHOTS) {\n const oldest = files.shift();\n if (!oldest) break;\n unlinkSync(oldest.path);\n }\n } catch {\n // non-fatal\n }\n}\n\n/** Options accepted by {@link vacuumIntoBackup} and {@link vacuumIntoBackupAll}. */\nexport interface VacuumOptions {\n /**\n * Working directory used to resolve the project-local `.cleo/backups/sqlite/`\n * directory. Defaults to `process.cwd()` (delegated to {@link getCleoDir}).\n */\n cwd?: string;\n /** When true, bypass the {@link DEBOUNCE_MS} debounce window. */\n force?: boolean;\n}\n\n/**\n * Create a VACUUM INTO snapshot of a single SQLite database.\n *\n * Runs `PRAGMA wal_checkpoint(TRUNCATE)` first to flush the WAL for a\n * consistent snapshot, then issues `VACUUM INTO '<dest>'` which SQLite\n * implements as an atomic, fully defragmented clone.\n *\n * Non-fatal: all errors are swallowed via the outer try in\n * {@link vacuumIntoBackupAll}; failures here must never block normal\n * operation.\n *\n * @param target \u2014 snapshot target descriptor (prefix + native DB getter)\n * @param backupDir \u2014 absolute path to `.cleo/backups/sqlite/`\n * @param now \u2014 reference timestamp for the filename\n */\nfunction snapshotOne(target: SnapshotTarget, backupDir: string, now: Date): void {\n const db = target.getDb();\n if (!db) return; // DB not initialized in this process \u2014 skip silently\n\n const dest = join(backupDir, `${target.prefix}-${formatTimestamp(now)}.db`);\n\n // TRUNCATE checkpoint: flushes all WAL frames to the main DB and truncates\n // the WAL file to zero bytes, ensuring a consistent DB state before the\n // VACUUM INTO snapshot (ADR-013, section 3 point 7). This is safe because\n // the .db files are excluded from project git tracking (.gitignore + git\n // rm --cached), so git operations cannot restore a stale WAL. The root\n // cause of the 2026-02-25 data loss was that WAL files were still tracked\n // in the project git index; that has been resolved (T4894, T5158).\n db.exec('PRAGMA wal_checkpoint(TRUNCATE)');\n\n rotateSnapshots(backupDir, target.prefix);\n\n // Escape single quotes in path (path is programmatic, but be safe).\n const safeDest = dest.replace(/'/g, \"''\");\n db.exec(`VACUUM INTO '${safeDest}'`);\n}\n\n/**\n * Create a VACUUM INTO snapshot of the primary SQLite database (tasks.db).\n *\n * Debounced by default (30s). Pass `force: true` to bypass debounce. This\n * function is retained for backward compatibility with existing call sites\n * in `data-safety.ts` / `data-safety-central.ts` that only snapshot tasks.db.\n *\n * Prefer {@link vacuumIntoBackupAll} for new code \u2014 it snapshots every\n * registered database (currently tasks.db + brain.db) and shares the same\n * debounce + rotation guarantees.\n *\n * Non-fatal: all errors are swallowed \u2014 backup failure must never\n * interrupt normal operation.\n */\nexport async function vacuumIntoBackup(opts: VacuumOptions = {}): Promise<void> {\n const now = Date.now();\n const prefix = 'tasks';\n const last = _lastBackupEpoch[prefix] ?? 0;\n if (!opts.force && now - last < DEBOUNCE_MS) {\n return; // debounced\n }\n\n try {\n const cleoDir = getCleoDir(opts.cwd);\n const backupDir = join(cleoDir, 'backups', 'sqlite');\n mkdirSync(backupDir, { recursive: true });\n\n const target = SNAPSHOT_TARGETS.find((t) => t.prefix === prefix);\n if (!target) return;\n\n snapshotOne(target, backupDir, new Date());\n _lastBackupEpoch[prefix] = Date.now();\n } catch {\n // non-fatal \u2014 backup failure must never interrupt normal operation\n }\n}\n\n/**\n * Create VACUUM INTO snapshots of all registered CLEO SQLite databases\n * (currently tasks.db + brain.db). Each database is debounced independently.\n *\n * This is the preferred entry point for session-lifecycle hooks and\n * pre-destructive-operation snapshots \u2014 it guarantees that BRAIN memory is\n * snapshotted alongside task state.\n *\n * Non-fatal: errors are swallowed per database so a brain.db failure cannot\n * block a tasks.db snapshot (and vice versa).\n */\nexport async function vacuumIntoBackupAll(opts: VacuumOptions = {}): Promise<void> {\n const nowMs = Date.now();\n const now = new Date();\n\n let backupDir: string;\n try {\n const cleoDir = getCleoDir(opts.cwd);\n backupDir = join(cleoDir, 'backups', 'sqlite');\n mkdirSync(backupDir, { recursive: true });\n } catch {\n return; // cannot resolve backup dir \u2014 abort silently\n }\n\n for (const target of SNAPSHOT_TARGETS) {\n const last = _lastBackupEpoch[target.prefix] ?? 0;\n if (!opts.force && nowMs - last < DEBOUNCE_MS) {\n continue; // debounced \u2014 skip this target only\n }\n try {\n snapshotOne(target, backupDir, now);\n _lastBackupEpoch[target.prefix] = Date.now();\n } catch {\n // non-fatal \u2014 continue with remaining targets\n }\n }\n}\n\n/**\n * List existing snapshots for a given prefix (`\"tasks\"` or `\"brain\"`),\n * newest first. Returns an empty array if the backup directory does not\n * exist.\n */\nfunction listSqliteBackupsForPrefix(\n prefix: string,\n cwd?: string,\n): Array<{ name: string; path: string; mtimeMs: number }> {\n try {\n const cleoDir = getCleoDir(cwd);\n const backupDir = join(cleoDir, 'backups', 'sqlite');\n if (!existsSync(backupDir)) return [];\n\n const pattern = snapshotPattern(prefix);\n return readdirSync(backupDir)\n .filter((f) => pattern.test(f))\n .map((f) => ({\n name: f,\n path: join(backupDir, f),\n mtimeMs: statSync(join(backupDir, f)).mtimeMs,\n }))\n .sort((a, b) => b.mtimeMs - a.mtimeMs); // newest first\n } catch {\n return [];\n }\n}\n\n/**\n * List existing tasks.db snapshots (newest first).\n *\n * Retained for backward compatibility. For new code prefer\n * {@link listSqliteBackupsAll}.\n */\nexport function listSqliteBackups(\n cwd?: string,\n): Array<{ name: string; path: string; mtimeMs: number }> {\n return listSqliteBackupsForPrefix('tasks', cwd);\n}\n\n/**\n * List existing brain.db snapshots (newest first).\n */\nexport function listBrainBackups(\n cwd?: string,\n): Array<{ name: string; path: string; mtimeMs: number }> {\n return listSqliteBackupsForPrefix('brain', cwd);\n}\n\n/**\n * Aggregated listing of all registered SQLite snapshots.\n *\n * Returns an object keyed by snapshot prefix (`tasks`, `brain`) where each\n * value is the per-prefix list sorted newest-first. Missing prefixes are\n * represented as empty arrays.\n */\nexport function listSqliteBackupsAll(\n cwd?: string,\n): Record<string, Array<{ name: string; path: string; mtimeMs: number }>> {\n const out: Record<string, Array<{ name: string; path: string; mtimeMs: number }>> = {};\n for (const target of SNAPSHOT_TARGETS) {\n out[target.prefix] = listSqliteBackupsForPrefix(target.prefix, cwd);\n }\n return out;\n}\n\n// ============================================================================\n// Global-tier backup (ADR-036 \u00A7Backup Mechanism)\n// @task T306\n// @epic T299\n// ============================================================================\n\n/**\n * Backup scope: project (per-project `.cleo/`) or global (`$XDG_DATA_HOME/cleo/`).\n *\n * @task T306\n * @epic T299\n */\nexport type BackupScope = 'project' | 'global';\n\n/**\n * Registered global-tier snapshot targets. Both `nexus` and `signaldock` are\n * active as of T369 (epic T310).\n *\n * @task T369\n * @epic T310\n */\nconst GLOBAL_SNAPSHOT_TARGETS: SnapshotTarget[] = [\n { prefix: 'nexus', getDb: getNexusNativeDb },\n { prefix: 'signaldock', getDb: getGlobalSignaldockNativeDb }, // Activated T369 \u2014 global agent registry\n];\n\n/**\n * Resolve the global-tier backup directory, creating it on first use.\n *\n * Uses `cleoHomeOverride` when provided (test isolation) or falls back to\n * `getCleoHome()` (XDG-compliant; never hardcodes `~/.cleo`).\n */\nfunction resolveGlobalBackupDir(cleoHomeOverride?: string): string {\n const base = cleoHomeOverride ?? getCleoHome();\n return join(base, 'backups', 'sqlite');\n}\n\n/**\n * Snapshot a global-tier SQLite database via VACUUM INTO.\n *\n * Writes to `$XDG_DATA_HOME/cleo/backups/sqlite/<dbName>-YYYYMMDD-HHmmss.db`\n * and enforces a per-prefix rotation window (default 10 snapshots).\n *\n * Non-fatal: errors from any individual step are surfaced via the return value\n * but never thrown \u2014 a failed snapshot MUST NOT interrupt normal operation.\n *\n * @param dbName - Which global-tier DB to snapshot (`'nexus'` or `'signaldock'`)\n * @param opts.rotation - Maximum retained snapshots per prefix (default 10)\n * @param opts.cleoHomeOverride - Override `getCleoHome()` path (use in tests to target a tmp dir)\n * @returns Object containing the new snapshot path and any rotated (deleted) file paths\n *\n * @task T306\n * @task T369 \u2014 activated signaldock target (epic T310)\n * @epic T299\n * @why ADR-036 \u00A7Backup Mechanism requires VACUUM INTO rotation at the global tier;\n * nexus.db has zero backup coverage prior to v2026.4.11.\n */\nexport async function vacuumIntoGlobalBackup(\n dbName: 'nexus' | 'signaldock',\n opts?: { rotation?: number; cleoHomeOverride?: string },\n): Promise<{ snapshotPath: string; rotated: string[] }> {\n const maxSnaps = opts?.rotation ?? MAX_SNAPSHOTS;\n const backupDir = resolveGlobalBackupDir(opts?.cleoHomeOverride);\n\n mkdirSync(backupDir, { recursive: true });\n\n const target = GLOBAL_SNAPSHOT_TARGETS.find((t) => t.prefix === dbName);\n if (!target) {\n return { snapshotPath: '', rotated: [] };\n }\n\n const db = target.getDb();\n if (!db) {\n return { snapshotPath: '', rotated: [] };\n }\n\n const now = new Date();\n const snapshotName = `${dbName}-${formatTimestamp(now)}.db`;\n const snapshotPath = join(backupDir, snapshotName);\n\n // Collect files that will be rotated out before writing the new one.\n const rotated: string[] = [];\n try {\n const pattern = snapshotPattern(dbName);\n const existing = readdirSync(backupDir)\n .filter((f) => pattern.test(f))\n .map((f) => ({\n name: f,\n path: join(backupDir, f),\n mtimeMs: statSync(join(backupDir, f)).mtimeMs,\n }))\n .sort((a, b) => a.mtimeMs - b.mtimeMs); // oldest first\n\n // Remove oldest until we have room for the new snapshot.\n while (existing.length >= maxSnaps) {\n const oldest = existing.shift();\n if (!oldest) break;\n try {\n unlinkSync(oldest.path);\n rotated.push(oldest.path);\n } catch {\n // non-fatal rotation failure\n }\n }\n } catch {\n // non-fatal \u2014 continue even if rotation enumeration fails\n }\n\n // Checkpoint then VACUUM INTO for a WAL-free, atomic snapshot.\n db.exec('PRAGMA wal_checkpoint(TRUNCATE)');\n const safeDest = snapshotPath.replace(/'/g, \"''\");\n db.exec(`VACUUM INTO '${safeDest}'`);\n\n return { snapshotPath, rotated };\n}\n\n/**\n * A single entry returned by {@link listGlobalSqliteBackups}.\n *\n * @task T306\n * @epic T299\n */\nexport interface GlobalBackupEntry {\n /** Snapshot filename, e.g. `nexus-20260408-143022.db`. */\n name: string;\n /** Absolute path to the snapshot file. */\n path: string;\n /** File size in bytes. */\n size: number;\n /** Last-modified timestamp. */\n mtime: Date;\n}\n\n/**\n * List global-tier SQLite backups from `$XDG_DATA_HOME/cleo/backups/sqlite/`,\n * optionally filtered by prefix (e.g. `'nexus'`). Sorted newest-first by mtime.\n *\n * Returns an empty array when the backup directory does not exist.\n *\n * @param prefix - Optional prefix filter; when omitted all `.db` snapshot files are listed\n * @param cleoHomeOverride - Override `getCleoHome()` path (use in tests to target a tmp dir)\n *\n * @task T306\n * @epic T299\n */\nexport function listGlobalSqliteBackups(\n prefix?: string,\n cleoHomeOverride?: string,\n): GlobalBackupEntry[] {\n try {\n const backupDir = resolveGlobalBackupDir(cleoHomeOverride);\n if (!existsSync(backupDir)) return [];\n\n const pattern = prefix ? snapshotPattern(prefix) : /^[a-zA-Z0-9_-]+-\\d{8}-\\d{6}\\.db$/;\n\n return readdirSync(backupDir)\n .filter((f) => pattern.test(f))\n .map((f) => {\n const filePath = join(backupDir, f);\n const s = statSync(filePath);\n return { name: f, path: filePath, size: s.size, mtime: new Date(s.mtimeMs) };\n })\n .sort((a, b) => b.mtime.getTime() - a.mtime.getTime()); // newest first\n } catch {\n return [];\n }\n}\n\n// ============================================================================\n// Global-salt raw-file backup (ADR-037 \u00A75)\n// @task T369\n// @epic T310\n// ============================================================================\n\n/** Filename prefix for global-salt backup files. */\nconst GLOBAL_SALT_BACKUP_PREFIX = 'global-salt';\n\n/** Regex matching global-salt backup filenames: `global-salt-YYYYMMDD-HHmmss`. */\nconst GLOBAL_SALT_BACKUP_PATTERN = /^global-salt-\\d{8}-\\d{6}$/;\n\n/**\n * Resolve the backup directory for global-salt files: `{cleoHome}/backups/`.\n * Global-salt backups live directly under `backups/` (not `backups/sqlite/`)\n * to make clear they are binary files, not SQLite databases.\n */\nfunction resolveGlobalSaltBackupDir(cleoHomeOverride?: string): string {\n const base = cleoHomeOverride ?? getCleoHome();\n return join(base, 'backups');\n}\n\n/**\n * Rotate global-salt backup files: delete the oldest until fewer than\n * {@link MAX_SNAPSHOTS} remain. Returns the paths of deleted files.\n * Non-fatal on any filesystem error.\n */\nfunction rotateGlobalSaltBackups(backupDir: string): string[] {\n const rotated: string[] = [];\n try {\n const files = readdirSync(backupDir)\n .filter((f) => GLOBAL_SALT_BACKUP_PATTERN.test(f))\n .map((f) => ({\n name: f,\n path: join(backupDir, f),\n mtimeMs: statSync(join(backupDir, f)).mtimeMs,\n }))\n .sort((a, b) => a.mtimeMs - b.mtimeMs); // oldest first\n\n while (files.length >= MAX_SNAPSHOTS) {\n const oldest = files.shift();\n if (!oldest) break;\n try {\n unlinkSync(oldest.path);\n rotated.push(oldest.path);\n } catch {\n // non-fatal rotation failure\n }\n }\n } catch {\n // non-fatal\n }\n return rotated;\n}\n\n/**\n * Creates a raw-file backup of the global-salt binary at\n * `${getCleoHome()}/backups/global-salt-YYYYMMDD-HHmmss` with `0o600`\n * permissions. Rotates to {@link MAX_SNAPSHOTS} (10) copies, deleting the\n * oldest when the limit is reached.\n *\n * Non-fatal: errors are swallowed \u2014 salt backup failure must never block cleo.\n * Returns empty strings and no rotated paths on failure.\n *\n * @param opts.cleoHomeOverride - Override `getCleoHome()` path (use in tests to target a tmp dir)\n * @returns Object with the new snapshot path and any rotated (deleted) file paths\n *\n * @task T369\n * @epic T310\n * @why ADR-037 \u00A75 \u2014 global-salt is security-critical; losing it invalidates\n * all API keys. Backup enables recovery from accidental deletion.\n */\nexport async function backupGlobalSalt(opts?: {\n cleoHomeOverride?: string;\n}): Promise<{ snapshotPath: string; rotated: string[] }> {\n try {\n const cleoHome = opts?.cleoHomeOverride ?? getCleoHome();\n const saltSourcePath = opts?.cleoHomeOverride\n ? join(cleoHome, 'global-salt')\n : getGlobalSaltPath();\n\n if (!existsSync(saltSourcePath)) {\n return { snapshotPath: '', rotated: [] };\n }\n\n const backupDir = resolveGlobalSaltBackupDir(opts?.cleoHomeOverride);\n mkdirSync(backupDir, { recursive: true });\n\n const rotated = rotateGlobalSaltBackups(backupDir);\n\n const snapshotName = `${GLOBAL_SALT_BACKUP_PREFIX}-${formatTimestamp(new Date())}`;\n const snapshotPath = join(backupDir, snapshotName);\n\n copyFileSync(saltSourcePath, snapshotPath);\n chmodSync(snapshotPath, 0o600);\n\n return { snapshotPath, rotated };\n } catch {\n // non-fatal \u2014 backup failure must never interrupt normal operation\n return { snapshotPath: '', rotated: [] };\n }\n}\n\n/**\n * A single entry returned by {@link listGlobalSaltBackups}.\n *\n * @task T369\n * @epic T310\n */\nexport interface GlobalSaltBackupEntry {\n /** Backup filename, e.g. `global-salt-20260408-143022`. */\n name: string;\n /** Absolute path to the backup file. */\n path: string;\n /** File size in bytes (should be 32 for a valid global-salt). */\n size: number;\n /** Last-modified timestamp. */\n mtime: Date;\n}\n\n/**\n * List global-salt backup files from `$XDG_DATA_HOME/cleo/backups/`, sorted\n * newest-first by mtime.\n *\n * Returns an empty array when the backup directory does not exist.\n *\n * @param cleoHomeOverride - Override `getCleoHome()` path (use in tests to target a tmp dir)\n *\n * @task T369\n * @epic T310\n */\nexport function listGlobalSaltBackups(cleoHomeOverride?: string): GlobalSaltBackupEntry[] {\n try {\n const backupDir = resolveGlobalSaltBackupDir(cleoHomeOverride);\n if (!existsSync(backupDir)) return [];\n\n return readdirSync(backupDir)\n .filter((f) => GLOBAL_SALT_BACKUP_PATTERN.test(f))\n .map((f) => {\n const filePath = join(backupDir, f);\n const s = statSync(filePath);\n return { name: f, path: filePath, size: s.size, mtime: new Date(s.mtimeMs) };\n })\n .sort((a, b) => b.mtime.getTime() - a.mtime.getTime()); // newest first\n } catch {\n return [];\n }\n}\n", "/**\n * Status Registry \u2014 re-exports from @cleocode/contracts.\n *\n * The canonical status definitions now live in @cleocode/contracts.\n * This file exists for backward compatibility within the store layer.\n */\n\nexport type {\n AdrStatus,\n EntityType,\n GateStatus,\n ManifestStatus,\n PipelineStatus,\n SessionStatus,\n StageStatus,\n TaskStatus,\n} from '@cleocode/contracts';\nexport {\n ADR_STATUSES,\n GATE_STATUSES,\n isValidStatus,\n LIFECYCLE_PIPELINE_STATUSES,\n LIFECYCLE_STAGE_STATUSES,\n MANIFEST_STATUSES,\n PIPELINE_STATUS_ICONS,\n SESSION_STATUSES,\n STAGE_STATUS_ICONS,\n STATUS_REGISTRY,\n TASK_STATUS_SYMBOLS_ASCII,\n TASK_STATUS_SYMBOLS_UNICODE,\n TASK_STATUSES,\n TERMINAL_PIPELINE_STATUSES,\n TERMINAL_STAGE_STATUSES,\n TERMINAL_TASK_STATUSES,\n} from '@cleocode/contracts';\n", "/**\n * Drizzle ORM schema for the CLEO Agent dimension.\n *\n * Defines the `agent_instances` table that tracks live agent processes,\n * their health (heartbeat protocol), capacity, and error history.\n *\n * This is the DB-backed runtime registry -- distinct from the file-based\n * skill agent registry in `skills/agents/registry.ts` which tracks\n * installed agent *definitions*. This table tracks running agent *instances*.\n *\n * @module agents/agent-schema\n */\n\nimport { sql } from 'drizzle-orm';\nimport { index, integer, sqliteTable, text } from 'drizzle-orm/sqlite-core';\n\n// ============================================================================\n// Canonical enum constants\n// ============================================================================\n\n/** Agent instance status values matching DB CHECK constraint. */\nexport const AGENT_INSTANCE_STATUSES = [\n 'starting',\n 'active',\n 'idle',\n 'error',\n 'crashed',\n 'stopped',\n] as const;\n\n/** Agent type values for classification. */\nexport const AGENT_TYPES = [\n 'orchestrator',\n 'executor',\n 'researcher',\n 'architect',\n 'validator',\n 'documentor',\n 'custom',\n] as const;\n\n// ============================================================================\n// Agent Instances Table\n// ============================================================================\n\nexport const agentInstances = sqliteTable(\n 'agent_instances',\n {\n id: text('id').primaryKey(),\n agentType: text('agent_type', { enum: AGENT_TYPES }).notNull(),\n status: text('status', { enum: AGENT_INSTANCE_STATUSES }).notNull().default('starting'),\n // Soft references \u2014 no DB-level FK (SQLite cannot ALTER TABLE ADD CONSTRAINT).\n // Application-layer validation via agentExistsInSignaldockDb (T238).\n sessionId: text('session_id'),\n taskId: text('task_id'),\n startedAt: text('started_at').notNull().default(sql`(datetime('now'))`),\n lastHeartbeat: text('last_heartbeat').notNull().default(sql`(datetime('now'))`),\n stoppedAt: text('stopped_at'),\n errorCount: integer('error_count').notNull().default(0),\n totalTasksCompleted: integer('total_tasks_completed').notNull().default(0),\n capacity: text('capacity').notNull().default('1.0'),\n metadataJson: text('metadata_json').default('{}'),\n parentAgentId: text('parent_agent_id'),\n },\n (table) => [\n index('idx_agent_instances_status').on(table.status),\n index('idx_agent_instances_agent_type').on(table.agentType),\n index('idx_agent_instances_session_id').on(table.sessionId),\n index('idx_agent_instances_task_id').on(table.taskId),\n index('idx_agent_instances_parent_agent_id').on(table.parentAgentId),\n index('idx_agent_instances_last_heartbeat').on(table.lastHeartbeat),\n ],\n);\n\n// ============================================================================\n// Agent Error Log Table\n// ============================================================================\n\nexport const agentErrorLog = sqliteTable(\n 'agent_error_log',\n {\n id: integer('id').primaryKey({ autoIncrement: true }),\n agentId: text('agent_id').notNull(),\n errorType: text('error_type', {\n enum: ['retriable', 'permanent', 'unknown'],\n }).notNull(),\n message: text('message').notNull(),\n stack: text('stack'),\n occurredAt: text('occurred_at').notNull().default(sql`(datetime('now'))`),\n resolved: integer('resolved', { mode: 'boolean' }).notNull().default(false),\n },\n (table) => [\n index('idx_agent_error_log_agent_id').on(table.agentId),\n index('idx_agent_error_log_error_type').on(table.errorType),\n index('idx_agent_error_log_occurred_at').on(table.occurredAt),\n ],\n);\n\n// ============================================================================\n// Type exports\n// ============================================================================\n\nexport type AgentInstanceRow = typeof agentInstances.$inferSelect;\nexport type NewAgentInstanceRow = typeof agentInstances.$inferInsert;\nexport type AgentErrorLogRow = typeof agentErrorLog.$inferSelect;\nexport type NewAgentErrorLogRow = typeof agentErrorLog.$inferInsert;\nexport type AgentInstanceStatus = (typeof AGENT_INSTANCE_STATUSES)[number];\nexport type AgentType = (typeof AGENT_TYPES)[number];\nexport type AgentErrorType = 'retriable' | 'permanent' | 'unknown';\n", "/**\n * Drizzle ORM schema for WarpChain storage in tasks.db.\n *\n * Tables: warp_chains, warp_chain_instances\n * Stores chain definitions and runtime instances bound to epics.\n *\n * @task T5403\n */\n\nimport { sql } from 'drizzle-orm';\nimport { index, integer, sqliteTable, text } from 'drizzle-orm/sqlite-core';\n\n/** Chain instance status values. */\nexport const WARP_CHAIN_INSTANCE_STATUSES = [\n 'pending',\n 'active',\n 'completed',\n 'failed',\n 'cancelled',\n] as const;\n\n// === WARP_CHAINS TABLE ===\n\n/** Stored WarpChain definitions (serialized as JSON). */\nexport const warpChains = sqliteTable(\n 'warp_chains',\n {\n id: text('id').primaryKey(),\n name: text('name').notNull(),\n version: text('version').notNull(),\n description: text('description'),\n definition: text('definition').notNull(), // JSON-serialized WarpChain\n validated: integer('validated', { mode: 'boolean' }).default(false),\n createdAt: text('created_at').default(sql`(datetime('now'))`),\n updatedAt: text('updated_at').default(sql`(datetime('now'))`),\n },\n (table) => [index('idx_warp_chains_name').on(table.name)],\n);\n\n// === WARP_CHAIN_INSTANCES TABLE ===\n\n/** Runtime chain instances bound to epics. */\nexport const warpChainInstances = sqliteTable(\n 'warp_chain_instances',\n {\n id: text('id').primaryKey(),\n chainId: text('chain_id')\n .notNull()\n .references(() => warpChains.id, { onDelete: 'cascade' }),\n epicId: text('epic_id').notNull(),\n variables: text('variables'), // JSON\n stageToTask: text('stage_to_task'), // JSON\n status: text('status').notNull().default('pending'),\n currentStage: text('current_stage'),\n gateResults: text('gate_results'), // JSON array of GateResult\n createdAt: text('created_at').default(sql`(datetime('now'))`),\n updatedAt: text('updated_at').default(sql`(datetime('now'))`),\n },\n (table) => [\n index('idx_warp_instances_chain').on(table.chainId),\n index('idx_warp_instances_epic').on(table.epicId),\n index('idx_warp_instances_status').on(table.status),\n ],\n);\n\n// === TYPE EXPORTS ===\n\nexport type WarpChainRow = typeof warpChains.$inferSelect;\nexport type NewWarpChainRow = typeof warpChains.$inferInsert;\nexport type WarpChainInstanceRow = typeof warpChainInstances.$inferSelect;\nexport type NewWarpChainInstanceRow = typeof warpChainInstances.$inferInsert;\n", "/**\n * Drizzle ORM schema for CLEO tasks.db (SQLite via node:sqlite + sqlite-proxy).\n *\n * Tables: tasks, task_dependencies, task_relations, sessions, task_work_history\n * Archive uses the same tasks table with status = 'archived' + archive metadata.\n *\n * @epic T4454\n * @task W1-T2\n */\n\nimport { sql } from 'drizzle-orm';\nimport {\n type AnySQLiteColumn,\n index,\n integer,\n primaryKey,\n sqliteTable,\n text,\n unique,\n} from 'drizzle-orm/sqlite-core';\nimport {\n ADR_STATUSES,\n GATE_STATUSES,\n LIFECYCLE_PIPELINE_STATUSES,\n LIFECYCLE_STAGE_STATUSES,\n MANIFEST_STATUSES,\n SESSION_STATUSES,\n TASK_STATUSES,\n} from './status-registry.js';\n\nexport type {\n AgentErrorLogRow,\n AgentErrorType,\n AgentInstanceRow,\n AgentInstanceStatus,\n AgentType,\n NewAgentErrorLogRow,\n NewAgentInstanceRow,\n} from '../agents/agent-schema.js';\n// Re-export agent schema tables so drizzle-kit picks them up for migrations.\nexport {\n AGENT_INSTANCE_STATUSES,\n AGENT_TYPES,\n agentErrorLog,\n agentInstances,\n} from '../agents/agent-schema.js';\nexport type {\n NewWarpChainInstanceRow,\n NewWarpChainRow,\n WarpChainInstanceRow,\n WarpChainRow,\n} from './chain-schema.js';\n// Re-export WarpChain schema tables so drizzle-kit picks them up for migrations.\nexport { warpChainInstances, warpChains } from './chain-schema.js';\n\n// Re-export status constants and types so existing imports from schema.ts still work.\nexport {\n ADR_STATUSES,\n type AdrStatus,\n GATE_STATUSES,\n type GateStatus,\n isValidStatus,\n LIFECYCLE_PIPELINE_STATUSES,\n LIFECYCLE_STAGE_STATUSES,\n MANIFEST_STATUSES,\n type ManifestStatus,\n type PipelineStatus,\n SESSION_STATUSES,\n type SessionStatus,\n type StageStatus,\n TASK_STATUSES,\n type TaskStatus,\n} from './status-registry.js';\n\n// === CANONICAL ENUM CONSTANTS (non-status) ===\n\n/** Task priorities matching DB CHECK constraint on tasks.priority. */\nexport const TASK_PRIORITIES = ['critical', 'high', 'medium', 'low'] as const;\n\n/** Task types matching DB CHECK constraint on tasks.type. */\nexport const TASK_TYPES = ['epic', 'task', 'subtask'] as const;\n\n/**\n * Task role axis \u2014 orthogonal to {@link TASK_TYPES}, describes the intent of the\n * work rather than its position in the hierarchy.\n *\n * Added by T944 as an additive second axis so `type` (hierarchy) and `role`\n * (intent) can vary independently. Defaults to `'work'` to preserve existing\n * semantics for the ~948 tasks already in production.\n *\n * @task T944\n */\nexport const TASK_ROLES = ['work', 'research', 'experiment', 'bug', 'spike', 'release'] as const;\n\n/** Union type for {@link TASK_ROLES}. */\nexport type TaskRole = (typeof TASK_ROLES)[number];\n\n/**\n * Task scope axis \u2014 describes the granularity of the work (project-wide vs.\n * feature-scoped vs. unit-scoped). Orthogonal to type and role.\n *\n * Backfill mapping from legacy `type` during migration:\n * - `type='epic'` \u2192 `scope='project'`\n * - `type='task'` \u2192 `scope='feature'` (also used for NULL legacy rows)\n * - `type='subtask'` \u2192 `scope='unit'`\n *\n * @task T944\n */\nexport const TASK_SCOPES = ['project', 'feature', 'unit'] as const;\n\n/** Union type for {@link TASK_SCOPES}. */\nexport type TaskScope = (typeof TASK_SCOPES)[number];\n\n/**\n * Bug severity axis \u2014 ONLY applies when `role='bug'`. Enforced by a composite\n * CHECK constraint (`severity IS NULL OR (severity IN (...) AND role='bug')`).\n *\n * OWNER-WRITE-ONLY (T944 / owner mandate): severity is meant to be set through\n * owner-authenticated paths only, not by Tier 3 agents. This prevents a\n * prompt-injection exploit where a compromised agent could mark a P0 bug as\n * P3 to force-ship.\n *\n * @task T944\n */\nexport const TASK_SEVERITIES = ['P0', 'P1', 'P2', 'P3'] as const;\n\n/** Union type for {@link TASK_SEVERITIES}. */\nexport type TaskSeverity = (typeof TASK_SEVERITIES)[number];\n\n/** Task size values matching DB CHECK constraint on tasks.size. */\nexport const TASK_SIZES = ['small', 'medium', 'large'] as const;\n\n/** Canonical lifecycle stage names matching DB CHECK constraint on lifecycle_stages.stage_name. */\nexport const LIFECYCLE_STAGE_NAMES = [\n 'research',\n 'consensus',\n 'architecture_decision',\n 'specification',\n 'decomposition',\n 'implementation',\n 'validation',\n 'testing',\n 'release',\n 'contribution',\n] as const;\n\n/** Gate result values matching DB CHECK constraint on lifecycle_gate_results.result. */\nexport const LIFECYCLE_GATE_RESULTS = ['pass', 'fail', 'warn'] as const;\n\n/** Evidence type values matching DB CHECK constraint on lifecycle_evidence.type. */\nexport const LIFECYCLE_EVIDENCE_TYPES = ['file', 'url', 'manifest'] as const;\n\n/** Token measurement methods for central token telemetry. */\nexport const TOKEN_USAGE_METHODS = ['otel', 'provider_api', 'tokenizer', 'heuristic'] as const;\n\n/** Confidence levels for token measurements. */\nexport const TOKEN_USAGE_CONFIDENCE = ['real', 'high', 'estimated', 'coarse'] as const;\n\n/** Transport types for token telemetry. */\nexport const TOKEN_USAGE_TRANSPORTS = ['cli', 'api', 'agent', 'unknown'] as const;\n\n/** Task relation types matching DB CHECK constraint on task_relations.relation_type. */\nexport const TASK_RELATION_TYPES = [\n 'related',\n 'blocks',\n 'duplicates',\n 'absorbs',\n 'fixes',\n 'extends',\n 'supersedes',\n] as const;\n\n/** Lifecycle transition types matching DB CHECK constraint on lifecycle_transitions.transition_type. */\nexport const LIFECYCLE_TRANSITION_TYPES = ['automatic', 'manual', 'forced'] as const;\n\n/** External task link types matching DB constraint on external_task_links.link_type. */\nexport const EXTERNAL_LINK_TYPES = ['created', 'matched', 'manual', 'transferred'] as const;\n\n/** Sync direction types matching DB constraint on external_task_links.sync_direction. */\nexport const SYNC_DIRECTIONS = ['inbound', 'outbound', 'bidirectional'] as const;\n\n// === TASKS TABLE ===\n\nexport const tasks = sqliteTable(\n 'tasks',\n {\n id: text('id').primaryKey(),\n title: text('title').notNull(),\n description: text('description'),\n status: text('status', {\n enum: TASK_STATUSES,\n })\n .notNull()\n .default('pending'),\n priority: text('priority', {\n enum: TASK_PRIORITIES,\n })\n .notNull()\n .default('medium'),\n type: text('type', { enum: TASK_TYPES }),\n /**\n * Task role axis \u2014 orthogonal to `type`. Defaults to `'work'`.\n * See {@link TASK_ROLES}. Added by T944.\n */\n role: text('role', { enum: TASK_ROLES }).notNull().default('work'),\n /**\n * Task scope axis \u2014 granularity of the work. Defaults to `'feature'`.\n * See {@link TASK_SCOPES}. Added by T944.\n */\n scope: text('scope', { enum: TASK_SCOPES }).notNull().default('feature'),\n /**\n * Bug severity. ONLY valid when `role='bug'`. NULL otherwise.\n * OWNER-WRITE-ONLY. See {@link TASK_SEVERITIES}. Added by T944.\n */\n severity: text('severity', { enum: TASK_SEVERITIES }),\n parentId: text('parent_id').references((): AnySQLiteColumn => tasks.id, {\n onDelete: 'set null',\n }),\n phase: text('phase'),\n size: text('size', { enum: TASK_SIZES }),\n position: integer('position'),\n positionVersion: integer('position_version').default(0),\n\n // JSON-serialized complex fields (avoids excessive normalization)\n labelsJson: text('labels_json').default('[]'),\n notesJson: text('notes_json').default('[]'),\n acceptanceJson: text('acceptance_json').default('[]'),\n filesJson: text('files_json').default('[]'),\n\n // Provenance\n origin: text('origin'),\n blockedBy: text('blocked_by'),\n epicLifecycle: text('epic_lifecycle'),\n noAutoComplete: integer('no_auto_complete', { mode: 'boolean' }),\n\n // Timestamps\n createdAt: text('created_at').notNull().default(sql`(datetime('now'))`),\n updatedAt: text('updated_at'),\n completedAt: text('completed_at'),\n cancelledAt: text('cancelled_at'),\n cancellationReason: text('cancellation_reason'),\n\n // Archive metadata (populated when status = 'archived')\n archivedAt: text('archived_at'),\n archiveReason: text('archive_reason'),\n cycleTimeDays: integer('cycle_time_days'),\n\n // Verification (JSON-serialized)\n verificationJson: text('verification_json'),\n\n // Provenance tracking\n createdBy: text('created_by'),\n modifiedBy: text('modified_by'),\n sessionId: text('session_id').references((): AnySQLiteColumn => sessions.id, {\n onDelete: 'set null',\n }),\n // T060: pipeline stage name (RCASD-IVTR+C). Stored as a plain stage name string.\n // Not referencing lifecycle_stages.id so that stage binding works without\n // requiring a lifecycle pipeline record for every task.\n pipelineStage: text('pipeline_stage'),\n /** Agent ID that has claimed/is assigned to this task. */\n assignee: text('assignee'),\n // IVTR orchestration state \u2014 nullable JSON blob. NULL = no loop started. @task T811\n ivtrState: text('ivtr_state'),\n },\n (table) => [\n index('idx_tasks_status').on(table.status),\n index('idx_tasks_parent_id').on(table.parentId),\n index('idx_tasks_phase').on(table.phase),\n index('idx_tasks_type').on(table.type),\n index('idx_tasks_priority').on(table.priority),\n index('idx_tasks_session_id').on(table.sessionId),\n index('idx_tasks_pipeline_stage').on(table.pipelineStage),\n index('idx_tasks_assignee').on(table.assignee),\n // T033 composite indexes\n index('idx_tasks_parent_status').on(table.parentId, table.status),\n index('idx_tasks_status_priority').on(table.status, table.priority),\n index('idx_tasks_type_phase').on(table.type, table.phase),\n index('idx_tasks_status_archive_reason').on(table.status, table.archiveReason),\n // T944 role/scope axes\n index('idx_tasks_role').on(table.role),\n index('idx_tasks_scope').on(table.scope),\n index('idx_tasks_role_status').on(table.role, table.status),\n ],\n);\n\n// === TASK DEPENDENCIES ===\n\nexport const taskDependencies = sqliteTable(\n 'task_dependencies',\n {\n taskId: text('task_id')\n .notNull()\n .references(() => tasks.id, { onDelete: 'cascade' }),\n dependsOn: text('depends_on')\n .notNull()\n .references(() => tasks.id, { onDelete: 'cascade' }),\n },\n (table) => [\n primaryKey({ columns: [table.taskId, table.dependsOn] }),\n index('idx_deps_depends_on').on(table.dependsOn),\n ],\n);\n\n// === TASK RELATIONS ===\n\nexport const taskRelations = sqliteTable(\n 'task_relations',\n {\n taskId: text('task_id')\n .notNull()\n .references(() => tasks.id, { onDelete: 'cascade' }),\n relatedTo: text('related_to')\n .notNull()\n .references(() => tasks.id, { onDelete: 'cascade' }),\n relationType: text('relation_type', {\n enum: TASK_RELATION_TYPES,\n })\n .notNull()\n .default('related'),\n reason: text('reason'),\n },\n (table) => [\n primaryKey({ columns: [table.taskId, table.relatedTo] }),\n index('idx_task_relations_related_to').on(table.relatedTo),\n ],\n);\n\n// === SESSIONS ===\n\nexport const sessions = sqliteTable(\n 'sessions',\n {\n id: text('id').primaryKey(),\n name: text('name').notNull(),\n status: text('status', {\n enum: SESSION_STATUSES,\n })\n .notNull()\n .default('active'),\n scopeJson: text('scope_json').notNull().default('{}'),\n currentTask: text('current_task').references((): AnySQLiteColumn => tasks.id, {\n onDelete: 'set null',\n }),\n taskStartedAt: text('task_started_at'),\n agent: text('agent'),\n notesJson: text('notes_json').default('[]'),\n tasksCompletedJson: text('tasks_completed_json').default('[]'),\n tasksCreatedJson: text('tasks_created_json').default('[]'),\n handoffJson: text('handoff_json'),\n startedAt: text('started_at').notNull().default(sql`(datetime('now'))`),\n endedAt: text('ended_at'),\n // Session chain columns (T4959)\n previousSessionId: text('previous_session_id').references((): AnySQLiteColumn => sessions.id, {\n onDelete: 'set null',\n }),\n nextSessionId: text('next_session_id').references((): AnySQLiteColumn => sessions.id, {\n onDelete: 'set null',\n }),\n agentIdentifier: text('agent_identifier'),\n handoffConsumedAt: text('handoff_consumed_at'),\n handoffConsumedBy: text('handoff_consumed_by'),\n debriefJson: text('debrief_json'),\n // Provider adapter tracking (T5240)\n providerId: text('provider_id'),\n // Session stats columns (type unification)\n statsJson: text('stats_json'),\n resumeCount: integer('resume_count'),\n gradeMode: integer('grade_mode'),\n },\n (table) => [\n index('idx_sessions_status').on(table.status),\n index('idx_sessions_previous').on(table.previousSessionId),\n index('idx_sessions_agent_identifier').on(table.agentIdentifier),\n index('idx_sessions_started_at').on(table.startedAt),\n // T033 composite index: getActiveSession hot path\n index('idx_sessions_status_started_at').on(table.status, table.startedAt),\n ],\n);\n\n// === TASK WORK HISTORY ===\n\nexport const taskWorkHistory = sqliteTable(\n 'task_work_history',\n {\n id: integer('id').primaryKey({ autoIncrement: true }),\n sessionId: text('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n taskId: text('task_id')\n .notNull()\n .references(() => tasks.id, { onDelete: 'cascade' }),\n setAt: text('set_at').notNull().default(sql`(datetime('now'))`),\n clearedAt: text('cleared_at'),\n },\n (table) => [index('idx_work_history_session').on(table.sessionId)],\n);\n\n// === LIFECYCLE PIPELINES ===\n\nexport const lifecyclePipelines = sqliteTable(\n 'lifecycle_pipelines',\n {\n id: text('id').primaryKey(),\n taskId: text('task_id')\n .notNull()\n .references(() => tasks.id, { onDelete: 'cascade' }),\n status: text('status', {\n enum: LIFECYCLE_PIPELINE_STATUSES,\n })\n .notNull()\n .default('active'),\n currentStageId: text('current_stage_id'),\n startedAt: text('started_at').notNull().default(sql`(datetime('now'))`),\n completedAt: text('completed_at'),\n updatedAt: text('updated_at').default(sql`(datetime('now'))`),\n version: integer('version').notNull().default(1),\n },\n (table) => [\n index('idx_lifecycle_pipelines_task_id').on(table.taskId),\n index('idx_lifecycle_pipelines_status').on(table.status),\n ],\n);\n\n// === LIFECYCLE STAGES ===\n\nexport const lifecycleStages = sqliteTable(\n 'lifecycle_stages',\n {\n id: text('id').primaryKey(),\n pipelineId: text('pipeline_id')\n .notNull()\n .references(() => lifecyclePipelines.id, { onDelete: 'cascade' }),\n stageName: text('stage_name', { enum: LIFECYCLE_STAGE_NAMES }).notNull(),\n status: text('status', {\n enum: LIFECYCLE_STAGE_STATUSES,\n })\n .notNull()\n .default('not_started'),\n sequence: integer('sequence').notNull(),\n startedAt: text('started_at'),\n completedAt: text('completed_at'),\n blockedAt: text('blocked_at'),\n blockReason: text('block_reason'),\n skippedAt: text('skipped_at'),\n skipReason: text('skip_reason'),\n notesJson: text('notes_json').default('[]'),\n metadataJson: text('metadata_json').default('{}'),\n // RCASD provenance tracking columns (T5100)\n outputFile: text('output_file'),\n createdBy: text('created_by'),\n validatedBy: text('validated_by'),\n validatedAt: text('validated_at'),\n validationStatus: text('validation_status', {\n enum: ['pending', 'in_review', 'approved', 'rejected', 'needs_revision'],\n }),\n provenanceChainJson: text('provenance_chain_json'),\n },\n (table) => [\n index('idx_lifecycle_stages_pipeline_id').on(table.pipelineId),\n index('idx_lifecycle_stages_stage_name').on(table.stageName),\n index('idx_lifecycle_stages_status').on(table.status),\n index('idx_lifecycle_stages_validated_by').on(table.validatedBy),\n ],\n);\n\n// === LIFECYCLE GATE RESULTS ===\n\nexport const lifecycleGateResults = sqliteTable(\n 'lifecycle_gate_results',\n {\n id: text('id').primaryKey(),\n stageId: text('stage_id')\n .notNull()\n .references(() => lifecycleStages.id, { onDelete: 'cascade' }),\n gateName: text('gate_name').notNull(),\n result: text('result', {\n enum: LIFECYCLE_GATE_RESULTS,\n }).notNull(),\n checkedAt: text('checked_at').notNull().default(sql`(datetime('now'))`),\n checkedBy: text('checked_by').notNull(),\n details: text('details'),\n reason: text('reason'),\n },\n (table) => [index('idx_lifecycle_gate_results_stage_id').on(table.stageId)],\n);\n\n// === LIFECYCLE EVIDENCE ===\n\nexport const lifecycleEvidence = sqliteTable(\n 'lifecycle_evidence',\n {\n id: text('id').primaryKey(),\n stageId: text('stage_id')\n .notNull()\n .references(() => lifecycleStages.id, { onDelete: 'cascade' }),\n uri: text('uri').notNull(),\n type: text('type', {\n enum: LIFECYCLE_EVIDENCE_TYPES,\n }).notNull(),\n recordedAt: text('recorded_at').notNull().default(sql`(datetime('now'))`),\n recordedBy: text('recorded_by'),\n description: text('description'),\n },\n (table) => [index('idx_lifecycle_evidence_stage_id').on(table.stageId)],\n);\n\n// === LIFECYCLE TRANSITIONS ===\n\nexport const lifecycleTransitions = sqliteTable(\n 'lifecycle_transitions',\n {\n id: text('id').primaryKey(),\n pipelineId: text('pipeline_id')\n .notNull()\n .references(() => lifecyclePipelines.id, { onDelete: 'cascade' }),\n fromStageId: text('from_stage_id')\n .notNull()\n .references(() => lifecycleStages.id, { onDelete: 'cascade' }),\n toStageId: text('to_stage_id')\n .notNull()\n .references(() => lifecycleStages.id, { onDelete: 'cascade' }),\n transitionType: text('transition_type', {\n enum: LIFECYCLE_TRANSITION_TYPES,\n })\n .notNull()\n .default('automatic'),\n transitionedBy: text('transitioned_by'),\n createdAt: text('created_at').notNull().default(sql`(datetime('now'))`),\n },\n (table) => [index('idx_lifecycle_transitions_pipeline_id').on(table.pipelineId)],\n);\n\n// === MANIFEST ENTRIES (RCASD provenance \u2014 T5100) ===\n\nexport const manifestEntries = sqliteTable(\n 'manifest_entries',\n {\n id: text('id').primaryKey(),\n pipelineId: text('pipeline_id').references(() => lifecyclePipelines.id, {\n onDelete: 'cascade',\n }),\n stageId: text('stage_id').references(() => lifecycleStages.id, { onDelete: 'cascade' }),\n title: text('title').notNull(),\n date: text('date').notNull(),\n status: text('status', { enum: MANIFEST_STATUSES }).notNull(),\n agentType: text('agent_type'),\n outputFile: text('output_file'),\n topicsJson: text('topics_json').default('[]'),\n findingsJson: text('findings_json').default('[]'),\n linkedTasksJson: text('linked_tasks_json').default('[]'),\n createdBy: text('created_by'),\n createdAt: text('created_at').notNull().default(sql`(datetime('now'))`),\n },\n (table) => [\n index('idx_manifest_entries_pipeline_id').on(table.pipelineId),\n index('idx_manifest_entries_stage_id').on(table.stageId),\n index('idx_manifest_entries_status').on(table.status),\n ],\n);\n\n// === PIPELINE MANIFEST (T5581) ===\n\nexport const pipelineManifest = sqliteTable(\n 'pipeline_manifest',\n {\n id: text('id').primaryKey(),\n sessionId: text('session_id').references(() => sessions.id, { onDelete: 'set null' }),\n taskId: text('task_id').references(() => tasks.id, { onDelete: 'set null' }),\n epicId: text('epic_id').references(() => tasks.id, { onDelete: 'set null' }),\n type: text('type').notNull(),\n content: text('content').notNull(),\n contentHash: text('content_hash'),\n status: text('status').notNull().default('active'),\n distilled: integer('distilled', { mode: 'boolean' }).notNull().default(false),\n brainObsId: text('brain_obs_id'),\n sourceFile: text('source_file'),\n metadataJson: text('metadata_json'),\n createdAt: text('created_at').notNull(),\n archivedAt: text('archived_at'),\n },\n (table) => [\n index('idx_pipeline_manifest_task_id').on(table.taskId),\n index('idx_pipeline_manifest_session_id').on(table.sessionId),\n index('idx_pipeline_manifest_distilled').on(table.distilled),\n index('idx_pipeline_manifest_status').on(table.status),\n index('idx_pipeline_manifest_content_hash').on(table.contentHash),\n ],\n);\n\n// === RELEASE MANIFESTS (T5580) ===\n\nexport const releaseManifests = sqliteTable(\n 'release_manifests',\n {\n id: text('id').primaryKey(),\n version: text('version').notNull().unique(),\n status: text('status').notNull().default('draft'),\n pipelineId: text('pipeline_id').references(() => lifecyclePipelines.id, {\n onDelete: 'set null',\n }),\n epicId: text('epic_id').references(() => tasks.id, { onDelete: 'set null' }),\n tasksJson: text('tasks_json').notNull().default('[]'),\n changelog: text('changelog'),\n notes: text('notes'),\n previousVersion: text('previous_version'),\n commitSha: text('commit_sha'),\n gitTag: text('git_tag'),\n npmDistTag: text('npm_dist_tag'),\n createdAt: text('created_at').notNull(),\n preparedAt: text('prepared_at'),\n committedAt: text('committed_at'),\n taggedAt: text('tagged_at'),\n pushedAt: text('pushed_at'),\n },\n (table) => [\n index('idx_release_manifests_status').on(table.status),\n index('idx_release_manifests_version').on(table.version),\n ],\n);\n\n// === SCHEMA METADATA ===\n\nexport const schemaMeta = sqliteTable('schema_meta', {\n key: text('key').primaryKey(),\n value: text('value').notNull(),\n});\n\n// === AUDIT LOG ===\n\n/**\n * Task change audit log \u2014 stores every add/update/complete/delete/archive operation.\n * Migrated from legacy JSONL task logs to SQLite per ADR-006/ADR-012.\n * No FK on taskId \u2014 log entries must survive task deletion.\n *\n * @task T4837\n */\nexport const auditLog = sqliteTable(\n 'audit_log',\n {\n id: text('id').primaryKey(),\n timestamp: text('timestamp').notNull().default(sql`(datetime('now'))`),\n action: text('action').notNull(),\n taskId: text('task_id').notNull(),\n actor: text('actor').notNull().default('system'),\n detailsJson: text('details_json').default('{}'),\n beforeJson: text('before_json'),\n afterJson: text('after_json'),\n // Dispatch layer columns (migration 20260225200000_audit-log-dispatch-columns)\n domain: text('domain'),\n operation: text('operation'),\n sessionId: text('session_id'),\n requestId: text('request_id'),\n durationMs: integer('duration_ms'),\n success: integer('success'),\n source: text('source'),\n gateway: text('gateway'),\n errorMessage: text('error_message'),\n // Project correlation (T5334)\n projectHash: text('project_hash'),\n },\n (table) => [\n index('idx_audit_log_task_id').on(table.taskId),\n index('idx_audit_log_action').on(table.action),\n index('idx_audit_log_timestamp').on(table.timestamp),\n index('idx_audit_log_domain').on(table.domain),\n index('idx_audit_log_request_id').on(table.requestId),\n index('idx_audit_log_project_hash').on(table.projectHash),\n index('idx_audit_log_actor').on(table.actor),\n // T033 composite indexes\n index('idx_audit_log_session_timestamp').on(table.sessionId, table.timestamp),\n index('idx_audit_log_domain_operation').on(table.domain, table.operation),\n ],\n);\n\n// === TOKEN USAGE ===\n\n/**\n * Central provider-aware token telemetry for CLI and external adapters.\n * Stores measured request/response token counts plus method/confidence metadata.\n */\nexport const tokenUsage = sqliteTable(\n 'token_usage',\n {\n id: text('id').primaryKey(),\n createdAt: text('created_at').notNull().default(sql`(datetime('now'))`),\n provider: text('provider').notNull().default('unknown'),\n model: text('model'),\n transport: text('transport', { enum: TOKEN_USAGE_TRANSPORTS }).notNull().default('unknown'),\n gateway: text('gateway'),\n domain: text('domain'),\n operation: text('operation'),\n sessionId: text('session_id').references(() => sessions.id, { onDelete: 'set null' }),\n taskId: text('task_id').references(() => tasks.id, { onDelete: 'set null' }),\n requestId: text('request_id'),\n inputChars: integer('input_chars').notNull().default(0),\n outputChars: integer('output_chars').notNull().default(0),\n inputTokens: integer('input_tokens').notNull().default(0),\n outputTokens: integer('output_tokens').notNull().default(0),\n totalTokens: integer('total_tokens').notNull().default(0),\n method: text('method', { enum: TOKEN_USAGE_METHODS }).notNull().default('heuristic'),\n confidence: text('confidence', { enum: TOKEN_USAGE_CONFIDENCE }).notNull().default('coarse'),\n requestHash: text('request_hash'),\n responseHash: text('response_hash'),\n metadataJson: text('metadata_json').notNull().default('{}'),\n },\n (table) => [\n index('idx_token_usage_created_at').on(table.createdAt),\n index('idx_token_usage_request_id').on(table.requestId),\n index('idx_token_usage_session_id').on(table.sessionId),\n index('idx_token_usage_task_id').on(table.taskId),\n index('idx_token_usage_provider').on(table.provider),\n index('idx_token_usage_transport').on(table.transport),\n index('idx_token_usage_domain_operation').on(table.domain, table.operation),\n index('idx_token_usage_method').on(table.method),\n index('idx_token_usage_gateway').on(table.gateway),\n ],\n);\n\n// === ARCHITECTURE DECISIONS ===\n\n/**\n * Architecture Decision Records (ADRs) stored in the database.\n * Corresponds to the physical ADR markdown files in .cleo/adrs/.\n * Self-referential FKs (supersedes_id, superseded_by_id, amends_id) are\n * enforced at the DB level by T033 migration.\n */\nexport const architectureDecisions = sqliteTable(\n 'architecture_decisions',\n {\n id: text('id').primaryKey(),\n title: text('title').notNull(),\n status: text('status', { enum: ADR_STATUSES }).notNull().default('proposed'),\n supersedesId: text('supersedes_id').references(\n (): AnySQLiteColumn => architectureDecisions.id,\n { onDelete: 'set null' },\n ),\n supersededById: text('superseded_by_id').references(\n (): AnySQLiteColumn => architectureDecisions.id,\n { onDelete: 'set null' },\n ),\n consensusManifestId: text('consensus_manifest_id').references(\n (): AnySQLiteColumn => manifestEntries.id,\n { onDelete: 'set null' },\n ),\n content: text('content').notNull(),\n createdAt: text('created_at').notNull().default(sql`(datetime('now'))`),\n updatedAt: text('updated_at'),\n // ADR-017 \u00A75.3 extension columns\n date: text('date').notNull().default(''),\n acceptedAt: text('accepted_at'),\n gate: text('gate', { enum: ['HITL', 'automated'] }),\n gateStatus: text('gate_status', { enum: GATE_STATUSES }),\n amendsId: text('amends_id').references((): AnySQLiteColumn => architectureDecisions.id, {\n onDelete: 'set null',\n }),\n filePath: text('file_path').notNull().default(''),\n // ADR-017 \u00A75.4 cognitive search columns (T4942)\n summary: text('summary'),\n keywords: text('keywords'),\n topics: text('topics'),\n },\n (table) => [\n index('idx_arch_decisions_status').on(table.status),\n index('idx_arch_decisions_amends_id').on(table.amendsId),\n ],\n);\n\n// === ADR JUNCTION TABLES (ADR-017 \u00A75.3) ===\n\n/** ADR-to-Task links (soft FK \u2014 tasks can be purged) */\nexport const adrTaskLinks = sqliteTable(\n 'adr_task_links',\n {\n adrId: text('adr_id')\n .notNull()\n .references(() => architectureDecisions.id, { onDelete: 'cascade' }),\n taskId: text('task_id')\n .notNull()\n .references(() => tasks.id, { onDelete: 'cascade' }),\n linkType: text('link_type', {\n enum: ['related', 'governed_by', 'implements'],\n })\n .notNull()\n .default('related'),\n },\n (table) => [\n primaryKey({ columns: [table.adrId, table.taskId] }),\n index('idx_adr_task_links_task_id').on(table.taskId),\n ],\n);\n\n/** ADR cross-reference relationships */\nexport const adrRelations = sqliteTable(\n 'adr_relations',\n {\n fromAdrId: text('from_adr_id')\n .notNull()\n .references(() => architectureDecisions.id, { onDelete: 'cascade' }),\n toAdrId: text('to_adr_id')\n .notNull()\n .references(() => architectureDecisions.id, { onDelete: 'cascade' }),\n relationType: text('relation_type', {\n enum: ['supersedes', 'amends', 'related'],\n }).notNull(),\n },\n (table) => [primaryKey({ columns: [table.fromAdrId, table.toAdrId, table.relationType] })],\n);\n\n// === EXTERNAL TASK LINKS (provider-agnostic task reconciliation) ===\n\n/**\n * Tracks links between CLEO tasks and external system tasks (Linear, Jira, GitHub, etc.).\n * Used by the reconciliation engine to match external tasks to existing CLEO tasks,\n * detect updates, and maintain bidirectional traceability.\n *\n * Each row represents one link: one CLEO task \u2194 one external task from one provider.\n * A CLEO task MAY have links from multiple providers (e.g., both Linear and GitHub).\n * An external task SHOULD have at most one link per provider.\n */\nexport const externalTaskLinks = sqliteTable(\n 'external_task_links',\n {\n id: text('id').primaryKey(),\n taskId: text('task_id')\n .notNull()\n .references(() => tasks.id, { onDelete: 'cascade' }),\n /** Provider identifier (e.g. 'linear', 'jira', 'github', 'gitlab'). */\n providerId: text('provider_id').notNull(),\n /** Provider-assigned identifier for the external task (opaque to CLEO). */\n externalId: text('external_id').notNull(),\n /** Optional URL to the external task (for human navigation). */\n externalUrl: text('external_url'),\n /** Title of the external task at the time of last sync. */\n externalTitle: text('external_title'),\n /** How this link was established. */\n linkType: text('link_type', {\n enum: EXTERNAL_LINK_TYPES,\n }).notNull(),\n /** Direction of the sync that created this link. */\n syncDirection: text('sync_direction', {\n enum: SYNC_DIRECTIONS,\n })\n .notNull()\n .default('inbound'),\n /** Arbitrary provider-specific metadata (JSON). */\n metadataJson: text('metadata_json').default('{}'),\n /** When the link was first established. */\n linkedAt: text('linked_at').notNull().default(sql`(datetime('now'))`),\n /** When the external task was last synchronized. */\n lastSyncAt: text('last_sync_at'),\n },\n (table) => [\n index('idx_ext_links_task_id').on(table.taskId),\n index('idx_ext_links_provider_external').on(table.providerId, table.externalId),\n index('idx_ext_links_provider_id').on(table.providerId),\n unique('uq_ext_links_task_provider_external').on(\n table.taskId,\n table.providerId,\n table.externalId,\n ),\n ],\n);\n\n// === BACKGROUND JOBS (T641) ===\n\n/**\n * Background job status enum values.\n *\n * - `pending` \u2013 queued but not yet executing\n * - `running` \u2013 actively executing in this process\n * - `complete` \u2013 finished successfully\n * - `failed` \u2013 finished with an error\n * - `cancelled` \u2013 explicitly cancelled by a caller\n * - `orphaned` \u2013 was `running` when the process exited; requires human/agent review\n */\nexport const BACKGROUND_JOB_STATUSES = [\n 'pending',\n 'running',\n 'complete',\n 'failed',\n 'cancelled',\n 'orphaned',\n] as const;\n\n/** Union type for {@link BACKGROUND_JOB_STATUSES}. */\nexport type BackgroundJobStatus = (typeof BACKGROUND_JOB_STATUSES)[number];\n\n/**\n * Durable background job row stored in tasks.db.\n *\n * Jobs survive process restart; any row with `status='running'` at startup\n * is transitioned to `status='orphaned'` so humans/agents can triage them.\n *\n * Timestamps are stored as INTEGER milliseconds-since-epoch to allow\n * range queries without string parsing.\n *\n * @task T641\n */\nexport const backgroundJobs = sqliteTable(\n 'background_jobs',\n {\n /** Unique job identifier (UUID v4). */\n id: text('id').primaryKey(),\n /** Operation name, e.g. \"nexus.analyze\" or \"tasks.sync.reconcile\". */\n operation: text('operation').notNull(),\n /** Current lifecycle status. */\n status: text('status', { enum: BACKGROUND_JOB_STATUSES }).notNull().default('pending'),\n /** When the job was created (ms epoch). */\n startedAt: integer('started_at').notNull(),\n /** When the job finished (ms epoch); NULL while running. */\n completedAt: integer('completed_at'),\n /** JSON-serialised result payload; NULL on failure or while running. */\n result: text('result'),\n /** Human-readable error message; NULL on success or while running. */\n error: text('error'),\n /** Execution progress 0-100; NULL until progress is reported. */\n progress: integer('progress'),\n /** Last heartbeat timestamp (ms epoch). */\n heartbeatAt: integer('heartbeat_at').notNull(),\n /** Agent or session ID that claimed this job; NULL if unclaimed. */\n claimedBy: text('claimed_by'),\n },\n (table) => [\n index('idx_background_jobs_status').on(table.status),\n index('idx_background_jobs_operation').on(table.operation),\n index('idx_background_jobs_claimed_by').on(table.claimedBy),\n index('idx_background_jobs_started_at').on(table.startedAt),\n ],\n);\n\nexport type BackgroundJobRow = typeof backgroundJobs.$inferSelect;\nexport type NewBackgroundJobRow = typeof backgroundJobs.$inferInsert;\n\n// === STATUS REGISTRY (ADR-018) ===\n\nexport const statusRegistryTable = sqliteTable(\n 'status_registry',\n {\n name: text('name').notNull(),\n entityType: text('entity_type', {\n enum: ['task', 'session', 'lifecycle_pipeline', 'lifecycle_stage', 'adr', 'gate', 'manifest'],\n }).notNull(),\n namespace: text('namespace', { enum: ['workflow', 'governance', 'manifest'] }).notNull(),\n description: text('description').notNull(),\n isTerminal: integer('is_terminal', { mode: 'boolean' }).notNull().default(false),\n },\n (table) => [\n primaryKey({ columns: [table.name, table.entityType] }),\n index('idx_status_registry_entity_type').on(table.entityType),\n index('idx_status_registry_namespace').on(table.namespace),\n ],\n);\n\nexport type StatusRegistryRow = typeof statusRegistryTable.$inferSelect;\n\n// === Attachment Storage ===\n\nconst ATTACHMENT_OWNER_TYPES = [\n 'task',\n 'observation',\n 'session',\n 'decision',\n 'learning',\n 'pattern',\n] as const;\n\n/**\n * Registry of stored attachments (blob content).\n *\n * Storage path: `.cleo/attachments/sha256/<sha256[0..2]>/<sha256[2..]>.<ext>`\n *\n * @epic T760\n * @task T796\n */\nexport const attachments = sqliteTable(\n 'attachments',\n {\n /** Unique attachment identifier (UUID v4). */\n id: text('id').primaryKey(),\n /** SHA-256 hex digest of the uncompressed content. Unique across the registry. */\n sha256: text('sha256').notNull().unique(),\n /** Serialised `Attachment` discriminated union (all kind-specific fields). */\n attachmentJson: text('attachment_json').notNull(),\n /** ISO 8601 timestamp when this attachment was first registered. */\n createdAt: text('created_at').notNull(),\n /**\n * How many `attachment_refs` rows point at this attachment.\n *\n * When `ref_count` drops to zero the blob is eligible for GC.\n * Blobs are NEVER auto-deleted \u2014 use `cleo docs attachments gc`.\n */\n refCount: integer('ref_count').notNull().default(0),\n },\n (table) => [index('idx_attachments_sha256').on(table.sha256)],\n);\n\n/**\n * Ref-counted junction table linking attachments to owner entities.\n *\n * A single attachment can be referenced by multiple owners simultaneously\n * (e.g., the same RFC PDF attached to an epic task AND to every child task).\n * Deleting a ref decrements `attachments.ref_count`; when `ref_count` reaches\n * zero the blob file may be purged.\n *\n * @epic T760\n * @task T796\n */\nexport const attachmentRefs = sqliteTable(\n 'attachment_refs',\n {\n /** ID of the attachment (\u2192 `attachments.id`). */\n attachmentId: text('attachment_id').notNull(),\n /**\n * The domain entity type that owns this ref.\n *\n * Restricted to the six supported CLEO entity types.\n */\n ownerType: text('owner_type', { enum: ATTACHMENT_OWNER_TYPES }).notNull(),\n /** The ID of the owning entity (e.g., `\"T766\"`, `\"O-abc123\"`, `\"ses_...\"`). */\n ownerId: text('owner_id').notNull(),\n /** ISO 8601 timestamp when this ref was created. */\n attachedAt: text('attached_at').notNull(),\n /**\n * Agent identity (or `\"human\"`) that created this ref.\n *\n * Optional; populated from the active session credential when available.\n */\n attachedBy: text('attached_by'),\n },\n (table) => [\n primaryKey({ columns: [table.attachmentId, table.ownerType, table.ownerId] }),\n index('idx_attachment_refs_attachment_id').on(table.attachmentId),\n index('idx_attachment_refs_owner').on(table.ownerType, table.ownerId),\n ],\n);\n\n// === EXPERIMENTS SIDE-TABLE (T944) ===\n\n/**\n * Experiment metadata side-table, keyed 1:1 to `tasks.id` for rows where\n * `tasks.role='experiment'`.\n *\n * Tracks sandbox/branch state and metrics delta for experimental work so the\n * main `tasks` table stays clean and sparse. Cascades on task deletion.\n *\n * @task T944\n */\nexport const experiments = sqliteTable(\n 'experiments',\n {\n /** Owning task ID. Primary key + cascade FK to {@link tasks}. */\n taskId: text('task_id')\n .primaryKey()\n .references(() => tasks.id, { onDelete: 'cascade' }),\n /** Git branch used as the experiment sandbox (nullable until created). */\n sandboxBranch: text('sandbox_branch'),\n /** Baseline commit SHA the experiment forked from. */\n baselineCommit: text('baseline_commit'),\n /** ISO 8601 timestamp when the experiment merged back (null = open). */\n mergedAt: text('merged_at'),\n /** Optional receipt ID linking to an audit/receipt record. */\n receiptId: text('receipt_id'),\n /** JSON-serialised metrics delta between baseline and experiment. */\n metricsDeltaJson: text('metrics_delta_json'),\n /** ISO 8601 timestamp of row creation. */\n createdAt: text('created_at')\n .notNull()\n .$defaultFn(() => new Date().toISOString()),\n /** ISO 8601 timestamp of last update. */\n updatedAt: text('updated_at')\n .notNull()\n .$defaultFn(() => new Date().toISOString()),\n },\n (table) => [index('idx_experiments_merged').on(table.mergedAt)],\n);\n\n// === TYPE EXPORTS ===\n\nexport type AttachmentRow = typeof attachments.$inferSelect;\nexport type NewAttachmentRow = typeof attachments.$inferInsert;\nexport type AttachmentRefRow = typeof attachmentRefs.$inferSelect;\nexport type NewAttachmentRefRow = typeof attachmentRefs.$inferInsert;\nexport type TaskRow = typeof tasks.$inferSelect;\nexport type NewTaskRow = typeof tasks.$inferInsert;\nexport type SessionRow = typeof sessions.$inferSelect;\nexport type NewSessionRow = typeof sessions.$inferInsert;\nexport type TaskDependencyRow = typeof taskDependencies.$inferSelect;\nexport type TaskRelationRow = typeof taskRelations.$inferSelect;\nexport type WorkHistoryRow = typeof taskWorkHistory.$inferSelect;\nexport type LifecyclePipelineRow = typeof lifecyclePipelines.$inferSelect;\nexport type NewLifecyclePipelineRow = typeof lifecyclePipelines.$inferInsert;\nexport type LifecycleStageRow = typeof lifecycleStages.$inferSelect;\nexport type NewLifecycleStageRow = typeof lifecycleStages.$inferInsert;\nexport type LifecycleGateResultRow = typeof lifecycleGateResults.$inferSelect;\nexport type NewLifecycleGateResultRow = typeof lifecycleGateResults.$inferInsert;\nexport type LifecycleEvidenceRow = typeof lifecycleEvidence.$inferSelect;\nexport type NewLifecycleEvidenceRow = typeof lifecycleEvidence.$inferInsert;\nexport type LifecycleTransitionRow = typeof lifecycleTransitions.$inferSelect;\nexport type NewLifecycleTransitionRow = typeof lifecycleTransitions.$inferInsert;\nexport type AuditLogRow = typeof auditLog.$inferSelect;\nexport type NewAuditLogRow = typeof auditLog.$inferInsert;\nexport type TokenUsageRow = typeof tokenUsage.$inferSelect;\nexport type NewTokenUsageRow = typeof tokenUsage.$inferInsert;\nexport type ArchitectureDecisionRow = typeof architectureDecisions.$inferSelect;\nexport type NewArchitectureDecisionRow = typeof architectureDecisions.$inferInsert;\nexport type AdrTaskLinkRow = typeof adrTaskLinks.$inferSelect;\nexport type NewAdrTaskLinkRow = typeof adrTaskLinks.$inferInsert;\nexport type AdrRelationRow = typeof adrRelations.$inferSelect;\nexport type NewAdrRelationRow = typeof adrRelations.$inferInsert;\nexport type ManifestEntryRow = typeof manifestEntries.$inferSelect;\nexport type NewManifestEntryRow = typeof manifestEntries.$inferInsert;\nexport type PipelineManifestRow = typeof pipelineManifest.$inferSelect;\nexport type NewPipelineManifestRow = typeof pipelineManifest.$inferInsert;\nexport type ReleaseManifestRow = typeof releaseManifests.$inferSelect;\nexport type NewReleaseManifestRow = typeof releaseManifests.$inferInsert;\nexport type ExternalTaskLinkRow = typeof externalTaskLinks.$inferSelect;\nexport type NewExternalTaskLinkRow = typeof externalTaskLinks.$inferInsert;\n// T944 experiments side-table row types\nexport type ExperimentRow = typeof experiments.$inferSelect;\nexport type NewExperimentRow = typeof experiments.$inferInsert;\n\n// agent_credentials REMOVED from tasks.db \u2014 T234 clean-cut.\n// Agent data (identity, credentials, capabilities, skills) now lives\n// exclusively in signaldock.db. See AgentRegistryAccessor.\n", "/**\n * SQLite store via drizzle-orm/node-sqlite + node:sqlite (DatabaseSync).\n *\n * Zero native npm dependencies, 100% cross-platform (Windows/Linux/macOS).\n * File-backed SQLite with WAL mode for multi-process concurrent access.\n * Database stored at .cleo/tasks.db.\n *\n * Architecture: node:sqlite provides the synchronous file-backed SQLite engine,\n * wrapped via drizzle-orm/node-sqlite for a fully synchronous interface. All\n * writes go directly to disk through SQLite's native WAL mechanism -- no\n * saveToFile() pattern needed.\n *\n * @epic T4454\n * @task T4817 - node:sqlite engine migration (ADR-006, ADR-010)\n * @task T4810 - Data loss prevention guards\n */\n\nimport { copyFileSync, existsSync, mkdirSync, renameSync, unlinkSync } from 'node:fs';\nimport { createRequire } from 'node:module';\n// underscore-import: node:sqlite type alias is required for createRequire interop.\n// Vitest/Vite cannot resolve `node:sqlite` as an ESM import (strips `node:` prefix).\n// Use createRequire as the runtime loader; keep type-only import for annotations.\nimport type { DatabaseSync as _DatabaseSyncType } from 'node:sqlite';\n\nconst _require = createRequire(import.meta.url);\ntype DatabaseSync = _DatabaseSyncType;\nconst { DatabaseSync } = _require('node:sqlite') as {\n DatabaseSync: new (...args: ConstructorParameters<typeof _DatabaseSyncType>) => DatabaseSync;\n};\n\nimport { dirname, join, resolve, sep } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { eq } from 'drizzle-orm';\nimport type { NodeSQLiteDatabase } from 'drizzle-orm/node-sqlite';\nimport { drizzle } from 'drizzle-orm/node-sqlite';\nimport { getLogger } from '../logger.js';\nimport { getCleoDirAbsolute } from '../paths.js';\nimport {\n createSafetyBackup,\n ensureColumns,\n migrateWithRetry,\n reconcileJournal,\n tableExists,\n} from './migration-manager.js';\nimport { listSqliteBackups } from './sqlite-backup.js';\nimport * as schema from './tasks-schema.js';\n\n/**\n * Open a node:sqlite DatabaseSync with CLEO standard pragmas.\n *\n * CRITICAL: WAL mode is verified, not just requested. If another process holds\n * an EXCLUSIVE lock in DELETE mode, PRAGMA journal_mode=WAL silently returns\n * 'delete'. This caused data loss (T5173) when concurrent processes opened\n * the same database \u2014 writes were silently dropped under lock contention.\n */\nexport function openNativeDatabase(\n path: string,\n options?: {\n readonly?: boolean;\n timeout?: number;\n enableWal?: boolean;\n allowExtension?: boolean;\n },\n): DatabaseSync {\n const db = new DatabaseSync(path, {\n enableForeignKeyConstraints: true,\n readOnly: options?.readonly ?? false,\n timeout: options?.timeout ?? 5000,\n allowExtension: options?.allowExtension ?? false,\n });\n\n // Set busy_timeout FIRST so WAL pragma can wait for locks\n db.exec('PRAGMA busy_timeout=5000');\n\n // Enable WAL for concurrent multi-process access (ADR-006, ADR-010)\n if (options?.enableWal !== false) {\n const MAX_WAL_RETRIES = 3;\n const RETRY_DELAY_MS = 200;\n let walSet = false;\n\n for (let attempt = 1; attempt <= MAX_WAL_RETRIES; attempt++) {\n db.exec('PRAGMA journal_mode=WAL');\n\n // CRITICAL: Verify WAL was actually set \u2014 the PRAGMA returns the mode\n // that was applied, which may be 'delete' if another connection holds a lock\n const result = db.prepare('PRAGMA journal_mode').get() as Record<string, unknown> | undefined;\n const currentMode = (result?.journal_mode as string)?.toLowerCase?.() ?? 'unknown';\n\n if (currentMode === 'wal') {\n walSet = true;\n break;\n }\n\n // WAL not set \u2014 another connection likely holds an EXCLUSIVE lock\n if (attempt < MAX_WAL_RETRIES) {\n // Sync sleep via Atomics for retry delay (node:sqlite is sync-only)\n const buf = new SharedArrayBuffer(4);\n Atomics.wait(new Int32Array(buf), 0, 0, RETRY_DELAY_MS * attempt);\n }\n }\n\n if (!walSet) {\n // Verify one final time\n const finalResult = db.prepare('PRAGMA journal_mode').get() as\n | Record<string, unknown>\n | undefined;\n const finalMode = (finalResult?.journal_mode as string)?.toLowerCase?.() ?? 'unknown';\n\n if (finalMode !== 'wal') {\n db.close();\n throw new Error(\n `CRITICAL: Failed to set WAL journal mode after ${MAX_WAL_RETRIES} attempts. ` +\n `Database is in '${finalMode}' mode. Another process likely holds an EXCLUSIVE lock ` +\n `on ${path}. Refusing to open \u2014 concurrent writes in DELETE mode cause data loss. ` +\n `Kill other cleo processes and retry. (T5173)`,\n );\n }\n }\n }\n\n // FK enforcement enabled in production. Disabled in vitest where test\n // fixtures insert data without full referential integrity (orphan refs).\n // VITEST env var is auto-set by vitest \u2014 no config needed.\n if (!process.env.VITEST) {\n db.exec('PRAGMA foreign_keys=ON');\n }\n\n return db;\n}\n\n/** Database file name within .cleo/ directory. */\nconst DB_FILENAME = 'tasks.db';\n\n/** Schema version for newly created databases. Single source of truth. */\nexport const SQLITE_SCHEMA_VERSION = '2.0.0';\nconst SCHEMA_VERSION = SQLITE_SCHEMA_VERSION;\n\n/** Singleton state for lazy initialization. */\nlet _db: NodeSQLiteDatabase<typeof schema> | null = null;\nlet _nativeDb: DatabaseSync | null = null;\nlet _dbPath: string | null = null;\n/** Guard against concurrent initialization (async migration). */\nlet _initPromise: Promise<NodeSQLiteDatabase<typeof schema>> | null = null;\n/** Guard: git-tracking check runs only once per process. */\nlet _gitTrackingChecked = false;\n\n/**\n * Get the path to the SQLite database file.\n */\nexport function getDbPath(cwd?: string): string {\n return join(getCleoDirAbsolute(cwd), DB_FILENAME);\n}\n\n/**\n * Minimum task count in a backup to consider it a valid recovery source.\n * Prevents restoring from a backup that's also empty or nearly empty.\n * @task T5188\n */\nconst MIN_BACKUP_TASK_COUNT = 10;\n\n/**\n * Auto-recover from backup if the database has tables but zero tasks\n * and a backup with data exists.\n *\n * Root cause (T5188): WAL/SHM files were tracked by git. On branch switch,\n * git overwrites the WAL with an empty (committed) version, discarding all\n * pending WAL writes. The main DB file (which may not have been checkpointed)\n * appears empty because all recent writes were in the WAL.\n *\n * This function runs after migrations (so tables exist) and before the\n * singleton is set. It checks if the tasks table is empty and a VACUUM INTO\n * backup exists with real data. If so, it closes the current connection,\n * replaces the DB file from backup, and re-opens.\n *\n * @task T5188\n */\nasync function autoRecoverFromBackup(\n nativeDb: DatabaseSync,\n dbPath: string,\n cwd: string | undefined,\n): Promise<void> {\n const log = getLogger('sqlite');\n\n try {\n // Count tasks in current database\n const countResult = nativeDb.prepare('SELECT COUNT(*) as cnt FROM tasks').get() as\n | { cnt: number }\n | undefined;\n const taskCount = countResult?.cnt ?? 0;\n\n if (taskCount > 0) return; // Database has data, no recovery needed\n\n // Database is empty \u2014 check for backups\n const backups = listSqliteBackups(cwd);\n if (backups.length === 0) {\n // No backups available \u2014 this is a genuinely new database\n return;\n }\n\n // Check the newest backup for task count\n const newestBackup = backups[0]!;\n\n // Open backup read-only to verify it has data\n const backupDb = new DatabaseSync(newestBackup.path, { readOnly: true });\n let backupTaskCount = 0;\n try {\n const backupCount = backupDb.prepare('SELECT COUNT(*) as cnt FROM tasks').get() as\n | { cnt: number }\n | undefined;\n backupTaskCount = backupCount?.cnt ?? 0;\n } finally {\n backupDb.close();\n }\n\n if (backupTaskCount < MIN_BACKUP_TASK_COUNT) {\n // Backup also has very few tasks \u2014 not a reliable recovery source\n return;\n }\n\n // We have an empty database AND a backup with data \u2014 auto-recover\n log.warn(\n { dbPath, backupPath: newestBackup.path, backupTasks: backupTaskCount },\n `Empty database detected with ${backupTaskCount}-task backup available. ` +\n 'Auto-recovering from backup. This likely happened because git-tracked ' +\n 'WAL/SHM files were overwritten during a branch switch (T5188).',\n );\n\n // Close current connection\n nativeDb.close();\n\n // Remove stale WAL/SHM files that may have been corrupted by git\n const walPath = dbPath + '-wal';\n const shmPath = dbPath + '-shm';\n try {\n unlinkSync(walPath);\n } catch {\n /* may not exist */\n }\n try {\n unlinkSync(shmPath);\n } catch {\n /* may not exist */\n }\n\n // Restore from backup (atomic: copy to temp, rename)\n const tempPath = dbPath + '.recovery-tmp';\n copyFileSync(newestBackup.path, tempPath);\n\n // Rename in place \u2014 on the same filesystem this is atomic\n renameSync(tempPath, dbPath);\n\n log.info(\n { dbPath, backupPath: newestBackup.path, restoredTasks: backupTaskCount },\n 'Database auto-recovered from backup successfully.',\n );\n\n // Re-open the restored database \u2014 update the native singleton\n const restoredNativeDb = openNativeDatabase(dbPath);\n _nativeDb = restoredNativeDb;\n\n // Re-run migrations on restored DB to ensure schema is current\n const restoredDb = drizzle({ client: restoredNativeDb, schema });\n runMigrations(restoredNativeDb, restoredDb);\n\n // Update the singleton drizzle instance\n _db = restoredDb;\n } catch (err) {\n // Auto-recovery failure is non-fatal \u2014 log and continue with empty DB\n log.error({ err, dbPath }, 'Auto-recovery from backup failed. Continuing with empty database.');\n }\n}\n\n/**\n * Initialize the SQLite database (lazy, singleton).\n * Creates the database file and tables if they don't exist.\n * Returns the drizzle ORM instance (node-sqlite driver).\n *\n * Uses a promise guard so concurrent callers wait for the same\n * initialization to complete (migrations are async).\n */\nexport async function getDb(cwd?: string): Promise<NodeSQLiteDatabase<typeof schema>> {\n const requestedPath = getDbPath(cwd);\n\n // If singleton exists but points to different path, reset it\n if (_db && _dbPath !== requestedPath) {\n resetDbState();\n }\n\n if (_db) return _db;\n\n // If already initializing, wait for the in-flight init\n if (_initPromise) return _initPromise;\n\n _initPromise = (async () => {\n const dbPath = requestedPath;\n _dbPath = dbPath;\n\n // Ensure directory exists\n mkdirSync(dirname(dbPath), { recursive: true });\n\n // Open file-backed SQLite via node:sqlite with WAL mode\n const nativeDb = openNativeDatabase(dbPath);\n _nativeDb = nativeDb;\n\n // Create drizzle ORM wrapper via node-sqlite\n const db = drizzle({ client: nativeDb, schema });\n\n // Run drizzle migrations (creates/updates tables)\n runMigrations(nativeDb, db);\n\n // Migration SQL contains PRAGMA foreign_keys=ON statements.\n // In test environments, disable FKs after migration to allow test\n // fixtures to insert data without full referential integrity.\n if (process.env.VITEST) {\n nativeDb.exec('PRAGMA foreign_keys=OFF');\n }\n\n // Seed schema version for new databases (no-op if already set)\n nativeDb.exec(\n `INSERT OR IGNORE INTO schema_meta (key, value) VALUES ('schemaVersion', '${SCHEMA_VERSION}')`,\n );\n nativeDb.exec(\n `INSERT OR IGNORE INTO schema_meta (key, value) VALUES ('task_id_sequence', '{\"counter\":0,\"lastId\":\"T000\",\"checksum\":\"seed\"}')`,\n );\n\n // Auto-recovery: detect empty database with available backups (T5188)\n // Root cause: git-tracked WAL/SHM files get overwritten on branch switch,\n // causing data loss when the WAL contained uncommitted writes.\n await autoRecoverFromBackup(nativeDb, dbPath, cwd);\n\n // Check if tasks.db or its WAL/SHM are dangerously tracked by git (ADR-013, T5158, T5188).\n //\n // As of ADR-013 \u00A79 (2026-04-07) the canonical resolution is:\n // 1. `.cleo/tasks.db` + WAL/SHM and `.cleo/brain.db` + WAL/SHM are\n // git-ignored at the project root and untracked via `git rm --cached`.\n // 2. Recovery is provided by VACUUM INTO snapshots in\n // `.cleo/backups/sqlite/` (auto-rotated, 10 per DB, refreshed on\n // every `cleo session end` via the backup-session-end hook).\n // 3. Full 4-file snapshots (including config.json + project-info.json)\n // are created on demand via `cleo backup add` / listed via\n // `cleo backup list` / restored via `cleo restore backup`.\n //\n // The warning below is retained as a regression guard: if someone\n // accidentally re-stages the DB into project git, this warning fires at\n // every process startup so they fix it before real data loss occurs.\n if (!_gitTrackingChecked) {\n _gitTrackingChecked = true;\n try {\n const { execFileSync } = await import('node:child_process');\n const gitCwd = resolve(dbPath, '..', '..');\n const filesToCheck = [dbPath, dbPath + '-wal', dbPath + '-shm'];\n const log = getLogger('sqlite');\n\n for (const fileToCheck of filesToCheck) {\n try {\n execFileSync('git', ['ls-files', '--error-unmatch', fileToCheck], {\n cwd: gitCwd,\n stdio: 'pipe',\n });\n // If we get here, the file IS tracked \u2014 that's dangerous.\n const basename = fileToCheck.split(/[\\\\/]/).pop();\n const relPath = fileToCheck.replace(gitCwd + sep, '');\n log.warn(\n { path: fileToCheck },\n `${basename} is tracked by project git \u2014 this risks data loss on branch switch. ` +\n `Resolution (ADR-013 \u00A79): \\`git rm --cached ${relPath}\\` and rely on ` +\n `\\`.cleo/backups/sqlite/\\` snapshots + \\`cleo backup add\\` for recovery.`,\n );\n } catch {\n // Exit code 1 = not tracked = good\n }\n }\n } catch {\n // git not available, skip check\n }\n }\n\n // Set singleton only after migrations complete\n _db = db;\n return db;\n })();\n\n try {\n return await _initPromise;\n } finally {\n _initPromise = null;\n }\n}\n\n/**\n * Resolve the path to the drizzle migrations folder.\n * Works from both src/ (dev via tsx) and dist/ (compiled via esbuild bundle).\n *\n * - Source layout: __dirname = src/store/ \u2192 need ../../migrations/drizzle-tasks\n * - Bundled layout: __dirname = dist/ \u2192 need ../migrations/drizzle-tasks\n */\nexport function resolveMigrationsFolder(): string {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n // When esbuild bundles into dist/index.js, __dirname is dist/ (1 level deep).\n // When running from source via tsx, __dirname is src/store/ (2 levels deep).\n const isBundled = __dirname.endsWith('/dist') || __dirname.endsWith('\\\\dist');\n const pkgRoot = isBundled ? join(__dirname, '..') : join(__dirname, '..', '..');\n return join(pkgRoot, 'migrations', 'drizzle-tasks');\n}\n\n/**\n * Check whether a table exists in the SQLite database.\n */\n// tableExists, isSqliteBusy, retry constants \u2014 delegated to migration-manager.ts (T132)\n\n/** Re-export isSqliteBusy for external consumers. */\nexport { isSqliteBusy } from './migration-manager.js';\n\n/**\n * Required columns that MUST exist on the tasks table.\n * Only TEXT columns with no constraints are safe for ALTER TABLE ADD in SQLite.\n * @see https://github.com/anthropics/cleo/issues/63\n */\nimport type { RequiredColumn } from './migration-manager.js';\n\nconst REQUIRED_TASK_COLUMNS: RequiredColumn[] = [\n { name: 'pipeline_stage', ddl: 'text' },\n { name: 'assignee', ddl: 'text' },\n];\n\n/**\n * Required columns that MUST exist on the sessions table before the\n * wave0-schema-hardening migration runs.\n *\n * The wave0 migration rebuilds the sessions table via:\n * INSERT INTO __new_sessions(..., provider_id, stats_json, resume_count, grade_mode)\n * SELECT ..., provider_id, stats_json, resume_count, grade_mode FROM sessions\n *\n * If an existing sessions table (created before these columns were added) is\n * missing any of them, the SELECT fails with \"no such column\". ensureColumns()\n * adds them as NULL-able columns before the migration runs, making the SELECT safe.\n *\n * @see https://github.com/anthropics/cleo/issues/83\n */\nconst REQUIRED_SESSION_COLUMNS: RequiredColumn[] = [\n { name: 'provider_id', ddl: 'text' },\n { name: 'stats_json', ddl: 'text' },\n { name: 'resume_count', ddl: 'integer' },\n { name: 'grade_mode', ddl: 'integer' },\n];\n\n/**\n * Run drizzle migrations to create/update tables.\n *\n * Delegates to shared migration-manager.ts for journal reconciliation,\n * retry logic, and column safety. See T132 for consolidation rationale.\n *\n * @task T4837 - ADR-012 drizzle-kit migration system\n * @task T5185 - Retry+backoff for SQLITE_BUSY during migrations\n * @task T132 - Unified migration system\n */\nfunction runMigrations(nativeDb: DatabaseSync, db: NodeSQLiteDatabase<typeof schema>): void {\n const migrationsFolder = resolveMigrationsFolder();\n\n // Safety backup before any migration work\n if (tableExists(nativeDb, 'tasks') && _dbPath) {\n createSafetyBackup(_dbPath);\n }\n\n // Bootstrap baseline + reconcile stale journal entries\n reconcileJournal(nativeDb, migrationsFolder, 'tasks', 'sqlite');\n\n // Pre-migration column safety: ensure sessions table has the columns that the\n // wave0-schema-hardening migration SELECTs during its table rebuild. Without\n // this, upgrading from a pre-wave0 DB fails with \"no such column: provider_id\".\n // Must run BEFORE migrateWithRetry so the migration's INSERT...SELECT succeeds.\n // @see https://github.com/anthropics/cleo/issues/83\n ensureColumns(nativeDb, 'sessions', REQUIRED_SESSION_COLUMNS, 'sqlite');\n\n // Run pending migrations with SQLITE_BUSY retry.\n // Pass nativeDb + existenceTable so migrateWithRetry can auto-reconcile any\n // partial migration (Scenario 3) that slips through the proactive check above.\n migrateWithRetry(db, migrationsFolder, nativeDb, 'tasks', 'sqlite');\n\n // Defensive column safety net\n ensureColumns(nativeDb, 'tasks', REQUIRED_TASK_COLUMNS, 'sqlite');\n}\n\n/**\n * Close the database connection and release resources.\n */\nexport function closeDb(): void {\n if (_nativeDb) {\n try {\n if (_nativeDb.isOpen) {\n _nativeDb.close();\n }\n } catch {\n // Ignore close errors\n }\n _nativeDb = null;\n }\n _db = null;\n _dbPath = null;\n _initPromise = null;\n}\n\n/**\n * Reset database singleton state without saving.\n * Used during migrations when database file is deleted and recreated.\n * Safe to call multiple times.\n */\nexport function resetDbState(): void {\n if (_nativeDb) {\n try {\n if (_nativeDb.isOpen) {\n _nativeDb.close();\n }\n } catch {\n // Ignore close errors\n }\n _nativeDb = null;\n }\n _db = null;\n _dbPath = null;\n _initPromise = null;\n}\n\n/**\n * Get the schema version from the database.\n */\nexport async function getSchemaVersion(cwd?: string): Promise<string | null> {\n const db = await getDb(cwd);\n const result = await db\n .select()\n .from(schema.schemaMeta)\n .where(eq(schema.schemaMeta.key, 'schemaVersion'));\n\n return result[0]?.value ?? null;\n}\n\n/**\n * Check if the database file exists.\n */\nexport function dbExists(cwd?: string): boolean {\n return existsSync(getDbPath(cwd));\n}\n\n/**\n * Get the underlying node:sqlite DatabaseSync instance.\n * Useful for direct PRAGMA calls or raw SQL operations.\n * Returns null if the database hasn't been initialized.\n */\nexport function getNativeDb(): DatabaseSync | null {\n return _nativeDb;\n}\n\n/**\n * Get the underlying node:sqlite DatabaseSync instance for tasks.db.\n * Alias for getNativeDb() \u2014 mirrors getBrainNativeDb() naming convention.\n */\nexport function getNativeTasksDb(): DatabaseSync | null {\n return _nativeDb;\n}\n\nexport type { NodeSQLiteDatabase };\n/**\n * Re-export schema for external use.\n */\nexport { schema };\n\n/**\n * Close ALL database singletons (tasks.db, brain.db, nexus.db).\n *\n * Must be called before deleting temp directories on Windows, where\n * SQLite holds exclusive file handles on .db, .db-wal, and .db-shm files.\n * Safe to call even if some databases were never opened.\n *\n * @task T5508\n */\nexport async function closeAllDatabases(): Promise<void> {\n // Close tasks.db\n closeDb();\n\n // Close brain.db (dynamic import to avoid circular deps)\n try {\n const { closeBrainDb } = await import('./memory-sqlite.js');\n closeBrainDb();\n } catch {\n /* module may not be loaded */\n }\n\n // Close nexus.db (dynamic import to avoid circular deps)\n try {\n const { closeNexusDb } = await import('./nexus-sqlite.js');\n closeNexusDb();\n } catch {\n /* module may not be loaded */\n }\n}\n", "/**\n * Atomic file write operations using write-file-atomic.\n * Ensures writes are crash-safe: temp file -> validate -> rename.\n * @epic T4454\n * @task T4457\n * @task T4721 - Added atomic database operations\n */\n\nimport { existsSync } from 'node:fs';\nimport { mkdir, readFile, rename, unlink } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport { ExitCode } from '@cleocode/contracts';\nimport writeFileAtomic from 'write-file-atomic';\nimport { CleoError } from '../errors.js';\n\n/**\n * Write data to a file atomically.\n * Creates parent directories if they don't exist.\n * Uses write-file-atomic for crash-safe writes (temp file -> rename).\n */\nexport async function atomicWrite(\n filePath: string,\n data: string,\n options?: { mode?: number; encoding?: BufferEncoding },\n): Promise<void> {\n try {\n await mkdir(dirname(filePath), { recursive: true });\n await writeFileAtomic(filePath, data, {\n encoding: options?.encoding ?? 'utf8',\n mode: options?.mode,\n });\n } catch (err) {\n throw new CleoError(ExitCode.FILE_ERROR, `Atomic write failed: ${filePath}`, { cause: err });\n }\n}\n\n/**\n * Read a file and return its contents.\n * Returns null if the file does not exist.\n */\nexport async function safeReadFile(filePath: string): Promise<string | null> {\n try {\n return await readFile(filePath, 'utf8');\n } catch (err: unknown) {\n if (err instanceof Error && 'code' in err && (err as NodeJS.ErrnoException).code === 'ENOENT') {\n return null;\n }\n throw new CleoError(ExitCode.FILE_ERROR, `Failed to read: ${filePath}`, { cause: err });\n }\n}\n\n/**\n * Write JSON data atomically with consistent formatting.\n */\nexport async function atomicWriteJson(\n filePath: string,\n data: unknown,\n options?: { indent?: number },\n): Promise<void> {\n const json = JSON.stringify(data, null, options?.indent ?? 2) + '\\n';\n await atomicWrite(filePath, json);\n}\n\n/**\n * Atomic database migration result.\n */\nexport interface AtomicMigrationResult {\n success: boolean;\n tempPath: string;\n backupPath?: string;\n error?: string;\n}\n\n/**\n * Perform atomic database migration using rename operations.\n *\n * Pattern:\n * 1. Write new database to temp file (tasks.db.new)\n * 2. Validate temp database integrity\n * 3. Rename existing tasks.db \u2192 tasks.db.backup\n * 4. Rename temp \u2192 tasks.db (atomic)\n * 5. Only delete backup on success\n *\n * @param dbPath - Path to the database file (e.g., tasks.db)\n * @param tempPath - Path to temporary database (e.g., tasks.db.new)\n * @param validateFn - Async function to validate the temp database\n * @returns Result with paths and success status\n */\nexport async function atomicDatabaseMigration(\n dbPath: string,\n tempPath: string,\n validateFn: (path: string) => Promise<boolean>,\n): Promise<AtomicMigrationResult> {\n const backupPath = `${dbPath}.backup`;\n\n try {\n // Step 1: Validate temp database exists\n if (!existsSync(tempPath)) {\n throw new Error(`Temp database not found: ${tempPath}`);\n }\n\n // Step 2: Validate the temp database integrity\n const isValid = await validateFn(tempPath);\n if (!isValid) {\n throw new Error(`Temp database validation failed: ${tempPath}`);\n }\n\n // Step 3: If existing database exists, rename to backup\n if (existsSync(dbPath)) {\n await rename(dbPath, backupPath);\n }\n\n // Step 4: Atomically rename temp to final (atomic on POSIX systems)\n await rename(tempPath, dbPath);\n\n return {\n success: true,\n tempPath,\n backupPath: existsSync(backupPath) ? backupPath : undefined,\n };\n } catch (err) {\n return {\n success: false,\n tempPath,\n backupPath: existsSync(backupPath) ? backupPath : undefined,\n error: String(err),\n };\n }\n}\n\n/**\n * Restore database from backup after failed migration.\n *\n * @param dbPath - Path to the database file\n * @param backupPath - Path to the backup file\n * @returns true if restore succeeded\n */\nexport async function restoreDatabaseFromBackup(\n dbPath: string,\n backupPath: string,\n): Promise<boolean> {\n try {\n if (!existsSync(backupPath)) {\n return false;\n }\n\n // If a partial database exists, remove it\n if (existsSync(dbPath)) {\n await unlink(dbPath);\n }\n\n // Restore from backup\n await rename(backupPath, dbPath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Clean up migration artifacts after successful migration.\n *\n * @param backupPath - Path to backup file to delete\n * @returns true if cleanup succeeded\n */\nexport async function cleanupMigrationArtifacts(backupPath: string): Promise<boolean> {\n try {\n if (existsSync(backupPath)) {\n await unlink(backupPath);\n }\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Validate SQLite database integrity by attempting to open it.\n *\n * @param dbPath - Path to database file\n * @returns true if database is valid\n */\nexport async function validateSqliteDatabase(dbPath: string): Promise<boolean> {\n try {\n const { createRequire } = await import('node:module');\n const _req = createRequire(import.meta.url);\n const { DatabaseSync } = _req('node:sqlite') as typeof import('node:sqlite');\n const db = new DatabaseSync(dbPath, { readOnly: true });\n const integrityRow = db.prepare('PRAGMA integrity_check').get() as\n | { integrity_check: string }\n | undefined;\n const isOk = integrityRow?.integrity_check === 'ok';\n const tableRow = db\n .prepare(\"SELECT name FROM sqlite_master WHERE type='table' AND name='tasks'\")\n .get();\n const hasTasksTable = !!tableRow;\n db.close();\n return isOk && hasTasksTable;\n } catch {\n return false;\n }\n}\n", "/**\n * Numbered backup system for CLEO data files.\n * Maintains a rotating window of recent backups for rollback protection.\n * @epic T4454\n * @task T4457\n */\n\nimport { copyFile, rename as fsRename, mkdir, readdir, stat, unlink } from 'node:fs/promises';\nimport { basename, join } from 'node:path';\nimport { ExitCode } from '@cleocode/contracts';\nimport { CleoError } from '../errors.js';\n\nconst DEFAULT_MAX_BACKUPS = 5;\n\n/**\n * Create a numbered backup of a file.\n * Rotates existing backups (file.1 -> file.2, etc.) and removes excess.\n */\nexport async function createBackup(\n filePath: string,\n backupDir: string,\n maxBackups: number = DEFAULT_MAX_BACKUPS,\n): Promise<string> {\n try {\n await mkdir(backupDir, { recursive: true });\n\n const fileName = basename(filePath);\n\n // Check if source file exists\n try {\n await stat(filePath);\n } catch {\n throw new CleoError(ExitCode.FILE_ERROR, `Cannot backup: source file not found: ${filePath}`);\n }\n\n // Rotate existing backups (shift numbers up)\n for (let i = maxBackups; i >= 1; i--) {\n const current = join(backupDir, `${fileName}.${i}`);\n if (i === maxBackups) {\n // Remove oldest backup\n try {\n await unlink(current);\n } catch {\n // File may not exist\n }\n } else {\n const next = join(backupDir, `${fileName}.${i + 1}`);\n try {\n await stat(current);\n await fsRename(current, next);\n } catch {\n // File may not exist\n }\n }\n }\n\n // Create new backup as .1\n const backupPath = join(backupDir, `${fileName}.1`);\n await copyFile(filePath, backupPath);\n return backupPath;\n } catch (err) {\n if (err instanceof CleoError) throw err;\n throw new CleoError(ExitCode.FILE_ERROR, `Backup failed for: ${filePath}`, { cause: err });\n }\n}\n\n/**\n * List existing backups for a file, sorted by number (newest first).\n */\nexport async function listBackups(fileName: string, backupDir: string): Promise<string[]> {\n try {\n const entries = await readdir(backupDir);\n const prefix = `${fileName}.`;\n return entries\n .filter((e) => e.startsWith(prefix) && /^\\d+$/.test(e.slice(prefix.length)))\n .sort((a, b) => {\n const numA = parseInt(a.slice(prefix.length), 10);\n const numB = parseInt(b.slice(prefix.length), 10);\n return numA - numB;\n })\n .map((e) => join(backupDir, e));\n } catch {\n return [];\n }\n}\n\n/**\n * Restore a file from its most recent backup.\n * Returns the path of the backup that was restored.\n */\nexport async function restoreFromBackup(\n fileName: string,\n backupDir: string,\n targetPath: string,\n): Promise<string> {\n const backups = await listBackups(fileName, backupDir);\n if (backups.length === 0) {\n throw new CleoError(ExitCode.NOT_FOUND, `No backups found for: ${fileName}`);\n }\n const newest = backups[0]!;\n await copyFile(newest, targetPath);\n return newest;\n}\n", "/**\n * File locking using proper-lockfile.\n * Prevents concurrent modifications to CLEO data files.\n * @epic T4454\n * @task T4457\n */\n\nimport { ExitCode } from '@cleocode/contracts';\nimport lockfile from 'proper-lockfile';\nimport { CleoError } from '../errors.js';\n\n/** Default lock options. */\nconst DEFAULT_LOCK_OPTIONS = {\n retries: {\n retries: 3,\n minTimeout: 100,\n maxTimeout: 1000,\n factor: 2,\n },\n stale: 10_000,\n realpath: false,\n};\n\n/** A release function returned by acquireLock. */\nexport type ReleaseFn = () => Promise<void>;\n\n/**\n * Acquire an exclusive lock on a file.\n * Returns a release function that must be called when done.\n */\nexport async function acquireLock(\n filePath: string,\n options?: { stale?: number; retries?: number },\n): Promise<ReleaseFn> {\n try {\n const release = await lockfile.lock(filePath, {\n ...DEFAULT_LOCK_OPTIONS,\n ...(options?.stale !== undefined && { stale: options.stale }),\n ...(options?.retries !== undefined && {\n retries: {\n ...DEFAULT_LOCK_OPTIONS.retries,\n retries: options.retries,\n },\n }),\n });\n return release;\n } catch (err) {\n throw new CleoError(ExitCode.LOCK_TIMEOUT, `Failed to acquire lock: ${filePath}`, {\n fix: `Another process may be writing to this file. Wait and retry.`,\n cause: err,\n });\n }\n}\n\n/**\n * Check if a file is currently locked.\n */\nexport async function isLocked(filePath: string): Promise<boolean> {\n try {\n return await lockfile.check(filePath, { realpath: false });\n } catch {\n return false;\n }\n}\n\n/**\n * Execute a function while holding an exclusive lock on a file.\n * The lock is automatically released when the function completes (or throws).\n */\nexport async function withLock<T>(\n filePath: string,\n fn: () => Promise<T>,\n options?: { stale?: number; retries?: number },\n): Promise<T> {\n const release = await acquireLock(filePath, options);\n try {\n return await fn();\n } finally {\n await release();\n }\n}\n", "/**\n * Hook Registry System - Phase 2C of T5237\n *\n * Central registry for managing hook handlers with priority-based execution,\n * async dispatch, and best-effort error handling. Integrates with CAAMP 1.9.1\n * canonical event definitions while providing CLEO's execution engine.\n *\n * @module @cleocode/cleo/hooks/registry\n */\n\nimport { getLogger } from '../logger.js';\nimport type { HookConfig, HookEvent, HookPayload, HookRegistration } from './types.js';\n\n/** Map from old `on`-prefix event names to new canonical names. Used for backward compat. */\nconst LEGACY_EVENT_MAP: Record<string, HookEvent> = {\n onSessionStart: 'SessionStart',\n onSessionEnd: 'SessionEnd',\n onToolStart: 'PreToolUse',\n onToolComplete: 'PostToolUse',\n onFileChange: 'Notification',\n onError: 'PostToolUseFailure',\n onPromptSubmit: 'PromptSubmit',\n onResponseComplete: 'ResponseComplete',\n};\n\n/**\n * Default configuration for the hook system.\n * All events are enabled by default.\n */\nconst DEFAULT_HOOK_CONFIG: HookConfig = {\n enabled: true,\n events: {\n // CAAMP canonical events (16)\n SessionStart: true,\n SessionEnd: true,\n PromptSubmit: true,\n ResponseComplete: true,\n PreToolUse: true,\n PostToolUse: true,\n PostToolUseFailure: true,\n PermissionRequest: true,\n SubagentStart: true,\n SubagentStop: true,\n PreModel: true,\n PostModel: true,\n PreCompact: true,\n PostCompact: true,\n Notification: true,\n ConfigChange: true,\n // CLEO internal coordination events (5)\n onWorkAvailable: true,\n onAgentSpawn: true,\n onAgentComplete: true,\n onCascadeStart: true,\n onPatrol: true,\n } as Record<HookEvent, boolean>,\n};\n\n/**\n * Central registry for hook handlers.\n *\n * Manages registration, priority-based ordering, and async dispatch\n * of hook handlers. Provides best-effort execution where errors in\n * one handler do not block others.\n *\n * Backward compatibility: handlers registered with legacy `on`-prefix\n * event names (e.g. `onSessionStart`) are automatically remapped to their\n * canonical equivalents (e.g. `SessionStart`) with a deprecation warning.\n */\nexport class HookRegistry {\n private handlers: Map<HookEvent, HookRegistration[]> = new Map();\n private config: HookConfig = DEFAULT_HOOK_CONFIG;\n\n /**\n * Resolve a potentially-legacy event name to its canonical equivalent.\n *\n * If the event name matches a known legacy `on`-prefix name, it is\n * remapped and a deprecation warning is logged. Unknown names pass through\n * unchanged so callers using the new canonical names are unaffected.\n */\n private resolveEvent(event: string): HookEvent {\n const canonical = LEGACY_EVENT_MAP[event];\n if (canonical) {\n getLogger('hooks').warn(\n { legacyEvent: event, canonicalEvent: canonical },\n `[DEPRECATED] Hook event '${event}' has been renamed to '${canonical}'. Update your handler registration.`,\n );\n return canonical;\n }\n return event as HookEvent;\n }\n\n /**\n * Register a hook handler for a specific event.\n *\n * Handlers are sorted by priority (highest first) and executed\n * in parallel when the event is dispatched.\n *\n * Backward compatibility: legacy `on`-prefix event names are automatically\n * remapped to their canonical equivalents.\n *\n * @param registration - The hook registration containing event, handler, priority, and ID\n * @returns A function to unregister the handler\n *\n * @example\n * ```typescript\n * const unregister = hooks.register({\n * id: 'my-handler',\n * event: 'SessionStart',\n * handler: async (root, payload) => { console.log('Session started'); },\n * priority: 100\n * });\n *\n * // Later: unregister()\n * ```\n */\n register<T extends HookPayload>(registration: HookRegistration<T>): () => void {\n const resolvedEvent = this.resolveEvent(registration.event as string);\n const resolvedRegistration = { ...registration, event: resolvedEvent } as HookRegistration;\n\n const list = this.handlers.get(resolvedEvent) || [];\n list.push(resolvedRegistration);\n // Sort by priority (highest first)\n list.sort((a, b) => b.priority - a.priority);\n this.handlers.set(resolvedEvent, list);\n\n // Return unregister function\n return () => {\n const handlers = this.handlers.get(resolvedEvent);\n if (handlers) {\n const idx = handlers.findIndex((h) => h.id === registration.id);\n if (idx !== -1) handlers.splice(idx, 1);\n }\n };\n }\n\n /**\n * Dispatch an event to all registered handlers.\n *\n * Executes handlers in parallel using Promise.allSettled for best-effort\n * execution. Errors in individual handlers are logged but do not block\n * other handlers or propagate to the caller.\n *\n * Backward compatibility: legacy `on`-prefix event names are automatically\n * remapped to their canonical equivalents.\n *\n * @param event - The CAAMP canonical hook event to dispatch\n * @param projectRoot - The project root directory path\n * @param payload - The event payload (typed by event)\n * @returns Promise that resolves when all handlers have completed\n *\n * @example\n * ```typescript\n * await hooks.dispatch('SessionStart', '/project', {\n * timestamp: new Date().toISOString(),\n * sessionId: 'sess-123',\n * name: 'My Session',\n * scope: 'feature'\n * });\n * ```\n */\n async dispatch<T extends HookPayload>(\n event: HookEvent,\n projectRoot: string,\n payload: T,\n ): Promise<void> {\n // Check if hooks enabled globally\n if (!this.config.enabled) return;\n\n const resolvedEvent = this.resolveEvent(event as string);\n\n // Check if this event enabled\n if (!this.config.events[resolvedEvent]) return;\n\n const handlers = this.handlers.get(resolvedEvent);\n if (!handlers || handlers.length === 0) return;\n\n // Execute all handlers in parallel (best-effort)\n await Promise.allSettled(\n handlers.map(async (reg) => {\n try {\n await reg.handler(projectRoot, payload);\n } catch (error) {\n // Hooks are best-effort - log but don't throw\n getLogger('hooks').warn(\n { err: error, hookId: reg.id, event: resolvedEvent },\n 'Hook handler failed',\n );\n }\n }),\n );\n }\n\n /**\n * Check if a specific event is currently enabled.\n *\n * Both the global enabled flag and the per-event flag must be true.\n * Automatically resolves legacy `on`-prefix event names.\n *\n * @param event - The CAAMP hook event to check\n * @returns True if the event is enabled\n */\n isEnabled(event: HookEvent): boolean {\n const resolvedEvent = this.resolveEvent(event as string);\n return this.config.enabled && this.config.events[resolvedEvent];\n }\n\n /**\n * Update the hook system configuration.\n *\n * Merges the provided config with the existing config.\n *\n * @param config - Partial configuration to apply\n *\n * @example\n * ```typescript\n * hooks.setConfig({ enabled: false }); // Disable all hooks\n * hooks.setConfig({ events: { PostToolUseFailure: false } }); // Disable specific event\n * ```\n */\n setConfig(config: Partial<HookConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Get the current hook configuration.\n *\n * @returns A copy of the current configuration\n */\n getConfig(): HookConfig {\n return { ...this.config };\n }\n\n /**\n * List all registered handlers for a specific event.\n *\n * Returns handlers in priority order (highest first).\n * Automatically resolves legacy `on`-prefix event names.\n *\n * @param event - The CAAMP hook event\n * @returns Array of hook registrations\n */\n listHandlers(event: HookEvent): HookRegistration[] {\n const resolvedEvent = this.resolveEvent(event as string);\n return [...(this.handlers.get(resolvedEvent) || [])];\n }\n}\n\n/**\n * Singleton instance of the HookRegistry.\n *\n * Use this instance for all hook operations throughout the application.\n */\nexport const hooks = new HookRegistry();\n", "/**\n * JSON read/write with schema validation, locking, and backup.\n * This is the primary data access layer for CLEO data files.\n * @epic T4454\n * @task T4457\n */\n\nimport { createHash } from 'node:crypto';\nimport { ExitCode } from '@cleocode/contracts';\nimport { CleoError } from '../errors.js';\nimport { atomicWrite, atomicWriteJson, safeReadFile } from './atomic.js';\nimport { createBackup } from './backup.js';\nimport { withLock } from './lock.js';\n\n/**\n * Read and parse a JSON file.\n * Returns null if the file does not exist.\n */\nexport async function readJson<T = unknown>(filePath: string): Promise<T | null> {\n const content = await safeReadFile(filePath);\n if (content === null) return null;\n\n try {\n return JSON.parse(content) as T;\n } catch (err) {\n throw new CleoError(ExitCode.VALIDATION_ERROR, `Invalid JSON in: ${filePath}`, { cause: err });\n }\n}\n\n/**\n * Read a JSON file, throwing if it doesn't exist.\n */\nexport async function readJsonRequired<T = unknown>(filePath: string): Promise<T> {\n const data = await readJson<T>(filePath);\n if (data === null) {\n throw new CleoError(ExitCode.NOT_FOUND, `Required file not found: ${filePath}`);\n }\n return data;\n}\n\n/**\n * Compute a truncated SHA-256 checksum of a value.\n * Used for integrity verification (matches Bash CLI's 16-char hex format).\n */\nexport function computeChecksum(data: unknown): string {\n const json = JSON.stringify(data);\n const hash = createHash('sha256').update(json).digest('hex');\n return hash.substring(0, 16);\n}\n\n/** Options for saveJson. */\nexport interface SaveJsonOptions {\n /** Directory for backups. If omitted, no backup is created. */\n backupDir?: string;\n /** Maximum number of backups to retain. Default: 5. */\n maxBackups?: number;\n /** JSON indentation. Default: 2. */\n indent?: number;\n /** Validation function. Called before write; throw to abort. */\n validate?: (data: unknown) => void | Promise<void>;\n}\n\n/**\n * Save JSON data with optional locking, backup, and validation.\n * Follows the CLEO atomic write pattern:\n * 1. Acquire lock\n * 2. Validate data\n * 3. Create backup of existing file\n * 4. Atomic write (temp file -> rename)\n * 5. Release lock\n */\nexport async function saveJson(\n filePath: string,\n data: unknown,\n options?: SaveJsonOptions,\n): Promise<void> {\n await withLock(filePath, async () => {\n // Validate before write\n if (options?.validate) {\n try {\n await options.validate(data);\n } catch (err) {\n throw new CleoError(\n ExitCode.VALIDATION_ERROR,\n `Validation failed before write: ${filePath}`,\n { cause: err },\n );\n }\n }\n\n // Create backup if configured\n if (options?.backupDir) {\n try {\n await createBackup(filePath, options.backupDir, options.maxBackups);\n } catch {\n // Backup failure is non-fatal for first write (file may not exist yet)\n }\n }\n\n // Atomic write\n await atomicWriteJson(filePath, data, { indent: options?.indent });\n\n // Dispatch Notification hook (best-effort, fire-and-forget)\n import('../hooks/registry.js')\n .then(({ hooks: h }) =>\n h.dispatch('Notification', process.cwd(), {\n timestamp: new Date().toISOString(),\n filePath,\n changeType: 'write' as const,\n }),\n )\n .catch(() => {\n /* hook errors are non-fatal */\n });\n });\n}\n\n/**\n * Append a line to a JSONL file atomically.\n * Used for manifest entries and audit logs.\n */\nexport async function appendJsonl(filePath: string, entry: unknown): Promise<void> {\n const existing = await safeReadFile(filePath);\n const line = JSON.stringify(entry);\n const content = existing ? existing.trimEnd() + '\\n' + line + '\\n' : line + '\\n';\n await atomicWrite(filePath, content);\n}\n\n/**\n * Read log entries from a hybrid JSON/JSONL file.\n * Handles three formats:\n * 1. Pure JSON: `{ \"entries\": [...] }` (legacy bash format)\n * 2. Pure JSONL: one JSON object per line (new TS format)\n * 3. Hybrid: JSON object followed by JSONL lines (migration state)\n * Returns a flat array of all entries found.\n * @task T4622\n */\nexport async function readLogEntries(filePath: string): Promise<Record<string, unknown>[]> {\n const content = await safeReadFile(filePath);\n if (content === null) return [];\n\n const trimmed = content.trim();\n if (!trimmed) return [];\n\n // Fast path: try parsing as a single JSON object\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) return parsed as Record<string, unknown>[];\n if (parsed && typeof parsed === 'object' && Array.isArray(parsed.entries)) {\n return parsed.entries as Record<string, unknown>[];\n }\n // Single object, wrap in array\n return [parsed as Record<string, unknown>];\n } catch {\n // Not valid JSON - handle hybrid format\n }\n\n // Hybrid format: find where the initial JSON object ends, then parse JSONL after it\n const entries: Record<string, unknown>[] = [];\n\n if (trimmed.startsWith('{')) {\n // Find the matching closing brace for the initial JSON object\n let depth = 0;\n let inString = false;\n let escaped = false;\n let jsonEnd = -1;\n\n for (let i = 0; i < trimmed.length; i++) {\n const ch = trimmed[i]!;\n if (escaped) {\n escaped = false;\n continue;\n }\n if (ch === '\\\\' && inString) {\n escaped = true;\n continue;\n }\n if (ch === '\"') {\n inString = !inString;\n continue;\n }\n if (inString) continue;\n if (ch === '{') depth++;\n else if (ch === '}') {\n depth--;\n if (depth === 0) {\n jsonEnd = i + 1;\n break;\n }\n }\n }\n\n if (jsonEnd > 0) {\n // Parse the initial JSON object\n try {\n const initialJson = JSON.parse(trimmed.substring(0, jsonEnd));\n if (initialJson && Array.isArray(initialJson.entries)) {\n entries.push(...(initialJson.entries as Record<string, unknown>[]));\n }\n } catch {\n // Corrupted initial JSON - skip it\n }\n\n // Parse remaining lines as JSONL\n const remainder = trimmed.substring(jsonEnd).trim();\n if (remainder) {\n for (const line of remainder.split('\\n')) {\n const l = line.trim();\n if (!l?.startsWith('{')) continue;\n try {\n entries.push(JSON.parse(l) as Record<string, unknown>);\n } catch {\n // Skip unparseable lines\n }\n }\n }\n }\n } else {\n // Pure JSONL (no initial JSON object)\n for (const line of trimmed.split('\\n')) {\n const l = line.trim();\n if (!l?.startsWith('{')) continue;\n try {\n entries.push(JSON.parse(l) as Record<string, unknown>);\n } catch {\n // Skip unparseable lines\n }\n }\n }\n\n return entries;\n}\n", "/**\n * Configuration engine for CLEO V2.\n *\n * Resolution priority: CLI flags > Environment vars > Project config > Global config > Defaults\n *\n * @epic T4454\n * @task T4458\n * @task T067\n */\n\nimport { existsSync } from 'node:fs';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport type { CleoConfig, ConfigSource, ResolvedValue } from '@cleocode/contracts';\nimport { getConfigPath, getGlobalConfigPath } from './paths.js';\nimport { readJson, saveJson } from './store/json.js';\n\n/** Default configuration values. */\nconst DEFAULTS: CleoConfig = {\n version: '2.10.0',\n output: {\n defaultFormat: 'json',\n showColor: true,\n showUnicode: true,\n showProgressBars: true,\n dateFormat: 'relative',\n },\n backup: {\n maxOperationalBackups: 10,\n maxSafetyBackups: 5,\n compressionEnabled: false,\n },\n hierarchy: {\n maxDepth: 3,\n maxSiblings: 0,\n cascadeDelete: false,\n maxActiveSiblings: 0,\n countDoneInLimit: false,\n enforcementProfile: 'llm-agent-first',\n },\n session: {\n autoStart: false,\n requireNotes: false,\n multiSession: false,\n },\n enforcement: {\n acceptance: {\n mode: 'block',\n requiredForPriorities: ['critical', 'high', 'medium', 'low'],\n minimumCriteria: 3,\n },\n session: { requiredForMutate: true },\n },\n verification: {\n enabled: true,\n maxRounds: 3,\n requiredGates: ['implemented', 'testsPassed', 'qaPassed'],\n },\n lifecycle: {\n mode: 'strict',\n },\n logging: {\n level: 'info',\n filePath: 'logs/cleo.log',\n maxFileSize: 10 * 1024 * 1024, // 10MB\n maxFiles: 5,\n auditRetentionDays: 90,\n archiveBeforePrune: true,\n },\n sharing: {\n mode: 'none',\n commitAllowlist: [],\n denylist: [],\n },\n signaldock: {\n enabled: false,\n mode: 'http',\n endpoint: 'http://localhost:4000',\n agentPrefix: 'cleo-',\n privacyTier: 'private',\n },\n brain: {\n autoCapture: true,\n captureFiles: false,\n captureWork: false,\n embedding: {\n enabled: true,\n provider: 'local' as const,\n },\n memoryBridge: {\n autoRefresh: true,\n contextAware: true,\n maxTokens: 2000,\n mode: 'cli' as const,\n },\n summarization: {\n enabled: true,\n },\n llmExtraction: {\n enabled: true,\n model: 'claude-haiku-4-5-20251001',\n minImportance: 0.6,\n maxExtractions: 7,\n maxTranscriptChars: 60000,\n },\n },\n};\n\n/** Environment variable to config path mapping. */\nconst ENV_MAP: Record<string, string> = {\n CLEO_FORMAT: 'output.defaultFormat',\n CLEO_OUTPUT_DEFAULT_FORMAT: 'output.defaultFormat',\n CLEO_OUTPUT_SHOW_COLOR: 'output.showColor',\n CLEO_OUTPUT_SHOW_UNICODE: 'output.showUnicode',\n CLEO_OUTPUT_SHOW_PROGRESS_BARS: 'output.showProgressBars',\n CLEO_OUTPUT_DATE_FORMAT: 'output.dateFormat',\n CLEO_HIERARCHY_MAX_DEPTH: 'hierarchy.maxDepth',\n CLEO_HIERARCHY_MAX_SIBLINGS: 'hierarchy.maxSiblings',\n CLEO_HIERARCHY_MAX_ACTIVE_SIBLINGS: 'hierarchy.maxActiveSiblings',\n CLEO_HIERARCHY_ENFORCEMENT_PROFILE: 'hierarchy.enforcementProfile',\n CLEO_SESSION_AUTO_START: 'session.autoStart',\n CLEO_SESSION_REQUIRE_NOTES: 'session.requireNotes',\n CLEO_LIFECYCLE_MODE: 'lifecycle.mode',\n CLEO_LOG_LEVEL: 'logging.level',\n CLEO_LOG_FILE: 'logging.filePath',\n CLEO_AUDIT_RETENTION_DAYS: 'logging.auditRetentionDays',\n CLEO_SIGNALDOCK_ENABLED: 'signaldock.enabled',\n CLEO_SIGNALDOCK_ENDPOINT: 'signaldock.endpoint',\n};\n\n/**\n * Get a value at a dotted path from an object.\n */\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split('.');\n let current: unknown = obj;\n for (const part of parts) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\n/**\n * Set a value at a dotted path in an object (mutates).\n */\nfunction setNestedValue(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split('.');\n let current: Record<string, unknown> = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]!;\n if (current[part] === undefined || typeof current[part] !== 'object') {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n current[parts[parts.length - 1]!] = value;\n}\n\n/**\n * Deep merge two objects. Source values override target values.\n * Arrays are replaced (not merged).\n */\nfunction deepMerge(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n): Record<string, unknown> {\n const result = { ...target };\n for (const key of Object.keys(source)) {\n const sourceVal = source[key];\n const targetVal = result[key];\n if (\n sourceVal !== null &&\n typeof sourceVal === 'object' &&\n !Array.isArray(sourceVal) &&\n targetVal !== null &&\n typeof targetVal === 'object' &&\n !Array.isArray(targetVal)\n ) {\n result[key] = deepMerge(\n targetVal as Record<string, unknown>,\n sourceVal as Record<string, unknown>,\n );\n } else {\n result[key] = sourceVal;\n }\n }\n return result;\n}\n\n/**\n * Parse an environment variable value to the appropriate type.\n */\nfunction parseEnvValue(value: string): unknown {\n if (value === 'true') return true;\n if (value === 'false') return false;\n const num = Number(value);\n if (!Number.isNaN(num) && value.trim() !== '') return num;\n return value;\n}\n\n/**\n * Load and merge configuration from all sources.\n * Priority: defaults < global config < project config < environment vars\n */\nexport async function loadConfig(cwd?: string): Promise<CleoConfig> {\n // Start with defaults\n let merged: Record<string, unknown> = JSON.parse(JSON.stringify(DEFAULTS));\n\n // Layer 1: Global config\n const globalConfig = await readJson<Record<string, unknown>>(getGlobalConfigPath());\n if (globalConfig) {\n merged = deepMerge(merged, globalConfig);\n }\n\n // Layer 2: Project config\n const projectConfig = await readJson<Record<string, unknown>>(getConfigPath(cwd));\n if (projectConfig) {\n // Map pinoLogging config key to the logging section used by the pino logger factory\n if (projectConfig.pinoLogging && typeof projectConfig.pinoLogging === 'object') {\n merged.logging = deepMerge(\n (merged.logging ?? {}) as Record<string, unknown>,\n projectConfig.pinoLogging as Record<string, unknown>,\n );\n }\n merged = deepMerge(merged, projectConfig);\n }\n\n // Layer 3: Environment variables\n for (const [envKey, configPath] of Object.entries(ENV_MAP)) {\n const envValue = process.env[envKey];\n if (envValue !== undefined) {\n setNestedValue(merged, configPath, parseEnvValue(envValue));\n }\n }\n\n // merged starts from DEFAULTS (CleoConfig) and is built via deep merge.\n // Partial<CleoConfig> provides the structural overlap for a safe assertion.\n return merged as Partial<CleoConfig> as CleoConfig;\n}\n\n/**\n * Get a single config value with source tracking.\n * Returns the value and which source it came from.\n */\nexport async function getConfigValue<T>(path: string, cwd?: string): Promise<ResolvedValue<T>> {\n // Check environment variables first\n for (const [envKey, configPath] of Object.entries(ENV_MAP)) {\n if (configPath === path && process.env[envKey] !== undefined) {\n return {\n value: parseEnvValue(process.env[envKey]!) as T,\n source: 'env' as ConfigSource,\n };\n }\n }\n\n // Check project config\n const projectConfig = await readJson<Record<string, unknown>>(getConfigPath(cwd));\n if (projectConfig) {\n const val = getNestedValue(projectConfig, path);\n if (val !== undefined) {\n return { value: val as T, source: 'project' as ConfigSource };\n }\n }\n\n // Check global config\n const globalConfig = await readJson<Record<string, unknown>>(getGlobalConfigPath());\n if (globalConfig) {\n const val = getNestedValue(globalConfig, path);\n if (val !== undefined) {\n return { value: val as T, source: 'global' as ConfigSource };\n }\n }\n\n // Fall back to defaults\n const defaultVal = getNestedValue({ ...DEFAULTS } as Record<string, unknown>, path);\n return { value: defaultVal as T, source: 'default' as ConfigSource };\n}\n\n/**\n * Get a raw config value from the project config file only (no cascade).\n * Returns undefined if the key is not found.\n * Used by the engine layer for simple key lookups without source tracking.\n * @task T4789\n */\nexport async function getRawConfigValue(key: string, cwd?: string): Promise<unknown> {\n const configPath = getConfigPath(cwd);\n const config = await readJson<Record<string, unknown>>(configPath);\n if (!config) return undefined;\n\n if (!key) return config;\n\n return getNestedValue(config, key);\n}\n\n/**\n * Get the full raw project config (no cascade).\n * Returns null if no config file exists.\n * @task T4789\n */\nexport async function getRawConfig(cwd?: string): Promise<Record<string, unknown> | null> {\n return readJson<Record<string, unknown>>(getConfigPath(cwd));\n}\n\n/**\n * Parse a string value into its appropriate JS type.\n * Handles booleans, null, integers, floats, and JSON.\n * @task T4789\n */\nexport function parseConfigValue(value: unknown): unknown {\n if (typeof value !== 'string') return value;\n if (value === 'true') return true;\n if (value === 'false') return false;\n if (value === 'null') return null;\n if (/^-?\\d+$/.test(value)) return parseInt(value, 10);\n if (/^-?\\d+\\.\\d+$/.test(value)) return parseFloat(value);\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n}\n\n/**\n * Set a config value in the project or global config file (dot-notation supported).\n * Creates intermediate objects as needed. Parses string values into\n * appropriate types (boolean, number, null, JSON).\n * @task T4789\n * @task T4795\n */\nexport async function setConfigValue(\n key: string,\n value: unknown,\n cwd?: string,\n opts?: { global?: boolean },\n): Promise<{ key: string; value: unknown; scope: 'project' | 'global' }> {\n const configPath = opts?.global ? getGlobalConfigPath() : getConfigPath(cwd);\n\n // Ensure file exists\n if (!existsSync(configPath)) {\n const dir = dirname(configPath);\n await mkdir(dir, { recursive: true });\n await writeFile(configPath, '{}', 'utf-8');\n }\n\n const config = (await readJson<Record<string, unknown>>(configPath)) ?? {};\n\n const parsedValue = parseConfigValue(value);\n\n setNestedValue(config, key, parsedValue);\n\n await saveJson(configPath, config);\n\n return { key, value: parsedValue, scope: opts?.global ? 'global' : 'project' };\n}\n\n// ---------------------------------------------------------------------------\n// Strictness Presets (@task T067)\n// ---------------------------------------------------------------------------\n\n/** Valid preset names. */\nexport type StrictnessPreset = 'strict' | 'standard' | 'minimal';\n\n/** A preset definition: the config keys it sets and a human description. */\nexport interface PresetDefinition {\n /** Short summary of what this preset enforces. */\n description: string;\n /** Flat dot-notation key/value pairs applied to project config. */\n values: Record<string, unknown>;\n}\n\n/**\n * All three strictness presets.\n *\n * strict \u2014 block on missing AC, require sessions, enforce lifecycle pipeline\n * standard \u2014 warn on missing AC, optional sessions, advisory pipeline\n * minimal \u2014 no AC checking, no session requirement, lifecycle off\n */\nexport const STRICTNESS_PRESETS: Record<StrictnessPreset, PresetDefinition> = {\n strict: {\n description:\n 'Block on missing acceptance criteria, require sessions, enforce lifecycle pipeline.',\n values: {\n 'session.autoStart': false,\n 'session.requireNotes': true,\n 'session.multiSession': false,\n 'enforcement.acceptance.mode': 'block',\n 'lifecycle.mode': 'strict',\n },\n },\n standard: {\n description:\n 'Warn on missing acceptance criteria, optional sessions, advisory lifecycle pipeline.',\n values: {\n 'session.autoStart': false,\n 'session.requireNotes': false,\n 'session.multiSession': true,\n 'enforcement.acceptance.mode': 'warn',\n 'lifecycle.mode': 'advisory',\n },\n },\n minimal: {\n description: 'No acceptance criteria checking, no session requirement, lifecycle pipeline off.',\n values: {\n 'session.autoStart': false,\n 'session.requireNotes': false,\n 'session.multiSession': true,\n 'enforcement.acceptance.mode': 'off',\n 'lifecycle.mode': 'off',\n },\n },\n};\n\n/** Result of applying a preset. */\nexport interface ApplyPresetResult {\n preset: StrictnessPreset;\n description: string;\n applied: Record<string, unknown>;\n scope: 'project' | 'global';\n}\n\n/**\n * Apply a strictness preset to the project (or global) config.\n * Merges preset values over existing config \u2014 keys not covered by the preset\n * are preserved unchanged.\n * Idempotent: applying the same preset twice yields the same config.\n *\n * @task T067\n */\nexport async function applyStrictnessPreset(\n preset: StrictnessPreset,\n cwd?: string,\n opts?: { global?: boolean },\n): Promise<ApplyPresetResult> {\n const definition = STRICTNESS_PRESETS[preset];\n const configPath = opts?.global ? getGlobalConfigPath() : getConfigPath(cwd);\n\n // Ensure config file exists\n if (!existsSync(configPath)) {\n const dir = dirname(configPath);\n await mkdir(dir, { recursive: true });\n await writeFile(configPath, '{}', 'utf-8');\n }\n\n const config = (await readJson<Record<string, unknown>>(configPath)) ?? {};\n\n // Apply each preset key via dot-notation setter\n for (const [key, value] of Object.entries(definition.values)) {\n setNestedValue(config, key, value);\n }\n\n await saveJson(configPath, config);\n\n return {\n preset,\n description: definition.description,\n applied: definition.values,\n scope: opts?.global ? 'global' : 'project',\n };\n}\n\n/**\n * List all available presets with their descriptions and values.\n * Used by the CLI help output.\n *\n * @task T067\n */\nexport function listStrictnessPresets(): Array<{\n name: StrictnessPreset;\n description: string;\n values: Record<string, unknown>;\n}> {\n return (Object.entries(STRICTNESS_PRESETS) as Array<[StrictnessPreset, PresetDefinition]>).map(\n ([name, def]) => ({\n name,\n description: def.description,\n values: def.values,\n }),\n );\n}\n", "/**\n * Local embedding provider using @huggingface/transformers (transformers.js v4).\n *\n * Implements the EmbeddingProvider interface for brain memory vector search.\n * Uses all-MiniLM-L6-v2 (22MB, 384 dimensions) \u2014 matches the brain_embeddings\n * vec0 table schema. Model downloads on first call and is cached locally by\n * the transformers library.\n *\n * @epic T134\n * @task T136\n * @why Ship vector search out-of-the-box without external API keys\n * @what Local embedding provider using @huggingface/transformers all-MiniLM-L6-v2\n * @remarks Brain embeddings are a FIRST-CLASS CLEO feature \u2014 the transformers\n * package is a regular dependency of `@cleocode/core`, not optional.\n * Migrated from `@xenova/transformers` v2 to `@huggingface/transformers`\n * v4 (upstream rename, same author) which drops the deprecated\n * `prebuild-install` transitive via `sharp@0.34+`.\n */\n\nimport type { EmbeddingProvider } from './brain-embedding.js';\nimport { EMBEDDING_DIMENSIONS } from './brain-embedding.js';\n\n/** Model identifier for all-MiniLM-L6-v2 via Xenova hub. */\nconst MODEL_NAME = 'Xenova/all-MiniLM-L6-v2';\n\n/** Pipeline singleton \u2014 initialized lazily on first call. */\nlet _pipeline: import('@huggingface/transformers').FeatureExtractionPipeline | null = null;\n\n/** Whether the pipeline has been successfully initialized. */\nlet _ready = false;\n\n/**\n * Load the transformers feature-extraction pipeline lazily.\n * Dynamic import prevents the heavy model from loading unless embedding is enabled.\n */\nasync function loadPipeline(): Promise<void> {\n if (_ready) return;\n // Dynamic import \u2014 only resolves when embedding is explicitly enabled\n const { pipeline } = await import('@huggingface/transformers');\n _pipeline = await pipeline('feature-extraction', MODEL_NAME);\n _ready = true;\n}\n\n/**\n * Local embedding provider backed by @huggingface/transformers.\n *\n * Produces 384-dimension Float32Array vectors compatible with the\n * brain_embeddings vec0 table. The model is downloaded on first use\n * and cached locally by the transformers library.\n *\n * Use {@link initDefaultProvider} (in brain-embedding.ts) to register an\n * instance when brain.embedding.enabled=true and\n * brain.embedding.provider='local'.\n */\nexport class LocalEmbeddingProvider implements EmbeddingProvider {\n /** Number of dimensions produced \u2014 must match brain_embeddings vec0 table. */\n readonly dimensions = EMBEDDING_DIMENSIONS;\n\n /**\n * Whether the pipeline has been successfully initialized and is ready to produce embeddings.\n */\n isAvailable(): boolean {\n return _ready;\n }\n\n /**\n * Convert a single text string into a 384-dimension float vector.\n * Triggers model download on first call if not already cached.\n *\n * @param text - The text to embed.\n * @returns A Float32Array of length 384.\n */\n async embed(text: string): Promise<Float32Array> {\n await loadPipeline();\n const output = await _pipeline!(text, { pooling: 'mean', normalize: true });\n // output.data is DataArray (AnyTypedArray | any[]). For feature-extraction\n // with all-MiniLM-L6-v2, the runtime value is always Float32Array. Copy via\n // Float32Array constructor which accepts any iterable of numbers.\n return Float32Array.from(output.data as Float32Array);\n }\n\n /**\n * Embed multiple texts in sequence, reusing the cached pipeline.\n *\n * @param texts - Array of text strings to embed.\n * @returns Array of Float32Array vectors, one per input text.\n */\n async embedBatch(texts: string[]): Promise<Float32Array[]> {\n await loadPipeline();\n const results: Float32Array[] = [];\n for (const text of texts) {\n const output = await _pipeline!(text, { pooling: 'mean', normalize: true });\n results.push(Float32Array.from(output.data as Float32Array));\n }\n return results;\n }\n}\n\n/** Module-level singleton instance. */\nlet _instance: LocalEmbeddingProvider | null = null;\n\n/**\n * Get or create the shared LocalEmbeddingProvider singleton.\n *\n * @returns The shared LocalEmbeddingProvider instance.\n */\nexport function getLocalEmbeddingProvider(): LocalEmbeddingProvider {\n if (!_instance) {\n _instance = new LocalEmbeddingProvider();\n }\n return _instance;\n}\n", "/**\n * Brain Embedding System\n *\n * Provides text-to-vector embedding for semantic search in brain.db.\n * Uses a pluggable provider interface \u2014 real model integration\n * (e.g. @huggingface/transformers with all-MiniLM-L6-v2) is separate\n * from the embedding pipeline. When no provider is set, the system\n * falls back to FTS5-only search gracefully.\n *\n * @epic T5149\n * @task T5386\n */\n\n/** Contract for embedding providers (local models, API services, etc.). */\nexport interface EmbeddingProvider {\n /** Convert text into a fixed-dimension float vector. */\n embed(text: string): Promise<Float32Array>;\n /** Number of dimensions the provider produces. Must match vec0 table. */\n readonly dimensions: number;\n /** Whether the provider is ready to produce embeddings. */\n isAvailable(): boolean;\n}\n\n/** Matches the brain_embeddings vec0 table: FLOAT[384]. */\nexport const EMBEDDING_DIMENSIONS = 384;\n\nlet currentProvider: EmbeddingProvider | null = null;\n\n/**\n * Register an embedding provider for the brain system.\n * Validates that the provider's dimensions match the vec0 table.\n *\n * @throws Error if provider dimensions do not match EMBEDDING_DIMENSIONS\n */\nexport function setEmbeddingProvider(provider: EmbeddingProvider): void {\n if (provider.dimensions !== EMBEDDING_DIMENSIONS) {\n throw new Error(\n `Embedding provider dimensions (${provider.dimensions}) do not match vec0 table (${EMBEDDING_DIMENSIONS})`,\n );\n }\n currentProvider = provider;\n}\n\n/** Get the currently registered embedding provider, or null. */\nexport function getEmbeddingProvider(): EmbeddingProvider | null {\n return currentProvider;\n}\n\n/** Clear the current embedding provider (useful for testing). */\nexport function clearEmbeddingProvider(): void {\n currentProvider = null;\n}\n\n/**\n * Embed text into a float vector using the registered provider.\n * Returns null when no provider is set or not available (FTS5-only fallback).\n */\nexport async function embedText(text: string): Promise<Float32Array | null> {\n if (!currentProvider?.isAvailable()) return null;\n return currentProvider.embed(text);\n}\n\n/** Check whether embedding is currently available. */\nexport function isEmbeddingAvailable(): boolean {\n return currentProvider?.isAvailable() ?? false;\n}\n\n/**\n * Initialize the default local embedding provider.\n *\n * Loads the LocalEmbeddingProvider dynamically and registers it via\n * setEmbeddingProvider(). Should be called once at startup when\n * `brain.embedding.enabled` is true.\n *\n * Uses dynamic import to avoid loading the heavy @huggingface/transformers\n * bundle unless embedding is actually requested.\n *\n * @task T136 @epic T134\n */\nexport async function initDefaultProvider(): Promise<void> {\n const { LocalEmbeddingProvider } = await import('./embedding-local.js');\n const provider = new LocalEmbeddingProvider();\n setEmbeddingProvider(provider);\n}\n", "/**\n * SQLite store for brain.db via drizzle-orm/node-sqlite + node:sqlite (DatabaseSync).\n *\n * Separate database from tasks.db for cognitive infrastructure (decisions,\n * patterns, learnings). Follows the same singleton + WAL + migration pattern\n * as sqlite.ts.\n *\n * @epic T5149\n * @task T5128\n */\n\nimport { mkdirSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { dirname, join } from 'node:path';\n// Type-only import for annotations. The runtime node:sqlite loading is handled\n// by openNativeDatabase() in sqlite.ts.\nimport type { DatabaseSync } from 'node:sqlite';\nimport { fileURLToPath } from 'node:url';\nimport type { NodeSQLiteDatabase } from 'drizzle-orm/node-sqlite';\nimport { drizzle } from 'drizzle-orm/node-sqlite';\nimport { getCleoDirAbsolute } from '../paths.js';\nimport * as brainSchema from './memory-schema.js';\nimport {\n createSafetyBackup,\n ensureColumns,\n migrateWithRetry,\n reconcileJournal,\n tableExists,\n} from './migration-manager.js';\nimport { openNativeDatabase } from './sqlite.js';\n\nconst _require = createRequire(import.meta.url);\n\n/** Database file name within .cleo/ directory. */\nconst DB_FILENAME = 'brain.db';\n\n/** Schema version for newly created brain databases. Single source of truth. */\nexport const BRAIN_SCHEMA_VERSION = '1.0.0';\n\n/** Singleton state for lazy initialization. */\nlet _db: NodeSQLiteDatabase<typeof brainSchema> | null = null;\nlet _nativeDb: DatabaseSync | null = null;\nlet _dbPath: string | null = null;\n/** Guard against concurrent initialization (async migration). */\nlet _initPromise: Promise<NodeSQLiteDatabase<typeof brainSchema>> | null = null;\n/** Whether sqlite-vec extension loaded successfully. */\nlet _vecLoaded = false;\n\n/**\n * Get the path to the brain.db SQLite database file.\n */\nexport function getBrainDbPath(cwd?: string): string {\n return join(getCleoDirAbsolute(cwd), DB_FILENAME);\n}\n\n/**\n * Resolve the path to the drizzle-brain migrations folder.\n * Works from both src/ (dev via tsx) and dist/ (compiled via esbuild bundle).\n *\n * - Source layout: __dirname = src/store/ \u2192 need ../../migrations/drizzle-brain\n * - Bundled layout: __dirname = dist/ \u2192 need ../migrations/drizzle-brain\n */\nexport function resolveBrainMigrationsFolder(): string {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const isBundled = __dirname.endsWith('/dist') || __dirname.endsWith('\\\\dist');\n const pkgRoot = isBundled ? join(__dirname, '..') : join(__dirname, '..', '..');\n return join(pkgRoot, 'migrations', 'drizzle-brain');\n}\n\n// tableExists \u2014 delegated to migration-manager.ts (T132)\n\n/**\n * Run drizzle migrations to create/update brain.db tables.\n *\n * Delegates to shared migration-manager.ts for journal reconciliation,\n * retry logic, and safety backups. See T132 for consolidation rationale.\n *\n * @task T5128\n * @task T132 - Unified migration system\n */\nfunction runBrainMigrations(\n nativeDb: DatabaseSync,\n db: NodeSQLiteDatabase<typeof brainSchema>,\n): void {\n const migrationsFolder = resolveBrainMigrationsFolder();\n\n // Safety backup before any migration work\n if (tableExists(nativeDb, 'brain_decisions') && _dbPath) {\n createSafetyBackup(_dbPath);\n }\n\n // Bootstrap baseline + reconcile stale journal entries\n reconcileJournal(nativeDb, migrationsFolder, 'brain_decisions', 'brain');\n\n // Run pending migrations with SQLITE_BUSY retry.\n // Pass nativeDb + existenceTable so migrateWithRetry can auto-reconcile any\n // partial migration (Scenario 3) that slips through the proactive check above.\n migrateWithRetry(db, migrationsFolder, nativeDb, 'brain_decisions', 'brain');\n\n // T632 root-cause fix (complete): the migration journal reconciler (Sub-case B)\n // uses a per-migration DDL probe (probeAndMarkApplied in migration-manager.ts)\n // instead of wholesale-marking-all-applied. ALTER TABLE ADD COLUMN migrations\n // (T417 agent, T528 graph schema, T531 quality-score, T549 tiered-memory, etc.)\n // now run correctly when their columns are missing \u2014 the reconciler leaves them\n // unjournaled so Drizzle's migrate() runs the DDL.\n //\n // The ensureColumns band-aids for T528/T531/T549 were removed here as part of\n // T632 because all their columns are covered by Drizzle migration files. If a\n // schema regression recurs, debug probeAndMarkApplied in migration-manager.ts \u2014\n // do NOT add new band-aids here.\n //\n // ensureColumns below are retained ONLY for columns that have NO corresponding\n // Drizzle migration file (self-healing DDL only \u2014 see each comment).\n\n // T626-M1: Normalize co_retrieved edge type \u2014 idempotent safety-net UPDATE.\n // The shipped Hebbian strengthener emitted edge_type = 'relates_to' instead of\n // 'co_retrieved'. Relabel only rows from the consolidation provenance so no\n // semantic edges are affected. The Drizzle migration file does the same UPDATE;\n // this guard handles installs where the journal reconciler already marked\n // the migration applied before the SQL ran.\n //\n // T759: Guard provenance column existence before UPDATE. If T528 migration has\n // not yet run (e.g. on a fresh install where only the initial migration is\n // present), brain_page_edges will not have a provenance column and the UPDATE\n // will throw \"no such column: provenance\". ensureColumns adds the column if\n // missing so the UPDATE is always safe to execute.\n if (tableExists(nativeDb, 'brain_page_edges')) {\n ensureColumns(nativeDb, 'brain_page_edges', [{ name: 'provenance', ddl: 'text' }], 'brain');\n nativeDb\n .prepare(\n `UPDATE brain_page_edges\n SET edge_type = 'co_retrieved'\n WHERE edge_type = 'relates_to'\n AND provenance LIKE 'consolidation:%'`,\n )\n .run();\n }\n\n // T673-M1: STDP plasticity columns on brain_retrieval_log.\n // session_id was declared in the Drizzle schema but never applied to the live table.\n // reward_signal, retrieval_order, delta_ms are new additions per spec \u00A72.1.1.\n if (tableExists(nativeDb, 'brain_retrieval_log')) {\n ensureColumns(\n nativeDb,\n 'brain_retrieval_log',\n [\n { name: 'session_id', ddl: 'text' },\n { name: 'reward_signal', ddl: 'real' },\n { name: 'retrieval_order', ddl: 'integer' },\n { name: 'delta_ms', ddl: 'integer' },\n ],\n 'brain',\n );\n }\n\n // T673-M2: observability columns on brain_plasticity_events\n // session_id is declared in Drizzle schema and included in M2 CREATE TABLE IF NOT EXISTS,\n // but may be missing from installs where the table was created before M2.\n if (tableExists(nativeDb, 'brain_plasticity_events')) {\n ensureColumns(\n nativeDb,\n 'brain_plasticity_events',\n [\n { name: 'session_id', ddl: 'text' },\n { name: 'weight_before', ddl: 'real' },\n { name: 'weight_after', ddl: 'real' },\n { name: 'retrieval_log_id', ddl: 'integer' },\n { name: 'reward_signal', ddl: 'real' },\n { name: 'delta_t_ms', ddl: 'integer' },\n ],\n 'brain',\n );\n }\n\n // T673-M3: plasticity tracking columns on brain_page_edges\n ensureColumns(\n nativeDb,\n 'brain_page_edges',\n [\n { name: 'last_reinforced_at', ddl: 'text' },\n { name: 'reinforcement_count', ddl: 'integer NOT NULL DEFAULT 0' },\n { name: 'plasticity_class', ddl: \"text NOT NULL DEFAULT 'static'\" },\n { name: 'last_depressed_at', ddl: 'text' },\n { name: 'depression_count', ddl: 'integer NOT NULL DEFAULT 0' },\n { name: 'stability_score', ddl: 'real' },\n ],\n 'brain',\n );\n\n // T673-M3: seed co_retrieved edges as hebbian (idempotent)\n if (tableExists(nativeDb, 'brain_page_edges')) {\n nativeDb\n .prepare(\n `UPDATE brain_page_edges SET plasticity_class = 'hebbian'\n WHERE edge_type = 'co_retrieved' AND plasticity_class = 'static'`,\n )\n .run();\n }\n\n // T673-M4: new plasticity infrastructure tables \u2014 self-healing CREATE IF NOT EXISTS.\n // These guards ensure the tables exist even on installs where the Drizzle migration\n // journal was already partially applied. All three tables are CREATE IF NOT EXISTS\n // so re-running is safe.\n nativeDb.exec(\n `CREATE TABLE IF NOT EXISTS brain_weight_history (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n edge_from_id TEXT NOT NULL,\n edge_to_id TEXT NOT NULL,\n edge_type TEXT NOT NULL,\n weight_before REAL,\n weight_after REAL NOT NULL,\n delta_weight REAL NOT NULL,\n event_kind TEXT NOT NULL,\n source_plasticity_event_id INTEGER,\n retrieval_log_id INTEGER,\n reward_signal REAL,\n changed_at TEXT NOT NULL DEFAULT (datetime('now'))\n )`,\n );\n nativeDb.exec(\n `CREATE INDEX IF NOT EXISTS idx_weight_history_edge\n ON brain_weight_history (edge_from_id, edge_to_id, edge_type)`,\n );\n nativeDb.exec(\n `CREATE INDEX IF NOT EXISTS idx_weight_history_changed_at\n ON brain_weight_history (changed_at)`,\n );\n\n nativeDb.exec(\n `CREATE TABLE IF NOT EXISTS brain_modulators (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n modulator_type TEXT NOT NULL,\n valence REAL NOT NULL,\n magnitude REAL NOT NULL DEFAULT 1.0,\n source_event_id TEXT,\n session_id TEXT,\n description TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n )`,\n );\n nativeDb.exec(\n `CREATE INDEX IF NOT EXISTS idx_modulators_session\n ON brain_modulators (session_id)`,\n );\n\n nativeDb.exec(\n `CREATE TABLE IF NOT EXISTS brain_consolidation_events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n trigger TEXT NOT NULL,\n session_id TEXT,\n step_results_json TEXT NOT NULL,\n duration_ms INTEGER,\n succeeded INTEGER NOT NULL DEFAULT 1,\n started_at TEXT NOT NULL DEFAULT (datetime('now'))\n )`,\n );\n nativeDb.exec(\n `CREATE INDEX IF NOT EXISTS idx_consolidation_events_started_at\n ON brain_consolidation_events (started_at)`,\n );\n\n // T1002: brain_transcript_events \u2014 full-fidelity Claude session block store.\n // CREATE IF NOT EXISTS so re-runs on existing databases are safe.\n nativeDb.exec(\n `CREATE TABLE IF NOT EXISTS brain_transcript_events (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n seq INTEGER NOT NULL,\n role TEXT NOT NULL,\n block_type TEXT NOT NULL,\n content TEXT NOT NULL,\n tokens INTEGER,\n redacted_at TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n )`,\n );\n nativeDb.exec(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_transcript_events_session_seq\n ON brain_transcript_events (session_id, seq)`,\n );\n nativeDb.exec(\n `CREATE INDEX IF NOT EXISTS idx_transcript_events_session\n ON brain_transcript_events (session_id)`,\n );\n nativeDb.exec(\n `CREATE INDEX IF NOT EXISTS idx_transcript_events_role\n ON brain_transcript_events (role)`,\n );\n nativeDb.exec(\n `CREATE INDEX IF NOT EXISTS idx_transcript_events_block_type\n ON brain_transcript_events (block_type)`,\n );\n\n // T1001: stability_score column on brain_observations (distinct from brain_page_edges.stability_score).\n // Added via ensureColumns \u2014 idempotent, safe on existing databases.\n ensureColumns(\n nativeDb,\n 'brain_observations',\n [{ name: 'stability_score', ddl: 'real DEFAULT 0.5' }],\n 'brain',\n );\n\n // T1001: brain_promotion_log \u2014 typed promotion audit trail.\n // One row per observation evaluated (and promoted) by promoteObservationsToTyped().\n nativeDb.exec(\n `CREATE TABLE IF NOT EXISTS brain_promotion_log (\n id TEXT PRIMARY KEY,\n observation_id TEXT NOT NULL,\n from_tier TEXT NOT NULL,\n to_tier TEXT NOT NULL,\n score REAL NOT NULL,\n decided_at TEXT NOT NULL DEFAULT (datetime('now')),\n decided_by TEXT NOT NULL DEFAULT 'composite-scorer',\n rationale_json TEXT\n )`,\n );\n nativeDb.exec(\n `CREATE INDEX IF NOT EXISTS idx_promotion_log_observation\n ON brain_promotion_log (observation_id)`,\n );\n nativeDb.exec(\n `CREATE INDEX IF NOT EXISTS idx_promotion_log_decided_at\n ON brain_promotion_log (decided_at)`,\n );\n nativeDb.exec(\n `CREATE INDEX IF NOT EXISTS idx_promotion_log_to_tier\n ON brain_promotion_log (to_tier)`,\n );\n nativeDb.exec(\n `CREATE INDEX IF NOT EXISTS idx_promotion_log_score\n ON brain_promotion_log (score)`,\n );\n\n // T1003: brain_backfill_runs \u2014 staged backfill audit log.\n // CREATE IF NOT EXISTS so re-runs on existing databases are safe.\n // Staged rows are held in rollback_snapshot_json until approved/rolled-back.\n nativeDb.exec(\n `CREATE TABLE IF NOT EXISTS brain_backfill_runs (\n id TEXT PRIMARY KEY,\n kind TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'staged',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n approved_at TEXT,\n rows_affected INTEGER NOT NULL DEFAULT 0,\n rollback_snapshot_json TEXT,\n source TEXT NOT NULL DEFAULT 'unknown',\n target_table TEXT NOT NULL DEFAULT 'brain_observations',\n approved_by TEXT\n )`,\n );\n nativeDb.exec(\n `CREATE INDEX IF NOT EXISTS idx_backfill_runs_status\n ON brain_backfill_runs (status)`,\n );\n nativeDb.exec(\n `CREATE INDEX IF NOT EXISTS idx_backfill_runs_kind\n ON brain_backfill_runs (kind)`,\n );\n nativeDb.exec(\n `CREATE INDEX IF NOT EXISTS idx_backfill_runs_created_at\n ON brain_backfill_runs (created_at)`,\n );\n}\n\n/**\n * Load the sqlite-vec extension into a native DatabaseSync instance.\n * Returns true if the extension loaded successfully, false otherwise.\n *\n * The extension enables vec0 virtual tables for vector similarity search.\n * Requires the database to be opened with allowExtension: true.\n *\n * @task T5157\n */\nfunction loadBrainVecExtension(nativeDb: DatabaseSync): boolean {\n try {\n const sqliteVec = _require('sqlite-vec') as { load: (db: DatabaseSync) => void };\n sqliteVec.load(nativeDb);\n return true;\n } catch {\n // sqlite-vec not available or failed to load \u2014 non-fatal\n return false;\n }\n}\n\n/**\n * Create the vec0 virtual table for brain embeddings.\n * Called after migrations complete and sqlite-vec extension is loaded.\n *\n * The vec0 table is not managed by Drizzle (virtual tables are not\n * supported by drizzle-orm's SQLite schema). Created via raw SQL.\n *\n * @task T5157\n */\nfunction initializeBrainVec(nativeDb: DatabaseSync): void {\n nativeDb\n .prepare(\n 'CREATE VIRTUAL TABLE IF NOT EXISTS brain_embeddings USING vec0(id TEXT PRIMARY KEY, embedding FLOAT[384])',\n )\n .run();\n}\n\n/**\n * Check whether the sqlite-vec extension is loaded for the current brain.db.\n */\nexport function isBrainVecLoaded(): boolean {\n return _vecLoaded;\n}\n\n/**\n * Initialize the default embedding provider when brain.embedding.enabled is true.\n *\n * Called asynchronously after getBrainDb() completes its synchronous setup.\n * Uses dynamic import to avoid circular dependencies and keep the heavy\n * @huggingface/transformers bundle out of the critical startup path.\n *\n * Best-effort: errors are swallowed by the caller so DB access is never blocked.\n *\n * @task T539\n */\nasync function initEmbeddingProvider(cwd?: string): Promise<void> {\n try {\n const { loadConfig } = await import('../config.js');\n const config = await loadConfig(cwd);\n if (config.brain?.embedding?.enabled) {\n const { initDefaultProvider } = await import('../memory/brain-embedding.js');\n await initDefaultProvider();\n }\n } catch {\n // Config load or provider init failed \u2014 non-fatal, embedding stays unavailable\n }\n}\n\n/**\n * Initialize the brain.db SQLite database (lazy, singleton).\n * Creates the database file and tables if they don't exist.\n * Returns the drizzle ORM instance (async via sqlite-proxy).\n *\n * Uses a promise guard so concurrent callers wait for the same\n * initialization to complete (migrations are async).\n */\nexport async function getBrainDb(cwd?: string): Promise<NodeSQLiteDatabase<typeof brainSchema>> {\n const requestedPath = getBrainDbPath(cwd);\n\n // If singleton exists but points to different path, reset it\n if (_db && _dbPath !== requestedPath) {\n resetBrainDbState();\n }\n\n if (_db) return _db;\n\n // If already initializing, wait for the in-flight init\n if (_initPromise) return _initPromise;\n\n _initPromise = (async () => {\n const dbPath = requestedPath;\n _dbPath = dbPath;\n\n // Ensure directory exists\n mkdirSync(dirname(dbPath), { recursive: true });\n\n // Open file-backed SQLite via node:sqlite with WAL mode.\n // allowExtension: true enables sqlite-vec extension loading.\n const nativeDb = openNativeDatabase(dbPath, { allowExtension: true });\n _nativeDb = nativeDb;\n\n // Load sqlite-vec extension for vector similarity search (T5157).\n // Non-fatal if unavailable \u2014 vec0 tables simply won't be created.\n _vecLoaded = loadBrainVecExtension(nativeDb);\n\n // Create drizzle ORM wrapper via node-sqlite\n const db = drizzle({ client: nativeDb, schema: brainSchema });\n\n // Run drizzle migrations (creates/updates tables)\n runBrainMigrations(nativeDb, db);\n\n // Create vec0 virtual table for embeddings if extension is loaded (T5157).\n // Must run after migrations so the schema is consistent.\n if (_vecLoaded) {\n initializeBrainVec(nativeDb);\n }\n\n // Seed schema version for new databases (no-op if already set)\n nativeDb\n .prepare(\n `INSERT OR IGNORE INTO brain_schema_meta (key, value) VALUES ('schemaVersion', '${BRAIN_SCHEMA_VERSION}')`,\n )\n .run();\n\n // Set singleton only after migrations complete\n _db = db;\n\n // Wire the default embedding provider when vec is loaded and embedding is enabled.\n // Best-effort, async, never blocks DB access. (T539)\n if (_vecLoaded) {\n setImmediate(() => {\n initEmbeddingProvider(cwd).catch(() => {\n // Non-fatal \u2014 embedding will be unavailable until next startup\n });\n });\n }\n\n return db;\n })();\n\n try {\n return await _initPromise;\n } finally {\n _initPromise = null;\n }\n}\n\n/**\n * Close the brain.db database connection and release resources.\n */\nexport function closeBrainDb(): void {\n if (_nativeDb) {\n try {\n if (_nativeDb.isOpen) {\n _nativeDb.close();\n }\n } catch {\n // Ignore close errors\n }\n _nativeDb = null;\n }\n _db = null;\n _dbPath = null;\n _vecLoaded = false;\n}\n\n/**\n * Reset brain.db singleton state without saving.\n * Used during tests or when database file is recreated.\n * Safe to call multiple times.\n */\nexport function resetBrainDbState(): void {\n if (_nativeDb) {\n try {\n if (_nativeDb.isOpen) {\n _nativeDb.close();\n }\n } catch {\n // Ignore close errors\n }\n _nativeDb = null;\n }\n _db = null;\n _dbPath = null;\n _initPromise = null;\n _vecLoaded = false;\n}\n\n/**\n * Get the underlying node:sqlite DatabaseSync instance for brain.db.\n * Useful for direct PRAGMA calls or raw SQL operations.\n * Returns null if the database hasn't been initialized.\n */\nexport function getBrainNativeDb(): DatabaseSync | null {\n return _nativeDb;\n}\n\nexport type { NodeSQLiteDatabase };\n/**\n * Re-export brain schema for external use.\n */\nexport { brainSchema };\n", "/**\n * Brain graph back-fill \u2014 populates brain_page_nodes and brain_page_edges from\n * existing typed table rows (decisions, patterns, learnings, observations,\n * sticky notes).\n *\n * Each row in a typed table gets a corresponding node in brain_page_nodes.\n * Relationship edges are derived from:\n * - decision.contextTaskId / contextEpicId \u2192 applies_to edges\n * - observation.sourceSessionId \u2192 produced_by edge\n * - observation text referencing task IDs \u2192 applies_to edges\n * - pattern entries \u2192 derived_from stubs\n *\n * Stub nodes (task:<id>, session:<id>, epic:<id>) are created for referenced\n * external entities so edges have valid targets.\n *\n * Duplicate nodes are silently skipped (INSERT OR IGNORE semantics via\n * Drizzle onConflictDoNothing).\n *\n * T1003: Staged backfill functions (stagedBackfillRun, approveBackfillRun,\n * rollbackBackfillRun, listBackfillRuns) are appended below the graph\n * back-fill core. Staged runs write row IDs to brain_backfill_runs first;\n * actual mutations happen only on approve.\n *\n * @task T530\n * @epic T523\n */\n\nimport { createHash, randomBytes } from 'node:crypto';\nimport { getBrainAccessor } from '../store/memory-accessor.js';\nimport type {\n BrainBackfillRunRow,\n BrainDecisionRow,\n BrainLearningRow,\n BrainObservationRow,\n BrainPatternRow,\n NewBrainPageEdgeRow,\n NewBrainPageNodeRow,\n} from '../store/memory-schema.js';\nimport * as brainSchema from '../store/memory-schema.js';\nimport { getBrainDb, getBrainNativeDb } from '../store/memory-sqlite.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Result returned by backfillBrainGraph. */\nexport interface BrainBackfillResult {\n /** Counts before the back-fill ran. */\n before: {\n nodes: number;\n edges: number;\n decisions: number;\n patterns: number;\n learnings: number;\n observations: number;\n stickyNotes: number;\n };\n /** Counts after the back-fill ran. */\n after: {\n nodes: number;\n edges: number;\n };\n /** Number of nodes inserted during this run. */\n nodesInserted: number;\n /** Number of edges inserted during this run. */\n edgesInserted: number;\n /** Number of stub nodes created for external references (tasks, sessions, epics). */\n stubsCreated: number;\n /** Node counts broken down by type. */\n byType: Record<string, number>;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Return the SHA-256 prefix (first 16 hex chars) of the given content string.\n * Normalises to lowercase and trims before hashing to improve dedup accuracy.\n */\nfunction sha256prefix(content: string): string {\n return createHash('sha256').update(content.trim().toLowerCase()).digest('hex').substring(0, 16);\n}\n\n/**\n * Compute quality score for a decision row.\n * High confidence \u2192 0.9, medium \u2192 0.7, low \u2192 0.5.\n */\nfunction computeDecisionQuality(decision: BrainDecisionRow): number {\n switch (decision.confidence) {\n case 'high':\n return 0.9;\n case 'medium':\n return 0.7;\n default:\n return 0.5;\n }\n}\n\n/**\n * Compute quality score for a pattern row.\n * Composite: base 0.4 + frequency factor + success-rate factor.\n * Capped at 0.9 to reserve 1.0 for canonical external references.\n */\nfunction computePatternQuality(pattern: BrainPatternRow): number {\n const freqFactor = Math.min(0.3, (pattern.frequency ?? 1) * 0.05);\n const successFactor = (pattern.successRate ?? 0) * 0.3;\n return Math.min(0.9, 0.4 + freqFactor + successFactor);\n}\n\n/**\n * Compute quality score for a learning row.\n * Maps the stored 0.0\u20131.0 confidence directly to quality, capped at 0.9.\n */\nfunction computeLearningQuality(learning: BrainLearningRow): number {\n return Math.min(0.9, learning.confidence ?? 0.5);\n}\n\n/**\n * Compute quality score for an observation row.\n * Manual entries are highest quality (0.8), agent-generated 0.7, others 0.5.\n */\nfunction computeObservationQuality(observation: BrainObservationRow): number {\n switch (observation.sourceType) {\n case 'manual':\n return 0.8;\n case 'agent':\n case 'session-debrief':\n return 0.7;\n default:\n return 0.5;\n }\n}\n\n/**\n * Extract task IDs referenced in a block of text.\n * Matches T followed by 3\u20136 digits (e.g. T530, T5160).\n */\nfunction extractTaskRefs(text: string): string[] {\n const matches = text.match(/\\bT\\d{3,6}\\b/g);\n if (!matches) return [];\n return [...new Set(matches)];\n}\n\n// ============================================================================\n// Core back-fill function\n// ============================================================================\n\n/**\n * Back-fill brain_page_nodes and brain_page_edges from all existing typed rows\n * in brain.db.\n *\n * Safe to run multiple times \u2014 duplicate nodes and edges are silently ignored\n * via INSERT OR IGNORE semantics.\n *\n * @param projectRoot - Absolute path to the project root (contains .cleo/).\n * @returns BackfillResult with before/after counts and insertion stats.\n */\nexport async function backfillBrainGraph(projectRoot: string): Promise<BrainBackfillResult> {\n const db = await getBrainDb(projectRoot);\n const accessor = await getBrainAccessor(projectRoot);\n\n // \u2500\u2500 Before counts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const [beforeNodes, beforeEdges] = await Promise.all([\n db.select({ count: brainSchema.brainPageNodes.id }).from(brainSchema.brainPageNodes),\n db.select({ count: brainSchema.brainPageEdges.fromId }).from(brainSchema.brainPageEdges),\n ]);\n\n const [decisions, patterns, learnings, observations, stickyNotes] = await Promise.all([\n accessor.findDecisions(),\n accessor.findPatterns(),\n accessor.findLearnings(),\n accessor.findObservations(),\n accessor.findStickyNotes(),\n ]);\n\n const beforeNodeCount = beforeNodes.length;\n const beforeEdgeCount = beforeEdges.length;\n\n // \u2500\u2500 Tracking state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n let nodesInserted = 0;\n let edgesInserted = 0;\n let stubsCreated = 0;\n\n // Track stub nodes we've already created to avoid duplicates\n const createdStubs = new Set<string>();\n\n // Accumulate pending inserts for batch efficiency\n const pendingNodes: NewBrainPageNodeRow[] = [];\n const pendingEdges: NewBrainPageEdgeRow[] = [];\n\n const now = new Date().toISOString().replace('T', ' ').slice(0, 19);\n\n /** Ensure a stub node exists for an external reference (task, session, epic). */\n function scheduleStub(\n nodeId: string,\n nodeType: 'task' | 'session' | 'epic',\n label: string,\n ): void {\n if (createdStubs.has(nodeId)) return;\n createdStubs.add(nodeId);\n pendingNodes.push({\n id: nodeId,\n nodeType,\n label: label.substring(0, 200),\n qualityScore: 1.0,\n contentHash: null,\n lastActivityAt: now,\n metadataJson: null,\n createdAt: now,\n updatedAt: null,\n });\n }\n\n /** Schedule an edge insert (deduped by fromId+toId+edgeType within this run). */\n const edgeSet = new Set<string>();\n function scheduleEdge(edge: NewBrainPageEdgeRow): void {\n const key = `${edge.fromId}|${edge.toId}|${edge.edgeType}`;\n if (edgeSet.has(key)) return;\n edgeSet.add(key);\n pendingEdges.push(edge);\n }\n\n // \u2500\u2500 1. Decisions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const byType: Record<string, number> = {};\n\n for (const decision of decisions) {\n const nodeId = `decision:${decision.id}`;\n pendingNodes.push({\n id: nodeId,\n nodeType: 'decision',\n label: decision.decision.substring(0, 200),\n qualityScore: computeDecisionQuality(decision),\n contentHash: sha256prefix(decision.decision + (decision.rationale ?? '')),\n lastActivityAt: decision.updatedAt ?? decision.createdAt ?? now,\n metadataJson: JSON.stringify({\n type: decision.type,\n confidence: decision.confidence,\n outcome: decision.outcome,\n }),\n createdAt: decision.createdAt ?? now,\n updatedAt: decision.updatedAt ?? null,\n });\n byType['decision'] = (byType['decision'] ?? 0) + 1;\n\n // Decision \u2192 task applies_to edge\n if (decision.contextTaskId) {\n const taskNodeId = `task:${decision.contextTaskId}`;\n scheduleStub(taskNodeId, 'task', decision.contextTaskId);\n scheduleEdge({\n fromId: nodeId,\n toId: taskNodeId,\n edgeType: 'applies_to',\n weight: 1.0,\n provenance: 'backfill:decision.contextTaskId',\n createdAt: now,\n });\n }\n\n // Decision \u2192 epic applies_to edge\n if (decision.contextEpicId) {\n const epicNodeId = `epic:${decision.contextEpicId}`;\n scheduleStub(epicNodeId, 'epic', decision.contextEpicId);\n scheduleEdge({\n fromId: nodeId,\n toId: epicNodeId,\n edgeType: 'applies_to',\n weight: 0.9,\n provenance: 'backfill:decision.contextEpicId',\n createdAt: now,\n });\n }\n }\n\n // \u2500\u2500 2. Patterns \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n for (const pattern of patterns) {\n const nodeId = `pattern:${pattern.id}`;\n pendingNodes.push({\n id: nodeId,\n nodeType: 'pattern',\n label: pattern.pattern.substring(0, 200),\n qualityScore: computePatternQuality(pattern),\n contentHash: sha256prefix(pattern.pattern),\n lastActivityAt: pattern.updatedAt ?? pattern.extractedAt ?? now,\n metadataJson: JSON.stringify({\n type: pattern.type,\n frequency: pattern.frequency,\n impact: pattern.impact,\n }),\n createdAt: pattern.extractedAt ?? now,\n updatedAt: pattern.updatedAt ?? null,\n });\n byType['pattern'] = (byType['pattern'] ?? 0) + 1;\n\n // Patterns referencing tasks in their context field \u2192 derived_from edge\n if (pattern.context) {\n const taskRefs = extractTaskRefs(pattern.context);\n for (const taskId of taskRefs) {\n const taskNodeId = `task:${taskId}`;\n scheduleStub(taskNodeId, 'task', taskId);\n scheduleEdge({\n fromId: nodeId,\n toId: taskNodeId,\n edgeType: 'derived_from',\n weight: 0.7,\n provenance: 'backfill:pattern.context-task-ref',\n createdAt: now,\n });\n }\n }\n }\n\n // \u2500\u2500 3. Learnings \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n for (const learning of learnings) {\n const nodeId = `learning:${learning.id}`;\n pendingNodes.push({\n id: nodeId,\n nodeType: 'learning',\n label: learning.insight.substring(0, 200),\n qualityScore: computeLearningQuality(learning),\n contentHash: sha256prefix(learning.insight + (learning.source ?? '')),\n lastActivityAt: learning.updatedAt ?? learning.createdAt ?? now,\n metadataJson: JSON.stringify({\n confidence: learning.confidence,\n actionable: learning.actionable,\n source: learning.source,\n }),\n createdAt: learning.createdAt ?? now,\n updatedAt: learning.updatedAt ?? null,\n });\n byType['learning'] = (byType['learning'] ?? 0) + 1;\n }\n\n // \u2500\u2500 4. Observations \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n for (const observation of observations) {\n const nodeId = `observation:${observation.id}`;\n const labelSource =\n observation.title || observation.narrative?.substring(0, 200) || 'Untitled observation';\n pendingNodes.push({\n id: nodeId,\n nodeType: 'observation',\n label: labelSource.substring(0, 200),\n qualityScore: computeObservationQuality(observation),\n contentHash:\n observation.contentHash ?? sha256prefix(observation.narrative ?? observation.title ?? ''),\n lastActivityAt: observation.updatedAt ?? observation.createdAt ?? now,\n metadataJson: JSON.stringify({\n sourceType: observation.sourceType,\n agent: observation.agent,\n sessionId: observation.sourceSessionId,\n }),\n createdAt: observation.createdAt ?? now,\n updatedAt: observation.updatedAt ?? null,\n });\n byType['observation'] = (byType['observation'] ?? 0) + 1;\n\n // Observation \u2192 session produced_by edge\n if (observation.sourceSessionId) {\n const sessionNodeId = `session:${observation.sourceSessionId}`;\n scheduleStub(\n sessionNodeId,\n 'session',\n `Session ${observation.sourceSessionId.substring(0, 30)}`,\n );\n scheduleEdge({\n fromId: nodeId,\n toId: sessionNodeId,\n edgeType: 'produced_by',\n weight: 1.0,\n provenance: 'backfill:observation.sourceSessionId',\n createdAt: now,\n });\n }\n\n // Observation text \u2192 task applies_to edges\n const fullText = [observation.title, observation.subtitle, observation.narrative]\n .filter(Boolean)\n .join(' ');\n const taskRefs = extractTaskRefs(fullText);\n for (const taskId of taskRefs) {\n const taskNodeId = `task:${taskId}`;\n scheduleStub(taskNodeId, 'task', taskId);\n scheduleEdge({\n fromId: nodeId,\n toId: taskNodeId,\n edgeType: 'applies_to',\n weight: 0.8,\n provenance: 'backfill:observation.text-task-ref',\n createdAt: now,\n });\n }\n }\n\n // \u2500\u2500 5. Sticky Notes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n for (const sticky of stickyNotes) {\n const nodeId = `sticky:${sticky.id}`;\n const labelSource = sticky.content?.substring(0, 200) ?? 'Untitled sticky';\n pendingNodes.push({\n id: nodeId,\n nodeType: 'sticky',\n label: labelSource.substring(0, 200),\n qualityScore: 0.6,\n contentHash: sha256prefix(sticky.content ?? ''),\n lastActivityAt: sticky.updatedAt ?? sticky.createdAt ?? now,\n metadataJson: JSON.stringify({\n status: sticky.status,\n priority: sticky.priority,\n color: sticky.color,\n }),\n createdAt: sticky.createdAt ?? now,\n updatedAt: sticky.updatedAt ?? null,\n });\n byType['sticky'] = (byType['sticky'] ?? 0) + 1;\n\n // Sticky notes with task refs \u2192 applies_to edges\n if (sticky.content) {\n const taskRefs = extractTaskRefs(sticky.content);\n for (const taskId of taskRefs) {\n const taskNodeId = `task:${taskId}`;\n scheduleStub(taskNodeId, 'task', taskId);\n scheduleEdge({\n fromId: nodeId,\n toId: taskNodeId,\n edgeType: 'applies_to',\n weight: 0.7,\n provenance: 'backfill:sticky.content-task-ref',\n createdAt: now,\n });\n }\n }\n }\n\n // \u2500\u2500 Flush nodes (INSERT OR IGNORE) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const BATCH_SIZE = 50;\n\n for (let i = 0; i < pendingNodes.length; i += BATCH_SIZE) {\n const batch = pendingNodes.slice(i, i + BATCH_SIZE);\n await db.insert(brainSchema.brainPageNodes).values(batch).onConflictDoNothing();\n nodesInserted += batch.length;\n }\n\n // Stub nodes count\n stubsCreated = createdStubs.size;\n\n // \u2500\u2500 Flush edges (INSERT OR IGNORE) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n for (let i = 0; i < pendingEdges.length; i += BATCH_SIZE) {\n const batch = pendingEdges.slice(i, i + BATCH_SIZE);\n await db.insert(brainSchema.brainPageEdges).values(batch).onConflictDoNothing();\n edgesInserted += batch.length;\n }\n\n // \u2500\u2500 After counts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const [afterNodes, afterEdges] = await Promise.all([\n db.select({ id: brainSchema.brainPageNodes.id }).from(brainSchema.brainPageNodes),\n db.select({ fromId: brainSchema.brainPageEdges.fromId }).from(brainSchema.brainPageEdges),\n ]);\n\n return {\n before: {\n nodes: beforeNodeCount,\n edges: beforeEdgeCount,\n decisions: decisions.length,\n patterns: patterns.length,\n learnings: learnings.length,\n observations: observations.length,\n stickyNotes: stickyNotes.length,\n },\n after: {\n nodes: afterNodes.length,\n edges: afterEdges.length,\n },\n nodesInserted,\n edgesInserted,\n stubsCreated,\n byType,\n };\n}\n\n// ============================================================================\n// Staged Backfill (T1003)\n// ============================================================================\n\n/**\n * Generate a unique backfill run ID.\n * Format: `bfr-<base36-timestamp>-<random4hex>`\n */\nfunction generateRunId(): string {\n const ts = Date.now().toString(36);\n const rand = randomBytes(2).toString('hex');\n return `bfr-${ts}-${rand}`;\n}\n\n/**\n * Result of a staged backfill run creation.\n *\n * A staged run does NOT commit any rows to live tables. The caller must call\n * `approveBackfillRun` to commit or `rollbackBackfillRun` to discard.\n *\n * @task T1003\n */\nexport interface StagedBackfillRunResult {\n /** The new run record. */\n run: BrainBackfillRunRow;\n /**\n * True when no rows matched the source (run was staged with rowsAffected=0).\n * Callers may still approve or rollback a zero-row run.\n */\n empty: boolean;\n}\n\n/**\n * Stage a graph backfill run against brain_page_nodes / brain_page_edges.\n *\n * Discovers all candidate node IDs from typed tables (decisions, patterns,\n * learnings, observations, sticky notes) that are NOT yet in brain_page_nodes.\n * Writes the list to `rollback_snapshot_json` and creates a `brain_backfill_runs`\n * row with status='staged'. No rows are inserted into brain tables.\n *\n * Pass `source` as a human-readable descriptor (e.g. a file path or session ID).\n * Pass `kind` as the backfill kind (e.g. 'graph-backfill', 'observation-promotion').\n *\n * @param projectRoot - Absolute path to the project root.\n * @param opts - Optional overrides for source, kind, and target table.\n * @returns StagedBackfillRunResult with the staged run record.\n *\n * @task T1003\n */\nexport async function stagedBackfillRun(\n projectRoot: string,\n opts?: {\n source?: string;\n kind?: string;\n targetTable?: string;\n },\n): Promise<StagedBackfillRunResult> {\n const db = await getBrainDb(projectRoot);\n const accessor = await getBrainAccessor(projectRoot);\n\n const source = opts?.source ?? 'staged-run';\n const kind = opts?.kind ?? 'graph-backfill';\n const targetTable = opts?.targetTable ?? 'brain_page_nodes';\n\n // Gather candidate IDs not yet in brain_page_nodes\n const [decisions, patterns, learnings, observations, stickyNotes] = await Promise.all([\n accessor.findDecisions(),\n accessor.findPatterns(),\n accessor.findLearnings(),\n accessor.findObservations(),\n accessor.findStickyNotes(),\n ]);\n\n // Collect candidate node IDs\n const candidates: string[] = [\n ...decisions.map((d) => `decision:${d.id}`),\n ...patterns.map((p) => `pattern:${p.id}`),\n ...learnings.map((l) => `learning:${l.id}`),\n ...observations.map((o) => `observation:${o.id}`),\n ...stickyNotes.map((s) => `sticky:${s.id}`),\n ];\n\n // Filter out IDs already present in brain_page_nodes\n const existingNodes = await db\n .select({ id: brainSchema.brainPageNodes.id })\n .from(brainSchema.brainPageNodes);\n const existingSet = new Set(existingNodes.map((n) => n.id));\n const pendingIds = candidates.filter((id) => !existingSet.has(id));\n\n const runId = generateRunId();\n const now = new Date().toISOString().replace('T', ' ').slice(0, 19);\n\n const run: BrainBackfillRunRow = {\n id: runId,\n kind,\n status: 'staged',\n createdAt: now,\n approvedAt: null,\n rowsAffected: pendingIds.length,\n rollbackSnapshotJson: JSON.stringify(pendingIds),\n source,\n targetTable,\n approvedBy: null,\n };\n\n await db.insert(brainSchema.brainBackfillRuns).values(run);\n\n return {\n run,\n empty: pendingIds.length === 0,\n };\n}\n\n/**\n * Approve a staged backfill run, committing its rows to live brain tables.\n *\n * Reads the run record, validates that it is in 'staged' status, then triggers\n * `backfillBrainGraph` to perform the actual INSERT OR IGNORE work. Finally,\n * updates the run row to status='approved' with the current timestamp.\n *\n * Double-approve is idempotent: returns `{ alreadySettled: true }` if the run\n * is already approved or rolled-back.\n *\n * @param projectRoot - Absolute path to the project root.\n * @param runId - The brain_backfill_runs.id to approve.\n * @param approvedBy - Optional identity of the approver (defaults to 'owner').\n * @returns Result with the updated run record and graph backfill stats.\n *\n * @task T1003\n */\nexport async function approveBackfillRun(\n projectRoot: string,\n runId: string,\n approvedBy?: string,\n): Promise<{\n run: BrainBackfillRunRow;\n alreadySettled: boolean;\n backfillResult?: BrainBackfillResult;\n}> {\n await getBrainDb(projectRoot);\n const nativeDb = getBrainNativeDb();\n if (!nativeDb) {\n throw new Error('brain.db native handle unavailable');\n }\n\n interface RunRow {\n id: string;\n kind: string;\n status: string;\n created_at: string;\n approved_at: string | null;\n rows_affected: number;\n rollback_snapshot_json: string | null;\n source: string;\n target_table: string;\n approved_by: string | null;\n }\n\n const rawRun = nativeDb\n .prepare('SELECT * FROM brain_backfill_runs WHERE id = ? LIMIT 1')\n .get(runId) as unknown as RunRow | undefined;\n\n if (!rawRun) {\n throw new Error(`Backfill run '${runId}' not found`);\n }\n\n // If already settled, return as-is\n if (rawRun.status === 'approved' || rawRun.status === 'rolled-back') {\n const run = mapRunRow(rawRun);\n return { run, alreadySettled: true };\n }\n\n // Execute the actual backfill\n const backfillResult = await backfillBrainGraph(projectRoot);\n\n // Mark run as approved\n const now = new Date().toISOString().replace('T', ' ').slice(0, 19);\n const approver = approvedBy ?? 'owner';\n nativeDb\n .prepare(\n `UPDATE brain_backfill_runs\n SET status = 'approved', approved_at = ?, approved_by = ?\n WHERE id = ?`,\n )\n .run(now, approver, runId);\n\n // Re-fetch updated run\n const updatedRaw = nativeDb\n .prepare('SELECT * FROM brain_backfill_runs WHERE id = ? LIMIT 1')\n .get(runId) as unknown as RunRow;\n\n return {\n run: mapRunRow(updatedRaw),\n alreadySettled: false,\n backfillResult,\n };\n}\n\n/**\n * Rollback a staged backfill run, discarding staged rows.\n *\n * If the run is still 'staged', marks it as 'rolled-back' (no rows were ever\n * committed, so no DELETE is required).\n *\n * If the run is 'approved', reads `rollback_snapshot_json` and DELETEs the\n * committed rows from the target table, then marks the run as 'rolled-back'.\n *\n * Idempotent: rolling back an already-rolled-back run returns\n * `{ alreadySettled: true }` without error.\n *\n * @param projectRoot - Absolute path to the project root.\n * @param runId - The brain_backfill_runs.id to roll back.\n * @returns Result with the updated run record and optional delete count.\n *\n * @task T1003\n */\nexport async function rollbackBackfillRun(\n projectRoot: string,\n runId: string,\n): Promise<{\n run: BrainBackfillRunRow;\n alreadySettled: boolean;\n deletedRows: number;\n}> {\n await getBrainDb(projectRoot);\n const nativeDb = getBrainNativeDb();\n if (!nativeDb) {\n throw new Error('brain.db native handle unavailable');\n }\n\n interface RunRow {\n id: string;\n kind: string;\n status: string;\n created_at: string;\n approved_at: string | null;\n rows_affected: number;\n rollback_snapshot_json: string | null;\n source: string;\n target_table: string;\n approved_by: string | null;\n }\n\n const rawRun = nativeDb\n .prepare('SELECT * FROM brain_backfill_runs WHERE id = ? LIMIT 1')\n .get(runId) as unknown as RunRow | undefined;\n\n if (!rawRun) {\n throw new Error(`Backfill run '${runId}' not found`);\n }\n\n // Already rolled back \u2014 idempotent no-op\n if (rawRun.status === 'rolled-back') {\n return { run: mapRunRow(rawRun), alreadySettled: true, deletedRows: 0 };\n }\n\n let deletedRows = 0;\n\n // If already approved, we need to DELETE committed rows from the target table\n if (rawRun.status === 'approved' && rawRun.rollback_snapshot_json) {\n let ids: string[] = [];\n try {\n ids = JSON.parse(rawRun.rollback_snapshot_json) as string[];\n } catch {\n // Malformed snapshot \u2014 proceed without deleting\n }\n\n if (ids.length > 0) {\n const targetTable = rawRun.target_table;\n // Validate table name against known brain tables (prevent SQL injection)\n const allowedTables = [\n 'brain_page_nodes',\n 'brain_observations',\n 'brain_decisions',\n 'brain_patterns',\n 'brain_learnings',\n 'brain_transcript_events',\n ] as const;\n if ((allowedTables as readonly string[]).includes(targetTable)) {\n // SQLite has a limit of ~999 bound params \u2014 chunk if needed\n const CHUNK = 200;\n for (let i = 0; i < ids.length; i += CHUNK) {\n const chunk = ids.slice(i, i + CHUNK);\n const placeholders = chunk.map(() => '?').join(',');\n const result = nativeDb\n .prepare(`DELETE FROM ${targetTable} WHERE id IN (${placeholders})`)\n .run(...chunk) as { changes: number };\n deletedRows += result.changes ?? 0;\n }\n }\n }\n }\n\n // Mark run as rolled-back\n nativeDb.prepare(`UPDATE brain_backfill_runs SET status = 'rolled-back' WHERE id = ?`).run(runId);\n\n const updatedRaw = nativeDb\n .prepare('SELECT * FROM brain_backfill_runs WHERE id = ? LIMIT 1')\n .get(runId) as unknown as RunRow;\n\n return { run: mapRunRow(updatedRaw), alreadySettled: false, deletedRows };\n}\n\n/**\n * List backfill runs, optionally filtered by status.\n *\n * @param projectRoot - Absolute path to the project root.\n * @param opts - Optional status filter and limit.\n * @returns Array of run records, ordered by created_at DESC.\n *\n * @task T1003\n */\nexport async function listBackfillRuns(\n projectRoot: string,\n opts?: { status?: string; limit?: number },\n): Promise<BrainBackfillRunRow[]> {\n await getBrainDb(projectRoot);\n const nativeDb = getBrainNativeDb();\n if (!nativeDb) {\n throw new Error('brain.db native handle unavailable');\n }\n\n const limit = opts?.limit ?? 50;\n const status = opts?.status;\n\n interface RunRow {\n id: string;\n kind: string;\n status: string;\n created_at: string;\n approved_at: string | null;\n rows_affected: number;\n rollback_snapshot_json: string | null;\n source: string;\n target_table: string;\n approved_by: string | null;\n }\n\n let rawRows: RunRow[];\n if (status) {\n rawRows = nativeDb\n .prepare(\n `SELECT * FROM brain_backfill_runs WHERE status = ? ORDER BY created_at DESC LIMIT ?`,\n )\n .all(status, limit) as unknown as RunRow[];\n } else {\n rawRows = nativeDb\n .prepare(`SELECT * FROM brain_backfill_runs ORDER BY created_at DESC LIMIT ?`)\n .all(limit) as unknown as RunRow[];\n }\n\n return rawRows.map(mapRunRow);\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Map a raw SQLite row from brain_backfill_runs to a typed BrainBackfillRunRow.\n */\nfunction mapRunRow(raw: {\n id: string;\n kind: string;\n status: string;\n created_at: string;\n approved_at: string | null;\n rows_affected: number;\n rollback_snapshot_json: string | null;\n source: string;\n target_table: string;\n approved_by: string | null;\n}): BrainBackfillRunRow {\n return {\n id: raw.id,\n kind: raw.kind,\n status: raw.status,\n createdAt: raw.created_at,\n approvedAt: raw.approved_at,\n rowsAffected: raw.rows_affected,\n rollbackSnapshotJson: raw.rollback_snapshot_json,\n source: raw.source,\n targetTable: raw.target_table,\n approvedBy: raw.approved_by,\n };\n}\n", "/**\n * Data accessor for brain.db \u2014 CRUD operations for decisions, patterns,\n * learnings, and memory links.\n *\n * Wraps drizzle ORM queries over the brain.db singleton. All methods are\n * async (sqlite-proxy) and return typed rows from memory-schema.ts.\n *\n * @epic T5149\n * @task T5128\n */\n\nimport type { SQL } from 'drizzle-orm';\nimport { and, asc, desc, eq, gte, or } from 'drizzle-orm';\nimport type { NodeSQLiteDatabase } from 'drizzle-orm/node-sqlite';\nimport type {\n BrainConsolidationEventRow,\n BrainDecisionRow,\n BrainLearningRow,\n BrainMemoryLinkRow,\n BrainModulatorInsert,\n BrainModulatorRow,\n BrainObservationRow,\n BrainPageEdgeRow,\n BrainPageNodeRow,\n BrainPatternRow,\n BrainStickyNoteRow,\n BrainWeightHistoryInsert,\n BrainWeightHistoryRow,\n NewBrainDecisionRow,\n NewBrainLearningRow,\n NewBrainMemoryLinkRow,\n NewBrainObservationRow,\n NewBrainPageEdgeRow,\n NewBrainPageNodeRow,\n NewBrainPatternRow,\n NewBrainStickyNoteRow,\n} from './memory-schema.js';\nimport * as brainSchema from './memory-schema.js';\nimport { getBrainDb } from './memory-sqlite.js';\n\nexport class BrainDataAccessor {\n constructor(private db: NodeSQLiteDatabase<typeof brainSchema>) {}\n\n // =========================================================================\n // Decisions CRUD\n // =========================================================================\n\n async addDecision(row: NewBrainDecisionRow): Promise<BrainDecisionRow> {\n await this.db.insert(brainSchema.brainDecisions).values(row);\n const result = await this.db\n .select()\n .from(brainSchema.brainDecisions)\n .where(eq(brainSchema.brainDecisions.id, row.id));\n return result[0]!;\n }\n\n async getDecision(id: string): Promise<BrainDecisionRow | null> {\n const result = await this.db\n .select()\n .from(brainSchema.brainDecisions)\n .where(eq(brainSchema.brainDecisions.id, id));\n return result[0] ?? null;\n }\n\n async findDecisions(\n params: {\n type?: (typeof brainSchema.BRAIN_DECISION_TYPES)[number];\n confidence?: (typeof brainSchema.BRAIN_CONFIDENCE_LEVELS)[number];\n outcome?: (typeof brainSchema.BRAIN_OUTCOME_TYPES)[number];\n contextTaskId?: string;\n limit?: number;\n } = {},\n ): Promise<BrainDecisionRow[]> {\n const conditions: SQL[] = [];\n\n if (params.type) {\n conditions.push(eq(brainSchema.brainDecisions.type, params.type));\n }\n if (params.confidence) {\n conditions.push(eq(brainSchema.brainDecisions.confidence, params.confidence));\n }\n if (params.outcome) {\n conditions.push(eq(brainSchema.brainDecisions.outcome, params.outcome));\n }\n if (params.contextTaskId) {\n conditions.push(eq(brainSchema.brainDecisions.contextTaskId, params.contextTaskId));\n }\n\n let query = this.db\n .select()\n .from(brainSchema.brainDecisions)\n .orderBy(desc(brainSchema.brainDecisions.createdAt));\n\n if (conditions.length > 0) {\n query = query.where(and(...conditions)) as typeof query;\n }\n\n if (params.limit) {\n query = query.limit(params.limit) as typeof query;\n }\n\n return query;\n }\n\n async updateDecision(id: string, updates: Partial<NewBrainDecisionRow>): Promise<void> {\n await this.db\n .update(brainSchema.brainDecisions)\n .set({ ...updates, updatedAt: new Date().toISOString().replace('T', ' ').slice(0, 19) })\n .where(eq(brainSchema.brainDecisions.id, id));\n }\n\n // =========================================================================\n // Patterns CRUD\n // =========================================================================\n\n async addPattern(row: NewBrainPatternRow): Promise<BrainPatternRow> {\n await this.db.insert(brainSchema.brainPatterns).values(row);\n const result = await this.db\n .select()\n .from(brainSchema.brainPatterns)\n .where(eq(brainSchema.brainPatterns.id, row.id));\n return result[0]!;\n }\n\n async getPattern(id: string): Promise<BrainPatternRow | null> {\n const result = await this.db\n .select()\n .from(brainSchema.brainPatterns)\n .where(eq(brainSchema.brainPatterns.id, id));\n return result[0] ?? null;\n }\n\n async findPatterns(\n params: {\n type?: (typeof brainSchema.BRAIN_PATTERN_TYPES)[number];\n impact?: (typeof brainSchema.BRAIN_IMPACT_LEVELS)[number];\n minFrequency?: number;\n limit?: number;\n } = {},\n ): Promise<BrainPatternRow[]> {\n const conditions: SQL[] = [];\n\n if (params.type) {\n conditions.push(eq(brainSchema.brainPatterns.type, params.type));\n }\n if (params.impact) {\n conditions.push(eq(brainSchema.brainPatterns.impact, params.impact));\n }\n if (params.minFrequency !== undefined) {\n conditions.push(gte(brainSchema.brainPatterns.frequency, params.minFrequency));\n }\n\n let query = this.db\n .select()\n .from(brainSchema.brainPatterns)\n .orderBy(desc(brainSchema.brainPatterns.frequency));\n\n if (conditions.length > 0) {\n query = query.where(and(...conditions)) as typeof query;\n }\n\n if (params.limit) {\n query = query.limit(params.limit) as typeof query;\n }\n\n return query;\n }\n\n async updatePattern(id: string, updates: Partial<NewBrainPatternRow>): Promise<void> {\n await this.db\n .update(brainSchema.brainPatterns)\n .set({ ...updates, updatedAt: new Date().toISOString().replace('T', ' ').slice(0, 19) })\n .where(eq(brainSchema.brainPatterns.id, id));\n }\n\n // =========================================================================\n // Learnings CRUD\n // =========================================================================\n\n async addLearning(row: NewBrainLearningRow): Promise<BrainLearningRow> {\n await this.db.insert(brainSchema.brainLearnings).values(row);\n const result = await this.db\n .select()\n .from(brainSchema.brainLearnings)\n .where(eq(brainSchema.brainLearnings.id, row.id));\n return result[0]!;\n }\n\n async getLearning(id: string): Promise<BrainLearningRow | null> {\n const result = await this.db\n .select()\n .from(brainSchema.brainLearnings)\n .where(eq(brainSchema.brainLearnings.id, id));\n return result[0] ?? null;\n }\n\n async findLearnings(\n params: { minConfidence?: number; actionable?: boolean; limit?: number } = {},\n ): Promise<BrainLearningRow[]> {\n const conditions: SQL[] = [];\n\n if (params.minConfidence !== undefined) {\n conditions.push(gte(brainSchema.brainLearnings.confidence, params.minConfidence));\n }\n if (params.actionable !== undefined) {\n conditions.push(eq(brainSchema.brainLearnings.actionable, params.actionable));\n }\n\n let query = this.db\n .select()\n .from(brainSchema.brainLearnings)\n .orderBy(desc(brainSchema.brainLearnings.confidence));\n\n if (conditions.length > 0) {\n query = query.where(and(...conditions)) as typeof query;\n }\n\n if (params.limit) {\n query = query.limit(params.limit) as typeof query;\n }\n\n return query;\n }\n\n async updateLearning(id: string, updates: Partial<NewBrainLearningRow>): Promise<void> {\n await this.db\n .update(brainSchema.brainLearnings)\n .set({ ...updates, updatedAt: new Date().toISOString().replace('T', ' ').slice(0, 19) })\n .where(eq(brainSchema.brainLearnings.id, id));\n }\n\n // =========================================================================\n // Observations CRUD\n // =========================================================================\n\n async addObservation(row: NewBrainObservationRow): Promise<BrainObservationRow> {\n await this.db.insert(brainSchema.brainObservations).values(row);\n const result = await this.db\n .select()\n .from(brainSchema.brainObservations)\n .where(eq(brainSchema.brainObservations.id, row.id));\n return result[0]!;\n }\n\n async getObservation(id: string): Promise<BrainObservationRow | null> {\n const result = await this.db\n .select()\n .from(brainSchema.brainObservations)\n .where(eq(brainSchema.brainObservations.id, id));\n return result[0] ?? null;\n }\n\n async findObservations(\n params: {\n type?: (typeof brainSchema.BRAIN_OBSERVATION_TYPES)[number];\n project?: string;\n sourceType?: (typeof brainSchema.BRAIN_OBSERVATION_SOURCE_TYPES)[number];\n sourceSessionId?: string;\n /** T417: filter by agent provenance name (Wave 8 mental models). */\n agent?: string;\n limit?: number;\n } = {},\n ): Promise<BrainObservationRow[]> {\n const conditions: SQL[] = [];\n\n if (params.type) {\n conditions.push(eq(brainSchema.brainObservations.type, params.type));\n }\n if (params.project) {\n conditions.push(eq(brainSchema.brainObservations.project, params.project));\n }\n if (params.sourceType) {\n conditions.push(eq(brainSchema.brainObservations.sourceType, params.sourceType));\n }\n if (params.sourceSessionId) {\n conditions.push(eq(brainSchema.brainObservations.sourceSessionId, params.sourceSessionId));\n }\n if (params.agent) {\n conditions.push(eq(brainSchema.brainObservations.agent, params.agent));\n }\n\n let query = this.db\n .select()\n .from(brainSchema.brainObservations)\n .orderBy(desc(brainSchema.brainObservations.createdAt));\n\n if (conditions.length > 0) {\n query = query.where(and(...conditions)) as typeof query;\n }\n\n if (params.limit) {\n query = query.limit(params.limit) as typeof query;\n }\n\n return query;\n }\n\n async updateObservation(id: string, updates: Partial<NewBrainObservationRow>): Promise<void> {\n await this.db\n .update(brainSchema.brainObservations)\n .set({ ...updates, updatedAt: new Date().toISOString().replace('T', ' ').slice(0, 19) })\n .where(eq(brainSchema.brainObservations.id, id));\n }\n\n // =========================================================================\n // Memory Links CRUD\n // =========================================================================\n\n async addLink(row: NewBrainMemoryLinkRow): Promise<void> {\n await this.db.insert(brainSchema.brainMemoryLinks).values(row);\n }\n\n async getLinksForMemory(\n memoryType: (typeof brainSchema.BRAIN_MEMORY_TYPES)[number],\n memoryId: string,\n ): Promise<BrainMemoryLinkRow[]> {\n return this.db\n .select()\n .from(brainSchema.brainMemoryLinks)\n .where(\n and(\n eq(brainSchema.brainMemoryLinks.memoryType, memoryType),\n eq(brainSchema.brainMemoryLinks.memoryId, memoryId),\n ),\n )\n .orderBy(asc(brainSchema.brainMemoryLinks.createdAt));\n }\n\n async getLinksForTask(taskId: string): Promise<BrainMemoryLinkRow[]> {\n return this.db\n .select()\n .from(brainSchema.brainMemoryLinks)\n .where(eq(brainSchema.brainMemoryLinks.taskId, taskId))\n .orderBy(asc(brainSchema.brainMemoryLinks.createdAt));\n }\n\n async removeLink(\n memoryType: (typeof brainSchema.BRAIN_MEMORY_TYPES)[number],\n memoryId: string,\n taskId: string,\n linkType: (typeof brainSchema.BRAIN_LINK_TYPES)[number],\n ): Promise<void> {\n await this.db\n .delete(brainSchema.brainMemoryLinks)\n .where(\n and(\n eq(brainSchema.brainMemoryLinks.memoryType, memoryType),\n eq(brainSchema.brainMemoryLinks.memoryId, memoryId),\n eq(brainSchema.brainMemoryLinks.taskId, taskId),\n eq(brainSchema.brainMemoryLinks.linkType, linkType),\n ),\n );\n }\n\n // =========================================================================\n // Sticky Notes CRUD\n // =========================================================================\n\n async addStickyNote(row: NewBrainStickyNoteRow): Promise<BrainStickyNoteRow> {\n await this.db.insert(brainSchema.brainStickyNotes).values(row);\n const result = await this.db\n .select()\n .from(brainSchema.brainStickyNotes)\n .where(eq(brainSchema.brainStickyNotes.id, row.id));\n return result[0]!;\n }\n\n async getStickyNote(id: string): Promise<BrainStickyNoteRow | null> {\n const result = await this.db\n .select()\n .from(brainSchema.brainStickyNotes)\n .where(eq(brainSchema.brainStickyNotes.id, id));\n return result[0] ?? null;\n }\n\n async findStickyNotes(\n params: {\n status?: (typeof brainSchema.BRAIN_STICKY_STATUSES)[number];\n color?: (typeof brainSchema.BRAIN_STICKY_COLORS)[number];\n priority?: (typeof brainSchema.BRAIN_STICKY_PRIORITIES)[number];\n limit?: number;\n } = {},\n ): Promise<BrainStickyNoteRow[]> {\n const conditions: SQL[] = [];\n\n if (params.status) {\n conditions.push(eq(brainSchema.brainStickyNotes.status, params.status));\n }\n if (params.color) {\n conditions.push(eq(brainSchema.brainStickyNotes.color, params.color));\n }\n if (params.priority) {\n conditions.push(eq(brainSchema.brainStickyNotes.priority, params.priority));\n }\n\n let query = this.db\n .select()\n .from(brainSchema.brainStickyNotes)\n .orderBy(desc(brainSchema.brainStickyNotes.createdAt));\n\n if (conditions.length > 0) {\n query = query.where(and(...conditions)) as typeof query;\n }\n\n if (params.limit) {\n query = query.limit(params.limit) as typeof query;\n }\n\n return query;\n }\n\n async updateStickyNote(id: string, updates: Partial<NewBrainStickyNoteRow>): Promise<void> {\n await this.db\n .update(brainSchema.brainStickyNotes)\n .set({ ...updates, updatedAt: new Date().toISOString().replace('T', ' ').slice(0, 19) })\n .where(eq(brainSchema.brainStickyNotes.id, id));\n }\n\n async deleteStickyNote(id: string): Promise<void> {\n await this.db\n .delete(brainSchema.brainStickyNotes)\n .where(eq(brainSchema.brainStickyNotes.id, id));\n }\n\n // =========================================================================\n // PageIndex Node CRUD (T5383)\n // =========================================================================\n\n async addPageNode(node: NewBrainPageNodeRow): Promise<BrainPageNodeRow> {\n await this.db.insert(brainSchema.brainPageNodes).values(node);\n const result = await this.db\n .select()\n .from(brainSchema.brainPageNodes)\n .where(eq(brainSchema.brainPageNodes.id, node.id));\n return result[0]!;\n }\n\n async getPageNode(id: string): Promise<BrainPageNodeRow | null> {\n const result = await this.db\n .select()\n .from(brainSchema.brainPageNodes)\n .where(eq(brainSchema.brainPageNodes.id, id));\n return result[0] ?? null;\n }\n\n async findPageNodes(\n params: {\n nodeType?: (typeof brainSchema.BRAIN_NODE_TYPES)[number];\n minQualityScore?: number;\n limit?: number;\n } = {},\n ): Promise<BrainPageNodeRow[]> {\n const conditions: SQL[] = [];\n\n if (params.nodeType) {\n conditions.push(eq(brainSchema.brainPageNodes.nodeType, params.nodeType));\n }\n if (params.minQualityScore !== undefined) {\n conditions.push(gte(brainSchema.brainPageNodes.qualityScore, params.minQualityScore));\n }\n\n let query = this.db\n .select()\n .from(brainSchema.brainPageNodes)\n .orderBy(desc(brainSchema.brainPageNodes.lastActivityAt));\n\n if (conditions.length > 0) {\n query = query.where(and(...conditions)) as typeof query;\n }\n\n if (params.limit) {\n query = query.limit(params.limit) as typeof query;\n }\n\n return query;\n }\n\n async updatePageNode(id: string, updates: Partial<NewBrainPageNodeRow>): Promise<void> {\n await this.db\n .update(brainSchema.brainPageNodes)\n .set({ ...updates, updatedAt: new Date().toISOString().replace('T', ' ').slice(0, 19) })\n .where(eq(brainSchema.brainPageNodes.id, id));\n }\n\n async removePageNode(id: string): Promise<void> {\n // Remove associated edges first (both directions)\n await this.db\n .delete(brainSchema.brainPageEdges)\n .where(\n or(eq(brainSchema.brainPageEdges.fromId, id), eq(brainSchema.brainPageEdges.toId, id)),\n );\n // Remove the node\n await this.db.delete(brainSchema.brainPageNodes).where(eq(brainSchema.brainPageNodes.id, id));\n }\n\n // =========================================================================\n // PageIndex Edge CRUD (T5383)\n // =========================================================================\n\n async addPageEdge(edge: NewBrainPageEdgeRow): Promise<BrainPageEdgeRow> {\n await this.db.insert(brainSchema.brainPageEdges).values(edge);\n const result = await this.db\n .select()\n .from(brainSchema.brainPageEdges)\n .where(\n and(\n eq(brainSchema.brainPageEdges.fromId, edge.fromId),\n eq(brainSchema.brainPageEdges.toId, edge.toId),\n eq(brainSchema.brainPageEdges.edgeType, edge.edgeType),\n ),\n );\n return result[0]!;\n }\n\n async findPageEdges(\n params: {\n edgeType?: (typeof brainSchema.BRAIN_EDGE_TYPES)[number];\n provenance?: string;\n limit?: number;\n } = {},\n ): Promise<BrainPageEdgeRow[]> {\n const conditions: SQL[] = [];\n\n if (params.edgeType) {\n conditions.push(eq(brainSchema.brainPageEdges.edgeType, params.edgeType));\n }\n if (params.provenance) {\n conditions.push(eq(brainSchema.brainPageEdges.provenance, params.provenance));\n }\n\n let query = this.db\n .select()\n .from(brainSchema.brainPageEdges)\n .orderBy(desc(brainSchema.brainPageEdges.createdAt));\n\n if (conditions.length > 0) {\n query = query.where(and(...conditions)) as typeof query;\n }\n\n if (params.limit) {\n query = query.limit(params.limit) as typeof query;\n }\n\n return query;\n }\n\n async getPageEdges(\n nodeId: string,\n direction: 'in' | 'out' | 'both' = 'both',\n ): Promise<BrainPageEdgeRow[]> {\n if (direction === 'out') {\n return this.db\n .select()\n .from(brainSchema.brainPageEdges)\n .where(eq(brainSchema.brainPageEdges.fromId, nodeId))\n .orderBy(asc(brainSchema.brainPageEdges.createdAt));\n }\n if (direction === 'in') {\n return this.db\n .select()\n .from(brainSchema.brainPageEdges)\n .where(eq(brainSchema.brainPageEdges.toId, nodeId))\n .orderBy(asc(brainSchema.brainPageEdges.createdAt));\n }\n // both\n return this.db\n .select()\n .from(brainSchema.brainPageEdges)\n .where(\n or(\n eq(brainSchema.brainPageEdges.fromId, nodeId),\n eq(brainSchema.brainPageEdges.toId, nodeId),\n ),\n )\n .orderBy(asc(brainSchema.brainPageEdges.createdAt));\n }\n\n async getNeighbors(\n nodeId: string,\n edgeType?: (typeof brainSchema.BRAIN_EDGE_TYPES)[number],\n ): Promise<BrainPageNodeRow[]> {\n // Get edges from this node\n const conditions: SQL[] = [eq(brainSchema.brainPageEdges.fromId, nodeId)];\n if (edgeType) {\n conditions.push(eq(brainSchema.brainPageEdges.edgeType, edgeType));\n }\n\n const edges = await this.db\n .select()\n .from(brainSchema.brainPageEdges)\n .where(and(...conditions));\n\n if (edges.length === 0) return [];\n\n const neighborIds = edges.map((e) => e.toId);\n const nodes: BrainPageNodeRow[] = [];\n for (const nid of neighborIds) {\n const node = await this.getPageNode(nid);\n if (node) nodes.push(node);\n }\n return nodes;\n }\n\n async removePageEdge(\n fromId: string,\n toId: string,\n edgeType: (typeof brainSchema.BRAIN_EDGE_TYPES)[number],\n ): Promise<void> {\n await this.db\n .delete(brainSchema.brainPageEdges)\n .where(\n and(\n eq(brainSchema.brainPageEdges.fromId, fromId),\n eq(brainSchema.brainPageEdges.toId, toId),\n eq(brainSchema.brainPageEdges.edgeType, edgeType),\n ),\n );\n }\n}\n\n/**\n * Factory: get a BrainDataAccessor backed by the brain.db singleton.\n */\nexport async function getBrainAccessor(cwd?: string): Promise<BrainDataAccessor> {\n const db = await getBrainDb(cwd);\n return new BrainDataAccessor(db);\n}\n\n// ============================================================================\n// M4 PLASTICITY AUX TABLE ACCESSORS (T673-M4)\n// Minimal writers \u2014 Wave 1+ workers wire the full call paths.\n// ============================================================================\n\n/**\n * Insert one row into brain_weight_history.\n * Called by writeWeightHistory() in brain-stdp.ts for each LTP, LTD, Hebbian,\n * or prune event that crosses the 1e-6 negligibility threshold.\n *\n * @param cwd - Project root (locates brain.db). Defaults to process.cwd().\n * @param input - Row data. `changedAt` defaults to SQLite datetime('now').\n * @returns The inserted row with its generated id.\n *\n * @task T697\n * @epic T673\n */\nexport async function insertWeightHistoryRow(\n cwd: string | undefined,\n input: BrainWeightHistoryInsert,\n): Promise<BrainWeightHistoryRow> {\n const db = await getBrainDb(cwd);\n const result = await db.insert(brainSchema.brainWeightHistory).values(input).returning();\n return result[0]!;\n}\n\n/**\n * Insert one row into brain_modulators.\n * Called by backfillRewardSignals() for each task outcome it processes.\n * Both this INSERT and the retrieval_log UPDATE MUST run in the same logical\n * pass but in separate transactions (no ATTACH) \u2014 see spec \u00A74.3.\n *\n * @param cwd - Project root (locates brain.db). Defaults to process.cwd().\n * @param input - Row data. `createdAt` defaults to SQLite datetime('now').\n * @returns The inserted row with its generated id.\n *\n * @task T699\n * @epic T673\n */\nexport async function insertModulatorRow(\n cwd: string | undefined,\n input: BrainModulatorInsert,\n): Promise<BrainModulatorRow> {\n const db = await getBrainDb(cwd);\n const result = await db.insert(brainSchema.brainModulators).values(input).returning();\n return result[0]!;\n}\n\n/**\n * Open a consolidation event row in brain_consolidation_events.\n * Call this at the START of runConsolidation before any steps execute.\n * Returns the new row id \u2014 pass it to logConsolidationComplete() when done.\n *\n * @param cwd - Project root (locates brain.db).\n * @param trigger - What initiated this consolidation run.\n * @param sessionId - Active session ID, if any.\n * @returns The id of the newly inserted row.\n *\n * @task T701\n * @epic T673\n */\nexport async function logConsolidationStart(\n cwd: string | undefined,\n trigger: string,\n sessionId?: string,\n): Promise<number> {\n const db = await getBrainDb(cwd);\n const result = await db\n .insert(brainSchema.brainConsolidationEvents)\n .values({\n trigger,\n sessionId: sessionId ?? null,\n // stepResultsJson is required NOT NULL \u2014 use empty object as placeholder\n // until logConsolidationComplete updates it with final step results.\n stepResultsJson: '{}',\n succeeded: true,\n })\n .returning({ id: brainSchema.brainConsolidationEvents.id });\n return result[0]!.id;\n}\n\n/**\n * Complete a consolidation event row by updating it with final results.\n * Call this at the END of runConsolidation after all steps complete.\n *\n * @param cwd - Project root (locates brain.db).\n * @param id - Row id returned by logConsolidationStart.\n * @param stats - JSON-serializable step results object.\n * @param durationMs - Total wall-clock duration in milliseconds.\n * @param succeeded - Whether the run completed without error.\n * @returns The updated row.\n *\n * @task T701\n * @epic T673\n */\nexport async function logConsolidationComplete(\n cwd: string | undefined,\n id: number,\n stats: Record<string, unknown>,\n durationMs: number,\n succeeded = true,\n): Promise<BrainConsolidationEventRow> {\n const db = await getBrainDb(cwd);\n const result = await db\n .update(brainSchema.brainConsolidationEvents)\n .set({\n stepResultsJson: JSON.stringify(stats),\n durationMs,\n succeeded,\n })\n .where(eq(brainSchema.brainConsolidationEvents.id, id))\n .returning();\n return result[0]!;\n}\n"],
|
|
5
|
+
"mappings": "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;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA;AAAA,QAGA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA;AAAA,QAGA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA;AAAA,QAGA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA;AAAA,QAGA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA;AAAA,QAGA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA;AAAA,QAGA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA;AAAA,QAGA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA;AAAA,QAGA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA;AAAA,QAGA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA;AAAA,QAGA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA;AAAA,QAGA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA;AAAA,UAEE;AAAA;AAAA,YAEE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA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",
|
|
6
|
+
"names": ["name", "sql", "name", "param", "SQL", "join", "placeholder", "name", "sql", "char", "value", "startFrom", "name", "name", "ref", "config", "name", "result", "name", "index", "name", "name", "name", "name", "name", "name", "sql", "name", "name", "name", "name", "name", "name", "name", "name", "name", "name", "name", "name", "name", "name", "name", "name", "name", "name", "name", "name", "name", "name", "name", "name", "name", "name", "name", "name", "One", "Many", "SQLiteCountBuilder", "DrizzleQueryError", "mapRelationalRow", "filter", "Relation", "One", "Many", "name", "SQLiteRelationalQuery", "SQLiteSyncRelationalQuery", "mapRelationalRow", "jsonb", "SelectionProxyHandler", "ForeignKeyBuilder", "ForeignKey", "name", "name", "name", "name", "ref", "actions", "ForeignKeyBuilder", "name", "customType", "name", "sql", "integer", "name", "numeric", "name", "real", "name", "text", "name", "customType", "integer", "numeric", "real", "text", "name", "InlineForeignKeys", "PrimaryKeyBuilder", "PrimaryKey", "name", "name", "unique", "join", "init_sql", "init_common", "name", "index", "table", "select", "sql", "joinOn", "field", "isSQLWrapper", "jsonb", "joins", "join", "isSingle", "One", "throughJoin", "json", "join", "init_select", "init_query_builder", "sql", "sql", "init_integer", "init_real", "init_text", "init_table", "init_primary_keys", "sql", "text", "real", "integer", "SQLiteSession", "NodeSQLiteTransaction", "PreparedQueryBase", "z", "ExitCode", "init_errors", "z", "init_session", "init_session", "init_session", "z", "init_errors", "init_session", "name", "def", "name", "init_errors", "init_errors", "join", "crypto", "init_logger", "existsSync", "name", "init_migrator", "init_logger", "DatabaseSync", "sql", "text", "integer", "real", "init_sqlite", "createRequire", "_require", "init_sqlite", "init_status_registry", "sql", "AGENT_INSTANCE_STATUSES", "AGENT_TYPES", "text", "integer", "sql", "text", "integer", "sql", "init_status_registry", "text", "integer", "createRequire", "eq", "DatabaseSync", "_require", "init_sqlite", "init_logger", "dirname", "json", "init_errors", "mkdir", "unlink", "join", "init_errors", "init_errors", "init_logger", "init_json", "init_errors", "existsSync", "mkdir", "dirname", "name", "def", "init_json", "text", "text", "LocalEmbeddingProvider", "createRequire", "dirname", "join", "_require", "loadConfig", "initDefaultProvider", "init_sqlite", "and", "asc", "desc", "eq", "gte", "or", "text"]
|
|
7
|
+
}
|