@proletariat/cli 0.3.79 → 0.3.80
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/commands/session/cleanup.d.ts +16 -0
- package/dist/commands/session/cleanup.js +143 -0
- package/dist/commands/session/cleanup.js.map +1 -0
- package/dist/commands/session/index.js +4 -0
- package/dist/commands/session/index.js.map +1 -1
- package/dist/lib/execution/container-cleanup.d.ts +67 -0
- package/dist/lib/execution/container-cleanup.js +117 -0
- package/dist/lib/execution/container-cleanup.js.map +1 -0
- package/dist/lib/pmo/sync-manager.js +3 -0
- package/dist/lib/pmo/sync-manager.js.map +1 -1
- package/dist/lib/work-lifecycle/container-cleanup-hook.d.ts +41 -0
- package/dist/lib/work-lifecycle/container-cleanup-hook.js +98 -0
- package/dist/lib/work-lifecycle/container-cleanup-hook.js.map +1 -0
- package/dist/lib/work-lifecycle/index.d.ts +1 -0
- package/dist/lib/work-lifecycle/index.js +1 -0
- package/dist/lib/work-lifecycle/index.js.map +1 -1
- package/oclif.manifest.json +5905 -5844
- package/package.json +1 -1
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class SessionCleanup extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
'dry-run': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
8
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
9
|
+
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
};
|
|
12
|
+
protected getPMOOptions(): {
|
|
13
|
+
promptIfMultiple: boolean;
|
|
14
|
+
};
|
|
15
|
+
execute(): Promise<void>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import Database from 'better-sqlite3';
|
|
4
|
+
import { styles } from '../../lib/styles.js';
|
|
5
|
+
import { getWorkspaceInfo } from '../../lib/agents/commands.js';
|
|
6
|
+
import { ExecutionStorage } from '../../lib/execution/index.js';
|
|
7
|
+
import { listAgentContainers, cleanupCompletedContainers, } from '../../lib/execution/container-cleanup.js';
|
|
8
|
+
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
9
|
+
import { shouldOutputJson, outputSuccessAsJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
|
|
10
|
+
export default class SessionCleanup extends PMOCommand {
|
|
11
|
+
static description = 'Stop and remove Docker containers for completed agents';
|
|
12
|
+
static examples = [
|
|
13
|
+
'<%= config.bin %> session cleanup',
|
|
14
|
+
'<%= config.bin %> session cleanup --dry-run',
|
|
15
|
+
'<%= config.bin %> session cleanup --force',
|
|
16
|
+
];
|
|
17
|
+
static flags = {
|
|
18
|
+
...pmoBaseFlags,
|
|
19
|
+
'dry-run': Flags.boolean({
|
|
20
|
+
char: 'd',
|
|
21
|
+
description: 'Show what would be cleaned up without actually doing it',
|
|
22
|
+
default: false,
|
|
23
|
+
}),
|
|
24
|
+
force: Flags.boolean({
|
|
25
|
+
char: 'f',
|
|
26
|
+
description: 'Remove all agent containers, including those with active executions',
|
|
27
|
+
default: false,
|
|
28
|
+
}),
|
|
29
|
+
};
|
|
30
|
+
getPMOOptions() {
|
|
31
|
+
return { promptIfMultiple: false };
|
|
32
|
+
}
|
|
33
|
+
async execute() {
|
|
34
|
+
const { flags } = await this.parse(SessionCleanup);
|
|
35
|
+
const jsonMode = shouldOutputJson(flags);
|
|
36
|
+
const dryRun = flags['dry-run'];
|
|
37
|
+
const force = flags.force;
|
|
38
|
+
// Get workspace info
|
|
39
|
+
let workspaceInfo;
|
|
40
|
+
try {
|
|
41
|
+
workspaceInfo = getWorkspaceInfo();
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
if (jsonMode) {
|
|
45
|
+
outputErrorAsJson('NOT_IN_WORKSPACE', 'Not in a workspace. Run from a proletariat HQ directory.', createMetadata('session cleanup', flags));
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
this.log(styles.error('Not in a workspace. Run from a proletariat HQ directory.'));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// Open database
|
|
52
|
+
const dbPath = path.join(workspaceInfo.path, '.proletariat', 'workspace.db');
|
|
53
|
+
const db = new Database(dbPath);
|
|
54
|
+
const executionStorage = new ExecutionStorage(db);
|
|
55
|
+
try {
|
|
56
|
+
// Find active executions to determine which containers are still needed
|
|
57
|
+
const activeAgentNames = new Set();
|
|
58
|
+
if (!force) {
|
|
59
|
+
const runningExecutions = executionStorage.listExecutions({ status: 'running' });
|
|
60
|
+
const startingExecutions = executionStorage.listExecutions({ status: 'starting' });
|
|
61
|
+
for (const exec of [...runningExecutions, ...startingExecutions]) {
|
|
62
|
+
activeAgentNames.add(exec.agentName);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// List all containers first for reporting
|
|
66
|
+
const allContainers = listAgentContainers();
|
|
67
|
+
if (allContainers.length === 0) {
|
|
68
|
+
if (jsonMode) {
|
|
69
|
+
outputSuccessAsJson({
|
|
70
|
+
message: 'No agent containers found.',
|
|
71
|
+
stopped: [],
|
|
72
|
+
removed: [],
|
|
73
|
+
skipped: [],
|
|
74
|
+
errors: [],
|
|
75
|
+
}, createMetadata('session cleanup', flags));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
this.log('');
|
|
79
|
+
this.log(styles.success('No agent containers found. Nothing to clean up.'));
|
|
80
|
+
this.log('');
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
// Perform cleanup
|
|
84
|
+
const result = cleanupCompletedContainers(activeAgentNames, { dryRun });
|
|
85
|
+
if (result.removed.length === 0 && result.errors.length === 0) {
|
|
86
|
+
if (jsonMode) {
|
|
87
|
+
outputSuccessAsJson({
|
|
88
|
+
message: 'All containers have active executions. Nothing to clean up.',
|
|
89
|
+
stopped: [],
|
|
90
|
+
removed: [],
|
|
91
|
+
skipped: result.skipped,
|
|
92
|
+
errors: [],
|
|
93
|
+
}, createMetadata('session cleanup', flags));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
this.log('');
|
|
97
|
+
this.log(styles.info('All containers have active executions. Nothing to clean up.'));
|
|
98
|
+
if (result.skipped.length > 0) {
|
|
99
|
+
this.log(styles.muted(` ${result.skipped.length} container(s) skipped (active agents)`));
|
|
100
|
+
}
|
|
101
|
+
this.log('');
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
// Output results
|
|
105
|
+
if (jsonMode) {
|
|
106
|
+
outputSuccessAsJson({
|
|
107
|
+
message: `${dryRun ? 'Would remove' : 'Removed'} ${result.removed.length} container(s)`,
|
|
108
|
+
dryRun,
|
|
109
|
+
...result,
|
|
110
|
+
}, createMetadata('session cleanup', flags));
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
this.log('');
|
|
114
|
+
this.log(styles.header(`${dryRun ? '[DRY RUN] ' : ''}Container Cleanup`));
|
|
115
|
+
this.log('═'.repeat(50));
|
|
116
|
+
if (result.stopped.length > 0) {
|
|
117
|
+
this.log(styles.info(` ${result.stopped.length} container(s) ${dryRun ? 'would be ' : ''}stopped:`));
|
|
118
|
+
for (const name of result.stopped) {
|
|
119
|
+
this.log(styles.muted(` - ${name}`));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (result.removed.length > 0) {
|
|
123
|
+
this.log(styles.success(` ${result.removed.length} container(s) ${dryRun ? 'would be ' : ''}removed:`));
|
|
124
|
+
for (const name of result.removed) {
|
|
125
|
+
this.log(styles.muted(` - ${name}`));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (result.skipped.length > 0) {
|
|
129
|
+
this.log(styles.muted(` ${result.skipped.length} container(s) skipped (active agents)`));
|
|
130
|
+
}
|
|
131
|
+
if (result.errors.length > 0) {
|
|
132
|
+
for (const err of result.errors) {
|
|
133
|
+
this.log(styles.error(` ${err}`));
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
this.log('');
|
|
137
|
+
}
|
|
138
|
+
finally {
|
|
139
|
+
db.close();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=cleanup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../../src/commands/session/cleanup.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,6 +32,7 @@ export default class Session extends PMOCommand {
|
|
|
32
32
|
{ name: 'Execute command in agent context', value: 'exec', command: 'prlt session exec --json' },
|
|
33
33
|
{ name: 'Restart an agent session', value: 'restart', command: 'prlt session restart --json' },
|
|
34
34
|
{ name: 'Prune stale sessions', value: 'prune', command: 'prlt session prune --json' },
|
|
35
|
+
{ name: 'Clean up completed containers', value: 'cleanup', command: 'prlt session cleanup --json' },
|
|
35
36
|
{ name: 'Cancel', value: 'cancel' },
|
|
36
37
|
],
|
|
37
38
|
}], jsonModeConfig);
|
|
@@ -70,6 +71,9 @@ export default class Session extends PMOCommand {
|
|
|
70
71
|
case 'prune':
|
|
71
72
|
await this.config.runCommand('session:prune', []);
|
|
72
73
|
break;
|
|
74
|
+
case 'cleanup':
|
|
75
|
+
await this.config.runCommand('session:cleanup', []);
|
|
76
|
+
break;
|
|
73
77
|
}
|
|
74
78
|
}
|
|
75
79
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/session/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/session/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Container Cleanup Module
|
|
3
|
+
*
|
|
4
|
+
* Provides triggered cleanup of Docker containers associated with completed
|
|
5
|
+
* agent work. Containers are identified by the prlt-agent-* naming convention
|
|
6
|
+
* and cross-referenced with execution records in the database.
|
|
7
|
+
*
|
|
8
|
+
* This is NOT TTL-based — cleanup is triggered explicitly via the
|
|
9
|
+
* `session cleanup` command or automatically via lifecycle hooks
|
|
10
|
+
* when agent work completes.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Information about a Docker container managed by prlt.
|
|
14
|
+
*/
|
|
15
|
+
export interface ContainerInfo {
|
|
16
|
+
containerId: string;
|
|
17
|
+
containerName: string;
|
|
18
|
+
agentName: string;
|
|
19
|
+
running: boolean;
|
|
20
|
+
status: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Result of a container cleanup operation.
|
|
24
|
+
*/
|
|
25
|
+
export interface ContainerCleanupResult {
|
|
26
|
+
stopped: string[];
|
|
27
|
+
removed: string[];
|
|
28
|
+
errors: string[];
|
|
29
|
+
skipped: string[];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* List all prlt-agent-* Docker containers (running and stopped).
|
|
33
|
+
*/
|
|
34
|
+
export declare function listAgentContainers(): ContainerInfo[];
|
|
35
|
+
/**
|
|
36
|
+
* Find containers whose agents have completed work (no active execution).
|
|
37
|
+
* Cross-references running containers against execution records.
|
|
38
|
+
*/
|
|
39
|
+
export declare function findCompletedContainers(containers: ContainerInfo[], activeAgentNames: Set<string>): ContainerInfo[];
|
|
40
|
+
/**
|
|
41
|
+
* Stop and remove a single Docker container.
|
|
42
|
+
*/
|
|
43
|
+
export declare function removeContainer(containerId: string): {
|
|
44
|
+
success: boolean;
|
|
45
|
+
error?: string;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Clean up completed agent containers.
|
|
49
|
+
*
|
|
50
|
+
* Stops and removes Docker containers for agents that have no active
|
|
51
|
+
* (running/starting) execution records.
|
|
52
|
+
*
|
|
53
|
+
* @param activeAgentNames - Set of agent names with active executions
|
|
54
|
+
* @param options - Cleanup options
|
|
55
|
+
* @returns Cleanup result with details of what was done
|
|
56
|
+
*/
|
|
57
|
+
export declare function cleanupCompletedContainers(activeAgentNames: Set<string>, options?: {
|
|
58
|
+
dryRun?: boolean;
|
|
59
|
+
}): ContainerCleanupResult;
|
|
60
|
+
/**
|
|
61
|
+
* Clean up a specific agent's container by agent name.
|
|
62
|
+
* Used by lifecycle hooks when a specific agent completes.
|
|
63
|
+
*/
|
|
64
|
+
export declare function cleanupAgentContainer(agentName: string): {
|
|
65
|
+
success: boolean;
|
|
66
|
+
error?: string;
|
|
67
|
+
};
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Container Cleanup Module
|
|
3
|
+
*
|
|
4
|
+
* Provides triggered cleanup of Docker containers associated with completed
|
|
5
|
+
* agent work. Containers are identified by the prlt-agent-* naming convention
|
|
6
|
+
* and cross-referenced with execution records in the database.
|
|
7
|
+
*
|
|
8
|
+
* This is NOT TTL-based — cleanup is triggered explicitly via the
|
|
9
|
+
* `session cleanup` command or automatically via lifecycle hooks
|
|
10
|
+
* when agent work completes.
|
|
11
|
+
*/
|
|
12
|
+
import { execSync } from 'node:child_process';
|
|
13
|
+
import { getAgentContainerName, containerExists, } from './runners/docker-management.js';
|
|
14
|
+
/**
|
|
15
|
+
* List all prlt-agent-* Docker containers (running and stopped).
|
|
16
|
+
*/
|
|
17
|
+
export function listAgentContainers() {
|
|
18
|
+
try {
|
|
19
|
+
const output = execSync('docker ps -a --filter "name=prlt-agent-" --format "{{.ID}}\\t{{.Names}}\\t{{.State}}"', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'], timeout: 10000 }).trim();
|
|
20
|
+
if (!output)
|
|
21
|
+
return [];
|
|
22
|
+
return output.split('\n').filter(Boolean).map(line => {
|
|
23
|
+
const [containerId, containerName, status] = line.split('\t');
|
|
24
|
+
const agentName = containerName.replace(/^prlt-agent-/, '');
|
|
25
|
+
return {
|
|
26
|
+
containerId,
|
|
27
|
+
containerName,
|
|
28
|
+
agentName,
|
|
29
|
+
running: status === 'running',
|
|
30
|
+
status,
|
|
31
|
+
};
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Find containers whose agents have completed work (no active execution).
|
|
40
|
+
* Cross-references running containers against execution records.
|
|
41
|
+
*/
|
|
42
|
+
export function findCompletedContainers(containers, activeAgentNames) {
|
|
43
|
+
return containers.filter(c => !activeAgentNames.has(c.agentName));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Stop and remove a single Docker container.
|
|
47
|
+
*/
|
|
48
|
+
export function removeContainer(containerId) {
|
|
49
|
+
try {
|
|
50
|
+
execSync(`docker rm -f ${containerId}`, {
|
|
51
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
52
|
+
timeout: 30000,
|
|
53
|
+
});
|
|
54
|
+
return { success: true };
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
return {
|
|
58
|
+
success: false,
|
|
59
|
+
error: error instanceof Error ? error.message : String(error),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Clean up completed agent containers.
|
|
65
|
+
*
|
|
66
|
+
* Stops and removes Docker containers for agents that have no active
|
|
67
|
+
* (running/starting) execution records.
|
|
68
|
+
*
|
|
69
|
+
* @param activeAgentNames - Set of agent names with active executions
|
|
70
|
+
* @param options - Cleanup options
|
|
71
|
+
* @returns Cleanup result with details of what was done
|
|
72
|
+
*/
|
|
73
|
+
export function cleanupCompletedContainers(activeAgentNames, options) {
|
|
74
|
+
const dryRun = options?.dryRun ?? false;
|
|
75
|
+
const result = {
|
|
76
|
+
stopped: [],
|
|
77
|
+
removed: [],
|
|
78
|
+
errors: [],
|
|
79
|
+
skipped: [],
|
|
80
|
+
};
|
|
81
|
+
const allContainers = listAgentContainers();
|
|
82
|
+
const completedContainers = findCompletedContainers(allContainers, activeAgentNames);
|
|
83
|
+
for (const container of completedContainers) {
|
|
84
|
+
if (dryRun) {
|
|
85
|
+
result.removed.push(container.containerName);
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
const { success, error } = removeContainer(container.containerId);
|
|
89
|
+
if (success) {
|
|
90
|
+
if (container.running) {
|
|
91
|
+
result.stopped.push(container.containerName);
|
|
92
|
+
}
|
|
93
|
+
result.removed.push(container.containerName);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
result.errors.push(`Failed to remove ${container.containerName}: ${error}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Track containers that were skipped (still active)
|
|
100
|
+
const activeContainers = allContainers.filter(c => activeAgentNames.has(c.agentName));
|
|
101
|
+
for (const container of activeContainers) {
|
|
102
|
+
result.skipped.push(container.containerName);
|
|
103
|
+
}
|
|
104
|
+
return result;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Clean up a specific agent's container by agent name.
|
|
108
|
+
* Used by lifecycle hooks when a specific agent completes.
|
|
109
|
+
*/
|
|
110
|
+
export function cleanupAgentContainer(agentName) {
|
|
111
|
+
const containerName = getAgentContainerName(agentName);
|
|
112
|
+
if (!containerExists(containerName)) {
|
|
113
|
+
return { success: true }; // Nothing to clean up
|
|
114
|
+
}
|
|
115
|
+
return removeContainer(containerName);
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=container-cleanup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container-cleanup.js","sourceRoot":"","sources":["../../../src/lib/execution/container-cleanup.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,6 +27,7 @@ import { initOutboundSync } from '../external-issues/outbound-sync.js';
|
|
|
27
27
|
import { initHookManager } from '../work-lifecycle/hooks/index.js';
|
|
28
28
|
import { initWorkflowRuleEvaluator } from '../work-lifecycle/rule-evaluator.js';
|
|
29
29
|
import { initActionChaining } from '../work-lifecycle/action-chaining.js';
|
|
30
|
+
import { initContainerCleanupHook } from '../work-lifecycle/container-cleanup-hook.js';
|
|
30
31
|
import { initTriggerHandler } from '../providers/trigger-config.js';
|
|
31
32
|
/**
|
|
32
33
|
* Get the board path for a project
|
|
@@ -233,6 +234,8 @@ export function getStorageWithAutoSync(pmoPath, _storageType, _logger) {
|
|
|
233
234
|
initWorkflowRuleEvaluator(storage.getDatabase());
|
|
234
235
|
// Initialize action chaining (auto-spawns next action on workflow rule matches)
|
|
235
236
|
initActionChaining(storage.getDatabase(), storage, pmoPath);
|
|
237
|
+
// Initialize container cleanup hook (auto-removes Docker containers when agents stop)
|
|
238
|
+
initContainerCleanupHook();
|
|
236
239
|
// Initialize configurable trigger handler (agent_started, pr_created, etc. → target column)
|
|
237
240
|
initTriggerHandler(storage.getDatabase(), async (ticketId, projectId, targetStatus) => {
|
|
238
241
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-manager.js","sourceRoot":"","sources":["../../../src/lib/pmo/sync-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,SAAiB;IAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAC1E,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC9E,MAAM,uBAAuB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,SAAS,YAAY,CAAC,CAAC;IACpG,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,SAAS,KAAK,CAAC,CAAC;IAEvF,qCAAqC;IACrC,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACnC,OAAO,eAAe,CAAC;IACzB,CAAC;IACD,IAAI,EAAE,CAAC,UAAU,CAAC,uBAAuB,CAAC,EAAE,CAAC;QAC3C,OAAO,uBAAuB,CAAC;IACjC,CAAC;IACD,IAAI,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACrC,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IACD,iDAAiD;IACjD,OAAO,UAAU,CAAC;AACpB,CAAC;AAeD;;GAEG;AACH,SAAS,WAAW,CAAC,OAAe;IAClC,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAsB;IACpD,MAAM,IAAI,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IACxC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,YAAY;QAC7B,cAAc,EAAE,IAAI,CAAC,UAAU;QAC/B,aAAa,EAAE,IAAI,CAAC,YAAY;QAChC,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAsB,EACtB,UAAkB,EAClB,WAAoB;IAEpB,OAAO,CAAC,gBAAgB,CAAC;QACvB,UAAU;QACV,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;QACxB,WAAW;KACZ,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,OAAsB,EAAE,YAAoB,SAAS;IACtG,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAEnD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAEtC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,sDAAsD;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wCAAwC;IACxC,OAAO,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,cAAc,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAe,EACf,OAAsB,EACtB,OAAe;IAEf,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAEtC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,0CAA0C;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACzC,OAAO,WAAW,KAAK,IAAI,CAAC,WAAW,CAAC;AAC1C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,OAAsB,EACtB,MAA8B,EAC9B,YAAoB,SAAS;IAE7B,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAEnD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,6BAA6B;IAC7B,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;QACpD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,8CAA8C;IAC9C,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE1C,oCAAoC;IACpC,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;QACrD,sEAAsE;QACtE,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACxD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,uCAAuC,CAAC,CAAC;QAChF,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,sCAAsC;IACtC,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC9C,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAEhC,+CAA+C;IAC/C,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAExD,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,uBAAuB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,QAAuB,EACvB,OAA+B,EAC/B,UAAmB;IAEnB,6DAA6D;IAC7D,gCAAgC;IAChC;;;;;;;;;;;;;;;;;;MAkBE;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,gEAAgE;IAChE,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,4BAA4B;IAEpE,OAAO,UAAU,KAAK,GAAG,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;QACrE,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAED,wCAAwC;IACxC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;AAClE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAAe,EACf,YAA8B,EAC9B,OAA+B;IAE/B,kFAAkF;IAClF,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAE3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,yBAAyB,CAAC,CAAC;IAC5E,CAAC;IAED,+FAA+F;IAC/F,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IAE1C,kEAAkE;IAClE,yEAAyE;IACzE,iEAAiE;IACjE,wBAAwB,EAAE,CAAC;IAE3B,+DAA+D;IAC/D,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAExC,yEAAyE;IACzE,eAAe,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAEvC,iFAAiF;IACjF,yBAAyB,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAEjD,gFAAgF;IAChF,kBAAkB,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAE5D,4FAA4F;IAC5F,kBAAkB,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE;QACpF,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAe,EACf,OAAsB,EACtB,SAA2B,EAC3B,MAA8B;IAE9B,oBAAoB;IACpB,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IAEjC,0BAA0B;IAC1B,MAAM,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAElD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
1
|
+
{"version":3,"file":"sync-manager.js","sourceRoot":"","sources":["../../../src/lib/pmo/sync-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Container Cleanup Lifecycle Hook
|
|
3
|
+
*
|
|
4
|
+
* Subscribes to agent lifecycle events on the global EventBus and
|
|
5
|
+
* automatically cleans up Docker containers when agents complete work.
|
|
6
|
+
*
|
|
7
|
+
* This is a triggered cleanup (not TTL-based): containers are removed
|
|
8
|
+
* when the agent:stopped event fires or when stale executions are detected.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* ContainerCleanupHook listens for agent completion events and
|
|
12
|
+
* removes the associated Docker container.
|
|
13
|
+
*
|
|
14
|
+
* Cleanup is fire-and-forget: failures are logged but never block
|
|
15
|
+
* the event emission chain.
|
|
16
|
+
*/
|
|
17
|
+
export declare class ContainerCleanupHook {
|
|
18
|
+
private unsubscribers;
|
|
19
|
+
/**
|
|
20
|
+
* Start listening for agent lifecycle events.
|
|
21
|
+
*/
|
|
22
|
+
start(): void;
|
|
23
|
+
/**
|
|
24
|
+
* Stop listening and clean up subscriptions.
|
|
25
|
+
*/
|
|
26
|
+
stop(): void;
|
|
27
|
+
/**
|
|
28
|
+
* Handle agent:stopped by cleaning up the agent's container.
|
|
29
|
+
* Extracts agent name from the session ID or event data.
|
|
30
|
+
*/
|
|
31
|
+
private handleAgentStopped;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Initialize and start the container cleanup hook.
|
|
35
|
+
* Safe to call multiple times — subsequent calls are no-ops.
|
|
36
|
+
*/
|
|
37
|
+
export declare function initContainerCleanupHook(): ContainerCleanupHook;
|
|
38
|
+
/**
|
|
39
|
+
* Stop the container cleanup hook (primarily for testing).
|
|
40
|
+
*/
|
|
41
|
+
export declare function stopContainerCleanupHook(): void;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Container Cleanup Lifecycle Hook
|
|
3
|
+
*
|
|
4
|
+
* Subscribes to agent lifecycle events on the global EventBus and
|
|
5
|
+
* automatically cleans up Docker containers when agents complete work.
|
|
6
|
+
*
|
|
7
|
+
* This is a triggered cleanup (not TTL-based): containers are removed
|
|
8
|
+
* when the agent:stopped event fires or when stale executions are detected.
|
|
9
|
+
*/
|
|
10
|
+
import { getEventBus } from '../events/event-bus.js';
|
|
11
|
+
import { cleanupAgentContainer } from '../execution/container-cleanup.js';
|
|
12
|
+
/**
|
|
13
|
+
* ContainerCleanupHook listens for agent completion events and
|
|
14
|
+
* removes the associated Docker container.
|
|
15
|
+
*
|
|
16
|
+
* Cleanup is fire-and-forget: failures are logged but never block
|
|
17
|
+
* the event emission chain.
|
|
18
|
+
*/
|
|
19
|
+
export class ContainerCleanupHook {
|
|
20
|
+
unsubscribers = [];
|
|
21
|
+
/**
|
|
22
|
+
* Start listening for agent lifecycle events.
|
|
23
|
+
*/
|
|
24
|
+
start() {
|
|
25
|
+
const bus = getEventBus();
|
|
26
|
+
// Clean up container when an agent is stopped
|
|
27
|
+
this.unsubscribers.push(bus.on('agent:stopped', (payload) => {
|
|
28
|
+
this.handleAgentStopped(payload);
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Stop listening and clean up subscriptions.
|
|
33
|
+
*/
|
|
34
|
+
stop() {
|
|
35
|
+
for (const unsub of this.unsubscribers) {
|
|
36
|
+
unsub();
|
|
37
|
+
}
|
|
38
|
+
this.unsubscribers = [];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Handle agent:stopped by cleaning up the agent's container.
|
|
42
|
+
* Extracts agent name from the session ID or event data.
|
|
43
|
+
*/
|
|
44
|
+
handleAgentStopped(eventData) {
|
|
45
|
+
try {
|
|
46
|
+
// The sessionId format is: {ticketId}-{action}-{agentName}
|
|
47
|
+
// We need the agent name to find the container
|
|
48
|
+
const sessionId = eventData.sessionId;
|
|
49
|
+
if (!sessionId)
|
|
50
|
+
return;
|
|
51
|
+
// Extract agent name from session ID
|
|
52
|
+
// Format: TKT-123-implement-agent-name or similar
|
|
53
|
+
const agentName = extractAgentNameFromSessionId(sessionId);
|
|
54
|
+
if (!agentName)
|
|
55
|
+
return;
|
|
56
|
+
cleanupAgentContainer(agentName);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// Container cleanup errors are non-fatal
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Extract agent name from a session ID.
|
|
65
|
+
* Session IDs follow the format: {ticketId}-{action}-{agentName}
|
|
66
|
+
* e.g., "TKT-100-implement-bold-turing" → "bold-turing"
|
|
67
|
+
*/
|
|
68
|
+
function extractAgentNameFromSessionId(sessionId) {
|
|
69
|
+
// Match pattern: TKT-NNN-action-agentname or similar
|
|
70
|
+
// Agent names are typically two hyphenated words: adjective-noun
|
|
71
|
+
const match = sessionId.match(/^(?:TKT-\d+|[A-Z]+-\d+)-\w+-(.+)$/);
|
|
72
|
+
return match ? match[1] : null;
|
|
73
|
+
}
|
|
74
|
+
// =============================================================================
|
|
75
|
+
// Singleton
|
|
76
|
+
// =============================================================================
|
|
77
|
+
let _hook;
|
|
78
|
+
/**
|
|
79
|
+
* Initialize and start the container cleanup hook.
|
|
80
|
+
* Safe to call multiple times — subsequent calls are no-ops.
|
|
81
|
+
*/
|
|
82
|
+
export function initContainerCleanupHook() {
|
|
83
|
+
if (!_hook) {
|
|
84
|
+
_hook = new ContainerCleanupHook();
|
|
85
|
+
_hook.start();
|
|
86
|
+
}
|
|
87
|
+
return _hook;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Stop the container cleanup hook (primarily for testing).
|
|
91
|
+
*/
|
|
92
|
+
export function stopContainerCleanupHook() {
|
|
93
|
+
if (_hook) {
|
|
94
|
+
_hook.stop();
|
|
95
|
+
_hook = undefined;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=container-cleanup-hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container-cleanup-hook.js","sourceRoot":"","sources":["../../../src/lib/work-lifecycle/container-cleanup-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAA;AAEzE;;;;;;GAMG;AACH,MAAM,OAAO,oBAAoB;IACvB,aAAa,GAAsB,EAAE,CAAA;IAE7C;;OAEG;IACH,KAAK;QACH,MAAM,GAAG,GAAG,WAAW,EAAE,CAAA;QAEzB,8CAA8C;QAC9C,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,GAAG,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,OAAO,EAAE,EAAE;YAClC,IAAI,CAAC,kBAAkB,CAAC,OAA6C,CAAC,CAAA;QACxE,CAAC,CAAC,CACH,CAAA;IACH,CAAC;IAED;;OAEG;IACH,IAAI;QACF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvC,KAAK,EAAE,CAAA;QACT,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,EAAE,CAAA;IACzB,CAAC;IAED;;;OAGG;IACK,kBAAkB,CAAC,SAAkC;QAC3D,IAAI,CAAC;YACH,2DAA2D;YAC3D,+CAA+C;YAC/C,MAAM,SAAS,GAAG,SAAS,CAAC,SAA+B,CAAA;YAC3D,IAAI,CAAC,SAAS;gBAAE,OAAM;YAEtB,qCAAqC;YACrC,kDAAkD;YAClD,MAAM,SAAS,GAAG,6BAA6B,CAAC,SAAS,CAAC,CAAA;YAC1D,IAAI,CAAC,SAAS;gBAAE,OAAM;YAEtB,qBAAqB,CAAC,SAAS,CAAC,CAAA;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,yCAAyC;QAC3C,CAAC;IACH,CAAC;CACF;AAED;;;;GAIG;AACH,SAAS,6BAA6B,CAAC,SAAiB;IACtD,qDAAqD;IACrD,iEAAiE;IACjE,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAA;IAClE,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAChC,CAAC;AAED,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,IAAI,KAAuC,CAAA;AAE3C;;;GAGG;AACH,MAAM,UAAU,wBAAwB;IACtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;QAClC,KAAK,CAAC,KAAK,EAAE,CAAA;IACf,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB;IACtC,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,CAAC,IAAI,EAAE,CAAA;QACZ,KAAK,GAAG,SAAS,CAAA;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -12,3 +12,4 @@ export { handlePostExecutionTransition, type PostExecutionContext, type PostExec
|
|
|
12
12
|
export { validateCommits, tryValidateCommits, type CommitValidationResult, } from '../execution/commit-validation.js';
|
|
13
13
|
export { WorkflowRuleEvaluator, initWorkflowRuleEvaluator, stopWorkflowRuleEvaluator, } from './rule-evaluator.js';
|
|
14
14
|
export { ActionChainingHandler, initActionChaining, stopActionChaining, } from './action-chaining.js';
|
|
15
|
+
export { ContainerCleanupHook, initContainerCleanupHook, stopContainerCleanupHook, } from './container-cleanup-hook.js';
|
|
@@ -11,4 +11,5 @@ export { handlePostExecutionTransition, } from './post-execution.js';
|
|
|
11
11
|
export { validateCommits, tryValidateCommits, } from '../execution/commit-validation.js';
|
|
12
12
|
export { WorkflowRuleEvaluator, initWorkflowRuleEvaluator, stopWorkflowRuleEvaluator, } from './rule-evaluator.js';
|
|
13
13
|
export { ActionChainingHandler, initActionChaining, stopActionChaining, } from './action-chaining.js';
|
|
14
|
+
export { ContainerCleanupHook, initContainerCleanupHook, stopContainerCleanupHook, } from './container-cleanup-hook.js';
|
|
14
15
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/work-lifecycle/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,eAAe,EACf,eAAe,GAChB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EACL,6BAA6B,GAG9B,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EACL,eAAe,EACf,kBAAkB,GAEnB,MAAM,mCAAmC,CAAA;AAE1C,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,sBAAsB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/work-lifecycle/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,eAAe,EACf,eAAe,GAChB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EACL,6BAA6B,GAG9B,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EACL,eAAe,EACf,kBAAkB,GAEnB,MAAM,mCAAmC,CAAA;AAE1C,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,6BAA6B,CAAA"}
|