@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
|
@@ -14,11 +14,13 @@ import { parser, compiler } from './handler/imap-handler.js';
|
|
|
14
14
|
import { proxyConnection, detachEarlyErrorHandler } from './proxy-connection.js';
|
|
15
15
|
import { ConnectionDeadline } from './connection-deadline.js';
|
|
16
16
|
import { downloadMessage, downloadMessageParts } from './download.js';
|
|
17
|
-
import { AuthenticationFailure } from './errors.js';
|
|
17
|
+
import { AuthenticationFailure, createImapError } from './errors.js';
|
|
18
18
|
import imapCommands from './imap-commands.js';
|
|
19
|
-
import { comparePaths, updateCapabilities, getFolderTree, formatMessageResponse, packMessageRange, normalizePath, expandRange, getColorFlags, hasCapability, isRev2Active, logConnectionError, unrefTimer, clearTimer, parseUintValue, getStringList, getTextValues, emitSafe, buildConnectionError, guardedPromise, guardedReject, MAX_UINT32_DIGITS } from './tools.js';
|
|
19
|
+
import { comparePaths, updateCapabilities, getFolderTree, formatMessageResponse, mergeFetchRows, packMessageRange, normalizePath, expandRange, getColorFlags, hasCapability, isRev2Active, logConnectionError, unrefTimer, clearTimer, parseUintValue, getStringList, getTextValues, emitSafe, buildConnectionError, guardedPromise, guardedReject, MAX_UINT32_DIGITS } from './tools.js';
|
|
20
20
|
export { AuthenticationFailure, ImapFlowErrorCode } from './errors.js';
|
|
21
21
|
const GREETING_TIMEOUT = 16 * 1000;
|
|
22
|
+
// Status responses that can carry an ALERT response code
|
|
23
|
+
const ALERT_RESPONSES = new Set(['OK', 'NO', 'BAD', 'BYE', 'PREAUTH']);
|
|
22
24
|
const UPGRADE_TIMEOUT = 10 * 1000;
|
|
23
25
|
const SOCKET_TIMEOUT = 5 * 60 * 1000;
|
|
24
26
|
// Ceiling for any throttle back-off wait. Both the connection-level back-off and the per-command
|
|
@@ -42,6 +44,10 @@ const RAW_SENSITIVE_COMMANDS = new Set(['LOGIN', 'AUTHENTICATE']);
|
|
|
42
44
|
// Stand-in payload for a withheld raw client frame. Fixed width, so the entry says nothing
|
|
43
45
|
// about the length of what it replaced.
|
|
44
46
|
const RAW_HIDDEN_PLACEHOLDER = Buffer.from('(* value hidden *)\r\n').toString('base64');
|
|
47
|
+
// From this size up, a Buffer written as the last part of a command gets its CRLF as a socket
|
|
48
|
+
// write of its own instead of being copied to append it (see write())
|
|
49
|
+
const SEPARATE_LINE_BREAK_SIZE = 64 * 1024;
|
|
50
|
+
const CRLF = Buffer.from('\r\n');
|
|
45
51
|
// Servers, matched by the name in their ID response, that advertise IMAP4rev2 next to
|
|
46
52
|
// IMAP4rev1 and accept ENABLE IMAP4rev2, but misbehave once it is enabled. ENABLE cannot
|
|
47
53
|
// be undone (RFC 5161), so these are kept in IMAP4rev1 mode from the start. Strato's
|
|
@@ -342,43 +348,47 @@ export class ImapFlow extends EventEmitter {
|
|
|
342
348
|
// commandParts holds the remaining parts (literal data, continuation); the CRLF
|
|
343
349
|
// delimiter is only added when no more parts remain (the command is complete).
|
|
344
350
|
let addLineBreak = !this.commandParts.length;
|
|
345
|
-
|
|
351
|
+
// What goes to the socket, one write per entry. A large Buffer (the data of a literal)
|
|
352
|
+
// gets its CRLF as a write of its own, as concatenating would copy all of it.
|
|
353
|
+
let frames;
|
|
346
354
|
if (typeof chunk === 'string') {
|
|
347
355
|
if (addLineBreak) {
|
|
348
356
|
chunk += '\r\n';
|
|
349
357
|
}
|
|
350
|
-
|
|
358
|
+
frames = [Buffer.from(chunk, 'binary')];
|
|
351
359
|
}
|
|
352
360
|
else if (Buffer.isBuffer(chunk)) {
|
|
353
|
-
if (addLineBreak) {
|
|
354
|
-
|
|
361
|
+
if (!addLineBreak) {
|
|
362
|
+
frames = [chunk];
|
|
355
363
|
}
|
|
356
364
|
else {
|
|
357
|
-
|
|
365
|
+
frames = chunk.length >= SEPARATE_LINE_BREAK_SIZE ? [chunk, CRLF] : [Buffer.concat([chunk, CRLF])];
|
|
358
366
|
}
|
|
359
367
|
}
|
|
360
368
|
else {
|
|
361
369
|
return false;
|
|
362
370
|
}
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
371
|
+
for (let data of frames) {
|
|
372
|
+
if (this.logRaw) {
|
|
373
|
+
// Client frames of an authentication exchange carry credentials: the LOGIN
|
|
374
|
+
// arguments, and for AUTHENTICATE also the continuation writes (SASL PLAIN
|
|
375
|
+
// response, AUTH=LOGIN password, OAuth token payload) that bypass send(). The
|
|
376
|
+
// parsed command log masks these, so the raw log must withhold them too, but
|
|
377
|
+
// `data` still carries the placeholder rather than being dropped - the field is
|
|
378
|
+
// part of the documented log format and consumers decode it unconditionally.
|
|
379
|
+
this.log.trace({
|
|
380
|
+
src: 'c',
|
|
381
|
+
msg: 'write to socket',
|
|
382
|
+
data: this.rawSensitiveCommand ? RAW_HIDDEN_PLACEHOLDER : data.toString('base64'),
|
|
383
|
+
...(this.rawSensitiveCommand ? { hidden: true } : {}),
|
|
384
|
+
compress: !!this._deflate,
|
|
385
|
+
secure: !!this.secureConnection,
|
|
386
|
+
cid: this.id
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
this.writeBytesCounter += data.length;
|
|
390
|
+
this.writeSocket.write(data);
|
|
379
391
|
}
|
|
380
|
-
this.writeBytesCounter += data.length;
|
|
381
|
-
this.writeSocket.write(data);
|
|
382
392
|
}
|
|
383
393
|
/**
|
|
384
394
|
* Returns byte counters for the current connection.
|
|
@@ -404,6 +414,9 @@ export class ImapFlow extends EventEmitter {
|
|
|
404
414
|
// and once as a string (for logging, with sensitive data masked).
|
|
405
415
|
// When LITERAL- or LITERAL+ extensions are available, the compiler can use
|
|
406
416
|
// non-synchronizing literals to avoid waiting for server "+" continuation.
|
|
417
|
+
// Async although nothing in it awaits: a failure inside it rejects one microtask later, so a
|
|
418
|
+
// close() in the same tick settles the command with NoConnection first (see
|
|
419
|
+
// test/unhandled-rejection-test.ts)
|
|
407
420
|
/** @internal */
|
|
408
421
|
async send(data) {
|
|
409
422
|
if (this.state === this.states.LOGOUT) {
|
|
@@ -413,11 +426,11 @@ export class ImapFlow extends EventEmitter {
|
|
|
413
426
|
// the socket watchdog.
|
|
414
427
|
throw this.createNoConnectionError(false, { rejectedFrom: 'sendAfterLogout', command: data.command });
|
|
415
428
|
}
|
|
416
|
-
// Classify
|
|
417
|
-
//
|
|
429
|
+
// Classify once per command. Every frame of this command - the command line and any
|
|
430
|
+
// continuation write that follows it - belongs to it until the next send(), because
|
|
418
431
|
// trySend() keeps one command in flight at a time. Reading currentRequest inside write()
|
|
419
|
-
// instead would be racy: rejectCurrentRequest() can clear it
|
|
420
|
-
//
|
|
432
|
+
// instead would be racy: rejectCurrentRequest() can clear it before a continuation frame
|
|
433
|
+
// is written, and the credential frame would then be logged in the clear.
|
|
421
434
|
// Uppercased because the wire protocol is case-insensitive and exec() passes the
|
|
422
435
|
// caller's spelling through unchanged. The command list covers the mechanisms whose
|
|
423
436
|
// secret arrives in a continuation frame, which carries no attributes of its own; the
|
|
@@ -428,7 +441,7 @@ export class ImapFlow extends EventEmitter {
|
|
|
428
441
|
// Compile with asArray=true: splits output into parts for literal handling.
|
|
429
442
|
// First part is the command text up to the first literal, remaining parts
|
|
430
443
|
// are stored in this.commandParts and sent after server "+" continuations.
|
|
431
|
-
let compiled =
|
|
444
|
+
let compiled = compiler(data, {
|
|
432
445
|
asArray: true,
|
|
433
446
|
// LITERAL- is part of base IMAP4rev2
|
|
434
447
|
literalMinus: hasCapability(this, 'LITERAL-') || this.capabilities.has('LITERAL+')
|
|
@@ -439,7 +452,7 @@ export class ImapFlow extends EventEmitter {
|
|
|
439
452
|
// Compile again for logging with isLogging=true: masks sensitive values
|
|
440
453
|
// like passwords while producing a human-readable command string
|
|
441
454
|
if (this.isLogLevelEnabled('debug')) {
|
|
442
|
-
let logCompiled =
|
|
455
|
+
let logCompiled = compiler(data, {
|
|
443
456
|
isLogging: true
|
|
444
457
|
});
|
|
445
458
|
this.log.debug({ src: 'c', msg: logCompiled.toString(), cid: this.id, comment: options.comment });
|
|
@@ -696,9 +709,7 @@ export class ImapFlow extends EventEmitter {
|
|
|
696
709
|
// parser would keep waiting on its backpressure callback forever, which is a
|
|
697
710
|
// silent permanent hang. Fail closed instead.
|
|
698
711
|
keepReading = false;
|
|
699
|
-
let error =
|
|
700
|
-
error.code = 'ResponseProcessingFailed';
|
|
701
|
-
error._err = err;
|
|
712
|
+
let error = createImapError('Failed to process server response', 'ResponseProcessingFailed', { _err: err });
|
|
702
713
|
this.log.error({ msg: 'Failed to process server response', err, cid: this.id });
|
|
703
714
|
this.rejectCurrentRequest(error);
|
|
704
715
|
this.failProtocol(error);
|
|
@@ -749,6 +760,27 @@ export class ImapFlow extends EventEmitter {
|
|
|
749
760
|
this.rejectCurrentRequest(err);
|
|
750
761
|
this.trySend().catch(sendErr => logConnectionError(this, 'Failed to dispatch command', sendErr));
|
|
751
762
|
}
|
|
763
|
+
// RFC 9051 section 7.1: the text of an ALERT must be presented to the user. It can come
|
|
764
|
+
// with any status response, tagged or untagged, the greeting and BYE included. Called for
|
|
765
|
+
// responses that carry the ALERT code.
|
|
766
|
+
/** @internal */
|
|
767
|
+
reportAlert(parsed) {
|
|
768
|
+
let response = (parsed.command || '').toUpperCase();
|
|
769
|
+
if (!ALERT_RESPONSES.has(response)) {
|
|
770
|
+
return;
|
|
771
|
+
}
|
|
772
|
+
let alert = {
|
|
773
|
+
message: getTextValues(parsed.attributes)
|
|
774
|
+
.map(value => value.trim())
|
|
775
|
+
.join(' '),
|
|
776
|
+
response: response
|
|
777
|
+
};
|
|
778
|
+
if (parsed.tag && parsed.tag !== '*') {
|
|
779
|
+
alert.tag = parsed.tag;
|
|
780
|
+
}
|
|
781
|
+
this.log.info({ msg: 'Server alert', alert: alert.message, response: alert.response, cid: this.id });
|
|
782
|
+
emitSafe(this, 'alert', alert);
|
|
783
|
+
}
|
|
752
784
|
/**
|
|
753
785
|
* Handles a single parsed server response: telemetry, continuation requests, response-code
|
|
754
786
|
* section handlers, untagged handlers and tagged command completion.
|
|
@@ -800,7 +832,7 @@ export class ImapFlow extends EventEmitter {
|
|
|
800
832
|
// skipped when the level is off.
|
|
801
833
|
let logLevel = /^\d+$/.test(parsed.command || '') && parsed.attributes && parsed.attributes[0] && parsed.attributes[0].value === 'FETCH' ? 'trace' : 'debug';
|
|
802
834
|
if (this.isLogLevelEnabled(logLevel)) {
|
|
803
|
-
let logCompiled =
|
|
835
|
+
let logCompiled = compiler(parsed, {
|
|
804
836
|
isLogging: true
|
|
805
837
|
});
|
|
806
838
|
this.log[logLevel]({ src: 's', msg: logCompiled.toString(), cid: this.id, nullBytesRemoved: parsed.nullBytesRemoved });
|
|
@@ -843,6 +875,9 @@ export class ImapFlow extends EventEmitter {
|
|
|
843
875
|
// dereference must be guarded or one such line tears down the whole connection
|
|
844
876
|
if (section && section.length && section[0] && section[0].type === 'ATOM' && typeof section[0].value === 'string') {
|
|
845
877
|
let sectionKey = section[0].value.toUpperCase().trim();
|
|
878
|
+
if (sectionKey === 'ALERT') {
|
|
879
|
+
this.reportAlert(parsed);
|
|
880
|
+
}
|
|
846
881
|
let sectionHandler = this.getSectionHandler(sectionKey);
|
|
847
882
|
if (sectionHandler) {
|
|
848
883
|
try {
|
|
@@ -903,12 +938,12 @@ export class ImapFlow extends EventEmitter {
|
|
|
903
938
|
// response ambiguous, so reject this request and fail the connection closed.
|
|
904
939
|
let request = this.requestTagMap.get(parsed.tag);
|
|
905
940
|
this.requestTagMap.delete(parsed.tag);
|
|
906
|
-
let err =
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
};
|
|
941
|
+
let err = createImapError('Server sent a tagged response for a command that was not in flight', 'UnexpectedTag', {
|
|
942
|
+
details: {
|
|
943
|
+
received: parsed.tag,
|
|
944
|
+
expected: this.currentRequest ? this.currentRequest.tag : null
|
|
945
|
+
}
|
|
946
|
+
});
|
|
912
947
|
this.log.error({ msg: 'Protocol desynchronization', err, cid: this.id });
|
|
913
948
|
request.reject(err);
|
|
914
949
|
this.failProtocol(err);
|
|
@@ -952,9 +987,9 @@ export class ImapFlow extends EventEmitter {
|
|
|
952
987
|
try {
|
|
953
988
|
err.executedCommand =
|
|
954
989
|
parsed.tag +
|
|
955
|
-
|
|
990
|
+
compiler(request, {
|
|
956
991
|
isLogging: true
|
|
957
|
-
})
|
|
992
|
+
}).toString();
|
|
958
993
|
}
|
|
959
994
|
catch {
|
|
960
995
|
// ignore
|
|
@@ -1007,9 +1042,7 @@ export class ImapFlow extends EventEmitter {
|
|
|
1007
1042
|
break;
|
|
1008
1043
|
}
|
|
1009
1044
|
default: {
|
|
1010
|
-
let err =
|
|
1011
|
-
err.code = 'InvalidResponse';
|
|
1012
|
-
err.response = parsed;
|
|
1045
|
+
let err = createImapError('Invalid server response', 'InvalidResponse', { response: parsed });
|
|
1013
1046
|
request.reject(err);
|
|
1014
1047
|
break;
|
|
1015
1048
|
}
|
|
@@ -1110,11 +1143,7 @@ export class ImapFlow extends EventEmitter {
|
|
|
1110
1143
|
this._socketTimeout =
|
|
1111
1144
|
this._socketTimeout ||
|
|
1112
1145
|
(() => {
|
|
1113
|
-
const timeoutError = () =>
|
|
1114
|
-
const err = new Error('Socket timeout');
|
|
1115
|
-
err.code = 'ETIMEOUT';
|
|
1116
|
-
return err;
|
|
1117
|
-
};
|
|
1146
|
+
const timeoutError = () => createImapError('Socket timeout', 'ETIMEOUT');
|
|
1118
1147
|
if (!this.usable || !this.socket || this.socket.destroyed) {
|
|
1119
1148
|
this.emitError(timeoutError());
|
|
1120
1149
|
return;
|
|
@@ -1298,7 +1327,10 @@ export class ImapFlow extends EventEmitter {
|
|
|
1298
1327
|
// to call deflate.flush() after each IMAP command to push all pending
|
|
1299
1328
|
// compressed bytes to the server immediately (IMAP is request-response).
|
|
1300
1329
|
const writeSocket = new PassThrough({
|
|
1301
|
-
highWaterMark: 64 * 1024 // 64KB buffer limit to prevent excessive memory usage
|
|
1330
|
+
highWaterMark: 64 * 1024, // 64KB buffer limit to prevent excessive memory usage
|
|
1331
|
+
// read() hands out each written chunk as is: in byte mode it joins whatever is
|
|
1332
|
+
// queued into a new Buffer, which copies every large literal once more
|
|
1333
|
+
readableObjectMode: true
|
|
1302
1334
|
});
|
|
1303
1335
|
this.writeSocket = writeSocket;
|
|
1304
1336
|
/* c8 ignore start */ // destroySoon override is never invoked by ImapFlow (close() calls destroy()); kept for stream API completeness
|
|
@@ -1426,9 +1458,7 @@ export class ImapFlow extends EventEmitter {
|
|
|
1426
1458
|
// socket; injection that still races in afterwards corrupts the TLS handshake and
|
|
1427
1459
|
// is rejected there instead (with a generic TLS error rather than STARTTLS_INJECTION).
|
|
1428
1460
|
const failSTARTTLSInjection = () => {
|
|
1429
|
-
let err =
|
|
1430
|
-
err.code = 'STARTTLS_INJECTION';
|
|
1431
|
-
err.tlsFailed = true;
|
|
1461
|
+
let err = createImapError('Server sent data after the STARTTLS response and before the TLS handshake; possible plaintext-injection attack', 'STARTTLS_INJECTION', { tlsFailed: true });
|
|
1432
1462
|
this.closeAfter();
|
|
1433
1463
|
return err;
|
|
1434
1464
|
};
|
|
@@ -1471,6 +1501,13 @@ export class ImapFlow extends EventEmitter {
|
|
|
1471
1501
|
// socket event cannot re-enter an already settled upgrade or leave state behind.
|
|
1472
1502
|
const settle = (err, result) => {
|
|
1473
1503
|
if (settled) {
|
|
1504
|
+
// A failed handshake can produce more than one error (Bun emits ECONNRESET on
|
|
1505
|
+
// the TLS socket after the one that settled the upgrade). settle() stays the
|
|
1506
|
+
// error listener of both sockets until they are torn down, so later errors
|
|
1507
|
+
// end up here instead of being thrown as unhandled 'error' events.
|
|
1508
|
+
if (err) {
|
|
1509
|
+
this.log.debug({ msg: 'Socket error after the TLS upgrade was settled', err, cid: this.id });
|
|
1510
|
+
}
|
|
1474
1511
|
return;
|
|
1475
1512
|
}
|
|
1476
1513
|
settled = true;
|
|
@@ -1478,9 +1515,12 @@ export class ImapFlow extends EventEmitter {
|
|
|
1478
1515
|
this.upgradeTimeout = null;
|
|
1479
1516
|
this.upgrading = false;
|
|
1480
1517
|
this._upgradeReject = null;
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1518
|
+
if (!err) {
|
|
1519
|
+
// the generic socket handlers took over in the success callback
|
|
1520
|
+
socketPlain.removeListener('error', settle);
|
|
1521
|
+
if (this.socket && this.socket !== socketPlain) {
|
|
1522
|
+
this.socket.removeListener('error', settle);
|
|
1523
|
+
}
|
|
1484
1524
|
}
|
|
1485
1525
|
if (err) {
|
|
1486
1526
|
clearTimer(this.connectTimeout);
|
|
@@ -1498,11 +1538,10 @@ export class ImapFlow extends EventEmitter {
|
|
|
1498
1538
|
// one function, one settlement, and removeListener() in settle() needs no separate
|
|
1499
1539
|
// handler references. A TLS handshake failure (bad certificate, protocol mismatch)
|
|
1500
1540
|
// is emitted on the new TLS socket rather than on the plain one, so both are covered.
|
|
1501
|
-
socketPlain.
|
|
1541
|
+
socketPlain.on('error', settle);
|
|
1502
1542
|
/* c8 ignore start */ // UPGRADE_TIMEOUT is 10s; firing it deterministically would make the test suite hang
|
|
1503
1543
|
this.upgradeTimeout = setTimeout(() => {
|
|
1504
|
-
let err =
|
|
1505
|
-
err.code = 'UPGRADE_TIMEOUT';
|
|
1544
|
+
let err = createImapError('Failed to upgrade connection in required time', 'UPGRADE_TIMEOUT');
|
|
1506
1545
|
settle(err);
|
|
1507
1546
|
}, UPGRADE_TIMEOUT);
|
|
1508
1547
|
/* c8 ignore stop */
|
|
@@ -1576,7 +1615,7 @@ export class ImapFlow extends EventEmitter {
|
|
|
1576
1615
|
// error listener during the handshake window; the generic handlers are installed
|
|
1577
1616
|
// by setSocketHandlers() inside the success callback above, so a handshake error
|
|
1578
1617
|
// has a single error path.
|
|
1579
|
-
tlsSocket.
|
|
1618
|
+
tlsSocket.on('error', settle);
|
|
1580
1619
|
this.writeSocket = tlsSocket;
|
|
1581
1620
|
});
|
|
1582
1621
|
if (upgraded) {
|
|
@@ -2006,9 +2045,7 @@ export class ImapFlow extends EventEmitter {
|
|
|
2006
2045
|
async connect() {
|
|
2007
2046
|
if (this._connectCalled) {
|
|
2008
2047
|
// Prevent re-using ImapFlow instances by allowing to call connect just once.
|
|
2009
|
-
|
|
2010
|
-
err.code = 'InstanceReused';
|
|
2011
|
-
throw err;
|
|
2048
|
+
throw createImapError('Can not re-use ImapFlow instance', 'InstanceReused');
|
|
2012
2049
|
}
|
|
2013
2050
|
this._connectCalled = true;
|
|
2014
2051
|
let closedError = () => this.createNoConnectionError(this.byeReason, { rejectedFrom: 'connect' });
|
|
@@ -2096,14 +2133,14 @@ export class ImapFlow extends EventEmitter {
|
|
|
2096
2133
|
detachEarlyErrorHandler(socket);
|
|
2097
2134
|
this.configureSocket(this.socket);
|
|
2098
2135
|
this.greetingTimeout = setTimeout(() => {
|
|
2099
|
-
let err =
|
|
2136
|
+
let err = createImapError(
|
|
2100
2137
|
/* c8 ignore next */ // the greeting-timeout test uses a plaintext socket; the secure-socket branch of this hint is not separately exercised
|
|
2101
|
-
`Failed to receive greeting from server in required time${!this.secureConnection ? '. Maybe should use TLS?' : ''}
|
|
2102
|
-
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
|
|
2106
|
-
};
|
|
2138
|
+
`Failed to receive greeting from server in required time${!this.secureConnection ? '. Maybe should use TLS?' : ''}`, 'GREETING_TIMEOUT', {
|
|
2139
|
+
details: {
|
|
2140
|
+
/* c8 ignore next */ // firing the timeout with the default (large) value would hang the suite, so only the explicit-option path is tested
|
|
2141
|
+
greetingTimeout: this.options.greetingTimeout || GREETING_TIMEOUT
|
|
2142
|
+
}
|
|
2143
|
+
});
|
|
2107
2144
|
this.log.error({ err, cid: this.id });
|
|
2108
2145
|
this.closeAfter();
|
|
2109
2146
|
reject(err);
|
|
@@ -2327,9 +2364,9 @@ export class ImapFlow extends EventEmitter {
|
|
|
2327
2364
|
let reject = this.initialReject;
|
|
2328
2365
|
this.initialResolve = false;
|
|
2329
2366
|
this.initialReject = false;
|
|
2330
|
-
let err =
|
|
2367
|
+
let err = createImapError('Unexpected close',
|
|
2331
2368
|
/* c8 ignore next */ // closing a pending connect over an already-secure socket (the TLS branch) is not separately exercised
|
|
2332
|
-
|
|
2369
|
+
this.secureConnection ? 'ClosedAfterConnectTLS' : 'ClosedAfterConnectText');
|
|
2333
2370
|
// Surface the server's BYE reason (e.g. "Too many connections") when the
|
|
2334
2371
|
// connection was closed by an untagged BYE, so the caller sees why.
|
|
2335
2372
|
if (this.byeReason) {
|
|
@@ -2840,7 +2877,7 @@ export class ImapFlow extends EventEmitter {
|
|
|
2840
2877
|
* Appends a new message to a mailbox
|
|
2841
2878
|
*
|
|
2842
2879
|
* @param path Mailbox path to upload the message to (unicode string). If value is an array then it is joined using current delimiter symbols. Namespace prefix is added automatically if required.
|
|
2843
|
-
* @param content RFC822 formatted email message
|
|
2880
|
+
* @param content RFC822 formatted email message, as a Buffer, Uint8Array or string
|
|
2844
2881
|
* @param flags an array of flags to be set for the uploaded message
|
|
2845
2882
|
* @param idate internal date to be set for the message
|
|
2846
2883
|
* @returns info about uploaded message
|
|
@@ -3111,7 +3148,21 @@ export class ImapFlow extends EventEmitter {
|
|
|
3111
3148
|
if (!response || !response.list || !response.list.length) {
|
|
3112
3149
|
return false;
|
|
3113
3150
|
}
|
|
3114
|
-
|
|
3151
|
+
// Every FETCH row that arrived during the command is in the list, also unsolicited ones
|
|
3152
|
+
// for other messages or with only a flag change, and a server may split the answer for
|
|
3153
|
+
// one message over several rows. Taking the first row returned a flag update instead
|
|
3154
|
+
// of the requested data, which ended a download after its first chunk (issue #426).
|
|
3155
|
+
let rows = response.list;
|
|
3156
|
+
let requested = parseUintValue(String(seq), MAX_UINT32_DIGITS);
|
|
3157
|
+
// a range: the first message of the answer, as before
|
|
3158
|
+
let target = requested === false ? rows[0] : rows.find(row => (options && options.uid ? row.uid : row.seq) === requested);
|
|
3159
|
+
if (!target) {
|
|
3160
|
+
return false;
|
|
3161
|
+
}
|
|
3162
|
+
// rows of the same message, without the ones a malformed answer gives no usable
|
|
3163
|
+
// sequence number or another UID
|
|
3164
|
+
let { seq: targetSeq, uid: targetUid } = target;
|
|
3165
|
+
return targetSeq ? mergeFetchRows(rows.filter(row => row.seq === targetSeq && (!row.uid || !targetUid || row.uid === targetUid))) : target;
|
|
3115
3166
|
}
|
|
3116
3167
|
/**
|
|
3117
3168
|
* Download either full rfc822 formatted message or a specific bodystructure part as a Stream.
|
|
@@ -3128,7 +3179,8 @@ export class ImapFlow extends EventEmitter {
|
|
|
3128
3179
|
* // download body part nr '1.2' from latest message
|
|
3129
3180
|
* let download = await client.download('*', '1.2');
|
|
3130
3181
|
* if (download.content) {
|
|
3131
|
-
* download.
|
|
3182
|
+
* // pipeline() rejects when the download fails, a plain .pipe() would not report it
|
|
3183
|
+
* await stream.promises.pipeline(download.content, fs.createWriteStream(download.meta.filename));
|
|
3132
3184
|
* }
|
|
3133
3185
|
*/
|
|
3134
3186
|
async download(range, part, options) {
|
|
@@ -3465,9 +3517,7 @@ export class ImapFlow extends EventEmitter {
|
|
|
3465
3517
|
const idx = this.locks.indexOf(lockEntry);
|
|
3466
3518
|
if (idx !== -1) {
|
|
3467
3519
|
this.locks.splice(idx, 1);
|
|
3468
|
-
let err =
|
|
3469
|
-
err.code = 'LockTimeout';
|
|
3470
|
-
err.lockId = lockEntry.lockId;
|
|
3520
|
+
let err = createImapError('Timed out waiting for mailbox lock', 'LockTimeout', { lockId: lockEntry.lockId });
|
|
3471
3521
|
reject(err);
|
|
3472
3522
|
}
|
|
3473
3523
|
}, Number(lockOptions.acquireTimeout));
|
|
@@ -4,6 +4,7 @@ import net from 'node:net';
|
|
|
4
4
|
import tls from 'node:tls';
|
|
5
5
|
import { ConnectionDeadline } from './connection-deadline.js';
|
|
6
6
|
import { clearTimer } from './tools.js';
|
|
7
|
+
import { createImapError } from './errors.js';
|
|
7
8
|
// Cap the CONNECT response buffered before the header terminator, so a proxy that never sends
|
|
8
9
|
// \r\n\r\n cannot grow memory without bound.
|
|
9
10
|
const MAX_RESPONSE_HEADER_BYTES = 64 * 1024;
|
|
@@ -27,11 +28,7 @@ const redactUrl = (proxyUrl) => {
|
|
|
27
28
|
}
|
|
28
29
|
return redacted.href;
|
|
29
30
|
};
|
|
30
|
-
const proxyError = (message, code) =>
|
|
31
|
-
let err = new Error(message);
|
|
32
|
-
err.code = code || 'ProxyError';
|
|
33
|
-
return err;
|
|
34
|
-
};
|
|
31
|
+
const proxyError = (message, code) => createImapError(message, code || 'ProxyError');
|
|
35
32
|
// URL userinfo is percent-encoded, so it has to be decoded before it can be used as credentials.
|
|
36
33
|
// A password containing a bare '%' is not valid percent-encoding and makes decodeURIComponent
|
|
37
34
|
// throw, so such values are used as they came in rather than failing the connection.
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/* eslint no-control-regex:0 */
|
|
2
2
|
import { formatDate, formatFlag, toValidDate, isRev2Active } from './tools.js';
|
|
3
|
+
import { createImapError } from './errors.js';
|
|
3
4
|
// Matches any character outside the ASCII range
|
|
4
5
|
const UNICODE_PATTERN = /[^\x00-\x7F]/;
|
|
5
6
|
/**
|
|
@@ -101,9 +102,7 @@ let processDateField = (attributes, term, value) => {
|
|
|
101
102
|
* @param message - Error message
|
|
102
103
|
*/
|
|
103
104
|
let fail = (code, message) => {
|
|
104
|
-
|
|
105
|
-
error.code = code;
|
|
106
|
-
throw error;
|
|
105
|
+
throw createImapError(message, code);
|
|
107
106
|
};
|
|
108
107
|
/**
|
|
109
108
|
* Checks whether any search value was compiled into a literal, which only
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Transform } from 'node:stream';
|
|
2
2
|
import type { ImapFlow } from './imap-flow.js';
|
|
3
|
-
import { type ConnectionErrorSite, type ImapFlowError } from './errors.js';
|
|
3
|
+
import { ImapFlowErrorCode, type ConnectionErrorSite, type ImapFlowError } from './errors.js';
|
|
4
4
|
import type { ImapAttributeList, ImapAttributeNode, ImapResponse } from './handler/types.js';
|
|
5
5
|
import type { FetchMessageObject, ListResponse, ListTreeResponse, MailboxObject, MessageEnvelopeObject, MessageStructureObject, ImapFlowEvents, StatusQuery } from './types.js';
|
|
6
6
|
export { AuthenticationFailure } from './errors.js';
|
|
@@ -33,7 +33,7 @@ export type CharsetDecoder = Transform & {
|
|
|
33
33
|
* @param meta - Fields to stamp on the error
|
|
34
34
|
* @returns The stamped error
|
|
35
35
|
*/
|
|
36
|
-
export declare function buildConnectionError(cid: string, code:
|
|
36
|
+
export declare function buildConnectionError(cid: string, code: ImapFlowErrorCode, message: string, meta?: ConnectionErrorSite | undefined): ImapFlowError;
|
|
37
37
|
/**
|
|
38
38
|
* Re-stamps an existing connection error for a different rejection site.
|
|
39
39
|
*
|
|
@@ -122,9 +122,12 @@ export declare function logConnectionError(connection: ImapFlow, msg: string, er
|
|
|
122
122
|
/**
|
|
123
123
|
* Whether a command failed because the server answered it with a tagged NO or BAD, as opposed
|
|
124
124
|
* to a lost connection, a timeout or a local failure that says nothing about the server's answer.
|
|
125
|
+
* A throttled command (ETHROTTLE, Microsoft 365 answers it with BAD) was not refused: the server
|
|
126
|
+
* asks to try again later, so a throttled login is not a rejected credential and a throttled
|
|
127
|
+
* IDLE does not mean the server lacks IDLE.
|
|
125
128
|
*
|
|
126
129
|
* @param err - The error the command failed with
|
|
127
|
-
* @returns True for a tagged NO or BAD
|
|
130
|
+
* @returns True for a tagged NO or BAD that is not throttling
|
|
128
131
|
*/
|
|
129
132
|
export declare function isServerRefusal(err: ImapFlowError | null | undefined): boolean;
|
|
130
133
|
/**
|
|
@@ -287,6 +290,16 @@ export declare function getColorFlags(color: string | null | undefined): {
|
|
|
287
290
|
add: string[];
|
|
288
291
|
remove: string[];
|
|
289
292
|
} | null;
|
|
293
|
+
/**
|
|
294
|
+
* Merges the FETCH rows a server sent for one message into one message object. A server may
|
|
295
|
+
* split the data items of a message over several FETCH responses, and may put an unsolicited
|
|
296
|
+
* one (a flag change made by another session) in between (RFC 9051 sections 7.5.2 and 5.2).
|
|
297
|
+
* Later rows win for single values, bodyParts, binaryParts and partialOrigins are combined.
|
|
298
|
+
*
|
|
299
|
+
* @param rows - Formatted rows of the same message, in the order they arrived
|
|
300
|
+
* @returns One message object holding the data of every row
|
|
301
|
+
*/
|
|
302
|
+
export declare function mergeFetchRows(rows: FetchMessageObject[]): FetchMessageObject;
|
|
290
303
|
/**
|
|
291
304
|
* Formats a raw untagged FETCH response into a structured message object.
|
|
292
305
|
*
|
|
@@ -423,6 +436,14 @@ export declare function isUnsafeKey(key: unknown): boolean;
|
|
|
423
436
|
* @returns The string values, in order, with unusable entries dropped.
|
|
424
437
|
*/
|
|
425
438
|
export declare function getStringList(list: unknown): string[];
|
|
439
|
+
/**
|
|
440
|
+
* Reads the text of a string value from a response. A server may send any string as a literal,
|
|
441
|
+
* which arrives as a Buffer and is decoded as UTF-8.
|
|
442
|
+
*
|
|
443
|
+
* @param attribute - Parsed attribute from a response
|
|
444
|
+
* @returns The string, or undefined when the attribute holds no string (NIL, a list)
|
|
445
|
+
*/
|
|
446
|
+
export declare function getStringValue(attribute: unknown): string | undefined;
|
|
426
447
|
/**
|
|
427
448
|
* Parses an untrusted decimal value from a server response into a BigInt.
|
|
428
449
|
*
|