@hyperdreamer/pi-webui 1.15.2 → 1.16.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 (62) hide show
  1. package/dist/client/assets/{CodeViewer-CHZziPur.js → CodeViewer-CCHq9DpL.js} +1 -1
  2. package/dist/client/assets/{UnifiedDiffViewer-j1-AFZ8f.js → UnifiedDiffViewer-JFQMCnzP.js} +1 -1
  3. package/dist/client/assets/{index-2RMTbgnM.js → index-WjewjFVt.js} +469 -469
  4. package/dist/client/index.html +1 -1
  5. package/dist/config.js +10 -0
  6. package/dist/config.js.map +1 -1
  7. package/dist/configMutationCoordinator.js +10 -1
  8. package/dist/configMutationCoordinator.js.map +1 -1
  9. package/dist/pi-webui-plugins/workspace-tasks/config.js +3 -132
  10. package/dist/pi-webui-plugins/workspace-tasks/pi-webui-plugin.js +14 -2
  11. package/dist/pi-webui-plugins/workspace-tasks/taskDomain.js +203 -0
  12. package/dist/pi-webui-plugins/workspace-tasks/taskRunner.js +3 -2
  13. package/dist/pi-webui-plugins/workspace-tasks/tasksPanelElement.js +947 -673
  14. package/dist/server/app.js +20 -4
  15. package/dist/server/app.js.map +1 -1
  16. package/dist/server/configRoutes.js +5 -0
  17. package/dist/server/configRoutes.js.map +1 -1
  18. package/dist/server/machines/machineProxyRoutes.js +4 -4
  19. package/dist/server/machines/machineProxyRoutes.js.map +1 -1
  20. package/dist/server/workspaceExplorerRoutes.js +64 -4
  21. package/dist/server/workspaceExplorerRoutes.js.map +1 -1
  22. package/dist/server/workspaceTasks/workspaceTasksCatalogService.js +318 -0
  23. package/dist/server/workspaceTasks/workspaceTasksCatalogService.js.map +1 -0
  24. package/dist/server/workspaceTasks/workspaceTasksComposition.js +67 -0
  25. package/dist/server/workspaceTasks/workspaceTasksComposition.js.map +1 -0
  26. package/dist/server/workspaceTasks/workspaceTasksErrors.js +34 -0
  27. package/dist/server/workspaceTasks/workspaceTasksErrors.js.map +1 -0
  28. package/dist/server/workspaceTasks/workspaceTasksGlobalCatalogAdapter.js +169 -0
  29. package/dist/server/workspaceTasks/workspaceTasksGlobalCatalogAdapter.js.map +1 -0
  30. package/dist/server/workspaceTasks/workspaceTasksGlobalMutationGate.js +75 -0
  31. package/dist/server/workspaceTasks/workspaceTasksGlobalMutationGate.js.map +1 -0
  32. package/dist/server/workspaceTasks/workspaceTasksMoveProtocol.js +313 -0
  33. package/dist/server/workspaceTasks/workspaceTasksMoveProtocol.js.map +1 -0
  34. package/dist/server/workspaceTasks/workspaceTasksMoveRegistry.js +352 -0
  35. package/dist/server/workspaceTasks/workspaceTasksMoveRegistry.js.map +1 -0
  36. package/dist/server/workspaceTasks/workspaceTasksProxyRoutes.js +63 -0
  37. package/dist/server/workspaceTasks/workspaceTasksProxyRoutes.js.map +1 -0
  38. package/dist/server/workspaceTasks/workspaceTasksRoutes.js +153 -0
  39. package/dist/server/workspaceTasks/workspaceTasksRoutes.js.map +1 -0
  40. package/dist/server/workspaceTasks/workspaceTasksWorkspaceCatalogAdapter.js +171 -0
  41. package/dist/server/workspaceTasks/workspaceTasksWorkspaceCatalogAdapter.js.map +1 -0
  42. package/dist/server/workspaceTasks/workspaceTasksWorkspaceFile.js +227 -0
  43. package/dist/server/workspaceTasks/workspaceTasksWorkspaceFile.js.map +1 -0
  44. package/dist/server/workspaceTasks/workspaceTasksWorkspacePathGate.js +42 -0
  45. package/dist/server/workspaceTasks/workspaceTasksWorkspacePathGate.js.map +1 -0
  46. package/dist/server/workspaces/fileContentService.js +116 -6
  47. package/dist/server/workspaces/fileContentService.js.map +1 -1
  48. package/dist/shared/apiTypes.d.ts +132 -0
  49. package/dist/shared/apiTypes.js.map +1 -1
  50. package/dist/shared/federatedRoutes.js +15 -0
  51. package/dist/shared/federatedRoutes.js.map +1 -1
  52. package/dist/shared/workspaceFiles.js +2 -0
  53. package/dist/shared/workspaceFiles.js.map +1 -1
  54. package/dist/shared/workspaceTasks.d.ts +53 -0
  55. package/dist/shared/workspaceTasks.js +203 -0
  56. package/dist/shared/workspaceTasks.js.map +1 -0
  57. package/dist/shared/workspaceTasksApi.js +379 -0
  58. package/dist/shared/workspaceTasksApi.js.map +1 -0
  59. package/docs/config.md +22 -4
  60. package/docs/plugins.md +24 -13
  61. package/package.json +1 -1
  62. package/dist/pi-webui-plugins/workspace-tasks/workspaceTasksClient.js +0 -242
