moderado 0.3.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 (275) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +208 -0
  3. package/dist/args.d.ts +26 -0
  4. package/dist/args.d.ts.map +1 -0
  5. package/dist/args.js +108 -0
  6. package/dist/args.js.map +1 -0
  7. package/dist/commands/chat.d.ts +121 -0
  8. package/dist/commands/chat.d.ts.map +1 -0
  9. package/dist/commands/chat.js +1484 -0
  10. package/dist/commands/chat.js.map +1 -0
  11. package/dist/commands/doctor.d.ts +3 -0
  12. package/dist/commands/doctor.d.ts.map +1 -0
  13. package/dist/commands/doctor.js +61 -0
  14. package/dist/commands/doctor.js.map +1 -0
  15. package/dist/commands/init.d.ts +27 -0
  16. package/dist/commands/init.d.ts.map +1 -0
  17. package/dist/commands/init.js +172 -0
  18. package/dist/commands/init.js.map +1 -0
  19. package/dist/commands/interactive_menu.d.ts +3 -0
  20. package/dist/commands/interactive_menu.d.ts.map +1 -0
  21. package/dist/commands/interactive_menu.js +98 -0
  22. package/dist/commands/interactive_menu.js.map +1 -0
  23. package/dist/commands/models.d.ts +8 -0
  24. package/dist/commands/models.d.ts.map +1 -0
  25. package/dist/commands/models.js +81 -0
  26. package/dist/commands/models.js.map +1 -0
  27. package/dist/commands/run.d.ts +3 -0
  28. package/dist/commands/run.d.ts.map +1 -0
  29. package/dist/commands/run.js +140 -0
  30. package/dist/commands/run.js.map +1 -0
  31. package/dist/config.d.ts +44 -0
  32. package/dist/config.d.ts.map +1 -0
  33. package/dist/config.js +195 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/credentials.d.ts +14 -0
  36. package/dist/credentials.d.ts.map +1 -0
  37. package/dist/credentials.js +23 -0
  38. package/dist/credentials.js.map +1 -0
  39. package/dist/diagnostic_log.d.ts +2 -0
  40. package/dist/diagnostic_log.d.ts.map +1 -0
  41. package/dist/diagnostic_log.js +21 -0
  42. package/dist/diagnostic_log.js.map +1 -0
  43. package/dist/index.d.ts +3 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +83 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/model_pricing.d.ts +4 -0
  48. package/dist/model_pricing.d.ts.map +1 -0
  49. package/dist/model_pricing.js +10 -0
  50. package/dist/model_pricing.js.map +1 -0
  51. package/dist/sessions.d.ts +203 -0
  52. package/dist/sessions.d.ts.map +1 -0
  53. package/dist/sessions.js +82 -0
  54. package/dist/sessions.js.map +1 -0
  55. package/dist/ui/box.d.ts +14 -0
  56. package/dist/ui/box.d.ts.map +1 -0
  57. package/dist/ui/box.js +52 -0
  58. package/dist/ui/box.js.map +1 -0
  59. package/dist/ui/file_mentions.d.ts +38 -0
  60. package/dist/ui/file_mentions.d.ts.map +1 -0
  61. package/dist/ui/file_mentions.js +119 -0
  62. package/dist/ui/file_mentions.js.map +1 -0
  63. package/dist/ui/help_modal.d.ts +2 -0
  64. package/dist/ui/help_modal.d.ts.map +1 -0
  65. package/dist/ui/help_modal.js +101 -0
  66. package/dist/ui/help_modal.js.map +1 -0
  67. package/dist/ui/model_selector.d.ts +48 -0
  68. package/dist/ui/model_selector.d.ts.map +1 -0
  69. package/dist/ui/model_selector.js +829 -0
  70. package/dist/ui/model_selector.js.map +1 -0
  71. package/dist/ui/popup.d.ts +78 -0
  72. package/dist/ui/popup.d.ts.map +1 -0
  73. package/dist/ui/popup.js +274 -0
  74. package/dist/ui/popup.js.map +1 -0
  75. package/dist/ui/prompt.d.ts +21 -0
  76. package/dist/ui/prompt.d.ts.map +1 -0
  77. package/dist/ui/prompt.js +128 -0
  78. package/dist/ui/prompt.js.map +1 -0
  79. package/dist/ui/provider_connect.d.ts +33 -0
  80. package/dist/ui/provider_connect.d.ts.map +1 -0
  81. package/dist/ui/provider_connect.js +175 -0
  82. package/dist/ui/provider_connect.js.map +1 -0
  83. package/dist/ui/renderer.d.ts +19 -0
  84. package/dist/ui/renderer.d.ts.map +1 -0
  85. package/dist/ui/renderer.js +147 -0
  86. package/dist/ui/renderer.js.map +1 -0
  87. package/dist/ui/session_screen.d.ts +32 -0
  88. package/dist/ui/session_screen.d.ts.map +1 -0
  89. package/dist/ui/session_screen.js +148 -0
  90. package/dist/ui/session_screen.js.map +1 -0
  91. package/dist/ui/session_terminal.d.ts +46 -0
  92. package/dist/ui/session_terminal.d.ts.map +1 -0
  93. package/dist/ui/session_terminal.js +342 -0
  94. package/dist/ui/session_terminal.js.map +1 -0
  95. package/dist/ui/terminal_approval.d.ts +14 -0
  96. package/dist/ui/terminal_approval.d.ts.map +1 -0
  97. package/dist/ui/terminal_approval.js +98 -0
  98. package/dist/ui/terminal_approval.js.map +1 -0
  99. package/dist/ui/welcome.d.ts +130 -0
  100. package/dist/ui/welcome.d.ts.map +1 -0
  101. package/dist/ui/welcome.js +990 -0
  102. package/dist/ui/welcome.js.map +1 -0
  103. package/dist/vendor/contracts/approvals.d.ts +91 -0
  104. package/dist/vendor/contracts/approvals.d.ts.map +1 -0
  105. package/dist/vendor/contracts/approvals.js +22 -0
  106. package/dist/vendor/contracts/approvals.js.map +1 -0
  107. package/dist/vendor/contracts/events.d.ts +1215 -0
  108. package/dist/vendor/contracts/events.d.ts.map +1 -0
  109. package/dist/vendor/contracts/events.js +94 -0
  110. package/dist/vendor/contracts/events.js.map +1 -0
  111. package/dist/vendor/contracts/index.d.ts +7 -0
  112. package/dist/vendor/contracts/index.d.ts.map +1 -0
  113. package/dist/vendor/contracts/index.js +7 -0
  114. package/dist/vendor/contracts/index.js.map +1 -0
  115. package/dist/vendor/contracts/messages.d.ts +181 -0
  116. package/dist/vendor/contracts/messages.d.ts.map +1 -0
  117. package/dist/vendor/contracts/messages.js +40 -0
  118. package/dist/vendor/contracts/messages.js.map +1 -0
  119. package/dist/vendor/contracts/models.d.ts +117 -0
  120. package/dist/vendor/contracts/models.d.ts.map +1 -0
  121. package/dist/vendor/contracts/models.js +37 -0
  122. package/dist/vendor/contracts/models.js.map +1 -0
  123. package/dist/vendor/contracts/provider.d.ts +121 -0
  124. package/dist/vendor/contracts/provider.d.ts.map +1 -0
  125. package/dist/vendor/contracts/provider.js +64 -0
  126. package/dist/vendor/contracts/provider.js.map +1 -0
  127. package/dist/vendor/contracts/tools.d.ts +305 -0
  128. package/dist/vendor/contracts/tools.d.ts.map +1 -0
  129. package/dist/vendor/contracts/tools.js +65 -0
  130. package/dist/vendor/contracts/tools.js.map +1 -0
  131. package/dist/vendor/core/agent.d.ts +39 -0
  132. package/dist/vendor/core/agent.d.ts.map +1 -0
  133. package/dist/vendor/core/agent.js +710 -0
  134. package/dist/vendor/core/agent.js.map +1 -0
  135. package/dist/vendor/core/host_event_stream.d.ts +9 -0
  136. package/dist/vendor/core/host_event_stream.d.ts.map +1 -0
  137. package/dist/vendor/core/host_event_stream.js +12 -0
  138. package/dist/vendor/core/host_event_stream.js.map +1 -0
  139. package/dist/vendor/core/index.d.ts +7 -0
  140. package/dist/vendor/core/index.d.ts.map +1 -0
  141. package/dist/vendor/core/index.js +7 -0
  142. package/dist/vendor/core/index.js.map +1 -0
  143. package/dist/vendor/core/policy.d.ts +19 -0
  144. package/dist/vendor/core/policy.d.ts.map +1 -0
  145. package/dist/vendor/core/policy.js +31 -0
  146. package/dist/vendor/core/policy.js.map +1 -0
  147. package/dist/vendor/core/router.d.ts +26 -0
  148. package/dist/vendor/core/router.d.ts.map +1 -0
  149. package/dist/vendor/core/router.js +222 -0
  150. package/dist/vendor/core/router.js.map +1 -0
  151. package/dist/vendor/core/subagent.d.ts +29 -0
  152. package/dist/vendor/core/subagent.d.ts.map +1 -0
  153. package/dist/vendor/core/subagent.js +66 -0
  154. package/dist/vendor/core/subagent.js.map +1 -0
  155. package/dist/vendor/core/think_filter.d.ts +14 -0
  156. package/dist/vendor/core/think_filter.d.ts.map +1 -0
  157. package/dist/vendor/core/think_filter.js +136 -0
  158. package/dist/vendor/core/think_filter.js.map +1 -0
  159. package/dist/vendor/providers/fake/fake_provider.d.ts +16 -0
  160. package/dist/vendor/providers/fake/fake_provider.d.ts.map +1 -0
  161. package/dist/vendor/providers/fake/fake_provider.js +89 -0
  162. package/dist/vendor/providers/fake/fake_provider.js.map +1 -0
  163. package/dist/vendor/providers/index.d.ts +6 -0
  164. package/dist/vendor/providers/index.d.ts.map +1 -0
  165. package/dist/vendor/providers/index.js +6 -0
  166. package/dist/vendor/providers/index.js.map +1 -0
  167. package/dist/vendor/providers/model_discovery.d.ts +28 -0
  168. package/dist/vendor/providers/model_discovery.d.ts.map +1 -0
  169. package/dist/vendor/providers/model_discovery.js +106 -0
  170. package/dist/vendor/providers/model_discovery.js.map +1 -0
  171. package/dist/vendor/providers/nvidia/nvidia_adapter.d.ts +23 -0
  172. package/dist/vendor/providers/nvidia/nvidia_adapter.d.ts.map +1 -0
  173. package/dist/vendor/providers/nvidia/nvidia_adapter.js +197 -0
  174. package/dist/vendor/providers/nvidia/nvidia_adapter.js.map +1 -0
  175. package/dist/vendor/providers/nvidia/sse_parser.d.ts +3 -0
  176. package/dist/vendor/providers/nvidia/sse_parser.d.ts.map +1 -0
  177. package/dist/vendor/providers/nvidia/sse_parser.js +84 -0
  178. package/dist/vendor/providers/nvidia/sse_parser.js.map +1 -0
  179. package/dist/vendor/providers/openai_compatible_adapter.d.ts +10 -0
  180. package/dist/vendor/providers/openai_compatible_adapter.d.ts.map +1 -0
  181. package/dist/vendor/providers/openai_compatible_adapter.js +8 -0
  182. package/dist/vendor/providers/openai_compatible_adapter.js.map +1 -0
  183. package/dist/vendor/tools/checkpoints.d.ts +27 -0
  184. package/dist/vendor/tools/checkpoints.d.ts.map +1 -0
  185. package/dist/vendor/tools/checkpoints.js +145 -0
  186. package/dist/vendor/tools/checkpoints.js.map +1 -0
  187. package/dist/vendor/tools/diagnostics.d.ts +11 -0
  188. package/dist/vendor/tools/diagnostics.d.ts.map +1 -0
  189. package/dist/vendor/tools/diagnostics.js +16 -0
  190. package/dist/vendor/tools/diagnostics.js.map +1 -0
  191. package/dist/vendor/tools/diff.d.ts +7 -0
  192. package/dist/vendor/tools/diff.d.ts.map +1 -0
  193. package/dist/vendor/tools/diff.js +48 -0
  194. package/dist/vendor/tools/diff.js.map +1 -0
  195. package/dist/vendor/tools/errors.d.ts +17 -0
  196. package/dist/vendor/tools/errors.d.ts.map +1 -0
  197. package/dist/vendor/tools/errors.js +33 -0
  198. package/dist/vendor/tools/errors.js.map +1 -0
  199. package/dist/vendor/tools/git_workspace.d.ts +14 -0
  200. package/dist/vendor/tools/git_workspace.d.ts.map +1 -0
  201. package/dist/vendor/tools/git_workspace.js +42 -0
  202. package/dist/vendor/tools/git_workspace.js.map +1 -0
  203. package/dist/vendor/tools/index.d.ts +22 -0
  204. package/dist/vendor/tools/index.d.ts.map +1 -0
  205. package/dist/vendor/tools/index.js +22 -0
  206. package/dist/vendor/tools/index.js.map +1 -0
  207. package/dist/vendor/tools/jail.d.ts +17 -0
  208. package/dist/vendor/tools/jail.d.ts.map +1 -0
  209. package/dist/vendor/tools/jail.js +221 -0
  210. package/dist/vendor/tools/jail.js.map +1 -0
  211. package/dist/vendor/tools/lsp.d.ts +3 -0
  212. package/dist/vendor/tools/lsp.d.ts.map +1 -0
  213. package/dist/vendor/tools/lsp.js +43 -0
  214. package/dist/vendor/tools/lsp.js.map +1 -0
  215. package/dist/vendor/tools/mcp.d.ts +9 -0
  216. package/dist/vendor/tools/mcp.d.ts.map +1 -0
  217. package/dist/vendor/tools/mcp.js +54 -0
  218. package/dist/vendor/tools/mcp.js.map +1 -0
  219. package/dist/vendor/tools/mcp_adapter.d.ts +15 -0
  220. package/dist/vendor/tools/mcp_adapter.d.ts.map +1 -0
  221. package/dist/vendor/tools/mcp_adapter.js +29 -0
  222. package/dist/vendor/tools/mcp_adapter.js.map +1 -0
  223. package/dist/vendor/tools/registry.d.ts +10 -0
  224. package/dist/vendor/tools/registry.d.ts.map +1 -0
  225. package/dist/vendor/tools/registry.js +126 -0
  226. package/dist/vendor/tools/registry.js.map +1 -0
  227. package/dist/vendor/tools/tools/apply_patch.d.ts +3 -0
  228. package/dist/vendor/tools/tools/apply_patch.d.ts.map +1 -0
  229. package/dist/vendor/tools/tools/apply_patch.js +49 -0
  230. package/dist/vendor/tools/tools/apply_patch.js.map +1 -0
  231. package/dist/vendor/tools/tools/edit_file.d.ts +3 -0
  232. package/dist/vendor/tools/tools/edit_file.d.ts.map +1 -0
  233. package/dist/vendor/tools/tools/edit_file.js +71 -0
  234. package/dist/vendor/tools/tools/edit_file.js.map +1 -0
  235. package/dist/vendor/tools/tools/git_diff.d.ts +3 -0
  236. package/dist/vendor/tools/tools/git_diff.d.ts.map +1 -0
  237. package/dist/vendor/tools/tools/git_diff.js +91 -0
  238. package/dist/vendor/tools/tools/git_diff.js.map +1 -0
  239. package/dist/vendor/tools/tools/language_intelligence.d.ts +4 -0
  240. package/dist/vendor/tools/tools/language_intelligence.d.ts.map +1 -0
  241. package/dist/vendor/tools/tools/language_intelligence.js +13 -0
  242. package/dist/vendor/tools/tools/language_intelligence.js.map +1 -0
  243. package/dist/vendor/tools/tools/list_files.d.ts +9 -0
  244. package/dist/vendor/tools/tools/list_files.d.ts.map +1 -0
  245. package/dist/vendor/tools/tools/list_files.js +165 -0
  246. package/dist/vendor/tools/tools/list_files.js.map +1 -0
  247. package/dist/vendor/tools/tools/read_file.d.ts +3 -0
  248. package/dist/vendor/tools/tools/read_file.d.ts.map +1 -0
  249. package/dist/vendor/tools/tools/read_file.js +72 -0
  250. package/dist/vendor/tools/tools/read_file.js.map +1 -0
  251. package/dist/vendor/tools/tools/run_command.d.ts +12 -0
  252. package/dist/vendor/tools/tools/run_command.d.ts.map +1 -0
  253. package/dist/vendor/tools/tools/run_command.js +421 -0
  254. package/dist/vendor/tools/tools/run_command.js.map +1 -0
  255. package/dist/vendor/tools/tools/run_diagnostics.d.ts +3 -0
  256. package/dist/vendor/tools/tools/run_diagnostics.d.ts.map +1 -0
  257. package/dist/vendor/tools/tools/run_diagnostics.js +11 -0
  258. package/dist/vendor/tools/tools/run_diagnostics.js.map +1 -0
  259. package/dist/vendor/tools/tools/search_files.d.ts +3 -0
  260. package/dist/vendor/tools/tools/search_files.d.ts.map +1 -0
  261. package/dist/vendor/tools/tools/search_files.js +120 -0
  262. package/dist/vendor/tools/tools/search_files.js.map +1 -0
  263. package/dist/vendor/tools/tools/web_search.d.ts +46 -0
  264. package/dist/vendor/tools/tools/web_search.d.ts.map +1 -0
  265. package/dist/vendor/tools/tools/web_search.js +187 -0
  266. package/dist/vendor/tools/tools/web_search.js.map +1 -0
  267. package/dist/vendor/tools/tools/write_file.d.ts +3 -0
  268. package/dist/vendor/tools/tools/write_file.d.ts.map +1 -0
  269. package/dist/vendor/tools/tools/write_file.js +52 -0
  270. package/dist/vendor/tools/tools/write_file.js.map +1 -0
  271. package/dist/windows_credentials.d.ts +15 -0
  272. package/dist/windows_credentials.d.ts.map +1 -0
  273. package/dist/windows_credentials.js +23 -0
  274. package/dist/windows_credentials.js.map +1 -0
  275. package/package.json +28 -0
