@cogenta/cli 0.3.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/ibm-plex-mono-400.woff2 +0 -0
- package/dist/admin-assets/fonts/ibm-plex-mono-500.woff2 +0 -0
- package/dist/admin-assets/fonts/ibm-plex-mono-600.woff2 +0 -0
- package/dist/admin-assets/fonts/ibm-plex-mono-700.woff2 +0 -0
- package/dist/admin-assets/fonts/ibm-plex-sans-var.woff2 +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 +489 -6
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +3883 -164
- 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 +360 -2
- package/dist/commands/theme-render.d.ts.map +1 -1
- package/dist/commands/theme-render.js +984 -29
- 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/commands/users.d.ts.map +1 -1
- package/dist/commands/users.js +6 -36
- package/dist/commands/users.js.map +1 -1
- 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/reset-mail.d.ts +39 -0
- package/dist/reset-mail.d.ts.map +1 -0
- package/dist/reset-mail.js +45 -0
- package/dist/reset-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 -13
- package/dist/admin-assets/assets/index-Buwdj1V2.js +0 -71
- package/dist/admin-assets/assets/index-Csef0SiA.css +0 -1
|
@@ -0,0 +1,519 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { createAgentRunner, createContentCollectionsTool, createContentDeleteTool, createContentListTool, createContentPublishTool, createContentReadTool, createContentSchemaTool, createContentWriteDraftTool, createDepsScanTool, createDocumentExtractTool, createFileAgentConversationStore, createFileAgentDeclarationStore, createFileAgentSkillStore, createFilePromptTemplateStore, createFileProviderConfigStore, createKillSwitch, createMediaReadTool, createMediaWriteTool, createMemoryApprovalQueue, createNotFoundLogReadTool, createProviderRegistry, createRedirectCreateTool, createSiteConfigReadTool, createToolRegistry, ensureBuiltinAgentSkills, ensureBuiltinAgents, ensureBuiltinPromptTemplates, KNOWN_PROVIDER_CATALOG, resolveProviderRegistryConfig, } from '@cogenta/agents';
|
|
3
|
+
import { createProposeThemeTool } from '@cogenta/agents-builtin';
|
|
4
|
+
import { buildMcpToolDefinitions } from '@cogenta/mcp';
|
|
5
|
+
import { buildPath } from '@cogenta/schema';
|
|
6
|
+
/**
|
|
7
|
+
* L22 tasks 1/1bis — where the runtime `@cogenta/agents` provides finally
|
|
8
|
+
* meets a running site. `@cogenta/agents` knows how to run an agent given a
|
|
9
|
+
* tool registry, a provider registry and stores for declarations/skills/
|
|
10
|
+
* provider config; it does not know how to build a `ContentServiceLike` out
|
|
11
|
+
* of this codebase's real `ContentService`, or where on disk a site keeps
|
|
12
|
+
* its data — that translation is this module's whole job, the same role
|
|
13
|
+
* `assistant.ts` already plays for L18's toolset.
|
|
14
|
+
*
|
|
15
|
+
* Tool availability is not gated by whether a provider is configured (R2):
|
|
16
|
+
* the tool registry, the agent/skill/provider stores, and every CRUD route
|
|
17
|
+
* all work with zero LLM provider set up. Only `AgentRunner.run()` — one
|
|
18
|
+
* synchronous provider lookup before any network call — refuses, per
|
|
19
|
+
* `agents/orchestrator.ts`'s own `AGENT_NO_PROVIDER` guarantee.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Exported for the same reason `PROVIDERS_SUBDIR` below is — `theme-wiring
|
|
23
|
+
* .ts` reads the "Cogenta Theme Creator" agent's own admin-configured
|
|
24
|
+
* `model.preferred`/`model.fallback` from a second `AgentDeclarationStore`
|
|
25
|
+
* instance pointed at this same directory, rather than duplicating a
|
|
26
|
+
* hardcoded guess at that agent's provider preference.
|
|
27
|
+
*/
|
|
28
|
+
export const AGENTS_SUBDIR = 'agents';
|
|
29
|
+
const SKILLS_SUBDIR = 'skills';
|
|
30
|
+
/**
|
|
31
|
+
* Exported so `theme-wiring.ts` can point its own `ProviderConfigStore` at
|
|
32
|
+
* the exact same directory `buildAgentRuntime` uses — two independent,
|
|
33
|
+
* file-backed store instances reading the same encrypted files, the same
|
|
34
|
+
* consistency model every other per-request store in this app already
|
|
35
|
+
* relies on. A second, differently-scoped constant here would have let the
|
|
36
|
+
* two silently drift apart, which is exactly the bug this constant's reuse
|
|
37
|
+
* closes (L26 task 5's theme generator answering "no provider" from a
|
|
38
|
+
* config file no admin who configured one through the UI ever touched).
|
|
39
|
+
*/
|
|
40
|
+
export const PROVIDERS_SUBDIR = 'providers';
|
|
41
|
+
/**
|
|
42
|
+
* Fiche 45 — under the same `dataDir` (`.cogenta/agents-runtime`)
|
|
43
|
+
* `runServe` also points its own, separately-constructed
|
|
44
|
+
* `PromptTemplateStore` at, ahead of this function (`buildAssistant` runs
|
|
45
|
+
* before `assembleSite`/`buildAgentRuntime` does). Two file-store instances
|
|
46
|
+
* pointed at the same directory is safe: neither caches across calls, so an
|
|
47
|
+
* edit either one makes is visible to the other on its very next read — the
|
|
48
|
+
* same property `createFileAgentSkillStore` already relies on for this
|
|
49
|
+
* reason.
|
|
50
|
+
*/
|
|
51
|
+
const PROMPT_TEMPLATES_SUBDIR = 'prompt-templates';
|
|
52
|
+
const CONVERSATIONS_SUBDIR = 'conversations';
|
|
53
|
+
/**
|
|
54
|
+
* `ContentService` (real, `@cogenta/api`) adapted to the narrow
|
|
55
|
+
* `ContentServiceLike` the core content tools declare against — the exact
|
|
56
|
+
* same seam `packages/cli/src/commands/mcp.ts`'s `contentServiceLikeOf`
|
|
57
|
+
* already uses, duplicated rather than shared across two CLI entry points
|
|
58
|
+
* that otherwise have nothing else in common (one is a stdio command, the
|
|
59
|
+
* other lives inside a long-running server).
|
|
60
|
+
*/
|
|
61
|
+
function contentServiceLikeOf(service) {
|
|
62
|
+
return {
|
|
63
|
+
read: (context, collection, id, opts) => service.read(context, collection, id, opts),
|
|
64
|
+
create: (context, collection, input, opts) => service.create(context, collection, input, opts),
|
|
65
|
+
update: (context, collection, id, input, opts) => service.update(context, collection, id, input, opts),
|
|
66
|
+
publish: (context, collection, id, input, opts) => service.publish(context, collection, id, input, opts),
|
|
67
|
+
remove: (context, collection, id) => service.remove(context, collection, id),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/** The first string field a list item is worth labelling by — `title`/`name`/`heading` cover every blueprint collection this project ships; a collection using none of those still lists, just with a null title the model reads as "no obvious title" rather than a guess. */
|
|
71
|
+
function titleOf(values) {
|
|
72
|
+
const candidate = values.title ?? values.name ?? values.heading;
|
|
73
|
+
return typeof candidate === 'string' && candidate.length > 0 ? candidate : null;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* `ContentService` adapted to `content.collections`/`content.list`'s
|
|
77
|
+
* `ContentBrowseServiceLike` (L22 task 3) — a second, separate adapter from
|
|
78
|
+
* `contentServiceLikeOf` above, on purpose: those four CRUD tools and these
|
|
79
|
+
* two read/browse ones need different shapes out of the same service
|
|
80
|
+
* (`summary`/`list`/route-building versus single-entry read/write), and nothing
|
|
81
|
+
* here overlaps with `ContentServiceLike`'s own contract enough to be worth
|
|
82
|
+
* merging.
|
|
83
|
+
*
|
|
84
|
+
* `path` is computed here, not by the tool: this is the one place that has
|
|
85
|
+
* both an entry's field values (`SerialisedEntry.values`) and its
|
|
86
|
+
* collection's route pattern (`CollectionDefinition.routing`) in scope.
|
|
87
|
+
* `buildPath` throws for a required param the values do not fill (`Content
|
|
88
|
+
* Route Invalid`) — caught and turned into `null`, the same "cannot offer
|
|
89
|
+
* this as a redirect target" signal an unrouted collection gets, rather than
|
|
90
|
+
* a tool call failing over a values shape this adapter cannot second-guess.
|
|
91
|
+
*/
|
|
92
|
+
function contentBrowseServiceLikeOf(service, collections) {
|
|
93
|
+
const byName = new Map(collections.map((collection) => [collection.name, collection]));
|
|
94
|
+
function pathOf(collection, entry) {
|
|
95
|
+
if (collection.routing === undefined)
|
|
96
|
+
return null;
|
|
97
|
+
const params = {};
|
|
98
|
+
for (const [key, value] of Object.entries(entry.values)) {
|
|
99
|
+
if (typeof value === 'string')
|
|
100
|
+
params[key] = value;
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
return buildPath(collection, params, entry.locale);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
collections: async (context) => {
|
|
111
|
+
const summaries = await service.summary(context);
|
|
112
|
+
return summaries.map((summary) => ({
|
|
113
|
+
collection: summary.collection,
|
|
114
|
+
total: summary.total,
|
|
115
|
+
published: summary.published,
|
|
116
|
+
routed: byName.get(summary.collection)?.routing !== undefined,
|
|
117
|
+
}));
|
|
118
|
+
},
|
|
119
|
+
list: async (context, collectionName, options) => {
|
|
120
|
+
const collection = byName.get(collectionName);
|
|
121
|
+
if (collection === undefined)
|
|
122
|
+
return undefined;
|
|
123
|
+
const page = await service.list(context, collectionName, {
|
|
124
|
+
filter: undefined,
|
|
125
|
+
sort: { field: 'updatedAt', direction: 'desc' },
|
|
126
|
+
limit: options.limit,
|
|
127
|
+
cursor: undefined,
|
|
128
|
+
locale: undefined,
|
|
129
|
+
requestedState: 'published',
|
|
130
|
+
requestedStatus: undefined,
|
|
131
|
+
trashed: undefined,
|
|
132
|
+
depth: 0,
|
|
133
|
+
});
|
|
134
|
+
return {
|
|
135
|
+
items: page.items.map((item) => ({
|
|
136
|
+
id: item.id,
|
|
137
|
+
title: titleOf(item.values),
|
|
138
|
+
path: pathOf(collection, { values: item.values, locale: item.locale }),
|
|
139
|
+
status: item.status,
|
|
140
|
+
})),
|
|
141
|
+
};
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* `CollectionDefinition` adapted to `content.schema`'s
|
|
147
|
+
* `ContentSchemaServiceLike` — a third adapter over the same `collections`
|
|
148
|
+
* config `contentBrowseServiceLikeOf` above already reads, on purpose:
|
|
149
|
+
* schema is static site config, not stored data, so `describe` performs no
|
|
150
|
+
* database read of its own; it only calls `service.summary(context)` for
|
|
151
|
+
* the exact same permission check `contentBrowseServiceLikeOf`'s
|
|
152
|
+
* `collections()` already makes, so `content.schema` never describes a
|
|
153
|
+
* collection this actor could not otherwise read.
|
|
154
|
+
*/
|
|
155
|
+
function contentSchemaServiceLikeOf(service, collections) {
|
|
156
|
+
const byName = new Map(collections.map((collection) => [collection.name, collection]));
|
|
157
|
+
function fieldsOf(collection) {
|
|
158
|
+
return Object.entries(collection.fields).map(([key, field]) => ({
|
|
159
|
+
key,
|
|
160
|
+
kind: field.kind,
|
|
161
|
+
label: field.admin?.label ?? null,
|
|
162
|
+
required: field.required ?? false,
|
|
163
|
+
options: field.options,
|
|
164
|
+
}));
|
|
165
|
+
}
|
|
166
|
+
function summaryOf(collection) {
|
|
167
|
+
return {
|
|
168
|
+
collection: collection.name,
|
|
169
|
+
labelSingular: collection.labels.singular,
|
|
170
|
+
labelPlural: collection.labels.plural,
|
|
171
|
+
routed: collection.routing !== undefined,
|
|
172
|
+
fields: fieldsOf(collection),
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
describe: async (context, collectionName) => {
|
|
177
|
+
const readable = new Set((await service.summary(context)).map((entry) => entry.collection));
|
|
178
|
+
if (collectionName !== undefined) {
|
|
179
|
+
const collection = byName.get(collectionName);
|
|
180
|
+
if (collection === undefined || !readable.has(collectionName))
|
|
181
|
+
return [];
|
|
182
|
+
return [summaryOf(collection)];
|
|
183
|
+
}
|
|
184
|
+
return collections
|
|
185
|
+
.filter((collection) => readable.has(collection.name))
|
|
186
|
+
.map((collection) => summaryOf(collection));
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Refreshed after every write to `ProviderConfigStore` (the providers
|
|
192
|
+
* router calls `refresh()` after each mutation) — an admin who saves a new
|
|
193
|
+
* key takes effect on the next agent run, no restart, without this
|
|
194
|
+
* runtime's one long-lived `AgentRunner` (and the per-agent budget
|
|
195
|
+
* trackers it holds) being torn down and rebuilt on every request.
|
|
196
|
+
*
|
|
197
|
+
* Fiche 56: `has`/`get` used to narrow an arbitrary `string` down to the
|
|
198
|
+
* closed `ProviderName` union before trusting `registry`'s own lookup —
|
|
199
|
+
* `ProviderName` is a plain string now (any catalog id or operator-chosen
|
|
200
|
+
* custom id `store.ts` accepted at write time), so `registry.has`/`get`
|
|
201
|
+
* already answer correctly for every key it was actually built with; no
|
|
202
|
+
* second allowlist to keep in sync here.
|
|
203
|
+
*/
|
|
204
|
+
function createLiveProviderRegistry(store) {
|
|
205
|
+
let registry = createProviderRegistry({});
|
|
206
|
+
return {
|
|
207
|
+
async refresh() {
|
|
208
|
+
registry = createProviderRegistry(await resolveProviderRegistryConfig(store));
|
|
209
|
+
},
|
|
210
|
+
has: (name) => registry.has(name),
|
|
211
|
+
get: (name) => registry.get(name),
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
function buildToolRegistry(options) {
|
|
215
|
+
const contentServiceLike = contentServiceLikeOf(options.contentService);
|
|
216
|
+
const contentBrowseServiceLike = contentBrowseServiceLikeOf(options.contentService, options.collections);
|
|
217
|
+
const contentSchemaServiceLike = contentSchemaServiceLikeOf(options.contentService, options.collections);
|
|
218
|
+
const definitions = [
|
|
219
|
+
createContentReadTool(contentServiceLike),
|
|
220
|
+
createContentWriteDraftTool(contentServiceLike),
|
|
221
|
+
createContentPublishTool(contentServiceLike),
|
|
222
|
+
createContentDeleteTool(contentServiceLike),
|
|
223
|
+
createMediaReadTool(options.mediaStore),
|
|
224
|
+
createMediaWriteTool(options.mediaStore),
|
|
225
|
+
createSiteConfigReadTool(),
|
|
226
|
+
createDocumentExtractTool(),
|
|
227
|
+
createDepsScanTool({ projectRoot: options.projectRoot }),
|
|
228
|
+
// L22 task 3 — the Site Monitor's toolset.
|
|
229
|
+
createNotFoundLogReadTool(options.notFoundLog),
|
|
230
|
+
createContentCollectionsTool(contentBrowseServiceLike),
|
|
231
|
+
createContentListTool(contentBrowseServiceLike),
|
|
232
|
+
// The missing half of the browse pair — a collection's field shape,
|
|
233
|
+
// not just its entries.
|
|
234
|
+
createContentSchemaTool(contentSchemaServiceLike),
|
|
235
|
+
createRedirectCreateTool(options.redirects),
|
|
236
|
+
...options.mcpDefinitions,
|
|
237
|
+
// L26 task 5 — "Cogenta Theme Creator"'s only tool. `sideEffects: false`,
|
|
238
|
+
// no write path at any autonomy level (see the tool's own doc comment).
|
|
239
|
+
...(options.themeCreator === undefined ? [] : [createProposeThemeTool(options.themeCreator)]),
|
|
240
|
+
];
|
|
241
|
+
return createToolRegistry(definitions);
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Adapts `@cogenta/agents`' async `AgentDeclarationStore` to `@cogenta/api`'s
|
|
245
|
+
* synchronous `AgentRegistryLike` — an in-memory cache, and a per-agent kill
|
|
246
|
+
* switch shared with `AgentRunner` so `disable()` stops a run in flight, not
|
|
247
|
+
* only future ones (mirrors `createAgentRegistry`'s own guarantee). The
|
|
248
|
+
* cache is populated once, synchronously awaited, by `buildAgentRuntime`
|
|
249
|
+
* calling `refresh()` before this runtime is handed to anything else — every
|
|
250
|
+
* caller (the REST router, the runner) expects `list()`/`get()` to answer
|
|
251
|
+
* correctly from the moment they receive this object, never after a first,
|
|
252
|
+
* implicit mutation.
|
|
253
|
+
*/
|
|
254
|
+
function createRegistryAdapter(store) {
|
|
255
|
+
let cache = [];
|
|
256
|
+
const killSwitches = new Map();
|
|
257
|
+
function killSwitchFor(name) {
|
|
258
|
+
const existing = killSwitches.get(name);
|
|
259
|
+
if (existing !== undefined)
|
|
260
|
+
return existing;
|
|
261
|
+
const created = createKillSwitch(false);
|
|
262
|
+
killSwitches.set(name, created);
|
|
263
|
+
return created;
|
|
264
|
+
}
|
|
265
|
+
async function refresh() {
|
|
266
|
+
cache = await store.list();
|
|
267
|
+
for (const agent of cache) {
|
|
268
|
+
const kill = killSwitchFor(agent.name);
|
|
269
|
+
if (agent.enabled)
|
|
270
|
+
kill.deactivate();
|
|
271
|
+
else
|
|
272
|
+
kill.activate();
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
const registry = {
|
|
276
|
+
list: () => cache,
|
|
277
|
+
get: (name) => cache.find((agent) => agent.name === name),
|
|
278
|
+
enable(name) {
|
|
279
|
+
killSwitchFor(name).deactivate();
|
|
280
|
+
void store.setEnabled(name, true).then(refresh);
|
|
281
|
+
},
|
|
282
|
+
disable(name) {
|
|
283
|
+
killSwitchFor(name).activate();
|
|
284
|
+
void store.setEnabled(name, false).then(refresh);
|
|
285
|
+
},
|
|
286
|
+
isEnabled: (name) => !killSwitchFor(name).isActive(),
|
|
287
|
+
async create(input) {
|
|
288
|
+
await store.create(input);
|
|
289
|
+
await refresh();
|
|
290
|
+
},
|
|
291
|
+
async update(name, patch) {
|
|
292
|
+
await store.update(name, patch);
|
|
293
|
+
await refresh();
|
|
294
|
+
},
|
|
295
|
+
async remove(name) {
|
|
296
|
+
await store.remove(name);
|
|
297
|
+
await refresh();
|
|
298
|
+
},
|
|
299
|
+
readIdentity: (name) => store.readIdentity(name),
|
|
300
|
+
};
|
|
301
|
+
return { registry, killSwitchFor, refresh };
|
|
302
|
+
}
|
|
303
|
+
function createSkillRegistryAdapter(store) {
|
|
304
|
+
return {
|
|
305
|
+
list: () => store.list(),
|
|
306
|
+
get: (id) => store.get(id),
|
|
307
|
+
create: (input) => store.create(input),
|
|
308
|
+
update: (id, patch) => store.update(id, patch),
|
|
309
|
+
remove: (id) => store.remove(id),
|
|
310
|
+
listResources: (id) => store.listResources(id),
|
|
311
|
+
addResource: (id, relativePath, content) => store.addResource(id, relativePath, content),
|
|
312
|
+
removeResource: (id, relativePath) => store.removeResource(id, relativePath),
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
/** `@cogenta/api`'s `ProviderRegistryLike.catalog` shape — kept as a plain
|
|
316
|
+
* structural type here rather than importing `ProviderCatalogEntry` from
|
|
317
|
+
* `@cogenta/agents`, so `@cogenta/api` never needs a runtime dependency on
|
|
318
|
+
* `@cogenta/agents` (it is a devDependency only) to serve `GET
|
|
319
|
+
* /api/providers/catalog`; this module already depends on both. */
|
|
320
|
+
function providerCatalogSummary() {
|
|
321
|
+
return KNOWN_PROVIDER_CATALOG;
|
|
322
|
+
}
|
|
323
|
+
function createPromptTemplateRegistryAdapter(store) {
|
|
324
|
+
return {
|
|
325
|
+
list: () => store.list(),
|
|
326
|
+
get: (id) => store.get(id),
|
|
327
|
+
create: (input) => store.create(input),
|
|
328
|
+
update: (id, patch) => store.update(id, patch),
|
|
329
|
+
remove: (id) => store.remove(id),
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
function createProviderRegistryAdapter(store, onMutated) {
|
|
333
|
+
return {
|
|
334
|
+
names: KNOWN_PROVIDER_CATALOG.map((entry) => entry.id),
|
|
335
|
+
catalog: providerCatalogSummary(),
|
|
336
|
+
list: () => store.list(),
|
|
337
|
+
async upsert(input) {
|
|
338
|
+
const saved = await store.upsert(input);
|
|
339
|
+
await onMutated();
|
|
340
|
+
return saved;
|
|
341
|
+
},
|
|
342
|
+
async setEnabled(provider, enabled) {
|
|
343
|
+
const saved = await store.setEnabled(provider, enabled);
|
|
344
|
+
await onMutated();
|
|
345
|
+
return saved;
|
|
346
|
+
},
|
|
347
|
+
async updateSettings(provider, patch) {
|
|
348
|
+
const saved = await store.updateSettings(provider, patch);
|
|
349
|
+
await onMutated();
|
|
350
|
+
return saved;
|
|
351
|
+
},
|
|
352
|
+
async remove(provider) {
|
|
353
|
+
await store.remove(provider);
|
|
354
|
+
await onMutated();
|
|
355
|
+
},
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Fiche 58 task 4's "no restart needed" half — same idiom as
|
|
360
|
+
* `createLiveProviderRegistry` above, applied to the whole tool registry
|
|
361
|
+
* rather than just the provider one: `replace` swaps which underlying
|
|
362
|
+
* `ToolRegistry` `list`/`get` read from, so an agent mid-run that already
|
|
363
|
+
* holds a reference to this wrapper sees the new set on its very next
|
|
364
|
+
* lookup, while a call already dispatched to an old `ExecutableTool`
|
|
365
|
+
* finishes against the client it was actually built with (never torn out
|
|
366
|
+
* from under it — see `refreshMcpTools`'s own comment on disposal order).
|
|
367
|
+
*/
|
|
368
|
+
function createLiveToolRegistry(initial) {
|
|
369
|
+
let current = initial;
|
|
370
|
+
return {
|
|
371
|
+
list: () => current.list(),
|
|
372
|
+
get: (name) => current.get(name),
|
|
373
|
+
replace(next) {
|
|
374
|
+
current = next;
|
|
375
|
+
},
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Assembles the whole L22 task 1/1bis runtime for one site: three file
|
|
380
|
+
* stores (agents, agent skills, provider config — all under `dataDir`, R1),
|
|
381
|
+
* the real tool registry, and the one `AgentRunner` this site's `/api/agents`
|
|
382
|
+
* `run` route and any future trigger (cron, channel, chat — later tasks)
|
|
383
|
+
* will share. Idempotent: safe to call on every `cogenta serve` boot,
|
|
384
|
+
* including an upgrade from a pre-L22 site (`ensureBuiltinAgents`/
|
|
385
|
+
* `ensureBuiltinAgentSkills` only ever add what is missing).
|
|
386
|
+
*/
|
|
387
|
+
export async function buildAgentRuntime(options) {
|
|
388
|
+
const agentStore = createFileAgentDeclarationStore({ dir: join(options.dataDir, AGENTS_SUBDIR) });
|
|
389
|
+
const skillStore = createFileAgentSkillStore({ dir: join(options.dataDir, SKILLS_SUBDIR) });
|
|
390
|
+
const providerStore = createFileProviderConfigStore({
|
|
391
|
+
dir: join(options.dataDir, PROVIDERS_SUBDIR),
|
|
392
|
+
signingKey: options.signingKey,
|
|
393
|
+
});
|
|
394
|
+
const promptTemplateStore = createFilePromptTemplateStore({
|
|
395
|
+
dir: join(options.dataDir, PROMPT_TEMPLATES_SUBDIR),
|
|
396
|
+
});
|
|
397
|
+
const conversationStore = createFileAgentConversationStore({
|
|
398
|
+
dir: join(options.dataDir, CONVERSATIONS_SUBDIR),
|
|
399
|
+
});
|
|
400
|
+
await ensureBuiltinAgents(agentStore);
|
|
401
|
+
await ensureBuiltinAgentSkills(skillStore);
|
|
402
|
+
await ensureBuiltinPromptTemplates(promptTemplateStore);
|
|
403
|
+
const { registry: agentRegistry, killSwitchFor, refresh: refreshAgentRegistry, } = createRegistryAdapter(agentStore);
|
|
404
|
+
await refreshAgentRegistry();
|
|
405
|
+
const liveProviders = createLiveProviderRegistry(providerStore);
|
|
406
|
+
await liveProviders.refresh();
|
|
407
|
+
const coreToolOptions = {
|
|
408
|
+
contentService: options.contentService,
|
|
409
|
+
mediaStore: options.mediaStore,
|
|
410
|
+
projectRoot: options.projectRoot,
|
|
411
|
+
collections: options.collections,
|
|
412
|
+
notFoundLog: options.notFoundLog,
|
|
413
|
+
redirects: options.redirects,
|
|
414
|
+
...(options.themeCreator === undefined ? {} : { themeCreator: options.themeCreator }),
|
|
415
|
+
};
|
|
416
|
+
// Fiche 58 task 4 — built once, here, before the tool registry: every
|
|
417
|
+
// enabled connection with at least one checked tool gets its own
|
|
418
|
+
// sandboxed `McpClient` (`../client/stdio-client.js`'s floor — no
|
|
419
|
+
// inherited environment, a dedicated cwd, a hard per-call timeout, a
|
|
420
|
+
// best-effort resource watchdog), shared by every one of that
|
|
421
|
+
// connection's exposed tools. A connection that fails to initialize is
|
|
422
|
+
// logged and skipped, never thrown — one misbehaving external server
|
|
423
|
+
// must not keep this whole runtime from starting (R2's own posture,
|
|
424
|
+
// applied here to a different kind of "capability that may be absent").
|
|
425
|
+
let mcpAssembly = options.mcpConnections === undefined
|
|
426
|
+
? { definitions: [], dispose: async () => undefined }
|
|
427
|
+
: await buildMcpToolDefinitions({ store: options.mcpConnections, logger: options.logger });
|
|
428
|
+
// A live wrapper, not a fixed `ToolRegistry`: `refreshMcpTools` below
|
|
429
|
+
// swaps what it points at, so an admin creating a connection or checking
|
|
430
|
+
// a new tool from the "MCP Clients" screen takes effect on this
|
|
431
|
+
// runtime's very next `createAgentRunner` lookup — no `cogenta serve`
|
|
432
|
+
// restart, the same "no restart needed" guarantee `liveProviders`
|
|
433
|
+
// already gives `/api/providers`.
|
|
434
|
+
const tools = createLiveToolRegistry(buildToolRegistry({ ...coreToolOptions, mcpDefinitions: mcpAssembly.definitions }));
|
|
435
|
+
// Built once (or reused from `options.approvalQueue`, injectable for
|
|
436
|
+
// tests) and handed both to the runner (where `co-pilot` autonomy files a
|
|
437
|
+
// request) and back out on `AgentRuntimeAssembly` (where `serve.ts` reads
|
|
438
|
+
// pending ones for the L22 task 3 notice source, and a channel/chat
|
|
439
|
+
// surface or future approvals route could decide one) — the same object,
|
|
440
|
+
// never two queues that could disagree.
|
|
441
|
+
const approvalQueue = options.approvalQueue ?? createMemoryApprovalQueue();
|
|
442
|
+
const runner = createAgentRunner({
|
|
443
|
+
agents: agentStore,
|
|
444
|
+
skills: skillStore,
|
|
445
|
+
tools,
|
|
446
|
+
providers: liveProviders,
|
|
447
|
+
auditLog: options.auditLog,
|
|
448
|
+
approvalQueue,
|
|
449
|
+
site: options.site,
|
|
450
|
+
killSwitchFor,
|
|
451
|
+
});
|
|
452
|
+
const agentRunner = {
|
|
453
|
+
async run(name, instruction, trigger, history) {
|
|
454
|
+
return runner.run(name, {
|
|
455
|
+
instruction,
|
|
456
|
+
...(trigger === undefined ? {} : { trigger }),
|
|
457
|
+
...(history === undefined ? {} : { history }),
|
|
458
|
+
});
|
|
459
|
+
},
|
|
460
|
+
};
|
|
461
|
+
const providerRegistry = createProviderRegistryAdapter(providerStore, () => liveProviders.refresh());
|
|
462
|
+
const skillRegistry = createSkillRegistryAdapter(skillStore);
|
|
463
|
+
const promptTemplateRegistry = createPromptTemplateRegistryAdapter(promptTemplateStore);
|
|
464
|
+
/**
|
|
465
|
+
* Fiche 58 task 4 — rebuilds the MCP portion of the tool registry from
|
|
466
|
+
* the connection store's *current* state (every enabled connection,
|
|
467
|
+
* whatever is exposed right now) and swaps it into `tools` atomically
|
|
468
|
+
* (`createLiveToolRegistry`'s `replace`). The *old* clients are closed
|
|
469
|
+
* only after the swap, never before: a tool call already in flight
|
|
470
|
+
* against the previous `McpClient` finishes normally, and nothing new
|
|
471
|
+
* can be dispatched to it once `tools.replace` has taken effect.
|
|
472
|
+
*/
|
|
473
|
+
async function doRefreshMcpTools() {
|
|
474
|
+
if (options.mcpConnections === undefined)
|
|
475
|
+
return;
|
|
476
|
+
const nextAssembly = await buildMcpToolDefinitions({
|
|
477
|
+
store: options.mcpConnections,
|
|
478
|
+
logger: options.logger,
|
|
479
|
+
});
|
|
480
|
+
const previous = mcpAssembly;
|
|
481
|
+
tools.replace(buildToolRegistry({ ...coreToolOptions, mcpDefinitions: nextAssembly.definitions }));
|
|
482
|
+
mcpAssembly = nextAssembly;
|
|
483
|
+
await previous.dispose();
|
|
484
|
+
}
|
|
485
|
+
// Serialised, not called bare: two `refreshMcpTools()` calls racing (an
|
|
486
|
+
// admin's own double-click on "test connection", or two REST calls
|
|
487
|
+
// overlapping) would otherwise let one call's freshly-built assembly —
|
|
488
|
+
// including its own genuinely spawned `stdio` processes and sandbox
|
|
489
|
+
// directories — be overwritten by the other's `mcpAssembly = ...` before
|
|
490
|
+
// ever being disposed, leaking an unsandboxed process that outlives even
|
|
491
|
+
// this runtime's own `mcpDispose()` at shutdown (found by the fiche 58
|
|
492
|
+
// security review). Chaining onto the same promise, success or failure,
|
|
493
|
+
// guarantees at most one `doRefreshMcpTools` runs at a time and every
|
|
494
|
+
// built assembly is either adopted or disposed, never orphaned.
|
|
495
|
+
let refreshChain = Promise.resolve();
|
|
496
|
+
function refreshMcpTools() {
|
|
497
|
+
refreshChain = refreshChain.then(doRefreshMcpTools, doRefreshMcpTools);
|
|
498
|
+
return refreshChain;
|
|
499
|
+
}
|
|
500
|
+
const configuredProviders = (await providerStore.list()).filter((p) => p.enabled);
|
|
501
|
+
const summary = configuredProviders.length === 0
|
|
502
|
+
? 'agents: registered, no LLM provider configured (runs refuse before any network call)'
|
|
503
|
+
: `agents: registered, ${configuredProviders.length} provider(s) configured (${configuredProviders
|
|
504
|
+
.map((p) => p.provider)
|
|
505
|
+
.join(', ')})`;
|
|
506
|
+
return {
|
|
507
|
+
agentRegistry,
|
|
508
|
+
agentRunner,
|
|
509
|
+
providerRegistry,
|
|
510
|
+
skillRegistry,
|
|
511
|
+
promptTemplateRegistry,
|
|
512
|
+
conversations: conversationStore,
|
|
513
|
+
approvalQueue,
|
|
514
|
+
summary,
|
|
515
|
+
refreshMcpTools,
|
|
516
|
+
mcpDispose: () => mcpAssembly.dispose(),
|
|
517
|
+
};
|
|
518
|
+
}
|
|
519
|
+
//# sourceMappingURL=agent-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-runtime.js","sourceRoot":"","sources":["../../src/commands/agent-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAYL,iBAAiB,EACjB,4BAA4B,EAC5B,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,EACvB,2BAA2B,EAC3B,kBAAkB,EAClB,yBAAyB,EACzB,gCAAgC,EAChC,+BAA+B,EAC/B,yBAAyB,EACzB,6BAA6B,EAC7B,6BAA6B,EAC7B,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,yBAAyB,EACzB,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,EACxB,wBAAwB,EACxB,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,4BAA4B,EAC5B,sBAAsB,EAOtB,6BAA6B,GAI9B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAYhE,OAAO,EAAE,uBAAuB,EAA2B,MAAM,cAAc,CAAA;AAC/E,OAAO,EAAE,SAAS,EAA6B,MAAM,iBAAiB,CAAA;AAEtE;;;;;;;;;;;;;;GAcG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,QAAQ,CAAA;AACrC,MAAM,aAAa,GAAG,QAAQ,CAAA;AAC9B;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAA;AAC3C;;;;;;;;;GASG;AACH,MAAM,uBAAuB,GAAG,kBAAkB,CAAA;AAClD,MAAM,oBAAoB,GAAG,eAAe,CAAA;AAuG5C;;;;;;;GAOG;AACH,SAAS,oBAAoB,CAAC,OAAuB;IACnD,OAAO;QACL,IAAI,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CACtC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,CAAgD;QAC5F,MAAM,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAC3C,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,CAE9C;QACH,MAAM,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAC/C,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAElD;QACH,OAAO,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAChD,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAEnD;QACH,MAAM,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC;KAC7E,CAAA;AACH,CAAC;AAED,+QAA+Q;AAC/Q,SAAS,OAAO,CAAC,MAAyC;IACxD,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,CAAA;IAC/D,OAAO,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAA;AACjF,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAS,0BAA0B,CACjC,OAAuB,EACvB,WAA4C;IAE5C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAA;IAEtF,SAAS,MAAM,CACb,UAAgC,EAChC,KAAsF;QAEtF,IAAI,UAAU,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,IAAI,CAAA;QACjD,MAAM,MAAM,GAA2B,EAAE,CAAA;QACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YACxD,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QACpD,CAAC;QACD,IAAI,CAAC;YACH,OAAO,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,OAAO;QACL,WAAW,EAAE,KAAK,EAAE,OAAmC,EAAE,EAAE;YACzD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;YAChD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACjC,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,OAAO,KAAK,SAAS;aAC9D,CAAC,CAAC,CAAA;QACL,CAAC;QACD,IAAI,EAAE,KAAK,EAAE,OAAmC,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE;YAC3E,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;YAC7C,IAAI,UAAU,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAA;YAC9C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE;gBACvD,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE;gBAC/C,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,SAAS;gBACjB,cAAc,EAAE,WAAW;gBAC3B,eAAe,EAAE,SAAS;gBAC1B,OAAO,EAAE,SAAS;gBAClB,KAAK,EAAE,CAAC;aACT,CAAC,CAAA;YACF,OAAO;gBACL,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAC/B,EAAE,EAAE,IAAI,CAAC,EAAE;oBACX,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;oBAC3B,IAAI,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;oBACtE,MAAM,EAAE,IAAI,CAAC,MAAM;iBACpB,CAAC,CAAC;aACJ,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,0BAA0B,CACjC,OAAuB,EACvB,WAA4C;IAE5C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAA;IAEtF,SAAS,QAAQ,CAAC,UAAgC;QAChD,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9D,GAAG;YACH,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,IAAI,IAAI;YACjC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK;YACjC,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAC,CAAA;IACL,CAAC;IAED,SAAS,SAAS,CAAC,UAAgC;QACjD,OAAO;YACL,UAAU,EAAE,UAAU,CAAC,IAAI;YAC3B,aAAa,EAAE,UAAU,CAAC,MAAM,CAAC,QAAQ;YACzC,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC,MAAM;YACrC,MAAM,EAAE,UAAU,CAAC,OAAO,KAAK,SAAS;YACxC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC;SAC7B,CAAA;IACH,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,KAAK,EAAE,OAAmC,EAAE,cAAuB,EAAE,EAAE;YAC/E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAA;YAC3F,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;gBACjC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;gBAC7C,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC;oBAAE,OAAO,EAAE,CAAA;gBACxE,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAA;YAChC,CAAC;YACD,OAAO,WAAW;iBACf,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;iBACrD,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAA;QAC/C,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAS,0BAA0B,CAAC,KAA0B;IAG5D,IAAI,QAAQ,GAAG,sBAAsB,CAAC,EAAE,CAAC,CAAA;IACzC,OAAO;QACL,KAAK,CAAC,OAAO;YACX,QAAQ,GAAG,sBAAsB,CAAC,MAAM,6BAA6B,CAAC,KAAK,CAAC,CAAC,CAAA;QAC/E,CAAC;QACD,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QACjC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;KAClC,CAAA;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,OAgB1B;IACC,MAAM,kBAAkB,GAAuB,oBAAoB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;IAC3F,MAAM,wBAAwB,GAAG,0BAA0B,CACzD,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,WAAW,CACpB,CAAA;IACD,MAAM,wBAAwB,GAAG,0BAA0B,CACzD,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,WAAW,CACpB,CAAA;IACD,MAAM,WAAW,GAAqB;QACpC,qBAAqB,CAAC,kBAAkB,CAAC;QACzC,2BAA2B,CAAC,kBAAkB,CAAC;QAC/C,wBAAwB,CAAC,kBAAkB,CAAC;QAC5C,uBAAuB,CAAC,kBAAkB,CAAC;QAC3C,mBAAmB,CAAC,OAAO,CAAC,UAAU,CAAC;QACvC,oBAAoB,CAAC,OAAO,CAAC,UAAU,CAAC;QACxC,wBAAwB,EAAE;QAC1B,yBAAyB,EAAE;QAC3B,kBAAkB,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;QACxD,2CAA2C;QAC3C,yBAAyB,CAAC,OAAO,CAAC,WAAW,CAAC;QAC9C,4BAA4B,CAAC,wBAAwB,CAAC;QACtD,qBAAqB,CAAC,wBAAwB,CAAC;QAC/C,oEAAoE;QACpE,wBAAwB;QACxB,uBAAuB,CAAC,wBAAwB,CAAC;QACjD,wBAAwB,CAAC,OAAO,CAAC,SAAS,CAAC;QAC3C,GAAG,OAAO,CAAC,cAAc;QACzB,0EAA0E;QAC1E,wEAAwE;QACxE,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;KAC9F,CAAA;IACD,OAAO,kBAAkB,CAAC,WAAW,CAAC,CAAA;AACxC,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,qBAAqB,CAAC,KAA4B;IAKzD,IAAI,KAAK,GAA0E,EAAE,CAAA;IACrF,MAAM,YAAY,GAAG,IAAI,GAAG,EAA6B,CAAA;IAEzD,SAAS,aAAa,CAAC,IAAY;QACjC,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACvC,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAA;QAC3C,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;QACvC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAC/B,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,KAAK,UAAU,OAAO;QACpB,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAA;QAC1B,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACtC,IAAI,KAAK,CAAC,OAAO;gBAAE,IAAI,CAAC,UAAU,EAAE,CAAA;;gBAC/B,IAAI,CAAC,QAAQ,EAAE,CAAA;QACtB,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAsB;QAClC,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK;QACjB,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;QACzD,MAAM,CAAC,IAAI;YACT,aAAa,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAA;YAChC,KAAK,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACjD,CAAC;QACD,OAAO,CAAC,IAAI;YACV,aAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAA;YAC9B,KAAK,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAClD,CAAC;QACD,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;QACpD,KAAK,CAAC,MAAM,CAAC,KAAK;YAChB,MAAM,KAAK,CAAC,MAAM,CAAC,KAAc,CAAC,CAAA;YAClC,MAAM,OAAO,EAAE,CAAA;QACjB,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK;YACtB,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,KAAc,CAAC,CAAA;YACxC,MAAM,OAAO,EAAE,CAAA;QACjB,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,IAAI;YACf,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACxB,MAAM,OAAO,EAAE,CAAA;QACjB,CAAC;QACD,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC;KACjD,CAAA;IAED,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,CAAA;AAC7C,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAsB;IACxD,OAAO;QACL,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE;QACxB,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;QACtC,MAAM,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC;QAC9C,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9C,WAAW,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC;QACxF,cAAc,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,EAAE,YAAY,CAAC;KAC7E,CAAA;AACH,CAAC;AAED;;;;mEAImE;AACnE,SAAS,sBAAsB;IAO7B,OAAO,sBAAsB,CAAA;AAC/B,CAAC;AAED,SAAS,mCAAmC,CAC1C,KAA0B;IAE1B,OAAO;QACL,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE;QACxB,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;QACtC,MAAM,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC;QAC9C,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;KACjC,CAAA;AACH,CAAC;AAED,SAAS,6BAA6B,CACpC,KAA0B,EAC1B,SAA8B;IAE9B,OAAO;QACL,KAAK,EAAE,sBAAsB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,OAAO,EAAE,sBAAsB,EAAE;QACjC,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE;QACxB,KAAK,CAAC,MAAM,CAAC,KAAK;YAChB,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,KAAc,CAAC,CAAA;YAChD,MAAM,SAAS,EAAE,CAAA;YACjB,OAAO,KAAK,CAAA;QACd,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO;YAChC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YACvD,MAAM,SAAS,EAAE,CAAA;YACjB,OAAO,KAAK,CAAA;QACd,CAAC;QACD,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,KAAK;YAClC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;YACzD,MAAM,SAAS,EAAE,CAAA;YACjB,OAAO,KAAK,CAAA;QACd,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,QAAQ;YACnB,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;YAC5B,MAAM,SAAS,EAAE,CAAA;QACnB,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,sBAAsB,CAAC,OAAqB;IAGnD,IAAI,OAAO,GAAG,OAAO,CAAA;IACrB,OAAO;QACL,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE;QAC1B,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QAChC,OAAO,CAAC,IAAI;YACV,OAAO,GAAG,IAAI,CAAA;QAChB,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAiC;IAEjC,MAAM,UAAU,GAAG,+BAA+B,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,CAAA;IACjG,MAAM,UAAU,GAAG,yBAAyB,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,CAAA;IAC3F,MAAM,aAAa,GAAG,6BAA6B,CAAC;QAClD,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,gBAAgB,CAAC;QAC5C,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC,CAAA;IACF,MAAM,mBAAmB,GAAG,6BAA6B,CAAC;QACxD,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,uBAAuB,CAAC;KACpD,CAAC,CAAA;IACF,MAAM,iBAAiB,GAAG,gCAAgC,CAAC;QACzD,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,oBAAoB,CAAC;KACjD,CAAC,CAAA;IAEF,MAAM,mBAAmB,CAAC,UAAU,CAAC,CAAA;IACrC,MAAM,wBAAwB,CAAC,UAAU,CAAC,CAAA;IAC1C,MAAM,4BAA4B,CAAC,mBAAmB,CAAC,CAAA;IAEvD,MAAM,EACJ,QAAQ,EAAE,aAAa,EACvB,aAAa,EACb,OAAO,EAAE,oBAAoB,GAC9B,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAA;IACrC,MAAM,oBAAoB,EAAE,CAAA;IAE5B,MAAM,aAAa,GAAG,0BAA0B,CAAC,aAAa,CAAC,CAAA;IAC/D,MAAM,aAAa,CAAC,OAAO,EAAE,CAAA;IAE7B,MAAM,eAAe,GAAG;QACtB,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;KACtF,CAAA;IAED,sEAAsE;IACtE,iEAAiE;IACjE,kEAAkE;IAClE,qEAAqE;IACrE,8DAA8D;IAC9D,uEAAuE;IACvE,qEAAqE;IACrE,oEAAoE;IACpE,wEAAwE;IACxE,IAAI,WAAW,GACb,OAAO,CAAC,cAAc,KAAK,SAAS;QAClC,CAAC,CAAC,EAAE,WAAW,EAAE,EAA+B,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS,EAAE;QAClF,CAAC,CAAC,MAAM,uBAAuB,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAE9F,sEAAsE;IACtE,yEAAyE;IACzE,gEAAgE;IAChE,sEAAsE;IACtE,kEAAkE;IAClE,kCAAkC;IAClC,MAAM,KAAK,GAAG,sBAAsB,CAClC,iBAAiB,CAAC,EAAE,GAAG,eAAe,EAAE,cAAc,EAAE,WAAW,CAAC,WAAW,EAAE,CAAC,CACnF,CAAA;IAED,qEAAqE;IACrE,0EAA0E;IAC1E,0EAA0E;IAC1E,oEAAoE;IACpE,yEAAyE;IACzE,wCAAwC;IACxC,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,yBAAyB,EAAE,CAAA;IAE1E,MAAM,MAAM,GAAgB,iBAAiB,CAAC;QAC5C,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,UAAU;QAClB,KAAK;QACL,SAAS,EAAE,aAAa;QACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,aAAa;QACb,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,aAAa;KACd,CAAC,CAAA;IAEF,MAAM,WAAW,GAAoB;QACnC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO;YAC3C,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE;gBACtB,WAAW;gBACX,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;gBAC7C,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;aAC9C,CAAC,CAAA;QACJ,CAAC;KACF,CAAA;IAED,MAAM,gBAAgB,GAAG,6BAA6B,CAAC,aAAa,EAAE,GAAG,EAAE,CACzE,aAAa,CAAC,OAAO,EAAE,CACxB,CAAA;IACD,MAAM,aAAa,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAA;IAC5D,MAAM,sBAAsB,GAAG,mCAAmC,CAAC,mBAAmB,CAAC,CAAA;IAEvF;;;;;;;;OAQG;IACH,KAAK,UAAU,iBAAiB;QAC9B,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS;YAAE,OAAM;QAChD,MAAM,YAAY,GAAG,MAAM,uBAAuB,CAAC;YACjD,KAAK,EAAE,OAAO,CAAC,cAAc;YAC7B,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAA;QACF,MAAM,QAAQ,GAAG,WAAW,CAAA;QAC5B,KAAK,CAAC,OAAO,CACX,iBAAiB,CAAC,EAAE,GAAG,eAAe,EAAE,cAAc,EAAE,YAAY,CAAC,WAAW,EAAE,CAAC,CACpF,CAAA;QACD,WAAW,GAAG,YAAY,CAAA;QAC1B,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAA;IAC1B,CAAC;IAED,wEAAwE;IACxE,mEAAmE;IACnE,uEAAuE;IACvE,oEAAoE;IACpE,yEAAyE;IACzE,yEAAyE;IACzE,uEAAuE;IACvE,wEAAwE;IACxE,sEAAsE;IACtE,gEAAgE;IAChE,IAAI,YAAY,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAA;IACnD,SAAS,eAAe;QACtB,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAA;QACtE,OAAO,YAAY,CAAA;IACrB,CAAC;IAED,MAAM,mBAAmB,GAAG,CAAC,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IACjF,MAAM,OAAO,GACX,mBAAmB,CAAC,MAAM,KAAK,CAAC;QAC9B,CAAC,CAAC,sFAAsF;QACxF,CAAC,CAAC,uBAAuB,mBAAmB,CAAC,MAAM,4BAA4B,mBAAmB;aAC7F,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;aACtB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAA;IAEtB,OAAO;QACL,aAAa;QACb,WAAW;QACX,gBAAgB;QAChB,aAAa;QACb,sBAAsB;QACtB,aAAa,EAAE,iBAAiB;QAChC,aAAa;QACb,OAAO;QACP,eAAe;QACf,UAAU,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE;KACxC,CAAA;AACH,CAAC"}
|