@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.
- package/extension/background.js +1604 -847
- package/extension/manifest.json +3 -3
- package/extension/popup.css +91 -3
- package/extension/popup.html +49 -32
- package/extension/popup.js +215 -123
- package/node_modules/@buddi/cli/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/core/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/core/dist/plugin/index.d.ts +1 -1
- package/node_modules/@buddi/core/dist/plugin/index.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/plugin/index.js.map +1 -1
- package/node_modules/@buddi/core/dist/questions/store.d.ts +3 -1
- package/node_modules/@buddi/core/dist/questions/store.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/questions/store.js +3 -3
- package/node_modules/@buddi/core/dist/questions/store.js.map +1 -1
- package/node_modules/@buddi/core/dist/questions/types.d.ts +46 -1
- package/node_modules/@buddi/core/dist/questions/types.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/questions/types.js +2 -1
- package/node_modules/@buddi/core/dist/questions/types.js.map +1 -1
- package/node_modules/@buddi/core/dist/secrets/approval.d.ts +54 -0
- package/node_modules/@buddi/core/dist/secrets/approval.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/secrets/approval.js +58 -1
- package/node_modules/@buddi/core/dist/secrets/approval.js.map +1 -1
- package/node_modules/@buddi/core/dist/secrets/settings.d.ts +178 -0
- package/node_modules/@buddi/core/dist/secrets/settings.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/secrets/settings.js +63 -6
- package/node_modules/@buddi/core/dist/secrets/settings.js.map +1 -1
- package/node_modules/@buddi/core/dist/secrets/store.d.ts +31 -0
- package/node_modules/@buddi/core/dist/secrets/store.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/secrets/store.js +75 -0
- package/node_modules/@buddi/core/dist/secrets/store.js.map +1 -1
- package/node_modules/@buddi/core/dist/secrets/use.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/secrets/use.js +68 -3
- package/node_modules/@buddi/core/dist/secrets/use.js.map +1 -1
- package/node_modules/@buddi/core/dist/tools.d.ts +22 -0
- package/node_modules/@buddi/core/dist/tools.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/tools.js.map +1 -1
- package/node_modules/@buddi/core/migrations/080_secret_requests.sql +14 -0
- package/node_modules/@buddi/gateway/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/gateway/dist/chat/session.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/chat/session.js +2 -1
- package/node_modules/@buddi/gateway/dist/chat/session.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/missions/execute.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/missions/execute.js +3 -1
- package/node_modules/@buddi/gateway/dist/missions/execute.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/surfaces/browser-cards.d.ts +15 -3
- package/node_modules/@buddi/gateway/dist/surfaces/browser-cards.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/surfaces/browser-cards.js +34 -7
- package/node_modules/@buddi/gateway/dist/surfaces/browser-cards.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/surfaces/offered-actions.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/surfaces/offered-actions.js +8 -2
- package/node_modules/@buddi/gateway/dist/surfaces/offered-actions.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/surfaces/pending-question.d.ts +3 -1
- package/node_modules/@buddi/gateway/dist/surfaces/pending-question.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/surfaces/pending-question.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/surfaces/secret-request.d.ts +173 -0
- package/node_modules/@buddi/gateway/dist/surfaces/secret-request.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/surfaces/secret-request.js +332 -0
- package/node_modules/@buddi/gateway/dist/surfaces/secret-request.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/system-context.js +1 -1
- package/node_modules/@buddi/gateway/dist/system-context.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/main.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/main.js +14 -3
- package/node_modules/@buddi/gateway/dist/telegram/main.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/surface.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/surface.js +4 -1
- package/node_modules/@buddi/gateway/dist/telegram/surface.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/api-routes.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/api-routes.js +9 -1
- package/node_modules/@buddi/gateway/dist/web/api-routes.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/approval-ask.js +2 -2
- package/node_modules/@buddi/gateway/dist/web/approval-ask.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/browser-capture.d.ts +13 -0
- package/node_modules/@buddi/gateway/dist/web/browser-capture.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/browser-capture.js +24 -0
- package/node_modules/@buddi/gateway/dist/web/browser-capture.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/chat.d.ts +26 -0
- package/node_modules/@buddi/gateway/dist/web/chat.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/chat.js +87 -2
- package/node_modules/@buddi/gateway/dist/web/chat.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/extension.d.ts +30 -0
- package/node_modules/@buddi/gateway/dist/web/extension.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/extension.js +86 -6
- package/node_modules/@buddi/gateway/dist/web/extension.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/onboarding.js +1 -1
- package/node_modules/@buddi/gateway/dist/web/onboarding.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/remote-hand.d.ts +26 -2
- package/node_modules/@buddi/gateway/dist/web/remote-hand.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/remote-hand.js +89 -28
- package/node_modules/@buddi/gateway/dist/web/remote-hand.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/secret-request.d.ts +54 -0
- package/node_modules/@buddi/gateway/dist/web/secret-request.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/secret-request.js +264 -0
- package/node_modules/@buddi/gateway/dist/web/secret-request.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/secrets.d.ts +1 -0
- package/node_modules/@buddi/gateway/dist/web/secrets.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/secrets.js +1 -1
- package/node_modules/@buddi/gateway/dist/web/secrets.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/server.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/server.js +72 -3
- package/node_modules/@buddi/gateway/dist/web/server.js.map +1 -1
- package/node_modules/@buddi/install/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/install/dist/app-layout.d.ts +24 -0
- package/node_modules/@buddi/install/dist/app-layout.d.ts.map +1 -1
- package/node_modules/@buddi/install/dist/app-layout.js +64 -2
- package/node_modules/@buddi/install/dist/app-layout.js.map +1 -1
- package/node_modules/@buddi/install/dist/launcher.d.ts.map +1 -1
- package/node_modules/@buddi/install/dist/launcher.js +89 -10
- package/node_modules/@buddi/install/dist/launcher.js.map +1 -1
- package/node_modules/@buddi/install/dist/linux-install.d.ts +41 -0
- package/node_modules/@buddi/install/dist/linux-install.d.ts.map +1 -0
- package/node_modules/@buddi/install/dist/linux-install.js +86 -0
- package/node_modules/@buddi/install/dist/linux-install.js.map +1 -0
- package/node_modules/@buddi/install/dist/runtime-info.d.ts +23 -0
- package/node_modules/@buddi/install/dist/runtime-info.d.ts.map +1 -0
- package/node_modules/@buddi/install/dist/runtime-info.js +69 -0
- package/node_modules/@buddi/install/dist/runtime-info.js.map +1 -0
- package/node_modules/@buddi/install/dist/supervisor.d.ts.map +1 -1
- package/node_modules/@buddi/install/dist/supervisor.js +8 -6
- package/node_modules/@buddi/install/dist/supervisor.js.map +1 -1
- package/node_modules/@buddi/install/dist/uninstall.d.ts +20 -0
- package/node_modules/@buddi/install/dist/uninstall.d.ts.map +1 -1
- package/node_modules/@buddi/install/dist/uninstall.js +50 -1
- package/node_modules/@buddi/install/dist/uninstall.js.map +1 -1
- package/node_modules/@buddi/install/dist/upgrade.d.ts +4 -1
- package/node_modules/@buddi/install/dist/upgrade.d.ts.map +1 -1
- package/node_modules/@buddi/install/dist/upgrade.js +77 -51
- package/node_modules/@buddi/install/dist/upgrade.js.map +1 -1
- package/node_modules/@buddi/runtime/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/runtime/dist/anthropic.d.ts +7 -0
- package/node_modules/@buddi/runtime/dist/anthropic.d.ts.map +1 -1
- package/node_modules/@buddi/runtime/dist/anthropic.js +19 -1
- package/node_modules/@buddi/runtime/dist/anthropic.js.map +1 -1
- package/node_modules/@buddi/tool-artifacts/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-browser/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-browser/dist/controller.d.ts +16 -1
- package/node_modules/@buddi/tool-browser/dist/controller.d.ts.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/controller.js +59 -5
- package/node_modules/@buddi/tool-browser/dist/controller.js.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/driver.d.ts +12 -0
- package/node_modules/@buddi/tool-browser/dist/driver.d.ts.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/driver.js +41 -2
- package/node_modules/@buddi/tool-browser/dist/driver.js.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/extension.d.ts +49 -9
- package/node_modules/@buddi/tool-browser/dist/extension.d.ts.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/extension.js +145 -21
- package/node_modules/@buddi/tool-browser/dist/extension.js.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/index.d.ts +10 -6
- package/node_modules/@buddi/tool-browser/dist/index.d.ts.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/index.js +22 -8
- package/node_modules/@buddi/tool-browser/dist/index.js.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/routes.d.ts +10 -1
- package/node_modules/@buddi/tool-browser/dist/routes.d.ts.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/routes.js +24 -0
- package/node_modules/@buddi/tool-browser/dist/routes.js.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/service.d.ts +48 -1
- package/node_modules/@buddi/tool-browser/dist/service.d.ts.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/service.js +114 -11
- package/node_modules/@buddi/tool-browser/dist/service.js.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/types.d.ts +54 -3
- package/node_modules/@buddi/tool-browser/dist/types.d.ts.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/types.js +17 -1
- package/node_modules/@buddi/tool-browser/dist/types.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-host/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-mcp/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-memory/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-web/dist/.tsbuildinfo +1 -1
- package/node_modules/@hono/node-server/package.json +2 -2
- package/node_modules/@types/node/README.md +1 -1
- package/node_modules/@types/node/package.json +2 -2
- package/node_modules/@types/node/util.d.ts +6 -3
- package/node_modules/content-disposition/README.md +105 -35
- package/node_modules/content-disposition/dist/index.d.ts +72 -0
- package/node_modules/content-disposition/dist/index.js +388 -0
- package/node_modules/content-disposition/dist/index.js.map +1 -0
- package/node_modules/content-disposition/package.json +31 -19
- package/node_modules/docx/dist/index.cjs +182 -80
- package/node_modules/docx/dist/index.d.cts +63 -6
- package/node_modules/docx/dist/index.d.ts +63 -6
- package/node_modules/docx/dist/index.iife.js +182 -80
- package/node_modules/docx/dist/index.mjs +182 -80
- package/node_modules/docx/dist/index.umd.cjs +182 -80
- package/node_modules/docx/dist/layout.cjs +1 -6
- package/node_modules/docx/dist/layout.iife.js +1 -6
- package/node_modules/docx/dist/layout.mjs +1 -6
- package/node_modules/docx/dist/layout.umd.cjs +1 -6
- package/node_modules/docx/package.json +4 -3
- package/node_modules/express/Readme.md +15 -9
- package/node_modules/express/lib/application.js +2 -2
- package/node_modules/express/lib/request.js +32 -19
- package/node_modules/express/lib/response.js +27 -30
- package/node_modules/express/node_modules/content-type/LICENSE +22 -0
- package/node_modules/express/node_modules/content-type/README.md +71 -0
- package/node_modules/express/node_modules/content-type/dist/index.d.ts +46 -0
- package/node_modules/express/node_modules/content-type/dist/index.js +176 -0
- package/node_modules/express/node_modules/content-type/dist/index.js.map +1 -0
- package/node_modules/express/node_modules/content-type/package.json +52 -0
- package/node_modules/express/package.json +10 -10
- package/node_modules/imapflow/CHANGELOG.md +48 -0
- package/node_modules/imapflow/dist/cjs/commands/append.d.ts +1 -1
- package/node_modules/imapflow/dist/cjs/commands/append.js +15 -4
- package/node_modules/imapflow/dist/cjs/commands/compress.js +2 -2
- package/node_modules/imapflow/dist/cjs/commands/id.js +5 -3
- package/node_modules/imapflow/dist/cjs/commands/idle.js +9 -9
- package/node_modules/imapflow/dist/cjs/commands/list.js +2 -2
- package/node_modules/imapflow/dist/cjs/commands/namespace.js +18 -14
- package/node_modules/imapflow/dist/cjs/commands/quota.js +2 -3
- package/node_modules/imapflow/dist/cjs/commands/select.d.ts +3 -14
- package/node_modules/imapflow/dist/cjs/commands/select.js +1 -4
- package/node_modules/imapflow/dist/cjs/commands/status.js +2 -4
- package/node_modules/imapflow/dist/cjs/connection-deadline.d.ts +1 -1
- package/node_modules/imapflow/dist/cjs/connection-deadline.js +2 -4
- package/node_modules/imapflow/dist/cjs/download.js +66 -35
- package/node_modules/imapflow/dist/cjs/errors.d.ts +15 -0
- package/node_modules/imapflow/dist/cjs/errors.js +22 -0
- package/node_modules/imapflow/dist/cjs/handler/imap-compiler.d.ts +4 -4
- package/node_modules/imapflow/dist/cjs/handler/imap-compiler.js +18 -18
- package/node_modules/imapflow/dist/cjs/handler/imap-parser.js +28 -3
- package/node_modules/imapflow/dist/cjs/handler/imap-stream.js +9 -8
- package/node_modules/imapflow/dist/cjs/handler/limits.d.ts +1 -1
- package/node_modules/imapflow/dist/cjs/handler/limits.js +5 -7
- package/node_modules/imapflow/dist/cjs/handler/parser-instance.js +23 -38
- package/node_modules/imapflow/dist/cjs/handler/token-parser.d.ts +12 -0
- package/node_modules/imapflow/dist/cjs/handler/token-parser.js +44 -104
- package/node_modules/imapflow/dist/cjs/imap-flow.d.ts +4 -3
- package/node_modules/imapflow/dist/cjs/imap-flow.js +128 -78
- package/node_modules/imapflow/dist/cjs/package-info.d.ts +1 -1
- package/node_modules/imapflow/dist/cjs/package-info.js +1 -1
- package/node_modules/imapflow/dist/cjs/proxy-connection.js +2 -5
- package/node_modules/imapflow/dist/cjs/search-compiler.js +2 -3
- package/node_modules/imapflow/dist/cjs/tools.d.ts +24 -3
- package/node_modules/imapflow/dist/cjs/tools.js +59 -18
- package/node_modules/imapflow/dist/cjs/types.d.ts +20 -1
- package/node_modules/imapflow/dist/esm/commands/append.d.ts +1 -1
- package/node_modules/imapflow/dist/esm/commands/append.js +15 -4
- package/node_modules/imapflow/dist/esm/commands/compress.js +2 -2
- package/node_modules/imapflow/dist/esm/commands/id.js +6 -4
- package/node_modules/imapflow/dist/esm/commands/idle.js +9 -9
- package/node_modules/imapflow/dist/esm/commands/list.js +3 -3
- package/node_modules/imapflow/dist/esm/commands/namespace.js +19 -15
- package/node_modules/imapflow/dist/esm/commands/quota.js +3 -4
- package/node_modules/imapflow/dist/esm/commands/select.d.ts +3 -14
- package/node_modules/imapflow/dist/esm/commands/select.js +1 -4
- package/node_modules/imapflow/dist/esm/commands/status.js +2 -4
- package/node_modules/imapflow/dist/esm/connection-deadline.d.ts +1 -1
- package/node_modules/imapflow/dist/esm/connection-deadline.js +2 -4
- package/node_modules/imapflow/dist/esm/download.js +66 -35
- package/node_modules/imapflow/dist/esm/errors.d.ts +15 -0
- package/node_modules/imapflow/dist/esm/errors.js +21 -0
- package/node_modules/imapflow/dist/esm/handler/imap-compiler.d.ts +4 -4
- package/node_modules/imapflow/dist/esm/handler/imap-compiler.js +18 -18
- package/node_modules/imapflow/dist/esm/handler/imap-parser.js +28 -3
- package/node_modules/imapflow/dist/esm/handler/imap-stream.js +9 -8
- package/node_modules/imapflow/dist/esm/handler/limits.d.ts +1 -1
- package/node_modules/imapflow/dist/esm/handler/limits.js +5 -7
- package/node_modules/imapflow/dist/esm/handler/parser-instance.js +23 -38
- package/node_modules/imapflow/dist/esm/handler/token-parser.d.ts +12 -0
- package/node_modules/imapflow/dist/esm/handler/token-parser.js +44 -104
- package/node_modules/imapflow/dist/esm/imap-flow.d.ts +4 -3
- package/node_modules/imapflow/dist/esm/imap-flow.js +130 -80
- package/node_modules/imapflow/dist/esm/package-info.d.ts +1 -1
- package/node_modules/imapflow/dist/esm/package-info.js +1 -1
- package/node_modules/imapflow/dist/esm/proxy-connection.js +2 -5
- package/node_modules/imapflow/dist/esm/search-compiler.js +2 -3
- package/node_modules/imapflow/dist/esm/tools.d.ts +24 -3
- package/node_modules/imapflow/dist/esm/tools.js +58 -19
- package/node_modules/imapflow/dist/esm/types.d.ts +20 -1
- package/node_modules/imapflow/package.json +6 -3
- package/node_modules/playwright/README.md +4 -4
- package/node_modules/playwright/lib/agents/playwright-test-generator.agent.md +1 -1
- package/node_modules/playwright/lib/cli/testActions.js +8 -5
- package/node_modules/playwright/lib/common/index.js +37 -23
- package/node_modules/playwright/lib/common/index.js.txt +8 -9
- package/node_modules/playwright/lib/index.js +16 -4
- package/node_modules/playwright/lib/matchers/expect.js +13 -7
- package/node_modules/playwright/lib/matchers/expect.js.txt +4 -4
- package/node_modules/playwright/lib/program.js +2 -1
- package/node_modules/playwright/lib/runner/index.js +438 -244
- package/node_modules/playwright/lib/runner/index.js.txt +12 -11
- package/node_modules/playwright/lib/transform/babelBundle.js +2612 -2396
- package/node_modules/playwright/lib/transform/babelBundle.js.LICENSE +15 -15
- package/node_modules/playwright/lib/transform/babelBundle.js.txt +14 -11
- package/node_modules/playwright/lib/transform/esmLoader.js +17 -5
- package/node_modules/playwright/lib/transform/esmLoader.js.txt +3 -3
- package/node_modules/playwright/lib/worker/workerProcessEntry.js +17 -18
- package/node_modules/playwright/package.json +2 -7
- package/node_modules/playwright/types/test.d.ts +156 -39
- package/node_modules/playwright-core/browsers.json +9 -9
- package/node_modules/playwright-core/cli.js +1 -0
- package/node_modules/playwright-core/lib/bootstrap.js +61 -0
- package/node_modules/playwright-core/lib/coreBundle.js +6393 -4170
- package/node_modules/playwright-core/lib/server/electron/loader.js +4 -0
- package/node_modules/playwright-core/lib/tools/cli-client/cli.js +2 -1
- package/node_modules/playwright-core/lib/tools/cli-client/help.json +99 -12
- package/node_modules/playwright-core/lib/tools/cli-client/output.js +17 -16
- package/node_modules/playwright-core/lib/tools/cli-client/program.js +8 -4
- package/node_modules/playwright-core/lib/tools/cli-client/session.js +2 -0
- package/node_modules/playwright-core/lib/tools/skills/playwright-cli/SKILL.md +71 -3
- package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/pr-attachments.md +60 -0
- package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/running-code.md +4 -0
- package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/session-management.md +2 -0
- package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/test-generation.md +1 -1
- package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/video-recording.md +76 -3
- package/node_modules/playwright-core/lib/tools/skills/playwright-trace/SKILL.md +1 -1
- package/node_modules/playwright-core/lib/utilsBundle.js +948 -227
- package/node_modules/playwright-core/lib/utilsBundle.js.LICENSE +6 -6
- package/node_modules/playwright-core/lib/vite/htmlReport/report.js +1 -1
- package/node_modules/playwright-core/lib/vite/recorder/assets/{codeMirrorModule-CVQWJZAA.js → codeMirrorModule-DK72OMRi.js} +1 -1
- package/node_modules/playwright-core/lib/vite/recorder/assets/index-Cn0mmDuv.js +129 -0
- package/node_modules/playwright-core/lib/vite/recorder/index.html +1 -1
- package/node_modules/playwright-core/lib/vite/traceViewer/assets/{codeMirrorModule-BbkfBe3n.js → codeMirrorModule-BEB2e8M3.js} +1 -1
- package/node_modules/playwright-core/lib/vite/traceViewer/assets/defaultSettingsView-D-g2vrvf.js +184 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/assets/{xtermModule-DywYcAf8.js → xtermModule-B794rD2Z.js} +1 -1
- package/node_modules/playwright-core/lib/vite/traceViewer/{defaultSettingsView.Bqk9acqE.css → defaultSettingsView.C8BeHuxd.css} +1 -1
- package/node_modules/playwright-core/lib/vite/traceViewer/{index.B4cLoZK3.js → index.7-c5LSTW.js} +1 -1
- package/node_modules/playwright-core/lib/vite/traceViewer/index.html +3 -3
- package/node_modules/playwright-core/lib/vite/traceViewer/sw.bundle.js +3 -3
- package/node_modules/playwright-core/lib/vite/traceViewer/{uiMode.CU5KtEkS.js → uiMode.CYwC_gH1.js} +4 -4
- package/node_modules/playwright-core/lib/vite/traceViewer/uiMode.html +3 -3
- package/node_modules/playwright-core/package.json +1 -1
- package/node_modules/playwright-core/types/protocol.d.ts +468 -337
- package/node_modules/playwright-core/types/types.d.ts +572 -37
- package/node_modules/process-warning/.github/workflows/ci.yml +1 -1
- package/node_modules/process-warning/.github/workflows/lock-threads.yml +1 -1
- package/node_modules/process-warning/.github/workflows/release.yml +24 -0
- package/node_modules/process-warning/README.md +46 -46
- package/node_modules/process-warning/package.json +1 -1
- package/package.json +2 -2
- package/packages/cli/dist/.tsbuildinfo +1 -1
- package/packages/core/dist/.tsbuildinfo +1 -1
- package/packages/core/dist/plugin/index.d.ts +1 -1
- package/packages/core/dist/plugin/index.d.ts.map +1 -1
- package/packages/core/dist/plugin/index.js.map +1 -1
- package/packages/core/dist/questions/store.d.ts +3 -1
- package/packages/core/dist/questions/store.d.ts.map +1 -1
- package/packages/core/dist/questions/store.js +3 -3
- package/packages/core/dist/questions/store.js.map +1 -1
- package/packages/core/dist/questions/types.d.ts +46 -1
- package/packages/core/dist/questions/types.d.ts.map +1 -1
- package/packages/core/dist/questions/types.js +2 -1
- package/packages/core/dist/questions/types.js.map +1 -1
- package/packages/core/dist/secrets/approval.d.ts +54 -0
- package/packages/core/dist/secrets/approval.d.ts.map +1 -1
- package/packages/core/dist/secrets/approval.js +58 -1
- package/packages/core/dist/secrets/approval.js.map +1 -1
- package/packages/core/dist/secrets/settings.d.ts +178 -0
- package/packages/core/dist/secrets/settings.d.ts.map +1 -1
- package/packages/core/dist/secrets/settings.js +63 -6
- package/packages/core/dist/secrets/settings.js.map +1 -1
- package/packages/core/dist/secrets/store.d.ts +31 -0
- package/packages/core/dist/secrets/store.d.ts.map +1 -1
- package/packages/core/dist/secrets/store.js +75 -0
- package/packages/core/dist/secrets/store.js.map +1 -1
- package/packages/core/dist/secrets/use.d.ts.map +1 -1
- package/packages/core/dist/secrets/use.js +68 -3
- package/packages/core/dist/secrets/use.js.map +1 -1
- package/packages/core/dist/tools.d.ts +22 -0
- package/packages/core/dist/tools.d.ts.map +1 -1
- package/packages/core/dist/tools.js.map +1 -1
- package/packages/core/migrations/080_secret_requests.sql +14 -0
- package/packages/gateway/dist/.tsbuildinfo +1 -1
- package/packages/gateway/dist/chat/session.d.ts.map +1 -1
- package/packages/gateway/dist/chat/session.js +2 -1
- package/packages/gateway/dist/chat/session.js.map +1 -1
- package/packages/gateway/dist/missions/execute.d.ts.map +1 -1
- package/packages/gateway/dist/missions/execute.js +3 -1
- package/packages/gateway/dist/missions/execute.js.map +1 -1
- package/packages/gateway/dist/surfaces/browser-cards.d.ts +15 -3
- package/packages/gateway/dist/surfaces/browser-cards.d.ts.map +1 -1
- package/packages/gateway/dist/surfaces/browser-cards.js +34 -7
- package/packages/gateway/dist/surfaces/browser-cards.js.map +1 -1
- package/packages/gateway/dist/surfaces/offered-actions.d.ts.map +1 -1
- package/packages/gateway/dist/surfaces/offered-actions.js +8 -2
- package/packages/gateway/dist/surfaces/offered-actions.js.map +1 -1
- package/packages/gateway/dist/surfaces/pending-question.d.ts +3 -1
- package/packages/gateway/dist/surfaces/pending-question.d.ts.map +1 -1
- package/packages/gateway/dist/surfaces/pending-question.js.map +1 -1
- package/packages/gateway/dist/surfaces/secret-request.d.ts +173 -0
- package/packages/gateway/dist/surfaces/secret-request.d.ts.map +1 -0
- package/packages/gateway/dist/surfaces/secret-request.js +332 -0
- package/packages/gateway/dist/surfaces/secret-request.js.map +1 -0
- package/packages/gateway/dist/system-context.js +1 -1
- package/packages/gateway/dist/system-context.js.map +1 -1
- package/packages/gateway/dist/telegram/main.d.ts.map +1 -1
- package/packages/gateway/dist/telegram/main.js +14 -3
- package/packages/gateway/dist/telegram/main.js.map +1 -1
- package/packages/gateway/dist/telegram/surface.d.ts.map +1 -1
- package/packages/gateway/dist/telegram/surface.js +4 -1
- package/packages/gateway/dist/telegram/surface.js.map +1 -1
- package/packages/gateway/dist/web/api-routes.d.ts.map +1 -1
- package/packages/gateway/dist/web/api-routes.js +9 -1
- package/packages/gateway/dist/web/api-routes.js.map +1 -1
- package/packages/gateway/dist/web/approval-ask.js +2 -2
- package/packages/gateway/dist/web/approval-ask.js.map +1 -1
- package/packages/gateway/dist/web/browser-capture.d.ts +13 -0
- package/packages/gateway/dist/web/browser-capture.d.ts.map +1 -0
- package/packages/gateway/dist/web/browser-capture.js +24 -0
- package/packages/gateway/dist/web/browser-capture.js.map +1 -0
- package/packages/gateway/dist/web/chat.d.ts +26 -0
- package/packages/gateway/dist/web/chat.d.ts.map +1 -1
- package/packages/gateway/dist/web/chat.js +87 -2
- package/packages/gateway/dist/web/chat.js.map +1 -1
- package/packages/gateway/dist/web/extension.d.ts +30 -0
- package/packages/gateway/dist/web/extension.d.ts.map +1 -1
- package/packages/gateway/dist/web/extension.js +86 -6
- package/packages/gateway/dist/web/extension.js.map +1 -1
- package/packages/gateway/dist/web/onboarding.js +1 -1
- package/packages/gateway/dist/web/onboarding.js.map +1 -1
- package/packages/gateway/dist/web/remote-hand.d.ts +26 -2
- package/packages/gateway/dist/web/remote-hand.d.ts.map +1 -1
- package/packages/gateway/dist/web/remote-hand.js +89 -28
- package/packages/gateway/dist/web/remote-hand.js.map +1 -1
- package/packages/gateway/dist/web/secret-request.d.ts +54 -0
- package/packages/gateway/dist/web/secret-request.d.ts.map +1 -0
- package/packages/gateway/dist/web/secret-request.js +264 -0
- package/packages/gateway/dist/web/secret-request.js.map +1 -0
- package/packages/gateway/dist/web/secrets.d.ts +1 -0
- package/packages/gateway/dist/web/secrets.d.ts.map +1 -1
- package/packages/gateway/dist/web/secrets.js +1 -1
- package/packages/gateway/dist/web/secrets.js.map +1 -1
- package/packages/gateway/dist/web/server.d.ts.map +1 -1
- package/packages/gateway/dist/web/server.js +72 -3
- package/packages/gateway/dist/web/server.js.map +1 -1
- package/packages/install/dist/.tsbuildinfo +1 -1
- package/packages/install/dist/app-layout.d.ts +24 -0
- package/packages/install/dist/app-layout.d.ts.map +1 -1
- package/packages/install/dist/app-layout.js +64 -2
- package/packages/install/dist/app-layout.js.map +1 -1
- package/packages/install/dist/launcher.d.ts.map +1 -1
- package/packages/install/dist/launcher.js +89 -10
- package/packages/install/dist/launcher.js.map +1 -1
- package/packages/install/dist/linux-install.d.ts +41 -0
- package/packages/install/dist/linux-install.d.ts.map +1 -0
- package/packages/install/dist/linux-install.js +86 -0
- package/packages/install/dist/linux-install.js.map +1 -0
- package/packages/install/dist/runtime-info.d.ts +23 -0
- package/packages/install/dist/runtime-info.d.ts.map +1 -0
- package/packages/install/dist/runtime-info.js +69 -0
- package/packages/install/dist/runtime-info.js.map +1 -0
- package/packages/install/dist/supervisor.d.ts.map +1 -1
- package/packages/install/dist/supervisor.js +8 -6
- package/packages/install/dist/supervisor.js.map +1 -1
- package/packages/install/dist/uninstall.d.ts +20 -0
- package/packages/install/dist/uninstall.d.ts.map +1 -1
- package/packages/install/dist/uninstall.js +50 -1
- package/packages/install/dist/uninstall.js.map +1 -1
- package/packages/install/dist/upgrade.d.ts +4 -1
- package/packages/install/dist/upgrade.d.ts.map +1 -1
- package/packages/install/dist/upgrade.js +77 -51
- package/packages/install/dist/upgrade.js.map +1 -1
- package/packages/runtime/dist/.tsbuildinfo +1 -1
- package/packages/runtime/dist/anthropic.d.ts +7 -0
- package/packages/runtime/dist/anthropic.d.ts.map +1 -1
- package/packages/runtime/dist/anthropic.js +19 -1
- package/packages/runtime/dist/anthropic.js.map +1 -1
- package/packages/tools/artifacts/dist/.tsbuildinfo +1 -1
- package/packages/tools/browser/dist/.tsbuildinfo +1 -1
- package/packages/tools/browser/dist/controller.d.ts +16 -1
- package/packages/tools/browser/dist/controller.d.ts.map +1 -1
- package/packages/tools/browser/dist/controller.js +59 -5
- package/packages/tools/browser/dist/controller.js.map +1 -1
- package/packages/tools/browser/dist/driver.d.ts +12 -0
- package/packages/tools/browser/dist/driver.d.ts.map +1 -1
- package/packages/tools/browser/dist/driver.js +41 -2
- package/packages/tools/browser/dist/driver.js.map +1 -1
- package/packages/tools/browser/dist/extension.d.ts +49 -9
- package/packages/tools/browser/dist/extension.d.ts.map +1 -1
- package/packages/tools/browser/dist/extension.js +145 -21
- package/packages/tools/browser/dist/extension.js.map +1 -1
- package/packages/tools/browser/dist/index.d.ts +10 -6
- package/packages/tools/browser/dist/index.d.ts.map +1 -1
- package/packages/tools/browser/dist/index.js +22 -8
- package/packages/tools/browser/dist/index.js.map +1 -1
- package/packages/tools/browser/dist/routes.d.ts +10 -1
- package/packages/tools/browser/dist/routes.d.ts.map +1 -1
- package/packages/tools/browser/dist/routes.js +24 -0
- package/packages/tools/browser/dist/routes.js.map +1 -1
- package/packages/tools/browser/dist/service.d.ts +48 -1
- package/packages/tools/browser/dist/service.d.ts.map +1 -1
- package/packages/tools/browser/dist/service.js +114 -11
- package/packages/tools/browser/dist/service.js.map +1 -1
- package/packages/tools/browser/dist/types.d.ts +54 -3
- package/packages/tools/browser/dist/types.d.ts.map +1 -1
- package/packages/tools/browser/dist/types.js +17 -1
- package/packages/tools/browser/dist/types.js.map +1 -1
- package/packages/tools/email/dist/.tsbuildinfo +1 -1
- package/packages/tools/host/dist/.tsbuildinfo +1 -1
- package/packages/tools/mcp/dist/.tsbuildinfo +1 -1
- package/packages/tools/memory/dist/.tsbuildinfo +1 -1
- package/packages/tools/web/dist/.tsbuildinfo +1 -1
- package/packages/web/dist/assets/index-DgpPl0TR.js +155 -0
- package/packages/web/dist/assets/index-rMRjibNI.css +1 -0
- package/packages/web/dist/assets/{lottie_light-D7CS-IeP.js → lottie_light-twPed1FM.js} +1 -1
- package/packages/web/dist/build.json +1 -1
- package/packages/web/dist/index.html +2 -2
- package/packages/web/dist/precache.json +4 -4
- package/node_modules/content-disposition/index.js +0 -536
- package/node_modules/playwright/jsx-runtime.js +0 -42
- package/node_modules/playwright/jsx-runtime.mjs +0 -21
- package/node_modules/playwright-core/lib/vite/recorder/assets/index-hrlLqLtq.js +0 -129
- package/node_modules/playwright-core/lib/vite/traceViewer/assets/defaultSettingsView-Ds6CBOo0.js +0 -182
- package/packages/web/dist/assets/index-BibqUZwt.js +0 -155
- package/packages/web/dist/assets/index-DBVZzTau.css +0 -1
|
@@ -11,6 +11,7 @@ import { LimitedPassthrough, normalizeByteLimit } from './limited-passthrough.js
|
|
|
11
11
|
// What a wait on the head stream listens for: it can take more input, it failed, or it went
|
|
12
12
|
// away (a consumer destroying it closes it without a 'drain')
|
|
13
13
|
const DRAIN_WAIT_EVENTS = ['drain', 'error', 'close'];
|
|
14
|
+
import { createImapError } from './errors.js';
|
|
14
15
|
import { getDecoder, isUnsafeKey } from './tools.js';
|
|
15
16
|
const isEmptySection = (value) => !value?.length;
|
|
16
17
|
/**
|
|
@@ -33,8 +34,9 @@ const partialStarts = (requests) => {
|
|
|
33
34
|
}
|
|
34
35
|
return starts;
|
|
35
36
|
};
|
|
36
|
-
//
|
|
37
|
-
|
|
37
|
+
// Attempts per request when the answer belongs to another request or, for a message known to
|
|
38
|
+
// exist, is empty
|
|
39
|
+
const MAX_FETCH_ATTEMPTS = 3;
|
|
38
40
|
const requestedUid = (range, options) => options.uid && /^\d+$/.test(String(range)) ? Number(range) : undefined;
|
|
39
41
|
const isForeignAnswer = (response, expected) => {
|
|
40
42
|
if (expected.uid && response.uid && response.uid !== expected.uid) {
|
|
@@ -56,11 +58,19 @@ const isForeignAnswer = (response, expected) => {
|
|
|
56
58
|
* within the answer to the next one. Taken at face value it would be the data of that next
|
|
57
59
|
* request, and a download would end without an error but with misplaced bytes. An answer for
|
|
58
60
|
* another UID, or with a partial section that starts at another offset than asked, is dropped
|
|
59
|
-
* and the request repeated.
|
|
61
|
+
* and the request repeated. An empty answer is repeated too while `expected.retryEmpty()` says
|
|
62
|
+
* the message exists, as the data of a late answer arrives with the repeated request.
|
|
60
63
|
*/
|
|
61
64
|
async function fetchExpected(client, range, query, options, expected) {
|
|
62
65
|
for (let attempt = 1;; attempt++) {
|
|
63
66
|
let response = await client.fetchOne(range, query, options);
|
|
67
|
+
if (response === false && expected.retryEmpty && expected.retryEmpty() && attempt < MAX_FETCH_ATTEMPTS) {
|
|
68
|
+
// The answer may come late instead (after the tagged OK, with the next answer), then
|
|
69
|
+
// it shows up in the answer to the repeated request. A message that is really gone
|
|
70
|
+
// answers empty every time, and the caller reports it.
|
|
71
|
+
client.log.warn({ msg: 'Server answered a request for an existing message with no data, asking again', attempt, cid: client.id });
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
64
74
|
if (!response || !isForeignAnswer(response, expected)) {
|
|
65
75
|
return response;
|
|
66
76
|
}
|
|
@@ -71,11 +81,8 @@ async function fetchExpected(client, range, query, options, expected) {
|
|
|
71
81
|
attempt,
|
|
72
82
|
cid: client.id
|
|
73
83
|
});
|
|
74
|
-
if (attempt >=
|
|
75
|
-
|
|
76
|
-
err.code = 'DownloadIncomplete';
|
|
77
|
-
err.cid = client.id;
|
|
78
|
-
throw err;
|
|
84
|
+
if (attempt >= MAX_FETCH_ATTEMPTS) {
|
|
85
|
+
throw createImapError('Server kept answering with data of another request', 'DownloadIncomplete', { cid: client.id });
|
|
79
86
|
}
|
|
80
87
|
}
|
|
81
88
|
}
|
|
@@ -101,7 +108,8 @@ async function refetchDroppedSections(client, response, range, options, sections
|
|
|
101
108
|
let uid = response.uid;
|
|
102
109
|
let retry = await fetchExpected(client, uid || range, { uid: true, bodyParts: sections }, uid ? { ...options, uid: true } : options, {
|
|
103
110
|
uid,
|
|
104
|
-
origins: partialStarts(sections)
|
|
111
|
+
origins: partialStarts(sections),
|
|
112
|
+
retryEmpty: () => true
|
|
105
113
|
});
|
|
106
114
|
if (!retry) {
|
|
107
115
|
return;
|
|
@@ -147,7 +155,13 @@ export async function downloadMessage(client, range, part, options) {
|
|
|
147
155
|
// Special handling for part "1": in single-node emails (no childNodes),
|
|
148
156
|
// the body is accessed via "TEXT" rather than "1", and headers via
|
|
149
157
|
// "HEADER" instead of "1.MIME". Check bodyStructure to detect this.
|
|
150
|
-
let
|
|
158
|
+
let expectedUid = requestedUid(range, downloadOptions);
|
|
159
|
+
let response = await fetchExpected(client, range, { uid: true, bodyStructure: true }, downloadOptions, {
|
|
160
|
+
uid: expectedUid,
|
|
161
|
+
origins: new Map(),
|
|
162
|
+
// a message addressed by UID is taken to exist, see getNextPart() below
|
|
163
|
+
retryEmpty: expectedUid ? () => true : undefined
|
|
164
|
+
});
|
|
151
165
|
if (!response) {
|
|
152
166
|
return {};
|
|
153
167
|
}
|
|
@@ -163,6 +177,14 @@ export async function downloadMessage(client, range, part, options) {
|
|
|
163
177
|
part = 'TEXT';
|
|
164
178
|
}
|
|
165
179
|
}
|
|
180
|
+
// The decoder pipeline, built once the head chunk told what the part is (see below)
|
|
181
|
+
let stream;
|
|
182
|
+
let output;
|
|
183
|
+
let fetchAborted = false;
|
|
184
|
+
// A consumer that gave up: its 'close' may still be a tick away from setting fetchAborted,
|
|
185
|
+
// so the stream's own flag is checked as well
|
|
186
|
+
// `output` is unset until the head chunk is in, and the head chunk's retry asks already
|
|
187
|
+
let downloadAborted = () => fetchAborted || !!output?.destroyed;
|
|
166
188
|
let getNextPart = async (query) => {
|
|
167
189
|
query = query || {};
|
|
168
190
|
let mimeKey;
|
|
@@ -196,12 +218,23 @@ export async function downloadMessage(client, range, part, options) {
|
|
|
196
218
|
};
|
|
197
219
|
query.bodyParts.push(contentRequest);
|
|
198
220
|
}
|
|
221
|
+
let expectedUid = uid || requestedUid(range, downloadOptions);
|
|
199
222
|
let expected = {
|
|
200
|
-
uid:
|
|
201
|
-
origins: new Map([[part || '', processed]])
|
|
223
|
+
uid: expectedUid,
|
|
224
|
+
origins: new Map([[part || '', processed]]),
|
|
225
|
+
// Every chunk after the first is of a message that was there a moment ago, and a
|
|
226
|
+
// message the caller addresses by UID is taken to exist: an empty answer may be a
|
|
227
|
+
// late one (Apache James), a message that is really gone costs two more requests
|
|
228
|
+
retryEmpty: processed > 0 || expectedUid ? () => !downloadAborted() : undefined
|
|
202
229
|
};
|
|
203
230
|
let response = await fetchExpected(client, range, query, downloadOptions, expected);
|
|
204
231
|
if (!response) {
|
|
232
|
+
// An empty answer also comes from a connection that closed while the consumer was
|
|
233
|
+
// paused between chunks (fetchOne() finds no mailbox then), and that is not a
|
|
234
|
+
// missing message: a caller that retries would skip it
|
|
235
|
+
if (!client.usable) {
|
|
236
|
+
throw client.createNoConnectionError(false, { rejectedFrom: 'download' });
|
|
237
|
+
}
|
|
205
238
|
return { response: false, chunk: false };
|
|
206
239
|
}
|
|
207
240
|
if (!uid && response.uid) {
|
|
@@ -309,9 +342,6 @@ export async function downloadMessage(client, range, part, options) {
|
|
|
309
342
|
meta.filename = filename;
|
|
310
343
|
}
|
|
311
344
|
}
|
|
312
|
-
let stream;
|
|
313
|
-
let output;
|
|
314
|
-
let fetchAborted = false;
|
|
315
345
|
// Build a decoder pipeline that progressively transforms the raw FETCH data:
|
|
316
346
|
// 1. Transfer-encoding decoder (base64 or quoted-printable -> binary)
|
|
317
347
|
// 2. Format decoder (format=flowed -> plain text, if applicable)
|
|
@@ -341,13 +371,19 @@ export async function downloadMessage(client, range, part, options) {
|
|
|
341
371
|
// would still pull the entire part off the wire.
|
|
342
372
|
let limiters = [];
|
|
343
373
|
let isLimited = () => limiters.some(entry => entry.limited);
|
|
374
|
+
// Every stage after the head, so a download that ends early can release all of them
|
|
375
|
+
let stages = [];
|
|
344
376
|
// Appending a stage means forwarding the current tail's errors to it before piping, so a
|
|
345
|
-
// failure anywhere reaches the stream the caller is reading
|
|
377
|
+
// failure anywhere reaches the stream the caller is reading. The stage is destroyed with
|
|
378
|
+
// the error rather than only emitting it: pipe() does not end its destination on a source
|
|
379
|
+
// error, so a consumer that only listens for 'finish' or 'close' (a plain .pipe() into a
|
|
380
|
+
// file) would otherwise wait forever.
|
|
346
381
|
let pipeStage = (stage) => {
|
|
347
382
|
output.on('error', err => {
|
|
348
|
-
stage.
|
|
383
|
+
stage.destroy(err);
|
|
349
384
|
});
|
|
350
385
|
output = output.pipe(stage);
|
|
386
|
+
stages.push(stage);
|
|
351
387
|
return stage;
|
|
352
388
|
};
|
|
353
389
|
let isTextNode = ['text/html', 'text/plain', 'text/x-amp-html'].includes(meta.contentType) || (part === '1' && !meta.contentType);
|
|
@@ -392,8 +428,8 @@ export async function downloadMessage(client, range, part, options) {
|
|
|
392
428
|
// Cleanup function
|
|
393
429
|
const cleanup = () => {
|
|
394
430
|
fetchAborted = true;
|
|
395
|
-
|
|
396
|
-
|
|
431
|
+
for (let entry of [stream, ...stages]) {
|
|
432
|
+
entry.destroy();
|
|
397
433
|
}
|
|
398
434
|
};
|
|
399
435
|
// Listen for stream destruction
|
|
@@ -466,26 +502,18 @@ export async function downloadMessage(client, range, part, options) {
|
|
|
466
502
|
// Loud on purpose. Everything written downstream by this point holds
|
|
467
503
|
// duplicated content, and a quiet stop is indistinguishable from a clean EOF,
|
|
468
504
|
// so the consumer would store a corrupt body believing it intact.
|
|
469
|
-
|
|
470
|
-
err.code = 'DownloadOverflow';
|
|
471
|
-
err.maxSize = maxTotalBytes;
|
|
472
|
-
err.cid = client.id;
|
|
473
|
-
throw err;
|
|
505
|
+
throw createImapError('Download exceeded the expected message size', 'DownloadOverflow', { maxSize: maxTotalBytes, cid: client.id });
|
|
474
506
|
}
|
|
475
507
|
let { response, chunk } = await getNextPart();
|
|
476
|
-
// A consumer that gave up while the chunk was in flight
|
|
477
|
-
|
|
478
|
-
if (fetchAborted || output.destroyed) {
|
|
508
|
+
// A consumer that gave up while the chunk was in flight
|
|
509
|
+
if (downloadAborted()) {
|
|
479
510
|
break;
|
|
480
511
|
}
|
|
481
512
|
if (response === false) {
|
|
482
513
|
// The message is gone mid-download (expunged by another client, or the
|
|
483
514
|
// mailbox was closed). Ending the stream here would pass the truncated body
|
|
484
515
|
// off as complete, so the consumer is told the same way as for an overflow.
|
|
485
|
-
|
|
486
|
-
err.code = 'DownloadIncomplete';
|
|
487
|
-
err.cid = client.id;
|
|
488
|
-
throw err;
|
|
516
|
+
throw createImapError('Message disappeared before the download completed', 'DownloadIncomplete', { cid: client.id });
|
|
489
517
|
}
|
|
490
518
|
if (!chunk) {
|
|
491
519
|
break;
|
|
@@ -515,7 +543,7 @@ export async function downloadMessage(client, range, part, options) {
|
|
|
515
543
|
fetchAllParts(head)
|
|
516
544
|
.catch(err => {
|
|
517
545
|
if (!fetchAborted && stream && !stream.destroyed) {
|
|
518
|
-
stream.
|
|
546
|
+
stream.destroy(err);
|
|
519
547
|
/* c8 ignore start */ // the else logs when a fetch error arrives after the stream was already torn down (timing-dependent)
|
|
520
548
|
}
|
|
521
549
|
else {
|
|
@@ -540,7 +568,7 @@ export async function downloadMessage(client, range, part, options) {
|
|
|
540
568
|
// above rejects a promise nobody holds and takes the process down on
|
|
541
569
|
// unhandledRejection. Reaching it always means an invariant broke - the head
|
|
542
570
|
// stream kept pipeStage()'s error forwarder for the life of the download, so
|
|
543
|
-
//
|
|
571
|
+
// destroy(err) above has somewhere to go - which is why it logs at error even
|
|
544
572
|
// for a routine-looking connection code.
|
|
545
573
|
.catch(err => client.log.error({ msg: 'Failed to fail the download stream', err, cid: client.id }));
|
|
546
574
|
};
|
|
@@ -579,9 +607,12 @@ export async function downloadMessageParts(client, range, parts, options) {
|
|
|
579
607
|
contentRequests.set(part, contentRequest);
|
|
580
608
|
query.bodyParts.push(contentRequest);
|
|
581
609
|
}
|
|
610
|
+
let expectedUid = requestedUid(range, downloadOptions);
|
|
582
611
|
let response = await fetchExpected(client, range, query, downloadOptions, {
|
|
583
|
-
uid:
|
|
584
|
-
origins: partialStarts(query.bodyParts)
|
|
612
|
+
uid: expectedUid,
|
|
613
|
+
origins: partialStarts(query.bodyParts),
|
|
614
|
+
// a message addressed by UID is taken to exist, as for download()
|
|
615
|
+
retryEmpty: expectedUid ? () => true : undefined
|
|
585
616
|
});
|
|
586
617
|
if (!response || !response.bodyParts) {
|
|
587
618
|
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;
|
|
@@ -32,6 +32,8 @@ export const ImapFlowErrorCode = {
|
|
|
32
32
|
// response parsing and size limits
|
|
33
33
|
ParserError: 'ParserError',
|
|
34
34
|
ParserErrorExchange: 'ParserErrorExchange',
|
|
35
|
+
// an unexpected exception inside the parser, re-raised with a code; a parser bug
|
|
36
|
+
ParserErrorInternal: 'ParserErrorInternal',
|
|
35
37
|
MAX_IMAP_NESTING_REACHED: 'MAX_IMAP_NESTING_REACHED',
|
|
36
38
|
LineTooLarge: 'LineTooLarge',
|
|
37
39
|
LiteralTooLarge: 'LiteralTooLarge',
|
|
@@ -42,6 +44,7 @@ export const ImapFlowErrorCode = {
|
|
|
42
44
|
InvalidTextValue: 'InvalidTextValue',
|
|
43
45
|
InvalidSequenceSet: 'InvalidSequenceSet',
|
|
44
46
|
InvalidSearchQuery: 'InvalidSearchQuery',
|
|
47
|
+
InvalidMessageContent: 'InvalidMessageContent',
|
|
45
48
|
// download()
|
|
46
49
|
DownloadOverflow: 'DownloadOverflow',
|
|
47
50
|
DownloadIncomplete: 'DownloadIncomplete',
|
|
@@ -62,3 +65,21 @@ export class AuthenticationFailure extends Error {
|
|
|
62
65
|
this.authenticationFailed = true;
|
|
63
66
|
}
|
|
64
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Creates an {@link ImapFlowError} with a code and optional extra properties. The code is
|
|
70
|
+
* checked by the compiler against {@link ImapFlowErrorCode}, so a typo or an undeclared
|
|
71
|
+
* code fails the build instead of reaching consumers.
|
|
72
|
+
*
|
|
73
|
+
* @param message - The error message
|
|
74
|
+
* @param code - The error code
|
|
75
|
+
* @param props - Extra properties to set on the error
|
|
76
|
+
* @returns The error, ready to throw or reject with
|
|
77
|
+
*/
|
|
78
|
+
export function createImapError(message, code, props) {
|
|
79
|
+
const error = new Error(message);
|
|
80
|
+
error.code = code;
|
|
81
|
+
if (props) {
|
|
82
|
+
Object.assign(error, props);
|
|
83
|
+
}
|
|
84
|
+
return error;
|
|
85
|
+
}
|
|
@@ -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
|
|
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
|
-
}):
|
|
19
|
+
}): Buffer[];
|
|
20
20
|
declare function compiler(response: ImapCompileInput, options?: (CompilerOptions & {
|
|
21
21
|
asArray?: false | undefined;
|
|
22
|
-
}) | undefined):
|
|
23
|
-
declare function compiler(response: ImapCompileInput, options?: CompilerOptions | undefined):
|
|
22
|
+
}) | undefined): Buffer;
|
|
23
|
+
declare function compiler(response: ImapCompileInput, options?: CompilerOptions | undefined): Buffer | Buffer[];
|
|
24
24
|
export default compiler;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/* eslint no-console: 0, new-cap: 0 */
|
|
2
2
|
import imapFormalSyntax from './imap-formal-syntax.js';
|
|
3
|
+
import { createImapError } from '../errors.js';
|
|
3
4
|
// A single element of a sequence-set as defined by the RFC 9051 grammar: a number
|
|
4
5
|
// or a range, where "*" stands for the largest number in use. Digit strings are not
|
|
5
6
|
// range-checked here (a server rejects "0" or an overlong number on its own); the
|
|
@@ -41,13 +42,11 @@ const CRLF = /[\r\n]/;
|
|
|
41
42
|
*/
|
|
42
43
|
const quoteString = (value) => {
|
|
43
44
|
if (NOT_QUOTABLE.test(value)) {
|
|
44
|
-
|
|
45
|
-
error.code = 'InvalidStringValue';
|
|
46
|
-
throw error;
|
|
45
|
+
throw createImapError('Unquotable character in IMAP string value', 'InvalidStringValue');
|
|
47
46
|
}
|
|
48
47
|
return '"' + value.replace(/["\\]/g, char => '\\' + char) + '"';
|
|
49
48
|
};
|
|
50
|
-
|
|
49
|
+
function compiler(response, options) {
|
|
51
50
|
let { asArray, isLogging, literalPlus, literalMinus } = options || {};
|
|
52
51
|
const respParts = [];
|
|
53
52
|
// Formats an entry (string, number or Buffer) into the Buffer that is written to
|
|
@@ -62,9 +61,7 @@ async function compiler(response, options) {
|
|
|
62
61
|
const emitEntry = (entry, opts) => {
|
|
63
62
|
let { returnEmpty, raw } = opts || {};
|
|
64
63
|
if (!raw && !isLogging && (typeof entry === 'string' || Buffer.isBuffer(entry)) && CRLF.test(entry.toString('latin1'))) {
|
|
65
|
-
|
|
66
|
-
error.code = 'InvalidTokenValue';
|
|
67
|
-
throw error;
|
|
64
|
+
throw createImapError('Line terminator in IMAP token', 'InvalidTokenValue');
|
|
68
65
|
}
|
|
69
66
|
if (typeof entry === 'string') {
|
|
70
67
|
return Buffer.from(entry);
|
|
@@ -88,7 +85,7 @@ async function compiler(response, options) {
|
|
|
88
85
|
// Set right after the compiler writes "(" or "[" itself, so the first element inside gets no
|
|
89
86
|
// leading space
|
|
90
87
|
let afterOpener = false;
|
|
91
|
-
let walk =
|
|
88
|
+
let walk = (node, options) => {
|
|
92
89
|
options = options || {};
|
|
93
90
|
// Add a space separator when:
|
|
94
91
|
// - The previous token was a LITERAL. Literal data ends exactly at its declared length, so
|
|
@@ -120,7 +117,7 @@ async function compiler(response, options) {
|
|
|
120
117
|
if (subArray && !Array.isArray(child)) {
|
|
121
118
|
subArray = false;
|
|
122
119
|
}
|
|
123
|
-
|
|
120
|
+
walk(child, { subArray });
|
|
124
121
|
}
|
|
125
122
|
resp.push(emitEntry(')'));
|
|
126
123
|
afterOpener = false;
|
|
@@ -154,6 +151,11 @@ async function compiler(response, options) {
|
|
|
154
151
|
resp.push(emitEntry(logPlaceholder(node.value.length, 'literal')));
|
|
155
152
|
}
|
|
156
153
|
else {
|
|
154
|
+
// The size marker must match the bytes emitEntry() writes, and it writes
|
|
155
|
+
// nothing for a value that is not a Buffer or a string
|
|
156
|
+
if (node.value && !Buffer.isBuffer(node.value) && typeof node.value !== 'string') {
|
|
157
|
+
throw createImapError('Literal value must be a Buffer or a string', 'InvalidTokenValue');
|
|
158
|
+
}
|
|
157
159
|
// The literal size marker counts octets - string values are written as
|
|
158
160
|
// UTF-8, so their UTF-16 .length would undercount multi-byte characters
|
|
159
161
|
let literalLength = !node.value ? 0 : Buffer.isBuffer(node.value) ? node.value.length : Buffer.byteLength(node.value.toString());
|
|
@@ -208,9 +210,7 @@ async function compiler(response, options) {
|
|
|
208
210
|
if (!isLogging) {
|
|
209
211
|
val = node.value === null || node.value === undefined ? '' : node.value.toString();
|
|
210
212
|
if (!isValidSequenceSet(val)) {
|
|
211
|
-
|
|
212
|
-
error.code = 'InvalidSequenceSet';
|
|
213
|
-
throw error;
|
|
213
|
+
throw createImapError('Invalid sequence set value', 'InvalidSequenceSet');
|
|
214
214
|
}
|
|
215
215
|
resp.push(emitEntry(val, { raw: true }));
|
|
216
216
|
}
|
|
@@ -225,9 +225,7 @@ async function compiler(response, options) {
|
|
|
225
225
|
// this check runs first only to raise the more specific InvalidTextValue code.
|
|
226
226
|
if (node.value) {
|
|
227
227
|
if (!isLogging && CRLF.test(node.value.toString())) {
|
|
228
|
-
|
|
229
|
-
error.code = 'InvalidTextValue';
|
|
230
|
-
throw error;
|
|
228
|
+
throw createImapError('Line terminator in IMAP text value', 'InvalidTextValue');
|
|
231
229
|
}
|
|
232
230
|
resp.push(emitEntry(node.value));
|
|
233
231
|
}
|
|
@@ -262,7 +260,7 @@ async function compiler(response, options) {
|
|
|
262
260
|
resp.push(emitEntry('['));
|
|
263
261
|
afterOpener = true;
|
|
264
262
|
for (let child of node.section) {
|
|
265
|
-
|
|
263
|
+
walk(child);
|
|
266
264
|
}
|
|
267
265
|
resp.push(emitEntry(']'));
|
|
268
266
|
afterOpener = false;
|
|
@@ -281,13 +279,15 @@ async function compiler(response, options) {
|
|
|
281
279
|
if (response.attributes) {
|
|
282
280
|
let attributes = Array.isArray(response.attributes) ? response.attributes : [].concat(response.attributes);
|
|
283
281
|
for (let child of attributes) {
|
|
284
|
-
|
|
282
|
+
walk(child);
|
|
285
283
|
}
|
|
286
284
|
}
|
|
287
285
|
if (resp.length) {
|
|
288
286
|
respParts.push(resp);
|
|
289
287
|
}
|
|
290
|
-
|
|
288
|
+
// A part with a single entry (the data of a synchronizing literal) is used as is: copying a
|
|
289
|
+
// large message only to send it doubles its memory
|
|
290
|
+
const compiled = respParts.map(part => (part.length === 1 ? part[0] : Buffer.concat(part)));
|
|
291
291
|
// without asArray there is a single part, returned as is instead of copied
|
|
292
292
|
return asArray ? compiled : compiled.length === 1 ? compiled[0] : Buffer.concat(compiled);
|
|
293
293
|
}
|
|
@@ -1,5 +1,30 @@
|
|
|
1
1
|
import imapFormalSyntax from './imap-formal-syntax.js';
|
|
2
2
|
import { ParserInstance } from './parser-instance.js';
|
|
3
|
+
import { createImapError } from '../errors.js';
|
|
4
|
+
import { boundedInput } from './limits.js';
|
|
5
|
+
// The codes the parser raises on purpose: the numbered ParserErrorN codes, ParserErrorExchange,
|
|
6
|
+
// the nesting limit and the inline literal size limit
|
|
7
|
+
const PARSER_ERROR_CODES = /^(?:ParserError\d+|ParserErrorExchange|MAX_IMAP_NESTING_REACHED|LiteralTooLarge)$/;
|
|
8
|
+
/**
|
|
9
|
+
* Anything the parser throws other than one of its own coded errors - a TypeError from a parser
|
|
10
|
+
* bug, a RangeError from runaway recursion or a bad Buffer offset (which carries a Node code), a
|
|
11
|
+
* thrown non-Error - is re-raised as a coded `ParserErrorInternal`, so callers that match on
|
|
12
|
+
* codes still handle it and settle the command the line belonged to. The fuzz suite treats this
|
|
13
|
+
* code as a failure, so the guard does not hide parser bugs from the tests.
|
|
14
|
+
*
|
|
15
|
+
* @param err - The thrown value
|
|
16
|
+
* @param input - The line that was being parsed
|
|
17
|
+
* @returns The error to rethrow
|
|
18
|
+
*/
|
|
19
|
+
function asParserError(err, input) {
|
|
20
|
+
if (err instanceof Error && PARSER_ERROR_CODES.test(err.code || '')) {
|
|
21
|
+
return err;
|
|
22
|
+
}
|
|
23
|
+
return createImapError(`Unexpected parser failure: ${err instanceof Error ? err.message : String(err)}`, 'ParserErrorInternal', {
|
|
24
|
+
parserContext: boundedInput(input.toString()),
|
|
25
|
+
...(err instanceof Error ? { _err: err } : {})
|
|
26
|
+
});
|
|
27
|
+
}
|
|
3
28
|
/**
|
|
4
29
|
* Parses a raw IMAP command or response buffer into a structured object.
|
|
5
30
|
* Handles edge cases such as null-byte-padded responses from buggy servers and
|
|
@@ -20,7 +45,7 @@ export default async function parser(command, options) {
|
|
|
20
45
|
// Workaround for buggy IMAP servers that pad responses with leading NUL (\x00) bytes.
|
|
21
46
|
// Some servers (observed in the wild) prepend null bytes to their output, which would
|
|
22
47
|
// cause parsing to fail. We strip them and note how many were removed for diagnostics.
|
|
23
|
-
if (command[0] === 0) {
|
|
48
|
+
if (Buffer.isBuffer(command) && command[0] === 0) {
|
|
24
49
|
// find the first non null byte and trim
|
|
25
50
|
let firstNonNull = -1;
|
|
26
51
|
for (let i = 0; i < command.length; i++) {
|
|
@@ -33,7 +58,7 @@ export default async function parser(command, options) {
|
|
|
33
58
|
// All bytes are null, treat as a BAD response
|
|
34
59
|
return { tag: '*', command: 'BAD', attributes: [] };
|
|
35
60
|
}
|
|
36
|
-
command = command.
|
|
61
|
+
command = command.subarray(firstNonNull);
|
|
37
62
|
nullBytesRemoved = firstNonNull;
|
|
38
63
|
}
|
|
39
64
|
const parserInstance = new ParserInstance(command, options);
|
|
@@ -65,7 +90,7 @@ export default async function parser(command, options) {
|
|
|
65
90
|
}
|
|
66
91
|
}
|
|
67
92
|
catch (err) {
|
|
68
|
-
let error = err;
|
|
93
|
+
let error = asParserError(err, command);
|
|
69
94
|
if (error.code === 'ParserErrorExchange' && error.parserContext && error.parserContext.value) {
|
|
70
95
|
return error.parserContext.value;
|
|
71
96
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Transform } from 'node:stream';
|
|
2
2
|
import { createConnectionLogger } from '../logger.js';
|
|
3
3
|
import { MAX_LITERAL_SIZE, MAX_LINE_SIZE, MAX_RESPONSE_SIZE, normalizeLimit, createLiteralTooLargeError } from './limits.js';
|
|
4
|
+
import { createImapError } from '../errors.js';
|
|
4
5
|
const LINE = 0x01;
|
|
5
6
|
const LITERAL = 0x02;
|
|
6
7
|
const LF = 0x0a;
|
|
@@ -177,10 +178,10 @@ export class ImapStream extends Transform {
|
|
|
177
178
|
if (lineLength <= this.maxLineLength) {
|
|
178
179
|
return true;
|
|
179
180
|
}
|
|
180
|
-
const err =
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
181
|
+
const err = createImapError(`Line length ${lineLength} exceeds maximum allowed size of ${this.maxLineLength} bytes`, 'LineTooLarge', {
|
|
182
|
+
lineLength,
|
|
183
|
+
maxSize: this.maxLineLength
|
|
184
|
+
});
|
|
184
185
|
return this.failStream(err);
|
|
185
186
|
}
|
|
186
187
|
/**
|
|
@@ -203,10 +204,10 @@ export class ImapStream extends Transform {
|
|
|
203
204
|
}
|
|
204
205
|
return true;
|
|
205
206
|
}
|
|
206
|
-
const err =
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
207
|
+
const err = createImapError(`Response size ${total} exceeds maximum allowed size of ${this.maxResponseSize} bytes`, 'ResponseTooLarge', {
|
|
208
|
+
responseSize: total,
|
|
209
|
+
maxSize: this.maxResponseSize
|
|
210
|
+
});
|
|
210
211
|
return this.failStream(err);
|
|
211
212
|
}
|
|
212
213
|
/**
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Shared response-size limits for the IMAP parser. Kept in one place so the streaming parser
|
|
2
2
|
// (ImapStream) and the standalone token parser cannot drift apart, and so the documented
|
|
3
3
|
// defaults in the ImapFlowOptions type describe both paths.
|
|
4
|
+
import { createImapError } from '../errors.js';
|
|
4
5
|
// Maximum allowed literal size: 1GB (1073741824 bytes)
|
|
5
6
|
export const MAX_LITERAL_SIZE = 1024 * 1024 * 1024;
|
|
6
7
|
// Default maximum length of a single line (a response without a literal). Matches the literal cap:
|
|
@@ -51,10 +52,7 @@ export const normalizeLimit = (value, defaultValue) => (Number.isInteger(value)
|
|
|
51
52
|
* @param reason - What the bound was, when it is not the configured maximum.
|
|
52
53
|
* @returns The error to emit or throw.
|
|
53
54
|
*/
|
|
54
|
-
export const createLiteralTooLargeError = (literalSize, maxSize, reason) => {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
err.maxSize = maxSize;
|
|
59
|
-
return err;
|
|
60
|
-
};
|
|
55
|
+
export const createLiteralTooLargeError = (literalSize, maxSize, reason) => createImapError(`Literal size ${literalSize} exceeds ${reason || `maximum allowed size of ${maxSize} bytes`}`, 'LiteralTooLarge', {
|
|
56
|
+
literalSize,
|
|
57
|
+
maxSize
|
|
58
|
+
});
|