poe-code 0.1.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. package/README.md +64 -0
  2. package/dist/cli/api-client.d.ts +14 -0
  3. package/dist/cli/api-client.js +140 -0
  4. package/dist/cli/api-client.js.map +1 -0
  5. package/dist/cli/chat.d.ts +32 -0
  6. package/dist/cli/chat.js +2 -0
  7. package/dist/cli/chat.js.map +1 -0
  8. package/dist/cli/command-runner.d.ts +2 -0
  9. package/dist/cli/command-runner.js +37 -0
  10. package/dist/cli/command-runner.js.map +1 -0
  11. package/dist/cli/commands/agent.d.ts +18 -0
  12. package/dist/cli/commands/agent.js +84 -0
  13. package/dist/cli/commands/agent.js.map +1 -0
  14. package/dist/cli/commands/configure-agents.d.ts +3 -0
  15. package/dist/cli/commands/configure-agents.js +72 -0
  16. package/dist/cli/commands/configure-agents.js.map +1 -0
  17. package/dist/cli/commands/configure.d.ts +11 -0
  18. package/dist/cli/commands/configure.js +150 -0
  19. package/dist/cli/commands/configure.js.map +1 -0
  20. package/dist/cli/commands/init.d.ts +8 -0
  21. package/dist/cli/commands/init.js +45 -0
  22. package/dist/cli/commands/init.js.map +1 -0
  23. package/dist/cli/commands/interactive.d.ts +3 -0
  24. package/dist/cli/commands/interactive.js +17 -0
  25. package/dist/cli/commands/interactive.js.map +1 -0
  26. package/dist/cli/commands/login.d.ts +6 -0
  27. package/dist/cli/commands/login.js +51 -0
  28. package/dist/cli/commands/login.js.map +1 -0
  29. package/dist/cli/commands/logout.d.ts +3 -0
  30. package/dist/cli/commands/logout.js +31 -0
  31. package/dist/cli/commands/logout.js.map +1 -0
  32. package/dist/cli/commands/prerequisites.d.ts +3 -0
  33. package/dist/cli/commands/prerequisites.js +23 -0
  34. package/dist/cli/commands/prerequisites.js.map +1 -0
  35. package/dist/cli/commands/query.d.ts +7 -0
  36. package/dist/cli/commands/query.js +46 -0
  37. package/dist/cli/commands/query.js.map +1 -0
  38. package/dist/cli/commands/remove.d.ts +6 -0
  39. package/dist/cli/commands/remove.js +80 -0
  40. package/dist/cli/commands/remove.js.map +1 -0
  41. package/dist/cli/commands/root.d.ts +3 -0
  42. package/dist/cli/commands/root.js +7 -0
  43. package/dist/cli/commands/root.js.map +1 -0
  44. package/dist/cli/commands/shared.d.ts +24 -0
  45. package/dist/cli/commands/shared.js +61 -0
  46. package/dist/cli/commands/shared.js.map +1 -0
  47. package/dist/cli/commands/spawn-worktree.d.ts +6 -0
  48. package/dist/cli/commands/spawn-worktree.js +91 -0
  49. package/dist/cli/commands/spawn-worktree.js.map +1 -0
  50. package/dist/cli/commands/spawn.d.ts +7 -0
  51. package/dist/cli/commands/spawn.js +112 -0
  52. package/dist/cli/commands/spawn.js.map +1 -0
  53. package/dist/cli/commands/test.d.ts +6 -0
  54. package/dist/cli/commands/test.js +26 -0
  55. package/dist/cli/commands/test.js.map +1 -0
  56. package/dist/cli/constants.d.ts +10 -0
  57. package/dist/cli/constants.js +11 -0
  58. package/dist/cli/constants.js.map +1 -0
  59. package/dist/cli/container.d.ts +48 -0
  60. package/dist/cli/container.js +94 -0
  61. package/dist/cli/container.js.map +1 -0
  62. package/dist/cli/context.d.ts +37 -0
  63. package/dist/cli/context.js +198 -0
  64. package/dist/cli/context.js.map +1 -0
  65. package/dist/cli/environment.d.ts +19 -0
  66. package/dist/cli/environment.js +26 -0
  67. package/dist/cli/environment.js.map +1 -0
  68. package/dist/cli/error-logger.d.ts +46 -0
  69. package/dist/cli/error-logger.js +137 -0
  70. package/dist/cli/error-logger.js.map +1 -0
  71. package/dist/cli/errors.d.ts +91 -0
  72. package/dist/cli/errors.js +128 -0
  73. package/dist/cli/errors.js.map +1 -0
  74. package/dist/cli/file-mentions.d.ts +13 -0
  75. package/dist/cli/file-mentions.js +87 -0
  76. package/dist/cli/file-mentions.js.map +1 -0
  77. package/dist/cli/file-picker-state.d.ts +14 -0
  78. package/dist/cli/file-picker-state.js +23 -0
  79. package/dist/cli/file-picker-state.js.map +1 -0
  80. package/dist/cli/http.d.ts +11 -0
  81. package/dist/cli/http.js +2 -0
  82. package/dist/cli/http.js.map +1 -0
  83. package/dist/cli/interactive-command-runner.d.ts +11 -0
  84. package/dist/cli/interactive-command-runner.js +142 -0
  85. package/dist/cli/interactive-command-runner.js.map +1 -0
  86. package/dist/cli/interactive-launcher.d.ts +2 -0
  87. package/dist/cli/interactive-launcher.js +404 -0
  88. package/dist/cli/interactive-launcher.js.map +1 -0
  89. package/dist/cli/interactive-tasks.d.ts +7 -0
  90. package/dist/cli/interactive-tasks.js +199 -0
  91. package/dist/cli/interactive-tasks.js.map +1 -0
  92. package/dist/cli/interactive.d.ts +19 -0
  93. package/dist/cli/interactive.js +479 -0
  94. package/dist/cli/interactive.js.map +1 -0
  95. package/dist/cli/logger.d.ts +26 -0
  96. package/dist/cli/logger.js +87 -0
  97. package/dist/cli/logger.js.map +1 -0
  98. package/dist/cli/markdown-renderer.d.ts +27 -0
  99. package/dist/cli/markdown-renderer.js +178 -0
  100. package/dist/cli/markdown-renderer.js.map +1 -0
  101. package/dist/cli/markdown-renderer.test.d.ts +1 -0
  102. package/dist/cli/markdown-renderer.test.js +105 -0
  103. package/dist/cli/markdown-renderer.test.js.map +1 -0
  104. package/dist/cli/options.d.ts +30 -0
  105. package/dist/cli/options.js +84 -0
  106. package/dist/cli/options.js.map +1 -0
  107. package/dist/cli/program.d.ts +4 -0
  108. package/dist/cli/program.js +64 -0
  109. package/dist/cli/program.js.map +1 -0
  110. package/dist/cli/prompts.d.ts +23 -0
  111. package/dist/cli/prompts.js +58 -0
  112. package/dist/cli/prompts.js.map +1 -0
  113. package/dist/cli/service-registry.d.ts +33 -0
  114. package/dist/cli/service-registry.js +35 -0
  115. package/dist/cli/service-registry.js.map +1 -0
  116. package/dist/cli/telemetry.d.ts +15 -0
  117. package/dist/cli/telemetry.js +45 -0
  118. package/dist/cli/telemetry.js.map +1 -0
  119. package/dist/cli/types.d.ts +2 -0
  120. package/dist/cli/types.js +2 -0
  121. package/dist/cli/types.js.map +1 -0
  122. package/dist/commands/init.d.ts +9 -0
  123. package/dist/commands/init.js +43 -0
  124. package/dist/commands/init.js.map +1 -0
  125. package/dist/commands/publish-placeholder.d.ts +8 -0
  126. package/dist/commands/publish-placeholder.js +50 -0
  127. package/dist/commands/publish-placeholder.js.map +1 -0
  128. package/dist/commands/spawn-worktree.d.ts +25 -0
  129. package/dist/commands/spawn-worktree.js +139 -0
  130. package/dist/commands/spawn-worktree.js.map +1 -0
  131. package/dist/index.d.ts +4 -0
  132. package/dist/index.js +81 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/providers/claude-code-adapter.d.ts +20 -0
  135. package/dist/providers/claude-code-adapter.js +48 -0
  136. package/dist/providers/claude-code-adapter.js.map +1 -0
  137. package/dist/providers/codex-adapter.d.ts +19 -0
  138. package/dist/providers/codex-adapter.js +49 -0
  139. package/dist/providers/codex-adapter.js.map +1 -0
  140. package/dist/providers/index.d.ts +2 -0
  141. package/dist/providers/index.js +13 -0
  142. package/dist/providers/index.js.map +1 -0
  143. package/dist/providers/opencode-adapter.d.ts +18 -0
  144. package/dist/providers/opencode-adapter.js +45 -0
  145. package/dist/providers/opencode-adapter.js.map +1 -0
  146. package/dist/providers/roo-code-adapter.d.ts +19 -0
  147. package/dist/providers/roo-code-adapter.js +70 -0
  148. package/dist/providers/roo-code-adapter.js.map +1 -0
  149. package/dist/services/agent-config-manager.d.ts +32 -0
  150. package/dist/services/agent-config-manager.js +130 -0
  151. package/dist/services/agent-config-manager.js.map +1 -0
  152. package/dist/services/agent-registry.d.ts +27 -0
  153. package/dist/services/agent-registry.js +89 -0
  154. package/dist/services/agent-registry.js.map +1 -0
  155. package/dist/services/agent-session.d.ts +24 -0
  156. package/dist/services/agent-session.js +107 -0
  157. package/dist/services/agent-session.js.map +1 -0
  158. package/dist/services/agent-task-registry.d.ts +131 -0
  159. package/dist/services/agent-task-registry.js +491 -0
  160. package/dist/services/agent-task-registry.js.map +1 -0
  161. package/dist/services/chat.d.ts +94 -0
  162. package/dist/services/chat.js +241 -0
  163. package/dist/services/chat.js.map +1 -0
  164. package/dist/services/claude-code.d.ts +28 -0
  165. package/dist/services/claude-code.js +155 -0
  166. package/dist/services/claude-code.js.map +1 -0
  167. package/dist/services/codex.d.ts +27 -0
  168. package/dist/services/codex.js +231 -0
  169. package/dist/services/codex.js.map +1 -0
  170. package/dist/services/credentials.d.ts +11 -0
  171. package/dist/services/credentials.js +44 -0
  172. package/dist/services/credentials.js.map +1 -0
  173. package/dist/services/mcp-client.d.ts +38 -0
  174. package/dist/services/mcp-client.js +170 -0
  175. package/dist/services/mcp-client.js.map +1 -0
  176. package/dist/services/mcp-manager.d.ts +28 -0
  177. package/dist/services/mcp-manager.js +157 -0
  178. package/dist/services/mcp-manager.js.map +1 -0
  179. package/dist/services/model-strategy.d.ts +99 -0
  180. package/dist/services/model-strategy.js +182 -0
  181. package/dist/services/model-strategy.js.map +1 -0
  182. package/dist/services/opencode.d.ts +25 -0
  183. package/dist/services/opencode.js +161 -0
  184. package/dist/services/opencode.js.map +1 -0
  185. package/dist/services/poe-code.d.ts +7 -0
  186. package/dist/services/poe-code.js +5 -0
  187. package/dist/services/poe-code.js.map +1 -0
  188. package/dist/services/roo-code.d.ts +22 -0
  189. package/dist/services/roo-code.js +134 -0
  190. package/dist/services/roo-code.js.map +1 -0
  191. package/dist/services/service-install.d.ts +21 -0
  192. package/dist/services/service-install.js +47 -0
  193. package/dist/services/service-install.js.map +1 -0
  194. package/dist/services/service-manifest.d.ts +122 -0
  195. package/dist/services/service-manifest.js +368 -0
  196. package/dist/services/service-manifest.js.map +1 -0
  197. package/dist/services/task-logger.d.ts +24 -0
  198. package/dist/services/task-logger.js +73 -0
  199. package/dist/services/task-logger.js.map +1 -0
  200. package/dist/services/task-runner.d.ts +19 -0
  201. package/dist/services/task-runner.js +157 -0
  202. package/dist/services/task-runner.js.map +1 -0
  203. package/dist/services/tools.d.ts +76 -0
  204. package/dist/services/tools.js +870 -0
  205. package/dist/services/tools.js.map +1 -0
  206. package/dist/templates/claude-code/anthropic_key.sh.hbs +2 -0
  207. package/dist/templates/codex/config.toml.hbs +9 -0
  208. package/dist/templates/python/env.hbs +3 -0
  209. package/dist/templates/python/main.py.hbs +17 -0
  210. package/dist/templates/python/requirements.txt.hbs +2 -0
  211. package/dist/utils/backup.d.ts +5 -0
  212. package/dist/utils/backup.js +61 -0
  213. package/dist/utils/backup.js.map +1 -0
  214. package/dist/utils/command-line.d.ts +1 -0
  215. package/dist/utils/command-line.js +54 -0
  216. package/dist/utils/command-line.js.map +1 -0
  217. package/dist/utils/dry-run.d.ts +38 -0
  218. package/dist/utils/dry-run.js +211 -0
  219. package/dist/utils/dry-run.js.map +1 -0
  220. package/dist/utils/e2e-flags.d.ts +1 -0
  221. package/dist/utils/e2e-flags.js +9 -0
  222. package/dist/utils/e2e-flags.js.map +1 -0
  223. package/dist/utils/file-system.d.ts +21 -0
  224. package/dist/utils/file-system.js +2 -0
  225. package/dist/utils/file-system.js.map +1 -0
  226. package/dist/utils/json.d.ts +12 -0
  227. package/dist/utils/json.js +42 -0
  228. package/dist/utils/json.js.map +1 -0
  229. package/dist/utils/prerequisites.d.ts +41 -0
  230. package/dist/utils/prerequisites.js +92 -0
  231. package/dist/utils/prerequisites.js.map +1 -0
  232. package/dist/utils/templates.d.ts +4 -0
  233. package/dist/utils/templates.js +22 -0
  234. package/dist/utils/templates.js.map +1 -0
  235. package/dist/utils/toml.d.ts +8 -0
  236. package/dist/utils/toml.js +30 -0
  237. package/dist/utils/toml.js.map +1 -0
  238. package/dist/utils/worktree.d.ts +40 -0
  239. package/dist/utils/worktree.js +179 -0
  240. package/dist/utils/worktree.js.map +1 -0
  241. package/package.json +84 -0
  242. package/shared/conversation-layout.cjs +11 -0
  243. package/shared/conversation-layout.d.ts +7 -0
  244. package/shared/conversation-layout.js +11 -0
  245. package/shared/package.json +13 -0
