@songsid/agend 2.2.1 → 2.2.5
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/agent-cli-instructions.md +5 -2
- package/dist/agent-cli.js +284 -2
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-endpoint.d.ts +2 -0
- package/dist/agent-endpoint.js +29 -0
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/agent-file-read.d.ts +38 -0
- package/dist/agent-file-read.js +317 -0
- package/dist/agent-file-read.js.map +1 -0
- package/dist/agent-whats-new.d.ts +11 -0
- package/dist/agent-whats-new.js +34 -2
- package/dist/agent-whats-new.js.map +1 -1
- package/dist/atomic-write.js +9 -1
- package/dist/atomic-write.js.map +1 -1
- package/dist/auth-api.d.ts +30 -1
- package/dist/auth-api.js +61 -12
- package/dist/auth-api.js.map +1 -1
- package/dist/authority/authority-state.d.ts +38 -0
- package/dist/authority/authority-state.js +114 -0
- package/dist/authority/authority-state.js.map +1 -0
- package/dist/authority/session-authorizations.d.ts +43 -0
- package/dist/authority/session-authorizations.js +102 -0
- package/dist/authority/session-authorizations.js.map +1 -0
- package/dist/authority/web-authority.d.ts +120 -0
- package/dist/authority/web-authority.js +157 -0
- package/dist/authority/web-authority.js.map +1 -0
- package/dist/backend/antigravity.js +3 -3
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/claude-code.d.ts +2 -2
- package/dist/backend/claude-code.js +10 -5
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/launch-effort.js +1 -1
- package/dist/backend/launch-effort.js.map +1 -1
- package/dist/backend/muse.js +10 -2
- package/dist/backend/muse.js.map +1 -1
- package/dist/backend/types.d.ts +14 -0
- package/dist/backend/types.js +25 -0
- package/dist/backend/types.js.map +1 -1
- package/dist/backend-availability.d.ts +120 -0
- package/dist/backend-availability.js +396 -0
- package/dist/backend-availability.js.map +1 -0
- package/dist/backend-command.d.ts +21 -3
- package/dist/backend-command.js +23 -4
- package/dist/backend-command.js.map +1 -1
- package/dist/bundled-skills.d.ts +14 -0
- package/dist/bundled-skills.js +29 -0
- package/dist/bundled-skills.js.map +1 -0
- package/dist/cache-analysis.d.ts +47 -1
- package/dist/cache-analysis.js +68 -8
- package/dist/cache-analysis.js.map +1 -1
- package/dist/cache-ledger.d.ts +16 -3
- package/dist/cache-ledger.js +33 -13
- package/dist/cache-ledger.js.map +1 -1
- package/dist/cache-report-tool.d.ts +17 -0
- package/dist/cache-report-tool.js +40 -0
- package/dist/cache-report-tool.js.map +1 -0
- package/dist/cache-service.d.ts +70 -3
- package/dist/cache-service.js +178 -17
- package/dist/cache-service.js.map +1 -1
- package/dist/channel/adapters/discord-client-retirement.d.ts +5 -0
- package/dist/channel/adapters/discord-client-retirement.js +57 -0
- package/dist/channel/adapters/discord-client-retirement.js.map +1 -0
- package/dist/channel/adapters/discord.d.ts +11 -0
- package/dist/channel/adapters/discord.js +66 -6
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +8 -1
- package/dist/channel/adapters/telegram.js +74 -4
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/mcp-tools.js +48 -2
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/types.d.ts +21 -0
- package/dist/classic-channel-manager.d.ts +10 -5
- package/dist/classic-channel-manager.js +12 -9
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli.js +142 -110
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.js +119 -4
- package/dist/config-validator.js.map +1 -1
- package/dist/daemon.d.ts +8 -0
- package/dist/daemon.js +298 -22
- package/dist/daemon.js.map +1 -1
- package/dist/decision-list.d.ts +25 -0
- package/dist/decision-list.js +30 -0
- package/dist/decision-list.js.map +1 -0
- package/dist/delivery-outbox.d.ts +10 -0
- package/dist/delivery-outbox.js +12 -1
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/fleet-context.d.ts +15 -0
- package/dist/fleet-manager.d.ts +514 -12
- package/dist/fleet-manager.js +1885 -163
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-process-handlers.d.ts +18 -0
- package/dist/fleet-process-handlers.js +69 -0
- package/dist/fleet-process-handlers.js.map +1 -0
- package/dist/fleet-traffic.d.ts +74 -0
- package/dist/fleet-traffic.js +196 -0
- package/dist/fleet-traffic.js.map +1 -0
- package/dist/general-knowledge/skills/credential-profiles/SKILL.md +20 -5
- package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +6 -1
- package/dist/general-knowledge/skills/multi-channel/SKILL.md +3 -2
- package/dist/general-knowledge/skills/persona-emoji/SKILL.md +1 -1
- package/dist/general-knowledge/skills/web-appearance/SKILL.md +492 -0
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +482 -0
- package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +1 -1
- package/dist/human-delivery-receipts.d.ts +24 -1
- package/dist/human-delivery-receipts.js +64 -11
- package/dist/human-delivery-receipts.js.map +1 -1
- package/dist/instance-avatar.js +3 -0
- package/dist/instance-avatar.js.map +1 -1
- package/dist/instance-config-impact.js +6 -1
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +2 -0
- package/dist/instance-lifecycle.js +20 -10
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instance-names.d.ts +4 -0
- package/dist/instance-names.js +12 -0
- package/dist/instance-names.js.map +1 -0
- package/dist/instructions.d.ts +12 -1
- package/dist/instructions.js +13 -2
- package/dist/instructions.js.map +1 -1
- package/dist/locale.js +100 -8
- package/dist/locale.js.map +1 -1
- package/dist/ls-attach-resolve.d.ts +95 -0
- package/dist/ls-attach-resolve.js +174 -0
- package/dist/ls-attach-resolve.js.map +1 -0
- package/dist/memory-hogs.d.ts +27 -0
- package/dist/memory-hogs.js +124 -0
- package/dist/memory-hogs.js.map +1 -0
- package/dist/needs-you-hub.d.ts +4 -0
- package/dist/needs-you-hub.js +31 -6
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you.d.ts +1 -13
- package/dist/needs-you.js +3 -37
- package/dist/needs-you.js.map +1 -1
- package/dist/outbound-handlers.d.ts +15 -0
- package/dist/outbound-handlers.js +152 -11
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +228 -4
- package/dist/outbound-schemas.js +147 -1
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/public-web-gateway.js +21 -1
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/public-web-link.d.ts +9 -0
- package/dist/public-web-link.js +8 -0
- package/dist/public-web-link.js.map +1 -1
- package/dist/quickstart-api.d.ts +10 -1
- package/dist/quickstart-api.js +12 -4
- package/dist/quickstart-api.js.map +1 -1
- package/dist/reply-buttons-controller.d.ts +4 -0
- package/dist/reply-buttons-controller.js +2 -2
- package/dist/reply-buttons-controller.js.map +1 -1
- package/dist/repo-worktree-guard.d.ts +36 -0
- package/dist/repo-worktree-guard.js +143 -0
- package/dist/repo-worktree-guard.js.map +1 -0
- package/dist/restart-progress.d.ts +65 -1
- package/dist/restart-progress.js +236 -10
- package/dist/restart-progress.js.map +1 -1
- package/dist/rollout-index.d.ts +5 -0
- package/dist/rollout-index.js +26 -5
- package/dist/rollout-index.js.map +1 -1
- package/dist/scheduler/scheduler.d.ts +70 -1
- package/dist/scheduler/scheduler.js +256 -17
- package/dist/scheduler/scheduler.js.map +1 -1
- package/dist/service-installer.d.ts +2 -1
- package/dist/service-installer.js +18 -3
- package/dist/service-installer.js.map +1 -1
- package/dist/settings-api.d.ts +23 -0
- package/dist/settings-api.js +233 -2
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-change.js +112 -0
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-effect.js +32 -2
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.js +5 -0
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/tmux-manager.d.ts +5 -0
- package/dist/tmux-manager.js +16 -0
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tool-permissions.d.ts +4 -6
- package/dist/tool-permissions.js +100 -2
- package/dist/tool-permissions.js.map +1 -1
- package/dist/topic-commands.d.ts +17 -7
- package/dist/topic-commands.js +39 -21
- package/dist/topic-commands.js.map +1 -1
- package/dist/topic-link.d.ts +128 -0
- package/dist/topic-link.js +269 -0
- package/dist/topic-link.js.map +1 -0
- package/dist/types.d.ts +61 -1
- package/dist/ui/app-effects.js +245 -0
- package/dist/ui/chat-ambient.js +307 -0
- package/dist/ui/chat-effect-posters.js +42 -0
- package/dist/ui/chat-effects.js +160 -0
- package/dist/ui/chat-live-replies.js +58 -0
- package/dist/ui/chat-render.js +25 -7
- package/dist/ui/chat-store.js +41 -13
- package/dist/ui/chat-strings.js +86 -2
- package/dist/ui/chat-thread.js +204 -37
- package/dist/ui/chat-tour.js +1 -1
- package/dist/ui/effect-trial-controller.js +124 -0
- package/dist/ui/effect-trial-offer.js +31 -0
- package/dist/ui/effect-trial-panel.js +40 -0
- package/dist/ui/fleet-cache.js +23 -1
- package/dist/ui/fleet-canvas-layout.js +111 -0
- package/dist/ui/fleet-canvas.js +525 -0
- package/dist/ui/fleet-org.js +27 -12
- package/dist/ui/fleet-traffic.js +343 -0
- package/dist/ui/fleet-usage.js +401 -0
- package/dist/ui/image-lightbox.js +1 -1
- package/dist/ui/panel-chat.js +252 -58
- package/dist/ui/panel-details.js +20 -6
- package/dist/ui/panel-fleet.js +45 -19
- package/dist/ui/panel-log.js +6 -6
- package/dist/ui/panel-needs.js +3 -3
- package/dist/ui/panel-settings.js +58 -13
- package/dist/ui/preview-panel.js +25 -9
- package/dist/ui/preview.js +3 -2
- package/dist/ui/settings-appearance.js +349 -0
- package/dist/ui/settings-catalog.js +92 -0
- package/dist/ui/settings-dialogs.js +40 -12
- package/dist/ui/settings-effects.js +202 -0
- package/dist/ui/settings-guests.js +117 -0
- package/dist/ui/settings-learn.js +25 -0
- package/dist/ui/settings-model.js +15 -6
- package/dist/ui/settings-mods.js +271 -0
- package/dist/ui/settings-owner-effects.js +80 -0
- package/dist/ui/settings-strings.js +335 -10
- package/dist/ui/settings-web-authority.js +91 -0
- package/dist/ui/shared/agend-auth.js +28 -4
- package/dist/ui/shared/agent-widget.js +248 -0
- package/dist/ui/shared/app-i18n.js +6 -2
- package/dist/ui/shared/app-prefs.js +34 -13
- package/dist/ui/shared/app-route.js +42 -2
- package/dist/ui/shared/app-session.js +3 -1
- package/dist/ui/shared/app-shell.js +119 -41
- package/dist/ui/shared/app-store.js +28 -1
- package/dist/ui/shared/app-stream.js +14 -7
- package/dist/ui/shared/app-themes.js +206 -0
- package/dist/ui/shared/app.css +566 -5
- package/dist/ui/shared/app.js +23 -10
- package/dist/ui/shared/card-strings.js +32 -0
- package/dist/ui/shared/effect-app-runtime.js +297 -0
- package/dist/ui/shared/effect-baseline.js +64 -0
- package/dist/ui/shared/effect-chat-runtime.js +167 -0
- package/dist/ui/shared/effect-cursor.js +125 -0
- package/dist/ui/shared/effect-frame.js +146 -0
- package/dist/ui/shared/effect-geometry.js +137 -0
- package/dist/ui/shared/effect-host-style.js +10 -0
- package/dist/ui/shared/effect-owner-regions.js +74 -0
- package/dist/ui/shared/effect-owner-source.js +122 -0
- package/dist/ui/shared/effect-policy.js +151 -0
- package/dist/ui/shared/effect-poster-reader.js +98 -0
- package/dist/ui/shared/effect-posters.js +117 -0
- package/dist/ui/shared/effect-profiler.js +184 -0
- package/dist/ui/shared/effect-profiles.js +65 -0
- package/dist/ui/shared/effect-registry.js +543 -0
- package/dist/ui/shared/effect-runtime-loader.js +234 -0
- package/dist/ui/shared/effect-safety.js +153 -0
- package/dist/ui/shared/effect-stock-snapshot.js +43 -0
- package/dist/ui/shared/effect-stock-trust.js +217 -0
- package/dist/ui/shared/effect-trial-shadow.js +62 -0
- package/dist/ui/shared/effect-trial-source.js +103 -0
- package/dist/ui/shared/effect-trial-stage.js +170 -0
- package/dist/ui/shared/effect-trial.css +40 -0
- package/dist/ui/shared/fx-motion.js +67 -0
- package/dist/ui/shared/header-tools.js +1 -1
- package/dist/ui/shared/identity-card.js +273 -0
- package/dist/ui/shared/identity-color.js +261 -0
- package/dist/ui/shared/instance-nav.js +215 -41
- package/dist/ui/shared/owner-css.js +250 -0
- package/dist/ui/shared/owner-effect-prefs.js +117 -0
- package/dist/ui/shared/panel-view.js +103 -10
- package/dist/ui/shared/signin.js +2 -0
- package/dist/ui/shared/tokens.css +9 -3
- package/dist/ui/shared/ui-dialog.js +1 -1
- package/dist/ui/shared/ui-icons.js +3 -0
- package/dist/ui/shared/ui-menu.js +1 -1
- package/dist/ui/shared/ui-toast.js +1 -1
- package/dist/ui/shared/usage-dialog.js +22 -2
- package/dist/ui/shared/view-strings.js +98 -2
- package/dist/ui/shared/web-authorize.js +151 -0
- package/dist/ui/signin.html +1 -0
- package/dist/ui/web-terminal/terminal.css +4 -4
- package/dist/usage/providers.d.ts +28 -0
- package/dist/usage/providers.js +126 -36
- package/dist/usage/providers.js.map +1 -1
- package/dist/usage-report.d.ts +158 -0
- package/dist/usage-report.js +226 -0
- package/dist/usage-report.js.map +1 -0
- package/dist/usage-rollup.d.ts +51 -0
- package/dist/usage-rollup.js +168 -0
- package/dist/usage-rollup.js.map +1 -0
- package/dist/view-api.d.ts +68 -0
- package/dist/view-api.js +249 -8
- package/dist/view-api.js.map +1 -1
- package/dist/web-ambient.d.ts +72 -0
- package/dist/web-ambient.js +161 -0
- package/dist/web-ambient.js.map +1 -0
- package/dist/web-api.d.ts +117 -7
- package/dist/web-api.js +1283 -70
- package/dist/web-api.js.map +1 -1
- package/dist/web-appearance-limits.d.ts +82 -0
- package/dist/web-appearance-limits.js +83 -0
- package/dist/web-appearance-limits.js.map +1 -0
- package/dist/web-appearance-policy.d.ts +64 -0
- package/dist/web-appearance-policy.js +87 -0
- package/dist/web-appearance-policy.js.map +1 -0
- package/dist/web-appearance-tools.d.ts +53 -0
- package/dist/web-appearance-tools.js +124 -0
- package/dist/web-appearance-tools.js.map +1 -0
- package/dist/web-appearance-view.d.ts +124 -0
- package/dist/web-appearance-view.js +278 -0
- package/dist/web-appearance-view.js.map +1 -0
- package/dist/web-appearance.d.ts +93 -0
- package/dist/web-appearance.js +373 -0
- package/dist/web-appearance.js.map +1 -0
- package/dist/web-asset-parts.d.ts +93 -0
- package/dist/web-asset-parts.js +133 -0
- package/dist/web-asset-parts.js.map +1 -0
- package/dist/web-auth.js +20 -2
- package/dist/web-auth.js.map +1 -1
- package/dist/web-card.d.ts +110 -0
- package/dist/web-card.js +266 -0
- package/dist/web-card.js.map +1 -0
- package/dist/web-channel-echo.d.ts +7 -1
- package/dist/web-channel-echo.js +6 -2
- package/dist/web-channel-echo.js.map +1 -1
- package/dist/web-chat-history.d.ts +63 -0
- package/dist/web-chat-history.js +109 -6
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-commands.d.ts +1 -0
- package/dist/web-effect-bootstrap.d.ts +12 -0
- package/dist/web-effect-bootstrap.js +49 -0
- package/dist/web-effect-bootstrap.js.map +1 -0
- package/dist/web-effect-bundle.d.ts +28 -0
- package/dist/web-effect-bundle.js +171 -0
- package/dist/web-effect-bundle.js.map +1 -0
- package/dist/web-effect-canonical.d.ts +8 -0
- package/dist/web-effect-canonical.js +27 -0
- package/dist/web-effect-canonical.js.map +1 -0
- package/dist/web-effect-library.d.ts +114 -0
- package/dist/web-effect-library.js +530 -0
- package/dist/web-effect-library.js.map +1 -0
- package/dist/web-effect-playback.d.ts +30 -0
- package/dist/web-effect-playback.js +71 -0
- package/dist/web-effect-playback.js.map +1 -0
- package/dist/web-effect-poster.d.ts +8 -0
- package/dist/web-effect-poster.js +52 -0
- package/dist/web-effect-poster.js.map +1 -0
- package/dist/web-effect-profiles.d.ts +118 -0
- package/dist/web-effect-profiles.js +180 -0
- package/dist/web-effect-profiles.js.map +1 -0
- package/dist/web-effect-service.d.ts +93 -0
- package/dist/web-effect-service.js +335 -0
- package/dist/web-effect-service.js.map +1 -0
- package/dist/web-effect-tools.d.ts +48 -0
- package/dist/web-effect-tools.js +129 -0
- package/dist/web-effect-tools.js.map +1 -0
- package/dist/web-effect-trials.d.ts +86 -0
- package/dist/web-effect-trials.js +204 -0
- package/dist/web-effect-trials.js.map +1 -0
- package/dist/web-effect-upload.d.ts +27 -0
- package/dist/web-effect-upload.js +185 -0
- package/dist/web-effect-upload.js.map +1 -0
- package/dist/web-effect-worker.d.ts +8 -0
- package/dist/web-effect-worker.js +170 -0
- package/dist/web-effect-worker.js.map +1 -0
- package/dist/web-effect.d.ts +103 -0
- package/dist/web-effect.js +153 -0
- package/dist/web-effect.js.map +1 -0
- package/dist/web-guest-access.d.ts +125 -0
- package/dist/web-guest-access.js +234 -0
- package/dist/web-guest-access.js.map +1 -0
- package/dist/web-guest-rooms.d.ts +82 -0
- package/dist/web-guest-rooms.js +135 -0
- package/dist/web-guest-rooms.js.map +1 -0
- package/dist/web-identity-color.d.ts +87 -0
- package/dist/web-identity-color.js +209 -0
- package/dist/web-identity-color.js.map +1 -0
- package/dist/web-identity-palette.d.ts +113 -0
- package/dist/web-identity-palette.js +84 -0
- package/dist/web-identity-palette.js.map +1 -0
- package/dist/web-image-meta.d.ts +38 -0
- package/dist/web-image-meta.js +262 -0
- package/dist/web-image-meta.js.map +1 -0
- package/dist/web-login.d.ts +47 -0
- package/dist/web-login.js +115 -0
- package/dist/web-login.js.map +1 -1
- package/dist/web-mod-agent.d.ts +50 -0
- package/dist/web-mod-agent.js +207 -0
- package/dist/web-mod-agent.js.map +1 -0
- package/dist/web-mod-bundle.d.ts +157 -0
- package/dist/web-mod-bundle.js +529 -0
- package/dist/web-mod-bundle.js.map +1 -0
- package/dist/web-mod-export.d.ts +68 -0
- package/dist/web-mod-export.js +100 -0
- package/dist/web-mod-export.js.map +1 -0
- package/dist/web-mod-store.d.ts +289 -0
- package/dist/web-mod-store.js +638 -0
- package/dist/web-mod-store.js.map +1 -0
- package/dist/web-org.d.ts +3 -3
- package/dist/web-org.js +11 -17
- package/dist/web-org.js.map +1 -1
- package/dist/web-owner-css-store.d.ts +222 -0
- package/dist/web-owner-css-store.js +440 -0
- package/dist/web-owner-css-store.js.map +1 -0
- package/dist/web-owner-css.d.ts +58 -0
- package/dist/web-owner-css.js +552 -0
- package/dist/web-owner-css.js.map +1 -0
- package/dist/web-prefs.d.ts +62 -0
- package/dist/web-prefs.js +232 -36
- package/dist/web-prefs.js.map +1 -1
- package/dist/web-preview.d.ts +15 -3
- package/dist/web-preview.js +28 -9
- package/dist/web-preview.js.map +1 -1
- package/dist/web-returning-device.d.ts +41 -0
- package/dist/web-returning-device.js +57 -5
- package/dist/web-returning-device.js.map +1 -1
- package/dist/web-session-authorization.d.ts +132 -0
- package/dist/web-session-authorization.js +193 -0
- package/dist/web-session-authorization.js.map +1 -0
- package/dist/web-session.d.ts +70 -10
- package/dist/web-session.js +137 -22
- package/dist/web-session.js.map +1 -1
- package/dist/web-settings-patch.d.ts +67 -2
- package/dist/web-settings-patch.js +196 -1
- package/dist/web-settings-patch.js.map +1 -1
- package/dist/web-settings-tools.d.ts +89 -0
- package/dist/web-settings-tools.js +273 -0
- package/dist/web-settings-tools.js.map +1 -0
- package/dist/web-shell-routes.d.ts +2 -2
- package/dist/web-shell-routes.js +2 -2
- package/dist/web-shell-routes.js.map +1 -1
- package/dist/web-theme-store.d.ts +257 -0
- package/dist/web-theme-store.js +627 -0
- package/dist/web-theme-store.js.map +1 -0
- package/dist/web-theme.d.ts +123 -0
- package/dist/web-theme.js +416 -0
- package/dist/web-theme.js.map +1 -0
- package/dist/web-upload.d.ts +13 -0
- package/dist/web-upload.js +39 -3
- package/dist/web-upload.js.map +1 -1
- package/dist/web-widget.d.ts +72 -0
- package/dist/web-widget.js +245 -0
- package/dist/web-widget.js.map +1 -0
- package/dist/workflow-templates/default.md +1 -1
- package/package.json +1 -1
- package/templates/systemd.service.ejs +8 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
const retirements = new WeakMap();
|
|
2
|
+
const destroyers = new WeakMap();
|
|
3
|
+
/** Client.login() also calls this.destroy() internally when gateway startup fails. */
|
|
4
|
+
export function protectDiscordClientRetirement(client, report) {
|
|
5
|
+
if (destroyers.has(client))
|
|
6
|
+
return;
|
|
7
|
+
destroyers.set(client, client.destroy.bind(client));
|
|
8
|
+
client.destroy = () => retireDiscordClient(client, report);
|
|
9
|
+
}
|
|
10
|
+
/** Contain a retired gateway's errors until its underlying socket actually closes. */
|
|
11
|
+
export function retireDiscordClient(client, report) {
|
|
12
|
+
const pending = retirements.get(client);
|
|
13
|
+
if (pending)
|
|
14
|
+
return pending;
|
|
15
|
+
// discord.js 14 / @discordjs/ws 1.2.3 destroy() clears connection.onerror,
|
|
16
|
+
// but leaves CONNECTING sockets and their ws handshake timers running. Their
|
|
17
|
+
// later timeout then emits an unhandled EventEmitter error in the fleet.
|
|
18
|
+
// These are deliberately scoped private internals of the default in-process
|
|
19
|
+
// strategy; a Client without a gateway (including before login) has no sockets.
|
|
20
|
+
const strategy = client.ws?._ws?.strategy;
|
|
21
|
+
// A pending GET gateway/bot can resume Client.login after destroy has finished.
|
|
22
|
+
// Fence the strategy permanently before our first await: spawning/connecting
|
|
23
|
+
// after retirement would create sockets outside the snapshot below. A spawn
|
|
24
|
+
// already awaiting gateway info may still finish, but cannot connect them.
|
|
25
|
+
if (strategy) {
|
|
26
|
+
strategy.spawn = async () => { };
|
|
27
|
+
strategy.connect = async () => { };
|
|
28
|
+
}
|
|
29
|
+
const shards = strategy?.shards;
|
|
30
|
+
for (const shard of shards?.values() ?? []) {
|
|
31
|
+
// A HELLO timeout can already have scheduled native recovery in 1.2.3's
|
|
32
|
+
// 500ms backoff. A retired shard must never open another socket after the
|
|
33
|
+
// manager has forgotten it. This instance is never reused.
|
|
34
|
+
if (typeof shard.internalConnect === "function")
|
|
35
|
+
shard.internalConnect = async () => { };
|
|
36
|
+
}
|
|
37
|
+
const sockets = [...(shards?.values() ?? [])].flatMap(shard => shard.connection ? [shard.connection] : []);
|
|
38
|
+
for (const socket of sockets) {
|
|
39
|
+
socket.on("error", report);
|
|
40
|
+
socket.once("close", () => socket.removeListener("error", report));
|
|
41
|
+
}
|
|
42
|
+
const retirement = (async () => {
|
|
43
|
+
try {
|
|
44
|
+
await (destroyers.get(client) ?? client.destroy.bind(client))();
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
// Destroy first: it disconnects shard callbacks, so terminating a pending
|
|
48
|
+
// handshake cannot start the retired shard's native reconnect loop.
|
|
49
|
+
for (const socket of sockets)
|
|
50
|
+
if (socket.readyState === 0)
|
|
51
|
+
socket.terminate();
|
|
52
|
+
}
|
|
53
|
+
})();
|
|
54
|
+
retirements.set(client, retirement);
|
|
55
|
+
return retirement;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=discord-client-retirement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discord-client-retirement.js","sourceRoot":"","sources":["../../../src/channel/adapters/discord-client-retirement.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,GAAG,IAAI,OAAO,EAAyB,CAAC;AACzD,MAAM,UAAU,GAAG,IAAI,OAAO,EAAyB,CAAC;AAExD,sFAAsF;AACtF,MAAM,UAAU,8BAA8B,CAAC,MAAc,EAAE,MAA8B;IAC3F,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO;IACnC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACpD,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC7D,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,MAA8B;IAChF,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,2EAA2E;IAC3E,6EAA6E;IAC7E,yEAAyE;IACzE,4EAA4E;IAC5E,gFAAgF;IAChF,MAAM,QAAQ,GAAI,MAAM,CAAC,EAMvB,EAAE,GAAG,EAAE,QAAQ,CAAC;IAClB,gFAAgF;IAChF,6EAA6E;IAC7E,4EAA4E;IAC5E,2EAA2E;IAC3E,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;QAChC,QAAQ,CAAC,OAAO,GAAG,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;IACpC,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,EAAE,MAAM,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;QAC3C,wEAAwE;QACxE,0EAA0E;QAC1E,2DAA2D;QAC3D,IAAI,OAAO,KAAK,CAAC,eAAe,KAAK,UAAU;YAAE,KAAK,CAAC,eAAe,GAAG,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;IAC1F,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3G,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,UAAU,GAAG,CAAC,KAAK,IAAI,EAAE;QAC7B,IAAI,CAAC;YACH,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAClE,CAAC;gBAAS,CAAC;YACT,0EAA0E;YAC1E,oEAAoE;YACpE,KAAK,MAAM,MAAM,IAAI,OAAO;gBAAE,IAAI,MAAM,CAAC,UAAU,KAAK,CAAC;oBAAE,MAAM,CAAC,SAAS,EAAE,CAAC;QAChF,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IACL,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACpC,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -142,6 +142,8 @@ export declare class DiscordAdapter extends EventEmitter implements ChannelAdapt
|
|
|
142
142
|
private emitFromClient;
|
|
143
143
|
private emitHealthChanged;
|
|
144
144
|
private loginFreshClient;
|
|
145
|
+
private retireClient;
|
|
146
|
+
private reportRetiredSocketError;
|
|
145
147
|
/** Rebuild just this bot's gateway Client. Calls coalesce into one generation. */
|
|
146
148
|
reconnectGateway(reason: string): Promise<void>;
|
|
147
149
|
private readyClient;
|
|
@@ -199,6 +201,15 @@ export declare class DiscordAdapter extends EventEmitter implements ChannelAdapt
|
|
|
199
201
|
r: Record<string, string>;
|
|
200
202
|
c: Record<string, string>;
|
|
201
203
|
};
|
|
204
|
+
/** #1990: whether `userId` is in the guild now (one member read; an unknown member or any error rejects). */
|
|
205
|
+
isGroupMember(groupId: string, userId: string): Promise<boolean>;
|
|
206
|
+
/**
|
|
207
|
+
* #1920 §3.2: whether a user can read this room as on Discord — a member of the channel's guild (read from Discord,
|
|
208
|
+
* force: never the member cache) with View Channel and Read Message History there (the web shows a room's history,
|
|
209
|
+
* #2092 review). A private thread (a ClassicBot room can be one) also needs the user in it, or Manage Threads:
|
|
210
|
+
* discord.js answers a thread's permissionsFor from its parent, which every guild member who sees the parent passes.
|
|
211
|
+
*/
|
|
212
|
+
canViewChannel(channelId: string, userId: string): Promise<boolean>;
|
|
202
213
|
/** Private delivery: a DM to the user (fails if the user disallows DMs from this server). */
|
|
203
214
|
sendDirect(userId: string, text: string, opts?: SendOpts): Promise<SentMessage>;
|
|
204
215
|
sendText(chatId: string, text: string, opts?: SendOpts): Promise<SentMessage>;
|
|
@@ -14,8 +14,10 @@ import { Client, GatewayIntentBits, Partials, ActionRowBuilder, ButtonBuilder, B
|
|
|
14
14
|
import { downloadStickerImage } from "../sticker-download.js";
|
|
15
15
|
import { MessageQueue } from "../message-queue.js";
|
|
16
16
|
import { splitTextFenceAware, truncatePreview, fenceBlock } from "../markdown-chunk.js";
|
|
17
|
+
import { stripPlaceRefs } from "../../topic-link.js";
|
|
17
18
|
import { CROSS_INSTANCE_VISIBILITY_MODES } from "../../cross-instance-notice.js";
|
|
18
19
|
import { POLL_STATUS_CALLBACK } from "../../reply-polls.js";
|
|
20
|
+
import { protectDiscordClientRetirement, retireDiscordClient } from "./discord-client-retirement.js";
|
|
19
21
|
const DISCORD_MAX_LENGTH = 2000;
|
|
20
22
|
const GATEWAY_WATCHDOG_INTERVAL_MS = 30_000;
|
|
21
23
|
const GATEWAY_STALE_MIN_MS = 180_000;
|
|
@@ -287,6 +289,7 @@ export class DiscordAdapter extends EventEmitter {
|
|
|
287
289
|
return channel;
|
|
288
290
|
}
|
|
289
291
|
registerClientHandlers(client, generation) {
|
|
292
|
+
protectDiscordClientRetirement(client, error => this.reportRetiredSocketError(error));
|
|
290
293
|
// Client/shard errors (WebSocket hiccups, gateway resumes, etc.). discord.js
|
|
291
294
|
// auto-reconnects; we just need a listener so Node's EventEmitter doesn't
|
|
292
295
|
// rethrow on "error" — without one it surfaces as an uncaughtException and
|
|
@@ -841,7 +844,10 @@ export class DiscordAdapter extends EventEmitter {
|
|
|
841
844
|
const oldClient = this.client;
|
|
842
845
|
// A destroyed discord.js Client cannot be logged in again. Destroy first to
|
|
843
846
|
// avoid overlapping gateway sessions delivering MESSAGE_CREATE twice.
|
|
844
|
-
|
|
847
|
+
await this.retireClient(oldClient);
|
|
848
|
+
if (!this.desiredRunning || epoch !== this.lifecycleEpoch) {
|
|
849
|
+
throw new Error("Discord gateway login superseded by lifecycle change");
|
|
850
|
+
}
|
|
845
851
|
const client = this.clientFactory();
|
|
846
852
|
const generation = ++this.clientGeneration;
|
|
847
853
|
this.client = client;
|
|
@@ -855,7 +861,6 @@ export class DiscordAdapter extends EventEmitter {
|
|
|
855
861
|
try {
|
|
856
862
|
await client.login(this.botToken);
|
|
857
863
|
if (!this.desiredRunning || epoch !== this.lifecycleEpoch || this.client !== client) {
|
|
858
|
-
client.destroy();
|
|
859
864
|
throw new Error("Discord gateway login superseded by lifecycle change");
|
|
860
865
|
}
|
|
861
866
|
this.lastReconnectAt = this.now();
|
|
@@ -864,10 +869,16 @@ export class DiscordAdapter extends EventEmitter {
|
|
|
864
869
|
this.emitHealthChanged();
|
|
865
870
|
}
|
|
866
871
|
catch (err) {
|
|
867
|
-
|
|
872
|
+
await this.retireClient(client);
|
|
868
873
|
throw err;
|
|
869
874
|
}
|
|
870
875
|
}
|
|
876
|
+
retireClient(client) {
|
|
877
|
+
return retireDiscordClient(client, error => this.reportRetiredSocketError(error));
|
|
878
|
+
}
|
|
879
|
+
reportRetiredSocketError(error) {
|
|
880
|
+
console.warn(`[discord:${this.id}] retired gateway socket error: ${error.message}`);
|
|
881
|
+
}
|
|
871
882
|
/** Rebuild just this bot's gateway Client. Calls coalesce into one generation. */
|
|
872
883
|
reconnectGateway(reason) {
|
|
873
884
|
if (this.reconnectPromise)
|
|
@@ -1341,7 +1352,7 @@ export class DiscordAdapter extends EventEmitter {
|
|
|
1341
1352
|
clearInterval(this.watchdogTimer);
|
|
1342
1353
|
this.watchdogTimer = null;
|
|
1343
1354
|
this.queue.stop();
|
|
1344
|
-
this.client
|
|
1355
|
+
await this.retireClient(this.client);
|
|
1345
1356
|
}
|
|
1346
1357
|
// ── Text / file sending ────────────────────────────────────────────────
|
|
1347
1358
|
/**
|
|
@@ -1406,14 +1417,61 @@ export class DiscordAdapter extends EventEmitter {
|
|
|
1406
1417
|
}
|
|
1407
1418
|
return out;
|
|
1408
1419
|
}
|
|
1420
|
+
/** #1990: whether `userId` is in the guild now (one member read; an unknown member or any error rejects). */
|
|
1421
|
+
async isGroupMember(groupId, userId) {
|
|
1422
|
+
if (!/^\d{5,25}$/.test(userId) || !groupId || groupId !== this.guildId)
|
|
1423
|
+
return false;
|
|
1424
|
+
const guild = await (await this.readyClient()).guilds.fetch(this.guildId);
|
|
1425
|
+
// force: a read from Discord, never the member cache — without the GuildMembers intent a member who left can
|
|
1426
|
+
// stay cached, and each ten-minute recheck would confirm them again.
|
|
1427
|
+
await guild.members.fetch({ user: userId, force: true });
|
|
1428
|
+
return true;
|
|
1429
|
+
}
|
|
1430
|
+
/**
|
|
1431
|
+
* #1920 §3.2: whether a user can read this room as on Discord — a member of the channel's guild (read from Discord,
|
|
1432
|
+
* force: never the member cache) with View Channel and Read Message History there (the web shows a room's history,
|
|
1433
|
+
* #2092 review). A private thread (a ClassicBot room can be one) also needs the user in it, or Manage Threads:
|
|
1434
|
+
* discord.js answers a thread's permissionsFor from its parent, which every guild member who sees the parent passes.
|
|
1435
|
+
*/
|
|
1436
|
+
async canViewChannel(channelId, userId) {
|
|
1437
|
+
if (!/^\d{5,25}$/.test(userId) || !/^\d{5,25}$/.test(channelId))
|
|
1438
|
+
return false;
|
|
1439
|
+
const channel = await (await this.readyClient()).channels.fetch(channelId);
|
|
1440
|
+
if (!channel || !("guild" in channel) || !channel.guild || typeof channel.permissionsFor !== "function")
|
|
1441
|
+
return false;
|
|
1442
|
+
// 10007 Unknown Member / 10013 Unknown User: a definite "not in it"; anything else is no answer (rethrown).
|
|
1443
|
+
const notIn = (err) => { if ([10007, 10013].includes(err.code))
|
|
1444
|
+
return false; throw err; };
|
|
1445
|
+
let member;
|
|
1446
|
+
try {
|
|
1447
|
+
member = await channel.guild.members.fetch({ user: userId, force: true });
|
|
1448
|
+
}
|
|
1449
|
+
catch (err) {
|
|
1450
|
+
return notIn(err);
|
|
1451
|
+
}
|
|
1452
|
+
const perms = channel.permissionsFor(member);
|
|
1453
|
+
if (perms?.has(PermissionFlagsBits.ViewChannel) !== true || perms.has(PermissionFlagsBits.ReadMessageHistory) !== true)
|
|
1454
|
+
return false;
|
|
1455
|
+
if (channel.type !== ChannelType.PrivateThread || perms.has(PermissionFlagsBits.ManageThreads))
|
|
1456
|
+
return true;
|
|
1457
|
+
try {
|
|
1458
|
+
await channel.members.fetch({ member: userId, force: true });
|
|
1459
|
+
return true;
|
|
1460
|
+
}
|
|
1461
|
+
catch (err) {
|
|
1462
|
+
return notIn(err);
|
|
1463
|
+
}
|
|
1464
|
+
}
|
|
1409
1465
|
/** Private delivery: a DM to the user (fails if the user disallows DMs from this server). */
|
|
1410
1466
|
async sendDirect(userId, text, opts) {
|
|
1467
|
+
text = stripPlaceRefs(text);
|
|
1411
1468
|
const user = await this.client.users.fetch(userId);
|
|
1412
1469
|
const dm = await user.createDM();
|
|
1413
1470
|
const sent = await dm.send({ content: text, ...(opts?.disablePreview ? { flags: MessageFlags.SuppressEmbeds } : {}), ...(opts?.choices ? { components: buttonRows(opts.choices) } : {}), allowedMentions: { parse: [] } });
|
|
1414
1471
|
return { messageId: sent.id, chatId: dm.id };
|
|
1415
1472
|
}
|
|
1416
1473
|
async sendText(chatId, text, opts) {
|
|
1474
|
+
text = stripPlaceRefs(text);
|
|
1417
1475
|
const channelId = opts?.threadId ?? chatId;
|
|
1418
1476
|
const channel = await this._fetchTextChannel(channelId);
|
|
1419
1477
|
const chunkLimit = opts?.chunkLimit ?? DISCORD_MAX_LENGTH;
|
|
@@ -1483,6 +1541,7 @@ export class DiscordAdapter extends EventEmitter {
|
|
|
1483
1541
|
}
|
|
1484
1542
|
/** #1651: `_opts.format` changes nothing here — Discord always renders Markdown (as sendText ignores it too). */
|
|
1485
1543
|
async editMessage(chatId, messageId, text, threadId, _opts) {
|
|
1544
|
+
text = stripPlaceRefs(text);
|
|
1486
1545
|
// Prefer the exact channel (handles forum-topic threads, which a GuildText
|
|
1487
1546
|
// scan misses). chatId is the guild id in the channels topology, so the
|
|
1488
1547
|
// message actually lives in threadId (when set) or a specific text channel.
|
|
@@ -1535,6 +1594,7 @@ export class DiscordAdapter extends EventEmitter {
|
|
|
1535
1594
|
await msg.edit({ components: [] });
|
|
1536
1595
|
}
|
|
1537
1596
|
async editMessageRemoveButtons(chatId, messageId, text, threadId) {
|
|
1597
|
+
text = stripPlaceRefs(text);
|
|
1538
1598
|
// Prefer the exact channel (handles forum-topic threads, which a GuildText
|
|
1539
1599
|
// scan misses); fall back to scanning top-level text channels.
|
|
1540
1600
|
let exactError;
|
|
@@ -1908,7 +1968,7 @@ export class DiscordAdapter extends EventEmitter {
|
|
|
1908
1968
|
if (alert.choices && alert.choices.length > 0) {
|
|
1909
1969
|
const channelId = opts?.threadId ?? chatId;
|
|
1910
1970
|
const channel = await this._fetchTextChannel(channelId);
|
|
1911
|
-
const msg = await channel.send({ content: alert.message, components: buttonRows(alert.choices) });
|
|
1971
|
+
const msg = await channel.send({ content: stripPlaceRefs(alert.message), components: buttonRows(alert.choices) });
|
|
1912
1972
|
// The address this adapter's own callbacks report for these buttons
|
|
1913
1973
|
// (guild + channel as thread), not the caller's spelling of it (#1131).
|
|
1914
1974
|
// A native slash command addresses its channel as the chat; the button
|
|
@@ -1937,7 +1997,7 @@ export class DiscordAdapter extends EventEmitter {
|
|
|
1937
1997
|
const channel = await this._fetchTextChannel(opts?.threadId ?? chatId);
|
|
1938
1998
|
const msg = await channel.messages.fetch(messageId);
|
|
1939
1999
|
await msg.edit({
|
|
1940
|
-
content: truncatePreview(alert.message, DISCORD_MAX_LENGTH),
|
|
2000
|
+
content: truncatePreview(stripPlaceRefs(alert.message), DISCORD_MAX_LENGTH),
|
|
1941
2001
|
components: buttonRows(alert.choices ?? []),
|
|
1942
2002
|
});
|
|
1943
2003
|
}
|