@git.zone/cli 3.2.1 → 4.0.0

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 (125) hide show
  1. package/dist_ts/00_commitinfo_data.js +2 -2
  2. package/dist_ts/classes.gitzoneconfig.js +1 -1
  3. package/dist_ts/classes.project.js +1 -1
  4. package/dist_ts/gitzone.cli.js +1 -1
  5. package/dist_ts/gitzone.logging.js +1 -1
  6. package/dist_ts/helpers.changelog.js +1 -1
  7. package/dist_ts/helpers.climode.js +1 -1
  8. package/dist_ts/helpers.smartconfig.js +61 -11
  9. package/dist_ts/helpers.smartconfigmigrations.js +1 -1
  10. package/dist_ts/helpers.tsdocker.js +1 -1
  11. package/dist_ts/helpers.workflow.js +1 -1
  12. package/dist_ts/index.js +1 -1
  13. package/dist_ts/mod_audit/index.js +1 -1
  14. package/dist_ts/mod_commit/index.js +1 -1
  15. package/dist_ts/mod_commit/mod.helpers.js +1 -1
  16. package/dist_ts/mod_commit/mod.plugins.js +1 -1
  17. package/dist_ts/mod_commit/mod.ui.js +1 -1
  18. package/dist_ts/mod_config/classes.commitconfig.js +1 -1
  19. package/dist_ts/mod_config/classes.releaseconfig.js +1 -1
  20. package/dist_ts/mod_config/index.js +2 -2
  21. package/dist_ts/mod_config/mod.plugins.js +1 -1
  22. package/dist_ts/mod_deprecate/index.js +1 -1
  23. package/dist_ts/mod_deprecate/mod.plugins.js +1 -1
  24. package/dist_ts/mod_docker/classes.dockerpruner.js +7 -1
  25. package/dist_ts/mod_docker/index.js +1 -1
  26. package/dist_ts/mod_docker/mod.plugins.js +1 -1
  27. package/dist_ts/mod_format/classes.baseformatter.js +1 -1
  28. package/dist_ts/mod_format/classes.diffreporter.js +1 -1
  29. package/dist_ts/mod_format/classes.formatcontext.js +1 -1
  30. package/dist_ts/mod_format/classes.formatplanner.js +1 -1
  31. package/dist_ts/mod_format/classes.formatstats.js +1 -1
  32. package/dist_ts/mod_format/formatters/assets.formatter.js +1 -1
  33. package/dist_ts/mod_format/formatters/cleanup.formatter.js +1 -1
  34. package/dist_ts/mod_format/formatters/copy.formatter.js +1 -1
  35. package/dist_ts/mod_format/formatters/gitignore.formatter.js +1 -1
  36. package/dist_ts/mod_format/formatters/license.formatter.js +1 -1
  37. package/dist_ts/mod_format/formatters/packagejson.formatter.js +1 -1
  38. package/dist_ts/mod_format/formatters/prettier.formatter.js +1 -1
  39. package/dist_ts/mod_format/formatters/readme.formatter.js +1 -1
  40. package/dist_ts/mod_format/formatters/smartconfig.formatter.js +1 -1
  41. package/dist_ts/mod_format/formatters/templates.formatter.js +1 -1
  42. package/dist_ts/mod_format/formatters/tsconfig.formatter.js +1 -1
  43. package/dist_ts/mod_format/index.js +1 -1
  44. package/dist_ts/mod_format/interfaces.format.js +1 -1
  45. package/dist_ts/mod_format/mod.plugins.js +1 -1
  46. package/dist_ts/mod_helpers/index.js +1 -1
  47. package/dist_ts/mod_helpers/mod.plugins.js +1 -1
  48. package/dist_ts/mod_meta/index.js +1 -1
  49. package/dist_ts/mod_meta/meta.classes.meta.js +1 -1
  50. package/dist_ts/mod_meta/meta.interfaces.js +1 -1
  51. package/dist_ts/mod_meta/meta.plugins.js +1 -1
  52. package/dist_ts/mod_open/index.js +1 -1
  53. package/dist_ts/mod_open/mod.plugins.js +1 -1
  54. package/dist_ts/mod_release/index.js +1 -1
  55. package/dist_ts/mod_release/mod.plugins.js +1 -1
  56. package/dist_ts/mod_services/classes.dockercontainer.d.ts +50 -3
  57. package/dist_ts/mod_services/classes.dockercontainer.js +646 -84
  58. package/dist_ts/mod_services/classes.globalregistry.d.ts +10 -24
  59. package/dist_ts/mod_services/classes.globalregistry.js +210 -62
  60. package/dist_ts/mod_services/classes.globalregistrystore.d.ts +48 -0
  61. package/dist_ts/mod_services/classes.globalregistrystore.js +156 -0
  62. package/dist_ts/mod_services/classes.interprocesslock.d.ts +21 -0
  63. package/dist_ts/mod_services/classes.interprocesslock.js +141 -0
  64. package/dist_ts/mod_services/classes.serviceconfiguration.d.ts +15 -12
  65. package/dist_ts/mod_services/classes.serviceconfiguration.js +188 -91
  66. package/dist_ts/mod_services/classes.servicedatamarker.d.ts +32 -7
  67. package/dist_ts/mod_services/classes.servicedatamarker.js +145 -49
  68. package/dist_ts/mod_services/classes.servicemanager.d.ts +70 -28
  69. package/dist_ts/mod_services/classes.servicemanager.js +995 -421
  70. package/dist_ts/mod_services/classes.servicenames.d.ts +8 -0
  71. package/dist_ts/mod_services/classes.servicenames.js +54 -0
  72. package/dist_ts/mod_services/classes.serviceoptions.js +1 -1
  73. package/dist_ts/mod_services/classes.servicepruner.d.ts +3 -0
  74. package/dist_ts/mod_services/classes.servicepruner.js +208 -46
  75. package/dist_ts/mod_services/helpers.js +1 -1
  76. package/dist_ts/mod_services/index.d.ts +2 -0
  77. package/dist_ts/mod_services/index.js +81 -58
  78. package/dist_ts/mod_services/mod.plugins.js +1 -1
  79. package/dist_ts/mod_standard/index.js +2 -2
  80. package/dist_ts/mod_standard/mod.plugins.js +1 -1
  81. package/dist_ts/mod_start/index.js +1 -1
  82. package/dist_ts/mod_start/mod.plugins.js +1 -1
  83. package/dist_ts/mod_template/index.js +1 -1
  84. package/dist_ts/mod_template/mod.plugins.js +1 -1
  85. package/dist_ts/mod_tools/classes.packagemanager.js +1 -1
  86. package/dist_ts/mod_tools/index.js +1 -1
  87. package/dist_ts/mod_tools/mod.plugins.js +1 -1
  88. package/dist_ts/paths.js +1 -1
  89. package/dist_ts/plugins.d.ts +3 -1
  90. package/dist_ts/plugins.js +4 -2
  91. package/dist_ts_migration/001.service-selection.d.ts +9 -0
  92. package/dist_ts_migration/001.service-selection.js +51 -0
  93. package/dist_ts_migration/002.runtime-config.d.ts +19 -0
  94. package/dist_ts_migration/002.runtime-config.js +170 -0
  95. package/dist_ts_migration/003.service-data-marker.d.ts +9 -0
  96. package/dist_ts_migration/003.service-data-marker.js +156 -0
  97. package/dist_ts_migration/004.global-registry.d.ts +13 -0
  98. package/dist_ts_migration/004.global-registry.js +165 -0
  99. package/dist_ts_migration/index.d.ts +11 -0
  100. package/dist_ts_migration/index.js +59 -0
  101. package/package.json +6 -3
  102. package/readme.hints.md +102 -25
  103. package/readme.md +123 -28
  104. package/readme.plan.md +29 -16
  105. package/ts/00_commitinfo_data.ts +1 -1
  106. package/ts/helpers.smartconfig.ts +63 -10
  107. package/ts/mod_config/index.ts +1 -1
  108. package/ts/mod_docker/classes.dockerpruner.ts +6 -0
  109. package/ts/mod_services/classes.dockercontainer.ts +912 -96
  110. package/ts/mod_services/classes.globalregistry.ts +290 -89
  111. package/ts/mod_services/classes.globalregistrystore.ts +279 -0
  112. package/ts/mod_services/classes.interprocesslock.ts +189 -0
  113. package/ts/mod_services/classes.serviceconfiguration.ts +215 -108
  114. package/ts/mod_services/classes.servicedatamarker.ts +210 -52
  115. package/ts/mod_services/classes.servicemanager.ts +1332 -512
  116. package/ts/mod_services/classes.servicenames.ts +76 -0
  117. package/ts/mod_services/classes.servicepruner.ts +310 -52
  118. package/ts/mod_services/index.ts +89 -62
  119. package/ts/mod_standard/index.ts +1 -1
  120. package/ts/plugins.ts +4 -0
  121. package/ts_migration/001.service-selection.ts +77 -0
  122. package/ts_migration/002.runtime-config.ts +218 -0
  123. package/ts_migration/003.service-data-marker.ts +216 -0
  124. package/ts_migration/004.global-registry.ts +272 -0
  125. package/ts_migration/index.ts +83 -0
