@vibesdotdev/localdb 0.0.2 → 1.0.0-rc.2

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.
Files changed (198) hide show
  1. package/LICENSE +18 -0
  2. package/README.md +123 -2
  3. package/dist/cli/commands/_shared.consumer.d.ts +1 -3
  4. package/dist/cli/commands/_shared.consumer.d.ts.map +1 -1
  5. package/dist/cli/commands/_shared.consumer.js +1 -11
  6. package/dist/cli/commands/_shared.consumer.js.map +1 -1
  7. package/dist/cli/commands/migrate/dev.localdb.migrate.cli-command.descriptor.js +1 -1
  8. package/dist/cli/commands/migrate/dev.localdb.migrate.cli-command.descriptor.js.map +1 -1
  9. package/dist/cli/commands/migrate/dev.localdb.migrate.cli-command.impl.consumer.d.ts +9 -3
  10. package/dist/cli/commands/migrate/dev.localdb.migrate.cli-command.impl.consumer.d.ts.map +1 -1
  11. package/dist/cli/commands/migrate/dev.localdb.migrate.cli-command.impl.consumer.js +59 -45
  12. package/dist/cli/commands/migrate/dev.localdb.migrate.cli-command.impl.consumer.js.map +1 -1
  13. package/dist/cli/commands/namespaces/dev.localdb.namespaces.cli-command.descriptor.js +1 -1
  14. package/dist/cli/commands/namespaces/dev.localdb.namespaces.cli-command.descriptor.js.map +1 -1
  15. package/dist/cli/commands/namespaces/dev.localdb.namespaces.cli-command.impl.d.ts +8 -3
  16. package/dist/cli/commands/namespaces/dev.localdb.namespaces.cli-command.impl.d.ts.map +1 -1
  17. package/dist/cli/commands/namespaces/dev.localdb.namespaces.cli-command.impl.js +12 -10
  18. package/dist/cli/commands/namespaces/dev.localdb.namespaces.cli-command.impl.js.map +1 -1
  19. package/dist/cli/commands/pools/dev.localdb.pools.cli-command.descriptor.js +1 -1
  20. package/dist/cli/commands/pools/dev.localdb.pools.cli-command.descriptor.js.map +1 -1
  21. package/dist/cli/commands/pools/dev.localdb.pools.cli-command.impl.d.ts +6 -3
  22. package/dist/cli/commands/pools/dev.localdb.pools.cli-command.impl.d.ts.map +1 -1
  23. package/dist/cli/commands/pools/dev.localdb.pools.cli-command.impl.js +8 -7
  24. package/dist/cli/commands/pools/dev.localdb.pools.cli-command.impl.js.map +1 -1
  25. package/dist/cli/commands/query/dev.localdb.query.cli-command.descriptor.js +1 -1
  26. package/dist/cli/commands/query/dev.localdb.query.cli-command.descriptor.js.map +1 -1
  27. package/dist/cli/commands/query/dev.localdb.query.cli-command.impl.consumer.d.ts +13 -3
  28. package/dist/cli/commands/query/dev.localdb.query.cli-command.impl.consumer.d.ts.map +1 -1
  29. package/dist/cli/commands/query/dev.localdb.query.cli-command.impl.consumer.js +66 -51
  30. package/dist/cli/commands/query/dev.localdb.query.cli-command.impl.consumer.js.map +1 -1
  31. package/dist/cli/commands/status/dev.localdb.status.cli-command.descriptor.js +1 -1
  32. package/dist/cli/commands/status/dev.localdb.status.cli-command.descriptor.js.map +1 -1
  33. package/dist/cli/commands/status/dev.localdb.status.cli-command.impl.consumer.d.ts +9 -3
  34. package/dist/cli/commands/status/dev.localdb.status.cli-command.impl.consumer.d.ts.map +1 -1
  35. package/dist/cli/commands/status/dev.localdb.status.cli-command.impl.consumer.js +41 -29
  36. package/dist/cli/commands/status/dev.localdb.status.cli-command.impl.consumer.js.map +1 -1
  37. package/dist/cli/inputs.d.ts +25 -0
  38. package/dist/cli/inputs.d.ts.map +1 -0
  39. package/dist/cli/inputs.js +81 -0
  40. package/dist/cli/inputs.js.map +1 -0
  41. package/dist/cli/types.d.ts +45 -0
  42. package/dist/cli/types.d.ts.map +1 -0
  43. package/dist/cli/types.js +14 -0
  44. package/dist/cli/types.js.map +1 -0
  45. package/dist/core/connection-pool.d.ts +204 -46
  46. package/dist/core/connection-pool.d.ts.map +1 -1
  47. package/dist/core/connection-pool.js +610 -101
  48. package/dist/core/connection-pool.js.map +1 -1
  49. package/dist/core/database.d.ts +243 -63
  50. package/dist/core/database.d.ts.map +1 -1
  51. package/dist/core/database.js +937 -203
  52. package/dist/core/database.js.map +1 -1
  53. package/dist/core/holders.d.ts +15 -0
  54. package/dist/core/holders.d.ts.map +1 -0
  55. package/dist/core/holders.js +4 -0
  56. package/dist/core/holders.js.map +1 -0
  57. package/dist/core/host-kinds.d.ts +22 -0
  58. package/dist/core/host-kinds.d.ts.map +1 -0
  59. package/dist/core/host-kinds.js +52 -0
  60. package/dist/core/host-kinds.js.map +1 -0
  61. package/dist/core/live-runtime.d.ts +17 -0
  62. package/dist/core/live-runtime.d.ts.map +1 -0
  63. package/dist/core/live-runtime.js +28 -0
  64. package/dist/core/live-runtime.js.map +1 -0
  65. package/dist/core/migration-registry.d.ts +115 -80
  66. package/dist/core/migration-registry.d.ts.map +1 -1
  67. package/dist/core/migration-registry.js +340 -199
  68. package/dist/core/migration-registry.js.map +1 -1
  69. package/dist/core/open-connection.d.ts +11 -0
  70. package/dist/core/open-connection.d.ts.map +1 -0
  71. package/dist/core/open-connection.js +70 -0
  72. package/dist/core/open-connection.js.map +1 -0
  73. package/dist/core/outcome.d.ts +21 -0
  74. package/dist/core/outcome.d.ts.map +1 -0
  75. package/dist/core/outcome.js +22 -0
  76. package/dist/core/outcome.js.map +1 -0
  77. package/dist/core/pool-api.d.ts +19 -0
  78. package/dist/core/pool-api.d.ts.map +1 -0
  79. package/dist/core/pool-api.js +59 -0
  80. package/dist/core/pool-api.js.map +1 -0
  81. package/dist/core/slow-statement.d.ts +81 -0
  82. package/dist/core/slow-statement.d.ts.map +1 -0
  83. package/dist/core/slow-statement.js +149 -0
  84. package/dist/core/slow-statement.js.map +1 -0
  85. package/dist/core/wal-policy.d.ts +86 -0
  86. package/dist/core/wal-policy.d.ts.map +1 -0
  87. package/dist/core/wal-policy.js +115 -0
  88. package/dist/core/wal-policy.js.map +1 -0
  89. package/dist/dev.localdb.cli-group.descriptor.d.ts +1 -1
  90. package/dist/dev.localdb.cli-group.descriptor.d.ts.map +1 -1
  91. package/dist/dev.localdb.context.descriptor.d.ts +15 -1
  92. package/dist/dev.localdb.context.descriptor.d.ts.map +1 -1
  93. package/dist/dev.localdb.context.descriptor.js +1 -1
  94. package/dist/dev.localdb.context.descriptor.js.map +1 -1
  95. package/dist/dev.localdb.context.impl.consumer.d.ts +12 -5
  96. package/dist/dev.localdb.context.impl.consumer.d.ts.map +1 -1
  97. package/dist/dev.localdb.context.impl.consumer.js +14 -5
  98. package/dist/dev.localdb.context.impl.consumer.js.map +1 -1
  99. package/dist/driver/sqlite-driver.base.d.ts +107 -0
  100. package/dist/driver/sqlite-driver.base.d.ts.map +1 -0
  101. package/dist/driver/sqlite-driver.base.js +426 -0
  102. package/dist/driver/sqlite-driver.base.js.map +1 -0
  103. package/dist/driver/sqlite-driver.d.ts +154 -0
  104. package/dist/driver/sqlite-driver.d.ts.map +1 -0
  105. package/dist/driver/sqlite-driver.js +103 -0
  106. package/dist/driver/sqlite-driver.js.map +1 -0
  107. package/dist/index.d.ts +11 -5
  108. package/dist/index.d.ts.map +1 -1
  109. package/dist/index.js +8 -4
  110. package/dist/index.js.map +1 -1
  111. package/dist/localdb.client.descriptor.d.ts +10 -0
  112. package/dist/localdb.client.descriptor.d.ts.map +1 -0
  113. package/dist/localdb.client.descriptor.js +13 -0
  114. package/dist/localdb.client.descriptor.js.map +1 -0
  115. package/dist/localdb.client.impl.consumer.d.ts +11 -0
  116. package/dist/localdb.client.impl.consumer.d.ts.map +1 -0
  117. package/dist/localdb.client.impl.consumer.js +11 -0
  118. package/dist/localdb.client.impl.consumer.js.map +1 -0
  119. package/dist/localdb.plugin.d.ts +2 -2
  120. package/dist/localdb.plugin.d.ts.map +1 -1
  121. package/dist/localdb.plugin.js +58 -10
  122. package/dist/localdb.plugin.js.map +1 -1
  123. package/dist/location.d.ts +6 -0
  124. package/dist/location.d.ts.map +1 -0
  125. package/dist/location.js +6 -0
  126. package/dist/location.js.map +1 -0
  127. package/dist/migrations/load-sql.d.ts +25 -21
  128. package/dist/migrations/load-sql.d.ts.map +1 -1
  129. package/dist/migrations/load-sql.js +91 -76
  130. package/dist/migrations/load-sql.js.map +1 -1
  131. package/dist/pool.d.ts +3 -0
  132. package/dist/pool.d.ts.map +1 -0
  133. package/dist/pool.js +3 -0
  134. package/dist/pool.js.map +1 -0
  135. package/dist/schemas/api.d.ts +133 -59
  136. package/dist/schemas/api.d.ts.map +1 -1
  137. package/dist/schemas/api.js +1 -1
  138. package/dist/schemas/api.js.map +1 -1
  139. package/dist/schemas/migrations.d.ts +123 -0
  140. package/dist/schemas/migrations.d.ts.map +1 -0
  141. package/dist/schemas/migrations.js +55 -0
  142. package/dist/schemas/migrations.js.map +1 -0
  143. package/dist/schemas/pool.d.ts +27 -0
  144. package/dist/schemas/pool.d.ts.map +1 -0
  145. package/dist/schemas/pool.js +7 -0
  146. package/dist/schemas/pool.js.map +1 -0
  147. package/dist/schemas/sqlite-driver-base.d.ts +50 -0
  148. package/dist/schemas/sqlite-driver-base.d.ts.map +1 -0
  149. package/dist/schemas/sqlite-driver-base.js +2 -0
  150. package/dist/schemas/sqlite-driver-base.js.map +1 -0
  151. package/dist/testing/sqlite-driver-conformance.d.ts +42 -0
  152. package/dist/testing/sqlite-driver-conformance.d.ts.map +1 -0
  153. package/dist/testing/sqlite-driver-conformance.js +471 -0
  154. package/dist/testing/sqlite-driver-conformance.js.map +1 -0
  155. package/package.json +78 -104
  156. package/dist/core/error-context.d.ts +0 -2
  157. package/dist/core/error-context.d.ts.map +0 -1
  158. package/dist/core/error-context.js +0 -17
  159. package/dist/core/error-context.js.map +0 -1
  160. package/dist/core/runtime.d.ts +0 -3
  161. package/dist/core/runtime.d.ts.map +0 -1
  162. package/dist/core/runtime.js +0 -17
  163. package/dist/core/runtime.js.map +0 -1
  164. package/dist/localdb.cloud.plugin.d.ts +0 -17
  165. package/dist/localdb.cloud.plugin.d.ts.map +0 -1
  166. package/dist/localdb.cloud.plugin.js +0 -23
  167. package/dist/localdb.cloud.plugin.js.map +0 -1
  168. package/src/cli/commands/_shared.consumer.ts +0 -20
  169. package/src/cli/commands/migrate/dev.localdb.migrate.cli-command.descriptor.ts +0 -20
  170. package/src/cli/commands/migrate/dev.localdb.migrate.cli-command.impl.consumer.ts +0 -97
  171. package/src/cli/commands/namespaces/dev.localdb.namespaces.cli-command.descriptor.ts +0 -17
  172. package/src/cli/commands/namespaces/dev.localdb.namespaces.cli-command.impl.ts +0 -46
  173. package/src/cli/commands/pools/dev.localdb.pools.cli-command.descriptor.ts +0 -16
  174. package/src/cli/commands/pools/dev.localdb.pools.cli-command.impl.ts +0 -37
  175. package/src/cli/commands/query/dev.localdb.query.cli-command.descriptor.ts +0 -21
  176. package/src/cli/commands/query/dev.localdb.query.cli-command.impl.consumer.ts +0 -69
  177. package/src/cli/commands/status/dev.localdb.status.cli-command.descriptor.ts +0 -20
  178. package/src/cli/commands/status/dev.localdb.status.cli-command.impl.consumer.ts +0 -93
  179. package/src/core/connection-pool.ts +0 -240
  180. package/src/core/database.ts +0 -419
  181. package/src/core/error-context.ts +0 -19
  182. package/src/core/migration-registry.ts +0 -321
  183. package/src/core/runtime.ts +0 -17
  184. package/src/dev.localdb.cli-group.descriptor.ts +0 -20
  185. package/src/dev.localdb.context.descriptor.ts +0 -13
  186. package/src/dev.localdb.context.impl.consumer.ts +0 -12
  187. package/src/index.ts +0 -28
  188. package/src/localdb.cloud.plugin.ts +0 -24
  189. package/src/localdb.plugin.ts +0 -43
  190. package/src/migrations/atlas/001-initial-schema.sql +0 -173
  191. package/src/migrations/atlas/002-lang-server-fields.sql +0 -12
  192. package/src/migrations/atlas/003-config-id-dedup.sql +0 -31
  193. package/src/migrations/atlas/004-fix-on-conflict-constraints.sql +0 -25
  194. package/src/migrations/atlas/005-diagnostics.sql +0 -66
  195. package/src/migrations/atlas/006-diagnostic-summaries.sql +0 -65
  196. package/src/migrations/atlas/007-diagnostic-slice.sql +0 -83
  197. package/src/migrations/load-sql.ts +0 -133
  198. package/src/schemas/api.ts +0 -92
