@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.
Files changed (170) hide show
  1. package/dist/client/assets/{ActivityView-DDE3U1zB.js → ActivityView-CdEPjmqD.js} +1 -1
  2. package/dist/client/assets/GitHubActionsDialog-CA189pr2.js +1 -0
  3. package/dist/client/assets/VerificationDialog-BPVkhKRj.js +4 -0
  4. package/dist/client/assets/{architectureDiagram-3BPJPVTR-oPUmRpZr.js → architectureDiagram-3BPJPVTR-BrZ08mqq.js} +1 -1
  5. package/dist/client/assets/{blockDiagram-GPEHLZMM-0sq1jkkp.js → blockDiagram-GPEHLZMM-b93XwJ6Z.js} +1 -1
  6. package/dist/client/assets/{c4Diagram-AAUBKEIU-BeDxMy7J.js → c4Diagram-AAUBKEIU-BKOdbZ_v.js} +1 -1
  7. package/dist/client/assets/channel-D0zqzBT_.js +1 -0
  8. package/dist/client/assets/{chunk-2J33WTMH-D8VGsje2.js → chunk-2J33WTMH-D7Vxn_1m.js} +1 -1
  9. package/dist/client/assets/{chunk-3OPIFGDE-DuTUTeBe.js → chunk-3OPIFGDE-B1zo2UZq.js} +1 -1
  10. package/dist/client/assets/{chunk-5ZQYHXKU-BzX5dPNW.js → chunk-5ZQYHXKU-BajvkDdQ.js} +1 -1
  11. package/dist/client/assets/{chunk-727SXJPM-DS9putxN.js → chunk-727SXJPM-CSH7cVpV.js} +1 -1
  12. package/dist/client/assets/{chunk-AQP2D5EJ-CWzFZRBv.js → chunk-AQP2D5EJ-DE-wgUNP.js} +1 -1
  13. package/dist/client/assets/{chunk-CSCIHK7Q-DXZ-ADYW.js → chunk-CSCIHK7Q-Ba7JgCEf.js} +1 -1
  14. package/dist/client/assets/{chunk-KSCS5N6A-BD7mL3KK.js → chunk-KSCS5N6A-0o3YWkHM.js} +1 -1
  15. package/dist/client/assets/{chunk-L5ZTLDWV-DmYQi9AP.js → chunk-L5ZTLDWV-DihWczP8.js} +1 -1
  16. package/dist/client/assets/{chunk-LZXEDZCA-CZyFYHvS.js → chunk-LZXEDZCA-Bxnu-hme.js} +2 -2
  17. package/dist/client/assets/{chunk-ND2GUHAM-BxdjvT9I.js → chunk-ND2GUHAM-CoaR5kmP.js} +1 -1
  18. package/dist/client/assets/{chunk-NZK2D7GU-BwuZcZ_9.js → chunk-NZK2D7GU-By92Rd3d.js} +1 -1
  19. package/dist/client/assets/{chunk-O5CBEL6O-CC-TZXr3.js → chunk-O5CBEL6O-D83Pkgfu.js} +1 -1
  20. package/dist/client/assets/{chunk-WU5MYG2G-CJZJkca2.js → chunk-WU5MYG2G-v8OVf5Lz.js} +1 -1
  21. package/dist/client/assets/classDiagram-4FO5ZUOK-ChhyvHH2.js +1 -0
  22. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-Cl02kurK.js +1 -0
  23. package/dist/client/assets/{dagre-BM42HDAG-D2L5RvPF.js → dagre-BM42HDAG-Dq1ALF7Z.js} +1 -1
  24. package/dist/client/assets/{diagram-2AECGRRQ-DBJzxSqZ.js → diagram-2AECGRRQ-1t1_TKtu.js} +1 -1
  25. package/dist/client/assets/{diagram-5GNKFQAL-J_1M-Wou.js → diagram-5GNKFQAL-DtvYRL6f.js} +1 -1
  26. package/dist/client/assets/{diagram-KO2AKTUF-CmT1Vbmc.js → diagram-KO2AKTUF-PRNrSX5F.js} +1 -1
  27. package/dist/client/assets/{diagram-LMA3HP47-DfPoJyQI.js → diagram-LMA3HP47-DaTX0DhT.js} +1 -1
  28. package/dist/client/assets/{diagram-OG6HWLK6-D4uEb6vo.js → diagram-OG6HWLK6-C2p9p-92.js} +1 -1
  29. package/dist/client/assets/{erDiagram-TEJ5UH35-l7yIFj0e.js → erDiagram-TEJ5UH35-DKzLtnp-.js} +1 -1
  30. package/dist/client/assets/{flowDiagram-I6XJVG4X-B3caTMes.js → flowDiagram-I6XJVG4X-GdL8lm6e.js} +1 -1
  31. package/dist/client/assets/{ganttDiagram-6RSMTGT7-9Am36v9m.js → ganttDiagram-6RSMTGT7-Ok-4XYwT.js} +1 -1
  32. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-B7OjYsv_.js → gitGraphDiagram-PVQCEYII-DSMrOCK7.js} +1 -1
  33. package/dist/client/assets/index-Bs8KsdV9.js +276 -0
  34. package/dist/client/assets/index-DdwM8Wgt.css +2 -0
  35. package/dist/client/assets/{infoDiagram-5YYISTIA-ZAcNejkW.js → infoDiagram-5YYISTIA-Dl4hRXis.js} +1 -1
  36. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-BaaJwuN0.js → ishikawaDiagram-YF4QCWOH-C1Dc1fTT.js} +1 -1
  37. package/dist/client/assets/{journeyDiagram-JHISSGLW-DjzTU3kM.js → journeyDiagram-JHISSGLW-CUscmJze.js} +1 -1
  38. package/dist/client/assets/{kanban-definition-UN3LZRKU-DYRchzub.js → kanban-definition-UN3LZRKU-C0nwYjQV.js} +1 -1
  39. package/dist/client/assets/{line-X0j9gj61.js → line-ByiuEIg_.js} +1 -1
  40. package/dist/client/assets/{mermaid-parser.core-DCKG87Vl.js → mermaid-parser.core-B-XdAyDR.js} +1 -1
  41. package/dist/client/assets/{mermaid.core-BxI5T2gs.js → mermaid.core-D_bIfuZD.js} +3 -3
  42. package/dist/client/assets/{mindmap-definition-RKZ34NQL-BE7MZzQO.js → mindmap-definition-RKZ34NQL-BGNiPJDK.js} +1 -1
  43. package/dist/client/assets/{pieDiagram-4H26LBE5-D3fTYovg.js → pieDiagram-4H26LBE5-CP6FpAoO.js} +1 -1
  44. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-B35nXRdQ.js → quadrantDiagram-W4KKPZXB-dsAWBAQn.js} +1 -1
  45. package/dist/client/assets/{requirementDiagram-4Y6WPE33-CLBcHvP0.js → requirementDiagram-4Y6WPE33-DJH-zHqF.js} +1 -1
  46. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-DdBCxGHF.js → sankeyDiagram-5OEKKPKP-BJMnZrqH.js} +1 -1
  47. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-KcLt0X1K.js → sequenceDiagram-3UESZ5HK-CzNjUSlM.js} +1 -1
  48. package/dist/client/assets/{stateDiagram-AJRCARHV-Bq23ObLK.js → stateDiagram-AJRCARHV-jppMhOwh.js} +1 -1
  49. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-CLR1WgdV.js +1 -0
  50. package/dist/client/assets/{timeline-definition-PNZ67QCA-SK3oVUD9.js → timeline-definition-PNZ67QCA-BX2CI5H_.js} +1 -1
  51. package/dist/client/assets/{vennDiagram-CIIHVFJN-COVtAlEC.js → vennDiagram-CIIHVFJN-Bd1KZaXh.js} +1 -1
  52. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-BvfOOwga.js → wardleyDiagram-YWT4CUSO-D-0BNz49.js} +1 -1
  53. package/dist/client/assets/{xychartDiagram-2RQKCTM6-DFnAD9k4.js → xychartDiagram-2RQKCTM6-DbYa0ZWK.js} +1 -1
  54. package/dist/client/index.html +2 -2
  55. package/dist/server/db.js +780 -16
  56. package/dist/server/db.js.map +1 -1
  57. package/dist/server/index.js +198 -20
  58. package/dist/server/index.js.map +1 -1
  59. package/dist/server/lib/agent.js +8 -4
  60. package/dist/server/lib/agent.js.map +1 -1
  61. package/dist/server/lib/agentProvider.js +8 -1
  62. package/dist/server/lib/agentProvider.js.map +1 -1
  63. package/dist/server/lib/approvalReconciliation.js +101 -0
  64. package/dist/server/lib/approvalReconciliation.js.map +1 -0
  65. package/dist/server/lib/approvalRequests.js +587 -0
  66. package/dist/server/lib/approvalRequests.js.map +1 -0
  67. package/dist/server/lib/approvalRoutes.js +143 -0
  68. package/dist/server/lib/approvalRoutes.js.map +1 -0
  69. package/dist/server/lib/automationProgression.js +44 -14
  70. package/dist/server/lib/automationProgression.js.map +1 -1
  71. package/dist/server/lib/buildCompletionContinuation.js +14 -3
  72. package/dist/server/lib/buildCompletionContinuation.js.map +1 -1
  73. package/dist/server/lib/buildExecutionEnvironment.js +350 -66
  74. package/dist/server/lib/buildExecutionEnvironment.js.map +1 -1
  75. package/dist/server/lib/buildOpenQuestionOperations.js +47 -3
  76. package/dist/server/lib/buildOpenQuestionOperations.js.map +1 -1
  77. package/dist/server/lib/buildSequences.js +267 -18
  78. package/dist/server/lib/buildSequences.js.map +1 -1
  79. package/dist/server/lib/buildSetupAuthority.js +138 -0
  80. package/dist/server/lib/buildSetupAuthority.js.map +1 -0
  81. package/dist/server/lib/bundleReviewOperations.js +15 -4
  82. package/dist/server/lib/bundleReviewOperations.js.map +1 -1
  83. package/dist/server/lib/checkDefinitions.js +29 -1
  84. package/dist/server/lib/checkDefinitions.js.map +1 -1
  85. package/dist/server/lib/checkRunner.js +306 -27
  86. package/dist/server/lib/checkRunner.js.map +1 -1
  87. package/dist/server/lib/checkRuns.js +4 -2
  88. package/dist/server/lib/checkRuns.js.map +1 -1
  89. package/dist/server/lib/consequentialActionAuthority.js +142 -0
  90. package/dist/server/lib/consequentialActionAuthority.js.map +1 -0
  91. package/dist/server/lib/consequentialActions.js +231 -0
  92. package/dist/server/lib/consequentialActions.js.map +1 -0
  93. package/dist/server/lib/dockerSandboxCredentials.js +64 -10
  94. package/dist/server/lib/dockerSandboxCredentials.js.map +1 -1
  95. package/dist/server/lib/dockerSandboxEnvironmentOperations.js +119 -0
  96. package/dist/server/lib/dockerSandboxEnvironmentOperations.js.map +1 -1
  97. package/dist/server/lib/dockerSandboxExecutionEnvironment.js +174 -11
  98. package/dist/server/lib/dockerSandboxExecutionEnvironment.js.map +1 -1
  99. package/dist/server/lib/dockerSandboxExecutionProvider.js +12 -3
  100. package/dist/server/lib/dockerSandboxExecutionProvider.js.map +1 -1
  101. package/dist/server/lib/dockerSandboxNetworkPolicy.js +222 -0
  102. package/dist/server/lib/dockerSandboxNetworkPolicy.js.map +1 -0
  103. package/dist/server/lib/executionCredentialCapabilities.js +106 -0
  104. package/dist/server/lib/executionCredentialCapabilities.js.map +1 -0
  105. package/dist/server/lib/executionEnvironment.js.map +1 -1
  106. package/dist/server/lib/executionEnvironmentContexts.js +59 -3
  107. package/dist/server/lib/executionEnvironmentContexts.js.map +1 -1
  108. package/dist/server/lib/executionEnvironmentLifecycle.js +34 -0
  109. package/dist/server/lib/executionEnvironmentLifecycle.js.map +1 -1
  110. package/dist/server/lib/executionEnvironmentRoutes.js +127 -9
  111. package/dist/server/lib/executionEnvironmentRoutes.js.map +1 -1
  112. package/dist/server/lib/executionEnvironmentValidation.js +169 -45
  113. package/dist/server/lib/executionEnvironmentValidation.js.map +1 -1
  114. package/dist/server/lib/executionEnvironmentValidationOperations.js +203 -19
  115. package/dist/server/lib/executionEnvironmentValidationOperations.js.map +1 -1
  116. package/dist/server/lib/executionEnvironments.js +103 -14
  117. package/dist/server/lib/executionEnvironments.js.map +1 -1
  118. package/dist/server/lib/executionProfileRoutes.js +67 -0
  119. package/dist/server/lib/executionProfileRoutes.js.map +1 -0
  120. package/dist/server/lib/executionProfileStore.js +117 -0
  121. package/dist/server/lib/executionProfileStore.js.map +1 -0
  122. package/dist/server/lib/executionProfiles.js +324 -0
  123. package/dist/server/lib/executionProfiles.js.map +1 -0
  124. package/dist/server/lib/executionReconciliation.js +345 -197
  125. package/dist/server/lib/executionReconciliation.js.map +1 -1
  126. package/dist/server/lib/executionRetry.js +24 -5
  127. package/dist/server/lib/executionRetry.js.map +1 -1
  128. package/dist/server/lib/executionRunAuthority.js +467 -0
  129. package/dist/server/lib/executionRunAuthority.js.map +1 -0
  130. package/dist/server/lib/executionRuns.js +30 -4
  131. package/dist/server/lib/executionRuns.js.map +1 -1
  132. package/dist/server/lib/executionTimeline.js +2 -1
  133. package/dist/server/lib/executionTimeline.js.map +1 -1
  134. package/dist/server/lib/git.js +77 -10
  135. package/dist/server/lib/git.js.map +1 -1
  136. package/dist/server/lib/gitPushApprovals.js +367 -0
  137. package/dist/server/lib/gitPushApprovals.js.map +1 -0
  138. package/dist/server/lib/hostExecutionEnvironment.js +7 -1
  139. package/dist/server/lib/hostExecutionEnvironment.js.map +1 -1
  140. package/dist/server/lib/mobileAccess.js +115 -1
  141. package/dist/server/lib/mobileAccess.js.map +1 -1
  142. package/dist/server/lib/productionCheckApprovals.js +106 -0
  143. package/dist/server/lib/productionCheckApprovals.js.map +1 -0
  144. package/dist/server/lib/projects.js +1 -0
  145. package/dist/server/lib/projects.js.map +1 -1
  146. package/dist/server/lib/run.js +58 -2
  147. package/dist/server/lib/run.js.map +1 -1
  148. package/dist/server/lib/ticketFollowUpOperations.js +32 -6
  149. package/dist/server/lib/ticketFollowUpOperations.js.map +1 -1
  150. package/dist/server/lib/transcriptRuns.js +3 -0
  151. package/dist/server/lib/transcriptRuns.js.map +1 -1
  152. package/dist/server/lib/types.js +40 -0
  153. package/dist/server/lib/types.js.map +1 -1
  154. package/dist/server/lib/workspaceProcessEnvironment.js +72 -1
  155. package/dist/server/lib/workspaceProcessEnvironment.js.map +1 -1
  156. package/dist/server/workers/build.js +214 -46
  157. package/dist/server/workers/build.js.map +1 -1
  158. package/dist/server/workers/followUp.js +74 -1
  159. package/dist/server/workers/followUp.js.map +1 -1
  160. package/dist/server/workers/review.js +30 -13
  161. package/dist/server/workers/review.js.map +1 -1
  162. package/package.json +1 -1
  163. package/dist/client/assets/GitHubActionsDialog-CM1z-amZ.js +0 -1
  164. package/dist/client/assets/VerificationDialog-oHjNllh6.js +0 -4
  165. package/dist/client/assets/channel-CF8hkOdu.js +0 -1
  166. package/dist/client/assets/classDiagram-4FO5ZUOK-D6FiG9_B.js +0 -1
  167. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-Bim05ijr.js +0 -1
  168. package/dist/client/assets/index-CsZfTdMO.css +0 -2
  169. package/dist/client/assets/index-DDefs3iM.js +0 -275
  170. 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
- if (current.status === input.status) {
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);