@withbuddi/buddi 0.1.0-pre.51 → 0.1.0-pre.53

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 (503) hide show
  1. package/extension/background.js +1604 -847
  2. package/extension/manifest.json +3 -3
  3. package/extension/popup.css +91 -3
  4. package/extension/popup.html +49 -32
  5. package/extension/popup.js +215 -123
  6. package/node_modules/@buddi/cli/dist/.tsbuildinfo +1 -1
  7. package/node_modules/@buddi/core/dist/.tsbuildinfo +1 -1
  8. package/node_modules/@buddi/core/dist/plugin/index.d.ts +1 -1
  9. package/node_modules/@buddi/core/dist/plugin/index.d.ts.map +1 -1
  10. package/node_modules/@buddi/core/dist/plugin/index.js.map +1 -1
  11. package/node_modules/@buddi/core/dist/questions/store.d.ts +3 -1
  12. package/node_modules/@buddi/core/dist/questions/store.d.ts.map +1 -1
  13. package/node_modules/@buddi/core/dist/questions/store.js +3 -3
  14. package/node_modules/@buddi/core/dist/questions/store.js.map +1 -1
  15. package/node_modules/@buddi/core/dist/questions/types.d.ts +46 -1
  16. package/node_modules/@buddi/core/dist/questions/types.d.ts.map +1 -1
  17. package/node_modules/@buddi/core/dist/questions/types.js +2 -1
  18. package/node_modules/@buddi/core/dist/questions/types.js.map +1 -1
  19. package/node_modules/@buddi/core/dist/secrets/approval.d.ts +54 -0
  20. package/node_modules/@buddi/core/dist/secrets/approval.d.ts.map +1 -1
  21. package/node_modules/@buddi/core/dist/secrets/approval.js +58 -1
  22. package/node_modules/@buddi/core/dist/secrets/approval.js.map +1 -1
  23. package/node_modules/@buddi/core/dist/secrets/settings.d.ts +178 -0
  24. package/node_modules/@buddi/core/dist/secrets/settings.d.ts.map +1 -1
  25. package/node_modules/@buddi/core/dist/secrets/settings.js +63 -6
  26. package/node_modules/@buddi/core/dist/secrets/settings.js.map +1 -1
  27. package/node_modules/@buddi/core/dist/secrets/store.d.ts +31 -0
  28. package/node_modules/@buddi/core/dist/secrets/store.d.ts.map +1 -1
  29. package/node_modules/@buddi/core/dist/secrets/store.js +75 -0
  30. package/node_modules/@buddi/core/dist/secrets/store.js.map +1 -1
  31. package/node_modules/@buddi/core/dist/secrets/use.d.ts.map +1 -1
  32. package/node_modules/@buddi/core/dist/secrets/use.js +68 -3
  33. package/node_modules/@buddi/core/dist/secrets/use.js.map +1 -1
  34. package/node_modules/@buddi/core/dist/tools.d.ts +22 -0
  35. package/node_modules/@buddi/core/dist/tools.d.ts.map +1 -1
  36. package/node_modules/@buddi/core/dist/tools.js.map +1 -1
  37. package/node_modules/@buddi/core/migrations/080_secret_requests.sql +14 -0
  38. package/node_modules/@buddi/gateway/dist/.tsbuildinfo +1 -1
  39. package/node_modules/@buddi/gateway/dist/chat/session.d.ts.map +1 -1
  40. package/node_modules/@buddi/gateway/dist/chat/session.js +2 -1
  41. package/node_modules/@buddi/gateway/dist/chat/session.js.map +1 -1
  42. package/node_modules/@buddi/gateway/dist/missions/execute.d.ts.map +1 -1
  43. package/node_modules/@buddi/gateway/dist/missions/execute.js +3 -1
  44. package/node_modules/@buddi/gateway/dist/missions/execute.js.map +1 -1
  45. package/node_modules/@buddi/gateway/dist/surfaces/browser-cards.d.ts +15 -3
  46. package/node_modules/@buddi/gateway/dist/surfaces/browser-cards.d.ts.map +1 -1
  47. package/node_modules/@buddi/gateway/dist/surfaces/browser-cards.js +34 -7
  48. package/node_modules/@buddi/gateway/dist/surfaces/browser-cards.js.map +1 -1
  49. package/node_modules/@buddi/gateway/dist/surfaces/offered-actions.d.ts.map +1 -1
  50. package/node_modules/@buddi/gateway/dist/surfaces/offered-actions.js +8 -2
  51. package/node_modules/@buddi/gateway/dist/surfaces/offered-actions.js.map +1 -1
  52. package/node_modules/@buddi/gateway/dist/surfaces/pending-question.d.ts +3 -1
  53. package/node_modules/@buddi/gateway/dist/surfaces/pending-question.d.ts.map +1 -1
  54. package/node_modules/@buddi/gateway/dist/surfaces/pending-question.js.map +1 -1
  55. package/node_modules/@buddi/gateway/dist/surfaces/secret-request.d.ts +173 -0
  56. package/node_modules/@buddi/gateway/dist/surfaces/secret-request.d.ts.map +1 -0
  57. package/node_modules/@buddi/gateway/dist/surfaces/secret-request.js +332 -0
  58. package/node_modules/@buddi/gateway/dist/surfaces/secret-request.js.map +1 -0
  59. package/node_modules/@buddi/gateway/dist/system-context.js +1 -1
  60. package/node_modules/@buddi/gateway/dist/system-context.js.map +1 -1
  61. package/node_modules/@buddi/gateway/dist/telegram/main.d.ts.map +1 -1
  62. package/node_modules/@buddi/gateway/dist/telegram/main.js +14 -3
  63. package/node_modules/@buddi/gateway/dist/telegram/main.js.map +1 -1
  64. package/node_modules/@buddi/gateway/dist/telegram/surface.d.ts.map +1 -1
  65. package/node_modules/@buddi/gateway/dist/telegram/surface.js +4 -1
  66. package/node_modules/@buddi/gateway/dist/telegram/surface.js.map +1 -1
  67. package/node_modules/@buddi/gateway/dist/web/api-routes.d.ts.map +1 -1
  68. package/node_modules/@buddi/gateway/dist/web/api-routes.js +9 -1
  69. package/node_modules/@buddi/gateway/dist/web/api-routes.js.map +1 -1
  70. package/node_modules/@buddi/gateway/dist/web/approval-ask.js +2 -2
  71. package/node_modules/@buddi/gateway/dist/web/approval-ask.js.map +1 -1
  72. package/node_modules/@buddi/gateway/dist/web/browser-capture.d.ts +13 -0
  73. package/node_modules/@buddi/gateway/dist/web/browser-capture.d.ts.map +1 -0
  74. package/node_modules/@buddi/gateway/dist/web/browser-capture.js +24 -0
  75. package/node_modules/@buddi/gateway/dist/web/browser-capture.js.map +1 -0
  76. package/node_modules/@buddi/gateway/dist/web/chat.d.ts +26 -0
  77. package/node_modules/@buddi/gateway/dist/web/chat.d.ts.map +1 -1
  78. package/node_modules/@buddi/gateway/dist/web/chat.js +87 -2
  79. package/node_modules/@buddi/gateway/dist/web/chat.js.map +1 -1
  80. package/node_modules/@buddi/gateway/dist/web/extension.d.ts +30 -0
  81. package/node_modules/@buddi/gateway/dist/web/extension.d.ts.map +1 -1
  82. package/node_modules/@buddi/gateway/dist/web/extension.js +86 -6
  83. package/node_modules/@buddi/gateway/dist/web/extension.js.map +1 -1
  84. package/node_modules/@buddi/gateway/dist/web/onboarding.js +1 -1
  85. package/node_modules/@buddi/gateway/dist/web/onboarding.js.map +1 -1
  86. package/node_modules/@buddi/gateway/dist/web/remote-hand.d.ts +26 -2
  87. package/node_modules/@buddi/gateway/dist/web/remote-hand.d.ts.map +1 -1
  88. package/node_modules/@buddi/gateway/dist/web/remote-hand.js +89 -28
  89. package/node_modules/@buddi/gateway/dist/web/remote-hand.js.map +1 -1
  90. package/node_modules/@buddi/gateway/dist/web/secret-request.d.ts +54 -0
  91. package/node_modules/@buddi/gateway/dist/web/secret-request.d.ts.map +1 -0
  92. package/node_modules/@buddi/gateway/dist/web/secret-request.js +264 -0
  93. package/node_modules/@buddi/gateway/dist/web/secret-request.js.map +1 -0
  94. package/node_modules/@buddi/gateway/dist/web/secrets.d.ts +1 -0
  95. package/node_modules/@buddi/gateway/dist/web/secrets.d.ts.map +1 -1
  96. package/node_modules/@buddi/gateway/dist/web/secrets.js +1 -1
  97. package/node_modules/@buddi/gateway/dist/web/secrets.js.map +1 -1
  98. package/node_modules/@buddi/gateway/dist/web/server.d.ts.map +1 -1
  99. package/node_modules/@buddi/gateway/dist/web/server.js +72 -3
  100. package/node_modules/@buddi/gateway/dist/web/server.js.map +1 -1
  101. package/node_modules/@buddi/install/dist/.tsbuildinfo +1 -1
  102. package/node_modules/@buddi/install/dist/app-layout.d.ts +24 -0
  103. package/node_modules/@buddi/install/dist/app-layout.d.ts.map +1 -1
  104. package/node_modules/@buddi/install/dist/app-layout.js +64 -2
  105. package/node_modules/@buddi/install/dist/app-layout.js.map +1 -1
  106. package/node_modules/@buddi/install/dist/launcher.d.ts.map +1 -1
  107. package/node_modules/@buddi/install/dist/launcher.js +89 -10
  108. package/node_modules/@buddi/install/dist/launcher.js.map +1 -1
  109. package/node_modules/@buddi/install/dist/linux-install.d.ts +41 -0
  110. package/node_modules/@buddi/install/dist/linux-install.d.ts.map +1 -0
  111. package/node_modules/@buddi/install/dist/linux-install.js +86 -0
  112. package/node_modules/@buddi/install/dist/linux-install.js.map +1 -0
  113. package/node_modules/@buddi/install/dist/runtime-info.d.ts +23 -0
  114. package/node_modules/@buddi/install/dist/runtime-info.d.ts.map +1 -0
  115. package/node_modules/@buddi/install/dist/runtime-info.js +69 -0
  116. package/node_modules/@buddi/install/dist/runtime-info.js.map +1 -0
  117. package/node_modules/@buddi/install/dist/supervisor.d.ts.map +1 -1
  118. package/node_modules/@buddi/install/dist/supervisor.js +8 -6
  119. package/node_modules/@buddi/install/dist/supervisor.js.map +1 -1
  120. package/node_modules/@buddi/install/dist/uninstall.d.ts +20 -0
  121. package/node_modules/@buddi/install/dist/uninstall.d.ts.map +1 -1
  122. package/node_modules/@buddi/install/dist/uninstall.js +50 -1
  123. package/node_modules/@buddi/install/dist/uninstall.js.map +1 -1
  124. package/node_modules/@buddi/install/dist/upgrade.d.ts +4 -1
  125. package/node_modules/@buddi/install/dist/upgrade.d.ts.map +1 -1
  126. package/node_modules/@buddi/install/dist/upgrade.js +77 -51
  127. package/node_modules/@buddi/install/dist/upgrade.js.map +1 -1
  128. package/node_modules/@buddi/runtime/dist/.tsbuildinfo +1 -1
  129. package/node_modules/@buddi/runtime/dist/anthropic.d.ts +7 -0
  130. package/node_modules/@buddi/runtime/dist/anthropic.d.ts.map +1 -1
  131. package/node_modules/@buddi/runtime/dist/anthropic.js +19 -1
  132. package/node_modules/@buddi/runtime/dist/anthropic.js.map +1 -1
  133. package/node_modules/@buddi/tool-artifacts/dist/.tsbuildinfo +1 -1
  134. package/node_modules/@buddi/tool-browser/dist/.tsbuildinfo +1 -1
  135. package/node_modules/@buddi/tool-browser/dist/controller.d.ts +16 -1
  136. package/node_modules/@buddi/tool-browser/dist/controller.d.ts.map +1 -1
  137. package/node_modules/@buddi/tool-browser/dist/controller.js +59 -5
  138. package/node_modules/@buddi/tool-browser/dist/controller.js.map +1 -1
  139. package/node_modules/@buddi/tool-browser/dist/driver.d.ts +12 -0
  140. package/node_modules/@buddi/tool-browser/dist/driver.d.ts.map +1 -1
  141. package/node_modules/@buddi/tool-browser/dist/driver.js +41 -2
  142. package/node_modules/@buddi/tool-browser/dist/driver.js.map +1 -1
  143. package/node_modules/@buddi/tool-browser/dist/extension.d.ts +49 -9
  144. package/node_modules/@buddi/tool-browser/dist/extension.d.ts.map +1 -1
  145. package/node_modules/@buddi/tool-browser/dist/extension.js +145 -21
  146. package/node_modules/@buddi/tool-browser/dist/extension.js.map +1 -1
  147. package/node_modules/@buddi/tool-browser/dist/index.d.ts +10 -6
  148. package/node_modules/@buddi/tool-browser/dist/index.d.ts.map +1 -1
  149. package/node_modules/@buddi/tool-browser/dist/index.js +22 -8
  150. package/node_modules/@buddi/tool-browser/dist/index.js.map +1 -1
  151. package/node_modules/@buddi/tool-browser/dist/routes.d.ts +10 -1
  152. package/node_modules/@buddi/tool-browser/dist/routes.d.ts.map +1 -1
  153. package/node_modules/@buddi/tool-browser/dist/routes.js +24 -0
  154. package/node_modules/@buddi/tool-browser/dist/routes.js.map +1 -1
  155. package/node_modules/@buddi/tool-browser/dist/service.d.ts +48 -1
  156. package/node_modules/@buddi/tool-browser/dist/service.d.ts.map +1 -1
  157. package/node_modules/@buddi/tool-browser/dist/service.js +114 -11
  158. package/node_modules/@buddi/tool-browser/dist/service.js.map +1 -1
  159. package/node_modules/@buddi/tool-browser/dist/types.d.ts +54 -3
  160. package/node_modules/@buddi/tool-browser/dist/types.d.ts.map +1 -1
  161. package/node_modules/@buddi/tool-browser/dist/types.js +17 -1
  162. package/node_modules/@buddi/tool-browser/dist/types.js.map +1 -1
  163. package/node_modules/@buddi/tool-email/dist/.tsbuildinfo +1 -1
  164. package/node_modules/@buddi/tool-host/dist/.tsbuildinfo +1 -1
  165. package/node_modules/@buddi/tool-mcp/dist/.tsbuildinfo +1 -1
  166. package/node_modules/@buddi/tool-memory/dist/.tsbuildinfo +1 -1
  167. package/node_modules/@buddi/tool-web/dist/.tsbuildinfo +1 -1
  168. package/node_modules/@hono/node-server/package.json +2 -2
  169. package/node_modules/@types/node/README.md +1 -1
  170. package/node_modules/@types/node/package.json +2 -2
  171. package/node_modules/@types/node/util.d.ts +6 -3
  172. package/node_modules/content-disposition/README.md +105 -35
  173. package/node_modules/content-disposition/dist/index.d.ts +72 -0
  174. package/node_modules/content-disposition/dist/index.js +388 -0
  175. package/node_modules/content-disposition/dist/index.js.map +1 -0
  176. package/node_modules/content-disposition/package.json +31 -19
  177. package/node_modules/docx/dist/index.cjs +182 -80
  178. package/node_modules/docx/dist/index.d.cts +63 -6
  179. package/node_modules/docx/dist/index.d.ts +63 -6
  180. package/node_modules/docx/dist/index.iife.js +182 -80
  181. package/node_modules/docx/dist/index.mjs +182 -80
  182. package/node_modules/docx/dist/index.umd.cjs +182 -80
  183. package/node_modules/docx/dist/layout.cjs +1 -6
  184. package/node_modules/docx/dist/layout.iife.js +1 -6
  185. package/node_modules/docx/dist/layout.mjs +1 -6
  186. package/node_modules/docx/dist/layout.umd.cjs +1 -6
  187. package/node_modules/docx/package.json +4 -3
  188. package/node_modules/express/Readme.md +15 -9
  189. package/node_modules/express/lib/application.js +2 -2
  190. package/node_modules/express/lib/request.js +32 -19
  191. package/node_modules/express/lib/response.js +27 -30
  192. package/node_modules/express/node_modules/content-type/LICENSE +22 -0
  193. package/node_modules/express/node_modules/content-type/README.md +71 -0
  194. package/node_modules/express/node_modules/content-type/dist/index.d.ts +46 -0
  195. package/node_modules/express/node_modules/content-type/dist/index.js +176 -0
  196. package/node_modules/express/node_modules/content-type/dist/index.js.map +1 -0
  197. package/node_modules/express/node_modules/content-type/package.json +52 -0
  198. package/node_modules/express/package.json +10 -10
  199. package/node_modules/imapflow/CHANGELOG.md +48 -0
  200. package/node_modules/imapflow/dist/cjs/commands/append.d.ts +1 -1
  201. package/node_modules/imapflow/dist/cjs/commands/append.js +15 -4
  202. package/node_modules/imapflow/dist/cjs/commands/compress.js +2 -2
  203. package/node_modules/imapflow/dist/cjs/commands/id.js +5 -3
  204. package/node_modules/imapflow/dist/cjs/commands/idle.js +9 -9
  205. package/node_modules/imapflow/dist/cjs/commands/list.js +2 -2
  206. package/node_modules/imapflow/dist/cjs/commands/namespace.js +18 -14
  207. package/node_modules/imapflow/dist/cjs/commands/quota.js +2 -3
  208. package/node_modules/imapflow/dist/cjs/commands/select.d.ts +3 -14
  209. package/node_modules/imapflow/dist/cjs/commands/select.js +1 -4
  210. package/node_modules/imapflow/dist/cjs/commands/status.js +2 -4
  211. package/node_modules/imapflow/dist/cjs/connection-deadline.d.ts +1 -1
  212. package/node_modules/imapflow/dist/cjs/connection-deadline.js +2 -4
  213. package/node_modules/imapflow/dist/cjs/download.js +66 -35
  214. package/node_modules/imapflow/dist/cjs/errors.d.ts +15 -0
  215. package/node_modules/imapflow/dist/cjs/errors.js +22 -0
  216. package/node_modules/imapflow/dist/cjs/handler/imap-compiler.d.ts +4 -4
  217. package/node_modules/imapflow/dist/cjs/handler/imap-compiler.js +18 -18
  218. package/node_modules/imapflow/dist/cjs/handler/imap-parser.js +28 -3
  219. package/node_modules/imapflow/dist/cjs/handler/imap-stream.js +9 -8
  220. package/node_modules/imapflow/dist/cjs/handler/limits.d.ts +1 -1
  221. package/node_modules/imapflow/dist/cjs/handler/limits.js +5 -7
  222. package/node_modules/imapflow/dist/cjs/handler/parser-instance.js +23 -38
  223. package/node_modules/imapflow/dist/cjs/handler/token-parser.d.ts +12 -0
  224. package/node_modules/imapflow/dist/cjs/handler/token-parser.js +44 -104
  225. package/node_modules/imapflow/dist/cjs/imap-flow.d.ts +4 -3
  226. package/node_modules/imapflow/dist/cjs/imap-flow.js +128 -78
  227. package/node_modules/imapflow/dist/cjs/package-info.d.ts +1 -1
  228. package/node_modules/imapflow/dist/cjs/package-info.js +1 -1
  229. package/node_modules/imapflow/dist/cjs/proxy-connection.js +2 -5
  230. package/node_modules/imapflow/dist/cjs/search-compiler.js +2 -3
  231. package/node_modules/imapflow/dist/cjs/tools.d.ts +24 -3
  232. package/node_modules/imapflow/dist/cjs/tools.js +59 -18
  233. package/node_modules/imapflow/dist/cjs/types.d.ts +20 -1
  234. package/node_modules/imapflow/dist/esm/commands/append.d.ts +1 -1
  235. package/node_modules/imapflow/dist/esm/commands/append.js +15 -4
  236. package/node_modules/imapflow/dist/esm/commands/compress.js +2 -2
  237. package/node_modules/imapflow/dist/esm/commands/id.js +6 -4
  238. package/node_modules/imapflow/dist/esm/commands/idle.js +9 -9
  239. package/node_modules/imapflow/dist/esm/commands/list.js +3 -3
  240. package/node_modules/imapflow/dist/esm/commands/namespace.js +19 -15
  241. package/node_modules/imapflow/dist/esm/commands/quota.js +3 -4
  242. package/node_modules/imapflow/dist/esm/commands/select.d.ts +3 -14
  243. package/node_modules/imapflow/dist/esm/commands/select.js +1 -4
  244. package/node_modules/imapflow/dist/esm/commands/status.js +2 -4
  245. package/node_modules/imapflow/dist/esm/connection-deadline.d.ts +1 -1
  246. package/node_modules/imapflow/dist/esm/connection-deadline.js +2 -4
  247. package/node_modules/imapflow/dist/esm/download.js +66 -35
  248. package/node_modules/imapflow/dist/esm/errors.d.ts +15 -0
  249. package/node_modules/imapflow/dist/esm/errors.js +21 -0
  250. package/node_modules/imapflow/dist/esm/handler/imap-compiler.d.ts +4 -4
  251. package/node_modules/imapflow/dist/esm/handler/imap-compiler.js +18 -18
  252. package/node_modules/imapflow/dist/esm/handler/imap-parser.js +28 -3
  253. package/node_modules/imapflow/dist/esm/handler/imap-stream.js +9 -8
  254. package/node_modules/imapflow/dist/esm/handler/limits.d.ts +1 -1
  255. package/node_modules/imapflow/dist/esm/handler/limits.js +5 -7
  256. package/node_modules/imapflow/dist/esm/handler/parser-instance.js +23 -38
  257. package/node_modules/imapflow/dist/esm/handler/token-parser.d.ts +12 -0
  258. package/node_modules/imapflow/dist/esm/handler/token-parser.js +44 -104
  259. package/node_modules/imapflow/dist/esm/imap-flow.d.ts +4 -3
  260. package/node_modules/imapflow/dist/esm/imap-flow.js +130 -80
  261. package/node_modules/imapflow/dist/esm/package-info.d.ts +1 -1
  262. package/node_modules/imapflow/dist/esm/package-info.js +1 -1
  263. package/node_modules/imapflow/dist/esm/proxy-connection.js +2 -5
  264. package/node_modules/imapflow/dist/esm/search-compiler.js +2 -3
  265. package/node_modules/imapflow/dist/esm/tools.d.ts +24 -3
  266. package/node_modules/imapflow/dist/esm/tools.js +58 -19
  267. package/node_modules/imapflow/dist/esm/types.d.ts +20 -1
  268. package/node_modules/imapflow/package.json +6 -3
  269. package/node_modules/playwright/README.md +4 -4
  270. package/node_modules/playwright/lib/agents/playwright-test-generator.agent.md +1 -1
  271. package/node_modules/playwright/lib/cli/testActions.js +8 -5
  272. package/node_modules/playwright/lib/common/index.js +37 -23
  273. package/node_modules/playwright/lib/common/index.js.txt +8 -9
  274. package/node_modules/playwright/lib/index.js +16 -4
  275. package/node_modules/playwright/lib/matchers/expect.js +13 -7
  276. package/node_modules/playwright/lib/matchers/expect.js.txt +4 -4
  277. package/node_modules/playwright/lib/program.js +2 -1
  278. package/node_modules/playwright/lib/runner/index.js +438 -244
  279. package/node_modules/playwright/lib/runner/index.js.txt +12 -11
  280. package/node_modules/playwright/lib/transform/babelBundle.js +2612 -2396
  281. package/node_modules/playwright/lib/transform/babelBundle.js.LICENSE +15 -15
  282. package/node_modules/playwright/lib/transform/babelBundle.js.txt +14 -11
  283. package/node_modules/playwright/lib/transform/esmLoader.js +17 -5
  284. package/node_modules/playwright/lib/transform/esmLoader.js.txt +3 -3
  285. package/node_modules/playwright/lib/worker/workerProcessEntry.js +17 -18
  286. package/node_modules/playwright/package.json +2 -7
  287. package/node_modules/playwright/types/test.d.ts +156 -39
  288. package/node_modules/playwright-core/browsers.json +9 -9
  289. package/node_modules/playwright-core/cli.js +1 -0
  290. package/node_modules/playwright-core/lib/bootstrap.js +61 -0
  291. package/node_modules/playwright-core/lib/coreBundle.js +6393 -4170
  292. package/node_modules/playwright-core/lib/server/electron/loader.js +4 -0
  293. package/node_modules/playwright-core/lib/tools/cli-client/cli.js +2 -1
  294. package/node_modules/playwright-core/lib/tools/cli-client/help.json +99 -12
  295. package/node_modules/playwright-core/lib/tools/cli-client/output.js +17 -16
  296. package/node_modules/playwright-core/lib/tools/cli-client/program.js +8 -4
  297. package/node_modules/playwright-core/lib/tools/cli-client/session.js +2 -0
  298. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/SKILL.md +71 -3
  299. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/pr-attachments.md +60 -0
  300. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/running-code.md +4 -0
  301. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/session-management.md +2 -0
  302. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/test-generation.md +1 -1
  303. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/video-recording.md +76 -3
  304. package/node_modules/playwright-core/lib/tools/skills/playwright-trace/SKILL.md +1 -1
  305. package/node_modules/playwright-core/lib/utilsBundle.js +948 -227
  306. package/node_modules/playwright-core/lib/utilsBundle.js.LICENSE +6 -6
  307. package/node_modules/playwright-core/lib/vite/htmlReport/report.js +1 -1
  308. package/node_modules/playwright-core/lib/vite/recorder/assets/{codeMirrorModule-CVQWJZAA.js → codeMirrorModule-DK72OMRi.js} +1 -1
  309. package/node_modules/playwright-core/lib/vite/recorder/assets/index-Cn0mmDuv.js +129 -0
  310. package/node_modules/playwright-core/lib/vite/recorder/index.html +1 -1
  311. package/node_modules/playwright-core/lib/vite/traceViewer/assets/{codeMirrorModule-BbkfBe3n.js → codeMirrorModule-BEB2e8M3.js} +1 -1
  312. package/node_modules/playwright-core/lib/vite/traceViewer/assets/defaultSettingsView-D-g2vrvf.js +184 -0
  313. package/node_modules/playwright-core/lib/vite/traceViewer/assets/{xtermModule-DywYcAf8.js → xtermModule-B794rD2Z.js} +1 -1
  314. package/node_modules/playwright-core/lib/vite/traceViewer/{defaultSettingsView.Bqk9acqE.css → defaultSettingsView.C8BeHuxd.css} +1 -1
  315. package/node_modules/playwright-core/lib/vite/traceViewer/{index.B4cLoZK3.js → index.7-c5LSTW.js} +1 -1
  316. package/node_modules/playwright-core/lib/vite/traceViewer/index.html +3 -3
  317. package/node_modules/playwright-core/lib/vite/traceViewer/sw.bundle.js +3 -3
  318. package/node_modules/playwright-core/lib/vite/traceViewer/{uiMode.CU5KtEkS.js → uiMode.CYwC_gH1.js} +4 -4
  319. package/node_modules/playwright-core/lib/vite/traceViewer/uiMode.html +3 -3
  320. package/node_modules/playwright-core/package.json +1 -1
  321. package/node_modules/playwright-core/types/protocol.d.ts +468 -337
  322. package/node_modules/playwright-core/types/types.d.ts +572 -37
  323. package/node_modules/process-warning/.github/workflows/ci.yml +1 -1
  324. package/node_modules/process-warning/.github/workflows/lock-threads.yml +1 -1
  325. package/node_modules/process-warning/.github/workflows/release.yml +24 -0
  326. package/node_modules/process-warning/README.md +46 -46
  327. package/node_modules/process-warning/package.json +1 -1
  328. package/package.json +2 -2
  329. package/packages/cli/dist/.tsbuildinfo +1 -1
  330. package/packages/core/dist/.tsbuildinfo +1 -1
  331. package/packages/core/dist/plugin/index.d.ts +1 -1
  332. package/packages/core/dist/plugin/index.d.ts.map +1 -1
  333. package/packages/core/dist/plugin/index.js.map +1 -1
  334. package/packages/core/dist/questions/store.d.ts +3 -1
  335. package/packages/core/dist/questions/store.d.ts.map +1 -1
  336. package/packages/core/dist/questions/store.js +3 -3
  337. package/packages/core/dist/questions/store.js.map +1 -1
  338. package/packages/core/dist/questions/types.d.ts +46 -1
  339. package/packages/core/dist/questions/types.d.ts.map +1 -1
  340. package/packages/core/dist/questions/types.js +2 -1
  341. package/packages/core/dist/questions/types.js.map +1 -1
  342. package/packages/core/dist/secrets/approval.d.ts +54 -0
  343. package/packages/core/dist/secrets/approval.d.ts.map +1 -1
  344. package/packages/core/dist/secrets/approval.js +58 -1
  345. package/packages/core/dist/secrets/approval.js.map +1 -1
  346. package/packages/core/dist/secrets/settings.d.ts +178 -0
  347. package/packages/core/dist/secrets/settings.d.ts.map +1 -1
  348. package/packages/core/dist/secrets/settings.js +63 -6
  349. package/packages/core/dist/secrets/settings.js.map +1 -1
  350. package/packages/core/dist/secrets/store.d.ts +31 -0
  351. package/packages/core/dist/secrets/store.d.ts.map +1 -1
  352. package/packages/core/dist/secrets/store.js +75 -0
  353. package/packages/core/dist/secrets/store.js.map +1 -1
  354. package/packages/core/dist/secrets/use.d.ts.map +1 -1
  355. package/packages/core/dist/secrets/use.js +68 -3
  356. package/packages/core/dist/secrets/use.js.map +1 -1
  357. package/packages/core/dist/tools.d.ts +22 -0
  358. package/packages/core/dist/tools.d.ts.map +1 -1
  359. package/packages/core/dist/tools.js.map +1 -1
  360. package/packages/core/migrations/080_secret_requests.sql +14 -0
  361. package/packages/gateway/dist/.tsbuildinfo +1 -1
  362. package/packages/gateway/dist/chat/session.d.ts.map +1 -1
  363. package/packages/gateway/dist/chat/session.js +2 -1
  364. package/packages/gateway/dist/chat/session.js.map +1 -1
  365. package/packages/gateway/dist/missions/execute.d.ts.map +1 -1
  366. package/packages/gateway/dist/missions/execute.js +3 -1
  367. package/packages/gateway/dist/missions/execute.js.map +1 -1
  368. package/packages/gateway/dist/surfaces/browser-cards.d.ts +15 -3
  369. package/packages/gateway/dist/surfaces/browser-cards.d.ts.map +1 -1
  370. package/packages/gateway/dist/surfaces/browser-cards.js +34 -7
  371. package/packages/gateway/dist/surfaces/browser-cards.js.map +1 -1
  372. package/packages/gateway/dist/surfaces/offered-actions.d.ts.map +1 -1
  373. package/packages/gateway/dist/surfaces/offered-actions.js +8 -2
  374. package/packages/gateway/dist/surfaces/offered-actions.js.map +1 -1
  375. package/packages/gateway/dist/surfaces/pending-question.d.ts +3 -1
  376. package/packages/gateway/dist/surfaces/pending-question.d.ts.map +1 -1
  377. package/packages/gateway/dist/surfaces/pending-question.js.map +1 -1
  378. package/packages/gateway/dist/surfaces/secret-request.d.ts +173 -0
  379. package/packages/gateway/dist/surfaces/secret-request.d.ts.map +1 -0
  380. package/packages/gateway/dist/surfaces/secret-request.js +332 -0
  381. package/packages/gateway/dist/surfaces/secret-request.js.map +1 -0
  382. package/packages/gateway/dist/system-context.js +1 -1
  383. package/packages/gateway/dist/system-context.js.map +1 -1
  384. package/packages/gateway/dist/telegram/main.d.ts.map +1 -1
  385. package/packages/gateway/dist/telegram/main.js +14 -3
  386. package/packages/gateway/dist/telegram/main.js.map +1 -1
  387. package/packages/gateway/dist/telegram/surface.d.ts.map +1 -1
  388. package/packages/gateway/dist/telegram/surface.js +4 -1
  389. package/packages/gateway/dist/telegram/surface.js.map +1 -1
  390. package/packages/gateway/dist/web/api-routes.d.ts.map +1 -1
  391. package/packages/gateway/dist/web/api-routes.js +9 -1
  392. package/packages/gateway/dist/web/api-routes.js.map +1 -1
  393. package/packages/gateway/dist/web/approval-ask.js +2 -2
  394. package/packages/gateway/dist/web/approval-ask.js.map +1 -1
  395. package/packages/gateway/dist/web/browser-capture.d.ts +13 -0
  396. package/packages/gateway/dist/web/browser-capture.d.ts.map +1 -0
  397. package/packages/gateway/dist/web/browser-capture.js +24 -0
  398. package/packages/gateway/dist/web/browser-capture.js.map +1 -0
  399. package/packages/gateway/dist/web/chat.d.ts +26 -0
  400. package/packages/gateway/dist/web/chat.d.ts.map +1 -1
  401. package/packages/gateway/dist/web/chat.js +87 -2
  402. package/packages/gateway/dist/web/chat.js.map +1 -1
  403. package/packages/gateway/dist/web/extension.d.ts +30 -0
  404. package/packages/gateway/dist/web/extension.d.ts.map +1 -1
  405. package/packages/gateway/dist/web/extension.js +86 -6
  406. package/packages/gateway/dist/web/extension.js.map +1 -1
  407. package/packages/gateway/dist/web/onboarding.js +1 -1
  408. package/packages/gateway/dist/web/onboarding.js.map +1 -1
  409. package/packages/gateway/dist/web/remote-hand.d.ts +26 -2
  410. package/packages/gateway/dist/web/remote-hand.d.ts.map +1 -1
  411. package/packages/gateway/dist/web/remote-hand.js +89 -28
  412. package/packages/gateway/dist/web/remote-hand.js.map +1 -1
  413. package/packages/gateway/dist/web/secret-request.d.ts +54 -0
  414. package/packages/gateway/dist/web/secret-request.d.ts.map +1 -0
  415. package/packages/gateway/dist/web/secret-request.js +264 -0
  416. package/packages/gateway/dist/web/secret-request.js.map +1 -0
  417. package/packages/gateway/dist/web/secrets.d.ts +1 -0
  418. package/packages/gateway/dist/web/secrets.d.ts.map +1 -1
  419. package/packages/gateway/dist/web/secrets.js +1 -1
  420. package/packages/gateway/dist/web/secrets.js.map +1 -1
  421. package/packages/gateway/dist/web/server.d.ts.map +1 -1
  422. package/packages/gateway/dist/web/server.js +72 -3
  423. package/packages/gateway/dist/web/server.js.map +1 -1
  424. package/packages/install/dist/.tsbuildinfo +1 -1
  425. package/packages/install/dist/app-layout.d.ts +24 -0
  426. package/packages/install/dist/app-layout.d.ts.map +1 -1
  427. package/packages/install/dist/app-layout.js +64 -2
  428. package/packages/install/dist/app-layout.js.map +1 -1
  429. package/packages/install/dist/launcher.d.ts.map +1 -1
  430. package/packages/install/dist/launcher.js +89 -10
  431. package/packages/install/dist/launcher.js.map +1 -1
  432. package/packages/install/dist/linux-install.d.ts +41 -0
  433. package/packages/install/dist/linux-install.d.ts.map +1 -0
  434. package/packages/install/dist/linux-install.js +86 -0
  435. package/packages/install/dist/linux-install.js.map +1 -0
  436. package/packages/install/dist/runtime-info.d.ts +23 -0
  437. package/packages/install/dist/runtime-info.d.ts.map +1 -0
  438. package/packages/install/dist/runtime-info.js +69 -0
  439. package/packages/install/dist/runtime-info.js.map +1 -0
  440. package/packages/install/dist/supervisor.d.ts.map +1 -1
  441. package/packages/install/dist/supervisor.js +8 -6
  442. package/packages/install/dist/supervisor.js.map +1 -1
  443. package/packages/install/dist/uninstall.d.ts +20 -0
  444. package/packages/install/dist/uninstall.d.ts.map +1 -1
  445. package/packages/install/dist/uninstall.js +50 -1
  446. package/packages/install/dist/uninstall.js.map +1 -1
  447. package/packages/install/dist/upgrade.d.ts +4 -1
  448. package/packages/install/dist/upgrade.d.ts.map +1 -1
  449. package/packages/install/dist/upgrade.js +77 -51
  450. package/packages/install/dist/upgrade.js.map +1 -1
  451. package/packages/runtime/dist/.tsbuildinfo +1 -1
  452. package/packages/runtime/dist/anthropic.d.ts +7 -0
  453. package/packages/runtime/dist/anthropic.d.ts.map +1 -1
  454. package/packages/runtime/dist/anthropic.js +19 -1
  455. package/packages/runtime/dist/anthropic.js.map +1 -1
  456. package/packages/tools/artifacts/dist/.tsbuildinfo +1 -1
  457. package/packages/tools/browser/dist/.tsbuildinfo +1 -1
  458. package/packages/tools/browser/dist/controller.d.ts +16 -1
  459. package/packages/tools/browser/dist/controller.d.ts.map +1 -1
  460. package/packages/tools/browser/dist/controller.js +59 -5
  461. package/packages/tools/browser/dist/controller.js.map +1 -1
  462. package/packages/tools/browser/dist/driver.d.ts +12 -0
  463. package/packages/tools/browser/dist/driver.d.ts.map +1 -1
  464. package/packages/tools/browser/dist/driver.js +41 -2
  465. package/packages/tools/browser/dist/driver.js.map +1 -1
  466. package/packages/tools/browser/dist/extension.d.ts +49 -9
  467. package/packages/tools/browser/dist/extension.d.ts.map +1 -1
  468. package/packages/tools/browser/dist/extension.js +145 -21
  469. package/packages/tools/browser/dist/extension.js.map +1 -1
  470. package/packages/tools/browser/dist/index.d.ts +10 -6
  471. package/packages/tools/browser/dist/index.d.ts.map +1 -1
  472. package/packages/tools/browser/dist/index.js +22 -8
  473. package/packages/tools/browser/dist/index.js.map +1 -1
  474. package/packages/tools/browser/dist/routes.d.ts +10 -1
  475. package/packages/tools/browser/dist/routes.d.ts.map +1 -1
  476. package/packages/tools/browser/dist/routes.js +24 -0
  477. package/packages/tools/browser/dist/routes.js.map +1 -1
  478. package/packages/tools/browser/dist/service.d.ts +48 -1
  479. package/packages/tools/browser/dist/service.d.ts.map +1 -1
  480. package/packages/tools/browser/dist/service.js +114 -11
  481. package/packages/tools/browser/dist/service.js.map +1 -1
  482. package/packages/tools/browser/dist/types.d.ts +54 -3
  483. package/packages/tools/browser/dist/types.d.ts.map +1 -1
  484. package/packages/tools/browser/dist/types.js +17 -1
  485. package/packages/tools/browser/dist/types.js.map +1 -1
  486. package/packages/tools/email/dist/.tsbuildinfo +1 -1
  487. package/packages/tools/host/dist/.tsbuildinfo +1 -1
  488. package/packages/tools/mcp/dist/.tsbuildinfo +1 -1
  489. package/packages/tools/memory/dist/.tsbuildinfo +1 -1
  490. package/packages/tools/web/dist/.tsbuildinfo +1 -1
  491. package/packages/web/dist/assets/index-DgpPl0TR.js +155 -0
  492. package/packages/web/dist/assets/index-rMRjibNI.css +1 -0
  493. package/packages/web/dist/assets/{lottie_light-D7CS-IeP.js → lottie_light-twPed1FM.js} +1 -1
  494. package/packages/web/dist/build.json +1 -1
  495. package/packages/web/dist/index.html +2 -2
  496. package/packages/web/dist/precache.json +4 -4
  497. package/node_modules/content-disposition/index.js +0 -536
  498. package/node_modules/playwright/jsx-runtime.js +0 -42
  499. package/node_modules/playwright/jsx-runtime.mjs +0 -21
  500. package/node_modules/playwright-core/lib/vite/recorder/assets/index-hrlLqLtq.js +0 -129
  501. package/node_modules/playwright-core/lib/vite/traceViewer/assets/defaultSettingsView-Ds6CBOo0.js +0 -182
  502. package/packages/web/dist/assets/index-BibqUZwt.js +0 -155
  503. package/packages/web/dist/assets/index-DBVZzTau.css +0 -1
