@agentxjs/core 1.9.9-dev → 2.0.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 (99) hide show
  1. package/README.md +342 -0
  2. package/dist/RpcClient-BcJ_zAGu.d.ts +304 -0
  3. package/dist/agent/engine/internal/index.d.ts +20 -15
  4. package/dist/agent/engine/internal/index.js +1 -2
  5. package/dist/agent/engine/mealy/index.js +0 -1
  6. package/dist/agent/index.d.ts +4 -4
  7. package/dist/agent/index.js +6 -6
  8. package/dist/agent/types/index.d.ts +4 -4
  9. package/dist/agent/types/index.js +1 -2
  10. package/dist/bash/index.d.ts +29 -0
  11. package/dist/bash/index.js +7 -0
  12. package/dist/{bus-uF1DM2ox.d.ts → bus-C9FLWIu8.d.ts} +3 -1
  13. package/dist/{chunk-K6WXQ2RW.js → chunk-23UUBQXR.js} +1 -2
  14. package/dist/chunk-23UUBQXR.js.map +1 -0
  15. package/dist/chunk-BHOD5PKR.js +55 -0
  16. package/dist/chunk-BHOD5PKR.js.map +1 -0
  17. package/dist/{chunk-I7GYR3MN.js → chunk-DEAR6N3O.js} +77 -91
  18. package/dist/chunk-DEAR6N3O.js.map +1 -0
  19. package/dist/chunk-FI7WQFGV.js +37 -0
  20. package/dist/chunk-FI7WQFGV.js.map +1 -0
  21. package/dist/{chunk-TBU7FFZT.js → chunk-JTKCV7IS.js} +4 -4
  22. package/dist/chunk-JTKCV7IS.js.map +1 -0
  23. package/dist/{chunk-E5FPOAPO.js → chunk-LTVNPHST.js} +1 -1
  24. package/dist/chunk-LTVNPHST.js.map +1 -0
  25. package/dist/chunk-SKS7S2RY.js +1 -0
  26. package/dist/common/logger/index.js +0 -2
  27. package/dist/common/logger/index.js.map +1 -1
  28. package/dist/container/index.d.ts +3 -4
  29. package/dist/container/index.js +0 -2
  30. package/dist/container/index.js.map +1 -1
  31. package/dist/driver/index.d.ts +2 -310
  32. package/dist/event/index.d.ts +4 -4
  33. package/dist/event/index.js +1 -2
  34. package/dist/event/types/index.d.ts +4 -10
  35. package/dist/event/types/index.js +1 -2
  36. package/dist/{event-CDuTzs__.d.ts → event-DNWOBSBO.d.ts} +3 -4
  37. package/dist/image/index.d.ts +9 -5
  38. package/dist/image/index.js +5 -2
  39. package/dist/image/index.js.map +1 -1
  40. package/dist/index-CuS1i5V-.d.ts +609 -0
  41. package/dist/index.d.ts +2 -2
  42. package/dist/index.js +6 -6
  43. package/dist/{message-BMrMm1pq.d.ts → message-03TJzvIX.d.ts} +10 -33
  44. package/dist/mq/index.js +0 -2
  45. package/dist/mq/index.js.map +1 -1
  46. package/dist/network/index.d.ts +3 -291
  47. package/dist/network/index.js +3 -14
  48. package/dist/network/index.js.map +1 -1
  49. package/dist/persistence/index.d.ts +2 -155
  50. package/dist/platform/index.d.ts +76 -0
  51. package/dist/platform/index.js.map +1 -0
  52. package/dist/runtime/index.d.ts +26 -59
  53. package/dist/runtime/index.js +117 -33
  54. package/dist/runtime/index.js.map +1 -1
  55. package/dist/session/index.d.ts +4 -52
  56. package/dist/session/index.js +4 -51
  57. package/dist/session/index.js.map +1 -1
  58. package/dist/types-aE74Eo6G.d.ts +90 -0
  59. package/package.json +10 -5
  60. package/src/agent/__tests__/engine/internal/messageAssemblerProcessor.test.ts +291 -87
  61. package/src/agent/__tests__/engine/internal/turnTrackerProcessor.test.ts +56 -75
  62. package/src/agent/engine/MealyMachine.ts +1 -1
  63. package/src/agent/engine/internal/messageAssemblerProcessor.ts +99 -114
  64. package/src/agent/engine/internal/turnTrackerProcessor.ts +23 -27
  65. package/src/agent/types/event.ts +0 -4
  66. package/src/agent/types/index.ts +1 -3
  67. package/src/agent/types/message.ts +9 -43
  68. package/src/bash/index.ts +21 -0
  69. package/src/bash/tool.ts +57 -0
  70. package/src/bash/types.ts +108 -0
  71. package/src/driver/index.ts +1 -0
  72. package/src/driver/types.ts +122 -4
  73. package/src/event/__tests__/EventBus.test.ts +1 -1
  74. package/src/event/types/agent.ts +0 -11
  75. package/src/event/types/command.ts +3 -1
  76. package/src/image/Image.ts +11 -1
  77. package/src/image/types.ts +8 -2
  78. package/src/network/RpcClient.ts +21 -20
  79. package/src/network/index.ts +1 -1
  80. package/src/persistence/types.ts +5 -2
  81. package/src/platform/index.ts +21 -0
  82. package/src/platform/types.ts +84 -0
  83. package/src/runtime/AgentXRuntime.ts +184 -57
  84. package/src/runtime/__tests__/AgentXRuntime.test.ts +343 -0
  85. package/src/runtime/index.ts +7 -19
  86. package/src/runtime/types.ts +10 -62
  87. package/dist/chunk-7D4SUZUM.js +0 -38
  88. package/dist/chunk-E5FPOAPO.js.map +0 -1
  89. package/dist/chunk-I7GYR3MN.js.map +0 -1
  90. package/dist/chunk-K6WXQ2RW.js.map +0 -1
  91. package/dist/chunk-TBU7FFZT.js.map +0 -1
  92. package/dist/workspace/index.d.ts +0 -111
  93. package/dist/wrapper-Y3UTVU2E.js +0 -3635
  94. package/dist/wrapper-Y3UTVU2E.js.map +0 -1
  95. package/src/workspace/index.ts +0 -27
  96. package/src/workspace/types.ts +0 -131
  97. /package/dist/{workspace → bash}/index.js.map +0 -0
  98. /package/dist/{chunk-7D4SUZUM.js.map → chunk-SKS7S2RY.js.map} +0 -0
  99. /package/dist/{workspace → platform}/index.js +0 -0
