@ankhorage/studio 2.6.3 → 2.6.4

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 (64) hide show
  1. package/README.md +1 -1
  2. package/apm/update.json +1 -1
  3. package/dist/features/project-updates/adapters/outbound/inspectPendingModuleLifecycleEvidenceAsync.d.ts.map +1 -1
  4. package/dist/features/project-updates/adapters/outbound/inspectPendingModuleLifecycleEvidenceAsync.js +23 -59
  5. package/dist/features/project-updates/adapters/outbound/inspectPendingModuleLifecycleEvidenceAsync.js.map +1 -1
  6. package/dist/features/project-updates/adapters/outbound/readPendingModuleLifecycleStateAsync.d.ts +21 -0
  7. package/dist/features/project-updates/adapters/outbound/readPendingModuleLifecycleStateAsync.d.ts.map +1 -0
  8. package/dist/features/project-updates/adapters/outbound/readPendingModuleLifecycleStateAsync.js +35 -0
  9. package/dist/features/project-updates/adapters/outbound/readPendingModuleLifecycleStateAsync.js.map +1 -0
  10. package/dist/features/project-updates/adapters/outbound/readStudioManifestDigestAsync.d.ts +3 -0
  11. package/dist/features/project-updates/adapters/outbound/readStudioManifestDigestAsync.d.ts.map +1 -0
  12. package/dist/features/project-updates/adapters/outbound/readStudioManifestDigestAsync.js +9 -0
  13. package/dist/features/project-updates/adapters/outbound/readStudioManifestDigestAsync.js.map +1 -0
  14. package/dist/features/project-updates/adapters/outbound/resolveCurrentStudioApmArtifactAsync.d.ts +15 -0
  15. package/dist/features/project-updates/adapters/outbound/resolveCurrentStudioApmArtifactAsync.d.ts.map +1 -0
  16. package/dist/features/project-updates/adapters/outbound/resolveCurrentStudioApmArtifactAsync.js +32 -0
  17. package/dist/features/project-updates/adapters/outbound/resolveCurrentStudioApmArtifactAsync.js.map +1 -0
  18. package/dist/features/project-updates/application/StudioPendingModuleLifecyclePort.d.ts +6 -0
  19. package/dist/features/project-updates/application/StudioPendingModuleLifecyclePort.d.ts.map +1 -0
  20. package/dist/features/project-updates/application/StudioPendingModuleLifecyclePort.js +2 -0
  21. package/dist/features/project-updates/application/StudioPendingModuleLifecyclePort.js.map +1 -0
  22. package/dist/features/project-updates/application/planPendingModuleLifecycleAsync.d.ts +15 -0
  23. package/dist/features/project-updates/application/planPendingModuleLifecycleAsync.d.ts.map +1 -0
  24. package/dist/features/project-updates/application/planPendingModuleLifecycleAsync.js +214 -0
  25. package/dist/features/project-updates/application/planPendingModuleLifecycleAsync.js.map +1 -0
  26. package/dist/features/project-updates/composition/createStudioProjectUpdateApplyOwnerStepPort.d.ts +5 -0
  27. package/dist/features/project-updates/composition/createStudioProjectUpdateApplyOwnerStepPort.d.ts.map +1 -0
  28. package/dist/features/project-updates/composition/createStudioProjectUpdateApplyOwnerStepPort.js +171 -0
  29. package/dist/features/project-updates/composition/createStudioProjectUpdateApplyOwnerStepPort.js.map +1 -0
  30. package/dist/features/project-updates/composition/createStudioProjectUpdateProtocolPort.d.ts +9 -3
  31. package/dist/features/project-updates/composition/createStudioProjectUpdateProtocolPort.d.ts.map +1 -1
  32. package/dist/features/project-updates/composition/createStudioProjectUpdateProtocolPort.js +51 -12
  33. package/dist/features/project-updates/composition/createStudioProjectUpdateProtocolPort.js.map +1 -1
  34. package/dist/features/project-updates/composition/createStudioProjectUpdateService.d.ts +3 -2
  35. package/dist/features/project-updates/composition/createStudioProjectUpdateService.d.ts.map +1 -1
  36. package/dist/features/project-updates/composition/createStudioProjectUpdateService.js +13 -3
  37. package/dist/features/project-updates/composition/createStudioProjectUpdateService.js.map +1 -1
  38. package/dist/features/project-updates/composition/createStudioProjectUpdateVerifyOwnerStepPort.d.ts +5 -0
  39. package/dist/features/project-updates/composition/createStudioProjectUpdateVerifyOwnerStepPort.d.ts.map +1 -0
  40. package/dist/features/project-updates/composition/createStudioProjectUpdateVerifyOwnerStepPort.js +67 -0
  41. package/dist/features/project-updates/composition/createStudioProjectUpdateVerifyOwnerStepPort.js.map +1 -0
  42. package/dist/features/project-updates/domain/pendingModuleLifecycleState.d.ts +24 -0
  43. package/dist/features/project-updates/domain/pendingModuleLifecycleState.d.ts.map +1 -0
  44. package/dist/features/project-updates/domain/pendingModuleLifecycleState.js +48 -0
  45. package/dist/features/project-updates/domain/pendingModuleLifecycleState.js.map +1 -0
  46. package/dist/features/project-updates/domain/pendingModulePlanStep.d.ts +10 -0
  47. package/dist/features/project-updates/domain/pendingModulePlanStep.d.ts.map +1 -0
  48. package/dist/features/project-updates/domain/pendingModulePlanStep.js +25 -0
  49. package/dist/features/project-updates/domain/pendingModulePlanStep.js.map +1 -0
  50. package/dist/host/createStudioHost.d.ts.map +1 -1
  51. package/dist/host/createStudioHost.js +2 -1
  52. package/dist/host/createStudioHost.js.map +1 -1
  53. package/dist/host/orchestrator/createHostModuleOrchestrator.d.ts +4 -0
  54. package/dist/host/orchestrator/createHostModuleOrchestrator.d.ts.map +1 -0
  55. package/dist/host/orchestrator/createHostModuleOrchestrator.js +10 -0
  56. package/dist/host/orchestrator/createHostModuleOrchestrator.js.map +1 -0
  57. package/dist/host/orchestrator/createStudioPendingModuleLifecyclePort.d.ts +4 -0
  58. package/dist/host/orchestrator/createStudioPendingModuleLifecyclePort.d.ts.map +1 -0
  59. package/dist/host/orchestrator/createStudioPendingModuleLifecyclePort.js +20 -0
  60. package/dist/host/orchestrator/createStudioPendingModuleLifecyclePort.js.map +1 -0
  61. package/dist/host/orchestrator/moduleManager.d.ts.map +1 -1
  62. package/dist/host/orchestrator/moduleManager.js +3 -6
  63. package/dist/host/orchestrator/moduleManager.js.map +1 -1
  64. package/package.json +2 -2
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  # @ankhorage/studio
5
5
 
