poe-code 3.0.169 → 3.0.171

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 (36) hide show
  1. package/dist/bin/poe-goose.js +23 -0
  2. package/dist/cli/commands/configure-payload.js +10 -0
  3. package/dist/cli/commands/configure-payload.js.map +1 -1
  4. package/dist/cli/commands/experiment.js +1 -1
  5. package/dist/cli/commands/experiment.js.map +1 -1
  6. package/dist/cli/commands/pipeline.js +1 -1
  7. package/dist/cli/commands/pipeline.js.map +1 -1
  8. package/dist/cli/commands/spawn.js +4 -0
  9. package/dist/cli/commands/spawn.js.map +1 -1
  10. package/dist/cli/constants.d.ts +2 -0
  11. package/dist/cli/constants.js +2 -0
  12. package/dist/cli/constants.js.map +1 -1
  13. package/dist/cli/service-registry.d.ts +9 -0
  14. package/dist/cli/service-registry.js.map +1 -1
  15. package/dist/index.js +434 -91
  16. package/dist/index.js.map +4 -4
  17. package/dist/providers/claude-code.js +197 -27
  18. package/dist/providers/claude-code.js.map +4 -4
  19. package/dist/providers/codex.js +203 -33
  20. package/dist/providers/codex.js.map +4 -4
  21. package/dist/providers/create-provider.d.ts +1 -0
  22. package/dist/providers/create-provider.js +6 -5
  23. package/dist/providers/create-provider.js.map +1 -1
  24. package/dist/providers/goose.d.ts +16 -0
  25. package/dist/providers/goose.js +2514 -0
  26. package/dist/providers/goose.js.map +7 -0
  27. package/dist/providers/kimi.js +196 -26
  28. package/dist/providers/kimi.js.map +4 -4
  29. package/dist/providers/opencode.js +196 -26
  30. package/dist/providers/opencode.js.map +4 -4
  31. package/dist/providers/poe-agent.js +96 -43
  32. package/dist/providers/poe-agent.js.map +4 -4
  33. package/dist/utils/command-checks.js +4 -2
  34. package/dist/utils/command-checks.js.map +1 -1
  35. package/package.json +2 -2
  36. /package/dist/templates/pipeline/{steps.yaml.hbs → steps.yaml.mustache} +0 -0
@@ -80,30 +80,30 @@ var require_src = __commonJS({
80
80
  }
81
81
  });
82
82
 
