@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,30 @@
|
|
|
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
|
+
const DEFAULT_LOGO_BASE64 = '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';
|
|
24
|
+
/** Mount point on the public site — under `/_cogenta/`, the same reserved namespace `STYLESHEET_PATH` uses, so no collection route can ever claim it. */
|
|
25
|
+
export const DEFAULT_LOGO_PATH = '/_cogenta/logo-cogenta.png';
|
|
26
|
+
export const DEFAULT_LOGO_CONTENT_TYPE = 'image/png';
|
|
27
|
+
export function defaultLogoBytes() {
|
|
28
|
+
return Uint8Array.from(Buffer.from(DEFAULT_LOGO_BASE64, 'base64'));
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=default-logo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-logo.js","sourceRoot":"","sources":["../../src/commands/default-logo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,mBAAmB,GACvB,soZAAsoZ,CAAA;AAExoZ,yJAAyJ;AACzJ,MAAM,CAAC,MAAM,iBAAiB,GAAG,4BAA4B,CAAA;AAE7D,MAAM,CAAC,MAAM,yBAAyB,GAAG,WAAW,CAAA;AAEpD,MAAM,UAAU,gBAAgB;IAC9B,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC,CAAA;AACpE,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type DriverTier, type Logger } from '@cogenta/core';
|
|
1
|
+
import { type DriverSelectionReason, type DriverTier, type Logger, type SkipReasonCode } from '@cogenta/core';
|
|
2
2
|
import type { Output } from '../output.js';
|
|
3
3
|
export interface DoctorCheck {
|
|
4
4
|
readonly need: string;
|
|
@@ -6,11 +6,15 @@ export interface DoctorCheck {
|
|
|
6
6
|
readonly driver: string;
|
|
7
7
|
readonly tier: DriverTier;
|
|
8
8
|
readonly reason: string;
|
|
9
|
+
/** Same information as `reason`, as a stable code a translated UI (the admin's "Santé" screen) can look up instead of showing English prose (L20 audit §1 point 12). */
|
|
10
|
+
readonly reasonCode: DriverSelectionReason;
|
|
9
11
|
readonly message: string | undefined;
|
|
10
12
|
readonly skipped: readonly {
|
|
11
13
|
driver: string;
|
|
12
14
|
tier: DriverTier;
|
|
13
15
|
reason: string;
|
|
16
|
+
reasonCode: SkipReasonCode;
|
|
17
|
+
detail?: string;
|
|
14
18
|
}[];
|
|
15
19
|
}
|
|
16
20
|
export interface DoctorReport {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAGA,OAAO,EASL,KAAK,qBAAqB,EAC1B,KAAK,UAAU,EAEf,KAAK,MAAM,EAEX,KAAK,cAAc,EACpB,MAAM,eAAe,CAAA;AAEtB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAE1C,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,IAAI,GAAG,UAAU,GAAG,MAAM,CAAA;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,wKAAwK;IACxK,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAA;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS;QACzB,MAAM,EAAE,MAAM,CAAA;QACd,IAAI,EAAE,UAAU,CAAA;QAChB,MAAM,EAAE,MAAM,CAAA;QACd,UAAU,EAAE,cAAc,CAAA;QAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,EAAE,CAAA;CACJ;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,QAAQ,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,GAAG,SAAS,CAAA;IACpF,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAA;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,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;CACzB;AASD;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CA8LlF;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAsC1E"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import process from 'node:process';
|
|
2
|
-
import {
|
|
2
|
+
import { createVectorRegistry } from '@cogenta/agents';
|
|
3
|
+
import { PREVIEW_SIGNING_KEY_ENV, PREVIEW_SIGNING_KEY_MINIMUM_LENGTH } from '@cogenta/api';
|
|
4
|
+
import { createCacheRegistry, createDatabaseRegistry, createLogger, createRateLimitRegistry, createStorageRegistry, isCogentaError, loadConfig, } from '@cogenta/core';
|
|
5
|
+
import { createImageRegistry } from '@cogenta/render';
|
|
3
6
|
function describe(error) {
|
|
4
7
|
if (isCogentaError(error)) {
|
|
5
8
|
return error.hint === undefined ? error.message : `${error.message}\n${error.hint}`;
|
|
@@ -52,7 +55,9 @@ export async function runDoctor(options = {}) {
|
|
|
52
55
|
// a person can read, and `--verbose` sends the structured lines to stderr.
|
|
53
56
|
const registryOptions = { logger: options.logger ?? createLogger({ level: 'silent' }) };
|
|
54
57
|
/** Selects a driver and turns the outcome — success or failure — into a check. */
|
|
55
|
-
const check = async (need, select
|
|
58
|
+
const check = async (need, select,
|
|
59
|
+
/** Runs after the selection is disposed — for a check that opened a resource of its own to make the selection (the `vector` check below, which needs a real database connection for the `pgvector` driver). */
|
|
60
|
+
cleanup) => {
|
|
56
61
|
let selection;
|
|
57
62
|
try {
|
|
58
63
|
selection = await select();
|
|
@@ -63,6 +68,7 @@ export async function runDoctor(options = {}) {
|
|
|
63
68
|
driver: selection.driver,
|
|
64
69
|
tier: selection.tier,
|
|
65
70
|
reason: selection.requested ? 'named in the configuration' : selection.reason,
|
|
71
|
+
reasonCode: selection.reasonCode,
|
|
66
72
|
message: health.message,
|
|
67
73
|
skipped: selection.skipped,
|
|
68
74
|
});
|
|
@@ -72,11 +78,50 @@ export async function runDoctor(options = {}) {
|
|
|
72
78
|
}
|
|
73
79
|
finally {
|
|
74
80
|
await selection?.dispose();
|
|
81
|
+
await cleanup?.();
|
|
75
82
|
}
|
|
76
83
|
};
|
|
77
84
|
await check('database', () => createDatabaseRegistry(registryOptions).select(config.database));
|
|
78
85
|
await check('cache', () => createCacheRegistry(registryOptions).select(config.cache));
|
|
79
86
|
await check('storage', () => createStorageRegistry(registryOptions).select(config.storage));
|
|
87
|
+
// Audit fiche 05, T06 (R1/skill `new-driver`'s "doctor reporting"
|
|
88
|
+
// requirement): the image pipeline's driver (sharp vs the WebAssembly
|
|
89
|
+
// fallback) never appeared in `cogenta doctor`, unlike every other need
|
|
90
|
+
// above — an operator on a host where `sharp` cannot install had no way
|
|
91
|
+
// to learn that short of a slow first upload. `select({})` mirrors the
|
|
92
|
+
// real call site (`media-images.ts`'s own `buildImageProcessing`): no
|
|
93
|
+
// config section exists for this need, only tier order.
|
|
94
|
+
await check('images', () => createImageRegistry(registryOptions).select({}));
|
|
95
|
+
// Audit fiche 15, T05: `vector` (L18, semantic search) was never checked
|
|
96
|
+
// either, so a misconfigured `vector.driver: 'pgvector'` was only
|
|
97
|
+
// discovered the first time the assistant actually needed it. Unlike the
|
|
98
|
+
// needs above, `pgvector` requires a real database connection — this
|
|
99
|
+
// check opens its own (never the one `database` above already disposed
|
|
100
|
+
// by the time this runs) and closes it via `cleanup`, after `check()`
|
|
101
|
+
// has read everything it needs from the selection's `health()`.
|
|
102
|
+
// `config.embeddings.dimensions` always has a default (384), so this can
|
|
103
|
+
// run unconditionally — a vector need exists whether or not a real
|
|
104
|
+
// embedding provider is configured (R2: the degraded `memory`/`file`
|
|
105
|
+
// drivers work with zero AI configured too).
|
|
106
|
+
let vectorDb;
|
|
107
|
+
await check('vector', async () => {
|
|
108
|
+
vectorDb = await createDatabaseRegistry(registryOptions).select(config.database);
|
|
109
|
+
return createVectorRegistry({
|
|
110
|
+
db: vectorDb.instance,
|
|
111
|
+
...(registryOptions.logger === undefined ? {} : { logger: registryOptions.logger }),
|
|
112
|
+
}).select({
|
|
113
|
+
driver: config.vector.driver,
|
|
114
|
+
dimensions: config.embeddings.dimensions,
|
|
115
|
+
path: config.vector.path,
|
|
116
|
+
table: config.vector.table,
|
|
117
|
+
});
|
|
118
|
+
}, async () => {
|
|
119
|
+
await vectorDb?.dispose();
|
|
120
|
+
});
|
|
121
|
+
// Per-API-key request quota (fiche 20 task 3) — "file de jobs : base de
|
|
122
|
+
// données (dégradé), car Redis est absent" for this need too: an operator
|
|
123
|
+
// must be able to see which counter is actually enforcing a key's limit.
|
|
124
|
+
await check('rateLimit', () => createRateLimitRegistry(registryOptions).select(config.rateLimit));
|
|
80
125
|
// Rule R2, stated out loud rather than left to be discovered: no provider is a
|
|
81
126
|
// supported configuration, not a broken one.
|
|
82
127
|
notes.push(config.llm === undefined
|
|
@@ -84,12 +129,39 @@ export async function runDoctor(options = {}) {
|
|
|
84
129
|
: `LLM provider: ${config.llm.provider} (${config.llm.model}).${config.llm.apiKey === undefined
|
|
85
130
|
? ' No API key in the environment, so the agents will not run.'
|
|
86
131
|
: ''}`);
|
|
132
|
+
// Audit fiche 15, T05: image generation (L18 task 4) is a *note*, not a
|
|
133
|
+
// `check()` — `createImageProviderRegistry` (`@cogenta/agents`) has no
|
|
134
|
+
// driver-tier/health concept the way `database`/`cache`/`vector` do (no
|
|
135
|
+
// service-free way to draw a picture, R2's whole reason this is an
|
|
136
|
+
// optional section with no default provider at all) — so, like the LLM
|
|
137
|
+
// note above, this only reports what is configured rather than treating
|
|
138
|
+
// its absence as a problem `cogenta doctor` should ever flag.
|
|
139
|
+
if (config.imageGeneration !== undefined) {
|
|
140
|
+
notes.push(`Image-generation provider: ${config.imageGeneration.provider} (${config.imageGeneration.model}).` +
|
|
141
|
+
(config.imageGeneration.apiKey === undefined
|
|
142
|
+
? ' No API key in the environment, so image generation will not run.'
|
|
143
|
+
: ''));
|
|
144
|
+
}
|
|
87
145
|
if (config.database.driver === 'sqlite') {
|
|
88
146
|
notes.push('SQLite: one machine, no vector index. Fine for a single site, not for a fleet.');
|
|
89
147
|
}
|
|
90
148
|
if (config.storage.driver !== 's3' && env['COGENTA_STORAGE_SIGNING_KEY'] === undefined) {
|
|
91
149
|
notes.push('COGENTA_STORAGE_SIGNING_KEY is not set, so signed media URLs stop working after a restart.');
|
|
92
150
|
}
|
|
151
|
+
// Fiche 40 task 4: a proactive check, not a reactive fix — the same
|
|
152
|
+
// `CONFIG_INVALID` an editor's first "Prévisualiser" click threw
|
|
153
|
+
// (`preview-token.ts`) is surfaced here before anyone clicks anything. Only
|
|
154
|
+
// used if a draft is ever previewed (`withPreview`, `packages/api/src/rest/router.ts`),
|
|
155
|
+
// so this stays a warning: a site that never uses preview links is not
|
|
156
|
+
// broken by not having this key, and `doctor` must never fail a site over
|
|
157
|
+
// an optional feature (AGENTS.md's own instruction — a warning, never a
|
|
158
|
+
// blocking failure).
|
|
159
|
+
const previewSigningKey = env[PREVIEW_SIGNING_KEY_ENV];
|
|
160
|
+
if (previewSigningKey === undefined ||
|
|
161
|
+
previewSigningKey.length < PREVIEW_SIGNING_KEY_MINIMUM_LENGTH) {
|
|
162
|
+
notes.push(`${PREVIEW_SIGNING_KEY_ENV} is missing or shorter than ${PREVIEW_SIGNING_KEY_MINIMUM_LENGTH} characters, so previewing an unpublished draft will fail. ` +
|
|
163
|
+
`Set it in the environment — for example \`openssl rand -hex 32\`. Never put it in a configuration file.`);
|
|
164
|
+
}
|
|
93
165
|
const [major, minor] = process.versions.node.split('.').map(Number);
|
|
94
166
|
if (major !== undefined && minor !== undefined && (major < 22 || (major === 22 && minor < 13))) {
|
|
95
167
|
problems.push(`Node ${process.versions.node} has no built-in SQLite. Upgrade to 22.13 or later, or use Postgres or MySQL.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EAEL,mBAAmB,EACnB,sBAAsB,EACtB,YAAY,EACZ,qBAAqB,
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type Logger } from '@cogenta/core';
|
|
2
|
+
import type { Output, Writer } from '../output.js';
|
|
3
|
+
export interface ExportOptions {
|
|
4
|
+
readonly file: string | undefined;
|
|
5
|
+
readonly cwd?: string;
|
|
6
|
+
readonly env?: Record<string, string | undefined>;
|
|
7
|
+
readonly logger?: Logger;
|
|
8
|
+
readonly out: Output;
|
|
9
|
+
readonly stderr: Writer;
|
|
10
|
+
readonly collections?: readonly string[];
|
|
11
|
+
}
|
|
12
|
+
export interface ImportContentOptions {
|
|
13
|
+
readonly file: string | undefined;
|
|
14
|
+
readonly cwd?: string;
|
|
15
|
+
readonly env?: Record<string, string | undefined>;
|
|
16
|
+
readonly logger?: Logger;
|
|
17
|
+
readonly out: Output;
|
|
18
|
+
readonly stderr: Writer;
|
|
19
|
+
}
|
|
20
|
+
export declare function runExport(options: ExportOptions): Promise<number>;
|
|
21
|
+
export declare function runImportContent(options: ImportContentOptions): Promise<number>;
|
|
22
|
+
//# sourceMappingURL=export.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,MAAM,EAEZ,MAAM,eAAe,CAAA;AActB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAGlD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,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,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACzC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,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;CACxB;AA0GD,wBAAsB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAiDvE;AAcD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CA6BrF"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { createReadStream, createWriteStream } from 'node:fs';
|
|
2
|
+
import process from 'node:process';
|
|
3
|
+
import { createInterface } from 'node:readline';
|
|
4
|
+
import { CogentaError, createDatabaseRegistry, createLogger, isCogentaError, loadConfig, } from '@cogenta/core';
|
|
5
|
+
import { exportContent, importContent } from '@cogenta/export';
|
|
6
|
+
import { createContentStore, createMenuStore, createRedirectStore, createSchemaTables, createTaxonomyStore, ensureMenuTables, } from '@cogenta/schema';
|
|
7
|
+
import { loadSchemaModule } from './serve.js';
|
|
8
|
+
const EXPORT_USAGE = `Usage
|
|
9
|
+
cogenta export <file.ndjson> [--collections a,b,c]
|
|
10
|
+
|
|
11
|
+
Exports content — entries, taxonomy terms, menus and redirects — as one
|
|
12
|
+
NDJSON file, \`export@1.0\` (fiche 26, task 1). The CLI runs as the site's own
|
|
13
|
+
operator, so every collection is included unless \`--collections\` narrows it;
|
|
14
|
+
an HTTP caller instead goes through \`/api/export\`, which never sees a
|
|
15
|
+
collection the requesting actor may not read.
|
|
16
|
+
`;
|
|
17
|
+
const IMPORT_CONTENT_USAGE = `Usage
|
|
18
|
+
cogenta import content <file.ndjson>
|
|
19
|
+
|
|
20
|
+
Re-imports an export produced by \`cogenta export\` — the round trip the
|
|
21
|
+
format's own acceptance criterion names. Existing ids are skipped, never
|
|
22
|
+
overwritten.
|
|
23
|
+
`;
|
|
24
|
+
async function assemble(options, logger) {
|
|
25
|
+
const cwd = options.cwd ?? process.cwd();
|
|
26
|
+
const env = options.env ?? process.env;
|
|
27
|
+
const loaded = await loadConfig({ cwd, env });
|
|
28
|
+
const { collections, taxonomies } = await loadSchemaModule(cwd);
|
|
29
|
+
const dbSelection = await createDatabaseRegistry({ logger }).select(loaded.config.database);
|
|
30
|
+
const db = dbSelection.instance;
|
|
31
|
+
// Both directions need every table to exist: an export against a site
|
|
32
|
+
// that has never been served (schema declared, tables never created) and
|
|
33
|
+
// an import into a genuinely empty one both start from nothing.
|
|
34
|
+
await createSchemaTables(db, collections, taxonomies);
|
|
35
|
+
await ensureMenuTables(db);
|
|
36
|
+
await createRedirectStore({ db }).ensureTable();
|
|
37
|
+
const contentStores = new Map();
|
|
38
|
+
const taxonomyStores = new Map();
|
|
39
|
+
for (const collection of collections) {
|
|
40
|
+
contentStores.set(collection.name, createContentStore({ db, collection, siblings: collections }));
|
|
41
|
+
}
|
|
42
|
+
for (const taxonomy of taxonomies) {
|
|
43
|
+
taxonomyStores.set(taxonomy.name, createTaxonomyStore({ db, taxonomy }));
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
db,
|
|
47
|
+
collections,
|
|
48
|
+
taxonomies,
|
|
49
|
+
storeFor: (collection) => {
|
|
50
|
+
const store = contentStores.get(collection.name);
|
|
51
|
+
if (store === undefined) {
|
|
52
|
+
throw new CogentaError({
|
|
53
|
+
code: 'INTERNAL',
|
|
54
|
+
message: `No content store was assembled for collection "${collection.name}".`,
|
|
55
|
+
hint: 'This is a bug in `cogenta export`/`cogenta import content`: every declared collection should have a store.',
|
|
56
|
+
details: { collection: collection.name },
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return store;
|
|
60
|
+
},
|
|
61
|
+
taxonomyStoreFor: (taxonomy) => {
|
|
62
|
+
const store = taxonomyStores.get(taxonomy.name);
|
|
63
|
+
if (store === undefined) {
|
|
64
|
+
throw new CogentaError({
|
|
65
|
+
code: 'INTERNAL',
|
|
66
|
+
message: `No taxonomy store was assembled for "${taxonomy.name}".`,
|
|
67
|
+
hint: 'This is a bug in `cogenta export`/`cogenta import content`: every declared taxonomy should have a store.',
|
|
68
|
+
details: { taxonomy: taxonomy.name },
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return store;
|
|
72
|
+
},
|
|
73
|
+
menus: createMenuStore({ db }),
|
|
74
|
+
redirects: createRedirectStore({ db }),
|
|
75
|
+
site: { name: loaded.config.site.name, url: loaded.config.site.url },
|
|
76
|
+
dispose: dbSelection.dispose,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function reportError(error, stderr) {
|
|
80
|
+
if (isCogentaError(error)) {
|
|
81
|
+
stderr(`${error.code}: ${error.message}\n`);
|
|
82
|
+
if (error.hint !== undefined)
|
|
83
|
+
stderr(`${error.hint}\n`);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
stderr(`${error instanceof Error ? error.stack : String(error)}\n`);
|
|
87
|
+
}
|
|
88
|
+
return 1;
|
|
89
|
+
}
|
|
90
|
+
export async function runExport(options) {
|
|
91
|
+
const { out, stderr } = options;
|
|
92
|
+
if (options.file === undefined || options.file.trim().length === 0) {
|
|
93
|
+
stderr(`A destination file is required.\n\n${EXPORT_USAGE}`);
|
|
94
|
+
return 2;
|
|
95
|
+
}
|
|
96
|
+
const logger = options.logger ?? createLogger({ level: 'silent' });
|
|
97
|
+
try {
|
|
98
|
+
const site = await assemble(options, logger);
|
|
99
|
+
try {
|
|
100
|
+
const stream = createWriteStream(options.file, { mode: 0o600 });
|
|
101
|
+
const generator = exportContent({
|
|
102
|
+
db: site.db,
|
|
103
|
+
site: site.site,
|
|
104
|
+
collections: site.collections,
|
|
105
|
+
taxonomies: site.taxonomies,
|
|
106
|
+
storeFor: site.storeFor,
|
|
107
|
+
taxonomyStoreFor: site.taxonomyStoreFor,
|
|
108
|
+
menus: site.menus,
|
|
109
|
+
redirects: site.redirects,
|
|
110
|
+
...(options.collections === undefined
|
|
111
|
+
? {}
|
|
112
|
+
: { selection: { collections: options.collections } }),
|
|
113
|
+
});
|
|
114
|
+
for (;;) {
|
|
115
|
+
const step = await generator.next();
|
|
116
|
+
if (step.done === true) {
|
|
117
|
+
out.heading('Export complete');
|
|
118
|
+
out.line(`${options.file}`);
|
|
119
|
+
out.line(`${step.value.counts.entries} entries, ${step.value.counts.terms} terms, ${step.value.counts.menus} menus, ${step.value.counts.redirects} redirects, ${step.value.counts.mediaRefs} media references`);
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
await new Promise((resolve, reject) => {
|
|
123
|
+
stream.write(step.value, (error) => (error ? reject(error) : resolve()));
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
await new Promise((resolve, reject) => {
|
|
127
|
+
stream.end((error) => (error ? reject(error) : resolve()));
|
|
128
|
+
});
|
|
129
|
+
return 0;
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
await site.dispose();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
return reportError(error, stderr);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
function formatImportReport(report) {
|
|
140
|
+
const lines = [
|
|
141
|
+
`entries: ${report.entries}, terms: ${report.terms}, menus: ${report.menus}, menu items: ${report.menuItems}, redirects: ${report.redirects}`,
|
|
142
|
+
`skipped (already existed): ${report.skipped}`,
|
|
143
|
+
];
|
|
144
|
+
if (report.errors.length > 0) {
|
|
145
|
+
lines.push('errors:');
|
|
146
|
+
for (const error of report.errors)
|
|
147
|
+
lines.push(` ${error.kind} ${error.id}: ${error.message}`);
|
|
148
|
+
}
|
|
149
|
+
return lines.join('\n');
|
|
150
|
+
}
|
|
151
|
+
export async function runImportContent(options) {
|
|
152
|
+
const { out, stderr } = options;
|
|
153
|
+
if (options.file === undefined || options.file.trim().length === 0) {
|
|
154
|
+
stderr(`A source file is required.\n\n${IMPORT_CONTENT_USAGE}`);
|
|
155
|
+
return 2;
|
|
156
|
+
}
|
|
157
|
+
const logger = options.logger ?? createLogger({ level: 'silent' });
|
|
158
|
+
try {
|
|
159
|
+
const site = await assemble(options, logger);
|
|
160
|
+
try {
|
|
161
|
+
const lines = createInterface({ input: createReadStream(options.file, 'utf8') });
|
|
162
|
+
const report = await importContent(lines, {
|
|
163
|
+
collections: site.collections,
|
|
164
|
+
taxonomies: site.taxonomies,
|
|
165
|
+
storeFor: site.storeFor,
|
|
166
|
+
taxonomyStoreFor: site.taxonomyStoreFor,
|
|
167
|
+
menus: site.menus,
|
|
168
|
+
redirects: site.redirects,
|
|
169
|
+
});
|
|
170
|
+
out.heading('Import complete');
|
|
171
|
+
out.line(formatImportReport(report));
|
|
172
|
+
return report.errors.length === 0 ? 0 : 1;
|
|
173
|
+
}
|
|
174
|
+
finally {
|
|
175
|
+
await site.dispose();
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
return reportError(error, stderr);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { AccessContext } from '@cogenta/api';
|
|
2
|
+
import type { FormDefinition } from '@cogenta/forms';
|
|
3
|
+
import type { MediaAsset } from '@cogenta/render';
|
|
4
|
+
import type { SeoRenderDefaults } from './seo.js';
|
|
5
|
+
import { type BrandingSettings, type PageChromeMenus, type SiteIdentityMedia } from './theme-render.js';
|
|
6
|
+
/**
|
|
7
|
+
* `GET /forms/{name}` — the "route dédiée" ADR-0026 chose over a contract B
|
|
8
|
+
* block for a form's first arrival on a page (a bloc `form` RFC is left open
|
|
9
|
+
* in parallel, per the ADR). Modelled directly on `search-page.ts`: real,
|
|
10
|
+
* server-rendered HTML, no client framework, styled by the same joined
|
|
11
|
+
* skin+theme stylesheet every other public page uses.
|
|
12
|
+
*
|
|
13
|
+
* The one thing this file must get right that `search-page.ts` never had to:
|
|
14
|
+
* re-displaying a **failed** submission's own values and per-field errors
|
|
15
|
+
* accessibly (`aria-invalid`, `aria-describedby`) — fiche 16's own
|
|
16
|
+
* acceptance criterion, "une saisie refusée n'efface pas ce que le visiteur
|
|
17
|
+
* a tapé". `createRequestListener` (`serve.ts`) calls `renderFormPage` again
|
|
18
|
+
* with the just-submitted values whenever `POST /api/forms/{name}/submit`
|
|
19
|
+
* answers anything but success.
|
|
20
|
+
*
|
|
21
|
+
* Fiche 47 adds multi-step (task 2) without a single line of client
|
|
22
|
+
* JavaScript: each step is its own `<form method="post">` POSTing to the
|
|
23
|
+
* exact same submit endpoint, carrying everything answered so far forward
|
|
24
|
+
* as one hidden `_accumulated` JSON field plus the original page-load
|
|
25
|
+
* timestamp (`_ts`, never refreshed step to step — `checkFillDelay` in
|
|
26
|
+
* `@cogenta/forms` needs it to stay meaningful across the whole flow).
|
|
27
|
+
* `serve.ts` is what decides, from the router's own response, whether to
|
|
28
|
+
* render the next step or the confirmation/error view — this file only ever
|
|
29
|
+
* renders one page at a time and never itself decides what "next" means.
|
|
30
|
+
*/
|
|
31
|
+
export interface FormPageSite {
|
|
32
|
+
readonly name: string;
|
|
33
|
+
readonly url: string;
|
|
34
|
+
readonly defaultLocale: string;
|
|
35
|
+
}
|
|
36
|
+
export interface FormPageOptions {
|
|
37
|
+
readonly site: FormPageSite;
|
|
38
|
+
/** `null` when neither the skin nor the theme stylesheet could be loaded. */
|
|
39
|
+
readonly styles: string | null;
|
|
40
|
+
readonly now: () => number;
|
|
41
|
+
/** Same menu wiring the rest of the public site uses (`theme-render.ts`). Absent renders an empty header/footer nav, exactly as before this page had any chrome at all. */
|
|
42
|
+
readonly menus?: PageChromeMenus;
|
|
43
|
+
/** Same live branding read the rest of the public site uses (`theme-render.ts`). Absent means full Cogenta credit. */
|
|
44
|
+
readonly branding?: () => Promise<BrandingSettings>;
|
|
45
|
+
/** Same live active-theme read the rest of the public site uses (`theme-render.ts`). Absent renders with the default theme. */
|
|
46
|
+
readonly activeTheme?: () => Promise<string | null>;
|
|
47
|
+
/** Same live SEO settings read the rest of the public site uses (`theme-render.ts`) — only the search-verification meta tags apply here (fiche 50 task 2). */
|
|
48
|
+
readonly seo?: () => Promise<SeoRenderDefaults>;
|
|
49
|
+
/** Same live site-identity read every other public page uses (audit T01) — the logo and favicon belong on this page too. */
|
|
50
|
+
readonly identity?: () => Promise<SiteIdentityMedia>;
|
|
51
|
+
/** Same batch media loader (`theme-render.ts`). Needed only to resolve the identity above; absent means the site name in text. */
|
|
52
|
+
readonly loadMedia?: (ids: readonly string[]) => Promise<ReadonlyMap<string, MediaAsset>>;
|
|
53
|
+
}
|
|
54
|
+
export interface FormPageState {
|
|
55
|
+
/** `?submitted=1` — the default confirmation view, when the form has no `redirectTo`. */
|
|
56
|
+
readonly submitted?: boolean;
|
|
57
|
+
readonly errorMessage?: string | null;
|
|
58
|
+
readonly errorField?: string | null;
|
|
59
|
+
/** The visitor's own values, from the request that just failed (or that a step just answered) — never lost. */
|
|
60
|
+
readonly values?: Readonly<Record<string, unknown>>;
|
|
61
|
+
/** Task 2 — the step to render, 0-based. Absent means step 0 (or the only page, for a single-page form). */
|
|
62
|
+
readonly step?: number;
|
|
63
|
+
/** Task 2 — everything answered on earlier steps, carried forward verbatim as the next request's `_accumulated`. */
|
|
64
|
+
readonly accumulated?: Readonly<Record<string, unknown>>;
|
|
65
|
+
/** Task 2 — the original page-load timestamp; re-emitted unchanged rather than refreshed to `options.now()` once a flow is under way. */
|
|
66
|
+
readonly ts?: string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* The whole page: the form itself (one step of it, for a multi-step form),
|
|
70
|
+
* or its confirmation view under `?submitted=1` when the form has no
|
|
71
|
+
* `redirectTo` of its own.
|
|
72
|
+
*/
|
|
73
|
+
export declare function renderFormPage(definition: FormDefinition, state: FormPageState, options: FormPageOptions, context: AccessContext): Promise<string>;
|
|
74
|
+
export declare function renderFormNotFoundPage(options: FormPageOptions, context: AccessContext): Promise<string>;
|
|
75
|
+
//# sourceMappingURL=forms-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forms-page.d.ts","sourceRoot":"","sources":["../../src/commands/forms-page.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,KAAK,EAAE,cAAc,EAAuB,MAAM,gBAAgB,CAAA;AAEzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AACjD,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EAEpB,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAA;AAE1B;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;IAC3B,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAA;IAC1B,2KAA2K;IAC3K,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAA;IAChC,sHAAsH;IACtH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAA;IACnD,+HAA+H;IAC/H,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IACnD,8JAA8J;IAC9J,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAC/C,4HAA4H;IAC5H,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAA;IACpD,kIAAkI;IAClI,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;CAC1F;AAED,MAAM,WAAW,aAAa;IAC5B,yFAAyF;IACzF,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,+GAA+G;IAC/G,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACnD,4GAA4G;IAC5G,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,oHAAoH;IACpH,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACxD,yIAAyI;IACzI,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CACrB;AAoLD;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,cAAc,EAC1B,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,CAAC,CA4CjB;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,CAAC,CAOjB"}
|