@songsid/agend 2.3.0-beta.1 → 2.3.0-beta.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-cli-instructions.md +5 -2
- package/dist/agent-cli.js +43 -7
- 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 +14 -6
- package/dist/agent-file-read.js +207 -19
- 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 -15
- 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 +10 -5
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/types.d.ts +14 -0
- package/dist/backend/types.js +25 -0
- package/dist/backend/types.js.map +1 -1
- package/dist/backend-availability.d.ts +120 -0
- package/dist/backend-availability.js +396 -0
- package/dist/backend-availability.js.map +1 -0
- package/dist/backend-command.d.ts +21 -3
- package/dist/backend-command.js +23 -4
- package/dist/backend-command.js.map +1 -1
- package/dist/bundled-skills.d.ts +14 -0
- package/dist/bundled-skills.js +29 -0
- package/dist/bundled-skills.js.map +1 -0
- package/dist/cache-analysis.d.ts +47 -1
- package/dist/cache-analysis.js +68 -8
- package/dist/cache-analysis.js.map +1 -1
- package/dist/cache-ledger.d.ts +16 -3
- package/dist/cache-ledger.js +33 -13
- package/dist/cache-ledger.js.map +1 -1
- package/dist/cache-report-tool.d.ts +17 -0
- package/dist/cache-report-tool.js +40 -0
- package/dist/cache-report-tool.js.map +1 -0
- package/dist/cache-service.d.ts +70 -3
- package/dist/cache-service.js +178 -17
- package/dist/cache-service.js.map +1 -1
- package/dist/channel/adapters/discord.d.ts +7 -0
- package/dist/channel/adapters/discord.js +35 -0
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/mcp-tools.js +22 -10
- 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 +130 -31
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.js +103 -4
- package/dist/config-validator.js.map +1 -1
- package/dist/daemon.d.ts +7 -0
- package/dist/daemon.js +63 -16
- package/dist/daemon.js.map +1 -1
- package/dist/decision-list.d.ts +25 -0
- package/dist/decision-list.js +30 -0
- package/dist/decision-list.js.map +1 -0
- package/dist/delivery-outbox.d.ts +10 -0
- package/dist/delivery-outbox.js +12 -1
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/fleet-context.d.ts +10 -0
- package/dist/fleet-manager.d.ts +417 -11
- package/dist/fleet-manager.js +1387 -109
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-traffic.d.ts +74 -0
- package/dist/fleet-traffic.js +196 -0
- package/dist/fleet-traffic.js.map +1 -0
- package/dist/general-knowledge/skills/credential-profiles/SKILL.md +20 -5
- package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +6 -1
- package/dist/general-knowledge/skills/multi-channel/SKILL.md +3 -2
- package/dist/general-knowledge/skills/persona-emoji/SKILL.md +1 -1
- package/dist/general-knowledge/skills/web-appearance/SKILL.md +257 -23
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +478 -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 +3 -1
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-names.d.ts +4 -0
- package/dist/instance-names.js +12 -0
- package/dist/instance-names.js.map +1 -0
- package/dist/instructions.d.ts +12 -1
- package/dist/instructions.js +13 -2
- package/dist/instructions.js.map +1 -1
- package/dist/locale.js +100 -8
- package/dist/locale.js.map +1 -1
- package/dist/ls-attach-resolve.d.ts +95 -0
- package/dist/ls-attach-resolve.js +174 -0
- package/dist/ls-attach-resolve.js.map +1 -0
- package/dist/memory-hogs.d.ts +27 -0
- package/dist/memory-hogs.js +124 -0
- package/dist/memory-hogs.js.map +1 -0
- package/dist/outbound-handlers.d.ts +10 -0
- package/dist/outbound-handlers.js +122 -2
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +164 -4
- package/dist/outbound-schemas.js +99 -3
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/public-web-gateway.js +8 -2
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/public-web-link.d.ts +9 -0
- package/dist/public-web-link.js +8 -0
- package/dist/public-web-link.js.map +1 -1
- package/dist/quickstart-api.d.ts +10 -1
- package/dist/quickstart-api.js +12 -4
- package/dist/quickstart-api.js.map +1 -1
- package/dist/reply-buttons-controller.d.ts +4 -0
- package/dist/reply-buttons-controller.js +2 -2
- package/dist/reply-buttons-controller.js.map +1 -1
- package/dist/restart-progress.d.ts +65 -1
- package/dist/restart-progress.js +236 -10
- package/dist/restart-progress.js.map +1 -1
- package/dist/rollout-index.d.ts +5 -0
- package/dist/rollout-index.js +26 -5
- package/dist/rollout-index.js.map +1 -1
- package/dist/scheduler/scheduler.d.ts +12 -0
- package/dist/scheduler/scheduler.js +83 -10
- package/dist/scheduler/scheduler.js.map +1 -1
- package/dist/service-installer.d.ts +2 -1
- package/dist/service-installer.js +18 -3
- package/dist/service-installer.js.map +1 -1
- package/dist/settings-api.d.ts +19 -0
- package/dist/settings-api.js +137 -2
- 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-effect.js +17 -1
- package/dist/settings-effect.js.map +1 -1
- package/dist/tmux-manager.d.ts +5 -0
- package/dist/tmux-manager.js +16 -0
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tool-permissions.d.ts +4 -6
- package/dist/tool-permissions.js +53 -5
- package/dist/tool-permissions.js.map +1 -1
- package/dist/topic-commands.d.ts +7 -1
- package/dist/topic-commands.js +18 -4
- package/dist/topic-commands.js.map +1 -1
- package/dist/types.d.ts +48 -1
- package/dist/ui/app-effects.js +77 -31
- package/dist/ui/chat-ambient.js +307 -0
- package/dist/ui/chat-effect-posters.js +8 -8
- package/dist/ui/chat-effects.js +101 -13
- package/dist/ui/chat-render.js +21 -3
- package/dist/ui/chat-strings.js +59 -6
- package/dist/ui/chat-thread.js +159 -21
- package/dist/ui/effect-trial-controller.js +13 -8
- package/dist/ui/effect-trial-panel.js +19 -16
- package/dist/ui/fleet-cache.js +23 -1
- package/dist/ui/fleet-canvas-layout.js +111 -0
- package/dist/ui/fleet-canvas.js +525 -0
- package/dist/ui/fleet-org.js +27 -12
- package/dist/ui/fleet-traffic.js +343 -0
- package/dist/ui/fleet-usage.js +401 -0
- package/dist/ui/panel-chat.js +154 -49
- package/dist/ui/panel-details.js +2 -1
- package/dist/ui/panel-fleet.js +43 -17
- package/dist/ui/panel-settings.js +26 -8
- package/dist/ui/preview.js +3 -2
- package/dist/ui/settings-appearance.js +42 -18
- package/dist/ui/settings-catalog.js +92 -0
- 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 +9 -9
- package/dist/ui/settings-strings.js +120 -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 +4 -2
- package/dist/ui/shared/app-prefs.js +5 -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 +92 -27
- package/dist/ui/shared/app-store.js +26 -1
- package/dist/ui/shared/app-stream.js +3 -1
- package/dist/ui/shared/app-themes.js +24 -6
- package/dist/ui/shared/app.css +365 -17
- package/dist/ui/shared/app.js +21 -14
- package/dist/ui/shared/card-strings.js +4 -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-policy.js +21 -7
- package/dist/ui/shared/effect-profiler.js +31 -9
- package/dist/ui/shared/effect-registry.js +87 -48
- 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 +75 -4
- package/dist/ui/shared/identity-color.js +3 -3
- package/dist/ui/shared/instance-nav.js +194 -28
- package/dist/ui/shared/panel-view.js +24 -4
- package/dist/ui/shared/tokens.css +9 -3
- package/dist/ui/shared/ui-icons.js +1 -0
- package/dist/ui/shared/usage-dialog.js +22 -2
- package/dist/ui/shared/view-strings.js +68 -2
- package/dist/ui/shared/web-authorize.js +151 -0
- package/dist/ui/signin.html +1 -1
- package/dist/ui/web-terminal/terminal.css +4 -4
- package/dist/usage/providers.d.ts +28 -0
- package/dist/usage/providers.js +126 -36
- package/dist/usage/providers.js.map +1 -1
- package/dist/usage-report.d.ts +158 -0
- package/dist/usage-report.js +226 -0
- package/dist/usage-report.js.map +1 -0
- package/dist/usage-rollup.d.ts +51 -0
- package/dist/usage-rollup.js +168 -0
- package/dist/usage-rollup.js.map +1 -0
- package/dist/view-api.d.ts +39 -0
- package/dist/view-api.js +65 -4
- 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 +69 -5
- package/dist/web-api.js +362 -45
- 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 +82 -7
- package/dist/web-appearance.js.map +1 -1
- package/dist/web-asset-parts.d.ts +5 -10
- 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-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 +50 -0
- package/dist/web-chat-history.js +87 -5
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-commands.d.ts +1 -0
- package/dist/web-effect-bootstrap.d.ts +12 -0
- package/dist/web-effect-bootstrap.js +49 -0
- package/dist/web-effect-bootstrap.js.map +1 -0
- package/dist/web-effect-bundle.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 +28 -5
- package/dist/web-effect-service.js.map +1 -1
- package/dist/web-effect-tools.d.ts +1 -0
- package/dist/web-effect-tools.js +8 -5
- package/dist/web-effect-tools.js.map +1 -1
- package/dist/web-effect-trials.d.ts +4 -4
- package/dist/web-effect-trials.js +6 -6
- package/dist/web-effect-trials.js.map +1 -1
- package/dist/web-effect-upload.d.ts +2 -4
- package/dist/web-effect-upload.js +3 -8
- 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 +14 -0
- package/dist/web-effect.js +21 -0
- package/dist/web-effect.js.map +1 -1
- package/dist/web-guest-access.d.ts +125 -0
- package/dist/web-guest-access.js +234 -0
- package/dist/web-guest-access.js.map +1 -0
- package/dist/web-guest-rooms.d.ts +82 -0
- package/dist/web-guest-rooms.js +135 -0
- package/dist/web-guest-rooms.js.map +1 -0
- package/dist/web-identity-color.d.ts +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-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 +12 -8
- package/dist/web-mod-agent.js.map +1 -1
- package/dist/web-mod-bundle.d.ts +14 -1
- package/dist/web-mod-bundle.js +68 -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 +21 -7
- package/dist/web-mod-store.js.map +1 -1
- package/dist/web-prefs.d.ts +14 -0
- package/dist/web-prefs.js +24 -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 +89 -0
- package/dist/web-settings-tools.js +270 -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-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 +2 -0
- package/dist/web-theme.js +10 -1
- 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/workflow-templates/default.md +1 -1
- package/package.json +1 -1
- package/templates/systemd.service.ejs +8 -0
|
@@ -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",
|
|
@@ -204,6 +204,9 @@ register("settings", {
|
|
|
204
204
|
changesApplied: "Changes applied. AgEnD is reconciling affected Agents.",
|
|
205
205
|
reviewChanges: "Review changes",
|
|
206
206
|
backendUnavailable: "{0} (removed — choose another backend)",
|
|
207
|
+
backendNotInstalled: "not installed", backendNotSignedIn: "not signed in (use /login)", backendTooOld: "needs {0} or newer", backendUnchecked: "not checked yet",
|
|
208
|
+
modelNotListed: "current — not in this CLI's list", modelOther: "Other…", modelOtherLabel: "Model name", modelOtherPlaceholder: "a model name this CLI accepts",
|
|
209
|
+
modelNone: "— none —", inheritValue: "inherit ({0})", modelCliDefault: "the CLI's own default",
|
|
207
210
|
readyApply: "Ready to apply",
|
|
208
211
|
copied: "Copied",
|
|
209
212
|
expectedMapping: "expected a mapping",
|
|
@@ -222,7 +225,7 @@ register("settings", {
|
|
|
222
225
|
staggerWarning: "Very low values can cause startup spikes",
|
|
223
226
|
sec_device: "Preferences", syncedTitle: "Synced across your devices", syncedLead: "Changes here apply on every device where you are signed in.",
|
|
224
227
|
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.
|
|
228
|
+
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
229
|
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
230
|
profileName: "Name", profileHelp: "Agents see: {0} · id {1}", profileSave: "Save", profileClear: "Use web-user", profileUseAccount: "Use {0}",
|
|
228
231
|
profileSaved: "Agents now see you as {0}", profileFailed: "Could not save the name",
|
|
@@ -290,17 +293,18 @@ register("settings", {
|
|
|
290
293
|
sec_web: "Web",
|
|
291
294
|
// #1629 r4 §3: Settings → Appearance (owner CSS).
|
|
292
295
|
sec_appearance: "Web appearance",
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
296
|
+
groupLook: "Look", groupLayout: "Your layout", groupCss: "Styles you write", groupMods: "Add-ons", groupAdvanced: "Advanced", learnMore: "Learn more: {0}",
|
|
297
|
+
colorTitle: "Identity colours", colorLead: "One agent's colour: its ⋯ menu → Colour…",
|
|
298
|
+
colorPlaces: "Where colours show", colorSample: "Sample agent", colorOff: "Turn off colours",
|
|
299
|
+
colorOffLead: "Colours people picked are kept.",
|
|
300
|
+
restoreTitle: "Restore defaults", restoreLead: "Puts this host's look back to the defaults. Asks first.",
|
|
301
|
+
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
302
|
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
303
|
cardSizeTitle: "Identity cards",
|
|
300
|
-
cardSizeLead: "
|
|
304
|
+
cardSizeLead: "A card's own S / M / L overrides this.",
|
|
301
305
|
cardLimitsTitle: "Identity card upload limits",
|
|
302
|
-
cardLimitsLead: "
|
|
303
|
-
cardLimitsUnavailable: "Only a signed-in admin can
|
|
306
|
+
cardLimitsLead: "Empty = the default. Raising a limit needs an admin's OK.",
|
|
307
|
+
cardLimitsUnavailable: "Only a signed-in admin can change these.",
|
|
304
308
|
cardLimit_portrait_max_width: "Portrait width (px)", cardLimit_portrait_max_height: "Portrait height (px)", cardLimit_portrait_max_kib: "Portrait size (KiB)",
|
|
305
309
|
cardLimit_banner_max_width: "Banner width (px)", cardLimit_banner_max_height: "Banner height (px)", cardLimit_banner_max_kib: "Banner size (KiB)",
|
|
306
310
|
cardLimit_instance_quota_files: "Pictures per agent", cardLimit_instance_quota_mib: "Picture space per agent (MiB)",
|
|
@@ -312,10 +316,12 @@ register("settings", {
|
|
|
312
316
|
cardLimitsFailed: "Not saved: {0}",
|
|
313
317
|
themesTitle: "Agents' themes",
|
|
314
318
|
themesShow: "Show agents' themes, effects and widgets",
|
|
315
|
-
themesShowLead: "
|
|
319
|
+
themesShowLead: "When off, every chat looks the same.",
|
|
320
|
+
themesFollowMotion: "Effects: follow the system's reduced-motion setting",
|
|
321
|
+
themesFollowMotionLead: "This device only: effects stay still while the system reduces motion.",
|
|
316
322
|
themesSafeMode: "This page was opened with ?safe=1: agents' themes are not shown on it.",
|
|
317
323
|
widgetTitle: "Your sidebar widget",
|
|
318
|
-
widgetLead: "A small panel under
|
|
324
|
+
widgetLead: "A small panel under your agent list, written as JSON.",
|
|
319
325
|
widgetNotJson: "Not JSON.",
|
|
320
326
|
widgetSave: "Save widget",
|
|
321
327
|
widgetSaved: "Sidebar widget saved.",
|
|
@@ -323,7 +329,7 @@ register("settings", {
|
|
|
323
329
|
widgetRemove: "Remove widget",
|
|
324
330
|
widgetRemoved: "Sidebar widget removed.",
|
|
325
331
|
modsTitle: "Mods",
|
|
326
|
-
modsLead: "
|
|
332
|
+
modsLead: "Only the parts you tick are applied.",
|
|
327
333
|
modsLoadFailed: "Couldn't load the installed mods. Reload the page to try again.",
|
|
328
334
|
modsNone: "No mods installed.",
|
|
329
335
|
modChoose: "Import a mod file…",
|
|
@@ -334,6 +340,7 @@ register("settings", {
|
|
|
334
340
|
modReplace: "Replace the installed version {0}",
|
|
335
341
|
modPartTheme: "Theme (colours, font, pictures)",
|
|
336
342
|
modPartIdentity: "Card text (tagline and bio)",
|
|
343
|
+
modPartAmbient: "Ambient effect (falling, rising, twinkling or click glyphs)",
|
|
337
344
|
modPartWidget_chat_header: "Chat header widget",
|
|
338
345
|
modPartWidget_details: "Details page widget",
|
|
339
346
|
modPartWidget_sidebar: "Your sidebar widget",
|
|
@@ -360,7 +367,7 @@ register("settings", {
|
|
|
360
367
|
modUninstallConfirm: "Uninstall {0}? Its effects leave your library unless something still uses them. What it applied stays.",
|
|
361
368
|
modUninstalled: "Uninstalled {0}.",
|
|
362
369
|
modExport: "Export a mod",
|
|
363
|
-
modExportLead: "
|
|
370
|
+
modExportLead: "Save what's in force now as a mod file.",
|
|
364
371
|
modExportInstance: "Agent",
|
|
365
372
|
modExportName: "Name (a-z, 0-9, -)",
|
|
366
373
|
modExportVersion: "Version",
|
|
@@ -372,7 +379,7 @@ register("settings", {
|
|
|
372
379
|
modReview: "Review",
|
|
373
380
|
modDismiss: "Dismiss",
|
|
374
381
|
cssTitle: "Custom CSS (yours only)",
|
|
375
|
-
cssLead: "
|
|
382
|
+
cssLead: "Applies to your screens only.",
|
|
376
383
|
cssLoadFailed: "Couldn't load your custom CSS. Reload the page to try again.",
|
|
377
384
|
cssPublicLink: "Custom CSS isn't available on a temporary public link.",
|
|
378
385
|
cssInForce: "In force: {0}",
|
|
@@ -385,15 +392,14 @@ register("settings", {
|
|
|
385
392
|
cssCurrent: "in force",
|
|
386
393
|
cssRestore: "Use this",
|
|
387
394
|
cssAssets: "Assets",
|
|
388
|
-
cssAssetsLead: "
|
|
395
|
+
cssAssetsLead: "{0} of {1} files, {2} in total (at most 1 MiB in all).",
|
|
389
396
|
cssAssetAdd: "Add a picture or font",
|
|
390
397
|
cssAssetCopy: "Copy reference",
|
|
391
398
|
cssCopied: "Copied {0}",
|
|
392
399
|
cssAssetRemove: "Remove",
|
|
393
400
|
cssDeviceTitle: "On this device",
|
|
394
401
|
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.",
|
|
402
|
+
cssSafe: "Something hidden? Add ?safe=1 to the address.",
|
|
397
403
|
cssError_at_rule: "Not saved: {0} isn't allowed.",
|
|
398
404
|
cssError_url: "Not saved: the only url() allowed is url(\"asset:<id>\") for a file in Assets.",
|
|
399
405
|
cssError_unknown_asset: "Not saved: there's no asset {0}. Add it under Assets first.",
|
|
@@ -426,6 +432,28 @@ register("settings", {
|
|
|
426
432
|
webTerminalTtl: "Terminal session minutes (1–20)",
|
|
427
433
|
webTerminalTtlRange: "Must be a whole number from 1 to 20",
|
|
428
434
|
webReadOnlyTitle: "Set in fleet.yaml",
|
|
435
|
+
guestsTitle: "Guests", guestsReview: "Review guest changes",
|
|
436
|
+
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.",
|
|
437
|
+
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.",
|
|
438
|
+
guestsChat: "Guests may chat", guestsChatHint: "Off: guests can read their agents' chats but not send, attach, click a reply's buttons or press Cancel.",
|
|
439
|
+
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.",
|
|
440
|
+
guestsList: "Guest accounts", guestsNone: "No guest has signed in yet.", guestsLoadFailed: "The guest list could not be loaded.",
|
|
441
|
+
guestFacts: "Agents: {0} · Sessions: {1} · Remembered browsers: {2}", guestLastActive: "Last active {0}", guestNotSignedIn: "Not signed in now",
|
|
442
|
+
guestNotNarrowed: "Reaches every agent they can use in chat.", guestNarrowedTo: "Narrowed to: {0}", guestNothing: "nothing",
|
|
443
|
+
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.",
|
|
444
|
+
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.",
|
|
445
|
+
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.",
|
|
446
|
+
vaTitle: "Web authority", vaReview: "Review web authority changes",
|
|
447
|
+
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.",
|
|
448
|
+
vaLoadFailed: "Web authority could not be loaded.",
|
|
449
|
+
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.",
|
|
450
|
+
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.",
|
|
451
|
+
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.",
|
|
452
|
+
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.",
|
|
453
|
+
vaHours: "An authorization lasts (hours, {0}–{1})", vaHoursRange: "Must be a number from 1 to 48",
|
|
454
|
+
vaSessionsTitle: "Authorized sessions", vaSessionsNone: "No session is authorized now.", vaSessionUntil: "Authorized {0} · until {1}",
|
|
455
|
+
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.",
|
|
456
|
+
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
457
|
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
458
|
notSet: "not set (default)",
|
|
431
459
|
defaultsTitle: "Defaults",
|
|
@@ -474,7 +502,19 @@ register("settings", {
|
|
|
474
502
|
discardOnLeave: "Discard {0} pending changes?",
|
|
475
503
|
applyBusyLocal: "An Apply is still running — wait for it to finish.",
|
|
476
504
|
applyStepFailed: "Stopped at a change: {0}. The changes after it were not applied; they are staged again.",
|
|
477
|
-
|
|
505
|
+
applyError_unsupported_sensitive_effect: "it changes a setting the confirmation cannot show safely, so nothing was changed",
|
|
506
|
+
applyError_confirmation_diff_too_large: "it is too large to confirm at once; apply fewer changes at a time",
|
|
507
|
+
applyError_session_required: "your sign-in ended; sign in again and apply",
|
|
508
|
+
applyError_admin_required: "only a fleet admin can confirm it",
|
|
509
|
+
applyError_settings_changed: "the settings changed meanwhile; review and apply again",
|
|
510
|
+
applyError_request_no_longer_current: "the settings changed meanwhile; review and apply again",
|
|
511
|
+
applyError_too_many_pending_changes: "too many changes are waiting for confirmation; confirm or withdraw some first",
|
|
512
|
+
applyError_fleet_unavailable: "the fleet is not running",
|
|
513
|
+
applyError_invalid_settings_effect: "the result would not be a valid configuration",
|
|
514
|
+
applyError_settings_confirmation_unavailable: "its confirmation could not be set up; try again",
|
|
515
|
+
applyError_failed: "the server could not apply it",
|
|
516
|
+
applyErrorOther: "the server refused it ({0})",
|
|
517
|
+
stepWaiting: "Waiting for confirmation",
|
|
478
518
|
stepSkipped: "Not applied",
|
|
479
519
|
viaRestart: "(restart)",
|
|
480
520
|
format: "Format",
|
|
@@ -491,7 +531,6 @@ register("settings", {
|
|
|
491
531
|
discordUserPlaceholder: "your Discord user id",
|
|
492
532
|
telegramUserPlaceholder: "your Telegram user id",
|
|
493
533
|
bindingApplyButton: "Rebind",
|
|
494
|
-
webEchoEnable: "Turn on web echo",
|
|
495
534
|
help1: "Agents: each agent's settings, Start/Stop, Pause/Wake, and New agent.",
|
|
496
535
|
help2: "Connections: who may use each bot, its binding, its status emojis, a new token; and provider API keys.",
|
|
497
536
|
help3: "ClassicBot: each room's backend, model and options.",
|
|
@@ -535,7 +574,8 @@ register("settings", {
|
|
|
535
574
|
publicTtl: "公開連結分鐘數(1–480)",
|
|
536
575
|
publicProtocol: "Tunnel 協定",
|
|
537
576
|
webEcho: "Web 同步",
|
|
538
|
-
webEchoHint: "將網頁訊息複製到綁定的 Telegram 或 Discord
|
|
577
|
+
webEchoHint: "將網頁訊息複製到綁定的 Telegram 或 Discord 主題。ClassicBot 聊天室也照這個設定,除非該聊天室另外設定。",
|
|
578
|
+
webUsagePublic: "透過公開連結提供用量報告", webUsagePublicHint: "Fleet → 用量(最多 400 天、每個 agent 的 token、請求、訊息與依牌價換算的 API 等值)也會透過臨時公開連結提供。預設關閉;訪客一律看不到。變更立即生效。",
|
|
539
579
|
webLogTab: "紀錄分頁:每個 agent 的步驟", webLogTabHint: "在每個 instance 的「紀錄」分頁顯示提示、回覆、工具呼叫與結果,以及 fleet 事件;只在分頁開著時從它自己的對話紀錄讀取。機密值會遮蔽。公開連結也看得到。開啟需 fleet admin 確認。",
|
|
540
580
|
general: "一般設定",
|
|
541
581
|
advanced: "進階",
|
|
@@ -584,7 +624,6 @@ register("settings", {
|
|
|
584
624
|
wake: "喚醒",
|
|
585
625
|
accessMode: "存取模式",
|
|
586
626
|
affected: "受影響 instances",
|
|
587
|
-
webEchoGroupConfirm: "這看起來是群組頻道:開啟後,這個 instance 的每則 web 訊息都會貼到所有頻道成員看得到的地方。確定要開啟 web echo?",
|
|
588
627
|
language: "語言(bot 回覆)",
|
|
589
628
|
defaultBackend: "預設後端",
|
|
590
629
|
defaultModel: "預設模型",
|
|
@@ -700,6 +739,9 @@ register("settings", {
|
|
|
700
739
|
changesApplied: "變更已套用,AgEnD 正在協調受影響的 Agent。",
|
|
701
740
|
reviewChanges: "檢查變更",
|
|
702
741
|
backendUnavailable: "{0}(已移除,請選擇其他 backend)",
|
|
742
|
+
backendNotInstalled: "未安裝", backendNotSignedIn: "未登入(請用 /login)", backendTooOld: "需要 {0} 以上版本", backendUnchecked: "尚未檢查",
|
|
743
|
+
modelNotListed: "目前使用中 — 不在這個 CLI 的清單裡", modelOther: "其他…", modelOtherLabel: "模型名稱", modelOtherPlaceholder: "這個 CLI 接受的模型名稱",
|
|
744
|
+
modelNone: "— 無 —", inheritValue: "沿用({0})", modelCliDefault: "CLI 自己的預設",
|
|
703
745
|
readyApply: "可套用變更",
|
|
704
746
|
copied: "已複製",
|
|
705
747
|
expectedMapping: "預期為 mapping",
|
|
@@ -718,7 +760,7 @@ register("settings", {
|
|
|
718
760
|
staggerWarning: "數值太低可能造成啟動尖峰",
|
|
719
761
|
sec_device: "偏好設定", syncedTitle: "在你所有的裝置同步", syncedLead: "這裡的變更會套用到你登入的每一台裝置。",
|
|
720
762
|
profileTitle: "你的名字",
|
|
721
|
-
profileLeadBound: "agent 會把你從網頁送出的訊息,認成收到登入驗證碼的那個 Discord 或 Telegram 帳號:用它的 id
|
|
763
|
+
profileLeadBound: "agent 會把你從網頁送出的訊息,認成收到登入驗證碼的那個 Discord 或 Telegram 帳號:用它的 id,名字也用它的,除非你在這裡另外取名。它會跟著你到每一台登入的裝置。一般的請求,agent 會當作是你本人提出的;發布、破壞性操作、花費、密鑰,或把你的授權交給別人,則要先授權這個瀏覽器,或在 Discord、Telegram 上確認。",
|
|
722
764
|
profileLeadUnbound: "這個瀏覽器不是用私訊到你 Discord 或 Telegram 帳號的驗證碼登入的,所以 agent 會把你的網頁訊息看成「web-user」(或你在這裡設定的名字)。用 /web 的驗證碼登入,就能被認成你的帳號。",
|
|
723
765
|
profileName: "名字", profileHelp: "agent 看到:{0} · id {1}", profileSave: "儲存", profileClear: "改回 web-user", profileUseAccount: "改用 {0}",
|
|
724
766
|
profileSaved: "agent 現在會看到你是 {0}", profileFailed: "無法儲存名字",
|
|
@@ -785,17 +827,18 @@ register("settings", {
|
|
|
785
827
|
webChat: "網頁聊天",
|
|
786
828
|
sec_web: "網頁",
|
|
787
829
|
sec_appearance: "網頁外觀",
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
830
|
+
groupLook: "外觀", groupLayout: "你的版面", groupCss: "自己寫的樣式", groupMods: "擴充", groupAdvanced: "進階", learnMore: "了解更多:{0}",
|
|
831
|
+
colorTitle: "識別色", colorLead: "單一 agent 的顏色:⋯ 選單 → 顏色…",
|
|
832
|
+
colorPlaces: "顏色顯示的位置", colorSample: "範例 agent", colorOff: "關閉顏色",
|
|
833
|
+
colorOffLead: "已挑選的顏色會保留。",
|
|
834
|
+
restoreTitle: "還原預設值", restoreLead: "把這台主機的外觀改回預設值,會先詢問。",
|
|
835
|
+
restoreConfirm: "會重設這台主機的:是否顯示 agent 的主題與效果、卡片大小與各張卡片自己的大小、你的側欄小工具、顏色顯示的位置、是否關閉顏色;也會關閉你的自訂 CSS(版本會保留)與這台裝置上的 CSS 開關。不變:有人替 agent 挑的顏色、已安裝的 mod、上傳的效果與卡片上限。",
|
|
793
836
|
restoreGo: "還原預設值", restoreDone: "外觀設定已改回預設值。", restoreCssFailed: "設定已改回預設值,但無法關閉你的自訂 CSS:{0}",
|
|
794
837
|
cardSizeTitle: "身分卡",
|
|
795
|
-
cardSizeLead: "
|
|
838
|
+
cardSizeLead: "卡片上的 小/中/大 可單獨設定。",
|
|
796
839
|
cardLimitsTitle: "身分卡上傳限制",
|
|
797
|
-
cardLimitsLead: "
|
|
798
|
-
cardLimitsUnavailable: "
|
|
840
|
+
cardLimitsLead: "留空=預設值。調高上限需管理員確認。",
|
|
841
|
+
cardLimitsUnavailable: "只有已登入的管理者能修改。",
|
|
799
842
|
cardLimit_portrait_max_width: "肖像寬度(px)", cardLimit_portrait_max_height: "肖像高度(px)", cardLimit_portrait_max_kib: "肖像大小(KiB)",
|
|
800
843
|
cardLimit_banner_max_width: "橫幅寬度(px)", cardLimit_banner_max_height: "橫幅高度(px)", cardLimit_banner_max_kib: "橫幅大小(KiB)",
|
|
801
844
|
cardLimit_instance_quota_files: "每個 agent 的圖片數", cardLimit_instance_quota_mib: "每個 agent 的圖片空間(MiB)",
|
|
@@ -807,10 +850,12 @@ register("settings", {
|
|
|
807
850
|
cardLimitsFailed: "未儲存:{0}",
|
|
808
851
|
themesTitle: "Agent 的主題",
|
|
809
852
|
themesShow: "顯示 agent 的主題、效果與小工具",
|
|
810
|
-
themesShowLead: "
|
|
853
|
+
themesShowLead: "關閉時每個聊天看起來都一樣。",
|
|
854
|
+
themesFollowMotion: "效果:跟隨系統的「減少動態效果」設定",
|
|
855
|
+
themesFollowMotionLead: "只套用於這台裝置:系統減少動態效果時,效果保持靜止。",
|
|
811
856
|
themesSafeMode: "這個頁面是用 ?safe=1 開啟的:不顯示 agent 的主題。",
|
|
812
857
|
widgetTitle: "你的側邊欄小工具",
|
|
813
|
-
widgetLead: "
|
|
858
|
+
widgetLead: "agent 清單下方的小面板,用 JSON 撰寫。",
|
|
814
859
|
widgetNotJson: "不是 JSON。",
|
|
815
860
|
widgetSave: "儲存小工具",
|
|
816
861
|
widgetSaved: "已儲存側邊欄小工具。",
|
|
@@ -818,7 +863,7 @@ register("settings", {
|
|
|
818
863
|
widgetRemove: "移除小工具",
|
|
819
864
|
widgetRemoved: "已移除側邊欄小工具。",
|
|
820
865
|
modsTitle: "Mod",
|
|
821
|
-
modsLead: "
|
|
866
|
+
modsLead: "只套用你勾選的部分。",
|
|
822
867
|
modsLoadFailed: "無法載入已安裝的 mod。請重新載入頁面再試一次。",
|
|
823
868
|
modsNone: "尚未安裝任何 mod。",
|
|
824
869
|
modChoose: "匯入 mod 檔案…",
|
|
@@ -829,6 +874,7 @@ register("settings", {
|
|
|
829
874
|
modReplace: "取代已安裝的 {0} 版",
|
|
830
875
|
modPartTheme: "主題(顏色、字型、圖片)",
|
|
831
876
|
modPartIdentity: "身分卡文字(標語與簡介)",
|
|
877
|
+
modPartAmbient: "環境效果(飄落、上升、閃爍或點擊符號)",
|
|
832
878
|
modPartWidget_chat_header: "聊天標頭小工具",
|
|
833
879
|
modPartWidget_details: "詳細資料頁小工具",
|
|
834
880
|
modPartWidget_sidebar: "你的側邊欄小工具",
|
|
@@ -855,7 +901,7 @@ register("settings", {
|
|
|
855
901
|
modUninstallConfirm: "要解除安裝 {0} 嗎?它的效果會離開你的效果庫,除非還有東西在使用。它已套用的外觀會保留。",
|
|
856
902
|
modUninstalled: "已解除安裝 {0}。",
|
|
857
903
|
modExport: "匯出 mod",
|
|
858
|
-
modExportLead: "
|
|
904
|
+
modExportLead: "把目前生效的外觀存成 mod 檔。",
|
|
859
905
|
modExportInstance: "Agent",
|
|
860
906
|
modExportName: "名稱(a-z、0-9、-)",
|
|
861
907
|
modExportVersion: "版本",
|
|
@@ -867,7 +913,7 @@ register("settings", {
|
|
|
867
913
|
modReview: "檢視",
|
|
868
914
|
modDismiss: "略過",
|
|
869
915
|
cssTitle: "自訂 CSS(只套用在你自己)",
|
|
870
|
-
cssLead: "
|
|
916
|
+
cssLead: "只套用在你的畫面。",
|
|
871
917
|
cssLoadFailed: "無法載入你的自訂 CSS。請重新整理頁面再試一次。",
|
|
872
918
|
cssPublicLink: "臨時公開連結無法使用自訂 CSS。",
|
|
873
919
|
cssInForce: "使用中:{0}",
|
|
@@ -880,15 +926,14 @@ register("settings", {
|
|
|
880
926
|
cssCurrent: "使用中",
|
|
881
927
|
cssRestore: "改用這版",
|
|
882
928
|
cssAssets: "資源",
|
|
883
|
-
cssAssetsLead: "
|
|
929
|
+
cssAssetsLead: "{0} / {1} 個檔案,合計 {2}(全部合計最多 1 MiB)。",
|
|
884
930
|
cssAssetAdd: "加入圖片或字型",
|
|
885
931
|
cssAssetCopy: "複製引用",
|
|
886
932
|
cssCopied: "已複製 {0}",
|
|
887
933
|
cssAssetRemove: "移除",
|
|
888
934
|
cssDeviceTitle: "這台裝置",
|
|
889
935
|
cssDeviceOff: "在這台裝置關閉自訂 CSS",
|
|
890
|
-
|
|
891
|
-
cssSafe: "畫面被藏起來或壞掉了嗎?在任何頁面網址的最後加上 ?safe=1,就會不套用自訂 CSS 地載入。",
|
|
936
|
+
cssSafe: "畫面被藏起來?在網址後加上 ?safe=1。",
|
|
892
937
|
cssError_at_rule: "未儲存:不允許使用 {0}。",
|
|
893
938
|
cssError_url: "未儲存:url() 只能用 url(\"asset:<id>\") 引用「資源」裡的檔案。",
|
|
894
939
|
cssError_unknown_asset: "未儲存:找不到資源 {0}。請先在「資源」加入它。",
|
|
@@ -921,6 +966,28 @@ register("settings", {
|
|
|
921
966
|
webTerminalTtl: "終端機 session 分鐘數(1–20)",
|
|
922
967
|
webTerminalTtlRange: "必須是 1 到 20 之間的整數",
|
|
923
968
|
webReadOnlyTitle: "在 fleet.yaml 設定",
|
|
969
|
+
guestsTitle: "訪客", guestsReview: "檢視訪客變更",
|
|
970
|
+
guestsHint: "不是管理者的人可以用訪客身分登入網頁:在他本來就能聊天的地方傳 /web,就會私下收到登入碼。訪客只會看到在聊天中本來就能用的 agent,他的訊息僅供辨識。",
|
|
971
|
+
guestsEnabled: "訪客登入", guestsEnabledHint: "關閉:沒有人能以訪客登入,所有訪客 session 都會結束。開啟需 fleet admin 確認。",
|
|
972
|
+
guestsChat: "訪客可以聊天", guestsChatHint: "關閉:訪客可以讀他的 agent 的聊天,但不能送訊息、附加檔案、按回覆的按鈕或按取消。",
|
|
973
|
+
guestsOpenFor: "{0}({1})訪客可用的 agent", guestsOpenHint: "這個連線對所有人開放,沒有人員名單:它的訪客只能用你在這裡勾選的 agent(預設沒有)。新增 agent 需 fleet admin 確認。",
|
|
974
|
+
guestsList: "訪客帳號", guestsNone: "還沒有訪客登入過。", guestsLoadFailed: "無法載入訪客清單。",
|
|
975
|
+
guestFacts: "agent:{0} · session:{1} · 記住的瀏覽器:{2}", guestLastActive: "最後使用 {0}", guestNotSignedIn: "目前未登入",
|
|
976
|
+
guestNotNarrowed: "可用他在聊天中能用的所有 agent。", guestNarrowedTo: "已縮小為:{0}", guestNothing: "無",
|
|
977
|
+
guestNarrow: "縮小範圍", guestNotReachable: "(已無法使用)", guestReachesNothing: "這個帳號目前在聊天中沒有能用的 agent,沒有可以縮小的範圍。", guestNarrowLift: "取消縮小", guestNarrowHint: "勾選這位訪客仍可使用的 agent。縮小只會拿走權限(立即生效);放寬或取消縮小需 fleet admin 確認。",
|
|
978
|
+
guestSignOut: "登出", guestSignOutTitle: "登出這位訪客?", guestSignOutConfirm: "{0} 的訪客 session 會立即結束,登入碼失效,記住的瀏覽器也會被忘記。訪客登入開啟期間,他可以再傳 /web 登入。",
|
|
979
|
+
guestSignedOut: "已登出 {0}。", guestSignedOutNotDurable: "已暫時登出 {0},但無法保存:重新啟動後他的 session 可能會恢復。", guestSignOutFailed: "沒有成功,請再試一次。",
|
|
980
|
+
vaTitle: "網頁授權", vaReview: "檢視網頁授權變更",
|
|
981
|
+
vaHint: "已登入的 fleet 管理者從網頁送出的訊息,是否帶有他本人帳號的授權,記錄在每則訊息的送達收據中。用私下傳給該帳號的登入碼、透過直接連線的 dashboard 登入的 session,要在 Discord 或 Telegram 上授權一次;公開連結與訪客一律不行。一般的網頁請求,agent 本來就會照做;發布、破壞性操作、花費、密鑰,或把授權交給別人,則需要它。",
|
|
982
|
+
vaLoadFailed: "無法載入網頁授權。",
|
|
983
|
+
vaEnabled: "網頁訊息帶有授權", vaEnabledHint: "預設開啟:session 要等它的帳號在 Discord 或 Telegram 上確認後才帶有授權。關閉:網頁訊息都不帶授權,已給出的授權立即視為無;關閉前給出的授權不會恢復。",
|
|
984
|
+
vaStuckOff: "網頁授權目前是關閉的:它的狀態無法存到這台電腦上(請看 fleet 紀錄)。可以存入後會自動恢復。",
|
|
985
|
+
vaLoopbackOnly: "只有這台電腦可以授權", vaLoopbackOnlyHint: "開啟:只有這台電腦上的瀏覽器符合,網路或 tailnet 上的不算,之前從其他地方給出的授權視為無。再關掉也不會讓那些授權恢復。",
|
|
986
|
+
vaLanWarning: "dashboard 也接受 {0} 的連線(web.allowed_hosts)。任何人只要從那裡連上、又拿到被盜的登入,就能以你的名義給出授權。除非你信任所有能連到那裡的人,否則請開啟「只有這台電腦可以授權」。",
|
|
987
|
+
vaHours: "一次授權的有效期(小時,{0}–{1})", vaHoursRange: "必須是 1 到 48 之間的數字",
|
|
988
|
+
vaSessionsTitle: "已授權的 session", vaSessionsNone: "目前沒有已授權的 session。", vaSessionUntil: "{0} 授權 · 到 {1}",
|
|
989
|
+
vaRevoke: "撤銷網頁授權", vaRevokeTitle: "撤銷所有網頁授權?", vaRevokeConfirm: "到目前為止從網頁給出的授權,從現在起都視為無,所有 session 的授權也會結束。不會登出任何人:session 再授權一次後,送出的訊息會再帶有授權。",
|
|
990
|
+
vaRevoked: "已撤銷到目前為止的網頁授權。", vaRevokedNotDurable: "已暫時撤銷,但無法保存:在可以保存之前網頁授權會保持關閉,而在那之前重新啟動會讓這次撤銷失效。", vaRevokeFailed: "沒有成功,請再試一次。",
|
|
924
991
|
webReadOnlyLead: "這裡僅供檢視:這些設定決定儀表板監聽和公開的內容。請編輯 fleet.yaml 後執行 agend reload(web.preview_port 與 web.preview_origin 需要重新啟動 AgEnD)。",
|
|
925
992
|
notSet: "未設定(預設)",
|
|
926
993
|
defaultsTitle: "預設值",
|
|
@@ -969,7 +1036,19 @@ register("settings", {
|
|
|
969
1036
|
discardOnLeave: "要捨棄 {0} 項尚未套用的變更嗎?",
|
|
970
1037
|
applyBusyLocal: "還有一次套用在進行中——請等它完成。",
|
|
971
1038
|
applyStepFailed: "在某項變更停下:{0}。之後的變更沒有套用,已重新暫存。",
|
|
972
|
-
|
|
1039
|
+
applyError_unsupported_sensitive_effect: "它改到的設定無法在確認中安全顯示,所以什麼都沒有改",
|
|
1040
|
+
applyError_confirmation_diff_too_large: "一次要確認的內容太多;請分幾次套用",
|
|
1041
|
+
applyError_session_required: "你的登入已經結束;請重新登入再套用",
|
|
1042
|
+
applyError_admin_required: "只有 fleet 管理者能確認它",
|
|
1043
|
+
applyError_settings_changed: "設定在這期間被改過了;請檢查後再套用一次",
|
|
1044
|
+
applyError_request_no_longer_current: "設定在這期間被改過了;請檢查後再套用一次",
|
|
1045
|
+
applyError_too_many_pending_changes: "等待確認的變更太多;請先確認或撤回一些",
|
|
1046
|
+
applyError_fleet_unavailable: "fleet 沒有在執行",
|
|
1047
|
+
applyError_invalid_settings_effect: "改完的結果不是有效的設定",
|
|
1048
|
+
applyError_settings_confirmation_unavailable: "無法建立它的確認;請再試一次",
|
|
1049
|
+
applyError_failed: "伺服器無法套用它",
|
|
1050
|
+
applyErrorOther: "伺服器拒絕了它({0})",
|
|
1051
|
+
stepWaiting: "等待確認",
|
|
973
1052
|
stepSkipped: "未套用",
|
|
974
1053
|
viaRestart: "(重新啟動)",
|
|
975
1054
|
format: "格式",
|
|
@@ -986,7 +1065,6 @@ register("settings", {
|
|
|
986
1065
|
discordUserPlaceholder: "你的 Discord 使用者 id",
|
|
987
1066
|
telegramUserPlaceholder: "你的 Telegram 使用者 id",
|
|
988
1067
|
bindingApplyButton: "改綁",
|
|
989
|
-
webEchoEnable: "開啟網頁轉發",
|
|
990
1068
|
help1: "Agent:每個 agent 的設定、啟動/停止、暫停/喚醒,以及新增 agent。",
|
|
991
1069
|
help2: "連線:誰可以使用各個 bot、它的綁定、狀態表情、新的 token;以及供應商 API key。",
|
|
992
1070
|
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");
|
|
@@ -60,7 +60,7 @@ export function t(key, ...values) {
|
|
|
60
60
|
|
|
61
61
|
register("app", {
|
|
62
62
|
en: {
|
|
63
|
-
brand: "AgEnD", fleet: "Fleet", fleetOverview: "Fleet
|
|
63
|
+
brand: "AgEnD", fleet: "Fleet", fleetOverview: "Fleet", view: "View", settings: "Settings", instances: "Instances", newInstance: "New instance", newAgent: "New agent",
|
|
64
64
|
collapse: "Hide the sidebar", expand: "Show the sidebar", openMenu: "Open the sidebar", closeMenu: "Close the sidebar",
|
|
65
65
|
resizeSidebar: "Sidebar width", resizeSidebarHint: "Drag to resize · double-click to reset",
|
|
66
66
|
names: "Names", namesNickname: "Nickname first", namesInstance: "Real name first",
|
|
@@ -74,6 +74,7 @@ register("app", {
|
|
|
74
74
|
hydrating: "Loading what is open now…", hydrateFailed: "Could not load what is open now (prompts, ticks).",
|
|
75
75
|
skip: "Skip to the conversation", loadFailed: "This could not be loaded.", retry: "Try again", loading: "Loading…",
|
|
76
76
|
noInstances: "No instances yet", noInstancesHint: "Create one to start chatting.",
|
|
77
|
+
guestChip: "Guest", guestAs: "Guest · {0}", guestAsOn: "Guest · {0} ({1})", guestHint: "You see only the agents you can already use in chat.",
|
|
77
78
|
session: "Session", signIn: "Sign in", signedIn: "Signed in", signedOut: "Not signed in", thisDevice: "This device", devicePrefs: "Theme and language",
|
|
78
79
|
lastActive: "active {0}", justNow: "just now", minAgo: "{0} min ago", hrAgo: "{0} h ago", signOut: "Sign out",
|
|
79
80
|
signOutAll: "Sign out everywhere", devices: "Signed-in devices", expires: "Ends by {0} at the latest, or after {1} unused",
|
|
@@ -92,7 +93,7 @@ register("app", {
|
|
|
92
93
|
needs_reason_hang: "Not responding", needs_reason_exited: "Exited", needs_reason_assist: "Waiting at its terminal", needs_reason_permission: "Permission needed", needs_reason_dangerous_command: "Dangerous command waiting", needs_reason_login: "Sign-in needed", needs_reason_dialog: "Waiting at a dialog", needs_reason_terminal_input: "May be waiting for input", needs_reason_auth_paused: "Paused: sign-in needed", needs_reason_crashed: "Crashed", needs_reason_delivery_uncertain: "Could not confirm delivery", needs_reason_delivery_failed: "Delivery failed",
|
|
93
94
|
},
|
|
94
95
|
"zh-TW": {
|
|
95
|
-
brand: "AgEnD", fleet: "Fleet", fleetOverview: "Fleet 概覽", view: "檢視", settings: "設定", instances: "Instances", newInstance: "新增 instance",
|
|
96
|
+
brand: "AgEnD", fleet: "Fleet", fleetOverview: "Fleet 概覽", view: "檢視", settings: "設定", instances: "Instances", newInstance: "新增 instance", newAgent: "新增 Agent",
|
|
96
97
|
collapse: "隱藏側邊欄", expand: "顯示側邊欄", openMenu: "打開側邊欄", closeMenu: "關閉側邊欄",
|
|
97
98
|
resizeSidebar: "側邊欄寬度", resizeSidebarHint: "拖曳調整寬度 · 按兩下恢復預設",
|
|
98
99
|
names: "名稱", namesNickname: "暱稱優先", namesInstance: "實際名稱優先",
|
|
@@ -106,6 +107,7 @@ register("app", {
|
|
|
106
107
|
hydrating: "正在載入目前的狀態…", hydrateFailed: "無法載入目前的狀態(提示、送達標記)。",
|
|
107
108
|
skip: "跳到對話", loadFailed: "無法載入。", retry: "再試一次", loading: "載入中…",
|
|
108
109
|
noInstances: "還沒有 instance", noInstancesHint: "建立一個就能開始聊天。",
|
|
110
|
+
guestChip: "訪客", guestAs: "訪客 · {0}", guestAsOn: "訪客 · {0}({1})", guestHint: "你只會看到在聊天中本來就能用的 agent。",
|
|
109
111
|
session: "登入狀態", signIn: "登入", signedIn: "已登入", signedOut: "尚未登入", thisDevice: "這台裝置", devicePrefs: "主題與語言",
|
|
110
112
|
lastActive: "{0}活動", justNow: "剛剛", minAgo: "{0} 分鐘前", hrAgo: "{0} 小時前", signOut: "登出",
|
|
111
113
|
signOutAll: "全部登出", devices: "已登入的裝置", expires: "最晚 {0} 結束;閒置 {1} 也會結束",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
// - The status frame's prefs_rev: another device changed something; the host's values are read again and applied. A
|
|
19
19
|
// revision counts as seen only once its read succeeded (a failed one is tried again, at most every few seconds).
|
|
20
20
|
import { deviceLanguage, lang, setLang } from "./app-i18n.js";
|
|
21
|
-
import { appStore } from "./app-store.js";
|
|
21
|
+
import { appStore, guestPage } from "./app-store.js";
|
|
22
22
|
|
|
23
23
|
const SYNCED_FLAG = "agend_prefs_synced";
|
|
24
24
|
const RETRY_MS = 5000;
|
|
@@ -31,6 +31,7 @@ export const SYNCED = {
|
|
|
31
31
|
"nav.collapsed": { ls: "agend_instance_collapsed", ...json },
|
|
32
32
|
"nav.filter": { ls: "agend_instance_filter", ...json },
|
|
33
33
|
"nav.favorites": { ls: "agend_favorites", ...json }, // #1664
|
|
34
|
+
"nav.sort": { ls: "agend_nav_sort", ...json }, // #2179
|
|
34
35
|
"preview.optIn": { ls: "agend_html_preview", toLocal: (v) => (v ? "on" : null), fromLocal: (s) => (s === "on" ? true : undefined) },
|
|
35
36
|
"names.primary": { ls: "agend_names_primary", toLocal: (v) => (v === "instance" ? v : null), fromLocal: (s) => (s === "instance" ? s : undefined) }, // #1722
|
|
36
37
|
// #1629 r2 (d): "Show agents' themes and effects" — on unless turned off (only "off" is cached).
|
|
@@ -40,7 +41,7 @@ export const SYNCED = {
|
|
|
40
41
|
"card.sizeByInstance": { ls: "agend_card_sizes", ...json },
|
|
41
42
|
// #1629 r4-4: the person's own sidebar widget ({ spec, data }), drawn by the page's own components.
|
|
42
43
|
"widget.sidebar": { ls: "agend_widget_sidebar", ...json },
|
|
43
|
-
// #1958: where identity colours show by default (
|
|
44
|
+
// #1958: where identity colours show by default (#2056: name, bar and ring unless chosen), and the host's switch to turn them off.
|
|
44
45
|
"color.show": { ls: "agend_color_show", ...json },
|
|
45
46
|
"color.off": { ls: "agend_color_off", toLocal: (v) => (v === true ? "on" : null), fromLocal: (s) => (s === "on" ? true : undefined) },
|
|
46
47
|
};
|
|
@@ -88,9 +89,9 @@ if (host) {
|
|
|
88
89
|
}
|
|
89
90
|
}
|
|
90
91
|
|
|
91
|
-
/** This page may change the host's preferences: the signed-in app, not over the public link. */
|
|
92
|
+
/** This page may change the host's preferences: the signed-in app, not over the public link, not a guest's (#1920). */
|
|
92
93
|
export function prefsWritable() {
|
|
93
|
-
return !!initial && !(typeof document !== "undefined" && document.body && document.body.dataset.publicLink === "1");
|
|
94
|
+
return !!initial && !guestPage() && !(typeof document !== "undefined" && document.body && document.body.dataset.publicLink === "1");
|
|
94
95
|
}
|
|
95
96
|
/**
|
|
96
97
|
* The value in force for a key, in memory — never only in this browser's storage (a full storage must not bring back
|