@kodus/cli 0.2.4 → 0.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.
- package/README.md +78 -27
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +20 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/auth/index.d.ts.map +1 -1
- package/dist/commands/auth/index.js +1 -2
- package/dist/commands/auth/index.js.map +1 -1
- package/dist/commands/auth/login.d.ts.map +1 -1
- package/dist/commands/auth/login.js +44 -45
- package/dist/commands/auth/login.js.map +1 -1
- package/dist/commands/auth/logout.d.ts.map +1 -1
- package/dist/commands/auth/logout.js +5 -3
- package/dist/commands/auth/logout.js.map +1 -1
- package/dist/commands/auth/status.d.ts.map +1 -1
- package/dist/commands/auth/status.js +28 -25
- package/dist/commands/auth/status.js.map +1 -1
- package/dist/commands/auth/team-key.d.ts.map +1 -1
- package/dist/commands/auth/team-key.js +49 -29
- package/dist/commands/auth/team-key.js.map +1 -1
- package/dist/commands/auth/token.d.ts.map +1 -1
- package/dist/commands/auth/token.js +12 -10
- package/dist/commands/auth/token.js.map +1 -1
- package/dist/commands/hook/index.d.ts.map +1 -1
- package/dist/commands/hook/index.js +1 -2
- package/dist/commands/hook/index.js.map +1 -1
- package/dist/commands/hook/install.d.ts.map +1 -1
- package/dist/commands/hook/install.js +21 -22
- package/dist/commands/hook/install.js.map +1 -1
- package/dist/commands/hook/status.d.ts.map +1 -1
- package/dist/commands/hook/status.js +10 -8
- package/dist/commands/hook/status.js.map +1 -1
- package/dist/commands/hook/uninstall.d.ts.map +1 -1
- package/dist/commands/hook/uninstall.js +7 -5
- package/dist/commands/hook/uninstall.js.map +1 -1
- package/dist/commands/memory/capture.d.ts.map +1 -1
- package/dist/commands/memory/capture.js +28 -14
- package/dist/commands/memory/capture.js.map +1 -1
- package/dist/commands/memory/disable.d.ts.map +1 -1
- package/dist/commands/memory/disable.js +9 -7
- package/dist/commands/memory/disable.js.map +1 -1
- package/dist/commands/memory/enable.d.ts.map +1 -1
- package/dist/commands/memory/enable.js +18 -14
- package/dist/commands/memory/enable.js.map +1 -1
- package/dist/commands/memory/hooks.d.ts.map +1 -1
- package/dist/commands/memory/hooks.js +37 -17
- package/dist/commands/memory/hooks.js.map +1 -1
- package/dist/commands/memory/index.d.ts.map +1 -1
- package/dist/commands/memory/index.js +1 -2
- package/dist/commands/memory/index.js.map +1 -1
- package/dist/commands/memory/promote.d.ts.map +1 -1
- package/dist/commands/memory/promote.js +14 -10
- package/dist/commands/memory/promote.js.map +1 -1
- package/dist/commands/memory/show.d.ts.map +1 -1
- package/dist/commands/memory/show.js +11 -10
- package/dist/commands/memory/show.js.map +1 -1
- package/dist/commands/memory/status.d.ts.map +1 -1
- package/dist/commands/memory/status.js +22 -20
- package/dist/commands/memory/status.js.map +1 -1
- package/dist/commands/pr.d.ts.map +1 -1
- package/dist/commands/pr.js +131 -13
- package/dist/commands/pr.js.map +1 -1
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +57 -38
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +119 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/subscribe.d.ts +4 -0
- package/dist/commands/subscribe.d.ts.map +1 -0
- package/dist/commands/subscribe.js +25 -0
- package/dist/commands/subscribe.js.map +1 -0
- package/dist/commands/update.d.ts +9 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +74 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/formatters/json.d.ts.map +1 -1
- package/dist/formatters/json.js.map +1 -1
- package/dist/formatters/markdown.d.ts.map +1 -1
- package/dist/formatters/markdown.js.map +1 -1
- package/dist/formatters/prompt.d.ts.map +1 -1
- package/dist/formatters/prompt.js +6 -6
- package/dist/formatters/prompt.js.map +1 -1
- package/dist/formatters/terminal.d.ts.map +1 -1
- package/dist/formatters/terminal.js +7 -4
- package/dist/formatters/terminal.js.map +1 -1
- package/dist/index.js +28 -5
- package/dist/index.js.map +1 -1
- package/dist/services/api/api.interface.d.ts +10 -1
- package/dist/services/api/api.interface.d.ts.map +1 -1
- package/dist/services/api/api.real.d.ts +14 -0
- package/dist/services/api/api.real.d.ts.map +1 -1
- package/dist/services/api/api.real.js +163 -58
- package/dist/services/api/api.real.js.map +1 -1
- package/dist/services/api/index.d.ts +2 -2
- package/dist/services/api/index.js +1 -1
- package/dist/services/auth.service.d.ts +1 -0
- package/dist/services/auth.service.d.ts.map +1 -1
- package/dist/services/auth.service.js +21 -2
- package/dist/services/auth.service.js.map +1 -1
- package/dist/services/context.service.d.ts +4 -1
- package/dist/services/context.service.d.ts.map +1 -1
- package/dist/services/context.service.js +30 -19
- package/dist/services/context.service.js.map +1 -1
- package/dist/services/fix.service.d.ts.map +1 -1
- package/dist/services/fix.service.js +3 -2
- package/dist/services/fix.service.js.map +1 -1
- package/dist/services/git.service.d.ts +1 -0
- package/dist/services/git.service.d.ts.map +1 -1
- package/dist/services/git.service.js +123 -48
- package/dist/services/git.service.js.map +1 -1
- package/dist/services/memory.service.d.ts.map +1 -1
- package/dist/services/memory.service.js +93 -35
- package/dist/services/memory.service.js.map +1 -1
- package/dist/services/review.service.d.ts +12 -1
- package/dist/services/review.service.d.ts.map +1 -1
- package/dist/services/review.service.js +88 -65
- package/dist/services/review.service.js.map +1 -1
- package/dist/services/transcript-parser.service.d.ts.map +1 -1
- package/dist/services/transcript-parser.service.js +46 -15
- package/dist/services/transcript-parser.service.js.map +1 -1
- package/dist/types/index.d.ts +12 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/memory.d.ts.map +1 -1
- package/dist/ui/interactive.d.ts.map +1 -1
- package/dist/ui/interactive.js +86 -92
- package/dist/ui/interactive.js.map +1 -1
- package/dist/utils/banner.d.ts +2 -0
- package/dist/utils/banner.d.ts.map +1 -0
- package/dist/utils/banner.js +190 -0
- package/dist/utils/banner.js.map +1 -0
- package/dist/utils/cli-exit.d.ts +13 -0
- package/dist/utils/cli-exit.d.ts.map +1 -0
- package/dist/utils/cli-exit.js +29 -0
- package/dist/utils/cli-exit.js.map +1 -0
- package/dist/utils/clipboard.d.ts +2 -0
- package/dist/utils/clipboard.d.ts.map +1 -0
- package/dist/utils/clipboard.js +11 -0
- package/dist/utils/clipboard.js.map +1 -0
- package/dist/utils/config.d.ts +3 -0
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/credentials.d.ts.map +1 -1
- package/dist/utils/credentials.js.map +1 -1
- package/dist/utils/device.d.ts.map +1 -1
- package/dist/utils/device.js +17 -6
- package/dist/utils/device.js.map +1 -1
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +48 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/module-matcher.d.ts.map +1 -1
- package/dist/utils/module-matcher.js +12 -7
- package/dist/utils/module-matcher.js.map +1 -1
- package/dist/utils/rate-limit.d.ts.map +1 -1
- package/dist/utils/rate-limit.js +12 -3
- package/dist/utils/rate-limit.js.map +1 -1
- package/dist/utils/recent-activity.d.ts +9 -0
- package/dist/utils/recent-activity.d.ts.map +1 -0
- package/dist/utils/recent-activity.js +139 -0
- package/dist/utils/recent-activity.js.map +1 -0
- package/dist/utils/skills.d.ts +2 -0
- package/dist/utils/skills.d.ts.map +1 -0
- package/dist/utils/skills.js +40 -0
- package/dist/utils/skills.js.map +1 -0
- package/dist/utils/update-check.d.ts +1 -2
- package/dist/utils/update-check.d.ts.map +1 -1
- package/dist/utils/update-check.js +21 -97
- package/dist/utils/update-check.js.map +1 -1
- package/package.json +83 -59
- package/skills/README.md +49 -0
- package/skills/business-rules-validation/SKILL.md +43 -0
- package/skills/kodus-pr-suggestions-resolver/SKILL.md +61 -0
- package/skills/kodus-review/SKILL.md +40 -0
- package/skills/kodus-review-dev/SKILL.md +41 -0
- package/skills/kodus-review-dev/scripts/run-local-cli.sh +49 -0
- package/dist/commands/__tests__/auth.login-logout.test.d.ts +0 -2
- package/dist/commands/__tests__/auth.login-logout.test.d.ts.map +0 -1
- package/dist/commands/__tests__/auth.login-logout.test.js +0 -125
- package/dist/commands/__tests__/auth.login-logout.test.js.map +0 -1
- package/dist/commands/__tests__/auth.team-key.test.d.ts +0 -2
- package/dist/commands/__tests__/auth.team-key.test.d.ts.map +0 -1
- package/dist/commands/__tests__/auth.team-key.test.js +0 -145
- package/dist/commands/__tests__/auth.team-key.test.js.map +0 -1
- package/dist/commands/__tests__/capture-api.test.d.ts +0 -2
- package/dist/commands/__tests__/capture-api.test.d.ts.map +0 -1
- package/dist/commands/__tests__/capture-api.test.js +0 -88
- package/dist/commands/__tests__/capture-api.test.js.map +0 -1
- package/dist/commands/__tests__/disable.test.d.ts +0 -2
- package/dist/commands/__tests__/disable.test.d.ts.map +0 -1
- package/dist/commands/__tests__/disable.test.js +0 -103
- package/dist/commands/__tests__/disable.test.js.map +0 -1
- package/dist/commands/__tests__/enable.test.d.ts +0 -2
- package/dist/commands/__tests__/enable.test.d.ts.map +0 -1
- package/dist/commands/__tests__/enable.test.js +0 -103
- package/dist/commands/__tests__/enable.test.js.map +0 -1
- package/dist/commands/__tests__/hook.test.d.ts +0 -2
- package/dist/commands/__tests__/hook.test.d.ts.map +0 -1
- package/dist/commands/__tests__/hook.test.js +0 -105
- package/dist/commands/__tests__/hook.test.js.map +0 -1
- package/dist/commands/__tests__/install-merge-hook.test.d.ts +0 -2
- package/dist/commands/__tests__/install-merge-hook.test.d.ts.map +0 -1
- package/dist/commands/__tests__/install-merge-hook.test.js +0 -54
- package/dist/commands/__tests__/install-merge-hook.test.js.map +0 -1
- package/dist/commands/upgrade.d.ts +0 -3
- package/dist/commands/upgrade.d.ts.map +0 -1
- package/dist/commands/upgrade.js +0 -35
- package/dist/commands/upgrade.js.map +0 -1
- package/dist/services/__tests__/auth.service.test.d.ts +0 -2
- package/dist/services/__tests__/auth.service.test.d.ts.map +0 -1
- package/dist/services/__tests__/auth.service.test.js +0 -201
- package/dist/services/__tests__/auth.service.test.js.map +0 -1
- package/dist/services/__tests__/git.service.test.d.ts +0 -2
- package/dist/services/__tests__/git.service.test.d.ts.map +0 -1
- package/dist/services/__tests__/git.service.test.js +0 -61
- package/dist/services/__tests__/git.service.test.js.map +0 -1
- package/dist/services/__tests__/memory.service.test.d.ts +0 -2
- package/dist/services/__tests__/memory.service.test.d.ts.map +0 -1
- package/dist/services/__tests__/memory.service.test.js +0 -279
- package/dist/services/__tests__/memory.service.test.js.map +0 -1
- package/dist/services/__tests__/review.service.auth-fallback.test.d.ts +0 -2
- package/dist/services/__tests__/review.service.auth-fallback.test.d.ts.map +0 -1
- package/dist/services/__tests__/review.service.auth-fallback.test.js +0 -63
- package/dist/services/__tests__/review.service.auth-fallback.test.js.map +0 -1
- package/dist/services/__tests__/review.service.test.d.ts +0 -2
- package/dist/services/__tests__/review.service.test.d.ts.map +0 -1
- package/dist/services/__tests__/review.service.test.js +0 -132
- package/dist/services/__tests__/review.service.test.js.map +0 -1
- package/dist/services/__tests__/review.suggestions-auth.test.d.ts +0 -2
- package/dist/services/__tests__/review.suggestions-auth.test.d.ts.map +0 -1
- package/dist/services/__tests__/review.suggestions-auth.test.js +0 -81
- package/dist/services/__tests__/review.suggestions-auth.test.js.map +0 -1
- package/dist/services/__tests__/transcript-parser.service.test.d.ts +0 -2
- package/dist/services/__tests__/transcript-parser.service.test.d.ts.map +0 -1
- package/dist/services/__tests__/transcript-parser.service.test.js +0 -134
- package/dist/services/__tests__/transcript-parser.service.test.js.map +0 -1
- package/dist/services/api/__tests__/api.real.test.d.ts +0 -2
- package/dist/services/api/__tests__/api.real.test.d.ts.map +0 -1
- package/dist/services/api/__tests__/api.real.test.js +0 -182
- package/dist/services/api/__tests__/api.real.test.js.map +0 -1
- package/dist/utils/__tests__/config.test.d.ts +0 -2
- package/dist/utils/__tests__/config.test.d.ts.map +0 -1
- package/dist/utils/__tests__/config.test.js +0 -79
- package/dist/utils/__tests__/config.test.js.map +0 -1
- package/dist/utils/__tests__/credentials.test.d.ts +0 -2
- package/dist/utils/__tests__/credentials.test.d.ts.map +0 -1
- package/dist/utils/__tests__/credentials.test.js +0 -89
- package/dist/utils/__tests__/credentials.test.js.map +0 -1
- package/dist/utils/__tests__/device.test.d.ts +0 -2
- package/dist/utils/__tests__/device.test.d.ts.map +0 -1
- package/dist/utils/__tests__/device.test.js +0 -108
- package/dist/utils/__tests__/device.test.js.map +0 -1
- package/dist/utils/__tests__/module-matcher.test.d.ts +0 -2
- package/dist/utils/__tests__/module-matcher.test.d.ts.map +0 -1
- package/dist/utils/__tests__/module-matcher.test.js +0 -164
- package/dist/utils/__tests__/module-matcher.test.js.map +0 -1
- package/dist/utils/__tests__/update-check.test.d.ts +0 -2
- package/dist/utils/__tests__/update-check.test.d.ts.map +0 -1
- package/dist/utils/__tests__/update-check.test.js +0 -26
- package/dist/utils/__tests__/update-check.test.js.map +0 -1
|
@@ -17,8 +17,9 @@ export async function loadConfig(repoRoot) {
|
|
|
17
17
|
}
|
|
18
18
|
const modules = [];
|
|
19
19
|
for (const item of obj['modules']) {
|
|
20
|
-
if (!item || typeof item !== 'object' || Array.isArray(item))
|
|
20
|
+
if (!item || typeof item !== 'object' || Array.isArray(item)) {
|
|
21
21
|
continue;
|
|
22
|
+
}
|
|
22
23
|
const entry = item;
|
|
23
24
|
const id = typeof entry['id'] === 'string' ? entry['id'] : undefined;
|
|
24
25
|
const name = typeof entry['name'] === 'string' ? entry['name'] : id;
|
|
@@ -28,8 +29,9 @@ export async function loadConfig(repoRoot) {
|
|
|
28
29
|
const memoryFile = typeof entry['memoryFile'] === 'string'
|
|
29
30
|
? entry['memoryFile']
|
|
30
31
|
: `.kody/memory/${id}.md`;
|
|
31
|
-
if (!id || paths.length === 0)
|
|
32
|
+
if (!id || paths.length === 0) {
|
|
32
33
|
continue;
|
|
34
|
+
}
|
|
33
35
|
modules.push({ id, name: name ?? id, paths, memoryFile });
|
|
34
36
|
}
|
|
35
37
|
return { version: 1, modules };
|
|
@@ -61,7 +63,8 @@ function fileMatchesModule(filePath, patterns) {
|
|
|
61
63
|
}
|
|
62
64
|
else if (normalizedPattern.endsWith('/*')) {
|
|
63
65
|
const prefix = normalizedPattern.slice(0, -2);
|
|
64
|
-
if (normalized.startsWith(prefix + '/') &&
|
|
66
|
+
if (normalized.startsWith(prefix + '/') &&
|
|
67
|
+
!normalized.slice(prefix.length + 1).includes('/')) {
|
|
65
68
|
return true;
|
|
66
69
|
}
|
|
67
70
|
}
|
|
@@ -73,7 +76,8 @@ function fileMatchesModule(filePath, patterns) {
|
|
|
73
76
|
}
|
|
74
77
|
else {
|
|
75
78
|
// Exact prefix match (directory or file path)
|
|
76
|
-
if (normalized.startsWith(normalizedPattern + '/') ||
|
|
79
|
+
if (normalized.startsWith(normalizedPattern + '/') ||
|
|
80
|
+
normalized === normalizedPattern) {
|
|
77
81
|
return true;
|
|
78
82
|
}
|
|
79
83
|
}
|
|
@@ -82,13 +86,14 @@ function fileMatchesModule(filePath, patterns) {
|
|
|
82
86
|
}
|
|
83
87
|
function patternToRegex(pattern) {
|
|
84
88
|
const escaped = pattern
|
|
85
|
-
.replace(/[.+^${}()|[\]\\]/g, '\\$&')
|
|
86
89
|
.replace(/\*\*/g, '§GLOBSTAR§')
|
|
87
|
-
.replace(/\*/g, '
|
|
90
|
+
.replace(/\*/g, '§GLOB§')
|
|
91
|
+
.replace(/[.+^${}()|[\]\\]/g, '\\$&')
|
|
88
92
|
// Preserve globstar "zero or more directories" semantics when used mid-path.
|
|
89
93
|
// Example: a/**/b must match both a/b and a/x/y/b.
|
|
90
94
|
.replace(/\/§GLOBSTAR§\//g, '(?:/[^/]+)*/')
|
|
91
|
-
.replace(/§GLOBSTAR§/g, '.*')
|
|
95
|
+
.replace(/§GLOBSTAR§/g, '.*')
|
|
96
|
+
.replace(/§GLOB§/g, '[^/]*');
|
|
92
97
|
return new RegExp(`^${escaped}$`);
|
|
93
98
|
}
|
|
94
99
|
//# sourceMappingURL=module-matcher.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-matcher.js","sourceRoot":"","sources":["../../src/utils/module-matcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AAGtE,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB,MAAM,WAAW,GAAG,mBAAmB,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;
|
|
1
|
+
{"version":3,"file":"module-matcher.js","sourceRoot":"","sources":["../../src/utils/module-matcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limit.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limit.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAKrD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CA0B1D;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,WAAW,CAAC,CAG7D;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAgB9D"}
|
package/dist/utils/rate-limit.js
CHANGED
|
@@ -4,6 +4,7 @@ import os from 'os';
|
|
|
4
4
|
import chalk from 'chalk';
|
|
5
5
|
import { api } from '../services/api/index.js';
|
|
6
6
|
import { gitService } from '../services/git.service.js';
|
|
7
|
+
import { cliInfo } from './logger.js';
|
|
7
8
|
const { machineIdSync } = machineId;
|
|
8
9
|
export async function getTrialIdentifier() {
|
|
9
10
|
try {
|
|
@@ -17,11 +18,19 @@ export async function getTrialIdentifier() {
|
|
|
17
18
|
repoPath = process.cwd();
|
|
18
19
|
}
|
|
19
20
|
const raw = `${machineId}:${username}:${repoPath}`;
|
|
20
|
-
return crypto
|
|
21
|
+
return crypto
|
|
22
|
+
.createHash('sha256')
|
|
23
|
+
.update(raw)
|
|
24
|
+
.digest('hex')
|
|
25
|
+
.substring(0, 32);
|
|
21
26
|
}
|
|
22
27
|
catch {
|
|
23
28
|
const fallback = `${os.hostname()}:${os.userInfo().username}:${Date.now()}`;
|
|
24
|
-
return crypto
|
|
29
|
+
return crypto
|
|
30
|
+
.createHash('sha256')
|
|
31
|
+
.update(fallback)
|
|
32
|
+
.digest('hex')
|
|
33
|
+
.substring(0, 32);
|
|
25
34
|
}
|
|
26
35
|
}
|
|
27
36
|
export async function checkTrialStatus() {
|
|
@@ -42,6 +51,6 @@ ${chalk.yellow('│')}
|
|
|
42
51
|
${chalk.yellow('│')} ${chalk.dim('→')} ${chalk.cyan('kodus auth login')} ${chalk.yellow('│')}
|
|
43
52
|
${chalk.yellow('╰──────────────────────────────────────────────────────────╯')}
|
|
44
53
|
`;
|
|
45
|
-
|
|
54
|
+
cliInfo(box);
|
|
46
55
|
}
|
|
47
56
|
//# sourceMappingURL=rate-limit.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/utils/rate-limit.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/utils/rate-limit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface RecentActivityEntry {
|
|
2
|
+
command: string;
|
|
3
|
+
timestamp: number;
|
|
4
|
+
}
|
|
5
|
+
export declare function loadRecentActivity(): Promise<RecentActivityEntry[]>;
|
|
6
|
+
export declare function recordRecentActivity(rawArgs: string[]): Promise<void>;
|
|
7
|
+
export declare function formatRelativeTime(timestamp: number, now?: number): string;
|
|
8
|
+
export declare function getRecentActivityLines(maxItems?: number): Promise<string[]>;
|
|
9
|
+
//# sourceMappingURL=recent-activity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recent-activity.d.ts","sourceRoot":"","sources":["../../src/utils/recent-activity.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,mBAAmB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACrB;AAkED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC,CA+BzE;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB3E;AAED,wBAAgB,kBAAkB,CAC9B,SAAS,EAAE,MAAM,EACjB,GAAG,SAAa,GACjB,MAAM,CAkBR;AAED,wBAAsB,sBAAsB,CAAC,QAAQ,SAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAY5E"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
const KODUS_DIR = path.join(os.homedir(), '.kodus');
|
|
5
|
+
const RECENT_ACTIVITY_FILE = path.join(KODUS_DIR, 'recent-activity.json');
|
|
6
|
+
const MAX_ENTRIES = 10;
|
|
7
|
+
const SENSITIVE_FLAGS = new Set([
|
|
8
|
+
'--key',
|
|
9
|
+
'--team-key',
|
|
10
|
+
'--token',
|
|
11
|
+
'--access-token',
|
|
12
|
+
'--refresh-token',
|
|
13
|
+
'--password',
|
|
14
|
+
]);
|
|
15
|
+
function isJsonParseError(error) {
|
|
16
|
+
return error instanceof SyntaxError;
|
|
17
|
+
}
|
|
18
|
+
async function ensureConfigDir() {
|
|
19
|
+
try {
|
|
20
|
+
await fs.mkdir(KODUS_DIR, { recursive: true, mode: 0o700 });
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
if (error.code !== 'EEXIST') {
|
|
24
|
+
throw error;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function sanitizeArgs(args) {
|
|
29
|
+
const sanitized = [];
|
|
30
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
31
|
+
const arg = args[i] ?? '';
|
|
32
|
+
if (arg.startsWith('--')) {
|
|
33
|
+
const [flag, value] = arg.split('=', 2);
|
|
34
|
+
if (SENSITIVE_FLAGS.has(flag)) {
|
|
35
|
+
if (value !== undefined) {
|
|
36
|
+
sanitized.push(`${flag}=[REDACTED]`);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
sanitized.push(flag);
|
|
40
|
+
if (i + 1 < args.length) {
|
|
41
|
+
sanitized.push('[REDACTED]');
|
|
42
|
+
i += 1;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
sanitized.push(arg);
|
|
49
|
+
}
|
|
50
|
+
return sanitized;
|
|
51
|
+
}
|
|
52
|
+
function shouldRecordCommand(args) {
|
|
53
|
+
if (args.length === 0) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
const firstArg = args[0];
|
|
57
|
+
if (!firstArg) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
if (firstArg === '--help' ||
|
|
61
|
+
firstArg === '-h' ||
|
|
62
|
+
firstArg === '--version' ||
|
|
63
|
+
firstArg === '-V') {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
export async function loadRecentActivity() {
|
|
69
|
+
try {
|
|
70
|
+
const content = await fs.readFile(RECENT_ACTIVITY_FILE, 'utf-8');
|
|
71
|
+
const parsed = JSON.parse(content);
|
|
72
|
+
if (!parsed || !Array.isArray(parsed.entries)) {
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
return parsed.entries
|
|
76
|
+
.filter((entry) => entry &&
|
|
77
|
+
typeof entry.command === 'string' &&
|
|
78
|
+
typeof entry.timestamp === 'number')
|
|
79
|
+
.sort((a, b) => b.timestamp - a.timestamp);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
const code = error.code;
|
|
83
|
+
if (code === 'ENOENT') {
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
if (isJsonParseError(error)) {
|
|
87
|
+
const brokenFile = `${RECENT_ACTIVITY_FILE}.corrupted.${Date.now()}`;
|
|
88
|
+
await fs.rename(RECENT_ACTIVITY_FILE, brokenFile).catch(() => { });
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
export async function recordRecentActivity(rawArgs) {
|
|
95
|
+
if (!shouldRecordCommand(rawArgs)) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const args = sanitizeArgs(rawArgs);
|
|
99
|
+
const command = `kodus ${args.join(' ').trim()}`.trim();
|
|
100
|
+
if (!command || command === 'kodus') {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const existing = await loadRecentActivity();
|
|
104
|
+
const nextEntries = [
|
|
105
|
+
{ command, timestamp: Date.now() },
|
|
106
|
+
...existing.filter((entry) => entry.command !== command),
|
|
107
|
+
].slice(0, MAX_ENTRIES);
|
|
108
|
+
await ensureConfigDir();
|
|
109
|
+
const tmpFile = `${RECENT_ACTIVITY_FILE}.${process.pid}.${Date.now()}.tmp`;
|
|
110
|
+
const payload = JSON.stringify({ entries: nextEntries }, null, 2);
|
|
111
|
+
await fs.writeFile(tmpFile, payload, { encoding: 'utf-8', mode: 0o600 });
|
|
112
|
+
await fs.rename(tmpFile, RECENT_ACTIVITY_FILE);
|
|
113
|
+
}
|
|
114
|
+
export function formatRelativeTime(timestamp, now = Date.now()) {
|
|
115
|
+
const diffSeconds = Math.max(0, Math.floor((now - timestamp) / 1000));
|
|
116
|
+
if (diffSeconds < 60) {
|
|
117
|
+
return `${diffSeconds}s ago`;
|
|
118
|
+
}
|
|
119
|
+
const diffMinutes = Math.floor(diffSeconds / 60);
|
|
120
|
+
if (diffMinutes < 60) {
|
|
121
|
+
return `${diffMinutes}m ago`;
|
|
122
|
+
}
|
|
123
|
+
const diffHours = Math.floor(diffMinutes / 60);
|
|
124
|
+
if (diffHours < 24) {
|
|
125
|
+
return `${diffHours}h ago`;
|
|
126
|
+
}
|
|
127
|
+
const diffDays = Math.floor(diffHours / 24);
|
|
128
|
+
return `${diffDays}d ago`;
|
|
129
|
+
}
|
|
130
|
+
export async function getRecentActivityLines(maxItems = 2) {
|
|
131
|
+
const entries = await loadRecentActivity();
|
|
132
|
+
if (entries.length === 0) {
|
|
133
|
+
return ['No recent activity yet'];
|
|
134
|
+
}
|
|
135
|
+
return entries
|
|
136
|
+
.slice(0, Math.max(1, maxItems))
|
|
137
|
+
.map((entry) => `${entry.command} - ${formatRelativeTime(entry.timestamp)}`);
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=recent-activity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recent-activity.js","sourceRoot":"","sources":["../../src/utils/recent-activity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/utils/skills.ts"],"names":[],"mappings":"AAYA,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAkC3D"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
function resolveSkillsCandidates() {
|
|
5
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
return [
|
|
7
|
+
path.resolve(here, '../../skills'),
|
|
8
|
+
path.resolve(here, '../skills'),
|
|
9
|
+
];
|
|
10
|
+
}
|
|
11
|
+
export async function listBundledSkills() {
|
|
12
|
+
for (const dir of resolveSkillsCandidates()) {
|
|
13
|
+
try {
|
|
14
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
15
|
+
const skills = await Promise.all(entries
|
|
16
|
+
.filter((entry) => entry.isDirectory())
|
|
17
|
+
.map(async (entry) => {
|
|
18
|
+
const skillFile = path.join(dir, entry.name, 'SKILL.md');
|
|
19
|
+
try {
|
|
20
|
+
await fs.access(skillFile);
|
|
21
|
+
return entry.name;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}));
|
|
27
|
+
const normalized = skills
|
|
28
|
+
.filter((name) => !!name)
|
|
29
|
+
.sort((a, b) => a.localeCompare(b));
|
|
30
|
+
if (normalized.length > 0) {
|
|
31
|
+
return normalized;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Ignore missing candidate and continue.
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/utils/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,SAAS,uBAAuB;IAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,OAAO;QACH,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC;KAClC,CAAC;AACN,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACnC,KAAK,MAAM,GAAG,IAAI,uBAAuB,EAAE,EAAE,CAAC;QAC1C,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC5B,OAAO;iBACF,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;iBACtC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBACjB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CACvB,GAAG,EACH,KAAK,CAAC,IAAI,EACV,UAAU,CACb,CAAC;gBACF,IAAI,CAAC;oBACD,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;oBAC3B,OAAO,KAAK,CAAC,IAAI,CAAC;gBACtB,CAAC;gBAAC,MAAM,CAAC;oBACL,OAAO,IAAI,CAAC;gBAChB,CAAC;YACL,CAAC,CAAC,CACT,CAAC;YAEF,MAAM,UAAU,GAAG,MAAM;iBACpB,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBACxC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,OAAO,UAAU,CAAC;YACtB,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,yCAAyC;QAC7C,CAAC;IACL,CAAC;IAED,OAAO,EAAE,CAAC;AACd,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../../src/utils/update-check.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../../src/utils/update-check.ts"],"names":[],"mappings":"AAuBA,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAWrD"}
|
|
@@ -1,106 +1,30 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import os from 'os';
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
const latestParts = latest.split('.').map(Number);
|
|
12
|
-
const len = Math.max(currentParts.length, latestParts.length);
|
|
13
|
-
for (let i = 0; i < len; i++) {
|
|
14
|
-
const a = currentParts[i] ?? 0;
|
|
15
|
-
const b = latestParts[i] ?? 0;
|
|
16
|
-
if (b > a)
|
|
17
|
-
return true;
|
|
18
|
-
if (b < a)
|
|
19
|
-
return false;
|
|
20
|
-
}
|
|
21
|
-
return false;
|
|
22
|
-
}
|
|
23
|
-
function printUpdateBanner(currentVersion, latestVersion) {
|
|
24
|
-
const message = `Update available: ${currentVersion} → ${latestVersion}`;
|
|
25
|
-
const command = 'Run `npm install -g @kodus/cli`';
|
|
26
|
-
const inner = Math.max(message.length, command.length) + 4;
|
|
27
|
-
const pad = (text) => {
|
|
28
|
-
const remaining = inner - text.length;
|
|
29
|
-
const left = Math.floor(remaining / 2);
|
|
30
|
-
const right = remaining - left;
|
|
31
|
-
return ' '.repeat(left) + text + ' '.repeat(right);
|
|
32
|
-
};
|
|
33
|
-
const top = `╭${'─'.repeat(inner)}╮`;
|
|
34
|
-
const bottom = `╰${'─'.repeat(inner)}╯`;
|
|
35
|
-
const empty = `│${' '.repeat(inner)}│`;
|
|
36
|
-
console.log();
|
|
37
|
-
console.log(chalk.yellow(top));
|
|
38
|
-
console.log(chalk.yellow(empty));
|
|
39
|
-
console.log(chalk.yellow('│') + pad(`${chalk.dim(currentVersion)} ${chalk.yellow('→')} ${chalk.green(latestVersion)}`) + chalk.yellow('│'));
|
|
40
|
-
console.log(chalk.yellow('│') + pad(chalk.cyan('Run `npm install -g @kodus/cli`')) + chalk.yellow('│'));
|
|
41
|
-
console.log(chalk.yellow(empty));
|
|
42
|
-
console.log(chalk.yellow(bottom));
|
|
43
|
-
console.log();
|
|
44
|
-
}
|
|
45
|
-
async function readCache() {
|
|
1
|
+
import { constants as fsConstants } from 'node:fs';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import updateNotifier from 'update-notifier';
|
|
6
|
+
import { createRequire } from 'node:module';
|
|
7
|
+
const require = createRequire(import.meta.url);
|
|
8
|
+
const pkg = require('../../package.json');
|
|
9
|
+
async function canUseUpdateNotifier() {
|
|
10
|
+
const configRoot = process.env.XDG_CONFIG_HOME || path.join(os.homedir(), '.config');
|
|
46
11
|
try {
|
|
47
|
-
|
|
48
|
-
|
|
12
|
+
await fs.mkdir(configRoot, { recursive: true });
|
|
13
|
+
await fs.access(configRoot, fsConstants.W_OK);
|
|
14
|
+
return true;
|
|
49
15
|
}
|
|
50
16
|
catch {
|
|
51
|
-
return
|
|
17
|
+
return false;
|
|
52
18
|
}
|
|
53
19
|
}
|
|
54
|
-
async function
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
await fs.writeFile(CACHE_FILE, JSON.stringify(cache, null, 2), {
|
|
58
|
-
encoding: 'utf-8',
|
|
59
|
-
mode: 0o600,
|
|
60
|
-
});
|
|
20
|
+
export async function checkForUpdates() {
|
|
21
|
+
if (process.env.KODUS_DISABLE_UPDATE_CHECK === '1') {
|
|
22
|
+
return;
|
|
61
23
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
async function fetchLatestVersion() {
|
|
67
|
-
try {
|
|
68
|
-
const controller = new AbortController();
|
|
69
|
-
const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
|
|
70
|
-
const response = await fetch('https://registry.npmjs.org/@kodus/cli/latest', {
|
|
71
|
-
signal: controller.signal,
|
|
72
|
-
headers: { 'Accept': 'application/json' },
|
|
73
|
-
});
|
|
74
|
-
clearTimeout(timeout);
|
|
75
|
-
if (!response.ok)
|
|
76
|
-
return null;
|
|
77
|
-
const data = (await response.json());
|
|
78
|
-
return data.version ?? null;
|
|
79
|
-
}
|
|
80
|
-
catch {
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
export async function checkForUpdates(currentVersion) {
|
|
85
|
-
try {
|
|
86
|
-
const cache = await readCache();
|
|
87
|
-
const now = Date.now();
|
|
88
|
-
if (cache && (now - cache.lastCheck) < CHECK_INTERVAL_MS) {
|
|
89
|
-
if (isNewerVersion(currentVersion, cache.latestVersion)) {
|
|
90
|
-
printUpdateBanner(currentVersion, cache.latestVersion);
|
|
91
|
-
}
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
const latestVersion = await fetchLatestVersion();
|
|
95
|
-
if (!latestVersion)
|
|
96
|
-
return;
|
|
97
|
-
await writeCache({ lastCheck: now, latestVersion });
|
|
98
|
-
if (isNewerVersion(currentVersion, latestVersion)) {
|
|
99
|
-
printUpdateBanner(currentVersion, latestVersion);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
catch {
|
|
103
|
-
// silently ignore any errors — update check must never break the CLI
|
|
24
|
+
if (!(await canUseUpdateNotifier())) {
|
|
25
|
+
return;
|
|
104
26
|
}
|
|
27
|
+
// Update check is non-blocking (runs in background process)
|
|
28
|
+
updateNotifier({ pkg, updateCheckInterval: 1000 * 60 * 60 * 12 }).notify();
|
|
105
29
|
}
|
|
106
30
|
//# sourceMappingURL=update-check.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/utils/update-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/utils/update-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,WAAW,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,cAAc,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAE1C,KAAK,UAAU,oBAAoB;IAC/B,MAAM,UAAU,GACZ,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IAEtE,IAAI,CAAC;QACD,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACjC,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,GAAG,EAAE,CAAC;QACjD,OAAO;IACX,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,oBAAoB,EAAE,CAAC,EAAE,CAAC;QAClC,OAAO;IACX,CAAC;IAED,4DAA4D;IAC5D,cAAc,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAC/E,CAAC"}
|