@witqq/agent-sdk 0.6.1 → 0.8.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 (145) hide show
  1. package/README.md +539 -6
  2. package/dist/{types-BvwNzZCj.d.cts → agent-CW9XbmG_.d.ts} +148 -95
  3. package/dist/{types-BvwNzZCj.d.ts → agent-DxY68NZL.d.cts} +148 -95
  4. package/dist/auth/index.cjs +260 -2
  5. package/dist/auth/index.cjs.map +1 -1
  6. package/dist/auth/index.d.cts +21 -138
  7. package/dist/auth/index.d.ts +21 -138
  8. package/dist/auth/index.js +260 -3
  9. package/dist/auth/index.js.map +1 -1
  10. package/dist/backends/claude.cjs +653 -140
  11. package/dist/backends/claude.cjs.map +1 -1
  12. package/dist/backends/claude.d.cts +4 -1
  13. package/dist/backends/claude.d.ts +4 -1
  14. package/dist/backends/claude.js +653 -140
  15. package/dist/backends/claude.js.map +1 -1
  16. package/dist/backends/copilot.cjs +428 -88
  17. package/dist/backends/copilot.cjs.map +1 -1
  18. package/dist/backends/copilot.d.cts +13 -4
  19. package/dist/backends/copilot.d.ts +13 -4
  20. package/dist/backends/copilot.js +428 -88
  21. package/dist/backends/copilot.js.map +1 -1
  22. package/dist/backends/vercel-ai.cjs +349 -77
  23. package/dist/backends/vercel-ai.cjs.map +1 -1
  24. package/dist/backends/vercel-ai.d.cts +3 -1
  25. package/dist/backends/vercel-ai.d.ts +3 -1
  26. package/dist/backends/vercel-ai.js +349 -77
  27. package/dist/backends/vercel-ai.js.map +1 -1
  28. package/dist/backends-BSrsBYFn.d.cts +39 -0
  29. package/dist/backends-BSrsBYFn.d.ts +39 -0
  30. package/dist/chat/accumulator.cjs +147 -0
  31. package/dist/chat/accumulator.cjs.map +1 -0
  32. package/dist/chat/accumulator.d.cts +64 -0
  33. package/dist/chat/accumulator.d.ts +64 -0
  34. package/dist/chat/accumulator.js +145 -0
  35. package/dist/chat/accumulator.js.map +1 -0
  36. package/dist/chat/backends.cjs +3524 -0
  37. package/dist/chat/backends.cjs.map +1 -0
  38. package/dist/chat/backends.d.cts +66 -0
  39. package/dist/chat/backends.d.ts +66 -0
  40. package/dist/chat/backends.js +3512 -0
  41. package/dist/chat/backends.js.map +1 -0
  42. package/dist/chat/context.cjs +280 -0
  43. package/dist/chat/context.cjs.map +1 -0
  44. package/dist/chat/context.d.cts +191 -0
  45. package/dist/chat/context.d.ts +191 -0
  46. package/dist/chat/context.js +277 -0
  47. package/dist/chat/context.js.map +1 -0
  48. package/dist/chat/core.cjs +305 -0
  49. package/dist/chat/core.cjs.map +1 -0
  50. package/dist/chat/core.d.cts +84 -0
  51. package/dist/chat/core.d.ts +84 -0
  52. package/dist/chat/core.js +282 -0
  53. package/dist/chat/core.js.map +1 -0
  54. package/dist/chat/errors.cjs +273 -0
  55. package/dist/chat/errors.cjs.map +1 -0
  56. package/dist/chat/errors.d.cts +97 -0
  57. package/dist/chat/errors.d.ts +97 -0
  58. package/dist/chat/errors.js +266 -0
  59. package/dist/chat/errors.js.map +1 -0
  60. package/dist/chat/events.cjs +203 -0
  61. package/dist/chat/events.cjs.map +1 -0
  62. package/dist/chat/events.d.cts +245 -0
  63. package/dist/chat/events.d.ts +245 -0
  64. package/dist/chat/events.js +196 -0
  65. package/dist/chat/events.js.map +1 -0
  66. package/dist/chat/index.cjs +5550 -0
  67. package/dist/chat/index.cjs.map +1 -0
  68. package/dist/chat/index.d.cts +77 -0
  69. package/dist/chat/index.d.ts +77 -0
  70. package/dist/chat/index.js +5505 -0
  71. package/dist/chat/index.js.map +1 -0
  72. package/dist/chat/react/theme.css +2517 -0
  73. package/dist/chat/react.cjs +3589 -0
  74. package/dist/chat/react.cjs.map +1 -0
  75. package/dist/chat/react.d.cts +1088 -0
  76. package/dist/chat/react.d.ts +1088 -0
  77. package/dist/chat/react.js +3547 -0
  78. package/dist/chat/react.js.map +1 -0
  79. package/dist/chat/runtime.cjs +1245 -0
  80. package/dist/chat/runtime.cjs.map +1 -0
  81. package/dist/chat/runtime.d.cts +182 -0
  82. package/dist/chat/runtime.d.ts +182 -0
  83. package/dist/chat/runtime.js +1243 -0
  84. package/dist/chat/runtime.js.map +1 -0
  85. package/dist/chat/server.cjs +2668 -0
  86. package/dist/chat/server.cjs.map +1 -0
  87. package/dist/chat/server.d.cts +648 -0
  88. package/dist/chat/server.d.ts +648 -0
  89. package/dist/chat/server.js +2628 -0
  90. package/dist/chat/server.js.map +1 -0
  91. package/dist/chat/sessions.cjs +380 -0
  92. package/dist/chat/sessions.cjs.map +1 -0
  93. package/dist/chat/sessions.d.cts +158 -0
  94. package/dist/chat/sessions.d.ts +158 -0
  95. package/dist/chat/sessions.js +376 -0
  96. package/dist/chat/sessions.js.map +1 -0
  97. package/dist/chat/sqlite.cjs +441 -0
  98. package/dist/chat/sqlite.cjs.map +1 -0
  99. package/dist/chat/sqlite.d.cts +128 -0
  100. package/dist/chat/sqlite.d.ts +128 -0
  101. package/dist/chat/sqlite.js +435 -0
  102. package/dist/chat/sqlite.js.map +1 -0
  103. package/dist/chat/state.cjs +190 -0
  104. package/dist/chat/state.cjs.map +1 -0
  105. package/dist/chat/state.d.cts +95 -0
  106. package/dist/chat/state.d.ts +95 -0
  107. package/dist/chat/state.js +180 -0
  108. package/dist/chat/state.js.map +1 -0
  109. package/dist/chat/storage.cjs +249 -0
  110. package/dist/chat/storage.cjs.map +1 -0
  111. package/dist/chat/storage.d.cts +197 -0
  112. package/dist/chat/storage.d.ts +197 -0
  113. package/dist/chat/storage.js +245 -0
  114. package/dist/chat/storage.js.map +1 -0
  115. package/dist/errors-C-so0M4t.d.cts +33 -0
  116. package/dist/errors-C-so0M4t.d.ts +33 -0
  117. package/dist/errors-CmVvczxZ.d.cts +28 -0
  118. package/dist/errors-CmVvczxZ.d.ts +28 -0
  119. package/dist/in-process-transport-C1JnJGVR.d.ts +228 -0
  120. package/dist/in-process-transport-C7DSqPyX.d.cts +228 -0
  121. package/dist/index.cjs +365 -59
  122. package/dist/index.cjs.map +1 -1
  123. package/dist/index.d.cts +322 -125
  124. package/dist/index.d.ts +322 -125
  125. package/dist/index.js +359 -60
  126. package/dist/index.js.map +1 -1
  127. package/dist/provider-types-PTSlRPNB.d.cts +39 -0
  128. package/dist/provider-types-PTSlRPNB.d.ts +39 -0
  129. package/dist/refresh-manager-B81PpYBr.d.cts +153 -0
  130. package/dist/refresh-manager-Dlv_iNZi.d.ts +153 -0
  131. package/dist/testing.cjs +383 -0
  132. package/dist/testing.cjs.map +1 -0
  133. package/dist/testing.d.cts +132 -0
  134. package/dist/testing.d.ts +132 -0
  135. package/dist/testing.js +377 -0
  136. package/dist/testing.js.map +1 -0
  137. package/dist/token-store-CSUBgYwn.d.ts +48 -0
  138. package/dist/token-store-CuC4hB9Z.d.cts +48 -0
  139. package/dist/transport-Cdh3M0tS.d.cts +68 -0
  140. package/dist/transport-Ciap4PWK.d.ts +68 -0
  141. package/dist/types-4vbcmPTp.d.cts +143 -0
  142. package/dist/types-BxggH0Yh.d.ts +143 -0
  143. package/dist/types-DRgd_9R7.d.cts +363 -0
  144. package/dist/types-ajANVzf7.d.ts +363 -0
  145. package/package.json +178 -6
