groove-dev 0.27.143 → 0.27.145

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 (251) hide show
  1. package/CLAUDE.md +0 -7
  2. package/node_modules/@groove-dev/cli/package.json +1 -1
  3. package/node_modules/@groove-dev/daemon/package.json +1 -1
  4. package/node_modules/@groove-dev/daemon/src/api.js +1086 -6532
  5. package/node_modules/@groove-dev/daemon/src/conversations.js +18 -48
  6. package/node_modules/@groove-dev/daemon/src/gateways/manager.js +35 -1
  7. package/node_modules/@groove-dev/daemon/src/index.js +3 -0
  8. package/node_modules/@groove-dev/daemon/src/journalist.js +23 -13
  9. package/node_modules/@groove-dev/daemon/src/mlx-server.js +365 -0
  10. package/node_modules/@groove-dev/daemon/src/model-lab.js +308 -12
  11. package/node_modules/@groove-dev/daemon/src/pm.js +1 -1
  12. package/node_modules/@groove-dev/daemon/src/process.js +2 -2
  13. package/node_modules/@groove-dev/daemon/src/providers/local.js +36 -8
  14. package/node_modules/@groove-dev/daemon/src/registry.js +21 -5
  15. package/node_modules/@groove-dev/daemon/src/routes/agents.js +812 -0
  16. package/node_modules/@groove-dev/daemon/src/routes/coordination.js +318 -0
  17. package/node_modules/@groove-dev/daemon/src/routes/files.js +751 -0
  18. package/node_modules/@groove-dev/daemon/src/routes/integrations.js +485 -0
  19. package/node_modules/@groove-dev/daemon/src/routes/network.js +1784 -0
  20. package/node_modules/@groove-dev/daemon/src/routes/providers.js +755 -0
  21. package/node_modules/@groove-dev/daemon/src/routes/schedules.js +110 -0
  22. package/node_modules/@groove-dev/daemon/src/routes/teams.js +650 -0
  23. package/node_modules/@groove-dev/daemon/src/scheduler.js +456 -24
  24. package/node_modules/@groove-dev/daemon/src/teams.js +1 -1
  25. package/node_modules/@groove-dev/daemon/src/validate.js +38 -1
  26. package/node_modules/@groove-dev/daemon/templates/mlx-setup.json +12 -0
  27. package/node_modules/@groove-dev/daemon/templates/tgi-setup.json +1 -1
  28. package/node_modules/@groove-dev/daemon/templates/vllm-setup.json +1 -1
  29. package/node_modules/@groove-dev/daemon/test/introducer.test.js +3 -3
  30. package/node_modules/@groove-dev/daemon/test/journalist.test.js +7 -10
  31. package/node_modules/@groove-dev/daemon/test/registry.test.js +38 -0
  32. package/node_modules/@groove-dev/gui/dist/assets/index-Bxc0gU06.js +1006 -0
  33. package/node_modules/@groove-dev/gui/dist/assets/index-C0pztKBn.css +1 -0
  34. package/node_modules/@groove-dev/gui/dist/index.html +2 -2
  35. package/node_modules/@groove-dev/gui/package.json +1 -1
  36. package/node_modules/@groove-dev/gui/src/{app.jsx → App.jsx} +0 -2
  37. package/node_modules/@groove-dev/gui/src/app.css +35 -0
  38. package/node_modules/@groove-dev/gui/src/components/agents/agent-config.jsx +1 -128
  39. package/node_modules/@groove-dev/gui/src/components/agents/agent-feed.jsx +210 -112
  40. package/node_modules/@groove-dev/gui/src/components/agents/agent-node.jsx +8 -13
  41. package/node_modules/@groove-dev/gui/src/components/agents/agent-panel.jsx +2 -70
  42. package/node_modules/@groove-dev/gui/src/components/agents/code-review.jsx +159 -122
  43. package/node_modules/@groove-dev/gui/src/components/agents/diff-viewer.jsx +23 -23
  44. package/node_modules/@groove-dev/gui/src/components/agents/journalist-panel.jsx +1 -1
  45. package/node_modules/@groove-dev/gui/src/components/agents/spawn-wizard.jsx +2 -135
  46. package/node_modules/@groove-dev/gui/src/components/automations/automation-card.jsx +274 -0
  47. package/node_modules/@groove-dev/gui/src/components/automations/automation-wizard.jsx +1136 -0
  48. package/node_modules/@groove-dev/gui/src/components/chat/chat-header.jsx +2 -0
  49. package/node_modules/@groove-dev/gui/src/components/chat/chat-input.jsx +68 -66
  50. package/node_modules/@groove-dev/gui/src/components/chat/chat-view.jsx +4 -8
  51. package/node_modules/@groove-dev/gui/src/components/dashboard/activity-feed.jsx +3 -3
  52. package/node_modules/@groove-dev/gui/src/components/dashboard/cache-ring.jsx +5 -5
  53. package/node_modules/@groove-dev/gui/src/components/dashboard/context-gauges.jsx +6 -8
  54. package/node_modules/@groove-dev/gui/src/components/dashboard/fleet-panel.jsx +8 -14
  55. package/node_modules/@groove-dev/gui/src/components/dashboard/intel-panel.jsx +238 -656
  56. package/node_modules/@groove-dev/gui/src/components/dashboard/kpi-card.jsx +3 -3
  57. package/node_modules/@groove-dev/gui/src/components/dashboard/routing-chart.jsx +3 -3
  58. package/node_modules/@groove-dev/gui/src/components/dashboard/team-burn-panel.jsx +1 -1
  59. package/node_modules/@groove-dev/gui/src/components/dashboard/token-chart.jsx +4 -4
  60. package/node_modules/@groove-dev/gui/src/components/lab/chat-playground.jsx +39 -31
  61. package/node_modules/@groove-dev/gui/src/components/lab/lab-assistant.jsx +316 -82
  62. package/node_modules/@groove-dev/gui/src/components/lab/metrics-panel.jsx +187 -32
  63. package/node_modules/@groove-dev/gui/src/components/lab/parameter-panel.jsx +200 -18
  64. package/node_modules/@groove-dev/gui/src/components/lab/preset-manager.jsx +17 -14
  65. package/node_modules/@groove-dev/gui/src/components/lab/runtime-config.jsx +335 -152
  66. package/node_modules/@groove-dev/gui/src/components/lab/system-prompt-editor.jsx +10 -8
  67. package/node_modules/@groove-dev/gui/src/components/layout/activity-bar.jsx +2 -4
  68. package/node_modules/@groove-dev/gui/src/components/layout/terminal-panel.jsx +4 -2
  69. package/node_modules/@groove-dev/gui/src/components/layout/welcome-splash.jsx +137 -108
  70. package/node_modules/@groove-dev/gui/src/components/network/network-health.jsx +2 -2
  71. package/node_modules/@groove-dev/gui/src/components/network/performance-dashboard.jsx +4 -4
  72. package/node_modules/@groove-dev/gui/src/components/settings/ssh-wizard.jsx +81 -99
  73. package/node_modules/@groove-dev/gui/src/components/ui/sheet.jsx +5 -2
  74. package/node_modules/@groove-dev/gui/src/components/ui/slider.jsx +8 -8
  75. package/node_modules/@groove-dev/gui/src/lib/cron.js +64 -0
  76. package/node_modules/@groove-dev/gui/src/lib/status.js +25 -24
  77. package/node_modules/@groove-dev/gui/src/lib/theme-hex.js +1 -0
  78. package/node_modules/@groove-dev/gui/src/stores/groove.js +51 -3144
  79. package/node_modules/@groove-dev/gui/src/stores/helpers.js +10 -0
  80. package/node_modules/@groove-dev/gui/src/stores/slices/agents-slice.js +459 -0
  81. package/node_modules/@groove-dev/gui/src/stores/slices/automations-slice.js +96 -0
  82. package/node_modules/@groove-dev/gui/src/stores/slices/chat-slice.js +226 -0
  83. package/node_modules/@groove-dev/gui/src/stores/slices/editor-slice.js +285 -0
  84. package/node_modules/@groove-dev/gui/src/stores/slices/marketplace-slice.js +461 -0
  85. package/node_modules/@groove-dev/gui/src/stores/slices/network-slice.js +361 -0
  86. package/node_modules/@groove-dev/gui/src/stores/slices/preview-slice.js +109 -0
  87. package/node_modules/@groove-dev/gui/src/stores/slices/providers-slice.js +897 -0
  88. package/node_modules/@groove-dev/gui/src/stores/slices/teams-slice.js +413 -0
  89. package/node_modules/@groove-dev/gui/src/stores/slices/ui-slice.js +98 -0
  90. package/node_modules/@groove-dev/gui/src/views/agents.jsx +5 -5
  91. package/node_modules/@groove-dev/gui/src/views/dashboard.jsx +12 -13
  92. package/node_modules/@groove-dev/gui/src/views/marketplace.jsx +191 -3
  93. package/node_modules/@groove-dev/gui/src/views/model-lab.jsx +54 -12
  94. package/node_modules/@groove-dev/gui/src/views/models.jsx +419 -496
  95. package/node_modules/@groove-dev/gui/src/views/network.jsx +3 -3
  96. package/node_modules/@groove-dev/gui/src/views/settings.jsx +81 -94
  97. package/node_modules/@groove-dev/gui/src/views/teams.jsx +40 -483
  98. package/node_modules/axios/CHANGELOG.md +260 -0
  99. package/node_modules/axios/README.md +595 -223
  100. package/node_modules/axios/dist/axios.js +1460 -1090
  101. package/node_modules/axios/dist/axios.js.map +1 -1
  102. package/node_modules/axios/dist/axios.min.js +3 -3
  103. package/node_modules/axios/dist/axios.min.js.map +1 -1
  104. package/node_modules/axios/dist/browser/axios.cjs +1560 -1132
  105. package/node_modules/axios/dist/browser/axios.cjs.map +1 -1
  106. package/node_modules/axios/dist/esm/axios.js +1557 -1128
  107. package/node_modules/axios/dist/esm/axios.js.map +1 -1
  108. package/node_modules/axios/dist/esm/axios.min.js +2 -2
  109. package/node_modules/axios/dist/esm/axios.min.js.map +1 -1
  110. package/node_modules/axios/dist/node/axios.cjs +1594 -1057
  111. package/node_modules/axios/dist/node/axios.cjs.map +1 -1
  112. package/node_modules/axios/index.d.cts +40 -41
  113. package/node_modules/axios/index.d.ts +151 -227
  114. package/node_modules/axios/index.js +2 -0
  115. package/node_modules/axios/lib/adapters/adapters.js +4 -2
  116. package/node_modules/axios/lib/adapters/fetch.js +147 -16
  117. package/node_modules/axios/lib/adapters/http.js +306 -58
  118. package/node_modules/axios/lib/adapters/xhr.js +6 -2
  119. package/node_modules/axios/lib/core/Axios.js +7 -3
  120. package/node_modules/axios/lib/core/AxiosError.js +120 -34
  121. package/node_modules/axios/lib/core/AxiosHeaders.js +27 -25
  122. package/node_modules/axios/lib/core/buildFullPath.js +1 -1
  123. package/node_modules/axios/lib/core/dispatchRequest.js +19 -7
  124. package/node_modules/axios/lib/core/mergeConfig.js +21 -4
  125. package/node_modules/axios/lib/core/settle.js +7 -11
  126. package/node_modules/axios/lib/defaults/index.js +14 -9
  127. package/node_modules/axios/lib/env/data.js +1 -1
  128. package/node_modules/axios/lib/helpers/AxiosURLSearchParams.js +1 -2
  129. package/node_modules/axios/lib/helpers/buildURL.js +1 -1
  130. package/node_modules/axios/lib/helpers/cookies.js +14 -2
  131. package/node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js +28 -1
  132. package/node_modules/axios/lib/helpers/formDataToJSON.js +3 -1
  133. package/node_modules/axios/lib/helpers/formDataToStream.js +3 -2
  134. package/node_modules/axios/lib/helpers/parseProtocol.js +1 -1
  135. package/node_modules/axios/lib/helpers/progressEventReducer.js +5 -5
  136. package/node_modules/axios/lib/helpers/resolveConfig.js +54 -18
  137. package/node_modules/axios/lib/helpers/shouldBypassProxy.js +74 -2
  138. package/node_modules/axios/lib/helpers/toFormData.js +10 -2
  139. package/node_modules/axios/lib/helpers/validator.js +3 -1
  140. package/node_modules/axios/lib/utils.js +33 -21
  141. package/node_modules/axios/package.json +17 -24
  142. package/node_modules/follow-redirects/README.md +7 -5
  143. package/node_modules/follow-redirects/index.js +24 -1
  144. package/node_modules/follow-redirects/package.json +1 -1
  145. package/package.json +1 -1
  146. package/packages/cli/package.json +1 -1
  147. package/packages/daemon/package.json +1 -1
  148. package/packages/daemon/src/api.js +1086 -6532
  149. package/packages/daemon/src/conversations.js +18 -48
  150. package/packages/daemon/src/gateways/manager.js +35 -1
  151. package/packages/daemon/src/index.js +3 -0
  152. package/packages/daemon/src/journalist.js +23 -13
  153. package/packages/daemon/src/mlx-server.js +365 -0
  154. package/packages/daemon/src/model-lab.js +308 -12
  155. package/packages/daemon/src/pm.js +1 -1
  156. package/packages/daemon/src/process.js +2 -2
  157. package/packages/daemon/src/providers/local.js +36 -8
  158. package/packages/daemon/src/registry.js +21 -5
  159. package/packages/daemon/src/routes/agents.js +812 -0
  160. package/packages/daemon/src/routes/coordination.js +318 -0
  161. package/packages/daemon/src/routes/files.js +751 -0
  162. package/packages/daemon/src/routes/integrations.js +485 -0
  163. package/packages/daemon/src/routes/network.js +1784 -0
  164. package/packages/daemon/src/routes/providers.js +755 -0
  165. package/packages/daemon/src/routes/schedules.js +110 -0
  166. package/packages/daemon/src/routes/teams.js +650 -0
  167. package/packages/daemon/src/scheduler.js +456 -24
  168. package/packages/daemon/src/teams.js +1 -1
  169. package/packages/daemon/src/validate.js +38 -1
  170. package/packages/daemon/templates/mlx-setup.json +12 -0
  171. package/packages/daemon/templates/tgi-setup.json +1 -1
  172. package/packages/daemon/templates/vllm-setup.json +1 -1
  173. package/packages/gui/dist/assets/index-Bxc0gU06.js +1006 -0
  174. package/packages/gui/dist/assets/index-C0pztKBn.css +1 -0
  175. package/packages/gui/dist/index.html +2 -2
  176. package/packages/gui/package.json +1 -1
  177. package/packages/gui/src/{app.jsx → App.jsx} +0 -2
  178. package/packages/gui/src/app.css +35 -0
  179. package/packages/gui/src/components/agents/agent-config.jsx +1 -128
  180. package/packages/gui/src/components/agents/agent-feed.jsx +210 -112
  181. package/packages/gui/src/components/agents/agent-node.jsx +8 -13
  182. package/packages/gui/src/components/agents/agent-panel.jsx +2 -70
  183. package/packages/gui/src/components/agents/code-review.jsx +159 -122
  184. package/packages/gui/src/components/agents/diff-viewer.jsx +23 -23
  185. package/packages/gui/src/components/agents/journalist-panel.jsx +1 -1
  186. package/packages/gui/src/components/agents/spawn-wizard.jsx +2 -135
  187. package/packages/gui/src/components/automations/automation-card.jsx +274 -0
  188. package/packages/gui/src/components/automations/automation-wizard.jsx +1136 -0
  189. package/packages/gui/src/components/chat/chat-header.jsx +2 -0
  190. package/packages/gui/src/components/chat/chat-input.jsx +68 -66
  191. package/packages/gui/src/components/chat/chat-view.jsx +4 -8
  192. package/packages/gui/src/components/dashboard/activity-feed.jsx +3 -3
  193. package/packages/gui/src/components/dashboard/cache-ring.jsx +5 -5
  194. package/packages/gui/src/components/dashboard/context-gauges.jsx +6 -8
  195. package/packages/gui/src/components/dashboard/fleet-panel.jsx +8 -14
  196. package/packages/gui/src/components/dashboard/intel-panel.jsx +238 -656
  197. package/packages/gui/src/components/dashboard/kpi-card.jsx +3 -3
  198. package/packages/gui/src/components/dashboard/routing-chart.jsx +3 -3
  199. package/packages/gui/src/components/dashboard/team-burn-panel.jsx +1 -1
  200. package/packages/gui/src/components/dashboard/token-chart.jsx +4 -4
  201. package/packages/gui/src/components/lab/chat-playground.jsx +39 -31
  202. package/packages/gui/src/components/lab/lab-assistant.jsx +316 -82
  203. package/packages/gui/src/components/lab/metrics-panel.jsx +187 -32
  204. package/packages/gui/src/components/lab/parameter-panel.jsx +200 -18
  205. package/packages/gui/src/components/lab/preset-manager.jsx +17 -14
  206. package/packages/gui/src/components/lab/runtime-config.jsx +335 -152
  207. package/packages/gui/src/components/lab/system-prompt-editor.jsx +10 -8
  208. package/packages/gui/src/components/layout/activity-bar.jsx +2 -4
  209. package/packages/gui/src/components/layout/terminal-panel.jsx +4 -2
  210. package/packages/gui/src/components/layout/welcome-splash.jsx +137 -108
  211. package/packages/gui/src/components/network/network-health.jsx +2 -2
  212. package/packages/gui/src/components/network/performance-dashboard.jsx +4 -4
  213. package/packages/gui/src/components/settings/ssh-wizard.jsx +81 -99
  214. package/packages/gui/src/components/ui/sheet.jsx +5 -2
  215. package/packages/gui/src/components/ui/slider.jsx +8 -8
  216. package/packages/gui/src/lib/cron.js +64 -0
  217. package/packages/gui/src/lib/status.js +25 -24
  218. package/packages/gui/src/lib/theme-hex.js +1 -0
  219. package/packages/gui/src/stores/groove.js +51 -3144
  220. package/packages/gui/src/stores/helpers.js +10 -0
  221. package/packages/gui/src/stores/slices/agents-slice.js +459 -0
  222. package/packages/gui/src/stores/slices/automations-slice.js +96 -0
  223. package/packages/gui/src/stores/slices/chat-slice.js +226 -0
  224. package/packages/gui/src/stores/slices/editor-slice.js +285 -0
  225. package/packages/gui/src/stores/slices/marketplace-slice.js +461 -0
  226. package/packages/gui/src/stores/slices/network-slice.js +361 -0
  227. package/packages/gui/src/stores/slices/preview-slice.js +109 -0
  228. package/packages/gui/src/stores/slices/providers-slice.js +897 -0
  229. package/packages/gui/src/stores/slices/teams-slice.js +413 -0
  230. package/packages/gui/src/stores/slices/ui-slice.js +98 -0
  231. package/packages/gui/src/views/agents.jsx +5 -5
  232. package/packages/gui/src/views/dashboard.jsx +12 -13
  233. package/packages/gui/src/views/marketplace.jsx +191 -3
  234. package/packages/gui/src/views/model-lab.jsx +54 -12
  235. package/packages/gui/src/views/models.jsx +419 -496
  236. package/packages/gui/src/views/network.jsx +3 -3
  237. package/packages/gui/src/views/settings.jsx +81 -94
  238. package/packages/gui/src/views/teams.jsx +40 -483
  239. package/SECURITY_SWEEP.md +0 -228
  240. package/TRAINING_DATA_v4.md +0 -6
  241. package/node_modules/@groove-dev/gui/dist/assets/index-CCVvAoQn.css +0 -1
  242. package/node_modules/@groove-dev/gui/dist/assets/index-DGIv_TRm.js +0 -984
  243. package/node_modules/@groove-dev/gui/src/components/agents/agent-chat.jsx +0 -379
  244. package/node_modules/@groove-dev/gui/src/views/preview.jsx +0 -6
  245. package/node_modules/@groove-dev/gui/src/views/subscription-panel.jsx +0 -327
  246. package/packages/gui/dist/assets/index-CCVvAoQn.css +0 -1
  247. package/packages/gui/dist/assets/index-DGIv_TRm.js +0 -984
  248. package/packages/gui/src/components/agents/agent-chat.jsx +0 -379
  249. package/packages/gui/src/views/preview.jsx +0 -6
  250. package/packages/gui/src/views/subscription-panel.jsx +0 -327
  251. package/test.py +0 -571
