agent-plugkit 0.1.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 (156) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +295 -0
  3. package/dist/adapters/agent-plugins.d.ts +35 -0
  4. package/dist/adapters/agent-plugins.js +57 -0
  5. package/dist/adapters/agent-plugins.js.map +1 -0
  6. package/dist/adapters/claude.d.ts +64 -0
  7. package/dist/adapters/claude.js +123 -0
  8. package/dist/adapters/claude.js.map +1 -0
  9. package/dist/adapters/cli-validation.d.ts +12 -0
  10. package/dist/adapters/cli-validation.js +31 -0
  11. package/dist/adapters/cli-validation.js.map +1 -0
  12. package/dist/adapters/codex.d.ts +62 -0
  13. package/dist/adapters/codex.js +91 -0
  14. package/dist/adapters/codex.js.map +1 -0
  15. package/dist/adapters/marketplace-registration.d.ts +17 -0
  16. package/dist/adapters/marketplace-registration.js +369 -0
  17. package/dist/adapters/marketplace-registration.js.map +1 -0
  18. package/dist/adapters/marketplace.d.ts +11 -0
  19. package/dist/adapters/marketplace.js +96 -0
  20. package/dist/adapters/marketplace.js.map +1 -0
  21. package/dist/adapters/mcp.d.ts +17 -0
  22. package/dist/adapters/mcp.js +28 -0
  23. package/dist/adapters/mcp.js.map +1 -0
  24. package/dist/application/artifact-generation.d.ts +58 -0
  25. package/dist/application/artifact-generation.js +344 -0
  26. package/dist/application/artifact-generation.js.map +1 -0
  27. package/dist/application/local-release.d.ts +122 -0
  28. package/dist/application/local-release.js +940 -0
  29. package/dist/application/local-release.js.map +1 -0
  30. package/dist/application/marketplace-document-contract.d.ts +81 -0
  31. package/dist/application/marketplace-document-contract.js +2 -0
  32. package/dist/application/marketplace-document-contract.js.map +1 -0
  33. package/dist/application/marketplace-document.d.ts +45 -0
  34. package/dist/application/marketplace-document.js +557 -0
  35. package/dist/application/marketplace-document.js.map +1 -0
  36. package/dist/application/marketplace-registration-contract.d.ts +51 -0
  37. package/dist/application/marketplace-registration-contract.js +11 -0
  38. package/dist/application/marketplace-registration-contract.js.map +1 -0
  39. package/dist/application/marketplace-registration.d.ts +20 -0
  40. package/dist/application/marketplace-registration.js +304 -0
  41. package/dist/application/marketplace-registration.js.map +1 -0
  42. package/dist/application/marketplace.d.ts +9 -0
  43. package/dist/application/marketplace.js +32 -0
  44. package/dist/application/marketplace.js.map +1 -0
  45. package/dist/application/plugin-components-contract.d.ts +135 -0
  46. package/dist/application/plugin-components-contract.js +2 -0
  47. package/dist/application/plugin-components-contract.js.map +1 -0
  48. package/dist/application/plugin-components.d.ts +17 -0
  49. package/dist/application/plugin-components.js +1000 -0
  50. package/dist/application/plugin-components.js.map +1 -0
  51. package/dist/application/plugin-document-contract.d.ts +115 -0
  52. package/dist/application/plugin-document-contract.js +2 -0
  53. package/dist/application/plugin-document-contract.js.map +1 -0
  54. package/dist/application/plugin-document.d.ts +69 -0
  55. package/dist/application/plugin-document.js +1037 -0
  56. package/dist/application/plugin-document.js.map +1 -0
  57. package/dist/application/plugin-lifecycle-contract.d.ts +230 -0
  58. package/dist/application/plugin-lifecycle-contract.js +3 -0
  59. package/dist/application/plugin-lifecycle-contract.js.map +1 -0
  60. package/dist/application/plugin-lifecycle.d.ts +8 -0
  61. package/dist/application/plugin-lifecycle.js +1375 -0
  62. package/dist/application/plugin-lifecycle.js.map +1 -0
  63. package/dist/application/plugin-scaffold.d.ts +18 -0
  64. package/dist/application/plugin-scaffold.js +188 -0
  65. package/dist/application/plugin-scaffold.js.map +1 -0
  66. package/dist/application/plugin-source.d.ts +39 -0
  67. package/dist/application/plugin-source.js +59 -0
  68. package/dist/application/plugin-source.js.map +1 -0
  69. package/dist/application/skill-document-contract.d.ts +92 -0
  70. package/dist/application/skill-document-contract.js +8 -0
  71. package/dist/application/skill-document-contract.js.map +1 -0
  72. package/dist/application/skill-document-guided.d.ts +3 -0
  73. package/dist/application/skill-document-guided.js +53 -0
  74. package/dist/application/skill-document-guided.js.map +1 -0
  75. package/dist/application/skill-document.d.ts +19 -0
  76. package/dist/application/skill-document.js +368 -0
  77. package/dist/application/skill-document.js.map +1 -0
  78. package/dist/application/workspace-create-contract.d.ts +50 -0
  79. package/dist/application/workspace-create-contract.js +16 -0
  80. package/dist/application/workspace-create-contract.js.map +1 -0
  81. package/dist/application/workspace-create.d.ts +8 -0
  82. package/dist/application/workspace-create.js +656 -0
  83. package/dist/application/workspace-create.js.map +1 -0
  84. package/dist/application/workspace-health-contract.d.ts +133 -0
  85. package/dist/application/workspace-health-contract.js +272 -0
  86. package/dist/application/workspace-health-contract.js.map +1 -0
  87. package/dist/application/workspace-health.d.ts +10 -0
  88. package/dist/application/workspace-health.js +1114 -0
  89. package/dist/application/workspace-health.js.map +1 -0
  90. package/dist/application/workspace-operation-contract.d.ts +99 -0
  91. package/dist/application/workspace-operation-contract.js +450 -0
  92. package/dist/application/workspace-operation-contract.js.map +1 -0
  93. package/dist/application/workspace-operation.d.ts +42 -0
  94. package/dist/application/workspace-operation.js +517 -0
  95. package/dist/application/workspace-operation.js.map +1 -0
  96. package/dist/cli.d.ts +16 -0
  97. package/dist/cli.js +136 -0
  98. package/dist/cli.js.map +1 -0
  99. package/dist/commands/add.d.ts +8 -0
  100. package/dist/commands/add.js +77 -0
  101. package/dist/commands/add.js.map +1 -0
  102. package/dist/commands/build.d.ts +7 -0
  103. package/dist/commands/build.js +29 -0
  104. package/dist/commands/build.js.map +1 -0
  105. package/dist/commands/component-scaffold.d.ts +4 -0
  106. package/dist/commands/component-scaffold.js +14 -0
  107. package/dist/commands/component-scaffold.js.map +1 -0
  108. package/dist/commands/import-skill.d.ts +15 -0
  109. package/dist/commands/import-skill.js +41 -0
  110. package/dist/commands/import-skill.js.map +1 -0
  111. package/dist/commands/index-gen.d.ts +12 -0
  112. package/dist/commands/index-gen.js +33 -0
  113. package/dist/commands/index-gen.js.map +1 -0
  114. package/dist/commands/init-repo.d.ts +8 -0
  115. package/dist/commands/init-repo.js +53 -0
  116. package/dist/commands/init-repo.js.map +1 -0
  117. package/dist/commands/init.d.ts +9 -0
  118. package/dist/commands/init.js +33 -0
  119. package/dist/commands/init.js.map +1 -0
  120. package/dist/commands/install-repo.d.ts +20 -0
  121. package/dist/commands/install-repo.js +200 -0
  122. package/dist/commands/install-repo.js.map +1 -0
  123. package/dist/commands/release-local.d.ts +9 -0
  124. package/dist/commands/release-local.js +27 -0
  125. package/dist/commands/release-local.js.map +1 -0
  126. package/dist/commands/validate.d.ts +8 -0
  127. package/dist/commands/validate.js +45 -0
  128. package/dist/commands/validate.js.map +1 -0
  129. package/dist/core/errors.d.ts +5 -0
  130. package/dist/core/errors.js +12 -0
  131. package/dist/core/errors.js.map +1 -0
  132. package/dist/generated/skill-content.d.ts +3 -0
  133. package/dist/generated/skill-content.js +9 -0
  134. package/dist/generated/skill-content.js.map +1 -0
  135. package/dist/infrastructure/authorized-path.d.ts +20 -0
  136. package/dist/infrastructure/authorized-path.js +85 -0
  137. package/dist/infrastructure/authorized-path.js.map +1 -0
  138. package/dist/infrastructure/document-commit.d.ts +165 -0
  139. package/dist/infrastructure/document-commit.js +1352 -0
  140. package/dist/infrastructure/document-commit.js.map +1 -0
  141. package/dist/infrastructure/process-runner.d.ts +29 -0
  142. package/dist/infrastructure/process-runner.js +130 -0
  143. package/dist/infrastructure/process-runner.js.map +1 -0
  144. package/dist/infrastructure/vscode-user-settings.d.ts +42 -0
  145. package/dist/infrastructure/vscode-user-settings.js +509 -0
  146. package/dist/infrastructure/vscode-user-settings.js.map +1 -0
  147. package/dist/schema/plugin-yaml.d.ts +89 -0
  148. package/dist/schema/plugin-yaml.js +241 -0
  149. package/dist/schema/plugin-yaml.js.map +1 -0
  150. package/dist/utils/frontmatter.d.ts +30 -0
  151. package/dist/utils/frontmatter.js +60 -0
  152. package/dist/utils/frontmatter.js.map +1 -0
  153. package/dist/utils/helpers.d.ts +44 -0
  154. package/dist/utils/helpers.js +94 -0
  155. package/dist/utils/helpers.js.map +1 -0
  156. package/package.json +56 -0
