@straiffi/archon 1.7.2 → 1.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/dist/client/assets/ActivityView-BgMz3NNT.js +1 -0
  2. package/dist/client/assets/GitHubActionsDialog-CNqWDS3E.js +1 -0
  3. package/dist/client/assets/TestsDialog-Cll7xJe0.js +4 -0
  4. package/dist/client/assets/{architectureDiagram-3BPJPVTR-Do9nbC8v.js → architectureDiagram-3BPJPVTR-BL5dYiul.js} +1 -1
  5. package/dist/client/assets/{blockDiagram-GPEHLZMM-DGGOLHF8.js → blockDiagram-GPEHLZMM-Bi5x2v80.js} +1 -1
  6. package/dist/client/assets/{c4Diagram-AAUBKEIU-Bz7tQybs.js → c4Diagram-AAUBKEIU-esEm54Ay.js} +1 -1
  7. package/dist/client/assets/channel-CqNHF3FD.js +1 -0
  8. package/dist/client/assets/{chunk-2J33WTMH-CJO-GmWJ.js → chunk-2J33WTMH-DACfY8xM.js} +1 -1
  9. package/dist/client/assets/{chunk-3OPIFGDE-DPAVagpC.js → chunk-3OPIFGDE-DZNUiaUs.js} +1 -1
  10. package/dist/client/assets/{chunk-5ZQYHXKU-Cof75Mu7.js → chunk-5ZQYHXKU-ClDfkMAp.js} +1 -1
  11. package/dist/client/assets/{chunk-727SXJPM-COuPqQ8_.js → chunk-727SXJPM-CCwA3GWT.js} +1 -1
  12. package/dist/client/assets/{chunk-AQP2D5EJ-CFj5KabW.js → chunk-AQP2D5EJ-Byl4DRZ9.js} +1 -1
  13. package/dist/client/assets/{chunk-CSCIHK7Q-C4M6w5cT.js → chunk-CSCIHK7Q-CXymZQ7A.js} +1 -1
  14. package/dist/client/assets/{chunk-KSCS5N6A-ByaiwVue.js → chunk-KSCS5N6A-VV3D8g6a.js} +1 -1
  15. package/dist/client/assets/{chunk-L5ZTLDWV-Cx5jeot9.js → chunk-L5ZTLDWV-BL9N5GRI.js} +1 -1
  16. package/dist/client/assets/{chunk-LZXEDZCA-DmGtztud.js → chunk-LZXEDZCA-DKNN-zno.js} +2 -2
  17. package/dist/client/assets/{chunk-ND2GUHAM-i3yuspqL.js → chunk-ND2GUHAM-CHCpQ1yr.js} +1 -1
  18. package/dist/client/assets/{chunk-NZK2D7GU-CQ4E_jP4.js → chunk-NZK2D7GU-B0Dm74mt.js} +1 -1
  19. package/dist/client/assets/{chunk-O5CBEL6O-D2g4VDCd.js → chunk-O5CBEL6O-DAa5z2xG.js} +1 -1
  20. package/dist/client/assets/{chunk-WU5MYG2G-exIu-zQ2.js → chunk-WU5MYG2G-DrVJWKVR.js} +1 -1
  21. package/dist/client/assets/classDiagram-4FO5ZUOK-BjEgQwKg.js +1 -0
  22. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-gGomH-F_.js +1 -0
  23. package/dist/client/assets/{dagre-BM42HDAG-DvF75yLZ.js → dagre-BM42HDAG-B0fsl8mE.js} +1 -1
  24. package/dist/client/assets/{diagram-2AECGRRQ-DFv0HxLL.js → diagram-2AECGRRQ-Cx_VEbSS.js} +1 -1
  25. package/dist/client/assets/{diagram-5GNKFQAL-C_LRir0-.js → diagram-5GNKFQAL-Cv7VVn5r.js} +1 -1
  26. package/dist/client/assets/{diagram-KO2AKTUF-DGZxRDRy.js → diagram-KO2AKTUF-C8Sl5czV.js} +1 -1
  27. package/dist/client/assets/{diagram-LMA3HP47-UXt0uti4.js → diagram-LMA3HP47-C3dZaLz2.js} +1 -1
  28. package/dist/client/assets/{diagram-OG6HWLK6-CFbZS4n5.js → diagram-OG6HWLK6-BAU9DtTr.js} +1 -1
  29. package/dist/client/assets/{erDiagram-TEJ5UH35-CfAwZDdf.js → erDiagram-TEJ5UH35-DpNc-eBD.js} +1 -1
  30. package/dist/client/assets/{flowDiagram-I6XJVG4X-Cdgi5z3n.js → flowDiagram-I6XJVG4X-DGwTAT1S.js} +1 -1
  31. package/dist/client/assets/{ganttDiagram-6RSMTGT7-DOrkFkhu.js → ganttDiagram-6RSMTGT7-MPZhEgzJ.js} +1 -1
  32. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-cEox0peD.js → gitGraphDiagram-PVQCEYII-CY0tHL5N.js} +1 -1
  33. package/dist/client/assets/index-CJRgmWwY.js +273 -0
  34. package/dist/client/assets/index-mRkJWu70.css +2 -0
  35. package/dist/client/assets/{infoDiagram-5YYISTIA-gm51u2Nn.js → infoDiagram-5YYISTIA-BBZeKjf4.js} +1 -1
  36. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-CjnoOIja.js → ishikawaDiagram-YF4QCWOH-CM_iFrES.js} +1 -1
  37. package/dist/client/assets/{journeyDiagram-JHISSGLW-Dlg4DsiO.js → journeyDiagram-JHISSGLW-Do_lY94X.js} +1 -1
  38. package/dist/client/assets/{kanban-definition-UN3LZRKU-BU0XZaSd.js → kanban-definition-UN3LZRKU-brxg3j37.js} +1 -1
  39. package/dist/client/assets/{line-Bert22-_.js → line-PHHbm9rj.js} +1 -1
  40. package/dist/client/assets/{mermaid-parser.core-BvQSGDmL.js → mermaid-parser.core-CLxAkW69.js} +1 -1
  41. package/dist/client/assets/{mermaid.core--qSAHJRj.js → mermaid.core-CebvSmx9.js} +3 -3
  42. package/dist/client/assets/{mindmap-definition-RKZ34NQL-BgFIvWWD.js → mindmap-definition-RKZ34NQL-CX_-ZaJF.js} +1 -1
  43. package/dist/client/assets/{pieDiagram-4H26LBE5-DGcbXD0M.js → pieDiagram-4H26LBE5-BJuHvql_.js} +1 -1
  44. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-ClkBUeia.js → quadrantDiagram-W4KKPZXB-DiJll7l9.js} +1 -1
  45. package/dist/client/assets/{requirementDiagram-4Y6WPE33-B8CwGToU.js → requirementDiagram-4Y6WPE33-Bg-tXgcj.js} +1 -1
  46. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-DTk3jL6B.js → sankeyDiagram-5OEKKPKP-BoK2egfZ.js} +1 -1
  47. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-BQVrcnKf.js → sequenceDiagram-3UESZ5HK-DcrDWNzv.js} +1 -1
  48. package/dist/client/assets/{stateDiagram-AJRCARHV-DD4yMZPB.js → stateDiagram-AJRCARHV-B995qt1S.js} +1 -1
  49. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-Dn8P7Sa1.js +1 -0
  50. package/dist/client/assets/{timeline-definition-PNZ67QCA-BnCBVqcd.js → timeline-definition-PNZ67QCA-DqSVAhqL.js} +1 -1
  51. package/dist/client/assets/{vennDiagram-CIIHVFJN-BDmLMNXS.js → vennDiagram-CIIHVFJN-D9wVraVY.js} +1 -1
  52. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-DSLuQiEv.js → wardleyDiagram-YWT4CUSO-CLff9zVd.js} +1 -1
  53. package/dist/client/assets/{xychartDiagram-2RQKCTM6-DAq_LA4r.js → xychartDiagram-2RQKCTM6-BuHUMMH2.js} +1 -1
  54. package/dist/client/index.html +2 -2
  55. package/dist/server/db.js +472 -39
  56. package/dist/server/db.js.map +1 -1
  57. package/dist/server/index.js +1311 -212
  58. package/dist/server/index.js.map +1 -1
  59. package/dist/server/lib/agent.js +228 -71
  60. package/dist/server/lib/agent.js.map +1 -1
  61. package/dist/server/lib/agentRuns.js +205 -38
  62. package/dist/server/lib/agentRuns.js.map +1 -1
  63. package/dist/server/lib/attachments.js +24 -0
  64. package/dist/server/lib/attachments.js.map +1 -1
  65. package/dist/server/lib/automationProgression.js +464 -0
  66. package/dist/server/lib/automationProgression.js.map +1 -0
  67. package/dist/server/lib/automationReconciliation.js +498 -0
  68. package/dist/server/lib/automationReconciliation.js.map +1 -0
  69. package/dist/server/lib/automationStageDetails.js +232 -0
  70. package/dist/server/lib/automationStageDetails.js.map +1 -0
  71. package/dist/server/lib/buildOpenQuestionOperations.js +238 -0
  72. package/dist/server/lib/buildOpenQuestionOperations.js.map +1 -0
  73. package/dist/server/lib/buildOpenQuestions.js +44 -0
  74. package/dist/server/lib/buildOpenQuestions.js.map +1 -1
  75. package/dist/server/lib/buildSequences.js +130 -46
  76. package/dist/server/lib/buildSequences.js.map +1 -1
  77. package/dist/server/lib/bundleReviewOperations.js +91 -9
  78. package/dist/server/lib/bundleReviewOperations.js.map +1 -1
  79. package/dist/server/lib/chatOperations.js +67 -12
  80. package/dist/server/lib/chatOperations.js.map +1 -1
  81. package/dist/server/lib/executionReconciliation.js +518 -0
  82. package/dist/server/lib/executionReconciliation.js.map +1 -0
  83. package/dist/server/lib/executionRetry.js +694 -0
  84. package/dist/server/lib/executionRetry.js.map +1 -0
  85. package/dist/server/lib/executionRetryContext.js +489 -0
  86. package/dist/server/lib/executionRetryContext.js.map +1 -0
  87. package/dist/server/lib/executionRetryPredicates.js +74 -0
  88. package/dist/server/lib/executionRetryPredicates.js.map +1 -0
  89. package/dist/server/lib/executionRunRetention.js +141 -0
  90. package/dist/server/lib/executionRunRetention.js.map +1 -0
  91. package/dist/server/lib/executionRuns.js +1367 -0
  92. package/dist/server/lib/executionRuns.js.map +1 -0
  93. package/dist/server/lib/executionTimeline.js +45 -0
  94. package/dist/server/lib/executionTimeline.js.map +1 -0
  95. package/dist/server/lib/git.js +385 -6
  96. package/dist/server/lib/git.js.map +1 -1
  97. package/dist/server/lib/integrations/github.js +43 -0
  98. package/dist/server/lib/integrations/github.js.map +1 -1
  99. package/dist/server/lib/integrations/githubActions.js +1 -0
  100. package/dist/server/lib/integrations/githubActions.js.map +1 -1
  101. package/dist/server/lib/integrations/githubActionsSessions.js +337 -114
  102. package/dist/server/lib/integrations/githubActionsSessions.js.map +1 -1
  103. package/dist/server/lib/projectMemorySelections.js +7 -3
  104. package/dist/server/lib/projectMemorySelections.js.map +1 -1
  105. package/dist/server/lib/shutdown.js +2 -2
  106. package/dist/server/lib/shutdown.js.map +1 -1
  107. package/dist/server/lib/specArtifact.js +3 -0
  108. package/dist/server/lib/specArtifact.js.map +1 -1
  109. package/dist/server/lib/specFormatting.js +1 -1
  110. package/dist/server/lib/specFormatting.js.map +1 -1
  111. package/dist/server/lib/specOperations.js +78 -12
  112. package/dist/server/lib/specOperations.js.map +1 -1
  113. package/dist/server/lib/specReviewContext.js +54 -18
  114. package/dist/server/lib/specReviewContext.js.map +1 -1
  115. package/dist/server/lib/specReviewDraft.js +3 -2
  116. package/dist/server/lib/specReviewDraft.js.map +1 -1
  117. package/dist/server/lib/specReviewOperations.js +74 -9
  118. package/dist/server/lib/specReviewOperations.js.map +1 -1
  119. package/dist/server/lib/specReviewValidation.js +217 -0
  120. package/dist/server/lib/specReviewValidation.js.map +1 -0
  121. package/dist/server/lib/specReviews.js +30 -2
  122. package/dist/server/lib/specReviews.js.map +1 -1
  123. package/dist/server/lib/specs.js +18 -1
  124. package/dist/server/lib/specs.js.map +1 -1
  125. package/dist/server/lib/stageSnapshots.js +197 -0
  126. package/dist/server/lib/stageSnapshots.js.map +1 -0
  127. package/dist/server/lib/testSessions.js +160 -18
  128. package/dist/server/lib/testSessions.js.map +1 -1
  129. package/dist/server/lib/ticketAutomation.js +80 -4
  130. package/dist/server/lib/ticketAutomation.js.map +1 -1
  131. package/dist/server/lib/ticketAutomationCommit.js +466 -91
  132. package/dist/server/lib/ticketAutomationCommit.js.map +1 -1
  133. package/dist/server/lib/ticketFollowUpOperations.js +270 -29
  134. package/dist/server/lib/ticketFollowUpOperations.js.map +1 -1
  135. package/dist/server/lib/ticketMessages.js +16 -0
  136. package/dist/server/lib/ticketMessages.js.map +1 -1
  137. package/dist/server/lib/ticketRunOperations.js +51 -6
  138. package/dist/server/lib/ticketRunOperations.js.map +1 -1
  139. package/dist/server/lib/ticketUndo.js +77 -168
  140. package/dist/server/lib/ticketUndo.js.map +1 -1
  141. package/dist/server/lib/ticketWorkflowOperations.js +132 -28
  142. package/dist/server/lib/ticketWorkflowOperations.js.map +1 -1
  143. package/dist/server/lib/tickets.js +41 -27
  144. package/dist/server/lib/tickets.js.map +1 -1
  145. package/dist/server/lib/transcriptRuns.js +3 -3
  146. package/dist/server/lib/transcriptRuns.js.map +1 -1
  147. package/dist/server/lib/turnExecutionErrors.js +12 -0
  148. package/dist/server/lib/turnExecutionErrors.js.map +1 -0
  149. package/dist/server/lib/types.js +58 -1
  150. package/dist/server/lib/types.js.map +1 -1
  151. package/dist/server/workers/build.js +596 -184
  152. package/dist/server/workers/build.js.map +1 -1
  153. package/dist/server/workers/chat.js +269 -132
  154. package/dist/server/workers/chat.js.map +1 -1
  155. package/dist/server/workers/followUp.js +731 -203
  156. package/dist/server/workers/followUp.js.map +1 -1
  157. package/dist/server/workers/plan.js +546 -188
  158. package/dist/server/workers/plan.js.map +1 -1
  159. package/dist/server/workers/planFollowUp.js +240 -75
  160. package/dist/server/workers/planFollowUp.js.map +1 -1
  161. package/dist/server/workers/review.js +790 -297
  162. package/dist/server/workers/review.js.map +1 -1
  163. package/dist/server/workers/specReview.js +212 -46
  164. package/dist/server/workers/specReview.js.map +1 -1
  165. package/dist/server/workers/specSession.js +434 -254
  166. package/dist/server/workers/specSession.js.map +1 -1
  167. package/package.json +1 -1
  168. package/dist/client/assets/GitHubActionsDialog-DAD5REmY.js +0 -1
  169. package/dist/client/assets/TestsDialog-B5NVrroq.js +0 -4
  170. package/dist/client/assets/TicketChangesModal-By-_gTGd.js +0 -1
  171. package/dist/client/assets/channel-Dd5Len0X.js +0 -1
  172. package/dist/client/assets/classDiagram-4FO5ZUOK-B7KUg6r8.js +0 -1
  173. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CQm-z5c4.js +0 -1
  174. package/dist/client/assets/index-BHq6-Eir.js +0 -270
  175. package/dist/client/assets/index-BxTc5qQT.css +0 -2
  176. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-C8yO6POT.js +0 -1
