@cotal-ai/workspace 0.50.0 → 0.51.0

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 (46) hide show
  1. package/dist/auth-paths.d.ts +50 -0
  2. package/dist/auth-paths.d.ts.map +1 -1
  3. package/dist/auth-paths.js +109 -1
  4. package/dist/auth-paths.js.map +1 -1
  5. package/dist/connect.d.ts +4 -1
  6. package/dist/connect.d.ts.map +1 -1
  7. package/dist/connect.js +7 -3
  8. package/dist/connect.js.map +1 -1
  9. package/dist/control-target.d.ts +1 -0
  10. package/dist/control-target.d.ts.map +1 -1
  11. package/dist/control-target.js +2 -0
  12. package/dist/control-target.js.map +1 -1
  13. package/dist/flags.d.ts +6 -2
  14. package/dist/flags.d.ts.map +1 -1
  15. package/dist/flags.js +10 -2
  16. package/dist/flags.js.map +1 -1
  17. package/dist/index.d.ts +3 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +3 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/join-target.d.ts +173 -0
  22. package/dist/join-target.d.ts.map +1 -0
  23. package/dist/join-target.js +335 -0
  24. package/dist/join-target.js.map +1 -0
  25. package/dist/mesh-registry.d.ts +29 -5
  26. package/dist/mesh-registry.d.ts.map +1 -1
  27. package/dist/mesh-registry.js +64 -20
  28. package/dist/mesh-registry.js.map +1 -1
  29. package/dist/mesh-target.d.ts +2 -0
  30. package/dist/mesh-target.d.ts.map +1 -1
  31. package/dist/mesh-target.js +1 -0
  32. package/dist/mesh-target.js.map +1 -1
  33. package/dist/preflight.d.ts.map +1 -1
  34. package/dist/preflight.js +6 -0
  35. package/dist/preflight.js.map +1 -1
  36. package/dist/registration-policy.d.ts +69 -0
  37. package/dist/registration-policy.d.ts.map +1 -0
  38. package/dist/registration-policy.js +179 -0
  39. package/dist/registration-policy.js.map +1 -0
  40. package/dist/render.js +3 -3
  41. package/dist/render.js.map +1 -1
  42. package/dist/seat-checkpoint.d.ts +167 -0
  43. package/dist/seat-checkpoint.d.ts.map +1 -0
  44. package/dist/seat-checkpoint.js +413 -0
  45. package/dist/seat-checkpoint.js.map +1 -0
  46. package/package.json +2 -2
