@getpaseo/server 0.1.100 → 0.1.102-beta.2
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/scripts/supervisor.js +26 -8
- package/dist/server/executable-resolution/windows.js +3 -0
- package/dist/server/server/agent/activity-curator.d.ts +17 -0
- package/dist/server/server/agent/activity-curator.js +101 -24
- package/dist/server/server/agent/agent-manager.d.ts +10 -0
- package/dist/server/server/agent/agent-manager.js +69 -27
- package/dist/server/server/agent/agent-sdk-types.d.ts +15 -2
- package/dist/server/server/agent/mcp-server.d.ts +2 -45
- package/dist/server/server/agent/mcp-server.js +45 -1985
- package/dist/server/server/agent/prompt-attachments.js +6 -2
- package/dist/server/server/agent/provider-snapshot-manager.d.ts +12 -1
- package/dist/server/server/agent/provider-snapshot-manager.js +132 -42
- package/dist/server/server/agent/providers/acp-agent.d.ts +27 -1
- package/dist/server/server/agent/providers/acp-agent.js +178 -27
- package/dist/server/server/agent/providers/claude/agent.js +111 -24
- package/dist/server/server/agent/providers/claude/query.d.ts +3 -0
- package/dist/server/server/agent/providers/claude/query.js +4 -2
- package/dist/server/server/agent/providers/codex-app-server-agent.js +6 -57
- package/dist/server/server/agent/providers/diagnostic-utils.d.ts +1 -0
- package/dist/server/server/agent/providers/diagnostic-utils.js +1 -1
- package/dist/server/server/agent/providers/generic-acp-agent.d.ts +3 -0
- package/dist/server/server/agent/providers/generic-acp-agent.js +41 -23
- package/dist/server/server/agent/providers/mock-load-test-agent.js +12 -2
- package/dist/server/server/agent/providers/opencode/paths.d.ts +2 -0
- package/dist/server/server/agent/providers/opencode/paths.js +7 -0
- package/dist/server/server/agent/providers/opencode/server-manager.d.ts +2 -0
- package/dist/server/server/agent/providers/opencode/server-manager.js +34 -5
- package/dist/server/server/agent/providers/opencode-agent.d.ts +4 -0
- package/dist/server/server/agent/providers/opencode-agent.js +14 -2
- package/dist/server/server/agent/providers/pi/agent.d.ts +5 -1
- package/dist/server/server/agent/providers/pi/agent.js +12 -3
- package/dist/server/server/agent/providers/provider-image-output.d.ts +5 -0
- package/dist/server/server/agent/providers/provider-image-output.js +61 -1
- package/dist/server/server/agent/tools/paseo-tools.d.ts +48 -0
- package/dist/server/server/agent/tools/paseo-tools.js +2119 -0
- package/dist/server/server/agent/tools/types.d.ts +36 -0
- package/dist/server/server/agent/tools/types.js +2 -0
- package/dist/server/server/bootstrap.d.ts +7 -1
- package/dist/server/server/bootstrap.js +89 -62
- package/dist/server/server/config.d.ts +2 -0
- package/dist/server/server/config.js +57 -1
- package/dist/server/server/daemon-worker.js +19 -7
- package/dist/server/server/lifecycle-reasons.d.ts +4 -0
- package/dist/server/server/lifecycle-reasons.js +6 -0
- package/dist/server/server/persisted-config.d.ts +12 -0
- package/dist/server/server/persisted-config.js +18 -2
- package/dist/server/server/process-diagnostics.d.ts +17 -0
- package/dist/server/server/process-diagnostics.js +22 -0
- package/dist/server/server/relay-transport.js +1 -0
- package/dist/server/server/resolve-worktree-creation-intent.js +3 -1
- package/dist/server/server/session/agent-updates/agent-updates-service.d.ts +59 -0
- package/dist/server/server/session/agent-updates/agent-updates-service.js +220 -0
- package/dist/server/server/session/checkout/checkout-session.d.ts +13 -15
- package/dist/server/server/session/checkout/checkout-session.js +18 -16
- package/dist/server/server/session/checkout/git-metadata-generator.d.ts +53 -0
- package/dist/server/server/session/checkout/git-metadata-generator.js +159 -0
- package/dist/server/server/session/daemon/daemon-self-update-session-controller.d.ts +32 -0
- package/dist/server/server/session/daemon/daemon-self-update-session-controller.js +88 -0
- package/dist/server/server/session/daemon/daemon-self-updater.d.ts +32 -0
- package/dist/server/server/session/daemon/daemon-self-updater.js +56 -0
- package/dist/server/server/session/daemon/daemon-session.d.ts +26 -0
- package/dist/server/server/session/daemon/daemon-session.js +50 -0
- package/dist/server/server/session/daemon/diagnostics.d.ts +41 -0
- package/dist/server/server/session/daemon/diagnostics.js +431 -0
- package/dist/server/server/session/daemon/install-origin.d.ts +7 -0
- package/dist/server/server/session/daemon/install-origin.js +64 -0
- package/dist/server/server/session/daemon/npm-global-cli.d.ts +29 -0
- package/dist/server/server/session/daemon/npm-global-cli.js +98 -0
- package/dist/server/server/session/git-mutation/git-mutation-service.d.ts +34 -0
- package/dist/server/server/session/git-mutation/git-mutation-service.js +71 -0
- package/dist/server/server/session/provider/provider-catalog-session.js +8 -4
- package/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.d.ts +36 -0
- package/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.js +134 -0
- package/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.d.ts +34 -0
- package/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.js +190 -0
- package/dist/server/server/session/workspace-scripts/workspace-scripts-service.d.ts +41 -0
- package/dist/server/server/session/workspace-scripts/workspace-scripts-service.js +100 -0
- package/dist/server/server/session.d.ts +12 -54
- package/dist/server/server/session.js +187 -970
- package/dist/server/server/speech/providers/openai/config.d.ts +1 -2
- package/dist/server/server/speech/providers/openai/config.js +13 -9
- package/dist/server/server/speech/providers/openai/runtime.js +2 -16
- package/dist/server/server/speech/providers/openai/stt.d.ts +1 -0
- package/dist/server/server/speech/providers/openai/stt.js +4 -2
- package/dist/server/server/speech/providers/openai/tts.d.ts +1 -0
- package/dist/server/server/speech/providers/openai/tts.js +1 -0
- package/dist/server/server/web-ui.d.ts +10 -0
- package/dist/server/server/web-ui.js +205 -0
- package/dist/server/server/websocket/runtime-metrics.d.ts +23 -0
- package/dist/server/server/websocket-server.d.ts +4 -2
- package/dist/server/server/websocket-server.js +215 -52
- package/dist/server/server/worktree-bootstrap.d.ts +1 -1
- package/dist/server/server/worktree-branch-name-generator.js +3 -1
- package/dist/server/services/quota-fetcher/manifest.js +5 -0
- package/dist/server/services/quota-fetcher/providers/minimax.d.ts +29 -0
- package/dist/server/services/quota-fetcher/providers/minimax.js +227 -0
- package/dist/server/terminal/agent-hooks/agent-hook-installer.js +2 -2
- package/dist/server/utils/checkout-git.js +203 -25
- package/dist/server/utils/directory-suggestions.js +1 -4
- package/dist/server/utils/path.d.ts +2 -0
- package/dist/server/utils/path.js +13 -0
- package/dist/server/utils/worktree.d.ts +1 -0
- package/dist/server/utils/worktree.js +92 -11
- package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css +1 -0
- package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.br +0 -0
- package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-b01555c9b42665a03988c0a0032ef528.js +1 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-b01555c9b42665a03988c0a0032ef528.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-b01555c9b42665a03988c0a0032ef528.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-648388eca5c510b496e1eddf523f70ff.js +1 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-648388eca5c510b496e1eddf523f70ff.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-648388eca5c510b496e1eddf523f70ff.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-0ebbea2cd337f0c0680fdb3f8d4d5af3.js +16157 -0
- package/dist/server/web-ui/_expo/static/js/web/index-0ebbea2cd337f0c0680fdb3f8d4d5af3.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-0ebbea2cd337f0c0680fdb3f8d4d5af3.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-c64fa2416284927857a39087fd8d1332.js +1 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-c64fa2416284927857a39087fd8d1332.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-c64fa2416284927857a39087fd8d1332.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-a9784226715772edf87ef36c596599c2.js +3 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-a9784226715772edf87ef36c596599c2.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-a9784226715772edf87ef36c596599c2.js.gz +0 -0
- package/dist/server/web-ui/apple-touch-icon.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon-mask.0a328cd9c1afd0afe8e3b1ec5165b1b4.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon.35ba0eaec5a4f5ed12ca16fabeae451d.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@2x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@3x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@4x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@2x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@3x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@4x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/search-icon.286d67d3f74808a60a78d3ebf1a5fb57.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/arrow_down.017bc6ba3fc25503e5eb5e53826d48a8.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/error.d1ea1496f9057eb392d5bbf3732a61b7.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/file.19eeb73b9593a38f8e9f418337fc7d10.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/forward.d8b800c443b8972542883e0b9de2bdc6.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/pkg.ab19f4cbc543357183a20571f68380a3.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/sitemap.412dd9275b6b48ad28f5e3d81bb1f626.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/unmatched.20e71bdf79e3a97bf55fd9e164041578.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/antigravity.6e91a685c33435e0b466a56db86cf141.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/cursor.c31d6bce4fe9aadc3fe59962f4c4fcf3.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/file-explorer.3e15e8f72c825c85ce336bcb0cdef776.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/finder.7f68fc2c475621a672e1be09309d5567.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/vscode.832bdb4c685d930f1c864c793703600b.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/webstorm.aa5dc2cd8c20cc0a155c4c5c5ab3c5f5.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/zed.f3a670b7f9aa226da4fe53fb86f1abbd.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-dark-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-dark-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-dark.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-light-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-light-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-light.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
- package/dist/server/web-ui/assets/assets/images/notification-icon.3bf81d33ddbf380606bdd248ba83e158.png +0 -0
- package/dist/server/web-ui/favicon.ico +0 -0
- package/dist/server/web-ui/index.html +90 -0
- package/dist/server/web-ui/index.html.br +0 -0
- package/dist/server/web-ui/index.html.gz +0 -0
- package/dist/server/web-ui/manifest.json +27 -0
- package/dist/server/web-ui/manifest.json.br +0 -0
- package/dist/server/web-ui/manifest.json.gz +0 -0
- package/dist/server/web-ui/metadata.json +1 -0
- package/dist/server/web-ui/metadata.json.br +1 -0
- package/dist/server/web-ui/metadata.json.gz +0 -0
- package/dist/server/web-ui/pwa-icon-192.png +0 -0
- package/dist/server/web-ui/pwa-icon-512.png +0 -0
- package/dist/server/web-ui/robots.txt +2 -0
- package/dist/src/executable-resolution/windows.js +3 -0
- package/dist/src/server/persisted-config.js +18 -2
- package/package.json +7 -7
- package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts +0 -42
- package/dist/server/server/speech/providers/openai/realtime-transcription-session.js +0 -168
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { getAgentStreamEventTurnId, } from "../agent-sdk-types.js";
|
|
2
2
|
import { importSessionFromPersistence } from "../provider-session-import.js";
|
|
3
3
|
import { randomUUID } from "node:crypto";
|
|
4
|
-
import * as fsSync from "node:fs";
|
|
5
4
|
import fs from "node:fs/promises";
|
|
6
5
|
import os from "node:os";
|
|
7
6
|
import path from "node:path";
|
|
@@ -18,7 +17,7 @@ import { extractCodexTerminalSessionId, nonEmptyString } from "./tool-call-mappe
|
|
|
18
17
|
import { buildCodexFeatures, codexModelSupportsFastMode } from "./codex-feature-definitions.js";
|
|
19
18
|
import { CodexAppServerClient, parseCodexThreadForkResponse, parseCodexThreadRollbackResponse, } from "./codex/app-server-transport.js";
|
|
20
19
|
import { revertCodexConversation } from "./codex/rewind.js";
|
|
21
|
-
import { renderProviderImageOutputAsAssistantMarkdown, } from "./provider-image-output.js";
|
|
20
|
+
import { materializeProviderImage, renderProviderImageOutputAsAssistantMarkdown, } from "./provider-image-output.js";
|
|
22
21
|
import { normalizeProviderReplayTimestamp } from "../provider-history-timestamps.js";
|
|
23
22
|
import { formatProviderDiagnostic, formatProviderDiagnosticError, buildBinaryDiagnosticRows, buildCommandResolutionDiagnosticRows, resolveBinaryVersion, } from "./diagnostic-utils.js";
|
|
24
23
|
import { runProviderTurn } from "./provider-runner.js";
|
|
@@ -38,7 +37,6 @@ function isCodexAlreadyUnarchivedError(error, threadId) {
|
|
|
38
37
|
const TURN_START_TIMEOUT_MS = 90 * 1000;
|
|
39
38
|
const INTERRUPT_TIMEOUT_MS = 2000;
|
|
40
39
|
const CODEX_PROVIDER = "codex";
|
|
41
|
-
const CODEX_IMAGE_ATTACHMENT_DIR = "paseo-attachments";
|
|
42
40
|
// Codex treats most app-server client names as the model-request originator.
|
|
43
41
|
// This reserved Codex name is non-originating, so requests keep Codex's default
|
|
44
42
|
// CLI identity instead of showing up as Paseo in provider usage logs.
|
|
@@ -1220,21 +1218,6 @@ function codexImageOutputFromResult(result) {
|
|
|
1220
1218
|
mimeType: firstStringField(resultRecord, ["mimeType", "mime_type"]),
|
|
1221
1219
|
};
|
|
1222
1220
|
}
|
|
1223
|
-
function writeImageAttachmentSync(mimeType, data) {
|
|
1224
|
-
const attachmentsDir = path.join(os.tmpdir(), CODEX_IMAGE_ATTACHMENT_DIR);
|
|
1225
|
-
fsSync.mkdirSync(attachmentsDir, { recursive: true });
|
|
1226
|
-
const normalized = normalizeImageData(mimeType, data);
|
|
1227
|
-
const extension = getImageExtension(normalized.mimeType);
|
|
1228
|
-
const filename = `${randomUUID()}.${extension}`;
|
|
1229
|
-
const filePath = path.join(attachmentsDir, filename);
|
|
1230
|
-
fsSync.writeFileSync(filePath, Buffer.from(normalized.data, "base64"));
|
|
1231
|
-
return filePath;
|
|
1232
|
-
}
|
|
1233
|
-
function materializeCodexImageOutput(image) {
|
|
1234
|
-
return {
|
|
1235
|
-
path: writeImageAttachmentSync(image.mimeType ?? "image/png", image.data),
|
|
1236
|
-
};
|
|
1237
|
-
}
|
|
1238
1221
|
function mapCodexThreadImageItem(normalizedType, normalizedItem) {
|
|
1239
1222
|
if (normalizedType === "imageView") {
|
|
1240
1223
|
return renderProviderImageOutputAsAssistantMarkdown({
|
|
@@ -1248,7 +1231,7 @@ function mapCodexThreadImageItem(normalizedType, normalizedItem) {
|
|
|
1248
1231
|
url: result?.url ?? null,
|
|
1249
1232
|
data: result?.data ?? null,
|
|
1250
1233
|
mimeType: result?.mimeType ?? null,
|
|
1251
|
-
}, { materialize:
|
|
1234
|
+
}, { materialize: materializeProviderImage });
|
|
1252
1235
|
}
|
|
1253
1236
|
export function threadItemToTimeline(item, options) {
|
|
1254
1237
|
const itemRecord = toObjectRecord(item);
|
|
@@ -1357,33 +1340,6 @@ function toSandboxPolicy(type, networkAccess) {
|
|
|
1357
1340
|
return { type: "workspaceWrite", networkAccess: networkAccess ?? false };
|
|
1358
1341
|
}
|
|
1359
1342
|
}
|
|
1360
|
-
function getImageExtension(mimeType) {
|
|
1361
|
-
switch (mimeType) {
|
|
1362
|
-
case "image/jpeg":
|
|
1363
|
-
return "jpg";
|
|
1364
|
-
case "image/png":
|
|
1365
|
-
return "png";
|
|
1366
|
-
case "image/webp":
|
|
1367
|
-
return "webp";
|
|
1368
|
-
case "image/gif":
|
|
1369
|
-
return "gif";
|
|
1370
|
-
case "image/bmp":
|
|
1371
|
-
return "bmp";
|
|
1372
|
-
case "image/tiff":
|
|
1373
|
-
return "tiff";
|
|
1374
|
-
default:
|
|
1375
|
-
return "bin";
|
|
1376
|
-
}
|
|
1377
|
-
}
|
|
1378
|
-
function normalizeImageData(mimeType, data) {
|
|
1379
|
-
if (data.startsWith("data:")) {
|
|
1380
|
-
const match = data.match(/^data:([^;]+);base64,(.*)$/);
|
|
1381
|
-
if (match) {
|
|
1382
|
-
return { mimeType: match[1], data: match[2] };
|
|
1383
|
-
}
|
|
1384
|
-
}
|
|
1385
|
-
return { mimeType, data };
|
|
1386
|
-
}
|
|
1387
1343
|
const ThreadStartedNotificationSchema = z
|
|
1388
1344
|
.object({
|
|
1389
1345
|
thread: z.object({ id: z.string() }).passthrough(),
|
|
@@ -2008,16 +1964,6 @@ const CodexNotificationSchema = z.union([
|
|
|
2008
1964
|
.object({ method: z.string(), params: z.unknown() })
|
|
2009
1965
|
.transform(({ method, params }) => ({ kind: "unknown_method", method, params })),
|
|
2010
1966
|
]);
|
|
2011
|
-
async function writeImageAttachment(mimeType, data) {
|
|
2012
|
-
const attachmentsDir = path.join(os.tmpdir(), CODEX_IMAGE_ATTACHMENT_DIR);
|
|
2013
|
-
await fs.mkdir(attachmentsDir, { recursive: true });
|
|
2014
|
-
const normalized = normalizeImageData(mimeType, data);
|
|
2015
|
-
const extension = getImageExtension(normalized.mimeType);
|
|
2016
|
-
const filename = `${randomUUID()}.${extension}`;
|
|
2017
|
-
const filePath = path.join(attachmentsDir, filename);
|
|
2018
|
-
await fs.writeFile(filePath, Buffer.from(normalized.data, "base64"));
|
|
2019
|
-
return filePath;
|
|
2020
|
-
}
|
|
2021
1967
|
async function readCodexConfiguredDefaults(client, logger) {
|
|
2022
1968
|
let savedConfigDefaults = {};
|
|
2023
1969
|
try {
|
|
@@ -2071,7 +2017,10 @@ export async function codexAppServerTurnInputFromPrompt(prompt, logger) {
|
|
|
2071
2017
|
}
|
|
2072
2018
|
if (block.type === "image") {
|
|
2073
2019
|
try {
|
|
2074
|
-
const filePath =
|
|
2020
|
+
const filePath = materializeProviderImage({
|
|
2021
|
+
data: block.data,
|
|
2022
|
+
mimeType: block.mimeType,
|
|
2023
|
+
}).path;
|
|
2075
2024
|
output.push({ type: "localImage", path: filePath });
|
|
2076
2025
|
}
|
|
2077
2026
|
catch (error) {
|
|
@@ -10,6 +10,7 @@ export declare function formatDiagnosticStatus(available: boolean, error?: {
|
|
|
10
10
|
source: string;
|
|
11
11
|
cause: unknown;
|
|
12
12
|
}): string;
|
|
13
|
+
export declare function truncateForDiagnostic(value: string): string;
|
|
13
14
|
export declare function toDiagnosticErrorMessage(error: unknown): string;
|
|
14
15
|
export declare function resolveBinaryVersion(binaryPath: string): Promise<string>;
|
|
15
16
|
export interface BinaryDiagnosticVersionCommand {
|
|
@@ -24,7 +24,7 @@ export function formatDiagnosticStatus(available, error) {
|
|
|
24
24
|
return formatAvailabilityStatus(available);
|
|
25
25
|
}
|
|
26
26
|
const DIAGNOSTIC_OUTPUT_CAP = 4096;
|
|
27
|
-
function truncateForDiagnostic(value) {
|
|
27
|
+
export function truncateForDiagnostic(value) {
|
|
28
28
|
const trimmed = value.trim();
|
|
29
29
|
if (trimmed.length <= DIAGNOSTIC_OUTPUT_CAP) {
|
|
30
30
|
return trimmed;
|
|
@@ -13,11 +13,13 @@ interface GenericACPAgentClientOptions {
|
|
|
13
13
|
providerParams?: unknown;
|
|
14
14
|
waitForInitialCommands?: boolean;
|
|
15
15
|
initialCommandsWaitTimeoutMs?: number;
|
|
16
|
+
diagnosticPhaseTimeoutMs?: number;
|
|
16
17
|
}
|
|
17
18
|
export declare class GenericACPAgentClient extends ACPAgentClient {
|
|
18
19
|
private readonly command;
|
|
19
20
|
private readonly providerId?;
|
|
20
21
|
private readonly label?;
|
|
22
|
+
private readonly diagnosticPhaseTimeoutMs?;
|
|
21
23
|
constructor(options: GenericACPAgentClientOptions);
|
|
22
24
|
protected resolveLaunchCommand(): Promise<{
|
|
23
25
|
command: string;
|
|
@@ -28,6 +30,7 @@ export declare class GenericACPAgentClient extends ACPAgentClient {
|
|
|
28
30
|
diagnostic: string;
|
|
29
31
|
}>;
|
|
30
32
|
private resolveConfiguredLaunch;
|
|
33
|
+
private getACPProbeRowsForDiagnostic;
|
|
31
34
|
}
|
|
32
35
|
export interface CommandInvocation {
|
|
33
36
|
command: string;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { checkProviderLaunchAvailable, resolveProviderLaunch } from "../provider-launch-config.js";
|
|
3
3
|
import { ACPAgentClient, DEFAULT_ACP_CAPABILITIES } from "./acp-agent.js";
|
|
4
|
-
import {
|
|
4
|
+
import { buildBinaryDiagnosticRows, formatProviderDiagnostic, toDiagnosticErrorMessage, } from "./diagnostic-utils.js";
|
|
5
5
|
export const GenericACPProviderParamsSchema = z
|
|
6
6
|
.object({
|
|
7
7
|
supportsMcpServers: z.boolean().optional(),
|
|
@@ -23,6 +23,7 @@ export class GenericACPAgentClient extends ACPAgentClient {
|
|
|
23
23
|
this.command = options.command;
|
|
24
24
|
this.providerId = options.providerId;
|
|
25
25
|
this.label = options.label;
|
|
26
|
+
this.diagnosticPhaseTimeoutMs = options.diagnosticPhaseTimeoutMs;
|
|
26
27
|
}
|
|
27
28
|
async resolveLaunchCommand() {
|
|
28
29
|
return {
|
|
@@ -37,34 +38,36 @@ export class GenericACPAgentClient extends ACPAgentClient {
|
|
|
37
38
|
}
|
|
38
39
|
async getDiagnostic() {
|
|
39
40
|
const providerName = formatProviderName(this.label, this.providerId);
|
|
41
|
+
const entries = [
|
|
42
|
+
{ label: "Provider ID", value: this.providerId ?? "unknown" },
|
|
43
|
+
{ label: "Configured command", value: this.command.join(" ") },
|
|
44
|
+
];
|
|
45
|
+
const versionProbe = buildVersionProbeCommand(this.command);
|
|
40
46
|
try {
|
|
41
47
|
const launch = await this.resolveConfiguredLaunch();
|
|
42
48
|
const availability = await checkProviderLaunchAvailable(launch);
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
command: versionProbe.command,
|
|
52
|
-
args: versionProbe.args,
|
|
53
|
-
env: this.runtimeSettings?.env,
|
|
54
|
-
},
|
|
55
|
-
})),
|
|
56
|
-
{
|
|
57
|
-
label: "Version command",
|
|
58
|
-
value: formatCommand(versionProbe.command, versionProbe.args),
|
|
59
|
-
},
|
|
60
|
-
]),
|
|
61
|
-
};
|
|
49
|
+
entries.push(...(await buildBinaryDiagnosticRows(launch, availability, {
|
|
50
|
+
binaryLabel: "Launcher binary",
|
|
51
|
+
versionCommand: {
|
|
52
|
+
command: versionProbe.command,
|
|
53
|
+
args: versionProbe.args,
|
|
54
|
+
env: this.runtimeSettings?.env,
|
|
55
|
+
},
|
|
56
|
+
})));
|
|
62
57
|
}
|
|
63
58
|
catch (error) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
59
|
+
entries.push({
|
|
60
|
+
label: "Launcher binary",
|
|
61
|
+
value: `error: ${toDiagnosticErrorMessage(error)}`,
|
|
62
|
+
});
|
|
67
63
|
}
|
|
64
|
+
entries.push({
|
|
65
|
+
label: "Version command",
|
|
66
|
+
value: formatCommand(versionProbe.command, versionProbe.args),
|
|
67
|
+
}, ...(await this.getACPProbeRowsForDiagnostic()));
|
|
68
|
+
return {
|
|
69
|
+
diagnostic: formatProviderDiagnostic(providerName, entries),
|
|
70
|
+
};
|
|
68
71
|
}
|
|
69
72
|
async resolveConfiguredLaunch() {
|
|
70
73
|
return resolveProviderLaunch({
|
|
@@ -72,6 +75,21 @@ export class GenericACPAgentClient extends ACPAgentClient {
|
|
|
72
75
|
defaultBinary: this.command[0],
|
|
73
76
|
});
|
|
74
77
|
}
|
|
78
|
+
async getACPProbeRowsForDiagnostic() {
|
|
79
|
+
try {
|
|
80
|
+
return await this.buildACPProbeDiagnosticRows({
|
|
81
|
+
phaseTimeoutMs: this.diagnosticPhaseTimeoutMs,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
return [
|
|
86
|
+
{
|
|
87
|
+
label: "ACP probe",
|
|
88
|
+
value: `error: ${toDiagnosticErrorMessage(error)}`,
|
|
89
|
+
},
|
|
90
|
+
];
|
|
91
|
+
}
|
|
92
|
+
}
|
|
75
93
|
}
|
|
76
94
|
function buildGenericACPCapabilities(options) {
|
|
77
95
|
const params = parseGenericACPProviderParams(options.providerParams);
|
|
@@ -167,7 +167,7 @@ function parseAgentStreamStressPrompt(prompt) {
|
|
|
167
167
|
}
|
|
168
168
|
function parseStructuredBranchNamePrompt(prompt) {
|
|
169
169
|
const text = promptToText(prompt);
|
|
170
|
-
const hasBranchNamePrompt = text.includes("Generate a git branch name for a coding agent") &&
|
|
170
|
+
const hasBranchNamePrompt = text.includes("Generate a title and a git branch name for a coding agent") &&
|
|
171
171
|
(text.includes("Return JSON only with fields 'title' and 'branch'.") ||
|
|
172
172
|
text.includes('"title"') ||
|
|
173
173
|
text.includes('"branch"'));
|
|
@@ -177,7 +177,9 @@ function parseStructuredBranchNamePrompt(prompt) {
|
|
|
177
177
|
text.includes('"branch"'))) {
|
|
178
178
|
return null;
|
|
179
179
|
}
|
|
180
|
-
const seed = text.
|
|
180
|
+
const seed = text.match(/<user-prompt>\n([\s\S]*?)\n<\/user-prompt>/)?.[1]?.trim() ??
|
|
181
|
+
text.match(/<attachments>\n([\s\S]*?)\n<\/attachments>/)?.[1]?.trim() ??
|
|
182
|
+
"";
|
|
181
183
|
const firstLine = seed
|
|
182
184
|
.split("\n")
|
|
183
185
|
.find((line) => line.trim().length > 0)
|
|
@@ -437,12 +439,14 @@ export class MockLoadTestAgentSession {
|
|
|
437
439
|
}
|
|
438
440
|
const profile = resolveModelProfile(this.modelId);
|
|
439
441
|
const turnId = randomUUID();
|
|
442
|
+
const assistantMessageId = randomUUID();
|
|
440
443
|
let resolve;
|
|
441
444
|
const completed = new Promise((promiseResolve) => {
|
|
442
445
|
resolve = promiseResolve;
|
|
443
446
|
});
|
|
444
447
|
const turn = {
|
|
445
448
|
turnId,
|
|
449
|
+
assistantMessageId,
|
|
446
450
|
prompt,
|
|
447
451
|
startedAt: Date.now(),
|
|
448
452
|
cycle: 0,
|
|
@@ -653,6 +657,7 @@ export class MockLoadTestAgentSession {
|
|
|
653
657
|
this.emitTimeline(turn.turnId, {
|
|
654
658
|
type: "assistant_message",
|
|
655
659
|
text: finalText,
|
|
660
|
+
messageId: turn.assistantMessageId,
|
|
656
661
|
});
|
|
657
662
|
this.activeTurn = null;
|
|
658
663
|
this.emit({
|
|
@@ -667,6 +672,7 @@ export class MockLoadTestAgentSession {
|
|
|
667
672
|
{
|
|
668
673
|
type: "assistant_message",
|
|
669
674
|
text: finalText,
|
|
675
|
+
messageId: turn.assistantMessageId,
|
|
670
676
|
},
|
|
671
677
|
],
|
|
672
678
|
canceled: false,
|
|
@@ -766,6 +772,7 @@ export class MockLoadTestAgentSession {
|
|
|
766
772
|
? {
|
|
767
773
|
type: "assistant_message",
|
|
768
774
|
text: `stress-update-${index}`,
|
|
775
|
+
messageId: turn.assistantMessageId,
|
|
769
776
|
}
|
|
770
777
|
: {
|
|
771
778
|
type: "todo",
|
|
@@ -832,6 +839,7 @@ export class MockLoadTestAgentSession {
|
|
|
832
839
|
this.emitTimeline(turn.turnId, {
|
|
833
840
|
type: "assistant_message",
|
|
834
841
|
text: `data:image/png;base64,${payload}`,
|
|
842
|
+
messageId: turn.assistantMessageId,
|
|
835
843
|
});
|
|
836
844
|
}
|
|
837
845
|
this.activeTurn = null;
|
|
@@ -890,6 +898,7 @@ export class MockLoadTestAgentSession {
|
|
|
890
898
|
this.emitTimeline(turn.turnId, {
|
|
891
899
|
type: "assistant_message",
|
|
892
900
|
text: event.text,
|
|
901
|
+
messageId: turn.assistantMessageId,
|
|
893
902
|
});
|
|
894
903
|
return;
|
|
895
904
|
}
|
|
@@ -931,6 +940,7 @@ export class MockLoadTestAgentSession {
|
|
|
931
940
|
this.emitTimeline(turn.turnId, {
|
|
932
941
|
type: "assistant_message",
|
|
933
942
|
text: "\n\n_(end of synthetic stream)_\n",
|
|
943
|
+
messageId: turn.assistantMessageId,
|
|
934
944
|
});
|
|
935
945
|
this.finishTurnWithText(turn, "Synthetic load test complete");
|
|
936
946
|
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { resolvePaseoHome } from "../../../paseo-home.js";
|
|
3
|
+
const OPENCODE_HOME_DIRNAME = "opencode-home";
|
|
4
|
+
export function resolveOpenCodeHomeDir(env = process.env) {
|
|
5
|
+
return path.join(resolvePaseoHome(env), OPENCODE_HOME_DIRNAME);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -46,6 +46,7 @@ export interface OpenCodeServerManagerOptions {
|
|
|
46
46
|
terminateProcess?: ProcessTerminator;
|
|
47
47
|
portAllocator?: OpenCodePortAllocator;
|
|
48
48
|
resolveCommandPrefix?: OpenCodeCommandPrefixResolver;
|
|
49
|
+
resolveHomeDir?: () => string;
|
|
49
50
|
spawnServerProcess?: OpenCodeServerProcessSpawner;
|
|
50
51
|
}
|
|
51
52
|
export declare class OpenCodeServerManager implements OpenCodeServerManagerLike {
|
|
@@ -62,6 +63,7 @@ export declare class OpenCodeServerManager implements OpenCodeServerManagerLike
|
|
|
62
63
|
private readonly terminateProcess;
|
|
63
64
|
private readonly portAllocator;
|
|
64
65
|
private readonly resolveCommandPrefix;
|
|
66
|
+
private readonly resolveHomeDir;
|
|
65
67
|
private readonly spawnServerProcess;
|
|
66
68
|
constructor(options: OpenCodeServerManagerOptions);
|
|
67
69
|
static getInstance(logger: Logger, runtimeSettings?: ProviderRuntimeSettings, options?: Omit<OpenCodeServerManagerOptions, "logger" | "runtimeSettings">): OpenCodeServerManager;
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import { mkdirSync } from "node:fs";
|
|
2
|
+
import { stat } from "node:fs/promises";
|
|
1
3
|
import net from "node:net";
|
|
2
|
-
import
|
|
4
|
+
import path from "node:path";
|
|
3
5
|
import { findExecutable } from "../../../../executable-resolution/executable-resolution.js";
|
|
4
6
|
import { spawnProcess } from "../../../../utils/spawn.js";
|
|
5
7
|
import { terminateWithTreeKill } from "../../../../utils/tree-kill.js";
|
|
6
8
|
import { createProviderEnvSpec, resolveProviderCommandPrefix, } from "../../provider-launch-config.js";
|
|
9
|
+
import { resolveOpenCodeHomeDir } from "./paths.js";
|
|
7
10
|
const OPENCODE_SERVER_GRACEFUL_SHUTDOWN_TIMEOUT_MS = 5000;
|
|
8
11
|
const OPENCODE_SERVER_FORCE_SHUTDOWN_TIMEOUT_MS = 1000;
|
|
9
12
|
export class OpenCodeServerManager {
|
|
@@ -21,6 +24,7 @@ export class OpenCodeServerManager {
|
|
|
21
24
|
this.resolveCommandPrefix =
|
|
22
25
|
options.resolveCommandPrefix ??
|
|
23
26
|
(() => resolveProviderCommandPrefix(this.runtimeSettings?.command, resolveOpenCodeBinary));
|
|
27
|
+
this.resolveHomeDir = options.resolveHomeDir ?? resolveOpenCodeHomeDir;
|
|
24
28
|
this.spawnServerProcess = options.spawnServerProcess ?? spawnProcess;
|
|
25
29
|
}
|
|
26
30
|
static getInstance(logger, runtimeSettings, options = {}) {
|
|
@@ -164,7 +168,11 @@ export class OpenCodeServerManager {
|
|
|
164
168
|
const url = `http://127.0.0.1:${port}`;
|
|
165
169
|
const launchPrefix = await this.resolveCommandPrefix();
|
|
166
170
|
const serverArgs = [...launchPrefix.args, "serve", "--port", String(port)];
|
|
167
|
-
|
|
171
|
+
// Use a neutral OpenCode home as the server cwd. Launching from the user's
|
|
172
|
+
// home directory causes OpenCode to treat it as the default workspace and
|
|
173
|
+
// index the entire home tree.
|
|
174
|
+
const serverCwd = this.resolveHomeDir();
|
|
175
|
+
mkdirSync(serverCwd, { recursive: true });
|
|
168
176
|
const serverProcess = this.spawnServerProcess(launchPrefix.command, serverArgs, {
|
|
169
177
|
cwd: serverCwd,
|
|
170
178
|
detached: process.platform !== "win32",
|
|
@@ -371,10 +379,31 @@ OpenCodeServerManager.instance = null;
|
|
|
371
379
|
OpenCodeServerManager.exitHandlerRegistered = false;
|
|
372
380
|
async function resolveOpenCodeBinary() {
|
|
373
381
|
const found = await findExecutable("opencode");
|
|
374
|
-
if (found) {
|
|
375
|
-
|
|
382
|
+
if (!found) {
|
|
383
|
+
throw new Error("OpenCode binary not found. Install OpenCode (https://github.com/opencode-ai/opencode) and ensure it is available in your shell PATH.");
|
|
384
|
+
}
|
|
385
|
+
if (process.platform === "win32" && path.extname(found).toLowerCase() === ".cmd") {
|
|
386
|
+
// Global npm: <prefix>/opencode.cmd → <prefix>/node_modules/opencode-ai/bin/opencode.exe
|
|
387
|
+
const globalCandidate = path.join(path.dirname(found), "node_modules", "opencode-ai", "bin", "opencode.exe");
|
|
388
|
+
if (await pathExists(globalCandidate))
|
|
389
|
+
return globalCandidate;
|
|
390
|
+
// Local/pnpm: <project>/node_modules/.bin/opencode.cmd → <project>/node_modules/opencode-ai/bin/opencode.exe
|
|
391
|
+
const localCandidate = path.join(path.dirname(found), "..", "opencode-ai", "bin", "opencode.exe");
|
|
392
|
+
if (await pathExists(localCandidate))
|
|
393
|
+
return localCandidate;
|
|
394
|
+
console.warn("[opencode-server] Found opencode.cmd but could not resolve the real opencode.exe. " +
|
|
395
|
+
"The process may not be properly terminated on exit. Path: %s", found);
|
|
396
|
+
}
|
|
397
|
+
return found;
|
|
398
|
+
}
|
|
399
|
+
async function pathExists(filePath) {
|
|
400
|
+
try {
|
|
401
|
+
await stat(filePath);
|
|
402
|
+
return true;
|
|
403
|
+
}
|
|
404
|
+
catch {
|
|
405
|
+
return false;
|
|
376
406
|
}
|
|
377
|
-
throw new Error("OpenCode binary not found. Install OpenCode (https://github.com/opencode-ai/opencode) and ensure it is available in your shell PATH.");
|
|
378
407
|
}
|
|
379
408
|
function findAvailablePort() {
|
|
380
409
|
return new Promise((resolve, reject) => {
|
|
@@ -4,6 +4,7 @@ import { type AgentCapabilityFlags, type AgentClient, type AgentCreateSessionOpt
|
|
|
4
4
|
import { isDefaultAgentCreateConfigUnattended } from "../create-agent-mode.js";
|
|
5
5
|
import { type ProviderRuntimeSettings } from "../provider-launch-config.js";
|
|
6
6
|
import { type OpenCodeServerManagerLike } from "./opencode/server-manager.js";
|
|
7
|
+
import { resolveOpenCodeHomeDir } from "./opencode/paths.js";
|
|
7
8
|
import type { ManagedProcessRegistry } from "../../managed-processes/managed-processes.js";
|
|
8
9
|
declare function resolveOpenCodeCreateConfig(input: ResolveAgentCreateConfigInput): ResolveAgentCreateConfigResult;
|
|
9
10
|
declare function isOpenCodeCreateConfigUnattended(input: Parameters<typeof isDefaultAgentCreateConfigUnattended>[0]): boolean;
|
|
@@ -100,11 +101,13 @@ export declare const __openCodeInternals: {
|
|
|
100
101
|
resolveOpenCodeSelectedModelContextWindow: typeof resolveOpenCodeSelectedModelContextWindow;
|
|
101
102
|
isSelectableOpenCodeAgent: typeof isSelectableOpenCodeAgent;
|
|
102
103
|
mapOpenCodeAgentToMode: typeof mapOpenCodeAgentToMode;
|
|
104
|
+
resolveOpenCodeHomeDir: typeof resolveOpenCodeHomeDir;
|
|
103
105
|
readonly OpenCodeAgentSession: typeof OpenCodeAgentSession;
|
|
104
106
|
};
|
|
105
107
|
interface OpenCodeAgentClientDeps {
|
|
106
108
|
serverManager?: OpenCodeServerManagerLike;
|
|
107
109
|
createClient?: OpenCodeClientFactory;
|
|
110
|
+
resolveHomeDir?: () => string;
|
|
108
111
|
managedProcesses?: ManagedProcessRegistry;
|
|
109
112
|
}
|
|
110
113
|
type OpenCodeClientFactory = (options: {
|
|
@@ -118,6 +121,7 @@ export declare class OpenCodeAgentClient implements AgentClient {
|
|
|
118
121
|
readonly isCreateConfigUnattended: typeof isOpenCodeCreateConfigUnattended;
|
|
119
122
|
private readonly serverManager;
|
|
120
123
|
private readonly createOpenCodeClient;
|
|
124
|
+
private readonly resolveHomeDir;
|
|
121
125
|
private readonly logger;
|
|
122
126
|
private readonly runtimeSettings?;
|
|
123
127
|
private readonly modelContextWindows;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createOpencodeClient, } from "@opencode-ai/sdk/v2/client";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
2
3
|
import { createPathEquivalenceMatcher } from "../../../utils/path.js";
|
|
3
4
|
import pLimit from "p-limit";
|
|
4
5
|
import { z } from "zod";
|
|
@@ -11,6 +12,7 @@ import { execCommand } from "../../../utils/spawn.js";
|
|
|
11
12
|
import { buildToolCallDisplayModel } from "@getpaseo/protocol/tool-call-display";
|
|
12
13
|
import { mapOpencodeToolCall } from "./opencode/tool-call-mapper.js";
|
|
13
14
|
import { OpenCodeServerManager, } from "./opencode/server-manager.js";
|
|
15
|
+
import { resolveOpenCodeHomeDir } from "./opencode/paths.js";
|
|
14
16
|
import { formatProviderDiagnostic, formatProviderDiagnosticError, buildBinaryDiagnosticRows, buildCommandResolutionDiagnosticRows, toDiagnosticErrorMessage, } from "./diagnostic-utils.js";
|
|
15
17
|
import { runProviderTurn } from "./provider-runner.js";
|
|
16
18
|
import { renderPromptAttachmentAsText } from "../prompt-attachments.js";
|
|
@@ -847,6 +849,7 @@ export const __openCodeInternals = {
|
|
|
847
849
|
resolveOpenCodeSelectedModelContextWindow,
|
|
848
850
|
isSelectableOpenCodeAgent,
|
|
849
851
|
mapOpenCodeAgentToMode,
|
|
852
|
+
resolveOpenCodeHomeDir,
|
|
850
853
|
get OpenCodeAgentSession() {
|
|
851
854
|
return OpenCodeAgentSession;
|
|
852
855
|
},
|
|
@@ -867,8 +870,10 @@ export class OpenCodeAgentClient {
|
|
|
867
870
|
deps.serverManager ??
|
|
868
871
|
OpenCodeServerManager.getInstance(this.logger, runtimeSettings, {
|
|
869
872
|
managedProcesses: deps.managedProcesses,
|
|
873
|
+
resolveHomeDir: deps.resolveHomeDir,
|
|
870
874
|
});
|
|
871
875
|
this.createOpenCodeClient = deps.createClient ?? createSdkOpenCodeClient;
|
|
876
|
+
this.resolveHomeDir = deps.resolveHomeDir ?? resolveOpenCodeHomeDir;
|
|
872
877
|
}
|
|
873
878
|
async createSession(config, launchContext, options) {
|
|
874
879
|
const openCodeConfig = this.assertConfig(config);
|
|
@@ -930,9 +935,16 @@ export class OpenCodeAgentClient {
|
|
|
930
935
|
? await this.serverManager.acquireNew()
|
|
931
936
|
: await this.serverManager.acquireCurrent();
|
|
932
937
|
const { url } = acquisition.server;
|
|
933
|
-
const
|
|
934
|
-
const client = this.createOpenCodeClient({ baseUrl: url, directory });
|
|
938
|
+
const isGlobalCatalog = options.scope === "global";
|
|
935
939
|
try {
|
|
940
|
+
// OpenCode treats the catalog directory as a workspace. The global catalog
|
|
941
|
+
// is not a project, so use the neutral OpenCode home instead of user home.
|
|
942
|
+
const directory = isGlobalCatalog ? this.resolveHomeDir() : options.cwd;
|
|
943
|
+
if (isGlobalCatalog) {
|
|
944
|
+
await fs.mkdir(directory, { recursive: true });
|
|
945
|
+
this.logger.debug({ directory }, "opencode catalog refresh: using opencode-home for global provider catalog");
|
|
946
|
+
}
|
|
947
|
+
const client = this.createOpenCodeClient({ baseUrl: url, directory });
|
|
936
948
|
const [models, modes] = await Promise.all([
|
|
937
949
|
this.fetchModelsFromClient(client, directory),
|
|
938
950
|
this.fetchModesFromClient(client, directory),
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import type { Logger } from "pino";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
import { type AgentCapabilityFlags, type AgentClient, type AgentLaunchContext, type AgentMode, type AgentModelDefinition, type AgentPermissionRequest, type AgentPermissionResponse, type AgentPersistenceHandle, type AgentPromptInput, type AgentRunOptions, type AgentRunResult, type AgentRuntimeInfo, type AgentSession, type AgentSessionConfig, type AgentSlashCommand, type AgentStreamEvent, type FetchCatalogOptions, type ImportableProviderSession, type ImportProviderSessionContext, type ImportProviderSessionInput, type ListImportableSessionsOptions, type ProviderCatalog } from "../../agent-sdk-types.js";
|
|
3
|
+
import { type AgentCapabilityFlags, type AgentClient, type AgentFeature, type AgentLaunchContext, type AgentMode, type AgentModelDefinition, type AgentPermissionRequest, type AgentPermissionResponse, type AgentPersistenceHandle, type AgentPromptInput, type AgentRunOptions, type AgentRunResult, type AgentRuntimeInfo, type AgentSession, type AgentSessionConfig, type AgentSlashCommand, type AgentStreamEvent, type FetchCatalogOptions, type ImportableProviderSession, type ImportProviderSessionContext, type ImportProviderSessionInput, type ListImportableSessionsOptions, type ProviderCatalog } from "../../agent-sdk-types.js";
|
|
4
4
|
import { type ProviderRuntimeSettings } from "../../provider-launch-config.js";
|
|
5
5
|
import type { PiRuntime, PiRuntimeSession } from "./runtime.js";
|
|
6
6
|
import type { PiCommandsRpcType, PiSessionState } from "./rpc-types.js";
|
|
7
7
|
export declare const PiProviderParamsSchema: z.ZodObject<{
|
|
8
8
|
sessionDir: z.ZodOptional<z.ZodString>;
|
|
9
|
+
extensionTimeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
9
10
|
}, z.core.$strict>;
|
|
10
11
|
interface PiRpcAgentClientOptions {
|
|
11
12
|
logger: Logger;
|
|
@@ -23,6 +24,7 @@ interface PiRpcAgentSessionOptions {
|
|
|
23
24
|
initialState: PiSessionState;
|
|
24
25
|
capabilities: AgentCapabilityFlags;
|
|
25
26
|
cleanup?: () => void;
|
|
27
|
+
extensionTimeoutMs?: number;
|
|
26
28
|
}
|
|
27
29
|
export declare function transformPiModels(models: AgentModelDefinition[]): AgentModelDefinition[];
|
|
28
30
|
export declare class PiRpcAgentSession implements AgentSession {
|
|
@@ -50,6 +52,7 @@ export declare class PiRpcAgentSession implements AgentSession {
|
|
|
50
52
|
private readonly runtimeSession;
|
|
51
53
|
private readonly config;
|
|
52
54
|
private readonly cleanup?;
|
|
55
|
+
private readonly extensionTimeoutMs;
|
|
53
56
|
get id(): string | null;
|
|
54
57
|
run(prompt: AgentPromptInput, options?: AgentRunOptions): Promise<AgentRunResult>;
|
|
55
58
|
startTurn(prompt: AgentPromptInput, _options?: AgentRunOptions): Promise<StartTurnResult>;
|
|
@@ -114,6 +117,7 @@ export declare class PiRpcAgentClient implements AgentClient {
|
|
|
114
117
|
createSession(config: AgentSessionConfig, launchContext?: AgentLaunchContext): Promise<AgentSession>;
|
|
115
118
|
resumeSession(handle: AgentPersistenceHandle, overrides?: Partial<AgentSessionConfig>, _launchContext?: AgentLaunchContext): Promise<AgentSession>;
|
|
116
119
|
fetchCatalog(options: FetchCatalogOptions): Promise<ProviderCatalog>;
|
|
120
|
+
listFeatures(_config: AgentSessionConfig): Promise<AgentFeature[]>;
|
|
117
121
|
listImportableSessions(options?: ListImportableSessionsOptions): Promise<ImportableProviderSession[]>;
|
|
118
122
|
importSession(input: ImportProviderSessionInput, context: ImportProviderSessionContext): Promise<import("../../agent-sdk-types.js").ImportedProviderSession>;
|
|
119
123
|
isAvailable(): Promise<boolean>;
|
|
@@ -22,7 +22,7 @@ const PASEO_PI_TREE_EXTENSION_COMMAND = "paseo_tree";
|
|
|
22
22
|
const PASEO_PI_CAPTURE_EXTENSION_COMMAND = "paseo_capture_entries";
|
|
23
23
|
const PASEO_PI_ENTRY_CAPTURE_MARKER = "PASEO_ENTRY_CAPTURE";
|
|
24
24
|
const PASEO_PI_COMMAND_RESULT_MARKER = "PASEO_COMMAND_RESULT";
|
|
25
|
-
const
|
|
25
|
+
const DEFAULT_PI_EXTENSION_RESULT_TIMEOUT_MS = 30000;
|
|
26
26
|
const QUESTION_RESPONSE_HEADER = "Response";
|
|
27
27
|
const QUESTION_COMMENT_HEADER = "Comment";
|
|
28
28
|
const PI_ASK_USER_FREEFORM_SENTINEL = "✏️ Type custom response...";
|
|
@@ -30,6 +30,7 @@ const COMBINED_ASK_USER_METADATA = "ask_user_select_optional_comment";
|
|
|
30
30
|
export const PiProviderParamsSchema = z
|
|
31
31
|
.object({
|
|
32
32
|
sessionDir: z.string().min(1).optional(),
|
|
33
|
+
extensionTimeoutMs: z.number().int().positive().default(DEFAULT_PI_EXTENSION_RESULT_TIMEOUT_MS),
|
|
33
34
|
})
|
|
34
35
|
.strict();
|
|
35
36
|
const PI_HANDLED_BUILTIN_SLASH_COMMANDS = [
|
|
@@ -715,6 +716,7 @@ export class PiRpcAgentSession {
|
|
|
715
716
|
normalizePiThinkingOption(options.config.thinkingOptionId) ??
|
|
716
717
|
this.state.thinkingLevel ??
|
|
717
718
|
null;
|
|
719
|
+
this.extensionTimeoutMs = options.extensionTimeoutMs ?? DEFAULT_PI_EXTENSION_RESULT_TIMEOUT_MS;
|
|
718
720
|
this.runtimeSession.onEvent((event) => {
|
|
719
721
|
this.handleRuntimeEvent(event);
|
|
720
722
|
});
|
|
@@ -1065,7 +1067,7 @@ export class PiRpcAgentSession {
|
|
|
1065
1067
|
const timer = setTimeout(() => {
|
|
1066
1068
|
this.pendingExtensionResults.delete(requestId);
|
|
1067
1069
|
reject(new Error(`Pi extension result timed out for request ${requestId}`));
|
|
1068
|
-
},
|
|
1070
|
+
}, this.extensionTimeoutMs);
|
|
1069
1071
|
this.pendingExtensionResults.set(requestId, { resolve, reject, timer });
|
|
1070
1072
|
});
|
|
1071
1073
|
}
|
|
@@ -1489,6 +1491,7 @@ export class PiRpcAgentClient {
|
|
|
1489
1491
|
initialState: await runtimeSession.getState(),
|
|
1490
1492
|
capabilities: withPiMcpCapability(mcpConfig !== null),
|
|
1491
1493
|
cleanup: combineCleanup([mcpConfig?.cleanup, paseoExtension.cleanup]),
|
|
1494
|
+
extensionTimeoutMs: this.providerParams.extensionTimeoutMs,
|
|
1492
1495
|
});
|
|
1493
1496
|
}
|
|
1494
1497
|
catch (error) {
|
|
@@ -1531,6 +1534,7 @@ export class PiRpcAgentClient {
|
|
|
1531
1534
|
initialState: await runtimeSession.getState(),
|
|
1532
1535
|
capabilities: withPiMcpCapability(mcpConfig !== null),
|
|
1533
1536
|
cleanup: combineCleanup([mcpConfig?.cleanup, paseoExtension.cleanup]),
|
|
1537
|
+
extensionTimeoutMs: this.providerParams.extensionTimeoutMs,
|
|
1534
1538
|
});
|
|
1535
1539
|
}
|
|
1536
1540
|
catch (error) {
|
|
@@ -1541,7 +1545,9 @@ export class PiRpcAgentClient {
|
|
|
1541
1545
|
}
|
|
1542
1546
|
}
|
|
1543
1547
|
async fetchCatalog(options) {
|
|
1544
|
-
const runtimeSession = await this.runtime.startSession({
|
|
1548
|
+
const runtimeSession = await this.runtime.startSession({
|
|
1549
|
+
cwd: options.scope === "global" ? homedir() : options.cwd,
|
|
1550
|
+
});
|
|
1545
1551
|
try {
|
|
1546
1552
|
const models = transformPiModels((await runtimeSession.getAvailableModels(PI_CATALOG_REQUEST_TIMEOUT_MS)).map(mapPiModel));
|
|
1547
1553
|
return { models, modes: [] };
|
|
@@ -1550,6 +1556,9 @@ export class PiRpcAgentClient {
|
|
|
1550
1556
|
await runtimeSession.close();
|
|
1551
1557
|
}
|
|
1552
1558
|
}
|
|
1559
|
+
async listFeatures(_config) {
|
|
1560
|
+
return [];
|
|
1561
|
+
}
|
|
1553
1562
|
async listImportableSessions(options) {
|
|
1554
1563
|
return await listPiImportableSessions({
|
|
1555
1564
|
...options,
|
|
@@ -9,6 +9,11 @@ export interface ProviderImageOutput {
|
|
|
9
9
|
export interface MaterializedProviderImage {
|
|
10
10
|
path: string;
|
|
11
11
|
}
|
|
12
|
+
export declare function materializeProviderImage(image: {
|
|
13
|
+
data: string;
|
|
14
|
+
mimeType: string | null;
|
|
15
|
+
}): MaterializedProviderImage;
|
|
16
|
+
export declare function isProviderImageMarkdown(text: string): boolean;
|
|
12
17
|
interface RenderProviderImageOutputOptions {
|
|
13
18
|
materialize?: (image: {
|
|
14
19
|
data: string;
|