@@ -0,0 +1,74 @@
1
+ export const RETRYABLE_AGENT_STATUSES = new Set(['failed', 'interrupted']);
2
+ export const RETRYABLE_TEST_STATUSES = new Set(['failed', 'cancelled', 'interrupted']);
3
+ export const RETRYABLE_EXECUTION_KINDS = new Set([
4
+ 'test',
5
+ 'plan',
6
+ 'build',
7
+ 'review',
8
+ 'build_follow_up',
9
+ 'plan_follow_up',
10
+ 'chat_turn',
11
+ 'spec_turn',
12
+ 'spec_review',
13
+ ]);
14
+ export const LATER_RUN_SUPERSEDED_KINDS = new Set([
15
+ 'plan',
16
+ 'build',
17
+ 'review',
18
+ 'build_follow_up',
19
+ 'plan_follow_up',
20
+ 'chat_turn',
21
+ 'spec_turn',
22
+ ]);
23
+ export const isLaterRunSupersededKind = (kind) => LATER_RUN_SUPERSEDED_KINDS.has(kind);
24
+ export const isRetryableExecutionStatus = (kind, status) => ((kind === 'test' ? RETRYABLE_TEST_STATUSES : RETRYABLE_AGENT_STATUSES).has(status));
25
+ export const parseExecutionRetryTestSelection = (value) => {
26
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
27
+ return null;
28
+ }
29
+ const selection = value;
30
+ if (selection.kind === 'all') {
31
+ return { kind: 'all' };
32
+ }
33
+ if (selection.kind === 'file' && typeof selection.path === 'string') {
34
+ return { kind: 'file', path: selection.path };
35
+ }
36
+ if (selection.kind === 'case' && typeof selection.path === 'string' && typeof selection.name === 'string') {
37
+ return { kind: 'case', path: selection.path, name: selection.name };
38
+ }
39
+ return null;
40
+ };
41
+ export const resolveExecutionRetryRunConfig = (source) => {
42
+ const tool = source.metadata?.retry_tool;
43
+ const model = source.metadata?.retry_model;
44
+ const variant = source.metadata?.retry_variant;
45
+ const skills = source.metadata?.retry_skills;
46
+ if ((tool !== 'opencode' && tool !== 'claude')
47
+ || (model !== null && typeof model !== 'string')
48
+ || (variant !== null && typeof variant !== 'string')
49
+ || !Array.isArray(skills)
50
+ || skills.some(skill => typeof skill !== 'string')) {
51
+ return null;
52
+ }
53
+ return { tool: tool, model, variant, skills: skills };
54
+ };
55
+ export const resolveExecutionRetrySessionMode = (source) => {
56
+ const mode = source.metadata?.retry_mode;
57
+ if (source.kind === 'chat_turn') {
58
+ return mode === 'plan' || mode === 'build' ? mode : null;
59
+ }
60
+ if (source.kind === 'spec_turn') {
61
+ return mode === 'standard' || mode === 'grill' ? mode : null;
62
+ }
63
+ return null;
64
+ };
65
+ export const hasExecutionRetryAutomationOwnership = ({ source, parentKind, automationPausedStageRunId, }) => {
66
+ if (source.initiated_by !== 'user' || source.metadata?.build_open_question_batch_id) {
67
+ return true;
68
+ }
69
+ if (source.parent_run_id && (parentKind === 'automation_progression' || parentKind === 'automation_review_fix')) {
70
+ return true;
71
+ }
72
+ return automationPausedStageRunId === source.id;
73
+ };
74
+ //# sourceMappingURL=executionRetryPredicates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executionRetryPredicates.js","sourceRoot":"","sources":["../../../server/lib/executionRetryPredicates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,141 @@
1
+ import db from '../db.js';
2
+ export const DEFAULT_EXECUTION_EVIDENCE_RETENTION_DAYS = 30;
3
+ export const MAX_EXECUTION_EVIDENCE_RETENTION_DAYS = 36_500;
4
+ export const DEFAULT_EXECUTION_EVIDENCE_CLEANUP_BATCH_SIZE = 100;
5
+ export const DEFAULT_EXECUTION_EVIDENCE_CLEANUP_MAX_BATCHES = 100;
6
+ export const EXECUTION_EVIDENCE_CLEANUP_INTERVAL_MS = 6 * 60 * 60 * 1000;
7
+ export const resolveExecutionEvidenceRetentionDays = (value = process.env.ARCHON_EXECUTION_EVIDENCE_RETENTION_DAYS) => {
8
+ if (value === undefined || value.trim() === '') {
9
+ return DEFAULT_EXECUTION_EVIDENCE_RETENTION_DAYS;
10
+ }
11
+ const normalized = value.trim();
12
+ if (!/^[1-9]\d*$/.test(normalized)) {
13
+ return DEFAULT_EXECUTION_EVIDENCE_RETENTION_DAYS;
14
+ }
15
+ const days = Number(normalized);
16
+ const cutoff = new Date(Date.now() - days * 24 * 60 * 60 * 1000);
17
+ return Number.isSafeInteger(days)
18
+ && days <= MAX_EXECUTION_EVIDENCE_RETENTION_DAYS
19
+ && !Number.isNaN(cutoff.getTime())
20
+ ? days
21
+ : DEFAULT_EXECUTION_EVIDENCE_RETENTION_DAYS;
22
+ };
23
+ const cleanupTransaction = db.transaction((cutoff, expiredAt, batchSize) => {
24
+ const candidates = db.prepare(`
25
+ SELECT kind, execution_run_id, retention_date
26
+ FROM (
27
+ SELECT
28
+ 'test_output' AS kind,
29
+ td.execution_run_id,
30
+ COALESCE(er.completed_at, er.updated_at, er.created_at) AS retention_date
31
+ FROM test_execution_details td
32
+ JOIN execution_runs er ON er.id = td.execution_run_id
33
+ WHERE er.status IN ('completed', 'failed', 'cancelled', 'interrupted')
34
+ AND td.output_retention_state = 'retained'
35
+ AND td.output <> ''
36
+ AND julianday(COALESCE(er.completed_at, er.updated_at, er.created_at)) <= julianday(?)
37
+
38
+ UNION ALL
39
+
40
+ SELECT
41
+ 'github_jobs' AS kind,
42
+ ga.execution_run_id,
43
+ COALESCE(er.completed_at, er.updated_at, er.created_at) AS retention_date
44
+ FROM github_actions_run_details ga
45
+ JOIN execution_runs er ON er.id = ga.execution_run_id
46
+ WHERE er.status IN ('completed', 'failed', 'cancelled', 'interrupted')
47
+ AND ga.jobs_retention_state = 'retained'
48
+ AND ga.jobs_json IS NOT NULL
49
+ AND trim(ga.jobs_json) NOT IN ('', '[]')
50
+ AND julianday(COALESCE(er.completed_at, er.updated_at, er.created_at)) <= julianday(?)
51
+ )
52
+ ORDER BY retention_date ASC, execution_run_id ASC, kind ASC
53
+ LIMIT ?
54
+ `).all(cutoff, cutoff, batchSize);
55
+ let testOutput = 0;
56
+ let githubJobs = 0;
57
+ for (const candidate of candidates) {
58
+ if (candidate.kind === 'test_output') {
59
+ testOutput += db.prepare(`
60
+ UPDATE test_execution_details
61
+ SET output_byte_count = COALESCE(output_byte_count, length(CAST(output AS BLOB))),
62
+ output = '', output_retention_state = 'expired', output_expired_at = ?
63
+ WHERE execution_run_id = ?
64
+ AND output_retention_state = 'retained'
65
+ AND output <> ''
66
+ AND EXISTS (
67
+ SELECT 1 FROM execution_runs er
68
+ WHERE er.id = test_execution_details.execution_run_id
69
+ AND er.status IN ('completed', 'failed', 'cancelled', 'interrupted')
70
+ AND julianday(COALESCE(er.completed_at, er.updated_at, er.created_at)) <= julianday(?)
71
+ )
72
+ `).run(expiredAt, candidate.execution_run_id, cutoff).changes;
73
+ continue;
74
+ }
75
+ const row = db.prepare('SELECT jobs_json, jobs_count FROM github_actions_run_details WHERE execution_run_id = ?')
76
+ .get(candidate.execution_run_id);
77
+ let jobsCount = row?.jobs_count ?? 0;
78
+ if (row?.jobs_count === null && row.jobs_json) {
79
+ try {
80
+ const jobs = JSON.parse(row.jobs_json);
81
+ jobsCount = Array.isArray(jobs) ? jobs.length : 0;
82
+ }
83
+ catch {
84
+ jobsCount = 0;
85
+ }
86
+ }
87
+ githubJobs += db.prepare(`
88
+ UPDATE github_actions_run_details
89
+ SET jobs_count = ?, jobs_json = NULL, jobs_retention_state = 'expired', jobs_expired_at = ?
90
+ WHERE execution_run_id = ?
91
+ AND jobs_retention_state = 'retained'
92
+ AND jobs_json IS NOT NULL
93
+ AND trim(jobs_json) NOT IN ('', '[]')
94
+ AND EXISTS (
95
+ SELECT 1 FROM execution_runs er
96
+ WHERE er.id = github_actions_run_details.execution_run_id
97
+ AND er.status IN ('completed', 'failed', 'cancelled', 'interrupted')
98
+ AND julianday(COALESCE(er.completed_at, er.updated_at, er.created_at)) <= julianday(?)
99
+ )
100
+ `).run(jobsCount, expiredAt, candidate.execution_run_id, cutoff).changes;
101
+ }
102
+ return {
103
+ test_output: testOutput,
104
+ github_jobs: githubJobs,
105
+ total: testOutput + githubJobs,
106
+ };
107
+ });
108
+ export const cleanupExecutionEvidence = ({ batchSize = DEFAULT_EXECUTION_EVIDENCE_CLEANUP_BATCH_SIZE, now = new Date(), retentionDays = DEFAULT_EXECUTION_EVIDENCE_RETENTION_DAYS, } = {}) => {
109
+ if (!Number.isSafeInteger(batchSize) || batchSize < 1 || batchSize > 1_000) {
110
+ throw new Error('Execution evidence cleanup batch size must be between 1 and 1000');
111
+ }
112
+ if (!Number.isSafeInteger(retentionDays) || retentionDays < 1 || retentionDays > MAX_EXECUTION_EVIDENCE_RETENTION_DAYS) {
113
+ throw new Error(`Execution evidence retention days must be between 1 and ${MAX_EXECUTION_EVIDENCE_RETENTION_DAYS}`);
114
+ }
115
+ if (Number.isNaN(now.getTime())) {
116
+ throw new Error('Execution evidence cleanup time must be valid');
117
+ }
118
+ const cutoffDate = new Date(now.getTime() - retentionDays * 24 * 60 * 60 * 1000);
119
+ if (Number.isNaN(cutoffDate.getTime())) {
120
+ throw new Error('Execution evidence retention cutoff must be valid');
121
+ }
122
+ const cutoff = cutoffDate.toISOString();
123
+ return cleanupTransaction(cutoff, now.toISOString(), batchSize);
124
+ };
125
+ export const cleanupAllExecutionEvidence = ({ batchSize = DEFAULT_EXECUTION_EVIDENCE_CLEANUP_BATCH_SIZE, maxBatches = DEFAULT_EXECUTION_EVIDENCE_CLEANUP_MAX_BATCHES, now = new Date(), retentionDays = DEFAULT_EXECUTION_EVIDENCE_RETENTION_DAYS, } = {}) => {
126
+ if (!Number.isSafeInteger(maxBatches) || maxBatches < 1 || maxBatches > 1_000) {
127
+ throw new Error('Execution evidence cleanup max batches must be between 1 and 1000');
128
+ }
129
+ const total = { test_output: 0, github_jobs: 0, total: 0 };
130
+ for (let batch = 0; batch < maxBatches; batch += 1) {
131
+ const result = cleanupExecutionEvidence({ batchSize, now, retentionDays });
132
+ total.test_output += result.test_output;
133
+ total.github_jobs += result.github_jobs;
134
+ total.total += result.total;
135
+ if (result.total === 0) {
136
+ break;
137
+ }
138
+ }
139
+ return total;
140
+ };
141
+ //# sourceMappingURL=executionRunRetention.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executionRunRetention.js","sourceRoot":"","sources":["../../../server/lib/executionRunRetention.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAA;AAEzB,MAAM,CAAC,MAAM,yCAAyC,GAAG,EAAE,CAAA;AAC3D,MAAM,CAAC,MAAM,qCAAqC,GAAG,MAAM,CAAA;AAC3D,MAAM,CAAC,MAAM,6CAA6C,GAAG,GAAG,CAAA;AAChE,MAAM,CAAC,MAAM,8CAA8C,GAAG,GAAG,CAAA;AACjE,MAAM,CAAC,MAAM,sCAAsC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;AA0BxE,MAAM,CAAC,MAAM,qCAAqC,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,wCAAwC,EAAE,EAAE;IACpH,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC/C,OAAO,yCAAyC,CAAA;IAClD,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IAC/B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,OAAO,yCAAyC,CAAA;IAClD,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA;IAC/B,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;IAChE,OAAO,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;WAC5B,IAAI,IAAI,qCAAqC;WAC7C,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAClC,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,yCAAyC,CAAA;AAC/C,CAAC,CAAA;AAED,MAAM,kBAAkB,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,MAAc,EAAE,SAAiB,EAAE,SAAiB,EAAE,EAAE;IACjG,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8B7B,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAuB,CAAA;IAEvD,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,SAAS,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACrC,UAAU,IAAI,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;OAaxB,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,OAAO,CAAA;YAC7D,SAAQ;QACV,CAAC;QAED,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,yFAAyF,CAAC;aAC9G,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAwE,CAAA;QACzG,IAAI,SAAS,GAAG,GAAG,EAAE,UAAU,IAAI,CAAC,CAAA;QACpC,IAAI,GAAG,EAAE,UAAU,KAAK,IAAI,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAC9C,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAY,CAAA;gBACjD,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;YACnD,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS,GAAG,CAAC,CAAA;YACf,CAAC;QACH,CAAC;QACD,UAAU,IAAI,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;KAaxB,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,OAAO,CAAA;IAC1E,CAAC;IAED,OAAO;QACL,WAAW,EAAE,UAAU;QACvB,WAAW,EAAE,UAAU;QACvB,KAAK,EAAE,UAAU,GAAG,UAAU;KAC/B,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,EACvC,SAAS,GAAG,6CAA6C,EACzD,GAAG,GAAG,IAAI,IAAI,EAAE,EAChB,aAAa,GAAG,yCAAyC,MACtB,EAAE,EAAkC,EAAE;IACzE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,KAAK,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAA;IACrF,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,aAAa,GAAG,CAAC,IAAI,aAAa,GAAG,qCAAqC,EAAE,CAAC;QACvH,MAAM,IAAI,KAAK,CAAC,2DAA2D,qCAAqC,EAAE,CAAC,CAAA;IACrH,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;IAClE,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;IAChF,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;IACtE,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,EAAE,CAAA;IACvC,OAAO,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,SAAS,CAAC,CAAA;AACjE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,EAC1C,SAAS,GAAG,6CAA6C,EACzD,UAAU,GAAG,8CAA8C,EAC3D,GAAG,GAAG,IAAI,IAAI,EAAE,EAChB,aAAa,GAAG,yCAAyC,MACnB,EAAE,EAAkC,EAAE;IAC5E,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,KAAK,EAAE,CAAC;QAC9E,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAA;IACtF,CAAC;IAED,MAAM,KAAK,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAA;IAC1D,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,wBAAwB,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAA;QAC1E,KAAK,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAA;QACvC,KAAK,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAA;QACvC,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAA;QAC3B,IAAI,MAAM,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YACvB,MAAK;QACP,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA"}