beth-copilot 1.0.18 → 1.1.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 (291) hide show
  1. package/CHANGELOG.md +41 -28
  2. package/README.md +87 -247
  3. package/bin/cli.js +158 -358
  4. package/dist/__tests__/smoke.test.d.ts +8 -0
  5. package/dist/__tests__/smoke.test.d.ts.map +1 -0
  6. package/dist/__tests__/smoke.test.js +49 -0
  7. package/dist/__tests__/smoke.test.js.map +1 -0
  8. package/dist/cli/commands/beads.e2e.test.d.ts +13 -0
  9. package/dist/cli/commands/beads.e2e.test.d.ts.map +1 -0
  10. package/dist/cli/commands/beads.e2e.test.js +526 -0
  11. package/dist/cli/commands/beads.e2e.test.js.map +1 -0
  12. package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts +32 -0
  13. package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts.map +1 -0
  14. package/dist/cli/commands/cli-edge-cases.e2e.test.js +162 -0
  15. package/dist/cli/commands/cli-edge-cases.e2e.test.js.map +1 -0
  16. package/dist/cli/commands/close.d.ts +89 -0
  17. package/dist/cli/commands/close.d.ts.map +1 -0
  18. package/dist/cli/commands/close.e2e.test.d.ts +27 -0
  19. package/dist/cli/commands/close.e2e.test.d.ts.map +1 -0
  20. package/dist/cli/commands/close.e2e.test.js +252 -0
  21. package/dist/cli/commands/close.e2e.test.js.map +1 -0
  22. package/dist/cli/commands/close.js +309 -0
  23. package/dist/cli/commands/close.js.map +1 -0
  24. package/dist/cli/commands/close.test.d.ts +15 -0
  25. package/dist/cli/commands/close.test.d.ts.map +1 -0
  26. package/dist/cli/commands/close.test.js +634 -0
  27. package/dist/cli/commands/close.test.js.map +1 -0
  28. package/dist/cli/commands/doctor.d.ts +23 -0
  29. package/dist/cli/commands/doctor.d.ts.map +1 -1
  30. package/dist/cli/commands/doctor.js +93 -0
  31. package/dist/cli/commands/doctor.js.map +1 -1
  32. package/dist/cli/commands/doctor.test.js +209 -0
  33. package/dist/cli/commands/doctor.test.js.map +1 -1
  34. package/dist/cli/commands/framework-isolation.test.d.ts +30 -0
  35. package/dist/cli/commands/framework-isolation.test.d.ts.map +1 -0
  36. package/dist/cli/commands/framework-isolation.test.js +119 -0
  37. package/dist/cli/commands/framework-isolation.test.js.map +1 -0
  38. package/dist/cli/commands/help.e2e.test.js +4 -4
  39. package/dist/cli/commands/help.e2e.test.js.map +1 -1
  40. package/dist/cli/commands/init-logic.e2e.test.d.ts +37 -0
  41. package/dist/cli/commands/init-logic.e2e.test.d.ts.map +1 -0
  42. package/dist/cli/commands/init-logic.e2e.test.js +305 -0
  43. package/dist/cli/commands/init-logic.e2e.test.js.map +1 -0
  44. package/dist/cli/commands/land.d.ts +142 -0
  45. package/dist/cli/commands/land.d.ts.map +1 -0
  46. package/dist/cli/commands/land.js +647 -0
  47. package/dist/cli/commands/land.js.map +1 -0
  48. package/dist/cli/commands/land.test.d.ts +20 -0
  49. package/dist/cli/commands/land.test.d.ts.map +1 -0
  50. package/dist/cli/commands/land.test.js +622 -0
  51. package/dist/cli/commands/land.test.js.map +1 -0
  52. package/dist/cli/commands/mcp.e2e.test.js +22 -29
  53. package/dist/cli/commands/mcp.e2e.test.js.map +1 -1
  54. package/dist/cli/commands/pipeline.e2e.test.js +20 -20
  55. package/dist/cli/commands/pipeline.e2e.test.js.map +1 -1
  56. package/dist/cli/commands/pre-push-guard.d.ts +84 -0
  57. package/dist/cli/commands/pre-push-guard.d.ts.map +1 -0
  58. package/dist/cli/commands/pre-push-guard.e2e.test.d.ts +24 -0
  59. package/dist/cli/commands/pre-push-guard.e2e.test.d.ts.map +1 -0
  60. package/dist/cli/commands/pre-push-guard.e2e.test.js +171 -0
  61. package/dist/cli/commands/pre-push-guard.e2e.test.js.map +1 -0
  62. package/dist/cli/commands/pre-push-guard.js +257 -0
  63. package/dist/cli/commands/pre-push-guard.js.map +1 -0
  64. package/dist/cli/commands/pre-push-guard.test.d.ts +15 -0
  65. package/dist/cli/commands/pre-push-guard.test.d.ts.map +1 -0
  66. package/dist/cli/commands/pre-push-guard.test.js +397 -0
  67. package/dist/cli/commands/pre-push-guard.test.js.map +1 -0
  68. package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts +23 -0
  69. package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts.map +1 -0
  70. package/dist/cli/commands/quickstart-expanded.e2e.test.js +179 -0
  71. package/dist/cli/commands/quickstart-expanded.e2e.test.js.map +1 -0
  72. package/dist/cli/commands/quickstart.d.ts.map +1 -1
  73. package/dist/cli/commands/quickstart.js +7 -23
  74. package/dist/cli/commands/quickstart.js.map +1 -1
  75. package/dist/cli/commands/quickstart.test.js +40 -67
  76. package/dist/cli/commands/quickstart.test.js.map +1 -1
  77. package/dist/core/agents/suite.test.js +4 -2
  78. package/dist/core/agents/suite.test.js.map +1 -1
  79. package/dist/core/agents/tools.test.js +5 -1
  80. package/dist/core/agents/tools.test.js.map +1 -1
  81. package/dist/index.d.ts +3 -10
  82. package/dist/index.d.ts.map +1 -1
  83. package/dist/index.js +5 -10
  84. package/dist/index.js.map +1 -1
  85. package/package.json +15 -9
  86. package/sbom.json +2011 -819
  87. package/templates/.github/agents/beth.agent.md +220 -66
  88. package/templates/.github/agents/developer.agent.md +53 -90
  89. package/templates/.github/agents/product-manager.agent.md +15 -68
  90. package/templates/.github/agents/researcher.agent.md +20 -71
  91. package/templates/.github/agents/security-reviewer.agent.md +29 -81
  92. package/templates/.github/agents/tester.agent.md +40 -69
  93. package/templates/.github/agents/ux-designer.agent.md +20 -74
  94. package/templates/.github/copilot-instructions.md +217 -225
  95. package/templates/AGENTS.md +108 -20
  96. package/templates/mcp.json.example +0 -3
  97. package/dist/cli/commands/client-config.d.ts +0 -31
  98. package/dist/cli/commands/client-config.d.ts.map +0 -1
  99. package/dist/cli/commands/client-config.e2e.test.d.ts +0 -15
  100. package/dist/cli/commands/client-config.e2e.test.d.ts.map +0 -1
  101. package/dist/cli/commands/client-config.e2e.test.js +0 -556
  102. package/dist/cli/commands/client-config.e2e.test.js.map +0 -1
  103. package/dist/cli/commands/client-config.js +0 -73
  104. package/dist/cli/commands/client-config.js.map +0 -1
  105. package/dist/cli/commands/client-config.test.d.ts +0 -6
  106. package/dist/cli/commands/client-config.test.d.ts.map +0 -1
  107. package/dist/cli/commands/client-config.test.js +0 -133
  108. package/dist/cli/commands/client-config.test.js.map +0 -1
  109. package/dist/cli/commands/init-quickstart.e2e.test.d.ts +0 -11
  110. package/dist/cli/commands/init-quickstart.e2e.test.d.ts.map +0 -1
  111. package/dist/cli/commands/init-quickstart.e2e.test.js +0 -221
  112. package/dist/cli/commands/init-quickstart.e2e.test.js.map +0 -1
  113. package/dist/core/context.d.ts +0 -171
  114. package/dist/core/context.d.ts.map +0 -1
  115. package/dist/core/context.js +0 -353
  116. package/dist/core/context.js.map +0 -1
  117. package/dist/core/context.test.d.ts +0 -8
  118. package/dist/core/context.test.d.ts.map +0 -1
  119. package/dist/core/context.test.js +0 -253
  120. package/dist/core/context.test.js.map +0 -1
  121. package/dist/core/handoffs.d.ts +0 -151
  122. package/dist/core/handoffs.d.ts.map +0 -1
  123. package/dist/core/handoffs.js +0 -220
  124. package/dist/core/handoffs.js.map +0 -1
  125. package/dist/core/handoffs.test.d.ts +0 -8
  126. package/dist/core/handoffs.test.d.ts.map +0 -1
  127. package/dist/core/handoffs.test.js +0 -231
  128. package/dist/core/handoffs.test.js.map +0 -1
  129. package/dist/core/orchestrator.d.ts +0 -246
  130. package/dist/core/orchestrator.d.ts.map +0 -1
  131. package/dist/core/orchestrator.js +0 -514
  132. package/dist/core/orchestrator.js.map +0 -1
  133. package/dist/core/orchestrator.test.d.ts +0 -8
  134. package/dist/core/orchestrator.test.d.ts.map +0 -1
  135. package/dist/core/orchestrator.test.js +0 -517
  136. package/dist/core/orchestrator.test.js.map +0 -1
  137. package/dist/core/router.d.ts +0 -102
  138. package/dist/core/router.d.ts.map +0 -1
  139. package/dist/core/router.js +0 -178
  140. package/dist/core/router.js.map +0 -1
  141. package/dist/core/router.test.d.ts +0 -8
  142. package/dist/core/router.test.d.ts.map +0 -1
  143. package/dist/core/router.test.js +0 -215
  144. package/dist/core/router.test.js.map +0 -1
  145. package/dist/init.test.js +0 -288
  146. package/dist/providers/azure.d.ts +0 -147
  147. package/dist/providers/azure.d.ts.map +0 -1
  148. package/dist/providers/azure.js +0 -491
  149. package/dist/providers/azure.js.map +0 -1
  150. package/dist/providers/azure.test.d.ts +0 -11
  151. package/dist/providers/azure.test.d.ts.map +0 -1
  152. package/dist/providers/azure.test.js +0 -330
  153. package/dist/providers/azure.test.js.map +0 -1
  154. package/dist/providers/config.d.ts +0 -87
  155. package/dist/providers/config.d.ts.map +0 -1
  156. package/dist/providers/config.js +0 -193
  157. package/dist/providers/config.js.map +0 -1
  158. package/dist/providers/config.test.d.ts +0 -7
  159. package/dist/providers/config.test.d.ts.map +0 -1
  160. package/dist/providers/config.test.js +0 -370
  161. package/dist/providers/config.test.js.map +0 -1
  162. package/dist/providers/index.d.ts +0 -18
  163. package/dist/providers/index.d.ts.map +0 -1
  164. package/dist/providers/index.js +0 -14
  165. package/dist/providers/index.js.map +0 -1
  166. package/dist/providers/interface.d.ts +0 -191
  167. package/dist/providers/interface.d.ts.map +0 -1
  168. package/dist/providers/interface.js +0 -94
  169. package/dist/providers/interface.js.map +0 -1
  170. package/dist/providers/retry.d.ts +0 -128
  171. package/dist/providers/retry.d.ts.map +0 -1
  172. package/dist/providers/retry.js +0 -205
  173. package/dist/providers/retry.js.map +0 -1
  174. package/dist/providers/retry.test.d.ts +0 -7
  175. package/dist/providers/retry.test.d.ts.map +0 -1
  176. package/dist/providers/retry.test.js +0 -439
  177. package/dist/providers/retry.test.js.map +0 -1
  178. package/dist/providers/streaming.d.ts +0 -157
  179. package/dist/providers/streaming.d.ts.map +0 -1
  180. package/dist/providers/streaming.js +0 -233
  181. package/dist/providers/streaming.js.map +0 -1
  182. package/dist/providers/streaming.test.d.ts +0 -7
  183. package/dist/providers/streaming.test.d.ts.map +0 -1
  184. package/dist/providers/streaming.test.js +0 -372
  185. package/dist/providers/streaming.test.js.map +0 -1
  186. package/dist/providers/types.d.ts +0 -209
  187. package/dist/providers/types.d.ts.map +0 -1
  188. package/dist/providers/types.js +0 -53
  189. package/dist/providers/types.js.map +0 -1
  190. package/dist/providers/types.test.d.ts +0 -7
  191. package/dist/providers/types.test.d.ts.map +0 -1
  192. package/dist/providers/types.test.js +0 -141
  193. package/dist/providers/types.test.js.map +0 -1
  194. package/dist/tools/cli/beads.d.ts +0 -27
  195. package/dist/tools/cli/beads.d.ts.map +0 -1
  196. package/dist/tools/cli/beads.js +0 -172
  197. package/dist/tools/cli/beads.js.map +0 -1
  198. package/dist/tools/cli/beads.test.d.ts +0 -8
  199. package/dist/tools/cli/beads.test.d.ts.map +0 -1
  200. package/dist/tools/cli/beads.test.js +0 -264
  201. package/dist/tools/cli/beads.test.js.map +0 -1
  202. package/dist/tools/cli/editFile.d.ts +0 -17
  203. package/dist/tools/cli/editFile.d.ts.map +0 -1
  204. package/dist/tools/cli/editFile.js +0 -125
  205. package/dist/tools/cli/editFile.js.map +0 -1
  206. package/dist/tools/cli/editFile.test.d.ts +0 -8
  207. package/dist/tools/cli/editFile.test.d.ts.map +0 -1
  208. package/dist/tools/cli/editFile.test.js +0 -177
  209. package/dist/tools/cli/editFile.test.js.map +0 -1
  210. package/dist/tools/cli/readFile.d.ts +0 -25
  211. package/dist/tools/cli/readFile.d.ts.map +0 -1
  212. package/dist/tools/cli/readFile.js +0 -118
  213. package/dist/tools/cli/readFile.js.map +0 -1
  214. package/dist/tools/cli/readFile.test.d.ts +0 -8
  215. package/dist/tools/cli/readFile.test.d.ts.map +0 -1
  216. package/dist/tools/cli/readFile.test.js +0 -194
  217. package/dist/tools/cli/readFile.test.js.map +0 -1
  218. package/dist/tools/cli/search.d.ts +0 -16
  219. package/dist/tools/cli/search.d.ts.map +0 -1
  220. package/dist/tools/cli/search.js +0 -261
  221. package/dist/tools/cli/search.js.map +0 -1
  222. package/dist/tools/cli/search.test.d.ts +0 -8
  223. package/dist/tools/cli/search.test.d.ts.map +0 -1
  224. package/dist/tools/cli/search.test.js +0 -172
  225. package/dist/tools/cli/search.test.js.map +0 -1
  226. package/dist/tools/cli/subagent.d.ts +0 -43
  227. package/dist/tools/cli/subagent.d.ts.map +0 -1
  228. package/dist/tools/cli/subagent.js +0 -99
  229. package/dist/tools/cli/subagent.js.map +0 -1
  230. package/dist/tools/cli/subagent.test.d.ts +0 -8
  231. package/dist/tools/cli/subagent.test.d.ts.map +0 -1
  232. package/dist/tools/cli/subagent.test.js +0 -190
  233. package/dist/tools/cli/subagent.test.js.map +0 -1
  234. package/dist/tools/cli/terminal.d.ts +0 -19
  235. package/dist/tools/cli/terminal.d.ts.map +0 -1
  236. package/dist/tools/cli/terminal.js +0 -164
  237. package/dist/tools/cli/terminal.js.map +0 -1
  238. package/dist/tools/cli/terminal.test.d.ts +0 -8
  239. package/dist/tools/cli/terminal.test.d.ts.map +0 -1
  240. package/dist/tools/cli/terminal.test.js +0 -161
  241. package/dist/tools/cli/terminal.test.js.map +0 -1
  242. package/dist/tools/index.d.ts +0 -25
  243. package/dist/tools/index.d.ts.map +0 -1
  244. package/dist/tools/index.js +0 -41
  245. package/dist/tools/index.js.map +0 -1
  246. package/dist/tools/interface.d.ts +0 -64
  247. package/dist/tools/interface.d.ts.map +0 -1
  248. package/dist/tools/interface.js +0 -37
  249. package/dist/tools/interface.js.map +0 -1
  250. package/dist/tools/interface.test.d.ts +0 -7
  251. package/dist/tools/interface.test.d.ts.map +0 -1
  252. package/dist/tools/interface.test.js +0 -179
  253. package/dist/tools/interface.test.js.map +0 -1
  254. package/dist/tools/mcp/bridge.d.ts +0 -48
  255. package/dist/tools/mcp/bridge.d.ts.map +0 -1
  256. package/dist/tools/mcp/bridge.js +0 -128
  257. package/dist/tools/mcp/bridge.js.map +0 -1
  258. package/dist/tools/mcp/bridge.test.d.ts +0 -8
  259. package/dist/tools/mcp/bridge.test.d.ts.map +0 -1
  260. package/dist/tools/mcp/bridge.test.js +0 -300
  261. package/dist/tools/mcp/bridge.test.js.map +0 -1
  262. package/dist/tools/mcp/client.d.ts +0 -135
  263. package/dist/tools/mcp/client.d.ts.map +0 -1
  264. package/dist/tools/mcp/client.js +0 -263
  265. package/dist/tools/mcp/client.js.map +0 -1
  266. package/dist/tools/mcp/client.test.d.ts +0 -8
  267. package/dist/tools/mcp/client.test.d.ts.map +0 -1
  268. package/dist/tools/mcp/client.test.js +0 -390
  269. package/dist/tools/mcp/client.test.js.map +0 -1
  270. package/dist/tools/registry.d.ts +0 -82
  271. package/dist/tools/registry.d.ts.map +0 -1
  272. package/dist/tools/registry.js +0 -99
  273. package/dist/tools/registry.js.map +0 -1
  274. package/dist/tools/registry.test.d.ts +0 -7
  275. package/dist/tools/registry.test.d.ts.map +0 -1
  276. package/dist/tools/registry.test.js +0 -199
  277. package/dist/tools/registry.test.js.map +0 -1
  278. package/dist/tools/suite.test.d.ts +0 -11
  279. package/dist/tools/suite.test.d.ts.map +0 -1
  280. package/dist/tools/suite.test.js +0 -119
  281. package/dist/tools/suite.test.js.map +0 -1
  282. package/dist/tools/types.d.ts +0 -75
  283. package/dist/tools/types.d.ts.map +0 -1
  284. package/dist/tools/types.js +0 -30
  285. package/dist/tools/types.js.map +0 -1
  286. package/dist/tools/types.test.d.ts +0 -7
  287. package/dist/tools/types.test.d.ts.map +0 -1
  288. package/dist/tools/types.test.js +0 -178
  289. package/dist/tools/types.test.js.map +0 -1
  290. package/templates/.vscode/mcp.json +0 -20
  291. package/templates/CLAUDE.md +0 -129
