@hyperdreamer/pi-webui 1.11.2 → 1.11.4
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/README.md +3 -1
- package/dist/client/assets/{CodeViewer-BRcVinSx.js → CodeViewer-RC12gm-a.js} +1 -1
- package/dist/client/assets/{UnifiedDiffViewer-ChxwNz6T.js → UnifiedDiffViewer-BKkTUzo8.js} +1 -1
- package/dist/client/assets/{index-DG-QGbW9.js → index-6Nw3vRPS.js} +540 -477
- package/dist/client/index.html +2 -1
- package/dist/pi-webui-plugins/workspace-learned-skills/learnedSkillsData.js +2 -0
- package/dist/pi-webui-plugins/workspace-learned-skills/learnedSkillsPanelElement.js +420 -0
- package/dist/pi-webui-plugins/workspace-learned-skills/learnedSkillsPanelLayout.js +68 -0
- package/dist/pi-webui-plugins/workspace-learned-skills/package.json +9 -0
- package/dist/pi-webui-plugins/workspace-learned-skills/pi-webui-plugin.js +48 -0
- package/dist/server/app.js +39 -3
- package/dist/server/app.js.map +1 -1
- package/dist/server/learnedSkills/learnedSkillCatalog.js +66 -0
- package/dist/server/learnedSkills/learnedSkillCatalog.js.map +1 -0
- package/dist/server/learnedSkills/learnedSkillProvider.js +2 -0
- package/dist/server/learnedSkills/learnedSkillProvider.js.map +1 -0
- package/dist/server/learnedSkills/learnedSkillsRoutes.js +25 -0
- package/dist/server/learnedSkills/learnedSkillsRoutes.js.map +1 -0
- package/dist/server/learnedSkills/piHermesLearnedSkillProvider.js +123 -0
- package/dist/server/learnedSkills/piHermesLearnedSkillProvider.js.map +1 -0
- package/dist/server/learnedSkills/skillDocumentParser.js +42 -0
- package/dist/server/learnedSkills/skillDocumentParser.js.map +1 -0
- package/dist/server/memory/piHermesMemoryProvider.js +9 -7
- package/dist/server/memory/piHermesMemoryProvider.js.map +1 -1
- package/dist/server/piHermes/projectIdentity.js +103 -0
- package/dist/server/piHermes/projectIdentity.js.map +1 -0
- package/dist/server/projects/projectService.js +28 -2
- package/dist/server/projects/projectService.js.map +1 -1
- package/dist/server/realtime/sessionEventHub.js +16 -0
- package/dist/server/realtime/sessionEventHub.js.map +1 -1
- package/dist/server/realtime/slowConsumerGuard.js +75 -0
- package/dist/server/realtime/slowConsumerGuard.js.map +1 -0
- package/dist/server/sessiond/sessionProxyRoutes.js +14 -1
- package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -1
- package/dist/server/sessions/authService.js +8 -0
- package/dist/server/sessions/authService.js.map +1 -1
- package/dist/server/sessions/oauthLoginFlowService.js +16 -1
- package/dist/server/sessions/oauthLoginFlowService.js.map +1 -1
- package/dist/server/sessions/piSessionService.js +4 -3
- package/dist/server/sessions/piSessionService.js.map +1 -1
- package/dist/server/storage/projectStore.js +170 -26
- package/dist/server/storage/projectStore.js.map +1 -1
- package/dist/server/webSocketBridge.js +12 -1
- package/dist/server/webSocketBridge.js.map +1 -1
- package/dist/shared/apiTypes.d.ts +19 -0
- package/dist/shared/apiTypes.js.map +1 -1
- package/dist/shared/federatedRoutes.js +4 -0
- package/dist/shared/federatedRoutes.js.map +1 -1
- package/dist/shared/projectAncestry.js +43 -0
- package/dist/shared/projectAncestry.js.map +1 -0
- package/docs/plugins.md +24 -1
- package/package.json +10 -8
|
@@ -1,10 +1,75 @@
|
|
|
1
|
-
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
-
import { dirname, join, resolve } from "node:path";
|
|
1
|
+
import { chmod, lstat, mkdir, readFile, readlink, realpath, rename, stat, unlink, writeFile } from "node:fs/promises";
|
|
2
|
+
import { basename, dirname, isAbsolute, join, resolve, sep } from "node:path";
|
|
3
3
|
import { piWebUiDataDir } from "../../config.js";
|
|
4
4
|
import { randomUUID } from "node:crypto";
|
|
5
|
+
import { projectDescendantIds } from "../../shared/projectAncestry.js";
|
|
5
6
|
function isNodeErrorWithCode(error, code) {
|
|
6
7
|
return error instanceof Error && "code" in error && error.code === code;
|
|
7
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* A trailing separator marks a directory reference, never a file leaf.
|
|
11
|
+
* `sep` gives the native separator; `/` is additionally accepted on every
|
|
12
|
+
* platform so Windows-target paths behave like POSIX ones, while backslash
|
|
13
|
+
* stays a plain filename character on POSIX.
|
|
14
|
+
*/
|
|
15
|
+
function hasTerminalPathSeparator(candidate) {
|
|
16
|
+
return candidate.endsWith(sep) || candidate.endsWith("/");
|
|
17
|
+
}
|
|
18
|
+
async function resolveWriteTarget(filePath) {
|
|
19
|
+
try {
|
|
20
|
+
const effectivePath = await realpath(filePath);
|
|
21
|
+
const metadata = await stat(effectivePath);
|
|
22
|
+
return {
|
|
23
|
+
path: effectivePath,
|
|
24
|
+
...(process.platform === "win32" ? {} : { mode: metadata.mode & 0o777 }),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
if (!isNodeErrorWithCode(error, "ENOENT"))
|
|
29
|
+
throw error;
|
|
30
|
+
return await resolveMissingWriteTarget(filePath);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async function resolveMissingWriteTarget(filePath) {
|
|
34
|
+
let candidate = filePath;
|
|
35
|
+
const visited = new Set();
|
|
36
|
+
for (;;) {
|
|
37
|
+
let metadata;
|
|
38
|
+
try {
|
|
39
|
+
metadata = await lstat(candidate);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
if (isNodeErrorWithCode(error, "ENOENT")) {
|
|
43
|
+
if (hasTerminalPathSeparator(candidate)) {
|
|
44
|
+
const directoryTarget = Object.assign(new Error(`Project registry path must resolve to a file: ${filePath}`), {
|
|
45
|
+
code: "EISDIR",
|
|
46
|
+
syscall: "open",
|
|
47
|
+
path: filePath,
|
|
48
|
+
});
|
|
49
|
+
throw directoryTarget;
|
|
50
|
+
}
|
|
51
|
+
const physicalParent = await realpath(dirname(candidate));
|
|
52
|
+
return { path: join(physicalParent, basename(candidate)) };
|
|
53
|
+
}
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
if (!metadata.isSymbolicLink()) {
|
|
57
|
+
return {
|
|
58
|
+
path: await realpath(candidate),
|
|
59
|
+
...(process.platform === "win32" ? {} : { mode: metadata.mode & 0o777 }),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const physicalParent = await realpath(dirname(candidate));
|
|
63
|
+
const physicalCandidate = join(physicalParent, basename(candidate));
|
|
64
|
+
if (visited.has(physicalCandidate))
|
|
65
|
+
throw new Error("Cannot resolve project registry path because of a symbolic-link cycle");
|
|
66
|
+
visited.add(physicalCandidate);
|
|
67
|
+
const target = await readlink(physicalCandidate);
|
|
68
|
+
// Preserve component order until the filesystem has traversed any symlink
|
|
69
|
+
// before `..`; path.join/resolve would collapse those components too soon.
|
|
70
|
+
candidate = isAbsolute(target) ? target : `${physicalParent}${physicalParent.endsWith(sep) ? "" : sep}${target}`;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
8
73
|
function parseProjectFile(value) {
|
|
9
74
|
if (!isRecord(value) || !Array.isArray(value["projects"]))
|
|
10
75
|
throw new Error("Invalid project file");
|
|
@@ -17,9 +82,12 @@ function parseProject(value) {
|
|
|
17
82
|
const name = value["name"];
|
|
18
83
|
const path = value["path"];
|
|
19
84
|
const createdAt = value["createdAt"];
|
|
85
|
+
const pinned = value["pinned"];
|
|
20
86
|
if (typeof id !== "string" || typeof name !== "string" || typeof path !== "string" || typeof createdAt !== "string")
|
|
21
87
|
throw new Error("Invalid project");
|
|
22
|
-
|
|
88
|
+
if (pinned !== undefined && typeof pinned !== "boolean")
|
|
89
|
+
throw new Error("Invalid project");
|
|
90
|
+
return { id, name, path, createdAt, ...(pinned === true ? { pinned: true } : {}) };
|
|
23
91
|
}
|
|
24
92
|
function isRecord(value) {
|
|
25
93
|
return typeof value === "object" && value !== null;
|
|
@@ -36,38 +104,83 @@ export function projectStorePath(env = process.env, cwd = process.cwd()) {
|
|
|
36
104
|
export class ProjectStore {
|
|
37
105
|
constructor(filePath = projectStorePath()) {
|
|
38
106
|
this.filePath = filePath;
|
|
107
|
+
this.operationQueue = Promise.resolve();
|
|
39
108
|
}
|
|
40
109
|
async list() {
|
|
41
110
|
return (await this.read()).projects;
|
|
42
111
|
}
|
|
43
112
|
async add(input) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
113
|
+
return await this.exclusive(async () => {
|
|
114
|
+
const data = await this.read();
|
|
115
|
+
const path = input.path;
|
|
116
|
+
const existing = data.projects.find((p) => p.path === path);
|
|
117
|
+
if (existing)
|
|
118
|
+
return existing;
|
|
119
|
+
const trimmedName = input.name?.trim();
|
|
120
|
+
const leafName = path.split("/").filter((part) => part !== "").at(-1);
|
|
121
|
+
const project = {
|
|
122
|
+
id: randomUUID(),
|
|
123
|
+
name: trimmedName !== undefined && trimmedName !== "" ? trimmedName : leafName ?? path,
|
|
124
|
+
path,
|
|
125
|
+
createdAt: new Date().toISOString(),
|
|
126
|
+
};
|
|
127
|
+
data.projects.push(project);
|
|
128
|
+
await this.write(data);
|
|
129
|
+
return project;
|
|
130
|
+
});
|
|
60
131
|
}
|
|
61
132
|
async get(id) {
|
|
62
133
|
return (await this.list()).find((p) => p.id === id);
|
|
63
134
|
}
|
|
64
135
|
async remove(id) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
136
|
+
return await this.exclusive(async () => {
|
|
137
|
+
const data = await this.read();
|
|
138
|
+
const projects = data.projects.filter((p) => p.id !== id);
|
|
139
|
+
if (projects.length === data.projects.length)
|
|
140
|
+
return false;
|
|
141
|
+
await this.write({ projects });
|
|
142
|
+
return true;
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Remove a project together with every registered descendant in a single
|
|
147
|
+
* write. The snapshot is read, the removal set computed, and the result
|
|
148
|
+
* written inside one exclusive turn, so a concurrent add or pin cannot make
|
|
149
|
+
* the removal set stale or lose an update.
|
|
150
|
+
*/
|
|
151
|
+
async removeTree(id) {
|
|
152
|
+
return await this.exclusive(async () => {
|
|
153
|
+
const data = await this.read();
|
|
154
|
+
if (!data.projects.some((project) => project.id === id))
|
|
155
|
+
return undefined;
|
|
156
|
+
const removedIds = [id, ...projectDescendantIds(data.projects, id)];
|
|
157
|
+
const removedIdSet = new Set(removedIds);
|
|
158
|
+
await this.write({ projects: data.projects.filter((project) => !removedIdSet.has(project.id)) });
|
|
159
|
+
return removedIds;
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Set pin state and move the project to the front of the list in one write.
|
|
164
|
+
* Front-of-array placement is what makes a pinned or unpinned project appear
|
|
165
|
+
* at the top of its display group, so ordering needs no separate order field.
|
|
166
|
+
*/
|
|
167
|
+
async setPinned(id, pinned) {
|
|
168
|
+
return await this.exclusive(async () => {
|
|
169
|
+
const data = await this.read();
|
|
170
|
+
const target = data.projects.find((p) => p.id === id);
|
|
171
|
+
if (target === undefined)
|
|
172
|
+
return undefined;
|
|
173
|
+
const updated = {
|
|
174
|
+
id: target.id,
|
|
175
|
+
name: target.name,
|
|
176
|
+
path: target.path,
|
|
177
|
+
createdAt: target.createdAt,
|
|
178
|
+
...(pinned ? { pinned: true } : {}),
|
|
179
|
+
};
|
|
180
|
+
const projects = [updated, ...data.projects.filter((p) => p.id !== id)];
|
|
181
|
+
await this.write({ projects });
|
|
182
|
+
return projects;
|
|
183
|
+
});
|
|
71
184
|
}
|
|
72
185
|
async read() {
|
|
73
186
|
try {
|
|
@@ -80,9 +193,40 @@ export class ProjectStore {
|
|
|
80
193
|
throw error;
|
|
81
194
|
}
|
|
82
195
|
}
|
|
196
|
+
async exclusive(operation) {
|
|
197
|
+
const previous = this.operationQueue;
|
|
198
|
+
let release = () => undefined;
|
|
199
|
+
this.operationQueue = new Promise((resolve) => { release = resolve; });
|
|
200
|
+
await previous.catch(() => undefined);
|
|
201
|
+
try {
|
|
202
|
+
return await operation();
|
|
203
|
+
}
|
|
204
|
+
finally {
|
|
205
|
+
release();
|
|
206
|
+
}
|
|
207
|
+
}
|
|
83
208
|
async write(data) {
|
|
84
209
|
await mkdir(dirname(this.filePath), { recursive: true });
|
|
85
|
-
await
|
|
210
|
+
const target = await resolveWriteTarget(this.filePath);
|
|
211
|
+
// Keep the temp file beside the effective target so rename is atomic even
|
|
212
|
+
// when the configured path is a symlink. The `exclusive` queue remains
|
|
213
|
+
// necessary because it prevents lost updates rather than torn files.
|
|
214
|
+
const tempPath = join(dirname(target.path), `.${basename(target.path)}.${String(process.pid)}.${Date.now().toString()}.${randomUUID()}.tmp`);
|
|
215
|
+
try {
|
|
216
|
+
const content = `${JSON.stringify(data, null, 2)}\n`;
|
|
217
|
+
if (target.mode === undefined) {
|
|
218
|
+
await writeFile(tempPath, content, "utf8");
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
await writeFile(tempPath, content, { encoding: "utf8", mode: target.mode });
|
|
222
|
+
await chmod(tempPath, target.mode);
|
|
223
|
+
}
|
|
224
|
+
await rename(tempPath, target.path);
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
await unlink(tempPath).catch(() => undefined);
|
|
228
|
+
throw error;
|
|
229
|
+
}
|
|
86
230
|
}
|
|
87
231
|
}
|
|
88
232
|
//# sourceMappingURL=projectStore.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectStore.js","sourceRoot":"","sources":["../../../src/server/storage/projectStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"projectStore.js","sourceRoot":"","sources":["../../../src/server/storage/projectStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
import { WebSocket } from "ws";
|
|
2
|
+
import { SlowConsumerGuard } from "./realtime/slowConsumerGuard.js";
|
|
2
3
|
export function bridgeSockets(client, upstream) {
|
|
4
|
+
// Guard only the browser-facing socket: upstream output is high-volume and
|
|
5
|
+
// order-sensitive, so a client that stops reading must not be allowed to
|
|
6
|
+
// grow an unbounded event queue. The guard terminates only when the depth
|
|
7
|
+
// stays past the soft limit without draining.
|
|
8
|
+
const guard = new SlowConsumerGuard(client);
|
|
3
9
|
const sendToClient = createBufferedSender(client);
|
|
4
10
|
const sendToUpstream = createBufferedSender(upstream);
|
|
5
11
|
client.on("message", (data) => { sendToUpstream(data); });
|
|
6
|
-
upstream.on("message", (data) => {
|
|
12
|
+
upstream.on("message", (data) => {
|
|
13
|
+
sendToClient(data);
|
|
14
|
+
if (guard.afterSend()) {
|
|
15
|
+
upstream.close();
|
|
16
|
+
}
|
|
17
|
+
});
|
|
7
18
|
client.on("close", () => { upstream.close(); });
|
|
8
19
|
upstream.on("close", () => { client.close(); });
|
|
9
20
|
upstream.on("error", () => { client.close(); });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webSocketBridge.js","sourceRoot":"","sources":["../../src/server/webSocketBridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"webSocketBridge.js","sourceRoot":"","sources":["../../src/server/webSocketBridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,MAAM,IAAI,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEpE,MAAM,UAAU,aAAa,CAAC,MAAiB,EAAE,QAAmB;IAClE,2EAA2E;IAC3E,yEAAyE;IACzE,0EAA0E;IAC1E,8CAA8C;IAC9C,MAAM,KAAK,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACtD,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;QAC9B,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,IAAI,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC;YACtB,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,OAAO,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO;YAC/B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IACF,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACzB,OAAO,CAAC,IAAI,EAAE,EAAE;QACd,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO;QACT,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -422,6 +422,8 @@ export interface Project {
|
|
|
422
422
|
name: string;
|
|
423
423
|
path: string;
|
|
424
424
|
createdAt: string;
|
|
425
|
+
/** True when the user has pinned this project so it sorts above unpinned projects. */
|
|
426
|
+
pinned?: boolean;
|
|
425
427
|
}
|
|
426
428
|
export interface ProjectUsageTotals {
|
|
427
429
|
input: number;
|
|
@@ -1453,6 +1455,23 @@ export type MemorySnapshotResponse = {
|
|
|
1453
1455
|
export interface MemoryEntriesResponse {
|
|
1454
1456
|
entries: MemoryEntry[];
|
|
1455
1457
|
}
|
|
1458
|
+
export interface LearnedSkill {
|
|
1459
|
+
id: string;
|
|
1460
|
+
name: string;
|
|
1461
|
+
description: string;
|
|
1462
|
+
filePath: string;
|
|
1463
|
+
version?: number;
|
|
1464
|
+
created?: string;
|
|
1465
|
+
updated?: string;
|
|
1466
|
+
}
|
|
1467
|
+
export type LearnedSkillsSnapshotResponse = {
|
|
1468
|
+
kind: "unavailable";
|
|
1469
|
+
} | {
|
|
1470
|
+
kind: "data";
|
|
1471
|
+
globalSkills: LearnedSkill[];
|
|
1472
|
+
projectSkills: LearnedSkill[];
|
|
1473
|
+
projectUnavailableMessage?: string;
|
|
1474
|
+
};
|
|
1456
1475
|
export interface SystemInfoResponse {
|
|
1457
1476
|
generatedAt: string;
|
|
1458
1477
|
os: SystemOsInfo;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiTypes.js","sourceRoot":"","sources":["../../src/shared/apiTypes.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,sBAAsB,EAAE,yBAAyB;IACjD,qBAAqB,EAAE,wBAAwB;IAC/C,eAAe,EAAE,kBAAkB;IACnC,cAAc,EAAE,iBAAiB;IACjC,kBAAkB,EAAE,qBAAqB;IACzC,sBAAsB,EAAE,yBAAyB;IACjD,oBAAoB,EAAE,uBAAuB;IAC7C,sBAAsB,EAAE,yBAAyB;IACjD,qBAAqB,EAAE,wBAAwB;IAC/C,cAAc,EAAE,iBAAiB;IACjC,iBAAiB,EAAE,oBAAoB;IACvC,wBAAwB,EAAE,2BAA2B;IACrD,gBAAgB,EAAE,mBAAmB;IACrC,uBAAuB,EAAE,0BAA0B;IACnD,kBAAkB,EAAE,uBAAuB;IAC3C,iBAAiB,EAAE,qBAAqB;IACxC,oBAAoB,EAAE,wBAAwB;IAC9C,mBAAmB,EAAE,sBAAsB;IAC3C,2BAA2B,EAAE,8BAA8B;IAC3D,mCAAmC,EAAE,sCAAsC;IAC3E,eAAe,EAAE,kBAAkB;IACnC,sBAAsB,EAAE,yBAAyB;CACzC,CAAC;AAsDX,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,CAAU,CAAC;AAQvG,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,aAAa,EAAE,SAAS,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"apiTypes.js","sourceRoot":"","sources":["../../src/shared/apiTypes.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,sBAAsB,EAAE,yBAAyB;IACjD,qBAAqB,EAAE,wBAAwB;IAC/C,eAAe,EAAE,kBAAkB;IACnC,cAAc,EAAE,iBAAiB;IACjC,kBAAkB,EAAE,qBAAqB;IACzC,sBAAsB,EAAE,yBAAyB;IACjD,oBAAoB,EAAE,uBAAuB;IAC7C,sBAAsB,EAAE,yBAAyB;IACjD,qBAAqB,EAAE,wBAAwB;IAC/C,cAAc,EAAE,iBAAiB;IACjC,iBAAiB,EAAE,oBAAoB;IACvC,wBAAwB,EAAE,2BAA2B;IACrD,gBAAgB,EAAE,mBAAmB;IACrC,uBAAuB,EAAE,0BAA0B;IACnD,kBAAkB,EAAE,uBAAuB;IAC3C,iBAAiB,EAAE,qBAAqB;IACxC,oBAAoB,EAAE,wBAAwB;IAC9C,mBAAmB,EAAE,sBAAsB;IAC3C,2BAA2B,EAAE,8BAA8B;IAC3D,mCAAmC,EAAE,sCAAsC;IAC3E,eAAe,EAAE,kBAAkB;IACnC,sBAAsB,EAAE,yBAAyB;CACzC,CAAC;AAsDX,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,CAAU,CAAC;AAQvG,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,aAAa,EAAE,SAAS,CAAU,CAAC;AAkevE,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAC3C,MAAM,CAAC,MAAM,qCAAqC,GAAG,GAAG,CAAC;AACzD,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,GAAG,IAAI,CAAC;AACxD,MAAM,CAAC,MAAM,sCAAsC,GAAG,EAAE,GAAG,IAAI,CAAC;AAkBhE,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAC1C,MAAM,CAAC,MAAM,oCAAoC,GAAG,GAAG,CAAC;AACxD,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,GAAG,IAAI,CAAC;AACvD,MAAM,CAAC,MAAM,oCAAoC,GAAG,GAAG,CAAC;AACxD,MAAM,CAAC,MAAM,sCAAsC,GAAG,EAAE,CAAC;AAqCzD,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAC9C,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC,GAAG,IAAI,CAAC;AAiwB3D,MAAM,CAAC,MAAM,2CAA2C,GAAG,MAAM,CAAC"}
|
|
@@ -19,6 +19,7 @@ export const FEDERATED_HTTP_ROUTES = [
|
|
|
19
19
|
{ method: "GET", path: "/utility-models" },
|
|
20
20
|
{ method: "PUT", path: "/utility-models" },
|
|
21
21
|
{ method: "GET", path: "/agent-memory/snapshot" },
|
|
22
|
+
{ method: "GET", path: "/agent-skills/snapshot" },
|
|
22
23
|
{ method: "GET", path: "/skills" },
|
|
23
24
|
{ method: "PATCH", path: "/skills" },
|
|
24
25
|
{ method: "POST", path: "/skills/search", timeoutMs: SKILLS_OPERATION_PROXY_TIMEOUT_MS },
|
|
@@ -35,6 +36,9 @@ export const FEDERATED_HTTP_ROUTES = [
|
|
|
35
36
|
{ method: "GET", path: "/projects" },
|
|
36
37
|
{ method: "POST", path: "/projects" },
|
|
37
38
|
{ method: "DELETE", path: "/projects/:projectId" },
|
|
39
|
+
{ method: "POST", path: "/projects/:projectId/pin" },
|
|
40
|
+
{ method: "POST", path: "/projects/:projectId/unpin" },
|
|
41
|
+
{ method: "POST", path: "/projects/:projectId/close-tree" },
|
|
38
42
|
{ method: "GET", path: "/project-directories" },
|
|
39
43
|
{ method: "GET", path: "/projects/:projectId/workspaces" },
|
|
40
44
|
{ method: "DELETE", path: "/projects/:projectId/workspaces/:workspaceId" },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"federatedRoutes.js","sourceRoot":"","sources":["../../src/shared/federatedRoutes.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"federatedRoutes.js","sourceRoot":"","sources":["../../src/shared/federatedRoutes.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oCAAoC,GAAG,CAAC,GAAG,MAAM,CAAC;AAC/D,MAAM,CAAC,MAAM,6CAA6C,GAAG,CAAC,GAAG,MAAM,CAAC;AACxE,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAC,GAAG,MAAM,CAAC;AAC5D,MAAM,CAAC,MAAM,wCAAwC,GAAG,CAAC,GAAG,MAAM,CAAC;AAQnE,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE;IAC3C,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,uBAAuB,EAAE;IAChD,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,0BAA0B,EAAE;IACnD,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE;IAClC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE;IAClC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE;IACzC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE;IACzC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE;IAC/C,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB,EAAE;IACnD,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,mBAAmB,EAAE;IAC5C,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,mBAAmB,EAAE;IAC5C,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE;IACvC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE;IACvC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE;IAC1C,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE;IAC1C,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,wBAAwB,EAAE;IACjD,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,wBAAwB,EAAE;IACjD,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE;IAClC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;IACpC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,iCAAiC,EAAE;IACxF,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,iCAAiC,EAAE;IACzF,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,iCAAiC,EAAE;IACvF,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,iCAAiC,EAAE;IACxF,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE;IACnC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE;IAC3C,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,SAAS,EAAE,6CAA6C,EAAE;IACtG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE;IACvC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,EAAE,SAAS,EAAE,oCAAoC,EAAE;IACjG,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,SAAS,EAAE,oCAAoC,EAAE;IAChG,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,SAAS,EAAE,oCAAoC,EAAE;IAChG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE;IACpC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE;IACrC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,sBAAsB,EAAE;IAClD,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,EAAE;IACpD,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE;IACtD,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,iCAAiC,EAAE;IAC3D,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,sBAAsB,EAAE;IAC/C,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,iCAAiC,EAAE;IAC1D,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,8CAA8C,EAAE;IAC1E,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,mDAAmD,EAAE;IAC5E,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,mDAAmD,EAAE;IAC5E,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,mDAAmD,EAAE;IAC5E,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,mDAAmD,EAAE;IAC/E,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,wDAAwD,EAAE;IAClF,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,2DAA2D,EAAE;IACpF,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,oDAAoD,EAAE;IAC7E,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,yDAAyD,EAAE;IAClF,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,uDAAuD,EAAE;IAChF,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,wDAAwD,EAAE;IACjF,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,wDAAwD,EAAE;IAClF,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,wDAAwD,EAAE;IACpF,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,6EAA6E,EAAE;IACvG,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,oEAAoE,EAAE;IAChG,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,oEAAoE,EAAE;IAC9F,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,wBAAwB,EAAE;IACjD,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,+BAA+B,EAAE;IACxD,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,sCAAsC,EAAE;IAChE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE;IACjC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE;IACpC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE;IACpC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE;IACrC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE;IAC3C,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,yBAAyB,EAAE;IAClD,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,EAAE;IACrD,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE;IAC7C,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,EAAE;IAClD,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,gCAAgC,EAAE;IAC1D,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,6BAA6B,EAAE;IACtD,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,+BAA+B,EAAE;IACxD,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,oCAAoC,EAAE;IAC7D,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,4CAA4C,EAAE;IACtE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,gDAAgD,EAAE;IAC1E,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,yCAAyC,EAAE;IACnE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,6BAA6B,EAAE;IACtD,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,oCAAoC,EAAE;IAC7D,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,sCAAsC,EAAE;IAC/D,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,6BAA6B,EAAE;IACtD,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,mCAAmC,EAAE;IAC5D,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,mCAAmC,EAAE;IAC5D,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,4CAA4C,EAAE;IACtE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE;IACtD,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,kCAAkC,EAAE;IAC5D,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,sCAAsC,EAAE;IAC/D,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,qCAAqC,EAAE;IAC/D,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,2CAA2C,EAAE;IACrE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,+BAA+B,EAAE;IACxD,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,6BAA6B,EAAE;IACvD,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,kCAAkC,EAAE;IAC5D,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,uCAAuC,EAAE;IACjE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,kCAAkC,EAAE;IAC5D,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE;IACtD,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,mCAAmC,EAAE;IAC7D,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,uCAAuC,EAAE;IACjE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,oCAAoC,EAAE,SAAS,EAAE,wCAAwC,EAAE;IACnH,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,8CAA8C,EAAE,SAAS,EAAE,wCAAwC,EAAE;IAC7H,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,oCAAoC,EAAE,SAAS,EAAE,wCAAwC,EAAE;IACnH,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE;IACtD,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,EAAE;IACrD,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,8BAA8B,EAAE;IACxD,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,mCAAmC,EAAE;IAC7D,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,8BAA8B,EAAE;IACxD,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,sBAAsB,EAAE;IAClD,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,6BAA6B,EAAE;IACvD,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,8BAA8B,EAAE;IACxD,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,oCAAoC,EAAE;IAC9D,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE;IAC1C,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE;IACzC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,EAAE;IACrD,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE;IACxC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE;IACvC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE;IAC9C,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,6BAA6B,EAAE;IACvD,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE;CACF,CAAC;AAEvD,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,SAAS;IACT,kBAAkB;IAClB,6BAA6B;IAC7B,2EAA2E;CACvC,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
function isSeparator(character) {
|
|
2
|
+
return character === "/" || character === "\\";
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Strip one trailing separator so `/work/` and `/work` compare equal. A bare
|
|
6
|
+
* root normalizes to `""`, which makes the separator-boundary check below work
|
|
7
|
+
* for `/work` and `C:\work` without special-casing roots.
|
|
8
|
+
*/
|
|
9
|
+
function normalizeForComparison(path) {
|
|
10
|
+
if (path.length > 0 && isSeparator(path.at(-1)))
|
|
11
|
+
return path.slice(0, -1);
|
|
12
|
+
return path;
|
|
13
|
+
}
|
|
14
|
+
/** True when `parentPath` is a strict directory ancestor of `childPath`. Case-sensitive by design. */
|
|
15
|
+
export function isDirectoryAncestor(parentPath, childPath) {
|
|
16
|
+
// Checked before normalization: a bare root legitimately normalizes to "",
|
|
17
|
+
// so guarding afterwards would reject `/` and `C:\`. A blank path carries no
|
|
18
|
+
// directory at all, and treating it as an ancestor would make it adopt every
|
|
19
|
+
// absolute path — including in the server's atomic removal set.
|
|
20
|
+
if (parentPath.trim() === "" || childPath.trim() === "")
|
|
21
|
+
return false;
|
|
22
|
+
const parent = normalizeForComparison(parentPath);
|
|
23
|
+
const child = normalizeForComparison(childPath);
|
|
24
|
+
if (parent === child)
|
|
25
|
+
return false;
|
|
26
|
+
if (!child.startsWith(parent))
|
|
27
|
+
return false;
|
|
28
|
+
return isSeparator(child[parent.length]);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Every descendant of `targetId` at any depth. Ancestry is transitive, so a
|
|
32
|
+
* single pass over strict ancestors finds deep descendants without walking a
|
|
33
|
+
* parent map.
|
|
34
|
+
*/
|
|
35
|
+
export function projectDescendantIds(projects, targetId) {
|
|
36
|
+
const target = projects.find((project) => project.id === targetId);
|
|
37
|
+
if (target === undefined)
|
|
38
|
+
return [];
|
|
39
|
+
return projects
|
|
40
|
+
.filter((project) => project.id !== targetId && isDirectoryAncestor(target.path, project.path))
|
|
41
|
+
.map((project) => project.id);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=projectAncestry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectAncestry.js","sourceRoot":"","sources":["../../src/shared/projectAncestry.ts"],"names":[],"mappings":"AAKA,SAAS,WAAW,CAAC,SAA6B;IAChD,OAAO,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,IAAI,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,SAAS,sBAAsB,CAAC,IAAY;IAC1C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,mBAAmB,CAAC,UAAkB,EAAE,SAAiB;IACvE,2EAA2E;IAC3E,6EAA6E;IAC7E,6EAA6E;IAC7E,gEAAgE;IAChE,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IACtE,MAAM,MAAM,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAChD,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAmC,EACnC,QAAgB;IAEhB,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;IACnE,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACpC,OAAO,QAAQ;SACZ,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,QAAQ,IAAI,mBAAmB,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;SAC9F,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAClC,CAAC"}
|
package/docs/plugins.md
CHANGED
|
@@ -28,6 +28,10 @@ When machine federation is enabled, **Settings → Pi packages** targets the cur
|
|
|
28
28
|
|
|
29
29
|
Use **Settings → PI WEBUI plugins** to enable or disable discovered PI WEBUI browser plugins before the browser imports them. In a federated setup, this plugin enablement surface targets the currently selected machine and labels where changes are saved. If an older or unavailable remote PI WEBUI server does not advertise selected-machine settings support, PI WEBUI reports the plugin settings as unsupported or unavailable instead of silently falling back to the gateway. After installing, removing, or updating a Pi package, type `/reload` in each idle PI WEBUI session on the target machine to refresh Pi runtime resources such as extensions, skills, prompt templates, themes, and context/system prompt files as supported by Pi. Reload the browser page separately for newly discovered or changed PI WEBUI browser plugins. A routine session daemon restart is not required.
|
|
30
30
|
|
|
31
|
+
## Theme tokens
|
|
32
|
+
|
|
33
|
+
Theme contributions may omit `--pi-hierarchy-border` for compatibility with legacy custom themes. When present, this optional token controls the hierarchy frames and guide rails around nested session and project rows. If it is missing or empty, PI WEBUI falls back to that theme's non-empty `--pi-border`; an explicit non-empty `--pi-hierarchy-border` value takes precedence.
|
|
34
|
+
|
|
31
35
|
## Trust model
|
|
32
36
|
|
|
33
37
|
Plugins run as JavaScript in the browser app. Treat them as trusted code:
|
|
@@ -207,7 +211,7 @@ Built-in plugins can be managed from **Settings → PI WEBUI plugins** or with t
|
|
|
207
211
|
**Plugin id:** `workspace-memory`
|
|
208
212
|
**What it does:** adds a read-only **Memory** Activity Rail activity. It is **Rail-only**: it does not contribute a workspace panel. It reads `pi-hermes-memory`-compatible data through PI WEBUI and never writes, creates, edits, or deletes memories.
|
|
209
213
|
|
|
210
|
-
Select the circular **Memory** Rail control to open a host-owned detail dialog. The dialog shows independently collapsible **Global memory** and **Project-specific memory** groups. Project-specific memory contains entries only for the selected workspace project. Empty or missing memory data appears as a scoped empty state. An unavailable project-specific request displays a scoped **Project-specific unavailable** state while **Global memory** remains available. A failed global-memory request is presented as a retryable error in the detail view.
|
|
214
|
+
Select the circular **Memory** Rail control to open a host-owned detail dialog. The dialog shows independently collapsible **Global memory** and **Project-specific memory** groups. Project-specific memory contains entries only for the selected workspace project. Project scope resolves by repository root, so linked Git worktrees share the repository-root hermes identity instead of being treated as separate projects. Empty or missing memory data appears as a scoped empty state. An unavailable project-specific request displays a scoped **Project-specific unavailable** state while **Global memory** remains available. A failed global-memory request is presented as a retryable error in the detail view.
|
|
211
215
|
|
|
212
216
|
With a workspace selected, the Memory activity remains visible while memory loads, when data is available, and if a memory request fails. It is hidden only after the provider confirms that the whole memory capability is unavailable. A project-specific unavailable response is a separate scoped detail state; it does not mean the whole provider is unavailable. The count badge appears only for data with one or more entries, so it is omitted in all non-data states and for zero data; when shown, it totals global and project-specific memory entries. PI WEBUI refreshes the badge immediately after a selected project or workspace change and then checks approximately every 30 seconds. This is polling; PI WEBUI does not promise instant or realtime updates.
|
|
213
217
|
|
|
@@ -221,6 +225,25 @@ Memory is bundled with PI WEBUI and enabled by default. To disable it, use **Set
|
|
|
221
225
|
}
|
|
222
226
|
```
|
|
223
227
|
|
|
228
|
+
### Learned Skills
|
|
229
|
+
|
|
230
|
+
**Plugin id:** `workspace-learned-skills`
|
|
231
|
+
**What it does:** adds a read-only **Learned Skills** Activity Rail activity. It is **Rail-only**: it does not contribute a workspace panel. It reviews global and project learned skills generated by compatible Pi packages through PI WEBUI and cannot add, edit, delete, install, update, enable, or disable skills.
|
|
232
|
+
|
|
233
|
+
Select the circular **Learned Skills** Rail control to open a host-owned detail dialog with a resizable list/detail view. The list groups **Project skills** and **Global skills**; selecting a skill shows its description, file path, version, and dates in the right-hand pane. Drag the separator between the list and the details to resize the list, or use the separator's arrow, Home, and End keys. Below 760px width the panel switches to single-column list/detail navigation with a back control.
|
|
234
|
+
|
|
235
|
+
The Learned Skills Rail control appears while a compatible provider loads, when data is available, and if a request fails. It is hidden only after every learned-skill provider reports the capability unavailable. The count badge appears only when data has one or more skills; when shown, it totals project and global skills. PI WEBUI refreshes the list immediately after a selected workspace or machine change and then checks approximately every 30 seconds. This is polling; PI WEBUI does not promise instant or realtime updates. After polling stops because every provider is unavailable, a later skill install or change is detected only after a browser reload.
|
|
236
|
+
|
|
237
|
+
Learned Skills is bundled with PI WEBUI and enabled by default. To disable it, use **Settings → PI WEBUI plugins** or set:
|
|
238
|
+
|
|
239
|
+
```json
|
|
240
|
+
{
|
|
241
|
+
"plugins": {
|
|
242
|
+
"workspace-learned-skills": { "enabled": false }
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
```
|
|
246
|
+
|
|
224
247
|
### Updates
|
|
225
248
|
|
|
226
249
|
**Plugin id:** `updates`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hyperdreamer/pi-webui",
|
|
3
|
-
"version": "1.11.
|
|
3
|
+
"version": "1.11.4",
|
|
4
4
|
"description": "Web UI for persistent Pi Coding Agent sessions in real workspaces.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Federico Jaramillo Martinez and HyperDreamer",
|
|
@@ -41,7 +41,9 @@
|
|
|
41
41
|
"knip": "knip",
|
|
42
42
|
"lint": "eslint --no-error-on-unmatched-pattern \"src/**/*.ts\" \"extensions/**/*.ts\" \"pi-webui-plugins/**/*.ts\" \"optional-skills/**/*.mjs\" vite.config.ts vitest.config.ts",
|
|
43
43
|
"test": "vitest run --config vitest.config.ts",
|
|
44
|
-
"
|
|
44
|
+
"test:fast": "vitest run --config vitest.config.ts --maxWorkers=4",
|
|
45
|
+
"test:serial": "vitest run --config vitest.config.ts --maxWorkers=1",
|
|
46
|
+
"verify": "npm run typecheck && npm run lint && npm run knip && npm run test:serial",
|
|
45
47
|
"verify:staged": "node scripts/verify-staged.mjs",
|
|
46
48
|
"start": "tsx src/server/index.ts",
|
|
47
49
|
"start:sessiond": "tsx src/server/sessiond.ts",
|
|
@@ -84,9 +86,9 @@
|
|
|
84
86
|
},
|
|
85
87
|
"devDependencies": {
|
|
86
88
|
"@changesets/cli": "^2.31.0",
|
|
87
|
-
"@earendil-works/pi-agent-core": "^0.
|
|
88
|
-
"@earendil-works/pi-ai": "^0.
|
|
89
|
-
"@earendil-works/pi-coding-agent": "^0.
|
|
89
|
+
"@earendil-works/pi-agent-core": "^0.84.0",
|
|
90
|
+
"@earendil-works/pi-ai": "^0.84.0",
|
|
91
|
+
"@earendil-works/pi-coding-agent": "^0.84.0",
|
|
90
92
|
"@eslint/js": "^10.0.1",
|
|
91
93
|
"@types/node": "^24.13.3",
|
|
92
94
|
"@types/ws": "^8.18.1",
|
|
@@ -116,9 +118,9 @@
|
|
|
116
118
|
"homepage": "https://pi-webui.dev/",
|
|
117
119
|
"packageManager": "npm@11.11.0",
|
|
118
120
|
"peerDependencies": {
|
|
119
|
-
"@earendil-works/pi-agent-core": ">=0.
|
|
120
|
-
"@earendil-works/pi-ai": ">=0.
|
|
121
|
-
"@earendil-works/pi-coding-agent": ">=0.
|
|
121
|
+
"@earendil-works/pi-agent-core": ">=0.84.0 <0.85",
|
|
122
|
+
"@earendil-works/pi-ai": ">=0.84.0 <0.85",
|
|
123
|
+
"@earendil-works/pi-coding-agent": ">=0.84.0 <0.85"
|
|
122
124
|
},
|
|
123
125
|
"keywords": [
|
|
124
126
|
"pi-package",
|