@ankhorage/studio 2.6.2 → 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 (74) 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 +4 -0
  4. package/dist/features/project-updates/adapters/outbound/inspectPendingModuleLifecycleEvidenceAsync.d.ts.map +1 -0
  5. package/dist/features/project-updates/adapters/outbound/inspectPendingModuleLifecycleEvidenceAsync.js +112 -0
  6. package/dist/features/project-updates/adapters/outbound/inspectPendingModuleLifecycleEvidenceAsync.js.map +1 -0
  7. package/dist/features/project-updates/adapters/outbound/readPendingModuleLifecycleStateAsync.d.ts +21 -0
  8. package/dist/features/project-updates/adapters/outbound/readPendingModuleLifecycleStateAsync.d.ts.map +1 -0
  9. package/dist/features/project-updates/adapters/outbound/readPendingModuleLifecycleStateAsync.js +35 -0
  10. package/dist/features/project-updates/adapters/outbound/readPendingModuleLifecycleStateAsync.js.map +1 -0
  11. package/dist/features/project-updates/adapters/outbound/readStudioManifestDigestAsync.d.ts +3 -0
  12. package/dist/features/project-updates/adapters/outbound/readStudioManifestDigestAsync.d.ts.map +1 -0
  13. package/dist/features/project-updates/adapters/outbound/readStudioManifestDigestAsync.js +9 -0
  14. package/dist/features/project-updates/adapters/outbound/readStudioManifestDigestAsync.js.map +1 -0
  15. package/dist/features/project-updates/adapters/outbound/resolveCurrentStudioApmArtifactAsync.d.ts +15 -0
  16. package/dist/features/project-updates/adapters/outbound/resolveCurrentStudioApmArtifactAsync.d.ts.map +1 -0
  17. package/dist/features/project-updates/adapters/outbound/resolveCurrentStudioApmArtifactAsync.js +32 -0
  18. package/dist/features/project-updates/adapters/outbound/resolveCurrentStudioApmArtifactAsync.js.map +1 -0
  19. package/dist/features/project-updates/application/StudioPendingModuleLifecyclePort.d.ts +6 -0
  20. package/dist/features/project-updates/application/StudioPendingModuleLifecyclePort.d.ts.map +1 -0
  21. package/dist/features/project-updates/application/StudioPendingModuleLifecyclePort.js +2 -0
  22. package/dist/features/project-updates/application/StudioPendingModuleLifecyclePort.js.map +1 -0
  23. package/dist/features/project-updates/application/planPendingModuleLifecycleAsync.d.ts +15 -0
  24. package/dist/features/project-updates/application/planPendingModuleLifecycleAsync.d.ts.map +1 -0
  25. package/dist/features/project-updates/application/planPendingModuleLifecycleAsync.js +214 -0
  26. package/dist/features/project-updates/application/planPendingModuleLifecycleAsync.js.map +1 -0
  27. package/dist/features/project-updates/composition/createStudioProjectUpdateApplyOwnerStepPort.d.ts +5 -0
  28. package/dist/features/project-updates/composition/createStudioProjectUpdateApplyOwnerStepPort.d.ts.map +1 -0
  29. package/dist/features/project-updates/composition/createStudioProjectUpdateApplyOwnerStepPort.js +171 -0
  30. package/dist/features/project-updates/composition/createStudioProjectUpdateApplyOwnerStepPort.js.map +1 -0
  31. package/dist/features/project-updates/composition/createStudioProjectUpdateExtensionEvidencePort.d.ts +4 -0
  32. package/dist/features/project-updates/composition/createStudioProjectUpdateExtensionEvidencePort.d.ts.map +1 -0
  33. package/dist/features/project-updates/composition/createStudioProjectUpdateExtensionEvidencePort.js +29 -0
  34. package/dist/features/project-updates/composition/createStudioProjectUpdateExtensionEvidencePort.js.map +1 -0
  35. package/dist/features/project-updates/composition/createStudioProjectUpdateProtocolPort.d.ts +10 -0
  36. package/dist/features/project-updates/composition/createStudioProjectUpdateProtocolPort.d.ts.map +1 -0
  37. package/dist/features/project-updates/composition/createStudioProjectUpdateProtocolPort.js +106 -0
  38. package/dist/features/project-updates/composition/createStudioProjectUpdateProtocolPort.js.map +1 -0
  39. package/dist/features/project-updates/composition/createStudioProjectUpdateService.d.ts +6 -0
  40. package/dist/features/project-updates/composition/createStudioProjectUpdateService.d.ts.map +1 -0
  41. package/dist/features/project-updates/composition/createStudioProjectUpdateService.js +22 -0
  42. package/dist/features/project-updates/composition/createStudioProjectUpdateService.js.map +1 -0
  43. package/dist/features/project-updates/composition/createStudioProjectUpdateVerifyOwnerStepPort.d.ts +5 -0
  44. package/dist/features/project-updates/composition/createStudioProjectUpdateVerifyOwnerStepPort.d.ts.map +1 -0
  45. package/dist/features/project-updates/composition/createStudioProjectUpdateVerifyOwnerStepPort.js +67 -0
  46. package/dist/features/project-updates/composition/createStudioProjectUpdateVerifyOwnerStepPort.js.map +1 -0
  47. package/dist/features/project-updates/constants.d.ts +4 -0
  48. package/dist/features/project-updates/constants.d.ts.map +1 -0
  49. package/dist/features/project-updates/constants.js +4 -0
  50. package/dist/features/project-updates/constants.js.map +1 -0
  51. package/dist/features/project-updates/domain/pendingModuleLifecycleState.d.ts +24 -0
  52. package/dist/features/project-updates/domain/pendingModuleLifecycleState.d.ts.map +1 -0
  53. package/dist/features/project-updates/domain/pendingModuleLifecycleState.js +48 -0
  54. package/dist/features/project-updates/domain/pendingModuleLifecycleState.js.map +1 -0
  55. package/dist/features/project-updates/domain/pendingModulePlanStep.d.ts +10 -0
  56. package/dist/features/project-updates/domain/pendingModulePlanStep.d.ts.map +1 -0
  57. package/dist/features/project-updates/domain/pendingModulePlanStep.js +25 -0
  58. package/dist/features/project-updates/domain/pendingModulePlanStep.js.map +1 -0
  59. package/dist/host/createStudioHost.d.ts +1 -2
  60. package/dist/host/createStudioHost.d.ts.map +1 -1
  61. package/dist/host/createStudioHost.js +3 -2
  62. package/dist/host/createStudioHost.js.map +1 -1
  63. package/dist/host/orchestrator/createHostModuleOrchestrator.d.ts +4 -0
  64. package/dist/host/orchestrator/createHostModuleOrchestrator.d.ts.map +1 -0
  65. package/dist/host/orchestrator/createHostModuleOrchestrator.js +10 -0
  66. package/dist/host/orchestrator/createHostModuleOrchestrator.js.map +1 -0
  67. package/dist/host/orchestrator/createStudioPendingModuleLifecyclePort.d.ts +4 -0
  68. package/dist/host/orchestrator/createStudioPendingModuleLifecyclePort.d.ts.map +1 -0
  69. package/dist/host/orchestrator/createStudioPendingModuleLifecyclePort.js +20 -0
  70. package/dist/host/orchestrator/createStudioPendingModuleLifecyclePort.js.map +1 -0
  71. package/dist/host/orchestrator/moduleManager.d.ts.map +1 -1
  72. package/dist/host/orchestrator/moduleManager.js +3 -6
  73. package/dist/host/orchestrator/moduleManager.js.map +1 -1
  74. package/package.json +2 -2
