@straiffi/archon 1.11.8 → 1.11.10

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 (142) hide show
  1. package/dist/client/assets/{ActivityView-BKLYfPXE.js → ActivityView-RnE0983a.js} +1 -1
  2. package/dist/client/assets/{GitHubActionsDialog-yqqwcP8z.js → GitHubActionsDialog-PaNJhVzv.js} +1 -1
  3. package/dist/client/assets/{VerificationDialog-DhyIDs1V.js → VerificationDialog-PGrCJ1DJ.js} +1 -1
  4. package/dist/client/assets/{architectureDiagram-3BPJPVTR-5krjaOU4.js → architectureDiagram-3BPJPVTR-CKd1Dmpz.js} +1 -1
  5. package/dist/client/assets/{blockDiagram-GPEHLZMM-Duo2q2gn.js → blockDiagram-GPEHLZMM-M3OjRhA0.js} +1 -1
  6. package/dist/client/assets/{c4Diagram-AAUBKEIU-D2lxLmwB.js → c4Diagram-AAUBKEIU-VWBcGTXO.js} +1 -1
  7. package/dist/client/assets/channel-CBQk1IQf.js +1 -0
  8. package/dist/client/assets/{chunk-2J33WTMH-Dbo5lbSs.js → chunk-2J33WTMH-C4WpCUzU.js} +1 -1
  9. package/dist/client/assets/{chunk-3OPIFGDE-mjZrNxCg.js → chunk-3OPIFGDE-BQ-j87T6.js} +1 -1
  10. package/dist/client/assets/{chunk-5ZQYHXKU-C2nUnqLh.js → chunk-5ZQYHXKU-BCZvyT9u.js} +1 -1
  11. package/dist/client/assets/{chunk-727SXJPM-7eUgm0cn.js → chunk-727SXJPM-DZP_PMNz.js} +1 -1
  12. package/dist/client/assets/{chunk-AQP2D5EJ-DouWpaE0.js → chunk-AQP2D5EJ-Cejit8wh.js} +1 -1
  13. package/dist/client/assets/{chunk-CSCIHK7Q-DesC0Fd7.js → chunk-CSCIHK7Q-CvXC4rkf.js} +1 -1
  14. package/dist/client/assets/{chunk-KSCS5N6A-DAsFowjn.js → chunk-KSCS5N6A-hTgJWrr3.js} +1 -1
  15. package/dist/client/assets/{chunk-L5ZTLDWV-w7V9r0Cw.js → chunk-L5ZTLDWV-bSK1mut3.js} +1 -1
  16. package/dist/client/assets/{chunk-LZXEDZCA-BCnxdvaJ.js → chunk-LZXEDZCA-Y2hnSpRr.js} +2 -2
  17. package/dist/client/assets/{chunk-ND2GUHAM-DO8HdZCX.js → chunk-ND2GUHAM-BiHH5lS5.js} +1 -1
  18. package/dist/client/assets/{chunk-NZK2D7GU-37Rbzvm9.js → chunk-NZK2D7GU-DdxcwTTc.js} +1 -1
  19. package/dist/client/assets/{chunk-O5CBEL6O-DTjB0GGI.js → chunk-O5CBEL6O-BZIbgKJr.js} +1 -1
  20. package/dist/client/assets/{chunk-WU5MYG2G-CAonpz-x.js → chunk-WU5MYG2G-D3yvqt9P.js} +1 -1
  21. package/dist/client/assets/classDiagram-4FO5ZUOK-BjizLQoS.js +1 -0
  22. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-B6qpU-kO.js +1 -0
  23. package/dist/client/assets/{dagre-BM42HDAG-DDET9pbe.js → dagre-BM42HDAG-CZQZPoaH.js} +1 -1
  24. package/dist/client/assets/{diagram-2AECGRRQ-r_bu5Cgo.js → diagram-2AECGRRQ-DU7zsX_b.js} +1 -1
  25. package/dist/client/assets/{diagram-5GNKFQAL-QlPCzkUJ.js → diagram-5GNKFQAL-BCCoHKlp.js} +1 -1
  26. package/dist/client/assets/{diagram-KO2AKTUF-D5SzFOzP.js → diagram-KO2AKTUF-BR_GNJLN.js} +1 -1
  27. package/dist/client/assets/{diagram-LMA3HP47-BJcWw3_s.js → diagram-LMA3HP47-B6LZOUTc.js} +1 -1
  28. package/dist/client/assets/{diagram-OG6HWLK6-CpsR9p94.js → diagram-OG6HWLK6-w89pjkBe.js} +1 -1
  29. package/dist/client/assets/{erDiagram-TEJ5UH35-Dq-K6YrY.js → erDiagram-TEJ5UH35-BReR8ngL.js} +1 -1
  30. package/dist/client/assets/{flowDiagram-I6XJVG4X-39hKkH4n.js → flowDiagram-I6XJVG4X-CGwpJ9iQ.js} +1 -1
  31. package/dist/client/assets/{ganttDiagram-6RSMTGT7-DaeBYOLz.js → ganttDiagram-6RSMTGT7-BcOPz4K9.js} +1 -1
  32. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-CCeo9Czy.js → gitGraphDiagram-PVQCEYII-m6-x38H5.js} +1 -1
  33. package/dist/client/assets/index-D_brbG-0.css +2 -0
  34. package/dist/client/assets/index-yUckGfMu.js +293 -0
  35. package/dist/client/assets/{infoDiagram-5YYISTIA-jgHH1Ta7.js → infoDiagram-5YYISTIA-11iWCl_6.js} +1 -1
  36. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-gYPsFHRd.js → ishikawaDiagram-YF4QCWOH-DbeJ14eh.js} +1 -1
  37. package/dist/client/assets/{journeyDiagram-JHISSGLW-C5m8h46L.js → journeyDiagram-JHISSGLW-BYFdU9SL.js} +1 -1
  38. package/dist/client/assets/{kanban-definition-UN3LZRKU-rag4UxAB.js → kanban-definition-UN3LZRKU-Dyc52bol.js} +1 -1
  39. package/dist/client/assets/{line-CAWxQrG3.js → line-CBauYkto.js} +1 -1
  40. package/dist/client/assets/{mermaid-parser.core-C5Hj2V3U.js → mermaid-parser.core-BBbL8arn.js} +1 -1
  41. package/dist/client/assets/{mermaid.core-BxRoDLxv.js → mermaid.core-CB2mIiiP.js} +3 -3
  42. package/dist/client/assets/{mindmap-definition-RKZ34NQL-BUV37aab.js → mindmap-definition-RKZ34NQL-CvWYGfWn.js} +1 -1
  43. package/dist/client/assets/{pieDiagram-4H26LBE5-CMwVVhpZ.js → pieDiagram-4H26LBE5-BsbIF0rU.js} +1 -1
  44. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-DYHRB097.js → quadrantDiagram-W4KKPZXB-Bvs09UnJ.js} +1 -1
  45. package/dist/client/assets/{requirementDiagram-4Y6WPE33-BLtNTWtR.js → requirementDiagram-4Y6WPE33-B3U5xSYZ.js} +1 -1
  46. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-Bcd-UVHZ.js → sankeyDiagram-5OEKKPKP-Dds8cy2g.js} +1 -1
  47. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-Die4-puP.js → sequenceDiagram-3UESZ5HK-BoMb08Ay.js} +1 -1
  48. package/dist/client/assets/{stateDiagram-AJRCARHV-TBbOyQST.js → stateDiagram-AJRCARHV-atm7kYDg.js} +1 -1
  49. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-EYJsus1Q.js +1 -0
  50. package/dist/client/assets/{timeline-definition-PNZ67QCA-CZ3E6e1X.js → timeline-definition-PNZ67QCA-C7U--kCB.js} +1 -1
  51. package/dist/client/assets/{vennDiagram-CIIHVFJN-CY_kofMf.js → vennDiagram-CIIHVFJN-BoPWwPSI.js} +1 -1
  52. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-TzBIV1Er.js → wardleyDiagram-YWT4CUSO-CJ6Y7g3b.js} +1 -1
  53. package/dist/client/assets/{xychartDiagram-2RQKCTM6-BTvKU2GO.js → xychartDiagram-2RQKCTM6-rN5shXue.js} +1 -1
  54. package/dist/client/index.html +2 -2
  55. package/dist/server/db.js +2 -0
  56. package/dist/server/db.js.map +1 -1
  57. package/dist/server/index.js +212 -238
  58. package/dist/server/index.js.map +1 -1
  59. package/dist/server/lib/agent.js +23 -7
  60. package/dist/server/lib/agent.js.map +1 -1
  61. package/dist/server/lib/agentProvider.js +62 -15
  62. package/dist/server/lib/agentProvider.js.map +1 -1
  63. package/dist/server/lib/bundleCleanupManagement.js +181 -0
  64. package/dist/server/lib/bundleCleanupManagement.js.map +1 -0
  65. package/dist/server/lib/bundleCleanupRoutes.js +36 -0
  66. package/dist/server/lib/bundleCleanupRoutes.js.map +1 -0
  67. package/dist/server/lib/bundleDeletion.js +257 -0
  68. package/dist/server/lib/bundleDeletion.js.map +1 -0
  69. package/dist/server/lib/bundleDeletionRoutes.js +73 -0
  70. package/dist/server/lib/bundleDeletionRoutes.js.map +1 -0
  71. package/dist/server/lib/bundleDeletionSchema.js +134 -0
  72. package/dist/server/lib/bundleDeletionSchema.js.map +1 -0
  73. package/dist/server/lib/bundleDeletionStore.js +18 -0
  74. package/dist/server/lib/bundleDeletionStore.js.map +1 -0
  75. package/dist/server/lib/bundleWorktreeCleanup.js +160 -0
  76. package/dist/server/lib/bundleWorktreeCleanup.js.map +1 -0
  77. package/dist/server/lib/codexAgentProvider.js +186 -123
  78. package/dist/server/lib/codexAgentProvider.js.map +1 -1
  79. package/dist/server/lib/diffExplanation.js +485 -0
  80. package/dist/server/lib/diffExplanation.js.map +1 -0
  81. package/dist/server/lib/diffExplanationJobs.js +605 -0
  82. package/dist/server/lib/diffExplanationJobs.js.map +1 -0
  83. package/dist/server/lib/diffExplanationRoutes.js +236 -0
  84. package/dist/server/lib/diffExplanationRoutes.js.map +1 -0
  85. package/dist/server/lib/dockerSandboxCleanup.js +68 -0
  86. package/dist/server/lib/dockerSandboxCleanup.js.map +1 -0
  87. package/dist/server/lib/dockerSandboxEnvironmentOperations.js +4 -3
  88. package/dist/server/lib/dockerSandboxEnvironmentOperations.js.map +1 -1
  89. package/dist/server/lib/dockerSandboxExecutionEnvironment.js +35 -59
  90. package/dist/server/lib/dockerSandboxExecutionEnvironment.js.map +1 -1
  91. package/dist/server/lib/dockerSandboxReleaseProfiles.js +1 -1
  92. package/dist/server/lib/dockerSandboxReleaseProfiles.js.map +1 -1
  93. package/dist/server/lib/executionEnvironmentOperations.js +7 -2
  94. package/dist/server/lib/executionEnvironmentOperations.js.map +1 -1
  95. package/dist/server/lib/executionEnvironmentReconciliation.js +34 -169
  96. package/dist/server/lib/executionEnvironmentReconciliation.js.map +1 -1
  97. package/dist/server/lib/executionEnvironmentTargetCleanup.js +232 -0
  98. package/dist/server/lib/executionEnvironmentTargetCleanup.js.map +1 -0
  99. package/dist/server/lib/executionEnvironments.js +1 -0
  100. package/dist/server/lib/executionEnvironments.js.map +1 -1
  101. package/dist/server/lib/executionTargets.js +1 -1
  102. package/dist/server/lib/executionTargets.js.map +1 -1
  103. package/dist/server/lib/git.js +205 -35
  104. package/dist/server/lib/git.js.map +1 -1
  105. package/dist/server/lib/i18n/resources.js +10 -0
  106. package/dist/server/lib/i18n/resources.js.map +1 -1
  107. package/dist/server/lib/lightweightPrompt.js +284 -52
  108. package/dist/server/lib/lightweightPrompt.js.map +1 -1
  109. package/dist/server/lib/oneShotCancellation.js +54 -0
  110. package/dist/server/lib/oneShotCancellation.js.map +1 -0
  111. package/dist/server/lib/opencodeExecutionReliability.js +46 -2
  112. package/dist/server/lib/opencodeExecutionReliability.js.map +1 -1
  113. package/dist/server/lib/projectMemoryScan.js +3 -46
  114. package/dist/server/lib/projectMemoryScan.js.map +1 -1
  115. package/dist/server/lib/promptDiffSafety.js +53 -0
  116. package/dist/server/lib/promptDiffSafety.js.map +1 -0
  117. package/dist/server/lib/repositorySecrets.js +69 -0
  118. package/dist/server/lib/repositorySecrets.js.map +1 -0
  119. package/dist/server/lib/tickets.js +3 -2
  120. package/dist/server/lib/tickets.js.map +1 -1
  121. package/dist/server/lib/types.js.map +1 -1
  122. package/dist/server/lib/unifiedDiff.js +459 -0
  123. package/dist/server/lib/unifiedDiff.js.map +1 -0
  124. package/dist/server/lib/workspaceDiff.js +156 -0
  125. package/dist/server/lib/workspaceDiff.js.map +1 -0
  126. package/dist/server/lib/workspaceDiffRoutes.js +63 -0
  127. package/dist/server/lib/workspaceDiffRoutes.js.map +1 -0
  128. package/dist/server/lib/workspaceTargets.js +88 -0
  129. package/dist/server/lib/workspaceTargets.js.map +1 -0
  130. package/dist/server/workers/chat.js +71 -1
  131. package/dist/server/workers/chat.js.map +1 -1
  132. package/dist/server/workers/plan.js +24 -2
  133. package/dist/server/workers/plan.js.map +1 -1
  134. package/dist/server/workers/review.js +19 -13
  135. package/dist/server/workers/review.js.map +1 -1
  136. package/package.json +1 -1
  137. package/dist/client/assets/channel-Cf2U7nU4.js +0 -1
  138. package/dist/client/assets/classDiagram-4FO5ZUOK-CK8VsU-L.js +0 -1
  139. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-RvySOEwt.js +0 -1
  140. package/dist/client/assets/index-B9-M1vEw.js +0 -287
  141. package/dist/client/assets/index-CbYT3N3U.css +0 -2
  142. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-BRotXz7h.js +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundleDeletion.js","sourceRoot":"","sources":["../../../server/lib/bundleDeletion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import { attemptBundleDeletion, beginBundleDeletion, BundleDeletionConflict } from './bundleDeletion.js';
