@agentxjs/core 1.9.10-dev → 2.0.1

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 (142) hide show
  1. package/README.md +342 -0
  2. package/dist/{Processor-DT0N1qI6.d.ts → Processor-CeMyXtsX.d.ts} +1 -1
  3. package/dist/RpcClient-CMdhJxjS.d.ts +304 -0
  4. package/dist/agent/engine/internal/index.d.ts +22 -18
  5. package/dist/agent/engine/internal/index.js +1 -2
  6. package/dist/agent/engine/mealy/index.d.ts +4 -4
  7. package/dist/agent/engine/mealy/index.js +1 -2
  8. package/dist/agent/index.d.ts +92 -92
  9. package/dist/agent/index.js +16 -16
  10. package/dist/agent/types/index.d.ts +4 -4
  11. package/dist/agent/types/index.js +1 -2
  12. package/dist/bash/index.d.ts +29 -0
  13. package/dist/bash/index.js +7 -0
  14. package/dist/{bus-uF1DM2ox.d.ts → bus-C9FLWIu8.d.ts} +3 -1
  15. package/dist/{chunk-E5FPOAPO.js → chunk-22NTRYNO.js} +60 -60
  16. package/dist/chunk-22NTRYNO.js.map +1 -0
  17. package/dist/{chunk-7ZDX3O6I.js → chunk-AAFPAF67.js} +2 -2
  18. package/dist/{chunk-7ZDX3O6I.js.map → chunk-AAFPAF67.js.map} +1 -1
  19. package/dist/{chunk-EKHT54KN.js → chunk-APCBNCOW.js} +1 -1
  20. package/dist/{chunk-EKHT54KN.js.map → chunk-APCBNCOW.js.map} +1 -1
  21. package/dist/chunk-BHOD5PKR.js +55 -0
  22. package/dist/chunk-BHOD5PKR.js.map +1 -0
  23. package/dist/chunk-FI7WQFGV.js +37 -0
  24. package/dist/chunk-FI7WQFGV.js.map +1 -0
  25. package/dist/{chunk-AT5P47YA.js → chunk-RWIYC65R.js} +115 -115
  26. package/dist/chunk-RWIYC65R.js.map +1 -0
  27. package/dist/chunk-SKS7S2RY.js +1 -0
  28. package/dist/{chunk-I7GYR3MN.js → chunk-TUFZ2YH6.js} +77 -91
  29. package/dist/chunk-TUFZ2YH6.js.map +1 -0
  30. package/dist/{chunk-K6WXQ2RW.js → chunk-YSZG6XIM.js} +1 -2
  31. package/dist/chunk-YSZG6XIM.js.map +1 -0
  32. package/dist/{combinators-nEa5dD0T.d.ts → combinators-Dy-7lxKV.d.ts} +50 -50
  33. package/dist/common/logger/index.js +14 -16
  34. package/dist/common/logger/index.js.map +1 -1
  35. package/dist/container/index.d.ts +3 -4
  36. package/dist/container/index.js +0 -2
  37. package/dist/container/index.js.map +1 -1
  38. package/dist/driver/index.d.ts +2 -310
  39. package/dist/event/index.d.ts +4 -4
  40. package/dist/event/index.js +2 -3
  41. package/dist/event/types/index.d.ts +202 -208
  42. package/dist/event/types/index.js +1 -2
  43. package/dist/{event-CDuTzs__.d.ts → event-DNsF9EkO.d.ts} +5 -8
  44. package/dist/image/index.d.ts +9 -5
  45. package/dist/image/index.js +5 -2
  46. package/dist/image/index.js.map +1 -1
  47. package/dist/index--gxNpY5W.d.ts +609 -0
  48. package/dist/index.d.ts +4 -4
  49. package/dist/index.js +17 -17
  50. package/dist/{message-BMrMm1pq.d.ts → message-Dn-I2vr0.d.ts} +10 -33
  51. package/dist/mq/index.d.ts +25 -25
  52. package/dist/mq/index.js +1 -3
  53. package/dist/mq/index.js.map +1 -1
  54. package/dist/network/index.d.ts +59 -347
  55. package/dist/network/index.js +30 -41
  56. package/dist/network/index.js.map +1 -1
  57. package/dist/persistence/index.d.ts +2 -155
  58. package/dist/platform/index.d.ts +76 -0
  59. package/dist/platform/index.js.map +1 -0
  60. package/dist/runtime/index.d.ts +26 -59
  61. package/dist/runtime/index.js +117 -33
  62. package/dist/runtime/index.js.map +1 -1
  63. package/dist/session/index.d.ts +4 -52
  64. package/dist/session/index.js +4 -51
  65. package/dist/session/index.js.map +1 -1
  66. package/dist/types-Cb8tKM6Y.d.ts +90 -0
  67. package/package.json +10 -5
  68. package/src/agent/AgentStateMachine.ts +2 -2
  69. package/src/agent/__tests__/AgentStateMachine.test.ts +2 -2
  70. package/src/agent/__tests__/createAgent.test.ts +4 -4
  71. package/src/agent/__tests__/engine/internal/messageAssemblerProcessor.test.ts +301 -97
  72. package/src/agent/__tests__/engine/internal/stateEventProcessor.test.ts +6 -6
  73. package/src/agent/__tests__/engine/internal/turnTrackerProcessor.test.ts +59 -78
  74. package/src/agent/__tests__/engine/mealy/Mealy.test.ts +3 -3
  75. package/src/agent/__tests__/engine/mealy/Store.test.ts +1 -1
  76. package/src/agent/__tests__/engine/mealy/combinators.test.ts +4 -4
  77. package/src/agent/createAgent.ts +15 -15
  78. package/src/agent/engine/AgentProcessor.ts +7 -7
  79. package/src/agent/engine/MealyMachine.ts +4 -4
  80. package/src/agent/engine/internal/index.ts +11 -11
  81. package/src/agent/engine/internal/messageAssemblerProcessor.ts +113 -128
  82. package/src/agent/engine/internal/stateEventProcessor.ts +13 -15
  83. package/src/agent/engine/internal/turnTrackerProcessor.ts +27 -31
  84. package/src/agent/engine/mealy/Mealy.ts +2 -2
  85. package/src/agent/engine/mealy/combinators.ts +10 -10
  86. package/src/agent/engine/mealy/index.ts +9 -11
  87. package/src/agent/index.ts +30 -32
  88. package/src/agent/types/engine.ts +3 -3
  89. package/src/agent/types/event.ts +4 -12
  90. package/src/agent/types/index.ts +86 -88
  91. package/src/agent/types/message.ts +9 -43
  92. package/src/bash/index.ts +21 -0
  93. package/src/bash/tool.ts +57 -0
  94. package/src/bash/types.ts +108 -0
  95. package/src/common/logger/ConsoleLogger.ts +1 -1
  96. package/src/common/logger/LoggerFactoryImpl.ts +14 -14
  97. package/src/common/logger/index.ts +3 -3
  98. package/src/container/index.ts +4 -5
  99. package/src/container/types.ts +1 -1
  100. package/src/driver/index.ts +15 -16
  101. package/src/driver/types.ts +201 -73
  102. package/src/event/EventBus.ts +10 -10
  103. package/src/event/__tests__/EventBus.test.ts +2 -2
  104. package/src/event/index.ts +2 -3
  105. package/src/event/types/agent.ts +186 -191
  106. package/src/event/types/bus.ts +1 -1
  107. package/src/event/types/command.ts +293 -264
  108. package/src/event/types/container.ts +207 -222
  109. package/src/event/types/driver.ts +153 -155
  110. package/src/event/types/index.ts +6 -12
  111. package/src/event/types/session.ts +117 -130
  112. package/src/image/Image.ts +12 -2
  113. package/src/image/index.ts +4 -5
  114. package/src/image/types.ts +8 -2
  115. package/src/mq/OffsetGenerator.ts +1 -1
  116. package/src/mq/__tests__/OffsetGenerator.test.ts +1 -1
  117. package/src/mq/index.ts +4 -5
  118. package/src/network/RpcClient.ts +26 -25
  119. package/src/network/index.ts +41 -44
  120. package/src/network/jsonrpc.ts +5 -5
  121. package/src/persistence/index.ts +5 -5
  122. package/src/persistence/types.ts +5 -2
  123. package/src/platform/index.ts +21 -0
  124. package/src/platform/types.ts +84 -0
  125. package/src/runtime/AgentXRuntime.ts +188 -61
  126. package/src/runtime/__tests__/AgentXRuntime.test.ts +343 -0
  127. package/src/runtime/index.ts +12 -25
  128. package/src/runtime/types.ts +10 -62
  129. package/src/session/index.ts +2 -3
  130. package/dist/chunk-7D4SUZUM.js +0 -38
  131. package/dist/chunk-AT5P47YA.js.map +0 -1
  132. package/dist/chunk-E5FPOAPO.js.map +0 -1
  133. package/dist/chunk-I7GYR3MN.js.map +0 -1
  134. package/dist/chunk-K6WXQ2RW.js.map +0 -1
  135. package/dist/workspace/index.d.ts +0 -111
  136. package/dist/wrapper-Y3UTVU2E.js +0 -3635
  137. package/dist/wrapper-Y3UTVU2E.js.map +0 -1
  138. package/src/workspace/index.ts +0 -27
  139. package/src/workspace/types.ts +0 -131
  140. /package/dist/{workspace → bash}/index.js.map +0 -0
  141. /package/dist/{chunk-7D4SUZUM.js.map → chunk-SKS7S2RY.js.map} +0 -0
  142. /package/dist/{workspace → platform}/index.js +0 -0
