@spinabot/brigade 1.6.1 → 1.8.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/dist/agents/agent-loop.d.ts +13 -0
- package/dist/agents/agent-loop.d.ts.map +1 -1
- package/dist/agents/agent-loop.js +5 -0
- package/dist/agents/agent-loop.js.map +1 -1
- package/dist/agents/channels/access-control/group-tool-policy.d.ts +73 -0
- package/dist/agents/channels/access-control/group-tool-policy.d.ts.map +1 -0
- package/dist/agents/channels/access-control/group-tool-policy.js +193 -0
- package/dist/agents/channels/access-control/group-tool-policy.js.map +1 -0
- package/dist/agents/channels/access-control/index.d.ts +1 -0
- package/dist/agents/channels/access-control/index.d.ts.map +1 -1
- package/dist/agents/channels/access-control/index.js +1 -0
- package/dist/agents/channels/access-control/index.js.map +1 -1
- package/dist/agents/channels/bluebubbles/account-config.d.ts +253 -0
- package/dist/agents/channels/bluebubbles/account-config.d.ts.map +1 -0
- package/dist/agents/channels/bluebubbles/account-config.js +486 -0
- package/dist/agents/channels/bluebubbles/account-config.js.map +1 -0
- package/dist/agents/channels/bluebubbles/account-registry.d.ts +33 -0
- package/dist/agents/channels/bluebubbles/account-registry.d.ts.map +1 -0
- package/dist/agents/channels/bluebubbles/account-registry.js +46 -0
- package/dist/agents/channels/bluebubbles/account-registry.js.map +1 -0
- package/dist/agents/channels/bluebubbles/adapter.d.ts +45 -0
- package/dist/agents/channels/bluebubbles/adapter.d.ts.map +1 -0
- package/dist/agents/channels/bluebubbles/adapter.js +366 -0
- package/dist/agents/channels/bluebubbles/adapter.js.map +1 -0
- package/dist/agents/channels/bluebubbles/catchup-cursor.d.ts +52 -0
- package/dist/agents/channels/bluebubbles/catchup-cursor.d.ts.map +1 -0
- package/dist/agents/channels/bluebubbles/catchup-cursor.js +118 -0
- package/dist/agents/channels/bluebubbles/catchup-cursor.js.map +1 -0
- package/dist/agents/channels/bluebubbles/catchup.d.ts +114 -0
- package/dist/agents/channels/bluebubbles/catchup.d.ts.map +1 -0
- package/dist/agents/channels/bluebubbles/catchup.js +220 -0
- package/dist/agents/channels/bluebubbles/catchup.js.map +1 -0
- package/dist/agents/channels/bluebubbles/chat.d.ts +75 -0
- package/dist/agents/channels/bluebubbles/chat.d.ts.map +1 -0
- package/dist/agents/channels/bluebubbles/chat.js +182 -0
- package/dist/agents/channels/bluebubbles/chat.js.map +1 -0
- package/dist/agents/channels/bluebubbles/connection.d.ts +95 -0
- package/dist/agents/channels/bluebubbles/connection.d.ts.map +1 -0
- package/dist/agents/channels/bluebubbles/connection.js +413 -0
- package/dist/agents/channels/bluebubbles/connection.js.map +1 -0
- package/dist/agents/channels/bluebubbles/contact-names.d.ts +79 -0
- package/dist/agents/channels/bluebubbles/contact-names.d.ts.map +1 -0
- package/dist/agents/channels/bluebubbles/contact-names.js +188 -0
- package/dist/agents/channels/bluebubbles/contact-names.js.map +1 -0
- package/dist/agents/channels/bluebubbles/debounce.d.ts +78 -0
- package/dist/agents/channels/bluebubbles/debounce.d.ts.map +1 -0
- package/dist/agents/channels/bluebubbles/debounce.js +173 -0
- package/dist/agents/channels/bluebubbles/debounce.js.map +1 -0
- package/dist/agents/channels/bluebubbles/dedupe.d.ts +25 -0
- package/dist/agents/channels/bluebubbles/dedupe.d.ts.map +1 -0
- package/dist/agents/channels/bluebubbles/dedupe.js +35 -0
- package/dist/agents/channels/bluebubbles/dedupe.js.map +1 -0
- package/dist/agents/channels/bluebubbles/effects.d.ts +17 -0
- package/dist/agents/channels/bluebubbles/effects.d.ts.map +1 -0
- package/dist/agents/channels/bluebubbles/effects.js +57 -0
- package/dist/agents/channels/bluebubbles/effects.js.map +1 -0
- package/dist/agents/channels/bluebubbles/history.d.ts +56 -0
- package/dist/agents/channels/bluebubbles/history.d.ts.map +1 -0
- package/dist/agents/channels/bluebubbles/history.js +140 -0
- package/dist/agents/channels/bluebubbles/history.js.map +1 -0
- package/dist/agents/channels/bluebubbles/index.d.ts +18 -0
- package/dist/agents/channels/bluebubbles/index.d.ts.map +1 -0
- package/dist/agents/channels/bluebubbles/index.js +18 -0
- package/dist/agents/channels/bluebubbles/index.js.map +1 -0
- package/dist/agents/channels/bluebubbles/media.d.ts +104 -0
- package/dist/agents/channels/bluebubbles/media.d.ts.map +1 -0
- package/dist/agents/channels/bluebubbles/media.js +222 -0
- package/dist/agents/channels/bluebubbles/media.js.map +1 -0
- package/dist/agents/channels/bluebubbles/messaging.d.ts +13 -0
- package/dist/agents/channels/bluebubbles/messaging.d.ts.map +1 -0
- package/dist/agents/channels/bluebubbles/messaging.js +36 -0
- package/dist/agents/channels/bluebubbles/messaging.js.map +1 -0
- package/dist/agents/channels/bluebubbles/module.d.ts +24 -0
- package/dist/agents/channels/bluebubbles/module.d.ts.map +1 -0
- package/dist/agents/channels/bluebubbles/module.js +52 -0
- package/dist/agents/channels/bluebubbles/module.js.map +1 -0
- package/dist/agents/channels/bluebubbles/normalize.d.ts +111 -0
- package/dist/agents/channels/bluebubbles/normalize.d.ts.map +1 -0
- package/dist/agents/channels/bluebubbles/normalize.js +239 -0
- package/dist/agents/channels/bluebubbles/normalize.js.map +1 -0
- package/dist/agents/channels/bluebubbles/plugin.d.ts +46 -0
- package/dist/agents/channels/bluebubbles/plugin.d.ts.map +1 -0
- package/dist/agents/channels/bluebubbles/plugin.js +242 -0
- package/dist/agents/channels/bluebubbles/plugin.js.map +1 -0
- package/dist/agents/channels/bluebubbles/probe.d.ts +79 -0
- package/dist/agents/channels/bluebubbles/probe.d.ts.map +1 -0
- package/dist/agents/channels/bluebubbles/probe.js +138 -0
- package/dist/agents/channels/bluebubbles/probe.js.map +1 -0
- package/dist/agents/channels/bluebubbles/reactions.d.ts +46 -0
- package/dist/agents/channels/bluebubbles/reactions.d.ts.map +1 -0
- package/dist/agents/channels/bluebubbles/reactions.js +207 -0
- package/dist/agents/channels/bluebubbles/reactions.js.map +1 -0
- package/dist/agents/channels/bluebubbles/send.d.ts +132 -0
- package/dist/agents/channels/bluebubbles/send.d.ts.map +1 -0
- package/dist/agents/channels/bluebubbles/send.js +327 -0
- package/dist/agents/channels/bluebubbles/send.js.map +1 -0
- package/dist/agents/channels/bluebubbles/status-issues.d.ts +57 -0
- package/dist/agents/channels/bluebubbles/status-issues.d.ts.map +1 -0
- package/dist/agents/channels/bluebubbles/status-issues.js +93 -0
- package/dist/agents/channels/bluebubbles/status-issues.js.map +1 -0
- package/dist/agents/channels/bluebubbles/types.d.ts +69 -0
- package/dist/agents/channels/bluebubbles/types.d.ts.map +1 -0
- package/dist/agents/channels/bluebubbles/types.js +118 -0
- package/dist/agents/channels/bluebubbles/types.js.map +1 -0
- package/dist/agents/channels/bluebubbles/webhook.d.ts +97 -0
- package/dist/agents/channels/bluebubbles/webhook.d.ts.map +1 -0
- package/dist/agents/channels/bluebubbles/webhook.js +249 -0
- package/dist/agents/channels/bluebubbles/webhook.js.map +1 -0
- package/dist/agents/channels/bundled-channel-metas.d.ts +13 -0
- package/dist/agents/channels/bundled-channel-metas.d.ts.map +1 -1
- package/dist/agents/channels/bundled-channel-metas.js +33 -0
- package/dist/agents/channels/bundled-channel-metas.js.map +1 -1
- package/dist/agents/channels/discord/account-config.d.ts +60 -0
- package/dist/agents/channels/discord/account-config.d.ts.map +1 -1
- package/dist/agents/channels/discord/account-config.js +89 -0
- package/dist/agents/channels/discord/account-config.js.map +1 -1
- package/dist/agents/channels/discord/adapter.d.ts +24 -1
- package/dist/agents/channels/discord/adapter.d.ts.map +1 -1
- package/dist/agents/channels/discord/adapter.js +208 -41
- package/dist/agents/channels/discord/adapter.js.map +1 -1
- package/dist/agents/channels/discord/component-blocks.d.ts +108 -0
- package/dist/agents/channels/discord/component-blocks.d.ts.map +1 -0
- package/dist/agents/channels/discord/component-blocks.js +113 -0
- package/dist/agents/channels/discord/component-blocks.js.map +1 -0
- package/dist/agents/channels/discord/components.d.ts +78 -0
- package/dist/agents/channels/discord/components.d.ts.map +1 -1
- package/dist/agents/channels/discord/components.js +89 -0
- package/dist/agents/channels/discord/components.js.map +1 -1
- package/dist/agents/channels/discord/connection.d.ts +195 -12
- package/dist/agents/channels/discord/connection.d.ts.map +1 -1
- package/dist/agents/channels/discord/connection.js +852 -38
- package/dist/agents/channels/discord/connection.js.map +1 -1
- package/dist/agents/channels/discord/directory-cache.d.ts +47 -0
- package/dist/agents/channels/discord/directory-cache.d.ts.map +1 -0
- package/dist/agents/channels/discord/directory-cache.js +131 -0
- package/dist/agents/channels/discord/directory-cache.js.map +1 -0
- package/dist/agents/channels/discord/directory-live.d.ts +61 -0
- package/dist/agents/channels/discord/directory-live.d.ts.map +1 -0
- package/dist/agents/channels/discord/directory-live.js +140 -0
- package/dist/agents/channels/discord/directory-live.js.map +1 -0
- package/dist/agents/channels/discord/format.d.ts +15 -0
- package/dist/agents/channels/discord/format.d.ts.map +1 -1
- package/dist/agents/channels/discord/format.js +56 -0
- package/dist/agents/channels/discord/format.js.map +1 -1
- package/dist/agents/channels/discord/guilds.d.ts +25 -0
- package/dist/agents/channels/discord/guilds.d.ts.map +1 -0
- package/dist/agents/channels/discord/guilds.js +46 -0
- package/dist/agents/channels/discord/guilds.js.map +1 -0
- package/dist/agents/channels/discord/inbound-extras.d.ts +166 -9
- package/dist/agents/channels/discord/inbound-extras.d.ts.map +1 -1
- package/dist/agents/channels/discord/inbound-extras.js +246 -8
- package/dist/agents/channels/discord/inbound-extras.js.map +1 -1
- package/dist/agents/channels/discord/index.d.ts +10 -3
- package/dist/agents/channels/discord/index.d.ts.map +1 -1
- package/dist/agents/channels/discord/index.js +10 -3
- package/dist/agents/channels/discord/index.js.map +1 -1
- package/dist/agents/channels/discord/modal-registry.d.ts +89 -0
- package/dist/agents/channels/discord/modal-registry.d.ts.map +1 -0
- package/dist/agents/channels/discord/modal-registry.js +104 -0
- package/dist/agents/channels/discord/modal-registry.js.map +1 -0
- package/dist/agents/channels/discord/modals.d.ts +100 -0
- package/dist/agents/channels/discord/modals.d.ts.map +1 -0
- package/dist/agents/channels/discord/modals.js +124 -0
- package/dist/agents/channels/discord/modals.js.map +1 -0
- package/dist/agents/channels/discord/permission-audit.d.ts +43 -0
- package/dist/agents/channels/discord/permission-audit.d.ts.map +1 -0
- package/dist/agents/channels/discord/permission-audit.js +192 -0
- package/dist/agents/channels/discord/permission-audit.js.map +1 -0
- package/dist/agents/channels/discord/plugin.d.ts +18 -2
- package/dist/agents/channels/discord/plugin.d.ts.map +1 -1
- package/dist/agents/channels/discord/plugin.js +73 -4
- package/dist/agents/channels/discord/plugin.js.map +1 -1
- package/dist/agents/channels/discord/probe.d.ts +23 -1
- package/dist/agents/channels/discord/probe.d.ts.map +1 -1
- package/dist/agents/channels/discord/probe.js +40 -5
- package/dist/agents/channels/discord/probe.js.map +1 -1
- package/dist/agents/channels/discord/rest-actions.d.ts +346 -0
- package/dist/agents/channels/discord/rest-actions.d.ts.map +1 -0
- package/dist/agents/channels/discord/rest-actions.js +559 -0
- package/dist/agents/channels/discord/rest-actions.js.map +1 -0
- package/dist/agents/channels/discord/rest-components.d.ts +122 -0
- package/dist/agents/channels/discord/rest-components.d.ts.map +1 -0
- package/dist/agents/channels/discord/rest-components.js +243 -0
- package/dist/agents/channels/discord/rest-components.js.map +1 -0
- package/dist/agents/channels/discord/security-audit.d.ts +29 -0
- package/dist/agents/channels/discord/security-audit.d.ts.map +1 -0
- package/dist/agents/channels/discord/security-audit.js +94 -0
- package/dist/agents/channels/discord/security-audit.js.map +1 -0
- package/dist/agents/channels/discord/security-doctor.d.ts +43 -0
- package/dist/agents/channels/discord/security-doctor.d.ts.map +1 -0
- package/dist/agents/channels/discord/security-doctor.js +83 -0
- package/dist/agents/channels/discord/security-doctor.js.map +1 -0
- package/dist/agents/channels/discord/status-issues.d.ts +37 -0
- package/dist/agents/channels/discord/status-issues.d.ts.map +1 -0
- package/dist/agents/channels/discord/status-issues.js +66 -0
- package/dist/agents/channels/discord/status-issues.js.map +1 -0
- package/dist/agents/channels/discord/subagent-thread-binding-store.d.ts +57 -0
- package/dist/agents/channels/discord/subagent-thread-binding-store.d.ts.map +1 -0
- package/dist/agents/channels/discord/subagent-thread-binding-store.js +98 -0
- package/dist/agents/channels/discord/subagent-thread-binding-store.js.map +1 -0
- package/dist/agents/channels/discord/subagent-thread-binding.d.ts +95 -0
- package/dist/agents/channels/discord/subagent-thread-binding.d.ts.map +1 -0
- package/dist/agents/channels/discord/subagent-thread-binding.js +208 -0
- package/dist/agents/channels/discord/subagent-thread-binding.js.map +1 -0
- package/dist/agents/channels/discord/system-events.d.ts +31 -0
- package/dist/agents/channels/discord/system-events.d.ts.map +1 -0
- package/dist/agents/channels/discord/system-events.js +74 -0
- package/dist/agents/channels/discord/system-events.js.map +1 -0
- package/dist/agents/channels/general-callback.d.ts +12 -0
- package/dist/agents/channels/general-callback.d.ts.map +1 -1
- package/dist/agents/channels/general-callback.js +18 -0
- package/dist/agents/channels/general-callback.js.map +1 -1
- package/dist/agents/channels/imessage/account-config.d.ts +178 -0
- package/dist/agents/channels/imessage/account-config.d.ts.map +1 -0
- package/dist/agents/channels/imessage/account-config.js +371 -0
- package/dist/agents/channels/imessage/account-config.js.map +1 -0
- package/dist/agents/channels/imessage/adapter.d.ts +36 -0
- package/dist/agents/channels/imessage/adapter.d.ts.map +1 -0
- package/dist/agents/channels/imessage/adapter.js +286 -0
- package/dist/agents/channels/imessage/adapter.js.map +1 -0
- package/dist/agents/channels/imessage/client.d.ts +99 -0
- package/dist/agents/channels/imessage/client.d.ts.map +1 -0
- package/dist/agents/channels/imessage/client.js +231 -0
- package/dist/agents/channels/imessage/client.js.map +1 -0
- package/dist/agents/channels/imessage/connection.d.ts +101 -0
- package/dist/agents/channels/imessage/connection.d.ts.map +1 -0
- package/dist/agents/channels/imessage/connection.js +367 -0
- package/dist/agents/channels/imessage/connection.js.map +1 -0
- package/dist/agents/channels/imessage/format.d.ts +45 -0
- package/dist/agents/channels/imessage/format.d.ts.map +1 -0
- package/dist/agents/channels/imessage/format.js +170 -0
- package/dist/agents/channels/imessage/format.js.map +1 -0
- package/dist/agents/channels/imessage/history.d.ts +49 -0
- package/dist/agents/channels/imessage/history.d.ts.map +1 -0
- package/dist/agents/channels/imessage/history.js +74 -0
- package/dist/agents/channels/imessage/history.js.map +1 -0
- package/dist/agents/channels/imessage/index.d.ts +25 -0
- package/dist/agents/channels/imessage/index.d.ts.map +1 -0
- package/dist/agents/channels/imessage/index.js +25 -0
- package/dist/agents/channels/imessage/index.js.map +1 -0
- package/dist/agents/channels/imessage/media.d.ts +92 -0
- package/dist/agents/channels/imessage/media.d.ts.map +1 -0
- package/dist/agents/channels/imessage/media.js +196 -0
- package/dist/agents/channels/imessage/media.js.map +1 -0
- package/dist/agents/channels/imessage/messaging.d.ts +14 -0
- package/dist/agents/channels/imessage/messaging.d.ts.map +1 -0
- package/dist/agents/channels/imessage/messaging.js +37 -0
- package/dist/agents/channels/imessage/messaging.js.map +1 -0
- package/dist/agents/channels/imessage/module.d.ts +16 -0
- package/dist/agents/channels/imessage/module.d.ts.map +1 -0
- package/dist/agents/channels/imessage/module.js +23 -0
- package/dist/agents/channels/imessage/module.js.map +1 -0
- package/dist/agents/channels/imessage/monitor.d.ts +207 -0
- package/dist/agents/channels/imessage/monitor.d.ts.map +1 -0
- package/dist/agents/channels/imessage/monitor.js +504 -0
- package/dist/agents/channels/imessage/monitor.js.map +1 -0
- package/dist/agents/channels/imessage/plugin.d.ts +53 -0
- package/dist/agents/channels/imessage/plugin.d.ts.map +1 -0
- package/dist/agents/channels/imessage/plugin.js +215 -0
- package/dist/agents/channels/imessage/plugin.js.map +1 -0
- package/dist/agents/channels/imessage/probe.d.ts +68 -0
- package/dist/agents/channels/imessage/probe.d.ts.map +1 -0
- package/dist/agents/channels/imessage/probe.js +134 -0
- package/dist/agents/channels/imessage/probe.js.map +1 -0
- package/dist/agents/channels/imessage/remote-attachments.d.ts +61 -0
- package/dist/agents/channels/imessage/remote-attachments.d.ts.map +1 -0
- package/dist/agents/channels/imessage/remote-attachments.js +131 -0
- package/dist/agents/channels/imessage/remote-attachments.js.map +1 -0
- package/dist/agents/channels/imessage/send.d.ts +61 -0
- package/dist/agents/channels/imessage/send.d.ts.map +1 -0
- package/dist/agents/channels/imessage/send.js +108 -0
- package/dist/agents/channels/imessage/send.js.map +1 -0
- package/dist/agents/channels/imessage/targets.d.ts +91 -0
- package/dist/agents/channels/imessage/targets.d.ts.map +1 -0
- package/dist/agents/channels/imessage/targets.js +245 -0
- package/dist/agents/channels/imessage/targets.js.map +1 -0
- package/dist/agents/channels/imessage/watch-error.d.ts +23 -0
- package/dist/agents/channels/imessage/watch-error.d.ts.map +1 -0
- package/dist/agents/channels/imessage/watch-error.js +69 -0
- package/dist/agents/channels/imessage/watch-error.js.map +1 -0
- package/dist/agents/channels/inbound-pipeline.d.ts +11 -0
- package/dist/agents/channels/inbound-pipeline.d.ts.map +1 -1
- package/dist/agents/channels/inbound-pipeline.js +25 -4
- package/dist/agents/channels/inbound-pipeline.js.map +1 -1
- package/dist/agents/channels/manager.d.ts +9 -0
- package/dist/agents/channels/manager.d.ts.map +1 -1
- package/dist/agents/channels/manager.js.map +1 -1
- package/dist/agents/channels/sdk.d.ts +4 -0
- package/dist/agents/channels/sdk.d.ts.map +1 -1
- package/dist/agents/channels/sdk.js +4 -0
- package/dist/agents/channels/sdk.js.map +1 -1
- package/dist/agents/extensions/modules/index.d.ts.map +1 -1
- package/dist/agents/extensions/modules/index.js +12 -0
- package/dist/agents/extensions/modules/index.js.map +1 -1
- package/dist/agents/extensions/types.d.ts +7 -0
- package/dist/agents/extensions/types.d.ts.map +1 -1
- package/dist/agents/extensions/types.js.map +1 -1
- package/dist/agents/session-wiring.d.ts +31 -0
- package/dist/agents/session-wiring.d.ts.map +1 -1
- package/dist/agents/session-wiring.js +45 -2
- package/dist/agents/session-wiring.js.map +1 -1
- package/dist/agents/subagent-announce-delivery.d.ts +10 -0
- package/dist/agents/subagent-announce-delivery.d.ts.map +1 -1
- package/dist/agents/subagent-announce-delivery.js +1 -0
- package/dist/agents/subagent-announce-delivery.js.map +1 -1
- package/dist/agents/subagent-completion-bridge.d.ts.map +1 -1
- package/dist/agents/subagent-completion-bridge.js +81 -0
- package/dist/agents/subagent-completion-bridge.js.map +1 -1
- package/dist/agents/subagent-spawn.d.ts.map +1 -1
- package/dist/agents/subagent-spawn.js +57 -4
- package/dist/agents/subagent-spawn.js.map +1 -1
- package/dist/agents/tools/bluebubbles-action-tool.d.ts +66 -0
- package/dist/agents/tools/bluebubbles-action-tool.d.ts.map +1 -0
- package/dist/agents/tools/bluebubbles-action-tool.js +234 -0
- package/dist/agents/tools/bluebubbles-action-tool.js.map +1 -0
- package/dist/agents/tools/discord-action-tool.d.ts +224 -0
- package/dist/agents/tools/discord-action-tool.d.ts.map +1 -0
- package/dist/agents/tools/discord-action-tool.js +848 -0
- package/dist/agents/tools/discord-action-tool.js.map +1 -0
- package/dist/agents/tools/registry.d.ts.map +1 -1
- package/dist/agents/tools/registry.js +39 -0
- package/dist/agents/tools/registry.js.map +1 -1
- package/dist/agents/tools/sessions/index.d.ts +8 -0
- package/dist/agents/tools/sessions/index.d.ts.map +1 -1
- package/dist/agents/tools/sessions/index.js +15 -3
- package/dist/agents/tools/sessions/index.js.map +1 -1
- package/dist/buildstamp.json +1 -1
- package/dist/cli/commands/channels.d.ts +2 -0
- package/dist/cli/commands/channels.d.ts.map +1 -1
- package/dist/cli/commands/channels.js +58 -1
- package/dist/cli/commands/channels.js.map +1 -1
- package/dist/core/server.d.ts.map +1 -1
- package/dist/core/server.js +48 -2
- package/dist/core/server.js.map +1 -1
- package/dist/infra/net/fetch-guard.d.ts +24 -2
- package/dist/infra/net/fetch-guard.d.ts.map +1 -1
- package/dist/infra/net/fetch-guard.js +78 -31
- package/dist/infra/net/fetch-guard.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BlueBubbles inbound gateway route.
|
|
3
|
+
*
|
|
4
|
+
* BlueBubbles POSTs each event to a Brigade gateway HTTP route. Because a
|
|
5
|
+
* BlueBubbles webhook CANNOT send custom headers, the server PASSWORD is embedded
|
|
6
|
+
* in the registered webhook URL's QUERY STRING (`?password=…` / `?guid=…`) and
|
|
7
|
+
* verified on each inbound POST. (Some BlueBubbles versions also send the token
|
|
8
|
+
* as a header — those are accepted too.) Verification happens FIRST, before the
|
|
9
|
+
* body is parsed / routed, so a forged event can't reach the agent.
|
|
10
|
+
*
|
|
11
|
+
* Mirrors `slack/webhook.ts` (the webhook-ingress blueprint): build an
|
|
12
|
+
* `HttpRoute`, register it via `b.httpRoute(...)` from the module, resolve the
|
|
13
|
+
* started adapter (`resolveSink`) at REQUEST time (late binding — the route is
|
|
14
|
+
* registered before the plugin starts accounts), always reply 200 so BlueBubbles
|
|
15
|
+
* doesn't retry-storm.
|
|
16
|
+
*/
|
|
17
|
+
import { timingSafeEqual } from "node:crypto";
|
|
18
|
+
/** Cap on the webhook body (a BlueBubbles event is small; 4 MiB is generous). */
|
|
19
|
+
const WEBHOOK_MAX_BODY_BYTES = 4 * 1024 * 1024;
|
|
20
|
+
/** Default fixed-window rate-limit: max authenticated requests per window. */
|
|
21
|
+
export const WEBHOOK_RATE_LIMIT_MAX = 240;
|
|
22
|
+
/** Default fixed-window length (ms). 240 req / 10s ≈ 24 rps sustained per account. */
|
|
23
|
+
export const WEBHOOK_RATE_LIMIT_WINDOW_MS = 10_000;
|
|
24
|
+
/** Default bound on concurrently in-flight handler bodies (normalize/dedupe/dispatch). */
|
|
25
|
+
export const WEBHOOK_MAX_IN_FLIGHT = 32;
|
|
26
|
+
/** Build a fixed-window rate limiter (`max` requests per `windowMs`). */
|
|
27
|
+
export function createFixedWindowRateLimiter(max, windowMs) {
|
|
28
|
+
const cap = Math.max(1, Math.floor(max));
|
|
29
|
+
const span = Math.max(1, Math.floor(windowMs));
|
|
30
|
+
let windowStart = 0;
|
|
31
|
+
let count = 0;
|
|
32
|
+
return {
|
|
33
|
+
hit(nowMs = Date.now()) {
|
|
34
|
+
if (nowMs - windowStart >= span) {
|
|
35
|
+
windowStart = nowMs;
|
|
36
|
+
count = 0;
|
|
37
|
+
}
|
|
38
|
+
count++;
|
|
39
|
+
return count <= cap;
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/** Build an in-flight concurrency limiter capped at `max` simultaneous holders. */
|
|
44
|
+
export function createInFlightLimiter(max) {
|
|
45
|
+
const cap = Math.max(1, Math.floor(max));
|
|
46
|
+
let active = 0;
|
|
47
|
+
return {
|
|
48
|
+
tryAcquire() {
|
|
49
|
+
if (active >= cap)
|
|
50
|
+
return null;
|
|
51
|
+
active++;
|
|
52
|
+
let released = false;
|
|
53
|
+
return () => {
|
|
54
|
+
if (released)
|
|
55
|
+
return;
|
|
56
|
+
released = true;
|
|
57
|
+
active--;
|
|
58
|
+
};
|
|
59
|
+
},
|
|
60
|
+
inFlight: () => active,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/** Constant-time compare of two strings — avoids leaking via timing. */
|
|
64
|
+
export function safeEqualToken(a, b) {
|
|
65
|
+
if (a.length !== b.length)
|
|
66
|
+
return false;
|
|
67
|
+
try {
|
|
68
|
+
return timingSafeEqual(Buffer.from(a, "utf8"), Buffer.from(b, "utf8"));
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Verify a BlueBubbles webhook request's password. The supplied token comes from
|
|
76
|
+
* the URL query (`password` / `guid`) or, when present, a header. When
|
|
77
|
+
* `expectedPassword` is empty the check is SKIPPED (returns true) — the operator
|
|
78
|
+
* opted out (not recommended). Returns false when a password is configured but
|
|
79
|
+
* the supplied one is missing / wrong.
|
|
80
|
+
*/
|
|
81
|
+
export function verifyBlueBubblesWebhook(args) {
|
|
82
|
+
if (!args.expectedPassword)
|
|
83
|
+
return true; // no password configured → skip
|
|
84
|
+
const supplied = (args.suppliedToken ?? "").trim();
|
|
85
|
+
if (!supplied)
|
|
86
|
+
return false;
|
|
87
|
+
return safeEqualToken(supplied, args.expectedPassword);
|
|
88
|
+
}
|
|
89
|
+
/** Pull the auth token from the request URL query or a header. */
|
|
90
|
+
function extractSuppliedToken(req) {
|
|
91
|
+
// URL query (BlueBubbles can't set custom headers, so this is the primary path).
|
|
92
|
+
const rawUrl = req.url ?? "";
|
|
93
|
+
const qIdx = rawUrl.indexOf("?");
|
|
94
|
+
if (qIdx >= 0) {
|
|
95
|
+
const params = new URLSearchParams(rawUrl.slice(qIdx + 1));
|
|
96
|
+
const fromQuery = params.get("password") ?? params.get("guid");
|
|
97
|
+
if (fromQuery)
|
|
98
|
+
return fromQuery;
|
|
99
|
+
}
|
|
100
|
+
// Header fallbacks (some BB proxy setups inject them).
|
|
101
|
+
const header = (name) => {
|
|
102
|
+
const v = req.headers[name];
|
|
103
|
+
const s = Array.isArray(v) ? v[0] : v;
|
|
104
|
+
return s ? s.replace(/^Bearer\s+/i, "").trim() : undefined;
|
|
105
|
+
};
|
|
106
|
+
return header("x-password") ?? header("x-guid") ?? header("x-bluebubbles-guid") ?? header("authorization");
|
|
107
|
+
}
|
|
108
|
+
/** Read a request body up to `maxBytes`, rejecting (→ null) when it overflows. */
|
|
109
|
+
function readBody(req, maxBytes) {
|
|
110
|
+
return new Promise((resolve) => {
|
|
111
|
+
const chunks = [];
|
|
112
|
+
let size = 0;
|
|
113
|
+
let overflowed = false;
|
|
114
|
+
req.on("data", (chunk) => {
|
|
115
|
+
if (overflowed)
|
|
116
|
+
return;
|
|
117
|
+
size += chunk.length;
|
|
118
|
+
if (size > maxBytes) {
|
|
119
|
+
overflowed = true;
|
|
120
|
+
resolve(null);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
chunks.push(chunk);
|
|
124
|
+
});
|
|
125
|
+
req.on("end", () => {
|
|
126
|
+
if (overflowed)
|
|
127
|
+
return;
|
|
128
|
+
resolve(Buffer.concat(chunks).toString("utf8"));
|
|
129
|
+
});
|
|
130
|
+
req.on("error", () => resolve(null));
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Parse the request body. BlueBubbles delivers JSON; a form-encoded fallback
|
|
135
|
+
* (some proxy setups) carries the JSON under a `payload`/`data` field.
|
|
136
|
+
*/
|
|
137
|
+
export function parseBlueBubblesBody(rawBody, contentType) {
|
|
138
|
+
const ct = (contentType ?? "").toLowerCase();
|
|
139
|
+
const tryJson = (s) => {
|
|
140
|
+
try {
|
|
141
|
+
const v = JSON.parse(s);
|
|
142
|
+
return v && typeof v === "object" ? v : null;
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
let body = null;
|
|
149
|
+
if (ct.includes("application/x-www-form-urlencoded")) {
|
|
150
|
+
const params = new URLSearchParams(rawBody);
|
|
151
|
+
const inner = params.get("payload") ?? params.get("data") ?? params.get("message");
|
|
152
|
+
if (inner)
|
|
153
|
+
body = tryJson(inner);
|
|
154
|
+
}
|
|
155
|
+
if (!body)
|
|
156
|
+
body = tryJson(rawBody);
|
|
157
|
+
if (!body)
|
|
158
|
+
return null;
|
|
159
|
+
const type = typeof body.type === "string" ? body.type : undefined;
|
|
160
|
+
return { ...(type ? { type } : {}), payload: body };
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Build the Brigade `HttpRoute` for the BlueBubbles webhook. Register it via
|
|
164
|
+
* `b.httpRoute(...)` from the module.
|
|
165
|
+
*/
|
|
166
|
+
export function buildBlueBubblesWebhookRoute(args) {
|
|
167
|
+
// Per-route limiters (one route = one account). Built once and closed over so
|
|
168
|
+
// the window/in-flight counters persist across requests.
|
|
169
|
+
const rateLimiter = createFixedWindowRateLimiter(args.rateLimitMax ?? WEBHOOK_RATE_LIMIT_MAX, args.rateLimitWindowMs ?? WEBHOOK_RATE_LIMIT_WINDOW_MS);
|
|
170
|
+
const inFlight = createInFlightLimiter(args.maxInFlight ?? WEBHOOK_MAX_IN_FLIGHT);
|
|
171
|
+
const handler = async (req, res) => {
|
|
172
|
+
const reply = (status, body) => {
|
|
173
|
+
res.statusCode = status;
|
|
174
|
+
res.setHeader("content-type", "application/json");
|
|
175
|
+
res.end(typeof body === "string" ? body : JSON.stringify(body));
|
|
176
|
+
};
|
|
177
|
+
if ((req.method ?? "").toUpperCase() !== "POST") {
|
|
178
|
+
reply(405, { ok: false, error: "method not allowed" });
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
// Auth FIRST — verify the password before reading / parsing the body.
|
|
182
|
+
const supplied = extractSuppliedToken(req);
|
|
183
|
+
if (!verifyBlueBubblesWebhook({ expectedPassword: args.password, suppliedToken: supplied })) {
|
|
184
|
+
args.log?.("bluebubbles webhook rejected — bad password");
|
|
185
|
+
reply(401, { ok: false, error: "unauthorized" });
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
// Rate-limit the authenticated stream — a replay-storm / hostile sender that
|
|
189
|
+
// has the password must not run the normalize/dedupe/dispatch path
|
|
190
|
+
// unbounded. Over-limit requests are dropped with 429 BEFORE the body is
|
|
191
|
+
// read, so the cost of an abusive burst is bounded.
|
|
192
|
+
if (!rateLimiter.hit(args.now?.())) {
|
|
193
|
+
args.log?.("bluebubbles webhook throttled — over rate limit");
|
|
194
|
+
reply(429, { ok: false, error: "rate limited" });
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
// Bound concurrent in-flight handler bodies. When the cap is reached, shed
|
|
198
|
+
// load with 429 rather than letting unbounded parses/dispatches pile up.
|
|
199
|
+
const release = inFlight.tryAcquire();
|
|
200
|
+
if (!release) {
|
|
201
|
+
args.log?.("bluebubbles webhook throttled — in-flight cap reached");
|
|
202
|
+
reply(429, { ok: false, error: "busy" });
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
try {
|
|
206
|
+
// The gateway dispatcher has ALREADY drained + buffered the body onto
|
|
207
|
+
// `req.body`. Read that first; only stream when exercised outside the gateway.
|
|
208
|
+
const pre = req.body;
|
|
209
|
+
const raw = pre ? pre.toString("utf8") : await readBody(req, WEBHOOK_MAX_BODY_BYTES);
|
|
210
|
+
if (raw === null) {
|
|
211
|
+
reply(413, { ok: false, error: "payload too large" });
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
const contentType = (() => {
|
|
215
|
+
const c = req.headers["content-type"];
|
|
216
|
+
return Array.isArray(c) ? (c[0] ?? "") : (c ?? "");
|
|
217
|
+
})();
|
|
218
|
+
const parsed = parseBlueBubblesBody(raw, contentType);
|
|
219
|
+
if (!parsed) {
|
|
220
|
+
reply(400, { ok: false, error: "invalid body" });
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
const sink = args.resolveSink();
|
|
224
|
+
if (sink) {
|
|
225
|
+
try {
|
|
226
|
+
sink.feedWebhookEvent(parsed.type, parsed.payload);
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
args.log?.("bluebubbles webhook dispatch threw", { error: err instanceof Error ? err.message : String(err) });
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
// Always 200 so BlueBubbles doesn't retry-storm.
|
|
233
|
+
reply(200, { ok: true });
|
|
234
|
+
}
|
|
235
|
+
finally {
|
|
236
|
+
release();
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
return {
|
|
240
|
+
method: "POST",
|
|
241
|
+
path: args.path,
|
|
242
|
+
auth: "none", // BlueBubbles can't present operator-auth; the password query IS the auth.
|
|
243
|
+
match: "exact",
|
|
244
|
+
maxBodyBytes: WEBHOOK_MAX_BODY_BYTES,
|
|
245
|
+
skipSessionGuard: true,
|
|
246
|
+
handler,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=webhook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../../../src/agents/channels/bluebubbles/webhook.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,19 @@ export declare const TELEGRAM_CHANNEL_META: ChannelMeta;
|
|
|
25
25
|
export declare const SLACK_CHANNEL_META: ChannelMeta;
|
|
26
26
|
/** Discord channel metadata (markdown-capable; visible everywhere by default). */
|
|
27
27
|
export declare const DISCORD_CHANNEL_META: ChannelMeta;
|
|
28
|
+
/**
|
|
29
|
+
* iMessage channel metadata. iMessage has NO rich markup (plain text only), so
|
|
30
|
+
* it is NOT markdown-capable — the assembler's markdown gate strips formatting
|
|
31
|
+
* for this channel. Driven by the `imsg` CLI as a JSON-RPC subprocess.
|
|
32
|
+
*/
|
|
33
|
+
export declare const IMESSAGE_CHANNEL_META: ChannelMeta;
|
|
34
|
+
/**
|
|
35
|
+
* BlueBubbles channel metadata. Like iMessage, BlueBubbles has NO rich markup
|
|
36
|
+
* (plain text only), so it is NOT markdown-capable — the assembler's markdown
|
|
37
|
+
* gate strips formatting for this channel. Driven by the BlueBubbles macOS server
|
|
38
|
+
* over REST (outbound) + a webhook (inbound).
|
|
39
|
+
*/
|
|
40
|
+
export declare const BLUEBUBBLES_CHANNEL_META: ChannelMeta;
|
|
28
41
|
/** Every bundled channel meta, in declaration order. The registry seeds from this. */
|
|
29
42
|
export declare const BUNDLED_CHANNEL_METAS: readonly ChannelMeta[];
|
|
30
43
|
//# sourceMappingURL=bundled-channel-metas.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundled-channel-metas.d.ts","sourceRoot":"","sources":["../../../src/agents/channels/bundled-channel-metas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,mFAAmF;AACnF,eAAO,MAAM,qBAAqB,EAAE,WAQnC,CAAC;AAEF,mFAAmF;AACnF,eAAO,MAAM,qBAAqB,EAAE,WAQnC,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,kBAAkB,EAAE,WAQhC,CAAC;AAEF,kFAAkF;AAClF,eAAO,MAAM,oBAAoB,EAAE,WAQlC,CAAC;AAEF,sFAAsF;AACtF,eAAO,MAAM,qBAAqB,EAAE,SAAS,WAAW,
|
|
1
|
+
{"version":3,"file":"bundled-channel-metas.d.ts","sourceRoot":"","sources":["../../../src/agents/channels/bundled-channel-metas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,mFAAmF;AACnF,eAAO,MAAM,qBAAqB,EAAE,WAQnC,CAAC;AAEF,mFAAmF;AACnF,eAAO,MAAM,qBAAqB,EAAE,WAQnC,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,kBAAkB,EAAE,WAQhC,CAAC;AAEF,kFAAkF;AAClF,eAAO,MAAM,oBAAoB,EAAE,WAQlC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,WASnC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,EAAE,WAStC,CAAC;AAEF,sFAAsF;AACtF,eAAO,MAAM,qBAAqB,EAAE,SAAS,WAAW,EAOvD,CAAC"}
|
|
@@ -56,11 +56,44 @@ export const DISCORD_CHANNEL_META = {
|
|
|
56
56
|
order: 40,
|
|
57
57
|
markdownCapable: true,
|
|
58
58
|
};
|
|
59
|
+
/**
|
|
60
|
+
* iMessage channel metadata. iMessage has NO rich markup (plain text only), so
|
|
61
|
+
* it is NOT markdown-capable — the assembler's markdown gate strips formatting
|
|
62
|
+
* for this channel. Driven by the `imsg` CLI as a JSON-RPC subprocess.
|
|
63
|
+
*/
|
|
64
|
+
export const IMESSAGE_CHANNEL_META = {
|
|
65
|
+
id: "imessage",
|
|
66
|
+
label: "iMessage",
|
|
67
|
+
selectionLabel: "iMessage",
|
|
68
|
+
docsPath: "channels/imessage",
|
|
69
|
+
blurb: "Drive native iMessage via the imsg CLI; DM/group chat over Messages.app.",
|
|
70
|
+
order: 50,
|
|
71
|
+
aliases: ["imsg"],
|
|
72
|
+
markdownCapable: false,
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* BlueBubbles channel metadata. Like iMessage, BlueBubbles has NO rich markup
|
|
76
|
+
* (plain text only), so it is NOT markdown-capable — the assembler's markdown
|
|
77
|
+
* gate strips formatting for this channel. Driven by the BlueBubbles macOS server
|
|
78
|
+
* over REST (outbound) + a webhook (inbound).
|
|
79
|
+
*/
|
|
80
|
+
export const BLUEBUBBLES_CHANNEL_META = {
|
|
81
|
+
id: "bluebubbles",
|
|
82
|
+
label: "BlueBubbles",
|
|
83
|
+
selectionLabel: "BlueBubbles (iMessage)",
|
|
84
|
+
docsPath: "channels/bluebubbles",
|
|
85
|
+
blurb: "Drive native iMessage via a BlueBubbles macOS server; REST-out + webhook-in, reactions/edit/unsend.",
|
|
86
|
+
order: 55,
|
|
87
|
+
aliases: ["bb"],
|
|
88
|
+
markdownCapable: false,
|
|
89
|
+
};
|
|
59
90
|
/** Every bundled channel meta, in declaration order. The registry seeds from this. */
|
|
60
91
|
export const BUNDLED_CHANNEL_METAS = [
|
|
61
92
|
WHATSAPP_CHANNEL_META,
|
|
62
93
|
TELEGRAM_CHANNEL_META,
|
|
63
94
|
SLACK_CHANNEL_META,
|
|
64
95
|
DISCORD_CHANNEL_META,
|
|
96
|
+
IMESSAGE_CHANNEL_META,
|
|
97
|
+
BLUEBUBBLES_CHANNEL_META,
|
|
65
98
|
];
|
|
66
99
|
//# sourceMappingURL=bundled-channel-metas.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundled-channel-metas.js","sourceRoot":"","sources":["../../../src/agents/channels/bundled-channel-metas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,mFAAmF;AACnF,MAAM,CAAC,MAAM,qBAAqB,GAAgB;IACjD,EAAE,EAAE,UAAU;IACd,KAAK,EAAE,UAAU;IACjB,cAAc,EAAE,UAAU;IAC1B,QAAQ,EAAE,mBAAmB;IAC7B,KAAK,EAAE,mDAAmD;IAC1D,KAAK,EAAE,EAAE;IACT,eAAe,EAAE,IAAI;CACrB,CAAC;AAEF,mFAAmF;AACnF,MAAM,CAAC,MAAM,qBAAqB,GAAgB;IACjD,EAAE,EAAE,UAAU;IACd,KAAK,EAAE,UAAU;IACjB,cAAc,EAAE,UAAU;IAC1B,QAAQ,EAAE,mBAAmB;IAC7B,KAAK,EAAE,8DAA8D;IACrE,KAAK,EAAE,EAAE;IACT,eAAe,EAAE,IAAI;CACrB,CAAC;AAEF,gFAAgF;AAChF,MAAM,CAAC,MAAM,kBAAkB,GAAgB;IAC9C,EAAE,EAAE,OAAO;IACX,KAAK,EAAE,OAAO;IACd,cAAc,EAAE,OAAO;IACvB,QAAQ,EAAE,gBAAgB;IAC1B,KAAK,EAAE,mEAAmE;IAC1E,KAAK,EAAE,EAAE;IACT,eAAe,EAAE,IAAI;CACrB,CAAC;AAEF,kFAAkF;AAClF,MAAM,CAAC,MAAM,oBAAoB,GAAgB;IAChD,EAAE,EAAE,SAAS;IACb,KAAK,EAAE,SAAS;IAChB,cAAc,EAAE,SAAS;IACzB,QAAQ,EAAE,kBAAkB;IAC5B,KAAK,EAAE,8DAA8D;IACrE,KAAK,EAAE,EAAE;IACT,eAAe,EAAE,IAAI;CACrB,CAAC;AAEF,sFAAsF;AACtF,MAAM,CAAC,MAAM,qBAAqB,GAA2B;IAC5D,qBAAqB;IACrB,qBAAqB;IACrB,kBAAkB;IAClB,oBAAoB;
|
|
1
|
+
{"version":3,"file":"bundled-channel-metas.js","sourceRoot":"","sources":["../../../src/agents/channels/bundled-channel-metas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,mFAAmF;AACnF,MAAM,CAAC,MAAM,qBAAqB,GAAgB;IACjD,EAAE,EAAE,UAAU;IACd,KAAK,EAAE,UAAU;IACjB,cAAc,EAAE,UAAU;IAC1B,QAAQ,EAAE,mBAAmB;IAC7B,KAAK,EAAE,mDAAmD;IAC1D,KAAK,EAAE,EAAE;IACT,eAAe,EAAE,IAAI;CACrB,CAAC;AAEF,mFAAmF;AACnF,MAAM,CAAC,MAAM,qBAAqB,GAAgB;IACjD,EAAE,EAAE,UAAU;IACd,KAAK,EAAE,UAAU;IACjB,cAAc,EAAE,UAAU;IAC1B,QAAQ,EAAE,mBAAmB;IAC7B,KAAK,EAAE,8DAA8D;IACrE,KAAK,EAAE,EAAE;IACT,eAAe,EAAE,IAAI;CACrB,CAAC;AAEF,gFAAgF;AAChF,MAAM,CAAC,MAAM,kBAAkB,GAAgB;IAC9C,EAAE,EAAE,OAAO;IACX,KAAK,EAAE,OAAO;IACd,cAAc,EAAE,OAAO;IACvB,QAAQ,EAAE,gBAAgB;IAC1B,KAAK,EAAE,mEAAmE;IAC1E,KAAK,EAAE,EAAE;IACT,eAAe,EAAE,IAAI;CACrB,CAAC;AAEF,kFAAkF;AAClF,MAAM,CAAC,MAAM,oBAAoB,GAAgB;IAChD,EAAE,EAAE,SAAS;IACb,KAAK,EAAE,SAAS;IAChB,cAAc,EAAE,SAAS;IACzB,QAAQ,EAAE,kBAAkB;IAC5B,KAAK,EAAE,8DAA8D;IACrE,KAAK,EAAE,EAAE;IACT,eAAe,EAAE,IAAI;CACrB,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAgB;IACjD,EAAE,EAAE,UAAU;IACd,KAAK,EAAE,UAAU;IACjB,cAAc,EAAE,UAAU;IAC1B,QAAQ,EAAE,mBAAmB;IAC7B,KAAK,EAAE,0EAA0E;IACjF,KAAK,EAAE,EAAE;IACT,OAAO,EAAE,CAAC,MAAM,CAAC;IACjB,eAAe,EAAE,KAAK;CACtB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAgB;IACpD,EAAE,EAAE,aAAa;IACjB,KAAK,EAAE,aAAa;IACpB,cAAc,EAAE,wBAAwB;IACxC,QAAQ,EAAE,sBAAsB;IAChC,KAAK,EAAE,qGAAqG;IAC5G,KAAK,EAAE,EAAE;IACT,OAAO,EAAE,CAAC,IAAI,CAAC;IACf,eAAe,EAAE,KAAK;CACtB,CAAC;AAEF,sFAAsF;AACtF,MAAM,CAAC,MAAM,qBAAqB,GAA2B;IAC5D,qBAAqB;IACrB,qBAAqB;IACrB,kBAAkB;IAClB,oBAAoB;IACpB,qBAAqB;IACrB,wBAAwB;CACxB,CAAC"}
|
|
@@ -38,6 +38,36 @@ declare const CHANNEL_ID = "discord";
|
|
|
38
38
|
declare const DEFAULT_ACCOUNT_ID = "default";
|
|
39
39
|
/** Per-secret env var consulted as a last-resort fallback. */
|
|
40
40
|
declare const BOT_TOKEN_ENV_VAR = "DISCORD_BOT_TOKEN";
|
|
41
|
+
/** Reaction-notification gating modes (see `channels.discord.reactionNotifications`). */
|
|
42
|
+
export type DiscordReactionNotificationMode = "off" | "own" | "all" | "allowlist";
|
|
43
|
+
/** Bot online-dot status (`channels.discord.presence.status`). */
|
|
44
|
+
export type DiscordPresenceStatus = "online" | "idle" | "dnd" | "invisible";
|
|
45
|
+
/** Activity row kind (`channels.discord.presence.activityType`). */
|
|
46
|
+
export type DiscordPresenceActivityType = "playing" | "streaming" | "listening" | "watching" | "custom" | "competing";
|
|
47
|
+
/** How an auto-thread is named (`channels.discord.autoThreadName`). */
|
|
48
|
+
export type DiscordAutoThreadNameMode = "generated" | "first-message";
|
|
49
|
+
/**
|
|
50
|
+
* Resolved presence applied on (re)connect. `activityType` is the discord.js
|
|
51
|
+
* `ActivityType` numeric enum value (playing=0, streaming=1, listening=2,
|
|
52
|
+
* watching=3, custom=4, competing=5); `activityText` is the activity name (the
|
|
53
|
+
* STATE line for a custom activity); `activityUrl` rides only on a streaming
|
|
54
|
+
* activity. `null` when no presence is configured.
|
|
55
|
+
*/
|
|
56
|
+
export interface ResolvedDiscordPresence {
|
|
57
|
+
status: DiscordPresenceStatus;
|
|
58
|
+
activityType?: DiscordPresenceActivityType;
|
|
59
|
+
activityTypeCode?: number;
|
|
60
|
+
activityText?: string;
|
|
61
|
+
activityUrl?: string;
|
|
62
|
+
}
|
|
63
|
+
/** Resolved auto-thread policy (`channels.discord.autoThread*`). */
|
|
64
|
+
export interface ResolvedDiscordAutoThread {
|
|
65
|
+
enabled: boolean;
|
|
66
|
+
/** Thread name source. `"generated"` falls back to first-message until a completion runtime exists. */
|
|
67
|
+
nameMode: DiscordAutoThreadNameMode;
|
|
68
|
+
/** Idle minutes before Discord auto-archives the thread (60 / 1440 / 4320 / 10080). */
|
|
69
|
+
autoArchiveMinutes: number;
|
|
70
|
+
}
|
|
41
71
|
/** Resolved per-account info — what the adapter runtime reads. */
|
|
42
72
|
export interface ResolvedDiscordAccount {
|
|
43
73
|
accountId: string;
|
|
@@ -107,11 +137,41 @@ export declare function discordStreamThrottleMs(cfg: BrigadeConfig): number;
|
|
|
107
137
|
* Default OFF — `<think>` reasoning is stripped from channel replies as today.
|
|
108
138
|
*/
|
|
109
139
|
export declare function discordSurfaceReasoning(cfg: BrigadeConfig): boolean;
|
|
140
|
+
/**
|
|
141
|
+
* Resolve the reaction-notification mode (`channels.discord.reactionNotifications`).
|
|
142
|
+
* Defaults to `"own"` (only reactions on the bot's own messages wake the agent) so
|
|
143
|
+
* a stranger's reaction in an admitted channel no longer spams a turn. An invalid /
|
|
144
|
+
* unset value degrades to the `"own"` default.
|
|
145
|
+
*/
|
|
146
|
+
export declare function discordReactionNotifications(cfg: BrigadeConfig): DiscordReactionNotificationMode;
|
|
110
147
|
/**
|
|
111
148
|
* Resolve the idle-thread-session TTL in ms, or `null` when unset / disabled.
|
|
112
149
|
* Accepts a number (ms) or a duration string (`"6h"`, `"30m"`, …). The cron
|
|
113
150
|
* session-reaper uses this to age out idle Discord thread sessions.
|
|
114
151
|
*/
|
|
115
152
|
export declare function discordThreadIdleTtlMs(cfg: BrigadeConfig): number | null;
|
|
153
|
+
/**
|
|
154
|
+
* Resolve the bot presence to apply on (re)connect, or `null` when none is
|
|
155
|
+
* configured (`channels.discord.presence` absent / empty → keep Discord's
|
|
156
|
+
* default). A `status`-only block (no activity) still resolves so the operator
|
|
157
|
+
* can set just the online dot. An invalid `status` / `activityType` is dropped
|
|
158
|
+
* (degrades to the default), never throwing. The activity type is mapped to its
|
|
159
|
+
* discord.js `ActivityType` numeric code here so the connection stays
|
|
160
|
+
* discord.js-agnostic.
|
|
161
|
+
*
|
|
162
|
+
* Multi-account aware (mirrors the other per-account resolvers): the per-account
|
|
163
|
+
* `accounts[id].presence` wins, falling back to the top-level
|
|
164
|
+
* `channels.discord.presence`. Without this fallback a per-account
|
|
165
|
+
* `set-presence` write was a silent no-op (it read only the top-level slot).
|
|
166
|
+
*/
|
|
167
|
+
export declare function resolveDiscordPresence(cfg: BrigadeConfig, accountId?: string | null): ResolvedDiscordPresence | null;
|
|
168
|
+
/**
|
|
169
|
+
* Resolve the auto-thread policy (`channels.discord.autoThread*`). Returns a
|
|
170
|
+
* resolved view with `enabled` false when the feature is off (the default). The
|
|
171
|
+
* name mode defaults to `"first-message"`; `autoArchiveDuration` is clamped to
|
|
172
|
+
* one of Discord's accepted values (60 / 1440 / 4320 / 10080), defaulting to
|
|
173
|
+
* 1440 (24h).
|
|
174
|
+
*/
|
|
175
|
+
export declare function resolveDiscordAutoThread(cfg: BrigadeConfig): ResolvedDiscordAutoThread;
|
|
116
176
|
export { CHANNEL_ID as DISCORD_CHANNEL_ID, DEFAULT_ACCOUNT_ID as DISCORD_DEFAULT_ACCOUNT_ID, BOT_TOKEN_ENV_VAR as DISCORD_BOT_TOKEN_ENV_VAR, };
|
|
117
177
|
//# sourceMappingURL=account-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account-config.d.ts","sourceRoot":"","sources":["../../../../src/agents/channels/discord/account-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG3D,QAAA,MAAM,UAAU,YAAY,CAAC;AAC7B,QAAA,MAAM,kBAAkB,YAAY,CAAC;AAErC,8DAA8D;AAC9D,QAAA,MAAM,iBAAiB,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"account-config.d.ts","sourceRoot":"","sources":["../../../../src/agents/channels/discord/account-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -53,6 +53,18 @@ const PROXY_ENV_VARS = ["https_proxy", "HTTPS_PROXY", "all_proxy", "ALL_PROXY"];
|
|
|
53
53
|
const SEAL_KEY_BOT = CHANNEL_ID; // `channel:discord`
|
|
54
54
|
/** `${VAR}` secret-ref form — identical to `config/io.ts`'s SECRET_REF_PATTERN. */
|
|
55
55
|
const SECRET_REF_PATTERN = /^\$\{([A-Z_][A-Z0-9_]*)\}$/;
|
|
56
|
+
/** discord.js `ActivityType` numeric codes, keyed by the config string. */
|
|
57
|
+
const ACTIVITY_TYPE_CODE = {
|
|
58
|
+
playing: 0,
|
|
59
|
+
streaming: 1,
|
|
60
|
+
listening: 2,
|
|
61
|
+
watching: 3,
|
|
62
|
+
custom: 4,
|
|
63
|
+
competing: 5,
|
|
64
|
+
};
|
|
65
|
+
/** Valid auto-archive durations Discord accepts (minutes). */
|
|
66
|
+
const AUTO_ARCHIVE_DURATIONS = new Set([60, 1440, 4320, 10080]);
|
|
67
|
+
const DEFAULT_AUTO_ARCHIVE_MINUTES = 1440;
|
|
56
68
|
/** Read `channels.discord` loosely (schema keeps it open). */
|
|
57
69
|
function discordChannelConfig(cfg) {
|
|
58
70
|
return cfg.channels?.[CHANNEL_ID];
|
|
@@ -231,6 +243,18 @@ export function discordStreamThrottleMs(cfg) {
|
|
|
231
243
|
export function discordSurfaceReasoning(cfg) {
|
|
232
244
|
return discordChannelConfig(cfg)?.surfaceReasoning === true;
|
|
233
245
|
}
|
|
246
|
+
/**
|
|
247
|
+
* Resolve the reaction-notification mode (`channels.discord.reactionNotifications`).
|
|
248
|
+
* Defaults to `"own"` (only reactions on the bot's own messages wake the agent) so
|
|
249
|
+
* a stranger's reaction in an admitted channel no longer spams a turn. An invalid /
|
|
250
|
+
* unset value degrades to the `"own"` default.
|
|
251
|
+
*/
|
|
252
|
+
export function discordReactionNotifications(cfg) {
|
|
253
|
+
const raw = discordChannelConfig(cfg)?.reactionNotifications;
|
|
254
|
+
if (raw === "off" || raw === "own" || raw === "all" || raw === "allowlist")
|
|
255
|
+
return raw;
|
|
256
|
+
return "own";
|
|
257
|
+
}
|
|
234
258
|
/**
|
|
235
259
|
* Resolve the idle-thread-session TTL in ms, or `null` when unset / disabled.
|
|
236
260
|
* Accepts a number (ms) or a duration string (`"6h"`, `"30m"`, …). The cron
|
|
@@ -256,5 +280,70 @@ export function discordThreadIdleTtlMs(cfg) {
|
|
|
256
280
|
const factor = mult[unit] ?? 1;
|
|
257
281
|
return n * factor;
|
|
258
282
|
}
|
|
283
|
+
/* ───────────────────────── presence / auto-thread config ───────────────────────── */
|
|
284
|
+
/**
|
|
285
|
+
* Resolve the bot presence to apply on (re)connect, or `null` when none is
|
|
286
|
+
* configured (`channels.discord.presence` absent / empty → keep Discord's
|
|
287
|
+
* default). A `status`-only block (no activity) still resolves so the operator
|
|
288
|
+
* can set just the online dot. An invalid `status` / `activityType` is dropped
|
|
289
|
+
* (degrades to the default), never throwing. The activity type is mapped to its
|
|
290
|
+
* discord.js `ActivityType` numeric code here so the connection stays
|
|
291
|
+
* discord.js-agnostic.
|
|
292
|
+
*
|
|
293
|
+
* Multi-account aware (mirrors the other per-account resolvers): the per-account
|
|
294
|
+
* `accounts[id].presence` wins, falling back to the top-level
|
|
295
|
+
* `channels.discord.presence`. Without this fallback a per-account
|
|
296
|
+
* `set-presence` write was a silent no-op (it read only the top-level slot).
|
|
297
|
+
*/
|
|
298
|
+
export function resolveDiscordPresence(cfg, accountId) {
|
|
299
|
+
const id = accountId?.trim() || DEFAULT_ACCOUNT_ID;
|
|
300
|
+
const entry = findAccountEntry(cfg, id);
|
|
301
|
+
const slot = (entry?.presence && typeof entry.presence === "object" ? entry.presence : undefined) ??
|
|
302
|
+
discordChannelConfig(cfg)?.presence;
|
|
303
|
+
if (!slot || typeof slot !== "object")
|
|
304
|
+
return null;
|
|
305
|
+
const statusRaw = typeof slot.status === "string" ? slot.status.trim().toLowerCase() : "";
|
|
306
|
+
const status = statusRaw === "online" || statusRaw === "idle" || statusRaw === "dnd" || statusRaw === "invisible"
|
|
307
|
+
? statusRaw
|
|
308
|
+
: "online";
|
|
309
|
+
const activityText = typeof slot.activityText === "string" ? slot.activityText.trim() : "";
|
|
310
|
+
const activityTypeRaw = typeof slot.activityType === "string" ? slot.activityType.trim().toLowerCase() : undefined;
|
|
311
|
+
const activityType = activityTypeRaw && activityTypeRaw in ACTIVITY_TYPE_CODE ? activityTypeRaw : undefined;
|
|
312
|
+
const activityUrl = typeof slot.activityUrl === "string" ? slot.activityUrl.trim() : "";
|
|
313
|
+
// Nothing meaningful configured (no status, no activity) → no presence.
|
|
314
|
+
const hasStatus = statusRaw !== "";
|
|
315
|
+
const hasActivity = activityText !== "" || activityType !== undefined;
|
|
316
|
+
if (!hasStatus && !hasActivity)
|
|
317
|
+
return null;
|
|
318
|
+
const resolved = { status };
|
|
319
|
+
if (hasActivity) {
|
|
320
|
+
// An activity row needs at least a type; default to `custom` (the status
|
|
321
|
+
// STATE line) when only text was given.
|
|
322
|
+
const type = activityType ?? "custom";
|
|
323
|
+
resolved.activityType = type;
|
|
324
|
+
resolved.activityTypeCode = ACTIVITY_TYPE_CODE[type];
|
|
325
|
+
if (activityText)
|
|
326
|
+
resolved.activityText = activityText;
|
|
327
|
+
if (type === "streaming" && activityUrl)
|
|
328
|
+
resolved.activityUrl = activityUrl;
|
|
329
|
+
}
|
|
330
|
+
return resolved;
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Resolve the auto-thread policy (`channels.discord.autoThread*`). Returns a
|
|
334
|
+
* resolved view with `enabled` false when the feature is off (the default). The
|
|
335
|
+
* name mode defaults to `"first-message"`; `autoArchiveDuration` is clamped to
|
|
336
|
+
* one of Discord's accepted values (60 / 1440 / 4320 / 10080), defaulting to
|
|
337
|
+
* 1440 (24h).
|
|
338
|
+
*/
|
|
339
|
+
export function resolveDiscordAutoThread(cfg) {
|
|
340
|
+
const slot = discordChannelConfig(cfg);
|
|
341
|
+
const enabled = slot?.autoThread === true;
|
|
342
|
+
const nameRaw = typeof slot?.autoThreadName === "string" ? slot.autoThreadName.trim().toLowerCase() : "";
|
|
343
|
+
const nameMode = nameRaw === "generated" ? "generated" : "first-message";
|
|
344
|
+
const rawDuration = typeof slot?.autoArchiveDuration === "number" ? Math.round(slot.autoArchiveDuration) : NaN;
|
|
345
|
+
const autoArchiveMinutes = AUTO_ARCHIVE_DURATIONS.has(rawDuration) ? rawDuration : DEFAULT_AUTO_ARCHIVE_MINUTES;
|
|
346
|
+
return { enabled, nameMode, autoArchiveMinutes };
|
|
347
|
+
}
|
|
259
348
|
export { CHANNEL_ID as DISCORD_CHANNEL_ID, DEFAULT_ACCOUNT_ID as DISCORD_DEFAULT_ACCOUNT_ID, BOT_TOKEN_ENV_VAR as DISCORD_BOT_TOKEN_ENV_VAR, };
|
|
260
349
|
//# sourceMappingURL=account-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account-config.js","sourceRoot":"","sources":["../../../../src/agents/channels/discord/account-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,MAAM,UAAU,GAAG,SAAS,CAAC;AAC7B,MAAM,kBAAkB,GAAG,SAAS,CAAC;AAErC,8DAA8D;AAC9D,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAE9C;;;;;GAKG;AACH,MAAM,cAAc,GAAG,CAAC,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,CAAU,CAAC;AAEzF;;;;GAIG;AACH,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,oBAAoB;AAErD,mFAAmF;AACnF,MAAM,kBAAkB,GAAG,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"account-config.js","sourceRoot":"","sources":["../../../../src/agents/channels/discord/account-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,8 +19,18 @@
|
|
|
19
19
|
* (registered via REST application commands on connect). Unlike Slack, Discord's
|
|
20
20
|
* command menu IS pushed programmatically — `nativeCommands: true`.
|
|
21
21
|
*/
|
|
22
|
+
import type { BrigadeConfig } from "../../../config/io.js";
|
|
22
23
|
import { type ChannelAdapter, type ChannelCapabilities } from "../sdk.js";
|
|
23
|
-
import { type
|
|
24
|
+
import { type ResolvedDiscordPresence } from "./account-config.js";
|
|
25
|
+
import { type ConnectDiscordArgs, type DiscordConnection, type DiscordInboundMessage, type DiscordPresencePayload } from "./connection.js";
|
|
26
|
+
/**
|
|
27
|
+
* Map a resolved presence config into the discord.js `PresenceData` payload the
|
|
28
|
+
* connection applies on (re)connect (Phase 5). A `custom` activity (type 4)
|
|
29
|
+
* carries its text in the `state` field (Discord renders custom status from the
|
|
30
|
+
* state); every other type uses `name`. A `streaming` activity (type 1) adds the
|
|
31
|
+
* `url`. Returns `null` when no presence is configured.
|
|
32
|
+
*/
|
|
33
|
+
export declare function mapDiscordPresencePayload(presence: ResolvedDiscordPresence | null): DiscordPresencePayload | null;
|
|
24
34
|
/** Adapter construction options — all optional for back-compat. */
|
|
25
35
|
export interface CreateDiscordAdapterOptions {
|
|
26
36
|
/** Per-account scope. Defaults to `"default"` (single-account). */
|
|
@@ -32,6 +42,19 @@ export interface CreateDiscordAdapterOptions {
|
|
|
32
42
|
connectImpl?: (args: ConnectDiscordArgs) => Promise<DiscordConnection>;
|
|
33
43
|
}
|
|
34
44
|
export declare function createDiscordAdapter(opts?: CreateDiscordAdapterOptions): ChannelAdapter;
|
|
45
|
+
/**
|
|
46
|
+
* Decide whether an inbound reaction-add should wake the agent, per the
|
|
47
|
+
* `channels.discord.reactionNotifications` mode (default `"own"`):
|
|
48
|
+
* - `"off"` → never;
|
|
49
|
+
* - `"own"` → only when the reacted message was authored by the bot
|
|
50
|
+
* (`reaction.targetAuthorId === selfId`);
|
|
51
|
+
* - `"all"` → always (legacy behavior);
|
|
52
|
+
* - `"allowlist"` → only when the reactor (`msg.from`) is on the channel
|
|
53
|
+
* allow-list — the central store list ∪ config `allowFrom`.
|
|
54
|
+
* A null config defensively falls back to `"own"`. Reaction-REMOVE is unaffected
|
|
55
|
+
* (handled in the connection's dedupe-release path).
|
|
56
|
+
*/
|
|
57
|
+
export declare function shouldNotifyReaction(msg: DiscordInboundMessage, cfg: BrigadeConfig | null, selfId: string | undefined, accountId?: string): boolean;
|
|
35
58
|
/**
|
|
36
59
|
* Synthesise the agent-facing note for an inbound reaction. The reaction itself
|
|
37
60
|
* carries no text, so the note ("<who> reacted :emoji: to message <id>") is what
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../src/agents/channels/discord/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../src/agents/channels/discord/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAK3D,OAAO,EAGN,KAAK,cAAc,EAEnB,KAAK,mBAAmB,EAQxB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAaN,KAAK,uBAAuB,EAC5B,MAAM,qBAAqB,CAAC;AAK7B,OAAO,EAGN,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,MAAM,iBAAiB,CAAC;AASzB;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,uBAAuB,GAAG,IAAI,GAAG,sBAAsB,GAAG,IAAI,CAiBjH;AAED,mEAAmE;AACnE,MAAM,WAAW,2BAA2B;IAC3C,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACvE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,GAAE,2BAAgC,GAAG,cAAc,CAwiB3F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CACnC,GAAG,EAAE,qBAAqB,EAC1B,GAAG,EAAE,aAAa,GAAG,IAAI,EACzB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAsBT;AASD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAKtG;AAED,oFAAoF;AACpF,eAAO,MAAM,oBAAoB,EAAE,mBASlC,CAAC;AAEF;;;;GAIG;AACH,MAAM,WAAW,cAAe,SAAQ,cAAc;IACrD;;;;OAIG;IACH,WAAW,IAAI,MAAM,GAAG,IAAI,CAAC;CAC7B"}
|