@calltelemetry/ct-lab-mcp 0.8.22 → 0.8.24

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 (42) hide show
  1. package/README.md +112 -0
  2. package/dist/src/canonical/bridge.d.ts +6 -0
  3. package/dist/src/canonical/bridge.d.ts.map +1 -1
  4. package/dist/src/canonical/bridge.js +90 -9
  5. package/dist/src/canonical/bridge.js.map +1 -1
  6. package/dist/src/credentials/resolver.d.ts +7 -1
  7. package/dist/src/credentials/resolver.d.ts.map +1 -1
  8. package/dist/src/credentials/resolver.js +83 -0
  9. package/dist/src/credentials/resolver.js.map +1 -1
  10. package/dist/src/credentials/types.d.ts +7 -0
  11. package/dist/src/credentials/types.d.ts.map +1 -1
  12. package/dist/src/server.d.ts.map +1 -1
  13. package/dist/src/server.js +3 -1
  14. package/dist/src/server.js.map +1 -1
  15. package/dist/src/tools/canonical-guard.d.ts +28 -0
  16. package/dist/src/tools/canonical-guard.d.ts.map +1 -1
  17. package/dist/src/tools/canonical-guard.js +108 -0
  18. package/dist/src/tools/canonical-guard.js.map +1 -1
  19. package/dist/src/tools/credential-status.d.ts.map +1 -1
  20. package/dist/src/tools/credential-status.js +29 -3
  21. package/dist/src/tools/credential-status.js.map +1 -1
  22. package/dist/src/tools/index.d.ts +1 -0
  23. package/dist/src/tools/index.d.ts.map +1 -1
  24. package/dist/src/tools/index.js +15 -8
  25. package/dist/src/tools/index.js.map +1 -1
  26. package/dist/src/tools/lab-dev.d.ts +711 -0
  27. package/dist/src/tools/lab-dev.d.ts.map +1 -0
  28. package/dist/src/tools/lab-dev.js +508 -0
  29. package/dist/src/tools/lab-dev.js.map +1 -0
  30. package/dist/src/tools/provision-tools.d.ts +36 -0
  31. package/dist/src/tools/provision-tools.d.ts.map +1 -1
  32. package/dist/src/tools/provision-tools.js +37 -4
  33. package/dist/src/tools/provision-tools.js.map +1 -1
  34. package/dist/src/tools/vm-cleanup.d.ts +21 -0
  35. package/dist/src/tools/vm-cleanup.d.ts.map +1 -1
  36. package/dist/src/tools/vm-cleanup.js +233 -2
  37. package/dist/src/tools/vm-cleanup.js.map +1 -1
  38. package/dist/src/tools/vm-repair.d.ts +98 -0
  39. package/dist/src/tools/vm-repair.d.ts.map +1 -0
  40. package/dist/src/tools/vm-repair.js +60 -0
  41. package/dist/src/tools/vm-repair.js.map +1 -0
  42. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lab-dev.d.ts","sourceRoot":"","sources":["../../../src/tools/lab-dev.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAE3E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,cAAc,EAIf,MAAM,iBAAiB,CAAC;AAGzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAiJnD;;;;GAIG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IASlC,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyD5B,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAa7B,CAAC;AAMZ,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAyB/D,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,EAAE,CA4D/D;AA4QD,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,GAAG,OAAO,EACjC,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC,CAyBzB"}