@@ -13,38 +13,35 @@ import type { SystemEvent } from "./base";
13
13
  /**
14
14
  * Base SessionLifecycleEvent
15
15
  */
16
- interface BaseSessionLifecycleEvent<T extends string, D = unknown> extends SystemEvent<
17
- T,
18
- D,
19
- "session",
20
- "lifecycle",
21
- "notification"
22
- > {}
16
+ interface BaseSessionLifecycleEvent<T extends string, D = unknown>
17
+ extends SystemEvent<T, D, "session", "lifecycle", "notification"> {}
23
18
 
24
19
  /**
25
20
  * SessionCreatedEvent - Session was created
26
21
  */
27
- export interface SessionCreatedEvent extends BaseSessionLifecycleEvent<
28
- "session_created",
29
- {
30
- sessionId: string;
31
- imageId: string;
32
- containerId: string;
33
- title?: string;
34
- createdAt: number;
35
- }
36
- > {}
22
+ export interface SessionCreatedEvent
23
+ extends BaseSessionLifecycleEvent<
24
+ "session_created",
25
+ {
26
+ sessionId: string;
27
+ imageId: string;
28
+ containerId: string;
29
+ title?: string;
30
+ createdAt: number;
31
+ }
32
+ > {}
37
33
 
38
34
  /**
39
35
  * SessionDestroyedEvent - Session was destroyed
40
36
  */
