@generacy-ai/generacy-plugin-claude-code 0.0.0-preview-20260304013206

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 (62) hide show
  1. package/LICENSE +191 -0
  2. package/dist/container/container-manager.d.ts +82 -0
  3. package/dist/container/container-manager.d.ts.map +1 -0
  4. package/dist/container/container-manager.js +420 -0
  5. package/dist/container/container-manager.js.map +1 -0
  6. package/dist/container/types.d.ts +160 -0
  7. package/dist/container/types.d.ts.map +1 -0
  8. package/dist/container/types.js +24 -0
  9. package/dist/container/types.js.map +1 -0
  10. package/dist/errors.d.ts +106 -0
  11. package/dist/errors.d.ts.map +1 -0
  12. package/dist/errors.js +180 -0
  13. package/dist/errors.js.map +1 -0
  14. package/dist/index.d.ts +16 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +21 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/invocation/invoker.d.ts +59 -0
  19. package/dist/invocation/invoker.d.ts.map +1 -0
  20. package/dist/invocation/invoker.js +271 -0
  21. package/dist/invocation/invoker.js.map +1 -0
  22. package/dist/invocation/types.d.ts +129 -0
  23. package/dist/invocation/types.d.ts.map +1 -0
  24. package/dist/invocation/types.js +57 -0
  25. package/dist/invocation/types.js.map +1 -0
  26. package/dist/plugin/claude-code-plugin.d.ts +144 -0
  27. package/dist/plugin/claude-code-plugin.d.ts.map +1 -0
  28. package/dist/plugin/claude-code-plugin.js +416 -0
  29. package/dist/plugin/claude-code-plugin.js.map +1 -0
  30. package/dist/schemas.d.ts +198 -0
  31. package/dist/schemas.d.ts.map +1 -0
  32. package/dist/schemas.js +75 -0
  33. package/dist/schemas.js.map +1 -0
  34. package/dist/session/session-manager.d.ts +117 -0
  35. package/dist/session/session-manager.d.ts.map +1 -0
  36. package/dist/session/session-manager.js +243 -0
  37. package/dist/session/session-manager.js.map +1 -0
  38. package/dist/session/session.d.ts +99 -0
  39. package/dist/session/session.d.ts.map +1 -0
  40. package/dist/session/session.js +271 -0
  41. package/dist/session/session.js.map +1 -0
  42. package/dist/session/types.d.ts +107 -0
  43. package/dist/session/types.d.ts.map +1 -0
  44. package/dist/session/types.js +33 -0
  45. package/dist/session/types.js.map +1 -0
  46. package/dist/streaming/output-parser.d.ts +91 -0
  47. package/dist/streaming/output-parser.d.ts.map +1 -0
  48. package/dist/streaming/output-parser.js +321 -0
  49. package/dist/streaming/output-parser.js.map +1 -0
  50. package/dist/streaming/output-stream.d.ts +45 -0
  51. package/dist/streaming/output-stream.d.ts.map +1 -0
  52. package/dist/streaming/output-stream.js +222 -0
  53. package/dist/streaming/output-stream.js.map +1 -0
  54. package/dist/streaming/types.d.ts +89 -0
  55. package/dist/streaming/types.d.ts.map +1 -0
  56. package/dist/streaming/types.js +47 -0
  57. package/dist/streaming/types.js.map +1 -0
  58. package/dist/types.d.ts +267 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +33 -0
  61. package/dist/types.js.map +1 -0
  62. package/package.json +58 -0