@@ -0,0 +1,203 @@
1
+ 'use strict';
2
+
3
+ // src/chat/events.ts
4
+ var TypedEventEmitter = class {
5
+ listeners = /* @__PURE__ */ new Map();
6
+ /**
7
+ * Subscribe to an event.
8
+ * @param event - Event name
9
+ * @param listener - Callback receiving the event payload
10
+ * @returns Unsubscribe function
11
+ */
12
+ on(event, listener) {
13
+ let set = this.listeners.get(event);
14
+ if (!set) {
15
+ set = /* @__PURE__ */ new Set();
16
+ this.listeners.set(event, set);
17
+ }
18
+ const fn = listener;
19
+ set.add(fn);
20
+ return () => {
21
+ set.delete(fn);
22
+ if (set.size === 0) {
23
+ this.listeners.delete(event);
24
+ }
25
+ };
26
+ }
27
+ /**
28
+ * Subscribe to an event, firing the listener at most once.
29
+ * @param event - Event name
30
+ * @param listener - Callback receiving the event payload
31
+ * @returns Unsubscribe function
32
+ */
33
+ once(event, listener) {
34
+ const unsub = this.on(event, (payload) => {
35
+ unsub();
36
+ listener(payload);
37
+ });
38
+ return unsub;
39
+ }
40
+ /**
41
+ * Remove a specific listener from an event.
42
+ * @param event - Event name
43
+ * @param listener - The listener to remove
44
+ */
45
+ off(event, listener) {
46
+ const set = this.listeners.get(event);
47
+ if (!set) return;
48
+ set.delete(listener);
49
+ if (set.size === 0) {
50
+ this.listeners.delete(event);
51
+ }
52
+ }
53
+ /**
54
+ * Emit an event, calling all registered listeners synchronously.
55
+ * @param event - Event name
56
+ * @param payload - Event payload
57
+ */
58
+ emit(event, payload) {
59
+ const set = this.listeners.get(event);
60
+ if (!set) return;
61
+ for (const fn of [...set]) {
62
+ fn(payload);
63
+ }
64
+ }
65
+ /**
66
+ * Remove all listeners for a specific event, or all events if no event specified.
67
+ * @param event - Optional event name
68
+ */
69
+ removeAllListeners(event) {
70
+ if (event !== void 0) {
71
+ this.listeners.delete(event);
72
+ } else {
73
+ this.listeners.clear();
74
+ }
75
+ }
76
+ /**
77
+ * Get the number of listeners for a specific event.
78
+ * @param event - Event name
79
+ * @returns Number of listeners
80
+ */
81
+ listenerCount(event) {
82
+ const set = this.listeners.get(event);
83
+ return set ? set.size : 0;
84
+ }
85
+ /**
86
+ * Get all event names that have at least one listener.
87
+ * @returns Array of event names
88
+ */
89
+ eventNames() {
90
+ return [...this.listeners.keys()];
91
+ }
92
+ };
93
+ var ChatEventBus = class extends TypedEventEmitter {
94
+ middlewares = [];
95
+ /**
96
+ * Register a middleware function. Middleware runs in registration order.
97
+ * @param middleware - Middleware function
98
+ * @returns Unsubscribe function to remove the middleware
99
+ */
100
+ use(middleware) {
101
+ this.middlewares.push(middleware);
102
+ return () => {
103
+ const idx = this.middlewares.indexOf(middleware);
104
+ if (idx !== -1) {
105
+ this.middlewares.splice(idx, 1);
106
+ }
107
+ };
108
+ }
109
+ /**
110
+ * Emit a chat event through the middleware pipeline, then to listeners.
111
+ *
112
+ * @param event - ChatEvent type string
113
+ * @param payload - The full ChatEvent object
114
+ */
115
+ emit(event, payload) {
116
+ if (this.middlewares.length === 0) {
117
+ super.emit(event, payload);
118
+ return;
119
+ }
120
+ let suppressed = false;
121
+ let currentEvent = payload;
122
+ let index = 0;
123
+ const runNext = () => {
124
+ if (suppressed) return;
125
+ if (index >= this.middlewares.length) {
126
+ super.emit(
127
+ currentEvent.type,
128
+ currentEvent
129
+ );
130
+ return;
131
+ }
132
+ const mw = this.middlewares[index++];
133
+ const ctx = {
134
+ event: currentEvent,
135
+ next: () => {
136
+ currentEvent = ctx.event;
137
+ runNext();
138
+ },
139
+ suppress: () => {
140
+ suppressed = true;
141
+ }
142
+ };
143
+ mw(ctx);
144
+ };
145
+ runNext();
146
+ }
147
+ /**
148
+ * Replace the event in the middleware context.
149
+ * Middleware should mutate ctx.event or create a new MiddlewareContext
150
+ * to transform events passing through the pipeline.
151
+ */
152
+ /**
153
+ * Remove all middleware functions.
154
+ */
155
+ clearMiddleware() {
156
+ this.middlewares.length = 0;
157
+ }
158
+ /**
159
+ * Get the number of registered middleware functions.
160
+ * @returns Number of middleware
161
+ */
162
+ middlewareCount() {
163
+ return this.middlewares.length;
164
+ }
165
+ };
166
+ function eventFilter(...types) {
167
+ const allowed = new Set(types);
168
+ return (event) => allowed.has(event.type);
169
+ }
170
+ async function* filterEvents(source, ...types) {
171
+ const pred = eventFilter(...types);
172
+ for await (const event of source) {
173
+ if (pred(event)) {
174
+ yield event;
175
+ }
176
+ }
177
+ }
178
+ async function* mapEvents(source, transform) {
179
+ for await (const event of source) {
180
+ const result = transform(event);
181
+ if (result !== null) {
182
+ yield result;
183
+ }
184
+ }
185
+ }
186
+ async function collectText(source) {
187
+ const parts = [];
188
+ for await (const event of source) {
189
+ if (event.type === "message:delta") {
190
+ parts.push(event.text);
191
+ }
192
+ }
193
+ return parts.join("");
194
+ }
195
+
196
+ exports.ChatEventBus = ChatEventBus;
197
+ exports.TypedEventEmitter = TypedEventEmitter;
198
+ exports.collectText = collectText;
199
+ exports.eventFilter = eventFilter;
200
+ exports.filterEvents = filterEvents;
201
+ exports.mapEvents = mapEvents;
202
+ //# sourceMappingURL=events.cjs.map
203
+ //# sourceMappingURL=events.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/chat/events.ts"],"names":[],"mappings":"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","file":"events.cjs","sourcesContent":["/**\n * @witqq/agent-sdk/chat/events\n *\n * Type-safe event emitter, chat event bus, and middleware pipeline.\n * Generic TypedEventEmitter<EventMap> for arbitrary typed event maps.\n * ChatEventBus specializing TypedEventEmitter for ChatEvent types.\n * Middleware support for event interception, transformation, and suppression.\n * Utility functions for filtering and mapping event streams.\n */\n\nimport type { ChatEvent, ChatEventType } from \"./core.js\";\n\n// ─── EventMap constraint ──────────────────────────────────────\n\n/** Constraint for event maps: keys are strings, values are payloads */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type EventMap = Record<string, any>;\n\n// ─── Listener types ───────────────────────────────────────────\n\n/** Listener callback for a specific event */\nexport type Listener<T> = (payload: T) => void;\n\n/** Unsubscribe function returned by on/once */\nexport type Unsubscribe = () => void;\n\n// ─── TypedEventEmitter ────────────────────────────────────────\n\n/**\n * Generic type-safe event emitter parameterized by an EventMap.\n *\n * @typeParam T - Map of event names to payload types\n *\n * @example\n * ```typescript\n * type MyEvents = {\n * message: string;\n * count: number;\n * done: void;\n * };\n * const emitter = new TypedEventEmitter<MyEvents>();\n * emitter.on(\"message\", (text) => console.log(text));\n * emitter.emit(\"message\", \"hello\");\n * ```\n */\nexport class TypedEventEmitter<T extends EventMap> {\n private readonly listeners = new Map<keyof T, Set<Listener<unknown>>>();\n\n /**\n * Subscribe to an event.\n * @param event - Event name\n * @param listener - Callback receiving the event payload\n * @returns Unsubscribe function\n */\n on<K extends keyof T>(event: K, listener: Listener<T[K]>): Unsubscribe {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n const fn = listener as Listener<unknown>;\n set.add(fn);\n return () => {\n set!.delete(fn);\n if (set!.size === 0) {\n this.listeners.delete(event);\n }\n };\n }\n\n /**\n * Subscribe to an event, firing the listener at most once.\n * @param event - Event name\n * @param listener - Callback receiving the event payload\n * @returns Unsubscribe function\n */\n once<K extends keyof T>(event: K, listener: Listener<T[K]>): Unsubscribe {\n const unsub = this.on(event, (payload) => {\n unsub();\n listener(payload);\n });\n return unsub;\n }\n\n /**\n * Remove a specific listener from an event.\n * @param event - Event name\n * @param listener - The listener to remove\n */\n off<K extends keyof T>(event: K, listener: Listener<T[K]>): void {\n const set = this.listeners.get(event);\n if (!set) return;\n set.delete(listener as Listener<unknown>);\n if (set.size === 0) {\n this.listeners.delete(event);\n }\n }\n\n /**\n * Emit an event, calling all registered listeners synchronously.\n * @param event - Event name\n * @param payload - Event payload\n */\n emit<K extends keyof T>(event: K, payload: T[K]): void {\n const set = this.listeners.get(event);\n if (!set) return;\n for (const fn of [...set]) {\n fn(payload);\n }\n }\n\n /**\n * Remove all listeners for a specific event, or all events if no event specified.\n * @param event - Optional event name\n */\n removeAllListeners<K extends keyof T>(event?: K): void {\n if (event !== undefined) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n }\n\n /**\n * Get the number of listeners for a specific event.\n * @param event - Event name\n * @returns Number of listeners\n */\n listenerCount<K extends keyof T>(event: K): number {\n const set = this.listeners.get(event);\n return set ? set.size : 0;\n }\n\n /**\n * Get all event names that have at least one listener.\n * @returns Array of event names\n */\n eventNames(): Array<keyof T> {\n return [...this.listeners.keys()];\n }\n}\n\n// ─── ChatEventMap ─────────────────────────────────────────────\n\n/**\n * Map of ChatEvent type strings to their corresponding ChatEvent payloads.\n * Used to parameterize TypedEventEmitter for chat events.\n */\nexport type ChatEventMap = {\n [K in ChatEventType]: Extract<ChatEvent, { type: K }>;\n};\n\n// ─── Middleware ────────────────────────────────────────────────\n\n/**\n * Context passed to middleware functions.\n * Contains the event and control methods for the middleware pipeline.\n */\nexport interface MiddlewareContext {\n /** The current event (may be transformed by prior middleware) */\n event: ChatEvent;\n /** Call the next middleware in the chain, or deliver to listeners if last */\n next: () => void;\n /** Suppress the event — do not deliver to listeners or subsequent middleware */\n suppress: () => void;\n}\n\n/**\n * Middleware function for intercepting, transforming, or suppressing events.\n * EventMiddleware operates at the ChatEventBus level.\n *\n * @param ctx - Middleware context with event, next(), and suppress()\n *\n * @example\n * ```typescript\n * // Logging middleware\n * const logger: EventMiddleware = (ctx) => {\n * console.log(`Event: ${ctx.event.type}`);\n * ctx.next();\n * };\n *\n * // Suppressing middleware\n * const filter: EventMiddleware = (ctx) => {\n * if (ctx.event.type === \"heartbeat\") {\n * ctx.suppress();\n * } else {\n * ctx.next();\n * }\n * };\n * ```\n */\nexport type EventMiddleware = (ctx: MiddlewareContext) => void;\n\n// ─── ChatEventBus ─────────────────────────────────────────────\n\n/**\n * Chat event bus: a typed event emitter specialized for ChatEvent types\n * with middleware pipeline support.\n *\n * Events pass through the middleware pipeline before reaching listeners.\n * Middleware can inspect, transform, or suppress events.\n *\n * @example\n * ```typescript\n * const bus = new ChatEventBus();\n *\n * // Add middleware\n * bus.use((ctx) => {\n * console.log(`[${ctx.event.type}]`);\n * ctx.next();\n * });\n *\n * // Listen for events\n * bus.on(\"message:delta\", (event) => {\n * console.log(event.text);\n * });\n *\n * // Emit events\n * bus.emit(\"message:delta\", { type: \"message:delta\", messageId: id, text: \"hi\" });\n * ```\n */\nexport class ChatEventBus extends TypedEventEmitter<ChatEventMap> {\n private readonly middlewares: EventMiddleware[] = [];\n\n /**\n * Register a middleware function. Middleware runs in registration order.\n * @param middleware - Middleware function\n * @returns Unsubscribe function to remove the middleware\n */\n use(middleware: EventMiddleware): Unsubscribe {\n this.middlewares.push(middleware);\n return () => {\n const idx = this.middlewares.indexOf(middleware);\n if (idx !== -1) {\n this.middlewares.splice(idx, 1);\n }\n };\n }\n\n /**\n * Emit a chat event through the middleware pipeline, then to listeners.\n *\n * @param event - ChatEvent type string\n * @param payload - The full ChatEvent object\n */\n override emit<K extends ChatEventType>(\n event: K,\n payload: ChatEventMap[K],\n ): void {\n if (this.middlewares.length === 0) {\n super.emit(event, payload);\n return;\n }\n\n let suppressed = false;\n let currentEvent: ChatEvent = payload;\n let index = 0;\n\n const runNext = (): void => {\n if (suppressed) return;\n\n if (index >= this.middlewares.length) {\n super.emit(\n currentEvent.type as K,\n currentEvent as ChatEventMap[K],\n );\n return;\n }\n\n const mw = this.middlewares[index++];\n const ctx: MiddlewareContext = {\n event: currentEvent,\n next: () => {\n currentEvent = ctx.event;\n runNext();\n },\n suppress: () => {\n suppressed = true;\n },\n };\n mw(ctx);\n };\n\n runNext();\n }\n\n /**\n * Replace the event in the middleware context.\n * Middleware should mutate ctx.event or create a new MiddlewareContext\n * to transform events passing through the pipeline.\n */\n\n /**\n * Remove all middleware functions.\n */\n clearMiddleware(): void {\n this.middlewares.length = 0;\n }\n\n /**\n * Get the number of registered middleware functions.\n * @returns Number of middleware\n */\n middlewareCount(): number {\n return this.middlewares.length;\n }\n}\n\n// ─── Utility: Event Filtering ─────────────────────────────────\n\n/**\n * Create a filter function that passes only events of specified types.\n *\n * @param types - Event types to allow through\n * @returns Predicate function for filtering ChatEvents\n *\n * @example\n * ```typescript\n * const isTextEvent = eventFilter(\"message:start\", \"message:delta\", \"message:complete\");\n * const textEvents = allEvents.filter(isTextEvent);\n * ```\n */\nexport function eventFilter(\n ...types: ChatEventType[]\n): (event: ChatEvent) => boolean {\n const allowed = new Set<string>(types);\n return (event: ChatEvent) => allowed.has(event.type);\n}\n\n/**\n * Filter an async iterable of ChatEvents to only specified types.\n *\n * @param source - Async iterable of ChatEvents\n * @param types - Event types to keep\n * @returns Async iterable of filtered ChatEvents\n *\n * @example\n * ```typescript\n * for await (const event of filterEvents(stream, \"message:delta\", \"message:complete\")) {\n * // only message:delta and message:complete events\n * }\n * ```\n */\nexport async function* filterEvents(\n source: AsyncIterable<ChatEvent>,\n ...types: ChatEventType[]\n): AsyncIterable<ChatEvent> {\n const pred = eventFilter(...types);\n for await (const event of source) {\n if (pred(event)) {\n yield event;\n }\n }\n}\n\n// ─── Utility: Event Mapping ───────────────────────────────────\n\n/**\n * Map/transform events from an async iterable.\n *\n * @param source - Async iterable of ChatEvents\n * @param transform - Function to transform each event (return null to skip)\n * @returns Async iterable of transformed values\n *\n * @example\n * ```typescript\n * // Extract text from message:delta events\n * const texts = mapEvents(stream, (event) =>\n * event.type === \"message:delta\" ? event.text : null\n * );\n * ```\n */\nexport async function* mapEvents<R>(\n source: AsyncIterable<ChatEvent>,\n transform: (event: ChatEvent) => R | null,\n): AsyncIterable<R> {\n for await (const event of source) {\n const result = transform(event);\n if (result !== null) {\n yield result;\n }\n }\n}\n\n/**\n * Collect text from message:delta events into a single string.\n *\n * @param source - Async iterable of ChatEvents\n * @returns Complete text assembled from message:delta payloads\n *\n * @example\n * ```typescript\n * const fullText = await collectText(stream);\n * ```\n */\nexport async function collectText(\n source: AsyncIterable<ChatEvent>,\n): Promise<string> {\n const parts: string[] = [];\n for await (const event of source) {\n if (event.type === \"message:delta\") {\n parts.push(event.text);\n }\n }\n return parts.join(\"\");\n}\n"]}
@@ -0,0 +1,245 @@
1
+ import { C as ChatEventType, a as ChatEvent } from '../types-DRgd_9R7.cjs';
2
+ import '../agent-DxY68NZL.cjs';
3
+ import 'zod';
4
+ import '../errors-C-so0M4t.cjs';
5
+ import '../types-4vbcmPTp.cjs';
6
+ import '../errors-CmVvczxZ.cjs';
7
+
8
+ /**
9
+ * @witqq/agent-sdk/chat/events
10
+ *
11
+ * Type-safe event emitter, chat event bus, and middleware pipeline.
12
+ * Generic TypedEventEmitter<EventMap> for arbitrary typed event maps.
13
+ * ChatEventBus specializing TypedEventEmitter for ChatEvent types.
14
+ * Middleware support for event interception, transformation, and suppression.
15
+ * Utility functions for filtering and mapping event streams.
16
+ */
17
+
18
+ /** Constraint for event maps: keys are strings, values are payloads */
19
+ type EventMap = Record<string, any>;
20
+ /** Listener callback for a specific event */
21
+ type Listener<T> = (payload: T) => void;
22
+ /** Unsubscribe function returned by on/once */
23
+ type Unsubscribe = () => void;
24
+ /**
25
+ * Generic type-safe event emitter parameterized by an EventMap.
26
+ *
27
+ * @typeParam T - Map of event names to payload types
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * type MyEvents = {
32
+ * message: string;
33
+ * count: number;
34
+ * done: void;
35
+ * };
36
+ * const emitter = new TypedEventEmitter<MyEvents>();
37
+ * emitter.on("message", (text) => console.log(text));
38
+ * emitter.emit("message", "hello");
39
+ * ```
40
+ */
41
+ declare class TypedEventEmitter<T extends EventMap> {
42
+ private readonly listeners;
43
+ /**
44
+ * Subscribe to an event.
45
+ * @param event - Event name
46
+ * @param listener - Callback receiving the event payload
47
+ * @returns Unsubscribe function
48
+ */
49
+ on<K extends keyof T>(event: K, listener: Listener<T[K]>): Unsubscribe;
50
+ /**
51
+ * Subscribe to an event, firing the listener at most once.
52
+ * @param event - Event name
53
+ * @param listener - Callback receiving the event payload
54
+ * @returns Unsubscribe function
55
+ */
56
+ once<K extends keyof T>(event: K, listener: Listener<T[K]>): Unsubscribe;
57
+ /**
58
+ * Remove a specific listener from an event.
59
+ * @param event - Event name
60
+ * @param listener - The listener to remove
61
+ */
62
+ off<K extends keyof T>(event: K, listener: Listener<T[K]>): void;
63
+ /**
64
+ * Emit an event, calling all registered listeners synchronously.
65
+ * @param event - Event name
66
+ * @param payload - Event payload
67
+ */
68
+ emit<K extends keyof T>(event: K, payload: T[K]): void;
69
+ /**
70
+ * Remove all listeners for a specific event, or all events if no event specified.
71
+ * @param event - Optional event name
72
+ */
73
+ removeAllListeners<K extends keyof T>(event?: K): void;
74
+ /**
75
+ * Get the number of listeners for a specific event.
76
+ * @param event - Event name
77
+ * @returns Number of listeners
78
+ */
79
+ listenerCount<K extends keyof T>(event: K): number;
80
+ /**
81
+ * Get all event names that have at least one listener.
82
+ * @returns Array of event names
83
+ */
84
+ eventNames(): Array<keyof T>;
85
+ }
86
+ /**
87
+ * Map of ChatEvent type strings to their corresponding ChatEvent payloads.
88
+ * Used to parameterize TypedEventEmitter for chat events.
89
+ */
90
+ type ChatEventMap = {
91
+ [K in ChatEventType]: Extract<ChatEvent, {
92
+ type: K;
93
+ }>;
94
+ };
95
+ /**
96
+ * Context passed to middleware functions.
97
+ * Contains the event and control methods for the middleware pipeline.
98
+ */
99
+ interface MiddlewareContext {
100
+ /** The current event (may be transformed by prior middleware) */
101
+ event: ChatEvent;
102
+ /** Call the next middleware in the chain, or deliver to listeners if last */
103
+ next: () => void;
104
+ /** Suppress the event — do not deliver to listeners or subsequent middleware */
105
+ suppress: () => void;
106
+ }
107
+ /**
108
+ * Middleware function for intercepting, transforming, or suppressing events.
109
+ * EventMiddleware operates at the ChatEventBus level.
110
+ *
111
+ * @param ctx - Middleware context with event, next(), and suppress()
112
+ *
113
+ * @example
114
+ * ```typescript
115
+ * // Logging middleware
116
+ * const logger: EventMiddleware = (ctx) => {
117
+ * console.log(`Event: ${ctx.event.type}`);
118
+ * ctx.next();
119
+ * };
120
+ *
121
+ * // Suppressing middleware
122
+ * const filter: EventMiddleware = (ctx) => {
123
+ * if (ctx.event.type === "heartbeat") {
124
+ * ctx.suppress();
125
+ * } else {
126
+ * ctx.next();
127
+ * }
128
+ * };
129
+ * ```
130
+ */
131
+ type EventMiddleware = (ctx: MiddlewareContext) => void;
132
+ /**
133
+ * Chat event bus: a typed event emitter specialized for ChatEvent types
134
+ * with middleware pipeline support.
135
+ *
136
+ * Events pass through the middleware pipeline before reaching listeners.
137
+ * Middleware can inspect, transform, or suppress events.
138
+ *
139
+ * @example
140
+ * ```typescript
141
+ * const bus = new ChatEventBus();
142
+ *
143
+ * // Add middleware
144
+ * bus.use((ctx) => {
145
+ * console.log(`[${ctx.event.type}]`);
146
+ * ctx.next();
147
+ * });
148
+ *
149
+ * // Listen for events
150
+ * bus.on("message:delta", (event) => {
151
+ * console.log(event.text);
152
+ * });
153
+ *
154
+ * // Emit events
155
+ * bus.emit("message:delta", { type: "message:delta", messageId: id, text: "hi" });
156
+ * ```
157
+ */
158
+ declare class ChatEventBus extends TypedEventEmitter<ChatEventMap> {
159
+ private readonly middlewares;
160
+ /**
161
+ * Register a middleware function. Middleware runs in registration order.
162
+ * @param middleware - Middleware function
163
+ * @returns Unsubscribe function to remove the middleware
164
+ */
165
+ use(middleware: EventMiddleware): Unsubscribe;
166
+ /**
167
+ * Emit a chat event through the middleware pipeline, then to listeners.
168
+ *
169
+ * @param event - ChatEvent type string
170
+ * @param payload - The full ChatEvent object
171
+ */
172
+ emit<K extends ChatEventType>(event: K, payload: ChatEventMap[K]): void;
173
+ /**
174
+ * Replace the event in the middleware context.
175
+ * Middleware should mutate ctx.event or create a new MiddlewareContext
176
+ * to transform events passing through the pipeline.
177
+ */
178
+ /**
179
+ * Remove all middleware functions.
180
+ */
181
+ clearMiddleware(): void;
182
+ /**
183
+ * Get the number of registered middleware functions.
184
+ * @returns Number of middleware
185
+ */
186
+ middlewareCount(): number;
187
+ }
188
+ /**
189
+ * Create a filter function that passes only events of specified types.
190
+ *
191
+ * @param types - Event types to allow through
192
+ * @returns Predicate function for filtering ChatEvents
193
+ *
194
+ * @example
195
+ * ```typescript
196
+ * const isTextEvent = eventFilter("message:start", "message:delta", "message:complete");
197
+ * const textEvents = allEvents.filter(isTextEvent);
198
+ * ```
199
+ */
200
+ declare function eventFilter(...types: ChatEventType[]): (event: ChatEvent) => boolean;
201
+ /**
202
+ * Filter an async iterable of ChatEvents to only specified types.
203
+ *
204
+ * @param source - Async iterable of ChatEvents
205
+ * @param types - Event types to keep
206
+ * @returns Async iterable of filtered ChatEvents
207
+ *
208
+ * @example
209
+ * ```typescript
210
+ * for await (const event of filterEvents(stream, "message:delta", "message:complete")) {
211
+ * // only message:delta and message:complete events
212
+ * }
213
+ * ```
214
+ */
215
+ declare function filterEvents(source: AsyncIterable<ChatEvent>, ...types: ChatEventType[]): AsyncIterable<ChatEvent>;
216
+ /**
217
+ * Map/transform events from an async iterable.
218
+ *
219
+ * @param source - Async iterable of ChatEvents
220
+ * @param transform - Function to transform each event (return null to skip)
221
+ * @returns Async iterable of transformed values
222
+ *
223
+ * @example
224
+ * ```typescript
225
+ * // Extract text from message:delta events
226
+ * const texts = mapEvents(stream, (event) =>
227
+ * event.type === "message:delta" ? event.text : null
228
+ * );
229
+ * ```
230
+ */
231
+ declare function mapEvents<R>(source: AsyncIterable<ChatEvent>, transform: (event: ChatEvent) => R | null): AsyncIterable<R>;
232
+ /**
233
+ * Collect text from message:delta events into a single string.
234
+ *
235
+ * @param source - Async iterable of ChatEvents
236
+ * @returns Complete text assembled from message:delta payloads
237
+ *
238
+ * @example
239
+ * ```typescript
240
+ * const fullText = await collectText(stream);
241
+ * ```
242
+ */
243
+ declare function collectText(source: AsyncIterable<ChatEvent>): Promise<string>;
244
+
245
+ export { ChatEventBus, type ChatEventMap, type EventMap, type EventMiddleware, type Listener, type MiddlewareContext, TypedEventEmitter, type Unsubscribe, collectText, eventFilter, filterEvents, mapEvents };