41
- export interface SessionDestroyedEvent extends BaseSessionLifecycleEvent<
42
- "session_destroyed",
43
- {
44
- sessionId: string;
45
- reason?: string;
46
- }
47
- > {}
37
+ export interface SessionDestroyedEvent
38
+ extends BaseSessionLifecycleEvent<
39
+ "session_destroyed",
40
+ {
41
+ sessionId: string;
42
+ reason?: string;
43
+ }
44
+ > {}
48
45
 
49
46
  /**
50
47
  * SessionLifecycleEvent - All session lifecycle events
@@ -68,72 +65,66 @@ export function isSessionLifecycleEvent(event: {
68
65
  /**
69
66
  * Base SessionPersistRequest
70
67
  */
71
- interface BaseSessionPersistRequest<T extends string, D = unknown> extends SystemEvent<
72
- T,
73
- D,
74
- "session",
75
- "persist",
76
- "request"
77
- > {}
68
+ interface BaseSessionPersistRequest<T extends string, D = unknown>
69
+ extends SystemEvent<T, D, "session", "persist", "request"> {}
78
70
 
79
71
  /**
80
72
  * Base SessionPersistResult
81
73
  */
82
- interface BaseSessionPersistResult<T extends string, D = unknown> extends SystemEvent<
83
- T,
84
- D,
85
- "session",
86
- "persist",
87
- "result"
88
- > {}
74
+ interface BaseSessionPersistResult<T extends string, D = unknown>
75
+ extends SystemEvent<T, D, "session", "persist", "result"> {}
89
76
 
