@xopcai/xopc 0.0.243 → 0.0.245

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 (202) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{activity-store-CAah-_8h.js → activity-store-BlxqErph.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-DDH4HgP7.js → agent-avatar-dicebear-DRQnogaU.js} +1 -1
  5. package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-BDCfJZhh.js → agent-defaults-settings-panel-CpOxGbMD.js} +1 -1
  6. package/dist/gateway/static/root/assets/{agents-B0ZWgf-U.js → agents-flnXZLaT.js} +1 -1
  7. package/dist/gateway/static/root/assets/{api-B2tKxbcz.js → api-BbXzyQMj.js} +1 -1
  8. package/dist/gateway/static/root/assets/{app-management-settings-panel-Blfwszzn.js → app-management-settings-panel-CZl6n2xi.js} +1 -1
  9. package/dist/gateway/static/root/assets/{appearance-settings-C3V7Na75.js → appearance-settings-Bglp-pn6.js} +1 -1
  10. package/dist/gateway/static/root/assets/{apps-page-BiEks0-F.js → apps-page-CmsWarVB.js} +1 -1
  11. package/dist/gateway/static/root/assets/{archive-plugin-BmSx7wzY.js → archive-plugin-DD2SweEH.js} +1 -1
  12. package/dist/gateway/static/root/assets/{attachment-load-BS-S4LJ9.js → attachment-load-G0HenUmG.js} +1 -1
  13. package/dist/gateway/static/root/assets/{automations-page-C7Y3L30D.js → automations-page-B78bFjH2.js} +1 -1
  14. package/dist/gateway/static/root/assets/{automations-workspace-A3zPkPuo.js → automations-workspace-BMQGmn50.js} +1 -1
  15. package/dist/gateway/static/root/assets/{binary-plugins-BM9B5kcm.js → binary-plugins-BbSQmXqn.js} +1 -1
  16. package/dist/gateway/static/root/assets/{block-editor-BbnpkYP9.js → block-editor-DutTIH81.js} +1 -1
  17. package/dist/gateway/static/root/assets/{browser-settings-page-Dk4FQ7fY.js → browser-settings-page-CALiFKm4.js} +1 -1
  18. package/dist/gateway/static/root/assets/{browser-workflow-inputs-CRnkgZHI.js → browser-workflow-inputs-BAAc151l.js} +1 -1
  19. package/dist/gateway/static/root/assets/{browser-workflows-page-B9qGL-it.js → browser-workflows-page-DE5HPrHZ.js} +1 -1
  20. package/dist/gateway/static/root/assets/{capabilities-settings-panel--tR_El9e.js → capabilities-settings-panel-Dts7XtP3.js} +1 -1
  21. package/dist/gateway/static/root/assets/{channels-settings-D347vl_J.js → channels-settings-CWEd3wzh.js} +1 -1
  22. package/dist/gateway/static/root/assets/{channels-status-swr-DuY4MGxe.js → channels-status-swr-CCBCtLDg.js} +1 -1
  23. package/dist/gateway/static/root/assets/{chat-terminal-dock-DABPvwBT.js → chat-terminal-dock-Bp1fXQm1.js} +1 -1
  24. package/dist/gateway/static/root/assets/{connectors-page-B-tvJkRJ.js → connectors-page-CQ6wVNLm.js} +1 -1
  25. package/dist/gateway/static/root/assets/{cron-expression-D3bsKbNd.js → cron-expression-B8HA5IRb.js} +1 -1
  26. package/dist/gateway/static/root/assets/{date-picker-BsGM6Yty.js → date-picker-DD8b7oad.js} +1 -1
  27. package/dist/gateway/static/root/assets/{dependency-picker-Dj3g6YXZ.js → dependency-picker-BC9zwIyH.js} +1 -1
  28. package/dist/gateway/static/root/assets/{desktop-pet-C1QT0Sur.js → desktop-pet-DsrsPZTW.js} +1 -1
  29. package/dist/gateway/static/root/assets/{desktop-pet-settings-r6kAOnfY.js → desktop-pet-settings-D7gp_HNA.js} +1 -1
  30. package/dist/gateway/static/root/assets/{extension-debug-page-DOkf7nh9.js → extension-debug-page-BoKbOX7x.js} +1 -1
  31. package/dist/gateway/static/root/assets/{extension-page-Cq2IA4Ho.js → extension-page-BegL4FW8.js} +1 -1
  32. package/dist/gateway/static/root/assets/{extension-settings-page-DQn4qjDZ.js → extension-settings-page-CjPqq57s.js} +1 -1
  33. package/dist/gateway/static/root/assets/{gateway-config-api-DM3poL22.js → gateway-config-api-DaG57o4X.js} +1 -1
  34. package/dist/gateway/static/root/assets/{gateway-config-swr-BC3pgb_P.js → gateway-config-swr-826dipyU.js} +1 -1
  35. package/dist/gateway/static/root/assets/{gateway-settings-DPgH1hnh.js → gateway-settings-DkJGpgm6.js} +1 -1
  36. package/dist/gateway/static/root/assets/{gateway-startup-retry-uMcSfLru.js → gateway-startup-retry-DyvcAIMm.js} +1 -1
  37. package/dist/gateway/static/root/assets/{heartbeat-settings-Bk80-E3b.js → heartbeat-settings-BLZ48kSU.js} +1 -1
  38. package/dist/gateway/static/root/assets/{home-page-DKo5JiMR.js → home-page-Dtw7Ipt1.js} +1 -1
  39. package/dist/gateway/static/root/assets/{image-generation-api-D1qlQA-A.js → image-generation-api-D7cyfks6.js} +1 -1
  40. package/dist/gateway/static/root/assets/{index-B0WJL9N1.js → index-DG5CfYat.js} +10 -10
  41. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BEwvd8ZU.js → keyboard-shortcuts-settings-D2Has7-N.js} +1 -1
  42. package/dist/gateway/static/root/assets/{local-app-workbench-page--eJ5rmNj.js → local-app-workbench-page-BWidWY93.js} +1 -1
  43. package/dist/gateway/static/root/assets/{local-apps-page-CgkY9E-r.js → local-apps-page-Bkekjoxf.js} +1 -1
  44. package/dist/gateway/static/root/assets/{locale-store-CMZljTJx.js → locale-store-CBoCuIMx.js} +1 -1
  45. package/dist/gateway/static/root/assets/{logs-page-Z49Td0J9.js → logs-page-C5zSSgvA.js} +1 -1
  46. package/dist/gateway/static/root/assets/{management-settings-Dv8NSJKt.js → management-settings-B8c62vRS.js} +1 -1
  47. package/dist/gateway/static/root/assets/{markdown-split-Cm0RBB-t.js → markdown-split-3kxTTGO7.js} +1 -1
  48. package/dist/gateway/static/root/assets/{markdown-view-PPCLt7fu.js → markdown-view-BXsHghJd.js} +1 -1
  49. package/dist/gateway/static/root/assets/{media-plugins-Bcr5sU1f.js → media-plugins-BW8J1nCG.js} +1 -1
  50. package/dist/gateway/static/root/assets/messages-BbdwoxVo.js +3 -0
  51. package/dist/gateway/static/root/assets/{mobile-pairing-wizard-kKDiXofY.js → mobile-pairing-wizard-nwQ8iUcd.js} +1 -1
  52. package/dist/gateway/static/root/assets/models-hub-cache-88f4fzYS.js +1 -0
  53. package/dist/gateway/static/root/assets/{notes-page-CgsaRaGi.js → notes-page-DdybD0QM.js} +1 -1
  54. package/dist/gateway/static/root/assets/{notes-workbench-C1DEE09k.js → notes-workbench-IYfpy2Jx.js} +2 -2
  55. package/dist/gateway/static/root/assets/{oauth-api-4VeMbkTJ.js → oauth-api-BjSUDIgq.js} +1 -1
  56. package/dist/gateway/static/root/assets/{product-open-page-BU0HiZtv.js → product-open-page-CAJeUXeU.js} +1 -1
  57. package/dist/gateway/static/root/assets/{project-detail-page-isRapnp5.js → project-detail-page-4wjw-b7h.js} +1 -1
  58. package/dist/gateway/static/root/assets/{projects-page-zvsjg0mi.js → projects-page-CCMj9PeL.js} +1 -1
  59. package/dist/gateway/static/root/assets/{registry-api-CWOtPFrE.js → registry-api-BhGKnvLP.js} +1 -1
  60. package/dist/gateway/static/root/assets/{remote-access-hub-C9TGZ9Hc.js → remote-access-hub-DsBJqWIk.js} +1 -1
  61. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-2zm9edMA.js → runtime-tools-settings-panel-B4IDcqx0.js} +1 -1
  62. package/dist/gateway/static/root/assets/{schema-form-54A5gzkN.js → schema-form-DiGUUjO6.js} +1 -1
  63. package/dist/gateway/static/root/assets/{sessions-page-BP8RyiUn.js → sessions-page-BwGj0t-2.js} +1 -1
  64. package/dist/gateway/static/root/assets/settings-advanced-gate-BJCfUghk.js +1 -0
  65. package/dist/gateway/static/root/assets/{settings-page-DzDhoyxv.js → settings-page-CVQUsAhd.js} +1 -1
  66. package/dist/gateway/static/root/assets/{setup-status-panel-uDicHU1w.js → setup-status-panel-CQACRh1i.js} +1 -1
  67. package/dist/gateway/static/root/assets/{share-preview-page-lOmLCWFS.js → share-preview-page-DTP1dtuS.js} +1 -1
  68. package/dist/gateway/static/root/assets/{shares-settings-T4Yvouvv.js → shares-settings-D_YPh6Rw.js} +1 -1
  69. package/dist/gateway/static/root/assets/skill-reload-api-B43xlJlX.js +1 -0
  70. package/dist/gateway/static/root/assets/{skills-page-CnyNH3To.js → skills-page-Czpn7Y28.js} +1 -1
  71. package/dist/gateway/static/root/assets/{skills-page.utils-CgDtf2qs.js → skills-page.utils-d39rm3hb.js} +1 -1
  72. package/dist/gateway/static/root/assets/{system-settings-panel-C8yWfwtR.js → system-settings-panel-CXXySCSp.js} +1 -1
  73. package/dist/gateway/static/root/assets/{task-detail-page-Tzfjlbf3.js → task-detail-page-DHiOqQMx.js} +1 -1
  74. package/dist/gateway/static/root/assets/{theme-store-uxUwr10D.js → theme-store-hybK3oC9.js} +1 -1
  75. package/dist/gateway/static/root/assets/{tunnel-api-Bvg679no.js → tunnel-api-BiBGK7O2.js} +1 -1
  76. package/dist/gateway/static/root/assets/{use-autosave-D88VGoyG.js → use-autosave-DjpzpeIm.js} +1 -1
  77. package/dist/gateway/static/root/assets/{user-context-page-RijPtyfO.js → user-context-page-1XBRV5gX.js} +1 -1
  78. package/dist/gateway/static/root/assets/{voice-api-key-field-CBHLsMcc.js → voice-api-key-field-CUIPNmOc.js} +1 -1
  79. package/dist/gateway/static/root/assets/{voice-config-api-MqyI6cgq.js → voice-config-api-CBbiF1T3.js} +1 -1
  80. package/dist/gateway/static/root/assets/{work-discovery-overlay-GGe2TQ98.js → work-discovery-overlay-DVNxhb1x.js} +1 -1
  81. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-C0layUE9.js → workflow-run-setup-panel-HxxFQFY7.js} +1 -1
  82. package/dist/gateway/static/root/assets/{workflows-page-DQXIzBAc.js → workflows-page-BCgL7PRm.js} +1 -1
  83. package/dist/gateway/static/root/index.html +11 -11
  84. package/dist/package.js +1 -1
  85. package/dist/packages/gateway-contract/src/turn-outcome.js +3 -1
  86. package/dist/src/agent/agent-instance-gateway.d.ts +3 -1
  87. package/dist/src/agent/agent-manager.d.ts +2 -4
  88. package/dist/src/agent/agent-manager.js +24 -28
  89. package/dist/src/agent/background-review/coordinator.js +1 -1
  90. package/dist/src/agent/background-review/run-background-review.js +1 -1
  91. package/dist/src/agent/child-agent-factory.d.ts +10 -7
  92. package/dist/src/agent/child-agent-factory.js +112 -158
  93. package/dist/src/agent/coding/index.d.ts +1 -1
  94. package/dist/src/agent/coding/index.js +2 -2
  95. package/dist/src/agent/coding/repository-instructions.d.ts +12 -0
  96. package/dist/src/agent/coding/repository-instructions.js +76 -0
  97. package/dist/src/agent/coding/run-verification.d.ts +34 -0
  98. package/dist/src/agent/coding/run-verification.js +134 -0
  99. package/dist/src/agent/coding/verification-command.d.ts +3 -0
  100. package/dist/src/agent/coding/verification-command.js +50 -0
  101. package/dist/src/agent/coding/workspace-revision.d.ts +2 -0
  102. package/dist/src/agent/coding/workspace-revision.js +77 -0
  103. package/dist/src/agent/commands/command-isolation.d.ts +21 -0
  104. package/dist/src/agent/commands/command-isolation.js +71 -0
  105. package/dist/src/agent/commands/command-registry.d.ts +56 -0
  106. package/dist/src/agent/commands/command-registry.js +259 -0
  107. package/dist/src/agent/embedded/index.js +1 -1
  108. package/dist/src/agent/embedded/run-for-session.js +2 -1
  109. package/dist/src/agent/embedded/run-turn.js +88 -25
  110. package/dist/src/agent/embedded/session-tool-result-guard.js +2 -2
  111. package/dist/src/agent/embedded/subscribe-session.d.ts +2 -1
  112. package/dist/src/agent/embedded/subscribe-session.js +2 -1
  113. package/dist/src/agent/embedded/types.d.ts +3 -1
  114. package/dist/src/agent/embedded/xopc-tools-bridge.js +4 -1
  115. package/dist/src/agent/image/index.js +1 -1
  116. package/dist/src/agent/index.js +3 -3
  117. package/dist/src/agent/memory/user-context-coordinator.js +1 -1
  118. package/dist/src/agent/middleware/index.d.ts +0 -5
  119. package/dist/src/agent/middleware/index.js +1 -2
  120. package/dist/src/agent/orchestration/agent-event-handler.d.ts +0 -5
  121. package/dist/src/agent/orchestration/agent-event-handler.js +1 -96
  122. package/dist/src/agent/orchestration/agent-orchestrator.js +1 -1
  123. package/dist/src/agent/orchestration/agent-turn-policy.js +5 -5
  124. package/dist/src/agent/orchestration/index.d.ts +1 -1
  125. package/dist/src/agent/orchestration/index.js +2 -2
  126. package/dist/src/agent/orchestration/loop-guard.d.ts +4 -31
  127. package/dist/src/agent/orchestration/loop-guard.js +14 -99
  128. package/dist/src/agent/prompt/sections/tooling.js +2 -4
  129. package/dist/src/agent/sandbox/types.d.ts +2 -2
  130. package/dist/src/agent/sandbox/types.js +1 -1
  131. package/dist/src/agent/service/direct-turn-helpers.js +1 -1
  132. package/dist/src/agent/service/process-direct-streaming.js +1 -1
  133. package/dist/src/agent/service.d.ts +0 -2
  134. package/dist/src/agent/service.js +6 -23
  135. package/dist/src/agent/tasks/task-judge-service.d.ts +7 -0
  136. package/dist/src/agent/tasks/task-judge-service.js +24 -2
  137. package/dist/src/agent/tools/delegate-tool.d.ts +2 -1
  138. package/dist/src/agent/tools/delegate-tool.js +102 -124
  139. package/dist/src/agent/tools/exec-command.d.ts +8 -1
  140. package/dist/src/agent/tools/exec-command.js +77 -169
  141. package/dist/src/agent/tools/executor.js +9 -2
  142. package/dist/src/agent/tools/factory.js +50 -5
  143. package/dist/src/agent/tools/find.d.ts +10 -13
  144. package/dist/src/agent/tools/find.js +33 -80
  145. package/dist/src/agent/tools/grep.d.ts +14 -18
  146. package/dist/src/agent/tools/grep.js +56 -144
  147. package/dist/src/agent/tools/index.d.ts +0 -1
  148. package/dist/src/agent/tools/index.js +2 -3
  149. package/dist/src/agent/tools/language-diagnostics.d.ts +11 -0
  150. package/dist/src/agent/tools/language-diagnostics.js +62 -0
  151. package/dist/src/agent/tools/managed-job-tool.d.ts +2 -1
  152. package/dist/src/agent/tools/managed-job-tool.js +58 -118
  153. package/dist/src/agent/tools/read.js +24 -7
  154. package/dist/src/agent/tools/repository-search.d.ts +5 -0
  155. package/dist/src/agent/tools/repository-search.js +56 -0
  156. package/dist/src/agent/tools/review-workspace.d.ts +2 -0
  157. package/dist/src/agent/tools/review-workspace.js +103 -0
  158. package/dist/src/agent/tools/write.js +4 -4
  159. package/dist/src/agent/transcript/index.js +2 -2
  160. package/dist/src/agent/transcript/transcript-hygiene.js +2 -2
  161. package/dist/src/agent/workflow/subagent-runner.d.ts +0 -2
  162. package/dist/src/agent/workflow/subagent-runner.js +12 -31
  163. package/dist/src/agent-config/schema.d.ts +42 -0
  164. package/dist/src/agent-config/schema.js +5 -0
  165. package/dist/src/automations/draft/automation-draft-service.js +1 -1
  166. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  167. package/dist/src/config/schema.d.ts +28 -0
  168. package/dist/src/execution-environments/local-worktree-manager.d.ts +3 -1
  169. package/dist/src/execution-environments/local-worktree-manager.js +8 -3
  170. package/dist/src/execution-environments/session-environment-service.js +5 -3
  171. package/dist/src/extensions/update.js +1 -1
  172. package/dist/src/gateway/hono/lib/config-payload.d.ts +7 -0
  173. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  174. package/dist/src/gateway/hono/routes/connectors.js +23 -23
  175. package/dist/src/gateway/hono/routes/sessions.js +1 -1
  176. package/dist/src/gateway/media-access.js +1 -1
  177. package/dist/src/gateway/service/config-coordinator.js +1 -1
  178. package/dist/src/gateway/service/run-gateway-agent.js +4 -1
  179. package/dist/src/gateway/service.js +1 -1
  180. package/dist/src/gateway/session-reset-service.js +1 -1
  181. package/dist/src/gateway/workspace-ripgrep.d.ts +0 -6
  182. package/dist/src/gateway/workspace-ripgrep.js +2 -40
  183. package/dist/src/infra/ripgrep.d.ts +13 -0
  184. package/dist/src/infra/ripgrep.js +46 -0
  185. package/dist/src/infra/update-runner.js +1 -1
  186. package/dist/src/proactive/execution/agent-executor.js +1 -1
  187. package/dist/src/session/store.js +1 -1
  188. package/dist/src/session/turn-outcome-projector.js +26 -6
  189. package/dist/src/tasks/task-run-coordinator.d.ts +2 -2
  190. package/dist/src/tasks/task-run-coordinator.js +14 -12
  191. package/dist/src/tui/backends/embedded-backend.js +1 -1
  192. package/package.json +3 -3
  193. package/dist/gateway/static/root/assets/messages-CTSgFlE4.js +0 -3
  194. package/dist/gateway/static/root/assets/models-hub-cache-ZrbGRiGY.js +0 -1
  195. package/dist/gateway/static/root/assets/settings-advanced-gate-D4EMxWAZ.js +0 -1
  196. package/dist/gateway/static/root/assets/skill-reload-api-DVb7nrXz.js +0 -1
  197. package/dist/src/agent/coding/turn-diff-tracker.d.ts +0 -67
  198. package/dist/src/agent/coding/turn-diff-tracker.js +0 -231
  199. package/dist/src/agent/middleware/self-verify.d.ts +0 -136
  200. package/dist/src/agent/middleware/self-verify.js +0 -380
  201. package/dist/src/agent/tools/execute-code-tool.d.ts +0 -11
  202. package/dist/src/agent/tools/execute-code-tool.js +0 -208
