@pupt/cli 0.0.1 → 2.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/LICENSE +21 -0
- package/README.md +54 -29
- package/dist/annotations/annotation-analyzer.d.ts +17 -0
- package/dist/annotations/annotation-analyzer.d.ts.map +1 -0
- package/dist/annotations/annotation-analyzer.js +145 -0
- package/dist/annotations/annotation-analyzer.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +435 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.d.ts +5 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +164 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/annotate.d.ts +2 -0
- package/dist/commands/annotate.d.ts.map +1 -0
- package/dist/commands/annotate.js +99 -0
- package/dist/commands/annotate.js.map +1 -0
- package/dist/commands/base-command.d.ts +23 -0
- package/dist/commands/base-command.d.ts.map +1 -0
- package/dist/commands/base-command.js +41 -0
- package/dist/commands/base-command.js.map +1 -0
- package/dist/commands/cache.d.ts +9 -0
- package/dist/commands/cache.d.ts.map +1 -0
- package/dist/commands/cache.js +31 -0
- package/dist/commands/cache.js.map +1 -0
- package/dist/commands/config.d.ts +8 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +93 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/edit.d.ts +2 -0
- package/dist/commands/edit.d.ts.map +1 -0
- package/dist/commands/edit.js +35 -0
- package/dist/commands/edit.js.map +1 -0
- package/dist/commands/help.d.ts +2 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +26 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/history.d.ts +12 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +317 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +137 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +16 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +263 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/review.d.ts +3 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +160 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/run.d.ts +32 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +367 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/uninstall.d.ts +2 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +45 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +2 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +113 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/config/config-manager.d.ts +19 -0
- package/dist/config/config-manager.d.ts.map +1 -0
- package/dist/config/config-manager.js +221 -0
- package/dist/config/config-manager.js.map +1 -0
- package/dist/config/global-paths.d.ts +5 -0
- package/dist/config/global-paths.d.ts.map +1 -0
- package/dist/config/global-paths.js +16 -0
- package/dist/config/global-paths.js.map +1 -0
- package/dist/config/migration.d.ts +12 -0
- package/dist/config/migration.d.ts.map +1 -0
- package/dist/config/migration.js +270 -0
- package/dist/config/migration.js.map +1 -0
- package/dist/history/enhanced-history-manager.d.ts +27 -0
- package/dist/history/enhanced-history-manager.d.ts.map +1 -0
- package/dist/history/enhanced-history-manager.js +116 -0
- package/dist/history/enhanced-history-manager.js.map +1 -0
- package/dist/history/history-manager.d.ts +43 -0
- package/dist/history/history-manager.d.ts.map +1 -0
- package/dist/history/history-manager.js +229 -0
- package/dist/history/history-manager.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/input-types/file-search-prompt.d.ts +11 -0
- package/dist/prompts/input-types/file-search-prompt.d.ts.map +1 -0
- package/dist/prompts/input-types/file-search-prompt.js +53 -0
- package/dist/prompts/input-types/file-search-prompt.js.map +1 -0
- package/dist/prompts/input-types/review-file-prompt.d.ts +3 -0
- package/dist/prompts/input-types/review-file-prompt.d.ts.map +1 -0
- package/dist/prompts/input-types/review-file-prompt.js +9 -0
- package/dist/prompts/input-types/review-file-prompt.js.map +1 -0
- package/dist/schemas/config-schema.d.ts +1637 -0
- package/dist/schemas/config-schema.d.ts.map +1 -0
- package/dist/schemas/config-schema.js +136 -0
- package/dist/schemas/config-schema.js.map +1 -0
- package/dist/search/search-engine.d.ts +8 -0
- package/dist/search/search-engine.d.ts.map +1 -0
- package/dist/search/search-engine.js +53 -0
- package/dist/search/search-engine.js.map +1 -0
- package/dist/services/git-service.d.ts +28 -0
- package/dist/services/git-service.d.ts.map +1 -0
- package/dist/services/git-service.js +157 -0
- package/dist/services/git-service.js.map +1 -0
- package/dist/services/input-collector.d.ts +9 -0
- package/dist/services/input-collector.d.ts.map +1 -0
- package/dist/services/input-collector.js +162 -0
- package/dist/services/input-collector.js.map +1 -0
- package/dist/services/logging-service.d.ts +49 -0
- package/dist/services/logging-service.d.ts.map +1 -0
- package/dist/services/logging-service.js +203 -0
- package/dist/services/logging-service.js.map +1 -0
- package/dist/services/module-cache.d.ts +42 -0
- package/dist/services/module-cache.d.ts.map +1 -0
- package/dist/services/module-cache.js +205 -0
- package/dist/services/module-cache.js.map +1 -0
- package/dist/services/module-entry-builder.d.ts +20 -0
- package/dist/services/module-entry-builder.d.ts.map +1 -0
- package/dist/services/module-entry-builder.js +71 -0
- package/dist/services/module-entry-builder.js.map +1 -0
- package/dist/services/output-capture-service.d.ts +28 -0
- package/dist/services/output-capture-service.d.ts.map +1 -0
- package/dist/services/output-capture-service.js +348 -0
- package/dist/services/output-capture-service.js.map +1 -0
- package/dist/services/package-manager.d.ts +18 -0
- package/dist/services/package-manager.d.ts.map +1 -0
- package/dist/services/package-manager.js +141 -0
- package/dist/services/package-manager.js.map +1 -0
- package/dist/services/pattern-detector.d.ts +15 -0
- package/dist/services/pattern-detector.d.ts.map +1 -0
- package/dist/services/pattern-detector.js +228 -0
- package/dist/services/pattern-detector.js.map +1 -0
- package/dist/services/prompt-resolver.d.ts +32 -0
- package/dist/services/prompt-resolver.d.ts.map +1 -0
- package/dist/services/prompt-resolver.js +73 -0
- package/dist/services/prompt-resolver.js.map +1 -0
- package/dist/services/pupt-prompt-source.d.ts +16 -0
- package/dist/services/pupt-prompt-source.d.ts.map +1 -0
- package/dist/services/pupt-prompt-source.js +74 -0
- package/dist/services/pupt-prompt-source.js.map +1 -0
- package/dist/services/pupt-service.d.ts +33 -0
- package/dist/services/pupt-service.d.ts.map +1 -0
- package/dist/services/pupt-service.js +119 -0
- package/dist/services/pupt-service.js.map +1 -0
- package/dist/services/review-data-builder.d.ts +25 -0
- package/dist/services/review-data-builder.d.ts.map +1 -0
- package/dist/services/review-data-builder.js +333 -0
- package/dist/services/review-data-builder.js.map +1 -0
- package/dist/services/suggestion-generator.d.ts +11 -0
- package/dist/services/suggestion-generator.d.ts.map +1 -0
- package/dist/services/suggestion-generator.js +158 -0
- package/dist/services/suggestion-generator.js.map +1 -0
- package/dist/services/ui-service.d.ts +49 -0
- package/dist/services/ui-service.d.ts.map +1 -0
- package/dist/services/ui-service.js +196 -0
- package/dist/services/ui-service.js.map +1 -0
- package/dist/types/annotations.d.ts +50 -0
- package/dist/types/annotations.d.ts.map +1 -0
- package/dist/types/annotations.js +2 -0
- package/dist/types/annotations.js.map +1 -0
- package/dist/types/config.d.ts +110 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +12 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/history.d.ts +36 -0
- package/dist/types/history.d.ts.map +1 -0
- package/dist/types/history.js +2 -0
- package/dist/types/history.js.map +1 -0
- package/dist/types/patterns.d.ts +25 -0
- package/dist/types/patterns.d.ts.map +1 -0
- package/dist/types/patterns.js +2 -0
- package/dist/types/patterns.js.map +1 -0
- package/dist/types/prompt.d.ts +29 -0
- package/dist/types/prompt.d.ts.map +1 -0
- package/dist/types/prompt.js +24 -0
- package/dist/types/prompt.js.map +1 -0
- package/dist/types/review.d.ts +81 -0
- package/dist/types/review.d.ts.map +1 -0
- package/dist/types/review.js +2 -0
- package/dist/types/review.js.map +1 -0
- package/dist/ui/console-ui.d.ts +30 -0
- package/dist/ui/console-ui.d.ts.map +1 -0
- package/dist/ui/console-ui.js +88 -0
- package/dist/ui/console-ui.js.map +1 -0
- package/dist/ui/interactive-search.d.ts +8 -0
- package/dist/ui/interactive-search.d.ts.map +1 -0
- package/dist/ui/interactive-search.js +29 -0
- package/dist/ui/interactive-search.js.map +1 -0
- package/dist/utils/annotation-migration.d.ts +12 -0
- package/dist/utils/annotation-migration.d.ts.map +1 -0
- package/dist/utils/annotation-migration.js +88 -0
- package/dist/utils/annotation-migration.js.map +1 -0
- package/dist/utils/date-formatter.d.ts +10 -0
- package/dist/utils/date-formatter.d.ts.map +1 -0
- package/dist/utils/date-formatter.js +46 -0
- package/dist/utils/date-formatter.js.map +1 -0
- package/dist/utils/editor.d.ts +14 -0
- package/dist/utils/editor.d.ts.map +1 -0
- package/dist/utils/editor.js +52 -0
- package/dist/utils/editor.js.map +1 -0
- package/dist/utils/errors.d.ts +58 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +275 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/git-info.d.ts +10 -0
- package/dist/utils/git-info.d.ts.map +1 -0
- package/dist/utils/git-info.js +44 -0
- package/dist/utils/git-info.js.map +1 -0
- package/dist/utils/gitignore.d.ts +10 -0
- package/dist/utils/gitignore.d.ts.map +1 -0
- package/dist/utils/gitignore.js +72 -0
- package/dist/utils/gitignore.js.map +1 -0
- package/dist/utils/logger.d.ts +39 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +143 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/platform.d.ts +9 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +45 -0
- package/dist/utils/platform.js.map +1 -0
- package/dist/utils/project-root.d.ts +22 -0
- package/dist/utils/project-root.d.ts.map +1 -0
- package/dist/utils/project-root.js +226 -0
- package/dist/utils/project-root.js.map +1 -0
- package/dist/utils/prompt-dir-resolver.d.ts +5 -0
- package/dist/utils/prompt-dir-resolver.d.ts.map +1 -0
- package/dist/utils/prompt-dir-resolver.js +25 -0
- package/dist/utils/prompt-dir-resolver.js.map +1 -0
- package/dist/utils/security.d.ts +5 -0
- package/dist/utils/security.d.ts.map +1 -0
- package/dist/utils/security.js +57 -0
- package/dist/utils/security.js.map +1 -0
- package/dist/utils/tool-detection.d.ts +14 -0
- package/dist/utils/tool-detection.d.ts.map +1 -0
- package/dist/utils/tool-detection.js +43 -0
- package/dist/utils/tool-detection.js.map +1 -0
- package/package.json +79 -7
- package/prompts/prompts/ad-hoc-long.prompt +60 -0
- package/prompts/prompts/ad-hoc.prompt +29 -0
- package/prompts/prompts/code-review.prompt +99 -0
- package/prompts/prompts/debugging-error-message.prompt +81 -0
- package/prompts/prompts/fix-github-actions.prompt +62 -0
- package/prompts/prompts/fix-test-errors.prompt +73 -0
- package/prompts/prompts/git-commit-comment.prompt +61 -0
- package/prompts/prompts/implementation-phase.prompt +53 -0
- package/prompts/prompts/implementation-plan.prompt +101 -0
- package/prompts/prompts/new-feature.prompt +89 -0
- package/prompts/prompts/new-project.prompt +9 -0
- package/prompts/prompts/one-shot-change.prompt +79 -0
- package/prompts/prompts/pupt-prompt-improvement.prompt +270 -0
- package/prompts/prompts/simple-test.prompt +8 -0
- package/prompts/prompts/update-design.prompt +71 -0
- package/prompts/prompts/update-documentation.prompt +6 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging-service.d.ts","sourceRoot":"","sources":["../../src/services/logging-service.ts"],"names":[],"mappings":"AAAA,OAAa,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAEzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAGjD,oBAAY,QAAQ;IAClB,KAAK,UAAU;IACf,KAAK,UAAU;IACf,IAAI,SAAS;IACb,IAAI,SAAS;IACb,KAAK,UAAU;IACf,KAAK,UAAU;CAChB;AAED,UAAU,UAAU;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,UAAU,oBAAoB;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA6CnD;AAUD,qBAAa,cAAc;IACb,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAElC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IACxB,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IASzC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IACxB,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IASzC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IACvB,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IASxC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IACvB,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IASxC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IACxB,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IASzC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IACxB,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IASzC,KAAK,CAAC,QAAQ,EAAE,UAAU,GAAG,cAAc;IAIrC,aAAa,CAAC,CAAC,EACnB,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,CAAC,CAAC;CA4Cd;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAc9F;AAED,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,CAEnF;AAYD,UAAU,kBAAkB;IAC1B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,KAAK,kBAAkB,CAAC,CAAC,IAAI,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AAE3D,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,kBAAkB,EAC7D,YAAY,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAClC,kBAAkB,CAAC,CAAC,CAAC,CAsBvB"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import pino from 'pino';
|
|
2
|
+
import { isSensitiveKey } from '../utils/security.js';
|
|
3
|
+
export var LogLevel;
|
|
4
|
+
(function (LogLevel) {
|
|
5
|
+
LogLevel["TRACE"] = "trace";
|
|
6
|
+
LogLevel["DEBUG"] = "debug";
|
|
7
|
+
LogLevel["INFO"] = "info";
|
|
8
|
+
LogLevel["WARN"] = "warn";
|
|
9
|
+
LogLevel["ERROR"] = "error";
|
|
10
|
+
LogLevel["FATAL"] = "fatal";
|
|
11
|
+
})(LogLevel || (LogLevel = {}));
|
|
12
|
+
export function createLogger(config) {
|
|
13
|
+
const isProduction = process.env.NODE_ENV === 'production';
|
|
14
|
+
const isDevelopment = !isProduction;
|
|
15
|
+
// Determine log level priority: config > env > default
|
|
16
|
+
const configLevel = config.logLevel;
|
|
17
|
+
const envLevel = process.env.LOG_LEVEL;
|
|
18
|
+
const defaultLevel = isDevelopment ? 'debug' : 'info';
|
|
19
|
+
const level = configLevel || envLevel || defaultLevel;
|
|
20
|
+
return pino({
|
|
21
|
+
level: validateLogLevel(level),
|
|
22
|
+
transport: isDevelopment ? {
|
|
23
|
+
target: 'pino-pretty',
|
|
24
|
+
options: {
|
|
25
|
+
colorize: true,
|
|
26
|
+
ignore: 'pid,hostname',
|
|
27
|
+
translateTime: 'SYS:standard',
|
|
28
|
+
messageFormat: '{levelLabel} {msg}'
|
|
29
|
+
}
|
|
30
|
+
} : undefined,
|
|
31
|
+
redact: {
|
|
32
|
+
paths: [
|
|
33
|
+
'apiKeys.*',
|
|
34
|
+
'*.password',
|
|
35
|
+
'*.secret',
|
|
36
|
+
'*.token',
|
|
37
|
+
'*.credential',
|
|
38
|
+
'*.privateKey',
|
|
39
|
+
'*.private_key',
|
|
40
|
+
'*.auth',
|
|
41
|
+
'*.bearer'
|
|
42
|
+
],
|
|
43
|
+
censor: '***'
|
|
44
|
+
},
|
|
45
|
+
serializers: {
|
|
46
|
+
error: pino.stdSerializers.err,
|
|
47
|
+
req: pino.stdSerializers.req,
|
|
48
|
+
res: pino.stdSerializers.res
|
|
49
|
+
},
|
|
50
|
+
base: {
|
|
51
|
+
app: 'pupt',
|
|
52
|
+
version: config.version || 'unknown'
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function validateLogLevel(level) {
|
|
57
|
+
const validLevels = Object.values(LogLevel);
|
|
58
|
+
if (validLevels.includes(level)) {
|
|
59
|
+
return level;
|
|
60
|
+
}
|
|
61
|
+
return LogLevel.INFO;
|
|
62
|
+
}
|
|
63
|
+
export class LoggingService {
|
|
64
|
+
logger;
|
|
65
|
+
constructor(logger) {
|
|
66
|
+
this.logger = logger;
|
|
67
|
+
}
|
|
68
|
+
trace(objOrMsg, msg) {
|
|
69
|
+
if (typeof objOrMsg === 'string') {
|
|
70
|
+
this.logger.trace(objOrMsg);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
this.logger.trace(objOrMsg, msg);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
debug(objOrMsg, msg) {
|
|
77
|
+
if (typeof objOrMsg === 'string') {
|
|
78
|
+
this.logger.debug(objOrMsg);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
this.logger.debug(objOrMsg, msg);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
info(objOrMsg, msg) {
|
|
85
|
+
if (typeof objOrMsg === 'string') {
|
|
86
|
+
this.logger.info(objOrMsg);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
this.logger.info(objOrMsg, msg);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
warn(objOrMsg, msg) {
|
|
93
|
+
if (typeof objOrMsg === 'string') {
|
|
94
|
+
this.logger.warn(objOrMsg);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
this.logger.warn(objOrMsg, msg);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
error(objOrMsg, msg) {
|
|
101
|
+
if (typeof objOrMsg === 'string') {
|
|
102
|
+
this.logger.error(objOrMsg);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
this.logger.error(objOrMsg, msg);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
fatal(objOrMsg, msg) {
|
|
109
|
+
if (typeof objOrMsg === 'string') {
|
|
110
|
+
this.logger.fatal(objOrMsg);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
this.logger.fatal(objOrMsg, msg);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
child(bindings) {
|
|
117
|
+
return new LoggingService(this.logger.child(bindings));
|
|
118
|
+
}
|
|
119
|
+
async timeOperation(operation, fn, options = {}) {
|
|
120
|
+
const start = Date.now();
|
|
121
|
+
const { slowThreshold = 1000, context = {} } = options;
|
|
122
|
+
try {
|
|
123
|
+
const result = await fn();
|
|
124
|
+
const duration = Date.now() - start;
|
|
125
|
+
const logContext = {
|
|
126
|
+
operation,
|
|
127
|
+
duration,
|
|
128
|
+
...context
|
|
129
|
+
};
|
|
130
|
+
if (duration > slowThreshold) {
|
|
131
|
+
this.warn({ ...logContext, slowThreshold }, 'Slow operation detected');
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
this.info(logContext, 'Operation completed');
|
|
135
|
+
}
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
const duration = Date.now() - start;
|
|
140
|
+
this.error({
|
|
141
|
+
operation,
|
|
142
|
+
duration,
|
|
143
|
+
error: error instanceof Error ? {
|
|
144
|
+
message: error.message,
|
|
145
|
+
stack: error.stack,
|
|
146
|
+
name: error.name
|
|
147
|
+
} : error,
|
|
148
|
+
...context
|
|
149
|
+
}, 'Operation failed');
|
|
150
|
+
throw error;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
export function formatLogContext(command, options) {
|
|
155
|
+
const sanitizedOptions = Object.entries(options).reduce((acc, [key, value]) => {
|
|
156
|
+
if (isSensitiveKey(key)) {
|
|
157
|
+
acc[key] = '***';
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
acc[key] = value;
|
|
161
|
+
}
|
|
162
|
+
return acc;
|
|
163
|
+
}, {});
|
|
164
|
+
return {
|
|
165
|
+
command,
|
|
166
|
+
options: sanitizedOptions
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
export function createChildLogger(parentLogger, context) {
|
|
170
|
+
return parentLogger.child(context);
|
|
171
|
+
}
|
|
172
|
+
// Create a singleton logger instance
|
|
173
|
+
let defaultLogger = null;
|
|
174
|
+
function getDefaultLogger(config) {
|
|
175
|
+
if (!defaultLogger) {
|
|
176
|
+
defaultLogger = createLogger(config || {});
|
|
177
|
+
}
|
|
178
|
+
return defaultLogger;
|
|
179
|
+
}
|
|
180
|
+
export function enhanceWithLogging(CommandClass) {
|
|
181
|
+
// Type assertion needed due to TypeScript limitation with generic class extension
|
|
182
|
+
return class extends CommandClass {
|
|
183
|
+
async execute() {
|
|
184
|
+
const start = Date.now();
|
|
185
|
+
const logger = this.context?.logger || getDefaultLogger();
|
|
186
|
+
const commandName = this.name || 'unknown';
|
|
187
|
+
const loggingService = new LoggingService(logger);
|
|
188
|
+
try {
|
|
189
|
+
loggingService.info({ command: commandName }, 'Command started');
|
|
190
|
+
const result = await super.execute();
|
|
191
|
+
const duration = Date.now() - start;
|
|
192
|
+
loggingService.info({ command: commandName, duration }, 'Command completed');
|
|
193
|
+
return result;
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
const duration = Date.now() - start;
|
|
197
|
+
loggingService.error({ command: commandName, error, duration }, 'Command failed');
|
|
198
|
+
throw error;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=logging-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging-service.js","sourceRoot":"","sources":["../../src/services/logging-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export interface ModuleCacheResolveOptions {
|
|
2
|
+
noCache?: boolean;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Caches fetched URL and GitHub module content to disk so prompts
|
|
6
|
+
* work offline after the first fetch.
|
|
7
|
+
*/
|
|
8
|
+
export declare class ModuleCache {
|
|
9
|
+
private cacheDir;
|
|
10
|
+
private modulesDir;
|
|
11
|
+
private manifestPath;
|
|
12
|
+
constructor(cacheDir: string);
|
|
13
|
+
/**
|
|
14
|
+
* Resolve a URL or GitHub shorthand to its content, using cache when possible.
|
|
15
|
+
*/
|
|
16
|
+
resolve(url: string, options?: ModuleCacheResolveOptions): Promise<string>;
|
|
17
|
+
/**
|
|
18
|
+
* Clear cached modules. If url is provided, clear only that entry.
|
|
19
|
+
*/
|
|
20
|
+
clear(url?: string): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Get cache statistics.
|
|
23
|
+
*/
|
|
24
|
+
getStats(): Promise<{
|
|
25
|
+
entryCount: number;
|
|
26
|
+
totalSizeMB: number;
|
|
27
|
+
}>;
|
|
28
|
+
private fetchWithConditional;
|
|
29
|
+
private computeHash;
|
|
30
|
+
private computeTtl;
|
|
31
|
+
private isVersionedUrl;
|
|
32
|
+
/**
|
|
33
|
+
* Resolve GitHub shorthand notation to a raw.githubusercontent.com URL.
|
|
34
|
+
* Supports:
|
|
35
|
+
* github:user/repo/path/to/file.js → main branch
|
|
36
|
+
* github:user/repo@branch/path/to/file.js → specific branch/tag
|
|
37
|
+
*/
|
|
38
|
+
private resolveGitHubShorthand;
|
|
39
|
+
private loadManifest;
|
|
40
|
+
private saveManifest;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=module-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-cache.d.ts","sourceRoot":"","sources":["../../src/services/module-cache.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,yBAAyB;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAKD;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAS;gBAEjB,QAAQ,EAAE,MAAM;IAM5B;;OAEG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC;IAkChF;;OAEG;IACG,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBxC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;YAqBxD,oBAAoB;IAwDlC,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,cAAc;IAOtB;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;YA2ChB,YAAY;YAQZ,YAAY;CAI3B"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
const SEVEN_DAYS_SECONDS = 7 * 24 * 60 * 60;
|
|
5
|
+
const ONE_HOUR_SECONDS = 60 * 60;
|
|
6
|
+
/**
|
|
7
|
+
* Caches fetched URL and GitHub module content to disk so prompts
|
|
8
|
+
* work offline after the first fetch.
|
|
9
|
+
*/
|
|
10
|
+
export class ModuleCache {
|
|
11
|
+
cacheDir;
|
|
12
|
+
modulesDir;
|
|
13
|
+
manifestPath;
|
|
14
|
+
constructor(cacheDir) {
|
|
15
|
+
this.cacheDir = cacheDir;
|
|
16
|
+
this.modulesDir = path.join(cacheDir, 'modules');
|
|
17
|
+
this.manifestPath = path.join(cacheDir, 'manifest.json');
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Resolve a URL or GitHub shorthand to its content, using cache when possible.
|
|
21
|
+
*/
|
|
22
|
+
async resolve(url, options) {
|
|
23
|
+
const resolvedUrl = this.resolveGitHubShorthand(url);
|
|
24
|
+
const hash = this.computeHash(resolvedUrl);
|
|
25
|
+
const cachedFilePath = path.join(this.modulesDir, hash);
|
|
26
|
+
const manifest = await this.loadManifest();
|
|
27
|
+
const entry = manifest.entries[url];
|
|
28
|
+
// Check if we have a valid cached entry and noCache is not set
|
|
29
|
+
if (entry && !options?.noCache) {
|
|
30
|
+
const fetchedAt = new Date(entry.fetchedAt).getTime();
|
|
31
|
+
const expiresAt = fetchedAt + entry.ttl * 1000;
|
|
32
|
+
const now = Date.now();
|
|
33
|
+
if (now < expiresAt) {
|
|
34
|
+
// Cache is still valid
|
|
35
|
+
const content = await fs.readFile(cachedFilePath, 'utf-8');
|
|
36
|
+
return content;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Need to fetch (or re-fetch)
|
|
40
|
+
try {
|
|
41
|
+
const content = await this.fetchWithConditional(resolvedUrl, url, entry, cachedFilePath);
|
|
42
|
+
return content;
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
// If fetch fails but we have cached content, return it
|
|
46
|
+
if (entry && await fs.pathExists(cachedFilePath)) {
|
|
47
|
+
return await fs.readFile(cachedFilePath, 'utf-8');
|
|
48
|
+
}
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Clear cached modules. If url is provided, clear only that entry.
|
|
54
|
+
*/
|
|
55
|
+
async clear(url) {
|
|
56
|
+
const manifest = await this.loadManifest();
|
|
57
|
+
if (url) {
|
|
58
|
+
const entry = manifest.entries[url];
|
|
59
|
+
if (entry) {
|
|
60
|
+
const cachedFilePath = path.join(this.modulesDir, entry.hash);
|
|
61
|
+
await fs.remove(cachedFilePath);
|
|
62
|
+
Reflect.deleteProperty(manifest.entries, url);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
// Clear all
|
|
67
|
+
for (const entry of Object.values(manifest.entries)) {
|
|
68
|
+
const cachedFilePath = path.join(this.modulesDir, entry.hash);
|
|
69
|
+
await fs.remove(cachedFilePath);
|
|
70
|
+
}
|
|
71
|
+
manifest.entries = {};
|
|
72
|
+
}
|
|
73
|
+
await this.saveManifest(manifest);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get cache statistics.
|
|
77
|
+
*/
|
|
78
|
+
async getStats() {
|
|
79
|
+
const manifest = await this.loadManifest();
|
|
80
|
+
const entryCount = Object.keys(manifest.entries).length;
|
|
81
|
+
let totalSize = 0;
|
|
82
|
+
for (const entry of Object.values(manifest.entries)) {
|
|
83
|
+
const filePath = path.join(this.modulesDir, entry.hash);
|
|
84
|
+
try {
|
|
85
|
+
const stat = await fs.stat(filePath);
|
|
86
|
+
totalSize += stat.size;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// File might not exist
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
entryCount,
|
|
94
|
+
totalSizeMB: totalSize / (1024 * 1024),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
async fetchWithConditional(resolvedUrl, originalUrl, existingEntry, cachedFilePath) {
|
|
98
|
+
const headers = {};
|
|
99
|
+
// Add conditional headers if we have cached data
|
|
100
|
+
if (existingEntry) {
|
|
101
|
+
if (existingEntry.etag) {
|
|
102
|
+
headers['If-None-Match'] = existingEntry.etag;
|
|
103
|
+
}
|
|
104
|
+
if (existingEntry.lastModified) {
|
|
105
|
+
headers['If-Modified-Since'] = existingEntry.lastModified;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const response = await fetch(resolvedUrl, { headers });
|
|
109
|
+
if (response.status === 304 && existingEntry) {
|
|
110
|
+
// Not modified - update fetchedAt and return cached content
|
|
111
|
+
const manifest = await this.loadManifest();
|
|
112
|
+
manifest.entries[originalUrl] = {
|
|
113
|
+
...existingEntry,
|
|
114
|
+
fetchedAt: new Date().toISOString(),
|
|
115
|
+
};
|
|
116
|
+
await this.saveManifest(manifest);
|
|
117
|
+
return await fs.readFile(cachedFilePath, 'utf-8');
|
|
118
|
+
}
|
|
119
|
+
if (!response.ok) {
|
|
120
|
+
throw new Error(`Failed to fetch ${resolvedUrl}: ${response.status} ${response.statusText}`);
|
|
121
|
+
}
|
|
122
|
+
const content = await response.text();
|
|
123
|
+
const hash = this.computeHash(resolvedUrl);
|
|
124
|
+
// Save content to disk
|
|
125
|
+
await fs.ensureDir(this.modulesDir);
|
|
126
|
+
await fs.writeFile(cachedFilePath, content, 'utf-8');
|
|
127
|
+
// Update manifest
|
|
128
|
+
const manifest = await this.loadManifest();
|
|
129
|
+
manifest.entries[originalUrl] = {
|
|
130
|
+
hash,
|
|
131
|
+
fetchedAt: new Date().toISOString(),
|
|
132
|
+
etag: response.headers.get('ETag') || undefined,
|
|
133
|
+
lastModified: response.headers.get('Last-Modified') || undefined,
|
|
134
|
+
ttl: this.computeTtl(originalUrl),
|
|
135
|
+
};
|
|
136
|
+
await this.saveManifest(manifest);
|
|
137
|
+
return content;
|
|
138
|
+
}
|
|
139
|
+
computeHash(url) {
|
|
140
|
+
return crypto.createHash('sha256').update(url).digest('hex');
|
|
141
|
+
}
|
|
142
|
+
computeTtl(url) {
|
|
143
|
+
return this.isVersionedUrl(url) ? SEVEN_DAYS_SECONDS : ONE_HOUR_SECONDS;
|
|
144
|
+
}
|
|
145
|
+
isVersionedUrl(url) {
|
|
146
|
+
// Check for semver patterns in URL path or query params
|
|
147
|
+
// e.g., /v1.2.3/, @1.2.3, ?v=1.2.3
|
|
148
|
+
const semverPattern = /(?:\/v?\d+\.\d+\.\d+(?:[-+][\w.]+)?[/]?)|(?:[?&]v(?:ersion)?=\d+\.\d+\.\d+)/;
|
|
149
|
+
return semverPattern.test(url);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Resolve GitHub shorthand notation to a raw.githubusercontent.com URL.
|
|
153
|
+
* Supports:
|
|
154
|
+
* github:user/repo/path/to/file.js → main branch
|
|
155
|
+
* github:user/repo@branch/path/to/file.js → specific branch/tag
|
|
156
|
+
*/
|
|
157
|
+
resolveGitHubShorthand(specifier) {
|
|
158
|
+
if (!specifier.startsWith('github:')) {
|
|
159
|
+
return specifier;
|
|
160
|
+
}
|
|
161
|
+
const rest = specifier.slice('github:'.length);
|
|
162
|
+
// Parse user/repo[@branch]/path
|
|
163
|
+
const slashIndex = rest.indexOf('/');
|
|
164
|
+
if (slashIndex === -1) {
|
|
165
|
+
return specifier; // Invalid format, return as-is
|
|
166
|
+
}
|
|
167
|
+
const secondSlashIndex = rest.indexOf('/', slashIndex + 1);
|
|
168
|
+
if (secondSlashIndex === -1) {
|
|
169
|
+
return specifier;
|
|
170
|
+
}
|
|
171
|
+
const userRepo = rest.substring(0, secondSlashIndex);
|
|
172
|
+
const filePath = rest.substring(secondSlashIndex + 1);
|
|
173
|
+
// Check for @branch syntax
|
|
174
|
+
let user;
|
|
175
|
+
let repo;
|
|
176
|
+
let branch = 'main';
|
|
177
|
+
if (userRepo.includes('@')) {
|
|
178
|
+
const atIndex = userRepo.indexOf('@');
|
|
179
|
+
const beforeAt = userRepo.substring(0, atIndex);
|
|
180
|
+
branch = userRepo.substring(atIndex + 1);
|
|
181
|
+
const parts = beforeAt.split('/');
|
|
182
|
+
user = parts[0];
|
|
183
|
+
repo = parts[1];
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
const parts = userRepo.split('/');
|
|
187
|
+
user = parts[0];
|
|
188
|
+
repo = parts[1];
|
|
189
|
+
}
|
|
190
|
+
return `https://raw.githubusercontent.com/${user}/${repo}/${branch}/${filePath}`;
|
|
191
|
+
}
|
|
192
|
+
async loadManifest() {
|
|
193
|
+
try {
|
|
194
|
+
return await fs.readJson(this.manifestPath);
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
return { entries: {} };
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
async saveManifest(manifest) {
|
|
201
|
+
await fs.ensureDir(this.cacheDir);
|
|
202
|
+
await fs.writeJson(this.manifestPath, manifest, { spaces: 2 });
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=module-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-cache.js","sourceRoot":"","sources":["../../src/services/module-cache.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,MAAM,UAAU,CAAC;AAkB1B,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAC5C,MAAM,gBAAgB,GAAG,EAAE,GAAG,EAAE,CAAC;AAEjC;;;GAGG;AACH,MAAM,OAAO,WAAW;IACd,QAAQ,CAAS;IACjB,UAAU,CAAS;IACnB,YAAY,CAAS;IAE7B,YAAY,QAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,OAAmC;QAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAExD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEpC,+DAA+D;QAC/D,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;YACtD,MAAM,SAAS,GAAG,SAAS,GAAG,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC;YAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAEvB,IAAI,GAAG,GAAG,SAAS,EAAE,CAAC;gBACpB,uBAAuB;gBACvB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;gBAC3D,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;QAED,8BAA8B;QAC9B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;YACzF,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uDAAuD;YACvD,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;gBACjD,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YACpD,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,GAAY;QACtB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAE3C,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC9D,MAAM,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;gBAChC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,YAAY;YACZ,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC9D,MAAM,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YAClC,CAAC;YACD,QAAQ,CAAC,OAAO,GAAG,EAAE,CAAC;QACxB,CAAC;QAED,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QAExD,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACxD,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACrC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;QACH,CAAC;QAED,OAAO;YACL,UAAU;YACV,WAAW,EAAE,SAAS,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;SACvC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAChC,WAAmB,EACnB,WAAmB,EACnB,aAA6C,EAC7C,cAAsB;QAEtB,MAAM,OAAO,GAA2B,EAAE,CAAC;QAE3C,iDAAiD;QACjD,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC;gBACvB,OAAO,CAAC,eAAe,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC;YAChD,CAAC;YACD,IAAI,aAAa,CAAC,YAAY,EAAE,CAAC;gBAC/B,OAAO,CAAC,mBAAmB,CAAC,GAAG,aAAa,CAAC,YAAY,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAEvD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;YAC7C,4DAA4D;YAC5D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YAC3C,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG;gBAC9B,GAAG,aAAa;gBAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YACF,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAClC,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,mBAAmB,WAAW,KAAK,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC/F,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAE3C,uBAAuB;QACvB,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpC,MAAM,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAErD,kBAAkB;QAClB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG;YAC9B,IAAI;YACJ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS;YAC/C,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,SAAS;YAChE,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;SAClC,CAAC;QACF,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAElC,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,WAAW,CAAC,GAAW;QAC7B,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC;IAEO,UAAU,CAAC,GAAW;QAC5B,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAC1E,CAAC;IAEO,cAAc,CAAC,GAAW;QAChC,wDAAwD;QACxD,mCAAmC;QACnC,MAAM,aAAa,GAAG,6EAA6E,CAAC;QACpG,OAAO,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED;;;;;OAKG;IACK,sBAAsB,CAAC,SAAiB;QAC9C,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACrC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAE/C,gCAAgC;QAChC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;YACtB,OAAO,SAAS,CAAC,CAAC,+BAA+B;QACnD,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;QAC3D,IAAI,gBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC;YAC5B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;QAEtD,2BAA2B;QAC3B,IAAI,IAAY,CAAC;QACjB,IAAI,IAAY,CAAC;QACjB,IAAI,MAAM,GAAG,MAAM,CAAC;QAEpB,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAChD,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YAEzC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAChB,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAChB,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,qCAAqC,IAAI,IAAI,IAAI,IAAI,MAAM,IAAI,QAAQ,EAAE,CAAC;IACnF,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,QAAuB;QAChD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ModuleEntry } from '@pupt/lib';
|
|
2
|
+
import type { Config } from '../types/config.js';
|
|
3
|
+
export interface BuildModuleEntriesOptions {
|
|
4
|
+
config: Config;
|
|
5
|
+
/** CLI --prompt-dir overrides (highest priority) */
|
|
6
|
+
cliPromptDirs?: string[];
|
|
7
|
+
/** Starting directory for auto-discovering .prompts/ */
|
|
8
|
+
startDir?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Build a ModuleEntry[] from pupt's existing config fields.
|
|
12
|
+
*
|
|
13
|
+
* Priority order:
|
|
14
|
+
* 1. CLI --prompt-dir overrides
|
|
15
|
+
* 2. Auto-discovered {projectRoot}/.prompts/
|
|
16
|
+
* 3. Config promptDirs (local directories)
|
|
17
|
+
* 4. Config libraries → ResolvedModuleEntry
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildModuleEntries(options: BuildModuleEntriesOptions): Promise<ModuleEntry[]>;
|
|
20
|
+
//# sourceMappingURL=module-entry-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-entry-builder.d.ts","sourceRoot":"","sources":["../../src/services/module-entry-builder.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG7C,OAAO,KAAK,EAAE,MAAM,EAAgB,MAAM,oBAAoB,CAAC;AAI/D,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAoCnG"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { getDataDir } from '../config/global-paths.js';
|
|
3
|
+
import { findLocalPromptsDir } from '../utils/prompt-dir-resolver.js';
|
|
4
|
+
import { scanLocalPromptDir } from './pupt-prompt-source.js';
|
|
5
|
+
/**
|
|
6
|
+
* Build a ModuleEntry[] from pupt's existing config fields.
|
|
7
|
+
*
|
|
8
|
+
* Priority order:
|
|
9
|
+
* 1. CLI --prompt-dir overrides
|
|
10
|
+
* 2. Auto-discovered {projectRoot}/.prompts/
|
|
11
|
+
* 3. Config promptDirs (local directories)
|
|
12
|
+
* 4. Config libraries → ResolvedModuleEntry
|
|
13
|
+
*/
|
|
14
|
+
export async function buildModuleEntries(options) {
|
|
15
|
+
const { config, cliPromptDirs, startDir } = options;
|
|
16
|
+
const seen = new Set();
|
|
17
|
+
const entries = [];
|
|
18
|
+
async function addLocalDir(dir) {
|
|
19
|
+
const resolved = path.resolve(dir);
|
|
20
|
+
if (!seen.has(resolved)) {
|
|
21
|
+
seen.add(resolved);
|
|
22
|
+
const sources = await scanLocalPromptDir(resolved);
|
|
23
|
+
entries.push(...sources);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// 1. CLI --prompt-dir overrides (highest priority)
|
|
27
|
+
if (cliPromptDirs) {
|
|
28
|
+
for (const dir of cliPromptDirs) {
|
|
29
|
+
await addLocalDir(dir);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// 2. Auto-discovered {projectRoot}/.prompts/
|
|
33
|
+
const localDir = await findLocalPromptsDir(startDir);
|
|
34
|
+
if (localDir) {
|
|
35
|
+
await addLocalDir(localDir);
|
|
36
|
+
}
|
|
37
|
+
// 3. Config promptDirs (local directories)
|
|
38
|
+
for (const dir of config.promptDirs) {
|
|
39
|
+
await addLocalDir(dir);
|
|
40
|
+
}
|
|
41
|
+
// 4. Libraries → scan each library's promptDirs for .prompt files
|
|
42
|
+
if (config.libraries) {
|
|
43
|
+
const dataDir = getDataDir();
|
|
44
|
+
for (const lib of config.libraries) {
|
|
45
|
+
const libDirs = getLibraryPromptDirs(lib, dataDir);
|
|
46
|
+
for (const dir of libDirs) {
|
|
47
|
+
await addLocalDir(dir);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return entries;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get the absolute prompt directories for a library entry.
|
|
55
|
+
*/
|
|
56
|
+
function getLibraryPromptDirs(lib, dataDir) {
|
|
57
|
+
let basePath;
|
|
58
|
+
if (lib.type === 'git') {
|
|
59
|
+
basePath = path.join(dataDir, 'libraries', lib.name);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
// npm: resolved from the local packages directory
|
|
63
|
+
basePath = path.join(dataDir, 'packages', 'node_modules', lib.name);
|
|
64
|
+
}
|
|
65
|
+
if (lib.promptDirs && lib.promptDirs.length > 0) {
|
|
66
|
+
return lib.promptDirs.map(dir => path.join(basePath, dir));
|
|
67
|
+
}
|
|
68
|
+
// Default: scan the library root
|
|
69
|
+
return [basePath];
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=module-entry-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-entry-builder.js","sourceRoot":"","sources":["../../src/services/module-entry-builder.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAU7D;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAkC;IACzE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACpD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,KAAK,UAAU,WAAW,CAAC,GAAW;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACnB,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,IAAI,aAAa,EAAE,CAAC;QAClB,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAAA,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;QAAA,CAAC;IAC5D,CAAC;IAED,6CAA6C;IAC7C,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACrD,IAAI,QAAQ,EAAE,CAAC;QAAA,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAAA,CAAC;IAE5C,2CAA2C;IAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAAA,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IAAA,CAAC;IAE9D,kEAAkE;IAClE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACnD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAAA,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;YAAA,CAAC;QACtD,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,GAAiB,EAAE,OAAe;IAC9D,IAAI,QAAgB,CAAC;IACrB,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACvB,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,kDAAkD;QAClD,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,iCAAiC;IACjC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export declare function extractUserInputLines(jsonFile: string): Promise<string[]>;
|
|
2
|
+
export declare function calculateActiveExecutionTime(jsonFile: string, inputWaitThreshold?: bigint): Promise<bigint>;
|
|
3
|
+
interface CaptureResult {
|
|
4
|
+
exitCode: number | null;
|
|
5
|
+
outputFile: string;
|
|
6
|
+
outputSize: number;
|
|
7
|
+
truncated?: boolean;
|
|
8
|
+
error?: string;
|
|
9
|
+
}
|
|
10
|
+
interface CaptureHandle {
|
|
11
|
+
promise: Promise<CaptureResult>;
|
|
12
|
+
kill: () => void;
|
|
13
|
+
}
|
|
14
|
+
interface OutputCaptureOptions {
|
|
15
|
+
outputDirectory?: string;
|
|
16
|
+
maxOutputSize?: number;
|
|
17
|
+
}
|
|
18
|
+
export declare class OutputCaptureService {
|
|
19
|
+
private readonly options;
|
|
20
|
+
private defaultMaxSize;
|
|
21
|
+
constructor(options?: OutputCaptureOptions);
|
|
22
|
+
captureCommandWithHandle(command: string, args: string[], prompt: string, outputPath: string): CaptureHandle;
|
|
23
|
+
captureCommand(command: string, args: string[], prompt: string, outputPath: string): Promise<CaptureResult>;
|
|
24
|
+
private _captureCommandInternal;
|
|
25
|
+
cleanupOldOutputs(retentionDays?: number): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=output-capture-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-capture-service.d.ts","sourceRoot":"","sources":["../../src/services/output-capture-service.ts"],"names":[],"mappings":"AA0BA,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAOzE;AAGD,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,EAAE,kBAAkB,SAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BjH;AAQD,UAAU,aAAa;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,aAAa;IACrB,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,UAAU,oBAAoB;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAOD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,cAAc,CAAoB;gBAE9B,OAAO,GAAE,oBAAyB;IAO9C,wBAAwB,CACtB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,aAAa;IAqBV,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC;YAIX,uBAAuB;IA4Q/B,iBAAiB,CAAC,aAAa,GAAE,MAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAwBnE"}
|