@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
@@ -11,7 +11,11 @@ function parseLifecycleMessage(msg) {
11
11
  }
12
12
  const type = msg.type;
13
13
  if (type === "paseo:shutdown") {
14
- return { type: "paseo:shutdown" };
14
+ const reason = msg.reason;
15
+ return {
16
+ type: "paseo:shutdown",
17
+ ...(typeof reason === "string" && reason.trim().length > 0 ? { reason } : {}),
18
+ };
15
19
  }
16
20
  if (type === "paseo:ready") {
17
21
  const listen = msg.listen;
@@ -169,12 +173,14 @@ export function runSupervisor(options) {
169
173
  return;
170
174
  }
171
175
  if (lifecycleMessage.type === "paseo:shutdown") {
172
- writeLifecycleLog("Worker requested shutdown");
173
- requestShutdown("Shutdown requested by worker");
176
+ const reason = lifecycleMessage.reason ?? "worker_requested_shutdown";
177
+ writeLifecycleLog("Worker requested shutdown", { reason });
178
+ requestShutdown(reason);
174
179
  return;
175
180
  }
176
- writeLifecycleLog("Worker requested restart", lifecycleMessage.reason ? { reason: lifecycleMessage.reason } : {});
177
- requestRestart("Restart requested by worker");
181
+ const reason = lifecycleMessage.reason ?? "worker_requested_restart";
182
+ writeLifecycleLog("Worker requested restart", { reason });
183
+ requestRestart(reason);
178
184
  });
179
185
  child.on("close", (code, signal) => {
180
186
  clearInterval(heartbeat);
@@ -199,6 +205,18 @@ export function runSupervisor(options) {
199
205
  exitSupervisor(typeof code === "number" ? code : 1);
200
206
  });
201
207
  };
208
+ const signalWorker = (signal, reason) => {
209
+ if (!child) {
210
+ return;
211
+ }
212
+ writeLifecycleLog("Supervisor sending signal to worker", {
213
+ reason,
214
+ signal,
215
+ supervisorPid: process.pid,
216
+ workerPid: child.pid ?? null,
217
+ });
218
+ child.kill(signal);
219
+ };
202
220
  const requestRestart = (reason) => {
203
221
  if (!child || restarting || shuttingDown) {
204
222
  return;
@@ -206,7 +224,7 @@ export function runSupervisor(options) {
206
224
  restarting = true;
207
225
  writeLifecycleLog("Restart requested", { reason });
208
226
  log(`${reason}. Stopping worker for restart...`);
209
- child.kill("SIGTERM");
227
+ signalWorker("SIGTERM", reason);
210
228
  };
211
229
  const requestShutdown = (reason) => {
212
230
  if (shuttingDown) {
@@ -220,10 +238,10 @@ export function runSupervisor(options) {
220
238
  exitSupervisor(0);
221
239
  return;
222
240
  }
223
- child.kill("SIGTERM");
241
+ signalWorker("SIGTERM", reason);
224
242
  };
225
243
  const forwardSignal = (signal) => {
226
- requestShutdown(`Received ${signal}`);
244
+ requestShutdown(`supervisor_received_${signal}`);
227
245
  };
228
246
  process.on("SIGINT", () => forwardSignal("SIGINT"));
229
247
  process.on("SIGTERM", () => forwardSignal("SIGTERM"));
@@ -41,6 +41,9 @@ async function findFirstProbeable(candidates, options) {
41
41
  continue;
42
42
  }
43
43
  seen.add(candidate);
44
+ if (!options.exists(candidate)) {
45
+ continue;
46
+ }
44
47
  if (await options.probeExecutable(candidate, options.probeTimeoutMs)) {
45
48
  return candidate;
46
49
  }
@@ -1,11 +1,28 @@
1
1
  import type { AgentTimelineItem } from "./agent-sdk-types.js";
2
+ import type { AgentAttachment } from "@getpaseo/protocol/messages";
3
+ import type { AgentTimelineRow } from "./agent-timeline-store-types.js";
2
4
  interface ActivityCuratorOptions {
3
5
  maxItems?: number;
4
6
  labelAssistantMessages?: boolean;
7
+ includeKinds?: readonly AgentTimelineItem["type"][];
8
+ includeExternalToolInput?: boolean;
5
9
  }
10
+ type TextAgentAttachment = Extract<AgentAttachment, {
11
+ type: "text";
12
+ }>;
6
13
  /**
7
14
  * Convert normalized agent timeline items into a concise text summary.
8
15
  */
9
16
  export declare function curateAgentActivity(timeline: AgentTimelineItem[], options?: ActivityCuratorOptions): string;
17
+ export declare function buildAgentForkContextAttachment(input: {
18
+ rows: readonly AgentTimelineRow[];
19
+ boundaryMessageId?: string | null;
20
+ agentTitle?: string | null;
21
+ cwd?: string | null;
22
+ }): {
23
+ attachment: TextAgentAttachment;
24
+ itemCount: number;
25
+ boundaryMessageId: string | null;
26
+ };
10
27
  export {};
11
28
  //# sourceMappingURL=activity-curator.d.ts.map
@@ -71,16 +71,42 @@ function projectForCuration(items) {
71
71
  }));
72
72
  return projectTimelineRows({ rows, mode: "projected" }).map((entry) => entry.item);
73
73
  }
