@ankhorage/studio 2.7.0 → 2.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/apm/update.json +1 -1
- package/dist/features/project-updates/adapters/inbound/registerProjectUpdateRoutes.d.ts +16 -0
- package/dist/features/project-updates/adapters/inbound/registerProjectUpdateRoutes.d.ts.map +1 -0
- package/dist/features/project-updates/adapters/inbound/registerProjectUpdateRoutes.js +269 -0
- package/dist/features/project-updates/adapters/inbound/registerProjectUpdateRoutes.js.map +1 -0
- package/dist/features/projects/adapters/outbound/ProjectGenerationStateStore.d.ts +29 -0
- package/dist/features/projects/adapters/outbound/ProjectGenerationStateStore.d.ts.map +1 -0
- package/dist/features/projects/adapters/outbound/ProjectGenerationStateStore.js +116 -0
- package/dist/features/projects/adapters/outbound/ProjectGenerationStateStore.js.map +1 -0
- package/dist/features/projects/composition/createProjectGenerationStateStore.d.ts +4 -0
- package/dist/features/projects/composition/createProjectGenerationStateStore.d.ts.map +1 -0
- package/dist/features/projects/composition/createProjectGenerationStateStore.js +6 -0
- package/dist/features/projects/composition/createProjectGenerationStateStore.js.map +1 -0
- package/dist/features/projects/domain/resolveStudioRuntimeProjectionState.d.ts +4 -0
- package/dist/features/projects/domain/resolveStudioRuntimeProjectionState.d.ts.map +1 -0
- package/dist/features/projects/domain/resolveStudioRuntimeProjectionState.js +17 -0
- package/dist/features/projects/domain/resolveStudioRuntimeProjectionState.js.map +1 -0
- package/dist/host/http/projectRuntimeRoutes.d.ts +2 -2
- package/dist/host/http/projectRuntimeRoutes.d.ts.map +1 -1
- package/dist/host/http/projectRuntimeRoutes.js +12 -2
- package/dist/host/http/projectRuntimeRoutes.js.map +1 -1
- package/dist/host/http/server.d.ts +3 -1
- package/dist/host/http/server.d.ts.map +1 -1
- package/dist/host/http/server.js +16 -1
- package/dist/host/http/server.js.map +1 -1
- package/dist/host/index.d.ts +1 -0
- package/dist/host/index.d.ts.map +1 -1
- package/dist/host/index.js.map +1 -1
- package/dist/host/orchestrator/projectManager.d.ts +5 -0
- package/dist/host/orchestrator/projectManager.d.ts.map +1 -1
- package/dist/host/orchestrator/projectManager.js +41 -14
- package/dist/host/orchestrator/projectManager.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/types/project-generation.d.ts +11 -0
- package/dist/types/project-generation.d.ts.map +1 -0
- package/dist/types/project-generation.js +2 -0
- package/dist/types/project-generation.js.map +1 -0
- package/package.json +1 -1
- package/dist/host/orchestrator/projectGenerationState.d.ts +0 -11
- package/dist/host/orchestrator/projectGenerationState.d.ts.map +0 -1
- package/dist/host/orchestrator/projectGenerationState.js +0 -65
- package/dist/host/orchestrator/projectGenerationState.js.map +0 -1
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
# @ankhorage/studio
|
|
5
5
|
|
|
6
|
-
         
