@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.
- package/dist/client/assets/ActivityView-BgMz3NNT.js +1 -0
- package/dist/client/assets/GitHubActionsDialog-CNqWDS3E.js +1 -0
- package/dist/client/assets/TestsDialog-Cll7xJe0.js +4 -0
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-Do9nbC8v.js → architectureDiagram-3BPJPVTR-BL5dYiul.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-DGGOLHF8.js → blockDiagram-GPEHLZMM-Bi5x2v80.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-Bz7tQybs.js → c4Diagram-AAUBKEIU-esEm54Ay.js} +1 -1
- package/dist/client/assets/channel-CqNHF3FD.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-CJO-GmWJ.js → chunk-2J33WTMH-DACfY8xM.js} +1 -1
- package/dist/client/assets/{chunk-3OPIFGDE-DPAVagpC.js → chunk-3OPIFGDE-DZNUiaUs.js} +1 -1
- package/dist/client/assets/{chunk-5ZQYHXKU-Cof75Mu7.js → chunk-5ZQYHXKU-ClDfkMAp.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-COuPqQ8_.js → chunk-727SXJPM-CCwA3GWT.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-CFj5KabW.js → chunk-AQP2D5EJ-Byl4DRZ9.js} +1 -1
- package/dist/client/assets/{chunk-CSCIHK7Q-C4M6w5cT.js → chunk-CSCIHK7Q-CXymZQ7A.js} +1 -1
- package/dist/client/assets/{chunk-KSCS5N6A-ByaiwVue.js → chunk-KSCS5N6A-VV3D8g6a.js} +1 -1
- package/dist/client/assets/{chunk-L5ZTLDWV-Cx5jeot9.js → chunk-L5ZTLDWV-BL9N5GRI.js} +1 -1
- package/dist/client/assets/{chunk-LZXEDZCA-DmGtztud.js → chunk-LZXEDZCA-DKNN-zno.js} +2 -2
- package/dist/client/assets/{chunk-ND2GUHAM-i3yuspqL.js → chunk-ND2GUHAM-CHCpQ1yr.js} +1 -1
- package/dist/client/assets/{chunk-NZK2D7GU-CQ4E_jP4.js → chunk-NZK2D7GU-B0Dm74mt.js} +1 -1
- package/dist/client/assets/{chunk-O5CBEL6O-D2g4VDCd.js → chunk-O5CBEL6O-DAa5z2xG.js} +1 -1
- package/dist/client/assets/{chunk-WU5MYG2G-exIu-zQ2.js → chunk-WU5MYG2G-DrVJWKVR.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-BjEgQwKg.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-gGomH-F_.js +1 -0
- package/dist/client/assets/{dagre-BM42HDAG-DvF75yLZ.js → dagre-BM42HDAG-B0fsl8mE.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-DFv0HxLL.js → diagram-2AECGRRQ-Cx_VEbSS.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-C_LRir0-.js → diagram-5GNKFQAL-Cv7VVn5r.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-DGZxRDRy.js → diagram-KO2AKTUF-C8Sl5czV.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-UXt0uti4.js → diagram-LMA3HP47-C3dZaLz2.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-CFbZS4n5.js → diagram-OG6HWLK6-BAU9DtTr.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-CfAwZDdf.js → erDiagram-TEJ5UH35-DpNc-eBD.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-Cdgi5z3n.js → flowDiagram-I6XJVG4X-DGwTAT1S.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-DOrkFkhu.js → ganttDiagram-6RSMTGT7-MPZhEgzJ.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-cEox0peD.js → gitGraphDiagram-PVQCEYII-CY0tHL5N.js} +1 -1
- package/dist/client/assets/index-CJRgmWwY.js +273 -0
- package/dist/client/assets/index-mRkJWu70.css +2 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-gm51u2Nn.js → infoDiagram-5YYISTIA-BBZeKjf4.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-CjnoOIja.js → ishikawaDiagram-YF4QCWOH-CM_iFrES.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-Dlg4DsiO.js → journeyDiagram-JHISSGLW-Do_lY94X.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-BU0XZaSd.js → kanban-definition-UN3LZRKU-brxg3j37.js} +1 -1
- package/dist/client/assets/{line-Bert22-_.js → line-PHHbm9rj.js} +1 -1
- package/dist/client/assets/{mermaid-parser.core-BvQSGDmL.js → mermaid-parser.core-CLxAkW69.js} +1 -1
- package/dist/client/assets/{mermaid.core--qSAHJRj.js → mermaid.core-CebvSmx9.js} +3 -3
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-BgFIvWWD.js → mindmap-definition-RKZ34NQL-CX_-ZaJF.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-DGcbXD0M.js → pieDiagram-4H26LBE5-BJuHvql_.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-ClkBUeia.js → quadrantDiagram-W4KKPZXB-DiJll7l9.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-B8CwGToU.js → requirementDiagram-4Y6WPE33-Bg-tXgcj.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-DTk3jL6B.js → sankeyDiagram-5OEKKPKP-BoK2egfZ.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-BQVrcnKf.js → sequenceDiagram-3UESZ5HK-DcrDWNzv.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-DD4yMZPB.js → stateDiagram-AJRCARHV-B995qt1S.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-Dn8P7Sa1.js +1 -0
- package/dist/client/assets/{timeline-definition-PNZ67QCA-BnCBVqcd.js → timeline-definition-PNZ67QCA-DqSVAhqL.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-BDmLMNXS.js → vennDiagram-CIIHVFJN-D9wVraVY.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-DSLuQiEv.js → wardleyDiagram-YWT4CUSO-CLff9zVd.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-DAq_LA4r.js → xychartDiagram-2RQKCTM6-BuHUMMH2.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/server/db.js +472 -39
- package/dist/server/db.js.map +1 -1
- package/dist/server/index.js +1311 -212
- package/dist/server/index.js.map +1 -1
- package/dist/server/lib/agent.js +228 -71
- package/dist/server/lib/agent.js.map +1 -1
- package/dist/server/lib/agentRuns.js +205 -38
- package/dist/server/lib/agentRuns.js.map +1 -1
- package/dist/server/lib/attachments.js +24 -0
- package/dist/server/lib/attachments.js.map +1 -1
- package/dist/server/lib/automationProgression.js +464 -0
- package/dist/server/lib/automationProgression.js.map +1 -0
- package/dist/server/lib/automationReconciliation.js +498 -0
- package/dist/server/lib/automationReconciliation.js.map +1 -0
- package/dist/server/lib/automationStageDetails.js +232 -0
- package/dist/server/lib/automationStageDetails.js.map +1 -0
- package/dist/server/lib/buildOpenQuestionOperations.js +238 -0
- package/dist/server/lib/buildOpenQuestionOperations.js.map +1 -0
- package/dist/server/lib/buildOpenQuestions.js +44 -0
- package/dist/server/lib/buildOpenQuestions.js.map +1 -1
- package/dist/server/lib/buildSequences.js +130 -46
- package/dist/server/lib/buildSequences.js.map +1 -1
- package/dist/server/lib/bundleReviewOperations.js +91 -9
- package/dist/server/lib/bundleReviewOperations.js.map +1 -1
- package/dist/server/lib/chatOperations.js +67 -12
- package/dist/server/lib/chatOperations.js.map +1 -1
- package/dist/server/lib/executionReconciliation.js +518 -0
- package/dist/server/lib/executionReconciliation.js.map +1 -0
- package/dist/server/lib/executionRetry.js +694 -0
- package/dist/server/lib/executionRetry.js.map +1 -0
- package/dist/server/lib/executionRetryContext.js +489 -0
- package/dist/server/lib/executionRetryContext.js.map +1 -0
- package/dist/server/lib/executionRetryPredicates.js +74 -0
- package/dist/server/lib/executionRetryPredicates.js.map +1 -0
- package/dist/server/lib/executionRunRetention.js +141 -0
- package/dist/server/lib/executionRunRetention.js.map +1 -0
- package/dist/server/lib/executionRuns.js +1367 -0
- package/dist/server/lib/executionRuns.js.map +1 -0
- package/dist/server/lib/executionTimeline.js +45 -0
- package/dist/server/lib/executionTimeline.js.map +1 -0
- package/dist/server/lib/git.js +385 -6
- package/dist/server/lib/git.js.map +1 -1
- package/dist/server/lib/integrations/github.js +43 -0
- package/dist/server/lib/integrations/github.js.map +1 -1
- package/dist/server/lib/integrations/githubActions.js +1 -0
- package/dist/server/lib/integrations/githubActions.js.map +1 -1
- package/dist/server/lib/integrations/githubActionsSessions.js +337 -114
- package/dist/server/lib/integrations/githubActionsSessions.js.map +1 -1
- package/dist/server/lib/projectMemorySelections.js +7 -3
- package/dist/server/lib/projectMemorySelections.js.map +1 -1
- package/dist/server/lib/shutdown.js +2 -2
- package/dist/server/lib/shutdown.js.map +1 -1
- package/dist/server/lib/specArtifact.js +3 -0
- package/dist/server/lib/specArtifact.js.map +1 -1
- package/dist/server/lib/specFormatting.js +1 -1
- package/dist/server/lib/specFormatting.js.map +1 -1
- package/dist/server/lib/specOperations.js +78 -12
- package/dist/server/lib/specOperations.js.map +1 -1
- package/dist/server/lib/specReviewContext.js +54 -18
- package/dist/server/lib/specReviewContext.js.map +1 -1
- package/dist/server/lib/specReviewDraft.js +3 -2
- package/dist/server/lib/specReviewDraft.js.map +1 -1
- package/dist/server/lib/specReviewOperations.js +74 -9
- package/dist/server/lib/specReviewOperations.js.map +1 -1
- package/dist/server/lib/specReviewValidation.js +217 -0
- package/dist/server/lib/specReviewValidation.js.map +1 -0
- package/dist/server/lib/specReviews.js +30 -2
- package/dist/server/lib/specReviews.js.map +1 -1
- package/dist/server/lib/specs.js +18 -1
- package/dist/server/lib/specs.js.map +1 -1
- package/dist/server/lib/stageSnapshots.js +197 -0
- package/dist/server/lib/stageSnapshots.js.map +1 -0
- package/dist/server/lib/testSessions.js +160 -18
- package/dist/server/lib/testSessions.js.map +1 -1
- package/dist/server/lib/ticketAutomation.js +80 -4
- package/dist/server/lib/ticketAutomation.js.map +1 -1
- package/dist/server/lib/ticketAutomationCommit.js +466 -91
- package/dist/server/lib/ticketAutomationCommit.js.map +1 -1
- package/dist/server/lib/ticketFollowUpOperations.js +270 -29
- package/dist/server/lib/ticketFollowUpOperations.js.map +1 -1
- package/dist/server/lib/ticketMessages.js +16 -0
- package/dist/server/lib/ticketMessages.js.map +1 -1
- package/dist/server/lib/ticketRunOperations.js +51 -6
- package/dist/server/lib/ticketRunOperations.js.map +1 -1
- package/dist/server/lib/ticketUndo.js +77 -168
- package/dist/server/lib/ticketUndo.js.map +1 -1
- package/dist/server/lib/ticketWorkflowOperations.js +132 -28
- package/dist/server/lib/ticketWorkflowOperations.js.map +1 -1
- package/dist/server/lib/tickets.js +41 -27
- package/dist/server/lib/tickets.js.map +1 -1
- package/dist/server/lib/transcriptRuns.js +3 -3
- package/dist/server/lib/transcriptRuns.js.map +1 -1
- package/dist/server/lib/turnExecutionErrors.js +12 -0
- package/dist/server/lib/turnExecutionErrors.js.map +1 -0
- package/dist/server/lib/types.js +58 -1
- package/dist/server/lib/types.js.map +1 -1
- package/dist/server/workers/build.js +596 -184
- package/dist/server/workers/build.js.map +1 -1
- package/dist/server/workers/chat.js +269 -132
- package/dist/server/workers/chat.js.map +1 -1
- package/dist/server/workers/followUp.js +731 -203
- package/dist/server/workers/followUp.js.map +1 -1
- package/dist/server/workers/plan.js +546 -188
- package/dist/server/workers/plan.js.map +1 -1
- package/dist/server/workers/planFollowUp.js +240 -75
- package/dist/server/workers/planFollowUp.js.map +1 -1
- package/dist/server/workers/review.js +790 -297
- package/dist/server/workers/review.js.map +1 -1
- package/dist/server/workers/specReview.js +212 -46
- package/dist/server/workers/specReview.js.map +1 -1
- package/dist/server/workers/specSession.js +434 -254
- package/dist/server/workers/specSession.js.map +1 -1
- package/package.json +1 -1
- package/dist/client/assets/GitHubActionsDialog-DAD5REmY.js +0 -1
- package/dist/client/assets/TestsDialog-B5NVrroq.js +0 -4
- package/dist/client/assets/TicketChangesModal-By-_gTGd.js +0 -1
- package/dist/client/assets/channel-Dd5Len0X.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-B7KUg6r8.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CQm-z5c4.js +0 -1
- package/dist/client/assets/index-BHq6-Eir.js +0 -270
- package/dist/client/assets/index-BxTc5qQT.css +0 -2
- 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":"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"}
|