6
- ![license: MIT](././paradox/badges/license.svg) ![npm: v2.6.2](././paradox/badges/npm.svg) ![runtime: bun](././paradox/badges/runtime.svg) ![typescript: strict](././paradox/badges/typescript.svg) ![eslint: checked](././paradox/badges/eslint.svg) ![prettier: checked](././paradox/badges/prettier.svg) ![build: checked](././paradox/badges/build.svg) ![tests: checked](././paradox/badges/tests.svg) ![docs: paradox](././paradox/badges/docs.svg)
6
+ ![license: MIT](././paradox/badges/license.svg) ![npm: v2.6.3](././paradox/badges/npm.svg) ![runtime: bun](././paradox/badges/runtime.svg) ![typescript: strict](././paradox/badges/typescript.svg) ![eslint: checked](././paradox/badges/eslint.svg) ![prettier: checked](././paradox/badges/prettier.svg) ![build: checked](././paradox/badges/build.svg) ![tests: checked](././paradox/badges/tests.svg) ![docs: paradox](././paradox/badges/docs.svg)
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.6.3" },
4
+ "owner": { "name": "@ankhorage/studio", "version": "2.6.4" },
5
5
  "history": {
6
6
  "supported": [{ "sourceRange": ">=2.5.7 <3.0.0", "mode": "no-migration" }],
7
7
  "unsupported": [],
@@ -1 +1 @@
1
- {"version":3,"file":"inspectPendingModuleLifecycleEvidenceAsync.d.ts","sourceRoot":"","sources":["../../../../../src/features/project-updates/adapters/outbound/inspectPendingModuleLifecycleEvidenceAsync.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AASjE,4FAA4F;AAC5F,wBAAsB,0CAA0C,CAC9D,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,CAAC,CAQ/B"}
1
+ {"version":3,"file":"inspectPendingModuleLifecycleEvidenceAsync.d.ts","sourceRoot":"","sources":["../../../../../src/features/project-updates/adapters/outbound/inspectPendingModuleLifecycleEvidenceAsync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAUjE,4FAA4F;AAC5F,wBAAsB,0CAA0C,CAC9D,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,CAAC,CAY/B"}
@@ -1,57 +1,22 @@
1
- import { readFile } from 'node:fs/promises';
2
- import path from 'node:path';
3
- import { isRecord } from '@ankhorage/utility/object';
4
1
  import { STUDIO_PENDING_MODULE_LIFECYCLE_EVIDENCE, STUDIO_PENDING_MODULE_LIFECYCLE_FILE, STUDIO_PENDING_MODULE_LIFECYCLE_PROJECTION_ID, } from '../../constants';
2
+ import { pendingModuleLifecycleIds } from '../../domain/pendingModuleLifecycleState';
3
+ import { readPendingModuleLifecycleStateAsync } from './readPendingModuleLifecycleStateAsync';
5
4
  /*** Inspect Studio's deferred module removals without mutating or executing the project. */
6
5
  export async function inspectPendingModuleLifecycleEvidenceAsync(rootPath) {
7
- const filePath = path.join(rootPath, STUDIO_PENDING_MODULE_LIFECYCLE_FILE);
8
- try {
9
- const content = await readFile(filePath, 'utf8');
10
- return toExtensionEvidence(parsePendingModuleIds(content));
6
+ const result = await readPendingModuleLifecycleStateAsync(rootPath);
7
+ switch (result.state) {
8
+ case 'absent':
9
+ return availableEvidence([], undefined);
10
+ case 'valid':
11
+ return availableEvidence(pendingModuleLifecycleIds(result.value), result.digest);
12
+ case 'invalid':
13
+ return malformedEvidence(result.digest);
14
+ case 'unreadable':
15
+ return unreadableEvidence(result.reason);
11
16
  }
12
- catch (error) {
13
- return isMissingFileError(error) ? availableEvidence([]) : unreadableEvidence(error);
14
- }
15
- }
16
- /*** Parse only the current Studio pending-operation shape and reject ambiguous state. */
17
- function parsePendingModuleIds(content) {
18
- const value = parseJson(content);
19
- if (!isRecord(value) || !Array.isArray(value.ops))
20
- return { valid: false };
21
- const moduleIds = value.ops.map(readPendingModuleId);
22
- if (moduleIds.some((moduleId) => moduleId === undefined))
23
- return { valid: false };
24
- const ids = moduleIds.filter((moduleId) => moduleId !== undefined);
25
- return { valid: true, moduleIds: [...new Set(ids)].sort(compareText) };
26
- }
27
- /*** Parse JSON into unknown data without allowing JSON.parse's any type beyond this boundary. */
28
- function parseJson(content) {
29
- try {
30
- const value = JSON.parse(content);
31
- return value;
32
- }
33
- catch {
34
- return undefined;
35
- }
36
- }
37
- /*** Validate one queued uninstall operation and return its normalized module id. */
38
- function readPendingModuleId(value) {
39
- if (!isRecord(value) || value.type !== 'uninstall')
40
- return undefined;
41
- if (typeof value.moduleId !== 'string' || value.moduleId.trim() === '')
42
- return undefined;
43
- if (typeof value.at !== 'string' || value.at.trim() === '')
44
- return undefined;
45
- return value.moduleId.trim();
46
- }
47
- /*** Convert parsed pending state into conservative APM extension evidence. */
48
- function toExtensionEvidence(result) {
49
- if (!result.valid)
50
- return malformedEvidence();
51
- return availableEvidence(result.moduleIds);
52
17
  }
53
18
  /*** Return complete Studio extension evidence for absent, empty, or valid pending state. */
54
- function availableEvidence(moduleIds) {
19
+ function availableEvidence(moduleIds, digest) {
55
20
  if (moduleIds.length === 0) {
56
21
  return { state: 'available', complete: true, observations: [], diagnostics: [] };
57
22
  }
@@ -63,7 +28,7 @@ function availableEvidence(moduleIds) {
63
28
  owner: '@ankhorage/studio',
64
29
  projection: 'stale',
65
30
  migration: 'not-applicable',
66
- evidence: pendingEvidence(moduleIds),
31
+ evidence: pendingEvidence(moduleIds, digest),
67
32
  reason: 'Studio has deferred module removals that are not yet materialized.',
68
33
  nextAction: 'Review the pending Studio module lifecycle work before applying project updates.',
69
34
  },
@@ -72,8 +37,8 @@ function availableEvidence(moduleIds) {
72
37
  };
73
38
  }
74
39
  /*** Return incomplete evidence when the pending file exists but has an unsupported shape. */
75
- function malformedEvidence() {
76
- const evidence = baseEvidence();
40
+ function malformedEvidence(digest) {
41
+ const evidence = [...baseEvidence(), `pending-digest:${digest}`];
77
42
  return {
78
43
  state: 'available',
79
44
  complete: false,
@@ -100,8 +65,7 @@ function malformedEvidence() {
100
65
  };
101
66
  }
102
67
  /*** Return incomplete evidence when the pending state cannot be read for an unexpected reason. */
103
- function unreadableEvidence(error) {
104
- const detail = error instanceof Error ? error.message : 'unknown pending-state read failure';
68
+ function unreadableEvidence(detail) {
105
69
  return {
106
70
  state: 'available',
107
71
  complete: false,
@@ -128,17 +92,17 @@ function unreadableEvidence(error) {
128
92
  };
129
93
  }
130
94
  /*** Build stable evidence for the pending lifecycle projection. */
131
- function pendingEvidence(moduleIds) {
132
- return [...baseEvidence(), ...moduleIds.map((moduleId) => `module-uninstall:${moduleId}`)];
95
+ function pendingEvidence(moduleIds, digest) {
96
+ return [
97
+ ...baseEvidence(),
98
+ ...(digest === undefined ? [] : [`pending-digest:${digest}`]),
99
+ ...[...moduleIds].sort(compareText).map((moduleId) => `module-uninstall:${moduleId}`),
100
+ ];
133
101
  }
134
102
  /*** Build the stable evidence prefix used to recognize Studio's pending lifecycle projection. */
135
103
  function baseEvidence() {
136
104
  return [STUDIO_PENDING_MODULE_LIFECYCLE_EVIDENCE, STUDIO_PENDING_MODULE_LIFECYCLE_FILE];
137
105
  }
138
- /*** Detect a missing pending file without depending on a Node-specific error assertion. */
139
- function isMissingFileError(error) {
140
- return isRecord(error) && error.code === 'ENOENT';
141
- }
142
106
  /*** Compare serialized identifiers without locale-dependent ordering. */
143
107
  function compareText(left, right) {
144
108
  if (left < right)
@@ -1 +1 @@
1
- {"version":3,"file":"inspectPendingModuleLifecycleEvidenceAsync.js","sourceRoot":"","sources":["../../../../../src/features/project-updates/adapters/outbound/inspectPendingModuleLifecycleEvidenceAsync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inspectPendingModuleLifecycleEvidenceAsync.js","sourceRoot":"","sources":["../../../../../src/features/project-updates/adapters/outbound/inspectPendingModuleLifecycleEvidenceAsync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { type PendingModuleLifecycleState } from '../../domain/pendingModuleLifecycleState';
2
+ export type PendingModuleLifecycleReadResult = {
3
+ readonly state: 'absent';
4
+ } | {
5
+ readonly state: 'valid';
6
+ readonly value: PendingModuleLifecycleState;
7
+ readonly content: string;
8
+ readonly digest: string;
9
+ } | {
10
+ readonly state: 'invalid';
11
+ readonly content: string;
12
+ readonly digest: string;
13
+ } | {
14
+ readonly state: 'unreadable';
15
+ readonly reason: string;
16
+ };
17
+ /*** Read Studio pending lifecycle state with an immutable digest for plan/recovery preconditions. */
18
+ export declare function readPendingModuleLifecycleStateAsync(rootPath: string): Promise<PendingModuleLifecycleReadResult>;
19
+ /*** Compute the canonical SHA-256 digest used by APM reviewed text changes. */
20
+ export declare function digestProjectUpdateText(content: string): string;
21
+ //# sourceMappingURL=readPendingModuleLifecycleStateAsync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readPendingModuleLifecycleStateAsync.d.ts","sourceRoot":"","sources":["../../../../../src/features/project-updates/adapters/outbound/readPendingModuleLifecycleStateAsync.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,0CAA0C,CAAC;AAElD,MAAM,MAAM,gCAAgC,GACxC;IAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,GAC5B;IACE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,2BAA2B,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GACD;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChF;IAAE,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9D,qGAAqG;AACrG,wBAAsB,oCAAoC,CACxD,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gCAAgC,CAAC,CAgB3C;AAED,+EAA+E;AAC/E,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE/D"}
@@ -0,0 +1,35 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { readFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { isMissingPathError } from '@ankhorage/utility/node/fs';
5
+ import { STUDIO_PENDING_MODULE_LIFECYCLE_FILE } from '../../constants';
6
+ import { parsePendingModuleLifecycleState, } from '../../domain/pendingModuleLifecycleState';
7
+ /*** Read Studio pending lifecycle state with an immutable digest for plan/recovery preconditions. */
8
+ export async function readPendingModuleLifecycleStateAsync(rootPath) {
9
+ const filePath = path.join(rootPath, STUDIO_PENDING_MODULE_LIFECYCLE_FILE);
10
+ try {
11
+ const content = await readFile(filePath, 'utf8');
12
+ const digest = digestText(content);
13
+ const parsed = parsePendingModuleLifecycleState(content);
14
+ return parsed.valid
15
+ ? { state: 'valid', value: parsed.value, content, digest }
16
+ : { state: 'invalid', content, digest };
17
+ }
18
+ catch (error) {
19
+ if (isMissingPathError(error))
20
+ return { state: 'absent' };
21
+ return {
22
+ state: 'unreadable',
23
+ reason: error instanceof Error ? error.message : 'unknown pending-state read failure',
24
+ };
25
+ }
26
+ }
27
+ /*** Compute the canonical SHA-256 digest used by APM reviewed text changes. */
28
+ export function digestProjectUpdateText(content) {
29
+ return digestText(content);
30
+ }
31
+ /*** Hash one reviewed text value without environment-dependent encoding. */
32
+ function digestText(content) {
33
+ return createHash('sha256').update(content, 'utf8').digest('hex');
34
+ }
35
+ //# sourceMappingURL=readPendingModuleLifecycleStateAsync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readPendingModuleLifecycleStateAsync.js","sourceRoot":"","sources":["../../../../../src/features/project-updates/adapters/outbound/readPendingModuleLifecycleStateAsync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,OAAO,EAAE,oCAAoC,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EACL,gCAAgC,GAEjC,MAAM,0CAA0C,CAAC;AAalD,qGAAqG;AACrG,MAAM,CAAC,KAAK,UAAU,oCAAoC,CACxD,QAAgB;IAEhB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,oCAAoC,CAAC,CAAC;IAC3E,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,gCAAgC,CAAC,OAAO,CAAC,CAAC;QACzD,OAAO,MAAM,CAAC,KAAK;YACjB,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE;YAC1D,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,IAAI,kBAAkB,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QAC1D,OAAO;YACL,KAAK,EAAE,YAAY;YACnB,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oCAAoC;SACtF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED,4EAA4E;AAC5E,SAAS,UAAU,CAAC,OAAe;IACjC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,3 @@
1
+ /*** Read the canonical Studio manifest bytes and digest used as an irreversible-effect precondition. */
2
+ export declare function readStudioManifestDigestAsync(rootPath: string): Promise<string>;
3
+ //# sourceMappingURL=readStudioManifestDigestAsync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readStudioManifestDigestAsync.d.ts","sourceRoot":"","sources":["../../../../../src/features/project-updates/adapters/outbound/readStudioManifestDigestAsync.ts"],"names":[],"mappings":"AAOA,wGAAwG;AACxG,wBAAsB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAErF"}
@@ -0,0 +1,9 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { digestProjectUpdateText } from './readPendingModuleLifecycleStateAsync';
4
+ const STUDIO_MANIFEST_FILE = 'ankh.config.json';
5
+ /*** Read the canonical Studio manifest bytes and digest used as an irreversible-effect precondition. */
6
+ export async function readStudioManifestDigestAsync(rootPath) {
7
+ return digestProjectUpdateText(await readFile(path.join(rootPath, STUDIO_MANIFEST_FILE), 'utf8'));
8
+ }
9
+ //# sourceMappingURL=readStudioManifestDigestAsync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readStudioManifestDigestAsync.js","sourceRoot":"","sources":["../../../../../src/features/project-updates/adapters/outbound/readStudioManifestDigestAsync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAEjF,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AAEhD,wGAAwG;AACxG,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,QAAgB;IAClE,OAAO,uBAAuB,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,oBAAoB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AACpG,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ApmExtensionArtifactIdentity, ApmExtensionArtifactIdentityResolution } from '@ankhorage/apm/types';
2
+ declare const STUDIO_PACKAGE_NAME = "@ankhorage/studio";
3
+ export interface CurrentStudioApmArtifactBinding {
4
+ readonly packageName: typeof STUDIO_PACKAGE_NAME;
5
+ readonly version: string;
6
+ readonly descriptorDigest: string;
7
+ }
8
+ /*** Resolve this installed Studio version to its immutable published npm artifact identity. */
9
+ export declare function resolveCurrentStudioApmArtifactAsync(rootPath: string): Promise<ApmExtensionArtifactIdentityResolution>;
10
+ /*** Read the exact package version and update-descriptor digest loaded by this Studio runtime. */
11
+ export declare function readCurrentStudioApmArtifactBindingAsync(): Promise<CurrentStudioApmArtifactBinding>;
12
+ /*** Test whether one reviewed owner artifact is executed by this exact loaded Studio package. */
13
+ export declare function currentStudioApmArtifactMatchesAsync(artifact: ApmExtensionArtifactIdentity): Promise<boolean>;
14
+ export {};
15
+ //# sourceMappingURL=resolveCurrentStudioApmArtifactAsync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveCurrentStudioApmArtifactAsync.d.ts","sourceRoot":"","sources":["../../../../../src/features/project-updates/adapters/outbound/resolveCurrentStudioApmArtifactAsync.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,4BAA4B,EAC5B,sCAAsC,EACvC,MAAM,sBAAsB,CAAC;AAI9B,QAAA,MAAM,mBAAmB,sBAAsB,CAAC;AAGhD,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,WAAW,EAAE,OAAO,mBAAmB,CAAC;IACjD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED,+FAA+F;AAC/F,wBAAsB,oCAAoC,CACxD,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,sCAAsC,CAAC,CAOjD;AAED,kGAAkG;AAClG,wBAAsB,wCAAwC,IAAI,OAAO,CAAC,+BAA+B,CAAC,CAOzG;AAED,iGAAiG;AACjG,wBAAsB,oCAAoC,CACxD,QAAQ,EAAE,4BAA4B,GACrC,OAAO,CAAC,OAAO,CAAC,CAOlB"}
@@ -0,0 +1,32 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { readFile } from 'node:fs/promises';
3
+ import { resolveNpmExtensionArtifactIdentityAsync } from '@ankhorage/apm/node';
4
+ import { getGeneratedPackagePolicy } from './getGeneratedPackagePolicy';
5
+ const STUDIO_PACKAGE_NAME = '@ankhorage/studio';
6
+ const UPDATE_DESCRIPTOR_URL = new URL('../../../../../apm/update.json', import.meta.url);
7
+ /*** Resolve this installed Studio version to its immutable published npm artifact identity. */
8
+ export async function resolveCurrentStudioApmArtifactAsync(rootPath) {
9
+ const binding = await readCurrentStudioApmArtifactBindingAsync();
10
+ return resolveNpmExtensionArtifactIdentityAsync({
11
+ rootPath,
12
+ role: 'target',
13
+ ...binding,
14
+ });
15
+ }
16
+ /*** Read the exact package version and update-descriptor digest loaded by this Studio runtime. */
17
+ export async function readCurrentStudioApmArtifactBindingAsync() {
18
+ const descriptorSource = await readFile(UPDATE_DESCRIPTOR_URL, 'utf8');
19
+ return {
20
+ packageName: STUDIO_PACKAGE_NAME,
21
+ version: getGeneratedPackagePolicy().ownerVersion,
22
+ descriptorDigest: createHash('sha256').update(descriptorSource, 'utf8').digest('hex'),
23
+ };
24
+ }
25
+ /*** Test whether one reviewed owner artifact is executed by this exact loaded Studio package. */
26
+ export async function currentStudioApmArtifactMatchesAsync(artifact) {
27
+ const binding = await readCurrentStudioApmArtifactBindingAsync();
28
+ return (artifact.packageName === binding.packageName &&
29
+ artifact.version === binding.version &&
30
+ artifact.descriptorDigest === binding.descriptorDigest);
31
+ }
32
+ //# sourceMappingURL=resolveCurrentStudioApmArtifactAsync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveCurrentStudioApmArtifactAsync.js","sourceRoot":"","sources":["../../../../../src/features/project-updates/adapters/outbound/resolveCurrentStudioApmArtifactAsync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,wCAAwC,EAAE,MAAM,qBAAqB,CAAC;AAM/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAExE,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AAChD,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,gCAAgC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAQzF,+FAA+F;AAC/F,MAAM,CAAC,KAAK,UAAU,oCAAoC,CACxD,QAAgB;IAEhB,MAAM,OAAO,GAAG,MAAM,wCAAwC,EAAE,CAAC;IACjE,OAAO,wCAAwC,CAAC;QAC9C,QAAQ;QACR,IAAI,EAAE,QAAQ;QACd,GAAG,OAAO;KACX,CAAC,CAAC;AACL,CAAC;AAED,kGAAkG;AAClG,MAAM,CAAC,KAAK,UAAU,wCAAwC;IAC5D,MAAM,gBAAgB,GAAG,MAAM,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IACvE,OAAO;QACL,WAAW,EAAE,mBAAmB;QAChC,OAAO,EAAE,yBAAyB,EAAE,CAAC,YAAY;QACjD,gBAAgB,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;KACtF,CAAC;AACJ,CAAC;AAED,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,oCAAoC,CACxD,QAAsC;IAEtC,MAAM,OAAO,GAAG,MAAM,wCAAwC,EAAE,CAAC;IACjE,OAAO,CACL,QAAQ,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW;QAC5C,QAAQ,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO;QACpC,QAAQ,CAAC,gBAAgB,KAAK,OAAO,CAAC,gBAAgB,CACvD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ /*** Trusted host boundary for observing and executing one published Orchestrator module removal. */
2
+ export interface StudioPendingModuleLifecyclePort {
3
+ readonly isModuleInstalledAsync: (rootPath: string, moduleId: string) => Promise<boolean | undefined>;
4
+ readonly removeModuleAsync: (rootPath: string, moduleId: string) => Promise<void>;
5
+ }
6
+ //# sourceMappingURL=StudioPendingModuleLifecyclePort.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StudioPendingModuleLifecyclePort.d.ts","sourceRoot":"","sources":["../../../../src/features/project-updates/application/StudioPendingModuleLifecyclePort.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,sBAAsB,EAAE,CAC/B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IAClC,QAAQ,CAAC,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=StudioPendingModuleLifecyclePort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StudioPendingModuleLifecyclePort.js","sourceRoot":"","sources":["../../../../src/features/project-updates/application/StudioPendingModuleLifecyclePort.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import type { ApmExtensionArtifactIdentityResolution, ApmPlanArtifactIdentity, ApmPlanBlocker, ApmPlanFileChange, ApmPlanStep } from '@ankhorage/apm/types';
2
+ export interface PendingModuleLifecyclePlanSlice {
3
+ readonly files: readonly ApmPlanFileChange[];
4
+ readonly artifacts: readonly ApmPlanArtifactIdentity[];
5
+ readonly steps: readonly ApmPlanStep[];
6
+ readonly blockers: readonly ApmPlanBlocker[];
7
+ }
8
+ /*** Plan reviewed Orchestrator removals plus APM-native Studio lifecycle file finalization. */
9
+ export declare function planPendingModuleLifecycleAsync(input: {
10
+ readonly rootPath: string;
11
+ readonly expectedPendingDigest: string;
12
+ readonly resolveArtifactAsync: (rootPath: string) => Promise<ApmExtensionArtifactIdentityResolution>;
13
+ readonly nowIso: () => string;
14
+ }): Promise<PendingModuleLifecyclePlanSlice>;
15
+ //# sourceMappingURL=planPendingModuleLifecycleAsync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planPendingModuleLifecycleAsync.d.ts","sourceRoot":"","sources":["../../../../src/features/project-updates/application/planPendingModuleLifecycleAsync.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,sCAAsC,EACtC,uBAAuB,EACvB,cAAc,EACd,iBAAiB,EACjB,WAAW,EACZ,MAAM,sBAAsB,CAAC;AAuB9B,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,KAAK,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC7C,QAAQ,CAAC,SAAS,EAAE,SAAS,uBAAuB,EAAE,CAAC;IACvD,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;CAC9C;AAED,+FAA+F;AAC/F,wBAAsB,+BAA+B,CAAC,KAAK,EAAE;IAC3D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,oBAAoB,EAAE,CAC7B,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC,sCAAsC,CAAC,CAAC;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC;CAC/B,GAAG,OAAO,CAAC,+BAA+B,CAAC,CAgD3C"}
@@ -0,0 +1,214 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { isAppManifest } from '../../../contractGuards';
4
+ import { digestProjectUpdateText, readPendingModuleLifecycleStateAsync, } from '../adapters/outbound/readPendingModuleLifecycleStateAsync';
5
+ import { STUDIO_PENDING_MODULE_LIFECYCLE_FILE, STUDIO_PENDING_MODULE_LIFECYCLE_PROJECTION_ID, } from '../constants';
6
+ import { pendingModuleLifecycleIds, removeReviewedPendingModules, serializePendingModuleLifecycleState, } from '../domain/pendingModuleLifecycleState';
7
+ const STUDIO_MANIFEST_FILE = 'ankh.config.json';
8
+ const STUDIO_PACKAGE_NAME = '@ankhorage/studio';
9
+ const REMOVAL_STEP_PREFIX = 'projection:@ankhorage/studio:pending-module-remove:';
10
+ const FINALIZE_STEP_ID = 'dependency-files:studio-pending-module-lifecycle';
11
+ /*** Plan reviewed Orchestrator removals plus APM-native Studio lifecycle file finalization. */
12
+ export async function planPendingModuleLifecycleAsync(input) {
13
+ const pending = await readPendingModuleLifecycleStateAsync(input.rootPath);
14
+ if (pending.state !== 'valid')
15
+ return blockedPendingState(input.rootPath, pending.state);
16
+ if (pending.digest !== input.expectedPendingDigest) {
17
+ return blockedDigest(input.rootPath, input.expectedPendingDigest, pending.digest);
18
+ }
19
+ const moduleIds = pendingModuleLifecycleIds(pending.value);
20
+ if (moduleIds.length === 0)
21
+ return emptySlice();
22
+ const artifactResolution = await input.resolveArtifactAsync(input.rootPath);
23
+ if (artifactResolution.state !== 'resolved') {
24
+ return blockedArtifact(input.rootPath, artifactResolution.reason, artifactResolution.evidence);
25
+ }
26
+ const manifestPath = path.join(input.rootPath, STUDIO_MANIFEST_FILE);
27
+ const manifestContent = await readFile(manifestPath, 'utf8');
28
+ const manifestDigest = digestProjectUpdateText(manifestContent);
29
+ const manifest = parseManifest(manifestContent);
30
+ const reviewedIds = new Set(moduleIds);
31
+ const nextManifest = projectReviewedRemovals(manifest, reviewedIds, input.nowIso());
32
+ const nextManifestContent = serializeManifest(nextManifest);
33
+ const nextPending = removeReviewedPendingModules(pending.value, reviewedIds);
34
+ const files = reviewedFileChanges({
35
+ manifestContent,
36
+ nextManifestContent,
37
+ pendingContent: pending.content,
38
+ nextPendingContent: nextPending.ops.length === 0 ? undefined : serializePendingModuleLifecycleState(nextPending),
39
+ });
40
+ const removalSteps = moduleIds.map((moduleId, index) => removalStep({
41
+ moduleId,
42
+ prerequisites: index === 0 ? [] : [removalStepId(moduleIds[index - 1] ?? '')],
43
+ pendingDigest: pending.digest,
44
+ manifestDigest,
45
+ artifact: artifactResolution.artifact,
46
+ }));
47
+ const lastRemovalStep = removalSteps.at(-1);
48
+ return {
49
+ files,
50
+ artifacts: [toPlanArtifact(artifactResolution.artifact)],
51
+ steps: [
52
+ ...removalSteps,
53
+ finalizationStep(files, lastRemovalStep === undefined ? [] : [lastRemovalStep.id]),
54
+ ],
55
+ blockers: [],
56
+ };
57
+ }
58
+ /*** Build one non-restartable dynamic owner step for exactly one Orchestrator module removal. */
59
+ function removalStep(input) {
60
+ const projectionId = `pending-module-remove:${input.moduleId}`;
61
+ const evidence = [
62
+ `module-uninstall:${input.moduleId}`,
63
+ `pending-digest:${input.pendingDigest}`,
64
+ `manifest-digest:${input.manifestDigest}`,
65
+ ];
66
+ return {
67
+ id: removalStepId(input.moduleId),
68
+ kind: 'projection',
69
+ prerequisites: input.prerequisites,
70
+ owner: STUDIO_PACKAGE_NAME,
71
+ reason: `Remove reviewed pending Orchestrator module '${input.moduleId}'.`,
72
+ evidence,
73
+ execution: {
74
+ kind: 'projection',
75
+ descriptor: {
76
+ id: projectionId,
77
+ claims: [{ kind: 'dynamic', scope: `orchestrator-module:${input.moduleId}` }],
78
+ requiresExtension: false,
79
+ reason: 'Studio delegates module uninstall side effects to the published Orchestrator owner.',
80
+ },
81
+ artifact: input.artifact,
82
+ plan: {
83
+ projectionId,
84
+ mutations: [],
85
+ inputFingerprint: `pending:${input.pendingDigest}:manifest:${input.manifestDigest}:${input.moduleId}`,
86
+ generatorFingerprint: input.artifact.descriptorDigest,
87
+ evidence,
88
+ },
89
+ },
90
+ };
91
+ }
92
+ /*** Build the native APM file step that commits canonical Studio lifecycle state after removals. */
93
+ function finalizationStep(files, prerequisites) {
94
+ const filePaths = files.map(({ path: filePath }) => filePath);
95
+ return {
96
+ id: FINALIZE_STEP_ID,
97
+ kind: 'dependency-files',
98
+ prerequisites,
99
+ reason: 'Commit the reviewed Studio manifest and pending-lifecycle state after module removals.',
100
+ evidence: filePaths,
101
+ execution: { kind: 'dependency-files', filePaths },
102
+ };
103
+ }
104
+ /*** Build exact reviewed manifest/pending-state changes for APM's native file adapter. */
105
+ function reviewedFileChanges(input) {
106
+ const manifest = {
107
+ path: STUDIO_MANIFEST_FILE,
108
+ kind: 'update',
109
+ beforeContent: input.manifestContent,
110
+ beforeDigest: digestProjectUpdateText(input.manifestContent),
111
+ afterContent: input.nextManifestContent,
112
+ afterDigest: digestProjectUpdateText(input.nextManifestContent),
113
+ };
114
+ const pending = input.nextPendingContent === undefined
115
+ ? {
116
+ path: STUDIO_PENDING_MODULE_LIFECYCLE_FILE,
117
+ kind: 'delete',
118
+ beforeContent: input.pendingContent,
119
+ beforeDigest: digestProjectUpdateText(input.pendingContent),
120
+ }
121
+ : {
122
+ path: STUDIO_PENDING_MODULE_LIFECYCLE_FILE,
123
+ kind: 'update',
124
+ beforeContent: input.pendingContent,
125
+ beforeDigest: digestProjectUpdateText(input.pendingContent),
126
+ afterContent: input.nextPendingContent,
127
+ afterDigest: digestProjectUpdateText(input.nextPendingContent),
128
+ };
129
+ return [manifest, pending];
130
+ }
131
+ /*** Project reviewed removals into canonical manifest module ids/config without touching other fields. */
132
+ function projectReviewedRemovals(manifest, reviewedIds, updated) {
133
+ return {
134
+ ...manifest,
135
+ metadata: { ...manifest.metadata, updated },
136
+ infra: {
137
+ ...manifest.infra,
138
+ modules: manifest.infra.modules.filter((moduleId) => !reviewedIds.has(moduleId)),
139
+ modulesConfig: Object.fromEntries(Object.entries(manifest.infra.modulesConfig ?? {}).filter(([moduleId]) => !reviewedIds.has(moduleId))),
140
+ },
141
+ };
142
+ }
143
+ /*** Parse one canonical Studio project manifest before planning reviewed lifecycle changes. */
144
+ function parseManifest(content) {
145
+ const value = JSON.parse(content);
146
+ if (!isAppManifest(value))
147
+ throw new Error('Project manifest is not a canonical AppManifest.');
148
+ return value;
149
+ }
150
+ /*** Serialize the exact reviewed manifest bytes APM will materialize. */
151
+ function serializeManifest(manifest) {
152
+ return `${JSON.stringify(manifest, null, 2)}\n`;
153
+ }
154
+ /*** Convert executable extension identity into plan-level immutable artifact evidence. */
155
+ function toPlanArtifact(artifact) {
156
+ return {
157
+ id: `${artifact.packageName}@${artifact.version}:${artifact.integrity}`,
158
+ packageName: artifact.packageName,
159
+ version: artifact.version,
160
+ source: 'registry',
161
+ integrity: artifact.integrity,
162
+ };
163
+ }
164
+ /*** Explain pending-state drift between status evidence and planning I/O. */
165
+ function blockedDigest(rootPath, expected, actual) {
166
+ return blocked({
167
+ code: 'protocol.studio-pending-module-lifecycle-changed',
168
+ scope: {
169
+ kind: 'projection',
170
+ id: STUDIO_PENDING_MODULE_LIFECYCLE_PROJECTION_ID,
171
+ path: rootPath,
172
+ },
173
+ evidence: [expected, actual],
174
+ reason: 'Studio pending module lifecycle state changed while the reviewed plan was being built.',
175
+ nextAction: 'Refresh status and create a new plan from current pending module state.',
176
+ });
177
+ }
178
+ /*** Explain unavailable or invalid pending state discovered during planning. */
179
+ function blockedPendingState(rootPath, state) {
180
+ return blocked({
181
+ code: 'protocol.studio-pending-module-lifecycle-unavailable',
182
+ scope: {
183
+ kind: 'projection',
184
+ id: STUDIO_PENDING_MODULE_LIFECYCLE_PROJECTION_ID,
185
+ path: rootPath,
186
+ },
187
+ evidence: [state],
188
+ reason: 'Reviewed pending module lifecycle evidence is no longer available for planning.',
189
+ nextAction: 'Refresh status and repair pending lifecycle state before planning again.',
190
+ });
191
+ }
192
+ /*** Explain missing immutable npm artifact identity for executable Studio owner code. */
193
+ function blockedArtifact(rootPath, reason, evidence) {
194
+ return blocked({
195
+ code: 'protocol.studio-owner-artifact-unavailable',
196
+ scope: { kind: 'host', id: STUDIO_PACKAGE_NAME, path: rootPath },
197
+ evidence,
198
+ reason,
199
+ nextAction: 'Restore registry access and re-plan so exact Studio owner code can be reviewed.',
200
+ });
201
+ }
202
+ /*** Return one blocked plan slice without executable intermediate changes. */
203
+ function blocked(blocker) {
204
+ return { files: [], artifacts: [], steps: [], blockers: [blocker] };
205
+ }
206
+ /*** Return no owner work for an empty pending lifecycle state. */
207
+ function emptySlice() {
208
+ return { files: [], artifacts: [], steps: [], blockers: [] };
209
+ }
210
+ /*** Build the stable reviewed owner-step id for one module. */
211
+ function removalStepId(moduleId) {
212
+ return `${REMOVAL_STEP_PREFIX}${moduleId}`;
213
+ }
214
+ //# sourceMappingURL=planPendingModuleLifecycleAsync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planPendingModuleLifecycleAsync.js","sourceRoot":"","sources":["../../../../src/features/project-updates/application/planPendingModuleLifecycleAsync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ApmApplyStepPort } from '@ankhorage/apm/types';
2
+ import type { StudioPendingModuleLifecyclePort } from '../application/StudioPendingModuleLifecyclePort';
3
+ /*** Compose Studio pending-module execution around any pre-existing trusted owner step adapter. */
4
+ export declare function createStudioProjectUpdateApplyOwnerStepPort(lifecycle: StudioPendingModuleLifecyclePort, base?: ApmApplyStepPort): ApmApplyStepPort;
5
+ //# sourceMappingURL=createStudioProjectUpdateApplyOwnerStepPort.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createStudioProjectUpdateApplyOwnerStepPort.d.ts","sourceRoot":"","sources":["../../../../src/features/project-updates/composition/createStudioProjectUpdateApplyOwnerStepPort.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,gBAAgB,EACjB,MAAM,sBAAsB,CAAC;AAK9B,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,iDAAiD,CAAC;AAGxG,mGAAmG;AACnG,wBAAgB,2CAA2C,CACzD,SAAS,EAAE,gCAAgC,EAC3C,IAAI,CAAC,EAAE,gBAAgB,GACtB,gBAAgB,CAqBlB"}