@jait/gateway 0.1.274 → 0.1.276
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/dist/clawhub/client.d.ts +105 -0
- package/dist/clawhub/client.d.ts.map +1 -0
- package/dist/clawhub/client.js +123 -0
- package/dist/clawhub/client.js.map +1 -0
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +22 -0
- package/dist/db/migrations.js.map +1 -1
- package/dist/db/schema.d.ts +216 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +14 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/foundation.d.ts +4 -1
- package/dist/foundation.d.ts.map +1 -1
- package/dist/foundation.js +2 -0
- package/dist/foundation.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -1
- package/dist/plugins/contracts.d.ts +44 -0
- package/dist/plugins/contracts.d.ts.map +1 -1
- package/dist/plugins/contracts.js +9 -0
- package/dist/plugins/contracts.js.map +1 -1
- package/dist/plugins/manager.d.ts +65 -0
- package/dist/plugins/manager.d.ts.map +1 -0
- package/dist/plugins/manager.js +393 -0
- package/dist/plugins/manager.js.map +1 -0
- package/dist/plugins/manifest.d.ts +69 -0
- package/dist/plugins/manifest.d.ts.map +1 -0
- package/dist/plugins/manifest.js +28 -0
- package/dist/plugins/manifest.js.map +1 -0
- package/dist/plugins/openclaw-adapter.d.ts +42 -0
- package/dist/plugins/openclaw-adapter.d.ts.map +1 -0
- package/dist/plugins/openclaw-adapter.js +236 -0
- package/dist/plugins/openclaw-adapter.js.map +1 -0
- package/dist/routes/chat.d.ts +2 -0
- package/dist/routes/chat.d.ts.map +1 -1
- package/dist/routes/chat.js +26 -3
- package/dist/routes/chat.js.map +1 -1
- package/dist/routes/mcp-server.d.ts.map +1 -1
- package/dist/routes/mcp-server.js +3 -0
- package/dist/routes/mcp-server.js.map +1 -1
- package/dist/routes/plugins.d.ts +16 -0
- package/dist/routes/plugins.d.ts.map +1 -0
- package/dist/routes/plugins.js +84 -0
- package/dist/routes/plugins.js.map +1 -0
- package/dist/routes/skills.d.ts +11 -0
- package/dist/routes/skills.d.ts.map +1 -0
- package/dist/routes/skills.js +39 -0
- package/dist/routes/skills.js.map +1 -0
- package/dist/routes/store.d.ts +21 -0
- package/dist/routes/store.d.ts.map +1 -0
- package/dist/routes/store.js +149 -0
- package/dist/routes/store.js.map +1 -0
- package/dist/routes/threads.d.ts +2 -0
- package/dist/routes/threads.d.ts.map +1 -1
- package/dist/routes/threads.js +9 -1
- package/dist/routes/threads.js.map +1 -1
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -1
- package/dist/skills/index.d.ts +71 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +176 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/tools/prompts/prompt-registry.d.ts +3 -0
- package/dist/tools/prompts/prompt-registry.d.ts.map +1 -1
- package/dist/tools/prompts/prompt-registry.js +5 -0
- package/dist/tools/prompts/prompt-registry.js.map +1 -1
- package/package.json +1 -1
- package/web-dist/assets/{_basePickBy-_w8ADSKe.js → _basePickBy-SHIq-9-M.js} +1 -1
- package/web-dist/assets/{_baseUniq-DoTWg3g_.js → _baseUniq-DvuVM3FL.js} +1 -1
- package/web-dist/assets/{arc-EhnKDCZM.js → arc-rRRDxwm9.js} +1 -1
- package/web-dist/assets/{architectureDiagram-2XIMDMQ5-CGSsPfai.js → architectureDiagram-2XIMDMQ5-6Ie8gkit.js} +1 -1
- package/web-dist/assets/{blockDiagram-WCTKOSBZ-BI0bxzbF.js → blockDiagram-WCTKOSBZ-DyFAm0Wv.js} +1 -1
- package/web-dist/assets/{c4Diagram-IC4MRINW-B7Esq86v.js → c4Diagram-IC4MRINW-CFf9-N6D.js} +1 -1
- package/web-dist/assets/channel-C1a8HTQY.js +1 -0
- package/web-dist/assets/{chunk-4BX2VUAB-CiXYSUcF.js → chunk-4BX2VUAB-BXSP-ZXZ.js} +1 -1
- package/web-dist/assets/{chunk-55IACEB6-DLQFD8im.js → chunk-55IACEB6-DZz9Zfm4.js} +1 -1
- package/web-dist/assets/{chunk-FMBD7UC4-DZm4Tm5l.js → chunk-FMBD7UC4-BinqNBeA.js} +1 -1
- package/web-dist/assets/{chunk-JSJVCQXG-Du80znG3.js → chunk-JSJVCQXG-BEkDIiGt.js} +1 -1
- package/web-dist/assets/{chunk-KX2RTZJC-C3G1hqKb.js → chunk-KX2RTZJC-DRvcMdOS.js} +1 -1
- package/web-dist/assets/{chunk-NQ4KR5QH-GHNL_fKu.js → chunk-NQ4KR5QH-D7Qm-vTv.js} +1 -1
- package/web-dist/assets/{chunk-QZHKN3VN-DdFDd2Sp.js → chunk-QZHKN3VN-4EQs-zb4.js} +1 -1
- package/web-dist/assets/{chunk-WL4C6EOR-Bh5yMWT0.js → chunk-WL4C6EOR-C4J0wAQ1.js} +1 -1
- package/web-dist/assets/classDiagram-VBA2DB6C-kXFPuDdZ.js +1 -0
- package/web-dist/assets/classDiagram-v2-RAHNMMFH-kXFPuDdZ.js +1 -0
- package/web-dist/assets/clone-XznVhxYJ.js +1 -0
- package/web-dist/assets/{cose-bilkent-S5V4N54A-BsMcTEg-.js → cose-bilkent-S5V4N54A-pomS5wGN.js} +1 -1
- package/web-dist/assets/{dagre-KLK3FWXG-E0Llm070.js → dagre-KLK3FWXG-B-w30MG4.js} +1 -1
- package/web-dist/assets/{diagram-E7M64L7V-7H43VOx9.js → diagram-E7M64L7V-edXvdd7B.js} +1 -1
- package/web-dist/assets/{diagram-IFDJBPK2-Dy8iZsNw.js → diagram-IFDJBPK2-BJVALpLi.js} +1 -1
- package/web-dist/assets/{diagram-P4PSJMXO-3z8FT-4H.js → diagram-P4PSJMXO-B9llufAx.js} +1 -1
- package/web-dist/assets/{erDiagram-INFDFZHY-CGF2mp1V.js → erDiagram-INFDFZHY-D7r6WG_I.js} +1 -1
- package/web-dist/assets/{flowDiagram-PKNHOUZH-dt-pVRuj.js → flowDiagram-PKNHOUZH-BzOT4Umo.js} +1 -1
- package/web-dist/assets/{ganttDiagram-A5KZAMGK-CA4So_R2.js → ganttDiagram-A5KZAMGK-Cjbc4Lgp.js} +1 -1
- package/web-dist/assets/{gitGraphDiagram-K3NZZRJ6-CSyJ3OFu.js → gitGraphDiagram-K3NZZRJ6-B62CN_CL.js} +1 -1
- package/web-dist/assets/{graph-BDXwNkS1.js → graph-VLok1XGR.js} +1 -1
- package/web-dist/assets/index-BSVKCxiM.css +32 -0
- package/web-dist/assets/{index-B3CNIt2G.js → index-VURYXd1Z.js} +383 -373
- package/web-dist/assets/{infoDiagram-LFFYTUFH-x-RWNcIW.js → infoDiagram-LFFYTUFH-339hVOss.js} +1 -1
- package/web-dist/assets/{ishikawaDiagram-PHBUUO56-0esHI7MO.js → ishikawaDiagram-PHBUUO56-VRStan0c.js} +1 -1
- package/web-dist/assets/{journeyDiagram-4ABVD52K-BM496EwS.js → journeyDiagram-4ABVD52K-C_GmHh2b.js} +1 -1
- package/web-dist/assets/{kanban-definition-K7BYSVSG-YEIVwtYF.js → kanban-definition-K7BYSVSG-CT4QBteH.js} +1 -1
- package/web-dist/assets/{layout-jzHvv-vA.js → layout-BaAZzhOL.js} +1 -1
- package/web-dist/assets/{linear-D_zozBny.js → linear-t_udGhm_.js} +1 -1
- package/web-dist/assets/{mindmap-definition-YRQLILUH-By0PoNnz.js → mindmap-definition-YRQLILUH-DrP8dGq6.js} +1 -1
- package/web-dist/assets/{pieDiagram-SKSYHLDU-CrQAAH7f.js → pieDiagram-SKSYHLDU-CJiUjmMN.js} +1 -1
- package/web-dist/assets/{quadrantDiagram-337W2JSQ-arpVQ9oG.js → quadrantDiagram-337W2JSQ-WSyvax55.js} +1 -1
- package/web-dist/assets/{requirementDiagram-Z7DCOOCP-BXgkFODs.js → requirementDiagram-Z7DCOOCP-ll0s5py9.js} +1 -1
- package/web-dist/assets/{sankeyDiagram-WA2Y5GQK-BDi51cAi.js → sankeyDiagram-WA2Y5GQK-DYrhz3im.js} +1 -1
- package/web-dist/assets/{sequenceDiagram-2WXFIKYE-i39OfAbQ.js → sequenceDiagram-2WXFIKYE-Dp6ZSJqi.js} +1 -1
- package/web-dist/assets/{stateDiagram-RAJIS63D-CNgp8Vs6.js → stateDiagram-RAJIS63D-CfkOX-qK.js} +1 -1
- package/web-dist/assets/stateDiagram-v2-FVOUBMTO-BcJtPvOh.js +1 -0
- package/web-dist/assets/{timeline-definition-YZTLITO2-CBbqCMVi.js → timeline-definition-YZTLITO2-BGgyc2hn.js} +1 -1
- package/web-dist/assets/{treemap-KZPCXAKY-yDy9DP9O.js → treemap-KZPCXAKY-B3S5xd6G.js} +1 -1
- package/web-dist/assets/{vennDiagram-LZ73GAT5-BnZoghxR.js → vennDiagram-LZ73GAT5-n7918zRF.js} +1 -1
- package/web-dist/assets/{xychartDiagram-JWTSCODW-DBzQzD9W.js → xychartDiagram-JWTSCODW-wrqHya8i.js} +1 -1
- package/web-dist/index.html +2 -2
- package/web-dist/assets/channel-CINGP9LA.js +0 -1
- package/web-dist/assets/classDiagram-VBA2DB6C-BKWxO77f.js +0 -1
- package/web-dist/assets/classDiagram-v2-RAHNMMFH-BKWxO77f.js +0 -1
- package/web-dist/assets/clone-BramF8dO.js +0 -1
- package/web-dist/assets/index-DAgf0tm_.css +0 -32
- package/web-dist/assets/stateDiagram-v2-FVOUBMTO-DIScS6y6.js +0 -1
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin Manager — discovery, loading, lifecycle, and persistence.
|
|
3
|
+
*
|
|
4
|
+
* Extension directories are scanned for `jait.plugin.json` manifests.
|
|
5
|
+
* Enabled plugins are dynamically imported and their contributions
|
|
6
|
+
* are registered with the tool / provider registries.
|
|
7
|
+
*/
|
|
8
|
+
import { readdir, readFile, stat } from "node:fs/promises";
|
|
9
|
+
import { join, resolve } from "node:path";
|
|
10
|
+
import { homedir } from "node:os";
|
|
11
|
+
import { validateManifest } from "./manifest.js";
|
|
12
|
+
import { discoverOpenClawPlugins, openclawToJaitManifest, createOpenClawPluginModule } from "./openclaw-adapter.js";
|
|
13
|
+
/* ------------------------------------------------------------------ */
|
|
14
|
+
/* Constants */
|
|
15
|
+
/* ------------------------------------------------------------------ */
|
|
16
|
+
/** Default extensions root: ~/.jait/extensions/ */
|
|
17
|
+
export function defaultExtensionsDir() {
|
|
18
|
+
return join(homedir(), ".jait", "extensions");
|
|
19
|
+
}
|
|
20
|
+
export class PluginManager {
|
|
21
|
+
sqlite;
|
|
22
|
+
toolRegistry;
|
|
23
|
+
gatewayVersion;
|
|
24
|
+
workspaceRoot;
|
|
25
|
+
extensionsDir;
|
|
26
|
+
openclawExtensionsDirs;
|
|
27
|
+
/** In-memory map of loaded plugins keyed by id. */
|
|
28
|
+
loaded = new Map();
|
|
29
|
+
/** OpenClaw plugin modules keyed by jait id (openclaw:<id>). */
|
|
30
|
+
openclawModules = new Map();
|
|
31
|
+
constructor(deps) {
|
|
32
|
+
this.sqlite = deps.sqlite;
|
|
33
|
+
this.toolRegistry = deps.toolRegistry;
|
|
34
|
+
this.gatewayVersion = deps.gatewayVersion;
|
|
35
|
+
this.workspaceRoot = deps.workspaceRoot;
|
|
36
|
+
this.extensionsDir = deps.extensionsDir ?? defaultExtensionsDir();
|
|
37
|
+
this.openclawExtensionsDirs = deps.openclawExtensionsDirs ?? [];
|
|
38
|
+
}
|
|
39
|
+
/* ---------------------------------------------------------------- */
|
|
40
|
+
/* DB helpers */
|
|
41
|
+
/* ---------------------------------------------------------------- */
|
|
42
|
+
getInstalled(id) {
|
|
43
|
+
const row = this.sqlite
|
|
44
|
+
.prepare("SELECT * FROM plugins WHERE id = ?")
|
|
45
|
+
.get(id);
|
|
46
|
+
return row ? rowToInstalled(row) : null;
|
|
47
|
+
}
|
|
48
|
+
upsertInstalled(p) {
|
|
49
|
+
this.sqlite
|
|
50
|
+
.prepare(`INSERT INTO plugins (id, display_name, version, description, author, path, status, config, error, installed_at, updated_at)
|
|
51
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
52
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
53
|
+
display_name = excluded.display_name,
|
|
54
|
+
version = excluded.version,
|
|
55
|
+
description = excluded.description,
|
|
56
|
+
author = excluded.author,
|
|
57
|
+
path = excluded.path,
|
|
58
|
+
status = excluded.status,
|
|
59
|
+
config = excluded.config,
|
|
60
|
+
error = excluded.error,
|
|
61
|
+
updated_at = excluded.updated_at`)
|
|
62
|
+
.run(p.id, p.displayName, p.version, p.description ?? null, p.author ?? null, p.path, p.status, JSON.stringify(p.config), p.error ?? null, p.installedAt, p.updatedAt);
|
|
63
|
+
}
|
|
64
|
+
deleteInstalled(id) {
|
|
65
|
+
this.sqlite.prepare("DELETE FROM plugins WHERE id = ?").run(id);
|
|
66
|
+
}
|
|
67
|
+
/* ---------------------------------------------------------------- */
|
|
68
|
+
/* Discovery — scan extensions directory for manifests */
|
|
69
|
+
/* ---------------------------------------------------------------- */
|
|
70
|
+
async discover() {
|
|
71
|
+
const manifests = [];
|
|
72
|
+
let entries;
|
|
73
|
+
try {
|
|
74
|
+
entries = await readdir(this.extensionsDir);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Directory doesn't exist yet — that's fine
|
|
78
|
+
return manifests;
|
|
79
|
+
}
|
|
80
|
+
for (const entry of entries) {
|
|
81
|
+
const dir = join(this.extensionsDir, entry);
|
|
82
|
+
const dirStat = await stat(dir).catch(() => null);
|
|
83
|
+
if (!dirStat?.isDirectory())
|
|
84
|
+
continue;
|
|
85
|
+
const manifestPath = join(dir, "jait.plugin.json");
|
|
86
|
+
try {
|
|
87
|
+
const raw = JSON.parse(await readFile(manifestPath, "utf-8"));
|
|
88
|
+
const err = validateManifest(raw);
|
|
89
|
+
if (err) {
|
|
90
|
+
console.warn(`Plugin manifest invalid at ${manifestPath}: ${err}`);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
// Attach the resolved directory path for later import
|
|
94
|
+
raw._path = dir;
|
|
95
|
+
manifests.push(raw);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// No manifest or invalid JSON — skip
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return manifests;
|
|
102
|
+
}
|
|
103
|
+
/* ---------------------------------------------------------------- */
|
|
104
|
+
/* Sync — reconcile discovered manifests with DB state */
|
|
105
|
+
/* ---------------------------------------------------------------- */
|
|
106
|
+
/**
|
|
107
|
+
* Discover all plugins, sync them with DB, and load enabled ones.
|
|
108
|
+
* Called once at gateway startup.
|
|
109
|
+
*/
|
|
110
|
+
async syncAndLoad() {
|
|
111
|
+
const manifests = await this.discover();
|
|
112
|
+
const now = new Date().toISOString();
|
|
113
|
+
for (const manifest of manifests) {
|
|
114
|
+
const dir = manifest._path;
|
|
115
|
+
let existing = this.getInstalled(manifest.id);
|
|
116
|
+
if (!existing) {
|
|
117
|
+
// New plugin discovered — install as disabled by default
|
|
118
|
+
existing = {
|
|
119
|
+
id: manifest.id,
|
|
120
|
+
displayName: manifest.displayName,
|
|
121
|
+
version: manifest.version,
|
|
122
|
+
description: manifest.description,
|
|
123
|
+
author: manifest.author,
|
|
124
|
+
path: dir,
|
|
125
|
+
status: "installed",
|
|
126
|
+
config: {},
|
|
127
|
+
installedAt: now,
|
|
128
|
+
updatedAt: now,
|
|
129
|
+
};
|
|
130
|
+
this.upsertInstalled(existing);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
// Update metadata if version/path changed
|
|
134
|
+
if (existing.version !== manifest.version || existing.path !== dir) {
|
|
135
|
+
existing.version = manifest.version;
|
|
136
|
+
existing.displayName = manifest.displayName;
|
|
137
|
+
existing.description = manifest.description;
|
|
138
|
+
existing.author = manifest.author;
|
|
139
|
+
existing.path = dir;
|
|
140
|
+
existing.updatedAt = now;
|
|
141
|
+
this.upsertInstalled(existing);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Load if enabled
|
|
145
|
+
if (existing.status === "enabled") {
|
|
146
|
+
await this.loadPlugin(manifest, existing);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// ── OpenClaw compatibility: discover openclaw.plugin.json ──────
|
|
150
|
+
// Scan both the Jait extensions dir and any explicit OpenClaw dirs
|
|
151
|
+
const openclawScanDirs = [this.extensionsDir, ...this.openclawExtensionsDirs];
|
|
152
|
+
let openclawCount = 0;
|
|
153
|
+
for (const scanDir of openclawScanDirs) {
|
|
154
|
+
const ocPlugins = await discoverOpenClawPlugins(scanDir);
|
|
155
|
+
for (const { manifest: ocManifest, dir } of ocPlugins) {
|
|
156
|
+
const jaitId = `openclaw:${ocManifest.id}`;
|
|
157
|
+
// Skip if a native Jait plugin with the same base id already exists
|
|
158
|
+
if (manifests.some((m) => m.id === ocManifest.id))
|
|
159
|
+
continue;
|
|
160
|
+
const jaitManifest = openclawToJaitManifest(ocManifest, dir);
|
|
161
|
+
let existing = this.getInstalled(jaitId);
|
|
162
|
+
if (!existing) {
|
|
163
|
+
existing = {
|
|
164
|
+
id: jaitId,
|
|
165
|
+
displayName: jaitManifest.displayName,
|
|
166
|
+
version: jaitManifest.version ?? "0.0.0",
|
|
167
|
+
description: jaitManifest.description,
|
|
168
|
+
author: "OpenClaw",
|
|
169
|
+
path: dir,
|
|
170
|
+
status: "installed",
|
|
171
|
+
config: {},
|
|
172
|
+
installedAt: now,
|
|
173
|
+
updatedAt: now,
|
|
174
|
+
};
|
|
175
|
+
this.upsertInstalled(existing);
|
|
176
|
+
}
|
|
177
|
+
else if (existing.path !== dir) {
|
|
178
|
+
existing.path = dir;
|
|
179
|
+
existing.updatedAt = now;
|
|
180
|
+
this.upsertInstalled(existing);
|
|
181
|
+
}
|
|
182
|
+
// Store the module factory for later loading
|
|
183
|
+
const pluginModule = createOpenClawPluginModule(ocManifest, dir);
|
|
184
|
+
this.openclawModules.set(jaitId, pluginModule);
|
|
185
|
+
if (existing.status === "enabled") {
|
|
186
|
+
await this.loadPluginWithModule(jaitManifest, existing, pluginModule);
|
|
187
|
+
}
|
|
188
|
+
openclawCount++;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
console.log(`Plugins: ${manifests.length} native + ${openclawCount} OpenClaw discovered, ${this.loaded.size} loaded`);
|
|
192
|
+
}
|
|
193
|
+
/* ---------------------------------------------------------------- */
|
|
194
|
+
/* Load / unload a single plugin */
|
|
195
|
+
/* ---------------------------------------------------------------- */
|
|
196
|
+
buildContext(installed) {
|
|
197
|
+
const self = this;
|
|
198
|
+
return {
|
|
199
|
+
gatewayVersion: this.gatewayVersion,
|
|
200
|
+
workspaceRoot: this.workspaceRoot,
|
|
201
|
+
getConfig() {
|
|
202
|
+
// Re-read from DB to get latest
|
|
203
|
+
const current = self.getInstalled(installed.id);
|
|
204
|
+
return (current?.config ?? {});
|
|
205
|
+
},
|
|
206
|
+
async setConfig(value) {
|
|
207
|
+
const current = self.getInstalled(installed.id);
|
|
208
|
+
if (current) {
|
|
209
|
+
current.config = value;
|
|
210
|
+
current.updatedAt = new Date().toISOString();
|
|
211
|
+
self.upsertInstalled(current);
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
log: {
|
|
215
|
+
info: (msg, ...args) => console.log(`[plugin:${installed.id}]`, msg, ...args),
|
|
216
|
+
warn: (msg, ...args) => console.warn(`[plugin:${installed.id}]`, msg, ...args),
|
|
217
|
+
error: (msg, ...args) => console.error(`[plugin:${installed.id}]`, msg, ...args),
|
|
218
|
+
},
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
async loadPlugin(manifest, installed) {
|
|
222
|
+
try {
|
|
223
|
+
const entryFile = manifest.main ?? "index.js";
|
|
224
|
+
const entryPath = resolve(installed.path, entryFile);
|
|
225
|
+
const mod = await import(entryPath);
|
|
226
|
+
// Support both default export and named `plugin` export
|
|
227
|
+
const pluginModule = mod.default ?? mod.plugin;
|
|
228
|
+
if (!pluginModule || typeof pluginModule.setup !== "function") {
|
|
229
|
+
throw new Error(`Plugin entry at ${entryPath} must export a PluginModule (use definePlugin())`);
|
|
230
|
+
}
|
|
231
|
+
const ctx = this.buildContext(installed);
|
|
232
|
+
const contribution = (await pluginModule.setup(ctx)) ?? null;
|
|
233
|
+
// Register contributed tools
|
|
234
|
+
if (contribution?.tools?.length) {
|
|
235
|
+
this.toolRegistry.registerPluginTools({ id: manifest.id, displayName: manifest.displayName }, contribution.tools);
|
|
236
|
+
}
|
|
237
|
+
this.loaded.set(manifest.id, {
|
|
238
|
+
manifest,
|
|
239
|
+
installed,
|
|
240
|
+
module: pluginModule,
|
|
241
|
+
contribution,
|
|
242
|
+
});
|
|
243
|
+
// Clear any previous error
|
|
244
|
+
if (installed.error) {
|
|
245
|
+
installed.error = undefined;
|
|
246
|
+
installed.updatedAt = new Date().toISOString();
|
|
247
|
+
this.upsertInstalled(installed);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
252
|
+
console.error(`Failed to load plugin ${manifest.id}:`, message);
|
|
253
|
+
installed.status = "error";
|
|
254
|
+
installed.error = message;
|
|
255
|
+
installed.updatedAt = new Date().toISOString();
|
|
256
|
+
this.upsertInstalled(installed);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/** Load a plugin using a pre-built module (used for OpenClaw adapter). */
|
|
260
|
+
async loadPluginWithModule(manifest, installed, pluginModule) {
|
|
261
|
+
try {
|
|
262
|
+
const ctx = this.buildContext(installed);
|
|
263
|
+
const contribution = (await pluginModule.setup(ctx)) ?? null;
|
|
264
|
+
if (contribution?.tools?.length) {
|
|
265
|
+
this.toolRegistry.registerPluginTools({ id: installed.id, displayName: installed.displayName }, contribution.tools);
|
|
266
|
+
}
|
|
267
|
+
this.loaded.set(installed.id, {
|
|
268
|
+
manifest,
|
|
269
|
+
installed,
|
|
270
|
+
module: pluginModule,
|
|
271
|
+
contribution,
|
|
272
|
+
});
|
|
273
|
+
if (installed.error) {
|
|
274
|
+
installed.error = undefined;
|
|
275
|
+
installed.updatedAt = new Date().toISOString();
|
|
276
|
+
this.upsertInstalled(installed);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
catch (err) {
|
|
280
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
281
|
+
console.error(`Failed to load OpenClaw plugin ${installed.id}:`, message);
|
|
282
|
+
installed.status = "error";
|
|
283
|
+
installed.error = message;
|
|
284
|
+
installed.updatedAt = new Date().toISOString();
|
|
285
|
+
this.upsertInstalled(installed);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
async unloadPlugin(id) {
|
|
289
|
+
const loaded = this.loaded.get(id);
|
|
290
|
+
if (!loaded)
|
|
291
|
+
return;
|
|
292
|
+
try {
|
|
293
|
+
await loaded.module?.dispose();
|
|
294
|
+
}
|
|
295
|
+
catch (err) {
|
|
296
|
+
console.error(`Error disposing plugin ${id}:`, err);
|
|
297
|
+
}
|
|
298
|
+
this.loaded.delete(id);
|
|
299
|
+
}
|
|
300
|
+
/* ---------------------------------------------------------------- */
|
|
301
|
+
/* Public API — used by REST routes */
|
|
302
|
+
/* ---------------------------------------------------------------- */
|
|
303
|
+
/** List all installed plugins (from DB). */
|
|
304
|
+
listInstalled() {
|
|
305
|
+
const rows = this.sqlite
|
|
306
|
+
.prepare("SELECT * FROM plugins ORDER BY display_name")
|
|
307
|
+
.all();
|
|
308
|
+
return rows.map(rowToInstalled);
|
|
309
|
+
}
|
|
310
|
+
/** Get a single installed plugin. */
|
|
311
|
+
getPlugin(id) {
|
|
312
|
+
return this.getInstalled(id);
|
|
313
|
+
}
|
|
314
|
+
/** Enable a plugin and load it. */
|
|
315
|
+
async enable(id) {
|
|
316
|
+
const installed = this.getInstalled(id);
|
|
317
|
+
if (!installed)
|
|
318
|
+
throw new Error(`Plugin '${id}' not found`);
|
|
319
|
+
installed.status = "enabled";
|
|
320
|
+
installed.error = undefined;
|
|
321
|
+
installed.updatedAt = new Date().toISOString();
|
|
322
|
+
this.upsertInstalled(installed);
|
|
323
|
+
// Re-discover manifest so we can load it
|
|
324
|
+
const manifests = await this.discover();
|
|
325
|
+
const manifest = manifests.find((m) => m.id === id);
|
|
326
|
+
if (manifest) {
|
|
327
|
+
await this.loadPlugin(manifest, installed);
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
// Check for OpenClaw adapter module
|
|
331
|
+
const ocModule = this.openclawModules.get(id);
|
|
332
|
+
if (ocModule) {
|
|
333
|
+
const jaitManifest = openclawToJaitManifest({ id: id.replace(/^openclaw:/, ""), name: installed.displayName, version: installed.version, description: installed.description }, installed.path);
|
|
334
|
+
await this.loadPluginWithModule(jaitManifest, installed, ocModule);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return this.getInstalled(id) ?? installed;
|
|
338
|
+
}
|
|
339
|
+
/** Disable a plugin and unload it. */
|
|
340
|
+
async disable(id) {
|
|
341
|
+
const installed = this.getInstalled(id);
|
|
342
|
+
if (!installed)
|
|
343
|
+
throw new Error(`Plugin '${id}' not found`);
|
|
344
|
+
await this.unloadPlugin(id);
|
|
345
|
+
installed.status = "disabled";
|
|
346
|
+
installed.error = undefined;
|
|
347
|
+
installed.updatedAt = new Date().toISOString();
|
|
348
|
+
this.upsertInstalled(installed);
|
|
349
|
+
return installed;
|
|
350
|
+
}
|
|
351
|
+
/** Uninstall a plugin (unload + remove from DB). Does NOT delete files. */
|
|
352
|
+
async uninstall(id) {
|
|
353
|
+
await this.unloadPlugin(id);
|
|
354
|
+
this.deleteInstalled(id);
|
|
355
|
+
}
|
|
356
|
+
/** Get / set plugin config. */
|
|
357
|
+
getPluginConfig(id) {
|
|
358
|
+
return this.getInstalled(id)?.config ?? {};
|
|
359
|
+
}
|
|
360
|
+
async setPluginConfig(id, config) {
|
|
361
|
+
const installed = this.getInstalled(id);
|
|
362
|
+
if (!installed)
|
|
363
|
+
throw new Error(`Plugin '${id}' not found`);
|
|
364
|
+
installed.config = config;
|
|
365
|
+
installed.updatedAt = new Date().toISOString();
|
|
366
|
+
this.upsertInstalled(installed);
|
|
367
|
+
}
|
|
368
|
+
/** Gracefully dispose of all loaded plugins. */
|
|
369
|
+
async disposeAll() {
|
|
370
|
+
for (const [id] of this.loaded) {
|
|
371
|
+
await this.unloadPlugin(id);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
/* ------------------------------------------------------------------ */
|
|
376
|
+
/* Row conversion */
|
|
377
|
+
/* ------------------------------------------------------------------ */
|
|
378
|
+
function rowToInstalled(row) {
|
|
379
|
+
return {
|
|
380
|
+
id: row.id,
|
|
381
|
+
displayName: row.display_name,
|
|
382
|
+
version: row.version,
|
|
383
|
+
description: row.description ?? undefined,
|
|
384
|
+
author: row.author ?? undefined,
|
|
385
|
+
path: row.path,
|
|
386
|
+
status: row.status,
|
|
387
|
+
config: JSON.parse(row.config || "{}"),
|
|
388
|
+
error: row.error ?? undefined,
|
|
389
|
+
installedAt: row.installed_at,
|
|
390
|
+
updatedAt: row.updated_at,
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/plugins/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin manifest schema — mirrors `jait.plugin.json`.
|
|
3
|
+
*
|
|
4
|
+
* Every extension must ship a manifest at the root of its package.
|
|
5
|
+
* The loader resolves the manifest first and only imports the entry
|
|
6
|
+
* module when the plugin is enabled.
|
|
7
|
+
*/
|
|
8
|
+
import type { ToolParametersSchema } from "../tools/contracts.js";
|
|
9
|
+
/** Activation event that triggers lazy plugin load. */
|
|
10
|
+
export type PluginActivationEvent = "*" | `onTool:${string}` | `onProvider:${string}` | `onCommand:${string}`;
|
|
11
|
+
/** Manifest tool declaration (what goes in the JSON file). */
|
|
12
|
+
export interface ManifestToolDeclaration {
|
|
13
|
+
name: string;
|
|
14
|
+
description: string;
|
|
15
|
+
parameters?: ToolParametersSchema;
|
|
16
|
+
tier?: "core" | "standard" | "external";
|
|
17
|
+
category?: string;
|
|
18
|
+
risk?: "low" | "medium" | "high";
|
|
19
|
+
consent?: "none" | "once" | "always" | "dangerous";
|
|
20
|
+
}
|
|
21
|
+
/** Manifest provider declaration. */
|
|
22
|
+
export interface ManifestProviderDeclaration {
|
|
23
|
+
id: string;
|
|
24
|
+
displayName: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
}
|
|
27
|
+
/** The jait.plugin.json file schema. */
|
|
28
|
+
export interface PluginManifest {
|
|
29
|
+
/** Unique plugin identifier (npm-style scope ok: `@org/name`). */
|
|
30
|
+
id: string;
|
|
31
|
+
/** Human-readable display name. */
|
|
32
|
+
displayName: string;
|
|
33
|
+
/** Semver version string. */
|
|
34
|
+
version: string;
|
|
35
|
+
/** Short description shown in the extension store. */
|
|
36
|
+
description?: string;
|
|
37
|
+
/** Author name or org. */
|
|
38
|
+
author?: string;
|
|
39
|
+
/** SPDX license id. */
|
|
40
|
+
license?: string;
|
|
41
|
+
/** Relative path to the ES module entry (default: `index.js`). */
|
|
42
|
+
main?: string;
|
|
43
|
+
/** Minimum gateway version required (semver range). */
|
|
44
|
+
engines?: {
|
|
45
|
+
gateway?: string;
|
|
46
|
+
};
|
|
47
|
+
/** Activation events — when should this plugin be loaded? */
|
|
48
|
+
activationEvents?: PluginActivationEvent[];
|
|
49
|
+
/** Tools declared by this plugin (statically listed in manifest). */
|
|
50
|
+
contributes?: {
|
|
51
|
+
tools?: ManifestToolDeclaration[];
|
|
52
|
+
providers?: ManifestProviderDeclaration[];
|
|
53
|
+
};
|
|
54
|
+
/** JSON-schema for user-facing configuration. */
|
|
55
|
+
configSchema?: ToolParametersSchema;
|
|
56
|
+
/** Categories for the extension store. */
|
|
57
|
+
categories?: string[];
|
|
58
|
+
/** Keywords for search. */
|
|
59
|
+
keywords?: string[];
|
|
60
|
+
/** URL to a square icon (relative path or https). */
|
|
61
|
+
icon?: string;
|
|
62
|
+
/** Homepage / docs URL. */
|
|
63
|
+
homepage?: string;
|
|
64
|
+
/** Repository URL. */
|
|
65
|
+
repository?: string;
|
|
66
|
+
}
|
|
67
|
+
/** Minimal validation — returns error string or null. */
|
|
68
|
+
export declare function validateManifest(raw: unknown): string | null;
|
|
69
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/plugins/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAMlE,uDAAuD;AACvD,MAAM,MAAM,qBAAqB,GAC7B,GAAG,GACH,UAAU,MAAM,EAAE,GAClB,cAAc,MAAM,EAAE,GACtB,aAAa,MAAM,EAAE,CAAC;AAE1B,8DAA8D;AAC9D,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC;CACpD;AAED,qCAAqC;AACrC,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wCAAwC;AACxC,MAAM,WAAW,cAAc;IAC7B,kEAAkE;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAC3C,qEAAqE;IACrE,WAAW,CAAC,EAAE;QACZ,KAAK,CAAC,EAAE,uBAAuB,EAAE,CAAC;QAClC,SAAS,CAAC,EAAE,2BAA2B,EAAE,CAAC;KAC3C,CAAC;IACF,iDAAiD;IACjD,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sBAAsB;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAMD,yDAAyD;AACzD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAW5D"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin manifest schema — mirrors `jait.plugin.json`.
|
|
3
|
+
*
|
|
4
|
+
* Every extension must ship a manifest at the root of its package.
|
|
5
|
+
* The loader resolves the manifest first and only imports the entry
|
|
6
|
+
* module when the plugin is enabled.
|
|
7
|
+
*/
|
|
8
|
+
/* ------------------------------------------------------------------ */
|
|
9
|
+
/* Validation */
|
|
10
|
+
/* ------------------------------------------------------------------ */
|
|
11
|
+
/** Minimal validation — returns error string or null. */
|
|
12
|
+
export function validateManifest(raw) {
|
|
13
|
+
if (!raw || typeof raw !== "object")
|
|
14
|
+
return "Manifest must be a JSON object";
|
|
15
|
+
const m = raw;
|
|
16
|
+
if (typeof m.id !== "string" || !m.id)
|
|
17
|
+
return "Manifest must have a non-empty 'id'";
|
|
18
|
+
if (typeof m.displayName !== "string" || !m.displayName)
|
|
19
|
+
return "Manifest must have a non-empty 'displayName'";
|
|
20
|
+
if (typeof m.version !== "string" || !m.version)
|
|
21
|
+
return "Manifest must have a non-empty 'version'";
|
|
22
|
+
// id format: lowercase alphanumeric, hyphens, dots, and scoped (@org/name)
|
|
23
|
+
if (!/^(@[\w-]+\/)?[\w][\w.-]*$/.test(m.id)) {
|
|
24
|
+
return `Invalid plugin id '${m.id}' — use alphanumeric, hyphens, dots, and optional @scope/`;
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/plugins/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAwEH,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE,yDAAyD;AACzD,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,gCAAgC,CAAC;IAC7E,MAAM,CAAC,GAAG,GAA8B,CAAC;IACzC,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE;QAAE,OAAO,qCAAqC,CAAC;IACpF,IAAI,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,WAAW;QAAE,OAAO,8CAA8C,CAAC;IAC/G,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,OAAO;QAAE,OAAO,0CAA0C,CAAC;IACnG,2EAA2E;IAC3E,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5C,OAAO,sBAAsB,CAAC,CAAC,EAAE,2DAA2D,CAAC;IAC/F,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw compatibility adapter.
|
|
3
|
+
*
|
|
4
|
+
* Loads OpenClaw-format plugins (openclaw.plugin.json + index.ts using
|
|
5
|
+
* definePluginEntry) and bridges them into Jait's plugin system.
|
|
6
|
+
*
|
|
7
|
+
* Supported:
|
|
8
|
+
* - Tool registration (registerTool) → Jait ToolDefinition
|
|
9
|
+
* - Plugin config passthrough
|
|
10
|
+
* - Scoped logging
|
|
11
|
+
*
|
|
12
|
+
* Unsupported registrations (channels, speech providers, CLI backends, etc.)
|
|
13
|
+
* are silently captured so the plugin doesn't throw, but they are not wired
|
|
14
|
+
* into Jait's runtime. They are logged at debug level.
|
|
15
|
+
*/
|
|
16
|
+
import type { PluginManifest as JaitManifest } from "./manifest.js";
|
|
17
|
+
import type { PluginModule } from "./contracts.js";
|
|
18
|
+
interface OpenClawManifest {
|
|
19
|
+
id: string;
|
|
20
|
+
name?: string;
|
|
21
|
+
description?: string;
|
|
22
|
+
version?: string;
|
|
23
|
+
configSchema?: Record<string, unknown>;
|
|
24
|
+
contracts?: {
|
|
25
|
+
tools?: string[];
|
|
26
|
+
webFetchProviders?: string[];
|
|
27
|
+
webSearchProviders?: string[];
|
|
28
|
+
[key: string]: unknown;
|
|
29
|
+
};
|
|
30
|
+
providers?: string[];
|
|
31
|
+
channels?: string[];
|
|
32
|
+
uiHints?: Record<string, unknown>;
|
|
33
|
+
enabledByDefault?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export declare function discoverOpenClawPlugins(extensionsDir: string): Promise<{
|
|
36
|
+
manifest: OpenClawManifest;
|
|
37
|
+
dir: string;
|
|
38
|
+
}[]>;
|
|
39
|
+
export declare function openclawToJaitManifest(oc: OpenClawManifest, _dir: string): JaitManifest;
|
|
40
|
+
export declare function createOpenClawPluginModule(manifest: OpenClawManifest, dir: string): PluginModule;
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=openclaw-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-adapter.d.ts","sourceRoot":"","sources":["../../src/plugins/openclaw-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,cAAc,IAAI,YAAY,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAA4D,MAAM,gBAAgB,CAAC;AAO7G,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE;QACV,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC7B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAkID,wBAAsB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,gBAAgB,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAwB3H;AAMD,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAcvF;AAMD,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,gBAAgB,EAC1B,GAAG,EAAE,MAAM,GACV,YAAY,CA8Ed"}
|