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,109 @@
|
|
|
1
|
+
import { getPoeApiKey } from "./credentials.js";
|
|
2
|
+
import { spawnCore } from "./spawn-core.js";
|
|
3
|
+
import { createSdkContainer } from "./container.js";
|
|
4
|
+
import { getSpawnConfig, spawn as spawnNonStreaming, spawnInteractive, spawnStreaming } from "@poe-code/agent-spawn";
|
|
5
|
+
export function spawn(service, promptOrOptions, maybeOptions) {
|
|
6
|
+
const options = typeof promptOrOptions === "string"
|
|
7
|
+
? { ...maybeOptions, prompt: promptOrOptions }
|
|
8
|
+
: promptOrOptions;
|
|
9
|
+
const emptyEvents = (async function* () { })();
|
|
10
|
+
/**
|
|
11
|
+
* Deferred event stream resolution.
|
|
12
|
+
*
|
|
13
|
+
* This pattern allows us to return both `events` and `result` synchronously from `spawn()`,
|
|
14
|
+
* while the actual event source is determined asynchronously inside the `result` promise.
|
|
15
|
+
*
|
|
16
|
+
* The flow:
|
|
17
|
+
* 1. Caller receives `{ events, result }` immediately
|
|
18
|
+
* 2. Caller can start iterating `events` right away (iteration blocks on `eventsPromise`)
|
|
19
|
+
* 3. Inside `result`, we determine if streaming is supported and resolve `eventsPromise`
|
|
20
|
+
* with either the real event stream or an empty generator
|
|
21
|
+
* 4. The outer `events` generator then yields from the resolved inner stream
|
|
22
|
+
*
|
|
23
|
+
* This avoids forcing callers to `await` before they can set up their event handlers,
|
|
24
|
+
* enabling patterns like: `for await (const e of events) { ... }` without race conditions.
|
|
25
|
+
*/
|
|
26
|
+
let resolveEvents;
|
|
27
|
+
let eventsResolved = false;
|
|
28
|
+
const eventsPromise = new Promise((resolve) => {
|
|
29
|
+
resolveEvents = resolve;
|
|
30
|
+
});
|
|
31
|
+
const resolveEventsOnce = (value) => {
|
|
32
|
+
if (eventsResolved)
|
|
33
|
+
return;
|
|
34
|
+
eventsResolved = true;
|
|
35
|
+
resolveEvents?.(value);
|
|
36
|
+
};
|
|
37
|
+
const events = (async function* () {
|
|
38
|
+
for await (const e of await eventsPromise) {
|
|
39
|
+
yield e;
|
|
40
|
+
}
|
|
41
|
+
})();
|
|
42
|
+
const result = (async () => {
|
|
43
|
+
try {
|
|
44
|
+
await getPoeApiKey();
|
|
45
|
+
if (options.interactive) {
|
|
46
|
+
resolveEventsOnce(emptyEvents);
|
|
47
|
+
const interactiveResult = await spawnInteractive(service, {
|
|
48
|
+
prompt: options.prompt,
|
|
49
|
+
cwd: options.cwd,
|
|
50
|
+
model: options.model,
|
|
51
|
+
args: options.args
|
|
52
|
+
});
|
|
53
|
+
return {
|
|
54
|
+
stdout: interactiveResult.stdout,
|
|
55
|
+
stderr: interactiveResult.stderr,
|
|
56
|
+
exitCode: interactiveResult.exitCode
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
const spawnConfig = getSpawnConfig(service);
|
|
60
|
+
const supportsStreaming = !!spawnConfig &&
|
|
61
|
+
spawnConfig.kind === "cli" &&
|
|
62
|
+
typeof spawnConfig.adapter === "string";
|
|
63
|
+
if (supportsStreaming) {
|
|
64
|
+
const { events: innerEvents, done } = spawnStreaming({
|
|
65
|
+
agentId: service,
|
|
66
|
+
prompt: options.prompt,
|
|
67
|
+
cwd: options.cwd,
|
|
68
|
+
model: options.model,
|
|
69
|
+
args: options.args,
|
|
70
|
+
useStdin: false
|
|
71
|
+
});
|
|
72
|
+
resolveEventsOnce(innerEvents);
|
|
73
|
+
const final = await done;
|
|
74
|
+
return {
|
|
75
|
+
stdout: final.stdout,
|
|
76
|
+
stderr: final.stderr,
|
|
77
|
+
exitCode: final.exitCode,
|
|
78
|
+
threadId: final.threadId,
|
|
79
|
+
sessionId: final.sessionId ?? final.threadId
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
if (spawnConfig && spawnConfig.kind === "cli") {
|
|
83
|
+
resolveEventsOnce(emptyEvents);
|
|
84
|
+
return spawnNonStreaming(service, {
|
|
85
|
+
prompt: options.prompt,
|
|
86
|
+
cwd: options.cwd,
|
|
87
|
+
model: options.model,
|
|
88
|
+
args: options.args,
|
|
89
|
+
useStdin: false
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
resolveEventsOnce(emptyEvents);
|
|
93
|
+
const container = createSdkContainer({ cwd: options.cwd });
|
|
94
|
+
return spawnCore(container, service, {
|
|
95
|
+
prompt: options.prompt,
|
|
96
|
+
cwd: options.cwd,
|
|
97
|
+
model: options.model,
|
|
98
|
+
args: options.args,
|
|
99
|
+
useStdin: false
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
resolveEventsOnce(emptyEvents);
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
})();
|
|
107
|
+
return { events, result };
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=spawn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/sdk/spawn.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Options for spawning a provider CLI.
|
|
3
|
+
*/
|
|
4
|
+
export interface SpawnOptions {
|
|
5
|
+
/** The prompt to send to the provider */
|
|
6
|
+
prompt: string;
|
|
7
|
+
/** Working directory for the service CLI */
|
|
8
|
+
cwd?: string;
|
|
9
|
+
/** Model identifier override */
|
|
10
|
+
model?: string;
|
|
11
|
+
/** Additional arguments forwarded to the CLI */
|
|
12
|
+
args?: string[];
|
|
13
|
+
/** Launch the agent in interactive (TUI) mode with inherited stdio */
|
|
14
|
+
interactive?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Result from spawning a provider CLI.
|
|
18
|
+
*/
|
|
19
|
+
export interface SpawnResult {
|
|
20
|
+
/** Standard output from the CLI */
|
|
21
|
+
stdout: string;
|
|
22
|
+
/** Standard error from the CLI */
|
|
23
|
+
stderr: string;
|
|
24
|
+
/** Exit code from the CLI process */
|
|
25
|
+
exitCode: number;
|
|
26
|
+
/** Thread identifier from streaming agents (if available) */
|
|
27
|
+
threadId?: string;
|
|
28
|
+
/** Backward-compatible alias for threadId */
|
|
29
|
+
sessionId?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface GenerateOptions {
|
|
32
|
+
/** Model identifier override */
|
|
33
|
+
model?: string;
|
|
34
|
+
/** Additional parameters passed to the API */
|
|
35
|
+
params?: Record<string, string>;
|
|
36
|
+
}
|
|
37
|
+
export type MediaGenerateOptions = GenerateOptions;
|
|
38
|
+
export interface GenerateResult {
|
|
39
|
+
content: string;
|
|
40
|
+
}
|
|
41
|
+
export interface MediaGenerateResult {
|
|
42
|
+
url: string;
|
|
43
|
+
mimeType?: string;
|
|
44
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sdk/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { FileSystem } from "../utils/file-system.js";
|
|
2
|
+
import type { HttpClient } from "../cli/http.js";
|
|
3
|
+
import type { LlmClient } from "./llm-client.js";
|
|
4
|
+
export declare function setGlobalClient(client: LlmClient): void;
|
|
5
|
+
export declare function getGlobalClient(): LlmClient;
|
|
6
|
+
export declare function hasGlobalClient(): boolean;
|
|
7
|
+
export declare function initializeClient(options: {
|
|
8
|
+
fs: FileSystem;
|
|
9
|
+
credentialsPath: string;
|
|
10
|
+
baseUrl: string;
|
|
11
|
+
httpClient?: HttpClient;
|
|
12
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { AuthenticationError } from "../cli/errors.js";
|
|
2
|
+
import { loadCredentials } from "./credentials.js";
|
|
3
|
+
import { createPoeClient } from "./llm-client.js";
|
|
4
|
+
let globalClient = null;
|
|
5
|
+
export function setGlobalClient(client) {
|
|
6
|
+
globalClient = client;
|
|
7
|
+
}
|
|
8
|
+
export function getGlobalClient() {
|
|
9
|
+
if (!globalClient) {
|
|
10
|
+
throw new Error("LLM client not initialized. Call setGlobalClient() first.");
|
|
11
|
+
}
|
|
12
|
+
return globalClient;
|
|
13
|
+
}
|
|
14
|
+
export function hasGlobalClient() {
|
|
15
|
+
return globalClient !== null;
|
|
16
|
+
}
|
|
17
|
+
export async function initializeClient(options) {
|
|
18
|
+
// Don't reinitialize if a client is already set (e.g., in tests)
|
|
19
|
+
if (globalClient !== null) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const apiKey = await loadCredentials({
|
|
23
|
+
fs: options.fs,
|
|
24
|
+
filePath: options.credentialsPath
|
|
25
|
+
});
|
|
26
|
+
if (!apiKey) {
|
|
27
|
+
throw new AuthenticationError("Poe API key not found. Run 'poe-code login' first.");
|
|
28
|
+
}
|
|
29
|
+
const client = createPoeClient({
|
|
30
|
+
apiKey,
|
|
31
|
+
baseUrl: options.baseUrl,
|
|
32
|
+
httpClient: options.httpClient
|
|
33
|
+
});
|
|
34
|
+
setGlobalClient(client);
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=client-instance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-instance.js","sourceRoot":"","sources":["../../src/services/client-instance.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlD,IAAI,YAAY,GAAqB,IAAI,CAAC;AAE1C,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,YAAY,GAAG,MAAM,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,YAAY,KAAK,IAAI,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAKtC;IACC,iEAAiE;IACjE,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;QACnC,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,QAAQ,EAAE,OAAO,CAAC,eAAe;KAClC,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,mBAAmB,CAC3B,oDAAoD,CACrD,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC;QAC7B,MAAM;QACN,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC,CAAC;IAEH,eAAe,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { FileSystem } from "../utils/file-system.js";
|
|
2
|
+
export interface CredentialsStoreOptions {
|
|
3
|
+
fs: FileSystem;
|
|
4
|
+
filePath: string;
|
|
5
|
+
}
|
|
6
|
+
export interface SaveCredentialsOptions extends CredentialsStoreOptions {
|
|
7
|
+
apiKey: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ConfiguredServiceMetadata {
|
|
10
|
+
files: string[];
|
|
11
|
+
}
|
|
12
|
+
export interface SaveConfiguredServiceOptions extends CredentialsStoreOptions {
|
|
13
|
+
service: string;
|
|
14
|
+
metadata: ConfiguredServiceMetadata;
|
|
15
|
+
}
|
|
16
|
+
export interface UnconfigureServiceOptions extends CredentialsStoreOptions {
|
|
17
|
+
service: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function saveCredentials(options: SaveCredentialsOptions): Promise<void>;
|
|
20
|
+
export declare function loadCredentials(options: CredentialsStoreOptions): Promise<string | null>;
|
|
21
|
+
export declare function deleteCredentials(options: CredentialsStoreOptions): Promise<boolean>;
|
|
22
|
+
export declare function loadConfiguredServices(options: CredentialsStoreOptions): Promise<Record<string, ConfiguredServiceMetadata>>;
|
|
23
|
+
export declare function saveConfiguredService(options: SaveConfiguredServiceOptions): Promise<void>;
|
|
24
|
+
export declare function unconfigureService(options: UnconfigureServiceOptions): Promise<boolean>;
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { isNotFound } from "@poe-code/config-mutations";
|
|
3
|
+
export async function saveCredentials(options) {
|
|
4
|
+
const { fs, filePath, apiKey } = options;
|
|
5
|
+
const document = await readCredentialsDocument(fs, filePath);
|
|
6
|
+
document.apiKey = apiKey;
|
|
7
|
+
await writeCredentialsDocument(fs, filePath, document);
|
|
8
|
+
}
|
|
9
|
+
export async function loadCredentials(options) {
|
|
10
|
+
const { fs, filePath } = options;
|
|
11
|
+
const document = await readCredentialsDocument(fs, filePath);
|
|
12
|
+
return typeof document.apiKey === "string" && document.apiKey.length > 0
|
|
13
|
+
? document.apiKey
|
|
14
|
+
: null;
|
|
15
|
+
}
|
|
16
|
+
export async function deleteCredentials(options) {
|
|
17
|
+
const { fs, filePath } = options;
|
|
18
|
+
try {
|
|
19
|
+
await fs.unlink(filePath);
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
if (isNotFound(error)) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export async function loadConfiguredServices(options) {
|
|
30
|
+
const { fs, filePath } = options;
|
|
31
|
+
const document = await readCredentialsDocument(fs, filePath);
|
|
32
|
+
return { ...(document.configured_services ?? {}) };
|
|
33
|
+
}
|
|
34
|
+
export async function saveConfiguredService(options) {
|
|
35
|
+
const { fs, filePath, service, metadata } = options;
|
|
36
|
+
const document = await readCredentialsDocument(fs, filePath);
|
|
37
|
+
const normalized = normalizeConfiguredServiceMetadata(metadata);
|
|
38
|
+
document.configured_services = {
|
|
39
|
+
...(document.configured_services ?? {}),
|
|
40
|
+
[service]: normalized
|
|
41
|
+
};
|
|
42
|
+
await writeCredentialsDocument(fs, filePath, document);
|
|
43
|
+
}
|
|
44
|
+
export async function unconfigureService(options) {
|
|
45
|
+
const { fs, filePath, service } = options;
|
|
46
|
+
const document = await readCredentialsDocument(fs, filePath);
|
|
47
|
+
const services = document.configured_services;
|
|
48
|
+
if (!services || !(service in services)) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
delete services[service];
|
|
52
|
+
if (Object.keys(services).length === 0) {
|
|
53
|
+
delete document.configured_services;
|
|
54
|
+
}
|
|
55
|
+
await writeCredentialsDocument(fs, filePath, document);
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
function normalizeConfiguredServiceMetadata(metadata) {
|
|
59
|
+
const seen = new Set();
|
|
60
|
+
const files = [];
|
|
61
|
+
for (const entry of metadata.files ?? []) {
|
|
62
|
+
if (typeof entry !== "string" || entry.length === 0) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (!seen.has(entry)) {
|
|
66
|
+
files.push(entry);
|
|
67
|
+
seen.add(entry);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
files
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
async function readCredentialsDocument(fs, filePath) {
|
|
75
|
+
try {
|
|
76
|
+
const raw = await fs.readFile(filePath, "utf8");
|
|
77
|
+
return await parseCredentialsDocument(fs, filePath, raw);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
if (isNotFound(error)) {
|
|
81
|
+
return {};
|
|
82
|
+
}
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async function parseCredentialsDocument(fs, filePath, raw) {
|
|
87
|
+
try {
|
|
88
|
+
const parsed = JSON.parse(raw);
|
|
89
|
+
return normalizeCredentialsDocument(parsed);
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
if (error instanceof SyntaxError) {
|
|
93
|
+
await recoverInvalidCredentials(fs, filePath, raw);
|
|
94
|
+
return {};
|
|
95
|
+
}
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function normalizeCredentialsDocument(value) {
|
|
100
|
+
if (!isRecord(value)) {
|
|
101
|
+
return {};
|
|
102
|
+
}
|
|
103
|
+
const document = {};
|
|
104
|
+
if (typeof value.apiKey === "string" && value.apiKey.length > 0) {
|
|
105
|
+
document.apiKey = value.apiKey;
|
|
106
|
+
}
|
|
107
|
+
const services = normalizeConfiguredServices(value.configured_services);
|
|
108
|
+
if (Object.keys(services).length > 0) {
|
|
109
|
+
document.configured_services = services;
|
|
110
|
+
}
|
|
111
|
+
return document;
|
|
112
|
+
}
|
|
113
|
+
function normalizeConfiguredServices(value) {
|
|
114
|
+
if (!isRecord(value)) {
|
|
115
|
+
return {};
|
|
116
|
+
}
|
|
117
|
+
const entries = {};
|
|
118
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
119
|
+
if (!isRecord(entry)) {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
const normalized = normalizeConfiguredServiceMetadata({
|
|
123
|
+
files: Array.isArray(entry.files) ? entry.files : []
|
|
124
|
+
});
|
|
125
|
+
entries[key] = normalized;
|
|
126
|
+
}
|
|
127
|
+
return entries;
|
|
128
|
+
}
|
|
129
|
+
async function writeCredentialsDocument(fs, filePath, document) {
|
|
130
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
131
|
+
const payload = {};
|
|
132
|
+
if (document.apiKey) {
|
|
133
|
+
payload.apiKey = document.apiKey;
|
|
134
|
+
}
|
|
135
|
+
if (document.configured_services) {
|
|
136
|
+
payload.configured_services = document.configured_services;
|
|
137
|
+
}
|
|
138
|
+
await fs.writeFile(filePath, `${JSON.stringify(payload, null, 2)}\n`, {
|
|
139
|
+
encoding: "utf8"
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
async function recoverInvalidCredentials(fs, filePath, content) {
|
|
143
|
+
const backupPath = createInvalidBackupPath(filePath);
|
|
144
|
+
await fs.writeFile(backupPath, content, { encoding: "utf8" });
|
|
145
|
+
await fs.writeFile(filePath, EMPTY_DOCUMENT, { encoding: "utf8" });
|
|
146
|
+
}
|
|
147
|
+
function createInvalidBackupPath(filePath) {
|
|
148
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
149
|
+
const dir = path.dirname(filePath);
|
|
150
|
+
const base = path.basename(filePath);
|
|
151
|
+
return path.join(dir, `${base}.invalid-${timestamp}.json`);
|
|
152
|
+
}
|
|
153
|
+
function isRecord(value) {
|
|
154
|
+
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
155
|
+
}
|
|
156
|
+
const EMPTY_DOCUMENT = `${JSON.stringify({}, null, 2)}\n`;
|
|
157
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/services/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { HttpClient } from "../cli/http.js";
|
|
2
|
+
export interface LlmRequest {
|
|
3
|
+
model: string;
|
|
4
|
+
prompt: string;
|
|
5
|
+
params?: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
export interface LlmResponse {
|
|
8
|
+
content?: string;
|
|
9
|
+
url?: string;
|
|
10
|
+
mimeType?: string;
|
|
11
|
+
data?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface LlmClient {
|
|
14
|
+
text(request: LlmRequest): Promise<LlmResponse>;
|
|
15
|
+
media(type: "image" | "video" | "audio", request: LlmRequest): Promise<LlmResponse>;
|
|
16
|
+
}
|
|
17
|
+
export interface PoeClientOptions {
|
|
18
|
+
apiKey: string;
|
|
19
|
+
baseUrl: string;
|
|
20
|
+
httpClient?: HttpClient;
|
|
21
|
+
}
|
|
22
|
+
export declare function createPoeClient(options: PoeClientOptions): LlmClient;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { ApiError } from "../cli/errors.js";
|
|
2
|
+
export function createPoeClient(options) {
|
|
3
|
+
const httpClient = options.httpClient ?? createDefaultHttpClient();
|
|
4
|
+
return {
|
|
5
|
+
async text(request) {
|
|
6
|
+
const data = await requestCompletion(httpClient, options.baseUrl, options.apiKey, request);
|
|
7
|
+
return { content: extractTextContent(data) };
|
|
8
|
+
},
|
|
9
|
+
async media(_type, request) {
|
|
10
|
+
const data = await requestCompletion(httpClient, options.baseUrl, options.apiKey, request);
|
|
11
|
+
return extractMediaFromCompletion(data);
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function createDefaultHttpClient() {
|
|
16
|
+
return async (url, init) => {
|
|
17
|
+
const response = await globalThis.fetch(url, init);
|
|
18
|
+
return {
|
|
19
|
+
ok: response.ok,
|
|
20
|
+
status: response.status,
|
|
21
|
+
json: () => response.json(),
|
|
22
|
+
text: () => response.text()
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
async function requestCompletion(httpClient, baseUrl, apiKey, request) {
|
|
27
|
+
const body = {
|
|
28
|
+
model: request.model,
|
|
29
|
+
messages: [{ role: "user", content: request.prompt }]
|
|
30
|
+
};
|
|
31
|
+
if (request.params && Object.keys(request.params).length > 0) {
|
|
32
|
+
body.extra_body = request.params;
|
|
33
|
+
}
|
|
34
|
+
const response = await httpClient(`${baseUrl}/chat/completions`, {
|
|
35
|
+
method: "POST",
|
|
36
|
+
headers: {
|
|
37
|
+
"Content-Type": "application/json",
|
|
38
|
+
Authorization: `Bearer ${apiKey}`
|
|
39
|
+
},
|
|
40
|
+
body: JSON.stringify(body)
|
|
41
|
+
});
|
|
42
|
+
if (!response.ok) {
|
|
43
|
+
const detail = await readErrorBody(response);
|
|
44
|
+
const message = detail ? `Poe API error (${response.status}): ${detail}` : `Poe API error (${response.status})`;
|
|
45
|
+
throw new ApiError(message, {
|
|
46
|
+
httpStatus: response.status,
|
|
47
|
+
endpoint: "chat/completions",
|
|
48
|
+
context: detail ? { responseBody: detail } : undefined
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return response.json();
|
|
52
|
+
}
|
|
53
|
+
async function readErrorBody(response) {
|
|
54
|
+
if (!response.text) {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
const text = await response.text();
|
|
59
|
+
return text?.trim() || undefined;
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function extractTextContent(data) {
|
|
66
|
+
if (!isRecord(data))
|
|
67
|
+
return undefined;
|
|
68
|
+
const choices = data.choices;
|
|
69
|
+
if (!Array.isArray(choices) || choices.length === 0)
|
|
70
|
+
return undefined;
|
|
71
|
+
const first = choices[0];
|
|
72
|
+
if (!isRecord(first))
|
|
73
|
+
return undefined;
|
|
74
|
+
const message = first.message;
|
|
75
|
+
if (!isRecord(message))
|
|
76
|
+
return undefined;
|
|
77
|
+
return typeof message.content === "string" ? message.content : undefined;
|
|
78
|
+
}
|
|
79
|
+
function extractMediaFromCompletion(data) {
|
|
80
|
+
const content = extractTextContent(data);
|
|
81
|
+
if (!content)
|
|
82
|
+
return {};
|
|
83
|
+
// Try parsing as JSON first (API returns { url, mimeType })
|
|
84
|
+
try {
|
|
85
|
+
const parsed = JSON.parse(content);
|
|
86
|
+
if (isRecord(parsed) && typeof parsed.url === "string") {
|
|
87
|
+
return {
|
|
88
|
+
url: parsed.url,
|
|
89
|
+
mimeType: typeof parsed.mimeType === "string" ? parsed.mimeType : undefined,
|
|
90
|
+
data: typeof parsed.data === "string" ? parsed.data : undefined
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
if (isRecord(parsed) && typeof parsed.data === "string") {
|
|
94
|
+
return {
|
|
95
|
+
data: parsed.data,
|
|
96
|
+
mimeType: typeof parsed.mimeType === "string" ? parsed.mimeType : undefined
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Not JSON, continue
|
|
102
|
+
}
|
|
103
|
+
// Try as raw URL
|
|
104
|
+
if (isValidUrl(content.trim())) {
|
|
105
|
+
return { url: content.trim() };
|
|
106
|
+
}
|
|
107
|
+
// Try extracting URL from markdown (e.g., "")
|
|
108
|
+
const markdownUrl = extractMarkdownUrl(content);
|
|
109
|
+
if (markdownUrl) {
|
|
110
|
+
return { url: markdownUrl };
|
|
111
|
+
}
|
|
112
|
+
// No URL found, return content for error message
|
|
113
|
+
return { content };
|
|
114
|
+
}
|
|
115
|
+
function extractMarkdownUrl(content) {
|
|
116
|
+
const start = content.indexOf("](");
|
|
117
|
+
if (start === -1)
|
|
118
|
+
return undefined;
|
|
119
|
+
const urlStart = start + 2;
|
|
120
|
+
const end = content.indexOf(")", urlStart);
|
|
121
|
+
if (end === -1)
|
|
122
|
+
return undefined;
|
|
123
|
+
const url = content.slice(urlStart, end);
|
|
124
|
+
return isValidUrl(url) ? url : undefined;
|
|
125
|
+
}
|
|
126
|
+
function isValidUrl(value) {
|
|
127
|
+
try {
|
|
128
|
+
new URL(value);
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
function isRecord(value) {
|
|
136
|
+
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=llm-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-client.js","sourceRoot":"","sources":["../../src/services/llm-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { FileSystem } from "../utils/file-system.js";
|
|
2
|
+
export declare class MediaDownloadError extends Error {
|
|
3
|
+
readonly kind: "fetch" | "write";
|
|
4
|
+
readonly url: string;
|
|
5
|
+
readonly outputPath: string;
|
|
6
|
+
constructor(message: string, options: {
|
|
7
|
+
kind: "fetch" | "write";
|
|
8
|
+
url: string;
|
|
9
|
+
outputPath: string;
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
export declare function downloadToFile(options: {
|
|
13
|
+
url: string;
|
|
14
|
+
outputPath: string;
|
|
15
|
+
fs: FileSystem;
|
|
16
|
+
fetcher?: typeof fetch;
|
|
17
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export class MediaDownloadError extends Error {
|
|
2
|
+
kind;
|
|
3
|
+
url;
|
|
4
|
+
outputPath;
|
|
5
|
+
constructor(message, options) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = "MediaDownloadError";
|
|
8
|
+
this.kind = options.kind;
|
|
9
|
+
this.url = options.url;
|
|
10
|
+
this.outputPath = options.outputPath;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export async function downloadToFile(options) {
|
|
14
|
+
const fetcher = options.fetcher ?? globalThis.fetch;
|
|
15
|
+
if (!fetcher) {
|
|
16
|
+
throw new MediaDownloadError("Fetch is not available", {
|
|
17
|
+
kind: "fetch",
|
|
18
|
+
url: options.url,
|
|
19
|
+
outputPath: options.outputPath
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
const response = await fetcher(options.url);
|
|
23
|
+
if (!response.ok) {
|
|
24
|
+
throw new MediaDownloadError("Failed to download media", {
|
|
25
|
+
kind: "fetch",
|
|
26
|
+
url: options.url,
|
|
27
|
+
outputPath: options.outputPath
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
31
|
+
try {
|
|
32
|
+
await options.fs.writeFile(options.outputPath, buffer);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
throw new MediaDownloadError("Failed to write media", {
|
|
36
|
+
kind: "write",
|
|
37
|
+
url: options.url,
|
|
38
|
+
outputPath: options.outputPath
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=media-download.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-download.js","sourceRoot":"","sources":["../../src/services/media-download.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,IAAI,CAAoB;IACxB,GAAG,CAAS;IACZ,UAAU,CAAS;IAE5B,YAAY,OAAe,EAAE,OAAqE;QAChG,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACvC,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAKpC;IACC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC;IACpD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,kBAAkB,CAAC,wBAAwB,EAAE;YACrD,IAAI,EAAE,OAAO;YACb,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,kBAAkB,CAAC,0BAA0B,EAAE;YACvD,IAAI,EAAE,OAAO;YACb,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IAEzD,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,kBAAkB,CAAC,uBAAuB,EAAE;YACpD,IAAI,EAAE,OAAO;YACb,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|