@cogenta/cli 0.4.0 → 0.7.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 (174) hide show
  1. package/CHANGELOG.md +3951 -0
  2. package/dist/admin-assets/assets/index-Bc_X94A_.js +1090 -0
  3. package/dist/admin-assets/assets/index-CxZHGwVA.css +1 -0
  4. package/dist/admin-assets/assets/vips-_dmTUXFO.wasm +0 -0
  5. package/dist/admin-assets/assets/vips-es6-DrQTTS8Q.js +7 -0
  6. package/dist/admin-assets/branding/logo-cogenta-dark.png +0 -0
  7. package/dist/admin-assets/branding/logo-cogenta-icon.png +0 -0
  8. package/dist/admin-assets/branding/logo-cogenta-light.png +0 -0
  9. package/dist/admin-assets/branding/logo-cogenta-small.png +0 -0
  10. package/dist/admin-assets/branding/logo-cogenta-transparent.png +0 -0
  11. package/dist/admin-assets/branding/logo-cogenta.png +0 -0
  12. package/dist/admin-assets/favicon.png +0 -0
  13. package/dist/admin-assets/fonts/jetbrains-mono-var.woff2 +0 -0
  14. package/dist/admin-assets/fonts/space-grotesk-var.woff2 +0 -0
  15. package/dist/admin-assets/index.html +3 -2
  16. package/dist/bin.js +6 -0
  17. package/dist/bin.js.map +1 -1
  18. package/dist/commands/admin-assets.d.ts +1 -0
  19. package/dist/commands/admin-assets.d.ts.map +1 -1
  20. package/dist/commands/admin-assets.js +19 -1
  21. package/dist/commands/admin-assets.js.map +1 -1
  22. package/dist/commands/agent-runtime.d.ts +160 -0
  23. package/dist/commands/agent-runtime.d.ts.map +1 -0
  24. package/dist/commands/agent-runtime.js +524 -0
  25. package/dist/commands/agent-runtime.js.map +1 -0
  26. package/dist/commands/assistant.d.ts +89 -3
  27. package/dist/commands/assistant.d.ts.map +1 -1
  28. package/dist/commands/assistant.js +209 -41
  29. package/dist/commands/assistant.js.map +1 -1
  30. package/dist/commands/audit-integrity-alert.d.ts +23 -0
  31. package/dist/commands/audit-integrity-alert.d.ts.map +1 -0
  32. package/dist/commands/audit-integrity-alert.js +33 -0
  33. package/dist/commands/audit-integrity-alert.js.map +1 -0
  34. package/dist/commands/backup.d.ts +78 -0
  35. package/dist/commands/backup.d.ts.map +1 -0
  36. package/dist/commands/backup.js +238 -0
  37. package/dist/commands/backup.js.map +1 -0
  38. package/dist/commands/channels.d.ts +47 -0
  39. package/dist/commands/channels.d.ts.map +1 -0
  40. package/dist/commands/channels.js +284 -0
  41. package/dist/commands/channels.js.map +1 -0
  42. package/dist/commands/default-logo.d.ts +27 -0
  43. package/dist/commands/default-logo.d.ts.map +1 -0
  44. package/dist/commands/default-logo.js +30 -0
  45. package/dist/commands/default-logo.js.map +1 -0
  46. package/dist/commands/doctor.d.ts +5 -1
  47. package/dist/commands/doctor.d.ts.map +1 -1
  48. package/dist/commands/doctor.js +74 -2
  49. package/dist/commands/doctor.js.map +1 -1
  50. package/dist/commands/export.d.ts +22 -0
  51. package/dist/commands/export.d.ts.map +1 -0
  52. package/dist/commands/export.js +182 -0
  53. package/dist/commands/export.js.map +1 -0
  54. package/dist/commands/forms-page.d.ts +75 -0
  55. package/dist/commands/forms-page.d.ts.map +1 -0
  56. package/dist/commands/forms-page.js +191 -0
  57. package/dist/commands/forms-page.js.map +1 -0
  58. package/dist/commands/import.d.ts.map +1 -1
  59. package/dist/commands/import.js +13 -1
  60. package/dist/commands/import.js.map +1 -1
  61. package/dist/commands/mcp.d.ts +35 -0
  62. package/dist/commands/mcp.d.ts.map +1 -0
  63. package/dist/commands/mcp.js +277 -0
  64. package/dist/commands/mcp.js.map +1 -0
  65. package/dist/commands/roles.d.ts +22 -0
  66. package/dist/commands/roles.d.ts.map +1 -0
  67. package/dist/commands/roles.js +79 -0
  68. package/dist/commands/roles.js.map +1 -0
  69. package/dist/commands/search-page.d.ts +15 -0
  70. package/dist/commands/search-page.d.ts.map +1 -1
  71. package/dist/commands/search-page.js +22 -16
  72. package/dist/commands/search-page.js.map +1 -1
  73. package/dist/commands/seo.d.ts +92 -4
  74. package/dist/commands/seo.d.ts.map +1 -1
  75. package/dist/commands/seo.js +168 -4
  76. package/dist/commands/seo.js.map +1 -1
  77. package/dist/commands/serve.d.ts +439 -7
  78. package/dist/commands/serve.d.ts.map +1 -1
  79. package/dist/commands/serve.js +3515 -181
  80. package/dist/commands/serve.js.map +1 -1
  81. package/dist/commands/site-plan.d.ts +27 -1
  82. package/dist/commands/site-plan.d.ts.map +1 -1
  83. package/dist/commands/site-plan.js +79 -8
  84. package/dist/commands/site-plan.js.map +1 -1
  85. package/dist/commands/skin.d.ts.map +1 -1
  86. package/dist/commands/skin.js +7 -2
  87. package/dist/commands/skin.js.map +1 -1
  88. package/dist/commands/term-archive-page.d.ts +94 -0
  89. package/dist/commands/term-archive-page.d.ts.map +1 -0
  90. package/dist/commands/term-archive-page.js +195 -0
  91. package/dist/commands/term-archive-page.js.map +1 -0
  92. package/dist/commands/theme-css.d.ts +22 -7
  93. package/dist/commands/theme-css.d.ts.map +1 -1
  94. package/dist/commands/theme-css.js +33 -8
  95. package/dist/commands/theme-css.js.map +1 -1
  96. package/dist/commands/theme-registry.d.ts +94 -0
  97. package/dist/commands/theme-registry.d.ts.map +1 -0
  98. package/dist/commands/theme-registry.js +130 -0
  99. package/dist/commands/theme-registry.js.map +1 -0
  100. package/dist/commands/theme-render.d.ts +330 -9
  101. package/dist/commands/theme-render.d.ts.map +1 -1
  102. package/dist/commands/theme-render.js +932 -66
  103. package/dist/commands/theme-render.js.map +1 -1
  104. package/dist/commands/theme-wiring.d.ts +107 -0
  105. package/dist/commands/theme-wiring.d.ts.map +1 -0
  106. package/dist/commands/theme-wiring.js +308 -0
  107. package/dist/commands/theme-wiring.js.map +1 -0
  108. package/dist/commands/tools.d.ts +71 -0
  109. package/dist/commands/tools.d.ts.map +1 -0
  110. package/dist/commands/tools.js +330 -0
  111. package/dist/commands/tools.js.map +1 -0
  112. package/dist/commands/update.d.ts +25 -0
  113. package/dist/commands/update.d.ts.map +1 -0
  114. package/dist/commands/update.js +193 -0
  115. package/dist/commands/update.js.map +1 -0
  116. package/dist/index.d.ts +15 -0
  117. package/dist/index.d.ts.map +1 -1
  118. package/dist/index.js +146 -4
  119. package/dist/index.js.map +1 -1
  120. package/dist/invite-mail.d.ts +39 -0
  121. package/dist/invite-mail.d.ts.map +1 -0
  122. package/dist/invite-mail.js +39 -0
  123. package/dist/invite-mail.js.map +1 -0
  124. package/dist/update/apply.d.ts +54 -0
  125. package/dist/update/apply.d.ts.map +1 -0
  126. package/dist/update/apply.js +77 -0
  127. package/dist/update/apply.js.map +1 -0
  128. package/dist/update/changelog-risk.d.ts +20 -0
  129. package/dist/update/changelog-risk.d.ts.map +1 -0
  130. package/dist/update/changelog-risk.js +55 -0
  131. package/dist/update/changelog-risk.js.map +1 -0
  132. package/dist/update/check.d.ts +60 -0
  133. package/dist/update/check.d.ts.map +1 -0
  134. package/dist/update/check.js +56 -0
  135. package/dist/update/check.js.map +1 -0
  136. package/dist/update/contract-risk.d.ts +55 -0
  137. package/dist/update/contract-risk.d.ts.map +1 -0
  138. package/dist/update/contract-risk.js +75 -0
  139. package/dist/update/contract-risk.js.map +1 -0
  140. package/dist/update/history.d.ts +30 -0
  141. package/dist/update/history.d.ts.map +1 -0
  142. package/dist/update/history.js +38 -0
  143. package/dist/update/history.js.map +1 -0
  144. package/dist/update/index.d.ts +28 -0
  145. package/dist/update/index.d.ts.map +1 -0
  146. package/dist/update/index.js +11 -0
  147. package/dist/update/index.js.map +1 -0
  148. package/dist/update/list-restore-points.d.ts +20 -0
  149. package/dist/update/list-restore-points.d.ts.map +1 -0
  150. package/dist/update/list-restore-points.js +35 -0
  151. package/dist/update/list-restore-points.js.map +1 -0
  152. package/dist/update/npm-registry.d.ts +11 -0
  153. package/dist/update/npm-registry.d.ts.map +1 -0
  154. package/dist/update/npm-registry.js +74 -0
  155. package/dist/update/npm-registry.js.map +1 -0
  156. package/dist/update/restore-point.d.ts +26 -0
  157. package/dist/update/restore-point.d.ts.map +1 -0
  158. package/dist/update/restore-point.js +23 -0
  159. package/dist/update/restore-point.js.map +1 -0
  160. package/dist/update/tar.d.ts +27 -0
  161. package/dist/update/tar.d.ts.map +1 -0
  162. package/dist/update/tar.js +56 -0
  163. package/dist/update/tar.js.map +1 -0
  164. package/dist/update/version-compare.d.ts +17 -0
  165. package/dist/update/version-compare.d.ts.map +1 -0
  166. package/dist/update/version-compare.js +42 -0
  167. package/dist/update/version-compare.js.map +1 -0
  168. package/dist/version.d.ts +13 -0
  169. package/dist/version.d.ts.map +1 -0
  170. package/dist/version.js +18 -0
  171. package/dist/version.js.map +1 -0
  172. package/package.json +33 -16
  173. package/dist/admin-assets/assets/index-C9a7O_Xs.css +0 -1
  174. package/dist/admin-assets/assets/index-DXvMgWvn.js +0 -74
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,238 @@
1
+ import { createWriteStream } from 'node:fs';
2
+ import { mkdir, readdir } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import process from 'node:process';
5
+ import { AUTH_TABLES, ensureAuthTables } from '@cogenta/auth';
6
+ import { createDatabaseMediaStore, createDatabaseRegistry, createLogger, isCogentaError, loadConfig, MEDIA_TABLE, } from '@cogenta/core';
7
+ import { applyRestore, buildBackupTables, createBackup, previewRestore, readBackupManifest, } from '@cogenta/export';
8
+ import { createRedirectStore, createSchemaTables, ensureMenuTables, ensurePatternTables, MENU_TABLES, PATTERN_TABLE, REDIRECTS_TABLE, } from '@cogenta/schema';
9
+ import { loadSchemaModule } from './serve.js';
10
+ const BACKUP_USAGE = `Usage
11
+ cogenta backup create [--passphrase <text>] [--dir <path>]
12
+ cogenta backup list [--dir <path>]
13
+
14
+ Backs up every table of the site's database — content, users (hashed
15
+ passwords only), audit log, media references and, when the site sells
16
+ anything, commerce — into one file, engine-independent (never \`pg_dump\`),
17
+ with a checksum and an optional passphrase. Written to \`.cogenta/backups\`
18
+ by default: never under the site's public storage root.
19
+ `;
20
+ const RESTORE_USAGE = `Usage
21
+ cogenta restore preview <file.zip>
22
+ cogenta restore apply <file.zip> [--passphrase <text>]
23
+
24
+ Restores a full-site backup. **CLI only, on purpose** (fiche 26, task 4): a
25
+ restore overwrites the very database an admin session would be running
26
+ against, so it is not offered from the admin API at all — the admin can
27
+ restore a *content export* instead (additive, reversible through the trash),
28
+ never a whole-database backup.
29
+
30
+ Restoring writes real rows: run "preview" first to see what already exists in
31
+ the target, and restore only into a database you mean to overwrite (a freshly
32
+ created one, in the common case — a moved-to or migrated-to engine).
33
+ `;
34
+ /** Exported for `update/` (L22 task 9) — the same default directory, never a second one to keep in sync. */
35
+ export function defaultBackupDir(cwd) {
36
+ return join(cwd, '.cogenta', 'backups');
37
+ }
38
+ /**
39
+ * Opens this site's own database, the way every command in this file that
40
+ * touches it does. Exported for `update/` (L22 task 9): the update system's
41
+ * history view needs the same audit log every other admin action already
42
+ * writes to, which needs the same open connection — never a second way to
43
+ * resolve `cogenta.config.mjs` into a live `DatabaseHandle`.
44
+ */
45
+ export async function openSite(options, logger) {
46
+ const cwd = options.cwd ?? process.cwd();
47
+ const env = options.env ?? process.env;
48
+ const loaded = await loadConfig({ cwd, env });
49
+ const dbSelection = await createDatabaseRegistry({ logger }).select(loaded.config.database);
50
+ return {
51
+ db: dbSelection.instance,
52
+ site: { name: loaded.config.site.name, url: loaded.config.site.url },
53
+ dispose: dbSelection.dispose,
54
+ };
55
+ }
56
+ /**
57
+ * Every table `cogenta backup` knows how to name, assembled from each
58
+ * package's own table constants — `@cogenta/export` depends on none of them
59
+ * by design (R1/R9), so this is the one place that has to.
60
+ */
61
+ async function tablesFor(cwd) {
62
+ const { collections, taxonomies } = await loadSchemaModule(cwd);
63
+ return buildBackupTables({
64
+ collections,
65
+ taxonomies,
66
+ before: [...Object.values(AUTH_TABLES), MEDIA_TABLE],
67
+ after: [MENU_TABLES.menus, MENU_TABLES.items, REDIRECTS_TABLE, PATTERN_TABLE],
68
+ });
69
+ }
70
+ /**
71
+ * Creates every table a backup or restore touches, on whichever database is
72
+ * open — a fresh site may never have created its media, menu or redirect
73
+ * table (they are created lazily, at first use, the way `assembleSite` does
74
+ * it), and `dumpTable`'s raw `SELECT *` has no fallback for a table that
75
+ * simply is not there yet. Idempotent: every `ensure*` here is `create table
76
+ * if not exists`.
77
+ */
78
+ async function ensureAllTables(db, collections, taxonomies) {
79
+ await createSchemaTables(db, collections, taxonomies);
80
+ await ensureAuthTables(db);
81
+ await ensureMenuTables(db);
82
+ await ensurePatternTables(db);
83
+ await createRedirectStore({ db }).ensureTable();
84
+ // The media store creates its table lazily on first call; `list()` is the
85
+ // cheapest one that does so without writing anything.
86
+ await createDatabaseMediaStore({ db }).list({ limit: 1 });
87
+ }
88
+ /**
89
+ * The actual work behind `cogenta backup create` — factored out so
90
+ * `update/restore-point.ts` calls exactly this, not a reimplementation, for
91
+ * "un point de restauration obligatoire avant toute mise à jour" (L22 task
92
+ * 9, point 2: "réutilise `backup create`/`restore apply`, déjà réels depuis
93
+ * L9 fiche 26"). `runBackup`'s `create` subcommand below is now this
94
+ * function plus CLI-shaped output, nothing else.
95
+ */
96
+ export async function createSiteBackup(options) {
97
+ const logger = options.logger ?? createLogger({ level: 'silent' });
98
+ const cwd = options.cwd ?? process.cwd();
99
+ const dir = options.dir ?? defaultBackupDir(cwd);
100
+ const prefix = options.filenamePrefix ?? 'backup-';
101
+ const { collections, taxonomies } = await loadSchemaModule(cwd);
102
+ const tables = await tablesFor(cwd);
103
+ const { db, site, dispose } = await openSite(options, logger);
104
+ try {
105
+ await ensureAllTables(db, collections, taxonomies);
106
+ await mkdir(dir, { recursive: true });
107
+ const filename = `${prefix}${new Date().toISOString().replace(/[:.]/g, '-')}.zip`;
108
+ const path = join(dir, filename);
109
+ const stream = createWriteStream(path, { mode: 0o600 });
110
+ const { manifest } = await createBackup({
111
+ db,
112
+ site,
113
+ tables,
114
+ write: (chunk) => new Promise((resolve, reject) => {
115
+ stream.write(chunk, (error) => (error ? reject(error) : resolve()));
116
+ }),
117
+ ...(options.passphrase === undefined ? {} : { passphrase: options.passphrase }),
118
+ });
119
+ await new Promise((resolve, reject) => {
120
+ stream.end((error) => (error ? reject(error) : resolve()));
121
+ });
122
+ return { path, manifest };
123
+ }
124
+ finally {
125
+ await dispose();
126
+ }
127
+ }
128
+ export async function runBackup(options) {
129
+ const { out, stderr } = options;
130
+ const logger = options.logger ?? createLogger({ level: 'silent' });
131
+ const cwd = options.cwd ?? process.cwd();
132
+ const dir = options.dir ?? defaultBackupDir(cwd);
133
+ if (options.subcommand === 'list') {
134
+ await mkdir(dir, { recursive: true });
135
+ const files = (await readdir(dir)).filter((name) => name.endsWith('.zip')).sort();
136
+ if (files.length === 0) {
137
+ out.line('No backups yet.');
138
+ return 0;
139
+ }
140
+ for (const file of files) {
141
+ try {
142
+ const manifest = await readBackupManifest(join(dir, file));
143
+ const rows = manifest.tables.reduce((sum, table) => sum + table.rows, 0);
144
+ out.line(`${file} ${manifest.createdAt} ${rows} rows${manifest.encrypted ? ' encrypted' : ''}`);
145
+ }
146
+ catch {
147
+ out.line(`${file} (could not read manifest)`);
148
+ }
149
+ }
150
+ return 0;
151
+ }
152
+ if (options.subcommand !== 'create') {
153
+ stderr(`Unknown subcommand "${options.subcommand ?? ''}".\n\n${BACKUP_USAGE}`);
154
+ return 2;
155
+ }
156
+ try {
157
+ const { path, manifest } = await createSiteBackup({
158
+ cwd,
159
+ dir,
160
+ logger,
161
+ ...(options.env === undefined ? {} : { env: options.env }),
162
+ ...(options.passphrase === undefined ? {} : { passphrase: options.passphrase }),
163
+ });
164
+ const rows = manifest.tables.reduce((sum, table) => sum + table.rows, 0);
165
+ out.heading('Backup created');
166
+ out.line(`${path}`);
167
+ out.line(`${manifest.tables.length} tables, ${rows} rows, checksum ${manifest.checksum}`);
168
+ if (manifest.encrypted)
169
+ out.line('Encrypted with the passphrase you supplied.');
170
+ return 0;
171
+ }
172
+ catch (error) {
173
+ return reportError(error, stderr);
174
+ }
175
+ }
176
+ export async function runRestore(options) {
177
+ const { out, stderr } = options;
178
+ const logger = options.logger ?? createLogger({ level: 'silent' });
179
+ if (options.subcommand === undefined) {
180
+ stderr(`cogenta restore needs a subcommand.\n\n${RESTORE_USAGE}`);
181
+ return 2;
182
+ }
183
+ if (options.subcommand !== 'preview' && options.subcommand !== 'apply') {
184
+ stderr(`Unknown subcommand "${options.subcommand}".\n\n${RESTORE_USAGE}`);
185
+ return 2;
186
+ }
187
+ if (options.file === undefined || options.file.trim().length === 0) {
188
+ stderr(`A backup file path is required.\n\n${RESTORE_USAGE}`);
189
+ return 2;
190
+ }
191
+ try {
192
+ const cwd = options.cwd ?? process.cwd();
193
+ const { collections, taxonomies } = await loadSchemaModule(cwd);
194
+ const { db, dispose } = await openSite(options, logger);
195
+ try {
196
+ // Preview and apply both need every table to exist: preview so a
197
+ // fresh site reports "0 rows existing" rather than throwing, apply so
198
+ // the insert has somewhere to land.
199
+ await ensureAllTables(db, collections, taxonomies);
200
+ if (options.subcommand === 'preview') {
201
+ const { manifest, tables } = await previewRestore(options.file, db, options.passphrase === undefined ? {} : { passphrase: options.passphrase });
202
+ out.heading('Restore preview');
203
+ out.line(`Backup from ${manifest.createdAt} (${manifest.dialect})`);
204
+ for (const table of tables) {
205
+ const note = table.rowsExisting > 0 ? ` — ${table.rowsExisting} rows already there` : '';
206
+ out.line(`${table.name}: ${table.rowsInBackup} rows in backup${note}`);
207
+ }
208
+ return 0;
209
+ }
210
+ const report = await applyRestore(options.file, {
211
+ db,
212
+ ...(options.passphrase === undefined ? {} : { passphrase: options.passphrase }),
213
+ });
214
+ out.heading('Restore applied');
215
+ for (const table of report.tables)
216
+ out.line(`${table.name}: ${table.rows} rows restored`);
217
+ return 0;
218
+ }
219
+ finally {
220
+ await dispose();
221
+ }
222
+ }
223
+ catch (error) {
224
+ return reportError(error, stderr);
225
+ }
226
+ }
227
+ function reportError(error, stderr) {
228
+ if (isCogentaError(error)) {
229
+ stderr(`${error.code}: ${error.message}\n`);
230
+ if (error.hint !== undefined)
231
+ stderr(`${error.hint}\n`);
232
+ }
233
+ else {
234
+ stderr(`${error instanceof Error ? error.stack : String(error)}\n`);
235
+ }
236
+ return 1;
237
+ }
238
+ //# sourceMappingURL=backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAC3C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC7D,OAAO,EACL,wBAAwB,EACxB,sBAAsB,EACtB,YAAY,EAEZ,cAAc,EAEd,UAAU,EACV,WAAW,GACZ,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,kBAAkB,GACnB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAEL,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,WAAW,EACX,aAAa,EACb,eAAe,GAEhB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AA4B7C,MAAM,YAAY,GAAG;;;;;;;;;CASpB,CAAA;AAED,MAAM,aAAa,GAAG;;;;;;;;;;;;;CAarB,CAAA;AAED,4GAA4G;AAC5G,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,OAAO,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,SAAS,CAAC,CAAA;AACzC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,OAAqF,EACrF,MAAc;IAMd,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;IACxC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAA;IACtC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAA;IAC7C,MAAM,WAAW,GAAG,MAAM,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC3F,OAAO;QACL,EAAE,EAAE,WAAW,CAAC,QAAQ;QACxB,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACpE,OAAO,EAAE,WAAW,CAAC,OAAO;KAC7B,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,SAAS,CAAC,GAAW;IAClC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAA;IAC/D,OAAO,iBAAiB,CAAC;QACvB,WAAW;QACX,UAAU;QACV,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;QACpD,KAAK,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,eAAe,EAAE,aAAa,CAAC;KAC9E,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,eAAe,CAC5B,EAAkB,EAClB,WAA4C,EAC5C,UAAyC;IAEzC,MAAM,kBAAkB,CAAC,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAA;IACrD,MAAM,gBAAgB,CAAC,EAAE,CAAC,CAAA;IAC1B,MAAM,gBAAgB,CAAC,EAAE,CAAC,CAAA;IAC1B,MAAM,mBAAmB,CAAC,EAAE,CAAC,CAAA;IAC7B,MAAM,mBAAmB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IAC/C,0EAA0E;IAC1E,sDAAsD;IACtD,MAAM,wBAAwB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;AAC3D,CAAC;AAwBD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAgC;IAEhC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;IAClE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;IACxC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAA;IAChD,MAAM,MAAM,GAAG,OAAO,CAAC,cAAc,IAAI,SAAS,CAAA;IAElD,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAA;IAC/D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAA;IACnC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAC7D,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAA;QAClD,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACrC,MAAM,QAAQ,GAAG,GAAG,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAA;QACjF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;QAChC,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QACvD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,YAAY,CAAC;YACtC,EAAE;YACF,IAAI;YACJ,MAAM;YACN,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC9B,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;YACrE,CAAC,CAAC;YACJ,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;SAChF,CAAC,CAAA;QACF,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QACrE,CAAC,CAAC,CAAA;QACF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;IAC3B,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,EAAE,CAAA;IACjB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAsB;IACpD,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;IAClE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;IACxC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAA;IAEhD,IAAI,OAAO,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;QAClC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACrC,MAAM,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QACjF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;YAC3B,OAAO,CAAC,CAAA;QACV,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAA;gBAC1D,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;gBACxE,GAAG,CAAC,IAAI,CACN,GAAG,IAAI,KAAK,QAAQ,CAAC,SAAS,KAAK,IAAI,QAAQ,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CACzF,CAAA;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,6BAA6B,CAAC,CAAA;YAChD,CAAC;QACH,CAAC;QACD,OAAO,CAAC,CAAA;IACV,CAAC;IAED,IAAI,OAAO,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACpC,MAAM,CAAC,uBAAuB,OAAO,CAAC,UAAU,IAAI,EAAE,SAAS,YAAY,EAAE,CAAC,CAAA;QAC9E,OAAO,CAAC,CAAA;IACV,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,gBAAgB,CAAC;YAChD,GAAG;YACH,GAAG;YACH,MAAM;YACN,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;YAC1D,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;SAChF,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QACxE,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;QAC7B,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,CAAA;QACnB,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,YAAY,IAAI,mBAAmB,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAA;QACzF,IAAI,QAAQ,CAAC,SAAS;YAAE,GAAG,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAA;QAC/E,OAAO,CAAC,CAAA;IACV,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACnC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAuB;IACtD,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;IAElE,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,CAAC,0CAA0C,aAAa,EAAE,CAAC,CAAA;QACjE,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,IAAI,OAAO,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC;QACvE,MAAM,CAAC,uBAAuB,OAAO,CAAC,UAAU,SAAS,aAAa,EAAE,CAAC,CAAA;QACzE,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnE,MAAM,CAAC,sCAAsC,aAAa,EAAE,CAAC,CAAA;QAC7D,OAAO,CAAC,CAAA;IACV,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;QACxC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAA;QAC/D,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACvD,IAAI,CAAC;YACH,iEAAiE;YACjE,sEAAsE;YACtE,oCAAoC;YACpC,MAAM,eAAe,CAAC,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAA;YAClD,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;gBACrC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,CAC/C,OAAO,CAAC,IAAI,EACZ,EAAE,EACF,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAC3E,CAAA;gBACD,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;gBAC9B,GAAG,CAAC,IAAI,CAAC,eAAe,QAAQ,CAAC,SAAS,KAAK,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAA;gBACnE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,YAAY,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAA;oBACzF,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,YAAY,kBAAkB,IAAI,EAAE,CAAC,CAAA;gBACxE,CAAC;gBACD,OAAO,CAAC,CAAA;YACV,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE;gBAC9C,EAAE;gBACF,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;aAChF,CAAC,CAAA;YACF,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;YAC9B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM;gBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,gBAAgB,CAAC,CAAA;YACzF,OAAO,CAAC,CAAA;QACV,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,EAAE,CAAA;QACjB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACnC,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,MAAc;IACjD,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,IAAI,CAAC,CAAA;QAC3C,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,CAAA;IACzD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACrE,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { type Logger } from '@cogenta/core';
2
+ import type { Output, Writer } from '../output.js';
3
+ /**
4
+ * `cogenta channels` — L22 task 2's answer to "constructor cette contrainte
5
+ * de déploiement, jamais la contourner": Telegram long-polling is safe per
6
+ * process only with exactly one dedicated instance running it (or a webhook,
7
+ * which this project deliberately does not use yet — see the adapters'
8
+ * own doc comments); Slack Socket Mode and Discord Gateway are each a single
9
+ * persistent connection by nature. Starting any of the three from every
10
+ * `cogenta serve` web replica would either duplicate every inbound update or
11
+ * fight over one connection slot. So none of them start inside `cogenta
12
+ * serve` at all — this is a separate, optional, single-instance process that
13
+ * owns exactly that job and nothing else: `cogenta serve` keeps serving HTTP
14
+ * (including outbound notices, unaffected) whether or not this process is
15
+ * running anywhere.
16
+ *
17
+ * Built the same way `cogenta mcp` is (`mcp.ts`): a second, independent
18
+ * entry point onto the *same* database and the *same* `.cogenta/
19
+ * agents-runtime` agent declarations `cogenta serve` uses — never a second
20
+ * copy of either, and never an HTTP round-trip back into a `cogenta serve`
21
+ * that may not even be running on this host. `@cogenta/channels`' chat
22
+ * bridge (`createAgentChatBridge`) is the one piece of real work this file
23
+ * wires in: an inbound message resolves to the linked Cogenta account (L6's
24
+ * already-tested one-time-code linking, `ChannelLinkStore`), and only runs
25
+ * an agent when that account itself holds `admin` — the same role `POST
26
+ * /api/agents/:name/run` itself requires, so a channel can never grant more
27
+ * than the linked account's own standing already would over HTTP (R4).
28
+ *
29
+ * Bot credentials are secrets and never touch `cogenta.config.mjs` (R7):
30
+ * each provider is configured entirely from environment variables, and a
31
+ * provider whose token is absent is simply not started — a site that wires
32
+ * up Telegram alone runs Telegram alone, with zero code path towards Slack
33
+ * or Discord (R1).
34
+ */
35
+ export interface ChannelsOptions {
36
+ readonly cwd?: string;
37
+ readonly env?: Record<string, string | undefined>;
38
+ readonly logger?: Logger;
39
+ readonly out: Output;
40
+ readonly stderr: Writer;
41
+ /** Aborting stops every adapter, closes the database, and resolves `run()` — the graceful-shutdown seam tests use, mirroring `runServe`'s own `signal`. */
42
+ readonly signal?: AbortSignal;
43
+ }
44
+ declare const USAGE = "Usage\n cogenta channels\n\nConnects this site to Telegram/Slack/Discord and routes inbound messages to\nan agent, running with the linked Cogenta account's own permissions. A\nsingle, dedicated process \u2014 do not run more than one per site, and never\nstart it from inside a load-balanced \"cogenta serve\" fleet (see the module\ndoc comment in packages/cli/src/commands/channels.ts).\n\nReads bot credentials from the environment, never from cogenta.config.mjs:\n COGENTA_CHANNELS_TELEGRAM_BOT_TOKEN\n COGENTA_CHANNELS_SLACK_BOT_TOKEN, COGENTA_CHANNELS_SLACK_APP_TOKEN\n COGENTA_CHANNELS_DISCORD_BOT_TOKEN\nA provider with no token set is simply not started.\n";
45
+ export declare function runChannels(options: ChannelsOptions): Promise<number>;
46
+ export { USAGE as CHANNELS_USAGE };
47
+ //# sourceMappingURL=channels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channels.d.ts","sourceRoot":"","sources":["../../src/commands/channels.ts"],"names":[],"mappings":"AAgBA,OAAO,EAOL,KAAK,MAAM,EAEZ,MAAM,eAAe,CAAA;AAetB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAIlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IACjD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,2JAA2J;IAC3J,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAC9B;AAED,QAAA,MAAM,KAAK,kqBAcV,CAAA;AA8JD,wBAAsB,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAmJ3E;AAED,OAAO,EAAE,KAAK,IAAI,cAAc,EAAE,CAAA"}
@@ -0,0 +1,284 @@
1
+ import { dirname, join } from 'node:path';
2
+ import process from 'node:process';
3
+ import { SUPERAGENT_NAME } from '@cogenta/agents';
4
+ import { createContentService, createPermissionLayer } from '@cogenta/api';
5
+ import { createAuditLog, createUserStore } from '@cogenta/auth';
6
+ import { createAgentChatBridge, createChannelLinkStore, createCommandRouter, createDiscordAdapter, createSlackAdapter, createTelegramAdapter, ensureChannelTables, } from '@cogenta/channels';
7
+ import { CogentaError, createDatabaseMediaStore, createDatabaseRegistry, createLogger, isCogentaError, loadConfig, } from '@cogenta/core';
8
+ import { createContentStore, createNotFoundLogStore, createRedirectStore, createRolePermissionOverlay, createRolePermissionStore, createSchemaTables, createSiteSettingsStore, ensureSiteSettingsTables, } from '@cogenta/schema';
9
+ import { buildAgentRuntime } from './agent-runtime.js';
10
+ import { loadSchemaModule } from './serve.js';
11
+ const USAGE = `Usage
12
+ cogenta channels
13
+
14
+ Connects this site to Telegram/Slack/Discord and routes inbound messages to
15
+ an agent, running with the linked Cogenta account's own permissions. A
16
+ single, dedicated process — do not run more than one per site, and never
17
+ start it from inside a load-balanced "cogenta serve" fleet (see the module
18
+ doc comment in packages/cli/src/commands/channels.ts).
19
+
20
+ Reads bot credentials from the environment, never from cogenta.config.mjs:
21
+ COGENTA_CHANNELS_TELEGRAM_BOT_TOKEN
22
+ COGENTA_CHANNELS_SLACK_BOT_TOKEN, COGENTA_CHANNELS_SLACK_APP_TOKEN
23
+ COGENTA_CHANNELS_DISCORD_BOT_TOKEN
24
+ A provider with no token set is simply not started.
25
+ `;
26
+ /** Duplicated from `mcp.ts` rather than shared — the two commands otherwise have nothing in common, and this is a dozen lines. */
27
+ function storeForFactory(db, collections) {
28
+ const cache = new Map();
29
+ return (collection) => {
30
+ const existing = cache.get(collection.name);
31
+ if (existing !== undefined)
32
+ return existing;
33
+ const created = createContentStore({ db, collection, siblings: collections });
34
+ cache.set(collection.name, created);
35
+ return created;
36
+ };
37
+ }
38
+ function notConfigured(name, missing) {
39
+ return new CogentaError({
40
+ code: 'CHANNEL_PROVIDER_NOT_CONFIGURED',
41
+ message: `${name} has no bot credentials in the environment.`,
42
+ hint: `Set ${missing.join(' and ')} to connect ${name}, or leave it unset to skip it.`,
43
+ details: { channel: name },
44
+ });
45
+ }
46
+ function reportFailure(stderr, error) {
47
+ if (isCogentaError(error)) {
48
+ stderr(`${error.code}: ${error.message}\n`);
49
+ if (error.hint !== undefined)
50
+ stderr(`${error.hint}\n`);
51
+ }
52
+ else {
53
+ stderr(`${error instanceof Error ? (error.stack ?? error.message) : String(error)}\n`);
54
+ }
55
+ return 1;
56
+ }
57
+ /**
58
+ * Builds the router+bridge for one channel and, if its credentials are
59
+ * present in `env`, the live adapter itself — `undefined` otherwise, which
60
+ * is how a site with only Telegram configured ends up starting only
61
+ * Telegram (R1). `runner`/`agentExists`/`getUserRoles`/`linkStore` are
62
+ * shared across all three providers; only the credentials and the resulting
63
+ * adapter differ per channel.
64
+ */
65
+ async function buildTelegram(deps) {
66
+ const token = deps.env.COGENTA_CHANNELS_TELEGRAM_BOT_TOKEN;
67
+ if (token === undefined)
68
+ throw notConfigured('telegram', ['COGENTA_CHANNELS_TELEGRAM_BOT_TOKEN']);
69
+ const router = createCommandRouter({
70
+ getUserRoles: deps.getUserRoles,
71
+ chat: createAgentChatBridge({
72
+ runner: { run: deps.run },
73
+ agents: { has: deps.agentExists },
74
+ defaultAgentName: SUPERAGENT_NAME,
75
+ getUserRoles: deps.getUserRoles,
76
+ channelName: 'telegram',
77
+ reply: async (identity, message) => {
78
+ if (identity.linkedUserId === null)
79
+ return;
80
+ await adapter.send({ id: identity.channelUserId }, message);
81
+ },
82
+ }),
83
+ });
84
+ const adapter = createTelegramAdapter({ token, linkStore: deps.linkStore, router });
85
+ return Object.assign(adapter, {
86
+ start: () => adapter.start(),
87
+ stop: () => adapter.stop(),
88
+ });
89
+ }
90
+ async function buildSlack(deps) {
91
+ const botToken = deps.env.COGENTA_CHANNELS_SLACK_BOT_TOKEN;
92
+ const appToken = deps.env.COGENTA_CHANNELS_SLACK_APP_TOKEN;
93
+ if (botToken === undefined || appToken === undefined) {
94
+ throw notConfigured('slack', [
95
+ 'COGENTA_CHANNELS_SLACK_BOT_TOKEN',
96
+ 'COGENTA_CHANNELS_SLACK_APP_TOKEN',
97
+ ]);
98
+ }
99
+ const router = createCommandRouter({
100
+ getUserRoles: deps.getUserRoles,
101
+ chat: createAgentChatBridge({
102
+ runner: { run: deps.run },
103
+ agents: { has: deps.agentExists },
104
+ defaultAgentName: SUPERAGENT_NAME,
105
+ getUserRoles: deps.getUserRoles,
106
+ channelName: 'slack',
107
+ reply: async (identity, message) => {
108
+ if (identity.linkedUserId === null)
109
+ return;
110
+ await adapter.send({ id: identity.channelUserId }, message);
111
+ },
112
+ }),
113
+ });
114
+ const adapter = createSlackAdapter({ botToken, appToken, linkStore: deps.linkStore, router });
115
+ return Object.assign(adapter, {
116
+ start: () => adapter.start(),
117
+ stop: () => adapter.stop(),
118
+ });
119
+ }
120
+ async function buildDiscord(deps) {
121
+ const botToken = deps.env.COGENTA_CHANNELS_DISCORD_BOT_TOKEN;
122
+ if (botToken === undefined)
123
+ throw notConfigured('discord', ['COGENTA_CHANNELS_DISCORD_BOT_TOKEN']);
124
+ const router = createCommandRouter({
125
+ getUserRoles: deps.getUserRoles,
126
+ chat: createAgentChatBridge({
127
+ runner: { run: deps.run },
128
+ agents: { has: deps.agentExists },
129
+ defaultAgentName: SUPERAGENT_NAME,
130
+ getUserRoles: deps.getUserRoles,
131
+ channelName: 'discord',
132
+ reply: async (identity, message) => {
133
+ if (identity.linkedUserId === null)
134
+ return;
135
+ await adapter.send({ id: identity.channelUserId }, message);
136
+ },
137
+ }),
138
+ });
139
+ const adapter = createDiscordAdapter({ botToken, linkStore: deps.linkStore, router });
140
+ return Object.assign(adapter, {
141
+ start: () => adapter.start(),
142
+ stop: () => adapter.stop(),
143
+ });
144
+ }
145
+ export async function runChannels(options) {
146
+ const { out, stderr } = options;
147
+ const env = options.env ?? process.env;
148
+ const logger = options.logger ?? createLogger({ level: 'silent' });
149
+ let loaded;
150
+ try {
151
+ loaded = await loadConfig({
152
+ ...(options.cwd === undefined ? {} : { cwd: options.cwd }),
153
+ env,
154
+ });
155
+ }
156
+ catch (error) {
157
+ return reportFailure(stderr, error);
158
+ }
159
+ const projectRoot = loaded.path === null ? (options.cwd ?? process.cwd()) : dirname(loaded.path);
160
+ if (loaded.config.auth.signingKey === undefined) {
161
+ stderr('COGENTA_AUTH_SIGNING_KEY is not set.\n');
162
+ stderr('cogenta channels needs the same signing key cogenta serve uses, to read the same\n');
163
+ stderr('agent and provider configuration. Export COGENTA_AUTH_SIGNING_KEY and try again.\n');
164
+ return 1;
165
+ }
166
+ let collections;
167
+ let taxonomies;
168
+ try {
169
+ const loadedSchema = await loadSchemaModule(projectRoot);
170
+ collections = loadedSchema.collections;
171
+ taxonomies = loadedSchema.taxonomies;
172
+ }
173
+ catch (error) {
174
+ return reportFailure(stderr, error);
175
+ }
176
+ const selection = await createDatabaseRegistry({ logger }).select(loaded.config.database);
177
+ const db = selection.instance;
178
+ const live = [];
179
+ try {
180
+ await createSchemaTables(db, collections, []);
181
+ await ensureChannelTables(db);
182
+ // Fiche 63, ADR-0028: same reasoning as `cogenta mcp` — `cogenta
183
+ // channels` builds its own `PermissionLayer` and must consult the same
184
+ // override table, or an inbound chat command could keep an already
185
+ // revoked grant until this long-lived process restarts.
186
+ const rolePermissionOverlay = await createRolePermissionOverlay(createRolePermissionStore({ db, collections, taxonomies }));
187
+ const permissions = createPermissionLayer({
188
+ collections,
189
+ rolePermissionOverrides: rolePermissionOverlay,
190
+ });
191
+ const storeFor = storeForFactory(db, collections);
192
+ const contentService = createContentService({ collections, permissions, storeFor });
193
+ const mediaStore = createDatabaseMediaStore({ db });
194
+ const auditLog = createAuditLog(db);
195
+ const users = createUserStore(db);
196
+ const linkStore = createChannelLinkStore(db);
197
+ const notFoundLog = createNotFoundLogStore({ db });
198
+ await notFoundLog.ensureTable();
199
+ const redirects = createRedirectStore({ db });
200
+ await redirects.ensureTable();
201
+ // Same `assistant.default*` tuning settings `cogenta serve` reads for
202
+ // this runtime's own live-refreshing provider registry — a second,
203
+ // independent process onto the same table (`createSiteSettingsStore` is
204
+ // stateless), never a second copy of the setting itself.
205
+ await ensureSiteSettingsTables(db);
206
+ const siteSettingsStore = createSiteSettingsStore({ db });
207
+ const agentsRuntime = await buildAgentRuntime({
208
+ dataDir: join(projectRoot, '.cogenta', 'agents-runtime'),
209
+ projectRoot,
210
+ signingKey: loaded.config.auth.signingKey,
211
+ siteSettings: siteSettingsStore,
212
+ site: {
213
+ name: loaded.config.site.name,
214
+ ...(loaded.config.site.url === undefined ? {} : { url: loaded.config.site.url }),
215
+ locales: loaded.config.site.locales,
216
+ defaultLocale: loaded.config.site.defaultLocale,
217
+ },
218
+ contentService,
219
+ mediaStore,
220
+ auditLog,
221
+ logger,
222
+ collections,
223
+ notFoundLog,
224
+ redirects,
225
+ });
226
+ const getUserRoles = async (userId) => {
227
+ const user = await users.byId(userId);
228
+ return user === null ? [] : user.roles;
229
+ };
230
+ const run = (name, instruction, trigger) => agentsRuntime.agentRunner.run(name, instruction, trigger);
231
+ const agentExists = (name) => agentsRuntime.agentRegistry.get(name) !== undefined;
232
+ const builders = [
233
+ ['telegram', () => buildTelegram({ env, linkStore, getUserRoles, run, agentExists })],
234
+ ['slack', () => buildSlack({ env, linkStore, getUserRoles, run, agentExists })],
235
+ ['discord', () => buildDiscord({ env, linkStore, getUserRoles, run, agentExists })],
236
+ ];
237
+ for (const [name, build] of builders) {
238
+ try {
239
+ const adapter = await build();
240
+ await adapter.start();
241
+ live.push(adapter);
242
+ out.detail(`${name}: connected.`);
243
+ }
244
+ catch (error) {
245
+ if (isCogentaError(error) && error.code === 'CHANNEL_PROVIDER_NOT_CONFIGURED') {
246
+ out.detail(`${name}: not configured, skipped.`);
247
+ continue;
248
+ }
249
+ throw error;
250
+ }
251
+ }
252
+ if (live.length === 0) {
253
+ out.detail('No channel is configured — set COGENTA_CHANNELS_TELEGRAM_BOT_TOKEN, ' +
254
+ 'COGENTA_CHANNELS_SLACK_BOT_TOKEN+COGENTA_CHANNELS_SLACK_APP_TOKEN, or ' +
255
+ 'COGENTA_CHANNELS_DISCORD_BOT_TOKEN to connect one.');
256
+ }
257
+ else {
258
+ out.detail(`cogenta channels running — ${live.length} channel(s) connected.`);
259
+ }
260
+ // Runs until told to stop — this process has no other exit condition
261
+ // while at least the intent to run exists (mirrors `runServe`'s own
262
+ // `signal`-driven shutdown).
263
+ await new Promise((resolvePromise) => {
264
+ if (options.signal === undefined)
265
+ return;
266
+ if (options.signal.aborted) {
267
+ resolvePromise();
268
+ return;
269
+ }
270
+ options.signal.addEventListener('abort', () => resolvePromise(), { once: true });
271
+ });
272
+ return 0;
273
+ }
274
+ catch (error) {
275
+ return reportFailure(stderr, error);
276
+ }
277
+ finally {
278
+ for (const adapter of live)
279
+ await adapter.stop();
280
+ await selection.dispose();
281
+ }
282
+ }
283
+ export { USAGE as CHANNELS_USAGE };
284
+ //# sourceMappingURL=channels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channels.js","sourceRoot":"","sources":["../../src/commands/channels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAC1E,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/D,OAAO,EAGL,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,YAAY,EACZ,wBAAwB,EACxB,sBAAsB,EACtB,YAAY,EAEZ,cAAc,EAEd,UAAU,GACX,MAAM,eAAe,CAAA;AACtB,OAAO,EAGL,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,2BAA2B,EAC3B,yBAAyB,EACzB,kBAAkB,EAClB,uBAAuB,EACvB,wBAAwB,GAGzB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AA6C7C,MAAM,KAAK,GAAG;;;;;;;;;;;;;;CAcb,CAAA;AAED,kIAAkI;AAClI,SAAS,eAAe,CACtB,EAAkB,EAClB,WAA4C;IAE5C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAwB,CAAA;IAC7C,OAAO,CAAC,UAAU,EAAE,EAAE;QACpB,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QAC3C,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAA;QAC3C,MAAM,OAAO,GAAG,kBAAkB,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAA;QAC7E,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACnC,OAAO,OAAO,CAAA;IAChB,CAAC,CAAA;AACH,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,OAA0B;IAC7D,OAAO,IAAI,YAAY,CAAC;QACtB,IAAI,EAAE,iCAAiC;QACvC,OAAO,EAAE,GAAG,IAAI,6CAA6C;QAC7D,IAAI,EAAE,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,iCAAiC;QACtF,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;KAC3B,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,MAAc,EAAE,KAAc;IACnD,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,IAAI,CAAC,CAAA;QAC3C,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,CAAA;IACzD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACxF,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAQD;;;;;;;GAOG;AACH,KAAK,UAAU,aAAa,CAAC,IAU5B;IACC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,mCAAmC,CAAA;IAC1D,IAAI,KAAK,KAAK,SAAS;QAAE,MAAM,aAAa,CAAC,UAAU,EAAE,CAAC,qCAAqC,CAAC,CAAC,CAAA;IACjG,MAAM,MAAM,GAAG,mBAAmB,CAAC;QACjC,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,IAAI,EAAE,qBAAqB,CAAC;YAC1B,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;YACzB,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE;YACjC,gBAAgB,EAAE,eAAe;YACjC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,WAAW,EAAE,UAAU;YACvB,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;gBACjC,IAAI,QAAQ,CAAC,YAAY,KAAK,IAAI;oBAAE,OAAM;gBAC1C,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,aAAa,EAAE,EAAE,OAAO,CAAC,CAAA;YAC7D,CAAC;SACF,CAAC;KACH,CAAC,CAAA;IACF,MAAM,OAAO,GAAG,qBAAqB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAA;IACnF,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE;QAC5B,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE;QAC5B,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE;KAC3B,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAUzB;IACC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,gCAAgC,CAAA;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,gCAAgC,CAAA;IAC1D,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACrD,MAAM,aAAa,CAAC,OAAO,EAAE;YAC3B,kCAAkC;YAClC,kCAAkC;SACnC,CAAC,CAAA;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,mBAAmB,CAAC;QACjC,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,IAAI,EAAE,qBAAqB,CAAC;YAC1B,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;YACzB,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE;YACjC,gBAAgB,EAAE,eAAe;YACjC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,WAAW,EAAE,OAAO;YACpB,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;gBACjC,IAAI,QAAQ,CAAC,YAAY,KAAK,IAAI;oBAAE,OAAM;gBAC1C,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,aAAa,EAAE,EAAE,OAAO,CAAC,CAAA;YAC7D,CAAC;SACF,CAAC;KACH,CAAC,CAAA;IACF,MAAM,OAAO,GAAG,kBAAkB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAA;IAC7F,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE;QAC5B,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE;QAC5B,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE;KAC3B,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAU3B;IACC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,kCAAkC,CAAA;IAC5D,IAAI,QAAQ,KAAK,SAAS;QAAE,MAAM,aAAa,CAAC,SAAS,EAAE,CAAC,oCAAoC,CAAC,CAAC,CAAA;IAClG,MAAM,MAAM,GAAG,mBAAmB,CAAC;QACjC,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,IAAI,EAAE,qBAAqB,CAAC;YAC1B,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;YACzB,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE;YACjC,gBAAgB,EAAE,eAAe;YACjC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,WAAW,EAAE,SAAS;YACtB,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;gBACjC,IAAI,QAAQ,CAAC,YAAY,KAAK,IAAI;oBAAE,OAAM;gBAC1C,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,aAAa,EAAE,EAAE,OAAO,CAAC,CAAA;YAC7D,CAAC;SACF,CAAC;KACH,CAAC,CAAA;IACF,MAAM,OAAO,GAAG,oBAAoB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAA;IACrF,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE;QAC5B,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE;QAC5B,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE;KAC3B,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAwB;IACxD,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAA;IACtC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;IAElE,IAAI,MAA8C,CAAA;IAClD,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,UAAU,CAAC;YACxB,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;YAC1D,GAAG;SACJ,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACrC,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAEhG,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QAChD,MAAM,CAAC,wCAAwC,CAAC,CAAA;QAChD,MAAM,CAAC,oFAAoF,CAAC,CAAA;QAC5F,MAAM,CAAC,oFAAoF,CAAC,CAAA;QAC5F,OAAO,CAAC,CAAA;IACV,CAAC;IAED,IAAI,WAA4C,CAAA;IAChD,IAAI,UAAyC,CAAA;IAC7C,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;QACxD,WAAW,GAAG,YAAY,CAAC,WAAW,CAAA;QACtC,UAAU,GAAG,YAAY,CAAC,UAAU,CAAA;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACrC,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACzF,MAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAA;IAE7B,MAAM,IAAI,GAAkB,EAAE,CAAA;IAC9B,IAAI,CAAC;QACH,MAAM,kBAAkB,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,CAAC,CAAA;QAC7C,MAAM,mBAAmB,CAAC,EAAE,CAAC,CAAA;QAE7B,iEAAiE;QACjE,uEAAuE;QACvE,mEAAmE;QACnE,wDAAwD;QACxD,MAAM,qBAAqB,GAAG,MAAM,2BAA2B,CAC7D,yBAAyB,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAC3D,CAAA;QACD,MAAM,WAAW,GAAG,qBAAqB,CAAC;YACxC,WAAW;YACX,uBAAuB,EAAE,qBAAqB;SAC/C,CAAC,CAAA;QACF,MAAM,QAAQ,GAAG,eAAe,CAAC,EAAE,EAAE,WAAW,CAAC,CAAA;QACjD,MAAM,cAAc,GAAG,oBAAoB,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAA;QACnF,MAAM,UAAU,GAAG,wBAAwB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QACnD,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,CAAC,CAAA;QACnC,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,CAAC,CAAA;QACjC,MAAM,SAAS,GAAG,sBAAsB,CAAC,EAAE,CAAC,CAAA;QAC5C,MAAM,WAAW,GAAG,sBAAsB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAClD,MAAM,WAAW,CAAC,WAAW,EAAE,CAAA;QAC/B,MAAM,SAAS,GAAG,mBAAmB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAC7C,MAAM,SAAS,CAAC,WAAW,EAAE,CAAA;QAC7B,sEAAsE;QACtE,mEAAmE;QACnE,wEAAwE;QACxE,yDAAyD;QACzD,MAAM,wBAAwB,CAAC,EAAE,CAAC,CAAA;QAClC,MAAM,iBAAiB,GAAsB,uBAAuB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAE5E,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC;YAC5C,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,gBAAgB,CAAC;YACxD,WAAW;YACX,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU;YACzC,YAAY,EAAE,iBAAiB;YAC/B,IAAI,EAAE;gBACJ,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI;gBAC7B,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBAChF,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO;gBACnC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa;aAChD;YACD,cAAc;YACd,UAAU;YACV,QAAQ;YACR,MAAM;YACN,WAAW;YACX,WAAW;YACX,SAAS;SACV,CAAC,CAAA;QAEF,MAAM,YAAY,GAAG,KAAK,EAAE,MAAc,EAA8B,EAAE;YACxE,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACrC,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAA;QACxC,CAAC,CAAA;QACD,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,WAAmB,EAAE,OAAgB,EAAE,EAAE,CAClE,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,CAAA;QAC3D,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,CAAA;QAEzF,MAAM,QAAQ,GAAqE;YACjF,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;YACrF,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;YAC/E,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;SACpF,CAAA;QAED,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,KAAK,EAAE,CAAA;gBAC7B,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;gBACrB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBAClB,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,CAAA;YACnC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,cAAc,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,iCAAiC,EAAE,CAAC;oBAC9E,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,4BAA4B,CAAC,CAAA;oBAC/C,SAAQ;gBACV,CAAC;gBACD,MAAM,KAAK,CAAA;YACb,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,GAAG,CAAC,MAAM,CACR,sEAAsE;gBACpE,wEAAwE;gBACxE,oDAAoD,CACvD,CAAA;QACH,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,MAAM,CAAC,8BAA8B,IAAI,CAAC,MAAM,wBAAwB,CAAC,CAAA;QAC/E,CAAC;QAED,qEAAqE;QACrE,oEAAoE;QACpE,6BAA6B;QAC7B,MAAM,IAAI,OAAO,CAAO,CAAC,cAAc,EAAE,EAAE;YACzC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;gBAAE,OAAM;YACxC,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC3B,cAAc,EAAE,CAAA;gBAChB,OAAM;YACR,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QAClF,CAAC,CAAC,CAAA;QAEF,OAAO,CAAC,CAAA;IACV,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACrC,CAAC;YAAS,CAAC;QACT,KAAK,MAAM,OAAO,IAAI,IAAI;YAAE,MAAM,OAAO,CAAC,IAAI,EAAE,CAAA;QAChD,MAAM,SAAS,CAAC,OAAO,EAAE,CAAA;IAC3B,CAAC;AACH,CAAC;AAED,OAAO,EAAE,KAAK,IAAI,cAAc,EAAE,CAAA"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * The default Cogenta logo served on the public site (fiche L21 task 8).
3
+ *
4
+ * Embedded as base64 rather than shipped as a loose file: `@cogenta/cli`'s
5
+ * `package.json` `"files"` is `["dist"]` only, and a binary asset would need
6
+ * its own build-time copy step to reach a published tarball (the way
7
+ * `dist/admin-assets` gets one) — a single small PNG is cheap enough to
8
+ * embed directly instead.
9
+ *
10
+ * This is the icon-only mark, exported straight from the corrected source
11
+ * the user supplied (`docs/logo/logo-cogenta-icon.png`) — a properly
12
+ * composed, generously padded 500×500 icon-only asset, not the earlier
13
+ * icon+wordmark lockup this once had to be manually cropped out of. No trim
14
+ * or crop is applied here: the source already fills most of its own canvas
15
+ * (~78% width, ~95% height), so a straight resize to 128×128 is the only
16
+ * processing step, spent entirely on the mark at a size sharp enough for
17
+ * the 32–40px footer/login contexts that display it.
18
+ *
19
+ * Served at `DEFAULT_LOGO_PATH`, exactly like `STYLESHEET_PATH`
20
+ * (`theme-render.ts`): one URL, one long `Cache-Control: immutable`, since
21
+ * the bytes only ever change with a new `@cogenta/cli` release.
22
+ */
23
+ /** Mount point on the public site — under `/_cogenta/`, the same reserved namespace `STYLESHEET_PATH` uses, so no collection route can ever claim it. */
24
+ export declare const DEFAULT_LOGO_PATH = "/_cogenta/logo-cogenta.png";
25
+ export declare const DEFAULT_LOGO_CONTENT_TYPE = "image/png";
26
+ export declare function defaultLogoBytes(): Uint8Array;
27
+ //# sourceMappingURL=default-logo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-logo.d.ts","sourceRoot":"","sources":["../../src/commands/default-logo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAKH,yJAAyJ;AACzJ,eAAO,MAAM,iBAAiB,+BAA+B,CAAA;AAE7D,eAAO,MAAM,yBAAyB,cAAc,CAAA;AAEpD,wBAAgB,gBAAgB,IAAI,UAAU,CAE7C"}