agent-switchboard 0.1.26 → 0.1.28
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/README.md +37 -11
- package/dist/commands/distribution.js +2 -2
- package/dist/commands/distribution.js.map +1 -1
- package/dist/commands/library.d.ts +1 -1
- package/dist/commands/library.js +5 -6
- package/dist/commands/library.js.map +1 -1
- package/dist/config/application-config.d.ts +37 -0
- package/dist/config/application-config.js +83 -0
- package/dist/config/application-config.js.map +1 -0
- package/dist/config/layered-config.js +43 -2
- package/dist/config/layered-config.js.map +1 -1
- package/dist/config/paths.d.ts +13 -2
- package/dist/config/paths.js +21 -3
- package/dist/config/paths.js.map +1 -1
- package/dist/config/schemas.d.ts +408 -43
- package/dist/config/schemas.js +32 -22
- package/dist/config/schemas.js.map +1 -1
- package/dist/config/switchboard-config.d.ts +3 -6
- package/dist/config/switchboard-config.js +3 -6
- package/dist/config/switchboard-config.js.map +1 -1
- package/dist/hooks/distribution.d.ts +27 -0
- package/dist/hooks/distribution.js +235 -0
- package/dist/hooks/distribution.js.map +1 -0
- package/dist/hooks/library.d.ts +40 -0
- package/dist/hooks/library.js +143 -0
- package/dist/hooks/library.js.map +1 -0
- package/dist/hooks/schema.d.ts +542 -0
- package/dist/hooks/schema.js +49 -0
- package/dist/hooks/schema.js.map +1 -0
- package/dist/index.js +708 -168
- package/dist/index.js.map +1 -1
- package/dist/library/fs.d.ts +1 -3
- package/dist/library/fs.js +24 -7
- package/dist/library/fs.js.map +1 -1
- package/dist/library/schema.d.ts +1 -1
- package/dist/library/schema.js +1 -1
- package/dist/library/sources.d.ts +75 -0
- package/dist/library/sources.js +285 -0
- package/dist/library/sources.js.map +1 -0
- package/dist/library/state.d.ts +4 -5
- package/dist/library/state.js +15 -31
- package/dist/library/state.js.map +1 -1
- package/dist/marketplace/plugin-loader.d.ts +30 -0
- package/dist/marketplace/plugin-loader.js +178 -0
- package/dist/marketplace/plugin-loader.js.map +1 -0
- package/dist/marketplace/reader.d.ts +36 -0
- package/dist/marketplace/reader.js +90 -0
- package/dist/marketplace/reader.js.map +1 -0
- package/dist/marketplace/schemas.d.ts +467 -0
- package/dist/marketplace/schemas.js +57 -0
- package/dist/marketplace/schemas.js.map +1 -0
- package/dist/marketplace/source-loader.d.ts +32 -0
- package/dist/marketplace/source-loader.js +45 -0
- package/dist/marketplace/source-loader.js.map +1 -0
- package/dist/rules/agents.d.ts +4 -4
- package/dist/rules/agents.js +10 -4
- package/dist/rules/agents.js.map +1 -1
- package/dist/rules/composer.d.ts +2 -2
- package/dist/rules/composer.js +5 -5
- package/dist/rules/composer.js.map +1 -1
- package/dist/rules/distribution.js +48 -112
- package/dist/rules/distribution.js.map +1 -1
- package/dist/rules/library.d.ts +1 -1
- package/dist/rules/library.js +4 -5
- package/dist/rules/library.js.map +1 -1
- package/dist/skills/distribution.js +6 -6
- package/dist/skills/distribution.js.map +1 -1
- package/dist/skills/library.d.ts +1 -2
- package/dist/skills/library.js +6 -7
- package/dist/skills/library.js.map +1 -1
- package/dist/subagents/distribution.d.ts +1 -1
- package/dist/subagents/distribution.js +319 -20
- package/dist/subagents/distribution.js.map +1 -1
- package/dist/subagents/importer.d.ts +1 -1
- package/dist/subagents/importer.js +61 -1
- package/dist/subagents/importer.js.map +1 -1
- package/dist/subagents/inventory.js +3 -3
- package/dist/subagents/inventory.js.map +1 -1
- package/dist/subagents/library.d.ts +2 -2
- package/dist/subagents/library.js +14 -20
- package/dist/subagents/library.js.map +1 -1
- package/dist/ui/hook-ui.d.ts +8 -0
- package/dist/ui/hook-ui.js +17 -0
- package/dist/ui/hook-ui.js.map +1 -0
- package/dist/ui/library-selector.d.ts +1 -1
- package/dist/ui/subagent-ui.js +3 -3
- package/dist/ui/subagent-ui.js.map +1 -1
- package/dist/util/cli.d.ts +20 -0
- package/dist/util/cli.js +107 -14
- package/dist/util/cli.js.map +1 -1
- package/package.json +3 -2
- package/dist/config/agent-config.d.ts +0 -35
- package/dist/config/agent-config.js +0 -88
- package/dist/config/agent-config.js.map +0 -1
- package/dist/library/subscriptions.d.ts +0 -42
- package/dist/library/subscriptions.js +0 -116
- package/dist/library/subscriptions.js.map +0 -1
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Library source management utilities.
|
|
3
|
+
* Handles adding, removing, and listing external library sources.
|
|
4
|
+
* Supports both local directory paths and remote git repository URLs.
|
|
5
|
+
*/
|
|
6
|
+
import { execFileSync } from 'node:child_process';
|
|
7
|
+
import fs from 'node:fs';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
import { updateConfigLayer } from '../config/layered-config.js';
|
|
10
|
+
import { getSourceCacheDir } from '../config/paths.js';
|
|
11
|
+
import { loadSwitchboardConfig } from '../config/switchboard-config.js';
|
|
12
|
+
// ── Git utilities ──────────────────────────────────────────────────
|
|
13
|
+
function runGit(args, options) {
|
|
14
|
+
try {
|
|
15
|
+
return execFileSync('git', args, {
|
|
16
|
+
...options,
|
|
17
|
+
stdio: 'pipe',
|
|
18
|
+
encoding: 'utf-8',
|
|
19
|
+
timeout: 120_000,
|
|
20
|
+
}).trim();
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
const execError = error;
|
|
24
|
+
const stderr = typeof execError.stderr === 'string'
|
|
25
|
+
? execError.stderr.trim()
|
|
26
|
+
: (execError.stderr?.toString().trim() ?? '');
|
|
27
|
+
throw new Error(`git ${args[0]} failed: ${stderr || (error instanceof Error ? error.message : String(error))}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function ensureGitAvailable() {
|
|
31
|
+
try {
|
|
32
|
+
runGit(['--version']);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
throw new Error('git is not available. Install git to use remote sources.');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function gitClone(url, targetDir, ref) {
|
|
39
|
+
if (fs.existsSync(targetDir)) {
|
|
40
|
+
fs.rmSync(targetDir, { recursive: true, force: true });
|
|
41
|
+
}
|
|
42
|
+
fs.mkdirSync(path.dirname(targetDir), { recursive: true });
|
|
43
|
+
const args = ['clone', '--depth', '1'];
|
|
44
|
+
if (ref)
|
|
45
|
+
args.push('--branch', ref);
|
|
46
|
+
args.push(url, targetDir);
|
|
47
|
+
runGit(args);
|
|
48
|
+
}
|
|
49
|
+
function gitPull(repoDir) {
|
|
50
|
+
runGit(['pull'], { cwd: repoDir });
|
|
51
|
+
}
|
|
52
|
+
// ── URL detection and parsing ──────────────────────────────────────
|
|
53
|
+
export function isGitUrl(source) {
|
|
54
|
+
return /^(https?:\/\/|git@|ssh:\/\/|git:\/\/)/.test(source);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Parse a GitHub URL into clone URL + optional ref and subdir.
|
|
58
|
+
* Supported:
|
|
59
|
+
* https://github.com/org/repo
|
|
60
|
+
* https://github.com/org/repo/tree/branch
|
|
61
|
+
* https://github.com/org/repo/tree/branch/sub/dir
|
|
62
|
+
* Non-GitHub git URLs pass through unchanged.
|
|
63
|
+
*/
|
|
64
|
+
export function parseGitUrl(input) {
|
|
65
|
+
const treeMatch = input.match(/^(https:\/\/github\.com\/[^/]+\/[^/]+?)(?:\.git)?\/tree\/([^/]+)(?:\/(.+))?$/);
|
|
66
|
+
if (treeMatch) {
|
|
67
|
+
const result = {
|
|
68
|
+
url: `${treeMatch[1]}.git`,
|
|
69
|
+
ref: treeMatch[2],
|
|
70
|
+
};
|
|
71
|
+
if (treeMatch[3])
|
|
72
|
+
result.subdir = treeMatch[3];
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
const ghRepo = input.match(/^(https:\/\/github\.com\/[^/]+\/[^/]+?)(?:\.git)?\/?$/);
|
|
76
|
+
if (ghRepo) {
|
|
77
|
+
return { url: `${ghRepo[1]}.git` };
|
|
78
|
+
}
|
|
79
|
+
return { url: input };
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Infer a namespace from a git URL or local path.
|
|
83
|
+
* Examples:
|
|
84
|
+
* https://github.com/org/my-repo.git → "my-repo"
|
|
85
|
+
* https://github.com/org/repo/tree/main/sub → "repo"
|
|
86
|
+
* git@github.com:org/repo.git → "repo"
|
|
87
|
+
* /path/to/team-library → "team-library"
|
|
88
|
+
*/
|
|
89
|
+
export function inferSourceName(location) {
|
|
90
|
+
if (isGitUrl(location)) {
|
|
91
|
+
const { url } = parseGitUrl(location);
|
|
92
|
+
const httpsMatch = url.match(/\/([^/]+?)(?:\.git)?$/);
|
|
93
|
+
if (httpsMatch)
|
|
94
|
+
return httpsMatch[1];
|
|
95
|
+
const sshMatch = url.match(/:([^/]+?)(?:\.git)?$/);
|
|
96
|
+
if (sshMatch)
|
|
97
|
+
return sshMatch[1];
|
|
98
|
+
}
|
|
99
|
+
return path.basename(path.resolve(location));
|
|
100
|
+
}
|
|
101
|
+
// ── Config access helpers ──────────────────────────────────────────
|
|
102
|
+
function getRawSources() {
|
|
103
|
+
const config = loadSwitchboardConfig();
|
|
104
|
+
return config.library.sources;
|
|
105
|
+
}
|
|
106
|
+
function resolveEffectivePath(namespace, value) {
|
|
107
|
+
if (typeof value === 'string')
|
|
108
|
+
return value;
|
|
109
|
+
let effectivePath = getSourceCacheDir(namespace);
|
|
110
|
+
if (value.subdir)
|
|
111
|
+
effectivePath = path.join(effectivePath, value.subdir);
|
|
112
|
+
return effectivePath;
|
|
113
|
+
}
|
|
114
|
+
// ── Validation helpers ─────────────────────────────────────────────
|
|
115
|
+
function validateNamespace(namespace) {
|
|
116
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(namespace)) {
|
|
117
|
+
throw new Error(`Invalid namespace "${namespace}". Use only letters, numbers, hyphens, and underscores.`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function ensureNamespaceAvailable(namespace) {
|
|
121
|
+
if (hasSource(namespace)) {
|
|
122
|
+
throw new Error(`Source "${namespace}" already exists. Use a different name or remove it first.`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// ── Public API ─────────────────────────────────────────────────────
|
|
126
|
+
export function getSources() {
|
|
127
|
+
const raw = getRawSources();
|
|
128
|
+
return Object.entries(raw).map(([namespace, value]) => {
|
|
129
|
+
const effectivePath = resolveEffectivePath(namespace, value);
|
|
130
|
+
if (typeof value === 'string') {
|
|
131
|
+
return { namespace, path: effectivePath };
|
|
132
|
+
}
|
|
133
|
+
return { namespace, path: effectivePath, remote: value };
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Get sources as namespace -> effective local path.
|
|
138
|
+
* Remote sources are transparently resolved to their cache directory.
|
|
139
|
+
*/
|
|
140
|
+
export function getSourcesRecord() {
|
|
141
|
+
const raw = getRawSources();
|
|
142
|
+
const result = {};
|
|
143
|
+
for (const [namespace, value] of Object.entries(raw)) {
|
|
144
|
+
result[namespace] = resolveEffectivePath(namespace, value);
|
|
145
|
+
}
|
|
146
|
+
return result;
|
|
147
|
+
}
|
|
148
|
+
export function hasSource(namespace) {
|
|
149
|
+
return namespace in getRawSources();
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Add a local directory source.
|
|
153
|
+
*/
|
|
154
|
+
export function addLocalSource(namespace, libraryPath) {
|
|
155
|
+
const resolvedPath = path.resolve(libraryPath);
|
|
156
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
157
|
+
throw new Error(`Path does not exist: ${resolvedPath}`);
|
|
158
|
+
}
|
|
159
|
+
if (!fs.statSync(resolvedPath).isDirectory()) {
|
|
160
|
+
throw new Error(`Path is not a directory: ${resolvedPath}`);
|
|
161
|
+
}
|
|
162
|
+
validateNamespace(namespace);
|
|
163
|
+
ensureNamespaceAvailable(namespace);
|
|
164
|
+
updateConfigLayer((layer) => ({
|
|
165
|
+
...layer,
|
|
166
|
+
library: {
|
|
167
|
+
...layer.library,
|
|
168
|
+
sources: {
|
|
169
|
+
...(layer.library?.sources ?? {}),
|
|
170
|
+
[namespace]: resolvedPath,
|
|
171
|
+
},
|
|
172
|
+
},
|
|
173
|
+
}));
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Add a remote git source. Clones the repo into the local cache.
|
|
177
|
+
*/
|
|
178
|
+
export function addRemoteSource(namespace, remote) {
|
|
179
|
+
validateNamespace(namespace);
|
|
180
|
+
ensureNamespaceAvailable(namespace);
|
|
181
|
+
ensureGitAvailable();
|
|
182
|
+
const cacheDir = getSourceCacheDir(namespace);
|
|
183
|
+
gitClone(remote.url, cacheDir, remote.ref);
|
|
184
|
+
const configValue = { url: remote.url };
|
|
185
|
+
if (remote.ref)
|
|
186
|
+
configValue.ref = remote.ref;
|
|
187
|
+
if (remote.subdir)
|
|
188
|
+
configValue.subdir = remote.subdir;
|
|
189
|
+
updateConfigLayer((layer) => ({
|
|
190
|
+
...layer,
|
|
191
|
+
library: {
|
|
192
|
+
...layer.library,
|
|
193
|
+
sources: {
|
|
194
|
+
...(layer.library?.sources ?? {}),
|
|
195
|
+
[namespace]: configValue,
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
}));
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Remove a source and clean up its cache directory if remote.
|
|
202
|
+
*/
|
|
203
|
+
export function removeSource(namespace) {
|
|
204
|
+
const raw = getRawSources();
|
|
205
|
+
if (!(namespace in raw)) {
|
|
206
|
+
throw new Error(`Source "${namespace}" not found.`);
|
|
207
|
+
}
|
|
208
|
+
const value = raw[namespace];
|
|
209
|
+
updateConfigLayer((layer) => {
|
|
210
|
+
const newSources = { ...(layer.library?.sources ?? {}) };
|
|
211
|
+
delete newSources[namespace];
|
|
212
|
+
return {
|
|
213
|
+
...layer,
|
|
214
|
+
library: {
|
|
215
|
+
...layer.library,
|
|
216
|
+
sources: newSources,
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
});
|
|
220
|
+
if (typeof value !== 'string') {
|
|
221
|
+
const cacheDir = getSourceCacheDir(namespace);
|
|
222
|
+
if (fs.existsSync(cacheDir)) {
|
|
223
|
+
fs.rmSync(cacheDir, { recursive: true, force: true });
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Validate a local path has expected library structure.
|
|
229
|
+
* Recognizes both flat library layout (rules/, commands/, etc.)
|
|
230
|
+
* and Claude Code marketplace layout (.claude-plugin/marketplace.json).
|
|
231
|
+
*/
|
|
232
|
+
export function validateSourcePath(libraryPath) {
|
|
233
|
+
const resolvedPath = path.resolve(libraryPath);
|
|
234
|
+
const marketplaceManifest = path.join(resolvedPath, '.claude-plugin', 'marketplace.json');
|
|
235
|
+
if (fs.existsSync(marketplaceManifest)) {
|
|
236
|
+
return { valid: true, found: ['marketplace'], missing: [], isMarketplace: true };
|
|
237
|
+
}
|
|
238
|
+
const libraryTypes = ['rules', 'commands', 'agents', 'skills', 'hooks'];
|
|
239
|
+
const found = [];
|
|
240
|
+
const missing = [];
|
|
241
|
+
for (const type of libraryTypes) {
|
|
242
|
+
const typePath = path.join(resolvedPath, type);
|
|
243
|
+
if (fs.existsSync(typePath) && fs.statSync(typePath).isDirectory()) {
|
|
244
|
+
found.push(type);
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
missing.push(type);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return { valid: found.length > 0, found, missing, isMarketplace: false };
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Pull latest changes for all remote sources.
|
|
254
|
+
* Re-clones if the cache directory is missing or corrupted.
|
|
255
|
+
*/
|
|
256
|
+
export function updateRemoteSources() {
|
|
257
|
+
const raw = getRawSources();
|
|
258
|
+
const results = [];
|
|
259
|
+
for (const [namespace, value] of Object.entries(raw)) {
|
|
260
|
+
if (typeof value === 'string')
|
|
261
|
+
continue;
|
|
262
|
+
const cacheDir = getSourceCacheDir(namespace);
|
|
263
|
+
const gitDir = path.join(cacheDir, '.git');
|
|
264
|
+
try {
|
|
265
|
+
ensureGitAvailable();
|
|
266
|
+
if (!fs.existsSync(gitDir)) {
|
|
267
|
+
gitClone(value.url, cacheDir, value.ref);
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
gitPull(cacheDir);
|
|
271
|
+
}
|
|
272
|
+
results.push({ namespace, url: value.url, status: 'updated' });
|
|
273
|
+
}
|
|
274
|
+
catch (err) {
|
|
275
|
+
results.push({
|
|
276
|
+
namespace,
|
|
277
|
+
url: value.url,
|
|
278
|
+
status: 'error',
|
|
279
|
+
error: err instanceof Error ? err.message : String(err),
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
return results;
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sources.js","sourceRoot":"","sources":["../../src/library/sources.ts"],"names":[],"mappings":"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"}
|
package/dist/library/state.d.ts
CHANGED
|
@@ -38,7 +38,7 @@ declare const sectionStateSchema: z.ZodObject<{
|
|
|
38
38
|
}, z.ZodTypeAny, "passthrough">>>>;
|
|
39
39
|
}, z.ZodTypeAny, "passthrough">>;
|
|
40
40
|
export type SectionState = z.infer<typeof sectionStateSchema>;
|
|
41
|
-
export type LibrarySection = 'commands' | '
|
|
41
|
+
export type LibrarySection = 'commands' | 'agents' | 'skills' | 'hooks';
|
|
42
42
|
export declare function loadMcpActiveState(scope?: ConfigScope): string[];
|
|
43
43
|
export declare function hasMcpActiveInConfig(scope?: ConfigScope): boolean;
|
|
44
44
|
export declare function saveMcpActiveState(active: string[], scope?: ConfigScope): void;
|
|
@@ -46,9 +46,8 @@ export declare function loadLibraryStateSection(section: LibrarySection, scope?:
|
|
|
46
46
|
export declare function saveLibraryStateSection(section: LibrarySection, state: SectionState, scope?: ConfigScope): void;
|
|
47
47
|
export declare function updateLibraryStateSection(section: LibrarySection, mutator: (current: SectionState) => SectionState, scope?: ConfigScope): SectionState;
|
|
48
48
|
/**
|
|
49
|
-
* Load library state for a specific
|
|
50
|
-
*
|
|
51
|
-
* This merges the global section config with agent-specific add/remove overrides
|
|
49
|
+
* Load library state for a specific application, applying per-application overrides.
|
|
50
|
+
* Merges the global section config with application-specific add/remove overrides.
|
|
52
51
|
*/
|
|
53
|
-
export declare function
|
|
52
|
+
export declare function loadLibraryStateSectionForApplication(section: LibrarySection, appId: string, scope?: ConfigScope): SectionState;
|
|
54
53
|
export {};
|
package/dist/library/state.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
2
|
+
import { resolveApplicationSectionConfig } from '../config/application-config.js';
|
|
3
3
|
import { loadMergedSwitchboardConfig, updateConfigLayer } from '../config/layered-config.js';
|
|
4
4
|
import { scopeToLayerOptions } from '../config/scope.js';
|
|
5
|
-
const
|
|
5
|
+
const appSyncEntrySchema = z
|
|
6
6
|
.object({
|
|
7
7
|
hash: z.string().trim().min(1).optional(),
|
|
8
8
|
updatedAt: z.string().datetime().optional(),
|
|
@@ -11,7 +11,7 @@ const agentSyncEntrySchema = z
|
|
|
11
11
|
const sectionStateSchema = z
|
|
12
12
|
.object({
|
|
13
13
|
active: z.array(z.string().trim().min(1)).default([]),
|
|
14
|
-
agentSync: z.record(z.string(),
|
|
14
|
+
agentSync: z.record(z.string(), appSyncEntrySchema).default({}),
|
|
15
15
|
})
|
|
16
16
|
.passthrough();
|
|
17
17
|
export function loadMcpActiveState(scope) {
|
|
@@ -39,8 +39,9 @@ export function saveMcpActiveState(active, scope) {
|
|
|
39
39
|
}
|
|
40
40
|
const agentSyncCache = {
|
|
41
41
|
commands: {},
|
|
42
|
-
|
|
42
|
+
agents: {},
|
|
43
43
|
skills: {},
|
|
44
|
+
hooks: {},
|
|
44
45
|
};
|
|
45
46
|
function getConfigSectionActive(section, options) {
|
|
46
47
|
const { config } = loadMergedSwitchboardConfig(options);
|
|
@@ -59,27 +60,11 @@ export function saveLibraryStateSection(section, state, scope) {
|
|
|
59
60
|
const validated = sectionStateSchema.parse(state);
|
|
60
61
|
updateConfigLayer((layer) => {
|
|
61
62
|
const next = { ...layer };
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
else if (section === 'subagents') {
|
|
70
|
-
const currentSubagents = (next.subagents ?? {});
|
|
71
|
-
next.subagents = {
|
|
72
|
-
...currentSubagents,
|
|
73
|
-
active: [...validated.active],
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
const currentSkills = (next.skills ?? {});
|
|
78
|
-
next.skills = {
|
|
79
|
-
...currentSkills,
|
|
80
|
-
active: [...validated.active],
|
|
81
|
-
};
|
|
82
|
-
}
|
|
63
|
+
const current = (next[section] ?? {});
|
|
64
|
+
next[section] = {
|
|
65
|
+
...current,
|
|
66
|
+
active: [...validated.active],
|
|
67
|
+
};
|
|
83
68
|
return next;
|
|
84
69
|
}, layerOptions);
|
|
85
70
|
agentSyncCache[section] = { ...validated.agentSync };
|
|
@@ -91,14 +76,13 @@ export function updateLibraryStateSection(section, mutator, scope) {
|
|
|
91
76
|
return loadLibraryStateSection(section, scope);
|
|
92
77
|
}
|
|
93
78
|
/**
|
|
94
|
-
* Load library state for a specific
|
|
95
|
-
*
|
|
96
|
-
* This merges the global section config with agent-specific add/remove overrides
|
|
79
|
+
* Load library state for a specific application, applying per-application overrides.
|
|
80
|
+
* Merges the global section config with application-specific add/remove overrides.
|
|
97
81
|
*/
|
|
98
|
-
export function
|
|
99
|
-
const
|
|
82
|
+
export function loadLibraryStateSectionForApplication(section, appId, scope) {
|
|
83
|
+
const appConfig = resolveApplicationSectionConfig(section, appId, scope);
|
|
100
84
|
return {
|
|
101
|
-
active:
|
|
85
|
+
active: appConfig.active,
|
|
102
86
|
agentSync: { ...agentSyncCache[section] },
|
|
103
87
|
};
|
|
104
88
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/library/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/library/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin component loader: extracts commands, agents, skills, and hooks from a
|
|
3
|
+
* resolved plugin directory and maps them to ASB library entry formats.
|
|
4
|
+
*/
|
|
5
|
+
import type { CommandEntry } from '../commands/library.js';
|
|
6
|
+
import type { HookEntry } from '../hooks/library.js';
|
|
7
|
+
import type { SkillFrontmatter } from '../skills/schema.js';
|
|
8
|
+
import type { SubagentEntry } from '../subagents/library.js';
|
|
9
|
+
import type { ResolvedPlugin } from './reader.js';
|
|
10
|
+
export interface SkillEntryFromPlugin {
|
|
11
|
+
id: string;
|
|
12
|
+
bareId: string;
|
|
13
|
+
namespace: string;
|
|
14
|
+
source: string;
|
|
15
|
+
dirPath: string;
|
|
16
|
+
skillPath: string;
|
|
17
|
+
metadata: SkillFrontmatter;
|
|
18
|
+
content: string;
|
|
19
|
+
}
|
|
20
|
+
export interface PluginComponents {
|
|
21
|
+
commands: CommandEntry[];
|
|
22
|
+
agents: SubagentEntry[];
|
|
23
|
+
skills: SkillEntryFromPlugin[];
|
|
24
|
+
hooks: HookEntry[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Load all components (commands, agents, skills) from a single plugin directory.
|
|
28
|
+
* The namespace is the plugin name, producing IDs like "plugin-name:component-id".
|
|
29
|
+
*/
|
|
30
|
+
export declare function loadPluginComponents(plugin: ResolvedPlugin): PluginComponents;
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin component loader: extracts commands, agents, skills, and hooks from a
|
|
3
|
+
* resolved plugin directory and maps them to ASB library entry formats.
|
|
4
|
+
*/
|
|
5
|
+
import fs from 'node:fs';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import { hookFileSchema } from '../hooks/schema.js';
|
|
8
|
+
import { parseLibraryMarkdown } from '../library/parser.js';
|
|
9
|
+
import { parseSkillMarkdown } from '../skills/parser.js';
|
|
10
|
+
const SKILL_FILE = 'SKILL.md';
|
|
11
|
+
function isMarkdownFile(name) {
|
|
12
|
+
const ext = path.extname(name).toLowerCase();
|
|
13
|
+
return ext === '.md' || ext === '.markdown';
|
|
14
|
+
}
|
|
15
|
+
function toId(fileName) {
|
|
16
|
+
return path.basename(fileName, path.extname(fileName));
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Load all components (commands, agents, skills) from a single plugin directory.
|
|
20
|
+
* The namespace is the plugin name, producing IDs like "plugin-name:component-id".
|
|
21
|
+
*/
|
|
22
|
+
export function loadPluginComponents(plugin) {
|
|
23
|
+
const namespace = plugin.name;
|
|
24
|
+
const result = { commands: [], agents: [], skills: [], hooks: [] };
|
|
25
|
+
result.commands = loadMarkdownEntries(path.join(plugin.localPath, 'commands'), namespace, 'command');
|
|
26
|
+
result.agents = loadMarkdownEntries(path.join(plugin.localPath, 'agents'), namespace, 'agent');
|
|
27
|
+
result.skills = loadSkillEntries(plugin.localPath, namespace);
|
|
28
|
+
result.hooks = loadHookEntries(plugin.localPath, namespace);
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Load markdown-based library entries (commands or agents) from a directory.
|
|
33
|
+
*/
|
|
34
|
+
function loadMarkdownEntries(directory, namespace, kind) {
|
|
35
|
+
if (!fs.existsSync(directory) || !fs.statSync(directory).isDirectory()) {
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
const entries = fs.readdirSync(directory, { withFileTypes: true });
|
|
39
|
+
const result = [];
|
|
40
|
+
for (const entry of entries) {
|
|
41
|
+
if (!entry.isFile() || !isMarkdownFile(entry.name))
|
|
42
|
+
continue;
|
|
43
|
+
const absolutePath = path.join(directory, entry.name);
|
|
44
|
+
const rawContent = fs.readFileSync(absolutePath, 'utf-8');
|
|
45
|
+
try {
|
|
46
|
+
const parsed = parseLibraryMarkdown(rawContent);
|
|
47
|
+
const bareId = toId(entry.name);
|
|
48
|
+
const id = `${namespace}:${bareId}`;
|
|
49
|
+
result.push({
|
|
50
|
+
id,
|
|
51
|
+
bareId,
|
|
52
|
+
namespace,
|
|
53
|
+
source: directory,
|
|
54
|
+
filePath: absolutePath,
|
|
55
|
+
metadata: parsed.metadata,
|
|
56
|
+
content: parsed.content,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
61
|
+
throw new Error(`Failed to parse plugin ${kind} "${entry.name}": ${msg}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Load skill entries from a plugin's skills/ directory.
|
|
68
|
+
* Each subdirectory containing SKILL.md is a skill bundle.
|
|
69
|
+
*/
|
|
70
|
+
function loadSkillEntries(pluginDir, namespace) {
|
|
71
|
+
const skillsDir = path.join(pluginDir, 'skills');
|
|
72
|
+
if (!fs.existsSync(skillsDir) || !fs.statSync(skillsDir).isDirectory()) {
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
const result = [];
|
|
76
|
+
const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
|
|
77
|
+
for (const entry of entries) {
|
|
78
|
+
if (!entry.isDirectory())
|
|
79
|
+
continue;
|
|
80
|
+
const skillDir = path.join(skillsDir, entry.name);
|
|
81
|
+
const skillPath = path.join(skillDir, SKILL_FILE);
|
|
82
|
+
if (!fs.existsSync(skillPath))
|
|
83
|
+
continue;
|
|
84
|
+
try {
|
|
85
|
+
const rawContent = fs.readFileSync(skillPath, 'utf-8');
|
|
86
|
+
const parsed = parseSkillMarkdown(rawContent);
|
|
87
|
+
const bareId = entry.name;
|
|
88
|
+
const id = `${namespace}:${bareId}`;
|
|
89
|
+
result.push({
|
|
90
|
+
id,
|
|
91
|
+
bareId,
|
|
92
|
+
namespace,
|
|
93
|
+
source: skillsDir,
|
|
94
|
+
dirPath: skillDir,
|
|
95
|
+
skillPath,
|
|
96
|
+
metadata: parsed.metadata,
|
|
97
|
+
content: parsed.content,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
102
|
+
throw new Error(`Failed to parse plugin skill "${entry.name}": ${msg}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Load hook entries from a plugin's hooks/ directory.
|
|
109
|
+
* Supports both single-file hooks (*.json) and bundle hooks (subdirs with hook.json).
|
|
110
|
+
* Claude Code plugins typically have hooks/hooks.json + script files at the same level.
|
|
111
|
+
*/
|
|
112
|
+
function loadHookEntries(pluginDir, namespace) {
|
|
113
|
+
const hooksDir = path.join(pluginDir, 'hooks');
|
|
114
|
+
if (!fs.existsSync(hooksDir) || !fs.statSync(hooksDir).isDirectory()) {
|
|
115
|
+
return [];
|
|
116
|
+
}
|
|
117
|
+
const result = [];
|
|
118
|
+
const entries = fs.readdirSync(hooksDir, { withFileTypes: true });
|
|
119
|
+
for (const entry of entries) {
|
|
120
|
+
if (entry.isFile() && path.extname(entry.name).toLowerCase() === '.json') {
|
|
121
|
+
const absolutePath = path.join(hooksDir, entry.name);
|
|
122
|
+
const rawContent = fs.readFileSync(absolutePath, 'utf-8');
|
|
123
|
+
try {
|
|
124
|
+
const parsed = hookFileSchema.parse(JSON.parse(rawContent));
|
|
125
|
+
const bareId = path.basename(entry.name, '.json');
|
|
126
|
+
const id = `${namespace}:${bareId}`;
|
|
127
|
+
// Detect if script files exist alongside the JSON (bundle-like plugin layout)
|
|
128
|
+
const hasScripts = entries.some((e) => e.isFile() && !e.name.endsWith('.json'));
|
|
129
|
+
result.push({
|
|
130
|
+
id,
|
|
131
|
+
bareId,
|
|
132
|
+
namespace,
|
|
133
|
+
source: hooksDir,
|
|
134
|
+
filePath: absolutePath,
|
|
135
|
+
name: parsed.name,
|
|
136
|
+
description: parsed.description,
|
|
137
|
+
hooks: parsed.hooks,
|
|
138
|
+
isBundle: hasScripts,
|
|
139
|
+
dirPath: hasScripts ? hooksDir : undefined,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
144
|
+
throw new Error(`Failed to parse plugin hook "${entry.name}": ${msg}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
else if (entry.isDirectory()) {
|
|
148
|
+
const hookJsonPath = path.join(hooksDir, entry.name, 'hook.json');
|
|
149
|
+
if (!fs.existsSync(hookJsonPath))
|
|
150
|
+
continue;
|
|
151
|
+
try {
|
|
152
|
+
const rawContent = fs.readFileSync(hookJsonPath, 'utf-8');
|
|
153
|
+
const parsed = hookFileSchema.parse(JSON.parse(rawContent));
|
|
154
|
+
const bareId = entry.name;
|
|
155
|
+
const id = `${namespace}:${bareId}`;
|
|
156
|
+
const bundleDir = path.join(hooksDir, entry.name);
|
|
157
|
+
result.push({
|
|
158
|
+
id,
|
|
159
|
+
bareId,
|
|
160
|
+
namespace,
|
|
161
|
+
source: hooksDir,
|
|
162
|
+
filePath: hookJsonPath,
|
|
163
|
+
name: parsed.name,
|
|
164
|
+
description: parsed.description,
|
|
165
|
+
hooks: parsed.hooks,
|
|
166
|
+
isBundle: true,
|
|
167
|
+
dirPath: bundleDir,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
172
|
+
throw new Error(`Failed to parse plugin hook bundle "${entry.name}": ${msg}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return result;
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=plugin-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-loader.js","sourceRoot":"","sources":["../../src/marketplace/plugin-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAuBzD,MAAM,UAAU,GAAG,UAAU,CAAC;AAE9B,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7C,OAAO,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,WAAW,CAAC;AAC9C,CAAC;AAED,SAAS,IAAI,CAAC,QAAgB;IAC5B,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAsB;IACzD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC;IAC9B,MAAM,MAAM,GAAqB,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAErF,MAAM,CAAC,QAAQ,GAAG,mBAAmB,CACnC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,EACvC,SAAS,EACT,SAAS,CACV,CAAC;IAEF,MAAM,CAAC,MAAM,GAAG,mBAAmB,CACjC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,EACrC,SAAS,EACT,OAAO,CACR,CAAC;IAEF,MAAM,CAAC,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,CAAC,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAE5D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAC1B,SAAiB,EACjB,SAAiB,EACjB,IAAY;IAEZ,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACvE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,MAAM,MAAM,GAAQ,EAAE,CAAC;IAEvB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QAE7D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAE1D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,EAAE,GAAG,GAAG,SAAS,IAAI,MAAM,EAAE,CAAC;YAEpC,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE;gBACF,MAAM;gBACN,SAAS;gBACT,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,YAAY;gBACtB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,OAAO,EAAE,MAAM,CAAC,OAAO;aACnB,CAAC,CAAC;QACV,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,SAAiB,EAAE,SAAiB;IAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACvE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAEnE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAAE,SAAS;QAEnC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,SAAS;QAExC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC;YAC1B,MAAM,EAAE,GAAG,GAAG,SAAS,IAAI,MAAM,EAAE,CAAC;YAEpC,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE;gBACF,MAAM;gBACN,SAAS;gBACT,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,QAAQ;gBACjB,SAAS;gBACT,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,CAAC,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,SAAiB,EAAE,SAAiB;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACrE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAElE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;YACzE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAE1D,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;gBAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAClD,MAAM,EAAE,GAAG,GAAG,SAAS,IAAI,MAAM,EAAE,CAAC;gBAEpC,8EAA8E;gBAC9E,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;gBAEhF,MAAM,CAAC,IAAI,CAAC;oBACV,EAAE;oBACF,MAAM;oBACN,SAAS;oBACT,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE,YAAY;oBACtB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,QAAQ,EAAE,UAAU;oBACpB,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;iBAC3C,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACnE,MAAM,IAAI,KAAK,CAAC,gCAAgC,KAAK,CAAC,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YAC/B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAClE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;gBAAE,SAAS;YAE3C,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBAC1D,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;gBAC5D,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC;gBAC1B,MAAM,EAAE,GAAG,GAAG,SAAS,IAAI,MAAM,EAAE,CAAC;gBACpC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAElD,MAAM,CAAC,IAAI,CAAC;oBACV,EAAE;oBACF,MAAM;oBACN,SAAS;oBACT,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE,YAAY;oBACtB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,QAAQ,EAAE,IAAI;oBACd,OAAO,EAAE,SAAS;iBACnB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACnE,MAAM,IAAI,KAAK,CAAC,uCAAuC,KAAK,CAAC,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|