2
+ import { getBundleDeletionJob } from './bundleDeletionStore.js';
3
+ import { listChatSessions } from './chats.js';
4
+ import { listSpecSessions } from './specs.js';
5
+ import { countBundleTickets, getBundle, isProjectRootBundle } from './tickets.js';
6
+ export const registerBundleDeletionRoutes = (app, dependencies) => {
7
+ app.delete('/bundles/:id', async (req, res) => {
8
+ const result = dependencies.getRequiredProject(req);
9
+ if ('error' in result) {
10
+ return res.status(400).json({ error: result.error });
11
+ }
12
+ const project = result.project;
13
+ const bundleId = req.params.id;
14
+ const existingJob = getBundleDeletionJob(project.id, bundleId);
15
+ if (!existingJob) {
16
+ const bundle = getBundle(bundleId, project.id);
17
+ if (!bundle) {
18
+ return res.status(404).json({ error: 'Bundle not found' });
19
+ }
20
+ const assertEligible = () => {
21
+ if (isProjectRootBundle(bundle)) {
22
+ throw new BundleDeletionConflict('Project root cannot be deleted');
23
+ }
24
+ if (dependencies.hasActiveCheckWork(project.id, bundleId)) {
25
+ throw new BundleDeletionConflict('Cannot delete a bundle while check work is active');
26
+ }
27
+ if (dependencies.hasActiveSpecWork(project.id, bundleId)) {
28
+ throw new BundleDeletionConflict('Cannot delete a bundle while Spec work is active');
29
+ }
30
+ if (dependencies.hasActiveGraphScan(project.id, bundleId)) {
31
+ throw new BundleDeletionConflict('Cannot delete a bundle while a repository graph scan is active');
32
+ }
33
+ if (countBundleTickets(bundleId, project.id) > 0) {
34
+ throw new BundleDeletionConflict('Cannot delete a bundle that is still used by tickets');
35
+ }
36
+ if (project.active_target_kind === 'bundle' && project.active_target_bundle_id === bundleId) {
37
+ throw new BundleDeletionConflict('Cannot delete the currently selected target bundle');
38
+ }
39
+ };
40
+ const chatSessionIds = listChatSessions(project.id)
41
+ .filter(session => session.target_bundle_id === bundleId).map(session => session.id);
42
+ const specSessionIds = listSpecSessions(project.id)
43
+ .filter(session => session.target_bundle_id === bundleId).map(session => session.id);
44
+ try {
45
+ assertEligible();
46
+ beginBundleDeletion({ project, bundleId, assertEligible });
47
+ }
48
+ catch (error) {
49
+ if (error instanceof BundleDeletionConflict) {
50
+ return res.status(409).json({ error: error.message });
51
+ }
52
+ throw error;
53
+ }
54
+ chatSessionIds.forEach(id => dependencies.emitChatSessionUpdate(project.id, id));
55
+ specSessionIds.forEach(id => dependencies.emitSpecSessionUpdate(project.id, id));
56
+ }
57
+ const job = await attemptBundleDeletion(project.id, bundleId);
58
+ if (job?.status === 'blocked') {
59
+ return res.status(200).json({ cleanup_blocked: true });
60
+ }
61
+ if (job?.status === 'abandoned') {
62
+ return res.status(200).json({ cleanup_abandoned: true });
63
+ }
64
+ if (!job || job.phase !== 'completed') {
65
+ return res.status(202).json({ cleanup_pending: true });
66
+ }
67
+ if (job.branch_warning) {
68
+ return res.status(200).json({ warning: job.branch_warning });
69
+ }
70
+ return res.status(204).end();
71
+ });
72
+ };
73
+ //# sourceMappingURL=bundleDeletionRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundleDeletionRoutes.js","sourceRoot":"","sources":["../../../server/lib/bundleDeletionRoutes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ export const initializeBundleDeletionSchema = (db) => {
2
+ const columns = [
3
+ ['status', "TEXT NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'blocked', 'completed', 'abandoned'))"],
4
+ ['retry_attempts', 'INTEGER NOT NULL DEFAULT 0'],
5
+ ['failure_code', 'TEXT'],
6
+ ['quarantined', 'INTEGER NOT NULL DEFAULT 0'],
7
+ ['project_name', "TEXT NOT NULL DEFAULT ''"],
8
+ ['resources_json', "TEXT NOT NULL DEFAULT '[]'"],
9
+ ['environment_snapshot_json', "TEXT NOT NULL DEFAULT '[]'"],
10
+ ['abandoned_at', 'TEXT'],
11
+ ];
12
+ const existing = db.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'bundle_deletion_jobs'").get();
13
+ if (existing) {
14
+ const names = new Set(db.prepare('PRAGMA table_info(bundle_deletion_jobs)').all().map(column => column.name));
15
+ for (const [name, definition] of columns) {
16
+ if (!names.has(name)) {
17
+ db.exec(`ALTER TABLE bundle_deletion_jobs ADD COLUMN ${name} ${definition}`);
18
+ }
19
+ }
20
+ }
21
+ // Jobs and their ownership snapshots must outlive a deleted project.
22
+ const createTable = (name) => `CREATE TABLE IF NOT EXISTS ${name} (
23
+ bundle_id TEXT PRIMARY KEY, project_id TEXT NOT NULL, target_key TEXT NOT NULL,
24
+ repo_path TEXT NOT NULL, branch TEXT NOT NULL, workspace_path TEXT NOT NULL,
25
+ phase TEXT NOT NULL DEFAULT 'sandboxes' CHECK (phase IN ('sandboxes', 'worktree', 'branch', 'completed')),
26
+ claim_id TEXT, claimed_at TEXT, attempts INTEGER NOT NULL DEFAULT 0, retry_at TEXT,
27
+ last_error TEXT, branch_warning TEXT, created_at TEXT NOT NULL, completed_at TEXT,
28
+ ${columns.map(([name, definition]) => `${name} ${definition}`).join(', ')},
29
+ CHECK ((claim_id IS NULL) = (claimed_at IS NULL))
30
+ )`;
31
+ db.transaction(() => {
32
+ const triggers = db.prepare("SELECT name FROM sqlite_master WHERE type = 'trigger' AND name LIKE 'bundle_deletion_%'").all();
33
+ for (const trigger of triggers) {
34
+ db.exec(`DROP TRIGGER "${trigger.name.replaceAll('"', '""')}"`);
35
+ }
36
+ if (existing && db.prepare('PRAGMA foreign_key_list(bundle_deletion_jobs)').all().length > 0) {
37
+ db.exec(createTable('bundle_deletion_jobs_migrated'));
38
+ db.exec(`INSERT INTO bundle_deletion_jobs_migrated SELECT * FROM bundle_deletion_jobs;
39
+ DROP TABLE bundle_deletion_jobs;
40
+ ALTER TABLE bundle_deletion_jobs_migrated RENAME TO bundle_deletion_jobs;`);
41
+ }
42
+ else {
43
+ db.exec(createTable('bundle_deletion_jobs'));
44
+ }
45
+ db.exec(`UPDATE bundle_deletion_jobs SET status = 'completed' WHERE phase = 'completed' AND status = 'pending';
46
+ UPDATE bundle_deletion_jobs SET project_name = COALESCE((SELECT name FROM projects WHERE id = project_id), project_id)
47
+ WHERE project_name = '';
48
+ DROP INDEX IF EXISTS bundle_deletion_reserved_branch;
49
+ DROP INDEX IF EXISTS bundle_deletion_reserved_workspace;
50
+ CREATE TABLE IF NOT EXISTS bundle_cleanup_quarantines (
51
+ bundle_id TEXT NOT NULL, workspace_path TEXT NOT NULL, repo_path TEXT NOT NULL, branch TEXT NOT NULL,
52
+ PRIMARY KEY (bundle_id, workspace_path)
53
+ );`);
54
+ }).immediate();
55
+ db.exec(`
56
+ CREATE UNIQUE INDEX IF NOT EXISTS bundle_deletion_reserved_branch
57
+ ON bundle_deletion_jobs(project_id, branch COLLATE NOCASE) WHERE status IN ('pending', 'blocked');
58
+ CREATE UNIQUE INDEX IF NOT EXISTS bundle_deletion_reserved_workspace
59
+ ON bundle_deletion_jobs(workspace_path) WHERE status IN ('pending', 'blocked');
60
+
61
+ CREATE TRIGGER IF NOT EXISTS bundle_deletion_prevent_bundle_insert
62
+ BEFORE INSERT ON worktree_bundles
63
+ WHEN EXISTS (SELECT 1 FROM bundle_deletion_jobs job WHERE job.project_id = NEW.project_id
64
+ AND job.status IN ('pending', 'blocked') AND job.branch = NEW.branch COLLATE NOCASE)
65
+ OR EXISTS (SELECT 1 FROM bundle_cleanup_quarantines quarantine JOIN projects project ON project.id = NEW.project_id
66
+ WHERE quarantine.repo_path = project.repo_path AND quarantine.branch = NEW.branch COLLATE NOCASE)
67
+ BEGIN SELECT RAISE(ABORT, 'Bundle branch is reserved for pending cleanup'); END;
68
+
69
+ CREATE TRIGGER IF NOT EXISTS bundle_deletion_prevent_bundle_update
70
+ BEFORE UPDATE OF branch, project_id ON worktree_bundles
71
+ WHEN EXISTS (SELECT 1 FROM bundle_deletion_jobs job WHERE job.project_id = NEW.project_id
72
+ AND job.status IN ('pending', 'blocked') AND job.branch = NEW.branch COLLATE NOCASE)
73
+ OR EXISTS (SELECT 1 FROM bundle_cleanup_quarantines quarantine JOIN projects project ON project.id = NEW.project_id
74
+ WHERE quarantine.repo_path = project.repo_path AND quarantine.branch = NEW.branch COLLATE NOCASE)
75
+ BEGIN SELECT RAISE(ABORT, 'Bundle branch is reserved for pending cleanup'); END;
76
+
77
+ CREATE TRIGGER IF NOT EXISTS bundle_deletion_prevent_ticket_insert
78
+ BEFORE INSERT ON tickets
79
+ WHEN EXISTS (SELECT 1 FROM bundle_deletion_jobs job WHERE job.project_id = NEW.project_id
80
+ AND job.status IN ('pending', 'blocked', 'abandoned') AND (job.bundle_id = NEW.worktree_bundle_id
81
+ OR (job.status <> 'abandoned' AND job.branch = NEW.branch COLLATE NOCASE)))
82
+ OR EXISTS (SELECT 1 FROM bundle_cleanup_quarantines quarantine JOIN projects project ON project.id = NEW.project_id
83
+ WHERE quarantine.repo_path = project.repo_path AND quarantine.branch = NEW.branch COLLATE NOCASE)
84
+ BEGIN SELECT RAISE(ABORT, 'Ticket target is reserved for pending cleanup'); END;
85
+
86
+ CREATE TRIGGER IF NOT EXISTS bundle_deletion_prevent_ticket_update
87
+ BEFORE UPDATE OF branch, project_id, worktree_bundle_id ON tickets
88
+ WHEN EXISTS (SELECT 1 FROM bundle_deletion_jobs job WHERE job.project_id = NEW.project_id
89
+ AND job.status IN ('pending', 'blocked', 'abandoned') AND (job.bundle_id = NEW.worktree_bundle_id
90
+ OR (job.status <> 'abandoned' AND job.branch = NEW.branch COLLATE NOCASE)))
91
+ OR EXISTS (SELECT 1 FROM bundle_cleanup_quarantines quarantine JOIN projects project ON project.id = NEW.project_id
92
+ WHERE quarantine.repo_path = project.repo_path AND quarantine.branch = NEW.branch COLLATE NOCASE)
93
+ BEGIN SELECT RAISE(ABORT, 'Ticket target is reserved for pending cleanup'); END;
94
+
95
+ CREATE TRIGGER IF NOT EXISTS bundle_deletion_prevent_environment_insert
96
+ BEFORE INSERT ON execution_environments
97
+ WHEN EXISTS (SELECT 1 FROM bundle_deletion_jobs job WHERE job.status IN ('pending', 'blocked', 'abandoned')
98
+ AND ((job.project_id = NEW.project_id AND job.target_key = NEW.target_key)
99
+ OR (job.status <> 'abandoned' AND job.workspace_path = NEW.target_workspace_path)))
100
+ OR EXISTS (SELECT 1 FROM bundle_cleanup_quarantines WHERE workspace_path = NEW.target_workspace_path)
101
+ BEGIN SELECT RAISE(ABORT, 'Execution target is reserved for pending cleanup'); END;
102
+
103
+ CREATE TRIGGER IF NOT EXISTS bundle_deletion_prevent_binding_insert
104
+ BEFORE INSERT ON execution_environment_run_bindings
105
+ WHEN EXISTS (SELECT 1 FROM bundle_deletion_jobs job JOIN execution_environments environment
106
+ ON environment.project_id = job.project_id AND environment.target_key = job.target_key
107
+ WHERE job.status IN ('pending', 'blocked', 'abandoned') AND environment.id = NEW.environment_id AND NEW.released_at IS NULL)
108
+ BEGIN SELECT RAISE(ABORT, 'Execution target is reserved for pending cleanup'); END;
109
+
110
+ CREATE TRIGGER IF NOT EXISTS bundle_deletion_prevent_binding_reactivation
111
+ BEFORE UPDATE OF released_at, environment_id, project_id ON execution_environment_run_bindings
112
+ WHEN EXISTS (SELECT 1 FROM bundle_deletion_jobs job JOIN execution_environments environment
113
+ ON environment.project_id = job.project_id AND environment.target_key = job.target_key
114
+ WHERE job.status IN ('pending', 'blocked', 'abandoned') AND environment.id = NEW.environment_id AND NEW.released_at IS NULL)
115
+ BEGIN SELECT RAISE(ABORT, 'Execution target is reserved for pending cleanup'); END;
116
+
117
+ CREATE TRIGGER IF NOT EXISTS bundle_deletion_quarantined_project_insert
118
+ BEFORE INSERT ON projects
119
+ WHEN EXISTS (SELECT 1 FROM bundle_cleanup_quarantines WHERE workspace_path = NEW.repo_path)
120
+ BEGIN SELECT RAISE(ABORT, 'Workspace is quarantined after abandoned cleanup'); END;
121
+
122
+ CREATE TRIGGER IF NOT EXISTS bundle_deletion_prevent_abandoned_operation
123
+ BEFORE UPDATE OF operation_claim_id ON execution_environments
124
+ WHEN NEW.operation_claim_id IS NOT NULL AND EXISTS (SELECT 1 FROM bundle_deletion_jobs
125
+ WHERE project_id = NEW.project_id AND target_key = NEW.target_key AND status IN ('pending', 'blocked', 'abandoned'))
126
+ BEGIN SELECT RAISE(ABORT, 'Execution target is owned by a cleanup job'); END;
127
+
128
+ CREATE TRIGGER IF NOT EXISTS bundle_deletion_quarantined_project_update
129
+ BEFORE UPDATE OF repo_path ON projects
130
+ WHEN EXISTS (SELECT 1 FROM bundle_cleanup_quarantines WHERE workspace_path = NEW.repo_path)
131
+ BEGIN SELECT RAISE(ABORT, 'Workspace is quarantined after abandoned cleanup'); END;
132
+ `);
133
+ };
134
+ //# sourceMappingURL=bundleDeletionSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundleDeletionSchema.js","sourceRoot":"","sources":["../../../server/lib/bundleDeletionSchema.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,EAAqB,EAAE,EAAE;IACtE,MAAM,OAAO,GAAG;QACd,CAAC,QAAQ,EAAE,oGAAoG,CAAC;QAChH,CAAC,gBAAgB,EAAE,4BAA4B,CAAC;QAChD,CAAC,cAAc,EAAE,MAAM,CAAC;QACxB,CAAC,aAAa,EAAE,4BAA4B,CAAC;QAC7C,CAAC,cAAc,EAAE,0BAA0B,CAAC;QAC5C,CAAC,gBAAgB,EAAE,4BAA4B,CAAC;QAChD,CAAC,2BAA2B,EAAE,4BAA4B,CAAC;QAC3D,CAAC,cAAc,EAAE,MAAM,CAAC;KAChB,CAAA;IACV,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,oFAAoF,CAAC,CAAC,GAAG,EAAE,CAAA;IACvH,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,IAAI,GAAG,CAAE,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,EAA8B,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;QAC1I,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,OAAO,EAAE,CAAC;YACzC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrB,EAAE,CAAC,IAAI,CAAC,+CAA+C,IAAI,IAAI,UAAU,EAAE,CAAC,CAAA;YAC9E,CAAC;QACH,CAAC;IACH,CAAC;IACD,qEAAqE;IACrE,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,8BAA8B,IAAI;;;;;;MAMpE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;IAEzE,CAAA;IACF,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QAClB,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,yFAAyF,CAAC,CAAC,GAAG,EAA6B,CAAA;QACvJ,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,EAAE,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;QACjE,CAAC;QACD,IAAI,QAAQ,IAAI,EAAE,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7F,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,+BAA+B,CAAC,CAAC,CAAA;YACrD,EAAE,CAAC,IAAI,CAAC;;kFAEoE,CAAC,CAAA;QAC/E,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC,CAAA;QAC9C,CAAC;QACD,EAAE,CAAC,IAAI,CAAC;;;;;;;;SAQH,CAAC,CAAA;IACR,CAAC,CAAC,CAAC,SAAS,EAAE,CAAA;IACd,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6EP,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -0,0 +1,18 @@
1
+ import db from '../db.js';
2
+ // Some isolated store tests intentionally use a minimal pre-migration database.
3
+ const hasDeletionJobs = () => Boolean(db.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'bundle_deletion_jobs'").get());
4
+ export const getBundleDeletionJob = (projectId, bundleId) => {
5
+ if (!hasDeletionJobs()) {
6
+ return null;
7
+ }
8
+ return db.prepare('SELECT * FROM bundle_deletion_jobs WHERE project_id = ? AND bundle_id = ?')
9
+ .get(projectId, bundleId) ?? null;
10
+ };
11
+ export const isBundleDeletionTargetPending = (projectId, targetKey) => hasDeletionJobs() && Boolean(db.prepare("SELECT 1 FROM bundle_deletion_jobs WHERE project_id = ? AND target_key = ? AND status IN ('pending', 'blocked', 'abandoned')")
12
+ .get(projectId, targetKey));
13
+ export const isBundleDeletionBranchReserved = (projectId, branch) => hasDeletionJobs() && Boolean(db.prepare(`SELECT 1 FROM bundle_deletion_jobs WHERE project_id = ? AND branch = ? COLLATE NOCASE AND status IN ('pending', 'blocked')
14
+ UNION ALL SELECT 1 FROM bundle_cleanup_quarantines quarantine JOIN projects project ON project.repo_path = quarantine.repo_path
15
+ WHERE project.id = ? AND quarantine.branch = ? COLLATE NOCASE LIMIT 1`)
16
+ .get(projectId, branch, projectId, branch));
17
+ export const isBundleCleanupAbandoned = (projectId, targetKey) => hasDeletionJobs() && Boolean(db.prepare("SELECT 1 FROM bundle_deletion_jobs WHERE project_id = ? AND target_key = ? AND status = 'abandoned'").get(projectId, targetKey));
18
+ //# sourceMappingURL=bundleDeletionStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundleDeletionStore.js","sourceRoot":"","sources":["../../../server/lib/bundleDeletionStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAA;AA0BzB,gFAAgF;AAChF,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,oFAAoF,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;AAE7I,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,SAAiB,EAAE,QAAgB,EAAE,EAAE;IAC1E,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,EAAE,CAAC,OAAO,CAAC,2EAA2E,CAAC;SAC3F,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAkC,IAAI,IAAI,CAAA;AACtE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,SAAiB,EAAE,SAAiB,EAAE,EAAE,CAAC,eAAe,EAAE,IAAI,OAAO,CACjH,EAAE,CAAC,OAAO,CAAC,8HAA8H,CAAC;KACvI,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAC7B,CAAA;AAED,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,SAAiB,EAAE,MAAc,EAAE,EAAE,CAAC,eAAe,EAAE,IAAI,OAAO,CAC/G,EAAE,CAAC,OAAO,CAAC;;4EAE+D,CAAC;KACxE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAC7C,CAAA;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,SAAiB,EAAE,SAAiB,EAAE,EAAE,CAAC,eAAe,EAAE,IAAI,OAAO,CAC5G,EAAE,CAAC,OAAO,CAAC,qGAAqG,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAC5I,CAAA"}
@@ -0,0 +1,160 @@
1
+ import { execFile } from 'child_process';
2
+ import { lstatSync, realpathSync } from 'fs';
3
+ import { isAbsolute, relative, resolve, sep } from 'path';
4
+ import { promisify } from 'util';
5
+ import db from '../db.js';
6
+ import { createWorkspaceProcessEnvironment } from './workspaceProcessEnvironment.js';
7
+ const execFileAsync = promisify(execFile);
8
+ const runGit = async (cwd, args) => {
9
+ const env = createWorkspaceProcessEnvironment(cwd, { GIT_TERMINAL_PROMPT: '0' });
10
+ // Ambient Git overrides must not redirect ownership checks or removal.
11
+ for (const key of ['GIT_DIR', 'GIT_WORK_TREE', 'GIT_COMMON_DIR', 'GIT_INDEX_FILE', 'GIT_OBJECT_DIRECTORY', 'GIT_ALTERNATE_OBJECT_DIRECTORIES']) {
12
+ delete env[key];
13
+ }
14
+ const { stdout } = await execFileAsync('git', args, {
15
+ cwd,
16
+ env,
17
+ encoding: 'utf8',
18
+ timeout: 10_000,
19
+ killSignal: 'SIGKILL',
20
+ maxBuffer: 1024 * 1024,
21
+ });
22
+ return stdout;
23
+ };
24
+ const listWorktrees = async (repoPath) => {
25
+ // -z leaves unusual paths (including newlines and quotes) unescaped.
26
+ const output = await runGit(repoPath, ['worktree', 'list', '--porcelain', '-z']);
27
+ const records = [];
28
+ let current = null;
29
+ for (const field of output.split('\0')) {
30
+ if (field.startsWith('worktree ')) {
31
+ current = { path: field.slice('worktree '.length), branch: null };
32
+ if (!isAbsolute(current.path)) {
33
+ throw new Error('Invalid Git worktree registration');
34
+ }
35
+ records.push(current);
36
+ }
37
+ else if (field.startsWith('branch ') && current) {
38
+ current.branch = field.slice('branch '.length);
39
+ }
40
+ else if (!field) {
41
+ current = null;
42
+ }
43
+ }
44
+ if (!records.length || !output.endsWith('\0')) {
45
+ throw new Error('Unable to verify Git worktree registrations');
46
+ }
47
+ return records;
48
+ };
49
+ const pathExists = (path) => {
50
+ try {
51
+ lstatSync(path);
52
+ return true;
53
+ }
54
+ catch (error) {
55
+ if (error.code === 'ENOENT') {
56
+ return false;
57
+ }
58
+ throw error;
59
+ }
60
+ };
61
+ const containsPath = (parent, child) => {
62
+ const suffix = relative(parent, child);
63
+ return suffix === '' || (suffix !== '..' && !suffix.startsWith(`..${sep}`) && !isAbsolute(suffix));
64
+ };
65
+ const assertNotRoot = (path, repoPath, records) => {
66
+ const roots = [repoPath, records[0].path];
67
+ for (const root of roots) {
68
+ if (containsPath(path, resolve(root))) {
69
+ throw new Error('Refusing to remove a repository root workspace');
70
+ }
71
+ if (pathExists(path) && pathExists(root) && containsPath(realpathSync(path), realpathSync(root))) {
72
+ throw new Error('Refusing to remove a repository root workspace');
73
+ }
74
+ }
75
+ };
76
+ const assertWorkspaceIdentity = async (path, repoPath, branch) => {
77
+ if (!pathExists(path)) {
78
+ // Git can remove the exact stale registration after its directory disappeared.
79
+ return;
80
+ }
81
+ const status = lstatSync(path);
82
+ if (!status.isDirectory() || status.isSymbolicLink() || realpathSync(path) !== path) {
83
+ throw new Error('Bundle workspace identity changed');
84
+ }
85
+ const topLevel = (await runGit(path, ['rev-parse', '--show-toplevel'])).replace(/\n$/, '');
86
+ const currentBranch = (await runGit(path, ['symbolic-ref', '--quiet', 'HEAD'])).trimEnd();
87
+ const commonDir = resolve(path, (await runGit(path, ['rev-parse', '--git-common-dir'])).replace(/\n$/, ''));
88
+ const repoCommonDir = resolve(repoPath, (await runGit(repoPath, ['rev-parse', '--git-common-dir'])).replace(/\n$/, ''));
89
+ if (realpathSync(topLevel) !== realpathSync(path)
90
+ || currentBranch !== `refs/heads/${branch}`
91
+ || realpathSync(commonDir) !== realpathSync(repoCommonDir)) {
92
+ throw new Error('Bundle workspace identity changed');
93
+ }
94
+ };
95
+ /**
96
+ * Remove only the persisted path owned by this branch. Returns true once both
97
+ * the directory and registration are absent, including retries after restart.
98
+ * Throws on conflicting identity, unverifiable state, or incomplete removal.
99
+ * Callers must serialize workspace creation/reuse with their deletion job.
100
+ */
101
+ export const deleteOwnedBundleWorktree = async (branch, project, expectedPath) => {
102
+ if (!branch || branch.includes('\0') || !project.repo_path || !isAbsolute(expectedPath) || expectedPath.includes('\0')) {
103
+ throw new Error('Bundle cleanup requires a branch, repository, and absolute persisted workspace path');
104
+ }
105
+ const repoPath = resolve(project.repo_path);
106
+ const path = resolve(expectedPath);
107
+ const records = await listWorktrees(repoPath);
108
+ assertNotRoot(path, repoPath, records);
109
+ const matches = records.filter(record => resolve(record.path) === path);
110
+ if (matches.length > 1 || (matches.length === 1 && matches[0].branch !== `refs/heads/${branch}`)) {
111
+ throw new Error('Bundle worktree registration identity changed');
112
+ }
113
+ if (!matches.length && pathExists(path)) {
114
+ throw new Error('Persisted bundle workspace is no longer a registered worktree');
115
+ }
116
+ if (matches.length) {
117
+ await assertWorkspaceIdentity(path, repoPath, branch);
118
+ // Recheck immediately before mutation, without ever resolving by branch.
119
+ const current = await listWorktrees(repoPath);
120
+ assertNotRoot(path, repoPath, current);
121
+ const owned = current.filter(record => resolve(record.path) === path);
122
+ if (owned.length !== 1 || owned[0].branch !== `refs/heads/${branch}`) {
123
+ throw new Error('Bundle worktree registration identity changed');
124
+ }
125
+ await runGit(repoPath, ['worktree', 'remove', '--force', '--', expectedPath]);
126
+ }
127
+ const remaining = await listWorktrees(repoPath);
128
+ if (remaining.some(record => resolve(record.path) === path) || pathExists(path)) {
129
+ throw new Error('Bundle worktree cleanup is incomplete');
130
+ }
131
+ // deleteWorktreeBase is private to git.ts. Preserve its exact metadata key,
132
+ // but do not erase base metadata belonging to a relocated/reused branch.
133
+ if (!remaining.some(record => record.branch === `refs/heads/${branch}`)) {
134
+ db.prepare('DELETE FROM worktree_bases WHERE repo_path = ? AND branch = ?').run(repoPath, branch);
135
+ }
136
+ return true;
137
+ };
138
+ export const deleteBundleBranch = async (branch, project) => {
139
+ try {
140
+ await runGit(project.repo_path, ['show-ref', '--verify', '--quiet', `refs/heads/${branch}`]);
141
+ }
142
+ catch (error) {
143
+ return error.code === 1 ? 'missing' : 'failed';
144
+ }
145
+ try {
146
+ await runGit(project.repo_path, ['branch', '-d', '--', branch]);
147
+ return 'deleted';
148
+ }
149
+ catch (error) {
150
+ const stderr = String(error.stderr ?? '');
151
+ if (stderr.includes('not fully merged')) {
152
+ return 'unmerged';
153
+ }
154
+ if (stderr.includes('used by worktree') || stderr.includes('checked out')) {
155
+ return 'checked-out';
156
+ }
157
+ return 'failed';
158
+ }
159
+ };
160
+ //# sourceMappingURL=bundleWorktreeCleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundleWorktreeCleanup.js","sourceRoot":"","sources":["../../../server/lib/bundleWorktreeCleanup.ts"],"names":[],"mappings":"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"}