@@ -0,0 +1,413 @@
1
+ /**
2
+ * Seat checkpoints: the durable description of one preserved seat, sufficient to start it on
3
+ * another host, plus the admission gates a destination runs before it launches anything.
4
+ *
5
+ * This is the machine-local half of `docs/design/session-recovery.md` sections 1.3 (steps 7 and 8),
6
+ * 2.2 and 5.4. It lives in `@cotal-ai/workspace` because both the CLI (which cuts and admits) and
7
+ * the manager (which owns the resume entry) depend on this package and never on each other.
8
+ *
9
+ * Two rules shape everything below. A checkpoint is content-addressed: every captured file is
10
+ * recorded by path, byte size and sha256, and the record is written last, after the digests are
11
+ * computed over the bytes that landed. And a checkpoint is non-secret by construction: it carries
12
+ * credential REFERENCES (a path, and for the two credential files a digest) exactly as
13
+ * `ManagerResumeIdentity` already does, never credential values, never the manager's own launch
14
+ * material, and never a seat whose launch options could not be resolved.
15
+ */
16
+ import { closeSync, constants, fstatSync, fsyncSync, lstatSync, mkdirSync, openSync, readFileSync, readSync, renameSync, rmSync, writeFileSync, } from "node:fs";
17
+ import { dirname, join, resolve } from "node:path";
18
+ import { createHash, randomUUID } from "node:crypto";
19
+ import { hardenPrivate } from "@cotal-ai/core";
20
+ export const SEAT_CHECKPOINT_FORMAT = "cotal-seat-checkpoint/v1";
21
+ export const SEAT_CHECKPOINT_RECORD = "checkpoint.json";
22
+ /** The record is a bounded document like the resume document it carries, and for the same reason:
23
+ * a reader must be able to size its buffer before it trusts anything in the file. */
24
+ export const MAX_SEAT_CHECKPOINT_BYTES = 1024 * 1024;
25
+ /**
26
+ * Where one cut's seat checkpoints live: `.cotal/maintenance/v<N>/checkpoints/<attempt>/<seat>/`.
27
+ *
28
+ * Scoped by the preservation attempt, not shared across cuts. The writer refuses a destination
29
+ * that already exists, which is what makes a checkpoint immutable once sealed; without the attempt
30
+ * in the path the second cut in a root would refuse on the first seat's leftover directory, and
31
+ * deleting the old one to make room would destroy the artifact a rollback still needs.
32
+ */
33
+ export function seatCheckpointDir(root, attemptId, version = 1) {
34
+ if (!/^[A-Za-z0-9][A-Za-z0-9_.-]{0,200}$/.test(attemptId))
35
+ fail(`invalid preservation attempt id for a checkpoint path: ${JSON.stringify(attemptId)}`);
36
+ return join(root, ".cotal", "maintenance", `v${version}`, "checkpoints", attemptId);
37
+ }
38
+ /** Thrown by every refusal in this module. Each message names what the reader actually saw. */
39
+ export class SeatCheckpointError extends Error {
40
+ constructor(message) {
41
+ super(message);
42
+ this.name = "SeatCheckpointError";
43
+ }
44
+ }
45
+ function fail(message) {
46
+ throw new SeatCheckpointError(message);
47
+ }
48
+ function fsyncDirectory(path) {
49
+ let fd;
50
+ try {
51
+ fd = openSync(path, constants.O_RDONLY);
52
+ fsyncSync(fd);
53
+ }
54
+ catch (error) {
55
+ // Windows cannot fsync a directory handle. A POSIX failure here is a durability failure.
56
+ if (process.platform !== "win32")
57
+ throw error;
58
+ }
59
+ finally {
60
+ if (fd !== undefined)
61
+ closeSync(fd);
62
+ }
63
+ }
64
+ function assertCapturedName(name) {
65
+ if (!/^[A-Za-z0-9][A-Za-z0-9_.-]{0,200}$/.test(name) || name === SEAT_CHECKPOINT_RECORD)
66
+ fail(`invalid checkpoint file name ${JSON.stringify(name)}`);
67
+ }
68
+ /**
69
+ * Open a checkpoint destination. The disposition is `createArtifactWriter`'s in
70
+ * `implementations/cli/src/lib/backup-artifact.ts`: refuse a destination that already exists, and
71
+ * harden the directory to 0700 before anything lands in it.
72
+ */
73
+ export function createSeatCheckpointWriter(destination) {
74
+ const directory = resolve(destination);
75
+ try {
76
+ mkdirSync(directory, { mode: 0o700 });
77
+ }
78
+ catch (error) {
79
+ if (error.code === "EEXIST")
80
+ fail(`seat checkpoint destination already exists: ${directory}`);
81
+ throw error;
82
+ }
83
+ try {
84
+ hardenPrivate(directory, "dir");
85
+ fsyncDirectory(dirname(directory));
86
+ }
87
+ catch (error) {
88
+ // Exclusively created and still empty: a failed post-create step must not leak the directory
89
+ // and block a same-destination retry.
90
+ try {
91
+ rmSync(directory, { recursive: true });
92
+ }
93
+ catch { /* already absent */ }
94
+ throw error;
95
+ }
96
+ let sealed = false;
97
+ return {
98
+ directory,
99
+ captureFile(name, kind, source, restore) {
100
+ if (sealed)
101
+ fail("seat checkpoint is already sealed");
102
+ assertCapturedName(name);
103
+ // Validated where it is WRITTEN as well as where it is read: a destination this reader would
104
+ // refuse must never reach a sealed record, or the cut produces an artifact no resume admits.
105
+ if (restore !== undefined && !isRestoreDestination(restore))
106
+ fail(`invalid restore destination for ${name}: ${JSON.stringify(restore)}`);
107
+ const from = resolve(source);
108
+ const stat = lstatSync(from);
109
+ if (!stat.isFile() || stat.isSymbolicLink())
110
+ fail(`refusing to capture a non-regular or symlinked file: ${from}`);
111
+ const bytes = readFileSync(from);
112
+ const path = join(directory, name);
113
+ const fd = openSync(path, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY, 0o600);
114
+ try {
115
+ writeFileSync(fd, bytes);
116
+ fsyncSync(fd);
117
+ // The digest must describe the bytes that LANDED, not the bytes we meant to write.
118
+ if (fstatSync(fd).size !== bytes.byteLength)
119
+ fail(`seat checkpoint size mismatch after writing ${name}`);
120
+ }
121
+ finally {
122
+ closeSync(fd);
123
+ }
124
+ return {
125
+ path: name,
126
+ size: bytes.byteLength,
127
+ sha256: createHash("sha256").update(bytes).digest("hex"),
128
+ kind,
129
+ ...(restore ? { restore } : {}),
130
+ };
131
+ },
132
+ seal(checkpoint) {
133
+ if (sealed)
134
+ fail("seat checkpoint is already sealed");
135
+ const record = { format: SEAT_CHECKPOINT_FORMAT, ...checkpoint };
136
+ const data = `${JSON.stringify(record, null, 2)}\n`;
137
+ if (Buffer.byteLength(data) > MAX_SEAT_CHECKPOINT_BYTES)
138
+ fail(`seat checkpoint record exceeds ${MAX_SEAT_CHECKPOINT_BYTES} bytes`);
139
+ // The record is the completion marker, so it appears atomically: durable bytes at a temp
140
+ // name, then one rename. A crash can never leave a truncated checkpoint.json.
141
+ const path = join(directory, SEAT_CHECKPOINT_RECORD);
142
+ const tmp = join(directory, `${SEAT_CHECKPOINT_RECORD}.${process.pid}.${randomUUID()}.tmp`);
143
+ const fd = openSync(tmp, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY, 0o600);
144
+ try {
145
+ writeFileSync(fd, data);
146
+ fsyncSync(fd);
147
+ closeSync(fd);
148
+ }
149
+ catch (error) {
150
+ try {
151
+ closeSync(fd);
152
+ }
153
+ catch { /* already closed */ }
154
+ try {
155
+ rmSync(tmp);
156
+ }
157
+ catch { /* best effort for the exclusively-created temp */ }
158
+ throw error;
159
+ }
160
+ renameSync(tmp, path);
161
+ fsyncDirectory(directory);
162
+ sealed = true;
163
+ return record;
164
+ },
165
+ cleanup() {
166
+ if (sealed)
167
+ return;
168
+ try {
169
+ rmSync(directory, { recursive: true });
170
+ }
171
+ catch { /* already absent */ }
172
+ fsyncDirectory(dirname(directory));
173
+ },
174
+ };
175
+ }
176
+ /**
177
+ * A restore destination that cannot escape its anchor.
178
+ *
179
+ * Relative, non-empty, no leading slash, no `.` or `..` segment, no NUL and no backslash. The
180
+ * checkpoint is an artifact carried from another host, so this path is untrusted input that names
181
+ * a file the destination is about to WRITE: without this a record could place a file anywhere the
182
+ * resuming user can reach.
183
+ */
184
+ function isRestoreDestination(value) {
185
+ const destination = value;
186
+ if (!destination || typeof destination !== "object")
187
+ return false;
188
+ if (!["workspace-root", "home", "cwd"].includes(destination.anchor))
189
+ return false;
190
+ const path = destination.path;
191
+ if (typeof path !== "string" || !path || path.length > 1024)
192
+ return false;
193
+ if (path.startsWith("/") || path.includes("\\") || path.includes("\0"))
194
+ return false;
195
+ return path.split("/").every((segment) => segment && segment !== "." && segment !== "..");
196
+ }
197
+ function isCapturedFile(value) {
198
+ const file = value;
199
+ return Boolean(file && typeof file === "object" &&
200
+ typeof file.path === "string" && /^[A-Za-z0-9][A-Za-z0-9_.-]{0,200}$/.test(file.path) &&
201
+ Number.isInteger(file.size) && file.size >= 0 &&
202
+ typeof file.sha256 === "string" && /^[0-9a-f]{64}$/.test(file.sha256) &&
203
+ (file.restore === undefined || isRestoreDestination(file.restore)));
204
+ }
205
+ /** Parse a checkpoint record, refusing anything a gate would otherwise have to guess about. */
206
+ export function parseSeatCheckpoint(value) {
207
+ const record = value;
208
+ if (!record || typeof record !== "object" || Array.isArray(record))
209
+ fail("seat checkpoint record is not an object");
210
+ if (record.format !== SEAT_CHECKPOINT_FORMAT)
211
+ fail(`seat checkpoint format is ${JSON.stringify(record.format)}, expected ${SEAT_CHECKPOINT_FORMAT}`);
212
+ if (typeof record.space !== "string" || !record.space)
213
+ fail("seat checkpoint record has no space");
214
+ if (typeof record.name !== "string" || !record.name)
215
+ fail("seat checkpoint record has no seat name");
216
+ // The same token shape `resume.ts` enforces on every identity mode: the uid is recovered, never
217
+ // minted, so a malformed one must not reach a launch.
218
+ if (typeof record.lifecycleUid !== "string" || !/^[a-z0-9]{26,32}$/.test(record.lifecycleUid))
219
+ fail(`seat checkpoint lifecycleUid is not a valid lifecycle token: ${JSON.stringify(record.lifecycleUid)}`);
220
+ if (!Number.isInteger(record.generation) || record.generation < 0)
221
+ fail(`seat checkpoint generation is not a non-negative integer: ${JSON.stringify(record.generation)}`);
222
+ if (typeof record.recencyHorizonMs !== "number" || !Number.isFinite(record.recencyHorizonMs) || record.recencyHorizonMs <= 0)
223
+ fail(`seat checkpoint recency horizon is not a positive duration: ${JSON.stringify(record.recencyHorizonMs)}`);
224
+ // An unreadable capturedAt is refused with no override: a freshness gate that fails open is not
225
+ // a gate.
226
+ if (typeof record.capturedAt !== "string" || Number.isNaN(Date.parse(record.capturedAt)))
227
+ fail(`seat checkpoint capturedAt is not a readable instant: ${JSON.stringify(record.capturedAt)}`);
228
+ const session = record.session;
229
+ if (!session || typeof session !== "object")
230
+ fail("seat checkpoint record has no session block");
231
+ if (!["exact", "fork", "fresh", "drain-only"].includes(session.continuity))
232
+ fail(`seat checkpoint continuity class is unknown: ${JSON.stringify(session.continuity)}`);
233
+ if (!Array.isArray(session.store) || !session.store.every(isCapturedFile))
234
+ fail("seat checkpoint session store is not a list of captured files");
235
+ if (session.pointer !== undefined && !isCapturedFile(session.pointer))
236
+ fail("seat checkpoint session pointer is not a captured file");
237
+ // A session file with nowhere to land is a file a restore would silently drop, and the class it
238
+ // supports would then promise a session the destination never received.
239
+ if (session.pointer && !session.pointer.restore)
240
+ fail("seat checkpoint session pointer records no restore destination");
241
+ for (const file of session.store) {
242
+ if (!file.restore)
243
+ fail(`seat checkpoint session store file ${file.path} records no restore destination`);
244
+ }
245
+ const repository = record.repository;
246
+ if (!repository || typeof repository !== "object")
247
+ fail("seat checkpoint record has no repository block");
248
+ if (typeof repository.base !== "string" || !/^[0-9a-f]{40,64}$/.test(repository.base))
249
+ fail(`seat checkpoint repository base is not a full object id: ${JSON.stringify(repository.base)}`);
250
+ if (typeof repository.untrackedSelection !== "string" || !repository.untrackedSelection)
251
+ fail("seat checkpoint repository does not state the untracked selection rule it was produced under");
252
+ // The empty string is a valid status (a clean tree), so this checks the TYPE and refuses an
253
+ // absent field: a restore with nothing to compare against would verify nothing.
254
+ if (typeof repository.status !== "string")
255
+ fail("seat checkpoint repository does not record the working tree status it was captured from");
256
+ for (const key of ["bundle", "indexDiff", "worktreeDiff", "untracked"]) {
257
+ if (!isCapturedFile(repository[key]))
258
+ fail(`seat checkpoint repository.${key} is not a captured file`);
259
+ }
260
+ return record;
261
+ }
262
+ /** Every file a checkpoint names, in one list, so gate 1 cannot miss one by walking the shape. */
263
+ export function seatCheckpointFiles(record) {
264
+ return [
265
+ record.repository.bundle,
266
+ record.repository.indexDiff,
267
+ record.repository.worktreeDiff,
268
+ record.repository.untracked,
269
+ ...(record.session.pointer ? [record.session.pointer] : []),
270
+ ...record.session.store,
271
+ ];
272
+ }
273
+ /** Read and parse the record itself, under the same discipline the resume document reader uses:
274
+ * no symlink, bounded read, and a re-stat after the read so a file that moved under us is a
275
+ * refusal rather than a value. */
276
+ export function readSeatCheckpoint(directory) {
277
+ const path = join(resolve(directory), SEAT_CHECKPOINT_RECORD);
278
+ const noFollow = constants.O_NOFOLLOW ?? 0;
279
+ let fd;
280
+ try {
281
+ fd = openSync(path, constants.O_RDONLY | noFollow);
282
+ }
283
+ catch (error) {
284
+ const code = error.code;
285
+ if (code === "ENOENT")
286
+ fail(`seat checkpoint record is missing: ${path}`);
287
+ if (code === "ELOOP")
288
+ fail(`seat checkpoint record must not be a symlink: ${path}`);
289
+ fail(`seat checkpoint record cannot be inspected: ${path}`);
290
+ }
291
+ let text;
292
+ try {
293
+ const before = fstatSync(fd, { bigint: true });
294
+ if (!before.isFile())
295
+ fail(`seat checkpoint record is not a regular file: ${path}`);
296
+ if (before.size > BigInt(MAX_SEAT_CHECKPOINT_BYTES))
297
+ fail(`seat checkpoint record exceeds ${MAX_SEAT_CHECKPOINT_BYTES} bytes: ${path}`);
298
+ const buffer = Buffer.alloc(Number(before.size));
299
+ let length = 0;
300
+ while (length < buffer.length) {
301
+ const count = readSync(fd, buffer, length, buffer.length - length, null);
302
+ if (count === 0)
303
+ break;
304
+ length += count;
305
+ }
306
+ const after = fstatSync(fd, { bigint: true });
307
+ if (before.dev !== after.dev || before.ino !== after.ino || before.size !== after.size ||
308
+ before.mtimeNs !== after.mtimeNs || before.ctimeNs !== after.ctimeNs)
309
+ fail(`seat checkpoint record changed while it was being read: ${path}`);
310
+ text = buffer.subarray(0, length).toString("utf8");
311
+ }
312
+ finally {
313
+ closeSync(fd);
314
+ }
315
+ let parsed;
316
+ try {
317
+ parsed = JSON.parse(text);
318
+ }
319
+ catch (error) {
320
+ fail(`seat checkpoint record is not valid JSON: ${path} (${error.message})`);
321
+ }
322
+ return parseSeatCheckpoint(parsed);
323
+ }
324
+ /**
325
+ * Gate 1, integrity. Every file the checkpoint names must be present, be a regular non-symlink
326
+ * file, match its recorded byte size, and match its recorded sha256. The file is re-stat'd after
327
+ * the read and a move is a refusal, which is the standard `readMaintenanceResumeDocument` holds
328
+ * itself to. Failure here is a refusal and no other gate is consulted.
329
+ */
330
+ export function assertSeatCheckpointIntegrity(directory, record) {
331
+ const root = resolve(directory);
332
+ for (const file of seatCheckpointFiles(record)) {
333
+ const path = join(root, file.path);
334
+ const noFollow = constants.O_NOFOLLOW ?? 0;
335
+ let fd;
336
+ try {
337
+ fd = openSync(path, constants.O_RDONLY | noFollow);
338
+ }
339
+ catch (error) {
340
+ const code = error.code;
341
+ if (code === "ENOENT")
342
+ fail(`checkpoint integrity: ${file.path} is missing from ${root}`);
343
+ if (code === "ELOOP")
344
+ fail(`checkpoint integrity: ${file.path} is a symlink`);
345
+ fail(`checkpoint integrity: ${file.path} cannot be inspected (${code})`);
346
+ }
347
+ try {
348
+ const before = fstatSync(fd, { bigint: true });
349
+ if (!before.isFile())
350
+ fail(`checkpoint integrity: ${file.path} is not a regular file`);
351
+ if (before.size !== BigInt(file.size))
352
+ fail(`checkpoint integrity: ${file.path} is ${before.size} bytes, the record says ${file.size}`);
353
+ const hash = createHash("sha256");
354
+ const buffer = Buffer.alloc(Math.min(file.size, 1024 * 1024) || 1);
355
+ let read = 0;
356
+ while (read < file.size) {
357
+ const count = readSync(fd, buffer, 0, Math.min(buffer.length, file.size - read), null);
358
+ if (count === 0)
359
+ break;
360
+ hash.update(buffer.subarray(0, count));
361
+ read += count;
362
+ }
363
+ const after = fstatSync(fd, { bigint: true });
364
+ if (before.dev !== after.dev || before.ino !== after.ino || before.size !== after.size ||
365
+ before.mtimeNs !== after.mtimeNs || before.ctimeNs !== after.ctimeNs)
366
+ fail(`checkpoint integrity: ${file.path} changed while it was being read`);
367
+ if (read !== file.size)
368
+ fail(`checkpoint integrity: ${file.path} ended after ${read} of ${file.size} bytes`);
369
+ const digest = hash.digest("hex");
370
+ if (digest !== file.sha256)
371
+ fail(`checkpoint integrity: ${file.path} hashes to ${digest}, the record says ${file.sha256}`);
372
+ }
373
+ finally {
374
+ closeSync(fd);
375
+ }
376
+ }
377
+ }
378
+ /**
379
+ * Gate 2, identity. Authority, not usefulness: this gate has no override, which is the only reason
380
+ * gate 3 may have one.
381
+ */
382
+ export function assertSeatCheckpointIdentity(record, admission) {
383
+ if (record.space !== admission.space)
384
+ fail(`checkpoint identity: record is for space ${JSON.stringify(record.space)}, this destination is ${JSON.stringify(admission.space)}`);
385
+ if (admission.lifecycleUidIsLive)
386
+ fail(`checkpoint identity: lifecycle ${record.lifecycleUid} is already live and this runtime cannot authoritatively adopt it`);
387
+ const current = admission.profileConfigSha256;
388
+ // No override. The checkpoint carries the recorded DIGEST, not the config bytes, so nothing here
389
+ // could run the seat under the recorded revision even if an operator consented; the manager
390
+ // re-digests the same file and refuses drift on its own. A flag that admitted here and was
391
+ // refused there would be consent that changes no outcome, so the refusal names the remedy.
392
+ if (current !== undefined && current !== record.profile.configSha256)
393
+ fail(`checkpoint identity: this destination's profile revision is ${current}, the checkpoint was cut at ${record.profile.configSha256}; restore the launch config to its recorded revision, then resume`);
394
+ }
395
+ /**
396
+ * Gate 3, recency. Whether the transcript and the tree are close enough to the world for the
397
+ * resumed seat's next turn to be sensible. Refused by default outside the horizon, with all three
398
+ * values in the message; an explicit operator flag overrides and the caller records that it did.
399
+ */
400
+ export function admitSeatCheckpointRecency(record, admission) {
401
+ const capturedAt = Date.parse(record.capturedAt);
402
+ if (Number.isNaN(capturedAt))
403
+ fail(`checkpoint recency: capturedAt ${JSON.stringify(record.capturedAt)} is not a readable instant`);
404
+ if (!Number.isFinite(admission.now))
405
+ fail("checkpoint recency: the destination clock did not read as a finite instant");
406
+ const ageMs = admission.now - capturedAt;
407
+ if (ageMs <= record.recencyHorizonMs)
408
+ return { ageMs, admitted: "inside-horizon" };
409
+ if (!admission.acceptStale)
410
+ fail(`checkpoint recency: captured at ${record.capturedAt}, this destination reads ${new Date(admission.now).toISOString()}, horizon is ${record.recencyHorizonMs}ms`);
411
+ return { ageMs, admitted: "override" };
412
+ }
413
+ //# sourceMappingURL=seat-checkpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seat-checkpoint.js","sourceRoot":"","sources":["../src/seat-checkpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EACL,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,MAAM,EACN,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,CAAC,MAAM,sBAAsB,GAAG,0BAAmC,CAAC;AAC1E,MAAM,CAAC,MAAM,sBAAsB,GAAG,iBAAiB,CAAC;AACxD;sFACsF;AACtF,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,GAAG,IAAI,CAAC;AAErD;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,SAAiB,EAAE,OAAO,GAAG,CAAC;IAC5E,IAAI,CAAC,oCAAoC,CAAC,IAAI,CAAC,SAAS,CAAC;QACvD,IAAI,CAAC,0DAA0D,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC9F,OAAO,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,OAAO,EAAE,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;AACtF,CAAC;AA0FD,+FAA+F;AAC/F,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,SAAS,IAAI,CAAC,OAAe;IAC3B,MAAM,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,EAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxC,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,yFAAyF;QACzF,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,MAAM,KAAK,CAAC;IAChD,CAAC;YAAS,CAAC;QACT,IAAI,EAAE,KAAK,SAAS;YAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,IAAI,CAAC,oCAAoC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,sBAAsB;QACrF,IAAI,CAAC,gCAAgC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACjE,CAAC;AAkBD;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,WAAmB;IAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACvC,IAAI,CAAC;QACH,SAAS,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YACpD,IAAI,CAAC,+CAA+C,SAAS,EAAE,CAAC,CAAC;QACnE,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAChC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,6FAA6F;QAC7F,sCAAsC;QACtC,IAAI,CAAC;YAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;QAC9E,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,OAAO;QACL,SAAS;QACT,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO;YACrC,IAAI,MAAM;gBAAE,IAAI,CAAC,mCAAmC,CAAC,CAAC;YACtD,kBAAkB,CAAC,IAAI,CAAC,CAAC;YACzB,6FAA6F;YAC7F,6FAA6F;YAC7F,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;gBACzD,IAAI,CAAC,mCAAmC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC9E,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE;gBACzC,IAAI,CAAC,wDAAwD,IAAI,EAAE,CAAC,CAAC;YACvE,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACnC,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC5F,IAAI,CAAC;gBACH,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBACzB,SAAS,CAAC,EAAE,CAAC,CAAC;gBACd,mFAAmF;gBACnF,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,UAAU;oBACzC,IAAI,CAAC,+CAA+C,IAAI,EAAE,CAAC,CAAC;YAChE,CAAC;oBAAS,CAAC;gBACT,SAAS,CAAC,EAAE,CAAC,CAAC;YAChB,CAAC;YACD,OAAO;gBACL,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,KAAK,CAAC,UAAU;gBACtB,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBACxD,IAAI;gBACJ,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChC,CAAC;QACJ,CAAC;QACD,IAAI,CAAQ,UAAiD;YAC3D,IAAI,MAAM;gBAAE,IAAI,CAAC,mCAAmC,CAAC,CAAC;YACtD,MAAM,MAAM,GAA0B,EAAE,MAAM,EAAE,sBAAsB,EAAE,GAAG,UAAU,EAAE,CAAC;YACxF,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;YACpD,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,yBAAyB;gBACrD,IAAI,CAAC,kCAAkC,yBAAyB,QAAQ,CAAC,CAAC;YAC5E,yFAAyF;YACzF,8EAA8E;YAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC;YACrD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,sBAAsB,IAAI,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,MAAM,CAAC,CAAC;YAC5F,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC3F,IAAI,CAAC;gBACH,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;gBACxB,SAAS,CAAC,EAAE,CAAC,CAAC;gBACd,SAAS,CAAC,EAAE,CAAC,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC;oBAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;gBACrD,IAAI,CAAC;oBAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,kDAAkD,CAAC,CAAC;gBACjF,MAAM,KAAK,CAAC;YACd,CAAC;YACD,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACtB,cAAc,CAAC,SAAS,CAAC,CAAC;YAC1B,MAAM,GAAG,IAAI,CAAC;YACd,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO;YACL,IAAI,MAAM;gBAAE,OAAO;YACnB,IAAI,CAAC;gBAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;YAC9E,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QACrC,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,oBAAoB,CAAC,KAAc;IAC1C,MAAM,WAAW,GAAG,KAAkC,CAAC;IACvD,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClE,IAAI,CAAC,CAAC,gBAAgB,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAClF,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;IAC9B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI;QAAE,OAAO,KAAK,CAAC;IAC1E,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACrF,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC;AAC5F,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,MAAM,IAAI,GAAG,KAA2B,CAAC;IACzC,OAAO,OAAO,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAC7C,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,oCAAoC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QACrF,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;QAC7C,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QACrE,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,MAAM,MAAM,GAAG,KAAuB,CAAC;IACvC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAChE,IAAI,CAAC,yCAAyC,CAAC,CAAC;IAClD,IAAI,MAAM,CAAC,MAAM,KAAK,sBAAsB;QAC1C,IAAI,CAAC,6BAA6B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,sBAAsB,EAAE,CAAC,CAAC;IACzG,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK;QACnD,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAC9C,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI;QACjD,IAAI,CAAC,yCAAyC,CAAC,CAAC;IAClD,gGAAgG;IAChG,sDAAsD;IACtD,IAAI,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;QAC3F,IAAI,CAAC,gEAAgE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC9G,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC;QAC/D,IAAI,CAAC,6DAA6D,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACzG,IAAI,OAAO,MAAM,CAAC,gBAAgB,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,MAAM,CAAC,gBAAgB,IAAI,CAAC;QAC1H,IAAI,CAAC,+DAA+D,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACjH,gGAAgG;IAChG,UAAU;IACV,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACtF,IAAI,CAAC,yDAAyD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACrG,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC/B,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QACzC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IACtD,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC;QACxE,IAAI,CAAC,gDAAgD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC7F,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC;QACvE,IAAI,CAAC,+DAA+D,CAAC,CAAC;IACxE,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC;QACnE,IAAI,CAAC,wDAAwD,CAAC,CAAC;IACjE,gGAAgG;IAChG,wEAAwE;IACxE,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO;QAC7C,IAAI,CAAC,gEAAgE,CAAC,CAAC;IACzE,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,sCAAsC,IAAI,CAAC,IAAI,iCAAiC,CAAC,CAAC;IAC5G,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACrC,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ;QAC/C,IAAI,CAAC,gDAAgD,CAAC,CAAC;IACzD,IAAI,OAAO,UAAU,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QACnF,IAAI,CAAC,4DAA4D,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtG,IAAI,OAAO,UAAU,CAAC,kBAAkB,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,kBAAkB;QACrF,IAAI,CAAC,8FAA8F,CAAC,CAAC;IACvG,4FAA4F;IAC5F,gFAAgF;IAChF,IAAI,OAAO,UAAU,CAAC,MAAM,KAAK,QAAQ;QACvC,IAAI,CAAC,yFAAyF,CAAC,CAAC;IAClG,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,CAAU,EAAE,CAAC;QAChF,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,CAAC,8BAA8B,GAAG,yBAAyB,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,mBAAmB,CAAC,MAAsB;IACxD,OAAO;QACL,MAAM,CAAC,UAAU,CAAC,MAAM;QACxB,MAAM,CAAC,UAAU,CAAC,SAAS;QAC3B,MAAM,CAAC,UAAU,CAAC,YAAY;QAC9B,MAAM,CAAC,UAAU,CAAC,SAAS;QAC3B,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK;KACxB,CAAC;AACJ,CAAC;AAED;;mCAEmC;AACnC,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,sBAAsB,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,IAAI,CAAC,CAAC;IAC3C,IAAI,EAAU,CAAC;IACf,IAAI,CAAC;QACH,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAC;QACnD,IAAI,IAAI,KAAK,QAAQ;YAAE,IAAI,CAAC,sCAAsC,IAAI,EAAE,CAAC,CAAC;QAC1E,IAAI,IAAI,KAAK,OAAO;YAAE,IAAI,CAAC,iDAAiD,IAAI,EAAE,CAAC,CAAC;QACpF,IAAI,CAAC,+CAA+C,IAAI,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,EAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YAClB,IAAI,CAAC,iDAAiD,IAAI,EAAE,CAAC,CAAC;QAChE,IAAI,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,yBAAyB,CAAC;YACjD,IAAI,CAAC,kCAAkC,yBAAyB,WAAW,IAAI,EAAE,CAAC,CAAC;QACrF,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACjD,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,OAAO,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,CAAC;YAC1E,IAAI,KAAK,KAAK,CAAC;gBAAE,MAAM;YACvB,MAAM,IAAI,KAAK,CAAC;QAClB,CAAC;QACD,MAAM,KAAK,GAAG,SAAS,CAAC,EAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,IAAI,MAAM,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;YAClF,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO;YACtE,IAAI,CAAC,2DAA2D,IAAI,EAAE,CAAC,CAAC;QAC1E,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,EAAG,CAAC,CAAC;IACjB,CAAC;IACD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,6CAA6C,IAAI,KAAM,KAAe,CAAC,OAAO,GAAG,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B,CAAC,SAAiB,EAAE,MAAsB;IACrF,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,IAAI,CAAC,CAAC;QAC3C,IAAI,EAAU,CAAC;QACf,IAAI,CAAC;YACH,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAC;YACnD,IAAI,IAAI,KAAK,QAAQ;gBAAE,IAAI,CAAC,yBAAyB,IAAI,CAAC,IAAI,oBAAoB,IAAI,EAAE,CAAC,CAAC;YAC1F,IAAI,IAAI,KAAK,OAAO;gBAAE,IAAI,CAAC,yBAAyB,IAAI,CAAC,IAAI,eAAe,CAAC,CAAC;YAC9E,IAAI,CAAC,yBAAyB,IAAI,CAAC,IAAI,yBAAyB,IAAI,GAAG,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,SAAS,CAAC,EAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAChD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;gBAAE,IAAI,CAAC,yBAAyB,IAAI,CAAC,IAAI,wBAAwB,CAAC,CAAC;YACvF,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;gBACnC,IAAI,CAAC,yBAAyB,IAAI,CAAC,IAAI,OAAO,MAAM,CAAC,IAAI,2BAA2B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACnG,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACnE,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,OAAO,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBACxB,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAG,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;gBACxF,IAAI,KAAK,KAAK,CAAC;oBAAE,MAAM;gBACvB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;gBACvC,IAAI,IAAI,KAAK,CAAC;YAChB,CAAC;YACD,MAAM,KAAK,GAAG,SAAS,CAAC,EAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,IAAI,MAAM,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;gBAClF,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO;gBACtE,IAAI,CAAC,yBAAyB,IAAI,CAAC,IAAI,kCAAkC,CAAC,CAAC;YAC7E,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI;gBACpB,IAAI,CAAC,yBAAyB,IAAI,CAAC,IAAI,gBAAgB,IAAI,OAAO,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC;YACvF,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAClC,IAAI,MAAM,KAAK,IAAI,CAAC,MAAM;gBACxB,IAAI,CAAC,yBAAyB,IAAI,CAAC,IAAI,cAAc,MAAM,qBAAqB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACnG,CAAC;gBAAS,CAAC;YACT,SAAS,CAAC,EAAG,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;AACH,CAAC;AAaD;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAAC,MAAsB,EAAE,SAAgC;IACnG,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,KAAK;QAClC,IAAI,CAAC,4CAA4C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC3I,IAAI,SAAS,CAAC,kBAAkB;QAC9B,IAAI,CAAC,kCAAkC,MAAM,CAAC,YAAY,mEAAmE,CAAC,CAAC;IACjI,MAAM,OAAO,GAAG,SAAS,CAAC,mBAAmB,CAAC;IAC9C,iGAAiG;IACjG,4FAA4F;IAC5F,2FAA2F;IAC3F,2FAA2F;IAC3F,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC,YAAY;QAClE,IAAI,CAAC,+DAA+D,OAAO,+BAA+B,MAAM,CAAC,OAAO,CAAC,YAAY,mEAAmE,CAAC,CAAC;AAC9M,CAAC;AAkBD;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAsB,EAAE,SAA+B;IAChG,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;QAC1B,IAAI,CAAC,kCAAkC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,4BAA4B,CAAC,CAAC;IACxG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC;QACjC,IAAI,CAAC,4EAA4E,CAAC,CAAC;IACrF,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,GAAG,UAAU,CAAC;IACzC,IAAI,KAAK,IAAI,MAAM,CAAC,gBAAgB;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IACnF,IAAI,CAAC,SAAS,CAAC,WAAW;QACxB,IAAI,CAAC,mCAAmC,MAAM,CAAC,UAAU,4BAA4B,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,gBAAgB,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAC;IACzK,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AACzC,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cotal-ai/workspace",
3
3
  "description": "Cotal machine-local workstation layer: the ~/.cotal mesh registry, target resolution, preflight, on-disk auth-path I/O, and the command-copy renderer — operator concerns over a local checkout, kept separate from the wire protocol in @cotal-ai/core.",
4
- "version": "0.50.0",
4
+ "version": "0.51.0",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
7
7
  "type": "git",
@@ -18,7 +18,7 @@
18
18
  }
19
19
  },
20
20
  "dependencies": {
21
- "@cotal-ai/core": "0.50.0"
21
+ "@cotal-ai/core": "0.51.0"
22
22
  },
23
23
  "devDependencies": {
24
24
  "@cotal-ai/smoke-kit": "0.0.0"