poe-code 2.0.57 → 2.0.58

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 CHANGED
@@ -80,3 +80,44 @@ npx poe-code@latest install kimi
80
80
 
81
81
  - `--dry-run` – show every mutation without touching disk.
82
82
  - `--yes` – accept defaults for prompts.
83
+
84
+ ## SDK
85
+
86
+ Use `poe-code` programmatically in your own code:
87
+
88
+ ```typescript
89
+ import { spawn, getPoeApiKey } from "poe-code"
90
+
91
+ // Get stored API key
92
+ const apiKey = await getPoeApiKey()
93
+
94
+ // Run a prompt through a provider
95
+ const result = await spawn("claude-code", {
96
+ prompt: "Fix the bug in auth.ts",
97
+ cwd: "/path/to/project",
98
+ model: "claude-sonnet-4"
99
+ })
100
+
101
+ console.log(result.stdout)
102
+ ```
103
+
104
+ ### `spawn(service, options)`
105
+
106
+ Runs a single prompt through a configured service CLI.
107
+
108
+ - `service` – Service identifier (`claude-code`, `codex`, `opencode`)
109
+ - `options.prompt` – The prompt to send
110
+ - `options.cwd` – Working directory for the service CLI (optional)
111
+ - `options.model` – Model identifier override (optional)
112
+ - `options.args` – Additional arguments forwarded to the CLI (optional)
113
+
114
+ Returns `{ stdout, stderr, exitCode }`.
115
+
116
+ ### `getPoeApiKey()`
117
+
118
+ Reads the Poe API key with the following priority:
119
+
120
+ 1. `POE_API_KEY` environment variable
121
+ 2. Credentials file (`~/.poe-code/credentials.json`)
122
+
123
+ Throws if no credentials found.
@@ -1,5 +1,6 @@
1
1
  import path from "node:path";