@@ -1,6 +1,81 @@
1
1
  import * as plugins from './mod.plugins.js';
2
2
  import * as helpers from './helpers.js';
3
3
  import { logger } from '../gitzone.logging.js';
4
+ import { getServiceDataDirectory, markerProvesServiceDataDirectory, readServiceDataMarker, serviceBindOperation, serviceDataOwner, serviceOperationLabel, serviceToolLabel, } from './classes.servicedatamarker.js';
5
+ import { withServiceDataOperationLock } from './classes.interprocesslock.js';
6
+ export const fencedBindOperationSpecLabel = 'git.zone.operation-spec';
7
+ export const fencedBindOperationInvocationLabel = 'git.zone.operation-invocation';
8
+ export const fencedBindOperationSpec = '1';
9
+ export const fencedBindOperationStaleAfterMs = 60_000;
10
+ /** One Docker-reserved lock name for every canonical host bind target. */
11
+ export const getFencedBindOperationName = (hostPathArg) => {
12
+ const targetHash = plugins.crypto
13
+ .createHash('sha256')
14
+ .update(plugins.path.resolve(hostPathArg))
15
+ .digest('hex')
16
+ .slice(0, 24);
17
+ return `gitzone-services-bind-${targetHash}`;
18
+ };
19
+ const getServiceDataDeletionIntentPath = (projectPathArg, serviceArg) => plugins.path.join(plugins.path.resolve(projectPathArg), '.nogit', `.gitzone-delete-${serviceArg}.json`);
20
+ const getServiceDataQuarantinePath = (canonicalPathArg, tokenArg) => `${plugins.path.resolve(canonicalPathArg)}.gitzone-delete-${tokenArg}`;
21
+ const readServiceDataDeletionIntent = async (projectPathArg, serviceArg) => {
22
+ const projectPath = plugins.path.resolve(projectPathArg);
23
+ const canonicalPath = getServiceDataDirectory(projectPath, serviceArg);
24
+ const intentPath = getServiceDataDeletionIntentPath(projectPath, serviceArg);
25
+ try {
26
+ const stats = await plugins.fs.lstat(intentPath);
27
+ if (stats.isSymbolicLink() || !stats.isFile()) {
28
+ throw new Error(`Refusing non-regular service data deletion intent: ${intentPath}`);
29
+ }
30
+ }
31
+ catch (error) {
32
+ if (error.code === 'ENOENT') {
33
+ return undefined;
34
+ }
35
+ throw error;
36
+ }
37
+ let parsed;
38
+ try {
39
+ parsed = JSON.parse(await plugins.fs.readFile(intentPath, 'utf8'));
40
+ }
41
+ catch (error) {
42
+ throw new Error(`Refusing invalid service data deletion intent: ${intentPath}`, {
43
+ cause: error,
44
+ });
45
+ }
46
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
47
+ throw new Error(`Refusing invalid service data deletion intent: ${intentPath}`);
48
+ }
49
+ const intent = parsed;
50
+ const allowedKeys = [
51
+ 'owner',
52
+ 'kind',
53
+ 'schemaVersion',
54
+ 'projectPath',
55
+ 'service',
56
+ 'canonicalPath',
57
+ 'quarantinePath',
58
+ 'token',
59
+ 'createdAt',
60
+ ];
61
+ const token = intent.token;
62
+ if (Object.keys(intent).length !== allowedKeys.length ||
63
+ !Object.keys(intent).every((keyArg) => allowedKeys.includes(keyArg)) ||
64
+ intent.owner !== serviceDataOwner ||
65
+ intent.kind !== 'service-data-deletion' ||
66
+ intent.schemaVersion !== 1 ||
67
+ intent.projectPath !== projectPath ||
68
+ intent.service !== serviceArg ||
69
+ intent.canonicalPath !== canonicalPath ||
70
+ typeof token !== 'string' ||
71
+ !/^[a-f0-9]{32}$/u.test(token) ||
72
+ intent.quarantinePath !== getServiceDataQuarantinePath(canonicalPath, token) ||
73
+ typeof intent.createdAt !== 'string' ||
74
+ !intent.createdAt) {
75
+ throw new Error(`Refusing invalid service data deletion intent: ${intentPath}`);
76
+ }
77
+ return intent;
78
+ };
4
79
  /** Sanitised failure from the shell-free Docker execution path. */
5
80
  export class DockerArgvExecutionError extends Error {
6
81
  exitCode;
@@ -19,6 +94,27 @@ export class DockerArgvExecutionError extends Error {
19
94
  this.signal = optionsArg.signal;
20
95
  }
21
96
  }
97
+ const isExactStoppedBindHelperForTarget = (containerArg, hostPathArg, optionsArg) => {
98
+ const invocationId = containerArg.labels[fencedBindOperationInvocationLabel];
99
+ const expectedLabels = {
100
+ 'git.zone.tool': serviceToolLabel,
101
+ 'git.zone.service': optionsArg.service,
102
+ 'git.zone.project-path': plugins.path.resolve(optionsArg.projectPath),
103
+ 'git.zone.data-path': plugins.path.resolve(hostPathArg),
104
+ 'git.zone.safe-to-prune': 'false',
105
+ [serviceOperationLabel]: serviceBindOperation,
106
+ [fencedBindOperationSpecLabel]: fencedBindOperationSpec,
107
+ [fencedBindOperationInvocationLabel]: invocationId,
108
+ };
109
+ const actualGitZoneLabels = Object.entries(containerArg.labels).filter(([keyArg]) => keyArg.startsWith('git.zone.'));
110
+ return (!containerArg.running &&
111
+ containerArg.name === getFencedBindOperationName(hostPathArg) &&
112
+ /^[a-f0-9]{32}$/u.test(invocationId || '') &&
113
+ actualGitZoneLabels.length === Object.keys(expectedLabels).length &&
114
+ Object.entries(expectedLabels).every(([keyArg, valueArg]) => containerArg.labels[keyArg] === valueArg) &&
115
+ containerArg.mountSources.length === 1 &&
116
+ plugins.path.resolve(containerArg.mountSources[0]) === plugins.path.resolve(hostPathArg));
117
+ };
22
118
  /** Single-quote a value for safe interpolation into a bash command. */
