@songsid/agend 2.2.0 → 2.2.5
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 +284 -2
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-endpoint.d.ts +2 -0
- package/dist/agent-endpoint.js +29 -0
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/agent-file-read.d.ts +38 -0
- package/dist/agent-file-read.js +317 -0
- package/dist/agent-file-read.js.map +1 -0
- package/dist/agent-whats-new.d.ts +11 -0
- package/dist/agent-whats-new.js +34 -2
- 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 +30 -1
- package/dist/auth-api.js +61 -12
- 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/antigravity.js +3 -3
- package/dist/backend/antigravity.js.map +1 -1
- 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/launch-effort.js +1 -1
- package/dist/backend/launch-effort.js.map +1 -1
- package/dist/backend/muse.js +10 -2
- package/dist/backend/muse.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-client-retirement.d.ts +5 -0
- package/dist/channel/adapters/discord-client-retirement.js +57 -0
- package/dist/channel/adapters/discord-client-retirement.js.map +1 -0
- package/dist/channel/adapters/discord.d.ts +11 -0
- package/dist/channel/adapters/discord.js +66 -6
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +8 -1
- package/dist/channel/adapters/telegram.js +74 -4
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/mcp-tools.js +48 -2
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/types.d.ts +21 -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 +142 -110
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.js +119 -4
- package/dist/config-validator.js.map +1 -1
- package/dist/daemon.d.ts +10 -0
- package/dist/daemon.js +327 -31
- 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 +15 -0
- package/dist/fleet-manager.d.ts +514 -12
- package/dist/fleet-manager.js +1885 -163
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-process-handlers.d.ts +18 -0
- package/dist/fleet-process-handlers.js +69 -0
- package/dist/fleet-process-handlers.js.map +1 -0
- package/dist/fleet-traffic.d.ts +74 -0
- package/dist/fleet-traffic.js +196 -0
- package/dist/fleet-traffic.js.map +1 -0
- package/dist/general-knowledge/skills/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 +492 -0
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +482 -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-avatar.js +3 -0
- package/dist/instance-avatar.js.map +1 -1
- package/dist/instance-config-impact.js +6 -1
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +2 -0
- package/dist/instance-lifecycle.js +20 -10
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instance-names.d.ts +4 -0
- package/dist/instance-names.js +12 -0
- package/dist/instance-names.js.map +1 -0
- package/dist/instructions.d.ts +12 -1
- package/dist/instructions.js +13 -2
- package/dist/instructions.js.map +1 -1
- package/dist/locale.js +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/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 +15 -0
- package/dist/outbound-handlers.js +152 -11
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +228 -4
- package/dist/outbound-schemas.js +147 -1
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/public-web-gateway.js +21 -1
- 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/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-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 +70 -1
- package/dist/scheduler/scheduler.js +256 -17
- 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 +23 -0
- package/dist/settings-api.js +233 -2
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-change.js +112 -0
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-effect.js +32 -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/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 +100 -2
- package/dist/tool-permissions.js.map +1 -1
- package/dist/topic-commands.d.ts +17 -7
- package/dist/topic-commands.js +39 -21
- 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/types.d.ts +61 -1
- package/dist/ui/app-effects.js +245 -0
- package/dist/ui/chat-ambient.js +307 -0
- package/dist/ui/chat-effect-posters.js +42 -0
- package/dist/ui/chat-effects.js +160 -0
- package/dist/ui/chat-live-replies.js +58 -0
- package/dist/ui/chat-render.js +25 -7
- package/dist/ui/chat-store.js +41 -13
- package/dist/ui/chat-strings.js +86 -2
- package/dist/ui/chat-thread.js +204 -37
- package/dist/ui/chat-tour.js +1 -1
- package/dist/ui/effect-trial-controller.js +124 -0
- package/dist/ui/effect-trial-offer.js +31 -0
- package/dist/ui/effect-trial-panel.js +40 -0
- 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/image-lightbox.js +1 -1
- package/dist/ui/panel-chat.js +252 -58
- package/dist/ui/panel-details.js +20 -6
- package/dist/ui/panel-fleet.js +45 -19
- package/dist/ui/panel-log.js +6 -6
- package/dist/ui/panel-needs.js +3 -3
- package/dist/ui/panel-settings.js +58 -13
- package/dist/ui/preview-panel.js +25 -9
- package/dist/ui/preview.js +3 -2
- package/dist/ui/settings-appearance.js +349 -0
- package/dist/ui/settings-catalog.js +92 -0
- package/dist/ui/settings-dialogs.js +40 -12
- package/dist/ui/settings-effects.js +202 -0
- 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 +271 -0
- package/dist/ui/settings-owner-effects.js +80 -0
- package/dist/ui/settings-strings.js +335 -10
- package/dist/ui/settings-web-authority.js +91 -0
- package/dist/ui/shared/agend-auth.js +28 -4
- package/dist/ui/shared/agent-widget.js +248 -0
- package/dist/ui/shared/app-i18n.js +6 -2
- package/dist/ui/shared/app-prefs.js +34 -13
- package/dist/ui/shared/app-route.js +42 -2
- package/dist/ui/shared/app-session.js +3 -1
- package/dist/ui/shared/app-shell.js +119 -41
- package/dist/ui/shared/app-store.js +28 -1
- package/dist/ui/shared/app-stream.js +14 -7
- package/dist/ui/shared/app-themes.js +206 -0
- package/dist/ui/shared/app.css +566 -5
- package/dist/ui/shared/app.js +23 -10
- package/dist/ui/shared/card-strings.js +32 -0
- package/dist/ui/shared/effect-app-runtime.js +297 -0
- package/dist/ui/shared/effect-baseline.js +64 -0
- package/dist/ui/shared/effect-chat-runtime.js +167 -0
- package/dist/ui/shared/effect-cursor.js +125 -0
- package/dist/ui/shared/effect-frame.js +146 -0
- package/dist/ui/shared/effect-geometry.js +137 -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 +122 -0
- package/dist/ui/shared/effect-policy.js +151 -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 +184 -0
- package/dist/ui/shared/effect-profiles.js +65 -0
- package/dist/ui/shared/effect-registry.js +543 -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 +43 -0
- package/dist/ui/shared/effect-stock-trust.js +217 -0
- package/dist/ui/shared/effect-trial-shadow.js +62 -0
- package/dist/ui/shared/effect-trial-source.js +103 -0
- package/dist/ui/shared/effect-trial-stage.js +170 -0
- package/dist/ui/shared/effect-trial.css +40 -0
- package/dist/ui/shared/fx-motion.js +67 -0
- package/dist/ui/shared/header-tools.js +1 -1
- package/dist/ui/shared/identity-card.js +273 -0
- package/dist/ui/shared/identity-color.js +261 -0
- package/dist/ui/shared/instance-nav.js +215 -41
- package/dist/ui/shared/owner-css.js +250 -0
- package/dist/ui/shared/owner-effect-prefs.js +117 -0
- package/dist/ui/shared/panel-view.js +103 -10
- package/dist/ui/shared/signin.js +2 -0
- package/dist/ui/shared/tokens.css +9 -3
- 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/usage-dialog.js +22 -2
- package/dist/ui/shared/view-strings.js +98 -2
- package/dist/ui/shared/web-authorize.js +151 -0
- package/dist/ui/signin.html +1 -0
- 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 +68 -0
- package/dist/view-api.js +249 -8
- 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 +117 -7
- package/dist/web-api.js +1283 -70
- 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 +64 -0
- package/dist/web-appearance-policy.js +87 -0
- package/dist/web-appearance-policy.js.map +1 -0
- package/dist/web-appearance-tools.d.ts +53 -0
- package/dist/web-appearance-tools.js +124 -0
- package/dist/web-appearance-tools.js.map +1 -0
- package/dist/web-appearance-view.d.ts +124 -0
- package/dist/web-appearance-view.js +278 -0
- package/dist/web-appearance-view.js.map +1 -0
- package/dist/web-appearance.d.ts +93 -0
- package/dist/web-appearance.js +373 -0
- package/dist/web-appearance.js.map +1 -0
- package/dist/web-asset-parts.d.ts +93 -0
- package/dist/web-asset-parts.js +133 -0
- package/dist/web-asset-parts.js.map +1 -0
- package/dist/web-auth.js +20 -2
- package/dist/web-auth.js.map +1 -1
- package/dist/web-card.d.ts +110 -0
- package/dist/web-card.js +266 -0
- package/dist/web-card.js.map +1 -0
- 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 +63 -0
- package/dist/web-chat-history.js +109 -6
- 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.d.ts +28 -0
- package/dist/web-effect-bundle.js +171 -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-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-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 +93 -0
- package/dist/web-effect-service.js +335 -0
- package/dist/web-effect-service.js.map +1 -0
- package/dist/web-effect-tools.d.ts +48 -0
- package/dist/web-effect-tools.js +129 -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 +27 -0
- package/dist/web-effect-upload.js +185 -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 +103 -0
- package/dist/web-effect.js +153 -0
- package/dist/web-effect.js.map +1 -0
- 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 +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 +38 -0
- package/dist/web-image-meta.js +262 -0
- package/dist/web-image-meta.js.map +1 -0
- package/dist/web-login.d.ts +47 -0
- package/dist/web-login.js +115 -0
- package/dist/web-login.js.map +1 -1
- package/dist/web-mod-agent.d.ts +50 -0
- package/dist/web-mod-agent.js +207 -0
- package/dist/web-mod-agent.js.map +1 -0
- package/dist/web-mod-bundle.d.ts +157 -0
- package/dist/web-mod-bundle.js +529 -0
- package/dist/web-mod-bundle.js.map +1 -0
- package/dist/web-mod-export.d.ts +68 -0
- package/dist/web-mod-export.js +100 -0
- package/dist/web-mod-export.js.map +1 -0
- package/dist/web-mod-store.d.ts +289 -0
- package/dist/web-mod-store.js +638 -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 +222 -0
- package/dist/web-owner-css-store.js +440 -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 +62 -0
- package/dist/web-prefs.js +232 -36
- package/dist/web-prefs.js.map +1 -1
- package/dist/web-preview.d.ts +15 -3
- package/dist/web-preview.js +28 -9
- 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 +67 -2
- package/dist/web-settings-patch.js +196 -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 +273 -0
- package/dist/web-settings-tools.js.map +1 -0
- package/dist/web-shell-routes.d.ts +2 -2
- package/dist/web-shell-routes.js +2 -2
- package/dist/web-shell-routes.js.map +1 -1
- package/dist/web-theme-store.d.ts +257 -0
- package/dist/web-theme-store.js +627 -0
- package/dist/web-theme-store.js.map +1 -0
- package/dist/web-theme.d.ts +123 -0
- package/dist/web-theme.js +416 -0
- package/dist/web-theme.js.map +1 -0
- 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/web-widget.d.ts +72 -0
- package/dist/web-widget.js +245 -0
- package/dist/web-widget.js.map +1 -0
- package/dist/workflow-templates/default.md +1 -1
- package/package.json +1 -1
- package/templates/systemd.service.ejs +8 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1958: an instance's identity colour — the cue people scan the sidebar by — and where it shows (its placements: the
|
|
3
|
+
* name, a bar at the row's left edge, the avatar's ring). docs/design/1958-identity-color.md has the decisions.
|
|
4
|
+
*
|
|
5
|
+
* The colour, in a fixed order:
|
|
6
|
+
* 1. person — a person's pick from the web dashboard (this module's store), shared host-wide like the profile and
|
|
7
|
+
* the identity card;
|
|
8
|
+
* 2. agent — the agent's own (#1629 theme.identity.color, else its theme accent), only where the viewer shows
|
|
9
|
+
* agents' themes;
|
|
10
|
+
* 3. role — the own bot's colour from its highest coloured Discord role (never a shared bot's);
|
|
11
|
+
* 4. auto — one of a few soft colours, chosen by a stable hash of the name (two instances may share one).
|
|
12
|
+
* The placements, likewise: a person's choice for this instance > the agent's (theme.identity.show, while themes are
|
|
13
|
+
* shown) > the host's default (web prefs `color.show`, else name, bar and ring — #2056). The host may turn colours off altogether
|
|
14
|
+
* (`color.off`): nothing is drawn, and every pick is kept for when they come back.
|
|
15
|
+
*
|
|
16
|
+
* A colour is kept and sent as `preset:<id>`, `auto:<id>` (both drawn with their light or dark value, readable on the
|
|
17
|
+
* page's background) or `#rrggbb` (a custom colour, drawn as it is; name text uses a readable shade of it).
|
|
18
|
+
* Its own table (instance_identity), never new columns on instance_profile or instance_card: "Clear card" leaves the
|
|
19
|
+
* colour alone, and an older AgEnD reading profiles.db sees what it knew.
|
|
20
|
+
*/
|
|
21
|
+
import { existsSync } from "node:fs";
|
|
22
|
+
import { join } from "node:path";
|
|
23
|
+
import { canonicalColor, contrastRatio, THEME_DEFAULTS } from "./web-theme.js";
|
|
24
|
+
import { canonicalIdentityColor, canonicalPlacements, DEFAULT_PLACEMENTS } from "./web-identity-palette.js";
|
|
25
|
+
export { AUTO_PALETTE, autoIdentityColor, canonicalIdentityColor, canonicalPlacements, DEFAULT_PLACEMENTS, IDENTITY_PALETTE, identityColorValue, PLACEMENTS } from "./web-identity-palette.js";
|
|
26
|
+
/** The sidebar's own background (src/ui/shared/tokens.css --bg-sidebar), where names are drawn as well as the page's. */
|
|
27
|
+
export const SIDEBAR_BG = { light: "#f9f9f9", dark: "#171717" };
|
|
28
|
+
/**
|
|
29
|
+
* The shade of `hex` that name text uses on a page in `mode`: the colour itself if it reads at 4.5:1 against the
|
|
30
|
+
* page's and the sidebar's backgrounds, else the nearest step toward black (light page) or white (dark page) that does.
|
|
31
|
+
*/
|
|
32
|
+
export function readableShade(hex, mode) {
|
|
33
|
+
const backgrounds = [THEME_DEFAULTS[mode].bg, SIDEBAR_BG[mode]];
|
|
34
|
+
const base = canonicalColor(hex);
|
|
35
|
+
if (!base)
|
|
36
|
+
return THEME_DEFAULTS[mode].text;
|
|
37
|
+
const toward = mode === "light" ? 0 : 255;
|
|
38
|
+
const channels = [1, 3, 5].map(i => parseInt(base.slice(i, i + 2), 16));
|
|
39
|
+
for (let step = 0; step <= 20; step++) {
|
|
40
|
+
const mix = channels.map(c => Math.round(c + (toward - c) * (step / 20)));
|
|
41
|
+
const shade = `#${mix.map(c => c.toString(16).padStart(2, "0")).join("")}`;
|
|
42
|
+
if (backgrounds.every(bg => contrastRatio(shade, bg) >= 4.5))
|
|
43
|
+
return shade;
|
|
44
|
+
}
|
|
45
|
+
return THEME_DEFAULTS[mode].text;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* The colour in force and where it comes from. `showThemes`: whether the viewer shows agents' themes (fx.show, not
|
|
49
|
+
* safe mode) — when not, the agent's tier is skipped, as the rest of the agent's theme is.
|
|
50
|
+
*/
|
|
51
|
+
export function resolveIdentityColor(t, opts) {
|
|
52
|
+
if (t.person)
|
|
53
|
+
return { color: t.person, source: "person" };
|
|
54
|
+
const agent = opts.showThemes ? canonicalIdentityColor(t.agent) : null;
|
|
55
|
+
if (agent)
|
|
56
|
+
return { color: agent, source: "agent" };
|
|
57
|
+
const role = canonicalColor(t.role);
|
|
58
|
+
if (role)
|
|
59
|
+
return { color: role, source: "role" };
|
|
60
|
+
return { color: t.auto, source: "auto" };
|
|
61
|
+
}
|
|
62
|
+
/** Where the colour shows: a person's choice, else the agent's (themes shown), else the host's default, else all three (DEFAULT_PLACEMENTS). */
|
|
63
|
+
export function resolvePlacements(t, opts) {
|
|
64
|
+
const person = canonicalPlacements(t.person);
|
|
65
|
+
if (person)
|
|
66
|
+
return { show: person, source: "person" };
|
|
67
|
+
const agent = opts.showThemes ? canonicalPlacements(t.agent) : null;
|
|
68
|
+
if (agent)
|
|
69
|
+
return { show: agent, source: "agent" };
|
|
70
|
+
return { show: canonicalPlacements(opts.hostDefault) ?? [...DEFAULT_PLACEMENTS], source: "host" };
|
|
71
|
+
}
|
|
72
|
+
/** The first cut's table (instance_color, colour only, on feat/2.3-web-mod before 2.3 ships). */
|
|
73
|
+
const LEGACY = "instance_color";
|
|
74
|
+
/** Done once per database, recorded in it: the first cut's picks were carried over (Prism #2003 P2-1). */
|
|
75
|
+
const MIGRATED = "instance_color_carried";
|
|
76
|
+
const hasTable = (db, name) => !!db.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?").get(name);
|
|
77
|
+
const migrated = (db) => hasTable(db, "instance_identity_meta") && !!db.prepare("SELECT 1 FROM instance_identity_meta WHERE key = ?").get(MIGRATED);
|
|
78
|
+
const ready = new WeakSet();
|
|
79
|
+
/**
|
|
80
|
+
* The table, made once per connection. The first cut's picks carry over once per database — recorded in
|
|
81
|
+
* instance_identity_meta, so a pick reset since never comes back on a later connection — and never over a newer choice;
|
|
82
|
+
* the old table is left as it is. Prism #2003 P2-2: a connection counts as ready only when this ran outside a
|
|
83
|
+
* transaction (a rollback would take the tables away, never the mark), and the route sets it up before its transaction.
|
|
84
|
+
*/
|
|
85
|
+
function table(db) {
|
|
86
|
+
if (!ready.has(db)) {
|
|
87
|
+
db.transaction(() => {
|
|
88
|
+
db.exec(`CREATE TABLE IF NOT EXISTS instance_identity (
|
|
89
|
+
instance_name TEXT PRIMARY KEY,
|
|
90
|
+
color TEXT,
|
|
91
|
+
show TEXT,
|
|
92
|
+
updated_at INTEGER
|
|
93
|
+
);
|
|
94
|
+
CREATE TABLE IF NOT EXISTS instance_identity_meta (key TEXT PRIMARY KEY, value TEXT);`);
|
|
95
|
+
if (!migrated(db)) {
|
|
96
|
+
if (hasTable(db, LEGACY))
|
|
97
|
+
db.exec(`INSERT OR IGNORE INTO instance_identity (instance_name, color, show, updated_at) SELECT instance_name, color, NULL, updated_at FROM ${LEGACY}`);
|
|
98
|
+
db.prepare("INSERT OR IGNORE INTO instance_identity_meta (key, value) VALUES (?, '1')").run(MIGRATED);
|
|
99
|
+
}
|
|
100
|
+
})();
|
|
101
|
+
if (!db.inTransaction)
|
|
102
|
+
ready.add(db);
|
|
103
|
+
}
|
|
104
|
+
return db;
|
|
105
|
+
}
|
|
106
|
+
const parseShow = (raw) => {
|
|
107
|
+
if (raw === null)
|
|
108
|
+
return null;
|
|
109
|
+
try {
|
|
110
|
+
return canonicalPlacements(JSON.parse(raw));
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
/** The people's choices, one row per instance. */
|
|
117
|
+
export class IdentityColorStore {
|
|
118
|
+
openDb;
|
|
119
|
+
now;
|
|
120
|
+
constructor(openDb, now = () => Date.now()) {
|
|
121
|
+
this.openDb = openDb;
|
|
122
|
+
this.now = now;
|
|
123
|
+
}
|
|
124
|
+
get(name) {
|
|
125
|
+
const row = table(this.openDb()).prepare("SELECT color, show FROM instance_identity WHERE instance_name = ?").get(name);
|
|
126
|
+
return { color: row?.color ? canonicalIdentityColor(row.color) : null, show: parseShow(row?.show ?? null) };
|
|
127
|
+
}
|
|
128
|
+
/** Every choice, for a status read: only when profiles.db exists and has the table — a read creates nothing. */
|
|
129
|
+
static all(dataDir, openDb) {
|
|
130
|
+
if (!existsSync(join(dataDir, "profiles.db")))
|
|
131
|
+
return new Map();
|
|
132
|
+
try {
|
|
133
|
+
const db = openDb();
|
|
134
|
+
const out = new Map();
|
|
135
|
+
if (hasTable(db, "instance_identity")) {
|
|
136
|
+
for (const r of db.prepare("SELECT instance_name, color, show FROM instance_identity").all()) {
|
|
137
|
+
// A value this version cannot read is no choice, not an error.
|
|
138
|
+
const p = { color: r.color ? canonicalIdentityColor(r.color) : null, show: parseShow(r.show) };
|
|
139
|
+
if (p.color || p.show)
|
|
140
|
+
out.set(r.instance_name, p);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (!migrated(db) && hasTable(db, LEGACY)) {
|
|
144
|
+
// Not carried over yet (nothing has written since): the first cut's picks read as they are, under a newer one.
|
|
145
|
+
for (const r of db.prepare(`SELECT instance_name, color FROM ${LEGACY}`).all()) {
|
|
146
|
+
const c = canonicalIdentityColor(r.color);
|
|
147
|
+
if (c && !out.has(r.instance_name))
|
|
148
|
+
out.set(r.instance_name, { color: c, show: null });
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return out;
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return new Map();
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* A person's choice, field by field: only the fields given change; `null` (or "" for the colour) clears one — the next
|
|
159
|
+
* tier shows again. Both checked before anything is written. A row with nothing left is removed.
|
|
160
|
+
*/
|
|
161
|
+
set(name, patch) {
|
|
162
|
+
const next = this.check(patch);
|
|
163
|
+
if (!next.ok)
|
|
164
|
+
return next;
|
|
165
|
+
try {
|
|
166
|
+
const db = table(this.openDb());
|
|
167
|
+
const prev = this.get(name);
|
|
168
|
+
const color = next.color === undefined ? prev.color : next.color;
|
|
169
|
+
const show = next.show === undefined ? prev.show : next.show;
|
|
170
|
+
if (color === null && show === null)
|
|
171
|
+
db.prepare("DELETE FROM instance_identity WHERE instance_name = ?").run(name);
|
|
172
|
+
else
|
|
173
|
+
db.prepare(`INSERT INTO instance_identity (instance_name, color, show, updated_at) VALUES (@n, @c, @s, @t)
|
|
174
|
+
ON CONFLICT(instance_name) DO UPDATE SET color = excluded.color, show = excluded.show, updated_at = excluded.updated_at`)
|
|
175
|
+
.run({ n: name, c: color, s: show === null ? null : JSON.stringify(show), t: this.now() });
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
return { ok: false, status: 503, error: "color_write_failed", detail: err.message };
|
|
179
|
+
}
|
|
180
|
+
return { ok: true };
|
|
181
|
+
}
|
|
182
|
+
/** The patch, checked: `undefined` for a field not given, `null` to clear it. Writes nothing. */
|
|
183
|
+
check(patch) {
|
|
184
|
+
const out = { ok: true };
|
|
185
|
+
if (patch.color !== undefined) {
|
|
186
|
+
const v = patch.color;
|
|
187
|
+
if (v === null || (typeof v === "string" && !v.trim()))
|
|
188
|
+
out.color = null;
|
|
189
|
+
else {
|
|
190
|
+
const c = canonicalIdentityColor(v);
|
|
191
|
+
if (!c)
|
|
192
|
+
return { ok: false, status: 400, error: "color", detail: "a preset id or a hex colour #rrggbb" };
|
|
193
|
+
out.color = c;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
if (patch.show !== undefined) {
|
|
197
|
+
if (patch.show === null)
|
|
198
|
+
out.show = null;
|
|
199
|
+
else {
|
|
200
|
+
const s = canonicalPlacements(patch.show);
|
|
201
|
+
if (!s)
|
|
202
|
+
return { ok: false, status: 400, error: "color_show", detail: "a list of where the colour shows: name, bar, ring (each once; [] for nowhere)" };
|
|
203
|
+
out.show = s;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return out;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=web-identity-color.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-identity-color.js","sourceRoot":"","sources":["../src/web-identity-color.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1958: the identity colour's palettes and placements — no imports, so the theme's schema (web-theme.ts) and the
|
|
3
|
+
* colour's resolution (web-identity-color.ts) both read them without a cycle.
|
|
4
|
+
*
|
|
5
|
+
* - The presets a person (or an agent) picks from: 12 clear colours.
|
|
6
|
+
* - The automatic colours (the user's decision 4): a handful of soft, low-saturation colours like the default avatar
|
|
7
|
+
* colours of Telegram and Discord, chosen by a stable hash of the name. Two instances may share one.
|
|
8
|
+
* Every value reads at 4.5:1 or better on the page's and the sidebar's background, in its mode (a test pins it).
|
|
9
|
+
*/
|
|
10
|
+
/** The presets: each one's value on the light and on the dark page. */
|
|
11
|
+
export declare const IDENTITY_PALETTE: readonly [{
|
|
12
|
+
readonly id: "red";
|
|
13
|
+
readonly light: "#cf222e";
|
|
14
|
+
readonly dark: "#ff7b72";
|
|
15
|
+
}, {
|
|
16
|
+
readonly id: "orange";
|
|
17
|
+
readonly light: "#bc4c00";
|
|
18
|
+
readonly dark: "#ffa657";
|
|
19
|
+
}, {
|
|
20
|
+
readonly id: "amber";
|
|
21
|
+
readonly light: "#8a5d00";
|
|
22
|
+
readonly dark: "#e3b341";
|
|
23
|
+
}, {
|
|
24
|
+
readonly id: "lime";
|
|
25
|
+
readonly light: "#4d7c0f";
|
|
26
|
+
readonly dark: "#a3e635";
|
|
27
|
+
}, {
|
|
28
|
+
readonly id: "green";
|
|
29
|
+
readonly light: "#1a7f37";
|
|
30
|
+
readonly dark: "#56d364";
|
|
31
|
+
}, {
|
|
32
|
+
readonly id: "teal";
|
|
33
|
+
readonly light: "#0f766e";
|
|
34
|
+
readonly dark: "#2dd4bf";
|
|
35
|
+
}, {
|
|
36
|
+
readonly id: "cyan";
|
|
37
|
+
readonly light: "#0e7490";
|
|
38
|
+
readonly dark: "#22d3ee";
|
|
39
|
+
}, {
|
|
40
|
+
readonly id: "blue";
|
|
41
|
+
readonly light: "#0a62c2";
|
|
42
|
+
readonly dark: "#7ab7ff";
|
|
43
|
+
}, {
|
|
44
|
+
readonly id: "indigo";
|
|
45
|
+
readonly light: "#4f46e5";
|
|
46
|
+
readonly dark: "#a5b4fc";
|
|
47
|
+
}, {
|
|
48
|
+
readonly id: "violet";
|
|
49
|
+
readonly light: "#8250df";
|
|
50
|
+
readonly dark: "#d2a8ff";
|
|
51
|
+
}, {
|
|
52
|
+
readonly id: "pink";
|
|
53
|
+
readonly light: "#bf3989";
|
|
54
|
+
readonly dark: "#f778ba";
|
|
55
|
+
}, {
|
|
56
|
+
readonly id: "slate";
|
|
57
|
+
readonly light: "#57606a";
|
|
58
|
+
readonly dark: "#b1bac4";
|
|
59
|
+
}];
|
|
60
|
+
/** The automatic colours: soft, and few on purpose (duplicates are fine). */
|
|
61
|
+
export declare const AUTO_PALETTE: readonly [{
|
|
62
|
+
readonly id: "sand";
|
|
63
|
+
readonly light: "#8a6d3b";
|
|
64
|
+
readonly dark: "#d4b98a";
|
|
65
|
+
}, {
|
|
66
|
+
readonly id: "clay";
|
|
67
|
+
readonly light: "#9c5a4a";
|
|
68
|
+
readonly dark: "#d9a294";
|
|
69
|
+
}, {
|
|
70
|
+
readonly id: "rose";
|
|
71
|
+
readonly light: "#9b4f6a";
|
|
72
|
+
readonly dark: "#d99ab0";
|
|
73
|
+
}, {
|
|
74
|
+
readonly id: "plum";
|
|
75
|
+
readonly light: "#7a5a8c";
|
|
76
|
+
readonly dark: "#c3a6d6";
|
|
77
|
+
}, {
|
|
78
|
+
readonly id: "dusk";
|
|
79
|
+
readonly light: "#5a628f";
|
|
80
|
+
readonly dark: "#a9b0db";
|
|
81
|
+
}, {
|
|
82
|
+
readonly id: "sea";
|
|
83
|
+
readonly light: "#3f7286";
|
|
84
|
+
readonly dark: "#92c2d4";
|
|
85
|
+
}, {
|
|
86
|
+
readonly id: "moss";
|
|
87
|
+
readonly light: "#5b7340";
|
|
88
|
+
readonly dark: "#a9c48d";
|
|
89
|
+
}, {
|
|
90
|
+
readonly id: "slate";
|
|
91
|
+
readonly light: "#5f6b78";
|
|
92
|
+
readonly dark: "#aeb8c4";
|
|
93
|
+
}];
|
|
94
|
+
export type PresetId = (typeof IDENTITY_PALETTE)[number]["id"];
|
|
95
|
+
export type AutoId = (typeof AUTO_PALETTE)[number]["id"];
|
|
96
|
+
/** What is stored and sent: a preset, an automatic colour (never stored), or a custom colour. */
|
|
97
|
+
export type IdentityColor = `preset:${PresetId}` | `auto:${AutoId}` | `#${string}`;
|
|
98
|
+
/**
|
|
99
|
+
* A colour as a person or an agent gives it — a preset's id ("blue", or "preset:blue") or a hex colour ("#abc",
|
|
100
|
+
* "#aabbcc", any case) — in the form it is kept; null for anything else (an automatic colour is never picked).
|
|
101
|
+
*/
|
|
102
|
+
export declare function canonicalIdentityColor(v: unknown): IdentityColor | null;
|
|
103
|
+
/** The colour drawn for `c` on a page in `mode`: a preset's or an automatic colour's value for that mode, a custom one as it is. */
|
|
104
|
+
export declare function identityColorValue(c: IdentityColor, mode: "light" | "dark"): string;
|
|
105
|
+
/** The automatic colour: one of AUTO_PALETTE, chosen by the name (32-bit FNV-1a over its UTF-8 bytes), the same on every load. */
|
|
106
|
+
export declare function autoIdentityColor(name: string): IdentityColor;
|
|
107
|
+
/** Where the colour shows (the user's decision 2): the name, a bar at the row's left edge, the avatar's ring. */
|
|
108
|
+
export declare const PLACEMENTS: readonly ["name", "bar", "ring"];
|
|
109
|
+
export type Placement = (typeof PLACEMENTS)[number];
|
|
110
|
+
/** The host's default where nobody chose: all three (#2056, the user 2026-10-17; it was ring and bar, #1958 decision 1). */
|
|
111
|
+
export declare const DEFAULT_PLACEMENTS: readonly Placement[];
|
|
112
|
+
/** A set of places, in PLACEMENTS order, no repeats; [] is "nowhere". null for anything else. */
|
|
113
|
+
export declare function canonicalPlacements(v: unknown): Placement[] | null;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1958: the identity colour's palettes and placements — no imports, so the theme's schema (web-theme.ts) and the
|
|
3
|
+
* colour's resolution (web-identity-color.ts) both read them without a cycle.
|
|
4
|
+
*
|
|
5
|
+
* - The presets a person (or an agent) picks from: 12 clear colours.
|
|
6
|
+
* - The automatic colours (the user's decision 4): a handful of soft, low-saturation colours like the default avatar
|
|
7
|
+
* colours of Telegram and Discord, chosen by a stable hash of the name. Two instances may share one.
|
|
8
|
+
* Every value reads at 4.5:1 or better on the page's and the sidebar's background, in its mode (a test pins it).
|
|
9
|
+
*/
|
|
10
|
+
/** The presets: each one's value on the light and on the dark page. */
|
|
11
|
+
export const IDENTITY_PALETTE = [
|
|
12
|
+
{ id: "red", light: "#cf222e", dark: "#ff7b72" },
|
|
13
|
+
{ id: "orange", light: "#bc4c00", dark: "#ffa657" },
|
|
14
|
+
{ id: "amber", light: "#8a5d00", dark: "#e3b341" },
|
|
15
|
+
{ id: "lime", light: "#4d7c0f", dark: "#a3e635" },
|
|
16
|
+
{ id: "green", light: "#1a7f37", dark: "#56d364" },
|
|
17
|
+
{ id: "teal", light: "#0f766e", dark: "#2dd4bf" },
|
|
18
|
+
{ id: "cyan", light: "#0e7490", dark: "#22d3ee" },
|
|
19
|
+
{ id: "blue", light: "#0a62c2", dark: "#7ab7ff" },
|
|
20
|
+
{ id: "indigo", light: "#4f46e5", dark: "#a5b4fc" },
|
|
21
|
+
{ id: "violet", light: "#8250df", dark: "#d2a8ff" },
|
|
22
|
+
{ id: "pink", light: "#bf3989", dark: "#f778ba" },
|
|
23
|
+
{ id: "slate", light: "#57606a", dark: "#b1bac4" },
|
|
24
|
+
];
|
|
25
|
+
/** The automatic colours: soft, and few on purpose (duplicates are fine). */
|
|
26
|
+
export const AUTO_PALETTE = [
|
|
27
|
+
{ id: "sand", light: "#8a6d3b", dark: "#d4b98a" },
|
|
28
|
+
{ id: "clay", light: "#9c5a4a", dark: "#d9a294" },
|
|
29
|
+
{ id: "rose", light: "#9b4f6a", dark: "#d99ab0" },
|
|
30
|
+
{ id: "plum", light: "#7a5a8c", dark: "#c3a6d6" },
|
|
31
|
+
{ id: "dusk", light: "#5a628f", dark: "#a9b0db" },
|
|
32
|
+
{ id: "sea", light: "#3f7286", dark: "#92c2d4" },
|
|
33
|
+
{ id: "moss", light: "#5b7340", dark: "#a9c48d" },
|
|
34
|
+
{ id: "slate", light: "#5f6b78", dark: "#aeb8c4" },
|
|
35
|
+
];
|
|
36
|
+
const PRESETS = new Map(IDENTITY_PALETTE.map(p => [p.id, p]));
|
|
37
|
+
const AUTOS = new Map(AUTO_PALETTE.map(p => [p.id, p]));
|
|
38
|
+
/** "#rgb" | "#rrggbb", any case → "#rrggbb" lowercase (web-theme.ts canonicalColor's rule); anything else → null. */
|
|
39
|
+
function hexColor(v) {
|
|
40
|
+
const m = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.exec(v);
|
|
41
|
+
if (!m)
|
|
42
|
+
return null;
|
|
43
|
+
const h = m[1].toLowerCase();
|
|
44
|
+
return h.length === 3 ? `#${h[0]}${h[0]}${h[1]}${h[1]}${h[2]}${h[2]}` : `#${h}`;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* A colour as a person or an agent gives it — a preset's id ("blue", or "preset:blue") or a hex colour ("#abc",
|
|
48
|
+
* "#aabbcc", any case) — in the form it is kept; null for anything else (an automatic colour is never picked).
|
|
49
|
+
*/
|
|
50
|
+
export function canonicalIdentityColor(v) {
|
|
51
|
+
if (typeof v !== "string")
|
|
52
|
+
return null;
|
|
53
|
+
const id = v.startsWith("preset:") ? v.slice("preset:".length) : v;
|
|
54
|
+
if (PRESETS.has(id))
|
|
55
|
+
return `preset:${id}`;
|
|
56
|
+
return hexColor(v);
|
|
57
|
+
}
|
|
58
|
+
/** The colour drawn for `c` on a page in `mode`: a preset's or an automatic colour's value for that mode, a custom one as it is. */
|
|
59
|
+
export function identityColorValue(c, mode) {
|
|
60
|
+
const p = c.startsWith("preset:") ? PRESETS.get(c.slice(7)) : c.startsWith("auto:") ? AUTOS.get(c.slice(5)) : undefined;
|
|
61
|
+
return p ? p[mode] : c;
|
|
62
|
+
}
|
|
63
|
+
/** The automatic colour: one of AUTO_PALETTE, chosen by the name (32-bit FNV-1a over its UTF-8 bytes), the same on every load. */
|
|
64
|
+
export function autoIdentityColor(name) {
|
|
65
|
+
let h = 0x811c9dc5;
|
|
66
|
+
for (const unit of new TextEncoder().encode(name)) {
|
|
67
|
+
h ^= unit;
|
|
68
|
+
h = Math.imul(h, 0x01000193) >>> 0;
|
|
69
|
+
}
|
|
70
|
+
return `auto:${AUTO_PALETTE[h % AUTO_PALETTE.length].id}`;
|
|
71
|
+
}
|
|
72
|
+
/** Where the colour shows (the user's decision 2): the name, a bar at the row's left edge, the avatar's ring. */
|
|
73
|
+
export const PLACEMENTS = ["name", "bar", "ring"];
|
|
74
|
+
/** The host's default where nobody chose: all three (#2056, the user 2026-10-17; it was ring and bar, #1958 decision 1). */
|
|
75
|
+
export const DEFAULT_PLACEMENTS = ["name", "bar", "ring"];
|
|
76
|
+
/** A set of places, in PLACEMENTS order, no repeats; [] is "nowhere". null for anything else. */
|
|
77
|
+
export function canonicalPlacements(v) {
|
|
78
|
+
if (!Array.isArray(v) || v.length > PLACEMENTS.length || !v.every(p => PLACEMENTS.includes(p)))
|
|
79
|
+
return null;
|
|
80
|
+
if (new Set(v).size !== v.length)
|
|
81
|
+
return null;
|
|
82
|
+
return PLACEMENTS.filter(p => v.includes(p));
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=web-identity-palette.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-identity-palette.js","sourceRoot":"","sources":["../src/web-identity-palette.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1629 r4 §1: what an uploaded picture or font is, how large it is, and the same file without its metadata — all
|
|
3
|
+
* from the bytes, never decoding an image. Used by owner-CSS assets (r4 §3) and the identity card (r4 §1).
|
|
4
|
+
*
|
|
5
|
+
* Metadata is removed by byte surgery:
|
|
6
|
+
* - JPEG: the APP1–APP15 and COM segments go (EXIF, GPS, XMP, ICC, comments) wherever they are — before the first
|
|
7
|
+
* scan or between the scans of a progressive file; APP0 (JFIF) and the image stay. Every scan's entropy-coded data
|
|
8
|
+
* is walked to its end, and the file must end with EOI (what follows it is dropped).
|
|
9
|
+
* - PNG: the tEXt, zTXt, iTXt, eXIf and tIME chunks go.
|
|
10
|
+
* - WebP: the EXIF and "XMP " chunks go, and VP8X's EXIF/XMP flags are cleared to match. A file shorter than its
|
|
11
|
+
* RIFF header says is refused; bytes after the RIFF end are dropped.
|
|
12
|
+
* A file this module cannot walk to its end is refused, never passed through.
|
|
13
|
+
*/
|
|
14
|
+
export type MediaKind = "png" | "jpeg" | "webp" | "gif" | "woff2";
|
|
15
|
+
export declare const MEDIA_MIME: Record<MediaKind, string>;
|
|
16
|
+
export declare const MEDIA_EXT: Record<MediaKind, string>;
|
|
17
|
+
/** The kind by magic bytes, or null. */
|
|
18
|
+
export declare function sniffMedia(b: Uint8Array): MediaKind | null;
|
|
19
|
+
/** Width and height from the headers, or null when the file does not say (or is not an image). */
|
|
20
|
+
export declare function imageSize(b: Uint8Array, kind: MediaKind): {
|
|
21
|
+
width: number;
|
|
22
|
+
height: number;
|
|
23
|
+
} | null;
|
|
24
|
+
/**
|
|
25
|
+
* A JPEG's EXIF orientation (1–8), or 1 when it has none or it cannot be read. Read from the first APP1 "Exif" segment
|
|
26
|
+
* before the first scan: IFD0's tag 0x0112, in either byte order.
|
|
27
|
+
*/
|
|
28
|
+
export declare function jpegOrientation(b: Uint8Array): number;
|
|
29
|
+
/**
|
|
30
|
+
* #2184: the size a browser draws a picture at, from its first bytes — width and height
|
|
31
|
+
* from the headers, swapped when a JPEG's EXIF orientation turns it (5–8; browsers apply it). Null when unknown.
|
|
32
|
+
*/
|
|
33
|
+
export declare function displaySize(b: Uint8Array): {
|
|
34
|
+
width: number;
|
|
35
|
+
height: number;
|
|
36
|
+
} | null;
|
|
37
|
+
/** The file without its metadata (see the module comment), or null when it cannot be walked safely. */
|
|
38
|
+
export declare function stripMetadata(b: Uint8Array, kind: MediaKind): Uint8Array | null;
|