83
- // src/templates/py-poe-spawn/env.hbs
83
+ // src/templates/py-poe-spawn/env.mustache
84
84
  var require_env = __commonJS({
85
- "src/templates/py-poe-spawn/env.hbs"(exports, module) {
85
+ "src/templates/py-poe-spawn/env.mustache"(exports, module) {
86
86
  module.exports = "POE_API_KEY={{apiKey}}\nPOE_BASE_URL=https://api.poe.com/v1\nMODEL={{model}}\n";
87
87
  }
88
88
  });
89
89
 
90
- // src/templates/py-poe-spawn/main.py.hbs
90
+ // src/templates/py-poe-spawn/main.py.mustache
91
91
  var require_main_py = __commonJS({
92
- "src/templates/py-poe-spawn/main.py.hbs"(exports, module) {
92
+ "src/templates/py-poe-spawn/main.py.mustache"(exports, module) {
93
93
  module.exports = 'import os\nfrom openai import OpenAI\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\nclient = OpenAI(\n api_key=os.getenv("POE_API_KEY"),\n base_url=os.getenv("POE_BASE_URL")\n)\n\nresponse = client.chat.completions.create(\n model=os.getenv("MODEL", "{{model}}"),\n messages=[{"role": "user", "content": "Tell me a joke"}]\n)\n\nprint(response.choices[0].message.content)\n';
94
94
  }
95
95
  });
96
96
 
97
- // src/templates/py-poe-spawn/requirements.txt.hbs
97
+ // src/templates/py-poe-spawn/requirements.txt.mustache
98
98
  var require_requirements_txt = __commonJS({
99
- "src/templates/py-poe-spawn/requirements.txt.hbs"(exports, module) {
99
+ "src/templates/py-poe-spawn/requirements.txt.mustache"(exports, module) {
100
100
  module.exports = "openai>=1.0.0\npython-dotenv>=1.0.0\n";
101
101
  }
102
102
  });
103
103
 
104
- // src/templates/codex/config.toml.hbs
104
+ // src/templates/codex/config.toml.mustache
105
105
  var require_config_toml = __commonJS({
106
- "src/templates/codex/config.toml.hbs"(exports, module) {
106
+ "src/templates/codex/config.toml.mustache"(exports, module) {
107
107
  module.exports = 'model_provider = "poe"\n\n[profiles."{{{profileName}}}"]\nmodel = "{{{model}}}"\nmodel_provider = "poe"\nmodel_reasoning_effort = "{{reasoningEffort}}"\nmodel_verbosity = "medium"\n\n[model_providers.poe]\nname = "poe"\nbase_url = "{{{baseUrl}}}"\nwire_api = "responses"\nexperimental_bearer_token = "{{apiKey}}"\nrequires_openai_auth = false\nsupports_websockets = false\n';
108
108
  }
109
109
  });
@@ -147,6 +147,17 @@ var PROVIDER_NAME = "poe";
147
147
  // packages/agent-spawn/src/run-command.ts
148
148
  import { spawn } from "node:child_process";
149
149
 
150
+ // packages/agent-spawn/src/types.ts
151
+ function resolveModeConfig(modeConfig) {
152
+ if (Array.isArray(modeConfig)) {
153
+ return { args: modeConfig };
154
+ }
155
+ return {
156
+ args: modeConfig.args ?? [],
157
+ env: modeConfig.env && Object.keys(modeConfig.env).length > 0 ? modeConfig.env : void 0
158
+ };
159
+ }
160
+
150
161
  // packages/agent-defs/src/agents/claude-code.ts
151
162
  var claudeCodeAgent = {
152
163
  id: "claude-code",
@@ -228,13 +239,30 @@ var kimiAgent = {
228
239
  }
229
240
  };
230
241
 
242
+ // packages/agent-defs/src/agents/goose.ts
243
+ var gooseAgent = {
244
+ id: "goose",
245
+ name: "goose",
246
+ label: "Goose",
247
+ summary: "Block's open-source AI agent with ACP support.",
248
+ binaryName: "goose",
249
+ configPath: "~/.config/goose/config.yaml",
250
+ branding: {
251
+ colors: {
252
+ dark: "#FF6B35",
253
+ light: "#E85D26"
254
+ }
255
+ }
256
+ };
257
+
231
258
  // packages/agent-defs/src/registry.ts
232
259
  var allAgents = [
233
260
  claudeCodeAgent,
234
261
  claudeDesktopAgent,
235
262
  codexAgent,
236
263
  openCodeAgent,
237
- kimiAgent
264
+ kimiAgent,
265
+ gooseAgent
238
266
  ];
239
267
  var lookup = /* @__PURE__ */ new Map();
240
268
  for (const agent of allAgents) {
@@ -310,6 +338,12 @@ function serializeCodexMcpArgs(servers) {
310
338
  }
311
339
  return args;
312
340
  }
341
+ function serializeGooseMcpArgs(servers) {
342
+ return Object.values(servers).flatMap((server) => [
343
+ "--with-extension",
344
+ [server.command, ...server.args ?? []].join(" ")
345
+ ]);
346
+ }
313
347
 
314
348
  // packages/agent-spawn/src/configs/claude-code.ts
315
349
  var claudeCodeSpawnConfig = {
@@ -437,12 +471,47 @@ var kimiAcpSpawnConfig = {
437
471
  acpArgs: ["acp"]
438
472
  };
439
473
 
474
+ // packages/agent-spawn/src/configs/goose.ts
475
+ var gooseSpawnConfig = {
476
+ kind: "cli",
477
+ agentId: "goose",
478
+ adapter: "native",
479
+ promptFlag: "--text",
480
+ modelFlag: "--model",
481
+ modelStripProviderPrefix: false,
482
+ defaultArgs: ["run", "--output-format", "stream-json"],
483
+ defaultArgsPosition: "beforePrompt",
484
+ mcpArgs: serializeGooseMcpArgs,
485
+ mcpArgsPosition: "beforePrompt",
486
+ modes: {
487
+ yolo: { env: { GOOSE_MODE: "auto" } },
488
+ edit: { env: { GOOSE_MODE: "smart_approve" } },
489
+ read: { env: { GOOSE_MODE: "chat" } }
490
+ },
491
+ stdinMode: {
492
+ omitPrompt: true,
493
+ extraArgs: ["--instructions", "-"]
494
+ },
495
+ interactive: {
496
+ defaultArgs: ["session"],
497
+ defaultArgsPosition: "beforePrompt"
498
+ },
499
+ resumeCommand: () => ["run", "--resume", "--text", "continue"]
500
+ };
501
+ var gooseAcpSpawnConfig = {
502
+ kind: "acp",
503
+ agentId: "goose",
504
+ acpArgs: ["acp"],
505
+ skipAuth: true
506
+ };
507
+
440
508
  // packages/agent-spawn/src/configs/index.ts
441
509
  var allSpawnConfigs = [
442
510
  claudeCodeSpawnConfig,
443
511
  codexSpawnConfig,
444
512
  openCodeSpawnConfig,
445
- kimiSpawnConfig
513
+ kimiSpawnConfig,
514
+ gooseSpawnConfig
446
515
  ];
447
516
  var lookup2 = /* @__PURE__ */ new Map();
448
517
  for (const config of allSpawnConfigs) {
@@ -451,6 +520,7 @@ for (const config of allSpawnConfigs) {
451
520
  var acpLookup = /* @__PURE__ */ new Map();
452
521
  acpLookup.set(openCodeAcpSpawnConfig.agentId, openCodeAcpSpawnConfig);
453
522
  acpLookup.set(kimiAcpSpawnConfig.agentId, kimiAcpSpawnConfig);
523
+ acpLookup.set(gooseAcpSpawnConfig.agentId, gooseAcpSpawnConfig);
454
524
  function getSpawnConfig(input) {
455
525
  const resolvedId = resolveAgentId(input);
456
526
  if (!resolvedId) {
@@ -537,10 +607,27 @@ function resolveCliConfig(agentId) {
537
607
  spawnConfig: resolved.spawnConfig
538
608
  };
539
609
  }
610
+ function getDefaultArgsPosition(config) {
611
+ return config.defaultArgsPosition ?? "afterPrompt";
612
+ }
613
+ function getMcpArgsPosition(config) {
614
+ if (config.mcpArgsPosition) {
615
+ return config.mcpArgsPosition;
616
+ }
617
+ return config.mcpArgsBeforeCommand ? "beforeCommand" : "afterCommand";
618
+ }
540
619
  function buildCliArgs(config, options, stdinMode) {
541
620
  const mcpArgs = getMcpArgs(config, options.mcpServers);
621
+ const defaultArgsPosition = getDefaultArgsPosition(config);
622
+ const mcpArgsPosition = getMcpArgsPosition(config);
542
623
  const args = [];
543
- if (config.mcpArgsBeforeCommand) {
624
+ if (mcpArgsPosition === "beforeCommand") {
625
+ args.push(...mcpArgs);
626
+ }
627
+ if (defaultArgsPosition === "beforePrompt") {
628
+ args.push(...config.defaultArgs);
629
+ }
630
+ if (mcpArgsPosition === "beforePrompt") {
544
631
  args.push(...mcpArgs);
545
632
  }
546
633
  if (stdinMode) {
@@ -557,20 +644,24 @@ function buildCliArgs(config, options, stdinMode) {
557
644
  if (config.modelTransform) model = config.modelTransform(model);
558
645
  args.push(config.modelFlag, model);
559
646
  }
560
- args.push(...config.defaultArgs);
561
- if (!config.mcpArgsBeforeCommand) {
647
+ if (defaultArgsPosition === "afterPrompt") {
648
+ args.push(...config.defaultArgs);
649
+ }
650
+ if (mcpArgsPosition === "afterCommand") {
562
651
  args.push(...mcpArgs);
563
652
  }
564
- args.push(...config.modes[options.mode ?? "yolo"]);
653
+ const mode = resolveModeConfig(config.modes[options.mode ?? "yolo"]);
654
+ args.push(...mode.args);
565
655
  if (options.args && options.args.length > 0) {
566
656
  args.push(...options.args);
567
657
  }
568
- return args;
658
+ return { args, env: mode.env };
569
659
  }
570
660
  function buildSpawnArgs(agentId, options) {
571
661
  const { binaryName, spawnConfig } = resolveCliConfig(agentId);
572
662
  const stdinMode = options.useStdin && spawnConfig.stdinMode ? spawnConfig.stdinMode : void 0;
573
- return { binaryName, args: buildCliArgs(spawnConfig, options, stdinMode) };
663
+ const result = buildCliArgs(spawnConfig, options, stdinMode);
664
+ return { binaryName, args: result.args, env: result.env };
574
665
  }
575
666
 
576
667
  // packages/agent-spawn/src/spawn-interactive.ts
@@ -1029,7 +1120,7 @@ ${stderr}`;
1029
1120
  }
1030
1121
  function createSpawnHealthCheck(agentId, options) {
1031
1122
  const prompt = `Output exactly: ${options.expectedOutput}`;
1032
- const { binaryName, args } = buildSpawnArgs(agentId, {
1123
+ const { binaryName, args, env: modeEnv } = buildSpawnArgs(agentId, {
1033
1124
  prompt,
1034
1125
  model: options.model,
1035
1126
  mode: "yolo"
@@ -1044,7 +1135,7 @@ function createSpawnHealthCheck(agentId, options) {
1044
1135
  );
1045
1136
  return;
1046
1137
  }
1047
- const result = await context.runCommand(binaryName, args);
1138
+ const result = modeEnv ? await context.runCommand(binaryName, args, { env: modeEnv }) : await context.runCommand(binaryName, args);
1048
1139
  if (result.exitCode !== 0) {
1049
1140
  throw new Error(
1050
1141
  `spawn ${agentId} failed with exit code ${result.exitCode}.
@@ -1349,14 +1440,92 @@ var tomlFormat = {
1349
1440
  prune: prune3
1350
1441
  };
1351
1442
 
1443
+ // packages/config-mutations/src/formats/yaml.ts
1444
+ import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
1445
+ function isConfigObject3(value) {
1446
+ return typeof value === "object" && value !== null && !Array.isArray(value);
1447
+ }
1448
+ function parse5(content) {
1449
+ if (!content || content.trim() === "") {
1450
+ return {};
1451
+ }
1452
+ const parsed = parseYaml(content);
1453
+ if (parsed === null || parsed === void 0) {
1454
+ return {};
1455
+ }
1456
+ if (!isConfigObject3(parsed)) {
1457
+ throw new Error("Expected YAML object.");
1458
+ }
1459
+ return parsed;
1460
+ }
1461
+ function serialize3(obj) {
1462
+ const serialized = stringifyYaml(obj);
1463
+ return serialized.endsWith("\n") ? serialized : `${serialized}
1464
+ `;
1465
+ }
1466
+ function merge4(base, patch) {
1467
+ const result = { ...base };
1468
+ for (const [key, value] of Object.entries(patch)) {
1469
+ if (value === void 0) {
1470
+ continue;
1471
+ }
1472
+ const existing = result[key];
1473
+ if (isConfigObject3(existing) && isConfigObject3(value)) {
1474
+ result[key] = merge4(existing, value);
1475
+ continue;
1476
+ }
1477
+ result[key] = value;
1478
+ }
1479
+ return result;
1480
+ }
1481
+ function prune4(obj, shape) {
1482
+ let changed = false;
1483
+ const result = { ...obj };
1484
+ for (const [key, pattern] of Object.entries(shape)) {
1485
+ if (!(key in result)) {
1486
+ continue;
1487
+ }
1488
+ const current = result[key];
1489
+ if (isConfigObject3(pattern) && Object.keys(pattern).length === 0) {
1490
+ delete result[key];
1491
+ changed = true;
1492
+ continue;
1493
+ }
1494
+ if (isConfigObject3(pattern) && isConfigObject3(current)) {
1495
+ const { changed: childChanged, result: childResult } = prune4(current, pattern);
1496
+ if (childChanged) {
1497
+ changed = true;
1498
+ }
1499
+ if (Object.keys(childResult).length === 0) {
1500
+ delete result[key];
1501
+ } else {
1502
+ result[key] = childResult;
1503
+ }
1504
+ continue;
1505
+ }
1506
+ delete result[key];
1507
+ changed = true;
1508
+ }
1509
+ return { changed, result };
1510
+ }
1511
+ var yamlFormat = {
1512
+ parse: parse5,
1513
+ serialize: serialize3,
1514
+ merge: merge4,
1515
+ prune: prune4
1516
+ };
1517
+
1352
1518
  // packages/config-mutations/src/formats/index.ts
1353
1519
  var formatRegistry = {
1354
1520
  json: jsonFormat,
1355
- toml: tomlFormat
1521
+ toml: tomlFormat,
1522
+ yaml: yamlFormat
1356
1523
  };
1357
1524
  var extensionMap = {
1358
1525
  ".json": "json",
1359
- ".toml": "toml"
1526
+ ".toml": "toml",
1527
+ ".yaml": "yaml",
1528
+ ".yml": "yaml"
1360
1529
  };
1361
1530
  function getConfigFormat(pathOrFormat) {
1362
1531
  if (pathOrFormat in formatRegistry) {
@@ -1505,7 +1674,7 @@ function pruneKeysByPrefix(table, prefix) {
1505
1674
  }
1506
1675
  return result;
1507
1676
  }
1508
- function isConfigObject3(value) {
1677
+ function isConfigObject4(value) {
1509
1678
  return typeof value === "object" && value !== null && !Array.isArray(value);
1510
1679
  }
1511
1680
  function mergeWithPruneByPrefix(base, patch, pruneByPrefix) {
@@ -1514,7 +1683,7 @@ function mergeWithPruneByPrefix(base, patch, pruneByPrefix) {
1514
1683
  for (const [key, value] of Object.entries(patch)) {
1515
1684
  const current = result[key];
1516
1685
  const prefix = prefixMap[key];
1517
- if (isConfigObject3(current) && isConfigObject3(value)) {
1686
+ if (isConfigObject4(current) && isConfigObject4(value)) {
1518
1687
  if (prefix) {
1519
1688
  const pruned = pruneKeysByPrefix(current, prefix);
1520
1689
  result[key] = { ...pruned, ...value };
@@ -2108,10 +2277,10 @@ async function runInstallStep(step, context) {
2108
2277
 
2109
2278
  // src/providers/create-provider.ts
2110
2279
  var templateImports = {
2111
- "py-poe-spawn/env.hbs": () => Promise.resolve().then(() => __toESM(require_env(), 1)),
2112
- "py-poe-spawn/main.py.hbs": () => Promise.resolve().then(() => __toESM(require_main_py(), 1)),
2113
- "py-poe-spawn/requirements.txt.hbs": () => Promise.resolve().then(() => __toESM(require_requirements_txt(), 1)),
2114
- "codex/config.toml.hbs": () => Promise.resolve().then(() => __toESM(require_config_toml(), 1))
2280
+ "py-poe-spawn/env.mustache": () => Promise.resolve().then(() => __toESM(require_env(), 1)),
2281
+ "py-poe-spawn/main.py.mustache": () => Promise.resolve().then(() => __toESM(require_main_py(), 1)),
2282
+ "py-poe-spawn/requirements.txt.mustache": () => Promise.resolve().then(() => __toESM(require_requirements_txt(), 1)),
2283
+ "codex/config.toml.mustache": () => Promise.resolve().then(() => __toESM(require_config_toml(), 1))
2115
2284
  };
2116
2285
  async function loadTemplate(templateId) {
2117
2286
  const loader = templateImports[templateId];
@@ -2134,6 +2303,7 @@ function createProvider(opts) {
2134
2303
  supportsMcpSpawn: opts.supportsMcpSpawn,
2135
2304
  configurePrompts: opts.configurePrompts,
2136
2305
  postConfigureMessages: opts.postConfigureMessages,
2306
+ extendConfigurePayload: opts.extendConfigurePayload,
2137
2307
  isolatedEnv: opts.isolatedEnv,
2138
2308
  async configure(context, runOptions) {
2139
2309
  await runMutations(opts.manifest.configure, {