@@ -2,11 +2,11 @@
2
2
  * turnTrackerProcessor
3
3
  *
4
4
  * Pure Mealy transition function that tracks request-response turn pairs.
5
+ * Derives turn events entirely from stream-layer events (no external injection).
5
6
  *
6
- * Input Events:
7
- * - user_message (Message Layer)
8
- * - message_stop (Stream Layer - contains stop reason)
9
- * - assistant_message (Message Layer)
7
+ * Input Events (Stream Layer):
8
+ * - message_start → emit turn_request (a new turn begins)
9
+ * - message_stop emit turn_response (turn completes, based on stop reason)
10
10
  *
11
11
  * Output Events (Turn Layer):
12
12
  * - turn_request
@@ -15,11 +15,9 @@
15
15
 
16
16
  import type { Processor, ProcessorDefinition } from "../mealy";
17
17
  import type {
18
- // Input: combined stream and message events
19
18
  StreamEvent,
20
- AgentMessageEvent,
19
+ MessageStartEvent,
21
20
  MessageStopEvent,
22
- UserMessageEvent,
23
21
  // Output: Turn events
24
22
  TurnRequestEvent,
25
23
  TurnResponseEvent,
@@ -88,9 +86,9 @@ export type TurnTrackerOutput = TurnRequestEvent | TurnResponseEvent;
88
86
 
89
87
  /**
90
88
  * Input event types for TurnTracker
91
- * Accepts both Stream and Message layer events
89
+ * Only stream-layer events turn events are derived, not injected.
92
90
  */
93
- export type TurnTrackerInput = StreamEvent | AgentMessageEvent;
91
+ export type TurnTrackerInput = StreamEvent;
94
92
 
95
93
  /**
96
94
  * turnTrackerProcessor
@@ -104,39 +102,37 @@ export const turnTrackerProcessor: Processor<
104
102
  TurnTrackerOutput
105
103
  > = (state, input): [TurnTrackerState, TurnTrackerOutput[]] => {
106
104
  switch (input.type) {
107
- case "user_message":
108
- return handleUserMessage(state, input as AgentMessageEvent);
105
+ case "message_start":
106
+ return handleMessageStart(state, input as MessageStartEvent);
109
107
 
110
108
  case "message_stop":
111
109
  return handleMessageStop(state, input as StreamEvent);
112
110
 
113
- case "assistant_message":
114
- // Turn completion is handled in message_stop
115
- // This handler is kept for potential future use
116
- return [state, []];
117
-
118
111
  default:
119
112
  return [state, []];
120
113
  }
121
114
  };
122
115
 
123
116
  /**
124
- * Handle user_message event
117
+ * Handle message_start event — a new turn begins
125
118
  */
126
- function handleUserMessage(
119
+ function handleMessageStart(
127
120
  state: Readonly<TurnTrackerState>,
128
- event: AgentMessageEvent
121
+ event: MessageStartEvent
129
122
  ): [TurnTrackerState, TurnTrackerOutput[]] {
130
- const { data } = event as UserMessageEvent;
131
- const turnId = generateId();
123
+ // If there's already a pending turn (e.g. tool_use didn't end the turn),
124
+ // don't start a new one
125
+ if (state.pendingTurn) {
126
+ return [state, []];
127
+ }
132
128
 
133
- // Extract content as string (UserMessage.content can be string or array)
134
- const contentText = typeof data.content === "string" ? data.content : "";
129
+ const turnId = generateId();
130
+ const messageId = event.data.messageId ?? "";
135
131
 
136
132
  const pendingTurn: PendingTurn = {
137
133
  turnId,
138
- messageId: data.id,
139
- content: contentText,
134
+ messageId,
135
+ content: "",
140
136
  requestedAt: event.timestamp,
141
137
  };
142
138
 
@@ -145,8 +141,8 @@ function handleUserMessage(
145
141
  timestamp: Date.now(),
146
142
  data: {
147
143
  turnId,
148
- messageId: data.id,
149
- content: contentText,
144
+ messageId,
145
+ content: "",
150
146
  timestamp: event.timestamp,
151
147
  },
152
148
  };
@@ -15,7 +15,6 @@
15
15
  import type {
16
16
  UserMessage,
17
17
  AssistantMessage,
18
- ToolCallMessage,
19
18
  ToolResultMessage,
20
19
  ErrorMessage,
21
20
  TokenUsage,
@@ -368,7 +367,6 @@ export interface MessageEvent<T extends string = string, D = unknown> extends En
368
367
 
369
368
  export type UserMessageEvent = EngineEvent<"user_message", UserMessage>;
370
369
  export type AssistantMessageEvent = EngineEvent<"assistant_message", AssistantMessage>;
371
- export type ToolCallMessageEvent = EngineEvent<"tool_call_message", ToolCallMessage>;
372
370
  export type ToolResultMessageEvent = EngineEvent<"tool_result_message", ToolResultMessage>;
373
371
  export type ErrorMessageEvent = EngineEvent<"error_message", ErrorMessage>;
374
372
 
@@ -378,7 +376,6 @@ export type ErrorMessageEvent = EngineEvent<"error_message", ErrorMessage>;
378
376
  export type AgentMessageEvent =
379
377
  | UserMessageEvent
380
378
  | AssistantMessageEvent
381
- | ToolCallMessageEvent
382
379
  | ToolResultMessageEvent
383
380
  | ErrorMessageEvent;
384
381
 
@@ -389,7 +386,6 @@ export function isMessageEvent(event: EngineEvent): event is AgentMessageEvent {
389
386
  const messageTypes = [
390
387
  "user_message",
391
388
  "assistant_message",
392
- "tool_call_message",
393
389
  "tool_result_message",
394
390
  "error_message",
395
391
  ];
@@ -48,7 +48,7 @@
48
48
  * ## Message Types (Three-Party Model)
49
49
  *
50
50
  * - **User**: Human participant (UserMessage)
51
- * - **Assistant**: AI participant (AssistantMessage, ToolCallMessage)
51
+ * - **Assistant**: AI participant (AssistantMessage — content includes ToolCallPart)
52
52
  * - **Tool**: Computer/execution environment (ToolResultMessage)
53
53
  *
54
54
  * @packageDocumentation
@@ -75,7 +75,6 @@ export type {
75
75
  TokenUsage,
76
76
  UserMessage,
77
77
  AssistantMessage,
78
- ToolCallMessage,
79
78
  ToolResultMessage,
80
79
  ErrorMessage,
81
80
  Message,
@@ -145,7 +144,6 @@ export type {
145
144
  MessageEvent,
146
145
  UserMessageEvent,
147
146
  AssistantMessageEvent,
148
- ToolCallMessageEvent,
149
147
  ToolResultMessageEvent,
150
148
  ErrorMessageEvent,
151
149
  AgentMessageEvent,
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * This file defines:
5
5
  * - Content Parts: TextPart, ThinkingPart, ImagePart, FilePart, ToolCallPart, ToolResultPart
6
- * - Message Types: UserMessage, AssistantMessage, ToolCallMessage, ToolResultMessage, ErrorMessage
6
+ * - Message Types: UserMessage, AssistantMessage, ToolResultMessage, ErrorMessage
7
7
  * - Message Role and Subtype discriminators
8
8
  *
9
9
  * @packageDocumentation
@@ -215,7 +215,7 @@ export type MessageRole = "user" | "assistant" | "tool" | "system" | "error";
215
215
  * Represents the specific type/category of the message.
216
216
  * Used together with role for serialization and type discrimination.
217
217
  */
218
- export type MessageSubtype = "user" | "assistant" | "tool-call" | "tool-result" | "error";
218
+ export type MessageSubtype = "user" | "assistant" | "tool-result" | "error";
219
219
 
220
220
  /**
221
221
  * Token usage information
@@ -256,9 +256,9 @@ export interface UserMessage {
256
256
  * Assistant Message
257
257
  *
258
258
  * Message generated by the AI assistant.
259
- * Contains text, thinking process, or files.
260
- *
261
- * Note: Tool calls are separate - use ToolCallMessage for tool invocations.
259
+ * Contains text, thinking process, files, and tool calls.
260
+ * Tool calls are content blocks within the assistant message,
261
+ * matching the mainstream API pattern (Anthropic, OpenAI).
262
262
  */
263
263
  export interface AssistantMessage {
264
264
  /** Unique identifier */
@@ -270,8 +270,8 @@ export interface AssistantMessage {
270
270
  /** Message subtype for serialization */
271
271
  subtype: "assistant";
272
272
 
273
- /** Message content - can be simple string or array of parts */
274
- content: string | Array<TextPart | ThinkingPart | FilePart>;
273
+ /** Message content - can be simple string or array of parts (including tool calls) */
274
+ content: string | Array<TextPart | ThinkingPart | FilePart | ToolCallPart>;
275
275
 
276
276
  /** When this message was created (Unix timestamp in milliseconds) */
277
277
  timestamp: number;
@@ -283,35 +283,6 @@ export interface AssistantMessage {
283
283
  usage?: TokenUsage;
284
284
  }
285
285
 
286
- /**
287
- * Tool Call Message
288
- *
289
- * Represents AI's request to invoke a tool.
290
- * Emitted when tool call parameters are fully assembled.
291
- *
292
- * Subject: Assistant (AI decided to call a tool)
293
- * Timing: At tool_use_content_block_stop
294
- */
295
- export interface ToolCallMessage {
296
- /** Unique message identifier */
297
- id: string;
298
-
299
- /** Message role - assistant initiates tool calls */
300
- role: "assistant";
301
-
302
- /** Message subtype for serialization */
303
- subtype: "tool-call";
304
-
305
- /** Tool call details */
306
- toolCall: ToolCallPart;
307
-
308
- /** When this message was created (Unix timestamp in milliseconds) */
309
- timestamp: number;
310
-
311
- /** Parent message ID (the assistant message that triggered this) */
312
- parentId?: string;
313
- }
314
-
315
286
  /**
316
287
  * Tool Result Message
317
288
  *
@@ -377,11 +348,6 @@ export interface ErrorMessage {
377
348
  * Use `subtype` field for precise type discrimination.
378
349
  *
379
350
  * Role: Who sent it (user, assistant, tool, system, error)
380
- * Subtype: What type of message (user, assistant, tool-call, tool-result, error)
351
+ * Subtype: What type of message (user, assistant, tool-result, error)
381
352
  */
382
- export type Message =
383
- | UserMessage
384
- | AssistantMessage
385
- | ToolCallMessage
386
- | ToolResultMessage
387
- | ErrorMessage;
353
+ export type Message = UserMessage | AssistantMessage | ToolResultMessage | ErrorMessage;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Bash Module
3
+ *
4
+ * Abstraction for command execution capability.
5
+ * Platform packages provide concrete implementations.
6
+ *
7
+ * Usage:
8
+ * ```typescript
9
+ * import type { BashProvider, BashResult } from "@agentxjs/core/bash";
10
+ *
11
+ * // Platform provides implementation
12
+ * const bash: BashProvider = platform.bashProvider;
13
+ *
14
+ * const result = await bash.execute("echo hello", { cwd: "/tmp" });
15
+ * console.log(result.stdout); // "hello\n"
16
+ * console.log(result.exitCode); // 0
17
+ * ```
18
+ */
19
+
20
+ export type { BashProvider, BashResult, BashOptions } from "./types";
21
+ export { createBashTool } from "./tool";
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Bash Tool Definition
3
+ *
4
+ * Creates a ToolDefinition that wraps a BashProvider.
5
+ * The tool schema is sent to the LLM, the execute function
6
+ * delegates to the platform-provided BashProvider via closure.
7
+ */
8
+
9
+ import type { ToolDefinition } from "../driver/types";
10
+ import type { BashProvider } from "./types";
11
+
12
+ /**
13
+ * Create a bash ToolDefinition from a BashProvider
14
+ *
15
+ * @param provider - Platform-provided BashProvider
16
+ * @returns ToolDefinition ready for DriverConfig.tools
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * if (platform.bashProvider) {
21
+ * tools.push(createBashTool(platform.bashProvider));
22
+ * }
23
+ * ```
24
+ */
25
+ export function createBashTool(provider: BashProvider): ToolDefinition {
26
+ return {
27
+ name: "bash",
28
+ description:
29
+ "Execute a shell command and return stdout, stderr, and exit code. " +
30
+ "Use this for running CLI tools, scripts, file operations, etc.",
31
+ parameters: {
32
+ type: "object",
33
+ properties: {
34
+ command: {
35
+ type: "string",
36
+ description: "Shell command to execute (e.g. 'ls -la', 'cat file.txt')",
37
+ },
38
+ cwd: {
39
+ type: "string",
40
+ description: "Working directory for the command (optional)",
41
+ },
42
+ timeout: {
43
+ type: "number",
44
+ description: "Timeout in milliseconds (optional, default 30000)",
45
+ },
46
+ },
47
+ required: ["command"],
48
+ },
49
+ execute: async (params) => {
50
+ const result = await provider.execute(params.command as string, {
51
+ cwd: params.cwd as string | undefined,
52
+ timeout: params.timeout as number | undefined,
53
+ });
54
+ return result;
55
+ },
56
+ };
57
+ }
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Bash Types
3
+ *
4
+ * Abstraction for command execution capability.
5
+ * Different platforms provide different implementations:
6
+ * - Node.js: child_process based
7
+ * - Docker: Container exec
8
+ * - Sandbox: Isolated environment
9
+ *
10
+ * ```
11
+ * ┌─────────────────────────────────────────────────────┐
12
+ * │ core/bash │
13
+ * │ ┌─────────────────────────────────────────────────┐│
14
+ * │ │ BashProvider (interface) ││
15
+ * │ │ BashResult (interface) ││
16
+ * │ │ BashOptions (interface) ││
17
+ * │ └─────────────────────────────────────────────────┘│
18
+ * └─────────────────────────────────────────────────────┘
19
+ * │
20
+ * ┌────────────────┼────────────────┐
21
+ * ▼ ▼ ▼
22
+ * ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
23
+ * │ platform-node│ │platform-docker│ │platform-sandbox│
24
+ * │ ChildProcess │ │ ContainerExec│ │ SandboxExec │
25
+ * └──────────────┘ └──────────────┘ └──────────────┘
26
+ * ```
27
+ */
28
+
29
+ // ============================================================================
30
+ // Bash Result
31
+ // ============================================================================
32
+
33
+ /**
34
+ * BashResult - Output from a command execution
35
+ */
36
+ export interface BashResult {
37
+ /**
38
+ * Standard output
39
+ */
40
+ stdout: string;
41
+
42
+ /**
43
+ * Standard error
44
+ */
45
+ stderr: string;
46
+
47
+ /**
48
+ * Process exit code (0 = success)
49
+ */
50
+ exitCode: number;
51
+ }
52
+
53
+ // ============================================================================
54
+ // Bash Options
55
+ // ============================================================================
56
+
57
+ /**
58
+ * BashOptions - Configuration for a single command execution
59
+ */
60
+ export interface BashOptions {
61
+ /**
62
+ * Working directory for the command
63
+ */
64
+ cwd?: string;
65
+
66
+ /**
67
+ * Timeout in milliseconds
68
+ */
69
+ timeout?: number;
70
+
71
+ /**
72
+ * Environment variables
73
+ */
74
+ env?: Record<string, string>;
75
+ }
76
+
77
+ // ============================================================================
78
+ // Bash Provider
79
+ // ============================================================================
80
+
81
+ /**
82
+ * BashProvider - Abstraction for command execution
83
+ *
84
+ * Platform implementations provide this interface.
85
+ * The provider is stateless — each execute() call is independent.
86
+ *
87
+ * @example
88
+ * ```typescript
89
+ * const result = await provider.execute("ls -la", { cwd: "/tmp" });
90
+ * console.log(result.stdout);
91
+ * console.log(result.exitCode); // 0
92
+ * ```
93
+ */
94
+ export interface BashProvider {
95
+ /**
96
+ * Provider type (e.g., "child-process", "docker", "sandbox")
97
+ */
98
+ readonly type: string;
99
+
100
+ /**
101
+ * Execute a shell command
102
+ *
103
+ * @param command - Shell command to execute
104
+ * @param options - Execution options
105
+ * @returns Command output and exit code
106
+ */
107
+ execute(command: string, options?: BashOptions): Promise<BashResult>;
108
+ }
@@ -18,6 +18,7 @@
18
18
  export type {
19
19
  // Configuration
20
20
  McpServerConfig,
21
+ ToolDefinition,
21
22
  DriverConfig,
22
23
  DriverState,
23
24
 
@@ -31,17 +31,72 @@
31
31
  */
32
32
 
33
33
  import type { UserMessage } from "../agent/types/message";
34
+ import type { Session } from "../session/types";
34
35
 
35
36
  // ============================================================================
36
- // MCP Server Configuration
37
+ // Tool Definition
37
38
  // ============================================================================
38
39
 
39
40
  /**
40
- * MCP Server configuration
41
+ * ToolDefinition - Defines a tool for LLM tool calling
42
+ *
43
+ * Tools are injected into the Driver via DriverConfig.tools.
44
+ * The Driver passes tool schemas to the LLM and executes handlers
45
+ * when the LLM requests a tool call.
41
46
  *
42
- * Defines how to launch an MCP server process.
47
+ * @example
48
+ * ```typescript
49
+ * const calculator: ToolDefinition = {
50
+ * name: "calculator",
51
+ * description: "Evaluates a math expression",
52
+ * parameters: {
53
+ * type: "object",
54
+ * properties: {
55
+ * expression: { type: "string", description: "e.g. '123 * 456'" },
56
+ * },
57
+ * required: ["expression"],
58
+ * },
59
+ * execute: async (params) => {
60
+ * const result = Function(`"use strict"; return (${params.expression})`)();
61
+ * return { result: String(result) };
62
+ * },
63
+ * };
64
+ * ```
43
65
  */
44
- export interface McpServerConfig {
66
+ export interface ToolDefinition {
67
+ /**
68
+ * Tool name (unique identifier)
69
+ */
70
+ name: string;
71
+
72
+ /**
73
+ * Description of what the tool does (sent to LLM)
74
+ */
75
+ description?: string;
76
+
77
+ /**
78
+ * JSON Schema for the tool's input parameters
79
+ */
80
+ parameters: {
81
+ type: "object";
82
+ properties: Record<string, unknown>;
83
+ required?: string[];
84
+ };
85
+
86
+ /**
87
+ * Function to execute when the LLM calls this tool
88
+ */
89
+ execute: (params: Record<string, unknown>) => Promise<unknown>;
90
+ }
91
+
92
+ // ============================================================================
93
+ // MCP Server Configuration
94
+ // ============================================================================
95
+
96
+ /**
97
+ * Stdio transport — launches a local MCP server as a child process.
98
+ */
99
+ export interface McpStdioServerConfig {
45
100
  /**
46
101
  * Command to run the MCP server
47
102
  */
@@ -58,6 +113,34 @@ export interface McpServerConfig {
58
113
  env?: Record<string, string>;
59
114
  }
60
115
 
116
+ /**
117
+ * HTTP Streamable transport — connects to a remote MCP server over HTTP.
118
+ */
119
+ export interface McpHttpServerConfig {
120
+ /**
121
+ * Transport type discriminator
122
+ */
123
+ type: "http";
124
+
125
+ /**
126
+ * URL of the remote MCP server
127
+ */
128
+ url: string;
129
+
130
+ /**
131
+ * Additional HTTP headers (e.g. Authorization)
132
+ */
133
+ headers?: Record<string, string>;
134
+ }
135
+
136
+ /**
137
+ * MCP Server configuration.
138
+ *
139
+ * - Stdio: `{ command, args?, env? }` — local subprocess
140
+ * - HTTP: `{ transport: "http", url, headers? }` — remote server
141
+ */
142
+ export type McpServerConfig = McpStdioServerConfig | McpHttpServerConfig;
143
+
61
144
  // ============================================================================
62
145
  // Stream Event (Lightweight)
63
146
  // ============================================================================
@@ -150,6 +233,16 @@ export interface ErrorEvent extends StreamEvent<
150
233
  }
151
234
  > {}
152
235
 
236
+ export interface MessageDeltaEvent extends StreamEvent<
237
+ "message_delta",
238
+ {
239
+ usage?: {
240
+ inputTokens: number;
241
+ outputTokens: number;
242
+ };
243
+ }
244
+ > {}
245
+
153
246
  export interface InterruptedEvent extends StreamEvent<
154
247
  "interrupted",
155
248
  {
@@ -162,6 +255,7 @@ export interface InterruptedEvent extends StreamEvent<
162
255
  */
163
256
  export type DriverStreamEvent =
164
257
  | MessageStartEvent
258
+ | MessageDeltaEvent
165
259
  | MessageStopEvent
166
260
  | TextDeltaEvent
167
261
  | ToolUseStartEvent
@@ -252,8 +346,32 @@ export interface DriverConfig<TOptions = Record<string, unknown>> {
252
346
  */
253
347
  mcpServers?: Record<string, McpServerConfig>;
254
348
 
349
+ /**
350
+ * Tool definitions for LLM tool calling
351
+ *
352
+ * Tools are passed to the LLM provider and executed when the LLM
353
+ * requests a tool call. Each tool includes its JSON Schema (sent to
354
+ * the LLM) and an execute function (called at runtime).
355
+ */
356
+ tools?: ToolDefinition[];
357
+
255
358
  // === Session Configuration ===
256
359
 
360
+ /**
361
+ * Session for message history access
362
+ *
363
+ * Stateless drivers (like MonoDriver) use this to read conversation history.
364
+ * Stateful drivers (like ClaudeDriver) may ignore this as they manage
365
+ * history internally via SDK.
366
+ *
367
+ * @example
368
+ * ```typescript
369
+ * // MonoDriver reads history from Session
370
+ * const history = await config.session?.getMessages();
371
+ * ```
372
+ */
373
+ session?: Session;
374
+
257
375
  /**
258
376
  * Session ID to resume (for conversation continuity)
259
377
  *
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  import { describe, it, expect, beforeEach } from "bun:test";
6
- import { EventBus } from "../EventBus";
6
+ import { EventBusImpl as EventBus } from "../EventBus";
7
7
  import type { BusEvent } from "../types";
8
8
 
9
9
  // Test event factory
@@ -7,7 +7,6 @@
7
7
  import type {
8
8
  UserMessage,
9
9
  AssistantMessage,
10
- ToolCallMessage,
11
10
  ToolResultMessage,
12
11
  ErrorMessage,
13
12
  } from "../../agent/types";
@@ -376,15 +375,6 @@ export interface AssistantMessageEvent extends AgentMessageEventBase<
376
375
  AssistantMessage
377
376
  > {}
378
377
 
379
- /**
380
- * ToolCallMessageEvent - Tool call message (part of assistant turn)
381
- * Data: Complete ToolCallMessage object
382
- */
383
- export interface ToolCallMessageEvent extends AgentMessageEventBase<
384
- "tool_call_message",
385
- ToolCallMessage
386
- > {}
387
-
388
378
  /**
389
379
  * ToolResultMessageEvent - Tool result message
390
380
  * Data: Complete ToolResultMessage object
@@ -409,7 +399,6 @@ export interface ErrorMessageEvent extends AgentMessageEventBase<"error_message"
409
399
  export type AgentMessageEvent =
410
400
  | UserMessageEvent
411
401
  | AssistantMessageEvent
412
- | ToolCallMessageEvent
413
402
  | ToolResultMessageEvent
414
403
  | ErrorMessageEvent;
415
404
 
@@ -87,7 +87,7 @@ export interface McpServerConfig {
87
87
  * Image metadata for storing provider-specific data
88
88
  */
89
89
  export interface ImageMetadata {
90
- claudeSdkSessionId?: string;
90
+ driverSessionId?: string;
91
91
  }
92
92
 
93
93
  /**
@@ -373,6 +373,7 @@ export interface ImageCreateRequest extends BaseCommandRequest<
373
373
  name?: string;
374
374
  description?: string;
375
375
  systemPrompt?: string;
376
+ customData?: Record<string, unknown>;
376
377
  };
377
378
  }
378
379
  > {}
@@ -446,6 +447,7 @@ export interface ImageUpdateRequest extends BaseCommandRequest<
446
447
  updates: {
447
448
  name?: string;
448
449
  description?: string;
450
+ customData?: Record<string, unknown>;
449
451
  };
450
452
  }
451
453
  > {}