@aitne/daemon 0.1.0
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/LICENSE +21 -0
- package/dist/adapters/composite-dashboard-stream.d.ts +42 -0
- package/dist/adapters/composite-dashboard-stream.d.ts.map +1 -0
- package/dist/adapters/composite-dashboard-stream.js +49 -0
- package/dist/adapters/composite-dashboard-stream.js.map +1 -0
- package/dist/adapters/dashboard-adapter.d.ts +104 -0
- package/dist/adapters/dashboard-adapter.d.ts.map +1 -0
- package/dist/adapters/dashboard-adapter.js +216 -0
- package/dist/adapters/dashboard-adapter.js.map +1 -0
- package/dist/adapters/discord.d.ts +77 -0
- package/dist/adapters/discord.d.ts.map +1 -0
- package/dist/adapters/discord.js +339 -0
- package/dist/adapters/discord.js.map +1 -0
- package/dist/adapters/docs-qa-adapter.d.ts +123 -0
- package/dist/adapters/docs-qa-adapter.d.ts.map +1 -0
- package/dist/adapters/docs-qa-adapter.js +218 -0
- package/dist/adapters/docs-qa-adapter.js.map +1 -0
- package/dist/adapters/message-hub.d.ts +70 -0
- package/dist/adapters/message-hub.d.ts.map +1 -0
- package/dist/adapters/message-hub.js +359 -0
- package/dist/adapters/message-hub.js.map +1 -0
- package/dist/adapters/notification-manager.d.ts +99 -0
- package/dist/adapters/notification-manager.d.ts.map +1 -0
- package/dist/adapters/notification-manager.js +498 -0
- package/dist/adapters/notification-manager.js.map +1 -0
- package/dist/adapters/outbound-text.d.ts +28 -0
- package/dist/adapters/outbound-text.d.ts.map +1 -0
- package/dist/adapters/outbound-text.js +58 -0
- package/dist/adapters/outbound-text.js.map +1 -0
- package/dist/adapters/slack-adapter.d.ts +82 -0
- package/dist/adapters/slack-adapter.d.ts.map +1 -0
- package/dist/adapters/slack-adapter.js +359 -0
- package/dist/adapters/slack-adapter.js.map +1 -0
- package/dist/adapters/telegram-adapter.d.ts +107 -0
- package/dist/adapters/telegram-adapter.d.ts.map +1 -0
- package/dist/adapters/telegram-adapter.js +477 -0
- package/dist/adapters/telegram-adapter.js.map +1 -0
- package/dist/adapters/types.d.ts +92 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/adapters/whatsapp-adapter.d.ts +213 -0
- package/dist/adapters/whatsapp-adapter.d.ts.map +1 -0
- package/dist/adapters/whatsapp-adapter.js +1216 -0
- package/dist/adapters/whatsapp-adapter.js.map +1 -0
- package/dist/api/chat-binding-query.d.ts +36 -0
- package/dist/api/chat-binding-query.d.ts.map +1 -0
- package/dist/api/chat-binding-query.js +63 -0
- package/dist/api/chat-binding-query.js.map +1 -0
- package/dist/api/chat-session-resume.d.ts +12 -0
- package/dist/api/chat-session-resume.d.ts.map +1 -0
- package/dist/api/chat-session-resume.js +21 -0
- package/dist/api/chat-session-resume.js.map +1 -0
- package/dist/api/delegated-proxy-helper.d.ts +33 -0
- package/dist/api/delegated-proxy-helper.d.ts.map +1 -0
- package/dist/api/delegated-proxy-helper.js +54 -0
- package/dist/api/delegated-proxy-helper.js.map +1 -0
- package/dist/api/directory-picker.d.ts +38 -0
- package/dist/api/directory-picker.d.ts.map +1 -0
- package/dist/api/directory-picker.js +278 -0
- package/dist/api/directory-picker.js.map +1 -0
- package/dist/api/env-writer.d.ts +25 -0
- package/dist/api/env-writer.d.ts.map +1 -0
- package/dist/api/env-writer.js +421 -0
- package/dist/api/env-writer.js.map +1 -0
- package/dist/api/integration-route-gate.d.ts +60 -0
- package/dist/api/integration-route-gate.d.ts.map +1 -0
- package/dist/api/integration-route-gate.js +83 -0
- package/dist/api/integration-route-gate.js.map +1 -0
- package/dist/api/json-body.d.ts +29 -0
- package/dist/api/json-body.d.ts.map +1 -0
- package/dist/api/json-body.js +87 -0
- package/dist/api/json-body.js.map +1 -0
- package/dist/api/routes/activity-sources.d.ts +20 -0
- package/dist/api/routes/activity-sources.d.ts.map +1 -0
- package/dist/api/routes/activity-sources.js +18 -0
- package/dist/api/routes/activity-sources.js.map +1 -0
- package/dist/api/routes/agent.d.ts +4 -0
- package/dist/api/routes/agent.d.ts.map +1 -0
- package/dist/api/routes/agent.js +619 -0
- package/dist/api/routes/agent.js.map +1 -0
- package/dist/api/routes/apple-calendar.d.ts +31 -0
- package/dist/api/routes/apple-calendar.d.ts.map +1 -0
- package/dist/api/routes/apple-calendar.js +310 -0
- package/dist/api/routes/apple-calendar.js.map +1 -0
- package/dist/api/routes/attachments.d.ts +36 -0
- package/dist/api/routes/attachments.d.ts.map +1 -0
- package/dist/api/routes/attachments.js +305 -0
- package/dist/api/routes/attachments.js.map +1 -0
- package/dist/api/routes/backends.d.ts +4 -0
- package/dist/api/routes/backends.d.ts.map +1 -0
- package/dist/api/routes/backends.js +1132 -0
- package/dist/api/routes/backends.js.map +1 -0
- package/dist/api/routes/books.d.ts +63 -0
- package/dist/api/routes/books.d.ts.map +1 -0
- package/dist/api/routes/books.js +467 -0
- package/dist/api/routes/books.js.map +1 -0
- package/dist/api/routes/calendar.d.ts +36 -0
- package/dist/api/routes/calendar.d.ts.map +1 -0
- package/dist/api/routes/calendar.js +351 -0
- package/dist/api/routes/calendar.js.map +1 -0
- package/dist/api/routes/commands.d.ts +4 -0
- package/dist/api/routes/commands.d.ts.map +1 -0
- package/dist/api/routes/commands.js +251 -0
- package/dist/api/routes/commands.js.map +1 -0
- package/dist/api/routes/context.d.ts +57 -0
- package/dist/api/routes/context.d.ts.map +1 -0
- package/dist/api/routes/context.js +1765 -0
- package/dist/api/routes/context.js.map +1 -0
- package/dist/api/routes/dashboard.d.ts +29 -0
- package/dist/api/routes/dashboard.d.ts.map +1 -0
- package/dist/api/routes/dashboard.js +2062 -0
- package/dist/api/routes/dashboard.js.map +1 -0
- package/dist/api/routes/delegated-sync.d.ts +4 -0
- package/dist/api/routes/delegated-sync.d.ts.map +1 -0
- package/dist/api/routes/delegated-sync.js +192 -0
- package/dist/api/routes/delegated-sync.js.map +1 -0
- package/dist/api/routes/delegated.d.ts +42 -0
- package/dist/api/routes/delegated.d.ts.map +1 -0
- package/dist/api/routes/delegated.js +250 -0
- package/dist/api/routes/delegated.js.map +1 -0
- package/dist/api/routes/docs.d.ts +34 -0
- package/dist/api/routes/docs.d.ts.map +1 -0
- package/dist/api/routes/docs.js +580 -0
- package/dist/api/routes/docs.js.map +1 -0
- package/dist/api/routes/entities.d.ts +9 -0
- package/dist/api/routes/entities.d.ts.map +1 -0
- package/dist/api/routes/entities.js +176 -0
- package/dist/api/routes/entities.js.map +1 -0
- package/dist/api/routes/git-accounts.d.ts +23 -0
- package/dist/api/routes/git-accounts.d.ts.map +1 -0
- package/dist/api/routes/git-accounts.js +227 -0
- package/dist/api/routes/git-accounts.js.map +1 -0
- package/dist/api/routes/git-templates.d.ts +50 -0
- package/dist/api/routes/git-templates.d.ts.map +1 -0
- package/dist/api/routes/git-templates.js +276 -0
- package/dist/api/routes/git-templates.js.map +1 -0
- package/dist/api/routes/git.d.ts +34 -0
- package/dist/api/routes/git.d.ts.map +1 -0
- package/dist/api/routes/git.js +126 -0
- package/dist/api/routes/git.js.map +1 -0
- package/dist/api/routes/github.d.ts +34 -0
- package/dist/api/routes/github.d.ts.map +1 -0
- package/dist/api/routes/github.js +465 -0
- package/dist/api/routes/github.js.map +1 -0
- package/dist/api/routes/health.d.ts +4 -0
- package/dist/api/routes/health.d.ts.map +1 -0
- package/dist/api/routes/health.js +257 -0
- package/dist/api/routes/health.js.map +1 -0
- package/dist/api/routes/integrations-reconcile.d.ts +33 -0
- package/dist/api/routes/integrations-reconcile.d.ts.map +1 -0
- package/dist/api/routes/integrations-reconcile.js +463 -0
- package/dist/api/routes/integrations-reconcile.js.map +1 -0
- package/dist/api/routes/integrations.d.ts +19 -0
- package/dist/api/routes/integrations.d.ts.map +1 -0
- package/dist/api/routes/integrations.js +1384 -0
- package/dist/api/routes/integrations.js.map +1 -0
- package/dist/api/routes/knowledge.d.ts +4 -0
- package/dist/api/routes/knowledge.d.ts.map +1 -0
- package/dist/api/routes/knowledge.js +224 -0
- package/dist/api/routes/knowledge.js.map +1 -0
- package/dist/api/routes/mail.d.ts +39 -0
- package/dist/api/routes/mail.d.ts.map +1 -0
- package/dist/api/routes/mail.js +1406 -0
- package/dist/api/routes/mail.js.map +1 -0
- package/dist/api/routes/managed-tasks.d.ts +48 -0
- package/dist/api/routes/managed-tasks.d.ts.map +1 -0
- package/dist/api/routes/managed-tasks.js +844 -0
- package/dist/api/routes/managed-tasks.js.map +1 -0
- package/dist/api/routes/mcp.d.ts +50 -0
- package/dist/api/routes/mcp.d.ts.map +1 -0
- package/dist/api/routes/mcp.js +470 -0
- package/dist/api/routes/mcp.js.map +1 -0
- package/dist/api/routes/metrics.d.ts +13 -0
- package/dist/api/routes/metrics.d.ts.map +1 -0
- package/dist/api/routes/metrics.js +117 -0
- package/dist/api/routes/metrics.js.map +1 -0
- package/dist/api/routes/notion.d.ts +35 -0
- package/dist/api/routes/notion.d.ts.map +1 -0
- package/dist/api/routes/notion.js +442 -0
- package/dist/api/routes/notion.js.map +1 -0
- package/dist/api/routes/observations.d.ts +4 -0
- package/dist/api/routes/observations.d.ts.map +1 -0
- package/dist/api/routes/observations.js +177 -0
- package/dist/api/routes/observations.js.map +1 -0
- package/dist/api/routes/obsidian.d.ts +16 -0
- package/dist/api/routes/obsidian.d.ts.map +1 -0
- package/dist/api/routes/obsidian.js +321 -0
- package/dist/api/routes/obsidian.js.map +1 -0
- package/dist/api/routes/profile-questions.d.ts +17 -0
- package/dist/api/routes/profile-questions.d.ts.map +1 -0
- package/dist/api/routes/profile-questions.js +115 -0
- package/dist/api/routes/profile-questions.js.map +1 -0
- package/dist/api/routes/receipts.d.ts +4 -0
- package/dist/api/routes/receipts.d.ts.map +1 -0
- package/dist/api/routes/receipts.js +155 -0
- package/dist/api/routes/receipts.js.map +1 -0
- package/dist/api/routes/recurring-schedules.d.ts +4 -0
- package/dist/api/routes/recurring-schedules.d.ts.map +1 -0
- package/dist/api/routes/recurring-schedules.js +137 -0
- package/dist/api/routes/recurring-schedules.js.map +1 -0
- package/dist/api/routes/repositories.d.ts +40 -0
- package/dist/api/routes/repositories.d.ts.map +1 -0
- package/dist/api/routes/repositories.js +857 -0
- package/dist/api/routes/repositories.js.map +1 -0
- package/dist/api/routes/setup-migrate.d.ts +74 -0
- package/dist/api/routes/setup-migrate.d.ts.map +1 -0
- package/dist/api/routes/setup-migrate.js +944 -0
- package/dist/api/routes/setup-migrate.js.map +1 -0
- package/dist/api/routes/setup.d.ts +4 -0
- package/dist/api/routes/setup.d.ts.map +1 -0
- package/dist/api/routes/setup.js +443 -0
- package/dist/api/routes/setup.js.map +1 -0
- package/dist/api/routes/skill-curation.d.ts +5 -0
- package/dist/api/routes/skill-curation.d.ts.map +1 -0
- package/dist/api/routes/skill-curation.js +728 -0
- package/dist/api/routes/skill-curation.js.map +1 -0
- package/dist/api/routes/skills.d.ts +52 -0
- package/dist/api/routes/skills.d.ts.map +1 -0
- package/dist/api/routes/skills.js +429 -0
- package/dist/api/routes/skills.js.map +1 -0
- package/dist/api/routes/sot-bindings.d.ts +20 -0
- package/dist/api/routes/sot-bindings.d.ts.map +1 -0
- package/dist/api/routes/sot-bindings.js +163 -0
- package/dist/api/routes/sot-bindings.js.map +1 -0
- package/dist/api/routes/sse.d.ts +86 -0
- package/dist/api/routes/sse.d.ts.map +1 -0
- package/dist/api/routes/sse.js +378 -0
- package/dist/api/routes/sse.js.map +1 -0
- package/dist/api/routes/system.d.ts +4 -0
- package/dist/api/routes/system.d.ts.map +1 -0
- package/dist/api/routes/system.js +207 -0
- package/dist/api/routes/system.js.map +1 -0
- package/dist/api/routes/task-flows.d.ts +30 -0
- package/dist/api/routes/task-flows.d.ts.map +1 -0
- package/dist/api/routes/task-flows.js +155 -0
- package/dist/api/routes/task-flows.js.map +1 -0
- package/dist/api/routes/travel-bookings.d.ts +4 -0
- package/dist/api/routes/travel-bookings.d.ts.map +1 -0
- package/dist/api/routes/travel-bookings.js +142 -0
- package/dist/api/routes/travel-bookings.js.map +1 -0
- package/dist/api/routes/travel-time.d.ts +8 -0
- package/dist/api/routes/travel-time.d.ts.map +1 -0
- package/dist/api/routes/travel-time.js +87 -0
- package/dist/api/routes/travel-time.js.map +1 -0
- package/dist/api/routes/triggers.d.ts +4 -0
- package/dist/api/routes/triggers.d.ts.map +1 -0
- package/dist/api/routes/triggers.js +101 -0
- package/dist/api/routes/triggers.js.map +1 -0
- package/dist/api/routes/voice.d.ts +48 -0
- package/dist/api/routes/voice.d.ts.map +1 -0
- package/dist/api/routes/voice.js +232 -0
- package/dist/api/routes/voice.js.map +1 -0
- package/dist/api/server.d.ts +428 -0
- package/dist/api/server.d.ts.map +1 -0
- package/dist/api/server.js +558 -0
- package/dist/api/server.js.map +1 -0
- package/dist/config.d.ts +136 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +699 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-core.d.ts +517 -0
- package/dist/core/agent-core.d.ts.map +1 -0
- package/dist/core/agent-core.js +102 -0
- package/dist/core/agent-core.js.map +1 -0
- package/dist/core/alerts.d.ts +86 -0
- package/dist/core/alerts.d.ts.map +1 -0
- package/dist/core/alerts.js +304 -0
- package/dist/core/alerts.js.map +1 -0
- package/dist/core/atomic-write.d.ts +51 -0
- package/dist/core/atomic-write.d.ts.map +1 -0
- package/dist/core/atomic-write.js +135 -0
- package/dist/core/atomic-write.js.map +1 -0
- package/dist/core/backends/api-key-probe.d.ts +40 -0
- package/dist/core/backends/api-key-probe.d.ts.map +1 -0
- package/dist/core/backends/api-key-probe.js +116 -0
- package/dist/core/backends/api-key-probe.js.map +1 -0
- package/dist/core/backends/auth-health-monitor.d.ts +373 -0
- package/dist/core/backends/auth-health-monitor.d.ts.map +1 -0
- package/dist/core/backends/auth-health-monitor.js +950 -0
- package/dist/core/backends/auth-health-monitor.js.map +1 -0
- package/dist/core/backends/auth-recovery.d.ts +263 -0
- package/dist/core/backends/auth-recovery.d.ts.map +1 -0
- package/dist/core/backends/auth-recovery.js +1086 -0
- package/dist/core/backends/auth-recovery.js.map +1 -0
- package/dist/core/backends/auth-telemetry.d.ts +81 -0
- package/dist/core/backends/auth-telemetry.d.ts.map +1 -0
- package/dist/core/backends/auth-telemetry.js +108 -0
- package/dist/core/backends/auth-telemetry.js.map +1 -0
- package/dist/core/backends/backend-router.d.ts +272 -0
- package/dist/core/backends/backend-router.d.ts.map +1 -0
- package/dist/core/backends/backend-router.js +759 -0
- package/dist/core/backends/backend-router.js.map +1 -0
- package/dist/core/backends/claude-code-core.d.ts +299 -0
- package/dist/core/backends/claude-code-core.d.ts.map +1 -0
- package/dist/core/backends/claude-code-core.js +2541 -0
- package/dist/core/backends/claude-code-core.js.map +1 -0
- package/dist/core/backends/claude-credentials-store.d.ts +83 -0
- package/dist/core/backends/claude-credentials-store.d.ts.map +1 -0
- package/dist/core/backends/claude-credentials-store.js +243 -0
- package/dist/core/backends/claude-credentials-store.js.map +1 -0
- package/dist/core/backends/cli-utils.d.ts +95 -0
- package/dist/core/backends/cli-utils.d.ts.map +1 -0
- package/dist/core/backends/cli-utils.js +464 -0
- package/dist/core/backends/cli-utils.js.map +1 -0
- package/dist/core/backends/codex-core.d.ts +127 -0
- package/dist/core/backends/codex-core.d.ts.map +1 -0
- package/dist/core/backends/codex-core.js +1693 -0
- package/dist/core/backends/codex-core.js.map +1 -0
- package/dist/core/backends/gemini-cli-core.d.ts +367 -0
- package/dist/core/backends/gemini-cli-core.d.ts.map +1 -0
- package/dist/core/backends/gemini-cli-core.js +2331 -0
- package/dist/core/backends/gemini-cli-core.js.map +1 -0
- package/dist/core/backends/idle-watchdog.d.ts +77 -0
- package/dist/core/backends/idle-watchdog.d.ts.map +1 -0
- package/dist/core/backends/idle-watchdog.js +94 -0
- package/dist/core/backends/idle-watchdog.js.map +1 -0
- package/dist/core/backends/install-methods.d.ts +93 -0
- package/dist/core/backends/install-methods.d.ts.map +1 -0
- package/dist/core/backends/install-methods.js +267 -0
- package/dist/core/backends/install-methods.js.map +1 -0
- package/dist/core/backends/model-registry.d.ts +58 -0
- package/dist/core/backends/model-registry.d.ts.map +1 -0
- package/dist/core/backends/model-registry.js +539 -0
- package/dist/core/backends/model-registry.js.map +1 -0
- package/dist/core/backends/plan-presets.d.ts +123 -0
- package/dist/core/backends/plan-presets.d.ts.map +1 -0
- package/dist/core/backends/plan-presets.js +235 -0
- package/dist/core/backends/plan-presets.js.map +1 -0
- package/dist/core/backends/price-fetcher.d.ts +48 -0
- package/dist/core/backends/price-fetcher.d.ts.map +1 -0
- package/dist/core/backends/price-fetcher.js +248 -0
- package/dist/core/backends/price-fetcher.js.map +1 -0
- package/dist/core/backends/process-config-cascade.d.ts +68 -0
- package/dist/core/backends/process-config-cascade.d.ts.map +1 -0
- package/dist/core/backends/process-config-cascade.js +173 -0
- package/dist/core/backends/process-config-cascade.js.map +1 -0
- package/dist/core/backends/prompt-utils.d.ts +6 -0
- package/dist/core/backends/prompt-utils.d.ts.map +1 -0
- package/dist/core/backends/prompt-utils.js +80 -0
- package/dist/core/backends/prompt-utils.js.map +1 -0
- package/dist/core/backends/proxy-model-registry.d.ts +110 -0
- package/dist/core/backends/proxy-model-registry.d.ts.map +1 -0
- package/dist/core/backends/proxy-model-registry.js +195 -0
- package/dist/core/backends/proxy-model-registry.js.map +1 -0
- package/dist/core/backends/silent-api-error-detector.d.ts +31 -0
- package/dist/core/backends/silent-api-error-detector.d.ts.map +1 -0
- package/dist/core/backends/silent-api-error-detector.js +44 -0
- package/dist/core/backends/silent-api-error-detector.js.map +1 -0
- package/dist/core/bang-commands/commands-cost.d.ts +13 -0
- package/dist/core/bang-commands/commands-cost.d.ts.map +1 -0
- package/dist/core/bang-commands/commands-cost.js +91 -0
- package/dist/core/bang-commands/commands-cost.js.map +1 -0
- package/dist/core/bang-commands/commands-report.d.ts +18 -0
- package/dist/core/bang-commands/commands-report.d.ts.map +1 -0
- package/dist/core/bang-commands/commands-report.js +105 -0
- package/dist/core/bang-commands/commands-report.js.map +1 -0
- package/dist/core/bang-commands/commands-stop-start.d.ts +4 -0
- package/dist/core/bang-commands/commands-stop-start.d.ts.map +1 -0
- package/dist/core/bang-commands/commands-stop-start.js +88 -0
- package/dist/core/bang-commands/commands-stop-start.js.map +1 -0
- package/dist/core/bang-commands/format-utils.d.ts +34 -0
- package/dist/core/bang-commands/format-utils.d.ts.map +1 -0
- package/dist/core/bang-commands/format-utils.js +118 -0
- package/dist/core/bang-commands/format-utils.js.map +1 -0
- package/dist/core/bang-commands/index.d.ts +20 -0
- package/dist/core/bang-commands/index.d.ts.map +1 -0
- package/dist/core/bang-commands/index.js +31 -0
- package/dist/core/bang-commands/index.js.map +1 -0
- package/dist/core/bang-commands/registry.d.ts +72 -0
- package/dist/core/bang-commands/registry.d.ts.map +1 -0
- package/dist/core/bang-commands/registry.js +174 -0
- package/dist/core/bang-commands/registry.js.map +1 -0
- package/dist/core/bang-commands/user-commands.d.ts +86 -0
- package/dist/core/bang-commands/user-commands.d.ts.map +1 -0
- package/dist/core/bang-commands/user-commands.js +212 -0
- package/dist/core/bang-commands/user-commands.js.map +1 -0
- package/dist/core/channel-timeline.d.ts +28 -0
- package/dist/core/channel-timeline.d.ts.map +1 -0
- package/dist/core/channel-timeline.js +117 -0
- package/dist/core/channel-timeline.js.map +1 -0
- package/dist/core/character-block.d.ts +37 -0
- package/dist/core/character-block.d.ts.map +1 -0
- package/dist/core/character-block.js +162 -0
- package/dist/core/character-block.js.map +1 -0
- package/dist/core/context/activity-sources.d.ts +37 -0
- package/dist/core/context/activity-sources.d.ts.map +1 -0
- package/dist/core/context/activity-sources.js +69 -0
- package/dist/core/context/activity-sources.js.map +1 -0
- package/dist/core/context/activity-view-reconciler.d.ts +110 -0
- package/dist/core/context/activity-view-reconciler.d.ts.map +1 -0
- package/dist/core/context/activity-view-reconciler.js +252 -0
- package/dist/core/context/activity-view-reconciler.js.map +1 -0
- package/dist/core/context/activity-view-runner.d.ts +38 -0
- package/dist/core/context/activity-view-runner.d.ts.map +1 -0
- package/dist/core/context/activity-view-runner.js +402 -0
- package/dist/core/context/activity-view-runner.js.map +1 -0
- package/dist/core/context/default-schedules-reconciler.d.ts +85 -0
- package/dist/core/context/default-schedules-reconciler.d.ts.map +1 -0
- package/dist/core/context/default-schedules-reconciler.js +153 -0
- package/dist/core/context/default-schedules-reconciler.js.map +1 -0
- package/dist/core/context/default-schedules-runner.d.ts +40 -0
- package/dist/core/context/default-schedules-runner.d.ts.map +1 -0
- package/dist/core/context/default-schedules-runner.js +233 -0
- package/dist/core/context/default-schedules-runner.js.map +1 -0
- package/dist/core/context/domain-index-reconciler.d.ts +81 -0
- package/dist/core/context/domain-index-reconciler.d.ts.map +1 -0
- package/dist/core/context/domain-index-reconciler.js +199 -0
- package/dist/core/context/domain-index-reconciler.js.map +1 -0
- package/dist/core/context/domain-index-runner.d.ts +35 -0
- package/dist/core/context/domain-index-runner.d.ts.map +1 -0
- package/dist/core/context/domain-index-runner.js +223 -0
- package/dist/core/context/domain-index-runner.js.map +1 -0
- package/dist/core/context/entity-mirror.d.ts +227 -0
- package/dist/core/context/entity-mirror.d.ts.map +1 -0
- package/dist/core/context/entity-mirror.js +629 -0
- package/dist/core/context/entity-mirror.js.map +1 -0
- package/dist/core/context/entity-source-rename.d.ts +61 -0
- package/dist/core/context/entity-source-rename.d.ts.map +1 -0
- package/dist/core/context/entity-source-rename.js +237 -0
- package/dist/core/context/entity-source-rename.js.map +1 -0
- package/dist/core/context/index-reconciler.d.ts +61 -0
- package/dist/core/context/index-reconciler.d.ts.map +1 -0
- package/dist/core/context/index-reconciler.js +329 -0
- package/dist/core/context/index-reconciler.js.map +1 -0
- package/dist/core/context/policy-index-reconciler.d.ts +102 -0
- package/dist/core/context/policy-index-reconciler.d.ts.map +1 -0
- package/dist/core/context/policy-index-reconciler.js +202 -0
- package/dist/core/context/policy-index-reconciler.js.map +1 -0
- package/dist/core/context/policy-index-runner.d.ts +66 -0
- package/dist/core/context/policy-index-runner.d.ts.map +1 -0
- package/dist/core/context/policy-index-runner.js +406 -0
- package/dist/core/context/policy-index-runner.js.map +1 -0
- package/dist/core/context/reconciler-runner.d.ts +44 -0
- package/dist/core/context/reconciler-runner.d.ts.map +1 -0
- package/dist/core/context/reconciler-runner.js +273 -0
- package/dist/core/context/reconciler-runner.js.map +1 -0
- package/dist/core/context-builder.d.ts +115 -0
- package/dist/core/context-builder.d.ts.map +1 -0
- package/dist/core/context-builder.js +1148 -0
- package/dist/core/context-builder.js.map +1 -0
- package/dist/core/context-frontmatter-backfill.d.ts +33 -0
- package/dist/core/context-frontmatter-backfill.d.ts.map +1 -0
- package/dist/core/context-frontmatter-backfill.js +111 -0
- package/dist/core/context-frontmatter-backfill.js.map +1 -0
- package/dist/core/context-frontmatter.d.ts +13 -0
- package/dist/core/context-frontmatter.d.ts.map +1 -0
- package/dist/core/context-frontmatter.js +325 -0
- package/dist/core/context-frontmatter.js.map +1 -0
- package/dist/core/context-health.d.ts +51 -0
- package/dist/core/context-health.d.ts.map +1 -0
- package/dist/core/context-health.js +304 -0
- package/dist/core/context-health.js.map +1 -0
- package/dist/core/context-paths.d.ts +183 -0
- package/dist/core/context-paths.d.ts.map +1 -0
- package/dist/core/context-paths.js +241 -0
- package/dist/core/context-paths.js.map +1 -0
- package/dist/core/context-staleness.d.ts +45 -0
- package/dist/core/context-staleness.d.ts.map +1 -0
- package/dist/core/context-staleness.js +88 -0
- package/dist/core/context-staleness.js.map +1 -0
- package/dist/core/custom-routine-scheduler.d.ts +151 -0
- package/dist/core/custom-routine-scheduler.d.ts.map +1 -0
- package/dist/core/custom-routine-scheduler.js +335 -0
- package/dist/core/custom-routine-scheduler.js.map +1 -0
- package/dist/core/daemon-api-cli.d.ts +33 -0
- package/dist/core/daemon-api-cli.d.ts.map +1 -0
- package/dist/core/daemon-api-cli.js +614 -0
- package/dist/core/daemon-api-cli.js.map +1 -0
- package/dist/core/dashboard-session-cleanup.d.ts +39 -0
- package/dist/core/dashboard-session-cleanup.d.ts.map +1 -0
- package/dist/core/dashboard-session-cleanup.js +108 -0
- package/dist/core/dashboard-session-cleanup.js.map +1 -0
- package/dist/core/dashboard-session-controls.d.ts +41 -0
- package/dist/core/dashboard-session-controls.d.ts.map +1 -0
- package/dist/core/dashboard-session-controls.js +154 -0
- package/dist/core/dashboard-session-controls.js.map +1 -0
- package/dist/core/delegated-connector-health.d.ts +63 -0
- package/dist/core/delegated-connector-health.d.ts.map +1 -0
- package/dist/core/delegated-connector-health.js +157 -0
- package/dist/core/delegated-connector-health.js.map +1 -0
- package/dist/core/dispatcher.d.ts +999 -0
- package/dist/core/dispatcher.d.ts.map +1 -0
- package/dist/core/dispatcher.js +4378 -0
- package/dist/core/dispatcher.js.map +1 -0
- package/dist/core/dm-freshness-metrics.d.ts +73 -0
- package/dist/core/dm-freshness-metrics.d.ts.map +1 -0
- package/dist/core/dm-freshness-metrics.js +138 -0
- package/dist/core/dm-freshness-metrics.js.map +1 -0
- package/dist/core/docs/citation-validator.d.ts +73 -0
- package/dist/core/docs/citation-validator.d.ts.map +1 -0
- package/dist/core/docs/citation-validator.js +195 -0
- package/dist/core/docs/citation-validator.js.map +1 -0
- package/dist/core/docs/extract-terms.d.ts +78 -0
- package/dist/core/docs/extract-terms.d.ts.map +1 -0
- package/dist/core/docs/extract-terms.js +147 -0
- package/dist/core/docs/extract-terms.js.map +1 -0
- package/dist/core/docs/indexer.d.ts +104 -0
- package/dist/core/docs/indexer.d.ts.map +1 -0
- package/dist/core/docs/indexer.js +340 -0
- package/dist/core/docs/indexer.js.map +1 -0
- package/dist/core/drift-effects.d.ts +30 -0
- package/dist/core/drift-effects.d.ts.map +1 -0
- package/dist/core/drift-effects.js +384 -0
- package/dist/core/drift-effects.js.map +1 -0
- package/dist/core/event-bus.d.ts +56 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +135 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/git-project-docs.d.ts +77 -0
- package/dist/core/git-project-docs.d.ts.map +1 -0
- package/dist/core/git-project-docs.js +439 -0
- package/dist/core/git-project-docs.js.map +1 -0
- package/dist/core/health-monitor.d.ts +57 -0
- package/dist/core/health-monitor.d.ts.map +1 -0
- package/dist/core/health-monitor.js +137 -0
- package/dist/core/health-monitor.js.map +1 -0
- package/dist/core/heartbeat.d.ts +26 -0
- package/dist/core/heartbeat.d.ts.map +1 -0
- package/dist/core/heartbeat.js +48 -0
- package/dist/core/heartbeat.js.map +1 -0
- package/dist/core/integration-health.d.ts +49 -0
- package/dist/core/integration-health.d.ts.map +1 -0
- package/dist/core/integration-health.js +89 -0
- package/dist/core/integration-health.js.map +1 -0
- package/dist/core/integration-lifecycle.d.ts +79 -0
- package/dist/core/integration-lifecycle.d.ts.map +1 -0
- package/dist/core/integration-lifecycle.js +153 -0
- package/dist/core/integration-lifecycle.js.map +1 -0
- package/dist/core/integration-main-backend.d.ts +36 -0
- package/dist/core/integration-main-backend.d.ts.map +1 -0
- package/dist/core/integration-main-backend.js +59 -0
- package/dist/core/integration-main-backend.js.map +1 -0
- package/dist/core/integration-probe.d.ts +98 -0
- package/dist/core/integration-probe.d.ts.map +1 -0
- package/dist/core/integration-probe.js +152 -0
- package/dist/core/integration-probe.js.map +1 -0
- package/dist/core/management-md-write-lock.d.ts +68 -0
- package/dist/core/management-md-write-lock.d.ts.map +1 -0
- package/dist/core/management-md-write-lock.js +93 -0
- package/dist/core/management-md-write-lock.js.map +1 -0
- package/dist/core/management-md.d.ts +186 -0
- package/dist/core/management-md.d.ts.map +1 -0
- package/dist/core/management-md.js +652 -0
- package/dist/core/management-md.js.map +1 -0
- package/dist/core/management-registry.d.ts +245 -0
- package/dist/core/management-registry.d.ts.map +1 -0
- package/dist/core/management-registry.js +906 -0
- package/dist/core/management-registry.js.map +1 -0
- package/dist/core/management-telemetry.d.ts +100 -0
- package/dist/core/management-telemetry.d.ts.map +1 -0
- package/dist/core/management-telemetry.js +156 -0
- package/dist/core/management-telemetry.js.map +1 -0
- package/dist/core/message-recorder.d.ts +38 -0
- package/dist/core/message-recorder.d.ts.map +1 -0
- package/dist/core/message-recorder.js +88 -0
- package/dist/core/message-recorder.js.map +1 -0
- package/dist/core/metrics.d.ts +338 -0
- package/dist/core/metrics.d.ts.map +1 -0
- package/dist/core/metrics.js +747 -0
- package/dist/core/metrics.js.map +1 -0
- package/dist/core/migration-backup.d.ts +218 -0
- package/dist/core/migration-backup.d.ts.map +1 -0
- package/dist/core/migration-backup.js +934 -0
- package/dist/core/migration-backup.js.map +1 -0
- package/dist/core/overview-write-lock.d.ts +48 -0
- package/dist/core/overview-write-lock.d.ts.map +1 -0
- package/dist/core/overview-write-lock.js +56 -0
- package/dist/core/overview-write-lock.js.map +1 -0
- package/dist/core/path-compat.d.ts +22 -0
- package/dist/core/path-compat.d.ts.map +1 -0
- package/dist/core/path-compat.js +67 -0
- package/dist/core/path-compat.js.map +1 -0
- package/dist/core/path-rewrite.d.ts +58 -0
- package/dist/core/path-rewrite.d.ts.map +1 -0
- package/dist/core/path-rewrite.js +141 -0
- package/dist/core/path-rewrite.js.map +1 -0
- package/dist/core/policy-files.d.ts +108 -0
- package/dist/core/policy-files.d.ts.map +1 -0
- package/dist/core/policy-files.js +198 -0
- package/dist/core/policy-files.js.map +1 -0
- package/dist/core/profile-questions/seed.d.ts +44 -0
- package/dist/core/profile-questions/seed.d.ts.map +1 -0
- package/dist/core/profile-questions/seed.js +173 -0
- package/dist/core/profile-questions/seed.js.map +1 -0
- package/dist/core/profile-questions/slot-filled.d.ts +51 -0
- package/dist/core/profile-questions/slot-filled.d.ts.map +1 -0
- package/dist/core/profile-questions/slot-filled.js +118 -0
- package/dist/core/profile-questions/slot-filled.js.map +1 -0
- package/dist/core/prompts.d.ts +111 -0
- package/dist/core/prompts.d.ts.map +1 -0
- package/dist/core/prompts.js +267 -0
- package/dist/core/prompts.js.map +1 -0
- package/dist/core/quiet-hours-sync.d.ts +15 -0
- package/dist/core/quiet-hours-sync.d.ts.map +1 -0
- package/dist/core/quiet-hours-sync.js +51 -0
- package/dist/core/quiet-hours-sync.js.map +1 -0
- package/dist/core/read-sensitive-token-manager.d.ts +19 -0
- package/dist/core/read-sensitive-token-manager.d.ts.map +1 -0
- package/dist/core/read-sensitive-token-manager.js +29 -0
- package/dist/core/read-sensitive-token-manager.js.map +1 -0
- package/dist/core/recurrence.d.ts +24 -0
- package/dist/core/recurrence.d.ts.map +1 -0
- package/dist/core/recurrence.js +162 -0
- package/dist/core/recurrence.js.map +1 -0
- package/dist/core/reinstall.d.ts +107 -0
- package/dist/core/reinstall.d.ts.map +1 -0
- package/dist/core/reinstall.js +163 -0
- package/dist/core/reinstall.js.map +1 -0
- package/dist/core/release-assets.d.ts +106 -0
- package/dist/core/release-assets.d.ts.map +1 -0
- package/dist/core/release-assets.js +434 -0
- package/dist/core/release-assets.js.map +1 -0
- package/dist/core/repository-management-docs.d.ts +216 -0
- package/dist/core/repository-management-docs.d.ts.map +1 -0
- package/dist/core/repository-management-docs.js +855 -0
- package/dist/core/repository-management-docs.js.map +1 -0
- package/dist/core/retention.d.ts +164 -0
- package/dist/core/retention.d.ts.map +1 -0
- package/dist/core/retention.js +1008 -0
- package/dist/core/retention.js.map +1 -0
- package/dist/core/review-context.d.ts +48 -0
- package/dist/core/review-context.d.ts.map +1 -0
- package/dist/core/review-context.js +282 -0
- package/dist/core/review-context.js.map +1 -0
- package/dist/core/roadmap-horizon.d.ts +48 -0
- package/dist/core/roadmap-horizon.d.ts.map +1 -0
- package/dist/core/roadmap-horizon.js +213 -0
- package/dist/core/roadmap-horizon.js.map +1 -0
- package/dist/core/roadmap-ids.d.ts +57 -0
- package/dist/core/roadmap-ids.d.ts.map +1 -0
- package/dist/core/roadmap-ids.js +118 -0
- package/dist/core/roadmap-ids.js.map +1 -0
- package/dist/core/roadmap-merge.d.ts +7 -0
- package/dist/core/roadmap-merge.d.ts.map +1 -0
- package/dist/core/roadmap-merge.js +187 -0
- package/dist/core/roadmap-merge.js.map +1 -0
- package/dist/core/roadmap-refresh-triggers.d.ts +32 -0
- package/dist/core/roadmap-refresh-triggers.d.ts.map +1 -0
- package/dist/core/roadmap-refresh-triggers.js +51 -0
- package/dist/core/roadmap-refresh-triggers.js.map +1 -0
- package/dist/core/roadmap-truncate.d.ts +49 -0
- package/dist/core/roadmap-truncate.d.ts.map +1 -0
- package/dist/core/roadmap-truncate.js +152 -0
- package/dist/core/roadmap-truncate.js.map +1 -0
- package/dist/core/roadmap-validate.d.ts +31 -0
- package/dist/core/roadmap-validate.d.ts.map +1 -0
- package/dist/core/roadmap-validate.js +403 -0
- package/dist/core/roadmap-validate.js.map +1 -0
- package/dist/core/roadmap-write-lock.d.ts +53 -0
- package/dist/core/roadmap-write-lock.d.ts.map +1 -0
- package/dist/core/roadmap-write-lock.js +59 -0
- package/dist/core/roadmap-write-lock.js.map +1 -0
- package/dist/core/schedule-insert-helper.d.ts +46 -0
- package/dist/core/schedule-insert-helper.d.ts.map +1 -0
- package/dist/core/schedule-insert-helper.js +52 -0
- package/dist/core/schedule-insert-helper.js.map +1 -0
- package/dist/core/schedule-maintenance.d.ts +22 -0
- package/dist/core/schedule-maintenance.d.ts.map +1 -0
- package/dist/core/schedule-maintenance.js +57 -0
- package/dist/core/schedule-maintenance.js.map +1 -0
- package/dist/core/scheduler.d.ts +208 -0
- package/dist/core/scheduler.d.ts.map +1 -0
- package/dist/core/scheduler.js +896 -0
- package/dist/core/scheduler.js.map +1 -0
- package/dist/core/semaphore.d.ts +13 -0
- package/dist/core/semaphore.d.ts.map +1 -0
- package/dist/core/semaphore.js +31 -0
- package/dist/core/semaphore.js.map +1 -0
- package/dist/core/session-gate.d.ts +37 -0
- package/dist/core/session-gate.d.ts.map +1 -0
- package/dist/core/session-gate.js +69 -0
- package/dist/core/session-gate.js.map +1 -0
- package/dist/core/session-manager.d.ts +252 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +716 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/signal-detector.d.ts +97 -0
- package/dist/core/signal-detector.d.ts.map +1 -0
- package/dist/core/signal-detector.js +215 -0
- package/dist/core/signal-detector.js.map +1 -0
- package/dist/core/skeleton.d.ts +83 -0
- package/dist/core/skeleton.d.ts.map +1 -0
- package/dist/core/skeleton.js +255 -0
- package/dist/core/skeleton.js.map +1 -0
- package/dist/core/skill-curation/apply-proposal.d.ts +71 -0
- package/dist/core/skill-curation/apply-proposal.d.ts.map +1 -0
- package/dist/core/skill-curation/apply-proposal.js +175 -0
- package/dist/core/skill-curation/apply-proposal.js.map +1 -0
- package/dist/core/skill-curation/auto-revert.d.ts +43 -0
- package/dist/core/skill-curation/auto-revert.d.ts.map +1 -0
- package/dist/core/skill-curation/auto-revert.js +155 -0
- package/dist/core/skill-curation/auto-revert.js.map +1 -0
- package/dist/core/skill-curation/classify-diff.d.ts +27 -0
- package/dist/core/skill-curation/classify-diff.d.ts.map +1 -0
- package/dist/core/skill-curation/classify-diff.js +0 -0
- package/dist/core/skill-curation/classify-diff.js.map +1 -0
- package/dist/core/skill-curation/declarations.d.ts +32 -0
- package/dist/core/skill-curation/declarations.d.ts.map +1 -0
- package/dist/core/skill-curation/declarations.js +171 -0
- package/dist/core/skill-curation/declarations.js.map +1 -0
- package/dist/core/skill-curation/knowledge-map.d.ts +26 -0
- package/dist/core/skill-curation/knowledge-map.d.ts.map +1 -0
- package/dist/core/skill-curation/knowledge-map.js +154 -0
- package/dist/core/skill-curation/knowledge-map.js.map +1 -0
- package/dist/core/skill-curation/orphan-overlay.d.ts +35 -0
- package/dist/core/skill-curation/orphan-overlay.d.ts.map +1 -0
- package/dist/core/skill-curation/orphan-overlay.js +167 -0
- package/dist/core/skill-curation/orphan-overlay.js.map +1 -0
- package/dist/core/skill-curation/overlay-store.d.ts +41 -0
- package/dist/core/skill-curation/overlay-store.d.ts.map +1 -0
- package/dist/core/skill-curation/overlay-store.js +143 -0
- package/dist/core/skill-curation/overlay-store.js.map +1 -0
- package/dist/core/skill-curation/render/convention-notes.d.ts +4 -0
- package/dist/core/skill-curation/render/convention-notes.d.ts.map +1 -0
- package/dist/core/skill-curation/render/convention-notes.js +13 -0
- package/dist/core/skill-curation/render/convention-notes.js.map +1 -0
- package/dist/core/skill-curation/render/cross-references.d.ts +4 -0
- package/dist/core/skill-curation/render/cross-references.d.ts.map +1 -0
- package/dist/core/skill-curation/render/cross-references.js +10 -0
- package/dist/core/skill-curation/render/cross-references.js.map +1 -0
- package/dist/core/skill-curation/render/frontmatter-schema.d.ts +4 -0
- package/dist/core/skill-curation/render/frontmatter-schema.d.ts.map +1 -0
- package/dist/core/skill-curation/render/frontmatter-schema.js +25 -0
- package/dist/core/skill-curation/render/frontmatter-schema.js.map +1 -0
- package/dist/core/skill-curation/render/index.d.ts +5 -0
- package/dist/core/skill-curation/render/index.d.ts.map +1 -0
- package/dist/core/skill-curation/render/index.js +42 -0
- package/dist/core/skill-curation/render/index.js.map +1 -0
- package/dist/core/skill-curation/render/knowledge-layout.d.ts +4 -0
- package/dist/core/skill-curation/render/knowledge-layout.d.ts.map +1 -0
- package/dist/core/skill-curation/render/knowledge-layout.js +36 -0
- package/dist/core/skill-curation/render/knowledge-layout.js.map +1 -0
- package/dist/core/skill-curation/render/routing-table.d.ts +4 -0
- package/dist/core/skill-curation/render/routing-table.d.ts.map +1 -0
- package/dist/core/skill-curation/render/routing-table.js +37 -0
- package/dist/core/skill-curation/render/routing-table.js.map +1 -0
- package/dist/core/skill-curation/render/search-recipes.d.ts +4 -0
- package/dist/core/skill-curation/render/search-recipes.d.ts.map +1 -0
- package/dist/core/skill-curation/render/search-recipes.js +39 -0
- package/dist/core/skill-curation/render/search-recipes.js.map +1 -0
- package/dist/core/skill-curation/run-token.d.ts +27 -0
- package/dist/core/skill-curation/run-token.d.ts.map +1 -0
- package/dist/core/skill-curation/run-token.js +81 -0
- package/dist/core/skill-curation/run-token.js.map +1 -0
- package/dist/core/skill-curation/signals.d.ts +49 -0
- package/dist/core/skill-curation/signals.d.ts.map +1 -0
- package/dist/core/skill-curation/signals.js +149 -0
- package/dist/core/skill-curation/signals.js.map +1 -0
- package/dist/core/skill-curation/smoke-test.d.ts +39 -0
- package/dist/core/skill-curation/smoke-test.d.ts.map +1 -0
- package/dist/core/skill-curation/smoke-test.js +313 -0
- package/dist/core/skill-curation/smoke-test.js.map +1 -0
- package/dist/core/skill-curation/splicer.d.ts +16 -0
- package/dist/core/skill-curation/splicer.d.ts.map +1 -0
- package/dist/core/skill-curation/splicer.js +78 -0
- package/dist/core/skill-curation/splicer.js.map +1 -0
- package/dist/core/skill-curation/workdir.d.ts +40 -0
- package/dist/core/skill-curation/workdir.d.ts.map +1 -0
- package/dist/core/skill-curation/workdir.js +242 -0
- package/dist/core/skill-curation/workdir.js.map +1 -0
- package/dist/core/skills-compiler.d.ts +391 -0
- package/dist/core/skills-compiler.d.ts.map +1 -0
- package/dist/core/skills-compiler.js +1271 -0
- package/dist/core/skills-compiler.js.map +1 -0
- package/dist/core/skills-manifest.d.ts +8 -0
- package/dist/core/skills-manifest.d.ts.map +1 -0
- package/dist/core/skills-manifest.js +408 -0
- package/dist/core/skills-manifest.js.map +1 -0
- package/dist/core/system-reset.d.ts +268 -0
- package/dist/core/system-reset.d.ts.map +1 -0
- package/dist/core/system-reset.js +816 -0
- package/dist/core/system-reset.js.map +1 -0
- package/dist/core/template-store.d.ts +170 -0
- package/dist/core/template-store.d.ts.map +1 -0
- package/dist/core/template-store.js +388 -0
- package/dist/core/template-store.js.map +1 -0
- package/dist/core/template-versions.d.ts +95 -0
- package/dist/core/template-versions.d.ts.map +1 -0
- package/dist/core/template-versions.js +175 -0
- package/dist/core/template-versions.js.map +1 -0
- package/dist/core/today-agent-plan.d.ts +33 -0
- package/dist/core/today-agent-plan.d.ts.map +1 -0
- package/dist/core/today-agent-plan.js +120 -0
- package/dist/core/today-agent-plan.js.map +1 -0
- package/dist/core/today-direct-writer.d.ts +62 -0
- package/dist/core/today-direct-writer.d.ts.map +1 -0
- package/dist/core/today-direct-writer.js +132 -0
- package/dist/core/today-direct-writer.js.map +1 -0
- package/dist/core/today-write-lock.d.ts +89 -0
- package/dist/core/today-write-lock.d.ts.map +1 -0
- package/dist/core/today-write-lock.js +154 -0
- package/dist/core/today-write-lock.js.map +1 -0
- package/dist/core/trigger-dispatch.d.ts +31 -0
- package/dist/core/trigger-dispatch.d.ts.map +1 -0
- package/dist/core/trigger-dispatch.js +100 -0
- package/dist/core/trigger-dispatch.js.map +1 -0
- package/dist/core/trigger-evaluator.d.ts +59 -0
- package/dist/core/trigger-evaluator.d.ts.map +1 -0
- package/dist/core/trigger-evaluator.js +243 -0
- package/dist/core/trigger-evaluator.js.map +1 -0
- package/dist/core/workdir.d.ts +241 -0
- package/dist/core/workdir.d.ts.map +1 -0
- package/dist/core/workdir.js +565 -0
- package/dist/core/workdir.js.map +1 -0
- package/dist/db/automation-triggers.d.ts +90 -0
- package/dist/db/automation-triggers.d.ts.map +1 -0
- package/dist/db/automation-triggers.js +199 -0
- package/dist/db/automation-triggers.js.map +1 -0
- package/dist/db/client.d.ts +6 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +47 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/entities-store.d.ts +92 -0
- package/dist/db/entities-store.d.ts.map +1 -0
- package/dist/db/entities-store.js +180 -0
- package/dist/db/entities-store.js.map +1 -0
- package/dist/db/hourly-check-signals.d.ts +78 -0
- package/dist/db/hourly-check-signals.d.ts.map +1 -0
- package/dist/db/hourly-check-signals.js +289 -0
- package/dist/db/hourly-check-signals.js.map +1 -0
- package/dist/db/integration-probe-store.d.ts +27 -0
- package/dist/db/integration-probe-store.d.ts.map +1 -0
- package/dist/db/integration-probe-store.js +75 -0
- package/dist/db/integration-probe-store.js.map +1 -0
- package/dist/db/integrations-store.d.ts +19 -0
- package/dist/db/integrations-store.d.ts.map +1 -0
- package/dist/db/integrations-store.js +85 -0
- package/dist/db/integrations-store.js.map +1 -0
- package/dist/db/managed-tasks-store.d.ts +130 -0
- package/dist/db/managed-tasks-store.d.ts.map +1 -0
- package/dist/db/managed-tasks-store.js +238 -0
- package/dist/db/managed-tasks-store.js.map +1 -0
- package/dist/db/management-parse-failures-store.d.ts +45 -0
- package/dist/db/management-parse-failures-store.d.ts.map +1 -0
- package/dist/db/management-parse-failures-store.js +36 -0
- package/dist/db/management-parse-failures-store.js.map +1 -0
- package/dist/db/observations.d.ts +145 -0
- package/dist/db/observations.d.ts.map +1 -0
- package/dist/db/observations.js +287 -0
- package/dist/db/observations.js.map +1 -0
- package/dist/db/recurring-schedules.d.ts +70 -0
- package/dist/db/recurring-schedules.d.ts.map +1 -0
- package/dist/db/recurring-schedules.js +213 -0
- package/dist/db/recurring-schedules.js.map +1 -0
- package/dist/db/repositories-store.d.ts +296 -0
- package/dist/db/repositories-store.d.ts.map +1 -0
- package/dist/db/repositories-store.js +754 -0
- package/dist/db/repositories-store.js.map +1 -0
- package/dist/db/runtime-state.d.ts +61 -0
- package/dist/db/runtime-state.d.ts.map +1 -0
- package/dist/db/runtime-state.js +104 -0
- package/dist/db/runtime-state.js.map +1 -0
- package/dist/db/schema.d.ts +4 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +1338 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/sot-bindings-store.d.ts +41 -0
- package/dist/db/sot-bindings-store.d.ts.map +1 -0
- package/dist/db/sot-bindings-store.js +64 -0
- package/dist/db/sot-bindings-store.js.map +1 -0
- package/dist/db/test-schemas.d.ts +23 -0
- package/dist/db/test-schemas.d.ts.map +1 -0
- package/dist/db/test-schemas.js +111 -0
- package/dist/db/test-schemas.js.map +1 -0
- package/dist/db/voice-transcripts-store.d.ts +28 -0
- package/dist/db/voice-transcripts-store.d.ts.map +1 -0
- package/dist/db/voice-transcripts-store.js +43 -0
- package/dist/db/voice-transcripts-store.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2913 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +7 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +32 -0
- package/dist/init.js.map +1 -0
- package/dist/log-buffer.d.ts +71 -0
- package/dist/log-buffer.d.ts.map +1 -0
- package/dist/log-buffer.js +201 -0
- package/dist/log-buffer.js.map +1 -0
- package/dist/logging.d.ts +5 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +130 -0
- package/dist/logging.js.map +1 -0
- package/dist/management-rules.d.ts +2 -0
- package/dist/management-rules.d.ts.map +1 -0
- package/dist/management-rules.js +62 -0
- package/dist/management-rules.js.map +1 -0
- package/dist/messaging/constants.d.ts +33 -0
- package/dist/messaging/constants.d.ts.map +1 -0
- package/dist/messaging/constants.js +52 -0
- package/dist/messaging/constants.js.map +1 -0
- package/dist/messaging/magic-phrase.d.ts +16 -0
- package/dist/messaging/magic-phrase.d.ts.map +1 -0
- package/dist/messaging/magic-phrase.js +103 -0
- package/dist/messaging/magic-phrase.js.map +1 -0
- package/dist/messaging/owner-channels.d.ts +20 -0
- package/dist/messaging/owner-channels.d.ts.map +1 -0
- package/dist/messaging/owner-channels.js +41 -0
- package/dist/messaging/owner-channels.js.map +1 -0
- package/dist/observers/calendar-poller.d.ts +51 -0
- package/dist/observers/calendar-poller.d.ts.map +1 -0
- package/dist/observers/calendar-poller.js +128 -0
- package/dist/observers/calendar-poller.js.map +1 -0
- package/dist/observers/context-index-reconciler-observer.d.ts +72 -0
- package/dist/observers/context-index-reconciler-observer.d.ts.map +1 -0
- package/dist/observers/context-index-reconciler-observer.js +253 -0
- package/dist/observers/context-index-reconciler-observer.js.map +1 -0
- package/dist/observers/delegated-probe-observer.d.ts +83 -0
- package/dist/observers/delegated-probe-observer.d.ts.map +1 -0
- package/dist/observers/delegated-probe-observer.js +237 -0
- package/dist/observers/delegated-probe-observer.js.map +1 -0
- package/dist/observers/delegated-sync-worker.d.ts +375 -0
- package/dist/observers/delegated-sync-worker.d.ts.map +1 -0
- package/dist/observers/delegated-sync-worker.js +1087 -0
- package/dist/observers/delegated-sync-worker.js.map +1 -0
- package/dist/observers/entity-mirror-observer.d.ts +55 -0
- package/dist/observers/entity-mirror-observer.d.ts.map +1 -0
- package/dist/observers/entity-mirror-observer.js +73 -0
- package/dist/observers/entity-mirror-observer.js.map +1 -0
- package/dist/observers/git-delegated-cron.d.ts +41 -0
- package/dist/observers/git-delegated-cron.d.ts.map +1 -0
- package/dist/observers/git-delegated-cron.js +159 -0
- package/dist/observers/git-delegated-cron.js.map +1 -0
- package/dist/observers/git-event-classifier.d.ts +52 -0
- package/dist/observers/git-event-classifier.d.ts.map +1 -0
- package/dist/observers/git-event-classifier.js +70 -0
- package/dist/observers/git-event-classifier.js.map +1 -0
- package/dist/observers/git-watcher.d.ts +162 -0
- package/dist/observers/git-watcher.d.ts.map +1 -0
- package/dist/observers/git-watcher.js +768 -0
- package/dist/observers/git-watcher.js.map +1 -0
- package/dist/observers/github-poller-classifier.d.ts +101 -0
- package/dist/observers/github-poller-classifier.d.ts.map +1 -0
- package/dist/observers/github-poller-classifier.js +199 -0
- package/dist/observers/github-poller-classifier.js.map +1 -0
- package/dist/observers/github-poller.d.ts +291 -0
- package/dist/observers/github-poller.d.ts.map +1 -0
- package/dist/observers/github-poller.js +609 -0
- package/dist/observers/github-poller.js.map +1 -0
- package/dist/observers/imminent-event-scheduler.d.ts +34 -0
- package/dist/observers/imminent-event-scheduler.d.ts.map +1 -0
- package/dist/observers/imminent-event-scheduler.js +125 -0
- package/dist/observers/imminent-event-scheduler.js.map +1 -0
- package/dist/observers/mail-poller.d.ts +133 -0
- package/dist/observers/mail-poller.d.ts.map +1 -0
- package/dist/observers/mail-poller.js +563 -0
- package/dist/observers/mail-poller.js.map +1 -0
- package/dist/observers/mail-reconciliation.d.ts +87 -0
- package/dist/observers/mail-reconciliation.d.ts.map +1 -0
- package/dist/observers/mail-reconciliation.js +241 -0
- package/dist/observers/mail-reconciliation.js.map +1 -0
- package/dist/observers/manager.d.ts +67 -0
- package/dist/observers/manager.d.ts.map +1 -0
- package/dist/observers/manager.js +136 -0
- package/dist/observers/manager.js.map +1 -0
- package/dist/observers/notion-poller.d.ts +43 -0
- package/dist/observers/notion-poller.d.ts.map +1 -0
- package/dist/observers/notion-poller.js +184 -0
- package/dist/observers/notion-poller.js.map +1 -0
- package/dist/observers/observation-summarizer/index.d.ts +13 -0
- package/dist/observers/observation-summarizer/index.d.ts.map +1 -0
- package/dist/observers/observation-summarizer/index.js +13 -0
- package/dist/observers/observation-summarizer/index.js.map +1 -0
- package/dist/observers/observation-summarizer/pre-filter.d.ts +62 -0
- package/dist/observers/observation-summarizer/pre-filter.d.ts.map +1 -0
- package/dist/observers/observation-summarizer/pre-filter.js +189 -0
- package/dist/observers/observation-summarizer/pre-filter.js.map +1 -0
- package/dist/observers/observation-summarizer/response-parser.d.ts +30 -0
- package/dist/observers/observation-summarizer/response-parser.d.ts.map +1 -0
- package/dist/observers/observation-summarizer/response-parser.js +106 -0
- package/dist/observers/observation-summarizer/response-parser.js.map +1 -0
- package/dist/observers/observation-summarizer/summarizer-client.d.ts +83 -0
- package/dist/observers/observation-summarizer/summarizer-client.d.ts.map +1 -0
- package/dist/observers/observation-summarizer/summarizer-client.js +185 -0
- package/dist/observers/observation-summarizer/summarizer-client.js.map +1 -0
- package/dist/observers/observation-summarizer/summarizer-prompts.d.ts +51 -0
- package/dist/observers/observation-summarizer/summarizer-prompts.d.ts.map +1 -0
- package/dist/observers/observation-summarizer/summarizer-prompts.js +286 -0
- package/dist/observers/observation-summarizer/summarizer-prompts.js.map +1 -0
- package/dist/observers/observation-summarizer/worker.d.ts +106 -0
- package/dist/observers/observation-summarizer/worker.d.ts.map +1 -0
- package/dist/observers/observation-summarizer/worker.js +311 -0
- package/dist/observers/observation-summarizer/worker.js.map +1 -0
- package/dist/observers/obsidian-watcher.d.ts +90 -0
- package/dist/observers/obsidian-watcher.d.ts.map +1 -0
- package/dist/observers/obsidian-watcher.js +166 -0
- package/dist/observers/obsidian-watcher.js.map +1 -0
- package/dist/observers/primary-vault-watcher.d.ts +73 -0
- package/dist/observers/primary-vault-watcher.d.ts.map +1 -0
- package/dist/observers/primary-vault-watcher.js +115 -0
- package/dist/observers/primary-vault-watcher.js.map +1 -0
- package/dist/observers/repository-management-cron.d.ts +70 -0
- package/dist/observers/repository-management-cron.d.ts.map +1 -0
- package/dist/observers/repository-management-cron.js +166 -0
- package/dist/observers/repository-management-cron.js.map +1 -0
- package/dist/observers/skill-curation-walker.d.ts +33 -0
- package/dist/observers/skill-curation-walker.d.ts.map +1 -0
- package/dist/observers/skill-curation-walker.js +216 -0
- package/dist/observers/skill-curation-walker.js.map +1 -0
- package/dist/safety/absolute-block-audit.d.ts +22 -0
- package/dist/safety/absolute-block-audit.d.ts.map +1 -0
- package/dist/safety/absolute-block-audit.js +32 -0
- package/dist/safety/absolute-block-audit.js.map +1 -0
- package/dist/safety/agent-write-tracker.d.ts +42 -0
- package/dist/safety/agent-write-tracker.d.ts.map +1 -0
- package/dist/safety/agent-write-tracker.js +82 -0
- package/dist/safety/agent-write-tracker.js.map +1 -0
- package/dist/safety/always-disallowed.d.ts +66 -0
- package/dist/safety/always-disallowed.d.ts.map +1 -0
- package/dist/safety/always-disallowed.js +347 -0
- package/dist/safety/always-disallowed.js.map +1 -0
- package/dist/safety/audit.d.ts +118 -0
- package/dist/safety/audit.d.ts.map +1 -0
- package/dist/safety/audit.js +324 -0
- package/dist/safety/audit.js.map +1 -0
- package/dist/safety/integration-write-tracker.d.ts +58 -0
- package/dist/safety/integration-write-tracker.d.ts.map +1 -0
- package/dist/safety/integration-write-tracker.js +41 -0
- package/dist/safety/integration-write-tracker.js.map +1 -0
- package/dist/safety/risk-classifier.d.ts +65 -0
- package/dist/safety/risk-classifier.d.ts.map +1 -0
- package/dist/safety/risk-classifier.js +763 -0
- package/dist/safety/risk-classifier.js.map +1 -0
- package/dist/scheduler/hourly-check-gate.d.ts +73 -0
- package/dist/scheduler/hourly-check-gate.d.ts.map +1 -0
- package/dist/scheduler/hourly-check-gate.js +128 -0
- package/dist/scheduler/hourly-check-gate.js.map +1 -0
- package/dist/secrets/backend-api-key-env.d.ts +104 -0
- package/dist/secrets/backend-api-key-env.d.ts.map +1 -0
- package/dist/secrets/backend-api-key-env.js +197 -0
- package/dist/secrets/backend-api-key-env.js.map +1 -0
- package/dist/secrets/codex-home-materializer.d.ts +35 -0
- package/dist/secrets/codex-home-materializer.d.ts.map +1 -0
- package/dist/secrets/codex-home-materializer.js +76 -0
- package/dist/secrets/codex-home-materializer.js.map +1 -0
- package/dist/secrets/encrypted-blob-store.d.ts +20 -0
- package/dist/secrets/encrypted-blob-store.d.ts.map +1 -0
- package/dist/secrets/encrypted-blob-store.js +80 -0
- package/dist/secrets/encrypted-blob-store.js.map +1 -0
- package/dist/secrets/platform-secret-store.d.ts +17 -0
- package/dist/secrets/platform-secret-store.d.ts.map +1 -0
- package/dist/secrets/platform-secret-store.js +37 -0
- package/dist/secrets/platform-secret-store.js.map +1 -0
- package/dist/secrets/redaction.d.ts +2 -0
- package/dist/secrets/redaction.d.ts.map +1 -0
- package/dist/secrets/redaction.js +2 -0
- package/dist/secrets/redaction.js.map +1 -0
- package/dist/secrets/secret-broker.d.ts +61 -0
- package/dist/secrets/secret-broker.d.ts.map +1 -0
- package/dist/secrets/secret-broker.js +160 -0
- package/dist/secrets/secret-broker.js.map +1 -0
- package/dist/secrets/secret-names.d.ts +34 -0
- package/dist/secrets/secret-names.d.ts.map +1 -0
- package/dist/secrets/secret-names.js +39 -0
- package/dist/secrets/secret-names.js.map +1 -0
- package/dist/secrets/secret-store.d.ts +8 -0
- package/dist/secrets/secret-store.d.ts.map +1 -0
- package/dist/secrets/secret-store.js +2 -0
- package/dist/secrets/secret-store.js.map +1 -0
- package/dist/secrets/types.d.ts +7 -0
- package/dist/secrets/types.d.ts.map +1 -0
- package/dist/secrets/types.js +2 -0
- package/dist/secrets/types.js.map +1 -0
- package/dist/services/apple-calendar/caldav-client.d.ts +48 -0
- package/dist/services/apple-calendar/caldav-client.d.ts.map +1 -0
- package/dist/services/apple-calendar/caldav-client.js +86 -0
- package/dist/services/apple-calendar/caldav-client.js.map +1 -0
- package/dist/services/apple-calendar/caldav-codec.d.ts +67 -0
- package/dist/services/apple-calendar/caldav-codec.d.ts.map +1 -0
- package/dist/services/apple-calendar/caldav-codec.js +341 -0
- package/dist/services/apple-calendar/caldav-codec.js.map +1 -0
- package/dist/services/apple-calendar/index.d.ts +3 -0
- package/dist/services/apple-calendar/index.d.ts.map +1 -0
- package/dist/services/apple-calendar/index.js +2 -0
- package/dist/services/apple-calendar/index.js.map +1 -0
- package/dist/services/apple-calendar/service.d.ts +75 -0
- package/dist/services/apple-calendar/service.d.ts.map +1 -0
- package/dist/services/apple-calendar/service.js +374 -0
- package/dist/services/apple-calendar/service.js.map +1 -0
- package/dist/services/apple-calendar/types.d.ts +78 -0
- package/dist/services/apple-calendar/types.d.ts.map +1 -0
- package/dist/services/apple-calendar/types.js +17 -0
- package/dist/services/apple-calendar/types.js.map +1 -0
- package/dist/services/attachments/hardlink.d.ts +11 -0
- package/dist/services/attachments/hardlink.d.ts.map +1 -0
- package/dist/services/attachments/hardlink.js +56 -0
- package/dist/services/attachments/hardlink.js.map +1 -0
- package/dist/services/attachments/sanitize.d.ts +21 -0
- package/dist/services/attachments/sanitize.d.ts.map +1 -0
- package/dist/services/attachments/sanitize.js +128 -0
- package/dist/services/attachments/sanitize.js.map +1 -0
- package/dist/services/attachments/store.d.ts +146 -0
- package/dist/services/attachments/store.d.ts.map +1 -0
- package/dist/services/attachments/store.js +477 -0
- package/dist/services/attachments/store.js.map +1 -0
- package/dist/services/calendar/outlook/graph-calendar-client.d.ts +114 -0
- package/dist/services/calendar/outlook/graph-calendar-client.d.ts.map +1 -0
- package/dist/services/calendar/outlook/graph-calendar-client.js +146 -0
- package/dist/services/calendar/outlook/graph-calendar-client.js.map +1 -0
- package/dist/services/calendar.d.ts +115 -0
- package/dist/services/calendar.d.ts.map +1 -0
- package/dist/services/calendar.js +281 -0
- package/dist/services/calendar.js.map +1 -0
- package/dist/services/delegated-backend-invoker.d.ts +414 -0
- package/dist/services/delegated-backend-invoker.d.ts.map +1 -0
- package/dist/services/delegated-backend-invoker.js +2372 -0
- package/dist/services/delegated-backend-invoker.js.map +1 -0
- package/dist/services/delegated-proxy-config.d.ts +93 -0
- package/dist/services/delegated-proxy-config.d.ts.map +1 -0
- package/dist/services/delegated-proxy-config.js +98 -0
- package/dist/services/delegated-proxy-config.js.map +1 -0
- package/dist/services/delegated-task-result-cache.d.ts +176 -0
- package/dist/services/delegated-task-result-cache.d.ts.map +1 -0
- package/dist/services/delegated-task-result-cache.js +0 -0
- package/dist/services/delegated-task-result-cache.js.map +1 -0
- package/dist/services/delegated-task-runtime.d.ts +346 -0
- package/dist/services/delegated-task-runtime.d.ts.map +1 -0
- package/dist/services/delegated-task-runtime.js +589 -0
- package/dist/services/delegated-task-runtime.js.map +1 -0
- package/dist/services/delegated-task-session-pool.d.ts +182 -0
- package/dist/services/delegated-task-session-pool.d.ts.map +1 -0
- package/dist/services/delegated-task-session-pool.js +292 -0
- package/dist/services/delegated-task-session-pool.js.map +1 -0
- package/dist/services/delegated-tool-runtime.d.ts +50 -0
- package/dist/services/delegated-tool-runtime.d.ts.map +1 -0
- package/dist/services/delegated-tool-runtime.js +120 -0
- package/dist/services/delegated-tool-runtime.js.map +1 -0
- package/dist/services/fts5.d.ts +40 -0
- package/dist/services/fts5.d.ts.map +1 -0
- package/dist/services/fts5.js +54 -0
- package/dist/services/fts5.js.map +1 -0
- package/dist/services/git-account-registry.d.ts +164 -0
- package/dist/services/git-account-registry.d.ts.map +1 -0
- package/dist/services/git-account-registry.js +297 -0
- package/dist/services/git-account-registry.js.map +1 -0
- package/dist/services/github.d.ts +49 -0
- package/dist/services/github.d.ts.map +1 -0
- package/dist/services/github.js +123 -0
- package/dist/services/github.js.map +1 -0
- package/dist/services/gmail-classifier.d.ts +62 -0
- package/dist/services/gmail-classifier.d.ts.map +1 -0
- package/dist/services/gmail-classifier.js +221 -0
- package/dist/services/gmail-classifier.js.map +1 -0
- package/dist/services/gmail.d.ts +192 -0
- package/dist/services/gmail.d.ts.map +1 -0
- package/dist/services/gmail.js +678 -0
- package/dist/services/gmail.js.map +1 -0
- package/dist/services/google-auth.d.ts +16 -0
- package/dist/services/google-auth.d.ts.map +1 -0
- package/dist/services/google-auth.js +37 -0
- package/dist/services/google-auth.js.map +1 -0
- package/dist/services/google-maps.d.ts +35 -0
- package/dist/services/google-maps.d.ts.map +1 -0
- package/dist/services/google-maps.js +82 -0
- package/dist/services/google-maps.js.map +1 -0
- package/dist/services/integrations/extract-write-item-id.d.ts +64 -0
- package/dist/services/integrations/extract-write-item-id.d.ts.map +1 -0
- package/dist/services/integrations/extract-write-item-id.js +188 -0
- package/dist/services/integrations/extract-write-item-id.js.map +1 -0
- package/dist/services/integrations/reconcile.d.ts +136 -0
- package/dist/services/integrations/reconcile.d.ts.map +1 -0
- package/dist/services/integrations/reconcile.js +218 -0
- package/dist/services/integrations/reconcile.js.map +1 -0
- package/dist/services/integrations/snapshot-partitions.d.ts +40 -0
- package/dist/services/integrations/snapshot-partitions.d.ts.map +1 -0
- package/dist/services/integrations/snapshot-partitions.js +113 -0
- package/dist/services/integrations/snapshot-partitions.js.map +1 -0
- package/dist/services/journal/render.d.ts +15 -0
- package/dist/services/journal/render.d.ts.map +1 -0
- package/dist/services/journal/render.js +17 -0
- package/dist/services/journal/render.js.map +1 -0
- package/dist/services/journal/writer.d.ts +26 -0
- package/dist/services/journal/writer.d.ts.map +1 -0
- package/dist/services/journal/writer.js +50 -0
- package/dist/services/journal/writer.js.map +1 -0
- package/dist/services/mail/account-registry.d.ts +208 -0
- package/dist/services/mail/account-registry.d.ts.map +1 -0
- package/dist/services/mail/account-registry.js +554 -0
- package/dist/services/mail/account-registry.js.map +1 -0
- package/dist/services/mail/gmail/auth-failure-classifier.d.ts +24 -0
- package/dist/services/mail/gmail/auth-failure-classifier.d.ts.map +1 -0
- package/dist/services/mail/gmail/auth-failure-classifier.js +67 -0
- package/dist/services/mail/gmail/auth-failure-classifier.js.map +1 -0
- package/dist/services/mail/gmail/gmail-provider.d.ts +58 -0
- package/dist/services/mail/gmail/gmail-provider.d.ts.map +1 -0
- package/dist/services/mail/gmail/gmail-provider.js +434 -0
- package/dist/services/mail/gmail/gmail-provider.js.map +1 -0
- package/dist/services/mail/gmail/legacy-row.d.ts +24 -0
- package/dist/services/mail/gmail/legacy-row.d.ts.map +1 -0
- package/dist/services/mail/gmail/legacy-row.js +71 -0
- package/dist/services/mail/gmail/legacy-row.js.map +1 -0
- package/dist/services/mail/gmail/poll-cursor.d.ts +12 -0
- package/dist/services/mail/gmail/poll-cursor.d.ts.map +1 -0
- package/dist/services/mail/gmail/poll-cursor.js +32 -0
- package/dist/services/mail/gmail/poll-cursor.js.map +1 -0
- package/dist/services/mail/html-to-plaintext.d.ts +27 -0
- package/dist/services/mail/html-to-plaintext.d.ts.map +1 -0
- package/dist/services/mail/html-to-plaintext.js +163 -0
- package/dist/services/mail/html-to-plaintext.js.map +1 -0
- package/dist/services/mail/imap/app-password.d.ts +27 -0
- package/dist/services/mail/imap/app-password.d.ts.map +1 -0
- package/dist/services/mail/imap/app-password.js +86 -0
- package/dist/services/mail/imap/app-password.js.map +1 -0
- package/dist/services/mail/imap/auth-failure-classifier.d.ts +21 -0
- package/dist/services/mail/imap/auth-failure-classifier.d.ts.map +1 -0
- package/dist/services/mail/imap/auth-failure-classifier.js +54 -0
- package/dist/services/mail/imap/auth-failure-classifier.js.map +1 -0
- package/dist/services/mail/imap/capabilities.d.ts +30 -0
- package/dist/services/mail/imap/capabilities.d.ts.map +1 -0
- package/dist/services/mail/imap/capabilities.js +70 -0
- package/dist/services/mail/imap/capabilities.js.map +1 -0
- package/dist/services/mail/imap/client.d.ts +15 -0
- package/dist/services/mail/imap/client.d.ts.map +1 -0
- package/dist/services/mail/imap/client.js +60 -0
- package/dist/services/mail/imap/client.js.map +1 -0
- package/dist/services/mail/imap/cursor.d.ts +19 -0
- package/dist/services/mail/imap/cursor.d.ts.map +1 -0
- package/dist/services/mail/imap/cursor.js +47 -0
- package/dist/services/mail/imap/cursor.js.map +1 -0
- package/dist/services/mail/imap/folder-resolver.d.ts +24 -0
- package/dist/services/mail/imap/folder-resolver.d.ts.map +1 -0
- package/dist/services/mail/imap/folder-resolver.js +58 -0
- package/dist/services/mail/imap/folder-resolver.js.map +1 -0
- package/dist/services/mail/imap/icloud-provider.d.ts +5 -0
- package/dist/services/mail/imap/icloud-provider.d.ts.map +1 -0
- package/dist/services/mail/imap/icloud-provider.js +5 -0
- package/dist/services/mail/imap/icloud-provider.js.map +1 -0
- package/dist/services/mail/imap/imap-provider-base.d.ts +173 -0
- package/dist/services/mail/imap/imap-provider-base.d.ts.map +1 -0
- package/dist/services/mail/imap/imap-provider-base.js +1004 -0
- package/dist/services/mail/imap/imap-provider-base.js.map +1 -0
- package/dist/services/mail/imap/query-translator.d.ts +13 -0
- package/dist/services/mail/imap/query-translator.d.ts.map +1 -0
- package/dist/services/mail/imap/query-translator.js +114 -0
- package/dist/services/mail/imap/query-translator.js.map +1 -0
- package/dist/services/mail/imap/reconcile-planner.d.ts +56 -0
- package/dist/services/mail/imap/reconcile-planner.d.ts.map +1 -0
- package/dist/services/mail/imap/reconcile-planner.js +52 -0
- package/dist/services/mail/imap/reconcile-planner.js.map +1 -0
- package/dist/services/mail/imap/reply-mime.d.ts +24 -0
- package/dist/services/mail/imap/reply-mime.d.ts.map +1 -0
- package/dist/services/mail/imap/reply-mime.js +77 -0
- package/dist/services/mail/imap/reply-mime.js.map +1 -0
- package/dist/services/mail/imap/yahoo-provider.d.ts +5 -0
- package/dist/services/mail/imap/yahoo-provider.d.ts.map +1 -0
- package/dist/services/mail/imap/yahoo-provider.js +5 -0
- package/dist/services/mail/imap/yahoo-provider.js.map +1 -0
- package/dist/services/mail/mail-search.d.ts +35 -0
- package/dist/services/mail/mail-search.d.ts.map +1 -0
- package/dist/services/mail/mail-search.js +59 -0
- package/dist/services/mail/mail-search.js.map +1 -0
- package/dist/services/mail/outlook/auth-failure-classifier.d.ts +38 -0
- package/dist/services/mail/outlook/auth-failure-classifier.d.ts.map +1 -0
- package/dist/services/mail/outlook/auth-failure-classifier.js +91 -0
- package/dist/services/mail/outlook/auth-failure-classifier.js.map +1 -0
- package/dist/services/mail/outlook/client-config.d.ts +34 -0
- package/dist/services/mail/outlook/client-config.d.ts.map +1 -0
- package/dist/services/mail/outlook/client-config.js +58 -0
- package/dist/services/mail/outlook/client-config.js.map +1 -0
- package/dist/services/mail/outlook/delta-cursor.d.ts +66 -0
- package/dist/services/mail/outlook/delta-cursor.d.ts.map +1 -0
- package/dist/services/mail/outlook/delta-cursor.js +85 -0
- package/dist/services/mail/outlook/delta-cursor.js.map +1 -0
- package/dist/services/mail/outlook/graph-client.d.ts +98 -0
- package/dist/services/mail/outlook/graph-client.d.ts.map +1 -0
- package/dist/services/mail/outlook/graph-client.js +198 -0
- package/dist/services/mail/outlook/graph-client.js.map +1 -0
- package/dist/services/mail/outlook/msal-app-factory.d.ts +20 -0
- package/dist/services/mail/outlook/msal-app-factory.d.ts.map +1 -0
- package/dist/services/mail/outlook/msal-app-factory.js +62 -0
- package/dist/services/mail/outlook/msal-app-factory.js.map +1 -0
- package/dist/services/mail/outlook/msal-cache-plugin.d.ts +19 -0
- package/dist/services/mail/outlook/msal-cache-plugin.d.ts.map +1 -0
- package/dist/services/mail/outlook/msal-cache-plugin.js +30 -0
- package/dist/services/mail/outlook/msal-cache-plugin.js.map +1 -0
- package/dist/services/mail/outlook/oauth-device-code.d.ts +26 -0
- package/dist/services/mail/outlook/oauth-device-code.d.ts.map +1 -0
- package/dist/services/mail/outlook/oauth-device-code.js +32 -0
- package/dist/services/mail/outlook/oauth-device-code.js.map +1 -0
- package/dist/services/mail/outlook/oauth-loopback.d.ts +41 -0
- package/dist/services/mail/outlook/oauth-loopback.d.ts.map +1 -0
- package/dist/services/mail/outlook/oauth-loopback.js +223 -0
- package/dist/services/mail/outlook/oauth-loopback.js.map +1 -0
- package/dist/services/mail/outlook/outlook-provider.d.ts +100 -0
- package/dist/services/mail/outlook/outlook-provider.d.ts.map +1 -0
- package/dist/services/mail/outlook/outlook-provider.js +619 -0
- package/dist/services/mail/outlook/outlook-provider.js.map +1 -0
- package/dist/services/mail/outlook/query-translator.d.ts +10 -0
- package/dist/services/mail/outlook/query-translator.d.ts.map +1 -0
- package/dist/services/mail/outlook/query-translator.js +103 -0
- package/dist/services/mail/outlook/query-translator.js.map +1 -0
- package/dist/services/mail/provider.d.ts +267 -0
- package/dist/services/mail/provider.d.ts.map +1 -0
- package/dist/services/mail/provider.js +34 -0
- package/dist/services/mail/provider.js.map +1 -0
- package/dist/services/mail/query-utils.d.ts +13 -0
- package/dist/services/mail/query-utils.d.ts.map +1 -0
- package/dist/services/mail/query-utils.js +18 -0
- package/dist/services/mail/query-utils.js.map +1 -0
- package/dist/services/mail-classifier.d.ts +25 -0
- package/dist/services/mail-classifier.d.ts.map +1 -0
- package/dist/services/mail-classifier.js +52 -0
- package/dist/services/mail-classifier.js.map +1 -0
- package/dist/services/mail-ingestion.d.ts +139 -0
- package/dist/services/mail-ingestion.d.ts.map +1 -0
- package/dist/services/mail-ingestion.js +223 -0
- package/dist/services/mail-ingestion.js.map +1 -0
- package/dist/services/mcp/auto-probe.d.ts +76 -0
- package/dist/services/mcp/auto-probe.d.ts.map +1 -0
- package/dist/services/mcp/auto-probe.js +147 -0
- package/dist/services/mcp/auto-probe.js.map +1 -0
- package/dist/services/mcp/generators/claude.d.ts +18 -0
- package/dist/services/mcp/generators/claude.d.ts.map +1 -0
- package/dist/services/mcp/generators/claude.js +90 -0
- package/dist/services/mcp/generators/claude.js.map +1 -0
- package/dist/services/mcp/generators/codex.d.ts +22 -0
- package/dist/services/mcp/generators/codex.d.ts.map +1 -0
- package/dist/services/mcp/generators/codex.js +102 -0
- package/dist/services/mcp/generators/codex.js.map +1 -0
- package/dist/services/mcp/generators/gemini.d.ts +20 -0
- package/dist/services/mcp/generators/gemini.d.ts.map +1 -0
- package/dist/services/mcp/generators/gemini.js +97 -0
- package/dist/services/mcp/generators/gemini.js.map +1 -0
- package/dist/services/mcp/generators/index.d.ts +20 -0
- package/dist/services/mcp/generators/index.d.ts.map +1 -0
- package/dist/services/mcp/generators/index.js +29 -0
- package/dist/services/mcp/generators/index.js.map +1 -0
- package/dist/services/mcp/generators/types.d.ts +47 -0
- package/dist/services/mcp/generators/types.d.ts.map +1 -0
- package/dist/services/mcp/generators/types.js +40 -0
- package/dist/services/mcp/generators/types.js.map +1 -0
- package/dist/services/mcp/probe.d.ts +31 -0
- package/dist/services/mcp/probe.d.ts.map +1 -0
- package/dist/services/mcp/probe.js +437 -0
- package/dist/services/mcp/probe.js.map +1 -0
- package/dist/services/mcp/registry.d.ts +84 -0
- package/dist/services/mcp/registry.d.ts.map +1 -0
- package/dist/services/mcp/registry.js +387 -0
- package/dist/services/mcp/registry.js.map +1 -0
- package/dist/services/mcp/risk.d.ts +82 -0
- package/dist/services/mcp/risk.d.ts.map +1 -0
- package/dist/services/mcp/risk.js +126 -0
- package/dist/services/mcp/risk.js.map +1 -0
- package/dist/services/mcp/session-materializer.d.ts +123 -0
- package/dist/services/mcp/session-materializer.d.ts.map +1 -0
- package/dist/services/mcp/session-materializer.js +361 -0
- package/dist/services/mcp/session-materializer.js.map +1 -0
- package/dist/services/mcp/tool-audit.d.ts +53 -0
- package/dist/services/mcp/tool-audit.d.ts.map +1 -0
- package/dist/services/mcp/tool-audit.js +74 -0
- package/dist/services/mcp/tool-audit.js.map +1 -0
- package/dist/services/mcp/types.d.ts +88 -0
- package/dist/services/mcp/types.d.ts.map +1 -0
- package/dist/services/mcp/types.js +94 -0
- package/dist/services/mcp/types.js.map +1 -0
- package/dist/services/notion.d.ts +134 -0
- package/dist/services/notion.d.ts.map +1 -0
- package/dist/services/notion.js +350 -0
- package/dist/services/notion.js.map +1 -0
- package/dist/services/obsidian.d.ts +116 -0
- package/dist/services/obsidian.d.ts.map +1 -0
- package/dist/services/obsidian.js +305 -0
- package/dist/services/obsidian.js.map +1 -0
- package/dist/services/service-registry.d.ts +31 -0
- package/dist/services/service-registry.d.ts.map +1 -0
- package/dist/services/service-registry.js +15 -0
- package/dist/services/service-registry.js.map +1 -0
- package/dist/services/voice/transcriber-impl.d.ts +15 -0
- package/dist/services/voice/transcriber-impl.d.ts.map +1 -0
- package/dist/services/voice/transcriber-impl.js +129 -0
- package/dist/services/voice/transcriber-impl.js.map +1 -0
- package/dist/services/voice/transcriber.d.ts +117 -0
- package/dist/services/voice/transcriber.d.ts.map +1 -0
- package/dist/services/voice/transcriber.js +201 -0
- package/dist/services/voice/transcriber.js.map +1 -0
- package/dist/settings/runtime-settings.d.ts +232 -0
- package/dist/settings/runtime-settings.d.ts.map +1 -0
- package/dist/settings/runtime-settings.js +769 -0
- package/dist/settings/runtime-settings.js.map +1 -0
- package/dist/settings/settings-store.d.ts +13 -0
- package/dist/settings/settings-store.d.ts.map +1 -0
- package/dist/settings/settings-store.js +87 -0
- package/dist/settings/settings-store.js.map +1 -0
- package/package.json +85 -0
|
@@ -0,0 +1,1216 @@
|
|
|
1
|
+
import { mkdirSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { Readable } from "node:stream";
|
|
4
|
+
import { EventPriority, createEvent } from "@aitne/shared";
|
|
5
|
+
import { createLogger } from "../logging.js";
|
|
6
|
+
import { filenameForMime, splitOutboundText } from "./outbound-text.js";
|
|
7
|
+
// Per-type WhatsApp inbound size caps (symmetric with server limits).
|
|
8
|
+
const WA_IMAGE_MAX_BYTES = 5 * 1024 * 1024;
|
|
9
|
+
const WA_AUDIO_MAX_BYTES = 16 * 1024 * 1024;
|
|
10
|
+
const WA_VIDEO_MAX_BYTES = 16 * 1024 * 1024;
|
|
11
|
+
const WA_DOCUMENT_MAX_BYTES = 100 * 1024 * 1024;
|
|
12
|
+
const WA_CAPTION_MAX_CHARS = 1024;
|
|
13
|
+
const logger = createLogger("whatsapp-adapter");
|
|
14
|
+
const OWNER_PHONE_RE = /^\+\d{8,15}$/;
|
|
15
|
+
const USER_JID_SUFFIX = "@s.whatsapp.net";
|
|
16
|
+
const LID_JID_SUFFIX = "@lid";
|
|
17
|
+
const HOSTED_LID_JID_SUFFIX = "@hosted.lid";
|
|
18
|
+
const QR_FILENAME = "qr.txt";
|
|
19
|
+
const QR_TTL_MS = 90_000;
|
|
20
|
+
const OUTBOUND_CHUNK_SIZE = 4000;
|
|
21
|
+
const PRESENCE_REFRESH_MS = 8_000;
|
|
22
|
+
/**
|
|
23
|
+
* How long a successfully-resolved WhatsApp Web client version is cached
|
|
24
|
+
* before we re-fetch from the upstream sources. WhatsApp updates web.whatsapp
|
|
25
|
+
* .com on a roughly weekly cadence, so 12 hours is small enough to keep us
|
|
26
|
+
* out of the "stale → 405" failure mode but large enough to avoid hammering
|
|
27
|
+
* the CDN on every reconnect.
|
|
28
|
+
*/
|
|
29
|
+
const WA_VERSION_TTL_MS = 12 * 60 * 60 * 1000;
|
|
30
|
+
/**
|
|
31
|
+
* Reconnect tunables. Initial 1 s, double per attempt, cap at 60 s, plus a
|
|
32
|
+
* small jitter so multiple processes restarting simultaneously do not
|
|
33
|
+
* thunder-herd WhatsApp's relay servers. After RECONNECT_MAX_ATTEMPTS
|
|
34
|
+
* consecutive failures we surface an error state and stop retrying — hammering
|
|
35
|
+
* a relay that keeps closing us is the fast path to an IP-level ban.
|
|
36
|
+
*/
|
|
37
|
+
const RECONNECT_INITIAL_DELAY_MS = 1_000;
|
|
38
|
+
const RECONNECT_MAX_DELAY_MS = 60_000;
|
|
39
|
+
const RECONNECT_BACKOFF_FACTOR = 2;
|
|
40
|
+
const RECONNECT_JITTER_MS = 500;
|
|
41
|
+
const RECONNECT_MAX_ATTEMPTS = 10;
|
|
42
|
+
/**
|
|
43
|
+
* Disconnect codes that mean the user must take action — re-pair, fix a
|
|
44
|
+
* conflicting device, or contact WhatsApp. There is no point reconnecting on
|
|
45
|
+
* any of these; we transition straight to "logged_out" and stop the loop.
|
|
46
|
+
*
|
|
47
|
+
* 401 — DisconnectReason.loggedOut
|
|
48
|
+
* 403 — DisconnectReason.forbidden (account banned / IP blocked)
|
|
49
|
+
* 411 — DisconnectReason.multideviceMismatch (linked-device conflict)
|
|
50
|
+
*/
|
|
51
|
+
const UNRECOVERABLE_STATUS_CODES = new Set([401, 403, 411]);
|
|
52
|
+
/**
|
|
53
|
+
* Disconnect codes that indicate WhatsApp rejected our **client version**
|
|
54
|
+
* during the noise handshake. The fix is to re-fetch the latest WA Web
|
|
55
|
+
* version from upstream and try again — but the symptom is identical to a
|
|
56
|
+
* generic close, so we both invalidate the version cache here AND let the
|
|
57
|
+
* reconnect backoff handle the retry.
|
|
58
|
+
*
|
|
59
|
+
* 405 — Method Not Allowed (Boom-wrapped from the noise frame decoder)
|
|
60
|
+
* 515 — DisconnectReason.restartRequired (server asked us to restart)
|
|
61
|
+
*/
|
|
62
|
+
const VERSION_REJECTED_STATUS_CODES = new Set([405, 515]);
|
|
63
|
+
/**
|
|
64
|
+
* Maximum number of recently-sent WAMessage IDs we keep in memory for echo
|
|
65
|
+
* deduplication. Each entry is ~40 chars; the cap is the sustained outbound
|
|
66
|
+
* burst we tolerate before falling off the trailing edge of the FIFO ring.
|
|
67
|
+
* 256 covers ~8 minutes of one-message-per-2-seconds activity, well beyond
|
|
68
|
+
* normal pacing.
|
|
69
|
+
*/
|
|
70
|
+
const SENT_MESSAGE_ID_CAP = 256;
|
|
71
|
+
export function toWhatsAppJid(phone) {
|
|
72
|
+
if (!OWNER_PHONE_RE.test(phone)) {
|
|
73
|
+
throw new Error(`Invalid WhatsApp owner phone "${phone}". Expected E.164 format like +818012345678`);
|
|
74
|
+
}
|
|
75
|
+
return `${phone.slice(1)}${USER_JID_SUFFIX}`;
|
|
76
|
+
}
|
|
77
|
+
function normalizeWhatsAppUserJid(jid) {
|
|
78
|
+
if (typeof jid !== "string")
|
|
79
|
+
return null;
|
|
80
|
+
const at = jid.indexOf("@");
|
|
81
|
+
if (at <= 0)
|
|
82
|
+
return null;
|
|
83
|
+
const local = jid.slice(0, at);
|
|
84
|
+
const server = jid.slice(at + 1);
|
|
85
|
+
const user = local.split(":")[0]?.split("_")[0];
|
|
86
|
+
if (!user || !server)
|
|
87
|
+
return null;
|
|
88
|
+
return `${user}@${server}`;
|
|
89
|
+
}
|
|
90
|
+
function isDirectUserJid(jid) {
|
|
91
|
+
const normalized = normalizeWhatsAppUserJid(jid);
|
|
92
|
+
return normalized !== null
|
|
93
|
+
&& (normalized.endsWith(USER_JID_SUFFIX)
|
|
94
|
+
|| normalized.endsWith(LID_JID_SUFFIX)
|
|
95
|
+
|| normalized.endsWith(HOSTED_LID_JID_SUFFIX));
|
|
96
|
+
}
|
|
97
|
+
export function extractWhatsAppText(message) {
|
|
98
|
+
if (!message)
|
|
99
|
+
return null;
|
|
100
|
+
const direct = message.conversation;
|
|
101
|
+
if (typeof direct === "string" && direct.trim()) {
|
|
102
|
+
return direct;
|
|
103
|
+
}
|
|
104
|
+
const extended = message.extendedTextMessage?.text;
|
|
105
|
+
if (typeof extended === "string" && extended.trim()) {
|
|
106
|
+
return extended;
|
|
107
|
+
}
|
|
108
|
+
const nestedKeys = [
|
|
109
|
+
"ephemeralMessage",
|
|
110
|
+
"viewOnceMessage",
|
|
111
|
+
"viewOnceMessageV2",
|
|
112
|
+
"viewOnceMessageV2Extension",
|
|
113
|
+
"documentWithCaptionMessage",
|
|
114
|
+
];
|
|
115
|
+
for (const key of nestedKeys) {
|
|
116
|
+
const nested = message[key];
|
|
117
|
+
const nestedText = extractWhatsAppText(nested?.message);
|
|
118
|
+
if (nestedText) {
|
|
119
|
+
return nestedText;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
function parseMediaLength(value) {
|
|
125
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
126
|
+
return value;
|
|
127
|
+
if (typeof value === "bigint")
|
|
128
|
+
return Number(value);
|
|
129
|
+
if (typeof value === "string") {
|
|
130
|
+
const parsed = Number(value);
|
|
131
|
+
return Number.isFinite(parsed) ? parsed : 0;
|
|
132
|
+
}
|
|
133
|
+
if (value && typeof value === "object" && typeof value.toString === "function") {
|
|
134
|
+
const parsed = Number(value.toString());
|
|
135
|
+
return Number.isFinite(parsed) ? parsed : 0;
|
|
136
|
+
}
|
|
137
|
+
return 0;
|
|
138
|
+
}
|
|
139
|
+
function unwrapWhatsAppMessage(message) {
|
|
140
|
+
let current = message;
|
|
141
|
+
for (let i = 0; i < 5; i += 1) {
|
|
142
|
+
if (!current)
|
|
143
|
+
return null;
|
|
144
|
+
const wrapper = current.ephemeralMessage
|
|
145
|
+
?? current.viewOnceMessage
|
|
146
|
+
?? current.viewOnceMessageV2
|
|
147
|
+
?? current.viewOnceMessageV2Extension
|
|
148
|
+
?? current.documentWithCaptionMessage;
|
|
149
|
+
if (!wrapper?.message)
|
|
150
|
+
return current;
|
|
151
|
+
current = wrapper.message;
|
|
152
|
+
}
|
|
153
|
+
/* v8 ignore next 2 — only reached with > 5 wrapper levels (not seen in practice) */
|
|
154
|
+
return current;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* WhatsAppAdapter — Baileys-based owner-only WhatsApp DM integration.
|
|
158
|
+
*
|
|
159
|
+
* Phase 1 accepts messages from exactly one configured owner JID.
|
|
160
|
+
*/
|
|
161
|
+
export class WhatsAppAdapter {
|
|
162
|
+
platformName = "whatsapp";
|
|
163
|
+
primaryRecipient;
|
|
164
|
+
authDir;
|
|
165
|
+
onMessage;
|
|
166
|
+
onLoggedOut;
|
|
167
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
168
|
+
sock = null;
|
|
169
|
+
authState = null;
|
|
170
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
171
|
+
makeWASocket = null;
|
|
172
|
+
renderQr = null;
|
|
173
|
+
renderQrToDataUrl = null;
|
|
174
|
+
fetchLatestWaWebVersion = null;
|
|
175
|
+
fetchLatestBaileysVersion = null;
|
|
176
|
+
generateMessageId = null;
|
|
177
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
178
|
+
downloadMediaMessage = null;
|
|
179
|
+
attachmentStore;
|
|
180
|
+
/**
|
|
181
|
+
* WhatsApp now often addresses the owner's own account as an LID
|
|
182
|
+
* (`<opaque>@lid`) instead of a phone-number JID. We learn that alias from
|
|
183
|
+
* auth creds and treat it as equivalent to the configured owner phone.
|
|
184
|
+
*/
|
|
185
|
+
ownerLidRecipient = null;
|
|
186
|
+
/**
|
|
187
|
+
* IDs of WAMessages this adapter has sent on the current Baileys socket.
|
|
188
|
+
* Used to filter Baileys' echo of our own outbound messages out of the
|
|
189
|
+
* incoming `messages.upsert` stream — see {@link handleIncomingMessage}.
|
|
190
|
+
* Bounded to {@link SENT_MESSAGE_ID_CAP} entries with FIFO eviction so a
|
|
191
|
+
* runaway send loop can never grow this unbounded.
|
|
192
|
+
*/
|
|
193
|
+
sentMessageIds = new Set();
|
|
194
|
+
loggedOutCode = null;
|
|
195
|
+
connectionState = "disabled";
|
|
196
|
+
shuttingDown = false;
|
|
197
|
+
/**
|
|
198
|
+
* Set while we are intentionally tearing down the current Baileys socket
|
|
199
|
+
* (closeSocket → sock.end() → synchronous `connection.update` re-entry).
|
|
200
|
+
* Without this flag, the close handler would treat the close as a network
|
|
201
|
+
* failure and schedule a reconnect, racing against the legitimate next
|
|
202
|
+
* `connect()` call and ultimately causing WhatsApp to reject one of the
|
|
203
|
+
* sessions with `stream:error type="replaced"` (conflict).
|
|
204
|
+
*/
|
|
205
|
+
intentionalClose = false;
|
|
206
|
+
reconnectTimer = null;
|
|
207
|
+
qrExpiryTimer = null;
|
|
208
|
+
latestQr = null;
|
|
209
|
+
lastError = null;
|
|
210
|
+
reconnectAttempts = 0;
|
|
211
|
+
cachedWAVersion = null;
|
|
212
|
+
cachedWAVersionAt = 0;
|
|
213
|
+
constructor(options) {
|
|
214
|
+
this.primaryRecipient = toWhatsAppJid(options.ownerPhone);
|
|
215
|
+
this.authDir = options.authDir;
|
|
216
|
+
this.onMessage = options.onMessage;
|
|
217
|
+
this.onLoggedOut = options.onLoggedOut ?? null;
|
|
218
|
+
this.attachmentStore = options.attachmentStore ?? null;
|
|
219
|
+
}
|
|
220
|
+
getStatus() {
|
|
221
|
+
return this.connectionState;
|
|
222
|
+
}
|
|
223
|
+
getLastError() {
|
|
224
|
+
return this.lastError;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* User-visible error derived from the current connection state.
|
|
228
|
+
*
|
|
229
|
+
* `lastError` is the diagnostic record of the most recent failure and stays
|
|
230
|
+
* set across recovery (it's only cleared on `connection === "open"` or via
|
|
231
|
+
* the user-initiated {@link requestQR}). Surfacing it raw to the dashboard
|
|
232
|
+
* means a transient version-rejection (e.g. WhatsApp returning 515 on the
|
|
233
|
+
* first connect, then accepting the second) renders a persistent red alert
|
|
234
|
+
* underneath the QR while pairing is actually proceeding normally.
|
|
235
|
+
*
|
|
236
|
+
* Rule: errors are only "real" when there's no recovery in flight.
|
|
237
|
+
* - `ok` / `connecting` / `awaiting_qr` / `disabled` → null (active or
|
|
238
|
+
* transitioning). `disabled` covers the pre-connect window during
|
|
239
|
+
* {@link start}'s awaits.
|
|
240
|
+
* - `logged_out` → terminal, surface the error.
|
|
241
|
+
* - `disconnected` → if a reconnect timer is pending, recovery is in
|
|
242
|
+
* flight; otherwise we've either hit `RECONNECT_MAX_ATTEMPTS` or the
|
|
243
|
+
* adapter is between attempts with no scheduled retry, both of which
|
|
244
|
+
* are real, user-actionable failures.
|
|
245
|
+
*/
|
|
246
|
+
getStatusError() {
|
|
247
|
+
switch (this.connectionState) {
|
|
248
|
+
case "ok":
|
|
249
|
+
case "connecting":
|
|
250
|
+
case "awaiting_qr":
|
|
251
|
+
case "disabled":
|
|
252
|
+
return null;
|
|
253
|
+
case "logged_out":
|
|
254
|
+
return this.lastError ?? "WhatsApp logged out";
|
|
255
|
+
case "disconnected":
|
|
256
|
+
if (this.reconnectTimer !== null)
|
|
257
|
+
return null;
|
|
258
|
+
return this.lastError ?? "WhatsApp disconnected";
|
|
259
|
+
/* v8 ignore next 2 — default branch unreachable with correctly typed connectionState */
|
|
260
|
+
default:
|
|
261
|
+
return this.lastError;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
getNotificationRuntimeStatus() {
|
|
265
|
+
const error = this.getStatusError();
|
|
266
|
+
if (error !== null) {
|
|
267
|
+
return { runtimeState: "error", error };
|
|
268
|
+
}
|
|
269
|
+
switch (this.connectionState) {
|
|
270
|
+
case "ok":
|
|
271
|
+
return { runtimeState: "ok", error: null };
|
|
272
|
+
case "connecting":
|
|
273
|
+
case "awaiting_qr":
|
|
274
|
+
case "disabled":
|
|
275
|
+
// `disabled` is the pre-connect window during {@link start}'s awaits
|
|
276
|
+
// (loadDependencies / ensureAuthState). Mapping it to "error" briefly
|
|
277
|
+
// rendered red on /health polled during that window.
|
|
278
|
+
return { runtimeState: "connecting", error: null };
|
|
279
|
+
case "disconnected":
|
|
280
|
+
// getStatusError returned null → reconnect timer is pending, so this
|
|
281
|
+
// is a transient gap, not a failure. Treat as connecting.
|
|
282
|
+
return { runtimeState: "connecting", error: null };
|
|
283
|
+
/* v8 ignore next 2 — default branch unreachable with correctly typed connectionState */
|
|
284
|
+
default:
|
|
285
|
+
return { runtimeState: "connecting", error: null };
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
async requestQR() {
|
|
289
|
+
// User-initiated retry: clear any previous failure state and the
|
|
290
|
+
// backoff counter so the dashboard's "Refresh QR" button always gets a
|
|
291
|
+
// fresh attempt instead of inheriting the last reconnect's exhaustion.
|
|
292
|
+
this.shuttingDown = false;
|
|
293
|
+
this.lastError = null;
|
|
294
|
+
this.reconnectAttempts = 0;
|
|
295
|
+
if (this.reconnectTimer) {
|
|
296
|
+
clearTimeout(this.reconnectTimer);
|
|
297
|
+
this.reconnectTimer = null;
|
|
298
|
+
}
|
|
299
|
+
try {
|
|
300
|
+
await this.loadDependencies();
|
|
301
|
+
this.ensureAuthDir();
|
|
302
|
+
await this.ensureAuthState();
|
|
303
|
+
}
|
|
304
|
+
catch (err) {
|
|
305
|
+
this.lastError = err instanceof Error ? err.message : String(err);
|
|
306
|
+
throw err;
|
|
307
|
+
}
|
|
308
|
+
if (this.sock && this.connectionState === "ok") {
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
if (this.sock) {
|
|
312
|
+
this.closeSocket();
|
|
313
|
+
}
|
|
314
|
+
try {
|
|
315
|
+
await this.connect();
|
|
316
|
+
}
|
|
317
|
+
catch (err) {
|
|
318
|
+
this.lastError = err instanceof Error ? err.message : String(err);
|
|
319
|
+
throw err;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Trigger QR generation (if needed) and wait up to `timeoutMs` for a fresh
|
|
324
|
+
* scannable QR. Returns the snapshot once available, or `null` on timeout /
|
|
325
|
+
* if pairing completes without a QR (already logged in).
|
|
326
|
+
*/
|
|
327
|
+
async waitForQr(timeoutMs = 10_000) {
|
|
328
|
+
// connectionState may be mutated by async Baileys callbacks; treat the
|
|
329
|
+
// field as a runtime value, not a TS-narrowed literal across awaits.
|
|
330
|
+
if (this.connectionState === "ok") {
|
|
331
|
+
return null;
|
|
332
|
+
}
|
|
333
|
+
if (this.latestQr && Date.now() - this.latestQr.generatedAt < QR_TTL_MS) {
|
|
334
|
+
return this.latestQr;
|
|
335
|
+
}
|
|
336
|
+
await this.requestQR();
|
|
337
|
+
const deadline = Date.now() + timeoutMs;
|
|
338
|
+
while (Date.now() < deadline) {
|
|
339
|
+
const state = this.connectionState;
|
|
340
|
+
if (state === "ok")
|
|
341
|
+
return null;
|
|
342
|
+
if (state === "logged_out")
|
|
343
|
+
return null;
|
|
344
|
+
if (this.latestQr)
|
|
345
|
+
return this.latestQr;
|
|
346
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
347
|
+
}
|
|
348
|
+
return this.latestQr;
|
|
349
|
+
}
|
|
350
|
+
/** Returns the rendered scannable QR data URL, or `null` if no QR is current. */
|
|
351
|
+
getQrSnapshot() {
|
|
352
|
+
if (!this.latestQr)
|
|
353
|
+
return null;
|
|
354
|
+
if (Date.now() - this.latestQr.generatedAt > QR_TTL_MS) {
|
|
355
|
+
return null;
|
|
356
|
+
}
|
|
357
|
+
return this.latestQr;
|
|
358
|
+
}
|
|
359
|
+
async start() {
|
|
360
|
+
if (this.sock)
|
|
361
|
+
return;
|
|
362
|
+
this.shuttingDown = false;
|
|
363
|
+
this.reconnectAttempts = 0;
|
|
364
|
+
await this.loadDependencies();
|
|
365
|
+
this.ensureAuthDir();
|
|
366
|
+
await this.ensureAuthState();
|
|
367
|
+
await this.connect();
|
|
368
|
+
}
|
|
369
|
+
async stop() {
|
|
370
|
+
this.shuttingDown = true;
|
|
371
|
+
if (this.reconnectTimer) {
|
|
372
|
+
clearTimeout(this.reconnectTimer);
|
|
373
|
+
this.reconnectTimer = null;
|
|
374
|
+
}
|
|
375
|
+
this.reconnectAttempts = 0;
|
|
376
|
+
this.sentMessageIds.clear();
|
|
377
|
+
this.clearQrSnapshot();
|
|
378
|
+
this.clearQrFile();
|
|
379
|
+
this.closeSocket();
|
|
380
|
+
this.connectionState = "disabled";
|
|
381
|
+
logger.info("WhatsApp adapter disconnected");
|
|
382
|
+
}
|
|
383
|
+
async sendMessage(params) {
|
|
384
|
+
if (!this.sock || this.connectionState !== "ok") {
|
|
385
|
+
throw new Error("WhatsApp socket is not connected");
|
|
386
|
+
}
|
|
387
|
+
const { channel, text, attachments } = params;
|
|
388
|
+
if (!attachments?.length) {
|
|
389
|
+
// Text only — existing behaviour.
|
|
390
|
+
return this.sendWhatsAppText(channel, text);
|
|
391
|
+
}
|
|
392
|
+
// Text + attachments. WhatsApp supports caption on image/document/video
|
|
393
|
+
// calls, but audio/sticker have no caption field. Strategy:
|
|
394
|
+
// - if text ≤ 1024 chars: use text as caption on the first attachment
|
|
395
|
+
// (no separate text message)
|
|
396
|
+
// - otherwise: send text in chunks first, then attachments bare.
|
|
397
|
+
// Baileys is one-media-per-send, so we always loop.
|
|
398
|
+
const captionText = text.length <= WA_CAPTION_MAX_CHARS ? text : null;
|
|
399
|
+
let lastMessageId;
|
|
400
|
+
if (!captionText && text) {
|
|
401
|
+
const result = await this.sendWhatsAppText(channel, text);
|
|
402
|
+
lastMessageId = result.messageId;
|
|
403
|
+
}
|
|
404
|
+
let isFirst = true;
|
|
405
|
+
for (const att of attachments) {
|
|
406
|
+
const caption = isFirst && captionText ? captionText : undefined;
|
|
407
|
+
isFirst = false;
|
|
408
|
+
try {
|
|
409
|
+
const { readFileSync: rfs } = await import("node:fs");
|
|
410
|
+
const buf = rfs(att.path);
|
|
411
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
412
|
+
let mediaPayload;
|
|
413
|
+
if (att.mimeType.startsWith("image/")) {
|
|
414
|
+
mediaPayload = { image: buf, mimetype: att.mimeType, caption };
|
|
415
|
+
}
|
|
416
|
+
else {
|
|
417
|
+
mediaPayload = {
|
|
418
|
+
document: buf,
|
|
419
|
+
mimetype: att.mimeType,
|
|
420
|
+
fileName: att.originalFilename,
|
|
421
|
+
caption,
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
const preId = this.generateMessageId?.() ?? null;
|
|
425
|
+
if (preId)
|
|
426
|
+
this.rememberSentMessageId(preId);
|
|
427
|
+
const result = await this.sock.sendMessage(channel, mediaPayload, preId ? { messageId: preId } : undefined);
|
|
428
|
+
const actualId = result?.key?.id;
|
|
429
|
+
if (typeof actualId === "string" && actualId !== preId) {
|
|
430
|
+
this.rememberSentMessageId(actualId);
|
|
431
|
+
}
|
|
432
|
+
lastMessageId = (typeof actualId === "string" ? actualId : preId) ?? lastMessageId;
|
|
433
|
+
}
|
|
434
|
+
catch (err) {
|
|
435
|
+
logger.error({ err, channel, filename: att.originalFilename }, "Failed to send WhatsApp attachment");
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
return { messageId: lastMessageId };
|
|
439
|
+
}
|
|
440
|
+
async sendWhatsAppText(channel, text) {
|
|
441
|
+
const chunks = splitOutboundText(text, OUTBOUND_CHUNK_SIZE);
|
|
442
|
+
let lastMessageId;
|
|
443
|
+
for (const chunk of chunks) {
|
|
444
|
+
// Pre-generate the WAMessage id so we can register it BEFORE Baileys
|
|
445
|
+
// begins emitting `messages.upsert` for the outbound. Without this,
|
|
446
|
+
// a self-DM reply could race past the dedup set and be re-ingested
|
|
447
|
+
// as if the user had sent it, looping the agent on its own replies.
|
|
448
|
+
const preId = this.generateMessageId?.() ?? null;
|
|
449
|
+
if (preId)
|
|
450
|
+
this.rememberSentMessageId(preId);
|
|
451
|
+
const result = await this.sock.sendMessage(channel, { text: chunk }, preId ? { messageId: preId } : undefined);
|
|
452
|
+
// If something between us and the test mock didn't honor our
|
|
453
|
+
// pre-generated id, fall back to the id Baileys actually used and
|
|
454
|
+
// record that one as well — better to over-dedup than under-dedup.
|
|
455
|
+
const actualId = result?.key?.id;
|
|
456
|
+
if (typeof actualId === "string" && actualId !== preId) {
|
|
457
|
+
this.rememberSentMessageId(actualId);
|
|
458
|
+
}
|
|
459
|
+
lastMessageId = (typeof actualId === "string" ? actualId : preId) ?? lastMessageId;
|
|
460
|
+
}
|
|
461
|
+
return { messageId: lastMessageId };
|
|
462
|
+
}
|
|
463
|
+
async beginProcessingIndicator(params) {
|
|
464
|
+
let stopped = false;
|
|
465
|
+
const sendPresence = async (state) => {
|
|
466
|
+
if (!this.sock || this.connectionState !== "ok") {
|
|
467
|
+
return;
|
|
468
|
+
}
|
|
469
|
+
if (typeof this.sock.sendPresenceUpdate !== "function") {
|
|
470
|
+
return;
|
|
471
|
+
}
|
|
472
|
+
try {
|
|
473
|
+
await this.sock.sendPresenceUpdate(state, params.channel);
|
|
474
|
+
}
|
|
475
|
+
catch (err) {
|
|
476
|
+
logger.debug({
|
|
477
|
+
channel: params.channel,
|
|
478
|
+
state,
|
|
479
|
+
error: err instanceof Error ? err.message : String(err),
|
|
480
|
+
}, "Failed to update WhatsApp presence");
|
|
481
|
+
}
|
|
482
|
+
};
|
|
483
|
+
await sendPresence("composing");
|
|
484
|
+
const interval = setInterval(() => {
|
|
485
|
+
void sendPresence("composing");
|
|
486
|
+
}, PRESENCE_REFRESH_MS);
|
|
487
|
+
interval.unref?.();
|
|
488
|
+
return {
|
|
489
|
+
stop: async () => {
|
|
490
|
+
if (stopped)
|
|
491
|
+
return;
|
|
492
|
+
stopped = true;
|
|
493
|
+
clearInterval(interval);
|
|
494
|
+
await sendPresence("paused");
|
|
495
|
+
},
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
async loadDependencies() {
|
|
499
|
+
if (this.makeWASocket
|
|
500
|
+
&& this.renderQr
|
|
501
|
+
&& this.renderQrToDataUrl
|
|
502
|
+
&& this.fetchLatestWaWebVersion
|
|
503
|
+
&& this.fetchLatestBaileysVersion
|
|
504
|
+
&& this.generateMessageId
|
|
505
|
+
&& this.downloadMediaMessage) {
|
|
506
|
+
return;
|
|
507
|
+
}
|
|
508
|
+
const installHint = "Run: pnpm --filter @aitne/daemon add @whiskeysockets/baileys qrcode-terminal qrcode";
|
|
509
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
510
|
+
let baileys;
|
|
511
|
+
try {
|
|
512
|
+
baileys = await import("@whiskeysockets/baileys");
|
|
513
|
+
/* v8 ignore next 4 — packages always installed in production; catch only reachable when package is absent */
|
|
514
|
+
}
|
|
515
|
+
catch (err) {
|
|
516
|
+
logger.error({ err }, "Failed to load @whiskeysockets/baileys");
|
|
517
|
+
throw new Error(`@whiskeysockets/baileys not installed. ${installHint}`);
|
|
518
|
+
}
|
|
519
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
520
|
+
let qrTermModule;
|
|
521
|
+
try {
|
|
522
|
+
qrTermModule = await import("qrcode-terminal");
|
|
523
|
+
/* v8 ignore next 4 — packages always installed in production; catch only reachable when package is absent */
|
|
524
|
+
}
|
|
525
|
+
catch (err) {
|
|
526
|
+
logger.error({ err }, "Failed to load qrcode-terminal");
|
|
527
|
+
throw new Error(`qrcode-terminal not installed. ${installHint}`);
|
|
528
|
+
}
|
|
529
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
530
|
+
let qrModule;
|
|
531
|
+
try {
|
|
532
|
+
qrModule = await import("qrcode");
|
|
533
|
+
/* v8 ignore next 4 — packages always installed in production; catch only reachable when package is absent */
|
|
534
|
+
}
|
|
535
|
+
catch (err) {
|
|
536
|
+
logger.error({ err }, "Failed to load qrcode");
|
|
537
|
+
throw new Error(`qrcode not installed. ${installHint}`);
|
|
538
|
+
}
|
|
539
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
540
|
+
const makeWASockFn = typeof baileys.default === "function" ? baileys.default : /* v8 ignore next */ baileys.makeWASocket;
|
|
541
|
+
/* v8 ignore next 1 — makeWASockFn is always truthy when Baileys is correctly installed */
|
|
542
|
+
this.makeWASocket = makeWASockFn ?? null;
|
|
543
|
+
/* v8 ignore next 3 — unreachable when Baileys exposes the expected API */
|
|
544
|
+
if (!this.makeWASocket || typeof baileys.useMultiFileAuthState !== "function") {
|
|
545
|
+
throw new Error("Baileys module does not expose the expected API");
|
|
546
|
+
}
|
|
547
|
+
const qrTermLib = /* v8 ignore next */ qrTermModule.default ?? qrTermModule;
|
|
548
|
+
/* v8 ignore next 3 — unreachable when qrcode-terminal exposes generate() */
|
|
549
|
+
if (!qrTermLib || typeof qrTermLib.generate !== "function") {
|
|
550
|
+
throw new Error("qrcode-terminal module does not expose generate()");
|
|
551
|
+
}
|
|
552
|
+
this.renderQr = qrTermLib.generate.bind(qrTermLib);
|
|
553
|
+
const qrLib = /* v8 ignore next */ qrModule.default ?? qrModule;
|
|
554
|
+
/* v8 ignore next 3 — unreachable when qrcode exposes toDataURL() */
|
|
555
|
+
if (!qrLib || typeof qrLib.toDataURL !== "function") {
|
|
556
|
+
throw new Error("qrcode module does not expose toDataURL()");
|
|
557
|
+
}
|
|
558
|
+
this.renderQrToDataUrl = qrLib.toDataURL.bind(qrLib);
|
|
559
|
+
const loggedOutRaw = baileys.DisconnectReason?.loggedOut;
|
|
560
|
+
this.loggedOutCode = typeof loggedOutRaw === "number" ? loggedOutRaw : /* v8 ignore next */ 401;
|
|
561
|
+
// Resolvers for the live WhatsApp Web client version. We capture both:
|
|
562
|
+
// `fetchLatestWaWebVersion` reads web.whatsapp.com's own sw.js (the most
|
|
563
|
+
// authoritative source — it's literally what the desktop client downloads),
|
|
564
|
+
// and `fetchLatestBaileysVersion` falls back to the Baileys master branch
|
|
565
|
+
// when WhatsApp's CDN is unreachable. Both helpers internally fall back to
|
|
566
|
+
// the bundled default if their network call fails, so we never throw.
|
|
567
|
+
if (typeof baileys.fetchLatestWaWebVersion === "function") {
|
|
568
|
+
this.fetchLatestWaWebVersion = baileys.fetchLatestWaWebVersion;
|
|
569
|
+
/* v8 ignore next 3 — null branch only reachable with a Baileys build that omits this helper */
|
|
570
|
+
}
|
|
571
|
+
else {
|
|
572
|
+
this.fetchLatestWaWebVersion = null;
|
|
573
|
+
}
|
|
574
|
+
if (typeof baileys.fetchLatestBaileysVersion === "function") {
|
|
575
|
+
this.fetchLatestBaileysVersion = baileys.fetchLatestBaileysVersion;
|
|
576
|
+
/* v8 ignore next 3 — null branch only reachable with a Baileys build that omits this helper */
|
|
577
|
+
}
|
|
578
|
+
else {
|
|
579
|
+
this.fetchLatestBaileysVersion = null;
|
|
580
|
+
}
|
|
581
|
+
// Pre-generated WAMessage IDs let us register an outbound id BEFORE
|
|
582
|
+
// calling sock.sendMessage, which closes the race window with the
|
|
583
|
+
// `messages.upsert` Baileys emits via process.nextTick for our own
|
|
584
|
+
// outbound (see Baileys' Socket/messages-send.js → emitOwnEvents).
|
|
585
|
+
// Without this we'd risk treating our own reply as a fresh user message
|
|
586
|
+
// and feedback-looping the daemon.
|
|
587
|
+
if (typeof baileys.generateMessageID === "function") {
|
|
588
|
+
this.generateMessageId = baileys.generateMessageID;
|
|
589
|
+
/* v8 ignore next 4 — generateMessageIDV2 path for older Baileys versions */
|
|
590
|
+
}
|
|
591
|
+
else if (typeof baileys.generateMessageIDV2 === "function") {
|
|
592
|
+
this.generateMessageId = () => baileys.generateMessageIDV2();
|
|
593
|
+
}
|
|
594
|
+
// Phase 2 inbound media download helper.
|
|
595
|
+
if (typeof baileys.downloadMediaMessage === "function") {
|
|
596
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
597
|
+
this.downloadMediaMessage = baileys.downloadMediaMessage;
|
|
598
|
+
/* v8 ignore next 3 — null branch only reachable with a Baileys build that omits this helper */
|
|
599
|
+
}
|
|
600
|
+
else {
|
|
601
|
+
this.downloadMediaMessage = null;
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
ensureAuthDir() {
|
|
605
|
+
mkdirSync(this.authDir, { recursive: true, mode: 0o700 });
|
|
606
|
+
}
|
|
607
|
+
async ensureAuthState() {
|
|
608
|
+
if (this.authState) {
|
|
609
|
+
return;
|
|
610
|
+
/* v8 ignore next 9 — real Baileys auth state is always pre-injected in tests; this branch only runs in production */
|
|
611
|
+
}
|
|
612
|
+
else {
|
|
613
|
+
const baileys = await import("@whiskeysockets/baileys");
|
|
614
|
+
const bundle = await baileys.useMultiFileAuthState(this.authDir);
|
|
615
|
+
this.authState = {
|
|
616
|
+
state: bundle.state,
|
|
617
|
+
saveCreds: bundle.saveCreds,
|
|
618
|
+
};
|
|
619
|
+
this.syncOwnerIdentityFromAuthState();
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
/**
|
|
623
|
+
* Resolve the WhatsApp Web client version we should advertise during the
|
|
624
|
+
* noise handshake. Cached for {@link WA_VERSION_TTL_MS}; on cache miss we
|
|
625
|
+
* try the live sources in order, falling back to `undefined` (which lets
|
|
626
|
+
* Baileys use its bundled default) if everything fails.
|
|
627
|
+
*
|
|
628
|
+
* Why: Baileys 7.0.0-rc.9 ships with a hard-coded `[2, 3000, 1027934701]`
|
|
629
|
+
* which WhatsApp's relays began rejecting with status 405 (`Method Not
|
|
630
|
+
* Allowed` from the noise frame decoder). Without this resolution every
|
|
631
|
+
* `connect()` failed before a QR could be emitted, leaving the dashboard
|
|
632
|
+
* stuck on "Pairing…".
|
|
633
|
+
*/
|
|
634
|
+
async resolveWAVersion() {
|
|
635
|
+
const now = Date.now();
|
|
636
|
+
if (this.cachedWAVersion && now - this.cachedWAVersionAt < WA_VERSION_TTL_MS) {
|
|
637
|
+
return this.cachedWAVersion;
|
|
638
|
+
}
|
|
639
|
+
const tryResolve = async (fn, label) => {
|
|
640
|
+
if (!fn)
|
|
641
|
+
return null;
|
|
642
|
+
try {
|
|
643
|
+
const result = await fn();
|
|
644
|
+
if (result?.isLatest
|
|
645
|
+
&& Array.isArray(result.version)
|
|
646
|
+
&& result.version.length === 3
|
|
647
|
+
&& result.version.every((n) => typeof n === "number" && Number.isFinite(n))) {
|
|
648
|
+
logger.info({ source: label, version: result.version }, "resolved WhatsApp Web version");
|
|
649
|
+
return result.version;
|
|
650
|
+
}
|
|
651
|
+
logger.debug({ source: label, isLatest: result?.isLatest, error: result?.error }, "WhatsApp Web version source returned no fresh version");
|
|
652
|
+
return null;
|
|
653
|
+
}
|
|
654
|
+
catch (err) {
|
|
655
|
+
logger.warn({ err, source: label }, "WhatsApp Web version source threw");
|
|
656
|
+
return null;
|
|
657
|
+
}
|
|
658
|
+
};
|
|
659
|
+
// Authoritative source first; Baileys master branch as a backup.
|
|
660
|
+
const version = (await tryResolve(this.fetchLatestWaWebVersion, "wa-web-sw"))
|
|
661
|
+
?? (await tryResolve(this.fetchLatestBaileysVersion, "baileys-master"));
|
|
662
|
+
if (version) {
|
|
663
|
+
this.cachedWAVersion = version;
|
|
664
|
+
this.cachedWAVersionAt = now;
|
|
665
|
+
return version;
|
|
666
|
+
}
|
|
667
|
+
logger.warn("falling back to Baileys bundled WhatsApp Web version");
|
|
668
|
+
return undefined;
|
|
669
|
+
}
|
|
670
|
+
invalidateWAVersionCache() {
|
|
671
|
+
if (this.cachedWAVersion) {
|
|
672
|
+
logger.info({ previous: this.cachedWAVersion }, "invalidating cached WhatsApp Web version");
|
|
673
|
+
}
|
|
674
|
+
this.cachedWAVersion = null;
|
|
675
|
+
this.cachedWAVersionAt = 0;
|
|
676
|
+
}
|
|
677
|
+
/**
|
|
678
|
+
* Record a WAMessage id we just generated for an outbound send so the
|
|
679
|
+
* matching `messages.upsert` echo can be filtered out by
|
|
680
|
+
* {@link handleIncomingMessage}.
|
|
681
|
+
*
|
|
682
|
+
* Bounded with FIFO eviction (Sets preserve insertion order in ES2015+).
|
|
683
|
+
* Eviction loss is harmless: it just means a stale id we no longer care
|
|
684
|
+
* about ages out, never that we drop a real user message.
|
|
685
|
+
*/
|
|
686
|
+
rememberSentMessageId(id) {
|
|
687
|
+
if (!id)
|
|
688
|
+
return;
|
|
689
|
+
if (this.sentMessageIds.has(id))
|
|
690
|
+
return;
|
|
691
|
+
if (this.sentMessageIds.size >= SENT_MESSAGE_ID_CAP) {
|
|
692
|
+
const oldest = this.sentMessageIds.values().next().value;
|
|
693
|
+
if (oldest !== undefined)
|
|
694
|
+
this.sentMessageIds.delete(oldest);
|
|
695
|
+
}
|
|
696
|
+
this.sentMessageIds.add(id);
|
|
697
|
+
}
|
|
698
|
+
/**
|
|
699
|
+
* Returns true (and removes the id) iff the given id was previously
|
|
700
|
+
* registered via {@link rememberSentMessageId}. Used as a one-shot
|
|
701
|
+
* "is this our own echo?" check; consuming on hit keeps the set lean and
|
|
702
|
+
* avoids re-matching if WhatsApp ever redelivers the same key.
|
|
703
|
+
*/
|
|
704
|
+
consumeSentMessageId(id) {
|
|
705
|
+
if (typeof id !== "string" || id.length === 0)
|
|
706
|
+
return false;
|
|
707
|
+
return this.sentMessageIds.delete(id);
|
|
708
|
+
}
|
|
709
|
+
async connect() {
|
|
710
|
+
if (!this.makeWASocket || !this.authState) {
|
|
711
|
+
throw new Error("WhatsApp adapter dependencies are not initialized");
|
|
712
|
+
}
|
|
713
|
+
this.connectionState = "connecting";
|
|
714
|
+
logger.info("whatsapp connecting");
|
|
715
|
+
const version = await this.resolveWAVersion();
|
|
716
|
+
// shuttingDown may have flipped while we awaited the version resolver —
|
|
717
|
+
// bail out cleanly so we don't leak a fresh socket the caller can't see.
|
|
718
|
+
if (this.shuttingDown) {
|
|
719
|
+
this.connectionState = "disabled";
|
|
720
|
+
logger.info("whatsapp connect aborted: shutting down");
|
|
721
|
+
return;
|
|
722
|
+
}
|
|
723
|
+
const sock = this.makeWASocket({
|
|
724
|
+
auth: this.authState.state,
|
|
725
|
+
printQRInTerminal: false,
|
|
726
|
+
// `markOnlineOnConnect: true` registers our session as an *active*
|
|
727
|
+
// device with WhatsApp's relays. WhatsApp routes new messages to
|
|
728
|
+
// active devices first; if every linked device is `unavailable` the
|
|
729
|
+
// message may simply not be pushed to us, which is exactly what
|
|
730
|
+
// happens when this is left at `false` — incoming DMs (including
|
|
731
|
+
// self-DMs) silently never arrive at the daemon. The cosmetic cost
|
|
732
|
+
// is that the user's contacts see one more "online" device, which
|
|
733
|
+
// for a personal agent is exactly what we want anyway.
|
|
734
|
+
markOnlineOnConnect: true,
|
|
735
|
+
// Skip Baileys' initial-history-sync window. With the default
|
|
736
|
+
// (`syncFullHistory: true`), Baileys enters `AwaitingInitialSync`
|
|
737
|
+
// for ~20 s after every connect, buffering all `messages.upsert`
|
|
738
|
+
// events behind a "history sync" gate. We don't care about
|
|
739
|
+
// historical messages — only new ones from this point forward —
|
|
740
|
+
// so we turn the gate off entirely. `shouldSyncHistoryMessage` is
|
|
741
|
+
// a defensive belt-and-braces in case some inner loop still
|
|
742
|
+
// consults it during a partial sync.
|
|
743
|
+
syncFullHistory: false,
|
|
744
|
+
shouldSyncHistoryMessage: () => false,
|
|
745
|
+
/* v8 ignore next 1 — both truthy and falsy version paths tested; V8 ternary branch merge artefact */
|
|
746
|
+
...(version ? { version } : {}),
|
|
747
|
+
});
|
|
748
|
+
this.sock = sock;
|
|
749
|
+
sock.ev.on("creds.update", this.authState.saveCreds);
|
|
750
|
+
sock.ev.on("creds.update", (update) => {
|
|
751
|
+
this.captureOwnerIdentity(update);
|
|
752
|
+
});
|
|
753
|
+
sock.ev.on("messages.upsert", (payload) => {
|
|
754
|
+
this.handleMessagesUpsert(payload);
|
|
755
|
+
});
|
|
756
|
+
sock.ev.on("connection.update", (update) => {
|
|
757
|
+
void this.handleConnectionUpdate(update, sock);
|
|
758
|
+
});
|
|
759
|
+
}
|
|
760
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
761
|
+
async handleConnectionUpdate(update, sock) {
|
|
762
|
+
if (sock !== this.sock)
|
|
763
|
+
return;
|
|
764
|
+
if (typeof update?.qr === "string") {
|
|
765
|
+
this.connectionState = "awaiting_qr";
|
|
766
|
+
try {
|
|
767
|
+
if (this.renderQr) {
|
|
768
|
+
this.renderQr(update.qr, { small: true });
|
|
769
|
+
}
|
|
770
|
+
await this.captureQr(update.qr);
|
|
771
|
+
}
|
|
772
|
+
catch (err) {
|
|
773
|
+
logger.error({ err }, "Failed to render WhatsApp QR");
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
if (update?.connection === "open") {
|
|
777
|
+
this.syncOwnerIdentityFromAuthState();
|
|
778
|
+
this.connectionState = "ok";
|
|
779
|
+
this.lastError = null;
|
|
780
|
+
this.reconnectAttempts = 0;
|
|
781
|
+
this.clearQrSnapshot();
|
|
782
|
+
this.clearQrFile();
|
|
783
|
+
logger.info("whatsapp connected");
|
|
784
|
+
return;
|
|
785
|
+
}
|
|
786
|
+
if (update?.connection !== "close") {
|
|
787
|
+
return;
|
|
788
|
+
}
|
|
789
|
+
// Synchronous re-entry from our own closeSocket → sock.end() flow. Bail
|
|
790
|
+
// out cleanly so we don't double-close (closeSocket is mid-execution
|
|
791
|
+
// already) and don't classify the close as a network failure.
|
|
792
|
+
if (this.intentionalClose) {
|
|
793
|
+
return;
|
|
794
|
+
}
|
|
795
|
+
const statusCode = update?.lastDisconnect?.error?.output?.statusCode
|
|
796
|
+
?? update?.lastDisconnect?.error?.data?.statusCode
|
|
797
|
+
?? null;
|
|
798
|
+
this.closeSocket();
|
|
799
|
+
this.clearQrSnapshot();
|
|
800
|
+
this.clearQrFile();
|
|
801
|
+
// Logged out / banned / multidevice mismatch — re-pairing is required.
|
|
802
|
+
// Reconnecting on these is not just useless, it's the fastest way to
|
|
803
|
+
// earn an IP-level rate limit, so we stop the loop entirely.
|
|
804
|
+
const isLoggedOut = statusCode === this.loggedOutCode
|
|
805
|
+
|| (typeof statusCode === "number" && UNRECOVERABLE_STATUS_CODES.has(statusCode));
|
|
806
|
+
if (isLoggedOut) {
|
|
807
|
+
this.connectionState = "logged_out";
|
|
808
|
+
/* v8 ignore next 1 — statusCode is always a number when isLoggedOut=true */
|
|
809
|
+
this.lastError = `WhatsApp logged out (status ${statusCode ?? "unknown"}) — re-pair required`;
|
|
810
|
+
this.reconnectAttempts = 0;
|
|
811
|
+
logger.error({ statusCode }, "whatsapp connection closed: logged out");
|
|
812
|
+
if (this.onLoggedOut) {
|
|
813
|
+
try {
|
|
814
|
+
await this.onLoggedOut();
|
|
815
|
+
}
|
|
816
|
+
catch (err) {
|
|
817
|
+
logger.error({ err }, "Failed to notify about WhatsApp logout");
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
return;
|
|
821
|
+
}
|
|
822
|
+
if (this.shuttingDown) {
|
|
823
|
+
this.connectionState = "disabled";
|
|
824
|
+
this.reconnectAttempts = 0;
|
|
825
|
+
return;
|
|
826
|
+
}
|
|
827
|
+
// Version-rejection codes mean WhatsApp doesn't accept the client version
|
|
828
|
+
// we advertised. Drop the cache so the next connect re-fetches a fresh
|
|
829
|
+
// version, then fall through to the normal backoff path.
|
|
830
|
+
if (typeof statusCode === "number" && VERSION_REJECTED_STATUS_CODES.has(statusCode)) {
|
|
831
|
+
logger.warn({ statusCode }, "WhatsApp rejected our client version; refetching latest on next attempt");
|
|
832
|
+
this.invalidateWAVersionCache();
|
|
833
|
+
this.lastError = `WhatsApp rejected client version (status ${statusCode})`;
|
|
834
|
+
}
|
|
835
|
+
else {
|
|
836
|
+
this.lastError =
|
|
837
|
+
statusCode != null
|
|
838
|
+
? `WhatsApp connection closed (status ${statusCode})`
|
|
839
|
+
: "WhatsApp connection closed";
|
|
840
|
+
}
|
|
841
|
+
this.connectionState = "disconnected";
|
|
842
|
+
logger.info({ statusCode, attempt: this.reconnectAttempts + 1 }, "whatsapp connection closed; scheduling reconnect");
|
|
843
|
+
this.scheduleReconnect();
|
|
844
|
+
}
|
|
845
|
+
/**
|
|
846
|
+
* Schedule the next reconnect attempt with full-jitter exponential backoff.
|
|
847
|
+
*
|
|
848
|
+
* - Delay: `min(initial * factor^attempt, max) + random(0, jitter)`
|
|
849
|
+
* - Cap: after {@link RECONNECT_MAX_ATTEMPTS} consecutive failures the loop
|
|
850
|
+
* stops and the adapter sits in `disconnected` until something external
|
|
851
|
+
* (e.g. the dashboard's "Refresh QR" button → `requestQR()`) restarts it.
|
|
852
|
+
*
|
|
853
|
+
* Why a hard cap: when WhatsApp is blocking us (bad version, throttled IP,
|
|
854
|
+
* regional outage) every retry burns CPU and risks escalating the block.
|
|
855
|
+
* Better to surface the error and let the user decide whether to wait it
|
|
856
|
+
* out or rotate IP / re-pair.
|
|
857
|
+
*/
|
|
858
|
+
scheduleReconnect() {
|
|
859
|
+
if (this.reconnectTimer || this.shuttingDown)
|
|
860
|
+
return;
|
|
861
|
+
if (this.connectionState === "logged_out")
|
|
862
|
+
return;
|
|
863
|
+
if (this.reconnectAttempts >= RECONNECT_MAX_ATTEMPTS) {
|
|
864
|
+
const previousError = this.lastError ?? "unknown error";
|
|
865
|
+
this.lastError = `WhatsApp reconnect gave up after ${RECONNECT_MAX_ATTEMPTS} attempts (${previousError})`;
|
|
866
|
+
logger.error({ attempts: this.reconnectAttempts, lastError: previousError }, "whatsapp reconnect: max attempts exceeded");
|
|
867
|
+
return;
|
|
868
|
+
}
|
|
869
|
+
const exponential = Math.min(RECONNECT_INITIAL_DELAY_MS * RECONNECT_BACKOFF_FACTOR ** this.reconnectAttempts, RECONNECT_MAX_DELAY_MS);
|
|
870
|
+
const jitter = Math.floor(Math.random() * RECONNECT_JITTER_MS);
|
|
871
|
+
const delayMs = exponential + jitter;
|
|
872
|
+
this.reconnectAttempts += 1;
|
|
873
|
+
logger.info({ attempt: this.reconnectAttempts, delayMs }, "whatsapp reconnect scheduled");
|
|
874
|
+
this.reconnectTimer = setTimeout(() => {
|
|
875
|
+
this.reconnectTimer = null;
|
|
876
|
+
if (this.shuttingDown || this.connectionState === "logged_out") {
|
|
877
|
+
return;
|
|
878
|
+
}
|
|
879
|
+
void this.connect().catch((err) => {
|
|
880
|
+
// connect() throws synchronously on a misconfigured adapter; the
|
|
881
|
+
// close-event path can't recover that, so we have to feed the loop
|
|
882
|
+
// ourselves. Errors here are already counted in reconnectAttempts.
|
|
883
|
+
logger.error({ err }, "whatsapp reconnect attempt threw");
|
|
884
|
+
this.connectionState = "disconnected";
|
|
885
|
+
this.lastError = err instanceof Error ? err.message : String(err);
|
|
886
|
+
this.scheduleReconnect();
|
|
887
|
+
});
|
|
888
|
+
}, delayMs);
|
|
889
|
+
this.reconnectTimer.unref?.();
|
|
890
|
+
}
|
|
891
|
+
handleMessagesUpsert(payload) {
|
|
892
|
+
const messages = Array.isArray(payload?.messages)
|
|
893
|
+
? payload.messages
|
|
894
|
+
: [];
|
|
895
|
+
for (const message of messages) {
|
|
896
|
+
void this.handleIncomingMessage(message).catch((err) => {
|
|
897
|
+
logger.error({ err }, "whatsapp incoming message handler threw");
|
|
898
|
+
});
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
902
|
+
async handleIncomingMessage(rawMessage) {
|
|
903
|
+
const remoteJid = rawMessage?.key?.remoteJid;
|
|
904
|
+
const messageId = rawMessage?.key?.id;
|
|
905
|
+
const fromMe = rawMessage?.key?.fromMe === true;
|
|
906
|
+
// `fromMe: true` covers two very different cases on a personal-agent
|
|
907
|
+
// WhatsApp setup that uses the owner's own number:
|
|
908
|
+
//
|
|
909
|
+
// 1. The daemon's own outbound message echoing back through Baileys'
|
|
910
|
+
// `messages.upsert` (Baileys emits these via process.nextTick when
|
|
911
|
+
// `emitOwnEvents: true`, which is the default).
|
|
912
|
+
// 2. The owner sending a self-DM from another linked device — this is
|
|
913
|
+
// the natural way the owner talks to their own agent without
|
|
914
|
+
// maintaining a second WhatsApp account.
|
|
915
|
+
//
|
|
916
|
+
// We want to drop case 1 and process case 2. The two are indistinguishable
|
|
917
|
+
// by JID alone (both use the owner's JID as `remoteJid`), so we tell them
|
|
918
|
+
// apart by message id: every id this adapter generates for an outbound
|
|
919
|
+
// send is registered in `sentMessageIds`, and we consume-on-match here.
|
|
920
|
+
if (fromMe) {
|
|
921
|
+
if (this.consumeSentMessageId(typeof messageId === "string" ? messageId : null)) {
|
|
922
|
+
// Our own echo — already accounted for. Nothing to do.
|
|
923
|
+
return;
|
|
924
|
+
}
|
|
925
|
+
logger.debug({ remoteJid, messageId }, "whatsapp ingesting fromMe message (self-DM from another linked device)");
|
|
926
|
+
}
|
|
927
|
+
if (typeof remoteJid !== "string" || !isDirectUserJid(remoteJid)) {
|
|
928
|
+
logger.debug({ remoteJid }, "whatsapp message dropped: non-dm jid");
|
|
929
|
+
return;
|
|
930
|
+
}
|
|
931
|
+
// For both inbound (`fromMe:false`) DMs and self-DMs (`fromMe:true`),
|
|
932
|
+
// `remoteJid` is the chat partner — which for owner-to-owner self-DMs is
|
|
933
|
+
// the owner's own JID. The check below therefore correctly accepts
|
|
934
|
+
// self-DMs and rejects DMs to/from any third party.
|
|
935
|
+
if (!this.isAuthorizedOwnerJid(remoteJid)) {
|
|
936
|
+
logger.debug({ remoteJid }, "whatsapp message dropped: unauthorized sender");
|
|
937
|
+
return;
|
|
938
|
+
}
|
|
939
|
+
const text = extractWhatsAppText(rawMessage?.message) ?? "";
|
|
940
|
+
// Only await media extraction when the store is ready — this preserves
|
|
941
|
+
// synchronous execution for the no-store path so existing tests that call
|
|
942
|
+
// handleMessagesUpsert() without awaiting still work correctly.
|
|
943
|
+
let attachmentRefs = [];
|
|
944
|
+
if (this.attachmentStore && this.downloadMediaMessage) {
|
|
945
|
+
attachmentRefs = await this.extractAndIngestWhatsAppMedia(rawMessage);
|
|
946
|
+
}
|
|
947
|
+
// Drop messages that have neither text nor supported media.
|
|
948
|
+
if (!text && attachmentRefs.length === 0) {
|
|
949
|
+
return;
|
|
950
|
+
}
|
|
951
|
+
const event = createEvent({
|
|
952
|
+
type: "message.received",
|
|
953
|
+
source: "whatsapp",
|
|
954
|
+
priority: EventPriority.HIGH,
|
|
955
|
+
data: {
|
|
956
|
+
waMessageId: rawMessage?.key?.id ?? null,
|
|
957
|
+
},
|
|
958
|
+
});
|
|
959
|
+
Object.assign(event, {
|
|
960
|
+
sender: this.primaryRecipient,
|
|
961
|
+
channel: this.primaryRecipient,
|
|
962
|
+
content: text,
|
|
963
|
+
platform: "whatsapp",
|
|
964
|
+
threadId: null,
|
|
965
|
+
isDm: true,
|
|
966
|
+
isMention: false,
|
|
967
|
+
...(attachmentRefs.length > 0 ? { attachments: attachmentRefs } : {}),
|
|
968
|
+
});
|
|
969
|
+
this.onMessage(event);
|
|
970
|
+
}
|
|
971
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
972
|
+
async extractAndIngestWhatsAppMedia(rawMessage) {
|
|
973
|
+
/* v8 ignore next 1 — caller already checks attachmentStore && downloadMediaMessage */
|
|
974
|
+
if (!this.attachmentStore || !this.downloadMediaMessage)
|
|
975
|
+
return [];
|
|
976
|
+
const msg = unwrapWhatsAppMessage(rawMessage?.message ?? null);
|
|
977
|
+
if (!msg)
|
|
978
|
+
return [];
|
|
979
|
+
const refs = [];
|
|
980
|
+
// Image
|
|
981
|
+
const imgMsg = msg.imageMessage;
|
|
982
|
+
if (imgMsg) {
|
|
983
|
+
const mimeType = imgMsg.mimetype ?? "image/jpeg";
|
|
984
|
+
const fileLength = parseMediaLength(imgMsg.fileLength);
|
|
985
|
+
const caption = imgMsg.caption;
|
|
986
|
+
if (fileLength > WA_IMAGE_MAX_BYTES) {
|
|
987
|
+
logger.warn({ fileLength }, "whatsapp image exceeds 5 MB cap, skipping");
|
|
988
|
+
}
|
|
989
|
+
else {
|
|
990
|
+
const ref = await this.downloadAndIngestWhatsApp(rawMessage, mimeType, filenameForMime("image", mimeType, "jpg"), WA_IMAGE_MAX_BYTES, caption);
|
|
991
|
+
if (ref)
|
|
992
|
+
refs.push(ref);
|
|
993
|
+
}
|
|
994
|
+
return refs; // each message has exactly one media type
|
|
995
|
+
}
|
|
996
|
+
// Document
|
|
997
|
+
const docMsg = msg.documentMessage;
|
|
998
|
+
if (docMsg) {
|
|
999
|
+
const mimeType = docMsg.mimetype ?? "application/octet-stream";
|
|
1000
|
+
const fileLength = parseMediaLength(docMsg.fileLength);
|
|
1001
|
+
const fileName = docMsg.fileName ?? "document";
|
|
1002
|
+
const caption = docMsg.caption;
|
|
1003
|
+
if (fileLength > WA_DOCUMENT_MAX_BYTES) {
|
|
1004
|
+
logger.warn({ fileLength }, "whatsapp document exceeds 100 MB cap, skipping");
|
|
1005
|
+
}
|
|
1006
|
+
else {
|
|
1007
|
+
const ref = await this.downloadAndIngestWhatsApp(rawMessage, mimeType, fileName, WA_DOCUMENT_MAX_BYTES, caption);
|
|
1008
|
+
if (ref)
|
|
1009
|
+
refs.push(ref);
|
|
1010
|
+
}
|
|
1011
|
+
return refs;
|
|
1012
|
+
}
|
|
1013
|
+
const audioMsg = msg.audioMessage;
|
|
1014
|
+
if (audioMsg) {
|
|
1015
|
+
const mimeType = audioMsg.mimetype ?? "audio/ogg";
|
|
1016
|
+
const fileLength = parseMediaLength(audioMsg.fileLength);
|
|
1017
|
+
if (fileLength > WA_AUDIO_MAX_BYTES) {
|
|
1018
|
+
logger.warn({ fileLength }, "whatsapp audio exceeds 16 MB cap, skipping");
|
|
1019
|
+
}
|
|
1020
|
+
else {
|
|
1021
|
+
const ref = await this.downloadAndIngestWhatsApp(rawMessage, mimeType, filenameForMime("audio", mimeType, "ogg"), WA_AUDIO_MAX_BYTES);
|
|
1022
|
+
if (ref)
|
|
1023
|
+
refs.push(ref);
|
|
1024
|
+
}
|
|
1025
|
+
return refs;
|
|
1026
|
+
}
|
|
1027
|
+
const videoMsg = msg.videoMessage;
|
|
1028
|
+
if (videoMsg) {
|
|
1029
|
+
const mimeType = videoMsg.mimetype ?? "video/mp4";
|
|
1030
|
+
const fileLength = parseMediaLength(videoMsg.fileLength);
|
|
1031
|
+
const caption = videoMsg.caption;
|
|
1032
|
+
if (fileLength > WA_VIDEO_MAX_BYTES) {
|
|
1033
|
+
logger.warn({ fileLength }, "whatsapp video exceeds 16 MB cap, skipping");
|
|
1034
|
+
}
|
|
1035
|
+
else {
|
|
1036
|
+
const ref = await this.downloadAndIngestWhatsApp(rawMessage, mimeType, filenameForMime("video", mimeType, "mp4"), WA_VIDEO_MAX_BYTES, caption);
|
|
1037
|
+
if (ref)
|
|
1038
|
+
refs.push(ref);
|
|
1039
|
+
}
|
|
1040
|
+
return refs;
|
|
1041
|
+
}
|
|
1042
|
+
if (msg.stickerMessage) {
|
|
1043
|
+
logger.debug("whatsapp sticker ignored");
|
|
1044
|
+
}
|
|
1045
|
+
return refs;
|
|
1046
|
+
}
|
|
1047
|
+
async downloadAndIngestWhatsApp(
|
|
1048
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1049
|
+
rawMessage, mimeType, filename, maxBytes, caption) {
|
|
1050
|
+
/* v8 ignore next 1 — caller (extractAndIngestWhatsAppMedia) already checks both are set */
|
|
1051
|
+
if (!this.downloadMediaMessage || !this.attachmentStore)
|
|
1052
|
+
return null;
|
|
1053
|
+
let buf;
|
|
1054
|
+
try {
|
|
1055
|
+
buf = await this.downloadMediaMessage(rawMessage, "buffer");
|
|
1056
|
+
}
|
|
1057
|
+
catch (err) {
|
|
1058
|
+
logger.error({ err }, "whatsapp downloadMediaMessage failed");
|
|
1059
|
+
return null;
|
|
1060
|
+
}
|
|
1061
|
+
try {
|
|
1062
|
+
const stream = Readable.from([buf]);
|
|
1063
|
+
const result = await this.attachmentStore.ingestStream({
|
|
1064
|
+
stream,
|
|
1065
|
+
declaredMimeType: mimeType,
|
|
1066
|
+
originalFilename: filename,
|
|
1067
|
+
direction: "inbound",
|
|
1068
|
+
provenance: "user_whatsapp",
|
|
1069
|
+
caption,
|
|
1070
|
+
maxSizeBytes: maxBytes,
|
|
1071
|
+
});
|
|
1072
|
+
return {
|
|
1073
|
+
id: result.id,
|
|
1074
|
+
originalFilename: result.originalFilename,
|
|
1075
|
+
mimeType: result.mimeType,
|
|
1076
|
+
sizeBytes: result.sizeBytes,
|
|
1077
|
+
caption,
|
|
1078
|
+
};
|
|
1079
|
+
}
|
|
1080
|
+
catch (err) {
|
|
1081
|
+
logger.error({ err }, "whatsapp file ingest failed");
|
|
1082
|
+
return null;
|
|
1083
|
+
}
|
|
1084
|
+
}
|
|
1085
|
+
captureOwnerIdentity(update) {
|
|
1086
|
+
const me = update?.me;
|
|
1087
|
+
const lid = normalizeWhatsAppUserJid(typeof me?.lid === "string" ? me.lid : null);
|
|
1088
|
+
if (lid) {
|
|
1089
|
+
this.ownerLidRecipient = lid;
|
|
1090
|
+
}
|
|
1091
|
+
}
|
|
1092
|
+
syncOwnerIdentityFromAuthState() {
|
|
1093
|
+
const me = this.authState?.state?.creds?.me;
|
|
1094
|
+
const lid = normalizeWhatsAppUserJid(typeof me?.lid === "string" ? me.lid : null);
|
|
1095
|
+
if (lid) {
|
|
1096
|
+
this.ownerLidRecipient = lid;
|
|
1097
|
+
}
|
|
1098
|
+
}
|
|
1099
|
+
isAuthorizedOwnerJid(jid) {
|
|
1100
|
+
const normalized = normalizeWhatsAppUserJid(jid);
|
|
1101
|
+
/* v8 ignore next 1 — jid already passed isDirectUserJid check, so normalized is never null here */
|
|
1102
|
+
if (!normalized)
|
|
1103
|
+
return false;
|
|
1104
|
+
if (normalized === normalizeWhatsAppUserJid(this.primaryRecipient)) {
|
|
1105
|
+
return true;
|
|
1106
|
+
}
|
|
1107
|
+
this.syncOwnerIdentityFromAuthState();
|
|
1108
|
+
return normalized === this.ownerLidRecipient;
|
|
1109
|
+
}
|
|
1110
|
+
async captureQr(payload) {
|
|
1111
|
+
if (!this.renderQrToDataUrl) {
|
|
1112
|
+
throw new Error("qrcode renderer not initialized");
|
|
1113
|
+
}
|
|
1114
|
+
const dataUrl = await this.renderQrToDataUrl(payload, {
|
|
1115
|
+
width: 320,
|
|
1116
|
+
margin: 2,
|
|
1117
|
+
errorCorrectionLevel: "M",
|
|
1118
|
+
});
|
|
1119
|
+
const now = Date.now();
|
|
1120
|
+
this.latestQr = {
|
|
1121
|
+
payload,
|
|
1122
|
+
dataUrl,
|
|
1123
|
+
generatedAt: now,
|
|
1124
|
+
expiresAt: now + QR_TTL_MS,
|
|
1125
|
+
};
|
|
1126
|
+
this.writeQrFile(payload);
|
|
1127
|
+
}
|
|
1128
|
+
writeQrFile(qr) {
|
|
1129
|
+
try {
|
|
1130
|
+
const qrPath = join(this.authDir, QR_FILENAME);
|
|
1131
|
+
writeFileSync(qrPath, qr, { mode: 0o600 });
|
|
1132
|
+
}
|
|
1133
|
+
catch (err) {
|
|
1134
|
+
logger.warn({ err }, "Failed to persist WhatsApp QR file");
|
|
1135
|
+
}
|
|
1136
|
+
if (this.qrExpiryTimer) {
|
|
1137
|
+
clearTimeout(this.qrExpiryTimer);
|
|
1138
|
+
}
|
|
1139
|
+
this.qrExpiryTimer = setTimeout(() => {
|
|
1140
|
+
this.qrExpiryTimer = null;
|
|
1141
|
+
this.clearQrSnapshot();
|
|
1142
|
+
this.clearQrFile();
|
|
1143
|
+
}, QR_TTL_MS);
|
|
1144
|
+
this.qrExpiryTimer.unref?.();
|
|
1145
|
+
}
|
|
1146
|
+
clearQrSnapshot() {
|
|
1147
|
+
this.latestQr = null;
|
|
1148
|
+
if (this.qrExpiryTimer) {
|
|
1149
|
+
clearTimeout(this.qrExpiryTimer);
|
|
1150
|
+
this.qrExpiryTimer = null;
|
|
1151
|
+
}
|
|
1152
|
+
}
|
|
1153
|
+
clearQrFile() {
|
|
1154
|
+
const qrPath = join(this.authDir, QR_FILENAME);
|
|
1155
|
+
try {
|
|
1156
|
+
unlinkSync(qrPath);
|
|
1157
|
+
}
|
|
1158
|
+
catch {
|
|
1159
|
+
// Ignore missing-file errors.
|
|
1160
|
+
}
|
|
1161
|
+
}
|
|
1162
|
+
/**
|
|
1163
|
+
* Close and forget the current Baileys socket.
|
|
1164
|
+
*
|
|
1165
|
+
* IMPORTANT — ordering matters: Baileys' `sock.end(error)` emits
|
|
1166
|
+
* `connection.update` *synchronously* from inside the call (see
|
|
1167
|
+
* Baileys/Socket/socket.js, the `end()` closure that does
|
|
1168
|
+
* `ev.emit('connection.update', { connection: 'close', ... })`). That re-
|
|
1169
|
+
* enters our own `handleConnectionUpdate` while we are still in the
|
|
1170
|
+
* middle of `closeSocket()`. We defend against this with two layers:
|
|
1171
|
+
*
|
|
1172
|
+
* 1. **Null `this.sock` first.** The handler's `if (sock !== this.sock)`
|
|
1173
|
+
* guard then trivially returns: the synchronous reentry sees a stale
|
|
1174
|
+
* `sock` reference and a fresh-null `this.sock`.
|
|
1175
|
+
* 2. **`intentionalClose` flag.** Even if some other event type fires
|
|
1176
|
+
* after the null-out (e.g. a delayed ws-close on a later tick), the
|
|
1177
|
+
* close handler skips the reconnect classifier path entirely.
|
|
1178
|
+
*
|
|
1179
|
+
* Without these guards the synchronous reentry was scheduling a spurious
|
|
1180
|
+
* reconnect timer that fired ~1 s after our deliberate close, creating a
|
|
1181
|
+
* second concurrent socket. WhatsApp then rejected the older session with
|
|
1182
|
+
* `stream:error type="replaced"`, leaving the connection unstable.
|
|
1183
|
+
*/
|
|
1184
|
+
closeSocket() {
|
|
1185
|
+
const sock = this.sock;
|
|
1186
|
+
if (!sock)
|
|
1187
|
+
return;
|
|
1188
|
+
this.sock = null;
|
|
1189
|
+
this.intentionalClose = true;
|
|
1190
|
+
// Remove application-level ev listeners before end(). Baileys' end()
|
|
1191
|
+
// only clears WebSocket-level listeners (ws 'close'/'open'/'message')
|
|
1192
|
+
// but leaves ev listeners (creds.update, messages.upsert, etc.) intact.
|
|
1193
|
+
// Without this, repeated reconnection cycles accumulate stale listeners
|
|
1194
|
+
// on the old socket's EventEmitter until the socket is garbage collected.
|
|
1195
|
+
try {
|
|
1196
|
+
sock.ev?.removeAllListeners?.();
|
|
1197
|
+
}
|
|
1198
|
+
catch {
|
|
1199
|
+
// Ignore — ev may already be torn down.
|
|
1200
|
+
}
|
|
1201
|
+
try {
|
|
1202
|
+
sock.ws?.close?.();
|
|
1203
|
+
}
|
|
1204
|
+
catch {
|
|
1205
|
+
// Ignore socket shutdown errors.
|
|
1206
|
+
}
|
|
1207
|
+
try {
|
|
1208
|
+
sock.end?.(new Error("shutdown"));
|
|
1209
|
+
}
|
|
1210
|
+
catch {
|
|
1211
|
+
// Ignore socket shutdown errors.
|
|
1212
|
+
}
|
|
1213
|
+
this.intentionalClose = false;
|
|
1214
|
+
}
|
|
1215
|
+
}
|
|
1216
|
+
//# sourceMappingURL=whatsapp-adapter.js.map
|