@agentxjs/core 1.9.5-dev → 1.9.7-dev
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/Processor-DT0N1qI6.d.ts +64 -0
- package/dist/agent/engine/internal/index.d.ts +223 -0
- package/dist/agent/engine/internal/index.js +24 -0
- package/dist/agent/engine/internal/index.js.map +1 -0
- package/dist/agent/engine/mealy/index.d.ts +157 -0
- package/dist/agent/engine/mealy/index.js +26 -0
- package/dist/agent/engine/mealy/index.js.map +1 -0
- package/dist/agent/index.d.ts +244 -0
- package/dist/agent/index.js +66 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/types/index.d.ts +322 -0
- package/dist/agent/types/index.js +12 -0
- package/dist/agent/types/index.js.map +1 -0
- package/dist/base-m40r3Qgu.d.ts +157 -0
- package/dist/bus-uF1DM2ox.d.ts +906 -0
- package/dist/chunk-7D4SUZUM.js +38 -0
- package/dist/chunk-7D4SUZUM.js.map +1 -0
- package/dist/chunk-7ZDX3O6I.js +173 -0
- package/dist/chunk-7ZDX3O6I.js.map +1 -0
- package/dist/chunk-E5FPOAPO.js +123 -0
- package/dist/chunk-E5FPOAPO.js.map +1 -0
- package/dist/chunk-EKHT54KN.js +272 -0
- package/dist/chunk-EKHT54KN.js.map +1 -0
- package/dist/chunk-I7GYR3MN.js +502 -0
- package/dist/chunk-I7GYR3MN.js.map +1 -0
- package/dist/chunk-K6WXQ2RW.js +38 -0
- package/dist/chunk-K6WXQ2RW.js.map +1 -0
- package/dist/chunk-RL3JRNXM.js +3 -0
- package/dist/chunk-RL3JRNXM.js.map +1 -0
- package/dist/chunk-TBU7FFZT.js +543 -0
- package/dist/chunk-TBU7FFZT.js.map +1 -0
- package/dist/combinators-nEa5dD0T.d.ts +271 -0
- package/dist/common/index.d.ts +1 -0
- package/dist/common/index.js +2 -0
- package/dist/common/index.js.map +1 -0
- package/dist/common/logger/index.d.ts +163 -0
- package/dist/common/logger/index.js +184 -0
- package/dist/common/logger/index.js.map +1 -0
- package/dist/container/index.d.ts +110 -0
- package/dist/container/index.js +127 -0
- package/dist/container/index.js.map +1 -0
- package/dist/driver/index.d.ts +266 -0
- package/dist/driver/index.js +1 -0
- package/dist/driver/index.js.map +1 -0
- package/dist/event/index.d.ts +55 -0
- package/dist/event/index.js +60 -0
- package/dist/event/index.js.map +1 -0
- package/dist/event/types/index.d.ts +1149 -0
- package/dist/event/types/index.js +56 -0
- package/dist/event/types/index.js.map +1 -0
- package/dist/event-CDuTzs__.d.ts +296 -0
- package/dist/image/index.d.ts +112 -0
- package/dist/image/index.js +151 -0
- package/dist/image/index.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +67 -0
- package/dist/index.js.map +1 -0
- package/dist/message-BMrMm1pq.d.ts +305 -0
- package/dist/mq/index.d.ts +165 -0
- package/dist/mq/index.js +37 -0
- package/dist/mq/index.js.map +1 -0
- package/dist/network/index.d.ts +567 -0
- package/dist/network/index.js +435 -0
- package/dist/network/index.js.map +1 -0
- package/dist/persistence/index.d.ts +155 -0
- package/dist/persistence/index.js +1 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/runtime/index.d.ts +240 -0
- package/dist/runtime/index.js +347 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/session/index.d.ts +92 -0
- package/dist/session/index.js +56 -0
- package/dist/session/index.js.map +1 -0
- package/dist/workspace/index.d.ts +111 -0
- package/dist/workspace/index.js +1 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/wrapper-Y3UTVU2E.js +3635 -0
- package/dist/wrapper-Y3UTVU2E.js.map +1 -0
- package/package.json +73 -14
- package/tsconfig.json +0 -10
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { ContainerRepository, ImageRepository, SessionRepository } from '../persistence/index.js';
|
|
2
|
+
import { CreateDriver } from '../driver/index.js';
|
|
3
|
+
import { c as UserContentPart } from '../message-BMrMm1pq.js';
|
|
4
|
+
import { WorkspaceProvider } from '../workspace/index.js';
|
|
5
|
+
import { B as BusEvent } from '../base-m40r3Qgu.js';
|
|
6
|
+
import { E as EventBus } from '../bus-uF1DM2ox.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Runtime Types
|
|
10
|
+
*
|
|
11
|
+
* AgentXProvider - Dependency injection container
|
|
12
|
+
* AgentXRuntime - Runtime integration layer
|
|
13
|
+
*
|
|
14
|
+
* Architecture:
|
|
15
|
+
* ```
|
|
16
|
+
* ┌─────────────────────────────────────────────────────────────┐
|
|
17
|
+
* │ AgentXProvider │
|
|
18
|
+
* │ (Dependency Injection - Platform provides implementations) │
|
|
19
|
+
* │ │
|
|
20
|
+
* │ ┌─────────────┐ ┌─────────────┐ ┌───────────────┐ │
|
|
21
|
+
* │ │ Repositories│ │ Workspace │ │ DriverFactory │ │
|
|
22
|
+
* │ │ Container │ │ Provider │ │ (per-Agent) │ │
|
|
23
|
+
* │ │ Image │ │ │ │ │ │
|
|
24
|
+
* │ │ Session │ │ │ │ │ │
|
|
25
|
+
* │ └─────────────┘ └─────────────┘ └─────────────┘ │
|
|
26
|
+
* └─────────────────────────────────────────────────────────────┘
|
|
27
|
+
* │
|
|
28
|
+
* ▼
|
|
29
|
+
* ┌─────────────────────────────────────────────────────────────┐
|
|
30
|
+
* │ AgentXRuntime │
|
|
31
|
+
* │ (Integration - Uses Provider dependencies) │
|
|
32
|
+
* │ │
|
|
33
|
+
* │ ┌─────────────────────────────────────────────────────┐ │
|
|
34
|
+
* │ │ Agent Lifecycle: create / get / destroy │ │
|
|
35
|
+
* │ │ Message Flow: receive → EventBus → Driver │ │
|
|
36
|
+
* │ │ Event Subscription: subscribe to agent events │ │
|
|
37
|
+
* │ └─────────────────────────────────────────────────────┘ │
|
|
38
|
+
* └─────────────────────────────────────────────────────────────┘
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Agent lifecycle states
|
|
44
|
+
*/
|
|
45
|
+
type AgentLifecycle = "running" | "stopped" | "destroyed";
|
|
46
|
+
/**
|
|
47
|
+
* Runtime Agent - Active agent instance
|
|
48
|
+
*/
|
|
49
|
+
interface RuntimeAgent {
|
|
50
|
+
readonly agentId: string;
|
|
51
|
+
readonly imageId: string;
|
|
52
|
+
readonly containerId: string;
|
|
53
|
+
readonly sessionId: string;
|
|
54
|
+
readonly name: string;
|
|
55
|
+
readonly lifecycle: AgentLifecycle;
|
|
56
|
+
readonly createdAt: number;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* AgentXProvider - Collects all dependencies for runtime
|
|
60
|
+
*
|
|
61
|
+
* Platform packages provide implementations of these interfaces.
|
|
62
|
+
* The provider is passed to AgentXRuntime for integration.
|
|
63
|
+
*/
|
|
64
|
+
interface AgentXProvider {
|
|
65
|
+
/**
|
|
66
|
+
* Container repository for persistence
|
|
67
|
+
*/
|
|
68
|
+
readonly containerRepository: ContainerRepository;
|
|
69
|
+
/**
|
|
70
|
+
* Image repository for persistence
|
|
71
|
+
*/
|
|
72
|
+
readonly imageRepository: ImageRepository;
|
|
73
|
+
/**
|
|
74
|
+
* Session repository for persistence
|
|
75
|
+
*/
|
|
76
|
+
readonly sessionRepository: SessionRepository;
|
|
77
|
+
/**
|
|
78
|
+
* Workspace provider for isolated environments
|
|
79
|
+
*/
|
|
80
|
+
readonly workspaceProvider: WorkspaceProvider;
|
|
81
|
+
/**
|
|
82
|
+
* LLM Driver factory function - creates Driver per Agent
|
|
83
|
+
*/
|
|
84
|
+
readonly createDriver: CreateDriver;
|
|
85
|
+
/**
|
|
86
|
+
* Event bus for pub/sub
|
|
87
|
+
*/
|
|
88
|
+
readonly eventBus: EventBus;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Agent creation options
|
|
92
|
+
*/
|
|
93
|
+
interface CreateAgentOptions {
|
|
94
|
+
/**
|
|
95
|
+
* Image ID to create agent from
|
|
96
|
+
*/
|
|
97
|
+
imageId: string;
|
|
98
|
+
/**
|
|
99
|
+
* Optional agent ID (auto-generated if not provided)
|
|
100
|
+
*/
|
|
101
|
+
agentId?: string;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Event handler for agent events
|
|
105
|
+
*/
|
|
106
|
+
type AgentEventHandler = (event: BusEvent) => void;
|
|
107
|
+
/**
|
|
108
|
+
* Subscription handle for unsubscribing
|
|
109
|
+
*/
|
|
110
|
+
interface Subscription {
|
|
111
|
+
unsubscribe(): void;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* AgentXRuntime - Runtime integration layer
|
|
115
|
+
*
|
|
116
|
+
* Integrates all components to provide agent lifecycle management
|
|
117
|
+
* and message handling.
|
|
118
|
+
*/
|
|
119
|
+
interface AgentXRuntime {
|
|
120
|
+
/**
|
|
121
|
+
* The provider containing all dependencies
|
|
122
|
+
*/
|
|
123
|
+
readonly provider: AgentXProvider;
|
|
124
|
+
/**
|
|
125
|
+
* Create and start an agent from an image
|
|
126
|
+
*/
|
|
127
|
+
createAgent(options: CreateAgentOptions): Promise<RuntimeAgent>;
|
|
128
|
+
/**
|
|
129
|
+
* Get an active agent by ID
|
|
130
|
+
*/
|
|
131
|
+
getAgent(agentId: string): RuntimeAgent | undefined;
|
|
132
|
+
/**
|
|
133
|
+
* Get all active agents
|
|
134
|
+
*/
|
|
135
|
+
getAgents(): RuntimeAgent[];
|
|
136
|
+
/**
|
|
137
|
+
* Get agents by container ID
|
|
138
|
+
*/
|
|
139
|
+
getAgentsByContainer(containerId: string): RuntimeAgent[];
|
|
140
|
+
/**
|
|
141
|
+
* Stop an agent (can be resumed)
|
|
142
|
+
*/
|
|
143
|
+
stopAgent(agentId: string): Promise<void>;
|
|
144
|
+
/**
|
|
145
|
+
* Resume a stopped agent
|
|
146
|
+
*/
|
|
147
|
+
resumeAgent(agentId: string): Promise<void>;
|
|
148
|
+
/**
|
|
149
|
+
* Destroy an agent (cannot be resumed)
|
|
150
|
+
*/
|
|
151
|
+
destroyAgent(agentId: string): Promise<void>;
|
|
152
|
+
/**
|
|
153
|
+
* Send a message to an agent
|
|
154
|
+
*
|
|
155
|
+
* Emits user_message to EventBus, Driver picks it up and responds.
|
|
156
|
+
*/
|
|
157
|
+
receive(agentId: string, content: string | UserContentPart[], requestId?: string): Promise<void>;
|
|
158
|
+
/**
|
|
159
|
+
* Interrupt an agent's current operation
|
|
160
|
+
*/
|
|
161
|
+
interrupt(agentId: string, requestId?: string): void;
|
|
162
|
+
/**
|
|
163
|
+
* Subscribe to events for a specific agent
|
|
164
|
+
*/
|
|
165
|
+
subscribe(agentId: string, handler: AgentEventHandler): Subscription;
|
|
166
|
+
/**
|
|
167
|
+
* Subscribe to all events (all agents)
|
|
168
|
+
*/
|
|
169
|
+
subscribeAll(handler: AgentEventHandler): Subscription;
|
|
170
|
+
/**
|
|
171
|
+
* Shutdown runtime and cleanup all resources
|
|
172
|
+
*/
|
|
173
|
+
shutdown(): Promise<void>;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Configuration for creating AgentXRuntime
|
|
177
|
+
*/
|
|
178
|
+
interface AgentXRuntimeConfig {
|
|
179
|
+
provider: AgentXProvider;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Factory function type for creating AgentXRuntime
|
|
183
|
+
*/
|
|
184
|
+
type CreateAgentXRuntime = (config: AgentXRuntimeConfig) => AgentXRuntime;
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* AgentXRuntimeImpl - Runtime integration implementation
|
|
188
|
+
*
|
|
189
|
+
* Integrates all components to provide agent lifecycle management.
|
|
190
|
+
* Uses Provider dependencies to coordinate Session, Image, Container, etc.
|
|
191
|
+
*
|
|
192
|
+
* New Design:
|
|
193
|
+
* - Driver.receive() returns AsyncIterable<DriverStreamEvent>
|
|
194
|
+
* - Runtime processes events and emits to EventBus
|
|
195
|
+
* - No more EventBus-based communication with Driver
|
|
196
|
+
*/
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* AgentXRuntimeImpl - Runtime implementation
|
|
200
|
+
*/
|
|
201
|
+
declare class AgentXRuntimeImpl implements AgentXRuntime {
|
|
202
|
+
readonly provider: AgentXProvider;
|
|
203
|
+
private agents;
|
|
204
|
+
private globalSubscriptions;
|
|
205
|
+
private isShutdown;
|
|
206
|
+
constructor(provider: AgentXProvider);
|
|
207
|
+
createAgent(options: CreateAgentOptions): Promise<RuntimeAgent>;
|
|
208
|
+
getAgent(agentId: string): RuntimeAgent | undefined;
|
|
209
|
+
getAgents(): RuntimeAgent[];
|
|
210
|
+
getAgentsByContainer(containerId: string): RuntimeAgent[];
|
|
211
|
+
stopAgent(agentId: string): Promise<void>;
|
|
212
|
+
resumeAgent(agentId: string): Promise<void>;
|
|
213
|
+
destroyAgent(agentId: string): Promise<void>;
|
|
214
|
+
receive(agentId: string, content: string | UserContentPart[], requestId?: string): Promise<void>;
|
|
215
|
+
interrupt(agentId: string, requestId?: string): void;
|
|
216
|
+
subscribe(agentId: string, handler: AgentEventHandler): Subscription;
|
|
217
|
+
subscribeAll(handler: AgentEventHandler): Subscription;
|
|
218
|
+
shutdown(): Promise<void>;
|
|
219
|
+
/**
|
|
220
|
+
* Handle a single DriverStreamEvent
|
|
221
|
+
*/
|
|
222
|
+
private handleDriverEvent;
|
|
223
|
+
/**
|
|
224
|
+
* Emit an event to the EventBus
|
|
225
|
+
*/
|
|
226
|
+
private emitEvent;
|
|
227
|
+
/**
|
|
228
|
+
* Categorize event type
|
|
229
|
+
*/
|
|
230
|
+
private categorizeEvent;
|
|
231
|
+
private generateAgentId;
|
|
232
|
+
private generateRequestId;
|
|
233
|
+
private generateMessageId;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Create an AgentXRuntime instance
|
|
237
|
+
*/
|
|
238
|
+
declare function createAgentXRuntime(provider: AgentXProvider): AgentXRuntime;
|
|
239
|
+
|
|
240
|
+
export { type AgentEventHandler, type AgentLifecycle, type AgentXProvider, type AgentXRuntime, type AgentXRuntimeConfig, AgentXRuntimeImpl, type CreateAgentOptions, type CreateAgentXRuntime, type RuntimeAgent, type Subscription, createAgentXRuntime };
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import "../chunk-7D4SUZUM.js";
|
|
2
|
+
|
|
3
|
+
// src/runtime/AgentXRuntime.ts
|
|
4
|
+
import { createLogger } from "commonxjs/logger";
|
|
5
|
+
var logger = createLogger("runtime/AgentXRuntime");
|
|
6
|
+
var AgentXRuntimeImpl = class {
|
|
7
|
+
provider;
|
|
8
|
+
agents = /* @__PURE__ */ new Map();
|
|
9
|
+
globalSubscriptions = /* @__PURE__ */ new Set();
|
|
10
|
+
isShutdown = false;
|
|
11
|
+
constructor(provider) {
|
|
12
|
+
this.provider = provider;
|
|
13
|
+
logger.info("AgentXRuntime initialized");
|
|
14
|
+
}
|
|
15
|
+
// ==================== Agent Lifecycle ====================
|
|
16
|
+
async createAgent(options) {
|
|
17
|
+
if (this.isShutdown) {
|
|
18
|
+
throw new Error("Runtime is shutdown");
|
|
19
|
+
}
|
|
20
|
+
const { imageId } = options;
|
|
21
|
+
const imageRecord = await this.provider.imageRepository.findImageById(imageId);
|
|
22
|
+
if (!imageRecord) {
|
|
23
|
+
throw new Error(`Image not found: ${imageId}`);
|
|
24
|
+
}
|
|
25
|
+
const agentId = options.agentId ?? this.generateAgentId();
|
|
26
|
+
const containerExists = await this.provider.containerRepository.containerExists(
|
|
27
|
+
imageRecord.containerId
|
|
28
|
+
);
|
|
29
|
+
if (!containerExists) {
|
|
30
|
+
throw new Error(`Container not found: ${imageRecord.containerId}`);
|
|
31
|
+
}
|
|
32
|
+
const workspace = await this.provider.workspaceProvider.create({
|
|
33
|
+
containerId: imageRecord.containerId,
|
|
34
|
+
imageId
|
|
35
|
+
});
|
|
36
|
+
await workspace.initialize();
|
|
37
|
+
const driverConfig = {
|
|
38
|
+
apiKey: process.env.ANTHROPIC_API_KEY ?? "",
|
|
39
|
+
baseUrl: process.env.ANTHROPIC_BASE_URL,
|
|
40
|
+
agentId,
|
|
41
|
+
systemPrompt: imageRecord.systemPrompt,
|
|
42
|
+
cwd: workspace.path,
|
|
43
|
+
mcpServers: imageRecord.mcpServers,
|
|
44
|
+
resumeSessionId: imageRecord.metadata?.claudeSdkSessionId,
|
|
45
|
+
onSessionIdCaptured: async (claudeSdkSessionId) => {
|
|
46
|
+
await this.provider.imageRepository.updateMetadata(imageId, { claudeSdkSessionId });
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const driver = this.provider.createDriver(driverConfig);
|
|
50
|
+
await driver.initialize();
|
|
51
|
+
const agent = {
|
|
52
|
+
agentId,
|
|
53
|
+
imageId,
|
|
54
|
+
containerId: imageRecord.containerId,
|
|
55
|
+
sessionId: imageRecord.sessionId,
|
|
56
|
+
name: imageRecord.name,
|
|
57
|
+
lifecycle: "running",
|
|
58
|
+
createdAt: Date.now()
|
|
59
|
+
};
|
|
60
|
+
const state = {
|
|
61
|
+
agent,
|
|
62
|
+
lifecycle: "running",
|
|
63
|
+
subscriptions: /* @__PURE__ */ new Set(),
|
|
64
|
+
driver,
|
|
65
|
+
isReceiving: false
|
|
66
|
+
};
|
|
67
|
+
this.agents.set(agentId, state);
|
|
68
|
+
this.provider.eventBus.emit({
|
|
69
|
+
type: "agent_created",
|
|
70
|
+
timestamp: Date.now(),
|
|
71
|
+
source: "runtime",
|
|
72
|
+
category: "lifecycle",
|
|
73
|
+
intent: "notification",
|
|
74
|
+
data: {
|
|
75
|
+
agentId,
|
|
76
|
+
imageId,
|
|
77
|
+
containerId: imageRecord.containerId
|
|
78
|
+
},
|
|
79
|
+
context: {
|
|
80
|
+
agentId,
|
|
81
|
+
imageId,
|
|
82
|
+
containerId: imageRecord.containerId,
|
|
83
|
+
sessionId: imageRecord.sessionId
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
logger.info("Agent created", {
|
|
87
|
+
agentId,
|
|
88
|
+
imageId,
|
|
89
|
+
containerId: imageRecord.containerId
|
|
90
|
+
});
|
|
91
|
+
return agent;
|
|
92
|
+
}
|
|
93
|
+
getAgent(agentId) {
|
|
94
|
+
const state = this.agents.get(agentId);
|
|
95
|
+
return state?.agent;
|
|
96
|
+
}
|
|
97
|
+
getAgents() {
|
|
98
|
+
return Array.from(this.agents.values()).map((s) => s.agent);
|
|
99
|
+
}
|
|
100
|
+
getAgentsByContainer(containerId) {
|
|
101
|
+
return Array.from(this.agents.values()).filter((s) => s.agent.containerId === containerId).map((s) => s.agent);
|
|
102
|
+
}
|
|
103
|
+
async stopAgent(agentId) {
|
|
104
|
+
const state = this.agents.get(agentId);
|
|
105
|
+
if (!state) {
|
|
106
|
+
throw new Error(`Agent not found: ${agentId}`);
|
|
107
|
+
}
|
|
108
|
+
if (state.lifecycle === "destroyed") {
|
|
109
|
+
throw new Error(`Agent already destroyed: ${agentId}`);
|
|
110
|
+
}
|
|
111
|
+
state.lifecycle = "stopped";
|
|
112
|
+
this.provider.eventBus.emit({
|
|
113
|
+
type: "agent_stopped",
|
|
114
|
+
timestamp: Date.now(),
|
|
115
|
+
source: "runtime",
|
|
116
|
+
category: "lifecycle",
|
|
117
|
+
intent: "notification",
|
|
118
|
+
data: { agentId },
|
|
119
|
+
context: {
|
|
120
|
+
agentId,
|
|
121
|
+
imageId: state.agent.imageId,
|
|
122
|
+
containerId: state.agent.containerId,
|
|
123
|
+
sessionId: state.agent.sessionId
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
logger.info("Agent stopped", { agentId });
|
|
127
|
+
}
|
|
128
|
+
async resumeAgent(agentId) {
|
|
129
|
+
const state = this.agents.get(agentId);
|
|
130
|
+
if (!state) {
|
|
131
|
+
throw new Error(`Agent not found: ${agentId}`);
|
|
132
|
+
}
|
|
133
|
+
if (state.lifecycle === "destroyed") {
|
|
134
|
+
throw new Error(`Cannot resume destroyed agent: ${agentId}`);
|
|
135
|
+
}
|
|
136
|
+
state.lifecycle = "running";
|
|
137
|
+
this.provider.eventBus.emit({
|
|
138
|
+
type: "agent_resumed",
|
|
139
|
+
timestamp: Date.now(),
|
|
140
|
+
source: "runtime",
|
|
141
|
+
category: "lifecycle",
|
|
142
|
+
intent: "notification",
|
|
143
|
+
data: { agentId },
|
|
144
|
+
context: {
|
|
145
|
+
agentId,
|
|
146
|
+
imageId: state.agent.imageId,
|
|
147
|
+
containerId: state.agent.containerId,
|
|
148
|
+
sessionId: state.agent.sessionId
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
logger.info("Agent resumed", { agentId });
|
|
152
|
+
}
|
|
153
|
+
async destroyAgent(agentId) {
|
|
154
|
+
const state = this.agents.get(agentId);
|
|
155
|
+
if (!state) {
|
|
156
|
+
throw new Error(`Agent not found: ${agentId}`);
|
|
157
|
+
}
|
|
158
|
+
await state.driver.dispose();
|
|
159
|
+
for (const unsub of state.subscriptions) {
|
|
160
|
+
unsub();
|
|
161
|
+
}
|
|
162
|
+
state.subscriptions.clear();
|
|
163
|
+
state.lifecycle = "destroyed";
|
|
164
|
+
this.provider.eventBus.emit({
|
|
165
|
+
type: "agent_destroyed",
|
|
166
|
+
timestamp: Date.now(),
|
|
167
|
+
source: "runtime",
|
|
168
|
+
category: "lifecycle",
|
|
169
|
+
intent: "notification",
|
|
170
|
+
data: { agentId },
|
|
171
|
+
context: {
|
|
172
|
+
agentId,
|
|
173
|
+
imageId: state.agent.imageId,
|
|
174
|
+
containerId: state.agent.containerId,
|
|
175
|
+
sessionId: state.agent.sessionId
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
this.agents.delete(agentId);
|
|
179
|
+
logger.info("Agent destroyed", { agentId });
|
|
180
|
+
}
|
|
181
|
+
// ==================== Message Handling ====================
|
|
182
|
+
async receive(agentId, content, requestId) {
|
|
183
|
+
const state = this.agents.get(agentId);
|
|
184
|
+
if (!state) {
|
|
185
|
+
throw new Error(`Agent not found: ${agentId}`);
|
|
186
|
+
}
|
|
187
|
+
if (state.lifecycle !== "running") {
|
|
188
|
+
throw new Error(`Cannot send message to ${state.lifecycle} agent: ${agentId}`);
|
|
189
|
+
}
|
|
190
|
+
if (state.isReceiving) {
|
|
191
|
+
throw new Error(`Agent ${agentId} is already processing a message`);
|
|
192
|
+
}
|
|
193
|
+
const actualRequestId = requestId ?? this.generateRequestId();
|
|
194
|
+
const userMessage = {
|
|
195
|
+
id: this.generateMessageId(),
|
|
196
|
+
role: "user",
|
|
197
|
+
subtype: "user",
|
|
198
|
+
content,
|
|
199
|
+
timestamp: Date.now()
|
|
200
|
+
};
|
|
201
|
+
await this.provider.sessionRepository.addMessage(state.agent.sessionId, userMessage);
|
|
202
|
+
this.emitEvent(state, "user_message", userMessage, actualRequestId);
|
|
203
|
+
logger.debug("User message sent", {
|
|
204
|
+
agentId,
|
|
205
|
+
requestId: actualRequestId,
|
|
206
|
+
contentPreview: typeof content === "string" ? content.substring(0, 50) : `[${content.length} parts]`
|
|
207
|
+
});
|
|
208
|
+
state.isReceiving = true;
|
|
209
|
+
try {
|
|
210
|
+
for await (const event of state.driver.receive(userMessage)) {
|
|
211
|
+
this.handleDriverEvent(state, event, actualRequestId);
|
|
212
|
+
}
|
|
213
|
+
} catch (error) {
|
|
214
|
+
this.emitEvent(
|
|
215
|
+
state,
|
|
216
|
+
"error_received",
|
|
217
|
+
{
|
|
218
|
+
message: error instanceof Error ? error.message : String(error),
|
|
219
|
+
errorCode: "runtime_error"
|
|
220
|
+
},
|
|
221
|
+
actualRequestId
|
|
222
|
+
);
|
|
223
|
+
throw error;
|
|
224
|
+
} finally {
|
|
225
|
+
state.isReceiving = false;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
interrupt(agentId, requestId) {
|
|
229
|
+
const state = this.agents.get(agentId);
|
|
230
|
+
if (!state) {
|
|
231
|
+
throw new Error(`Agent not found: ${agentId}`);
|
|
232
|
+
}
|
|
233
|
+
state.driver.interrupt();
|
|
234
|
+
this.emitEvent(
|
|
235
|
+
state,
|
|
236
|
+
"interrupt",
|
|
237
|
+
{ agentId },
|
|
238
|
+
requestId ?? this.generateRequestId()
|
|
239
|
+
);
|
|
240
|
+
logger.debug("Interrupt sent", { agentId, requestId });
|
|
241
|
+
}
|
|
242
|
+
// ==================== Event Subscription ====================
|
|
243
|
+
subscribe(agentId, handler) {
|
|
244
|
+
const state = this.agents.get(agentId);
|
|
245
|
+
if (!state) {
|
|
246
|
+
throw new Error(`Agent not found: ${agentId}`);
|
|
247
|
+
}
|
|
248
|
+
const unsub = this.provider.eventBus.onAny((event) => {
|
|
249
|
+
const context = event.context;
|
|
250
|
+
if (context?.agentId === agentId) {
|
|
251
|
+
handler(event);
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
state.subscriptions.add(unsub);
|
|
255
|
+
return {
|
|
256
|
+
unsubscribe: () => {
|
|
257
|
+
unsub();
|
|
258
|
+
state.subscriptions.delete(unsub);
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
subscribeAll(handler) {
|
|
263
|
+
const unsub = this.provider.eventBus.onAny(handler);
|
|
264
|
+
this.globalSubscriptions.add(unsub);
|
|
265
|
+
return {
|
|
266
|
+
unsubscribe: () => {
|
|
267
|
+
unsub();
|
|
268
|
+
this.globalSubscriptions.delete(unsub);
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
// ==================== Cleanup ====================
|
|
273
|
+
async shutdown() {
|
|
274
|
+
if (this.isShutdown) return;
|
|
275
|
+
logger.info("Shutting down AgentXRuntime...");
|
|
276
|
+
const agentIds = Array.from(this.agents.keys());
|
|
277
|
+
for (const agentId of agentIds) {
|
|
278
|
+
await this.destroyAgent(agentId);
|
|
279
|
+
}
|
|
280
|
+
for (const unsub of this.globalSubscriptions) {
|
|
281
|
+
unsub();
|
|
282
|
+
}
|
|
283
|
+
this.globalSubscriptions.clear();
|
|
284
|
+
this.isShutdown = true;
|
|
285
|
+
logger.info("AgentXRuntime shutdown complete");
|
|
286
|
+
}
|
|
287
|
+
// ==================== Private Helpers ====================
|
|
288
|
+
/**
|
|
289
|
+
* Handle a single DriverStreamEvent
|
|
290
|
+
*/
|
|
291
|
+
handleDriverEvent(state, event, requestId) {
|
|
292
|
+
this.emitEvent(state, event.type, event.data, requestId);
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Emit an event to the EventBus
|
|
296
|
+
*/
|
|
297
|
+
emitEvent(state, type, data, requestId) {
|
|
298
|
+
this.provider.eventBus.emit({
|
|
299
|
+
type,
|
|
300
|
+
timestamp: Date.now(),
|
|
301
|
+
source: "runtime",
|
|
302
|
+
category: this.categorizeEvent(type),
|
|
303
|
+
intent: "notification",
|
|
304
|
+
requestId,
|
|
305
|
+
data,
|
|
306
|
+
context: {
|
|
307
|
+
agentId: state.agent.agentId,
|
|
308
|
+
imageId: state.agent.imageId,
|
|
309
|
+
containerId: state.agent.containerId,
|
|
310
|
+
sessionId: state.agent.sessionId
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Categorize event type
|
|
316
|
+
*/
|
|
317
|
+
categorizeEvent(type) {
|
|
318
|
+
if (type.includes("message")) return "message";
|
|
319
|
+
if (type.includes("tool")) return "tool";
|
|
320
|
+
if (type.includes("error") || type.includes("interrupted")) return "error";
|
|
321
|
+
if (type.includes("delta")) return "stream";
|
|
322
|
+
return "stream";
|
|
323
|
+
}
|
|
324
|
+
generateAgentId() {
|
|
325
|
+
const timestamp = Date.now().toString(36);
|
|
326
|
+
const random = Math.random().toString(36).substring(2, 8);
|
|
327
|
+
return `agent_${timestamp}_${random}`;
|
|
328
|
+
}
|
|
329
|
+
generateRequestId() {
|
|
330
|
+
const timestamp = Date.now().toString(36);
|
|
331
|
+
const random = Math.random().toString(36).substring(2, 8);
|
|
332
|
+
return `req_${timestamp}_${random}`;
|
|
333
|
+
}
|
|
334
|
+
generateMessageId() {
|
|
335
|
+
const timestamp = Date.now().toString(36);
|
|
336
|
+
const random = Math.random().toString(36).substring(2, 8);
|
|
337
|
+
return `msg_${timestamp}_${random}`;
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
function createAgentXRuntime(provider) {
|
|
341
|
+
return new AgentXRuntimeImpl(provider);
|
|
342
|
+
}
|
|
343
|
+
export {
|
|
344
|
+
AgentXRuntimeImpl,
|
|
345
|
+
createAgentXRuntime
|
|
346
|
+
};
|
|
347
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/AgentXRuntime.ts"],"sourcesContent":["/**\n * AgentXRuntimeImpl - Runtime integration implementation\n *\n * Integrates all components to provide agent lifecycle management.\n * Uses Provider dependencies to coordinate Session, Image, Container, etc.\n *\n * New Design:\n * - Driver.receive() returns AsyncIterable<DriverStreamEvent>\n * - Runtime processes events and emits to EventBus\n * - No more EventBus-based communication with Driver\n */\n\nimport { createLogger } from \"commonxjs/logger\";\nimport type {\n AgentXProvider,\n AgentXRuntime,\n RuntimeAgent,\n CreateAgentOptions,\n AgentEventHandler,\n Subscription,\n AgentLifecycle,\n} from \"./types\";\nimport type { UserContentPart, UserMessage } from \"../agent/types\";\nimport type { BusEvent } from \"../event/types\";\nimport type { Driver, DriverConfig, DriverStreamEvent } from \"../driver/types\";\n\nconst logger = createLogger(\"runtime/AgentXRuntime\");\n\n/**\n * Internal agent state\n */\ninterface AgentState {\n agent: RuntimeAgent;\n lifecycle: AgentLifecycle;\n subscriptions: Set<() => void>;\n driver: Driver;\n /** Flag to track if a receive operation is in progress */\n isReceiving: boolean;\n}\n\n/**\n * AgentXRuntimeImpl - Runtime implementation\n */\nexport class AgentXRuntimeImpl implements AgentXRuntime {\n readonly provider: AgentXProvider;\n\n private agents = new Map<string, AgentState>();\n private globalSubscriptions = new Set<() => void>();\n private isShutdown = false;\n\n constructor(provider: AgentXProvider) {\n this.provider = provider;\n logger.info(\"AgentXRuntime initialized\");\n }\n\n // ==================== Agent Lifecycle ====================\n\n async createAgent(options: CreateAgentOptions): Promise<RuntimeAgent> {\n if (this.isShutdown) {\n throw new Error(\"Runtime is shutdown\");\n }\n\n const { imageId } = options;\n\n // Load image\n const imageRecord = await this.provider.imageRepository.findImageById(imageId);\n if (!imageRecord) {\n throw new Error(`Image not found: ${imageId}`);\n }\n\n // Generate agent ID\n const agentId = options.agentId ?? this.generateAgentId();\n\n // Ensure container exists\n const containerExists = await this.provider.containerRepository.containerExists(\n imageRecord.containerId\n );\n if (!containerExists) {\n throw new Error(`Container not found: ${imageRecord.containerId}`);\n }\n\n // Create workspace\n const workspace = await this.provider.workspaceProvider.create({\n containerId: imageRecord.containerId,\n imageId,\n });\n await workspace.initialize();\n\n // Create driver config\n const driverConfig: DriverConfig = {\n apiKey: process.env.ANTHROPIC_API_KEY ?? \"\",\n baseUrl: process.env.ANTHROPIC_BASE_URL,\n agentId,\n systemPrompt: imageRecord.systemPrompt,\n cwd: workspace.path,\n mcpServers: imageRecord.mcpServers,\n resumeSessionId: imageRecord.metadata?.claudeSdkSessionId as string | undefined,\n onSessionIdCaptured: async (claudeSdkSessionId: string) => {\n // Persist SDK session ID for resume\n await this.provider.imageRepository.updateMetadata(imageId, { claudeSdkSessionId });\n },\n };\n\n // Create driver using the new CreateDriver function\n const driver = this.provider.createDriver(driverConfig);\n\n // Initialize driver\n await driver.initialize();\n\n // Create runtime agent\n const agent: RuntimeAgent = {\n agentId,\n imageId,\n containerId: imageRecord.containerId,\n sessionId: imageRecord.sessionId,\n name: imageRecord.name,\n lifecycle: \"running\",\n createdAt: Date.now(),\n };\n\n // Store agent state with driver\n const state: AgentState = {\n agent,\n lifecycle: \"running\",\n subscriptions: new Set(),\n driver,\n isReceiving: false,\n };\n this.agents.set(agentId, state);\n\n // Emit agent_created event\n this.provider.eventBus.emit({\n type: \"agent_created\",\n timestamp: Date.now(),\n source: \"runtime\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: {\n agentId,\n imageId,\n containerId: imageRecord.containerId,\n },\n context: {\n agentId,\n imageId,\n containerId: imageRecord.containerId,\n sessionId: imageRecord.sessionId,\n },\n } as BusEvent);\n\n logger.info(\"Agent created\", {\n agentId,\n imageId,\n containerId: imageRecord.containerId,\n });\n\n return agent;\n }\n\n getAgent(agentId: string): RuntimeAgent | undefined {\n const state = this.agents.get(agentId);\n return state?.agent;\n }\n\n getAgents(): RuntimeAgent[] {\n return Array.from(this.agents.values()).map((s) => s.agent);\n }\n\n getAgentsByContainer(containerId: string): RuntimeAgent[] {\n return Array.from(this.agents.values())\n .filter((s) => s.agent.containerId === containerId)\n .map((s) => s.agent);\n }\n\n async stopAgent(agentId: string): Promise<void> {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n if (state.lifecycle === \"destroyed\") {\n throw new Error(`Agent already destroyed: ${agentId}`);\n }\n\n state.lifecycle = \"stopped\";\n\n // Emit agent_stopped event\n this.provider.eventBus.emit({\n type: \"agent_stopped\",\n timestamp: Date.now(),\n source: \"runtime\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: { agentId },\n context: {\n agentId,\n imageId: state.agent.imageId,\n containerId: state.agent.containerId,\n sessionId: state.agent.sessionId,\n },\n } as BusEvent);\n\n logger.info(\"Agent stopped\", { agentId });\n }\n\n async resumeAgent(agentId: string): Promise<void> {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n if (state.lifecycle === \"destroyed\") {\n throw new Error(`Cannot resume destroyed agent: ${agentId}`);\n }\n\n state.lifecycle = \"running\";\n\n // Emit agent_resumed event\n this.provider.eventBus.emit({\n type: \"agent_resumed\",\n timestamp: Date.now(),\n source: \"runtime\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: { agentId },\n context: {\n agentId,\n imageId: state.agent.imageId,\n containerId: state.agent.containerId,\n sessionId: state.agent.sessionId,\n },\n } as BusEvent);\n\n logger.info(\"Agent resumed\", { agentId });\n }\n\n async destroyAgent(agentId: string): Promise<void> {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n // Dispose driver (new interface, no disconnect needed)\n await state.driver.dispose();\n\n // Cleanup subscriptions\n for (const unsub of state.subscriptions) {\n unsub();\n }\n state.subscriptions.clear();\n\n state.lifecycle = \"destroyed\";\n\n // Emit agent_destroyed event\n this.provider.eventBus.emit({\n type: \"agent_destroyed\",\n timestamp: Date.now(),\n source: \"runtime\",\n category: \"lifecycle\",\n intent: \"notification\",\n data: { agentId },\n context: {\n agentId,\n imageId: state.agent.imageId,\n containerId: state.agent.containerId,\n sessionId: state.agent.sessionId,\n },\n } as BusEvent);\n\n // Remove from map\n this.agents.delete(agentId);\n\n logger.info(\"Agent destroyed\", { agentId });\n }\n\n // ==================== Message Handling ====================\n\n async receive(\n agentId: string,\n content: string | UserContentPart[],\n requestId?: string\n ): Promise<void> {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n if (state.lifecycle !== \"running\") {\n throw new Error(`Cannot send message to ${state.lifecycle} agent: ${agentId}`);\n }\n\n if (state.isReceiving) {\n throw new Error(`Agent ${agentId} is already processing a message`);\n }\n\n const actualRequestId = requestId ?? this.generateRequestId();\n\n // Build user message\n const userMessage: UserMessage = {\n id: this.generateMessageId(),\n role: \"user\",\n subtype: \"user\",\n content,\n timestamp: Date.now(),\n };\n\n // Persist to session\n await this.provider.sessionRepository.addMessage(state.agent.sessionId, userMessage);\n\n // Emit user_message event (for external subscribers)\n this.emitEvent(state, \"user_message\", userMessage, actualRequestId);\n\n logger.debug(\"User message sent\", {\n agentId,\n requestId: actualRequestId,\n contentPreview:\n typeof content === \"string\" ? content.substring(0, 50) : `[${content.length} parts]`,\n });\n\n // Mark as receiving\n state.isReceiving = true;\n\n try {\n // Call driver.receive() and process the AsyncIterable\n for await (const event of state.driver.receive(userMessage)) {\n // Convert DriverStreamEvent to BusEvent and emit\n this.handleDriverEvent(state, event, actualRequestId);\n }\n } catch (error) {\n // Emit error event\n this.emitEvent(\n state,\n \"error_received\",\n {\n message: error instanceof Error ? error.message : String(error),\n errorCode: \"runtime_error\",\n },\n actualRequestId\n );\n throw error;\n } finally {\n state.isReceiving = false;\n }\n }\n\n interrupt(agentId: string, requestId?: string): void {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n // Call driver.interrupt() directly\n state.driver.interrupt();\n\n // Emit interrupt event (for external subscribers)\n this.emitEvent(\n state,\n \"interrupt\",\n { agentId },\n requestId ?? this.generateRequestId()\n );\n\n logger.debug(\"Interrupt sent\", { agentId, requestId });\n }\n\n // ==================== Event Subscription ====================\n\n subscribe(agentId: string, handler: AgentEventHandler): Subscription {\n const state = this.agents.get(agentId);\n if (!state) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n const unsub = this.provider.eventBus.onAny((event) => {\n const context = (event as BusEvent & { context?: { agentId?: string } }).context;\n if (context?.agentId === agentId) {\n handler(event);\n }\n });\n\n state.subscriptions.add(unsub);\n\n return {\n unsubscribe: () => {\n unsub();\n state.subscriptions.delete(unsub);\n },\n };\n }\n\n subscribeAll(handler: AgentEventHandler): Subscription {\n const unsub = this.provider.eventBus.onAny(handler);\n this.globalSubscriptions.add(unsub);\n\n return {\n unsubscribe: () => {\n unsub();\n this.globalSubscriptions.delete(unsub);\n },\n };\n }\n\n // ==================== Cleanup ====================\n\n async shutdown(): Promise<void> {\n if (this.isShutdown) return;\n\n logger.info(\"Shutting down AgentXRuntime...\");\n\n // Destroy all agents\n const agentIds = Array.from(this.agents.keys());\n for (const agentId of agentIds) {\n await this.destroyAgent(agentId);\n }\n\n // Cleanup global subscriptions\n for (const unsub of this.globalSubscriptions) {\n unsub();\n }\n this.globalSubscriptions.clear();\n\n this.isShutdown = true;\n logger.info(\"AgentXRuntime shutdown complete\");\n }\n\n // ==================== Private Helpers ====================\n\n /**\n * Handle a single DriverStreamEvent\n */\n private handleDriverEvent(\n state: AgentState,\n event: DriverStreamEvent,\n requestId: string\n ): void {\n // Map DriverStreamEvent to BusEvent and emit\n this.emitEvent(state, event.type, event.data, requestId);\n }\n\n /**\n * Emit an event to the EventBus\n */\n private emitEvent(\n state: AgentState,\n type: string,\n data: unknown,\n requestId: string\n ): void {\n this.provider.eventBus.emit({\n type,\n timestamp: Date.now(),\n source: \"runtime\",\n category: this.categorizeEvent(type),\n intent: \"notification\",\n requestId,\n data,\n context: {\n agentId: state.agent.agentId,\n imageId: state.agent.imageId,\n containerId: state.agent.containerId,\n sessionId: state.agent.sessionId,\n },\n } as BusEvent);\n }\n\n /**\n * Categorize event type\n */\n private categorizeEvent(type: string): string {\n if (type.includes(\"message\")) return \"message\";\n if (type.includes(\"tool\")) return \"tool\";\n if (type.includes(\"error\") || type.includes(\"interrupted\")) return \"error\";\n if (type.includes(\"delta\")) return \"stream\";\n return \"stream\";\n }\n\n private generateAgentId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `agent_${timestamp}_${random}`;\n }\n\n private generateRequestId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `req_${timestamp}_${random}`;\n }\n\n private generateMessageId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `msg_${timestamp}_${random}`;\n }\n}\n\n/**\n * Create an AgentXRuntime instance\n */\nexport function createAgentXRuntime(provider: AgentXProvider): AgentXRuntime {\n return new AgentXRuntimeImpl(provider);\n}\n"],"mappings":"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","names":[]}
|