@@ -0,0 +1,56 @@
1
+ import { resolveRipgrepBinary } from "../../infra/ripgrep.js";
2
+ import { spawn } from "node:child_process";
3
+ //#region src/agent/tools/repository-search.ts
4
+ /** Bounded native search; unavailable tools and invalid regexes are explicit failures. */
5
+ async function repositorySearch(cwd, args, signal) {
6
+ signal?.throwIfAborted();
7
+ const binary = await resolveRipgrepBinary();
8
+ return new Promise((resolve, reject) => {
9
+ const child = spawn(binary, [
10
+ "--no-config",
11
+ "--hidden",
12
+ "--glob",
13
+ "!.git",
14
+ "--glob",
15
+ "!node_modules",
16
+ ...args
17
+ ], { cwd });
18
+ const chunks = [];
19
+ let bytes = 0, truncated = false, stderr = "";
20
+ const timer = setTimeout(() => child.kill("SIGKILL"), 1e4);
21
+ const abort = () => child.kill("SIGKILL");
22
+ signal?.addEventListener("abort", abort, { once: true });
23
+ child.stdout.on("data", (chunk) => {
24
+ const remaining = Math.max(0, 5e4 - bytes);
25
+ chunks.push(chunk.subarray(0, remaining));
26
+ bytes += chunk.length;
27
+ if (bytes > 5e4) {
28
+ truncated = true;
29
+ child.kill("SIGKILL");
30
+ }
31
+ });
32
+ child.stderr.on("data", (chunk) => {
33
+ stderr = (stderr + String(chunk)).slice(-4e3);
34
+ });
35
+ child.on("error", reject);
36
+ child.on("close", (code) => {
37
+ clearTimeout(timer);
38
+ signal?.removeEventListener("abort", abort);
39
+ if (signal?.aborted) {
40
+ reject(signal.reason ?? /* @__PURE__ */ new Error("Search aborted"));
41
+ return;
42
+ }
43
+ if (code !== 0 && code !== 1 && !truncated) {
44
+ reject(new Error(stderr || "Search did not complete; check ripgrep installation or narrow the search."));
45
+ return;
46
+ }
47
+ resolve({
48
+ output: Buffer.concat(chunks).toString("utf8"),
49
+ truncated
50
+ });
51
+ });
52
+ if (signal?.aborted) abort();
53
+ });
54
+ }
55
+ //#endregion
56
+ export { repositorySearch };
@@ -0,0 +1,2 @@
1
+ import type { AgentTool } from '@earendil-works/pi-agent-core';
2
+ export declare function createReviewWorkspaceTool(workspace: string): AgentTool;
@@ -0,0 +1,103 @@
1
+ import { readWorkspaceRevision } from "../coding/workspace-revision.js";
2
+ import { resolve } from "node:path";
3
+ import { execFile } from "node:child_process";
4
+ import { lstat, readFile, readlink, realpath } from "node:fs/promises";
5
+ import { promisify } from "node:util";
6
+ import { Type } from "@sinclair/typebox";
7
+ //#region src/agent/tools/review-workspace.ts
8
+ const exec$1 = promisify(execFile);
9
+ function createReviewWorkspaceTool(workspace) {
10
+ return {
11
+ name: "review_workspace",
12
+ label: "Review workspace",
13
+ parameters: Type.Object({}),
14
+ description: "Inspect the complete Git workspace diff against HEAD, including untracked text files. Includes pre-existing changes. A truncated view is explicitly incomplete; inspect large files separately. Does not modify Git state.",
15
+ supportsParallel: true,
16
+ idempotent: true,
17
+ async execute(_id, _args, signal) {
18
+ let cwd = workspace;
19
+ const git = async (args) => (await exec$1("git", [
20
+ "-c",
21
+ "core.fsmonitor=false",
22
+ ...args
23
+ ], {
24
+ cwd,
25
+ signal,
26
+ timeout: 1e4,
27
+ maxBuffer: 8 * 1024 * 1024
28
+ })).stdout;
29
+ cwd = await realpath((await git(["rev-parse", "--show-toplevel"])).trim());
30
+ const startRevision = await readWorkspaceRevision(cwd);
31
+ const head = await git([
32
+ "rev-parse",
33
+ "--verify",
34
+ "HEAD"
35
+ ]).catch(() => "");
36
+ const [diff, names] = await Promise.all([head ? git([
37
+ "diff",
38
+ "--no-ext-diff",
39
+ "--no-textconv",
40
+ "--binary",
41
+ "HEAD",
42
+ "--"
43
+ ]) : Promise.all([git([
44
+ "diff",
45
+ "--no-ext-diff",
46
+ "--no-textconv",
47
+ "--binary",
48
+ "--cached",
49
+ "--"
50
+ ]), git([
51
+ "diff",
52
+ "--no-ext-diff",
53
+ "--no-textconv",
54
+ "--binary",
55
+ "--"
56
+ ])]).then((parts) => parts.join("\n")), git([
57
+ "ls-files",
58
+ "--others",
59
+ "--exclude-standard",
60
+ "-z"
61
+ ])]);
62
+ let text = diff.slice(0, 2e5), complete = diff.length <= 2e5;
63
+ for (const path of names.split("\0").filter(Boolean)) {
64
+ signal?.throwIfAborted();
65
+ if (text.length >= 2e5) {
66
+ complete = false;
67
+ break;
68
+ }
69
+ const file = resolve(cwd, path), info = await lstat(file);
70
+ text += `\nUntracked file: ${path}\n`;
71
+ if (info.isSymbolicLink()) text += `Symlink to ${await readlink(file)}\n`;
72
+ else if (info.isFile() && info.size <= 5e4) {
73
+ const content = await readFile(file);
74
+ if (content.includes(0)) {
75
+ text += "(binary file; inspect separately)\n";
76
+ complete = false;
77
+ } else text += content.toString("utf8");
78
+ } else {
79
+ text += "(large file; inspect separately)\n";
80
+ complete = false;
81
+ }
82
+ }
83
+ complete &&= text.length <= 2e5;
84
+ const endRevision = await readWorkspaceRevision(cwd);
85
+ return {
86
+ content: [{
87
+ type: "text",
88
+ text: `Workspace changes against HEAD (including pre-existing changes):\n${text.slice(0, 2e5) || "(clean)"}${complete ? "" : "\n[Incomplete view]"}`
89
+ }],
90
+ details: {
91
+ status: "success",
92
+ command: "review_workspace",
93
+ complete,
94
+ exitCode: 0,
95
+ startRevision,
96
+ endRevision
97
+ }
98
+ };
99
+ }
100
+ };
101
+ }
102
+ //#endregion
103
+ export { createReviewWorkspaceTool };
@@ -33,7 +33,7 @@ function createWriteFileTool(workspace, options) {
33
33
  type: "text",
34
34
  text: `🚫 ${safety.message}`
35
35
  }],
