@songsid/agend 2.1.12 → 2.2.0-alpha.2
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/README.md +4 -2
- package/README.zh-TW.md +4 -2
- package/dist/agent-cli.js +6 -1
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-endpoint.js +68 -12
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/agent-token-header.d.ts +13 -0
- package/dist/agent-token-header.js +16 -0
- package/dist/agent-token-header.js.map +1 -0
- package/dist/auth/one-time-code.d.ts +19 -0
- package/dist/auth/one-time-code.js +49 -0
- package/dist/auth/one-time-code.js.map +1 -0
- package/dist/auth-api.d.ts +52 -0
- package/dist/auth-api.js +346 -0
- package/dist/auth-api.js.map +1 -0
- package/dist/backend/antigravity.js +4 -3
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/claude-code.d.ts +4 -0
- package/dist/backend/claude-code.js +97 -0
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex.js +59 -30
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/grok.js +1 -1
- package/dist/backend/grok.js.map +1 -1
- package/dist/backend/kiro-agent.d.ts +66 -0
- package/dist/backend/kiro-agent.js +302 -0
- package/dist/backend/kiro-agent.js.map +1 -0
- package/dist/backend/kiro-identity.d.ts +80 -0
- package/dist/backend/kiro-identity.js +537 -0
- package/dist/backend/kiro-identity.js.map +1 -0
- package/dist/backend/kiro-v2-store-worker.d.ts +1 -0
- package/dist/backend/kiro-v2-store-worker.js +87 -0
- package/dist/backend/kiro-v2-store-worker.js.map +1 -0
- package/dist/backend/kiro-v2-store.d.ts +54 -0
- package/dist/backend/kiro-v2-store.js +131 -0
- package/dist/backend/kiro-v2-store.js.map +1 -0
- package/dist/backend/kiro-v3-identity.d.ts +5 -0
- package/dist/backend/kiro-v3-identity.js +22 -0
- package/dist/backend/kiro-v3-identity.js.map +1 -1
- package/dist/backend/kiro.d.ts +90 -7
- package/dist/backend/kiro.js +500 -124
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/muse.js +1 -1
- package/dist/backend/muse.js.map +1 -1
- package/dist/backend/types.d.ts +51 -3
- package/dist/backend/types.js.map +1 -1
- package/dist/cache-analysis.d.ts +92 -0
- package/dist/cache-analysis.js +147 -0
- package/dist/cache-analysis.js.map +1 -0
- package/dist/cache-ledger.d.ts +108 -0
- package/dist/cache-ledger.js +230 -0
- package/dist/cache-ledger.js.map +1 -0
- package/dist/cache-prices.d.ts +32 -0
- package/dist/cache-prices.js +73 -0
- package/dist/cache-prices.js.map +1 -0
- package/dist/cache-scan.d.ts +39 -0
- package/dist/cache-scan.js +115 -0
- package/dist/cache-scan.js.map +1 -0
- package/dist/cache-service.d.ts +115 -0
- package/dist/cache-service.js +417 -0
- package/dist/cache-service.js.map +1 -0
- package/dist/channel/adapters/discord.d.ts +1 -0
- package/dist/channel/adapters/discord.js +29 -10
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +1 -0
- package/dist/channel/adapters/telegram.js +13 -1
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/types.d.ts +9 -1
- package/dist/classic-channel-manager.d.ts +18 -10
- package/dist/classic-channel-manager.js +45 -18
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli-entry.d.ts +19 -0
- package/dist/cli-entry.js +36 -0
- package/dist/cli-entry.js.map +1 -0
- package/dist/cli.js +471 -146
- package/dist/cli.js.map +1 -1
- package/dist/command-table.d.ts +5 -3
- package/dist/command-table.js +29 -27
- package/dist/command-table.js.map +1 -1
- package/dist/config-validator.js +46 -0
- package/dist/config-validator.js.map +1 -1
- package/dist/config.js +12 -0
- package/dist/config.js.map +1 -1
- package/dist/connection-secrets.d.ts +6 -0
- package/dist/connection-secrets.js +4 -0
- package/dist/connection-secrets.js.map +1 -1
- package/dist/daemon.d.ts +95 -4
- package/dist/daemon.js +748 -111
- package/dist/daemon.js.map +1 -1
- package/dist/darwin-memory.d.ts +6 -1
- package/dist/darwin-memory.js +17 -6
- package/dist/darwin-memory.js.map +1 -1
- package/dist/delivery-consumed-watch.d.ts +85 -0
- package/dist/delivery-consumed-watch.js +244 -0
- package/dist/delivery-consumed-watch.js.map +1 -0
- package/dist/delivery-outbox.d.ts +61 -0
- package/dist/delivery-outbox.js +120 -2
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/delivery-reconciliation.d.ts +14 -5
- package/dist/delivery-reconciliation.js +27 -4
- package/dist/delivery-reconciliation.js.map +1 -1
- package/dist/delivery-reconciliation.test.js +35 -1
- package/dist/delivery-reconciliation.test.js.map +1 -1
- package/dist/event-log.d.ts +4 -1
- package/dist/event-log.js +6 -3
- package/dist/event-log.js.map +1 -1
- package/dist/event-loop-watch.d.ts +28 -0
- package/dist/event-loop-watch.js +75 -3
- package/dist/event-loop-watch.js.map +1 -1
- package/dist/fleet-context.d.ts +22 -2
- package/dist/fleet-control-audit.d.ts +5 -0
- package/dist/fleet-control-audit.js +7 -0
- package/dist/fleet-control-audit.js.map +1 -1
- package/dist/fleet-level-config.d.ts +2 -2
- package/dist/fleet-level-config.js +28 -1
- package/dist/fleet-level-config.js.map +1 -1
- package/dist/fleet-manager.d.ts +339 -12
- package/dist/fleet-manager.js +2623 -461
- package/dist/fleet-manager.js.map +1 -1
- package/dist/full-restart.js +2 -3
- package/dist/full-restart.js.map +1 -1
- package/dist/general-knowledge/skills/persona-emoji/SKILL.md +3 -1
- package/dist/host-memory.d.ts +4 -0
- package/dist/host-memory.js.map +1 -1
- package/dist/install-lock.d.ts +49 -0
- package/dist/install-lock.js +200 -0
- package/dist/install-lock.js.map +1 -0
- package/dist/instance-config-impact.js +8 -2
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +10 -5
- package/dist/instance-lifecycle.js +162 -53
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/locale.js +164 -16
- package/dist/locale.js.map +1 -1
- package/dist/login-controller.d.ts +2 -0
- package/dist/login-controller.js +17 -5
- package/dist/login-controller.js.map +1 -1
- package/dist/memory-pressure.d.ts +7 -8
- package/dist/memory-pressure.js +76 -15
- package/dist/memory-pressure.js.map +1 -1
- package/dist/monotonic-budget.d.ts +2 -0
- package/dist/monotonic-budget.js +28 -0
- package/dist/monotonic-budget.js.map +1 -0
- package/dist/needs-you-hub.d.ts +114 -0
- package/dist/needs-you-hub.js +370 -0
- package/dist/needs-you-hub.js.map +1 -0
- package/dist/needs-you-live.d.ts +116 -0
- package/dist/needs-you-live.js +228 -0
- package/dist/needs-you-live.js.map +1 -0
- package/dist/needs-you.d.ts +132 -0
- package/dist/needs-you.js +164 -0
- package/dist/needs-you.js.map +1 -0
- package/dist/node-version-guard.d.ts +30 -0
- package/dist/node-version-guard.js +50 -0
- package/dist/node-version-guard.js.map +1 -0
- package/dist/operator-control-paths.d.ts +4 -0
- package/dist/operator-control-paths.js +24 -0
- package/dist/operator-control-paths.js.map +1 -0
- package/dist/outbound-handlers.d.ts +2 -0
- package/dist/outbound-handlers.js +9 -2
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +5 -5
- package/dist/outbound-schemas.js +1 -1
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/package-preimage.d.ts +26 -0
- package/dist/package-preimage.js +96 -0
- package/dist/package-preimage.js.map +1 -0
- package/dist/profile-control.js +4 -20
- package/dist/profile-control.js.map +1 -1
- package/dist/public-web-gateway.d.ts +18 -0
- package/dist/public-web-gateway.js +141 -0
- package/dist/public-web-gateway.js.map +1 -0
- package/dist/public-web-link.d.ts +53 -0
- package/dist/public-web-link.js +175 -0
- package/dist/public-web-link.js.map +1 -0
- package/dist/quickstart-api.d.ts +8 -1
- package/dist/quickstart-api.js +86 -48
- package/dist/quickstart-api.js.map +1 -1
- package/dist/quickstart.d.ts +1 -0
- package/dist/quickstart.js +16 -6
- package/dist/quickstart.js.map +1 -1
- package/dist/restart-guard.d.ts +52 -0
- package/dist/restart-guard.js +109 -0
- package/dist/restart-guard.js.map +1 -0
- package/dist/scheduler/db.d.ts +7 -1
- package/dist/scheduler/db.js +44 -2
- package/dist/scheduler/db.js.map +1 -1
- package/dist/scheduler/index.d.ts +1 -1
- package/dist/scheduler/retry-label.d.ts +11 -0
- package/dist/scheduler/retry-label.js +24 -0
- package/dist/scheduler/retry-label.js.map +1 -0
- package/dist/scheduler/scheduler.d.ts +55 -2
- package/dist/scheduler/scheduler.js +220 -8
- package/dist/scheduler/scheduler.js.map +1 -1
- package/dist/scheduler/types.d.ts +22 -0
- package/dist/scheduler/types.js.map +1 -1
- package/dist/secret-store.d.ts +5 -0
- package/dist/secret-store.js +20 -0
- package/dist/secret-store.js.map +1 -1
- package/dist/service-activation.d.ts +152 -0
- package/dist/service-activation.js +407 -0
- package/dist/service-activation.js.map +1 -0
- package/dist/service-installer.d.ts +63 -1
- package/dist/service-installer.js +141 -16
- package/dist/service-installer.js.map +1 -1
- package/dist/service-plan.d.ts +65 -0
- package/dist/service-plan.js +108 -0
- package/dist/service-plan.js.map +1 -0
- package/dist/service-restart-selection.d.ts +6 -5
- package/dist/service-restart-selection.js +6 -5
- package/dist/service-restart-selection.js.map +1 -1
- package/dist/settings-api.d.ts +10 -2
- package/dist/settings-api.js +216 -72
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-baseline.d.ts +20 -0
- package/dist/settings-baseline.js +104 -0
- package/dist/settings-baseline.js.map +1 -0
- package/dist/settings-change.d.ts +21 -0
- package/dist/settings-change.js +161 -0
- package/dist/settings-change.js.map +1 -0
- package/dist/settings-confirmation.d.ts +105 -0
- package/dist/settings-confirmation.js +232 -0
- package/dist/settings-confirmation.js.map +1 -0
- package/dist/settings-control.d.ts +41 -0
- package/dist/settings-control.js +294 -0
- package/dist/settings-control.js.map +1 -0
- package/dist/settings-effect.d.ts +24 -0
- package/dist/settings-effect.js +169 -0
- package/dist/settings-effect.js.map +1 -0
- package/dist/settings-http-confirmation.d.ts +29 -0
- package/dist/settings-http-confirmation.js +123 -0
- package/dist/settings-http-confirmation.js.map +1 -0
- package/dist/settings-instance-patch.d.ts +4 -0
- package/dist/settings-instance-patch.js +26 -0
- package/dist/settings-instance-patch.js.map +1 -0
- package/dist/settings-request-capability.d.ts +16 -0
- package/dist/settings-request-capability.js +32 -0
- package/dist/settings-request-capability.js.map +1 -0
- package/dist/settings-transaction.d.ts +65 -0
- package/dist/settings-transaction.js +223 -0
- package/dist/settings-transaction.js.map +1 -0
- package/dist/setup-auth.d.ts +10 -18
- package/dist/setup-auth.js +14 -38
- package/dist/setup-auth.js.map +1 -1
- package/dist/setup-form.d.ts +1 -1
- package/dist/setup-form.js +75 -18
- package/dist/setup-form.js.map +1 -1
- package/dist/setup-guide.d.ts +13 -0
- package/dist/setup-guide.js +25 -0
- package/dist/setup-guide.js.map +1 -0
- package/dist/setup-host.d.ts +16 -0
- package/dist/setup-host.js +199 -35
- package/dist/setup-host.js.map +1 -1
- package/dist/setup-wizard.js +5 -1
- package/dist/setup-wizard.js.map +1 -1
- package/dist/slash-authz.d.ts +17 -3
- package/dist/slash-authz.js +5 -0
- package/dist/slash-authz.js.map +1 -1
- package/dist/spawn-gate.js +3 -3
- package/dist/spawn-gate.js.map +1 -1
- package/dist/sqlite-open-errors.d.ts +12 -0
- package/dist/sqlite-open-errors.js +13 -0
- package/dist/sqlite-open-errors.js.map +1 -0
- package/dist/statusline-watcher.d.ts +5 -0
- package/dist/statusline-watcher.js +2 -0
- package/dist/statusline-watcher.js.map +1 -1
- package/dist/steer-capability.d.ts +6 -0
- package/dist/steer-capability.js +8 -0
- package/dist/steer-capability.js.map +1 -1
- package/dist/sync-work-attribution.d.ts +14 -0
- package/dist/sync-work-attribution.js +43 -8
- package/dist/sync-work-attribution.js.map +1 -1
- package/dist/tips.js +10 -5
- package/dist/tips.js.map +1 -1
- package/dist/tmux-control.d.ts +57 -5
- package/dist/tmux-control.js +379 -61
- package/dist/tmux-control.js.map +1 -1
- package/dist/tmux-manager.d.ts +20 -6
- package/dist/tmux-manager.js +90 -47
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tmux-read.d.ts +59 -0
- package/dist/tmux-read.js +213 -0
- package/dist/tmux-read.js.map +1 -0
- package/dist/topic-commands.d.ts +21 -10
- package/dist/topic-commands.js +205 -63
- package/dist/topic-commands.js.map +1 -1
- package/dist/transcript-delta-reader.js +2 -1
- package/dist/transcript-delta-reader.js.map +1 -1
- package/dist/tunnel/cloudflared-install.d.ts +2 -0
- package/dist/tunnel/cloudflared-install.js +1 -1
- package/dist/tunnel/cloudflared-install.js.map +1 -1
- package/dist/tunnel/purpose-lane.d.ts +14 -0
- package/dist/tunnel/purpose-lane.js +43 -0
- package/dist/tunnel/purpose-lane.js.map +1 -0
- package/dist/turn-reply-guard.d.ts +2 -0
- package/dist/turn-reply-guard.js +10 -1
- package/dist/turn-reply-guard.js.map +1 -1
- package/dist/types.d.ts +33 -0
- package/dist/ui/app.html +18 -0
- package/dist/ui/chat-commands.js +43 -0
- package/dist/ui/chat-render.js +478 -0
- package/dist/ui/chat-store.js +318 -0
- package/dist/ui/chat-strings.js +89 -0
- package/dist/ui/chat-thread.js +246 -0
- package/dist/ui/chat-tour.js +116 -0
- package/dist/ui/fleet-cache.js +168 -0
- package/dist/ui/fleet-org.js +142 -0
- package/dist/ui/panel-chat.js +504 -0
- package/dist/ui/panel-fleet.js +427 -0
- package/dist/ui/panel-needs.js +202 -0
- package/dist/ui/panel-settings.js +754 -0
- package/dist/ui/preview-panel.js +202 -0
- package/dist/ui/preview.js +270 -0
- package/dist/ui/settings-apply.js +239 -0
- package/dist/ui/settings-confirm.js +186 -0
- package/dist/ui/settings-dialogs.js +546 -0
- package/dist/ui/settings-model.js +277 -0
- package/dist/ui/settings-strings.js +654 -0
- package/dist/ui/settings-wizard.js +140 -0
- package/dist/ui/shared/agend-auth.js +93 -0
- package/dist/ui/shared/app-ctx.js +80 -0
- package/dist/ui/shared/app-html.js +9 -0
- package/dist/ui/shared/app-i18n.js +95 -0
- package/dist/ui/shared/app-nav.js +73 -0
- package/dist/ui/shared/app-needs.js +114 -0
- package/dist/ui/shared/app-route.js +73 -0
- package/dist/ui/shared/app-session.js +66 -0
- package/dist/ui/shared/app-shell.js +346 -0
- package/dist/ui/shared/app-store.js +51 -0
- package/dist/ui/shared/app-stream.js +201 -0
- package/dist/ui/shared/app.css +820 -0
- package/dist/ui/shared/app.js +88 -0
- package/dist/ui/shared/fonts/OFL.txt +92 -0
- package/dist/ui/shared/fonts/README.md +21 -0
- package/dist/ui/shared/fonts/inter.woff2 +0 -0
- package/dist/ui/shared/htm.module.js +1 -0
- package/dist/ui/shared/panel-view.js +655 -0
- package/dist/ui/shared/preact-hooks.module.js +2 -0
- package/dist/ui/shared/preact.module.js +2 -0
- package/dist/ui/shared/signin.js +142 -0
- package/dist/ui/shared/theme.js +29 -0
- package/dist/ui/shared/tokens.css +153 -0
- package/dist/ui/shared/ui-confirm.js +43 -0
- package/dist/ui/shared/ui-dialog.js +45 -0
- package/dist/ui/shared/ui-icons.js +63 -0
- package/dist/ui/shared/ui-menu.js +39 -0
- package/dist/ui/shared/ui-states.js +20 -0
- package/dist/ui/shared/ui-toast.js +18 -0
- package/dist/ui/shared/vendor/htm.LICENSE +202 -0
- package/dist/ui/shared/vendor/preact.LICENSE +21 -0
- package/dist/ui/shared/vendor/vendor.json +39 -0
- package/dist/ui/shared/view-strings.js +309 -0
- package/dist/ui/signin.html +52 -0
- package/dist/update-check.d.ts +6 -2
- package/dist/update-check.js +12 -3
- package/dist/update-check.js.map +1 -1
- package/dist/update-dispatch.d.ts +28 -0
- package/dist/update-dispatch.js +73 -0
- package/dist/update-dispatch.js.map +1 -0
- package/dist/update-install.d.ts +129 -0
- package/dist/update-install.js +262 -0
- package/dist/update-install.js.map +1 -0
- package/dist/upgrade-notices.d.ts +17 -0
- package/dist/upgrade-notices.js +93 -0
- package/dist/upgrade-notices.js.map +1 -0
- package/dist/usage/statusline-usage.d.ts +2 -0
- package/dist/usage/statusline-usage.js +14 -10
- package/dist/usage/statusline-usage.js.map +1 -1
- package/dist/view-api.d.ts +6 -1
- package/dist/view-api.js +62 -51
- package/dist/view-api.js.map +1 -1
- package/dist/web-api.d.ts +85 -14
- package/dist/web-api.js +557 -77
- package/dist/web-api.js.map +1 -1
- package/dist/web-auth.d.ts +71 -27
- package/dist/web-auth.js +169 -69
- package/dist/web-auth.js.map +1 -1
- package/dist/web-body.d.ts +3 -0
- package/dist/web-body.js +55 -0
- package/dist/web-body.js.map +1 -0
- package/dist/web-channel-echo.d.ts +9 -0
- package/dist/web-channel-echo.js +55 -0
- package/dist/web-channel-echo.js.map +1 -0
- package/dist/web-chat-history.d.ts +125 -0
- package/dist/web-chat-history.js +184 -0
- package/dist/web-chat-history.js.map +1 -0
- package/dist/web-commands.d.ts +77 -0
- package/dist/web-commands.js +81 -0
- package/dist/web-commands.js.map +1 -0
- package/dist/web-continuation.d.ts +7 -0
- package/dist/web-continuation.js +22 -0
- package/dist/web-continuation.js.map +1 -0
- package/dist/web-host-guard.d.ts +34 -0
- package/dist/web-host-guard.js +57 -1
- package/dist/web-host-guard.js.map +1 -1
- package/dist/web-login.d.ts +72 -0
- package/dist/web-login.js +132 -0
- package/dist/web-login.js.map +1 -0
- package/dist/web-org.d.ts +55 -0
- package/dist/web-org.js +67 -0
- package/dist/web-org.js.map +1 -0
- package/dist/web-preview.d.ts +77 -0
- package/dist/web-preview.js +240 -0
- package/dist/web-preview.js.map +1 -0
- package/dist/web-request-context.d.ts +10 -0
- package/dist/web-request-context.js +13 -0
- package/dist/web-request-context.js.map +1 -0
- package/dist/web-session.d.ts +167 -0
- package/dist/web-session.js +389 -0
- package/dist/web-session.js.map +1 -0
- package/dist/web-shell-routes.d.ts +59 -0
- package/dist/web-shell-routes.js +96 -0
- package/dist/web-shell-routes.js.map +1 -0
- package/dist/web-upload.d.ts +183 -0
- package/dist/web-upload.js +468 -0
- package/dist/web-upload.js.map +1 -0
- package/dist/website-tips-renderer.d.ts +2 -2
- package/dist/website-tips-renderer.js +3 -3
- package/dist/website-tips-renderer.js.map +1 -1
- package/launcher/agend +110 -0
- package/launcher/agend-agent +110 -0
- package/launcher/agend-agent.cjs +4 -0
- package/launcher/agend.cjs +4 -0
- package/launcher/install-admission.cjs +105 -0
- package/launcher/launch.cjs +64 -0
- package/launcher/postinstall.cjs +114 -0
- package/launcher/run-in-process.cjs +13 -0
- package/launcher/runtime-platform.cjs +86 -0
- package/launcher/runtime-select.cjs +217 -0
- package/package.json +18 -7
- package/scripts/preinstall-guard.cjs +55 -0
- package/templates/launchd.plist.ejs +2 -2
- package/templates/systemd.service.ejs +1 -1
- package/dist/ui/dashboard.html +0 -774
- package/dist/ui/settings.html +0 -2165
- package/dist/ui/view.html +0 -1139
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1468: keeps each instance's cache ledger (cache-ledger.ts) up to date from its transcripts, off the fleet loop's
|
|
3
|
+
* critical path, and answers the analysis (cache-analysis.ts) from the ledgers alone.
|
|
4
|
+
*
|
|
5
|
+
* - Which files: a Claude Code instance's `<claude config>/projects/<project key of its working directory>/*.jsonl`
|
|
6
|
+
* (the main conversation; subagents write elsewhere); a Codex instance's rollouts under the shared sessions
|
|
7
|
+
* directory whose `session_meta` names its working directory. Only files touched in the last KEEP_DAYS.
|
|
8
|
+
* - How: passes of at most `passBytes` (scan-jsonl awaits every chunk), with a pause between passes, until every
|
|
9
|
+
* file is caught up; then again every `intervalMs` and when the panel asks. Where each file stopped is persisted
|
|
10
|
+
* with the ledger (`<instance dir>/cache-ledger.json`), so a restart resumes instead of re-reading.
|
|
11
|
+
* - Never: a vendor API call, a child process, a synchronous read of a transcript.
|
|
12
|
+
* A file that shrank or was replaced (another inode) is followed from its current end: its earlier turns are
|
|
13
|
+
* already counted, and counting them twice would be worse than missing a rewrite. The inode is checked on the
|
|
14
|
+
* descriptor actually read, not only on the listing. Two instances whose transcripts land in the same place (the same
|
|
15
|
+
* working directory: one Claude project, one Codex cwd) cannot be told apart: neither is analysed, both say so.
|
|
16
|
+
*/
|
|
17
|
+
import { mkdir, open, readdir, readFile, realpath, rename, stat, writeFile } from "node:fs/promises";
|
|
18
|
+
import { dirname, join, resolve } from "node:path";
|
|
19
|
+
import { scanJsonl } from "./cache-scan.js";
|
|
20
|
+
import { addTurn, claudeLine, codexLine, emptyLedger, KEEP_DAYS, pruneLedger, reviveLedger } from "./cache-ledger.js";
|
|
21
|
+
import { analyzeLedger } from "./cache-analysis.js";
|
|
22
|
+
import { PRICES_CHECKED, PRICE_SOURCES } from "./cache-prices.js";
|
|
23
|
+
export const WINDOWS = { "24h": 86_400_000, "7d": 7 * 86_400_000, "30d": 30 * 86_400_000 };
|
|
24
|
+
const DAY = 86_400_000;
|
|
25
|
+
const META_MAX_BYTES = 256 * 1024; // session_meta carries the instructions (~22 KB in real rollouts)
|
|
26
|
+
const kindOf = (backend) => (backend === "claude-code" ? "claude" : backend === "codex" ? "codex" : null);
|
|
27
|
+
const sleep = (ms) => new Promise((r) => { const h = setTimeout(r, ms); h.unref?.(); });
|
|
28
|
+
const dict = () => Object.create(null);
|
|
29
|
+
export class CacheService {
|
|
30
|
+
o;
|
|
31
|
+
ledgers = new Map();
|
|
32
|
+
dirty = new Set();
|
|
33
|
+
/** Rollout path → the inode its session_meta was read from, and the cwd it names (null: not a session_meta). */
|
|
34
|
+
meta = null;
|
|
35
|
+
metaDirty = false;
|
|
36
|
+
running = null;
|
|
37
|
+
timer = null;
|
|
38
|
+
stopped = false;
|
|
39
|
+
pending = { bytes: 0, files: 0 };
|
|
40
|
+
caughtUp = false;
|
|
41
|
+
now;
|
|
42
|
+
constructor(o) {
|
|
43
|
+
this.o = o;
|
|
44
|
+
this.now = o.now ?? Date.now;
|
|
45
|
+
}
|
|
46
|
+
/** Catch up now (joins a catch-up already running). */
|
|
47
|
+
kick() {
|
|
48
|
+
if (this.stopped)
|
|
49
|
+
return Promise.resolve();
|
|
50
|
+
return this.running ??= this.catchUp().catch((err) => { this.o.log?.("warn", "cache analysis: a pass failed", { err: String(err) }); })
|
|
51
|
+
.finally(() => { this.running = null; });
|
|
52
|
+
}
|
|
53
|
+
/** Keep up on a timer from now on (the first report starts it). */
|
|
54
|
+
start() {
|
|
55
|
+
if (this.timer || this.stopped)
|
|
56
|
+
return;
|
|
57
|
+
this.timer = setInterval(() => { void this.kick(); }, this.o.intervalMs ?? 10 * 60_000);
|
|
58
|
+
this.timer.unref?.();
|
|
59
|
+
}
|
|
60
|
+
stop() {
|
|
61
|
+
this.stopped = true;
|
|
62
|
+
if (this.timer)
|
|
63
|
+
clearInterval(this.timer);
|
|
64
|
+
this.timer = null;
|
|
65
|
+
}
|
|
66
|
+
scanning() {
|
|
67
|
+
return { active: this.running !== null, caughtUp: this.caughtUp, pendingBytes: this.pending.bytes, pendingFiles: this.pending.files };
|
|
68
|
+
}
|
|
69
|
+
async catchUp() {
|
|
70
|
+
for (;;) {
|
|
71
|
+
const left = await this.pass();
|
|
72
|
+
if (left === 0)
|
|
73
|
+
this.caughtUp = true;
|
|
74
|
+
if (this.stopped || left === 0)
|
|
75
|
+
return;
|
|
76
|
+
await sleep(this.o.pauseMs ?? 25);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async ledgerFor(inst) {
|
|
80
|
+
let l = this.ledgers.get(inst.name);
|
|
81
|
+
if (l)
|
|
82
|
+
return l;
|
|
83
|
+
try {
|
|
84
|
+
l = reviveLedger(JSON.parse(await readFile(inst.ledgerPath, "utf8")));
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
l = emptyLedger();
|
|
88
|
+
}
|
|
89
|
+
// Another pass may have loaded it meanwhile.
|
|
90
|
+
const again = this.ledgers.get(inst.name);
|
|
91
|
+
if (again)
|
|
92
|
+
return again;
|
|
93
|
+
this.ledgers.set(inst.name, l);
|
|
94
|
+
return l;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* The instances whose transcripts land where another's do — the same Claude project (working directory), the
|
|
98
|
+
* same Codex cwd — mapped to the others. They are not read: nothing in a transcript says which one wrote it.
|
|
99
|
+
*/
|
|
100
|
+
async shared(insts) {
|
|
101
|
+
const groups = new Map();
|
|
102
|
+
for (const i of insts) {
|
|
103
|
+
const kind = kindOf(i.backend);
|
|
104
|
+
if (!kind)
|
|
105
|
+
continue;
|
|
106
|
+
const keys = kind === "claude" ? [`claude|${this.o.claudeKey(i.workingDirectory)}`] : (await cwdKeys(i.workingDirectory)).map((k) => `codex|${k}`);
|
|
107
|
+
for (const k of keys)
|
|
108
|
+
groups.set(k, [...(groups.get(k) ?? []), i.name]);
|
|
109
|
+
}
|
|
110
|
+
const out = new Map();
|
|
111
|
+
for (const names of groups.values()) {
|
|
112
|
+
const unique = [...new Set(names)];
|
|
113
|
+
if (unique.length < 2)
|
|
114
|
+
continue;
|
|
115
|
+
for (const n of unique)
|
|
116
|
+
out.set(n, [...new Set([...(out.get(n) ?? []), ...unique.filter((m) => m !== n)])]);
|
|
117
|
+
}
|
|
118
|
+
return out;
|
|
119
|
+
}
|
|
120
|
+
passing = Promise.resolve();
|
|
121
|
+
/**
|
|
122
|
+
* One bounded pass over every instance's files. Returns the bytes still behind afterwards. Passes never overlap
|
|
123
|
+
* (two reading one file from the same cursor would count it twice): a pass asked for during another runs after it.
|
|
124
|
+
*/
|
|
125
|
+
pass() {
|
|
126
|
+
const run = this.passing.then(() => this.passOnce());
|
|
127
|
+
this.passing = run.catch(() => { });
|
|
128
|
+
return run;
|
|
129
|
+
}
|
|
130
|
+
async passOnce() {
|
|
131
|
+
const cutoff = this.now() - KEEP_DAYS * DAY;
|
|
132
|
+
let budget = this.o.passBytes ?? 16 * 1024 * 1024;
|
|
133
|
+
let behindBytes = 0, behindFiles = 0;
|
|
134
|
+
const insts = this.o.instances();
|
|
135
|
+
const shared = await this.shared(insts);
|
|
136
|
+
const codex = await this.codexFilesByInstance(insts.filter((i) => !shared.has(i.name)), cutoff);
|
|
137
|
+
for (const inst of insts) {
|
|
138
|
+
if (this.stopped)
|
|
139
|
+
break;
|
|
140
|
+
const kind = kindOf(inst.backend);
|
|
141
|
+
if (!kind || shared.has(inst.name))
|
|
142
|
+
continue;
|
|
143
|
+
const ledger = await this.ledgerFor(inst);
|
|
144
|
+
const files = kind === "claude" ? await this.claudeFiles(inst, cutoff) : codex.get(inst.name) ?? [];
|
|
145
|
+
const listed = new Set(files.map((f) => f.path));
|
|
146
|
+
for (const path of Object.keys(ledger.files))
|
|
147
|
+
if (!listed.has(path)) {
|
|
148
|
+
delete ledger.files[path];
|
|
149
|
+
this.dirty.add(inst.name);
|
|
150
|
+
}
|
|
151
|
+
for (const f of files) {
|
|
152
|
+
let cur = ledger.files[f.path];
|
|
153
|
+
if (!cur) {
|
|
154
|
+
cur = ledger.files[f.path] = { kind, ino: f.ino, offset: 0 };
|
|
155
|
+
this.dirty.add(inst.name);
|
|
156
|
+
}
|
|
157
|
+
else if (cur.ino !== f.ino || f.size < cur.offset) {
|
|
158
|
+
cur = this.followFromEnd(ledger, f.path, cur, f.ino, f.size);
|
|
159
|
+
this.dirty.add(inst.name);
|
|
160
|
+
}
|
|
161
|
+
if (cur.offset >= f.size)
|
|
162
|
+
continue;
|
|
163
|
+
// Only an unfinished line was left, and the file has not grown since: nothing new to read.
|
|
164
|
+
if (cur.stalled === f.size)
|
|
165
|
+
continue;
|
|
166
|
+
if (budget <= 0) {
|
|
167
|
+
behindBytes += f.size - cur.offset;
|
|
168
|
+
behindFiles++;
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
const done = await this.read(ledger, cur, f.path, budget, cutoff);
|
|
172
|
+
this.dirty.add(inst.name);
|
|
173
|
+
budget -= done.read;
|
|
174
|
+
if (done.behind > 0) {
|
|
175
|
+
behindBytes += done.behind;
|
|
176
|
+
behindFiles++;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
pruneLedger(ledger, cutoff);
|
|
180
|
+
}
|
|
181
|
+
this.pending = { bytes: behindBytes, files: behindFiles };
|
|
182
|
+
await this.save(insts);
|
|
183
|
+
return behindBytes;
|
|
184
|
+
}
|
|
185
|
+
/** A file that is not the one the cursor read (another inode, or shorter): keep the session's end, start at its end. */
|
|
186
|
+
followFromEnd(ledger, path, cur, ino, size) {
|
|
187
|
+
const next = { kind: cur.kind, ino, offset: size };
|
|
188
|
+
if (cur.last) {
|
|
189
|
+
next.last = cur.last;
|
|
190
|
+
next.first = cur.first;
|
|
191
|
+
}
|
|
192
|
+
if (cur.ttl !== undefined)
|
|
193
|
+
next.ttl = cur.ttl;
|
|
194
|
+
return ledger.files[path] = next;
|
|
195
|
+
}
|
|
196
|
+
async read(ledger, cur, path, budget, cutoff) {
|
|
197
|
+
try {
|
|
198
|
+
const res = await scanJsonl(path, cur.offset, { maxBytes: budget, ino: cur.ino }, (line) => {
|
|
199
|
+
const turn = cur.kind === "claude" ? claudeLine(line, cur) : codexLine(line, cur);
|
|
200
|
+
if (turn)
|
|
201
|
+
addTurn(ledger, cur, turn, cutoff);
|
|
202
|
+
});
|
|
203
|
+
if (res.replaced) {
|
|
204
|
+
this.followFromEnd(ledger, path, cur, res.ino, res.size);
|
|
205
|
+
return { read: 0, behind: 0 };
|
|
206
|
+
}
|
|
207
|
+
cur.offset = res.offset;
|
|
208
|
+
// Read to the end with an unfinished line left: the CLI is still writing it. Not behind, and not read again
|
|
209
|
+
// until the file grows.
|
|
210
|
+
if (res.done && res.offset < res.size)
|
|
211
|
+
cur.stalled = res.size;
|
|
212
|
+
else
|
|
213
|
+
delete cur.stalled;
|
|
214
|
+
return { read: Math.max(res.read, 1), behind: res.done ? 0 : res.size - res.offset };
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
this.o.log?.("debug", "cache analysis: could not read a transcript", { path, err: String(err) });
|
|
218
|
+
return { read: 1, behind: 0 };
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
async claudeFiles(inst, cutoff) {
|
|
222
|
+
const dir = join(this.o.claudeProjectsDir(), this.o.claudeKey(inst.workingDirectory));
|
|
223
|
+
let names;
|
|
224
|
+
try {
|
|
225
|
+
names = await readdir(dir);
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
return [];
|
|
229
|
+
}
|
|
230
|
+
const out = [];
|
|
231
|
+
for (const n of names) {
|
|
232
|
+
if (!n.endsWith(".jsonl"))
|
|
233
|
+
continue;
|
|
234
|
+
const path = join(dir, n);
|
|
235
|
+
try {
|
|
236
|
+
const st = await stat(path);
|
|
237
|
+
if (st.isFile() && st.mtimeMs >= cutoff)
|
|
238
|
+
out.push({ path, ino: st.ino, size: st.size });
|
|
239
|
+
}
|
|
240
|
+
catch { /* gone */ }
|
|
241
|
+
}
|
|
242
|
+
return out;
|
|
243
|
+
}
|
|
244
|
+
/** Codex rollouts of the last KEEP_DAYS, by the instance whose working directory their session_meta names. */
|
|
245
|
+
async codexFilesByInstance(insts, cutoff) {
|
|
246
|
+
const out = new Map();
|
|
247
|
+
const codexInsts = insts.filter((i) => kindOf(i.backend) === "codex");
|
|
248
|
+
if (!codexInsts.length)
|
|
249
|
+
return out;
|
|
250
|
+
const byCwd = new Map();
|
|
251
|
+
for (const i of codexInsts)
|
|
252
|
+
for (const k of await cwdKeys(i.workingDirectory))
|
|
253
|
+
byCwd.set(k, i.name);
|
|
254
|
+
if (!this.meta) {
|
|
255
|
+
this.meta = dict();
|
|
256
|
+
try {
|
|
257
|
+
for (const [p, v] of Object.entries(JSON.parse(await readFile(this.o.metaPath, "utf8")))) {
|
|
258
|
+
const e = v;
|
|
259
|
+
if (e && typeof e.ino === "number" && (typeof e.cwd === "string" || e.cwd === null))
|
|
260
|
+
this.meta[p] = { ino: e.ino, cwd: e.cwd };
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
catch { /* none yet */ }
|
|
264
|
+
}
|
|
265
|
+
let rollouts = [];
|
|
266
|
+
try {
|
|
267
|
+
rollouts = this.o.listRollouts(this.o.codexSessionsDir()).filter((r) => r.mtimeMs >= cutoff);
|
|
268
|
+
}
|
|
269
|
+
catch { /* no sessions yet */ }
|
|
270
|
+
const live = new Set();
|
|
271
|
+
for (const r of rollouts) {
|
|
272
|
+
live.add(r.path);
|
|
273
|
+
let st;
|
|
274
|
+
try {
|
|
275
|
+
st = await stat(r.path);
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
let m = this.meta[r.path];
|
|
281
|
+
// Read once per physical file; a first line still being written is read again next pass.
|
|
282
|
+
if (!m || m.ino !== st.ino) {
|
|
283
|
+
const read = await rolloutMeta(r.path);
|
|
284
|
+
if (read) {
|
|
285
|
+
m = this.meta[r.path] = read;
|
|
286
|
+
this.metaDirty = true;
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
delete this.meta[r.path];
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
const name = m.cwd ? byCwd.get(resolve(m.cwd)) : undefined;
|
|
294
|
+
// The meta belongs to the inode it was read from; a file replaced since is read again next pass.
|
|
295
|
+
if (!name || m.ino !== st.ino)
|
|
296
|
+
continue;
|
|
297
|
+
const list = out.get(name) ?? [];
|
|
298
|
+
list.push({ path: r.path, ino: st.ino, size: st.size });
|
|
299
|
+
out.set(name, list);
|
|
300
|
+
}
|
|
301
|
+
for (const p of Object.keys(this.meta))
|
|
302
|
+
if (!live.has(p)) {
|
|
303
|
+
delete this.meta[p];
|
|
304
|
+
this.metaDirty = true;
|
|
305
|
+
}
|
|
306
|
+
return out;
|
|
307
|
+
}
|
|
308
|
+
/** Write what changed; whatever fails to write stays dirty and is written by a later pass. */
|
|
309
|
+
async save(insts) {
|
|
310
|
+
const byName = new Map(insts.map((i) => [i.name, i]));
|
|
311
|
+
for (const name of [...this.dirty]) {
|
|
312
|
+
const inst = byName.get(name), l = this.ledgers.get(name);
|
|
313
|
+
if (!inst || !l) {
|
|
314
|
+
this.dirty.delete(name);
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
if (await writeAtomic(inst.ledgerPath, JSON.stringify(l)))
|
|
318
|
+
this.dirty.delete(name);
|
|
319
|
+
}
|
|
320
|
+
if (this.metaDirty && this.meta && await writeAtomic(this.o.metaPath, JSON.stringify(this.meta)))
|
|
321
|
+
this.metaDirty = false;
|
|
322
|
+
}
|
|
323
|
+
/** The analysis for a window, from the ledgers as they are now (a catch-up is started, not waited for). */
|
|
324
|
+
async report(window) {
|
|
325
|
+
this.start();
|
|
326
|
+
void this.kick();
|
|
327
|
+
const to = this.now(), from = to - WINDOWS[window];
|
|
328
|
+
const instances = [];
|
|
329
|
+
const fleet = { expiryCost: 0, saving: 0, recommended: 0, analysed: 0, priced: true };
|
|
330
|
+
const insts = this.o.instances();
|
|
331
|
+
const shared = await this.shared(insts);
|
|
332
|
+
for (const inst of insts) {
|
|
333
|
+
const kind = kindOf(inst.backend);
|
|
334
|
+
if (!kind) {
|
|
335
|
+
instances.push({ name: inst.name, backend: inst.backend, status: inst.backend.startsWith("kiro") ? "credit_billed" : "unsupported" });
|
|
336
|
+
continue;
|
|
337
|
+
}
|
|
338
|
+
const others = shared.get(inst.name);
|
|
339
|
+
if (others) {
|
|
340
|
+
instances.push({ name: inst.name, backend: inst.backend, status: "shared", with: others });
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
343
|
+
const ledger = await this.ledgerFor(inst);
|
|
344
|
+
const analysis = analyzeLedger(ledger, { backend: kind, from, to });
|
|
345
|
+
if (!analysis.requests && !analysis.sim.tailPings) {
|
|
346
|
+
instances.push({ name: inst.name, backend: inst.backend, status: "no_data" });
|
|
347
|
+
continue;
|
|
348
|
+
}
|
|
349
|
+
instances.push({ name: inst.name, backend: inst.backend, status: "ok", analysis });
|
|
350
|
+
fleet.analysed++;
|
|
351
|
+
if (!analysis.priced) {
|
|
352
|
+
fleet.priced = false;
|
|
353
|
+
continue;
|
|
354
|
+
}
|
|
355
|
+
fleet.expiryCost += analysis.sim.expiryCost;
|
|
356
|
+
if (analysis.recommendation.on) {
|
|
357
|
+
fleet.recommended++;
|
|
358
|
+
fleet.saving += analysis.sim.net;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
return { window, from, to, pricesChecked: PRICES_CHECKED, priceSources: PRICE_SOURCES, scanning: this.scanning(), fleet, instances };
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
/** A working directory as configured and as the filesystem resolves it (a rollout records either). */
|
|
365
|
+
async function cwdKeys(dir) {
|
|
366
|
+
const keys = [resolve(dir)];
|
|
367
|
+
try {
|
|
368
|
+
const real = await realpath(dir);
|
|
369
|
+
if (real !== keys[0])
|
|
370
|
+
keys.push(real);
|
|
371
|
+
}
|
|
372
|
+
catch { /* missing: as configured */ }
|
|
373
|
+
return keys;
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* A rollout's session_meta, read with one bounded read through the descriptor whose inode it records. Null while the
|
|
377
|
+
* first line is not complete yet (the next pass reads it again); `cwd: null` for a complete first line that is not
|
|
378
|
+
* a session_meta.
|
|
379
|
+
*/
|
|
380
|
+
export async function rolloutMeta(path) {
|
|
381
|
+
let fh;
|
|
382
|
+
try {
|
|
383
|
+
fh = await open(path, "r");
|
|
384
|
+
const ino = (await fh.stat()).ino;
|
|
385
|
+
const buf = Buffer.alloc(META_MAX_BYTES);
|
|
386
|
+
const { bytesRead } = await fh.read(buf, 0, META_MAX_BYTES, 0);
|
|
387
|
+
const nl = buf.subarray(0, bytesRead).indexOf(10);
|
|
388
|
+
if (nl === -1)
|
|
389
|
+
return bytesRead >= META_MAX_BYTES ? { ino, cwd: null } : null;
|
|
390
|
+
try {
|
|
391
|
+
const d = JSON.parse(buf.toString("utf8", 0, nl));
|
|
392
|
+
return { ino, cwd: d.type === "session_meta" && typeof d.payload?.cwd === "string" ? d.payload.cwd : null };
|
|
393
|
+
}
|
|
394
|
+
catch {
|
|
395
|
+
return { ino, cwd: null };
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
catch {
|
|
399
|
+
return null;
|
|
400
|
+
}
|
|
401
|
+
finally {
|
|
402
|
+
await fh?.close().catch(() => { });
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
async function writeAtomic(path, text) {
|
|
406
|
+
const tmp = `${path}.${process.pid}.tmp`;
|
|
407
|
+
try {
|
|
408
|
+
await mkdir(dirname(path), { recursive: true });
|
|
409
|
+
await writeFile(tmp, text);
|
|
410
|
+
await rename(tmp, path);
|
|
411
|
+
return true;
|
|
412
|
+
}
|
|
413
|
+
catch {
|
|
414
|
+
return false;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
//# sourceMappingURL=cache-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-service.js","sourceRoot":"","sources":["../src/cache-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -179,6 +179,7 @@ export declare class DiscordAdapter extends EventEmitter implements ChannelAdapt
|
|
|
179
179
|
* chars, with followUp embeds for anything beyond that.
|
|
180
180
|
*/
|
|
181
181
|
private _editReplyLong;
|
|
182
|
+
getBotUserId(): string | undefined;
|
|
182
183
|
/** Private delivery: a DM to the user (fails if the user disallows DMs from this server). */
|
|
183
184
|
sendDirect(userId: string, text: string, opts?: SendOpts): Promise<SentMessage>;
|
|
184
185
|
sendText(chatId: string, text: string, opts?: SendOpts): Promise<SentMessage>;
|
|
@@ -588,11 +588,15 @@ export class DiscordAdapter extends EventEmitter {
|
|
|
588
588
|
}
|
|
589
589
|
this.emitFromClient(client, generation, "callback_query", {
|
|
590
590
|
callbackData: interaction.customId,
|
|
591
|
-
chatId: this.guildId,
|
|
592
|
-
threadId: interaction.channelId,
|
|
591
|
+
chatId: interaction.guildId ? this.guildId : interaction.channelId,
|
|
592
|
+
threadId: interaction.guildId ? interaction.channelId : undefined,
|
|
593
593
|
messageId: interaction.message.id,
|
|
594
594
|
userId: interaction.user.id,
|
|
595
595
|
ack: privateNotice(interaction, this.id),
|
|
596
|
+
...(interaction.customId.startsWith("dashboard:") ? { respondPrivate: async (text, choices) => {
|
|
597
|
+
const sent = await interaction.followUp({ content: text, flags: MessageFlags.Ephemeral | MessageFlags.SuppressEmbeds, allowedMentions: { parse: [] }, components: choices ? buttonRows(choices) : [] });
|
|
598
|
+
return { chatId: interaction.channelId, messageId: sent.id };
|
|
599
|
+
} } : {}),
|
|
596
600
|
});
|
|
597
601
|
return;
|
|
598
602
|
}
|
|
@@ -617,11 +621,15 @@ export class DiscordAdapter extends EventEmitter {
|
|
|
617
621
|
return;
|
|
618
622
|
this.emitFromClient(client, generation, "callback_query", {
|
|
619
623
|
callbackData,
|
|
620
|
-
chatId: this.guildId,
|
|
621
|
-
threadId: interaction.channelId,
|
|
624
|
+
chatId: interaction.guildId ? this.guildId : interaction.channelId,
|
|
625
|
+
threadId: interaction.guildId ? interaction.channelId : undefined,
|
|
622
626
|
messageId: interaction.message.id,
|
|
623
627
|
userId: interaction.user.id,
|
|
624
628
|
ack: privateNotice(interaction, this.id),
|
|
629
|
+
...(callbackData.startsWith("dashboard:") ? { respondPrivate: async (text, choices) => {
|
|
630
|
+
const sent = await interaction.followUp({ content: text, flags: MessageFlags.Ephemeral | MessageFlags.SuppressEmbeds, allowedMentions: { parse: [] }, components: choices ? buttonRows(choices) : [] });
|
|
631
|
+
return { chatId: interaction.channelId, messageId: sent.id };
|
|
632
|
+
} } : {}),
|
|
625
633
|
});
|
|
626
634
|
return;
|
|
627
635
|
}
|
|
@@ -697,6 +705,10 @@ export class DiscordAdapter extends EventEmitter {
|
|
|
697
705
|
}
|
|
698
706
|
catch { /* interaction may already be gone */ }
|
|
699
707
|
},
|
|
708
|
+
respondButtons: async (text, choices) => {
|
|
709
|
+
const sent = await interaction.editReply({ content: text, components: buttonRows(choices), allowedMentions: { parse: [] } });
|
|
710
|
+
return sent.id;
|
|
711
|
+
},
|
|
700
712
|
respondChoices: async (text, choices) => {
|
|
701
713
|
const select = new StringSelectMenuBuilder()
|
|
702
714
|
.setCustomId(CLASSIC_START_BACKEND_SELECT_ID)
|
|
@@ -1056,8 +1068,7 @@ export class DiscordAdapter extends EventEmitter {
|
|
|
1056
1068
|
this.generationNonReadySince = 0;
|
|
1057
1069
|
this.shardNonReadySince.clear();
|
|
1058
1070
|
try {
|
|
1059
|
-
// Register
|
|
1060
|
-
// a guild with the primary — only the primary owns the guild's commands).
|
|
1071
|
+
// Register each bot application's own menu, including siblings in the same guild.
|
|
1061
1072
|
if (this.registerCommands)
|
|
1062
1073
|
try {
|
|
1063
1074
|
const registered = await client.application?.commands.set([
|
|
@@ -1086,7 +1097,14 @@ export class DiscordAdapter extends EventEmitter {
|
|
|
1086
1097
|
},
|
|
1087
1098
|
{ name: "status", description: slashLock("status") + t("slash.status") },
|
|
1088
1099
|
{ name: "sysinfo", description: slashLock("sysinfo") + t("slash.sysinfo") },
|
|
1089
|
-
{
|
|
1100
|
+
{
|
|
1101
|
+
name: "dashboard", description: slashLock("dashboard") + t("slash.dashboard"),
|
|
1102
|
+
options: [{
|
|
1103
|
+
name: "action", description: t("slash.option.dashboard_action"),
|
|
1104
|
+
type: ApplicationCommandOptionType.String, required: false,
|
|
1105
|
+
choices: [{ name: "revoke", value: "revoke" }],
|
|
1106
|
+
}],
|
|
1107
|
+
},
|
|
1090
1108
|
{ name: "ctx", description: slashLock("ctx") + t("slash.ctx") },
|
|
1091
1109
|
{
|
|
1092
1110
|
name: "restart", description: slashLock("restart") + t("slash.restart"),
|
|
@@ -1268,11 +1286,12 @@ export class DiscordAdapter extends EventEmitter {
|
|
|
1268
1286
|
}
|
|
1269
1287
|
return message.id;
|
|
1270
1288
|
}
|
|
1289
|
+
getBotUserId() { return this.client.user?.id; }
|
|
1271
1290
|
/** Private delivery: a DM to the user (fails if the user disallows DMs from this server). */
|
|
1272
1291
|
async sendDirect(userId, text, opts) {
|
|
1273
1292
|
const user = await this.client.users.fetch(userId);
|
|
1274
1293
|
const dm = await user.createDM();
|
|
1275
|
-
const sent = await dm.send(opts?.disablePreview ? {
|
|
1294
|
+
const sent = await dm.send({ content: text, ...(opts?.disablePreview ? { flags: MessageFlags.SuppressEmbeds } : {}), ...(opts?.choices ? { components: buttonRows(opts.choices) } : {}), allowedMentions: { parse: [] } });
|
|
1276
1295
|
return { messageId: sent.id, chatId: dm.id };
|
|
1277
1296
|
}
|
|
1278
1297
|
async sendText(chatId, text, opts) {
|
|
@@ -1287,8 +1306,8 @@ export class DiscordAdapter extends EventEmitter {
|
|
|
1287
1306
|
// so the reply tool could return success for a silently truncated message.
|
|
1288
1307
|
let first;
|
|
1289
1308
|
for (const chunk of chunks) {
|
|
1290
|
-
const sent = await channel.send(opts?.disablePreview
|
|
1291
|
-
? { content: chunk, flags: MessageFlags.SuppressEmbeds }
|
|
1309
|
+
const sent = await channel.send(opts?.disablePreview || opts?.allowedMentions
|
|
1310
|
+
? { content: chunk, ...(opts?.disablePreview ? { flags: MessageFlags.SuppressEmbeds } : {}), ...(opts?.allowedMentions ? { allowedMentions: opts.allowedMentions } : {}) }
|
|
1292
1311
|
: chunk);
|
|
1293
1312
|
first ??= sent;
|
|
1294
1313
|
}
|