@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.
- package/.env.example +8 -0
- package/dist/scripts/supervisor.js +26 -8
- package/dist/server/server/agent/activity-curator.d.ts +17 -0
- package/dist/server/server/agent/activity-curator.js +101 -24
- package/dist/server/server/agent/agent-manager.js +5 -1
- package/dist/server/server/agent/agent-sdk-types.d.ts +7 -2
- package/dist/server/server/agent/provider-registry.js +12 -11
- package/dist/server/server/agent/provider-snapshot-manager.d.ts +8 -1
- package/dist/server/server/agent/provider-snapshot-manager.js +78 -33
- package/dist/server/server/agent/providers/acp-agent.d.ts +13 -0
- package/dist/server/server/agent/providers/acp-agent.js +37 -1
- package/dist/server/server/agent/providers/claude/agent.js +51 -14
- package/dist/server/server/agent/providers/claude/query.d.ts +3 -0
- package/dist/server/server/agent/providers/claude/query.js +4 -2
- package/dist/server/server/agent/providers/generic-acp-agent.d.ts +2 -1
- package/dist/server/server/agent/providers/generic-acp-agent.js +2 -1
- package/dist/server/server/agent/providers/kiro-acp-agent.d.ts +17 -0
- package/dist/server/server/agent/providers/kiro-acp-agent.js +78 -0
- package/dist/server/server/agent/providers/mock-load-test-agent.js +8 -0
- package/dist/server/server/agent/providers/opencode/paths.d.ts +2 -0
- package/dist/server/server/agent/providers/opencode/paths.js +7 -0
- package/dist/server/server/agent/providers/opencode/server-manager.d.ts +2 -0
- package/dist/server/server/agent/providers/opencode/server-manager.js +34 -5
- package/dist/server/server/agent/providers/opencode-agent.d.ts +4 -0
- package/dist/server/server/agent/providers/opencode-agent.js +14 -2
- package/dist/server/server/agent/providers/pi/agent.d.ts +3 -0
- package/dist/server/server/agent/providers/pi/agent.js +9 -3
- package/dist/server/server/agent/providers/provider-image-output.js +11 -6
- package/dist/server/server/agent/tools/paseo-tools.d.ts +1 -1
- package/dist/server/server/agent/tools/paseo-tools.js +0 -2
- package/dist/server/server/bootstrap.d.ts +7 -1
- package/dist/server/server/bootstrap.js +18 -0
- package/dist/server/server/config.d.ts +2 -0
- package/dist/server/server/config.js +57 -1
- package/dist/server/server/daemon-worker.js +19 -7
- package/dist/server/server/lifecycle-reasons.d.ts +4 -0
- package/dist/server/server/lifecycle-reasons.js +6 -0
- package/dist/server/server/persisted-config.d.ts +13 -2
- package/dist/server/server/persisted-config.js +30 -11
- package/dist/server/server/process-diagnostics.d.ts +17 -0
- package/dist/server/server/process-diagnostics.js +22 -0
- package/dist/server/server/relay-transport.js +1 -0
- package/dist/server/server/resolve-worktree-creation-intent.js +3 -1
- package/dist/server/server/session/daemon/daemon-self-update-session-controller.d.ts +32 -0
- package/dist/server/server/session/daemon/daemon-self-update-session-controller.js +88 -0
- package/dist/server/server/session/daemon/daemon-self-updater.d.ts +32 -0
- package/dist/server/server/session/daemon/daemon-self-updater.js +56 -0
- package/dist/server/server/session/daemon/daemon-session.d.ts +12 -0
- package/dist/server/server/session/daemon/daemon-session.js +12 -0
- package/dist/server/server/session/daemon/diagnostics.js +10 -0
- package/dist/server/server/session/daemon/install-origin.d.ts +7 -0
- package/dist/server/server/session/daemon/install-origin.js +64 -0
- package/dist/server/server/session/daemon/npm-global-cli.d.ts +29 -0
- package/dist/server/server/session/daemon/npm-global-cli.js +98 -0
- package/dist/server/server/session/provider/provider-catalog-session.js +8 -4
- package/dist/server/server/session.d.ts +5 -3
- package/dist/server/server/session.js +74 -32
- package/dist/server/server/speech/providers/openai/config.d.ts +0 -2
- package/dist/server/server/speech/providers/openai/config.js +71 -34
- package/dist/server/server/speech/providers/openai/runtime.js +4 -4
- package/dist/server/server/web-ui.d.ts +10 -0
- package/dist/server/server/web-ui.js +205 -0
- package/dist/server/server/websocket/runtime-metrics.d.ts +3 -0
- package/dist/server/server/websocket-server.d.ts +3 -0
- package/dist/server/server/websocket-server.js +190 -32
- package/dist/server/services/quota-fetcher/manifest.js +5 -0
- package/dist/server/services/quota-fetcher/providers/minimax.d.ts +29 -0
- package/dist/server/services/quota-fetcher/providers/minimax.js +227 -0
- package/dist/server/terminal/agent-hooks/agent-hook-installer.js +2 -2
- package/dist/server/utils/checkout-git.js +156 -3
- package/dist/server/utils/directory-suggestions.js +1 -4
- package/dist/server/utils/path.d.ts +2 -0
- package/dist/server/utils/path.js +13 -0
- package/dist/server/utils/worktree.d.ts +1 -0
- package/dist/server/utils/worktree.js +92 -11
- package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css +1 -0
- package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.br +0 -0
- package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-5fa9347afb28c7d61bbf73684f3bdafa.js +1 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-5fa9347afb28c7d61bbf73684f3bdafa.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-5fa9347afb28c7d61bbf73684f3bdafa.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-35159ed50cf218b741c5dab5a6f4a889.js +1 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-35159ed50cf218b741c5dab5a6f4a889.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-35159ed50cf218b741c5dab5a6f4a889.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-cf63ba3f4de4164d2d9c3738e1b791b2.js +16157 -0
- package/dist/server/web-ui/_expo/static/js/web/index-cf63ba3f4de4164d2d9c3738e1b791b2.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-cf63ba3f4de4164d2d9c3738e1b791b2.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-6a6cfdd9f06d4fd2b05adc1a8771c58c.js +1 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-6a6cfdd9f06d4fd2b05adc1a8771c58c.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-6a6cfdd9f06d4fd2b05adc1a8771c58c.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-b31888f9a7de4f0c52d6a58fcddbcb20.js +3 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-b31888f9a7de4f0c52d6a58fcddbcb20.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-b31888f9a7de4f0c52d6a58fcddbcb20.js.gz +0 -0
- package/dist/server/web-ui/apple-touch-icon.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon-mask.0a328cd9c1afd0afe8e3b1ec5165b1b4.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon.35ba0eaec5a4f5ed12ca16fabeae451d.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@2x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@3x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@4x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@2x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@3x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@4x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/search-icon.286d67d3f74808a60a78d3ebf1a5fb57.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/arrow_down.017bc6ba3fc25503e5eb5e53826d48a8.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/error.d1ea1496f9057eb392d5bbf3732a61b7.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/file.19eeb73b9593a38f8e9f418337fc7d10.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/forward.d8b800c443b8972542883e0b9de2bdc6.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/pkg.ab19f4cbc543357183a20571f68380a3.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/sitemap.412dd9275b6b48ad28f5e3d81bb1f626.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/unmatched.20e71bdf79e3a97bf55fd9e164041578.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/antigravity.6e91a685c33435e0b466a56db86cf141.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/cursor.c31d6bce4fe9aadc3fe59962f4c4fcf3.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/file-explorer.3e15e8f72c825c85ce336bcb0cdef776.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/finder.7f68fc2c475621a672e1be09309d5567.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/vscode.832bdb4c685d930f1c864c793703600b.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/webstorm.aa5dc2cd8c20cc0a155c4c5c5ab3c5f5.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/zed.f3a670b7f9aa226da4fe53fb86f1abbd.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-dark-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-dark-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-dark.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-light-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-light-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-light.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
- package/dist/server/web-ui/assets/assets/images/notification-icon.3bf81d33ddbf380606bdd248ba83e158.png +0 -0
- package/dist/server/web-ui/favicon.ico +0 -0
- package/dist/server/web-ui/index.html +90 -0
- package/dist/server/web-ui/index.html.br +0 -0
- package/dist/server/web-ui/index.html.gz +0 -0
- package/dist/server/web-ui/manifest.json +27 -0
- package/dist/server/web-ui/manifest.json.br +0 -0
- package/dist/server/web-ui/manifest.json.gz +0 -0
- package/dist/server/web-ui/metadata.json +1 -0
- package/dist/server/web-ui/metadata.json.br +1 -0
- package/dist/server/web-ui/metadata.json.gz +0 -0
- package/dist/server/web-ui/pwa-icon-192.png +0 -0
- package/dist/server/web-ui/pwa-icon-512.png +0 -0
- package/dist/server/web-ui/robots.txt +2 -0
- package/dist/src/server/persisted-config.js +30 -11
- 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 {
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
/**
|