@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.
Files changed (172) hide show
  1. package/dist/scripts/supervisor.js +26 -8
  2. package/dist/server/executable-resolution/windows.js +3 -0
  3. package/dist/server/server/agent/activity-curator.d.ts +17 -0
  4. package/dist/server/server/agent/activity-curator.js +101 -24
  5. package/dist/server/server/agent/agent-manager.d.ts +10 -0
  6. package/dist/server/server/agent/agent-manager.js +69 -27
  7. package/dist/server/server/agent/agent-sdk-types.d.ts +15 -2
  8. package/dist/server/server/agent/mcp-server.d.ts +2 -45
  9. package/dist/server/server/agent/mcp-server.js +45 -1985
  10. package/dist/server/server/agent/prompt-attachments.js +6 -2
  11. package/dist/server/server/agent/provider-snapshot-manager.d.ts +12 -1
  12. package/dist/server/server/agent/provider-snapshot-manager.js +132 -42
  13. package/dist/server/server/agent/providers/acp-agent.d.ts +27 -1
  14. package/dist/server/server/agent/providers/acp-agent.js +178 -27
  15. package/dist/server/server/agent/providers/claude/agent.js +111 -24
  16. package/dist/server/server/agent/providers/claude/query.d.ts +3 -0
  17. package/dist/server/server/agent/providers/claude/query.js +4 -2
  18. package/dist/server/server/agent/providers/codex-app-server-agent.js +6 -57
  19. package/dist/server/server/agent/providers/diagnostic-utils.d.ts +1 -0
  20. package/dist/server/server/agent/providers/diagnostic-utils.js +1 -1
  21. package/dist/server/server/agent/providers/generic-acp-agent.d.ts +3 -0
  22. package/dist/server/server/agent/providers/generic-acp-agent.js +41 -23
  23. package/dist/server/server/agent/providers/mock-load-test-agent.js +12 -2
  24. package/dist/server/server/agent/providers/opencode/paths.d.ts +2 -0
  25. package/dist/server/server/agent/providers/opencode/paths.js +7 -0
  26. package/dist/server/server/agent/providers/opencode/server-manager.d.ts +2 -0
  27. package/dist/server/server/agent/providers/opencode/server-manager.js +34 -5
  28. package/dist/server/server/agent/providers/opencode-agent.d.ts +4 -0
  29. package/dist/server/server/agent/providers/opencode-agent.js +14 -2
  30. package/dist/server/server/agent/providers/pi/agent.d.ts +5 -1
  31. package/dist/server/server/agent/providers/pi/agent.js +12 -3
  32. package/dist/server/server/agent/providers/provider-image-output.d.ts +5 -0
  33. package/dist/server/server/agent/providers/provider-image-output.js +61 -1
  34. package/dist/server/server/agent/tools/paseo-tools.d.ts +48 -0
  35. package/dist/server/server/agent/tools/paseo-tools.js +2119 -0
  36. package/dist/server/server/agent/tools/types.d.ts +36 -0
  37. package/dist/server/server/agent/tools/types.js +2 -0
  38. package/dist/server/server/bootstrap.d.ts +7 -1
  39. package/dist/server/server/bootstrap.js +89 -62
  40. package/dist/server/server/config.d.ts +2 -0
  41. package/dist/server/server/config.js +57 -1
  42. package/dist/server/server/daemon-worker.js +19 -7
  43. package/dist/server/server/lifecycle-reasons.d.ts +4 -0
  44. package/dist/server/server/lifecycle-reasons.js +6 -0
  45. package/dist/server/server/persisted-config.d.ts +12 -0
  46. package/dist/server/server/persisted-config.js +18 -2
  47. package/dist/server/server/process-diagnostics.d.ts +17 -0
  48. package/dist/server/server/process-diagnostics.js +22 -0
  49. package/dist/server/server/relay-transport.js +1 -0
  50. package/dist/server/server/resolve-worktree-creation-intent.js +3 -1
  51. package/dist/server/server/session/agent-updates/agent-updates-service.d.ts +59 -0
  52. package/dist/server/server/session/agent-updates/agent-updates-service.js +220 -0
  53. package/dist/server/server/session/checkout/checkout-session.d.ts +13 -15
  54. package/dist/server/server/session/checkout/checkout-session.js +18 -16
  55. package/dist/server/server/session/checkout/git-metadata-generator.d.ts +53 -0
  56. package/dist/server/server/session/checkout/git-metadata-generator.js +159 -0
  57. package/dist/server/server/session/daemon/daemon-self-update-session-controller.d.ts +32 -0
  58. package/dist/server/server/session/daemon/daemon-self-update-session-controller.js +88 -0
  59. package/dist/server/server/session/daemon/daemon-self-updater.d.ts +32 -0
  60. package/dist/server/server/session/daemon/daemon-self-updater.js +56 -0
  61. package/dist/server/server/session/daemon/daemon-session.d.ts +26 -0
  62. package/dist/server/server/session/daemon/daemon-session.js +50 -0
  63. package/dist/server/server/session/daemon/diagnostics.d.ts +41 -0
  64. package/dist/server/server/session/daemon/diagnostics.js +431 -0
  65. package/dist/server/server/session/daemon/install-origin.d.ts +7 -0
  66. package/dist/server/server/session/daemon/install-origin.js +64 -0
  67. package/dist/server/server/session/daemon/npm-global-cli.d.ts +29 -0
  68. package/dist/server/server/session/daemon/npm-global-cli.js +98 -0
  69. package/dist/server/server/session/git-mutation/git-mutation-service.d.ts +34 -0
  70. package/dist/server/server/session/git-mutation/git-mutation-service.js +71 -0
  71. package/dist/server/server/session/provider/provider-catalog-session.js +8 -4
  72. package/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.d.ts +36 -0
  73. package/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.js +134 -0
  74. package/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.d.ts +34 -0
  75. package/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.js +190 -0
  76. package/dist/server/server/session/workspace-scripts/workspace-scripts-service.d.ts +41 -0
  77. package/dist/server/server/session/workspace-scripts/workspace-scripts-service.js +100 -0
  78. package/dist/server/server/session.d.ts +12 -54
  79. package/dist/server/server/session.js +187 -970
  80. package/dist/server/server/speech/providers/openai/config.d.ts +1 -2
  81. package/dist/server/server/speech/providers/openai/config.js +13 -9
  82. package/dist/server/server/speech/providers/openai/runtime.js +2 -16
  83. package/dist/server/server/speech/providers/openai/stt.d.ts +1 -0
  84. package/dist/server/server/speech/providers/openai/stt.js +4 -2
  85. package/dist/server/server/speech/providers/openai/tts.d.ts +1 -0
  86. package/dist/server/server/speech/providers/openai/tts.js +1 -0
  87. package/dist/server/server/web-ui.d.ts +10 -0
  88. package/dist/server/server/web-ui.js +205 -0
  89. package/dist/server/server/websocket/runtime-metrics.d.ts +23 -0
  90. package/dist/server/server/websocket-server.d.ts +4 -2
  91. package/dist/server/server/websocket-server.js +215 -52
  92. package/dist/server/server/worktree-bootstrap.d.ts +1 -1
  93. package/dist/server/server/worktree-branch-name-generator.js +3 -1
  94. package/dist/server/services/quota-fetcher/manifest.js +5 -0
  95. package/dist/server/services/quota-fetcher/providers/minimax.d.ts +29 -0
  96. package/dist/server/services/quota-fetcher/providers/minimax.js +227 -0
  97. package/dist/server/terminal/agent-hooks/agent-hook-installer.js +2 -2
  98. package/dist/server/utils/checkout-git.js +203 -25
  99. package/dist/server/utils/directory-suggestions.js +1 -4
  100. package/dist/server/utils/path.d.ts +2 -0
  101. package/dist/server/utils/path.js +13 -0
  102. package/dist/server/utils/worktree.d.ts +1 -0
  103. package/dist/server/utils/worktree.js +92 -11
  104. package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css +1 -0
  105. package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.br +0 -0
  106. package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.gz +0 -0
  107. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-b01555c9b42665a03988c0a0032ef528.js +1 -0
  108. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-b01555c9b42665a03988c0a0032ef528.js.br +0 -0
  109. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-b01555c9b42665a03988c0a0032ef528.js.gz +0 -0
  110. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-648388eca5c510b496e1eddf523f70ff.js +1 -0
  111. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-648388eca5c510b496e1eddf523f70ff.js.br +0 -0
  112. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-648388eca5c510b496e1eddf523f70ff.js.gz +0 -0
  113. package/dist/server/web-ui/_expo/static/js/web/index-0ebbea2cd337f0c0680fdb3f8d4d5af3.js +16157 -0
  114. package/dist/server/web-ui/_expo/static/js/web/index-0ebbea2cd337f0c0680fdb3f8d4d5af3.js.br +0 -0
  115. package/dist/server/web-ui/_expo/static/js/web/index-0ebbea2cd337f0c0680fdb3f8d4d5af3.js.gz +0 -0
  116. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-c64fa2416284927857a39087fd8d1332.js +1 -0
  117. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-c64fa2416284927857a39087fd8d1332.js.br +0 -0
  118. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-c64fa2416284927857a39087fd8d1332.js.gz +0 -0
  119. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-a9784226715772edf87ef36c596599c2.js +3 -0
  120. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-a9784226715772edf87ef36c596599c2.js.br +0 -0
  121. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-a9784226715772edf87ef36c596599c2.js.gz +0 -0
  122. package/dist/server/web-ui/apple-touch-icon.png +0 -0
  123. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon-mask.0a328cd9c1afd0afe8e3b1ec5165b1b4.png +0 -0
  124. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon.35ba0eaec5a4f5ed12ca16fabeae451d.png +0 -0
  125. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55.png +0 -0
  126. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@2x.png +0 -0
  127. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@3x.png +0 -0
  128. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@4x.png +0 -0
  129. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7.png +0 -0
  130. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@2x.png +0 -0
  131. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@3x.png +0 -0
  132. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@4x.png +0 -0
  133. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/search-icon.286d67d3f74808a60a78d3ebf1a5fb57.png +0 -0
  134. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/arrow_down.017bc6ba3fc25503e5eb5e53826d48a8.png +0 -0
  135. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/error.d1ea1496f9057eb392d5bbf3732a61b7.png +0 -0
  136. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/file.19eeb73b9593a38f8e9f418337fc7d10.png +0 -0
  137. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/forward.d8b800c443b8972542883e0b9de2bdc6.png +0 -0
  138. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/pkg.ab19f4cbc543357183a20571f68380a3.png +0 -0
  139. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/sitemap.412dd9275b6b48ad28f5e3d81bb1f626.png +0 -0
  140. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/unmatched.20e71bdf79e3a97bf55fd9e164041578.png +0 -0
  141. package/dist/server/web-ui/assets/assets/images/editor-apps/antigravity.6e91a685c33435e0b466a56db86cf141.png +0 -0
  142. package/dist/server/web-ui/assets/assets/images/editor-apps/cursor.c31d6bce4fe9aadc3fe59962f4c4fcf3.png +0 -0
  143. package/dist/server/web-ui/assets/assets/images/editor-apps/file-explorer.3e15e8f72c825c85ce336bcb0cdef776.png +0 -0
  144. package/dist/server/web-ui/assets/assets/images/editor-apps/finder.7f68fc2c475621a672e1be09309d5567.png +0 -0
  145. package/dist/server/web-ui/assets/assets/images/editor-apps/vscode.832bdb4c685d930f1c864c793703600b.png +0 -0
  146. package/dist/server/web-ui/assets/assets/images/editor-apps/webstorm.aa5dc2cd8c20cc0a155c4c5c5ab3c5f5.png +0 -0
  147. package/dist/server/web-ui/assets/assets/images/editor-apps/zed.f3a670b7f9aa226da4fe53fb86f1abbd.png +0 -0
  148. package/dist/server/web-ui/assets/assets/images/favicon-dark-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
  149. package/dist/server/web-ui/assets/assets/images/favicon-dark-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
  150. package/dist/server/web-ui/assets/assets/images/favicon-dark.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
  151. package/dist/server/web-ui/assets/assets/images/favicon-light-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
  152. package/dist/server/web-ui/assets/assets/images/favicon-light-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
  153. package/dist/server/web-ui/assets/assets/images/favicon-light.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
  154. package/dist/server/web-ui/assets/assets/images/notification-icon.3bf81d33ddbf380606bdd248ba83e158.png +0 -0
  155. package/dist/server/web-ui/favicon.ico +0 -0
  156. package/dist/server/web-ui/index.html +90 -0
  157. package/dist/server/web-ui/index.html.br +0 -0
  158. package/dist/server/web-ui/index.html.gz +0 -0
  159. package/dist/server/web-ui/manifest.json +27 -0
  160. package/dist/server/web-ui/manifest.json.br +0 -0
  161. package/dist/server/web-ui/manifest.json.gz +0 -0
  162. package/dist/server/web-ui/metadata.json +1 -0
  163. package/dist/server/web-ui/metadata.json.br +1 -0
  164. package/dist/server/web-ui/metadata.json.gz +0 -0
  165. package/dist/server/web-ui/pwa-icon-192.png +0 -0
  166. package/dist/server/web-ui/pwa-icon-512.png +0 -0
  167. package/dist/server/web-ui/robots.txt +2 -0
  168. package/dist/src/executable-resolution/windows.js +3 -0
  169. package/dist/src/server/persisted-config.js +18 -2
  170. package/package.json +7 -7
  171. package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts +0 -42
  172. 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: materializeCodexImageOutput });
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 = await writeImageAttachment(block.mimeType, block.data);
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 { formatProviderDiagnostic, formatProviderDiagnosticError, buildBinaryDiagnosticRows, } from "./diagnostic-utils.js";
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
- const versionProbe = buildVersionProbeCommand(this.command);
44
- return {
45
- diagnostic: formatProviderDiagnostic(providerName, [
46
- { label: "Provider ID", value: this.providerId ?? "unknown" },
47
- { label: "Configured command", value: this.command.join(" ") },
48
- ...(await buildBinaryDiagnosticRows(launch, availability, {
49
- binaryLabel: "Launcher binary",
50
- versionCommand: {
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
- return {
65
- diagnostic: formatProviderDiagnosticError(providerName, error),
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.split("User context:\n").at(-1)?.trim() ?? "";
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,2 @@
1
+ export declare function resolveOpenCodeHomeDir(env?: NodeJS.ProcessEnv): string;
2
+ //# sourceMappingURL=paths.d.ts.map
@@ -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 os from "node:os";
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
- const serverCwd = os.homedir();
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
- return found;
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 directory = options.cwd;
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 PASEO_PI_EXTENSION_RESULT_TIMEOUT_MS = 10000;
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
- }, PASEO_PI_EXTENSION_RESULT_TIMEOUT_MS);
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({ cwd: options.cwd });
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;