@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,559 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discord REST v10 action helpers — the self-contained REST surface behind the
|
|
3
|
+
* `discord_action` agent tool.
|
|
4
|
+
*
|
|
5
|
+
* Mirrors `probe.ts`: every helper talks to `https://discord.com/api/v10/...`
|
|
6
|
+
* over plain HTTPS with the `Authorization: Bot <token>` header — NO `discord.js`,
|
|
7
|
+
* NO Gateway socket, NO live adapter/connection. The bot token is resolved by the
|
|
8
|
+
* tool (via `resolveDiscordBotToken`) and threaded in; it rides only in the
|
|
9
|
+
* `Authorization` header, built locally and never logged.
|
|
10
|
+
*
|
|
11
|
+
* `fetch` is INJECTABLE (defaults to global fetch) so tests can stub the call and
|
|
12
|
+
* assert the exact METHOD + PATH + body without touching the network.
|
|
13
|
+
*
|
|
14
|
+
* The action surface here matches the guild capability set Brigade's live adapter
|
|
15
|
+
* lacks: messaging/content (send, embeds, polls, stickers, reads, reactions,
|
|
16
|
+
* threads, search), guild-admin (channels, categories, roles, members, emojis,
|
|
17
|
+
* stickers, scheduled events), and moderation (ban/unban/kick/timeout). Each
|
|
18
|
+
* helper returns the parsed Discord JSON (or `{ ok: true }` for empty 204s); REST
|
|
19
|
+
* failures throw a {@link DiscordRestError} carrying the decoded Discord JSON code
|
|
20
|
+
* so the tool can render an operator-readable message (permissions / 404 / rate
|
|
21
|
+
* limit).
|
|
22
|
+
*/
|
|
23
|
+
import { stripBotPrefix } from "./account-config.js";
|
|
24
|
+
const DISCORD_API_BASE = "https://discord.com/api/v10";
|
|
25
|
+
const DEFAULT_TIMEOUT_MS = 12_000;
|
|
26
|
+
/* ───────────────────────────── error decode ───────────────────────────── */
|
|
27
|
+
/**
|
|
28
|
+
* Discord JSON error codes worth a tailored remediation hint. The numeric `code`
|
|
29
|
+
* is the stable, documented Discord API error code (NOT the HTTP status) — it
|
|
30
|
+
* survives across endpoints, so one decode table covers send + moderation +
|
|
31
|
+
* guild-admin. Extends the Phase-2 `decodeDiscordSendError` set (50013 / 50007)
|
|
32
|
+
* with the moderation + lookup codes this surface can hit.
|
|
33
|
+
*/
|
|
34
|
+
const DISCORD_ERROR_HINTS = {
|
|
35
|
+
10003: "Unknown channel — the channel id doesn't exist or the bot can't see it.",
|
|
36
|
+
10004: "Unknown guild — the bot isn't in that server, or the guild id is wrong.",
|
|
37
|
+
10007: "Unknown member — that user isn't a member of the guild.",
|
|
38
|
+
10008: "Unknown message — the message id is wrong or it was deleted.",
|
|
39
|
+
10011: "Unknown role — the role id doesn't exist in that guild.",
|
|
40
|
+
10013: "Unknown user — that user id doesn't exist.",
|
|
41
|
+
10026: "Unknown ban — that user isn't banned (nothing to unban).",
|
|
42
|
+
30005: "Maximum number of guild roles reached (250).",
|
|
43
|
+
30007: "Maximum number of webhooks reached.",
|
|
44
|
+
30008: "Maximum number of emojis reached for this guild's tier.",
|
|
45
|
+
30013: "Maximum number of scheduled events reached.",
|
|
46
|
+
50001: "Missing access — the bot can't see this channel/guild (invite it or grant View Channel).",
|
|
47
|
+
50007: "Can't DM this user — they've blocked the bot or disabled DMs from server members.",
|
|
48
|
+
50013: "The bot lacks the permission required for this action (check its role permissions + channel overrides).",
|
|
49
|
+
50035: "Invalid form body — one of the supplied fields is malformed or out of range.",
|
|
50
|
+
50045: "File uploaded exceeds the maximum size.",
|
|
51
|
+
};
|
|
52
|
+
/** A REST call that came back non-2xx. Carries the HTTP status + decoded Discord code. */
|
|
53
|
+
export class DiscordRestError extends Error {
|
|
54
|
+
status;
|
|
55
|
+
/** The Discord JSON error `code` (stable across endpoints), when present. */
|
|
56
|
+
code;
|
|
57
|
+
/** Retry-after seconds, populated on a 429 rate-limit. */
|
|
58
|
+
retryAfter;
|
|
59
|
+
constructor(message, opts) {
|
|
60
|
+
super(message);
|
|
61
|
+
this.name = "DiscordRestError";
|
|
62
|
+
this.status = opts.status;
|
|
63
|
+
if (opts.code !== undefined)
|
|
64
|
+
this.code = opts.code;
|
|
65
|
+
if (opts.retryAfter !== undefined)
|
|
66
|
+
this.retryAfter = opts.retryAfter;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Turn a non-2xx Discord REST response into an operator-readable {@link DiscordRestError}.
|
|
71
|
+
* Decodes the Discord JSON `code` into a remediation hint for the actionable cases
|
|
72
|
+
* (permissions 50013, missing access 50001, DM-blocked 50007, unknown-resource
|
|
73
|
+
* 100xx, rate-limit 429); everything else surfaces the raw Discord `message`.
|
|
74
|
+
*/
|
|
75
|
+
export function decodeDiscordRestError(status, body) {
|
|
76
|
+
const record = body && typeof body === "object" ? body : {};
|
|
77
|
+
const code = typeof record.code === "number" ? record.code : undefined;
|
|
78
|
+
const apiMessage = typeof record.message === "string" ? record.message : undefined;
|
|
79
|
+
if (status === 429) {
|
|
80
|
+
const retryAfter = typeof record.retry_after === "number" ? record.retry_after : undefined;
|
|
81
|
+
return new DiscordRestError(`Rate-limited by Discord${retryAfter !== undefined ? ` — retry after ${retryAfter}s` : ""}. Slow down and try again.`, { status, ...(code !== undefined ? { code } : {}), ...(retryAfter !== undefined ? { retryAfter } : {}) });
|
|
82
|
+
}
|
|
83
|
+
const hint = code !== undefined ? DISCORD_ERROR_HINTS[code] : undefined;
|
|
84
|
+
const msg = hint ??
|
|
85
|
+
(status === 404
|
|
86
|
+
? "Discord returned 404 — the target resource (channel / message / user / guild) doesn't exist or isn't visible to the bot."
|
|
87
|
+
: apiMessage
|
|
88
|
+
? `Discord rejected the request (${apiMessage}${code !== undefined ? `, code ${code}` : ""}).`
|
|
89
|
+
: `Discord request failed (HTTP ${status}${code !== undefined ? `, code ${code}` : ""}).`);
|
|
90
|
+
return new DiscordRestError(msg, { status, ...(code !== undefined ? { code } : {}) });
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Make one Discord REST call. Returns the parsed JSON (or `{ ok: true }` for an
|
|
94
|
+
* empty 204). Non-2xx throws a decoded {@link DiscordRestError}. Aborts after
|
|
95
|
+
* `timeoutMs`. The token rides only in the `Authorization` header.
|
|
96
|
+
*/
|
|
97
|
+
export async function discordRestRequest(input, opts) {
|
|
98
|
+
const token = stripBotPrefix((opts.token ?? "").trim());
|
|
99
|
+
if (!token)
|
|
100
|
+
throw new Error("no Discord bot token configured");
|
|
101
|
+
const doFetch = opts.fetchImpl ?? fetch;
|
|
102
|
+
const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
103
|
+
let url = `${DISCORD_API_BASE}${input.path}`;
|
|
104
|
+
if (input.query) {
|
|
105
|
+
const qs = new URLSearchParams();
|
|
106
|
+
for (const [k, v] of Object.entries(input.query)) {
|
|
107
|
+
if (v !== undefined && v !== null && `${v}` !== "")
|
|
108
|
+
qs.append(k, String(v));
|
|
109
|
+
}
|
|
110
|
+
const s = qs.toString();
|
|
111
|
+
if (s)
|
|
112
|
+
url += `?${s}`;
|
|
113
|
+
}
|
|
114
|
+
const headers = {
|
|
115
|
+
Authorization: `Bot ${token}`,
|
|
116
|
+
"content-type": "application/json",
|
|
117
|
+
};
|
|
118
|
+
// X-Audit-Log-Reason must be Latin1/percent-encoded — a raw reason with an emoji,
|
|
119
|
+
// accent, or newline (e.g. "spam 🚫", "Belästigung") makes `fetch` throw
|
|
120
|
+
// `TypeError: invalid header value`, which would fail the whole moderation action.
|
|
121
|
+
if (input.reason)
|
|
122
|
+
headers["X-Audit-Log-Reason"] = encodeURIComponent(input.reason);
|
|
123
|
+
const controller = new AbortController();
|
|
124
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
125
|
+
if (typeof timer.unref === "function")
|
|
126
|
+
timer.unref();
|
|
127
|
+
try {
|
|
128
|
+
const res = await doFetch(url, {
|
|
129
|
+
method: input.method,
|
|
130
|
+
headers,
|
|
131
|
+
signal: controller.signal,
|
|
132
|
+
...(input.body !== undefined ? { body: JSON.stringify(input.body) } : {}),
|
|
133
|
+
});
|
|
134
|
+
let parsed = null;
|
|
135
|
+
if (res.status !== 204) {
|
|
136
|
+
try {
|
|
137
|
+
parsed = await res.json();
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
parsed = null;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (!res.ok)
|
|
144
|
+
throw decodeDiscordRestError(res.status, parsed);
|
|
145
|
+
return res.status === 204 ? { ok: true } : parsed;
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
if (err instanceof DiscordRestError)
|
|
149
|
+
throw err;
|
|
150
|
+
if (controller.signal.aborted)
|
|
151
|
+
throw new Error(`Discord request timed out after ${timeoutMs}ms`);
|
|
152
|
+
throw err instanceof Error ? err : new Error(String(err));
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
clearTimeout(timer);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/** Build a Discord embed object from a {@link DiscordEmbedSpec} (drops empty fields). */
|
|
159
|
+
export function buildEmbed(spec) {
|
|
160
|
+
const embed = {};
|
|
161
|
+
if (spec.title)
|
|
162
|
+
embed.title = spec.title;
|
|
163
|
+
if (spec.description)
|
|
164
|
+
embed.description = spec.description;
|
|
165
|
+
if (typeof spec.color === "number" && Number.isFinite(spec.color))
|
|
166
|
+
embed.color = spec.color;
|
|
167
|
+
if (spec.url)
|
|
168
|
+
embed.url = spec.url;
|
|
169
|
+
if (Array.isArray(spec.fields) && spec.fields.length > 0) {
|
|
170
|
+
embed.fields = spec.fields
|
|
171
|
+
.filter((f) => f && typeof f.name === "string" && typeof f.value === "string")
|
|
172
|
+
.map((f) => ({ name: f.name, value: f.value, ...(f.inline ? { inline: true } : {}) }));
|
|
173
|
+
}
|
|
174
|
+
if (spec.footer)
|
|
175
|
+
embed.footer = { text: spec.footer };
|
|
176
|
+
if (spec.image)
|
|
177
|
+
embed.image = { url: spec.image };
|
|
178
|
+
if (spec.thumbnail)
|
|
179
|
+
embed.thumbnail = { url: spec.thumbnail };
|
|
180
|
+
return embed;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Resolve a `to` target to a channel id for the messaging endpoints. A bare
|
|
184
|
+
* snowflake is used directly as a channel id. A `user:<id>` target opens (or
|
|
185
|
+
* reuses) a DM channel via `POST /users/@me/channels` and returns that id, so the
|
|
186
|
+
* agent can DM a user by id without knowing the DM channel id. A `channel:<id>`
|
|
187
|
+
* prefix is accepted and stripped.
|
|
188
|
+
*/
|
|
189
|
+
export async function resolveSendChannelId(to, opts) {
|
|
190
|
+
const raw = (to ?? "").trim();
|
|
191
|
+
if (!raw)
|
|
192
|
+
throw new Error("a target channel id or user id is required");
|
|
193
|
+
if (/^channel:/i.test(raw))
|
|
194
|
+
return raw.replace(/^channel:/i, "").trim();
|
|
195
|
+
if (/^user:/i.test(raw)) {
|
|
196
|
+
const userId = raw.replace(/^user:/i, "").trim();
|
|
197
|
+
const dm = (await discordRestRequest({ method: "POST", path: "/users/@me/channels", body: { recipient_id: userId } }, opts));
|
|
198
|
+
if (!dm?.id)
|
|
199
|
+
throw new Error(`couldn't open a DM channel with user ${userId}`);
|
|
200
|
+
return dm.id;
|
|
201
|
+
}
|
|
202
|
+
return raw;
|
|
203
|
+
}
|
|
204
|
+
/* ───────────────────────── messaging / content ───────────────────────── */
|
|
205
|
+
/** SUPPRESS_NOTIFICATIONS message flag (1 << 12) — silences the @-ping. */
|
|
206
|
+
const DISCORD_SUPPRESS_NOTIFICATIONS_FLAG = 1 << 12;
|
|
207
|
+
/**
|
|
208
|
+
* The SAFE default `allowed_mentions` applied to every REST send body. Matches the
|
|
209
|
+
* connection-path safety: `parse: ["users", "roles"]` lets explicit `<@id>` /
|
|
210
|
+
* `<@&roleid>` mentions ping, while the absence of `"everyone"` means an
|
|
211
|
+
* `@everyone` / `@here` that slipped into the content renders as inert text and
|
|
212
|
+
* pings no one. A fresh object per call so a send can't mutate the shared default.
|
|
213
|
+
*/
|
|
214
|
+
export function safeRestAllowedMentions() {
|
|
215
|
+
return { parse: ["users", "roles"] };
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Resolve the `allowed_mentions` for a REST send body. Defaults to the safe
|
|
219
|
+
* everyone-excluding shape; an explicit caller override (opt-in) is passed through
|
|
220
|
+
* verbatim so a deliberate, owner-authorized broadcast can still set `everyone`.
|
|
221
|
+
*/
|
|
222
|
+
function resolveRestAllowedMentions(override) {
|
|
223
|
+
return override ?? safeRestAllowedMentions();
|
|
224
|
+
}
|
|
225
|
+
export async function sendMessage(params, opts) {
|
|
226
|
+
const channelId = await resolveSendChannelId(params.to, opts);
|
|
227
|
+
const body = {};
|
|
228
|
+
if (params.content)
|
|
229
|
+
body.content = params.content;
|
|
230
|
+
if (Array.isArray(params.embeds) && params.embeds.length > 0) {
|
|
231
|
+
body.embeds = params.embeds.map((e) => buildEmbed(e));
|
|
232
|
+
}
|
|
233
|
+
if (Array.isArray(params.components) && params.components.length > 0) {
|
|
234
|
+
body.components = params.components;
|
|
235
|
+
}
|
|
236
|
+
if (params.replyTo)
|
|
237
|
+
body.message_reference = { message_id: params.replyTo };
|
|
238
|
+
body.allowed_mentions = resolveRestAllowedMentions(params.allowedMentions);
|
|
239
|
+
let flags = typeof params.flags === "number" && Number.isFinite(params.flags) ? params.flags : 0;
|
|
240
|
+
if (params.silent)
|
|
241
|
+
flags |= DISCORD_SUPPRESS_NOTIFICATIONS_FLAG;
|
|
242
|
+
if (flags)
|
|
243
|
+
body.flags = flags;
|
|
244
|
+
if (body.content === undefined && !body.embeds && !body.components) {
|
|
245
|
+
throw new Error("send requires content, embeds, or components");
|
|
246
|
+
}
|
|
247
|
+
return discordRestRequest({ method: "POST", path: `/channels/${channelId}/messages`, body }, opts);
|
|
248
|
+
}
|
|
249
|
+
export async function sendEmbed(params, opts) {
|
|
250
|
+
return sendMessage({
|
|
251
|
+
to: params.to,
|
|
252
|
+
...(params.content ? { content: params.content } : {}),
|
|
253
|
+
embeds: [params.embed],
|
|
254
|
+
...(params.allowedMentions ? { allowedMentions: params.allowedMentions } : {}),
|
|
255
|
+
}, opts);
|
|
256
|
+
}
|
|
257
|
+
export async function sendPoll(params, opts) {
|
|
258
|
+
const channelId = await resolveSendChannelId(params.to, opts);
|
|
259
|
+
const answers = params.answers.slice(0, 10).map((text) => ({ poll_media: { text } }));
|
|
260
|
+
const body = {
|
|
261
|
+
poll: {
|
|
262
|
+
question: { text: params.question },
|
|
263
|
+
answers,
|
|
264
|
+
duration: params.durationHours && params.durationHours > 0 ? params.durationHours : 24,
|
|
265
|
+
allow_multiselect: params.allowMultiselect === true,
|
|
266
|
+
},
|
|
267
|
+
allowed_mentions: resolveRestAllowedMentions(params.allowedMentions),
|
|
268
|
+
};
|
|
269
|
+
return discordRestRequest({ method: "POST", path: `/channels/${channelId}/messages`, body }, opts);
|
|
270
|
+
}
|
|
271
|
+
export async function sendSticker(params, opts) {
|
|
272
|
+
const channelId = await resolveSendChannelId(params.to, opts);
|
|
273
|
+
const body = { sticker_ids: params.stickerIds.slice(0, 3) };
|
|
274
|
+
if (params.content)
|
|
275
|
+
body.content = params.content;
|
|
276
|
+
body.allowed_mentions = resolveRestAllowedMentions(params.allowedMentions);
|
|
277
|
+
return discordRestRequest({ method: "POST", path: `/channels/${channelId}/messages`, body }, opts);
|
|
278
|
+
}
|
|
279
|
+
/** Fetch the most recent messages from a channel (capped at 50). */
|
|
280
|
+
export async function readMessages(params, opts) {
|
|
281
|
+
const limit = Math.max(1, Math.min(50, params.limit ?? 25));
|
|
282
|
+
return discordRestRequest({
|
|
283
|
+
method: "GET",
|
|
284
|
+
path: `/channels/${params.channelId}/messages`,
|
|
285
|
+
query: {
|
|
286
|
+
limit,
|
|
287
|
+
...(params.before ? { before: params.before } : {}),
|
|
288
|
+
...(params.after ? { after: params.after } : {}),
|
|
289
|
+
...(params.around ? { around: params.around } : {}),
|
|
290
|
+
},
|
|
291
|
+
}, opts);
|
|
292
|
+
}
|
|
293
|
+
/** Who reacted with a given emoji (capped at 50). `emoji` is the raw unicode or `name:id`. */
|
|
294
|
+
export async function listReactions(params, opts) {
|
|
295
|
+
const limit = Math.max(1, Math.min(50, params.limit ?? 25));
|
|
296
|
+
return discordRestRequest({
|
|
297
|
+
method: "GET",
|
|
298
|
+
path: `/channels/${params.channelId}/messages/${params.messageId}/reactions/${encodeURIComponent(params.emoji)}`,
|
|
299
|
+
query: { limit },
|
|
300
|
+
}, opts);
|
|
301
|
+
}
|
|
302
|
+
/** Remove the bot's own reaction (or, with `userId`, another user's). */
|
|
303
|
+
export async function removeReaction(params, opts) {
|
|
304
|
+
const who = params.userId ? params.userId : "@me";
|
|
305
|
+
return discordRestRequest({
|
|
306
|
+
method: "DELETE",
|
|
307
|
+
path: `/channels/${params.channelId}/messages/${params.messageId}/reactions/${encodeURIComponent(params.emoji)}/${who}`,
|
|
308
|
+
}, opts);
|
|
309
|
+
}
|
|
310
|
+
/** Create a thread — from a message (when `messageId` given) or standalone/forum. */
|
|
311
|
+
export async function threadCreate(params, opts) {
|
|
312
|
+
const body = { name: params.name };
|
|
313
|
+
if (params.autoArchiveMinutes)
|
|
314
|
+
body.auto_archive_duration = params.autoArchiveMinutes;
|
|
315
|
+
if (params.messageId) {
|
|
316
|
+
return discordRestRequest({
|
|
317
|
+
method: "POST",
|
|
318
|
+
path: `/channels/${params.channelId}/messages/${params.messageId}/threads`,
|
|
319
|
+
body,
|
|
320
|
+
}, opts);
|
|
321
|
+
}
|
|
322
|
+
// Standalone / forum thread. Forum channels require a starter message.
|
|
323
|
+
if (typeof params.type === "number")
|
|
324
|
+
body.type = params.type;
|
|
325
|
+
if (params.content)
|
|
326
|
+
body.message = { content: params.content };
|
|
327
|
+
return discordRestRequest({ method: "POST", path: `/channels/${params.channelId}/threads`, body }, opts);
|
|
328
|
+
}
|
|
329
|
+
/** List active threads in a guild (active threads endpoint). */
|
|
330
|
+
export async function listThreads(params, opts) {
|
|
331
|
+
return discordRestRequest({ method: "GET", path: `/guilds/${params.guildId}/threads/active` }, opts);
|
|
332
|
+
}
|
|
333
|
+
/** Guild message search (capped at 25). */
|
|
334
|
+
export async function searchMessages(params, opts) {
|
|
335
|
+
const limit = Math.max(1, Math.min(25, params.limit ?? 25));
|
|
336
|
+
return discordRestRequest({
|
|
337
|
+
method: "GET",
|
|
338
|
+
path: `/guilds/${params.guildId}/messages/search`,
|
|
339
|
+
query: {
|
|
340
|
+
content: params.query,
|
|
341
|
+
limit,
|
|
342
|
+
...(params.authorId ? { author_id: params.authorId } : {}),
|
|
343
|
+
...(params.channelId ? { channel_id: params.channelId } : {}),
|
|
344
|
+
},
|
|
345
|
+
}, opts);
|
|
346
|
+
}
|
|
347
|
+
/* ───────────────────────────── guild-admin ───────────────────────────── */
|
|
348
|
+
export async function channelCreate(params, opts) {
|
|
349
|
+
const body = { name: params.name };
|
|
350
|
+
if (typeof params.type === "number")
|
|
351
|
+
body.type = params.type;
|
|
352
|
+
if (params.parentId)
|
|
353
|
+
body.parent_id = params.parentId;
|
|
354
|
+
if (params.topic)
|
|
355
|
+
body.topic = params.topic;
|
|
356
|
+
if (typeof params.position === "number")
|
|
357
|
+
body.position = params.position;
|
|
358
|
+
if (typeof params.nsfw === "boolean")
|
|
359
|
+
body.nsfw = params.nsfw;
|
|
360
|
+
return discordRestRequest({ method: "POST", path: `/guilds/${params.guildId}/channels`, body }, opts);
|
|
361
|
+
}
|
|
362
|
+
export async function channelEdit(params, opts) {
|
|
363
|
+
const body = {};
|
|
364
|
+
if (params.name !== undefined)
|
|
365
|
+
body.name = params.name;
|
|
366
|
+
if (params.topic !== undefined)
|
|
367
|
+
body.topic = params.topic;
|
|
368
|
+
if (typeof params.position === "number")
|
|
369
|
+
body.position = params.position;
|
|
370
|
+
if (params.parentId !== undefined)
|
|
371
|
+
body.parent_id = params.parentId;
|
|
372
|
+
if (typeof params.nsfw === "boolean")
|
|
373
|
+
body.nsfw = params.nsfw;
|
|
374
|
+
if (typeof params.rateLimitPerUser === "number")
|
|
375
|
+
body.rate_limit_per_user = params.rateLimitPerUser;
|
|
376
|
+
if (typeof params.archived === "boolean")
|
|
377
|
+
body.archived = params.archived;
|
|
378
|
+
if (typeof params.locked === "boolean")
|
|
379
|
+
body.locked = params.locked;
|
|
380
|
+
return discordRestRequest({ method: "PATCH", path: `/channels/${params.channelId}`, body }, opts);
|
|
381
|
+
}
|
|
382
|
+
export async function channelDelete(params, opts) {
|
|
383
|
+
return discordRestRequest({ method: "DELETE", path: `/channels/${params.channelId}` }, opts);
|
|
384
|
+
}
|
|
385
|
+
/** Move a channel (position + optional new parent) via the guild channel-positions endpoint. */
|
|
386
|
+
export async function channelMove(params, opts) {
|
|
387
|
+
const entry = { id: params.channelId };
|
|
388
|
+
if (typeof params.position === "number")
|
|
389
|
+
entry.position = params.position;
|
|
390
|
+
if (params.parentId !== undefined)
|
|
391
|
+
entry.parent_id = params.parentId;
|
|
392
|
+
return discordRestRequest({ method: "PATCH", path: `/guilds/${params.guildId}/channels`, body: [entry] }, opts);
|
|
393
|
+
}
|
|
394
|
+
/** Create a category (channel type 4). */
|
|
395
|
+
export async function categoryCreate(params, opts) {
|
|
396
|
+
return channelCreate({ guildId: params.guildId, name: params.name, type: 4, ...(params.position !== undefined ? { position: params.position } : {}) }, opts);
|
|
397
|
+
}
|
|
398
|
+
export async function categoryEdit(params, opts) {
|
|
399
|
+
return channelEdit({
|
|
400
|
+
channelId: params.categoryId,
|
|
401
|
+
...(params.name !== undefined ? { name: params.name } : {}),
|
|
402
|
+
...(params.position !== undefined ? { position: params.position } : {}),
|
|
403
|
+
}, opts);
|
|
404
|
+
}
|
|
405
|
+
export async function categoryDelete(params, opts) {
|
|
406
|
+
return channelDelete({ channelId: params.categoryId }, opts);
|
|
407
|
+
}
|
|
408
|
+
export async function roleList(params, opts) {
|
|
409
|
+
return discordRestRequest({ method: "GET", path: `/guilds/${params.guildId}/roles` }, opts);
|
|
410
|
+
}
|
|
411
|
+
export async function roleAdd(params, opts) {
|
|
412
|
+
return discordRestRequest({
|
|
413
|
+
method: "PUT",
|
|
414
|
+
path: `/guilds/${params.guildId}/members/${params.userId}/roles/${params.roleId}`,
|
|
415
|
+
...(params.reason ? { reason: params.reason } : {}),
|
|
416
|
+
}, opts);
|
|
417
|
+
}
|
|
418
|
+
export async function roleRemove(params, opts) {
|
|
419
|
+
return discordRestRequest({
|
|
420
|
+
method: "DELETE",
|
|
421
|
+
path: `/guilds/${params.guildId}/members/${params.userId}/roles/${params.roleId}`,
|
|
422
|
+
...(params.reason ? { reason: params.reason } : {}),
|
|
423
|
+
}, opts);
|
|
424
|
+
}
|
|
425
|
+
/** Alias of {@link roleList} — surfaced as the `role-info` action. */
|
|
426
|
+
export async function roleInfo(params, opts) {
|
|
427
|
+
return roleList(params, opts);
|
|
428
|
+
}
|
|
429
|
+
export async function memberInfo(params, opts) {
|
|
430
|
+
return discordRestRequest({ method: "GET", path: `/guilds/${params.guildId}/members/${params.userId}` }, opts);
|
|
431
|
+
}
|
|
432
|
+
export async function emojiList(params, opts) {
|
|
433
|
+
return discordRestRequest({ method: "GET", path: `/guilds/${params.guildId}/emojis` }, opts);
|
|
434
|
+
}
|
|
435
|
+
/** Upload a custom emoji. `image` MUST be a data URI (`data:image/png;base64,...`). */
|
|
436
|
+
export async function emojiUpload(params, opts) {
|
|
437
|
+
const body = { name: params.name, image: params.image };
|
|
438
|
+
if (params.roleIds && params.roleIds.length > 0)
|
|
439
|
+
body.roles = params.roleIds;
|
|
440
|
+
return discordRestRequest({ method: "POST", path: `/guilds/${params.guildId}/emojis`, body }, opts);
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Upload a guild sticker. Discord requires `multipart/form-data` here (the sticker
|
|
444
|
+
* file is a binary part), so this is the one helper that does NOT go through the
|
|
445
|
+
* JSON `discordRestRequest`. `file` is the raw bytes; `contentType` is the
|
|
446
|
+
* MIME type (image/png, image/apng, application/json for Lottie).
|
|
447
|
+
*/
|
|
448
|
+
export async function stickerUpload(params, opts) {
|
|
449
|
+
const token = stripBotPrefix((opts.token ?? "").trim());
|
|
450
|
+
if (!token)
|
|
451
|
+
throw new Error("no Discord bot token configured");
|
|
452
|
+
const doFetch = opts.fetchImpl ?? fetch;
|
|
453
|
+
const form = new FormData();
|
|
454
|
+
form.append("name", params.name);
|
|
455
|
+
form.append("description", params.description);
|
|
456
|
+
form.append("tags", params.tags);
|
|
457
|
+
form.append("file", new Blob([params.file], { type: params.contentType }), params.filename ?? "sticker");
|
|
458
|
+
const res = await doFetch(`${DISCORD_API_BASE}/guilds/${params.guildId}/stickers`, {
|
|
459
|
+
method: "POST",
|
|
460
|
+
headers: { Authorization: `Bot ${token}` },
|
|
461
|
+
body: form,
|
|
462
|
+
});
|
|
463
|
+
let parsed = null;
|
|
464
|
+
if (res.status !== 204) {
|
|
465
|
+
try {
|
|
466
|
+
parsed = await res.json();
|
|
467
|
+
}
|
|
468
|
+
catch {
|
|
469
|
+
parsed = null;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
if (!res.ok)
|
|
473
|
+
throw decodeDiscordRestError(res.status, parsed);
|
|
474
|
+
return parsed ?? { ok: true };
|
|
475
|
+
}
|
|
476
|
+
export async function eventList(params, opts) {
|
|
477
|
+
return discordRestRequest({ method: "GET", path: `/guilds/${params.guildId}/scheduled-events` }, opts);
|
|
478
|
+
}
|
|
479
|
+
/**
|
|
480
|
+
* Create a guild scheduled event. `entityType`: 1=stage, 2=voice, 3=external.
|
|
481
|
+
* A voice/stage event needs `channelId`; an external event needs `location` +
|
|
482
|
+
* `endTime`. Times are ISO-8601 strings.
|
|
483
|
+
*/
|
|
484
|
+
export async function eventCreate(params, opts) {
|
|
485
|
+
const entityType = params.entityType === "stage" ? 1 : params.entityType === "external" ? 3 : 2;
|
|
486
|
+
const body = {
|
|
487
|
+
name: params.name,
|
|
488
|
+
scheduled_start_time: params.startTime,
|
|
489
|
+
entity_type: entityType,
|
|
490
|
+
privacy_level: 2, // GUILD_ONLY
|
|
491
|
+
};
|
|
492
|
+
if (params.endTime)
|
|
493
|
+
body.scheduled_end_time = params.endTime;
|
|
494
|
+
if (params.description)
|
|
495
|
+
body.description = params.description;
|
|
496
|
+
if (params.channelId)
|
|
497
|
+
body.channel_id = params.channelId;
|
|
498
|
+
if (entityType === 3 && params.location)
|
|
499
|
+
body.entity_metadata = { location: params.location };
|
|
500
|
+
return discordRestRequest({ method: "POST", path: `/guilds/${params.guildId}/scheduled-events`, body }, opts);
|
|
501
|
+
}
|
|
502
|
+
/* ───────────────────────────── moderation ───────────────────────────── */
|
|
503
|
+
/**
|
|
504
|
+
* Ban a guild member. `deleteMessageDays` (0–7) purges their recent messages.
|
|
505
|
+
* Owner-only is the tool gate; Discord enforces the bot's own BAN_MEMBERS
|
|
506
|
+
* permission (a 50013 is decoded into a readable hint).
|
|
507
|
+
*/
|
|
508
|
+
export async function ban(params, opts) {
|
|
509
|
+
const body = {};
|
|
510
|
+
if (typeof params.deleteMessageDays === "number") {
|
|
511
|
+
const days = Math.max(0, Math.min(7, params.deleteMessageDays));
|
|
512
|
+
body.delete_message_seconds = days * 86_400;
|
|
513
|
+
}
|
|
514
|
+
return discordRestRequest({
|
|
515
|
+
method: "PUT",
|
|
516
|
+
path: `/guilds/${params.guildId}/bans/${params.userId}`,
|
|
517
|
+
body,
|
|
518
|
+
...(params.reason ? { reason: params.reason } : {}),
|
|
519
|
+
}, opts);
|
|
520
|
+
}
|
|
521
|
+
export async function unban(params, opts) {
|
|
522
|
+
return discordRestRequest({
|
|
523
|
+
method: "DELETE",
|
|
524
|
+
path: `/guilds/${params.guildId}/bans/${params.userId}`,
|
|
525
|
+
...(params.reason ? { reason: params.reason } : {}),
|
|
526
|
+
}, opts);
|
|
527
|
+
}
|
|
528
|
+
export async function kick(params, opts) {
|
|
529
|
+
return discordRestRequest({
|
|
530
|
+
method: "DELETE",
|
|
531
|
+
path: `/guilds/${params.guildId}/members/${params.userId}`,
|
|
532
|
+
...(params.reason ? { reason: params.reason } : {}),
|
|
533
|
+
}, opts);
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* Time a member out for `durationMinutes` from now (max 28 days), or clear it with
|
|
537
|
+
* {@link untimeout}. Sets `communication_disabled_until` to an ISO timestamp.
|
|
538
|
+
*/
|
|
539
|
+
export async function timeout(params, opts) {
|
|
540
|
+
const MAX_MINUTES = 28 * 24 * 60;
|
|
541
|
+
const minutes = Math.max(1, Math.min(MAX_MINUTES, params.durationMinutes));
|
|
542
|
+
const until = new Date(Date.now() + minutes * 60_000).toISOString();
|
|
543
|
+
return discordRestRequest({
|
|
544
|
+
method: "PATCH",
|
|
545
|
+
path: `/guilds/${params.guildId}/members/${params.userId}`,
|
|
546
|
+
body: { communication_disabled_until: until },
|
|
547
|
+
...(params.reason ? { reason: params.reason } : {}),
|
|
548
|
+
}, opts);
|
|
549
|
+
}
|
|
550
|
+
/** Clear a member's timeout (sets `communication_disabled_until` to null). */
|
|
551
|
+
export async function untimeout(params, opts) {
|
|
552
|
+
return discordRestRequest({
|
|
553
|
+
method: "PATCH",
|
|
554
|
+
path: `/guilds/${params.guildId}/members/${params.userId}`,
|
|
555
|
+
body: { communication_disabled_until: null },
|
|
556
|
+
...(params.reason ? { reason: params.reason } : {}),
|
|
557
|
+
}, opts);
|
|
558
|
+
}
|
|
559
|
+
//# sourceMappingURL=rest-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rest-actions.js","sourceRoot":"","sources":["../../../../src/agents/channels/discord/rest-actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,gBAAgB,GAAG,6BAA6B,CAAC;AACvD,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,mBAAmB,GAA2B;IACnD,KAAK,EAAE,yEAAyE;IAChF,KAAK,EAAE,yEAAyE;IAChF,KAAK,EAAE,yDAAyD;IAChE,KAAK,EAAE,8DAA8D;IACrE,KAAK,EAAE,yDAAyD;IAChE,KAAK,EAAE,4CAA4C;IACnD,KAAK,EAAE,0DAA0D;IACjE,KAAK,EAAE,8CAA8C;IACrD,KAAK,EAAE,qCAAqC;IAC5C,KAAK,EAAE,yDAAyD;IAChE,KAAK,EAAE,6CAA6C;IACpD,KAAK,EAAE,0FAA0F;IACjG,KAAK,EAAE,mFAAmF;IAC1F,KAAK,EAAE,yGAAyG;IAChH,KAAK,EAAE,8EAA8E;IACrF,KAAK,EAAE,yCAAyC;CAChD,CAAC;AAEF,0FAA0F;AAC1F,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACjC,MAAM,CAAS;IACxB,6EAA6E;IACpE,IAAI,CAAU;IACvB,0DAA0D;IACjD,UAAU,CAAU;IAE7B,YAAY,OAAe,EAAE,IAA4D;QACxF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACnD,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;YAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IACtE,CAAC;CACD;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAc,EAAE,IAAa;IACnE,MAAM,MAAM,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAgC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzF,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,MAAM,UAAU,GAAG,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACnF,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACpB,MAAM,UAAU,GACf,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;QACzE,OAAO,IAAI,gBAAgB,CAC1B,0BAA0B,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,kBAAkB,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,4BAA4B,EACrH,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CACxG,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxE,MAAM,GAAG,GACR,IAAI;QACJ,CAAC,MAAM,KAAK,GAAG;YACd,CAAC,CAAC,0HAA0H;YAC5H,CAAC,CAAC,UAAU;gBACX,CAAC,CAAC,iCAAiC,UAAU,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI;gBAC9F,CAAC,CAAC,gCAAgC,MAAM,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC9F,OAAO,IAAI,gBAAgB,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACvF,CAAC;AA0BD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACvC,KAAmB,EACnB,IAAwB;IAExB,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC;IAEvD,IAAI,GAAG,GAAG,GAAG,gBAAgB,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7C,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE;gBAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,CAAC;QACD,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;QACxB,IAAI,CAAC;YAAE,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;IACvB,CAAC;IAED,MAAM,OAAO,GAA2B;QACvC,aAAa,EAAE,OAAO,KAAK,EAAE;QAC7B,cAAc,EAAE,kBAAkB;KAClC,CAAC;IACF,kFAAkF;IAClF,yEAAyE;IACzE,mFAAmF;IACnF,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAEnF,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAC9D,IAAI,OAAQ,KAAgC,CAAC,KAAK,KAAK,UAAU;QAAG,KAA+B,CAAC,KAAK,EAAE,CAAC;IAC5G,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE;YAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,OAAO;YACP,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzE,CAAC,CAAC;QACH,IAAI,MAAM,GAAY,IAAI,CAAC;QAC3B,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACxB,IAAI,CAAC;gBACJ,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC3B,CAAC;YAAC,MAAM,CAAC;gBACR,MAAM,GAAG,IAAI,CAAC;YACf,CAAC;QACF,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,sBAAsB,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC9D,OAAO,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IACnD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAI,GAAG,YAAY,gBAAgB;YAAE,MAAM,GAAG,CAAC;QAC/C,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,SAAS,IAAI,CAAC,CAAC;QACjG,MAAM,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,CAAC;YAAS,CAAC;QACV,YAAY,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACF,CAAC;AAiBD,yFAAyF;AACzF,MAAM,UAAU,UAAU,CAAC,IAAsB;IAChD,MAAM,KAAK,GAA4B,EAAE,CAAC;IAC1C,IAAI,IAAI,CAAC,KAAK;QAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzC,IAAI,IAAI,CAAC,WAAW;QAAE,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IAC3D,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAC5F,IAAI,IAAI,CAAC,GAAG;QAAE,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACnC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM;aACxB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC;aAC7E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,IAAI,CAAC,MAAM;QAAE,KAAK,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACtD,IAAI,IAAI,CAAC,KAAK;QAAE,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAClD,IAAI,IAAI,CAAC,SAAS;QAAE,KAAK,CAAC,SAAS,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IAC9D,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,EAAU,EAAE,IAAwB;IAC9E,MAAM,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IACxE,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACxE,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACjD,MAAM,EAAE,GAAG,CAAC,MAAM,kBAAkB,CACnC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAC/E,IAAI,CACJ,CAAoB,CAAC;QACtB,IAAI,CAAC,EAAE,EAAE,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,MAAM,EAAE,CAAC,CAAC;QAC/E,OAAO,EAAE,CAAC,EAAE,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,6EAA6E;AAE7E,2EAA2E;AAC3E,MAAM,mCAAmC,GAAG,CAAC,IAAI,EAAE,CAAC;AAepD;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB;IACtC,OAAO,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;AACtC,CAAC;AAED;;;;GAIG;AACH,SAAS,0BAA0B,CAClC,QAAqC;IAErC,OAAO,QAAQ,IAAI,uBAAuB,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,MAmBC,EACD,IAAwB;IAExB,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC9D,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,IAAI,MAAM,CAAC,OAAO;QAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAClD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACrC,CAAC;IACD,IAAI,MAAM,CAAC,OAAO;QAAE,IAAI,CAAC,iBAAiB,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IAC5E,IAAI,CAAC,gBAAgB,GAAG,0BAA0B,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAC3E,IAAI,KAAK,GAAG,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjG,IAAI,MAAM,CAAC,MAAM;QAAE,KAAK,IAAI,mCAAmC,CAAC;IAChE,IAAI,KAAK;QAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IAC9B,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACpE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,kBAAkB,CACxB,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,SAAS,WAAW,EAAE,IAAI,EAAE,EACjE,IAAI,CACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC9B,MAA+G,EAC/G,IAAwB;IAExB,OAAO,WAAW,CACjB;QACC,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9E,EACD,IAAI,CACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC7B,MAOC,EACD,IAAwB;IAExB,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IACtF,MAAM,IAAI,GAA4B;QACrC,IAAI,EAAE;YACL,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE;YACnC,OAAO;YACP,QAAQ,EAAE,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE;YACtF,iBAAiB,EAAE,MAAM,CAAC,gBAAgB,KAAK,IAAI;SACnD;QACD,gBAAgB,EAAE,0BAA0B,CAAC,MAAM,CAAC,eAAe,CAAC;KACpE,CAAC;IACF,OAAO,kBAAkB,CACxB,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,SAAS,WAAW,EAAE,IAAI,EAAE,EACjE,IAAI,CACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,MAA4G,EAC5G,IAAwB;IAExB,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC9D,MAAM,IAAI,GAA4B,EAAE,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IACrF,IAAI,MAAM,CAAC,OAAO;QAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAClD,IAAI,CAAC,gBAAgB,GAAG,0BAA0B,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAC3E,OAAO,kBAAkB,CACxB,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,SAAS,WAAW,EAAE,IAAI,EAAE,EACjE,IAAI,CACJ,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,MAA+F,EAC/F,IAAwB;IAExB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5D,OAAO,kBAAkB,CACxB;QACC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,aAAa,MAAM,CAAC,SAAS,WAAW;QAC9C,KAAK,EAAE;YACN,KAAK;YACL,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnD;KACD,EACD,IAAI,CACJ,CAAC;AACH,CAAC;AAED,8FAA8F;AAC9F,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,MAA+E,EAC/E,IAAwB;IAExB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5D,OAAO,kBAAkB,CACxB;QACC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,aAAa,MAAM,CAAC,SAAS,aAAa,MAAM,CAAC,SAAS,cAAc,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;QAChH,KAAK,EAAE,EAAE,KAAK,EAAE;KAChB,EACD,IAAI,CACJ,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,MAAgF,EAChF,IAAwB;IAExB,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IAClD,OAAO,kBAAkB,CACxB;QACC,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,aAAa,MAAM,CAAC,SAAS,aAAa,MAAM,CAAC,SAAS,cAAc,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE;KACvH,EACD,IAAI,CACJ,CAAC;AACH,CAAC;AAED,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,MAOC,EACD,IAAwB;IAExB,MAAM,IAAI,GAA4B,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IAC5D,IAAI,MAAM,CAAC,kBAAkB;QAAE,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC,kBAAkB,CAAC;IACtF,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO,kBAAkB,CACxB;YACC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,aAAa,MAAM,CAAC,SAAS,aAAa,MAAM,CAAC,SAAS,UAAU;YAC1E,IAAI;SACJ,EACD,IAAI,CACJ,CAAC;IACH,CAAC;IACD,uEAAuE;IACvE,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;QAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IAC7D,IAAI,MAAM,CAAC,OAAO;QAAE,IAAI,CAAC,OAAO,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IAC/D,OAAO,kBAAkB,CACxB,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,MAAM,CAAC,SAAS,UAAU,EAAE,IAAI,EAAE,EACvE,IAAI,CACJ,CAAC;AACH,CAAC;AAED,gEAAgE;AAChE,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,MAA2B,EAC3B,IAAwB;IAExB,OAAO,kBAAkB,CACxB,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,MAAM,CAAC,OAAO,iBAAiB,EAAE,EACnE,IAAI,CACJ,CAAC;AACH,CAAC;AAED,2CAA2C;AAC3C,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,MAAiG,EACjG,IAAwB;IAExB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5D,OAAO,kBAAkB,CACxB;QACC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,WAAW,MAAM,CAAC,OAAO,kBAAkB;QACjD,KAAK,EAAE;YACN,OAAO,EAAE,MAAM,CAAC,KAAK;YACrB,KAAK;YACL,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1D,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7D;KACD,EACD,IAAI,CACJ,CAAC;AACH,CAAC;AAED,6EAA6E;AAE7E,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,MAQC,EACD,IAAwB;IAExB,MAAM,IAAI,GAA4B,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IAC5D,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;QAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IAC7D,IAAI,MAAM,CAAC,QAAQ;QAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;IACtD,IAAI,MAAM,CAAC,KAAK;QAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC5C,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;QAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACzE,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IAC9D,OAAO,kBAAkB,CACxB,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,MAAM,CAAC,OAAO,WAAW,EAAE,IAAI,EAAE,EACpE,IAAI,CACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,MAUC,EACD,IAAwB;IAExB,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACvD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC1D,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;QAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACzE,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;QAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;IACpE,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IAC9D,IAAI,OAAO,MAAM,CAAC,gBAAgB,KAAK,QAAQ;QAAE,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC,gBAAgB,CAAC;IACpG,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,SAAS;QAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC1E,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,SAAS;QAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IACpE,OAAO,kBAAkB,CACxB,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,EAChE,IAAI,CACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,MAA6B,EAC7B,IAAwB;IAExB,OAAO,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;AAC9F,CAAC;AAED,gGAAgG;AAChG,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,MAAoF,EACpF,IAAwB;IAExB,MAAM,KAAK,GAA4B,EAAE,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;IAChE,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;QAAE,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC1E,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;QAAE,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;IACrE,OAAO,kBAAkB,CACxB,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,MAAM,CAAC,OAAO,WAAW,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,EAC9E,IAAI,CACJ,CAAC;AACH,CAAC;AAED,0CAA0C;AAC1C,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,MAA4D,EAC5D,IAAwB;IAExB,OAAO,aAAa,CACnB,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAChI,IAAI,CACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,MAAgE,EAChE,IAAwB;IAExB,OAAO,WAAW,CACjB;QACC,SAAS,EAAE,MAAM,CAAC,UAAU;QAC5B,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvE,EACD,IAAI,CACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,MAA8B,EAC9B,IAAwB;IAExB,OAAO,aAAa,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC7B,MAA2B,EAC3B,IAAwB;IAExB,OAAO,kBAAkB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,MAAM,CAAC,OAAO,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC;AAC7F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC5B,MAA4E,EAC5E,IAAwB;IAExB,OAAO,kBAAkB,CACxB;QACC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,WAAW,MAAM,CAAC,OAAO,YAAY,MAAM,CAAC,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE;QACjF,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnD,EACD,IAAI,CACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC/B,MAA4E,EAC5E,IAAwB;IAExB,OAAO,kBAAkB,CACxB;QACC,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,WAAW,MAAM,CAAC,OAAO,YAAY,MAAM,CAAC,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE;QACjF,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnD,EACD,IAAI,CACJ,CAAC;AACH,CAAC;AAED,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC7B,MAA2B,EAC3B,IAAwB;IAExB,OAAO,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC/B,MAA2C,EAC3C,IAAwB;IAExB,OAAO,kBAAkB,CACxB,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,MAAM,CAAC,OAAO,YAAY,MAAM,CAAC,MAAM,EAAE,EAAE,EAC7E,IAAI,CACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC9B,MAA2B,EAC3B,IAAwB;IAExB,OAAO,kBAAkB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,MAAM,CAAC,OAAO,SAAS,EAAE,EAAE,IAAI,CAAC,CAAC;AAC9F,CAAC;AAED,uFAAuF;AACvF,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,MAA4E,EAC5E,IAAwB;IAExB,MAAM,IAAI,GAA4B,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IACjF,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC;IAC7E,OAAO,kBAAkB,CACxB,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,MAAM,CAAC,OAAO,SAAS,EAAE,IAAI,EAAE,EAClE,IAAI,CACJ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,MAQC,EACD,IAAwB;IAExB,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,MAAM,CACV,MAAM,EACN,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,EACrD,MAAM,CAAC,QAAQ,IAAI,SAAS,CAC5B,CAAC;IACF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,gBAAgB,WAAW,MAAM,CAAC,OAAO,WAAW,EAAE;QAClF,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,aAAa,EAAE,OAAO,KAAK,EAAE,EAAE;QAC1C,IAAI,EAAE,IAAI;KACV,CAAC,CAAC;IACH,IAAI,MAAM,GAAY,IAAI,CAAC;IAC3B,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC;YACJ,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACR,MAAM,GAAG,IAAI,CAAC;QACf,CAAC;IACF,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,sBAAsB,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9D,OAAO,MAAM,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC9B,MAA2B,EAC3B,IAAwB;IAExB,OAAO,kBAAkB,CACxB,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,MAAM,CAAC,OAAO,mBAAmB,EAAE,EACrE,IAAI,CACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,MASC,EACD,IAAwB;IAExB,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChG,MAAM,IAAI,GAA4B;QACrC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,oBAAoB,EAAE,MAAM,CAAC,SAAS;QACtC,WAAW,EAAE,UAAU;QACvB,aAAa,EAAE,CAAC,EAAE,aAAa;KAC/B,CAAC;IACF,IAAI,MAAM,CAAC,OAAO;QAAE,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,OAAO,CAAC;IAC7D,IAAI,MAAM,CAAC,WAAW;QAAE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IAC9D,IAAI,MAAM,CAAC,SAAS;QAAE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC;IACzD,IAAI,UAAU,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ;QAAE,IAAI,CAAC,eAAe,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC9F,OAAO,kBAAkB,CACxB,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,MAAM,CAAC,OAAO,mBAAmB,EAAE,IAAI,EAAE,EAC5E,IAAI,CACJ,CAAC;AACH,CAAC;AAED,4EAA4E;AAE5E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CACxB,MAAwF,EACxF,IAAwB;IAExB,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,IAAI,OAAO,MAAM,CAAC,iBAAiB,KAAK,QAAQ,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,sBAAsB,GAAG,IAAI,GAAG,MAAM,CAAC;IAC7C,CAAC;IACD,OAAO,kBAAkB,CACxB;QACC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,WAAW,MAAM,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE;QACvD,IAAI;QACJ,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnD,EACD,IAAI,CACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CAC1B,MAA4D,EAC5D,IAAwB;IAExB,OAAO,kBAAkB,CACxB;QACC,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,WAAW,MAAM,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE;QACvD,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnD,EACD,IAAI,CACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CACzB,MAA4D,EAC5D,IAAwB;IAExB,OAAO,kBAAkB,CACxB;QACC,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,WAAW,MAAM,CAAC,OAAO,YAAY,MAAM,CAAC,MAAM,EAAE;QAC1D,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnD,EACD,IAAI,CACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC5B,MAAqF,EACrF,IAAwB;IAExB,MAAM,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IACpE,OAAO,kBAAkB,CACxB;QACC,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,WAAW,MAAM,CAAC,OAAO,YAAY,MAAM,CAAC,MAAM,EAAE;QAC1D,IAAI,EAAE,EAAE,4BAA4B,EAAE,KAAK,EAAE;QAC7C,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnD,EACD,IAAI,CACJ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,SAAS,CAC9B,MAA4D,EAC5D,IAAwB;IAExB,OAAO,kBAAkB,CACxB;QACC,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,WAAW,MAAM,CAAC,OAAO,YAAY,MAAM,CAAC,MAAM,EAAE;QAC1D,IAAI,EAAE,EAAE,4BAA4B,EAAE,IAAI,EAAE;QAC5C,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnD,EACD,IAAI,CACJ,CAAC;AACH,CAAC"}
|