argusai-mcp 0.1.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 (53) hide show
  1. package/dist/formatters/result-formatter.d.ts +44 -0
  2. package/dist/formatters/result-formatter.d.ts.map +1 -0
  3. package/dist/formatters/result-formatter.js +162 -0
  4. package/dist/formatters/result-formatter.js.map +1 -0
  5. package/dist/index.d.ts +27 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +90 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/server.d.ts +34 -0
  10. package/dist/server.d.ts.map +1 -0
  11. package/dist/server.js +184 -0
  12. package/dist/server.js.map +1 -0
  13. package/dist/session.d.ts +93 -0
  14. package/dist/session.d.ts.map +1 -0
  15. package/dist/session.js +220 -0
  16. package/dist/session.js.map +1 -0
  17. package/dist/tools/build.d.ts +31 -0
  18. package/dist/tools/build.d.ts.map +1 -0
  19. package/dist/tools/build.js +110 -0
  20. package/dist/tools/build.js.map +1 -0
  21. package/dist/tools/clean.d.ts +40 -0
  22. package/dist/tools/clean.d.ts.map +1 -0
  23. package/dist/tools/clean.js +111 -0
  24. package/dist/tools/clean.js.map +1 -0
  25. package/dist/tools/init.d.ts +41 -0
  26. package/dist/tools/init.d.ts.map +1 -0
  27. package/dist/tools/init.js +96 -0
  28. package/dist/tools/init.js.map +1 -0
  29. package/dist/tools/logs.d.ts +28 -0
  30. package/dist/tools/logs.d.ts.map +1 -0
  31. package/dist/tools/logs.js +35 -0
  32. package/dist/tools/logs.js.map +1 -0
  33. package/dist/tools/mock-requests.d.ts +36 -0
  34. package/dist/tools/mock-requests.d.ts.map +1 -0
  35. package/dist/tools/mock-requests.js +62 -0
  36. package/dist/tools/mock-requests.js.map +1 -0
  37. package/dist/tools/run.d.ts +58 -0
  38. package/dist/tools/run.d.ts.map +1 -0
  39. package/dist/tools/run.js +190 -0
  40. package/dist/tools/run.js.map +1 -0
  41. package/dist/tools/setup.d.ts +47 -0
  42. package/dist/tools/setup.d.ts.map +1 -0
  43. package/dist/tools/setup.js +162 -0
  44. package/dist/tools/setup.js.map +1 -0
  45. package/dist/tools/status.d.ts +44 -0
  46. package/dist/tools/status.d.ts.map +1 -0
  47. package/dist/tools/status.js +79 -0
  48. package/dist/tools/status.js.map +1 -0
  49. package/dist/transports/http-transport.d.ts +41 -0
  50. package/dist/transports/http-transport.d.ts.map +1 -0
  51. package/dist/transports/http-transport.js +107 -0
  52. package/dist/transports/http-transport.js.map +1 -0
  53. package/package.json +51 -0
