@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.
- package/LICENSE +191 -0
- package/dist/container/container-manager.d.ts +82 -0
- package/dist/container/container-manager.d.ts.map +1 -0
- package/dist/container/container-manager.js +420 -0
- package/dist/container/container-manager.js.map +1 -0
- package/dist/container/types.d.ts +160 -0
- package/dist/container/types.d.ts.map +1 -0
- package/dist/container/types.js +24 -0
- package/dist/container/types.js.map +1 -0
- package/dist/errors.d.ts +106 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +180 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/invocation/invoker.d.ts +59 -0
- package/dist/invocation/invoker.d.ts.map +1 -0
- package/dist/invocation/invoker.js +271 -0
- package/dist/invocation/invoker.js.map +1 -0
- package/dist/invocation/types.d.ts +129 -0
- package/dist/invocation/types.d.ts.map +1 -0
- package/dist/invocation/types.js +57 -0
- package/dist/invocation/types.js.map +1 -0
- package/dist/plugin/claude-code-plugin.d.ts +144 -0
- package/dist/plugin/claude-code-plugin.d.ts.map +1 -0
- package/dist/plugin/claude-code-plugin.js +416 -0
- package/dist/plugin/claude-code-plugin.js.map +1 -0
- package/dist/schemas.d.ts +198 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +75 -0
- package/dist/schemas.js.map +1 -0
- package/dist/session/session-manager.d.ts +117 -0
- package/dist/session/session-manager.d.ts.map +1 -0
- package/dist/session/session-manager.js +243 -0
- package/dist/session/session-manager.js.map +1 -0
- package/dist/session/session.d.ts +99 -0
- package/dist/session/session.d.ts.map +1 -0
- package/dist/session/session.js +271 -0
- package/dist/session/session.js.map +1 -0
- package/dist/session/types.d.ts +107 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +33 -0
- package/dist/session/types.js.map +1 -0
- package/dist/streaming/output-parser.d.ts +91 -0
- package/dist/streaming/output-parser.d.ts.map +1 -0
- package/dist/streaming/output-parser.js +321 -0
- package/dist/streaming/output-parser.js.map +1 -0
- package/dist/streaming/output-stream.d.ts +45 -0
- package/dist/streaming/output-stream.d.ts.map +1 -0
- package/dist/streaming/output-stream.js +222 -0
- package/dist/streaming/output-stream.js.map +1 -0
- package/dist/streaming/types.d.ts +89 -0
- package/dist/streaming/types.d.ts.map +1 -0
- package/dist/streaming/types.js +47 -0
- package/dist/streaming/types.js.map +1 -0
- package/dist/types.d.ts +267 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +33 -0
- package/dist/types.js.map +1 -0
- package/package.json +58 -0
package/dist/schemas.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @generacy-ai/generacy-plugin-claude-code
|
|
3
|
+
*
|
|
4
|
+
* Zod validation schemas for runtime validation of configurations.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
/**
|
|
8
|
+
* Schema for volume mounts.
|
|
9
|
+
*/
|
|
10
|
+
export const MountSchema = z.object({
|
|
11
|
+
/** Host path or volume name */
|
|
12
|
+
source: z.string().min(1, 'Mount source is required'),
|
|
13
|
+
/** Container path (must be absolute) */
|
|
14
|
+
target: z.string().startsWith('/', 'Mount target must be an absolute path'),
|
|
15
|
+
/** Mount as read-only */
|
|
16
|
+
readonly: z.boolean().optional(),
|
|
17
|
+
});
|
|
18
|
+
/**
|
|
19
|
+
* Schema for resource limits.
|
|
20
|
+
*/
|
|
21
|
+
export const ResourceLimitsSchema = z.object({
|
|
22
|
+
/** Memory limit in bytes */
|
|
23
|
+
memory: z.number().positive('Memory must be positive').optional(),
|
|
24
|
+
/** CPU quota (e.g., 1.5 for 1.5 CPUs) */
|
|
25
|
+
cpus: z.number().positive('CPUs must be positive').optional(),
|
|
26
|
+
});
|
|
27
|
+
/**
|
|
28
|
+
* Schema for container configuration.
|
|
29
|
+
*/
|
|
30
|
+
export const ContainerConfigSchema = z.object({
|
|
31
|
+
/** Docker image to use */
|
|
32
|
+
image: z.string().min(1, 'Image is required'),
|
|
33
|
+
/** Working directory inside container (must be absolute) */
|
|
34
|
+
workdir: z.string().startsWith('/', 'Working directory must be an absolute path'),
|
|
35
|
+
/** Environment variables */
|
|
36
|
+
env: z.record(z.string()).default({}),
|
|
37
|
+
/** Volume mounts */
|
|
38
|
+
mounts: z.array(MountSchema).default([]),
|
|
39
|
+
/** Docker network name */
|
|
40
|
+
network: z.string().min(1, 'Network name is required'),
|
|
41
|
+
/** Optional resource limits */
|
|
42
|
+
resources: ResourceLimitsSchema.optional(),
|
|
43
|
+
});
|
|
44
|
+
/**
|
|
45
|
+
* Schema for invocation options.
|
|
46
|
+
*/
|
|
47
|
+
export const InvokeOptionsSchema = z.object({
|
|
48
|
+
/** Agency mode to set before invocation */
|
|
49
|
+
mode: z.string().optional(),
|
|
50
|
+
/** Maximum execution time in milliseconds (max 1 hour) */
|
|
51
|
+
timeout: z
|
|
52
|
+
.number()
|
|
53
|
+
.int('Timeout must be an integer')
|
|
54
|
+
.positive('Timeout must be positive')
|
|
55
|
+
.max(3600000, 'Timeout cannot exceed 1 hour (3600000ms)')
|
|
56
|
+
.optional(),
|
|
57
|
+
/** Tool whitelist (empty = all allowed) */
|
|
58
|
+
tools: z.array(z.string()).optional(),
|
|
59
|
+
/** Serialized context for workflow continuity */
|
|
60
|
+
context: z.string().optional(),
|
|
61
|
+
/** Associated GitHub issue number */
|
|
62
|
+
issueNumber: z.number().int().positive().optional(),
|
|
63
|
+
});
|
|
64
|
+
/**
|
|
65
|
+
* Schema for invocation parameters.
|
|
66
|
+
*/
|
|
67
|
+
export const InvokeParamsSchema = z.object({
|
|
68
|
+
/** The prompt to send to the agent */
|
|
69
|
+
prompt: z.string().min(1, 'Prompt is required'),
|
|
70
|
+
/** Optional session ID for session-based invocation */
|
|
71
|
+
sessionId: z.string().optional(),
|
|
72
|
+
/** Optional overrides for invoke options */
|
|
73
|
+
options: InvokeOptionsSchema.partial().optional(),
|
|
74
|
+
});
|
|
75
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @generacy-ai/generacy-plugin-claude-code
|
|
3
|
+
*
|
|
4
|
+
* Session manager implementing the registry pattern for sessions.
|
|
5
|
+
*/
|
|
6
|
+
import type { Logger } from 'pino';
|
|
7
|
+
import type { Session as SessionInterface, QuestionPayload, TerminationReason } from '../types.js';
|
|
8
|
+
import { Session } from './session.js';
|
|
9
|
+
import type { CreateSessionOptions, SessionSummary } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* SessionManager options.
|
|
12
|
+
*/
|
|
13
|
+
export interface SessionManagerOptions {
|
|
14
|
+
/** Session timeout in milliseconds */
|
|
15
|
+
sessionTimeoutMs?: number;
|
|
16
|
+
/** Cleanup interval in milliseconds */
|
|
17
|
+
cleanupIntervalMs?: number;
|
|
18
|
+
/** Maximum concurrent sessions */
|
|
19
|
+
maxSessions?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Session manager implementing the registry pattern.
|
|
23
|
+
* Manages session lifecycle, registration, and cleanup.
|
|
24
|
+
*/
|
|
25
|
+
export declare class SessionManager {
|
|
26
|
+
private readonly logger;
|
|
27
|
+
private readonly sessions;
|
|
28
|
+
private readonly options;
|
|
29
|
+
private cleanupTimer?;
|
|
30
|
+
constructor(logger: Logger, options?: SessionManagerOptions);
|
|
31
|
+
/**
|
|
32
|
+
* Create a new session.
|
|
33
|
+
*/
|
|
34
|
+
create(options: CreateSessionOptions): Session;
|
|
35
|
+
/**
|
|
36
|
+
* Get a session by ID.
|
|
37
|
+
* Throws SessionNotFoundError if not found.
|
|
38
|
+
*/
|
|
39
|
+
get(sessionId: string): Session;
|
|
40
|
+
/**
|
|
41
|
+
* Get a session by ID, returning undefined if not found.
|
|
42
|
+
*/
|
|
43
|
+
find(sessionId: string): Session | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* Check if a session exists.
|
|
46
|
+
*/
|
|
47
|
+
has(sessionId: string): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Get a session's public interface.
|
|
50
|
+
*/
|
|
51
|
+
getSession(sessionId: string): SessionInterface;
|
|
52
|
+
/**
|
|
53
|
+
* List all active sessions.
|
|
54
|
+
*/
|
|
55
|
+
listActive(): SessionSummary[];
|
|
56
|
+
/**
|
|
57
|
+
* List all sessions.
|
|
58
|
+
*/
|
|
59
|
+
listAll(): SessionSummary[];
|
|
60
|
+
/**
|
|
61
|
+
* Get the count of active sessions.
|
|
62
|
+
*/
|
|
63
|
+
getActiveCount(): number;
|
|
64
|
+
/**
|
|
65
|
+
* Get total session count.
|
|
66
|
+
*/
|
|
67
|
+
getTotalCount(): number;
|
|
68
|
+
/**
|
|
69
|
+
* Mark a session as having a started container.
|
|
70
|
+
*/
|
|
71
|
+
onContainerStarted(sessionId: string, containerId: string): void;
|
|
72
|
+
/**
|
|
73
|
+
* Mark a session as executing an invocation.
|
|
74
|
+
*/
|
|
75
|
+
onInvocationStarted(sessionId: string, invocationId: string): void;
|
|
76
|
+
/**
|
|
77
|
+
* Mark a session's invocation as completed.
|
|
78
|
+
*/
|
|
79
|
+
onInvocationCompleted(sessionId: string): void;
|
|
80
|
+
/**
|
|
81
|
+
* Mark a session as awaiting input.
|
|
82
|
+
*/
|
|
83
|
+
onQuestionReceived(sessionId: string, question: QuestionPayload): void;
|
|
84
|
+
/**
|
|
85
|
+
* Mark a session as having received an answer.
|
|
86
|
+
*/
|
|
87
|
+
onAnswerProvided(sessionId: string): void;
|
|
88
|
+
/**
|
|
89
|
+
* Terminate a session.
|
|
90
|
+
*/
|
|
91
|
+
terminate(sessionId: string, reason: TerminationReason): void;
|
|
92
|
+
/**
|
|
93
|
+
* Remove a session from the registry.
|
|
94
|
+
*/
|
|
95
|
+
remove(sessionId: string): boolean;
|
|
96
|
+
/**
|
|
97
|
+
* Clean up expired sessions.
|
|
98
|
+
*/
|
|
99
|
+
cleanupExpiredSessions(): number;
|
|
100
|
+
/**
|
|
101
|
+
* Clean up all sessions.
|
|
102
|
+
*/
|
|
103
|
+
cleanupAll(): void;
|
|
104
|
+
/**
|
|
105
|
+
* Stop the cleanup timer.
|
|
106
|
+
*/
|
|
107
|
+
stopCleanupTimer(): void;
|
|
108
|
+
/**
|
|
109
|
+
* Dispose of the session manager.
|
|
110
|
+
*/
|
|
111
|
+
dispose(): void;
|
|
112
|
+
/**
|
|
113
|
+
* Start the periodic cleanup timer.
|
|
114
|
+
*/
|
|
115
|
+
private startCleanupTimer;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=session-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAInC,OAAO,KAAK,EACV,OAAO,IAAI,gBAAgB,EAC3B,eAAe,EACf,iBAAiB,EAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,KAAK,EACV,oBAAoB,EACpB,cAAc,EACf,MAAM,YAAY,CAAC;AAKpB;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,sCAAsC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,uCAAuC;IACvC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAC1D,OAAO,CAAC,YAAY,CAAC,CAAiC;gBAE1C,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B;IAY/D;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO;IAoB9C;;;OAGG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAU/B;;OAEG;IACH,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAI5C;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI/B;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB;IAI/C;;OAEG;IACH,UAAU,IAAI,cAAc,EAAE;IAM9B;;OAEG;IACH,OAAO,IAAI,cAAc,EAAE;IAK3B;;OAEG;IACH,cAAc,IAAI,MAAM;IAMxB;;OAEG;IACH,aAAa,IAAI,MAAM;IAQvB;;OAEG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAMhE;;OAEG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAMlE;;OAEG;IACH,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAM9C;;OAEG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,IAAI;IAStE;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAMzC;;OAEG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAgB7D;;OAEG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAUlC;;OAEG;IACH,sBAAsB,IAAI,MAAM;IA+BhC;;OAEG;IACH,UAAU,IAAI,IAAI;IAclB;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAOxB;;OAEG;IACH,OAAO,IAAI,IAAI;IASf;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAU1B"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @generacy-ai/generacy-plugin-claude-code
|
|
3
|
+
*
|
|
4
|
+
* Session manager implementing the registry pattern for sessions.
|
|
5
|
+
*/
|
|
6
|
+
import { SessionNotFoundError, } from '../errors.js';
|
|
7
|
+
import { Session } from './session.js';
|
|
8
|
+
import { DEFAULT_SESSION_TIMEOUT_MS, } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Session manager implementing the registry pattern.
|
|
11
|
+
* Manages session lifecycle, registration, and cleanup.
|
|
12
|
+
*/
|
|
13
|
+
export class SessionManager {
|
|
14
|
+
logger;
|
|
15
|
+
sessions = new Map();
|
|
16
|
+
options;
|
|
17
|
+
cleanupTimer;
|
|
18
|
+
constructor(logger, options = {}) {
|
|
19
|
+
this.logger = logger.child({ component: 'SessionManager' });
|
|
20
|
+
this.options = {
|
|
21
|
+
sessionTimeoutMs: options.sessionTimeoutMs ?? DEFAULT_SESSION_TIMEOUT_MS,
|
|
22
|
+
cleanupIntervalMs: options.cleanupIntervalMs ?? 60000, // 1 minute
|
|
23
|
+
maxSessions: options.maxSessions ?? 100,
|
|
24
|
+
};
|
|
25
|
+
// Start periodic cleanup
|
|
26
|
+
this.startCleanupTimer();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Create a new session.
|
|
30
|
+
*/
|
|
31
|
+
create(options) {
|
|
32
|
+
// Check if we've reached max sessions
|
|
33
|
+
if (this.sessions.size >= this.options.maxSessions) {
|
|
34
|
+
this.logger.warn({ count: this.sessions.size }, 'Max sessions reached, attempting cleanup');
|
|
35
|
+
this.cleanupExpiredSessions();
|
|
36
|
+
if (this.sessions.size >= this.options.maxSessions) {
|
|
37
|
+
throw new Error(`Maximum sessions (${this.options.maxSessions}) reached`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const session = new Session(options);
|
|
41
|
+
this.sessions.set(session.id, session);
|
|
42
|
+
this.logger.info({ sessionId: session.id }, 'Session created');
|
|
43
|
+
return session;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get a session by ID.
|
|
47
|
+
* Throws SessionNotFoundError if not found.
|
|
48
|
+
*/
|
|
49
|
+
get(sessionId) {
|
|
50
|
+
const session = this.sessions.get(sessionId);
|
|
51
|
+
if (!session) {
|
|
52
|
+
throw new SessionNotFoundError(sessionId);
|
|
53
|
+
}
|
|
54
|
+
return session;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get a session by ID, returning undefined if not found.
|
|
58
|
+
*/
|
|
59
|
+
find(sessionId) {
|
|
60
|
+
return this.sessions.get(sessionId);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Check if a session exists.
|
|
64
|
+
*/
|
|
65
|
+
has(sessionId) {
|
|
66
|
+
return this.sessions.has(sessionId);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get a session's public interface.
|
|
70
|
+
*/
|
|
71
|
+
getSession(sessionId) {
|
|
72
|
+
return this.get(sessionId);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* List all active sessions.
|
|
76
|
+
*/
|
|
77
|
+
listActive() {
|
|
78
|
+
return Array.from(this.sessions.values())
|
|
79
|
+
.filter((session) => session.isActive())
|
|
80
|
+
.map((session) => session.getSummary());
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* List all sessions.
|
|
84
|
+
*/
|
|
85
|
+
listAll() {
|
|
86
|
+
return Array.from(this.sessions.values())
|
|
87
|
+
.map((session) => session.getSummary());
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get the count of active sessions.
|
|
91
|
+
*/
|
|
92
|
+
getActiveCount() {
|
|
93
|
+
return Array.from(this.sessions.values())
|
|
94
|
+
.filter((session) => session.isActive())
|
|
95
|
+
.length;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get total session count.
|
|
99
|
+
*/
|
|
100
|
+
getTotalCount() {
|
|
101
|
+
return this.sessions.size;
|
|
102
|
+
}
|
|
103
|
+
// ==========================================================================
|
|
104
|
+
// Session state transitions
|
|
105
|
+
// ==========================================================================
|
|
106
|
+
/**
|
|
107
|
+
* Mark a session as having a started container.
|
|
108
|
+
*/
|
|
109
|
+
onContainerStarted(sessionId, containerId) {
|
|
110
|
+
const session = this.get(sessionId);
|
|
111
|
+
session.onContainerStarted(containerId);
|
|
112
|
+
this.logger.info({ sessionId, containerId }, 'Session container started');
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Mark a session as executing an invocation.
|
|
116
|
+
*/
|
|
117
|
+
onInvocationStarted(sessionId, invocationId) {
|
|
118
|
+
const session = this.get(sessionId);
|
|
119
|
+
session.onInvocationStarted(invocationId);
|
|
120
|
+
this.logger.debug({ sessionId, invocationId }, 'Session invocation started');
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Mark a session's invocation as completed.
|
|
124
|
+
*/
|
|
125
|
+
onInvocationCompleted(sessionId) {
|
|
126
|
+
const session = this.get(sessionId);
|
|
127
|
+
session.onInvocationCompleted();
|
|
128
|
+
this.logger.debug({ sessionId }, 'Session invocation completed');
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Mark a session as awaiting input.
|
|
132
|
+
*/
|
|
133
|
+
onQuestionReceived(sessionId, question) {
|
|
134
|
+
const session = this.get(sessionId);
|
|
135
|
+
session.onQuestionReceived(question);
|
|
136
|
+
this.logger.info({ sessionId, urgency: question.urgency }, 'Session question received');
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Mark a session as having received an answer.
|
|
140
|
+
*/
|
|
141
|
+
onAnswerProvided(sessionId) {
|
|
142
|
+
const session = this.get(sessionId);
|
|
143
|
+
session.onAnswerProvided();
|
|
144
|
+
this.logger.debug({ sessionId }, 'Session answer provided');
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Terminate a session.
|
|
148
|
+
*/
|
|
149
|
+
terminate(sessionId, reason) {
|
|
150
|
+
const session = this.find(sessionId);
|
|
151
|
+
if (!session) {
|
|
152
|
+
this.logger.warn({ sessionId }, 'Session not found for termination');
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
session.terminate(reason);
|
|
156
|
+
this.logger.info({ sessionId, reason }, 'Session terminated');
|
|
157
|
+
}
|
|
158
|
+
// ==========================================================================
|
|
159
|
+
// Session cleanup
|
|
160
|
+
// ==========================================================================
|
|
161
|
+
/**
|
|
162
|
+
* Remove a session from the registry.
|
|
163
|
+
*/
|
|
164
|
+
remove(sessionId) {
|
|
165
|
+
const existed = this.sessions.delete(sessionId);
|
|
166
|
+
if (existed) {
|
|
167
|
+
this.logger.info({ sessionId }, 'Session removed');
|
|
168
|
+
}
|
|
169
|
+
return existed;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Clean up expired sessions.
|
|
173
|
+
*/
|
|
174
|
+
cleanupExpiredSessions() {
|
|
175
|
+
const now = Date.now();
|
|
176
|
+
const expiredIds = [];
|
|
177
|
+
for (const [id, session] of this.sessions) {
|
|
178
|
+
const age = now - session.lastActiveAt.getTime();
|
|
179
|
+
// Remove terminated sessions after a short grace period (1 minute)
|
|
180
|
+
if (!session.isActive() && age > 60000) {
|
|
181
|
+
expiredIds.push(id);
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
// Remove active sessions that have exceeded the timeout
|
|
185
|
+
if (session.isActive() && age > this.options.sessionTimeoutMs) {
|
|
186
|
+
session.terminate('timeout');
|
|
187
|
+
expiredIds.push(id);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
for (const id of expiredIds) {
|
|
191
|
+
this.sessions.delete(id);
|
|
192
|
+
}
|
|
193
|
+
if (expiredIds.length > 0) {
|
|
194
|
+
this.logger.info({ count: expiredIds.length }, 'Cleaned up expired sessions');
|
|
195
|
+
}
|
|
196
|
+
return expiredIds.length;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Clean up all sessions.
|
|
200
|
+
*/
|
|
201
|
+
cleanupAll() {
|
|
202
|
+
const count = this.sessions.size;
|
|
203
|
+
for (const session of this.sessions.values()) {
|
|
204
|
+
if (session.isActive()) {
|
|
205
|
+
session.terminate('user_requested');
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
this.sessions.clear();
|
|
209
|
+
this.logger.info({ count }, 'Cleaned up all sessions');
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Stop the cleanup timer.
|
|
213
|
+
*/
|
|
214
|
+
stopCleanupTimer() {
|
|
215
|
+
if (this.cleanupTimer) {
|
|
216
|
+
clearInterval(this.cleanupTimer);
|
|
217
|
+
this.cleanupTimer = undefined;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Dispose of the session manager.
|
|
222
|
+
*/
|
|
223
|
+
dispose() {
|
|
224
|
+
this.stopCleanupTimer();
|
|
225
|
+
this.cleanupAll();
|
|
226
|
+
}
|
|
227
|
+
// ==========================================================================
|
|
228
|
+
// Private methods
|
|
229
|
+
// ==========================================================================
|
|
230
|
+
/**
|
|
231
|
+
* Start the periodic cleanup timer.
|
|
232
|
+
*/
|
|
233
|
+
startCleanupTimer() {
|
|
234
|
+
this.cleanupTimer = setInterval(() => {
|
|
235
|
+
this.cleanupExpiredSessions();
|
|
236
|
+
}, this.options.cleanupIntervalMs);
|
|
237
|
+
// Don't let the timer prevent the process from exiting
|
|
238
|
+
if (this.cleanupTimer.unref) {
|
|
239
|
+
this.cleanupTimer.unref();
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=session-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @generacy-ai/generacy-plugin-claude-code
|
|
3
|
+
*
|
|
4
|
+
* Session class implementing a finite state machine for session lifecycle.
|
|
5
|
+
*/
|
|
6
|
+
import type { Session as SessionInterface, SessionState, SessionStatus, InvokeOptions, ContainerConfig, QuestionPayload, TerminationReason } from '../types.js';
|
|
7
|
+
import type { SessionData, SessionEvent, CreateSessionOptions, UpdateSessionOptions, SessionSummary } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Session class implementing a finite state machine.
|
|
10
|
+
* Manages session lifecycle with validated state transitions.
|
|
11
|
+
*/
|
|
12
|
+
export declare class Session implements SessionInterface {
|
|
13
|
+
private data;
|
|
14
|
+
constructor(options: CreateSessionOptions);
|
|
15
|
+
/**
|
|
16
|
+
* Create a session with a specific ID (for testing or restoration).
|
|
17
|
+
*/
|
|
18
|
+
static withId(id: string, options: CreateSessionOptions): Session;
|
|
19
|
+
get id(): string;
|
|
20
|
+
get status(): SessionStatus;
|
|
21
|
+
get createdAt(): Date;
|
|
22
|
+
get lastActiveAt(): Date;
|
|
23
|
+
get state(): SessionState;
|
|
24
|
+
get containerConfig(): ContainerConfig;
|
|
25
|
+
get containerId(): string | undefined;
|
|
26
|
+
get invocationId(): string | undefined;
|
|
27
|
+
get defaultOptions(): InvokeOptions;
|
|
28
|
+
get pendingQuestion(): QuestionPayload | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* Process an event and transition to a new state.
|
|
31
|
+
* Throws SessionInvalidStateError if the transition is invalid.
|
|
32
|
+
*/
|
|
33
|
+
processEvent(event: SessionEvent): void;
|
|
34
|
+
/**
|
|
35
|
+
* Transition to running state when container starts.
|
|
36
|
+
*/
|
|
37
|
+
onContainerStarted(containerId: string): void;
|
|
38
|
+
/**
|
|
39
|
+
* Transition to executing state when invocation starts.
|
|
40
|
+
*/
|
|
41
|
+
onInvocationStarted(invocationId: string): void;
|
|
42
|
+
/**
|
|
43
|
+
* Transition back to running state when invocation completes.
|
|
44
|
+
*/
|
|
45
|
+
onInvocationCompleted(): void;
|
|
46
|
+
/**
|
|
47
|
+
* Transition to awaiting_input state when a question is received.
|
|
48
|
+
*/
|
|
49
|
+
onQuestionReceived(question: QuestionPayload): void;
|
|
50
|
+
/**
|
|
51
|
+
* Transition back from awaiting_input when answer is provided.
|
|
52
|
+
*/
|
|
53
|
+
onAnswerProvided(): void;
|
|
54
|
+
/**
|
|
55
|
+
* Transition to terminated state.
|
|
56
|
+
*/
|
|
57
|
+
terminate(reason: TerminationReason): void;
|
|
58
|
+
/**
|
|
59
|
+
* Update session data (partial update).
|
|
60
|
+
*/
|
|
61
|
+
update(options: UpdateSessionOptions): void;
|
|
62
|
+
/**
|
|
63
|
+
* Check if the session is in an active (non-terminated) state.
|
|
64
|
+
*/
|
|
65
|
+
isActive(): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Check if the session is ready to execute an invocation.
|
|
68
|
+
*/
|
|
69
|
+
isReadyForInvocation(): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Check if the session is waiting for human input.
|
|
72
|
+
*/
|
|
73
|
+
isAwaitingInput(): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Check if the session has a running container.
|
|
76
|
+
*/
|
|
77
|
+
hasRunningContainer(): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Get a summary of the session for external visibility.
|
|
80
|
+
*/
|
|
81
|
+
getSummary(): SessionSummary;
|
|
82
|
+
/**
|
|
83
|
+
* Export session data (for serialization).
|
|
84
|
+
*/
|
|
85
|
+
toJSON(): SessionData;
|
|
86
|
+
/**
|
|
87
|
+
* Compute the next state based on the event.
|
|
88
|
+
*/
|
|
89
|
+
private computeNextState;
|
|
90
|
+
/**
|
|
91
|
+
* Update auxiliary data based on event.
|
|
92
|
+
*/
|
|
93
|
+
private updateFromEvent;
|
|
94
|
+
/**
|
|
95
|
+
* Get container ID or throw if not available.
|
|
96
|
+
*/
|
|
97
|
+
private getContainerIdOrThrow;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session/session.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EACV,OAAO,IAAI,gBAAgB,EAC3B,YAAY,EACZ,aAAa,EACb,aAAa,EACb,eAAe,EACf,eAAe,EACf,iBAAiB,EAClB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACf,MAAM,YAAY,CAAC;AAMpB;;;GAGG;AACH,qBAAa,OAAQ,YAAW,gBAAgB;IAC9C,OAAO,CAAC,IAAI,CAAc;gBAEd,OAAO,EAAE,oBAAoB;IAazC;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO;IAUjE,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,MAAM,IAAI,aAAa,CAE1B;IAED,IAAI,SAAS,IAAI,IAAI,CAEpB;IAED,IAAI,YAAY,IAAI,IAAI,CAEvB;IAMD,IAAI,KAAK,IAAI,YAAY,CAExB;IAED,IAAI,eAAe,IAAI,eAAe,CAErC;IAED,IAAI,WAAW,IAAI,MAAM,GAAG,SAAS,CAEpC;IAED,IAAI,YAAY,IAAI,MAAM,GAAG,SAAS,CAErC;IAED,IAAI,cAAc,IAAI,aAAa,CAElC;IAED,IAAI,eAAe,IAAI,eAAe,GAAG,SAAS,CAEjD;IAMD;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAmBvC;;OAEG;IACH,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAI7C;;OAEG;IACH,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAI/C;;OAEG;IACH,qBAAqB,IAAI,IAAI;IAI7B;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAInD;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAIxB;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAc1C;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI;IAgB3C;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACH,oBAAoB,IAAI,OAAO;IAI/B;;OAEG;IACH,eAAe,IAAI,OAAO;IAI1B;;OAEG;IACH,mBAAmB,IAAI,OAAO;IAK9B;;OAEG;IACH,UAAU,IAAI,cAAc;IAW5B;;OAEG;IACH,MAAM,IAAI,WAAW;IAQrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0CxB;;OAEG;IACH,OAAO,CAAC,eAAe;IA4BvB;;OAEG;IACH,OAAO,CAAC,qBAAqB;CAY9B"}
|