@@ -0,0 +1,509 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { chmodSync, closeSync, existsSync, fstatSync, ftruncateSync, fsyncSync, linkSync, lstatSync, mkdirSync, openSync, readSync, readFileSync, renameSync, statSync, unlinkSync, writeFileSync, } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { basename, dirname, isAbsolute, join, win32 } from 'node:path';
5
+ import { applyEdits, createScanner, modify, parse, parseTree, printParseErrorCode, } from 'jsonc-parser';
6
+ class VscodeSettingsError extends Error {
7
+ constructor(message) {
8
+ super(message);
9
+ this.name = 'VscodeSettingsError';
10
+ }
11
+ }
12
+ const MANAGED_SETTINGS_KEYS = new Set([
13
+ 'chat.plugins.enabled',
14
+ 'chat.plugins.marketplaces',
15
+ ]);
16
+ const PATH_CONTROL_CHARACTERS = /[\u0000-\u001f\u007f-\u009f]/u;
17
+ function isMissingError(error) {
18
+ return error?.code === 'ENOENT';
19
+ }
20
+ function fileRevision(bytes) {
21
+ return createHash('sha256').update(bytes).digest('hex');
22
+ }
23
+ function decodeUtf8Losslessly(bytes) {
24
+ const decoded = bytes.toString('utf8');
25
+ if (!Buffer.from(decoded, 'utf8').equals(bytes)) {
26
+ throw new VscodeSettingsError('VS Code settings.json 不是合法 UTF-8,无法无损更新,没有覆盖原文件。');
27
+ }
28
+ return decoded;
29
+ }
30
+ function readSnapshot(path) {
31
+ let stat;
32
+ try {
33
+ stat = lstatSync(path);
34
+ }
35
+ catch (error) {
36
+ if (isMissingError(error)) {
37
+ return { kind: 'missing' };
38
+ }
39
+ throw error;
40
+ }
41
+ if (!stat.isFile()) {
42
+ throw new VscodeSettingsError(`VS Code settings.json 不是普通文件: ${path}`);
43
+ }
44
+ const bytes = readFileSync(path);
45
+ return {
46
+ kind: 'file',
47
+ bytes,
48
+ revision: fileRevision(bytes),
49
+ mode: stat.mode & 0o777,
50
+ };
51
+ }
52
+ function snapshotsMatch(expected, actual) {
53
+ if (expected.kind !== actual.kind) {
54
+ return false;
55
+ }
56
+ if (expected.kind === 'missing' || actual.kind === 'missing') {
57
+ return true;
58
+ }
59
+ return expected.revision === actual.revision && expected.mode === actual.mode;
60
+ }
61
+ function readDescriptorSnapshot(descriptor) {
62
+ const stat = fstatSync(descriptor);
63
+ if (!stat.isFile()) {
64
+ throw new VscodeSettingsError('VS Code settings.json 并发保护句柄不再是普通文件。');
65
+ }
66
+ const bytes = Buffer.alloc(stat.size);
67
+ let offset = 0;
68
+ while (offset < bytes.length) {
69
+ const read = readSync(descriptor, bytes, offset, bytes.length - offset, offset);
70
+ if (read === 0) {
71
+ break;
72
+ }
73
+ offset += read;
74
+ }
75
+ if (offset !== bytes.length) {
76
+ throw new VscodeSettingsError('无法完整读取 VS Code settings.json 并发保护句柄。');
77
+ }
78
+ return {
79
+ kind: 'file',
80
+ bytes,
81
+ revision: fileRevision(bytes),
82
+ mode: stat.mode & 0o777,
83
+ };
84
+ }
85
+ function formattingOptions(text) {
86
+ const indentation = text.match(/(?:\r?\n)([ \t]+)"/u)?.[1];
87
+ const usesTabs = indentation?.startsWith('\t') ?? false;
88
+ return {
89
+ eol: text.includes('\r\n') ? '\r\n' : '\n',
90
+ insertSpaces: !usesTabs,
91
+ tabSize: usesTabs ? 1 : Math.max(1, indentation?.length ?? 2),
92
+ };
93
+ }
94
+ function parseSettings(text) {
95
+ const errors = [];
96
+ const value = parse(text, errors, {
97
+ allowTrailingComma: true,
98
+ disallowComments: false,
99
+ });
100
+ if (errors.length > 0) {
101
+ const reason = errors
102
+ .map((error) => `${printParseErrorCode(error.error)}@${error.offset}`)
103
+ .join(', ');
104
+ throw new VscodeSettingsError(`VS Code settings.json 不是合法 JSONC (${reason}),没有覆盖原文件。`);
105
+ }
106
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
107
+ throw new VscodeSettingsError('VS Code settings.json 顶层必须是 JSONC 对象,没有覆盖原文件。');
108
+ }
109
+ assertNoDuplicateManagedSettingsKeys(text);
110
+ return value;
111
+ }
112
+ function propertyName(node) {
113
+ if (node.type !== 'property') {
114
+ return undefined;
115
+ }
116
+ const key = node.children?.[0]?.value;
117
+ return typeof key === 'string' ? key : undefined;
118
+ }
119
+ function assertNoDuplicateManagedSettingsKeys(text) {
120
+ const root = parseTree(text, [], {
121
+ allowTrailingComma: true,
122
+ disallowComments: false,
123
+ });
124
+ const seen = new Set();
125
+ for (const property of root?.children ?? []) {
126
+ const key = propertyName(property);
127
+ if (!key || !MANAGED_SETTINGS_KEYS.has(key)) {
128
+ continue;
129
+ }
130
+ if (seen.has(key)) {
131
+ throw new VscodeSettingsError(`VS Code settings.json 包含重复的 ${key},没有覆盖原文件。`);
132
+ }
133
+ seen.add(key);
134
+ }
135
+ }
136
+ function assertManagedSettingsInvariant(text, source) {
137
+ const parsed = parseSettings(text);
138
+ if (parsed['chat.plugins.enabled'] !== true) {
139
+ throw new VscodeSettingsError('候选 VS Code settings.json 未启用 chat.plugins.enabled,没有覆盖原文件。');
140
+ }
141
+ const marketplaces = parsed['chat.plugins.marketplaces'];
142
+ if (!Array.isArray(marketplaces) ||
143
+ marketplaces.some((entry) => typeof entry !== 'string') ||
144
+ !marketplaces.includes(source) ||
145
+ new Set(marketplaces).size !== marketplaces.length) {
146
+ throw new VscodeSettingsError('候选 VS Code settings.json 未满足 Marketplace 去重与来源注册约束,没有覆盖原文件。');
147
+ }
148
+ }
149
+ function jsoncCommentTokens(text) {
150
+ const scanner = createScanner(text, false);
151
+ const comments = [];
152
+ for (let token = scanner.scan(); token !== 17 /* SyntaxKind.EOF */; token = scanner.scan()) {
153
+ if (token === 12 /* SyntaxKind.LineCommentTrivia */ || token === 13 /* SyntaxKind.BlockCommentTrivia */) {
154
+ const offset = scanner.getTokenOffset();
155
+ comments.push(text.slice(offset, offset + scanner.getTokenLength()));
156
+ }
157
+ }
158
+ return comments;
159
+ }
160
+ function assertJsoncCommentsPreserved(originalText, updatedText) {
161
+ const originalComments = jsoncCommentTokens(originalText);
162
+ const updatedComments = jsoncCommentTokens(updatedText);
163
+ if (originalComments.length !== updatedComments.length ||
164
+ originalComments.some((comment, index) => updatedComments[index] !== comment)) {
165
+ throw new VscodeSettingsError('自动更新会删除、改写或重排 VS Code settings.json 中的 JSONC 注释,没有覆盖原文件。请先手工整理重复 Marketplace 项。');
166
+ }
167
+ }
168
+ function applyModification(text, path, value, format, isArrayInsertion = false) {
169
+ return applyEdits(text, modify(text, path, value, {
170
+ formattingOptions: format,
171
+ ...(isArrayInsertion ? { isArrayInsertion: true } : {}),
172
+ }));
173
+ }
174
+ function buildUpdatedSettings(originalText, source) {
175
+ const parsed = parseSettings(originalText);
176
+ const rawMarketplaces = parsed['chat.plugins.marketplaces'];
177
+ if (rawMarketplaces !== undefined &&
178
+ (!Array.isArray(rawMarketplaces) || rawMarketplaces.some((entry) => typeof entry !== 'string'))) {
179
+ throw new VscodeSettingsError('chat.plugins.marketplaces 必须是字符串数组,没有覆盖 VS Code settings.json。');
180
+ }
181
+ const format = formattingOptions(originalText);
182
+ let updated = originalText;
183
+ if (parsed['chat.plugins.enabled'] !== true) {
184
+ updated = applyModification(updated, ['chat.plugins.enabled'], true, format);
185
+ }
186
+ if (rawMarketplaces === undefined) {
187
+ updated = applyModification(updated, ['chat.plugins.marketplaces'], [source], format);
188
+ return updated;
189
+ }
190
+ const marketplaces = rawMarketplaces;
191
+ const seen = new Set();
192
+ const duplicateIndexes = [];
193
+ for (const [index, entry] of marketplaces.entries()) {
194
+ if (seen.has(entry)) {
195
+ duplicateIndexes.push(index);
196
+ }
197
+ else {
198
+ seen.add(entry);
199
+ }
200
+ }
201
+ for (const index of duplicateIndexes.sort((left, right) => right - left)) {
202
+ updated = applyModification(updated, ['chat.plugins.marketplaces', index], undefined, format);
203
+ }
204
+ if (!seen.has(source)) {
205
+ updated = applyModification(updated, ['chat.plugins.marketplaces', seen.size], source, format, true);
206
+ }
207
+ return updated;
208
+ }
209
+ function bestEffortDirectoryFsync(path) {
210
+ let descriptor;
211
+ try {
212
+ descriptor = openSync(path, 'r');
213
+ fsyncSync(descriptor);
214
+ }
215
+ catch {
216
+ // The target file has already been atomically replaced. Some platforms do not fsync directories.
217
+ }
218
+ finally {
219
+ if (descriptor !== undefined) {
220
+ closeSync(descriptor);
221
+ }
222
+ }
223
+ }
224
+ function unlinkWithPermissionRecovery(path) {
225
+ try {
226
+ unlinkSync(path);
227
+ return undefined;
228
+ }
229
+ catch (error) {
230
+ if (isMissingError(error)) {
231
+ return undefined;
232
+ }
233
+ const firstMessage = error instanceof Error ? error.message : String(error);
234
+ const parent = dirname(path);
235
+ let parentMode;
236
+ try {
237
+ parentMode = statSync(parent).mode & 0o7777;
238
+ chmodSync(parent, parentMode | 0o300);
239
+ unlinkSync(path);
240
+ chmodSync(parent, parentMode);
241
+ return undefined;
242
+ }
243
+ catch (recoveryError) {
244
+ if (parentMode !== undefined) {
245
+ try {
246
+ chmodSync(parent, parentMode);
247
+ }
248
+ catch {
249
+ // The combined cleanup error below exposes both the residual path and recovery need.
250
+ }
251
+ }
252
+ const recoveryMessage = recoveryError instanceof Error
253
+ ? recoveryError.message
254
+ : String(recoveryError);
255
+ return `${firstMessage}; 权限恢复清理失败: ${recoveryMessage}`;
256
+ }
257
+ }
258
+ }
259
+ function scrubAndCleanupTempFile(path, descriptor) {
260
+ const cleanupErrors = [];
261
+ if (descriptor !== undefined) {
262
+ try {
263
+ const descriptorStat = fstatSync(descriptor);
264
+ let pathStat;
265
+ try {
266
+ pathStat = lstatSync(path);
267
+ }
268
+ catch (error) {
269
+ if (!isMissingError(error)) {
270
+ throw error;
271
+ }
272
+ }
273
+ if (pathStat &&
274
+ pathStat.dev === descriptorStat.dev &&
275
+ pathStat.ino === descriptorStat.ino) {
276
+ ftruncateSync(descriptor, 0);
277
+ fsyncSync(descriptor);
278
+ }
279
+ }
280
+ catch (error) {
281
+ cleanupErrors.push(`候选内容清空失败: ${error instanceof Error ? error.message : String(error)}`);
282
+ }
283
+ try {
284
+ closeSync(descriptor);
285
+ }
286
+ catch (error) {
287
+ cleanupErrors.push(`候选句柄关闭失败: ${error instanceof Error ? error.message : String(error)}`);
288
+ }
289
+ }
290
+ const unlinkError = unlinkWithPermissionRecovery(path);
291
+ if (unlinkError) {
292
+ cleanupErrors.push(`临时文件删除失败: ${unlinkError}`);
293
+ }
294
+ return cleanupErrors.length > 0
295
+ ? `${cleanupErrors.join(';')}。请手工删除 ${path}`
296
+ : undefined;
297
+ }
298
+ function restoreSnapshotAtomically(settingsPath, snapshot, beforeRename) {
299
+ const parent = dirname(settingsPath);
300
+ const recoveryPath = join(parent, `.${basename(settingsPath)}.agent-plugkit-recovery-${process.pid}-${randomUUID()}.tmp`);
301
+ let descriptor;
302
+ let pendingPath = recoveryPath;
303
+ try {
304
+ descriptor = openSync(recoveryPath, 'wx', snapshot.mode);
305
+ writeFileSync(descriptor, snapshot.bytes);
306
+ fsyncSync(descriptor);
307
+ closeSync(descriptor);
308
+ descriptor = undefined;
309
+ chmodSync(recoveryPath, snapshot.mode);
310
+ beforeRename?.();
311
+ // Recovery is also an unconditional rename. A distinct inode installed after the last
312
+ // observable check can be overwritten here; TD-001 records this accepted v1 limitation.
313
+ renameSync(recoveryPath, settingsPath);
314
+ pendingPath = undefined;
315
+ bestEffortDirectoryFsync(parent);
316
+ }
317
+ finally {
318
+ if (descriptor !== undefined) {
319
+ closeSync(descriptor);
320
+ }
321
+ if (pendingPath) {
322
+ const cleanupError = unlinkWithPermissionRecovery(pendingPath);
323
+ if (cleanupError) {
324
+ throw new VscodeSettingsError(`并发内容恢复失败且恢复临时文件清理失败: ${cleanupError}。请手工删除 ${pendingPath}`);
325
+ }
326
+ }
327
+ }
328
+ }
329
+ export function resolveVscodeUserSettingsPath(options = {}) {
330
+ const platform = options.platform ?? process.platform;
331
+ const env = options.env ?? process.env;
332
+ const home = options.homeDir ?? homedir();
333
+ const pathApi = platform === 'win32' ? win32 : { isAbsolute, join };
334
+ const safeRoot = (value) => value && pathApi.isAbsolute(value) && !PATH_CONTROL_CHARACTERS.test(value)
335
+ ? value
336
+ : undefined;
337
+ const safeHome = safeRoot(home);
338
+ if (platform === 'darwin') {
339
+ return safeHome
340
+ ? pathApi.join(safeHome, 'Library', 'Application Support', 'Code', 'User', 'settings.json')
341
+ : undefined;
342
+ }
343
+ if (platform === 'linux') {
344
+ const configRoot = safeRoot(env.XDG_CONFIG_HOME) ?? (safeHome ? pathApi.join(safeHome, '.config') : undefined);
345
+ return configRoot
346
+ ? pathApi.join(configRoot, 'Code', 'User', 'settings.json')
347
+ : undefined;
348
+ }
349
+ if (platform === 'win32') {
350
+ const configRoot = safeRoot(env.APPDATA) ?? (safeHome ? pathApi.join(safeHome, 'AppData', 'Roaming') : undefined);
351
+ return configRoot
352
+ ? pathApi.join(configRoot, 'Code', 'User', 'settings.json')
353
+ : undefined;
354
+ }
355
+ return undefined;
356
+ }
357
+ export async function inspectVscodeUserSettings(processRunner, options = {}) {
358
+ const settingsPath = resolveVscodeUserSettingsPath(options);
359
+ if (!settingsPath) {
360
+ return {
361
+ status: 'unavailable',
362
+ message: '无法定位当前操作系统的 VS Code 用户 settings.json。',
363
+ };
364
+ }
365
+ if (existsSync(dirname(settingsPath))) {
366
+ return { status: 'ready', settingsPath };
367
+ }
368
+ const probe = await processRunner.run({
369
+ executable: 'code',
370
+ args: ['--help'],
371
+ captureOutput: true,
372
+ signal: options.signal,
373
+ });
374
+ if (probe.status === 'interrupted') {
375
+ return { status: 'interrupted', signal: probe.signal };
376
+ }
377
+ if (probe.status !== 'completed') {
378
+ return {
379
+ status: 'unavailable',
380
+ message: '未检测到官方 VS Code 用户目录或可确认的 code CLI。',
381
+ };
382
+ }
383
+ const banner = `${probe.stdout}\n${probe.stderr}`;
384
+ if (/cursor/iu.test(banner) || !/visual studio code/iu.test(banner)) {
385
+ return {
386
+ status: 'unavailable',
387
+ message: 'code CLI 未被确认是官方 Visual Studio Code;不会写入可能属于 Cursor 的配置。',
388
+ };
389
+ }
390
+ return { status: 'ready', settingsPath };
391
+ }
392
+ export function updateVscodeMarketplaceSettings(request, dependencies = {}) {
393
+ const settingsPath = request.settingsPath;
394
+ let tempPath;
395
+ let tempDescriptor;
396
+ let guardDescriptor;
397
+ let failure;
398
+ let cleanupFailure;
399
+ try {
400
+ if (!isAbsolute(settingsPath) || PATH_CONTROL_CHARACTERS.test(settingsPath)) {
401
+ throw new VscodeSettingsError('VS Code settings.json 必须是无控制字符的绝对用户配置路径,没有写入任何文件。');
402
+ }
403
+ const initial = readSnapshot(settingsPath);
404
+ const originalText = initial.kind === 'file'
405
+ ? decodeUtf8Losslessly(initial.bytes)
406
+ : '{}\n';
407
+ const updatedText = buildUpdatedSettings(originalText, request.source);
408
+ assertJsoncCommentsPreserved(originalText, updatedText);
409
+ assertManagedSettingsInvariant(updatedText, request.source);
410
+ if (updatedText === originalText) {
411
+ return { status: 'completed', changed: false, settingsPath };
412
+ }
413
+ const parent = dirname(settingsPath);
414
+ mkdirSync(parent, { recursive: true, mode: 0o700 });
415
+ tempPath = join(parent, `.${basename(settingsPath)}.agent-plugkit-${process.pid}-${randomUUID()}.tmp`);
416
+ const mode = initial.kind === 'file' ? initial.mode : 0o600;
417
+ const candidateBytes = Buffer.from(updatedText, 'utf8');
418
+ const candidateSnapshot = {
419
+ kind: 'file',
420
+ bytes: candidateBytes,
421
+ revision: fileRevision(candidateBytes),
422
+ mode,
423
+ };
424
+ tempDescriptor = openSync(tempPath, 'wx', mode);
425
+ writeFileSync(tempDescriptor, candidateBytes);
426
+ fsyncSync(tempDescriptor);
427
+ chmodSync(tempPath, mode);
428
+ dependencies.beforeRevisionCheck?.();
429
+ const current = readSnapshot(settingsPath);
430
+ if (!snapshotsMatch(initial, current)) {
431
+ throw new VscodeSettingsError('VS Code settings.json 在提交前发生并发变化,没有覆盖当前文件。');
432
+ }
433
+ if (initial.kind === 'file') {
434
+ guardDescriptor = openSync(settingsPath, 'r');
435
+ const guarded = readDescriptorSnapshot(guardDescriptor);
436
+ if (!snapshotsMatch(initial, guarded)) {
437
+ throw new VscodeSettingsError('VS Code settings.json 在提交保护建立时发生并发变化,没有覆盖当前文件。');
438
+ }
439
+ }
440
+ if (initial.kind === 'missing') {
441
+ try {
442
+ linkSync(tempPath, settingsPath);
443
+ }
444
+ catch (error) {
445
+ if (error?.code === 'EEXIST') {
446
+ throw new VscodeSettingsError('VS Code settings.json 在原子创建时发生并发变化,没有覆盖当前文件。');
447
+ }
448
+ throw error;
449
+ }
450
+ closeSync(tempDescriptor);
451
+ tempDescriptor = undefined;
452
+ const unlinkError = unlinkWithPermissionRecovery(tempPath);
453
+ if (unlinkError) {
454
+ throw new VscodeSettingsError(`VS Code settings.json 已原子创建,但临时链接清理失败: ${unlinkError}。请手工删除 ${tempPath}`);
455
+ }
456
+ tempPath = undefined;
457
+ }
458
+ else {
459
+ try {
460
+ // Node's rename has no revision/CAS condition. The surrounding snapshots and guard
461
+ // descriptor cover every conflict promised by REQ-004; the distinct-inode race accepted
462
+ // as TD-001 remains an explicit v1 limitation.
463
+ (dependencies.rename ?? renameSync)(tempPath, settingsPath);
464
+ tempPath = undefined;
465
+ }
466
+ catch (error) {
467
+ const message = error instanceof Error ? error.message : String(error);
468
+ throw new VscodeSettingsError(`VS Code settings.json 原子替换失败: ${message}`);
469
+ }
470
+ const committed = readSnapshot(settingsPath);
471
+ if (!snapshotsMatch(candidateSnapshot, committed)) {
472
+ throw new VscodeSettingsError('VS Code settings.json 在原子替换后发生并发变化;保留当前并发内容并停止。');
473
+ }
474
+ const displaced = guardDescriptor === undefined
475
+ ? initial
476
+ : readDescriptorSnapshot(guardDescriptor);
477
+ if (!snapshotsMatch(initial, displaced)) {
478
+ restoreSnapshotAtomically(settingsPath, displaced, dependencies.beforeRecoveryRename);
479
+ throw new VscodeSettingsError('VS Code settings.json 在 revision 检查与原子替换之间发生同 inode 并发变化;已按最佳努力恢复 guard 捕获的内容。恢复 rename 不具备 CAS,期间的新 inode 写入可能被覆盖(TD-001)。');
480
+ }
481
+ }
482
+ bestEffortDirectoryFsync(parent);
483
+ return { status: 'completed', changed: true, settingsPath };
484
+ }
485
+ catch (error) {
486
+ failure = error;
487
+ }
488
+ finally {
489
+ if (guardDescriptor !== undefined) {
490
+ closeSync(guardDescriptor);
491
+ }
492
+ if (tempPath) {
493
+ cleanupFailure = scrubAndCleanupTempFile(tempPath, tempDescriptor);
494
+ tempDescriptor = undefined;
495
+ }
496
+ else if (tempDescriptor !== undefined) {
497
+ closeSync(tempDescriptor);
498
+ }
499
+ }
500
+ return {
501
+ status: 'failed',
502
+ message: [
503
+ failure instanceof Error ? failure.message : String(failure),
504
+ cleanupFailure,
505
+ ].filter(Boolean).join(';'),
506
+ settingsPath,
507
+ };
508
+ }
509
+ //# sourceMappingURL=vscode-user-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vscode-user-settings.js","sourceRoot":"","sources":["../../src/infrastructure/vscode-user-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,SAAS,EACT,SAAS,EACT,UAAU,EACV,SAAS,EACT,aAAa,EACb,SAAS,EACT,QAAQ,EACR,SAAS,EACT,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,UAAU,EACV,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EACL,UAAU,EACV,aAAa,EACb,MAAM,EACN,KAAK,EACL,SAAS,EACT,mBAAmB,GAKpB,MAAM,cAAc,CAAC;AAkEtB,MAAM,mBAAoB,SAAQ,KAAK;IACrC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,sBAAsB;IACtB,2BAA2B;CAC5B,CAAC,CAAC;AACH,MAAM,uBAAuB,GAAG,+BAA+B,CAAC;AAEhE,SAAS,cAAc,CAAC,KAAc;IACpC,OAAQ,KAA2C,EAAE,IAAI,KAAK,QAAQ,CAAC;AACzE,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,mBAAmB,CAC3B,kDAAkD,CACnD,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,IAAI,CAAC;IACT,IAAI,CAAC;QACH,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC7B,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,mBAAmB,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,KAAK;QACL,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC;QAC7B,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,KAAK;KACxB,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,QAA2B,EAAE,MAAyB;IAC5E,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,QAAQ,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC;AAChF,CAAC;AAED,SAAS,sBAAsB,CAAC,UAAkB;IAChD,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IACnC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,mBAAmB,CAAC,sCAAsC,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC;QAChF,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,MAAM;QACR,CAAC;QACD,MAAM,IAAI,IAAI,CAAC;IACjB,CAAC;IACD,IAAI,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,IAAI,mBAAmB,CAAC,sCAAsC,CAAC,CAAC;IACxE,CAAC;IACD,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,KAAK;QACL,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC;QAC7B,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,KAAK;KACxB,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,WAAW,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;IACxD,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;QAC1C,YAAY,EAAE,CAAC,QAAQ;QACvB,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC,CAAC;KAC9D,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE;QAChC,kBAAkB,EAAE,IAAI;QACxB,gBAAgB,EAAE,KAAK;KACxB,CAAY,CAAC;IACd,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,MAAM;aAClB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;aACrE,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,mBAAmB,CAAC,qCAAqC,MAAM,YAAY,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,mBAAmB,CAAC,+CAA+C,CAAC,CAAC;IACjF,CAAC;IACD,oCAAoC,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,KAAgC,CAAC;AAC1C,CAAC;AAED,SAAS,YAAY,CAAC,IAAU;IAC9B,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;IACtC,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACnD,CAAC;AAED,SAAS,oCAAoC,CAAC,IAAY;IACxD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE;QAC/B,kBAAkB,EAAE,IAAI;QACxB,gBAAgB,EAAE,KAAK;KACxB,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,QAAQ,IAAI,IAAI,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5C,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,MAAM,IAAI,mBAAmB,CAC3B,+BAA+B,GAAG,WAAW,CAC9C,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,8BAA8B,CAAC,IAAY,EAAE,MAAc;IAClE,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,MAAM,CAAC,sBAAsB,CAAC,KAAK,IAAI,EAAE,CAAC;QAC5C,MAAM,IAAI,mBAAmB,CAC3B,4DAA4D,CAC7D,CAAC;IACJ,CAAC;IACD,MAAM,YAAY,GAAG,MAAM,CAAC,2BAA2B,CAAC,CAAC;IACzD,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;QAC5B,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;QACvD,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC9B,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,MAAM,EAClD,CAAC;QACD,MAAM,IAAI,mBAAmB,CAC3B,6DAA6D,CAC9D,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,IAAI,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,4BAAmB,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAClF,IAAI,KAAK,0CAAiC,IAAI,KAAK,2CAAkC,EAAE,CAAC;YACtF,MAAM,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YACxC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,4BAA4B,CAAC,YAAoB,EAAE,WAAmB;IAC7E,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAC1D,MAAM,eAAe,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACxD,IACE,gBAAgB,CAAC,MAAM,KAAK,eAAe,CAAC,MAAM;QAClD,gBAAgB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,EAC7E,CAAC;QACD,MAAM,IAAI,mBAAmB,CAC3B,iFAAiF,CAClF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CACxB,IAAY,EACZ,IAAyB,EACzB,KAAc,EACd,MAAyB,EACzB,gBAAgB,GAAG,KAAK;IAExB,OAAO,UAAU,CACf,IAAI,EACJ,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE;QACxB,iBAAiB,EAAE,MAAM;QACzB,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxD,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,YAAoB,EAAE,MAAc;IAChE,MAAM,MAAM,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IAC3C,MAAM,eAAe,GAAG,MAAM,CAAC,2BAA2B,CAAC,CAAC;IAC5D,IACE,eAAe,KAAK,SAAS;QAC7B,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,EAC/F,CAAC;QACD,MAAM,IAAI,mBAAmB,CAC3B,gEAAgE,CACjE,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC/C,IAAI,OAAO,GAAG,YAAY,CAAC;IAC3B,IAAI,MAAM,CAAC,sBAAsB,CAAC,KAAK,IAAI,EAAE,CAAC;QAC5C,OAAO,GAAG,iBAAiB,CAAC,OAAO,EAAE,CAAC,sBAAsB,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,GAAG,iBAAiB,CAAC,OAAO,EAAE,CAAC,2BAA2B,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QACtF,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,YAAY,GAAG,eAA2B,CAAC;IACjD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,gBAAgB,GAAa,EAAE,CAAC;IACtC,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;QACpD,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC;QACzE,OAAO,GAAG,iBAAiB,CAAC,OAAO,EAAE,CAAC,2BAA2B,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,OAAO,GAAG,iBAAiB,CACzB,OAAO,EACP,CAAC,2BAA2B,EAAE,IAAI,CAAC,IAAI,CAAC,EACxC,MAAM,EACN,MAAM,EACN,IAAI,CACL,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,wBAAwB,CAAC,IAAY;IAC5C,IAAI,UAA8B,CAAC;IACnC,IAAI,CAAC;QACH,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACjC,SAAS,CAAC,UAAU,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,iGAAiG;IACnG,CAAC;YAAS,CAAC;QACT,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,SAAS,CAAC,UAAU,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,4BAA4B,CAAC,IAAY;IAChD,IAAI,CAAC;QACH,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,UAA8B,CAAC;QACnC,IAAI,CAAC;YACH,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC;YAC5C,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,KAAK,CAAC,CAAC;YACtC,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YAC9B,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,aAAa,EAAE,CAAC;YACvB,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,IAAI,CAAC;oBACH,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;gBAChC,CAAC;gBAAC,MAAM,CAAC;oBACP,qFAAqF;gBACvF,CAAC;YACH,CAAC;YACD,MAAM,eAAe,GAAG,aAAa,YAAY,KAAK;gBACpD,CAAC,CAAC,aAAa,CAAC,OAAO;gBACvB,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAC1B,OAAO,GAAG,YAAY,eAAe,eAAe,EAAE,CAAC;QACzD,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAY,EAAE,UAA8B;IAC3E,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;YAC7C,IAAI,QAAQ,CAAC;YACb,IAAI,CAAC;gBACH,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC3B,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;YACD,IACE,QAAQ;gBACR,QAAQ,CAAC,GAAG,KAAK,cAAc,CAAC,GAAG;gBACnC,QAAQ,CAAC,GAAG,KAAK,cAAc,CAAC,GAAG,EACnC,CAAC;gBACD,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBAC7B,SAAS,CAAC,UAAU,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAChB,aAAa,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACtE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,SAAS,CAAC,UAAU,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAChB,aAAa,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACtE,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,WAAW,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,WAAW,EAAE,CAAC;QAChB,aAAa,CAAC,IAAI,CAAC,aAAa,WAAW,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,aAAa,CAAC,MAAM,GAAG,CAAC;QAC7B,CAAC,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE;QAC5C,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,yBAAyB,CAChC,YAAoB,EACpB,QAAsB,EACtB,YAAyB;IAEzB,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACrC,MAAM,YAAY,GAAG,IAAI,CACvB,MAAM,EACN,IAAI,QAAQ,CAAC,YAAY,CAAC,2BAA2B,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,MAAM,CACvF,CAAC;IACF,IAAI,UAA8B,CAAC;IACnC,IAAI,WAAW,GAAuB,YAAY,CAAC;IACnD,IAAI,CAAC;QACH,UAAU,GAAG,QAAQ,CAAC,YAAY,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QACzD,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC1C,SAAS,CAAC,UAAU,CAAC,CAAC;QACtB,SAAS,CAAC,UAAU,CAAC,CAAC;QACtB,UAAU,GAAG,SAAS,CAAC;QACvB,SAAS,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QACvC,YAAY,EAAE,EAAE,CAAC;QACjB,sFAAsF;QACtF,wFAAwF;QACxF,UAAU,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QACvC,WAAW,GAAG,SAAS,CAAC;QACxB,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;YAAS,CAAC;QACT,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,SAAS,CAAC,UAAU,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,YAAY,GAAG,4BAA4B,CAAC,WAAW,CAAC,CAAC;YAC/D,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,IAAI,mBAAmB,CAC3B,wBAAwB,YAAY,UAAU,WAAW,EAAE,CAC5D,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,UAA4C,EAAE;IAE9C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IACtD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACpE,MAAM,QAAQ,GAAG,CAAC,KAAyB,EAAsB,EAAE,CACjE,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC;QACxE,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,QAAQ;YACb,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC;YAC3F,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC/G,OAAO,UAAU;YACf,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC;YAC3D,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAClH,OAAO,UAAU;YACf,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC;YAC3D,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,aAA4B,EAC5B,UAA4C,EAAE;IAE9C,MAAM,YAAY,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;IAC5D,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE,uCAAuC;SACjD,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IAC3C,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC;QACpC,UAAU,EAAE,MAAM;QAClB,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,aAAa,EAAE,IAAI;QACnB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;QACnC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IACzD,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACjC,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE,oCAAoC;SAC9C,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;IAClD,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACpE,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE,0DAA0D;SACpE,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,OAAoC,EACpC,eAAiD,EAAE;IAEnD,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC1C,IAAI,QAA4B,CAAC;IACjC,IAAI,cAAkC,CAAC;IACvC,IAAI,eAAmC,CAAC;IACxC,IAAI,OAAgB,CAAC;IACrB,IAAI,cAAkC,CAAC;IACvC,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,uBAAuB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5E,MAAM,IAAI,mBAAmB,CAC3B,mDAAmD,CACpD,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;QAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,KAAK,MAAM;YAC1C,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC;YACrC,CAAC,CAAC,MAAM,CAAC;QACX,MAAM,WAAW,GAAG,oBAAoB,CAAC,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACvE,4BAA4B,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QACxD,8BAA8B,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5D,IAAI,WAAW,KAAK,YAAY,EAAE,CAAC;YACjC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QAC/D,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;QACrC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACpD,QAAQ,GAAG,IAAI,CACb,MAAM,EACN,IAAI,QAAQ,CAAC,YAAY,CAAC,kBAAkB,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,MAAM,CAC9E,CAAC;QACF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QAC5D,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACxD,MAAM,iBAAiB,GAAiB;YACtC,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,cAAc;YACrB,QAAQ,EAAE,YAAY,CAAC,cAAc,CAAC;YACtC,IAAI;SACL,CAAC;QACF,cAAc,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAChD,aAAa,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;QAC9C,SAAS,CAAC,cAAc,CAAC,CAAC;QAC1B,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAE1B,YAAY,CAAC,mBAAmB,EAAE,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;QAC3C,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,mBAAmB,CAC3B,4CAA4C,CAC7C,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5B,eAAe,GAAG,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,sBAAsB,CAAC,eAAe,CAAC,CAAC;YACxD,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;gBACtC,MAAM,IAAI,mBAAmB,CAC3B,gDAAgD,CACjD,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACnC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAK,KAA2C,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACpE,MAAM,IAAI,mBAAmB,CAC3B,8CAA8C,CAC/C,CAAC;gBACJ,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;YACD,SAAS,CAAC,cAAc,CAAC,CAAC;YAC1B,cAAc,GAAG,SAAS,CAAC;YAC3B,MAAM,WAAW,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;YAC3D,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,IAAI,mBAAmB,CAC3B,0CAA0C,WAAW,UAAU,QAAQ,EAAE,CAC1E,CAAC;YACJ,CAAC;YACD,QAAQ,GAAG,SAAS,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,mFAAmF;gBACnF,wFAAwF;gBACxF,+CAA+C;gBAC/C,CAAC,YAAY,CAAC,MAAM,IAAI,UAAU,CAAC,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;gBAC5D,QAAQ,GAAG,SAAS,CAAC;YACvB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,MAAM,IAAI,mBAAmB,CAAC,iCAAiC,OAAO,EAAE,CAAC,CAAC;YAC5E,CAAC;YAED,MAAM,SAAS,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;YAC7C,IAAI,CAAC,cAAc,CAAC,iBAAiB,EAAE,SAAS,CAAC,EAAE,CAAC;gBAClD,MAAM,IAAI,mBAAmB,CAC3B,iDAAiD,CAClD,CAAC;YACJ,CAAC;YACD,MAAM,SAAS,GAAG,eAAe,KAAK,SAAS;gBAC7C,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,sBAAsB,CAAC,eAAe,CAAC,CAAC;YAC5C,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;gBACxC,yBAAyB,CACvB,YAAY,EACZ,SAAS,EACT,YAAY,CAAC,oBAAoB,CAClC,CAAC;gBACF,MAAM,IAAI,mBAAmB,CAC3B,6HAA6H,CAC9H,CAAC;YACJ,CAAC;QACH,CAAC;QACD,wBAAwB,CAAC,MAAM,CAAC,CAAC;QACjC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YAClC,SAAS,CAAC,eAAe,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,QAAQ,EAAE,CAAC;YACb,cAAc,GAAG,uBAAuB,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;YACnE,cAAc,GAAG,SAAS,CAAC;QAC7B,CAAC;aAAM,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACxC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO;QACL,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE;YACP,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YAC5D,cAAc;SACf,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC3B,YAAY;KACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * plugin.yaml JSON Schema 定义
3
+ *
4
+ * 这是 marketplace 的核心数据模型。所有 plugin.yaml 都必须符合此 schema。
5
+ * 生成 Agent Plugins portable 与平台原生产物时,也基于此 schema 做字段映射。
6
+ */
7
+ import type { JSONSchemaType } from 'ajv';
8
+ export interface PluginSkill {
9
+ name: string;
10
+ path: string;
11
+ description?: string;
12
+ 'argument-hint'?: string;
13
+ }
14
+ interface PluginMcpBase {
15
+ name: string;
16
+ description?: string;
17
+ }
18
+ export interface PluginMcpStdio extends PluginMcpBase {
19
+ type?: 'stdio';
20
+ command: string;
21
+ args?: string[];
22
+ env?: Record<string, string>;
23
+ cwd?: string;
24
+ }
25
+ export interface PluginMcpRemote extends PluginMcpBase {
26
+ type: 'streamable-http' | 'sse';
27
+ url: string;
28
+ headers?: Record<string, string>;
29
+ }
30
+ export type PluginMcp = PluginMcpStdio | PluginMcpRemote;
31
+ export type PluginLspTransport = 'stdio' | 'socket';
32
+ export interface PluginLsp {
33
+ name: string;
34
+ command: string;
35
+ args?: string[] | null;
36
+ env?: Record<string, string> | null;
37
+ transport?: PluginLspTransport | null;
38
+ extensionToLanguage: Record<string, string>;
39
+ workspaceFolder?: string | null;
40
+ startupTimeout?: number | null;
41
+ maxRestarts?: number | null;
42
+ diagnostics?: boolean | null;
43
+ }
44
+ export interface PluginHook {
45
+ event: string;
46
+ pattern?: string;
47
+ command: string;
48
+ timeout?: number;
49
+ }
50
+ export interface PluginAuthor {
51
+ name: string;
52
+ email?: string;
53
+ url?: string;
54
+ }
55
+ export interface CodexInterface {
56
+ displayName?: string;
57
+ shortDescription?: string;
58
+ longDescription?: string;
59
+ category?: string;
60
+ developerName?: string;
61
+ capabilities?: string[];
62
+ defaultPrompt?: string[];
63
+ }
64
+ export interface PlatformOverrides {
65
+ codex?: {
66
+ interface?: CodexInterface;
67
+ };
68
+ }
69
+ export interface PluginComponents {
70
+ skills?: PluginSkill[];
71
+ mcp?: PluginMcp[];
72
+ lsp?: PluginLsp[];
73
+ hooks?: PluginHook[];
74
+ }
75
+ export interface PluginYaml {
76
+ name: string;
77
+ version: string;
78
+ description: string;
79
+ author: PluginAuthor;
80
+ homepage?: string;
81
+ repository?: string;
82
+ license?: string;
83
+ category?: string;
84
+ tags?: string[];
85
+ components: PluginComponents;
86
+ platform?: PlatformOverrides;
87
+ }
88
+ export declare const pluginYamlSchema: JSONSchemaType<PluginYaml>;
89
+ export {};