74
- function curateAgentActivityEntries(timeline, options) {
75
- if (timeline.length === 0) {
74
+ function shouldIncludeItem(item, options) {
75
+ if (!options?.includeKinds) {
76
+ return true;
77
+ }
78
+ return options.includeKinds.includes(item.type);
79
+ }
80
+ function formatToolCallEntry(item, options) {
81
+ const inputJson = formatToolInputJson(inputFromUnknownDetail(item.detail));
82
+ const display = buildToolCallDisplayModel({
83
+ name: item.name,
84
+ status: item.status,
85
+ error: item.error,
86
+ detail: item.detail,
87
+ metadata: item.metadata,
88
+ });
89
+ const displayName = display.displayName;
90
+ const summary = formatToolSummary(display.summary);
91
+ if ((options?.includeExternalToolInput ?? true) &&
92
+ isLikelyExternalToolName(item.name) &&
93
+ inputJson) {
94
+ return activityEntry(`[${displayName}] ${inputJson}`);
95
+ }
96
+ return activityEntry(summary ? `[${displayName}] ${summary}` : `[${displayName}]`);
97
+ }
98
+ function curateProjectedActivityEntries(items, options) {
99
+ if (items.length === 0) {
76
100
  return [];
77
101
  }
78
- const collapsed = projectForCuration(timeline);
79
102
  const maxItems = options?.maxItems ?? DEFAULT_MAX_ITEMS;
80
- const recentItems = maxItems > 0 && collapsed.length > maxItems ? collapsed.slice(-maxItems) : collapsed;
103
+ const recentItems = maxItems > 0 && items.length > maxItems ? items.slice(-maxItems) : items;
81
104
  const entries = [];
82
105
  const buffers = { message: "", thought: "" };
83
106
  for (const item of recentItems) {
107
+ if (!shouldIncludeItem(item, options)) {
108
+ continue;
109
+ }
84
110
  switch (item.type) {
85
111
  case "user_message":
86
112
  flushBuffers(entries, buffers, options);
@@ -94,26 +120,7 @@ function curateAgentActivityEntries(timeline, options) {
94
120
  break;
95
121
  case "tool_call": {
96
122
  flushBuffers(entries, buffers, options);
97
- const inputJson = formatToolInputJson(inputFromUnknownDetail(item.detail));
98
- const display = buildToolCallDisplayModel({
99
- name: item.name,
100
- status: item.status,
101
- error: item.error,
102
- detail: item.detail,
103
- metadata: item.metadata,
104
- });
105
- const displayName = display.displayName;
106
- const summary = formatToolSummary(display.summary);
107
- if (isLikelyExternalToolName(item.name) && inputJson) {
108
- entries.push(activityEntry(`[${displayName}] ${inputJson}`));
109
- break;
110
- }
111
- if (summary) {
112
- entries.push(activityEntry(`[${displayName}] ${summary}`));
113
- }
114
- else {
115
- entries.push(activityEntry(`[${displayName}]`));
116
- }
123
+ entries.push(formatToolCallEntry(item, options));
117
124
  break;
118
125
  }
119
126
  case "todo":
@@ -138,6 +145,10 @@ function curateAgentActivityEntries(timeline, options) {
138
145
  flushBuffers(entries, buffers, options);
139
146
  return entries;
140
147
  }
148
+ function curateAgentActivityEntries(timeline, options) {
149
+ const collapsed = projectForCuration(timeline);
150
+ return curateProjectedActivityEntries(collapsed, options);
151
+ }
141
152
  /**
142
153
  * Convert normalized agent timeline items into a concise text summary.
143
154
  */
@@ -147,4 +158,70 @@ export function curateAgentActivity(timeline, options) {
147
158
  ? entries.map((entry) => entry.text).join("\n")
148
159
  : "No activity to display.";
149
160
  }
161
+ function selectForkContextRows(input) {
162
+ const boundaryMessageId = input.boundaryMessageId?.trim() || null;
163
+ if (!boundaryMessageId) {
164
+ const projected = projectTimelineRows({ rows: input.rows, mode: "projected" });
165
+ return {
166
+ items: projected.map((entry) => entry.item),
167
+ boundaryMessageId: null,
168
+ };
169
+ }
170
+ const boundaryIndex = input.rows.findLastIndex((row) => row.item.type === "assistant_message" && row.item.messageId === boundaryMessageId);
171
+ if (boundaryIndex < 0) {
172
+ throw new Error("Selected assistant message is no longer available.");
173
+ }
174
+ const selectedRows = input.rows.slice(0, boundaryIndex + 1);
175
+ const projected = projectTimelineRows({ rows: selectedRows, mode: "projected" });
176
+ return {
177
+ items: projected.map((entry) => entry.item),
178
+ boundaryMessageId,
179
+ };
180
+ }
181
+ function trimContextMetadata(value) {
182
+ const trimmed = value?.trim();
183
+ return trimmed ? trimmed : null;
184
+ }
185
+ function buildForkContextText(input) {
186
+ const header = ["Chat history from a previous Paseo agent."];
187
+ const agentTitle = trimContextMetadata(input.agentTitle);
188
+ const cwd = trimContextMetadata(input.cwd);
189
+ if (agentTitle) {
190
+ header.push(`Source agent: ${agentTitle}`);
191
+ }
192
+ if (cwd) {
193
+ header.push(`Source directory: ${cwd}`);
194
+ }
195
+ return `${header.join("\n")}\n\n${input.body}`;
196
+ }
197
+ export function buildAgentForkContextAttachment(input) {
198
+ const selected = selectForkContextRows({
199
+ rows: input.rows,
200
+ boundaryMessageId: input.boundaryMessageId,
201
+ });
202
+ const entries = curateProjectedActivityEntries(selected.items, {
203
+ maxItems: 0,
204
+ labelAssistantMessages: true,
205
+ includeKinds: ["user_message", "assistant_message", "tool_call"],
206
+ includeExternalToolInput: false,
207
+ });
208
+ const body = entries.length > 0
209
+ ? entries.map((entry) => entry.text).join("\n")
210
+ : "No chat history to display.";
211
+ return {
212
+ attachment: {
213
+ type: "text",
214
+ mimeType: "text/plain",
215
+ contextKind: "chat_history",
216
+ title: "Chat history",
217
+ text: buildForkContextText({
218
+ body,
219
+ agentTitle: input.agentTitle,
220
+ cwd: input.cwd,
221
+ }),
222
+ },
223
+ itemCount: selected.items.length,
224
+ boundaryMessageId: selected.boundaryMessageId,
225
+ };
226
+ }
150
227
  //# sourceMappingURL=activity-curator.js.map
@@ -6,6 +6,7 @@ import type { StoredAgentRecord, AgentStorage } from "./agent-storage.js";
6
6
  import type { AgentTimelineFetchOptions, AgentTimelineFetchResult, AgentTimelineRow, AgentTimelineStore } from "./agent-timeline-store-types.js";
7
7
  import { type ForegroundTurnWaiter } from "./foreground-run-state.js";
8
8
  import { type RewindMode } from "./rewind/rewind.js";
9
+ import type { PaseoToolCatalogFactory } from "./tools/types.js";
9
10
  export { AGENT_LIFECYCLE_STATUSES, type AgentLifecycleStatus };
10
11
  export type { AgentTimelineCursor, AgentTimelineFetchDirection, AgentTimelineFetchOptions, AgentTimelineFetchResult, AgentTimelineRow, AgentTimelineWindow, } from "./agent-timeline-store-types.js";
11
12
  export type AgentManagerEvent = {
@@ -72,6 +73,8 @@ export interface AgentManagerOptions {
72
73
  terminalManager?: TerminalManager | null;
73
74
  mcpBaseUrl?: string;
74
75
  mcpAuthToken?: string;
76
+ paseoToolsEnabled?: boolean;
77
+ paseoToolCatalogFactory?: PaseoToolCatalogFactory;
75
78
  appendSystemPrompt?: string;
76
79
  agentStreamCoalesceWindowMs?: number;
77
80
  rescueTimeouts?: AgentManagerRescueTimeouts;
@@ -190,6 +193,8 @@ export declare class AgentManager {
190
193
  private readonly agentStreamCoalescer;
191
194
  private mcpBaseUrl;
192
195
  private readonly mcpAuthToken;
196
+ private paseoToolsEnabled;
197
+ private paseoToolCatalogFactory;
193
198
  private appendSystemPrompt;
194
199
  private onAgentAttention?;
195
200
  private onAgentArchived?;
@@ -197,6 +202,7 @@ export declare class AgentManager {
197
202
  private logger;
198
203
  private readonly rescueTimeouts;
199
204
  constructor(options: AgentManagerOptions);
205
+ private configurePaseoTools;
200
206
  registerClient(provider: AgentProvider, client: AgentClient): void;
201
207
  updateProviderRegistry(input: {
202
208
  providerDefinitions: ProviderEnabledMap;
@@ -206,6 +212,8 @@ export declare class AgentManager {
206
212
  setAgentAttentionCallback(callback: AgentAttentionCallback): void;
207
213
  setAgentArchivedCallback(callback: AgentArchivedCallback): void;
208
214
  setMcpBaseUrl(url: string | null): void;
215
+ setPaseoToolsEnabled(enabled: boolean): void;
216
+ setPaseoToolCatalogFactory(factory: PaseoToolCatalogFactory | null): void;
209
217
  /**
210
218
  * Capability token the daemon's own MCP clients must present to the Agent MCP
211
219
  * endpoint when a daemon password is configured. Read by the per-client
@@ -372,9 +380,11 @@ export declare class AgentManager {
372
380
  private dispatchStream;
373
381
  private dispatch;
374
382
  private normalizeConfig;
383
+ private resolveDefaultModelId;
375
384
  private prepareSessionConfig;
376
385
  private applyDaemonAppendSystemPrompt;
377
386
  private buildLaunchContext;
387
+ private resolveProviderLaunchConfig;
378
388
  private requireAvailableClient;
379
389
  private requireEnabledProvider;
380
390
  private getConfiguredProviderIds;
@@ -185,6 +185,8 @@ export class AgentManager {
185
185
  this.subscribers = new Set();
186
186
  this.previousStatuses = new Map();
187
187
  this.backgroundTasks = new Set();
188
+ this.paseoToolsEnabled = true;
189
+ this.paseoToolCatalogFactory = null;
188
190
  this.idFactory = options?.idFactory ?? (() => randomUUID());
189
191
  this.registry = options?.registry;
190
192
  this.durableTimelineStore = options?.durableTimelineStore;
@@ -192,6 +194,7 @@ export class AgentManager {
192
194
  this.onWorkspaceStateMayHaveChanged = options?.onWorkspaceStateMayHaveChanged;
193
195
  this.mcpBaseUrl = options?.mcpBaseUrl ?? null;
194
196
  this.mcpAuthToken = options?.mcpAuthToken ?? null;
197
+ this.configurePaseoTools(options);
195
198
  this.appendSystemPrompt = options.appendSystemPrompt ?? "";
196
199
  this.logger = options.logger.child({ module: "agent", component: "agent-manager" });
197
200
  this.rescueTimeouts = {
@@ -211,6 +214,10 @@ export class AgentManager {
211
214
  clients: options.clients ?? {},
212
215
  });
213
216
  }
217
+ configurePaseoTools(options) {
218
+ this.paseoToolsEnabled = options.paseoToolsEnabled ?? true;
219
+ this.paseoToolCatalogFactory = options.paseoToolCatalogFactory ?? null;
220
+ }
214
221
  registerClient(provider, client) {
215
222
  this.clients.set(provider, client);
216
223
  }
@@ -238,6 +245,12 @@ export class AgentManager {
238
245
  setMcpBaseUrl(url) {
239
246
  this.mcpBaseUrl = url;
240
247
  }
248
+ setPaseoToolsEnabled(enabled) {
249
+ this.paseoToolsEnabled = enabled;
250
+ }
251
+ setPaseoToolCatalogFactory(factory) {
252
+ this.paseoToolCatalogFactory = factory;
253
+ }
241
254
  /**
242
255
  * Capability token the daemon's own MCP clients must present to the Agent MCP
243
256
  * endpoint when a daemon password is configured. Read by the per-client
@@ -403,8 +416,11 @@ export class AgentManager {
403
416
  }
404
417
  }
405
418
  async listDraftCommands(config) {
406
- const normalizedConfig = await this.normalizeConfig(config);
419
+ const normalizedConfig = await this.normalizeConfig(config, { resolveDefaultModel: false });
407
420
  const client = this.requireClient(normalizedConfig.provider);
421
+ if (!normalizedConfig.model) {
422
+ return [];
423
+ }
408
424
  const available = await client.isAvailable();
409
425
  if (!available) {
410
426
  throw new Error(`Provider '${normalizedConfig.provider}' is not available. Please ensure the CLI is installed.`);
@@ -429,8 +445,11 @@ export class AgentManager {
429
445
  }
430
446
  }
431
447
  async listDraftFeatures(config) {
432
- const normalizedConfig = await this.normalizeConfig(config);
448
+ const normalizedConfig = await this.normalizeConfig(config, { resolveDefaultModel: false });
433
449
  const client = this.requireClient(normalizedConfig.provider);
450
+ if (!normalizedConfig.model) {
451
+ return [];
452
+ }
434
453
  const available = await client.isAvailable();
435
454
  if (!available) {
436
455
  throw new Error(`Provider '${normalizedConfig.provider}' is not available. Please ensure the CLI is installed.`);
@@ -474,12 +493,13 @@ export class AgentManager {
474
493
  const resolvedAgentId = validateAgentId(agentId ?? this.idFactory(), "createAgent");
475
494
  const { storedConfig, launchConfig } = await this.prepareSessionConfig(config, resolvedAgentId);
476
495
  this.requireEnabledProvider(storedConfig.provider);
477
- const launchContext = this.buildLaunchContext(resolvedAgentId, options?.env);
478
496
  const client = await this.requireAvailableClient({
479
497
  provider: storedConfig.provider,
480
498
  });
499
+ const launchContext = await this.buildLaunchContext(resolvedAgentId, client, options?.env);
500
+ const providerLaunchConfig = this.resolveProviderLaunchConfig(launchConfig, launchContext);
481
501
  const createOptions = this.buildCreateSessionOptions(options);
482
- const session = await client.createSession(launchConfig, launchContext, createOptions);
502
+ const session = await client.createSession(providerLaunchConfig, launchContext, createOptions);
483
503
  return this.registerSession(session, storedConfig, resolvedAgentId, {
484
504
  labels: options?.labels,
485
505
  initialTitle: options?.initialTitle,
@@ -502,13 +522,14 @@ export class AgentManager {
502
522
  provider: handle.provider,
503
523
  };
504
524
  const { storedConfig, launchConfig } = await this.prepareSessionConfig(mergedConfig, resolvedAgentId);
505
- const launchContext = this.buildLaunchContext(resolvedAgentId);
506
525
  const client = this.requireClient(handle.provider);
507
526
  const available = await client.isAvailable();
508
527
  if (!available) {
509
528
  throw new Error(`Provider '${handle.provider}' is not available. Please ensure the CLI is installed.`);
510
529
  }
511
- const session = await client.resumeSession(handle, launchConfig, launchContext);
530
+ const launchContext = await this.buildLaunchContext(resolvedAgentId, client);
531
+ const providerLaunchConfig = this.resolveProviderLaunchConfig(launchConfig, launchContext);
532
+ const session = await client.resumeSession(handle, providerLaunchConfig, launchContext);
512
533
  return this.registerSession(session, storedConfig, resolvedAgentId, options);
513
534
  }
514
535
  async importProviderSession(input) {
@@ -522,11 +543,12 @@ export class AgentManager {
522
543
  provider: input.provider,
523
544
  cwd: input.cwd,
524
545
  }, resolvedAgentId);
525
- const launchContext = this.buildLaunchContext(resolvedAgentId);
546
+ const launchContext = await this.buildLaunchContext(resolvedAgentId, client);
547
+ const providerLaunchConfig = this.resolveProviderLaunchConfig(launchConfig, launchContext);
526
548
  const imported = await client.importSession({
527
549
  providerHandleId: input.providerHandleId,
528
550
  cwd: input.cwd,
529
- }, { config: launchConfig, storedConfig, launchContext });
551
+ }, { config: providerLaunchConfig, storedConfig, launchContext });
530
552
  const importedConfig = await this.normalizeConfig(stripInternalPaseoMcpServer(imported.config));
531
553
  const timelineRows = buildImportedTimelineRows(imported.timeline);
532
554
  const initialTitle = resolveImportedAgentTitle(importedConfig, timelineRows);
@@ -567,10 +589,11 @@ export class AgentManager {
567
589
  provider,
568
590
  };
569
591
  const { storedConfig, launchConfig } = await this.prepareSessionConfig(refreshConfig, agentId);
570
- const launchContext = this.buildLaunchContext(agentId);
592
+ const launchContext = await this.buildLaunchContext(agentId, client);
593
+ const providerLaunchConfig = this.resolveProviderLaunchConfig(launchConfig, launchContext);
571
594
  const session = handle
572
- ? await client.resumeSession(handle, launchConfig, launchContext)
573
- : await client.createSession(launchConfig, launchContext);
595
+ ? await client.resumeSession(handle, providerLaunchConfig, launchContext)
596
+ : await client.createSession(providerLaunchConfig, launchContext);
574
597
  this.agentStreamCoalescer.flushAndDiscard(agentId);
575
598
  // Remove the existing agent entry before swapping sessions
576
599
  this.agents.delete(agentId);
@@ -2549,7 +2572,7 @@ export class AgentManager {
2549
2572
  subscriber.callback(event);
2550
2573
  }
2551
2574
  }
2552
- async normalizeConfig(config) {
2575
+ async normalizeConfig(config, options = {}) {
2553
2576
  const normalized = { ...config };
2554
2577
  // Always resolve cwd to absolute path for consistent history file lookup
2555
2578
  if (normalized.cwd) {
@@ -2576,19 +2599,11 @@ export class AgentManager {
2576
2599
  const trimmed = normalized.model.trim();
2577
2600
  normalized.model = trimmed.length > 0 && trimmed !== "default" ? trimmed : undefined;
2578
2601
  }
2579
- if (!normalized.model) {
2580
- const client = this.clients.get(normalized.provider);
2581
- if (client) {
2582
- try {
2583
- const catalog = await client.fetchCatalog({ cwd: normalized.cwd, force: false });
2584
- const defaultModel = catalog.models.find((model) => model.isDefault) ?? catalog.models[0];
2585
- if (defaultModel) {
2586
- normalized.model = defaultModel.id;
2587
- }
2588
- }
2589
- catch {
2590
- // Provider may not support model listing — leave model undefined
2591
- }
2602
+ const shouldResolveDefaultModel = options.resolveDefaultModel ?? true;
2603
+ if (shouldResolveDefaultModel && !normalized.model) {
2604
+ const defaultModelId = await this.resolveDefaultModelId(normalized);
2605
+ if (defaultModelId) {
2606
+ normalized.model = defaultModelId;
2592
2607
  }
2593
2608
  }
2594
2609
  if (!normalized.modeId) {
@@ -2602,6 +2617,24 @@ export class AgentManager {
2602
2617
  }
2603
2618
  return normalized;
2604
2619
  }
2620
+ async resolveDefaultModelId(config) {
2621
+ const client = this.clients.get(config.provider);
2622
+ if (!client) {
2623
+ return undefined;
2624
+ }
2625
+ try {
2626
+ const catalog = await client.fetchCatalog({
2627
+ scope: "workspace",
2628
+ cwd: config.cwd,
2629
+ force: false,
2630
+ });
2631
+ return (catalog.models.find((model) => model.isDefault) ?? catalog.models[0])?.id;
2632
+ }
2633
+ catch {
2634
+ // Provider may not support model listing — leave model undefined.
2635
+ return undefined;
2636
+ }
2637
+ }
2605
2638
  async prepareSessionConfig(config, agentId) {
2606
2639
  const storedConfig = await this.normalizeConfig(stripInternalPaseoMcpServer(config));
2607
2640
  const launchConfig = this.applyDaemonAppendSystemPrompt(withRuntimePaseoMcpServer({
@@ -2623,14 +2656,23 @@ export class AgentManager {
2623
2656
  }
2624
2657
  : next;
2625
2658
  }
2626
- buildLaunchContext(agentId, env) {
2627
- return {
2659
+ async buildLaunchContext(agentId, client, env) {
2660
+ const context = {
2628
2661
  agentId,
2629
2662
  env: {
2630
2663
  ...env,
2631
2664
  PASEO_AGENT_ID: agentId,
2632
2665
  },
2633
2666
  };
2667
+ if (this.paseoToolsEnabled &&
2668
+ client.capabilities.supportsNativePaseoTools &&
2669
+ this.paseoToolCatalogFactory) {
2670
+ context.paseoTools = await this.paseoToolCatalogFactory({ callerAgentId: agentId });
2671
+ }
2672
+ return context;
2673
+ }
2674
+ resolveProviderLaunchConfig(launchConfig, launchContext) {
2675
+ return launchContext.paseoTools ? stripInternalPaseoMcpServer(launchConfig) : launchConfig;
2634
2676
  }
2635
2677
  async requireAvailableClient(options) {
2636
2678
  const client = this.clients.get(options.provider);
@@ -1,6 +1,7 @@
1
1
  import type { Options as ClaudeAgentOptions } from "@anthropic-ai/claude-agent-sdk";
2
2
  import type { AgentProviderNotice } from "@getpaseo/protocol/agent-types";
3
3
  import type { AgentAttachment } from "@getpaseo/protocol/messages";
4
+ import type { PaseoToolCatalog } from "./tools/types.js";
4
5
  export type { AgentProviderNotice };
5
6
  export type AgentProvider = string;
6
7
  export interface AgentMetadata {
@@ -141,6 +142,7 @@ export interface AgentCapabilityFlags {
141
142
  supportsSessionListing?: boolean;
142
143
  supportsDynamicModes: boolean;
143
144
  supportsMcpServers: boolean;
145
+ supportsNativePaseoTools?: boolean;
144
146
  supportsReasoningStream: boolean;
145
147
  supportsToolInvocations: boolean;
146
148
  supportsRewindConversation?: boolean;
@@ -516,6 +518,11 @@ export interface AgentSessionConfig {
516
518
  export interface AgentLaunchContext {
517
519
  agentId?: string;
518
520
  env?: Record<string, string>;
521
+ /**
522
+ * Runtime-only internal Paseo tools. This must never be persisted into
523
+ * AgentSessionConfig; providers may adapt it to their native tool surface.
524
+ */
525
+ paseoTools?: PaseoToolCatalog;
519
526
  }
520
527
  export interface AgentCreateSessionOptions {
521
528
  /**
@@ -578,10 +585,16 @@ export interface AgentSession {
578
585
  }): Promise<void>;
579
586
  } | null;
580
587
  }
581
- export interface FetchCatalogOptions {
588
+ export type FetchCatalogOptions = {
589
+ scope: "global";
590
+ force: boolean;
591
+ timeoutMs?: number;
592
+ } | {
593
+ scope: "workspace";
582
594
  cwd: string;
583
595
  force: boolean;
584
- }
596
+ timeoutMs?: number;
597
+ };
585
598
  export interface ProviderCatalog {
586
599
  models: AgentModelDefinition[];
587
600
  modes: AgentMode[];
@@ -1,48 +1,5 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import type { Logger } from "pino";
3
- import type { AgentManager } from "./agent-manager.js";
4
- import type { AgentStorage } from "./agent-storage.js";
5
- import { type ArchiveDependencies } from "../workspace-archive-service.js";
6
- import type { VoiceCallerContext, VoiceSpeakHandler } from "../voice-types.js";
7
- import type { TerminalManager } from "../../terminal/terminal-manager.js";
8
- import type { CreatePaseoWorktreeWorkflowFn } from "../worktree-session.js";
9
- import type { ScheduleService } from "../schedule/service.js";
10
- import { type ProviderSnapshotManager } from "./provider-snapshot-manager.js";
11
- import type { GitHubService } from "../../services/github-service.js";
12
- import type { WorkspaceGitService } from "../workspace-git-service.js";
13
- export interface AgentMcpServerOptions {
14
- agentManager: AgentManager;
15
- agentStorage: AgentStorage;
16
- terminalManager?: TerminalManager | null;
17
- getDaemonTcpPort?: () => number | null;
18
- scheduleService?: ScheduleService | null;
19
- providerSnapshotManager: ProviderSnapshotManager;
20
- github?: GitHubService;
21
- workspaceGitService?: Pick<WorkspaceGitService, "getSnapshot" | "listWorktrees" | "resolveRepoRoot">;
22
- findWorkspaceIdForCwd?: ArchiveDependencies["findWorkspaceIdForCwd"];
23
- listActiveWorkspaces?: ArchiveDependencies["listActiveWorkspaces"];
24
- archiveWorkspaceRecord?: ArchiveDependencies["archiveWorkspaceRecord"];
25
- emitWorkspaceUpdatesForWorkspaceIds?: ArchiveDependencies["emitWorkspaceUpdatesForWorkspaceIds"];
26
- markWorkspaceArchiving?: ArchiveDependencies["markWorkspaceArchiving"];
27
- clearWorkspaceArchiving?: ArchiveDependencies["clearWorkspaceArchiving"];
28
- createPaseoWorktree?: CreatePaseoWorktreeWorkflowFn;
29
- ensureWorkspaceForCreate?: (cwd: string) => Promise<string>;
30
- paseoHome?: string;
31
- worktreesRoot?: string;
32
- /**
33
- * ID of the agent that is connecting to this MCP server.
34
- * Used for cwd/mode inheritance when agents spawn child agents.
35
- */
36
- callerAgentId?: string;
37
- /**
38
- * Optional resolver for session-bound speak handlers.
39
- * Used by hidden voice agents to narrate through daemon-managed TTS.
40
- */
41
- resolveSpeakHandler?: (callerAgentId: string) => VoiceSpeakHandler | null;
42
- resolveCallerContext?: (callerAgentId: string) => VoiceCallerContext | null;
43
- enableVoiceTools?: boolean;
44
- voiceOnly?: boolean;
45
- logger: Logger;
46
- }
2
+ import { type PaseoToolHostDependencies } from "./tools/paseo-tools.js";
3
+ export type AgentMcpServerOptions = PaseoToolHostDependencies;
47
4
  export declare function createAgentMcpServer(options: AgentMcpServerOptions): Promise<McpServer>;
48
5
  //# sourceMappingURL=mcp-server.d.ts.map