36
- details: {}
36
+ details: { status: "failed" }
37
37
  };
38
38
  const writesProfileFile = Boolean(options?.profileMarkdownRoot && isBareProfileMarkdownFileName(p.path));
39
39
  const workspaceRoot = writesProfileFile ? options.profileMarkdownRoot : workspace;
@@ -47,7 +47,7 @@ function createWriteFileTool(workspace, options) {
47
47
  type: "text",
48
48
  text: `🚫 Sandbox: ${pathPolicy.reason}`
49
49
  }],
50
- details: {}
50
+ details: { status: "failed" }
51
51
  };
52
52
  const contentBytes = Buffer.byteLength(p.content, "utf-8");
53
53
  if (contentBytes > MAX_FILE_SIZE) return {
@@ -55,7 +55,7 @@ function createWriteFileTool(workspace, options) {
55
55
  type: "text",
56
56
  text: `🚫 File too large: ${contentBytes} bytes`
57
57
  }],
58
- details: {}
58
+ details: { status: "failed" }
59
59
  };
60
60
  const target = writesProfileFile ? resolveProfileMarkdownPathIfBareName(p.path, options.profileMarkdownRoot) : resolvePathUnderWorkspace(p.path, workspace);
61
61
  await mkdir(dirname(target), { recursive: true });