@@ -18,6 +18,7 @@ const limited_passthrough_js_1 = require("./limited-passthrough.js");
18
18
  // What a wait on the head stream listens for: it can take more input, it failed, or it went
19
19
  // away (a consumer destroying it closes it without a 'drain')
20
20
  const DRAIN_WAIT_EVENTS = ['drain', 'error', 'close'];
21
+ const errors_js_1 = require("./errors.js");
21
22
  const tools_js_1 = require("./tools.js");
22
23
  const isEmptySection = (value) => !value?.length;
23
24
  /**
@@ -40,8 +41,9 @@ const partialStarts = (requests) => {
40
41
  }
41
42
  return starts;
42
43
  };
43
- // How many times a request is repeated after answers that belong to another request
44
- const MAX_FOREIGN_ANSWERS = 3;
44
+ // Attempts per request when the answer belongs to another request or, for a message known to
45
+ // exist, is empty
46
+ const MAX_FETCH_ATTEMPTS = 3;
45
47
  const requestedUid = (range, options) => options.uid && /^\d+$/.test(String(range)) ? Number(range) : undefined;
46
48
  const isForeignAnswer = (response, expected) => {
47
49
  if (expected.uid && response.uid && response.uid !== expected.uid) {
@@ -63,11 +65,19 @@ const isForeignAnswer = (response, expected) => {
63
65
  * within the answer to the next one. Taken at face value it would be the data of that next
64
66
  * request, and a download would end without an error but with misplaced bytes. An answer for
65
67
  * another UID, or with a partial section that starts at another offset than asked, is dropped
66
- * and the request repeated.
68
+ * and the request repeated. An empty answer is repeated too while `expected.retryEmpty()` says
69
+ * the message exists, as the data of a late answer arrives with the repeated request.
67
70
  */
