@chainingintention/pi-web-cn 1.202608.5 → 1.202608.7

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 (74) hide show
  1. package/dist/cli.js +8 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/client/assets/{CodeViewer-BUT2Idcq.js → CodeViewer-CWKEeX0r.js} +1 -1
  4. package/dist/client/assets/{TerminalPanel-b8CZY7en.js → TerminalPanel-BmA7Ayzk.js} +1 -1
  5. package/dist/client/assets/{UnifiedDiffViewer-CXY7AXrD.js → UnifiedDiffViewer-2DACwxFY.js} +1 -1
  6. package/dist/client/assets/{index-80SI7dCz.js → index-D6j67Izj.js} +491 -300
  7. package/dist/client/index.html +1 -1
  8. package/dist/config.js +86 -0
  9. package/dist/config.js.map +1 -1
  10. package/dist/pi-web-plugins/relays/relaysPanelElement.js +112 -46
  11. package/dist/server/app.js +4 -1
  12. package/dist/server/app.js.map +1 -1
  13. package/dist/server/audit/managementAuditStore.js +211 -0
  14. package/dist/server/audit/managementAuditStore.js.map +1 -0
  15. package/dist/server/audit/normalToolAuditCli.js +143 -0
  16. package/dist/server/audit/normalToolAuditCli.js.map +1 -0
  17. package/dist/server/audit/normalToolAuditStore.js +264 -0
  18. package/dist/server/audit/normalToolAuditStore.js.map +1 -0
  19. package/dist/server/managementEmbed.js +19 -1
  20. package/dist/server/managementEmbed.js.map +1 -1
  21. package/dist/server/piWebStatus.js +7 -1
  22. package/dist/server/piWebStatus.js.map +1 -1
  23. package/dist/server/requestLogging.js +10 -7
  24. package/dist/server/requestLogging.js.map +1 -1
  25. package/dist/server/sessiond/sessionProxyRoutes.js +13 -7
  26. package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -1
  27. package/dist/server/sessiond/sessionServiceDependencies.js +1 -0
  28. package/dist/server/sessiond/sessionServiceDependencies.js.map +1 -1
  29. package/dist/server/sessiond.js +91 -4
  30. package/dist/server/sessiond.js.map +1 -1
  31. package/dist/server/sessions/extensionDialogWaiters.js +76 -0
  32. package/dist/server/sessions/extensionDialogWaiters.js.map +1 -0
  33. package/dist/server/sessions/managementPermissionSystem.js +8 -8
  34. package/dist/server/sessions/managementPermissionSystem.js.map +1 -1
  35. package/dist/server/sessions/pendingExtensionDialogStore.js +196 -0
  36. package/dist/server/sessions/pendingExtensionDialogStore.js.map +1 -0
  37. package/dist/server/sessions/piSessionService.js +493 -78
  38. package/dist/server/sessions/piSessionService.js.map +1 -1
  39. package/dist/server/sessions/sessionRoutes.js +54 -27
  40. package/dist/server/sessions/sessionRoutes.js.map +1 -1
  41. package/dist/server/sessions/sessionUiEvents.js +9 -2
  42. package/dist/server/sessions/sessionUiEvents.js.map +1 -1
  43. package/dist/server/sessions/spawnSessionTool.js +8 -1
  44. package/dist/server/sessions/spawnSessionTool.js.map +1 -1
  45. package/dist/server/sessions/spawnSubsessionTool.js +7 -1
  46. package/dist/server/sessions/spawnSubsessionTool.js.map +1 -1
  47. package/dist/server/workbench/accessStateRoutes.js +30 -0
  48. package/dist/server/workbench/accessStateRoutes.js.map +1 -0
  49. package/dist/server/workbench/accessStateStore.js +29 -0
  50. package/dist/server/workbench/accessStateStore.js.map +1 -0
  51. package/dist/server/workbench/capabilitySearch.js +62 -0
  52. package/dist/server/workbench/capabilitySearch.js.map +1 -0
  53. package/dist/server/workbench/gatewayIntegration.js +56 -0
  54. package/dist/server/workbench/gatewayIntegration.js.map +1 -0
  55. package/dist/server/workbench/mcpClient.js +148 -0
  56. package/dist/server/workbench/mcpClient.js.map +1 -0
  57. package/dist/server/workbench/skillSync.js +375 -0
  58. package/dist/server/workbench/skillSync.js.map +1 -0
  59. package/dist/server/workbench/types.js +2 -0
  60. package/dist/server/workbench/types.js.map +1 -0
  61. package/dist/server/workbench/workbenchClient.js +136 -0
  62. package/dist/server/workbench/workbenchClient.js.map +1 -0
  63. package/dist/server/workbench/workbenchTools.js +145 -0
  64. package/dist/server/workbench/workbenchTools.js.map +1 -0
  65. package/dist/shared/apiTypes.d.ts +141 -1
  66. package/dist/shared/apiTypes.js +8 -0
  67. package/dist/shared/apiTypes.js.map +1 -1
  68. package/dist/shared/federatedRoutes.js +2 -0
  69. package/dist/shared/federatedRoutes.js.map +1 -1
  70. package/dist/shared/piWebConfigParsing.js +94 -0
  71. package/dist/shared/piWebConfigParsing.js.map +1 -1
  72. package/docs/config.md +86 -1
  73. package/docs/plugins.md +14 -0
  74. package/package.json +7 -3
