@cogenta/core 0.1.0

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 (193) hide show
  1. package/dist/cache/entry.d.ts +32 -0
  2. package/dist/cache/entry.d.ts.map +1 -0
  3. package/dist/cache/entry.js +72 -0
  4. package/dist/cache/entry.js.map +1 -0
  5. package/dist/cache/file.d.ts +16 -0
  6. package/dist/cache/file.d.ts.map +1 -0
  7. package/dist/cache/file.js +191 -0
  8. package/dist/cache/file.js.map +1 -0
  9. package/dist/cache/index.d.ts +20 -0
  10. package/dist/cache/index.d.ts.map +1 -0
  11. package/dist/cache/index.js +25 -0
  12. package/dist/cache/index.js.map +1 -0
  13. package/dist/cache/memory.d.ts +11 -0
  14. package/dist/cache/memory.d.ts.map +1 -0
  15. package/dist/cache/memory.js +89 -0
  16. package/dist/cache/memory.js.map +1 -0
  17. package/dist/cache/redis.d.ts +54 -0
  18. package/dist/cache/redis.d.ts.map +1 -0
  19. package/dist/cache/redis.js +167 -0
  20. package/dist/cache/redis.js.map +1 -0
  21. package/dist/cache/types.d.ts +37 -0
  22. package/dist/cache/types.d.ts.map +1 -0
  23. package/dist/cache/types.js +2 -0
  24. package/dist/cache/types.js.map +1 -0
  25. package/dist/config/define-config.d.ts +19 -0
  26. package/dist/config/define-config.d.ts.map +1 -0
  27. package/dist/config/define-config.js +20 -0
  28. package/dist/config/define-config.js.map +1 -0
  29. package/dist/config/env.d.ts +30 -0
  30. package/dist/config/env.d.ts.map +1 -0
  31. package/dist/config/env.js +139 -0
  32. package/dist/config/env.js.map +1 -0
  33. package/dist/config/index.d.ts +7 -0
  34. package/dist/config/index.d.ts.map +1 -0
  35. package/dist/config/index.js +5 -0
  36. package/dist/config/index.js.map +1 -0
  37. package/dist/config/load-config.d.ts +30 -0
  38. package/dist/config/load-config.d.ts.map +1 -0
  39. package/dist/config/load-config.js +83 -0
  40. package/dist/config/load-config.js.map +1 -0
  41. package/dist/config/resolve-config.d.ts +14 -0
  42. package/dist/config/resolve-config.d.ts.map +1 -0
  43. package/dist/config/resolve-config.js +146 -0
  44. package/dist/config/resolve-config.js.map +1 -0
  45. package/dist/config/schema.d.ts +68 -0
  46. package/dist/config/schema.d.ts.map +1 -0
  47. package/dist/config/schema.js +75 -0
  48. package/dist/config/schema.js.map +1 -0
  49. package/dist/config/types.d.ts +126 -0
  50. package/dist/config/types.d.ts.map +1 -0
  51. package/dist/config/types.js +6 -0
  52. package/dist/config/types.js.map +1 -0
  53. package/dist/db/dialect.d.ts +64 -0
  54. package/dist/db/dialect.d.ts.map +1 -0
  55. package/dist/db/dialect.js +147 -0
  56. package/dist/db/dialect.js.map +1 -0
  57. package/dist/db/drizzle.d.ts +35 -0
  58. package/dist/db/drizzle.d.ts.map +1 -0
  59. package/dist/db/drizzle.js +128 -0
  60. package/dist/db/drizzle.js.map +1 -0
  61. package/dist/db/index.d.ts +28 -0
  62. package/dist/db/index.d.ts.map +1 -0
  63. package/dist/db/index.js +30 -0
  64. package/dist/db/index.js.map +1 -0
  65. package/dist/db/mysql.d.ts +39 -0
  66. package/dist/db/mysql.d.ts.map +1 -0
  67. package/dist/db/mysql.js +224 -0
  68. package/dist/db/mysql.js.map +1 -0
  69. package/dist/db/postgres.d.ts +47 -0
  70. package/dist/db/postgres.d.ts.map +1 -0
  71. package/dist/db/postgres.js +174 -0
  72. package/dist/db/postgres.js.map +1 -0
  73. package/dist/db/sqlite.d.ts +41 -0
  74. package/dist/db/sqlite.d.ts.map +1 -0
  75. package/dist/db/sqlite.js +213 -0
  76. package/dist/db/sqlite.js.map +1 -0
  77. package/dist/db/types.d.ts +71 -0
  78. package/dist/db/types.d.ts.map +1 -0
  79. package/dist/db/types.js +2 -0
  80. package/dist/db/types.js.map +1 -0
  81. package/dist/drivers/index.d.ts +5 -0
  82. package/dist/drivers/index.d.ts.map +1 -0
  83. package/dist/drivers/index.js +3 -0
  84. package/dist/drivers/index.js.map +1 -0
  85. package/dist/drivers/registry.d.ts +27 -0
  86. package/dist/drivers/registry.d.ts.map +1 -0
  87. package/dist/drivers/registry.js +162 -0
  88. package/dist/drivers/registry.js.map +1 -0
  89. package/dist/drivers/types.d.ts +59 -0
  90. package/dist/drivers/types.d.ts.map +1 -0
  91. package/dist/drivers/types.js +2 -0
  92. package/dist/drivers/types.js.map +1 -0
  93. package/dist/errors/codes.d.ts +8 -0
  94. package/dist/errors/codes.d.ts.map +1 -0
  95. package/dist/errors/codes.js +201 -0
  96. package/dist/errors/codes.js.map +1 -0
  97. package/dist/errors/cogenta-error.d.ts +38 -0
  98. package/dist/errors/cogenta-error.d.ts.map +1 -0
  99. package/dist/errors/cogenta-error.js +31 -0
  100. package/dist/errors/cogenta-error.js.map +1 -0
  101. package/dist/errors/index.d.ts +5 -0
  102. package/dist/errors/index.d.ts.map +1 -0
  103. package/dist/errors/index.js +3 -0
  104. package/dist/errors/index.js.map +1 -0
  105. package/dist/id.d.ts +5 -0
  106. package/dist/id.d.ts.map +1 -0
  107. package/dist/id.js +82 -0
  108. package/dist/id.js.map +1 -0
  109. package/dist/index.d.ts +12 -0
  110. package/dist/index.d.ts.map +1 -0
  111. package/dist/index.js +12 -0
  112. package/dist/index.js.map +1 -0
  113. package/dist/logger/index.d.ts +5 -0
  114. package/dist/logger/index.d.ts.map +1 -0
  115. package/dist/logger/index.js +4 -0
  116. package/dist/logger/index.js.map +1 -0
  117. package/dist/logger/logger.d.ts +10 -0
  118. package/dist/logger/logger.d.ts.map +1 -0
  119. package/dist/logger/logger.js +108 -0
  120. package/dist/logger/logger.js.map +1 -0
  121. package/dist/logger/redact.d.ts +12 -0
  122. package/dist/logger/redact.d.ts.map +1 -0
  123. package/dist/logger/redact.js +96 -0
  124. package/dist/logger/redact.js.map +1 -0
  125. package/dist/logger/types.d.ts +32 -0
  126. package/dist/logger/types.d.ts.map +1 -0
  127. package/dist/logger/types.js +3 -0
  128. package/dist/logger/types.js.map +1 -0
  129. package/dist/media/format-sniff.d.ts +22 -0
  130. package/dist/media/format-sniff.d.ts.map +1 -0
  131. package/dist/media/format-sniff.js +77 -0
  132. package/dist/media/format-sniff.js.map +1 -0
  133. package/dist/media/index.d.ts +5 -0
  134. package/dist/media/index.d.ts.map +1 -0
  135. package/dist/media/index.js +4 -0
  136. package/dist/media/index.js.map +1 -0
  137. package/dist/media/store.d.ts +13 -0
  138. package/dist/media/store.d.ts.map +1 -0
  139. package/dist/media/store.js +211 -0
  140. package/dist/media/store.js.map +1 -0
  141. package/dist/media/types.d.ts +70 -0
  142. package/dist/media/types.d.ts.map +1 -0
  143. package/dist/media/types.js +2 -0
  144. package/dist/media/types.js.map +1 -0
  145. package/dist/migrations/index.d.ts +4 -0
  146. package/dist/migrations/index.d.ts.map +1 -0
  147. package/dist/migrations/index.js +2 -0
  148. package/dist/migrations/index.js.map +1 -0
  149. package/dist/migrations/migrator.d.ts +18 -0
  150. package/dist/migrations/migrator.d.ts.map +1 -0
  151. package/dist/migrations/migrator.js +247 -0
  152. package/dist/migrations/migrator.js.map +1 -0
  153. package/dist/migrations/types.d.ts +63 -0
  154. package/dist/migrations/types.d.ts.map +1 -0
  155. package/dist/migrations/types.js +2 -0
  156. package/dist/migrations/types.js.map +1 -0
  157. package/dist/queue/bullmq.d.ts +119 -0
  158. package/dist/queue/bullmq.d.ts.map +1 -0
  159. package/dist/queue/bullmq.js +391 -0
  160. package/dist/queue/bullmq.js.map +1 -0
  161. package/dist/queue/database.d.ts +17 -0
  162. package/dist/queue/database.d.ts.map +1 -0
  163. package/dist/queue/database.js +242 -0
  164. package/dist/queue/database.js.map +1 -0
  165. package/dist/queue/index.d.ts +7 -0
  166. package/dist/queue/index.d.ts.map +1 -0
  167. package/dist/queue/index.js +4 -0
  168. package/dist/queue/index.js.map +1 -0
  169. package/dist/queue/types.d.ts +61 -0
  170. package/dist/queue/types.d.ts.map +1 -0
  171. package/dist/queue/types.js +2 -0
  172. package/dist/queue/types.js.map +1 -0
  173. package/dist/storage/index.d.ts +14 -0
  174. package/dist/storage/index.d.ts.map +1 -0
  175. package/dist/storage/index.js +17 -0
  176. package/dist/storage/index.js.map +1 -0
  177. package/dist/storage/key.d.ts +12 -0
  178. package/dist/storage/key.d.ts.map +1 -0
  179. package/dist/storage/key.js +43 -0
  180. package/dist/storage/key.js.map +1 -0
  181. package/dist/storage/local.d.ts +23 -0
  182. package/dist/storage/local.d.ts.map +1 -0
  183. package/dist/storage/local.js +204 -0
  184. package/dist/storage/local.js.map +1 -0
  185. package/dist/storage/s3.d.ts +54 -0
  186. package/dist/storage/s3.d.ts.map +1 -0
  187. package/dist/storage/s3.js +240 -0
  188. package/dist/storage/s3.js.map +1 -0
  189. package/dist/storage/types.d.ts +45 -0
  190. package/dist/storage/types.d.ts.map +1 -0
  191. package/dist/storage/types.js +2 -0
  192. package/dist/storage/types.js.map +1 -0
  193. package/package.json +82 -0
