@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.
Files changed (165) hide show
  1. package/dist/client/assets/ActivityView-BFn_Nhj4.js +1 -0
  2. package/dist/client/assets/GitHubActionsDialog-iZD86Yju.js +1 -0
  3. package/dist/client/assets/VerificationDialog-CqKE8t1d.js +4 -0
  4. package/dist/client/assets/{architectureDiagram-3BPJPVTR-BAIGV9Mj.js → architectureDiagram-3BPJPVTR-C8KefY67.js} +1 -1
  5. package/dist/client/assets/{blockDiagram-GPEHLZMM-B-5v5jSZ.js → blockDiagram-GPEHLZMM-BO2Q_Osr.js} +1 -1
  6. package/dist/client/assets/{c4Diagram-AAUBKEIU-C6wU415o.js → c4Diagram-AAUBKEIU-DGPkhbrK.js} +1 -1
  7. package/dist/client/assets/channel-DXKn3TOv.js +1 -0
  8. package/dist/client/assets/{chunk-2J33WTMH-COmvX2tP.js → chunk-2J33WTMH-Dtb7Xu8C.js} +1 -1
  9. package/dist/client/assets/{chunk-3OPIFGDE-BlANptdY.js → chunk-3OPIFGDE-Bnf4GbOF.js} +1 -1
  10. package/dist/client/assets/{chunk-5ZQYHXKU-ETyA2_GU.js → chunk-5ZQYHXKU-BWGid3g7.js} +1 -1
  11. package/dist/client/assets/{chunk-727SXJPM-D5-DudwF.js → chunk-727SXJPM-ScA8IRGP.js} +1 -1
  12. package/dist/client/assets/{chunk-AQP2D5EJ-k1AJ4sA3.js → chunk-AQP2D5EJ-Bygg04Ip.js} +1 -1
  13. package/dist/client/assets/{chunk-CSCIHK7Q-jfksXwY9.js → chunk-CSCIHK7Q-CxdDDtfN.js} +1 -1
  14. package/dist/client/assets/{chunk-KSCS5N6A-CHj0FDj9.js → chunk-KSCS5N6A-BgpZFsB5.js} +1 -1
  15. package/dist/client/assets/{chunk-L5ZTLDWV-1ODGxXhG.js → chunk-L5ZTLDWV-CKSew0OL.js} +1 -1
  16. package/dist/client/assets/{chunk-LZXEDZCA-Bgh9X2W0.js → chunk-LZXEDZCA-DVG9Rx0K.js} +2 -2
  17. package/dist/client/assets/{chunk-ND2GUHAM-DDkb3sp4.js → chunk-ND2GUHAM-CHBqNmuF.js} +1 -1
  18. package/dist/client/assets/{chunk-NZK2D7GU-B6B8PZ_-.js → chunk-NZK2D7GU-DvZYWn7V.js} +1 -1
  19. package/dist/client/assets/{chunk-O5CBEL6O-DhiUIFgj.js → chunk-O5CBEL6O-BL7lRTSe.js} +1 -1
  20. package/dist/client/assets/{chunk-WU5MYG2G-Dzd0fbP3.js → chunk-WU5MYG2G-C-il2wHZ.js} +1 -1
  21. package/dist/client/assets/classDiagram-4FO5ZUOK-U0fU20hT.js +1 -0
  22. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-C6bQNSxL.js +1 -0
  23. package/dist/client/assets/{dagre-BM42HDAG-DoNDMCXI.js → dagre-BM42HDAG-B00l5tLi.js} +1 -1
  24. package/dist/client/assets/{diagram-2AECGRRQ-ETDXSa5q.js → diagram-2AECGRRQ-Tum6g1_5.js} +1 -1
  25. package/dist/client/assets/{diagram-5GNKFQAL-CgTUep7e.js → diagram-5GNKFQAL-BK1GX5jc.js} +1 -1
  26. package/dist/client/assets/{diagram-KO2AKTUF-BKTx2iRe.js → diagram-KO2AKTUF-BrzmD5NB.js} +1 -1
  27. package/dist/client/assets/{diagram-LMA3HP47-9iEiScHT.js → diagram-LMA3HP47-BhrlgXiJ.js} +1 -1
  28. package/dist/client/assets/{diagram-OG6HWLK6-UIZRh7Qa.js → diagram-OG6HWLK6-K-fWsJ3a.js} +1 -1
  29. package/dist/client/assets/{erDiagram-TEJ5UH35-BpNJmJva.js → erDiagram-TEJ5UH35-Der6PjHE.js} +1 -1
  30. package/dist/client/assets/{flowDiagram-I6XJVG4X-C-rK0XZ1.js → flowDiagram-I6XJVG4X-BVWgGhXe.js} +1 -1
  31. package/dist/client/assets/{ganttDiagram-6RSMTGT7-DWyfPvv_.js → ganttDiagram-6RSMTGT7-DcoZ5ggj.js} +1 -1
  32. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-x71bzdc_.js → gitGraphDiagram-PVQCEYII-BhhbMTBu.js} +1 -1
  33. package/dist/client/assets/index-B6BltHSr.css +2 -0
  34. package/dist/client/assets/index-CFOYm3j9.js +276 -0
  35. package/dist/client/assets/{infoDiagram-5YYISTIA-CbRus0Xu.js → infoDiagram-5YYISTIA-Lwc-agyc.js} +1 -1
  36. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-DvaMHrgN.js → ishikawaDiagram-YF4QCWOH-B95U1Xcl.js} +1 -1
  37. package/dist/client/assets/{journeyDiagram-JHISSGLW-BQBu4YGn.js → journeyDiagram-JHISSGLW-xFpigy5D.js} +1 -1
  38. package/dist/client/assets/{kanban-definition-UN3LZRKU-8rU-U7L1.js → kanban-definition-UN3LZRKU-D3mudQnR.js} +1 -1
  39. package/dist/client/assets/{line-CSZnwjLA.js → line-DtTL3ZI2.js} +1 -1
  40. package/dist/client/assets/{mermaid-parser.core-CTOl2slE.js → mermaid-parser.core-Dau7K6zV.js} +1 -1
  41. package/dist/client/assets/{mermaid.core-B9gr0Vqf.js → mermaid.core-B8qtvATu.js} +3 -3
  42. package/dist/client/assets/{mindmap-definition-RKZ34NQL-But1_PWQ.js → mindmap-definition-RKZ34NQL-Cus04Yq3.js} +1 -1
  43. package/dist/client/assets/{pieDiagram-4H26LBE5-CnlVmfSG.js → pieDiagram-4H26LBE5-BCMGpBnn.js} +1 -1
  44. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-Dww1ZGuR.js → quadrantDiagram-W4KKPZXB-CAmOr-PJ.js} +1 -1
  45. package/dist/client/assets/{requirementDiagram-4Y6WPE33-CNf_loe8.js → requirementDiagram-4Y6WPE33-kisD3jc4.js} +1 -1
  46. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-DBhi37Jj.js → sankeyDiagram-5OEKKPKP-CsCedmM0.js} +1 -1
  47. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-B64hb4E4.js → sequenceDiagram-3UESZ5HK-B-dAi954.js} +1 -1
  48. package/dist/client/assets/{stateDiagram-AJRCARHV-DcS6oB-S.js → stateDiagram-AJRCARHV-X0BnedIW.js} +1 -1
  49. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-6B8YH8Y2.js +1 -0
  50. package/dist/client/assets/{timeline-definition-PNZ67QCA-Dq-4tXfh.js → timeline-definition-PNZ67QCA-DfFoSjhr.js} +1 -1
  51. package/dist/client/assets/{vennDiagram-CIIHVFJN-CeDklSE_.js → vennDiagram-CIIHVFJN-CKSCBwhG.js} +1 -1
  52. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-D2cJISMm.js → wardleyDiagram-YWT4CUSO-DNIBQmHO.js} +1 -1
  53. package/dist/client/assets/{xychartDiagram-2RQKCTM6-CBF-tTpF.js → xychartDiagram-2RQKCTM6-FvB55TQN.js} +1 -1
  54. package/dist/client/index.html +2 -2
  55. package/dist/server/db.js +368 -5
  56. package/dist/server/db.js.map +1 -1
  57. package/dist/server/index.js +194 -250
  58. package/dist/server/index.js.map +1 -1
  59. package/dist/server/lib/agentRuns.js +14 -1
  60. package/dist/server/lib/agentRuns.js.map +1 -1
  61. package/dist/server/lib/automationLoopProjection.js +55 -12
  62. package/dist/server/lib/automationLoopProjection.js.map +1 -1
  63. package/dist/server/lib/automationProgression.js +2 -5
  64. package/dist/server/lib/automationProgression.js.map +1 -1
  65. package/dist/server/lib/automationResumeDecision.js +19 -1
  66. package/dist/server/lib/automationResumeDecision.js.map +1 -1
  67. package/dist/server/lib/buildControlEligibility.js +4 -0
  68. package/dist/server/lib/buildControlEligibility.js.map +1 -0
  69. package/dist/server/lib/buildExecutionAdmission.js +76 -0
  70. package/dist/server/lib/buildExecutionAdmission.js.map +1 -0
  71. package/dist/server/lib/buildSequenceResume.js +79 -0
  72. package/dist/server/lib/buildSequenceResume.js.map +1 -0
  73. package/dist/server/lib/buildWorkload.js +11 -0
  74. package/dist/server/lib/buildWorkload.js.map +1 -0
  75. package/dist/server/lib/checkAutoFixDetails.js +36 -1
  76. package/dist/server/lib/checkAutoFixDetails.js.map +1 -1
  77. package/dist/server/lib/executionEnvironmentReconciliation.js +15 -2
  78. package/dist/server/lib/executionEnvironmentReconciliation.js.map +1 -1
  79. package/dist/server/lib/executionEnvironments.js +15 -0
  80. package/dist/server/lib/executionEnvironments.js.map +1 -1
  81. package/dist/server/lib/executionRetry.js +13 -1
  82. package/dist/server/lib/executionRetry.js.map +1 -1
  83. package/dist/server/lib/executionRunAuthority.js +2 -2
  84. package/dist/server/lib/executionRunAuthority.js.map +1 -1
  85. package/dist/server/lib/executionTargets.js +7 -4
  86. package/dist/server/lib/executionTargets.js.map +1 -1
  87. package/dist/server/lib/executionTimeline.js +8 -13
  88. package/dist/server/lib/executionTimeline.js.map +1 -1
  89. package/dist/server/lib/executionTimelineHierarchy.js +83 -0
  90. package/dist/server/lib/executionTimelineHierarchy.js.map +1 -0
  91. package/dist/server/lib/failedBuildSequenceRecovery.js +133 -0
  92. package/dist/server/lib/failedBuildSequenceRecovery.js.map +1 -0
  93. package/dist/server/lib/hostRunSession.js +62 -0
  94. package/dist/server/lib/hostRunSession.js.map +1 -0
  95. package/dist/server/lib/hostServiceRecovery.js +159 -0
  96. package/dist/server/lib/hostServiceRecovery.js.map +1 -0
  97. package/dist/server/lib/hostServiceRunProvider.js +32 -0
  98. package/dist/server/lib/hostServiceRunProvider.js.map +1 -0
  99. package/dist/server/lib/mobileAccess.js +6 -2
  100. package/dist/server/lib/mobileAccess.js.map +1 -1
  101. package/dist/server/lib/projectAutoConfig.js +5 -2
  102. package/dist/server/lib/projectAutoConfig.js.map +1 -1
  103. package/dist/server/lib/projectTargets.js +16 -2
  104. package/dist/server/lib/projectTargets.js.map +1 -1
  105. package/dist/server/lib/projects.js +25 -1
  106. package/dist/server/lib/projects.js.map +1 -1
  107. package/dist/server/lib/reviewFindingReconciliation.js +9 -2
  108. package/dist/server/lib/reviewFindingReconciliation.js.map +1 -1
  109. package/dist/server/lib/reviewFindings.js +82 -21
  110. package/dist/server/lib/reviewFindings.js.map +1 -1
  111. package/dist/server/lib/reviewRepairAssessmentRecords.js +41 -0
  112. package/dist/server/lib/reviewRepairAssessmentRecords.js.map +1 -0
  113. package/dist/server/lib/reviewRepairCompletion.js +78 -18
  114. package/dist/server/lib/reviewRepairCompletion.js.map +1 -1
  115. package/dist/server/lib/reviewRepairIterationRecords.js +4 -2
  116. package/dist/server/lib/reviewRepairIterationRecords.js.map +1 -1
  117. package/dist/server/lib/reviewRepairIterations.js +8 -2
  118. package/dist/server/lib/reviewRepairIterations.js.map +1 -1
  119. package/dist/server/lib/reviewRepairProgress.js +177 -0
  120. package/dist/server/lib/reviewRepairProgress.js.map +1 -0
  121. package/dist/server/lib/reviewRepairReconciliation.js +119 -140
  122. package/dist/server/lib/reviewRepairReconciliation.js.map +1 -1
  123. package/dist/server/lib/reviewRepairResumeOverride.js +55 -0
  124. package/dist/server/lib/reviewRepairResumeOverride.js.map +1 -0
  125. package/dist/server/lib/run.js +541 -504
  126. package/dist/server/lib/run.js.map +1 -1
  127. package/dist/server/lib/runProcessIdentity.js +71 -0
  128. package/dist/server/lib/runProcessIdentity.js.map +1 -0
  129. package/dist/server/lib/runProcesses.js +273 -0
  130. package/dist/server/lib/runProcesses.js.map +1 -0
  131. package/dist/server/lib/runServices.js +223 -0
  132. package/dist/server/lib/runServices.js.map +1 -0
  133. package/dist/server/lib/runSessionLifecycle.js +77 -0
  134. package/dist/server/lib/runSessionLifecycle.js.map +1 -0
  135. package/dist/server/lib/runStatus.js +8 -0
  136. package/dist/server/lib/runStatus.js.map +1 -0
  137. package/dist/server/lib/serviceRunCleanup.js +70 -0
  138. package/dist/server/lib/serviceRunCleanup.js.map +1 -0
  139. package/dist/server/lib/serviceRuns.js +458 -19
  140. package/dist/server/lib/serviceRuns.js.map +1 -1
  141. package/dist/server/lib/ticketAutomation.js +4 -27
  142. package/dist/server/lib/ticketAutomation.js.map +1 -1
  143. package/dist/server/lib/ticketRunOperations.js +103 -34
  144. package/dist/server/lib/ticketRunOperations.js.map +1 -1
  145. package/dist/server/lib/tickets.js +0 -13
  146. package/dist/server/lib/tickets.js.map +1 -1
  147. package/dist/server/lib/types.js.map +1 -1
  148. package/dist/server/workers/build.js +44 -69
  149. package/dist/server/workers/build.js.map +1 -1
  150. package/dist/server/workers/plan.js +0 -7
  151. package/dist/server/workers/plan.js.map +1 -1
  152. package/dist/server/workers/review.js +95 -146
  153. package/dist/server/workers/review.js.map +1 -1
  154. package/package.json +1 -1
  155. package/dist/client/assets/ActivityView-CKvbDXeA.js +0 -1
  156. package/dist/client/assets/GitHubActionsDialog-Dzo0vtak.js +0 -1
  157. package/dist/client/assets/VerificationDialog-BJnOitrJ.js +0 -4
  158. package/dist/client/assets/channel-5mIy7nm1.js +0 -1
  159. package/dist/client/assets/classDiagram-4FO5ZUOK-BiQ-X2Sg.js +0 -1
  160. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CF-wCYW-.js +0 -1
  161. package/dist/client/assets/index-CIAO5aE_.css +0 -2
  162. package/dist/client/assets/index-nCGyalrn.js +0 -276
  163. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-PWeeL0tR.js +0 -1
  164. package/dist/server/lib/automationDeliveryDecision.js +0 -34
  165. package/dist/server/lib/automationDeliveryDecision.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"executionTimeline.js","sourceRoot":"","sources":["../../../server/lib/executionTimeline.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"executionTimeline.js","sourceRoot":"","sources":["../../../server/lib/executionTimeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import { getExecutionRunsByIds, listExecutionRunLinksForRuns } from './executionRuns.js';
2
+ export const MAX_EXECUTION_TIMELINE_ANCESTOR_DEPTH = 20;
3
+ const toParentSummary = (run) => ({
4
+ id: run.id,
5
+ kind: run.kind,
6
+ status: run.status,
7
+ domain_status: run.domain_status,
8
+ source_reference: run.source_reference,
9
+ attempt: run.attempt,
10
+ created_at: run.created_at,
11
+ completed_at: run.completed_at,
12
+ });
13
+ const toContextNode = (run) => ({
14
+ ...toParentSummary(run),
15
+ parent_run_id: run.parent_run_id,
16
+ });
17
+ const boundaryKey = (boundary) => (`${boundary.child_run_id}\u0000${boundary.parent_run_id}\u0000${boundary.code}`);
18
+ export const projectExecutionTimelineHierarchy = ({ projectId, primaryRuns, scope, maxDepth = MAX_EXECUTION_TIMELINE_ANCESTOR_DEPTH, }) => {
19
+ const primaryIds = new Set(primaryRuns.map(run => run.id));
20
+ const visibleParentSummariesById = new Map(primaryRuns.map(run => [run.id, toParentSummary(run)]));
21
+ const contextById = new Map();
22
+ const boundariesByKey = new Map();
23
+ let traversals = primaryRuns.map(run => ({ child: run, ancestorIds: new Set([run.id]) }));
24
+ const addBoundary = (boundary) => {
25
+ boundariesByKey.set(boundaryKey(boundary), boundary);
26
+ };
27
+ for (let depth = 0; depth < maxDepth && traversals.length > 0; depth += 1) {
28
+ const parentIds = traversals
29
+ .map(({ child }) => child.parent_run_id)
30
+ .filter((id) => Boolean(id));
31
+ const parents = getExecutionRunsByIds(projectId, parentIds);
32
+ const parentsById = new Map(parents.map(run => [run.id, run]));
33
+ const scopedParentIds = scope
34
+ ? new Set(listExecutionRunLinksForRuns(projectId, parents.map(run => run.id))
35
+ .filter(link => link.entity_type === scope.type && link.entity_id === scope.id)
36
+ .map(link => link.execution_run_id))
37
+ : null;
38
+ const nextTraversals = [];
39
+ for (const traversal of traversals) {
40
+ const parentId = traversal.child.parent_run_id;
41
+ if (!parentId) {
42
+ continue;
43
+ }
44
+ const parent = parentsById.get(parentId);
45
+ if (!parent) {
46
+ addBoundary({ child_run_id: traversal.child.id, parent_run_id: parentId, code: 'missing_parent' });
47
+ continue;
48
+ }
49
+ if (scopedParentIds && !scopedParentIds.has(parentId)) {
50
+ addBoundary({ child_run_id: traversal.child.id, parent_run_id: parentId, code: 'outside_scope' });
51
+ continue;
52
+ }
53
+ if (traversal.ancestorIds.has(parentId)) {
54
+ addBoundary({ child_run_id: traversal.child.id, parent_run_id: parentId, code: 'cycle_detected' });
55
+ continue;
56
+ }
57
+ visibleParentSummariesById.set(parent.id, toParentSummary(parent));
58
+ if (!primaryIds.has(parent.id)) {
59
+ contextById.set(parent.id, toContextNode(parent));
60
+ }
61
+ if (!parent.parent_run_id) {
62
+ continue;
63
+ }
64
+ if (depth === maxDepth - 1) {
65
+ addBoundary({ child_run_id: parent.id, parent_run_id: parent.parent_run_id, code: 'depth_limited' });
66
+ continue;
67
+ }
68
+ nextTraversals.push({
69
+ child: parent,
70
+ ancestorIds: new Set([...traversal.ancestorIds, parent.id]),
71
+ });
72
+ }
73
+ traversals = nextTraversals;
74
+ }
75
+ return {
76
+ hierarchy: {
77
+ context_nodes: [...contextById.values()].sort((left, right) => left.id.localeCompare(right.id)),
78
+ boundaries: [...boundariesByKey.values()].sort((left, right) => boundaryKey(left).localeCompare(boundaryKey(right))),
79
+ },
80
+ visibleParentSummariesById,
81
+ };
82
+ };
83
+ //# sourceMappingURL=executionTimelineHierarchy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executionTimelineHierarchy.js","sourceRoot":"","sources":["../../../server/lib/executionTimelineHierarchy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ import db from '../db.js';
2
+ // Legacy resumes have no workload tag. Require the exact stopped parent and
3
+ // pre-provider failure evidence instead of inferring continuation from a ticket session.
4
+ // UNION also terminates malformed retry cycles; only a chain reaching the bound
5
+ // legacy failure, with exclusively pre-start queue failures after it, is admitted.
6
+ export const getFailedBuildSequenceRecovery = (projectId, runId, replacementRunId = null) => db.prepare(`
7
+ WITH RECURSIVE recovery_chain(id, retry_of_run_id) AS (
8
+ SELECT id, retry_of_run_id FROM execution_runs WHERE id = @source AND project_id = @project
9
+ UNION
10
+ SELECT prior.id, prior.retry_of_run_id FROM execution_runs prior
11
+ JOIN recovery_chain child ON child.retry_of_run_id = prior.id WHERE prior.project_id = @project
12
+ )
13
+ SELECT sequence.id AS sequenceId, ticket.id AS ticketId, ticket.session_id AS sessionId,
14
+ original.id AS parentRunId, failed.id AS boundRunId, item.finished_at AS finishedAt
15
+ FROM execution_runs failed
16
+ JOIN recovery_chain root ON root.id = failed.id
17
+ JOIN execution_runs original ON original.id = failed.parent_run_id AND original.project_id = failed.project_id
18
+ JOIN build_sequence_tickets item ON item.activation_execution_run_id = failed.id
19
+ JOIN build_sequences sequence ON sequence.id = item.build_sequence_id AND sequence.project_id = failed.project_id
20
+ JOIN tickets ticket ON ticket.id = item.ticket_id AND ticket.project_id = failed.project_id
21
+ WHERE failed.project_id = @project
22
+ AND failed.kind = 'build' AND failed.status = 'failed' AND failed.domain_status = 'error'
23
+ AND failed.initiated_by = 'user' AND failed.retry_of_run_id IS NULL
24
+ AND failed.failure_code = 'build_failed'
25
+ AND failed.failure_message = 'Execution run authority workload does not match the durable run intent'
26
+ AND (json_type(failed.metadata_json, '$.build_workload') IS NULL
27
+ OR json_extract(failed.metadata_json, '$.build_workload') = 'build_continuation')
28
+ AND original.kind = 'build' AND original.status = 'cancelled' AND original.domain_status = 'stopped'
29
+ AND original.initiated_by = 'user'
30
+ AND sequence.status = 'failed' AND item.status = 'failed'
31
+ AND item.execution_profile_revision_id IS NOT NULL AND item.execution_profile_fingerprint IS NOT NULL
32
+ AND item.execution_profile_selection_reason IS NOT NULL
33
+ AND ticket.worktree_bundle_id = sequence.worktree_bundle_id
34
+ AND ticket.state = 'build' AND ticket.agent_status = 'error'
35
+ AND ticket.build_completed_at IS NULL AND length(ticket.session_id) > 0
36
+ AND ticket.tool = json_extract(original.metadata_json, '$.retry_tool')
37
+ AND ticket.model IS json_extract(original.metadata_json, '$.retry_model')
38
+ AND ticket.variant IS json_extract(original.metadata_json, '$.retry_variant')
39
+ AND EXISTS (SELECT 1 FROM agent_runs agent WHERE agent.execution_run_id = original.id
40
+ AND agent.parent_type = 'ticket' AND agent.parent_id = ticket.id AND agent.role = 'main'
41
+ AND agent.agent_status = 'stopped' AND agent.session_id = ticket.session_id)
42
+ AND EXISTS (SELECT 1 FROM agent_runs agent WHERE agent.execution_run_id = failed.id
43
+ AND agent.parent_type = 'ticket' AND agent.parent_id = ticket.id AND agent.role = 'main'
44
+ AND agent.agent_status = 'error' AND agent.session_id IS NULL)
45
+ AND NOT EXISTS (SELECT 1 FROM agent_runs agent WHERE agent.execution_run_id = failed.id
46
+ AND (agent.session_id IS NOT NULL OR agent.response_text IS NOT NULL OR agent.streaming_response IS NOT NULL
47
+ OR agent.role != 'main' OR agent.agent_status != 'error'))
48
+ AND NOT EXISTS (SELECT 1 FROM execution_run_authorities authority
49
+ WHERE authority.execution_run_id IN (SELECT id FROM recovery_chain))
50
+ AND NOT EXISTS (
51
+ SELECT 1 FROM execution_runs attempt JOIN recovery_chain chain ON chain.id = attempt.id
52
+ WHERE attempt.id != failed.id AND (
53
+ attempt.kind != 'build' OR attempt.status != 'failed' OR attempt.domain_status IS NOT 'error'
54
+ OR attempt.initiated_by != 'user' OR attempt.failure_code IS NOT 'queue_failed'
55
+ OR attempt.started_at IS NOT NULL OR attempt.parent_run_id IS NOT original.id
56
+ OR attempt.correlation_id != failed.correlation_id
57
+ OR json_extract(attempt.metadata_json, '$.build_workload') IS NOT 'build_continuation'
58
+ OR json_extract(attempt.metadata_json, '$.retry_model') IS NOT ticket.model
59
+ OR json_extract(attempt.metadata_json, '$.retry_variant') IS NOT ticket.variant
60
+ OR EXISTS (SELECT 1 FROM agent_runs agent WHERE agent.execution_run_id = attempt.id)
61
+ OR EXISTS (SELECT 1 FROM execution_run_links link
62
+ WHERE link.execution_run_id = attempt.id AND link.relationship = 'result')
63
+ )
64
+ )
65
+ AND NOT EXISTS (SELECT 1 FROM build_sequences busy WHERE busy.project_id = sequence.project_id
66
+ AND busy.worktree_bundle_id = sequence.worktree_bundle_id AND busy.status = 'active')
67
+ AND NOT EXISTS (SELECT 1 FROM build_sequence_tickets other WHERE other.build_sequence_id = sequence.id
68
+ AND other.ticket_id != ticket.id AND other.status != 'done')
69
+ AND NOT EXISTS (SELECT 1 FROM execution_runs newer
70
+ JOIN execution_run_links link ON link.execution_run_id = newer.id AND link.project_id = newer.project_id
71
+ WHERE newer.project_id = failed.project_id AND link.entity_type = 'ticket'
72
+ AND link.entity_id = ticket.id AND link.relationship = 'primary' AND newer.id IS NOT @replacement
73
+ AND newer.id NOT IN (SELECT id FROM recovery_chain)
74
+ AND (newer.status IN ('queued', 'running', 'waiting')
75
+ OR (newer.created_at, newer.id) > (failed.created_at, failed.id)))
76
+ AND NOT EXISTS (SELECT 1 FROM execution_runs retry
77
+ WHERE retry.retry_of_run_id IN (SELECT id FROM recovery_chain)
78
+ AND retry.id NOT IN (SELECT id FROM recovery_chain) AND retry.id IS NOT @replacement)
79
+ AND NOT EXISTS (
80
+ SELECT 1 FROM execution_runs owner WHERE (owner.id = original.id OR owner.id IN (SELECT id FROM recovery_chain))
81
+ AND (json_extract(owner.metadata_json, '$.execution_profile_revision_id') IS NOT item.execution_profile_revision_id
82
+ OR json_extract(owner.metadata_json, '$.execution_profile_fingerprint') IS NOT item.execution_profile_fingerprint
83
+ OR json_extract(owner.metadata_json, '$.execution_profile_selection_reason') IS NOT item.execution_profile_selection_reason
84
+ OR json_extract(owner.metadata_json, '$.retry_tool') IS NOT ticket.tool
85
+ OR NOT EXISTS (SELECT 1 FROM execution_run_links link WHERE link.execution_run_id = owner.id
86
+ AND link.project_id = failed.project_id AND link.entity_type = 'ticket' AND link.entity_id = ticket.id AND link.relationship = 'primary')
87
+ OR NOT EXISTS (SELECT 1 FROM execution_run_links link WHERE link.execution_run_id = owner.id
88
+ AND link.project_id = failed.project_id AND link.entity_type = 'bundle' AND link.entity_id = sequence.worktree_bundle_id AND link.relationship = 'context')
89
+ OR NOT EXISTS (SELECT 1 FROM execution_run_links link WHERE link.execution_run_id = owner.id
90
+ AND link.project_id = failed.project_id AND link.entity_type = 'build_sequence' AND link.entity_id = sequence.id AND link.relationship = 'context'))
91
+ )
92
+ `).get({ replacement: replacementRunId, source: runId, project: projectId });
93
+ export const handoffFailedBuildSequenceRecovery = (projectId, sequenceId, ticketId, sessionId, replacementRunId) => {
94
+ const next = db.prepare(`SELECT retry_of_run_id AS sourceId FROM execution_runs
95
+ WHERE id = ? AND project_id = ? AND kind = 'build' AND status = 'queued'
96
+ AND initiated_by = 'user' AND json_extract(metadata_json, '$.build_workload') = 'build_continuation'`)
97
+ .get(replacementRunId, projectId);
98
+ if (!next?.sourceId) {
99
+ return null;
100
+ }
101
+ const recovery = getFailedBuildSequenceRecovery(projectId, next.sourceId, replacementRunId);
102
+ if (!recovery || recovery.sequenceId !== sequenceId || recovery.ticketId !== ticketId || recovery.sessionId !== sessionId) {
103
+ throw new Error('The failed Build resume has no verified recovery lineage');
104
+ }
105
+ const matching = db.prepare(`SELECT 1 FROM execution_runs next
106
+ JOIN build_sequence_tickets item ON item.build_sequence_id = ? AND item.ticket_id = ?
107
+ WHERE next.id = ? AND next.parent_run_id = ?
108
+ AND EXISTS (SELECT 1 FROM execution_run_links link WHERE link.execution_run_id = next.id
109
+ AND link.project_id = next.project_id AND link.entity_type = 'ticket' AND link.entity_id = item.ticket_id AND link.relationship = 'primary')
110
+ AND EXISTS (SELECT 1 FROM execution_run_links link WHERE link.execution_run_id = next.id
111
+ AND link.project_id = next.project_id AND link.entity_type = 'build_sequence' AND link.entity_id = item.build_sequence_id AND link.relationship = 'context')
112
+ AND json_extract(next.metadata_json, '$.execution_profile_revision_id') = item.execution_profile_revision_id
113
+ AND json_extract(next.metadata_json, '$.execution_profile_fingerprint') = item.execution_profile_fingerprint
114
+ AND json_extract(next.metadata_json, '$.execution_profile_selection_reason') = item.execution_profile_selection_reason`)
115
+ .get(sequenceId, ticketId, replacementRunId, recovery.parentRunId);
116
+ if (!matching) {
117
+ throw new Error('The failed Build resume recovery profile does not match');
118
+ }
119
+ db.prepare("UPDATE build_sequences SET status = 'active', updated_at = CURRENT_TIMESTAMP WHERE id = ?").run(sequenceId);
120
+ db.prepare(`UPDATE build_sequence_tickets SET status = 'active', finished_at = NULL, activation_execution_run_id = ?
121
+ WHERE build_sequence_id = ? AND ticket_id = ?`).run(replacementRunId, sequenceId, ticketId);
122
+ return () => {
123
+ const restored = db.prepare(`UPDATE build_sequence_tickets SET status = 'failed', finished_at = ?, activation_execution_run_id = ?
124
+ WHERE build_sequence_id = ? AND ticket_id = ? AND status = 'active' AND activation_execution_run_id = ?
125
+ AND EXISTS (SELECT 1 FROM execution_runs WHERE id = ? AND status = 'queued')`)
126
+ .run(recovery.finishedAt, recovery.boundRunId, sequenceId, ticketId, replacementRunId, replacementRunId);
127
+ if (restored.changes !== 1) {
128
+ throw new Error('Unable to restore the failed Build sequence');
129
+ }
130
+ db.prepare("UPDATE build_sequences SET status = 'failed', updated_at = CURRENT_TIMESTAMP WHERE id = ?").run(sequenceId);
131
+ };
132
+ };
133
+ //# sourceMappingURL=failedBuildSequenceRecovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failedBuildSequenceRecovery.js","sourceRoot":"","sources":["../../../server/lib/failedBuildSequenceRecovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAA;AAEzB,4EAA4E;AAC5E,yFAAyF;AACzF,gFAAgF;AAChF,mFAAmF;AACnF,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,SAAiB,EAAE,KAAa,EAAE,mBAAkC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsFtI,CAAC,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,CAE9D,CAAA;AAEb,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAChD,SAAiB,EAAE,UAAkB,EAAE,QAAgB,EAAE,SAAiB,EAAE,gBAAwB,EAC/E,EAAE;IACvB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;2GAEiF,CAAC;SACvG,GAAG,CAAC,gBAAgB,EAAE,SAAS,CAA4C,CAAA;IAC9E,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;QACpB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,QAAQ,GAAG,8BAA8B,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAA;IAC3F,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,KAAK,UAAU,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAC1H,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAA;IAC7E,CAAC;IACD,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;6HAS+F,CAAC;SACzH,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAA;IACpE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAA;IAC5E,CAAC;IACD,EAAE,CAAC,OAAO,CAAC,2FAA2F,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IACvH,EAAE,CAAC,OAAO,CAAC;kDACqC,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAA;IAC7F,OAAO,GAAG,EAAE;QACV,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC;;qFAEqD,CAAC;aAC/E,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAA;QAC1G,IAAI,QAAQ,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;QAChE,CAAC;QACD,EAAE,CAAC,OAAO,CAAC,2FAA2F,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IACzH,CAAC,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,62 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ export const createRunConfigSnapshot = (config, preview = {}) => Object.freeze({
3
+ ...preview,
4
+ setup: Object.freeze([...(config.setup ?? [])]),
5
+ services: Object.freeze((config.services ?? []).map(service => Object.freeze({ ...service }))),
6
+ ide: config.ide ?? null,
7
+ });
8
+ export const serviceIdentity = (service, index) => service.id ?? `service-${index + 1}`;
9
+ export const createHostRunSession = (config) => {
10
+ const snapshot = structuredClone(config);
11
+ const ids = (snapshot.services ?? []).map(serviceIdentity);
12
+ if (new Set(ids).size !== ids.length) {
13
+ throw new Error('Service IDs must be unique');
14
+ }
15
+ return {
16
+ id: randomUUID(),
17
+ config: snapshot,
18
+ services: (snapshot.services ?? []).map((service, index) => ({
19
+ service_id: ids[index],
20
+ name: service.name ?? service.cmd,
21
+ status: 'stopped',
22
+ exit_code: null,
23
+ error: null,
24
+ })),
25
+ processes: new Map(),
26
+ pending: new Set(),
27
+ };
28
+ };
29
+ export const queueHostServices = (session, serviceId) => {
30
+ for (const service of session.services) {
31
+ if ((serviceId !== undefined && service.service_id !== serviceId)
32
+ || ['starting', 'running', 'stopping'].includes(service.status)) {
33
+ continue;
34
+ }
35
+ session.pending.add(service.service_id);
36
+ service.status = 'starting';
37
+ service.error = null;
38
+ service.exit_code = null;
39
+ }
40
+ };
41
+ export const assertHostSessionRequest = (session, serviceId, sessionId) => {
42
+ if (serviceId !== undefined && sessionId === undefined) {
43
+ throw new Error('A session_id is required for individual service controls');
44
+ }
45
+ if (sessionId !== undefined && session.id !== sessionId) {
46
+ throw new Error('The service session has changed. Refresh before retrying.');
47
+ }
48
+ if (serviceId !== undefined && !session.services.some(service => service.service_id === serviceId)) {
49
+ throw new Error('Unknown service ID');
50
+ }
51
+ };
52
+ export const finishHostService = (session, serviceId, proc, code, error) => {
53
+ if (session.processes.get(serviceId) !== proc) {
54
+ return;
55
+ }
56
+ session.processes.delete(serviceId);
57
+ const service = session.services.find(entry => entry.service_id === serviceId);
58
+ service.exit_code = code;
59
+ service.error = error ?? null;
60
+ service.status = service.status === 'stopping' ? 'stopped' : error || code !== 0 ? 'failed' : 'completed';
61
+ };
62
+ //# sourceMappingURL=hostRunSession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostRunSession.js","sourceRoot":"","sources":["../../../server/lib/hostRunSession.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,159 @@
1
+ import { readFileSync, readlinkSync, readdirSync } from 'node:fs';
2
+ import { spawnSync } from 'node:child_process';
3
+ export const isHostServiceProcessIdentity = (value) => {
4
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
5
+ return false;
6
+ }
7
+ const identity = value;
8
+ return identity.version === 1 && typeof identity.pid === 'number' && Number.isSafeInteger(identity.pid) && identity.pid > 1
9
+ && typeof identity.bootId === 'string' && identity.bootId.length > 0
10
+ && typeof identity.pidNamespace === 'string' && identity.pidNamespace.length > 0
11
+ && typeof identity.startTime === 'string' && /^\d+$/.test(identity.startTime);
12
+ };
13
+ export const captureHostServiceProcessIdentity = (pid) => {
14
+ if (process.platform !== 'linux' || !Number.isSafeInteger(pid) || pid <= 1) {
15
+ throw new Error('Host process recovery requires a verifiable Linux process identity');
16
+ }
17
+ const stat = readFileSync(`/proc/${pid}/stat`, 'utf8');
18
+ const fields = stat.slice(stat.lastIndexOf(')') + 2).split(' ');
19
+ if (Number(fields[2]) !== pid || Number(fields[3]) !== pid || !/^\d+$/.test(fields[19] ?? '')) {
20
+ throw new Error('Host process is not the expected detached session leader');
21
+ }
22
+ return {
23
+ version: 1,
24
+ bootId: readFileSync('/proc/sys/kernel/random/boot_id', 'utf8').trim(),
25
+ pidNamespace: readlinkSync('/proc/self/ns/pid'),
26
+ pid,
27
+ startTime: fields[19],
28
+ };
29
+ };
30
+ // pidfds prevent PID reuse between verification and signaling. Numeric PID/PGID
31
+ // probes use signal 0 only. Missing Python/pidfd support fails closed.
32
+ const cleanupScript = `
33
+ import json, os, signal, sys, time
34
+ identity = json.loads(sys.argv[1])
35
+ assert type(identity['version']) is int and identity['version'] == 1
36
+ pid = identity['pid']
37
+ assert type(pid) is int and pid > 1
38
+ assert type(identity['startTime']) is str and identity['startTime'].isdigit()
39
+ assert open('/proc/sys/kernel/random/boot_id').read().strip() == identity['bootId']
40
+ assert os.readlink('/proc/self/ns/pid') == identity['pidNamespace']
41
+ # A filtered procfs listing cannot prove that the whole session disappeared.
42
+ for mount in open('/proc/self/mountinfo'):
43
+ fields = mount.split()
44
+ if fields[4] == '/proc':
45
+ assert not any(option.startswith('hidepid=') and option != 'hidepid=0'
46
+ for option in fields[-1].split(',')), 'Process visibility is restricted'
47
+
48
+ def stat(pid):
49
+ try:
50
+ text = open('/proc/%s/stat' % pid).read()
51
+ fields = text[text.rindex(')') + 2:].split()
52
+ return (fields[0], int(fields[2]), int(fields[3]), fields[19])
53
+ except FileNotFoundError:
54
+ return None
55
+
56
+ def members():
57
+ result = []
58
+ for entry in os.listdir('/proc'):
59
+ if entry.isdigit():
60
+ current = stat(int(entry))
61
+ if current and (current[1] == pid or current[2] == pid) and current[0] not in ('Z', 'X'):
62
+ result.append((int(entry), current))
63
+ return result
64
+
65
+ current = members()
66
+ if current:
67
+ leader = stat(pid)
68
+ assert leader and leader[1:] == (pid, pid, identity['startTime']), 'Leader identity cannot be verified'
69
+ handles = []
70
+ try:
71
+ for member, observed in current:
72
+ try:
73
+ fd = os.pidfd_open(member)
74
+ except ProcessLookupError:
75
+ continue
76
+ handles.append(fd)
77
+ verified = stat(member)
78
+ assert verified is None or verified[1:] == observed[1:], 'Process identity changed during verification'
79
+ # Freeze the verified members before killing them to limit concurrent forks.
80
+ for fd in handles:
81
+ try:
82
+ signal.pidfd_send_signal(fd, signal.SIGSTOP)
83
+ except ProcessLookupError:
84
+ pass
85
+ for fd in handles:
86
+ try:
87
+ signal.pidfd_send_signal(fd, signal.SIGKILL)
88
+ except ProcessLookupError:
89
+ pass
90
+ finally:
91
+ for fd in handles:
92
+ os.close(fd)
93
+ deadline = time.monotonic() + 1
94
+ while members() and time.monotonic() < deadline:
95
+ time.sleep(0.02)
96
+ assert not members(), 'Host session cleanup remains unverified'
97
+ `;
98
+ export const cleanupHostServiceProcess = (identity) => {
99
+ if (process.platform !== 'linux' || !isHostServiceProcessIdentity(identity)) {
100
+ return false;
101
+ }
102
+ // Already-empty sessions need no external helper. Inspection errors are not
103
+ // absence proof; never fall back to numeric PID signaling after a restart.
104
+ try {
105
+ if (readFileSync('/proc/sys/kernel/random/boot_id', 'utf8').trim() !== identity.bootId
106
+ || readlinkSync('/proc/self/ns/pid') !== identity.pidNamespace) {
107
+ return false;
108
+ }
109
+ const mounts = readFileSync('/proc/self/mountinfo', 'utf8').split('\n');
110
+ if (mounts.some(line => {
111
+ const fields = line.split(' ');
112
+ return fields[4] === '/proc' && fields.at(-1)?.split(',').some(option => option.startsWith('hidepid=') && option !== 'hidepid=0');
113
+ })) {
114
+ return false;
115
+ }
116
+ const members = readdirSync('/proc').filter(entry => /^\d+$/.test(entry)).some(entry => {
117
+ try {
118
+ const stat = readFileSync(`/proc/${entry}/stat`, 'utf8');
119
+ const fields = stat.slice(stat.lastIndexOf(')') + 2).split(' ');
120
+ return (Number(fields[2]) === identity.pid || Number(fields[3]) === identity.pid) && !['Z', 'X'].includes(fields[0]);
121
+ }
122
+ catch (error) {
123
+ if (error.code === 'ENOENT') {
124
+ return false;
125
+ }
126
+ throw error;
127
+ }
128
+ });
129
+ if (!members) {
130
+ try {
131
+ process.kill(-identity.pid, 0);
132
+ }
133
+ catch (error) {
134
+ return error.code === 'ESRCH';
135
+ }
136
+ }
137
+ }
138
+ catch {
139
+ return false;
140
+ }
141
+ const result = spawnSync('python3', ['-I', '-c', cleanupScript, JSON.stringify(identity)], {
142
+ timeout: 2500,
143
+ maxBuffer: 16 * 1024,
144
+ stdio: ['ignore', 'pipe', 'pipe'],
145
+ });
146
+ if (result.error || result.status !== 0) {
147
+ return false;
148
+ }
149
+ // A procfs scan alone is not an atomic absence proof: a member could fork and
150
+ // exit during enumeration. Require the kernel's group-absence proof as well.
151
+ try {
152
+ process.kill(-identity.pid, 0);
153
+ return false;
154
+ }
155
+ catch (error) {
156
+ return error.code === 'ESRCH';
157
+ }
158
+ };
159
+ //# sourceMappingURL=hostServiceRecovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostServiceRecovery.js","sourceRoot":"","sources":["../../../server/lib/hostServiceRecovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { normalizeExecutionEnvironmentFailure } from './executionEnvironment.js';
2
+ import { prepareHostServiceProcessLaunch } from './serviceRuns.js';
3
+ // Wrap the service run's provider once: setup and every later service restart
4
+ // must record intent before spawning, not after an awaited placement observation.
5
+ export const withHostServiceRecovery = (provider, projectId, executionRunId) => {
6
+ if (provider.kind !== 'host') {
7
+ return provider;
8
+ }
9
+ return {
10
+ ...provider,
11
+ execute: request => {
12
+ const record = prepareHostServiceProcessLaunch(projectId, executionRunId);
13
+ const handle = provider.execute(request);
14
+ let recordingFailure = null;
15
+ if (handle.child.pid !== undefined) {
16
+ try {
17
+ record(handle.child.pid);
18
+ }
19
+ catch (error) {
20
+ // Return the handle even on persistence failure so the caller retains
21
+ // ownership and can clean the spawned process through its normal path.
22
+ recordingFailure = normalizeExecutionEnvironmentFailure('host', request.command, error);
23
+ }
24
+ }
25
+ return {
26
+ ...handle,
27
+ placementFailure: handle.placementFailure.then(failure => failure ?? recordingFailure),
28
+ };
29
+ },
30
+ };
31
+ };
32
+ //# sourceMappingURL=hostServiceRunProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostServiceRunProvider.js","sourceRoot":"","sources":["../../../server/lib/hostServiceRunProvider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oCAAoC,EAAE,MAAM,2BAA2B,CAAA;AAChF,OAAO,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,CAAA;AAElE,8EAA8E;AAC9E,kFAAkF;AAClF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,QAAsC,EACtC,SAAiB,EACjB,cAAsB,EACQ,EAAE;IAChC,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC7B,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,OAAO;QACL,GAAG,QAAQ;QACX,OAAO,EAAE,OAAO,CAAC,EAAE;YACjB,MAAM,MAAM,GAAG,+BAA+B,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;YACzE,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;YACxC,IAAI,gBAAgB,GAAmE,IAAI,CAAA;YAC3F,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;gBACnC,IAAI,CAAC;oBACH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;gBAC1B,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,sEAAsE;oBACtE,uEAAuE;oBACvE,gBAAgB,GAAG,oCAAoC,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;gBACzF,CAAC;YACH,CAAC;YACD,OAAO;gBACL,GAAG,MAAM;gBACT,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,IAAI,gBAAgB,CAAC;aACvF,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC,CAAA"}
@@ -172,10 +172,12 @@ const listSerializedProjects = async () => {
172
172
  return listProjects().map(serializeProject).filter(project => project !== null);
173
173
  };
