@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,146 @@
1
+ import { isAbsolute, resolve as resolvePath } from 'node:path';
2
+ import { CogentaError } from '../errors/index.js';
3
+ import { applyEnv, findSecretsInFile, readSecrets, SECRET_KEYS } from './env.js';
4
+ import { configSchema, formatIssues } from './schema.js';
5
+ import { DATABASE_DRIVERS, } from './types.js';
6
+ const CONFIG_HINT = 'Fix the fields listed above in cogenta.config.ts, or set the matching COGENTA_* ' +
7
+ 'environment variables.';
8
+ function isPlainObject(value) {
9
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
10
+ }
11
+ /**
12
+ * Reads the driver from the URL scheme. A single-letter scheme is a Windows
13
+ * drive letter, not a protocol — `C:\site\data.db` is a SQLite path.
14
+ */
15
+ function inferDatabaseDriver(url) {
16
+ const scheme = /^([a-z][a-z0-9+.-]*):/i.exec(url)?.[1]?.toLowerCase();
17
+ if (scheme === undefined || scheme.length === 1)
18
+ return 'sqlite';
19
+ switch (scheme) {
20
+ case 'postgres':
21
+ case 'postgresql':
22
+ return 'postgres';
23
+ case 'mysql':
24
+ case 'mariadb':
25
+ return 'mysql';
26
+ case 'file':
27
+ case 'sqlite':
28
+ return 'sqlite';
29
+ default:
30
+ return undefined;
31
+ }
32
+ }
33
+ /**
34
+ * Resolves a path written in a config file against the directory that file
35
+ * lives in, rather than against the current working directory.
36
+ *
37
+ * Without this, running a command from a subdirectory silently uses different
38
+ * files: `cogenta migrate status` from `src/` opens an empty `./site.db` next to
39
+ * `src/` and reports every migration as pending, on a database that is already
40
+ * fully migrated. A relative path in a committed config file means "relative to
41
+ * the project", the way it does in every other tool that reads one.
42
+ *
43
+ * A URL is left alone, and so is `:memory:`. A Windows drive letter is not a
44
+ * scheme — the pattern needs two characters before the colon.
45
+ */
46
+ function againstConfigFile(value, baseDir) {
47
+ if (baseDir === undefined || value === ':memory:')
48
+ return value;
49
+ if (/^[a-z][a-z0-9+.-]+:/i.test(value))
50
+ return value;
51
+ return isAbsolute(value) ? value : resolvePath(baseDir, value);
52
+ }
53
+ /**
54
+ * Turns whatever was written in a config file into the fully resolved
55
+ * configuration the rest of Cogenta consumes.
56
+ *
57
+ * Precedence is defaults → file → environment. An invalid configuration fails
58
+ * here, at startup, naming every offending field at once — never three requests
59
+ * later with a stack trace.
60
+ *
61
+ * `baseDir` is the directory of the config file, when there was one. Relative
62
+ * paths are resolved against it.
63
+ */
64
+ export function resolveConfig(input, env = process.env, baseDir) {
65
+ if (!isPlainObject(input)) {
66
+ throw new CogentaError({
67
+ code: 'CONFIG_INVALID',
68
+ message: `Cogenta configuration must be an object, received ${input === null ? 'null' : typeof input}.`,
69
+ hint: 'Export a default object from cogenta.config.ts, built with defineConfig().',
70
+ });
71
+ }
72
+ const leaked = findSecretsInFile(input);
73
+ if (leaked.length > 0) {
74
+ const variables = leaked.map((path) => SECRET_KEYS.get(path)).join(', ');
75
+ throw new CogentaError({
76
+ code: 'CONFIG_SECRET_IN_FILE',
77
+ message: `Secrets must not appear in the config file: ${leaked.join(', ')}.`,
78
+ hint: `Remove them and set ${variables} in the environment instead. cogenta.config.ts is committed to git; anything in it is public to everyone with repository access.`,
79
+ details: { fields: leaked },
80
+ });
81
+ }
82
+ const parsed = configSchema.safeParse(applyEnv(input, env));
83
+ if (!parsed.success) {
84
+ throw new CogentaError({
85
+ code: 'CONFIG_INVALID',
86
+ message: `Invalid Cogenta configuration:\n${formatIssues(parsed.error)}`,
87
+ hint: CONFIG_HINT,
88
+ });
89
+ }
90
+ const config = parsed.data;
91
+ const driver = config.database.driver ?? inferDatabaseDriver(config.database.url);
92
+ if (driver === undefined) {
93
+ throw new CogentaError({
94
+ code: 'CONFIG_INVALID',
95
+ message: 'Invalid Cogenta configuration:\n database.driver: cannot be inferred from the database URL. ' +
96
+ `Name one of ${DATABASE_DRIVERS.join(', ')} explicitly.`,
97
+ hint: CONFIG_HINT,
98
+ });
99
+ }
100
+ const secrets = readSecrets(env);
101
+ return Object.freeze({
102
+ site: Object.freeze({
103
+ name: config.site.name,
104
+ url: config.site.url,
105
+ locales: Object.freeze([...config.site.locales]),
106
+ defaultLocale: config.site.defaultLocale,
107
+ }),
108
+ database: Object.freeze({
109
+ driver,
110
+ // Only SQLite has a path for a URL; the others are server addresses.
111
+ url: driver === 'sqlite' ? againstConfigFile(config.database.url, baseDir) : config.database.url,
112
+ poolSize: config.database.poolSize,
113
+ }),
114
+ cache: Object.freeze({
115
+ driver: config.cache.driver,
116
+ url: config.cache.url,
117
+ path: againstConfigFile(config.cache.path, baseDir),
118
+ }),
119
+ queue: Object.freeze({ driver: config.queue.driver, url: config.queue.url }),
120
+ storage: Object.freeze({
121
+ driver: config.storage.driver,
122
+ bucket: config.storage.bucket,
123
+ region: config.storage.region,
124
+ endpoint: config.storage.endpoint,
125
+ path: againstConfigFile(config.storage.path, baseDir),
126
+ baseUrl: config.storage.baseUrl,
127
+ accessKeyId: secrets.storageAccessKeyId,
128
+ secretAccessKey: secrets.storageSecretAccessKey,
129
+ }),
130
+ auth: Object.freeze({ signingKey: secrets.authSigningKey }),
131
+ llm: config.llm === undefined
132
+ ? undefined
133
+ : Object.freeze({
134
+ provider: config.llm.provider,
135
+ model: config.llm.model,
136
+ baseUrl: config.llm.baseUrl,
137
+ apiKey: secrets.llmApiKey,
138
+ }),
139
+ embeddings: Object.freeze({
140
+ provider: config.embeddings.provider,
141
+ model: config.embeddings.model,
142
+ dimensions: config.embeddings.dimensions,
143
+ }),
144
+ });
145
+ }
146
+ //# sourceMappingURL=resolve-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-config.js","sourceRoot":"","sources":["../../src/config/resolve-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import { z } from 'zod';
2
+ export declare const configSchema: z.ZodObject<{
3
+ site: z.ZodObject<{
4
+ name: z.ZodString;
5
+ url: z.ZodURL;
6
+ locales: z.ZodDefault<z.ZodArray<z.ZodString>>;
7
+ defaultLocale: z.ZodDefault<z.ZodString>;
8
+ }, z.core.$strict>;
9
+ database: z.ZodObject<{
10
+ driver: z.ZodOptional<z.ZodEnum<{
11
+ mysql: "mysql";
12
+ postgres: "postgres";
13
+ sqlite: "sqlite";
14
+ }>>;
15
+ url: z.ZodString;
16
+ poolSize: z.ZodDefault<z.ZodNumber>;
17
+ }, z.core.$strict>;
18
+ cache: z.ZodPrefault<z.ZodObject<{
19
+ driver: z.ZodDefault<z.ZodEnum<{
20
+ auto: "auto";
21
+ file: "file";
22
+ memory: "memory";
23
+ redis: "redis";
24
+ }>>;
25
+ url: z.ZodOptional<z.ZodString>;
26
+ path: z.ZodDefault<z.ZodString>;
27
+ }, z.core.$strict>>;
28
+ queue: z.ZodPrefault<z.ZodObject<{
29
+ driver: z.ZodDefault<z.ZodEnum<{
30
+ auto: "auto";
31
+ database: "database";
32
+ redis: "redis";
33
+ }>>;
34
+ url: z.ZodOptional<z.ZodString>;
35
+ }, z.core.$strict>>;
36
+ storage: z.ZodPrefault<z.ZodObject<{
37
+ driver: z.ZodDefault<z.ZodEnum<{
38
+ auto: "auto";
39
+ local: "local";
40
+ s3: "s3";
41
+ }>>;
42
+ bucket: z.ZodOptional<z.ZodString>;
43
+ region: z.ZodOptional<z.ZodString>;
44
+ endpoint: z.ZodOptional<z.ZodString>;
45
+ path: z.ZodDefault<z.ZodString>;
46
+ baseUrl: z.ZodDefault<z.ZodString>;
47
+ }, z.core.$strict>>;
48
+ llm: z.ZodOptional<z.ZodObject<{
49
+ provider: z.ZodString;
50
+ model: z.ZodString;
51
+ baseUrl: z.ZodOptional<z.ZodString>;
52
+ }, z.core.$strict>>;
53
+ embeddings: z.ZodPrefault<z.ZodObject<{
54
+ provider: z.ZodDefault<z.ZodEnum<{
55
+ local: "local";
56
+ openai: "openai";
57
+ }>>;
58
+ model: z.ZodDefault<z.ZodString>;
59
+ dimensions: z.ZodDefault<z.ZodNumber>;
60
+ }, z.core.$strict>>;
61
+ }, z.core.$strict>;
62
+ export type ParsedConfig = z.infer<typeof configSchema>;
63
+ /**
64
+ * Renders Zod issues as `field: reason`, one per line, so the user sees every
65
+ * problem at once instead of fixing them one restart at a time.
66
+ */
67
+ export declare function formatIssues(error: z.ZodError): string;
68
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAoEvB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAQvB,CAAA;AAEF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAEvD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,GAAG,MAAM,CAOtD"}
@@ -0,0 +1,75 @@
1
+ import { z } from 'zod';
2
+ import { CACHE_DRIVERS, DATABASE_DRIVERS, EMBEDDINGS_PROVIDERS, QUEUE_DRIVERS, STORAGE_DRIVERS, } from './types.js';
3
+ const nonEmpty = z.string().min(1);
4
+ // Every object is strict: a typo in a key is an error, never a silently ignored
5
+ // setting. Config drift between staging and production is the daily pain this
6
+ // project exists to remove (ADR-0010).
7
+ const siteSchema = z
8
+ .strictObject({
9
+ name: nonEmpty,
10
+ url: z.url(),
11
+ locales: z.array(nonEmpty).min(1).default(['en']),
12
+ defaultLocale: nonEmpty.default('en'),
13
+ })
14
+ .refine((site) => site.locales.includes(site.defaultLocale), {
15
+ error: 'defaultLocale must be one of the configured locales',
16
+ path: ['defaultLocale'],
17
+ });
18
+ const databaseSchema = z.strictObject({
19
+ driver: z.enum(DATABASE_DRIVERS).optional(),
20
+ url: nonEmpty,
21
+ // Modest by default: shared hosting allows very few connections, and
22
+ // exhausting them takes the site down rather than slowing it.
23
+ poolSize: z.number().int().positive().max(100).default(5),
24
+ });
25
+ const cacheSchema = z.strictObject({
26
+ driver: z.enum(CACHE_DRIVERS).default('auto'),
27
+ url: nonEmpty.optional(),
28
+ path: nonEmpty.default('./.cogenta/cache'),
29
+ });
30
+ const queueSchema = z.strictObject({
31
+ driver: z.enum(QUEUE_DRIVERS).default('auto'),
32
+ url: nonEmpty.optional(),
33
+ });
34
+ const storageSchema = z.strictObject({
35
+ driver: z.enum(STORAGE_DRIVERS).default('auto'),
36
+ bucket: nonEmpty.optional(),
37
+ region: nonEmpty.optional(),
38
+ endpoint: nonEmpty.optional(),
39
+ path: nonEmpty.default('./.cogenta/media'),
40
+ baseUrl: nonEmpty.default('/media'),
41
+ });
42
+ const llmSchema = z.strictObject({
43
+ provider: nonEmpty,
44
+ model: nonEmpty,
45
+ baseUrl: nonEmpty.optional(),
46
+ });
47
+ const embeddingsSchema = z.strictObject({
48
+ provider: z.enum(EMBEDDINGS_PROVIDERS).default('local'),
49
+ model: nonEmpty.default('all-MiniLM-L6-v2'),
50
+ dimensions: z.number().int().positive().default(384),
51
+ });
52
+ // `prefault` rather than `default`: an omitted section is parsed as `{}` so the
53
+ // per-field defaults inside it apply, instead of being replaced wholesale.
54
+ export const configSchema = z.strictObject({
55
+ site: siteSchema,
56
+ database: databaseSchema,
57
+ cache: cacheSchema.prefault({}),
58
+ queue: queueSchema.prefault({}),
59
+ storage: storageSchema.prefault({}),
60
+ llm: llmSchema.optional(),
61
+ embeddings: embeddingsSchema.prefault({}),
62
+ });
63
+ /**
64
+ * Renders Zod issues as `field: reason`, one per line, so the user sees every
65
+ * problem at once instead of fixing them one restart at a time.
66
+ */
67
+ export function formatIssues(error) {
68
+ return error.issues
69
+ .map((issue) => {
70
+ const path = issue.path.map(String).join('.');
71
+ return ` ${path === '' ? '(root)' : path}: ${issue.message}`;
72
+ })
73
+ .join('\n');
74
+ }
75
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,126 @@
1
+ export declare const DATABASE_DRIVERS: readonly ['postgres', 'mysql', 'sqlite'];
2
+ export declare const CACHE_DRIVERS: readonly ['auto', 'redis', 'file', 'memory'];
3
+ export declare const QUEUE_DRIVERS: readonly ['auto', 'redis', 'database'];
4
+ export declare const STORAGE_DRIVERS: readonly ['auto', 's3', 'local'];
5
+ export declare const EMBEDDINGS_PROVIDERS: readonly ['local', 'openai'];
6
+ export type DatabaseDriverName = (typeof DATABASE_DRIVERS)[number];
7
+ export type CacheDriverName = (typeof CACHE_DRIVERS)[number];
8
+ export type QueueDriverName = (typeof QUEUE_DRIVERS)[number];
9
+ export type StorageDriverName = (typeof STORAGE_DRIVERS)[number];
10
+ export type EmbeddingsProvider = (typeof EMBEDDINGS_PROVIDERS)[number];
11
+ /**
12
+ * What a user writes in `cogenta.config.ts`. Everything but `site` and
13
+ * `database` is optional, and no field here may hold a secret — those come from
14
+ * the environment only.
15
+ */
16
+ export interface CogentaConfigInput {
17
+ readonly site: {
18
+ readonly name: string;
19
+ readonly url: string;
20
+ readonly locales?: readonly string[];
21
+ readonly defaultLocale?: string;
22
+ };
23
+ readonly database: {
24
+ /** Inferred from the URL scheme when absent. */
25
+ readonly driver?: DatabaseDriverName;
26
+ readonly url?: string;
27
+ /** Maximum simultaneous connections. Small by default. */
28
+ readonly poolSize?: number;
29
+ };
30
+ readonly cache?: {
31
+ readonly driver?: CacheDriverName;
32
+ readonly url?: string;
33
+ readonly path?: string;
34
+ };
35
+ readonly queue?: {
36
+ readonly driver?: QueueDriverName;
37
+ readonly url?: string;
38
+ };
39
+ readonly storage?: {
40
+ readonly driver?: StorageDriverName;
41
+ readonly bucket?: string;
42
+ readonly region?: string;
43
+ readonly endpoint?: string;
44
+ readonly path?: string;
45
+ /** Prefix for public media URLs. */
46
+ readonly baseUrl?: string;
47
+ };
48
+ readonly llm?: {
49
+ readonly provider?: string;
50
+ readonly model?: string;
51
+ readonly baseUrl?: string;
52
+ };
53
+ readonly embeddings?: {
54
+ readonly provider?: EmbeddingsProvider;
55
+ readonly model?: string;
56
+ readonly dimensions?: number;
57
+ };
58
+ }
59
+ /**
60
+ * What the rest of Cogenta consumes: every field resolved, defaults applied,
61
+ * secrets injected from the environment.
62
+ *
63
+ * A driver of `'auto'` means the user named none, so the registry selects the
64
+ * first available implementation by tier. A named driver is honoured, and its
65
+ * failure is fatal — never a silent fallback.
66
+ */
67
+ export interface CogentaConfig {
68
+ readonly site: {
69
+ readonly name: string;
70
+ readonly url: string;
71
+ readonly locales: readonly string[];
72
+ readonly defaultLocale: string;
73
+ };
74
+ readonly database: {
75
+ readonly driver: DatabaseDriverName;
76
+ readonly url: string;
77
+ readonly poolSize: number;
78
+ };
79
+ readonly cache: {
80
+ readonly driver: CacheDriverName;
81
+ readonly url: string | undefined;
82
+ readonly path: string;
83
+ };
84
+ readonly queue: {
85
+ readonly driver: QueueDriverName;
86
+ readonly url: string | undefined;
87
+ };
88
+ readonly storage: {
89
+ readonly driver: StorageDriverName;
90
+ readonly bucket: string | undefined;
91
+ readonly region: string | undefined;
92
+ readonly endpoint: string | undefined;
93
+ readonly path: string;
94
+ readonly baseUrl: string;
95
+ readonly accessKeyId: string | undefined;
96
+ readonly secretAccessKey: string | undefined;
97
+ };
98
+ /**
99
+ * Never settable in the config file — there is no `auth` input section, on
100
+ * purpose (rule R7). `signingKey` is `undefined` until `COGENTA_AUTH_SIGNING_KEY`
101
+ * is set; whoever wires @cogenta/auth to a real server refuses to start
102
+ * without it rather than falling back to a guessable default.
103
+ */
104
+ readonly auth: {
105
+ readonly signingKey: string | undefined;
106
+ };
107
+ /** Absent when no provider is configured. The CMS works without AI (rule R2). */
108
+ readonly llm: {
109
+ readonly provider: string;
110
+ readonly model: string;
111
+ readonly baseUrl: string | undefined;
112
+ readonly apiKey: string | undefined;
113
+ } | undefined;
114
+ /**
115
+ * The triplet is locked together on purpose: an index is only valid for the
116
+ * exact provider, model and dimensions that produced it.
117
+ */
118
+ readonly embeddings: {
119
+ readonly provider: EmbeddingsProvider;
120
+ readonly model: string;
121
+ readonly dimensions: number;
122
+ };
123
+ }
124
+ /** A read-only view of the process environment. */
125
+ export type Environment = Readonly<Record<string, string | undefined>>;
126
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export const DATABASE_DRIVERS = ['postgres', 'mysql', 'sqlite'];
2
+ export const CACHE_DRIVERS = ['auto', 'redis', 'file', 'memory'];
3
+ export const QUEUE_DRIVERS = ['auto', 'redis', 'database'];
4
+ export const STORAGE_DRIVERS = ['auto', 's3', 'local'];
5
+ export const EMBEDDINGS_PROVIDERS = ['local', 'openai'];
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAU,CAAA;AACxE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAU,CAAA;AACzE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAU,CAAA;AACnE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAU,CAAA;AAC/D,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAU,CAAA"}
@@ -0,0 +1,64 @@
1
+ import type { DatabaseDialect } from './types.js';
2
+ /**
3
+ * A piece of SQL with its bound values kept separate.
4
+ *
5
+ * Callers never write placeholders themselves: Postgres wants `$1`, MySQL and
6
+ * SQLite want `?`, and letting that choice reach a caller is exactly the dialect
7
+ * leak the L0 spec warns about. They write `` sql`… ${value}` `` and this layer
8
+ * renders it for whichever database is connected.
9
+ */
10
+ export interface SqlFragment {
11
+ readonly parts: readonly string[];
12
+ readonly values: readonly unknown[];
13
+ }
14
+ /** Tagged template for SQL. Interpolated values are always bound, never inlined. */
15
+ export declare function sql(strings: TemplateStringsArray, ...values: readonly unknown[]): SqlFragment;
16
+ /**
17
+ * Text inserted verbatim, with no binding.
18
+ *
19
+ * Only ever for SQL the code itself wrote. A value that reached the process from
20
+ * outside must go through `sql` so it is bound — this is the one function in the
21
+ * layer that can produce an injection, and it is named to say so.
22
+ */
23
+ export declare function unsafeRaw(text: string): SqlFragment;
24
+ /**
25
+ * Quotes a table or column name for the dialect. Postgres and SQLite use double
26
+ * quotes, MySQL uses backticks.
27
+ */
28
+ export declare function identifier(name: string, dialect: DatabaseDialect): SqlFragment;
29
+ /**
30
+ * Adapts a bound value to what the driver for this dialect accepts.
31
+ *
32
+ * SQLite has no boolean and no date type, so `true` and a `Date` have to become
33
+ * an integer and a string. Doing it here, once, is what stops every call site
34
+ * from having to know which database it is talking to.
35
+ */
36
+ export declare function encodeValue(value: unknown, dialect: DatabaseDialect): unknown;
37
+ export interface CompiledQuery {
38
+ readonly text: string;
39
+ readonly params: readonly unknown[];
40
+ }
41
+ /** Renders a fragment into the exact string and parameters this dialect expects. */
42
+ export declare function compile(fragment: SqlFragment, dialect: DatabaseDialect): CompiledQuery;
43
+ /**
44
+ * Statements that hand back rows: a read, or a write with `RETURNING`.
45
+ *
46
+ * Shared by every driver so `rows` and `rowsAffected` mean the same thing on all
47
+ * three dialects. Left to each driver, Postgres would report a `SELECT` of two
48
+ * rows as "two rows affected" while SQLite reported zero — the kind of quiet
49
+ * divergence the contract suite exists to prevent.
50
+ */
51
+ export declare function returnsRows(text: string): boolean;
52
+ /** True when the statement creates, changes or removes rows. */
53
+ export declare function isWrite(text: string): boolean;
54
+ /**
55
+ * Renders a `LIMIT` count as a literal rather than a bound parameter.
56
+ *
57
+ * MySQL prepared statements reject a placeholder there — `LIMIT ?` fails with
58
+ * "Incorrect arguments to mysqld_stmt_execute". Rather than encode that as one
59
+ * more dialect difference for callers to remember, the count is inlined
60
+ * everywhere. It is validated as a non-negative integer first, so inlining it
61
+ * cannot inject: this is the only place a number reaches the SQL text directly.
62
+ */
63
+ export declare function limit(count: number): SqlFragment;
64
+ //# sourceMappingURL=dialect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialect.d.ts","sourceRoot":"","sources":["../../src/db/dialect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAA;CACpC;AAsBD,oFAAoF;AACpF,wBAAgB,GAAG,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,SAAS,OAAO,EAAE,GAAG,WAAW,CA4B7F;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAEnD;AAID;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,WAAW,CAU9E;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAyB7E;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAA;CACpC;AAED,oFAAoF;AACpF,wBAAgB,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,GAAG,aAAa,CAWtF;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,gEAAgE;AAChE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7C;AAKD;;;;;;;;GAQG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAShD"}