@@ -88,7 +88,7 @@ function createWriteFileTool(workspace, options) {
88
88
  type: "text",
89
89
  text: `Error: ${error instanceof Error ? error.message : String(error)}`
90
90
  }],
91
- details: {}
91
+ details: { status: "failed" }
92
92
  };
93
93
  }
94
94
  }
@@ -1,7 +1,7 @@
1
- import { extractToolCallsFromAssistant, extractToolResultId, sanitizeToolCallId, sanitizeToolCallIdsForCloudCodeAssist } from "./tool-call-id.js";
2
- import { makeMissingToolResult, repairToolUseResultPairing, sanitizeToolCallInputs, sanitizeToolUseResultPairing, stripToolResultDetails } from "./session-transcript-repair.js";
3
1
  import { resolveTranscriptPolicy } from "./transcript-policy.js";
4
2
  import { dropThinkingBlocks } from "./thinking.js";
3
+ import { extractToolCallsFromAssistant, extractToolResultId, sanitizeToolCallId, sanitizeToolCallIdsForCloudCodeAssist } from "./tool-call-id.js";
4
+ import { makeMissingToolResult, repairToolUseResultPairing, sanitizeToolCallInputs, sanitizeToolUseResultPairing, stripToolResultDetails } from "./session-transcript-repair.js";
5
5
  import { applySessionTranscriptHygiene, applySessionTranscriptHygieneForPersistence, applySessionTranscriptHygieneWithPolicy, resolvePolicyForModel, tryApplySessionTranscriptHygiene, tryApplySessionTranscriptHygieneForPersistence } from "./transcript-hygiene.js";