174
174
  const getSerializedProjectSummary = async (projectId) => {
175
- const [{ default: db }, { getProjectById, serializeProject }, { getActiveRunStatusForProject }] = await Promise.all([
175
+ const { projectRunStatus } = await import('./runStatus.js');
176
+ const [{ default: db }, { getProjectById, serializeProject }, { getActiveRunStatusForProject, getLastRunStatusForProject }, { hasActiveProjectServiceRun }] = await Promise.all([
176
177
  import('../db.js'),
177
178
  import('./projects.js'),
178
179
  import('./run.js'),
180
+ import('./serviceRuns.js'),
179
181
  ]);
180
182
  const project = serializeProject(getProjectById(projectId));
181
183
  if (!project) {
@@ -198,6 +200,8 @@ const getSerializedProjectSummary = async (projectId) => {
198
200
  }
199
201
  const parkedRow = db.prepare('SELECT COUNT(*) AS count FROM tickets WHERE project_id = ? AND parked_at IS NOT NULL').get(projectId);
200
202
  const parked = Number(parkedRow?.count ?? 0);
203
+ const activeRun = getActiveRunStatusForProject(project.id);
204
+ const durableAuthority = hasActiveProjectServiceRun(project.id);
201
205
  return {
202
206
  project,
203
207
  tickets: {
@@ -207,7 +211,7 @@ const getSerializedProjectSummary = async (projectId) => {
207
211
  review: counts.review,
208
212
  parked,
209
213
  },
210
- active_run: getActiveRunStatusForProject(project.id),
214
+ ...projectRunStatus(activeRun, getLastRunStatusForProject(project.id), durableAuthority),
211
215
  };
212
216
  };
213
217
  const listMobileChatSessions = async (projectId) => {