@@ -0,0 +1,213 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { mkdir } from 'node:fs/promises';
3
+ import { dirname, resolve } from 'node:path';
4
+ import { CogentaError } from '../errors/index.js';
5
+ import { compile, isWrite, returnsRows } from './dialect.js';
6
+ /**
7
+ * `node:sqlite` ships with Node, so the default install compiles nothing and
8
+ * depends on nothing. `better-sqlite3` is deliberately not used: it is native
9
+ * code, and rule R10 forbids that without a fallback because it breaks on ARM,
10
+ * musl and shared hosting — exactly the deployments SQLite is meant to serve.
11
+ *
12
+ * It is unflagged from Node 22.13. On an older runtime this returns null and the
13
+ * registry reports the driver as unavailable rather than crashing.
14
+ */
15
+ export async function loadSqliteModule() {
16
+ try {
17
+ return (await import('node:sqlite'));
18
+ }
19
+ catch {
20
+ return null;
21
+ }
22
+ }
23
+ /**
24
+ * One transaction at a time per database file, per process.
25
+ *
26
+ * `node:sqlite` is synchronous. Two connections to the same file inside one
27
+ * process deadlock without this: the second `BEGIN IMMEDIATE` blocks the thread
28
+ * holding it, and the first transaction can never reach its `COMMIT` because its
29
+ * continuation needs an event loop that is no longer turning. SQLite's
30
+ * `busy_timeout` cannot help — it just decides how long the deadlock lasts
31
+ * before it becomes an error.
32
+ *
33
+ * Serialising costs no parallelism that existed: a synchronous driver on one
34
+ * thread was never going to run two transactions at once. It turns a deadlock
35
+ * into an orderly queue. Across *processes*, SQLite's own locking applies as
36
+ * usual.
37
+ */
38
+ const fileLocks = new Map();
39
+ async function withFileLock(key, run) {
40
+ const previous = fileLocks.get(key) ?? Promise.resolve();
41
+ const current = previous.then(run, run);
42
+ fileLocks.set(key, current.catch(() => undefined));
43
+ try {
44
+ return await current;
45
+ }
46
+ finally {
47
+ if (fileLocks.get(key) === current)
48
+ fileLocks.delete(key);
49
+ }
50
+ }
51
+ function fileFromUrl(url) {
52
+ if (url === ':memory:')
53
+ return ':memory:';
54
+ if (url.startsWith('file:'))
55
+ return url.slice('file:'.length).replace(/^\/\//, '');
56
+ if (url.startsWith('sqlite://'))
57
+ return url.slice('sqlite://'.length);
58
+ return url;
59
+ }
60
+ function executorFor(database) {
61
+ const executor = {
62
+ dialect: 'sqlite',
63
+ query: async (fragment) => executor.execute(compile(fragment, 'sqlite')),
64
+ execute: async ({ text, params }, options) => {
65
+ try {
66
+ const statement = database.prepare(text);
67
+ const asArrays = options?.asArrays === true;
68
+ if (asArrays)
69
+ statement.setReturnArrays?.(true);
70
+ if (returnsRows(text)) {
71
+ const raw = statement.all(...params);
72
+ const rows = (asArrays && statement.setReturnArrays === undefined ? raw.map(toValues) : raw);
73
+ return { rows, rowsAffected: isWrite(text) ? rows.length : 0 };
74
+ }
75
+ const result = statement.run(...params);
76
+ return { rows: [], rowsAffected: Number(result.changes) };
77
+ }
78
+ catch (error) {
79
+ throw new CogentaError({
80
+ code: 'DB_UNREACHABLE',
81
+ message: `SQLite rejected a statement: ${error instanceof Error ? error.message : String(error)}`,
82
+ hint: 'Check the statement and the schema. The failing SQL is in the details.',
83
+ cause: error,
84
+ // The statement is included, the parameters are not: they routinely
85
+ // carry personal data, and this ends up in a log.
86
+ details: { sql: text },
87
+ });
88
+ }
89
+ },
90
+ };
91
+ return executor;
92
+ }
93
+ /**
94
+ * The values of a row in the order the statement selected them.
95
+ *
96
+ * Only reached on a runtime whose `node:sqlite` cannot return arrays directly.
97
+ * Object key order follows column order, so this is exact for every query except
98
+ * one that selects the same column name twice.
99
+ */
100
+ function toValues(row) {
101
+ return Object.values(row);
102
+ }
103
+ export async function createSqliteHandle(options) {
104
+ const module = await loadSqliteModule();
105
+ if (module === null) {
106
+ throw new CogentaError({
107
+ code: 'DRIVER_INIT_FAILED',
108
+ message: 'This Node runtime has no built-in SQLite module.',
109
+ hint: 'Upgrade to Node 22.13 or later, or use Postgres or MySQL instead.',
110
+ });
111
+ }
112
+ const file = fileFromUrl(options.url);
113
+ if (file !== ':memory:')
114
+ await mkdir(dirname(file), { recursive: true });
115
+ const database = new module.DatabaseSync(file);
116
+ const executor = executorFor(database);
117
+ // Two :memory: handles are two separate databases, so they never contend.
118
+ const lockKey = file === ':memory:' ? `memory:${randomUUID()}` : resolve(file);
119
+ // WAL lets a writer and readers work at the same time. Without it concurrent
120
+ // writes serialise on a global lock and time out under any real load — the
121
+ // failure the L0 spec calls out by name. `:memory:` has no journal to switch.
122
+ if (file !== ':memory:')
123
+ database.exec('PRAGMA journal_mode = WAL');
124
+ database.exec('PRAGMA busy_timeout = 5000');
125
+ database.exec('PRAGMA foreign_keys = ON');
126
+ let depth = 0;
127
+ return {
128
+ dialect: 'sqlite',
129
+ // Every statement takes the file lock, not only transactions. A plain
130
+ // UPDATE from a second connection, while a first holds BEGIN IMMEDIATE,
131
+ // deadlocks the process just as surely: it blocks the only thread, so the
132
+ // transaction it is waiting on can never commit. A statement issued from
133
+ // inside our own transaction already holds the lock and must not re-take it.
134
+ query: async (fragment) => depth > 0
135
+ ? executor.query(fragment)
136
+ : withFileLock(lockKey, () => executor.query(fragment)),
137
+ execute: async (query, executeOptions) => depth > 0
138
+ ? executor.execute(query, executeOptions)
139
+ : withFileLock(lockKey, () => executor.execute(query, executeOptions)),
140
+ transaction: async (run, transactionOptions) => {
141
+ // A nested call is already inside the lock; taking it again would wait on
142
+ // itself forever.
143
+ if (depth > 0)
144
+ return runTransaction(run, transactionOptions);
145
+ return withFileLock(lockKey, () => runTransaction(run, transactionOptions));
146
+ },
147
+ close: async () => {
148
+ database.close();
149
+ },
150
+ };
151
+ async function runTransaction(run, transactionOptions) {
152
+ // SQLite has no nested transactions; savepoints stand in for them so a
153
+ // caller can compose two functions that each want a transaction.
154
+ const nested = depth > 0;
155
+ const savepoint = `cogenta_sp_${depth}`;
156
+ if (nested) {
157
+ database.exec(`SAVEPOINT ${savepoint}`);
158
+ }
159
+ else {
160
+ database.exec(transactionOptions?.immediate === true ? 'BEGIN IMMEDIATE' : 'BEGIN');
161
+ }
162
+ depth += 1;
163
+ try {
164
+ const result = await run(executor);
165
+ database.exec(nested ? `RELEASE ${savepoint}` : 'COMMIT');
166
+ return result;
167
+ }
168
+ catch (error) {
169
+ if (nested) {
170
+ database.exec(`ROLLBACK TO ${savepoint}`);
171
+ database.exec(`RELEASE ${savepoint}`);
172
+ }
173
+ else {
174
+ database.exec('ROLLBACK');
175
+ }
176
+ throw error;
177
+ }
178
+ finally {
179
+ depth -= 1;
180
+ }
181
+ }
182
+ }
183
+ export function sqliteDatabaseDriver() {
184
+ let handle;
185
+ let url;
186
+ return {
187
+ name: 'sqlite',
188
+ tier: 'degraded',
189
+ available: async () => (await loadSqliteModule()) !== null,
190
+ init: async (config) => {
191
+ url = config.url ?? './.cogenta/site.db';
192
+ handle ??= await createSqliteHandle({ url });
193
+ return handle;
194
+ },
195
+ dispose: async () => {
196
+ await handle?.close();
197
+ handle = undefined;
198
+ },
199
+ health: async () => {
200
+ if (handle === undefined) {
201
+ return { status: 'down', driver: 'sqlite', tier: 'degraded', message: 'Not opened.' };
202
+ }
203
+ return {
204
+ status: 'degraded',
205
+ driver: 'sqlite',
206
+ tier: 'degraded',
207
+ // The path is safe to show; a SQLite URL never carries a password.
208
+ message: `SQLite at ${url ?? 'an unopened path'}. Single machine, no vector index.`,
209
+ };
210
+ },
211
+ };
212
+ }
213
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/db/sqlite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import type { CompiledQuery, SqlFragment } from './dialect.js';
2
+ export declare const DATABASE_DIALECTS: readonly ['postgres', 'mysql', 'sqlite'];
3
+ export type DatabaseDialect = (typeof DATABASE_DIALECTS)[number];
4
+ export interface QueryResult<TRow = Record<string, unknown>> {
5
+ readonly rows: TRow[];
6
+ /** Rows created, changed or removed. Zero for a plain read. */
7
+ readonly rowsAffected: number;
8
+ /**
9
+ * The auto-increment key the server assigned to the first inserted row.
10
+ *
11
+ * Only MySQL reports one. Postgres and SQLite say the same thing through
12
+ * `RETURNING`, which is why nothing in the layer depends on this — it exists
13
+ * so the Drizzle bridge can answer `$returningId()` on MySQL.
14
+ */
15
+ readonly insertId?: number;
16
+ }
17
+ export interface ExecuteOptions {
18
+ /**
19
+ * Hand back each row as the ordered list of its column values instead of an
20
+ * object keyed by column name.
21
+ *
22
+ * A query that selects two columns with the same name — every join does,
23
+ * `users.id` and `posts.id` — loses one of them in an object, because the
24
+ * second key overwrites the first. Callers that map by position rather than by
25
+ * name need the values in order, and that is what an ORM built on top of this
26
+ * layer does.
27
+ */
28
+ readonly asArrays?: boolean;
29
+ }
30
+ export interface SqlExecutor {
31
+ readonly dialect: DatabaseDialect;
32
+ query<TRow = Record<string, unknown>>(fragment: SqlFragment): Promise<QueryResult<TRow>>;
33
+ /**
34
+ * Runs SQL that is already rendered for this dialect, placeholders and all.
35
+ *
36
+ * The escape hatch for a layer that writes its own SQL rather than composing
37
+ * `sql` fragments — Drizzle, in practice. It skips `encodeValue` on purpose:
38
+ * such a layer has already mapped every value to what its own column types
39
+ * promise, and encoding twice would corrupt it.
40
+ */
41
+ execute<TRow = Record<string, unknown>>(query: CompiledQuery, options?: ExecuteOptions): Promise<QueryResult<TRow>>;
42
+ }
43
+ export interface TransactionOptions {
44
+ /**
45
+ * Take the write lock at `BEGIN` instead of at the first write.
46
+ *
47
+ * On SQLite a deferred transaction that reads and then writes can fail with
48
+ * SQLITE_BUSY under concurrency, because the lock it needs was taken by
49
+ * someone else in between. Any read-modify-write — reserving a job, bumping a
50
+ * counter — needs this.
51
+ */
52
+ readonly immediate?: boolean;
53
+ }
54
+ export interface DatabaseHandle extends SqlExecutor {
55
+ transaction<T>(run: (tx: SqlExecutor) => Promise<T>, options?: TransactionOptions): Promise<T>;
56
+ close(): Promise<void>;
57
+ }
58
+ /** The resolved `database` section of the configuration. */
59
+ export interface DatabaseConfig {
60
+ readonly driver?: string;
61
+ readonly url?: string;
62
+ /**
63
+ * Maximum simultaneous connections. Deliberately small by default: shared
64
+ * hosting allows very few, and exhausting them takes the whole site down.
65
+ */
66
+ readonly poolSize?: number;
67
+ }
68
+ export interface DatabaseDriverOptions {
69
+ readonly poolSize?: number;
70
+ }
71
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/db/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE9D,eAAO,MAAM,iBAAiB,YAAI,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAU,CAAA;AAEzE,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEhE,MAAM,WAAW,WAAW,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACzD,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAA;IACrB,+DAA+D;IAC/D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B;;;;;;;;;OASG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;IACjC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAA;IACxF;;;;;;;OAOG;IACH,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,KAAK,EAAE,aAAa,EACpB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAA;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC;;;;;;;OAOG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IAC9F,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED,4DAA4D;AAC5D,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B"}
@@ -0,0 +1,2 @@
1
+ export const DATABASE_DIALECTS = ['postgres', 'mysql', 'sqlite'];
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/db/types.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAU,CAAA"}
@@ -0,0 +1,5 @@
1
+ export type { DriverRegistry, DriverRegistryOptions } from './registry.js';
2
+ export { createDriverRegistry } from './registry.js';
3
+ export type { Driver, DriverChoice, DriverSelection, DriverTier, HealthReport, HealthStatus, SkippedDriver, } from './types.js';
4
+ export { DRIVER_TIERS } from './types.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/drivers/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AACpD,YAAY,EACV,MAAM,EACN,YAAY,EACZ,eAAe,EACf,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,GACd,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { createDriverRegistry } from './registry.js';
2
+ export { DRIVER_TIERS } from './types.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/drivers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAUpD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,27 @@
1
+ import { type Logger } from '../logger/index.js';
2
+ import { type Driver, type DriverChoice, type DriverSelection } from './types.js';
3
+ export interface DriverRegistryOptions {
4
+ /** What this registry provides: `cache`, `queue`, `storage`, `database`. */
5
+ readonly need: string;
6
+ readonly logger?: Logger;
7
+ }
8
+ export interface DriverRegistry<TInstance, TConfig extends DriverChoice> {
9
+ register(driver: Driver<TInstance, TConfig>): void;
10
+ /** Registered drivers, optimal first. Used by `cogenta doctor`. */
11
+ list(): readonly Driver<TInstance, TConfig>[];
12
+ select(config: TConfig): Promise<DriverSelection<TInstance>>;
13
+ }
14
+ /**
15
+ * Holds the implementations of one infrastructure need and picks between them.
16
+ *
17
+ * Two rules, and the difference between them matters more than it looks:
18
+ *
19
+ * - The configuration **names** a driver → that driver is used, and any failure
20
+ * is fatal. The operator asked for Redis; starting on the filesystem instead
21
+ * and saying nothing would be a silent, invisible downgrade of their site.
22
+ * - The configuration names **nothing** → the first available driver wins, in
23
+ * tier order, and failures fall through. `npm create cogenta` must produce a
24
+ * working site with nothing else installed.
25
+ */
26
+ export declare function createDriverRegistry<TInstance, TConfig extends DriverChoice>(options: DriverRegistryOptions): DriverRegistry<TInstance, TConfig>;
27
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/drivers/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC9D,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,YAAY,EACjB,KAAK,eAAe,EAGrB,MAAM,YAAY,CAAA;AAEnB,MAAM,WAAW,qBAAqB;IACpC,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,cAAc,CAAC,SAAS,EAAE,OAAO,SAAS,YAAY;IACrE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IAClD,mEAAmE;IACnE,IAAI,IAAI,SAAS,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAA;IAC7C,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAA;CAC7D;AAYD;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,OAAO,SAAS,YAAY,EAC1E,OAAO,EAAE,qBAAqB,GAC7B,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,CA6JpC"}
@@ -0,0 +1,162 @@
1
+ import { CogentaError } from '../errors/index.js';
2
+ import { createLogger } from '../logger/index.js';
3
+ import { DRIVER_TIERS, } from './types.js';
4
+ /** `auto`, like an absent value, means "you choose". */
5
+ function namedDriver(config) {
6
+ const requested = config.driver;
7
+ return requested === undefined || requested === 'auto' ? undefined : requested;
8
+ }
9
+ function describe(error) {
10
+ return error instanceof Error ? error.message : String(error);
11
+ }
12
+ /**
13
+ * Holds the implementations of one infrastructure need and picks between them.
14
+ *
15
+ * Two rules, and the difference between them matters more than it looks:
16
+ *
17
+ * - The configuration **names** a driver → that driver is used, and any failure
18
+ * is fatal. The operator asked for Redis; starting on the filesystem instead
19
+ * and saying nothing would be a silent, invisible downgrade of their site.
20
+ * - The configuration names **nothing** → the first available driver wins, in
21
+ * tier order, and failures fall through. `npm create cogenta` must produce a
22
+ * working site with nothing else installed.
23
+ */
24
+ export function createDriverRegistry(options) {
25
+ const { need } = options;
26
+ const logger = (options.logger ?? createLogger()).child({ need });
27
+ const drivers = new Map();
28
+ function ordered() {
29
+ return DRIVER_TIERS.flatMap((tier) => [...drivers.values()].filter((d) => d.tier === tier));
30
+ }
31
+ function selection(driver, instance, requested, reason, skipped) {
32
+ let disposed = false;
33
+ logger.info('driver selected', { driver: driver.name, tier: driver.tier, reason, requested });
34
+ return {
35
+ need,
36
+ driver: driver.name,
37
+ tier: driver.tier,
38
+ instance,
39
+ requested,
40
+ reason,
41
+ skipped,
42
+ dispose: async () => {
43
+ if (disposed)
44
+ return;
45
+ disposed = true;
46
+ await driver.dispose();
47
+ },
48
+ health: () => driver.health(),
49
+ };
50
+ }
51
+ async function selectNamed(name, config) {
52
+ const driver = drivers.get(name);
53
+ if (driver === undefined) {
54
+ const known = ordered().map((d) => d.name);
55
+ throw new CogentaError({
56
+ code: 'DRIVER_UNKNOWN',
57
+ message: `No ${need} driver named "${name}".`,
58
+ hint: known.length === 0
59
+ ? `No ${need} driver is registered at all.`
60
+ : `Available ${need} drivers: ${known.join(', ')}. Use "auto" to let Cogenta choose.`,
61
+ details: { need, requested: name, known },
62
+ });
63
+ }
64
+ let reachable;
65
+ try {
66
+ reachable = await driver.available(config);
67
+ }
68
+ catch (error) {
69
+ throw new CogentaError({
70
+ code: 'DRIVER_UNAVAILABLE',
71
+ message: `The ${need} driver "${name}" could not be reached: ${describe(error)}`,
72
+ hint: `Start the service, fix its URL, or set ${need}.driver to "auto" to fall back automatically.`,
73
+ cause: error,
74
+ details: { need, driver: name },
75
+ });
76
+ }
77
+ if (!reachable) {
78
+ throw new CogentaError({
79
+ code: 'DRIVER_UNAVAILABLE',
80
+ message: `The ${need} driver "${name}" is configured but not available.`,
81
+ hint: `Start the service, fix its URL, or set ${need}.driver to "auto" to fall back automatically.`,
82
+ details: { need, driver: name },
83
+ });
84
+ }
85
+ try {
86
+ const instance = await driver.init(config);
87
+ return selection(driver, instance, true, `named in the configuration`, []);
88
+ }
89
+ catch (error) {
90
+ throw new CogentaError({
91
+ code: 'DRIVER_INIT_FAILED',
92
+ message: `The ${need} driver "${name}" failed to start: ${describe(error)}`,
93
+ hint: `This driver was named in the configuration, so Cogenta will not fall back to another one on its own. Fix it, or set ${need}.driver to "auto".`,
94
+ cause: error,
95
+ details: { need, driver: name },
96
+ });
97
+ }
98
+ }
99
+ async function selectAutomatically(config) {
100
+ const skipped = [];
101
+ for (const driver of ordered()) {
102
+ const skip = (reason) => {
103
+ skipped.push({ driver: driver.name, tier: driver.tier, reason });
104
+ logger.debug('driver skipped', { driver: driver.name, tier: driver.tier, reason });
105
+ };
106
+ try {
107
+ if (!(await driver.available(config))) {
108
+ skip('not available');
109
+ continue;
110
+ }
111
+ }
112
+ catch (error) {
113
+ skip(`not available: ${describe(error)}`);
114
+ continue;
115
+ }
116
+ try {
117
+ const instance = await driver.init(config);
118
+ const because = skipped.length === 0
119
+ ? 'first available driver'
120
+ : `${skipped.map((s) => `${s.driver} ${s.reason}`).join(', ')}`;
121
+ return selection(driver, instance, false, because, skipped);
122
+ }
123
+ catch (error) {
124
+ // It answered the probe and failed anyway. Keep going: the site booting
125
+ // on a degraded driver beats the site not booting.
126
+ skip(`failed to start: ${describe(error)}`);
127
+ logger.warn('driver failed to start, trying the next one', {
128
+ driver: driver.name,
129
+ error,
130
+ });
131
+ }
132
+ }
133
+ const tried = skipped.map((s) => `${s.driver} (${s.reason})`).join(', ');
134
+ throw new CogentaError({
135
+ code: 'DRIVER_UNAVAILABLE',
136
+ message: skipped.length === 0
137
+ ? `No ${need} driver is registered.`
138
+ : `No ${need} driver is available. Tried: ${tried}.`,
139
+ hint: `Every Cogenta need has a driver that works without any external service. If you see this, the degraded ${need} driver is missing or broken — please report it.`,
140
+ details: { need, skipped },
141
+ });
142
+ }
143
+ return {
144
+ register(driver) {
145
+ if (drivers.has(driver.name)) {
146
+ throw new CogentaError({
147
+ code: 'DRIVER_DUPLICATE',
148
+ message: `A ${need} driver named "${driver.name}" is already registered.`,
149
+ hint: 'Driver names are unique per need. Rename one of them.',
150
+ details: { need, driver: driver.name },
151
+ });
152
+ }
153
+ drivers.set(driver.name, driver);
154
+ },
155
+ list: () => ordered(),
156
+ select: async (config) => {
157
+ const name = namedDriver(config);
158
+ return name === undefined ? selectAutomatically(config) : selectNamed(name, config);
159
+ },
160
+ };
161
+ }
162
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/drivers/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * `optimal` needs an external service. `degraded` needs nothing beyond Node and
3
+ * the filesystem. Rule R1: every infrastructure need has at least one of each,
4
+ * so the default install has no external dependency at all.
5
+ */
6
+ export type DriverTier = 'optimal' | 'degraded';
7
+ export declare const DRIVER_TIERS: readonly DriverTier[];
8
+ export type HealthStatus = 'ok' | 'degraded' | 'down';
9
+ export interface HealthReport {
10
+ readonly status: HealthStatus;
11
+ readonly driver: string;
12
+ readonly tier: DriverTier;
13
+ readonly latencyMs?: number;
14
+ /** Plain sentence for the admin. Must never contain a credential. */
15
+ readonly message?: string;
16
+ readonly details?: Readonly<Record<string, unknown>>;
17
+ }
18
+ /**
19
+ * One implementation of an infrastructure need.
20
+ *
21
+ * `available()` answers "does the service actually answer?" — not "is a URL
22
+ * configured?". Getting that wrong turns a fallback into a startup crash.
23
+ */
24
+ export interface Driver<TInstance, TConfig> {
25
+ readonly name: string;
26
+ readonly tier: DriverTier;
27
+ available(config: TConfig): Promise<boolean>;
28
+ init(config: TConfig): Promise<TInstance>;
29
+ dispose(): Promise<void>;
30
+ health(): Promise<HealthReport>;
31
+ }
32
+ export interface SkippedDriver {
33
+ readonly driver: string;
34
+ readonly tier: DriverTier;
35
+ readonly reason: string;
36
+ }
37
+ /**
38
+ * The outcome of a selection. `reason` and `skipped` exist so `cogenta doctor`
39
+ * and the admin can state what is running and why — "job queue: database
40
+ * (degraded), because Redis is absent". That is a product requirement, not a
41
+ * debugging aid.
42
+ */
43
+ export interface DriverSelection<TInstance> {
44
+ readonly need: string;
45
+ readonly driver: string;
46
+ readonly tier: DriverTier;
47
+ readonly instance: TInstance;
48
+ /** True when the configuration named this driver, rather than leaving it to us. */
49
+ readonly requested: boolean;
50
+ readonly reason: string;
51
+ readonly skipped: readonly SkippedDriver[];
52
+ dispose(): Promise<void>;
53
+ health(): Promise<HealthReport>;
54
+ }
55
+ /** Any config section that may name a driver. `auto` names nothing. */
56
+ export interface DriverChoice {
57
+ readonly driver?: string;
58
+ }
59
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/drivers/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,UAAU,CAAA;AAE/C,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAA4B,CAAA;AAE1E,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,UAAU,GAAG,MAAM,CAAA;AAErD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,qEAAqE;IACrE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CACrD;AAED;;;;;GAKG;AACH,MAAM,WAAW,MAAM,CAAC,SAAS,EAAE,OAAO;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;IACzB,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC5C,IAAI,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;IACzC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACxB,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC,CAAA;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe,CAAC,SAAS;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAA;IAC5B,mFAAmF;IACnF,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAA;IAC1C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACxB,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC,CAAA;CAChC;AAED,uEAAuE;AACvE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB"}
@@ -0,0 +1,2 @@
1
+ export const DRIVER_TIERS = ['optimal', 'degraded'];
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/drivers/types.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,YAAY,GAA0B,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Every error Cogenta throws carries one of these codes. They are a public API:
3
+ * callers branch on them, logs are aggregated by them, and translations key off
4
+ * them. Adding a code is a minor version; changing the meaning of one is major.
5
+ */
6
+ export declare const ERROR_CODES: readonly ['CONFIG_INVALID', 'CONFIG_NOT_FOUND', 'CONFIG_LOAD_FAILED', 'CONFIG_SECRET_IN_FILE', 'DRIVER_UNKNOWN', 'DRIVER_DUPLICATE', 'DRIVER_UNAVAILABLE', 'DRIVER_INIT_FAILED', 'DB_UNREACHABLE', 'DB_DIALECT_UNSUPPORTED', 'MIGRATION_FAILED', 'MIGRATION_IRREVERSIBLE', 'MIGRATION_LOCKED', 'MIGRATION_CHECKSUM_MISMATCH', 'MIGRATION_DESTRUCTIVE', 'SCHEMA_INVALID', 'CONTENT_NOT_FOUND', 'CONTENT_INVALID', 'CONTENT_CONFLICT', 'CONTENT_SLUG_INVALID', 'CONTENT_SLUG_TAKEN', 'CONTENT_ROUTE_INVALID', 'CONTENT_REDIRECT_LOOP', 'CONTENT_SCHEDULE_INVALID', 'CONTENT_READ_ONLY', 'BLOCK_UNKNOWN', 'BLOCK_INVALID', 'BLOCK_DEFINITION_INVALID', 'BLOCK_MIGRATION_FAILED', 'SKIN_TOKEN_MISSING', 'SKIN_TOKEN_UNKNOWN', 'SKIN_TOKEN_INVALID', 'SKIN_CONTRAST_INSUFFICIENT', 'SKIN_SCALE_NOT_MONOTONIC', 'SKIN_MOTION_NOT_REDUCED', 'THEME_NOT_FOUND', 'THEME_INVALID', 'THEME_BLOCK_MISSING', 'THEME_IMPORT_FORBIDDEN', 'THEME_SIGNATURE_INVALID', 'CONTENT_API_FAILED', 'THEME_IMAGE_UNSUPPORTED', 'BUILD_TARGET_UNKNOWN', 'BUILD_RUNTIME_UNSATISFIED', 'FORBIDDEN', 'UNAUTHENTICATED', 'PREVIEW_TOKEN_INVALID', 'PREVIEW_TOKEN_EXPIRED', 'QUERY_INVALID', 'AUTH_PASSWORD_INVALID', 'AUTH_INVALID_CREDENTIALS', 'AUTH_TOTP_INVALID', 'AUTH_TOTP_REQUIRED', 'AUTH_WEBAUTHN_FAILED', 'AUTH_SESSION_INVALID', 'AUTH_SESSION_EXPIRED', 'AUTH_RATE_LIMITED', 'AUTH_MFA_REQUIRED', 'AUTH_USER_EXISTS', 'AUTH_USER_NOT_FOUND', 'AUTH_ROLE_UNKNOWN', 'AUDIT_CHAIN_BROKEN', 'MEDIA_NOT_FOUND', 'MEDIA_INVALID', 'MEDIA_TYPE_REJECTED', 'CACHE_FAILED', 'QUEUE_FAILED', 'STORAGE_FAILED', 'PROVIDER_UNKNOWN', 'PROVIDER_REQUEST_FAILED', 'PROVIDER_RESPONSE_INVALID', 'PROVIDER_RATE_LIMITED', 'PROVIDER_TIMEOUT', 'TOOL_DEFINITION_INVALID', 'TOOL_DUPLICATE', 'TOOL_UNKNOWN', 'TOOL_INPUT_INVALID', 'TOOL_OUTPUT_INVALID', 'TOOL_CALL_REJECTED', 'HTTP_FETCH_DOMAIN_DENIED', 'APPROVAL_REQUEST_UNKNOWN', 'RECEIPT_UNKNOWN', 'RECEIPT_ALREADY_REVERTED', 'RECEIPT_NOT_REVERTIBLE', 'AGENT_SUBAGENT_UNKNOWN', 'AGENT_SUBAGENT_TOOLS_NOT_SUBSET', 'SKILL_UNKNOWN', 'SKILL_DEFINITION_INVALID', 'AGENT_APPROVAL_NOT_DECIDED', 'MCP_CLIENT_REMOTE_ERROR', 'MCP_CLIENT_TOOL_FAILED', 'PRIVACY_NO_DATA_LEAVES_VIOLATION', 'AGENT_DEFINITION_INVALID', 'AGENT_UNKNOWN', 'EVAL_THRESHOLD_NOT_MET', 'SECURITY_OSV_QUERY_FAILED', 'SECURITY_EPSS_QUERY_FAILED', 'SECURITY_DEPENDENCY_NOT_FOUND', 'PERFORMANCE_CRUX_QUERY_FAILED', 'BLUEPRINT_REGISTRY_CORRUPT', 'SKIN_GENERATION_RESPONSE_NOT_JSON', 'IMPORT_WXR_PARSE_FAILED', 'IMPORT_WXR_UNSAFE_DOCUMENT', 'PLAYGROUND_BLUEPRINT_UNKNOWN', 'CHANNEL_UNKNOWN', 'CHANNEL_DUPLICATE', 'CHANNEL_LINK_CODE_INVALID', 'CHANNEL_COMMAND_DUPLICATE', 'CHANNEL_TELEGRAM_API_ERROR', 'CHANNEL_MESSAGE_INVALID', 'CHANNEL_PREFERENCES_INVALID', 'CHANNEL_EMAIL_TRANSPORT_ERROR', 'CHANNEL_EMAIL_INBOUND_UNSUPPORTED', 'CHANNEL_SLACK_API_ERROR', 'CHANNEL_DISCORD_API_ERROR', 'CHANNEL_WEBHOOK_SIGNATURE_INVALID', 'CHANNEL_WEBHOOK_EXPIRED', 'CHANNEL_WEBHOOK_REPLAY_DETECTED', 'CHANNEL_WEBHOOK_DELIVERY_FAILED', 'CHANNEL_WEBHOOK_INBOUND_UNSUPPORTED', 'PLUGIN_MANIFEST_INVALID', 'PLUGIN_SOURCE_NOT_FOUND', 'PLUGIN_MANIFEST_FILE_NOT_FOUND', 'PLUGIN_MANIFEST_LOAD_FAILED', 'PLUGIN_MANIFEST_EXPORT_INVALID', 'PLUGIN_WORKER_TIMEOUT', 'PLUGIN_WORKER_CRASHED', 'PLUGIN_WORKER_RUNTIME_ERROR', 'PLUGIN_CAPABILITY_REFUSED', 'PLUGIN_DISABLED', 'PLUGIN_SIGNATURE_MISSING', 'PLUGIN_SIGNATURE_INVALID', 'FLEET_TELEMETRY_FORBIDDEN_FIELD', 'FLEET_CAMPAIGN_NOT_FOUND', 'FLEET_CAMPAIGN_STATE_CORRUPT', 'FLEET_ROLLBACK_NO_PRIOR_VERSION', 'INTERNAL'];
7
+ export type ErrorCode = (typeof ERROR_CODES)[number];
8
+ //# sourceMappingURL=codes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codes.d.ts","sourceRoot":"","sources":["../../src/errors/codes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,WAAW,YAEtB,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EAGvB,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EAGpB,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,6BAA6B,EAC7B,uBAAuB,EAGvB,gBAAgB,EAGhB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACvB,0BAA0B,EAC1B,mBAAmB,EAGnB,eAAe,EACf,eAAe,EACf,0BAA0B,EAC1B,wBAAwB,EAIxB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,4BAA4B,EAC5B,0BAA0B,EAC1B,yBAAyB,EAGzB,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,wBAAwB,EACxB,yBAAyB,EAGzB,oBAAoB,EAIpB,yBAAyB,EAIzB,sBAAsB,EACtB,2BAA2B,EAG3B,WAAW,EACX,iBAAiB,EACjB,uBAAuB,EACvB,uBAAuB,EACvB,eAAe,EAGf,uBAAuB,EACvB,0BAA0B,EAC1B,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EAGpB,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EAGrB,cAAc,EACd,cAAc,EACd,gBAAgB,EAGhB,kBAAkB,EAClB,yBAAyB,EACzB,2BAA2B,EAC3B,uBAAuB,EACvB,kBAAkB,EAGlB,yBAAyB,EACzB,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EAGpB,0BAA0B,EAG1B,0BAA0B,EAG1B,iBAAiB,EACjB,0BAA0B,EAC1B,wBAAwB,EAGxB,wBAAwB,EACxB,iCAAiC,EAGjC,eAAe,EACf,0BAA0B,EAG1B,4BAA4B,EAG5B,yBAAyB,EACzB,wBAAwB,EAGxB,kCAAkC,EAGlC,0BAA0B,EAC1B,eAAe,EAGf,wBAAwB,EAGxB,2BAA2B,EAC3B,4BAA4B,EAC5B,+BAA+B,EAG/B,+BAA+B,EAG/B,4BAA4B,EAG5B,mCAAmC,EAGnC,yBAAyB,EACzB,4BAA4B,EAG5B,8BAA8B,EAG9B,iBAAiB,EACjB,mBAAmB,EAGnB,2BAA2B,EAG3B,2BAA2B,EAG3B,4BAA4B,EAG5B,yBAAyB,EAGzB,6BAA6B,EAG7B,+BAA+B,EAC/B,mCAAmC,EAGnC,yBAAyB,EAGzB,2BAA2B,EAG3B,mCAAmC,EACnC,yBAAyB,EACzB,iCAAiC,EACjC,iCAAiC,EACjC,qCAAqC,EAGrC,yBAAyB,EAGzB,yBAAyB,EACzB,gCAAgC,EAChC,6BAA6B,EAC7B,gCAAgC,EAGhC,uBAAuB,EACvB,uBAAuB,EACvB,6BAA6B,EAG7B,2BAA2B,EAG3B,iBAAiB,EAGjB,0BAA0B,EAC1B,0BAA0B,EAG1B,iCAAiC,EAGjC,0BAA0B,EAC1B,8BAA8B,EAG9B,iCAAiC,EAGjC,UAAU,CACF,CAAA;AAEV,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA"}