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.
- package/dist/cli/commands/spawn.js +114 -35
- package/dist/cli/commands/spawn.js.map +1 -1
- package/dist/sdk/spawn.d.ts +20 -12
- package/dist/sdk/spawn.js +90 -36
- package/dist/sdk/spawn.js.map +1 -1
- package/dist/sdk/types.d.ts +4 -0
- package/package.json +2 -1
|
@@ -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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
|
|
84
|
-
|
|
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
|
-
|
|
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
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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
|
-
|
|
115
|
-
|
|
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":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EAGlB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../../src/cli/commands/spawn.ts"],"names":[],"mappings":"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"}
|
package/dist/sdk/spawn.d.ts
CHANGED
|
@@ -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
|
-
*
|
|
4
|
+
* Spawns an agent with optional streaming.
|
|
4
5
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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 =
|
|
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
|
-
*
|
|
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,
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const
|
|
30
|
-
|
|
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
|
package/dist/sdk/spawn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/sdk/spawn.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/sdk/spawn.ts"],"names":[],"mappings":"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"}
|
package/dist/sdk/types.d.ts
CHANGED
|
@@ -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
|
|
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": "*",
|