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.
Files changed (227) hide show
  1. package/README.md +2 -2
  2. package/dist/bin/poe-claude.js +23 -0
  3. package/dist/bin/poe-codex.js +23 -0
  4. package/dist/bin/poe-kimi-cli.js +23 -0
  5. package/dist/bin/poe-opencode.js +23 -0
  6. package/dist/bin.cjs +9 -0
  7. package/dist/cli/binary-aliases.d.ts +7 -0
  8. package/dist/cli/binary-aliases.js +26 -0
  9. package/dist/cli/binary-aliases.js.map +1 -0
  10. package/dist/cli/bootstrap.d.ts +4 -0
  11. package/dist/cli/bootstrap.js +78 -0
  12. package/dist/cli/bootstrap.js.map +1 -0
  13. package/dist/cli/command-not-found.d.ts +8 -0
  14. package/dist/cli/command-not-found.js +34 -0
  15. package/dist/cli/command-not-found.js.map +1 -0
  16. package/dist/cli/commands/configure-payload.d.ts +15 -0
  17. package/dist/cli/commands/configure-payload.js +31 -0
  18. package/dist/cli/commands/configure-payload.js.map +1 -0
  19. package/dist/cli/commands/configure.d.ts +12 -0
  20. package/dist/cli/commands/configure.js +151 -0
  21. package/dist/cli/commands/configure.js.map +1 -0
  22. package/dist/cli/commands/ensure-isolated-config.d.ts +12 -0
  23. package/dist/cli/commands/ensure-isolated-config.js +53 -0
  24. package/dist/cli/commands/ensure-isolated-config.js.map +1 -0
  25. package/dist/cli/commands/generate.d.ts +9 -0
  26. package/dist/cli/commands/generate.js +322 -0
  27. package/dist/cli/commands/generate.js.map +1 -0
  28. package/dist/cli/commands/install.d.ts +4 -0
  29. package/dist/cli/commands/install.js +40 -0
  30. package/dist/cli/commands/install.js.map +1 -0
  31. package/dist/cli/commands/login.d.ts +6 -0
  32. package/dist/cli/commands/login.js +105 -0
  33. package/dist/cli/commands/login.js.map +1 -0
  34. package/dist/cli/commands/mcp.d.ts +3 -0
  35. package/dist/cli/commands/mcp.js +178 -0
  36. package/dist/cli/commands/mcp.js.map +1 -0
  37. package/dist/cli/commands/models.d.ts +3 -0
  38. package/dist/cli/commands/models.js +183 -0
  39. package/dist/cli/commands/models.js.map +1 -0
  40. package/dist/cli/commands/ralph-worktree.d.ts +3 -0
  41. package/dist/cli/commands/ralph-worktree.js +73 -0
  42. package/dist/cli/commands/ralph-worktree.js.map +1 -0
  43. package/dist/cli/commands/ralph.d.ts +3 -0
  44. package/dist/cli/commands/ralph.js +424 -0
  45. package/dist/cli/commands/ralph.js.map +1 -0
  46. package/dist/cli/commands/shared.d.ts +29 -0
  47. package/dist/cli/commands/shared.js +82 -0
  48. package/dist/cli/commands/shared.js.map +1 -0
  49. package/dist/cli/commands/skill.d.ts +3 -0
  50. package/dist/cli/commands/skill.js +242 -0
  51. package/dist/cli/commands/skill.js.map +1 -0
  52. package/dist/cli/commands/spawn.d.ts +17 -0
  53. package/dist/cli/commands/spawn.js +226 -0
  54. package/dist/cli/commands/spawn.js.map +1 -0
  55. package/dist/cli/commands/test.d.ts +8 -0
  56. package/dist/cli/commands/test.js +124 -0
  57. package/dist/cli/commands/test.js.map +1 -0
  58. package/dist/cli/commands/unconfigure.d.ts +7 -0
  59. package/dist/cli/commands/unconfigure.js +116 -0
  60. package/dist/cli/commands/unconfigure.js.map +1 -0
  61. package/dist/cli/commands/usage.d.ts +3 -0
  62. package/dist/cli/commands/usage.js +186 -0
  63. package/dist/cli/commands/usage.js.map +1 -0
  64. package/dist/cli/commands/version.d.ts +3 -0
  65. package/dist/cli/commands/version.js +31 -0
  66. package/dist/cli/commands/version.js.map +1 -0
  67. package/dist/cli/commands/wrap.d.ts +3 -0
  68. package/dist/cli/commands/wrap.js +61 -0
  69. package/dist/cli/commands/wrap.js.map +1 -0
  70. package/dist/cli/constants.d.ts +24 -0
  71. package/dist/cli/constants.js +44 -0
  72. package/dist/cli/constants.js.map +1 -0
  73. package/dist/cli/container.d.ts +42 -0
  74. package/dist/cli/container.js +90 -0
  75. package/dist/cli/container.js.map +1 -0
  76. package/dist/cli/context.d.ts +33 -0
  77. package/dist/cli/context.js +91 -0
  78. package/dist/cli/context.js.map +1 -0
  79. package/dist/cli/environment.d.ts +21 -0
  80. package/dist/cli/environment.js +106 -0
  81. package/dist/cli/environment.js.map +1 -0
  82. package/dist/cli/error-logger.d.ts +62 -0
  83. package/dist/cli/error-logger.js +155 -0
  84. package/dist/cli/error-logger.js.map +1 -0
  85. package/dist/cli/errors.d.ts +95 -0
  86. package/dist/cli/errors.js +141 -0
  87. package/dist/cli/errors.js.map +1 -0
  88. package/dist/cli/exit-signals.d.ts +4 -0
  89. package/dist/cli/exit-signals.js +8 -0
  90. package/dist/cli/exit-signals.js.map +1 -0
  91. package/dist/cli/http.d.ts +12 -0
  92. package/dist/cli/http.js +2 -0
  93. package/dist/cli/http.js.map +1 -0
  94. package/dist/cli/isolated-env-runner.d.ts +10 -0
  95. package/dist/cli/isolated-env-runner.js +50 -0
  96. package/dist/cli/isolated-env-runner.js.map +1 -0
  97. package/dist/cli/isolated-env.d.ts +24 -0
  98. package/dist/cli/isolated-env.js +210 -0
  99. package/dist/cli/isolated-env.js.map +1 -0
  100. package/dist/cli/logger.d.ts +36 -0
  101. package/dist/cli/logger.js +191 -0
  102. package/dist/cli/logger.js.map +1 -0
  103. package/dist/cli/mcp-output-format.d.ts +2 -0
  104. package/dist/cli/mcp-output-format.js +27 -0
  105. package/dist/cli/mcp-output-format.js.map +1 -0
  106. package/dist/cli/mcp-server.d.ts +21 -0
  107. package/dist/cli/mcp-server.js +321 -0
  108. package/dist/cli/mcp-server.js.map +1 -0
  109. package/dist/cli/options.d.ts +45 -0
  110. package/dist/cli/options.js +111 -0
  111. package/dist/cli/options.js.map +1 -0
  112. package/dist/cli/poe-code-command-runner.d.ts +6 -0
  113. package/dist/cli/poe-code-command-runner.js +63 -0
  114. package/dist/cli/poe-code-command-runner.js.map +1 -0
  115. package/dist/cli/program.d.ts +4 -0
  116. package/dist/cli/program.js +249 -0
  117. package/dist/cli/program.js.map +1 -0
  118. package/dist/cli/prompt-runner.d.ts +10 -0
  119. package/dist/cli/prompt-runner.js +79 -0
  120. package/dist/cli/prompt-runner.js.map +1 -0
  121. package/dist/cli/prompts.d.ts +39 -0
  122. package/dist/cli/prompts.js +42 -0
  123. package/dist/cli/prompts.js.map +1 -0
  124. package/dist/cli/service-registry.d.ts +108 -0
  125. package/dist/cli/service-registry.js +83 -0
  126. package/dist/cli/service-registry.js.map +1 -0
  127. package/dist/cli/types.d.ts +2 -0
  128. package/dist/cli/types.js +2 -0
  129. package/dist/cli/types.js.map +1 -0
  130. package/dist/cli/ui/service-menu.d.ts +7 -0
  131. package/dist/cli/ui/service-menu.js +43 -0
  132. package/dist/cli/ui/service-menu.js.map +1 -0
  133. package/dist/index.d.ts +8 -0
  134. package/dist/index.js +36812 -0
  135. package/dist/index.js.map +7 -0
  136. package/dist/providers/claude-code.d.ts +13 -0
  137. package/dist/providers/claude-code.js +143 -0
  138. package/dist/providers/claude-code.js.map +1 -0
  139. package/dist/providers/codex.d.ts +17 -0
  140. package/dist/providers/codex.js +144 -0
  141. package/dist/providers/codex.js.map +1 -0
  142. package/dist/providers/create-provider.d.ts +29 -0
  143. package/dist/providers/create-provider.js +78 -0
  144. package/dist/providers/create-provider.js.map +1 -0
  145. package/dist/providers/index.d.ts +2 -0
  146. package/dist/providers/index.js +8 -0
  147. package/dist/providers/index.js.map +1 -0
  148. package/dist/providers/kimi.d.ts +4 -0
  149. package/dist/providers/kimi.js +123 -0
  150. package/dist/providers/kimi.js.map +1 -0
  151. package/dist/providers/opencode.d.ts +3 -0
  152. package/dist/providers/opencode.js +119 -0
  153. package/dist/providers/opencode.js.map +1 -0
  154. package/dist/providers/spawn-options.d.ts +13 -0
  155. package/dist/providers/spawn-options.js +2 -0
  156. package/dist/providers/spawn-options.js.map +1 -0
  157. package/dist/sdk/container.d.ts +18 -0
  158. package/dist/sdk/container.js +127 -0
  159. package/dist/sdk/container.js.map +1 -0
  160. package/dist/sdk/credentials.d.ts +9 -0
  161. package/dist/sdk/credentials.js +35 -0
  162. package/dist/sdk/credentials.js.map +1 -0
  163. package/dist/sdk/generate.d.ts +5 -0
  164. package/dist/sdk/generate.js +97 -0
  165. package/dist/sdk/generate.js.map +1 -0
  166. package/dist/sdk/spawn-core.d.ts +23 -0
  167. package/dist/sdk/spawn-core.js +105 -0
  168. package/dist/sdk/spawn-core.js.map +1 -0
  169. package/dist/sdk/spawn.d.ts +31 -0
  170. package/dist/sdk/spawn.js +109 -0
  171. package/dist/sdk/spawn.js.map +1 -0
  172. package/dist/sdk/types.d.ts +44 -0
  173. package/dist/sdk/types.js +2 -0
  174. package/dist/sdk/types.js.map +1 -0
  175. package/dist/services/client-instance.d.ts +12 -0
  176. package/dist/services/client-instance.js +36 -0
  177. package/dist/services/client-instance.js.map +1 -0
  178. package/dist/services/credentials.d.ts +24 -0
  179. package/dist/services/credentials.js +157 -0
  180. package/dist/services/credentials.js.map +1 -0
  181. package/dist/services/llm-client.d.ts +22 -0
  182. package/dist/services/llm-client.js +138 -0
  183. package/dist/services/llm-client.js.map +1 -0
  184. package/dist/services/media-download.d.ts +17 -0
  185. package/dist/services/media-download.js +42 -0
  186. package/dist/services/media-download.js.map +1 -0
  187. package/dist/services/model-strategy.d.ts +99 -0
  188. package/dist/services/model-strategy.js +187 -0
  189. package/dist/services/model-strategy.js.map +1 -0
  190. package/dist/services/mutation-events.d.ts +4 -0
  191. package/dist/services/mutation-events.js +53 -0
  192. package/dist/services/mutation-events.js.map +1 -0
  193. package/dist/services/service-install.d.ts +22 -0
  194. package/dist/services/service-install.js +70 -0
  195. package/dist/services/service-install.js.map +1 -0
  196. package/dist/services/version.d.ts +11 -0
  197. package/dist/services/version.js +28 -0
  198. package/dist/services/version.js.map +1 -0
  199. package/dist/tools/label-generator.d.ts +11 -0
  200. package/dist/tools/label-generator.js +78 -0
  201. package/dist/tools/label-generator.js.map +1 -0
  202. package/dist/utils/backup.d.ts +5 -0
  203. package/dist/utils/backup.js +56 -0
  204. package/dist/utils/backup.js.map +1 -0
  205. package/dist/utils/cli-settings-merge.d.ts +22 -0
  206. package/dist/utils/cli-settings-merge.js +56 -0
  207. package/dist/utils/cli-settings-merge.js.map +1 -0
  208. package/dist/utils/command-checks.d.ts +36 -0
  209. package/dist/utils/command-checks.js +120 -0
  210. package/dist/utils/command-checks.js.map +1 -0
  211. package/dist/utils/command-line.d.ts +1 -0
  212. package/dist/utils/command-line.js +54 -0
  213. package/dist/utils/command-line.js.map +1 -0
  214. package/dist/utils/dry-run.d.ts +39 -0
  215. package/dist/utils/dry-run.js +315 -0
  216. package/dist/utils/dry-run.js.map +1 -0
  217. package/dist/utils/execution-context.d.ts +48 -0
  218. package/dist/utils/execution-context.js +151 -0
  219. package/dist/utils/execution-context.js.map +1 -0
  220. package/dist/utils/file-system.d.ts +21 -0
  221. package/dist/utils/file-system.js +2 -0
  222. package/dist/utils/file-system.js.map +1 -0
  223. package/dist/utils/json.d.ts +12 -0
  224. package/dist/utils/json.js +45 -0
  225. package/dist/utils/json.js.map +1 -0
  226. package/package.json +5 -2
  227. package/packages/tiny-mcp-test-server/dist/index.js +47 -0
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Available model identifiers
3
+ */
4
+ export declare const AVAILABLE_MODELS: readonly ["anthropic/claude-opus-4.6", "gpt-5.2", "gpt-5.2-chat", "gpt-5.2-pro", "gpt-4o", "Claude-3.5-Sonnet", "openai/gpt-5.2-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.2 and the default Claude model
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,187 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import * as os from "os";
4
+ import { DEFAULT_CLAUDE_CODE_MODEL, DEFAULT_CODEX_MODEL } from "../cli/constants.js";
5
+ const CLAUDE_DEFAULT_MODEL = DEFAULT_CLAUDE_CODE_MODEL;
6
+ /**
7
+ * Available model identifiers
8
+ */
9
+ export const AVAILABLE_MODELS = [
10
+ CLAUDE_DEFAULT_MODEL,
11
+ "gpt-5.2",
12
+ "gpt-5.2-chat",
13
+ "gpt-5.2-pro",
14
+ "gpt-4o",
15
+ "Claude-3.5-Sonnet",
16
+ DEFAULT_CODEX_MODEL,
17
+ ];
18
+ /**
19
+ * Mixed strategy: alternates between gpt-5.2 and the default Claude model
20
+ */
21
+ export class MixedStrategy {
22
+ currentIndex = 0;
23
+ models = ["gpt-5.2", CLAUDE_DEFAULT_MODEL];
24
+ getNextModel() {
25
+ const model = this.models[this.currentIndex];
26
+ this.currentIndex = (this.currentIndex + 1) % this.models.length;
27
+ return model;
28
+ }
29
+ getName() {
30
+ return "mixed";
31
+ }
32
+ getDescription() {
33
+ return `Alternates between gpt-5.2 and ${CLAUDE_DEFAULT_MODEL} on each call`;
34
+ }
35
+ reset() {
36
+ this.currentIndex = 0;
37
+ }
38
+ }
39
+ /**
40
+ * Smart strategy: selects model based on task type
41
+ */
42
+ export class SmartStrategy {
43
+ lastModel = CLAUDE_DEFAULT_MODEL;
44
+ getNextModel(context) {
45
+ if (!context) {
46
+ return CLAUDE_DEFAULT_MODEL;
47
+ }
48
+ // Smart selection based on context
49
+ if (context.messageType === "code" || context.messageType === "reasoning") {
50
+ // Use gpt-5.2 for complex coding and reasoning tasks
51
+ if (context.complexity === "complex") {
52
+ this.lastModel = "gpt-5.2";
53
+ return "gpt-5.2";
54
+ }
55
+ // Use Claude for medium complexity code
56
+ this.lastModel = CLAUDE_DEFAULT_MODEL;
57
+ return CLAUDE_DEFAULT_MODEL;
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_DEFAULT_MODEL;
66
+ return CLAUDE_DEFAULT_MODEL;
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_DEFAULT_MODEL;
76
+ }
77
+ }
78
+ /**
79
+ * Fixed strategy: always uses the same model
80
+ */
81
+ export class FixedStrategy {
82
+ model;
83
+ constructor(model = CLAUDE_DEFAULT_MODEL) {
84
+ this.model = model;
85
+ }
86
+ getNextModel() {
87
+ return this.model;
88
+ }
89
+ setModel(model) {
90
+ this.model = model;
91
+ }
92
+ getName() {
93
+ return "fixed";
94
+ }
95
+ getDescription() {
96
+ return `Always uses ${this.model}`;
97
+ }
98
+ reset() {
99
+ // No state to reset
100
+ }
101
+ }
102
+ /**
103
+ * Round-robin strategy: cycles through all available models
104
+ */
105
+ export class RoundRobinStrategy {
106
+ currentIndex = 0;
107
+ models;
108
+ constructor(models) {
109
+ this.models = models || [...AVAILABLE_MODELS];
110
+ }
111
+ getNextModel() {
112
+ const model = this.models[this.currentIndex];
113
+ this.currentIndex = (this.currentIndex + 1) % this.models.length;
114
+ return model;
115
+ }
116
+ getName() {
117
+ return "round-robin";
118
+ }
119
+ getDescription() {
120
+ return `Cycles through: ${this.models.join(", ")}`;
121
+ }
122
+ reset() {
123
+ this.currentIndex = 0;
124
+ }
125
+ }
126
+ /**
127
+ * Factory for creating model strategies
128
+ */
129
+ export class ModelStrategyFactory {
130
+ static createStrategy(config) {
131
+ switch (config.type) {
132
+ case "mixed":
133
+ return new MixedStrategy();
134
+ case "smart":
135
+ return new SmartStrategy();
136
+ case "fixed":
137
+ return new FixedStrategy(config.fixedModel);
138
+ case "round-robin":
139
+ return new RoundRobinStrategy(config.customOrder);
140
+ default:
141
+ return new MixedStrategy();
142
+ }
143
+ }
144
+ static getAvailableStrategies() {
145
+ return [
146
+ {
147
+ type: "mixed",
148
+ description: `Alternate between gpt-5.2 and ${CLAUDE_DEFAULT_MODEL}`
149
+ },
150
+ { type: "smart", description: "Intelligently select based on task type" },
151
+ { type: "fixed", description: "Always use the same model" },
152
+ { type: "round-robin", description: "Cycle through all available models" },
153
+ ];
154
+ }
155
+ }
156
+ /**
157
+ * Manager for persisting and loading strategy configuration
158
+ */
159
+ export class StrategyConfigManager {
160
+ static CONFIG_DIR = path.join(os.homedir(), ".poe-code");
161
+ static CONFIG_FILE = path.join(StrategyConfigManager.CONFIG_DIR, "strategy-config.json");
162
+ static saveConfig(config) {
163
+ if (!fs.existsSync(this.CONFIG_DIR)) {
164
+ fs.mkdirSync(this.CONFIG_DIR, { recursive: true });
165
+ }
166
+ fs.writeFileSync(this.CONFIG_FILE, JSON.stringify(config, null, 2));
167
+ }
168
+ static loadConfig() {
169
+ try {
170
+ if (fs.existsSync(this.CONFIG_FILE)) {
171
+ const data = fs.readFileSync(this.CONFIG_FILE, "utf-8");
172
+ return JSON.parse(data);
173
+ }
174
+ }
175
+ catch (error) {
176
+ console.error("Failed to load strategy config:", error);
177
+ }
178
+ return null;
179
+ }
180
+ static getDefaultConfig() {
181
+ return {
182
+ type: "fixed",
183
+ fixedModel: CLAUDE_DEFAULT_MODEL,
184
+ };
185
+ }
186
+ }
187
+ //# sourceMappingURL=model-strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-strategy.js","sourceRoot":"","sources":["../../src/services/model-strategy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ScopedLogger } from "../cli/logger.js";
2
+ import type { MutationObservers } from "@poe-code/config-mutations";
3
+ export declare function createMutationReporter(logger: ScopedLogger): MutationObservers;
4
+ export declare function combineMutationObservers(...observers: Array<MutationObservers | undefined>): MutationObservers | undefined;
@@ -0,0 +1,53 @@
1
+ export function createMutationReporter(logger) {
2
+ return {
3
+ onComplete(details, outcome) {
4
+ logger.verbose(formatMutationMessage(details, outcome));
5
+ },
6
+ onError(details, error) {
7
+ logger.error(`${details.label} failed: ${describeError(error)}`);
8
+ }
9
+ };
10
+ }
11
+ export function combineMutationObservers(...observers) {
12
+ const active = observers.filter((observer) => observer != null);
13
+ if (active.length === 0) {
14
+ return undefined;
15
+ }
16
+ return {
17
+ onStart(details) {
18
+ for (const observer of active) {
19
+ observer.onStart?.(details);
20
+ }
21
+ },
22
+ onComplete(details, outcome) {
23
+ for (const observer of active) {
24
+ observer.onComplete?.(details, outcome);
25
+ }
26
+ },
27
+ onError(details, error) {
28
+ for (const observer of active) {
29
+ observer.onError?.(details, error);
30
+ }
31
+ }
32
+ };
33
+ }
34
+ function formatMutationMessage(details, outcome) {
35
+ const status = describeOutcome(outcome);
36
+ return `${details.label}: ${status}`;
37
+ }
38
+ function describeOutcome(outcome) {
39
+ if (outcome.changed) {
40
+ return outcome.detail ?? outcome.effect;
41
+ }
42
+ if (outcome.detail && outcome.detail !== "noop") {
43
+ return outcome.detail;
44
+ }
45
+ return "no changes";
46
+ }
47
+ function describeError(error) {
48
+ if (error instanceof Error) {
49
+ return error.message;
50
+ }
51
+ return String(error ?? "Unknown error");
52
+ }
53
+ //# sourceMappingURL=mutation-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-events.js","sourceRoot":"","sources":["../../src/services/mutation-events.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,sBAAsB,CACpC,MAAoB;IAEpB,OAAO;QACL,UAAU,CAAC,OAAO,EAAE,OAAO;YACzB,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,CAAC,OAAO,EAAE,KAAK;YACpB,MAAM,CAAC,KAAK,CACV,GAAG,OAAO,CAAC,KAAK,YAAY,aAAa,CAAC,KAAK,CAAC,EAAE,CACnD,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,GAAG,SAA+C;IAElD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAC7B,CAAC,QAAQ,EAAiC,EAAE,CAAC,QAAQ,IAAI,IAAI,CAC9D,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO;QACL,OAAO,CAAC,OAAO;YACb,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;gBAC9B,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QACD,UAAU,CAAC,OAAO,EAAE,OAAO;YACzB,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;gBAC9B,QAAQ,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,OAAO,CAAC,OAAO,EAAE,KAAK;YACpB,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;gBAC9B,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAC5B,OAAwB,EACxB,OAAwB;IAExB,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,GAAG,OAAO,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,eAAe,CAAC,OAAwB;IAC/C,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAC1C,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAChD,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { CommandRunner, CommandCheck } from "../utils/command-checks.js";
2
+ export interface InstallContext {
3
+ isDryRun: boolean;
4
+ runCommand: CommandRunner;
5
+ logger: (message: string) => void;
6
+ platform: NodeJS.Platform;
7
+ }
8
+ export interface InstallCommand {
9
+ id: string;
10
+ command: string;
11
+ args: string[];
12
+ platforms?: NodeJS.Platform[];
13
+ }
14
+ export interface ServiceInstallDefinition {
15
+ id: string;
16
+ summary: string;
17
+ check: CommandCheck;
18
+ steps: InstallCommand[];
19
+ postChecks?: CommandCheck[];
20
+ successMessage?: string;
21
+ }
22
+ export declare function runServiceInstall(definition: ServiceInstallDefinition, context: InstallContext): Promise<boolean>;
@@ -0,0 +1,70 @@
1
+ export async function runServiceInstall(definition, context) {
2
+ const checkContext = {
3
+ isDryRun: context.isDryRun,
4
+ runCommand: context.runCommand
5
+ };
6
+ let needsInstall = false;
7
+ try {
8
+ await definition.check.run(checkContext);
9
+ context.logger(`${definition.summary} already installed.`);
10
+ }
11
+ catch (error) {
12
+ const detail = error instanceof Error ? error.message : String(error);
13
+ context.logger(`${definition.summary} not detected: ${detail}`);
14
+ needsInstall = true;
15
+ }
16
+ if (!needsInstall) {
17
+ return false;
18
+ }
19
+ if (context.isDryRun) {
20
+ logInstallDryRun(definition, context);
21
+ return true;
22
+ }
23
+ const platformSteps = filterStepsByPlatform(definition.steps, context.platform);
24
+ for (const step of platformSteps) {
25
+ await runInstallStep(step, context);
26
+ }
27
+ await definition.check.run(checkContext);
28
+ if (definition.postChecks) {
29
+ for (const postCheck of definition.postChecks) {
30
+ await postCheck.run(checkContext);
31
+ }
32
+ }
33
+ context.logger(definition.successMessage ?? `${definition.summary} installed.`);
34
+ return true;
35
+ }
36
+ function describeInstallCommand(step) {
37
+ return `[${step.id}] ${formatCommand(step.command, step.args)}`;
38
+ }
39
+ function formatCommand(command, args) {
40
+ return [command, ...args.map(quoteIfNeeded)].join(" ");
41
+ }
42
+ function quoteIfNeeded(value) {
43
+ if (value.length === 0) {
44
+ return '""';
45
+ }
46
+ if (value.includes(" ") || value.includes("\t") || value.includes("\n")) {
47
+ return `"${value.replaceAll('"', '\\"')}"`;
48
+ }
49
+ return value;
50
+ }
51
+ function filterStepsByPlatform(steps, platform) {
52
+ return steps.filter((step) => !step.platforms || step.platforms.includes(platform));
53
+ }
54
+ function logInstallDryRun(definition, context) {
55
+ context.logger(`Dry run: would install ${definition.summary}.`);
56
+ const platformSteps = filterStepsByPlatform(definition.steps, context.platform);
57
+ for (const step of platformSteps) {
58
+ context.logger(`Dry run: ${describeInstallCommand(step)}`);
59
+ }
60
+ }
61
+ async function runInstallStep(step, context) {
62
+ context.logger(`Running ${describeInstallCommand(step)}`);
63
+ const result = await context.runCommand(step.command, step.args);
64
+ if (result.exitCode !== 0) {
65
+ const stderr = result.stderr.trim();
66
+ const suffix = stderr.length > 0 ? `: ${stderr}` : "";
67
+ throw new Error(`${describeInstallCommand(step)} failed with exit code ${result.exitCode}${suffix}`);
68
+ }
69
+ }
70
+ //# sourceMappingURL=service-install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-install.js","sourceRoot":"","sources":["../../src/services/service-install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { HttpClient } from "../cli/http.js";
2
+ export interface VersionCheckResult {
3
+ currentVersion: string;
4
+ latestVersion: string;
5
+ updateAvailable: boolean;
6
+ }
7
+ export interface CheckForUpdateOptions {
8
+ currentVersion: string;
9
+ httpClient: HttpClient;
10
+ }
11
+ export declare function checkForUpdate(options: CheckForUpdateOptions): Promise<VersionCheckResult | null>;
@@ -0,0 +1,28 @@
1
+ import semver from "semver";
2
+ export async function checkForUpdate(options) {
3
+ const { currentVersion, httpClient } = options;
4
+ try {
5
+ const response = await httpClient("https://registry.npmjs.org/poe-code", {
6
+ method: "GET",
7
+ headers: { Accept: "application/json" }
8
+ });
9
+ if (!response.ok) {
10
+ return null;
11
+ }
12
+ const data = (await response.json());
13
+ const latestVersion = data?.["dist-tags"]?.latest;
14
+ if (typeof latestVersion !== "string" || !semver.valid(latestVersion)) {
15
+ return null;
16
+ }
17
+ const updateAvailable = semver.gt(latestVersion, currentVersion);
18
+ return {
19
+ currentVersion,
20
+ latestVersion,
21
+ updateAvailable
22
+ };
23
+ }
24
+ catch {
25
+ return null;
26
+ }
27
+ }
28
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/services/version.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAoB5B,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAA8B;IAE9B,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAE/C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,qCAAqC,EAAE;YACvE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;SACxC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAwB,CAAC;QAC5D,MAAM,aAAa,GAAG,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAElD,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;YACtE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,eAAe,GAAG,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QAEjE,OAAO;YACL,cAAc;YACd,aAAa;YACb,eAAe;SAChB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { ProviderService } from "../cli/service-registry.js";
2
+ export interface ServiceLabelInfo {
3
+ service: string;
4
+ displayName: string;
5
+ label: string;
6
+ color: string;
7
+ description: string;
8
+ }
9
+ export declare function collectSpawnLabels(adapters: ProviderService[]): ServiceLabelInfo[];
10
+ export declare function renderLabelDocument(labels: ServiceLabelInfo[]): string;
11
+ export declare function normalizeColor(source: string): string;
@@ -0,0 +1,78 @@
1
+ export function collectSpawnLabels(adapters) {
2
+ const spawnable = adapters.filter((adapter) => typeof adapter.spawn === "function");
3
+ const labels = spawnable.map((adapter) => {
4
+ const colorSource = adapter.branding?.colors?.light ??
5
+ adapter.branding?.colors?.dark ??
6
+ "#000000";
7
+ return {
8
+ service: adapter.name,
9
+ displayName: adapter.label,
10
+ label: `agent:${adapter.name}`,
11
+ color: normalizeColor(colorSource),
12
+ description: `${adapter.label} automation label`
13
+ };
14
+ });
15
+ return labels.sort((a, b) => a.displayName.localeCompare(b.displayName, "en"));
16
+ }
17
+ export function renderLabelDocument(labels) {
18
+ const workflowLabels = labels.map((entry) => ({
19
+ name: entry.label,
20
+ color: entry.color,
21
+ description: entry.description
22
+ }));
23
+ const jsonBlock = JSON.stringify(workflowLabels, null, 2);
24
+ const tableRows = labels
25
+ .map((entry) => `| ${entry.displayName} | \`${entry.label}\` | \`#${entry.color}\` |`)
26
+ .join("\n");
27
+ const lines = [
28
+ "# Agent Labels",
29
+ "",
30
+ "> Generated via `npm run labels:generate`. Do not edit manually.",
31
+ "",
32
+ "## GitHub Label Definitions",
33
+ "",
34
+ "```json",
35
+ jsonBlock,
36
+ "```",
37
+ "",
38
+ "## Services",
39
+ "",
40
+ "| Service | Label | Color |",
41
+ "| --- | --- | --- |",
42
+ tableRows,
43
+ ""
44
+ ];
45
+ return lines.join("\n");
46
+ }
47
+ export function normalizeColor(source) {
48
+ if (!source) {
49
+ return "000000";
50
+ }
51
+ const trimmed = source.trim();
52
+ const withoutHash = trimmed.startsWith("#")
53
+ ? trimmed.slice(1)
54
+ : trimmed;
55
+ let filtered = "";
56
+ for (const char of withoutHash) {
57
+ const code = char.codePointAt(0);
58
+ if (!code) {
59
+ continue;
60
+ }
61
+ const isDigit = code >= 48 && code <= 57;
62
+ const isUpper = code >= 65 && code <= 70;
63
+ const isLower = code >= 97 && code <= 102;
64
+ if (isDigit || isUpper || isLower) {
65
+ filtered += char;
66
+ }
67
+ }
68
+ if (filtered.length === 0) {
69
+ return "000000";
70
+ }
71
+ const upper = filtered.toUpperCase();
72
+ if (upper.length >= 6) {
73
+ return upper.slice(0, 6);
74
+ }
75
+ const padded = `${upper}000000`.slice(0, 6);
76
+ return padded;
77
+ }
78
+ //# sourceMappingURL=label-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"label-generator.js","sourceRoot":"","sources":["../../src/tools/label-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { FileSystem } from "./file-system.js";
2
+ type TimestampProvider = () => string;
3
+ export declare function createBackup(fs: FileSystem, targetPath: string, timestamp?: TimestampProvider): Promise<string | null>;
4
+ export declare function restoreLatestBackup(fs: FileSystem, targetPath: string): Promise<boolean>;
5
+ export {};
@@ -0,0 +1,56 @@
1
+ import path from "node:path";
2
+ import { isNotFound } from "@poe-code/config-mutations";
3
+ const DEFAULT_TIMESTAMP = () => new Date().toISOString().replace(/[:.]/g, "-");
4
+ export async function createBackup(fs, targetPath, timestamp = DEFAULT_TIMESTAMP) {
5
+ if (!(await exists(fs, targetPath))) {
6
+ return null;
7
+ }
8
+ const backupPath = `${targetPath}.backup.${timestamp()}`;
9
+ await copy(fs, targetPath, backupPath);
10
+ return backupPath;
11
+ }
12
+ export async function restoreLatestBackup(fs, targetPath) {
13
+ const dir = path.dirname(targetPath);
14
+ const base = path.basename(targetPath);
15
+ let entries;
16
+ try {
17
+ entries = await fs.readdir(dir);
18
+ }
19
+ catch (error) {
20
+ if (isNotFound(error)) {
21
+ return false;
22
+ }
23
+ throw error;
24
+ }
25
+ const backups = entries
26
+ .filter((name) => name.startsWith(`${base}.backup.`))
27
+ .sort()
28
+ .reverse();
29
+ if (backups.length === 0) {
30
+ return false;
31
+ }
32
+ const latest = path.join(dir, backups[0]);
33
+ await copy(fs, latest, targetPath);
34
+ return true;
35
+ }
36
+ async function exists(fs, targetPath) {
37
+ try {
38
+ await fs.stat(targetPath);
39
+ return true;
40
+ }
41
+ catch (error) {
42
+ if (isNotFound(error)) {
43
+ return false;
44
+ }
45
+ throw error;
46
+ }
47
+ }
48
+ async function copy(fs, from, to) {
49
+ if (typeof fs.copyFile === "function") {
50
+ await fs.copyFile(from, to);
51
+ return;
52
+ }
53
+ const content = await fs.readFile(from);
54
+ await fs.writeFile(to, content);
55
+ }
56
+ //# sourceMappingURL=backup.js.map