@@ -0,0 +1,426 @@
1
+ /**
2
+ * The shared provider side of LocalDB's SQLite driver kind
3
+ * (`localdb/sqlite-driver`, `./sqlite-driver`): the base each host's driver
4
+ * composes (`./sqlite-driver/base`).
5
+ *
6
+ * Every untrusted input a driver reads (the open request, bound parameters,
7
+ * SQL text) goes through one guard here, and every host failure is classified
8
+ * here into a typed `CapabilityError`, so every host refuses alike. The
9
+ * transaction runner is here too. Nothing here reads a host API: a host lends
10
+ * its path rules and file facts (`SqliteDriverHost`) to the two guards that
11
+ * need them, and each host package keeps its own SQLite binding.
12
+ */
13
+ import { CapabilityError, CaughtFailureSchema, valueFreeFailure } from '@vibesdotdev/kernel';
14
+ import * as z from 'zod/v4';
15
+ import { SQLITE_DRIVER_REFUSALS } from "./sqlite-driver.js";
16
+ export { LOCALDB_SQLITE_DRIVER_KIND, SQLITE_DRIVER_REFUSALS, sqliteDriverKind } from "./sqlite-driver.js";
17
+ /** The in-memory database name SQLite reserves. */
18
+ export const SQLITE_MEMORY_PATH = ':memory:';
19
+ /** Put a redacted failure's bounded facts in public details without retaining the thrown value. */
20
+ export function sqliteFailureFacts(prefix, failure) {
21
+ return {
22
+ [`${prefix}Name`]: failure.name,
23
+ [`${prefix}Code`]: failure.code ?? 'unspecified',
24
+ [`${prefix}Reason`]: failure.reason ?? 'unspecified'
25
+ };
26
+ }
27
+ /** A driver refusal containing only the contract's fixed, bounded facts. */
28
+ export class SqliteDriverFailure extends CapabilityError {
29
+ constructor(failure) {
30
+ super(failure.message, failure.code, {
31
+ reason: failure.reason,
32
+ retryable: failure.retryable,
33
+ details: failure.details
34
+ });
35
+ this.name = 'SqliteDriverFailure';
36
+ }
37
+ }
38
+ /** Construct a cause-free driver refusal from the contract's fixed facts. */
39
+ export function sqliteDriverFailure(failure) {
40
+ return new CapabilityError(failure.message, failure.code, {
41
+ reason: failure.reason,
42
+ retryable: failure.retryable,
43
+ details: failure.details
44
+ });
45
+ }
46
+ function guardedRead(read) {
47
+ try {
48
+ return { ok: true, value: read() };
49
+ }
50
+ catch (error) {
51
+ return { ok: false, failure: valueFreeFailure(CaughtFailureSchema.parse(error)) };
52
+ }
53
+ }
54
+ const OPEN_INVALID = {
55
+ message: 'The SQLite open request is not an absolute path (or `:memory:`) with boolean `create`/`readonly` options.',
56
+ code: 'INVALID_INPUT',
57
+ reason: SQLITE_DRIVER_REFUSALS.openInvalid,
58
+ retryable: false
59
+ };
60
+ /** A path SQLite may open, before the host's absolute check: `:memory:`, or non-blank text without NUL bytes. */
61
+ const SqlitePathSchema = z
62
+ .string()
63
+ .refine((path) => path === SQLITE_MEMORY_PATH || (path.trim().length > 0 && !path.includes('\0')));
64
+ const SqliteOpenOptionsSchema = z
65
+ .object({ create: z.boolean().optional(), readonly: z.boolean().optional() })
66
+ .optional();
67
+ /**
68
+ * Read an open request once. `path` is `:memory:` or a path the host calls
69
+ * absolute (`host.isAbsolutePath`); `options` is absent or an object whose
70
+ * `create`/`readonly` fields are booleans when present. Any other value — a
71
+ * throwing getter, a Proxy (revoked included), a non-string path, or Zod
72
+ * failing while it reads — refuses the fixed `INVALID_INPUT
73
+ * sqlite-open-invalid` without retaining the hostile value or thrown error.
74
+ */
75
+ export function readSqliteOpenRequest(host, path, options) {
76
+ const read = guardedRead(() => ({
77
+ path: SqlitePathSchema.safeParse(path),
78
+ options: SqliteOpenOptionsSchema.safeParse(options)
79
+ }));
80
+ if (!read.ok) {
81
+ throw sqliteDriverFailure({ ...OPEN_INVALID, details: sqliteFailureFacts('inputReadFailure', read.failure) });
82
+ }
83
+ const parsedPath = read.value.path;
84
+ const parsedOptions = read.value.options;
85
+ if (!parsedPath.success)
86
+ throw sqliteDriverFailure(OPEN_INVALID);
87
+ if (parsedPath.data !== SQLITE_MEMORY_PATH && !host.isAbsolutePath(parsedPath.data))
88
+ throw sqliteDriverFailure(OPEN_INVALID);
89
+ if (!parsedOptions.success)
90
+ throw sqliteDriverFailure(OPEN_INVALID);
91
+ return {
92
+ path: parsedPath.data,
93
+ memory: parsedPath.data === SQLITE_MEMORY_PATH,
94
+ create: parsedOptions.data?.create ?? true,
95
+ readonly: parsedOptions.data?.readonly ?? false
96
+ };
97
+ }
98
+ /** One bindable value; a boolean binds as 1 or 0, and bytes are copied, so a later write by the caller cannot change what binds. */
99
+ const SqliteBindingSchema = z.union([
100
+ z.string(),
101
+ z.number(),
102
+ z.bigint(),
103
+ z.null(),
104
+ z.boolean().transform((flag) => (flag ? 1 : 0)),
105
+ z.instanceof(Uint8Array).transform((bytes) => Uint8Array.prototype.slice.call(bytes))
106
+ ]);
107
+ function bindingInvalid(index) {
108
+ return {
109
+ message: `SQLite parameter ${index + 1} is not a string, finite number, bigint, boolean, null or Uint8Array.`,
110
+ code: 'INVALID_INPUT',
111
+ reason: SQLITE_DRIVER_REFUSALS.bindingInvalid,
112
+ retryable: false,
113
+ details: { index }
114
+ };
115
+ }
116
+ /**
117
+ * Read positional parameters once. Each is a {@link SqliteBinding} (numbers
118
+ * finite; booleans bind as 1 or 0); bytes are copied (a Proxy over a `Uint8Array` passes `instanceof`
119
+ * but cannot be copied, and refuses). Anything else refuses `INVALID_INPUT
120
+ * sqlite-binding-invalid` naming the position.
121
+ */
122
+ export function readSqliteParams(params) {
123
+ const read = [];
124
+ for (let index = 0; index < params.length; index++) {
125
+ const parsedRead = guardedRead(() => SqliteBindingSchema.safeParse(params[index]));
126
+ if (!parsedRead.ok) {
127
+ const invalid = bindingInvalid(index);
128
+ throw sqliteDriverFailure({
129
+ ...invalid,
130
+ details: { ...invalid.details, ...sqliteFailureFacts('inputReadFailure', parsedRead.failure) }
131
+ });
132
+ }
133
+ const parsed = parsedRead.value;
134
+ if (!parsed.success)
135
+ throw sqliteDriverFailure(bindingInvalid(index));
136
+ read.push(parsed.data);
137
+ }
138
+ return read;
139
+ }
140
+ const SQL_INVALID = {
141
+ message: 'SQL text must be a string.',
142
+ code: 'INVALID_INPUT',
143
+ reason: SQLITE_DRIVER_REFUSALS.sqlInvalid,
144
+ retryable: false
145
+ };
146
+ const SqlTextSchema = z.string();
147
+ /** Read SQL text once: a string, or `INVALID_INPUT sqlite-sql-invalid`. */
148
+ export function readSqliteSql(sql) {
149
+ const read = guardedRead(() => SqlTextSchema.safeParse(sql));
150
+ if (!read.ok) {
151
+ throw sqliteDriverFailure({ ...SQL_INVALID, details: sqliteFailureFacts('inputReadFailure', read.failure) });
152
+ }
153
+ const parsed = read.value;
154
+ if (!parsed.success)
155
+ throw sqliteDriverFailure(SQL_INVALID);
156
+ return parsed.data;
157
+ }
158
+ /** SQLite's primary result codes the drivers classify. */
159
+ const SQLITE_ERROR = 1;
160
+ const SQLITE_CONSTRAINT = 19;
161
+ const SQLITE_BUSY = 5;
162
+ const SQLITE_LOCKED = 6;
163
+ /** The primary result code of an (extended) SQLite result code. */
164
+ export function primaryResultCode(errcode) {
165
+ return errcode & 0xff;
166
+ }
167
+ function codeDetails(primary) {
168
+ return primary === undefined ? {} : { errcode: primary };
169
+ }
170
+ /** SQLite's extended result codes for a unique or primary-key collision. */
171
+ const SQLITE_CONSTRAINT_PRIMARYKEY = 1555;
172
+ const SQLITE_CONSTRAINT_UNIQUE = 2067;
173
+ /** The most host text classification will inspect; no host text is returned. */
174
+ const SQLITE_HOST_TEXT_LIMIT = 4_096;
175
+ /** The text a host SQLite error carries: bounded, read only to classify it, never repeated. */
176
+ export const SqliteHostErrorSchema = z.object({ message: z.string().max(SQLITE_HOST_TEXT_LIMIT) });
177
+ const NodeSqliteHostCodeSchema = z.object({ errcode: z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER) });
178
+ const BunSqliteHostCodeSchema = z.object({ errno: z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER) });
179
+ function readSqliteHostCode(failure, codeField) {
180
+ try {
181
+ if (codeField === 'errcode') {
182
+ const parsed = NodeSqliteHostCodeSchema.safeParse(failure);
183
+ return { ok: true, value: parsed.success ? parsed.data.errcode : undefined };
184
+ }
185
+ const parsed = BunSqliteHostCodeSchema.safeParse(failure);
186
+ return { ok: true, value: parsed.success ? parsed.data.errno : undefined };
187
+ }
188
+ catch (error) {
189
+ return { ok: false, failure: valueFreeFailure(CaughtFailureSchema.parse(error)) };
190
+ }
191
+ }
192
+ function readSqliteHostMessage(failure) {
193
+ try {
194
+ const parsed = SqliteHostErrorSchema.safeParse(failure);
195
+ return { ok: true, value: parsed.success ? parsed.data.message : undefined };
196
+ }
197
+ catch (error) {
198
+ return { ok: false, failure: valueFreeFailure(CaughtFailureSchema.parse(error)) };
199
+ }
200
+ }
201
+ /**
202
+ * Read a host SQLite error once without trusting its prototype, getters or
203
+ * message. Only an integer result code and bounded text used for fixed
204
+ * classification leave this function; the host error itself never does.
205
+ */
206
+ export function readSqliteHostFailure(failure, codeField) {
207
+ const code = readSqliteHostCode(failure, codeField);
208
+ const message = readSqliteHostMessage(failure);
209
+ const errcode = code.ok ? code.value : undefined;
210
+ const text = message.ok ? message.value : undefined;
211
+ if (!code.ok && !message.ok) {
212
+ return { errcode, message: text, errcodeReadFailure: code.failure, messageReadFailure: message.failure };
213
+ }
214
+ if (!code.ok)
215
+ return { errcode, message: text, errcodeReadFailure: code.failure };
216
+ if (!message.ok)
217
+ return { errcode, message: text, messageReadFailure: message.failure };
218
+ return { errcode, message: text };
219
+ }
220
+ /** Merge any failure encountered while reading host fields into bounded refusal details. */
221
+ export function sqliteHostFailureDetails(host, details) {
222
+ if (host.errcodeReadFailure === undefined && host.messageReadFailure === undefined)
223
+ return details;
224
+ let merged = details;
225
+ if (host.errcodeReadFailure !== undefined) {
226
+ merged = { ...merged, ...sqliteFailureFacts('errcodeReadFailure', host.errcodeReadFailure) };
227
+ }
228
+ if (host.messageReadFailure !== undefined) {
229
+ merged = { ...merged, ...sqliteFailureFacts('messageReadFailure', host.messageReadFailure) };
230
+ }
231
+ return merged;
232
+ }
233
+ /**
234
+ * The fixed condition a failed statement hit, from SQLite's extended result
235
+ * code and (only to classify it) SQLite's text; the text itself is dropped.
236
+ */
237
+ export function sqliteFailureConditionOf(errcode, sqliteText) {
238
+ if (errcode === undefined)
239
+ return undefined;
240
+ const primary = primaryResultCode(errcode);
241
+ const text = sqliteText ?? '';
242
+ // A collision is a constraint result (19); its extended code or SQLite's own wording names
243
+ // a unique or primary-key index. A trigger's RAISE is a constraint too, but never these.
244
+ if (primary === SQLITE_CONSTRAINT) {
245
+ const keyed = errcode === SQLITE_CONSTRAINT_UNIQUE || errcode === SQLITE_CONSTRAINT_PRIMARYKEY;
246
+ // SQLite's wording counts only when the host reports no extended code (a bare 19).
247
+ return keyed || (errcode === SQLITE_CONSTRAINT && /^UNIQUE constraint failed/i.test(text)) ? 'unique-constraint' : undefined;
248
+ }
249
+ // Schema conditions are generic errors (1) in SQLite's own wording; any other result code,
250
+ // whatever its text (a trigger message, a constraint name), is not one of them.
251
+ if (primary !== SQLITE_ERROR)
252
+ return undefined;
253
+ if (/^no such table/i.test(text))
254
+ return 'missing-table';
255
+ if (/^no such column/i.test(text))
256
+ return 'missing-column';
257
+ if (/^(table|index|view|trigger) \S+ already exists$/i.test(text))
258
+ return 'already-exists';
259
+ if (/syntax error|incomplete input|unrecognized token/i.test(text))
260
+ return 'syntax-error';
261
+ return undefined;
262
+ }
263
+ /**
264
+ * Describe a failed statement by its SQLite result code (`undefined` when the
265
+ * host error carries none) and SQLite's text, read only to classify it into a
266
+ * fixed `details.condition`: `SQLITE_BUSY`/`SQLITE_LOCKED` are `CONFLICT
267
+ * sqlite-busy` (retryable), anything else `INTERNAL sqlite-statement-failed`;
268
+ * `details.errcode` is the primary code.
269
+ */
270
+ export function describeStatementFailure(errcode, sqliteText) {
271
+ const primary = errcode === undefined ? undefined : primaryResultCode(errcode);
272
+ const condition = sqliteFailureConditionOf(errcode, sqliteText);
273
+ if (primary === SQLITE_BUSY || primary === SQLITE_LOCKED) {
274
+ return {
275
+ message: 'SQLite is busy: another connection holds the lock.',
276
+ code: 'CONFLICT',
277
+ reason: SQLITE_DRIVER_REFUSALS.busy,
278
+ retryable: true,
279
+ details: codeDetails(primary)
280
+ };
281
+ }
282
+ return {
283
+ message: 'A SQLite statement failed.',
284
+ code: 'INTERNAL',
285
+ reason: SQLITE_DRIVER_REFUSALS.statementFailed,
286
+ retryable: false,
287
+ details: condition === undefined ? codeDetails(primary) : { ...codeDetails(primary), condition }
288
+ };
289
+ }
290
+ /**
291
+ * Describe a failed host open: busy is `sqlite-busy`; anything else is
292
+ * `UNAVAILABLE sqlite-open-failed`. Only the filesystem preflight below may
293
+ * classify a path as `sqlite-database-missing`.
294
+ */
295
+ export function describeOpenFailure(_request, errcode) {
296
+ const primary = errcode === undefined ? undefined : primaryResultCode(errcode);
297
+ if (primary === SQLITE_BUSY || primary === SQLITE_LOCKED)
298
+ return describeStatementFailure(errcode);
299
+ return {
300
+ message: 'The SQLite database could not be opened.',
301
+ code: 'UNAVAILABLE',
302
+ reason: SQLITE_DRIVER_REFUSALS.openFailed,
303
+ retryable: false,
304
+ details: codeDetails(primary)
305
+ };
306
+ }
307
+ /** `NOT_FOUND sqlite-database-missing`: the request did not allow creating a missing file. */
308
+ export const DATABASE_MISSING = {
309
+ message: 'No SQLite database exists at the path, and the open does not create one.',
310
+ code: 'NOT_FOUND',
311
+ reason: SQLITE_DRIVER_REFUSALS.databaseMissing,
312
+ retryable: false
313
+ };
314
+ /**
315
+ * Prove a non-creating open names an existing filesystem entry, through the
316
+ * host's `statPath`. Only the filesystem's missing-path conditions (ENOENT,
317
+ * ENOTDIR) become `sqlite-database-missing`;
318
+ * denied, malformed and I/O failures remain `sqlite-open-failed`.
319
+ */
320
+ export function requireExistingSqliteFile(host, request) {
321
+ if (request.memory || request.create)
322
+ return;
323
+ try {
324
+ host.statPath(request.path);
325
+ }
326
+ catch (error) {
327
+ const errno = valueFreeFailure(CaughtFailureSchema.parse(error)).code;
328
+ if (errno === 'ENOENT' || errno === 'ENOTDIR')
329
+ throw sqliteDriverFailure(DATABASE_MISSING);
330
+ throw sqliteDriverFailure({
331
+ message: 'The SQLite database could not be opened.',
332
+ code: 'UNAVAILABLE',
333
+ reason: SQLITE_DRIVER_REFUSALS.openFailed,
334
+ retryable: false,
335
+ details: errno === undefined ? undefined : { errno }
336
+ });
337
+ }
338
+ }
339
+ /** `UNAVAILABLE sqlite-connection-closed`. */
340
+ export const CONNECTION_CLOSED = {
341
+ message: 'The SQLite connection is closed.',
342
+ code: 'UNAVAILABLE',
343
+ reason: SQLITE_DRIVER_REFUSALS.connectionClosed,
344
+ retryable: false
345
+ };
346
+ /** `INTERNAL sqlite-close-failed`. */
347
+ export const CLOSE_FAILED = {
348
+ message: 'The SQLite connection could not be closed.',
349
+ code: 'INTERNAL',
350
+ reason: SQLITE_DRIVER_REFUSALS.closeFailed,
351
+ retryable: true
352
+ };
353
+ const TRANSACTION_ASYNC = {
354
+ message: 'A SQLite transaction body must be synchronous.',
355
+ code: 'INVALID_INPUT',
356
+ reason: SQLITE_DRIVER_REFUSALS.transactionAsync,
357
+ retryable: false
358
+ };
359
+ const TRANSACTION_ROLLBACK_FAILED = {
360
+ message: 'The SQLite transaction failed and could not be rolled back.',
361
+ code: 'INTERNAL',
362
+ reason: SQLITE_DRIVER_REFUSALS.statementFailed,
363
+ retryable: false,
364
+ details: { bodyFailed: 1, rollbackFailed: 1 }
365
+ };
366
+ /** A row the host returned, as a plain object (Node returns null-prototype rows). */
367
+ export function plainRow(row) {
368
+ return { ...row };
369
+ }
370
+ /** A body's result that stands for work still running: a Promise (what an async body returns). */
371
+ const PendingWorkSchema = z.instanceof(Promise);
372
+ /** Undo the work of a failed body: to the savepoint when nested, else the whole transaction when SQLite still holds it open. */
373
+ function rollBack(target, nested, savepoint) {
374
+ if (nested) {
375
+ target.exec(`ROLLBACK TO ${savepoint}`);
376
+ target.exec(`RELEASE ${savepoint}`);
377
+ }
378
+ else if (target.inTransaction) {
379
+ target.exec('ROLLBACK');
380
+ }
381
+ }
382
+ function tryRollBack(target, nested, savepoint) {
383
+ try {
384
+ rollBack(target, nested, savepoint);
385
+ return { ok: true };
386
+ }
387
+ catch (error) {
388
+ return { ok: false, failure: valueFreeFailure(CaughtFailureSchema.parse(error)) };
389
+ }
390
+ }
391
+ /**
392
+ * The one transaction runner every host uses: BEGIN (IMMEDIATE when asked), run, COMMIT; ROLLBACK and
393
+ * rethrow when `run` throws or SQLite refuses the COMMIT. Inside an open
394
+ * transaction it uses a savepoint (`SAVEPOINT`, `RELEASE`; `ROLLBACK TO` then
395
+ * `RELEASE` on a throw). `run` is synchronous: a Promise result is rolled
396
+ * back and refused `INVALID_INPUT sqlite-transaction-async`, because the work
397
+ * it stands for would run after the commit. A rollback that itself fails is
398
+ * reported as one fixed, cause-free refusal; neither host failure escapes.
399
+ */
400
+ export function runSqliteTransaction(target, savepoint, run, options = {}) {
401
+ const nested = target.inTransaction;
402
+ target.exec(nested ? `SAVEPOINT ${savepoint}` : options.immediate === true ? 'BEGIN IMMEDIATE' : 'BEGIN');
403
+ try {
404
+ const value = run();
405
+ if (PendingWorkSchema.safeParse(value).success)
406
+ throw sqliteDriverFailure(TRANSACTION_ASYNC);
407
+ // A COMMIT SQLite refuses (busy) leaves the transaction open: it is rolled back below like a failed body.
408
+ target.exec(nested ? `RELEASE ${savepoint}` : 'COMMIT');
409
+ return value;
410
+ }
411
+ catch (error) {
412
+ const rolledBack = tryRollBack(target, nested, savepoint);
413
+ if (!rolledBack.ok) {
414
+ throw sqliteDriverFailure({
415
+ ...TRANSACTION_ROLLBACK_FAILED,
416
+ details: {
417
+ ...TRANSACTION_ROLLBACK_FAILED.details,
418
+ ...sqliteFailureFacts('bodyFailure', valueFreeFailure(CaughtFailureSchema.parse(error))),
419
+ ...sqliteFailureFacts('rollbackFailure', rolledBack.failure)
420
+ }
421
+ });
422
+ }
423
+ throw error;
424
+ }
425
+ }
426
+ //# sourceMappingURL=sqlite-driver.base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-driver.base.js","sourceRoot":"","sources":["../../src/driver/sqlite-driver.base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * The SQLite driver kind (`localdb/sqlite-driver`): LocalDB's contract with the
3
+ * host that opens SQLite files (#011 ruling 2026-10-03).
4
+ *
5
+ * LocalDB owns this contract and the policy above it (pragmas, WAL
6
+ * maintenance, startup retry, migrations); each host package implements it
7
+ * with its own SQLite binding (`bun:sqlite` in runtime-environment-bun,
8
+ * `node:sqlite` in runtime-environment-node) and registers the implementation
9
+ * on the runtimes it builds. LocalDB resolves it from the runtime each call is
10
+ * handed and never reads a host error shape: hosts classify every failure into
11
+ * the typed refusals below.
12
+ *
13
+ * Calls are synchronous, as SQLite's are. See SPEC "SQLite driver kind".
14
+ */
15
+ import * as z from 'zod/v4';
16
+ import { type CaughtFailure } from '@vibesdotdev/kernel';
17
+ /** The kind id hosts register their driver under. */
18
+ export declare const LOCALDB_SQLITE_DRIVER_KIND = "localdb/sqlite-driver";
19
+ /** Every refusal a driver raises, by reason. Host errors are classified into bounded details and never attached as `cause`. */
20
+ export declare const SQLITE_DRIVER_REFUSALS: {
21
+ /** `INVALID_INPUT`: the open request is not an absolute path (or `:memory:`) with well-formed own options. */
22
+ readonly openInvalid: "sqlite-open-invalid";
23
+ /** `NOT_FOUND`: `create: false` and no file at the path. */
24
+ readonly databaseMissing: "sqlite-database-missing";
25
+ /** `UNAVAILABLE`: the host could not open the file. */
26
+ readonly openFailed: "sqlite-open-failed";
27
+ /** `CONFLICT`, retryable: `SQLITE_BUSY` or `SQLITE_LOCKED`. */
28
+ readonly busy: "sqlite-busy";
29
+ /** `INTERNAL`: any other SQLite failure of a statement. */
30
+ readonly statementFailed: "sqlite-statement-failed";
31
+ /** `INVALID_INPUT`: SQL text that is not a string. */
32
+ readonly sqlInvalid: "sqlite-sql-invalid";
33
+ /** `INVALID_INPUT`: a bound parameter is not a {@link SqliteBinding}. */
34
+ readonly bindingInvalid: "sqlite-binding-invalid";
35
+ /** `INVALID_INPUT`: a transaction body returned a Promise; it was rolled back. */
36
+ readonly transactionAsync: "sqlite-transaction-async";
37
+ /** `UNAVAILABLE`: a call on a connection after `close()`. */
38
+ readonly connectionClosed: "sqlite-connection-closed";
39
+ /** `INTERNAL`: the host refused to close the connection. */
40
+ readonly closeFailed: "sqlite-close-failed";
41
+ };
42
+ export type SqliteDriverRefusal = (typeof SQLITE_DRIVER_REFUSALS)[keyof typeof SQLITE_DRIVER_REFUSALS];
43
+ /**
44
+ * What a failed statement hit, as a fixed word the host reads from SQLite's
45
+ * result code and text: owners branch on it (a missing table is an empty
46
+ * store, a unique collision a lost race) without SQLite's text — which quotes
47
+ * the statement's literals and names — ever reaching a message. Carried as
48
+ * `details.condition` on `sqlite-statement-failed`.
49
+ */
50
+ export declare const SQLITE_FAILURE_CONDITIONS: readonly ["unique-constraint", "missing-table", "missing-column", "already-exists", "syntax-error"];
51
+ export type SqliteFailureCondition = (typeof SQLITE_FAILURE_CONDITIONS)[number];
52
+ /**
53
+ * The condition a driver's `sqlite-statement-failed` refusal carries, found on
54
+ * `failure` or along its `cause` chain (an owner may wrap it), or `undefined`.
55
+ * It reads only the typed refusal, never a host error's text.
56
+ */
57
+ export declare function sqliteFailureCondition(failure: CaughtFailure): SqliteFailureCondition | undefined;
58
+ /** One value SQLite stores and returns in a row cell. */
59
+ export type SqliteValue = string | number | bigint | null | Uint8Array;
60
+ /** One positional parameter: a {@link SqliteValue}, or a boolean, which binds as 1 or 0 (as SQLite stores it). */
61
+ export type SqliteBinding = SqliteValue | boolean;
62
+ /** One result row: a plain object of column name to cell. */
63
+ export type SqliteRow = Readonly<Record<string, SqliteValue>>;
64
+ /** What a statement that writes reports. */
65
+ export interface SqliteRunResult {
66
+ readonly changes: number;
67
+ readonly lastInsertRowid: number | bigint;
68
+ }
69
+ /**
70
+ * A prepared statement. Parameters are positional. `TRow` is the row type the
71
+ * caller's SQL selects (a typed query, as `bun:sqlite`'s statements are typed);
72
+ * it defaults to {@link SqliteRow}.
73
+ */
74
+ export interface SqliteStatement<TRow extends object = SqliteRow> {
75
+ all(...params: SqliteBinding[]): TRow[];
76
+ /** The first row, or `null` (never `undefined`) when there is none. */
77
+ get(...params: SqliteBinding[]): TRow | null;
78
+ run(...params: SqliteBinding[]): SqliteRunResult;
79
+ }
80
+ /** How a transaction begins. */
81
+ export interface SqliteTransactionOptions {
82
+ /** `BEGIN IMMEDIATE`: take the write lock at the start (default: deferred `BEGIN`). Ignored when nested. */
83
+ readonly immediate?: boolean;
84
+ }
85
+ /** One open SQLite connection. */
86
+ export interface SqliteConnection {
87
+ /** The path it was opened with. */
88
+ readonly path: string;
89
+ /** Whether the connection is inside a transaction. */
90
+ readonly inTransaction: boolean;
91
+ /** Run one or more statements that return no rows. */
92
+ exec(sql: string): void;
93
+ prepare<TRow extends object = SqliteRow>(sql: string): SqliteStatement<TRow>;
94
+ /**
95
+ * Run `run` inside BEGIN/COMMIT (ROLLBACK on a throw or a refused COMMIT; a
96
+ * nested call uses a savepoint) and return its value. `run` is synchronous:
97
+ * a Promise result is rolled back and refused `sqlite-transaction-async`.
98
+ */
99
+ transaction<T>(run: () => T, options?: SqliteTransactionOptions): T;
100
+ /** Close the connection; closing a closed connection does nothing. */
101
+ close(): void;
102
+ }
103
+ /** How a file is opened. */
104
+ export interface SqliteOpenOptions {
105
+ /** Create a missing file (default `true`); `false` refuses `sqlite-database-missing`. */
106
+ readonly create?: boolean;
107
+ /** Open read-only (default `false`). */
108
+ readonly readonly?: boolean;
109
+ }
110
+ /** The driver a host registers. */
111
+ export interface SqliteDriver {
112
+ /** The host label (`bun`, `node`). */
113
+ readonly host: string;
114
+ /** Open `path` (an absolute file path, or `:memory:`). */
115
+ open(path: string, options?: SqliteOpenOptions): SqliteConnection;
116
+ }
117
+ /** A driver descriptor: which host implements it. */
118
+ export declare const SqliteDriverDescriptorSchema: z.ZodObject<{
119
+ id: z.ZodString;
120
+ name: z.ZodOptional<z.ZodString>;
121
+ description: z.ZodOptional<z.ZodString>;
122
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
123
+ hardware: z.ZodOptional<z.ZodArray<z.ZodString>>;
124
+ enabled: z.ZodOptional<z.ZodBoolean>;
125
+ priority: z.ZodOptional<z.ZodNumber>;
126
+ capabilityId: z.ZodOptional<z.ZodString>;
127
+ requiredContext: z.ZodOptional<z.ZodArray<z.ZodString>>;
128
+ optionalContext: z.ZodOptional<z.ZodArray<z.ZodString>>;
129
+ config: z.ZodOptional<z.ZodUnknown>;
130
+ retention: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
131
+ maxAgeDays: z.ZodOptional<z.ZodNumber>;
132
+ maxEntries: z.ZodOptional<z.ZodNumber>;
133
+ maxBytes: z.ZodOptional<z.ZodNumber>;
134
+ cascadeFrom: z.ZodOptional<z.ZodString>;
135
+ ageField: z.ZodOptional<z.ZodString>;
136
+ reason: z.ZodString;
137
+ enforcedBy: z.ZodOptional<z.ZodString>;
138
+ }, z.core.$strip>]>>;
139
+ kind: z.ZodLiteral<"localdb/sqlite-driver">;
140
+ host: z.ZodString;
141
+ }, z.core.$strip>;
142
+ export type SqliteDriverDescriptor = z.infer<typeof SqliteDriverDescriptorSchema>;
143
+ /**
144
+ * Whether an implementation a loader produced honors the driver contract's
145
+ * shape: a non-empty host label and an `open` function. A getter or Proxy
146
+ * trap that throws while it is read propagates to the resolving call, which
147
+ * rejects; it is never answered as a driver.
148
+ */
149
+ export declare function isSqliteDriver(implementation: SqliteDriver): boolean;
150
+ /** The kind LocalDB registers; a loader whose implementation is not a driver is refused `implementation-invalid`. */
151
+ export declare const sqliteDriverKind: import("@vibesdotdev/kernel").RuntimeKindDescriptorRecord<SqliteDriver>;
152
+ /** Whether `error` is a driver's `sqlite-busy` refusal: the only startup failure LocalDB retries. */
153
+ export declare function isSqliteBusy(failure: CaughtFailure): boolean;
154
+ //# sourceMappingURL=sqlite-driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-driver.d.ts","sourceRoot":"","sources":["../../src/driver/sqlite-driver.ts"],"names":[],"mappings":"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"}