poe-code 3.0.13-beta.1 → 3.0.13

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.
@@ -1,6 +1,10 @@
1
1
  import path from "node:path";
2
+ import { renderAcpStream } from "@poe-code/agent-spawn";
3
+ import { allAgents, resolveAgentId } from "@poe-code/agent-defs";
4
+ import { text } from "@poe-code/design-system";
2
5
  import { createExecutionResources, resolveCommandFlags, resolveServiceAdapter, formatServiceList } from "./shared.js";
3
6
  import { spawnCore } from "../../sdk/spawn-core.js";
7
+ import { spawn as spawnSdk } from "../../sdk/spawn.js";
4
8
  export function registerSpawnCommand(program, container, options = {}) {
5
9
  const spawnServices = container.registry
6
10
  .list()
@@ -73,47 +77,122 @@ export function registerSpawnCommand(program, container, options = {}) {
73
77
  resources.logger.intro(`spawn ${canonicalService}`);
74
78
  const canonicalHandler = options.handlers?.[canonicalService];
75
79
  if (canonicalHandler) {
76
- await canonicalHandler({
77
- container,
78
- service: canonicalService,
79
- options: spawnOptions,
80
- flags,
81
- resources
80
+ try {
81
+ await canonicalHandler({
82
+ container,
83
+ service: canonicalService,
84
+ options: spawnOptions,
85
+ flags,
86
+ resources
87
+ });
88
+ return;
89
+ }
90
+ finally {
91
+ resources.context.finalize();
92
+ }
93
+ }
94
+ try {
95
+ if (flags.dryRun) {
96
+ // spawnCore already logs the dry run details.
97
+ await spawnCore(container, canonicalService, spawnOptions, {
98
+ dryRun: true,
99
+ verbose: flags.verbose
100
+ });
101
+ return;
102
+ }
103
+ const { events, result } = spawnSdk(canonicalService, {
104
+ prompt: spawnOptions.prompt,
105
+ args: spawnOptions.args,
106
+ model: spawnOptions.model,
107
+ cwd: spawnOptions.cwd
82
108
  });
83
- resources.context.finalize();
84
- return;
109
+ await renderAcpStream(events);
110
+ const final = await result;
111
+ if (final.exitCode !== 0) {
112
+ const detail = final.stderr.trim() || final.stdout.trim();
113
+ const suffix = detail ? `: ${detail}` : "";
114
+ throw new Error(`${adapter.label} spawn failed with exit code ${final.exitCode}${suffix}`);
115
+ }
116
+ const trimmedStdout = final.stdout.trim();
117
+ if (trimmedStdout) {
118
+ resources.logger.info(trimmedStdout);
119
+ }
120
+ else {
121
+ const trimmedStderr = final.stderr.trim();
122
+ if (trimmedStderr) {
123
+ resources.logger.info(trimmedStderr);
124
+ }
125
+ else {
126
+ resources.logger.info(`${adapter.label} spawn completed.`);
127
+ }
128
+ }
129
+ if (final.threadId) {
130
+ const resolvedId = resolveAgentId(canonicalService) ?? canonicalService;
131
+ const agentDefinition = allAgents.find((agent) => agent.id === resolvedId);
132
+ const binaryName = agentDefinition?.binaryName;
133
+ if (binaryName) {
134
+ const resumeCwd = spawnOptions.cwd ?? process.cwd();
135
+ const resumeCommand = `${binaryName} resume -C ${shlexQuote(resumeCwd)} ${final.threadId}`;
136
+ resources.logger.info(text.muted(`\nResume: ${resumeCommand}`));
137
+ }
138
+ }
85
139
  }
86
- // Use SDK core spawn implementation
87
- const result = await spawnCore(container, canonicalService, spawnOptions, {
88
- dryRun: flags.dryRun,
89
- verbose: flags.verbose
90
- });
91
- // Handle dry run - spawnCore already logged the message
92
- if (flags.dryRun) {
140
+ finally {
93
141
  resources.context.finalize();
94
- return;
95
- }
96
- // Handle result output
97
- if (result.exitCode !== 0) {
98
- const detail = result.stderr.trim() || result.stdout.trim();
99
- const suffix = detail ? `: ${detail}` : "";
100
- throw new Error(`${adapter.label} spawn failed with exit code ${result.exitCode}${suffix}`);
101
142
  }
102
- const trimmedStdout = result.stdout.trim();
103
- if (trimmedStdout) {
104
- resources.logger.info(trimmedStdout);
105
- resources.context.finalize();
106
- return;
143
+ });
144
+ }
145
+ function shlexQuote(value) {
146
+ if (value.length === 0) {
147
+ return "''";
148
+ }
149
+ let isSafe = true;
150
+ for (let index = 0; index < value.length; index += 1) {
151
+ if (!isSafeShellChar(value.charCodeAt(index))) {
152
+ isSafe = false;
153
+ break;
107
154
  }
108
- const trimmedStderr = result.stderr.trim();
109
- if (trimmedStderr) {
110
- resources.logger.info(trimmedStderr);
111
- resources.context.finalize();
112
- return;
155
+ }
156
+ if (isSafe) {
157
+ return value;
158
+ }
159
+ let output = "'";
160
+ for (let index = 0; index < value.length; index += 1) {
161
+ const char = value[index];
162
+ if (char === "'") {
163
+ output += `'"'"'`;
164
+ continue;
113
165
  }
114
- resources.logger.info(`${adapter.label} spawn completed.`);
115
- resources.context.finalize();
116
- });
166
+ output += char;
167
+ }
168
+ output += "'";
169
+ return output;
170
+ }
171
+ function isSafeShellChar(code) {
172
+ if (code >= 48 && code <= 57) {
173
+ return true;
174
+ }
175
+ if (code >= 65 && code <= 90) {
176
+ return true;
177
+ }
178
+ if (code >= 97 && code <= 122) {
179
+ return true;
180
+ }
181
+ switch (code) {
182
+ case 95: // _
183
+ case 64: // @
184
+ case 37: // %
185
+ case 43: // +
186
+ case 61: // =
187
+ case 58: // :
188
+ case 44: // ,
189
+ case 46: // .
190
+ case 47: // /
191
+ case 45: // -
192
+ return true;
193
+ default:
194
+ return false;
195
+ }
117
196
  }
118
197
  function resolveSpawnWorkingDirectory(baseDir, candidate) {
119
198
  if (!candidate || candidate.trim().length === 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../../src/cli/commands/spawn.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../../src/cli/commands/spawn.ts"],"names":[],"mappings":"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"}
@@ -1,23 +1,31 @@
1
+ import { type AcpEvent } from "@poe-code/agent-spawn";
1
2
  import type { SpawnOptions, SpawnResult } from "./types.js";
2
3
  /**
3
- * Runs a single prompt through a configured service CLI.
4
+ * Spawns an agent with optional streaming.
4
5
  *
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
6
+ * Returns both:
7
+ * - `events`: an async stream of ACP events (empty when the provider doesn't support streaming)
8
+ * - `result`: a promise resolving to the final SpawnResult
9
9
  *
10
10
  * @example
11
11
  * ```typescript
12
12
  * import { spawn } from "poe-code"
13
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
- * })
14
+ * const { events, result } = spawn("codex", "Fix the bug in auth.ts")
19
15
  *
20
- * console.log(result.stdout)
16
+ * for await (const e of events) {
17
+ * // render or log events
18
+ * }
19
+ *
20
+ * const final = await result
21
+ * console.log(final.exitCode)
21
22
  * ```
22
23
  */
23
- export declare function spawn(service: string, options: SpawnOptions): Promise<SpawnResult>;
24
+ export declare function spawn(service: string, prompt: string, options?: Omit<SpawnOptions, "prompt">): {
25
+ events: AsyncIterable<AcpEvent>;
26
+ result: Promise<SpawnResult>;
27
+ };
28
+ export declare function spawn(service: string, options: SpawnOptions): {
29
+ events: AsyncIterable<AcpEvent>;
30
+ result: Promise<SpawnResult>;
31
+ };
package/dist/sdk/spawn.js CHANGED
@@ -1,41 +1,95 @@
1
- import { createSdkContainer } from "./container.js";
2
1
  import { getPoeApiKey } from "./credentials.js";
3
2
  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
3
+ import { createSdkContainer } from "./container.js";
4
+ import { getSpawnConfig, spawn as spawnNonStreaming, spawnStreaming } from "@poe-code/agent-spawn";
5
+ export function spawn(service, promptOrOptions, maybeOptions) {
6
+ const options = typeof promptOrOptions === "string"
7
+ ? { ...maybeOptions, prompt: promptOrOptions }
8
+ : promptOrOptions;
9
+ const emptyEvents = (async function* () { })();
10
+ /**
11
+ * Deferred event stream resolution.
12
+ *
13
+ * This pattern allows us to return both `events` and `result` synchronously from `spawn()`,
14
+ * while the actual event source is determined asynchronously inside the `result` promise.
15
+ *
16
+ * The flow:
17
+ * 1. Caller receives `{ events, result }` immediately
18
+ * 2. Caller can start iterating `events` right away (iteration blocks on `eventsPromise`)
19
+ * 3. Inside `result`, we determine if streaming is supported and resolve `eventsPromise`
20
+ * with either the real event stream or an empty generator
21
+ * 4. The outer `events` generator then yields from the resolved inner stream
22
+ *
23
+ * This avoids forcing callers to `await` before they can set up their event handlers,
24
+ * enabling patterns like: `for await (const e of events) { ... }` without race conditions.
25
+ */
26
+ let resolveEvents;
27
+ let eventsResolved = false;
28
+ const eventsPromise = new Promise((resolve) => {
29
+ resolveEvents = resolve;
39
30
  });
31
+ const resolveEventsOnce = (value) => {
32
+ if (eventsResolved)
33
+ return;
34
+ eventsResolved = true;
35
+ resolveEvents?.(value);
36
+ };
37
+ const events = (async function* () {
38
+ for await (const e of await eventsPromise) {
39
+ yield e;
40
+ }
41
+ })();
42
+ const result = (async () => {
43
+ try {
44
+ await getPoeApiKey();
45
+ const spawnConfig = getSpawnConfig(service);
46
+ const supportsStreaming = !!spawnConfig &&
47
+ spawnConfig.kind === "cli" &&
48
+ typeof spawnConfig.adapter === "string";
49
+ if (supportsStreaming) {
50
+ const { events: innerEvents, done } = spawnStreaming({
51
+ agentId: service,
52
+ prompt: options.prompt,
53
+ cwd: options.cwd,
54
+ model: options.model,
55
+ args: options.args,
56
+ useStdin: false
57
+ });
58
+ resolveEventsOnce(innerEvents);
59
+ const final = await done;
60
+ return {
61
+ stdout: final.stdout,
62
+ stderr: final.stderr,
63
+ exitCode: final.exitCode,
64
+ threadId: final.threadId,
65
+ sessionId: final.sessionId ?? final.threadId
66
+ };
67
+ }
68
+ if (spawnConfig && spawnConfig.kind === "cli") {
69
+ resolveEventsOnce(emptyEvents);
70
+ return spawnNonStreaming(service, {
71
+ prompt: options.prompt,
72
+ cwd: options.cwd,
73
+ model: options.model,
74
+ args: options.args,
75
+ useStdin: false
76
+ });
77
+ }
78
+ resolveEventsOnce(emptyEvents);
79
+ const container = createSdkContainer({ cwd: options.cwd });
80
+ return spawnCore(container, service, {
81
+ prompt: options.prompt,
82
+ cwd: options.cwd,
83
+ model: options.model,
84
+ args: options.args,
85
+ useStdin: false
86
+ });
87
+ }
88
+ catch (error) {
89
+ resolveEventsOnce(emptyEvents);
90
+ throw error;
91
+ }
92
+ })();
93
+ return { events, result };
40
94
  }
41
95
  //# sourceMappingURL=spawn.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/sdk/spawn.ts"],"names":[],"mappings":"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"}
@@ -21,6 +21,10 @@ export interface SpawnResult {
21
21
  stderr: string;
22
22
  /** Exit code from the CLI process */
23
23
  exitCode: number;
24
+ /** Thread identifier from streaming agents (if available) */
25
+ threadId?: string;
26
+ /** Backward-compatible alias for threadId */
27
+ sessionId?: string;
24
28
  }
25
29
  export interface GenerateOptions {
26
30
  /** Model identifier override */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "poe-code",
3
- "version": "3.0.13-beta.1",
3
+ "version": "3.0.13",
4
4
  "description": "CLI tool to configure Poe API for developer workflows.",
5
5
  "type": "module",
6
6
  "workspaces": [
@@ -57,6 +57,7 @@
57
57
  },
58
58
  "packageManager": "npm@10.9.2",
59
59
  "dependencies": {
60
+ "@poe-code/agent-spawn": "*",
60
61
  "@poe-code/config-mutations": "*",
61
62
  "@poe-code/design-system": "*",
62
63
  "@poe-code/tiny-mcp-server": "*",