68
71
  async function fetchExpected(client, range, query, options, expected) {
69
72
  for (let attempt = 1;; attempt++) {
70
73
  let response = await client.fetchOne(range, query, options);
74
+ if (response === false && expected.retryEmpty && expected.retryEmpty() && attempt < MAX_FETCH_ATTEMPTS) {
75
+ // The answer may come late instead (after the tagged OK, with the next answer), then
76
+ // it shows up in the answer to the repeated request. A message that is really gone
77
+ // answers empty every time, and the caller reports it.
78
+ client.log.warn({ msg: 'Server answered a request for an existing message with no data, asking again', attempt, cid: client.id });
79
+ continue;
80
+ }
71
81
  if (!response || !isForeignAnswer(response, expected)) {
72
82
  return response;
73
83
  }
@@ -78,11 +88,8 @@ async function fetchExpected(client, range, query, options, expected) {
78
88
  attempt,
79
89
  cid: client.id
80
90
  });
81
- if (attempt >= MAX_FOREIGN_ANSWERS) {
82
- let err = new Error('Server kept answering with data of another request');
83
- err.code = 'DownloadIncomplete';
84
- err.cid = client.id;
85
- throw err;
91
+ if (attempt >= MAX_FETCH_ATTEMPTS) {
92
+ throw (0, errors_js_1.createImapError)('Server kept answering with data of another request', 'DownloadIncomplete', { cid: client.id });
86
93
  }
87
94
  }
88
95
  }