@@ -0,0 +1,508 @@
1
+ /** Strict canonical façade for the leased remote development lifecycle. */
2
+ import { z } from "zod";
3
+ import { ProxmoxErrorCode, createToolErrorResult, createToolSuccessResult, } from "../types/mcp.js";
4
+ import { resolve as resolvePath } from "node:path";
5
+ import { isDeepStrictEqual } from "node:util";
6
+ import { canonicalMode, canonicalOperationBlocked, runCanonicalOperation, } from "./canonical-guard.js";
7
+ const MAX_RECEIPT_PATH_LENGTH = 4096;
8
+ const CANONICAL_IDENTIFIER = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/;
9
+ const LINEAR_ISSUE = /^[A-Z][A-Z0-9]*-[1-9][0-9]*$/;
10
+ function identityField(name) {
11
+ return z
12
+ .string()
13
+ .trim()
14
+ .min(1)
15
+ .max(128, `${name} is too long`)
16
+ .refine((value) => !value.startsWith("-"), `${name} must not start with '-'`)
17
+ .refine((value) => !/\s/.test(value), `${name} must not contain whitespace`)
18
+ .refine((value) => !value.includes("\0"), `${name} must not contain a NUL byte`)
19
+ .refine((value) => CANONICAL_IDENTIFIER.test(value), `${name} must use a canonical identifier`);
20
+ }
21
+ const linearIssueField = identityField("linearIssue").refine((value) => LINEAR_ISSUE.test(value), "linearIssue must be a Linear issue key");
22
+ const workspaceReference = identityField("workspaceRef").refine((value) => !value.includes("/") && !value.includes("\\"), "workspaceRef must be an allowlisted reference, not a path");
23
+ const receiptPath = z
24
+ .string()
25
+ .trim()
26
+ .min(1)
27
+ .max(MAX_RECEIPT_PATH_LENGTH)
28
+ .refine((value) => !value.startsWith("-"), "receipt paths must not start with '-'")
29
+ .refine((value) => !/[\0\r\n]/.test(value), "receipt paths must not contain NUL or newline bytes")
30
+ .refine((value) => !/^[A-Za-z][A-Za-z0-9+.-]*:\/\//.test(value), "receipt paths must be local paths guarded by the canonical authority");
31
+ const sourceDigest = z
32
+ .string()
33
+ .trim()
34
+ .regex(/^sha256:[a-f0-9]{64}$/, "sourceDigest must be sha256:<64 lowercase hex characters>");
35
+ const profile = z.literal("ct-local-dev-v1");
36
+ const requiredIdentityShape = {
37
+ assetId: identityField("assetId"),
38
+ leaseId: identityField("leaseId"),
39
+ linearIssue: linearIssueField,
40
+ };
41
+ const optionalIdentityShape = {
42
+ assetId: requiredIdentityShape.assetId.optional(),
43
+ leaseId: requiredIdentityShape.leaseId.optional(),
44
+ linearIssue: requiredIdentityShape.linearIssue.optional(),
45
+ };
46
+ const doctorSchema = z
47
+ .object({
48
+ action: z.literal("doctor"),
49
+ profile,
50
+ ...optionalIdentityShape,
51
+ })
52
+ .strict();
53
+ const planSchema = z
54
+ .object({
55
+ action: z.literal("plan"),
56
+ ...requiredIdentityShape,
57
+ profile,
58
+ workspaceRef: workspaceReference,
59
+ operationId: identityField("operationId"),
60
+ sourceDigest,
61
+ receiptFile: receiptPath,
62
+ })
63
+ .strict();
64
+ const statusSchema = z
65
+ .object({
66
+ action: z.literal("status"),
67
+ ...requiredIdentityShape,
68
+ operationId: identityField("operationId").optional(),
69
+ })
70
+ .strict();
71
+ const appliedLifecycleShape = {
72
+ ...requiredIdentityShape,
73
+ operationId: identityField("operationId"),
74
+ profile,
75
+ workspaceRef: workspaceReference,
76
+ sourceDigest,
77
+ planReceiptFile: receiptPath,
78
+ receiptFile: receiptPath,
79
+ apply: z.boolean().optional().default(false),
80
+ confirmAssetId: identityField("confirmAssetId").optional(),
81
+ };
82
+ const prepareSchema = z
83
+ .object({ action: z.literal("prepare"), ...appliedLifecycleShape })
84
+ .strict();
85
+ const startSchema = z
86
+ .object({
87
+ action: z.literal("start"),
88
+ ...appliedLifecycleShape,
89
+ })
90
+ .strict();
91
+ const syncSchema = z
92
+ .object({
93
+ action: z.literal("sync"),
94
+ ...appliedLifecycleShape,
95
+ })
96
+ .strict();
97
+ const cleanupLifecycleShape = {
98
+ ...requiredIdentityShape,
99
+ operationId: identityField("operationId"),
100
+ planReceiptFile: receiptPath,
101
+ receiptFile: receiptPath,
102
+ apply: z.boolean().optional().default(false),
103
+ confirmAssetId: identityField("confirmAssetId").optional(),
104
+ };
105
+ const stopSchema = z
106
+ .object({
107
+ action: z.literal("stop"),
108
+ ...cleanupLifecycleShape,
109
+ })
110
+ .strict();
111
+ const cleanupSchema = z
112
+ .object({
113
+ action: z.literal("cleanup"),
114
+ ...cleanupLifecycleShape,
115
+ })
116
+ .strict();
117
+ /**
118
+ * Runtime validation uses a strict discriminated union. Each action owns its
119
+ * allowed fields so a status request cannot accidentally become a lifecycle
120
+ * mutation by carrying fields from another action.
121
+ */
122
+ export const LabDevInputObjectSchema = z.discriminatedUnion("action", [
123
+ doctorSchema,
124
+ planSchema,
125
+ prepareSchema,
126
+ startSchema,
127
+ statusSchema,
128
+ syncSchema,
129
+ stopSchema,
130
+ cleanupSchema,
131
+ ]);
132
+ export const LabDevInputSchema = LabDevInputObjectSchema.superRefine((value, context) => {
133
+ if (value.action === "doctor") {
134
+ const providedIdentityFields = [value.assetId, value.leaseId, value.linearIssue].filter((field) => field !== undefined).length;
135
+ if (providedIdentityFields !== 0 && providedIdentityFields !== 3) {
136
+ context.addIssue({
137
+ code: z.ZodIssueCode.custom,
138
+ path: ["assetId"],
139
+ message: "assetId, leaseId, and linearIssue must be provided together",
140
+ });
141
+ }
142
+ return;
143
+ }
144
+ if (value.action === "prepare" || value.action === "start" || value.action === "sync") {
145
+ if (receiptPathsMatch(value.planReceiptFile, value.receiptFile)) {
146
+ context.addIssue({
147
+ code: z.ZodIssueCode.custom,
148
+ path: ["receiptFile"],
149
+ message: "planReceiptFile and receiptFile must be different paths",
150
+ });
151
+ }
152
+ }
153
+ if (value.action === "stop" || value.action === "cleanup") {
154
+ if (receiptPathsMatch(value.planReceiptFile, value.receiptFile)) {
155
+ context.addIssue({
156
+ code: z.ZodIssueCode.custom,
157
+ path: ["receiptFile"],
158
+ message: "planReceiptFile and receiptFile must be different paths",
159
+ });
160
+ }
161
+ }
162
+ if (value.action === "prepare"
163
+ || value.action === "start"
164
+ || value.action === "sync"
165
+ || value.action === "stop"
166
+ || value.action === "cleanup") {
167
+ if (value.apply && value.confirmAssetId !== value.assetId) {
168
+ context.addIssue({
169
+ code: z.ZodIssueCode.custom,
170
+ path: ["confirmAssetId"],
171
+ message: "must exactly match assetId when apply=true",
172
+ });
173
+ }
174
+ if (!value.apply && value.confirmAssetId !== undefined) {
175
+ context.addIssue({
176
+ code: z.ZodIssueCode.custom,
177
+ path: ["confirmAssetId"],
178
+ message: "is only allowed when apply=true",
179
+ });
180
+ }
181
+ }
182
+ });
183
+ /**
184
+ * MCP SDK tools/list serializes only object schemas, not top-level refined
185
+ * unions. Expose the known typed fields for discovery, then apply the strict
186
+ * action union above in the handler before constructing any canonical argv.
187
+ * Do not put defaults here: that would inject disallowed fields into actions.
188
+ */
189
+ export const LabDevAdvertisedInputSchema = z.object({
190
+ action: z.enum(["doctor", "plan", "prepare", "start", "status", "sync", "stop", "cleanup"]),
191
+ assetId: requiredIdentityShape.assetId.optional().describe("Required except doctor; exact canonical asset identity."),
192
+ leaseId: requiredIdentityShape.leaseId.optional().describe("Required except doctor; active exact lease."),
193
+ linearIssue: linearIssueField.optional().describe("Required except doctor; provide all three identity fields together."),
194
+ profile: profile.optional().describe("Required for doctor, plan, prepare, start, sync; forbidden for status, stop, cleanup."),
195
+ workspaceRef: workspaceReference.optional().describe("Required for plan, prepare, start, sync; locally registered reference, never a path."),
196
+ operationId: identityField("operationId").optional().describe("Required except doctor; optional for status. Reuse exact operation for reconciliation."),
197
+ sourceDigest: sourceDigest.optional().describe("Required for plan, prepare, start, sync; immutable source snapshot digest."),
198
+ receiptFile: receiptPath.optional().describe("Required for plan and mutations; canonical private output receipt path."),
199
+ planReceiptFile: receiptPath.optional().describe("Required for prepare, start, sync, stop, cleanup; different from receiptFile."),
200
+ apply: z.boolean().optional().describe("Allowed only for prepare, start, sync, stop, cleanup; omitted means no apply."),
201
+ confirmAssetId: identityField("confirmAssetId").optional().describe("Only with apply=true; must exactly match assetId."),
202
+ }).strict();
203
+ function receiptPathsMatch(left, right) {
204
+ return resolvePath(left) === resolvePath(right);
205
+ }
206
+ function appendIdentity(command, value) {
207
+ command.push("--asset-id", value.assetId, "--lease-id", value.leaseId, "--linear-issue", value.linearIssue);
208
+ }
209
+ function appendApply(command, value) {
210
+ if (value.apply) {
211
+ command.push("--apply", "--confirm-asset-id", value.confirmAssetId);
212
+ }
213
+ }
214
+ /** Build only the fixed, typed canonical argv for a validated request. */
215
+ export function buildLabDevCommand(value) {
216
+ const command = ["dev", value.action];
217
+ switch (value.action) {
218
+ case "doctor":
219
+ command.push("--profile", value.profile);
220
+ if (value.assetId && value.leaseId && value.linearIssue) {
221
+ appendIdentity(command, value);
222
+ }
223
+ return command;
224
+ case "plan":
225
+ command.push("--profile", value.profile, "--workspace-ref", value.workspaceRef);
226
+ appendIdentity(command, value);
227
+ command.push("--operation-id", value.operationId, "--source-digest", value.sourceDigest, "--receipt-file", value.receiptFile);
228
+ return command;
229
+ case "status":
230
+ appendIdentity(command, value);
231
+ if (value.operationId)
232
+ command.push("--operation-id", value.operationId);
233
+ return command;
234
+ case "prepare":
235
+ case "start":
236
+ case "sync":
237
+ appendIdentity(command, value);
238
+ command.push("--operation-id", value.operationId, "--profile", value.profile, "--workspace-ref", value.workspaceRef, "--source-digest", value.sourceDigest, "--plan-receipt-file", value.planReceiptFile, "--receipt-file", value.receiptFile);
239
+ appendApply(command, value);
240
+ return command;
241
+ case "stop":
242
+ case "cleanup":
243
+ appendIdentity(command, value);
244
+ command.push("--operation-id", value.operationId, "--plan-receipt-file", value.planReceiptFile, "--receipt-file", value.receiptFile);
245
+ appendApply(command, value);
246
+ return command;
247
+ }
248
+ }
249
+ const CanonicalDevResultSchema = z.object({
250
+ schema: z.literal("calltelemetry-lab-dev/v1"),
251
+ action: z.enum(["doctor", "plan", "prepare", "start", "status", "sync", "stop", "cleanup"]),
252
+ status: z.string().min(1),
253
+ ready: z.boolean(),
254
+ }).passthrough();
255
+ const ERROR_STATUSES = new Set([
256
+ "blocked", "failed", "unavailable", "rejected", "conflict", "rebuild_required",
257
+ "unknown", "unknown-after-timeout",
258
+ ]);
259
+ const PENDING_STATUSES = new Set(["running", "pending", "starting", "syncing"]);
260
+ const NORMAL_STATUSES = {
261
+ doctor: new Set(["diagnosed"]),
262
+ plan: new Set(["planned"]),
263
+ prepare: new Set(["prepared", ...PENDING_STATUSES]),
264
+ start: new Set(["ready", ...PENDING_STATUSES]),
265
+ sync: new Set(["ready", ...PENDING_STATUSES]),
266
+ status: new Set(["planned", "not_started", "prepared", "ready", "stopped", "cleaned", ...PENDING_STATUSES]),
267
+ stop: new Set(["stopped", ...PENDING_STATUSES]),
268
+ cleanup: new Set(["cleaned", ...PENDING_STATUSES]),
269
+ };
270
+ function objectValue(value) {
271
+ return value !== null && typeof value === "object" && !Array.isArray(value)
272
+ ? value : undefined;
273
+ }
274
+ function hasOwn(value, key) {
275
+ return value !== undefined && Object.prototype.hasOwnProperty.call(value, key);
276
+ }
277
+ function receiptMatchesInput(input, result) {
278
+ const identity = objectValue(result.identity);
279
+ const request = objectValue(result.request);
280
+ const requestIdentity = objectValue(request?.identity);
281
+ // Detached preparation acknowledgements are deliberately projected from a
282
+ // nested immutable request. Keep both copies bound whenever the result
283
+ // supplies them; accepting a contradictory request would make the worker
284
+ // acknowledgement useful as an identity-confusion primitive.
285
+ if (request) {
286
+ if (request.schema !== "calltelemetry-lab-dev/v1")
287
+ return false;
288
+ const observedAction = result.action === "status"
289
+ ? (typeof result.observed_action === "string" ? result.observed_action : result.action)
290
+ : result.action;
291
+ if (typeof observedAction !== "string" || request.action !== observedAction)
292
+ return false;
293
+ if (!identity || !requestIdentity || !isDeepStrictEqual(identity, requestIdentity))
294
+ return false;
295
+ }
296
+ for (const [field, receiptField] of [
297
+ ["assetId", "asset_id"], ["leaseId", "lease_id"], ["linearIssue", "linear_issue"],
298
+ ]) {
299
+ if (input[field] !== undefined
300
+ && (identity?.[receiptField] !== input[field]
301
+ || (request && requestIdentity?.[receiptField] !== input[field])))
302
+ return false;
303
+ }
304
+ for (const [field, receiptField] of [
305
+ ["operationId", "operation_id"], ["workspaceRef", "workspace_ref"],
306
+ ["profile", "profile"], ["receiptFile", "receipt_file"],
307
+ ]) {
308
+ const resultHas = hasOwn(result, receiptField);
309
+ const requestHas = hasOwn(request, receiptField);
310
+ if (resultHas && requestHas && !isDeepStrictEqual(result[receiptField], request[receiptField])) {
311
+ return false;
312
+ }
313
+ if (field in input && input[field] !== undefined) {
314
+ // The native queued acknowledgement does not duplicate workspace_ref or
315
+ // profile at the top level. Those two fields remain exact because the
316
+ // nested request is required and checked above. Other bindings retain
317
+ // their established top-level requirement.
318
+ const nestedOnlyAllowed = field === "workspaceRef" || field === "profile";
319
+ if ((request && field !== "receiptFile" && !requestHas)
320
+ || (!resultHas && !(nestedOnlyAllowed && requestHas))
321
+ || (resultHas && !isDeepStrictEqual(result[receiptField], input[field]))
322
+ || (!resultHas && requestHas
323
+ && !isDeepStrictEqual(request[receiptField], input[field]))) {
324
+ return false;
325
+ }
326
+ }
327
+ }
328
+ if ("sourceDigest" in input) {
329
+ const sourceField = input.action === "plan" ? "source" : "requested_source";
330
+ const source = objectValue(result[sourceField]);
331
+ // Lifecycle requests call this input `requested_source`; the plan request
332
+ // predates that name and calls it `source`. Bind whichever canonical
333
+ // spelling is present, while rejecting a result that supplies both with
334
+ // contradictory values.
335
+ const requestedSource = objectValue(request?.requested_source);
336
+ const plannedSource = objectValue(request?.source);
337
+ if (requestedSource && plannedSource && !isDeepStrictEqual(requestedSource, plannedSource))
338
+ return false;
339
+ const requestSource = requestedSource ?? plannedSource;
340
+ if (!source || source.sourceDigest !== input.sourceDigest)
341
+ return false;
342
+ if (request && (!requestSource
343
+ // `plan` intentionally projects the source summary (source/dependency
344
+ // digests) while the immutable request retains the packaging digest.
345
+ // Bind every projected field without requiring the summary to duplicate
346
+ // request-only evidence; lifecycle acknowledgements must remain exact.
347
+ || (input.action === "plan"
348
+ ? !Object.entries(source).every(([key, value]) => isDeepStrictEqual(requestSource[key], value))
349
+ : !isDeepStrictEqual(source, requestSource))))
350
+ return false;
351
+ if (input.action !== "plan"
352
+ && (typeof result.requested_source_digest !== "string"
353
+ || !/^sha256:[a-f0-9]{64}$/.test(result.requested_source_digest)
354
+ || result.requested_source_digest !== input.sourceDigest))
355
+ return false;
356
+ // A queued worker has not observed the guest source yet. Null is the
357
+ // honest value; any non-null observation must still be the exact requested
358
+ // source/dependency/packaging digest rather than merely a well-formed hash.
359
+ if (input.action === "prepare"
360
+ && typeof result.status === "string" && PENDING_STATUSES.has(result.status)) {
361
+ for (const [observed, expected] of [
362
+ ["observed_source_digest", "sourceDigest"],
363
+ ["observed_dependency_digest", "dependencyDigest"],
364
+ ["observed_runtime_packaging_digest", "runtimePackagingDigest"],
365
+ ]) {
366
+ if (!hasOwn(result, observed)
367
+ || (result[observed] !== null && result[observed] !== source[expected]))
368
+ return false;
369
+ }
370
+ }
371
+ }
372
+ return true;
373
+ }
374
+ function readyReceiptIsBoundAndFresh(result, allowedActions = ["start", "sync"]) {
375
+ const request = objectValue(result.request);
376
+ const identity = objectValue(result.identity);
377
+ const requestIdentity = objectValue(request?.identity);
378
+ const source = objectValue(result.requested_source);
379
+ const requestSource = objectValue(request?.requested_source);
380
+ const observedAction = result.action === "status" ? result.observed_action : result.action;
381
+ const observedAt = typeof result.observed_at === "string" && /T.*(?:Z|[+-]\d{2}:\d{2})$/.test(result.observed_at)
382
+ ? Date.parse(result.observed_at) : NaN;
383
+ const ageMs = Date.now() - observedAt;
384
+ if (!request || request.schema !== "calltelemetry-lab-dev/v1"
385
+ || typeof observedAction !== "string" || !allowedActions.includes(observedAction)
386
+ || request.action !== observedAction
387
+ || !Number.isFinite(ageMs) || ageMs < -5_000 || ageMs > 30_000
388
+ || typeof result.operation_id !== "string" || !CANONICAL_IDENTIFIER.test(result.operation_id)
389
+ || typeof result.workspace_ref !== "string" || !CANONICAL_IDENTIFIER.test(result.workspace_ref)
390
+ || result.profile !== "ct-local-dev-v1"
391
+ || !isDeepStrictEqual(requestIdentity, identity)
392
+ || !["operation_id", "workspace_ref", "profile", "session_id", "plan_sha256"].every((key) => request[key] === result[key])
393
+ || !isDeepStrictEqual(requestSource, source))
394
+ return false;
395
+ // The canonical controller validates planReceiptFile and computes this digest.
396
+ // The facade never opens a caller-selected path or duplicates that authority.
397
+ return typeof result.plan_sha256 === "string" && /^sha256:[a-f0-9]{64}$/.test(result.plan_sha256)
398
+ && typeof result.session_id === "string" && /^sha256:[a-f0-9]{64}$/.test(result.session_id);
399
+ }
400
+ /** Preserve the canonical receipt while distinguishing dispatch from readiness. */
401
+ function classifyLabDevResult(input, canonical) {
402
+ const wrapper = objectValue(canonical.structuredContent);
403
+ const error = objectValue(wrapper?.error);
404
+ const details = objectValue(error?.details);
405
+ const envelope = canonical.isError ? details : wrapper;
406
+ const transportSuccess = canonical.isError !== true && envelope?.success === true;
407
+ const timedOut = envelope?.timedOut === true;
408
+ const parsed = CanonicalDevResultSchema.safeParse(envelope?.result);
409
+ const result = parsed.success ? parsed.data : undefined;
410
+ const status = timedOut ? "unknown-after-timeout" : result?.status ?? "unavailable";
411
+ const payload = {
412
+ ...(envelope ?? {}),
413
+ // Do not echo malformed protocol text or partial output as receipt evidence.
414
+ result,
415
+ operation: "lab_dev",
416
+ action: input.action,
417
+ transportSuccess,
418
+ accepted: false,
419
+ actionSuccess: false,
420
+ success: false,
421
+ status,
422
+ ready: false,
423
+ runtimeReady: false,
424
+ // Mutation outcome cannot be inferred from a killed controller process.
425
+ ...(timedOut ? { mutation_performed: null, nextAction: "status" } : {}),
426
+ };
427
+ if (!transportSuccess) {
428
+ return createToolErrorResult(typeof error?.code === "string" ? error.code : "CANONICAL_OPERATION_FAILED", timedOut ? "The controller timed out; inspect status before retrying the exact operation."
429
+ : "The canonical remote-development operation did not complete successfully.", payload);
430
+ }
431
+ if (!result || result.action !== input.action) {
432
+ return createToolErrorResult("CANONICAL_DEV_INVALID_RESULT", "The canonical remote-development response has no valid action receipt.", payload);
433
+ }
434
+ if (ERROR_STATUSES.has(status) || !NORMAL_STATUSES[input.action].has(status)) {
435
+ return createToolErrorResult("CANONICAL_DEV_NOT_READY", "The canonical remote-development action requires repair or reconciliation.", { ...payload, ...(status === "unknown-after-timeout" ? { nextAction: "status", mutation_performed: null } : {}) });
436
+ }
437
+ if (!receiptMatchesInput(input, result)) {
438
+ return createToolErrorResult("CANONICAL_DEV_INVALID_RESULT", "The canonical receipt does not match the requested identity, operation, workspace or source.", payload);
439
+ }
440
+ // A stopped or planned operation is not an application-readiness claim.
441
+ // Contradictory status/ready combinations must never become capture proof.
442
+ if ((status === "ready") !== result.ready) {
443
+ return createToolErrorResult("CANONICAL_DEV_INVALID_RESULT", "The canonical status contradicts its readiness evidence.", payload);
444
+ }
445
+ if (status === "prepared") {
446
+ const source = objectValue(result.requested_source);
447
+ const checks = objectValue(result.checks);
448
+ if (!readyReceiptIsBoundAndFresh(result, ["prepare"])
449
+ || result.operation_state !== "succeeded" || result.runtime_state !== "prepared"
450
+ || result.sync_state !== "synchronized" || result.preview_url !== undefined
451
+ || !["private_transport", "api_health", "spa_health"].every((key) => checks?.[key] === false)
452
+ || typeof result.preparation_receipt_sha256 !== "string"
453
+ || !/^sha256:[a-f0-9]{64}$/.test(result.preparation_receipt_sha256)
454
+ || ![["observed_source_digest", "sourceDigest"], ["observed_dependency_digest", "dependencyDigest"],
455
+ ["observed_runtime_packaging_digest", "runtimePackagingDigest"]].every(([observed, expected]) => typeof source?.[expected] === "string" && /^sha256:[a-f0-9]{64}$/.test(source[expected])
456
+ && result[observed] === source[expected])
457
+ || result.requested_source_digest !== source?.sourceDigest) {
458
+ return createToolErrorResult("CANONICAL_DEV_INVALID_RESULT", "Preparation requires a fresh bound cache receipt, synchronized source and no application-readiness claim.", payload);
459
+ }
460
+ }
461
+ if (result.ready) {
462
+ const checks = objectValue(result.checks);
463
+ const requestedSource = objectValue(result.requested_source);
464
+ const requestedDigest = result.requested_source_digest;
465
+ if (!readyReceiptIsBoundAndFresh(result)
466
+ || result.operation_state !== "succeeded" || result.runtime_state !== "running"
467
+ || result.sync_state !== "synchronized"
468
+ || !["private_transport", "api_health", "spa_health"].every((key) => checks?.[key] === true)
469
+ || typeof requestedDigest !== "string" || !/^sha256:[a-f0-9]{64}$/.test(requestedDigest)
470
+ || result.observed_source_digest !== requestedDigest
471
+ || requestedSource?.sourceDigest !== requestedDigest
472
+ || typeof requestedSource.dependencyDigest !== "string"
473
+ || !/^sha256:[a-f0-9]{64}$/.test(requestedSource.dependencyDigest)
474
+ || result.observed_dependency_digest !== requestedSource.dependencyDigest
475
+ || typeof requestedSource.runtimePackagingDigest !== "string"
476
+ || !/^sha256:[a-f0-9]{64}$/.test(requestedSource.runtimePackagingDigest)
477
+ || result.observed_runtime_packaging_digest !== requestedSource.runtimePackagingDigest) {
478
+ return createToolErrorResult("CANONICAL_DEV_INVALID_RESULT", "Readiness is not supported by synchronized source, packaging and healthy runtime evidence.", payload);
479
+ }
480
+ }
481
+ if ("apply" in input && !input.apply) {
482
+ return createToolErrorResult("CANONICAL_DEV_INVALID_RESULT", "A lifecycle action without apply cannot return execution success; use the explicit plan action.", payload);
483
+ }
484
+ const pending = PENDING_STATUSES.has(status);
485
+ const normalized = {
486
+ ...payload,
487
+ accepted: true,
488
+ actionSuccess: !pending,
489
+ success: !pending,
490
+ ready: result.ready,
491
+ runtimeReady: result.ready,
492
+ };
493
+ return createToolSuccessResult(JSON.stringify(normalized), normalized);
494
+ }
495
+ export async function handleLabDev(rawArgs, context) {
496
+ const parsed = LabDevInputSchema.safeParse(rawArgs);
497
+ if (!parsed.success) {
498
+ return createToolErrorResult(ProxmoxErrorCode.VALIDATION_ERROR, parsed.error.errors
499
+ .map((error) => `${error.path.join(".") || "input"}: ${error.message}`)
500
+ .join("; "), { operation: "lab_dev" });
501
+ }
502
+ if (!canonicalMode(context)) {
503
+ return canonicalOperationBlocked("lab_dev", "remote development is owned by the canonical lab lifecycle; no legacy or mock fallback is available");
504
+ }
505
+ const result = await runCanonicalOperation(context.canonicalBridge, "lab_dev", buildLabDevCommand(parsed.data));
506
+ return classifyLabDevResult(parsed.data, result);
507
+ }
508
+ //# sourceMappingURL=lab-dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lab-dev.js","sourceRoot":"","sources":["../../../src/tools/lab-dev.ts"],"names":[],"mappings":"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"}