@getpaseo/server 0.1.101 → 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.
- 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-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 +7 -0
- package/dist/server/server/agent/providers/acp-agent.js +8 -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/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 +7 -0
- package/dist/server/server/persisted-config.js +8 -0
- 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/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-b01555c9b42665a03988c0a0032ef528.js +1 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-b01555c9b42665a03988c0a0032ef528.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-b01555c9b42665a03988c0a0032ef528.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-648388eca5c510b496e1eddf523f70ff.js +1 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-648388eca5c510b496e1eddf523f70ff.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-648388eca5c510b496e1eddf523f70ff.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-0ebbea2cd337f0c0680fdb3f8d4d5af3.js +16157 -0
- package/dist/server/web-ui/_expo/static/js/web/index-0ebbea2cd337f0c0680fdb3f8d4d5af3.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-0ebbea2cd337f0c0680fdb3f8d4d5af3.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-c64fa2416284927857a39087fd8d1332.js +1 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-c64fa2416284927857a39087fd8d1332.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-c64fa2416284927857a39087fd8d1332.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-a9784226715772edf87ef36c596599c2.js +3 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-a9784226715772edf87ef36c596599c2.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-a9784226715772edf87ef36c596599c2.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 +8 -0
- package/package.json +7 -7
|
@@ -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
|
/**
|
|
@@ -18,11 +18,13 @@ import { createWorkspaceScriptsService, } from "./session/workspace-scripts/work
|
|
|
18
18
|
import { getErrorMessage, getErrorMessageOr } from "@getpaseo/protocol/error-utils";
|
|
19
19
|
import { getAgentStatusPriority } from "@getpaseo/protocol/agent-state-bucket";
|
|
20
20
|
import { getParentAgentIdFromLabels } from "@getpaseo/protocol/agent-labels";
|
|
21
|
+
import { CLIENT_SHUTDOWN_RPC_REASON, normalizeClientRestartRpcReason, } from "./lifecycle-reasons.js";
|
|
21
22
|
import { createAgentCommand } from "./agent/create-agent/create.js";
|
|
22
23
|
import { archiveAgentCommand, cancelAgentRunCommand, closeAgentCommand, detachAgentCommand, setAgentModeCommand, updateAgentCommand, } from "./agent/lifecycle-command.js";
|
|
23
24
|
import { buildStoredAgentPayload, resolveStoredAgentPayloadUpdatedAt, toAgentPayload, } from "./agent/agent-projections.js";
|
|
24
25
|
import { appendTimelineItemIfAgentKnown, emitLiveTimelineItemIfAgentKnown, } from "./agent/timeline-append.js";
|
|
25
26
|
import { projectTimelineRows, selectProjectedTimelinePage, } from "./agent/timeline-projection.js";
|
|
27
|
+
import { buildAgentForkContextAttachment } from "./agent/activity-curator.js";
|
|
26
28
|
import { getAgentStreamEventTurnId, } from "./agent/agent-sdk-types.js";
|
|
27
29
|
import { ImportSessionsRequestError, importProviderSession, listImportableProviderSessions, normalizeImportAgentRequest, } from "./agent/import-sessions.js";
|
|
28
30
|
import { checkoutLiteFromGitSnapshot, deriveWorkspaceDisplayName, } from "./workspace-registry-model.js";
|
|
@@ -355,7 +357,9 @@ export class Session {
|
|
|
355
357
|
this.daemonSession = new DaemonSession({
|
|
356
358
|
host: {
|
|
357
359
|
emit: (msg) => this.emit(msg),
|
|
360
|
+
emitLifecycleIntent: (intent) => this.emitLifecycleIntent(intent),
|
|
358
361
|
},
|
|
362
|
+
clientId: this.clientId,
|
|
359
363
|
paseoHome: this.paseoHome,
|
|
360
364
|
serverId,
|
|
361
365
|
daemonVersion,
|
|
@@ -746,12 +750,6 @@ export class Session {
|
|
|
746
750
|
};
|
|
747
751
|
}
|
|
748
752
|
async buildProjectPlacementForWorkspaceId(workspaceId) {
|
|
749
|
-
const workspace = await this.workspaceRegistry.get(workspaceId);
|
|
750
|
-
if (!workspace)
|
|
751
|
-
return null;
|
|
752
|
-
return this.buildProjectPlacementForWorkspace(workspace);
|
|
753
|
-
}
|
|
754
|
-
async buildProjectPlacementForExistingWorkspaceProject(workspaceId) {
|
|
755
753
|
const workspace = await this.workspaceRegistry.get(workspaceId);
|
|
756
754
|
if (!workspace)
|
|
757
755
|
return null;
|
|
@@ -815,6 +813,7 @@ export class Session {
|
|
|
815
813
|
const promise = this.dispatchVoiceAndControlMessage(msg) ??
|
|
816
814
|
this.dispatchAgentRewindMessage(msg) ??
|
|
817
815
|
this.dispatchAgentRelationshipMessage(msg) ??
|
|
816
|
+
this.dispatchAgentTimelineMessage(msg) ??
|
|
818
817
|
this.dispatchAgentLifecycleMessage(msg) ??
|
|
819
818
|
this.dispatchAgentConfigMessage(msg) ??
|
|
820
819
|
this.dispatchCheckoutMessage(msg) ??
|
|
@@ -891,6 +890,16 @@ export class Session {
|
|
|
891
890
|
return undefined;
|
|
892
891
|
}
|
|
893
892
|
}
|
|
893
|
+
dispatchAgentTimelineMessage(msg) {
|
|
894
|
+
switch (msg.type) {
|
|
895
|
+
case "fetch_agent_timeline_request":
|
|
896
|
+
return this.handleFetchAgentTimelineRequest(msg);
|
|
897
|
+
case "agent.fork_context.request":
|
|
898
|
+
return this.handleAgentForkContextRequest(msg);
|
|
899
|
+
default:
|
|
900
|
+
return undefined;
|
|
901
|
+
}
|
|
902
|
+
}
|
|
894
903
|
dispatchAgentLifecycleMessage(msg) {
|
|
895
904
|
switch (msg.type) {
|
|
896
905
|
case "fetch_agents_request":
|
|
@@ -925,8 +934,6 @@ export class Session {
|
|
|
925
934
|
return this.handleRefreshAgentRequest(msg);
|
|
926
935
|
case "cancel_agent_request":
|
|
927
936
|
return this.handleCancelAgentRequest(msg.agentId, msg.requestId);
|
|
928
|
-
case "fetch_agent_timeline_request":
|
|
929
|
-
return this.handleFetchAgentTimelineRequest(msg);
|
|
930
937
|
case "agent_permission_response":
|
|
931
938
|
return this.handleAgentPermissionResponse(msg.agentId, msg.requestId, msg.response);
|
|
932
939
|
case "clear_agent_attention":
|
|
@@ -957,6 +964,8 @@ export class Session {
|
|
|
957
964
|
return this.daemonSession.handleGetPairingOfferRequest(msg);
|
|
958
965
|
case "diagnostics.request":
|
|
959
966
|
return this.daemonSession.handleDiagnosticsRequest(msg);
|
|
967
|
+
case "daemon.update.request":
|
|
968
|
+
return this.daemonSession.handleUpdateRequest(msg);
|
|
960
969
|
case "set_daemon_config_request":
|
|
961
970
|
this.emit({
|
|
962
971
|
type: "set_daemon_config_response",
|
|
@@ -1164,6 +1173,9 @@ export class Session {
|
|
|
1164
1173
|
resetPeakInflight() {
|
|
1165
1174
|
this.peakInflightRequests = this.inflightRequests;
|
|
1166
1175
|
}
|
|
1176
|
+
getSessionId() {
|
|
1177
|
+
return this.sessionId;
|
|
1178
|
+
}
|
|
1167
1179
|
async handleBinaryFrame(binaryFrame) {
|
|
1168
1180
|
if (binaryFrame.kind === "file_transfer") {
|
|
1169
1181
|
await this.workspaceFilesSession.handleFileTransferFrame(binaryFrame.frame);
|
|
@@ -1172,6 +1184,7 @@ export class Session {
|
|
|
1172
1184
|
this.terminalController.handleBinaryFrame(binaryFrame.frame);
|
|
1173
1185
|
}
|
|
1174
1186
|
async handleRestartServerRequest(requestId, reason) {
|
|
1187
|
+
const lifecycleReason = normalizeClientRestartRpcReason(reason);
|
|
1175
1188
|
const payload = {
|
|
1176
1189
|
status: "restart_requested",
|
|
1177
1190
|
clientId: this.clientId,
|
|
@@ -1180,7 +1193,7 @@ export class Session {
|
|
|
1180
1193
|
payload.reason = reason;
|
|
1181
1194
|
}
|
|
1182
1195
|
payload.requestId = requestId;
|
|
1183
|
-
this.sessionLogger.warn({ reason }, "Restart requested via websocket");
|
|
1196
|
+
this.sessionLogger.warn({ reason: lifecycleReason }, "Restart requested via websocket");
|
|
1184
1197
|
this.emit({
|
|
1185
1198
|
type: "status",
|
|
1186
1199
|
payload,
|
|
@@ -1189,11 +1202,12 @@ export class Session {
|
|
|
1189
1202
|
type: "restart",
|
|
1190
1203
|
clientId: this.clientId,
|
|
1191
1204
|
requestId,
|
|
1192
|
-
|
|
1205
|
+
reason: lifecycleReason,
|
|
1193
1206
|
});
|
|
1194
1207
|
}
|
|
1195
1208
|
async handleShutdownServerRequest(requestId) {
|
|
1196
|
-
|
|
1209
|
+
const reason = CLIENT_SHUTDOWN_RPC_REASON;
|
|
1210
|
+
this.sessionLogger.warn({ reason }, "Shutdown requested via websocket");
|
|
1197
1211
|
this.emit({
|
|
1198
1212
|
type: "status",
|
|
1199
1213
|
payload: {
|
|
@@ -1206,6 +1220,7 @@ export class Session {
|
|
|
1206
1220
|
type: "shutdown",
|
|
1207
1221
|
clientId: this.clientId,
|
|
1208
1222
|
requestId,
|
|
1223
|
+
reason,
|
|
1209
1224
|
});
|
|
1210
1225
|
}
|
|
1211
1226
|
emitLifecycleIntent(intent) {
|
|
@@ -1691,6 +1706,7 @@ export class Session {
|
|
|
1691
1706
|
cwd: createAgentConfig.cwd,
|
|
1692
1707
|
initialTitle: workspacePromptTitle,
|
|
1693
1708
|
});
|
|
1709
|
+
const createdDirectoryWorkspaceForAgent = !createdWorktree && !msg.workspaceId;
|
|
1694
1710
|
const { snapshot, liveSnapshot } = await createAgentCommand({
|
|
1695
1711
|
agentManager: this.agentManager,
|
|
1696
1712
|
agentStorage: this.agentStorage,
|
|
@@ -1716,11 +1732,8 @@ export class Session {
|
|
|
1716
1732
|
buildSessionConfig: (sessionConfig, gitOptions, legacyWorktreeName, ctx) => this.buildAgentSessionConfig(sessionConfig, gitOptions, legacyWorktreeName, ctx),
|
|
1717
1733
|
});
|
|
1718
1734
|
createdAgentId = snapshot.id;
|
|
1719
|
-
if (!createdWorktree && msg.workspaceId) {
|
|
1720
|
-
await this.writeInitialWorkspaceTitleIfUntitled(workspaceId, workspacePromptTitle);
|
|
1721
|
-
}
|
|
1722
1735
|
await this.agentUpdates.forwardLiveAgent(snapshot);
|
|
1723
|
-
if (
|
|
1736
|
+
if (createdDirectoryWorkspaceForAgent && trimmedPrompt) {
|
|
1724
1737
|
await this.scheduleAutoNameLocalWorkspaceTitleForFirstAgent({
|
|
1725
1738
|
workspaceId,
|
|
1726
1739
|
cwd: createAgentConfig.cwd,
|
|
@@ -2118,20 +2131,6 @@ export class Session {
|
|
|
2118
2131
|
updatedAt: new Date().toISOString(),
|
|
2119
2132
|
});
|
|
2120
2133
|
}
|
|
2121
|
-
async writeInitialWorkspaceTitleIfUntitled(workspaceId, title) {
|
|
2122
|
-
if (!title) {
|
|
2123
|
-
return;
|
|
2124
|
-
}
|
|
2125
|
-
const current = await this.workspaceRegistry.get(workspaceId);
|
|
2126
|
-
if (!current || current.title) {
|
|
2127
|
-
return;
|
|
2128
|
-
}
|
|
2129
|
-
await this.workspaceRegistry.upsert({
|
|
2130
|
-
...current,
|
|
2131
|
-
title,
|
|
2132
|
-
updatedAt: new Date().toISOString(),
|
|
2133
|
-
});
|
|
2134
|
-
}
|
|
2135
2134
|
// Wraps the injected workspace-name generator for a directory workspace.
|
|
2136
2135
|
async generateWorkspaceTitleFromContext(input) {
|
|
2137
2136
|
return this.generateWorkspaceName({
|
|
@@ -2624,9 +2623,7 @@ export class Session {
|
|
|
2624
2623
|
if (existing) {
|
|
2625
2624
|
return existing;
|
|
2626
2625
|
}
|
|
2627
|
-
const placementPromise =
|
|
2628
|
-
? this.buildProjectPlacementForExistingWorkspaceProject(workspaceId)
|
|
2629
|
-
: this.buildProjectPlacementForWorkspaceId(workspaceId);
|
|
2626
|
+
const placementPromise = this.buildProjectPlacementForWorkspaceId(workspaceId);
|
|
2630
2627
|
placementByWorkspaceId.set(workspaceId, placementPromise);
|
|
2631
2628
|
return placementPromise;
|
|
2632
2629
|
};
|
|
@@ -4038,6 +4035,51 @@ export class Session {
|
|
|
4038
4035
|
});
|
|
4039
4036
|
}
|
|
4040
4037
|
}
|
|
4038
|
+
async handleAgentForkContextRequest(msg) {
|
|
4039
|
+
try {
|
|
4040
|
+
const snapshot = await ensureAgentLoaded(msg.agentId, {
|
|
4041
|
+
agentManager: this.agentManager,
|
|
4042
|
+
agentStorage: this.agentStorage,
|
|
4043
|
+
logger: this.sessionLogger,
|
|
4044
|
+
});
|
|
4045
|
+
const agentPayload = await this.buildAgentPayload(snapshot);
|
|
4046
|
+
const rows = this.agentManager.fetchTimeline(msg.agentId, {
|
|
4047
|
+
direction: "tail",
|
|
4048
|
+
limit: 0,
|
|
4049
|
+
}).rows;
|
|
4050
|
+
const forkContext = buildAgentForkContextAttachment({
|
|
4051
|
+
rows,
|
|
4052
|
+
boundaryMessageId: msg.boundaryMessageId,
|
|
4053
|
+
agentTitle: agentPayload.title,
|
|
4054
|
+
cwd: snapshot.cwd,
|
|
4055
|
+
});
|
|
4056
|
+
this.emit({
|
|
4057
|
+
type: "agent.fork_context.response",
|
|
4058
|
+
payload: {
|
|
4059
|
+
requestId: msg.requestId,
|
|
4060
|
+
agentId: msg.agentId,
|
|
4061
|
+
attachment: forkContext.attachment,
|
|
4062
|
+
itemCount: forkContext.itemCount,
|
|
4063
|
+
boundaryMessageId: forkContext.boundaryMessageId,
|
|
4064
|
+
error: null,
|
|
4065
|
+
},
|
|
4066
|
+
});
|
|
4067
|
+
}
|
|
4068
|
+
catch (error) {
|
|
4069
|
+
this.sessionLogger.error({ err: error, agentId: msg.agentId }, "Failed to handle agent.fork_context.request");
|
|
4070
|
+
this.emit({
|
|
4071
|
+
type: "agent.fork_context.response",
|
|
4072
|
+
payload: {
|
|
4073
|
+
requestId: msg.requestId,
|
|
4074
|
+
agentId: msg.agentId,
|
|
4075
|
+
attachment: null,
|
|
4076
|
+
itemCount: 0,
|
|
4077
|
+
boundaryMessageId: msg.boundaryMessageId ?? null,
|
|
4078
|
+
error: error instanceof Error ? error.message : String(error),
|
|
4079
|
+
},
|
|
4080
|
+
});
|
|
4081
|
+
}
|
|
4082
|
+
}
|
|
4041
4083
|
async handleSendAgentMessageRequest(msg) {
|
|
4042
4084
|
const resolved = await this.resolveAgentIdentifier(msg.agentId);
|
|
4043
4085
|
if (!resolved.ok) {
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { RequestHandler } from "express";
|
|
2
|
+
import type { Logger } from "pino";
|
|
3
|
+
export interface WebUiMiddlewareOptions {
|
|
4
|
+
enabled: boolean;
|
|
5
|
+
distDir: string | null;
|
|
6
|
+
label: string;
|
|
7
|
+
logger: Logger;
|
|
8
|
+
}
|
|
9
|
+
export declare function createWebUiMiddleware(options: WebUiMiddlewareOptions): RequestHandler;
|
|
10
|
+
//# sourceMappingURL=web-ui.d.ts.map
|