@@ -0,0 +1,171 @@
1
+ import { readPendingModuleLifecycleStateAsync } from '../adapters/outbound/readPendingModuleLifecycleStateAsync';
2
+ import { readStudioManifestDigestAsync } from '../adapters/outbound/readStudioManifestDigestAsync';
3
+ import { readCurrentStudioApmArtifactBindingAsync } from '../adapters/outbound/resolveCurrentStudioApmArtifactAsync';
4
+ import { readReviewedPendingModuleStep } from '../domain/pendingModulePlanStep';
5
+ /*** Compose Studio pending-module execution around any pre-existing trusted owner step adapter. */
6
+ export function createStudioProjectUpdateApplyOwnerStepPort(lifecycle, base) {
7
+ return {
8
+ observeAsync: async (input) => {
9
+ const reviewed = readReviewedPendingModuleStep(input.step);
10
+ return reviewed === undefined
11
+ ? delegateObservationAsync(base, input)
12
+ : observePendingModuleAsync(input.journal.rootPath, reviewed, lifecycle);
13
+ },
14
+ executeAsync: async (input) => {
15
+ const reviewed = readReviewedPendingModuleStep(input.step);
16
+ return reviewed === undefined
17
+ ? delegateExecutionAsync(base, 'executeAsync', input)
18
+ : executePendingModuleAsync(input.journal.rootPath, reviewed, lifecycle);
19
+ },
20
+ rollbackAsync: async (input) => {
21
+ const reviewed = readReviewedPendingModuleStep(input.step);
22
+ return reviewed === undefined
23
+ ? delegateExecutionAsync(base, 'rollbackAsync', input)
24
+ : unsupportedRollback(input.step.id);
25
+ },
26
+ };
27
+ }
28
+ /*** Observe exact pending/manifest/artifact preconditions before one irreversible module effect. */
29
+ async function observePendingModuleAsync(rootPath, reviewed, lifecycle) {
30
+ const binding = await bindingObservationAsync(reviewed);
31
+ if (binding !== undefined)
32
+ return binding;
33
+ const pending = await pendingObservationAsync(rootPath, reviewed.pendingDigest);
34
+ if (pending !== undefined)
35
+ return pending;
36
+ const manifest = await manifestObservationAsync(rootPath, reviewed.manifestDigest);
37
+ if (manifest !== undefined)
38
+ return manifest;
39
+ const installed = await lifecycle.isModuleInstalledAsync(rootPath, reviewed.moduleId);
40
+ if (installed === undefined) {
41
+ return {
42
+ state: 'unknown',
43
+ evidence: [`module:${reviewed.moduleId}`],
44
+ reason: 'Orchestrator could not determine the reviewed module installation state.',
45
+ };
46
+ }
47
+ return installed
48
+ ? { state: 'pending', evidence: [`module-installed:${reviewed.moduleId}`] }
49
+ : { state: 'satisfied', evidence: [`module-removed:${reviewed.moduleId}`] };
50
+ }
51
+ /*** Execute exactly one reviewed Orchestrator removal after all frozen preconditions still match. */
52
+ async function executePendingModuleAsync(rootPath, reviewed, lifecycle) {
53
+ const observation = await observePendingModuleAsync(rootPath, reviewed, lifecycle);
54
+ if (observation.state === 'satisfied')
55
+ return completed(observation.evidence);
56
+ if (observation.state !== 'pending')
57
+ return observationFailure(observation);
58
+ await lifecycle.removeModuleAsync(rootPath, reviewed.moduleId);
59
+ const installed = await lifecycle.isModuleInstalledAsync(rootPath, reviewed.moduleId);
60
+ if (installed === false)
61
+ return completed([`module-removed:${reviewed.moduleId}`]);
62
+ return installed === undefined
63
+ ? {
64
+ state: 'unknown',
65
+ evidence: [`module:${reviewed.moduleId}`],
66
+ diagnostics: [],
67
+ failure: {
68
+ code: 'studio.pending-module-lifecycle.observation-unavailable',
69
+ reason: 'Module removal returned but its postcondition could not be observed.',
70
+ evidence: [reviewed.moduleId],
71
+ },
72
+ }
73
+ : failed('studio.pending-module-lifecycle.remove-incomplete', 'Orchestrator returned from removal but the reviewed module remains installed.', reviewed.moduleId);
74
+ }
75
+ /*** Reject a reviewed step when the running Studio package does not match its frozen owner artifact. */
76
+ async function bindingObservationAsync(reviewed) {
77
+ const binding = await readCurrentStudioApmArtifactBindingAsync();
78
+ const matches = reviewed.artifact.packageName === binding.packageName &&
79
+ reviewed.artifact.version === binding.version &&
80
+ reviewed.artifact.descriptorDigest === binding.descriptorDigest;
81
+ return matches
82
+ ? undefined
83
+ : {
84
+ state: 'conflict',
85
+ evidence: [
86
+ `${reviewed.artifact.packageName}@${reviewed.artifact.version}`,
87
+ `${binding.packageName}@${binding.version}`,
88
+ reviewed.artifact.descriptorDigest,
89
+ binding.descriptorDigest,
90
+ ],
91
+ reason: 'Loaded Studio owner code no longer matches the reviewed immutable artifact binding.',
92
+ };
93
+ }
94
+ /*** Require the exact pending-state digest to remain unchanged until native APM file finalization. */
95
+ async function pendingObservationAsync(rootPath, expectedDigest) {
96
+ const pending = await readPendingModuleLifecycleStateAsync(rootPath);
97
+ if (pending.state === 'valid' && pending.digest === expectedDigest)
98
+ return undefined;
99
+ if (pending.state === 'unreadable') {
100
+ return {
101
+ state: 'unknown',
102
+ evidence: [pending.reason],
103
+ reason: 'Studio pending module lifecycle state cannot be read safely.',
104
+ };
105
+ }
106
+ return {
107
+ state: 'conflict',
108
+ evidence: [expectedDigest, pending.state === 'valid' ? pending.digest : pending.state],
109
+ reason: 'Studio pending module lifecycle state changed after the reviewed plan was created.',
110
+ };
111
+ }
112
+ /*** Require the canonical manifest to remain byte-identical before irreversible Orchestrator effects. */
113
+ async function manifestObservationAsync(rootPath, expectedDigest) {
114
+ try {
115
+ const actualDigest = await readStudioManifestDigestAsync(rootPath);
116
+ return actualDigest === expectedDigest
117
+ ? undefined
118
+ : {
119
+ state: 'conflict',
120
+ evidence: [expectedDigest, actualDigest],
121
+ reason: 'Studio manifest changed after the reviewed pending-module plan was created.',
122
+ };
123
+ }
124
+ catch (error) {
125
+ return {
126
+ state: 'unknown',
127
+ evidence: [error instanceof Error ? error.message : 'unknown manifest read failure'],
128
+ reason: 'Studio manifest cannot be read safely before the reviewed module removal.',
129
+ };
130
+ }
131
+ }
132
+ /*** Delegate an unrelated owner observation or remain explicitly unavailable. */
133
+ async function delegateObservationAsync(base, input) {
134
+ return base === undefined
135
+ ? {
136
+ state: 'unknown',
137
+ evidence: [input.step.id],
138
+ reason: 'No trusted Studio owner adapter handles this reviewed step.',
139
+ }
140
+ : base.observeAsync(input);
141
+ }
142
+ /*** Delegate unrelated owner execution/rollback without swallowing its result. */
143
+ async function delegateExecutionAsync(base, action, input) {
144
+ return base === undefined
145
+ ? failed('studio.owner-step.unavailable', 'No trusted Studio owner adapter handles this reviewed step.', input.step.id)
146
+ : action === 'executeAsync'
147
+ ? base.executeAsync(input)
148
+ : base.rollbackAsync(input);
149
+ }
150
+ /*** Convert a non-executable observation into a deterministic owner-step failure. */
151
+ function observationFailure(observation) {
152
+ return failed('studio.pending-module-lifecycle.precondition-changed', observation.reason ?? 'Reviewed pending module lifecycle preconditions are not executable.', ...observation.evidence);
153
+ }
154
+ /*** Report one completed trusted owner effect. */
155
+ function completed(evidence) {
156
+ return { state: 'completed', evidence, diagnostics: [] };
157
+ }
158
+ /*** Report one deterministic owner execution failure. */
159
+ function failed(code, reason, ...evidence) {
160
+ return {
161
+ state: 'failed',
162
+ evidence,
163
+ diagnostics: [],
164
+ failure: { code, reason, evidence },
165
+ };
166
+ }
167
+ /*** Keep dynamic Orchestrator effects explicitly non-reversible. */
168
+ function unsupportedRollback(stepId) {
169
+ return failed('studio.pending-module-lifecycle.rollback-unsupported', 'Reviewed Orchestrator module removal is not transactionally reversible by Studio.', stepId);
170
+ }
171
+ //# sourceMappingURL=createStudioProjectUpdateApplyOwnerStepPort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createStudioProjectUpdateApplyOwnerStepPort.js","sourceRoot":"","sources":["../../../../src/features/project-updates/composition/createStudioProjectUpdateApplyOwnerStepPort.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ApmStatusExtensionEvidencePort } from '@ankhorage/apm/types';
2
+ /*** Compose Studio pending-lifecycle evidence with any existing package-owner status provider. */
3
+ export declare function createStudioProjectUpdateExtensionEvidencePort(base?: ApmStatusExtensionEvidencePort): ApmStatusExtensionEvidencePort;
4
+ //# sourceMappingURL=createStudioProjectUpdateExtensionEvidencePort.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createStudioProjectUpdateExtensionEvidencePort.d.ts","sourceRoot":"","sources":["../../../../src/features/project-updates/composition/createStudioProjectUpdateExtensionEvidencePort.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwB,8BAA8B,EAAE,MAAM,sBAAsB,CAAC;AAIjG,kGAAkG;AAClG,wBAAgB,8CAA8C,CAC5D,IAAI,CAAC,EAAE,8BAA8B,GACpC,8BAA8B,CAUhC"}
@@ -0,0 +1,29 @@
1
+ import { inspectPendingModuleLifecycleEvidenceAsync } from '../adapters/outbound/inspectPendingModuleLifecycleEvidenceAsync';
2
+ /*** Compose Studio pending-lifecycle evidence with any existing package-owner status provider. */
3
+ export function createStudioProjectUpdateExtensionEvidencePort(base) {
4
+ return {
5
+ inspectExtensionEvidenceAsync: async (input) => {
6
+ const [baseEvidence, pendingEvidence] = await Promise.all([
7
+ readBaseEvidenceAsync(base, input),
8
+ inspectPendingModuleLifecycleEvidenceAsync(input.rootPath),
9
+ ]);
10
+ return mergeExtensionEvidence(baseEvidence, pendingEvidence);
11
+ },
12
+ };
13
+ }
14
+ /*** Read optional existing owner evidence without treating an absent provider as incomplete. */
15
+ async function readBaseEvidenceAsync(base, input) {
16
+ return base === undefined
17
+ ? { state: 'unavailable', complete: true, observations: [], diagnostics: [] }
18
+ : base.inspectExtensionEvidenceAsync(input);
19
+ }
20
+ /*** Merge independent owner evidence without replacing an already composed provider. */
21
+ function mergeExtensionEvidence(base, pending) {
22
+ return {
23
+ state: base.state === 'available' || pending.state === 'available' ? 'available' : 'unavailable',
24
+ complete: base.complete && pending.complete,
25
+ observations: [...base.observations, ...pending.observations],
26
+ diagnostics: [...base.diagnostics, ...pending.diagnostics],
27
+ };
28
+ }
29
+ //# sourceMappingURL=createStudioProjectUpdateExtensionEvidencePort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createStudioProjectUpdateExtensionEvidencePort.js","sourceRoot":"","sources":["../../../../src/features/project-updates/composition/createStudioProjectUpdateExtensionEvidencePort.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,0CAA0C,EAAE,MAAM,iEAAiE,CAAC;AAE7H,kGAAkG;AAClG,MAAM,UAAU,8CAA8C,CAC5D,IAAqC;IAErC,OAAO;QACL,6BAA6B,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAC7C,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACxD,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC;gBAClC,0CAA0C,CAAC,KAAK,CAAC,QAAQ,CAAC;aAC3D,CAAC,CAAC;YACH,OAAO,sBAAsB,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QAC/D,CAAC;KACF,CAAC;AACJ,CAAC;AAED,gGAAgG;AAChG,KAAK,UAAU,qBAAqB,CAClC,IAAgD,EAChD,KAAqF;IAErF,OAAO,IAAI,KAAK,SAAS;QACvB,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;QAC7E,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,wFAAwF;AACxF,SAAS,sBAAsB,CAC7B,IAA0B,EAC1B,OAA6B;IAE7B,OAAO;QACL,KAAK,EACH,IAAI,CAAC,KAAK,KAAK,WAAW,IAAI,OAAO,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa;QAC3F,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ;QAC3C,YAAY,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC;QAC7D,WAAW,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;KAC3D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ApmExtensionArtifactIdentityResolution, ApmPlanProtocolPort } from '@ankhorage/apm/types';
2
+ interface StudioProjectUpdateProtocolOptions {
3
+ readonly pendingLifecycleExecution?: boolean;
4
+ readonly resolveArtifactAsync?: (rootPath: string) => Promise<ApmExtensionArtifactIdentityResolution>;
5
+ readonly nowIso?: () => string;
6
+ }
7
+ /*** Extend package-owner planning with reviewed Studio pending-module lifecycle execution. */
8
+ export declare function createStudioProjectUpdateProtocolPort(base?: ApmPlanProtocolPort, options?: StudioProjectUpdateProtocolOptions): ApmPlanProtocolPort;
9
+ export {};
10
+ //# sourceMappingURL=createStudioProjectUpdateProtocolPort.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createStudioProjectUpdateProtocolPort.d.ts","sourceRoot":"","sources":["../../../../src/features/project-updates/composition/createStudioProjectUpdateProtocolPort.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sCAAsC,EAGtC,mBAAmB,EAEpB,MAAM,sBAAsB,CAAC;AAS9B,UAAU,kCAAkC;IAC1C,QAAQ,CAAC,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAC7C,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAC9B,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC,sCAAsC,CAAC,CAAC;IACrD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;CAChC;AAED,8FAA8F;AAC9F,wBAAgB,qCAAqC,CACnD,IAAI,CAAC,EAAE,mBAAmB,EAC1B,OAAO,GAAE,kCAAuC,GAC/C,mBAAmB,CAiCrB"}
@@ -0,0 +1,106 @@
1
+ import { resolveCurrentStudioApmArtifactAsync } from '../adapters/outbound/resolveCurrentStudioApmArtifactAsync';
2
+ import { planPendingModuleLifecycleAsync } from '../application/planPendingModuleLifecycleAsync';
3
+ import { STUDIO_PENDING_MODULE_LIFECYCLE_EVIDENCE, STUDIO_PENDING_MODULE_LIFECYCLE_PROJECTION_ID, } from '../constants';
4
+ /*** Extend package-owner planning with reviewed Studio pending-module lifecycle execution. */
5
+ export function createStudioProjectUpdateProtocolPort(base, options = {}) {
6
+ return {
7
+ planProtocolAsync: async (input) => {
8
+ const baseResult = await readBaseProtocolResultAsync(base, input);
9
+ const pending = input.status.extensions.observations.find(isPendingModuleLifecycleObservation);
10
+ const pendingSlice = await planPendingObservationAsync(pending, input.status.rootPath, options);
11
+ const unhandled = base === undefined
12
+ ? input.status.extensions.observations.filter((observation) => !isPendingModuleLifecycleObservation(observation) &&
13
+ requiresProtocolPlanning(observation, input.policy.repairProjections))
14
+ : [];
15
+ const unhandledBlockers = unhandled.length === 0 ? [] : [protocolUnavailableBlocker(unhandled)];
16
+ const blockers = [...baseResult.blockers, ...pendingSlice.blockers, ...unhandledBlockers];
17
+ return {
18
+ ...baseResult,
19
+ complete: baseResult.complete && blockers.length === 0,
20
+ files: [...baseResult.files, ...pendingSlice.files],
21
+ artifacts: [...baseResult.artifacts, ...pendingSlice.artifacts],
22
+ steps: [...baseResult.steps, ...pendingSlice.steps],
23
+ blockers,
24
+ };
25
+ },
26
+ };
27
+ }
28
+ const EMPTY_PROTOCOL_RESULT = {
29
+ complete: true,
30
+ requiredSelections: [],
31
+ files: [],
32
+ artifacts: [],
33
+ steps: [],
34
+ effects: [],
35
+ findings: [],
36
+ blockers: [],
37
+ diagnostics: [],
38
+ };
39
+ const EMPTY_PENDING_SLICE = { files: [], artifacts: [], steps: [], blockers: [] };
40
+ /*** Delegate existing package-owner planning when present instead of replacing it. */
41
+ async function readBaseProtocolResultAsync(base, input) {
42
+ return base === undefined ? EMPTY_PROTOCOL_RESULT : base.planProtocolAsync(input);
43
+ }
44
+ /*** Plan the pending lifecycle observation only when the host supplied its trusted execution adapter. */
45
+ async function planPendingObservationAsync(observation, rootPath, options) {
46
+ if (observation === undefined)
47
+ return EMPTY_PENDING_SLICE;
48
+ if (options.pendingLifecycleExecution !== true) {
49
+ return { ...EMPTY_PENDING_SLICE, blockers: [pendingLifecycleBlocker(observation)] };
50
+ }
51
+ const expectedPendingDigest = readPendingDigest(observation);
52
+ if (expectedPendingDigest === undefined) {
53
+ return { ...EMPTY_PENDING_SLICE, blockers: [missingPendingDigestBlocker(observation)] };
54
+ }
55
+ return planPendingModuleLifecycleAsync({
56
+ rootPath,
57
+ expectedPendingDigest,
58
+ resolveArtifactAsync: options.resolveArtifactAsync ?? resolveCurrentStudioApmArtifactAsync,
59
+ nowIso: options.nowIso ?? (() => new Date().toISOString()),
60
+ });
61
+ }
62
+ /*** Identify the Studio-owned pending module lifecycle observation by stable evidence. */
63
+ function isPendingModuleLifecycleObservation(observation) {
64
+ return observation.evidence.includes(STUDIO_PENDING_MODULE_LIFECYCLE_EVIDENCE);
65
+ }
66
+ /*** Read the exact pending-file precondition frozen into status evidence. */
67
+ function readPendingDigest(observation) {
68
+ return observation.evidence
69
+ .find((item) => item.startsWith('pending-digest:'))
70
+ ?.slice('pending-digest:'.length);
71
+ }
72
+ /*** Mirror APM's owner-planning requirement for evidence not handled by Studio's local planner. */
73
+ function requiresProtocolPlanning(observation, repairProjections) {
74
+ return (observation.migration === 'pending' || (repairProjections && observation.projection === 'stale'));
75
+ }
76
+ /*** Block apply when this service instance has no trusted module-lifecycle executor. */
77
+ function pendingLifecycleBlocker(observation) {
78
+ return {
79
+ code: 'protocol.studio-pending-module-lifecycle',
80
+ scope: { kind: 'projection', id: STUDIO_PENDING_MODULE_LIFECYCLE_PROJECTION_ID },
81
+ evidence: observation.evidence,
82
+ reason: 'Studio module removals are queued, but this host did not compose the trusted module-lifecycle owner executor.',
83
+ nextAction: 'Use the normal Studio host or compose its trusted pending-module lifecycle adapter.',
84
+ };
85
+ }
86
+ /*** Block planning when pending evidence lacks the immutable file digest required for reviewed execution. */
87
+ function missingPendingDigestBlocker(observation) {
88
+ return {
89
+ code: 'protocol.studio-pending-module-lifecycle-evidence-incomplete',
90
+ scope: { kind: 'projection', id: STUDIO_PENDING_MODULE_LIFECYCLE_PROJECTION_ID },
91
+ evidence: observation.evidence,
92
+ reason: 'Pending module lifecycle evidence is missing its reviewed file digest.',
93
+ nextAction: 'Refresh Studio status before planning pending module removals.',
94
+ };
95
+ }
96
+ /*** Preserve APM's fail-closed behavior when another owner observation lacks a planner. */
97
+ function protocolUnavailableBlocker(observations) {
98
+ return {
99
+ code: 'plan.protocol-unavailable',
100
+ scope: { kind: 'project' },
101
+ evidence: observations.flatMap((observation) => observation.evidence),
102
+ reason: 'Package-owned migration or projection work is pending without a composed planner.',
103
+ nextAction: 'Compose the required trusted owner planner before applying project updates.',
104
+ };
105
+ }
106
+ //# sourceMappingURL=createStudioProjectUpdateProtocolPort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createStudioProjectUpdateProtocolPort.js","sourceRoot":"","sources":["../../../../src/features/project-updates/composition/createStudioProjectUpdateProtocolPort.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ProjectUpdateServiceOptions } from '../../../types/project-updates';
2
+ import { ProjectUpdateService } from '../application/ProjectUpdateService';
3
+ import type { StudioPendingModuleLifecyclePort } from '../application/StudioPendingModuleLifecyclePort';
4
+ /*** Compose Studio-owned APM evidence, planning, execution, and verification around one host lifecycle port. */
5
+ export declare function createStudioProjectUpdateService(options?: ProjectUpdateServiceOptions, lifecycle?: StudioPendingModuleLifecyclePort): ProjectUpdateService;
6
+ //# sourceMappingURL=createStudioProjectUpdateService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createStudioProjectUpdateService.d.ts","sourceRoot":"","sources":["../../../../src/features/project-updates/composition/createStudioProjectUpdateService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,iDAAiD,CAAC;AAMxG,gHAAgH;AAChH,wBAAgB,gCAAgC,CAC9C,OAAO,GAAE,2BAAgC,EACzC,SAAS,CAAC,EAAE,gCAAgC,GAC3C,oBAAoB,CAoBtB"}
@@ -0,0 +1,22 @@
1
+ import { ProjectUpdateService } from '../application/ProjectUpdateService';
2
+ import { createStudioProjectUpdateApplyOwnerStepPort } from './createStudioProjectUpdateApplyOwnerStepPort';
3
+ import { createStudioProjectUpdateExtensionEvidencePort } from './createStudioProjectUpdateExtensionEvidencePort';
4
+ import { createStudioProjectUpdateProtocolPort } from './createStudioProjectUpdateProtocolPort';
5
+ import { createStudioProjectUpdateVerifyOwnerStepPort } from './createStudioProjectUpdateVerifyOwnerStepPort';
6
+ /*** Compose Studio-owned APM evidence, planning, execution, and verification around one host lifecycle port. */
7
+ export function createStudioProjectUpdateService(options = {}, lifecycle) {
8
+ return new ProjectUpdateService({
9
+ ...options,
10
+ extensions: createStudioProjectUpdateExtensionEvidencePort(options.extensions),
11
+ protocol: createStudioProjectUpdateProtocolPort(options.protocol, {
12
+ pendingLifecycleExecution: lifecycle !== undefined,
13
+ }),
14
+ ...(lifecycle === undefined
15
+ ? {}
16
+ : {
17
+ applyOwnerStep: createStudioProjectUpdateApplyOwnerStepPort(lifecycle, options.applyOwnerStep),
18
+ verifyOwnerStep: createStudioProjectUpdateVerifyOwnerStepPort(lifecycle, options.verifyOwnerStep),
19
+ }),
20
+ });
21
+ }
22
+ //# sourceMappingURL=createStudioProjectUpdateService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createStudioProjectUpdateService.js","sourceRoot":"","sources":["../../../../src/features/project-updates/composition/createStudioProjectUpdateService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E,OAAO,EAAE,2CAA2C,EAAE,MAAM,+CAA+C,CAAC;AAC5G,OAAO,EAAE,8CAA8C,EAAE,MAAM,kDAAkD,CAAC;AAClH,OAAO,EAAE,qCAAqC,EAAE,MAAM,yCAAyC,CAAC;AAChG,OAAO,EAAE,4CAA4C,EAAE,MAAM,gDAAgD,CAAC;AAE9G,gHAAgH;AAChH,MAAM,UAAU,gCAAgC,CAC9C,UAAuC,EAAE,EACzC,SAA4C;IAE5C,OAAO,IAAI,oBAAoB,CAAC;QAC9B,GAAG,OAAO;QACV,UAAU,EAAE,8CAA8C,CAAC,OAAO,CAAC,UAAU,CAAC;QAC9E,QAAQ,EAAE,qCAAqC,CAAC,OAAO,CAAC,QAAQ,EAAE;YAChE,yBAAyB,EAAE,SAAS,KAAK,SAAS;SACnD,CAAC;QACF,GAAG,CAAC,SAAS,KAAK,SAAS;YACzB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC;gBACE,cAAc,EAAE,2CAA2C,CACzD,SAAS,EACT,OAAO,CAAC,cAAc,CACvB;gBACD,eAAe,EAAE,4CAA4C,CAC3D,SAAS,EACT,OAAO,CAAC,eAAe,CACxB;aACF,CAAC;KACP,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ApmVerifyStepPort } from '@ankhorage/apm/types';
2
+ import type { StudioPendingModuleLifecyclePort } from '../application/StudioPendingModuleLifecyclePort';
3
+ /*** Compose Studio pending-module verification around any pre-existing trusted owner verifier. */
4
+ export declare function createStudioProjectUpdateVerifyOwnerStepPort(lifecycle: StudioPendingModuleLifecyclePort, base?: ApmVerifyStepPort): ApmVerifyStepPort;
5
+ //# sourceMappingURL=createStudioProjectUpdateVerifyOwnerStepPort.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createStudioProjectUpdateVerifyOwnerStepPort.d.ts","sourceRoot":"","sources":["../../../../src/features/project-updates/composition/createStudioProjectUpdateVerifyOwnerStepPort.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwB,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGpF,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,iDAAiD,CAAC;AAGxG,kGAAkG;AAClG,wBAAgB,4CAA4C,CAC1D,SAAS,EAAE,gCAAgC,EAC3C,IAAI,CAAC,EAAE,iBAAiB,GACvB,iBAAiB,CAgBnB"}
@@ -0,0 +1,67 @@
1
+ import { currentStudioApmArtifactMatchesAsync } from '../adapters/outbound/resolveCurrentStudioApmArtifactAsync';
2
+ import { readReviewedPendingModuleStep } from '../domain/pendingModulePlanStep';
3
+ /*** Compose Studio pending-module verification around any pre-existing trusted owner verifier. */
4
+ export function createStudioProjectUpdateVerifyOwnerStepPort(lifecycle, base) {
5
+ return {
6
+ verifyAsync: async (input) => {
7
+ const reviewed = readReviewedPendingModuleStep(input.step);
8
+ return reviewed === undefined
9
+ ? delegateVerifyAsync(base, input)
10
+ : [
11
+ await verifyPendingModuleAsync(input.journal.rootPath, input.step.id, reviewed, lifecycle),
12
+ ];
13
+ },
14
+ };
15
+ }
16
+ /*** Verify the immutable owner binding and exact Orchestrator module postcondition. */
17
+ async function verifyPendingModuleAsync(rootPath, stepId, reviewed, lifecycle) {
18
+ if (!(await currentStudioApmArtifactMatchesAsync(reviewed.artifact))) {
19
+ return {
20
+ id: `verify:${stepId}`,
21
+ kind: 'projection',
22
+ status: 'unknown',
23
+ evidence: [`${reviewed.artifact.packageName}@${reviewed.artifact.version}`],
24
+ reason: 'Loaded Studio owner code no longer matches the reviewed immutable artifact binding.',
25
+ nextAction: 'Verify again with the exact reviewed Studio owner artifact.',
26
+ };
27
+ }
28
+ const installed = await lifecycle.isModuleInstalledAsync(rootPath, reviewed.moduleId);
29
+ if (installed === undefined) {
30
+ return {
31
+ id: `verify:${stepId}`,
32
+ kind: 'projection',
33
+ status: 'unknown',
34
+ evidence: [`module:${reviewed.moduleId}`],
35
+ reason: 'Orchestrator could not determine the reviewed module installation state.',
36
+ };
37
+ }
38
+ return installed
39
+ ? {
40
+ id: `verify:${stepId}`,
41
+ kind: 'projection',
42
+ status: 'failed',
43
+ evidence: [`module-installed:${reviewed.moduleId}`],
44
+ reason: 'Reviewed pending module remains installed after the APM operation.',
45
+ }
46
+ : {
47
+ id: `verify:${stepId}`,
48
+ kind: 'projection',
49
+ status: 'passed',
50
+ evidence: [`module-removed:${reviewed.moduleId}`],
51
+ };
52
+ }
53
+ /*** Delegate unrelated owner verification or keep the missing verifier explicit. */
54
+ async function delegateVerifyAsync(base, input) {
55
+ return base === undefined
56
+ ? [
57
+ {
58
+ id: `verify:${input.step.id}`,
59
+ kind: input.step.kind === 'migration' ? 'migration' : 'projection',
60
+ status: 'unknown',
61
+ evidence: [input.step.id],
62
+ reason: 'No trusted Studio owner verifier handles this reviewed step.',
63
+ },
64
+ ]
65
+ : base.verifyAsync(input);
66
+ }
67
+ //# sourceMappingURL=createStudioProjectUpdateVerifyOwnerStepPort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createStudioProjectUpdateVerifyOwnerStepPort.js","sourceRoot":"","sources":["../../../../src/features/project-updates/composition/createStudioProjectUpdateVerifyOwnerStepPort.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oCAAoC,EAAE,MAAM,2DAA2D,CAAC;AAEjH,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAEhF,kGAAkG;AAClG,MAAM,UAAU,4CAA4C,CAC1D,SAA2C,EAC3C,IAAwB;IAExB,OAAO;QACL,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAC3B,MAAM,QAAQ,GAAG,6BAA6B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3D,OAAO,QAAQ,KAAK,SAAS;gBAC3B,CAAC,CAAC,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC;gBAClC,CAAC,CAAC;oBACE,MAAM,wBAAwB,CAC5B,KAAK,CAAC,OAAO,CAAC,QAAQ,EACtB,KAAK,CAAC,IAAI,CAAC,EAAE,EACb,QAAQ,EACR,SAAS,CACV;iBACF,CAAC;QACR,CAAC;KACF,CAAC;AACJ,CAAC;AAKD,uFAAuF;AACvF,KAAK,UAAU,wBAAwB,CACrC,QAAgB,EAChB,MAAc,EACd,QAAsB,EACtB,SAA2C;IAE3C,IAAI,CAAC,CAAC,MAAM,oCAAoC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACrE,OAAO;YACL,EAAE,EAAE,UAAU,MAAM,EAAE;YACtB,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC3E,MAAM,EAAE,qFAAqF;YAC7F,UAAU,EAAE,6DAA6D;SAC1E,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACtF,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO;YACL,EAAE,EAAE,UAAU,MAAM,EAAE;YACtB,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,CAAC,UAAU,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACzC,MAAM,EAAE,0EAA0E;SACnF,CAAC;IACJ,CAAC;IACD,OAAO,SAAS;QACd,CAAC,CAAC;YACE,EAAE,EAAE,UAAU,MAAM,EAAE;YACtB,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,CAAC,oBAAoB,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACnD,MAAM,EAAE,oEAAoE;SAC7E;QACH,CAAC,CAAC;YACE,EAAE,EAAE,UAAU,MAAM,EAAE;YACtB,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,CAAC,kBAAkB,QAAQ,CAAC,QAAQ,EAAE,CAAC;SAClD,CAAC;AACR,CAAC;AAED,oFAAoF;AACpF,KAAK,UAAU,mBAAmB,CAChC,IAAmC,EACnC,KAAkB;IAElB,OAAO,IAAI,KAAK,SAAS;QACvB,CAAC,CAAC;YACE;gBACE,EAAE,EAAE,UAAU,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE;gBAC7B,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY;gBAClE,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,MAAM,EAAE,8DAA8D;aACvE;SACF;QACH,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const STUDIO_PENDING_MODULE_LIFECYCLE_FILE = ".ankh/pending.json";
2
+ export declare const STUDIO_PENDING_MODULE_LIFECYCLE_EVIDENCE = "studio:pending-module-lifecycle";
3
+ export declare const STUDIO_PENDING_MODULE_LIFECYCLE_PROJECTION_ID = "studio-module-lifecycle";
4
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/features/project-updates/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oCAAoC,uBAAuB,CAAC;AACzE,eAAO,MAAM,wCAAwC,oCAAoC,CAAC;AAC1F,eAAO,MAAM,6CAA6C,4BAA4B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export const STUDIO_PENDING_MODULE_LIFECYCLE_FILE = '.ankh/pending.json';
2
+ export const STUDIO_PENDING_MODULE_LIFECYCLE_EVIDENCE = 'studio:pending-module-lifecycle';
3
+ export const STUDIO_PENDING_MODULE_LIFECYCLE_PROJECTION_ID = 'studio-module-lifecycle';
4
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/features/project-updates/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oCAAoC,GAAG,oBAAoB,CAAC;AACzE,MAAM,CAAC,MAAM,wCAAwC,GAAG,iCAAiC,CAAC;AAC1F,MAAM,CAAC,MAAM,6CAA6C,GAAG,yBAAyB,CAAC"}
@@ -0,0 +1,24 @@
1
+ interface PendingModuleLifecycleOperation {
2
+ readonly type: 'uninstall';
3
+ readonly moduleId: string;
4
+ readonly at: string;
5
+ }
6
+ export interface PendingModuleLifecycleState {
7
+ readonly ops: readonly PendingModuleLifecycleOperation[];
8
+ }
9
+ export type PendingModuleLifecycleParseResult = {
10
+ readonly valid: true;
11
+ readonly value: PendingModuleLifecycleState;
12
+ } | {
13
+ readonly valid: false;
14
+ };
15
+ /*** Parse Studio's persisted pending module lifecycle state without accepting ambiguous operations. */
16
+ export declare function parsePendingModuleLifecycleState(content: string): PendingModuleLifecycleParseResult;
17
+ /*** Serialize canonical Studio pending lifecycle state for one reviewed APM file change. */
18
+ export declare function serializePendingModuleLifecycleState(state: PendingModuleLifecycleState): string;
19
+ /*** Return pending module ids in the persisted execution order. */
20
+ export declare function pendingModuleLifecycleIds(state: PendingModuleLifecycleState): readonly string[];
21
+ /*** Remove only reviewed module ids while preserving unrelated pending operations. */
22
+ export declare function removeReviewedPendingModules(state: PendingModuleLifecycleState, moduleIds: ReadonlySet<string>): PendingModuleLifecycleState;
23
+ export {};
24
+ //# sourceMappingURL=pendingModuleLifecycleState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pendingModuleLifecycleState.d.ts","sourceRoot":"","sources":["../../../../src/features/project-updates/domain/pendingModuleLifecycleState.ts"],"names":[],"mappings":"AAEA,UAAU,+BAA+B;IACvC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,GAAG,EAAE,SAAS,+BAA+B,EAAE,CAAC;CAC1D;AAED,MAAM,MAAM,iCAAiC,GAC3C;IAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,2BAA2B,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC;AAEpG,uGAAuG;AACvG,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,MAAM,GACd,iCAAiC,CAYnC;AAED,4FAA4F;AAC5F,wBAAgB,oCAAoC,CAAC,KAAK,EAAE,2BAA2B,GAAG,MAAM,CAE/F;AAED,mEAAmE;AACnE,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,2BAA2B,GAAG,SAAS,MAAM,EAAE,CAE/F;AAED,sFAAsF;AACtF,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,2BAA2B,EAClC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,GAC7B,2BAA2B,CAE7B"}
@@ -0,0 +1,48 @@
1
+ import { isRecord } from '@ankhorage/utility/object';
2
+ /*** Parse Studio's persisted pending module lifecycle state without accepting ambiguous operations. */
3
+ export function parsePendingModuleLifecycleState(content) {
4
+ const value = parseJson(content);
5
+ if (!isRecord(value) || !Array.isArray(value.ops))
6
+ return { valid: false };
7
+ const ops = value.ops.map(parseOperation);
8
+ if (ops.some((operation) => operation === undefined))
9
+ return { valid: false };
10
+ const parsed = ops.filter((operation) => operation !== undefined);
11
+ const uniqueIds = new Set(parsed.map(({ moduleId }) => moduleId));
12
+ return uniqueIds.size === parsed.length
13
+ ? { valid: true, value: { ops: parsed } }
14
+ : { valid: false };
15
+ }
16
+ /*** Serialize canonical Studio pending lifecycle state for one reviewed APM file change. */
17
+ export function serializePendingModuleLifecycleState(state) {
18
+ return `${JSON.stringify(state, null, 2)}\n`;
19
+ }
20
+ /*** Return pending module ids in the persisted execution order. */
21
+ export function pendingModuleLifecycleIds(state) {
22
+ return state.ops.map(({ moduleId }) => moduleId);
23
+ }
24
+ /*** Remove only reviewed module ids while preserving unrelated pending operations. */
25
+ export function removeReviewedPendingModules(state, moduleIds) {
26
+ return { ops: state.ops.filter(({ moduleId }) => !moduleIds.has(moduleId)) };
27
+ }
28
+ /*** Parse JSON into unknown data without leaking JSON.parse's any type. */
29
+ function parseJson(content) {
30
+ try {
31
+ const value = JSON.parse(content);
32
+ return value;
33
+ }
34
+ catch {
35
+ return undefined;
36
+ }
37
+ }
38
+ /*** Validate one persisted pending uninstall operation. */
39
+ function parseOperation(value) {
40
+ if (!isRecord(value) || value.type !== 'uninstall')
41
+ return undefined;
42
+ if (typeof value.moduleId !== 'string' || value.moduleId.trim() === '')
43
+ return undefined;
44
+ if (typeof value.at !== 'string' || value.at.trim() === '')
45
+ return undefined;
46
+ return { type: 'uninstall', moduleId: value.moduleId.trim(), at: value.at };
47
+ }
48
+ //# sourceMappingURL=pendingModuleLifecycleState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pendingModuleLifecycleState.js","sourceRoot":"","sources":["../../../../src/features/project-updates/domain/pendingModuleLifecycleState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAerD,uGAAuG;AACvG,MAAM,UAAU,gCAAgC,CAC9C,OAAe;IAEf,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC3E,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1C,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,SAAS,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC9E,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CACvB,CAAC,SAAS,EAAgD,EAAE,CAAC,SAAS,KAAK,SAAS,CACrF,CAAC;IACF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClE,OAAO,SAAS,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM;QACrC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QACzC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACvB,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,oCAAoC,CAAC,KAAkC;IACrF,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,yBAAyB,CAAC,KAAkC;IAC1E,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;AACnD,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,4BAA4B,CAC1C,KAAkC,EAClC,SAA8B;IAE9B,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;AAC/E,CAAC;AAED,2EAA2E;AAC3E,SAAS,SAAS,CAAC,OAAe;IAChC,IAAI,CAAC;QACH,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,2DAA2D;AAC3D,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IACrE,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACzF,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,IAAI,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAC7E,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ApmExtensionArtifactIdentity, ApmPlanStep } from '@ankhorage/apm/types';
2
+ export interface ReviewedPendingModuleStep {
3
+ readonly moduleId: string;
4
+ readonly pendingDigest: string;
5
+ readonly manifestDigest: string;
6
+ readonly artifact: ApmExtensionArtifactIdentity;
7
+ }
8
+ /*** Parse one exact Studio pending-module owner step from a reviewed APM plan. */
9
+ export declare function readReviewedPendingModuleStep(step: ApmPlanStep): ReviewedPendingModuleStep | undefined;
10
+ //# sourceMappingURL=pendingModulePlanStep.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pendingModulePlanStep.d.ts","sourceRoot":"","sources":["../../../../src/features/project-updates/domain/pendingModulePlanStep.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAOtF,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,4BAA4B,CAAC;CACjD;AAED,kFAAkF;AAClF,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,WAAW,GAChB,yBAAyB,GAAG,SAAS,CAUvC"}