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.
Files changed (110) hide show
  1. package/dist/cli/commands/braintrust.d.ts +3 -0
  2. package/dist/cli/commands/braintrust.js +77 -0
  3. package/dist/cli/commands/braintrust.js.map +1 -0
  4. package/dist/cli/commands/configure.d.ts +1 -0
  5. package/dist/cli/commands/configure.js +197 -0
  6. package/dist/cli/commands/configure.js.map +1 -1
  7. package/dist/cli/commands/experiment.js +42 -5
  8. package/dist/cli/commands/experiment.js.map +1 -1
  9. package/dist/cli/commands/harness.d.ts +3 -0
  10. package/dist/cli/commands/harness.js +260 -0
  11. package/dist/cli/commands/harness.js.map +1 -0
  12. package/dist/cli/commands/pipeline.js +58 -24
  13. package/dist/cli/commands/pipeline.js.map +1 -1
  14. package/dist/cli/commands/ralph.js +8 -3
  15. package/dist/cli/commands/ralph.js.map +1 -1
  16. package/dist/cli/commands/runtime/build.d.ts +7 -0
  17. package/dist/cli/commands/runtime/build.js +128 -0
  18. package/dist/cli/commands/runtime/build.js.map +1 -0
  19. package/dist/cli/commands/runtime/index.d.ts +3 -0
  20. package/dist/cli/commands/runtime/index.js +14 -0
  21. package/dist/cli/commands/runtime/index.js.map +1 -0
  22. package/dist/cli/commands/runtime/init.d.ts +7 -0
  23. package/dist/cli/commands/runtime/init.js +39 -0
  24. package/dist/cli/commands/runtime/init.js.map +1 -0
  25. package/dist/cli/commands/runtime/jobs/attach.d.ts +3 -0
  26. package/dist/cli/commands/runtime/jobs/attach.js +35 -0
  27. package/dist/cli/commands/runtime/jobs/attach.js.map +1 -0
  28. package/dist/cli/commands/runtime/jobs/index.d.ts +3 -0
  29. package/dist/cli/commands/runtime/jobs/index.js +16 -0
  30. package/dist/cli/commands/runtime/jobs/index.js.map +1 -0
  31. package/dist/cli/commands/runtime/jobs/logs.d.ts +3 -0
  32. package/dist/cli/commands/runtime/jobs/logs.js +27 -0
  33. package/dist/cli/commands/runtime/jobs/logs.js.map +1 -0
  34. package/dist/cli/commands/runtime/jobs/ls.d.ts +3 -0
  35. package/dist/cli/commands/runtime/jobs/ls.js +60 -0
  36. package/dist/cli/commands/runtime/jobs/ls.js.map +1 -0
  37. package/dist/cli/commands/runtime/jobs/sandbox.d.ts +3 -0
  38. package/dist/cli/commands/runtime/jobs/sandbox.js +15 -0
  39. package/dist/cli/commands/runtime/jobs/sandbox.js.map +1 -0
  40. package/dist/cli/commands/runtime/jobs/shared.d.ts +22 -0
  41. package/dist/cli/commands/runtime/jobs/shared.js +124 -0
  42. package/dist/cli/commands/runtime/jobs/shared.js.map +1 -0
  43. package/dist/cli/commands/runtime/jobs/stop.d.ts +3 -0
  44. package/dist/cli/commands/runtime/jobs/stop.js +31 -0
  45. package/dist/cli/commands/runtime/jobs/stop.js.map +1 -0
  46. package/dist/cli/commands/runtime/jobs/sync.d.ts +3 -0
  47. package/dist/cli/commands/runtime/jobs/sync.js +25 -0
  48. package/dist/cli/commands/runtime/jobs/sync.js.map +1 -0
  49. package/dist/cli/commands/runtime/shared.d.ts +20 -0
  50. package/dist/cli/commands/runtime/shared.js +69 -0
  51. package/dist/cli/commands/runtime/shared.js.map +1 -0
  52. package/dist/cli/commands/runtime/templates/clear.d.ts +3 -0
  53. package/dist/cli/commands/runtime/templates/clear.js +53 -0
  54. package/dist/cli/commands/runtime/templates/clear.js.map +1 -0
  55. package/dist/cli/commands/runtime/templates/index.d.ts +3 -0
  56. package/dist/cli/commands/runtime/templates/index.js +10 -0
  57. package/dist/cli/commands/runtime/templates/index.js.map +1 -0
  58. package/dist/cli/commands/runtime/templates/ls.d.ts +3 -0
  59. package/dist/cli/commands/runtime/templates/ls.js +52 -0
  60. package/dist/cli/commands/runtime/templates/ls.js.map +1 -0
  61. package/dist/cli/commands/runtime-options.d.ts +1 -0
  62. package/dist/cli/commands/runtime-options.js +5 -2
  63. package/dist/cli/commands/runtime-options.js.map +1 -1
  64. package/dist/cli/commands/spawn.js +27 -4
  65. package/dist/cli/commands/spawn.js.map +1 -1
  66. package/dist/cli/program.js +17 -1
  67. package/dist/cli/program.js.map +1 -1
  68. package/dist/index.js +24192 -2429
  69. package/dist/index.js.map +4 -4
  70. package/dist/providers/claude-code.js +1692 -93
  71. package/dist/providers/claude-code.js.map +4 -4
  72. package/dist/providers/codex.js +1692 -93
  73. package/dist/providers/codex.js.map +4 -4
  74. package/dist/providers/goose.js +1687 -88
  75. package/dist/providers/goose.js.map +4 -4
  76. package/dist/providers/kimi.js +1692 -93
  77. package/dist/providers/kimi.js.map +4 -4
  78. package/dist/providers/opencode.js +1692 -93
  79. package/dist/providers/opencode.js.map +4 -4
  80. package/dist/providers/poe-agent.js +1580 -308
  81. package/dist/providers/poe-agent.js.map +4 -4
  82. package/dist/providers/spawn-options.d.ts +4 -1
  83. package/dist/sdk/experiment.js +1 -0
  84. package/dist/sdk/experiment.js.map +1 -1
  85. package/dist/sdk/ralph.js +108 -16
  86. package/dist/sdk/ralph.js.map +1 -1
  87. package/dist/sdk/spawn.js +11 -4
  88. package/dist/sdk/spawn.js.map +1 -1
  89. package/dist/sdk/types.d.ts +12 -1
  90. package/dist/utils/command-checks.js +2 -29
  91. package/dist/utils/command-checks.js.map +1 -1
  92. package/package.json +12 -7
  93. package/packages/design-system/dist/components/help-formatter-plain.d.ts +4 -0
  94. package/packages/design-system/dist/components/help-formatter-plain.js +132 -0
  95. package/packages/design-system/dist/components/help-formatter.d.ts +13 -0
  96. package/packages/design-system/dist/components/help-formatter.js +116 -7
  97. package/packages/design-system/dist/components/index.d.ts +2 -2
  98. package/packages/design-system/dist/components/index.js +1 -1
  99. package/packages/design-system/dist/components/text.d.ts +1 -0
  100. package/packages/design-system/dist/components/text.js +8 -0
  101. package/packages/design-system/dist/index.d.ts +3 -2
  102. package/packages/design-system/dist/index.js +2 -1
  103. package/packages/memory/dist/index.js +1201 -115
  104. package/packages/memory/dist/index.js.map +4 -4
  105. package/packages/superintendent/dist/commands/run.d.ts +10 -0
  106. package/packages/superintendent/dist/commands/run.js +96 -49
  107. package/packages/superintendent/dist/commands/superintendent-group.d.ts +6 -0
  108. package/packages/superintendent/dist/runtime/agent-runner.d.ts +1 -0
  109. package/packages/superintendent/dist/runtime/agent-runner.js +4 -2
  110. 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,3 @@