90
77
  /**
91
78
  * SessionSaveRequest - Request to save session
92
79
  */
93
- export interface SessionSaveRequest extends BaseSessionPersistRequest<
94
- "session_save_request",
95
- {
96
- sessionId: string;
97
- title?: string;
98
- metadata?: Record<string, unknown>;
99
- }
100
- > {}
80
+ export interface SessionSaveRequest
81
+ extends BaseSessionPersistRequest<
82
+ "session_save_request",
83
+ {
84
+ sessionId: string;
85
+ title?: string;
86
+ metadata?: Record<string, unknown>;
87
+ }
88
+ > {}
101
89
 
102
90
  /**
103
91
  * SessionSavedEvent - Session was saved
104
92
  */
105
- export interface SessionSavedEvent extends BaseSessionPersistResult<
106
- "session_saved",
107
- {
108
- sessionId: string;
109
- savedAt: number;
110
- }
111
- > {}
93
+ export interface SessionSavedEvent
94
+ extends BaseSessionPersistResult<
95
+ "session_saved",
96
+ {
97
+ sessionId: string;
98
+ savedAt: number;
99
+ }
100
+ > {}
112
101
 
113
102
  /**
114
103
  * MessagePersistRequest - Request to persist a message
115
104
  */
116
- export interface MessagePersistRequest extends BaseSessionPersistRequest<
117
- "message_persist_request",
118
- {
119
- sessionId: string;
120
- messageId: string;
121
- role: "user" | "assistant" | "tool_call" | "tool_result";
122
- content: unknown;
123
- }
124
- > {}
105
+ export interface MessagePersistRequest
106
+ extends BaseSessionPersistRequest<
107
+ "message_persist_request",
108
+ {
109
+ sessionId: string;
110
+ messageId: string;
111
+ role: "user" | "assistant" | "tool_call" | "tool_result";
112
+ content: unknown;
113
+ }
114
+ > {}
125
115
 
126
116
  /**
127
117
  * MessagePersistedEvent - Message was persisted
128
118
  */
129
- export interface MessagePersistedEvent extends BaseSessionPersistResult<
130
- "message_persisted",
131
- {
132
- sessionId: string;
133
- messageId: string;
134
- savedAt: number;
135
- }
136
- > {}
119
+ export interface MessagePersistedEvent
120
+ extends BaseSessionPersistResult<
121
+ "message_persisted",
122
+ {
123
+ sessionId: string;
124
+ messageId: string;
125
+ savedAt: number;
126
+ }
127
+ > {}
137
128
 
138
129
  /**
139
130
  * SessionPersistEvent - All session persist events
@@ -171,94 +162,90 @@ export function isSessionPersistEvent(event: {
171
162
  /**
172
163
  * Base SessionActionRequest
173
164
  */
174
- interface BaseSessionActionRequest<T extends string, D = unknown> extends SystemEvent<
175
- T,
176
- D,
177
- "session",
178
- "action",
179
- "request"
180
- > {}
165
+ interface BaseSessionActionRequest<T extends string, D = unknown>
166
+ extends SystemEvent<T, D, "session", "action", "request"> {}
181
167
 
182
168
  /**
183
169
  * Base SessionActionResult
184
170
  */
185
- interface BaseSessionActionResult<T extends string, D = unknown> extends SystemEvent<
186
- T,
187
- D,
188
- "session",
189
- "action",
190
- "result"
191
- > {}
171
+ interface BaseSessionActionResult<T extends string, D = unknown>
172
+ extends SystemEvent<T, D, "session", "action", "result"> {}
192
173
 
193
174
  /**
194
175
  * SessionResumeRequest - Request to resume a session
195
176
  */
