@songsid/agend 2.3.2 → 2.3.3-beta.10
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 +2 -2
- package/dist/agent-cli.js +13 -112
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-endpoint.d.ts +0 -1
- package/dist/agent-endpoint.js +1 -9
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/agent-whats-new.d.ts +23 -5
- package/dist/agent-whats-new.js +58 -40
- package/dist/agent-whats-new.js.map +1 -1
- package/dist/auth-api.d.ts +0 -7
- package/dist/auth-api.js +1 -15
- package/dist/auth-api.js.map +1 -1
- package/dist/authority/authority-state.js +1 -1
- package/dist/authority/authority-state.js.map +1 -1
- package/dist/authority/web-authority.d.ts +9 -4
- package/dist/authority/web-authority.js +10 -5
- package/dist/authority/web-authority.js.map +1 -1
- package/dist/backend/antigravity.js +6 -1
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/claude-code.d.ts +20 -1
- package/dist/backend/claude-code.js +54 -29
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/claude-transcript-errors.d.ts +18 -0
- package/dist/backend/claude-transcript-errors.js +19 -0
- package/dist/backend/claude-transcript-errors.js.map +1 -0
- package/dist/backend/codex-session-lookup.d.ts +16 -3
- package/dist/backend/codex-session-lookup.js +45 -11
- package/dist/backend/codex-session-lookup.js.map +1 -1
- package/dist/backend/codex.d.ts +16 -0
- package/dist/backend/codex.js +184 -35
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/grok.js +58 -12
- package/dist/backend/grok.js.map +1 -1
- package/dist/backend/kiro-reconcile-store.js +8 -1
- package/dist/backend/kiro-reconcile-store.js.map +1 -1
- package/dist/backend/kiro.d.ts +0 -5
- package/dist/backend/kiro.js +2 -10
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/muse.js +2 -1
- package/dist/backend/muse.js.map +1 -1
- package/dist/backend/types.d.ts +53 -4
- package/dist/backend/types.js.map +1 -1
- package/dist/bundled-skills.d.ts +4 -6
- package/dist/bundled-skills.js +10 -14
- package/dist/bundled-skills.js.map +1 -1
- package/dist/channel/adapters/discord.js +60 -17
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/mcp-server.js +5 -5
- package/dist/channel/mcp-server.js.map +1 -1
- package/dist/channel/mcp-tools.d.ts +1 -3
- package/dist/channel/mcp-tools.js +4 -58
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/classic-channel-manager.d.ts +4 -1
- package/dist/classic-channel-manager.js +21 -7
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli.js +23 -6
- package/dist/cli.js.map +1 -1
- package/dist/config-history.d.ts +50 -0
- package/dist/config-history.js +263 -0
- package/dist/config-history.js.map +1 -0
- package/dist/config-validator.js +10 -8
- package/dist/config-validator.js.map +1 -1
- package/dist/config.d.ts +3 -0
- package/dist/config.js +11 -4
- package/dist/config.js.map +1 -1
- package/dist/cross-instance-envelope.d.ts +10 -5
- package/dist/cross-instance-envelope.js +20 -17
- package/dist/cross-instance-envelope.js.map +1 -1
- package/dist/daemon.d.ts +130 -64
- package/dist/daemon.js +603 -428
- package/dist/daemon.js.map +1 -1
- package/dist/daily-summary.d.ts +8 -1
- package/dist/daily-summary.js +8 -5
- package/dist/daily-summary.js.map +1 -1
- package/dist/dashboard-live.d.ts +1 -1
- package/dist/dashboard-live.js +3 -3
- package/dist/dashboard-live.js.map +1 -1
- package/dist/dashboard-permissions.d.ts +1 -1
- package/dist/dashboard-permissions.js +1 -3
- package/dist/dashboard-permissions.js.map +1 -1
- package/dist/delivery-outbox.d.ts +31 -22
- package/dist/delivery-outbox.js +119 -161
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/delivery-outbox.test.js +10 -25
- package/dist/delivery-outbox.test.js.map +1 -1
- package/dist/doctor.d.ts +4 -0
- package/dist/doctor.js +16 -1
- package/dist/doctor.js.map +1 -1
- package/dist/fleet-level-config.js +1 -1
- package/dist/fleet-level-config.js.map +1 -1
- package/dist/fleet-manager.d.ts +74 -66
- package/dist/fleet-manager.js +285 -414
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-process-handlers.d.ts +5 -0
- package/dist/fleet-process-handlers.js +21 -0
- package/dist/fleet-process-handlers.js.map +1 -1
- package/dist/fleet-service-owner.d.ts +11 -0
- package/dist/fleet-service-owner.js +3 -0
- package/dist/fleet-service-owner.js.map +1 -0
- package/dist/general-knowledge/skills/credential-profiles/SKILL.md +11 -1
- package/dist/general-knowledge/skills/delegation-playbook/SKILL.md +1 -1
- package/dist/general-knowledge/skills/fleet-restart/SKILL.md +1 -1
- package/dist/general-knowledge/skills/session-management/SKILL.md +7 -1
- package/dist/general-knowledge/skills/web-appearance/SKILL.md +13 -204
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +30 -68
- package/dist/instance-lifecycle.d.ts +19 -0
- package/dist/instance-lifecycle.js +73 -15
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instructions.js +6 -7
- package/dist/instructions.js.map +1 -1
- package/dist/kiro-reconcile.js +3 -3
- package/dist/kiro-reconcile.js.map +1 -1
- package/dist/locale.js +96 -58
- package/dist/locale.js.map +1 -1
- package/dist/log-service.js +1 -1
- package/dist/log-service.js.map +1 -1
- package/dist/needs-you-hub.d.ts +1 -0
- package/dist/needs-you-hub.js +6 -3
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you-live.d.ts +3 -1
- package/dist/needs-you-live.js +24 -2
- package/dist/needs-you-live.js.map +1 -1
- package/dist/needs-you.d.ts +13 -2
- package/dist/needs-you.js +11 -1
- package/dist/needs-you.js.map +1 -1
- package/dist/notify-socket.d.ts +10 -0
- package/dist/notify-socket.js +45 -0
- package/dist/notify-socket.js.map +1 -0
- package/dist/outbound-handlers.js +20 -8
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +0 -62
- package/dist/outbound-schemas.js +4 -43
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/parked-notices.d.ts +87 -0
- package/dist/parked-notices.js +194 -0
- package/dist/parked-notices.js.map +1 -0
- package/dist/public-link-progress.d.ts +5 -2
- package/dist/public-link-progress.js +4 -3
- package/dist/public-link-progress.js.map +1 -1
- package/dist/public-web-gateway.js +0 -9
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/public-web-link.d.ts +12 -0
- package/dist/public-web-link.js +29 -5
- package/dist/public-web-link.js.map +1 -1
- package/dist/quota-notice.d.ts +23 -0
- package/dist/quota-notice.js +22 -0
- package/dist/quota-notice.js.map +1 -0
- package/dist/scheduler/task-board.d.ts +17 -25
- package/dist/scheduler/task-board.js +29 -39
- package/dist/scheduler/task-board.js.map +1 -1
- package/dist/sd-notify.d.ts +23 -15
- package/dist/sd-notify.js +88 -29
- package/dist/sd-notify.js.map +1 -1
- package/dist/search/search-docs.d.ts +1 -1
- package/dist/search/search-docs.js +2 -2
- package/dist/search/search-docs.js.map +1 -1
- package/dist/settings-api.d.ts +16 -1
- package/dist/settings-api.js +56 -16
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-change.js +3 -1
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-confirmation.d.ts +17 -3
- package/dist/settings-confirmation.js +8 -5
- package/dist/settings-confirmation.js.map +1 -1
- package/dist/settings-effect.js +0 -2
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.js +31 -1
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/setup-wizard.d.ts +3 -0
- package/dist/setup-wizard.js +4 -2
- package/dist/setup-wizard.js.map +1 -1
- package/dist/task-board-waker.d.ts +43 -1
- package/dist/task-board-waker.js +121 -9
- package/dist/task-board-waker.js.map +1 -1
- package/dist/tmux-control.d.ts +1 -1
- package/dist/tmux-control.js +3 -2
- package/dist/tmux-control.js.map +1 -1
- package/dist/tmux-manager.js +18 -16
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tmux-read.d.ts +2 -0
- package/dist/tmux-read.js +7 -1
- package/dist/tmux-read.js.map +1 -1
- package/dist/tool-permissions.js +3 -10
- package/dist/tool-permissions.js.map +1 -1
- package/dist/topic-commands.d.ts +29 -7
- package/dist/topic-commands.js +97 -37
- package/dist/topic-commands.js.map +1 -1
- package/dist/transcript-monitor.d.ts +7 -0
- package/dist/transcript-monitor.js +48 -3
- package/dist/transcript-monitor.js.map +1 -1
- package/dist/tunnel/cloudflared.d.ts +5 -0
- package/dist/tunnel/cloudflared.js +32 -1
- package/dist/tunnel/cloudflared.js.map +1 -1
- package/dist/tunnel/named-diagnostics.d.ts +2 -1
- package/dist/tunnel/named-diagnostics.js +4 -1
- package/dist/tunnel/named-diagnostics.js.map +1 -1
- package/dist/tunnel/named-link-test.d.ts +90 -0
- package/dist/tunnel/named-link-test.js +270 -0
- package/dist/tunnel/named-link-test.js.map +1 -0
- package/dist/tunnel/purpose-lane.d.ts +3 -1
- package/dist/tunnel/purpose-lane.js +2 -0
- package/dist/tunnel/purpose-lane.js.map +1 -1
- package/dist/types.d.ts +9 -11
- package/dist/ui/chat-ambient.js +4 -4
- package/dist/ui/chat-commands.js +3 -2
- package/dist/ui/chat-store.js +4 -1
- package/dist/ui/chat-strings.js +12 -46
- package/dist/ui/chat-thread.js +51 -59
- package/dist/ui/fleet-office-skin.js +37 -14
- package/dist/ui/fleet-office.js +31 -7
- package/dist/ui/html-attachment.js +22 -8
- package/dist/ui/panel-chat.js +21 -50
- package/dist/ui/panel-log.js +2 -2
- package/dist/ui/panel-needs.js +11 -9
- package/dist/ui/panel-settings.js +5 -3
- package/dist/ui/preview-panel.js +12 -21
- package/dist/ui/preview.js +10 -3
- package/dist/ui/search-dialog.js +30 -14
- package/dist/ui/settings-appearance.js +3 -37
- package/dist/ui/settings-confirm.js +18 -0
- package/dist/ui/settings-guests.js +13 -4
- package/dist/ui/settings-learn.js +1 -1
- package/dist/ui/settings-mods.js +5 -12
- package/dist/ui/settings-named-test.js +144 -0
- package/dist/ui/settings-registry.js +0 -2
- package/dist/ui/settings-strings.js +16 -16
- package/dist/ui/settings-web-authority.js +4 -3
- package/dist/ui/shared/app-i18n.js +15 -4
- package/dist/ui/shared/app-needs.js +5 -1
- package/dist/ui/shared/app-prefs.js +17 -17
- package/dist/ui/shared/app-shell.js +47 -9
- package/dist/ui/shared/app-store.js +6 -2
- package/dist/ui/shared/app.css +33 -39
- package/dist/ui/shared/app.js +5 -4
- package/dist/ui/shared/instance-nav.js +9 -9
- package/dist/ui/shared/instance-switch.js +8 -2
- package/dist/ui/shared/panel-view.js +22 -8
- package/dist/ui/shared/view-strings.js +6 -0
- package/dist/ui/shared/web-authorize.js +35 -13
- package/dist/update-check.d.ts +13 -4
- package/dist/update-check.js +17 -4
- package/dist/update-check.js.map +1 -1
- package/dist/usage/usage-api.d.ts +3 -0
- package/dist/usage/usage-api.js +5 -1
- package/dist/usage/usage-api.js.map +1 -1
- package/dist/view-api.d.ts +2 -0
- package/dist/view-api.js +64 -0
- package/dist/view-api.js.map +1 -1
- package/dist/web-api.d.ts +9 -17
- package/dist/web-api.js +257 -371
- package/dist/web-api.js.map +1 -1
- package/dist/web-appearance-tools.d.ts +0 -2
- package/dist/web-appearance-tools.js +2 -5
- package/dist/web-appearance-tools.js.map +1 -1
- package/dist/web-appearance-view.d.ts +0 -6
- package/dist/web-appearance-view.js +0 -1
- package/dist/web-appearance-view.js.map +1 -1
- package/dist/web-appearance.d.ts +14 -7
- package/dist/web-appearance.js +5 -6
- package/dist/web-appearance.js.map +1 -1
- package/dist/web-asset-parts.d.ts +1 -17
- package/dist/web-asset-parts.js +1 -15
- package/dist/web-asset-parts.js.map +1 -1
- package/dist/web-auth.js +1 -7
- package/dist/web-auth.js.map +1 -1
- package/dist/web-chat-history.d.ts +3 -7
- package/dist/web-chat-history.js +10 -17
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-commands.d.ts +9 -1
- package/dist/web-commands.js +13 -0
- package/dist/web-commands.js.map +1 -1
- package/dist/web-experimental.d.ts +3 -8
- package/dist/web-experimental.js +9 -33
- package/dist/web-experimental.js.map +1 -1
- package/dist/web-guest-access.d.ts +40 -2
- package/dist/web-guest-access.js +50 -14
- package/dist/web-guest-access.js.map +1 -1
- package/dist/web-mod-bundle.d.ts +2 -45
- package/dist/web-mod-bundle.js +15 -63
- package/dist/web-mod-bundle.js.map +1 -1
- package/dist/web-mod-store.d.ts +3 -48
- package/dist/web-mod-store.js +30 -97
- package/dist/web-mod-store.js.map +1 -1
- package/dist/web-prefs.d.ts +13 -0
- package/dist/web-prefs.js +38 -0
- package/dist/web-prefs.js.map +1 -1
- package/dist/web-preview.d.ts +6 -13
- package/dist/web-preview.js +12 -23
- package/dist/web-preview.js.map +1 -1
- package/dist/web-session.d.ts +11 -3
- package/dist/web-session.js +22 -11
- package/dist/web-session.js.map +1 -1
- package/dist/web-settings-patch.d.ts +1 -1
- package/dist/web-settings-patch.js +9 -7
- package/dist/web-settings-patch.js.map +1 -1
- package/dist/web-settings-tools.d.ts +0 -13
- package/dist/web-settings-tools.js +12 -84
- package/dist/web-settings-tools.js.map +1 -1
- package/dist/workflow-templates/default.md +2 -2
- package/dist/working-recovery.d.ts +0 -2
- package/dist/working-recovery.js +2 -23
- package/dist/working-recovery.js.map +1 -1
- package/launcher/agend-install.cjs +7 -1
- package/launcher/fleet-service-owner.cjs +150 -0
- package/package.json +1 -1
- package/dist/general-knowledge/skills/web-appearance/SKILL.canvas-worker-off.md +0 -376
- package/dist/general-knowledge/skills/web-dashboard/SKILL.canvas-worker-off.md +0 -673
- package/dist/task-board-summary.d.ts +0 -101
- package/dist/task-board-summary.js +0 -177
- package/dist/task-board-summary.js.map +0 -1
- package/dist/ui/app-effects.js +0 -251
- package/dist/ui/chat-effect-posters.js +0 -42
- package/dist/ui/chat-effects.js +0 -167
- package/dist/ui/effect-trial-controller.js +0 -124
- package/dist/ui/effect-trial-offer.js +0 -2
- package/dist/ui/effect-trial-panel.js +0 -40
- package/dist/ui/effects-waker.js +0 -2
- package/dist/ui/settings-effects.js +0 -202
- package/dist/ui/settings-owner-effects.js +0 -82
- package/dist/ui/shared/effect-app-runtime.js +0 -299
- package/dist/ui/shared/effect-baseline.js +0 -64
- package/dist/ui/shared/effect-chat-runtime.js +0 -162
- package/dist/ui/shared/effect-cursor.js +0 -126
- package/dist/ui/shared/effect-display-metadata.js +0 -39
- package/dist/ui/shared/effect-frame.js +0 -146
- package/dist/ui/shared/effect-geometry.js +0 -137
- package/dist/ui/shared/effect-host-style.js +0 -10
- package/dist/ui/shared/effect-owner-regions.js +0 -74
- package/dist/ui/shared/effect-owner-source.js +0 -122
- package/dist/ui/shared/effect-policy.js +0 -151
- package/dist/ui/shared/effect-poster-reader.js +0 -98
- package/dist/ui/shared/effect-posters.js +0 -117
- package/dist/ui/shared/effect-profiler.js +0 -184
- package/dist/ui/shared/effect-profiles.js +0 -65
- package/dist/ui/shared/effect-registry.js +0 -545
- package/dist/ui/shared/effect-runtime-loader.js +0 -236
- package/dist/ui/shared/effect-safety.js +0 -153
- package/dist/ui/shared/effect-stock-snapshot.js +0 -43
- package/dist/ui/shared/effect-stock-trust.js +0 -217
- package/dist/ui/shared/effect-trial-shadow.js +0 -62
- package/dist/ui/shared/effect-trial-source.js +0 -103
- package/dist/ui/shared/effect-trial-stage.js +0 -170
- package/dist/ui/shared/effect-trial.css +0 -40
- package/dist/ui/shared/feature-flags.js +0 -127
- package/dist/ui/shared/owner-effect-prefs.js +0 -117
- package/dist/upgrade-notices.d.ts +0 -17
- package/dist/upgrade-notices.js +0 -93
- package/dist/upgrade-notices.js.map +0 -1
- package/dist/web-effect-bootstrap.d.ts +0 -12
- package/dist/web-effect-bootstrap.js +0 -49
- package/dist/web-effect-bootstrap.js.map +0 -1
- package/dist/web-effect-bundle.d.ts +0 -28
- package/dist/web-effect-bundle.js +0 -171
- package/dist/web-effect-bundle.js.map +0 -1
- package/dist/web-effect-canonical.d.ts +0 -8
- package/dist/web-effect-canonical.js +0 -27
- package/dist/web-effect-canonical.js.map +0 -1
- package/dist/web-effect-library.d.ts +0 -114
- package/dist/web-effect-library.js +0 -530
- package/dist/web-effect-library.js.map +0 -1
- package/dist/web-effect-playback.d.ts +0 -30
- package/dist/web-effect-playback.js +0 -71
- package/dist/web-effect-playback.js.map +0 -1
- package/dist/web-effect-poster.d.ts +0 -8
- package/dist/web-effect-poster.js +0 -52
- package/dist/web-effect-poster.js.map +0 -1
- package/dist/web-effect-profiles.d.ts +0 -118
- package/dist/web-effect-profiles.js +0 -181
- package/dist/web-effect-profiles.js.map +0 -1
- package/dist/web-effect-service.d.ts +0 -93
- package/dist/web-effect-service.js +0 -335
- package/dist/web-effect-service.js.map +0 -1
- package/dist/web-effect-tools.d.ts +0 -48
- package/dist/web-effect-tools.js +0 -129
- package/dist/web-effect-tools.js.map +0 -1
- package/dist/web-effect-trials.d.ts +0 -86
- package/dist/web-effect-trials.js +0 -204
- package/dist/web-effect-trials.js.map +0 -1
- package/dist/web-effect-upload.d.ts +0 -27
- package/dist/web-effect-upload.js +0 -185
- package/dist/web-effect-upload.js.map +0 -1
- package/dist/web-effect-worker.d.ts +0 -8
- package/dist/web-effect-worker.js +0 -170
- package/dist/web-effect-worker.js.map +0 -1
- package/dist/web-effect.d.ts +0 -103
- package/dist/web-effect.js +0 -153
- package/dist/web-effect.js.map +0 -1
- package/dist/web-experimental-http.d.ts +0 -2
- package/dist/web-experimental-http.js +0 -12
- package/dist/web-experimental-http.js.map +0 -1
- package/dist/web-mod-agent.d.ts +0 -50
- package/dist/web-mod-agent.js +0 -207
- package/dist/web-mod-agent.js.map +0 -1
package/dist/ui/shared/app.css
CHANGED
|
@@ -916,21 +916,32 @@ img.amb-p { object-fit: contain; }
|
|
|
916
916
|
/* A guest's note and the public link's sentence are kept whole: on a narrow screen they wrap rather than lose words. */
|
|
917
917
|
.composer-row .guest-note, .composer-row .webauth-row[data-state="public"] { margin: 0; text-align: left; white-space: normal; flex-shrink: 1; }
|
|
918
918
|
.webauth-row { display: inline-flex; align-items: center; gap: var(--s-1); }
|
|
919
|
-
.webauth-row .webauth-ok, .webauth-row .webauth-ask { font: inherit; padding: 0 2px; border: 0; background: none; cursor: pointer; border-radius: var(--r-sm); }
|
|
919
|
+
.webauth-row .webauth-ok, .webauth-row .webauth-ask, .webauth-row .webauth-why { font: inherit; padding: 0 2px; border: 0; background: none; cursor: pointer; border-radius: var(--r-sm); }
|
|
920
920
|
.webauth-row .webauth-ok { color: var(--ok); }
|
|
921
921
|
.webauth-row .webauth-ask { color: var(--accent); text-decoration: underline; text-underline-offset: 2px; }
|
|
922
|
-
|
|
922
|
+
/* #2889: "Not verified" where it can't be authorized: the row's grey words, a dotted underline saying a tap tells why. */
|
|
923
|
+
.webauth-row .webauth-why { color: inherit; text-decoration: underline dotted; text-underline-offset: 2px; }
|
|
924
|
+
.webauth-row .webauth-ok:focus-visible, .webauth-row .webauth-ask:focus-visible, .webauth-row .webauth-why:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; }
|
|
923
925
|
/* What pressing Authorize answered is said in the row, in the hint's place: nothing is laid over the composer. */
|
|
924
926
|
.webauth-row .webauth-notice { white-space: normal; color: var(--text-2); }
|
|
925
927
|
.webauth-row .webauth-notice::before { content: "·"; margin-right: var(--s-2); color: var(--text-3); }
|
|
926
928
|
.composer-row:has(.webauth-notice) > .hint { display: none; }
|
|
927
|
-
/* When "✓ Verified" ends, on a tap (touch has no hover): a bubble above the
|
|
929
|
+
/* When "✓ Verified" ends, or why it can't be authorized (#2889), on a tap (touch has no hover): a bubble above the
|
|
930
|
+
composer (web-authorize.js lifts it by the composer's height: never over Attach or the text, #2216) until the next tap,
|
|
931
|
+
a tap or key elsewhere, or Escape. */
|
|
928
932
|
.webauth-tip { position: absolute; left: 0; bottom: calc(100% + 4px); z-index: 5; max-width: min(420px, calc(100vw - 32px)); white-space: normal;
|
|
929
933
|
padding: var(--s-1) var(--s-2); border: 1px solid var(--border); border-radius: var(--r-sm); background: var(--surface); color: var(--text);
|
|
930
934
|
box-shadow: var(--shadow-2); }
|
|
931
935
|
.webauth-tip[hidden] { display: none; }
|
|
932
936
|
/* #1920 phase 3 / #2348: Settings → Access & security → Guests. The fixed template (#2330): flat rows split by a rule,
|
|
933
937
|
no rounded box or fill; an edited row is .s-dirty (the shared straight bar + tint, square). A state is coloured text. */
|
|
938
|
+
/* #2906: the fixed address's Test connection — one row per step, ✓ / ✗ / – and what to do next. */
|
|
939
|
+
.named-test-steps { list-style: none; margin: var(--s-2) 0 0; padding: 0; display: grid; gap: var(--s-1); font-size: var(--fs-sm); }
|
|
940
|
+
.named-test-steps li { overflow-wrap: anywhere; }
|
|
941
|
+
.named-test-steps .nt-mark { display: inline-block; width: 1.2em; font-weight: var(--fw-semibold); }
|
|
942
|
+
.named-test-steps .nt-ok .nt-mark { color: var(--ok); }
|
|
943
|
+
.named-test-steps .nt-fail .nt-mark { color: var(--danger); }
|
|
944
|
+
.named-test-steps .nt-skip { color: var(--text-3); }
|
|
934
945
|
.s-guests .guest-names { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 2px var(--s-3); max-height: 220px; overflow: auto;
|
|
935
946
|
padding: var(--s-1) 0; border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); }
|
|
936
947
|
.s-guests .guest-name span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
@@ -952,6 +963,8 @@ img.amb-p { object-fit: contain; }
|
|
|
952
963
|
.s-guests .g-chips { display: flex; flex-wrap: wrap; gap: var(--s-1); margin: var(--s-2) 0 0 calc(28px + var(--s-2)); }
|
|
953
964
|
.s-guests .g-chip { padding: 1px var(--s-2); border: 1px solid color-mix(in srgb, var(--text-3) 55%, transparent); border-radius: 0; font-size: var(--fs-sm); color: var(--text-2); white-space: nowrap; }
|
|
954
965
|
.s-guests .g-edit { margin: var(--s-2) 0 0 calc(28px + var(--s-2)); }
|
|
966
|
+
.s-guests .g-level { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); margin: var(--s-2) 0 0 calc(28px + var(--s-2)); }
|
|
967
|
+
.s-guests .g-level > .note:last-child { flex-basis: 100%; margin: 0; }
|
|
955
968
|
.s-guests .guest-actions { display: flex; flex-wrap: wrap; gap: var(--s-1); margin: var(--s-2) 0 0 calc(28px + var(--s-2)); }
|
|
956
969
|
.s-guests .g-error { color: var(--danger); margin-left: calc(28px + var(--s-2)); }
|
|
957
970
|
.s-guests .g-search { width: 100%; max-width: 360px; margin: var(--s-1) 0 var(--s-2); }
|
|
@@ -1212,6 +1225,18 @@ body.side-resizing, body.side-resizing * { cursor: col-resize !important; user-s
|
|
|
1212
1225
|
.v-filter-box input::placeholder { color: var(--text-3); }
|
|
1213
1226
|
.v-filter-clear { width: 28px; height: 28px; }
|
|
1214
1227
|
.v-filter .note { padding: var(--s-1) var(--s-1) 0; font-variant-numeric: tabular-nums; }
|
|
1228
|
+
/* A short viewport (a phone in landscape: about 300–480 px tall): the head, nav, filter and footer pinned around the
|
|
1229
|
+
list left it no room, and what did not fit was drawn over the footer (user report 2026-10-30). There the sidebar
|
|
1230
|
+
scrolls as one column: nothing shrinks, the list grows to its rows, the nav rows sit two to a row, and the filter
|
|
1231
|
+
stays in view at the bottom while the list scrolls past. Portrait phones and desktops are taller than this. */
|
|
1232
|
+
@media (max-height: 500px) {
|
|
1233
|
+
.sidebar { overflow-y: auto; overscroll-behavior: contain; }
|
|
1234
|
+
.sidebar > *, .view-roster > * { flex-shrink: 0; }
|
|
1235
|
+
.view-roster { flex: none; }
|
|
1236
|
+
.view-roster > .side-section { flex: none; overflow: visible; }
|
|
1237
|
+
.side-nav { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
|
1238
|
+
.v-filter { position: sticky; bottom: 0; z-index: 2; background: var(--bg-sidebar); }
|
|
1239
|
+
}
|
|
1215
1240
|
/* alpha.2 (N1): status and CLI chips under the filter box — each a group of checkboxes under its header (#1700). */
|
|
1216
1241
|
/* #1776: the "N / M" count is on the headers' row, at its right end — not a row of its own. The headers (and an open
|
|
1217
1242
|
group's list, the reset) wrap in their own box beside it, so a filter's summary or a narrow sidebar moves a header
|
|
@@ -1265,6 +1290,7 @@ body.side-resizing, body.side-resizing * { cursor: col-resize !important; user-s
|
|
|
1265
1290
|
.v-pre .ansi[data-b] { font-weight: var(--fw-bold); }
|
|
1266
1291
|
/* #1582: faint text (SGR 2) — a CLI's suggestion or placeholder, never input — stays faint here. */
|
|
1267
1292
|
.v-pre .ansi[data-dim] { opacity: .5; }
|
|
1293
|
+
.v-watching { flex-shrink: 0; margin: 0; padding: var(--s-2) var(--s-4); font-size: var(--fs-sm); color: var(--text-2); background: var(--surface); border-bottom: 1px solid var(--border); }
|
|
1268
1294
|
.v-term-note { position: absolute; left: var(--s-3); right: var(--s-3); top: var(--s-3); padding: var(--s-2) var(--s-3); border-radius: var(--r-sm); background: var(--warn-bg); border: 1px solid var(--warn-line); color: #f0f0f0; font-size: var(--fs-sm); }
|
|
1269
1295
|
.v-probe { position: absolute; visibility: hidden; white-space: pre; left: -9999px; top: 0; font-size: 100px; }
|
|
1270
1296
|
.help-list { list-style: disc; padding-left: var(--s-5); display: flex; flex-direction: column; gap: var(--s-2); font-size: var(--fs-sm); }
|
|
@@ -1513,6 +1539,9 @@ textarea.s-yaml { white-space: pre; overflow-x: auto; }
|
|
|
1513
1539
|
.pending-label { color: var(--text-2); }
|
|
1514
1540
|
.pending-summary { list-style: disc; padding-left: var(--s-5); color: var(--text-2); font-size: var(--fs-xs); }
|
|
1515
1541
|
.pending-actions { display: flex; justify-content: flex-end; }
|
|
1542
|
+
.pending-self { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--s-2); }
|
|
1543
|
+
.pending-host summary { cursor: pointer; color: var(--text-2); font-size: var(--fs-xs); }
|
|
1544
|
+
.pending-host code { display: block; margin-top: var(--s-1); font-size: var(--fs-xs); overflow-wrap: anywhere; user-select: all; }
|
|
1516
1545
|
/* Settings' pending bar sits at the bottom of the page: toasts and request cards stand above it, never on its buttons. */
|
|
1517
1546
|
.shell:has(.s-pending) .toasts { bottom: calc(var(--s-6) + 64px); }
|
|
1518
1547
|
/* In a chat the composer owns the bottom (Stop reply, Send): toasts come in under the header instead (alpha.2 sweep). */
|
|
@@ -2201,17 +2230,6 @@ html.oo-immersive .p-fleet > .panel-body { z-index: 50; }
|
|
|
2201
2230
|
.s-limit-warnings { margin: var(--s-2) 0; padding-left: var(--s-4); }
|
|
2202
2231
|
@media (max-width: 479px) { .grid3 { grid-template-columns: minmax(0, 1fr); } }
|
|
2203
2232
|
|
|
2204
|
-
/* #1629 B2: effect library controls. No runtime layer is created by this card. */
|
|
2205
|
-
.s-fx-actions { display: flex; flex-wrap: wrap; gap: var(--s-2); align-items: center; }
|
|
2206
|
-
.s-fx-item { margin-top: var(--s-3); padding-top: var(--s-3); border-top: 1px solid var(--border); }
|
|
2207
|
-
.s-fx-item h4 { margin: 0; }
|
|
2208
|
-
.s-fx-poster { display: block; max-width: min(240px, 100%); max-height: 160px; object-fit: contain; border-radius: var(--r-sm); }
|
|
2209
|
-
|
|
2210
|
-
.s-fx-chat, .s-fx-params label:not(.check) { display: flex; align-items: center; flex-wrap: wrap; gap: var(--s-2); }
|
|
2211
|
-
.s-fx-chat { margin: var(--s-2) 0; }
|
|
2212
|
-
.s-fx-params { display: flex; flex-direction: column; gap: var(--s-2); margin: var(--s-2) 0; max-width: 100%; }
|
|
2213
|
-
.s-fx-target, .s-fx-params input:not([type=checkbox]), .s-fx-params select { min-height: 36px; min-width: 0; max-width: 100%; padding: 0 var(--s-2); border: 1px solid var(--border); border-radius: var(--r-sm); background: var(--bg); color: var(--text); }
|
|
2214
|
-
|
|
2215
2233
|
/* #1629: stock paint bands. Structural ancestors remain neutral; only bounded content owns level 1.
|
|
2216
2234
|
The viewport effect root is a direct body sibling: behind 0 / stock content 1 (header 2) / front 20.
|
|
2217
2235
|
Nested menus cannot cross a content stacking context: the unmounted trust guard suspends fronts for overlays. */
|
|
@@ -2222,38 +2240,14 @@ html.oo-immersive .p-fleet > .panel-body { z-index: 50; }
|
|
|
2222
2240
|
/* Header menus must stay above the later scroller stacking context. */
|
|
2223
2241
|
.panel-head { z-index: 2; }
|
|
2224
2242
|
@media (min-width: 900px) { .chat-split > .pv-divider, .chat-split > .pv-panel { position: relative; z-index: 1; } }
|
|
2225
|
-
/* #1629: owner choices share the existing control font floor. */
|
|
2226
|
-
.s-fx-owner{margin-top:var(--s-4);padding-top:var(--s-3);border-top:1px solid var(--border)}
|
|
2227
|
-
.s-fx-owner-row{display:flex;align-items:end;flex-wrap:wrap;gap:var(--s-2);margin-top:var(--s-2)}
|
|
2228
|
-
.s-fx-owner-row>label{display:flex;flex-direction:column;gap:var(--s-1);min-width:0;flex:1}
|
|
2229
|
-
|
|
2230
|
-
/* #2044: the effect frame's document declares no colour scheme (light). An iframe whose own colour scheme differs
|
|
2231
|
-
from its document's gets an opaque backdrop, so under the dark theme the frame hid the whole chat: keep them equal. */
|
|
2232
|
-
.agend-effect-frame { color-scheme: normal !important; }
|
|
2233
|
-
|
|
2234
|
-
/* #1629: host-created static poster IMG; geometry and visibility belong to the trusted CSSOM binding. */
|
|
2235
|
-
.agend-effect-poster { object-fit: cover !important; object-position: center !important; user-select: none; }
|
|
2236
|
-
|
|
2237
2243
|
/* #1629: full-app bounded stock surfaces. Panel roots stay neutral; effects never raise the whole app. */
|
|
2238
2244
|
.p-fleet > .seg, .p-settings > .seg,
|
|
2239
2245
|
.p-fleet > .panel-body, .p-needs > .panel-body, .p-settings > .panel-body,
|
|
2240
2246
|
.p-log > .panel-body, .p-details > .panel-body, .p-view > .panel-body,
|
|
2241
|
-
.p-log > .log-bar, .p-view > .v-term, .p-view > .v-id { position: relative; z-index: 1; }
|
|
2247
|
+
.p-log > .log-bar, .p-view > .v-term, .p-view > .v-id, .p-view > .v-watching { position: relative; z-index: 1; }
|
|
2242
2248
|
/* Keep the existing Apply bar's sticky behavior, in its own bounded stock band. */
|
|
2243
2249
|
.p-settings > .s-pending { z-index: 1; }
|
|
2244
2250
|
|
|
2245
|
-
/* #1629: host-owned local Trial panel. Only its canvas frame lives inside the paint-contained stage. */
|
|
2246
|
-
.effect-trial-head, .effect-trial-controls, .effect-trial-note { position: relative; z-index: 1; background: var(--bg); padding: var(--s-3); margin: 0; }
|
|
2247
|
-
.effect-trial-head { display: flex; align-items: center; gap: var(--s-2); border-bottom: 1px solid var(--border); }
|
|
2248
|
-
.effect-trial-head > span { flex: 1; min-width: 0; overflow-wrap: anywhere; }
|
|
2249
|
-
.effect-trial-body { flex: 1; min-height: 0; display: flex; padding: var(--s-3); }
|
|
2250
|
-
.effect-trial-stage { position: relative; z-index: 0; flex: 1; min-width: 0; min-height: 0; contain: paint; overflow: clip; padding: 0; border: 0; outline: none; box-shadow: none; }
|
|
2251
|
-
|
|
2252
|
-
/* #2115: diagnostics remain inside the stock protected panel header, never in an effect plane. */
|
|
2253
|
-
.panel-head:has(> .chat-fx-notice) { flex-wrap: wrap; }
|
|
2254
|
-
.chat-fx-notice { order: 10; flex: 1 1 100%; min-width: 0; max-width: 100%; font-size: var(--fs-sm); overflow-wrap: anywhere; }
|
|
2255
|
-
.chat-fx-notice > span { display: block; }
|
|
2256
|
-
|
|
2257
2251
|
/* ── #2293: global search — the sidebar row's shortcut, the header's button (collapsed sidebar, phone), the dialog ── */
|
|
2258
2252
|
/* #2478: a touch screen has no Ctrl/⌘ K — the shortcut's hint is not shown there (the row is). */
|
|
2259
2253
|
@media (pointer: coarse) { .side-search .kbd-hint { display: none; } }
|
package/dist/ui/shared/app.js
CHANGED
|
@@ -13,7 +13,7 @@ import { installSwipe } from "./app-swipe.js";
|
|
|
13
13
|
import { installTextUndo } from "./text-undo.js";
|
|
14
14
|
import { startRouter, navStore, navigate } from "./app-nav.js";
|
|
15
15
|
import { createStream } from "./app-stream.js";
|
|
16
|
-
import { appStore, applyStatus, applyActivity, guestPage } from "./app-store.js";
|
|
16
|
+
import { appStore, applyStatus, applyActivity, guestPage, guestTrusted } from "./app-store.js";
|
|
17
17
|
import { chatPath } from "./app-route.js";
|
|
18
18
|
import { startNeedsNotifier } from "./app-needs.js";
|
|
19
19
|
import { toast } from "./ui-toast.js";
|
|
@@ -101,7 +101,8 @@ if (mode === "full") {
|
|
|
101
101
|
import("/ui/js/backend-signin.js").then((m) => m.installSignIn(), () => {});
|
|
102
102
|
}
|
|
103
103
|
// #1665: this device's first upload of its own choices (once), then another device's changes at each status frame.
|
|
104
|
-
// A guest's page only
|
|
104
|
+
// A guest's page (#2855) uploads and saves only its own keys (prefsWritable(key)); another device's changes reach it at
|
|
105
|
+
// its next load (its status frames carry no prefs_rev).
|
|
105
106
|
bootPrefs();
|
|
106
107
|
// #1629: agents' themes, read when the status frame's themes_rev moves (a guest's frames never carry it).
|
|
107
108
|
if (!guest) startThemes();
|
|
@@ -127,8 +128,8 @@ if (!guest) installOwnerCss();
|
|
|
127
128
|
}
|
|
128
129
|
|
|
129
130
|
document.addEventListener("keydown", handleKey);
|
|
130
|
-
// #2293: Ctrl+K / ⌘K (and Ctrl+F in a chat) — an admin's full app
|
|
131
|
-
if (mode === "full" && !guest) document.addEventListener("keydown", handleSearchKey);
|
|
131
|
+
// #2293: Ctrl+K / ⌘K (and Ctrl+F in a chat) — an admin's full app, and a trusted guest's (#2855: what it can see).
|
|
132
|
+
if (mode === "full" && (!guest || guestTrusted())) document.addEventListener("keydown", handleSearchKey);
|
|
132
133
|
// #2342: Ctrl/⌘+Z and Ctrl+Shift+Z / Ctrl+Y / ⌘⇧Z in every text field, one history per field (the browser's is one
|
|
133
134
|
// for the whole page, and any script write wipes it).
|
|
134
135
|
installTextUndo({ mac: isMacLike() });
|
|
@@ -504,18 +504,18 @@ export function InstanceNav({ route, items, loaded = true, exec = {}, awaiting =
|
|
|
504
504
|
const known = new Set(byName.keys());
|
|
505
505
|
const favs = nav.favorites.filter((n) => known.has(n));
|
|
506
506
|
const favSet = new Set(favs);
|
|
507
|
-
const canStar = !viewOnly && prefsWritable();
|
|
508
|
-
// #1920: a guest's list is
|
|
509
|
-
//
|
|
507
|
+
const canStar = !viewOnly && prefsWritable("nav.favorites");
|
|
508
|
+
// #1920: a guest's list is not reordered (the order is the host's). #2855: it stars, sorts and filters as its own
|
|
509
|
+
// preferences (kept on the host under its account), with reply times that only count replies its channel showed.
|
|
510
510
|
const guest = guestPage();
|
|
511
|
-
// #2179: when each row last replied (a guest's
|
|
511
|
+
// #2179: when each row last replied (a guest's: replies its channel showed). "recent" mode: the favorites keep
|
|
512
512
|
// their order or are sorted too, and every other row is one list, the last reply first. "custom" (the default) is the
|
|
513
513
|
// person's own order — a reply never moves a row.
|
|
514
514
|
const now = Date.now();
|
|
515
515
|
// The anonymous View reader (viewOnly) has no reply times (/api/profiles carries none) and no way to change the sort:
|
|
516
516
|
// its list is always Custom, whatever this browser kept from a signed-in page (#2181 review).
|
|
517
|
-
const ageOf = (n) => (
|
|
518
|
-
const recent = !
|
|
517
|
+
const ageOf = (n) => (viewOnly ? null : replyAge(byName.get(n), now));
|
|
518
|
+
const recent = !viewOnly && nav.sort.mode === "recent";
|
|
519
519
|
const favsSorted = recent && nav.sort.favs === "recent";
|
|
520
520
|
let shownGroups, shownInsts;
|
|
521
521
|
if (recent) {
|
|
@@ -528,7 +528,7 @@ export function InstanceNav({ route, items, loaded = true, exec = {}, awaiting =
|
|
|
528
528
|
shownInsts = new Map([...instByGroup].map(([g, names]) => [g, names.filter((n) => !favSet.has(n))]));
|
|
529
529
|
if (favs.length) shownInsts.set(FAV_GROUP, favs);
|
|
530
530
|
}
|
|
531
|
-
const f =
|
|
531
|
+
const f = nav.filter;
|
|
532
532
|
const shown = filterSidebar(shownGroups, shownInsts, byName, f.q, backendLabel, { status: f.status, cli: f.cli, statusOf: facetOf });
|
|
533
533
|
// #1936: while a filter is on, the instance you have open stays on top, pinned and marked "Current", whether or not
|
|
534
534
|
// it matches; a match is not repeated below. "N / M" still counts the filter's matches (the pinned row counts only
|
|
@@ -626,7 +626,7 @@ export function InstanceNav({ route, items, loaded = true, exec = {}, awaiting =
|
|
|
626
626
|
return html`<div class=${`view-roster inst-nav${editing && canStar ? " fav-editing" : ""}`}>
|
|
627
627
|
<div data-trust="navigation" class="side-section" id="instanceList" ref=${list}>
|
|
628
628
|
<div class="inst-head"><h2 class="side-label">${tn("instancesLabel")}</h2>
|
|
629
|
-
${canStar && items.length
|
|
629
|
+
${canStar && items.length ? html`<${SortMenu} sort=${nav.sort} />`
|
|
630
630
|
: recent ? html`<span class="chip-btn nav-sort-btn on nav-sort-static"><${Icon} name="sort" size=${12} /><span>${tn("sortRecent")}</span></span>` : null}
|
|
631
631
|
${canStar && items.length ? html`<button type="button" class="chip-btn fav-edit" aria-pressed=${editing ? "true" : "false"} onClick=${() => setEditing(!editing)}>
|
|
632
632
|
${editing ? tn("favDone") : html`<${Icon} name="star" size=${12} />${tn("favEdit")}`}</button>` : null}</div>
|
|
@@ -653,7 +653,7 @@ export function InstanceNav({ route, items, loaded = true, exec = {}, awaiting =
|
|
|
653
653
|
})}
|
|
654
654
|
${loaded && shown.active && !shown.groups.length ? html`<p class="side-empty">${tn("filterNone")}</p>` : null}
|
|
655
655
|
</div>
|
|
656
|
-
${
|
|
656
|
+
${html`<div class="v-filter">
|
|
657
657
|
<label class="v-filter-box"><${Icon} name="search" size=${14} /><span class="sr-only">${tn("filterPh")}</span>
|
|
658
658
|
<input ref=${filterRef} id="filterInput" type="text" autocomplete="off" spellcheck=${false} placeholder=${tn("filterPh")} value=${f.q}
|
|
659
659
|
onInput=${(e) => setNavFilter({ q: e.target.value })}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
// #1523 N2 (§3.2): the instance view switch — Chat | View | Details of ONE instance. Each segment is a link to that
|
|
2
2
|
// view's URL for the same instance, so switching keeps the instance (and the sidebar, which is never remounted).
|
|
3
3
|
// Desktop: links in the header; a phone: the same four as top tabs under it (app.css). The anonymous View reader
|
|
4
|
-
// gets none (Chat and Details need a session): the caller does not render it there.
|
|
4
|
+
// gets none (Chat and Details need a session): the caller does not render it there. #2855: a trusted guest's is Chat |
|
|
5
|
+
// View | Search (search opens on this agent); a chat-level guest gets none.
|
|
5
6
|
import { html } from "./app-html.js";
|
|
7
|
+
import { openSearch } from "./app-shell.js";
|
|
6
8
|
import { t } from "./app-i18n.js";
|
|
7
9
|
import { chatPath, detailsPath, logPath, viewPath } from "./app-route.js";
|
|
8
10
|
|
|
@@ -10,9 +12,13 @@ import { chatPath, detailsPath, logPath, viewPath } from "./app-route.js";
|
|
|
10
12
|
* current: "chat" | "view" | "log" | "details". #1218: Log sits between View and Details. `data-label`: each tab is as
|
|
11
13
|
* wide as its label in the current tab's weight (app.css), so the bar keeps its size whichever tab is current.
|
|
12
14
|
*/
|
|
13
|
-
export function InstanceSwitch({ name, current }) {
|
|
15
|
+
export function InstanceSwitch({ name, current, guest = false }) {
|
|
14
16
|
const seg = (key, href, label) => html`<a key=${key} class=${`seg-item${current === key ? " active" : ""}`} href=${href}
|
|
15
17
|
aria-current=${current === key ? "page" : undefined} data-label=${label}>${label}</a>`;
|
|
18
|
+
if (guest) return html`<nav class="inst-switch seg" aria-label=${t("app.instanceViews", name)}>
|
|
19
|
+
${seg("chat", chatPath(name), t("app.chat"))}${seg("view", viewPath(name), t("app.view"))}<button key="search" type="button" class="seg-item"
|
|
20
|
+
data-label=${t("app.search")} onClick=${() => openSearch({ instance: name })}>${t("app.search")}</button>
|
|
21
|
+
</nav>`;
|
|
16
22
|
return html`<nav class="inst-switch seg" aria-label=${t("app.instanceViews", name)}>
|
|
17
23
|
${seg("chat", chatPath(name), t("app.chat"))}${seg("view", viewPath(name), t("app.view"))}${seg("log", logPath(name), t("app.log"))}${seg("details", detailsPath(name), t("app.details"))}
|
|
18
24
|
</nav>`;
|
|
@@ -6,9 +6,13 @@
|
|
|
6
6
|
// Everything recurring is a passive read (#1374) taken through the navigation's lease: the pane every 800 ms and the
|
|
7
7
|
// roster every 5 s while the panel is mounted and the tab is visible, usage every 60 s while its dialog is open. They
|
|
8
8
|
// stop when the panel goes.
|
|
9
|
+
//
|
|
10
|
+
// #2855: a trusted guest's View — read-only: its own agents (the status frame's list, never /api/profiles), the pane
|
|
11
|
+
// every second under a "watching only" line, no identity card, Edit profile or Help. A chat-level guest is told it needs
|
|
12
|
+
// Trusted access; nothing is read.
|
|
9
13
|
import { html, useEffect, useRef, useState } from "./app-html.js";
|
|
10
14
|
import { t } from "./app-i18n.js";
|
|
11
|
-
import { appStore, createStore, useStore } from "./app-store.js";
|
|
15
|
+
import { appStore, createStore, guestPage, guestTrusted, useStore } from "./app-store.js";
|
|
12
16
|
import { useLease } from "./app-ctx.js";
|
|
13
17
|
import { PanelHeader, setTitle, onPanelKey, signInHref } from "./app-shell.js";
|
|
14
18
|
import { InstanceSwitch } from "./instance-switch.js";
|
|
@@ -123,8 +127,11 @@ const MIN_PX = 12, MAX_PX = 22, FIT_FLOOR_PX = 6;
|
|
|
123
127
|
|
|
124
128
|
export function ViewPanel({ route, navKey }) {
|
|
125
129
|
const lease = useLease(navKey);
|
|
126
|
-
const
|
|
127
|
-
const { viewOnly } = useStore(appStore);
|
|
130
|
+
const viewed = useStore(viewStore);
|
|
131
|
+
const { viewOnly, instances, ready } = useStore(appStore);
|
|
132
|
+
const guest = guestPage(), trusted = guest && guestTrusted();
|
|
133
|
+
// #2855: a guest's roster is its own agents, as its status frame lists them.
|
|
134
|
+
const v = guest ? { loaded: ready !== false, error: null, roster: (instances || []).map((i) => ({ instance_name: i.name, display_name: i.display_name, status: i.status })) } : viewed;
|
|
128
135
|
// { kind: "edit" | "usage" | "help", key }: a dialog belongs to the navigation that opened it. The profile editor's
|
|
129
136
|
// draft names one agent; on another navigation it is gone, never retargeted (#1448 review).
|
|
130
137
|
const [dialog, setDialogState] = useState(null);
|
|
@@ -142,6 +149,7 @@ export function ViewPanel({ route, navKey }) {
|
|
|
142
149
|
|
|
143
150
|
// The roster: now, then every 5 s while this panel is mounted and the tab is visible (a passive read).
|
|
144
151
|
useEffect(() => {
|
|
152
|
+
if (guest) return;
|
|
145
153
|
const reads = readStream(lease);
|
|
146
154
|
const load = async () => {
|
|
147
155
|
if (typeof document !== "undefined" && document.hidden) return;
|
|
@@ -180,7 +188,7 @@ export function ViewPanel({ route, navKey }) {
|
|
|
180
188
|
|
|
181
189
|
// Aa and ◔ are every page's (HeaderTools); Help is View's own.
|
|
182
190
|
const actions = html`<${HeaderTools} view=${true} navKey=${navKey} />
|
|
183
|
-
|
|
191
|
+
${guest ? null : html`<button type="button" class="icon-btn" onClick=${() => setDialog("help")} aria-label=${tn("helpButton")} title=${tn("helpButton")}><${Icon} name="info" /></button>`}`;
|
|
184
192
|
|
|
185
193
|
let body;
|
|
186
194
|
if (v.error && !v.roster.length) body = html`<div data-trust="panel-content" class="panel-body center"><${ErrorState} message=${tn("rosterFailedShort")} onRetry=${() => navigate(location.pathname, { replace: true })} /></div>`;
|
|
@@ -188,21 +196,26 @@ export function ViewPanel({ route, navKey }) {
|
|
|
188
196
|
else if (!v.roster.length) body = html`<div data-trust="panel-content" class="panel-body center"><${Empty} icon="view" title=${tn("noInstances")} /></div>`;
|
|
189
197
|
else if (!name) body = html`<div data-trust="panel-content" class="panel-body"><${Skeleton} lines=${6} /></div>`;
|
|
190
198
|
else if (!it) body = html`<div data-trust="panel-content" class="panel-body center"><${Empty} icon="alert" title=${tn("notFound", { name })} hint=${tn("notFoundHint")} /></div>`;
|
|
199
|
+
else if (guest && !trusted) body = html`<div data-trust="panel-content" class="panel-body center"><${Empty} icon="view" title=${tn("guestNeedsTrusted")} hint=${tn("guestNeedsTrustedHint")} /></div>`;
|
|
200
|
+
else if (guest) body = html`<p data-trust="panel-content" class="v-watching" role="note">${tn("guestWatching")}</p>
|
|
201
|
+
<${Terminal} key=${name} name=${name} lease=${lease} density=${density} every=${GUEST_PANE_MS} />`;
|
|
191
202
|
else body = html`<${Terminal} key=${name} name=${name} lease=${lease} density=${density} />
|
|
192
203
|
<${ViewIdentity} it=${it} viewOnly=${viewOnly} onEdit=${() => setDialog("edit")} />`;
|
|
193
204
|
|
|
194
205
|
return html`<div data-effect-panel="view" class="panel p-view">
|
|
195
206
|
<${PanelHeader} title=${it ? (it.display_name || it.instance_name) : tn("title")}
|
|
196
207
|
sub=${it ? html`<span class="status"><span class=${`dot ${it.status === "running" ? "ok" : it.status === "crashed" ? "bad" : "off"}`} aria-hidden="true"></span>${tn(STATUS_KEYS[it.status] || "statusUnknown")}</span>` : null}
|
|
197
|
-
nav=${it && !viewOnly ? html`<${InstanceSwitch} name=${name} current="view" />` : null}>${actions}</${PanelHeader}>
|
|
208
|
+
nav=${it && (guest ? trusted : !viewOnly) ? html`<${InstanceSwitch} name=${name} current="view" guest=${guest} />` : null}>${actions}</${PanelHeader}>
|
|
198
209
|
${body}
|
|
199
210
|
${open === "edit" && it ? html`<${EditProfile} key=${navKey} it=${it} onClose=${() => setDialog(null)} />` : null}
|
|
200
211
|
${open === "help" ? html`<${HelpDialog} onClose=${() => setDialog(null)} />` : null}
|
|
201
212
|
</div>`;
|
|
202
213
|
}
|
|
203
214
|
|
|
215
|
+
/** #2855: how often a guest's View reads the pane (the server allows it two reads a second). */
|
|
216
|
+
const GUEST_PANE_MS = 1000;
|
|
204
217
|
/** The live terminal: the pane every 800 ms (passive), drawn as escaped markup, its font fitted to the pane's grid. */
|
|
205
|
-
function Terminal({ name, lease, density }) {
|
|
218
|
+
function Terminal({ name, lease, density, every = 800 }) {
|
|
206
219
|
const term = useRef(null), pre = useRef(null);
|
|
207
220
|
const grid = useRef({ cols: 0, rows: 0, applied: 0, key: "" });
|
|
208
221
|
const [problem, setProblem] = useState(null);
|
|
@@ -246,7 +259,8 @@ function Terminal({ name, lease, density }) {
|
|
|
246
259
|
try {
|
|
247
260
|
const r = await lease.fetch(`/api/pane/${encodeURIComponent(name)}`);
|
|
248
261
|
if (!reads.live(token)) return;
|
|
249
|
-
if (
|
|
262
|
+
if (r.status === 429) return; // #2855: a guest over its read limit keeps the last frame
|
|
263
|
+
if (!r.ok) { setProblem(r.status === 404 ? tn("paneUnavailable") : r.status === 403 && guestPage() ? tn("guestNeedsTrusted") : tn("paneFailed", { name, status: r.status })); return; }
|
|
250
264
|
const text = await r.text();
|
|
251
265
|
if (!reads.live(token) || !pre.current) return;
|
|
252
266
|
const c = Number(r.headers.get("X-Pane-Cols")), rw = Number(r.headers.get("X-Pane-Rows"));
|
|
@@ -259,7 +273,7 @@ function Terminal({ name, lease, density }) {
|
|
|
259
273
|
finally { reads.end(token); }
|
|
260
274
|
};
|
|
261
275
|
refresh();
|
|
262
|
-
lease.interval(refresh,
|
|
276
|
+
lease.interval(refresh, every);
|
|
263
277
|
let timer = null;
|
|
264
278
|
const schedule = () => { lease.clear(timer); timer = lease.timeout(() => { grid.current.key = ""; fit(); }, 80); };
|
|
265
279
|
lease.on(window, "resize", schedule);
|
|
@@ -210,6 +210,9 @@ register("view", {
|
|
|
210
210
|
"title": "View",
|
|
211
211
|
"notFound": "No instance called “{name}”",
|
|
212
212
|
"notFoundHint": "It may have been deleted or renamed.",
|
|
213
|
+
"guestWatching": "👁 Watching only. You can't type here; send a message in Chat instead.",
|
|
214
|
+
"guestNeedsTrusted": "Watching needs Trusted access",
|
|
215
|
+
"guestNeedsTrustedHint": "Your host gave you chat access to this agent. Ask them to make you Trusted in Settings → Guests.",
|
|
213
216
|
"noInstances": "No instances yet",
|
|
214
217
|
"paneUnavailable": "This instance's terminal is not available (is it stopped?)",
|
|
215
218
|
"rosterFailedShort": "The instance list could not be loaded.",
|
|
@@ -453,6 +456,9 @@ register("view", {
|
|
|
453
456
|
"title": "檢視",
|
|
454
457
|
"notFound": "沒有叫「{name}」的 instance",
|
|
455
458
|
"notFoundHint": "它可能已被刪除或改名。",
|
|
459
|
+
"guestWatching": "👁 只能觀看。這裡不能輸入;要說話請到聊天。",
|
|
460
|
+
"guestNeedsTrusted": "觀看需要「信任」權限",
|
|
461
|
+
"guestNeedsTrustedHint": "主人給你的是這個 agent 的聊天權限。請他在設定 → 訪客把你改成「信任」。",
|
|
456
462
|
"noInstances": "還沒有 instance",
|
|
457
463
|
"paneUnavailable": "無法取得這個 instance 的終端畫面(它是否已停止?)",
|
|
458
464
|
"rosterFailedShort": "無法載入 instance 清單。",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// #1939 S2b (design §0.1): "Authorize this browser". The app shows this browser's state — verified (until when), a
|
|
2
2
|
// Confirm card waiting in the account's Discord or Telegram DM (with its countdown), or why it can't be authorized here —
|
|
3
3
|
// and asks for the card. The card itself is the gate: nothing here can authorize anything.
|
|
4
|
-
import { html, useEffect, useRef, useState } from "./app-html.js";
|
|
4
|
+
import { html, useEffect, useLayoutEffect, useRef, useState } from "./app-html.js";
|
|
5
5
|
import { register, t } from "./app-i18n.js";
|
|
6
6
|
import { guestPage } from "./app-store.js";
|
|
7
7
|
|
|
@@ -18,7 +18,7 @@ register("webauth", {
|
|
|
18
18
|
reason_not_admin: "Your account is not a fleet admin here.",
|
|
19
19
|
reason_not_admin_session: "Guests can't authorize.",
|
|
20
20
|
reason_token_rotated: "The dashboard's token changed: sign in again.",
|
|
21
|
-
reason_public_link: "
|
|
21
|
+
reason_public_link: "This sign-in can't be authorized over this link.",
|
|
22
22
|
reason_named_link_off: "Over your named link: turn on \"Also over my named link\" in Settings → Access & security on this computer.",
|
|
23
23
|
reason_quick_link_off: "Over the temporary public link: turn on \"Also over the temporary public link\" in Settings → Access & security on this computer.",
|
|
24
24
|
reason_not_session: "Sign in to authorize.",
|
|
@@ -31,6 +31,7 @@ register("webauth", {
|
|
|
31
31
|
verifiedShort: "Verified",
|
|
32
32
|
authorizeShort: "Authorize",
|
|
33
33
|
authorizeWhy: "Not verified: authorize this browser to speak as you",
|
|
34
|
+
notVerifiedWhy: "Not verified: {0}",
|
|
34
35
|
waitingShort: "Waiting for your Confirm ({0})",
|
|
35
36
|
},
|
|
36
37
|
"zh-TW": {
|
|
@@ -45,7 +46,7 @@ register("webauth", {
|
|
|
45
46
|
reason_not_admin: "你的帳號在這裡不是 fleet 管理者。",
|
|
46
47
|
reason_not_admin_session: "訪客無法授權。",
|
|
47
48
|
reason_token_rotated: "儀表板的 token 已變更:請重新登入。",
|
|
48
|
-
reason_public_link: "
|
|
49
|
+
reason_public_link: "這個登入無法透過這個連結授權。",
|
|
49
50
|
reason_named_link_off: "透過固定網域:請在這台電腦的 設定 → 存取與安全 開啟「也允許透過我的固定網域」。",
|
|
50
51
|
reason_quick_link_off: "透過臨時公開連結:請在這台電腦的 設定 → 存取與安全 開啟「也允許透過臨時公開連結」。",
|
|
51
52
|
reason_not_session: "登入後才能授權。",
|
|
@@ -58,6 +59,7 @@ register("webauth", {
|
|
|
58
59
|
verifiedShort: "已驗證",
|
|
59
60
|
authorizeShort: "授權",
|
|
60
61
|
authorizeWhy: "未驗證:授權這個瀏覽器以你的身分發言",
|
|
62
|
+
notVerifiedWhy: "未驗證:{0}",
|
|
61
63
|
waitingShort: "等待確認({0})",
|
|
62
64
|
},
|
|
63
65
|
});
|
|
@@ -155,26 +157,46 @@ export function AuthorizeChip() {
|
|
|
155
157
|
* The composer's row (#2215, the user's request, 2026-10-19): the same states as AuthorizeChip, each kept to a few words so
|
|
156
158
|
* they share one row with the key hint. What a state would have said at length is in its tooltip and its accessible
|
|
157
159
|
* name: when "Verified" ends, why it can't be authorized, the countdown's ask. A tap on "✓ Verified" shows when it
|
|
158
|
-
* ends
|
|
159
|
-
*
|
|
160
|
-
*
|
|
160
|
+
* ends, and a tap on "Not verified" why it can't be authorized here (#2889; touch has no hover), in a bubble above the
|
|
161
|
+
* composer, until the next tap, a tap or key elsewhere, or Escape. What pressing Authorize answered (sent, refused) is
|
|
162
|
+
* said in the row itself, in the hint's place (#2216 review: a bubble left over the composer covered Attach and what was
|
|
163
|
+
* being typed, with nothing to close it).
|
|
161
164
|
*/
|
|
162
165
|
export function ComposerAuth() {
|
|
163
166
|
const a = useWebAuthorization();
|
|
164
167
|
const [open, setOpen] = useState(false);
|
|
165
|
-
const tip = useRef("wa-tip-" + Math.random().toString(36).slice(2, 8));
|
|
168
|
+
const tip = useRef("wa-tip-" + Math.random().toString(36).slice(2, 8)), opener = useRef(null);
|
|
166
169
|
useEffect(() => { setOpen(false); }, [a.st && a.st.state]); // a new state closes the bubble
|
|
170
|
+
// #2889: a tap, focus or key (Escape too) anywhere else closes it, even where a tapped button never takes focus (Safari);
|
|
171
|
+
// on the button itself, its own handlers decide.
|
|
172
|
+
useEffect(() => {
|
|
173
|
+
if (!open) return undefined;
|
|
174
|
+
const doc = globalThis.document, kinds = ["pointerdown", "focusin", "keydown"];
|
|
175
|
+
const away = (e) => { if (!opener.current || !opener.current.contains(e.target)) setOpen(false); };
|
|
176
|
+
for (const k of kinds) doc.addEventListener(k, away, true);
|
|
177
|
+
return () => { for (const k of kinds) doc.removeEventListener(k, away, true); };
|
|
178
|
+
}, [open]);
|
|
179
|
+
// Above the whole composer, not over it (#2216): lifted by the composer's height, measured when it opens.
|
|
180
|
+
const bubble = useRef(null);
|
|
181
|
+
useLayoutEffect(() => {
|
|
182
|
+
const el = bubble.current, row = el && el.parentElement && el.parentElement.closest(".composer-row");
|
|
183
|
+
const composer = row && row.parentElement ? row.parentElement.querySelector(".composer") : null;
|
|
184
|
+
if (!el || !open || !composer) { if (el) el.style.removeProperty("bottom"); return; }
|
|
185
|
+
const lift = Math.max(0, Math.round(row.getBoundingClientRect().top - composer.getBoundingClientRect().top));
|
|
186
|
+
el.style.setProperty("bottom", `calc(100% + ${lift + 4}px)`);
|
|
187
|
+
}, [open]);
|
|
167
188
|
if (guestPage()) return null;
|
|
168
189
|
if (!a.st) return null;
|
|
169
190
|
const st = a.st, id = tip.current;
|
|
170
191
|
const said = a.notice ? html`<span class="webauth-notice" role="status">${a.notice}</span>` : null;
|
|
192
|
+
// The words in the row, a button whose tap shows `text` in the bubble; `title` keeps the hover on a desk.
|
|
193
|
+
const tipped = (cls, label, name, text) => html`<button type="button" class=${cls} ref=${opener} title=${text} aria-label=${name}
|
|
194
|
+
aria-expanded=${open ? "true" : "false"} aria-controls=${id} onClick=${() => setOpen((v) => !v)} onBlur=${() => setOpen(false)}
|
|
195
|
+
onKeyDown=${(e) => { if (e.key === "Escape" && open) { e.stopPropagation(); setOpen(false); } }}>${label}</button><span
|
|
196
|
+
id=${id} ref=${bubble} class="webauth-tip" role="tooltip" hidden=${!open}>${text}</span>`;
|
|
171
197
|
if (st.state === "verified") {
|
|
172
198
|
const until = tn("verified", clock(st.until));
|
|
173
|
-
return html`<span class="webauth-row" data-state="verified"
|
|
174
|
-
<button type="button" class="webauth-ok" title=${until} aria-label=${`✓ ${until}`} aria-expanded=${open ? "true" : "false"}
|
|
175
|
-
aria-controls=${id} onClick=${() => setOpen((v) => !v)} onBlur=${() => setOpen(false)}
|
|
176
|
-
onKeyDown=${(e) => { if (e.key === "Escape" && open) { e.stopPropagation(); setOpen(false); } }}>✓ ${tn("verifiedShort")}</button><span
|
|
177
|
-
id=${id} class="webauth-tip" role="tooltip" hidden=${!open}>${until}</span>${said}</span>`;
|
|
199
|
+
return html`<span class="webauth-row" data-state="verified">${tipped("webauth-ok", `✓ ${tn("verifiedShort")}`, `✓ ${until}`, until)}${said}</span>`;
|
|
178
200
|
}
|
|
179
201
|
if (st.state === "pending") {
|
|
180
202
|
const asks = tn("waiting", mmss(a.left));
|
|
@@ -185,7 +207,7 @@ export function ComposerAuth() {
|
|
|
185
207
|
title=${tn("authorizeWhy")} aria-label=${tn("authorizeWhy")} onClick=${a.ask}>${tn("authorizeShort")}</button>${said}</span>`;
|
|
186
208
|
}
|
|
187
209
|
const why = REASONS.includes(st.reason) ? tn(`reason_${st.reason}`) : tn("reason_other");
|
|
188
|
-
return html`<span class="webauth-row" data-state="none"
|
|
210
|
+
return html`<span class="webauth-row" data-state="none">${tipped("webauth-why", tn("notVerified"), tn("notVerifiedWhy", why), why)}${fixable(st.reason)
|
|
189
211
|
? html` · <a href="/settings/access" title=${why}>${tn("settings")}</a>` : null}</span>`;
|
|
190
212
|
}
|
|
191
213
|
|
package/dist/update-check.d.ts
CHANGED
|
@@ -42,11 +42,20 @@ export declare function installedChannel(version: string): UpdateChannel;
|
|
|
42
42
|
*/
|
|
43
43
|
export declare function getUpdateSelector(opts: UpdateVersionOptions, installedVersion: string): string;
|
|
44
44
|
/**
|
|
45
|
-
* Which "update available" line to post
|
|
46
|
-
* stays on
|
|
47
|
-
* rather than "Run: /update", which would not move it there.
|
|
45
|
+
* Which "update available" line to post, or none. An alpha install's `/update`
|
|
46
|
+
* stays on @alpha, so a newer STABLE release needs `--stable` (#1259) — say so
|
|
47
|
+
* rather than "Run: /update", which would not move it there. A beta install is
|
|
48
|
+
* never told about a stable at all: beta users stay on beta, with no hint to
|
|
49
|
+
* switch (the user's decision, 2026-10-16; #2775).
|
|
48
50
|
*/
|
|
49
|
-
export declare function updateNoticeKey(currentVersion: string, targetVersion: string): "update.available_stable" | "update.available_current";
|
|
51
|
+
export declare function updateNoticeKey(currentVersion: string, targetVersion: string): "update.available_stable" | "update.available_current" | null;
|
|
52
|
+
/**
|
|
53
|
+
* Why `agend update` stops instead of going back to an older version on the
|
|
54
|
+
* install's own channel: that channel has nothing newer, so the install is
|
|
55
|
+
* already current. No hint to switch channels (#2775); `--stable` still works
|
|
56
|
+
* for whoever asks for it.
|
|
57
|
+
*/
|
|
58
|
+
export declare function downgradeRefusal(installedVersion: string, tag: string, targetVersion: string): string;
|
|
50
59
|
/**
|
|
51
60
|
* The install would go back to an older version, and nobody asked for that.
|
|
52
61
|
* `--force`, `--version` and `--stable` are asking; an unknown target or a
|
package/dist/update-check.js
CHANGED
|
@@ -98,12 +98,25 @@ export function getUpdateSelector(opts, installedVersion) {
|
|
|
98
98
|
return installedChannel(installedVersion);
|
|
99
99
|
}
|
|
100
100
|
/**
|
|
101
|
-
* Which "update available" line to post
|
|
102
|
-
* stays on
|
|
103
|
-
* rather than "Run: /update", which would not move it there.
|
|
101
|
+
* Which "update available" line to post, or none. An alpha install's `/update`
|
|
102
|
+
* stays on @alpha, so a newer STABLE release needs `--stable` (#1259) — say so
|
|
103
|
+
* rather than "Run: /update", which would not move it there. A beta install is
|
|
104
|
+
* never told about a stable at all: beta users stay on beta, with no hint to
|
|
105
|
+
* switch (the user's decision, 2026-10-16; #2775).
|
|
104
106
|
*/
|
|
105
107
|
export function updateNoticeKey(currentVersion, targetVersion) {
|
|
106
|
-
|
|
108
|
+
if (!isPrereleaseVersion(currentVersion) || isPrereleaseVersion(targetVersion))
|
|
109
|
+
return "update.available_current";
|
|
110
|
+
return installedChannel(currentVersion) === "alpha" ? "update.available_stable" : null;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Why `agend update` stops instead of going back to an older version on the
|
|
114
|
+
* install's own channel: that channel has nothing newer, so the install is
|
|
115
|
+
* already current. No hint to switch channels (#2775); `--stable` still works
|
|
116
|
+
* for whoever asks for it.
|
|
117
|
+
*/
|
|
118
|
+
export function downgradeRefusal(installedVersion, tag, targetVersion) {
|
|
119
|
+
return `AgEnD v${installedVersion} is newer than ${tag} (v${targetVersion}); not going back to it. The ${tag} channel has nothing newer: this install is already current.`;
|
|
107
120
|
}
|
|
108
121
|
/**
|
|
109
122
|
* The install would go back to an older version, and nobody asked for that.
|
package/dist/update-check.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -63,6 +63,9 @@ export declare function formatDiscordUsageActivity(payload: UsagePayload): strin
|
|
|
63
63
|
/** True if the path belongs to the usage feature (so the caller can skip the
|
|
64
64
|
* global web-token gate and let this module answer, like isViewPath). */
|
|
65
65
|
export declare function isUsagePath(path: string): boolean;
|
|
66
|
+
/** #2855: whether this read forces a refresh — asked for, and not a guest's (it reads the snapshot the fleet keeps, which
|
|
67
|
+
* is refreshed behind it as for anyone). */
|
|
68
|
+
export declare function usageForce(req: IncomingMessage, url: URL): boolean;
|
|
66
69
|
/**
|
|
67
70
|
* Handle a usage API request. Returns true if the request was ours (and has
|
|
68
71
|
* been answered), false otherwise.
|