6
6
  import { stripToolMessages } from "./strip-tool-messages.js";
7
7
  export { applySessionTranscriptHygiene, applySessionTranscriptHygieneForPersistence, applySessionTranscriptHygieneWithPolicy, dropThinkingBlocks, extractToolCallsFromAssistant, extractToolResultId, makeMissingToolResult, repairToolUseResultPairing, resolvePolicyForModel, resolveTranscriptPolicy, sanitizeToolCallId, sanitizeToolCallIdsForCloudCodeAssist, sanitizeToolCallInputs, sanitizeToolUseResultPairing, stripToolMessages, stripToolResultDetails, tryApplySessionTranscriptHygiene, tryApplySessionTranscriptHygieneForPersistence };
@@ -1,9 +1,9 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { sanitizeToolCallIdsForCloudCodeAssist } from "./tool-call-id.js";
4
- import { sanitizeToolCallInputs, sanitizeToolUseResultPairing, stripToolResultDetails } from "./session-transcript-repair.js";
5
3
  import { resolveTranscriptPolicy } from "./transcript-policy.js";
6
4
  import { dropThinkingBlocks } from "./thinking.js";
5
+ import { sanitizeToolCallIdsForCloudCodeAssist } from "./tool-call-id.js";
6
+ import { sanitizeToolCallInputs, sanitizeToolUseResultPairing, stripToolResultDetails } from "./session-transcript-repair.js";
7
7
  //#region src/agent/transcript/transcript-hygiene.ts
8
8
  init_logger();
9
9
  const log = createLogger("transcript-hygiene");
@@ -10,8 +10,6 @@
10
10
  * without ever calling `structured_output`, we treat it as failure (`null`).
11
11
  * - Failures and aborts resolve to `null`. The workflow runtime continues — this
12
12
  * matches the pi-dynamic-workflows contract and keeps fan-out pipelines robust.
13
- * - We do NOT mutate `createDelegateChildHandle` — we just leverage its
14
- * `buildChildTools` injection point.
15
13
  */
16
14
  import type { AgentTool } from '@earendil-works/pi-agent-core';
17
15
  import type { Api, Model } from '@earendil-works/pi-ai';
@@ -1,8 +1,8 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
+ import { createSqliteTranscriptRuntime } from "../embedded/transcript-runtime.js";
3
4
  import { createDelegateChildHandle } from "../child-agent-factory.js";
4
5
  import { DEFAULT_DELEGATE_TOOLS, DELEGATE_BLOCKED_TOOLS } from "../tools/delegate-tool.js";
5
- import { emitSessionTranscriptUpdate } from "../../session/transcript-events.js";
6
6
  import { STRUCTURED_OUTPUT_TOOL_NAME, createStructuredOutputTool } from "./structured-output-tool.js";
7
7
  //#region src/agent/workflow/subagent-runner.ts
8
8
  init_logger();
@@ -27,24 +27,6 @@ var DelegateSubagentRunner = class {
27
27
  }
28
28
  const fullPrompt = buildPrompt(prompt, opts, wantStructured);
29
29
  const streamMode = resolveSubagentStreamMode(this.deps.getConfig);
30
- let transcriptPersistQueue = Promise.resolve();
31
- const persistTranscriptSnapshot = opts.sessionKey && this.deps.sessionStore ? (messages) => {
32
- const store = this.deps.sessionStore;
33
- const key = opts.sessionKey;
34
- if (!store || !key) return;
35
- const snapshot = cloneAgentMessages(messages);
36
- transcriptPersistQueue = transcriptPersistQueue.then(async () => {
37
- await store.saveMessages(key, snapshot);
38
- emitSessionTranscriptUpdate({ sessionKey: key });
39
- }).catch((err) => {
40
- const msg = err instanceof Error ? err.message : String(err);
41
- log.warn({
42
- err,
43
- sessionKey: key,
44
- errorMessage: msg
45
- }, `Failed to persist workflow subagent transcript snapshot: ${msg}`);
46
- });
47
- } : void 0;
48
30
  const childOptions = {
49
31
  workspace: this.deps.workspace,
50
32
  goal: fullPrompt,
@@ -72,20 +54,22 @@ var DelegateSubagentRunner = class {
72
54
  onProgress: (event) => {
73
55
  opts.onProgress?.(mapChildProgressEvent(event));
74
56
  }
75
- } : void 0,
76
- onTranscriptSnapshot: persistTranscriptSnapshot
57
+ } : void 0
77
58
  };
78
- if (opts.sessionKey && opts.sessionMetadata && this.deps.sessionStore) await this.preparePersistentSubagentSession(opts.sessionKey, opts.sessionMetadata);
59
+ if (opts.sessionKey && opts.sessionMetadata && this.deps.sessionStore) {
60
+ await this.preparePersistentSubagentSession(opts.sessionKey, opts.sessionMetadata);
61
+ childOptions.sessionKey = opts.sessionKey;
62
+ childOptions.transcriptRuntime = await createSqliteTranscriptRuntime({
63
+ sessionKey: opts.sessionKey,
64
+ sessionStore: this.deps.sessionStore
65
+ });
66
+ }
79
67
  const handle = createDelegateChildHandle(childOptions);
