@getpaseo/server 0.1.101 → 0.1.102

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 (141) hide show
  1. package/.env.example +8 -0
  2. package/dist/scripts/supervisor.js +26 -8
  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.js +5 -1
  6. package/dist/server/server/agent/agent-sdk-types.d.ts +7 -2
  7. package/dist/server/server/agent/provider-registry.js +12 -11
  8. package/dist/server/server/agent/provider-snapshot-manager.d.ts +8 -1
  9. package/dist/server/server/agent/provider-snapshot-manager.js +78 -33
  10. package/dist/server/server/agent/providers/acp-agent.d.ts +13 -0
  11. package/dist/server/server/agent/providers/acp-agent.js +37 -1
  12. package/dist/server/server/agent/providers/claude/agent.js +51 -14
  13. package/dist/server/server/agent/providers/claude/query.d.ts +3 -0
  14. package/dist/server/server/agent/providers/claude/query.js +4 -2
  15. package/dist/server/server/agent/providers/generic-acp-agent.d.ts +2 -1
  16. package/dist/server/server/agent/providers/generic-acp-agent.js +2 -1
  17. package/dist/server/server/agent/providers/kiro-acp-agent.d.ts +17 -0
  18. package/dist/server/server/agent/providers/kiro-acp-agent.js +78 -0
  19. package/dist/server/server/agent/providers/mock-load-test-agent.js +8 -0
  20. package/dist/server/server/agent/providers/opencode/paths.d.ts +2 -0
  21. package/dist/server/server/agent/providers/opencode/paths.js +7 -0
  22. package/dist/server/server/agent/providers/opencode/server-manager.d.ts +2 -0
  23. package/dist/server/server/agent/providers/opencode/server-manager.js +34 -5
  24. package/dist/server/server/agent/providers/opencode-agent.d.ts +4 -0
  25. package/dist/server/server/agent/providers/opencode-agent.js +14 -2
  26. package/dist/server/server/agent/providers/pi/agent.d.ts +3 -0
  27. package/dist/server/server/agent/providers/pi/agent.js +9 -3
  28. package/dist/server/server/agent/providers/provider-image-output.js +11 -6
  29. package/dist/server/server/agent/tools/paseo-tools.d.ts +1 -1
  30. package/dist/server/server/agent/tools/paseo-tools.js +0 -2
  31. package/dist/server/server/bootstrap.d.ts +7 -1
  32. package/dist/server/server/bootstrap.js +18 -0
  33. package/dist/server/server/config.d.ts +2 -0
  34. package/dist/server/server/config.js +57 -1
  35. package/dist/server/server/daemon-worker.js +19 -7
  36. package/dist/server/server/lifecycle-reasons.d.ts +4 -0
  37. package/dist/server/server/lifecycle-reasons.js +6 -0
  38. package/dist/server/server/persisted-config.d.ts +13 -2
  39. package/dist/server/server/persisted-config.js +30 -11
  40. package/dist/server/server/process-diagnostics.d.ts +17 -0
  41. package/dist/server/server/process-diagnostics.js +22 -0
  42. package/dist/server/server/relay-transport.js +1 -0
  43. package/dist/server/server/resolve-worktree-creation-intent.js +3 -1
  44. package/dist/server/server/session/daemon/daemon-self-update-session-controller.d.ts +32 -0
  45. package/dist/server/server/session/daemon/daemon-self-update-session-controller.js +88 -0
  46. package/dist/server/server/session/daemon/daemon-self-updater.d.ts +32 -0
  47. package/dist/server/server/session/daemon/daemon-self-updater.js +56 -0
  48. package/dist/server/server/session/daemon/daemon-session.d.ts +12 -0
  49. package/dist/server/server/session/daemon/daemon-session.js +12 -0
  50. package/dist/server/server/session/daemon/diagnostics.js +10 -0
  51. package/dist/server/server/session/daemon/install-origin.d.ts +7 -0
  52. package/dist/server/server/session/daemon/install-origin.js +64 -0
  53. package/dist/server/server/session/daemon/npm-global-cli.d.ts +29 -0
  54. package/dist/server/server/session/daemon/npm-global-cli.js +98 -0
  55. package/dist/server/server/session/provider/provider-catalog-session.js +8 -4
  56. package/dist/server/server/session.d.ts +5 -3
  57. package/dist/server/server/session.js +74 -32
  58. package/dist/server/server/speech/providers/openai/config.d.ts +0 -2
  59. package/dist/server/server/speech/providers/openai/config.js +71 -34
  60. package/dist/server/server/speech/providers/openai/runtime.js +4 -4
  61. package/dist/server/server/web-ui.d.ts +10 -0
  62. package/dist/server/server/web-ui.js +205 -0
  63. package/dist/server/server/websocket/runtime-metrics.d.ts +3 -0
  64. package/dist/server/server/websocket-server.d.ts +3 -0
  65. package/dist/server/server/websocket-server.js +190 -32
  66. package/dist/server/services/quota-fetcher/manifest.js +5 -0
  67. package/dist/server/services/quota-fetcher/providers/minimax.d.ts +29 -0
  68. package/dist/server/services/quota-fetcher/providers/minimax.js +227 -0
  69. package/dist/server/terminal/agent-hooks/agent-hook-installer.js +2 -2
  70. package/dist/server/utils/checkout-git.js +156 -3
  71. package/dist/server/utils/directory-suggestions.js +1 -4
  72. package/dist/server/utils/path.d.ts +2 -0
  73. package/dist/server/utils/path.js +13 -0
  74. package/dist/server/utils/worktree.d.ts +1 -0
  75. package/dist/server/utils/worktree.js +92 -11
  76. package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css +1 -0
  77. package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.br +0 -0
  78. package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.gz +0 -0
  79. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-5fa9347afb28c7d61bbf73684f3bdafa.js +1 -0
  80. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-5fa9347afb28c7d61bbf73684f3bdafa.js.br +0 -0
  81. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-5fa9347afb28c7d61bbf73684f3bdafa.js.gz +0 -0
  82. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-35159ed50cf218b741c5dab5a6f4a889.js +1 -0
  83. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-35159ed50cf218b741c5dab5a6f4a889.js.br +0 -0
  84. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-35159ed50cf218b741c5dab5a6f4a889.js.gz +0 -0
  85. package/dist/server/web-ui/_expo/static/js/web/index-cf63ba3f4de4164d2d9c3738e1b791b2.js +16157 -0
  86. package/dist/server/web-ui/_expo/static/js/web/index-cf63ba3f4de4164d2d9c3738e1b791b2.js.br +0 -0
  87. package/dist/server/web-ui/_expo/static/js/web/index-cf63ba3f4de4164d2d9c3738e1b791b2.js.gz +0 -0
  88. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-6a6cfdd9f06d4fd2b05adc1a8771c58c.js +1 -0
  89. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-6a6cfdd9f06d4fd2b05adc1a8771c58c.js.br +0 -0
  90. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-6a6cfdd9f06d4fd2b05adc1a8771c58c.js.gz +0 -0
  91. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-b31888f9a7de4f0c52d6a58fcddbcb20.js +3 -0
  92. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-b31888f9a7de4f0c52d6a58fcddbcb20.js.br +0 -0
  93. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-b31888f9a7de4f0c52d6a58fcddbcb20.js.gz +0 -0
  94. package/dist/server/web-ui/apple-touch-icon.png +0 -0
  95. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon-mask.0a328cd9c1afd0afe8e3b1ec5165b1b4.png +0 -0
  96. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon.35ba0eaec5a4f5ed12ca16fabeae451d.png +0 -0
  97. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55.png +0 -0
  98. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@2x.png +0 -0
  99. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@3x.png +0 -0
  100. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@4x.png +0 -0
  101. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7.png +0 -0
  102. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@2x.png +0 -0
  103. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@3x.png +0 -0
  104. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@4x.png +0 -0
  105. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/search-icon.286d67d3f74808a60a78d3ebf1a5fb57.png +0 -0
  106. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/arrow_down.017bc6ba3fc25503e5eb5e53826d48a8.png +0 -0
  107. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/error.d1ea1496f9057eb392d5bbf3732a61b7.png +0 -0
  108. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/file.19eeb73b9593a38f8e9f418337fc7d10.png +0 -0
  109. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/forward.d8b800c443b8972542883e0b9de2bdc6.png +0 -0
  110. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/pkg.ab19f4cbc543357183a20571f68380a3.png +0 -0
  111. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/sitemap.412dd9275b6b48ad28f5e3d81bb1f626.png +0 -0
  112. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/unmatched.20e71bdf79e3a97bf55fd9e164041578.png +0 -0
  113. package/dist/server/web-ui/assets/assets/images/editor-apps/antigravity.6e91a685c33435e0b466a56db86cf141.png +0 -0
  114. package/dist/server/web-ui/assets/assets/images/editor-apps/cursor.c31d6bce4fe9aadc3fe59962f4c4fcf3.png +0 -0
  115. package/dist/server/web-ui/assets/assets/images/editor-apps/file-explorer.3e15e8f72c825c85ce336bcb0cdef776.png +0 -0
  116. package/dist/server/web-ui/assets/assets/images/editor-apps/finder.7f68fc2c475621a672e1be09309d5567.png +0 -0
  117. package/dist/server/web-ui/assets/assets/images/editor-apps/vscode.832bdb4c685d930f1c864c793703600b.png +0 -0
  118. package/dist/server/web-ui/assets/assets/images/editor-apps/webstorm.aa5dc2cd8c20cc0a155c4c5c5ab3c5f5.png +0 -0
  119. package/dist/server/web-ui/assets/assets/images/editor-apps/zed.f3a670b7f9aa226da4fe53fb86f1abbd.png +0 -0
  120. package/dist/server/web-ui/assets/assets/images/favicon-dark-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
  121. package/dist/server/web-ui/assets/assets/images/favicon-dark-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
  122. package/dist/server/web-ui/assets/assets/images/favicon-dark.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
  123. package/dist/server/web-ui/assets/assets/images/favicon-light-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
  124. package/dist/server/web-ui/assets/assets/images/favicon-light-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
  125. package/dist/server/web-ui/assets/assets/images/favicon-light.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
  126. package/dist/server/web-ui/assets/assets/images/notification-icon.3bf81d33ddbf380606bdd248ba83e158.png +0 -0
  127. package/dist/server/web-ui/favicon.ico +0 -0
  128. package/dist/server/web-ui/index.html +90 -0
  129. package/dist/server/web-ui/index.html.br +0 -0
  130. package/dist/server/web-ui/index.html.gz +0 -0
  131. package/dist/server/web-ui/manifest.json +27 -0
  132. package/dist/server/web-ui/manifest.json.br +0 -0
  133. package/dist/server/web-ui/manifest.json.gz +0 -0
  134. package/dist/server/web-ui/metadata.json +1 -0
  135. package/dist/server/web-ui/metadata.json.br +1 -0
  136. package/dist/server/web-ui/metadata.json.gz +0 -0
  137. package/dist/server/web-ui/pwa-icon-192.png +0 -0
  138. package/dist/server/web-ui/pwa-icon-512.png +0 -0
  139. package/dist/server/web-ui/robots.txt +2 -0
  140. package/dist/src/server/persisted-config.js +30 -11
  141. package/package.json +7 -7
