@getpaseo/server 0.1.97 → 0.1.98

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 (69) hide show
  1. package/dist/server/server/agent/agent-manager.d.ts +11 -3
  2. package/dist/server/server/agent/agent-manager.js +94 -22
  3. package/dist/server/server/agent/agent-prompt.d.ts +1 -1
  4. package/dist/server/server/agent/agent-prompt.js +3 -10
  5. package/dist/server/server/agent/agent-sdk-types.d.ts +9 -3
  6. package/dist/server/server/agent/create-agent/create.d.ts +2 -0
  7. package/dist/server/server/agent/create-agent/create.js +8 -7
  8. package/dist/server/server/agent/lifecycle-command.d.ts +15 -1
  9. package/dist/server/server/agent/lifecycle-command.js +9 -2
  10. package/dist/server/server/agent/mcp-server.js +254 -115
  11. package/dist/server/server/agent/provider-notices.d.ts +3 -0
  12. package/dist/server/server/agent/provider-notices.js +5 -0
  13. package/dist/server/server/agent/provider-registry.d.ts +2 -0
  14. package/dist/server/server/agent/provider-registry.js +10 -3
  15. package/dist/server/server/agent/provider-snapshot-manager.d.ts +3 -0
  16. package/dist/server/server/agent/provider-snapshot-manager.js +11 -2
  17. package/dist/server/server/agent/providers/claude/agent.js +257 -143
  18. package/dist/server/server/agent/providers/claude/models.js +7 -3
  19. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +4 -3
  20. package/dist/server/server/agent/providers/codex-app-server-agent.js +43 -1
  21. package/dist/server/server/agent/providers/copilot-acp-agent.js +4 -1
  22. package/dist/server/server/agent/providers/diagnostic-utils.d.ts +9 -0
  23. package/dist/server/server/agent/providers/diagnostic-utils.js +188 -0
  24. package/dist/server/server/agent/providers/mock-slow-provider.js +1 -1
  25. package/dist/server/server/agent/providers/opencode/server-manager.d.ts +29 -2
  26. package/dist/server/server/agent/providers/opencode/server-manager.js +83 -17
  27. package/dist/server/server/agent/providers/opencode-agent.d.ts +2 -0
  28. package/dist/server/server/agent/providers/opencode-agent.js +14 -9
  29. package/dist/server/server/agent/providers/pi/agent.js +27 -14
  30. package/dist/server/server/bootstrap.d.ts +2 -0
  31. package/dist/server/server/bootstrap.js +32 -2
  32. package/dist/server/server/managed-processes/managed-processes.d.ts +76 -0
  33. package/dist/server/server/managed-processes/managed-processes.js +326 -0
  34. package/dist/server/server/resolve-worktree-creation-intent.d.ts +3 -0
  35. package/dist/server/server/resolve-worktree-creation-intent.js +3 -3
  36. package/dist/server/server/session.d.ts +12 -1
  37. package/dist/server/server/session.js +230 -40
  38. package/dist/server/server/speech/providers/openai/runtime.js +3 -4
  39. package/dist/server/server/websocket-server.d.ts +1 -0
  40. package/dist/server/server/websocket-server.js +11 -0
  41. package/dist/server/server/workspace-archive-service.js +2 -3
  42. package/dist/server/server/workspace-directory.js +5 -5
  43. package/dist/server/server/workspace-reconciliation-service.js +2 -2
  44. package/dist/server/server/worktree-core.d.ts +1 -0
  45. package/dist/server/server/worktree-core.js +5 -1
  46. package/dist/server/services/quota-fetcher/manifest.d.ts +4 -0
  47. package/dist/server/services/quota-fetcher/manifest.js +47 -0
  48. package/dist/server/services/quota-fetcher/provider.d.ts +17 -0
  49. package/dist/server/services/quota-fetcher/provider.js +2 -0
  50. package/dist/server/services/quota-fetcher/providers/claude.d.ts +26 -0
  51. package/dist/server/services/quota-fetcher/providers/claude.js +217 -0
  52. package/dist/server/services/quota-fetcher/providers/codex.d.ts +23 -0
  53. package/dist/server/services/quota-fetcher/providers/codex.js +211 -0
  54. package/dist/server/services/quota-fetcher/providers/copilot.d.ts +17 -0
  55. package/dist/server/services/quota-fetcher/providers/copilot.js +75 -0
  56. package/dist/server/services/quota-fetcher/providers/cursor.d.ts +17 -0
  57. package/dist/server/services/quota-fetcher/providers/cursor.js +123 -0
  58. package/dist/server/services/quota-fetcher/providers/grok.d.ts +18 -0
  59. package/dist/server/services/quota-fetcher/providers/grok.js +89 -0
  60. package/dist/server/services/quota-fetcher/providers/kimi.d.ts +20 -0
  61. package/dist/server/services/quota-fetcher/providers/kimi.js +89 -0
  62. package/dist/server/services/quota-fetcher/providers/zai.d.ts +17 -0
  63. package/dist/server/services/quota-fetcher/providers/zai.js +58 -0
  64. package/dist/server/services/quota-fetcher/service.d.ts +28 -0
  65. package/dist/server/services/quota-fetcher/service.js +58 -0
  66. package/dist/server/services/quota-fetcher/usage.d.ts +22 -0
  67. package/dist/server/services/quota-fetcher/usage.js +49 -0
  68. package/dist/server/utils/directory-suggestions.js +98 -2
  69. package/package.json +5 -5
