@withbuddi/buddi 0.1.0-pre.50 → 0.1.0-pre.52
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/cli/dist/commands.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/commands.js +11 -1
- package/node_modules/@buddi/cli/dist/commands.js.map +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/registry.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/registry.js +11 -2
- package/node_modules/@buddi/core/dist/registry.js.map +1 -1
- package/node_modules/@buddi/core/dist/scheduler/index.d.ts +1 -0
- package/node_modules/@buddi/core/dist/scheduler/index.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/scheduler/index.js +1 -0
- package/node_modules/@buddi/core/dist/scheduler/index.js.map +1 -1
- package/node_modules/@buddi/core/dist/scheduler/manual.d.ts +50 -0
- package/node_modules/@buddi/core/dist/scheduler/manual.d.ts.map +1 -0
- package/node_modules/@buddi/core/dist/scheduler/manual.js +73 -0
- package/node_modules/@buddi/core/dist/scheduler/manual.js.map +1 -0
- 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/mcp/requests.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/mcp/requests.js +9 -1
- package/node_modules/@buddi/gateway/dist/mcp/requests.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/missions/reminders.d.ts +7 -2
- package/node_modules/@buddi/gateway/dist/missions/reminders.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/missions/reminders.js +27 -9
- package/node_modules/@buddi/gateway/dist/missions/reminders.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/missions/run-now.d.ts +38 -0
- package/node_modules/@buddi/gateway/dist/missions/run-now.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/missions/run-now.js +62 -0
- package/node_modules/@buddi/gateway/dist/missions/run-now.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/missions-cli.d.ts +1 -1
- package/node_modules/@buddi/gateway/dist/missions-cli.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/missions-cli.js +21 -10
- package/node_modules/@buddi/gateway/dist/missions-cli.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/serve.d.ts +3 -12
- package/node_modules/@buddi/gateway/dist/serve.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/serve.js +2 -21
- package/node_modules/@buddi/gateway/dist/serve.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 +16 -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/read.d.ts +2 -0
- package/node_modules/@buddi/gateway/dist/web/read.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/read.js +2 -1
- package/node_modules/@buddi/gateway/dist/web/read.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 +76 -4
- package/node_modules/@buddi/gateway/dist/web/server.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/write.d.ts +14 -0
- package/node_modules/@buddi/gateway/dist/web/write.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/write.js +21 -0
- package/node_modules/@buddi/gateway/dist/web/write.js.map +1 -1
- package/node_modules/@buddi/install/dist/.tsbuildinfo +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/runtime/dist/codex-direct.d.ts +1 -1
- package/node_modules/@buddi/runtime/dist/codex-direct.js +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/imapflow/CHANGELOG.md +30 -0
- package/node_modules/imapflow/dist/cjs/commands/authenticate.js +15 -4
- package/node_modules/imapflow/dist/cjs/commands/enable.js +6 -0
- package/node_modules/imapflow/dist/cjs/commands/fetch.js +22 -5
- 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/store.js +7 -6
- package/node_modules/imapflow/dist/cjs/download.js +139 -5
- package/node_modules/imapflow/dist/cjs/imap-flow.d.ts +2 -2
- package/node_modules/imapflow/dist/cjs/imap-flow.js +51 -12
- 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/search-compiler.js +6 -3
- package/node_modules/imapflow/dist/cjs/tools.d.ts +14 -3
- package/node_modules/imapflow/dist/cjs/tools.js +68 -6
- package/node_modules/imapflow/dist/cjs/types.d.ts +9 -1
- package/node_modules/imapflow/dist/esm/commands/authenticate.js +15 -4
- package/node_modules/imapflow/dist/esm/commands/enable.js +6 -0
- package/node_modules/imapflow/dist/esm/commands/fetch.js +22 -5
- 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/store.js +8 -7
- package/node_modules/imapflow/dist/esm/download.js +139 -5
- package/node_modules/imapflow/dist/esm/imap-flow.d.ts +2 -2
- package/node_modules/imapflow/dist/esm/imap-flow.js +52 -13
- 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/search-compiler.js +6 -3
- package/node_modules/imapflow/dist/esm/tools.d.ts +14 -3
- package/node_modules/imapflow/dist/esm/tools.js +67 -6
- package/node_modules/imapflow/dist/esm/types.d.ts +9 -1
- package/node_modules/imapflow/package.json +5 -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/package.json +2 -2
- package/packages/cli/dist/.tsbuildinfo +1 -1
- package/packages/cli/dist/commands.d.ts.map +1 -1
- package/packages/cli/dist/commands.js +11 -1
- package/packages/cli/dist/commands.js.map +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/registry.d.ts.map +1 -1
- package/packages/core/dist/registry.js +11 -2
- package/packages/core/dist/registry.js.map +1 -1
- package/packages/core/dist/scheduler/index.d.ts +1 -0
- package/packages/core/dist/scheduler/index.d.ts.map +1 -1
- package/packages/core/dist/scheduler/index.js +1 -0
- package/packages/core/dist/scheduler/index.js.map +1 -1
- package/packages/core/dist/scheduler/manual.d.ts +50 -0
- package/packages/core/dist/scheduler/manual.d.ts.map +1 -0
- package/packages/core/dist/scheduler/manual.js +73 -0
- package/packages/core/dist/scheduler/manual.js.map +1 -0
- 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/mcp/requests.d.ts.map +1 -1
- package/packages/gateway/dist/mcp/requests.js +9 -1
- package/packages/gateway/dist/mcp/requests.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/missions/reminders.d.ts +7 -2
- package/packages/gateway/dist/missions/reminders.d.ts.map +1 -1
- package/packages/gateway/dist/missions/reminders.js +27 -9
- package/packages/gateway/dist/missions/reminders.js.map +1 -1
- package/packages/gateway/dist/missions/run-now.d.ts +38 -0
- package/packages/gateway/dist/missions/run-now.d.ts.map +1 -0
- package/packages/gateway/dist/missions/run-now.js +62 -0
- package/packages/gateway/dist/missions/run-now.js.map +1 -0
- package/packages/gateway/dist/missions-cli.d.ts +1 -1
- package/packages/gateway/dist/missions-cli.d.ts.map +1 -1
- package/packages/gateway/dist/missions-cli.js +21 -10
- package/packages/gateway/dist/missions-cli.js.map +1 -1
- package/packages/gateway/dist/serve.d.ts +3 -12
- package/packages/gateway/dist/serve.d.ts.map +1 -1
- package/packages/gateway/dist/serve.js +2 -21
- package/packages/gateway/dist/serve.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 +16 -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/read.d.ts +2 -0
- package/packages/gateway/dist/web/read.d.ts.map +1 -1
- package/packages/gateway/dist/web/read.js +2 -1
- package/packages/gateway/dist/web/read.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 +76 -4
- package/packages/gateway/dist/web/server.js.map +1 -1
- package/packages/gateway/dist/web/write.d.ts +14 -0
- package/packages/gateway/dist/web/write.d.ts.map +1 -1
- package/packages/gateway/dist/web/write.js +21 -0
- package/packages/gateway/dist/web/write.js.map +1 -1
- package/packages/install/dist/.tsbuildinfo +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/runtime/dist/codex-direct.d.ts +1 -1
- package/packages/runtime/dist/codex-direct.js +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-oxmxR39o.js +155 -0
- package/packages/web/dist/assets/index-rMRjibNI.css +1 -0
- package/packages/web/dist/assets/{lottie_light-BJaxbmZQ.js → lottie_light-DROBTM6Y.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/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-DBVZzTau.css +0 -1
- package/packages/web/dist/assets/index-DqoP9iYJ.js +0 -155
|
@@ -46,6 +46,12 @@ export default async function enable(connection, extensionList) {
|
|
|
46
46
|
// extensions enabled by this command (RFC 5161), so a replace would drop
|
|
47
47
|
// grants from an earlier ENABLE call
|
|
48
48
|
connection.enabled = new Set([...connection.enabled, ...enabled]);
|
|
49
|
+
if (connection.enabled.has('QRESYNC')) {
|
|
50
|
+
// ENABLE QRESYNC is a CONDSTORE enabling command (RFC 7162 3.2.3), whether or not the
|
|
51
|
+
// server lists CONDSTORE in its ENABLED answer. Apache James advertises only QRESYNC
|
|
52
|
+
// and leaves a lone ENABLE CONDSTORE unanswered, which the RFC allows.
|
|
53
|
+
connection.enabled.add('CONDSTORE');
|
|
54
|
+
}
|
|
49
55
|
response.next();
|
|
50
56
|
return connection.enabled;
|
|
51
57
|
}
|
|
@@ -62,13 +62,30 @@ export default async function fetch(connection, range, query, options) {
|
|
|
62
62
|
};
|
|
63
63
|
queryStructure.push(bodyPeek);
|
|
64
64
|
};
|
|
65
|
-
//
|
|
66
|
-
|
|
67
|
-
|
|
65
|
+
// The ALL, FAST and FULL macros may only be sent on their own, never in a list with other
|
|
66
|
+
// items (RFC 3501 section 9), and UID is always in the list, so they are expanded into
|
|
67
|
+
// the items they stand for. FULL is expanded to BODYSTRUCTURE rather than the
|
|
68
|
+
// non-extensible BODY, as documented for the full option.
|
|
69
|
+
let full = !!query.full;
|
|
70
|
+
let all = !!query.all || full;
|
|
71
|
+
let fast = !!query.fast || all;
|
|
72
|
+
let items = {
|
|
73
|
+
flags: query.flags || fast,
|
|
74
|
+
internalDate: query.internalDate || fast,
|
|
75
|
+
size: query.size || fast,
|
|
76
|
+
envelope: query.envelope || all,
|
|
77
|
+
bodyStructure: query.bodyStructure || full
|
|
78
|
+
};
|
|
79
|
+
// standard data items map directly to IMAP atoms
|
|
80
|
+
if (query.uid) {
|
|
81
|
+
queryStructure.push({ type: 'ATOM', value: 'UID' });
|
|
82
|
+
}
|
|
83
|
+
['flags', 'bodyStructure', 'envelope', 'internalDate'].forEach(key => {
|
|
84
|
+
if (items[key]) {
|
|
68
85
|
queryStructure.push({ type: 'ATOM', value: key.toUpperCase() });
|
|
69
86
|
}
|
|
70
87
|
});
|
|
71
|
-
if (
|
|
88
|
+
if (items.size) {
|
|
72
89
|
queryStructure.push({ type: 'ATOM', value: 'RFC822.SIZE' });
|
|
73
90
|
}
|
|
74
91
|
// Fetch full message source, optionally with byte range (start/maxLength)
|
|
@@ -191,7 +208,7 @@ export default async function fetch(connection, range, query, options) {
|
|
|
191
208
|
if (consumerError) {
|
|
192
209
|
return;
|
|
193
210
|
}
|
|
194
|
-
let formatted = await formatMessageResponse(untagged, mailbox, connection.idHashAlgorithm);
|
|
211
|
+
let formatted = await formatMessageResponse(untagged, mailbox, connection.idHashAlgorithm, connection);
|
|
195
212
|
if (typeof options.onUntaggedFetch === 'function') {
|
|
196
213
|
/* c8 ignore next */ // a UID FETCH row without its UID is a non-compliant server, so the seq fallback is not exercised
|
|
197
214
|
let key = options.uid ? formatted.uid || formatted.seq : formatted.seq;
|
|
@@ -1,24 +1,13 @@
|
|
|
1
1
|
import type { ImapFlow } from '../imap-flow.js';
|
|
2
2
|
import type { MailboxObject, MailboxOpenOptions } from '../types.js';
|
|
3
|
-
/**
|
|
4
|
-
|
|
5
|
-
* parameters, which are only honored when the QRESYNC extension has been enabled
|
|
6
|
-
*/
|
|
7
|
-
export interface SelectOptions extends MailboxOpenOptions {
|
|
8
|
-
/** QRESYNC modseq value to fetch changes since */
|
|
9
|
-
changedSince?: bigint | number | string | undefined;
|
|
10
|
-
/** QRESYNC UID validity value */
|
|
11
|
-
uidValidity?: bigint | number | string | undefined;
|
|
12
|
-
}
|
|
3
|
+
/** SELECT/EXAMINE options, the QRESYNC parameters are part of the public mailboxOpen() options */
|
|
4
|
+
export type SelectOptions = MailboxOpenOptions;
|
|
13
5
|
/**
|
|
14
6
|
* Selects or examines a mailbox, making it the current mailbox for subsequent operations.
|
|
15
7
|
*
|
|
16
8
|
* @param connection - IMAP connection instance
|
|
17
9
|
* @param path - Mailbox path to select
|
|
18
|
-
* @param options - Select options
|
|
19
|
-
* @param options.readOnly - If true, use EXAMINE instead of SELECT (read-only access)
|
|
20
|
-
* @param options.changedSince - QRESYNC modseq value to fetch changes since
|
|
21
|
-
* @param options.uidValidity - QRESYNC UID validity value
|
|
10
|
+
* @param options - Select options, see MailboxOpenOptions
|
|
22
11
|
* @returns Mailbox info object with path, flags, exists, uidNext, uidValidity, highestModseq, etc., or undefined if preconditions not met
|
|
23
12
|
* @throws If the SELECT/EXAMINE command fails
|
|
24
13
|
*/
|
|
@@ -48,10 +48,7 @@ const VALUED_RESPONSE_CODES = Object.assign(Object.create(null), {
|
|
|
48
48
|
*
|
|
49
49
|
* @param connection - IMAP connection instance
|
|
50
50
|
* @param path - Mailbox path to select
|
|
51
|
-
* @param options - Select options
|
|
52
|
-
* @param options.readOnly - If true, use EXAMINE instead of SELECT (read-only access)
|
|
53
|
-
* @param options.changedSince - QRESYNC modseq value to fetch changes since
|
|
54
|
-
* @param options.uidValidity - QRESYNC UID validity value
|
|
51
|
+
* @param options - Select options, see MailboxOpenOptions
|
|
55
52
|
* @returns Mailbox info object with path, flags, exists, uidNext, uidValidity, highestModseq, etc., or undefined if preconditions not met
|
|
56
53
|
* @throws If the SELECT/EXAMINE command fails
|
|
57
54
|
*/
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { formatFlag, canUseFlag, reportCommandError, getSelectedMailbox } from '../tools.js';
|
|
1
|
+
import { formatFlag, canUseFlag, encodePath, reportCommandError, getSelectedMailbox } from '../tools.js';
|
|
2
2
|
/**
|
|
3
3
|
* Updates flags or labels for messages in the selected mailbox.
|
|
4
4
|
*
|
|
@@ -58,7 +58,10 @@ export default async function store(connection, range, flags, options) {
|
|
|
58
58
|
const dropped = [];
|
|
59
59
|
flags = (Array.isArray(flags) ? flags : [].concat(flags || []))
|
|
60
60
|
.map(flag => {
|
|
61
|
-
|
|
61
|
+
// Gmail labels other than the \-prefixed system labels are mailbox names: astrings in
|
|
62
|
+
// the form mailbox names take on the session (modified UTF-7 unless UTF-8 is enabled),
|
|
63
|
+
// not atoms like IMAP keywords
|
|
64
|
+
let formatted = options.useLabels && flag && flag.charAt(0) !== '\\' ? encodePath(connection, flag) : formatFlag(flag);
|
|
62
65
|
if (!formatted || (!canUseFlag(flagSource, formatted) && operationName !== 'remove')) {
|
|
63
66
|
dropped.push(flag);
|
|
64
67
|
return false;
|
|
@@ -80,13 +83,10 @@ export default async function store(connection, range, flags, options) {
|
|
|
80
83
|
if (!flags.length && !clearAll) {
|
|
81
84
|
return false;
|
|
82
85
|
}
|
|
83
|
-
let attributes = [
|
|
84
|
-
{ type: 'SEQUENCE', value: range },
|
|
85
|
-
{ type: 'ATOM', value: operation },
|
|
86
|
-
flags.map(flag => ({ type: 'ATOM', value: flag }))
|
|
87
|
-
];
|
|
86
|
+
let attributes = [{ type: 'SEQUENCE', value: range }];
|
|
88
87
|
// CONDSTORE (RFC 7162): UNCHANGEDSINCE modifier prevents updating messages whose
|
|
89
88
|
// mod-sequence is higher than the specified value, avoiding overwriting concurrent changes.
|
|
89
|
+
// The store-modifiers list goes between the sequence set and the item name (section 3.1.3).
|
|
90
90
|
if (options.unchangedSince && connection.enabled.has('CONDSTORE') && !mailbox.noModseq) {
|
|
91
91
|
attributes.push([
|
|
92
92
|
{
|
|
@@ -99,6 +99,7 @@ export default async function store(connection, range, flags, options) {
|
|
|
99
99
|
}
|
|
100
100
|
]);
|
|
101
101
|
}
|
|
102
|
+
attributes.push({ type: 'ATOM', value: operation }, flags.map(flag => ({ type: 'ATOM', value: flag })));
|
|
102
103
|
let response;
|
|
103
104
|
try {
|
|
104
105
|
response = await connection.exec(options.uid ? 'UID STORE' : 'STORE', attributes);
|
|
@@ -12,6 +12,113 @@ import { LimitedPassthrough, normalizeByteLimit } from './limited-passthrough.js
|
|
|
12
12
|
// away (a consumer destroying it closes it without a 'drain')
|
|
13
13
|
const DRAIN_WAIT_EVENTS = ['drain', 'error', 'close'];
|
|
14
14
|
import { getDecoder, isUnsafeKey } from './tools.js';
|
|
15
|
+
const isEmptySection = (value) => !value?.length;
|
|
16
|
+
/**
|
|
17
|
+
* The section to ask again when exactly one of a part's MIME headers and content came back
|
|
18
|
+
* empty (see refetchDroppedSections()), undefined when both or neither did
|
|
19
|
+
*/
|
|
20
|
+
const droppedSection = (mime, content, mimeRequest, contentRequest) => {
|
|
21
|
+
if (isEmptySection(mime) === isEmptySection(content)) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
return isEmptySection(content) ? contentRequest : mimeRequest;
|
|
25
|
+
};
|
|
26
|
+
/** Start offset of every partial section among the requests, keyed by section */
|
|
27
|
+
const partialStarts = (requests) => {
|
|
28
|
+
let starts = new Map();
|
|
29
|
+
for (let request of requests) {
|
|
30
|
+
if (typeof request !== 'string') {
|
|
31
|
+
starts.set(request.key, Number(request.start) || 0);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return starts;
|
|
35
|
+
};
|
|
36
|
+
// How many times a request is repeated after answers that belong to another request
|
|
37
|
+
const MAX_FOREIGN_ANSWERS = 3;
|
|
38
|
+
const requestedUid = (range, options) => options.uid && /^\d+$/.test(String(range)) ? Number(range) : undefined;
|
|
39
|
+
const isForeignAnswer = (response, expected) => {
|
|
40
|
+
if (expected.uid && response.uid && response.uid !== expected.uid) {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
for (let [key, start] of expected.origins) {
|
|
44
|
+
let origin = response.partialOrigins && response.partialOrigins.get(key);
|
|
45
|
+
// An answer without the origin is taken as is: some servers leave it out, and some
|
|
46
|
+
// ignore the partial specifier altogether
|
|
47
|
+
if (typeof origin === 'number' && origin !== start) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return false;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* fetchOne() that takes only an answer belonging to the request. Apache James now and then
|
|
55
|
+
* writes the head of a FETCH answer after its tagged OK, so the data of one request shows up
|
|
56
|
+
* within the answer to the next one. Taken at face value it would be the data of that next
|
|
57
|
+
* request, and a download would end without an error but with misplaced bytes. An answer for
|
|
58
|
+
* another UID, or with a partial section that starts at another offset than asked, is dropped
|
|
59
|
+
* and the request repeated.
|
|
60
|
+
*/
|
|
61
|
+
async function fetchExpected(client, range, query, options, expected) {
|
|
62
|
+
for (let attempt = 1;; attempt++) {
|
|
63
|
+
let response = await client.fetchOne(range, query, options);
|
|
64
|
+
if (!response || !isForeignAnswer(response, expected)) {
|
|
65
|
+
return response;
|
|
66
|
+
}
|
|
67
|
+
client.log.warn({
|
|
68
|
+
msg: 'Server answered with data of another request, asking again',
|
|
69
|
+
uid: response.uid,
|
|
70
|
+
origins: response.partialOrigins && Object.fromEntries(response.partialOrigins),
|
|
71
|
+
attempt,
|
|
72
|
+
cid: client.id
|
|
73
|
+
});
|
|
74
|
+
if (attempt >= MAX_FOREIGN_ANSWERS) {
|
|
75
|
+
let err = new Error('Server kept answering with data of another request');
|
|
76
|
+
err.code = 'DownloadIncomplete';
|
|
77
|
+
err.cid = client.id;
|
|
78
|
+
throw err;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Apache James (and the servers built on it, Twake Mail among them) answers only the first
|
|
84
|
+
* section it is asked for each MIME part of one FETCH and returns the other one empty:
|
|
85
|
+
* BODY[2.MIME] with BODY[2] yields the headers and a zero-length body, the reverse order loses
|
|
86
|
+
* the headers (FetchGroup.addPartContent() keeps the first descriptor for a part path). Asks the
|
|
87
|
+
* sections that came back empty again, in a FETCH of their own, and merges the answer into
|
|
88
|
+
* `response`. Callers only list a section whose companion did arrive, so a compliant server
|
|
89
|
+
* pays the extra round trip only for a part that really is empty.
|
|
90
|
+
*/
|
|
91
|
+
async function refetchDroppedSections(client, response, range, options, sections) {
|
|
92
|
+
if (!sections.length) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
client.log.debug({
|
|
96
|
+
msg: 'Server answered a body section empty while its companion section was not, asking it again separately',
|
|
97
|
+
sections: sections.map(section => (typeof section === 'string' ? section : section.key)),
|
|
98
|
+
cid: client.id
|
|
99
|
+
});
|
|
100
|
+
// the UID pins the message even when the first command addressed it by sequence number
|
|
101
|
+
let uid = response.uid;
|
|
102
|
+
let retry = await fetchExpected(client, uid || range, { uid: true, bodyParts: sections }, uid ? { ...options, uid: true } : options, {
|
|
103
|
+
uid,
|
|
104
|
+
origins: partialStarts(sections)
|
|
105
|
+
});
|
|
106
|
+
if (!retry) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (retry.headers) {
|
|
110
|
+
response.headers = retry.headers;
|
|
111
|
+
}
|
|
112
|
+
for (let [key, value] of retry.bodyParts || []) {
|
|
113
|
+
(response.bodyParts ??= new Map()).set(key, value);
|
|
114
|
+
if (retry.binaryParts && retry.binaryParts.has(key)) {
|
|
115
|
+
(response.binaryParts ??= new Set()).add(key);
|
|
116
|
+
}
|
|
117
|
+
else if (response.binaryParts) {
|
|
118
|
+
response.binaryParts.delete(key);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
15
122
|
/**
|
|
16
123
|
* Implements ImapFlow.download(), see its documentation
|
|
17
124
|
*
|
|
@@ -59,6 +166,7 @@ export async function downloadMessage(client, range, part, options) {
|
|
|
59
166
|
let getNextPart = async (query) => {
|
|
60
167
|
query = query || {};
|
|
61
168
|
let mimeKey;
|
|
169
|
+
let contentRequest;
|
|
62
170
|
if (!part) {
|
|
63
171
|
query.source = {
|
|
64
172
|
start: processed,
|
|
@@ -81,13 +189,18 @@ export async function downloadMessage(client, range, part, options) {
|
|
|
81
189
|
query.bodyParts.push(mimeKey);
|
|
82
190
|
}
|
|
83
191
|
}
|
|
84
|
-
|
|
192
|
+
contentRequest = {
|
|
85
193
|
key: part,
|
|
86
194
|
start: processed,
|
|
87
195
|
maxLength: chunkSize
|
|
88
|
-
}
|
|
196
|
+
};
|
|
197
|
+
query.bodyParts.push(contentRequest);
|
|
89
198
|
}
|
|
90
|
-
let
|
|
199
|
+
let expected = {
|
|
200
|
+
uid: uid || requestedUid(range, downloadOptions),
|
|
201
|
+
origins: new Map([[part || '', processed]])
|
|
202
|
+
};
|
|
203
|
+
let response = await fetchExpected(client, range, query, downloadOptions, expected);
|
|
91
204
|
if (!response) {
|
|
92
205
|
return { response: false, chunk: false };
|
|
93
206
|
}
|
|
@@ -97,6 +210,12 @@ export async function downloadMessage(client, range, part, options) {
|
|
|
97
210
|
range = uid;
|
|
98
211
|
downloadOptions.uid = true;
|
|
99
212
|
}
|
|
213
|
+
if (mimeKey && contentRequest) {
|
|
214
|
+
let dropped = droppedSection(mimeKey === 'header' ? response.headers : response.bodyParts?.get(mimeKey), response.bodyParts?.get(part), mimeKey, contentRequest);
|
|
215
|
+
if (dropped) {
|
|
216
|
+
await refetchDroppedSections(client, response, range, downloadOptions, [dropped]);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
100
219
|
let chunk = !part ? response.source : response.bodyParts && response.bodyParts.get(part);
|
|
101
220
|
if (!chunk) {
|
|
102
221
|
return {};
|
|
@@ -451,16 +570,31 @@ export async function downloadMessageParts(client, range, parts, options) {
|
|
|
451
570
|
// again on the answer for servers that ignore the partial specifier
|
|
452
571
|
let maxBytes = normalizeByteLimit(downloadOptions.maxBytes);
|
|
453
572
|
let query = { bodyParts: [] };
|
|
573
|
+
let contentRequests = new Map();
|
|
454
574
|
for (let part of parts) {
|
|
455
575
|
query.bodyParts.push(part + '.mime');
|
|
456
576
|
// The partial specifier carries a 32-bit length (RFC 9051 "number"), so a cap beyond
|
|
457
577
|
// that is applied on the answer alone
|
|
458
|
-
|
|
578
|
+
let contentRequest = maxBytes > 0xffffffff ? part : { key: part, start: 0, maxLength: maxBytes };
|
|
579
|
+
contentRequests.set(part, contentRequest);
|
|
580
|
+
query.bodyParts.push(contentRequest);
|
|
459
581
|
}
|
|
460
|
-
let response = await client
|
|
582
|
+
let response = await fetchExpected(client, range, query, downloadOptions, {
|
|
583
|
+
uid: requestedUid(range, downloadOptions),
|
|
584
|
+
origins: partialStarts(query.bodyParts)
|
|
585
|
+
});
|
|
461
586
|
if (!response || !response.bodyParts) {
|
|
462
587
|
return {};
|
|
463
588
|
}
|
|
589
|
+
let dropped = [];
|
|
590
|
+
for (let [part, contentRequest] of contentRequests) {
|
|
591
|
+
let section = droppedSection(response.bodyParts.get(part + '.mime'), response.bodyParts.get(part), part + '.mime', contentRequest);
|
|
592
|
+
if (section) {
|
|
593
|
+
dropped.push(section);
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
// Sections of different parts do not collide, so every dropped one fits in one FETCH
|
|
597
|
+
await refetchDroppedSections(client, response, range, downloadOptions, dropped);
|
|
464
598
|
let data = {};
|
|
465
599
|
for (let [part, content] of response.bodyParts) {
|
|
466
600
|
let keyParts = part.split('.mime');
|
|
@@ -122,8 +122,8 @@ export declare class ImapFlow extends EventEmitter {
|
|
|
122
122
|
*/
|
|
123
123
|
usable: boolean;
|
|
124
124
|
/**
|
|
125
|
-
*
|
|
126
|
-
*
|
|
125
|
+
* `true` once the connection is authenticated (by LOGIN, AUTHENTICATE or a PREAUTH greeting),
|
|
126
|
+
* `false` before that. The user name is in `options.auth.user`
|
|
127
127
|
*/
|
|
128
128
|
authenticated: string | boolean;
|
|
129
129
|
/**
|
|
@@ -16,7 +16,7 @@ import { ConnectionDeadline } from './connection-deadline.js';
|
|
|
16
16
|
import { downloadMessage, downloadMessageParts } from './download.js';
|
|
17
17
|
import { AuthenticationFailure } 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
22
|
const UPGRADE_TIMEOUT = 10 * 1000;
|
|
@@ -1459,9 +1459,8 @@ export class ImapFlow extends EventEmitter {
|
|
|
1459
1459
|
// of the IP - accepting any "localhost" certificate for any IP-hosted
|
|
1460
1460
|
// server, and rejecting legitimate IP-SAN certificates.
|
|
1461
1461
|
host: this.host,
|
|
1462
|
-
servername: this.servername,
|
|
1463
1462
|
port: this.port
|
|
1464
|
-
}, this.options.tls || {});
|
|
1463
|
+
}, this.tlsServername(), this.options.tls || {});
|
|
1465
1464
|
this.clearSocketHandlers();
|
|
1466
1465
|
let settled = false;
|
|
1467
1466
|
// Single settlement path for the upgrade. Every terminal outcome - handshake
|
|
@@ -1472,6 +1471,13 @@ export class ImapFlow extends EventEmitter {
|
|
|
1472
1471
|
// socket event cannot re-enter an already settled upgrade or leave state behind.
|
|
1473
1472
|
const settle = (err, result) => {
|
|
1474
1473
|
if (settled) {
|
|
1474
|
+
// A failed handshake can produce more than one error (Bun emits ECONNRESET on
|
|
1475
|
+
// the TLS socket after the one that settled the upgrade). settle() stays the
|
|
1476
|
+
// error listener of both sockets until they are torn down, so later errors
|
|
1477
|
+
// end up here instead of being thrown as unhandled 'error' events.
|
|
1478
|
+
if (err) {
|
|
1479
|
+
this.log.debug({ msg: 'Socket error after the TLS upgrade was settled', err, cid: this.id });
|
|
1480
|
+
}
|
|
1475
1481
|
return;
|
|
1476
1482
|
}
|
|
1477
1483
|
settled = true;
|
|
@@ -1479,9 +1485,12 @@ export class ImapFlow extends EventEmitter {
|
|
|
1479
1485
|
this.upgradeTimeout = null;
|
|
1480
1486
|
this.upgrading = false;
|
|
1481
1487
|
this._upgradeReject = null;
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1488
|
+
if (!err) {
|
|
1489
|
+
// the generic socket handlers took over in the success callback
|
|
1490
|
+
socketPlain.removeListener('error', settle);
|
|
1491
|
+
if (this.socket && this.socket !== socketPlain) {
|
|
1492
|
+
this.socket.removeListener('error', settle);
|
|
1493
|
+
}
|
|
1485
1494
|
}
|
|
1486
1495
|
if (err) {
|
|
1487
1496
|
clearTimer(this.connectTimeout);
|
|
@@ -1499,7 +1508,7 @@ export class ImapFlow extends EventEmitter {
|
|
|
1499
1508
|
// one function, one settlement, and removeListener() in settle() needs no separate
|
|
1500
1509
|
// handler references. A TLS handshake failure (bad certificate, protocol mismatch)
|
|
1501
1510
|
// is emitted on the new TLS socket rather than on the plain one, so both are covered.
|
|
1502
|
-
socketPlain.
|
|
1511
|
+
socketPlain.on('error', settle);
|
|
1503
1512
|
/* c8 ignore start */ // UPGRADE_TIMEOUT is 10s; firing it deterministically would make the test suite hang
|
|
1504
1513
|
this.upgradeTimeout = setTimeout(() => {
|
|
1505
1514
|
let err = new Error('Failed to upgrade connection in required time');
|
|
@@ -1577,7 +1586,7 @@ export class ImapFlow extends EventEmitter {
|
|
|
1577
1586
|
// error listener during the handshake window; the generic handlers are installed
|
|
1578
1587
|
// by setSocketHandlers() inside the success callback above, so a handshake error
|
|
1579
1588
|
// has a single error path.
|
|
1580
|
-
tlsSocket.
|
|
1589
|
+
tlsSocket.on('error', settle);
|
|
1581
1590
|
this.writeSocket = tlsSocket;
|
|
1582
1591
|
});
|
|
1583
1592
|
if (upgraded) {
|
|
@@ -1851,12 +1860,18 @@ export class ImapFlow extends EventEmitter {
|
|
|
1851
1860
|
uids = untagged.attributes[0].value;
|
|
1852
1861
|
}
|
|
1853
1862
|
let uidList = expandRange(uids);
|
|
1863
|
+
let earlier = tags.includes('EARLIER');
|
|
1864
|
+
// RFC 7162 section 3.2.10: unlike VANISHED (EARLIER), a plain VANISHED reports messages the
|
|
1865
|
+
// client knows about and decrements the message count like the same number of EXPUNGEs would
|
|
1866
|
+
if (!earlier) {
|
|
1867
|
+
mailbox.exists = Math.max(0, mailbox.exists - uidList.length);
|
|
1868
|
+
}
|
|
1854
1869
|
for (let uid of uidList) {
|
|
1855
1870
|
let payload = {
|
|
1856
1871
|
path: mailbox.path,
|
|
1857
1872
|
uid,
|
|
1858
1873
|
vanished: true,
|
|
1859
|
-
earlier
|
|
1874
|
+
earlier
|
|
1860
1875
|
};
|
|
1861
1876
|
await this.notifyExpunge(payload);
|
|
1862
1877
|
}
|
|
@@ -1868,7 +1883,7 @@ export class ImapFlow extends EventEmitter {
|
|
|
1868
1883
|
// mailbox closed, ignore
|
|
1869
1884
|
return;
|
|
1870
1885
|
}
|
|
1871
|
-
let message = await formatMessageResponse(untagged, mailbox, this.idHashAlgorithm);
|
|
1886
|
+
let message = await formatMessageResponse(untagged, mailbox, this.idHashAlgorithm, this);
|
|
1872
1887
|
if (message.flags) {
|
|
1873
1888
|
let updateEvent = {
|
|
1874
1889
|
path: mailbox.path,
|
|
@@ -1897,6 +1912,12 @@ export class ImapFlow extends EventEmitter {
|
|
|
1897
1912
|
}
|
|
1898
1913
|
return true;
|
|
1899
1914
|
}
|
|
1915
|
+
// servername for tls.connect(), left out for an IP literal host (this.servername is false then):
|
|
1916
|
+
// Node treats a false value like a missing one, but Bun throws a TypeError for it
|
|
1917
|
+
/** @internal */
|
|
1918
|
+
tlsServername() {
|
|
1919
|
+
return this.servername ? { servername: this.servername } : {};
|
|
1920
|
+
}
|
|
1900
1921
|
// Normalizes a message range from various input formats into an IMAP-compatible
|
|
1901
1922
|
// sequence string (e.g., "1:5,7,10:*"). Handles: numbers, "*", {all:true},
|
|
1902
1923
|
// {uid:value}, search query objects (resolved via SEARCH), and arrays of numbers.
|
|
@@ -1939,6 +1960,11 @@ export class ImapFlow extends EventEmitter {
|
|
|
1939
1960
|
if (!value) {
|
|
1940
1961
|
return false;
|
|
1941
1962
|
}
|
|
1963
|
+
// An empty mailbox has no message numbers: every sequence set, "1:*" included, would get a
|
|
1964
|
+
// BAD (RFC 9051 section 9, seq-number). UID sets may point past the end, so they are sent.
|
|
1965
|
+
if (!options.uid && this.mailbox && !this.mailbox.exists) {
|
|
1966
|
+
return false;
|
|
1967
|
+
}
|
|
1942
1968
|
return value;
|
|
1943
1969
|
}
|
|
1944
1970
|
// The single definition of "the connection is not free". A held or queued mailbox lock, a
|
|
@@ -2008,9 +2034,8 @@ export class ImapFlow extends EventEmitter {
|
|
|
2008
2034
|
let connector = this.secureConnection ? tls : net;
|
|
2009
2035
|
let opts = Object.assign({
|
|
2010
2036
|
host: this.host,
|
|
2011
|
-
servername: this.servername,
|
|
2012
2037
|
port: this.port
|
|
2013
|
-
}, this.options.tls || {});
|
|
2038
|
+
}, this.tlsServername(), this.options.tls || {});
|
|
2014
2039
|
this.untaggedHandlers.OK = (...args) => this.initialOK(...args);
|
|
2015
2040
|
this.untaggedHandlers.BYE = (...args) => this.serverBye(...args);
|
|
2016
2041
|
this.untaggedHandlers.PREAUTH = () => this.initialPREAUTH();
|
|
@@ -3096,7 +3121,21 @@ export class ImapFlow extends EventEmitter {
|
|
|
3096
3121
|
if (!response || !response.list || !response.list.length) {
|
|
3097
3122
|
return false;
|
|
3098
3123
|
}
|
|
3099
|
-
|
|
3124
|
+
// Every FETCH row that arrived during the command is in the list, also unsolicited ones
|
|
3125
|
+
// for other messages or with only a flag change, and a server may split the answer for
|
|
3126
|
+
// one message over several rows. Taking the first row returned a flag update instead
|
|
3127
|
+
// of the requested data, which ended a download after its first chunk (issue #426).
|
|
3128
|
+
let rows = response.list;
|
|
3129
|
+
let requested = parseUintValue(String(seq), MAX_UINT32_DIGITS);
|
|
3130
|
+
// a range: the first message of the answer, as before
|
|
3131
|
+
let target = requested === false ? rows[0] : rows.find(row => (options && options.uid ? row.uid : row.seq) === requested);
|
|
3132
|
+
if (!target) {
|
|
3133
|
+
return false;
|
|
3134
|
+
}
|
|
3135
|
+
// rows of the same message, without the ones a malformed answer gives no usable
|
|
3136
|
+
// sequence number or another UID
|
|
3137
|
+
let { seq: targetSeq, uid: targetUid } = target;
|
|
3138
|
+
return targetSeq ? mergeFetchRows(rows.filter(row => row.seq === targetSeq && (!row.uid || !targetUid || row.uid === targetUid))) : target;
|
|
3100
3139
|
}
|
|
3101
3140
|
/**
|
|
3102
3141
|
* Download either full rfc822 formatted message or a specific bodystructure part as a Stream.
|
|
@@ -368,10 +368,13 @@ export const searchCompiler = (connection, query) => {
|
|
|
368
368
|
fail('InvalidSearchQuery', `Search value for ${term.toLowerCase()} must be a string`);
|
|
369
369
|
}
|
|
370
370
|
let flag = formatFlag(params[term]);
|
|
371
|
-
// formatFlag() refuses \Recent, which is not a keyword
|
|
372
|
-
// criterion would widen the search, so the query is
|
|
371
|
+
// formatFlag() refuses \Recent, which is not a keyword, and values that are
|
|
372
|
+
// not atoms. Dropping the criterion would widen the search, so the query is
|
|
373
|
+
// refused instead
|
|
373
374
|
if (flag === false) {
|
|
374
|
-
fail('InvalidSearchQuery',
|
|
375
|
+
fail('InvalidSearchQuery', /^\\recent$/i.test(params[term])
|
|
376
|
+
? `${params[term]} can not be searched as a keyword, use the "recent" search key instead`
|
|
377
|
+
: `${params[term]} is not a valid keyword`);
|
|
375
378
|
}
|
|
376
379
|
// Compiled even when the mailbox does not allow the keyword: the
|
|
377
380
|
// correct answer is then the empty set, which dropping the
|
|
@@ -287,15 +287,26 @@ export declare function getColorFlags(color: string | null | undefined): {
|
|
|
287
287
|
add: string[];
|
|
288
288
|
remove: string[];
|
|
289
289
|
} | null;
|
|
290
|
+
/**
|
|
291
|
+
* Merges the FETCH rows a server sent for one message into one message object. A server may
|
|
292
|
+
* split the data items of a message over several FETCH responses, and may put an unsolicited
|
|
293
|
+
* one (a flag change made by another session) in between (RFC 9051 sections 7.5.2 and 5.2).
|
|
294
|
+
* Later rows win for single values, bodyParts, binaryParts and partialOrigins are combined.
|
|
295
|
+
*
|
|
296
|
+
* @param rows - Formatted rows of the same message, in the order they arrived
|
|
297
|
+
* @returns One message object holding the data of every row
|
|
298
|
+
*/
|
|
299
|
+
export declare function mergeFetchRows(rows: FetchMessageObject[]): FetchMessageObject;
|
|
290
300
|
/**
|
|
291
301
|
* Formats a raw untagged FETCH response into a structured message object.
|
|
292
302
|
*
|
|
293
303
|
* @param untagged - Parsed untagged IMAP response
|
|
294
304
|
* @param mailbox - Current mailbox state object
|
|
295
305
|
* @param idHashAlgorithm - Hash for the fallback message id, `md5` unless the client was told otherwise
|
|
306
|
+
* @param connection - Connection the response arrived on, decodes Gmail labels like mailbox names
|
|
296
307
|
* @returns Formatted message object with properties like seq, uid, flags, envelope, etc.
|
|
297
308
|
*/
|
|
298
|
-
export declare function formatMessageResponse(untagged: ImapResponse, mailbox: MailboxObject, idHashAlgorithm?: string): Promise<FetchMessageObject>;
|
|
309
|
+
export declare function formatMessageResponse(untagged: ImapResponse, mailbox: MailboxObject, idHashAlgorithm?: string, connection?: ImapFlow): Promise<FetchMessageObject>;
|
|
299
310
|
/**
|
|
300
311
|
* Strips surrounding double quotes from a name string.
|
|
301
312
|
*
|
|
@@ -364,8 +375,8 @@ export declare function formatDate(value: unknown): string | undefined;
|
|
|
364
375
|
*/
|
|
365
376
|
export declare function formatDateTime(value: unknown): string | undefined;
|
|
366
377
|
/**
|
|
367
|
-
* Normalizes a flag string. Returns false for non-settable flags (e.g. \Recent)
|
|
368
|
-
* and capitalizes system flags properly.
|
|
378
|
+
* Normalizes a flag string. Returns false for non-settable flags (e.g. \Recent) and for
|
|
379
|
+
* values that are not valid flags (keywords must be atoms), and capitalizes system flags properly.
|
|
369
380
|
*
|
|
370
381
|
* @param flag - Flag string to normalize
|
|
371
382
|
* @returns Normalized flag string, or false if the flag cannot be set
|