@birdie_moblie/plugin-marketplace-cli 1.0.1 → 1.3.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.
Files changed (69) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +103 -6
  3. package/dist/adapters/agent-plugins.d.ts +11 -0
  4. package/dist/adapters/agent-plugins.js +66 -0
  5. package/dist/adapters/agent-plugins.js.map +1 -0
  6. package/dist/adapters/claude.d.ts +32 -1
  7. package/dist/adapters/claude.js +119 -14
  8. package/dist/adapters/claude.js.map +1 -1
  9. package/dist/adapters/codex.d.ts +7 -0
  10. package/dist/adapters/codex.js +10 -14
  11. package/dist/adapters/codex.js.map +1 -1
  12. package/dist/adapters/marketplace-registration.d.ts +17 -0
  13. package/dist/adapters/marketplace-registration.js +367 -0
  14. package/dist/adapters/marketplace-registration.js.map +1 -0
  15. package/dist/adapters/openspec.d.ts +66 -0
  16. package/dist/adapters/openspec.js +232 -0
  17. package/dist/adapters/openspec.js.map +1 -0
  18. package/dist/application/marketplace-registration-contract.d.ts +51 -0
  19. package/dist/application/marketplace-registration-contract.js +11 -0
  20. package/dist/application/marketplace-registration-contract.js.map +1 -0
  21. package/dist/application/marketplace-registration.d.ts +20 -0
  22. package/dist/application/marketplace-registration.js +304 -0
  23. package/dist/application/marketplace-registration.js.map +1 -0
  24. package/dist/cli.d.ts +2 -1
  25. package/dist/cli.js +25 -5
  26. package/dist/cli.js.map +1 -1
  27. package/dist/commands/build.d.ts +1 -1
  28. package/dist/commands/build.js +27 -5
  29. package/dist/commands/build.js.map +1 -1
  30. package/dist/commands/index-gen.d.ts +10 -0
  31. package/dist/commands/index-gen.js +81 -20
  32. package/dist/commands/index-gen.js.map +1 -1
  33. package/dist/commands/init-repo.js +11 -2
  34. package/dist/commands/init-repo.js.map +1 -1
  35. package/dist/commands/init.d.ts +1 -1
  36. package/dist/commands/init.js +61 -9
  37. package/dist/commands/init.js.map +1 -1
  38. package/dist/commands/install-repo.d.ts +20 -0
  39. package/dist/commands/install-repo.js +200 -0
  40. package/dist/commands/install-repo.js.map +1 -0
  41. package/dist/commands/release-local.d.ts +1 -0
  42. package/dist/commands/release-local.js +310 -7
  43. package/dist/commands/release-local.js.map +1 -1
  44. package/dist/commands/validate.js +399 -16
  45. package/dist/commands/validate.js.map +1 -1
  46. package/dist/core/errors.d.ts +5 -0
  47. package/dist/core/errors.js +12 -0
  48. package/dist/core/errors.js.map +1 -0
  49. package/dist/generated/skill-content.js +1 -1
  50. package/dist/generated/skill-content.js.map +1 -1
  51. package/dist/infrastructure/process-runner.d.ts +29 -0
  52. package/dist/infrastructure/process-runner.js +130 -0
  53. package/dist/infrastructure/process-runner.js.map +1 -0
  54. package/dist/infrastructure/vscode-user-settings.d.ts +42 -0
  55. package/dist/infrastructure/vscode-user-settings.js +509 -0
  56. package/dist/infrastructure/vscode-user-settings.js.map +1 -0
  57. package/dist/schema/agent-plugins.d.ts +221 -0
  58. package/dist/schema/agent-plugins.js +155 -0
  59. package/dist/schema/agent-plugins.js.map +1 -0
  60. package/dist/schema/plugin-yaml.d.ts +37 -3
  61. package/dist/schema/plugin-yaml.js +89 -4
  62. package/dist/schema/plugin-yaml.js.map +1 -1
  63. package/dist/utils/helpers.d.ts +1 -0
  64. package/dist/utils/helpers.js +1 -0
  65. package/dist/utils/helpers.js.map +1 -1
  66. package/dist/validation/agent-plugins.d.ts +3 -0
  67. package/dist/validation/agent-plugins.js +418 -0
  68. package/dist/validation/agent-plugins.js.map +1 -0
  69. package/package.json +14 -5
