@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,159 @@
1
+ import { z } from "zod";
2
+ import { StructuredAgentFallbackError, StructuredAgentResponseError, generateStructuredAgentResponseWithFallback, } from "../../agent/agent-response-loop.js";
3
+ import { resolveStructuredGenerationProviders, } from "../../agent/structured-generation-providers.js";
4
+ import { buildMetadataPrompt, } from "../../../utils/build-metadata-prompt.js";
5
+ const COMMIT_MESSAGE_SCHEMA = z.object({
6
+ message: z
7
+ .string()
8
+ .min(1)
9
+ .max(72)
10
+ .describe("Concise git commit message, imperative mood, no trailing period."),
11
+ });
12
+ const PULL_REQUEST_SCHEMA = z.object({
13
+ title: z.string().min(1).max(72),
14
+ body: z.string().min(1),
15
+ });
16
+ const COMMIT_MESSAGE_FALLBACK = "Update files";
17
+ const PULL_REQUEST_FALLBACK = {
18
+ title: "Update changes",
19
+ body: "Automated PR generated by Paseo.",
20
+ };
21
+ const MAX_COMMIT_PATCH_CHARS = 120000;
22
+ const MAX_PULL_REQUEST_PATCH_CHARS = 200000;
23
+ export function createGitMetadataGenerator(deps) {
24
+ const { workspaceGitService, generation } = deps;
25
+ async function buildPromptForDiff(input) {
26
+ const diff = await workspaceGitService.getCheckoutDiff(input.cwd, input.diffOptions);
27
+ const fileList = renderFileList(diff.structured);
28
+ const patch = truncatePatch(diff.diff, input.maxPatchChars);
29
+ return buildMetadataPrompt({
30
+ cwd: input.cwd,
31
+ workspaceGitService,
32
+ contract: input.contract,
33
+ styles: [{ configKey: input.styleConfigKey, default: input.styleDefault }],
34
+ after: [
35
+ input.jsonFieldsHint,
36
+ "",
37
+ fileList,
38
+ "",
39
+ patch.length > 0 ? patch : "(No diff available)",
40
+ ].join("\n"),
41
+ });
42
+ }
43
+ return {
44
+ async generateCommitMessage(cwd) {
45
+ const prompt = await buildPromptForDiff({
46
+ cwd,
47
+ diffOptions: { mode: "uncommitted", includeStructured: true },
48
+ maxPatchChars: MAX_COMMIT_PATCH_CHARS,
49
+ contract: "Write a concise git commit message for the changes below.",
50
+ styleConfigKey: "commitMessage",
51
+ styleDefault: "Concise, imperative mood, no trailing period.",
52
+ jsonFieldsHint: "Return JSON only with a single field 'message'.",
53
+ });
54
+ try {
55
+ const result = await generation.generate({
56
+ cwd,
57
+ prompt,
58
+ schema: COMMIT_MESSAGE_SCHEMA,
59
+ schemaName: "CommitMessage",
60
+ agentTitle: "Commit generator",
61
+ });
62
+ return result.message;
63
+ }
64
+ catch (error) {
65
+ if (isStructuredGenerationFailure(error)) {
66
+ return COMMIT_MESSAGE_FALLBACK;
67
+ }
68
+ throw error;
69
+ }
70
+ },
71
+ async generatePullRequestText(cwd, baseRef) {
72
+ const prompt = await buildPromptForDiff({
73
+ cwd,
74
+ diffOptions: { mode: "base", baseRef, includeStructured: true },
75
+ maxPatchChars: MAX_PULL_REQUEST_PATCH_CHARS,
76
+ contract: "Write a pull request title and body for the changes below.",
77
+ styleConfigKey: "pullRequest",
78
+ styleDefault: "Clear, descriptive title; body explaining what changed and why.",
79
+ jsonFieldsHint: "Return JSON only with fields 'title' and 'body'.",
80
+ });
81
+ try {
82
+ return await generation.generate({
83
+ cwd,
84
+ prompt,
85
+ schema: PULL_REQUEST_SCHEMA,
86
+ schemaName: "PullRequest",
87
+ agentTitle: "PR generator",
88
+ });
89
+ }
90
+ catch (error) {
91
+ if (isStructuredGenerationFailure(error)) {
92
+ return PULL_REQUEST_FALLBACK;
93
+ }
94
+ throw error;
95
+ }
96
+ },
97
+ };
98
+ }
99
+ /**
100
+ * Production StructuredTextGeneration: resolve the structured-generation providers
101
+ * for the cwd, then run the agent with a 2-retry fallback as an internal,
102
+ * non-persisted session.
103
+ */
104
+ export function createAgentStructuredTextGeneration(deps) {
105
+ return {
106
+ async generate({ cwd, prompt, schema, schemaName, agentTitle }) {
107
+ const providers = await resolveStructuredGenerationProviders({
108
+ cwd,
109
+ providerSnapshotManager: deps.providerSnapshotManager,
110
+ daemonConfig: deps.readDaemonConfig(),
111
+ currentSelection: deps.getFocusedSelection(cwd),
112
+ });
113
+ return generateStructuredAgentResponseWithFallback({
114
+ manager: deps.agentManager,
115
+ cwd,
116
+ prompt,
117
+ schema,
118
+ schemaName,
119
+ maxRetries: 2,
120
+ providers,
121
+ persistSession: false,
122
+ agentConfigOverrides: {
123
+ title: agentTitle,
124
+ internal: true,
125
+ },
126
+ });
127
+ },
128
+ };
129
+ }
130
+ function renderFileList(structured) {
131
+ if (!structured || structured.length === 0) {
132
+ return "Files changed: (unknown)";
133
+ }
134
+ return [
135
+ "Files changed:",
136
+ ...structured.map((file) => {
137
+ const changeType = diffChangeTypeFor(file);
138
+ const status = file.status && file.status !== "ok" ? ` [${file.status}]` : "";
139
+ return `${changeType}\t${file.path}\t(+${file.additions} -${file.deletions})${status}`;
140
+ }),
141
+ ].join("\n");
142
+ }
143
+ function truncatePatch(patch, maxPatchChars) {
144
+ if (patch.length <= maxPatchChars) {
145
+ return patch;
146
+ }
147
+ return `${patch.slice(0, maxPatchChars)}\n\n... (diff truncated to ${maxPatchChars} chars)\n`;
148
+ }
149
+ function diffChangeTypeFor(file) {
150
+ if (file.isNew)
151
+ return "A";
152
+ if (file.isDeleted)
153
+ return "D";
154
+ return "M";
155
+ }
156
+ function isStructuredGenerationFailure(error) {
157
+ return (error instanceof StructuredAgentResponseError || error instanceof StructuredAgentFallbackError);
158
+ }
159
+ //# sourceMappingURL=git-metadata-generator.js.map
@@ -0,0 +1,32 @@
1
+ import type pino from "pino";
2
+ import type { SessionInboundMessage, SessionOutboundMessage } from "../../messages.js";
3
+ import { type DaemonSelfUpdater } from "./daemon-self-updater.js";
4
+ interface DaemonSelfUpdateRestartIntent {
5
+ type: "restart";
6
+ clientId: string;
7
+ requestId: string;
8
+ reason: string;
9
+ }
10
+ export interface DaemonSelfUpdateSessionControllerOptions {
11
+ clientId: string;
12
+ daemonVersion: string | null;
13
+ emit: (msg: SessionOutboundMessage) => void;
14
+ emitLifecycleIntent: (intent: DaemonSelfUpdateRestartIntent) => void;
15
+ sessionLogger: pino.Logger;
16
+ updater?: Pick<DaemonSelfUpdater, "update">;
17
+ }
18
+ export declare class DaemonSelfUpdateSessionController {
19
+ private readonly clientId;
20
+ private readonly daemonVersion;
21
+ private readonly emit;
22
+ private readonly emitLifecycleIntent;
23
+ private readonly sessionLogger;
24
+ private readonly updater;
25
+ constructor(options: DaemonSelfUpdateSessionControllerOptions);
26
+ dispatch(msg: SessionInboundMessage): Promise<void> | undefined;
27
+ private handleDaemonUpdateRequest;
28
+ private emitProgress;
29
+ private emitResponse;
30
+ }
31
+ export {};
32
+ //# sourceMappingURL=daemon-self-update-session-controller.d.ts.map
@@ -0,0 +1,88 @@
1
+ import { daemonSelfUpdater, DaemonSelfUpdateInProgressError, } from "./daemon-self-updater.js";
2
+ import { getErrorMessage } from "@getpaseo/protocol/error-utils";
3
+ const DAEMON_SELF_UPDATE_MESSAGE_TYPES = new Set([
4
+ "daemon.update.request",
5
+ ]);
6
+ function isDaemonSelfUpdateMessage(msg) {
7
+ return DAEMON_SELF_UPDATE_MESSAGE_TYPES.has(msg.type);
8
+ }
9
+ export class DaemonSelfUpdateSessionController {
10
+ constructor(options) {
11
+ this.clientId = options.clientId;
12
+ this.daemonVersion = options.daemonVersion;
13
+ this.emit = options.emit;
14
+ this.emitLifecycleIntent = options.emitLifecycleIntent;
15
+ this.sessionLogger = options.sessionLogger;
16
+ this.updater = options.updater ?? daemonSelfUpdater;
17
+ }
18
+ dispatch(msg) {
19
+ if (!isDaemonSelfUpdateMessage(msg)) {
20
+ return undefined;
21
+ }
22
+ return this.handleDaemonUpdateRequest(msg);
23
+ }
24
+ async handleDaemonUpdateRequest(msg) {
25
+ const previousVersion = this.daemonVersion;
26
+ try {
27
+ const result = await this.updater.update({
28
+ daemonVersion: previousVersion,
29
+ onProgress: (phase) => this.emitProgress(msg.requestId, phase),
30
+ logger: this.sessionLogger,
31
+ });
32
+ this.emitResponse({
33
+ requestId: msg.requestId,
34
+ success: result.success,
35
+ error: result.error,
36
+ previousVersion,
37
+ newVersion: result.newVersion,
38
+ });
39
+ if (!result.success) {
40
+ return;
41
+ }
42
+ this.emitLifecycleIntent({
43
+ type: "restart",
44
+ clientId: this.clientId,
45
+ requestId: msg.requestId,
46
+ reason: "daemon_update",
47
+ });
48
+ }
49
+ catch (error) {
50
+ if (error instanceof DaemonSelfUpdateInProgressError) {
51
+ this.emit({
52
+ type: "rpc_error",
53
+ payload: {
54
+ requestId: msg.requestId,
55
+ requestType: "daemon.update.request",
56
+ error: error.message,
57
+ code: "already_updating",
58
+ },
59
+ });
60
+ return;
61
+ }
62
+ this.sessionLogger.error({ err: error }, "Daemon update failed with exception");
63
+ this.emitResponse({
64
+ requestId: msg.requestId,
65
+ success: false,
66
+ error: getErrorMessage(error),
67
+ previousVersion,
68
+ newVersion: null,
69
+ });
70
+ }
71
+ }
72
+ emitProgress(requestId, phase) {
73
+ this.emit({
74
+ type: "daemon.update.progress",
75
+ payload: {
76
+ requestId,
77
+ phase,
78
+ },
79
+ });
80
+ }
81
+ emitResponse(payload) {
82
+ this.emit({
83
+ type: "daemon.update.response",
84
+ payload,
85
+ });
86
+ }
87
+ }
88
+ //# sourceMappingURL=daemon-self-update-session-controller.js.map
@@ -0,0 +1,32 @@
1
+ import { type DaemonInstallOriginRuntime } from "./install-origin.js";
2
+ import { type NpmGlobalPaseoCli } from "./npm-global-cli.js";
3
+ export type DaemonSelfUpdatePhase = "starting" | "downloading" | "installing" | "complete";
4
+ export interface DaemonSelfUpdateResult {
5
+ success: boolean;
6
+ error: string | null;
7
+ newVersion: string | null;
8
+ }
9
+ export interface DaemonSelfUpdateInput {
10
+ daemonVersion: string | null;
11
+ onProgress: (phase: DaemonSelfUpdatePhase) => void;
12
+ logger: DaemonSelfUpdateLogger;
13
+ }
14
+ export interface DaemonSelfUpdateLogger {
15
+ error(obj: object, msg?: string): void;
16
+ warn(obj: object, msg?: string): void;
17
+ }
18
+ export interface DaemonSelfUpdateRuntime {
19
+ npm: NpmGlobalPaseoCli;
20
+ installOrigin: DaemonInstallOriginRuntime;
21
+ }
22
+ export declare class DaemonSelfUpdateInProgressError extends Error {
23
+ constructor();
24
+ }
25
+ export declare class DaemonSelfUpdater {
26
+ private readonly runtime;
27
+ private inProgress;
28
+ constructor(runtime?: DaemonSelfUpdateRuntime);
29
+ update(input: DaemonSelfUpdateInput): Promise<DaemonSelfUpdateResult>;
30
+ }
31
+ export declare const daemonSelfUpdater: DaemonSelfUpdater;
32
+ //# sourceMappingURL=daemon-self-updater.d.ts.map
@@ -0,0 +1,56 @@
1
+ import { getErrorMessage } from "@getpaseo/protocol/error-utils";
2
+ import { daemonInstallOriginRuntime, validateDaemonInstallOrigin, } from "./install-origin.js";
3
+ import { npmGlobalPaseoCli } from "./npm-global-cli.js";
4
+ export class DaemonSelfUpdateInProgressError extends Error {
5
+ constructor() {
6
+ super("An update is already in progress");
7
+ this.name = "DaemonSelfUpdateInProgressError";
8
+ }
9
+ }
10
+ const defaultRuntime = {
11
+ npm: npmGlobalPaseoCli,
12
+ installOrigin: daemonInstallOriginRuntime,
13
+ };
14
+ export class DaemonSelfUpdater {
15
+ constructor(runtime = defaultRuntime) {
16
+ this.runtime = runtime;
17
+ this.inProgress = false;
18
+ }
19
+ async update(input) {
20
+ if (this.inProgress) {
21
+ throw new DaemonSelfUpdateInProgressError();
22
+ }
23
+ this.inProgress = true;
24
+ try {
25
+ input.onProgress("starting");
26
+ const install = await this.runtime.npm.inspect();
27
+ const unsupportedReason = validateDaemonInstallOrigin(install, input.daemonVersion, this.runtime.installOrigin);
28
+ if (unsupportedReason) {
29
+ return { success: false, error: unsupportedReason, newVersion: null };
30
+ }
31
+ input.onProgress("downloading");
32
+ input.onProgress("installing");
33
+ const result = await this.runtime.npm.installLatest();
34
+ if (result.exitCode !== 0) {
35
+ const error = result.stderr.trim() || result.stdout.trim() || `npm exited with code ${result.exitCode}`;
36
+ input.logger.error({ exitCode: result.exitCode, stderr: result.stderr }, "Daemon self-update failed");
37
+ return { success: false, error, newVersion: null };
38
+ }
39
+ const updatedInstall = await this.runtime.npm.inspect().catch((error) => {
40
+ input.logger.warn({ err: error }, "Unable to read updated npm package version");
41
+ return null;
42
+ });
43
+ input.onProgress("complete");
44
+ return { success: true, error: null, newVersion: updatedInstall?.version ?? null };
45
+ }
46
+ catch (error) {
47
+ input.logger.error({ err: error }, "Daemon self-update failed with exception");
48
+ return { success: false, error: getErrorMessage(error), newVersion: null };
49
+ }
50
+ finally {
51
+ this.inProgress = false;
52
+ }
53
+ }
54
+ }
55
+ export const daemonSelfUpdater = new DaemonSelfUpdater();
56
+ //# sourceMappingURL=daemon-self-updater.js.map
@@ -1,6 +1,9 @@
1
1
  import type pino from "pino";