@@ -0,0 +1,136 @@
1
+ const START_TAG_REGEX = /^<\s*(think|thought|reasoning)(?:\s+[^>]*)?>/i;
2
+ const CLOSE_TAG_REGEX = /^<\s*\/\s*(think|thought|reasoning)\s*>/i;
3
+ const PARTIAL_START_REGEX = /^<\s*(t(h(i(n(k)?)?|o(u(g(h(t)?)?)?)?)?)?|r(e(a(s(o(n(i(n(g)?)?)?)?)?)?)?)?)?$/i;
4
+ const PARTIAL_CLOSE_REGEX = /^<\s*\/\s*(t(h(i(n(k)?)?|o(u(g(h(t)?)?)?)?)?)?|r(e(a(s(o(n(i(n(g)?)?)?)?)?)?)?)?)?$/i;
5
+ export class ThinkTagStreamFilter {
6
+ inThink = false;
7
+ buffer = '';
8
+ leadingWhitespaceBuffer = '';
9
+ hasEmittedContent = false;
10
+ stripLeadingNewlineAfterThink = false;
11
+ process(chunk) {
12
+ const tokens = [];
13
+ let text = this.buffer + chunk;
14
+ this.buffer = '';
15
+ while (text.length > 0) {
16
+ if (!this.inThink) {
17
+ if (this.stripLeadingNewlineAfterThink) {
18
+ text = text.replace(/^[\r\n]+/, '');
19
+ if (text.length > 0 && !/^[\r\n]+$/.test(text)) {
20
+ this.stripLeadingNewlineAfterThink = false;
21
+ }
22
+ }
23
+ // Preamble check: if we haven't emitted anything yet, buffer pure whitespace
24
+ // in case it precedes an immediate <think> tag
25
+ if (!this.hasEmittedContent && !this.stripLeadingNewlineAfterThink) {
26
+ if (/^\s+$/.test(text)) {
27
+ this.leadingWhitespaceBuffer += text;
28
+ break;
29
+ }
30
+ if (/^\s+/.test(text)) {
31
+ const wsMatch = text.match(/^\s+/);
32
+ if (wsMatch) {
33
+ this.leadingWhitespaceBuffer += wsMatch[0];
34
+ text = text.slice(wsMatch[0].length);
35
+ }
36
+ }
37
+ }
38
+ const openIdx = text.indexOf('<');
39
+ if (openIdx === -1) {
40
+ // No '<' found
41
+ if (this.leadingWhitespaceBuffer.length > 0) {
42
+ tokens.push({ type: 'assistant', delta: this.leadingWhitespaceBuffer });
43
+ this.leadingWhitespaceBuffer = '';
44
+ this.hasEmittedContent = true;
45
+ }
46
+ if (text.length > 0) {
47
+ tokens.push({ type: 'assistant', delta: text });
48
+ this.hasEmittedContent = true;
49
+ }
50
+ break;
51
+ }
52
+ if (openIdx > 0) {
53
+ if (this.leadingWhitespaceBuffer.length > 0) {
54
+ tokens.push({ type: 'assistant', delta: this.leadingWhitespaceBuffer });
55
+ this.leadingWhitespaceBuffer = '';
56
+ this.hasEmittedContent = true;
57
+ }
58
+ const prefix = text.slice(0, openIdx);
59
+ if (prefix.length > 0) {
60
+ tokens.push({ type: 'assistant', delta: prefix });
61
+ this.hasEmittedContent = true;
62
+ }
63
+ text = text.slice(openIdx);
64
+ }
65
+ // text starts with '<'
66
+ const match = text.match(START_TAG_REGEX);
67
+ if (match) {
68
+ this.inThink = true;
69
+ this.leadingWhitespaceBuffer = ''; // Discard preamble before think
70
+ text = text.slice(match[0].length);
71
+ continue;
72
+ }
73
+ if (PARTIAL_START_REGEX.test(text)) {
74
+ this.buffer = text;
75
+ break;
76
+ }
77
+ // Not a think tag. Emit '<' as assistant content
78
+ if (this.leadingWhitespaceBuffer.length > 0) {
79
+ tokens.push({ type: 'assistant', delta: this.leadingWhitespaceBuffer });
80
+ this.leadingWhitespaceBuffer = '';
81
+ this.hasEmittedContent = true;
82
+ }
83
+ tokens.push({ type: 'assistant', delta: text[0] });
84
+ this.hasEmittedContent = true;
85
+ text = text.slice(1);
86
+ }
87
+ else {
88
+ // inThink is true
89
+ const closeIdx = text.indexOf('<');
90
+ if (closeIdx === -1) {
91
+ tokens.push({ type: 'reasoning', delta: text });
92
+ break;
93
+ }
94
+ if (closeIdx > 0) {
95
+ tokens.push({ type: 'reasoning', delta: text.slice(0, closeIdx) });
96
+ text = text.slice(closeIdx);
97
+ }
98
+ // text starts with '<'
99
+ const match = text.match(CLOSE_TAG_REGEX);
100
+ if (match) {
101
+ this.inThink = false;
102
+ this.stripLeadingNewlineAfterThink = true;
103
+ text = text.slice(match[0].length).replace(/^[\r\n]+/, '');
104
+ continue;
105
+ }
106
+ if (PARTIAL_CLOSE_REGEX.test(text)) {
107
+ this.buffer = text;
108
+ break;
109
+ }
110
+ tokens.push({ type: 'reasoning', delta: text[0] });
111
+ text = text.slice(1);
112
+ }
113
+ }
114
+ return tokens;
115
+ }
116
+ flush() {
117
+ const tokens = [];
118
+ if (this.leadingWhitespaceBuffer.length > 0) {
119
+ if (!this.inThink) {
120
+ tokens.push({ type: 'assistant', delta: this.leadingWhitespaceBuffer });
121
+ }
122
+ this.leadingWhitespaceBuffer = '';
123
+ }
124
+ if (this.buffer.length > 0) {
125
+ if (this.inThink) {
126
+ tokens.push({ type: 'reasoning', delta: this.buffer });
127
+ }
128
+ else {
129
+ tokens.push({ type: 'assistant', delta: this.buffer });
130
+ }
131
+ this.buffer = '';
132
+ }
133
+ return tokens;
134
+ }
135
+ }
136
+ //# sourceMappingURL=think_filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"think_filter.js","sourceRoot":"","sources":["../src/think_filter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { ChatCompletionChunk, IProviderAdapter, ModelInventoryEntry, ProviderChatOptions } from '@moderado/contracts';
2
+ export declare class FakeProviderAdapter implements IProviderAdapter {
3
+ readonly id = "fake";
4
+ readonly name = "Fake Provider (Testing)";
5
+ models: ModelInventoryEntry[];
6
+ recordedCalls: ProviderChatOptions[];
7
+ private responseQueue;
8
+ queueResponse(chunks: ChatCompletionChunk[]): void;
9
+ queueTextResponse(text: string, finishReason?: 'stop' | 'length'): void;
10
+ queueToolCallResponse(toolName: string, toolArgs: Record<string, unknown>, assistantText?: string, callId?: string): void;
11
+ queueError(error: Error): void;
12
+ clear(): void;
13
+ discoverModels(signal?: AbortSignal): Promise<ModelInventoryEntry[]>;
14
+ streamChat(options: ProviderChatOptions): AsyncIterable<ChatCompletionChunk>;
15
+ }
16
+ //# sourceMappingURL=fake_provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake_provider.d.ts","sourceRoot":"","sources":["../../src/fake/fake_provider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC;AAE7B,qBAAa,mBAAoB,YAAW,gBAAgB;IAC1D,SAAgB,EAAE,UAAU;IAC5B,SAAgB,IAAI,6BAA6B;IAE1C,MAAM,EAAE,mBAAmB,EAAE,CAmBlC;IAEK,aAAa,EAAE,mBAAmB,EAAE,CAAM;IACjD,OAAO,CAAC,aAAa,CAAyC;IAE9D,aAAa,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,IAAI;IAIlD,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,GAAE,MAAM,GAAG,QAAiB,GAAG,IAAI;IAO/E,qBAAqB,CACnB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,aAAa,CAAC,EAAE,MAAM,EACtB,MAAM,SAAuB,GAC5B,IAAI;IAmBP,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAI9B,KAAK,IAAI,IAAI;IAKP,cAAc,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAOnE,UAAU,CAAC,OAAO,EAAE,mBAAmB,GAAG,aAAa,CAAC,mBAAmB,CAAC;CA0BpF"}
@@ -0,0 +1,89 @@
1
+ export class FakeProviderAdapter {
2
+ id = 'fake';
3
+ name = 'Fake Provider (Testing)';
4
+ models = [
5
+ {
6
+ id: 'mock/free-tool-model',
7
+ object: 'model',
8
+ created: 1700000000,
9
+ owned_by: 'nvidia',
10
+ },
11
+ {
12
+ id: 'mock/paid-tool-model',
13
+ object: 'model',
14
+ created: 1700000000,
15
+ owned_by: 'nvidia',
16
+ },
17
+ {
18
+ id: 'mock/text-only-model',
19
+ object: 'model',
20
+ created: 1700000000,
21
+ owned_by: 'nvidia',
22
+ },
23
+ ];
24
+ recordedCalls = [];
25
+ responseQueue = [];
26
+ queueResponse(chunks) {
27
+ this.responseQueue.push(chunks);
28
+ }
29
+ queueTextResponse(text, finishReason = 'stop') {
30
+ this.responseQueue.push([
31
+ { contentDelta: text },
32
+ { finishReason },
33
+ ]);
34
+ }
35
+ queueToolCallResponse(toolName, toolArgs, assistantText, callId = `call_${Date.now()}`) {
36
+ const chunks = [];
37
+ if (assistantText) {
38
+ chunks.push({ contentDelta: assistantText });
39
+ }
40
+ chunks.push({
41
+ toolCallChunks: [
42
+ {
43
+ index: 0,
44
+ id: callId,
45
+ name: toolName,
46
+ argumentsDelta: JSON.stringify(toolArgs),
47
+ },
48
+ ],
49
+ finishReason: 'tool_calls',
50
+ });
51
+ this.responseQueue.push(chunks);
52
+ }
53
+ queueError(error) {
54
+ this.responseQueue.push(error);
55
+ }
56
+ clear() {
57
+ this.recordedCalls = [];
58
+ this.responseQueue = [];
59
+ }
60
+ async discoverModels(signal) {
61
+ if (signal?.aborted) {
62
+ throw new Error('Aborted');
63
+ }
64
+ return [...this.models];
65
+ }
66
+ async *streamChat(options) {
67
+ this.recordedCalls.push(options);
68
+ if (options.signal?.aborted) {
69
+ throw new Error('Request was aborted');
70
+ }
71
+ const next = this.responseQueue.shift();
72
+ if (!next) {
73
+ // Default fallback response
74
+ yield { contentDelta: 'Mock assistant response.' };
75
+ yield { finishReason: 'stop' };
76
+ return;
77
+ }
78
+ if (next instanceof Error) {
79
+ throw next;
80
+ }
81
+ for (const chunk of next) {
82
+ if (options.signal?.aborted) {
83
+ throw new Error('Request was aborted');
84
+ }
85
+ yield chunk;
86
+ }
87
+ }
88
+ }
89
+ //# sourceMappingURL=fake_provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake_provider.js","sourceRoot":"","sources":["../../src/fake/fake_provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export * from './fake/fake_provider.js';
2
+ export * from './nvidia/nvidia_adapter.js';
3
+ export * from './nvidia/sse_parser.js';
4
+ export * from './openai_compatible_adapter.js';
5
+ export * from './model_discovery.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from './fake/fake_provider.js';
2
+ export * from './nvidia/nvidia_adapter.js';
3
+ export * from './nvidia/sse_parser.js';
4
+ export * from './openai_compatible_adapter.js';
5
+ export * from './model_discovery.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { ModelInventoryEntry } from '@moderado/contracts';
2
+ export declare const SPIKE_PROVIDER_ENDPOINTS: {};
3
+ /**
4
+ * Fetch the OpenAI-compatible `/models` listing from any provider endpoint.
5
+ * Mirrors `NvidiaAdapter.discoverModels` but without per-instance caching —
6
+ * `/connect` calls it once per setup flow.
7
+ */
8
+ export declare function fetchProviderModels(baseUrl: string, apiKey: string | undefined, optionsOrSignal?: AbortSignal | {
9
+ signal?: AbortSignal;
10
+ fetchImpl?: typeof fetch;
11
+ }): Promise<ModelInventoryEntry[]>;
12
+ /** True when the provider advertises zero prompt cost (decimal-string pricing). */
13
+ export declare function isFreeModelEntry(entry: ModelInventoryEntry): boolean;
14
+ /**
15
+ * OpenRouter publishes its full model catalog without authentication; free
16
+ * variants (e.g. `deepseek/deepseek-r1:free`) advertise `pricing.prompt: "0"`.
17
+ * `fetchImpl` is injectable so tests stay fully offline.
18
+ */
19
+ export declare function fetchOpenRouterFreeModels(options?: {
20
+ signal?: AbortSignal;
21
+ fetchImpl?: typeof fetch;
22
+ }): Promise<ModelInventoryEntry[]>;
23
+ /** Split a provider listing into free-first and paid buckets. */
24
+ export declare function partitionFreeModels(entries: ModelInventoryEntry[]): {
25
+ free: ModelInventoryEntry[];
26
+ paid: ModelInventoryEntry[];
27
+ };
28
+ //# sourceMappingURL=model_discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model_discovery.d.ts","sourceRoot":"","sources":["../src/model_discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EAGpB,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,wBAAwB,IAAc,CAAC;AAEpD;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,eAAe,CAAC,EAAE,WAAW,GAAG;IAAE,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CAAE,GACjF,OAAO,CAAC,mBAAmB,EAAE,CAAC,CA+ChC;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAEpE;AAID;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CAAO,GAC/D,OAAO,CAAC,mBAAmB,EAAE,CAAC,CA0ChC;AAED,iEAAiE;AACjE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,EAAE,GAAG;IACnE,IAAI,EAAE,mBAAmB,EAAE,CAAC;IAC5B,IAAI,EAAE,mBAAmB,EAAE,CAAC;CAC7B,CAOA"}
@@ -0,0 +1,106 @@
1
+ import { ModelInventoryEntrySchema, ProviderError, } from '../contracts/index.js';
2
+ export const SPIKE_PROVIDER_ENDPOINTS = {};
3
+ /**
4
+ * Fetch the OpenAI-compatible `/models` listing from any provider endpoint.
5
+ * Mirrors `NvidiaAdapter.discoverModels` but without per-instance caching —
6
+ * `/connect` calls it once per setup flow.
7
+ */
8
+ export async function fetchProviderModels(baseUrl, apiKey, optionsOrSignal) {
9
+ const signal = optionsOrSignal instanceof AbortSignal ? optionsOrSignal : optionsOrSignal?.signal;
10
+ const doFetch = (!(optionsOrSignal instanceof AbortSignal) && optionsOrSignal?.fetchImpl) ? optionsOrSignal.fetchImpl : fetch;
11
+ const url = `${baseUrl.replace(/\/+$/, '')}/models`;
12
+ let response;
13
+ try {
14
+ response = await doFetch(url, {
15
+ method: 'GET',
16
+ headers: {
17
+ Accept: 'application/json',
18
+ ...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}),
19
+ },
20
+ signal,
21
+ });
22
+ }
23
+ catch (err) {
24
+ if (signal?.aborted)
25
+ throw new Error('Discovery request was aborted');
26
+ throw new ProviderError(`Network error while contacting ${url}: ${err instanceof Error ? err.message : String(err)}`, 'ERR_NETWORK_ERROR');
27
+ }
28
+ if (!response.ok) {
29
+ throw new ProviderError(`Model discovery failed with status ${response.status} at ${url}`, 'ERR_HTTP_ERROR', response.status);
30
+ }
31
+ let json;
32
+ try {
33
+ json = await response.json();
34
+ }
35
+ catch (err) {
36
+ throw new ProviderError(`Failed to parse models response: ${err instanceof Error ? err.message : String(err)}`, 'ERR_MALFORMED_RESPONSE');
37
+ }
38
+ const dataArray = Array.isArray(json) ? json : json?.data;
39
+ if (!Array.isArray(dataArray)) {
40
+ throw new ProviderError("Expected array in models response ('data' field)", 'ERR_MALFORMED_RESPONSE');
41
+ }
42
+ const results = [];
43
+ for (const item of dataArray) {
44
+ const parsed = ModelInventoryEntrySchema.safeParse(item);
45
+ if (parsed.success)
46
+ results.push(parsed.data);
47
+ }
48
+ return results;
49
+ }
50
+ /** True when the provider advertises zero prompt cost (decimal-string pricing). */
51
+ export function isFreeModelEntry(entry) {
52
+ return entry.pricing?.['prompt'] === '0';
53
+ }
54
+ const OPENROUTER_MODELS_URL = 'https://openrouter.ai/api/v1/models';
55
+ /**
56
+ * OpenRouter publishes its full model catalog without authentication; free
57
+ * variants (e.g. `deepseek/deepseek-r1:free`) advertise `pricing.prompt: "0"`.
58
+ * `fetchImpl` is injectable so tests stay fully offline.
59
+ */
60
+ export async function fetchOpenRouterFreeModels(options = {}) {
61
+ const doFetch = options.fetchImpl ?? fetch;
62
+ let response;
63
+ try {
64
+ response = await doFetch(OPENROUTER_MODELS_URL, {
65
+ method: 'GET',
66
+ headers: { Accept: 'application/json' },
67
+ signal: options.signal,
68
+ });
69
+ }
70
+ catch (err) {
71
+ if (options.signal?.aborted)
72
+ throw new Error('Discovery request was aborted');
73
+ throw new ProviderError(`Network error while contacting ${OPENROUTER_MODELS_URL}: ${err instanceof Error ? err.message : String(err)}`, 'ERR_NETWORK_ERROR');
74
+ }
75
+ if (!response.ok) {
76
+ throw new ProviderError(`OpenRouter model discovery failed with status ${response.status}`, 'ERR_HTTP_ERROR', response.status);
77
+ }
78
+ let json;
79
+ try {
80
+ json = await response.json();
81
+ }
82
+ catch (err) {
83
+ throw new ProviderError(`Failed to parse OpenRouter models response: ${err instanceof Error ? err.message : String(err)}`, 'ERR_MALFORMED_RESPONSE');
84
+ }
85
+ const dataArray = Array.isArray(json) ? json : json?.data;
86
+ if (!Array.isArray(dataArray)) {
87
+ throw new ProviderError("Expected array in OpenRouter models response ('data' field)", 'ERR_MALFORMED_RESPONSE');
88
+ }
89
+ const free = [];
90
+ for (const item of dataArray) {
91
+ const parsed = ModelInventoryEntrySchema.safeParse(item);
92
+ if (parsed.success && isFreeModelEntry(parsed.data))
93
+ free.push(parsed.data);
94
+ }
95
+ return free;
96
+ }
97
+ /** Split a provider listing into free-first and paid buckets. */
98
+ export function partitionFreeModels(entries) {
99
+ const free = [];
100
+ const paid = [];
101
+ for (const entry of entries) {
102
+ (isFreeModelEntry(entry) ? free : paid).push(entry);
103
+ }
104
+ return { free, paid };
105
+ }
106
+ //# sourceMappingURL=model_discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model_discovery.js","sourceRoot":"","sources":["../src/model_discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { ChatCompletionChunk, IProviderAdapter, ModelInventoryEntry, ProviderChatOptions } from '@moderado/contracts';
2
+ export interface NvidiaAdapterConfig {
3
+ apiKey?: string;
4
+ baseUrl?: string;
5
+ /** Provider identity for OpenAI-compatible services using this transport. */
6
+ providerId?: string;
7
+ providerName?: string;
8
+ }
9
+ export declare class NvidiaAdapter implements IProviderAdapter {
10
+ readonly id: string;
11
+ readonly name: string;
12
+ private readonly apiKey;
13
+ private readonly baseUrl;
14
+ private cachedInventory;
15
+ private cacheTimestamp;
16
+ private readonly cacheTtlMs;
17
+ constructor(config?: NvidiaAdapterConfig);
18
+ private getHeaders;
19
+ discoverModels(signal?: AbortSignal, forceRefresh?: boolean): Promise<ModelInventoryEntry[]>;
20
+ streamChat(options: ProviderChatOptions): AsyncIterable<ChatCompletionChunk>;
21
+ private handleHttpError;
22
+ }
23
+ //# sourceMappingURL=nvidia_adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nvidia_adapter.d.ts","sourceRoot":"","sources":["../../src/nvidia/nvidia_adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EAGnB,mBAAmB,EAGpB,MAAM,qBAAqB,CAAC;AAG7B,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,aAAc,YAAW,gBAAgB;IACpD,SAAgB,EAAE,EAAE,MAAM,CAAC;IAC3B,SAAgB,IAAI,EAAE,MAAM,CAAC;IAE7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,eAAe,CAAsC;IAC7D,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;gBAEjC,MAAM,GAAE,mBAAwB;IAO5C,OAAO,CAAC,UAAU;IAYZ,cAAc,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,YAAY,UAAQ,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAkDzF,UAAU,CAAC,OAAO,EAAE,mBAAmB,GAAG,aAAa,CAAC,mBAAmB,CAAC;YA4FrE,eAAe;CA0D9B"}
@@ -0,0 +1,197 @@
1
+ import { AuthenticationError, ModelInventoryEntrySchema, ModelUnavailableError, ProviderError, RateLimitError, } from '../../contracts/index.js';
2
+ import { parseSseStream } from './sse_parser.js';
3
+ export class NvidiaAdapter {
4
+ id;
5
+ name;
6
+ apiKey;
7
+ baseUrl;
8
+ cachedInventory = null;
9
+ cacheTimestamp = 0;
10
+ cacheTtlMs = 15 * 60 * 1000;
11
+ constructor(config = {}) {
12
+ this.id = config.providerId || 'nvidia';
13
+ this.name = config.providerName || 'NVIDIA NIM';
14
+ this.apiKey = config.apiKey || process.env.NVIDIA_API_KEY || '';
15
+ this.baseUrl = (config.baseUrl || 'https://integrate.api.nvidia.com/v1').replace(/\/+$/, '');
16
+ }
17
+ getHeaders() {
18
+ const headers = {
19
+ 'Content-Type': 'application/json',
20
+ Accept: 'application/json',
21
+ Connection: 'keep-alive',
22
+ };
23
+ if (this.apiKey) {
24
+ headers.Authorization = `Bearer ${this.apiKey}`;
25
+ }
26
+ return headers;
27
+ }
28
+ async discoverModels(signal, forceRefresh = false) {
29
+ if (!forceRefresh && this.cachedInventory && Date.now() - this.cacheTimestamp < this.cacheTtlMs) {
30
+ return this.cachedInventory;
31
+ }
32
+ const url = `${this.baseUrl}/models`;
33
+ let response;
34
+ try {
35
+ response = await fetch(url, {
36
+ method: 'GET',
37
+ headers: this.getHeaders(),
38
+ signal,
39
+ });
40
+ }
41
+ catch (err) {
42
+ if (signal?.aborted) {
43
+ throw new Error('Discovery request was aborted');
44
+ }
45
+ throw new ProviderError(`Network error while contacting ${url}: ${err.message}`, 'ERR_NETWORK_ERROR');
46
+ }
47
+ if (!response.ok) {
48
+ await this.handleHttpError(response, 'discoverModels');
49
+ }
50
+ let json;
51
+ try {
52
+ json = await response.json();
53
+ }
54
+ catch (err) {
55
+ throw new ProviderError(`Failed to parse models response: ${err.message}`, 'ERR_MALFORMED_RESPONSE');
56
+ }
57
+ const dataArray = Array.isArray(json) ? json : json.data;
58
+ if (!Array.isArray(dataArray)) {
59
+ throw new ProviderError("Expected array in models response ('data' field)", 'ERR_MALFORMED_RESPONSE');
60
+ }
61
+ const results = [];
62
+ for (const item of dataArray) {
63
+ const parsed = ModelInventoryEntrySchema.safeParse(item);
64
+ if (parsed.success) {
65
+ results.push(parsed.data);
66
+ }
67
+ }
68
+ this.cachedInventory = results;
69
+ this.cacheTimestamp = Date.now();
70
+ return results;
71
+ }
72
+ async *streamChat(options) {
73
+ const url = `${this.baseUrl}/chat/completions`;
74
+ // Map contracts ChatMessage to OpenAI/NIM wire payload
75
+ const wireMessages = options.messages.map((msg) => {
76
+ if (msg.role === 'assistant') {
77
+ const out = {
78
+ role: 'assistant',
79
+ content: msg.content ?? '',
80
+ };
81
+ if (msg.toolCalls && msg.toolCalls.length > 0) {
82
+ out.tool_calls = msg.toolCalls.map((tc) => ({
83
+ id: tc.id,
84
+ type: 'function',
85
+ function: {
86
+ name: tc.name,
87
+ arguments: JSON.stringify(tc.arguments),
88
+ },
89
+ }));
90
+ }
91
+ return out;
92
+ }
93
+ if (msg.role === 'tool') {
94
+ return {
95
+ role: 'tool',
96
+ tool_call_id: msg.toolCallId,
97
+ name: msg.name,
98
+ content: msg.content,
99
+ };
100
+ }
101
+ return {
102
+ role: msg.role,
103
+ content: msg.content,
104
+ };
105
+ });
106
+ const payload = {
107
+ model: options.modelId,
108
+ messages: wireMessages,
109
+ stream: true,
110
+ };
111
+ if (options.tools && options.tools.length > 0) {
112
+ payload.tools = options.tools.map((t) => ({
113
+ type: 'function',
114
+ function: {
115
+ name: t.name,
116
+ description: t.description,
117
+ parameters: t.parameters,
118
+ },
119
+ }));
120
+ }
121
+ if (options.temperature !== undefined) {
122
+ payload.temperature = options.temperature;
123
+ }
124
+ if (options.maxTokens !== undefined) {
125
+ payload.max_tokens = options.maxTokens;
126
+ }
127
+ let response;
128
+ try {
129
+ response = await fetch(url, {
130
+ method: 'POST',
131
+ headers: {
132
+ ...this.getHeaders(),
133
+ Accept: 'text/event-stream',
134
+ },
135
+ body: JSON.stringify(payload),
136
+ signal: options.signal,
137
+ });
138
+ }
139
+ catch (err) {
140
+ if (options.signal?.aborted) {
141
+ throw new Error('Chat request was aborted');
142
+ }
143
+ throw new ProviderError(`Network error while contacting ${url}: ${err.message}`, 'ERR_NETWORK_ERROR');
144
+ }
145
+ if (!response.ok) {
146
+ await this.handleHttpError(response, 'streamChat');
147
+ }
148
+ if (!response.body) {
149
+ throw new ProviderError('Provider response has empty body', 'ERR_EMPTY_BODY');
150
+ }
151
+ // Node.js Response.body is a ReadableStream<Uint8Array> which is an AsyncIterable in modern Node
152
+ yield* parseSseStream(response.body);
153
+ }
154
+ async handleHttpError(response, action) {
155
+ let errorText = '';
156
+ try {
157
+ errorText = await response.text();
158
+ }
159
+ catch {
160
+ // ignore
161
+ }
162
+ if (response.status === 401 || response.status === 403) {
163
+ throw new AuthenticationError(`${this.name} authentication failed (${response.status}) during ${action}: ${errorText || 'Check the provider API key'}`);
164
+ }
165
+ if (response.status === 429) {
166
+ const retryAfterHeader = response.headers.get('Retry-After');
167
+ let retryAfterSeconds;
168
+ if (retryAfterHeader) {
169
+ const parsed = parseInt(retryAfterHeader, 10);
170
+ if (!isNaN(parsed)) {
171
+ retryAfterSeconds = parsed;
172
+ }
173
+ }
174
+ let detail = errorText;
175
+ try {
176
+ const parsed = JSON.parse(errorText);
177
+ if (parsed?.error?.message) {
178
+ detail = parsed.error.message;
179
+ }
180
+ }
181
+ catch {
182
+ // raw errorText
183
+ }
184
+ throw new RateLimitError(`${this.name} rate limit exceeded (429) during ${action}: ${detail}`, retryAfterSeconds);
185
+ }
186
+ if (response.status === 404 ||
187
+ response.status === 410 ||
188
+ response.status === 503 ||
189
+ response.status === 500 ||
190
+ response.status === 502 ||
191
+ response.status === 504) {
192
+ throw new ModelUnavailableError(`${this.name} service or model unavailable (${response.status}) during ${action}: ${errorText}`, response.status);
193
+ }
194
+ throw new ProviderError(`${this.name} request failed with status ${response.status} during ${action}: ${errorText}`, 'ERR_HTTP_ERROR', response.status);
195
+ }
196
+ }
197
+ //# sourceMappingURL=nvidia_adapter.js.map