@@ -0,0 +1,232 @@
1
+ /**
2
+ * OpenSpec 适配器
3
+ *
4
+ * 从 OpenSpec 专属配置生成独立 sidecar。
5
+ * 该 sidecar 不属于 Claude/Codex 原生 manifest,避免污染平台 manifest。
6
+ */
7
+ import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ import Ajv from 'ajv';
10
+ import yaml from 'js-yaml';
11
+ export const OPENSPEC_SOURCE_ADAPTERS_FILE = 'openspec-source-adapters.yaml';
12
+ export const OPEN_SPEC_ADAPTER_KINDS = [
13
+ 'command',
14
+ 'skill',
15
+ 'deferred',
16
+ 'manual',
17
+ ];
18
+ const paramSchema = {
19
+ type: 'object',
20
+ required: ['key'],
21
+ additionalProperties: false,
22
+ properties: {
23
+ key: { type: 'string' },
24
+ scope: {
25
+ type: 'string',
26
+ nullable: true,
27
+ enum: ['capability', 'adapter', 'operation', null],
28
+ },
29
+ required: { type: 'boolean', nullable: true },
30
+ label: { type: 'string', nullable: true },
31
+ description: { type: 'string', nullable: true },
32
+ sensitive: { type: 'boolean', nullable: true },
33
+ },
34
+ };
35
+ const openSpecSourceAdaptersSchema = {
36
+ type: 'object',
37
+ required: ['adapters'],
38
+ additionalProperties: false,
39
+ properties: {
40
+ schemaVersion: {
41
+ type: 'string',
42
+ nullable: true,
43
+ enum: ['openspec.source-adapters.v1', null],
44
+ },
45
+ adapters: {
46
+ type: 'array',
47
+ items: {
48
+ type: 'object',
49
+ required: ['id', 'capability', 'kind', 'operations'],
50
+ additionalProperties: false,
51
+ properties: {
52
+ id: { type: 'string' },
53
+ capability: { type: 'string' },
54
+ kind: {
55
+ type: 'string',
56
+ enum: ['command', 'skill', 'deferred', 'manual'],
57
+ },
58
+ operations: {
59
+ type: 'object',
60
+ required: [],
61
+ additionalProperties: {
62
+ type: 'object',
63
+ required: [],
64
+ additionalProperties: false,
65
+ properties: {
66
+ command: { type: 'string', nullable: true },
67
+ args: {
68
+ type: 'array',
69
+ nullable: true,
70
+ items: { type: 'string' },
71
+ },
72
+ output: {
73
+ type: 'string',
74
+ nullable: true,
75
+ enum: ['json', 'markdown', 'text', null],
76
+ },
77
+ parser: {
78
+ type: 'string',
79
+ nullable: true,
80
+ enum: ['prd-markdown', 'yapi-summary-json', 'raw-json', 'raw-text', null],
81
+ },
82
+ skill: { type: 'string', nullable: true },
83
+ execution: {
84
+ type: 'string',
85
+ nullable: true,
86
+ enum: ['agent-plan', 'agent-mcp', null],
87
+ },
88
+ produces: { type: 'string', nullable: true },
89
+ },
90
+ },
91
+ },
92
+ knownParams: {
93
+ type: 'array',
94
+ nullable: true,
95
+ items: paramSchema,
96
+ },
97
+ requiredParams: {
98
+ type: 'array',
99
+ nullable: true,
100
+ items: paramSchema,
101
+ },
102
+ },
103
+ },
104
+ },
105
+ },
106
+ };
107
+ // @ts-expect-error -- ajv v8 CJS/ESM interop: runtime can construct Ajv in this project setup.
108
+ const ajv = new Ajv({ allErrors: true });
109
+ const validateOpenSpecSourceAdapters = ajv.compile(openSpecSourceAdaptersSchema);
110
+ function formatAjvErrors(errors) {
111
+ return (errors
112
+ ?.map((error) => ` - ${error.instancePath || '/'}: ${error.message}`)
113
+ .join('\n') || ' - unknown validation error');
114
+ }
115
+ function stripNullish(value) {
116
+ if (Array.isArray(value)) {
117
+ return value.map((item) => stripNullish(item));
118
+ }
119
+ if (value && typeof value === 'object') {
120
+ const result = {};
121
+ for (const [key, child] of Object.entries(value)) {
122
+ if (child === null || child === undefined)
123
+ continue;
124
+ result[key] = stripNullish(child);
125
+ }
126
+ return result;
127
+ }
128
+ return value;
129
+ }
130
+ function validateUniqueAdapterOperations(adapters) {
131
+ const seen = new Map();
132
+ for (const adapter of adapters) {
133
+ for (const operation of Object.keys(adapter.operations)) {
134
+ const key = `${adapter.id}:${adapter.capability}:${operation}`;
135
+ const existing = seen.get(key);
136
+ if (existing) {
137
+ throw new Error(`${OPENSPEC_SOURCE_ADAPTERS_FILE} declares duplicate adapter operation '${key}' in '${existing}' and '${adapter.id}'`);
138
+ }
139
+ seen.set(key, adapter.id);
140
+ }
141
+ }
142
+ }
143
+ export function isOpenSpecAdapterKind(value) {
144
+ return typeof value === 'string' && OPEN_SPEC_ADAPTER_KINDS.includes(value);
145
+ }
146
+ export function findDuplicateOpenSpecAdapterOperations(entries) {
147
+ const seen = new Map();
148
+ const errors = [];
149
+ for (const entry of entries) {
150
+ for (const adapter of entry.adapters) {
151
+ for (const operation of adapter.operations) {
152
+ const key = `${adapter.id}:${adapter.capability}:${operation}`;
153
+ const existing = seen.get(key);
154
+ if (existing) {
155
+ errors.push(`OpenSpec source adapter duplicate operation '${key}': ` +
156
+ `${existing.plugin} (${existing.source}, adapter ${existing.adapterId}) conflicts with ` +
157
+ `${entry.name} (${entry.source}, adapter ${adapter.id})`);
158
+ continue;
159
+ }
160
+ seen.set(key, {
161
+ plugin: entry.name,
162
+ source: entry.source,
163
+ adapterId: adapter.id,
164
+ capability: adapter.capability,
165
+ operation,
166
+ });
167
+ }
168
+ }
169
+ }
170
+ return errors;
171
+ }
172
+ export function assertUniqueOpenSpecAdapterOperations(entries) {
173
+ const errors = findDuplicateOpenSpecAdapterOperations(entries);
174
+ if (errors.length > 0) {
175
+ throw new Error(`OpenSpec source adapter index validation failed:\n${errors.join('\n')}`);
176
+ }
177
+ }
178
+ export function loadOpenSpecAdapters(pluginDir) {
179
+ const yamlPath = join(pluginDir, OPENSPEC_SOURCE_ADAPTERS_FILE);
180
+ if (!existsSync(yamlPath))
181
+ return [];
182
+ const raw = readFileSync(yamlPath, 'utf-8');
183
+ const data = yaml.load(raw);
184
+ if (!validateOpenSpecSourceAdapters(data)) {
185
+ throw new Error(`${OPENSPEC_SOURCE_ADAPTERS_FILE} validation failed:\n${formatAjvErrors(validateOpenSpecSourceAdapters.errors)}`);
186
+ }
187
+ const sourceAdapters = data;
188
+ validateUniqueAdapterOperations(sourceAdapters.adapters);
189
+ return stripNullish(sourceAdapters.adapters);
190
+ }
191
+ export function buildOpenSpecManifest(config, pluginDir) {
192
+ const adapters = loadOpenSpecAdapters(pluginDir);
193
+ if (!adapters || adapters.length === 0)
194
+ return null;
195
+ return {
196
+ name: config.name,
197
+ version: config.version,
198
+ description: config.description,
199
+ author: stripNullish(config.author),
200
+ openspec: {
201
+ adapters,
202
+ },
203
+ };
204
+ }
205
+ export function generateOpenSpec(config, pluginDir) {
206
+ const openSpecDir = join(pluginDir, '.openspec-plugin');
207
+ const manifest = buildOpenSpecManifest(config, pluginDir);
208
+ if (!manifest) {
209
+ rmSync(openSpecDir, { recursive: true, force: true });
210
+ return false;
211
+ }
212
+ mkdirSync(openSpecDir, { recursive: true });
213
+ writeFileSync(join(openSpecDir, 'plugin.json'), JSON.stringify(manifest, null, 2) + '\n');
214
+ return true;
215
+ }
216
+ export function buildOpenSpecSourceAdapterIndexEntry(config, pluginDir, relativePath) {
217
+ const manifest = buildOpenSpecManifest(config, pluginDir);
218
+ if (!manifest)
219
+ return null;
220
+ return {
221
+ name: config.name,
222
+ source: relativePath,
223
+ manifest: `${relativePath}/.openspec-plugin/plugin.json`,
224
+ adapters: manifest.openspec.adapters.map((adapter) => ({
225
+ id: adapter.id,
226
+ capability: adapter.capability,
227
+ kind: adapter.kind,
228
+ operations: Object.keys(adapter.operations),
229
+ })),
230
+ };
231
+ }
232
+ //# sourceMappingURL=openspec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openspec.js","sourceRoot":"","sources":["../../src/adapters/openspec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ export declare const AGENT_TARGET_IDS: readonly ["claude", "codex", "copilot", "vscode", "cursor"];
2
+ export type AgentTargetId = (typeof AGENT_TARGET_IDS)[number];
3
+ export interface LocalMarketplaceSource {
4
+ readonly kind: 'local';
5
+ readonly input: string;
6
+ readonly displayValue: string;
7
+ readonly clientValue: string;
8
+ readonly vscodeValue: string;
9
+ readonly localPath: string;
10
+ }
11
+ export interface GitMarketplaceSource {
12
+ readonly kind: 'git';
13
+ readonly input: string;
14
+ readonly displayValue: string;
15
+ readonly clientValue: string;
16
+ readonly vscodeValue: string;
17
+ }
18
+ export type MarketplaceRegistrationSource = LocalMarketplaceSource | GitMarketplaceSource;
19
+ export interface RegistrationInvocation {
20
+ readonly executable: string;
21
+ readonly args: readonly string[];
22
+ }
23
+ export type TargetInspectionStatus = 'ready' | 'missing-cli' | 'manual-required' | 'failed' | 'interrupted';
24
+ export interface TargetInspection {
25
+ readonly id: AgentTargetId;
26
+ readonly label: string;
27
+ readonly status: TargetInspectionStatus;
28
+ readonly message: string;
29
+ readonly recovery: string;
30
+ readonly invocation?: RegistrationInvocation;
31
+ readonly settingsPath?: string;
32
+ }
33
+ export type TargetRegistrationStatus = 'completed' | 'missing-cli' | 'manual-required' | 'failed' | 'interrupted';
34
+ export interface TargetRegistrationResult {
35
+ readonly id: AgentTargetId;
36
+ readonly label: string;
37
+ readonly status: TargetRegistrationStatus;
38
+ readonly message: string;
39
+ readonly recovery?: string;
40
+ readonly invocation?: RegistrationInvocation;
41
+ }
42
+ export interface MarketplaceRegistrationInspection {
43
+ readonly source: MarketplaceRegistrationSource;
44
+ readonly targets: readonly TargetInspection[];
45
+ }
46
+ export interface MarketplaceRegistrationReport {
47
+ readonly source: MarketplaceRegistrationSource;
48
+ readonly results: readonly TargetRegistrationResult[];
49
+ readonly exitCode: 0 | 1 | 2 | 130;
50
+ }
51
+ export declare function isAgentTargetId(value: string): value is AgentTargetId;
@@ -0,0 +1,11 @@
1
+ export const AGENT_TARGET_IDS = [
2
+ 'claude',
3
+ 'codex',
4
+ 'copilot',
5
+ 'vscode',
6
+ 'cursor',
7
+ ];
8
+ export function isAgentTargetId(value) {
9
+ return AGENT_TARGET_IDS.includes(value);
10
+ }
11
+ //# sourceMappingURL=marketplace-registration-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace-registration-contract.js","sourceRoot":"","sources":["../../src/application/marketplace-registration-contract.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,QAAQ;IACR,OAAO;IACP,SAAS;IACT,QAAQ;IACR,QAAQ;CACA,CAAC;AAwEX,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAQ,gBAAsC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type MarketplaceRegistrationRuntime } from '../adapters/marketplace-registration.js';
2
+ import { type AgentTargetId, type MarketplaceRegistrationInspection, type MarketplaceRegistrationReport, type MarketplaceRegistrationSource, type TargetInspection, type TargetRegistrationResult } from './marketplace-registration-contract.js';
3
+ export interface NormalizeMarketplaceSourceOptions {
4
+ readonly baseDir?: string;
5
+ readonly homeDir?: string;
6
+ }
7
+ export declare function normalizeMarketplaceSource(sourceInput: string, options?: NormalizeMarketplaceSourceOptions): MarketplaceRegistrationSource;
8
+ export interface InspectMarketplaceRegistrationOptions extends NormalizeMarketplaceSourceOptions {
9
+ readonly targetIds?: readonly string[];
10
+ readonly runtime?: MarketplaceRegistrationRuntime;
11
+ }
12
+ export interface ExecuteMarketplaceRegistrationOptions {
13
+ readonly runtime?: MarketplaceRegistrationRuntime;
14
+ readonly onTargetStart?: (inspection: TargetInspection) => void;
15
+ readonly onTargetResult?: (result: TargetRegistrationResult) => void;
16
+ }
17
+ export declare function normalizeTargetIds(values: readonly string[]): AgentTargetId[];
18
+ export declare function inspectMarketplaceRegistration(sourceInput: string, options?: InspectMarketplaceRegistrationOptions): Promise<MarketplaceRegistrationInspection>;
19
+ export declare function marketplaceRegistrationExitCode(results: readonly TargetRegistrationResult[]): 0 | 1 | 2 | 130;
20
+ export declare function executeMarketplaceRegistration(inspection: MarketplaceRegistrationInspection, options?: ExecuteMarketplaceRegistrationOptions): Promise<MarketplaceRegistrationReport>;
@@ -0,0 +1,304 @@
1
+ import { existsSync, lstatSync, realpathSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { isAbsolute, resolve, sep } from 'node:path';
4
+ import { pathToFileURL } from 'node:url';
5
+ import { getMarketplaceRegistrationAdapter, MARKETPLACE_REGISTRATION_ADAPTERS, } from '../adapters/marketplace-registration.js';
6
+ import { CommandError } from '../core/errors.js';
7
+ import { AGENT_TARGET_IDS, isAgentTargetId, } from './marketplace-registration-contract.js';
8
+ const GITHUB_SHORTHAND = /^([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)$/;
9
+ const SCP_SSH_URL = /^[A-Za-z0-9._-]+@[A-Za-z0-9.-]+:[^\s:][^\s]*$/;
10
+ const TERMINAL_CONTROL_CHARACTERS = /[\u0000-\u001f\u007f-\u009f]/u;
11
+ function assertNoTerminalControlCharacters(value, label) {
12
+ if (TERMINAL_CONTROL_CHARACTERS.test(value)) {
13
+ throw new CommandError(`${label}不能包含 C0、C1 或 DEL 控制字符。`);
14
+ }
15
+ }
16
+ function assertNoEncodedTerminalControlCharacters(value, label) {
17
+ let decoded;
18
+ try {
19
+ decoded = decodeURIComponent(value);
20
+ }
21
+ catch {
22
+ throw new CommandError(`${label}包含无效的百分号编码。`);
23
+ }
24
+ assertNoTerminalControlCharacters(decoded, `解码后的${label}`);
25
+ }
26
+ function appendPathWithoutNormalizing(baseDir, relativePath) {
27
+ return `${baseDir}${baseDir.endsWith(sep) ? '' : sep}${relativePath}`;
28
+ }
29
+ function expandHomePath(value, homeDir) {
30
+ if (value === '~') {
31
+ return resolve(homeDir);
32
+ }
33
+ if (value.startsWith('~/') || value.startsWith('~\\')) {
34
+ return appendPathWithoutNormalizing(resolve(homeDir), value.slice(2));
35
+ }
36
+ return value;
37
+ }
38
+ function looksLikeLocalPath(value) {
39
+ return (value === '.' ||
40
+ value === '..' ||
41
+ value === '~' ||
42
+ value.startsWith('./') ||
43
+ value.startsWith('../') ||
44
+ value.startsWith('~/') ||
45
+ value.startsWith('.\\') ||
46
+ value.startsWith('..\\') ||
47
+ value.startsWith('~\\') ||
48
+ isAbsolute(value) ||
49
+ /^[A-Za-z]:[\\/]/.test(value));
50
+ }
51
+ function normalizeLocalSource(input, candidatePath) {
52
+ const stat = lstatSync(candidatePath);
53
+ if (!stat.isDirectory() && !stat.isSymbolicLink()) {
54
+ throw new CommandError(`Marketplace 本地来源不是目录: ${candidatePath}`);
55
+ }
56
+ const localPath = realpathSync(candidatePath);
57
+ assertNoTerminalControlCharacters(localPath, '解析后的 Marketplace 本地路径');
58
+ if (!lstatSync(localPath).isDirectory()) {
59
+ throw new CommandError(`Marketplace 本地来源不是目录: ${candidatePath}`);
60
+ }
61
+ return {
62
+ kind: 'local',
63
+ input,
64
+ displayValue: localPath,
65
+ clientValue: localPath,
66
+ vscodeValue: pathToFileURL(localPath).href,
67
+ localPath,
68
+ };
69
+ }
70
+ function normalizeHttpsSource(input, parsed) {
71
+ if (parsed.protocol !== 'https:') {
72
+ throw new CommandError(`Git URL 只接受 HTTPS 或 SSH: ${parsed.protocol}`);
73
+ }
74
+ if (parsed.username || parsed.password) {
75
+ throw new CommandError('Git URL 不能包含内嵌凭据;请使用客户端已有的认证配置。');
76
+ }
77
+ if (!parsed.hostname || parsed.pathname.split('/').filter(Boolean).length < 2) {
78
+ throw new CommandError('HTTPS Git URL 必须包含主机、owner 与 repository 路径。');
79
+ }
80
+ if (parsed.search || parsed.hash) {
81
+ throw new CommandError('Git URL 不能包含 query 或 fragment。');
82
+ }
83
+ return {
84
+ kind: 'git',
85
+ input,
86
+ displayValue: input,
87
+ clientValue: input,
88
+ vscodeValue: input,
89
+ };
90
+ }
91
+ function normalizeSshSource(input, parsed) {
92
+ if (parsed.password) {
93
+ throw new CommandError('SSH Git URL 不能包含内嵌密码。');
94
+ }
95
+ if (!parsed.hostname || parsed.pathname.split('/').filter(Boolean).length < 2) {
96
+ throw new CommandError('SSH Git URL 必须包含主机、owner 与 repository 路径。');
97
+ }
98
+ if (parsed.search || parsed.hash) {
99
+ throw new CommandError('SSH Git URL 不能包含 query 或 fragment。');
100
+ }
101
+ return {
102
+ kind: 'git',
103
+ input,
104
+ displayValue: input,
105
+ clientValue: input,
106
+ vscodeValue: input,
107
+ };
108
+ }
109
+ export function normalizeMarketplaceSource(sourceInput, options = {}) {
110
+ assertNoTerminalControlCharacters(sourceInput, 'Marketplace 来源');
111
+ if (sourceInput.length === 0 || sourceInput !== sourceInput.trim()) {
112
+ throw new CommandError('Marketplace 来源不能为空,也不能包含首尾空白。');
113
+ }
114
+ if (sourceInput.startsWith('-')) {
115
+ throw new CommandError('Marketplace 来源不能以 - 开头。');
116
+ }
117
+ const baseDir = resolve(options.baseDir ?? process.env.INIT_CWD ?? process.cwd());
118
+ const expanded = expandHomePath(sourceInput, options.homeDir ?? homedir());
119
+ const localCandidate = isAbsolute(expanded)
120
+ ? expanded
121
+ : appendPathWithoutNormalizing(baseDir, expanded);
122
+ assertNoTerminalControlCharacters(localCandidate, '解析后的 Marketplace 本地路径');
123
+ if (existsSync(localCandidate)) {
124
+ return normalizeLocalSource(sourceInput, localCandidate);
125
+ }
126
+ if (looksLikeLocalPath(sourceInput)) {
127
+ throw new CommandError(`Marketplace 本地路径不存在: ${localCandidate}`);
128
+ }
129
+ const shorthand = GITHUB_SHORTHAND.exec(sourceInput);
130
+ if (shorthand) {
131
+ if (shorthand[1] === '.' || shorthand[1] === '..' || shorthand[2] === '.' || shorthand[2] === '..') {
132
+ throw new CommandError('GitHub owner/repo 的 owner 与 repository 不能是 . 或 ..。');
133
+ }
134
+ return {
135
+ kind: 'git',
136
+ input: sourceInput,
137
+ displayValue: sourceInput,
138
+ clientValue: sourceInput,
139
+ vscodeValue: sourceInput,
140
+ };
141
+ }
142
+ if (SCP_SSH_URL.test(sourceInput)) {
143
+ assertNoEncodedTerminalControlCharacters(sourceInput, 'SCP SSH Git URL');
144
+ return {
145
+ kind: 'git',
146
+ input: sourceInput,
147
+ displayValue: sourceInput,
148
+ clientValue: sourceInput,
149
+ vscodeValue: sourceInput,
150
+ };
151
+ }
152
+ if (sourceInput.includes('://')) {
153
+ assertNoEncodedTerminalControlCharacters(sourceInput, 'Marketplace Git URL');
154
+ let parsed;
155
+ try {
156
+ parsed = new URL(sourceInput);
157
+ }
158
+ catch {
159
+ throw new CommandError('Marketplace Git URL 格式无效。');
160
+ }
161
+ if (parsed.protocol === 'ssh:') {
162
+ return normalizeSshSource(sourceInput, parsed);
163
+ }
164
+ return normalizeHttpsSource(sourceInput, parsed);
165
+ }
166
+ throw new CommandError('无法识别来源;请传入已存在的本地目录、owner/repo、HTTPS Git URL 或 SSH Git URL。');
167
+ }
168
+ export function normalizeTargetIds(values) {
169
+ const requested = new Set();
170
+ for (const value of values) {
171
+ if (!isAgentTargetId(value)) {
172
+ throw new CommandError(`未知 agent: ${value}。可选值: ${AGENT_TARGET_IDS.join(', ')}`);
173
+ }
174
+ requested.add(value);
175
+ }
176
+ const normalized = AGENT_TARGET_IDS.filter((id) => requested.has(id));
177
+ if (normalized.length === 0) {
178
+ throw new CommandError('至少选择一个 agent。');
179
+ }
180
+ return normalized;
181
+ }
182
+ export async function inspectMarketplaceRegistration(sourceInput, options = {}) {
183
+ const source = normalizeMarketplaceSource(sourceInput, options);
184
+ const targetIds = normalizeTargetIds(options.targetIds ?? AGENT_TARGET_IDS);
185
+ const selected = new Set(targetIds);
186
+ const targets = [];
187
+ let interrupted = false;
188
+ for (const adapter of MARKETPLACE_REGISTRATION_ADAPTERS) {
189
+ if (!selected.has(adapter.id)) {
190
+ continue;
191
+ }
192
+ if (!interrupted && options.runtime?.signal?.aborted) {
193
+ targets.push({
194
+ id: adapter.id,
195
+ label: adapter.label,
196
+ status: 'interrupted',
197
+ message: '因用户中断未执行能力探测或注册。',
198
+ recovery: '确认客户端状态后重新运行命令。',
199
+ });
200
+ interrupted = true;
201
+ continue;
202
+ }
203
+ if (interrupted) {
204
+ targets.push({
205
+ id: adapter.id,
206
+ label: adapter.label,
207
+ status: 'interrupted',
208
+ message: '因前序目标中断未执行能力探测或注册。',
209
+ recovery: '确认中断目标的客户端状态后重新运行命令。',
210
+ });
211
+ continue;
212
+ }
213
+ const inspection = await adapter.inspect(source, options.runtime);
214
+ targets.push(inspection);
215
+ if (inspection.status === 'interrupted') {
216
+ interrupted = true;
217
+ }
218
+ }
219
+ return { source, targets };
220
+ }
221
+ function resultFromInspection(target) {
222
+ return {
223
+ id: target.id,
224
+ label: target.label,
225
+ status: target.status === 'ready' ? 'failed' : target.status,
226
+ message: target.message,
227
+ recovery: target.recovery,
228
+ ...(target.invocation ? { invocation: target.invocation } : {}),
229
+ };
230
+ }
231
+ function interruptedBeforeRegistrationResult(target, message) {
232
+ return {
233
+ id: target.id,
234
+ label: target.label,
235
+ status: 'interrupted',
236
+ message,
237
+ recovery: '确认中断目标的客户端状态后重新运行命令。',
238
+ ...(target.invocation ? { invocation: target.invocation } : {}),
239
+ };
240
+ }
241
+ export function marketplaceRegistrationExitCode(results) {
242
+ if (results.some((result) => result.status === 'interrupted')) {
243
+ return 130;
244
+ }
245
+ const completed = results.filter((result) => result.status === 'completed').length;
246
+ if (completed === results.length && results.length > 0) {
247
+ return 0;
248
+ }
249
+ if (completed > 0) {
250
+ return 2;
251
+ }
252
+ return 1;
253
+ }
254
+ export async function executeMarketplaceRegistration(inspection, options = {}) {
255
+ const preflightInterruptedIndex = inspection.targets.findIndex((target) => target.status === 'interrupted');
256
+ if (preflightInterruptedIndex >= 0) {
257
+ const results = inspection.targets.map((target, index) => {
258
+ if (index < preflightInterruptedIndex && target.status === 'ready') {
259
+ return interruptedBeforeRegistrationResult(target, `因能力探测阶段中断未执行注册。预检状态:${target.message}`);
260
+ }
261
+ return resultFromInspection(target);
262
+ });
263
+ results.forEach((result) => options.onTargetResult?.(result));
264
+ return {
265
+ source: inspection.source,
266
+ results,
267
+ exitCode: 130,
268
+ };
269
+ }
270
+ const results = [];
271
+ for (const [index, target] of inspection.targets.entries()) {
272
+ if (options.runtime?.signal?.aborted) {
273
+ for (const remaining of inspection.targets.slice(index)) {
274
+ const skipped = remaining.status === 'ready'
275
+ ? interruptedBeforeRegistrationResult(remaining, `因用户中断未执行注册。预检状态:${remaining.message}`)
276
+ : resultFromInspection(remaining);
277
+ results.push(skipped);
278
+ options.onTargetResult?.(skipped);
279
+ }
280
+ break;
281
+ }
282
+ options.onTargetStart?.(target);
283
+ const adapter = getMarketplaceRegistrationAdapter(target.id);
284
+ const result = await adapter.execute(inspection.source, target, options.runtime);
285
+ results.push(result);
286
+ options.onTargetResult?.(result);
287
+ if (result.status === 'interrupted') {
288
+ for (const remaining of inspection.targets.slice(index + 1)) {
289
+ const skipped = remaining.status === 'ready'
290
+ ? interruptedBeforeRegistrationResult(remaining, `因前序目标中断未执行注册。预检状态:${remaining.message}`)
291
+ : resultFromInspection(remaining);
292
+ results.push(skipped);
293
+ options.onTargetResult?.(skipped);
294
+ }
295
+ break;
296
+ }
297
+ }
298
+ return {
299
+ source: inspection.source,
300
+ results,
301
+ exitCode: marketplaceRegistrationExitCode(results),
302
+ };
303
+ }
304
+ //# sourceMappingURL=marketplace-registration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace-registration.js","sourceRoot":"","sources":["../../src/application/marketplace-registration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,iCAAiC,EACjC,iCAAiC,GAElC,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EACL,gBAAgB,EAChB,eAAe,GAOhB,MAAM,wCAAwC,CAAC;AAOhD,MAAM,gBAAgB,GAAG,wCAAwC,CAAC;AAClE,MAAM,WAAW,GAAG,+CAA+C,CAAC;AACpE,MAAM,2BAA2B,GAAG,+BAA+B,CAAC;AAEpE,SAAS,iCAAiC,CAAC,KAAa,EAAE,KAAa;IACrE,IAAI,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,YAAY,CAAC,GAAG,KAAK,wBAAwB,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,SAAS,wCAAwC,CAAC,KAAa,EAAE,KAAa;IAC5E,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,YAAY,CAAC,GAAG,KAAK,aAAa,CAAC,CAAC;IAChD,CAAC;IACD,iCAAiC,CAAC,OAAO,EAAE,OAAO,KAAK,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,4BAA4B,CAAC,OAAe,EAAE,YAAoB;IACzE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,YAAY,EAAE,CAAC;AACxE,CAAC;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,OAAe;IACpD,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;QAClB,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,OAAO,4BAA4B,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACvC,OAAO,CACL,KAAK,KAAK,GAAG;QACb,KAAK,KAAK,IAAI;QACd,KAAK,KAAK,GAAG;QACb,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QACtB,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;QACvB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QACtB,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;QACvB,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;QACxB,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;QACvB,UAAU,CAAC,KAAK,CAAC;QACjB,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAC9B,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAC3B,KAAa,EACb,aAAqB;IAErB,MAAM,IAAI,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;QAClD,MAAM,IAAI,YAAY,CAAC,yBAAyB,aAAa,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;IAC9C,iCAAiC,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;IACtE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACxC,MAAM,IAAI,YAAY,CAAC,yBAAyB,aAAa,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,OAAO;QACL,IAAI,EAAE,OAAO;QACb,KAAK;QACL,YAAY,EAAE,SAAS;QACvB,WAAW,EAAE,SAAS;QACtB,WAAW,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,IAAI;QAC1C,SAAS;KACV,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa,EAAE,MAAW;IACtD,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,IAAI,YAAY,CAAC,4BAA4B,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvC,MAAM,IAAI,YAAY,CAAC,iCAAiC,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9E,MAAM,IAAI,YAAY,CAAC,6CAA6C,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QACjC,MAAM,IAAI,YAAY,CAAC,gCAAgC,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO;QACL,IAAI,EAAE,KAAK;QACX,KAAK;QACL,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,KAAK;QAClB,WAAW,EAAE,KAAK;KACnB,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa,EAAE,MAAW;IACpD,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,IAAI,YAAY,CAAC,uBAAuB,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9E,MAAM,IAAI,YAAY,CAAC,2CAA2C,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QACjC,MAAM,IAAI,YAAY,CAAC,oCAAoC,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO;QACL,IAAI,EAAE,KAAK;QACX,KAAK;QACL,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,KAAK;QAClB,WAAW,EAAE,KAAK;KACnB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,WAAmB,EACnB,UAA6C,EAAE;IAE/C,iCAAiC,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IACjE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,KAAK,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;QACnE,MAAM,IAAI,YAAY,CAAC,+BAA+B,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,YAAY,CAAC,yBAAyB,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAClF,MAAM,QAAQ,GAAG,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC,CAAC;IAC3E,MAAM,cAAc,GAAG,UAAU,CAAC,QAAQ,CAAC;QACzC,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,4BAA4B,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACpD,iCAAiC,CAAC,cAAc,EAAE,uBAAuB,CAAC,CAAC;IAC3E,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/B,OAAO,oBAAoB,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,YAAY,CAAC,wBAAwB,cAAc,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACrD,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACnG,MAAM,IAAI,YAAY,CAAC,oDAAoD,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO;YACL,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,WAAW;YAClB,YAAY,EAAE,WAAW;YACzB,WAAW,EAAE,WAAW;YACxB,WAAW,EAAE,WAAW;SACzB,CAAC;IACJ,CAAC;IAED,IAAI,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAClC,wCAAwC,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;QACzE,OAAO;YACL,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,WAAW;YAClB,YAAY,EAAE,WAAW;YACzB,WAAW,EAAE,WAAW;YACxB,WAAW,EAAE,WAAW;SACzB,CAAC;IACJ,CAAC;IAED,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,wCAAwC,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;QAC7E,IAAI,MAAW,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,YAAY,CAAC,2BAA2B,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YAC/B,OAAO,kBAAkB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,oBAAoB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,IAAI,YAAY,CACpB,4DAA4D,CAC7D,CAAC;AACJ,CAAC;AAaD,MAAM,UAAU,kBAAkB,CAAC,MAAyB;IAC1D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAiB,CAAC;IAC3C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,YAAY,CACpB,aAAa,KAAK,SAAS,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACzD,CAAC;QACJ,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACtE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,YAAY,CAAC,eAAe,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,WAAmB,EACnB,UAAiD,EAAE;IAEnD,MAAM,MAAM,GAAG,0BAA0B,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,SAAS,IAAI,gBAAgB,CAAC,CAAC;IAC5E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,KAAK,MAAM,OAAO,IAAI,iCAAiC,EAAE,CAAC;QACxD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;YAC9B,SAAS;QACX,CAAC;QACD,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,aAAa;gBACrB,OAAO,EAAE,kBAAkB;gBAC3B,QAAQ,EAAE,iBAAiB;aAC5B,CAAC,CAAC;YACH,WAAW,GAAG,IAAI,CAAC;YACnB,SAAS;QACX,CAAC;QACD,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,aAAa;gBACrB,OAAO,EAAE,oBAAoB;gBAC7B,QAAQ,EAAE,sBAAsB;aACjC,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzB,IAAI,UAAU,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YACxC,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAwB;IACpD,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM;QAC5D,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChE,CAAC;AACJ,CAAC;AAED,SAAS,mCAAmC,CAC1C,MAAwB,EACxB,OAAe;IAEf,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,aAAa;QACrB,OAAO;QACP,QAAQ,EAAE,sBAAsB;QAChC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,OAA4C;IAE5C,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,aAAa,CAAC,EAAE,CAAC;QAC9D,OAAO,GAAG,CAAC;IACb,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;IACnF,IAAI,SAAS,KAAK,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,UAA6C,EAC7C,UAAiD,EAAE;IAEnD,MAAM,yBAAyB,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAC5D,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,aAAa,CAC5C,CAAC;IACF,IAAI,yBAAyB,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACvD,IAAI,KAAK,GAAG,yBAAyB,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;gBACnE,OAAO,mCAAmC,CACxC,MAAM,EACN,uBAAuB,MAAM,CAAC,OAAO,EAAE,CACxC,CAAC;YACJ,CAAC;YACD,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9D,OAAO;YACL,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO;YACP,QAAQ,EAAE,GAAG;SACd,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAA+B,EAAE,CAAC;IAC/C,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC3D,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;YACrC,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxD,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,KAAK,OAAO;oBAC1C,CAAC,CAAC,mCAAmC,CACjC,SAAS,EACT,mBAAmB,SAAS,CAAC,OAAO,EAAE,CACvC;oBACH,CAAC,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;gBACpC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACtB,OAAO,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC;YACpC,CAAC;YACD,MAAM;QACR,CAAC;QACD,OAAO,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,iCAAiC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,OAAO,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,MAAM,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YACpC,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC5D,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,KAAK,OAAO;oBAC1C,CAAC,CAAC,mCAAmC,CACjC,SAAS,EACT,qBAAqB,SAAS,CAAC,OAAO,EAAE,CACzC;oBACH,CAAC,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;gBACpC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACtB,OAAO,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC;YACpC,CAAC;YACD,MAAM;QACR,CAAC;IACH,CAAC;IACD,OAAO;QACL,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,OAAO;QACP,QAAQ,EAAE,+BAA+B,CAAC,OAAO,CAAC;KACnD,CAAC;AACJ,CAAC"}