80
68
  const onAbort = () => handle.abort();
81
69
  opts.signal?.addEventListener("abort", onAbort, { once: true });
82
70
  try {
83
- const { summary, messages } = await handle.run();
84
- await transcriptPersistQueue;
85
- if (opts.sessionKey && this.deps.sessionStore) {
86
- await this.deps.sessionStore.saveMessages(opts.sessionKey, messages);
87
- emitSessionTranscriptUpdate({ sessionKey: opts.sessionKey });
88
- }
71
+ const { summary, status } = await handle.run();
72
+ if (status !== "success") return null;
89
73
  if (opts.signal?.aborted) return null;
90
74
  if (wantStructured) {
91
75
  if (!capture.called) {
@@ -144,9 +128,6 @@ var DelegateSubagentRunner = class {
144
128
  });
145
129
  }
146
130
  };
147
- function cloneAgentMessages(messages) {
148
- return messages.map((message) => structuredClone(message));
149
- }
150
131
  function resolveAllowedToolNames(requested, wantStructured) {
151
132
  const filtered = (requested && requested.length > 0 ? requested : [...DEFAULT_DELEGATE_TOOLS]).map((s) => String(s).trim()).filter((s) => s.length > 0).filter((s) => !DELEGATE_BLOCKED_TOOLS.has(s));
152
133
  if (wantStructured && !filtered.includes("structured_output")) filtered.push(STRUCTURED_OUTPUT_TOOL_NAME);
@@ -116,6 +116,13 @@ export declare const WorkflowPolicySchema: z.ZodObject<{
116
116
  allowed: z.ZodOptional<z.ZodArray<z.ZodString>>;
117
117
  }, z.core.$strict>;
118
118
  export declare const RuntimePolicySchema: z.ZodObject<{
119
+ commandIsolation: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
120
+ mode: z.ZodLiteral<"host">;
121
+ }, z.core.$strict>, z.ZodObject<{
122
+ mode: z.ZodLiteral<"docker">;
123
+ image: z.ZodString;
124
+ network: z.ZodDefault<z.ZodBoolean>;
125
+ }, z.core.$strict>], "mode">>;
119
126
  maxTurns: z.ZodOptional<z.ZodNumber>;
120
127
  timeoutMs: z.ZodOptional<z.ZodNumber>;
121
128
  maxToolFailuresPerTurn: z.ZodOptional<z.ZodNumber>;
@@ -179,6 +186,13 @@ export declare const AgentDefaultsSchema: z.ZodObject<{
179
186
  allowed: z.ZodOptional<z.ZodArray<z.ZodString>>;
180
187
  }, z.core.$strict>>;
181
188
  runtime: z.ZodDefault<z.ZodObject<{
189
+ commandIsolation: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
190
+ mode: z.ZodLiteral<"host">;
191
+ }, z.core.$strict>, z.ZodObject<{
192
+ mode: z.ZodLiteral<"docker">;
193
+ image: z.ZodString;
194
+ network: z.ZodDefault<z.ZodBoolean>;
195
+ }, z.core.$strict>], "mode">>;
182
196
  maxTurns: z.ZodOptional<z.ZodNumber>;
183
197
  timeoutMs: z.ZodOptional<z.ZodNumber>;
184
198
  maxToolFailuresPerTurn: z.ZodOptional<z.ZodNumber>;
@@ -255,6 +269,13 @@ export declare const AgentEntrySchema: z.ZodObject<{
255
269
  allowed: z.ZodOptional<z.ZodArray<z.ZodString>>;
256
270
  }, z.core.$strict>>;
257
271
  runtime: z.ZodOptional<z.ZodObject<{
272
+ commandIsolation: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
273
+ mode: z.ZodLiteral<"host">;
274
+ }, z.core.$strict>, z.ZodObject<{
275
+ mode: z.ZodLiteral<"docker">;
276
+ image: z.ZodString;
277
+ network: z.ZodDefault<z.ZodBoolean>;
278
+ }, z.core.$strict>], "mode">>;
258
279
  maxTurns: z.ZodOptional<z.ZodNumber>;
259
280
  timeoutMs: z.ZodOptional<z.ZodNumber>;
260
281
  maxToolFailuresPerTurn: z.ZodOptional<z.ZodNumber>;
@@ -321,6 +342,13 @@ export declare const AgentsConfigSchema: z.ZodObject<{
321
342
  allowed: z.ZodOptional<z.ZodArray<z.ZodString>>;
322
343
  }, z.core.$strict>>;
323
344
  runtime: z.ZodDefault<z.ZodObject<{
345
+ commandIsolation: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
346
+ mode: z.ZodLiteral<"host">;
347
+ }, z.core.$strict>, z.ZodObject<{
348
+ mode: z.ZodLiteral<"docker">;
349
+ image: z.ZodString;
350
+ network: z.ZodDefault<z.ZodBoolean>;
351
+ }, z.core.$strict>], "mode">>;
324
352
  maxTurns: z.ZodOptional<z.ZodNumber>;
325
353
  timeoutMs: z.ZodOptional<z.ZodNumber>;
326
354
  maxToolFailuresPerTurn: z.ZodOptional<z.ZodNumber>;
@@ -393,6 +421,13 @@ export declare const AgentsConfigSchema: z.ZodObject<{
393
421
  allowed: z.ZodOptional<z.ZodArray<z.ZodString>>;
394
422
  }, z.core.$strict>>;
395
423
  runtime: z.ZodOptional<z.ZodObject<{
424
+ commandIsolation: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
425
+ mode: z.ZodLiteral<"host">;
426
+ }, z.core.$strict>, z.ZodObject<{
427
+ mode: z.ZodLiteral<"docker">;
428
+ image: z.ZodString;
429
+ network: z.ZodDefault<z.ZodBoolean>;
430
+ }, z.core.$strict>], "mode">>;
396
431
  maxTurns: z.ZodOptional<z.ZodNumber>;
397
432
  timeoutMs: z.ZodOptional<z.ZodNumber>;
398
433
  maxToolFailuresPerTurn: z.ZodOptional<z.ZodNumber>;
@@ -465,6 +500,13 @@ export declare const EffectiveAgentConfigSchema: z.ZodObject<{
465
500
  allowed: z.ZodOptional<z.ZodArray<z.ZodString>>;
466
501
  }, z.core.$strict>;
467
502
  runtime: z.ZodObject<{
503
+ commandIsolation: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
504
+ mode: z.ZodLiteral<"host">;
505
+ }, z.core.$strict>, z.ZodObject<{
506
+ mode: z.ZodLiteral<"docker">;
507
+ image: z.ZodString;
508
+ network: z.ZodDefault<z.ZodBoolean>;
509
+ }, z.core.$strict>], "mode">>;
468
510
  maxTurns: z.ZodOptional<z.ZodNumber>;
469
511
  timeoutMs: z.ZodOptional<z.ZodNumber>;
