poe-code 3.0.203 → 3.0.204
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/braintrust.d.ts +3 -0
- package/dist/cli/commands/braintrust.js +77 -0
- package/dist/cli/commands/braintrust.js.map +1 -0
- package/dist/cli/commands/configure.d.ts +1 -0
- package/dist/cli/commands/configure.js +197 -0
- package/dist/cli/commands/configure.js.map +1 -1
- package/dist/cli/commands/experiment.js +42 -5
- package/dist/cli/commands/experiment.js.map +1 -1
- package/dist/cli/commands/harness.d.ts +3 -0
- package/dist/cli/commands/harness.js +260 -0
- package/dist/cli/commands/harness.js.map +1 -0
- package/dist/cli/commands/pipeline.js +58 -24
- package/dist/cli/commands/pipeline.js.map +1 -1
- package/dist/cli/commands/ralph.js +8 -3
- package/dist/cli/commands/ralph.js.map +1 -1
- package/dist/cli/commands/runtime/build.d.ts +7 -0
- package/dist/cli/commands/runtime/build.js +128 -0
- package/dist/cli/commands/runtime/build.js.map +1 -0
- package/dist/cli/commands/runtime/index.d.ts +3 -0
- package/dist/cli/commands/runtime/index.js +14 -0
- package/dist/cli/commands/runtime/index.js.map +1 -0
- package/dist/cli/commands/runtime/init.d.ts +7 -0
- package/dist/cli/commands/runtime/init.js +39 -0
- package/dist/cli/commands/runtime/init.js.map +1 -0
- package/dist/cli/commands/runtime/jobs/attach.d.ts +3 -0
- package/dist/cli/commands/runtime/jobs/attach.js +35 -0
- package/dist/cli/commands/runtime/jobs/attach.js.map +1 -0
- package/dist/cli/commands/runtime/jobs/index.d.ts +3 -0
- package/dist/cli/commands/runtime/jobs/index.js +16 -0
- package/dist/cli/commands/runtime/jobs/index.js.map +1 -0
- package/dist/cli/commands/runtime/jobs/logs.d.ts +3 -0
- package/dist/cli/commands/runtime/jobs/logs.js +27 -0
- package/dist/cli/commands/runtime/jobs/logs.js.map +1 -0
- package/dist/cli/commands/runtime/jobs/ls.d.ts +3 -0
- package/dist/cli/commands/runtime/jobs/ls.js +60 -0
- package/dist/cli/commands/runtime/jobs/ls.js.map +1 -0
- package/dist/cli/commands/runtime/jobs/sandbox.d.ts +3 -0
- package/dist/cli/commands/runtime/jobs/sandbox.js +15 -0
- package/dist/cli/commands/runtime/jobs/sandbox.js.map +1 -0
- package/dist/cli/commands/runtime/jobs/shared.d.ts +22 -0
- package/dist/cli/commands/runtime/jobs/shared.js +124 -0
- package/dist/cli/commands/runtime/jobs/shared.js.map +1 -0
- package/dist/cli/commands/runtime/jobs/stop.d.ts +3 -0
- package/dist/cli/commands/runtime/jobs/stop.js +31 -0
- package/dist/cli/commands/runtime/jobs/stop.js.map +1 -0
- package/dist/cli/commands/runtime/jobs/sync.d.ts +3 -0
- package/dist/cli/commands/runtime/jobs/sync.js +25 -0
- package/dist/cli/commands/runtime/jobs/sync.js.map +1 -0
- package/dist/cli/commands/runtime/shared.d.ts +20 -0
- package/dist/cli/commands/runtime/shared.js +69 -0
- package/dist/cli/commands/runtime/shared.js.map +1 -0
- package/dist/cli/commands/runtime/templates/clear.d.ts +3 -0
- package/dist/cli/commands/runtime/templates/clear.js +53 -0
- package/dist/cli/commands/runtime/templates/clear.js.map +1 -0
- package/dist/cli/commands/runtime/templates/index.d.ts +3 -0
- package/dist/cli/commands/runtime/templates/index.js +10 -0
- package/dist/cli/commands/runtime/templates/index.js.map +1 -0
- package/dist/cli/commands/runtime/templates/ls.d.ts +3 -0
- package/dist/cli/commands/runtime/templates/ls.js +52 -0
- package/dist/cli/commands/runtime/templates/ls.js.map +1 -0
- package/dist/cli/commands/runtime-options.d.ts +1 -0
- package/dist/cli/commands/runtime-options.js +5 -2
- package/dist/cli/commands/runtime-options.js.map +1 -1
- package/dist/cli/commands/spawn.js +27 -4
- package/dist/cli/commands/spawn.js.map +1 -1
- package/dist/cli/program.js +17 -1
- package/dist/cli/program.js.map +1 -1
- package/dist/index.js +24192 -2429
- package/dist/index.js.map +4 -4
- package/dist/providers/claude-code.js +1692 -93
- package/dist/providers/claude-code.js.map +4 -4
- package/dist/providers/codex.js +1692 -93
- package/dist/providers/codex.js.map +4 -4
- package/dist/providers/goose.js +1687 -88
- package/dist/providers/goose.js.map +4 -4
- package/dist/providers/kimi.js +1692 -93
- package/dist/providers/kimi.js.map +4 -4
- package/dist/providers/opencode.js +1692 -93
- package/dist/providers/opencode.js.map +4 -4
- package/dist/providers/poe-agent.js +1580 -308
- package/dist/providers/poe-agent.js.map +4 -4
- package/dist/providers/spawn-options.d.ts +4 -1
- package/dist/sdk/experiment.js +1 -0
- package/dist/sdk/experiment.js.map +1 -1
- package/dist/sdk/ralph.js +108 -16
- package/dist/sdk/ralph.js.map +1 -1
- package/dist/sdk/spawn.js +11 -4
- package/dist/sdk/spawn.js.map +1 -1
- package/dist/sdk/types.d.ts +12 -1
- package/dist/utils/command-checks.js +2 -29
- package/dist/utils/command-checks.js.map +1 -1
- package/package.json +12 -7
- package/packages/design-system/dist/components/help-formatter-plain.d.ts +4 -0
- package/packages/design-system/dist/components/help-formatter-plain.js +132 -0
- package/packages/design-system/dist/components/help-formatter.d.ts +13 -0
- package/packages/design-system/dist/components/help-formatter.js +116 -7
- package/packages/design-system/dist/components/index.d.ts +2 -2
- package/packages/design-system/dist/components/index.js +1 -1
- package/packages/design-system/dist/components/text.d.ts +1 -0
- package/packages/design-system/dist/components/text.js +8 -0
- package/packages/design-system/dist/index.d.ts +3 -2
- package/packages/design-system/dist/index.js +2 -1
- package/packages/memory/dist/index.js +1201 -115
- package/packages/memory/dist/index.js.map +4 -4
- package/packages/superintendent/dist/commands/run.d.ts +10 -0
- package/packages/superintendent/dist/commands/run.js +96 -49
- package/packages/superintendent/dist/commands/superintendent-group.d.ts +6 -0
- package/packages/superintendent/dist/runtime/agent-runner.d.ts +1 -0
- package/packages/superintendent/dist/runtime/agent-runner.js +4 -2
- package/packages/superintendent/dist/runtime/loop.d.ts +1 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import parseDuration from "parse-duration";
|
|
2
|
+
import { createStateManager } from "@poe-code/poe-code-config";
|
|
3
|
+
import { selectExecutionEnvFactory } from "@poe-code/agent-harness-tools";
|
|
4
|
+
export function createRuntimeState(container) {
|
|
5
|
+
return createStateManager(container.env.homeDir, container.fs);
|
|
6
|
+
}
|
|
7
|
+
export async function resolveJob(state, jobId, intent) {
|
|
8
|
+
if (jobId !== undefined) {
|
|
9
|
+
const entry = await state.jobs.get(jobId);
|
|
10
|
+
if (entry === null) {
|
|
11
|
+
throw new Error(`No runtime job found for "${jobId}".`);
|
|
12
|
+
}
|
|
13
|
+
return entry;
|
|
14
|
+
}
|
|
15
|
+
const allowedStatuses = intent === "running" ? new Set(["running"]) : new Set(["running", "exited"]);
|
|
16
|
+
const candidates = (await state.jobs.list())
|
|
17
|
+
.filter((entry) => allowedStatuses.has(entry.status))
|
|
18
|
+
.sort(compareLatestFirst);
|
|
19
|
+
if (candidates.length === 1) {
|
|
20
|
+
return candidates[0];
|
|
21
|
+
}
|
|
22
|
+
if (candidates.length === 0) {
|
|
23
|
+
throw new Error("No detached runtime jobs match this command.");
|
|
24
|
+
}
|
|
25
|
+
throw new Error([
|
|
26
|
+
"More than one detached runtime job matches this command. Pass a job id.",
|
|
27
|
+
...candidates.map((entry) => `- ${entry.id} ${entry.tool} ${entry.status} ${entry.started_at}`)
|
|
28
|
+
].join("\n"));
|
|
29
|
+
}
|
|
30
|
+
export async function attachJob(entry) {
|
|
31
|
+
const factory = selectExecutionEnvFactory(entry.env_kind);
|
|
32
|
+
const env = await factory.attach(entry.env_id, {
|
|
33
|
+
jobId: entry.id,
|
|
34
|
+
tool: entry.tool,
|
|
35
|
+
argv: entry.argv,
|
|
36
|
+
cwd: entry.cwd
|
|
37
|
+
});
|
|
38
|
+
const handle = env.job;
|
|
39
|
+
if (handle === null) {
|
|
40
|
+
throw new Error(`Runtime "${entry.env_kind}" did not provide a handle for job "${entry.id}".`);
|
|
41
|
+
}
|
|
42
|
+
return { env, handle };
|
|
43
|
+
}
|
|
44
|
+
export function parseSince(value) {
|
|
45
|
+
if (value === undefined) {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
const milliseconds = parseDuration(value);
|
|
49
|
+
if (milliseconds === null || !Number.isFinite(milliseconds) || milliseconds < 0) {
|
|
50
|
+
throw new Error(`Invalid duration "${value}".`);
|
|
51
|
+
}
|
|
52
|
+
return new Date(Date.now() - milliseconds);
|
|
53
|
+
}
|
|
54
|
+
export async function syncJob(entry, opts) {
|
|
55
|
+
const { env } = await attachJob(entry);
|
|
56
|
+
try {
|
|
57
|
+
await env.downloadWorkspace({
|
|
58
|
+
conflictPolicy: opts.forceSync ? "overwrite" : "refuse"
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
if (opts.close) {
|
|
63
|
+
await env.close();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export async function streamJobLog(handle, opts) {
|
|
68
|
+
let detaching = false;
|
|
69
|
+
const iterator = handle.stream({ sinceByte: 0, ...(opts.since ? { since: opts.since } : {}) })[Symbol.asyncIterator]();
|
|
70
|
+
const onSigint = opts.onDetach
|
|
71
|
+
? () => {
|
|
72
|
+
detaching = true;
|
|
73
|
+
opts.onDetach?.();
|
|
74
|
+
void iterator.return?.();
|
|
75
|
+
}
|
|
76
|
+
: undefined;
|
|
77
|
+
if (onSigint) {
|
|
78
|
+
process.once("SIGINT", onSigint);
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
while (!detaching) {
|
|
82
|
+
const result = await Promise.race([
|
|
83
|
+
iterator.next(),
|
|
84
|
+
sleep(250).then(() => ({ timedOut: true }))
|
|
85
|
+
]);
|
|
86
|
+
if ("timedOut" in result) {
|
|
87
|
+
if (!opts.follow) {
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
if ((await handle.status()) !== "running") {
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (result.done === true) {
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
opts.write(result.value.data);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
if (onSigint) {
|
|
103
|
+
process.off("SIGINT", onSigint);
|
|
104
|
+
}
|
|
105
|
+
await iterator.return?.();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
export async function waitForGracefulStop(handle, graceMs = 30_000) {
|
|
109
|
+
await handle.kill("SIGTERM");
|
|
110
|
+
const result = await Promise.race([handle.wait().then(() => "exited"), sleep(graceMs)]);
|
|
111
|
+
if (result !== "exited") {
|
|
112
|
+
await handle.kill("SIGKILL");
|
|
113
|
+
await handle.wait().catch(() => undefined);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function compareLatestFirst(left, right) {
|
|
117
|
+
return Date.parse(right.started_at) - Date.parse(left.started_at);
|
|
118
|
+
}
|
|
119
|
+
function sleep(ms) {
|
|
120
|
+
return new Promise((resolve) => {
|
|
121
|
+
setTimeout(() => resolve("timeout"), ms);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../../src/cli/commands/runtime/jobs/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { createExecutionResources, resolveCommandFlags } from "../../shared.js";
|
|
2
|
+
import { attachJob, createRuntimeState, resolveJob, syncJob, waitForGracefulStop } from "./shared.js";
|
|
3
|
+
export function registerRuntimeJobsStopCommand(jobs, root, container) {
|
|
4
|
+
jobs
|
|
5
|
+
.command("stop")
|
|
6
|
+
.description("Stop a detached runtime job.")
|
|
7
|
+
.argument("[jobId]", "Detached job id")
|
|
8
|
+
.option("--sync", "Download the workspace after stopping")
|
|
9
|
+
.option("--force-sync", "Overwrite local files when syncing")
|
|
10
|
+
.action(async (jobId, options) => {
|
|
11
|
+
await executeRuntimeJobsStop(root, container, jobId, options);
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
async function executeRuntimeJobsStop(root, container, jobId, options) {
|
|
15
|
+
const flags = resolveCommandFlags(root);
|
|
16
|
+
const resources = createExecutionResources(container, flags, "runtime:jobs:stop");
|
|
17
|
+
const state = createRuntimeState(container);
|
|
18
|
+
const entry = await resolveJob(state, jobId, "pullable");
|
|
19
|
+
const { handle } = await attachJob(entry);
|
|
20
|
+
await waitForGracefulStop(handle);
|
|
21
|
+
await state.jobs.update(entry.id, {
|
|
22
|
+
status: "killed",
|
|
23
|
+
exit_code: 130,
|
|
24
|
+
exited_at: new Date().toISOString()
|
|
25
|
+
});
|
|
26
|
+
if (options.sync === true || options.forceSync === true) {
|
|
27
|
+
await syncJob(entry, { forceSync: options.forceSync === true, close: false });
|
|
28
|
+
}
|
|
29
|
+
resources.logger.success(`Stopped runtime job ${entry.id}.`);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=stop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../../../src/cli/commands/runtime/jobs/stop.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,UAAU,EACV,OAAO,EACP,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAErB,MAAM,UAAU,8BAA8B,CAC5C,IAAa,EACb,IAAa,EACb,SAAuB;IAEvB,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,8BAA8B,CAAC;SAC3C,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;SACtC,MAAM,CAAC,QAAQ,EAAE,uCAAuC,CAAC;SACzD,MAAM,CAAC,cAAc,EAAE,oCAAoC,CAAC;SAC5D,MAAM,CACL,KAAK,EACH,KAAyB,EACzB,OAAgD,EAChD,EAAE;QACF,MAAM,sBAAsB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC,CACF,CAAC;AACN,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,IAAa,EACb,SAAuB,EACvB,KAAyB,EACzB,OAAgD;IAEhD,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,wBAAwB,CAAC,SAAS,EAAE,KAAK,EAAE,mBAAmB,CAAC,CAAC;IAClF,MAAM,KAAK,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IACzD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;IAE1C,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE;QAChC,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QACxD,MAAM,OAAO,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,KAAK,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,uBAAuB,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { createExecutionResources, resolveCommandFlags } from "../../shared.js";
|
|
2
|
+
import { createRuntimeState, resolveJob, syncJob } from "./shared.js";
|
|
3
|
+
export function registerRuntimeJobsSyncCommand(jobs, root, container) {
|
|
4
|
+
jobs
|
|
5
|
+
.command("sync")
|
|
6
|
+
.description("Download a detached runtime job workspace.")
|
|
7
|
+
.argument("[jobId]", "Detached job id")
|
|
8
|
+
.option("--force-sync", "Overwrite local files when syncing")
|
|
9
|
+
.option("--close", "Close the sandbox after syncing")
|
|
10
|
+
.action(async (jobId, options) => {
|
|
11
|
+
await executeRuntimeJobsSync(root, container, jobId, options);
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
async function executeRuntimeJobsSync(root, container, jobId, options) {
|
|
15
|
+
const flags = resolveCommandFlags(root);
|
|
16
|
+
const resources = createExecutionResources(container, flags, "runtime:jobs:sync");
|
|
17
|
+
const state = createRuntimeState(container);
|
|
18
|
+
const entry = await resolveJob(state, jobId, "pullable");
|
|
19
|
+
await syncJob(entry, {
|
|
20
|
+
forceSync: options.forceSync === true,
|
|
21
|
+
close: options.close === true
|
|
22
|
+
});
|
|
23
|
+
resources.logger.success(`Synced runtime job ${entry.id}.`);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../../../src/cli/commands/runtime/jobs/sync.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtE,MAAM,UAAU,8BAA8B,CAC5C,IAAa,EACb,IAAa,EACb,SAAuB;IAEvB,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,4CAA4C,CAAC;SACzD,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;SACtC,MAAM,CAAC,cAAc,EAAE,oCAAoC,CAAC;SAC5D,MAAM,CAAC,SAAS,EAAE,iCAAiC,CAAC;SACpD,MAAM,CACL,KAAK,EACH,KAAyB,EACzB,OAAiD,EACjD,EAAE;QACF,MAAM,sBAAsB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC,CACF,CAAC;AACN,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,IAAa,EACb,SAAuB,EACvB,KAAyB,EACzB,OAAiD;IAEjD,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,wBAAwB,CAAC,SAAS,EAAE,KAAK,EAAE,mBAAmB,CAAC,CAAC;IAClF,MAAM,KAAK,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAEzD,MAAM,OAAO,CAAC,KAAK,EAAE;QACnB,SAAS,EAAE,OAAO,CAAC,SAAS,KAAK,IAAI;QACrC,KAAK,EAAE,OAAO,CAAC,KAAK,KAAK,IAAI;KAC9B,CAAC,CAAC;IACH,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,sBAAsB,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { CliContainer } from "../../container.js";
|
|
2
|
+
export declare const runtimeTypes: readonly ["host", "docker", "e2b"];
|
|
3
|
+
export type RuntimeType = (typeof runtimeTypes)[number];
|
|
4
|
+
export declare const defaultRuntimeType: RuntimeType;
|
|
5
|
+
export declare const defaultDockerfile: string;
|
|
6
|
+
export declare function resolveDockerfilePath(container: CliContainer): string;
|
|
7
|
+
export declare function resolveRuntimeType(input: {
|
|
8
|
+
value?: string;
|
|
9
|
+
assumeYes: boolean;
|
|
10
|
+
}): Promise<RuntimeType>;
|
|
11
|
+
export declare function updateRuntimeScope(input: {
|
|
12
|
+
container: CliContainer;
|
|
13
|
+
type: RuntimeType;
|
|
14
|
+
}): Promise<void>;
|
|
15
|
+
export declare function writeDefaultDockerfileIfNeeded(input: {
|
|
16
|
+
container: CliContainer;
|
|
17
|
+
enabled: boolean;
|
|
18
|
+
}): Promise<boolean>;
|
|
19
|
+
export declare function parseRuntimeType(value: string): RuntimeType;
|
|
20
|
+
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { deepMergeDocuments, readDocument, writeScope } from "@poe-code/poe-code-config";
|
|
3
|
+
import { pathExists } from "@poe-code/config-mutations";
|
|
4
|
+
import { cancel as dsCancel, isCancel, select as dsSelect } from "@poe-code/design-system";
|
|
5
|
+
import { OperationCancelledError } from "../../errors.js";
|
|
6
|
+
export const runtimeTypes = ["host", "docker", "e2b"];
|
|
7
|
+
export const defaultRuntimeType = "docker";
|
|
8
|
+
export const defaultDockerfile = [
|
|
9
|
+
"FROM node:22-bookworm-slim",
|
|
10
|
+
"",
|
|
11
|
+
"RUN apt-get update \\",
|
|
12
|
+
" && apt-get install -y --no-install-recommends git ca-certificates \\",
|
|
13
|
+
" && rm -rf /var/lib/apt/lists/*",
|
|
14
|
+
"",
|
|
15
|
+
"RUN npm i -g poe-code",
|
|
16
|
+
""
|
|
17
|
+
].join("\n");
|
|
18
|
+
export function resolveDockerfilePath(container) {
|
|
19
|
+
return path.join(container.env.cwd, ".poe-code", "Dockerfile");
|
|
20
|
+
}
|
|
21
|
+
export async function resolveRuntimeType(input) {
|
|
22
|
+
if (input.value !== undefined) {
|
|
23
|
+
return parseRuntimeType(input.value);
|
|
24
|
+
}
|
|
25
|
+
if (input.assumeYes) {
|
|
26
|
+
return defaultRuntimeType;
|
|
27
|
+
}
|
|
28
|
+
const result = await dsSelect({
|
|
29
|
+
message: "Runtime backend",
|
|
30
|
+
initialValue: defaultRuntimeType,
|
|
31
|
+
options: [
|
|
32
|
+
{ value: "docker", label: "Docker", hint: "Build from .poe-code/Dockerfile" },
|
|
33
|
+
{ value: "host", label: "Host", hint: "Run commands on this machine" },
|
|
34
|
+
{ value: "e2b", label: "E2B", hint: "Use a cloud sandbox template" }
|
|
35
|
+
]
|
|
36
|
+
});
|
|
37
|
+
if (isCancel(result)) {
|
|
38
|
+
dsCancel("Operation cancelled.");
|
|
39
|
+
throw new OperationCancelledError();
|
|
40
|
+
}
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
export async function updateRuntimeScope(input) {
|
|
44
|
+
const document = await readDocument(input.container.fs, input.container.env.projectConfigPath);
|
|
45
|
+
const merged = deepMergeDocuments(document, { runtime: { type: input.type } });
|
|
46
|
+
await writeScope(input.container.fs, input.container.env.projectConfigPath, "runtime", merged.runtime ?? {});
|
|
47
|
+
}
|
|
48
|
+
export async function writeDefaultDockerfileIfNeeded(input) {
|
|
49
|
+
if (!input.enabled) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
const dockerfilePath = resolveDockerfilePath(input.container);
|
|
53
|
+
if (await pathExists(input.container.fs, dockerfilePath)) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
await input.container.fs.mkdir(path.dirname(dockerfilePath), { recursive: true });
|
|
57
|
+
await input.container.fs.writeFile(dockerfilePath, defaultDockerfile, { encoding: "utf8" });
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
export function parseRuntimeType(value) {
|
|
61
|
+
if (runtimeTypes.includes(value)) {
|
|
62
|
+
return value;
|
|
63
|
+
}
|
|
64
|
+
throw new Error(`Invalid runtime type "${value}". Expected host, docker, or e2b.`);
|
|
65
|
+
}
|
|
66
|
+
export function isRecord(value) {
|
|
67
|
+
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../src/cli/commands/runtime/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { cancel as dsCancel, confirm as dsConfirm, isCancel } from "@poe-code/design-system";
|
|
2
|
+
import { createStateManager } from "@poe-code/poe-code-config";
|
|
3
|
+
import { OperationCancelledError } from "../../../errors.js";
|
|
4
|
+
import { createExecutionResources, resolveCommandFlags } from "../../shared.js";
|
|
5
|
+
const backends = ["docker", "e2b"];
|
|
6
|
+
export function registerRuntimeTemplatesClearCommand(templates, root, container) {
|
|
7
|
+
templates
|
|
8
|
+
.command("clear")
|
|
9
|
+
.description("Clear locally built runtime template cache entries.")
|
|
10
|
+
.action(async () => {
|
|
11
|
+
await executeRuntimeTemplatesClear(root, container);
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
async function executeRuntimeTemplatesClear(program, container) {
|
|
15
|
+
const flags = resolveCommandFlags(program);
|
|
16
|
+
const resources = createExecutionResources(container, flags, "runtime:templates:clear");
|
|
17
|
+
const state = createStateManager(container.env.homeDir, container.fs);
|
|
18
|
+
const entriesByBackend = await Promise.all(backends.map(async (backend) => ({
|
|
19
|
+
backend,
|
|
20
|
+
entries: await state.templates.list(backend)
|
|
21
|
+
})));
|
|
22
|
+
const total = entriesByBackend.reduce((sum, group) => sum + group.entries.length, 0);
|
|
23
|
+
resources.logger.intro("runtime templates clear");
|
|
24
|
+
if (total === 0) {
|
|
25
|
+
resources.logger.info("No local runtime template cache entries to clear.");
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (!flags.assumeYes) {
|
|
29
|
+
const confirmed = await dsConfirm({
|
|
30
|
+
message: `Clear ${total} local runtime template cache ${total === 1 ? "entry" : "entries"}?`,
|
|
31
|
+
initialValue: false
|
|
32
|
+
});
|
|
33
|
+
if (isCancel(confirmed)) {
|
|
34
|
+
dsCancel("Operation cancelled.");
|
|
35
|
+
throw new OperationCancelledError();
|
|
36
|
+
}
|
|
37
|
+
if (confirmed !== true) {
|
|
38
|
+
resources.logger.info("Runtime template cache unchanged.");
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (flags.dryRun) {
|
|
43
|
+
resources.logger.dryRun(`Dry run: would clear ${total} local runtime template cache ${total === 1 ? "entry" : "entries"}.`);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
for (const group of entriesByBackend) {
|
|
47
|
+
for (const entry of group.entries) {
|
|
48
|
+
await state.templates.remove(group.backend, entry.hash);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
resources.logger.success(`Cleared ${total} local runtime template cache ${total === 1 ? "entry" : "entries"}.`);
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=clear.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clear.js","sourceRoot":"","sources":["../../../../../src/cli/commands/runtime/templates/clear.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { registerRuntimeTemplatesClearCommand } from "./clear.js";
|
|
2
|
+
import { registerRuntimeTemplatesLsCommand } from "./ls.js";
|
|
3
|
+
export function registerRuntimeTemplatesCommand(runtime, root, container) {
|
|
4
|
+
const templates = runtime
|
|
5
|
+
.command("templates")
|
|
6
|
+
.description("Inspect and clear locally built runtime templates.");
|
|
7
|
+
registerRuntimeTemplatesLsCommand(templates, root, container);
|
|
8
|
+
registerRuntimeTemplatesClearCommand(templates, root, container);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/cli/commands/runtime/templates/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oCAAoC,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,iCAAiC,EAAE,MAAM,SAAS,CAAC;AAE5D,MAAM,UAAU,+BAA+B,CAC7C,OAAgB,EAChB,IAAa,EACb,SAAuB;IAEvB,MAAM,SAAS,GAAG,OAAO;SACtB,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,oDAAoD,CAAC,CAAC;IAErE,iCAAiC,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9D,oCAAoC,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { getTheme, renderTable, text } from "@poe-code/design-system";
|
|
2
|
+
import { createStateManager } from "@poe-code/poe-code-config";
|
|
3
|
+
import { createExecutionResources, resolveCommandFlags } from "../../shared.js";
|
|
4
|
+
const backends = ["docker", "e2b"];
|
|
5
|
+
export function registerRuntimeTemplatesLsCommand(templates, root, container) {
|
|
6
|
+
templates
|
|
7
|
+
.command("ls")
|
|
8
|
+
.description("List cached runtime templates.")
|
|
9
|
+
.action(async () => {
|
|
10
|
+
await executeRuntimeTemplatesLs(root, container);
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
async function executeRuntimeTemplatesLs(program, container) {
|
|
14
|
+
const flags = resolveCommandFlags(program);
|
|
15
|
+
const resources = createExecutionResources(container, flags, "runtime:templates:ls");
|
|
16
|
+
const state = createStateManager(container.env.homeDir, container.fs);
|
|
17
|
+
const theme = getTheme();
|
|
18
|
+
const rows = [];
|
|
19
|
+
for (const backend of backends) {
|
|
20
|
+
const entries = await state.templates.list(backend);
|
|
21
|
+
if (entries.length === 0) {
|
|
22
|
+
rows.push({
|
|
23
|
+
Backend: theme.accent(backend),
|
|
24
|
+
Hash: text.muted("(empty)"),
|
|
25
|
+
Artifact: text.muted("-"),
|
|
26
|
+
Dockerfile: text.muted("-"),
|
|
27
|
+
Built: text.muted("-")
|
|
28
|
+
});
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
rows.push(...entries.map((entry) => formatEntryRow(backend, entry, theme)));
|
|
32
|
+
}
|
|
33
|
+
resources.logger.intro("runtime templates ls");
|
|
34
|
+
resources.logger.info(renderTable({ theme, columns, rows }));
|
|
35
|
+
}
|
|
36
|
+
function formatEntryRow(backend, entry, theme) {
|
|
37
|
+
return {
|
|
38
|
+
Backend: theme.accent(backend),
|
|
39
|
+
Hash: entry.hash,
|
|
40
|
+
Artifact: entry.image ?? entry.template_id ?? text.muted("-"),
|
|
41
|
+
Dockerfile: entry.dockerfile_path,
|
|
42
|
+
Built: entry.built_at
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const columns = [
|
|
46
|
+
{ name: "Backend", title: "Backend", alignment: "left", maxLen: 10 },
|
|
47
|
+
{ name: "Hash", title: "Hash", alignment: "left", maxLen: 16 },
|
|
48
|
+
{ name: "Artifact", title: "Artifact", alignment: "left", maxLen: 32 },
|
|
49
|
+
{ name: "Dockerfile", title: "Dockerfile", alignment: "left", maxLen: 36 },
|
|
50
|
+
{ name: "Built", title: "Built", alignment: "left", maxLen: 24 }
|
|
51
|
+
];
|
|
52
|
+
//# sourceMappingURL=ls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ls.js","sourceRoot":"","sources":["../../../../../src/cli/commands/runtime/templates/ls.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ export type RuntimeCliOptions = {
|
|
|
5
5
|
runtimeTemplate?: string;
|
|
6
6
|
detach?: boolean;
|
|
7
7
|
mountPoeCode?: boolean;
|
|
8
|
+
runnerSync?: "both" | "upload" | "none";
|
|
8
9
|
};
|
|
9
10
|
export declare function addRuntimeOptions<TCommand extends Command>(command: TCommand): TCommand;
|
|
10
11
|
export declare function pickRuntimeOptions(options: RuntimeCliOptions): RuntimeCliOptions;
|
|
@@ -9,7 +9,9 @@ export function addRuntimeOptions(command) {
|
|
|
9
9
|
.option("--runtime-image <ref>", "Override Docker runtime image")
|
|
10
10
|
.option("--runtime-template <id>", "Override E2B runtime template id")
|
|
11
11
|
.option("--detach", "Run as a detached runtime job")
|
|
12
|
-
.option("--mount-poe-code", "Mount the local poe-code checkout into the runtime")
|
|
12
|
+
.option("--mount-poe-code", "Mount the local poe-code checkout into the runtime")
|
|
13
|
+
.addOption(new Option("--runner-sync <mode>", "Override runner workspace sync: both | upload | none")
|
|
14
|
+
.choices(["both", "upload", "none"]));
|
|
13
15
|
}
|
|
14
16
|
export function pickRuntimeOptions(options) {
|
|
15
17
|
return {
|
|
@@ -17,7 +19,8 @@ export function pickRuntimeOptions(options) {
|
|
|
17
19
|
...(options.runtimeImage ? { runtimeImage: options.runtimeImage } : {}),
|
|
18
20
|
...(options.runtimeTemplate ? { runtimeTemplate: options.runtimeTemplate } : {}),
|
|
19
21
|
...(options.detach ? { detach: true } : {}),
|
|
20
|
-
...(options.mountPoeCode ? { mountPoeCode: true } : {})
|
|
22
|
+
...(options.mountPoeCode ? { mountPoeCode: true } : {}),
|
|
23
|
+
...(options.runnerSync ? { runnerSync: options.runnerSync } : {})
|
|
21
24
|
};
|
|
22
25
|
}
|
|
23
26
|
//# sourceMappingURL=runtime-options.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-options.js","sourceRoot":"","sources":["../../../src/cli/commands/runtime-options.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime-options.js","sourceRoot":"","sources":["../../../src/cli/commands/runtime-options.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAWnC,MAAM,UAAU,iBAAiB,CAA2B,OAAiB;IAC3E,OAAO,OAAO;SACX,SAAS,CACR,IAAI,MAAM,CAAC,qBAAqB,EAAE,+CAA+C,CAAC,CAAC,OAAO,CAAC;QACzF,MAAM;QACN,QAAQ;QACR,KAAK;KACN,CAAC,CACH;SACA,MAAM,CAAC,uBAAuB,EAAE,+BAA+B,CAAC;SAChE,MAAM,CAAC,yBAAyB,EAAE,kCAAkC,CAAC;SACrE,MAAM,CAAC,UAAU,EAAE,+BAA+B,CAAC;SACnD,MAAM,CAAC,kBAAkB,EAAE,oDAAoD,CAAC;SAChF,SAAS,CACR,IAAI,MAAM,CAAC,sBAAsB,EAAE,sDAAsD,CAAC;SACvF,OAAO,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CACvC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAA0B;IAC3D,OAAO;QACL,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClE,CAAC;AACJ,CAAC"}
|
|
@@ -4,7 +4,8 @@ import { renderAcpEvent, spawnInteractive, getSpawnConfig, listMcpSupportedAgent
|
|
|
4
4
|
import { resolveAgentId } from "@poe-code/agent-defs";
|
|
5
5
|
import { text, confirm, isCancel, resolveOutputFormat, renderMarkdown } from "@poe-code/design-system";
|
|
6
6
|
import { loadConfiguredServices } from "../../services/config.js";
|
|
7
|
-
import { createExecutionResources, resolveCommandFlags, resolveServiceAdapter, formatServiceList, buildResumeCommand } from "./shared.js";
|
|
7
|
+
import { createExecutionResources, resolveCommandFlags, resolveServiceAdapter, formatServiceList, buildResumeCommand, resolveMergedDocument } from "./shared.js";
|
|
8
|
+
import { loadIntegrations } from "@poe-code/poe-code-config";
|
|
8
9
|
import { resolveConfiguredModel, spawnCore } from "../../sdk/spawn-core.js";
|
|
9
10
|
import { spawn as spawnSdk } from "../../sdk/spawn.js";
|
|
10
11
|
import { spawnAutonomous } from "../../sdk/autonomous.js";
|
|
@@ -39,6 +40,7 @@ export function registerSpawnCommand(program, container, options = {}) {
|
|
|
39
40
|
const flags = resolveCommandFlags(program);
|
|
40
41
|
const commandOptions = this.opts();
|
|
41
42
|
const runtimeOptions = pickRuntimeOptions(commandOptions);
|
|
43
|
+
let integrations = null;
|
|
42
44
|
const shouldEmitUiOutput = resolveOutputFormat() !== "json";
|
|
43
45
|
const rawMcpInput = commandOptions.mcpServers ?? commandOptions.mcpConfig;
|
|
44
46
|
const mcpInput = await resolveMcpSpawnInput(rawMcpInput, container.fs, container.env.cwd);
|
|
@@ -78,6 +80,7 @@ export function registerSpawnCommand(program, container, options = {}) {
|
|
|
78
80
|
});
|
|
79
81
|
const cwdOverride = workspace.cwd;
|
|
80
82
|
try {
|
|
83
|
+
integrations = await loadIntegrations(await resolveMergedDocument(container));
|
|
81
84
|
if (commandOptions.interactive) {
|
|
82
85
|
const adapter = resolveServiceAdapter(container, service);
|
|
83
86
|
const canonicalService = adapter.name;
|
|
@@ -92,6 +95,7 @@ export function registerSpawnCommand(program, container, options = {}) {
|
|
|
92
95
|
args: forwardedArgs,
|
|
93
96
|
model,
|
|
94
97
|
mode: commandOptions.mode,
|
|
98
|
+
runtimeConfigCwd: container.env.cwd,
|
|
95
99
|
...runtimeOptions,
|
|
96
100
|
...(mcpServers ? { mcpServers } : {}),
|
|
97
101
|
cwd: cwdOverride
|
|
@@ -108,6 +112,10 @@ export function registerSpawnCommand(program, container, options = {}) {
|
|
|
108
112
|
cwd: cwdOverride,
|
|
109
113
|
logDir: commandOptions.logDir,
|
|
110
114
|
activityTimeoutMs: commandOptions.activityTimeoutMs,
|
|
115
|
+
...(integrations?.spawnMiddleware
|
|
116
|
+
? { middlewares: [integrations.spawnMiddleware] }
|
|
117
|
+
: {}),
|
|
118
|
+
runtimeConfigCwd: container.env.cwd,
|
|
111
119
|
...runtimeOptions,
|
|
112
120
|
useStdin: shouldReadFromStdin
|
|
113
121
|
};
|
|
@@ -137,6 +145,7 @@ export function registerSpawnCommand(program, container, options = {}) {
|
|
|
137
145
|
model
|
|
138
146
|
};
|
|
139
147
|
const resources = createExecutionResources(container, flags, `spawn:${canonicalService}`);
|
|
148
|
+
let skipFinalize = false;
|
|
140
149
|
if (shouldEmitUiOutput) {
|
|
141
150
|
resources.logger.intro(`spawn ${canonicalService}`);
|
|
142
151
|
}
|
|
@@ -172,7 +181,7 @@ export function registerSpawnCommand(program, container, options = {}) {
|
|
|
172
181
|
if (!proceed) {
|
|
173
182
|
return;
|
|
174
183
|
}
|
|
175
|
-
const final = await spawnAutonomous(spawnSdk, {
|
|
184
|
+
const final = await traceSpawnRun(integrations, canonicalService, () => spawnAutonomous(spawnSdk, {
|
|
176
185
|
service: canonicalService,
|
|
177
186
|
prompt: spawnOptions.prompt,
|
|
178
187
|
args: spawnOptions.args,
|
|
@@ -184,9 +193,16 @@ export function registerSpawnCommand(program, container, options = {}) {
|
|
|
184
193
|
...(spawnOptions.activityTimeoutMs !== undefined
|
|
185
194
|
? { activityTimeoutMs: spawnOptions.activityTimeoutMs }
|
|
186
195
|
: {}),
|
|
196
|
+
...(spawnOptions.middlewares ? { middlewares: spawnOptions.middlewares } : {}),
|
|
197
|
+
runtimeConfigCwd: container.env.cwd,
|
|
187
198
|
...runtimeOptions
|
|
188
|
-
});
|
|
199
|
+
}));
|
|
189
200
|
process.exitCode = final.exitCode;
|
|
201
|
+
if (shouldEmitUiOutput && final.detached) {
|
|
202
|
+
resources.logger.info(formatDetachedJob(final.detached));
|
|
203
|
+
skipFinalize = true;
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
190
206
|
if (!shouldEmitUiOutput) {
|
|
191
207
|
renderAcpEvent({
|
|
192
208
|
event: "spawn_result",
|
|
@@ -224,16 +240,23 @@ export function registerSpawnCommand(program, container, options = {}) {
|
|
|
224
240
|
}
|
|
225
241
|
}
|
|
226
242
|
finally {
|
|
227
|
-
if (shouldEmitUiOutput) {
|
|
243
|
+
if (shouldEmitUiOutput && !skipFinalize) {
|
|
228
244
|
resources.context.finalize();
|
|
229
245
|
}
|
|
230
246
|
}
|
|
231
247
|
}
|
|
232
248
|
finally {
|
|
249
|
+
await integrations?.shutdown();
|
|
233
250
|
await workspace.cleanup?.();
|
|
234
251
|
}
|
|
235
252
|
});
|
|
236
253
|
}
|
|
254
|
+
async function traceSpawnRun(integrations, name, run) {
|
|
255
|
+
return integrations?.traceRun("spawn", name, run) ?? run();
|
|
256
|
+
}
|
|
257
|
+
function formatDetachedJob(detached) {
|
|
258
|
+
return `job started: ${detached.jobId}\nsandbox: ${detached.envId}\ndetached.`;
|
|
259
|
+
}
|
|
237
260
|
function listSpawnServiceNames(services, extraServices) {
|
|
238
261
|
const names = [];
|
|
239
262
|
const add = (value) => {
|