@straiffi/archon 1.10.9 → 1.10.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/assets/ActivityView-BFn_Nhj4.js +1 -0
- package/dist/client/assets/GitHubActionsDialog-iZD86Yju.js +1 -0
- package/dist/client/assets/VerificationDialog-CqKE8t1d.js +4 -0
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-BAIGV9Mj.js → architectureDiagram-3BPJPVTR-C8KefY67.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-B-5v5jSZ.js → blockDiagram-GPEHLZMM-BO2Q_Osr.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-C6wU415o.js → c4Diagram-AAUBKEIU-DGPkhbrK.js} +1 -1
- package/dist/client/assets/channel-DXKn3TOv.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-COmvX2tP.js → chunk-2J33WTMH-Dtb7Xu8C.js} +1 -1
- package/dist/client/assets/{chunk-3OPIFGDE-BlANptdY.js → chunk-3OPIFGDE-Bnf4GbOF.js} +1 -1
- package/dist/client/assets/{chunk-5ZQYHXKU-ETyA2_GU.js → chunk-5ZQYHXKU-BWGid3g7.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-D5-DudwF.js → chunk-727SXJPM-ScA8IRGP.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-k1AJ4sA3.js → chunk-AQP2D5EJ-Bygg04Ip.js} +1 -1
- package/dist/client/assets/{chunk-CSCIHK7Q-jfksXwY9.js → chunk-CSCIHK7Q-CxdDDtfN.js} +1 -1
- package/dist/client/assets/{chunk-KSCS5N6A-CHj0FDj9.js → chunk-KSCS5N6A-BgpZFsB5.js} +1 -1
- package/dist/client/assets/{chunk-L5ZTLDWV-1ODGxXhG.js → chunk-L5ZTLDWV-CKSew0OL.js} +1 -1
- package/dist/client/assets/{chunk-LZXEDZCA-Bgh9X2W0.js → chunk-LZXEDZCA-DVG9Rx0K.js} +2 -2
- package/dist/client/assets/{chunk-ND2GUHAM-DDkb3sp4.js → chunk-ND2GUHAM-CHBqNmuF.js} +1 -1
- package/dist/client/assets/{chunk-NZK2D7GU-B6B8PZ_-.js → chunk-NZK2D7GU-DvZYWn7V.js} +1 -1
- package/dist/client/assets/{chunk-O5CBEL6O-DhiUIFgj.js → chunk-O5CBEL6O-BL7lRTSe.js} +1 -1
- package/dist/client/assets/{chunk-WU5MYG2G-Dzd0fbP3.js → chunk-WU5MYG2G-C-il2wHZ.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-U0fU20hT.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-C6bQNSxL.js +1 -0
- package/dist/client/assets/{dagre-BM42HDAG-DoNDMCXI.js → dagre-BM42HDAG-B00l5tLi.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-ETDXSa5q.js → diagram-2AECGRRQ-Tum6g1_5.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-CgTUep7e.js → diagram-5GNKFQAL-BK1GX5jc.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-BKTx2iRe.js → diagram-KO2AKTUF-BrzmD5NB.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-9iEiScHT.js → diagram-LMA3HP47-BhrlgXiJ.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-UIZRh7Qa.js → diagram-OG6HWLK6-K-fWsJ3a.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-BpNJmJva.js → erDiagram-TEJ5UH35-Der6PjHE.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-C-rK0XZ1.js → flowDiagram-I6XJVG4X-BVWgGhXe.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-DWyfPvv_.js → ganttDiagram-6RSMTGT7-DcoZ5ggj.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-x71bzdc_.js → gitGraphDiagram-PVQCEYII-BhhbMTBu.js} +1 -1
- package/dist/client/assets/index-B6BltHSr.css +2 -0
- package/dist/client/assets/index-CFOYm3j9.js +276 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-CbRus0Xu.js → infoDiagram-5YYISTIA-Lwc-agyc.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-DvaMHrgN.js → ishikawaDiagram-YF4QCWOH-B95U1Xcl.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-BQBu4YGn.js → journeyDiagram-JHISSGLW-xFpigy5D.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-8rU-U7L1.js → kanban-definition-UN3LZRKU-D3mudQnR.js} +1 -1
- package/dist/client/assets/{line-CSZnwjLA.js → line-DtTL3ZI2.js} +1 -1
- package/dist/client/assets/{mermaid-parser.core-CTOl2slE.js → mermaid-parser.core-Dau7K6zV.js} +1 -1
- package/dist/client/assets/{mermaid.core-B9gr0Vqf.js → mermaid.core-B8qtvATu.js} +3 -3
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-But1_PWQ.js → mindmap-definition-RKZ34NQL-Cus04Yq3.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-CnlVmfSG.js → pieDiagram-4H26LBE5-BCMGpBnn.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-Dww1ZGuR.js → quadrantDiagram-W4KKPZXB-CAmOr-PJ.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-CNf_loe8.js → requirementDiagram-4Y6WPE33-kisD3jc4.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-DBhi37Jj.js → sankeyDiagram-5OEKKPKP-CsCedmM0.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-B64hb4E4.js → sequenceDiagram-3UESZ5HK-B-dAi954.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-DcS6oB-S.js → stateDiagram-AJRCARHV-X0BnedIW.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-6B8YH8Y2.js +1 -0
- package/dist/client/assets/{timeline-definition-PNZ67QCA-Dq-4tXfh.js → timeline-definition-PNZ67QCA-DfFoSjhr.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-CeDklSE_.js → vennDiagram-CIIHVFJN-CKSCBwhG.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-D2cJISMm.js → wardleyDiagram-YWT4CUSO-DNIBQmHO.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-CBF-tTpF.js → xychartDiagram-2RQKCTM6-FvB55TQN.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/server/db.js +368 -5
- package/dist/server/db.js.map +1 -1
- package/dist/server/index.js +194 -250
- package/dist/server/index.js.map +1 -1
- package/dist/server/lib/agentRuns.js +14 -1
- package/dist/server/lib/agentRuns.js.map +1 -1
- package/dist/server/lib/automationLoopProjection.js +55 -12
- package/dist/server/lib/automationLoopProjection.js.map +1 -1
- package/dist/server/lib/automationProgression.js +2 -5
- package/dist/server/lib/automationProgression.js.map +1 -1
- package/dist/server/lib/automationResumeDecision.js +19 -1
- package/dist/server/lib/automationResumeDecision.js.map +1 -1
- package/dist/server/lib/buildControlEligibility.js +4 -0
- package/dist/server/lib/buildControlEligibility.js.map +1 -0
- package/dist/server/lib/buildExecutionAdmission.js +76 -0
- package/dist/server/lib/buildExecutionAdmission.js.map +1 -0
- package/dist/server/lib/buildSequenceResume.js +79 -0
- package/dist/server/lib/buildSequenceResume.js.map +1 -0
- package/dist/server/lib/buildWorkload.js +11 -0
- package/dist/server/lib/buildWorkload.js.map +1 -0
- package/dist/server/lib/checkAutoFixDetails.js +36 -1
- package/dist/server/lib/checkAutoFixDetails.js.map +1 -1
- package/dist/server/lib/executionEnvironmentReconciliation.js +15 -2
- package/dist/server/lib/executionEnvironmentReconciliation.js.map +1 -1
- package/dist/server/lib/executionEnvironments.js +15 -0
- package/dist/server/lib/executionEnvironments.js.map +1 -1
- package/dist/server/lib/executionRetry.js +13 -1
- package/dist/server/lib/executionRetry.js.map +1 -1
- package/dist/server/lib/executionRunAuthority.js +2 -2
- package/dist/server/lib/executionRunAuthority.js.map +1 -1
- package/dist/server/lib/executionTargets.js +7 -4
- package/dist/server/lib/executionTargets.js.map +1 -1
- package/dist/server/lib/executionTimeline.js +8 -13
- package/dist/server/lib/executionTimeline.js.map +1 -1
- package/dist/server/lib/executionTimelineHierarchy.js +83 -0
- package/dist/server/lib/executionTimelineHierarchy.js.map +1 -0
- package/dist/server/lib/failedBuildSequenceRecovery.js +133 -0
- package/dist/server/lib/failedBuildSequenceRecovery.js.map +1 -0
- package/dist/server/lib/hostRunSession.js +62 -0
- package/dist/server/lib/hostRunSession.js.map +1 -0
- package/dist/server/lib/hostServiceRecovery.js +159 -0
- package/dist/server/lib/hostServiceRecovery.js.map +1 -0
- package/dist/server/lib/hostServiceRunProvider.js +32 -0
- package/dist/server/lib/hostServiceRunProvider.js.map +1 -0
- package/dist/server/lib/mobileAccess.js +6 -2
- package/dist/server/lib/mobileAccess.js.map +1 -1
- package/dist/server/lib/projectAutoConfig.js +5 -2
- package/dist/server/lib/projectAutoConfig.js.map +1 -1
- package/dist/server/lib/projectTargets.js +16 -2
- package/dist/server/lib/projectTargets.js.map +1 -1
- package/dist/server/lib/projects.js +25 -1
- package/dist/server/lib/projects.js.map +1 -1
- package/dist/server/lib/reviewFindingReconciliation.js +9 -2
- package/dist/server/lib/reviewFindingReconciliation.js.map +1 -1
- package/dist/server/lib/reviewFindings.js +82 -21
- package/dist/server/lib/reviewFindings.js.map +1 -1
- package/dist/server/lib/reviewRepairAssessmentRecords.js +41 -0
- package/dist/server/lib/reviewRepairAssessmentRecords.js.map +1 -0
- package/dist/server/lib/reviewRepairCompletion.js +78 -18
- package/dist/server/lib/reviewRepairCompletion.js.map +1 -1
- package/dist/server/lib/reviewRepairIterationRecords.js +4 -2
- package/dist/server/lib/reviewRepairIterationRecords.js.map +1 -1
- package/dist/server/lib/reviewRepairIterations.js +8 -2
- package/dist/server/lib/reviewRepairIterations.js.map +1 -1
- package/dist/server/lib/reviewRepairProgress.js +177 -0
- package/dist/server/lib/reviewRepairProgress.js.map +1 -0
- package/dist/server/lib/reviewRepairReconciliation.js +119 -140
- package/dist/server/lib/reviewRepairReconciliation.js.map +1 -1
- package/dist/server/lib/reviewRepairResumeOverride.js +55 -0
- package/dist/server/lib/reviewRepairResumeOverride.js.map +1 -0
- package/dist/server/lib/run.js +541 -504
- package/dist/server/lib/run.js.map +1 -1
- package/dist/server/lib/runProcessIdentity.js +71 -0
- package/dist/server/lib/runProcessIdentity.js.map +1 -0
- package/dist/server/lib/runProcesses.js +273 -0
- package/dist/server/lib/runProcesses.js.map +1 -0
- package/dist/server/lib/runServices.js +223 -0
- package/dist/server/lib/runServices.js.map +1 -0
- package/dist/server/lib/runSessionLifecycle.js +77 -0
- package/dist/server/lib/runSessionLifecycle.js.map +1 -0
- package/dist/server/lib/runStatus.js +8 -0
- package/dist/server/lib/runStatus.js.map +1 -0
- package/dist/server/lib/serviceRunCleanup.js +70 -0
- package/dist/server/lib/serviceRunCleanup.js.map +1 -0
- package/dist/server/lib/serviceRuns.js +458 -19
- package/dist/server/lib/serviceRuns.js.map +1 -1
- package/dist/server/lib/ticketAutomation.js +4 -27
- package/dist/server/lib/ticketAutomation.js.map +1 -1
- package/dist/server/lib/ticketRunOperations.js +103 -34
- package/dist/server/lib/ticketRunOperations.js.map +1 -1
- package/dist/server/lib/tickets.js +0 -13
- package/dist/server/lib/tickets.js.map +1 -1
- package/dist/server/lib/types.js.map +1 -1
- package/dist/server/workers/build.js +44 -69
- package/dist/server/workers/build.js.map +1 -1
- package/dist/server/workers/plan.js +0 -7
- package/dist/server/workers/plan.js.map +1 -1
- package/dist/server/workers/review.js +95 -146
- package/dist/server/workers/review.js.map +1 -1
- package/package.json +1 -1
- package/dist/client/assets/ActivityView-CKvbDXeA.js +0 -1
- package/dist/client/assets/GitHubActionsDialog-Dzo0vtak.js +0 -1
- package/dist/client/assets/VerificationDialog-BJnOitrJ.js +0 -4
- package/dist/client/assets/channel-5mIy7nm1.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-BiQ-X2Sg.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CF-wCYW-.js +0 -1
- package/dist/client/assets/index-CIAO5aE_.css +0 -2
- package/dist/client/assets/index-nCGyalrn.js +0 -276
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-PWeeL0tR.js +0 -1
- package/dist/server/lib/automationDeliveryDecision.js +0 -34
- package/dist/server/lib/automationDeliveryDecision.js.map +0 -1
|
@@ -1,7 +1,68 @@
|
|
|
1
1
|
import db from '../db.js';
|
|
2
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
|
+
import { captureHostServiceProcessIdentity, cleanupHostServiceProcess, isHostServiceProcessIdentity } from './hostServiceRecovery.js';
|
|
2
5
|
import { createExecutionProfileSelection, executionProfileSelectionMetadata, validateExecutionProfileSelection, } from './executionRunAuthority.js';
|
|
3
6
|
import { appendLifecycleEvent, createExecutionRun, getExecutionRun, transitionExecutionRun } from './executionRuns.js';
|
|
7
|
+
import { appendExecutionEnvironmentEvent, getExecutionEnvironment, releaseExecutionRunFromEnvironment, requestExecutionEnvironmentRetirement, } from './executionEnvironments.js';
|
|
4
8
|
const MAX_SERVICE_SNAPSHOT_BYTES = 16 * 1024;
|
|
9
|
+
export const hasActiveProjectServiceRun = (projectId) => {
|
|
10
|
+
if (projectId === undefined) {
|
|
11
|
+
return Boolean(db.prepare('SELECT 1 FROM active_project_service_authorities LIMIT 1').get());
|
|
12
|
+
}
|
|
13
|
+
return Boolean(db.prepare('SELECT 1 FROM active_project_service_authorities WHERE project_id = ? LIMIT 1').get(projectId));
|
|
14
|
+
};
|
|
15
|
+
export const getActiveProjectServiceAuthority = (projectId) => {
|
|
16
|
+
try {
|
|
17
|
+
return db.prepare(`
|
|
18
|
+
SELECT active.execution_run_id, run.source_kind, details.target_kind,
|
|
19
|
+
COALESCE(details.provider_kind, environment.provider_kind) AS provider_kind,
|
|
20
|
+
details.cleanup_attempts, details.cleanup_retry_at, details.cleanup_error_message,
|
|
21
|
+
details.cleanup_claim_id, COALESCE(details.environment_id, binding.environment_id) AS environment_id,
|
|
22
|
+
COALESCE(details.environment_revision, binding.environment_revision) AS environment_revision
|
|
23
|
+
FROM active_project_service_authorities active
|
|
24
|
+
JOIN execution_runs run ON run.id = active.execution_run_id
|
|
25
|
+
LEFT JOIN service_run_details details ON details.execution_run_id = active.execution_run_id
|
|
26
|
+
LEFT JOIN execution_environment_run_bindings binding
|
|
27
|
+
ON binding.execution_run_id = active.execution_run_id AND binding.project_id = active.project_id
|
|
28
|
+
AND binding.relationship = 'execution' AND binding.released_at IS NULL
|
|
29
|
+
LEFT JOIN execution_environments environment
|
|
30
|
+
ON environment.id = binding.environment_id AND environment.project_id = binding.project_id
|
|
31
|
+
WHERE active.project_id = ?
|
|
32
|
+
LIMIT 1
|
|
33
|
+
`).get(projectId) ?? null;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
const legacy = db.prepare(`SELECT active.execution_run_id, run.source_kind, details.target_kind, details.provider_kind
|
|
37
|
+
FROM active_project_service_authorities active
|
|
38
|
+
JOIN execution_runs run ON run.id = active.execution_run_id
|
|
39
|
+
LEFT JOIN service_run_details details ON details.execution_run_id = active.execution_run_id
|
|
40
|
+
WHERE active.project_id = ? LIMIT 1`).get(projectId);
|
|
41
|
+
return legacy ? {
|
|
42
|
+
...legacy,
|
|
43
|
+
cleanup_attempts: 0,
|
|
44
|
+
cleanup_retry_at: null,
|
|
45
|
+
cleanup_error_message: 'Stored cleanup details are incomplete and cannot be verified automatically.',
|
|
46
|
+
cleanup_claim_id: null,
|
|
47
|
+
environment_id: null,
|
|
48
|
+
environment_revision: null,
|
|
49
|
+
} : null;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
export const getProjectServiceCleanupStatus = (projectId) => {
|
|
53
|
+
const authority = getActiveProjectServiceAuthority(projectId);
|
|
54
|
+
if (!authority) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
execution_run_id: authority.execution_run_id,
|
|
59
|
+
provider: authority.provider_kind,
|
|
60
|
+
attempts: authority.cleanup_attempts,
|
|
61
|
+
retry_at: authority.cleanup_retry_at,
|
|
62
|
+
error: authority.cleanup_error_message,
|
|
63
|
+
can_force_release: authority.cleanup_claim_id === null,
|
|
64
|
+
};
|
|
65
|
+
};
|
|
5
66
|
const serializeBounded = (value, label) => {
|
|
6
67
|
const serialized = JSON.stringify(value);
|
|
7
68
|
if (Buffer.byteLength(serialized, 'utf8') > MAX_SERVICE_SNAPSHOT_BYTES) {
|
|
@@ -39,13 +100,22 @@ const serializeDetails = (row) => {
|
|
|
39
100
|
};
|
|
40
101
|
};
|
|
41
102
|
export const createServiceRun = (input) => {
|
|
42
|
-
const profileSelection = input.profileSelection ?? createExecutionProfileSelection(input.projectId);
|
|
43
|
-
const profileRevision = validateExecutionProfileSelection(input.projectId, profileSelection);
|
|
44
|
-
const profile = {
|
|
45
|
-
build_execution_provider: profileRevision.profile.provider_preference,
|
|
46
|
-
...executionProfileSelectionMetadata(profileSelection),
|
|
47
|
-
};
|
|
48
103
|
const run = db.transaction(() => {
|
|
104
|
+
if (input.sessionId !== undefined && !input.sessionId.trim()) {
|
|
105
|
+
throw new Error('Service session ID must be a non-empty string');
|
|
106
|
+
}
|
|
107
|
+
if (hasActiveProjectServiceRun(input.projectId)) {
|
|
108
|
+
throw new Error('Project already has active service authority');
|
|
109
|
+
}
|
|
110
|
+
if (input.target.identity.projectId !== input.projectId) {
|
|
111
|
+
throw new Error('Service target must belong to the project');
|
|
112
|
+
}
|
|
113
|
+
const profileSelection = input.profileSelection ?? createExecutionProfileSelection(input.projectId);
|
|
114
|
+
const profileRevision = validateExecutionProfileSelection(input.projectId, profileSelection);
|
|
115
|
+
const profile = {
|
|
116
|
+
build_execution_provider: profileRevision.profile.provider_preference,
|
|
117
|
+
...executionProfileSelectionMetadata(profileSelection),
|
|
118
|
+
};
|
|
49
119
|
const created = createExecutionRun({
|
|
50
120
|
projectId: input.projectId,
|
|
51
121
|
kind: 'service',
|
|
@@ -63,9 +133,11 @@ export const createServiceRun = (input) => {
|
|
|
63
133
|
metadata: {
|
|
64
134
|
...profile,
|
|
65
135
|
context_key: input.contextKey,
|
|
136
|
+
...(input.sessionId !== undefined ? { session_id: input.sessionId } : {}),
|
|
66
137
|
target_kind: input.target.identity.kind,
|
|
67
138
|
target_key: input.target.identity.key,
|
|
68
139
|
target_workspace_path: input.target.workspacePath,
|
|
140
|
+
service_allocation_state: 'not_started',
|
|
69
141
|
},
|
|
70
142
|
eventType: 'service_run_created',
|
|
71
143
|
eventMessage: 'Service run authority was accepted for the canonical target.',
|
|
@@ -78,31 +150,84 @@ export const createServiceRun = (input) => {
|
|
|
78
150
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
79
151
|
`).run(created.id, input.projectId, input.contextKey, input.target.identity.kind, input.target.identity.key, input.target.workspacePath, profile.execution_profile_revision_id, profile.execution_profile_fingerprint, serializeBounded(input.services, 'Service configuration snapshot'));
|
|
80
152
|
return created;
|
|
81
|
-
})();
|
|
153
|
+
}).immediate();
|
|
82
154
|
return run;
|
|
83
155
|
};
|
|
84
|
-
|
|
85
|
-
|
|
156
|
+
// Invalidate absence proof before entering allocation, including its first await.
|
|
157
|
+
export const markServiceRunAllocationStarted = (projectId, executionRunId) => {
|
|
158
|
+
const updated = db.prepare(`UPDATE execution_runs
|
|
159
|
+
SET metadata_json = json_set(metadata_json, '$.service_allocation_state', 'started')
|
|
160
|
+
WHERE project_id = ? AND id = ? AND kind = 'service'
|
|
161
|
+
AND status NOT IN ('completed', 'failed', 'cancelled', 'interrupted')
|
|
162
|
+
AND EXISTS (SELECT 1 FROM service_run_details WHERE execution_run_id = execution_runs.id AND completed_at IS NULL)`)
|
|
163
|
+
.run(projectId, executionRunId);
|
|
164
|
+
if (updated.changes !== 1) {
|
|
165
|
+
throw new Error('Active durable service run was not found');
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
export const recordServiceRunPlacement = (input) => db.transaction(() => {
|
|
169
|
+
const details = db.prepare(`SELECT * FROM service_run_details WHERE project_id = ? AND execution_run_id = ?`)
|
|
170
|
+
.get(input.projectId, input.executionRunId);
|
|
171
|
+
if (!details || details.completed_at !== null) {
|
|
172
|
+
throw new Error('Active durable service run was not found');
|
|
173
|
+
}
|
|
174
|
+
if (details.provider_kind !== null && (details.provider_kind !== input.provider
|
|
175
|
+
|| details.environment_id !== input.environmentId || details.environment_revision !== input.environmentRevision)) {
|
|
176
|
+
throw new Error('Service placement authority cannot be replaced');
|
|
177
|
+
}
|
|
178
|
+
if (input.placement && (input.placement.provider !== input.provider
|
|
179
|
+
|| input.placement.executionRunId !== input.executionRunId || input.placement.targetKey !== details.target_key)) {
|
|
180
|
+
throw new Error('Service placement does not match durable authority');
|
|
181
|
+
}
|
|
182
|
+
let placement = input.placement
|
|
86
183
|
? input.placement
|
|
87
184
|
: input.provider === 'host'
|
|
88
185
|
? { provider: 'host', scope: 'local_processes' }
|
|
89
186
|
: null;
|
|
187
|
+
if (input.provider === 'host') {
|
|
188
|
+
const previous = parseObject(details.placement_json);
|
|
189
|
+
if ((details.placement_json !== null && !previous)
|
|
190
|
+
|| (previous?.placements !== undefined && !Array.isArray(previous.placements))) {
|
|
191
|
+
throw new Error('Existing host placement evidence is malformed');
|
|
192
|
+
}
|
|
193
|
+
const placements = previous && Array.isArray(previous.placements)
|
|
194
|
+
? [...previous.placements]
|
|
195
|
+
: previous && previous.scope !== 'local_processes' ? [previous] : [];
|
|
196
|
+
if (input.placement && !placements.some(existing => isDeepStrictEqual(existing, input.placement))) {
|
|
197
|
+
placements.push(input.placement);
|
|
198
|
+
}
|
|
199
|
+
placement = {
|
|
200
|
+
provider: 'host', scope: 'local_processes', placements,
|
|
201
|
+
...(previous?.host_processes !== undefined ? { host_processes: previous.host_processes } : {}),
|
|
202
|
+
...(previous?.host_process_cleanup !== undefined ? { host_process_cleanup: previous.host_process_cleanup } : {}),
|
|
203
|
+
};
|
|
204
|
+
}
|
|
90
205
|
const updated = db.prepare(`
|
|
91
206
|
UPDATE service_run_details
|
|
92
207
|
SET provider_kind = ?, environment_id = ?, environment_revision = ?,
|
|
93
208
|
placement_json = ?, interruption_scope = ?, started_at = COALESCE(started_at, CURRENT_TIMESTAMP),
|
|
94
209
|
updated_at = CURRENT_TIMESTAMP
|
|
95
210
|
WHERE execution_run_id = ? AND project_id = ? AND completed_at IS NULL
|
|
211
|
+
AND EXISTS (SELECT 1 FROM execution_runs run WHERE run.id = service_run_details.execution_run_id
|
|
212
|
+
AND run.status NOT IN ('completed', 'failed', 'cancelled', 'interrupted'))
|
|
96
213
|
`).run(input.provider, input.environmentId, input.environmentRevision, placement ? serializeBounded(placement, 'Service placement') : null, input.provider === 'docker_sandbox' ? 'whole_environment' : 'local_processes', input.executionRunId, input.projectId);
|
|
97
214
|
if (updated.changes !== 1) {
|
|
98
215
|
throw new Error('Active durable service run was not found');
|
|
99
216
|
}
|
|
100
|
-
};
|
|
217
|
+
}).immediate();
|
|
101
218
|
export const completeServiceRun = (input) => db.transaction(() => {
|
|
102
219
|
const current = getExecutionRun(input.projectId, input.executionRunId);
|
|
103
220
|
if (!current) {
|
|
104
221
|
return current;
|
|
105
222
|
}
|
|
223
|
+
if (current.kind !== 'service' || !getServiceRunDetails(input.projectId, input.executionRunId)) {
|
|
224
|
+
throw new Error('Durable service run was not found');
|
|
225
|
+
}
|
|
226
|
+
if (db.prepare(`SELECT 1 FROM execution_environment_run_bindings
|
|
227
|
+
WHERE project_id = ? AND execution_run_id = ? AND relationship = 'execution'
|
|
228
|
+
AND released_at IS NULL`).get(input.projectId, input.executionRunId)) {
|
|
229
|
+
throw new Error('Service execution binding is unreleased');
|
|
230
|
+
}
|
|
106
231
|
const transitioned = ['completed', 'failed', 'cancelled', 'interrupted'].includes(current.status)
|
|
107
232
|
? current
|
|
108
233
|
: transitionExecutionRun({
|
|
@@ -123,8 +248,24 @@ export const completeServiceRun = (input) => db.transaction(() => {
|
|
|
123
248
|
`).run(input.executionRunId, input.projectId);
|
|
124
249
|
return transitioned;
|
|
125
250
|
})();
|
|
126
|
-
export const
|
|
251
|
+
export const recordServiceRunFinalizationIntent = (input) => {
|
|
252
|
+
const updated = db.prepare(`
|
|
253
|
+
UPDATE service_run_details
|
|
254
|
+
SET intended_status = COALESCE(intended_status, ?),
|
|
255
|
+
intended_event_type = COALESCE(intended_event_type, ?),
|
|
256
|
+
intended_message = COALESCE(intended_message, ?),
|
|
257
|
+
updated_at = CURRENT_TIMESTAMP
|
|
258
|
+
WHERE project_id = ? AND execution_run_id = ? AND completed_at IS NULL
|
|
259
|
+
`).run(input.intendedStatus, input.intendedEventType, input.intendedMessage ?? null, input.projectId, input.executionRunId);
|
|
260
|
+
if (updated.changes !== 1) {
|
|
261
|
+
throw new Error('Active durable service run was not found');
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
export const recordServiceRunReleaseFailure = (input) => db.transaction(() => {
|
|
127
265
|
const current = getExecutionRun(input.projectId, input.executionRunId);
|
|
266
|
+
if (current && (current.kind !== 'service' || !getServiceRunDetails(input.projectId, input.executionRunId))) {
|
|
267
|
+
throw new Error('Durable service run was not found');
|
|
268
|
+
}
|
|
128
269
|
if (!current || ['completed', 'failed', 'cancelled', 'interrupted'].includes(current.status)) {
|
|
129
270
|
return current;
|
|
130
271
|
}
|
|
@@ -133,6 +274,11 @@ export const recordServiceRunReleaseFailure = (input) => {
|
|
|
133
274
|
intended_event_type: input.intendedEventType,
|
|
134
275
|
lease_retained: true,
|
|
135
276
|
};
|
|
277
|
+
recordServiceRunFinalizationIntent(input);
|
|
278
|
+
db.prepare(`UPDATE service_run_details
|
|
279
|
+
SET cleanup_error_message = ?, cleanup_retry_at = datetime('now', '+30 seconds'), updated_at = CURRENT_TIMESTAMP
|
|
280
|
+
WHERE project_id = ? AND execution_run_id = ? AND completed_at IS NULL`)
|
|
281
|
+
.run(input.message.slice(0, 4000), input.projectId, input.executionRunId);
|
|
136
282
|
if (current.status === 'waiting' && current.domain_status === 'environment_release_pending') {
|
|
137
283
|
appendLifecycleEvent({
|
|
138
284
|
projectId: input.projectId,
|
|
@@ -153,19 +299,190 @@ export const recordServiceRunReleaseFailure = (input) => {
|
|
|
153
299
|
eventMessage: input.message,
|
|
154
300
|
eventMetadata: metadata,
|
|
155
301
|
});
|
|
156
|
-
};
|
|
302
|
+
}).immediate();
|
|
157
303
|
export const getServiceRunDetails = (projectId, executionRunId) => {
|
|
158
304
|
const row = db.prepare(`
|
|
159
305
|
SELECT * FROM service_run_details WHERE project_id = ? AND execution_run_id = ?
|
|
160
306
|
`).get(projectId, executionRunId);
|
|
161
307
|
return row ? serializeDetails(row) : null;
|
|
162
308
|
};
|
|
309
|
+
export const getRecoverableHostServiceRun = (projectId) => {
|
|
310
|
+
const row = db.prepare(`SELECT * FROM service_run_details
|
|
311
|
+
WHERE project_id = ? AND (provider_kind = 'host' OR provider_kind IS NULL) AND completed_at IS NULL`).get(projectId);
|
|
312
|
+
if (!row) {
|
|
313
|
+
return null;
|
|
314
|
+
}
|
|
315
|
+
return { ...serializeDetails(row), sessionId: getExecutionRun(projectId, row.execution_run_id)?.metadata?.session_id };
|
|
316
|
+
};
|
|
317
|
+
// Persist the intent BEFORE spawning, so a crash or failed identity capture cannot
|
|
318
|
+
// turn a partial list of service/setup children into proof of complete cleanup.
|
|
319
|
+
export const prepareHostServiceProcessLaunch = (projectId, executionRunId) => {
|
|
320
|
+
const launchId = randomUUID();
|
|
321
|
+
const update = (identity) => db.transaction(() => {
|
|
322
|
+
const details = getServiceRunDetails(projectId, executionRunId);
|
|
323
|
+
if (!details || details.completed_at !== null || (details.provider_kind !== null && details.provider_kind !== 'host')) {
|
|
324
|
+
throw new Error('Active durable host service run was not found');
|
|
325
|
+
}
|
|
326
|
+
recordServiceRunPlacement({ projectId, executionRunId, provider: 'host', environmentId: null, environmentRevision: null });
|
|
327
|
+
const placement = getServiceRunDetails(projectId, executionRunId).placement;
|
|
328
|
+
const processes = placement.host_processes;
|
|
329
|
+
if (processes !== undefined && (!processes || typeof processes !== 'object' || Array.isArray(processes))) {
|
|
330
|
+
throw new Error('Existing host process evidence is malformed');
|
|
331
|
+
}
|
|
332
|
+
if (identity !== null && processes?.[launchId] !== null) {
|
|
333
|
+
throw new Error('Host process launch identity cannot be replaced');
|
|
334
|
+
}
|
|
335
|
+
const nextProcesses = { ...processes, [launchId]: identity };
|
|
336
|
+
const nextPlacement = { ...placement, host_processes: nextProcesses };
|
|
337
|
+
// Reserve room for every cleanup proof before accepting a launch identity.
|
|
338
|
+
serializeBounded({ ...nextPlacement, host_process_cleanup: Object.fromEntries(Object.keys(nextProcesses).map(id => [id, true])) }, 'Host process evidence');
|
|
339
|
+
db.prepare('UPDATE service_run_details SET placement_json = ?, updated_at = CURRENT_TIMESTAMP WHERE execution_run_id = ? AND project_id = ?')
|
|
340
|
+
.run(serializeBounded(nextPlacement, 'Host process evidence'), executionRunId, projectId);
|
|
341
|
+
}).immediate();
|
|
342
|
+
update(null);
|
|
343
|
+
return (pid) => {
|
|
344
|
+
let identity;
|
|
345
|
+
try {
|
|
346
|
+
identity = captureHostServiceProcessIdentity(pid);
|
|
347
|
+
}
|
|
348
|
+
catch (error) {
|
|
349
|
+
// Host execution remains available on unsupported platforms. The unresolved
|
|
350
|
+
// intent blocks recovery until cleanup can be proved, rather than guessing.
|
|
351
|
+
appendLifecycleEvent({
|
|
352
|
+
projectId, runId: executionRunId, eventType: 'service_host_identity_unverified',
|
|
353
|
+
message: 'Host process recovery identity could not be captured.',
|
|
354
|
+
metadata: { launch_id: launchId, reason: error instanceof Error ? error.message : String(error) },
|
|
355
|
+
});
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
update(identity);
|
|
359
|
+
};
|
|
360
|
+
};
|
|
361
|
+
export const retryInterruptedHostServiceRun = (projectId, executionRunId) => {
|
|
362
|
+
const details = getServiceRunDetails(projectId, executionRunId);
|
|
363
|
+
if (!details || details.completed_at !== null || (details.provider_kind !== null && details.provider_kind !== 'host')) {
|
|
364
|
+
return false;
|
|
365
|
+
}
|
|
366
|
+
if (details.provider_kind === null) {
|
|
367
|
+
const run = getExecutionRun(projectId, executionRunId);
|
|
368
|
+
// Missing authority is not absence proof. Even released bindings or malformed
|
|
369
|
+
// placement evidence contradict the claim that allocation never began.
|
|
370
|
+
const binding = db.prepare(`SELECT 1 FROM execution_environment_run_bindings
|
|
371
|
+
WHERE project_id = ? AND execution_run_id = ?`).get(projectId, executionRunId);
|
|
372
|
+
const placementEvidence = db.prepare(`SELECT 1 FROM service_run_details
|
|
373
|
+
WHERE project_id = ? AND execution_run_id = ? AND placement_json IS NOT NULL`).get(projectId, executionRunId);
|
|
374
|
+
if (run?.metadata?.service_allocation_state === 'not_started' && !binding
|
|
375
|
+
&& !placementEvidence && details.environment_id === null
|
|
376
|
+
&& details.environment_revision === null && details.started_at === null) {
|
|
377
|
+
completeServiceRun({
|
|
378
|
+
projectId, executionRunId, status: 'interrupted', code: 'server_restarted',
|
|
379
|
+
message: 'The server restarted before service allocation began; no cleanup was required.',
|
|
380
|
+
eventType: 'service_run_interrupted',
|
|
381
|
+
});
|
|
382
|
+
return true;
|
|
383
|
+
}
|
|
384
|
+
if (run?.domain_status !== 'environment_release_pending') {
|
|
385
|
+
recordServiceRunReleaseFailure({
|
|
386
|
+
projectId, executionRunId,
|
|
387
|
+
message: 'Service placement is uncertain. Authority is retained until allocation and cleanup evidence can be verified.',
|
|
388
|
+
intendedStatus: 'interrupted', intendedEventType: 'service_run_interrupted',
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
return false;
|
|
392
|
+
}
|
|
393
|
+
if (db.prepare(`SELECT 1 FROM execution_environment_run_bindings
|
|
394
|
+
WHERE project_id = ? AND execution_run_id = ? AND relationship = 'execution' AND released_at IS NULL`)
|
|
395
|
+
.get(projectId, executionRunId)) {
|
|
396
|
+
return false;
|
|
397
|
+
}
|
|
398
|
+
const processes = details.placement?.host_processes;
|
|
399
|
+
const identities = processes && typeof processes === 'object' && !Array.isArray(processes)
|
|
400
|
+
? Object.entries(processes) : [];
|
|
401
|
+
const previousCleanup = details.placement?.host_process_cleanup;
|
|
402
|
+
const cleanup = previousCleanup && typeof previousCleanup === 'object' && !Array.isArray(previousCleanup)
|
|
403
|
+
? { ...previousCleanup } : {};
|
|
404
|
+
// Clean every recorded sibling, but never release authority on partial success.
|
|
405
|
+
const verified = identities.map(([launchId, identity]) => {
|
|
406
|
+
if (!isHostServiceProcessIdentity(identity)) {
|
|
407
|
+
return false;
|
|
408
|
+
}
|
|
409
|
+
if (cleanup[launchId] === true) {
|
|
410
|
+
return true;
|
|
411
|
+
}
|
|
412
|
+
if (!cleanupHostServiceProcess(identity)) {
|
|
413
|
+
return false;
|
|
414
|
+
}
|
|
415
|
+
cleanup[launchId] = true;
|
|
416
|
+
// Never reacquire a numeric session after its disappearance was verified.
|
|
417
|
+
db.prepare('UPDATE service_run_details SET placement_json = ?, updated_at = CURRENT_TIMESTAMP WHERE execution_run_id = ? AND project_id = ? AND completed_at IS NULL')
|
|
418
|
+
.run(serializeBounded({ ...details.placement, host_process_cleanup: cleanup }, 'Host process cleanup evidence'), executionRunId, projectId);
|
|
419
|
+
return true;
|
|
420
|
+
});
|
|
421
|
+
if (!verified.length || verified.some(result => !result)) {
|
|
422
|
+
if (getExecutionRun(projectId, executionRunId)?.domain_status !== 'environment_release_pending') {
|
|
423
|
+
recordServiceRunReleaseFailure({
|
|
424
|
+
projectId, executionRunId,
|
|
425
|
+
message: 'Host process cleanup could not be verified. Authority is retained; retry stopping the session after resolving host inspection or cleanup failures.',
|
|
426
|
+
intendedStatus: 'interrupted', intendedEventType: 'service_run_interrupted',
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
return false;
|
|
430
|
+
}
|
|
431
|
+
const finalDetails = getServiceRunDetails(projectId, executionRunId);
|
|
432
|
+
completeServiceRun({
|
|
433
|
+
projectId,
|
|
434
|
+
executionRunId,
|
|
435
|
+
status: finalDetails.intended_status ?? 'interrupted',
|
|
436
|
+
code: finalDetails.intended_status === 'failed' ? 'service_run_failed' : 'server_restarted',
|
|
437
|
+
message: finalDetails.intended_message ?? 'The server restarted; all recorded host service process sessions were verifiably cleaned up.',
|
|
438
|
+
eventType: finalDetails.intended_event_type ?? 'service_run_interrupted',
|
|
439
|
+
});
|
|
440
|
+
return true;
|
|
441
|
+
};
|
|
442
|
+
// The existing Stop action can use this only after finding no live in-memory owner.
|
|
443
|
+
export const retryInterruptedHostServiceRunForContext = (contextKey, options = {}) => {
|
|
444
|
+
const row = db.prepare(`SELECT details.project_id, details.execution_run_id
|
|
445
|
+
FROM service_run_details details
|
|
446
|
+
WHERE details.context_key = ? AND (details.provider_kind = 'host' OR details.provider_kind IS NULL) AND details.completed_at IS NULL`)
|
|
447
|
+
.get(contextKey);
|
|
448
|
+
if (!row) {
|
|
449
|
+
return false;
|
|
450
|
+
}
|
|
451
|
+
const run = getExecutionRun(row.project_id, row.execution_run_id);
|
|
452
|
+
if (options.sessionId !== undefined && run.metadata?.session_id !== options.sessionId) {
|
|
453
|
+
throw new Error('The service session has changed. Refresh before retrying.');
|
|
454
|
+
}
|
|
455
|
+
if (options.serviceId !== undefined) {
|
|
456
|
+
throw new Error('Restarted host sessions require whole-session cleanup');
|
|
457
|
+
}
|
|
458
|
+
if (!retryInterruptedHostServiceRun(row.project_id, row.execution_run_id)) {
|
|
459
|
+
throw new Error('Host service cleanup remains unverified; session authority is retained. Retry stopping the session after resolving host cleanup failures.');
|
|
460
|
+
}
|
|
461
|
+
return true;
|
|
462
|
+
};
|
|
163
463
|
export const reconcileInterruptedServiceRuns = () => {
|
|
464
|
+
// Neither a missing binding nor a terminal envelope proves that service processes stopped.
|
|
465
|
+
// Docker requires release evidence for the exact recorded environment.
|
|
164
466
|
const rows = db.prepare(`
|
|
165
|
-
SELECT details.execution_run_id, details.project_id,
|
|
467
|
+
SELECT details.execution_run_id, details.project_id, run.status
|
|
166
468
|
FROM service_run_details details
|
|
167
469
|
JOIN execution_runs run ON run.id = details.execution_run_id AND run.project_id = details.project_id
|
|
168
470
|
WHERE details.completed_at IS NULL
|
|
471
|
+
AND details.provider_kind = 'docker_sandbox'
|
|
472
|
+
AND EXISTS (
|
|
473
|
+
SELECT 1 FROM execution_environment_run_bindings released
|
|
474
|
+
JOIN execution_environments environment
|
|
475
|
+
ON environment.id = released.environment_id AND environment.project_id = released.project_id
|
|
476
|
+
WHERE released.execution_run_id = details.execution_run_id
|
|
477
|
+
AND released.project_id = details.project_id
|
|
478
|
+
AND released.relationship = 'execution' AND released.released_at IS NOT NULL
|
|
479
|
+
AND released.environment_id = details.environment_id
|
|
480
|
+
AND released.environment_revision = details.environment_revision
|
|
481
|
+
AND environment.provider_kind = 'docker_sandbox'
|
|
482
|
+
AND environment.environment_revision = details.environment_revision
|
|
483
|
+
AND environment.target_key = details.target_key
|
|
484
|
+
AND environment.target_workspace_path = details.target_workspace_path
|
|
485
|
+
)
|
|
169
486
|
AND NOT EXISTS (
|
|
170
487
|
SELECT 1 FROM execution_environment_run_bindings binding
|
|
171
488
|
WHERE binding.execution_run_id = details.execution_run_id
|
|
@@ -177,17 +494,32 @@ export const reconcileInterruptedServiceRuns = () => {
|
|
|
177
494
|
`).all();
|
|
178
495
|
let interrupted = 0;
|
|
179
496
|
let repaired = 0;
|
|
497
|
+
const hosts = db.prepare(`SELECT details.project_id, details.execution_run_id, run.status
|
|
498
|
+
FROM service_run_details details JOIN execution_runs run ON run.id = details.execution_run_id
|
|
499
|
+
WHERE details.completed_at IS NULL AND (details.provider_kind IS NULL OR (details.provider_kind = 'host'
|
|
500
|
+
AND NOT EXISTS (SELECT 1 FROM execution_environment_run_bindings binding
|
|
501
|
+
WHERE binding.execution_run_id = details.execution_run_id AND binding.relationship = 'execution'
|
|
502
|
+
AND binding.released_at IS NULL)))`).all();
|
|
503
|
+
for (const host of hosts) {
|
|
504
|
+
if (retryInterruptedHostServiceRun(host.project_id, host.execution_run_id)) {
|
|
505
|
+
if (['completed', 'failed', 'cancelled', 'interrupted'].includes(host.status)) {
|
|
506
|
+
repaired += 1;
|
|
507
|
+
}
|
|
508
|
+
else {
|
|
509
|
+
interrupted += 1;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
}
|
|
180
513
|
for (const row of rows) {
|
|
181
514
|
const isTerminal = ['completed', 'failed', 'cancelled', 'interrupted'].includes(row.status);
|
|
515
|
+
const details = getServiceRunDetails(row.project_id, row.execution_run_id);
|
|
182
516
|
completeServiceRun({
|
|
183
517
|
projectId: row.project_id,
|
|
184
518
|
executionRunId: row.execution_run_id,
|
|
185
|
-
status: 'interrupted',
|
|
186
|
-
code: 'server_restarted',
|
|
187
|
-
message:
|
|
188
|
-
|
|
189
|
-
: 'The server restarted while this service run was active. Host process interruption is limited to the local service processes.',
|
|
190
|
-
eventType: 'service_run_interrupted',
|
|
519
|
+
status: details.intended_status ?? 'interrupted',
|
|
520
|
+
code: details.intended_status === 'failed' ? 'service_run_failed' : 'server_restarted',
|
|
521
|
+
message: details.intended_message ?? 'The server restarted while this service run was active. Docker Sandbox interruption applies to the whole environment and every attached service.',
|
|
522
|
+
eventType: details.intended_event_type ?? 'service_run_interrupted',
|
|
191
523
|
});
|
|
192
524
|
if (isTerminal) {
|
|
193
525
|
repaired += 1;
|
|
@@ -198,4 +530,111 @@ export const reconcileInterruptedServiceRuns = () => {
|
|
|
198
530
|
}
|
|
199
531
|
return { interrupted, repaired };
|
|
200
532
|
};
|
|
533
|
+
export const claimProjectServiceCleanup = (projectId, ignoreRetryAt = false) => db.transaction(() => {
|
|
534
|
+
const authority = getActiveProjectServiceAuthority(projectId);
|
|
535
|
+
if (!authority) {
|
|
536
|
+
return null;
|
|
537
|
+
}
|
|
538
|
+
const claimId = randomUUID();
|
|
539
|
+
if (authority.provider_kind === 'docker_sandbox') {
|
|
540
|
+
db.prepare(`UPDATE service_run_details
|
|
541
|
+
SET provider_kind = 'docker_sandbox', environment_id = ?, environment_revision = ?,
|
|
542
|
+
interruption_scope = 'whole_environment', updated_at = CURRENT_TIMESTAMP
|
|
543
|
+
WHERE project_id = ? AND execution_run_id = ? AND completed_at IS NULL AND provider_kind IS NULL`)
|
|
544
|
+
.run(authority.environment_id, authority.environment_revision, projectId, authority.execution_run_id);
|
|
545
|
+
}
|
|
546
|
+
const updated = db.prepare(`UPDATE service_run_details
|
|
547
|
+
SET cleanup_claim_id = ?, cleanup_claimed_at = CURRENT_TIMESTAMP,
|
|
548
|
+
cleanup_attempts = cleanup_attempts + 1, cleanup_retry_at = NULL, updated_at = CURRENT_TIMESTAMP
|
|
549
|
+
WHERE project_id = ? AND execution_run_id = ? AND completed_at IS NULL
|
|
550
|
+
AND (cleanup_claim_id IS NULL OR cleanup_claimed_at < datetime('now', '-5 minutes'))
|
|
551
|
+
AND (? = 1 OR cleanup_retry_at IS NULL OR cleanup_retry_at <= CURRENT_TIMESTAMP)`)
|
|
552
|
+
.run(claimId, projectId, authority.execution_run_id, ignoreRetryAt ? 1 : 0);
|
|
553
|
+
return updated.changes === 1 ? { ...authority, claimId } : null;
|
|
554
|
+
}).immediate();
|
|
555
|
+
export const finishProjectServiceCleanupAttempt = (projectId, executionRunId, claimId) => {
|
|
556
|
+
db.prepare(`UPDATE service_run_details
|
|
557
|
+
SET cleanup_claim_id = NULL, cleanup_claimed_at = NULL, cleanup_retry_at = NULL,
|
|
558
|
+
cleanup_error_message = NULL, updated_at = CURRENT_TIMESTAMP
|
|
559
|
+
WHERE project_id = ? AND execution_run_id = ? AND cleanup_claim_id = ?`)
|
|
560
|
+
.run(projectId, executionRunId, claimId);
|
|
561
|
+
};
|
|
562
|
+
export const failProjectServiceCleanupAttempt = (projectId, executionRunId, claimId, message) => {
|
|
563
|
+
const details = getServiceRunDetails(projectId, executionRunId);
|
|
564
|
+
const delaySeconds = Math.min(300, 15 * (2 ** Math.max(0, (details?.cleanup_attempts ?? 1) - 1)));
|
|
565
|
+
db.prepare(`UPDATE service_run_details
|
|
566
|
+
SET cleanup_claim_id = NULL, cleanup_claimed_at = NULL,
|
|
567
|
+
cleanup_retry_at = datetime('now', ?), cleanup_error_message = ?, updated_at = CURRENT_TIMESTAMP
|
|
568
|
+
WHERE project_id = ? AND execution_run_id = ? AND cleanup_claim_id = ?`)
|
|
569
|
+
.run(`+${delaySeconds} seconds`, message.slice(0, 4000), projectId, executionRunId, claimId);
|
|
570
|
+
};
|
|
571
|
+
export const forceReleaseProjectServiceAuthority = (projectId) => db.transaction(() => {
|
|
572
|
+
const authority = getActiveProjectServiceAuthority(projectId);
|
|
573
|
+
if (!authority) {
|
|
574
|
+
return false;
|
|
575
|
+
}
|
|
576
|
+
if (authority.cleanup_claim_id) {
|
|
577
|
+
throw new Error('Service cleanup is already in progress. Wait for it to finish before force releasing the lock.');
|
|
578
|
+
}
|
|
579
|
+
const message = 'Service cleanup authority was force released without positive process termination proof.';
|
|
580
|
+
const bindings = db.prepare(`SELECT environment_id FROM execution_environment_run_bindings
|
|
581
|
+
WHERE project_id = ? AND execution_run_id = ? AND relationship = 'execution' AND released_at IS NULL`)
|
|
582
|
+
.all(projectId, authority.execution_run_id);
|
|
583
|
+
for (const binding of bindings) {
|
|
584
|
+
const environment = getExecutionEnvironment(projectId, binding.environment_id);
|
|
585
|
+
if (!environment) {
|
|
586
|
+
db.prepare(`UPDATE execution_environments
|
|
587
|
+
SET retirement_requested_at = COALESCE(retirement_requested_at, CURRENT_TIMESTAMP),
|
|
588
|
+
lifecycle_state = CASE
|
|
589
|
+
WHEN lifecycle_state IN ('retired', 'retiring', 'cleanup_pending') THEN lifecycle_state
|
|
590
|
+
ELSE 'retiring'
|
|
591
|
+
END,
|
|
592
|
+
updated_at = CURRENT_TIMESTAMP
|
|
593
|
+
WHERE project_id = ? AND id = ?`)
|
|
594
|
+
.run(projectId, binding.environment_id);
|
|
595
|
+
db.prepare(`UPDATE execution_environment_run_bindings SET released_at = CURRENT_TIMESTAMP
|
|
596
|
+
WHERE project_id = ? AND environment_id = ? AND execution_run_id = ?
|
|
597
|
+
AND relationship = 'execution' AND released_at IS NULL`)
|
|
598
|
+
.run(projectId, binding.environment_id, authority.execution_run_id);
|
|
599
|
+
continue;
|
|
600
|
+
}
|
|
601
|
+
requestExecutionEnvironmentRetirement({ projectId, environmentId: binding.environment_id });
|
|
602
|
+
appendExecutionEnvironmentEvent({
|
|
603
|
+
projectId,
|
|
604
|
+
environmentId: binding.environment_id,
|
|
605
|
+
eventType: 'execution_run_force_released',
|
|
606
|
+
fromState: environment.lifecycle_state,
|
|
607
|
+
toState: environment.lifecycle_state,
|
|
608
|
+
message,
|
|
609
|
+
metadata: { executionRunId: authority.execution_run_id, forceReleased: true },
|
|
610
|
+
});
|
|
611
|
+
releaseExecutionRunFromEnvironment({
|
|
612
|
+
projectId,
|
|
613
|
+
environmentId: binding.environment_id,
|
|
614
|
+
executionRunId: authority.execution_run_id,
|
|
615
|
+
relationship: 'execution',
|
|
616
|
+
});
|
|
617
|
+
}
|
|
618
|
+
appendLifecycleEvent({
|
|
619
|
+
projectId,
|
|
620
|
+
runId: authority.execution_run_id,
|
|
621
|
+
eventType: 'service_cleanup_abandoned',
|
|
622
|
+
message,
|
|
623
|
+
metadata: { force_released: true, provider_kind: authority.provider_kind },
|
|
624
|
+
});
|
|
625
|
+
db.prepare(`UPDATE service_run_details SET force_released_at = CURRENT_TIMESTAMP,
|
|
626
|
+
cleanup_claim_id = NULL, cleanup_claimed_at = NULL, cleanup_retry_at = NULL,
|
|
627
|
+
cleanup_error_message = ?, updated_at = CURRENT_TIMESTAMP
|
|
628
|
+
WHERE project_id = ? AND execution_run_id = ? AND completed_at IS NULL`)
|
|
629
|
+
.run(message, projectId, authority.execution_run_id);
|
|
630
|
+
completeServiceRun({
|
|
631
|
+
projectId,
|
|
632
|
+
executionRunId: authority.execution_run_id,
|
|
633
|
+
status: 'interrupted',
|
|
634
|
+
code: 'service_cleanup_abandoned',
|
|
635
|
+
message,
|
|
636
|
+
eventType: 'service_run_interrupted',
|
|
637
|
+
});
|
|
638
|
+
return true;
|
|
639
|
+
}).immediate();
|
|
201
640
|
//# sourceMappingURL=serviceRuns.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serviceRuns.js","sourceRoot":"","sources":["../../../server/lib/serviceRuns.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"serviceRuns.js","sourceRoot":"","sources":["../../../server/lib/serviceRuns.ts"],"names":[],"mappings":"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"}
|