@cogenta/cli 0.4.0 → 0.6.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.
- package/CHANGELOG.md +3856 -0
- package/dist/admin-assets/assets/index-CxZHGwVA.css +1 -0
- package/dist/admin-assets/assets/index-fYXyHpn8.js +1090 -0
- package/dist/admin-assets/assets/vips-_dmTUXFO.wasm +0 -0
- package/dist/admin-assets/assets/vips-es6-DrQTTS8Q.js +7 -0
- package/dist/admin-assets/branding/logo-cogenta-dark.png +0 -0
- package/dist/admin-assets/branding/logo-cogenta-icon.png +0 -0
- package/dist/admin-assets/branding/logo-cogenta-light.png +0 -0
- package/dist/admin-assets/branding/logo-cogenta-small.png +0 -0
- package/dist/admin-assets/branding/logo-cogenta-transparent.png +0 -0
- package/dist/admin-assets/branding/logo-cogenta.png +0 -0
- package/dist/admin-assets/favicon.png +0 -0
- package/dist/admin-assets/fonts/jetbrains-mono-var.woff2 +0 -0
- package/dist/admin-assets/fonts/space-grotesk-var.woff2 +0 -0
- package/dist/admin-assets/index.html +3 -2
- package/dist/bin.js +6 -0
- package/dist/bin.js.map +1 -1
- package/dist/commands/admin-assets.d.ts +1 -0
- package/dist/commands/admin-assets.d.ts.map +1 -1
- package/dist/commands/admin-assets.js +19 -1
- package/dist/commands/admin-assets.js.map +1 -1
- package/dist/commands/agent-runtime.d.ts +151 -0
- package/dist/commands/agent-runtime.d.ts.map +1 -0
- package/dist/commands/agent-runtime.js +519 -0
- package/dist/commands/agent-runtime.js.map +1 -0
- package/dist/commands/assistant.d.ts +89 -3
- package/dist/commands/assistant.d.ts.map +1 -1
- package/dist/commands/assistant.js +206 -39
- package/dist/commands/assistant.js.map +1 -1
- package/dist/commands/audit-integrity-alert.d.ts +23 -0
- package/dist/commands/audit-integrity-alert.d.ts.map +1 -0
- package/dist/commands/audit-integrity-alert.js +33 -0
- package/dist/commands/audit-integrity-alert.js.map +1 -0
- package/dist/commands/backup.d.ts +78 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +238 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/channels.d.ts +47 -0
- package/dist/commands/channels.d.ts.map +1 -0
- package/dist/commands/channels.js +277 -0
- package/dist/commands/channels.js.map +1 -0
- package/dist/commands/default-logo.d.ts +27 -0
- package/dist/commands/default-logo.d.ts.map +1 -0
- package/dist/commands/default-logo.js +30 -0
- package/dist/commands/default-logo.js.map +1 -0
- package/dist/commands/doctor.d.ts +5 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +74 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/export.d.ts +22 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +182 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/forms-page.d.ts +75 -0
- package/dist/commands/forms-page.d.ts.map +1 -0
- package/dist/commands/forms-page.js +191 -0
- package/dist/commands/forms-page.js.map +1 -0
- package/dist/commands/import.d.ts.map +1 -1
- package/dist/commands/import.js +13 -1
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/mcp.d.ts +35 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +277 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/roles.d.ts +22 -0
- package/dist/commands/roles.d.ts.map +1 -0
- package/dist/commands/roles.js +79 -0
- package/dist/commands/roles.js.map +1 -0
- package/dist/commands/search-page.d.ts +15 -0
- package/dist/commands/search-page.d.ts.map +1 -1
- package/dist/commands/search-page.js +22 -16
- package/dist/commands/search-page.js.map +1 -1
- package/dist/commands/seo.d.ts +92 -4
- package/dist/commands/seo.d.ts.map +1 -1
- package/dist/commands/seo.js +168 -4
- package/dist/commands/seo.js.map +1 -1
- package/dist/commands/serve.d.ts +439 -7
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +3498 -181
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/site-plan.d.ts +27 -1
- package/dist/commands/site-plan.d.ts.map +1 -1
- package/dist/commands/site-plan.js +71 -4
- package/dist/commands/site-plan.js.map +1 -1
- package/dist/commands/term-archive-page.d.ts +94 -0
- package/dist/commands/term-archive-page.d.ts.map +1 -0
- package/dist/commands/term-archive-page.js +195 -0
- package/dist/commands/term-archive-page.js.map +1 -0
- package/dist/commands/theme-css.d.ts +22 -7
- package/dist/commands/theme-css.d.ts.map +1 -1
- package/dist/commands/theme-css.js +33 -8
- package/dist/commands/theme-css.js.map +1 -1
- package/dist/commands/theme-registry.d.ts +94 -0
- package/dist/commands/theme-registry.d.ts.map +1 -0
- package/dist/commands/theme-registry.js +130 -0
- package/dist/commands/theme-registry.js.map +1 -0
- package/dist/commands/theme-render.d.ts +330 -9
- package/dist/commands/theme-render.d.ts.map +1 -1
- package/dist/commands/theme-render.js +932 -66
- package/dist/commands/theme-render.js.map +1 -1
- package/dist/commands/theme-wiring.d.ts +107 -0
- package/dist/commands/theme-wiring.d.ts.map +1 -0
- package/dist/commands/theme-wiring.js +295 -0
- package/dist/commands/theme-wiring.js.map +1 -0
- package/dist/commands/tools.d.ts +71 -0
- package/dist/commands/tools.d.ts.map +1 -0
- package/dist/commands/tools.js +330 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/commands/update.d.ts +25 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +193 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +146 -4
- package/dist/index.js.map +1 -1
- package/dist/invite-mail.d.ts +39 -0
- package/dist/invite-mail.d.ts.map +1 -0
- package/dist/invite-mail.js +39 -0
- package/dist/invite-mail.js.map +1 -0
- package/dist/update/apply.d.ts +54 -0
- package/dist/update/apply.d.ts.map +1 -0
- package/dist/update/apply.js +77 -0
- package/dist/update/apply.js.map +1 -0
- package/dist/update/changelog-risk.d.ts +20 -0
- package/dist/update/changelog-risk.d.ts.map +1 -0
- package/dist/update/changelog-risk.js +55 -0
- package/dist/update/changelog-risk.js.map +1 -0
- package/dist/update/check.d.ts +60 -0
- package/dist/update/check.d.ts.map +1 -0
- package/dist/update/check.js +56 -0
- package/dist/update/check.js.map +1 -0
- package/dist/update/contract-risk.d.ts +55 -0
- package/dist/update/contract-risk.d.ts.map +1 -0
- package/dist/update/contract-risk.js +75 -0
- package/dist/update/contract-risk.js.map +1 -0
- package/dist/update/history.d.ts +30 -0
- package/dist/update/history.d.ts.map +1 -0
- package/dist/update/history.js +38 -0
- package/dist/update/history.js.map +1 -0
- package/dist/update/index.d.ts +28 -0
- package/dist/update/index.d.ts.map +1 -0
- package/dist/update/index.js +11 -0
- package/dist/update/index.js.map +1 -0
- package/dist/update/list-restore-points.d.ts +20 -0
- package/dist/update/list-restore-points.d.ts.map +1 -0
- package/dist/update/list-restore-points.js +35 -0
- package/dist/update/list-restore-points.js.map +1 -0
- package/dist/update/npm-registry.d.ts +11 -0
- package/dist/update/npm-registry.d.ts.map +1 -0
- package/dist/update/npm-registry.js +74 -0
- package/dist/update/npm-registry.js.map +1 -0
- package/dist/update/restore-point.d.ts +26 -0
- package/dist/update/restore-point.d.ts.map +1 -0
- package/dist/update/restore-point.js +23 -0
- package/dist/update/restore-point.js.map +1 -0
- package/dist/update/tar.d.ts +27 -0
- package/dist/update/tar.d.ts.map +1 -0
- package/dist/update/tar.js +56 -0
- package/dist/update/tar.js.map +1 -0
- package/dist/update/version-compare.d.ts +17 -0
- package/dist/update/version-compare.d.ts.map +1 -0
- package/dist/update/version-compare.js +42 -0
- package/dist/update/version-compare.js.map +1 -0
- package/dist/version.d.ts +13 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +18 -0
- package/dist/version.js.map +1 -0
- package/package.json +33 -16
- package/dist/admin-assets/assets/index-C9a7O_Xs.css +0 -1
- package/dist/admin-assets/assets/index-DXvMgWvn.js +0 -74
|
@@ -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;AAYtB,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,CA4I3E;AAED,OAAO,EAAE,KAAK,IAAI,cAAc,EAAE,CAAA"}
|
|
@@ -0,0 +1,277 @@
|
|
|
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, } 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
|
+
const agentsRuntime = await buildAgentRuntime({
|
|
202
|
+
dataDir: join(projectRoot, '.cogenta', 'agents-runtime'),
|
|
203
|
+
projectRoot,
|
|
204
|
+
signingKey: loaded.config.auth.signingKey,
|
|
205
|
+
site: {
|
|
206
|
+
name: loaded.config.site.name,
|
|
207
|
+
...(loaded.config.site.url === undefined ? {} : { url: loaded.config.site.url }),
|
|
208
|
+
locales: loaded.config.site.locales,
|
|
209
|
+
defaultLocale: loaded.config.site.defaultLocale,
|
|
210
|
+
},
|
|
211
|
+
contentService,
|
|
212
|
+
mediaStore,
|
|
213
|
+
auditLog,
|
|
214
|
+
logger,
|
|
215
|
+
collections,
|
|
216
|
+
notFoundLog,
|
|
217
|
+
redirects,
|
|
218
|
+
});
|
|
219
|
+
const getUserRoles = async (userId) => {
|
|
220
|
+
const user = await users.byId(userId);
|
|
221
|
+
return user === null ? [] : user.roles;
|
|
222
|
+
};
|
|
223
|
+
const run = (name, instruction, trigger) => agentsRuntime.agentRunner.run(name, instruction, trigger);
|
|
224
|
+
const agentExists = (name) => agentsRuntime.agentRegistry.get(name) !== undefined;
|
|
225
|
+
const builders = [
|
|
226
|
+
['telegram', () => buildTelegram({ env, linkStore, getUserRoles, run, agentExists })],
|
|
227
|
+
['slack', () => buildSlack({ env, linkStore, getUserRoles, run, agentExists })],
|
|
228
|
+
['discord', () => buildDiscord({ env, linkStore, getUserRoles, run, agentExists })],
|
|
229
|
+
];
|
|
230
|
+
for (const [name, build] of builders) {
|
|
231
|
+
try {
|
|
232
|
+
const adapter = await build();
|
|
233
|
+
await adapter.start();
|
|
234
|
+
live.push(adapter);
|
|
235
|
+
out.detail(`${name}: connected.`);
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
if (isCogentaError(error) && error.code === 'CHANNEL_PROVIDER_NOT_CONFIGURED') {
|
|
239
|
+
out.detail(`${name}: not configured, skipped.`);
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
throw error;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
if (live.length === 0) {
|
|
246
|
+
out.detail('No channel is configured — set COGENTA_CHANNELS_TELEGRAM_BOT_TOKEN, ' +
|
|
247
|
+
'COGENTA_CHANNELS_SLACK_BOT_TOKEN+COGENTA_CHANNELS_SLACK_APP_TOKEN, or ' +
|
|
248
|
+
'COGENTA_CHANNELS_DISCORD_BOT_TOKEN to connect one.');
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
out.detail(`cogenta channels running — ${live.length} channel(s) connected.`);
|
|
252
|
+
}
|
|
253
|
+
// Runs until told to stop — this process has no other exit condition
|
|
254
|
+
// while at least the intent to run exists (mirrors `runServe`'s own
|
|
255
|
+
// `signal`-driven shutdown).
|
|
256
|
+
await new Promise((resolvePromise) => {
|
|
257
|
+
if (options.signal === undefined)
|
|
258
|
+
return;
|
|
259
|
+
if (options.signal.aborted) {
|
|
260
|
+
resolvePromise();
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
options.signal.addEventListener('abort', () => resolvePromise(), { once: true });
|
|
264
|
+
});
|
|
265
|
+
return 0;
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
return reportFailure(stderr, error);
|
|
269
|
+
}
|
|
270
|
+
finally {
|
|
271
|
+
for (const adapter of live)
|
|
272
|
+
await adapter.stop();
|
|
273
|
+
await selection.dispose();
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
export { USAGE as CHANNELS_USAGE };
|
|
277
|
+
//# sourceMappingURL=channels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channels.js","sourceRoot":"","sources":["../../src/commands/channels.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|