196
- export interface SessionResumeRequest extends BaseSessionActionRequest<
197
- "session_resume_request",
198
- {
199
- sessionId: string;
200
- containerId?: string;
201
- }
202
- > {}
177
+ export interface SessionResumeRequest
178
+ extends BaseSessionActionRequest<
179
+ "session_resume_request",
180
+ {
181
+ sessionId: string;
182
+ containerId?: string;
183
+ }
184
+ > {}
203
185
 
204
186
  /**
205
187
  * SessionResumedEvent - Session was resumed
206
188
  */
207
- export interface SessionResumedEvent extends BaseSessionActionResult<
208
- "session_resumed",
209
- {
210
- sessionId: string;
211
- agentId: string;
212
- resumedAt: number;
213
- }
214
- > {}
189
+ export interface SessionResumedEvent
190
+ extends BaseSessionActionResult<
191
+ "session_resumed",
192
+ {
193
+ sessionId: string;
194
+ agentId: string;
195
+ resumedAt: number;
196
+ }
197
+ > {}
215
198
 
216
199
  /**
217
200
  * SessionForkRequest - Request to fork a session
218
201
  */
219
- export interface SessionForkRequest extends BaseSessionActionRequest<
220
- "session_fork_request",
221
- {
222
- sessionId: string;
223
- newTitle?: string;
224
- }
225
- > {}
202
+ export interface SessionForkRequest
203
+ extends BaseSessionActionRequest<
204
+ "session_fork_request",
205
+ {
206
+ sessionId: string;
207
+ newTitle?: string;
208
+ }
209
+ > {}
226
210
 
227
211
  /**
228
212
  * SessionForkedEvent - Session was forked
229
213
  */
230
- export interface SessionForkedEvent extends BaseSessionActionResult<
231
- "session_forked",
232
- {
233
- originalSessionId: string;
234
- newSessionId: string;
235
- newImageId: string;
236
- forkedAt: number;
237
- }
238
- > {}
214
+ export interface SessionForkedEvent
215
+ extends BaseSessionActionResult<
216
+ "session_forked",
217
+ {
218
+ originalSessionId: string;
219
+ newSessionId: string;
220
+ newImageId: string;
221
+ forkedAt: number;
222
+ }
223
+ > {}
239
224
 
240
225
  /**
241
226
  * SessionTitleUpdateRequest - Request to update session title
242
227
  */
243
- export interface SessionTitleUpdateRequest extends BaseSessionActionRequest<
244
- "session_title_update_request",
245
- {
246
- sessionId: string;
247
- title: string;
248
- }
249
- > {}
228
+ export interface SessionTitleUpdateRequest
229
+ extends BaseSessionActionRequest<
230
+ "session_title_update_request",
231
+ {
232
+ sessionId: string;
233
+ title: string;
234
+ }
235
+ > {}
250
236
 
251
237
  /**
252
238
  * SessionTitleUpdatedEvent - Session title was updated
253
239
  */
254
- export interface SessionTitleUpdatedEvent extends BaseSessionActionResult<
255
- "session_title_updated",
256
- {
257
- sessionId: string;
258
- title: string;
259
- updatedAt: number;
260
- }
261
- > {}
240
+ export interface SessionTitleUpdatedEvent
241
+ extends BaseSessionActionResult<
242
+ "session_title_updated",
243
+ {
244
+ sessionId: string;
245
+ title: string;
246
+ updatedAt: number;
247
+ }
248
+ > {}
262
249
 
263
250
  /**
264
251
  * SessionActionEvent - All session action events
@@ -6,7 +6,7 @@
6
6
  */
7
7
 
8
8
  import { createLogger } from "commonxjs/logger";
9
- import type { Image, ImageRecord, ImageContext, ImageCreateConfig } from "./types";
9
+ import type { Image, ImageContext, ImageCreateConfig, ImageRecord } from "./types";
10
10
 
11
11
  const logger = createLogger("image/Image");
12
12
 
@@ -49,6 +49,10 @@ export class ImageImpl implements Image {
49
49
  return this.record.mcpServers;
50
50
  }
51
51
 
52
+ get customData(): Record<string, unknown> | undefined {
53
+ return this.record.customData;
54
+ }
55
+
52
56
  get createdAt(): number {
53
57
  return this.record.createdAt;
54
58
  }
