@straiffi/archon 1.8.20 → 1.8.22
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-DDE3U1zB.js → ActivityView-CdEPjmqD.js} +1 -1
- package/dist/client/assets/GitHubActionsDialog-CA189pr2.js +1 -0
- package/dist/client/assets/VerificationDialog-BPVkhKRj.js +4 -0
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-oPUmRpZr.js → architectureDiagram-3BPJPVTR-BrZ08mqq.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-0sq1jkkp.js → blockDiagram-GPEHLZMM-b93XwJ6Z.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-BeDxMy7J.js → c4Diagram-AAUBKEIU-BKOdbZ_v.js} +1 -1
- package/dist/client/assets/channel-D0zqzBT_.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-D8VGsje2.js → chunk-2J33WTMH-D7Vxn_1m.js} +1 -1
- package/dist/client/assets/{chunk-3OPIFGDE-DuTUTeBe.js → chunk-3OPIFGDE-B1zo2UZq.js} +1 -1
- package/dist/client/assets/{chunk-5ZQYHXKU-BzX5dPNW.js → chunk-5ZQYHXKU-BajvkDdQ.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-DS9putxN.js → chunk-727SXJPM-CSH7cVpV.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-CWzFZRBv.js → chunk-AQP2D5EJ-DE-wgUNP.js} +1 -1
- package/dist/client/assets/{chunk-CSCIHK7Q-DXZ-ADYW.js → chunk-CSCIHK7Q-Ba7JgCEf.js} +1 -1
- package/dist/client/assets/{chunk-KSCS5N6A-BD7mL3KK.js → chunk-KSCS5N6A-0o3YWkHM.js} +1 -1
- package/dist/client/assets/{chunk-L5ZTLDWV-DmYQi9AP.js → chunk-L5ZTLDWV-DihWczP8.js} +1 -1
- package/dist/client/assets/{chunk-LZXEDZCA-CZyFYHvS.js → chunk-LZXEDZCA-Bxnu-hme.js} +2 -2
- package/dist/client/assets/{chunk-ND2GUHAM-BxdjvT9I.js → chunk-ND2GUHAM-CoaR5kmP.js} +1 -1
- package/dist/client/assets/{chunk-NZK2D7GU-BwuZcZ_9.js → chunk-NZK2D7GU-By92Rd3d.js} +1 -1
- package/dist/client/assets/{chunk-O5CBEL6O-CC-TZXr3.js → chunk-O5CBEL6O-D83Pkgfu.js} +1 -1
- package/dist/client/assets/{chunk-WU5MYG2G-CJZJkca2.js → chunk-WU5MYG2G-v8OVf5Lz.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-ChhyvHH2.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-Cl02kurK.js +1 -0
- package/dist/client/assets/{dagre-BM42HDAG-D2L5RvPF.js → dagre-BM42HDAG-Dq1ALF7Z.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-DBJzxSqZ.js → diagram-2AECGRRQ-1t1_TKtu.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-J_1M-Wou.js → diagram-5GNKFQAL-DtvYRL6f.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-CmT1Vbmc.js → diagram-KO2AKTUF-PRNrSX5F.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-DfPoJyQI.js → diagram-LMA3HP47-DaTX0DhT.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-D4uEb6vo.js → diagram-OG6HWLK6-C2p9p-92.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-l7yIFj0e.js → erDiagram-TEJ5UH35-DKzLtnp-.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-B3caTMes.js → flowDiagram-I6XJVG4X-GdL8lm6e.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-9Am36v9m.js → ganttDiagram-6RSMTGT7-Ok-4XYwT.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-B7OjYsv_.js → gitGraphDiagram-PVQCEYII-DSMrOCK7.js} +1 -1
- package/dist/client/assets/index-Bs8KsdV9.js +276 -0
- package/dist/client/assets/index-DdwM8Wgt.css +2 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-ZAcNejkW.js → infoDiagram-5YYISTIA-Dl4hRXis.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-BaaJwuN0.js → ishikawaDiagram-YF4QCWOH-C1Dc1fTT.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-DjzTU3kM.js → journeyDiagram-JHISSGLW-CUscmJze.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-DYRchzub.js → kanban-definition-UN3LZRKU-C0nwYjQV.js} +1 -1
- package/dist/client/assets/{line-X0j9gj61.js → line-ByiuEIg_.js} +1 -1
- package/dist/client/assets/{mermaid-parser.core-DCKG87Vl.js → mermaid-parser.core-B-XdAyDR.js} +1 -1
- package/dist/client/assets/{mermaid.core-BxI5T2gs.js → mermaid.core-D_bIfuZD.js} +3 -3
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-BE7MZzQO.js → mindmap-definition-RKZ34NQL-BGNiPJDK.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-D3fTYovg.js → pieDiagram-4H26LBE5-CP6FpAoO.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-B35nXRdQ.js → quadrantDiagram-W4KKPZXB-dsAWBAQn.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-CLBcHvP0.js → requirementDiagram-4Y6WPE33-DJH-zHqF.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-DdBCxGHF.js → sankeyDiagram-5OEKKPKP-BJMnZrqH.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-KcLt0X1K.js → sequenceDiagram-3UESZ5HK-CzNjUSlM.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-Bq23ObLK.js → stateDiagram-AJRCARHV-jppMhOwh.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-CLR1WgdV.js +1 -0
- package/dist/client/assets/{timeline-definition-PNZ67QCA-SK3oVUD9.js → timeline-definition-PNZ67QCA-BX2CI5H_.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-COVtAlEC.js → vennDiagram-CIIHVFJN-Bd1KZaXh.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-BvfOOwga.js → wardleyDiagram-YWT4CUSO-D-0BNz49.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-DFnAD9k4.js → xychartDiagram-2RQKCTM6-DbYa0ZWK.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/server/db.js +780 -16
- package/dist/server/db.js.map +1 -1
- package/dist/server/index.js +198 -20
- package/dist/server/index.js.map +1 -1
- package/dist/server/lib/agent.js +8 -4
- package/dist/server/lib/agent.js.map +1 -1
- package/dist/server/lib/agentProvider.js +8 -1
- package/dist/server/lib/agentProvider.js.map +1 -1
- package/dist/server/lib/approvalReconciliation.js +101 -0
- package/dist/server/lib/approvalReconciliation.js.map +1 -0
- package/dist/server/lib/approvalRequests.js +587 -0
- package/dist/server/lib/approvalRequests.js.map +1 -0
- package/dist/server/lib/approvalRoutes.js +143 -0
- package/dist/server/lib/approvalRoutes.js.map +1 -0
- package/dist/server/lib/automationProgression.js +44 -14
- package/dist/server/lib/automationProgression.js.map +1 -1
- package/dist/server/lib/buildCompletionContinuation.js +14 -3
- package/dist/server/lib/buildCompletionContinuation.js.map +1 -1
- package/dist/server/lib/buildExecutionEnvironment.js +350 -66
- package/dist/server/lib/buildExecutionEnvironment.js.map +1 -1
- package/dist/server/lib/buildOpenQuestionOperations.js +47 -3
- package/dist/server/lib/buildOpenQuestionOperations.js.map +1 -1
- package/dist/server/lib/buildSequences.js +267 -18
- package/dist/server/lib/buildSequences.js.map +1 -1
- package/dist/server/lib/buildSetupAuthority.js +138 -0
- package/dist/server/lib/buildSetupAuthority.js.map +1 -0
- package/dist/server/lib/bundleReviewOperations.js +15 -4
- package/dist/server/lib/bundleReviewOperations.js.map +1 -1
- package/dist/server/lib/checkDefinitions.js +29 -1
- package/dist/server/lib/checkDefinitions.js.map +1 -1
- package/dist/server/lib/checkRunner.js +306 -27
- package/dist/server/lib/checkRunner.js.map +1 -1
- package/dist/server/lib/checkRuns.js +4 -2
- package/dist/server/lib/checkRuns.js.map +1 -1
- package/dist/server/lib/consequentialActionAuthority.js +142 -0
- package/dist/server/lib/consequentialActionAuthority.js.map +1 -0
- package/dist/server/lib/consequentialActions.js +231 -0
- package/dist/server/lib/consequentialActions.js.map +1 -0
- package/dist/server/lib/dockerSandboxCredentials.js +64 -10
- package/dist/server/lib/dockerSandboxCredentials.js.map +1 -1
- package/dist/server/lib/dockerSandboxEnvironmentOperations.js +119 -0
- package/dist/server/lib/dockerSandboxEnvironmentOperations.js.map +1 -1
- package/dist/server/lib/dockerSandboxExecutionEnvironment.js +174 -11
- package/dist/server/lib/dockerSandboxExecutionEnvironment.js.map +1 -1
- package/dist/server/lib/dockerSandboxExecutionProvider.js +12 -3
- package/dist/server/lib/dockerSandboxExecutionProvider.js.map +1 -1
- package/dist/server/lib/dockerSandboxNetworkPolicy.js +222 -0
- package/dist/server/lib/dockerSandboxNetworkPolicy.js.map +1 -0
- package/dist/server/lib/executionCredentialCapabilities.js +106 -0
- package/dist/server/lib/executionCredentialCapabilities.js.map +1 -0
- package/dist/server/lib/executionEnvironment.js.map +1 -1
- package/dist/server/lib/executionEnvironmentContexts.js +59 -3
- package/dist/server/lib/executionEnvironmentContexts.js.map +1 -1
- package/dist/server/lib/executionEnvironmentLifecycle.js +34 -0
- package/dist/server/lib/executionEnvironmentLifecycle.js.map +1 -1
- package/dist/server/lib/executionEnvironmentRoutes.js +127 -9
- package/dist/server/lib/executionEnvironmentRoutes.js.map +1 -1
- package/dist/server/lib/executionEnvironmentValidation.js +169 -45
- package/dist/server/lib/executionEnvironmentValidation.js.map +1 -1
- package/dist/server/lib/executionEnvironmentValidationOperations.js +203 -19
- package/dist/server/lib/executionEnvironmentValidationOperations.js.map +1 -1
- package/dist/server/lib/executionEnvironments.js +103 -14
- package/dist/server/lib/executionEnvironments.js.map +1 -1
- package/dist/server/lib/executionProfileRoutes.js +67 -0
- package/dist/server/lib/executionProfileRoutes.js.map +1 -0
- package/dist/server/lib/executionProfileStore.js +117 -0
- package/dist/server/lib/executionProfileStore.js.map +1 -0
- package/dist/server/lib/executionProfiles.js +324 -0
- package/dist/server/lib/executionProfiles.js.map +1 -0
- package/dist/server/lib/executionReconciliation.js +345 -197
- package/dist/server/lib/executionReconciliation.js.map +1 -1
- package/dist/server/lib/executionRetry.js +24 -5
- package/dist/server/lib/executionRetry.js.map +1 -1
- package/dist/server/lib/executionRunAuthority.js +467 -0
- package/dist/server/lib/executionRunAuthority.js.map +1 -0
- package/dist/server/lib/executionRuns.js +30 -4
- package/dist/server/lib/executionRuns.js.map +1 -1
- package/dist/server/lib/executionTimeline.js +2 -1
- package/dist/server/lib/executionTimeline.js.map +1 -1
- package/dist/server/lib/git.js +77 -10
- package/dist/server/lib/git.js.map +1 -1
- package/dist/server/lib/gitPushApprovals.js +367 -0
- package/dist/server/lib/gitPushApprovals.js.map +1 -0
- package/dist/server/lib/hostExecutionEnvironment.js +7 -1
- package/dist/server/lib/hostExecutionEnvironment.js.map +1 -1
- package/dist/server/lib/mobileAccess.js +115 -1
- package/dist/server/lib/mobileAccess.js.map +1 -1
- package/dist/server/lib/productionCheckApprovals.js +106 -0
- package/dist/server/lib/productionCheckApprovals.js.map +1 -0
- package/dist/server/lib/projects.js +1 -0
- package/dist/server/lib/projects.js.map +1 -1
- package/dist/server/lib/run.js +58 -2
- package/dist/server/lib/run.js.map +1 -1
- package/dist/server/lib/ticketFollowUpOperations.js +32 -6
- package/dist/server/lib/ticketFollowUpOperations.js.map +1 -1
- package/dist/server/lib/transcriptRuns.js +3 -0
- package/dist/server/lib/transcriptRuns.js.map +1 -1
- package/dist/server/lib/types.js +40 -0
- package/dist/server/lib/types.js.map +1 -1
- package/dist/server/lib/workspaceProcessEnvironment.js +72 -1
- package/dist/server/lib/workspaceProcessEnvironment.js.map +1 -1
- package/dist/server/workers/build.js +214 -46
- package/dist/server/workers/build.js.map +1 -1
- package/dist/server/workers/followUp.js +74 -1
- package/dist/server/workers/followUp.js.map +1 -1
- package/dist/server/workers/review.js +30 -13
- package/dist/server/workers/review.js.map +1 -1
- package/package.json +1 -1
- package/dist/client/assets/GitHubActionsDialog-CM1z-amZ.js +0 -1
- package/dist/client/assets/VerificationDialog-oHjNllh6.js +0 -4
- package/dist/client/assets/channel-CF8hkOdu.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-D6FiG9_B.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-Bim05ijr.js +0 -1
- package/dist/client/assets/index-CsZfTdMO.css +0 -2
- package/dist/client/assets/index-DDefs3iM.js +0 -275
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-BLzZdVo0.js +0 -1
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
import db from '../db.js';
|
|
2
|
+
import { getExecutionProfileRevision, getActiveExecutionProfileRevision, revisionFingerprintMatchesProfile } from './executionProfileStore.js';
|
|
3
|
+
import { createExecutionProfile, EXECUTION_PROFILE_SCHEMA_VERSION, fingerprintCredentialRequirements, fingerprintExecutionProfile, } from './executionProfiles.js';
|
|
4
|
+
import { hostExecutionEnvironmentObservation } from './hostExecutionEnvironment.js';
|
|
5
|
+
import { normalizeExecutionEnvironmentDestinations, networkDestinationTarget, } from './executionEnvironmentLifecycle.js';
|
|
6
|
+
const MAX_AUTHORITY_BYTES = 16 * 1024;
|
|
7
|
+
export const createExecutionProfileSelection = (projectId, reason = 'project_active_at_acceptance') => {
|
|
8
|
+
const revision = getActiveExecutionProfileRevision(projectId);
|
|
9
|
+
if (!revision) {
|
|
10
|
+
throw new Error('The project has no active execution profile revision');
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
revisionId: revision.id,
|
|
14
|
+
fingerprint: revision.fingerprint,
|
|
15
|
+
reason,
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
export const validateExecutionProfileSelection = (projectId, selection) => {
|
|
19
|
+
const revision = getExecutionProfileRevision(projectId, selection.revisionId);
|
|
20
|
+
if (!revision
|
|
21
|
+
|| revision.fingerprint !== selection.fingerprint
|
|
22
|
+
|| !revisionFingerprintMatchesProfile(revision)) {
|
|
23
|
+
throw new Error('The selected execution profile revision and fingerprint do not match');
|
|
24
|
+
}
|
|
25
|
+
return revision;
|
|
26
|
+
};
|
|
27
|
+
export const executionProfileSelectionMetadata = (selection) => ({
|
|
28
|
+
execution_profile_revision_id: selection.revisionId,
|
|
29
|
+
execution_profile_fingerprint: selection.fingerprint,
|
|
30
|
+
execution_profile_selection_reason: selection.reason,
|
|
31
|
+
});
|
|
32
|
+
export const parseExecutionProfileSelectionMetadata = (metadata) => {
|
|
33
|
+
if (typeof metadata?.execution_profile_revision_id !== 'string'
|
|
34
|
+
|| typeof metadata.execution_profile_fingerprint !== 'string'
|
|
35
|
+
|| (metadata.execution_profile_selection_reason !== 'project_active_at_acceptance'
|
|
36
|
+
&& metadata.execution_profile_selection_reason !== 'historical_lineage')) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
revisionId: metadata.execution_profile_revision_id,
|
|
41
|
+
fingerprint: metadata.execution_profile_fingerprint,
|
|
42
|
+
reason: metadata.execution_profile_selection_reason,
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
export const getHistoricalBuildExecutionProfileSelection = (projectId, ticketId) => {
|
|
46
|
+
const row = db.prepare(`
|
|
47
|
+
SELECT run.metadata_json
|
|
48
|
+
FROM execution_runs run
|
|
49
|
+
JOIN execution_run_links ticket_link
|
|
50
|
+
ON ticket_link.execution_run_id = run.id
|
|
51
|
+
AND ticket_link.project_id = run.project_id
|
|
52
|
+
AND ticket_link.entity_type = 'ticket'
|
|
53
|
+
AND ticket_link.entity_id = ?
|
|
54
|
+
AND ticket_link.relationship = 'primary'
|
|
55
|
+
WHERE run.project_id = ? AND run.kind = 'build'
|
|
56
|
+
ORDER BY run.created_at DESC, run.id DESC
|
|
57
|
+
LIMIT 1
|
|
58
|
+
`).get(ticketId, projectId);
|
|
59
|
+
let metadata = null;
|
|
60
|
+
try {
|
|
61
|
+
metadata = row?.metadata_json ? JSON.parse(row.metadata_json) : null;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
metadata = null;
|
|
65
|
+
}
|
|
66
|
+
const selection = parseExecutionProfileSelectionMetadata(metadata);
|
|
67
|
+
if (!selection) {
|
|
68
|
+
throw new Error('The resumed Build has no historical execution profile lineage');
|
|
69
|
+
}
|
|
70
|
+
const historicalSelection = {
|
|
71
|
+
revisionId: selection.revisionId,
|
|
72
|
+
fingerprint: selection.fingerprint,
|
|
73
|
+
reason: 'historical_lineage',
|
|
74
|
+
};
|
|
75
|
+
validateExecutionProfileSelection(projectId, historicalSelection);
|
|
76
|
+
return historicalSelection;
|
|
77
|
+
};
|
|
78
|
+
const historicalSelectionFromMetadata = (projectId, metadataJson) => {
|
|
79
|
+
let metadata = null;
|
|
80
|
+
try {
|
|
81
|
+
metadata = metadataJson ? JSON.parse(metadataJson) : null;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
metadata = null;
|
|
85
|
+
}
|
|
86
|
+
const selection = parseExecutionProfileSelectionMetadata(metadata);
|
|
87
|
+
if (!selection) {
|
|
88
|
+
throw new Error('The resumed Build has no historical execution profile lineage');
|
|
89
|
+
}
|
|
90
|
+
const historicalSelection = { ...selection, reason: 'historical_lineage' };
|
|
91
|
+
validateExecutionProfileSelection(projectId, historicalSelection);
|
|
92
|
+
return historicalSelection;
|
|
93
|
+
};
|
|
94
|
+
export const getHistoricalBuildExecutionProfileSelectionForRun = (projectId, executionRunId) => {
|
|
95
|
+
const row = db.prepare(`
|
|
96
|
+
SELECT metadata_json FROM execution_runs
|
|
97
|
+
WHERE project_id = ? AND id = ? AND kind IN ('build', 'build_follow_up')
|
|
98
|
+
`).get(projectId, executionRunId);
|
|
99
|
+
return historicalSelectionFromMetadata(projectId, row?.metadata_json);
|
|
100
|
+
};
|
|
101
|
+
export const getHistoricalBuildExecutionProfileSelectionForSession = (projectId, ticketId, sessionId) => {
|
|
102
|
+
const row = db.prepare(`
|
|
103
|
+
SELECT run.metadata_json
|
|
104
|
+
FROM execution_runs run
|
|
105
|
+
JOIN agent_runs agent_run
|
|
106
|
+
ON agent_run.execution_run_id = run.id
|
|
107
|
+
AND agent_run.parent_type = 'ticket'
|
|
108
|
+
AND agent_run.parent_id = ?
|
|
109
|
+
AND agent_run.role = 'main'
|
|
110
|
+
AND agent_run.session_id = ?
|
|
111
|
+
WHERE run.project_id = ? AND run.kind IN ('build', 'build_follow_up')
|
|
112
|
+
ORDER BY run.created_at DESC, run.id DESC
|
|
113
|
+
LIMIT 1
|
|
114
|
+
`).get(ticketId, sessionId, projectId);
|
|
115
|
+
return historicalSelectionFromMetadata(projectId, row?.metadata_json);
|
|
116
|
+
};
|
|
117
|
+
const parseRunMetadata = (value) => {
|
|
118
|
+
if (!value) {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
return JSON.parse(value);
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
export const resolveExecutionRunProfile = (project, executionRunId) => {
|
|
129
|
+
const run = db.prepare(`
|
|
130
|
+
SELECT metadata_json FROM execution_runs WHERE id = ? AND project_id = ?
|
|
131
|
+
`).get(executionRunId, project.id);
|
|
132
|
+
if (!run || 'status' in run) {
|
|
133
|
+
const profile = createExecutionProfile(project.build_execution_provider ?? 'host');
|
|
134
|
+
return {
|
|
135
|
+
id: `legacy-provider-projection:${project.id}`,
|
|
136
|
+
project_id: project.id,
|
|
137
|
+
revision: 0,
|
|
138
|
+
schema_version: EXECUTION_PROFILE_SCHEMA_VERSION,
|
|
139
|
+
fingerprint: fingerprintExecutionProfile(profile),
|
|
140
|
+
profile,
|
|
141
|
+
created_at: '',
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
const metadata = parseRunMetadata(run?.metadata_json ?? null);
|
|
145
|
+
const revisionId = typeof metadata?.execution_profile_revision_id === 'string'
|
|
146
|
+
? metadata.execution_profile_revision_id
|
|
147
|
+
: null;
|
|
148
|
+
if (revisionId) {
|
|
149
|
+
const selected = getExecutionProfileRevision(project.id, revisionId);
|
|
150
|
+
if (!selected) {
|
|
151
|
+
throw new Error('The selected execution profile revision is unavailable');
|
|
152
|
+
}
|
|
153
|
+
if (!revisionFingerprintMatchesProfile(selected)) {
|
|
154
|
+
throw new Error('The selected execution profile fingerprint is invalid');
|
|
155
|
+
}
|
|
156
|
+
return selected;
|
|
157
|
+
}
|
|
158
|
+
// Old queued runs can predate profile selection. Their provider projection is retained as explicit compatibility evidence.
|
|
159
|
+
const provider = metadata?.build_execution_provider;
|
|
160
|
+
if (provider !== 'host' && provider !== 'docker_sandbox') {
|
|
161
|
+
throw new Error('The queued Build has no immutable execution profile or provider projection');
|
|
162
|
+
}
|
|
163
|
+
const profile = createExecutionProfile(provider);
|
|
164
|
+
return {
|
|
165
|
+
id: `legacy-provider-projection:${project.id}`,
|
|
166
|
+
project_id: project.id,
|
|
167
|
+
revision: 0,
|
|
168
|
+
schema_version: EXECUTION_PROFILE_SCHEMA_VERSION,
|
|
169
|
+
fingerprint: fingerprintExecutionProfile(profile),
|
|
170
|
+
profile,
|
|
171
|
+
created_at: '',
|
|
172
|
+
};
|
|
173
|
+
};
|
|
174
|
+
const SBX_POLICY_INIT_REMEDIATION = 'Initialize a scoped Docker Sandbox network posture with sbx policy init, then retry Build.';
|
|
175
|
+
export const resolveExecutionRunNetworkAuthority = (input) => {
|
|
176
|
+
const requestedMode = input.profile.network.mode;
|
|
177
|
+
const observedGlobalPosture = input.evidence?.observed_global_posture ?? 'unknown';
|
|
178
|
+
const destinations = [...(input.evidence?.destination_decisions ?? [])];
|
|
179
|
+
const base = {
|
|
180
|
+
requested_mode: requestedMode,
|
|
181
|
+
observed_global_posture: observedGlobalPosture,
|
|
182
|
+
destinations,
|
|
183
|
+
};
|
|
184
|
+
if (input.provider === 'host') {
|
|
185
|
+
if (requestedMode === 'allowlist') {
|
|
186
|
+
return {
|
|
187
|
+
...base,
|
|
188
|
+
enforcement: 'unknown',
|
|
189
|
+
note: null,
|
|
190
|
+
degradations: ['network_enforcement_unsupported'],
|
|
191
|
+
violation: 'The selected execution profile requests allowlisted network enforcement, '
|
|
192
|
+
+ 'but the host provider cannot enforce sandbox network policy. '
|
|
193
|
+
+ `Select a Docker Sandbox provider for this project. ${SBX_POLICY_INIT_REMEDIATION}`,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
return {
|
|
197
|
+
...base,
|
|
198
|
+
enforcement: 'none',
|
|
199
|
+
note: input.profile.compatibility === 'legacy_host' ? 'legacy_host_inherited' : null,
|
|
200
|
+
degradations: [],
|
|
201
|
+
violation: null,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
if (input.profile.compatibility === 'legacy_host') {
|
|
205
|
+
return {
|
|
206
|
+
...base,
|
|
207
|
+
enforcement: 'none',
|
|
208
|
+
note: 'legacy_host_inherited',
|
|
209
|
+
degradations: [],
|
|
210
|
+
violation: null,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
const requestedTargets = new Set(normalizeExecutionEnvironmentDestinations(input.profile.network.destinations).map(networkDestinationTarget));
|
|
214
|
+
const allowedEvidenceTargets = new Set(destinations.filter(decision => decision.decision === 'allow').map(decision => decision.target));
|
|
215
|
+
const allDestinationsAllowed = requestedTargets.size > 0
|
|
216
|
+
&& [...requestedTargets].every(target => allowedEvidenceTargets.has(target));
|
|
217
|
+
const enforcement = observedGlobalPosture === 'allow_all'
|
|
218
|
+
? 'declarative_only'
|
|
219
|
+
: observedGlobalPosture === 'deny_all' && allDestinationsAllowed
|
|
220
|
+
? 'enforced_scoped'
|
|
221
|
+
: 'unknown';
|
|
222
|
+
const degradations = enforcement === 'declarative_only'
|
|
223
|
+
? ['network_enforcement_declarative_only']
|
|
224
|
+
: enforcement === 'unknown'
|
|
225
|
+
? ['network_enforcement_unknown']
|
|
226
|
+
: [];
|
|
227
|
+
let violation = null;
|
|
228
|
+
if (requestedMode === 'allowlist' && enforcement !== 'enforced_scoped') {
|
|
229
|
+
const unproven = destinations
|
|
230
|
+
.filter(decision => decision.decision !== 'allow')
|
|
231
|
+
.map(decision => decision.decision === 'deny'
|
|
232
|
+
? `${decision.target} was denied by the sandbox daemon`
|
|
233
|
+
: `${decision.target} could not be evaluated by the sandbox daemon`);
|
|
234
|
+
const detail = unproven.length > 0
|
|
235
|
+
? `${unproven.join('; ')}.`
|
|
236
|
+
: observedGlobalPosture === 'allow_all'
|
|
237
|
+
? 'The Docker Sandbox global posture is allow-all, so scoped allowlist access is declarative only.'
|
|
238
|
+
: 'Qualified scoped network posture evidence is unavailable.';
|
|
239
|
+
violation = `The selected execution profile requests allowlisted network enforcement, but it was not proven. ${detail} ${SBX_POLICY_INIT_REMEDIATION}`;
|
|
240
|
+
}
|
|
241
|
+
return {
|
|
242
|
+
...base,
|
|
243
|
+
enforcement,
|
|
244
|
+
note: null,
|
|
245
|
+
degradations,
|
|
246
|
+
violation,
|
|
247
|
+
};
|
|
248
|
+
};
|
|
249
|
+
export const createExecutionRunAuthority = (input) => {
|
|
250
|
+
const { profile } = input.profileRevision;
|
|
251
|
+
const modelProvider = input.modelProvider ?? null;
|
|
252
|
+
if (!profile.build_eligible) {
|
|
253
|
+
throw new Error('The selected execution profile is not eligible for Build workloads');
|
|
254
|
+
}
|
|
255
|
+
if (input.provider === 'host' && profile.isolation === 'microvm_required') {
|
|
256
|
+
throw new Error('The selected execution profile requires microVM isolation');
|
|
257
|
+
}
|
|
258
|
+
const requirements = profile.credential_requirements.filter(requirement => (requirement.agent === input.agent
|
|
259
|
+
&& requirement.model_provider === modelProvider
|
|
260
|
+
&& (!input.credentialCapability?.authentication_mode
|
|
261
|
+
|| requirement.authentication_mode === input.credentialCapability.authentication_mode)));
|
|
262
|
+
if (input.provider === 'host' && profile.compatibility === 'governed' && requirements.length > 0) {
|
|
263
|
+
throw new Error('Governed host execution cannot inherit ambient host credentials');
|
|
264
|
+
}
|
|
265
|
+
const unsupportedRequirement = requirements.find(requirement => (input.provider === 'host'
|
|
266
|
+
? requirement.required_protection !== 'legacy_host_inheritance'
|
|
267
|
+
: requirement.required_protection !== 'docker_brokered'));
|
|
268
|
+
if (unsupportedRequirement) {
|
|
269
|
+
throw new Error(`The selected provider cannot satisfy credential requirement ${unsupportedRequirement.id}`);
|
|
270
|
+
}
|
|
271
|
+
if (input.provider === 'docker_sandbox' && requirements.length > 0) {
|
|
272
|
+
const capability = input.credentialCapability;
|
|
273
|
+
const requirement = requirements[0];
|
|
274
|
+
if (!capability
|
|
275
|
+
|| capability.agent !== input.agent
|
|
276
|
+
|| capability.model_provider !== modelProvider
|
|
277
|
+
|| capability.authentication_mode !== requirement.authentication_mode
|
|
278
|
+
|| capability.requested_protection !== requirement.required_protection
|
|
279
|
+
|| capability.requirement_fingerprint !== fingerprintCredentialRequirements(profile.credential_requirements)
|
|
280
|
+
|| capability.destination.state !== 'usable'
|
|
281
|
+
|| !capability.satisfies_requested_protection) {
|
|
282
|
+
throw new Error(`Validated credential evidence does not satisfy requirement ${requirement.id}`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
const isHost = input.provider === 'host';
|
|
286
|
+
const network = resolveExecutionRunNetworkAuthority({
|
|
287
|
+
profile,
|
|
288
|
+
provider: input.provider,
|
|
289
|
+
evidence: input.networkEvidence ?? null,
|
|
290
|
+
});
|
|
291
|
+
if (network.violation) {
|
|
292
|
+
throw new Error(network.violation);
|
|
293
|
+
}
|
|
294
|
+
return {
|
|
295
|
+
schema_version: 1,
|
|
296
|
+
selected_profile: {
|
|
297
|
+
revision_id: input.profileRevision.id,
|
|
298
|
+
revision: input.profileRevision.revision,
|
|
299
|
+
fingerprint: input.profileRevision.fingerprint,
|
|
300
|
+
compatibility: profile.compatibility,
|
|
301
|
+
},
|
|
302
|
+
orchestration: {
|
|
303
|
+
host_disclosure: isHost ? 'host_orchestration_and_execution' : 'worktree_and_sync_only',
|
|
304
|
+
},
|
|
305
|
+
setup: {
|
|
306
|
+
placement: input.provider,
|
|
307
|
+
lineage: 'selected_profile',
|
|
308
|
+
launcher: isHost ? 'host_shell' : 'docker_sandbox_exec',
|
|
309
|
+
},
|
|
310
|
+
agent: {
|
|
311
|
+
placement: input.provider,
|
|
312
|
+
agent: input.agent,
|
|
313
|
+
launcher: isHost ? 'host_process' : 'docker_sandbox_exec',
|
|
314
|
+
},
|
|
315
|
+
runtime_credentials: requirements.map(requirement => ({
|
|
316
|
+
requirement_id: requirement.id,
|
|
317
|
+
model_provider: requirement.model_provider,
|
|
318
|
+
authentication_mode: requirement.authentication_mode,
|
|
319
|
+
delivery: isHost ? 'host_environment_inheritance' : 'docker_brokered',
|
|
320
|
+
...(input.credentialCapability ? { capability: input.credentialCapability } : {}),
|
|
321
|
+
})),
|
|
322
|
+
unsupported_requirements: [],
|
|
323
|
+
target: {
|
|
324
|
+
kind: input.target.identity.kind,
|
|
325
|
+
key: input.target.identity.key,
|
|
326
|
+
workspace_path: input.target.workspacePath,
|
|
327
|
+
},
|
|
328
|
+
effective: {
|
|
329
|
+
provider: input.provider,
|
|
330
|
+
isolation: isHost ? 'host_process' : 'microvm',
|
|
331
|
+
filesystem: {
|
|
332
|
+
workspace_access: profile.workspace_access.mode,
|
|
333
|
+
workspace_path: input.target.workspacePath,
|
|
334
|
+
additional_mounts: [],
|
|
335
|
+
},
|
|
336
|
+
integration_access: profile.integration_access,
|
|
337
|
+
remote_git: profile.remote_git,
|
|
338
|
+
resources: profile.resources,
|
|
339
|
+
environment_id: input.environment?.id ?? null,
|
|
340
|
+
environment_revision: input.environment?.environment_revision ?? null,
|
|
341
|
+
environment_validation_fingerprint: input.environment?.environment_validation_fingerprint ?? null,
|
|
342
|
+
execution_profile_fingerprint: input.profileRevision.fingerprint,
|
|
343
|
+
credential_requirements_fingerprint: fingerprintCredentialRequirements(profile.credential_requirements),
|
|
344
|
+
network: {
|
|
345
|
+
requested_mode: network.requested_mode,
|
|
346
|
+
observed_global_posture: network.observed_global_posture,
|
|
347
|
+
enforcement: network.enforcement,
|
|
348
|
+
note: network.note,
|
|
349
|
+
destinations: network.destinations,
|
|
350
|
+
},
|
|
351
|
+
},
|
|
352
|
+
degradations: [
|
|
353
|
+
...(isHost
|
|
354
|
+
? [...hostExecutionEnvironmentObservation.degradationReasons]
|
|
355
|
+
: input.environment?.workspace_mode === 'direct' ? ['direct_workspace_writable'] : []),
|
|
356
|
+
...network.degradations,
|
|
357
|
+
],
|
|
358
|
+
fallback: {
|
|
359
|
+
policy: profile.fallback,
|
|
360
|
+
used: input.fallback?.used ?? false,
|
|
361
|
+
from: input.fallback?.from ?? null,
|
|
362
|
+
reason: input.fallback?.reason ?? null,
|
|
363
|
+
},
|
|
364
|
+
};
|
|
365
|
+
};
|
|
366
|
+
const credentialDeliveryForClassification = (classification) => {
|
|
367
|
+
if (classification === 'brokered_api_key' || classification === 'brokered_oauth') {
|
|
368
|
+
return 'docker_brokered';
|
|
369
|
+
}
|
|
370
|
+
if (classification === 'legacy_host_inherited') {
|
|
371
|
+
return 'legacy_host_inherited';
|
|
372
|
+
}
|
|
373
|
+
return null;
|
|
374
|
+
};
|
|
375
|
+
export const resolveEnvironmentCredentialEvidence = (input) => {
|
|
376
|
+
const profile = input.profileRevision?.profile ?? null;
|
|
377
|
+
if (!profile) {
|
|
378
|
+
return {
|
|
379
|
+
authentication_mode: 'unknown',
|
|
380
|
+
credential_delivery: 'unknown',
|
|
381
|
+
degradation_reasons: ['credential_evidence_unresolved'],
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
const requirements = profile.credential_requirements.filter(requirement => (requirement.agent === input.agent
|
|
385
|
+
&& (!input.modelProvider || requirement.model_provider === input.modelProvider)));
|
|
386
|
+
const capability = input.credentialCapability ?? null;
|
|
387
|
+
const requirement = requirements[0] ?? null;
|
|
388
|
+
const authenticationMode = capability?.authentication_mode
|
|
389
|
+
?? requirement?.authentication_mode
|
|
390
|
+
?? null;
|
|
391
|
+
if (requirements.length === 0 || profile.compatibility === 'legacy_host') {
|
|
392
|
+
return {
|
|
393
|
+
authentication_mode: authenticationMode ?? 'unknown',
|
|
394
|
+
credential_delivery: profile.compatibility === 'legacy_host'
|
|
395
|
+
? 'legacy_host_inherited'
|
|
396
|
+
: 'none_required',
|
|
397
|
+
degradation_reasons: authenticationMode ? [] : ['credential_authentication_unresolved'],
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
const delivery = capability && requirement
|
|
401
|
+
&& capability.agent === input.agent
|
|
402
|
+
&& (!input.modelProvider || capability.model_provider === input.modelProvider)
|
|
403
|
+
&& capability.authentication_mode === requirement.authentication_mode
|
|
404
|
+
&& capability.requested_protection === requirement.required_protection
|
|
405
|
+
&& capability.requirement_fingerprint === fingerprintCredentialRequirements(profile.credential_requirements)
|
|
406
|
+
&& capability.destination.state === 'usable'
|
|
407
|
+
&& capability.satisfies_requested_protection
|
|
408
|
+
? credentialDeliveryForClassification(capability.classification)
|
|
409
|
+
: null;
|
|
410
|
+
if (!delivery) {
|
|
411
|
+
return {
|
|
412
|
+
authentication_mode: authenticationMode ?? 'unknown',
|
|
413
|
+
credential_delivery: 'unknown',
|
|
414
|
+
degradation_reasons: ['credential_delivery_unresolved'],
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
return {
|
|
418
|
+
authentication_mode: authenticationMode,
|
|
419
|
+
credential_delivery: delivery,
|
|
420
|
+
degradation_reasons: [],
|
|
421
|
+
};
|
|
422
|
+
};
|
|
423
|
+
const parseAuthority = (row) => {
|
|
424
|
+
try {
|
|
425
|
+
const parsed = JSON.parse(row.authority_json);
|
|
426
|
+
return parsed.schema_version === 1 && parsed.selected_profile?.fingerprint === row.execution_profile_fingerprint
|
|
427
|
+
? parsed
|
|
428
|
+
: null;
|
|
429
|
+
}
|
|
430
|
+
catch {
|
|
431
|
+
return null;
|
|
432
|
+
}
|
|
433
|
+
};
|
|
434
|
+
export const persistExecutionRunAuthority = (input) => {
|
|
435
|
+
if (input.authority.selected_profile.revision_id !== input.profileRevision.id
|
|
436
|
+
|| input.authority.selected_profile.revision !== input.profileRevision.revision
|
|
437
|
+
|| input.authority.selected_profile.fingerprint !== input.profileRevision.fingerprint
|
|
438
|
+
|| input.authority.effective.execution_profile_fingerprint !== input.profileRevision.fingerprint
|
|
439
|
+
|| fingerprintExecutionProfile(input.profileRevision.profile) !== input.profileRevision.fingerprint) {
|
|
440
|
+
throw new Error('Execution run authority does not match its selected execution profile revision');
|
|
441
|
+
}
|
|
442
|
+
const serialized = JSON.stringify(input.authority);
|
|
443
|
+
if (Buffer.byteLength(serialized, 'utf8') > MAX_AUTHORITY_BYTES) {
|
|
444
|
+
throw new Error('Execution run authority exceeds the durable evidence limit');
|
|
445
|
+
}
|
|
446
|
+
const existing = getExecutionRunAuthority(input.projectId, input.executionRunId);
|
|
447
|
+
if (existing) {
|
|
448
|
+
if (JSON.stringify(existing) !== serialized) {
|
|
449
|
+
throw new Error('Conflicting immutable execution run authority already exists');
|
|
450
|
+
}
|
|
451
|
+
return existing;
|
|
452
|
+
}
|
|
453
|
+
db.prepare(`
|
|
454
|
+
INSERT INTO execution_run_authorities (
|
|
455
|
+
execution_run_id, project_id, execution_profile_revision_id,
|
|
456
|
+
execution_profile_fingerprint, authority_json
|
|
457
|
+
) VALUES (?, ?, ?, ?, ?)
|
|
458
|
+
`).run(input.executionRunId, input.projectId, input.profileRevision.id, input.profileRevision.fingerprint, serialized);
|
|
459
|
+
return input.authority;
|
|
460
|
+
};
|
|
461
|
+
export const getExecutionRunAuthority = (projectId, executionRunId) => {
|
|
462
|
+
const row = db.prepare(`
|
|
463
|
+
SELECT * FROM execution_run_authorities WHERE project_id = ? AND execution_run_id = ?
|
|
464
|
+
`).get(projectId, executionRunId);
|
|
465
|
+
return row ? parseAuthority(row) : null;
|
|
466
|
+
};
|
|
467
|
+
//# sourceMappingURL=executionRunAuthority.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executionRunAuthority.js","sourceRoot":"","sources":["../../../server/lib/executionRunAuthority.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,7 @@ const GENERIC_RETRY_DENIED_KINDS = new Set([
|
|
|
19
19
|
'automation_commit',
|
|
20
20
|
'automation_push',
|
|
21
21
|
'automation_pull_request',
|
|
22
|
+
'git_push',
|
|
22
23
|
]);
|
|
23
24
|
const ARTIFACT_AUDIT_EVENT_TYPES = new Set([
|
|
24
25
|
'artifact_created',
|
|
@@ -141,7 +142,7 @@ const updateRunStatement = db.prepare(`
|
|
|
141
142
|
UPDATE execution_runs
|
|
142
143
|
SET status = ?, domain_status = ?, failure_code = ?, failure_message = ?,
|
|
143
144
|
failure_details_json = ?, started_at = ?, completed_at = ?, updated_at = ?
|
|
144
|
-
WHERE id = ? AND project_id = ?
|
|
145
|
+
WHERE id = ? AND project_id = ? AND status = ? AND domain_status IS ?
|
|
145
146
|
`);
|
|
146
147
|
const assertBoundedString = (value, name, maxLength) => {
|
|
147
148
|
if (value !== null && value !== undefined && value.length > maxLength) {
|
|
@@ -331,6 +332,9 @@ const PUBLIC_EVENT_METADATA_KEYS = new Set([
|
|
|
331
332
|
'resolution_attempts',
|
|
332
333
|
'trigger',
|
|
333
334
|
'workflow_id',
|
|
335
|
+
'approval_request_id',
|
|
336
|
+
'action_kind',
|
|
337
|
+
'action_fingerprint',
|
|
334
338
|
]);
|
|
335
339
|
export const toCanonicalLifecycleEvent = (event) => {
|
|
336
340
|
const metadata = event.metadata
|
|
@@ -447,6 +451,12 @@ const resolveLinkLabel = (projectId, link) => {
|
|
|
447
451
|
`).get(link.entityId, projectId);
|
|
448
452
|
return row ? `Pull request #${row.pr_number}` : null;
|
|
449
453
|
}
|
|
454
|
+
if (link.entityType === 'approval_request') {
|
|
455
|
+
const row = db.prepare(`
|
|
456
|
+
SELECT action_kind FROM approval_requests WHERE id = ? AND project_id = ?
|
|
457
|
+
`).get(link.entityId, projectId);
|
|
458
|
+
return row ? `${row.action_kind} approval` : null;
|
|
459
|
+
}
|
|
450
460
|
return null;
|
|
451
461
|
};
|
|
452
462
|
const resolveLinkOwner = (projectId, link) => {
|
|
@@ -542,6 +552,10 @@ const resolveLinkOwner = (projectId, link) => {
|
|
|
542
552
|
`).get(link.entityId, projectId);
|
|
543
553
|
return row ? { parentEntityType: 'bundle', parentEntityId: row.parent_id } : null;
|
|
544
554
|
}
|
|
555
|
+
case 'approval_request':
|
|
556
|
+
return db.prepare('SELECT 1 FROM approval_requests WHERE id = ? AND project_id = ?').get(link.entityId, projectId)
|
|
557
|
+
? { parentEntityType: null, parentEntityId: null }
|
|
558
|
+
: null;
|
|
545
559
|
}
|
|
546
560
|
};
|
|
547
561
|
const assertLinkOwnership = (projectId, link) => {
|
|
@@ -987,10 +1001,11 @@ const transitionExecutionRunInTransaction = (input, allowAmbiguousAutomationReco
|
|
|
987
1001
|
}
|
|
988
1002
|
return { run: serializeRun(current), event: null };
|
|
989
1003
|
}
|
|
990
|
-
|
|
1004
|
+
const isDomainOnlyTransition = current.status === input.status && current.domain_status !== domainStatus;
|
|
1005
|
+
if (current.status === input.status && !isDomainOnlyTransition) {
|
|
991
1006
|
throw new Error(`Execution run ${input.runId} is already ${input.status}`);
|
|
992
1007
|
}
|
|
993
|
-
if (ACTIVE_STATUSES.has(input.status)) {
|
|
1008
|
+
if (ACTIVE_STATUSES.has(input.status) && !isDomainOnlyTransition) {
|
|
994
1009
|
const activeTransitionAllowed = (current.status === 'queued' && (input.status === 'running' || input.status === 'waiting'))
|
|
995
1010
|
|| (current.status === 'running' && input.status === 'waiting')
|
|
996
1011
|
|| (current.status === 'waiting' && input.status === 'running');
|
|
@@ -1004,7 +1019,10 @@ const transitionExecutionRunInTransaction = (input, allowAmbiguousAutomationReco
|
|
|
1004
1019
|
const now = new Date().toISOString();
|
|
1005
1020
|
const completedAt = TERMINAL_STATUSES.has(input.status) ? input.completedAt ?? now : null;
|
|
1006
1021
|
const startedAt = input.status === 'running' ? current.started_at ?? now : current.started_at;
|
|
1007
|
-
updateRunStatement.run(input.status, domainStatus, failure?.code ?? null, failure?.message ?? null, failureDetailsJson, startedAt, completedAt, now, input.runId, input.projectId);
|
|
1022
|
+
const updated = updateRunStatement.run(input.status, domainStatus, failure?.code ?? null, failure?.message ?? null, failureDetailsJson, startedAt, completedAt, now, input.runId, input.projectId, current.status, current.domain_status);
|
|
1023
|
+
if (updated.changes !== 1) {
|
|
1024
|
+
throw new Error(`Execution run ${input.runId} changed concurrently`);
|
|
1025
|
+
}
|
|
1008
1026
|
const event = createEvent({
|
|
1009
1027
|
projectId: input.projectId,
|
|
1010
1028
|
runId: input.runId,
|
|
@@ -1249,6 +1267,10 @@ export const getQueuedBuildExecutionRun = (projectId, ticketId, sequenceId) => {
|
|
|
1249
1267
|
AND sequence_link.project_id = execution_runs.project_id
|
|
1250
1268
|
AND sequence_link.entity_type = 'build_sequence'
|
|
1251
1269
|
AND sequence_link.relationship = 'context'
|
|
1270
|
+
INNER JOIN build_sequence_tickets sequence_item
|
|
1271
|
+
ON sequence_item.build_sequence_id = sequence_link.entity_id
|
|
1272
|
+
AND sequence_item.ticket_id = ticket_link.entity_id
|
|
1273
|
+
AND sequence_item.activation_execution_run_id = execution_runs.id
|
|
1252
1274
|
WHERE execution_runs.project_id = ?
|
|
1253
1275
|
AND execution_runs.kind = 'build'
|
|
1254
1276
|
AND execution_runs.status = 'queued'
|
|
@@ -1479,6 +1501,10 @@ export const listExecutionRuns = (input) => {
|
|
|
1479
1501
|
clauses.push(`er.status IN (${statuses.map(() => '?').join(', ')})`);
|
|
1480
1502
|
parameters.push(...statuses);
|
|
1481
1503
|
}
|
|
1504
|
+
if (input.domainStatus) {
|
|
1505
|
+
clauses.push('er.domain_status = ?');
|
|
1506
|
+
parameters.push(input.domainStatus);
|
|
1507
|
+
}
|
|
1482
1508
|
if (cursor) {
|
|
1483
1509
|
clauses.push('(er.created_at < ? OR (er.created_at = ? AND er.id < ?))');
|
|
1484
1510
|
parameters.push(cursor.created_at, cursor.created_at, cursor.id);
|