@radkode/neo 1.4.0 → 1.7.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 (121) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +15 -112
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/ai/index.d.ts +3 -0
  5. package/dist/commands/ai/index.d.ts.map +1 -0
  6. package/dist/commands/ai/index.js +21 -0
  7. package/dist/commands/ai/index.js.map +1 -0
  8. package/dist/commands/ai/pr/index.d.ts +19 -0
  9. package/dist/commands/ai/pr/index.d.ts.map +1 -0
  10. package/dist/commands/ai/pr/index.js +225 -0
  11. package/dist/commands/ai/pr/index.js.map +1 -0
  12. package/dist/commands/doctor/index.d.ts +16 -0
  13. package/dist/commands/doctor/index.d.ts.map +1 -0
  14. package/dist/commands/doctor/index.js +313 -0
  15. package/dist/commands/doctor/index.js.map +1 -0
  16. package/dist/commands/git/push/index.d.ts.map +1 -1
  17. package/dist/commands/git/push/index.js +3 -0
  18. package/dist/commands/git/push/index.js.map +1 -1
  19. package/dist/commands/index.d.ts +3 -0
  20. package/dist/commands/index.d.ts.map +1 -1
  21. package/dist/commands/index.js +9 -0
  22. package/dist/commands/index.js.map +1 -1
  23. package/dist/commands/init/index.d.ts.map +1 -1
  24. package/dist/commands/init/index.js +29 -0
  25. package/dist/commands/init/index.js.map +1 -1
  26. package/dist/commands/work/finish/index.d.ts +22 -0
  27. package/dist/commands/work/finish/index.d.ts.map +1 -0
  28. package/dist/commands/work/finish/index.js +306 -0
  29. package/dist/commands/work/finish/index.js.map +1 -0
  30. package/dist/commands/work/index.d.ts +3 -0
  31. package/dist/commands/work/index.d.ts.map +1 -0
  32. package/dist/commands/work/index.js +33 -0
  33. package/dist/commands/work/index.js.map +1 -0
  34. package/dist/commands/work/ship/index.d.ts +27 -0
  35. package/dist/commands/work/ship/index.d.ts.map +1 -0
  36. package/dist/commands/work/ship/index.js +361 -0
  37. package/dist/commands/work/ship/index.js.map +1 -0
  38. package/dist/commands/work/start/index.d.ts +17 -0
  39. package/dist/commands/work/start/index.d.ts.map +1 -0
  40. package/dist/commands/work/start/index.js +250 -0
  41. package/dist/commands/work/start/index.js.map +1 -0
  42. package/dist/core/errors/index.d.ts +7 -129
  43. package/dist/core/errors/index.d.ts.map +1 -1
  44. package/dist/core/errors/index.js +0 -233
  45. package/dist/core/errors/index.js.map +1 -1
  46. package/dist/services/ai/index.d.ts +9 -1
  47. package/dist/services/ai/index.d.ts.map +1 -1
  48. package/dist/services/ai/index.js +23 -3
  49. package/dist/services/ai/index.js.map +1 -1
  50. package/dist/services/ai/pr-prompts.d.ts +17 -0
  51. package/dist/services/ai/pr-prompts.d.ts.map +1 -0
  52. package/dist/services/ai/pr-prompts.js +68 -0
  53. package/dist/services/ai/pr-prompts.js.map +1 -0
  54. package/dist/services/ai/prompts.d.ts +3 -2
  55. package/dist/services/ai/prompts.d.ts.map +1 -1
  56. package/dist/services/ai/prompts.js.map +1 -1
  57. package/dist/storage/db.d.ts +5 -3
  58. package/dist/storage/db.d.ts.map +1 -1
  59. package/dist/storage/db.js +87 -120
  60. package/dist/storage/db.js.map +1 -1
  61. package/dist/types/agent.d.ts +0 -8
  62. package/dist/types/agent.d.ts.map +1 -1
  63. package/dist/types/schemas.d.ts +1 -0
  64. package/dist/types/schemas.d.ts.map +1 -1
  65. package/dist/types/schemas.js +1 -0
  66. package/dist/types/schemas.js.map +1 -1
  67. package/dist/utils/agent.js +1 -1
  68. package/dist/utils/agent.js.map +1 -1
  69. package/dist/utils/config.d.ts +0 -6
  70. package/dist/utils/config.d.ts.map +1 -1
  71. package/dist/utils/config.js +0 -8
  72. package/dist/utils/config.js.map +1 -1
  73. package/dist/utils/logger.d.ts +8 -2
  74. package/dist/utils/logger.d.ts.map +1 -1
  75. package/dist/utils/logger.js +8 -1
  76. package/dist/utils/logger.js.map +1 -1
  77. package/dist/utils/prompt.d.ts.map +1 -1
  78. package/dist/utils/prompt.js +15 -11
  79. package/dist/utils/prompt.js.map +1 -1
  80. package/dist/utils/skill-installer.d.ts +10 -0
  81. package/dist/utils/skill-installer.d.ts.map +1 -0
  82. package/dist/utils/skill-installer.js +56 -0
  83. package/dist/utils/skill-installer.js.map +1 -0
  84. package/package.json +6 -13
  85. package/templates/skills/neo/SKILL.md +66 -0
  86. package/dist/core/container/index.d.ts +0 -27
  87. package/dist/core/container/index.d.ts.map +0 -1
  88. package/dist/core/container/index.js +0 -90
  89. package/dist/core/container/index.js.map +0 -1
  90. package/dist/core/interfaces/index.d.ts +0 -324
  91. package/dist/core/interfaces/index.d.ts.map +0 -1
  92. package/dist/core/interfaces/index.js +0 -19
  93. package/dist/core/interfaces/index.js.map +0 -1
  94. package/dist/core/plugins/command-registry.d.ts +0 -16
  95. package/dist/core/plugins/command-registry.d.ts.map +0 -1
  96. package/dist/core/plugins/command-registry.js +0 -40
  97. package/dist/core/plugins/command-registry.js.map +0 -1
  98. package/dist/core/plugins/event-bus.d.ts +0 -12
  99. package/dist/core/plugins/event-bus.d.ts.map +0 -1
  100. package/dist/core/plugins/event-bus.js +0 -56
  101. package/dist/core/plugins/event-bus.js.map +0 -1
  102. package/dist/core/plugins/index.d.ts +0 -6
  103. package/dist/core/plugins/index.d.ts.map +0 -1
  104. package/dist/core/plugins/index.js +0 -6
  105. package/dist/core/plugins/index.js.map +0 -1
  106. package/dist/core/plugins/plugin-context.d.ts +0 -3
  107. package/dist/core/plugins/plugin-context.d.ts.map +0 -1
  108. package/dist/core/plugins/plugin-context.js +0 -116
  109. package/dist/core/plugins/plugin-context.js.map +0 -1
  110. package/dist/core/plugins/plugin-loader.d.ts +0 -30
  111. package/dist/core/plugins/plugin-loader.d.ts.map +0 -1
  112. package/dist/core/plugins/plugin-loader.js +0 -149
  113. package/dist/core/plugins/plugin-loader.js.map +0 -1
  114. package/dist/core/plugins/plugin-registry.d.ts +0 -21
  115. package/dist/core/plugins/plugin-registry.d.ts.map +0 -1
  116. package/dist/core/plugins/plugin-registry.js +0 -150
  117. package/dist/core/plugins/plugin-registry.js.map +0 -1
  118. package/dist/utils/ui-examples.d.ts +0 -3
  119. package/dist/utils/ui-examples.d.ts.map +0 -1
  120. package/dist/utils/ui-examples.js +0 -188
  121. package/dist/utils/ui-examples.js.map +0 -1
