@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.
- package/dist/client/assets/{CodeViewer-CHZziPur.js → CodeViewer-CCHq9DpL.js} +1 -1
- package/dist/client/assets/{UnifiedDiffViewer-j1-AFZ8f.js → UnifiedDiffViewer-JFQMCnzP.js} +1 -1
- package/dist/client/assets/{index-2RMTbgnM.js → index-WjewjFVt.js} +469 -469
- package/dist/client/index.html +1 -1
- package/dist/config.js +10 -0
- package/dist/config.js.map +1 -1
- package/dist/configMutationCoordinator.js +10 -1
- package/dist/configMutationCoordinator.js.map +1 -1
- package/dist/pi-webui-plugins/workspace-tasks/config.js +3 -132
- package/dist/pi-webui-plugins/workspace-tasks/pi-webui-plugin.js +14 -2
- package/dist/pi-webui-plugins/workspace-tasks/taskDomain.js +203 -0
- package/dist/pi-webui-plugins/workspace-tasks/taskRunner.js +3 -2
- package/dist/pi-webui-plugins/workspace-tasks/tasksPanelElement.js +947 -673
- package/dist/server/app.js +20 -4
- package/dist/server/app.js.map +1 -1
- package/dist/server/configRoutes.js +5 -0
- package/dist/server/configRoutes.js.map +1 -1
- package/dist/server/machines/machineProxyRoutes.js +4 -4
- package/dist/server/machines/machineProxyRoutes.js.map +1 -1
- package/dist/server/workspaceExplorerRoutes.js +64 -4
- package/dist/server/workspaceExplorerRoutes.js.map +1 -1
- package/dist/server/workspaceTasks/workspaceTasksCatalogService.js +318 -0
- package/dist/server/workspaceTasks/workspaceTasksCatalogService.js.map +1 -0
- package/dist/server/workspaceTasks/workspaceTasksComposition.js +67 -0
- package/dist/server/workspaceTasks/workspaceTasksComposition.js.map +1 -0
- package/dist/server/workspaceTasks/workspaceTasksErrors.js +34 -0
- package/dist/server/workspaceTasks/workspaceTasksErrors.js.map +1 -0
- package/dist/server/workspaceTasks/workspaceTasksGlobalCatalogAdapter.js +169 -0
- package/dist/server/workspaceTasks/workspaceTasksGlobalCatalogAdapter.js.map +1 -0
- package/dist/server/workspaceTasks/workspaceTasksGlobalMutationGate.js +75 -0
- package/dist/server/workspaceTasks/workspaceTasksGlobalMutationGate.js.map +1 -0
- package/dist/server/workspaceTasks/workspaceTasksMoveProtocol.js +313 -0
- package/dist/server/workspaceTasks/workspaceTasksMoveProtocol.js.map +1 -0
- package/dist/server/workspaceTasks/workspaceTasksMoveRegistry.js +352 -0
- package/dist/server/workspaceTasks/workspaceTasksMoveRegistry.js.map +1 -0
- package/dist/server/workspaceTasks/workspaceTasksProxyRoutes.js +63 -0
- package/dist/server/workspaceTasks/workspaceTasksProxyRoutes.js.map +1 -0
- package/dist/server/workspaceTasks/workspaceTasksRoutes.js +153 -0
- package/dist/server/workspaceTasks/workspaceTasksRoutes.js.map +1 -0
- package/dist/server/workspaceTasks/workspaceTasksWorkspaceCatalogAdapter.js +171 -0
- package/dist/server/workspaceTasks/workspaceTasksWorkspaceCatalogAdapter.js.map +1 -0
- package/dist/server/workspaceTasks/workspaceTasksWorkspaceFile.js +227 -0
- package/dist/server/workspaceTasks/workspaceTasksWorkspaceFile.js.map +1 -0
- package/dist/server/workspaceTasks/workspaceTasksWorkspacePathGate.js +42 -0
- package/dist/server/workspaceTasks/workspaceTasksWorkspacePathGate.js.map +1 -0
- package/dist/server/workspaces/fileContentService.js +116 -6
- package/dist/server/workspaces/fileContentService.js.map +1 -1
- package/dist/shared/apiTypes.d.ts +132 -0
- package/dist/shared/apiTypes.js.map +1 -1
- package/dist/shared/federatedRoutes.js +15 -0
- package/dist/shared/federatedRoutes.js.map +1 -1
- package/dist/shared/workspaceFiles.js +2 -0
- package/dist/shared/workspaceFiles.js.map +1 -1
- package/dist/shared/workspaceTasks.d.ts +53 -0
- package/dist/shared/workspaceTasks.js +203 -0
- package/dist/shared/workspaceTasks.js.map +1 -0
- package/dist/shared/workspaceTasksApi.js +379 -0
- package/dist/shared/workspaceTasksApi.js.map +1 -0
- package/docs/config.md +22 -4
- package/docs/plugins.md +24 -13
- package/package.json +1 -1
- package/dist/pi-webui-plugins/workspace-tasks/workspaceTasksClient.js +0 -242
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import { WorkspaceTasksInvalidCatalogError, WorkspaceTasksRevisionConflictError, WorkspaceTasksUnavailableError, WorkspaceTasksUnknownOutcomeError, } from "./workspaceTasksErrors.js";
|
|
2
|
+
import { WorkspaceTasksMoveConflictError, WorkspaceTasksMoveInProgressError, WorkspaceTasksMoveRecoveryPendingError, } from "./workspaceTasksMoveRegistry.js";
|
|
3
|
+
import { classifyWorkspaceTasksMovePair, deriveWorkspaceTasksMovePlan, WorkspaceTasksMoveValidationError, } from "./workspaceTasksMoveProtocol.js";
|
|
4
|
+
const UNKNOWN_OUTCOME_MESSAGE = new WorkspaceTasksUnknownOutcomeError().message;
|
|
5
|
+
export function createWorkspaceTasksCatalogService(deps) {
|
|
6
|
+
const { globalAdapter, workspaceAdapter, registry } = deps;
|
|
7
|
+
return {
|
|
8
|
+
readWorkspace(address) {
|
|
9
|
+
return workspaceAdapter.read(address);
|
|
10
|
+
},
|
|
11
|
+
replaceWorkspace(input) {
|
|
12
|
+
const { projectId, workspaceId, expectedRevision, config } = input;
|
|
13
|
+
return workspaceAdapter.replace({ projectId, workspaceId }, { expectedRevision, config });
|
|
14
|
+
},
|
|
15
|
+
readGlobal() {
|
|
16
|
+
return globalAdapter.read();
|
|
17
|
+
},
|
|
18
|
+
replaceGlobal(input) {
|
|
19
|
+
return globalAdapter.replace(input);
|
|
20
|
+
},
|
|
21
|
+
async move(input) {
|
|
22
|
+
let plan;
|
|
23
|
+
try {
|
|
24
|
+
plan = deriveWorkspaceTasksMovePlan({ projectId: input.projectId, workspaceId: input.workspaceId }, {
|
|
25
|
+
operationId: input.operationId,
|
|
26
|
+
intent: input.intent,
|
|
27
|
+
source: input.source,
|
|
28
|
+
destination: input.destination,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
return resultFromMoveError(error);
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
return await registry.withMoveLock(plan.operationId, () => executeMove(plan));
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
return resultFromMoveError(error);
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
async function executeMove(plan) {
|
|
43
|
+
const reconciliation = await reconcileExistingClaim();
|
|
44
|
+
const before = await readBeforeMove(plan.address);
|
|
45
|
+
if (before.kind === "result")
|
|
46
|
+
return before.result;
|
|
47
|
+
const state = classifyWorkspaceTasksMovePair(plan, before.observed);
|
|
48
|
+
if (reconciliation.kind === "conflict") {
|
|
49
|
+
if (plan.intent === "retry" && state === "pristine")
|
|
50
|
+
return retryPristineResult();
|
|
51
|
+
return conflictResult(reconciliation.error.reason, reconciliation.error.message);
|
|
52
|
+
}
|
|
53
|
+
if (reconciliation.kind === "recovery-pending") {
|
|
54
|
+
if (state === "destination-applied") {
|
|
55
|
+
if (plan.intent === "start")
|
|
56
|
+
return partialResult(plan, before.observed);
|
|
57
|
+
let permit;
|
|
58
|
+
try {
|
|
59
|
+
permit = registry.beginRetry(asRetryPlan(plan));
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
return resultFromMoveError(error);
|
|
63
|
+
}
|
|
64
|
+
return removeSource(plan, permit);
|
|
65
|
+
}
|
|
66
|
+
if (state === "complete") {
|
|
67
|
+
try {
|
|
68
|
+
await registry.reconcileGlobalMoveClaim({ scope: "global" });
|
|
69
|
+
return completedResult(plan, before.observed);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
return resultFromMoveError(error);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return conflictResult("move-in-progress", reconciliation.error.message);
|
|
76
|
+
}
|
|
77
|
+
switch (state) {
|
|
78
|
+
case "complete":
|
|
79
|
+
return completedResult(plan, before.observed);
|
|
80
|
+
case "pristine":
|
|
81
|
+
if (plan.intent === "retry")
|
|
82
|
+
return retryPristineResult();
|
|
83
|
+
return startMove(plan);
|
|
84
|
+
case "destination-applied":
|
|
85
|
+
return conflictResult("unowned-intermediate-state", "The destination state has no live move claim.");
|
|
86
|
+
case "unrecognized":
|
|
87
|
+
return hasDestinationCollision(plan, before.observed)
|
|
88
|
+
? conflictResult("destination-collision", "The destination task ID is already in use.")
|
|
89
|
+
: conflictResult("source-changed", "Workspace task catalogs changed. Refresh before moving this task.");
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async function reconcileExistingClaim() {
|
|
93
|
+
try {
|
|
94
|
+
await registry.reconcileGlobalMoveClaim({ scope: "global" });
|
|
95
|
+
return { kind: "clear" };
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
if (error instanceof WorkspaceTasksMoveRecoveryPendingError) {
|
|
99
|
+
return { kind: "recovery-pending", error };
|
|
100
|
+
}
|
|
101
|
+
if (error instanceof WorkspaceTasksMoveConflictError) {
|
|
102
|
+
return { kind: "conflict", error };
|
|
103
|
+
}
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async function startMove(plan) {
|
|
108
|
+
const permit = registry.beginStart(plan);
|
|
109
|
+
const destinationState = { value: "pending" };
|
|
110
|
+
const options = {
|
|
111
|
+
permit,
|
|
112
|
+
onWriteAcknowledged: () => {
|
|
113
|
+
destinationState.value = "acknowledged";
|
|
114
|
+
registry.markDestinationWritten(permit);
|
|
115
|
+
},
|
|
116
|
+
onWriteOutcomeUnknown: () => {
|
|
117
|
+
destinationState.value = "unknown";
|
|
118
|
+
registry.markDestinationOutcomeUnknown(permit);
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
try {
|
|
122
|
+
await writeIntent(plan.destinationWrite, options);
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
if (destinationState.value === "pending")
|
|
126
|
+
return resultFromMoveError(error);
|
|
127
|
+
return handleDestinationFailure(plan, permit, destinationState.value === "unknown");
|
|
128
|
+
}
|
|
129
|
+
const verification = await readAfterWrite(plan.address);
|
|
130
|
+
if (verification.kind === "result")
|
|
131
|
+
return verification.result;
|
|
132
|
+
const state = classifyWorkspaceTasksMovePair(plan, verification.observed);
|
|
133
|
+
if (state === "complete")
|
|
134
|
+
return completeWithPermit(plan, permit, verification.observed);
|
|
135
|
+
if (state !== "destination-applied")
|
|
136
|
+
return reconcileDestinationObservation(permit);
|
|
137
|
+
return removeSource(plan, permit);
|
|
138
|
+
}
|
|
139
|
+
async function handleDestinationFailure(plan, permit, destinationOutcomeUnknown) {
|
|
140
|
+
const verification = await readAfterWrite(plan.address);
|
|
141
|
+
if (verification.kind === "result")
|
|
142
|
+
return verification.result;
|
|
143
|
+
const state = classifyWorkspaceTasksMovePair(plan, verification.observed);
|
|
144
|
+
if (state === "complete")
|
|
145
|
+
return completeWithPermit(plan, permit, verification.observed);
|
|
146
|
+
if (state === "destination-applied" && !destinationOutcomeUnknown) {
|
|
147
|
+
return partialResult(plan, verification.observed);
|
|
148
|
+
}
|
|
149
|
+
if (state !== "destination-applied")
|
|
150
|
+
return reconcileDestinationObservation(permit);
|
|
151
|
+
return unknownOutcomeResult(UNKNOWN_OUTCOME_MESSAGE);
|
|
152
|
+
}
|
|
153
|
+
function reconcileDestinationObservation(permit) {
|
|
154
|
+
// The post-destination pair was already observed and classified by this move.
|
|
155
|
+
// Releasing here avoids replacing that authoritative observation with a racy reread.
|
|
156
|
+
registry.releaseAfterAuthoritativeObservation(permit);
|
|
157
|
+
return conflictResult("unrecognized-state", "The move state no longer matches its live claim.");
|
|
158
|
+
}
|
|
159
|
+
async function removeSource(plan, permit) {
|
|
160
|
+
try {
|
|
161
|
+
await writeIntent(plan.sourceRemoval, { permit });
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return handleSourceFailure(plan, permit);
|
|
165
|
+
}
|
|
166
|
+
const verification = await readAfterWrite(plan.address);
|
|
167
|
+
if (verification.kind === "result")
|
|
168
|
+
return verification.result;
|
|
169
|
+
return settleSourceObservation(plan, permit, verification.observed);
|
|
170
|
+
}
|
|
171
|
+
async function handleSourceFailure(plan, permit) {
|
|
172
|
+
const verification = await readAfterWrite(plan.address);
|
|
173
|
+
if (verification.kind === "result")
|
|
174
|
+
return verification.result;
|
|
175
|
+
return settleSourceObservation(plan, permit, verification.observed);
|
|
176
|
+
}
|
|
177
|
+
async function settleSourceObservation(plan, permit, observed) {
|
|
178
|
+
const state = classifyWorkspaceTasksMovePair(plan, observed);
|
|
179
|
+
if (state === "complete")
|
|
180
|
+
return completeWithPermit(plan, permit, observed);
|
|
181
|
+
if (state === "destination-applied")
|
|
182
|
+
return partialResult(plan, observed);
|
|
183
|
+
try {
|
|
184
|
+
await registry.reconcileGlobalMoveClaim({ scope: "global" }, permit);
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
if (error instanceof WorkspaceTasksMoveConflictError) {
|
|
188
|
+
return conflictResult(error.reason, error.message);
|
|
189
|
+
}
|
|
190
|
+
return resultFromMoveError(error);
|
|
191
|
+
}
|
|
192
|
+
return conflictResult("unrecognized-state", "The move state no longer matches its live claim.");
|
|
193
|
+
}
|
|
194
|
+
async function completeWithPermit(plan, permit, observed) {
|
|
195
|
+
try {
|
|
196
|
+
await registry.reconcileGlobalMoveClaim({ scope: "global" }, permit);
|
|
197
|
+
return completedResult(plan, observed);
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
if (error instanceof WorkspaceTasksMoveRecoveryPendingError)
|
|
201
|
+
return unknownOutcomeResult(UNKNOWN_OUTCOME_MESSAGE);
|
|
202
|
+
return resultFromMoveError(error);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
async function writeIntent(intent, options) {
|
|
206
|
+
if (intent.scope === "global") {
|
|
207
|
+
await globalAdapter.replace({ expectedRevision: intent.expectedRevision, config: intent.config }, options);
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
await workspaceAdapter.replace(intent.address, { expectedRevision: intent.expectedRevision, config: intent.config }, options);
|
|
211
|
+
}
|
|
212
|
+
async function readBeforeMove(address) {
|
|
213
|
+
try {
|
|
214
|
+
const observed = await observe(address);
|
|
215
|
+
if (observed.workspace.kind === "invalid" || observed.global.kind === "invalid") {
|
|
216
|
+
return { kind: "result", result: conflictResult("invalid-catalog", "A workspace task catalog is invalid.") };
|
|
217
|
+
}
|
|
218
|
+
if (observed.workspace.kind === "unavailable") {
|
|
219
|
+
return { kind: "result", result: unavailableResult("The workspace task catalog is unavailable.") };
|
|
220
|
+
}
|
|
221
|
+
return { kind: "observation", observed };
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
return { kind: "result", result: resultFromMoveError(error) };
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
async function readAfterWrite(address) {
|
|
228
|
+
try {
|
|
229
|
+
const observed = await observe(address);
|
|
230
|
+
if (observed.workspace.kind !== "loaded" && observed.workspace.kind !== "missing") {
|
|
231
|
+
return { kind: "result", result: unknownOutcomeResult(UNKNOWN_OUTCOME_MESSAGE) };
|
|
232
|
+
}
|
|
233
|
+
if (observed.global.kind !== "loaded") {
|
|
234
|
+
return { kind: "result", result: unknownOutcomeResult(UNKNOWN_OUTCOME_MESSAGE) };
|
|
235
|
+
}
|
|
236
|
+
return { kind: "observation", observed };
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
return { kind: "result", result: unknownOutcomeResult(UNKNOWN_OUTCOME_MESSAGE) };
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
async function observe(address) {
|
|
243
|
+
const workspace = await workspaceAdapter.read(address);
|
|
244
|
+
const global = await globalAdapter.read();
|
|
245
|
+
return { workspace, global };
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
function asRetryPlan(plan) {
|
|
249
|
+
if (plan.intent === "retry")
|
|
250
|
+
return plan;
|
|
251
|
+
return {
|
|
252
|
+
...plan,
|
|
253
|
+
intent: "retry",
|
|
254
|
+
request: { ...plan.request, intent: "retry" },
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
function completedResult(plan, observed) {
|
|
258
|
+
return {
|
|
259
|
+
kind: "completed",
|
|
260
|
+
operationId: plan.operationId,
|
|
261
|
+
workspace: observed.workspace,
|
|
262
|
+
global: observed.global,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
function partialResult(plan, observed) {
|
|
266
|
+
return {
|
|
267
|
+
kind: "partial",
|
|
268
|
+
operationId: plan.operationId,
|
|
269
|
+
phase: "destination-written",
|
|
270
|
+
workspace: observed.workspace,
|
|
271
|
+
global: observed.global,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
function retryPristineResult() {
|
|
275
|
+
return conflictResult("retry-pristine", "The original move is still pristine. Confirm the move again.");
|
|
276
|
+
}
|
|
277
|
+
function hasDestinationCollision(plan, observed) {
|
|
278
|
+
const destination = plan.destination.scope === "global" ? observed.global : observed.workspace;
|
|
279
|
+
return destination.kind === "loaded"
|
|
280
|
+
&& destination.config.tasks.some((task) => task.id === plan.destination.task.id);
|
|
281
|
+
}
|
|
282
|
+
function conflictResult(reason, message) {
|
|
283
|
+
return { kind: "conflict", reason, message };
|
|
284
|
+
}
|
|
285
|
+
function unavailableResult(message) {
|
|
286
|
+
return { kind: "unavailable", message };
|
|
287
|
+
}
|
|
288
|
+
function unknownOutcomeResult(message) {
|
|
289
|
+
return { kind: "unknown-outcome", message };
|
|
290
|
+
}
|
|
291
|
+
function resultFromMoveError(error) {
|
|
292
|
+
if (error instanceof WorkspaceTasksMoveValidationError) {
|
|
293
|
+
return { kind: "validation", message: error.message };
|
|
294
|
+
}
|
|
295
|
+
if (error instanceof WorkspaceTasksMoveConflictError) {
|
|
296
|
+
return conflictResult(error.reason, error.message);
|
|
297
|
+
}
|
|
298
|
+
if (error instanceof WorkspaceTasksMoveInProgressError || error instanceof WorkspaceTasksMoveRecoveryPendingError) {
|
|
299
|
+
return conflictResult("move-in-progress", error.message);
|
|
300
|
+
}
|
|
301
|
+
if (error instanceof WorkspaceTasksInvalidCatalogError) {
|
|
302
|
+
return conflictResult("invalid-catalog", error.message);
|
|
303
|
+
}
|
|
304
|
+
if (error instanceof WorkspaceTasksRevisionConflictError) {
|
|
305
|
+
return conflictResult("source-changed", error.message);
|
|
306
|
+
}
|
|
307
|
+
if (error instanceof WorkspaceTasksUnknownOutcomeError) {
|
|
308
|
+
return unknownOutcomeResult(error.message);
|
|
309
|
+
}
|
|
310
|
+
if (error instanceof WorkspaceTasksUnavailableError) {
|
|
311
|
+
return unavailableResult(error.message);
|
|
312
|
+
}
|
|
313
|
+
if (error instanceof Error && error.message.includes("already exists")) {
|
|
314
|
+
return conflictResult("destination-collision", error.message);
|
|
315
|
+
}
|
|
316
|
+
return unavailableResult("Workspace task move is unavailable.");
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=workspaceTasksCatalogService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaceTasksCatalogService.js","sourceRoot":"","sources":["../../../src/server/workspaceTasks/workspaceTasksCatalogService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { createWorkspaceTasksCatalogService } from "./workspaceTasksCatalogService.js";
|
|
2
|
+
import { createWorkspaceTasksGlobalCatalogAdapter, } from "./workspaceTasksGlobalCatalogAdapter.js";
|
|
3
|
+
import { MachineGlobalTasksMoveRegistry, } from "./workspaceTasksMoveRegistry.js";
|
|
4
|
+
import { createWorkspaceTasksWorkspaceCatalogAdapter, } from "./workspaceTasksWorkspaceCatalogAdapter.js";
|
|
5
|
+
import { createWorkspaceTasksWorkspaceFileResolver, } from "./workspaceTasksWorkspaceFile.js";
|
|
6
|
+
export function createWorkspaceTasksComposition(deps) {
|
|
7
|
+
const factories = deps.factories ?? {};
|
|
8
|
+
// These references must exist before registry creation; its observer is called only after both assignments.
|
|
9
|
+
// eslint-disable-next-line prefer-const
|
|
10
|
+
let globalAdapter;
|
|
11
|
+
// eslint-disable-next-line prefer-const
|
|
12
|
+
let workspaceAdapter;
|
|
13
|
+
const observationPort = {
|
|
14
|
+
async observe(address) {
|
|
15
|
+
if (globalAdapter === undefined || workspaceAdapter === undefined) {
|
|
16
|
+
throw new Error("Workspace Tasks composition observers cannot run before adapter assignment");
|
|
17
|
+
}
|
|
18
|
+
const workspace = await workspaceAdapter.read(address);
|
|
19
|
+
const global = await globalAdapter.read();
|
|
20
|
+
return { workspace, global };
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
const registry = factories.createRegistry?.({ observe: observationPort })
|
|
24
|
+
?? new MachineGlobalTasksMoveRegistry(observationPort);
|
|
25
|
+
const workspaceFiles = factories.createWorkspaceFileResolver?.({
|
|
26
|
+
projects: deps.projects,
|
|
27
|
+
workspaces: deps.workspaces,
|
|
28
|
+
}) ?? createWorkspaceTasksWorkspaceFileResolver({
|
|
29
|
+
projects: deps.projects,
|
|
30
|
+
workspaces: deps.workspaces,
|
|
31
|
+
});
|
|
32
|
+
const workspaceMutations = registry;
|
|
33
|
+
globalAdapter = factories.createGlobalAdapter?.({
|
|
34
|
+
coordinator: deps.configMutationCoordinator,
|
|
35
|
+
authorizer: registry,
|
|
36
|
+
}) ?? createWorkspaceTasksGlobalCatalogAdapter({
|
|
37
|
+
coordinator: deps.configMutationCoordinator,
|
|
38
|
+
authorizer: registry,
|
|
39
|
+
});
|
|
40
|
+
workspaceAdapter = factories.createWorkspaceAdapter?.({
|
|
41
|
+
projects: deps.projects,
|
|
42
|
+
workspaces: deps.workspaces,
|
|
43
|
+
files: workspaceFiles,
|
|
44
|
+
authorizer: registry,
|
|
45
|
+
workspaceMutations,
|
|
46
|
+
}) ?? createWorkspaceTasksWorkspaceCatalogAdapter({
|
|
47
|
+
projects: deps.projects,
|
|
48
|
+
workspaces: deps.workspaces,
|
|
49
|
+
files: workspaceFiles,
|
|
50
|
+
authorizer: registry,
|
|
51
|
+
workspaceMutations,
|
|
52
|
+
});
|
|
53
|
+
const service = createWorkspaceTasksCatalogService({
|
|
54
|
+
globalAdapter,
|
|
55
|
+
workspaceAdapter,
|
|
56
|
+
registry,
|
|
57
|
+
});
|
|
58
|
+
return {
|
|
59
|
+
service,
|
|
60
|
+
registry,
|
|
61
|
+
workspaceMutations,
|
|
62
|
+
workspaceFiles,
|
|
63
|
+
globalAdapter,
|
|
64
|
+
workspaceAdapter,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=workspaceTasksComposition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaceTasksComposition.js","sourceRoot":"","sources":["../../../src/server/workspaceTasks/workspaceTasksComposition.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kCAAkC,EAAqC,MAAM,mCAAmC,CAAC;AAC1H,OAAO,EACL,wCAAwC,GAEzC,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,8BAA8B,GAE/B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,2CAA2C,GAE5C,MAAM,4CAA4C,CAAC;AACpD,OAAO,EACL,yCAAyC,GAE1C,MAAM,kCAAkC,CAAC;AA0C1C,MAAM,UAAU,+BAA+B,CAC7C,IAA2C;IAE3C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;IACvC,4GAA4G;IAC5G,wCAAwC;IACxC,IAAI,aAA6D,CAAC;IAClE,wCAAwC;IACxC,IAAI,gBAAmE,CAAC;IAExE,MAAM,eAAe,GAAsC;QACzD,KAAK,CAAC,OAAO,CAAC,OAAO;YACnB,IAAI,aAAa,KAAK,SAAS,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBAClE,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;YAChG,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;YAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAC/B,CAAC;KACF,CAAC;IAEF,MAAM,QAAQ,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;WACpE,IAAI,8BAA8B,CAAC,eAAe,CAAC,CAAC;IACzD,MAAM,cAAc,GAAG,SAAS,CAAC,2BAA2B,EAAE,CAAC;QAC7D,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC,IAAI,yCAAyC,CAAC;QAC9C,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC,CAAC;IACH,MAAM,kBAAkB,GAA+C,QAAQ,CAAC;IAEhF,aAAa,GAAG,SAAS,CAAC,mBAAmB,EAAE,CAAC;QAC9C,WAAW,EAAE,IAAI,CAAC,yBAAyB;QAC3C,UAAU,EAAE,QAAQ;KACrB,CAAC,IAAI,wCAAwC,CAAC;QAC7C,WAAW,EAAE,IAAI,CAAC,yBAAyB;QAC3C,UAAU,EAAE,QAAQ;KACrB,CAAC,CAAC;IACH,gBAAgB,GAAG,SAAS,CAAC,sBAAsB,EAAE,CAAC;QACpD,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,KAAK,EAAE,cAAc;QACrB,UAAU,EAAE,QAAQ;QACpB,kBAAkB;KACnB,CAAC,IAAI,2CAA2C,CAAC;QAChD,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,KAAK,EAAE,cAAc;QACrB,UAAU,EAAE,QAAQ;QACpB,kBAAkB;KACnB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,kCAAkC,CAAC;QACjD,aAAa;QACb,gBAAgB;QAChB,QAAQ;KACT,CAAC,CAAC;IACH,OAAO;QACL,OAAO;QACP,QAAQ;QACR,kBAAkB;QAClB,cAAc;QACd,aAAa;QACb,gBAAgB;KACjB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const REVISION_CONFLICT_MESSAGE = "Workspace tasks changed. Refresh and try again.";
|
|
2
|
+
const INVALID_CATALOG_MESSAGE = "The global workspace tasks catalog is invalid.";
|
|
3
|
+
const UNAVAILABLE_MESSAGE = "The global workspace tasks catalog is unavailable.";
|
|
4
|
+
const UNKNOWN_OUTCOME_MESSAGE = "The global workspace tasks write may have completed. Refresh before trying again.";
|
|
5
|
+
export class WorkspaceTasksRevisionConflictError extends Error {
|
|
6
|
+
constructor() {
|
|
7
|
+
super(REVISION_CONFLICT_MESSAGE);
|
|
8
|
+
this.code = "WORKSPACE_TASKS_REVISION_CONFLICT";
|
|
9
|
+
this.name = "WorkspaceTasksRevisionConflictError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export class WorkspaceTasksInvalidCatalogError extends Error {
|
|
13
|
+
constructor(detail) {
|
|
14
|
+
super(INVALID_CATALOG_MESSAGE);
|
|
15
|
+
this.code = "WORKSPACE_TASKS_INVALID_CATALOG";
|
|
16
|
+
this.name = "WorkspaceTasksInvalidCatalogError";
|
|
17
|
+
this.detail = detail;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export class WorkspaceTasksUnavailableError extends Error {
|
|
21
|
+
constructor() {
|
|
22
|
+
super(UNAVAILABLE_MESSAGE);
|
|
23
|
+
this.code = "WORKSPACE_TASKS_UNAVAILABLE";
|
|
24
|
+
this.name = "WorkspaceTasksUnavailableError";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export class WorkspaceTasksUnknownOutcomeError extends Error {
|
|
28
|
+
constructor() {
|
|
29
|
+
super(UNKNOWN_OUTCOME_MESSAGE);
|
|
30
|
+
this.code = "WORKSPACE_TASKS_UNKNOWN_OUTCOME";
|
|
31
|
+
this.name = "WorkspaceTasksUnknownOutcomeError";
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=workspaceTasksErrors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaceTasksErrors.js","sourceRoot":"","sources":["../../../src/server/workspaceTasks/workspaceTasksErrors.ts"],"names":[],"mappings":"AAOA,MAAM,yBAAyB,GAAG,iDAAiD,CAAC;AACpF,MAAM,uBAAuB,GAAG,gDAAgD,CAAC;AACjF,MAAM,mBAAmB,GAAG,oDAAoD,CAAC;AACjF,MAAM,uBAAuB,GAAG,mFAAmF,CAAC;AAEpH,MAAM,OAAO,mCAAoC,SAAQ,KAAK;IAG5D;QACE,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAH1B,SAAI,GAAG,mCAAmC,CAAC;QAIlD,IAAI,CAAC,IAAI,GAAG,qCAAqC,CAAC;IACpD,CAAC;CACF;AAED,MAAM,OAAO,iCAAkC,SAAQ,KAAK;IAI1D,YAAY,MAAc;QACxB,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAJxB,SAAI,GAAG,iCAAiC,CAAC;QAKhD,IAAI,CAAC,IAAI,GAAG,mCAAmC,CAAC;QAChD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IAGvD;QACE,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAHpB,SAAI,GAAG,6BAA6B,CAAC;QAI5C,IAAI,CAAC,IAAI,GAAG,gCAAgC,CAAC;IAC/C,CAAC;CACF;AAED,MAAM,OAAO,iCAAkC,SAAQ,KAAK;IAG1D;QACE,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAHxB,SAAI,GAAG,iCAAiC,CAAC;QAIhD,IAAI,CAAC,IAAI,GAAG,mCAAmC,CAAC;IAClD,CAAC;CACF"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { assertWorkspaceTasksCatalogSize, parseWorkspaceTasksConfig, serializeWorkspaceTasksConfig, } from "../../shared/workspaceTasks.js";
|
|
3
|
+
import { WorkspaceTasksInvalidCatalogError, WorkspaceTasksRevisionConflictError, WorkspaceTasksUnavailableError, WorkspaceTasksUnknownOutcomeError, } from "./workspaceTasksErrors.js";
|
|
4
|
+
const WORKSPACE_TASKS_PLUGIN_ID = "workspace-tasks";
|
|
5
|
+
const GLOBAL_TASKS_SETTING = "globalTasks";
|
|
6
|
+
const INVALID_GLOBAL_CATALOG_MESSAGE = "Global workspace tasks configuration is invalid.";
|
|
7
|
+
const INVALID_GLOBAL_CATALOG_HINT = "Repair the global workspace task catalog, then refresh.";
|
|
8
|
+
/**
|
|
9
|
+
* Coordinates every machine-global task read and replace through the shared
|
|
10
|
+
* config mutation authority. It only owns the globalTasks projection; all
|
|
11
|
+
* other config values are copied through untouched.
|
|
12
|
+
*/
|
|
13
|
+
export function createWorkspaceTasksGlobalCatalogAdapter(options) {
|
|
14
|
+
const { coordinator, authorizer } = options;
|
|
15
|
+
return {
|
|
16
|
+
async read() {
|
|
17
|
+
try {
|
|
18
|
+
return responseFromProjection(projectGlobalCatalog((await coordinator.read()).loaded.config));
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
throw new WorkspaceTasksUnavailableError();
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
async replace(input, writeOptions) {
|
|
25
|
+
const proposed = canonicalizeCatalog(input.config);
|
|
26
|
+
await authorizer.reconcileGlobalMoveClaim({ scope: "global" }, writeOptions?.permit);
|
|
27
|
+
let current;
|
|
28
|
+
let intent;
|
|
29
|
+
let authorizationError;
|
|
30
|
+
const publication = { attempted: false, saved: false };
|
|
31
|
+
try {
|
|
32
|
+
const committed = await coordinator.mutate((before) => {
|
|
33
|
+
const projected = projectGlobalCatalog(before.loaded.config);
|
|
34
|
+
if (projected.kind === "invalid")
|
|
35
|
+
throw new WorkspaceTasksInvalidCatalogError(projected.detail);
|
|
36
|
+
current = projected.value;
|
|
37
|
+
if (input.expectedRevision !== current.revision)
|
|
38
|
+
throw new WorkspaceTasksRevisionConflictError();
|
|
39
|
+
intent = {
|
|
40
|
+
scope: "global",
|
|
41
|
+
expectedRevision: input.expectedRevision,
|
|
42
|
+
config: proposed.config,
|
|
43
|
+
};
|
|
44
|
+
return replaceGlobalCatalog(before.loaded.config, proposed.config);
|
|
45
|
+
}, {
|
|
46
|
+
shouldSave: () => {
|
|
47
|
+
if (current === undefined || intent === undefined) {
|
|
48
|
+
throw new Error("Global workspace task mutation did not establish a catalog intent");
|
|
49
|
+
}
|
|
50
|
+
if (current.canonical === proposed.canonical)
|
|
51
|
+
return false;
|
|
52
|
+
try {
|
|
53
|
+
authorizer.assertGlobalMutationAllowed(intent, writeOptions?.permit);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
authorizationError = error;
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
return true;
|
|
60
|
+
},
|
|
61
|
+
onPublicationAttempt: () => {
|
|
62
|
+
publication.attempted = true;
|
|
63
|
+
},
|
|
64
|
+
onSaved: () => {
|
|
65
|
+
publication.saved = true;
|
|
66
|
+
invokeNonThrowing(writeOptions?.onWriteAcknowledged);
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
const response = responseFromProjection(projectGlobalCatalog(committed.loaded.config));
|
|
70
|
+
if (response.kind === "invalid")
|
|
71
|
+
throw new WorkspaceTasksInvalidCatalogError(response.detail);
|
|
72
|
+
return response;
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
if (error === authorizationError)
|
|
76
|
+
throw error;
|
|
77
|
+
if (error instanceof WorkspaceTasksInvalidCatalogError || error instanceof WorkspaceTasksRevisionConflictError) {
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
if (publication.attempted || publication.saved) {
|
|
81
|
+
invokeNonThrowing(writeOptions?.onWriteOutcomeUnknown);
|
|
82
|
+
throw new WorkspaceTasksUnknownOutcomeError();
|
|
83
|
+
}
|
|
84
|
+
throw new WorkspaceTasksUnavailableError();
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function responseFromProjection(projection) {
|
|
90
|
+
if (projection.kind === "invalid") {
|
|
91
|
+
return {
|
|
92
|
+
kind: "invalid",
|
|
93
|
+
message: INVALID_GLOBAL_CATALOG_MESSAGE,
|
|
94
|
+
hint: INVALID_GLOBAL_CATALOG_HINT,
|
|
95
|
+
detail: projection.detail,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
kind: "loaded",
|
|
100
|
+
config: projection.value.config,
|
|
101
|
+
revision: projection.value.revision,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function projectGlobalCatalog(config) {
|
|
105
|
+
const raw = config.plugins?.[WORKSPACE_TASKS_PLUGIN_ID]?.settings?.[GLOBAL_TASKS_SETTING];
|
|
106
|
+
const parsed = parseWorkspaceTasksConfig(raw === undefined ? emptyCatalog() : raw);
|
|
107
|
+
if (!parsed.ok)
|
|
108
|
+
return { kind: "invalid", detail: parsed.error };
|
|
109
|
+
try {
|
|
110
|
+
assertWorkspaceTasksCatalogSize(parsed.config);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
return { kind: "invalid", detail: errorMessage(error) };
|
|
114
|
+
}
|
|
115
|
+
return { kind: "loaded", value: loadedCatalog(parsed.config) };
|
|
116
|
+
}
|
|
117
|
+
function canonicalizeCatalog(value) {
|
|
118
|
+
const parsed = parseWorkspaceTasksConfig(value);
|
|
119
|
+
if (!parsed.ok)
|
|
120
|
+
throw new WorkspaceTasksInvalidCatalogError(parsed.error);
|
|
121
|
+
try {
|
|
122
|
+
assertWorkspaceTasksCatalogSize(parsed.config);
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
throw new WorkspaceTasksInvalidCatalogError(errorMessage(error));
|
|
126
|
+
}
|
|
127
|
+
return loadedCatalog(parsed.config);
|
|
128
|
+
}
|
|
129
|
+
function loadedCatalog(config) {
|
|
130
|
+
const canonical = serializeWorkspaceTasksConfig(config);
|
|
131
|
+
return {
|
|
132
|
+
config,
|
|
133
|
+
canonical,
|
|
134
|
+
revision: createHash("sha256").update(canonical, "utf8").digest("hex"),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
function replaceGlobalCatalog(config, globalTasks) {
|
|
138
|
+
const plugins = config.plugins ?? {};
|
|
139
|
+
const currentPlugin = plugins[WORKSPACE_TASKS_PLUGIN_ID];
|
|
140
|
+
const currentSettings = currentPlugin?.settings;
|
|
141
|
+
return {
|
|
142
|
+
...config,
|
|
143
|
+
plugins: {
|
|
144
|
+
...plugins,
|
|
145
|
+
[WORKSPACE_TASKS_PLUGIN_ID]: {
|
|
146
|
+
...(currentPlugin ?? {}),
|
|
147
|
+
settings: {
|
|
148
|
+
...(currentSettings ?? {}),
|
|
149
|
+
[GLOBAL_TASKS_SETTING]: globalTasks,
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
function emptyCatalog() {
|
|
156
|
+
return { version: 1, tasks: [] };
|
|
157
|
+
}
|
|
158
|
+
function errorMessage(error) {
|
|
159
|
+
return error instanceof Error ? error.message : String(error);
|
|
160
|
+
}
|
|
161
|
+
function invokeNonThrowing(callback) {
|
|
162
|
+
try {
|
|
163
|
+
callback?.();
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
// Move-state callbacks observe persistence and never alter its outcome.
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=workspaceTasksGlobalCatalogAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaceTasksGlobalCatalogAdapter.js","sourceRoot":"","sources":["../../../src/server/workspaceTasks/workspaceTasksGlobalCatalogAdapter.ts"],"names":[],"mappings":"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"}
|