470
512
  maxToolFailuresPerTurn: z.ZodOptional<z.ZodNumber>;
@@ -77,6 +77,11 @@ var init_schema = __esmMin((() => {
77
77
  allowed: z.array(z.string().min(1)).optional()
78
78
  }).strict();
79
79
  RuntimePolicySchema = z.object({
80
+ commandIsolation: z.discriminatedUnion("mode", [z.object({ mode: z.literal("host") }).strict(), z.object({
81
+ mode: z.literal("docker"),
82
+ image: z.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9./:_-]*@sha256:[a-f0-9]{64}$/),
83
+ network: z.boolean().default(false)
84
+ }).strict()]).optional(),
80
85
  maxTurns: z.number().int().positive().optional(),
81
86
  timeoutMs: z.number().int().positive().optional(),
82
87
  maxToolFailuresPerTurn: z.number().int().positive().optional(),
@@ -2,8 +2,8 @@ import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
3
  import { init_providers, resolveModel } from "../../providers/index.js";
4
4
  import { completeWithResolvedCredentials } from "../../providers/model-call.js";
5
- import { buildAutomationDraftPrompt, buildAutomationDraftRepairPrompt, buildAutomationRunRepairPrompt, buildAutomationRunRepairRetryPrompt } from "./automation-draft-prompt.js";
6
5
  import { resolveDraftModelRef } from "../../workflows/draft/workflow-draft-service.js";
6
+ import { buildAutomationDraftPrompt, buildAutomationDraftRepairPrompt, buildAutomationRunRepairPrompt, buildAutomationRunRepairRetryPrompt } from "./automation-draft-prompt.js";
7
7
  import { buildAutomationDraftResponse, parseGeneratedAutomationDraft, parseGeneratedAutomationRepairDraft } from "./automation-draft-validator.js";
8
8
  //#region src/automations/draft/automation-draft-service.ts
9
9
  init_providers();
@@ -3,9 +3,9 @@ import { init_loader, loadConfig } from "../../config/loader.js";
3
3
  import { downloadExtensionStoreZipBuffer, resolveExtensionZipDownloadUrl, resolveExtensionsStoreBaseUrl, verifyStoreArtifactSha256 } from "../../agent/skills/marketplace/adapters/store/store-api-client.js";
4
4
  import { getContextWithOpts } from "../context.js";
5
5
  import { getExtensionLockfileManager } from "../../extensions/lockfile.js";
6
+ import { fetchRegistry, findExtension, getExtensionMarketplaceStoreBaseUrl, listExtensions, searchExtensions } from "../../extensions/marketplace.js";
6
7
  import { installFromLocal, installFromNpm, peekExtensionManifestFromStoreZip } from "../../extensions/install.js";
7
8
  import { commitStagedExtensionInstall, finalizeStagedExtensionInstall, rollbackStagedExtensionInstall, stageExtensionStoreZip } from "../../extensions/install-transaction.js";
8
- import { fetchRegistry, findExtension, getExtensionMarketplaceStoreBaseUrl, listExtensions, searchExtensions } from "../../extensions/marketplace.js";
9
9
  import { colors } from "../utils/colors.js";
10
10
  import { validateExtensionPackageDirectory } from "./extension-pack.js";
11
11
  import { join, resolve } from "node:path";
@@ -100,6 +100,13 @@ export declare const AgentsConfigSchema: z.ZodDefault<z.ZodObject<{
100
100
  allowed: z.ZodOptional<z.ZodArray<z.ZodString>>;
101
101
  }, z.core.$strict>>;
102
102
  runtime: z.ZodDefault<z.ZodObject<{
103
+ commandIsolation: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
104
+ mode: z.ZodLiteral<"host">;
105
+ }, z.core.$strict>, z.ZodObject<{
106
+ mode: z.ZodLiteral<"docker">;
107
+ image: z.ZodString;
108
+ network: z.ZodDefault<z.ZodBoolean>;
109
+ }, z.core.$strict>], "mode">>;
103
110
  maxTurns: z.ZodOptional<z.ZodNumber>;
104
111
  timeoutMs: z.ZodOptional<z.ZodNumber>;
105
112
  maxToolFailuresPerTurn: z.ZodOptional<z.ZodNumber>;
@@ -172,6 +179,13 @@ export declare const AgentsConfigSchema: z.ZodDefault<z.ZodObject<{
172
179
  allowed: z.ZodOptional<z.ZodArray<z.ZodString>>;
173
180
  }, z.core.$strict>>;
174
181
  runtime: z.ZodOptional<z.ZodObject<{
182
+ commandIsolation: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
183
+ mode: z.ZodLiteral<"host">;
184
+ }, z.core.$strict>, z.ZodObject<{
185
+ mode: z.ZodLiteral<"docker">;
186
+ image: z.ZodString;
187
+ network: z.ZodDefault<z.ZodBoolean>;
188
+ }, z.core.$strict>], "mode">>;
175
189
  maxTurns: z.ZodOptional<z.ZodNumber>;
176
190
  timeoutMs: z.ZodOptional<z.ZodNumber>;
177
191
  maxToolFailuresPerTurn: z.ZodOptional<z.ZodNumber>;
@@ -1569,6 +1583,13 @@ export declare const ConfigSchema: z.ZodDefault<z.ZodObject<{
1569
1583
  allowed: z.ZodOptional<z.ZodArray<z.ZodString>>;
1570
1584
  }, z.core.$strict>>;
1571
1585
  runtime: z.ZodDefault<z.ZodObject<{
1586
+ commandIsolation: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
1587
+ mode: z.ZodLiteral<"host">;
1588
+ }, z.core.$strict>, z.ZodObject<{
1589
+ mode: z.ZodLiteral<"docker">;
1590
+ image: z.ZodString;
1591
+ network: z.ZodDefault<z.ZodBoolean>;
1592
+ }, z.core.$strict>], "mode">>;
1572
1593
  maxTurns: z.ZodOptional<z.ZodNumber>;
1573
1594
  timeoutMs: z.ZodOptional<z.ZodNumber>;
1574
1595
  maxToolFailuresPerTurn: z.ZodOptional<z.ZodNumber>;
@@ -1641,6 +1662,13 @@ export declare const ConfigSchema: z.ZodDefault<z.ZodObject<{
1641
1662
  allowed: z.ZodOptional<z.ZodArray<z.ZodString>>;
1642
1663
  }, z.core.$strict>>;
1643
1664
  runtime: z.ZodOptional<z.ZodObject<{
1665
+ commandIsolation: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
1666
+ mode: z.ZodLiteral<"host">;
1667
+ }, z.core.$strict>, z.ZodObject<{
1668
+ mode: z.ZodLiteral<"docker">;
1669
+ image: z.ZodString;
1670
+ network: z.ZodDefault<z.ZodBoolean>;
1671
+ }, z.core.$strict>], "mode">>;
1644
1672
  maxTurns: z.ZodOptional<z.ZodNumber>;
1645
1673
  timeoutMs: z.ZodOptional<z.ZodNumber>;
1646
1674
  maxToolFailuresPerTurn: z.ZodOptional<z.ZodNumber>;