@@ -0,0 +1,306 @@
1
+ import { Command } from '@commander-js/extra-typings';
2
+ import { execa } from 'execa';
3
+ import { access } from 'node:fs/promises';
4
+ import { ui } from '../../../utils/ui.js';
5
+ import { emitJson } from '../../../utils/output.js';
6
+ import { runAction } from '../../../utils/run-action.js';
7
+ import { GitErrors, isNotGitRepository, isAuthenticationError, isNetworkError, } from '../../../utils/git-errors.js';
8
+ import { isAgentInitialized, getAgentDbPath } from '../../../utils/agent.js';
9
+ import { ContextDB } from '../../../storage/db.js';
10
+ async function pathExists(p) {
11
+ try {
12
+ await access(p);
13
+ return true;
14
+ }
15
+ catch {
16
+ return false;
17
+ }
18
+ }
19
+ async function detectDefaultBranch() {
20
+ try {
21
+ const { stdout } = await execa('git', ['symbolic-ref', 'refs/remotes/origin/HEAD']);
22
+ return stdout.replace('refs/remotes/origin/', '').trim();
23
+ }
24
+ catch {
25
+ for (const name of ['main', 'master']) {
26
+ try {
27
+ await execa('git', ['show-ref', '--verify', '--quiet', `refs/remotes/origin/${name}`]);
28
+ return name;
29
+ }
30
+ catch {
31
+ continue;
32
+ }
33
+ }
34
+ throw new Error('Could not detect default branch. Pass --base <name>, or run `git remote set-head origin --auto`.');
35
+ }
36
+ }
37
+ async function getCurrentBranch() {
38
+ const { stdout } = await execa('git', ['branch', '--show-current']);
39
+ return stdout.trim();
40
+ }
41
+ async function hasUncommittedChanges() {
42
+ const { stdout } = await execa('git', ['status', '--porcelain']);
43
+ return stdout.trim().length > 0;
44
+ }
45
+ async function branchExistsLocally(branch) {
46
+ try {
47
+ await execa('git', ['show-ref', '--verify', '--quiet', `refs/heads/${branch}`]);
48
+ return true;
49
+ }
50
+ catch {
51
+ return false;
52
+ }
53
+ }
54
+ async function ghInstalled() {
55
+ try {
56
+ await execa('gh', ['--version'], { stdio: ['ignore', 'pipe', 'pipe'] });
57
+ return true;
58
+ }
59
+ catch {
60
+ return false;
61
+ }
62
+ }
63
+ async function queryPrMerged(branch) {
64
+ if (!(await ghInstalled()))
65
+ return null;
66
+ try {
67
+ const { stdout } = await execa('gh', ['pr', 'list', '--head', branch, '--state', 'all', '--json', 'state,url', '--limit', '1'], { stdio: ['ignore', 'pipe', 'pipe'] });
68
+ const parsed = JSON.parse(stdout);
69
+ const first = parsed[0];
70
+ if (!first)
71
+ return null;
72
+ return {
73
+ merged: first.state === 'MERGED',
74
+ url: first.url ?? '',
75
+ };
76
+ }
77
+ catch {
78
+ return null;
79
+ }
80
+ }
81
+ async function isBranchAncestorOfBase(branch, base) {
82
+ try {
83
+ await execa('git', ['merge-base', '--is-ancestor', branch, `origin/${base}`]);
84
+ return true;
85
+ }
86
+ catch {
87
+ return false;
88
+ }
89
+ }
90
+ async function findWorktreePath(branch) {
91
+ try {
92
+ const { stdout } = await execa('git', ['worktree', 'list', '--porcelain']);
93
+ let currentPath = null;
94
+ for (const line of stdout.split('\n')) {
95
+ if (line.startsWith('worktree ')) {
96
+ currentPath = line.slice('worktree '.length).trim();
97
+ }
98
+ else if (line.startsWith('branch refs/heads/')) {
99
+ const name = line.slice('branch refs/heads/'.length).trim();
100
+ if (name === branch && currentPath)
101
+ return currentPath;
102
+ }
103
+ else if (line.trim() === '') {
104
+ currentPath = null;
105
+ }
106
+ }
107
+ return null;
108
+ }
109
+ catch {
110
+ return null;
111
+ }
112
+ }
113
+ async function markWorkItemDone(branch) {
114
+ if (!(await isAgentInitialized()))
115
+ return false;
116
+ const dbPath = await getAgentDbPath();
117
+ if (!dbPath)
118
+ return false;
119
+ let db = null;
120
+ try {
121
+ db = await ContextDB.create(dbPath);
122
+ const items = db.listContexts({ tag: `branch:${branch}` });
123
+ const workItem = items.find((it) => it.tags.includes('work-item'));
124
+ if (!workItem)
125
+ return false;
126
+ const nextTags = workItem.tags
127
+ .filter((t) => t !== 'active')
128
+ .concat(workItem.tags.includes('done') ? [] : ['done']);
129
+ db.updateContext(workItem.id, { tags: nextTags, priority: 'low' });
130
+ return true;
131
+ }
132
+ catch {
133
+ return false;
134
+ }
135
+ finally {
136
+ db?.close();
137
+ }
138
+ }
139
+ export async function executeWorkFinish(branchArg, options) {
140
+ try {
141
+ await execa('git', ['rev-parse', '--is-inside-work-tree']);
142
+ }
143
+ catch (error) {
144
+ if (isNotGitRepository(error))
145
+ throw GitErrors.notARepository('work finish');
146
+ throw GitErrors.unknown('work finish', error);
147
+ }
148
+ const base = options.base ?? (await detectDefaultBranch());
149
+ const currentBranch = await getCurrentBranch();
150
+ const branch = branchArg?.trim() || currentBranch;
151
+ if (!branch) {
152
+ throw new Error('No branch specified and HEAD is detached. Pass a branch name.');
153
+ }
154
+ if (branch === base) {
155
+ throw new Error(`Refusing to delete base branch "${base}".`);
156
+ }
157
+ if (!(await branchExistsLocally(branch))) {
158
+ throw new Error(`Branch "${branch}" does not exist locally.`);
159
+ }
160
+ if (currentBranch === branch && (await hasUncommittedChanges()) && !options.force) {
161
+ throw new Error('You have uncommitted changes on the branch being finished. Commit/stash first, or pass --force to override.');
162
+ }
163
+ const prInfo = await queryPrMerged(branch);
164
+ let mergedOnRemote = null;
165
+ if (prInfo) {
166
+ mergedOnRemote = prInfo.merged;
167
+ }
168
+ else {
169
+ mergedOnRemote = (await isBranchAncestorOfBase(branch, base)) ? true : null;
170
+ }
171
+ if (mergedOnRemote === false && !options.force) {
172
+ throw new Error(`PR for ${branch} is not merged${prInfo?.url ? ` (${prInfo.url})` : ''}. Pass --force to finish anyway.`);
173
+ }
174
+ if (mergedOnRemote === null && !options.force) {
175
+ throw new Error(`Could not confirm ${branch} is merged (no PR found and not an ancestor of origin/${base}). Pass --force to finish anyway.`);
176
+ }
177
+ if (currentBranch === branch) {
178
+ const switchSpinner = ui.spinner(`Switching to ${base}`);
179
+ switchSpinner.start();
180
+ try {
181
+ await execa('git', ['checkout', base]);
182
+ switchSpinner.succeed(`Switched to ${base}`);
183
+ }
184
+ catch (error) {
185
+ switchSpinner.fail(`Failed to switch to ${base}`);
186
+ throw GitErrors.unknown('work finish', error);
187
+ }
188
+ }
189
+ let pulled = false;
190
+ if (options.pull !== false) {
191
+ const pullSpinner = ui.spinner(`Pulling ${base}`);
192
+ pullSpinner.start();
193
+ try {
194
+ await execa('git', ['pull', '--ff-only', 'origin', base]);
195
+ pullSpinner.succeed(`Pulled ${base}`);
196
+ pulled = true;
197
+ }
198
+ catch (error) {
199
+ pullSpinner.fail(`Pull failed for ${base}`);
200
+ if (isAuthenticationError(error))
201
+ throw GitErrors.authenticationFailed('work finish');
202
+ if (isNetworkError(error))
203
+ throw GitErrors.networkError('work finish');
204
+ throw GitErrors.unknown('work finish', error);
205
+ }
206
+ }
207
+ let worktreeRemoved = false;
208
+ let worktreePath;
209
+ if (options.keepWorktree !== true) {
210
+ const wt = await findWorktreePath(branch);
211
+ if (wt && (await pathExists(wt))) {
212
+ worktreePath = wt;
213
+ const wtSpinner = ui.spinner(`Removing worktree ${wt}`);
214
+ wtSpinner.start();
215
+ try {
216
+ await execa('git', ['worktree', 'remove', wt, '--force']);
217
+ wtSpinner.succeed(`Removed worktree ${wt}`);
218
+ worktreeRemoved = true;
219
+ }
220
+ catch (error) {
221
+ wtSpinner.fail(`Failed to remove worktree ${wt}`);
222
+ throw GitErrors.unknown('work finish', error);
223
+ }
224
+ }
225
+ }
226
+ const delSpinner = ui.spinner(`Deleting local branch ${branch}`);
227
+ delSpinner.start();
228
+ let branchDeleted = false;
229
+ try {
230
+ await execa('git', ['branch', '-D', branch]);
231
+ delSpinner.succeed(`Deleted ${branch}`);
232
+ branchDeleted = true;
233
+ }
234
+ catch (error) {
235
+ delSpinner.fail(`Failed to delete ${branch}`);
236
+ throw GitErrors.unknown('work finish', error);
237
+ }
238
+ const contextUpdated = await markWorkItemDone(branch);
239
+ const result = {
240
+ branch,
241
+ base,
242
+ mergedOnRemote,
243
+ branchDeleted,
244
+ worktreeRemoved,
245
+ pulled,
246
+ contextUpdated,
247
+ };
248
+ if (prInfo?.url)
249
+ result.prUrl = prInfo.url;
250
+ if (worktreePath !== undefined)
251
+ result.worktreePath = worktreePath;
252
+ return result;
253
+ }
254
+ export function createWorkFinishCommand() {
255
+ const command = new Command('finish');
256
+ command
257
+ .description('After a PR merges: switch to base, pull, delete the local branch, remove any worktree')
258
+ .argument('[branch]', 'branch to finish (default: current branch)')
259
+ .option('--base <branch>', 'base branch (default: origin HEAD)')
260
+ .option('--force', 'finish even if PR is not merged or cannot be confirmed')
261
+ .option('--no-pull', 'do not pull the base branch after switching')
262
+ .option('--keep-worktree', 'leave the associated worktree in place')
263
+ .addHelpText('after', `
264
+ Examples:
265
+ After your PR merged, from the feature branch:
266
+ $ neo work finish
267
+
268
+ Finish another branch without switching to it:
269
+ $ neo work finish jacek/old-feature
270
+
271
+ Agent-friendly:
272
+ $ neo work finish --yes --json
273
+
274
+ Force finish an unmerged branch (e.g. abandoned):
275
+ $ neo work finish --force
276
+ `)
277
+ .action(runAction(async (branchArg, options) => {
278
+ const result = await executeWorkFinish(branchArg, options);
279
+ emitJson({
280
+ ok: true,
281
+ command: 'work finish',
282
+ branch: result.branch,
283
+ base: result.base,
284
+ mergedOnRemote: result.mergedOnRemote,
285
+ prUrl: result.prUrl,
286
+ branchDeleted: result.branchDeleted,
287
+ worktreeRemoved: result.worktreeRemoved,
288
+ worktreePath: result.worktreePath,
289
+ pulled: result.pulled,
290
+ contextUpdated: result.contextUpdated,
291
+ }, {
292
+ text: () => {
293
+ ui.newline();
294
+ ui.success(`Finished ${result.branch} → on ${result.base}`);
295
+ if (result.worktreeRemoved && result.worktreePath) {
296
+ ui.muted(`Removed worktree: ${result.worktreePath}`);
297
+ }
298
+ if (result.contextUpdated) {
299
+ ui.muted('Marked work item as done in agent context DB');
300
+ }
301
+ },
302
+ });
303
+ }));
304
+ return command;
305
+ }
306
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/work/finish/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from '@commander-js/extra-typings';
2
+ export declare function createWorkCommand(): Command;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/work/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAKtD,wBAAgB,iBAAiB,IAAI,OAAO,CAiC3C"}
@@ -0,0 +1,33 @@
1
+ import { Command } from '@commander-js/extra-typings';
2
+ import { createWorkStartCommand } from '../work/start/index.js';
3
+ import { createWorkShipCommand } from '../work/ship/index.js';
4
+ import { createWorkFinishCommand } from '../work/finish/index.js';
5
+ export function createWorkCommand() {
6
+ const command = new Command('work');
7
+ command
8
+ .description('Workflow commands: start, ship, and finish a piece of work')
9
+ .addHelpText('after', `
10
+ Subcommands:
11
+ start <name> Create a new prefixed branch (optionally in a worktree)
12
+ ship Verify + ensure changeset + push + open PR for the current branch
13
+ finish [branch] After merge: switch to base, pull, delete the local branch + worktree
14
+
15
+ Examples:
16
+ Start a new change:
17
+ $ neo work start fix-login-redirect
18
+
19
+ Start in a worktree:
20
+ $ neo work start fix-login-redirect --worktree
21
+
22
+ Ship the current branch:
23
+ $ neo work ship
24
+
25
+ After the PR merged:
26
+ $ neo work finish
27
+ `);
28
+ command.addCommand(createWorkStartCommand());
29
+ command.addCommand(createWorkShipCommand());
30
+ command.addCommand(createWorkFinishCommand());
31
+ return command;
32
+ }
33
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/work/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAE1E,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEpC,OAAO;SACJ,WAAW,CAAC,4DAA4D,CAAC;SACzE,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;;;;;CAkBL,CACI,CAAC;IAEJ,OAAO,CAAC,UAAU,CAAC,sBAAsB,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,UAAU,CAAC,uBAAuB,EAAE,CAAC,CAAC;IAE9C,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { Command } from '@commander-js/extra-typings';
2
+ interface WorkShipOptions {
3
+ base?: string;
4
+ verify?: boolean;
5
+ changeset?: boolean;
6
+ aiPr?: boolean;
7
+ draft?: boolean;
8
+ bump?: string;
9
+ summary?: string;
10
+ package?: string;
11
+ }
12
+ interface WorkShipResult {
13
+ branch: string;
14
+ base: string;
15
+ verified: boolean;
16
+ verifyDurationMs?: number;
17
+ pushed: boolean;
18
+ prUrl?: string;
19
+ prCreated: boolean;
20
+ changesetPath?: string;
21
+ changesetExisting: boolean;
22
+ commits: number;
23
+ }
24
+ export declare function executeWorkShip(options: WorkShipOptions): Promise<WorkShipResult>;
25
+ export declare function createWorkShipCommand(): Command;
26
+ export {};
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/work/ship/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAoBtD,UAAU,eAAe;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAkID,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CA+KvF;AAED,wBAAgB,qBAAqB,IAAI,OAAO,CAuE/C"}