@@ -0,0 +1,157 @@
1
+ import { McpClient } from "./mcp-client.js";
2
+ import path from "node:path";
3
+ export class McpManager {
4
+ constructor(fs, homeDir) {
5
+ this.clients = new Map();
6
+ this.fs = fs;
7
+ this.configPath = path.join(homeDir, ".poe-code", "mcp-servers.json");
8
+ }
9
+ async loadConfig() {
10
+ try {
11
+ const content = await this.fs.readFile(this.configPath, "utf8");
12
+ return JSON.parse(content);
13
+ }
14
+ catch {
15
+ // Config doesn't exist, return empty
16
+ return { servers: [] };
17
+ }
18
+ }
19
+ async saveConfig(config) {
20
+ const dir = path.dirname(this.configPath);
21
+ try {
22
+ await this.fs.stat(dir);
23
+ }
24
+ catch {
25
+ await this.fs.mkdir(dir, { recursive: true });
26
+ }
27
+ await this.fs.writeFile(this.configPath, JSON.stringify(config, null, 2), { encoding: "utf8" });
28
+ }
29
+ async addServer(config) {
30
+ const currentConfig = await this.loadConfig();
31
+ // Check if server already exists
32
+ const existingIndex = currentConfig.servers.findIndex((s) => s.name === config.name);
33
+ if (existingIndex >= 0) {
34
+ currentConfig.servers[existingIndex] = config;
35
+ }
36
+ else {
37
+ currentConfig.servers.push(config);
38
+ }
39
+ await this.saveConfig(currentConfig);
40
+ }
41
+ async removeServer(name) {
42
+ const currentConfig = await this.loadConfig();
43
+ const initialLength = currentConfig.servers.length;
44
+ currentConfig.servers = currentConfig.servers.filter((s) => s.name !== name);
45
+ if (currentConfig.servers.length < initialLength) {
46
+ await this.saveConfig(currentConfig);
47
+ // Also disconnect the client if running
48
+ await this.disconnectServer(name);
49
+ return true;
50
+ }
51
+ return false;
52
+ }
53
+ async connectServer(name) {
54
+ const config = await this.loadConfig();
55
+ const serverConfig = config.servers.find((s) => s.name === name);
56
+ if (!serverConfig) {
57
+ throw new Error(`MCP server "${name}" not found in configuration`);
58
+ }
59
+ if (this.clients.has(name)) {
60
+ throw new Error(`MCP server "${name}" is already connected`);
61
+ }
62
+ const client = new McpClient(serverConfig);
63
+ client.on("error", (error) => {
64
+ console.error(`[MCP ${name}] Error:`, error);
65
+ });
66
+ client.on("log", (message) => {
67
+ console.log(`[MCP ${name}]`, message);
68
+ });
69
+ client.on("close", () => {
70
+ this.clients.delete(name);
71
+ });
72
+ await client.connect();
73
+ this.clients.set(name, client);
74
+ }
75
+ async disconnectServer(name) {
76
+ const client = this.clients.get(name);
77
+ if (client) {
78
+ await client.disconnect();
79
+ this.clients.delete(name);
80
+ }
81
+ }
82
+ async connectAll() {
83
+ const config = await this.loadConfig();
84
+ for (const serverConfig of config.servers) {
85
+ try {
86
+ if (!this.clients.has(serverConfig.name)) {
87
+ await this.connectServer(serverConfig.name);
88
+ }
89
+ }
90
+ catch (error) {
91
+ console.error(`Failed to connect to MCP server "${serverConfig.name}":`, error);
92
+ }
93
+ }
94
+ }
95
+ async disconnectAll() {
96
+ const names = Array.from(this.clients.keys());
97
+ for (const name of names) {
98
+ await this.disconnectServer(name);
99
+ }
100
+ }
101
+ getAllTools() {
102
+ const tools = [];
103
+ for (const [serverName, client] of this.clients.entries()) {
104
+ if (!client.isConnected())
105
+ continue;
106
+ const mcpTools = client.getTools();
107
+ for (const mcpTool of mcpTools) {
108
+ tools.push({
109
+ type: "function",
110
+ function: {
111
+ name: `mcp__${serverName}__${mcpTool.name}`,
112
+ description: `[MCP: ${serverName}] ${mcpTool.description}`,
113
+ parameters: {
114
+ type: "object",
115
+ properties: mcpTool.inputSchema.properties,
116
+ required: mcpTool.inputSchema.required
117
+ }
118
+ }
119
+ });
120
+ }
121
+ }
122
+ return tools;
123
+ }
124
+ async executeTool(toolName, args) {
125
+ // Tool name format: mcp__<servername>__<toolname>
126
+ if (!toolName.startsWith("mcp__")) {
127
+ throw new Error(`Not an MCP tool: ${toolName}`);
128
+ }
129
+ const parts = toolName.substring(5).split("__");
130
+ if (parts.length !== 2) {
131
+ throw new Error(`Invalid MCP tool name format: ${toolName}`);
132
+ }
133
+ const [serverName, actualToolName] = parts;
134
+ const client = this.clients.get(serverName);
135
+ if (!client || !client.isConnected()) {
136
+ throw new Error(`MCP server "${serverName}" is not connected`);
137
+ }
138
+ return await client.callTool(actualToolName, args);
139
+ }
140
+ getConnectedServers() {
141
+ return Array.from(this.clients.keys()).filter((name) => this.clients.get(name)?.isConnected());
142
+ }
143
+ async listServers() {
144
+ const config = await this.loadConfig();
145
+ return config.servers.map((server) => {
146
+ const client = this.clients.get(server.name);
147
+ const connected = client?.isConnected() || false;
148
+ const toolCount = connected ? client.getTools().length : 0;
149
+ return {
150
+ name: server.name,
151
+ connected,
152
+ toolCount
153
+ };
154
+ });
155
+ }
156
+ }
157
+ //# sourceMappingURL=mcp-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-manager.js","sourceRoot":"","sources":["../../src/services/mcp-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Available model identifiers
3
+ */
4
+ export declare const AVAILABLE_MODELS: readonly ["Claude-Sonnet-4.5", "GPT-5", "GPT-4o", "Claude-3.5-Sonnet", "GPT-5-Codex"];
5
+ export type ModelIdentifier = (typeof AVAILABLE_MODELS)[number];
6
+ /**
7
+ * Strategy types for model selection
8
+ */
9
+ export type StrategyType = "mixed" | "smart" | "fixed" | "round-robin";
10
+ /**
11
+ * Configuration for model strategy
12
+ */
13
+ export interface StrategyConfig {
14
+ type: StrategyType;
15
+ fixedModel?: ModelIdentifier;
16
+ customOrder?: ModelIdentifier[];
17
+ }
18
+ /**
19
+ * Base interface for all model strategies
20
+ */
21
+ export interface ModelStrategy {
22
+ getNextModel(context?: ModelContext): ModelIdentifier;
23
+ getName(): string;
24
+ getDescription(): string;
25
+ reset(): void;
26
+ }
27
+ /**
28
+ * Context for smart model selection
29
+ */
30
+ export interface ModelContext {
31
+ messageType?: "code" | "chat" | "reasoning" | "general";
32
+ complexity?: "simple" | "medium" | "complex";
33
+ previousModel?: string;
34
+ }
35
+ /**
36
+ * Mixed strategy: alternates between GPT-5 and Claude-Sonnet-4.5
37
+ */
38
+ export declare class MixedStrategy implements ModelStrategy {
39
+ private currentIndex;
40
+ private models;
41
+ getNextModel(): ModelIdentifier;
42
+ getName(): string;
43
+ getDescription(): string;
44
+ reset(): void;
45
+ }
46
+ /**
47
+ * Smart strategy: selects model based on task type
48
+ */
49
+ export declare class SmartStrategy implements ModelStrategy {
50
+ private lastModel;
51
+ getNextModel(context?: ModelContext): ModelIdentifier;
52
+ getName(): string;
53
+ getDescription(): string;
54
+ reset(): void;
55
+ }
56
+ /**
57
+ * Fixed strategy: always uses the same model
58
+ */
59
+ export declare class FixedStrategy implements ModelStrategy {
60
+ private model;
61
+ constructor(model?: ModelIdentifier);
62
+ getNextModel(): ModelIdentifier;
63
+ setModel(model: ModelIdentifier): void;
64
+ getName(): string;
65
+ getDescription(): string;
66
+ reset(): void;
67
+ }
68
+ /**
69
+ * Round-robin strategy: cycles through all available models
70
+ */
71
+ export declare class RoundRobinStrategy implements ModelStrategy {
72
+ private currentIndex;
73
+ private models;
74
+ constructor(models?: ModelIdentifier[]);
75
+ getNextModel(): ModelIdentifier;
76
+ getName(): string;
77
+ getDescription(): string;
78
+ reset(): void;
79
+ }
80
+ /**
81
+ * Factory for creating model strategies
82
+ */
83
+ export declare class ModelStrategyFactory {
84
+ static createStrategy(config: StrategyConfig): ModelStrategy;
85
+ static getAvailableStrategies(): Array<{
86
+ type: StrategyType;
87
+ description: string;
88
+ }>;
89
+ }
90
+ /**
91
+ * Manager for persisting and loading strategy configuration
92
+ */
93
+ export declare class StrategyConfigManager {
94
+ private static CONFIG_DIR;
95
+ private static CONFIG_FILE;
96
+ static saveConfig(config: StrategyConfig): void;
97
+ static loadConfig(): StrategyConfig | null;
98
+ static getDefaultConfig(): StrategyConfig;
99
+ }
@@ -0,0 +1,182 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import * as os from "os";
4
+ /**
5
+ * Available model identifiers
6
+ */
7
+ export const AVAILABLE_MODELS = [
8
+ "Claude-Sonnet-4.5",
9
+ "GPT-5",
10
+ "GPT-4o",
11
+ "Claude-3.5-Sonnet",
12
+ "GPT-5-Codex",
13
+ ];
14
+ /**
15
+ * Mixed strategy: alternates between GPT-5 and Claude-Sonnet-4.5
16
+ */
17
+ export class MixedStrategy {
18
+ constructor() {
19
+ this.currentIndex = 0;
20
+ this.models = ["GPT-5", "Claude-Sonnet-4.5"];
21
+ }
22
+ getNextModel() {
23
+ const model = this.models[this.currentIndex];
24
+ this.currentIndex = (this.currentIndex + 1) % this.models.length;
25
+ return model;
26
+ }
27
+ getName() {
28
+ return "mixed";
29
+ }
30
+ getDescription() {
31
+ return "Alternates between GPT-5 and Claude-Sonnet-4.5 on each call";
32
+ }
33
+ reset() {
34
+ this.currentIndex = 0;
35
+ }
36
+ }
37
+ /**
38
+ * Smart strategy: selects model based on task type
39
+ */
40
+ export class SmartStrategy {
41
+ constructor() {
42
+ this.lastModel = "Claude-Sonnet-4.5";
43
+ }
44
+ getNextModel(context) {
45
+ if (!context) {
46
+ return "Claude-Sonnet-4.5";
47
+ }
48
+ // Smart selection based on context
49
+ if (context.messageType === "code" || context.messageType === "reasoning") {
50
+ // Use GPT-5 for complex coding and reasoning tasks
51
+ if (context.complexity === "complex") {
52
+ this.lastModel = "GPT-5";
53
+ return "GPT-5";
54
+ }
55
+ // Use Claude for medium complexity code
56
+ this.lastModel = "Claude-Sonnet-4.5";
57
+ return "Claude-Sonnet-4.5";
58
+ }
59
+ if (context.messageType === "chat") {
60
+ // Use GPT-4o for general chat
61
+ this.lastModel = "GPT-4o";
62
+ return "GPT-4o";
63
+ }
64
+ // Default to Claude
65
+ this.lastModel = "Claude-Sonnet-4.5";
66
+ return "Claude-Sonnet-4.5";
67
+ }
68
+ getName() {
69
+ return "smart";
70
+ }
71
+ getDescription() {
72
+ return "Intelligently selects model based on task complexity and type";
73
+ }
74
+ reset() {
75
+ this.lastModel = "Claude-Sonnet-4.5";
76
+ }
77
+ }
78
+ /**
79
+ * Fixed strategy: always uses the same model
80
+ */
81
+ export class FixedStrategy {
82
+ constructor(model = "Claude-Sonnet-4.5") {
83
+ this.model = model;
84
+ }
85
+ getNextModel() {
86
+ return this.model;
87
+ }
88
+ setModel(model) {
89
+ this.model = model;
90
+ }
91
+ getName() {
92
+ return "fixed";
93
+ }
94
+ getDescription() {
95
+ return `Always uses ${this.model}`;
96
+ }
97
+ reset() {
98
+ // No state to reset
99
+ }
100
+ }
101
+ /**
102
+ * Round-robin strategy: cycles through all available models
103
+ */
104
+ export class RoundRobinStrategy {
105
+ constructor(models) {
106
+ this.currentIndex = 0;
107
+ this.models = models || [...AVAILABLE_MODELS];
108
+ }
109
+ getNextModel() {
110
+ const model = this.models[this.currentIndex];
111
+ this.currentIndex = (this.currentIndex + 1) % this.models.length;
112
+ return model;
113
+ }
114
+ getName() {
115
+ return "round-robin";
116
+ }
117
+ getDescription() {
118
+ return `Cycles through: ${this.models.join(", ")}`;
119
+ }
120
+ reset() {
121
+ this.currentIndex = 0;
122
+ }
123
+ }
124
+ /**
125
+ * Factory for creating model strategies
126
+ */
127
+ export class ModelStrategyFactory {
128
+ static createStrategy(config) {
129
+ switch (config.type) {
130
+ case "mixed":
131
+ return new MixedStrategy();
132
+ case "smart":
133
+ return new SmartStrategy();
134
+ case "fixed":
135
+ return new FixedStrategy(config.fixedModel);
136
+ case "round-robin":
137
+ return new RoundRobinStrategy(config.customOrder);
138
+ default:
139
+ return new MixedStrategy();
140
+ }
141
+ }
142
+ static getAvailableStrategies() {
143
+ return [
144
+ { type: "mixed", description: "Alternate between GPT-5 and Claude-Sonnet-4.5" },
145
+ { type: "smart", description: "Intelligently select based on task type" },
146
+ { type: "fixed", description: "Always use the same model" },
147
+ { type: "round-robin", description: "Cycle through all available models" },
148
+ ];
149
+ }
150
+ }
151
+ /**
152
+ * Manager for persisting and loading strategy configuration
153
+ */
154
+ export class StrategyConfigManager {
155
+ static saveConfig(config) {
156
+ if (!fs.existsSync(this.CONFIG_DIR)) {
157
+ fs.mkdirSync(this.CONFIG_DIR, { recursive: true });
158
+ }
159
+ fs.writeFileSync(this.CONFIG_FILE, JSON.stringify(config, null, 2));
160
+ }
161
+ static loadConfig() {
162
+ try {
163
+ if (fs.existsSync(this.CONFIG_FILE)) {
164
+ const data = fs.readFileSync(this.CONFIG_FILE, "utf-8");
165
+ return JSON.parse(data);
166
+ }
167
+ }
168
+ catch (error) {
169
+ console.error("Failed to load strategy config:", error);
170
+ }
171
+ return null;
172
+ }
173
+ static getDefaultConfig() {
174
+ return {
175
+ type: "fixed",
176
+ fixedModel: "Claude-Sonnet-4.5",
177
+ };
178
+ }
179
+ }
180
+ StrategyConfigManager.CONFIG_DIR = path.join(os.homedir(), ".poe-code");
181
+ StrategyConfigManager.CONFIG_FILE = path.join(StrategyConfigManager.CONFIG_DIR, "strategy-config.json");
182
+ //# sourceMappingURL=model-strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-strategy.js","sourceRoot":"","sources":["../../src/services/model-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,mBAAmB;IACnB,OAAO;IACP,QAAQ;IACR,mBAAmB;IACnB,aAAa;CACL,CAAC;AAqCX;;GAEG;AACH,MAAM,OAAO,aAAa;IAA1B;QACU,iBAAY,GAAG,CAAC,CAAC;QACjB,WAAM,GAAsB,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAmBrE,CAAC;IAjBC,YAAY;QACV,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7C,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QACjE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,cAAc;QACZ,OAAO,6DAA6D,CAAC;IACvE,CAAC;IAED,KAAK;QACH,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IACxB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,aAAa;IAA1B;QACU,cAAS,GAAoB,mBAAmB,CAAC;IAyC3D,CAAC;IAvCC,YAAY,CAAC,OAAsB;QACjC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,mBAAmB,CAAC;QAC7B,CAAC;QAED,mCAAmC;QACnC,IAAI,OAAO,CAAC,WAAW,KAAK,MAAM,IAAI,OAAO,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;YAC1E,mDAAmD;YACnD,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;gBACrC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;gBACzB,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,wCAAwC;YACxC,IAAI,CAAC,SAAS,GAAG,mBAAmB,CAAC;YACrC,OAAO,mBAAmB,CAAC;QAC7B,CAAC;QAED,IAAI,OAAO,CAAC,WAAW,KAAK,MAAM,EAAE,CAAC;YACnC,8BAA8B;YAC9B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;YAC1B,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,oBAAoB;QACpB,IAAI,CAAC,SAAS,GAAG,mBAAmB,CAAC;QACrC,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,OAAO;QACL,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,cAAc;QACZ,OAAO,+DAA+D,CAAC;IACzE,CAAC;IAED,KAAK;QACH,IAAI,CAAC,SAAS,GAAG,mBAAmB,CAAC;IACvC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,aAAa;IACxB,YAAoB,QAAyB,mBAAmB;QAA5C,UAAK,GAAL,KAAK,CAAuC;IAAG,CAAC;IAEpE,YAAY;QACV,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,QAAQ,CAAC,KAAsB;QAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,OAAO;QACL,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,cAAc;QACZ,OAAO,eAAe,IAAI,CAAC,KAAK,EAAE,CAAC;IACrC,CAAC;IAED,KAAK;QACH,oBAAoB;IACtB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,kBAAkB;IAI7B,YAAY,MAA0B;QAH9B,iBAAY,GAAG,CAAC,CAAC;QAIvB,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAC;IAChD,CAAC;IAED,YAAY;QACV,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7C,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QACjE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,cAAc;QACZ,OAAO,mBAAmB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACrD,CAAC;IAED,KAAK;QACH,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IACxB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,oBAAoB;IAC/B,MAAM,CAAC,cAAc,CAAC,MAAsB;QAC1C,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,OAAO;gBACV,OAAO,IAAI,aAAa,EAAE,CAAC;YAC7B,KAAK,OAAO;gBACV,OAAO,IAAI,aAAa,EAAE,CAAC;YAC7B,KAAK,OAAO;gBACV,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC9C,KAAK,aAAa;gBAChB,OAAO,IAAI,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACpD;gBACE,OAAO,IAAI,aAAa,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,MAAM,CAAC,sBAAsB;QAI3B,OAAO;YACL,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,+CAA+C,EAAE;YAC/E,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,yCAAyC,EAAE;YACzE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,2BAA2B,EAAE;YAC3D,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,oCAAoC,EAAE;SAC3E,CAAC;IACJ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,qBAAqB;IAOhC,MAAM,CAAC,UAAU,CAAC,MAAsB;QACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACpC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,CAAC,UAAU;QACf,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBACpC,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBACxD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmB,CAAC;YAC5C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,gBAAgB;QACrB,OAAO;YACL,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,mBAAmB;SAChC,CAAC;IACJ,CAAC;;AA9Bc,gCAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAClD,iCAAW,GAAG,IAAI,CAAC,IAAI,CACpC,qBAAqB,CAAC,UAAU,EAChC,sBAAsB,CACvB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { FileSystem } from "../utils/file-system.js";
2
+ import type { CommandRunner, CommandRunnerResult, PrerequisiteManager } from "../utils/prerequisites.js";
3
+ import { type ServiceRunOptions } from "./service-manifest.js";
4
+ import { type InstallContext } from "./service-install.js";
5
+ export interface ConfigureOpenCodeOptions {
6
+ fs: FileSystem;
7
+ configPath: string;
8
+ authPath: string;
9
+ apiKey: string;
10
+ }
11
+ export interface RemoveOpenCodeOptions {
12
+ fs: FileSystem;
13
+ configPath: string;
14
+ authPath: string;
15
+ }
16
+ export interface SpawnOpenCodeOptions {
17
+ prompt: string;
18
+ args?: string[];
19
+ runCommand: CommandRunner;
20
+ }
21
+ export declare function configureOpenCode(options: ConfigureOpenCodeOptions, runOptions?: ServiceRunOptions): Promise<void>;
22
+ export declare function spawnOpenCode(options: SpawnOpenCodeOptions): Promise<CommandRunnerResult>;
23
+ export declare function removeOpenCode(options: RemoveOpenCodeOptions, runOptions?: ServiceRunOptions): Promise<boolean>;
24
+ export declare function installOpenCode(context: InstallContext): Promise<boolean>;
25
+ export declare function registerOpenCodePrerequisites(prerequisites: PrerequisiteManager): void;
@@ -0,0 +1,161 @@
1
+ import path from "node:path";
2
+ import { createBinaryExistsCheck, formatCommandRunnerResult } from "../utils/prerequisites.js";
3
+ import { ensureDirectory, jsonMergeMutation, jsonPruneMutation, removeFileMutation, runServiceConfigure, runServiceRemove } from "./service-manifest.js";
4
+ import { runServiceInstall } from "./service-install.js";
5
+ const OPEN_CODE_CONFIG_TEMPLATE = {
6
+ $schema: "https://opencode.ai/config.json",
7
+ provider: {
8
+ poe: {
9
+ npm: "@ai-sdk/openai-compatible",
10
+ name: "poe.com",
11
+ options: {
12
+ baseURL: "https://api.poe.com/v1"
13
+ },
14
+ models: {
15
+ "Claude-Sonnet-4.5": {
16
+ name: "Claude Sonnet 4.5"
17
+ },
18
+ "GPT-5-Codex": {
19
+ name: "GPT-5-Codex"
20
+ }
21
+ }
22
+ }
23
+ }
24
+ };
25
+ const OPEN_CODE_CONFIG_SHAPE = {
26
+ provider: {
27
+ poe: true
28
+ }
29
+ };
30
+ const OPEN_CODE_AUTH_SHAPE = {
31
+ poe: true
32
+ };
33
+ const OPEN_CODE_MANIFEST = {
34
+ id: "opencode",
35
+ summary: "Configure OpenCode CLI to use the Poe API.",
36
+ prerequisites: {
37
+ after: ["opencode-cli-health"]
38
+ },
39
+ configure: [
40
+ ensureDirectory({
41
+ path: ({ options }) => path.dirname(options.configPath),
42
+ label: "Ensure OpenCode config directory"
43
+ }),
44
+ ensureDirectory({
45
+ path: ({ options }) => path.dirname(options.authPath),
46
+ label: "Ensure OpenCode auth directory"
47
+ }),
48
+ jsonMergeMutation({
49
+ target: ({ options }) => options.configPath,
50
+ label: "Merge OpenCode config",
51
+ value: () => OPEN_CODE_CONFIG_TEMPLATE
52
+ }),
53
+ jsonMergeMutation({
54
+ target: ({ options }) => options.authPath,
55
+ label: "Merge OpenCode auth",
56
+ value: ({ options }) => ({
57
+ poe: {
58
+ type: "api",
59
+ key: options.apiKey
60
+ }
61
+ })
62
+ })
63
+ ],
64
+ remove: [
65
+ jsonPruneMutation({
66
+ target: ({ options }) => options.configPath,
67
+ label: "Prune OpenCode config",
68
+ shape: () => OPEN_CODE_CONFIG_SHAPE
69
+ }),
70
+ jsonPruneMutation({
71
+ target: ({ options }) => options.authPath,
72
+ label: "Prune OpenCode auth",
73
+ shape: () => OPEN_CODE_AUTH_SHAPE
74
+ }),
75
+ removeFileMutation({
76
+ target: ({ options }) => options.authPath,
77
+ label: "Delete OpenCode auth when empty",
78
+ whenEmpty: true
79
+ })
80
+ ]
81
+ };
82
+ const OPEN_CODE_INSTALL_DEFINITION = {
83
+ id: "opencode",
84
+ summary: "OpenCode CLI",
85
+ check: createOpenCodeBinaryCheck(),
86
+ steps: [
87
+ {
88
+ id: "install-opencode-cli-npm",
89
+ description: "Install OpenCode CLI via npm",
90
+ command: "npm",
91
+ args: ["install", "-g", "opencode-ai"]
92
+ }
93
+ ],
94
+ postChecks: [createOpenCodeVersionCheck()],
95
+ successMessage: "Installed OpenCode CLI via npm."
96
+ };
97
+ export async function configureOpenCode(options, runOptions) {
98
+ await runServiceConfigure(OPEN_CODE_MANIFEST, {
99
+ fs: options.fs,
100
+ options
101
+ }, runOptions);
102
+ }
103
+ export async function spawnOpenCode(options) {
104
+ const args = ["run", options.prompt, ...(options.args ?? [])];
105
+ return options.runCommand("opencode", args);
106
+ }
107
+ export async function removeOpenCode(options, runOptions) {
108
+ return runServiceRemove(OPEN_CODE_MANIFEST, {
109
+ fs: options.fs,
110
+ options
111
+ }, runOptions);
112
+ }
113
+ export async function installOpenCode(context) {
114
+ return runServiceInstall(OPEN_CODE_INSTALL_DEFINITION, context);
115
+ }
116
+ export function registerOpenCodePrerequisites(prerequisites) {
117
+ prerequisites.registerAfter(createOpenCodeHealthCheck());
118
+ }
119
+ function createOpenCodeBinaryCheck() {
120
+ return createBinaryExistsCheck("opencode", "opencode-cli-binary", "OpenCode CLI binary must exist");
121
+ }
122
+ function createOpenCodeVersionCheck() {
123
+ return {
124
+ id: "opencode-cli-version",
125
+ description: "OpenCode CLI responds to --version",
126
+ async run({ runCommand }) {
127
+ const result = await runCommand("opencode", ["--version"]);
128
+ if (result.exitCode !== 0) {
129
+ throw new Error(`OpenCode CLI --version failed with exit code ${result.exitCode}.`);
130
+ }
131
+ }
132
+ };
133
+ }
134
+ function createOpenCodeHealthCheck() {
135
+ return {
136
+ id: "opencode-cli-health",
137
+ description: "OpenCode CLI health check must succeed",
138
+ async run({ runCommand }) {
139
+ const result = await spawnOpenCode({
140
+ prompt: "Output exactly: OPEN_CODE_OK",
141
+ runCommand
142
+ });
143
+ if (result.exitCode !== 0) {
144
+ const detail = formatCommandRunnerResult(result);
145
+ throw new Error([
146
+ `OpenCode CLI health check failed with exit code ${result.exitCode}.`,
147
+ detail
148
+ ].join("\n"));
149
+ }
150
+ const output = result.stdout.trim();
151
+ if (output !== "OPEN_CODE_OK") {
152
+ const detail = formatCommandRunnerResult(result);
153
+ throw new Error([
154
+ `OpenCode CLI health check failed: expected "OPEN_CODE_OK" but received "${output}".`,
155
+ detail
156
+ ].join("\n"));
157
+ }
158
+ }
159
+ };
160
+ }
161
+ //# sourceMappingURL=opencode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/services/opencode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { CommandRunner, CommandRunnerResult } from "../utils/prerequisites.js";
2
+ export interface SpawnPoeCodeOptions {
3
+ prompt: string;
4
+ args?: string[];
5
+ runCommand: CommandRunner;
6
+ }
7
+ export declare function spawnPoeCode(options: SpawnPoeCodeOptions): Promise<CommandRunnerResult>;
@@ -0,0 +1,5 @@
1
+ export async function spawnPoeCode(options) {
2
+ const args = ["agent", options.prompt, ...(options.args ?? [])];
3
+ return await options.runCommand("poe-code", args);
4
+ }
5
+ //# sourceMappingURL=poe-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poe-code.js","sourceRoot":"","sources":["../../src/services/poe-code.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAA4B;IAE5B,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;IAChE,OAAO,MAAM,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AACpD,CAAC"}