@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.
- package/dist/client/assets/{ActivityView-BKLYfPXE.js → ActivityView-RnE0983a.js} +1 -1
- package/dist/client/assets/{GitHubActionsDialog-yqqwcP8z.js → GitHubActionsDialog-PaNJhVzv.js} +1 -1
- package/dist/client/assets/{VerificationDialog-DhyIDs1V.js → VerificationDialog-PGrCJ1DJ.js} +1 -1
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-5krjaOU4.js → architectureDiagram-3BPJPVTR-CKd1Dmpz.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-Duo2q2gn.js → blockDiagram-GPEHLZMM-M3OjRhA0.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-D2lxLmwB.js → c4Diagram-AAUBKEIU-VWBcGTXO.js} +1 -1
- package/dist/client/assets/channel-CBQk1IQf.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-Dbo5lbSs.js → chunk-2J33WTMH-C4WpCUzU.js} +1 -1
- package/dist/client/assets/{chunk-3OPIFGDE-mjZrNxCg.js → chunk-3OPIFGDE-BQ-j87T6.js} +1 -1
- package/dist/client/assets/{chunk-5ZQYHXKU-C2nUnqLh.js → chunk-5ZQYHXKU-BCZvyT9u.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-7eUgm0cn.js → chunk-727SXJPM-DZP_PMNz.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-DouWpaE0.js → chunk-AQP2D5EJ-Cejit8wh.js} +1 -1
- package/dist/client/assets/{chunk-CSCIHK7Q-DesC0Fd7.js → chunk-CSCIHK7Q-CvXC4rkf.js} +1 -1
- package/dist/client/assets/{chunk-KSCS5N6A-DAsFowjn.js → chunk-KSCS5N6A-hTgJWrr3.js} +1 -1
- package/dist/client/assets/{chunk-L5ZTLDWV-w7V9r0Cw.js → chunk-L5ZTLDWV-bSK1mut3.js} +1 -1
- package/dist/client/assets/{chunk-LZXEDZCA-BCnxdvaJ.js → chunk-LZXEDZCA-Y2hnSpRr.js} +2 -2
- package/dist/client/assets/{chunk-ND2GUHAM-DO8HdZCX.js → chunk-ND2GUHAM-BiHH5lS5.js} +1 -1
- package/dist/client/assets/{chunk-NZK2D7GU-37Rbzvm9.js → chunk-NZK2D7GU-DdxcwTTc.js} +1 -1
- package/dist/client/assets/{chunk-O5CBEL6O-DTjB0GGI.js → chunk-O5CBEL6O-BZIbgKJr.js} +1 -1
- package/dist/client/assets/{chunk-WU5MYG2G-CAonpz-x.js → chunk-WU5MYG2G-D3yvqt9P.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-BjizLQoS.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-B6qpU-kO.js +1 -0
- package/dist/client/assets/{dagre-BM42HDAG-DDET9pbe.js → dagre-BM42HDAG-CZQZPoaH.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-r_bu5Cgo.js → diagram-2AECGRRQ-DU7zsX_b.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-QlPCzkUJ.js → diagram-5GNKFQAL-BCCoHKlp.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-D5SzFOzP.js → diagram-KO2AKTUF-BR_GNJLN.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-BJcWw3_s.js → diagram-LMA3HP47-B6LZOUTc.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-CpsR9p94.js → diagram-OG6HWLK6-w89pjkBe.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-Dq-K6YrY.js → erDiagram-TEJ5UH35-BReR8ngL.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-39hKkH4n.js → flowDiagram-I6XJVG4X-CGwpJ9iQ.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-DaeBYOLz.js → ganttDiagram-6RSMTGT7-BcOPz4K9.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-CCeo9Czy.js → gitGraphDiagram-PVQCEYII-m6-x38H5.js} +1 -1
- package/dist/client/assets/index-D_brbG-0.css +2 -0
- package/dist/client/assets/index-yUckGfMu.js +293 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-jgHH1Ta7.js → infoDiagram-5YYISTIA-11iWCl_6.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-gYPsFHRd.js → ishikawaDiagram-YF4QCWOH-DbeJ14eh.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-C5m8h46L.js → journeyDiagram-JHISSGLW-BYFdU9SL.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-rag4UxAB.js → kanban-definition-UN3LZRKU-Dyc52bol.js} +1 -1
- package/dist/client/assets/{line-CAWxQrG3.js → line-CBauYkto.js} +1 -1
- package/dist/client/assets/{mermaid-parser.core-C5Hj2V3U.js → mermaid-parser.core-BBbL8arn.js} +1 -1
- package/dist/client/assets/{mermaid.core-BxRoDLxv.js → mermaid.core-CB2mIiiP.js} +3 -3
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-BUV37aab.js → mindmap-definition-RKZ34NQL-CvWYGfWn.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-CMwVVhpZ.js → pieDiagram-4H26LBE5-BsbIF0rU.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-DYHRB097.js → quadrantDiagram-W4KKPZXB-Bvs09UnJ.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-BLtNTWtR.js → requirementDiagram-4Y6WPE33-B3U5xSYZ.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-Bcd-UVHZ.js → sankeyDiagram-5OEKKPKP-Dds8cy2g.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-Die4-puP.js → sequenceDiagram-3UESZ5HK-BoMb08Ay.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-TBbOyQST.js → stateDiagram-AJRCARHV-atm7kYDg.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-EYJsus1Q.js +1 -0
- package/dist/client/assets/{timeline-definition-PNZ67QCA-CZ3E6e1X.js → timeline-definition-PNZ67QCA-C7U--kCB.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-CY_kofMf.js → vennDiagram-CIIHVFJN-BoPWwPSI.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-TzBIV1Er.js → wardleyDiagram-YWT4CUSO-CJ6Y7g3b.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-BTvKU2GO.js → xychartDiagram-2RQKCTM6-rN5shXue.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/server/db.js +2 -0
- package/dist/server/db.js.map +1 -1
- package/dist/server/index.js +212 -238
- package/dist/server/index.js.map +1 -1
- package/dist/server/lib/agent.js +23 -7
- package/dist/server/lib/agent.js.map +1 -1
- package/dist/server/lib/agentProvider.js +62 -15
- package/dist/server/lib/agentProvider.js.map +1 -1
- package/dist/server/lib/bundleCleanupManagement.js +181 -0
- package/dist/server/lib/bundleCleanupManagement.js.map +1 -0
- package/dist/server/lib/bundleCleanupRoutes.js +36 -0
- package/dist/server/lib/bundleCleanupRoutes.js.map +1 -0
- package/dist/server/lib/bundleDeletion.js +257 -0
- package/dist/server/lib/bundleDeletion.js.map +1 -0
- package/dist/server/lib/bundleDeletionRoutes.js +73 -0
- package/dist/server/lib/bundleDeletionRoutes.js.map +1 -0
- package/dist/server/lib/bundleDeletionSchema.js +134 -0
- package/dist/server/lib/bundleDeletionSchema.js.map +1 -0
- package/dist/server/lib/bundleDeletionStore.js +18 -0
- package/dist/server/lib/bundleDeletionStore.js.map +1 -0
- package/dist/server/lib/bundleWorktreeCleanup.js +160 -0
- package/dist/server/lib/bundleWorktreeCleanup.js.map +1 -0
- package/dist/server/lib/codexAgentProvider.js +186 -123
- package/dist/server/lib/codexAgentProvider.js.map +1 -1
- package/dist/server/lib/diffExplanation.js +485 -0
- package/dist/server/lib/diffExplanation.js.map +1 -0
- package/dist/server/lib/diffExplanationJobs.js +605 -0
- package/dist/server/lib/diffExplanationJobs.js.map +1 -0
- package/dist/server/lib/diffExplanationRoutes.js +236 -0
- package/dist/server/lib/diffExplanationRoutes.js.map +1 -0
- package/dist/server/lib/dockerSandboxCleanup.js +68 -0
- package/dist/server/lib/dockerSandboxCleanup.js.map +1 -0
- package/dist/server/lib/dockerSandboxEnvironmentOperations.js +4 -3
- package/dist/server/lib/dockerSandboxEnvironmentOperations.js.map +1 -1
- package/dist/server/lib/dockerSandboxExecutionEnvironment.js +35 -59
- package/dist/server/lib/dockerSandboxExecutionEnvironment.js.map +1 -1
- package/dist/server/lib/dockerSandboxReleaseProfiles.js +1 -1
- package/dist/server/lib/dockerSandboxReleaseProfiles.js.map +1 -1
- package/dist/server/lib/executionEnvironmentOperations.js +7 -2
- package/dist/server/lib/executionEnvironmentOperations.js.map +1 -1
- package/dist/server/lib/executionEnvironmentReconciliation.js +34 -169
- package/dist/server/lib/executionEnvironmentReconciliation.js.map +1 -1
- package/dist/server/lib/executionEnvironmentTargetCleanup.js +232 -0
- package/dist/server/lib/executionEnvironmentTargetCleanup.js.map +1 -0
- package/dist/server/lib/executionEnvironments.js +1 -0
- package/dist/server/lib/executionEnvironments.js.map +1 -1
- package/dist/server/lib/executionTargets.js +1 -1
- package/dist/server/lib/executionTargets.js.map +1 -1
- package/dist/server/lib/git.js +205 -35
- package/dist/server/lib/git.js.map +1 -1
- package/dist/server/lib/i18n/resources.js +10 -0
- package/dist/server/lib/i18n/resources.js.map +1 -1
- package/dist/server/lib/lightweightPrompt.js +284 -52
- package/dist/server/lib/lightweightPrompt.js.map +1 -1
- package/dist/server/lib/oneShotCancellation.js +54 -0
- package/dist/server/lib/oneShotCancellation.js.map +1 -0
- package/dist/server/lib/opencodeExecutionReliability.js +46 -2
- package/dist/server/lib/opencodeExecutionReliability.js.map +1 -1
- package/dist/server/lib/projectMemoryScan.js +3 -46
- package/dist/server/lib/projectMemoryScan.js.map +1 -1
- package/dist/server/lib/promptDiffSafety.js +53 -0
- package/dist/server/lib/promptDiffSafety.js.map +1 -0
- package/dist/server/lib/repositorySecrets.js +69 -0
- package/dist/server/lib/repositorySecrets.js.map +1 -0
- package/dist/server/lib/tickets.js +3 -2
- package/dist/server/lib/tickets.js.map +1 -1
- package/dist/server/lib/types.js.map +1 -1
- package/dist/server/lib/unifiedDiff.js +459 -0
- package/dist/server/lib/unifiedDiff.js.map +1 -0
- package/dist/server/lib/workspaceDiff.js +156 -0
- package/dist/server/lib/workspaceDiff.js.map +1 -0
- package/dist/server/lib/workspaceDiffRoutes.js +63 -0
- package/dist/server/lib/workspaceDiffRoutes.js.map +1 -0
- package/dist/server/lib/workspaceTargets.js +88 -0
- package/dist/server/lib/workspaceTargets.js.map +1 -0
- package/dist/server/workers/chat.js +71 -1
- package/dist/server/workers/chat.js.map +1 -1
- package/dist/server/workers/plan.js +24 -2
- package/dist/server/workers/plan.js.map +1 -1
- package/dist/server/workers/review.js +19 -13
- package/dist/server/workers/review.js.map +1 -1
- package/package.json +1 -1
- package/dist/client/assets/channel-Cf2U7nU4.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-CK8VsU-L.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-RvySOEwt.js +0 -1
- package/dist/client/assets/index-B9-M1vEw.js +0 -287
- package/dist/client/assets/index-CbYT3N3U.css +0 -2
- 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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"}
|