@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
@@ -0,0 +1,431 @@
1
+ import { open, statfs } from "node:fs/promises";
2
+ import { cpus, freemem, loadavg, platform, release, totalmem, type } from "node:os";
3
+ import path from "node:path";
4
+ import { execCommand } from "../../../utils/spawn.js";
5
+ const TOOL_TIMEOUT_MS = 3000;
6
+ const TOOL_OUTPUT_LIMIT = 512;
7
+ const LOG_TAIL_LINES = 80;
8
+ const LOG_TAIL_MAX_BYTES = 64 * 1024;
9
+ export async function collectDaemonDiagnostics(options) {
10
+ const sections = [
11
+ formatSection("Paseo diagnostics", [
12
+ { label: "Collected at", value: new Date().toISOString() },
13
+ { label: "Server ID", value: options.serverId ?? "unknown" },
14
+ { label: "Daemon version", value: options.daemonVersion ?? "unknown" },
15
+ ]),
16
+ ];
17
+ sections.push(await safeSection("Daemon process", () => collectProcessEntries(options), options.logger));
18
+ sections.push(await safeSection("Runtime config", () => collectRuntimeConfigEntries(options), options.logger));
19
+ sections.push(await safeSection("System", collectSystemEntries, options.logger));
20
+ sections.push(await safeSection("Disk", () => collectDiskEntries(options), options.logger));
21
+ sections.push(await safeSection("Agents", () => collectAgentEntries(options), options.logger));
22
+ sections.push(await safeSection("Workspaces", () => collectWorkspaceEntries(options), options.logger));
23
+ sections.push(await safeSection("Providers", () => collectProviderEntries(options), options.logger));
24
+ sections.push(await safeSection("WebSocket runtime metrics", () => collectWebSocketRuntimeEntries(options), options.logger));
25
+ sections.push(await safeSection("Tools", collectToolEntries, options.logger));
26
+ sections.push(await safeLogTailSection(options));
27
+ return redactDiagnostic(sections.filter(Boolean).join("\n\n"), options);
28
+ }
29
+ async function safeSection(title, collect, logger) {
30
+ try {
31
+ return formatSection(title, await collect());
32
+ }
33
+ catch (error) {
34
+ logger.debug({ err: error, title }, "diagnostic section failed");
35
+ return formatSection(title, [{ label: "Error", value: toErrorMessage(error) }]);
36
+ }
37
+ }
38
+ function formatSection(title, entries) {
39
+ return [title, ...entries.map((entry) => ` ${entry.label}: ${entry.value}`)].join("\n");
40
+ }
41
+ function collectProcessEntries(options) {
42
+ const memory = process.memoryUsage();
43
+ return [
44
+ { label: "PID", value: String(process.pid) },
45
+ { label: "Node", value: process.version },
46
+ { label: "Node path", value: process.execPath },
47
+ { label: "PATH", value: getEnvValue("PATH", "Path") ?? "unset" },
48
+ { label: "Shell", value: formatDaemonShell() },
49
+ { label: "Uptime", value: formatDurationMs(process.uptime() * 1000) },
50
+ { label: "Paseo home", value: options.paseoHome },
51
+ { label: "RSS", value: formatBytes(memory.rss) },
52
+ {
53
+ label: "Heap used",
54
+ value: `${formatBytes(memory.heapUsed)} / ${formatBytes(memory.heapTotal)}`,
55
+ },
56
+ { label: "External", value: formatBytes(memory.external) },
57
+ ];
58
+ }
59
+ function collectRuntimeConfigEntries(options) {
60
+ const relay = options.daemonRuntimeConfig?.relay ?? null;
61
+ return [
62
+ { label: "Listen", value: formatListenKind(options.daemonRuntimeConfig?.listen ?? null) },
63
+ { label: "Relay enabled", value: relay ? String(relay.enabled) : "false" },
64
+ { label: "Relay endpoint configured", value: relay?.endpoint ? "true" : "false" },
65
+ { label: "Relay public endpoint configured", value: relay?.publicEndpoint ? "true" : "false" },
66
+ { label: "Relay TLS", value: relay ? String(relay.useTls) : "n/a" },
67
+ { label: "Relay public TLS", value: relay ? String(relay.publicUseTls) : "n/a" },
68
+ ];
69
+ }
70
+ function collectSystemEntries() {
71
+ const loads = loadavg();
72
+ return [
73
+ { label: "OS", value: `${type()} ${release()}` },
74
+ { label: "Platform", value: `${platform()} ${process.arch}` },
75
+ { label: "CPU cores", value: String(cpus().length) },
76
+ { label: "Load avg", value: loads.map((value) => value.toFixed(2)).join(", ") },
77
+ { label: "Memory free", value: `${formatBytes(freemem())} / ${formatBytes(totalmem())}` },
78
+ ];
79
+ }
80
+ async function collectDiskEntries(options) {
81
+ const stats = await statfs(options.paseoHome);
82
+ const freeBytes = stats.bavail * stats.bsize;
83
+ const totalBytes = stats.blocks * stats.bsize;
84
+ return [
85
+ { label: "Path", value: options.paseoHome },
86
+ { label: "Free", value: `${formatBytes(freeBytes)} / ${formatBytes(totalBytes)}` },
87
+ ];
88
+ }
89
+ function collectAgentEntries(options) {
90
+ const agents = options.listAgents();
91
+ return [
92
+ { label: "Total", value: String(agents.length) },
93
+ { label: "By provider", value: formatCountMap(countBy(agents, (agent) => agent.provider)) },
94
+ { label: "By lifecycle", value: formatCountMap(countBy(agents, (agent) => agent.lifecycle)) },
95
+ {
96
+ label: "Pending permissions",
97
+ value: String(agents.reduce((total, agent) => total + (agent.pendingPermissions?.size ?? 0), 0)),
98
+ },
99
+ ];
100
+ }
101
+ async function collectWorkspaceEntries(options) {
102
+ const [projects, workspaces] = await Promise.all([
103
+ options.listProjects(),
104
+ options.listWorkspaces(),
105
+ ]);
106
+ const activeProjects = projects.filter((project) => !project.archivedAt);
107
+ const activeWorkspaces = workspaces.filter((workspace) => !workspace.archivedAt);
108
+ return [
109
+ { label: "Projects", value: `${activeProjects.length} active / ${projects.length} total` },
110
+ {
111
+ label: "Workspaces",
112
+ value: `${activeWorkspaces.length} active / ${workspaces.length} total`,
113
+ },
114
+ {
115
+ label: "Workspaces by kind",
116
+ value: formatCountMap(countBy(activeWorkspaces, (workspace) => workspace.kind)),
117
+ },
118
+ ];
119
+ }
120
+ async function collectProviderEntries(options) {
121
+ const providers = await options.listProviderAvailability();
122
+ return [
123
+ { label: "Total", value: String(providers.length) },
124
+ {
125
+ label: "Available",
126
+ value: String(providers.filter((provider) => provider.available).length),
127
+ },
128
+ {
129
+ label: "Unavailable",
130
+ value: providers
131
+ .filter((provider) => !provider.available)
132
+ .map((provider) => provider.error ? `${provider.provider} (${provider.error})` : provider.provider)
133
+ .join(", ") || "none",
134
+ },
135
+ ];
136
+ }
137
+ async function collectToolEntries() {
138
+ const [git, gh] = await Promise.all([
139
+ checkTool("git", ["--version"]),
140
+ checkTool("gh", ["--version"]),
141
+ ]);
142
+ return [
143
+ { label: "git", value: git },
144
+ { label: "gh", value: gh },
145
+ ];
146
+ }
147
+ function collectWebSocketRuntimeEntries(options) {
148
+ const snapshot = options.getWebSocketRuntimeMetrics();
149
+ if (!snapshot) {
150
+ return [{ label: "Status", value: "no runtime metrics window has been flushed yet" }];
151
+ }
152
+ const runtime = snapshot.runtime;
153
+ const agents = snapshot.agents;
154
+ return [
155
+ { label: "Collected at", value: snapshot.collectedAt },
156
+ { label: "Window", value: formatDurationMs(snapshot.windowMs) },
157
+ { label: "Process uptime", value: formatDurationMs(snapshot.uptimeSeconds * 1000) },
158
+ {
159
+ label: "Process memory",
160
+ value: [
161
+ `rss=${formatBytes(snapshot.memory.rss)}`,
162
+ `heap=${formatBytes(snapshot.memory.heapUsed)} / ${formatBytes(snapshot.memory.heapTotal)}`,
163
+ `external=${formatBytes(snapshot.memory.external)}`,
164
+ `arrayBuffers=${formatBytes(snapshot.memory.arrayBuffers)}`,
165
+ ].join(", "),
166
+ },
167
+ { label: "Final", value: String(snapshot.final) },
168
+ {
169
+ label: "Sessions",
170
+ value: [
171
+ `active=${snapshot.sessions.activeConnections}`,
172
+ `externalKeys=${snapshot.sessions.externalSessionKeys}`,
173
+ `reconnectGrace=${snapshot.sessions.reconnectGraceSessions}`,
174
+ ].join(", "),
175
+ },
176
+ {
177
+ label: "Sockets",
178
+ value: [
179
+ `active=${snapshot.sockets.activeSockets}`,
180
+ `pending=${snapshot.sockets.pendingConnections}`,
181
+ ].join(", "),
182
+ },
183
+ {
184
+ label: "Runtime requests",
185
+ value: [
186
+ `inflight=${formatNumberMetric(runtime.inflightRequests)}`,
187
+ `peakInflight=${formatNumberMetric(runtime.peakInflightRequests)}`,
188
+ ].join(", "),
189
+ },
190
+ {
191
+ label: "Terminal subscriptions",
192
+ value: [
193
+ `terminals=${formatNumberMetric(runtime.terminalSubscriptionCount)}`,
194
+ `directories=${formatNumberMetric(runtime.terminalDirectorySubscriptionCount)}`,
195
+ ].join(", "),
196
+ },
197
+ {
198
+ label: "Checkout diff",
199
+ value: [
200
+ `targets=${formatNumberMetric(runtime.checkoutDiffTargetCount)}`,
201
+ `subscriptions=${formatNumberMetric(runtime.checkoutDiffSubscriptionCount)}`,
202
+ `watchers=${formatNumberMetric(runtime.checkoutDiffWatcherCount)}`,
203
+ `fallbackRefreshTargets=${formatNumberMetric(runtime.checkoutDiffFallbackRefreshTargetCount)}`,
204
+ ].join(", "),
205
+ },
206
+ {
207
+ label: "Buffered amount",
208
+ value: `p95=${formatBytes(snapshot.bufferedAmount.p95)}, max=${formatBytes(snapshot.bufferedAmount.max)}`,
209
+ },
210
+ { label: "Event loop delay", value: formatEventLoopDelay(snapshot.eventLoopDelay) },
211
+ { label: "Latency", value: formatLatencyStats(snapshot.latency) },
212
+ { label: "Inbound messages", value: formatTopCounts(snapshot.inboundMessageTypesTop) },
213
+ {
214
+ label: "Inbound session requests",
215
+ value: formatTopCounts(snapshot.inboundSessionRequestTypesTop),
216
+ },
217
+ { label: "Outbound messages", value: formatTopCounts(snapshot.outboundMessageTypesTop) },
218
+ {
219
+ label: "Outbound session messages",
220
+ value: formatTopCounts(snapshot.outboundSessionMessageTypesTop),
221
+ },
222
+ { label: "Agent streams", value: formatTopCounts(snapshot.outboundAgentStreamTypesTop) },
223
+ { label: "Agent stream agents", value: formatTopCounts(snapshot.outboundAgentStreamAgentsTop) },
224
+ { label: "Binary frames", value: formatTopCounts(snapshot.outboundBinaryFrameTypesTop) },
225
+ { label: "Counters", value: formatNonZeroNumberRecord(snapshot.counters) },
226
+ {
227
+ label: "Agent metrics",
228
+ value: [
229
+ `total=${formatNumberMetric(agents.total)}`,
230
+ `activeForegroundTurns=${formatNumberMetric(agents.withActiveForegroundTurn)}`,
231
+ ].join(", "),
232
+ },
233
+ { label: "Agent lifecycle", value: formatNumberRecord(agents.byLifecycle) },
234
+ {
235
+ label: "Agent timelines",
236
+ value: [
237
+ `items=${formatNumberMetric(agents.timelineStats?.totalItems)}`,
238
+ `maxPerAgent=${formatNumberMetric(agents.timelineStats?.maxItemsPerAgent)}`,
239
+ ].join(", "),
240
+ },
241
+ ];
242
+ }
243
+ function formatTopCounts(counts) {
244
+ if (counts.length === 0)
245
+ return "none";
246
+ return counts.map(([key, count]) => `${key}=${count}`).join(", ");
247
+ }
248
+ function formatLatencyStats(stats) {
249
+ if (stats.length === 0)
250
+ return "none";
251
+ return stats
252
+ .map((stat) => `${stat.type} count=${stat.count} p50=${formatMilliseconds(stat.p50Ms)} max=${formatMilliseconds(stat.maxMs)} total=${formatMilliseconds(stat.totalMs)}`)
253
+ .join("; ");
254
+ }
255
+ function formatEventLoopDelay(stats) {
256
+ if (!stats)
257
+ return "unavailable";
258
+ return `p50=${formatMilliseconds(stats.p50Ms)}, p99=${formatMilliseconds(stats.p99Ms)}, max=${formatMilliseconds(stats.maxMs)}`;
259
+ }
260
+ function formatNumberRecord(record) {
261
+ if (!record)
262
+ return "unknown";
263
+ const entries = Object.entries(record).filter(([, value]) => Number.isFinite(value));
264
+ if (entries.length === 0)
265
+ return "none";
266
+ return entries
267
+ .sort(([left], [right]) => left.localeCompare(right))
268
+ .map(([key, value]) => `${key}=${value}`)
269
+ .join(", ");
270
+ }
271
+ function formatNonZeroNumberRecord(record) {
272
+ const entries = Object.entries(record).filter(([, value]) => Number.isFinite(value) && value !== 0);
273
+ if (entries.length === 0)
274
+ return "none";
275
+ return entries
276
+ .sort(([left], [right]) => left.localeCompare(right))
277
+ .map(([key, value]) => `${key}=${value}`)
278
+ .join(", ");
279
+ }
280
+ function formatNumberMetric(value) {
281
+ if (typeof value !== "number" || !Number.isFinite(value))
282
+ return "unknown";
283
+ return String(value);
284
+ }
285
+ function formatMilliseconds(ms) {
286
+ if (!Number.isFinite(ms) || ms < 0)
287
+ return "unknown";
288
+ return `${Math.round(ms)}ms`;
289
+ }
290
+ async function checkTool(command, args) {
291
+ try {
292
+ const result = await execCommand(command, args, {
293
+ timeout: TOOL_TIMEOUT_MS,
294
+ maxBuffer: TOOL_OUTPUT_LIMIT * 2,
295
+ });
296
+ const output = truncateForDiagnostic((result.stdout || result.stderr).trim(), TOOL_OUTPUT_LIMIT);
297
+ return output || "ok";
298
+ }
299
+ catch (error) {
300
+ return `error: ${truncateForDiagnostic(toErrorMessage(error), TOOL_OUTPUT_LIMIT)}`;
301
+ }
302
+ }
303
+ async function safeLogTailSection(options) {
304
+ const logPath = path.join(options.paseoHome, "daemon.log");
305
+ try {
306
+ const tail = await tailFile(logPath, LOG_TAIL_LINES, LOG_TAIL_MAX_BYTES);
307
+ return ["Daemon log tail", ` Path: ${logPath}`, tail ? tail : " No log lines found"].join("\n");
308
+ }
309
+ catch (error) {
310
+ options.logger.debug({ err: error, logPath }, "diagnostic log tail failed");
311
+ return ["Daemon log tail", ` Path: ${logPath}`, ` Error: ${toErrorMessage(error)}`].join("\n");
312
+ }
313
+ }
314
+ async function tailFile(filePath, lines, maxBytes) {
315
+ const handle = await open(filePath, "r");
316
+ try {
317
+ const stats = await handle.stat();
318
+ const length = Math.min(stats.size, maxBytes);
319
+ const buffer = Buffer.alloc(length);
320
+ await handle.read(buffer, 0, length, stats.size - length);
321
+ return buffer
322
+ .toString("utf8")
323
+ .split("\n")
324
+ .filter(Boolean)
325
+ .slice(-lines)
326
+ .map((line) => ` ${line}`)
327
+ .join("\n");
328
+ }
329
+ finally {
330
+ await handle.close();
331
+ }
332
+ }
333
+ function formatListenKind(listen) {
334
+ if (!listen)
335
+ return "not configured";
336
+ if (listen.startsWith("unix://") || listen.startsWith("/"))
337
+ return "local socket";
338
+ if (listen.startsWith("pipe://") || listen.startsWith("\\\\.\\pipe\\"))
339
+ return "local pipe";
340
+ return "direct TCP";
341
+ }
342
+ function countBy(items, getKey) {
343
+ const counts = new Map();
344
+ for (const item of items) {
345
+ const key = getKey(item) || "unknown";
346
+ counts.set(key, (counts.get(key) ?? 0) + 1);
347
+ }
348
+ return counts;
349
+ }
350
+ function formatCountMap(counts) {
351
+ if (counts.size === 0)
352
+ return "none";
353
+ return [...counts.entries()]
354
+ .sort(([left], [right]) => left.localeCompare(right))
355
+ .map(([key, count]) => `${key}=${count}`)
356
+ .join(", ");
357
+ }
358
+ function formatDurationMs(ms) {
359
+ const seconds = Math.max(0, Math.round(ms / 1000));
360
+ const hours = Math.floor(seconds / 3600);
361
+ const minutes = Math.floor((seconds % 3600) / 60);
362
+ const remainingSeconds = seconds % 60;
363
+ if (hours > 0)
364
+ return `${hours}h ${minutes}m ${remainingSeconds}s`;
365
+ if (minutes > 0)
366
+ return `${minutes}m ${remainingSeconds}s`;
367
+ return `${remainingSeconds}s`;
368
+ }
369
+ function formatBytes(bytes) {
370
+ if (!Number.isFinite(bytes) || bytes < 0)
371
+ return "unknown";
372
+ const units = ["B", "KiB", "MiB", "GiB", "TiB"];
373
+ let value = bytes;
374
+ let unitIndex = 0;
375
+ while (value >= 1024 && unitIndex < units.length - 1) {
376
+ value /= 1024;
377
+ unitIndex += 1;
378
+ }
379
+ return `${value.toFixed(unitIndex === 0 ? 0 : 1)} ${units[unitIndex]}`;
380
+ }
381
+ function truncateForDiagnostic(value, maxLength) {
382
+ const trimmed = value.trim();
383
+ if (trimmed.length <= maxLength)
384
+ return trimmed;
385
+ return `${trimmed.slice(0, maxLength)}...(truncated)`;
386
+ }
387
+ function formatDaemonShell() {
388
+ const shell = getEnvValue("SHELL");
389
+ if (shell)
390
+ return `SHELL=${shell}`;
391
+ const comspec = getEnvValue("ComSpec", "COMSPEC");
392
+ if (comspec)
393
+ return `ComSpec=${comspec}`;
394
+ return "unset";
395
+ }
396
+ function getEnvValue(...names) {
397
+ for (const name of names) {
398
+ const value = process.env[name];
399
+ if (value)
400
+ return value;
401
+ }
402
+ const lowerNames = new Set(names.map((name) => name.toLowerCase()));
403
+ for (const [key, value] of Object.entries(process.env)) {
404
+ if (value && lowerNames.has(key.toLowerCase()))
405
+ return value;
406
+ }
407
+ return null;
408
+ }
409
+ function toErrorMessage(error) {
410
+ if (error instanceof Error)
411
+ return error.message;
412
+ if (typeof error === "string")
413
+ return error;
414
+ return String(error);
415
+ }
416
+ export function redactDiagnostic(value, options) {
417
+ let redacted = value;
418
+ const sensitiveValues = [
419
+ options?.daemonRuntimeConfig?.listen,
420
+ options?.daemonRuntimeConfig?.relay?.endpoint,
421
+ options?.daemonRuntimeConfig?.relay?.publicEndpoint,
422
+ ].filter((item) => Boolean(item));
423
+ for (const sensitive of sensitiveValues) {
424
+ redacted = redacted.split(sensitive).join("[redacted]");
425
+ }
426
+ return redacted
427
+ .replace(/paseo:\/\/\S+/gi, "paseo://[redacted]")
428
+ .replace(/([?&](?:password|token|secret|key|publicKey|daemonPublicKeyB64)=)[^&\s"']+/gi, "$1[redacted]")
429
+ .replace(/((?:password|token|secret|authorization|api[_-]?key|daemonPublicKeyB64|relayKey)\s*[:=]\s*)("[^"]+"|'[^']+'|[^\s,}]+)/gi, "$1[redacted]");
430
+ }
431
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1,7 @@
1
+ import { type NpmGlobalPaseoInstall } from "./npm-global-cli.js";
2
+ export interface DaemonInstallOriginRuntime {
3
+ resolveCurrentServerPackageRoot(): string | null;
4
+ }
5
+ export declare const daemonInstallOriginRuntime: DaemonInstallOriginRuntime;
6
+ export declare function validateDaemonInstallOrigin(install: NpmGlobalPaseoInstall, daemonVersion: string | null, runtime?: DaemonInstallOriginRuntime): string | null;
7
+ //# sourceMappingURL=install-origin.d.ts.map
@@ -0,0 +1,64 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { z } from "zod";
5
+ import { isRealpathInsideRoot } from "../../../utils/path.js";
6
+ import { PASEO_CLI_PACKAGE } from "./npm-global-cli.js";
7
+ const PackageJsonSchema = z.object({ name: z.string().optional() }).passthrough();
8
+ export const daemonInstallOriginRuntime = {
9
+ resolveCurrentServerPackageRoot,
10
+ };
11
+ export function validateDaemonInstallOrigin(install, daemonVersion, runtime = daemonInstallOriginRuntime) {
12
+ if (install.isLinked) {
13
+ return `The global ${PASEO_CLI_PACKAGE} install is linked; self-update only supports normal npm global installs.`;
14
+ }
15
+ if (daemonVersion && install.version !== daemonVersion) {
16
+ return `This daemon is not running from the npm global ${PASEO_CLI_PACKAGE} install (global npm has ${install.version}, daemon is ${daemonVersion}).`;
17
+ }
18
+ const currentServerPackageRoot = runtime.resolveCurrentServerPackageRoot();
19
+ if (!currentServerPackageRoot) {
20
+ return "Unable to verify that this daemon is running from an npm global install.";
21
+ }
22
+ if (!isCurrentServerUnderNpmInstall(currentServerPackageRoot, install)) {
23
+ return `This daemon is not running from the npm global ${PASEO_CLI_PACKAGE} install.`;
24
+ }
25
+ return null;
26
+ }
27
+ function isCurrentServerUnderNpmInstall(currentServerPackageRoot, install) {
28
+ const roots = install.globalRootPath
29
+ ? [install.packagePath, globalNodeModulesPath(install.globalRootPath)]
30
+ : [install.packagePath];
31
+ return roots.some((root) => isRealpathInsideRoot(root, currentServerPackageRoot));
32
+ }
33
+ function globalNodeModulesPath(globalRootPath) {
34
+ const normalized = path.normalize(globalRootPath);
35
+ return path.basename(normalized) === "node_modules"
36
+ ? normalized
37
+ : path.join(normalized, "node_modules");
38
+ }
39
+ function resolveCurrentServerPackageRoot() {
40
+ return resolvePackageRootFrom(fileURLToPath(import.meta.url), "@getpaseo/server");
41
+ }
42
+ function resolvePackageRootFrom(startPath, packageName) {
43
+ let currentDir = path.dirname(startPath);
44
+ while (true) {
45
+ const packageJsonPath = path.join(currentDir, "package.json");
46
+ if (existsSync(packageJsonPath)) {
47
+ try {
48
+ const packageJson = PackageJsonSchema.parse(JSON.parse(readFileSync(packageJsonPath, "utf8")));
49
+ if (packageJson.name === packageName) {
50
+ return currentDir;
51
+ }
52
+ }
53
+ catch {
54
+ return null;
55
+ }
56
+ }
57
+ const parentDir = path.dirname(currentDir);
58
+ if (parentDir === currentDir) {
59
+ return null;
60
+ }
61
+ currentDir = parentDir;
62
+ }
63
+ }
64
+ //# sourceMappingURL=install-origin.js.map
@@ -0,0 +1,29 @@
1
+ export declare const PASEO_CLI_PACKAGE = "@getpaseo/cli";
2
+ export interface CommandOptions {
3
+ timeout?: number;
4
+ maxBuffer?: number;
5
+ }
6
+ export interface CommandResult {
7
+ exitCode: number;
8
+ stdout: string;
9
+ stderr: string;
10
+ }
11
+ export interface NpmGlobalPaseoInstall {
12
+ version: string;
13
+ packagePath: string;
14
+ globalRootPath: string | null;
15
+ isLinked: boolean;
16
+ }
17
+ export interface NpmGlobalPaseoCli {
18
+ inspect(): Promise<NpmGlobalPaseoInstall>;
19
+ installLatest(): Promise<CommandResult>;
20
+ }
21
+ export type CommandRunner = (command: string, args: string[], options?: CommandOptions) => Promise<CommandResult>;
22
+ export declare class DefaultNpmGlobalPaseoCli implements NpmGlobalPaseoCli {
23
+ private readonly runCommand;
24
+ constructor(runCommand?: CommandRunner);
25
+ inspect(): Promise<NpmGlobalPaseoInstall>;
26
+ installLatest(): Promise<CommandResult>;
27
+ }
28
+ export declare const npmGlobalPaseoCli: DefaultNpmGlobalPaseoCli;
29
+ //# sourceMappingURL=npm-global-cli.d.ts.map
@@ -0,0 +1,98 @@
1
+ import { getErrorMessage } from "@getpaseo/protocol/error-utils";
2
+ import { z } from "zod";
3
+ import { execCommand } from "../../../utils/spawn.js";
4
+ export const PASEO_CLI_PACKAGE = "@getpaseo/cli";
5
+ const NPM_PROBE_TIMEOUT_MS = 10000;
6
+ const NPM_INSTALL_TIMEOUT_MS = 300000;
7
+ const NPM_MAX_BUFFER_BYTES = 10 * 1024 * 1024;
8
+ const NpmGlobalListSchema = z
9
+ .object({
10
+ path: z.string().optional(),
11
+ dependencies: z.record(z.string(), z.unknown()).optional(),
12
+ })
13
+ .passthrough();
14
+ const NpmGlobalCliPackageSchema = z
15
+ .object({
16
+ version: z.string(),
17
+ path: z.string(),
18
+ link: z.boolean().optional(),
19
+ })
20
+ .passthrough();
21
+ const CommandErrorSchema = z
22
+ .object({
23
+ code: z.union([z.number(), z.string()]).optional(),
24
+ stdout: z.string().optional(),
25
+ stderr: z.string().optional(),
26
+ })
27
+ .passthrough();
28
+ async function runExternalCommand(command, args, options) {
29
+ try {
30
+ const { stdout, stderr } = await execCommand(command, args, {
31
+ timeout: options?.timeout,
32
+ maxBuffer: options?.maxBuffer,
33
+ });
34
+ return { exitCode: 0, stdout, stderr };
35
+ }
36
+ catch (error) {
37
+ const parsed = CommandErrorSchema.safeParse(error);
38
+ if (!parsed.success) {
39
+ return { exitCode: 1, stdout: "", stderr: getErrorMessage(error) };
40
+ }
41
+ return {
42
+ exitCode: typeof parsed.data.code === "number" ? parsed.data.code : 1,
43
+ stdout: parsed.data.stdout ?? "",
44
+ stderr: parsed.data.stderr || getErrorMessage(error),
45
+ };
46
+ }
47
+ }
48
+ function parseNpmGlobalPaseoInstall(stdout) {
49
+ let parsedJson;
50
+ try {
51
+ parsedJson = JSON.parse(stdout);
52
+ }
53
+ catch {
54
+ return null;
55
+ }
56
+ const list = NpmGlobalListSchema.safeParse(parsedJson);
57
+ if (!list.success) {
58
+ return null;
59
+ }
60
+ const rawCliPackage = list.data.dependencies?.[PASEO_CLI_PACKAGE];
61
+ const cliPackage = NpmGlobalCliPackageSchema.safeParse(rawCliPackage);
62
+ if (!cliPackage.success) {
63
+ return null;
64
+ }
65
+ return {
66
+ version: cliPackage.data.version,
67
+ packagePath: cliPackage.data.path,
68
+ globalRootPath: list.data.path ?? null,
69
+ isLinked: cliPackage.data.link === true,
70
+ };
71
+ }
72
+ export class DefaultNpmGlobalPaseoCli {
73
+ constructor(runCommand = runExternalCommand) {
74
+ this.runCommand = runCommand;
75
+ }
76
+ async inspect() {
77
+ const result = await this.runCommand("npm", ["-g", "ls", PASEO_CLI_PACKAGE, "--json", "--depth=0", "--long"], {
78
+ timeout: NPM_PROBE_TIMEOUT_MS,
79
+ maxBuffer: NPM_MAX_BUFFER_BYTES,
80
+ });
81
+ if (result.exitCode !== 0 && result.stdout.trim().length === 0) {
82
+ throw new Error(result.stderr.trim() || "npm is not available on this host");
83
+ }
84
+ const install = parseNpmGlobalPaseoInstall(result.stdout);
85
+ if (!install) {
86
+ throw new Error(`${PASEO_CLI_PACKAGE} is not installed with npm -g on this host`);
87
+ }
88
+ return install;
89
+ }
90
+ installLatest() {
91
+ return this.runCommand("npm", ["install", "-g", `${PASEO_CLI_PACKAGE}@latest`], {
92
+ timeout: NPM_INSTALL_TIMEOUT_MS,
93
+ maxBuffer: NPM_MAX_BUFFER_BYTES,
94
+ });
95
+ }
96
+ }
97
+ export const npmGlobalPaseoCli = new DefaultNpmGlobalPaseoCli();
98
+ //# sourceMappingURL=npm-global-cli.js.map
@@ -0,0 +1,34 @@
1
+ import type pino from "pino";
2
+ import type { GitHubService } from "../../../services/github-service.js";
3
+ import { type CheckoutExistingBranchResult, type GitMutationRefreshReason } from "../../../utils/checkout-git.js";
4
+ import type { WorkspaceGitService } from "../../workspace-git-service.js";
5
+ /**
6
+ * The git branch / working-tree mutation primitives a client session performs on a
7
+ * workspace: switch to an existing branch, create a branch from a base, and force a
8
+ * snapshot refresh (plus optional GitHub cache invalidation) after any mutation.
9
+ *
10
+ * CheckoutSession (the branch/commit/merge commands), the worktree session-config
11
+ * builder, and the auto-naming + worktree-creation paths all funnel their git
12
+ * mutations through this one module, so the validate-ref → clean-tree → execute →
13
+ * refresh sequence lives in a single place instead of being smeared across the
14
+ * session as loose callbacks.
15
+ */
16
+ export interface GitMutationService {
17
+ checkoutExistingBranch(cwd: string, branch: string): Promise<CheckoutExistingBranchResult>;
18
+ createBranchFromBase(params: {
19
+ cwd: string;
20
+ baseBranch: string;
21
+ newBranchName: string;
22
+ }): Promise<void>;
23
+ notifyGitMutation(cwd: string, reason: GitMutationRefreshReason, options?: {
24
+ invalidateGithub?: boolean;
25
+ }): Promise<void>;
26
+ }
27
+ type GitMutationGitSource = Pick<WorkspaceGitService, "validateBranchRef" | "getSnapshot" | "hasLocalBranch">;
28
+ export declare function createGitMutationService(deps: {
29
+ workspaceGitService: GitMutationGitSource;
30
+ github: Pick<GitHubService, "invalidate">;
31
+ logger: pino.Logger;
32
+ }): GitMutationService;
33
+ export {};
34
+ //# sourceMappingURL=git-mutation-service.d.ts.map