@@ -76,6 +80,7 @@ export class ImageImpl implements Image {
76
80
  description: config.description,
77
81
  systemPrompt: config.systemPrompt,
78
82
  mcpServers: config.mcpServers,
83
+ customData: config.customData,
79
84
  createdAt: now,
80
85
  updatedAt: now,
81
86
  };
@@ -135,12 +140,17 @@ export class ImageImpl implements Image {
135
140
  /**
136
141
  * Update image metadata
137
142
  */
138
- async update(updates: { name?: string; description?: string }): Promise<Image> {
143
+ async update(updates: {
144
+ name?: string;
145
+ description?: string;
146
+ customData?: Record<string, unknown>;
147
+ }): Promise<Image> {
139
148
  const now = Date.now();
140
149
  const updatedRecord: ImageRecord = {
141
150
  ...this.record,
142
151
  name: updates.name ?? this.record.name,
143
152
  description: updates.description ?? this.record.description,
153
+ customData: updates.customData !== undefined ? updates.customData : this.record.customData,
144
154
  updatedAt: now,
145
155
  };
146
156
 
@@ -24,13 +24,12 @@
24
24
  * ```
25
25
  */
26
26
 
27
+ export { createImage, ImageImpl, loadImage } from "./Image";
27
28
  export type {
28
- ImageMetadata,
29
- ImageRecord,
30
- ImageRepository,
31
29
  Image,
32
30
  ImageContext,
33
31
  ImageCreateConfig,
32
+ ImageMetadata,
33
+ ImageRecord,
34
+ ImageRepository,
34
35
  } from "./types";
35
-
36
- export { ImageImpl, createImage, loadImage } from "./Image";
@@ -34,13 +34,18 @@ export interface Image {
34
34
  readonly description: string | undefined;
35
35
  readonly systemPrompt: string | undefined;
36
36
  readonly mcpServers: Record<string, McpServerConfig> | undefined;
37
+ readonly customData: Record<string, unknown> | undefined;
37
38
  readonly createdAt: number;
38
39
  readonly updatedAt: number;
39
40
 
40
41
  /**
41
- * Update image metadata (name, description)
42
+ * Update image metadata (name, description, customData)
42
43
  */
43
- update(updates: { name?: string; description?: string }): Promise<Image>;
44
+ update(updates: {
45
+ name?: string;
46
+ description?: string;
47
+ customData?: Record<string, unknown>;
48
+ }): Promise<Image>;
44
49
 
45
50
  /**
46
51
  * Delete this image and its session
@@ -74,4 +79,5 @@ export interface ImageCreateConfig {
74
79
  description?: string;
75
80
  systemPrompt?: string;
76
81
  mcpServers?: Record<string, McpServerConfig>;
82
+ customData?: Record<string, unknown>;
77
83
  }
@@ -43,6 +43,6 @@ export class OffsetGenerator {
43
43
  const timeDiff = parseInt(aTime, 36) - parseInt(bTime, 36);
44
44
  if (timeDiff !== 0) return timeDiff;
45
45
 
46
- return parseInt(aSeq) - parseInt(bSeq);
46
+ return parseInt(aSeq, 10) - parseInt(bSeq, 10);
47
47
  }
48
48
  }
@@ -2,7 +2,7 @@
2
2
  * OffsetGenerator.test.ts - Unit tests for OffsetGenerator
3
3
  */
4
4
 
5
- import { describe, it, expect, beforeEach } from "bun:test";
5
+ import { beforeEach, describe, expect, it } from "bun:test";
6
6
  import { OffsetGenerator } from "../OffsetGenerator";
7
7
 
8
8
  describe("OffsetGenerator", () => {
package/src/mq/index.ts CHANGED
@@ -7,12 +7,11 @@
7
7
  * - OffsetGenerator: Utility for generating monotonic offsets
8
8
  */
9
9
 
10
+ export { OffsetGenerator } from "./OffsetGenerator";
10
11
  export type {
11
- QueueEntry,
12
- QueueConfig,
13
- Unsubscribe,
14
12
  MessageQueue,
15
13
  MessageQueueProvider,
14
+ QueueConfig,
15
+ QueueEntry,
16
+ Unsubscribe,
16
17
  } from "./types";
17
-
18
- export { OffsetGenerator } from "./OffsetGenerator";
@@ -25,33 +25,32 @@
25
25
  * ```
26
26
  */
27
27
 
28
+ import type { SystemEvent } from "../event/types/base";
28
29
  import {
29
- createRequest,
30
30
  createNotification,
31
- parseMessage,
32
- isSuccessResponse,
31
+ createRequest,
33
32
  isErrorResponse,
34
33
  isNotification,
35
34
  isStreamEvent,
36
- type RpcMethod,
35
+ isSuccessResponse,
37
36
  type NotificationMethod,
37
+ parseMessage,
38
+ type RpcMethod,
38
39
  type StreamEventParams,
39
40
  } from "./jsonrpc";
40
- import type { SystemEvent } from "../event/types/base";
41
-
42
- /**
43
- * Check if running in browser environment
44
- */
45
- function isBrowser(): boolean {
46
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
47
- const globalWindow = typeof globalThis !== "undefined" ? (globalThis as any).window : undefined;
48
- return globalWindow?.document !== undefined;
49
- }
50
41
 
51
42
  // ============================================================================
52
43
  // Types
53
44
  // ============================================================================
54
45
 
46
+ /**
47
+ * Factory function for creating WebSocket instances.
48
+ * Platform layer provides the implementation:
49
+ * - Browser: native WebSocket (default)
50
+ * - Node.js: ws library (via @agentxjs/node-platform)
51
+ */
52
+ export type WebSocketFactory = (url: string) => WebSocket;
53
+
55
54
  /**
56
55
  * RpcClient configuration
57
56
  */
@@ -61,6 +60,12 @@ export interface RpcClientConfig {
61
60
  */
62
61
  url: string;
63
62
 
63
+ /**
64
+ * Factory for creating WebSocket instances.
65
+ * If not provided, falls back to the global WebSocket constructor.
66
+ */
67
+ createWebSocket?: WebSocketFactory;
68
+
64
69
  /**
65
70
  * Request timeout in milliseconds (default: 30000)
66
71
  */
@@ -77,7 +82,7 @@ export interface RpcClientConfig {
77
82
  reconnectDelay?: number;
78
83
 
79
84
  /**
80
- * Headers for authentication (Node.js only, sent in first message for browser)
85
+ * Headers for authentication (sent in first message after connection)
81
86
  */
82
87
  headers?:
83
88
  | Record<string, string>
@@ -172,14 +177,9 @@ export class RpcClient {
172
177
 
173
178
  const url = this.config.url;
174
179
 
175
- // Create WebSocket (browser or Node.js)
176
- let ws: WebSocket;
177
- if (isBrowser()) {
178
- ws = new WebSocket(url);
179
- } else {
180
- const { default: WS } = await import("ws");
181
- ws = new WS(url) as unknown as WebSocket;
182
- }
180
+ // Create WebSocket via injected factory or global WebSocket
181
+ const factory = this.config.createWebSocket ?? ((u: string) => new WebSocket(u));
182
+ const ws = factory(url);
183
183
 
184
184
  this.ws = ws;
185
185
 
@@ -191,8 +191,9 @@ export class RpcClient {
191
191
  console.log("[RpcClient] Connected to", url);
192
192
  }
193
193
 
194
- // Send auth if in browser (headers not supported in WebSocket API)
195
- if (isBrowser() && this.config.headers) {
194
+ // Send auth headers after connection (for environments where
195
+ // WebSocket constructor doesn't support headers, e.g. browser)
196
+ if (this.config.headers) {
196
197
  const headers =
197
198
  typeof this.config.headers === "function"
198
199
  ? await this.config.headers()
@@ -12,65 +12,62 @@
12
12
  * - @agentxjs/cloudflare: Durable Objects WebSocket
13
13
  */
14
14
 
15
- // Types
16
- export type {
17
- Unsubscribe,
18
- MinimalHTTPServer,
19
- SendReliableOptions,
20
- ConnectionState,
21
- ChannelConnection,
22
- ChannelServer,
23
- ChannelServerOptions,
24
- ChannelClient,
25
- ChannelClientOptions,
26
- ChannelServerProvider,
27
- ChannelClientProvider,
28
- } from "./types";
29
-
30
- // Protocol (reliable delivery)
31
- export type { ReliableWrapper, AckMessage } from "./protocol";
32
- export {
33
- isReliableWrapper,
34
- isAckMessage,
35
- wrapMessage,
36
- createAck,
37
- unwrapMessage,
38
- generateMessageId,
39
- } from "./protocol";
40
-
41
15
  // JSON-RPC 2.0 Protocol
42
16
  export type {
43
- RpcMethod,
17
+ ControlAckParams,
44
18
  NotificationMethod,
45
- RpcRequest,
46
- RpcSuccessResponse,
47
19
  RpcErrorResponse,
20
+ RpcMethod,
48
21
  RpcNotification,
22
+ RpcRequest,
23
+ RpcSuccessResponse,
49
24
  StreamEventParams,
50
- ControlAckParams,
51
25
  } from "./jsonrpc";
52
26
  export {
53
- JsonRpcError,
54
- RpcErrorCodes,
55
- createRequest,
27
+ createAckNotification,
28
+ createErrorResponse,
56
29
  createNotification,
30
+ createRequest,
57
31
  createStreamEvent,
58
- createAckNotification,
59
32
  createSuccessResponse,
60
- createErrorResponse,
61
- parseMessage,
62
- parseMessageObject,
63
- isRequest,
64
- isNotification,
65
- isSuccessResponse,
33
+ eventTypeToRpcMethod,
34
+ isControlAck,
66
35
  isErrorResponse,
67
36
  isInvalid,
37
+ isNotification,
38
+ isRequest,
68
39
  isStreamEvent,
69
- isControlAck,
70
- eventTypeToRpcMethod,
40
+ isSuccessResponse,
41
+ JsonRpcError,
42
+ parseMessage,
43
+ parseMessageObject,
44
+ RpcErrorCodes,
71
45
  rpcMethodToResponseType,
72
46
  } from "./jsonrpc";
73
-
47
+ // Protocol (reliable delivery)
48
+ export type { AckMessage, ReliableWrapper } from "./protocol";
49
+ export {
50
+ createAck,
51
+ generateMessageId,
52
+ isAckMessage,
53
+ isReliableWrapper,
54
+ unwrapMessage,
55
+ wrapMessage,
56
+ } from "./protocol";
74
57
  // RPC Client
75
- export type { RpcClientConfig, RpcClientState } from "./RpcClient";
58
+ export type { RpcClientConfig, RpcClientState, WebSocketFactory } from "./RpcClient";
76
59
  export { RpcClient } from "./RpcClient";
60
+ // Types
61
+ export type {
62
+ ChannelClient,
63
+ ChannelClientOptions,
64
+ ChannelClientProvider,
65
+ ChannelConnection,
66
+ ChannelServer,
67
+ ChannelServerOptions,
68
+ ChannelServerProvider,
69
+ ConnectionState,
70
+ MinimalHTTPServer,
71
+ SendReliableOptions,
72
+ Unsubscribe,
73
+ } from "./types";
@@ -11,16 +11,16 @@
11
11
  * @see https://www.jsonrpc.org/specification
12
12
  */
13
13
 
14
+ import type { IParsedObject, JsonRpc } from "jsonrpc-lite";
14
15
  import {
15
- request as jsonrpcRequest,
16
- notification as jsonrpcNotification,
17
- success as jsonrpcSuccess,
16
+ JsonRpcError,
18
17
  error as jsonrpcError,
18
+ notification as jsonrpcNotification,
19
19
  parse as jsonrpcParse,
20
20
  parseObject as jsonrpcParseObject,
21
- JsonRpcError,
21
+ request as jsonrpcRequest,
22
+ success as jsonrpcSuccess,
22
23
  } from "jsonrpc-lite";
23
- import type { IParsedObject, JsonRpc } from "jsonrpc-lite";
24
24
  import type { SystemEvent } from "../event/types/base";
25
25
 
26
26
  // ============================================================================