1
+ import type { Command } from "commander";
2
+ import type { CliContainer } from "../../../container.js";
3
+ export declare function registerRuntimeJobsStopCommand(jobs: Command, root: Command, container: CliContainer): void;
@@ -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,3 @@
1
+ import type { Command } from "commander";
2
+ import type { CliContainer } from "../../../container.js";
3
+ export declare function registerRuntimeJobsSyncCommand(jobs: Command, root: Command, container: CliContainer): void;
@@ -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,3 @@
1
+ import type { Command } from "commander";
2
+ import type { CliContainer } from "../../../container.js";
3
+ export declare function registerRuntimeTemplatesClearCommand(templates: Command, root: Command, container: CliContainer): void;
@@ -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":"AAAA,OAAO,EAAE,MAAM,IAAI,QAAQ,EAAE,OAAO,IAAI,SAAS,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAwB,MAAM,2BAA2B,CAAC;AAErF,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEhF,MAAM,QAAQ,GAAsB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AAEtD,MAAM,UAAU,oCAAoC,CAClD,SAAkB,EAClB,IAAa,EACb,SAAuB;IAEvB,SAAS;SACN,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,qDAAqD,CAAC;SAClE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,4BAA4B,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,4BAA4B,CACzC,OAAgB,EAChB,SAAuB;IAEvB,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,wBAAwB,CAAC,SAAS,EAAE,KAAK,EAAE,yBAAyB,CAAC,CAAC;IACxF,MAAM,KAAK,GAAG,kBAAkB,CAC9B,SAAS,CAAC,GAAG,CAAC,OAAO,EACrB,SAAS,CAAC,EAAyD,CACpE,CAAC;IACF,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,GAAG,CACxC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QAC/B,OAAO;QACP,OAAO,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;KAC7C,CAAC,CAAC,CACJ,CAAC;IACF,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAErF,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAElD,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QAC3E,OAAO;IACT,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC;YAChC,OAAO,EAAE,SAAS,KAAK,iCAAiC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG;YAC5F,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACxB,QAAQ,CAAC,sBAAsB,CAAC,CAAC;YACjC,MAAM,IAAI,uBAAuB,EAAE,CAAC;QACtC,CAAC;QACD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,SAAS,CAAC,MAAM,CAAC,MAAM,CACrB,wBAAwB,KAAK,iCAAiC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,CACnG,CAAC;QACF,OAAO;IACT,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;QACrC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,SAAS,CAAC,MAAM,CAAC,OAAO,CACtB,WAAW,KAAK,iCAAiC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,CACtF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ import type { CliContainer } from "../../../container.js";
3
+ export declare function registerRuntimeTemplatesCommand(runtime: Command, root: Command, container: CliContainer): void;
@@ -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,3 @@
1
+ import type { Command } from "commander";
2
+ import type { CliContainer } from "../../../container.js";
3
+ export declare function registerRuntimeTemplatesLsCommand(templates: Command, root: Command, container: CliContainer): void;
@@ -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;AAUnC,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,CAAC;AACtF,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;KACxD,CAAC;AACJ,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) => {