@songsid/agend 2.3.0-beta.2 → 2.3.0-beta.20
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 +7 -1
- package/README.zh-TW.md +7 -1
- package/dist/agent-cli-instructions.md +9 -2
- package/dist/agent-cli.js +63 -2
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-endpoint.js +4 -0
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/agent-file-read.d.ts +4 -1
- package/dist/agent-file-read.js +189 -16
- package/dist/agent-file-read.js.map +1 -1
- package/dist/agent-whats-new.d.ts +11 -0
- package/dist/agent-whats-new.js +29 -5
- package/dist/agent-whats-new.js.map +1 -1
- package/dist/auth-api.d.ts +30 -1
- package/dist/auth-api.js +45 -13
- package/dist/auth-api.js.map +1 -1
- package/dist/authority/authority-state.d.ts +38 -0
- package/dist/authority/authority-state.js +114 -0
- package/dist/authority/authority-state.js.map +1 -0
- package/dist/authority/session-authorizations.d.ts +43 -0
- package/dist/authority/session-authorizations.js +102 -0
- package/dist/authority/session-authorizations.js.map +1 -0
- package/dist/authority/web-authority.d.ts +120 -0
- package/dist/authority/web-authority.js +157 -0
- package/dist/authority/web-authority.js.map +1 -0
- package/dist/backend/claude-code.d.ts +2 -2
- package/dist/backend/claude-code.js +18 -8
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex-metadata.d.ts +8 -0
- package/dist/backend/codex-metadata.js +74 -17
- package/dist/backend/codex-metadata.js.map +1 -1
- package/dist/backend/codex.js +15 -2
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/credential-profile.d.ts +2 -0
- package/dist/backend/credential-profile.js +2 -0
- package/dist/backend/credential-profile.js.map +1 -1
- package/dist/backend/types.d.ts +6 -0
- package/dist/backend/types.js +15 -0
- package/dist/backend/types.js.map +1 -1
- package/dist/backend-availability.d.ts +120 -0
- package/dist/backend-availability.js +396 -0
- package/dist/backend-availability.js.map +1 -0
- package/dist/backend-command.d.ts +23 -3
- package/dist/backend-command.js +25 -4
- package/dist/backend-command.js.map +1 -1
- package/dist/bug-report-cli.d.ts +30 -0
- package/dist/bug-report-cli.js +138 -0
- package/dist/bug-report-cli.js.map +1 -0
- package/dist/bug-report.d.ts +47 -0
- package/dist/bug-report.js +136 -0
- package/dist/bug-report.js.map +1 -0
- package/dist/bundled-skills.d.ts +14 -0
- package/dist/bundled-skills.js +29 -0
- package/dist/bundled-skills.js.map +1 -0
- package/dist/cache-ledger.d.ts +16 -3
- package/dist/cache-ledger.js +33 -13
- package/dist/cache-ledger.js.map +1 -1
- package/dist/cache-service.d.ts +55 -3
- package/dist/cache-service.js +152 -16
- package/dist/cache-service.js.map +1 -1
- package/dist/channel/adapters/discord-client-retirement.d.ts +5 -0
- package/dist/channel/adapters/discord-client-retirement.js +57 -0
- package/dist/channel/adapters/discord-client-retirement.js.map +1 -0
- package/dist/channel/adapters/discord.d.ts +9 -0
- package/dist/channel/adapters/discord.js +49 -4
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/mcp-tools.js +22 -11
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/types.d.ts +6 -0
- package/dist/classic-channel-manager.d.ts +10 -5
- package/dist/classic-channel-manager.js +12 -9
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli.js +224 -111
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.d.ts +6 -0
- package/dist/config-validator.js +129 -3
- package/dist/config-validator.js.map +1 -1
- package/dist/config.d.ts +13 -1
- package/dist/config.js +14 -5
- package/dist/config.js.map +1 -1
- package/dist/cross-instance-notice.d.ts +7 -0
- package/dist/cross-instance-notice.js +10 -0
- package/dist/cross-instance-notice.js.map +1 -1
- package/dist/daemon.d.ts +24 -1
- package/dist/daemon.js +151 -19
- package/dist/daemon.js.map +1 -1
- package/dist/decision-list.d.ts +25 -0
- package/dist/decision-list.js +30 -0
- package/dist/decision-list.js.map +1 -0
- package/dist/delivery-outbox.d.ts +10 -0
- package/dist/delivery-outbox.js +17 -1
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/diagnostic-redaction.d.ts +10 -0
- package/dist/diagnostic-redaction.js +167 -0
- package/dist/diagnostic-redaction.js.map +1 -0
- package/dist/fleet-context.d.ts +10 -0
- package/dist/fleet-manager.d.ts +505 -15
- package/dist/fleet-manager.js +1870 -204
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-process-handlers.d.ts +18 -0
- package/dist/fleet-process-handlers.js +69 -0
- package/dist/fleet-process-handlers.js.map +1 -0
- package/dist/fleet-traffic.d.ts +74 -0
- package/dist/fleet-traffic.js +196 -0
- package/dist/fleet-traffic.js.map +1 -0
- package/dist/general-knowledge/skills/bug-report/SKILL.md +31 -0
- package/dist/general-knowledge/skills/credential-profiles/SKILL.md +17 -6
- package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +6 -1
- package/dist/general-knowledge/skills/fleet-config/SKILL.md +2 -0
- package/dist/general-knowledge/skills/multi-channel/SKILL.md +3 -2
- package/dist/general-knowledge/skills/persona-emoji/SKILL.md +1 -1
- package/dist/general-knowledge/skills/scheduling/SKILL.md +4 -0
- package/dist/general-knowledge/skills/web-appearance/SKILL.md +190 -47
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +545 -0
- package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +1 -1
- package/dist/human-delivery-receipts.d.ts +24 -1
- package/dist/human-delivery-receipts.js +64 -11
- package/dist/human-delivery-receipts.js.map +1 -1
- package/dist/instance-config-impact.js +7 -1
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +10 -1
- package/dist/instance-lifecycle.js +79 -18
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instance-names.d.ts +4 -0
- package/dist/instance-names.js +12 -0
- package/dist/instance-names.js.map +1 -0
- package/dist/instructions.d.ts +12 -1
- package/dist/instructions.js +13 -2
- package/dist/instructions.js.map +1 -1
- package/dist/locale.js +173 -12
- package/dist/locale.js.map +1 -1
- package/dist/log-steps.d.ts +1 -0
- package/dist/log-steps.js +15 -0
- package/dist/log-steps.js.map +1 -1
- package/dist/login-controller.d.ts +45 -0
- package/dist/login-controller.js +101 -5
- package/dist/login-controller.js.map +1 -1
- package/dist/ls-attach-resolve.d.ts +96 -0
- package/dist/ls-attach-resolve.js +180 -0
- package/dist/ls-attach-resolve.js.map +1 -0
- package/dist/ls-rows.d.ts +12 -0
- package/dist/ls-rows.js +82 -3
- package/dist/ls-rows.js.map +1 -1
- package/dist/memory-hogs.d.ts +27 -0
- package/dist/memory-hogs.js +124 -0
- package/dist/memory-hogs.js.map +1 -0
- package/dist/needs-you.d.ts +10 -0
- package/dist/needs-you.js +2 -1
- package/dist/needs-you.js.map +1 -1
- package/dist/outbound-handlers.d.ts +11 -0
- package/dist/outbound-handlers.js +139 -11
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +200 -4
- package/dist/outbound-schemas.js +124 -11
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/public-web-gateway.js +17 -4
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/public-web-link.d.ts +9 -0
- package/dist/public-web-link.js +8 -0
- package/dist/public-web-link.js.map +1 -1
- package/dist/quickstart-api.d.ts +19 -1
- package/dist/quickstart-api.js +94 -4
- package/dist/quickstart-api.js.map +1 -1
- package/dist/reply-buttons-controller.d.ts +4 -0
- package/dist/reply-buttons-controller.js +2 -2
- package/dist/reply-buttons-controller.js.map +1 -1
- package/dist/restart-progress.d.ts +80 -1
- package/dist/restart-progress.js +306 -21
- package/dist/restart-progress.js.map +1 -1
- package/dist/rollout-index.d.ts +5 -0
- package/dist/rollout-index.js +26 -5
- package/dist/rollout-index.js.map +1 -1
- package/dist/scheduler/db.d.ts +40 -13
- package/dist/scheduler/db.js +123 -89
- package/dist/scheduler/db.js.map +1 -1
- package/dist/scheduler/task-board-text.d.ts +26 -0
- package/dist/scheduler/task-board-text.js +135 -0
- package/dist/scheduler/task-board-text.js.map +1 -0
- package/dist/scheduler/task-board.d.ts +650 -0
- package/dist/scheduler/task-board.js +1938 -0
- package/dist/scheduler/task-board.js.map +1 -0
- package/dist/scheduler/types.d.ts +6 -1
- package/dist/search/search-docs.d.ts +58 -0
- package/dist/search/search-docs.js +63 -0
- package/dist/search/search-docs.js.map +1 -0
- package/dist/search/search-index.d.ts +141 -0
- package/dist/search/search-index.js +440 -0
- package/dist/search/search-index.js.map +1 -0
- package/dist/search/search-store.d.ts +122 -0
- package/dist/search/search-store.js +236 -0
- package/dist/search/search-store.js.map +1 -0
- package/dist/search/search-worker.d.ts +1 -0
- package/dist/search/search-worker.js +163 -0
- package/dist/search/search-worker.js.map +1 -0
- package/dist/service-installer.js +12 -0
- package/dist/service-installer.js.map +1 -1
- package/dist/settings-api.d.ts +23 -0
- package/dist/settings-api.js +164 -3
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-change.js +104 -0
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-confirmation.d.ts +3 -1
- package/dist/settings-confirmation.js +2 -0
- package/dist/settings-confirmation.js.map +1 -1
- package/dist/settings-effect.js +34 -3
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.d.ts +11 -0
- package/dist/settings-http-confirmation.js +10 -0
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/setup-form.d.ts +1 -1
- package/dist/setup-form.js +23 -7
- package/dist/setup-form.js.map +1 -1
- package/dist/spawn-gate.d.ts +1 -0
- package/dist/spawn-gate.js +13 -3
- package/dist/spawn-gate.js.map +1 -1
- package/dist/task-board-tool.d.ts +25 -0
- package/dist/task-board-tool.js +154 -0
- package/dist/task-board-tool.js.map +1 -0
- package/dist/task-board-waker.d.ts +44 -0
- package/dist/task-board-waker.js +128 -0
- package/dist/task-board-waker.js.map +1 -0
- package/dist/tmux-exec-helper.d.ts +94 -0
- package/dist/tmux-exec-helper.js +407 -0
- package/dist/tmux-exec-helper.js.map +1 -0
- package/dist/tmux-manager.d.ts +5 -0
- package/dist/tmux-manager.js +42 -11
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tool-permissions.d.ts +0 -7
- package/dist/tool-permissions.js +44 -5
- package/dist/tool-permissions.js.map +1 -1
- package/dist/topic-commands.d.ts +17 -1
- package/dist/topic-commands.js +45 -19
- package/dist/topic-commands.js.map +1 -1
- package/dist/tunnel/cloudflared.js +37 -2
- package/dist/tunnel/cloudflared.js.map +1 -1
- package/dist/tunnel/types.d.ts +3 -1
- package/dist/tunnel/types.js.map +1 -1
- package/dist/types.d.ts +63 -1
- package/dist/ui/app-effects.js +90 -32
- package/dist/ui/backend-signin.js +297 -0
- package/dist/ui/chat-ambient.js +307 -0
- package/dist/ui/chat-effect-posters.js +8 -8
- package/dist/ui/chat-effects.js +110 -15
- package/dist/ui/chat-msg-actions.js +176 -0
- package/dist/ui/chat-render.js +21 -3
- package/dist/ui/chat-store.js +64 -12
- package/dist/ui/chat-strings.js +85 -8
- package/dist/ui/chat-thread.js +204 -21
- package/dist/ui/effect-trial-controller.js +13 -8
- package/dist/ui/effect-trial-panel.js +19 -16
- package/dist/ui/effects-waker.js +70 -0
- package/dist/ui/fleet-canvas-layout.js +117 -0
- package/dist/ui/fleet-canvas.js +555 -0
- package/dist/ui/fleet-org.js +27 -12
- package/dist/ui/fleet-route-scene.js +207 -0
- package/dist/ui/fleet-route-worker.js +21 -0
- package/dist/ui/fleet-route.js +88 -0
- package/dist/ui/fleet-task-card.js +436 -0
- package/dist/ui/fleet-task-common.js +448 -0
- package/dist/ui/fleet-tasks.js +535 -0
- package/dist/ui/fleet-traffic.js +359 -0
- package/dist/ui/fleet-usage.js +435 -0
- package/dist/ui/panel-chat.js +264 -66
- package/dist/ui/panel-details.js +2 -1
- package/dist/ui/panel-fleet.js +65 -83
- package/dist/ui/panel-needs.js +4 -2
- package/dist/ui/panel-settings.js +56 -11
- package/dist/ui/preview.js +3 -2
- package/dist/ui/search-dialog.js +349 -0
- package/dist/ui/settings-appearance.js +44 -19
- package/dist/ui/settings-apply.js +3 -3
- package/dist/ui/settings-catalog.js +92 -0
- package/dist/ui/settings-confirm.js +7 -2
- package/dist/ui/settings-dialogs.js +40 -12
- package/dist/ui/settings-effects.js +4 -3
- package/dist/ui/settings-guests.js +117 -0
- package/dist/ui/settings-learn.js +25 -0
- package/dist/ui/settings-model.js +15 -6
- package/dist/ui/settings-mods.js +23 -9
- package/dist/ui/settings-owner-effects.js +15 -13
- package/dist/ui/settings-strings.js +122 -42
- package/dist/ui/settings-web-authority.js +91 -0
- package/dist/ui/shared/agend-auth.js +1 -1
- package/dist/ui/shared/app-i18n.js +11 -2
- package/dist/ui/shared/app-prefs.js +17 -4
- package/dist/ui/shared/app-route.js +19 -1
- package/dist/ui/shared/app-session.js +2 -0
- package/dist/ui/shared/app-shell.js +174 -30
- package/dist/ui/shared/app-store.js +26 -1
- package/dist/ui/shared/app-stream.js +5 -1
- package/dist/ui/shared/app-themes.js +140 -7
- package/dist/ui/shared/app.css +704 -20
- package/dist/ui/shared/app.js +26 -15
- package/dist/ui/shared/card-strings.js +8 -0
- package/dist/ui/shared/effect-app-runtime.js +68 -19
- package/dist/ui/shared/effect-chat-runtime.js +16 -3
- package/dist/ui/shared/effect-frame.js +26 -7
- package/dist/ui/shared/effect-geometry.js +24 -9
- package/dist/ui/shared/effect-owner-source.js +8 -1
- package/dist/ui/shared/effect-policy.js +21 -7
- package/dist/ui/shared/effect-profiler.js +31 -9
- package/dist/ui/shared/effect-registry.js +97 -50
- package/dist/ui/shared/effect-stock-snapshot.js +9 -0
- package/dist/ui/shared/effect-stock-trust.js +62 -10
- package/dist/ui/shared/effect-trial-shadow.js +62 -0
- package/dist/ui/shared/effect-trial-source.js +1 -1
- package/dist/ui/shared/effect-trial-stage.js +54 -31
- package/dist/ui/shared/effect-trial.css +40 -0
- package/dist/ui/shared/fx-motion.js +67 -0
- package/dist/ui/shared/identity-card.js +100 -11
- package/dist/ui/shared/identity-color.js +14 -10
- package/dist/ui/shared/instance-nav.js +179 -23
- package/dist/ui/shared/owner-css.js +30 -1
- package/dist/ui/shared/panel-view.js +24 -4
- package/dist/ui/shared/tokens.css +9 -3
- package/dist/ui/shared/ui-icons.js +2 -0
- package/dist/ui/shared/ui-menu.js +20 -7
- package/dist/ui/shared/ui-toast.js +16 -3
- package/dist/ui/shared/usage-dialog.js +34 -3
- package/dist/ui/shared/view-strings.js +72 -0
- package/dist/ui/shared/web-authorize.js +198 -0
- package/dist/ui/web-terminal/terminal.css +4 -4
- package/dist/ui/web-terminal/terminal.html +1 -1
- package/dist/update-launch.d.ts +9 -0
- package/dist/update-launch.js +38 -12
- package/dist/update-launch.js.map +1 -1
- package/dist/usage/format-rich.js +6 -3
- package/dist/usage/format-rich.js.map +1 -1
- package/dist/usage/i18n-keys.d.ts +1 -1
- package/dist/usage/i18n-keys.js +2 -1
- package/dist/usage/i18n-keys.js.map +1 -1
- package/dist/usage/i18n.d.ts +13 -1
- package/dist/usage/i18n.js +29 -0
- package/dist/usage/i18n.js.map +1 -1
- package/dist/usage/providers.d.ts +81 -2
- package/dist/usage/providers.js +240 -38
- package/dist/usage/providers.js.map +1 -1
- package/dist/usage/usage-api.d.ts +5 -1
- package/dist/usage/usage-api.js +184 -58
- package/dist/usage/usage-api.js.map +1 -1
- package/dist/usage-report.d.ts +158 -0
- package/dist/usage-report.js +226 -0
- package/dist/usage-report.js.map +1 -0
- package/dist/usage-rollup.d.ts +51 -0
- package/dist/usage-rollup.js +168 -0
- package/dist/usage-rollup.js.map +1 -0
- package/dist/user-systemd.d.ts +24 -0
- package/dist/user-systemd.js +75 -0
- package/dist/user-systemd.js.map +1 -0
- package/dist/view-api.d.ts +39 -0
- package/dist/view-api.js +69 -6
- package/dist/view-api.js.map +1 -1
- package/dist/web-ambient.d.ts +72 -0
- package/dist/web-ambient.js +161 -0
- package/dist/web-ambient.js.map +1 -0
- package/dist/web-api.d.ts +98 -14
- package/dist/web-api.js +1027 -83
- package/dist/web-api.js.map +1 -1
- package/dist/web-appearance-policy.d.ts +4 -6
- package/dist/web-appearance-policy.js +5 -12
- package/dist/web-appearance-policy.js.map +1 -1
- package/dist/web-appearance-tools.d.ts +3 -0
- package/dist/web-appearance-tools.js +22 -3
- package/dist/web-appearance-tools.js.map +1 -1
- package/dist/web-appearance-view.d.ts +27 -2
- package/dist/web-appearance-view.js +129 -14
- package/dist/web-appearance-view.js.map +1 -1
- package/dist/web-appearance.d.ts +17 -3
- package/dist/web-appearance.js +85 -8
- package/dist/web-appearance.js.map +1 -1
- package/dist/web-asset-parts.d.ts +2 -2
- package/dist/web-asset-parts.js +3 -3
- package/dist/web-asset-parts.js.map +1 -1
- package/dist/web-auth.js +3 -1
- package/dist/web-auth.js.map +1 -1
- package/dist/web-backend-login.d.ts +130 -0
- package/dist/web-backend-login.js +225 -0
- package/dist/web-backend-login.js.map +1 -0
- package/dist/web-card.d.ts +14 -0
- package/dist/web-card.js +40 -6
- package/dist/web-card.js.map +1 -1
- package/dist/web-channel-echo.d.ts +7 -1
- package/dist/web-channel-echo.js +6 -2
- package/dist/web-channel-echo.js.map +1 -1
- package/dist/web-chat-history.d.ts +83 -0
- package/dist/web-chat-history.js +137 -5
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-commands.d.ts +6 -1
- package/dist/web-commands.js +1 -1
- package/dist/web-commands.js.map +1 -1
- package/dist/web-effect-bootstrap.d.ts +12 -0
- package/dist/web-effect-bootstrap.js +49 -0
- package/dist/web-effect-bootstrap.js.map +1 -0
- package/dist/web-effect-bundle.js +46 -1
- package/dist/web-effect-bundle.js.map +1 -1
- package/dist/web-effect-playback.d.ts +30 -0
- package/dist/web-effect-playback.js +71 -0
- package/dist/web-effect-playback.js.map +1 -0
- package/dist/web-effect-profiles.d.ts +4 -4
- package/dist/web-effect-service.d.ts +11 -4
- package/dist/web-effect-service.js +25 -4
- package/dist/web-effect-service.js.map +1 -1
- package/dist/web-effect-tools.d.ts +1 -0
- package/dist/web-effect-tools.js +4 -4
- package/dist/web-effect-tools.js.map +1 -1
- package/dist/web-effect-trials.d.ts +2 -2
- package/dist/web-effect-trials.js +3 -3
- package/dist/web-effect-trials.js.map +1 -1
- package/dist/web-effect-upload.js +1 -1
- package/dist/web-effect-upload.js.map +1 -1
- package/dist/web-effect-worker.d.ts +1 -1
- package/dist/web-effect-worker.js +2 -2
- package/dist/web-effect-worker.js.map +1 -1
- package/dist/web-effect.d.ts +1 -1
- package/dist/web-guest-access.d.ts +126 -0
- package/dist/web-guest-access.js +238 -0
- package/dist/web-guest-access.js.map +1 -0
- package/dist/web-guest-rooms.d.ts +82 -0
- package/dist/web-guest-rooms.js +135 -0
- package/dist/web-guest-rooms.js.map +1 -0
- package/dist/web-host-guard.d.ts +11 -0
- package/dist/web-host-guard.js +11 -0
- package/dist/web-host-guard.js.map +1 -1
- package/dist/web-identity-color.d.ts +1 -1
- package/dist/web-identity-color.js +2 -2
- package/dist/web-identity-color.js.map +1 -1
- package/dist/web-identity-palette.d.ts +1 -1
- package/dist/web-identity-palette.js +2 -2
- package/dist/web-identity-palette.js.map +1 -1
- package/dist/web-image-meta.d.ts +13 -0
- package/dist/web-image-meta.js +62 -0
- package/dist/web-image-meta.js.map +1 -1
- package/dist/web-libavoid.d.ts +14 -0
- package/dist/web-libavoid.js +46 -0
- package/dist/web-libavoid.js.map +1 -0
- package/dist/web-login.d.ts +47 -0
- package/dist/web-login.js +115 -0
- package/dist/web-login.js.map +1 -1
- package/dist/web-mod-agent.d.ts +1 -1
- package/dist/web-mod-agent.js +7 -5
- package/dist/web-mod-agent.js.map +1 -1
- package/dist/web-mod-bundle.d.ts +9 -1
- package/dist/web-mod-bundle.js +62 -3
- package/dist/web-mod-bundle.js.map +1 -1
- package/dist/web-mod-export.d.ts +9 -0
- package/dist/web-mod-export.js +21 -0
- package/dist/web-mod-export.js.map +1 -1
- package/dist/web-mod-store.d.ts +7 -1
- package/dist/web-mod-store.js +19 -6
- package/dist/web-mod-store.js.map +1 -1
- package/dist/web-owner-css-store.d.ts +44 -1
- package/dist/web-owner-css-store.js +70 -9
- package/dist/web-owner-css-store.js.map +1 -1
- package/dist/web-prefs.d.ts +14 -0
- package/dist/web-prefs.js +37 -4
- package/dist/web-prefs.js.map +1 -1
- package/dist/web-preview.d.ts +6 -2
- package/dist/web-preview.js +4 -2
- package/dist/web-preview.js.map +1 -1
- package/dist/web-returning-device.d.ts +41 -0
- package/dist/web-returning-device.js +57 -5
- package/dist/web-returning-device.js.map +1 -1
- package/dist/web-session-authorization.d.ts +132 -0
- package/dist/web-session-authorization.js +193 -0
- package/dist/web-session-authorization.js.map +1 -0
- package/dist/web-session.d.ts +70 -10
- package/dist/web-session.js +137 -22
- package/dist/web-session.js.map +1 -1
- package/dist/web-settings-patch.d.ts +49 -2
- package/dist/web-settings-patch.js +145 -1
- package/dist/web-settings-patch.js.map +1 -1
- package/dist/web-settings-tools.d.ts +94 -0
- package/dist/web-settings-tools.js +301 -0
- package/dist/web-settings-tools.js.map +1 -0
- package/dist/web-shell-routes.d.ts +1 -1
- package/dist/web-shell-routes.js +1 -1
- package/dist/web-shell-routes.js.map +1 -1
- package/dist/web-terminal-http.js +15 -2
- package/dist/web-terminal-http.js.map +1 -1
- package/dist/web-theme-store.d.ts +39 -0
- package/dist/web-theme-store.js +122 -11
- package/dist/web-theme-store.js.map +1 -1
- package/dist/web-theme.d.ts +31 -0
- package/dist/web-theme.js +99 -2
- package/dist/web-theme.js.map +1 -1
- package/dist/web-upload.d.ts +13 -0
- package/dist/web-upload.js +39 -3
- package/dist/web-upload.js.map +1 -1
- package/dist/windows-shortcuts.d.ts +78 -0
- package/dist/windows-shortcuts.js +203 -0
- package/dist/windows-shortcuts.js.map +1 -0
- package/dist/workflow-templates/default.md +4 -1
- package/dist/yaml-shared-nodes.d.ts +25 -0
- package/dist/yaml-shared-nodes.js +185 -0
- package/dist/yaml-shared-nodes.js.map +1 -0
- package/launcher/agend-install.cjs +553 -0
- package/launcher/install-admission.cjs +4 -39
- package/launcher/postinstall.cjs +14 -12
- package/package.json +4 -2
- package/scripts/preinstall-guard.cjs +2 -5
- package/templates/windows-shortcuts.ps1 +181 -0
- package/launcher/old-updater-note.cjs +0 -48
|
@@ -3,28 +3,28 @@ import { html, useEffect, useRef, useState } from "/assets/app-html.js";
|
|
|
3
3
|
import { register, t } from "/assets/app-i18n.js";
|
|
4
4
|
import { useStore } from "/assets/app-store.js";
|
|
5
5
|
import { OWNER_EFFECT_PREF_KEYS } from "/assets/app-prefs.js";
|
|
6
|
-
import { getAppEffects } from "./
|
|
6
|
+
import { getAppEffects, wakeEffects } from "./effects-waker.js";
|
|
7
7
|
import { ownerEffectsStore, watchOwnerEffects, refreshOwnerEffects, saveOwnerEffects } from "/assets/owner-effect-prefs.js";
|
|
8
8
|
register("ownerEffects", {
|
|
9
9
|
en: {
|
|
10
|
-
title: "Your effect choices", operatorTitle: "Host-wide effect choices", person: "
|
|
11
|
-
operator: "
|
|
10
|
+
title: "Your effect choices", operatorTitle: "Host-wide effect choices", person: "Follows your sign-in; Discord and Telegram are separate.",
|
|
11
|
+
operator: "Shared by everyone signed in as the host.",
|
|
12
12
|
sidebar: "Sidebar", header: "Header", page: "Page", box: "Box", cursor: "Cursor", none: "None", savedChoice: "Saved choice",
|
|
13
13
|
unknown: "Choices are unavailable. Reload to try again.", changed: "This page can no longer access these choices. Reload and sign in again.",
|
|
14
14
|
unavailable: "No longer available", clear: "Clear", reload: "Reload choices", saved: "Saved.", failed: "Couldn't save. Reload choices and try again.",
|
|
15
15
|
savedRefresh: "Saved, but the choices couldn't be refreshed. Reload to check.", readOnly: "Sign in as an admin to change these choices.",
|
|
16
|
-
playback: "
|
|
17
|
-
pause: "Pause", resume: "Resume", running: "Running", cursorFailed: "The cursor could not be applied here. Clear or reload the choice to try again.", starting: "Starting", queued: "Waiting for a slot", paused: "Paused", off: "Playback is off or unavailable here.", budget: "Paused to
|
|
16
|
+
playback: "Effects don't require HTML-preview permission.",
|
|
17
|
+
pause: "Pause", resume: "Resume", running: "Running", cursorFailed: "The cursor could not be applied here. Clear or reload the choice to try again.", starting: "Starting", queued: "Waiting for a slot", paused: "Paused", off: "Playback is off or unavailable here.", budget: "Paused to keep the page responsive.", resumeFailed: "This effect cannot resume: the page or its safety history is not ready. Reload the page or choose another effect.",
|
|
18
18
|
},
|
|
19
19
|
"zh-TW": {
|
|
20
|
-
title: "你的效果選擇", operatorTitle: "主機共用效果選擇", person: "
|
|
21
|
-
operator: "
|
|
20
|
+
title: "你的效果選擇", operatorTitle: "主機共用效果選擇", person: "跟隨你的登入身分;Discord 與 Telegram 各自獨立。",
|
|
21
|
+
operator: "所有以主機身分登入的人共用。",
|
|
22
22
|
sidebar: "側邊欄", header: "頁首", page: "頁面", box: "區塊", cursor: "游標", none: "無", savedChoice: "已儲存的選擇",
|
|
23
23
|
unknown: "目前無法取得選擇,請重新載入再試。", changed: "這個頁面已無法存取選擇,請重新載入並登入。",
|
|
24
24
|
unavailable: "已無法使用", clear: "清除", reload: "重新載入選擇", saved: "已儲存。", failed: "無法儲存,請重新載入選擇再試。",
|
|
25
25
|
savedRefresh: "已儲存,但無法更新畫面;請重新載入確認。", readOnly: "請以管理員身分登入才能修改選擇。",
|
|
26
|
-
playback: "
|
|
27
|
-
pause: "暫停", resume: "恢復", running: "播放中", cursorFailed: "這裡無法套用游標。可清除或重新載入選擇後再試。", starting: "啟動中", queued: "等待空位", paused: "已暫停", off: "這裡已關閉播放,或無法播放效果。", budget: "
|
|
26
|
+
playback: "效果不需要 HTML 預覽權限。",
|
|
27
|
+
pause: "暫停", resume: "恢復", running: "播放中", cursorFailed: "這裡無法套用游標。可清除或重新載入選擇後再試。", starting: "啟動中", queued: "等待空位", paused: "已暫停", off: "這裡已關閉播放,或無法播放效果。", budget: "為維持頁面順暢,已暫停。", resumeFailed: "頁面或安全紀錄尚未就緒,無法恢復此效果。請重新載入頁面,或選擇其他效果。",
|
|
28
28
|
},
|
|
29
29
|
});
|
|
30
30
|
const text = key => t(`ownerEffects.${key}`);
|
|
@@ -38,9 +38,11 @@ export function OwnerEffects({ catalog, busy = false }) {
|
|
|
38
38
|
const state = useStore(ownerEffectsStore), [message, setMessage] = useState(null), life = useRef({ alive: false, seq: 0 }), [runtime, setRuntime] = useState(null);
|
|
39
39
|
useEffect(() => { life.current.alive = true; const stop = watchOwnerEffects(); return () => { life.current.alive = false; life.current.seq++; stop(); }; }, []);
|
|
40
40
|
useEffect(() => {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const
|
|
41
|
+
// #2193: managing personal effects needs the runtime's view of them: it is woken here (it may still be asleep).
|
|
42
|
+
let live = true, entry = getAppEffects(), off = null, end = null;
|
|
43
|
+
const pull = () => { if (!live) return; const gates = entry?.gates(); setRuntime({ entry, snapshot: entry?.api?.ownerSnapshot?.(), cursor: entry?.cursorSnapshot?.(), available: !!entry && !entry.dead && gates.enabled && gates.show && gates.transportReady && !gates.safe && !gates.publicLink && !gates.reducedMotion }); };
|
|
44
|
+
const bind = () => { off = entry?.subscribe(pull) ?? null; end = entry?.onEnd(pull) ?? null; pull(); };
|
|
45
|
+
if (entry) bind(); else { pull(); void wakeEffects().then(() => { if (!live) return; entry = getAppEffects(); bind(); }); }
|
|
44
46
|
return () => { live = false; off?.(); end?.(); };
|
|
45
47
|
}, []);
|
|
46
48
|
const reload = () => { getAppEffects()?.api?.changedOwner?.(); return refreshOwnerEffects(); };
|
|
@@ -54,7 +56,7 @@ export function OwnerEffects({ catalog, busy = false }) {
|
|
|
54
56
|
const seq = ++life.current.seq; setMessage(null);
|
|
55
57
|
const result = await saveOwnerEffects({ [key]: id });
|
|
56
58
|
if (!life.current.alive || seq !== life.current.seq) return;
|
|
57
|
-
if (result.ok || result.saved) getAppEffects()?.api?.changedOwner?.();
|
|
59
|
+
if (result.ok || result.saved) getAppEffects()?.api?.changedOwner?.(); // #2193: asleep, the saved slot wakes it (app-prefs)
|
|
58
60
|
setMessage(text(result.ok ? "saved" : result.saved ? "savedRefresh" : "failed"));
|
|
59
61
|
};
|
|
60
62
|
return html`<section class="s-fx-owner" aria-label=${text(state.scope === "operator" ? "operatorTitle" : "title")}><h4>${text(state.scope === "operator" ? "operatorTitle" : "title")}</h4><p class="sub">${text(state.scope === "operator" ? "operator" : "person")}</p>
|
|
@@ -14,7 +14,8 @@ register("settings", {
|
|
|
14
14
|
publicTtl: "Public link minutes (1–480)",
|
|
15
15
|
publicProtocol: "Tunnel protocol",
|
|
16
16
|
webEcho: "Web echo",
|
|
17
|
-
webEchoHint: "Copies web messages to the bound Telegram or Discord topic. ClassicBot rooms
|
|
17
|
+
webEchoHint: "Copies web messages to the bound Telegram or Discord topic. ClassicBot rooms follow it unless a room sets its own.",
|
|
18
|
+
webUsagePublic: "Usage report over the public link", webUsagePublicHint: "Fleet → Usage (up to 400 days of each agent's tokens, requests, messages and API-equivalent amounts) is offered over the temporary public link too. Off by default; guests never see it. Applies at once.",
|
|
18
19
|
webLogTab: "Log tab: each agent's steps", webLogTabHint: "Shows each instance's prompts, replies, tool calls and results, and fleet events in its Log tab, read from its own transcript only while the tab is open. Secret values are masked. Also over the public link. Turning it on waits for a fleet admin's confirmation.",
|
|
19
20
|
general: "General Settings",
|
|
20
21
|
advanced: "Advanced",
|
|
@@ -88,7 +89,6 @@ register("settings", {
|
|
|
88
89
|
wake: "Wake",
|
|
89
90
|
accessMode: "Access mode",
|
|
90
91
|
affected: "Affected instances",
|
|
91
|
-
webEchoGroupConfirm: "This looks like a group channel: enabling posts every web message to this instance where all channel members can read it. Enable web echo?",
|
|
92
92
|
language: "Language (bot replies)",
|
|
93
93
|
defaultBackend: "Default backend",
|
|
94
94
|
defaultModel: "Default model",
|
|
@@ -131,6 +131,7 @@ register("settings", {
|
|
|
131
131
|
applyPartial: "Some changes failed",
|
|
132
132
|
applyClose: "Close",
|
|
133
133
|
settingsButton: "Settings",
|
|
134
|
+
connRetryNow: "Retry now", connRetryQueued: "Connection retry requested.", connRetryFailed: "Could not retry this connection. Check its status and try again.",
|
|
134
135
|
modalDone: "Stage change",
|
|
135
136
|
wizardButton: "Setup wizard",
|
|
136
137
|
wizardTitle: "Set up AgEnD",
|
|
@@ -204,6 +205,9 @@ register("settings", {
|
|
|
204
205
|
changesApplied: "Changes applied. AgEnD is reconciling affected Agents.",
|
|
205
206
|
reviewChanges: "Review changes",
|
|
206
207
|
backendUnavailable: "{0} (removed — choose another backend)",
|
|
208
|
+
backendNotInstalled: "not installed", backendNotSignedIn: "not signed in (use /login)", backendTooOld: "needs {0} or newer", backendUnchecked: "not checked yet",
|
|
209
|
+
modelNotListed: "current — not in this CLI's list", modelOther: "Other…", modelOtherLabel: "Model name", modelOtherPlaceholder: "a model name this CLI accepts",
|
|
210
|
+
modelNone: "— none —", inheritValue: "inherit ({0})", modelCliDefault: "the CLI's own default",
|
|
207
211
|
readyApply: "Ready to apply",
|
|
208
212
|
copied: "Copied",
|
|
209
213
|
expectedMapping: "expected a mapping",
|
|
@@ -222,7 +226,7 @@ register("settings", {
|
|
|
222
226
|
staggerWarning: "Very low values can cause startup spikes",
|
|
223
227
|
sec_device: "Preferences", syncedTitle: "Synced across your devices", syncedLead: "Changes here apply on every device where you are signed in.",
|
|
224
228
|
profileTitle: "Your name",
|
|
225
|
-
profileLeadBound: "Agents see your web messages as the Discord or Telegram account your sign-in code was sent to: its id, and its name unless you choose another here. It follows you to every device you sign in on.
|
|
229
|
+
profileLeadBound: "Agents see your web messages as the Discord or Telegram account your sign-in code was sent to: its id, and its name unless you choose another here. It follows you to every device you sign in on. Agents do your ordinary requests as you; a release, anything destructive, spending, secrets or passing your authority on needs this browser authorized, or your confirm in Discord or Telegram.",
|
|
226
230
|
profileLeadUnbound: "This browser was not signed in with a code sent to your Discord or Telegram account, so agents see your web messages as \"web-user\" (or the name you set here). Sign in with a code from /web to be recognised as your account.",
|
|
227
231
|
profileName: "Name", profileHelp: "Agents see: {0} · id {1}", profileSave: "Save", profileClear: "Use web-user", profileUseAccount: "Use {0}",
|
|
228
232
|
profileSaved: "Agents now see you as {0}", profileFailed: "Could not save the name",
|
|
@@ -290,17 +294,18 @@ register("settings", {
|
|
|
290
294
|
sec_web: "Web",
|
|
291
295
|
// #1629 r4 §3: Settings → Appearance (owner CSS).
|
|
292
296
|
sec_appearance: "Web appearance",
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
297
|
+
groupLook: "Look", groupLayout: "Your layout", groupCss: "Styles you write", groupMods: "Add-ons", groupAdvanced: "Advanced", learnMore: "Learn more: {0}",
|
|
298
|
+
colorTitle: "Identity colours", colorLead: "One agent's colour: its ⋯ menu → Colour…",
|
|
299
|
+
colorPlaces: "Where colours show", colorSample: "Sample agent", colorOff: "Turn off colours",
|
|
300
|
+
colorOffLead: "Colours people picked are kept.",
|
|
301
|
+
restoreTitle: "Restore defaults", restoreLead: "Puts this host's look back to the defaults. Asks first.",
|
|
302
|
+
restoreConfirm: "Resets, for this host: showing agents' themes and effects, the card size and each card's own size, your sidebar widget, where colours show, and colours off. Also turns your custom CSS off (its versions are kept) and its switch on this device. Kept: the colours people picked for agents, installed mods, uploaded effects and the card limits.",
|
|
298
303
|
restoreGo: "Restore defaults", restoreDone: "Appearance settings are back to their defaults.", restoreCssFailed: "The settings are back to their defaults, but your custom CSS could not be turned off: {0}",
|
|
299
304
|
cardSizeTitle: "Identity cards",
|
|
300
|
-
cardSizeLead: "
|
|
305
|
+
cardSizeLead: "A card's own S / M / L overrides this.",
|
|
301
306
|
cardLimitsTitle: "Identity card upload limits",
|
|
302
|
-
cardLimitsLead: "
|
|
303
|
-
cardLimitsUnavailable: "Only a signed-in admin can
|
|
307
|
+
cardLimitsLead: "Empty = the default. Raising a limit needs an admin's OK.",
|
|
308
|
+
cardLimitsUnavailable: "Only a signed-in admin can change these.",
|
|
304
309
|
cardLimit_portrait_max_width: "Portrait width (px)", cardLimit_portrait_max_height: "Portrait height (px)", cardLimit_portrait_max_kib: "Portrait size (KiB)",
|
|
305
310
|
cardLimit_banner_max_width: "Banner width (px)", cardLimit_banner_max_height: "Banner height (px)", cardLimit_banner_max_kib: "Banner size (KiB)",
|
|
306
311
|
cardLimit_instance_quota_files: "Pictures per agent", cardLimit_instance_quota_mib: "Picture space per agent (MiB)",
|
|
@@ -312,10 +317,12 @@ register("settings", {
|
|
|
312
317
|
cardLimitsFailed: "Not saved: {0}",
|
|
313
318
|
themesTitle: "Agents' themes",
|
|
314
319
|
themesShow: "Show agents' themes, effects and widgets",
|
|
315
|
-
themesShowLead: "
|
|
320
|
+
themesShowLead: "When off, every chat looks the same.",
|
|
321
|
+
themesFollowMotion: "Effects: follow the system's reduced-motion setting",
|
|
322
|
+
themesFollowMotionLead: "This device only: effects stay still while the system reduces motion.",
|
|
316
323
|
themesSafeMode: "This page was opened with ?safe=1: agents' themes are not shown on it.",
|
|
317
324
|
widgetTitle: "Your sidebar widget",
|
|
318
|
-
widgetLead: "A small panel under
|
|
325
|
+
widgetLead: "A small panel under your agent list, written as JSON.",
|
|
319
326
|
widgetNotJson: "Not JSON.",
|
|
320
327
|
widgetSave: "Save widget",
|
|
321
328
|
widgetSaved: "Sidebar widget saved.",
|
|
@@ -323,7 +330,7 @@ register("settings", {
|
|
|
323
330
|
widgetRemove: "Remove widget",
|
|
324
331
|
widgetRemoved: "Sidebar widget removed.",
|
|
325
332
|
modsTitle: "Mods",
|
|
326
|
-
modsLead: "
|
|
333
|
+
modsLead: "Only the parts you tick are applied.",
|
|
327
334
|
modsLoadFailed: "Couldn't load the installed mods. Reload the page to try again.",
|
|
328
335
|
modsNone: "No mods installed.",
|
|
329
336
|
modChoose: "Import a mod file…",
|
|
@@ -334,6 +341,7 @@ register("settings", {
|
|
|
334
341
|
modReplace: "Replace the installed version {0}",
|
|
335
342
|
modPartTheme: "Theme (colours, font, pictures)",
|
|
336
343
|
modPartIdentity: "Card text (tagline and bio)",
|
|
344
|
+
modPartAmbient: "Ambient effect (falling, rising, twinkling or click glyphs)",
|
|
337
345
|
modPartWidget_chat_header: "Chat header widget",
|
|
338
346
|
modPartWidget_details: "Details page widget",
|
|
339
347
|
modPartWidget_sidebar: "Your sidebar widget",
|
|
@@ -360,7 +368,7 @@ register("settings", {
|
|
|
360
368
|
modUninstallConfirm: "Uninstall {0}? Its effects leave your library unless something still uses them. What it applied stays.",
|
|
361
369
|
modUninstalled: "Uninstalled {0}.",
|
|
362
370
|
modExport: "Export a mod",
|
|
363
|
-
modExportLead: "
|
|
371
|
+
modExportLead: "Save what's in force now as a mod file.",
|
|
364
372
|
modExportInstance: "Agent",
|
|
365
373
|
modExportName: "Name (a-z, 0-9, -)",
|
|
366
374
|
modExportVersion: "Version",
|
|
@@ -372,7 +380,7 @@ register("settings", {
|
|
|
372
380
|
modReview: "Review",
|
|
373
381
|
modDismiss: "Dismiss",
|
|
374
382
|
cssTitle: "Custom CSS (yours only)",
|
|
375
|
-
cssLead: "
|
|
383
|
+
cssLead: "Applies to your screens only.",
|
|
376
384
|
cssLoadFailed: "Couldn't load your custom CSS. Reload the page to try again.",
|
|
377
385
|
cssPublicLink: "Custom CSS isn't available on a temporary public link.",
|
|
378
386
|
cssInForce: "In force: {0}",
|
|
@@ -385,15 +393,14 @@ register("settings", {
|
|
|
385
393
|
cssCurrent: "in force",
|
|
386
394
|
cssRestore: "Use this",
|
|
387
395
|
cssAssets: "Assets",
|
|
388
|
-
cssAssetsLead: "
|
|
396
|
+
cssAssetsLead: "{0} of {1} files, {2} in total (at most 1 MiB in all).",
|
|
389
397
|
cssAssetAdd: "Add a picture or font",
|
|
390
398
|
cssAssetCopy: "Copy reference",
|
|
391
399
|
cssCopied: "Copied {0}",
|
|
392
400
|
cssAssetRemove: "Remove",
|
|
393
401
|
cssDeviceTitle: "On this device",
|
|
394
402
|
cssDeviceOff: "Turn off custom CSS on this device",
|
|
395
|
-
|
|
396
|
-
cssSafe: "Is something hidden or broken? Add ?safe=1 to the end of any page's address and it loads without custom CSS.",
|
|
403
|
+
cssSafe: "Something hidden? Add ?safe=1 to the address.",
|
|
397
404
|
cssError_at_rule: "Not saved: {0} isn't allowed.",
|
|
398
405
|
cssError_url: "Not saved: the only url() allowed is url(\"asset:<id>\") for a file in Assets.",
|
|
399
406
|
cssError_unknown_asset: "Not saved: there's no asset {0}. Add it under Assets first.",
|
|
@@ -426,6 +433,28 @@ register("settings", {
|
|
|
426
433
|
webTerminalTtl: "Terminal session minutes (1–20)",
|
|
427
434
|
webTerminalTtlRange: "Must be a whole number from 1 to 20",
|
|
428
435
|
webReadOnlyTitle: "Set in fleet.yaml",
|
|
436
|
+
guestsTitle: "Guests", guestsReview: "Review guest changes",
|
|
437
|
+
guestsHint: "People who are not admins can sign in to the web as guests: they send /web where they already chat and get a code privately. A guest sees only the agents they can already use in chat, and their messages are recognition only.",
|
|
438
|
+
guestsEnabled: "Guest sign-in", guestsEnabledHint: "Off: no one can sign in as a guest, and every guest session ends. Turning it on waits for a fleet admin's confirmation.",
|
|
439
|
+
guestsChat: "Guests may chat", guestsChatHint: "Off: guests can read their agents' chats but not send, attach, click a reply's buttons or press Cancel.",
|
|
440
|
+
guestsOpenFor: "Agents for guests of {0} ({1})", guestsOpenHint: "This connection is open to everyone, so it has no list of people: its guests reach only the agents you tick here (none by default). Adding agents waits for a fleet admin's confirmation.",
|
|
441
|
+
guestsList: "Guest accounts", guestsNone: "No guest has signed in yet.", guestsLoadFailed: "The guest list could not be loaded.",
|
|
442
|
+
guestFacts: "Agents: {0} · Sessions: {1} · Remembered browsers: {2}", guestLastActive: "Last active {0}", guestNotSignedIn: "Not signed in now",
|
|
443
|
+
guestNotNarrowed: "Reaches every agent they can use in chat.", guestNarrowedTo: "Narrowed to: {0}", guestNothing: "nothing",
|
|
444
|
+
guestNarrow: "Narrow", guestNotReachable: "(no longer reachable)", guestReachesNothing: "This account reaches no agent from chat right now, so there is nothing to narrow.", guestNarrowLift: "Remove narrowing", guestNarrowHint: "Tick what this guest may still reach. Narrowing only takes away (it applies at once); widening or removing it waits for a fleet admin's confirmation.",
|
|
445
|
+
guestSignOut: "Sign out", guestSignOutTitle: "Sign out this guest?", guestSignOutConfirm: "{0}'s guest sessions end now, their sign-in code stops working and their browsers are forgotten. They can sign in again with /web while guest sign-in is on.",
|
|
446
|
+
guestSignedOut: "{0} is signed out.", guestSignedOutNotDurable: "{0} is signed out for now, but it could not be saved: a restart may bring their sessions back.", guestSignOutFailed: "That did not work — try again.",
|
|
447
|
+
vaTitle: "Web authority", vaReview: "Review web authority changes",
|
|
448
|
+
vaHint: "Whether a signed-in fleet admin's web messages carry their own account's authority, recorded in each message's delivery receipt. A session signed in with a code sent privately to that account, on the dashboard reached directly, is authorized once from Discord or Telegram; the public link and guests never are. Agents do an admin's ordinary web requests either way; a release, anything destructive, spending, secrets or passing authority on needs this.",
|
|
449
|
+
vaLoadFailed: "Web authority could not be loaded.",
|
|
450
|
+
vaEnabled: "Web messages carry authority", vaEnabledHint: "On by default: a session carries authority only once its account confirms it from Discord or Telegram. Off: no web message carries authority, and any already given reads as none at once; authority given before it was turned off never comes back.",
|
|
451
|
+
vaStuckOff: "Web authority is off for now: its state could not be saved on this computer (see the fleet log). It comes back on by itself once it can be.",
|
|
452
|
+
vaLoopbackOnly: "Only this computer can authorize", vaLoopbackOnlyHint: "On: only a browser on this computer qualifies, not one on your network or tailnet, and authority already given from elsewhere reads as none. Turning it off again doesn't bring that back.",
|
|
453
|
+
vaLanWarning: "The dashboard also answers to {0} (web.allowed_hosts). Anyone who reaches it there with a stolen sign-in could give authority in your name. Turn on \"Only this computer can authorize\" unless you trust everyone who can reach it.",
|
|
454
|
+
vaHours: "An authorization lasts (hours, {0}–{1})", vaHoursRange: "Must be a number from 1 to 48",
|
|
455
|
+
vaSessionsTitle: "Authorized sessions", vaSessionsNone: "No session is authorized now.", vaSessionUntil: "Authorized {0} · until {1}",
|
|
456
|
+
vaRevoke: "Revoke web authority", vaRevokeTitle: "Revoke all web authority?", vaRevokeConfirm: "Every authority given from the web so far reads as none from now on, and every session's authorization ends. Nobody is signed out: a session carries authority again once it is authorized again.",
|
|
457
|
+
vaRevoked: "Web authority given so far is revoked.", vaRevokedNotDurable: "Revoked for now, but it could not be saved: web authority stays off until it can be, and a restart before then undoes the revocation.", vaRevokeFailed: "That did not work — try again.",
|
|
429
458
|
webReadOnlyLead: "Read-only here: these decide what the dashboard listens on and exposes. Edit fleet.yaml, then run agend reload (web.preview_port and web.preview_origin take a restart of AgEnD).",
|
|
430
459
|
notSet: "not set (default)",
|
|
431
460
|
defaultsTitle: "Defaults",
|
|
@@ -474,7 +503,19 @@ register("settings", {
|
|
|
474
503
|
discardOnLeave: "Discard {0} pending changes?",
|
|
475
504
|
applyBusyLocal: "An Apply is still running — wait for it to finish.",
|
|
476
505
|
applyStepFailed: "Stopped at a change: {0}. The changes after it were not applied; they are staged again.",
|
|
477
|
-
|
|
506
|
+
applyError_unsupported_sensitive_effect: "it changes a setting the confirmation cannot show safely, so nothing was changed",
|
|
507
|
+
applyError_confirmation_diff_too_large: "it is too large to confirm at once; apply fewer changes at a time",
|
|
508
|
+
applyError_session_required: "your sign-in ended; sign in again and apply",
|
|
509
|
+
applyError_admin_required: "only a fleet admin can confirm it",
|
|
510
|
+
applyError_settings_changed: "the settings changed meanwhile; review and apply again",
|
|
511
|
+
applyError_request_no_longer_current: "the settings changed meanwhile; review and apply again",
|
|
512
|
+
applyError_too_many_pending_changes: "too many changes are waiting for confirmation; confirm or withdraw some first",
|
|
513
|
+
applyError_fleet_unavailable: "the fleet is not running",
|
|
514
|
+
applyError_invalid_settings_effect: "the result would not be a valid configuration",
|
|
515
|
+
applyError_settings_confirmation_unavailable: "its confirmation could not be set up; try again",
|
|
516
|
+
applyError_failed: "the server could not apply it",
|
|
517
|
+
applyErrorOther: "the server refused it ({0})",
|
|
518
|
+
stepWaiting: "Waiting for confirmation",
|
|
478
519
|
stepSkipped: "Not applied",
|
|
479
520
|
viaRestart: "(restart)",
|
|
480
521
|
format: "Format",
|
|
@@ -491,7 +532,6 @@ register("settings", {
|
|
|
491
532
|
discordUserPlaceholder: "your Discord user id",
|
|
492
533
|
telegramUserPlaceholder: "your Telegram user id",
|
|
493
534
|
bindingApplyButton: "Rebind",
|
|
494
|
-
webEchoEnable: "Turn on web echo",
|
|
495
535
|
help1: "Agents: each agent's settings, Start/Stop, Pause/Wake, and New agent.",
|
|
496
536
|
help2: "Connections: who may use each bot, its binding, its status emojis, a new token; and provider API keys.",
|
|
497
537
|
help3: "ClassicBot: each room's backend, model and options.",
|
|
@@ -535,7 +575,8 @@ register("settings", {
|
|
|
535
575
|
publicTtl: "公開連結分鐘數(1–480)",
|
|
536
576
|
publicProtocol: "Tunnel 協定",
|
|
537
577
|
webEcho: "Web 同步",
|
|
538
|
-
webEchoHint: "將網頁訊息複製到綁定的 Telegram 或 Discord
|
|
578
|
+
webEchoHint: "將網頁訊息複製到綁定的 Telegram 或 Discord 主題。ClassicBot 聊天室也照這個設定,除非該聊天室另外設定。",
|
|
579
|
+
webUsagePublic: "透過公開連結提供用量報告", webUsagePublicHint: "Fleet → 用量(最多 400 天、每個 agent 的 token、請求、訊息與依牌價換算的 API 等值)也會透過臨時公開連結提供。預設關閉;訪客一律看不到。變更立即生效。",
|
|
539
580
|
webLogTab: "紀錄分頁:每個 agent 的步驟", webLogTabHint: "在每個 instance 的「紀錄」分頁顯示提示、回覆、工具呼叫與結果,以及 fleet 事件;只在分頁開著時從它自己的對話紀錄讀取。機密值會遮蔽。公開連結也看得到。開啟需 fleet admin 確認。",
|
|
540
581
|
general: "一般設定",
|
|
541
582
|
advanced: "進階",
|
|
@@ -584,7 +625,6 @@ register("settings", {
|
|
|
584
625
|
wake: "喚醒",
|
|
585
626
|
accessMode: "存取模式",
|
|
586
627
|
affected: "受影響 instances",
|
|
587
|
-
webEchoGroupConfirm: "這看起來是群組頻道:開啟後,這個 instance 的每則 web 訊息都會貼到所有頻道成員看得到的地方。確定要開啟 web echo?",
|
|
588
628
|
language: "語言(bot 回覆)",
|
|
589
629
|
defaultBackend: "預設後端",
|
|
590
630
|
defaultModel: "預設模型",
|
|
@@ -627,6 +667,7 @@ register("settings", {
|
|
|
627
667
|
applyPartial: "有部分變更失敗",
|
|
628
668
|
applyClose: "關閉",
|
|
629
669
|
settingsButton: "設定",
|
|
670
|
+
connRetryNow: "立即重試", connRetryQueued: "已要求重新連線。", connRetryFailed: "無法重試此連線,請檢查狀態後再試。",
|
|
630
671
|
modalDone: "加入待套用",
|
|
631
672
|
wizardButton: "設定精靈",
|
|
632
673
|
wizardTitle: "設定 AgEnD",
|
|
@@ -700,6 +741,9 @@ register("settings", {
|
|
|
700
741
|
changesApplied: "變更已套用,AgEnD 正在協調受影響的 Agent。",
|
|
701
742
|
reviewChanges: "檢查變更",
|
|
702
743
|
backendUnavailable: "{0}(已移除,請選擇其他 backend)",
|
|
744
|
+
backendNotInstalled: "未安裝", backendNotSignedIn: "未登入(請用 /login)", backendTooOld: "需要 {0} 以上版本", backendUnchecked: "尚未檢查",
|
|
745
|
+
modelNotListed: "目前使用中 — 不在這個 CLI 的清單裡", modelOther: "其他…", modelOtherLabel: "模型名稱", modelOtherPlaceholder: "這個 CLI 接受的模型名稱",
|
|
746
|
+
modelNone: "— 無 —", inheritValue: "沿用({0})", modelCliDefault: "CLI 自己的預設",
|
|
703
747
|
readyApply: "可套用變更",
|
|
704
748
|
copied: "已複製",
|
|
705
749
|
expectedMapping: "預期為 mapping",
|
|
@@ -718,7 +762,7 @@ register("settings", {
|
|
|
718
762
|
staggerWarning: "數值太低可能造成啟動尖峰",
|
|
719
763
|
sec_device: "偏好設定", syncedTitle: "在你所有的裝置同步", syncedLead: "這裡的變更會套用到你登入的每一台裝置。",
|
|
720
764
|
profileTitle: "你的名字",
|
|
721
|
-
profileLeadBound: "agent 會把你從網頁送出的訊息,認成收到登入驗證碼的那個 Discord 或 Telegram 帳號:用它的 id
|
|
765
|
+
profileLeadBound: "agent 會把你從網頁送出的訊息,認成收到登入驗證碼的那個 Discord 或 Telegram 帳號:用它的 id,名字也用它的,除非你在這裡另外取名。它會跟著你到每一台登入的裝置。一般的請求,agent 會當作是你本人提出的;發布、破壞性操作、花費、密鑰,或把你的授權交給別人,則要先授權這個瀏覽器,或在 Discord、Telegram 上確認。",
|
|
722
766
|
profileLeadUnbound: "這個瀏覽器不是用私訊到你 Discord 或 Telegram 帳號的驗證碼登入的,所以 agent 會把你的網頁訊息看成「web-user」(或你在這裡設定的名字)。用 /web 的驗證碼登入,就能被認成你的帳號。",
|
|
723
767
|
profileName: "名字", profileHelp: "agent 看到:{0} · id {1}", profileSave: "儲存", profileClear: "改回 web-user", profileUseAccount: "改用 {0}",
|
|
724
768
|
profileSaved: "agent 現在會看到你是 {0}", profileFailed: "無法儲存名字",
|
|
@@ -785,17 +829,18 @@ register("settings", {
|
|
|
785
829
|
webChat: "網頁聊天",
|
|
786
830
|
sec_web: "網頁",
|
|
787
831
|
sec_appearance: "網頁外觀",
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
832
|
+
groupLook: "外觀", groupLayout: "你的版面", groupCss: "自己寫的樣式", groupMods: "擴充", groupAdvanced: "進階", learnMore: "了解更多:{0}",
|
|
833
|
+
colorTitle: "識別色", colorLead: "單一 agent 的顏色:⋯ 選單 → 顏色…",
|
|
834
|
+
colorPlaces: "顏色顯示的位置", colorSample: "範例 agent", colorOff: "關閉顏色",
|
|
835
|
+
colorOffLead: "已挑選的顏色會保留。",
|
|
836
|
+
restoreTitle: "還原預設值", restoreLead: "把這台主機的外觀改回預設值,會先詢問。",
|
|
837
|
+
restoreConfirm: "會重設這台主機的:是否顯示 agent 的主題與效果、卡片大小與各張卡片自己的大小、你的側欄小工具、顏色顯示的位置、是否關閉顏色;也會關閉你的自訂 CSS(版本會保留)與這台裝置上的 CSS 開關。不變:有人替 agent 挑的顏色、已安裝的 mod、上傳的效果與卡片上限。",
|
|
793
838
|
restoreGo: "還原預設值", restoreDone: "外觀設定已改回預設值。", restoreCssFailed: "設定已改回預設值,但無法關閉你的自訂 CSS:{0}",
|
|
794
839
|
cardSizeTitle: "身分卡",
|
|
795
|
-
cardSizeLead: "
|
|
840
|
+
cardSizeLead: "卡片上的 小/中/大 可單獨設定。",
|
|
796
841
|
cardLimitsTitle: "身分卡上傳限制",
|
|
797
|
-
cardLimitsLead: "
|
|
798
|
-
cardLimitsUnavailable: "
|
|
842
|
+
cardLimitsLead: "留空=預設值。調高上限需管理員確認。",
|
|
843
|
+
cardLimitsUnavailable: "只有已登入的管理者能修改。",
|
|
799
844
|
cardLimit_portrait_max_width: "肖像寬度(px)", cardLimit_portrait_max_height: "肖像高度(px)", cardLimit_portrait_max_kib: "肖像大小(KiB)",
|
|
800
845
|
cardLimit_banner_max_width: "橫幅寬度(px)", cardLimit_banner_max_height: "橫幅高度(px)", cardLimit_banner_max_kib: "橫幅大小(KiB)",
|
|
801
846
|
cardLimit_instance_quota_files: "每個 agent 的圖片數", cardLimit_instance_quota_mib: "每個 agent 的圖片空間(MiB)",
|
|
@@ -807,10 +852,12 @@ register("settings", {
|
|
|
807
852
|
cardLimitsFailed: "未儲存:{0}",
|
|
808
853
|
themesTitle: "Agent 的主題",
|
|
809
854
|
themesShow: "顯示 agent 的主題、效果與小工具",
|
|
810
|
-
themesShowLead: "
|
|
855
|
+
themesShowLead: "關閉時每個聊天看起來都一樣。",
|
|
856
|
+
themesFollowMotion: "效果:跟隨系統的「減少動態效果」設定",
|
|
857
|
+
themesFollowMotionLead: "只套用於這台裝置:系統減少動態效果時,效果保持靜止。",
|
|
811
858
|
themesSafeMode: "這個頁面是用 ?safe=1 開啟的:不顯示 agent 的主題。",
|
|
812
859
|
widgetTitle: "你的側邊欄小工具",
|
|
813
|
-
widgetLead: "
|
|
860
|
+
widgetLead: "agent 清單下方的小面板,用 JSON 撰寫。",
|
|
814
861
|
widgetNotJson: "不是 JSON。",
|
|
815
862
|
widgetSave: "儲存小工具",
|
|
816
863
|
widgetSaved: "已儲存側邊欄小工具。",
|
|
@@ -818,7 +865,7 @@ register("settings", {
|
|
|
818
865
|
widgetRemove: "移除小工具",
|
|
819
866
|
widgetRemoved: "已移除側邊欄小工具。",
|
|
820
867
|
modsTitle: "Mod",
|
|
821
|
-
modsLead: "
|
|
868
|
+
modsLead: "只套用你勾選的部分。",
|
|
822
869
|
modsLoadFailed: "無法載入已安裝的 mod。請重新載入頁面再試一次。",
|
|
823
870
|
modsNone: "尚未安裝任何 mod。",
|
|
824
871
|
modChoose: "匯入 mod 檔案…",
|
|
@@ -829,6 +876,7 @@ register("settings", {
|
|
|
829
876
|
modReplace: "取代已安裝的 {0} 版",
|
|
830
877
|
modPartTheme: "主題(顏色、字型、圖片)",
|
|
831
878
|
modPartIdentity: "身分卡文字(標語與簡介)",
|
|
879
|
+
modPartAmbient: "環境效果(飄落、上升、閃爍或點擊符號)",
|
|
832
880
|
modPartWidget_chat_header: "聊天標頭小工具",
|
|
833
881
|
modPartWidget_details: "詳細資料頁小工具",
|
|
834
882
|
modPartWidget_sidebar: "你的側邊欄小工具",
|
|
@@ -855,7 +903,7 @@ register("settings", {
|
|
|
855
903
|
modUninstallConfirm: "要解除安裝 {0} 嗎?它的效果會離開你的效果庫,除非還有東西在使用。它已套用的外觀會保留。",
|
|
856
904
|
modUninstalled: "已解除安裝 {0}。",
|
|
857
905
|
modExport: "匯出 mod",
|
|
858
|
-
modExportLead: "
|
|
906
|
+
modExportLead: "把目前生效的外觀存成 mod 檔。",
|
|
859
907
|
modExportInstance: "Agent",
|
|
860
908
|
modExportName: "名稱(a-z、0-9、-)",
|
|
861
909
|
modExportVersion: "版本",
|
|
@@ -867,7 +915,7 @@ register("settings", {
|
|
|
867
915
|
modReview: "檢視",
|
|
868
916
|
modDismiss: "略過",
|
|
869
917
|
cssTitle: "自訂 CSS(只套用在你自己)",
|
|
870
|
-
cssLead: "
|
|
918
|
+
cssLead: "只套用在你的畫面。",
|
|
871
919
|
cssLoadFailed: "無法載入你的自訂 CSS。請重新整理頁面再試一次。",
|
|
872
920
|
cssPublicLink: "臨時公開連結無法使用自訂 CSS。",
|
|
873
921
|
cssInForce: "使用中:{0}",
|
|
@@ -880,15 +928,14 @@ register("settings", {
|
|
|
880
928
|
cssCurrent: "使用中",
|
|
881
929
|
cssRestore: "改用這版",
|
|
882
930
|
cssAssets: "資源",
|
|
883
|
-
cssAssetsLead: "
|
|
931
|
+
cssAssetsLead: "{0} / {1} 個檔案,合計 {2}(全部合計最多 1 MiB)。",
|
|
884
932
|
cssAssetAdd: "加入圖片或字型",
|
|
885
933
|
cssAssetCopy: "複製引用",
|
|
886
934
|
cssCopied: "已複製 {0}",
|
|
887
935
|
cssAssetRemove: "移除",
|
|
888
936
|
cssDeviceTitle: "這台裝置",
|
|
889
937
|
cssDeviceOff: "在這台裝置關閉自訂 CSS",
|
|
890
|
-
|
|
891
|
-
cssSafe: "畫面被藏起來或壞掉了嗎?在任何頁面網址的最後加上 ?safe=1,就會不套用自訂 CSS 地載入。",
|
|
938
|
+
cssSafe: "畫面被藏起來?在網址後加上 ?safe=1。",
|
|
892
939
|
cssError_at_rule: "未儲存:不允許使用 {0}。",
|
|
893
940
|
cssError_url: "未儲存:url() 只能用 url(\"asset:<id>\") 引用「資源」裡的檔案。",
|
|
894
941
|
cssError_unknown_asset: "未儲存:找不到資源 {0}。請先在「資源」加入它。",
|
|
@@ -921,6 +968,28 @@ register("settings", {
|
|
|
921
968
|
webTerminalTtl: "終端機 session 分鐘數(1–20)",
|
|
922
969
|
webTerminalTtlRange: "必須是 1 到 20 之間的整數",
|
|
923
970
|
webReadOnlyTitle: "在 fleet.yaml 設定",
|
|
971
|
+
guestsTitle: "訪客", guestsReview: "檢視訪客變更",
|
|
972
|
+
guestsHint: "不是管理者的人可以用訪客身分登入網頁:在他本來就能聊天的地方傳 /web,就會私下收到登入碼。訪客只會看到在聊天中本來就能用的 agent,他的訊息僅供辨識。",
|
|
973
|
+
guestsEnabled: "訪客登入", guestsEnabledHint: "關閉:沒有人能以訪客登入,所有訪客 session 都會結束。開啟需 fleet admin 確認。",
|
|
974
|
+
guestsChat: "訪客可以聊天", guestsChatHint: "關閉:訪客可以讀他的 agent 的聊天,但不能送訊息、附加檔案、按回覆的按鈕或按取消。",
|
|
975
|
+
guestsOpenFor: "{0}({1})訪客可用的 agent", guestsOpenHint: "這個連線對所有人開放,沒有人員名單:它的訪客只能用你在這裡勾選的 agent(預設沒有)。新增 agent 需 fleet admin 確認。",
|
|
976
|
+
guestsList: "訪客帳號", guestsNone: "還沒有訪客登入過。", guestsLoadFailed: "無法載入訪客清單。",
|
|
977
|
+
guestFacts: "agent:{0} · session:{1} · 記住的瀏覽器:{2}", guestLastActive: "最後使用 {0}", guestNotSignedIn: "目前未登入",
|
|
978
|
+
guestNotNarrowed: "可用他在聊天中能用的所有 agent。", guestNarrowedTo: "已縮小為:{0}", guestNothing: "無",
|
|
979
|
+
guestNarrow: "縮小範圍", guestNotReachable: "(已無法使用)", guestReachesNothing: "這個帳號目前在聊天中沒有能用的 agent,沒有可以縮小的範圍。", guestNarrowLift: "取消縮小", guestNarrowHint: "勾選這位訪客仍可使用的 agent。縮小只會拿走權限(立即生效);放寬或取消縮小需 fleet admin 確認。",
|
|
980
|
+
guestSignOut: "登出", guestSignOutTitle: "登出這位訪客?", guestSignOutConfirm: "{0} 的訪客 session 會立即結束,登入碼失效,記住的瀏覽器也會被忘記。訪客登入開啟期間,他可以再傳 /web 登入。",
|
|
981
|
+
guestSignedOut: "已登出 {0}。", guestSignedOutNotDurable: "已暫時登出 {0},但無法保存:重新啟動後他的 session 可能會恢復。", guestSignOutFailed: "沒有成功,請再試一次。",
|
|
982
|
+
vaTitle: "網頁授權", vaReview: "檢視網頁授權變更",
|
|
983
|
+
vaHint: "已登入的 fleet 管理者從網頁送出的訊息,是否帶有他本人帳號的授權,記錄在每則訊息的送達收據中。用私下傳給該帳號的登入碼、透過直接連線的 dashboard 登入的 session,要在 Discord 或 Telegram 上授權一次;公開連結與訪客一律不行。一般的網頁請求,agent 本來就會照做;發布、破壞性操作、花費、密鑰,或把授權交給別人,則需要它。",
|
|
984
|
+
vaLoadFailed: "無法載入網頁授權。",
|
|
985
|
+
vaEnabled: "網頁訊息帶有授權", vaEnabledHint: "預設開啟:session 要等它的帳號在 Discord 或 Telegram 上確認後才帶有授權。關閉:網頁訊息都不帶授權,已給出的授權立即視為無;關閉前給出的授權不會恢復。",
|
|
986
|
+
vaStuckOff: "網頁授權目前是關閉的:它的狀態無法存到這台電腦上(請看 fleet 紀錄)。可以存入後會自動恢復。",
|
|
987
|
+
vaLoopbackOnly: "只有這台電腦可以授權", vaLoopbackOnlyHint: "開啟:只有這台電腦上的瀏覽器符合,網路或 tailnet 上的不算,之前從其他地方給出的授權視為無。再關掉也不會讓那些授權恢復。",
|
|
988
|
+
vaLanWarning: "dashboard 也接受 {0} 的連線(web.allowed_hosts)。任何人只要從那裡連上、又拿到被盜的登入,就能以你的名義給出授權。除非你信任所有能連到那裡的人,否則請開啟「只有這台電腦可以授權」。",
|
|
989
|
+
vaHours: "一次授權的有效期(小時,{0}–{1})", vaHoursRange: "必須是 1 到 48 之間的數字",
|
|
990
|
+
vaSessionsTitle: "已授權的 session", vaSessionsNone: "目前沒有已授權的 session。", vaSessionUntil: "{0} 授權 · 到 {1}",
|
|
991
|
+
vaRevoke: "撤銷網頁授權", vaRevokeTitle: "撤銷所有網頁授權?", vaRevokeConfirm: "到目前為止從網頁給出的授權,從現在起都視為無,所有 session 的授權也會結束。不會登出任何人:session 再授權一次後,送出的訊息會再帶有授權。",
|
|
992
|
+
vaRevoked: "已撤銷到目前為止的網頁授權。", vaRevokedNotDurable: "已暫時撤銷,但無法保存:在可以保存之前網頁授權會保持關閉,而在那之前重新啟動會讓這次撤銷失效。", vaRevokeFailed: "沒有成功,請再試一次。",
|
|
924
993
|
webReadOnlyLead: "這裡僅供檢視:這些設定決定儀表板監聽和公開的內容。請編輯 fleet.yaml 後執行 agend reload(web.preview_port 與 web.preview_origin 需要重新啟動 AgEnD)。",
|
|
925
994
|
notSet: "未設定(預設)",
|
|
926
995
|
defaultsTitle: "預設值",
|
|
@@ -969,7 +1038,19 @@ register("settings", {
|
|
|
969
1038
|
discardOnLeave: "要捨棄 {0} 項尚未套用的變更嗎?",
|
|
970
1039
|
applyBusyLocal: "還有一次套用在進行中——請等它完成。",
|
|
971
1040
|
applyStepFailed: "在某項變更停下:{0}。之後的變更沒有套用,已重新暫存。",
|
|
972
|
-
|
|
1041
|
+
applyError_unsupported_sensitive_effect: "它改到的設定無法在確認中安全顯示,所以什麼都沒有改",
|
|
1042
|
+
applyError_confirmation_diff_too_large: "一次要確認的內容太多;請分幾次套用",
|
|
1043
|
+
applyError_session_required: "你的登入已經結束;請重新登入再套用",
|
|
1044
|
+
applyError_admin_required: "只有 fleet 管理者能確認它",
|
|
1045
|
+
applyError_settings_changed: "設定在這期間被改過了;請檢查後再套用一次",
|
|
1046
|
+
applyError_request_no_longer_current: "設定在這期間被改過了;請檢查後再套用一次",
|
|
1047
|
+
applyError_too_many_pending_changes: "等待確認的變更太多;請先確認或撤回一些",
|
|
1048
|
+
applyError_fleet_unavailable: "fleet 沒有在執行",
|
|
1049
|
+
applyError_invalid_settings_effect: "改完的結果不是有效的設定",
|
|
1050
|
+
applyError_settings_confirmation_unavailable: "無法建立它的確認;請再試一次",
|
|
1051
|
+
applyError_failed: "伺服器無法套用它",
|
|
1052
|
+
applyErrorOther: "伺服器拒絕了它({0})",
|
|
1053
|
+
stepWaiting: "等待確認",
|
|
973
1054
|
stepSkipped: "未套用",
|
|
974
1055
|
viaRestart: "(重新啟動)",
|
|
975
1056
|
format: "格式",
|
|
@@ -986,7 +1067,6 @@ register("settings", {
|
|
|
986
1067
|
discordUserPlaceholder: "你的 Discord 使用者 id",
|
|
987
1068
|
telegramUserPlaceholder: "你的 Telegram 使用者 id",
|
|
988
1069
|
bindingApplyButton: "改綁",
|
|
989
|
-
webEchoEnable: "開啟網頁轉發",
|
|
990
1070
|
help1: "Agent:每個 agent 的設定、啟動/停止、暫停/喚醒,以及新增 agent。",
|
|
991
1071
|
help2: "連線:誰可以使用各個 bot、它的綁定、狀態表情、新的 token;以及供應商 API key。",
|
|
992
1072
|
help3: "ClassicBot:每個房間的 backend、model 與選項。",
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// #1939 S2a: Settings → Web → Web authority — whether a signed-in admin's web messages carry their account's authority
|
|
2
|
+
// in delivery receipts (docs/design/1939-verified-web-sessions.md §0, §0.1, §3, §10): the server switch (on by default),
|
|
3
|
+
// "Only this computer can authorize", how long a session's authorization lasts, the sessions authorized now, and "Revoke
|
|
4
|
+
// web authority". Changes go through Review changes → Apply like every Settings edit, and apply at once (§0.1: none of
|
|
5
|
+
// them grants anything by itself — a session still needs its account's Confirm in Discord or Telegram).
|
|
6
|
+
import { html, useEffect, useState } from "/assets/app-html.js";
|
|
7
|
+
import { t } from "/assets/app-i18n.js";
|
|
8
|
+
import { toast } from "/assets/ui-toast.js";
|
|
9
|
+
import { confirmDialog } from "/assets/ui-confirm.js";
|
|
10
|
+
import { api } from "./settings-confirm.js";
|
|
11
|
+
import { Feedback } from "./settings-dialogs.js";
|
|
12
|
+
import { resetWebAuthorization } from "/assets/web-authorize.js";
|
|
13
|
+
import "./settings-strings.js";
|
|
14
|
+
|
|
15
|
+
const tn = (k, ...v) => t(`settings.${k}`, ...v);
|
|
16
|
+
|
|
17
|
+
/** What changed against what fleet.yaml says, as the PUT /api/settings/fleet/web body's `verified_authority` (null: nothing). */
|
|
18
|
+
export function verifiedAuthorityBody(original, f) {
|
|
19
|
+
const out = {};
|
|
20
|
+
if (f.enabled !== original.enabled) out.enabled = f.enabled ? null : false; // §0.1: on is the default
|
|
21
|
+
if (f.loopbackOnly !== original.loopbackOnly) out.loopback_only = f.loopbackOnly ? true : null;
|
|
22
|
+
if (f.hours !== original.hours) out.max_session_hours = f.hours === null ? null : f.hours;
|
|
23
|
+
return Object.keys(out).length ? out : null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function WebAuthorityCard({ ctx, staged, disabled = false }) {
|
|
27
|
+
const [overview, setOverview] = useState(null), [failed, setFailed] = useState(false);
|
|
28
|
+
const [original, setOriginal] = useState(null), [f, setF] = useState(null), [msg, setMsg] = useState(null);
|
|
29
|
+
const load = async () => {
|
|
30
|
+
// What changes here (a revoke, the switch) changes this browser's own line: the chat reads it again when it shows.
|
|
31
|
+
resetWebAuthorization();
|
|
32
|
+
let r = null;
|
|
33
|
+
try { r = await api("/api/settings/web-authority"); } catch { r = null; }
|
|
34
|
+
// Anything but the overview's shape (an older server, an error page) is "could not be loaded", never a crash.
|
|
35
|
+
const o = r && r.ok ? r.body : null;
|
|
36
|
+
if (!o || typeof o !== "object" || !o.state || !o.hours || !Array.isArray(o.lanHosts) || !Array.isArray(o.authorized)) { setFailed(true); return; }
|
|
37
|
+
const c = o.configured || {};
|
|
38
|
+
const orig = { enabled: c.enabled !== false, loopbackOnly: c.loopback_only === true, hours: typeof c.max_session_hours === "number" ? c.max_session_hours : null };
|
|
39
|
+
setOverview(o); setFailed(false);
|
|
40
|
+
setOriginal((prev) => prev || orig);
|
|
41
|
+
setF((prev) => prev || { ...orig });
|
|
42
|
+
};
|
|
43
|
+
useEffect(() => { load(); }, []);
|
|
44
|
+
const card = (body) => html`<section class="card s-web-authority"><h3>${tn("vaTitle")}</h3><p class="note">${tn("vaHint")}</p>${body}</section>`;
|
|
45
|
+
if (failed) return card(html`<p class="note" role="status">${tn("vaLoadFailed")} <button type="button" class="btn btn-sm" onClick=${load}>${t("app.retry")}</button></p>`);
|
|
46
|
+
if (!overview || !f) return card(html`<p class="note">${t("app.loading")}</p>`);
|
|
47
|
+
|
|
48
|
+
const set = (patch) => setF((x) => ({ ...x, ...patch }));
|
|
49
|
+
const hoursText = f.hours === null ? "" : String(f.hours);
|
|
50
|
+
const hoursError = f.hours !== null && (!Number.isFinite(f.hours) || f.hours < overview.hours.min || f.hours > overview.hours.max) ? "vaHoursRange" : "";
|
|
51
|
+
const stuckOff = f.enabled && original.enabled && !overview.state.enabled;
|
|
52
|
+
const warnHosts = !f.loopbackOnly && overview.lanHosts.length > 0;
|
|
53
|
+
const when = (ms) => new Date(ms).toLocaleString();
|
|
54
|
+
|
|
55
|
+
const review = () => {
|
|
56
|
+
if (hoursError) return;
|
|
57
|
+
const body = verifiedAuthorityBody(original, f);
|
|
58
|
+
if (body) ctx.stage("verified_authority", { label: tn("vaTitle"), impact: "now", request: { method: "PUT", url: "/api/settings/fleet/web", body: { verified_authority: body } } });
|
|
59
|
+
else if (staged.has("verified_authority")) ctx.unstage("verified_authority");
|
|
60
|
+
setMsg(tn("readyApply"));
|
|
61
|
+
};
|
|
62
|
+
const revoke = async () => {
|
|
63
|
+
const yes = await confirmDialog({ title: tn("vaRevokeTitle"), message: tn("vaRevokeConfirm"), confirmLabel: tn("vaRevoke"), danger: true });
|
|
64
|
+
if (!yes) return;
|
|
65
|
+
let r = null;
|
|
66
|
+
try { r = await api("/api/settings/web-authority/revoke", { method: "POST", body: "{}" }); } catch { r = null; }
|
|
67
|
+
if (r && r.ok) { toast(tn(r.body && r.body.durable === false ? "vaRevokedNotDurable" : "vaRevoked")); load(); }
|
|
68
|
+
else toast(tn("vaRevokeFailed"), false);
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
return card(html`<fieldset class="s-va-fields" disabled=${disabled}>
|
|
72
|
+
${stuckOff ? html`<p class="note s-va-warn" role="status" id="vaStuckOff">${tn("vaStuckOff")}</p>` : null}
|
|
73
|
+
<label class="check"><input id="vaEnabled" type="checkbox" checked=${f.enabled} onChange=${(e) => set({ enabled: e.target.checked })} /><span>${tn("vaEnabled")}</span></label>
|
|
74
|
+
<p class="note">${tn("vaEnabledHint")}</p>
|
|
75
|
+
<label class="check"><input id="vaLoopbackOnly" type="checkbox" checked=${f.loopbackOnly} onChange=${(e) => set({ loopbackOnly: e.target.checked })} /><span>${tn("vaLoopbackOnly")}</span></label>
|
|
76
|
+
<p class="note">${tn("vaLoopbackOnlyHint")}</p>
|
|
77
|
+
${warnHosts ? html`<p class="note s-va-warn" role="status" id="vaLanWarning">${tn("vaLanWarning", overview.lanHosts.join(", "))}</p>` : null}
|
|
78
|
+
<div class="field"><label for="vaHours">${tn("vaHours", overview.hours.min, overview.hours.max)}</label>
|
|
79
|
+
<input id="vaHours" type="number" min=${overview.hours.min} max=${overview.hours.max} step="any" placeholder=${tn("defaultHours", overview.hours.default)}
|
|
80
|
+
class=${hoursError ? "invalid" : ""} value=${hoursText} onInput=${(e) => set({ hours: e.target.value.trim() === "" ? null : Number(e.target.value) })} />
|
|
81
|
+
<${Feedback} error=${hoursError} /></div>
|
|
82
|
+
<h4>${tn("vaSessionsTitle")}</h4>
|
|
83
|
+
${overview.authorized.length
|
|
84
|
+
? html`<ul class="s-va-sessions" id="vaSessions">${overview.authorized.map((a) => html`<li key=${a.handle} data-handle=${a.handle}>
|
|
85
|
+
<strong>${a.label}</strong> <span class="note">${a.account}</span><br /><span class="note">${tn("vaSessionUntil", when(a.authorizedAt), when(a.until))}</span></li>`)}</ul>`
|
|
86
|
+
: html`<p class="note" id="vaSessionsNone">${tn("vaSessionsNone")}</p>`}
|
|
87
|
+
</fieldset>
|
|
88
|
+
<div class="save-row"><button type="button" class="btn btn-primary" id="vaReview" disabled=${disabled || !!hoursError} onClick=${review}>${tn("vaReview")}</button>
|
|
89
|
+
<button type="button" class="btn btn-danger" id="vaRevoke" disabled=${disabled} onClick=${revoke}>${tn("vaRevoke")}</button>
|
|
90
|
+
${msg ? html`<span class="note" role="status">${msg}</span>` : null}</div>`);
|
|
91
|
+
}
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
bar.setAttribute("role", "alert");
|
|
68
68
|
bar.setAttribute("data-trust", "session-ended");
|
|
69
69
|
bar.className = "agend-session-ended";
|
|
70
|
-
bar.style.cssText = "position:fixed;top:0;left:0;right:0;z-index:2147483647;padding:10px 16px;background:#f85149;color:#fff;font:14px system-ui,sans-serif;text-align:center";
|
|
70
|
+
bar.style.cssText = "position:fixed;top:0;left:0;right:0;z-index:2147483647;padding:10px 16px;background:#f85149;color:#fff;font:14px system-ui,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\",emoji;text-align:center";
|
|
71
71
|
const zh = /^zh/i.test(navigator.language || "");
|
|
72
72
|
bar.append(document.createTextNode(zh ? "登入已結束。" : "Your session has ended. "));
|
|
73
73
|
const link = document.createElement("a");
|