|
|
7
7
|
|
|
8
8
|
Studio authoring package for Ankhorage apps
|
|
9
9
|
|
package/apm/update.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"protocolVersion": 1,
|
|
3
3
|
"schemaVersion": 1,
|
|
4
|
-
"owner": { "name": "@ankhorage/studio", "version": "2.7.
|
|
4
|
+
"owner": { "name": "@ankhorage/studio", "version": "2.7.2" },
|
|
5
5
|
"history": {
|
|
6
6
|
"supported": [{ "sourceRange": ">=2.5.7 <3.0.0", "mode": "no-migration" }],
|
|
7
7
|
"unsupported": [],
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ApmApplyInput, ApmPlanProjectInput, ApmStatusInput, ApmVerifyInput } from '@ankhorage/apm/types';
|
|
2
|
+
import type { FastifyInstance } from 'fastify';
|
|
3
|
+
interface ProjectUpdateRouteService {
|
|
4
|
+
readonly statusAsync: (input: ApmStatusInput) => Promise<unknown>;
|
|
5
|
+
readonly planAsync: (input: ApmPlanProjectInput) => Promise<unknown>;
|
|
6
|
+
readonly applyAsync: (input: ApmApplyInput) => Promise<unknown>;
|
|
7
|
+
readonly verifyAsync: (input: ApmVerifyInput) => Promise<unknown>;
|
|
8
|
+
}
|
|
9
|
+
interface ProjectUpdateRouteOptions {
|
|
10
|
+
readonly service: ProjectUpdateRouteService;
|
|
11
|
+
readonly resolveProjectRootAsync: (projectId: string) => Promise<string | undefined>;
|
|
12
|
+
}
|
|
13
|
+
/*** Register the authorized HTTP adapter for Studio's composed APM project-update lifecycle. */
|
|
14
|
+
export declare function registerProjectUpdateRoutes(fastify: FastifyInstance, options: ProjectUpdateRouteOptions): void;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=registerProjectUpdateRoutes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registerProjectUpdateRoutes.d.ts","sourceRoot":"","sources":["../../../../../src/features/project-updates/adapters/inbound/registerProjectUpdateRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EAIb,mBAAmB,EAInB,cAAc,EACd,cAAc,EACf,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,SAAS,CAAC;AAE7D,UAAU,yBAAyB;IACjC,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAClE,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACrE,QAAQ,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAChE,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACnE;AAED,UAAU,yBAAyB;IACjC,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAC;IAC5C,QAAQ,CAAC,uBAAuB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACtF;AAED,gGAAgG;AAChG,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,yBAAyB,GACjC,IAAI,CAwEN"}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import { hasOnlyKeys, isRecord } from '@ankhorage/utility/object';
|
|
2
|
+
/*** Register the authorized HTTP adapter for Studio's composed APM project-update lifecycle. */
|
|
3
|
+
export function registerProjectUpdateRoutes(fastify, options) {
|
|
4
|
+
fastify.get('/api/projects/:id/updates/status', async (request, reply) => {
|
|
5
|
+
const context = await resolveRequestContext(request.params, options, reply);
|
|
6
|
+
if (context === undefined)
|
|
7
|
+
return;
|
|
8
|
+
const query = isRecord(request.query) ? request.query : {};
|
|
9
|
+
if (!hasOnlyKeys(query, ['availability']) || !isAvailability(query.availability)) {
|
|
10
|
+
return sendInvalidRequest(reply);
|
|
11
|
+
}
|
|
12
|
+
const input = {
|
|
13
|
+
rootPath: context.rootPath,
|
|
14
|
+
...(query.availability === undefined ? {} : { availability: query.availability }),
|
|
15
|
+
};
|
|
16
|
+
return invokeReadOnly(reply, () => options.service.statusAsync(input));
|
|
17
|
+
});
|
|
18
|
+
fastify.post('/api/projects/:id/updates/plan', async (request, reply) => {
|
|
19
|
+
const context = await resolveRequestContext(request.params, options, reply);
|
|
20
|
+
if (context === undefined)
|
|
21
|
+
return;
|
|
22
|
+
const body = request.body === undefined ? {} : request.body;
|
|
23
|
+
if (!isPlanRequest(body))
|
|
24
|
+
return sendInvalidRequest(reply);
|
|
25
|
+
const input = {
|
|
26
|
+
rootPath: context.rootPath,
|
|
27
|
+
...(body.availability === undefined ? {} : { availability: body.availability }),
|
|
28
|
+
...(body.policy === undefined ? {} : { policy: body.policy }),
|
|
29
|
+
};
|
|
30
|
+
return invokeLifecycle(reply, () => options.service.planAsync(input));
|
|
31
|
+
});
|
|
32
|
+
fastify.post('/api/projects/:id/updates/apply', async (request, reply) => {
|
|
33
|
+
const context = await resolveRequestContext(request.params, options, reply);
|
|
34
|
+
if (context === undefined)
|
|
35
|
+
return;
|
|
36
|
+
const { body } = request;
|
|
37
|
+
if (!isApplyRequest(body))
|
|
38
|
+
return sendInvalidRequest(reply);
|
|
39
|
+
if (body.plan.rootPath !== context.rootPath) {
|
|
40
|
+
return reply.status(409).send({ error: 'The reviewed plan belongs to another project.' });
|
|
41
|
+
}
|
|
42
|
+
return invokeLifecycle(reply, () => options.service.applyAsync({
|
|
43
|
+
mode: 'start',
|
|
44
|
+
plan: body.plan,
|
|
45
|
+
permissions: body.permissions,
|
|
46
|
+
}));
|
|
47
|
+
});
|
|
48
|
+
fastify.post('/api/projects/:id/updates/resume', async (request, reply) => {
|
|
49
|
+
const context = await resolveRequestContext(request.params, options, reply);
|
|
50
|
+
if (context === undefined)
|
|
51
|
+
return;
|
|
52
|
+
const { body } = request;
|
|
53
|
+
if (!isResumeRequest(body))
|
|
54
|
+
return sendInvalidRequest(reply);
|
|
55
|
+
return invokeLifecycle(reply, () => options.service.applyAsync({
|
|
56
|
+
mode: 'resume',
|
|
57
|
+
rootPath: context.rootPath,
|
|
58
|
+
operationId: body.operationId,
|
|
59
|
+
permissions: body.permissions,
|
|
60
|
+
}));
|
|
61
|
+
});
|
|
62
|
+
fastify.post('/api/projects/:id/updates/verify', async (request, reply) => {
|
|
63
|
+
const context = await resolveRequestContext(request.params, options, reply);
|
|
64
|
+
if (context === undefined)
|
|
65
|
+
return;
|
|
66
|
+
const { body } = request;
|
|
67
|
+
if (!isOperationRequest(body))
|
|
68
|
+
return sendInvalidRequest(reply);
|
|
69
|
+
return invokeLifecycle(reply, () => options.service.verifyAsync({
|
|
70
|
+
rootPath: context.rootPath,
|
|
71
|
+
operationId: body.operationId,
|
|
72
|
+
}));
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/*** Resolve a request's validated project id to its server-owned project root. */
|
|
76
|
+
async function resolveRequestContext(params, options, reply) {
|
|
77
|
+
if (!isRecord(params) || typeof params.id !== 'string' || params.id.length === 0) {
|
|
78
|
+
sendInvalidRequest(reply);
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
const rootPath = await options.resolveProjectRootAsync(params.id);
|
|
83
|
+
if (rootPath === undefined) {
|
|
84
|
+
reply.status(404).send({ error: 'Project not found.' });
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
return { rootPath };
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
reply.status(404).send({ error: 'Project not found.' });
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/*** Execute one read-only APM request without leaking host exception details. */
|
|
95
|
+
async function invokeReadOnly(reply, operation) {
|
|
96
|
+
try {
|
|
97
|
+
return await operation();
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return reply.status(500).send({ error: 'Project update request failed.' });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/*** Execute one APM lifecycle request and map incomplete or blocked structured results to conflict. */
|
|
104
|
+
async function invokeLifecycle(reply, operation) {
|
|
105
|
+
try {
|
|
106
|
+
const result = await operation();
|
|
107
|
+
if (isLifecycleConflict(result))
|
|
108
|
+
return reply.status(409).send(result);
|
|
109
|
+
return result;
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return reply.status(500).send({ error: 'Project update request failed.' });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/*** Detect structured APM plan/apply/verify results that require further user action. */
|
|
116
|
+
function isLifecycleConflict(value) {
|
|
117
|
+
if (!isRecord(value) || typeof value.operation !== 'string')
|
|
118
|
+
return false;
|
|
119
|
+
if (value.operation === 'plan')
|
|
120
|
+
return value.complete === false;
|
|
121
|
+
if (value.operation === 'apply')
|
|
122
|
+
return value.status !== 'completed';
|
|
123
|
+
if (value.operation === 'verify')
|
|
124
|
+
return value.verified === false;
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
/*** Return a stable bad-request response without echoing untrusted request data. */
|
|
128
|
+
function sendInvalidRequest(reply) {
|
|
129
|
+
return reply.status(400).send({ error: 'Invalid project update request.' });
|
|
130
|
+
}
|
|
131
|
+
/*** Validate the optional APM availability mode. */
|
|
132
|
+
function isAvailability(value) {
|
|
133
|
+
return value === undefined || value === 'refresh' || value === 'offline';
|
|
134
|
+
}
|
|
135
|
+
/*** Validate the bounded request body accepted by the plan route. */
|
|
136
|
+
function isPlanRequest(value) {
|
|
137
|
+
return (isRecord(value) &&
|
|
138
|
+
hasOnlyKeys(value, ['availability', 'policy']) &&
|
|
139
|
+
isAvailability(value.availability) &&
|
|
140
|
+
(value.policy === undefined || isPlanPolicy(value.policy)));
|
|
141
|
+
}
|
|
142
|
+
/*** Validate the APM plan policy fields exposed by the host adapter. */
|
|
143
|
+
function isPlanPolicy(value) {
|
|
144
|
+
return (isRecord(value) &&
|
|
145
|
+
hasOnlyKeys(value, [
|
|
146
|
+
'dependencyUpdates',
|
|
147
|
+
'selections',
|
|
148
|
+
'repairInstallations',
|
|
149
|
+
'repairProjections',
|
|
150
|
+
'maxGeneratorIterations',
|
|
151
|
+
]) &&
|
|
152
|
+
(value.dependencyUpdates === undefined ||
|
|
153
|
+
value.dependencyUpdates === 'safe' ||
|
|
154
|
+
value.dependencyUpdates === 'selected' ||
|
|
155
|
+
value.dependencyUpdates === 'none') &&
|
|
156
|
+
(value.selections === undefined ||
|
|
157
|
+
(Array.isArray(value.selections) && value.selections.every(isPlanPackageSelection))) &&
|
|
158
|
+
(value.repairInstallations === undefined || typeof value.repairInstallations === 'boolean') &&
|
|
159
|
+
(value.repairProjections === undefined || typeof value.repairProjections === 'boolean') &&
|
|
160
|
+
(value.maxGeneratorIterations === undefined ||
|
|
161
|
+
(typeof value.maxGeneratorIterations === 'number' &&
|
|
162
|
+
Number.isInteger(value.maxGeneratorIterations) &&
|
|
163
|
+
value.maxGeneratorIterations > 0)));
|
|
164
|
+
}
|
|
165
|
+
/*** Validate one package selection in a host-authored APM plan request. */
|
|
166
|
+
function isPlanPackageSelection(value) {
|
|
167
|
+
if (!isRecord(value) || !hasOnlyKeys(value, ['selector', 'target']))
|
|
168
|
+
return false;
|
|
169
|
+
const { selector } = value;
|
|
170
|
+
if (!isRecord(selector) ||
|
|
171
|
+
!hasOnlyKeys(selector, ['name', 'packageId', 'installRootId', 'ownerPath'])) {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
return (typeof selector.name === 'string' &&
|
|
175
|
+
selector.name.length > 0 &&
|
|
176
|
+
isOptionalString(selector.packageId) &&
|
|
177
|
+
isOptionalString(selector.installRootId) &&
|
|
178
|
+
isOptionalString(selector.ownerPath) &&
|
|
179
|
+
isPlanTargetSelection(value.target));
|
|
180
|
+
}
|
|
181
|
+
/*** Validate one compatible/latest/exact APM target selection. */
|
|
182
|
+
function isPlanTargetSelection(value) {
|
|
183
|
+
if (!isRecord(value) || typeof value.kind !== 'string')
|
|
184
|
+
return false;
|
|
185
|
+
if (value.kind === 'compatible')
|
|
186
|
+
return hasOnlyKeys(value, ['kind']);
|
|
187
|
+
if (value.kind === 'latest') {
|
|
188
|
+
return (hasOnlyKeys(value, ['kind', 'allowPrerelease', 'manifestRange']) &&
|
|
189
|
+
isOptionalBoolean(value.allowPrerelease) &&
|
|
190
|
+
isOptionalString(value.manifestRange));
|
|
191
|
+
}
|
|
192
|
+
if (value.kind === 'version') {
|
|
193
|
+
return (hasOnlyKeys(value, [
|
|
194
|
+
'kind',
|
|
195
|
+
'version',
|
|
196
|
+
'allowPrerelease',
|
|
197
|
+
'allowDowngrade',
|
|
198
|
+
'manifestRange',
|
|
199
|
+
]) &&
|
|
200
|
+
typeof value.version === 'string' &&
|
|
201
|
+
value.version.length > 0 &&
|
|
202
|
+
isOptionalBoolean(value.allowPrerelease) &&
|
|
203
|
+
isOptionalBoolean(value.allowDowngrade) &&
|
|
204
|
+
isOptionalString(value.manifestRange));
|
|
205
|
+
}
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
/*** Validate the reviewed start request without accepting a caller-controlled project root. */
|
|
209
|
+
function isApplyRequest(value) {
|
|
210
|
+
return (isRecord(value) &&
|
|
211
|
+
hasOnlyKeys(value, ['plan', 'permissions']) &&
|
|
212
|
+
isPlanResult(value.plan) &&
|
|
213
|
+
isApplyPermissions(value.permissions));
|
|
214
|
+
}
|
|
215
|
+
/*** Validate the durable resume request without accepting a caller-controlled project root. */
|
|
216
|
+
function isResumeRequest(value) {
|
|
217
|
+
return (isRecord(value) &&
|
|
218
|
+
hasOnlyKeys(value, ['operationId', 'permissions']) &&
|
|
219
|
+
isNonEmptyString(value.operationId) &&
|
|
220
|
+
isApplyPermissions(value.permissions));
|
|
221
|
+
}
|
|
222
|
+
/*** Validate the verify request's operation identity. */
|
|
223
|
+
function isOperationRequest(value) {
|
|
224
|
+
if (!isRecord(value))
|
|
225
|
+
return false;
|
|
226
|
+
return hasOnlyKeys(value, ['operationId']) && isNonEmptyString(value.operationId);
|
|
227
|
+
}
|
|
228
|
+
/*** Validate explicit APM execution permissions. */
|
|
229
|
+
function isApplyPermissions(value) {
|
|
230
|
+
return (isRecord(value) &&
|
|
231
|
+
hasOnlyKeys(value, ['ownerCode', 'lifecycleScripts', 'externalEffects']) &&
|
|
232
|
+
typeof value.ownerCode === 'boolean' &&
|
|
233
|
+
typeof value.lifecycleScripts === 'boolean' &&
|
|
234
|
+
typeof value.externalEffects === 'boolean');
|
|
235
|
+
}
|
|
236
|
+
/*** Validate a reviewed APM plan envelope before passing it back to the executor for revalidation. */
|
|
237
|
+
function isPlanResult(value) {
|
|
238
|
+
return (isRecord(value) &&
|
|
239
|
+
value.schemaVersion === 2 &&
|
|
240
|
+
value.operation === 'plan' &&
|
|
241
|
+
isNonEmptyString(value.id) &&
|
|
242
|
+
isNonEmptyString(value.rootPath) &&
|
|
243
|
+
typeof value.complete === 'boolean' &&
|
|
244
|
+
isRecord(value.policy) &&
|
|
245
|
+
isRecord(value.executor) &&
|
|
246
|
+
isRecord(value.inputFingerprint) &&
|
|
247
|
+
Array.isArray(value.targets) &&
|
|
248
|
+
Array.isArray(value.files) &&
|
|
249
|
+
Array.isArray(value.packages) &&
|
|
250
|
+
Array.isArray(value.artifacts) &&
|
|
251
|
+
Array.isArray(value.steps) &&
|
|
252
|
+
Array.isArray(value.effects) &&
|
|
253
|
+
Array.isArray(value.findings) &&
|
|
254
|
+
Array.isArray(value.blockers) &&
|
|
255
|
+
Array.isArray(value.diagnostics));
|
|
256
|
+
}
|
|
257
|
+
/*** Validate an optional string field. */
|
|
258
|
+
function isOptionalString(value) {
|
|
259
|
+
return value === undefined || typeof value === 'string';
|
|
260
|
+
}
|
|
261
|
+
/*** Validate an optional boolean field. */
|
|
262
|
+
function isOptionalBoolean(value) {
|
|
263
|
+
return value === undefined || typeof value === 'boolean';
|
|
264
|
+
}
|
|
265
|
+
/*** Validate a required non-empty string. */
|
|
266
|
+
function isNonEmptyString(value) {
|
|
267
|
+
return typeof value === 'string' && value.length > 0;
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=registerProjectUpdateRoutes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registerProjectUpdateRoutes.js","sourceRoot":"","sources":["../../../../../src/features/project-updates/adapters/inbound/registerProjectUpdateRoutes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { StudioRuntimeProjectionState } from '../../../../types/project-generation';
|
|
2
|
+
/*** Persist and inspect Studio-owned generated-project state in the canonical `.ankh/generation-state.json` document. */
|
|
3
|
+
export declare class ProjectGenerationStateStore {
|
|
4
|
+
/*** Read whether the current generated project state includes the Studio admin surface. */
|
|
5
|
+
readStudioInclusionAsync(projectPath: string): Promise<boolean>;
|
|
6
|
+
/*** Atomically persist Studio inclusion while preserving runtime projection evidence owned by the same state document. */
|
|
7
|
+
writeStudioInclusionAsync(projectPath: string, includeStudio: boolean): Promise<void>;
|
|
8
|
+
/*** Resolve current runtime projection currency without exposing persisted runtime signatures to callers. */
|
|
9
|
+
readRuntimeProjectionStateAsync(projectPath: string, expectedSignature: string): Promise<StudioRuntimeProjectionState>;
|
|
10
|
+
/*** Record the exact runtime signature only after the owning projection operation completed successfully. */
|
|
11
|
+
recordRuntimeProjectionSuccessAsync(projectPath: string, appliedSignature: string): Promise<void>;
|
|
12
|
+
/*** Persist bounded failure evidence for one attempted runtime signature while retaining the last successful signature. */
|
|
13
|
+
recordRuntimeProjectionFailureAsync(projectPath: string, failedSignature: string): Promise<void>;
|
|
14
|
+
/*** Read one required generation-state document and reject missing state instead of inferring ownership. */
|
|
15
|
+
private requireStateAsync;
|
|
16
|
+
/*** Read, parse and validate one generation-state document, optionally treating a missing file as an empty owner state. */
|
|
17
|
+
private readStateAsync;
|
|
18
|
+
/*** Read one generation-state source document with explicit missing-state semantics. */
|
|
19
|
+
private readStateSourceAsync;
|
|
20
|
+
/*** Parse one generation-state JSON source while preserving the original parse error as its cause. */
|
|
21
|
+
private parseStateSource;
|
|
22
|
+
/*** Validate the semantic shape of Studio's generated-project state document. */
|
|
23
|
+
private isProjectGenerationState;
|
|
24
|
+
/*** Validate persisted runtime projection evidence without accepting unrelated or malformed values. */
|
|
25
|
+
private isRuntimeProjectionEvidence;
|
|
26
|
+
/*** Resolve the canonical project generation-state path while rejecting path escape. */
|
|
27
|
+
private resolveStatePath;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=ProjectGenerationStateStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectGenerationStateStore.d.ts","sourceRoot":"","sources":["../../../../../src/features/projects/adapters/outbound/ProjectGenerationStateStore.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,4BAA4B,EAC7B,MAAM,sCAAsC,CAAC;AAU9C,yHAAyH;AACzH,qBAAa,2BAA2B;IACtC,2FAA2F;IACrF,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKrE,0HAA0H;IACpH,yBAAyB,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAS3F,6GAA6G;IACvG,+BAA+B,CACnC,WAAW,EAAE,MAAM,EACnB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,4BAA4B,CAAC;IAKxC,6GAA6G;IACvG,mCAAmC,CACvC,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC;IAShB,2HAA2H;IACrH,mCAAmC,CACvC,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC;IAahB,4GAA4G;YAC9F,iBAAiB;IAM/B,2HAA2H;YAC7G,cAAc;IAa5B,wFAAwF;YAC1E,oBAAoB;IAkBlC,sGAAsG;IACtG,OAAO,CAAC,gBAAgB;IAQxB,iFAAiF;IACjF,OAAO,CAAC,wBAAwB;IAShC,uGAAuG;IACvG,OAAO,CAAC,2BAA2B;IASnC,wFAAwF;IACxF,OAAO,CAAC,gBAAgB;CAWzB"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { isMissingPathError, writeJsonFileAtomic } from '@ankhorage/utility/node/fs';
|
|
4
|
+
import { isRecord } from '@ankhorage/utility/object';
|
|
5
|
+
import { resolveStudioRuntimeProjectionState } from '../../domain/resolveStudioRuntimeProjectionState';
|
|
6
|
+
const PROJECT_GENERATION_STATE_REL_PATH = '.ankh/generation-state.json';
|
|
7
|
+
/*** Persist and inspect Studio-owned generated-project state in the canonical `.ankh/generation-state.json` document. */
|
|
8
|
+
export class ProjectGenerationStateStore {
|
|
9
|
+
/*** Read whether the current generated project state includes the Studio admin surface. */
|
|
10
|
+
async readStudioInclusionAsync(projectPath) {
|
|
11
|
+
const state = await this.requireStateAsync(projectPath);
|
|
12
|
+
return state.includeStudio;
|
|
13
|
+
}
|
|
14
|
+
/*** Atomically persist Studio inclusion while preserving runtime projection evidence owned by the same state document. */
|
|
15
|
+
async writeStudioInclusionAsync(projectPath, includeStudio) {
|
|
16
|
+
const statePath = this.resolveStatePath(projectPath);
|
|
17
|
+
const current = await this.readStateAsync(statePath, true);
|
|
18
|
+
const state = current
|
|
19
|
+
? { ...current, includeStudio }
|
|
20
|
+
: { includeStudio };
|
|
21
|
+
await writeJsonFileAtomic(statePath, state);
|
|
22
|
+
}
|
|
23
|
+
/*** Resolve current runtime projection currency without exposing persisted runtime signatures to callers. */
|
|
24
|
+
async readRuntimeProjectionStateAsync(projectPath, expectedSignature) {
|
|
25
|
+
const state = await this.requireStateAsync(projectPath);
|
|
26
|
+
return resolveStudioRuntimeProjectionState(state.runtimeProjection, expectedSignature);
|
|
27
|
+
}
|
|
28
|
+
/*** Record the exact runtime signature only after the owning projection operation completed successfully. */
|
|
29
|
+
async recordRuntimeProjectionSuccessAsync(projectPath, appliedSignature) {
|
|
30
|
+
const statePath = this.resolveStatePath(projectPath);
|
|
31
|
+
const current = await this.requireStateAsync(projectPath);
|
|
32
|
+
await writeJsonFileAtomic(statePath, {
|
|
33
|
+
...current,
|
|
34
|
+
runtimeProjection: { appliedSignature },
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/*** Persist bounded failure evidence for one attempted runtime signature while retaining the last successful signature. */
|
|
38
|
+
async recordRuntimeProjectionFailureAsync(projectPath, failedSignature) {
|
|
39
|
+
const statePath = this.resolveStatePath(projectPath);
|
|
40
|
+
const current = await this.requireStateAsync(projectPath);
|
|
41
|
+
const appliedSignature = current.runtimeProjection?.appliedSignature;
|
|
42
|
+
await writeJsonFileAtomic(statePath, {
|
|
43
|
+
...current,
|
|
44
|
+
runtimeProjection: {
|
|
45
|
+
...(appliedSignature === undefined ? {} : { appliedSignature }),
|
|
46
|
+
failedSignature,
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/*** Read one required generation-state document and reject missing state instead of inferring ownership. */
|
|
51
|
+
async requireStateAsync(projectPath) {
|
|
52
|
+
const state = await this.readStateAsync(this.resolveStatePath(projectPath), false);
|
|
53
|
+
if (!state)
|
|
54
|
+
throw new Error('Project generation state unexpectedly resolved as missing.');
|
|
55
|
+
return state;
|
|
56
|
+
}
|
|
57
|
+
/*** Read, parse and validate one generation-state document, optionally treating a missing file as an empty owner state. */
|
|
58
|
+
async readStateAsync(statePath, allowMissing) {
|
|
59
|
+
const source = await this.readStateSourceAsync(statePath, allowMissing);
|
|
60
|
+
if (source === null)
|
|
61
|
+
return null;
|
|
62
|
+
const parsed = this.parseStateSource(source, statePath);
|
|
63
|
+
if (!this.isProjectGenerationState(parsed)) {
|
|
64
|
+
throw new Error(`Project generation state is invalid at '${statePath}'.`);
|
|
65
|
+
}
|
|
66
|
+
return parsed;
|
|
67
|
+
}
|
|
68
|
+
/*** Read one generation-state source document with explicit missing-state semantics. */
|
|
69
|
+
async readStateSourceAsync(statePath, allowMissing) {
|
|
70
|
+
try {
|
|
71
|
+
return await fs.readFile(statePath, 'utf8');
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
if (allowMissing && isMissingPathError(error))
|
|
75
|
+
return null;
|
|
76
|
+
if (isMissingPathError(error)) {
|
|
77
|
+
throw new Error(`Project generation state is missing at '${statePath}'. Run an explicit project sync with includeStudio set before using implicit runtime sync.`, { cause: error });
|
|
78
|
+
}
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/*** Parse one generation-state JSON source while preserving the original parse error as its cause. */
|
|
83
|
+
parseStateSource(source, statePath) {
|
|
84
|
+
try {
|
|
85
|
+
return JSON.parse(source);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
throw new Error(`Project generation state is invalid at '${statePath}'.`, { cause: error });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/*** Validate the semantic shape of Studio's generated-project state document. */
|
|
92
|
+
isProjectGenerationState(value) {
|
|
93
|
+
return (isRecord(value) &&
|
|
94
|
+
typeof value.includeStudio === 'boolean' &&
|
|
95
|
+
(value.runtimeProjection === undefined ||
|
|
96
|
+
this.isRuntimeProjectionEvidence(value.runtimeProjection)));
|
|
97
|
+
}
|
|
98
|
+
/*** Validate persisted runtime projection evidence without accepting unrelated or malformed values. */
|
|
99
|
+
isRuntimeProjectionEvidence(value) {
|
|
100
|
+
return (isRecord(value) &&
|
|
101
|
+
(value.appliedSignature === undefined || typeof value.appliedSignature === 'string') &&
|
|
102
|
+
(value.failedSignature === undefined || typeof value.failedSignature === 'string') &&
|
|
103
|
+
(typeof value.appliedSignature === 'string' || typeof value.failedSignature === 'string'));
|
|
104
|
+
}
|
|
105
|
+
/*** Resolve the canonical project generation-state path while rejecting path escape. */
|
|
106
|
+
resolveStatePath(projectPath) {
|
|
107
|
+
const root = path.resolve(projectPath);
|
|
108
|
+
const target = path.resolve(root, PROJECT_GENERATION_STATE_REL_PATH);
|
|
109
|
+
const relative = path.relative(root, target);
|
|
110
|
+
if (relative.startsWith('..') || path.isAbsolute(relative)) {
|
|
111
|
+
throw new Error(`Invalid project generation state path: ${PROJECT_GENERATION_STATE_REL_PATH}`);
|
|
112
|
+
}
|
|
113
|
+
return target;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=ProjectGenerationStateStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectGenerationStateStore.js","sourceRoot":"","sources":["../../../../../src/features/projects/adapters/outbound/ProjectGenerationStateStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACrF,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAMrD,OAAO,EAAE,mCAAmC,EAAE,MAAM,kDAAkD,CAAC;AAEvG,MAAM,iCAAiC,GAAG,6BAA6B,CAAC;AAOxE,yHAAyH;AACzH,MAAM,OAAO,2BAA2B;IACtC,2FAA2F;IAC3F,KAAK,CAAC,wBAAwB,CAAC,WAAmB;QAChD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACxD,OAAO,KAAK,CAAC,aAAa,CAAC;IAC7B,CAAC;IAED,0HAA0H;IAC1H,KAAK,CAAC,yBAAyB,CAAC,WAAmB,EAAE,aAAsB;QACzE,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC3D,MAAM,KAAK,GAA2B,OAAO;YAC3C,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,aAAa,EAAE;YAC/B,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC;QACtB,MAAM,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED,6GAA6G;IAC7G,KAAK,CAAC,+BAA+B,CACnC,WAAmB,EACnB,iBAAyB;QAEzB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACxD,OAAO,mCAAmC,CAAC,KAAK,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;IACzF,CAAC;IAED,6GAA6G;IAC7G,KAAK,CAAC,mCAAmC,CACvC,WAAmB,EACnB,gBAAwB;QAExB,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAC1D,MAAM,mBAAmB,CAAC,SAAS,EAAE;YACnC,GAAG,OAAO;YACV,iBAAiB,EAAE,EAAE,gBAAgB,EAAE;SACxC,CAAC,CAAC;IACL,CAAC;IAED,2HAA2H;IAC3H,KAAK,CAAC,mCAAmC,CACvC,WAAmB,EACnB,eAAuB;QAEvB,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAC1D,MAAM,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;QACrE,MAAM,mBAAmB,CAAC,SAAS,EAAE;YACnC,GAAG,OAAO;YACV,iBAAiB,EAAE;gBACjB,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC;gBAC/D,eAAe;aAChB;SACF,CAAC,CAAC;IACL,CAAC;IAED,4GAA4G;IACpG,KAAK,CAAC,iBAAiB,CAAC,WAAmB;QACjD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,CAAC;QACnF,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAC1F,OAAO,KAAK,CAAC;IACf,CAAC;IAED,2HAA2H;IACnH,KAAK,CAAC,cAAc,CAC1B,SAAiB,EACjB,YAAqB;QAErB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QACxE,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,2CAA2C,SAAS,IAAI,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,wFAAwF;IAChF,KAAK,CAAC,oBAAoB,CAChC,SAAiB,EACjB,YAAqB;QAErB,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,YAAY,IAAI,kBAAkB,CAAC,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC3D,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CACb,2CAA2C,SAAS,4FAA4F,EAChJ,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,sGAAsG;IAC9F,gBAAgB,CAAC,MAAc,EAAE,SAAiB;QACxD,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAY,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,2CAA2C,SAAS,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IAED,iFAAiF;IACzE,wBAAwB,CAAC,KAAc;QAC7C,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;YACf,OAAO,KAAK,CAAC,aAAa,KAAK,SAAS;YACxC,CAAC,KAAK,CAAC,iBAAiB,KAAK,SAAS;gBACpC,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAC7D,CAAC;IACJ,CAAC;IAED,uGAAuG;IAC/F,2BAA2B,CAAC,KAAc;QAChD,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;YACf,CAAC,KAAK,CAAC,gBAAgB,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,gBAAgB,KAAK,QAAQ,CAAC;YACpF,CAAC,KAAK,CAAC,eAAe,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ,CAAC;YAClF,CAAC,OAAO,KAAK,CAAC,gBAAgB,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ,CAAC,CAC1F,CAAC;IACJ,CAAC;IAED,wFAAwF;IAChF,gBAAgB,CAAC,WAAmB;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,iCAAiC,CAAC,CAAC;QACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7C,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CACb,0CAA0C,iCAAiC,EAAE,CAC9E,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ProjectGenerationStateStore } from '../adapters/outbound/ProjectGenerationStateStore';
|
|
2
|
+
/*** Compose Studio's canonical generated-project state store for host project lifecycle orchestration. */
|
|
3
|
+
export declare function createProjectGenerationStateStore(): ProjectGenerationStateStore;
|
|
4
|
+
//# sourceMappingURL=createProjectGenerationStateStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createProjectGenerationStateStore.d.ts","sourceRoot":"","sources":["../../../../src/features/projects/composition/createProjectGenerationStateStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,kDAAkD,CAAC;AAE/F,0GAA0G;AAC1G,wBAAgB,iCAAiC,IAAI,2BAA2B,CAE/E"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ProjectGenerationStateStore } from '../adapters/outbound/ProjectGenerationStateStore';
|
|
2
|
+
/*** Compose Studio's canonical generated-project state store for host project lifecycle orchestration. */
|
|
3
|
+
export function createProjectGenerationStateStore() {
|
|
4
|
+
return new ProjectGenerationStateStore();
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=createProjectGenerationStateStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createProjectGenerationStateStore.js","sourceRoot":"","sources":["../../../../src/features/projects/composition/createProjectGenerationStateStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,kDAAkD,CAAC;AAE/F,0GAA0G;AAC1G,MAAM,UAAU,iCAAiC;IAC/C,OAAO,IAAI,2BAA2B,EAAE,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ProjectRuntimeProjectionEvidence, StudioRuntimeProjectionState } from '../../../types/project-generation';
|
|
2
|
+
/*** Resolve durable runtime projection evidence against the current runtime-relevant manifest signature. */
|
|
3
|
+
export declare function resolveStudioRuntimeProjectionState(evidence: ProjectRuntimeProjectionEvidence | undefined, expectedSignature: string): StudioRuntimeProjectionState;
|
|
4
|
+
//# sourceMappingURL=resolveStudioRuntimeProjectionState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveStudioRuntimeProjectionState.d.ts","sourceRoot":"","sources":["../../../../src/features/projects/domain/resolveStudioRuntimeProjectionState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gCAAgC,EAChC,4BAA4B,EAC7B,MAAM,mCAAmC,CAAC;AAE3C,4GAA4G;AAC5G,wBAAgB,mCAAmC,CACjD,QAAQ,EAAE,gCAAgC,GAAG,SAAS,EACtD,iBAAiB,EAAE,MAAM,GACxB,4BAA4B,CAc9B"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/*** Resolve durable runtime projection evidence against the current runtime-relevant manifest signature. */
|
|
2
|
+
export function resolveStudioRuntimeProjectionState(evidence, expectedSignature) {
|
|
3
|
+
if (!evidence) {
|
|
4
|
+
return { status: 'unknown', reason: 'missing-evidence' };
|
|
5
|
+
}
|
|
6
|
+
if (evidence.failedSignature === expectedSignature) {
|
|
7
|
+
return { status: 'failed', reason: 'projection-failed' };
|
|
8
|
+
}
|
|
9
|
+
if (evidence.appliedSignature === expectedSignature) {
|
|
10
|
+
return { status: 'current', reason: 'applied' };
|
|
11
|
+
}
|
|
12
|
+
if (evidence.appliedSignature !== undefined || evidence.failedSignature !== undefined) {
|
|
13
|
+
return { status: 'pending', reason: 'manifest-changed' };
|
|
14
|
+
}
|
|
15
|
+
return { status: 'unknown', reason: 'missing-evidence' };
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=resolveStudioRuntimeProjectionState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveStudioRuntimeProjectionState.js","sourceRoot":"","sources":["../../../../src/features/projects/domain/resolveStudioRuntimeProjectionState.ts"],"names":[],"mappings":"AAKA,4GAA4G;AAC5G,MAAM,UAAU,mCAAmC,CACjD,QAAsD,EACtD,iBAAyB;IAEzB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC3D,CAAC;IACD,IAAI,QAAQ,CAAC,eAAe,KAAK,iBAAiB,EAAE,CAAC;QACnD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC3D,CAAC;IACD,IAAI,QAAQ,CAAC,gBAAgB,KAAK,iBAAiB,EAAE,CAAC;QACpD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAClD,CAAC;IACD,IAAI,QAAQ,CAAC,gBAAgB,KAAK,SAAS,IAAI,QAAQ,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QACtF,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC3D,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;AAC3D,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { FastifyInstance } from 'fastify';
|
|
2
2
|
import type { ProjectManager } from '../orchestrator/projectManager';
|
|
3
|
-
type ProjectRuntimeManager = Pick<ProjectManager, 'upInfrastructure'>;
|
|
4
|
-
/*** Register
|
|
3
|
+
type ProjectRuntimeManager = Pick<ProjectManager, 'getProjectRuntimeProjectionState' | 'upInfrastructure'>;
|
|
4
|
+
/*** Register project runtime status and provider-neutral infrastructure recovery HTTP adapters. */
|
|
5
5
|
export declare function registerProjectRuntimeRoutes(fastify: FastifyInstance, options: {
|
|
6
6
|
readonly projectManager: ProjectRuntimeManager;
|
|
7
7
|
readonly workspaceRoot: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectRuntimeRoutes.d.ts","sourceRoot":"","sources":["../../../src/host/http/projectRuntimeRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,SAAS,CAAC;AAE7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAErE,KAAK,qBAAqB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"projectRuntimeRoutes.d.ts","sourceRoot":"","sources":["../../../src/host/http/projectRuntimeRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,SAAS,CAAC;AAE7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAErE,KAAK,qBAAqB,GAAG,IAAI,CAC/B,cAAc,EACd,kCAAkC,GAAG,kBAAkB,CACxD,CAAC;AAEF,mGAAmG;AACnG,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE;IACP,QAAQ,CAAC,cAAc,EAAE,qBAAqB,CAAC;IAC/C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC,GACA,IAAI,CAqBN"}
|
|
@@ -1,5 +1,15 @@
|
|
|
1
|
-
/*** Register
|
|
1
|
+
/*** Register project runtime status and provider-neutral infrastructure recovery HTTP adapters. */
|
|
2
2
|
export function registerProjectRuntimeRoutes(fastify, options) {
|
|
3
|
+
/*** Report bounded runtime projection currency for the project's currently persisted manifest. */
|
|
4
|
+
fastify.get('/api/projects/:id/runtime/projection', async (request, reply) => {
|
|
5
|
+
const { id } = request.params;
|
|
6
|
+
try {
|
|
7
|
+
return await options.projectManager.getProjectRuntimeProjectionState(id);
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
return sendRuntimeFailure(reply, error);
|
|
11
|
+
}
|
|
12
|
+
});
|
|
3
13
|
/*** Reconcile the project's local infrastructure environment to its desired running state. */
|
|
4
14
|
fastify.post('/api/projects/:id/infra/runtime/ensure', async (request, reply) => {
|
|
5
15
|
const { id } = request.params;
|
|
@@ -12,7 +22,7 @@ export function registerProjectRuntimeRoutes(fastify, options) {
|
|
|
12
22
|
}
|
|
13
23
|
});
|
|
14
24
|
}
|
|
15
|
-
/*** Translate a project
|
|
25
|
+
/*** Translate a project runtime failure into the bounded Studio HTTP response. */
|
|
16
26
|
function sendRuntimeFailure(reply, error) {
|
|
17
27
|
const message = error instanceof Error ? error.message : String(error);
|
|
18
28
|
return reply.status(500).send({ error: message });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectRuntimeRoutes.js","sourceRoot":"","sources":["../../../src/host/http/projectRuntimeRoutes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"projectRuntimeRoutes.js","sourceRoot":"","sources":["../../../src/host/http/projectRuntimeRoutes.ts"],"names":[],"mappings":"AASA,mGAAmG;AACnG,MAAM,UAAU,4BAA4B,CAC1C,OAAwB,EACxB,OAGC;IAED,kGAAkG;IAClG,OAAO,CAAC,GAAG,CAAC,sCAAsC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC3E,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAiC,CAAC;QACzD,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC,cAAc,CAAC,gCAAgC,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,8FAA8F;IAC9F,OAAO,CAAC,IAAI,CAAC,wCAAwC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC9E,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAiC,CAAC;QACzD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACrE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QACvC,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,kFAAkF;AAClF,SAAS,kBAAkB,CAAC,KAAmB,EAAE,KAAc;IAC7D,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import type { FastifyInstance } from 'fastify';
|
|
2
|
+
import { createStudioProjectUpdateService } from '../../features/project-updates/composition/createStudioProjectUpdateService';
|
|
2
3
|
import { ModuleManager } from '../orchestrator/moduleManager';
|
|
3
4
|
import { ProjectManager } from '../orchestrator/projectManager';
|
|
4
5
|
/***
|
|
5
|
-
* Compose the Fastify Studio host by applying security middleware and registering project, template, infrastructure, runtime, media and module HTTP endpoints.
|
|
6
|
+
* Compose the Fastify Studio host by applying security middleware and registering project, template, infrastructure, runtime, project-update, media and module HTTP endpoints.
|
|
6
7
|
* @todo Split the remaining inline project/template/infrastructure endpoints into domain-owned HTTP route adapters so this server remains composition/bootstrap only and can satisfy canonical function-size lint rules without local overrides.
|
|
7
8
|
*/
|
|
8
9
|
export declare function createStudioHostServer(args: {
|
|
9
10
|
projectManager: ProjectManager;
|
|
10
11
|
orchestrator: ModuleManager;
|
|
11
12
|
projectRoot: string;
|
|
13
|
+
projectUpdateService?: ReturnType<typeof createStudioProjectUpdateService>;
|
|
12
14
|
fastifyInstance?: FastifyInstance;
|
|
13
15
|
}): Promise<FastifyInstance<import("fastify").RawServerDefault, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault>>;
|
|
14
16
|
export interface StartStudioHostServerOptions {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/host/http/server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAK7E,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/host/http/server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAK7E,OAAO,EAAE,gCAAgC,EAAE,MAAM,6EAA6E,CAAC;AAG/H,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAiChE;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,aAAa,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,UAAU,CAAC,OAAO,gCAAgC,CAAC,CAAC;IAC3E,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC,kPAuOA;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,uHAAuH;AACvH,wBAAsB,qBAAqB,CAAC,OAAO,GAAE,MAAM,GAAG,4BAAiC,kPAY9F"}
|