2
2
  import type { ProviderAvailability } from "../../agent/agent-manager.js";
3
3
  import type { SessionInboundMessage, SessionOutboundMessage } from "../../messages.js";
4
+ import { type DaemonWebSocketRuntimeDiagnosticSnapshot } from "./diagnostics.js";
5
+ import type { ManagedAgent } from "../../agent/agent-manager.js";
6
+ import type { PersistedProjectRecord, PersistedWorkspaceRecord } from "../../workspace-registry.js";
4
7
  export interface DaemonRuntimeConfig {
5
8
  listen: string | null;
6
9
  appBaseUrl?: string;
@@ -14,14 +17,25 @@ export interface DaemonRuntimeConfig {
14
17
  }
15
18
  export interface DaemonSessionHost {
16
19
  emit(msg: SessionOutboundMessage): void;
20
+ emitLifecycleIntent(intent: {
21
+ type: "restart";
22
+ clientId: string;
23
+ requestId: string;
24
+ reason: string;
25
+ }): void;
17
26
  }
18
27
  export interface DaemonSessionOptions {
19
28
  host: DaemonSessionHost;
29
+ clientId: string;
20
30
  paseoHome: string;
21
31
  serverId: string | undefined;
22
32
  daemonVersion: string | undefined;
23
33
  daemonRuntimeConfig: DaemonRuntimeConfig | undefined;
34
+ listAgents: () => ManagedAgent[];
35
+ listProjects: () => Promise<PersistedProjectRecord[]>;
36
+ listWorkspaces: () => Promise<PersistedWorkspaceRecord[]>;
24
37
  listProviderAvailability: () => Promise<ProviderAvailability[]>;
38
+ getWebSocketRuntimeMetrics?: () => DaemonWebSocketRuntimeDiagnosticSnapshot | null;
25
39
  logger: pino.Logger;
26
40
  }
27
41
  /**
@@ -33,12 +47,18 @@ export interface DaemonSessionOptions {
33
47
  */
34
48
  export declare class DaemonSession {
35
49
  private readonly host;
50
+ private readonly clientId;
36
51
  private readonly paseoHome;
37
52
  private readonly serverId;
38
53
  private readonly daemonVersion;
39
54
  private readonly daemonRuntimeConfig;
55
+ private readonly listAgents;
56
+ private readonly listProjects;
57
+ private readonly listWorkspaces;
40
58
  private readonly listProviderAvailability;
59
+ private readonly getWebSocketRuntimeMetrics;
41
60
  private readonly logger;
61
+ private readonly selfUpdate;
42
62
  constructor(options: DaemonSessionOptions);
43
63
  handleGetStatusRequest(msg: Extract<SessionInboundMessage, {
44
64
  type: "daemon.get_status.request";
@@ -46,5 +66,11 @@ export declare class DaemonSession {
46
66
  handleGetPairingOfferRequest(msg: Extract<SessionInboundMessage, {
47
67
  type: "daemon.get_pairing_offer.request";
48
68
  }>): Promise<void>;
69
+ handleDiagnosticsRequest(msg: Extract<SessionInboundMessage, {
70
+ type: "diagnostics.request";
71
+ }>): Promise<void>;
72
+ handleUpdateRequest(msg: Extract<SessionInboundMessage, {
73
+ type: "daemon.update.request";
74
+ }>): Promise<void>;
49
75
  }
50
76
  //# sourceMappingURL=daemon-session.d.ts.map
@@ -1,5 +1,7 @@
1
1
  import { getPidLockInfo } from "../../pid-lock.js";
2
2
  import { generateLocalPairingOffer } from "../../pairing-offer.js";
3
+ import { collectDaemonDiagnostics, } from "./diagnostics.js";
4
+ import { DaemonSelfUpdateSessionController } from "./daemon-self-update-session-controller.js";
3
5
  /**
4
6
  * A client's read surface for the daemon process itself: its runtime status
5
7
  * (pid-lock start time, listen address, relay config, provider availability) and
@@ -10,12 +12,24 @@ import { generateLocalPairingOffer } from "../../pairing-offer.js";
10
12
  export class DaemonSession {
11
13
  constructor(options) {
12
14
  this.host = options.host;
15
+ this.clientId = options.clientId;
13
16
  this.paseoHome = options.paseoHome;
14
17
  this.serverId = options.serverId;
15
18
  this.daemonVersion = options.daemonVersion;
16
19
  this.daemonRuntimeConfig = options.daemonRuntimeConfig;
20
+ this.listAgents = options.listAgents;
21
+ this.listProjects = options.listProjects;
22
+ this.listWorkspaces = options.listWorkspaces;
17
23
  this.listProviderAvailability = options.listProviderAvailability;
24
+ this.getWebSocketRuntimeMetrics = options.getWebSocketRuntimeMetrics ?? (() => null);
18
25
  this.logger = options.logger;
26
+ this.selfUpdate = new DaemonSelfUpdateSessionController({
27
+ clientId: this.clientId,
28
+ daemonVersion: this.daemonVersion ?? null,
29
+ emit: (msg) => this.host.emit(msg),
30
+ emitLifecycleIntent: (intent) => this.host.emitLifecycleIntent(intent),
31
+ sessionLogger: this.logger,
32
+ });
19
33
  }
20
34
  async handleGetStatusRequest(msg) {
21
35
  try {
@@ -94,5 +108,41 @@ export class DaemonSession {
94
108
  });
95
109
  }
96
110
  }
111
+ async handleDiagnosticsRequest(msg) {
112
+ try {
113
+ const diagnostic = await collectDaemonDiagnostics({
114
+ paseoHome: this.paseoHome,
115
+ serverId: this.serverId,
116
+ daemonVersion: this.daemonVersion,
117
+ daemonRuntimeConfig: this.daemonRuntimeConfig,
118
+ listAgents: this.listAgents,
119
+ listProjects: this.listProjects,
120
+ listWorkspaces: this.listWorkspaces,
121
+ listProviderAvailability: this.listProviderAvailability,
122
+ getWebSocketRuntimeMetrics: this.getWebSocketRuntimeMetrics,
123
+ logger: this.logger,
124
+ });
125
+ this.host.emit({
126
+ type: "diagnostics.response",
127
+ payload: {
128
+ requestId: msg.requestId,
129
+ diagnostic,
130
+ },
131
+ });
132
+ }
133
+ catch (error) {
134
+ this.logger.error({ err: error }, "Failed to handle diagnostics request");
135
+ this.host.emit({
136
+ type: "diagnostics.response",
137
+ payload: {
138
+ requestId: msg.requestId,
139
+ diagnostic: `Paseo diagnostics\n Error: ${error instanceof Error ? error.message : String(error)}`,
140
+ },
141
+ });
142
+ }
143
+ }
144
+ async handleUpdateRequest(msg) {
145
+ await this.selfUpdate.dispatch(msg);
146
+ }
97
147
  }
98
148
  //# sourceMappingURL=daemon-session.js.map
@@ -0,0 +1,41 @@
1
+ import type pino from "pino";
2
+ import type { ManagedAgent, ProviderAvailability } from "../../agent/agent-manager.js";
3
+ import type { WebSocketRuntimeDiagnosticSnapshot } from "../../websocket/runtime-metrics.js";
4
+ import type { PersistedProjectRecord, PersistedWorkspaceRecord } from "../../workspace-registry.js";
5
+ import type { DaemonRuntimeConfig } from "./daemon-session.js";
6
+ export interface DaemonDiagnosticsOptions {
7
+ paseoHome: string;
8
+ serverId: string | undefined;
9
+ daemonVersion: string | undefined;
10
+ daemonRuntimeConfig: DaemonRuntimeConfig | undefined;
11
+ listAgents: () => ManagedAgent[];
12
+ listProjects: () => Promise<PersistedProjectRecord[]>;
13
+ listWorkspaces: () => Promise<PersistedWorkspaceRecord[]>;
14
+ listProviderAvailability: () => Promise<ProviderAvailability[]>;
15
+ getWebSocketRuntimeMetrics: () => DaemonWebSocketRuntimeDiagnosticSnapshot | null;
16
+ logger: pino.Logger;
17
+ }
18
+ interface DiagnosticWebSocketRuntimeMetrics {
19
+ terminalDirectorySubscriptionCount: number;
20
+ terminalSubscriptionCount: number;
21
+ inflightRequests: number;
22
+ peakInflightRequests: number;
23
+ checkoutDiffTargetCount: number;
24
+ checkoutDiffSubscriptionCount: number;
25
+ checkoutDiffWatcherCount: number;
26
+ checkoutDiffFallbackRefreshTargetCount: number;
27
+ }
28
+ interface DiagnosticAgentRuntimeMetrics {
29
+ total: number;
30
+ byLifecycle: Record<string, number>;
31
+ withActiveForegroundTurn: number;
32
+ timelineStats: {
33
+ totalItems: number;
34
+ maxItemsPerAgent: number;
35
+ };
36
+ }
37
+ export type DaemonWebSocketRuntimeDiagnosticSnapshot = WebSocketRuntimeDiagnosticSnapshot<DiagnosticWebSocketRuntimeMetrics, DiagnosticAgentRuntimeMetrics>;
38
+ export declare function collectDaemonDiagnostics(options: DaemonDiagnosticsOptions): Promise<string>;
39
+ export declare function redactDiagnostic(value: string, options?: Partial<DaemonDiagnosticsOptions>): string;
40
+ export {};
41
+ //# sourceMappingURL=diagnostics.d.ts.map