@@ -32,6 +32,8 @@ export declare class LocalWorktreeManager {
32
32
  provisionManagedWorktree(input: ProvisionManagedWorktreeInput): Promise<ExecutionEnvironment>;
33
33
  inspect(environmentId: string): Promise<LocalWorktreeInspection>;
34
34
  reconcile(environmentId: string): Promise<ExecutionEnvironment>;
35
- remove(environmentId: string): Promise<ExecutionEnvironment>;
35
+ remove(environmentId: string, options?: {
36
+ releaseSessionKey: string;
37
+ }): Promise<ExecutionEnvironment>;
36
38
  private cleanupFailedProvision;
37
39
  }
@@ -183,7 +183,11 @@ var LocalWorktreeManager = class {
183
183
  const environment = this.store.getRequired(environmentId);
184
184
  const inspection = await this.inspect(environmentId);
185
185
  if (inspection.healthy) {
186
- if (environment.status !== "degraded" && environment.status !== "provisioning") return environment;
186
+ if (![
187
+ "degraded",
188
+ "provisioning",
189
+ "error"
190
+ ].includes(environment.status)) return environment;
187
191
  const provisioning = environment.status === "provisioning" ? environment : this.store.transition({
188
192
  environmentId,
189
193
  expectedVersion: environment.version,
@@ -207,7 +211,7 @@ var LocalWorktreeManager = class {
207
211
  error: inspection.problems.join("; ")
208
212
  });
209
213
  }
210
- async remove(environmentId) {
214
+ async remove(environmentId, options) {
211
215
  const environment = this.store.getRequired(environmentId);
212
216
  if (environment.status === "deleted") return environment;
213
217
  if (environment.kind === "local_checkout") {
@@ -232,7 +236,7 @@ var LocalWorktreeManager = class {
232
236
  }
233
237
  if (environment.kind !== "managed_worktree" || !environment.repositoryRoot || !environment.gitCommonDir) throw new Error(`Execution environment ${environmentId} is not a managed worktree`);
234
238
  assertManagedPath(environment.rootPath, this.stateDir);
235
- if (this.store.listBindings(environmentId).length > 0) throw new ExecutionEnvironmentConflictError(`Managed worktree ${environmentId} still has active bindings`);
239
+ if (this.store.listBindings(environmentId).some((binding) => binding.sessionKey !== options?.releaseSessionKey)) throw new ExecutionEnvironmentConflictError(`Managed worktree ${environmentId} still has active bindings`);
236
240
  const deleting = environment.status === "deleting" ? environment : this.store.transition({
237
241
  environmentId,
238
242
  expectedVersion: environment.version,
@@ -274,6 +278,7 @@ var LocalWorktreeManager = class {
274
278
  }
275
279
  }
276
280
  });
281
+ if (options?.releaseSessionKey) this.store.releaseBinding(options.releaseSessionKey, environmentId);
277
282
  const deleted = this.store.transition({
278
283
  environmentId,
279
284
  expectedVersion: deleting.version,
@@ -19,7 +19,9 @@ var SessionEnvironmentService = class {
19
19
  if (existing) {
20
20
  if (existing.projectId !== input.project.id) throw new ExecutionEnvironmentConflictError(`Session ${input.sessionKey} is already bound to a different project's execution environment`);
21
21
  if (input.mode && existing.kind !== input.mode) throw new ExecutionEnvironmentConflictError(`Session ${input.sessionKey} is already using ${existing.kind}; release it before switching to ${input.mode}`);
22
- return existing;
22
+ const checked = existing.kind === "managed_worktree" ? await this.worktrees.reconcile(existing.id) : existing;
23
+ if (checked.status !== "ready") throw new ExecutionEnvironmentConflictError(`Execution environment ${checked.id} is ${checked.status}; repair it before resuming`);
24
+ return checked;
23
25
  }
24
26
  const workspaceRoot = input.project.workspaceRoot?.trim();
25
27
  if (!workspaceRoot) throw new ExecutionEnvironmentConflictError(`Project ${input.project.id} needs a fixed workspace before an execution environment can be created`);
@@ -43,8 +45,8 @@ var SessionEnvironmentService = class {
43
45
  const binding = this.store.resolveBinding(sessionKey);
44
46
  if (!binding) return void 0;
45
47
  const environment = this.store.get(binding.environmentId);
46
- this.store.releaseBinding(sessionKey, binding.environmentId);
47
- if (removeManaged && environment?.kind === "managed_worktree") await this.worktrees.remove(environment.id);
48
+ if (removeManaged && environment?.kind === "managed_worktree") await this.worktrees.remove(environment.id, { releaseSessionKey: sessionKey });
49
+ else this.store.releaseBinding(sessionKey, binding.environmentId);
48
50
  return environment;
49
51
  }
50
52
  async resolveLocalCheckout(projectId, workspaceRoot) {
@@ -4,8 +4,8 @@ import { init_paths, resolveBundledExtensionsDir, resolveExtensionsDir } from ".
4
4
  import { init_loader, loadConfig } from "../config/loader.js";
5
5
  import { downloadExtensionStoreZipBuffer, resolveExtensionZipDownloadUrl, resolveExtensionsStoreBaseUrl, verifyStoreArtifactSha256 } from "../agent/skills/marketplace/adapters/store/store-api-client.js";
6
6
  import { getExtensionLockfileManager } from "./lockfile.js";
7
- import { installExtensionFromStoreZip, installFromNpm } from "./install.js";
8
7
  import { findExtension } from "./marketplace.js";
8
+ import { installExtensionFromStoreZip, installFromNpm } from "./install.js";
9
9
  import { join } from "node:path";
10
10
  import { existsSync, readFileSync, readdirSync, rmSync } from "node:fs";
11
11
  import semver from "semver";
@@ -106,6 +106,13 @@ export declare function buildSafeWebConfigPayload(service: GatewayService, optio
106
106
  allowed?: string[];
107
107
  };
108
108
  runtime: {
109
+ commandIsolation?: {
110
+ mode: "host";
111
+ } | {
112
+ mode: "docker";
113
+ image: string;
114
+ network: boolean;
115
+ };
109
116
  maxTurns?: number;
110
117
  timeoutMs?: number;
111
118
  maxToolFailuresPerTurn?: number;
@@ -1,8 +1,8 @@
1
1
  import { getAllModels, getAvailableModels, init_providers } from "../../../providers/index.js";
2
2
  import { ActivationPlanner } from "../../../extensions/activation-planner.js";
3
3
  import { mergeActivationContext } from "../../../extensions/activation-context.js";
4
- import { fetchRegistry, listExtensions, searchExtensions } from "../../../extensions/marketplace.js";
5
4
  import { buildWhenContextSnapshot } from "../../../extensions/when-context.js";
5
+ import { fetchRegistry, listExtensions, searchExtensions } from "../../../extensions/marketplace.js";
6
6
  import { createOAuthAsyncHandler } from "../oauth-async.js";
7
7
  import { createOAuthHandler } from "../oauth.js";
8
8
  import { extensionAssetMimeType } from "../lib/extension-assets.js";