@@ -0,0 +1,420 @@
1
+ /**
2
+ * @generacy-ai/generacy-plugin-claude-code
3
+ *
4
+ * Container manager for Docker container lifecycle management.
5
+ * Handles creating, starting, attaching, and cleaning up containers.
6
+ */
7
+ import { ContainerStartError, ContainerNotRunningError, wrapError } from '../errors.js';
8
+ import { DEFAULT_CONTAINER_TIMEOUT_MS, DEFAULT_STOP_TIMEOUT_SECONDS, } from './types.js';
9
+ /**
10
+ * Manages Docker container lifecycle for Claude Code sessions.
11
+ */
12
+ export class ContainerManager {
13
+ docker;
14
+ logger;
15
+ containers = new Map();
16
+ constructor(docker, logger) {
17
+ this.docker = docker;
18
+ this.logger = logger.child({ component: 'ContainerManager' });
19
+ }
20
+ /**
21
+ * Create a new container for a session.
22
+ */
23
+ async create(options) {
24
+ const { sessionId, config } = options;
25
+ this.logger.info({ sessionId, image: config.image }, 'Creating container');
26
+ const createOptions = this.buildCreateOptions(sessionId, config);
27
+ try {
28
+ const container = await this.docker.createContainer(createOptions);
29
+ const containerId = container.id;
30
+ const managedContainer = {
31
+ containerId,
32
+ sessionId,
33
+ config,
34
+ state: { status: 'created', containerId },
35
+ health: { status: 'unknown', failureCount: 0 },
36
+ createdAt: new Date(),
37
+ };
38
+ this.containers.set(sessionId, managedContainer);
39
+ this.logger.info({ sessionId, containerId }, 'Container created');
40
+ return managedContainer;
41
+ }
42
+ catch (error) {
43
+ const wrappedError = wrapError(error);
44
+ this.logger.error({ sessionId, error: wrappedError }, 'Failed to create container');
45
+ throw new ContainerStartError(config.image, wrappedError.message);
46
+ }
47
+ }
48
+ /**
49
+ * Start a container.
50
+ */
51
+ async start(sessionId, options = {}) {
52
+ const managed = this.getContainer(sessionId);
53
+ const { containerId } = managed;
54
+ this.logger.info({ sessionId, containerId }, 'Starting container');
55
+ this.updateState(sessionId, { status: 'starting', containerId });
56
+ try {
57
+ const container = this.docker.getContainer(containerId);
58
+ await container.start();
59
+ this.updateState(sessionId, {
60
+ status: 'running',
61
+ containerId,
62
+ startedAt: new Date(),
63
+ });
64
+ this.logger.info({ sessionId, containerId }, 'Container started');
65
+ if (options.waitForHealthy) {
66
+ await this.waitForHealthy(sessionId, options.timeoutMs ?? DEFAULT_CONTAINER_TIMEOUT_MS);
67
+ }
68
+ return this.getContainer(sessionId);
69
+ }
70
+ catch (error) {
71
+ const wrappedError = wrapError(error);
72
+ this.updateState(sessionId, {
73
+ status: 'error',
74
+ containerId,
75
+ error: wrappedError.message,
76
+ });
77
+ this.logger.error({ sessionId, containerId, error: wrappedError }, 'Failed to start container');
78
+ throw new ContainerStartError(managed.config.image, wrappedError.message);
79
+ }
80
+ }
81
+ /**
82
+ * Attach to a container's I/O streams.
83
+ */
84
+ async attach(sessionId, options = { stdin: true, stdout: true, stderr: true, stream: true }) {
85
+ const managed = this.getContainer(sessionId);
86
+ if (managed.state.status !== 'running') {
87
+ throw new ContainerNotRunningError(sessionId, managed.containerId);
88
+ }
89
+ this.logger.debug({ sessionId, containerId: managed.containerId }, 'Attaching to container');
90
+ const container = this.docker.getContainer(managed.containerId);
91
+ const attachStream = await container.attach({
92
+ stream: options.stream ?? true,
93
+ stdin: options.stdin ?? true,
94
+ stdout: options.stdout ?? true,
95
+ stderr: options.stderr ?? true,
96
+ hijack: options.hijack ?? true,
97
+ });
98
+ // Dockerode returns a single duplex stream for hijacked connections
99
+ // We need to demultiplex stdout and stderr from the combined stream
100
+ const streams = {
101
+ stdin: attachStream,
102
+ stdout: attachStream,
103
+ stderr: attachStream,
104
+ };
105
+ managed.streams = streams;
106
+ this.logger.debug({ sessionId, containerId: managed.containerId }, 'Attached to container');
107
+ return streams;
108
+ }
109
+ /**
110
+ * Execute a command in a running container.
111
+ */
112
+ async exec(sessionId, cmd, options = {}) {
113
+ const managed = this.getContainer(sessionId);
114
+ if (managed.state.status !== 'running') {
115
+ throw new ContainerNotRunningError(sessionId, managed.containerId);
116
+ }
117
+ this.logger.debug({ sessionId, cmd }, 'Executing command in container');
118
+ const container = this.docker.getContainer(managed.containerId);
119
+ const exec = await container.exec({
120
+ Cmd: cmd,
121
+ AttachStdout: true,
122
+ AttachStderr: true,
123
+ });
124
+ const execStream = await exec.start({ hijack: true, stdin: false });
125
+ return new Promise((resolve, reject) => {
126
+ let stdout = '';
127
+ let stderr = '';
128
+ let timedOut = false;
129
+ const timeout = options.timeout ?? DEFAULT_CONTAINER_TIMEOUT_MS;
130
+ const timer = setTimeout(() => {
131
+ timedOut = true;
132
+ execStream.destroy();
133
+ reject(new Error(`Command timed out after ${timeout}ms`));
134
+ }, timeout);
135
+ // Demultiplex the stream
136
+ const chunks = [];
137
+ execStream.on('data', (chunk) => {
138
+ chunks.push(chunk);
139
+ });
140
+ execStream.on('end', async () => {
141
+ if (timedOut)
142
+ return;
143
+ clearTimeout(timer);
144
+ // Parse the multiplexed stream
145
+ const combined = Buffer.concat(chunks);
146
+ const { stdout: out, stderr: err } = this.demuxStream(combined);
147
+ stdout = out;
148
+ stderr = err;
149
+ try {
150
+ const inspect = await exec.inspect();
151
+ resolve({
152
+ exitCode: inspect.ExitCode ?? 0,
153
+ stdout,
154
+ stderr,
155
+ });
156
+ }
157
+ catch (error) {
158
+ resolve({
159
+ exitCode: -1,
160
+ stdout,
161
+ stderr,
162
+ });
163
+ }
164
+ });
165
+ execStream.on('error', (error) => {
166
+ if (timedOut)
167
+ return;
168
+ clearTimeout(timer);
169
+ reject(error);
170
+ });
171
+ });
172
+ }
173
+ /**
174
+ * Stop a container.
175
+ */
176
+ async stop(sessionId, options = {}) {
177
+ const managed = this.containers.get(sessionId);
178
+ if (!managed) {
179
+ this.logger.warn({ sessionId }, 'Container not found for stop');
180
+ return;
181
+ }
182
+ const { containerId } = managed;
183
+ if (managed.state.status === 'stopped' || managed.state.status === 'error') {
184
+ this.logger.debug({ sessionId, containerId }, 'Container already stopped');
185
+ return;
186
+ }
187
+ this.logger.info({ sessionId, containerId }, 'Stopping container');
188
+ this.updateState(sessionId, { status: 'stopping', containerId });
189
+ try {
190
+ const container = this.docker.getContainer(containerId);
191
+ await container.stop({
192
+ t: options.timeoutSeconds ?? DEFAULT_STOP_TIMEOUT_SECONDS,
193
+ });
194
+ const inspect = await container.inspect();
195
+ const exitCode = inspect.State.ExitCode;
196
+ this.updateState(sessionId, {
197
+ status: 'stopped',
198
+ containerId,
199
+ stoppedAt: new Date(),
200
+ exitCode,
201
+ });
202
+ this.logger.info({ sessionId, containerId, exitCode }, 'Container stopped');
203
+ if (options.remove) {
204
+ await this.remove(sessionId);
205
+ }
206
+ }
207
+ catch (error) {
208
+ // Container might already be stopped
209
+ const wrappedError = wrapError(error);
210
+ if (wrappedError.message.includes('is not running')) {
211
+ this.updateState(sessionId, {
212
+ status: 'stopped',
213
+ containerId,
214
+ stoppedAt: new Date(),
215
+ });
216
+ }
217
+ else {
218
+ this.updateState(sessionId, {
219
+ status: 'error',
220
+ containerId,
221
+ error: wrappedError.message,
222
+ });
223
+ throw wrappedError;
224
+ }
225
+ }
226
+ }
227
+ /**
228
+ * Remove a container.
229
+ */
230
+ async remove(sessionId) {
231
+ const managed = this.containers.get(sessionId);
232
+ if (!managed) {
233
+ return;
234
+ }
235
+ this.logger.info({ sessionId, containerId: managed.containerId }, 'Removing container');
236
+ try {
237
+ const container = this.docker.getContainer(managed.containerId);
238
+ await container.remove({ force: true });
239
+ }
240
+ catch (error) {
241
+ // Ignore errors if container doesn't exist
242
+ const wrappedError = wrapError(error);
243
+ if (!wrappedError.message.includes('No such container')) {
244
+ this.logger.warn({ sessionId, error: wrappedError }, 'Failed to remove container');
245
+ }
246
+ }
247
+ this.containers.delete(sessionId);
248
+ this.logger.info({ sessionId }, 'Container removed');
249
+ }
250
+ /**
251
+ * Clean up all containers.
252
+ */
253
+ async cleanup() {
254
+ this.logger.info({ count: this.containers.size }, 'Cleaning up all containers');
255
+ const sessionIds = Array.from(this.containers.keys());
256
+ await Promise.all(sessionIds.map(async (sessionId) => {
257
+ try {
258
+ await this.stop(sessionId, { remove: true });
259
+ }
260
+ catch (error) {
261
+ this.logger.warn({ sessionId, error }, 'Failed to cleanup container');
262
+ }
263
+ }));
264
+ }
265
+ /**
266
+ * Get container info for a session.
267
+ */
268
+ getContainer(sessionId) {
269
+ const managed = this.containers.get(sessionId);
270
+ if (!managed) {
271
+ throw new ContainerNotRunningError(sessionId);
272
+ }
273
+ return managed;
274
+ }
275
+ /**
276
+ * Check if a container exists for a session.
277
+ */
278
+ hasContainer(sessionId) {
279
+ return this.containers.has(sessionId);
280
+ }
281
+ /**
282
+ * Get the current state of a container.
283
+ */
284
+ getState(sessionId) {
285
+ return this.containers.get(sessionId)?.state;
286
+ }
287
+ /**
288
+ * Check container health.
289
+ */
290
+ async checkHealth(sessionId) {
291
+ const managed = this.getContainer(sessionId);
292
+ if (managed.state.status !== 'running') {
293
+ return {
294
+ status: 'unknown',
295
+ failureCount: 0,
296
+ };
297
+ }
298
+ try {
299
+ const container = this.docker.getContainer(managed.containerId);
300
+ const inspect = await container.inspect();
301
+ const health = inspect.State.Health;
302
+ if (!health) {
303
+ return {
304
+ status: 'unknown',
305
+ failureCount: 0,
306
+ };
307
+ }
308
+ const result = {
309
+ status: health.Status,
310
+ lastCheck: new Date(),
311
+ failureCount: health.FailingStreak ?? 0,
312
+ lastError: health.Log?.[health.Log.length - 1]?.Output,
313
+ };
314
+ managed.health = result;
315
+ return result;
316
+ }
317
+ catch (error) {
318
+ const wrappedError = wrapError(error);
319
+ return {
320
+ status: 'unhealthy',
321
+ lastCheck: new Date(),
322
+ failureCount: managed.health.failureCount + 1,
323
+ lastError: wrappedError.message,
324
+ };
325
+ }
326
+ }
327
+ /**
328
+ * Wait for a container to become healthy.
329
+ */
330
+ async waitForHealthy(sessionId, timeoutMs) {
331
+ const startTime = Date.now();
332
+ while (Date.now() - startTime < timeoutMs) {
333
+ const health = await this.checkHealth(sessionId);
334
+ if (health.status === 'healthy') {
335
+ return;
336
+ }
337
+ if (health.status === 'unhealthy') {
338
+ throw new ContainerStartError(this.getContainer(sessionId).config.image, `Container became unhealthy: ${health.lastError}`);
339
+ }
340
+ // Wait before next check
341
+ await new Promise((resolve) => setTimeout(resolve, 1000));
342
+ }
343
+ throw new ContainerStartError(this.getContainer(sessionId).config.image, `Container health check timed out after ${timeoutMs}ms`);
344
+ }
345
+ /**
346
+ * Build Docker container create options from config.
347
+ */
348
+ buildCreateOptions(sessionId, config) {
349
+ const options = {
350
+ Image: config.image,
351
+ WorkingDir: config.workdir,
352
+ Env: Object.entries(config.env).map(([key, value]) => `${key}=${value}`),
353
+ Labels: {
354
+ 'generacy.session.id': sessionId,
355
+ 'generacy.managed': 'true',
356
+ },
357
+ HostConfig: {
358
+ NetworkMode: config.network,
359
+ Binds: config.mounts.map((mount) => {
360
+ const mode = mount.readonly ? ':ro' : '';
361
+ return `${mount.source}:${mount.target}${mode}`;
362
+ }),
363
+ },
364
+ // Keep stdin open for interactive use
365
+ OpenStdin: true,
366
+ StdinOnce: false,
367
+ Tty: false,
368
+ AttachStdin: true,
369
+ AttachStdout: true,
370
+ AttachStderr: true,
371
+ };
372
+ // Apply resource limits if specified
373
+ if (config.resources) {
374
+ options.HostConfig = {
375
+ ...options.HostConfig,
376
+ Memory: config.resources.memory,
377
+ NanoCpus: config.resources.cpus
378
+ ? Math.round(config.resources.cpus * 1e9)
379
+ : undefined,
380
+ };
381
+ }
382
+ return options;
383
+ }
384
+ /**
385
+ * Update container state.
386
+ */
387
+ updateState(sessionId, state) {
388
+ const managed = this.containers.get(sessionId);
389
+ if (managed) {
390
+ managed.state = state;
391
+ }
392
+ }
393
+ /**
394
+ * Demultiplex Docker stream into stdout and stderr.
395
+ * Docker streams have an 8-byte header: [type, 0, 0, 0, size (4 bytes)]
396
+ */
397
+ demuxStream(data) {
398
+ let stdout = '';
399
+ let stderr = '';
400
+ let offset = 0;
401
+ while (offset < data.length) {
402
+ if (offset + 8 > data.length)
403
+ break;
404
+ const type = data[offset];
405
+ const size = data.readUInt32BE(offset + 4);
406
+ if (offset + 8 + size > data.length)
407
+ break;
408
+ const content = data.subarray(offset + 8, offset + 8 + size).toString('utf8');
409
+ if (type === 1) {
410
+ stdout += content;
411
+ }
412
+ else if (type === 2) {
413
+ stderr += content;
414
+ }
415
+ offset += 8 + size;
416
+ }
417
+ return { stdout, stderr };
418
+ }
419
+ }
420
+ //# sourceMappingURL=container-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container-manager.js","sourceRoot":"","sources":["../../src/container/container-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * @generacy-ai/generacy-plugin-claude-code
3
+ *
4
+ * Internal types for container management.
5
+ */
6
+ import type { ContainerConfig } from '../types.js';
7
+ /**
8
+ * Internal state of a managed container.
9
+ */
10
+ export type ContainerState = {
11
+ status: 'creating';
12
+ } | {
13
+ status: 'created';
14
+ containerId: string;
15
+ } | {
16
+ status: 'starting';
17
+ containerId: string;
18
+ } | {
19
+ status: 'running';
20
+ containerId: string;
21
+ startedAt: Date;
22
+ } | {
23
+ status: 'stopping';
24
+ containerId: string;
25
+ } | {
26
+ status: 'stopped';
27
+ containerId: string;
28
+ stoppedAt: Date;
29
+ exitCode?: number;
30
+ } | {
31
+ status: 'error';
32
+ containerId?: string;
33
+ error: string;
34
+ };
35
+ /**
36
+ * Health check configuration for containers.
37
+ */
38
+ export interface HealthCheckConfig {
39
+ /** Command to run for health check */
40
+ cmd: string[];
41
+ /** Interval between health checks in milliseconds */
42
+ intervalMs: number;
43
+ /** Timeout for each health check in milliseconds */
44
+ timeoutMs: number;
45
+ /** Number of consecutive failures before unhealthy */
46
+ retries: number;
47
+ /** Initial delay before first health check in milliseconds */
48
+ startPeriodMs: number;
49
+ }
50
+ /**
51
+ * Health status of a container.
52
+ */
53
+ export type HealthStatus = 'unknown' | 'starting' | 'healthy' | 'unhealthy';
54
+ /**
55
+ * Result of a health check.
56
+ */
57
+ export interface HealthCheckResult {
58
+ status: HealthStatus;
59
+ lastCheck?: Date;
60
+ failureCount: number;
61
+ lastError?: string;
62
+ }
63
+ /**
64
+ * Internal representation of a managed container.
65
+ */
66
+ export interface ManagedContainer {
67
+ /** Docker container ID */
68
+ containerId: string;
69
+ /** Session ID this container belongs to */
70
+ sessionId: string;
71
+ /** Container configuration */
72
+ config: ContainerConfig;
73
+ /** Current state */
74
+ state: ContainerState;
75
+ /** Health status */
76
+ health: HealthCheckResult;
77
+ /** When the container was created */
78
+ createdAt: Date;
79
+ /** Attached streams (if any) */
80
+ streams?: ContainerStreams;
81
+ }
82
+ /**
83
+ * Attached I/O streams for a container.
84
+ */
85
+ export interface ContainerStreams {
86
+ /** Stdin stream for writing to container */
87
+ stdin: NodeJS.WritableStream;
88
+ /** Stdout stream for reading output */
89
+ stdout: NodeJS.ReadableStream;
90
+ /** Stderr stream for reading errors */
91
+ stderr: NodeJS.ReadableStream;
92
+ }
93
+ /**
94
+ * Options for creating a container.
95
+ */
96
+ export interface CreateContainerOptions {
97
+ /** Session ID for this container */
98
+ sessionId: string;
99
+ /** Container configuration */
100
+ config: ContainerConfig;
101
+ /** Optional health check configuration */
102
+ healthCheck?: HealthCheckConfig;
103
+ }
104
+ /**
105
+ * Options for starting a container.
106
+ */
107
+ export interface StartContainerOptions {
108
+ /** Whether to wait for container to be healthy before returning */
109
+ waitForHealthy?: boolean;
110
+ /** Timeout in milliseconds for waiting */
111
+ timeoutMs?: number;
112
+ }
113
+ /**
114
+ * Options for stopping a container.
115
+ */
116
+ export interface StopContainerOptions {
117
+ /** Timeout in seconds before force kill */
118
+ timeoutSeconds?: number;
119
+ /** Whether to remove the container after stopping */
120
+ remove?: boolean;
121
+ }
122
+ /**
123
+ * Options for attaching to a container.
124
+ */
125
+ export interface AttachOptions {
126
+ /** Attach stdin */
127
+ stdin?: boolean;
128
+ /** Attach stdout */
129
+ stdout?: boolean;
130
+ /** Attach stderr */
131
+ stderr?: boolean;
132
+ /** Hijack the connection for bidirectional I/O */
133
+ hijack?: boolean;
134
+ /** Keep the stream open */
135
+ stream?: boolean;
136
+ }
137
+ /**
138
+ * Result of executing a command in a container.
139
+ */
140
+ export interface ExecResult {
141
+ /** Exit code from the command */
142
+ exitCode: number;
143
+ /** Standard output */
144
+ stdout: string;
145
+ /** Standard error */
146
+ stderr: string;
147
+ }
148
+ /**
149
+ * Default health check configuration.
150
+ */
151
+ export declare const DEFAULT_HEALTH_CHECK: HealthCheckConfig;
152
+ /**
153
+ * Default container timeout in milliseconds (5 minutes).
154
+ */
155
+ export declare const DEFAULT_CONTAINER_TIMEOUT_MS = 300000;
156
+ /**
157
+ * Default stop timeout in seconds.
158
+ */
159
+ export declare const DEFAULT_STOP_TIMEOUT_SECONDS = 10;
160
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/container/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @generacy-ai/generacy-plugin-claude-code
3
+ *
4
+ * Internal types for container management.
5
+ */
6
+ /**
7
+ * Default health check configuration.
8
+ */
9
+ export const DEFAULT_HEALTH_CHECK = {
10
+ cmd: ['echo', 'healthy'],
11
+ intervalMs: 30000,
12
+ timeoutMs: 5000,
13
+ retries: 3,
14
+ startPeriodMs: 10000,
15
+ };
16
+ /**
17
+ * Default container timeout in milliseconds (5 minutes).
18
+ */
19
+ export const DEFAULT_CONTAINER_TIMEOUT_MS = 300000;
20
+ /**
21
+ * Default stop timeout in seconds.
22
+ */
23
+ export const DEFAULT_STOP_TIMEOUT_SECONDS = 10;
24
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/container/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAqKH;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,GAAG,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;IACxB,UAAU,EAAE,KAAK;IACjB,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,CAAC;IACV,aAAa,EAAE,KAAK;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAC;AAEnD;;GAEG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,CAAC"}