@@ -0,0 +1,375 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
3
+ import { dirname, isAbsolute, join, normalize, resolve } from "node:path";
4
+ import * as yauzl from "yauzl";
5
+ import { isRecord, record, stringField, WorkbenchHttpError } from "./workbenchClient.js";
6
+ export class WorkbenchSkillSynchronizer {
7
+ constructor(config, workbench, dataDir, fetchImpl = fetch, logger) {
8
+ this.config = config;
9
+ this.workbench = workbench;
10
+ this.dataDir = dataDir;
11
+ this.logger = logger;
12
+ this.fetchImpl = fetchImpl;
13
+ }
14
+ async synchronize(cwd, state, audit) {
15
+ const previousReceipt = await this.readReceiptFile(cwd);
16
+ const skills = state.resources.filter((item) => item.resourceType === "skill" && item.status === "published");
17
+ const authorizedCapabilities = new Set(state.resources.filter((item) => item.resourceType === "capability" && item.status === "published" && item.riskLevel === "L0").map((item) => item.resourceName));
18
+ const receipts = [];
19
+ for (const skill of skills) {
20
+ const requiredMissing = skill.dependencies.filter((item) => item.requirement === "required" && !authorizedCapabilities.has(item.capabilityName));
21
+ if (requiredMissing.length > 0) {
22
+ this.logSkill(state, skill, "required_capability_missing", "Workbench Skill rejected", audit);
23
+ continue;
24
+ }
25
+ try {
26
+ const receipt = await this.synchronizeSkill(cwd, state, skill, authorizedCapabilities);
27
+ receipts.push(receipt);
28
+ this.logSkill(state, skill, "loaded", "Workbench Skill synchronized", audit);
29
+ }
30
+ catch (error) {
31
+ this.logSkill(state, skill, skillFailureCode(error), "Workbench Skill rejected", audit);
32
+ throw error;
33
+ }
34
+ }
35
+ await this.removeStaleManagedSkills(cwd, previousReceipt, new Set(receipts.map((receipt) => receipt.directory)));
36
+ const receiptFile = { authorizationRevision: state.authorizationRevision, skills: receipts };
37
+ const path = this.receiptPath(cwd);
38
+ await mkdir(dirname(path), { recursive: true });
39
+ await writeFile(path, `${JSON.stringify(receiptFile, null, 2)}\n`, "utf8");
40
+ return receiptFile;
41
+ }
42
+ async synchronizeSkill(cwd, state, skill, authorizedCapabilities) {
43
+ if (skill.resourceVersion === "latest" || skill.resourceVersion.trim() === "")
44
+ throw new Error(`Skill ${skill.resourceName} must use a fixed version`);
45
+ const runId = `skill-sync-${randomUUID()}`;
46
+ const traceId = `trace-${randomUUID()}`;
47
+ const ticket = await this.workbench.issueSkillTicket(state.bearerToken, {
48
+ skillName: skill.resourceName, skillVersion: skill.resourceVersion, runId, traceId, approvalCount: 0,
49
+ });
50
+ const manifest = await this.fetchManifest(ticket, skill.resourceName, skill.resourceVersion);
51
+ validateManifest(manifest, skill, authorizedCapabilities, this.config.skillFileCountMax ?? 200, this.config.skillFileMaxBytes ?? 2 * 1024 * 1024);
52
+ const directory = skillDirectoryName(skill.resourceName, skill.resourceVersion);
53
+ const target = join(cwd, ".pi", "skills", directory);
54
+ const existing = await this.findExistingReceipt(cwd, state.authorizationRevision, skill.resourceName, skill.resourceVersion);
55
+ if (existing?.contentSha256 === manifest.contentSha256 && await verifyReceipt(target, existing))
56
+ return existing;
57
+ const bundle = await this.fetchBundle(ticket, skill.resourceName, skill.resourceVersion);
58
+ const files = await validateWorkbenchSkillBundle(bundle, manifest, {
59
+ bundleMaxBytes: this.config.skillBundleMaxBytes ?? 10 * 1024 * 1024,
60
+ fileMaxBytes: this.config.skillFileMaxBytes ?? 2 * 1024 * 1024,
61
+ });
62
+ const staging = `${target}.tmp-${randomUUID()}`;
63
+ await rm(staging, { recursive: true, force: true });
64
+ try {
65
+ for (const file of manifest.files) {
66
+ const output = join(staging, ...file.path.split("/"));
67
+ await mkdir(dirname(output), { recursive: true });
68
+ const content = files.get(file.path);
69
+ if (content === undefined)
70
+ throw new Error("MCP Skill bundle is missing a manifest file");
71
+ await writeFile(output, content);
72
+ }
73
+ await rm(target, { recursive: true, force: true });
74
+ await mkdir(dirname(target), { recursive: true });
75
+ await rename(staging, target);
76
+ }
77
+ finally {
78
+ await rm(staging, { recursive: true, force: true });
79
+ }
80
+ return {
81
+ name: skill.resourceName,
82
+ version: skill.resourceVersion,
83
+ directory,
84
+ contentSha256: manifest.contentSha256,
85
+ files: manifest.files.map((file) => ({ path: file.path, sizeBytes: file.sizeBytes, sha256: file.sha256 })),
86
+ degradedCapabilities: manifest.dependencies.filter((item) => item.requirement === "optional" && !authorizedCapabilities.has(item.capabilityName)).map((item) => item.capabilityName),
87
+ };
88
+ }
89
+ async fetchManifest(ticket, name, version) {
90
+ const response = await this.skillRequest(ticket, name, version, "manifest");
91
+ return parseWorkbenchSkillManifest(await response.json());
92
+ }
93
+ async fetchBundle(ticket, name, version) {
94
+ const response = await this.skillRequest(ticket, name, version, "bundle");
95
+ const size = Number(response.headers.get("content-length"));
96
+ const limit = this.config.skillBundleMaxBytes ?? 10 * 1024 * 1024;
97
+ if (Number.isFinite(size) && size > limit)
98
+ throw new Error("Workbench Skill bundle exceeds the configured size limit");
99
+ const buffer = Buffer.from(await response.arrayBuffer());
100
+ if (buffer.length > limit)
101
+ throw new Error("Workbench Skill bundle exceeds the configured size limit");
102
+ return buffer;
103
+ }
104
+ async skillRequest(ticket, name, version, resource) {
105
+ const mcpUrl = new URL(this.config.mcpUrl);
106
+ const url = new URL(`/integration/v1/skills/${encodeURIComponent(name)}/versions/${encodeURIComponent(version)}/${resource}`, mcpUrl.origin);
107
+ const response = await this.fetchImpl(url, {
108
+ headers: { authorization: `Bearer ${ticket}` },
109
+ signal: AbortSignal.timeout(this.config.requestTimeoutMs ?? 10_000),
110
+ });
111
+ if (!response.ok)
112
+ throw new WorkbenchHttpError(response.status, response.status === 410 ? "该Skill已被管理员停用,请刷新工作台授权后重试。" : `MCP Skill ${resource} returned HTTP ${String(response.status)}`);
113
+ return response;
114
+ }
115
+ async findExistingReceipt(cwd, revision, name, version) {
116
+ const value = await this.readReceiptFile(cwd);
117
+ if (value?.authorizationRevision !== revision)
118
+ return undefined;
119
+ return value.skills.find((receipt) => receipt.name === name && receipt.version === version);
120
+ }
121
+ receiptPath(cwd) {
122
+ const key = createHash("sha256").update(resolve(cwd)).digest("hex").slice(0, 24);
123
+ return join(this.dataDir, "workbench-integration", key, "skill-receipts.json");
124
+ }
125
+ logSkill(state, skill, result, message, audit) {
126
+ const details = {
127
+ ...(audit === undefined ? {} : { userId: audit.userId, rootUserId: audit.rootUserId, projectId: audit.projectId, sessionId: audit.sessionId, cwd: audit.cwd }),
128
+ agentSessionId: state.sessionId,
129
+ authorizationRevision: state.authorizationRevision,
130
+ skillName: skill.resourceName,
131
+ skillVersion: skill.resourceVersion,
132
+ result,
133
+ };
134
+ this.logger?.info(details, message);
135
+ if (audit?.recorder === undefined)
136
+ return;
137
+ try {
138
+ audit.recorder.record({
139
+ action: "workbench_skill_sync",
140
+ status: result === "loaded" ? "completed" : "failed",
141
+ userId: audit.userId,
142
+ rootUserId: audit.rootUserId,
143
+ projectId: audit.projectId,
144
+ sessionId: audit.sessionId,
145
+ cwd: audit.cwd,
146
+ agentSessionId: state.sessionId,
147
+ authorizationRevision: state.authorizationRevision,
148
+ skillName: skill.resourceName,
149
+ skillVersion: skill.resourceVersion,
150
+ statusCode: result,
151
+ });
152
+ }
153
+ catch (error) {
154
+ this.logger?.info({ userId: audit.userId, sessionId: audit.sessionId, skillName: skill.resourceName, error: error instanceof Error ? error.message : String(error) }, "failed to enqueue Workbench Skill audit");
155
+ }
156
+ }
157
+ async readReceiptFile(cwd) {
158
+ try {
159
+ const value = JSON.parse(await readFile(this.receiptPath(cwd), "utf8"));
160
+ if (!isRecord(value) || typeof value["authorizationRevision"] !== "number" || !Number.isInteger(value["authorizationRevision"]) || !Array.isArray(value["skills"]))
161
+ return undefined;
162
+ return { authorizationRevision: value["authorizationRevision"], skills: value["skills"].map(parseReceipt) };
163
+ }
164
+ catch {
165
+ return undefined;
166
+ }
167
+ }
168
+ async removeStaleManagedSkills(cwd, previous, keep) {
169
+ if (previous === undefined)
170
+ return;
171
+ const stale = previous.skills.map((skill) => skill.directory).filter((directory) => directory.startsWith("workbench-") && !keep.has(directory));
172
+ await Promise.all(stale.map((directory) => rm(join(cwd, ".pi", "skills", directory), { recursive: true, force: true })));
173
+ }
174
+ }
175
+ function skillFailureCode(error) {
176
+ return error instanceof WorkbenchHttpError ? error.status : "validation_or_mcp_error";
177
+ }
178
+ export async function verifyReceipt(root, receipt) {
179
+ try {
180
+ for (const file of receipt.files) {
181
+ const path = join(root, ...file.path.split("/"));
182
+ const content = await readFile(path);
183
+ if (content.length !== file.sizeBytes || sha256(content) !== file.sha256)
184
+ return false;
185
+ }
186
+ return receipt.files.some((file) => file.path === "SKILL.md");
187
+ }
188
+ catch {
189
+ return false;
190
+ }
191
+ }
192
+ function validateManifest(manifest, skill, capabilities, maxFiles, maxFileBytes) {
193
+ if (manifest.name !== skill.resourceName || manifest.version !== skill.resourceVersion || manifest.status !== "published")
194
+ throw new Error("MCP Skill manifest does not match the authorized fixed version");
195
+ if (manifest.files.length < 1 || manifest.files.length > maxFiles || !manifest.files.some((file) => file.path === "SKILL.md"))
196
+ throw new Error("MCP Skill manifest has an invalid file set");
197
+ if (manifest.files.some((file) => file.sizeBytes > maxFileBytes || file.secretFindings.length > 0))
198
+ throw new Error("MCP Skill manifest violates file or secret-scan policy");
199
+ const requiredMissing = manifest.dependencies.filter((item) => item.requirement === "required" && !capabilities.has(item.capabilityName));
200
+ if (requiredMissing.length > 0)
201
+ throw new Error("MCP Skill required capabilities are not authorized");
202
+ }
203
+ export function parseWorkbenchSkillManifest(value) {
204
+ const manifest = record(value, "MCP Skill manifest");
205
+ const files = manifest["files"];
206
+ const dependencies = manifest["dependencies"];
207
+ if (!Array.isArray(files) || !Array.isArray(dependencies))
208
+ throw new Error("MCP Skill manifest files and dependencies must be arrays");
209
+ return {
210
+ name: stringField(manifest, "name"),
211
+ version: manifestVersion(manifest["version"]),
212
+ status: stringField(manifest, "status"),
213
+ contentSha256: hexSha256Field(manifest, "content_sha256"),
214
+ dependencies: dependencies.map((value) => {
215
+ const dependency = record(value, "MCP Skill dependency");
216
+ const requirement = stringField(dependency, "requirement");
217
+ if (requirement !== "required" && requirement !== "optional")
218
+ throw new Error("MCP Skill dependency requirement is invalid");
219
+ return { capabilityName: stringField(dependency, "capability_name"), requirement };
220
+ }),
221
+ files: files.map(parseManifestFile),
222
+ };
223
+ }
224
+ function parseManifestFile(value) {
225
+ const file = record(value, "MCP Skill file");
226
+ const sizeBytes = file["size_bytes"];
227
+ const findings = file["secret_findings_json"];
228
+ if (typeof sizeBytes !== "number" || !Number.isInteger(sizeBytes) || sizeBytes < 0 || !Array.isArray(findings))
229
+ throw new Error("MCP Skill file metadata is invalid");
230
+ return {
231
+ path: safeArchivePath(stringField(file, "path")),
232
+ mimeType: typeof file["mime_type"] === "string" ? file["mime_type"] : "application/octet-stream",
233
+ sizeBytes,
234
+ sha256: hexSha256Field(file, "sha256"),
235
+ isScript: file["is_script"] === true,
236
+ secretFindings: findings,
237
+ };
238
+ }
239
+ export async function validateWorkbenchSkillBundle(buffer, manifest, limits) {
240
+ if (buffer.length > limits.bundleMaxBytes)
241
+ throw new Error("MCP Skill bundle exceeds the configured size limit");
242
+ const expected = new Map(manifest.files.map((file) => [normalizedArchiveKey(file.path), file]));
243
+ if (expected.size !== manifest.files.length)
244
+ throw new Error("MCP Skill manifest contains colliding paths");
245
+ const contents = new Map();
246
+ await visitZip(buffer, async (entry, open) => {
247
+ assertSafeZipEntry(entry);
248
+ if (entry.fileName.endsWith("/"))
249
+ return;
250
+ const path = safeArchivePath(entry.fileName);
251
+ const key = normalizedArchiveKey(path);
252
+ const file = expected.get(key);
253
+ if (file === undefined || contents.has(file.path))
254
+ throw new Error("MCP Skill bundle contains unexpected or duplicate paths");
255
+ if (entry.uncompressedSize > limits.fileMaxBytes || entry.uncompressedSize !== file.sizeBytes)
256
+ throw new Error("MCP Skill bundle file size is invalid");
257
+ if (entry.compressedSize > 0 && entry.uncompressedSize / entry.compressedSize > 100)
258
+ throw new Error("MCP Skill bundle compression ratio is unsafe");
259
+ const content = await open();
260
+ if (sha256(content) !== file.sha256)
261
+ throw new Error("MCP Skill bundle file hash does not match the manifest");
262
+ contents.set(file.path, content);
263
+ });
264
+ if (contents.size !== manifest.files.length)
265
+ throw new Error("MCP Skill bundle is missing manifest files");
266
+ const contentHash = sha256(Buffer.from(manifest.files.map((file) => file.sha256).join(""), "utf8"));
267
+ if (contentHash !== manifest.contentSha256)
268
+ throw new Error("MCP Skill content hash does not match the manifest");
269
+ return contents;
270
+ }
271
+ function visitZip(buffer, visit) {
272
+ return new Promise((resolvePromise, reject) => {
273
+ yauzl.fromBuffer(buffer, { lazyEntries: true, validateEntrySizes: true, decodeStrings: true }, (error, zip) => {
274
+ if (error !== null) {
275
+ reject(error);
276
+ return;
277
+ }
278
+ let settled = false;
279
+ const fail = (caught) => { if (!settled) {
280
+ settled = true;
281
+ zip.close();
282
+ reject(toError(caught));
283
+ } };
284
+ zip.on("error", fail);
285
+ zip.on("end", () => { if (!settled) {
286
+ settled = true;
287
+ resolvePromise();
288
+ } });
289
+ zip.on("entry", (entry) => {
290
+ void visit(entry, () => readZipEntry(zip, entry)).then(() => { zip.readEntry(); }).catch(fail);
291
+ });
292
+ zip.readEntry();
293
+ });
294
+ });
295
+ }
296
+ function readZipEntry(zip, entry) {
297
+ return new Promise((resolvePromise, reject) => {
298
+ zip.openReadStream(entry, (error, stream) => {
299
+ if (error !== null) {
300
+ reject(error);
301
+ return;
302
+ }
303
+ const chunks = [];
304
+ stream.on("data", (chunk) => chunks.push(chunk));
305
+ stream.on("error", reject);
306
+ stream.on("end", () => { resolvePromise(Buffer.concat(chunks)); });
307
+ });
308
+ });
309
+ }
310
+ function parseReceipt(value) {
311
+ const receipt = record(value, "Workbench Skill receipt");
312
+ const files = receipt["files"];
313
+ const degraded = receipt["degradedCapabilities"];
314
+ if (!Array.isArray(files) || !Array.isArray(degraded) || !degraded.every((item) => typeof item === "string"))
315
+ throw new Error("Workbench Skill receipt is invalid");
316
+ return {
317
+ name: stringField(receipt, "name"),
318
+ version: stringField(receipt, "version"),
319
+ directory: stringField(receipt, "directory"),
320
+ contentSha256: hexSha256Field(receipt, "contentSha256"),
321
+ files: files.map((entry) => {
322
+ const file = record(entry, "Workbench Skill receipt file");
323
+ const sizeBytes = file["sizeBytes"];
324
+ if (typeof sizeBytes !== "number" || !Number.isInteger(sizeBytes) || sizeBytes < 0)
325
+ throw new Error("Workbench Skill receipt file is invalid");
326
+ return { path: safeArchivePath(stringField(file, "path")), sizeBytes, sha256: hexSha256Field(file, "sha256") };
327
+ }),
328
+ degradedCapabilities: degraded,
329
+ };
330
+ }
331
+ function manifestVersion(value) {
332
+ if (typeof value === "string" && value.trim() !== "")
333
+ return value.trim();
334
+ if (typeof value === "number" && Number.isInteger(value) && value >= 0)
335
+ return String(value);
336
+ throw new Error("MCP Skill manifest version is invalid");
337
+ }
338
+ function toError(value) {
339
+ return value instanceof Error ? value : new Error(String(value));
340
+ }
341
+ function assertSafeZipEntry(entry) {
342
+ const mode = entry.externalFileAttributes >>> 16;
343
+ const fileType = mode & 0o170000;
344
+ const expectedType = entry.fileName.endsWith("/") ? 0o040000 : 0o100000;
345
+ if (fileType !== 0 && fileType !== expectedType)
346
+ throw new Error("MCP Skill bundle contains a link or non-regular file");
347
+ }
348
+ function safeArchivePath(value) {
349
+ const withSlashes = value.replace(/\\/gu, "/");
350
+ const normalizedPath = normalize(withSlashes).replace(/\\/gu, "/");
351
+ if (isAbsolute(value) || withSlashes.startsWith("/") || /^[A-Za-z]:\//u.test(withSlashes) || normalizedPath === ".." || normalizedPath.startsWith("../") || withSlashes.split("/").includes("..")) {
352
+ throw new Error("MCP Skill bundle path is unsafe");
353
+ }
354
+ if (normalizedPath === "" || normalizedPath === ".")
355
+ throw new Error("MCP Skill bundle path is empty");
356
+ return normalizedPath.normalize("NFC");
357
+ }
358
+ function normalizedArchiveKey(value) {
359
+ return safeArchivePath(value).normalize("NFC").toLocaleLowerCase();
360
+ }
361
+ function skillDirectoryName(name, version) {
362
+ const hash = createHash("sha256").update(name).digest("hex").slice(0, 12);
363
+ const safeVersion = version.replace(/[^A-Za-z0-9._-]+/gu, "-").slice(0, 40);
364
+ return `workbench-${hash}-v${safeVersion}`;
365
+ }
366
+ function hexSha256Field(value, key) {
367
+ const field = stringField(value, key).toLocaleLowerCase();
368
+ if (!/^[a-f0-9]{64}$/u.test(field))
369
+ throw new Error(`${key} must be a SHA-256 digest`);
370
+ return field;
371
+ }
372
+ function sha256(value) {
373
+ return createHash("sha256").update(value).digest("hex");
374
+ }
375
+ //# sourceMappingURL=skillSync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillSync.js","sourceRoot":"","sources":["../../../src/server/workbench/skillSync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/server/workbench/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,136 @@
1
+ export class WorkbenchHttpError extends Error {
2
+ constructor(status, message) {
3
+ super(message);
4
+ this.status = status;
5
+ }
6
+ }
7
+ export class WorkbenchClient {
8
+ constructor(options) {
9
+ this.options = options;
10
+ this.fetchImpl = options.fetch ?? fetch;
11
+ }
12
+ async createAgentAccessState(bootstrapToken, projectId) {
13
+ const session = record(await this.json("/api/agent-access/sessions", {
14
+ method: "POST",
15
+ token: bootstrapToken,
16
+ expectedStatus: 201,
17
+ body: { projectId, regions: [] },
18
+ }), "Agent Session response");
19
+ const sessionId = stringField(session, "sessionId");
20
+ const bearerToken = stringField(session, "token");
21
+ const expiresAt = stringField(session, "expiresAt");
22
+ const authorizationRevision = integerField(session, "authorizationRevision");
23
+ const snapshot = record(await this.json("/api/agent-access/resources", {
24
+ method: "GET",
25
+ token: bearerToken,
26
+ expectedStatus: 200,
27
+ }), "resource snapshot");
28
+ if (stringField(snapshot, "sessionId") !== sessionId || integerField(snapshot, "authorizationRevision") !== authorizationRevision) {
29
+ throw new Error("Workbench resource snapshot does not match the Agent Session");
30
+ }
31
+ return { sessionId, bearerToken, expiresAt, authorizationRevision, resources: parseAuthorizedResources(snapshot["resources"]) };
32
+ }
33
+ async issueCapabilityToken(bearerToken, request) {
34
+ return stringField(record(await this.json("/api/agent-access/capability-token", {
35
+ method: "POST", token: bearerToken, expectedStatus: 200, body: request,
36
+ }), "capability token response"), "token");
37
+ }
38
+ async issueSkillTicket(bearerToken, request) {
39
+ return stringField(record(await this.json("/api/agent-access/skill-ticket", {
40
+ method: "POST", token: bearerToken, expectedStatus: 200, body: request,
41
+ }), "Skill ticket response"), "token");
42
+ }
43
+ async revoke(state) {
44
+ await this.json(`/api/agent-access/sessions/${encodeURIComponent(state.sessionId)}/revoke`, {
45
+ method: "POST", token: state.bearerToken, expectedStatus: 200,
46
+ });
47
+ }
48
+ async json(path, request) {
49
+ const headers = { authorization: `Bearer ${request.token}` };
50
+ const init = {
51
+ method: request.method,
52
+ headers,
53
+ signal: AbortSignal.timeout(this.options.requestTimeoutMs),
54
+ };
55
+ if (request.body !== undefined) {
56
+ headers["content-type"] = "application/json";
57
+ init.body = JSON.stringify(request.body);
58
+ }
59
+ const response = await this.fetchImpl(new URL(path, trailingSlash(this.options.baseUrl)), init);
60
+ const text = await response.text();
61
+ if (response.status !== request.expectedStatus)
62
+ throw new WorkbenchHttpError(response.status, responseMessage(text, response.status));
63
+ try {
64
+ const value = JSON.parse(text);
65
+ return value;
66
+ }
67
+ catch {
68
+ throw new Error(`Workbench returned invalid JSON for ${path}`);
69
+ }
70
+ }
71
+ }
72
+ export function parseAuthorizedResources(value) {
73
+ if (!Array.isArray(value))
74
+ throw new Error("Workbench resources must be an array");
75
+ return value.map((item) => {
76
+ const resource = record(item, "authorized resource");
77
+ const dependencies = resource["dependencies"];
78
+ return {
79
+ resourceType: enumField(resource, "resourceType", ["capability", "skill", "knowledge"]),
80
+ resourceName: stringField(resource, "resourceName"),
81
+ resourceVersion: stringField(resource, "resourceVersion"),
82
+ source: enumField(resource, "source", ["group", "personal"]),
83
+ riskLevel: stringField(resource, "riskLevel"),
84
+ status: stringField(resource, "status"),
85
+ displayName: stringField(resource, "displayName"),
86
+ description: typeof resource["description"] === "string" ? resource["description"] : "",
87
+ dependencies: Array.isArray(dependencies) ? dependencies.map((dependency) => {
88
+ const entry = record(dependency, "resource dependency");
89
+ return {
90
+ capabilityName: stringField(entry, "capabilityName"),
91
+ requirement: enumField(entry, "requirement", ["required", "optional"]),
92
+ };
93
+ }) : [],
94
+ metadata: isRecord(resource["metadata"]) ? resource["metadata"] : {},
95
+ };
96
+ });
97
+ }
98
+ function responseMessage(text, status) {
99
+ try {
100
+ const value = JSON.parse(text);
101
+ if (isRecord(value) && typeof value["error"] === "string")
102
+ return `Workbench HTTP ${String(status)}: ${value["error"]}`;
103
+ }
104
+ catch { /* response is not JSON */ }
105
+ return `Workbench HTTP ${String(status)}`;
106
+ }
107
+ function trailingSlash(value) {
108
+ return value.endsWith("/") ? value : `${value}/`;
109
+ }
110
+ export function isRecord(value) {
111
+ return typeof value === "object" && value !== null && !Array.isArray(value);
112
+ }
113
+ export function record(value, label) {
114
+ if (!isRecord(value))
115
+ throw new Error(`${label} must be an object`);
116
+ return value;
117
+ }
118
+ export function stringField(value, key) {
119
+ const field = value[key];
120
+ if (typeof field !== "string" || field.trim() === "")
121
+ throw new Error(`${key} must be a non-empty string`);
122
+ return field.trim();
123
+ }
124
+ function integerField(value, key) {
125
+ const field = value[key];
126
+ if (typeof field !== "number" || !Number.isInteger(field))
127
+ throw new Error(`${key} must be an integer`);
128
+ return field;
129
+ }
130
+ function enumField(value, key, allowed) {
131
+ const field = value[key];
132
+ if (typeof field !== "string" || !allowed.includes(field))
133
+ throw new Error(`${key} is invalid`);
134
+ return field;
135
+ }
136
+ //# sourceMappingURL=workbenchClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workbenchClient.js","sourceRoot":"","sources":["../../../src/server/workbench/workbenchClient.ts"],"names":[],"mappings":"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"}