@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.
- package/README.md +112 -0
- package/dist/src/canonical/bridge.d.ts +6 -0
- package/dist/src/canonical/bridge.d.ts.map +1 -1
- package/dist/src/canonical/bridge.js +90 -9
- package/dist/src/canonical/bridge.js.map +1 -1
- package/dist/src/credentials/resolver.d.ts +7 -1
- package/dist/src/credentials/resolver.d.ts.map +1 -1
- package/dist/src/credentials/resolver.js +83 -0
- package/dist/src/credentials/resolver.js.map +1 -1
- package/dist/src/credentials/types.d.ts +7 -0
- package/dist/src/credentials/types.d.ts.map +1 -1
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +3 -1
- package/dist/src/server.js.map +1 -1
- package/dist/src/tools/canonical-guard.d.ts +28 -0
- package/dist/src/tools/canonical-guard.d.ts.map +1 -1
- package/dist/src/tools/canonical-guard.js +108 -0
- package/dist/src/tools/canonical-guard.js.map +1 -1
- package/dist/src/tools/credential-status.d.ts.map +1 -1
- package/dist/src/tools/credential-status.js +29 -3
- package/dist/src/tools/credential-status.js.map +1 -1
- package/dist/src/tools/index.d.ts +1 -0
- package/dist/src/tools/index.d.ts.map +1 -1
- package/dist/src/tools/index.js +15 -8
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/lab-dev.d.ts +711 -0
- package/dist/src/tools/lab-dev.d.ts.map +1 -0
- package/dist/src/tools/lab-dev.js +508 -0
- package/dist/src/tools/lab-dev.js.map +1 -0
- package/dist/src/tools/provision-tools.d.ts +36 -0
- package/dist/src/tools/provision-tools.d.ts.map +1 -1
- package/dist/src/tools/provision-tools.js +37 -4
- package/dist/src/tools/provision-tools.js.map +1 -1
- package/dist/src/tools/vm-cleanup.d.ts +21 -0
- package/dist/src/tools/vm-cleanup.d.ts.map +1 -1
- package/dist/src/tools/vm-cleanup.js +233 -2
- package/dist/src/tools/vm-cleanup.js.map +1 -1
- package/dist/src/tools/vm-repair.d.ts +98 -0
- package/dist/src/tools/vm-repair.d.ts.map +1 -0
- package/dist/src/tools/vm-repair.js +60 -0
- package/dist/src/tools/vm-repair.js.map +1 -0
- 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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"}
|