@songsid/agend 2.2.0-beta.9 → 2.3.0-beta.1
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 +40 -24
- package/README.zh-TW.md +40 -24
- package/dist/agent-cli.js +248 -2
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-endpoint.d.ts +2 -0
- package/dist/agent-endpoint.js +28 -0
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/agent-file-read.d.ts +30 -0
- package/dist/agent-file-read.js +129 -0
- package/dist/agent-file-read.js.map +1 -0
- package/dist/agent-whats-new.js +20 -1
- package/dist/agent-whats-new.js.map +1 -1
- package/dist/atomic-write.js +9 -1
- package/dist/atomic-write.js.map +1 -1
- package/dist/auth-api.d.ts +3 -1
- package/dist/auth-api.js +32 -1
- package/dist/auth-api.js.map +1 -1
- package/dist/backend/antigravity.d.ts +33 -0
- package/dist/backend/antigravity.js +129 -21
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/claude-code.d.ts +3 -0
- package/dist/backend/claude-code.js +9 -0
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex-metadata.d.ts +33 -0
- package/dist/backend/codex-metadata.js +122 -18
- package/dist/backend/codex-metadata.js.map +1 -1
- package/dist/backend/codex.d.ts +3 -0
- package/dist/backend/codex.js +17 -1
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/effort-metadata.d.ts +37 -1
- package/dist/backend/effort-metadata.js +86 -15
- package/dist/backend/effort-metadata.js.map +1 -1
- package/dist/backend/grok.d.ts +3 -0
- package/dist/backend/grok.js +9 -0
- package/dist/backend/grok.js.map +1 -1
- package/dist/backend/kiro.d.ts +3 -1
- package/dist/backend/kiro.js +7 -3
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/launch-effort.d.ts +61 -0
- package/dist/backend/launch-effort.js +170 -0
- package/dist/backend/launch-effort.js.map +1 -0
- package/dist/backend/muse.js +10 -2
- package/dist/backend/muse.js.map +1 -1
- package/dist/backend/types.d.ts +24 -0
- package/dist/backend/types.js +12 -1
- package/dist/backend/types.js.map +1 -1
- package/dist/backend-command.d.ts +91 -0
- package/dist/backend-command.js +122 -0
- package/dist/backend-command.js.map +1 -0
- package/dist/channel/adapters/discord.d.ts +14 -0
- package/dist/channel/adapters/discord.js +66 -4
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +26 -1
- package/dist/channel/adapters/telegram.js +98 -7
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/mcp-tools.js +36 -0
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/tool-router.d.ts +2 -0
- package/dist/channel/tool-router.js +1 -1
- package/dist/channel/tool-router.js.map +1 -1
- package/dist/channel/types.d.ts +31 -0
- package/dist/cli.js +124 -24
- package/dist/cli.js.map +1 -1
- package/dist/command-table.d.ts +2 -2
- package/dist/command-table.js +5 -2
- package/dist/command-table.js.map +1 -1
- package/dist/compact-watch.d.ts +86 -0
- package/dist/compact-watch.js +288 -0
- package/dist/compact-watch.js.map +1 -0
- package/dist/config-validator.js +55 -0
- package/dist/config-validator.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.js +2 -1
- package/dist/config.js.map +1 -1
- package/dist/daemon.d.ts +9 -0
- package/dist/daemon.js +394 -29
- package/dist/daemon.js.map +1 -1
- package/dist/delivery-outbox.d.ts +8 -1
- package/dist/delivery-outbox.js +6 -2
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/doctor.js +7 -0
- package/dist/doctor.js.map +1 -1
- package/dist/fleet-context.d.ts +12 -0
- package/dist/fleet-manager.d.ts +247 -9
- package/dist/fleet-manager.js +1227 -142
- package/dist/fleet-manager.js.map +1 -1
- package/dist/forged-envelope-scan.d.ts +4 -3
- package/dist/forged-envelope-scan.js +4 -3
- package/dist/forged-envelope-scan.js.map +1 -1
- package/dist/general-knowledge/skills/model-discovery/SKILL.md +4 -1
- package/dist/general-knowledge/skills/web-appearance/SKILL.md +258 -0
- package/dist/install-lock.d.ts +18 -1
- package/dist/install-lock.js +30 -3
- package/dist/install-lock.js.map +1 -1
- package/dist/instance-avatar.d.ts +5 -4
- package/dist/instance-avatar.js +15 -8
- package/dist/instance-avatar.js.map +1 -1
- package/dist/instance-config-impact.js +3 -0
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.js +9 -4
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instructions.js +2 -2
- package/dist/instructions.js.map +1 -1
- package/dist/kiro-compact-pane.d.ts +38 -0
- package/dist/kiro-compact-pane.js +57 -0
- package/dist/kiro-compact-pane.js.map +1 -0
- package/dist/launchd-handoff.d.ts +43 -0
- package/dist/launchd-handoff.js +56 -0
- package/dist/launchd-handoff.js.map +1 -0
- package/dist/locale.js +202 -30
- package/dist/locale.js.map +1 -1
- package/dist/log-service.js +10 -2
- package/dist/log-service.js.map +1 -1
- package/dist/login-shell.d.ts +21 -0
- package/dist/login-shell.js +98 -0
- package/dist/login-shell.js.map +1 -0
- package/dist/needs-you-hub.d.ts +4 -0
- package/dist/needs-you-hub.js +31 -6
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you.d.ts +1 -13
- package/dist/needs-you.js +3 -37
- package/dist/needs-you.js.map +1 -1
- package/dist/outbound-handlers.d.ts +32 -0
- package/dist/outbound-handlers.js +150 -45
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +76 -0
- package/dist/outbound-schemas.js +65 -4
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/provider-probe.d.ts +29 -0
- package/dist/provider-probe.js +198 -2
- package/dist/provider-probe.js.map +1 -1
- package/dist/public-web-gateway.d.ts +2 -0
- package/dist/public-web-gateway.js +25 -1
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/quickstart-api.d.ts +1 -1
- package/dist/quickstart-api.js +8 -6
- package/dist/quickstart-api.js.map +1 -1
- package/dist/quickstart.d.ts +12 -0
- package/dist/quickstart.js +36 -6
- package/dist/quickstart.js.map +1 -1
- package/dist/reply-buttons-controller.d.ts +86 -5
- package/dist/reply-buttons-controller.js +271 -7
- package/dist/reply-buttons-controller.js.map +1 -1
- package/dist/reply-buttons.d.ts +48 -3
- package/dist/reply-buttons.js +105 -10
- package/dist/reply-buttons.js.map +1 -1
- package/dist/reply-polls.d.ts +85 -0
- package/dist/reply-polls.js +154 -0
- package/dist/reply-polls.js.map +1 -0
- package/dist/repo-worktree-guard.d.ts +36 -0
- package/dist/repo-worktree-guard.js +143 -0
- package/dist/repo-worktree-guard.js.map +1 -0
- package/dist/restart-guard.d.ts +6 -3
- package/dist/restart-guard.js +6 -3
- package/dist/restart-guard.js.map +1 -1
- package/dist/restart-progress.d.ts +0 -2
- package/dist/restart-progress.js +0 -2
- package/dist/restart-progress.js.map +1 -1
- package/dist/scheduler/scheduler.d.ts +58 -1
- package/dist/scheduler/scheduler.js +176 -10
- package/dist/scheduler/scheduler.js.map +1 -1
- package/dist/sd-notify.d.ts +22 -1
- package/dist/sd-notify.js +63 -10
- package/dist/sd-notify.js.map +1 -1
- package/dist/service-activation.d.ts +15 -7
- package/dist/service-activation.js +42 -26
- package/dist/service-activation.js.map +1 -1
- package/dist/service-installer.d.ts +24 -0
- package/dist/service-installer.js +49 -1
- package/dist/service-installer.js.map +1 -1
- package/dist/service-plan.d.ts +11 -0
- package/dist/service-plan.js +23 -0
- package/dist/service-plan.js.map +1 -1
- package/dist/settings-api.js +74 -1
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-change.js +8 -0
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-effect.js +16 -2
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.js +5 -0
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/systemd-peer-bus.d.ts +95 -0
- package/dist/systemd-peer-bus.js +430 -0
- package/dist/systemd-peer-bus.js.map +1 -0
- package/dist/systemd-runtime.d.ts +27 -1
- package/dist/systemd-runtime.js +69 -7
- package/dist/systemd-runtime.js.map +1 -1
- package/dist/tool-permissions.js +53 -3
- package/dist/tool-permissions.js.map +1 -1
- package/dist/topic-commands.d.ts +72 -2
- package/dist/topic-commands.js +156 -38
- package/dist/topic-commands.js.map +1 -1
- package/dist/topic-link.d.ts +128 -0
- package/dist/topic-link.js +269 -0
- package/dist/topic-link.js.map +1 -0
- package/dist/transcript-jsonl.d.ts +7 -2
- package/dist/transcript-jsonl.js +13 -7
- package/dist/transcript-jsonl.js.map +1 -1
- package/dist/transcript-sources.js +6 -1
- package/dist/transcript-sources.js.map +1 -1
- package/dist/types.d.ts +21 -0
- package/dist/ui/app-effects.js +187 -0
- package/dist/ui/chat-commands.js +1 -0
- package/dist/ui/chat-effect-posters.js +42 -0
- package/dist/ui/chat-effects.js +72 -0
- package/dist/ui/chat-live-replies.js +58 -0
- package/dist/ui/chat-render.js +59 -14
- package/dist/ui/chat-store.js +78 -8
- package/dist/ui/chat-strings.js +43 -16
- package/dist/ui/chat-thread.js +175 -31
- package/dist/ui/chat-tour.js +18 -15
- package/dist/ui/effect-trial-controller.js +119 -0
- package/dist/ui/effect-trial-offer.js +31 -0
- package/dist/ui/effect-trial-panel.js +37 -0
- package/dist/ui/image-lightbox.js +1 -1
- package/dist/ui/panel-chat.js +101 -27
- package/dist/ui/panel-details.js +18 -5
- package/dist/ui/panel-fleet.js +18 -5
- package/dist/ui/panel-log.js +10 -10
- package/dist/ui/panel-needs.js +13 -10
- package/dist/ui/panel-settings.js +66 -12
- package/dist/ui/preview-panel.js +25 -9
- package/dist/ui/settings-appearance.js +325 -0
- package/dist/ui/settings-dialogs.js +11 -6
- package/dist/ui/settings-effects.js +201 -0
- package/dist/ui/settings-model.js +3 -1
- package/dist/ui/settings-mods.js +257 -0
- package/dist/ui/settings-owner-effects.js +80 -0
- package/dist/ui/settings-strings.js +269 -10
- package/dist/ui/settings-token.js +7 -0
- package/dist/ui/settings-wizard.js +5 -3
- package/dist/ui/shared/agend-auth.js +27 -3
- package/dist/ui/shared/agent-widget.js +248 -0
- package/dist/ui/shared/app-i18n.js +3 -1
- package/dist/ui/shared/app-prefs.js +30 -10
- package/dist/ui/shared/app-route.js +23 -1
- package/dist/ui/shared/app-session.js +1 -1
- package/dist/ui/shared/app-shell.js +29 -16
- package/dist/ui/shared/app-store.js +2 -0
- package/dist/ui/shared/app-stream.js +15 -7
- package/dist/ui/shared/app-themes.js +188 -0
- package/dist/ui/shared/app.css +266 -11
- package/dist/ui/shared/app.js +6 -0
- package/dist/ui/shared/card-strings.js +28 -0
- package/dist/ui/shared/effect-app-runtime.js +248 -0
- package/dist/ui/shared/effect-baseline.js +64 -0
- package/dist/ui/shared/effect-chat-runtime.js +154 -0
- package/dist/ui/shared/effect-cursor.js +125 -0
- package/dist/ui/shared/effect-frame.js +127 -0
- package/dist/ui/shared/effect-geometry.js +122 -0
- package/dist/ui/shared/effect-host-style.js +10 -0
- package/dist/ui/shared/effect-owner-regions.js +74 -0
- package/dist/ui/shared/effect-owner-source.js +115 -0
- package/dist/ui/shared/effect-policy.js +137 -0
- package/dist/ui/shared/effect-poster-reader.js +98 -0
- package/dist/ui/shared/effect-posters.js +117 -0
- package/dist/ui/shared/effect-profiler.js +162 -0
- package/dist/ui/shared/effect-profiles.js +65 -0
- package/dist/ui/shared/effect-registry.js +496 -0
- package/dist/ui/shared/effect-runtime-loader.js +234 -0
- package/dist/ui/shared/effect-safety.js +153 -0
- package/dist/ui/shared/effect-stock-snapshot.js +34 -0
- package/dist/ui/shared/effect-stock-trust.js +165 -0
- package/dist/ui/shared/effect-trial-source.js +103 -0
- package/dist/ui/shared/effect-trial-stage.js +147 -0
- package/dist/ui/shared/header-tools.js +35 -15
- package/dist/ui/shared/identity-card.js +202 -0
- package/dist/ui/shared/identity-color.js +261 -0
- package/dist/ui/shared/instance-nav.js +22 -14
- package/dist/ui/shared/instance-switch.js +5 -2
- package/dist/ui/shared/owner-css.js +221 -0
- package/dist/ui/shared/owner-effect-prefs.js +117 -0
- package/dist/ui/shared/panel-view.js +96 -12
- package/dist/ui/shared/signin.js +17 -9
- package/dist/ui/shared/ui-dialog.js +1 -1
- package/dist/ui/shared/ui-icons.js +3 -0
- package/dist/ui/shared/ui-menu.js +1 -1
- package/dist/ui/shared/ui-toast.js +1 -1
- package/dist/ui/shared/view-strings.js +40 -2
- package/dist/ui/signin.html +9 -3
- package/dist/update-check.d.ts +31 -0
- package/dist/update-check.js +47 -0
- package/dist/update-check.js.map +1 -1
- package/dist/update-launch.d.ts +48 -1
- package/dist/update-launch.js +159 -5
- package/dist/update-launch.js.map +1 -1
- package/dist/usage/providers.d.ts +28 -8
- package/dist/usage/providers.js +96 -41
- package/dist/usage/providers.js.map +1 -1
- package/dist/view-api.d.ts +29 -0
- package/dist/view-api.js +214 -17
- package/dist/view-api.js.map +1 -1
- package/dist/web-api.d.ts +86 -2
- package/dist/web-api.js +1160 -92
- package/dist/web-api.js.map +1 -1
- package/dist/web-appearance-limits.d.ts +82 -0
- package/dist/web-appearance-limits.js +83 -0
- package/dist/web-appearance-limits.js.map +1 -0
- package/dist/web-appearance-policy.d.ts +66 -0
- package/dist/web-appearance-policy.js +94 -0
- package/dist/web-appearance-policy.js.map +1 -0
- package/dist/web-appearance-tools.d.ts +50 -0
- package/dist/web-appearance-tools.js +105 -0
- package/dist/web-appearance-tools.js.map +1 -0
- package/dist/web-appearance-view.d.ts +99 -0
- package/dist/web-appearance-view.js +163 -0
- package/dist/web-appearance-view.js.map +1 -0
- package/dist/web-appearance.d.ts +79 -0
- package/dist/web-appearance.js +298 -0
- package/dist/web-appearance.js.map +1 -0
- package/dist/web-asset-parts.d.ts +98 -0
- package/dist/web-asset-parts.js +133 -0
- package/dist/web-asset-parts.js.map +1 -0
- package/dist/web-auth.js +17 -1
- package/dist/web-auth.js.map +1 -1
- package/dist/web-card.d.ts +96 -0
- package/dist/web-card.js +232 -0
- package/dist/web-card.js.map +1 -0
- package/dist/web-chat-history.d.ts +39 -1
- package/dist/web-chat-history.js +69 -9
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-commands.d.ts +39 -3
- package/dist/web-commands.js +22 -5
- package/dist/web-commands.js.map +1 -1
- package/dist/web-effect-bundle.d.ts +28 -0
- package/dist/web-effect-bundle.js +126 -0
- package/dist/web-effect-bundle.js.map +1 -0
- package/dist/web-effect-canonical.d.ts +8 -0
- package/dist/web-effect-canonical.js +27 -0
- package/dist/web-effect-canonical.js.map +1 -0
- package/dist/web-effect-library.d.ts +114 -0
- package/dist/web-effect-library.js +530 -0
- package/dist/web-effect-library.js.map +1 -0
- package/dist/web-effect-poster.d.ts +8 -0
- package/dist/web-effect-poster.js +52 -0
- package/dist/web-effect-poster.js.map +1 -0
- package/dist/web-effect-profiles.d.ts +118 -0
- package/dist/web-effect-profiles.js +180 -0
- package/dist/web-effect-profiles.js.map +1 -0
- package/dist/web-effect-service.d.ts +86 -0
- package/dist/web-effect-service.js +312 -0
- package/dist/web-effect-service.js.map +1 -0
- package/dist/web-effect-tools.d.ts +47 -0
- package/dist/web-effect-tools.js +126 -0
- package/dist/web-effect-tools.js.map +1 -0
- package/dist/web-effect-trials.d.ts +86 -0
- package/dist/web-effect-trials.js +204 -0
- package/dist/web-effect-trials.js.map +1 -0
- package/dist/web-effect-upload.d.ts +29 -0
- package/dist/web-effect-upload.js +190 -0
- package/dist/web-effect-upload.js.map +1 -0
- package/dist/web-effect-worker.d.ts +8 -0
- package/dist/web-effect-worker.js +170 -0
- package/dist/web-effect-worker.js.map +1 -0
- package/dist/web-effect.d.ts +89 -0
- package/dist/web-effect.js +132 -0
- package/dist/web-effect.js.map +1 -0
- package/dist/web-identity-color.d.ts +87 -0
- package/dist/web-identity-color.js +209 -0
- package/dist/web-identity-color.js.map +1 -0
- package/dist/web-identity-palette.d.ts +113 -0
- package/dist/web-identity-palette.js +84 -0
- package/dist/web-identity-palette.js.map +1 -0
- package/dist/web-image-meta.d.ts +25 -0
- package/dist/web-image-meta.js +200 -0
- package/dist/web-image-meta.js.map +1 -0
- package/dist/web-login.d.ts +14 -0
- package/dist/web-login.js +4 -2
- package/dist/web-login.js.map +1 -1
- package/dist/web-mod-agent.d.ts +50 -0
- package/dist/web-mod-agent.js +203 -0
- package/dist/web-mod-agent.js.map +1 -0
- package/dist/web-mod-bundle.d.ts +144 -0
- package/dist/web-mod-bundle.js +464 -0
- package/dist/web-mod-bundle.js.map +1 -0
- package/dist/web-mod-export.d.ts +59 -0
- package/dist/web-mod-export.js +79 -0
- package/dist/web-mod-export.js.map +1 -0
- package/dist/web-mod-store.d.ts +283 -0
- package/dist/web-mod-store.js +624 -0
- package/dist/web-mod-store.js.map +1 -0
- package/dist/web-org.d.ts +3 -3
- package/dist/web-org.js +11 -17
- package/dist/web-org.js.map +1 -1
- package/dist/web-owner-css-store.d.ts +180 -0
- package/dist/web-owner-css-store.js +384 -0
- package/dist/web-owner-css-store.js.map +1 -0
- package/dist/web-owner-css.d.ts +58 -0
- package/dist/web-owner-css.js +552 -0
- package/dist/web-owner-css.js.map +1 -0
- package/dist/web-prefs.d.ts +66 -0
- package/dist/web-prefs.js +243 -35
- package/dist/web-prefs.js.map +1 -1
- package/dist/web-preview.d.ts +9 -1
- package/dist/web-preview.js +24 -7
- package/dist/web-preview.js.map +1 -1
- package/dist/web-profile.d.ts +32 -0
- package/dist/web-profile.js +132 -0
- package/dist/web-profile.js.map +1 -0
- package/dist/web-session.d.ts +14 -0
- package/dist/web-session.js +10 -0
- package/dist/web-session.js.map +1 -1
- package/dist/web-settings-patch.d.ts +18 -0
- package/dist/web-settings-patch.js +51 -0
- package/dist/web-settings-patch.js.map +1 -1
- 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-theme-store.d.ts +218 -0
- package/dist/web-theme-store.js +516 -0
- package/dist/web-theme-store.js.map +1 -0
- package/dist/web-theme.d.ts +121 -0
- package/dist/web-theme.js +407 -0
- package/dist/web-theme.js.map +1 -0
- package/dist/web-upload.d.ts +119 -4
- package/dist/web-upload.js +252 -39
- package/dist/web-upload.js.map +1 -1
- package/dist/web-widget.d.ts +72 -0
- package/dist/web-widget.js +245 -0
- package/dist/web-widget.js.map +1 -0
- package/launcher/install-admission.cjs +61 -6
- package/package.json +3 -3
|
@@ -10,7 +10,7 @@ register("settings", {
|
|
|
10
10
|
classicChannels: "ClassicBot Channels",
|
|
11
11
|
noClassic: "No ClassicBot channels — start one with /start in a chat.",
|
|
12
12
|
publicLink: "Offer temporary public web links",
|
|
13
|
-
publicLinkHint: "Explicit admin consent on every request. Cloudflare handles TLS; link users have full web-admin access.
|
|
13
|
+
publicLinkHint: "Explicit admin consent on every request. Cloudflare handles TLS; link users have full web-admin access. HTML previews get a second temporary tunnel unless web.preview_on_public_link is false.",
|
|
14
14
|
publicTtl: "Public link minutes (1–480)",
|
|
15
15
|
publicProtocol: "Tunnel protocol",
|
|
16
16
|
webEcho: "Web echo",
|
|
@@ -164,7 +164,9 @@ register("settings", {
|
|
|
164
164
|
wizardWaitingStart: "Waiting for a message in the group…",
|
|
165
165
|
wizardNoStartYet: "No group message yet — post one and press Detect again.",
|
|
166
166
|
wizardGeneralChannel: "General channel id",
|
|
167
|
-
wizardAdminUser: "Your user
|
|
167
|
+
wizardAdminUser: "Your user ID (required; becomes the first allowed user)",
|
|
168
|
+
wizardNeedDiscordAdmin: "Enter your Discord user ID: 17–20 digits, without a leading zero.",
|
|
169
|
+
wizardNeedTelegramAdmin: "Enter your Telegram user ID: 1–20 positive digits, without a leading zero.",
|
|
168
170
|
wizardNeedVerify: "Verify the token before continuing.",
|
|
169
171
|
wizardPlanLoading: "Building the plan…",
|
|
170
172
|
wizardWillWrite: "This will be written:",
|
|
@@ -176,7 +178,7 @@ register("settings", {
|
|
|
176
178
|
deleteBot: "Delete this bot",
|
|
177
179
|
noAllowedUsers: "no allowed users",
|
|
178
180
|
searchAll: "Search agents, bots, channels…",
|
|
179
|
-
accessMovedHint: "Who may use the bot is set on the connection itself — open Settings on \"{0}\" under Connections
|
|
181
|
+
accessMovedHint: "Who may use the bot is set on the connection itself — open Settings on \"{0}\" under Connections.",
|
|
180
182
|
applyRestartNeeded: "Saved — restart AgEnD to apply",
|
|
181
183
|
applyNoChange: "no change needed",
|
|
182
184
|
applyRestartHint: "This change needs AgEnD itself restarted. You can restart it here, or run /restart in your chat channel.",
|
|
@@ -219,6 +221,11 @@ register("settings", {
|
|
|
219
221
|
staggerRange: "Must be between 0 and 30000",
|
|
220
222
|
staggerWarning: "Very low values can cause startup spikes",
|
|
221
223
|
sec_device: "Preferences", syncedTitle: "Synced across your devices", syncedLead: "Changes here apply on every device where you are signed in.",
|
|
224
|
+
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. It is for recognition only: it grants nothing.",
|
|
226
|
+
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
|
+
profileName: "Name", profileHelp: "Agents see: {0} · id {1}", profileSave: "Save", profileClear: "Use web-user", profileUseAccount: "Use {0}",
|
|
228
|
+
profileSaved: "Agents now see you as {0}", profileFailed: "Could not save the name",
|
|
222
229
|
syncedPublicLink: "On the public link these are read-only: a change here stays in this browser.",
|
|
223
230
|
deviceTitle: "This device only", deviceLead: "The tour, text size, view fit, the sidebar shown or hidden, panel widths and desktop notifications stay on each device.",
|
|
224
231
|
sec_agents: "Agents",
|
|
@@ -281,7 +288,130 @@ register("settings", {
|
|
|
281
288
|
accessTitle: "Access",
|
|
282
289
|
webChat: "Web chat",
|
|
283
290
|
sec_web: "Web",
|
|
284
|
-
|
|
291
|
+
// #1629 r4 §3: Settings → Appearance (owner CSS).
|
|
292
|
+
sec_appearance: "Web appearance",
|
|
293
|
+
colorTitle: "Identity colours", colorLead: "Each agent's colour in the sidebar: a person's pick, the agent's own, its bot's Discord role colour, or an automatic soft colour. Change one agent's from its ⋯ menu → Colour….",
|
|
294
|
+
colorPlaces: "Where colours show, unless an agent's own setting says otherwise", colorOff: "Turn off colours",
|
|
295
|
+
colorOffLead: "Hides every identity colour on this host. The colours people picked are kept, and come back when you turn colours on again.",
|
|
296
|
+
restoreTitle: "Restore defaults", restoreLead: "Puts this host's appearance settings back to their defaults. It asks first and says what it resets.",
|
|
297
|
+
restoreConfirm: "This 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 whether colours are off. It also turns your custom CSS off (its versions are kept) and its switch on this device. The colours people picked for agents, installed mods, uploaded effects and the card limits stay as they are.",
|
|
298
|
+
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
|
+
cardSizeTitle: "Identity cards",
|
|
300
|
+
cardSizeLead: "How large identity cards are drawn on all your devices. A card's own S / M / L sets that card apart.",
|
|
301
|
+
cardLimitsTitle: "Identity card upload limits",
|
|
302
|
+
cardLimitsLead: "The largest portrait and banner anyone may upload, and how many pictures each agent may keep. Empty = the default (shown greyed). A lower limit applies at once; a higher one waits for a fleet admin's confirmation. Pictures already stored stay.",
|
|
303
|
+
cardLimitsUnavailable: "Only a signed-in admin can see and change these here (or edit web.appearance in fleet.yaml).",
|
|
304
|
+
cardLimit_portrait_max_width: "Portrait width (px)", cardLimit_portrait_max_height: "Portrait height (px)", cardLimit_portrait_max_kib: "Portrait size (KiB)",
|
|
305
|
+
cardLimit_banner_max_width: "Banner width (px)", cardLimit_banner_max_height: "Banner height (px)", cardLimit_banner_max_kib: "Banner size (KiB)",
|
|
306
|
+
cardLimit_instance_quota_files: "Pictures per agent", cardLimit_instance_quota_mib: "Picture space per agent (MiB)",
|
|
307
|
+
cardLimitInForce: "In force: {0} (allowed {1}–{2})",
|
|
308
|
+
cardLimitsWhole: "Each limit is a whole number, or empty for the default.",
|
|
309
|
+
cardLimitsNoChange: "Nothing changed.",
|
|
310
|
+
cardLimitsSave: "Save limits",
|
|
311
|
+
cardLimitsSaved: "Saved.",
|
|
312
|
+
cardLimitsFailed: "Not saved: {0}",
|
|
313
|
+
themesTitle: "Agents' themes",
|
|
314
|
+
themesShow: "Show agents' themes, effects and widgets",
|
|
315
|
+
themesShowLead: "On all your devices. When it's off, every chat looks the same, and agents' pictures and ring colours are their bots' again.",
|
|
316
|
+
themesSafeMode: "This page was opened with ?safe=1: agents' themes are not shown on it.",
|
|
317
|
+
widgetTitle: "Your sidebar widget",
|
|
318
|
+
widgetLead: "A small panel under the instance list, on all your devices: the dashboard draws it from a spec and values you write here as JSON — no HTML, script or CSS. Its live values are your fleet's counts (fleet.working, fleet.needs_you, fleet.idle, fleet.stopped). Agents can't change it.",
|
|
319
|
+
widgetNotJson: "Not JSON.",
|
|
320
|
+
widgetSave: "Save widget",
|
|
321
|
+
widgetSaved: "Sidebar widget saved.",
|
|
322
|
+
widgetExample: "Start from an example",
|
|
323
|
+
widgetRemove: "Remove widget",
|
|
324
|
+
widgetRemoved: "Sidebar widget removed.",
|
|
325
|
+
modsTitle: "Mods",
|
|
326
|
+
modsLead: "A mod is one file (.agendmod.json) that carries a look: an agent's theme and pictures, its card text, widgets, effects, and custom CSS. Importing shows everything in it first; only what you tick is applied, all at once. Uninstalling removes the mod from this list; what it applied stays until you reset it.",
|
|
327
|
+
modsLoadFailed: "Couldn't load the installed mods. Reload the page to try again.",
|
|
328
|
+
modsNone: "No mods installed.",
|
|
329
|
+
modChoose: "Import a mod file…",
|
|
330
|
+
modPlan: "What this mod would change",
|
|
331
|
+
modAuthor: "By {0} (unverified)",
|
|
332
|
+
modSizeId: "{0} · id {1}",
|
|
333
|
+
modAlready: "already installed",
|
|
334
|
+
modReplace: "Replace the installed version {0}",
|
|
335
|
+
modPartTheme: "Theme (colours, font, pictures)",
|
|
336
|
+
modPartIdentity: "Card text (tagline and bio)",
|
|
337
|
+
modPartWidget_chat_header: "Chat header widget",
|
|
338
|
+
modPartWidget_details: "Details page widget",
|
|
339
|
+
modPartWidget_sidebar: "Your sidebar widget",
|
|
340
|
+
modPartEffect: "Effect: {0}",
|
|
341
|
+
modPartCss: "Custom CSS (on your screens only)",
|
|
342
|
+
modCssWarn: "Custom CSS from this file — read it before turning it on.",
|
|
343
|
+
modCssAssets: "{0} files for it ({1})",
|
|
344
|
+
modAccent: "Accent", modFont: "Font", modPictures: "{0} pictures ({1})", modPlaces: "places {0} effects",
|
|
345
|
+
modColorsLight: "Light colours", modColorsDark: "Dark colours", modBubble: "Bubbles", modWorkingLabel: "Working label",
|
|
346
|
+
modBackground: "Background picture", modBackgroundFit: "Background fit and opacity", modAvatar: "Picture (face)",
|
|
347
|
+
modPlacesEffect: "Places effect", modAllFields: "Every field, as it will be applied",
|
|
348
|
+
modStageGone: "That import was replaced or ran out of time. Showing what is staged now.",
|
|
349
|
+
modRegions: "draws on: {0}", modWants: "hears: {0}",
|
|
350
|
+
modTarget: "Apply to",
|
|
351
|
+
modTargetPick: "Choose an agent…",
|
|
352
|
+
modTargetNeeded: "Choose the agent this look goes to.",
|
|
353
|
+
modAppliedTo: "applied to {0}",
|
|
354
|
+
modInstall: "Install",
|
|
355
|
+
modCancel: "Cancel",
|
|
356
|
+
modInstalled: "Installed {0}.",
|
|
357
|
+
modFailed: "Not done: {0}",
|
|
358
|
+
modDownload: "Download",
|
|
359
|
+
modUninstall: "Uninstall",
|
|
360
|
+
modUninstallConfirm: "Uninstall {0}? Its effects leave your library unless something still uses them. What it applied stays.",
|
|
361
|
+
modUninstalled: "Uninstalled {0}.",
|
|
362
|
+
modExport: "Export a mod",
|
|
363
|
+
modExportLead: "Make a mod file from what is in force now: an agent's theme, card text and widgets, your sidebar widget, your custom CSS.",
|
|
364
|
+
modExportInstance: "Agent",
|
|
365
|
+
modExportName: "Name (a-z, 0-9, -)",
|
|
366
|
+
modExportVersion: "Version",
|
|
367
|
+
modExportTitle: "Title",
|
|
368
|
+
modExportGo: "Download the file",
|
|
369
|
+
modExportOmitted: "{0} effect(s) placed there are someone else's and were left out: only your own and shared effects travel.",
|
|
370
|
+
modProposals: "Proposed by agents",
|
|
371
|
+
modProposedBy: "{0} proposes",
|
|
372
|
+
modReview: "Review",
|
|
373
|
+
modDismiss: "Dismiss",
|
|
374
|
+
cssTitle: "Custom CSS (yours only)",
|
|
375
|
+
cssLead: "Your own stylesheet, applied to your screens only: every device where you are signed in, never anyone else's, and never on Settings. It can't load anything from the internet. Put pictures and fonts under Assets below and name them url(\"asset:<id>\").",
|
|
376
|
+
cssLoadFailed: "Couldn't load your custom CSS. Reload the page to try again.",
|
|
377
|
+
cssPublicLink: "Custom CSS isn't available on a temporary public link.",
|
|
378
|
+
cssInForce: "In force: {0}",
|
|
379
|
+
cssOnTrial: "On trial: {0}. Choose Keep, or it reverts.",
|
|
380
|
+
cssNone: "No custom CSS in force.",
|
|
381
|
+
cssSave: "Save and try",
|
|
382
|
+
cssTrying: "Custom CSS saved. Look around, then choose Keep within 15 seconds.",
|
|
383
|
+
cssOff: "Turn off (all devices)",
|
|
384
|
+
cssVersions: "Earlier versions ({0})",
|
|
385
|
+
cssCurrent: "in force",
|
|
386
|
+
cssRestore: "Use this",
|
|
387
|
+
cssAssets: "Assets",
|
|
388
|
+
cssAssetsLead: "PNG, WebP, JPEG, GIF or WOFF2. {0} of {1} files, {2} in total (at most 1 MiB). Metadata such as GPS is removed.",
|
|
389
|
+
cssAssetAdd: "Add a picture or font",
|
|
390
|
+
cssAssetCopy: "Copy reference",
|
|
391
|
+
cssCopied: "Copied {0}",
|
|
392
|
+
cssAssetRemove: "Remove",
|
|
393
|
+
cssDeviceTitle: "On this device",
|
|
394
|
+
cssDeviceOff: "Turn off custom CSS on this device",
|
|
395
|
+
cssDeviceOffLead: "Only this browser. Your other devices keep it.",
|
|
396
|
+
cssSafe: "Is something hidden or broken? Add ?safe=1 to the end of any page's address and it loads without custom CSS.",
|
|
397
|
+
cssError_at_rule: "Not saved: {0} isn't allowed.",
|
|
398
|
+
cssError_url: "Not saved: the only url() allowed is url(\"asset:<id>\") for a file in Assets.",
|
|
399
|
+
cssError_unknown_asset: "Not saved: there's no asset {0}. Add it under Assets first.",
|
|
400
|
+
cssError_function: "Not saved: {0} isn't allowed.",
|
|
401
|
+
cssError_property: "Not saved: {0} isn't allowed.",
|
|
402
|
+
cssError_script_scheme: "Not saved: javascript: and vbscript: aren't allowed.",
|
|
403
|
+
cssError_too_large: "Not saved: custom CSS can be at most 64 KiB.",
|
|
404
|
+
cssError_malformed: "Not saved: a string or url() isn't closed.",
|
|
405
|
+
cssError_nul: "Not saved: the text contains a NUL character.",
|
|
406
|
+
cssError_unserialisable: "Not saved: the CSS couldn't be read back safely.",
|
|
407
|
+
cssError_asset_type: "Not added: only PNG, WebP, JPEG, GIF or WOFF2 files are allowed.",
|
|
408
|
+
cssError_asset_unreadable: "Not added: the file couldn't be read.",
|
|
409
|
+
cssError_asset_quota: "Not added: Assets hold at most 16 files and 1 MiB in total.",
|
|
410
|
+
cssError_asset_in_use: "Not removed: a saved version still uses it.",
|
|
411
|
+
cssError_owner_css_read_only: "This sign-in can view but not change custom CSS.",
|
|
412
|
+
cssError_owner_css_needs_a_signed_in_person: "Sign in in the browser to change custom CSS.",
|
|
413
|
+
cssError_other: "Not saved ({0}).",
|
|
414
|
+
webLead: "How the web dashboard behaves. A change that loosens access (longer sessions, the browser terminal back on or for longer, the public link) waits for a fleet admin to confirm it in chat (General topic) or on the host; one that tightens it applies at once.",
|
|
285
415
|
webPublicRefused: "Web settings can't be changed over a temporary public link. Open the dashboard at its own address to change them.",
|
|
286
416
|
webSessionTitle: "Sign-in sessions",
|
|
287
417
|
webSessionHint: "For sign-ins at the dashboard's own address (this computer, the LAN, a tailnet). A temporary public link always keeps 4 h / 30 min. Shortening ends the sessions it now outlives; lengthening applies to new sign-ins and to an existing one's idle time on its next use. Empty = the default.",
|
|
@@ -365,7 +495,7 @@ register("settings", {
|
|
|
365
495
|
help1: "Agents: each agent's settings, Start/Stop, Pause/Wake, and New agent.",
|
|
366
496
|
help2: "Connections: who may use each bot, its binding, its status emojis, a new token; and provider API keys.",
|
|
367
497
|
help3: "ClassicBot: each room's backend, model and options.",
|
|
368
|
-
help4: "General: defaults for every agent
|
|
498
|
+
help4: "General: defaults for every agent and ClassicBot defaults. Web: the dashboard's sign-in sessions, browser terminal, web echo, Log and public link. Review changes stages them.",
|
|
369
499
|
help5: "Changes are staged, then applied together with Apply changes. Each shows what it costs: immediately, an agent restart, or an AgEnD restart.",
|
|
370
500
|
help6: "A change to access, secrets or connections waits for a fleet admin to confirm it in chat before it applies.",
|
|
371
501
|
},
|
|
@@ -401,7 +531,7 @@ register("settings", {
|
|
|
401
531
|
classicChannels: "ClassicBot 頻道",
|
|
402
532
|
noClassic: "沒有 ClassicBot 頻道 — 在聊天中用 /start 建立。",
|
|
403
533
|
publicLink: "提供臨時公開網頁連結",
|
|
404
|
-
publicLinkHint: "每次都需管理員明確啟用。Cloudflare 終止 TLS
|
|
534
|
+
publicLinkHint: "每次都需管理員明確啟用。Cloudflare 終止 TLS;登入者具有完整網頁管理權限。HTML 預覽會另開一條臨時通道,除非設定 web.preview_on_public_link: false。",
|
|
405
535
|
publicTtl: "公開連結分鐘數(1–480)",
|
|
406
536
|
publicProtocol: "Tunnel 協定",
|
|
407
537
|
webEcho: "Web 同步",
|
|
@@ -530,7 +660,9 @@ register("settings", {
|
|
|
530
660
|
wizardWaitingStart: "等待群組訊息中…",
|
|
531
661
|
wizardNoStartYet: "還沒收到群組訊息 —— 發一則之後再按一次。",
|
|
532
662
|
wizardGeneralChannel: "General 頻道 id",
|
|
533
|
-
wizardAdminUser: "
|
|
663
|
+
wizardAdminUser: "你的使用者 ID(必填;會成為第一個允許使用者)",
|
|
664
|
+
wizardNeedDiscordAdmin: "請輸入 Discord 使用者 ID:17–20 位數字,開頭不能是 0。",
|
|
665
|
+
wizardNeedTelegramAdmin: "請輸入 Telegram 使用者 ID:1–20 位正整數字,開頭不能是 0。",
|
|
534
666
|
wizardNeedVerify: "請先驗證 token 再繼續。",
|
|
535
667
|
wizardPlanLoading: "正在產生方案…",
|
|
536
668
|
wizardWillWrite: "將寫入:",
|
|
@@ -542,7 +674,7 @@ register("settings", {
|
|
|
542
674
|
deleteBot: "刪除這個機器人",
|
|
543
675
|
noAllowedUsers: "沒有允許的使用者",
|
|
544
676
|
searchAll: "搜尋 agent、機器人、頻道…",
|
|
545
|
-
accessMovedHint: "誰可以使用 bot 是在連線本身設定 ——
|
|
677
|
+
accessMovedHint: "誰可以使用 bot 是在連線本身設定 —— 請到「連線」開啟「{0}」的設定。",
|
|
546
678
|
applyRestartNeeded: "已儲存 —— 需要重新啟動 AgEnD 才會生效",
|
|
547
679
|
applyNoChange: "無需變更",
|
|
548
680
|
applyRestartHint: "此變更需要重新啟動 AgEnD 本身。可以在這裡重新啟動,或在聊天頻道執行 /restart。",
|
|
@@ -585,6 +717,11 @@ register("settings", {
|
|
|
585
717
|
staggerRange: "必須介於 0 到 30000",
|
|
586
718
|
staggerWarning: "數值太低可能造成啟動尖峰",
|
|
587
719
|
sec_device: "偏好設定", syncedTitle: "在你所有的裝置同步", syncedLead: "這裡的變更會套用到你登入的每一台裝置。",
|
|
720
|
+
profileTitle: "你的名字",
|
|
721
|
+
profileLeadBound: "agent 會把你從網頁送出的訊息,認成收到登入驗證碼的那個 Discord 或 Telegram 帳號:用它的 id,名字也用它的,除非你在這裡另外取名。它會跟著你到每一台登入的裝置。這只用來辨認,不代表任何權限。",
|
|
722
|
+
profileLeadUnbound: "這個瀏覽器不是用私訊到你 Discord 或 Telegram 帳號的驗證碼登入的,所以 agent 會把你的網頁訊息看成「web-user」(或你在這裡設定的名字)。用 /web 的驗證碼登入,就能被認成你的帳號。",
|
|
723
|
+
profileName: "名字", profileHelp: "agent 看到:{0} · id {1}", profileSave: "儲存", profileClear: "改回 web-user", profileUseAccount: "改用 {0}",
|
|
724
|
+
profileSaved: "agent 現在會看到你是 {0}", profileFailed: "無法儲存名字",
|
|
588
725
|
syncedPublicLink: "公開連結只能讀取這些設定:在這裡變更只會留在這個瀏覽器。",
|
|
589
726
|
deviceTitle: "只限這台裝置", deviceLead: "導覽、文字大小、視圖寬度、側欄顯示或隱藏、面板寬度與桌面通知,每台裝置各自保留。",
|
|
590
727
|
sec_agents: "Agent",
|
|
@@ -647,7 +784,129 @@ register("settings", {
|
|
|
647
784
|
accessTitle: "存取",
|
|
648
785
|
webChat: "網頁聊天",
|
|
649
786
|
sec_web: "網頁",
|
|
650
|
-
|
|
787
|
+
sec_appearance: "網頁外觀",
|
|
788
|
+
colorTitle: "識別色", colorLead: "每個 agent 在側欄的顏色:有人挑選的、agent 自己的、它的 bot 在 Discord 身分組的顏色,或自動配的柔和色。要改某個 agent 的顏色,從它的 ⋯ 選單 → 顏色…。",
|
|
789
|
+
colorPlaces: "顏色顯示的位置(agent 自己另有設定時除外)", colorOff: "關閉顏色",
|
|
790
|
+
colorOffLead: "在這台主機隱藏所有識別色。有人挑過的顏色會保留,重新開啟顏色後就會回來。",
|
|
791
|
+
restoreTitle: "還原預設值", restoreLead: "把這台主機的外觀設定改回預設值。執行前會先詢問,並說明會重設哪些項目。",
|
|
792
|
+
restoreConfirm: "會重設這台主機的:是否顯示 agent 的主題與效果、卡片大小與各張卡片自己的大小、你的側欄小工具、顏色顯示的位置,以及是否關閉顏色;也會關閉你的自訂 CSS(版本會保留)以及這台裝置上的 CSS 開關。有人替 agent 挑的顏色、已安裝的 mod、上傳的效果與卡片上限都不會變。",
|
|
793
|
+
restoreGo: "還原預設值", restoreDone: "外觀設定已改回預設值。", restoreCssFailed: "設定已改回預設值,但無法關閉你的自訂 CSS:{0}",
|
|
794
|
+
cardSizeTitle: "身分卡",
|
|
795
|
+
cardSizeLead: "身分卡在你所有裝置上的顯示大小。卡片上自己的 小/中/大 可以單獨設定那張卡片。",
|
|
796
|
+
cardLimitsTitle: "身分卡上傳限制",
|
|
797
|
+
cardLimitsLead: "任何人可上傳的肖像與橫幅上限,以及每個 agent 可保留的圖片數量。留空=預設值(以灰字顯示)。調低立即生效;調高需 fleet admin 確認。已存的圖片不受影響。",
|
|
798
|
+
cardLimitsUnavailable: "只有已登入的管理者能在這裡查看與修改(或在 fleet.yaml 編輯 web.appearance)。",
|
|
799
|
+
cardLimit_portrait_max_width: "肖像寬度(px)", cardLimit_portrait_max_height: "肖像高度(px)", cardLimit_portrait_max_kib: "肖像大小(KiB)",
|
|
800
|
+
cardLimit_banner_max_width: "橫幅寬度(px)", cardLimit_banner_max_height: "橫幅高度(px)", cardLimit_banner_max_kib: "橫幅大小(KiB)",
|
|
801
|
+
cardLimit_instance_quota_files: "每個 agent 的圖片數", cardLimit_instance_quota_mib: "每個 agent 的圖片空間(MiB)",
|
|
802
|
+
cardLimitInForce: "實際生效:{0}(允許 {1}–{2})",
|
|
803
|
+
cardLimitsWhole: "每個限制須為整數,或留空使用預設值。",
|
|
804
|
+
cardLimitsNoChange: "沒有變更。",
|
|
805
|
+
cardLimitsSave: "儲存限制",
|
|
806
|
+
cardLimitsSaved: "已儲存。",
|
|
807
|
+
cardLimitsFailed: "未儲存:{0}",
|
|
808
|
+
themesTitle: "Agent 的主題",
|
|
809
|
+
themesShow: "顯示 agent 的主題、效果與小工具",
|
|
810
|
+
themesShowLead: "套用到你所有的裝置。關閉時每個聊天看起來都一樣,agent 的圖片與外框顏色也會換回各自 bot 的。",
|
|
811
|
+
themesSafeMode: "這個頁面是用 ?safe=1 開啟的:不顯示 agent 的主題。",
|
|
812
|
+
widgetTitle: "你的側邊欄小工具",
|
|
813
|
+
widgetLead: "實例清單下方的一個小面板,套用到你所有的裝置:儀表板依你在這裡用 JSON 寫的規格與數值繪製——沒有 HTML、腳本或 CSS。即時數值是你 fleet 的計數(fleet.working、fleet.needs_you、fleet.idle、fleet.stopped)。agent 無法變更它。",
|
|
814
|
+
widgetNotJson: "不是 JSON。",
|
|
815
|
+
widgetSave: "儲存小工具",
|
|
816
|
+
widgetSaved: "已儲存側邊欄小工具。",
|
|
817
|
+
widgetExample: "從範例開始",
|
|
818
|
+
widgetRemove: "移除小工具",
|
|
819
|
+
widgetRemoved: "已移除側邊欄小工具。",
|
|
820
|
+
modsTitle: "Mod",
|
|
821
|
+
modsLead: "Mod 是一個檔案(.agendmod.json),帶著一套外觀:agent 的主題與圖片、身分卡文字、小工具、效果,以及自訂 CSS。匯入時會先完整列出內容,只有你勾選的部分會一次套用。解除安裝會把 mod 從這個清單移除;它已套用的外觀會保留,直到你重設。",
|
|
822
|
+
modsLoadFailed: "無法載入已安裝的 mod。請重新載入頁面再試一次。",
|
|
823
|
+
modsNone: "尚未安裝任何 mod。",
|
|
824
|
+
modChoose: "匯入 mod 檔案…",
|
|
825
|
+
modPlan: "這個 mod 會變更的內容",
|
|
826
|
+
modAuthor: "作者:{0}(未經驗證)",
|
|
827
|
+
modSizeId: "{0} · id {1}",
|
|
828
|
+
modAlready: "已安裝",
|
|
829
|
+
modReplace: "取代已安裝的 {0} 版",
|
|
830
|
+
modPartTheme: "主題(顏色、字型、圖片)",
|
|
831
|
+
modPartIdentity: "身分卡文字(標語與簡介)",
|
|
832
|
+
modPartWidget_chat_header: "聊天標頭小工具",
|
|
833
|
+
modPartWidget_details: "詳細資料頁小工具",
|
|
834
|
+
modPartWidget_sidebar: "你的側邊欄小工具",
|
|
835
|
+
modPartEffect: "效果:{0}",
|
|
836
|
+
modPartCss: "自訂 CSS(只套用在你的畫面)",
|
|
837
|
+
modCssWarn: "這是檔案裡的自訂 CSS——開啟前請先讀過。",
|
|
838
|
+
modCssAssets: "附帶 {0} 個檔案({1})",
|
|
839
|
+
modAccent: "強調色", modFont: "字型", modPictures: "{0} 張圖片({1})", modPlaces: "放置 {0} 個效果",
|
|
840
|
+
modColorsLight: "淺色模式顏色", modColorsDark: "深色模式顏色", modBubble: "對話泡泡", modWorkingLabel: "工作中文字",
|
|
841
|
+
modBackground: "背景圖片", modBackgroundFit: "背景填滿方式與不透明度", modAvatar: "圖片(頭像)",
|
|
842
|
+
modPlacesEffect: "放置效果", modAllFields: "所有欄位(套用時的樣子)",
|
|
843
|
+
modStageGone: "那次匯入已被取代或已逾時。以下顯示目前暫存的內容。",
|
|
844
|
+
modRegions: "繪製於:{0}", modWants: "接收:{0}",
|
|
845
|
+
modTarget: "套用到",
|
|
846
|
+
modTargetPick: "選擇一個 agent…",
|
|
847
|
+
modTargetNeeded: "請選擇這套外觀要套用到哪個 agent。",
|
|
848
|
+
modAppliedTo: "套用於 {0}",
|
|
849
|
+
modInstall: "安裝",
|
|
850
|
+
modCancel: "取消",
|
|
851
|
+
modInstalled: "已安裝 {0}。",
|
|
852
|
+
modFailed: "未完成:{0}",
|
|
853
|
+
modDownload: "下載",
|
|
854
|
+
modUninstall: "解除安裝",
|
|
855
|
+
modUninstallConfirm: "要解除安裝 {0} 嗎?它的效果會離開你的效果庫,除非還有東西在使用。它已套用的外觀會保留。",
|
|
856
|
+
modUninstalled: "已解除安裝 {0}。",
|
|
857
|
+
modExport: "匯出 mod",
|
|
858
|
+
modExportLead: "用目前生效的外觀做成 mod 檔案:某個 agent 的主題、身分卡文字與小工具、你的側邊欄小工具、你的自訂 CSS。",
|
|
859
|
+
modExportInstance: "Agent",
|
|
860
|
+
modExportName: "名稱(a-z、0-9、-)",
|
|
861
|
+
modExportVersion: "版本",
|
|
862
|
+
modExportTitle: "標題",
|
|
863
|
+
modExportGo: "下載檔案",
|
|
864
|
+
modExportOmitted: "有 {0} 個放在那裡的效果屬於別人,已略過:只有你自己的和共用的效果會被帶走。",
|
|
865
|
+
modProposals: "Agent 提議的 mod",
|
|
866
|
+
modProposedBy: "{0} 提議",
|
|
867
|
+
modReview: "檢視",
|
|
868
|
+
modDismiss: "略過",
|
|
869
|
+
cssTitle: "自訂 CSS(只套用在你自己)",
|
|
870
|
+
cssLead: "你自己的樣式表,只套用在你自己的畫面:你登入的每一台裝置都會套用,不會影響別人,也不會套用在設定頁。它無法從網路載入任何東西;圖片和字型請放在下方的「資源」,再用 url(\"asset:<id>\") 引用。",
|
|
871
|
+
cssLoadFailed: "無法載入你的自訂 CSS。請重新整理頁面再試一次。",
|
|
872
|
+
cssPublicLink: "臨時公開連結無法使用自訂 CSS。",
|
|
873
|
+
cssInForce: "使用中:{0}",
|
|
874
|
+
cssOnTrial: "試用中:{0}。請按「保留」,否則會還原。",
|
|
875
|
+
cssNone: "目前沒有使用自訂 CSS。",
|
|
876
|
+
cssSave: "儲存並試用",
|
|
877
|
+
cssTrying: "已儲存自訂 CSS。請到各頁看看,15 秒內按「保留」。",
|
|
878
|
+
cssOff: "關閉(所有裝置)",
|
|
879
|
+
cssVersions: "先前的版本({0})",
|
|
880
|
+
cssCurrent: "使用中",
|
|
881
|
+
cssRestore: "改用這版",
|
|
882
|
+
cssAssets: "資源",
|
|
883
|
+
cssAssetsLead: "PNG、WebP、JPEG、GIF 或 WOFF2。目前 {0} / {1} 個檔案,共 {2}(上限 1 MiB)。會移除 GPS 等中繼資料。",
|
|
884
|
+
cssAssetAdd: "加入圖片或字型",
|
|
885
|
+
cssAssetCopy: "複製引用",
|
|
886
|
+
cssCopied: "已複製 {0}",
|
|
887
|
+
cssAssetRemove: "移除",
|
|
888
|
+
cssDeviceTitle: "這台裝置",
|
|
889
|
+
cssDeviceOff: "在這台裝置關閉自訂 CSS",
|
|
890
|
+
cssDeviceOffLead: "只影響這個瀏覽器,你的其他裝置照常套用。",
|
|
891
|
+
cssSafe: "畫面被藏起來或壞掉了嗎?在任何頁面網址的最後加上 ?safe=1,就會不套用自訂 CSS 地載入。",
|
|
892
|
+
cssError_at_rule: "未儲存:不允許使用 {0}。",
|
|
893
|
+
cssError_url: "未儲存:url() 只能用 url(\"asset:<id>\") 引用「資源」裡的檔案。",
|
|
894
|
+
cssError_unknown_asset: "未儲存:找不到資源 {0}。請先在「資源」加入它。",
|
|
895
|
+
cssError_function: "未儲存:不允許使用 {0}。",
|
|
896
|
+
cssError_property: "未儲存:不允許使用 {0}。",
|
|
897
|
+
cssError_script_scheme: "未儲存:不允許使用 javascript: 和 vbscript:。",
|
|
898
|
+
cssError_too_large: "未儲存:自訂 CSS 最多 64 KiB。",
|
|
899
|
+
cssError_malformed: "未儲存:有字串或 url() 沒有結束。",
|
|
900
|
+
cssError_nul: "未儲存:內容含有 NUL 字元。",
|
|
901
|
+
cssError_unserialisable: "未儲存:這份 CSS 無法安全地重新輸出。",
|
|
902
|
+
cssError_asset_type: "未加入:只接受 PNG、WebP、JPEG、GIF 或 WOFF2 檔案。",
|
|
903
|
+
cssError_asset_unreadable: "未加入:無法讀取這個檔案。",
|
|
904
|
+
cssError_asset_quota: "未加入:資源最多 16 個檔案、合計 1 MiB。",
|
|
905
|
+
cssError_asset_in_use: "未移除:仍有已儲存的版本在使用它。",
|
|
906
|
+
cssError_owner_css_read_only: "這個登入只能檢視、不能變更自訂 CSS。",
|
|
907
|
+
cssError_owner_css_needs_a_signed_in_person: "請在瀏覽器登入後再變更自訂 CSS。",
|
|
908
|
+
cssError_other: "未儲存({0})。",
|
|
909
|
+
webLead: "網頁儀表板的行為。放寬存取的變更(延長 session、重新開啟或延長瀏覽器終端機、公開連結)需要 fleet admin 在聊天(General topic)或主機上確認;收緊的變更會立即套用。",
|
|
651
910
|
webPublicRefused: "無法透過臨時公開連結變更網頁設定。請從儀表板本身的網址開啟後再變更。",
|
|
652
911
|
webSessionTitle: "登入 session",
|
|
653
912
|
webSessionHint: "適用於從儀表板本身網址登入的 session(本機、區域網路、tailnet)。臨時公開連結固定為 4 小時 / 30 分鐘。縮短會讓已超過新限制的 session 結束;延長會套用到新的登入,以及既有 session 下次使用時的閒置時間。留空 = 預設值。",
|
|
@@ -731,7 +990,7 @@ register("settings", {
|
|
|
731
990
|
help1: "Agent:每個 agent 的設定、啟動/停止、暫停/喚醒,以及新增 agent。",
|
|
732
991
|
help2: "連線:誰可以使用各個 bot、它的綁定、狀態表情、新的 token;以及供應商 API key。",
|
|
733
992
|
help3: "ClassicBot:每個房間的 backend、model 與選項。",
|
|
734
|
-
help4: "一般:所有 agent
|
|
993
|
+
help4: "一般:所有 agent 的預設值與 ClassicBot 預設值。網頁:儀表板的登入 session、瀏覽器終端機、網頁轉發、紀錄與公開連結。「檢查變更」會把它們暫存。",
|
|
735
994
|
help5: "變更會先暫存,再用「套用變更」一起套用。每項都會標示代價:立即生效、重新啟動 agent,或重新啟動 AgEnD。",
|
|
736
995
|
help6: "存取、密鑰或連線的變更,要等 fleet 管理員在聊天中確認後才會套用。",
|
|
737
996
|
},
|
|
@@ -10,6 +10,13 @@ import { api } from "./settings-confirm.js";
|
|
|
10
10
|
|
|
11
11
|
const tn = (k, ...v) => t(`settings.${k}`, ...v);
|
|
12
12
|
|
|
13
|
+
// UI feedback only: the plan and commit independently enforce this on the server.
|
|
14
|
+
export const adminUserIdPattern = (platform) => platform === "discord" ? "[1-9][0-9]{16,19}" : "[1-9][0-9]{0,19}";
|
|
15
|
+
export function adminUserIdError(platform, value) {
|
|
16
|
+
return typeof value === "string" && new RegExp(`^${adminUserIdPattern(platform)}$`).test(value)
|
|
17
|
+
? null : tn(platform === "discord" ? "wizardNeedDiscordAdmin" : "wizardNeedTelegramAdmin");
|
|
18
|
+
}
|
|
19
|
+
|
|
13
20
|
/** Who this token is: { valid, username?, reason? } — one outbound check, the token sent once and not kept. */
|
|
14
21
|
export async function verifyBotToken(platform, token) {
|
|
15
22
|
const res = await api("/api/settings/quickstart/probe", { method: "POST", body: JSON.stringify({ action: "verify", platform, token }) })
|
|
@@ -10,7 +10,7 @@ import { api } from "./settings-confirm.js";
|
|
|
10
10
|
import { startOperation } from "./settings-apply.js";
|
|
11
11
|
import { BACKENDS, DEFAULT_SCHEMA, impactOf, toYaml } from "./settings-model.js";
|
|
12
12
|
import { Drawer, Select } from "./settings-dialogs.js";
|
|
13
|
-
import { botHandle, TokenEnvNote, TokenField, verifyBotToken } from "./settings-token.js";
|
|
13
|
+
import { adminUserIdError, adminUserIdPattern, botHandle, TokenEnvNote, TokenField, verifyBotToken } from "./settings-token.js";
|
|
14
14
|
import { DiscordServerPicker } from "./settings-discord.js";
|
|
15
15
|
|
|
16
16
|
const tn = (k, ...v) => t(`settings.${k}`, ...v);
|
|
@@ -90,6 +90,8 @@ export function SetupWizard({ ctx, onClose }) {
|
|
|
90
90
|
if (w.step === 2) { setW({ ...w, step: 3 }); return; }
|
|
91
91
|
if (w.step === 3) {
|
|
92
92
|
if (!w.identity || !w.identity.valid) { setErr(tn("wizardNeedVerify")); return; }
|
|
93
|
+
const adminError = adminUserIdError(w.platform, w.admin_user_id);
|
|
94
|
+
if (adminError) { setErr(adminError); return; }
|
|
93
95
|
const at = rev.current;
|
|
94
96
|
setBusy(tn("wizardPlanLoading"));
|
|
95
97
|
const res = await post("/api/settings/quickstart/plan", input());
|
|
@@ -146,12 +148,12 @@ export function SetupWizard({ ctx, onClose }) {
|
|
|
146
148
|
<${DiscordServerPicker} idPrefix="wz" token=${w.identity && w.identity.valid ? w.token : ""} bot=${w.identity && botHandle(w.identity.username)}
|
|
147
149
|
invite=${w.identity && w.identity.invite} portal=${w.identity && w.identity.portal} guilds=${w.guilds} onGuilds=${(g) => setW((x) => ({ ...x, guilds: g }))}
|
|
148
150
|
guild=${w.guild_id} onGuild=${set("guild_id")} channel=${w.general_channel_id} onChannel=${set("general_channel_id")} />
|
|
149
|
-
<div class="field"><label for="wz-user">${tn("wizardAdminUser")}</label><input id="wz-user" type="text" placeholder=${tn("discordUserPlaceholder")} value=${w.admin_user_id} onInput=${(e) => set("admin_user_id")(e.target.value.trim())} /></div>`
|
|
151
|
+
<div class="field"><label for="wz-user">${tn("wizardAdminUser")}</label><input id="wz-user" type="text" required=${true} inputmode="numeric" pattern=${adminUserIdPattern(w.platform)} placeholder=${tn("discordUserPlaceholder")} value=${w.admin_user_id} onInput=${(e) => set("admin_user_id")(e.target.value.trim())} /></div>`
|
|
150
152
|
: html`
|
|
151
153
|
<div class="field"><label for="wz-group">${tn("groupIdField")}</label><input id="wz-group" type="text" placeholder="-1001234567890" value=${w.group_id} onInput=${(e) => set("group_id")(e.target.value.trim())} />
|
|
152
154
|
<p class="note">${tn("wizardDetectHint")}</p></div>
|
|
153
155
|
<div class="dlg-inline-actions"><button type="button" class="btn btn-sm" disabled=${!!busy} onClick=${detect}>${tn("wizardDetect")}</button></div>
|
|
154
|
-
<div class="field"><label for="wz-user">${tn("wizardAdminUser")}</label><input id="wz-user" type="text" placeholder=${tn("telegramUserPlaceholder")} value=${w.admin_user_id} onInput=${(e) => set("admin_user_id")(e.target.value.trim())} /></div>`}`;
|
|
156
|
+
<div class="field"><label for="wz-user">${tn("wizardAdminUser")}</label><input id="wz-user" type="text" required=${true} inputmode="numeric" pattern=${adminUserIdPattern(w.platform)} placeholder=${tn("telegramUserPlaceholder")} value=${w.admin_user_id} onInput=${(e) => set("admin_user_id")(e.target.value.trim())} /></div>`}`;
|
|
155
157
|
} else {
|
|
156
158
|
body = !w.plan ? html`<p class="note">${tn("wizardPlanLoading")}</p>` : html`
|
|
157
159
|
<p><strong>${tn("wizardWillWrite")}</strong></p>
|
|
@@ -27,6 +27,20 @@
|
|
|
27
27
|
|
|
28
28
|
const nativeFetch = window.fetch.bind(window);
|
|
29
29
|
let sessionPending = null;
|
|
30
|
+
// Observation only: no server authority, owner/CSRF data or way to restore this page's episode.
|
|
31
|
+
let ended = null;
|
|
32
|
+
const endListeners = new Set();
|
|
33
|
+
function endSession(reason) {
|
|
34
|
+
if (ended) return;
|
|
35
|
+
ended = Object.freeze({ reason });
|
|
36
|
+
const listeners = [...endListeners]; endListeners.clear();
|
|
37
|
+
for (const fn of listeners) { try { fn(ended); } catch { /* one observer cannot delay another's cleanup */ } }
|
|
38
|
+
}
|
|
39
|
+
function onSessionEnd(fn) {
|
|
40
|
+
if (typeof fn !== "function") return () => {};
|
|
41
|
+
if (ended) { try { fn(ended); } catch { /* late observers fail closed */ } return () => {}; }
|
|
42
|
+
endListeners.add(fn); return () => endListeners.delete(fn);
|
|
43
|
+
}
|
|
30
44
|
|
|
31
45
|
/**
|
|
32
46
|
* This page's sign-in, read once from GET /auth/session: { csrf, handle } or null (no session, or the read failed —
|
|
@@ -36,8 +50,8 @@
|
|
|
36
50
|
function session() {
|
|
37
51
|
if (!sessionPending) {
|
|
38
52
|
sessionPending = nativeFetch("/auth/session", { credentials: "same-origin", cache: "no-store" })
|
|
39
|
-
.then((r) => (r.ok ? r.json() : null)
|
|
40
|
-
.then((j) => (j && typeof j.csrf === "string" ? { csrf: j.csrf, handle: typeof j.handle === "string" ? j.handle : null } : null))
|
|
53
|
+
.then((r) => { if (r.status === 401) endSession("unauthorized"); return r.ok ? r.json() : null; })
|
|
54
|
+
.then((j) => (j && typeof j.csrf === "string" ? { csrf: j.csrf, handle: typeof j.handle === "string" ? j.handle : null, canWrite: j.tier === "admin", localAdmin: j.tier === "admin" && j.surface === "local" } : null))
|
|
41
55
|
.catch(() => null)
|
|
42
56
|
.then((value) => { if (!value) sessionPending = null; return value; });
|
|
43
57
|
}
|
|
@@ -51,6 +65,8 @@
|
|
|
51
65
|
bannerShown = true;
|
|
52
66
|
const bar = document.createElement("div");
|
|
53
67
|
bar.setAttribute("role", "alert");
|
|
68
|
+
bar.setAttribute("data-trust", "session-ended");
|
|
69
|
+
bar.className = "agend-session-ended";
|
|
54
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";
|
|
55
71
|
const zh = /^zh/i.test(navigator.language || "");
|
|
56
72
|
bar.append(document.createTextNode(zh ? "登入已結束。" : "Your session has ended. "));
|
|
@@ -77,15 +93,23 @@
|
|
|
77
93
|
}
|
|
78
94
|
}
|
|
79
95
|
const response = await nativeFetch(input, init);
|
|
80
|
-
if (sameOrigin && response.status === 401 && !target.pathname.startsWith("/auth/")) sessionEndedBanner();
|
|
96
|
+
if (sameOrigin && response.status === 401 && !target.pathname.startsWith("/auth/")) { endSession("unauthorized"); sessionEndedBanner(); }
|
|
81
97
|
return response;
|
|
82
98
|
};
|
|
83
99
|
|
|
84
100
|
window.AgendAuth = {
|
|
85
101
|
csrf,
|
|
102
|
+
/** Host runtimes subscribe before admission. Late subscribers observe the same closed episode immediately. */
|
|
103
|
+
onSessionEnd,
|
|
104
|
+
/** Display hint from the existing session read. Every write still requires server authorization. */
|
|
105
|
+
canWrite() { return session().then(s => !ended && s?.canWrite === true); },
|
|
106
|
+
/** Display hint from the same server session response; Start still reauthorizes. No CSRF is exposed here. */
|
|
107
|
+
trialSession() { return session().then(s => !ended && s?.handle && /^[a-f0-9]{16}$/.test(s.handle) ? Object.freeze({ epoch: s.handle, localAdmin: s.localAdmin === true }) : null); },
|
|
108
|
+
sessionEnded() { return ended !== null; },
|
|
86
109
|
/** #1568: the session handle of this page's sign-in, or null when there is none. */
|
|
87
110
|
sessionHandle() { return session().then((s) => (s && s.handle ? s.handle : null)); },
|
|
88
111
|
async signOut() {
|
|
112
|
+
endSession("sign_out");
|
|
89
113
|
const value = await csrf();
|
|
90
114
|
const r = await nativeFetch("/auth/logout", { method: "POST", credentials: "same-origin", headers: value ? { "X-Agend-CSRF": value } : {} });
|
|
91
115
|
// A sign-out the server could not make durable is not quietly reported as done: say so before leaving.
|