@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.
Files changed (132) hide show
  1. package/dist/scripts/supervisor.js +26 -8
  2. package/dist/server/server/agent/activity-curator.d.ts +17 -0
  3. package/dist/server/server/agent/activity-curator.js +101 -24
  4. package/dist/server/server/agent/agent-manager.js +5 -1
  5. package/dist/server/server/agent/agent-sdk-types.d.ts +7 -2
  6. package/dist/server/server/agent/provider-snapshot-manager.d.ts +8 -1
  7. package/dist/server/server/agent/provider-snapshot-manager.js +78 -33
  8. package/dist/server/server/agent/providers/acp-agent.d.ts +7 -0
  9. package/dist/server/server/agent/providers/acp-agent.js +8 -1
  10. package/dist/server/server/agent/providers/claude/agent.js +51 -14
  11. package/dist/server/server/agent/providers/claude/query.d.ts +3 -0
  12. package/dist/server/server/agent/providers/claude/query.js +4 -2
  13. package/dist/server/server/agent/providers/mock-load-test-agent.js +8 -0
  14. package/dist/server/server/agent/providers/opencode/paths.d.ts +2 -0
  15. package/dist/server/server/agent/providers/opencode/paths.js +7 -0
  16. package/dist/server/server/agent/providers/opencode/server-manager.d.ts +2 -0
  17. package/dist/server/server/agent/providers/opencode/server-manager.js +34 -5
  18. package/dist/server/server/agent/providers/opencode-agent.d.ts +4 -0
  19. package/dist/server/server/agent/providers/opencode-agent.js +14 -2
  20. package/dist/server/server/agent/providers/pi/agent.d.ts +3 -0
  21. package/dist/server/server/agent/providers/pi/agent.js +9 -3
  22. package/dist/server/server/agent/providers/provider-image-output.js +11 -6
  23. package/dist/server/server/agent/tools/paseo-tools.d.ts +1 -1
  24. package/dist/server/server/agent/tools/paseo-tools.js +0 -2
  25. package/dist/server/server/bootstrap.d.ts +7 -1
  26. package/dist/server/server/bootstrap.js +18 -0
  27. package/dist/server/server/config.d.ts +2 -0
  28. package/dist/server/server/config.js +57 -1
  29. package/dist/server/server/daemon-worker.js +19 -7
  30. package/dist/server/server/lifecycle-reasons.d.ts +4 -0
  31. package/dist/server/server/lifecycle-reasons.js +6 -0
  32. package/dist/server/server/persisted-config.d.ts +7 -0
  33. package/dist/server/server/persisted-config.js +8 -0
  34. package/dist/server/server/process-diagnostics.d.ts +17 -0
  35. package/dist/server/server/process-diagnostics.js +22 -0
  36. package/dist/server/server/relay-transport.js +1 -0
  37. package/dist/server/server/resolve-worktree-creation-intent.js +3 -1
  38. package/dist/server/server/session/daemon/daemon-self-update-session-controller.d.ts +32 -0
  39. package/dist/server/server/session/daemon/daemon-self-update-session-controller.js +88 -0
  40. package/dist/server/server/session/daemon/daemon-self-updater.d.ts +32 -0
  41. package/dist/server/server/session/daemon/daemon-self-updater.js +56 -0
  42. package/dist/server/server/session/daemon/daemon-session.d.ts +12 -0
  43. package/dist/server/server/session/daemon/daemon-session.js +12 -0
  44. package/dist/server/server/session/daemon/diagnostics.js +10 -0
  45. package/dist/server/server/session/daemon/install-origin.d.ts +7 -0
  46. package/dist/server/server/session/daemon/install-origin.js +64 -0
  47. package/dist/server/server/session/daemon/npm-global-cli.d.ts +29 -0
  48. package/dist/server/server/session/daemon/npm-global-cli.js +98 -0
  49. package/dist/server/server/session/provider/provider-catalog-session.js +8 -4
  50. package/dist/server/server/session.d.ts +5 -3
  51. package/dist/server/server/session.js +74 -32
  52. package/dist/server/server/web-ui.d.ts +10 -0
  53. package/dist/server/server/web-ui.js +205 -0
  54. package/dist/server/server/websocket/runtime-metrics.d.ts +3 -0
  55. package/dist/server/server/websocket-server.d.ts +3 -0
  56. package/dist/server/server/websocket-server.js +190 -32
  57. package/dist/server/services/quota-fetcher/manifest.js +5 -0
  58. package/dist/server/services/quota-fetcher/providers/minimax.d.ts +29 -0
  59. package/dist/server/services/quota-fetcher/providers/minimax.js +227 -0
  60. package/dist/server/terminal/agent-hooks/agent-hook-installer.js +2 -2
  61. package/dist/server/utils/checkout-git.js +156 -3
  62. package/dist/server/utils/directory-suggestions.js +1 -4
  63. package/dist/server/utils/path.d.ts +2 -0
  64. package/dist/server/utils/path.js +13 -0
  65. package/dist/server/utils/worktree.d.ts +1 -0
  66. package/dist/server/utils/worktree.js +92 -11
  67. package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css +1 -0
  68. package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.br +0 -0
  69. package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.gz +0 -0
  70. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-b01555c9b42665a03988c0a0032ef528.js +1 -0
  71. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-b01555c9b42665a03988c0a0032ef528.js.br +0 -0
  72. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-b01555c9b42665a03988c0a0032ef528.js.gz +0 -0
  73. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-648388eca5c510b496e1eddf523f70ff.js +1 -0
  74. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-648388eca5c510b496e1eddf523f70ff.js.br +0 -0
  75. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-648388eca5c510b496e1eddf523f70ff.js.gz +0 -0
  76. package/dist/server/web-ui/_expo/static/js/web/index-0ebbea2cd337f0c0680fdb3f8d4d5af3.js +16157 -0
  77. package/dist/server/web-ui/_expo/static/js/web/index-0ebbea2cd337f0c0680fdb3f8d4d5af3.js.br +0 -0
  78. package/dist/server/web-ui/_expo/static/js/web/index-0ebbea2cd337f0c0680fdb3f8d4d5af3.js.gz +0 -0
  79. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-c64fa2416284927857a39087fd8d1332.js +1 -0
  80. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-c64fa2416284927857a39087fd8d1332.js.br +0 -0
  81. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-c64fa2416284927857a39087fd8d1332.js.gz +0 -0
  82. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-a9784226715772edf87ef36c596599c2.js +3 -0
  83. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-a9784226715772edf87ef36c596599c2.js.br +0 -0
  84. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-a9784226715772edf87ef36c596599c2.js.gz +0 -0
  85. package/dist/server/web-ui/apple-touch-icon.png +0 -0
  86. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon-mask.0a328cd9c1afd0afe8e3b1ec5165b1b4.png +0 -0
  87. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon.35ba0eaec5a4f5ed12ca16fabeae451d.png +0 -0
  88. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55.png +0 -0
  89. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@2x.png +0 -0
  90. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@3x.png +0 -0
  91. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@4x.png +0 -0
  92. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7.png +0 -0
  93. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@2x.png +0 -0
  94. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@3x.png +0 -0
  95. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@4x.png +0 -0
  96. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/search-icon.286d67d3f74808a60a78d3ebf1a5fb57.png +0 -0
  97. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/arrow_down.017bc6ba3fc25503e5eb5e53826d48a8.png +0 -0
  98. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/error.d1ea1496f9057eb392d5bbf3732a61b7.png +0 -0
  99. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/file.19eeb73b9593a38f8e9f418337fc7d10.png +0 -0
  100. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/forward.d8b800c443b8972542883e0b9de2bdc6.png +0 -0
  101. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/pkg.ab19f4cbc543357183a20571f68380a3.png +0 -0
  102. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/sitemap.412dd9275b6b48ad28f5e3d81bb1f626.png +0 -0
  103. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/unmatched.20e71bdf79e3a97bf55fd9e164041578.png +0 -0
  104. package/dist/server/web-ui/assets/assets/images/editor-apps/antigravity.6e91a685c33435e0b466a56db86cf141.png +0 -0
  105. package/dist/server/web-ui/assets/assets/images/editor-apps/cursor.c31d6bce4fe9aadc3fe59962f4c4fcf3.png +0 -0
  106. package/dist/server/web-ui/assets/assets/images/editor-apps/file-explorer.3e15e8f72c825c85ce336bcb0cdef776.png +0 -0
  107. package/dist/server/web-ui/assets/assets/images/editor-apps/finder.7f68fc2c475621a672e1be09309d5567.png +0 -0
  108. package/dist/server/web-ui/assets/assets/images/editor-apps/vscode.832bdb4c685d930f1c864c793703600b.png +0 -0
  109. package/dist/server/web-ui/assets/assets/images/editor-apps/webstorm.aa5dc2cd8c20cc0a155c4c5c5ab3c5f5.png +0 -0
  110. package/dist/server/web-ui/assets/assets/images/editor-apps/zed.f3a670b7f9aa226da4fe53fb86f1abbd.png +0 -0
  111. package/dist/server/web-ui/assets/assets/images/favicon-dark-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
  112. package/dist/server/web-ui/assets/assets/images/favicon-dark-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
  113. package/dist/server/web-ui/assets/assets/images/favicon-dark.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
  114. package/dist/server/web-ui/assets/assets/images/favicon-light-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
  115. package/dist/server/web-ui/assets/assets/images/favicon-light-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
  116. package/dist/server/web-ui/assets/assets/images/favicon-light.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
  117. package/dist/server/web-ui/assets/assets/images/notification-icon.3bf81d33ddbf380606bdd248ba83e158.png +0 -0
  118. package/dist/server/web-ui/favicon.ico +0 -0
  119. package/dist/server/web-ui/index.html +90 -0
  120. package/dist/server/web-ui/index.html.br +0 -0
  121. package/dist/server/web-ui/index.html.gz +0 -0
  122. package/dist/server/web-ui/manifest.json +27 -0
  123. package/dist/server/web-ui/manifest.json.br +0 -0
  124. package/dist/server/web-ui/manifest.json.gz +0 -0
  125. package/dist/server/web-ui/metadata.json +1 -0
  126. package/dist/server/web-ui/metadata.json.br +1 -0
  127. package/dist/server/web-ui/metadata.json.gz +0 -0
  128. package/dist/server/web-ui/pwa-icon-192.png +0 -0
  129. package/dist/server/web-ui/pwa-icon-512.png +0 -0
  130. package/dist/server/web-ui/robots.txt +2 -0
  131. package/dist/src/server/persisted-config.js +8 -0
  132. 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 { 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
  /**
@@ -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
- ...(reason ? { reason } : {}),
1205
+ reason: lifecycleReason,
1193
1206
  });
1194
1207
  }
1195
1208
  async handleShutdownServerRequest(requestId) {
1196
- this.sessionLogger.warn("Shutdown requested via websocket");
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 (!createdWorktree && trimmedPrompt) {
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 = request.type === "fetch_agent_history_request"
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