@@ -24,6 +24,15 @@ const IGNORED_SUGGESTION_DIRECTORY_NAMES = new Set([
24
24
  "coverage",
25
25
  "vendor",
26
26
  "__pycache__",
27
+ ".git",
28
+ ]);
29
+ const TRAVERSABLE_HIDDEN_WORKSPACE_DIRECTORY_NAMES = new Set([
30
+ ".agents",
31
+ ".claude",
32
+ ".codex",
33
+ ".github",
34
+ ".paseo",
35
+ ".vscode",
27
36
  ]);
28
37
  export async function searchHomeDirectories(options) {
29
38
  const query = options.query.trim();
@@ -71,6 +80,17 @@ export async function searchWorkspaceEntries(options) {
71
80
  return [];
72
81
  }
73
82
  const matchMode = options.matchMode ?? "fuzzy";
83
+ const exactEntry = queryParts.isPathQuery && matchMode === "suffix"
84
+ ? await resolveWorkspaceExactEntry({
85
+ workspaceRoot,
86
+ query: options.query,
87
+ includeDirectories,
88
+ includeFiles,
89
+ })
90
+ : null;
91
+ if (exactEntry && limit <= 1) {
92
+ return [exactEntry];
93
+ }
74
94
  if (queryParts.isPathQuery && matchMode !== "suffix") {
75
95
  return searchWorkspaceWithinParentDirectory({
76
96
  workspaceRoot,
@@ -84,7 +104,7 @@ export async function searchWorkspaceEntries(options) {
84
104
  const searchTerm = matchMode === "suffix"
85
105
  ? [queryParts.parentPart, queryParts.searchTerm].filter(Boolean).join("/")
86
106
  : queryParts.searchTerm;
87
- return searchWorkspaceAcrossTree({
107
+ const entries = await searchWorkspaceAcrossTree({
88
108
  workspaceRoot,
89
109
  searchTerm,
90
110
  limit,
@@ -94,6 +114,53 @@ export async function searchWorkspaceEntries(options) {
94
114
  maxDepth: options.maxDepth ?? DEFAULT_MAX_DEPTH,
95
115
  maxEntriesScanned: options.maxEntriesScanned ?? DEFAULT_MAX_DIRECTORIES_SCANNED,
96
116
  });
117
+ return exactEntry ? prependWorkspaceEntry(exactEntry, entries).slice(0, limit) : entries;
118
+ }
119
+ async function resolveWorkspaceExactEntry(input) {
120
+ const normalized = input.query
121
+ .trim()
122
+ .replace(/\\/g, "/")
123
+ .replace(/^\.\/+/, "")
124
+ .replace(/\/{2,}/g, "/");
125
+ if (!normalized) {
126
+ return null;
127
+ }
128
+ const candidatePath = path.isAbsolute(normalized)
129
+ ? path.resolve(normalized)
130
+ : path.resolve(input.workspaceRoot, normalized);
131
+ let resolvedPath;
132
+ try {
133
+ resolvedPath = await realpath(candidatePath);
134
+ }
135
+ catch {
136
+ return null;
137
+ }
138
+ if (!isPathInsideRoot(input.workspaceRoot, resolvedPath)) {
139
+ return null;
140
+ }
141
+ const stats = await stat(resolvedPath).catch(() => null);
142
+ if (!stats) {
143
+ return null;
144
+ }
145
+ if (stats.isFile() && input.includeFiles) {
146
+ return {
147
+ path: normalizeRelativePath(input.workspaceRoot, resolvedPath),
148
+ kind: "file",
149
+ };
150
+ }
151
+ if (stats.isDirectory() && input.includeDirectories) {
152
+ return {
153
+ path: normalizeRelativePath(input.workspaceRoot, resolvedPath),
154
+ kind: "directory",
155
+ };
156
+ }
157
+ return null;
158
+ }
159
+ function prependWorkspaceEntry(entry, entries) {
160
+ return [
161
+ entry,
162
+ ...entries.filter((candidate) => candidate.kind !== entry.kind || candidate.path !== entry.path),
163
+ ];
97
164
  }
98
165
  function normalizeLimit(limit) {
99
166
  const candidate = limit ?? DEFAULT_LIMIT;
@@ -185,6 +252,9 @@ async function searchWorkspaceWithinParentDirectory(input) {
185
252
  if (entry.kind === "file" && !input.includeFiles) {
186
253
  continue;
187
254
  }
255
+ if (isHiddenWorkspaceSuggestion(entry)) {
256
+ continue;
257
+ }
188
258
  const rankedEntry = rankWorkspaceEntry({
189
259
  absolutePath: entry.absolutePath,
190
260
  kind: entry.kind,
@@ -230,6 +300,10 @@ async function searchWorkspaceAcrossTree(input) {
230
300
  if (entry.kind === "directory" && !input.includeDirectories) {
231
301
  continue;
232
302
  }
303
+ // Hidden directories are traversed, but not offered as suggestions.
304
+ if (isHiddenWorkspaceSuggestion(entry)) {
305
+ continue;
306
+ }
233
307
  if (entry.kind === "file" && !input.includeFiles) {
234
308
  continue;
235
309
  }
@@ -618,7 +692,23 @@ async function listWorkspaceChildEntries(input) {
618
692
  return cached.entries;
619
693
  }
620
694
  const dirents = await readdir(input.directory, { withFileTypes: true }).catch(() => []);
621
- const candidates = dirents.filter((dirent) => !isHiddenDirectoryName(dirent.name) && !isIgnoredSuggestionDirectoryName(dirent.name));
695
+ const candidates = dirents.filter((dirent) => {
696
+ if (isIgnoredSuggestionDirectoryName(dirent.name)) {
697
+ return false;
698
+ }
699
+ if (isHiddenDirectoryName(dirent.name) &&
700
+ !dirent.isFile() &&
701
+ !isTraversableHiddenWorkspaceDirectoryName(dirent.name)) {
702
+ return false;
703
+ }
704
+ // Allowlisted hidden directories remain traversable so file links like
705
+ // `.claude/settings.local.json` can resolve, but hidden files (e.g.
706
+ // `.DS_Store`) should never be suggested.
707
+ if (dirent.isFile() && isHiddenDirectoryName(dirent.name)) {
708
+ return false;
709
+ }
710
+ return true;
711
+ });
622
712
  const resolved = await Promise.all(candidates.map(async (dirent) => {
623
713
  const candidatePath = path.join(input.directory, dirent.name);
624
714
  const entry = await resolveWorkspaceCandidate({
@@ -687,9 +777,15 @@ async function resolveWorkspaceCandidate(input) {
687
777
  function isHiddenDirectoryName(name) {
688
778
  return name.startsWith(".");
689
779
  }
780
+ function isHiddenWorkspaceSuggestion(entry) {
781
+ return isHiddenDirectoryName(entry.name);
782
+ }
690
783
  function isIgnoredSuggestionDirectoryName(name) {
691
784
  return IGNORED_SUGGESTION_DIRECTORY_NAMES.has(name);
692
785
  }
786
+ function isTraversableHiddenWorkspaceDirectoryName(name) {
787
+ return TRAVERSABLE_HIDDEN_WORKSPACE_DIRECTORY_NAMES.has(name);
788
+ }
693
789
  function setDirectoryListCache(cacheKey, entry) {
694
790
  directoryListCache.set(cacheKey, entry);
695
791
  pruneDirectoryListCache();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getpaseo/server",
3
- "version": "0.1.97",
3
+ "version": "0.1.98",
4
4
  "description": "Paseo backend server",
5
5
  "files": [
6
6
  "dist/server",
@@ -65,10 +65,10 @@
65
65
  "@agentclientprotocol/sdk": "^0.17.1",
66
66
  "@anthropic-ai/claude-agent-sdk": "^0.3.181",
67
67
  "@anthropic-ai/sdk": "^0.104.2",
68
- "@getpaseo/client": "0.1.97",
69
- "@getpaseo/highlight": "0.1.97",
70
- "@getpaseo/protocol": "0.1.97",
71
- "@getpaseo/relay": "0.1.97",
68
+ "@getpaseo/client": "0.1.98",
69
+ "@getpaseo/highlight": "0.1.98",
70
+ "@getpaseo/protocol": "0.1.98",
71
+ "@getpaseo/relay": "0.1.98",
72
72
  "@isaacs/ttlcache": "^2.1.4",
73
73
  "@modelcontextprotocol/sdk": "^1.20.1",
74
74
  "@opencode-ai/sdk": "1.14.46",