@@ -108,7 +115,8 @@ async function refetchDroppedSections(client, response, range, options, sections
108
115
  let uid = response.uid;
109
116
  let retry = await fetchExpected(client, uid || range, { uid: true, bodyParts: sections }, uid ? { ...options, uid: true } : options, {
110
117
  uid,
111
- origins: partialStarts(sections)
118
+ origins: partialStarts(sections),
119
+ retryEmpty: () => true
112
120
  });
113
121
  if (!retry) {
114
122
  return;
@@ -154,7 +162,13 @@ async function downloadMessage(client, range, part, options) {
154
162
  // Special handling for part "1": in single-node emails (no childNodes),
155
163
  // the body is accessed via "TEXT" rather than "1", and headers via
156
164
  // "HEADER" instead of "1.MIME". Check bodyStructure to detect this.
157
- let response = await client.fetchOne(range, { uid: true, bodyStructure: true }, downloadOptions);
165
+ let expectedUid = requestedUid(range, downloadOptions);
166
+ let response = await fetchExpected(client, range, { uid: true, bodyStructure: true }, downloadOptions, {
167
+ uid: expectedUid,
168
+ origins: new Map(),
169
+ // a message addressed by UID is taken to exist, see getNextPart() below
170
+ retryEmpty: expectedUid ? () => true : undefined
171
+ });
158
172
  if (!response) {
159
173
  return {};
160
174
  }
@@ -170,6 +184,14 @@ async function downloadMessage(client, range, part, options) {
170
184
  part = 'TEXT';
171
185
  }
172
186
  }
187
+ // The decoder pipeline, built once the head chunk told what the part is (see below)
188
+ let stream;
189
+ let output;
190
+ let fetchAborted = false;
191
+ // A consumer that gave up: its 'close' may still be a tick away from setting fetchAborted,
192
+ // so the stream's own flag is checked as well
193
+ // `output` is unset until the head chunk is in, and the head chunk's retry asks already
194
+ let downloadAborted = () => fetchAborted || !!output?.destroyed;
173
195
  let getNextPart = async (query) => {
174
196
  query = query || {};
175
197
  let mimeKey;
@@ -203,12 +225,23 @@ async function downloadMessage(client, range, part, options) {
203
225
  };
204
226
  query.bodyParts.push(contentRequest);
205
227
  }
228
+ let expectedUid = uid || requestedUid(range, downloadOptions);
206
229
  let expected = {
207
- uid: uid || requestedUid(range, downloadOptions),
208
- origins: new Map([[part || '', processed]])
230
+ uid: expectedUid,
231
+ origins: new Map([[part || '', processed]]),
232
+ // Every chunk after the first is of a message that was there a moment ago, and a
233
+ // message the caller addresses by UID is taken to exist: an empty answer may be a
234
+ // late one (Apache James), a message that is really gone costs two more requests
235
+ retryEmpty: processed > 0 || expectedUid ? () => !downloadAborted() : undefined
209
236
  };
210
237
  let response = await fetchExpected(client, range, query, downloadOptions, expected);
211
238
  if (!response) {
239
+ // An empty answer also comes from a connection that closed while the consumer was
240
+ // paused between chunks (fetchOne() finds no mailbox then), and that is not a
241
+ // missing message: a caller that retries would skip it
242
+ if (!client.usable) {
243
+ throw client.createNoConnectionError(false, { rejectedFrom: 'download' });
244
+ }
212
245
  return { response: false, chunk: false };
213
246
  }
214
247
  if (!uid && response.uid) {
@@ -316,9 +349,6 @@ async function downloadMessage(client, range, part, options) {
316
349
  meta.filename = filename;
317
350
  }
318
351
  }
319
- let stream;
320
- let output;
321
- let fetchAborted = false;
322
352
  // Build a decoder pipeline that progressively transforms the raw FETCH data:
323
353
  // 1. Transfer-encoding decoder (base64 or quoted-printable -> binary)
324
354
  // 2. Format decoder (format=flowed -> plain text, if applicable)
@@ -348,13 +378,19 @@ async function downloadMessage(client, range, part, options) {
348
378
  // would still pull the entire part off the wire.
349
379
  let limiters = [];
350
380
  let isLimited = () => limiters.some(entry => entry.limited);
381
+ // Every stage after the head, so a download that ends early can release all of them
382
+ let stages = [];
351
383
  // Appending a stage means forwarding the current tail's errors to it before piping, so a
352
- // failure anywhere reaches the stream the caller is reading
384
+ // failure anywhere reaches the stream the caller is reading. The stage is destroyed with
385
+ // the error rather than only emitting it: pipe() does not end its destination on a source
386
+ // error, so a consumer that only listens for 'finish' or 'close' (a plain .pipe() into a
387
+ // file) would otherwise wait forever.
353
388
  let pipeStage = (stage) => {
354
389
  output.on('error', err => {
355
- stage.emit('error', err);
390
+ stage.destroy(err);
356
391
  });
357
392
  output = output.pipe(stage);
393
+ stages.push(stage);
358
394
  return stage;
359
395
  };
360
396
  let isTextNode = ['text/html', 'text/plain', 'text/x-amp-html'].includes(meta.contentType) || (part === '1' && !meta.contentType);
@@ -399,8 +435,8 @@ async function downloadMessage(client, range, part, options) {
399
435
  // Cleanup function
400
436
  const cleanup = () => {
401
437
  fetchAborted = true;
402
- if (stream && !stream.destroyed) {
403
- stream.destroy();
438
+ for (let entry of [stream, ...stages]) {
439
+ entry.destroy();
404
440
  }
405
441
  };
406
442
  // Listen for stream destruction
@@ -473,26 +509,18 @@ async function downloadMessage(client, range, part, options) {
473
509
  // Loud on purpose. Everything written downstream by this point holds
474
510
  // duplicated content, and a quiet stop is indistinguishable from a clean EOF,
475
511
  // so the consumer would store a corrupt body believing it intact.
476
- let err = new Error('Download exceeded the expected message size');
477
- err.code = 'DownloadOverflow';
478
- err.maxSize = maxTotalBytes;
479
- err.cid = client.id;
480
- throw err;
512
+ throw (0, errors_js_1.createImapError)('Download exceeded the expected message size', 'DownloadOverflow', { maxSize: maxTotalBytes, cid: client.id });
481
513
  }
482
514
  let { response, chunk } = await getNextPart();
483
- // A consumer that gave up while the chunk was in flight: its 'close' may still be a
484
- // tick away from setting fetchAborted, so the stream's own flag is checked as well
485
- if (fetchAborted || output.destroyed) {
515
+ // A consumer that gave up while the chunk was in flight
516
+ if (downloadAborted()) {
486
517
  break;
487
518
  }
488
519
  if (response === false) {
489
520
  // The message is gone mid-download (expunged by another client, or the
490
521
  // mailbox was closed). Ending the stream here would pass the truncated body
491
522
  // off as complete, so the consumer is told the same way as for an overflow.
492
- let err = new Error('Message disappeared before the download completed');
493
- err.code = 'DownloadIncomplete';
494
- err.cid = client.id;
495
- throw err;
523
+ throw (0, errors_js_1.createImapError)('Message disappeared before the download completed', 'DownloadIncomplete', { cid: client.id });
496
524
  }
497
525
  if (!chunk) {
498
526
  break;
@@ -522,7 +550,7 @@ async function downloadMessage(client, range, part, options) {
522
550
  fetchAllParts(head)
523
551
  .catch(err => {
524
552
  if (!fetchAborted && stream && !stream.destroyed) {
525
- stream.emit('error', err);
553
+ stream.destroy(err);
526
554
  /* c8 ignore start */ // the else logs when a fetch error arrives after the stream was already torn down (timing-dependent)
527
555
  }
528
556
  else {
@@ -547,7 +575,7 @@ async function downloadMessage(client, range, part, options) {
547
575
  // above rejects a promise nobody holds and takes the process down on
548
576
  // unhandledRejection. Reaching it always means an invariant broke - the head
549
577
  // stream kept pipeStage()'s error forwarder for the life of the download, so
550
- // emit('error') above has somewhere to go - which is why it logs at error even
578
+ // destroy(err) above has somewhere to go - which is why it logs at error even
551
579
  // for a routine-looking connection code.
552
580
  .catch(err => client.log.error({ msg: 'Failed to fail the download stream', err, cid: client.id }));
553
581
  };
@@ -586,9 +614,12 @@ async function downloadMessageParts(client, range, parts, options) {
586
614
  contentRequests.set(part, contentRequest);
587
615
  query.bodyParts.push(contentRequest);
588
616
  }
617
+ let expectedUid = requestedUid(range, downloadOptions);
589
618
  let response = await fetchExpected(client, range, query, downloadOptions, {
590
- uid: requestedUid(range, downloadOptions),
591
- origins: partialStarts(query.bodyParts)
619
+ uid: expectedUid,
620
+ origins: partialStarts(query.bodyParts),
621
+ // a message addressed by UID is taken to exist, as for download()
622
+ retryEmpty: expectedUid ? () => true : undefined
592
623
  });
593
624
  if (!response || !response.bodyParts) {
594
625
  return {};
@@ -29,6 +29,7 @@ export declare const ImapFlowErrorCode: {
29
29
  readonly MissingServerExtension: "MissingServerExtension";
30
30
  readonly ParserError: "ParserError";
31
31
  readonly ParserErrorExchange: "ParserErrorExchange";
32
+ readonly ParserErrorInternal: "ParserErrorInternal";
32
33
  readonly MAX_IMAP_NESTING_REACHED: "MAX_IMAP_NESTING_REACHED";
33
34
  readonly LineTooLarge: "LineTooLarge";
34
35
  readonly LiteralTooLarge: "LiteralTooLarge";
@@ -38,6 +39,7 @@ export declare const ImapFlowErrorCode: {
38
39
  readonly InvalidTextValue: "InvalidTextValue";
39
40
  readonly InvalidSequenceSet: "InvalidSequenceSet";
40
41
  readonly InvalidSearchQuery: "InvalidSearchQuery";
42
+ readonly InvalidMessageContent: "InvalidMessageContent";
41
43
  readonly DownloadOverflow: "DownloadOverflow";
42
44
  readonly DownloadIncomplete: "DownloadIncomplete";
43
45
  readonly ProxyError: "ProxyError";
@@ -48,6 +50,8 @@ export declare const ImapFlowErrorCode: {
48
50
  };
49
51
  /** One of the {@link ImapFlowErrorCode} values */
50
52
  export type ImapFlowErrorCode = (typeof ImapFlowErrorCode)[keyof typeof ImapFlowErrorCode];
53
+ /** A numbered parser error code, `ParserError1` and up */
54
+ export type ParserErrorCode = `ParserError${number}`;
51
55
  /**
52
56
  * An Error raised by ImapFlow, with the extra properties the library attaches to describe
53
57
  * the failure. Every property is optional: which ones are present depends on where the
@@ -132,3 +136,14 @@ export declare class AuthenticationFailure extends Error implements ImapFlowErro
132
136
  response?: string | undefined;
133
137
  oauthError?: any;
134
138
  }
139
+ /**
140
+ * Creates an {@link ImapFlowError} with a code and optional extra properties. The code is
141
+ * checked by the compiler against {@link ImapFlowErrorCode}, so a typo or an undeclared
142
+ * code fails the build instead of reaching consumers.
143
+ *
144
+ * @param message - The error message
145
+ * @param code - The error code
146
+ * @param props - Extra properties to set on the error
147
+ * @returns The error, ready to throw or reject with
148
+ */
149
+ export declare function createImapError(message: string, code: ImapFlowErrorCode | ParserErrorCode, props?: Omit<ImapFlowError, 'name' | 'message' | 'stack' | 'code'> | undefined): ImapFlowError;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AuthenticationFailure = exports.ImapFlowErrorCode = void 0;
4
+ exports.createImapError = createImapError;
4
5
  /**
5
6
  * The `code` values ImapFlow sets on the errors it raises, so they can be matched without
6
7
  * string literals: `if (err.code === ImapFlowErrorCode.NoConnection)`.
@@ -35,6 +36,8 @@ exports.ImapFlowErrorCode = {
35
36
  // response parsing and size limits
36
37
  ParserError: 'ParserError',
37
38
  ParserErrorExchange: 'ParserErrorExchange',
39
+ // an unexpected exception inside the parser, re-raised with a code; a parser bug
40
+ ParserErrorInternal: 'ParserErrorInternal',
38
41
  MAX_IMAP_NESTING_REACHED: 'MAX_IMAP_NESTING_REACHED',
39
42
  LineTooLarge: 'LineTooLarge',
40
43
  LiteralTooLarge: 'LiteralTooLarge',
@@ -45,6 +48,7 @@ exports.ImapFlowErrorCode = {
45
48
  InvalidTextValue: 'InvalidTextValue',
46
49
  InvalidSequenceSet: 'InvalidSequenceSet',
47
50
  InvalidSearchQuery: 'InvalidSearchQuery',
51
+ InvalidMessageContent: 'InvalidMessageContent',
48
52
  // download()
49
53
  DownloadOverflow: 'DownloadOverflow',
50
54
  DownloadIncomplete: 'DownloadIncomplete',
@@ -66,3 +70,21 @@ class AuthenticationFailure extends Error {
66
70
  }
67
71
  }
68
72
  exports.AuthenticationFailure = AuthenticationFailure;
73
+ /**
74
+ * Creates an {@link ImapFlowError} with a code and optional extra properties. The code is
75
+ * checked by the compiler against {@link ImapFlowErrorCode}, so a typo or an undeclared
76
+ * code fails the build instead of reaching consumers.
77
+ *
78
+ * @param message - The error message
79
+ * @param code - The error code
80
+ * @param props - Extra properties to set on the error
81
+ * @returns The error, ready to throw or reject with
82
+ */
83
+ function createImapError(message, code, props) {
84
+ const error = new Error(message);
85
+ error.code = code;
86
+ if (props) {
87
+ Object.assign(error, props);
88
+ }
89
+ return error;
90
+ }
@@ -12,13 +12,13 @@ import type { CompilerOptions, ImapCompileInput } from './types.js';
12
12
  * @param options.isLogging - If true, redacts sensitive values and truncates long strings/literals for logging purposes.
13
13
  * @param options.literalPlus - If true, uses the LITERAL+ extension (appends "+" to literal length markers).
14
14
  * @param options.literalMinus - If true, uses the LITERAL- extension for literals up to 4096 bytes.
15
- * @returns A promise that resolves to an array of Buffers (if asArray is true) or a single concatenated Buffer.
15
+ * @returns An array of Buffers (if asArray is true) or a single concatenated Buffer.
16
16
  */
17
17
  declare function compiler(response: ImapCompileInput, options: CompilerOptions & {
18
18
  asArray: true;
19
- }): Promise<Buffer[]>;
19
+ }): Buffer[];
20
20
  declare function compiler(response: ImapCompileInput, options?: (CompilerOptions & {
21
21
  asArray?: false | undefined;
22
- }) | undefined): Promise<Buffer>;
23
- declare function compiler(response: ImapCompileInput, options?: CompilerOptions | undefined): Promise<Buffer | Buffer[]>;
22
+ }) | undefined): Buffer;
23
+ declare function compiler(response: ImapCompileInput, options?: CompilerOptions | undefined): Buffer | Buffer[];
24
24
  export default compiler;
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  };
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  const imap_formal_syntax_js_1 = __importDefault(require("./imap-formal-syntax.js"));
8
+ const errors_js_1 = require("../errors.js");
8
9
  // A single element of a sequence-set as defined by the RFC 9051 grammar: a number
9
10
  // or a range, where "*" stands for the largest number in use. Digit strings are not
10
11
  // range-checked here (a server rejects "0" or an overlong number on its own); the
@@ -46,13 +47,11 @@ const CRLF = /[\r\n]/;
46
47
  */
47
48
  const quoteString = (value) => {
48
49
  if (NOT_QUOTABLE.test(value)) {
49
- let error = new Error('Unquotable character in IMAP string value');
50
- error.code = 'InvalidStringValue';
51
- throw error;
50
+ throw (0, errors_js_1.createImapError)('Unquotable character in IMAP string value', 'InvalidStringValue');
52
51
  }
53
52
  return '"' + value.replace(/["\\]/g, char => '\\' + char) + '"';
54
53
  };
55
- async function compiler(response, options) {
54
+ function compiler(response, options) {
56
55
  let { asArray, isLogging, literalPlus, literalMinus } = options || {};
57
56
  const respParts = [];
58
57
  // Formats an entry (string, number or Buffer) into the Buffer that is written to
@@ -67,9 +66,7 @@ async function compiler(response, options) {
67
66
  const emitEntry = (entry, opts) => {
68
67
  let { returnEmpty, raw } = opts || {};
69
68
  if (!raw && !isLogging && (typeof entry === 'string' || Buffer.isBuffer(entry)) && CRLF.test(entry.toString('latin1'))) {
70
- let error = new Error('Line terminator in IMAP token');
71
- error.code = 'InvalidTokenValue';
72
- throw error;
69
+ throw (0, errors_js_1.createImapError)('Line terminator in IMAP token', 'InvalidTokenValue');
73
70
  }
74
71
  if (typeof entry === 'string') {
75
72
  return Buffer.from(entry);
@@ -93,7 +90,7 @@ async function compiler(response, options) {
93
90
  // Set right after the compiler writes "(" or "[" itself, so the first element inside gets no
94
91
  // leading space
95
92
  let afterOpener = false;
96
- let walk = async (node, options) => {
93
+ let walk = (node, options) => {
97
94
  options = options || {};
98
95
  // Add a space separator when:
99
96
  // - The previous token was a LITERAL. Literal data ends exactly at its declared length, so
@@ -125,7 +122,7 @@ async function compiler(response, options) {
125
122
  if (subArray && !Array.isArray(child)) {
126
123
  subArray = false;
127
124
  }
128
- await walk(child, { subArray });
125
+ walk(child, { subArray });
129
126
  }
130
127
  resp.push(emitEntry(')'));
131
128
  afterOpener = false;
@@ -159,6 +156,11 @@ async function compiler(response, options) {
159
156
  resp.push(emitEntry(logPlaceholder(node.value.length, 'literal')));
160
157
  }
161
158
  else {
159
+ // The size marker must match the bytes emitEntry() writes, and it writes
160
+ // nothing for a value that is not a Buffer or a string
161
+ if (node.value && !Buffer.isBuffer(node.value) && typeof node.value !== 'string') {
162
+ throw (0, errors_js_1.createImapError)('Literal value must be a Buffer or a string', 'InvalidTokenValue');
163
+ }
162
164
  // The literal size marker counts octets - string values are written as
163
165
  // UTF-8, so their UTF-16 .length would undercount multi-byte characters
164
166
  let literalLength = !node.value ? 0 : Buffer.isBuffer(node.value) ? node.value.length : Buffer.byteLength(node.value.toString());
@@ -213,9 +215,7 @@ async function compiler(response, options) {
213
215
  if (!isLogging) {
214
216
  val = node.value === null || node.value === undefined ? '' : node.value.toString();
215
217
  if (!isValidSequenceSet(val)) {
216
- let error = new Error('Invalid sequence set value');
217
- error.code = 'InvalidSequenceSet';
218
- throw error;
218
+ throw (0, errors_js_1.createImapError)('Invalid sequence set value', 'InvalidSequenceSet');
219
219
  }
220
220
  resp.push(emitEntry(val, { raw: true }));
221
221
  }
@@ -230,9 +230,7 @@ async function compiler(response, options) {
230
230
  // this check runs first only to raise the more specific InvalidTextValue code.
231
231
  if (node.value) {
232
232
  if (!isLogging && CRLF.test(node.value.toString())) {
233
- let error = new Error('Line terminator in IMAP text value');
234
- error.code = 'InvalidTextValue';
235
- throw error;
233
+ throw (0, errors_js_1.createImapError)('Line terminator in IMAP text value', 'InvalidTextValue');
236
234
  }
237
235
  resp.push(emitEntry(node.value));
238
236
  }
@@ -267,7 +265,7 @@ async function compiler(response, options) {
267
265
  resp.push(emitEntry('['));
268
266
  afterOpener = true;
269
267
  for (let child of node.section) {
270
- await walk(child);
268
+ walk(child);
271
269
  }
272
270
  resp.push(emitEntry(']'));
273
271
  afterOpener = false;
@@ -286,13 +284,15 @@ async function compiler(response, options) {
286
284
  if (response.attributes) {
287
285
  let attributes = Array.isArray(response.attributes) ? response.attributes : [].concat(response.attributes);
288
286
  for (let child of attributes) {
289
- await walk(child);
287
+ walk(child);
290
288
  }
291
289
  }
292
290
  if (resp.length) {
293
291
  respParts.push(resp);
294
292
  }
295
- const compiled = respParts.map(part => Buffer.concat(part));
293
+ // A part with a single entry (the data of a synchronizing literal) is used as is: copying a
294
+ // large message only to send it doubles its memory
295
+ const compiled = respParts.map(part => (part.length === 1 ? part[0] : Buffer.concat(part)));
296
296
  // without asArray there is a single part, returned as is instead of copied
297
297
  return asArray ? compiled : compiled.length === 1 ? compiled[0] : Buffer.concat(compiled);
298
298
  }
@@ -6,6 +6,31 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.default = parser;
7
7
  const imap_formal_syntax_js_1 = __importDefault(require("./imap-formal-syntax.js"));
8
8
  const parser_instance_js_1 = require("./parser-instance.js");
9
+ const errors_js_1 = require("../errors.js");
10
+ const limits_js_1 = require("./limits.js");
11
+ // The codes the parser raises on purpose: the numbered ParserErrorN codes, ParserErrorExchange,
12
+ // the nesting limit and the inline literal size limit
13
+ const PARSER_ERROR_CODES = /^(?:ParserError\d+|ParserErrorExchange|MAX_IMAP_NESTING_REACHED|LiteralTooLarge)$/;
14
+ /**
15
+ * Anything the parser throws other than one of its own coded errors - a TypeError from a parser
16
+ * bug, a RangeError from runaway recursion or a bad Buffer offset (which carries a Node code), a
17
+ * thrown non-Error - is re-raised as a coded `ParserErrorInternal`, so callers that match on
18
+ * codes still handle it and settle the command the line belonged to. The fuzz suite treats this
19
+ * code as a failure, so the guard does not hide parser bugs from the tests.
20
+ *
21
+ * @param err - The thrown value
22
+ * @param input - The line that was being parsed
23
+ * @returns The error to rethrow
24
+ */
25
+ function asParserError(err, input) {
26
+ if (err instanceof Error && PARSER_ERROR_CODES.test(err.code || '')) {
27
+ return err;
28
+ }
29
+ return (0, errors_js_1.createImapError)(`Unexpected parser failure: ${err instanceof Error ? err.message : String(err)}`, 'ParserErrorInternal', {
30
+ parserContext: (0, limits_js_1.boundedInput)(input.toString()),
31
+ ...(err instanceof Error ? { _err: err } : {})
32
+ });
33
+ }
9
34
  /**
10
35
  * Parses a raw IMAP command or response buffer into a structured object.
11
36
  * Handles edge cases such as null-byte-padded responses from buggy servers and
@@ -26,7 +51,7 @@ async function parser(command, options) {
26
51
  // Workaround for buggy IMAP servers that pad responses with leading NUL (\x00) bytes.
27
52
  // Some servers (observed in the wild) prepend null bytes to their output, which would
28
53
  // cause parsing to fail. We strip them and note how many were removed for diagnostics.
29
- if (command[0] === 0) {
54
+ if (Buffer.isBuffer(command) && command[0] === 0) {
30
55
  // find the first non null byte and trim
31
56
  let firstNonNull = -1;
32
57
  for (let i = 0; i < command.length; i++) {
@@ -39,7 +64,7 @@ async function parser(command, options) {
39
64
  // All bytes are null, treat as a BAD response
40
65
  return { tag: '*', command: 'BAD', attributes: [] };
41
66
  }
42
- command = command.slice(firstNonNull);
67
+ command = command.subarray(firstNonNull);
43
68
  nullBytesRemoved = firstNonNull;
44
69
  }
45
70
  const parserInstance = new parser_instance_js_1.ParserInstance(command, options);
@@ -71,7 +96,7 @@ async function parser(command, options) {
71
96
  }
72
97
  }
73
98
  catch (err) {
74
- let error = err;
99
+ let error = asParserError(err, command);
75
100
  if (error.code === 'ParserErrorExchange' && error.parserContext && error.parserContext.value) {
76
101
  return error.parserContext.value;
77
102
  }
@@ -4,6 +4,7 @@ exports.ImapStream = void 0;
4
4
  const node_stream_1 = require("node:stream");
5
5
  const logger_js_1 = require("../logger.js");
6
6
  const limits_js_1 = require("./limits.js");
7
+ const errors_js_1 = require("../errors.js");
7
8
  const LINE = 0x01;
8
9
  const LITERAL = 0x02;
9
10
  const LF = 0x0a;
@@ -180,10 +181,10 @@ class ImapStream extends node_stream_1.Transform {
180
181
  if (lineLength <= this.maxLineLength) {
181
182
  return true;
182
183
  }
183
- const err = new Error(`Line length ${lineLength} exceeds maximum allowed size of ${this.maxLineLength} bytes`);
184
- err.code = 'LineTooLarge';
185
- err.lineLength = lineLength;
186
- err.maxSize = this.maxLineLength;
184
+ const err = (0, errors_js_1.createImapError)(`Line length ${lineLength} exceeds maximum allowed size of ${this.maxLineLength} bytes`, 'LineTooLarge', {
185
+ lineLength,
186
+ maxSize: this.maxLineLength
187
+ });
187
188
  return this.failStream(err);
188
189
  }
189
190
  /**
@@ -206,10 +207,10 @@ class ImapStream extends node_stream_1.Transform {
206
207
  }
207
208
  return true;
208
209
  }
209
- const err = new Error(`Response size ${total} exceeds maximum allowed size of ${this.maxResponseSize} bytes`);
210
- err.code = 'ResponseTooLarge';
211
- err.responseSize = total;
212
- err.maxSize = this.maxResponseSize;
210
+ const err = (0, errors_js_1.createImapError)(`Response size ${total} exceeds maximum allowed size of ${this.maxResponseSize} bytes`, 'ResponseTooLarge', {
211
+ responseSize: total,
212
+ maxSize: this.maxResponseSize
213
+ });
213
214
  return this.failStream(err);
214
215
  }
215
216
  /**
@@ -1,4 +1,4 @@
1
- import type { ImapFlowError } from '../errors.js';
1
+ import { type ImapFlowError } from '../errors.js';
2
2
  export declare const MAX_LITERAL_SIZE: number;
3
3
  export declare const MAX_LINE_SIZE: number;
4
4
  export declare const MAX_RESPONSE_SIZE: number;
@@ -4,6 +4,7 @@
4
4
  // defaults in the ImapFlowOptions type describe both paths.
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.createLiteralTooLargeError = exports.normalizeLimit = exports.boundedInput = exports.ERROR_CONTEXT_LENGTH = exports.MAX_RESPONSE_SIZE = exports.MAX_LINE_SIZE = exports.MAX_LITERAL_SIZE = void 0;
7
+ const errors_js_1 = require("../errors.js");
7
8
  // Maximum allowed literal size: 1GB (1073741824 bytes)
8
9
  exports.MAX_LITERAL_SIZE = 1024 * 1024 * 1024;
9
10
  // Default maximum length of a single line (a response without a literal). Matches the literal cap:
@@ -56,11 +57,8 @@ exports.normalizeLimit = normalizeLimit;
56
57
  * @param reason - What the bound was, when it is not the configured maximum.
57
58
  * @returns The error to emit or throw.
58
59
  */
59
- const createLiteralTooLargeError = (literalSize, maxSize, reason) => {
60
- const err = new Error(`Literal size ${literalSize} exceeds ${reason || `maximum allowed size of ${maxSize} bytes`}`);
61
- err.code = 'LiteralTooLarge';
62
- err.literalSize = literalSize;
63
- err.maxSize = maxSize;
64
- return err;
65
- };
60
+ const createLiteralTooLargeError = (literalSize, maxSize, reason) => (0, errors_js_1.createImapError)(`Literal size ${literalSize} exceeds ${reason || `maximum allowed size of ${maxSize} bytes`}`, 'LiteralTooLarge', {
61
+ literalSize,
62
+ maxSize
63
+ });
66
64
  exports.createLiteralTooLargeError = createLiteralTooLargeError;