@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.
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{activity-store-CAah-_8h.js → activity-store-BlxqErph.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-DDH4HgP7.js → agent-avatar-dicebear-DRQnogaU.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-BDCfJZhh.js → agent-defaults-settings-panel-CpOxGbMD.js} +1 -1
- package/dist/gateway/static/root/assets/{agents-B0ZWgf-U.js → agents-flnXZLaT.js} +1 -1
- package/dist/gateway/static/root/assets/{api-B2tKxbcz.js → api-BbXzyQMj.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-Blfwszzn.js → app-management-settings-panel-CZl6n2xi.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-C3V7Na75.js → appearance-settings-Bglp-pn6.js} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-BiEks0-F.js → apps-page-CmsWarVB.js} +1 -1
- package/dist/gateway/static/root/assets/{archive-plugin-BmSx7wzY.js → archive-plugin-DD2SweEH.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-BS-S4LJ9.js → attachment-load-G0HenUmG.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-C7Y3L30D.js → automations-page-B78bFjH2.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-workspace-A3zPkPuo.js → automations-workspace-BMQGmn50.js} +1 -1
- package/dist/gateway/static/root/assets/{binary-plugins-BM9B5kcm.js → binary-plugins-BbSQmXqn.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-BbnpkYP9.js → block-editor-DutTIH81.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-settings-page-Dk4FQ7fY.js → browser-settings-page-CALiFKm4.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-workflow-inputs-CRnkgZHI.js → browser-workflow-inputs-BAAc151l.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-workflows-page-B9qGL-it.js → browser-workflows-page-DE5HPrHZ.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-settings-panel--tR_El9e.js → capabilities-settings-panel-Dts7XtP3.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-settings-D347vl_J.js → channels-settings-CWEd3wzh.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-status-swr-DuY4MGxe.js → channels-status-swr-CCBCtLDg.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-terminal-dock-DABPvwBT.js → chat-terminal-dock-Bp1fXQm1.js} +1 -1
- package/dist/gateway/static/root/assets/{connectors-page-B-tvJkRJ.js → connectors-page-CQ6wVNLm.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-expression-D3bsKbNd.js → cron-expression-B8HA5IRb.js} +1 -1
- package/dist/gateway/static/root/assets/{date-picker-BsGM6Yty.js → date-picker-DD8b7oad.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-Dj3g6YXZ.js → dependency-picker-BC9zwIyH.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-C1QT0Sur.js → desktop-pet-DsrsPZTW.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-r6kAOnfY.js → desktop-pet-settings-D7gp_HNA.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-DOkf7nh9.js → extension-debug-page-BoKbOX7x.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-Cq2IA4Ho.js → extension-page-BegL4FW8.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-DQn4qjDZ.js → extension-settings-page-CjPqq57s.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-DM3poL22.js → gateway-config-api-DaG57o4X.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-BC3pgb_P.js → gateway-config-swr-826dipyU.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-DPgH1hnh.js → gateway-settings-DkJGpgm6.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-uMcSfLru.js → gateway-startup-retry-DyvcAIMm.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-Bk80-E3b.js → heartbeat-settings-BLZ48kSU.js} +1 -1
- package/dist/gateway/static/root/assets/{home-page-DKo5JiMR.js → home-page-Dtw7Ipt1.js} +1 -1
- package/dist/gateway/static/root/assets/{image-generation-api-D1qlQA-A.js → image-generation-api-D7cyfks6.js} +1 -1
- package/dist/gateway/static/root/assets/{index-B0WJL9N1.js → index-DG5CfYat.js} +10 -10
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BEwvd8ZU.js → keyboard-shortcuts-settings-D2Has7-N.js} +1 -1
- package/dist/gateway/static/root/assets/{local-app-workbench-page--eJ5rmNj.js → local-app-workbench-page-BWidWY93.js} +1 -1
- package/dist/gateway/static/root/assets/{local-apps-page-CgkY9E-r.js → local-apps-page-Bkekjoxf.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-CMZljTJx.js → locale-store-CBoCuIMx.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-Z49Td0J9.js → logs-page-C5zSSgvA.js} +1 -1
- package/dist/gateway/static/root/assets/{management-settings-Dv8NSJKt.js → management-settings-B8c62vRS.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-split-Cm0RBB-t.js → markdown-split-3kxTTGO7.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-view-PPCLt7fu.js → markdown-view-BXsHghJd.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-Bcr5sU1f.js → media-plugins-BW8J1nCG.js} +1 -1
- package/dist/gateway/static/root/assets/messages-BbdwoxVo.js +3 -0
- package/dist/gateway/static/root/assets/{mobile-pairing-wizard-kKDiXofY.js → mobile-pairing-wizard-nwQ8iUcd.js} +1 -1
- package/dist/gateway/static/root/assets/models-hub-cache-88f4fzYS.js +1 -0
- package/dist/gateway/static/root/assets/{notes-page-CgsaRaGi.js → notes-page-DdybD0QM.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-workbench-C1DEE09k.js → notes-workbench-IYfpy2Jx.js} +2 -2
- package/dist/gateway/static/root/assets/{oauth-api-4VeMbkTJ.js → oauth-api-BjSUDIgq.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-BU0HiZtv.js → product-open-page-CAJeUXeU.js} +1 -1
- package/dist/gateway/static/root/assets/{project-detail-page-isRapnp5.js → project-detail-page-4wjw-b7h.js} +1 -1
- package/dist/gateway/static/root/assets/{projects-page-zvsjg0mi.js → projects-page-CCMj9PeL.js} +1 -1
- package/dist/gateway/static/root/assets/{registry-api-CWOtPFrE.js → registry-api-BhGKnvLP.js} +1 -1
- package/dist/gateway/static/root/assets/{remote-access-hub-C9TGZ9Hc.js → remote-access-hub-DsBJqWIk.js} +1 -1
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-2zm9edMA.js → runtime-tools-settings-panel-B4IDcqx0.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-54A5gzkN.js → schema-form-DiGUUjO6.js} +1 -1
- package/dist/gateway/static/root/assets/{sessions-page-BP8RyiUn.js → sessions-page-BwGj0t-2.js} +1 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-BJCfUghk.js +1 -0
- package/dist/gateway/static/root/assets/{settings-page-DzDhoyxv.js → settings-page-CVQUsAhd.js} +1 -1
- package/dist/gateway/static/root/assets/{setup-status-panel-uDicHU1w.js → setup-status-panel-CQACRh1i.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-lOmLCWFS.js → share-preview-page-DTP1dtuS.js} +1 -1
- package/dist/gateway/static/root/assets/{shares-settings-T4Yvouvv.js → shares-settings-D_YPh6Rw.js} +1 -1
- package/dist/gateway/static/root/assets/skill-reload-api-B43xlJlX.js +1 -0
- package/dist/gateway/static/root/assets/{skills-page-CnyNH3To.js → skills-page-Czpn7Y28.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page.utils-CgDtf2qs.js → skills-page.utils-d39rm3hb.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-C8yWfwtR.js → system-settings-panel-CXXySCSp.js} +1 -1
- package/dist/gateway/static/root/assets/{task-detail-page-Tzfjlbf3.js → task-detail-page-DHiOqQMx.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-uxUwr10D.js → theme-store-hybK3oC9.js} +1 -1
- package/dist/gateway/static/root/assets/{tunnel-api-Bvg679no.js → tunnel-api-BiBGK7O2.js} +1 -1
- package/dist/gateway/static/root/assets/{use-autosave-D88VGoyG.js → use-autosave-DjpzpeIm.js} +1 -1
- package/dist/gateway/static/root/assets/{user-context-page-RijPtyfO.js → user-context-page-1XBRV5gX.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-CBHLsMcc.js → voice-api-key-field-CUIPNmOc.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-config-api-MqyI6cgq.js → voice-config-api-CBbiF1T3.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-GGe2TQ98.js → work-discovery-overlay-DVNxhb1x.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-C0layUE9.js → workflow-run-setup-panel-HxxFQFY7.js} +1 -1
- package/dist/gateway/static/root/assets/{workflows-page-DQXIzBAc.js → workflows-page-BCgL7PRm.js} +1 -1
- package/dist/gateway/static/root/index.html +11 -11
- package/dist/package.js +1 -1
- package/dist/packages/gateway-contract/src/turn-outcome.js +3 -1
- package/dist/src/agent/agent-instance-gateway.d.ts +3 -1
- package/dist/src/agent/agent-manager.d.ts +2 -4
- package/dist/src/agent/agent-manager.js +24 -28
- package/dist/src/agent/background-review/coordinator.js +1 -1
- package/dist/src/agent/background-review/run-background-review.js +1 -1
- package/dist/src/agent/child-agent-factory.d.ts +10 -7
- package/dist/src/agent/child-agent-factory.js +112 -158
- package/dist/src/agent/coding/index.d.ts +1 -1
- package/dist/src/agent/coding/index.js +2 -2
- package/dist/src/agent/coding/repository-instructions.d.ts +12 -0
- package/dist/src/agent/coding/repository-instructions.js +76 -0
- package/dist/src/agent/coding/run-verification.d.ts +34 -0
- package/dist/src/agent/coding/run-verification.js +134 -0
- package/dist/src/agent/coding/verification-command.d.ts +3 -0
- package/dist/src/agent/coding/verification-command.js +50 -0
- package/dist/src/agent/coding/workspace-revision.d.ts +2 -0
- package/dist/src/agent/coding/workspace-revision.js +77 -0
- package/dist/src/agent/commands/command-isolation.d.ts +21 -0
- package/dist/src/agent/commands/command-isolation.js +71 -0
- package/dist/src/agent/commands/command-registry.d.ts +56 -0
- package/dist/src/agent/commands/command-registry.js +259 -0
- package/dist/src/agent/embedded/index.js +1 -1
- package/dist/src/agent/embedded/run-for-session.js +2 -1
- package/dist/src/agent/embedded/run-turn.js +88 -25
- package/dist/src/agent/embedded/session-tool-result-guard.js +2 -2
- package/dist/src/agent/embedded/subscribe-session.d.ts +2 -1
- package/dist/src/agent/embedded/subscribe-session.js +2 -1
- package/dist/src/agent/embedded/types.d.ts +3 -1
- package/dist/src/agent/embedded/xopc-tools-bridge.js +4 -1
- package/dist/src/agent/image/index.js +1 -1
- package/dist/src/agent/index.js +3 -3
- package/dist/src/agent/memory/user-context-coordinator.js +1 -1
- package/dist/src/agent/middleware/index.d.ts +0 -5
- package/dist/src/agent/middleware/index.js +1 -2
- package/dist/src/agent/orchestration/agent-event-handler.d.ts +0 -5
- package/dist/src/agent/orchestration/agent-event-handler.js +1 -96
- package/dist/src/agent/orchestration/agent-orchestrator.js +1 -1
- package/dist/src/agent/orchestration/agent-turn-policy.js +5 -5
- package/dist/src/agent/orchestration/index.d.ts +1 -1
- package/dist/src/agent/orchestration/index.js +2 -2
- package/dist/src/agent/orchestration/loop-guard.d.ts +4 -31
- package/dist/src/agent/orchestration/loop-guard.js +14 -99
- package/dist/src/agent/prompt/sections/tooling.js +2 -4
- package/dist/src/agent/sandbox/types.d.ts +2 -2
- package/dist/src/agent/sandbox/types.js +1 -1
- package/dist/src/agent/service/direct-turn-helpers.js +1 -1
- package/dist/src/agent/service/process-direct-streaming.js +1 -1
- package/dist/src/agent/service.d.ts +0 -2
- package/dist/src/agent/service.js +6 -23
- package/dist/src/agent/tasks/task-judge-service.d.ts +7 -0
- package/dist/src/agent/tasks/task-judge-service.js +24 -2
- package/dist/src/agent/tools/delegate-tool.d.ts +2 -1
- package/dist/src/agent/tools/delegate-tool.js +102 -124
- package/dist/src/agent/tools/exec-command.d.ts +8 -1
- package/dist/src/agent/tools/exec-command.js +77 -169
- package/dist/src/agent/tools/executor.js +9 -2
- package/dist/src/agent/tools/factory.js +50 -5
- package/dist/src/agent/tools/find.d.ts +10 -13
- package/dist/src/agent/tools/find.js +33 -80
- package/dist/src/agent/tools/grep.d.ts +14 -18
- package/dist/src/agent/tools/grep.js +56 -144
- package/dist/src/agent/tools/index.d.ts +0 -1
- package/dist/src/agent/tools/index.js +2 -3
- package/dist/src/agent/tools/language-diagnostics.d.ts +11 -0
- package/dist/src/agent/tools/language-diagnostics.js +62 -0
- package/dist/src/agent/tools/managed-job-tool.d.ts +2 -1
- package/dist/src/agent/tools/managed-job-tool.js +58 -118
- package/dist/src/agent/tools/read.js +24 -7
- package/dist/src/agent/tools/repository-search.d.ts +5 -0
- package/dist/src/agent/tools/repository-search.js +56 -0
- package/dist/src/agent/tools/review-workspace.d.ts +2 -0
- package/dist/src/agent/tools/review-workspace.js +103 -0
- package/dist/src/agent/tools/write.js +4 -4
- package/dist/src/agent/transcript/index.js +2 -2
- package/dist/src/agent/transcript/transcript-hygiene.js +2 -2
- package/dist/src/agent/workflow/subagent-runner.d.ts +0 -2
- package/dist/src/agent/workflow/subagent-runner.js +12 -31
- package/dist/src/agent-config/schema.d.ts +42 -0
- package/dist/src/agent-config/schema.js +5 -0
- package/dist/src/automations/draft/automation-draft-service.js +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +1 -1
- package/dist/src/config/schema.d.ts +28 -0
- package/dist/src/execution-environments/local-worktree-manager.d.ts +3 -1
- package/dist/src/execution-environments/local-worktree-manager.js +8 -3
- package/dist/src/execution-environments/session-environment-service.js +5 -3
- package/dist/src/extensions/update.js +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +7 -0
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
- package/dist/src/gateway/hono/routes/connectors.js +23 -23
- package/dist/src/gateway/hono/routes/sessions.js +1 -1
- package/dist/src/gateway/media-access.js +1 -1
- package/dist/src/gateway/service/config-coordinator.js +1 -1
- package/dist/src/gateway/service/run-gateway-agent.js +4 -1
- package/dist/src/gateway/service.js +1 -1
- package/dist/src/gateway/session-reset-service.js +1 -1
- package/dist/src/gateway/workspace-ripgrep.d.ts +0 -6
- package/dist/src/gateway/workspace-ripgrep.js +2 -40
- package/dist/src/infra/ripgrep.d.ts +13 -0
- package/dist/src/infra/ripgrep.js +46 -0
- package/dist/src/infra/update-runner.js +1 -1
- package/dist/src/proactive/execution/agent-executor.js +1 -1
- package/dist/src/session/store.js +1 -1
- package/dist/src/session/turn-outcome-projector.js +26 -6
- package/dist/src/tasks/task-run-coordinator.d.ts +2 -2
- package/dist/src/tasks/task-run-coordinator.js +14 -12
- package/dist/src/tui/backends/embedded-backend.js +1 -1
- package/package.json +3 -3
- package/dist/gateway/static/root/assets/messages-CTSgFlE4.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-cache-ZrbGRiGY.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-D4EMxWAZ.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-DVb7nrXz.js +0 -1
- package/dist/src/agent/coding/turn-diff-tracker.d.ts +0 -67
- package/dist/src/agent/coding/turn-diff-tracker.js +0 -231
- package/dist/src/agent/middleware/self-verify.d.ts +0 -136
- package/dist/src/agent/middleware/self-verify.js +0 -380
- package/dist/src/agent/tools/execute-code-tool.d.ts +0 -11
- 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,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)
|
|
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,
|
|
84
|
-
|
|
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
|
|
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 (
|
|
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).
|
|
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
|
-
|
|
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.
|
|
47
|
-
|
|
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";
|