@@ -0,0 +1,352 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+ import { serializeWorkspaceTasksConfig, } from "../../shared/workspaceTasks.js";
3
+ import { classifyWorkspaceTasksMovePair, sameWorkspaceTasksMoveContext, } from "./workspaceTasksMoveProtocol.js";
4
+ export class WorkspaceTasksMoveAuthorizationError extends Error {
5
+ constructor(message = "Workspace task move permit does not authorize this exact publication.") {
6
+ super(message);
7
+ this.code = "WORKSPACE_TASKS_MOVE_AUTHORIZATION";
8
+ this.name = "WorkspaceTasksMoveAuthorizationError";
9
+ }
10
+ }
11
+ export class WorkspaceTasksMoveInProgressError extends Error {
12
+ constructor() {
13
+ super("Another workspace task move is in progress.");
14
+ this.code = "WORKSPACE_TASKS_MOVE_IN_PROGRESS";
15
+ this.name = "WorkspaceTasksMoveInProgressError";
16
+ }
17
+ }
18
+ export class WorkspaceTasksMoveRecoveryPendingError extends Error {
19
+ constructor() {
20
+ super("Workspace task move recovery is pending. Refresh before changing the affected catalog.");
21
+ this.code = "WORKSPACE_TASKS_MOVE_RECOVERY_PENDING";
22
+ this.name = "WorkspaceTasksMoveRecoveryPendingError";
23
+ }
24
+ }
25
+ export class WorkspaceTasksMoveConflictError extends Error {
26
+ constructor(reason, message = conflictMessage(reason)) {
27
+ super(message);
28
+ this.code = "WORKSPACE_TASKS_MOVE_CONFLICT";
29
+ this.name = "WorkspaceTasksMoveConflictError";
30
+ this.reason = reason;
31
+ }
32
+ }
33
+ const permitRecords = new WeakMap();
34
+ /**
35
+ * Process-local authority for one machine-global destination-first move.
36
+ * Claims are intentionally not persisted; a new registry instance has no move
37
+ * provenance and therefore cannot authorize source removal.
38
+ */
39
+ export class MachineGlobalTasksMoveRegistry {
40
+ constructor(observationPort) {
41
+ this.observationPort = observationPort;
42
+ this.moveTail = Promise.resolve();
43
+ this.moveLockContext = new AsyncLocalStorage();
44
+ this.workspaceTails = new Map();
45
+ }
46
+ async withMoveLock(operationId, operation) {
47
+ if (typeof operationId !== "string" || operationId.trim() === "") {
48
+ throw new WorkspaceTasksMoveAuthorizationError("A move lock requires an operation ID.");
49
+ }
50
+ let releaseLock;
51
+ const previous = this.moveTail;
52
+ const current = new Promise((resolve) => {
53
+ releaseLock = resolve;
54
+ });
55
+ this.moveTail = previous.then(() => current);
56
+ await previous;
57
+ const lockToken = {};
58
+ this.activeMoveOperationId = operationId;
59
+ this.activeMoveLockToken = lockToken;
60
+ try {
61
+ return await this.moveLockContext.run(lockToken, operation);
62
+ }
63
+ finally {
64
+ this.clearPendingClaim(operationId);
65
+ this.activeMoveOperationId = undefined;
66
+ this.activeMoveLockToken = undefined;
67
+ releaseLock();
68
+ }
69
+ }
70
+ async run(address, operation) {
71
+ const key = addressKey(address);
72
+ const previous = this.workspaceTails.get(key) ?? Promise.resolve();
73
+ let releaseQueue;
74
+ const current = new Promise((resolve) => {
75
+ releaseQueue = resolve;
76
+ });
77
+ const queued = previous.then(() => current);
78
+ this.workspaceTails.set(key, queued);
79
+ await previous;
80
+ try {
81
+ return await operation();
82
+ }
83
+ finally {
84
+ releaseQueue();
85
+ if (this.workspaceTails.get(key) === queued)
86
+ this.workspaceTails.delete(key);
87
+ }
88
+ }
89
+ beginStart(plan) {
90
+ this.assertLock(plan, "start");
91
+ const existing = this.claim;
92
+ if (existing !== undefined) {
93
+ if (existing.operationId !== plan.operationId)
94
+ throw phaseError(existing);
95
+ if (!sameWorkspaceTasksMoveContext(existing.plan, plan)) {
96
+ throw new WorkspaceTasksMoveConflictError("unrecognized-state", "A live operation ID was reused for different move content.");
97
+ }
98
+ throw phaseError(existing);
99
+ }
100
+ const claimPlan = structuredClone(plan);
101
+ const ownerLockToken = this.activeMoveLockToken;
102
+ if (ownerLockToken === undefined) {
103
+ throw new WorkspaceTasksMoveAuthorizationError("Move permits can only be created inside their operation lock.");
104
+ }
105
+ const claim = {
106
+ operationId: claimPlan.operationId,
107
+ ownerLockToken,
108
+ address: { ...claimPlan.address },
109
+ plan: claimPlan,
110
+ phase: "destination-pending",
111
+ destinationOutcome: "pending",
112
+ permits: new Set(),
113
+ };
114
+ this.claim = claim;
115
+ return this.createPermit(claim, "start");
116
+ }
117
+ beginRetry(plan) {
118
+ this.assertLock(plan, "retry");
119
+ const claim = this.claim;
120
+ if (claim === undefined) {
121
+ throw new WorkspaceTasksMoveConflictError("unowned-intermediate-state", "The destination state has no live move claim.");
122
+ }
123
+ if (claim.operationId !== plan.operationId || !sameWorkspaceTasksMoveContext(claim.plan, plan)) {
124
+ throw new WorkspaceTasksMoveConflictError("unowned-intermediate-state", "The retry does not match the live move claim.");
125
+ }
126
+ if (claim.phase === "destination-pending")
127
+ throw new WorkspaceTasksMoveInProgressError();
128
+ const ownerLockToken = this.activeMoveLockToken;
129
+ if (ownerLockToken === undefined) {
130
+ throw new WorkspaceTasksMoveAuthorizationError("Move permits can only be created inside their operation lock.");
131
+ }
132
+ claim.ownerLockToken = ownerLockToken;
133
+ return this.createPermit(claim, "retry");
134
+ }
135
+ markDestinationWritten(permit) {
136
+ const record = this.requirePermit(permit);
137
+ if (record.purpose !== "start" || record.claim.phase !== "destination-pending") {
138
+ throw new WorkspaceTasksMoveAuthorizationError("Only a start permit can acknowledge its pending destination publication.");
139
+ }
140
+ record.claim.phase = "destination-written";
141
+ record.claim.destinationOutcome = "acknowledged";
142
+ }
143
+ markDestinationOutcomeUnknown(permit) {
144
+ const record = this.requirePermit(permit);
145
+ if (record.purpose === "start" && record.claim.phase === "destination-pending") {
146
+ record.claim.phase = "destination-written";
147
+ }
148
+ else if (record.claim.phase !== "destination-written") {
149
+ throw new WorkspaceTasksMoveAuthorizationError("An unknown move outcome requires a live destination-written claim.");
150
+ }
151
+ record.claim.destinationOutcome = "unknown";
152
+ }
153
+ release(permit) {
154
+ const record = this.requirePermit(permit);
155
+ const claim = record.claim;
156
+ if (this.claim !== claim) {
157
+ this.invalidatePermit(record);
158
+ return;
159
+ }
160
+ if (claim.destinationOutcome === "unknown")
161
+ return;
162
+ this.clearClaim(claim);
163
+ }
164
+ /**
165
+ * Clear a claim only after its owner has consumed an authoritative
166
+ * non-destination observation. Ordinary release retains unknown outcomes
167
+ * because it has no evidence that the destination write did not apply.
168
+ */
169
+ releaseAfterAuthoritativeObservation(permit) {
170
+ const record = this.requirePermit(permit);
171
+ const claim = record.claim;
172
+ if (this.claim !== claim) {
173
+ this.invalidatePermit(record);
174
+ return;
175
+ }
176
+ this.clearClaim(claim);
177
+ }
178
+ async reconcileGlobalMoveClaim(subject, permit) {
179
+ const claim = this.claim;
180
+ if (claim === undefined) {
181
+ if (permit !== undefined)
182
+ this.requirePermit(permit);
183
+ return;
184
+ }
185
+ const permitRecord = permit === undefined ? undefined : this.requirePermit(permit, claim);
186
+ if (claim.phase === "destination-pending")
187
+ return;
188
+ if (!isRelevantSubject(subject, claim))
189
+ return;
190
+ let observed;
191
+ try {
192
+ observed = await this.observationPort.observe(claim.address);
193
+ }
194
+ catch {
195
+ throw new WorkspaceTasksMoveRecoveryPendingError();
196
+ }
197
+ // A concurrent completion/replacement is allowed to change the live claim
198
+ // while observation is suspended, but an old read must never clear it.
199
+ if (this.claim !== claim) {
200
+ if (this.claim === undefined)
201
+ return;
202
+ throw new WorkspaceTasksMoveRecoveryPendingError();
203
+ }
204
+ if (!isAuthoritativePair(observed))
205
+ throw new WorkspaceTasksMoveRecoveryPendingError();
206
+ if (permitRecord === undefined && this.isActiveClaimLock(claim)) {
207
+ throw new WorkspaceTasksMoveRecoveryPendingError();
208
+ }
209
+ const state = classifyWorkspaceTasksMovePair(claim.plan, observed);
210
+ if (state === "complete") {
211
+ this.clearClaim(claim);
212
+ return;
213
+ }
214
+ if (state === "destination-applied") {
215
+ if (permitRecord !== undefined) {
216
+ claim.destinationOutcome = "acknowledged";
217
+ return;
218
+ }
219
+ throw new WorkspaceTasksMoveRecoveryPendingError();
220
+ }
221
+ this.clearClaim(claim);
222
+ throw new WorkspaceTasksMoveConflictError("unrecognized-state");
223
+ }
224
+ assertGlobalMutationAllowed(intent, permit) {
225
+ const claim = this.claim;
226
+ if (permit !== undefined) {
227
+ const record = this.requirePermit(permit, claim);
228
+ if (intent === undefined)
229
+ throw new WorkspaceTasksMoveAuthorizationError("A move permit requires an exact global write intent.");
230
+ this.assertPermitIntent(record, intent);
231
+ return;
232
+ }
233
+ if (intent !== undefined && claim !== undefined)
234
+ throw phaseError(claim);
235
+ }
236
+ assertWorkspaceMutationAllowed(address, intent, permit) {
237
+ const claim = this.claim;
238
+ if (permit !== undefined) {
239
+ const record = this.requirePermit(permit, claim);
240
+ if (intent === undefined)
241
+ throw new WorkspaceTasksMoveAuthorizationError("A move permit requires an exact workspace write intent.");
242
+ if (!sameAddress(intent.address, address)) {
243
+ throw new WorkspaceTasksMoveAuthorizationError();
244
+ }
245
+ this.assertPermitIntent(record, intent);
246
+ return;
247
+ }
248
+ if (intent !== undefined && claim !== undefined && sameAddress(claim.address, address))
249
+ throw phaseError(claim);
250
+ }
251
+ createPermit(claim, purpose) {
252
+ // The brand is declared in the server error contract and intentionally has no public runtime constructor.
253
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
254
+ const permit = Object.freeze({});
255
+ const record = { claim, purpose, active: true };
256
+ claim.permits.add(record);
257
+ permitRecords.set(permit, record);
258
+ return permit;
259
+ }
260
+ requirePermit(permit, claim) {
261
+ const candidate = permit;
262
+ if (typeof candidate !== "object" || candidate === null)
263
+ throw new WorkspaceTasksMoveAuthorizationError();
264
+ const record = permitRecords.get(candidate);
265
+ if (record?.active !== true) {
266
+ throw new WorkspaceTasksMoveAuthorizationError("The move permit is stale or belongs to another registry claim.");
267
+ }
268
+ if (record.claim !== this.claim || (claim !== undefined && record.claim !== claim)) {
269
+ throw new WorkspaceTasksMoveAuthorizationError("The move permit is stale or belongs to another registry claim.");
270
+ }
271
+ return record;
272
+ }
273
+ assertPermitIntent(record, intent) {
274
+ const claim = record.claim;
275
+ const expected = claim.phase === "destination-pending"
276
+ ? claim.plan.destinationWrite
277
+ : claim.destinationOutcome === "acknowledged"
278
+ ? claim.plan.sourceRemoval
279
+ : undefined;
280
+ if (expected === undefined || !sameIntent(expected, intent)) {
281
+ if (claim.phase === "destination-written" && claim.destinationOutcome === "unknown") {
282
+ throw new WorkspaceTasksMoveRecoveryPendingError();
283
+ }
284
+ throw new WorkspaceTasksMoveAuthorizationError();
285
+ }
286
+ }
287
+ assertLock(plan, expectedIntent) {
288
+ if (this.activeMoveOperationId === undefined || this.activeMoveOperationId !== plan.operationId
289
+ || this.activeMoveLockToken === undefined || this.moveLockContext.getStore() !== this.activeMoveLockToken) {
290
+ throw new WorkspaceTasksMoveAuthorizationError("Move permits can only be created inside their operation lock.");
291
+ }
292
+ if (plan.intent !== expectedIntent) {
293
+ throw new WorkspaceTasksMoveAuthorizationError(`Expected a ${expectedIntent} move request.`);
294
+ }
295
+ }
296
+ isActiveClaimLock(claim) {
297
+ return this.activeMoveOperationId === claim.operationId
298
+ && this.activeMoveLockToken !== undefined
299
+ && claim.ownerLockToken === this.activeMoveLockToken;
300
+ }
301
+ clearPendingClaim(operationId) {
302
+ const claim = this.claim;
303
+ if (claim?.operationId === operationId && claim.phase === "destination-pending") {
304
+ this.clearClaim(claim);
305
+ }
306
+ }
307
+ clearClaim(claim) {
308
+ if (this.claim !== claim)
309
+ return;
310
+ this.claim = undefined;
311
+ for (const permit of claim.permits)
312
+ this.invalidatePermit(permit);
313
+ claim.permits.clear();
314
+ }
315
+ invalidatePermit(record) {
316
+ record.active = false;
317
+ record.claim.permits.delete(record);
318
+ }
319
+ }
320
+ function sameIntent(left, right) {
321
+ if (left.scope !== right.scope || left.expectedRevision !== right.expectedRevision)
322
+ return false;
323
+ if (left.scope === "workspace" && right.scope === "workspace" && !sameAddress(left.address, right.address))
324
+ return false;
325
+ return canonicalConfig(left.config) === canonicalConfig(right.config);
326
+ }
327
+ function canonicalConfig(config) {
328
+ return serializeWorkspaceTasksConfig(config);
329
+ }
330
+ function sameAddress(left, right) {
331
+ return left.projectId === right.projectId && left.workspaceId === right.workspaceId;
332
+ }
333
+ function addressKey(address) {
334
+ return JSON.stringify([address.projectId, address.workspaceId]);
335
+ }
336
+ function isRelevantSubject(subject, claim) {
337
+ return subject.scope === "global" || sameAddress(subject.address, claim.address);
338
+ }
339
+ function isAuthoritativePair(value) {
340
+ return (value.workspace.kind === "loaded" || value.workspace.kind === "missing") && value.global.kind === "loaded";
341
+ }
342
+ function phaseError(claim) {
343
+ return claim.phase === "destination-pending"
344
+ ? new WorkspaceTasksMoveInProgressError()
345
+ : new WorkspaceTasksMoveRecoveryPendingError();
346
+ }
347
+ function conflictMessage(reason) {
348
+ return reason === "unowned-intermediate-state"
349
+ ? "The intermediate workspace task state has no live move claim and requires manual resolution."
350
+ : "The live move claim no longer matches the observed catalogs and requires manual resolution.";
351
+ }
352
+ //# sourceMappingURL=workspaceTasksMoveRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaceTasksMoveRegistry.js","sourceRoot":"","sources":["../../../src/server/workspaceTasks/workspaceTasksMoveRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAMrD,OAAO,EACL,6BAA6B,GAE9B,MAAM,gCAAgC,CAAC;AAQxC,OAAO,EACL,8BAA8B,EAC9B,6BAA6B,GAE9B,MAAM,iCAAiC,CAAC;AAIzC,MAAM,OAAO,oCAAqC,SAAQ,KAAK;IAG7D,YAAY,OAAO,GAAG,uEAAuE;QAC3F,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,SAAI,GAAG,oCAAoC,CAAC;QAInD,IAAI,CAAC,IAAI,GAAG,sCAAsC,CAAC;IACrD,CAAC;CACF;AAED,MAAM,OAAO,iCAAkC,SAAQ,KAAK;IAG1D;QACE,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAH9C,SAAI,GAAG,kCAAkC,CAAC;QAIjD,IAAI,CAAC,IAAI,GAAG,mCAAmC,CAAC;IAClD,CAAC;CACF;AAED,MAAM,OAAO,sCAAuC,SAAQ,KAAK;IAG/D;QACE,KAAK,CAAC,wFAAwF,CAAC,CAAC;QAHzF,SAAI,GAAG,uCAAuC,CAAC;QAItD,IAAI,CAAC,IAAI,GAAG,wCAAwC,CAAC;IACvD,CAAC;CACF;AAID,MAAM,OAAO,+BAAgC,SAAQ,KAAK;IAIxD,YAAY,MAAwC,EAAE,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC;QACrF,KAAK,CAAC,OAAO,CAAC,CAAC;QAJR,SAAI,GAAG,+BAA+B,CAAC;QAK9C,IAAI,CAAC,IAAI,GAAG,iCAAiC,CAAC;QAC9C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAkBD,MAAM,aAAa,GAAG,IAAI,OAAO,EAAwB,CAAC;AAE1D;;;;GAIG;AACH,MAAM,OAAO,8BAA8B;IAQzC,YAA6B,eAAkD;QAAlD,oBAAe,GAAf,eAAe,CAAmC;QANvE,aAAQ,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;QAGnC,oBAAe,GAAG,IAAI,iBAAiB,EAAU,CAAC;QAClD,mBAAc,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEe,CAAC;IAEnF,KAAK,CAAC,YAAY,CAAI,WAAmB,EAAE,SAA2B;QACpE,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACjE,MAAM,IAAI,oCAAoC,CAAC,uCAAuC,CAAC,CAAC;QAC1F,CAAC;QACD,IAAI,WAAwB,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAC5C,WAAW,GAAG,OAAO,CAAC;QACxB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,QAAQ,CAAC;QAEf,MAAM,SAAS,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,qBAAqB,GAAG,WAAW,CAAC;QACzC,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;QACrC,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC9D,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;YACpC,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;YACvC,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;YACrC,WAAW,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAI,OAAgC,EAAE,SAA2B;QACxE,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACnE,IAAI,YAAyB,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAC5C,YAAY,GAAG,OAAO,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,QAAQ,CAAC;QACf,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,EAAE,CAAC;QAC3B,CAAC;gBAAS,CAAC;YACT,YAAY,EAAE,CAAC;YACf,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,MAAM;gBAAE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,UAAU,CAAC,IAA4B;QACrC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,QAAQ,CAAC,WAAW,KAAK,IAAI,CAAC,WAAW;gBAAE,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC1E,IAAI,CAAC,6BAA6B,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;gBACxD,MAAM,IAAI,+BAA+B,CAAC,oBAAoB,EAAE,4DAA4D,CAAC,CAAC;YAChI,CAAC;YACD,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;QAED,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC;QAChD,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,oCAAoC,CAAC,+DAA+D,CAAC,CAAC;QAClH,CAAC;QACD,MAAM,KAAK,GAAc;YACvB,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,cAAc;YACd,OAAO,EAAE,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE;YACjC,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,qBAAqB;YAC5B,kBAAkB,EAAE,SAAS;YAC7B,OAAO,EAAE,IAAI,GAAG,EAAE;SACnB,CAAC;QACF,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,UAAU,CAAC,IAA4B;QACrC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,+BAA+B,CAAC,4BAA4B,EAAE,+CAA+C,CAAC,CAAC;QAC3H,CAAC;QACD,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI,CAAC,WAAW,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YAC/F,MAAM,IAAI,+BAA+B,CAAC,4BAA4B,EAAE,+CAA+C,CAAC,CAAC;QAC3H,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,KAAK,qBAAqB;YAAE,MAAM,IAAI,iCAAiC,EAAE,CAAC;QACzF,MAAM,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC;QAChD,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,oCAAoC,CAAC,+DAA+D,CAAC,CAAC;QAClH,CAAC;QACD,KAAK,CAAC,cAAc,GAAG,cAAc,CAAC;QACtC,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,sBAAsB,CAAC,MAAgC;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,qBAAqB,EAAE,CAAC;YAC/E,MAAM,IAAI,oCAAoC,CAAC,0EAA0E,CAAC,CAAC;QAC7H,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,qBAAqB,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,kBAAkB,GAAG,cAAc,CAAC;IACnD,CAAC;IAED,6BAA6B,CAAC,MAAgC;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,qBAAqB,EAAE,CAAC;YAC/E,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,qBAAqB,CAAC;QAC7C,CAAC;aAAM,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,qBAAqB,EAAE,CAAC;YACxD,MAAM,IAAI,oCAAoC,CAAC,oEAAoE,CAAC,CAAC;QACvH,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAC9C,CAAC;IAED,OAAO,CAAC,MAAgC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,kBAAkB,KAAK,SAAS;YAAE,OAAO;QACnD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACH,oCAAoC,CAAC,MAAgC;QACnE,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,wBAAwB,CAC5B,OAAsC,EACtC,MAAiC;QAEjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC1F,IAAI,KAAK,CAAC,KAAK,KAAK,qBAAqB;YAAE,OAAO;QAClD,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC;YAAE,OAAO;QAE/C,IAAI,QAGH,CAAC;QACF,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,sCAAsC,EAAE,CAAC;QACrD,CAAC;QAED,0EAA0E;QAC1E,uEAAuE;QACvE,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;gBAAE,OAAO;YACrC,MAAM,IAAI,sCAAsC,EAAE,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC;YAAE,MAAM,IAAI,sCAAsC,EAAE,CAAC;QACvF,IAAI,YAAY,KAAK,SAAS,IAAI,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,sCAAsC,EAAE,CAAC;QACrD,CAAC;QAED,MAAM,KAAK,GAAG,8BAA8B,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACnE,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;YACzB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACvB,OAAO;QACT,CAAC;QACD,IAAI,KAAK,KAAK,qBAAqB,EAAE,CAAC;YACpC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gBAC/B,KAAK,CAAC,kBAAkB,GAAG,cAAc,CAAC;gBAC1C,OAAO;YACT,CAAC;YACD,MAAM,IAAI,sCAAsC,EAAE,CAAC;QACrD,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACvB,MAAM,IAAI,+BAA+B,CAAC,oBAAoB,CAAC,CAAC;IAClE,CAAC;IAED,2BAA2B,CACzB,MAAoE,EACpE,MAAiC;QAEjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACjD,IAAI,MAAM,KAAK,SAAS;gBAAE,MAAM,IAAI,oCAAoC,CAAC,sDAAsD,CAAC,CAAC;YACjI,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QACD,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IAC3E,CAAC;IAED,8BAA8B,CAC5B,OAAgC,EAChC,MAAuE,EACvE,MAAiC;QAEjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACjD,IAAI,MAAM,KAAK,SAAS;gBAAE,MAAM,IAAI,oCAAoC,CAAC,yDAAyD,CAAC,CAAC;YACpI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC1C,MAAM,IAAI,oCAAoC,EAAE,CAAC;YACnD,CAAC;YACD,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QACD,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;YAAE,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IAClH,CAAC;IAEO,YAAY,CAAC,KAAgB,EAAE,OAA0B;QAC/D,0GAA0G;QAC1G,yEAAyE;QACzE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAA6B,CAAC;QAC7D,MAAM,MAAM,GAAiB,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC9D,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1B,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAClC,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,aAAa,CAAC,MAAgC,EAAE,KAAiB;QACvE,MAAM,SAAS,GAAY,MAAM,CAAC;QAClC,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI;YAAE,MAAM,IAAI,oCAAoC,EAAE,CAAC;QAC1G,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,MAAM,EAAE,MAAM,KAAK,IAAI,EAAE,CAAC;YAC5B,MAAM,IAAI,oCAAoC,CAAC,gEAAgE,CAAC,CAAC;QACnH,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,CAAC;YACnF,MAAM,IAAI,oCAAoC,CAAC,gEAAgE,CAAC,CAAC;QACnH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,kBAAkB,CAAC,MAAoB,EAAE,MAAqC;QACpF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,KAAK,qBAAqB;YACpD,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB;YAC7B,CAAC,CAAC,KAAK,CAAC,kBAAkB,KAAK,cAAc;gBAC3C,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa;gBAC1B,CAAC,CAAC,SAAS,CAAC;QAChB,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;YAC5D,IAAI,KAAK,CAAC,KAAK,KAAK,qBAAqB,IAAI,KAAK,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;gBACpF,MAAM,IAAI,sCAAsC,EAAE,CAAC;YACrD,CAAC;YACD,MAAM,IAAI,oCAAoC,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,IAA4B,EAAE,cAAiC;QAChF,IAAI,IAAI,CAAC,qBAAqB,KAAK,SAAS,IAAI,IAAI,CAAC,qBAAqB,KAAK,IAAI,CAAC,WAAW;eAC1F,IAAI,CAAC,mBAAmB,KAAK,SAAS,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC5G,MAAM,IAAI,oCAAoC,CAAC,+DAA+D,CAAC,CAAC;QAClH,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;YACnC,MAAM,IAAI,oCAAoC,CAAC,cAAc,cAAc,gBAAgB,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,KAAgB;QACxC,OAAO,IAAI,CAAC,qBAAqB,KAAK,KAAK,CAAC,WAAW;eAClD,IAAI,CAAC,mBAAmB,KAAK,SAAS;eACtC,KAAK,CAAC,cAAc,KAAK,IAAI,CAAC,mBAAmB,CAAC;IACzD,CAAC;IAEO,iBAAiB,CAAC,WAAmB;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,KAAK,EAAE,WAAW,KAAK,WAAW,IAAI,KAAK,CAAC,KAAK,KAAK,qBAAqB,EAAE,CAAC;YAChF,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,KAAgB;QACjC,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK;YAAE,OAAO;QACjC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO;YAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAClE,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAEO,gBAAgB,CAAC,MAAoB;QAC3C,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;QACtB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;CACF;AAED,SAAS,UAAU,CAAC,IAAmC,EAAE,KAAoC;IAC3F,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,gBAAgB,KAAK,KAAK,CAAC,gBAAgB;QAAE,OAAO,KAAK,CAAC;IACjG,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,IAAI,KAAK,CAAC,KAAK,KAAK,WAAW,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACzH,OAAO,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,eAAe,CAAC,MAA4B;IACnD,OAAO,6BAA6B,CAAC,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,WAAW,CAAC,IAA6B,EAAE,KAA8B;IAChF,OAAO,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW,CAAC;AACtF,CAAC;AAED,SAAS,UAAU,CAAC,OAAgC;IAClD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAsC,EAAE,KAAgB;IACjF,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,mBAAmB,CAAC,KAG5B;IACC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC;AACrH,CAAC;AAED,SAAS,UAAU,CAAC,KAAgB;IAClC,OAAO,KAAK,CAAC,KAAK,KAAK,qBAAqB;QAC1C,CAAC,CAAC,IAAI,iCAAiC,EAAE;QACzC,CAAC,CAAC,IAAI,sCAAsC,EAAE,CAAC;AACnD,CAAC;AAED,SAAS,eAAe,CAAC,MAAwC;IAC/D,OAAO,MAAM,KAAK,4BAA4B;QAC5C,CAAC,CAAC,8FAA8F;QAChG,CAAC,CAAC,6FAA6F,CAAC;AACpG,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { WORKSPACE_TASKS_FEDERATED_HTTP_ROUTES } from "../../shared/federatedRoutes.js";
2
+ import { parseMoveWorkspaceTaskRequest, parseReplaceGlobalWorkspaceTasksRequest, parseReplaceWorkspaceTasksRequest, WORKSPACE_TASKS_MOVE_BODY_LIMIT_BYTES, WORKSPACE_TASKS_REPLACE_BODY_LIMIT_BYTES, } from "../../shared/workspaceTasksApi.js";
3
+ import { proxyMachineHttpRequest } from "../machines/machineProxyRoutes.js";
4
+ import { MachineService } from "../machines/machineService.js";
5
+ const INVALID_BODY_MESSAGE = "Workspace task request body is invalid.";
6
+ const BODY_TOO_LARGE_MESSAGE = "Workspace task request body is too large.";
7
+ const [getWorkspaceTasksSpec, putWorkspaceTasksSpec, moveWorkspaceTasksSpec, getGlobalWorkspaceTasksSpec, putGlobalWorkspaceTasksSpec,] = WORKSPACE_TASKS_FEDERATED_HTTP_ROUTES;
8
+ export function registerWorkspaceTasksProxyRoutes(app, machines = new MachineService()) {
9
+ const workspacePath = "/api/machines/:machineId/projects/:projectId/workspaces/:workspaceId/workspace-tasks";
10
+ const globalPath = "/api/machines/:machineId/workspace-tasks/global";
11
+ app.get(workspacePath, (request, reply) => (proxyMachineHttpRequest(machines, getWorkspaceTasksSpec, request.params.machineId, request.method, request.url, undefined, request.headers["content-type"], reply)));
12
+ app.put(workspacePath, {
13
+ bodyLimit: WORKSPACE_TASKS_REPLACE_BODY_LIMIT_BYTES,
14
+ errorHandler: taskProxyBodyErrorHandler,
15
+ }, (request, reply) => {
16
+ try {
17
+ const body = parseReplaceWorkspaceTasksRequest(request.body);
18
+ return proxyMachineHttpRequest(machines, putWorkspaceTasksSpec, request.params.machineId, request.method, request.url, body, request.headers["content-type"], reply);
19
+ }
20
+ catch (error) {
21
+ return reply.code(400).send(validationFailure(errorMessage(error)));
22
+ }
23
+ });
24
+ app.post(`${workspacePath}/move`, {
25
+ bodyLimit: WORKSPACE_TASKS_MOVE_BODY_LIMIT_BYTES,
26
+ errorHandler: taskProxyBodyErrorHandler,
27
+ }, (request, reply) => {
28
+ try {
29
+ const body = parseMoveWorkspaceTaskRequest(request.body);
30
+ return proxyMachineHttpRequest(machines, moveWorkspaceTasksSpec, request.params.machineId, request.method, request.url, body, request.headers["content-type"], reply);
31
+ }
32
+ catch (error) {
33
+ return reply.code(400).send(validationFailure(errorMessage(error)));
34
+ }
35
+ });
36
+ app.get(globalPath, (request, reply) => (proxyMachineHttpRequest(machines, getGlobalWorkspaceTasksSpec, request.params.machineId, request.method, request.url, undefined, request.headers["content-type"], reply)));
37
+ app.put(globalPath, {
38
+ bodyLimit: WORKSPACE_TASKS_REPLACE_BODY_LIMIT_BYTES,
39
+ errorHandler: taskProxyBodyErrorHandler,
40
+ }, (request, reply) => {
41
+ try {
42
+ const body = parseReplaceGlobalWorkspaceTasksRequest(request.body);
43
+ return proxyMachineHttpRequest(machines, putGlobalWorkspaceTasksSpec, request.params.machineId, request.method, request.url, body, request.headers["content-type"], reply);
44
+ }
45
+ catch (error) {
46
+ return reply.code(400).send(validationFailure(errorMessage(error)));
47
+ }
48
+ });
49
+ }
50
+ function taskProxyBodyErrorHandler(error, _request, reply) {
51
+ if (error.code === "FST_ERR_CTP_BODY_TOO_LARGE") {
52
+ reply.code(413).send(validationFailure(BODY_TOO_LARGE_MESSAGE));
53
+ return;
54
+ }
55
+ reply.code(400).send(validationFailure(INVALID_BODY_MESSAGE));
56
+ }
57
+ function validationFailure(message) {
58
+ return { kind: "validation", message };
59
+ }
60
+ function errorMessage(error) {
61
+ return error instanceof Error ? error.message : String(error);
62
+ }
63
+ //# sourceMappingURL=workspaceTasksProxyRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaceTasksProxyRoutes.js","sourceRoot":"","sources":["../../../src/server/workspaceTasks/workspaceTasksProxyRoutes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,153 @@
1
+ import { parseMoveWorkspaceTaskRequest, parseReplaceGlobalWorkspaceTasksRequest, parseReplaceWorkspaceTasksRequest, WORKSPACE_TASKS_MOVE_BODY_LIMIT_BYTES, WORKSPACE_TASKS_REPLACE_BODY_LIMIT_BYTES, } from "../../shared/workspaceTasksApi.js";
2
+ import { WorkspaceTasksInvalidCatalogError, WorkspaceTasksRevisionConflictError, WorkspaceTasksUnavailableError, WorkspaceTasksUnknownOutcomeError, } from "./workspaceTasksErrors.js";
3
+ import { WorkspaceTasksMoveAuthorizationError, WorkspaceTasksMoveConflictError, WorkspaceTasksMoveInProgressError, WorkspaceTasksMoveRecoveryPendingError, } from "./workspaceTasksMoveRegistry.js";
4
+ const UNKNOWN_WRITE_MESSAGE = "Workspace task write outcome is unknown. Refresh before trying again.";
5
+ const UNAVAILABLE_MESSAGE = "Workspace task operation is unavailable. Try again.";
6
+ const INVALID_BODY_MESSAGE = "Workspace task request body is invalid.";
7
+ const BODY_TOO_LARGE_MESSAGE = "Workspace task request body is too large.";
8
+ export function registerWorkspaceTasksRoutes(app, service, prefix = "/api") {
9
+ const workspacePath = `${prefix}/projects/:projectId/workspaces/:workspaceId/workspace-tasks`;
10
+ app.get(workspacePath, async (request, reply) => {
11
+ try {
12
+ return await service.readWorkspace({ projectId: request.params.projectId, workspaceId: request.params.workspaceId });
13
+ }
14
+ catch (error) {
15
+ return sendReadError(reply, error);
16
+ }
17
+ });
18
+ app.put(workspacePath, {
19
+ bodyLimit: WORKSPACE_TASKS_REPLACE_BODY_LIMIT_BYTES,
20
+ errorHandler: taskRouteBodyErrorHandler,
21
+ }, async (request, reply) => {
22
+ let input;
23
+ try {
24
+ input = parseReplaceWorkspaceTasksRequest(request.body);
25
+ }
26
+ catch (error) {
27
+ return reply.code(400).send(validationFailure(errorMessage(error)));
28
+ }
29
+ try {
30
+ return await service.replaceWorkspace({ projectId: request.params.projectId, workspaceId: request.params.workspaceId, ...input });
31
+ }
32
+ catch (error) {
33
+ return sendWriteError(reply, error);
34
+ }
35
+ });
36
+ app.post(`${workspacePath}/move`, {
37
+ bodyLimit: WORKSPACE_TASKS_MOVE_BODY_LIMIT_BYTES,
38
+ errorHandler: taskRouteBodyErrorHandler,
39
+ }, async (request, reply) => {
40
+ let input;
41
+ try {
42
+ input = parseMoveWorkspaceTaskRequest(request.body);
43
+ }
44
+ catch (error) {
45
+ return reply.code(400).send(validationFailure(errorMessage(error)));
46
+ }
47
+ try {
48
+ const result = await service.move({ projectId: request.params.projectId, workspaceId: request.params.workspaceId, ...input });
49
+ return await sendMoveResult(reply, result);
50
+ }
51
+ catch (error) {
52
+ return sendWriteError(reply, error);
53
+ }
54
+ });
55
+ const globalPath = `${prefix}/workspace-tasks/global`;
56
+ app.get(globalPath, async (_request, reply) => {
57
+ try {
58
+ return await service.readGlobal();
59
+ }
60
+ catch (error) {
61
+ return sendReadError(reply, error);
62
+ }
63
+ });
64
+ app.put(globalPath, {
65
+ bodyLimit: WORKSPACE_TASKS_REPLACE_BODY_LIMIT_BYTES,
66
+ errorHandler: taskRouteBodyErrorHandler,
67
+ }, async (request, reply) => {
68
+ let input;
69
+ try {
70
+ input = parseReplaceGlobalWorkspaceTasksRequest(request.body);
71
+ }
72
+ catch (error) {
73
+ return reply.code(400).send(validationFailure(errorMessage(error)));
74
+ }
75
+ try {
76
+ return await service.replaceGlobal(input);
77
+ }
78
+ catch (error) {
79
+ return sendWriteError(reply, error);
80
+ }
81
+ });
82
+ }
83
+ function sendReadError(reply, error) {
84
+ if (error instanceof WorkspaceTasksMoveRecoveryPendingError || error instanceof WorkspaceTasksMoveInProgressError) {
85
+ return reply.code(409).send(conflictFailure(error instanceof WorkspaceTasksMoveRecoveryPendingError ? "move-recovery-pending" : "move-in-progress", error.message));
86
+ }
87
+ return reply.code(503).send(unavailableFailure(error instanceof WorkspaceTasksUnavailableError ? error.message : UNAVAILABLE_MESSAGE));
88
+ }
89
+ function sendWriteError(reply, error) {
90
+ if (error instanceof WorkspaceTasksRevisionConflictError) {
91
+ return reply.code(409).send(conflictFailure("revision-conflict", error.message));
92
+ }
93
+ if (error instanceof WorkspaceTasksInvalidCatalogError) {
94
+ return reply.code(409).send(conflictFailure("invalid-catalog", error.message));
95
+ }
96
+ if (error instanceof WorkspaceTasksMoveRecoveryPendingError) {
97
+ return reply.code(409).send(conflictFailure("move-recovery-pending", error.message));
98
+ }
99
+ if (error instanceof WorkspaceTasksMoveInProgressError) {
100
+ return reply.code(409).send(conflictFailure("move-in-progress", error.message));
101
+ }
102
+ if (error instanceof WorkspaceTasksMoveConflictError) {
103
+ const reason = error.reason === "unrecognized-state"
104
+ ? "unowned-intermediate-state"
105
+ : error.reason;
106
+ return reply.code(409).send(conflictFailure(reason, error.message));
107
+ }
108
+ if (error instanceof WorkspaceTasksUnavailableError || error instanceof WorkspaceTasksMoveAuthorizationError) {
109
+ return reply.code(503).send(unavailableFailure(error instanceof WorkspaceTasksUnavailableError ? error.message : UNAVAILABLE_MESSAGE));
110
+ }
111
+ if (error instanceof WorkspaceTasksUnknownOutcomeError) {
112
+ return reply.code(500).send(unknownOutcomeFailure(error.message));
113
+ }
114
+ return reply.code(500).send(unknownOutcomeFailure(UNKNOWN_WRITE_MESSAGE));
115
+ }
116
+ function sendMoveResult(reply, result) {
117
+ switch (result.kind) {
118
+ case "completed":
119
+ return result;
120
+ case "partial":
121
+ case "conflict":
122
+ return reply.code(409).send(result);
123
+ case "validation":
124
+ return reply.code(400).send(result);
125
+ case "unavailable":
126
+ return reply.code(503).send(result);
127
+ case "unknown-outcome":
128
+ return reply.code(500).send(result);
129
+ }
130
+ }
131
+ function taskRouteBodyErrorHandler(error, _request, reply) {
132
+ if (error.code === "FST_ERR_CTP_BODY_TOO_LARGE") {
133
+ reply.code(413).send(validationFailure(BODY_TOO_LARGE_MESSAGE));
134
+ return;
135
+ }
136
+ reply.code(400).send(validationFailure(INVALID_BODY_MESSAGE));
137
+ }
138
+ function validationFailure(message) {
139
+ return { kind: "validation", message };
140
+ }
141
+ function conflictFailure(reason, message) {
142
+ return { kind: "conflict", reason, message };
143
+ }
144
+ function unavailableFailure(message) {
145
+ return { kind: "unavailable", message, retryable: true };
146
+ }
147
+ function unknownOutcomeFailure(message) {
148
+ return { kind: "unknown-outcome", message };
149
+ }
150
+ function errorMessage(error) {
151
+ return error instanceof Error ? error.message : String(error);
152
+ }
153
+ //# sourceMappingURL=workspaceTasksRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaceTasksRoutes.js","sourceRoot":"","sources":["../../../src/server/workspaceTasks/workspaceTasksRoutes.ts"],"names":[],"mappings":"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"}