poe-code 3.0.29 → 3.0.31
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 +2 -2
- package/dist/bin/poe-claude.js +23 -0
- package/dist/bin/poe-codex.js +23 -0
- package/dist/bin/poe-kimi-cli.js +23 -0
- package/dist/bin/poe-opencode.js +23 -0
- package/dist/bin.cjs +9 -0
- package/dist/cli/binary-aliases.d.ts +7 -0
- package/dist/cli/binary-aliases.js +26 -0
- package/dist/cli/binary-aliases.js.map +1 -0
- package/dist/cli/bootstrap.d.ts +4 -0
- package/dist/cli/bootstrap.js +78 -0
- package/dist/cli/bootstrap.js.map +1 -0
- package/dist/cli/command-not-found.d.ts +8 -0
- package/dist/cli/command-not-found.js +34 -0
- package/dist/cli/command-not-found.js.map +1 -0
- package/dist/cli/commands/configure-payload.d.ts +15 -0
- package/dist/cli/commands/configure-payload.js +31 -0
- package/dist/cli/commands/configure-payload.js.map +1 -0
- package/dist/cli/commands/configure.d.ts +12 -0
- package/dist/cli/commands/configure.js +151 -0
- package/dist/cli/commands/configure.js.map +1 -0
- package/dist/cli/commands/ensure-isolated-config.d.ts +12 -0
- package/dist/cli/commands/ensure-isolated-config.js +53 -0
- package/dist/cli/commands/ensure-isolated-config.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +9 -0
- package/dist/cli/commands/generate.js +322 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/install.d.ts +4 -0
- package/dist/cli/commands/install.js +40 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/login.d.ts +6 -0
- package/dist/cli/commands/login.js +105 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +3 -0
- package/dist/cli/commands/mcp.js +178 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/models.d.ts +3 -0
- package/dist/cli/commands/models.js +183 -0
- package/dist/cli/commands/models.js.map +1 -0
- package/dist/cli/commands/ralph-worktree.d.ts +3 -0
- package/dist/cli/commands/ralph-worktree.js +73 -0
- package/dist/cli/commands/ralph-worktree.js.map +1 -0
- package/dist/cli/commands/ralph.d.ts +3 -0
- package/dist/cli/commands/ralph.js +424 -0
- package/dist/cli/commands/ralph.js.map +1 -0
- package/dist/cli/commands/shared.d.ts +29 -0
- package/dist/cli/commands/shared.js +82 -0
- package/dist/cli/commands/shared.js.map +1 -0
- package/dist/cli/commands/skill.d.ts +3 -0
- package/dist/cli/commands/skill.js +242 -0
- package/dist/cli/commands/skill.js.map +1 -0
- package/dist/cli/commands/spawn.d.ts +17 -0
- package/dist/cli/commands/spawn.js +226 -0
- package/dist/cli/commands/spawn.js.map +1 -0
- package/dist/cli/commands/test.d.ts +8 -0
- package/dist/cli/commands/test.js +124 -0
- package/dist/cli/commands/test.js.map +1 -0
- package/dist/cli/commands/unconfigure.d.ts +7 -0
- package/dist/cli/commands/unconfigure.js +116 -0
- package/dist/cli/commands/unconfigure.js.map +1 -0
- package/dist/cli/commands/usage.d.ts +3 -0
- package/dist/cli/commands/usage.js +186 -0
- package/dist/cli/commands/usage.js.map +1 -0
- package/dist/cli/commands/version.d.ts +3 -0
- package/dist/cli/commands/version.js +31 -0
- package/dist/cli/commands/version.js.map +1 -0
- package/dist/cli/commands/wrap.d.ts +3 -0
- package/dist/cli/commands/wrap.js +61 -0
- package/dist/cli/commands/wrap.js.map +1 -0
- package/dist/cli/constants.d.ts +24 -0
- package/dist/cli/constants.js +44 -0
- package/dist/cli/constants.js.map +1 -0
- package/dist/cli/container.d.ts +42 -0
- package/dist/cli/container.js +90 -0
- package/dist/cli/container.js.map +1 -0
- package/dist/cli/context.d.ts +33 -0
- package/dist/cli/context.js +91 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/environment.d.ts +21 -0
- package/dist/cli/environment.js +106 -0
- package/dist/cli/environment.js.map +1 -0
- package/dist/cli/error-logger.d.ts +62 -0
- package/dist/cli/error-logger.js +155 -0
- package/dist/cli/error-logger.js.map +1 -0
- package/dist/cli/errors.d.ts +95 -0
- package/dist/cli/errors.js +141 -0
- package/dist/cli/errors.js.map +1 -0
- package/dist/cli/exit-signals.d.ts +4 -0
- package/dist/cli/exit-signals.js +8 -0
- package/dist/cli/exit-signals.js.map +1 -0
- package/dist/cli/http.d.ts +12 -0
- package/dist/cli/http.js +2 -0
- package/dist/cli/http.js.map +1 -0
- package/dist/cli/isolated-env-runner.d.ts +10 -0
- package/dist/cli/isolated-env-runner.js +50 -0
- package/dist/cli/isolated-env-runner.js.map +1 -0
- package/dist/cli/isolated-env.d.ts +24 -0
- package/dist/cli/isolated-env.js +210 -0
- package/dist/cli/isolated-env.js.map +1 -0
- package/dist/cli/logger.d.ts +36 -0
- package/dist/cli/logger.js +191 -0
- package/dist/cli/logger.js.map +1 -0
- package/dist/cli/mcp-output-format.d.ts +2 -0
- package/dist/cli/mcp-output-format.js +27 -0
- package/dist/cli/mcp-output-format.js.map +1 -0
- package/dist/cli/mcp-server.d.ts +21 -0
- package/dist/cli/mcp-server.js +321 -0
- package/dist/cli/mcp-server.js.map +1 -0
- package/dist/cli/options.d.ts +45 -0
- package/dist/cli/options.js +111 -0
- package/dist/cli/options.js.map +1 -0
- package/dist/cli/poe-code-command-runner.d.ts +6 -0
- package/dist/cli/poe-code-command-runner.js +63 -0
- package/dist/cli/poe-code-command-runner.js.map +1 -0
- package/dist/cli/program.d.ts +4 -0
- package/dist/cli/program.js +249 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/cli/prompt-runner.d.ts +10 -0
- package/dist/cli/prompt-runner.js +79 -0
- package/dist/cli/prompt-runner.js.map +1 -0
- package/dist/cli/prompts.d.ts +39 -0
- package/dist/cli/prompts.js +42 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/cli/service-registry.d.ts +108 -0
- package/dist/cli/service-registry.js +83 -0
- package/dist/cli/service-registry.js.map +1 -0
- package/dist/cli/types.d.ts +2 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli/ui/service-menu.d.ts +7 -0
- package/dist/cli/ui/service-menu.js +43 -0
- package/dist/cli/ui/service-menu.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +36812 -0
- package/dist/index.js.map +7 -0
- package/dist/providers/claude-code.d.ts +13 -0
- package/dist/providers/claude-code.js +143 -0
- package/dist/providers/claude-code.js.map +1 -0
- package/dist/providers/codex.d.ts +17 -0
- package/dist/providers/codex.js +144 -0
- package/dist/providers/codex.js.map +1 -0
- package/dist/providers/create-provider.d.ts +29 -0
- package/dist/providers/create-provider.js +78 -0
- package/dist/providers/create-provider.js.map +1 -0
- package/dist/providers/index.d.ts +2 -0
- package/dist/providers/index.js +8 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/kimi.d.ts +4 -0
- package/dist/providers/kimi.js +123 -0
- package/dist/providers/kimi.js.map +1 -0
- package/dist/providers/opencode.d.ts +3 -0
- package/dist/providers/opencode.js +119 -0
- package/dist/providers/opencode.js.map +1 -0
- package/dist/providers/spawn-options.d.ts +13 -0
- package/dist/providers/spawn-options.js +2 -0
- package/dist/providers/spawn-options.js.map +1 -0
- package/dist/sdk/container.d.ts +18 -0
- package/dist/sdk/container.js +127 -0
- package/dist/sdk/container.js.map +1 -0
- package/dist/sdk/credentials.d.ts +9 -0
- package/dist/sdk/credentials.js +35 -0
- package/dist/sdk/credentials.js.map +1 -0
- package/dist/sdk/generate.d.ts +5 -0
- package/dist/sdk/generate.js +97 -0
- package/dist/sdk/generate.js.map +1 -0
- package/dist/sdk/spawn-core.d.ts +23 -0
- package/dist/sdk/spawn-core.js +105 -0
- package/dist/sdk/spawn-core.js.map +1 -0
- package/dist/sdk/spawn.d.ts +31 -0
- package/dist/sdk/spawn.js +109 -0
- package/dist/sdk/spawn.js.map +1 -0
- package/dist/sdk/types.d.ts +44 -0
- package/dist/sdk/types.js +2 -0
- package/dist/sdk/types.js.map +1 -0
- package/dist/services/client-instance.d.ts +12 -0
- package/dist/services/client-instance.js +36 -0
- package/dist/services/client-instance.js.map +1 -0
- package/dist/services/credentials.d.ts +24 -0
- package/dist/services/credentials.js +157 -0
- package/dist/services/credentials.js.map +1 -0
- package/dist/services/llm-client.d.ts +22 -0
- package/dist/services/llm-client.js +138 -0
- package/dist/services/llm-client.js.map +1 -0
- package/dist/services/media-download.d.ts +17 -0
- package/dist/services/media-download.js +42 -0
- package/dist/services/media-download.js.map +1 -0
- package/dist/services/model-strategy.d.ts +99 -0
- package/dist/services/model-strategy.js +187 -0
- package/dist/services/model-strategy.js.map +1 -0
- package/dist/services/mutation-events.d.ts +4 -0
- package/dist/services/mutation-events.js +53 -0
- package/dist/services/mutation-events.js.map +1 -0
- package/dist/services/service-install.d.ts +22 -0
- package/dist/services/service-install.js +70 -0
- package/dist/services/service-install.js.map +1 -0
- package/dist/services/version.d.ts +11 -0
- package/dist/services/version.js +28 -0
- package/dist/services/version.js.map +1 -0
- package/dist/tools/label-generator.d.ts +11 -0
- package/dist/tools/label-generator.js +78 -0
- package/dist/tools/label-generator.js.map +1 -0
- package/dist/utils/backup.d.ts +5 -0
- package/dist/utils/backup.js +56 -0
- package/dist/utils/backup.js.map +1 -0
- package/dist/utils/cli-settings-merge.d.ts +22 -0
- package/dist/utils/cli-settings-merge.js +56 -0
- package/dist/utils/cli-settings-merge.js.map +1 -0
- package/dist/utils/command-checks.d.ts +36 -0
- package/dist/utils/command-checks.js +120 -0
- package/dist/utils/command-checks.js.map +1 -0
- package/dist/utils/command-line.d.ts +1 -0
- package/dist/utils/command-line.js +54 -0
- package/dist/utils/command-line.js.map +1 -0
- package/dist/utils/dry-run.d.ts +39 -0
- package/dist/utils/dry-run.js +315 -0
- package/dist/utils/dry-run.js.map +1 -0
- package/dist/utils/execution-context.d.ts +48 -0
- package/dist/utils/execution-context.js +151 -0
- package/dist/utils/execution-context.js.map +1 -0
- package/dist/utils/file-system.d.ts +21 -0
- package/dist/utils/file-system.js +2 -0
- package/dist/utils/file-system.js.map +1 -0
- package/dist/utils/json.d.ts +12 -0
- package/dist/utils/json.js +45 -0
- package/dist/utils/json.js.map +1 -0
- package/package.json +5 -2
- package/packages/tiny-mcp-test-server/dist/index.js +47 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import * as nodeFsSync from "node:fs";
|
|
2
|
+
import { loadCredentials, saveCredentials } from "../services/credentials.js";
|
|
3
|
+
import { createCliEnvironment } from "./environment.js";
|
|
4
|
+
import { createServiceRegistry } from "./service-registry.js";
|
|
5
|
+
import { createCommandContextFactory } from "./context.js";
|
|
6
|
+
import { createPromptLibrary } from "./prompts.js";
|
|
7
|
+
import { createOptionResolvers } from "./options.js";
|
|
8
|
+
import { createLoggerFactory } from "./logger.js";
|
|
9
|
+
import { ErrorLogger } from "./error-logger.js";
|
|
10
|
+
import { runCommand } from "@poe-code/agent-spawn";
|
|
11
|
+
import { text, symbols } from "@poe-code/design-system";
|
|
12
|
+
import { getDefaultProviders } from "../providers/index.js";
|
|
13
|
+
import { createPoeCodeCommandRunner } from "./poe-code-command-runner.js";
|
|
14
|
+
export function createCliContainer(dependencies) {
|
|
15
|
+
const environment = createCliEnvironment({
|
|
16
|
+
cwd: dependencies.env.cwd,
|
|
17
|
+
homeDir: dependencies.env.homeDir,
|
|
18
|
+
platform: dependencies.env.platform,
|
|
19
|
+
variables: dependencies.env.variables
|
|
20
|
+
});
|
|
21
|
+
const loggerFactory = createLoggerFactory(dependencies.logger, {
|
|
22
|
+
intro: text.intro,
|
|
23
|
+
resolvedSymbol: symbols.resolved
|
|
24
|
+
});
|
|
25
|
+
// Create error logger - use node:fs for sync operations
|
|
26
|
+
const errorLogger = new ErrorLogger({
|
|
27
|
+
fs: nodeFsSync,
|
|
28
|
+
logDir: environment.logDir,
|
|
29
|
+
logToStderr: true
|
|
30
|
+
});
|
|
31
|
+
// Attach error logger to logger factory
|
|
32
|
+
loggerFactory.setErrorLogger(errorLogger);
|
|
33
|
+
const contextFactory = createCommandContextFactory({
|
|
34
|
+
fs: dependencies.fs
|
|
35
|
+
});
|
|
36
|
+
const httpClient = dependencies.httpClient ??
|
|
37
|
+
(async (url, init) => {
|
|
38
|
+
const response = await globalThis.fetch(url, init);
|
|
39
|
+
return {
|
|
40
|
+
ok: response.ok,
|
|
41
|
+
status: response.status,
|
|
42
|
+
json: () => response.json(),
|
|
43
|
+
text: () => response.text()
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
const commandRunner = dependencies.commandRunner ?? runCommand;
|
|
47
|
+
const promptLibrary = createPromptLibrary();
|
|
48
|
+
const options = createOptionResolvers({
|
|
49
|
+
prompts: dependencies.prompts,
|
|
50
|
+
promptLibrary,
|
|
51
|
+
apiKeyStore: {
|
|
52
|
+
read: () => loadCredentials({
|
|
53
|
+
fs: dependencies.fs,
|
|
54
|
+
filePath: environment.credentialsPath
|
|
55
|
+
}),
|
|
56
|
+
write: (value) => saveCredentials({
|
|
57
|
+
fs: dependencies.fs,
|
|
58
|
+
filePath: environment.credentialsPath,
|
|
59
|
+
apiKey: value
|
|
60
|
+
})
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
const registry = createServiceRegistry();
|
|
64
|
+
const providers = getDefaultProviders().filter((adapter) => !adapter.disabled);
|
|
65
|
+
for (const adapter of providers) {
|
|
66
|
+
registry.register(adapter);
|
|
67
|
+
}
|
|
68
|
+
let container = null;
|
|
69
|
+
const wrappedRunner = createPoeCodeCommandRunner({
|
|
70
|
+
getContainer: () => container,
|
|
71
|
+
baseRunner: commandRunner
|
|
72
|
+
});
|
|
73
|
+
container = {
|
|
74
|
+
env: environment,
|
|
75
|
+
fs: dependencies.fs,
|
|
76
|
+
prompts: dependencies.prompts,
|
|
77
|
+
promptLibrary,
|
|
78
|
+
loggerFactory,
|
|
79
|
+
errorLogger,
|
|
80
|
+
options,
|
|
81
|
+
contextFactory,
|
|
82
|
+
registry,
|
|
83
|
+
httpClient,
|
|
84
|
+
commandRunner: wrappedRunner,
|
|
85
|
+
providers,
|
|
86
|
+
dependencies
|
|
87
|
+
};
|
|
88
|
+
return container;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=container.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/cli/container.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { FileSystem } from "../utils/file-system.js";
|
|
2
|
+
import type { CommandRunner, CommandRunnerResult } from "../utils/command-checks.js";
|
|
3
|
+
import type { ScopedLogger } from "./logger.js";
|
|
4
|
+
export interface CommandContextOptions {
|
|
5
|
+
dryRun: boolean;
|
|
6
|
+
logger: ScopedLogger;
|
|
7
|
+
runner: CommandRunner;
|
|
8
|
+
}
|
|
9
|
+
export interface CommandContextComplete {
|
|
10
|
+
success: string;
|
|
11
|
+
dry: string;
|
|
12
|
+
}
|
|
13
|
+
export interface CommandContext {
|
|
14
|
+
fs: FileSystem;
|
|
15
|
+
runCommand: CommandRunner;
|
|
16
|
+
runCommandWithEnv(command: string, args: string[], options?: {
|
|
17
|
+
cwd?: string;
|
|
18
|
+
env?: Record<string, string | undefined>;
|
|
19
|
+
}): Promise<CommandRunnerResult>;
|
|
20
|
+
flushDryRun(options?: {
|
|
21
|
+
emitIfEmpty?: boolean;
|
|
22
|
+
}): void;
|
|
23
|
+
complete(messages: CommandContextComplete): void;
|
|
24
|
+
finalize(): void;
|
|
25
|
+
}
|
|
26
|
+
export interface CommandContextFactoryInit {
|
|
27
|
+
fs: FileSystem;
|
|
28
|
+
}
|
|
29
|
+
export interface CommandContextFactory {
|
|
30
|
+
create(options: CommandContextOptions): CommandContext;
|
|
31
|
+
}
|
|
32
|
+
export declare function createCommandContextFactory(init: CommandContextFactoryInit): CommandContextFactory;
|
|
33
|
+
export declare function createLoggingCommandRunner(runner: CommandRunner, logger: ScopedLogger): CommandRunner;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { DryRunRecorder, createDryRunFileSystem, formatDryRunOperations } from "../utils/dry-run.js";
|
|
2
|
+
import { FEEDBACK_URL } from "./constants.js";
|
|
3
|
+
export function createCommandContextFactory(init) {
|
|
4
|
+
const { fs } = init;
|
|
5
|
+
const create = (options) => {
|
|
6
|
+
if (!options.dryRun) {
|
|
7
|
+
return {
|
|
8
|
+
fs,
|
|
9
|
+
runCommand: options.runner,
|
|
10
|
+
runCommandWithEnv(command, args, runOptions) {
|
|
11
|
+
return options.runner(command, args, {
|
|
12
|
+
cwd: runOptions?.cwd,
|
|
13
|
+
env: runOptions?.env
|
|
14
|
+
});
|
|
15
|
+
},
|
|
16
|
+
flushDryRun() { },
|
|
17
|
+
complete(messages) {
|
|
18
|
+
options.logger.success(messages.success);
|
|
19
|
+
},
|
|
20
|
+
finalize() {
|
|
21
|
+
options.logger.feedback("Problems?", FEEDBACK_URL);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const recorder = new DryRunRecorder();
|
|
26
|
+
const proxyFs = createDryRunFileSystem(fs, recorder);
|
|
27
|
+
const recordedCommands = new Set();
|
|
28
|
+
let hasEmittedOperations = false;
|
|
29
|
+
const flush = (emitIfEmpty = false) => {
|
|
30
|
+
const operations = recorder.drain();
|
|
31
|
+
if (operations.length === 0) {
|
|
32
|
+
if (emitIfEmpty && !hasEmittedOperations) {
|
|
33
|
+
const lines = formatDryRunOperations(operations);
|
|
34
|
+
for (const line of lines) {
|
|
35
|
+
options.logger.info(line);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
hasEmittedOperations = true;
|
|
41
|
+
for (const line of formatDryRunOperations(operations)) {
|
|
42
|
+
const base = extractBaseCommand(line);
|
|
43
|
+
if (!recordedCommands.has(base)) {
|
|
44
|
+
options.logger.info(line);
|
|
45
|
+
recordedCommands.add(base);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
return {
|
|
50
|
+
fs: proxyFs,
|
|
51
|
+
runCommand: options.runner,
|
|
52
|
+
runCommandWithEnv(command, args, runOptions) {
|
|
53
|
+
return options.runner(command, args, {
|
|
54
|
+
cwd: runOptions?.cwd,
|
|
55
|
+
env: runOptions?.env
|
|
56
|
+
});
|
|
57
|
+
},
|
|
58
|
+
flushDryRun({ emitIfEmpty } = {}) {
|
|
59
|
+
flush(Boolean(emitIfEmpty));
|
|
60
|
+
},
|
|
61
|
+
complete(messages) {
|
|
62
|
+
options.logger.dryRun(messages.dry);
|
|
63
|
+
flush(true);
|
|
64
|
+
},
|
|
65
|
+
finalize() {
|
|
66
|
+
options.logger.feedback("Problems?", FEEDBACK_URL);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
return { create };
|
|
71
|
+
}
|
|
72
|
+
export function createLoggingCommandRunner(runner, logger) {
|
|
73
|
+
return async (command, args, options) => {
|
|
74
|
+
const rendered = [command, ...args].join(" ").trim();
|
|
75
|
+
const suffix = options?.cwd ? ` (cwd: ${options.cwd})` : "";
|
|
76
|
+
logger.verbose(`> ${rendered}${suffix}`);
|
|
77
|
+
if (options) {
|
|
78
|
+
return runner(command, args, options);
|
|
79
|
+
}
|
|
80
|
+
return runner(command, args);
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function extractBaseCommand(message) {
|
|
84
|
+
const raw = stripAnsi(message);
|
|
85
|
+
const detailIndex = raw.indexOf(" #");
|
|
86
|
+
return detailIndex >= 0 ? raw.slice(0, detailIndex).trim() : raw.trim();
|
|
87
|
+
}
|
|
88
|
+
function stripAnsi(value) {
|
|
89
|
+
return value.replace(/\u001B\[[0-9;]*m/g, "");
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/cli/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface CliEnvironmentInit {
|
|
2
|
+
cwd: string;
|
|
3
|
+
homeDir: string;
|
|
4
|
+
platform?: NodeJS.Platform;
|
|
5
|
+
variables?: Record<string, string | undefined>;
|
|
6
|
+
}
|
|
7
|
+
export interface CliEnvironment {
|
|
8
|
+
readonly cwd: string;
|
|
9
|
+
readonly homeDir: string;
|
|
10
|
+
readonly platform: NodeJS.Platform;
|
|
11
|
+
readonly credentialsPath: string;
|
|
12
|
+
readonly logDir: string;
|
|
13
|
+
readonly poeApiBaseUrl: string;
|
|
14
|
+
readonly poeBaseUrl: string;
|
|
15
|
+
readonly variables: Record<string, string | undefined>;
|
|
16
|
+
resolveHomePath: (...segments: string[]) => string;
|
|
17
|
+
getVariable: (name: string) => string | undefined;
|
|
18
|
+
}
|
|
19
|
+
export declare function createCliEnvironment(init: CliEnvironmentInit): CliEnvironment;
|
|
20
|
+
export declare function resolveCredentialsPath(homeDir: string): string;
|
|
21
|
+
export declare function resolveLogDir(homeDir: string): string;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
export function createCliEnvironment(init) {
|
|
3
|
+
const platform = init.platform ?? process.platform;
|
|
4
|
+
const variables = init.variables ?? process.env;
|
|
5
|
+
const credentialsPath = resolveCredentialsPath(init.homeDir);
|
|
6
|
+
const logDir = resolveLogDir(init.homeDir);
|
|
7
|
+
const { poeApiBaseUrl, poeBaseUrl } = resolvePoeBaseUrls(variables);
|
|
8
|
+
const resolveHomePath = (...segments) => path.join(init.homeDir, ...segments);
|
|
9
|
+
const getVariable = (name) => variables[name];
|
|
10
|
+
return {
|
|
11
|
+
cwd: init.cwd,
|
|
12
|
+
homeDir: init.homeDir,
|
|
13
|
+
platform,
|
|
14
|
+
credentialsPath,
|
|
15
|
+
logDir,
|
|
16
|
+
poeApiBaseUrl,
|
|
17
|
+
poeBaseUrl,
|
|
18
|
+
variables,
|
|
19
|
+
resolveHomePath,
|
|
20
|
+
getVariable
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export function resolveCredentialsPath(homeDir) {
|
|
24
|
+
return path.join(homeDir, ".poe-code", "credentials.json");
|
|
25
|
+
}
|
|
26
|
+
export function resolveLogDir(homeDir) {
|
|
27
|
+
return path.join(homeDir, ".poe-code", "logs");
|
|
28
|
+
}
|
|
29
|
+
const DEFAULT_POE_API_BASE_URL = "https://api.poe.com/v1";
|
|
30
|
+
function resolvePoeBaseUrls(variables) {
|
|
31
|
+
const raw = variables.POE_BASE_URL;
|
|
32
|
+
const baseInput = typeof raw === "string" && raw.trim().length > 0
|
|
33
|
+
? raw.trim()
|
|
34
|
+
: DEFAULT_POE_API_BASE_URL;
|
|
35
|
+
const parsed = parseUrl(baseInput);
|
|
36
|
+
if (!parsed) {
|
|
37
|
+
const trimmed = trimTrailingSlash(baseInput.trim());
|
|
38
|
+
return {
|
|
39
|
+
poeApiBaseUrl: ensureV1Suffix(trimmed),
|
|
40
|
+
poeBaseUrl: stripV1Suffix(trimmed)
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const normalizedPath = normalizePath(parsed.pathname);
|
|
44
|
+
return {
|
|
45
|
+
poeApiBaseUrl: buildApiBaseUrl(parsed.origin, normalizedPath),
|
|
46
|
+
poeBaseUrl: buildPoeBaseUrl(parsed.origin, normalizedPath)
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function parseUrl(value) {
|
|
50
|
+
try {
|
|
51
|
+
return new URL(value);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function normalizePath(pathname) {
|
|
58
|
+
if (pathname === "/" || pathname === "") {
|
|
59
|
+
return "";
|
|
60
|
+
}
|
|
61
|
+
if (pathname.endsWith("/")) {
|
|
62
|
+
return pathname.slice(0, -1);
|
|
63
|
+
}
|
|
64
|
+
return pathname;
|
|
65
|
+
}
|
|
66
|
+
function buildApiBaseUrl(origin, pathname) {
|
|
67
|
+
if (pathname === "" || pathname === "/") {
|
|
68
|
+
return `${origin}/v1`;
|
|
69
|
+
}
|
|
70
|
+
if (pathname.endsWith("/v1")) {
|
|
71
|
+
return `${origin}${pathname}`;
|
|
72
|
+
}
|
|
73
|
+
return `${origin}${pathname}/v1`;
|
|
74
|
+
}
|
|
75
|
+
function buildPoeBaseUrl(origin, pathname) {
|
|
76
|
+
if (pathname.endsWith("/v1")) {
|
|
77
|
+
const trimmed = pathname.slice(0, -3);
|
|
78
|
+
return trimmed.length > 0 ? `${origin}${trimmed}` : origin;
|
|
79
|
+
}
|
|
80
|
+
return pathname.length > 0 ? `${origin}${pathname}` : origin;
|
|
81
|
+
}
|
|
82
|
+
function trimTrailingSlash(value) {
|
|
83
|
+
if (value.length > 1 && value.endsWith("/")) {
|
|
84
|
+
return value.slice(0, -1);
|
|
85
|
+
}
|
|
86
|
+
if (value === "/") {
|
|
87
|
+
return "";
|
|
88
|
+
}
|
|
89
|
+
return value;
|
|
90
|
+
}
|
|
91
|
+
function ensureV1Suffix(value) {
|
|
92
|
+
if (value.endsWith("/v1")) {
|
|
93
|
+
return value;
|
|
94
|
+
}
|
|
95
|
+
if (value === "") {
|
|
96
|
+
return "/v1";
|
|
97
|
+
}
|
|
98
|
+
return `${value}/v1`;
|
|
99
|
+
}
|
|
100
|
+
function stripV1Suffix(value) {
|
|
101
|
+
if (value.endsWith("/v1")) {
|
|
102
|
+
return value.slice(0, -3);
|
|
103
|
+
}
|
|
104
|
+
return value;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=environment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/cli/environment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
type SyncFileSystem = {
|
|
2
|
+
appendFileSync(file: string, data: string): void;
|
|
3
|
+
existsSync(path: string): boolean;
|
|
4
|
+
mkdirSync(path: string, options?: {
|
|
5
|
+
recursive?: boolean;
|
|
6
|
+
}): void;
|
|
7
|
+
renameSync(oldPath: string, newPath: string): void;
|
|
8
|
+
statSync(path: string): {
|
|
9
|
+
size: number;
|
|
10
|
+
};
|
|
11
|
+
unlinkSync(path: string): void;
|
|
12
|
+
writeFileSync(path: string, data: string, options?: {
|
|
13
|
+
encoding?: BufferEncoding;
|
|
14
|
+
}): void;
|
|
15
|
+
};
|
|
16
|
+
export interface ErrorContext {
|
|
17
|
+
operation?: string;
|
|
18
|
+
component?: string;
|
|
19
|
+
apiEndpoint?: string;
|
|
20
|
+
httpStatus?: number;
|
|
21
|
+
requestBody?: unknown;
|
|
22
|
+
responseBody?: unknown;
|
|
23
|
+
[key: string]: unknown;
|
|
24
|
+
}
|
|
25
|
+
export interface ErrorLogEntry {
|
|
26
|
+
timestamp: string;
|
|
27
|
+
level: "ERROR" | "WARN";
|
|
28
|
+
message: string;
|
|
29
|
+
stack?: string;
|
|
30
|
+
context?: ErrorContext;
|
|
31
|
+
}
|
|
32
|
+
export interface ErrorLoggerOptions {
|
|
33
|
+
fs: SyncFileSystem;
|
|
34
|
+
logDir: string;
|
|
35
|
+
logToStderr?: boolean;
|
|
36
|
+
maxSize?: number;
|
|
37
|
+
maxBackups?: number;
|
|
38
|
+
now?: () => Date;
|
|
39
|
+
}
|
|
40
|
+
export declare class ErrorLogger {
|
|
41
|
+
private readonly fs;
|
|
42
|
+
private readonly logFilePath;
|
|
43
|
+
private readonly logToStderr;
|
|
44
|
+
private readonly maxSize;
|
|
45
|
+
private readonly maxBackups;
|
|
46
|
+
private readonly now;
|
|
47
|
+
private fileLoggingAvailable;
|
|
48
|
+
constructor(options: ErrorLoggerOptions);
|
|
49
|
+
logError(error: Error | string, context?: ErrorContext): void;
|
|
50
|
+
logWarning(message: string, context?: ErrorContext): void;
|
|
51
|
+
logErrorWithStackTrace(error: Error, operation: string, context?: ErrorContext): void;
|
|
52
|
+
private createErrorEntry;
|
|
53
|
+
private createWarningEntry;
|
|
54
|
+
private writeEntry;
|
|
55
|
+
private formatEntry;
|
|
56
|
+
private writeToStderr;
|
|
57
|
+
private rotateIfNeeded;
|
|
58
|
+
private performRotation;
|
|
59
|
+
private buildBackupPath;
|
|
60
|
+
private ensureLogDirectory;
|
|
61
|
+
}
|
|
62
|
+
export {};
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
const DEFAULT_MAX_SIZE = 10 * 1024 * 1024; // 10MB
|
|
3
|
+
const DEFAULT_MAX_BACKUPS = 5;
|
|
4
|
+
export class ErrorLogger {
|
|
5
|
+
fs;
|
|
6
|
+
logFilePath;
|
|
7
|
+
logToStderr;
|
|
8
|
+
maxSize;
|
|
9
|
+
maxBackups;
|
|
10
|
+
now;
|
|
11
|
+
fileLoggingAvailable;
|
|
12
|
+
constructor(options) {
|
|
13
|
+
this.fs = options.fs;
|
|
14
|
+
this.logFilePath = path.join(options.logDir, "errors.log");
|
|
15
|
+
this.logToStderr = options.logToStderr ?? true;
|
|
16
|
+
this.maxSize = options.maxSize ?? DEFAULT_MAX_SIZE;
|
|
17
|
+
this.maxBackups = options.maxBackups ?? DEFAULT_MAX_BACKUPS;
|
|
18
|
+
this.now = options.now ?? (() => new Date());
|
|
19
|
+
this.fileLoggingAvailable = this.ensureLogDirectory();
|
|
20
|
+
}
|
|
21
|
+
logError(error, context) {
|
|
22
|
+
const entry = this.createErrorEntry(error, "ERROR", context);
|
|
23
|
+
this.writeEntry(entry);
|
|
24
|
+
if (this.logToStderr) {
|
|
25
|
+
this.writeToStderr(entry);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
logWarning(message, context) {
|
|
29
|
+
const entry = this.createWarningEntry(message, context);
|
|
30
|
+
this.writeEntry(entry);
|
|
31
|
+
if (this.logToStderr) {
|
|
32
|
+
this.writeToStderr(entry);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
logErrorWithStackTrace(error, operation, context) {
|
|
36
|
+
const fullContext = {
|
|
37
|
+
...context,
|
|
38
|
+
operation
|
|
39
|
+
};
|
|
40
|
+
this.logError(error, fullContext);
|
|
41
|
+
}
|
|
42
|
+
createErrorEntry(error, level, context) {
|
|
43
|
+
const errorObj = typeof error === "string" ? new Error(error) : error;
|
|
44
|
+
return {
|
|
45
|
+
timestamp: this.now().toISOString(),
|
|
46
|
+
level,
|
|
47
|
+
message: errorObj.message,
|
|
48
|
+
stack: errorObj.stack,
|
|
49
|
+
context
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
createWarningEntry(message, context) {
|
|
53
|
+
return {
|
|
54
|
+
timestamp: this.now().toISOString(),
|
|
55
|
+
level: "WARN",
|
|
56
|
+
message,
|
|
57
|
+
context
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
writeEntry(entry) {
|
|
61
|
+
if (!this.fileLoggingAvailable) {
|
|
62
|
+
this.writeToStderr(entry, true);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
this.rotateIfNeeded();
|
|
66
|
+
const formattedEntry = this.formatEntry(entry);
|
|
67
|
+
try {
|
|
68
|
+
this.fs.appendFileSync(this.logFilePath, formattedEntry + "\n");
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
this.fileLoggingAvailable = false;
|
|
72
|
+
this.writeToStderr(entry, true);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
formatEntry(entry) {
|
|
76
|
+
const parts = [`[${entry.timestamp}] ${entry.level}: ${entry.message}`];
|
|
77
|
+
if (entry.context && Object.keys(entry.context).length > 0) {
|
|
78
|
+
parts.push(`Context: ${JSON.stringify(entry.context)}`);
|
|
79
|
+
}
|
|
80
|
+
if (entry.stack) {
|
|
81
|
+
parts.push(`Stack trace:\n${entry.stack}`);
|
|
82
|
+
}
|
|
83
|
+
return parts.join("\n");
|
|
84
|
+
}
|
|
85
|
+
writeToStderr(entry, force = false) {
|
|
86
|
+
if (!this.logToStderr && !force) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const formatted = this.formatEntry(entry);
|
|
90
|
+
console.error(formatted);
|
|
91
|
+
}
|
|
92
|
+
rotateIfNeeded() {
|
|
93
|
+
if (!this.fileLoggingAvailable) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
if (!this.fs.existsSync(this.logFilePath)) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const stats = this.fs.statSync(this.logFilePath);
|
|
101
|
+
if (stats.size < this.maxSize) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
this.performRotation();
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
console.error("Error during log rotation:", error);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
performRotation() {
|
|
111
|
+
if (this.maxBackups < 1) {
|
|
112
|
+
this.fs.unlinkSync(this.logFilePath);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
// Delete oldest backup
|
|
116
|
+
const oldestPath = this.buildBackupPath(this.maxBackups);
|
|
117
|
+
if (this.fs.existsSync(oldestPath)) {
|
|
118
|
+
this.fs.unlinkSync(oldestPath);
|
|
119
|
+
}
|
|
120
|
+
// Rotate existing backups
|
|
121
|
+
for (let i = this.maxBackups - 1; i >= 1; i--) {
|
|
122
|
+
const source = this.buildBackupPath(i);
|
|
123
|
+
if (this.fs.existsSync(source)) {
|
|
124
|
+
const target = this.buildBackupPath(i + 1);
|
|
125
|
+
this.fs.renameSync(source, target);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Move current log to backup.1
|
|
129
|
+
if (this.fs.existsSync(this.logFilePath)) {
|
|
130
|
+
this.fs.renameSync(this.logFilePath, this.buildBackupPath(1));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
buildBackupPath(index) {
|
|
134
|
+
return `${this.logFilePath}.${index}`;
|
|
135
|
+
}
|
|
136
|
+
ensureLogDirectory() {
|
|
137
|
+
const directory = path.dirname(this.logFilePath);
|
|
138
|
+
try {
|
|
139
|
+
if (!this.fs.existsSync(directory)) {
|
|
140
|
+
this.fs.mkdirSync(directory, { recursive: true });
|
|
141
|
+
}
|
|
142
|
+
if (!this.fs.existsSync(this.logFilePath)) {
|
|
143
|
+
this.fs.writeFileSync(this.logFilePath, "", { encoding: "utf8" });
|
|
144
|
+
}
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// Silently fail during directory creation - this is expected in test environments
|
|
149
|
+
// where the log directory path may not exist. The logger will still function,
|
|
150
|
+
// just without file logging capability.
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=error-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-logger.js","sourceRoot":"","sources":["../../src/cli/error-logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAuC7B,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO;AAClD,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAE9B,MAAM,OAAO,WAAW;IACL,EAAE,CAAiB;IACnB,WAAW,CAAS;IACpB,WAAW,CAAU;IACrB,OAAO,CAAS;IAChB,UAAU,CAAS;IACnB,GAAG,CAAa;IACzB,oBAAoB,CAAU;IAEtC,YAAY,OAA2B;QACrC,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAC3D,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC;QAC/C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,gBAAgB,CAAC;QACnD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,mBAAmB,CAAC;QAC5D,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAE7C,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;IACxD,CAAC;IAED,QAAQ,CAAC,KAAqB,EAAE,OAAsB;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7D,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAEvB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,UAAU,CAAC,OAAe,EAAE,OAAsB;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAEvB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,sBAAsB,CACpB,KAAY,EACZ,SAAiB,EACjB,OAAsB;QAEtB,MAAM,WAAW,GAAiB;YAChC,GAAG,OAAO;YACV,SAAS;SACV,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACpC,CAAC;IAEO,gBAAgB,CACtB,KAAqB,EACrB,KAAuB,EACvB,OAAsB;QAEtB,MAAM,QAAQ,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAEtE,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK;YACL,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,OAAO;SACR,CAAC;IACJ,CAAC;IAEO,kBAAkB,CACxB,OAAe,EACf,OAAsB;QAEtB,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK,EAAE,MAAM;YACb,OAAO;YACP,OAAO;SACR,CAAC;IACJ,CAAC;IAEO,UAAU,CAAC,KAAoB;QACrC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC/B,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,GAAG,IAAI,CAAC,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;YAClC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,KAAoB;QACtC,MAAM,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAExE,IAAI,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3D,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7C,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAEO,aAAa,CAAC,KAAoB,EAAE,KAAK,GAAG,KAAK;QACvD,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC1C,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC1C,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACjD,IAAI,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC9B,OAAO;YACT,CAAC;YAED,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,uBAAuB;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QACjC,CAAC;QAED,0BAA0B;QAC1B,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACvC,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,KAAa;QACnC,OAAO,GAAG,IAAI,CAAC,WAAW,IAAI,KAAK,EAAE,CAAC;IACxC,CAAC;IAEO,kBAAkB;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjD,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC1C,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YACpE,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,kFAAkF;YAClF,8EAA8E;YAC9E,wCAAwC;YACxC,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
|