@@ -0,0 +1,17 @@
1
+ export interface ProcessMemoryDiagnostics {
2
+ rss: number;
3
+ heapTotal: number;
4
+ heapUsed: number;
5
+ external: number;
6
+ arrayBuffers: number;
7
+ }
8
+ export interface ProcessDiagnostics {
9
+ pid: number;
10
+ ppid: number;
11
+ uptimeSeconds: number;
12
+ memory: ProcessMemoryDiagnostics;
13
+ }
14
+ export declare function getProcessMemoryDiagnostics(): ProcessMemoryDiagnostics;
15
+ export declare function getProcessUptimeSeconds(): number;
16
+ export declare function getProcessDiagnostics(): ProcessDiagnostics;
17
+ //# sourceMappingURL=process-diagnostics.d.ts.map
@@ -0,0 +1,22 @@
1
+ export function getProcessMemoryDiagnostics() {
2
+ const memory = process.memoryUsage();
3
+ return {
4
+ rss: memory.rss,
5
+ heapTotal: memory.heapTotal,
6
+ heapUsed: memory.heapUsed,
7
+ external: memory.external,
8
+ arrayBuffers: memory.arrayBuffers,
9
+ };
10
+ }
11
+ export function getProcessUptimeSeconds() {
12
+ return Math.round(process.uptime() * 1000) / 1000;
13
+ }
14
+ export function getProcessDiagnostics() {
15
+ return {
16
+ pid: process.pid,
17
+ ppid: process.ppid,
18
+ uptimeSeconds: getProcessUptimeSeconds(),
19
+ memory: getProcessMemoryDiagnostics(),
20
+ };
21
+ }
22
+ //# sourceMappingURL=process-diagnostics.js.map
@@ -335,6 +335,7 @@ export function startRelayTransport({ logger, attachSocket, relayEndpoint, relay
335
335
  const externalMetadata = {
336
336
  transport: "relay",
337
337
  externalSessionKey: `session:${connectionId}`,
338
+ relayConnectionId: connectionId,
338
339
  };
339
340
  if (daemonKeyPair) {
340
341
  void attachEncryptedSocket(socket, daemonKeyPair, relayLogger.child({ connectionId }), attachSocket, externalMetadata);
@@ -64,9 +64,10 @@ async function resolveGitHubPrCheckoutIntent(params) {
64
64
  const baseRefName = checkoutTarget?.baseRefName?.trim() ||
65
65
  (await resolveDefaultBranch(params.repoRoot, params.deps));
66
66
  const localBranchName = buildGitHubPrLocalBranchName({ headRef, checkoutTarget });
67
- const pushRemoteUrl = checkoutTarget
67
+ const pushRemoteUrl = checkoutTarget?.isCrossRepository
68
68
  ? checkoutTarget.headRepositorySshUrl || checkoutTarget.headRepositoryUrl || undefined
69
69
  : undefined;
70
+ const trackOriginHead = checkoutTarget ? !checkoutTarget.isCrossRepository : false;
70
71
  return {
71
72
  kind: "checkout-github-pr",
72
73
  githubPrNumber: params.githubPrNumber,
@@ -74,6 +75,7 @@ async function resolveGitHubPrCheckoutIntent(params) {
74
75
  baseRefName,
75
76
  ...(localBranchName !== headRef ? { localBranchName } : {}),
76
77
  ...(pushRemoteUrl ? { pushRemoteUrl } : {}),
78
+ ...(trackOriginHead ? { trackOriginHead } : {}),
77
79
  };
78
80
  }
79
81
  async function resolveGitHubPrCheckoutTarget(params) {
@@ -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
@@ -17,9 +17,16 @@ export interface DaemonRuntimeConfig {
17
17
  }
18
18
  export interface DaemonSessionHost {
19
19
  emit(msg: SessionOutboundMessage): void;
20
+ emitLifecycleIntent(intent: {
21
+ type: "restart";
22
+ clientId: string;
23
+ requestId: string;
24
+ reason: string;
25
+ }): void;
20
26
  }
21
27
  export interface DaemonSessionOptions {
22
28
  host: DaemonSessionHost;
29
+ clientId: string;
23
30
  paseoHome: string;
24
31
  serverId: string | undefined;
25
32
  daemonVersion: string | undefined;
@@ -40,6 +47,7 @@ export interface DaemonSessionOptions {
40
47
  */
41
48
  export declare class DaemonSession {
42
49
  private readonly host;
50
+ private readonly clientId;
43
51
  private readonly paseoHome;
44
52
  private readonly serverId;
45
53
  private readonly daemonVersion;
@@ -50,6 +58,7 @@ export declare class DaemonSession {
50
58
  private readonly listProviderAvailability;
51
59
  private readonly getWebSocketRuntimeMetrics;
52
60
  private readonly logger;
61
+ private readonly selfUpdate;
53
62
  constructor(options: DaemonSessionOptions);
54
63
  handleGetStatusRequest(msg: Extract<SessionInboundMessage, {
55
64
  type: "daemon.get_status.request";
@@ -60,5 +69,8 @@ export declare class DaemonSession {
60
69
  handleDiagnosticsRequest(msg: Extract<SessionInboundMessage, {
61
70
  type: "diagnostics.request";
62
71
  }>): Promise<void>;
72
+ handleUpdateRequest(msg: Extract<SessionInboundMessage, {
73
+ type: "daemon.update.request";
74
+ }>): Promise<void>;
63
75
  }
64
76
  //# sourceMappingURL=daemon-session.d.ts.map
@@ -1,6 +1,7 @@
1
1
  import { getPidLockInfo } from "../../pid-lock.js";
2
2
  import { generateLocalPairingOffer } from "../../pairing-offer.js";
3
3
  import { collectDaemonDiagnostics, } from "./diagnostics.js";
4
+ import { DaemonSelfUpdateSessionController } from "./daemon-self-update-session-controller.js";
4
5
  /**
5
6
  * A client's read surface for the daemon process itself: its runtime status
6
7
  * (pid-lock start time, listen address, relay config, provider availability) and
@@ -11,6 +12,7 @@ import { collectDaemonDiagnostics, } from "./diagnostics.js";
11
12
  export class DaemonSession {
12
13
  constructor(options) {
13
14
  this.host = options.host;
15
+ this.clientId = options.clientId;
14
16
  this.paseoHome = options.paseoHome;
15
17
  this.serverId = options.serverId;
16
18
  this.daemonVersion = options.daemonVersion;
@@ -21,6 +23,13 @@ export class DaemonSession {
21
23
  this.listProviderAvailability = options.listProviderAvailability;
22
24
  this.getWebSocketRuntimeMetrics = options.getWebSocketRuntimeMetrics ?? (() => null);
23
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
+ });
24
33
  }
25
34
  async handleGetStatusRequest(msg) {
26
35
  try {
@@ -132,5 +141,8 @@ export class DaemonSession {
132
141
  });
133
142
  }
134
143
  }
144
+ async handleUpdateRequest(msg) {
145
+ await this.selfUpdate.dispatch(msg);
146
+ }
135
147
  }
136
148
  //# sourceMappingURL=daemon-session.js.map
@@ -154,6 +154,16 @@ function collectWebSocketRuntimeEntries(options) {
154
154
  return [
155
155
  { label: "Collected at", value: snapshot.collectedAt },
156
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
+ },
157
167
  { label: "Final", value: String(snapshot.final) },
158
168
  {
159
169
  label: "Sessions",
@@ -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
@@ -1,5 +1,5 @@
1
1
  import { getErrorMessage } from "@getpaseo/protocol/error-utils";
2
- import { resolveSnapshotCwd, } from "../../agent/provider-snapshot-manager.js";
2
+ import { isGlobalProviderSnapshotKey, } from "../../agent/provider-snapshot-manager.js";
3
3
  import { expandTilde } from "../../../utils/path.js";
4
4
  // COMPAT(customModeIcons): the only mode icons known to clients before v0.1.84. Any
5
5
  // other icon name is downgraded to "ShieldCheck" for those clients.
@@ -28,7 +28,7 @@ export class ProviderCatalogSession {
28
28
  const handleProviderSnapshotChange = (entries, cwd) => {
29
29
  // COMPAT(providersSnapshot): keep provider visibility gating for older clients.
30
30
  const visibleEntries = entries.filter((entry) => this.host.isProviderVisibleToClient(entry.provider));
31
- const snapshotCwd = cwd === resolveSnapshotCwd() ? undefined : cwd;
31
+ const snapshotCwd = isGlobalProviderSnapshotKey(cwd) ? undefined : cwd;
32
32
  this.host.emit({
33
33
  type: "providers_snapshot_update",
34
34
  payload: {
@@ -77,7 +77,7 @@ export class ProviderCatalogSession {
77
77
  }
78
78
  }
79
79
  async handleListProviderModelsRequest(msg) {
80
- const cwd = resolveSnapshotCwd(msg.cwd ? expandTilde(msg.cwd) : undefined);
80
+ const cwd = resolveCatalogRequestCwd(msg.cwd);
81
81
  const fetchedAt = new Date().toISOString();
82
82
  const entry = await this.getProviderSnapshotEntryForRead(cwd, msg.provider);
83
83
  if (!entry) {
@@ -124,7 +124,7 @@ export class ProviderCatalogSession {
124
124
  }
125
125
  async handleListProviderModesRequest(msg) {
126
126
  const fetchedAt = new Date().toISOString();
127
- const cwd = resolveSnapshotCwd(msg.cwd ? expandTilde(msg.cwd) : undefined);
127
+ const cwd = resolveCatalogRequestCwd(msg.cwd);
128
128
  const entry = await this.getProviderSnapshotEntryForRead(cwd, msg.provider);
129
129
  if (!entry) {
130
130
  this.host.emit({
@@ -336,4 +336,8 @@ export class ProviderCatalogSession {
336
336
  }
337
337
  }
338
338
  }
339
+ function resolveCatalogRequestCwd(cwd) {
340
+ const trimmed = cwd?.trim();
341
+ return trimmed ? expandTilde(trimmed) : undefined;
342
+ }
339
343
  //# sourceMappingURL=provider-catalog-session.js.map
@@ -110,11 +110,12 @@ export type SessionLifecycleIntent = {
110
110
  type: "shutdown";
111
111
  clientId: string;
112
112
  requestId: string;
113
+ reason: string;
113
114
  } | {
114
115
  type: "restart";
115
116
  clientId: string;
116
117
  requestId: string;
117
- reason?: string;
118
+ reason: string;
118
119
  };
119
120
  /**
120
121
  * Session represents a single connected client session.
@@ -227,7 +228,6 @@ export declare class Session {
227
228
  private isProviderVisibleToClient;
228
229
  private buildProjectPlacementForWorkspace;
229
230
  private buildProjectPlacementForWorkspaceId;
230
- private buildProjectPlacementForExistingWorkspaceProject;
231
231
  /**
232
232
  * Main entry point for processing session messages
233
233
  */
@@ -236,6 +236,7 @@ export declare class Session {
236
236
  private dispatchVoiceAndControlMessage;
237
237
  private dispatchAgentRewindMessage;
238
238
  private dispatchAgentRelationshipMessage;
239
+ private dispatchAgentTimelineMessage;
239
240
  private dispatchAgentLifecycleMessage;
240
241
  private dispatchAgentConfigMessage;
241
242
  private dispatchCheckoutMessage;
@@ -245,6 +246,7 @@ export declare class Session {
245
246
  private dispatchChatScheduleLoopMessage;
246
247
  private dispatchMiscMessage;
247
248
  resetPeakInflight(): void;
249
+ getSessionId(): string;
248
250
  handleBinaryFrame(binaryFrame: BinaryFrame): Promise<void>;
249
251
  private handleRestartServerRequest;
250
252
  private handleShutdownServerRequest;
@@ -276,7 +278,6 @@ export declare class Session {
276
278
  private scheduleAutoNameWorkspaceBranchForFirstAgent;
277
279
  private maybeAutoNameWorkspaceBranchForFirstAgent;
278
280
  private applyGeneratedWorkspaceTitle;
279
- private writeInitialWorkspaceTitleIfUntitled;
280
281
  private generateWorkspaceTitleFromContext;
281
282
  private maybeAutoNameDirectoryWorkspaceTitle;
282
283
  private scheduleAutoNameLocalWorkspaceTitleForFirstAgent;
@@ -374,6 +375,7 @@ export declare class Session {
374
375
  private selectProjectedTimelineProjection;
375
376
  private selectTimelineProjection;
376
377
  private handleFetchAgentTimelineRequest;
378
+ private handleAgentForkContextRequest;
377
379
  private handleSendAgentMessageRequest;
378
380
  private handleWaitForFinish;
379
381
  /**