@@ -0,0 +1,93 @@
1
+ /**
2
+ * @module session
3
+ * Per-project session state management for the MCP server.
4
+ *
5
+ * Tracks loaded configuration, running containers, mock servers,
6
+ * and the overall lifecycle state for each project.
7
+ *
8
+ * Multi-tenant: session keys are `clientId:projectPath` so different
9
+ * clients can independently manage the same project. Includes TTL-based
10
+ * auto-cleanup and per-session mutex.
11
+ */
12
+ import type { E2EConfig, SSEBus } from 'argusai-core';
13
+ export type SessionState = 'initialized' | 'built' | 'running' | 'stopped';
14
+ export interface ProjectSession {
15
+ projectPath: string;
16
+ config: E2EConfig;
17
+ configPath: string;
18
+ containerIds: Map<string, string>;
19
+ mockServers: Map<string, {
20
+ server: {
21
+ close(): Promise<void>;
22
+ };
23
+ port: number;
24
+ }>;
25
+ networkName: string;
26
+ createdAt: number;
27
+ lastAccessedAt: number;
28
+ state: SessionState;
29
+ /** Client identifier for multi-tenant isolation */
30
+ clientId: string;
31
+ }
32
+ export interface SessionManagerOptions {
33
+ eventBus?: SSEBus;
34
+ /** Session TTL in milliseconds (default: 2 hours) */
35
+ ttlMs?: number;
36
+ /** Enable automatic cleanup of expired sessions */
37
+ autoCleanup?: boolean;
38
+ }
39
+ export declare class SessionManager {
40
+ private sessions;
41
+ private mutex;
42
+ private ttlMs;
43
+ private cleanupTimer?;
44
+ eventBus?: SSEBus;
45
+ constructor(eventBusOrOptions?: SSEBus | SessionManagerOptions);
46
+ /** Build the composite session key. */
47
+ private key;
48
+ /** Default client ID for single-tenant (stdio) mode. */
49
+ static readonly DEFAULT_CLIENT = "default";
50
+ /**
51
+ * Check whether a session exists for the given project.
52
+ * Falls back to default client if clientId is not provided.
53
+ */
54
+ has(projectPath: string, clientId?: string): boolean;
55
+ /**
56
+ * Retrieve an existing session or throw SESSION_NOT_FOUND.
57
+ */
58
+ getOrThrow(projectPath: string, clientId?: string): ProjectSession;
59
+ /**
60
+ * Create a new session for a project.
61
+ */
62
+ create(projectPath: string, config: E2EConfig, configPath: string, clientId?: string): ProjectSession;
63
+ /**
64
+ * Remove a session and release any held lock.
65
+ */
66
+ remove(projectPath: string, clientId?: string): void;
67
+ /**
68
+ * Transition a session to a new state, validating the state machine.
69
+ */
70
+ transition(projectPath: string, newState: SessionState, clientId?: string): void;
71
+ acquireLock(projectPath: string, operation: string, clientId?: string): void;
72
+ releaseLock(projectPath: string, clientId?: string): void;
73
+ isLocked(projectPath: string, clientId?: string): boolean;
74
+ /** List all active sessions. */
75
+ listSessions(): ProjectSession[];
76
+ /** List sessions for a specific client. */
77
+ listClientSessions(clientId: string): ProjectSession[];
78
+ /** Get total number of active sessions. */
79
+ get size(): number;
80
+ /** Start the periodic cleanup timer. */
81
+ startCleanup(): void;
82
+ /** Stop the periodic cleanup timer. */
83
+ stopCleanup(): void;
84
+ /** Remove sessions that haven't been accessed within the TTL period. */
85
+ cleanupExpired(): string[];
86
+ /** Destroy the manager: cleanup all sessions and stop the timer. */
87
+ destroy(): void;
88
+ }
89
+ export declare class SessionError extends Error {
90
+ readonly code: string;
91
+ constructor(code: string, message: string);
92
+ }
93
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,220 @@
1
+ /**
2
+ * @module session
3
+ * Per-project session state management for the MCP server.
4
+ *
5
+ * Tracks loaded configuration, running containers, mock servers,
6
+ * and the overall lifecycle state for each project.
7
+ *
8
+ * Multi-tenant: session keys are `clientId:projectPath` so different
9
+ * clients can independently manage the same project. Includes TTL-based
10
+ * auto-cleanup and per-session mutex.
11
+ */
12
+ const VALID_TRANSITIONS = {
13
+ initialized: ['built', 'stopped'],
14
+ built: ['running', 'stopped'],
15
+ running: ['stopped'],
16
+ stopped: ['initialized'],
17
+ };
18
+ /** Default session TTL: 2 hours of inactivity */
19
+ const DEFAULT_TTL_MS = 2 * 60 * 60 * 1000;
20
+ /** Cleanup check interval: every 5 minutes */
21
+ const CLEANUP_INTERVAL_MS = 5 * 60 * 1000;
22
+ // =====================================================================
23
+ // SessionMutex — prevents concurrent operations on the same session
24
+ // =====================================================================
25
+ class SessionMutex {
26
+ locks = new Map();
27
+ acquire(key, operation) {
28
+ const existing = this.locks.get(key);
29
+ if (existing) {
30
+ throw new SessionError('INVALID_STATE', `Concurrent operation rejected: "${operation}" cannot run while "${existing.holder}" is in progress`);
31
+ }
32
+ this.locks.set(key, { holder: operation, acquired: Date.now() });
33
+ }
34
+ release(key) {
35
+ this.locks.delete(key);
36
+ }
37
+ isLocked(key) {
38
+ return this.locks.has(key);
39
+ }
40
+ }
41
+ export class SessionManager {
42
+ sessions = new Map();
43
+ mutex = new SessionMutex();
44
+ ttlMs;
45
+ cleanupTimer;
46
+ eventBus;
47
+ constructor(eventBusOrOptions) {
48
+ if (eventBusOrOptions && 'emit' in eventBusOrOptions) {
49
+ // Backward compat: called with just an EventBus
50
+ this.eventBus = eventBusOrOptions;
51
+ this.ttlMs = DEFAULT_TTL_MS;
52
+ }
53
+ else if (eventBusOrOptions) {
54
+ this.eventBus = eventBusOrOptions.eventBus;
55
+ this.ttlMs = eventBusOrOptions.ttlMs ?? DEFAULT_TTL_MS;
56
+ if (eventBusOrOptions.autoCleanup !== false) {
57
+ this.startCleanup();
58
+ }
59
+ }
60
+ else {
61
+ this.ttlMs = DEFAULT_TTL_MS;
62
+ }
63
+ }
64
+ /** Build the composite session key. */
65
+ key(clientId, projectPath) {
66
+ return `${clientId}:${projectPath}`;
67
+ }
68
+ /** Default client ID for single-tenant (stdio) mode. */
69
+ static DEFAULT_CLIENT = 'default';
70
+ /**
71
+ * Check whether a session exists for the given project.
72
+ * Falls back to default client if clientId is not provided.
73
+ */
74
+ has(projectPath, clientId = SessionManager.DEFAULT_CLIENT) {
75
+ return this.sessions.has(this.key(clientId, projectPath));
76
+ }
77
+ /**
78
+ * Retrieve an existing session or throw SESSION_NOT_FOUND.
79
+ */
80
+ getOrThrow(projectPath, clientId = SessionManager.DEFAULT_CLIENT) {
81
+ const k = this.key(clientId, projectPath);
82
+ const session = this.sessions.get(k);
83
+ if (!session) {
84
+ throw new SessionError('SESSION_NOT_FOUND', `No active session for project: ${projectPath} (client: ${clientId})`);
85
+ }
86
+ session.lastAccessedAt = Date.now();
87
+ return session;
88
+ }
89
+ /**
90
+ * Create a new session for a project.
91
+ */
92
+ create(projectPath, config, configPath, clientId = SessionManager.DEFAULT_CLIENT) {
93
+ const k = this.key(clientId, projectPath);
94
+ if (this.sessions.has(k)) {
95
+ throw new SessionError('SESSION_EXISTS', `Session already exists for project: ${projectPath} (client: ${clientId})`);
96
+ }
97
+ const networkName = config.network?.name ?? 'e2e-network';
98
+ const now = Date.now();
99
+ const session = {
100
+ projectPath,
101
+ config,
102
+ configPath,
103
+ containerIds: new Map(),
104
+ mockServers: new Map(),
105
+ networkName,
106
+ createdAt: now,
107
+ lastAccessedAt: now,
108
+ state: 'initialized',
109
+ clientId,
110
+ };
111
+ this.sessions.set(k, session);
112
+ return session;
113
+ }
114
+ /**
115
+ * Remove a session and release any held lock.
116
+ */
117
+ remove(projectPath, clientId = SessionManager.DEFAULT_CLIENT) {
118
+ const k = this.key(clientId, projectPath);
119
+ this.mutex.release(k);
120
+ this.sessions.delete(k);
121
+ }
122
+ /**
123
+ * Transition a session to a new state, validating the state machine.
124
+ */
125
+ transition(projectPath, newState, clientId = SessionManager.DEFAULT_CLIENT) {
126
+ const session = this.getOrThrow(projectPath, clientId);
127
+ const allowed = VALID_TRANSITIONS[session.state];
128
+ if (!allowed.includes(newState)) {
129
+ throw new SessionError('INVALID_STATE', `Cannot transition from "${session.state}" to "${newState}"`);
130
+ }
131
+ session.state = newState;
132
+ }
133
+ acquireLock(projectPath, operation, clientId = SessionManager.DEFAULT_CLIENT) {
134
+ this.mutex.acquire(this.key(clientId, projectPath), operation);
135
+ }
136
+ releaseLock(projectPath, clientId = SessionManager.DEFAULT_CLIENT) {
137
+ this.mutex.release(this.key(clientId, projectPath));
138
+ }
139
+ isLocked(projectPath, clientId = SessionManager.DEFAULT_CLIENT) {
140
+ return this.mutex.isLocked(this.key(clientId, projectPath));
141
+ }
142
+ // =====================================================================
143
+ // Multi-tenant helpers
144
+ // =====================================================================
145
+ /** List all active sessions. */
146
+ listSessions() {
147
+ return [...this.sessions.values()];
148
+ }
149
+ /** List sessions for a specific client. */
150
+ listClientSessions(clientId) {
151
+ return [...this.sessions.values()].filter(s => s.clientId === clientId);
152
+ }
153
+ /** Get total number of active sessions. */
154
+ get size() {
155
+ return this.sessions.size;
156
+ }
157
+ // =====================================================================
158
+ // TTL / Auto-cleanup
159
+ // =====================================================================
160
+ /** Start the periodic cleanup timer. */
161
+ startCleanup() {
162
+ if (this.cleanupTimer)
163
+ return;
164
+ this.cleanupTimer = setInterval(() => this.cleanupExpired(), CLEANUP_INTERVAL_MS);
165
+ if (this.cleanupTimer.unref)
166
+ this.cleanupTimer.unref();
167
+ }
168
+ /** Stop the periodic cleanup timer. */
169
+ stopCleanup() {
170
+ if (this.cleanupTimer) {
171
+ clearInterval(this.cleanupTimer);
172
+ this.cleanupTimer = undefined;
173
+ }
174
+ }
175
+ /** Remove sessions that haven't been accessed within the TTL period. */
176
+ cleanupExpired() {
177
+ const now = Date.now();
178
+ const expired = [];
179
+ for (const [key, session] of this.sessions) {
180
+ if (now - session.lastAccessedAt > this.ttlMs) {
181
+ // Best-effort cleanup of mock servers
182
+ for (const [, mock] of session.mockServers) {
183
+ mock.server.close().catch(() => { });
184
+ }
185
+ this.mutex.release(key);
186
+ this.sessions.delete(key);
187
+ expired.push(key);
188
+ }
189
+ }
190
+ if (expired.length > 0) {
191
+ this.eventBus?.emit('activity', {
192
+ event: 'sessions_cleaned',
193
+ data: { expired, remaining: this.sessions.size },
194
+ });
195
+ }
196
+ return expired;
197
+ }
198
+ /** Destroy the manager: cleanup all sessions and stop the timer. */
199
+ destroy() {
200
+ this.stopCleanup();
201
+ for (const [, session] of this.sessions) {
202
+ for (const [, mock] of session.mockServers) {
203
+ mock.server.close().catch(() => { });
204
+ }
205
+ }
206
+ this.sessions.clear();
207
+ }
208
+ }
209
+ // =====================================================================
210
+ // Error Type
211
+ // =====================================================================
212
+ export class SessionError extends Error {
213
+ code;
214
+ constructor(code, message) {
215
+ super(message);
216
+ this.code = code;
217
+ this.name = 'SessionError';
218
+ }
219
+ }
220
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @module tools/build
3
+ * argus_build — Build Docker images for project services.
4
+ */
5
+ import { SessionManager } from '../session.js';
6
+ import type { PlatformServices } from '../server.js';
7
+ export interface BuildResult {
8
+ services: Array<{
9
+ name: string;
10
+ image: string;
11
+ status: 'success' | 'failed';
12
+ duration: number;
13
+ error?: string;
14
+ }>;
15
+ totalDuration: number;
16
+ }
17
+ /**
18
+ * Handle the argus_build MCP tool call.
19
+ * Builds Docker images for one or all services in the project.
20
+ *
21
+ * @param params - Tool input with projectPath, optional noCache and service filter
22
+ * @param sessionManager - Session store for tracking project state
23
+ * @returns Build results per service with status and timing
24
+ * @throws {SessionError} SESSION_NOT_FOUND if not initialized, SERVICE_NOT_FOUND if filter matches nothing
25
+ */
26
+ export declare function handleBuild(params: {
27
+ projectPath: string;
28
+ noCache?: boolean;
29
+ service?: string;
30
+ }, sessionManager: SessionManager, platform?: PlatformServices): Promise<BuildResult>;
31
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/tools/build.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,EAAE,cAAc,EAAgB,MAAM,eAAe,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;QAC7B,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH,aAAa,EAAE,MAAM,CAAC;CACvB;AA6BD;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EACpE,cAAc,EAAE,cAAc,EAC9B,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,OAAO,CAAC,WAAW,CAAC,CAuFtB"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * @module tools/build
3
+ * argus_build — Build Docker images for project services.
4
+ */
5
+ import { buildImage, } from 'argusai-core';
6
+ import { SessionError } from '../session.js';
7
+ function getServicesToBuild(config, serviceFilter) {
8
+ const targets = [];
9
+ if (config.services && config.services.length > 0) {
10
+ for (const svc of config.services) {
11
+ if (serviceFilter && svc.name !== serviceFilter)
12
+ continue;
13
+ targets.push({ name: svc.name, build: svc.build });
14
+ }
15
+ }
16
+ else if (config.service) {
17
+ const svc = config.service;
18
+ if (!serviceFilter || svc.container.name === serviceFilter) {
19
+ targets.push({ name: svc.container.name, build: svc.build });
20
+ }
21
+ }
22
+ if (serviceFilter && targets.length === 0) {
23
+ throw new SessionError('SERVICE_NOT_FOUND', `Service "${serviceFilter}" not found in configuration`);
24
+ }
25
+ return targets;
26
+ }
27
+ /**
28
+ * Handle the argus_build MCP tool call.
29
+ * Builds Docker images for one or all services in the project.
30
+ *
31
+ * @param params - Tool input with projectPath, optional noCache and service filter
32
+ * @param sessionManager - Session store for tracking project state
33
+ * @returns Build results per service with status and timing
34
+ * @throws {SessionError} SESSION_NOT_FOUND if not initialized, SERVICE_NOT_FOUND if filter matches nothing
35
+ */
36
+ export async function handleBuild(params, sessionManager, platform) {
37
+ const session = sessionManager.getOrThrow(params.projectPath);
38
+ const targets = getServicesToBuild(session.config, params.service);
39
+ const totalStart = Date.now();
40
+ const results = [];
41
+ const bus = sessionManager.eventBus;
42
+ bus?.emit('activity', {
43
+ event: 'activity_start',
44
+ data: { id: `build-${totalStart}`, source: 'ai', operation: 'build', project: session.config.project.name, status: 'running', startTime: totalStart },
45
+ });
46
+ for (const target of targets) {
47
+ const buildStart = Date.now();
48
+ let lineNumber = 0;
49
+ let buildError;
50
+ try {
51
+ const buildOpts = {
52
+ dockerfile: target.build.dockerfile,
53
+ context: target.build.context,
54
+ imageName: target.build.image,
55
+ buildArgs: target.build.args,
56
+ noCache: params.noCache,
57
+ };
58
+ for await (const event of buildImage(buildOpts)) {
59
+ bus?.emit('build', { event: event.type, data: event });
60
+ if (event.type === 'build_log') {
61
+ lineNumber++;
62
+ }
63
+ if (event.type === 'build_end' && !event.success) {
64
+ buildError = event.error;
65
+ }
66
+ }
67
+ }
68
+ catch (err) {
69
+ buildError = err.message;
70
+ }
71
+ results.push({
72
+ name: target.name,
73
+ image: target.build.image,
74
+ status: buildError ? 'failed' : 'success',
75
+ duration: Date.now() - buildStart,
76
+ error: buildError,
77
+ });
78
+ }
79
+ const anyFailed = results.some(r => r.status === 'failed');
80
+ if (!anyFailed) {
81
+ sessionManager.transition(params.projectPath, 'built');
82
+ }
83
+ const totalDuration = Date.now() - totalStart;
84
+ bus?.emit('activity', {
85
+ event: 'activity_update',
86
+ data: { id: `build-${totalStart}`, source: 'ai', operation: 'build', project: session.config.project.name, status: anyFailed ? 'failed' : 'success', startTime: totalStart, endTime: Date.now() },
87
+ });
88
+ // Persist build records
89
+ if (platform?.store) {
90
+ for (const r of results) {
91
+ platform.store.saveBuildRecord({
92
+ id: `build-${totalStart}-${r.name}`,
93
+ project: session.projectPath,
94
+ image: r.image,
95
+ status: r.status,
96
+ duration: r.duration,
97
+ timestamp: totalStart,
98
+ source: 'ai',
99
+ error: r.error,
100
+ }).catch(() => { });
101
+ }
102
+ }
103
+ // Notify on failure
104
+ if (anyFailed && platform?.notifier) {
105
+ const failedNames = results.filter(r => r.status === 'failed').map(r => r.name);
106
+ platform.notifier.notifyBuildFailure(session.projectPath, failedNames.join(', '), results.find(r => r.error)?.error ?? 'Build failed').catch(() => { });
107
+ }
108
+ return { services: results, totalDuration };
109
+ }
110
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/tools/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @module tools/clean
3
+ * argus_clean — Stop and remove all containers, networks, and mocks.
4
+ *
5
+ * Uses MultiServiceOrchestrator for config normalization, while keeping
6
+ * Docker calls at this level for testability.
7
+ */
8
+ import { SessionManager } from '../session.js';
9
+ export interface CleanResult {
10
+ containers: Array<{
11
+ name: string;
12
+ action: 'removed' | 'not_found' | 'force_removed' | 'failed';
13
+ error?: string;
14
+ }>;
15
+ mocks: Array<{
16
+ name: string;
17
+ action: 'stopped' | 'not_running' | 'failed';
18
+ error?: string;
19
+ }>;
20
+ network: {
21
+ name: string;
22
+ action: 'removed' | 'not_found' | 'failed';
23
+ error?: string;
24
+ };
25
+ sessionRemoved: boolean;
26
+ }
27
+ /**
28
+ * Handle the argus_clean MCP tool call.
29
+ * Stops containers, shuts down mock servers, removes the Docker network,
30
+ * and destroys the session. Uses best-effort cleanup for all resources.
31
+ *
32
+ * @param params - Tool input with projectPath and optional force flag
33
+ * @param sessionManager - Session store for tracking project state
34
+ * @returns Cleanup results for containers, mocks, network, and session
35
+ */
36
+ export declare function handleClean(params: {
37
+ projectPath: string;
38
+ force?: boolean;
39
+ }, sessionManager: SessionManager): Promise<CleanResult>;
40
+ //# sourceMappingURL=clean.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clean.d.ts","sourceRoot":"","sources":["../../src/tools/clean.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,EAAE,cAAc,EAAgB,MAAM,eAAe,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,KAAK,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,eAAe,GAAG,QAAQ,CAAC;QAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,QAAQ,CAAC;QAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;QAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,EAChD,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,WAAW,CAAC,CAiGtB"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * @module tools/clean
3
+ * argus_clean — Stop and remove all containers, networks, and mocks.
4
+ *
5
+ * Uses MultiServiceOrchestrator for config normalization, while keeping
6
+ * Docker calls at this level for testability.
7
+ */
8
+ import { stopContainer, removeNetwork, MultiServiceOrchestrator, } from 'argusai-core';
9
+ import { SessionError } from '../session.js';
10
+ /**
11
+ * Handle the argus_clean MCP tool call.
12
+ * Stops containers, shuts down mock servers, removes the Docker network,
13
+ * and destroys the session. Uses best-effort cleanup for all resources.
14
+ *
15
+ * @param params - Tool input with projectPath and optional force flag
16
+ * @param sessionManager - Session store for tracking project state
17
+ * @returns Cleanup results for containers, mocks, network, and session
18
+ */
19
+ export async function handleClean(params, sessionManager) {
20
+ let session;
21
+ let networkName = 'e2e-network';
22
+ try {
23
+ session = sessionManager.getOrThrow(params.projectPath);
24
+ networkName = session.networkName;
25
+ }
26
+ catch (err) {
27
+ if (err instanceof SessionError && err.code === 'SESSION_NOT_FOUND') {
28
+ return {
29
+ containers: [],
30
+ mocks: [],
31
+ network: { name: networkName, action: 'not_found' },
32
+ sessionRemoved: false,
33
+ };
34
+ }
35
+ throw err;
36
+ }
37
+ const bus = sessionManager.eventBus;
38
+ const cleanStart = Date.now();
39
+ bus?.emit('clean', { event: 'clean_start', data: { type: 'clean_start', project: session.config.project.name, timestamp: cleanStart } });
40
+ bus?.emit('activity', {
41
+ event: 'activity_start',
42
+ data: { id: `clean-${cleanStart}`, source: 'ai', operation: 'clean', project: session.config.project.name, status: 'running', startTime: cleanStart },
43
+ });
44
+ const orchestrator = new MultiServiceOrchestrator();
45
+ const services = orchestrator.normalizeServices(session.config);
46
+ // Collect all container names to clean — both from config and session tracking
47
+ const containerNames = new Set();
48
+ for (const svc of services) {
49
+ containerNames.add(svc.container.name);
50
+ }
51
+ for (const [name] of session.containerIds) {
52
+ containerNames.add(name);
53
+ }
54
+ // Stop containers (best-effort)
55
+ const containerResults = [];
56
+ for (const name of containerNames) {
57
+ try {
58
+ bus?.emit('clean', { event: 'container_removing', data: { type: 'container_removing', name, timestamp: Date.now() } });
59
+ await stopContainer(name);
60
+ bus?.emit('clean', { event: 'container_removed', data: { type: 'container_removed', name, timestamp: Date.now() } });
61
+ containerResults.push({ name, action: 'removed' });
62
+ }
63
+ catch (err) {
64
+ containerResults.push({
65
+ name,
66
+ action: 'failed',
67
+ error: err.message,
68
+ });
69
+ }
70
+ }
71
+ // Stop mock servers
72
+ const mockResults = [];
73
+ for (const [name, mockInfo] of session.mockServers) {
74
+ try {
75
+ await mockInfo.server.close();
76
+ bus?.emit('clean', { event: 'mock_stopped', data: { type: 'mock_stopped', name, timestamp: Date.now() } });
77
+ mockResults.push({ name, action: 'stopped' });
78
+ }
79
+ catch (err) {
80
+ mockResults.push({
81
+ name,
82
+ action: 'failed',
83
+ error: err.message,
84
+ });
85
+ }
86
+ }
87
+ // Remove network
88
+ let networkResult;
89
+ try {
90
+ await removeNetwork(networkName);
91
+ bus?.emit('clean', { event: 'network_removed', data: { type: 'network_removed', name: networkName, timestamp: Date.now() } });
92
+ networkResult = { name: networkName, action: 'removed' };
93
+ }
94
+ catch {
95
+ networkResult = { name: networkName, action: 'failed' };
96
+ }
97
+ const cleanDuration = Date.now() - cleanStart;
98
+ bus?.emit('clean', { event: 'clean_end', data: { type: 'clean_end', duration: cleanDuration, timestamp: Date.now() } });
99
+ bus?.emit('activity', {
100
+ event: 'activity_update',
101
+ data: { id: `clean-${cleanStart}`, source: 'ai', operation: 'clean', project: session.config.project.name, status: 'success', startTime: cleanStart, endTime: Date.now() },
102
+ });
103
+ sessionManager.remove(params.projectPath);
104
+ return {
105
+ containers: containerResults,
106
+ mocks: mockResults,
107
+ network: networkResult,
108
+ sessionRemoved: true,
109
+ };
110
+ }
111
+ //# sourceMappingURL=clean.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clean.js","sourceRoot":"","sources":["../../src/tools/clean.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,aAAa,EACb,aAAa,EACb,wBAAwB,GACzB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAkB,YAAY,EAAE,MAAM,eAAe,CAAC;AAqB7D;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAgD,EAChD,cAA8B;IAE9B,IAAI,OAAO,CAAC;IACZ,IAAI,WAAW,GAAG,aAAa,CAAC;IAEhC,IAAI,CAAC;QACH,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACxD,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,YAAY,IAAI,GAAG,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YACpE,OAAO;gBACL,UAAU,EAAE,EAAE;gBACd,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE;gBACnD,cAAc,EAAE,KAAK;aACtB,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,CAAC;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC9B,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IACzI,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE;QACpB,KAAK,EAAE,gBAAgB;QACvB,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE;KACtJ,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,IAAI,wBAAwB,EAAE,CAAC;IACpD,MAAM,QAAQ,GAAG,YAAY,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhE,+EAA+E;IAC/E,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QAC1C,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,gCAAgC;IAChC,MAAM,gBAAgB,GAA8B,EAAE,CAAC;IACvD,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YACvH,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;YAC1B,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YACrH,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,gBAAgB,CAAC,IAAI,CAAC;gBACpB,IAAI;gBACJ,MAAM,EAAE,QAAQ;gBAChB,KAAK,EAAG,GAAa,CAAC,OAAO;aAC9B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,MAAM,WAAW,GAAyB,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC9B,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YAC3G,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,IAAI,CAAC;gBACf,IAAI;gBACJ,MAAM,EAAE,QAAQ;gBAChB,KAAK,EAAG,GAAa,CAAC,OAAO;aAC9B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,IAAI,aAAqC,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;QACjC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9H,aAAa,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,aAAa,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC1D,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;IAC9C,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IACxH,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE;QACpB,KAAK,EAAE,iBAAiB;QACxB,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;KAC3K,CAAC,CAAC;IAEH,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAE1C,OAAO;QACL,UAAU,EAAE,gBAAgB;QAC5B,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE,aAAa;QACtB,cAAc,EAAE,IAAI;KACrB,CAAC;AACJ,CAAC"}