2
- import { buildProviderContext, createExecutionResources, resolveCommandFlags, resolveServiceAdapter, } from "./shared.js";
2
+ import { createExecutionResources, resolveCommandFlags, resolveServiceAdapter } from "./shared.js";
3
+ import { spawnCore } from "../../sdk/spawn-core.js";
3
4
  export function registerSpawnCommand(program, container, options = {}) {
4
5
  const defaultServices = ["claude-code", "codex", "opencode"];
5
6
  const serviceList = options.extraServices && options.extraServices.length > 0
@@ -50,6 +51,7 @@ export function registerSpawnCommand(program, container, options = {}) {
50
51
  cwd: cwdOverride,
51
52
  useStdin: shouldReadFromStdin
52
53
  };
54
+ // Check for custom handlers first
53
55
  const directHandler = options.handlers?.[service];
54
56
  if (directHandler) {
55
57
  await directHandler({
@@ -74,35 +76,16 @@ export function registerSpawnCommand(program, container, options = {}) {
74
76
  });
75
77
  return;
76
78
  }
77
- if (typeof adapter.spawn !== "function") {
78
- throw new Error(`${adapter.label} does not support spawn.`);
79
- }
80
- if (spawnOptions.useStdin && !adapter.supportsStdinPrompt) {
81
- throw new Error(`${adapter.label} does not support stdin prompts. Use a different service (e.g. "codex") or pass the prompt as an argument.`);
82
- }
83
- const providerContext = buildProviderContext(container, adapter, resources);
79
+ // Use SDK core spawn implementation
80
+ const result = await spawnCore(container, service, spawnOptions, {
81
+ dryRun: flags.dryRun,
82
+ verbose: flags.verbose
83
+ });
84
+ // Handle dry run - spawnCore already logged the message
84
85
  if (flags.dryRun) {
85
- const extra = spawnOptions.args && spawnOptions.args.length > 0
86
- ? ` with args ${JSON.stringify(spawnOptions.args)}`
87
- : "";
88
- const cwdSuffix = spawnOptions.cwd ? ` from ${spawnOptions.cwd}` : "";
89
- const promptDetail = spawnOptions.useStdin
90
- ? `(stdin, ${spawnOptions.prompt.length} chars)`
91
- : `"${spawnOptions.prompt}"`;
92
- resources.logger.dryRun(`Dry run: would spawn ${adapter.label} with prompt ${promptDetail}${extra}${cwdSuffix}.`);
93
- return;
94
- }
95
- const result = (await container.registry.invoke(canonicalService, "spawn", async (entry) => {
96
- if (!entry.spawn) {
97
- throw new Error(`${adapter.label} does not support spawn.`);
98
- }
99
- const output = await entry.spawn(providerContext, spawnOptions);
100
- return output;
101
- }));
102
- if (!result) {
103
- resources.logger.info(`${adapter.label} spawn completed.`);
104
86
  return;
105
87
  }
88
+ // Handle result output
106
89
  if (result.exitCode !== 0) {
107
90
  const detail = result.stderr.trim() || result.stdout.trim();
108
91
  const suffix = detail ? `: ${detail}` : "";
@@ -1 +1 @@
1
- {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../../src/cli/commands/spawn.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,mBAAmB,EACnB,qBAAqB,GAItB,MAAM,aAAa,CAAC;AAqBrB,MAAM,UAAU,oBAAoB,CAClC,OAAgB,EAChB,SAAuB,EACvB,UAAuC,EAAE;IAEzC,MAAM,eAAe,GAAG,CAAC,aAAa,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAC7D,MAAM,WAAW,GACf,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;QACvD,CAAC,CAAC,CAAC,GAAG,eAAe,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC;QAChD,CAAC,CAAC,eAAe,CAAC;IACtB,MAAM,kBAAkB,GAAG,qBAAqB,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;IAE3E,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,uDAAuD,CAAC;SACpE,MAAM,CAAC,iBAAiB,EAAE,qDAAqD,CAAC;SAChF,MAAM,CAAC,kBAAkB,EAAE,uCAAuC,CAAC;SACnE,MAAM,CAAC,SAAS,EAAE,4BAA4B,CAAC;SAC/C,QAAQ,CACP,WAAW,EACX,kBAAkB,CACnB;SACA,QAAQ,CAAC,UAAU,EAAE,sCAAsC,CAAC;SAC5D,QAAQ,CACP,gBAAgB,EAChB,mDAAmD,CACpD;SACA,MAAM,CAAC,KAAK,WAEX,OAAe,EACf,UAA8B,EAC9B,YAAsB,EAAE;QAExB,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,wBAAwB,CACxC,SAAS,EACT,KAAK,EACL,SAAS,OAAO,EAAE,CACnB,CAAC;QACF,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,EAAqD,CAAC;QACtF,MAAM,WAAW,GAAG,4BAA4B,CAC9C,SAAS,CAAC,GAAG,CAAC,GAAG,EACjB,cAAc,CAAC,GAAG,CACnB,CAAC;QAEF,MAAM,cAAc,GAAG,cAAc,CAAC,KAAK,KAAK,IAAI,CAAC;QACrD,MAAM,mBAAmB,GACvB,cAAc;YACd,UAAU,KAAK,GAAG;YAClB,CAAC,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAExC,MAAM,aAAa,GAAG,cAAc;YAClC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC;YACrD,CAAC,CAAC,SAAS,CAAC;QAEd,IAAI,cAAc,EAAE,CAAC;YACnB,UAAU,GAAG,SAAS,CAAC;QACzB,CAAC;QAED,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;YACvB,UAAU,GAAG,SAAS,CAAC;QACzB,CAAC;QAED,IAAI,CAAC,UAAU,IAAI,mBAAmB,EAAE,CAAC;YACvC,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;YACD,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7D,CAAC;QAED,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,YAAY,GAAwB;YACxC,MAAM,EAAE,UAAU;YAClB,IAAI,EAAE,aAAa;YACnB,KAAK,EAAE,cAAc,CAAC,KAAK;YAC3B,GAAG,EAAE,WAAW;YAChB,QAAQ,EAAE,mBAAmB;SAC9B,CAAC;QAEF,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,aAAa,CAAC;gBAClB,SAAS;gBACT,OAAO;gBACP,OAAO,EAAE,YAAY;gBACrB,KAAK;gBACL,SAAS;aACV,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;QACtC,MAAM,gBAAgB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,gBAAgB,CAAC,CAAC;QAC9D,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,gBAAgB,CAAC;gBACrB,SAAS;gBACT,OAAO,EAAE,gBAAgB;gBACzB,OAAO,EAAE,YAAY;gBACrB,KAAK;gBACL,SAAS;aACV,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,0BAA0B,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,YAAY,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CACb,GAAG,OAAO,CAAC,KAAK,4GAA4G,CAC7H,CAAC;QACJ,CAAC;QAED,MAAM,eAAe,GAAG,oBAAoB,CAC1C,SAAS,EACT,OAAO,EACP,SAAS,CACV,CAAC;QAEF,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,KAAK,GACT,YAAY,CAAC,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;gBAC/C,CAAC,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE;gBACnD,CAAC,CAAC,EAAE,CAAC;YACT,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,MAAM,YAAY,GAAG,YAAY,CAAC,QAAQ;gBACxC,CAAC,CAAC,WAAW,YAAY,CAAC,MAAM,CAAC,MAAM,SAAS;gBAChD,CAAC,CAAC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC;YAC/B,SAAS,CAAC,MAAM,CAAC,MAAM,CACrB,wBAAwB,OAAO,CAAC,KAAK,gBAAgB,YAAY,GAAG,KAAK,GAAG,SAAS,GAAG,CACzF,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,MAAM,SAAS,CAAC,QAAQ,CAAC,MAAM,CAC7C,gBAAgB,EAChB,OAAO,EACP,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,0BAA0B,CAAC,CAAC;YAC9D,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;YAChE,OAAO,MAAoC,CAAC;QAC9C,CAAC,CACF,CAA+B,CAAC;QAEjC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,mBAAmB,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CACb,GAAG,OAAO,CAAC,KAAK,gCAAgC,MAAM,CAAC,QAAQ,GAAG,MAAM,EAAE,CAC3E,CAAC;QACJ,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,aAAa,EAAE,CAAC;YAClB,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,aAAa,EAAE,CAAC;YAClB,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,mBAAmB,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,4BAA4B,CACnC,OAAe,EACf,SAAkB;IAElB,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../../src/cli/commands/spawn.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { isCliInvocation } from "./cli/bootstrap.js";
3
+ export { spawn } from "./sdk/spawn.js";
4
+ export { getPoeApiKey } from "./sdk/credentials.js";
5
+ export type { SpawnOptions, SpawnResult } from "./sdk/types.js";
3
6
  declare const main: () => Promise<void>;
4
7
  export { main, isCliInvocation };
package/dist/index.js CHANGED
@@ -1,9 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import { createProgram } from "./cli/program.js";
3
3
  import { createCliMain, isCliInvocation } from "./cli/bootstrap.js";
4
+ // SDK exports
5
+ export { spawn } from "./sdk/spawn.js";
6
+ export { getPoeApiKey } from "./sdk/credentials.js";
4
7
  const main = createCliMain(createProgram);
5
8
  if (isCliInvocation(process.argv, import.meta.url)) {
6
9
  void main();
7
10
  }
11
+ // CLI exports
8
12
  export { main, isCliInvocation };
9
13
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEpE,MAAM,IAAI,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;AAE1C,IAAI,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACnD,KAAK,IAAI,EAAE,CAAC;AACd,CAAC;AAED,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEpE,cAAc;AACd,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD,MAAM,IAAI,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;AAE1C,IAAI,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACnD,KAAK,IAAI,EAAE,CAAC;AACd,CAAC;AAED,cAAc;AACd,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { CliContainer } from "../cli/container.js";
2
+ export interface SdkContainerOptions {
3
+ /** Working directory (defaults to process.cwd()) */
4
+ cwd?: string;
5
+ /** Home directory (defaults to os.homedir()) */
6
+ homeDir?: string;
7
+ /** Environment variables (defaults to process.env) */
8
+ variables?: Record<string, string | undefined>;
9
+ /** Enable verbose logging (defaults to false) */
10
+ verbose?: boolean;
11
+ }
12
+ /**
13
+ * Creates a lightweight container for SDK usage.
14
+ * Uses real file system and command runner.
15
+ * No prompts needed (non-interactive).
16
+ * Minimal logger (silent by default).
17
+ */
18
+ export declare function createSdkContainer(options?: SdkContainerOptions): CliContainer;
@@ -0,0 +1,127 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as os from "node:os";
3
+ import { createCliEnvironment } from "../cli/environment.js";
4
+ import { createServiceRegistry } from "../cli/service-registry.js";
5
+ import { createCommandContextFactory } from "../cli/context.js";
6
+ import { createPromptLibrary } from "../cli/prompts.js";
7
+ import { createOptionResolvers } from "../cli/options.js";
8
+ import { createLoggerFactory } from "../cli/logger.js";
9
+ import { ErrorLogger } from "../cli/error-logger.js";
10
+ import { createDefaultCommandRunner } from "../cli/command-runner.js";
11
+ import { getDefaultProviders } from "../providers/index.js";
12
+ import { createPoeCodeCommandRunner } from "../cli/poe-code-command-runner.js";
13
+ import { loadCredentials, saveCredentials } from "../services/credentials.js";
14
+ import * as nodeFsSync from "node:fs";
15
+ /**
16
+ * Creates a lightweight container for SDK usage.
17
+ * Uses real file system and command runner.
18
+ * No prompts needed (non-interactive).
19
+ * Minimal logger (silent by default).
20
+ */
21
+ export function createSdkContainer(options) {
22
+ const cwd = options?.cwd ?? process.cwd();
23
+ const homeDir = options?.homeDir ?? os.homedir();
24
+ const variables = options?.variables ?? process.env;
25
+ const verbose = options?.verbose ?? false;
26
+ const environment = createCliEnvironment({
27
+ cwd,
28
+ homeDir,
29
+ platform: process.platform,
30
+ variables
31
+ });
32
+ // Silent logger for SDK - only emits if verbose
33
+ const silentEmitter = verbose ? undefined : () => { };
34
+ const loggerFactory = createLoggerFactory(silentEmitter);
35
+ // Create error logger with sync fs
36
+ const errorLogger = new ErrorLogger({
37
+ fs: nodeFsSync,
38
+ logDir: environment.logDir,
39
+ logToStderr: false
40
+ });
41
+ loggerFactory.setErrorLogger(errorLogger);
42
+ // Create async file system adapter
43
+ const asyncFs = {
44
+ readFile: ((path, encoding) => {
45
+ if (encoding) {
46
+ return fs.readFile(path, encoding);
47
+ }
48
+ return fs.readFile(path);
49
+ }),
50
+ writeFile: (path, data, opts) => fs.writeFile(path, data, opts),
51
+ mkdir: (path, opts) => fs.mkdir(path, opts).then(() => { }),
52
+ stat: (path) => fs.stat(path),
53
+ rm: (path, opts) => fs.rm(path, opts),
54
+ unlink: (path) => fs.unlink(path),
55
+ readdir: (path) => fs.readdir(path),
56
+ copyFile: (src, dest) => fs.copyFile(src, dest),
57
+ chmod: (path, mode) => fs.chmod(path, mode)
58
+ };
59
+ const contextFactory = createCommandContextFactory({ fs: asyncFs });
60
+ // No-op prompts for SDK (non-interactive)
61
+ const noopPrompts = async () => {
62
+ throw new Error("SDK does not support interactive prompts");
63
+ };
64
+ const promptLibrary = createPromptLibrary();
65
+ const optionResolvers = createOptionResolvers({
66
+ prompts: noopPrompts,
67
+ promptLibrary,
68
+ apiKeyStore: {
69
+ read: () => loadCredentials({
70
+ fs: asyncFs,
71
+ filePath: environment.credentialsPath
72
+ }),
73
+ write: (value) => saveCredentials({
74
+ fs: asyncFs,
75
+ filePath: environment.credentialsPath,
76
+ apiKey: value
77
+ })
78
+ }
79
+ });
80
+ const registry = createServiceRegistry();
81
+ const providers = getDefaultProviders().filter((adapter) => !adapter.disabled);
82
+ for (const adapter of providers) {
83
+ registry.register(adapter);
84
+ }
85
+ const baseRunner = createDefaultCommandRunner();
86
+ // Create container with wrapped runner
87
+ let container = null;
88
+ const wrappedRunner = createPoeCodeCommandRunner({
89
+ getContainer: () => container,
90
+ baseRunner
91
+ });
92
+ // HTTP client using global fetch
93
+ const httpClient = async (url, init) => {
94
+ const response = await globalThis.fetch(url, init);
95
+ return {
96
+ ok: response.ok,
97
+ status: response.status,
98
+ json: () => response.json()
99
+ };
100
+ };
101
+ container = {
102
+ env: environment,
103
+ fs: asyncFs,
104
+ prompts: noopPrompts,
105
+ promptLibrary,
106
+ loggerFactory,
107
+ errorLogger,
108
+ options: optionResolvers,
109
+ contextFactory,
110
+ registry,
111
+ httpClient,
112
+ commandRunner: wrappedRunner,
113
+ providers,
114
+ dependencies: {
115
+ fs: asyncFs,
116
+ prompts: noopPrompts,
117
+ env: {
118
+ cwd,
119
+ homeDir,
120
+ platform: process.platform,
121
+ variables
122
+ }
123
+ }
124
+ };
125
+ return container;
126
+ }
127
+ //# sourceMappingURL=container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/sdk/container.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Reads the Poe API key with the following priority:
3
+ * 1. `POE_API_KEY` environment variable (if set)
4
+ * 2. Credentials file (`~/.poe-code/credentials.json`)
5
+ *
6
+ * @returns The API key
7
+ * @throws Error if no credentials found
8
+ */
9
+ export declare function getPoeApiKey(): Promise<string>;
@@ -0,0 +1,35 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as os from "node:os";
3
+ import * as path from "node:path";
4
+ const CREDENTIALS_RELATIVE_PATH = ".poe-code/credentials.json";
5
+ /**
6
+ * Reads the Poe API key with the following priority:
7
+ * 1. `POE_API_KEY` environment variable (if set)
8
+ * 2. Credentials file (`~/.poe-code/credentials.json`)
9
+ *
10
+ * @returns The API key
11
+ * @throws Error if no credentials found
12
+ */
13
+ export async function getPoeApiKey() {
14
+ const envKey = process.env.POE_API_KEY;
15
+ if (typeof envKey === "string" && envKey.trim().length > 0) {
16
+ return envKey.trim();
17
+ }
18
+ const homeDir = os.homedir();
19
+ const credentialsPath = path.join(homeDir, CREDENTIALS_RELATIVE_PATH);
20
+ try {
21
+ const content = await fs.readFile(credentialsPath, "utf8");
22
+ const parsed = JSON.parse(content);
23
+ if (typeof parsed === "object" &&
24
+ parsed !== null &&
25
+ typeof parsed.apiKey === "string" &&
26
+ parsed.apiKey.length > 0) {
27
+ return parsed.apiKey;
28
+ }
29
+ }
30
+ catch {
31
+ // File doesn't exist or is invalid
32
+ }
33
+ throw new Error("No API key found. Set POE_API_KEY or run 'poe-code login'.");
34
+ }
35
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/sdk/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,yBAAyB,GAAG,4BAA4B,CAAC;AAE/D;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IACvC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3D,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC7B,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,yBAAyB,CAAC,CAAC;IAEtE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,IACE,OAAO,MAAM,KAAK,QAAQ;YAC1B,MAAM,KAAK,IAAI;YACf,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;YACjC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EACxB,CAAC;YACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,mCAAmC;IACrC,CAAC;IAED,MAAM,IAAI,KAAK,CACb,4DAA4D,CAC7D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { CliContainer } from "../cli/container.js";
2
+ import type { SpawnResult } from "./types.js";
3
+ export interface SpawnCoreOptions {
4
+ /** The prompt to send to the provider */
5
+ prompt: string;
6
+ /** Working directory for the service CLI */
7
+ cwd?: string;
8
+ /** Model identifier override */
9
+ model?: string;
10
+ /** Additional arguments forwarded to the CLI */
11
+ args?: string[];
12
+ /** Whether prompt was read from stdin */
13
+ useStdin?: boolean;
14
+ }
15
+ export interface SpawnCoreFlags {
16
+ dryRun: boolean;
17
+ verbose: boolean;
18
+ }
19
+ /**
20
+ * Core spawn implementation used by both SDK and CLI.
21
+ * Accepts an existing container to avoid creating a new one.
22
+ */
23
+ export declare function spawnCore(container: CliContainer, service: string, options: SpawnCoreOptions, flags?: SpawnCoreFlags): Promise<SpawnResult>;
@@ -0,0 +1,81 @@
1
+ import path from "node:path";
2
+ import { buildProviderContext, createExecutionResources } from "../cli/commands/shared.js";
3
+ /**
4
+ * Core spawn implementation used by both SDK and CLI.
5
+ * Accepts an existing container to avoid creating a new one.
6
+ */
7
+ export async function spawnCore(container, service, options, flags = { dryRun: false, verbose: false }) {
8
+ // Resolve working directory
9
+ const cwdOverride = resolveSpawnWorkingDirectory(container.env.cwd, options.cwd);
10
+ // Build spawn command options (internal format)
11
+ const spawnOptions = {
12
+ prompt: options.prompt,
13
+ args: options.args,
14
+ model: options.model,
15
+ cwd: cwdOverride,
16
+ useStdin: options.useStdin ?? false
17
+ };
18
+ // Resolve service adapter
19
+ const adapter = container.registry.get(service);
20
+ if (!adapter) {
21
+ throw new Error(`Unknown service "${service}".`);
22
+ }
23
+ if (typeof adapter.spawn !== "function") {
24
+ throw new Error(`${adapter.label} does not support spawn.`);
25
+ }
26
+ if (spawnOptions.useStdin && !adapter.supportsStdinPrompt) {
27
+ throw new Error(`${adapter.label} does not support stdin prompts. Use a different service (e.g. "codex") or pass the prompt as an argument.`);
28
+ }
29
+ // Create execution resources (logger, context)
30
+ const commandFlags = { dryRun: flags.dryRun, assumeYes: true, verbose: flags.verbose };
31
+ const resources = createExecutionResources(container, commandFlags, `spawn:${service}`);
32
+ // Build provider context
33
+ const providerContext = buildProviderContext(container, adapter, resources);
34
+ // Handle dry run
35
+ if (flags.dryRun) {
36
+ const extra = spawnOptions.args && spawnOptions.args.length > 0
37
+ ? ` with args ${JSON.stringify(spawnOptions.args)}`
38
+ : "";
39
+ const cwdSuffix = spawnOptions.cwd ? ` from ${spawnOptions.cwd}` : "";
40
+ const promptDetail = spawnOptions.useStdin
41
+ ? `(stdin, ${spawnOptions.prompt.length} chars)`
42
+ : `"${spawnOptions.prompt}"`;
43
+ resources.logger.dryRun(`Dry run: would spawn ${adapter.label} with prompt ${promptDetail}${extra}${cwdSuffix}.`);
44
+ return {
45
+ stdout: "",
46
+ stderr: "",
47
+ exitCode: 0
48
+ };
49
+ }
50
+ // Invoke spawn through registry
51
+ const result = (await container.registry.invoke(adapter.name, "spawn", async (entry) => {
52
+ if (!entry.spawn) {
53
+ throw new Error(`${adapter.label} does not support spawn.`);
54
+ }
55
+ const output = await entry.spawn(providerContext, spawnOptions);
56
+ return output;
57
+ }));
58
+ // Return normalized result
59
+ if (!result) {
60
+ return {
61
+ stdout: "",
62
+ stderr: "",
63
+ exitCode: 0
64
+ };
65
+ }
66
+ return {
67
+ stdout: result.stdout,
68
+ stderr: result.stderr,
69
+ exitCode: result.exitCode
70
+ };
71
+ }
72
+ function resolveSpawnWorkingDirectory(baseDir, candidate) {
73
+ if (!candidate || candidate.trim().length === 0) {
74
+ return undefined;
75
+ }
76
+ if (path.isAbsolute(candidate)) {
77
+ return candidate;
78
+ }
79
+ return path.resolve(baseDir, candidate);
80
+ }
81
+ //# sourceMappingURL=spawn-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn-core.js","sourceRoot":"","sources":["../../src/sdk/spawn-core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { SpawnOptions, SpawnResult } from "./types.js";
2
+ /**
3
+ * Runs a single prompt through a configured service CLI.
4
+ *
5
+ * @param service - Service identifier (claude-code, codex, opencode)
6
+ * @param options - Configuration for the spawn
7
+ * @returns Promise resolving to SpawnResult with stdout, stderr, and exitCode
8
+ * @throws Error if no API key found or service doesn't support spawn
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * import { spawn } from "poe-code"
13
+ *
14
+ * const result = await spawn("claude-code", {
15
+ * prompt: "Fix the bug in auth.ts",
16
+ * cwd: "/path/to/project",
17
+ * model: "claude-sonnet-4"
18
+ * })
19
+ *
20
+ * console.log(result.stdout)
21
+ * ```
22
+ */
23
+ export declare function spawn(service: string, options: SpawnOptions): Promise<SpawnResult>;
@@ -0,0 +1,41 @@
1
+ import { createSdkContainer } from "./container.js";
2
+ import { getPoeApiKey } from "./credentials.js";
3
+ import { spawnCore } from "./spawn-core.js";
4
+ /**
5
+ * Runs a single prompt through a configured service CLI.
6
+ *
7
+ * @param service - Service identifier (claude-code, codex, opencode)
8
+ * @param options - Configuration for the spawn
9
+ * @returns Promise resolving to SpawnResult with stdout, stderr, and exitCode
10
+ * @throws Error if no API key found or service doesn't support spawn
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * import { spawn } from "poe-code"
15
+ *
16
+ * const result = await spawn("claude-code", {
17
+ * prompt: "Fix the bug in auth.ts",
18
+ * cwd: "/path/to/project",
19
+ * model: "claude-sonnet-4"
20
+ * })
21
+ *
22
+ * console.log(result.stdout)
23
+ * ```
24
+ */
25
+ export async function spawn(service, options) {
26
+ // Validate API key exists (throws if not found)
27
+ await getPoeApiKey();
28
+ // Create SDK container with cwd from options
29
+ const container = createSdkContainer({
30
+ cwd: options.cwd
31
+ });
32
+ // Delegate to core spawn implementation
33
+ return spawnCore(container, service, {
34
+ prompt: options.prompt,
35
+ cwd: options.cwd,
36
+ model: options.model,
37
+ args: options.args,
38
+ useStdin: false
39
+ });
40
+ }
41
+ //# sourceMappingURL=spawn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/sdk/spawn.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CACzB,OAAe,EACf,OAAqB;IAErB,gDAAgD;IAChD,MAAM,YAAY,EAAE,CAAC;IAErB,6CAA6C;IAC7C,MAAM,SAAS,GAAG,kBAAkB,CAAC;QACnC,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IAEH,wCAAwC;IACxC,OAAO,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE;QACnC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,24 @@
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
+ }
14
+ /**
15
+ * Result from spawning a provider CLI.
16
+ */
17
+ export interface SpawnResult {
18
+ /** Standard output from the CLI */
19
+ stdout: string;
20
+ /** Standard error from the CLI */
21
+ stderr: string;
22
+ /** Exit code from the CLI process */
23
+ exitCode: number;
24
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sdk/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "poe-code",
3
- "version": "2.0.57",
3
+ "version": "2.0.58",
4
4
  "description": "CLI tool to configure Poe API for developer workflows.",
5
5
  "type": "module",
6
6
  "scripts": {