23
119
  export const shellQuote = (valueArg) => `'${valueArg.replace(/'/g, `'"'"'`)}'`;
24
120
  const assertDockerUlimit = (nameArg, limitArg) => {
@@ -67,6 +163,81 @@ export const matchDockerUlimits = (inspectDataArg, expectedArg) => {
67
163
  }
68
164
  return 'match';
69
165
  };
166
+ const isUnknownRecord = (valueArg) => {
167
+ return typeof valueArg === 'object' && valueArg !== null && !Array.isArray(valueArg);
168
+ };
169
+ const parseFencedBindInspection = (stdoutArg, expectedNameArg) => {
170
+ let parsed;
171
+ try {
172
+ parsed = JSON.parse(stdoutArg);
173
+ }
174
+ catch {
175
+ throw new Error(`Docker returned an invalid bind-operation inspection for ${expectedNameArg}.`);
176
+ }
177
+ if (!Array.isArray(parsed) || parsed.length !== 1 || !isUnknownRecord(parsed[0])) {
178
+ throw new Error(`Docker returned an invalid bind-operation inspection for ${expectedNameArg}.`);
179
+ }
180
+ const inspected = parsed[0];
181
+ const config = inspected.Config;
182
+ const state = inspected.State;
183
+ const normalizedName = String(inspected.Name || '').replace(/^\//u, '');
184
+ const createdAtMs = Date.parse(String(inspected.Created || ''));
185
+ if (typeof inspected.Id !== 'string' ||
186
+ !/^[a-f0-9]{64}$/u.test(inspected.Id) ||
187
+ !/^gitzone-services-bind-[a-f0-9]{24}$/u.test(normalizedName) ||
188
+ (expectedNameArg !== undefined && normalizedName !== expectedNameArg) ||
189
+ !Number.isFinite(createdAtMs) ||
190
+ !isUnknownRecord(config) ||
191
+ typeof config.Image !== 'string' ||
192
+ typeof config.User !== 'string' ||
193
+ !Array.isArray(config.Entrypoint) ||
194
+ !config.Entrypoint.every((entry) => typeof entry === 'string') ||
195
+ !Array.isArray(config.Cmd) ||
196
+ !config.Cmd.every((entry) => typeof entry === 'string') ||
197
+ !isUnknownRecord(config.Labels) ||
198
+ !isUnknownRecord(state) ||
199
+ typeof state.Running !== 'boolean' ||
200
+ typeof state.Status !== 'string' ||
201
+ typeof state.ExitCode !== 'number' ||
202
+ !Array.isArray(inspected.Mounts)) {
203
+ throw new Error(`Docker returned an invalid bind-operation inspection for ${expectedNameArg}.`);
204
+ }
205
+ const labels = {};
206
+ for (const [key, value] of Object.entries(config.Labels)) {
207
+ if (typeof value !== 'string') {
208
+ throw new Error(`Docker returned an invalid bind-operation inspection for ${expectedNameArg}.`);
209
+ }
210
+ labels[key] = value;
211
+ }
212
+ const mounts = inspected.Mounts.map((mountArg) => {
213
+ if (!isUnknownRecord(mountArg) ||
214
+ mountArg.Type !== 'bind' ||
215
+ typeof mountArg.Source !== 'string' ||
216
+ typeof mountArg.Destination !== 'string' ||
217
+ typeof mountArg.RW !== 'boolean') {
218
+ throw new Error(`Docker returned an invalid bind-operation inspection for ${expectedNameArg}.`);
219
+ }
220
+ return {
221
+ source: plugins.path.resolve(mountArg.Source),
222
+ destination: mountArg.Destination,
223
+ readWrite: mountArg.RW,
224
+ };
225
+ });
226
+ return {
227
+ id: inspected.Id,
228
+ name: normalizedName,
229
+ createdAtMs,
230
+ image: config.Image,
231
+ running: state.Running,
232
+ status: state.Status,
233
+ exitCode: state.ExitCode,
234
+ user: config.User,
235
+ entrypoint: [...config.Entrypoint],
236
+ command: [...config.Cmd],
237
+ labels,
238
+ mounts,
239
+ };
240
+ };
70
241
  export class DockerContainer {
71
242
  smartshell;
72
243
  /**
@@ -78,8 +249,9 @@ export class DockerContainer {
78
249
  * @git.zone/tsdocker.
79
250
  */
80
251
  queryTimeoutSeconds = 60;
81
- /** Longer bound for privileged cleanup, which may delete a large tree. */
252
+ /** Longer bound for root-helper cleanup, which may delete a large tree. */
82
253
  cleanupTimeoutSeconds = 600;
254
+ bindOperationDelay = async (millisecondsArg) => plugins.smartdelay.delayFor(millisecondsArg);
83
255
  constructor() {
84
256
  this.smartshell = new plugins.smartshell.Smartshell({
85
257
  executor: 'bash',
@@ -167,22 +339,240 @@ export class DockerContainer {
167
339
  if (optionsArg.restart) {
168
340
  argv.push('--restart', optionsArg.restart);
169
341
  }
342
+ if (optionsArg.user) {
343
+ argv.push('--user', optionsArg.user);
344
+ }
345
+ if (optionsArg.entrypoint) {
346
+ argv.push('--entrypoint', optionsArg.entrypoint);
347
+ }
170
348
  argv.push(optionsArg.image);
171
349
  if (optionsArg.command) {
172
350
  argv.push(...optionsArg.command);
173
351
  }
174
352
  return this.execArgvInternal(argv, executionOptionsArg, childEnvironment);
175
353
  }
354
+ assertFencedBindInspection(inspectionArg, optionsArg) {
355
+ const expectedGitZoneLabels = Object.entries(optionsArg.labels).filter(([key]) => key.startsWith('git.zone.'));
356
+ const actualGitZoneLabels = Object.entries(inspectionArg.labels).filter(([key]) => key.startsWith('git.zone.'));
357
+ const labelsMatch = expectedGitZoneLabels.length === actualGitZoneLabels.length &&
358
+ expectedGitZoneLabels.every(([key, value]) => inspectionArg.labels[key] === value);
359
+ const mountsMatch = inspectionArg.mounts.length === 1 &&
360
+ inspectionArg.mounts[0].source === plugins.path.resolve(optionsArg.hostPath) &&
361
+ inspectionArg.mounts[0].destination === optionsArg.containerPath &&
362
+ inspectionArg.mounts[0].readWrite;
363
+ if (inspectionArg.name !== optionsArg.name ||
364
+ inspectionArg.image !== optionsArg.image ||
365
+ inspectionArg.user !== '0' ||
366
+ inspectionArg.entrypoint.length !== 1 ||
367
+ inspectionArg.entrypoint[0] !== optionsArg.entrypoint ||
368
+ inspectionArg.command.length !== optionsArg.command.length ||
369
+ !inspectionArg.command.every((entry, index) => entry === optionsArg.command[index]) ||
370
+ !labelsMatch ||
371
+ !mountsMatch) {
372
+ throw new Error(`Refusing bind-operation container ${optionsArg.name}: exact ownership and configuration are not proven.`);
373
+ }
374
+ }
375
+ assertRecoverableFencedBindInspection(inspectionArg, optionsArg, expectedNameArg) {
376
+ const expectedLabels = {
377
+ ...optionsArg.labels,
378
+ [fencedBindOperationSpecLabel]: fencedBindOperationSpec,
379
+ };
380
+ const expectedGitZoneLabels = Object.entries(expectedLabels).filter(([key]) => key.startsWith('git.zone.'));
381
+ const actualGitZoneLabels = Object.entries(inspectionArg.labels).filter(([key]) => key.startsWith('git.zone.'));
382
+ const invocationId = inspectionArg.labels[fencedBindOperationInvocationLabel];
383
+ const labelsMatch = actualGitZoneLabels.length === expectedGitZoneLabels.length + 1 &&
384
+ expectedGitZoneLabels.every(([key, value]) => inspectionArg.labels[key] === value) &&
385
+ typeof invocationId === 'string' &&
386
+ /^[a-f0-9]{32}$/u.test(invocationId);
387
+ const mountMatches = inspectionArg.mounts.length === 1 &&
388
+ inspectionArg.mounts[0].source === plugins.path.resolve(optionsArg.hostPath) &&
389
+ inspectionArg.mounts[0].readWrite;
390
+ if (inspectionArg.name !== expectedNameArg ||
391
+ inspectionArg.image !== optionsArg.image ||
392
+ inspectionArg.user !== '0' ||
393
+ inspectionArg.entrypoint.length !== 1 ||
394
+ inspectionArg.entrypoint[0] !== optionsArg.entrypoint ||
395
+ inspectionArg.command.length !== optionsArg.command.length ||
396
+ !inspectionArg.command.every((entryArg, indexArg) => entryArg === optionsArg.command[indexArg]) ||
397
+ !labelsMatch ||
398
+ !mountMatches ||
399
+ inspectionArg.mounts[0].destination !== optionsArg.containerPath) {
400
+ throw new Error(`Refusing bind-operation container ${expectedNameArg}: canonical helper ownership is not proven.`);
401
+ }
402
+ }
403
+ async readFencedBindInspection(referenceArg, expectedNameArg, executionOptionsArg) {
404
+ const result = await this.execArgv(['inspect', referenceArg], executionOptionsArg);
405
+ const inspection = parseFencedBindInspection(result.stdout, expectedNameArg);
406
+ if (/^[a-f0-9]{64}$/u.test(referenceArg) && inspection.id !== referenceArg) {
407
+ throw new Error(`Refusing bind-operation container ${expectedNameArg}: its immutable id changed.`);
408
+ }
409
+ return inspection;
410
+ }
411
+ async inspectFencedBindOperation(referenceArg, optionsArg, executionOptionsArg) {
412
+ const inspection = await this.readFencedBindInspection(referenceArg, optionsArg.name, executionOptionsArg);
413
+ this.assertFencedBindInspection(inspection, optionsArg);
414
+ return inspection;
415
+ }
416
+ async discoverFencedBindOperationId(nameArg, executionOptionsArg) {
417
+ const result = await this.execArgv([
418
+ 'container',
419
+ 'ls',
420
+ '-a',
421
+ '--no-trunc',
422
+ '--filter',
423
+ `name=^/${nameArg}$`,
424
+ '--format',
425
+ '{{.ID}}',
426
+ ], executionOptionsArg);
427
+ const ids = result.stdout
428
+ .split(/\r?\n/u)
429
+ .map((entry) => entry.trim())
430
+ .filter(Boolean);
431
+ if (ids.length === 0) {
432
+ return undefined;
433
+ }
434
+ if (ids.length !== 1 || !/^[a-f0-9]{64}$/u.test(ids[0])) {
435
+ throw new Error(`Docker returned ambiguous bind-operation identity for ${nameArg}.`);
436
+ }
437
+ return ids[0];
438
+ }
439
+ async reclaimStaleFencedBindOperation(optionsArg, nameArg) {
440
+ const existingId = await this.discoverFencedBindOperationId(nameArg, optionsArg.executionOptions());
441
+ if (!existingId) {
442
+ return;
443
+ }
444
+ const inspection = await this.readFencedBindInspection(existingId, nameArg, optionsArg.executionOptions());
445
+ this.assertRecoverableFencedBindInspection(inspection, optionsArg, nameArg);
446
+ if (inspection.running) {
447
+ throw new Error(`Bind-operation container ${nameArg} is still running.`);
448
+ }
449
+ if (inspection.status !== 'created' && inspection.status !== 'exited') {
450
+ throw new Error(`Refusing bind-operation container ${nameArg}: its stopped state is not proven.`);
451
+ }
452
+ if (Date.now() - inspection.createdAtMs < fencedBindOperationStaleAfterMs) {
453
+ throw new Error(`Bind-operation container ${nameArg} may belong to another active invocation.`);
454
+ }
455
+ // Non-forced removal is the atomic handoff: if another process starts the
456
+ // helper after inspection, Docker refuses removal instead of killing it.
457
+ await this.execArgv(['rm', inspection.id], optionsArg.executionOptions());
458
+ }
459
+ /**
460
+ * Run one root bind-mount operation with a stopped-create and immutable-ID fence.
461
+ * Every ambiguous or failed path proves ownership again before forced removal.
462
+ */
463
+ async runFencedBindOperation(optionsArg) {
464
+ if (Object.hasOwn(optionsArg.labels, fencedBindOperationSpecLabel) ||
465
+ Object.hasOwn(optionsArg.labels, fencedBindOperationInvocationLabel)) {
466
+ throw new Error('Fenced bind operation labels contain reserved lifecycle keys.');
467
+ }
468
+ if (optionsArg.labels[serviceOperationLabel] !== serviceBindOperation ||
469
+ optionsArg.labels['git.zone.safe-to-prune'] !== 'false') {
470
+ throw new Error('Fenced bind operation labels do not declare the protected helper contract.');
471
+ }
472
+ const operationName = getFencedBindOperationName(optionsArg.hostPath);
473
+ const invocationId = plugins.crypto.randomBytes(16).toString('hex');
474
+ const runtimeOptions = {
475
+ ...optionsArg,
476
+ name: operationName,
477
+ labels: {
478
+ ...optionsArg.labels,
479
+ [fencedBindOperationSpecLabel]: fencedBindOperationSpec,
480
+ [fencedBindOperationInvocationLabel]: invocationId,
481
+ },
482
+ };
483
+ await this.reclaimStaleFencedBindOperation(optionsArg, operationName);
484
+ const normalizeError = (errorArg) => errorArg instanceof Error
485
+ ? errorArg
486
+ : new Error('Docker bind operation failed with a non-Error rejection.');
487
+ const rollbackErrors = [];
488
+ let operationError;
489
+ let containerId;
490
+ try {
491
+ const creation = await this.createArgv({
492
+ name: operationName,
493
+ image: runtimeOptions.image,
494
+ volumes: {
495
+ [plugins.path.resolve(runtimeOptions.hostPath)]: runtimeOptions.containerPath,
496
+ },
497
+ labels: runtimeOptions.labels,
498
+ user: '0',
499
+ entrypoint: runtimeOptions.entrypoint,
500
+ command: runtimeOptions.command,
501
+ }, runtimeOptions.executionOptions());
502
+ const createdContainerId = creation.stdout.trim();
503
+ if (!/^[a-f0-9]{64}$/u.test(createdContainerId)) {
504
+ throw new Error(`Docker returned an invalid id for bind operation ${operationName}.`);
505
+ }
506
+ containerId = createdContainerId;
507
+ const created = await this.inspectFencedBindOperation(containerId, runtimeOptions, runtimeOptions.executionOptions());
508
+ if (created.running || created.status !== 'created') {
509
+ throw new Error(`Bind-operation container ${operationName} was not created stopped.`);
510
+ }
511
+ await this.execArgv(['start', '--attach', containerId], runtimeOptions.executionOptions());
512
+ const completed = await this.inspectFencedBindOperation(containerId, runtimeOptions, runtimeOptions.executionOptions());
513
+ if (completed.running || completed.status !== 'exited' || completed.exitCode !== 0) {
514
+ throw new Error(`Bind-operation container ${operationName} did not exit successfully.`);
515
+ }
516
+ await this.execArgv(['rm', containerId], runtimeOptions.executionOptions());
517
+ return;
518
+ }
519
+ catch (error) {
520
+ operationError = normalizeError(error);
521
+ }
522
+ if (!containerId) {
523
+ const rollbackTimeoutMs = runtimeOptions.rollbackTimeoutMs ?? 5_000;
524
+ const rollbackDeadlineAt = Date.now() + rollbackTimeoutMs;
525
+ while (!containerId) {
526
+ const remainingMs = Math.floor(rollbackDeadlineAt - Date.now());
527
+ if (remainingMs <= 0) {
528
+ break;
529
+ }
530
+ try {
531
+ const discoveredId = await this.discoverFencedBindOperationId(operationName, { timeoutMs: remainingMs });
532
+ if (discoveredId) {
533
+ const inspection = await this.inspectFencedBindOperation(discoveredId, runtimeOptions, { timeoutMs: Math.max(1, rollbackDeadlineAt - Date.now()) });
534
+ containerId = inspection.id;
535
+ break;
536
+ }
537
+ }
538
+ catch (error) {
539
+ rollbackErrors.push(normalizeError(error));
540
+ break;
541
+ }
542
+ const remainingAfterDiscovery = Math.floor(rollbackDeadlineAt - Date.now());
543
+ if (remainingAfterDiscovery <= 0) {
544
+ break;
545
+ }
546
+ await this.bindOperationDelay(Math.min(100, remainingAfterDiscovery));
547
+ }
548
+ }
549
+ if (containerId) {
550
+ try {
551
+ await this.inspectFencedBindOperation(containerId, runtimeOptions, {
552
+ timeoutMs: runtimeOptions.rollbackTimeoutMs ?? 5_000,
553
+ });
554
+ await this.execArgv(['rm', '-f', containerId], {
555
+ timeoutMs: runtimeOptions.rollbackTimeoutMs ?? 5_000,
556
+ });
557
+ }
558
+ catch (error) {
559
+ rollbackErrors.push(normalizeError(error));
560
+ }
561
+ }
562
+ if (rollbackErrors.length > 0) {
563
+ throw new AggregateError([operationError, ...rollbackErrors], `Docker bind operation ${operationName} failed and cleanup could not be confirmed.`);
564
+ }
565
+ throw operationError;
566
+ }
176
567
  /**
177
568
  * Check if Docker is installed and available
178
569
  */
179
570
  async checkDocker() {
180
571
  try {
181
- // Silent: this must not print to stdout, which would corrupt --json output.
182
- const result = await this.smartshell.execSilent('docker --version');
183
- return result.exitCode === 0;
572
+ await this.execArgv(['--version'], { timeoutMs: this.queryTimeoutSeconds * 1_000 });
573
+ return true;
184
574
  }
185
- catch (error) {
575
+ catch {
186
576
  return false;
187
577
  }
188
578
  }
@@ -190,32 +580,27 @@ export class DockerContainer {
190
580
  * Get container status
191
581
  */
192
582
  async getStatus(containerName) {
193
- try {
194
- // Check if running
195
- const runningResult = await this.smartshell.exec(`docker ps --format '{{.Names}}' | grep -q "^${containerName}$"`);
196
- if (runningResult.exitCode === 0) {
197
- return 'running';
198
- }
199
- // Check if exists but stopped
200
- const existsResult = await this.smartshell.exec(`docker ps -a --format '{{.Names}}' | grep -q "^${containerName}$"`);
201
- if (existsResult.exitCode === 0) {
202
- return 'stopped';
203
- }
583
+ const ids = await this.listIds([`name=^/${containerName}$`]);
584
+ if (ids.length === 0) {
204
585
  return 'not_exists';
205
586
  }
206
- catch (error) {
207
- return 'not_exists';
587
+ const matches = (await this.inspectMany(ids)).filter((containerArg) => containerArg.name === containerName);
588
+ if (matches.length !== 1) {
589
+ throw new Error(`Docker returned ambiguous identity for container ${containerName}.`);
208
590
  }
591
+ return matches[0].running ? 'running' : 'stopped';
209
592
  }
210
593
  /**
211
594
  * Start a container
212
595
  */
213
596
  async start(containerName) {
214
597
  try {
215
- const result = await this.smartshell.exec(`docker start ${containerName}`);
216
- return result.exitCode === 0;
598
+ await this.execArgv(['start', containerName], {
599
+ timeoutMs: this.queryTimeoutSeconds * 1_000,
600
+ });
601
+ return true;
217
602
  }
218
- catch (error) {
603
+ catch {
219
604
  return false;
220
605
  }
221
606
  }
@@ -224,10 +609,12 @@ export class DockerContainer {
224
609
  */
225
610
  async stop(containerName) {
226
611
  try {
227
- const result = await this.smartshell.exec(`docker stop ${containerName}`);
228
- return result.exitCode === 0;
612
+ await this.execArgv(['stop', containerName], {
613
+ timeoutMs: this.queryTimeoutSeconds * 1_000,
614
+ });
615
+ return true;
229
616
  }
230
- catch (error) {
617
+ catch {
231
618
  return false;
232
619
  }
233
620
  }
@@ -236,11 +623,12 @@ export class DockerContainer {
236
623
  */
237
624
  async remove(containerName, force = false) {
238
625
  try {
239
- const forceFlag = force ? '-f' : '';
240
- const result = await this.smartshell.exec(`docker rm ${forceFlag} ${containerName}`);
241
- return result.exitCode === 0;
626
+ await this.execArgv(['rm', ...(force ? ['-f'] : []), containerName], {
627
+ timeoutMs: this.queryTimeoutSeconds * 1_000,
628
+ });
629
+ return true;
242
630
  }
243
- catch (error) {
631
+ catch {
244
632
  return false;
245
633
  }
246
634
  }
@@ -248,9 +636,9 @@ export class DockerContainer {
248
636
  * Run a new container
249
637
  */
250
638
  async run(options) {
251
- let command = 'docker run -d';
639
+ let command = `${this.bounded(this.queryTimeoutSeconds)} run -d`;
252
640
  // Add name
253
- command += ` --name ${options.name}`;
641
+ command += ` --name ${shellQuote(options.name)}`;
254
642
  // Add ports
255
643
  if (options.ports) {
256
644
  for (const [hostPort, containerPort] of Object.entries(options.ports)) {
@@ -282,7 +670,7 @@ export class DockerContainer {
282
670
  command += ` --restart ${options.restart}`;
283
671
  }
284
672
  // Add image
285
- command += ` ${options.image}`;
673
+ command += ` ${shellQuote(options.image)}`;
286
674
  // Add command if provided
287
675
  if (options.command) {
288
676
  command += ` ${options.command}`;
@@ -338,11 +726,93 @@ export class DockerContainer {
338
726
  return false;
339
727
  }
340
728
  }
729
+ /** Exact persisted quarantine path for an interrupted deletion, if present. */
730
+ async getPendingDataDeletionPath(projectPathArg, serviceArg) {
731
+ const intent = await readServiceDataDeletionIntent(projectPathArg, serviceArg);
732
+ if (!intent) {
733
+ return undefined;
734
+ }
735
+ if (await this.assertRegularDeletionDirectory(intent.quarantinePath)) {
736
+ return intent.quarantinePath;
737
+ }
738
+ if (await this.assertRegularDeletionDirectory(intent.canonicalPath)) {
739
+ return intent.canonicalPath;
740
+ }
741
+ // The intent still needs a locked cleanup pass even when deletion finished
742
+ // just before the process was interrupted.
743
+ return intent.quarantinePath;
744
+ }
745
+ getDataCleanupOperation(hostPathArg, imageArg, optionsArg) {
746
+ const hostPath = plugins.path.resolve(hostPathArg);
747
+ return {
748
+ image: imageArg,
749
+ hostPath,
750
+ containerPath: '/gitzone-target',
751
+ entrypoint: '/bin/sh',
752
+ command: [
753
+ '-c',
754
+ 'rm -rf /gitzone-target/..?* /gitzone-target/.[!.]* /gitzone-target/*',
755
+ ],
756
+ labels: {
757
+ 'git.zone.tool': serviceToolLabel,
758
+ 'git.zone.service': optionsArg.service,
759
+ 'git.zone.project-path': plugins.path.resolve(optionsArg.projectPath),
760
+ 'git.zone.data-path': hostPath,
761
+ 'git.zone.safe-to-prune': 'false',
762
+ [serviceOperationLabel]: serviceBindOperation,
763
+ },
764
+ executionOptions: () => ({ timeoutMs: this.cleanupTimeoutSeconds * 1_000 }),
765
+ rollbackTimeoutMs: this.queryTimeoutSeconds * 1_000,
766
+ };
767
+ }
768
+ async writeServiceDataDeletionIntent(intentArg) {
769
+ const intentPath = getServiceDataDeletionIntentPath(intentArg.projectPath, intentArg.service);
770
+ const tempPath = `${intentPath}.tmp-${process.pid}-${plugins.crypto
771
+ .randomBytes(12)
772
+ .toString('hex')}`;
773
+ let handle;
774
+ try {
775
+ handle = await plugins.fs.open(tempPath, 'wx', 0o600);
776
+ await handle.writeFile(`${JSON.stringify(intentArg, null, 2)}\n`, 'utf8');
777
+ await handle.sync();
778
+ await handle.close();
779
+ handle = undefined;
780
+ await plugins.fs.rename(tempPath, intentPath);
781
+ }
782
+ catch (error) {
783
+ await handle?.close().catch(() => { });
784
+ await plugins.fs.rm(tempPath, { force: true }).catch(() => { });
785
+ throw new Error(`Could not persist service data deletion intent: ${intentPath}`, {
786
+ cause: error,
787
+ });
788
+ }
789
+ }
790
+ async assertRegularDeletionDirectory(pathArg) {
791
+ try {
792
+ const stats = await plugins.fs.lstat(pathArg);
793
+ if (stats.isSymbolicLink() || !stats.isDirectory()) {
794
+ throw new Error(`Refusing non-directory service data cleanup target: ${pathArg}`);
795
+ }
796
+ return true;
797
+ }
798
+ catch (error) {
799
+ if (error.code === 'ENOENT') {
800
+ return false;
801
+ }
802
+ throw error;
803
+ }
804
+ }
805
+ async renameDataDirectory(sourcePathArg, targetPathArg) {
806
+ await plugins.fs.rename(sourcePathArg, targetPathArg);
807
+ }
808
+ async deleteDataDirectory(pathArg) {
809
+ await plugins.fs.rm(pathArg, { recursive: true, force: true });
810
+ }
341
811
  /**
342
812
  * Remove a service data directory, escalating to a root one-off container
343
813
  * when the invoking user cannot delete the contents.
344
814
  *
345
- * Service containers write as their own uid (mongod as 999, MinIO as root)
815
+ * Service containers write as their own uid
346
816
  * with restrictive modes, so a plain recursive delete only removes part of the
347
817
  * tree. For MongoDB that left a half-deleted, corrupt WiredTiger dataset that
348
818
  * crash-looped on the next start — so a partial delete is worse than none.
@@ -351,48 +821,134 @@ export class DockerContainer {
351
821
  * The one-off container mounts only the target directory, so `rm -rf` inside
352
822
  * it cannot reach anything else on the host.
353
823
  */
354
- async removeDataDirectory(hostPathArg, imageArg) {
824
+ async removeDataDirectory(hostPathArg, imageArg, optionsArg) {
825
+ return withServiceDataOperationLock(optionsArg.projectPath, optionsArg.service, () => this.removeDataDirectoryLocked(hostPathArg, imageArg, optionsArg));
826
+ }
827
+ async removeDataDirectoryLocked(hostPathArg, imageArg, optionsArg) {
828
+ await optionsArg.preDeleteCheck?.();
829
+ const projectPath = plugins.path.resolve(optionsArg.projectPath);
355
830
  const hostPath = plugins.path.resolve(hostPathArg);
356
- if (!(await plugins.smartfs.directory(hostPath).exists())) {
357
- return;
831
+ if (hostPath !== getServiceDataDirectory(projectPath, optionsArg.service)) {
832
+ throw new Error(`Refusing cleanup outside the canonical service data path: ${hostPath}`);
833
+ }
834
+ for (const pathComponent of [projectPath, plugins.path.dirname(hostPath)]) {
835
+ const stats = await plugins.fs.lstat(pathComponent);
836
+ if (stats.isSymbolicLink() || !stats.isDirectory()) {
837
+ throw new Error(`Refusing symbolic or non-directory cleanup path component: ${pathComponent}`);
838
+ }
358
839
  }
359
- // Fast path: the current user may already own everything.
840
+ let intent = await readServiceDataDeletionIntent(projectPath, optionsArg.service);
841
+ let canonicalExists = await this.assertRegularDeletionDirectory(hostPath);
842
+ let quarantinePath;
843
+ if (intent) {
844
+ quarantinePath = intent.quarantinePath;
845
+ }
846
+ else {
847
+ const token = plugins.crypto.randomBytes(16).toString('hex');
848
+ quarantinePath = getServiceDataQuarantinePath(hostPath, token);
849
+ intent = {
850
+ owner: serviceDataOwner,
851
+ kind: 'service-data-deletion',
852
+ schemaVersion: 1,
853
+ projectPath,
854
+ service: optionsArg.service,
855
+ canonicalPath: hostPath,
856
+ quarantinePath,
857
+ token,
858
+ createdAt: new Date().toISOString(),
859
+ };
860
+ }
861
+ let quarantineExists = await this.assertRegularDeletionDirectory(quarantinePath);
862
+ if (canonicalExists && quarantineExists) {
863
+ throw new Error(`Refusing ambiguous service data deletion with both canonical and quarantine paths present: ${hostPath}`);
864
+ }
865
+ if (optionsArg.service === 'objectstorage' && (canonicalExists || quarantineExists)) {
866
+ const marker = await readServiceDataMarker(projectPath);
867
+ if (!markerProvesServiceDataDirectory(marker, projectPath, optionsArg.service)) {
868
+ throw new Error(`Refusing ObjectStorage cleanup with unproven ownership: ${hostPath}`);
869
+ }
870
+ }
871
+ const targetPaths = [hostPath, quarantinePath];
872
+ const serviceContainerFilters = [
873
+ `label=git.zone.project-path=${projectPath}`,
874
+ `label=git.zone.service=${optionsArg.service}`,
875
+ ];
876
+ let serviceContainerIds = await this.listIds(serviceContainerFilters);
877
+ if (serviceContainerIds.length > 0) {
878
+ const serviceContainers = await this.inspectMany(serviceContainerIds);
879
+ const helperTargets = new Set();
880
+ for (const container of serviceContainers) {
881
+ const helperTarget = targetPaths.find((targetPathArg) => isExactStoppedBindHelperForTarget(container, targetPathArg, optionsArg));
882
+ if (!helperTarget) {
883
+ throw new Error(`Refusing service data cleanup while container ${container.name} exists.`);
884
+ }
885
+ helperTargets.add(helperTarget);
886
+ }
887
+ for (const helperTarget of helperTargets) {
888
+ await this.reclaimStaleFencedBindOperation(this.getDataCleanupOperation(helperTarget, imageArg, optionsArg), getFencedBindOperationName(helperTarget));
889
+ }
890
+ serviceContainerIds = await this.listIds(serviceContainerFilters);
891
+ if (serviceContainerIds.length > 0) {
892
+ const [container] = await this.inspectMany(serviceContainerIds);
893
+ throw new Error(`Refusing service data cleanup while container ${container?.name || serviceContainerIds[0]} exists.`);
894
+ }
895
+ }
896
+ const containerMountSources = await this.listAllMountSources();
897
+ const mountConflict = containerMountSources.find((sourceArg) => targetPaths.some((targetPathArg) => helpers.pathsOverlap(targetPathArg, sourceArg)));
898
+ if (mountConflict) {
899
+ throw new Error(`Refusing mounted service data path: ${hostPath} or its quarantine is used by ${mountConflict}`);
900
+ }
901
+ if (!canonicalExists && !quarantineExists) {
902
+ if (await plugins.smartfs.file(getServiceDataDeletionIntentPath(projectPath, optionsArg.service)).exists()) {
903
+ await plugins.fs.rm(getServiceDataDeletionIntentPath(projectPath, optionsArg.service));
904
+ return true;
905
+ }
906
+ return false;
907
+ }
908
+ if (!(await plugins.smartfs.file(getServiceDataDeletionIntentPath(projectPath, optionsArg.service)).exists())) {
909
+ await this.writeServiceDataDeletionIntent(intent);
910
+ }
911
+ if (canonicalExists) {
912
+ try {
913
+ await this.renameDataDirectory(hostPath, quarantinePath);
914
+ }
915
+ catch (error) {
916
+ throw new Error(`Could not quarantine ${hostPath} before deletion; the persisted intent is safe to retry.`, { cause: error });
917
+ }
918
+ canonicalExists = false;
919
+ quarantineExists = true;
920
+ }
921
+ // All destructive work happens under the persisted quarantine name. A
922
+ // failure can leave bytes to resume, but never a partial canonical dataset.
360
923
  try {
361
- await plugins.smartfs.directory(hostPath).recursive().delete();
924
+ await this.deleteDataDirectory(quarantinePath);
362
925
  }
363
- catch (error) {
364
- // fall through to privileged removal
926
+ catch {
927
+ // Fall through to root-helper removal.
365
928
  }
366
- if (!(await plugins.smartfs.directory(hostPath).exists())) {
367
- return;
929
+ quarantineExists = await this.assertRegularDeletionDirectory(quarantinePath);
930
+ if (!quarantineExists) {
931
+ await plugins.fs.rm(getServiceDataDeletionIntentPath(projectPath, optionsArg.service));
932
+ return true;
368
933
  }
369
934
  if (!(await this.imageExists(imageArg))) {
370
- throw new Error(`Cannot remove ${hostPath}: its contents belong to the container user and image ` +
371
- `${imageArg} is not available locally to perform a privileged cleanup. ` +
372
- `Pull ${imageArg} and retry, or remove the directory manually as root.`);
373
- }
374
- // Empty the mounted directory from inside a root container, then remove the
375
- // now-empty directory from the host.
376
- const emptied = await this.runOneOff({
377
- image: imageArg,
378
- shell: 'sh',
379
- command: 'rm -rf /gitzone-target/..?* /gitzone-target/.[!.]* /gitzone-target/*',
380
- volumes: { [hostPath]: '/gitzone-target' },
381
- user: '0',
382
- });
383
- if (!emptied) {
384
- throw new Error(`Privileged cleanup of ${hostPath} failed`);
935
+ throw new Error(`Cannot finish removing quarantined data at ${quarantinePath}: its contents belong to the container user and image ` +
936
+ `${imageArg} is not available locally to perform a root-helper cleanup. ` +
937
+ `Pull ${imageArg} and retry; the canonical path remains absent and the deletion intent is preserved.`);
385
938
  }
939
+ await this.runFencedBindOperation(this.getDataCleanupOperation(quarantinePath, imageArg, optionsArg));
386
940
  try {
387
- await plugins.smartfs.directory(hostPath).recursive().delete();
941
+ await this.deleteDataDirectory(quarantinePath);
388
942
  }
389
943
  catch (error) {
390
944
  const errorMessage = error instanceof Error ? error.message : String(error);
391
- throw new Error(`Could not remove ${hostPath} after privileged cleanup: ${errorMessage}`);
945
+ throw new Error(`Could not remove quarantine ${quarantinePath} after root-helper cleanup: ${errorMessage}`);
392
946
  }
393
- if (await plugins.smartfs.directory(hostPath).exists()) {
394
- throw new Error(`Refusing to report success: ${hostPath} still exists`);
947
+ if (await plugins.smartfs.directory(quarantinePath).exists()) {
948
+ throw new Error(`Refusing to report success: quarantine ${quarantinePath} still exists`);
395
949
  }
950
+ await plugins.fs.rm(getServiceDataDeletionIntentPath(projectPath, optionsArg.service));
951
+ return true;
396
952
  }
397
953
  /**
398
954
  * Execute a command in a running container
@@ -431,9 +987,8 @@ export class DockerContainer {
431
987
  */
432
988
  async logs(containerName, lines) {
433
989
  try {
434
- const tailFlag = lines ? `--tail ${lines}` : '';
435
- const result = await this.smartshell.exec(`docker logs ${tailFlag} ${containerName}`);
436
- return result.combinedOutput;
990
+ const result = await this.execArgv(['logs', ...(lines ? ['--tail', String(lines)] : []), containerName], { timeoutMs: this.queryTimeoutSeconds * 1_000 });
991
+ return `${result.stdout}${result.stderr}`;
437
992
  }
438
993
  catch (error) {
439
994
  const errorMessage = error instanceof Error ? error.message : String(error);
@@ -471,13 +1026,12 @@ export class DockerContainer {
471
1026
  */
472
1027
  async inspect(containerName) {
473
1028
  try {
474
- const result = await this.smartshell.execSilent(`docker inspect ${containerName}`);
475
- if (result.exitCode === 0) {
476
- return JSON.parse(result.stdout);
477
- }
478
- return null;
1029
+ const result = await this.execArgv(['inspect', containerName], {
1030
+ timeoutMs: this.queryTimeoutSeconds * 1_000,
1031
+ });
1032
+ return JSON.parse(result.stdout);
479
1033
  }
480
- catch (error) {
1034
+ catch {
481
1035
  return null;
482
1036
  }
483
1037
  }
@@ -487,9 +1041,8 @@ export class DockerContainer {
487
1041
  async getPortMappings(containerName) {
488
1042
  try {
489
1043
  // Use docker inspect without format to get full JSON, then extract PortBindings
490
- const result = await this.smartshell.execSilent(`docker inspect ${containerName}`);
491
- if (result.exitCode === 0 && result.stdout) {
492
- const inspectData = JSON.parse(result.stdout);
1044
+ const inspectData = await this.inspect(containerName);
1045
+ if (inspectData) {
493
1046
  if (inspectData && inspectData[0] && inspectData[0].HostConfig && inspectData[0].HostConfig.PortBindings) {
494
1047
  const portBindings = inspectData[0].HostConfig.PortBindings;
495
1048
  const mappings = {};
@@ -519,12 +1072,15 @@ export class DockerContainer {
519
1072
  * mistaking an unreachable daemon for "no containers exist".
520
1073
  */
521
1074
  async listIds(filterArgs, includeStopped = true) {
522
- const filters = filterArgs.map((filter) => `--filter ${shellQuote(filter)}`).join(' ');
523
- const allFlag = includeStopped ? '-a' : '';
524
- const result = await this.smartshell.execSilent(`${this.bounded(this.queryTimeoutSeconds)} ps ${allFlag} ${filters} --format '{{.ID}}'`);
525
- if (result.exitCode !== 0) {
526
- throw new Error(result.combinedOutput);
527
- }
1075
+ const argv = ['ps'];
1076
+ if (includeStopped)
1077
+ argv.push('-a');
1078
+ for (const filter of filterArgs)
1079
+ argv.push('--filter', filter);
1080
+ argv.push('--format', '{{.ID}}');
1081
+ const result = await this.execArgv(argv, {
1082
+ timeoutMs: this.queryTimeoutSeconds * 1_000,
1083
+ });
528
1084
  if (!result.stdout.trim()) {
529
1085
  return [];
530
1086
  }
@@ -542,10 +1098,9 @@ export class DockerContainer {
542
1098
  if (idsArg.length === 0) {
543
1099
  return [];
544
1100
  }
545
- const result = await this.smartshell.execSilent(`${this.bounded(this.queryTimeoutSeconds)} inspect ${idsArg.map((id) => shellQuote(id)).join(' ')}`);
546
- if (result.exitCode !== 0) {
547
- throw new Error(result.combinedOutput);
548
- }
1101
+ const result = await this.execArgv(['inspect', ...idsArg], {
1102
+ timeoutMs: this.queryTimeoutSeconds * 1_000,
1103
+ });
549
1104
  let parsed;
550
1105
  try {
551
1106
  parsed = JSON.parse(result.stdout);
@@ -582,7 +1137,14 @@ export class DockerContainer {
582
1137
  * mounted by anything running is never a deletion candidate.
583
1138
  */
584
1139
  async listRunningMountSources() {
585
- const ids = await this.listIds([], false);
1140
+ return this.listMountSources(false);
1141
+ }
1142
+ /** Resolved host bind paths configured on running and stopped containers. */
1143
+ async listAllMountSources() {
1144
+ return this.listMountSources(true);
1145
+ }
1146
+ async listMountSources(includeStoppedArg) {
1147
+ const ids = await this.listIds([], includeStoppedArg);
586
1148
  const containers = await this.inspectMany(ids);
587
1149
  const sources = new Set();
588
1150
  for (const container of containers) {
@@ -593,4 +1155,4 @@ export class DockerContainer {
593
1155
  return [...sources];
594
1156
  }
595
1157
  }
596
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5kb2NrZXJjb250YWluZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2Rfc2VydmljZXMvY2xhc3Nlcy5kb2NrZXJjb250YWluZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUErQy9DLG1FQUFtRTtBQUNuRSxNQUFNLE9BQU8sd0JBQXlCLFNBQVEsS0FBSztJQUNqQyxRQUFRLENBQVU7SUFDbEIsTUFBTSxDQUFrQjtJQUV4QyxZQUFZLFVBQTRDO1FBQ3RELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxRQUFRO1lBQ2hDLENBQUMsQ0FBQyxtQkFBbUIsVUFBVSxDQUFDLFNBQVMsSUFBSTtZQUM3QyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU07Z0JBQ2pCLENBQUMsQ0FBQyx3QkFBd0IsVUFBVSxDQUFDLE1BQU0sRUFBRTtnQkFDN0MsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEtBQUssU0FBUztvQkFDakMsQ0FBQyxDQUFDLHNCQUFzQjtvQkFDeEIsQ0FBQyxDQUFDLG9CQUFvQixVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbEQsS0FBSyxDQUFDLGtCQUFrQixNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxJQUFJLEdBQUcsMEJBQTBCLENBQUM7UUFDdkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztJQUNsQyxDQUFDO0NBQ0Y7QUFhRCx1RUFBdUU7QUFDdkUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsUUFBZ0IsRUFBVSxFQUFFLENBQUMsSUFBSSxRQUFR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
1158
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5kb2NrZXJjb250YWluZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9tb2Rfc2VydmljZXMvY2xhc3Nlcy5kb2NrZXJjb250YWluZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixnQ0FBZ0MsRUFDaEMscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUNwQixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLGdCQUFnQixHQUVqQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBaUU3RSxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyx5QkFBeUIsQ0FBQztBQUN0RSxNQUFNLENBQUMsTUFBTSxrQ0FBa0MsR0FBRywrQkFBK0IsQ0FBQztBQUNsRixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFDM0MsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQUcsTUFBTSxDQUFDO0FBRXRELDBFQUEwRTtBQUMxRSxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLFdBQW1CLEVBQVUsRUFBRTtJQUN4RSxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTTtTQUM5QixVQUFVLENBQUMsUUFBUSxDQUFDO1NBQ3BCLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUN6QyxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ2IsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNoQixPQUFPLHlCQUF5QixVQUFVLEVBQUUs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