@@ -1,233 +0,0 @@
1
- /**
2
- * Stream Handler Utilities for LLM Streaming Responses
3
- *
4
- * Provides utilities for processing incremental streaming responses from LLM APIs.
5
- * Handles content accumulation, tool call assembly from deltas, and stream transformation.
6
- */
7
- // =============================================================================
8
- // StreamAccumulator Class
9
- // =============================================================================
10
- /**
11
- * Accumulates streamed chat response chunks into a complete response.
12
- *
13
- * Handles the complexity of:
14
- * - Concatenating content chunks as they arrive
15
- * - Assembling tool calls from incremental deltas (by index)
16
- * - Tracking the finish reason from the final chunk
17
- * - Managing multiple in-flight tool calls simultaneously
18
- *
19
- * @example
20
- * ```typescript
21
- * const accumulator = new StreamAccumulator();
22
- *
23
- * for await (const chunk of stream) {
24
- * accumulator.processChunk(chunk);
25
- * }
26
- *
27
- * console.log(accumulator.getContent());
28
- * console.log(accumulator.getToolCalls());
29
- * console.log(accumulator.getFinishReason());
30
- * ```
31
- */
32
- export class StreamAccumulator {
33
- /** Accumulated text content from all chunks */
34
- content = '';
35
- /** Map of tool call index to partially assembled tool call */
36
- toolCallMap = new Map();
37
- /** Finish reason from the final chunk */
38
- finishReason = null;
39
- /** Role from the response (typically from first chunk) */
40
- role = 'assistant';
41
- /**
42
- * Process a single chunk from the stream.
43
- *
44
- * Updates internal state with any content, tool call deltas,
45
- * role, or finish reason present in the chunk.
46
- *
47
- * @param chunk - The chat chunk to process
48
- */
49
- processChunk(chunk) {
50
- // Accumulate text content
51
- if (chunk.content !== null) {
52
- this.content += chunk.content;
53
- }
54
- // Track role (typically only in first chunk)
55
- if (chunk.role !== undefined) {
56
- this.role = chunk.role;
57
- }
58
- // Track finish reason (only in final chunk)
59
- if (chunk.finish_reason !== null) {
60
- this.finishReason = chunk.finish_reason;
61
- }
62
- // Process tool call deltas
63
- if (chunk.tool_calls !== undefined) {
64
- for (const delta of chunk.tool_calls) {
65
- this.processToolCallDelta(delta);
66
- }
67
- }
68
- }
69
- /**
70
- * Process a tool call delta and merge it into the accumulated state.
71
- *
72
- * Tool calls arrive incrementally:
73
- * - First chunk: id, type, function.name
74
- * - Subsequent chunks: function.arguments (appended)
75
- *
76
- * @param delta - The tool call delta to process
77
- */
78
- processToolCallDelta(delta) {
79
- const { index } = delta;
80
- // Get or create the partial tool call for this index
81
- let partial = this.toolCallMap.get(index);
82
- if (partial === undefined) {
83
- // First delta for this tool call - initialize
84
- partial = {
85
- id: delta.id ?? '',
86
- type: delta.type ?? 'function',
87
- functionName: delta.function?.name ?? '',
88
- functionArguments: delta.function?.arguments ?? '',
89
- };
90
- this.toolCallMap.set(index, partial);
91
- }
92
- else {
93
- // Subsequent delta - merge in new data
94
- if (delta.id !== undefined) {
95
- partial.id = delta.id;
96
- }
97
- if (delta.type !== undefined) {
98
- partial.type = delta.type;
99
- }
100
- if (delta.function?.name !== undefined) {
101
- partial.functionName = delta.function.name;
102
- }
103
- if (delta.function?.arguments !== undefined) {
104
- // Arguments are streamed incrementally - append
105
- partial.functionArguments += delta.function.arguments;
106
- }
107
- }
108
- }
109
- /**
110
- * Get the accumulated text content.
111
- *
112
- * @returns The complete text content from all processed chunks
113
- */
114
- getContent() {
115
- return this.content;
116
- }
117
- /**
118
- * Get the assembled tool calls.
119
- *
120
- * Returns tool calls sorted by their original index order.
121
- *
122
- * @returns Array of fully assembled tool calls
123
- */
124
- getToolCalls() {
125
- // Sort by index to maintain order
126
- const sortedEntries = [...this.toolCallMap.entries()].sort(([a], [b]) => a - b);
127
- return sortedEntries.map(([, partial]) => ({
128
- id: partial.id,
129
- type: partial.type,
130
- function: {
131
- name: partial.functionName,
132
- arguments: partial.functionArguments,
133
- },
134
- }));
135
- }
136
- /**
137
- * Get the finish reason from the final chunk.
138
- *
139
- * @returns The finish reason, or null if stream hasn't finished
140
- */
141
- getFinishReason() {
142
- return this.finishReason;
143
- }
144
- /**
145
- * Get the role of the response.
146
- *
147
- * @returns The chat role (defaults to 'assistant' if not specified)
148
- */
149
- getRole() {
150
- return this.role;
151
- }
152
- /**
153
- * Reset the accumulator for reuse.
154
- *
155
- * Clears all accumulated state, allowing the accumulator to be
156
- * reused for processing a new stream.
157
- */
158
- reset() {
159
- this.content = '';
160
- this.toolCallMap.clear();
161
- this.finishReason = null;
162
- this.role = 'assistant';
163
- }
164
- }
165
- /**
166
- * Consume an entire stream and collect the results.
167
- *
168
- * This is a convenience function that uses StreamAccumulator internally
169
- * to process all chunks and return the final aggregated result.
170
- *
171
- * @param stream - Async iterable of chat chunks
172
- * @returns Promise resolving to the collected stream result
173
- *
174
- * @example
175
- * ```typescript
176
- * const stream = client.streamCompletion(messages);
177
- * const result = await collectStream(stream);
178
- *
179
- * if (result.toolCalls.length > 0) {
180
- * // Handle tool calls
181
- * } else {
182
- * console.log(result.content);
183
- * }
184
- * ```
185
- */
186
- export async function collectStream(stream) {
187
- const accumulator = new StreamAccumulator();
188
- for await (const chunk of stream) {
189
- accumulator.processChunk(chunk);
190
- }
191
- return {
192
- content: accumulator.getContent(),
193
- toolCalls: accumulator.getToolCalls(),
194
- finishReason: accumulator.getFinishReason(),
195
- };
196
- }
197
- /**
198
- * Transform stream chunks using a mapping function.
199
- *
200
- * Creates a new async generator that yields transformed values
201
- * for each chunk in the input stream.
202
- *
203
- * @typeParam T - The output type of the mapper function
204
- * @param stream - Async iterable of chat chunks
205
- * @param mapper - Function to transform each chunk
206
- * @returns Async generator yielding transformed values
207
- *
208
- * @example
209
- * ```typescript
210
- * // Extract just the content from each chunk
211
- * const contentStream = mapStream(stream, (chunk) => chunk.content ?? '');
212
- *
213
- * for await (const text of contentStream) {
214
- * process.stdout.write(text);
215
- * }
216
- * ```
217
- *
218
- * @example
219
- * ```typescript
220
- * // Transform to custom event format
221
- * const eventStream = mapStream(stream, (chunk) => ({
222
- * type: 'delta',
223
- * text: chunk.content,
224
- * done: chunk.finish_reason !== null,
225
- * }));
226
- * ```
227
- */
228
- export async function* mapStream(stream, mapper) {
229
- for await (const chunk of stream) {
230
- yield mapper(chunk);
231
- }
232
- }
233
- //# sourceMappingURL=streaming.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../src/providers/streaming.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- /**
2
- * Stream Handler Utility Tests
3
- *
4
- * Tests for StreamAccumulator, collectStream, and mapStream.
5
- */
6
- export {};
7
- //# sourceMappingURL=streaming.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"streaming.test.d.ts","sourceRoot":"","sources":["../../src/providers/streaming.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -1,372 +0,0 @@
1
- /**
2
- * Stream Handler Utility Tests
3
- *
4
- * Tests for StreamAccumulator, collectStream, and mapStream.
5
- */
6
- import { describe, it } from 'node:test';
7
- import assert from 'node:assert';
8
- import { StreamAccumulator, collectStream, mapStream } from './streaming.js';
9
- /**
10
- * Helper to create async iterable from array of chunks.
11
- */
12
- async function* asyncIterableFromArray(chunks) {
13
- for (const chunk of chunks) {
14
- yield chunk;
15
- }
16
- }
17
- /**
18
- * Helper to create a basic ChatChunk.
19
- */
20
- function createChunk(overrides = {}) {
21
- return {
22
- id: 'test-id',
23
- content: null,
24
- finish_reason: null,
25
- ...overrides,
26
- };
27
- }
28
- describe('StreamAccumulator', () => {
29
- describe('content accumulation', () => {
30
- it('should accumulate content from multiple chunks', () => {
31
- const accumulator = new StreamAccumulator();
32
- accumulator.processChunk(createChunk({ content: 'Hello' }));
33
- accumulator.processChunk(createChunk({ content: ' ' }));
34
- accumulator.processChunk(createChunk({ content: 'World' }));
35
- assert.strictEqual(accumulator.getContent(), 'Hello World');
36
- });
37
- it('should return empty string when no content received', () => {
38
- const accumulator = new StreamAccumulator();
39
- assert.strictEqual(accumulator.getContent(), '');
40
- });
41
- it('should handle single chunk with content', () => {
42
- const accumulator = new StreamAccumulator();
43
- accumulator.processChunk(createChunk({ content: 'Complete message' }));
44
- assert.strictEqual(accumulator.getContent(), 'Complete message');
45
- });
46
- it('should skip null content chunks (no accumulation)', () => {
47
- const accumulator = new StreamAccumulator();
48
- accumulator.processChunk(createChunk({ content: 'Start' }));
49
- accumulator.processChunk(createChunk({ content: null }));
50
- accumulator.processChunk(createChunk({ content: 'End' }));
51
- assert.strictEqual(accumulator.getContent(), 'StartEnd');
52
- });
53
- it('should handle empty string content', () => {
54
- const accumulator = new StreamAccumulator();
55
- accumulator.processChunk(createChunk({ content: 'A' }));
56
- accumulator.processChunk(createChunk({ content: '' }));
57
- accumulator.processChunk(createChunk({ content: 'B' }));
58
- assert.strictEqual(accumulator.getContent(), 'AB');
59
- });
60
- });
61
- describe('role tracking', () => {
62
- it('should track role from first chunk', () => {
63
- const accumulator = new StreamAccumulator();
64
- accumulator.processChunk(createChunk({ role: 'assistant', content: 'Hello' }));
65
- accumulator.processChunk(createChunk({ content: ' World' }));
66
- assert.strictEqual(accumulator.getRole(), 'assistant');
67
- });
68
- it('should default to assistant role', () => {
69
- const accumulator = new StreamAccumulator();
70
- assert.strictEqual(accumulator.getRole(), 'assistant');
71
- });
72
- it('should update role if provided in later chunk', () => {
73
- const accumulator = new StreamAccumulator();
74
- accumulator.processChunk(createChunk({ role: 'user' }));
75
- accumulator.processChunk(createChunk({ role: 'assistant' }));
76
- assert.strictEqual(accumulator.getRole(), 'assistant');
77
- });
78
- });
79
- describe('finish_reason tracking', () => {
80
- it('should track finish_reason from final chunk', () => {
81
- const accumulator = new StreamAccumulator();
82
- accumulator.processChunk(createChunk({ content: 'Hello' }));
83
- accumulator.processChunk(createChunk({ content: ' World', finish_reason: 'stop' }));
84
- assert.strictEqual(accumulator.getFinishReason(), 'stop');
85
- });
86
- it('should return null if stream has not finished', () => {
87
- const accumulator = new StreamAccumulator();
88
- accumulator.processChunk(createChunk({ content: 'Hello' }));
89
- assert.strictEqual(accumulator.getFinishReason(), null);
90
- });
91
- it('should handle tool_calls finish reason', () => {
92
- const accumulator = new StreamAccumulator();
93
- accumulator.processChunk(createChunk({ finish_reason: 'tool_calls' }));
94
- assert.strictEqual(accumulator.getFinishReason(), 'tool_calls');
95
- });
96
- it('should handle length finish reason', () => {
97
- const accumulator = new StreamAccumulator();
98
- accumulator.processChunk(createChunk({ finish_reason: 'length' }));
99
- assert.strictEqual(accumulator.getFinishReason(), 'length');
100
- });
101
- it('should handle content_filter finish reason', () => {
102
- const accumulator = new StreamAccumulator();
103
- accumulator.processChunk(createChunk({ finish_reason: 'content_filter' }));
104
- assert.strictEqual(accumulator.getFinishReason(), 'content_filter');
105
- });
106
- });
107
- describe('tool call assembly', () => {
108
- it('should assemble tool calls from deltas', () => {
109
- const accumulator = new StreamAccumulator();
110
- // First chunk: id, type, function name (beginning of tool call)
111
- const delta1 = {
112
- index: 0,
113
- id: 'call_123',
114
- type: 'function',
115
- function: {
116
- name: 'get_weather',
117
- arguments: '',
118
- },
119
- };
120
- // Second chunk: arguments (streamed incrementally)
121
- const delta2 = {
122
- index: 0,
123
- function: {
124
- arguments: '{"city":',
125
- },
126
- };
127
- // Third chunk: more arguments
128
- const delta3 = {
129
- index: 0,
130
- function: {
131
- arguments: '"NYC"}',
132
- },
133
- };
134
- accumulator.processChunk(createChunk({ tool_calls: [delta1] }));
135
- accumulator.processChunk(createChunk({ tool_calls: [delta2] }));
136
- accumulator.processChunk(createChunk({ tool_calls: [delta3] }));
137
- const toolCalls = accumulator.getToolCalls();
138
- assert.strictEqual(toolCalls.length, 1);
139
- assert.strictEqual(toolCalls[0].id, 'call_123');
140
- assert.strictEqual(toolCalls[0].type, 'function');
141
- assert.strictEqual(toolCalls[0].function.name, 'get_weather');
142
- assert.strictEqual(toolCalls[0].function.arguments, '{"city":"NYC"}');
143
- });
144
- it('should handle multiple simultaneous tool calls (different indices)', () => {
145
- const accumulator = new StreamAccumulator();
146
- // First tool call
147
- const delta0 = {
148
- index: 0,
149
- id: 'call_1',
150
- type: 'function',
151
- function: { name: 'tool_a', arguments: '{}' },
152
- };
153
- // Second tool call
154
- const delta1 = {
155
- index: 1,
156
- id: 'call_2',
157
- type: 'function',
158
- function: { name: 'tool_b', arguments: '{"x":1}' },
159
- };
160
- accumulator.processChunk(createChunk({ tool_calls: [delta0, delta1] }));
161
- const toolCalls = accumulator.getToolCalls();
162
- assert.strictEqual(toolCalls.length, 2);
163
- assert.strictEqual(toolCalls[0].id, 'call_1');
164
- assert.strictEqual(toolCalls[0].function.name, 'tool_a');
165
- assert.strictEqual(toolCalls[1].id, 'call_2');
166
- assert.strictEqual(toolCalls[1].function.name, 'tool_b');
167
- });
168
- it('should sort tool calls by index', () => {
169
- const accumulator = new StreamAccumulator();
170
- // Receive tool calls out of order
171
- accumulator.processChunk(createChunk({
172
- tool_calls: [
173
- { index: 2, id: 'call_3', type: 'function', function: { name: 'c', arguments: '' } },
174
- ],
175
- }));
176
- accumulator.processChunk(createChunk({
177
- tool_calls: [
178
- { index: 0, id: 'call_1', type: 'function', function: { name: 'a', arguments: '' } },
179
- ],
180
- }));
181
- accumulator.processChunk(createChunk({
182
- tool_calls: [
183
- { index: 1, id: 'call_2', type: 'function', function: { name: 'b', arguments: '' } },
184
- ],
185
- }));
186
- const toolCalls = accumulator.getToolCalls();
187
- assert.strictEqual(toolCalls.length, 3);
188
- assert.strictEqual(toolCalls[0].function.name, 'a');
189
- assert.strictEqual(toolCalls[1].function.name, 'b');
190
- assert.strictEqual(toolCalls[2].function.name, 'c');
191
- });
192
- it('should return empty array when no tool calls', () => {
193
- const accumulator = new StreamAccumulator();
194
- accumulator.processChunk(createChunk({ content: 'Hello' }));
195
- const toolCalls = accumulator.getToolCalls();
196
- assert.deepStrictEqual(toolCalls, []);
197
- });
198
- it('should handle tool call with empty function details', () => {
199
- const accumulator = new StreamAccumulator();
200
- const delta = {
201
- index: 0,
202
- };
203
- accumulator.processChunk(createChunk({ tool_calls: [delta] }));
204
- const toolCalls = accumulator.getToolCalls();
205
- assert.strictEqual(toolCalls.length, 1);
206
- assert.strictEqual(toolCalls[0].id, '');
207
- assert.strictEqual(toolCalls[0].function.name, '');
208
- assert.strictEqual(toolCalls[0].function.arguments, '');
209
- });
210
- it('should merge tool call updates correctly', () => {
211
- const accumulator = new StreamAccumulator();
212
- // First: partial info
213
- accumulator.processChunk(createChunk({
214
- tool_calls: [{ index: 0, id: 'original_id' }],
215
- }));
216
- // Second: update with name
217
- accumulator.processChunk(createChunk({
218
- tool_calls: [{ index: 0, function: { name: 'my_function' } }],
219
- }));
220
- // Third: update with arguments
221
- accumulator.processChunk(createChunk({
222
- tool_calls: [{ index: 0, function: { arguments: '{"a":1}' } }],
223
- }));
224
- const toolCalls = accumulator.getToolCalls();
225
- assert.strictEqual(toolCalls[0].id, 'original_id');
226
- assert.strictEqual(toolCalls[0].function.name, 'my_function');
227
- assert.strictEqual(toolCalls[0].function.arguments, '{"a":1}');
228
- });
229
- });
230
- describe('reset', () => {
231
- it('should clear all state', () => {
232
- const accumulator = new StreamAccumulator();
233
- accumulator.processChunk(createChunk({ content: 'Hello', role: 'user' }));
234
- accumulator.processChunk(createChunk({ finish_reason: 'stop' }));
235
- accumulator.processChunk(createChunk({
236
- tool_calls: [
237
- { index: 0, id: 'call_1', type: 'function', function: { name: 'test', arguments: '{}' } },
238
- ],
239
- }));
240
- accumulator.reset();
241
- assert.strictEqual(accumulator.getContent(), '');
242
- assert.strictEqual(accumulator.getRole(), 'assistant');
243
- assert.strictEqual(accumulator.getFinishReason(), null);
244
- assert.deepStrictEqual(accumulator.getToolCalls(), []);
245
- });
246
- it('should allow reuse after reset', () => {
247
- const accumulator = new StreamAccumulator();
248
- accumulator.processChunk(createChunk({ content: 'First' }));
249
- accumulator.reset();
250
- accumulator.processChunk(createChunk({ content: 'Second' }));
251
- assert.strictEqual(accumulator.getContent(), 'Second');
252
- });
253
- });
254
- });
255
- describe('collectStream', () => {
256
- it('should collect complete stream into result', async () => {
257
- const chunks = [
258
- createChunk({ role: 'assistant', content: 'Hello' }),
259
- createChunk({ content: ' World' }),
260
- createChunk({ content: '!', finish_reason: 'stop' }),
261
- ];
262
- const result = await collectStream(asyncIterableFromArray(chunks));
263
- assert.strictEqual(result.content, 'Hello World!');
264
- assert.strictEqual(result.finishReason, 'stop');
265
- assert.deepStrictEqual(result.toolCalls, []);
266
- });
267
- it('should return content, toolCalls, and finishReason', async () => {
268
- const chunks = [
269
- createChunk({
270
- content: '',
271
- tool_calls: [
272
- { index: 0, id: 'tc_1', type: 'function', function: { name: 'test', arguments: '{}' } },
273
- ],
274
- }),
275
- createChunk({ finish_reason: 'tool_calls' }),
276
- ];
277
- const result = await collectStream(asyncIterableFromArray(chunks));
278
- assert.strictEqual(result.finishReason, 'tool_calls');
279
- assert.strictEqual(result.toolCalls.length, 1);
280
- assert.strictEqual(result.toolCalls[0].id, 'tc_1');
281
- });
282
- it('should work with empty stream', async () => {
283
- const chunks = [];
284
- const result = await collectStream(asyncIterableFromArray(chunks));
285
- assert.strictEqual(result.content, '');
286
- assert.strictEqual(result.finishReason, null);
287
- assert.deepStrictEqual(result.toolCalls, []);
288
- });
289
- it('should handle stream with only null content', async () => {
290
- const chunks = [
291
- createChunk({ content: null }),
292
- createChunk({ content: null, finish_reason: 'stop' }),
293
- ];
294
- const result = await collectStream(asyncIterableFromArray(chunks));
295
- assert.strictEqual(result.content, '');
296
- assert.strictEqual(result.finishReason, 'stop');
297
- });
298
- });
299
- describe('mapStream', () => {
300
- it('should transform chunks through mapper function', async () => {
301
- const chunks = [
302
- createChunk({ content: 'A' }),
303
- createChunk({ content: 'B' }),
304
- createChunk({ content: 'C' }),
305
- ];
306
- const mappedStream = mapStream(asyncIterableFromArray(chunks), (chunk) => chunk.content ?? '');
307
- const results = [];
308
- for await (const value of mappedStream) {
309
- results.push(value);
310
- }
311
- assert.deepStrictEqual(results, ['A', 'B', 'C']);
312
- });
313
- it('should preserve iteration order', async () => {
314
- const chunks = [
315
- createChunk({ id: '1', content: 'first' }),
316
- createChunk({ id: '2', content: 'second' }),
317
- createChunk({ id: '3', content: 'third' }),
318
- ];
319
- const mappedStream = mapStream(asyncIterableFromArray(chunks), (chunk) => chunk.id);
320
- const results = [];
321
- for await (const value of mappedStream) {
322
- results.push(value);
323
- }
324
- assert.deepStrictEqual(results, ['1', '2', '3']);
325
- });
326
- it('should transform to different type', async () => {
327
- const chunks = [
328
- createChunk({ content: 'hello' }),
329
- createChunk({ content: 'world' }),
330
- ];
331
- const mappedStream = mapStream(asyncIterableFromArray(chunks), (chunk) => ({
332
- text: chunk.content,
333
- length: chunk.content?.length ?? 0,
334
- }));
335
- const results = [];
336
- for await (const value of mappedStream) {
337
- results.push(value);
338
- }
339
- assert.deepStrictEqual(results, [
340
- { text: 'hello', length: 5 },
341
- { text: 'world', length: 5 },
342
- ]);
343
- });
344
- it('should work with empty stream', async () => {
345
- const chunks = [];
346
- const mappedStream = mapStream(asyncIterableFromArray(chunks), (chunk) => chunk.content);
347
- const results = [];
348
- for await (const value of mappedStream) {
349
- results.push(value);
350
- }
351
- assert.deepStrictEqual(results, []);
352
- });
353
- it('should handle mapper that extracts complex data', async () => {
354
- const chunks = [
355
- createChunk({ id: 'c1', content: 'text', finish_reason: null }),
356
- createChunk({ id: 'c2', content: null, finish_reason: 'stop' }),
357
- ];
358
- const mappedStream = mapStream(asyncIterableFromArray(chunks), (chunk) => ({
359
- id: chunk.id,
360
- done: chunk.finish_reason !== null,
361
- }));
362
- const results = [];
363
- for await (const value of mappedStream) {
364
- results.push(value);
365
- }
366
- assert.deepStrictEqual(results, [
367
- { id: 'c1', done: false },
368
- { id: 'c2', done: true },
369
- ]);
370
- });
371
- });
372
- //# sourceMappingURL=streaming.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"streaming.test.js","sourceRoot":"","sources":["../../src/providers/streaming.test.ts"],"names":[],"mappings":"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"}