@getpaseo/server 0.1.6 → 0.1.8
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/daemon-runner.js +31 -7
- package/dist/scripts/daemon-runner.js.map +1 -1
- package/dist/scripts/dev-runner.js +5 -0
- package/dist/scripts/dev-runner.js.map +1 -1
- package/dist/server/client/daemon-client.d.ts +6 -1
- package/dist/server/client/daemon-client.d.ts.map +1 -1
- package/dist/server/client/daemon-client.js +12 -0
- package/dist/server/client/daemon-client.js.map +1 -1
- package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
- package/dist/server/server/agent/agent-manager.js +9 -1
- package/dist/server/server/agent/agent-manager.js.map +1 -1
- package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude-agent.js +13 -3
- package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
- package/dist/server/server/bootstrap.d.ts.map +1 -1
- package/dist/server/server/bootstrap.js +1 -7
- package/dist/server/server/bootstrap.js.map +1 -1
- package/dist/server/server/exports.d.ts +1 -0
- package/dist/server/server/exports.d.ts.map +1 -1
- package/dist/server/server/exports.js +1 -0
- package/dist/server/server/exports.js.map +1 -1
- package/dist/server/server/index.js +0 -5
- package/dist/server/server/index.js.map +1 -1
- package/dist/server/server/persisted-config.d.ts +0 -7
- package/dist/server/server/persisted-config.d.ts.map +1 -1
- package/dist/server/server/persisted-config.js +25 -2
- package/dist/server/server/persisted-config.js.map +1 -1
- package/dist/server/server/session.d.ts +2 -0
- package/dist/server/server/session.d.ts.map +1 -1
- package/dist/server/server/session.js +57 -2
- package/dist/server/server/session.js.map +1 -1
- package/dist/server/server/speech/providers/local/config.d.ts +0 -1
- package/dist/server/server/speech/providers/local/config.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/config.js +1 -14
- package/dist/server/server/speech/providers/local/config.js.map +1 -1
- package/dist/server/server/speech/providers/local/models.d.ts +0 -1
- package/dist/server/server/speech/providers/local/models.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/models.js +0 -1
- package/dist/server/server/speech/providers/local/models.js.map +1 -1
- package/dist/server/server/speech/providers/local/runtime.d.ts +0 -2
- package/dist/server/server/speech/providers/local/runtime.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/runtime.js +6 -11
- package/dist/server/server/speech/providers/local/runtime.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts +0 -2
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +0 -5
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +85 -27
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts +18 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts.map +1 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.js +68 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.js.map +1 -0
- package/dist/server/server/speech/speech-runtime.d.ts.map +1 -1
- package/dist/server/server/speech/speech-runtime.js +9 -14
- package/dist/server/server/speech/speech-runtime.js.map +1 -1
- package/dist/server/server/utils/syntax-highlighter.d.ts.map +1 -1
- package/dist/server/server/utils/syntax-highlighter.js +4 -0
- package/dist/server/server/utils/syntax-highlighter.js.map +1 -1
- package/dist/server/server/worktree-bootstrap.d.ts.map +1 -1
- package/dist/server/server/worktree-bootstrap.js +50 -3
- package/dist/server/server/worktree-bootstrap.js.map +1 -1
- package/dist/server/shared/messages.d.ts +228 -0
- package/dist/server/shared/messages.d.ts.map +1 -1
- package/dist/server/shared/messages.js +16 -0
- package/dist/server/shared/messages.js.map +1 -1
- package/dist/server/terminal/terminal-manager.d.ts +5 -0
- package/dist/server/terminal/terminal-manager.d.ts.map +1 -1
- package/dist/server/terminal/terminal-manager.js +31 -1
- package/dist/server/terminal/terminal-manager.js.map +1 -1
- package/dist/server/utils/directory-suggestions.d.ts +9 -0
- package/dist/server/utils/directory-suggestions.d.ts.map +1 -0
- package/dist/server/utils/directory-suggestions.js +328 -0
- package/dist/server/utils/directory-suggestions.js.map +1 -0
- package/dist/server/utils/worktree-metadata.d.ts +28 -2
- package/dist/server/utils/worktree-metadata.d.ts.map +1 -1
- package/dist/server/utils/worktree-metadata.js +43 -1
- package/dist/server/utils/worktree-metadata.js.map +1 -1
- package/dist/server/utils/worktree.d.ts +13 -0
- package/dist/server/utils/worktree.d.ts.map +1 -1
- package/dist/server/utils/worktree.js +56 -12
- package/dist/server/utils/worktree.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import { readdir, realpath, stat } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
const DEFAULT_LIMIT = 30;
|
|
4
|
+
const MAX_LIMIT = 100;
|
|
5
|
+
const DEFAULT_MAX_DEPTH = 6;
|
|
6
|
+
const DEFAULT_MAX_DIRECTORIES_SCANNED = 5000;
|
|
7
|
+
const DIRECTORY_LIST_CACHE_TTL_MS = 8000;
|
|
8
|
+
const DIRECTORY_LIST_CACHE_MAX_ENTRIES = 4000;
|
|
9
|
+
const directoryListCache = new Map();
|
|
10
|
+
const NO_SEGMENT_INDEX = Number.MAX_SAFE_INTEGER;
|
|
11
|
+
const NO_MATCH_OFFSET = Number.MAX_SAFE_INTEGER;
|
|
12
|
+
export async function searchHomeDirectories(options) {
|
|
13
|
+
const query = options.query.trim();
|
|
14
|
+
if (!query) {
|
|
15
|
+
return [];
|
|
16
|
+
}
|
|
17
|
+
const limit = normalizeLimit(options.limit);
|
|
18
|
+
const homeRoot = await resolveDirectory(options.homeDir);
|
|
19
|
+
if (!homeRoot) {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
const queryParts = normalizeQueryParts(query, homeRoot);
|
|
23
|
+
if (!queryParts) {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
if (queryParts.isPathQuery) {
|
|
27
|
+
return searchWithinParentDirectory({
|
|
28
|
+
homeRoot,
|
|
29
|
+
parentPart: queryParts.parentPart,
|
|
30
|
+
searchTerm: queryParts.searchTerm,
|
|
31
|
+
limit,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return searchAcrossHomeTree({
|
|
35
|
+
homeRoot,
|
|
36
|
+
searchTerm: queryParts.searchTerm,
|
|
37
|
+
limit,
|
|
38
|
+
maxDepth: options.maxDepth ?? DEFAULT_MAX_DEPTH,
|
|
39
|
+
maxDirectoriesScanned: options.maxDirectoriesScanned ?? DEFAULT_MAX_DIRECTORIES_SCANNED,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function normalizeLimit(limit) {
|
|
43
|
+
const candidate = limit ?? DEFAULT_LIMIT;
|
|
44
|
+
if (!Number.isFinite(candidate)) {
|
|
45
|
+
return DEFAULT_LIMIT;
|
|
46
|
+
}
|
|
47
|
+
const bounded = Math.trunc(candidate);
|
|
48
|
+
return Math.max(1, Math.min(MAX_LIMIT, bounded));
|
|
49
|
+
}
|
|
50
|
+
async function searchWithinParentDirectory(input) {
|
|
51
|
+
const parentPath = path.resolve(input.homeRoot, input.parentPart || ".");
|
|
52
|
+
const parentRoot = await resolveDirectory(parentPath);
|
|
53
|
+
if (!parentRoot || !isPathInsideRoot(input.homeRoot, parentRoot)) {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
const searchLower = input.searchTerm.toLowerCase();
|
|
57
|
+
const ranked = [];
|
|
58
|
+
const entries = await listChildDirectories({
|
|
59
|
+
directory: parentRoot,
|
|
60
|
+
homeRoot: input.homeRoot,
|
|
61
|
+
});
|
|
62
|
+
for (const entry of entries) {
|
|
63
|
+
if (searchLower && !entry.name.toLowerCase().includes(searchLower)) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
ranked.push(rankDirectory({
|
|
67
|
+
absolutePath: entry.absolutePath,
|
|
68
|
+
homeRoot: input.homeRoot,
|
|
69
|
+
searchLower,
|
|
70
|
+
}));
|
|
71
|
+
}
|
|
72
|
+
return dedupeAndSort(ranked).slice(0, input.limit);
|
|
73
|
+
}
|
|
74
|
+
async function searchAcrossHomeTree(input) {
|
|
75
|
+
const queue = [
|
|
76
|
+
{ directory: input.homeRoot, depth: 0 },
|
|
77
|
+
];
|
|
78
|
+
const visited = new Set([input.homeRoot]);
|
|
79
|
+
const ranked = [];
|
|
80
|
+
let scanned = 0;
|
|
81
|
+
const searchLower = input.searchTerm.toLowerCase();
|
|
82
|
+
for (let queueIndex = 0; queueIndex < queue.length && scanned < input.maxDirectoriesScanned; queueIndex += 1) {
|
|
83
|
+
const current = queue[queueIndex];
|
|
84
|
+
if (!current)
|
|
85
|
+
continue;
|
|
86
|
+
const entries = await listChildDirectories({
|
|
87
|
+
directory: current.directory,
|
|
88
|
+
homeRoot: input.homeRoot,
|
|
89
|
+
});
|
|
90
|
+
for (const entry of entries) {
|
|
91
|
+
const resolvedCandidate = entry.absolutePath;
|
|
92
|
+
if (visited.has(resolvedCandidate)) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
visited.add(resolvedCandidate);
|
|
96
|
+
scanned += 1;
|
|
97
|
+
const relativePath = normalizeRelativePath(input.homeRoot, resolvedCandidate);
|
|
98
|
+
if (relativePath.toLowerCase().includes(searchLower) ||
|
|
99
|
+
entry.name.toLowerCase().includes(searchLower)) {
|
|
100
|
+
ranked.push(rankDirectory({
|
|
101
|
+
absolutePath: resolvedCandidate,
|
|
102
|
+
homeRoot: input.homeRoot,
|
|
103
|
+
searchLower,
|
|
104
|
+
}));
|
|
105
|
+
}
|
|
106
|
+
if (current.depth < input.maxDepth &&
|
|
107
|
+
scanned < input.maxDirectoriesScanned) {
|
|
108
|
+
queue.push({ directory: resolvedCandidate, depth: current.depth + 1 });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return dedupeAndSort(ranked).slice(0, input.limit);
|
|
113
|
+
}
|
|
114
|
+
function dedupeAndSort(ranked) {
|
|
115
|
+
const byPath = new Map();
|
|
116
|
+
for (const entry of ranked) {
|
|
117
|
+
const existing = byPath.get(entry.absolutePath);
|
|
118
|
+
if (!existing || compareRankedDirectories(entry, existing) < 0) {
|
|
119
|
+
byPath.set(entry.absolutePath, entry);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return Array.from(byPath.values())
|
|
123
|
+
.sort(compareRankedDirectories)
|
|
124
|
+
.map((entry) => entry.absolutePath);
|
|
125
|
+
}
|
|
126
|
+
function compareRankedDirectories(left, right) {
|
|
127
|
+
if (left.matchTier !== right.matchTier) {
|
|
128
|
+
return left.matchTier - right.matchTier;
|
|
129
|
+
}
|
|
130
|
+
if (left.segmentIndex !== right.segmentIndex) {
|
|
131
|
+
return left.segmentIndex - right.segmentIndex;
|
|
132
|
+
}
|
|
133
|
+
if (left.matchOffset !== right.matchOffset) {
|
|
134
|
+
return left.matchOffset - right.matchOffset;
|
|
135
|
+
}
|
|
136
|
+
if (left.depth !== right.depth) {
|
|
137
|
+
return left.depth - right.depth;
|
|
138
|
+
}
|
|
139
|
+
return left.absolutePath.localeCompare(right.absolutePath);
|
|
140
|
+
}
|
|
141
|
+
function rankDirectory(input) {
|
|
142
|
+
const relative = normalizeRelativePath(input.homeRoot, input.absolutePath);
|
|
143
|
+
const relativeLower = relative.toLowerCase();
|
|
144
|
+
const depth = relative === "." ? 0 : relative.split("/").length;
|
|
145
|
+
const searchLower = input.searchLower;
|
|
146
|
+
if (!searchLower) {
|
|
147
|
+
return {
|
|
148
|
+
absolutePath: input.absolutePath,
|
|
149
|
+
matchTier: 3,
|
|
150
|
+
segmentIndex: NO_SEGMENT_INDEX,
|
|
151
|
+
matchOffset: 0,
|
|
152
|
+
depth,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
const segments = relativeLower === "." ? [] : relativeLower.split("/");
|
|
156
|
+
const exactSegmentIndex = findSegmentMatchIndex(segments, (segment) => segment === searchLower);
|
|
157
|
+
const prefixSegmentIndex = findSegmentMatchIndex(segments, (segment) => segment.startsWith(searchLower));
|
|
158
|
+
const partialSegmentIndex = findSegmentMatchIndex(segments, (segment) => segment.includes(searchLower));
|
|
159
|
+
const matchOffset = relativeLower.indexOf(searchLower);
|
|
160
|
+
let matchTier = 4;
|
|
161
|
+
let segmentIndex = NO_SEGMENT_INDEX;
|
|
162
|
+
if (exactSegmentIndex >= 0) {
|
|
163
|
+
matchTier = 0;
|
|
164
|
+
segmentIndex = exactSegmentIndex;
|
|
165
|
+
}
|
|
166
|
+
else if (prefixSegmentIndex >= 0) {
|
|
167
|
+
matchTier = 1;
|
|
168
|
+
segmentIndex = prefixSegmentIndex;
|
|
169
|
+
}
|
|
170
|
+
else if (partialSegmentIndex >= 0) {
|
|
171
|
+
matchTier = 2;
|
|
172
|
+
segmentIndex = partialSegmentIndex;
|
|
173
|
+
}
|
|
174
|
+
else if (relativeLower.startsWith(searchLower)) {
|
|
175
|
+
matchTier = 3;
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
absolutePath: input.absolutePath,
|
|
179
|
+
matchTier,
|
|
180
|
+
segmentIndex,
|
|
181
|
+
matchOffset: matchOffset >= 0 ? matchOffset : NO_MATCH_OFFSET,
|
|
182
|
+
depth,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
function findSegmentMatchIndex(segments, predicate) {
|
|
186
|
+
for (let index = 0; index < segments.length; index += 1) {
|
|
187
|
+
const segment = segments[index];
|
|
188
|
+
if (!segment) {
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
if (predicate(segment)) {
|
|
192
|
+
return index;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return -1;
|
|
196
|
+
}
|
|
197
|
+
function normalizeRelativePath(homeRoot, absolutePath) {
|
|
198
|
+
const relative = path.relative(homeRoot, absolutePath);
|
|
199
|
+
if (!relative) {
|
|
200
|
+
return ".";
|
|
201
|
+
}
|
|
202
|
+
return relative.split(path.sep).join("/");
|
|
203
|
+
}
|
|
204
|
+
function isPathInsideRoot(root, target) {
|
|
205
|
+
const relative = path.relative(root, target);
|
|
206
|
+
return (relative === "" ||
|
|
207
|
+
(!relative.startsWith("..") && !path.isAbsolute(relative)));
|
|
208
|
+
}
|
|
209
|
+
function normalizeQueryParts(query, homeRoot) {
|
|
210
|
+
const typedQuery = query.trim().replace(/\\/g, "/");
|
|
211
|
+
let normalized = typedQuery;
|
|
212
|
+
if (!normalized) {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
if (normalized.startsWith("~")) {
|
|
216
|
+
normalized = normalized.slice(1);
|
|
217
|
+
if (normalized.startsWith("/")) {
|
|
218
|
+
normalized = normalized.slice(1);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (path.isAbsolute(normalized)) {
|
|
222
|
+
const absolute = path.resolve(normalized);
|
|
223
|
+
if (!isPathInsideRoot(homeRoot, absolute)) {
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
normalized = normalizeRelativePath(homeRoot, absolute);
|
|
227
|
+
}
|
|
228
|
+
normalized = normalized.replace(/^\.\/+/, "").replace(/\/{2,}/g, "/");
|
|
229
|
+
if (!normalized) {
|
|
230
|
+
// Treat "~" and "~/" as a request to browse the home root.
|
|
231
|
+
if (typedQuery === "~" || typedQuery === "~/") {
|
|
232
|
+
return {
|
|
233
|
+
isPathQuery: true,
|
|
234
|
+
parentPart: "",
|
|
235
|
+
searchTerm: "",
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
const isPathQuery = normalized.includes("/");
|
|
241
|
+
const slashIndex = normalized.lastIndexOf("/");
|
|
242
|
+
const parentPart = slashIndex >= 0 ? normalized.slice(0, slashIndex) : "";
|
|
243
|
+
const searchTerm = slashIndex >= 0 ? normalized.slice(slashIndex + 1) : normalized;
|
|
244
|
+
return {
|
|
245
|
+
isPathQuery,
|
|
246
|
+
parentPart,
|
|
247
|
+
searchTerm,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
async function resolveDirectory(inputPath) {
|
|
251
|
+
try {
|
|
252
|
+
const resolved = await realpath(path.resolve(inputPath));
|
|
253
|
+
const stats = await stat(resolved);
|
|
254
|
+
if (!stats.isDirectory()) {
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
return resolved;
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
async function listChildDirectories(input) {
|
|
264
|
+
const now = Date.now();
|
|
265
|
+
const cached = directoryListCache.get(input.directory);
|
|
266
|
+
if (cached && cached.expiresAt > now) {
|
|
267
|
+
return cached.entries;
|
|
268
|
+
}
|
|
269
|
+
const dirents = await readdir(input.directory, { withFileTypes: true }).catch(() => []);
|
|
270
|
+
const entries = [];
|
|
271
|
+
for (const dirent of dirents) {
|
|
272
|
+
if (!dirent.isDirectory() && !dirent.isSymbolicLink()) {
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
const candidatePath = path.join(input.directory, dirent.name);
|
|
276
|
+
const absolutePath = await resolveDirectoryCandidate({
|
|
277
|
+
candidatePath,
|
|
278
|
+
dirent,
|
|
279
|
+
homeRoot: input.homeRoot,
|
|
280
|
+
});
|
|
281
|
+
if (!absolutePath) {
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
entries.push({
|
|
285
|
+
name: dirent.name,
|
|
286
|
+
absolutePath,
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
setDirectoryListCache(input.directory, {
|
|
290
|
+
expiresAt: now + DIRECTORY_LIST_CACHE_TTL_MS,
|
|
291
|
+
entries,
|
|
292
|
+
});
|
|
293
|
+
return entries;
|
|
294
|
+
}
|
|
295
|
+
async function resolveDirectoryCandidate(input) {
|
|
296
|
+
if (input.dirent.isDirectory()) {
|
|
297
|
+
const resolved = path.resolve(input.candidatePath);
|
|
298
|
+
return isPathInsideRoot(input.homeRoot, resolved) ? resolved : null;
|
|
299
|
+
}
|
|
300
|
+
const resolved = await resolveDirectory(input.candidatePath);
|
|
301
|
+
if (!resolved || !isPathInsideRoot(input.homeRoot, resolved)) {
|
|
302
|
+
return null;
|
|
303
|
+
}
|
|
304
|
+
return resolved;
|
|
305
|
+
}
|
|
306
|
+
function setDirectoryListCache(cacheKey, entry) {
|
|
307
|
+
directoryListCache.set(cacheKey, entry);
|
|
308
|
+
pruneDirectoryListCache();
|
|
309
|
+
}
|
|
310
|
+
function pruneDirectoryListCache() {
|
|
311
|
+
if (directoryListCache.size <= DIRECTORY_LIST_CACHE_MAX_ENTRIES) {
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
const now = Date.now();
|
|
315
|
+
for (const [cacheKey, entry] of directoryListCache) {
|
|
316
|
+
if (entry.expiresAt <= now) {
|
|
317
|
+
directoryListCache.delete(cacheKey);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
while (directoryListCache.size > DIRECTORY_LIST_CACHE_MAX_ENTRIES) {
|
|
321
|
+
const oldestKey = directoryListCache.keys().next().value;
|
|
322
|
+
if (!oldestKey) {
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
directoryListCache.delete(oldestKey);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
//# sourceMappingURL=directory-suggestions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directory-suggestions.js","sourceRoot":"","sources":["../../../src/utils/directory-suggestions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
declare const PaseoWorktreeMetadataSchema: z.ZodObject<{
|
|
2
|
+
declare const PaseoWorktreeMetadataSchema: z.ZodUnion<[z.ZodObject<{
|
|
3
3
|
version: z.ZodLiteral<1>;
|
|
4
4
|
baseRefName: z.ZodString;
|
|
5
5
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -8,14 +8,40 @@ declare const PaseoWorktreeMetadataSchema: z.ZodObject<{
|
|
|
8
8
|
}, {
|
|
9
9
|
baseRefName: string;
|
|
10
10
|
version: 1;
|
|
11
|
-
}
|
|
11
|
+
}>, z.ZodObject<{
|
|
12
|
+
version: z.ZodLiteral<2>;
|
|
13
|
+
baseRefName: z.ZodString;
|
|
14
|
+
runtime: z.ZodOptional<z.ZodObject<{
|
|
15
|
+
worktreePort: z.ZodNumber;
|
|
16
|
+
}, "strip", z.ZodTypeAny, {
|
|
17
|
+
worktreePort: number;
|
|
18
|
+
}, {
|
|
19
|
+
worktreePort: number;
|
|
20
|
+
}>>;
|
|
21
|
+
}, "strip", z.ZodTypeAny, {
|
|
22
|
+
baseRefName: string;
|
|
23
|
+
version: 2;
|
|
24
|
+
runtime?: {
|
|
25
|
+
worktreePort: number;
|
|
26
|
+
} | undefined;
|
|
27
|
+
}, {
|
|
28
|
+
baseRefName: string;
|
|
29
|
+
version: 2;
|
|
30
|
+
runtime?: {
|
|
31
|
+
worktreePort: number;
|
|
32
|
+
} | undefined;
|
|
33
|
+
}>]>;
|
|
12
34
|
export type PaseoWorktreeMetadata = z.infer<typeof PaseoWorktreeMetadataSchema>;
|
|
13
35
|
export declare function getPaseoWorktreeMetadataPath(worktreeRoot: string): string;
|
|
14
36
|
export declare function normalizeBaseRefName(input: string): string;
|
|
15
37
|
export declare function writePaseoWorktreeMetadata(worktreeRoot: string, options: {
|
|
16
38
|
baseRefName: string;
|
|
17
39
|
}): void;
|
|
40
|
+
export declare function writePaseoWorktreeRuntimeMetadata(worktreeRoot: string, options: {
|
|
41
|
+
worktreePort: number;
|
|
42
|
+
}): void;
|
|
18
43
|
export declare function readPaseoWorktreeMetadata(worktreeRoot: string): PaseoWorktreeMetadata | null;
|
|
19
44
|
export declare function requirePaseoWorktreeBaseRefName(worktreeRoot: string): string;
|
|
45
|
+
export declare function readPaseoWorktreeRuntimePort(worktreeRoot: string): number | null;
|
|
20
46
|
export {};
|
|
21
47
|
//# sourceMappingURL=worktree-metadata.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree-metadata.d.ts","sourceRoot":"","sources":["../../../src/utils/worktree-metadata.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"worktree-metadata.d.ts","sourceRoot":"","sources":["../../../src/utils/worktree-metadata.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAiBxB,QAAA,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAG/B,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAwBhF,wBAAgB,4BAA4B,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAGzE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAS1D;AAED,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GAC/B,IAAI,CAgBN;AAED,wBAAgB,iCAAiC,CAC/C,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,GAChC,IAAI,CAoBN;AAED,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI,CAO5F;AAED,wBAAgB,+BAA+B,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAO5E;AAED,wBAAgB,4BAA4B,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAShF"}
|
|
@@ -1,10 +1,23 @@
|
|
|
1
1
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
2
2
|
import { isAbsolute, join, resolve } from "path";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
-
const
|
|
4
|
+
const PaseoWorktreeMetadataV1Schema = z.object({
|
|
5
5
|
version: z.literal(1),
|
|
6
6
|
baseRefName: z.string().min(1),
|
|
7
7
|
});
|
|
8
|
+
const PaseoWorktreeMetadataV2Schema = z.object({
|
|
9
|
+
version: z.literal(2),
|
|
10
|
+
baseRefName: z.string().min(1),
|
|
11
|
+
runtime: z
|
|
12
|
+
.object({
|
|
13
|
+
worktreePort: z.number().int().positive(),
|
|
14
|
+
})
|
|
15
|
+
.optional(),
|
|
16
|
+
});
|
|
17
|
+
const PaseoWorktreeMetadataSchema = z.union([
|
|
18
|
+
PaseoWorktreeMetadataV1Schema,
|
|
19
|
+
PaseoWorktreeMetadataV2Schema,
|
|
20
|
+
]);
|
|
8
21
|
function getGitDirForWorktreeRoot(worktreeRoot) {
|
|
9
22
|
const gitPath = join(worktreeRoot, ".git");
|
|
10
23
|
if (!existsSync(gitPath)) {
|
|
@@ -55,6 +68,25 @@ export function writePaseoWorktreeMetadata(worktreeRoot, options) {
|
|
|
55
68
|
const metadata = { version: 1, baseRefName };
|
|
56
69
|
writeFileSync(metadataPath, `${JSON.stringify(metadata, null, 2)}\n`, "utf8");
|
|
57
70
|
}
|
|
71
|
+
export function writePaseoWorktreeRuntimeMetadata(worktreeRoot, options) {
|
|
72
|
+
if (!Number.isInteger(options.worktreePort) || options.worktreePort <= 0) {
|
|
73
|
+
throw new Error(`Invalid worktree runtime port: ${options.worktreePort}`);
|
|
74
|
+
}
|
|
75
|
+
const current = readPaseoWorktreeMetadata(worktreeRoot);
|
|
76
|
+
if (!current) {
|
|
77
|
+
throw new Error("Cannot persist worktree runtime metadata: missing base metadata");
|
|
78
|
+
}
|
|
79
|
+
const metadataPath = getPaseoWorktreeMetadataPath(worktreeRoot);
|
|
80
|
+
mkdirSync(join(getGitDirForWorktreeRoot(worktreeRoot), "paseo"), { recursive: true });
|
|
81
|
+
const next = {
|
|
82
|
+
version: 2,
|
|
83
|
+
baseRefName: current.baseRefName,
|
|
84
|
+
runtime: {
|
|
85
|
+
worktreePort: options.worktreePort,
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
writeFileSync(metadataPath, `${JSON.stringify(next, null, 2)}\n`, "utf8");
|
|
89
|
+
}
|
|
58
90
|
export function readPaseoWorktreeMetadata(worktreeRoot) {
|
|
59
91
|
const metadataPath = getPaseoWorktreeMetadataPath(worktreeRoot);
|
|
60
92
|
if (!existsSync(metadataPath)) {
|
|
@@ -71,4 +103,14 @@ export function requirePaseoWorktreeBaseRefName(worktreeRoot) {
|
|
|
71
103
|
}
|
|
72
104
|
return metadata.baseRefName;
|
|
73
105
|
}
|
|
106
|
+
export function readPaseoWorktreeRuntimePort(worktreeRoot) {
|
|
107
|
+
const metadata = readPaseoWorktreeMetadata(worktreeRoot);
|
|
108
|
+
if (!metadata) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
if (metadata.version === 2 && metadata.runtime?.worktreePort) {
|
|
112
|
+
return metadata.runtime.worktreePort;
|
|
113
|
+
}
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
74
116
|
//# sourceMappingURL=worktree-metadata.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree-metadata.js","sourceRoot":"","sources":["../../../src/utils/worktree-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACjD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,
|
|
1
|
+
{"version":3,"file":"worktree-metadata.js","sourceRoot":"","sources":["../../../src/utils/worktree-metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,13 @@ export interface WorktreeConfig {
|
|
|
2
2
|
branchName: string;
|
|
3
3
|
worktreePath: string;
|
|
4
4
|
}
|
|
5
|
+
export type WorktreeRuntimeEnv = {
|
|
6
|
+
PASEO_SOURCE_CHECKOUT_PATH: string;
|
|
7
|
+
PASEO_ROOT_PATH: string;
|
|
8
|
+
PASEO_WORKTREE_PATH: string;
|
|
9
|
+
PASEO_BRANCH_NAME: string;
|
|
10
|
+
PASEO_WORKTREE_PORT: string;
|
|
11
|
+
};
|
|
5
12
|
export type WorktreeSetupCommandResult = {
|
|
6
13
|
command: string;
|
|
7
14
|
cwd: string;
|
|
@@ -75,8 +82,14 @@ export declare function runWorktreeSetupCommands(options: {
|
|
|
75
82
|
branchName: string;
|
|
76
83
|
cleanupOnFailure: boolean;
|
|
77
84
|
repoRootPath?: string;
|
|
85
|
+
runtimeEnv?: WorktreeRuntimeEnv;
|
|
78
86
|
onEvent?: (event: WorktreeSetupCommandProgressEvent) => void;
|
|
79
87
|
}): Promise<WorktreeSetupCommandResult[]>;
|
|
88
|
+
export declare function resolveWorktreeRuntimeEnv(options: {
|
|
89
|
+
worktreePath: string;
|
|
90
|
+
branchName?: string;
|
|
91
|
+
repoRootPath?: string;
|
|
92
|
+
}): Promise<WorktreeRuntimeEnv>;
|
|
80
93
|
export declare function runWorktreeDestroyCommands(options: {
|
|
81
94
|
worktreePath: string;
|
|
82
95
|
branchName?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../../../src/utils/worktree.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../../../src/utils/worktree.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { existsSync, mkdirSync, readFileSync, realpathSync, rmSync } from "fs";
|
|
|
4
4
|
import { join, basename, dirname, resolve, sep } from "path";
|
|
5
5
|
import net from "node:net";
|
|
6
6
|
import { createNameId } from "mnemonic-id";
|
|
7
|
-
import { normalizeBaseRefName, writePaseoWorktreeMetadata } from "./worktree-metadata.js";
|
|
7
|
+
import { normalizeBaseRefName, readPaseoWorktreeMetadata, readPaseoWorktreeRuntimePort, writePaseoWorktreeMetadata, writePaseoWorktreeRuntimeMetadata, } from "./worktree-metadata.js";
|
|
8
8
|
import { resolvePaseoHome } from "../server/paseo-home.js";
|
|
9
9
|
const execAsync = promisify(exec);
|
|
10
10
|
const READ_ONLY_GIT_ENV = {
|
|
@@ -211,6 +211,28 @@ async function getAvailablePort() {
|
|
|
211
211
|
});
|
|
212
212
|
});
|
|
213
213
|
}
|
|
214
|
+
async function assertPortAvailable(port) {
|
|
215
|
+
await new Promise((resolve, reject) => {
|
|
216
|
+
const server = net.createServer();
|
|
217
|
+
server.once("error", (error) => {
|
|
218
|
+
const message = error?.code === "EADDRINUSE"
|
|
219
|
+
? `Persisted worktree port ${port} is already in use`
|
|
220
|
+
: error instanceof Error
|
|
221
|
+
? error.message
|
|
222
|
+
: String(error);
|
|
223
|
+
reject(new Error(message));
|
|
224
|
+
});
|
|
225
|
+
server.listen(port, () => {
|
|
226
|
+
server.close((error) => {
|
|
227
|
+
if (error) {
|
|
228
|
+
reject(error);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
resolve();
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
}
|
|
214
236
|
async function inferRepoRootPathFromWorktreePath(worktreePath) {
|
|
215
237
|
try {
|
|
216
238
|
const commonDir = await getGitCommonDir(worktreePath);
|
|
@@ -243,19 +265,15 @@ export async function runWorktreeSetupCommands(options) {
|
|
|
243
265
|
if (setupCommands.length === 0) {
|
|
244
266
|
return [];
|
|
245
267
|
}
|
|
246
|
-
const
|
|
247
|
-
|
|
268
|
+
const runtimeEnv = options.runtimeEnv ??
|
|
269
|
+
(await resolveWorktreeRuntimeEnv({
|
|
270
|
+
worktreePath: options.worktreePath,
|
|
271
|
+
branchName: options.branchName,
|
|
272
|
+
...(options.repoRootPath ? { repoRootPath: options.repoRootPath } : {}),
|
|
273
|
+
}));
|
|
248
274
|
const setupEnv = {
|
|
249
275
|
...process.env,
|
|
250
|
-
|
|
251
|
-
// worktree itself. This allows setup scripts to copy local files (e.g. .env) from the
|
|
252
|
-
// source checkout.
|
|
253
|
-
PASEO_SOURCE_CHECKOUT_PATH: repoRootPath,
|
|
254
|
-
// Backward-compatible alias.
|
|
255
|
-
PASEO_ROOT_PATH: repoRootPath,
|
|
256
|
-
PASEO_WORKTREE_PATH: options.worktreePath,
|
|
257
|
-
PASEO_BRANCH_NAME: options.branchName,
|
|
258
|
-
PASEO_WORKTREE_PORT: String(worktreePort),
|
|
276
|
+
...runtimeEnv,
|
|
259
277
|
};
|
|
260
278
|
const results = [];
|
|
261
279
|
for (const [index, cmd] of setupCommands.entries()) {
|
|
@@ -305,6 +323,32 @@ async function resolveBranchNameForWorktreePath(worktreePath) {
|
|
|
305
323
|
}
|
|
306
324
|
return basename(worktreePath);
|
|
307
325
|
}
|
|
326
|
+
export async function resolveWorktreeRuntimeEnv(options) {
|
|
327
|
+
const repoRootPath = options.repoRootPath ?? (await inferRepoRootPathFromWorktreePath(options.worktreePath));
|
|
328
|
+
const branchName = options.branchName ?? (await resolveBranchNameForWorktreePath(options.worktreePath));
|
|
329
|
+
let worktreePort = readPaseoWorktreeRuntimePort(options.worktreePath);
|
|
330
|
+
if (worktreePort === null) {
|
|
331
|
+
worktreePort = await getAvailablePort();
|
|
332
|
+
const metadata = readPaseoWorktreeMetadata(options.worktreePath);
|
|
333
|
+
if (metadata) {
|
|
334
|
+
writePaseoWorktreeRuntimeMetadata(options.worktreePath, { worktreePort });
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
await assertPortAvailable(worktreePort);
|
|
339
|
+
}
|
|
340
|
+
return {
|
|
341
|
+
// Source checkout path is the original git repo root (shared across worktrees), not the
|
|
342
|
+
// worktree itself. This allows setup scripts to copy local files (e.g. .env) from the
|
|
343
|
+
// source checkout.
|
|
344
|
+
PASEO_SOURCE_CHECKOUT_PATH: repoRootPath,
|
|
345
|
+
// Backward-compatible alias.
|
|
346
|
+
PASEO_ROOT_PATH: repoRootPath,
|
|
347
|
+
PASEO_WORKTREE_PATH: options.worktreePath,
|
|
348
|
+
PASEO_BRANCH_NAME: branchName,
|
|
349
|
+
PASEO_WORKTREE_PORT: String(worktreePort),
|
|
350
|
+
};
|
|
351
|
+
}
|
|
308
352
|
export async function runWorktreeDestroyCommands(options) {
|
|
309
353
|
// Read paseo.json from the worktree (it will have the same content as the source repo)
|
|
310
354
|
const destroyCommands = getWorktreeDestroyCommands(options.worktreePath);
|