@@ -11,18 +11,13 @@ import {
11
11
  } from '../helpers/progressEventReducer.js';
12
12
  import resolveConfig from '../helpers/resolveConfig.js';
13
13
  import settle from '../core/settle.js';
14
+ import estimateDataURLDecodedBytes from '../helpers/estimateDataURLDecodedBytes.js';
15
+ import { VERSION } from '../env/data.js';
14
16
 
15
17
  const DEFAULT_CHUNK_SIZE = 64 * 1024;
16
18
 
17
19
  const { isFunction } = utils;
18
20
 
19
- const globalFetchAPI = (({ Request, Response }) => ({
20
- Request,
21
- Response,
22
- }))(utils.global);
23
-
24
- const { ReadableStream, TextEncoder } = utils.global;
25
-
26
21
  const test = (fn, ...args) => {
27
22
  try {
28
23
  return !!fn(...args);
@@ -32,11 +27,17 @@ const test = (fn, ...args) => {
32
27
  };
33
28
 
34
29
  const factory = (env) => {
30
+ const globalObject = utils.global ?? globalThis;
31
+ const { ReadableStream, TextEncoder } = globalObject;
32
+
35
33
  env = utils.merge.call(
36
34
  {
37
35
  skipUndefined: true,
38
36
  },
39
- globalFetchAPI,
37
+ {
38
+ Request: globalObject.Request,
39
+ Response: globalObject.Response,
40
+ },
40
41
  env
41
42
  );
42
43
 
@@ -66,18 +67,20 @@ const factory = (env) => {
66
67
  test(() => {
67
68
  let duplexAccessed = false;
68
69
 
69
- const body = new ReadableStream();
70
-
71
- const hasContentType = new Request(platform.origin, {
72
- body,
70
+ const request = new Request(platform.origin, {
71
+ body: new ReadableStream(),
73
72
  method: 'POST',
74
73
  get duplex() {
75
74
  duplexAccessed = true;
76
75
  return 'half';
77
76
  },
78
- }).headers.has('Content-Type');
77
+ });
79
78
 
80
- body.cancel();
79
+ const hasContentType = request.headers.has('Content-Type');
80
+
81
+ if (request.body != null) {
82
+ request.body.cancel();
83
+ }
81
84
 
82
85
  return duplexAccessed && !hasContentType;
83
86
  });
@@ -161,8 +164,13 @@ const factory = (env) => {
161
164
  headers,
162
165
  withCredentials = 'same-origin',
163
166
  fetchOptions,
167
+ maxContentLength,
168
+ maxBodyLength,
164
169
  } = resolveConfig(config);
165
170
 
171
+ const hasMaxContentLength = utils.isNumber(maxContentLength) && maxContentLength > -1;
172
+ const hasMaxBodyLength = utils.isNumber(maxBodyLength) && maxBodyLength > -1;
173
+
166
174
  let _fetch = envFetch || fetch;
167
175
 
168
176
  responseType = responseType ? (responseType + '').toLowerCase() : 'text';
@@ -184,6 +192,41 @@ const factory = (env) => {
184
192
  let requestContentLength;
185
193
 
186
194
  try {
195
+ // Enforce maxContentLength for data: URLs up-front so we never materialize
196
+ // an oversized payload. The HTTP adapter applies the same check (see http.js
197
+ // "if (protocol === 'data:')" branch).
198
+ if (hasMaxContentLength && typeof url === 'string' && url.startsWith('data:')) {
199
+ const estimated = estimateDataURLDecodedBytes(url);
200
+ if (estimated > maxContentLength) {
201
+ throw new AxiosError(
202
+ 'maxContentLength size of ' + maxContentLength + ' exceeded',
203
+ AxiosError.ERR_BAD_RESPONSE,
204
+ config,
205
+ request
206
+ );
207
+ }
208
+ }
209
+
210
+ // Enforce maxBodyLength against the outbound request body before dispatch.
211
+ // Mirrors http.js behavior (ERR_BAD_REQUEST / 'Request body larger than
212
+ // maxBodyLength limit'). Skip when the body length cannot be determined
213
+ // (e.g. a live ReadableStream supplied by the caller).
214
+ if (hasMaxBodyLength && method !== 'get' && method !== 'head') {
215
+ const outboundLength = await resolveBodyLength(headers, data);
216
+ if (
217
+ typeof outboundLength === 'number' &&
218
+ isFinite(outboundLength) &&
219
+ outboundLength > maxBodyLength
220
+ ) {
221
+ throw new AxiosError(
222
+ 'Request body larger than maxBodyLength limit',
223
+ AxiosError.ERR_BAD_REQUEST,
224
+ config,
225
+ request
226
+ );
227
+ }
228
+ }
229
+
187
230
  if (
188
231
  onUploadProgress &&
189
232
  supportsRequestStream &&
@@ -221,6 +264,22 @@ const factory = (env) => {
221
264
  // see https://github.com/cloudflare/workerd/issues/902
222
265
  const isCredentialsSupported = isRequestSupported && 'credentials' in Request.prototype;
223
266
 
267
+ // If data is FormData and Content-Type is multipart/form-data without boundary,
268
+ // delete it so fetch can set it correctly with the boundary
269
+ if (utils.isFormData(data)) {
270
+ const contentType = headers.getContentType();
271
+ if (
272
+ contentType &&
273
+ /^multipart\/form-data/i.test(contentType) &&
274
+ !/boundary=/i.test(contentType)
275
+ ) {
276
+ headers.delete('content-type');
277
+ }
278
+ }
279
+
280
+ // Set User-Agent header if not already set (fetch defaults to 'node' in Node.js)
281
+ headers.set('User-Agent', 'axios/' + VERSION, false);
282
+
224
283
  const resolvedOptions = {
225
284
  ...fetchOptions,
226
285
  signal: composedSignal,
@@ -237,10 +296,28 @@ const factory = (env) => {
237
296
  ? _fetch(request, fetchOptions)
238
297
  : _fetch(url, resolvedOptions));
239
298
 
299
+ // Cheap pre-check: if the server honestly declares a content-length that
300
+ // already exceeds the cap, reject before we start streaming.
301
+ if (hasMaxContentLength) {
302
+ const declaredLength = utils.toFiniteNumber(response.headers.get('content-length'));
303
+ if (declaredLength != null && declaredLength > maxContentLength) {
304
+ throw new AxiosError(
305
+ 'maxContentLength size of ' + maxContentLength + ' exceeded',
306
+ AxiosError.ERR_BAD_RESPONSE,
307
+ config,
308
+ request
309
+ );
310
+ }
311
+ }
312
+
240
313
  const isStreamResponse =
241
314
  supportsResponseStream && (responseType === 'stream' || responseType === 'response');
242
315
 
243
- if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {
316
+ if (
317
+ supportsResponseStream &&
318
+ response.body &&
319
+ (onDownloadProgress || hasMaxContentLength || (isStreamResponse && unsubscribe))
320
+ ) {
244
321
  const options = {};
245
322
 
246
323
  ['status', 'statusText', 'headers'].forEach((prop) => {
@@ -257,8 +334,24 @@ const factory = (env) => {
257
334
  )) ||
258
335
  [];
259
336
 
337
+ let bytesRead = 0;
338
+ const onChunkProgress = (loadedBytes) => {
339
+ if (hasMaxContentLength) {
340
+ bytesRead = loadedBytes;
341
+ if (bytesRead > maxContentLength) {
342
+ throw new AxiosError(
343
+ 'maxContentLength size of ' + maxContentLength + ' exceeded',
344
+ AxiosError.ERR_BAD_RESPONSE,
345
+ config,
346
+ request
347
+ );
348
+ }
349
+ }
350
+ onProgress && onProgress(loadedBytes);
351
+ };
352
+
260
353
  response = new Response(
261
- trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {
354
+ trackStream(response.body, DEFAULT_CHUNK_SIZE, onChunkProgress, () => {
262
355
  flush && flush();
263
356
  unsubscribe && unsubscribe();
264
357
  }),
@@ -273,6 +366,33 @@ const factory = (env) => {
273
366
  config
274
367
  );
275
368
 
369
+ // Fallback enforcement for environments without ReadableStream support
370
+ // (legacy runtimes). Detect materialized size from typed output; skip
371
+ // streams/Response passthrough since the user will read those themselves.
372
+ if (hasMaxContentLength && !supportsResponseStream && !isStreamResponse) {
373
+ let materializedSize;
374
+ if (responseData != null) {
375
+ if (typeof responseData.byteLength === 'number') {
376
+ materializedSize = responseData.byteLength;
377
+ } else if (typeof responseData.size === 'number') {
378
+ materializedSize = responseData.size;
379
+ } else if (typeof responseData === 'string') {
380
+ materializedSize =
381
+ typeof TextEncoder === 'function'
382
+ ? new TextEncoder().encode(responseData).byteLength
383
+ : responseData.length;
384
+ }
385
+ }
386
+ if (typeof materializedSize === 'number' && materializedSize > maxContentLength) {
387
+ throw new AxiosError(
388
+ 'maxContentLength size of ' + maxContentLength + ' exceeded',
389
+ AxiosError.ERR_BAD_RESPONSE,
390
+ config,
391
+ request
392
+ );
393
+ }
394
+ }
395
+
276
396
  !isStreamResponse && unsubscribe && unsubscribe();
277
397
 
278
398
  return await new Promise((resolve, reject) => {
@@ -288,6 +408,17 @@ const factory = (env) => {
288
408
  } catch (err) {
289
409
  unsubscribe && unsubscribe();
290
410
 
411
+ // Safari can surface fetch aborts as a DOMException-like object whose
412
+ // branded getters throw. Prefer our composed signal reason before reading
413
+ // the caught error, preserving timeout vs cancellation semantics.
414
+ if (composedSignal && composedSignal.aborted && composedSignal.reason instanceof AxiosError) {
415
+ const canceledError = composedSignal.reason;
416
+ canceledError.config = config;
417
+ request && (canceledError.request = request);
418
+ err !== canceledError && (canceledError.cause = err);
419
+ throw canceledError;
420
+ }
421
+
291
422
  if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) {
292
423
  throw Object.assign(
293
424
  new AxiosError(