@intent-systems/nexus 2026.1.5-3
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/CHANGELOG.md +222 -0
- package/LICENSE +21 -0
- package/README-header.png +0 -0
- package/README.md +462 -0
- package/dist/agents/agent-paths.js +16 -0
- package/dist/agents/agent-scope.js +44 -0
- package/dist/agents/auth-profiles.js +626 -0
- package/dist/agents/bash-process-registry.js +126 -0
- package/dist/agents/bash-tools.js +838 -0
- package/dist/agents/chutes-oauth.js +47 -0
- package/dist/agents/clawdbot-tools.js +62 -0
- package/dist/agents/context.js +34 -0
- package/dist/agents/defaults.js +6 -0
- package/dist/agents/memory-search.js +80 -0
- package/dist/agents/model-auth.js +115 -0
- package/dist/agents/model-catalog.js +55 -0
- package/dist/agents/model-fallback.js +210 -0
- package/dist/agents/model-scan.js +263 -0
- package/dist/agents/model-selection.js +152 -0
- package/dist/agents/models-config.js +171 -0
- package/dist/agents/nexus-tools.js +46 -0
- package/dist/agents/pi-embedded-block-chunker.js +188 -0
- package/dist/agents/pi-embedded-helpers.js +139 -0
- package/dist/agents/pi-embedded-runner.js +932 -0
- package/dist/agents/pi-embedded-subscribe.js +541 -0
- package/dist/agents/pi-embedded-utils.js +20 -0
- package/dist/agents/pi-embedded.js +1 -0
- package/dist/agents/pi-extensions/compaction-safeguard.js +140 -0
- package/dist/agents/pi-tool-definition-adapter.js +17 -0
- package/dist/agents/pi-tools.js +510 -0
- package/dist/agents/pi-tools.schema.js +358 -0
- package/dist/agents/sandbox-paths.js +68 -0
- package/dist/agents/sandbox.js +667 -0
- package/dist/agents/shell-utils.js +53 -0
- package/dist/agents/skill-runner.js +224 -0
- package/dist/agents/skill-state.js +164 -0
- package/dist/agents/skill-tools.js +191 -0
- package/dist/agents/skill-usage.js +43 -0
- package/dist/agents/skills-install.js +244 -0
- package/dist/agents/skills-status.js +157 -0
- package/dist/agents/skills.js +472 -0
- package/dist/agents/subagent-registry.js +321 -0
- package/dist/agents/subagent-registry.store.js +47 -0
- package/dist/agents/system-prompt.js +179 -0
- package/dist/agents/timeout.js +26 -0
- package/dist/agents/tool-display.js +155 -0
- package/dist/agents/tool-display.json +236 -0
- package/dist/agents/tool-images.js +138 -0
- package/dist/agents/tool-policy.js +87 -0
- package/dist/agents/tools/agent-step.js +41 -0
- package/dist/agents/tools/browser-tool.js +295 -0
- package/dist/agents/tools/canvas-tool.js +193 -0
- package/dist/agents/tools/common.js +88 -0
- package/dist/agents/tools/cron-tool.js +141 -0
- package/dist/agents/tools/discord-actions-guild.js +186 -0
- package/dist/agents/tools/discord-actions-messaging.js +313 -0
- package/dist/agents/tools/discord-actions-moderation.js +70 -0
- package/dist/agents/tools/discord-actions.js +56 -0
- package/dist/agents/tools/discord-schema.js +199 -0
- package/dist/agents/tools/discord-tool.js +16 -0
- package/dist/agents/tools/gateway-tool.js +46 -0
- package/dist/agents/tools/gateway.js +28 -0
- package/dist/agents/tools/image-tool.js +140 -0
- package/dist/agents/tools/memory-tool.js +92 -0
- package/dist/agents/tools/nodes-tool.js +413 -0
- package/dist/agents/tools/nodes-utils.js +92 -0
- package/dist/agents/tools/sessions-announce-target.js +35 -0
- package/dist/agents/tools/sessions-helpers.js +88 -0
- package/dist/agents/tools/sessions-history-tool.js +137 -0
- package/dist/agents/tools/sessions-list-tool.js +196 -0
- package/dist/agents/tools/sessions-send-helpers.js +103 -0
- package/dist/agents/tools/sessions-send-tool.js +371 -0
- package/dist/agents/tools/sessions-spawn-tool.js +319 -0
- package/dist/agents/tools/slack-actions.js +129 -0
- package/dist/agents/tools/slack-schema.js +59 -0
- package/dist/agents/tools/slack-tool.js +16 -0
- package/dist/agents/tools/telegram-actions.js +159 -0
- package/dist/agents/tools/telegram-schema.js +28 -0
- package/dist/agents/tools/telegram-tool.js +16 -0
- package/dist/agents/tools/whatsapp-login-tool.js +63 -0
- package/dist/agents/usage.js +58 -0
- package/dist/agents/workspace.js +264 -0
- package/dist/auto-reply/chunk.js +177 -0
- package/dist/auto-reply/command-auth.js +44 -0
- package/dist/auto-reply/command-detection.js +22 -0
- package/dist/auto-reply/envelope.js +30 -0
- package/dist/auto-reply/group-activation.js +20 -0
- package/dist/auto-reply/heartbeat.js +58 -0
- package/dist/auto-reply/model.js +22 -0
- package/dist/auto-reply/reply/abort.js +14 -0
- package/dist/auto-reply/reply/agent-runner.js +426 -0
- package/dist/auto-reply/reply/bash-command.js +314 -0
- package/dist/auto-reply/reply/block-streaming.js +34 -0
- package/dist/auto-reply/reply/body.js +29 -0
- package/dist/auto-reply/reply/commands.js +332 -0
- package/dist/auto-reply/reply/directive-handling.js +626 -0
- package/dist/auto-reply/reply/directives.js +59 -0
- package/dist/auto-reply/reply/dispatch-from-config.js +23 -0
- package/dist/auto-reply/reply/followup-runner.js +181 -0
- package/dist/auto-reply/reply/groups.js +152 -0
- package/dist/auto-reply/reply/mentions.js +64 -0
- package/dist/auto-reply/reply/model-selection.js +209 -0
- package/dist/auto-reply/reply/queue.js +399 -0
- package/dist/auto-reply/reply/reply-dispatcher.js +68 -0
- package/dist/auto-reply/reply/reply-tags.js +26 -0
- package/dist/auto-reply/reply/session-updates.js +103 -0
- package/dist/auto-reply/reply/session.js +169 -0
- package/dist/auto-reply/reply/typing.js +125 -0
- package/dist/auto-reply/reply.js +655 -0
- package/dist/auto-reply/send-policy.js +28 -0
- package/dist/auto-reply/status.js +197 -0
- package/dist/auto-reply/templating.js +9 -0
- package/dist/auto-reply/thinking.js +49 -0
- package/dist/auto-reply/tokens.js +2 -0
- package/dist/auto-reply/tool-meta.js +74 -0
- package/dist/auto-reply/transcription.js +57 -0
- package/dist/auto-reply/types.js +1 -0
- package/dist/browser/bridge-server.js +37 -0
- package/dist/browser/cdp.js +382 -0
- package/dist/browser/chrome.js +432 -0
- package/dist/browser/client-actions-core.js +67 -0
- package/dist/browser/client-actions-observe.js +24 -0
- package/dist/browser/client-actions-types.js +1 -0
- package/dist/browser/client-actions.js +3 -0
- package/dist/browser/client-fetch.js +43 -0
- package/dist/browser/client.js +105 -0
- package/dist/browser/config.js +155 -0
- package/dist/browser/constants.js +5 -0
- package/dist/browser/profiles-service.js +124 -0
- package/dist/browser/profiles.js +96 -0
- package/dist/browser/pw-ai.js +2 -0
- package/dist/browser/pw-session.js +144 -0
- package/dist/browser/pw-tools-core.js +363 -0
- package/dist/browser/routes/agent.js +535 -0
- package/dist/browser/routes/basic.js +155 -0
- package/dist/browser/routes/index.js +8 -0
- package/dist/browser/routes/tabs.js +105 -0
- package/dist/browser/routes/utils.js +62 -0
- package/dist/browser/screenshot.js +40 -0
- package/dist/browser/server-context.js +377 -0
- package/dist/browser/server.js +81 -0
- package/dist/browser/target-id.js +18 -0
- package/dist/browser/trash.js +21 -0
- package/dist/canvas-host/a2ui/a2ui.bundle.js +17768 -0
- package/dist/canvas-host/a2ui/index.html +246 -0
- package/dist/canvas-host/a2ui.js +187 -0
- package/dist/canvas-host/server.js +382 -0
- package/dist/channel-web.js +8 -0
- package/dist/cli/browser-cli-actions-input.js +459 -0
- package/dist/cli/browser-cli-actions-observe.js +56 -0
- package/dist/cli/browser-cli-examples.js +31 -0
- package/dist/cli/browser-cli-inspect.js +97 -0
- package/dist/cli/browser-cli-manage.js +286 -0
- package/dist/cli/browser-cli-shared.js +1 -0
- package/dist/cli/browser-cli.js +26 -0
- package/dist/cli/canvas-cli.js +416 -0
- package/dist/cli/cloud-cli.js +336 -0
- package/dist/cli/credential-cli.js +227 -0
- package/dist/cli/cron-cli.js +454 -0
- package/dist/cli/deps.js +17 -0
- package/dist/cli/dns-cli.js +180 -0
- package/dist/cli/gateway-cli.js +665 -0
- package/dist/cli/gateway-rpc.js +20 -0
- package/dist/cli/hooks-cli.js +135 -0
- package/dist/cli/memory-cli.js +101 -0
- package/dist/cli/models-cli.js +248 -0
- package/dist/cli/nodes-camera.js +57 -0
- package/dist/cli/nodes-canvas.js +26 -0
- package/dist/cli/nodes-cli.js +946 -0
- package/dist/cli/nodes-screen.js +37 -0
- package/dist/cli/pairing-cli.js +100 -0
- package/dist/cli/parse-duration.js +20 -0
- package/dist/cli/plugins-cli.js +158 -0
- package/dist/cli/ports.js +97 -0
- package/dist/cli/profile.js +81 -0
- package/dist/cli/program.js +162 -0
- package/dist/cli/prompt.js +19 -0
- package/dist/cli/run-main.js +48 -0
- package/dist/cli/skills-cli.js +132 -0
- package/dist/cli/skills-hub-cli.js +1093 -0
- package/dist/cli/telegram-cli.js +56 -0
- package/dist/cli/tool-connector-cli.js +118 -0
- package/dist/cli/tui-cli.js +35 -0
- package/dist/cli/upstream-sync-cli.js +2833 -0
- package/dist/cli/usage-cli.js +24 -0
- package/dist/cli/wait.js +8 -0
- package/dist/commands/agent-via-gateway.js +115 -0
- package/dist/commands/agent.js +665 -0
- package/dist/commands/antigravity-oauth.js +327 -0
- package/dist/commands/auth-choice-options.js +80 -0
- package/dist/commands/auth-choice.js +134 -0
- package/dist/commands/auth-token.js +31 -0
- package/dist/commands/bootstrap-preset.js +214 -0
- package/dist/commands/capabilities.js +36 -0
- package/dist/commands/chutes-oauth.js +144 -0
- package/dist/commands/claude-md.js +137 -0
- package/dist/commands/config-view.js +11 -0
- package/dist/commands/configure.js +648 -0
- package/dist/commands/credential.js +236 -0
- package/dist/commands/cursor-rules.js +230 -0
- package/dist/commands/doctor-state-migrations.js +358 -0
- package/dist/commands/doctor-ui.js +113 -0
- package/dist/commands/doctor.js +673 -0
- package/dist/commands/health.js +112 -0
- package/dist/commands/identity.js +54 -0
- package/dist/commands/init.js +167 -0
- package/dist/commands/models/aliases.js +85 -0
- package/dist/commands/models/fallbacks.js +123 -0
- package/dist/commands/models/image-fallbacks.js +123 -0
- package/dist/commands/models/list.js +347 -0
- package/dist/commands/models/scan.js +271 -0
- package/dist/commands/models/set-image.js +27 -0
- package/dist/commands/models/set.js +27 -0
- package/dist/commands/models/shared.js +73 -0
- package/dist/commands/models.js +7 -0
- package/dist/commands/onboard-auth.js +101 -0
- package/dist/commands/onboard-channels.js +814 -0
- package/dist/commands/onboard-eve-identity.js +98 -0
- package/dist/commands/onboard-github.js +153 -0
- package/dist/commands/onboard-helpers.js +303 -0
- package/dist/commands/onboard-interactive.js +17 -0
- package/dist/commands/onboard-non-interactive.js +228 -0
- package/dist/commands/onboard-providers.js +829 -0
- package/dist/commands/onboard-quickstart.js +185 -0
- package/dist/commands/onboard-remote.js +120 -0
- package/dist/commands/onboard-skills.js +148 -0
- package/dist/commands/onboard-types.js +1 -0
- package/dist/commands/onboard.js +19 -0
- package/dist/commands/openai-codex-model-default.js +38 -0
- package/dist/commands/poll.js +64 -0
- package/dist/commands/quest.js +27 -0
- package/dist/commands/reset.js +61 -0
- package/dist/commands/send.js +124 -0
- package/dist/commands/sessions-ingest.js +359 -0
- package/dist/commands/sessions.js +212 -0
- package/dist/commands/setup.js +59 -0
- package/dist/commands/signal-install.js +135 -0
- package/dist/commands/skills-manifest.js +235 -0
- package/dist/commands/status.js +139 -0
- package/dist/commands/suggestions.js +54 -0
- package/dist/commands/systemd-linger.js +71 -0
- package/dist/commands/update.js +16 -0
- package/dist/commands/usage-upload.js +27 -0
- package/dist/config/config.js +6 -0
- package/dist/config/defaults.js +140 -0
- package/dist/config/group-policy.js +49 -0
- package/dist/config/includes.js +183 -0
- package/dist/config/io.js +188 -0
- package/dist/config/legacy-migrate.js +13 -0
- package/dist/config/legacy.js +425 -0
- package/dist/config/paths.js +82 -0
- package/dist/config/port-defaults.js +32 -0
- package/dist/config/schema.js +173 -0
- package/dist/config/sessions.js +611 -0
- package/dist/config/talk.js +31 -0
- package/dist/config/types.js +1 -0
- package/dist/config/validation.js +29 -0
- package/dist/config/zod-schema.js +1110 -0
- package/dist/control-ui/assets/index-D8Q5AI4D.js +2393 -0
- package/dist/control-ui/assets/index-D8Q5AI4D.js.map +1 -0
- package/dist/control-ui/assets/index-g06q5Xc3.css +1 -0
- package/dist/control-ui/favicon.ico +0 -0
- package/dist/control-ui/index.html +16 -0
- package/dist/cron/isolated-agent.js +529 -0
- package/dist/cron/normalize.js +73 -0
- package/dist/cron/parse.js +24 -0
- package/dist/cron/run-log.js +72 -0
- package/dist/cron/schedule.js +24 -0
- package/dist/cron/service.js +471 -0
- package/dist/cron/store.js +43 -0
- package/dist/cron/types.js +1 -0
- package/dist/daemon/constants.js +10 -0
- package/dist/daemon/launchd.js +295 -0
- package/dist/daemon/legacy.js +63 -0
- package/dist/daemon/program-args.js +141 -0
- package/dist/daemon/schtasks.js +269 -0
- package/dist/daemon/service.js +69 -0
- package/dist/daemon/systemd.js +332 -0
- package/dist/discord/index.js +2 -0
- package/dist/discord/monitor.js +1089 -0
- package/dist/discord/probe.js +54 -0
- package/dist/discord/send.js +652 -0
- package/dist/discord/token.js +8 -0
- package/dist/entry.js +16 -0
- package/dist/gateway/auth.js +121 -0
- package/dist/gateway/call.js +103 -0
- package/dist/gateway/chat-attachments.js +41 -0
- package/dist/gateway/client.js +180 -0
- package/dist/gateway/config-reload.js +274 -0
- package/dist/gateway/control-ui.js +184 -0
- package/dist/gateway/hooks-mapping.js +282 -0
- package/dist/gateway/hooks.js +168 -0
- package/dist/gateway/net.js +29 -0
- package/dist/gateway/protocol/index.js +62 -0
- package/dist/gateway/protocol/schema.js +577 -0
- package/dist/gateway/server-bridge-subscriptions.js +93 -0
- package/dist/gateway/server-bridge.js +1066 -0
- package/dist/gateway/server-browser.js +11 -0
- package/dist/gateway/server-channels.js +680 -0
- package/dist/gateway/server-chat.js +159 -0
- package/dist/gateway/server-constants.js +8 -0
- package/dist/gateway/server-discovery.js +62 -0
- package/dist/gateway/server-http.js +165 -0
- package/dist/gateway/server-methods/agent-job.js +114 -0
- package/dist/gateway/server-methods/agent.js +254 -0
- package/dist/gateway/server-methods/channels.js +239 -0
- package/dist/gateway/server-methods/chat.js +207 -0
- package/dist/gateway/server-methods/config.js +50 -0
- package/dist/gateway/server-methods/connect.js +6 -0
- package/dist/gateway/server-methods/cron.js +89 -0
- package/dist/gateway/server-methods/health.js +28 -0
- package/dist/gateway/server-methods/models.js +16 -0
- package/dist/gateway/server-methods/nodes.js +294 -0
- package/dist/gateway/server-methods/providers.js +257 -0
- package/dist/gateway/server-methods/send.js +254 -0
- package/dist/gateway/server-methods/sessions.js +382 -0
- package/dist/gateway/server-methods/skills.js +83 -0
- package/dist/gateway/server-methods/system.js +118 -0
- package/dist/gateway/server-methods/talk.js +22 -0
- package/dist/gateway/server-methods/types.js +1 -0
- package/dist/gateway/server-methods/voicewake.js +30 -0
- package/dist/gateway/server-methods/web.js +81 -0
- package/dist/gateway/server-methods/wizard.js +100 -0
- package/dist/gateway/server-methods.js +53 -0
- package/dist/gateway/server-providers.js +687 -0
- package/dist/gateway/server-shared.js +1 -0
- package/dist/gateway/server-utils.js +35 -0
- package/dist/gateway/server.js +1478 -0
- package/dist/gateway/session-utils.js +355 -0
- package/dist/gateway/ws-log.js +343 -0
- package/dist/gateway/ws-logging.js +8 -0
- package/dist/globals.js +41 -0
- package/dist/hooks/gmail-ops.js +236 -0
- package/dist/hooks/gmail-setup-utils.js +278 -0
- package/dist/hooks/gmail-watcher.js +190 -0
- package/dist/hooks/gmail.js +177 -0
- package/dist/imessage/client.js +165 -0
- package/dist/imessage/index.js +3 -0
- package/dist/imessage/monitor.js +365 -0
- package/dist/imessage/probe.js +26 -0
- package/dist/imessage/send.js +83 -0
- package/dist/imessage/targets.js +176 -0
- package/dist/index.js +55 -0
- package/dist/infra/agent-events.js +46 -0
- package/dist/infra/binaries.js +9 -0
- package/dist/infra/bonjour-discovery.js +163 -0
- package/dist/infra/bonjour.js +200 -0
- package/dist/infra/bridge/server.js +564 -0
- package/dist/infra/canvas-host-url.js +54 -0
- package/dist/infra/channel-summary.js +78 -0
- package/dist/infra/control-ui-assets.js +112 -0
- package/dist/infra/dotenv.js +15 -0
- package/dist/infra/env.js +8 -0
- package/dist/infra/errors.js +28 -0
- package/dist/infra/event-log.js +251 -0
- package/dist/infra/gateway-lock.js +8 -0
- package/dist/infra/git-commit.js +91 -0
- package/dist/infra/heartbeat-events.js +21 -0
- package/dist/infra/heartbeat-runner.js +458 -0
- package/dist/infra/heartbeat-wake.js +61 -0
- package/dist/infra/is-main.js +37 -0
- package/dist/infra/json-file.js +21 -0
- package/dist/infra/machine-name.js +40 -0
- package/dist/infra/nexus-root.js +56 -0
- package/dist/infra/node-pairing.js +212 -0
- package/dist/infra/path-env.js +93 -0
- package/dist/infra/ports.js +87 -0
- package/dist/infra/provider-summary.js +80 -0
- package/dist/infra/provider-usage.auth.js +189 -0
- package/dist/infra/provider-usage.fetch.claude.js +129 -0
- package/dist/infra/provider-usage.fetch.codex.js +62 -0
- package/dist/infra/provider-usage.fetch.copilot.js +42 -0
- package/dist/infra/provider-usage.fetch.gemini.js +57 -0
- package/dist/infra/provider-usage.fetch.js +6 -0
- package/dist/infra/provider-usage.fetch.minimax.js +214 -0
- package/dist/infra/provider-usage.fetch.shared.js +11 -0
- package/dist/infra/provider-usage.fetch.zai.js +62 -0
- package/dist/infra/provider-usage.format.js +77 -0
- package/dist/infra/provider-usage.js +145 -0
- package/dist/infra/provider-usage.load.js +54 -0
- package/dist/infra/provider-usage.shared.js +19 -0
- package/dist/infra/provider-usage.types.js +1 -0
- package/dist/infra/restart.js +29 -0
- package/dist/infra/retry.js +16 -0
- package/dist/infra/runtime-guard.js +59 -0
- package/dist/infra/shell-env.js +88 -0
- package/dist/infra/system-events.js +71 -0
- package/dist/infra/system-presence.js +217 -0
- package/dist/infra/tailnet.js +46 -0
- package/dist/infra/tailscale.js +149 -0
- package/dist/infra/unhandled-rejections.js +19 -0
- package/dist/infra/usage-suggestions.js +241 -0
- package/dist/infra/usage-upload.js +290 -0
- package/dist/infra/voicewake.js +78 -0
- package/dist/infra/widearea-dns.js +123 -0
- package/dist/infra/ws.js +13 -0
- package/dist/logger.js +52 -0
- package/dist/logging.js +506 -0
- package/dist/macos/gateway-daemon.js +145 -0
- package/dist/macos/relay.js +49 -0
- package/dist/media/constants.js +33 -0
- package/dist/media/host.js +42 -0
- package/dist/media/image-ops.js +119 -0
- package/dist/media/mime.js +123 -0
- package/dist/media/parse.js +83 -0
- package/dist/media/server.js +64 -0
- package/dist/media/store.js +139 -0
- package/dist/polls.js +43 -0
- package/dist/process/command-queue.js +97 -0
- package/dist/process/exec.js +75 -0
- package/dist/provider-web.js +8 -0
- package/dist/providers/github-copilot-auth.js +123 -0
- package/dist/providers/github-copilot-models.js +35 -0
- package/dist/providers/github-copilot-token.js +11 -0
- package/dist/providers/location.js +48 -0
- package/dist/providers/web/index.js +2 -0
- package/dist/runtime.js +8 -0
- package/dist/sessions/level-overrides.js +9 -0
- package/dist/sessions/send-policy.js +68 -0
- package/dist/signal/client.js +134 -0
- package/dist/signal/daemon.js +69 -0
- package/dist/signal/index.js +3 -0
- package/dist/signal/monitor.js +411 -0
- package/dist/signal/probe.js +46 -0
- package/dist/signal/send.js +91 -0
- package/dist/slack/actions.js +97 -0
- package/dist/slack/index.js +5 -0
- package/dist/slack/monitor.js +1270 -0
- package/dist/slack/probe.js +47 -0
- package/dist/slack/send.js +131 -0
- package/dist/slack/token.js +10 -0
- package/dist/telegram/allowed-updates.js +8 -0
- package/dist/telegram/bot.js +724 -0
- package/dist/telegram/download.js +34 -0
- package/dist/telegram/index.js +4 -0
- package/dist/telegram/monitor.js +47 -0
- package/dist/telegram/pairing-store.js +77 -0
- package/dist/telegram/probe.js +63 -0
- package/dist/telegram/proxy.js +9 -0
- package/dist/telegram/reaction-level.js +45 -0
- package/dist/telegram/send.js +151 -0
- package/dist/telegram/sent-message-cache.js +65 -0
- package/dist/telegram/token.js +30 -0
- package/dist/telegram/update-offset-store.js +61 -0
- package/dist/telegram/webhook-set.js +12 -0
- package/dist/telegram/webhook.js +56 -0
- package/dist/tui/commands.js +87 -0
- package/dist/tui/components/assistant-message.js +16 -0
- package/dist/tui/components/chat-log.js +92 -0
- package/dist/tui/components/custom-editor.js +55 -0
- package/dist/tui/components/selectors.js +8 -0
- package/dist/tui/components/tool-execution.js +111 -0
- package/dist/tui/components/user-message.js +17 -0
- package/dist/tui/gateway-chat.js +140 -0
- package/dist/tui/theme/theme.js +80 -0
- package/dist/tui/tui.js +708 -0
- package/dist/utils.js +153 -0
- package/dist/version.js +18 -0
- package/dist/web/accounts.js +86 -0
- package/dist/web/active-listener.js +25 -0
- package/dist/web/auto-reply.js +1256 -0
- package/dist/web/inbound.js +649 -0
- package/dist/web/login-qr.js +230 -0
- package/dist/web/login.js +71 -0
- package/dist/web/media.js +175 -0
- package/dist/web/outbound.js +102 -0
- package/dist/web/qr-image.js +97 -0
- package/dist/web/reconnect.js +60 -0
- package/dist/web/session.js +370 -0
- package/dist/wizard/clack-prompter.js +56 -0
- package/dist/wizard/onboarding.js +620 -0
- package/dist/wizard/prompts.js +6 -0
- package/dist/wizard/session.js +203 -0
- package/docs/AGENTS.default.md +116 -0
- package/docs/CAPABILITIES.md +444 -0
- package/docs/CNAME +1 -0
- package/docs/NEXUS_CORE_REWRITE_SPEC.md +226 -0
- package/docs/RELEASING.md +69 -0
- package/docs/_config.yml +53 -0
- package/docs/_layouts/default.html +145 -0
- package/docs/agent-assisted-install.md +95 -0
- package/docs/agent-loop.md +61 -0
- package/docs/agent-send.md +21 -0
- package/docs/agent.md +108 -0
- package/docs/android.md +133 -0
- package/docs/architecture.md +114 -0
- package/docs/assets/markdown.css +133 -0
- package/docs/assets/pixel-lobster.svg +60 -0
- package/docs/assets/terminal.css +470 -0
- package/docs/assets/theme.js +55 -0
- package/docs/audio.md +48 -0
- package/docs/automation/nexus-sync.md +371 -0
- package/docs/background-process.md +74 -0
- package/docs/bash.md +32 -0
- package/docs/bedrock.md +71 -0
- package/docs/bonjour.md +159 -0
- package/docs/browser-linux-troubleshooting.md +114 -0
- package/docs/browser.md +293 -0
- package/docs/bun.md +56 -0
- package/docs/camera.md +152 -0
- package/docs/clawd.md +212 -0
- package/docs/concepts/usage-tracking.md +29 -0
- package/docs/configuration.md +1666 -0
- package/docs/control-ui.md +83 -0
- package/docs/cron.md +385 -0
- package/docs/dashboard.md +17 -0
- package/docs/device-models.md +46 -0
- package/docs/discord.md +308 -0
- package/docs/discovery.md +112 -0
- package/docs/docker.md +258 -0
- package/docs/docs.json +105 -0
- package/docs/doctor.md +68 -0
- package/docs/elevated.md +31 -0
- package/docs/faq.md +736 -0
- package/docs/feature-inventory/overview.md +141 -0
- package/docs/feature-inventory/rollout-checklist.md +53 -0
- package/docs/feature-inventory/test-matrix.md +87 -0
- package/docs/feature-inventory.md +9 -0
- package/docs/gateway/configuration-examples.md +221 -0
- package/docs/gateway/configuration.md +172 -0
- package/docs/gateway/cron.md +61 -0
- package/docs/gateway/heartbeat.md +207 -0
- package/docs/gateway/pairing.md +109 -0
- package/docs/gateway-lock.md +28 -0
- package/docs/gateway.md +227 -0
- package/docs/gmail-pubsub.md +191 -0
- package/docs/grammy.md +27 -0
- package/docs/group-messages.md +73 -0
- package/docs/groups.md +130 -0
- package/docs/health.md +28 -0
- package/docs/heartbeat.md +73 -0
- package/docs/home-userspace.md +277 -0
- package/docs/hubs.md +148 -0
- package/docs/images.md +51 -0
- package/docs/imessage.md +94 -0
- package/docs/index.md +196 -0
- package/docs/ios.md +372 -0
- package/docs/linux.md +11 -0
- package/docs/location-command.md +95 -0
- package/docs/location.md +46 -0
- package/docs/logging.md +110 -0
- package/docs/lore.md +131 -0
- package/docs/mac/bun.md +133 -0
- package/docs/mac/canvas.md +161 -0
- package/docs/mac/child-process.md +72 -0
- package/docs/mac/dev-setup.md +81 -0
- package/docs/mac/health.md +28 -0
- package/docs/mac/icon.md +26 -0
- package/docs/mac/logging.md +51 -0
- package/docs/mac/menu-bar.md +69 -0
- package/docs/mac/peekaboo.md +170 -0
- package/docs/mac/permissions.md +40 -0
- package/docs/mac/release.md +76 -0
- package/docs/mac/remote.md +57 -0
- package/docs/mac/signing.md +41 -0
- package/docs/mac/skills.md +27 -0
- package/docs/mac/voice-overlay.md +52 -0
- package/docs/mac/voicewake.md +56 -0
- package/docs/mac/webchat.md +27 -0
- package/docs/mac/xpc.md +40 -0
- package/docs/macos.md +104 -0
- package/docs/model-failover.md +75 -0
- package/docs/models.md +91 -0
- package/docs/multi-agent.md +74 -0
- package/docs/nix.md +95 -0
- package/docs/nodes.md +157 -0
- package/docs/onboarding-config-protocol.md +34 -0
- package/docs/onboarding.md +189 -0
- package/docs/pairing.md +85 -0
- package/docs/plans/cron-add-hardening.md +72 -0
- package/docs/plans/group-policy-hardening.md +121 -0
- package/docs/poll.md +52 -0
- package/docs/prereqs.md +67 -0
- package/docs/presence.md +133 -0
- package/docs/proposals/model-config.md +147 -0
- package/docs/provider-routing.md +25 -0
- package/docs/queue.md +78 -0
- package/docs/reference/templates/AGENTS.md +164 -0
- package/docs/remote-gateway-readme.md +153 -0
- package/docs/remote.md +61 -0
- package/docs/research/memory.md +227 -0
- package/docs/rpc.md +35 -0
- package/docs/security.md +200 -0
- package/docs/session-ingestion.md +119 -0
- package/docs/session-tool.md +154 -0
- package/docs/session.md +85 -0
- package/docs/sessions.md +8 -0
- package/docs/setup.md +131 -0
- package/docs/showcase.md +37 -0
- package/docs/signal.md +122 -0
- package/docs/skills-config.md +58 -0
- package/docs/skills.md +153 -0
- package/docs/slack.md +221 -0
- package/docs/subagents.md +72 -0
- package/docs/tailscale.md +71 -0
- package/docs/talk.md +79 -0
- package/docs/telegram.md +96 -0
- package/docs/templates/AGENTS.md +286 -0
- package/docs/templates/BOOTSTRAP.md +35 -0
- package/docs/templates/IDENTITY.md +17 -0
- package/docs/templates/PROFILE.md +14 -0
- package/docs/templates/SOUL.md +41 -0
- package/docs/templates/TOOLS.md +41 -0
- package/docs/templates/USER.md +8 -0
- package/docs/test.md +43 -0
- package/docs/testing-onboarding-quickstart.md +76 -0
- package/docs/testing-philosophy.md +211 -0
- package/docs/thinking.md +46 -0
- package/docs/timezone.md +40 -0
- package/docs/tools.md +346 -0
- package/docs/troubleshooting.md +257 -0
- package/docs/tui.md +71 -0
- package/docs/typebox.md +42 -0
- package/docs/updating.md +138 -0
- package/docs/usage-cloud-aggregation-spec.md +133 -0
- package/docs/usage-suggestions-pipeline.md +126 -0
- package/docs/voicewake.md +61 -0
- package/docs/web.md +115 -0
- package/docs/webchat.md +34 -0
- package/docs/webhook.md +132 -0
- package/docs/whatsapp-clawd.jpg +0 -0
- package/docs/whatsapp.md +170 -0
- package/docs/windows.md +11 -0
- package/docs/wizard.md +167 -0
- package/package.json +209 -0
- package/skills/1password/SKILL.md +54 -0
- package/skills/1password/docs/setup.md +85 -0
- package/skills/1password/docs/troubleshooting.md +63 -0
- package/skills/1password/references/cli-examples.md +29 -0
- package/skills/1password/references/get-started.md +17 -0
- package/skills/agent-browser/SKILL.md +450 -0
- package/skills/agent-browser/docs/browser-use-eval.md +95 -0
- package/skills/agent-browser/docs/first-tests.md +261 -0
- package/skills/agent-browser/docs/wordle-nyt-eval.js +32 -0
- package/skills/aix/SKILL.md +93 -0
- package/skills/aix/docs/embeddings.md +40 -0
- package/skills/aix/docs/setup.md +58 -0
- package/skills/aix/docs/troubleshooting.md +41 -0
- package/skills/aix/references/sql.md +48 -0
- package/skills/apple-notes/SKILL.md +50 -0
- package/skills/apple-reminders/SKILL.md +67 -0
- package/skills/bear-notes/SKILL.md +79 -0
- package/skills/bird/SKILL.md +32 -0
- package/skills/bird/docs/auth.md +31 -0
- package/skills/bird/docs/troubleshooting.md +31 -0
- package/skills/blogwatcher/SKILL.md +46 -0
- package/skills/blucli/SKILL.md +27 -0
- package/skills/brave-search/SKILL.md +36 -0
- package/skills/brave-search/docs/setup.md +40 -0
- package/skills/brave-search/docs/troubleshooting.md +37 -0
- package/skills/brave-search/docs/usage.md +28 -0
- package/skills/brave-search/scripts/content.mjs +53 -0
- package/skills/brave-search/scripts/search.mjs +79 -0
- package/skills/browser-use-agent-sdk/SKILL.md +90 -0
- package/skills/camsnap/SKILL.md +25 -0
- package/skills/clawdhub/SKILL.md +53 -0
- package/skills/coding-agent/SKILL.md +274 -0
- package/skills/comms/SKILL.md +249 -0
- package/skills/comms/docs/adapters.md +54 -0
- package/skills/comms/docs/setup.md +56 -0
- package/skills/comms/docs/troubleshooting.md +44 -0
- package/skills/comms/references/schema.md +49 -0
- package/skills/computer-use/SKILL.md +204 -0
- package/skills/computer-use/docs/open-interpreter.md +26 -0
- package/skills/computer-use/docs/peekaboo.md +26 -0
- package/skills/computer-use/docs/setup.md +47 -0
- package/skills/computer-use/docs/troubleshooting.md +33 -0
- package/skills/discord/SKILL.md +370 -0
- package/skills/eightctl/SKILL.md +29 -0
- package/skills/eve/SKILL.md +215 -0
- package/skills/eve/docs/dual-account.md +84 -0
- package/skills/eve/docs/intelligence.md +58 -0
- package/skills/eve/docs/setup.md +60 -0
- package/skills/eve/docs/troubleshooting.md +54 -0
- package/skills/eve/scripts/setup-dual-account.sh +125 -0
- package/skills/filesystem/SKILL.md +217 -0
- package/skills/food-order/SKILL.md +41 -0
- package/skills/gemini/SKILL.md +23 -0
- package/skills/gh/SKILL.md +22 -0
- package/skills/gh/docs/usage.md +41 -0
- package/skills/gifgrep/SKILL.md +47 -0
- package/skills/github/SKILL.md +26 -0
- package/skills/github/docs/setup.md +21 -0
- package/skills/github/docs/troubleshooting.md +24 -0
- package/skills/gog/SKILL.md +104 -0
- package/skills/gog/docs/portability.md +94 -0
- package/skills/gog/docs/setup.md +76 -0
- package/skills/gog/docs/troubleshooting.md +94 -0
- package/skills/gog/scripts/cdp/README.md +90 -0
- package/skills/gog/scripts/cdp/add_test_users.py +69 -0
- package/skills/gog/scripts/cdp/auth_add_accounts.py +209 -0
- package/skills/gog/scripts/cdp/auth_add_accounts_manual.py +206 -0
- package/skills/gog/scripts/cdp/create_oauth_client.py +165 -0
- package/skills/gog/scripts/cdp/launch_cdp_chrome.sh +58 -0
- package/skills/google-oauth/SKILL.md +94 -0
- package/skills/goplaces/SKILL.md +30 -0
- package/skills/imsg/SKILL.md +25 -0
- package/skills/json-render/SKILL.md +154 -0
- package/skills/json-render/assets/components/README.md +21 -0
- package/skills/json-render/assets/components/catalog.ts +78 -0
- package/skills/json-render/assets/components/registry.tsx +172 -0
- package/skills/json-render/assets/demo/App.css +397 -0
- package/skills/json-render/assets/demo/App.tsx +897 -0
- package/skills/json-render/assets/demo/README.md +22 -0
- package/skills/json-render/assets/demo/catalog.ts +78 -0
- package/skills/json-render/assets/demo/data/nexus-core.json +31 -0
- package/skills/json-render/assets/demo/index.css +27 -0
- package/skills/json-render/assets/demo/registry.tsx +150 -0
- package/skills/json-render/docs/nexus-state-demo.md +84 -0
- package/skills/json-render/docs/shadcn-preset.md +33 -0
- package/skills/json-render/scripts/create-vite-demo.sh +45 -0
- package/skills/json-render/scripts/llm-server/README.md +33 -0
- package/skills/json-render/scripts/llm-server/catalog.ts +78 -0
- package/skills/json-render/scripts/llm-server/package-lock.json +702 -0
- package/skills/json-render/scripts/llm-server/package.json +18 -0
- package/skills/json-render/scripts/llm-server/server.ts +285 -0
- package/skills/local-places/SERVER_README.md +101 -0
- package/skills/local-places/SKILL.md +91 -0
- package/skills/local-places/pyproject.toml +27 -0
- package/skills/local-places/src/local_places/__init__.py +2 -0
- package/skills/local-places/src/local_places/__pycache__/__init__.cpython-314.pyc +0 -0
- package/skills/local-places/src/local_places/__pycache__/google_places.cpython-314.pyc +0 -0
- package/skills/local-places/src/local_places/__pycache__/main.cpython-314.pyc +0 -0
- package/skills/local-places/src/local_places/__pycache__/schemas.cpython-314.pyc +0 -0
- package/skills/local-places/src/local_places/google_places.py +314 -0
- package/skills/local-places/src/local_places/main.py +65 -0
- package/skills/local-places/src/local_places/schemas.py +107 -0
- package/skills/mcporter/SKILL.md +38 -0
- package/skills/model-usage/SKILL.md +45 -0
- package/skills/model-usage/references/codexbar-cli.md +28 -0
- package/skills/model-usage/scripts/model_usage.py +310 -0
- package/skills/nano-banana-pro/SKILL.md +30 -0
- package/skills/nano-banana-pro/scripts/generate_image.py +169 -0
- package/skills/nano-pdf/SKILL.md +20 -0
- package/skills/nexus-cloud/SKILL.md +53 -0
- package/skills/nexus-cloud/docs/security.md +24 -0
- package/skills/nexus-cloud/docs/setup.md +51 -0
- package/skills/nexus-cloud/docs/troubleshooting.md +28 -0
- package/skills/notion/SKILL.md +156 -0
- package/skills/obsidian/SKILL.md +55 -0
- package/skills/onboarding/SKILL.md +515 -0
- package/skills/onboarding/docs/CAPABILITIES.md +444 -0
- package/skills/onboarding/docs/CAPABILITY_TAXONOMY.md +608 -0
- package/skills/onboarding/docs/CLI_GRAMMAR.md +797 -0
- package/skills/onboarding/docs/CLI_GRAMMAR_CREDENTIALS.md +632 -0
- package/skills/onboarding/docs/CLI_GRAMMAR_ONBOARDING.md +815 -0
- package/skills/onboarding/docs/CLI_GRAMMAR_SKILLS.md +449 -0
- package/skills/onboarding/docs/DOCUMENTATION_OVERVIEW.md +290 -0
- package/skills/onboarding/docs/ENTITY_MODEL.md +582 -0
- package/skills/onboarding/docs/GOAL_STATE_ARCHITECTURE.md +395 -0
- package/skills/onboarding/docs/NEXUS_SYSTEM_OVERVIEW.md +476 -0
- package/skills/onboarding/docs/SKILLS_HUB_SPEC.md +477 -0
- package/skills/onboarding/docs/SKILLS_SPECIFICATION.md +947 -0
- package/skills/onboarding/docs/SKILL_GATEWAY_DESIGN.md +702 -0
- package/skills/onboarding/docs/SKILL_GATEWAY_PRD.md +278 -0
- package/skills/onboarding/docs/SKILL_INVENTORY.md +266 -0
- package/skills/onboarding/docs/STATE_ARCHITECTURE.md +547 -0
- package/skills/onboarding/docs/TROUBLESHOOTING.md +363 -0
- package/skills/onboarding/docs/USER_JOURNEY.md +797 -0
- package/skills/onboarding/docs/WOW_MOMENTS.md +232 -0
- package/skills/onboarding/docs/agent-apple-id.md +289 -0
- package/skills/onboarding/docs/skill-deep-dives/1password.md +367 -0
- package/skills/onboarding/docs/skill-deep-dives/TEMPLATE.md +197 -0
- package/skills/onboarding/docs/skill-deep-dives/aix.md +498 -0
- package/skills/onboarding/docs/skill-deep-dives/bird.md +357 -0
- package/skills/onboarding/docs/skill-deep-dives/brave-search.md +601 -0
- package/skills/onboarding/docs/skill-deep-dives/comms.md +607 -0
- package/skills/onboarding/docs/skill-deep-dives/computer-use.md +599 -0
- package/skills/onboarding/docs/skill-deep-dives/cron-and-heartbeat.md +576 -0
- package/skills/onboarding/docs/skill-deep-dives/eve.md +711 -0
- package/skills/onboarding/docs/skill-deep-dives/github.md +333 -0
- package/skills/onboarding/docs/skill-deep-dives/gog.md +640 -0
- package/skills/onboarding/docs/skill-deep-dives/homebrew-prereqs.md +785 -0
- package/skills/onboarding/docs/skill-deep-dives/nexus-cloud.md +689 -0
- package/skills/onboarding/docs/skill-deep-dives/qmd.md +742 -0
- package/skills/onboarding/docs/skill-deep-dives/telegram.md +379 -0
- package/skills/onboarding/docs/skill-deep-dives/wacli.md +399 -0
- package/skills/onboarding/docs/skill-deep-dives/weather.md +513 -0
- package/skills/onboarding/scripts/ralph/prd.json +215 -0
- package/skills/onboarding/scripts/ralph/progress.txt +99 -0
- package/skills/onboarding/scripts/ralph/prompt.md +87 -0
- package/skills/onboarding/scripts/ralph/ralph.log +84 -0
- package/skills/onboarding/scripts/ralph/ralph.sh +45 -0
- package/skills/onboarding/scripts/setup-cursor-skills.sh +40 -0
- package/skills/openai-image-gen/SKILL.md +31 -0
- package/skills/openai-image-gen/scripts/gen.py +173 -0
- package/skills/openai-whisper/SKILL.md +19 -0
- package/skills/openai-whisper-api/SKILL.md +43 -0
- package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
- package/skills/openhue/SKILL.md +30 -0
- package/skills/oracle/SKILL.md +105 -0
- package/skills/ordercli/SKILL.md +47 -0
- package/skills/peekaboo/SKILL.md +153 -0
- package/skills/qmd/SKILL.md +32 -0
- package/skills/qmd/docs/mcp.md +30 -0
- package/skills/qmd/docs/ollama.md +42 -0
- package/skills/qmd/docs/setup.md +44 -0
- package/skills/sag/SKILL.md +62 -0
- package/skills/skill-cli-template/SKILL.md +109 -0
- package/skills/skill-creator/scripts/__pycache__/quick_validate.cpython-311.pyc +0 -0
- package/skills/slack/SKILL.md +144 -0
- package/skills/songsee/SKILL.md +29 -0
- package/skills/sonoscli/SKILL.md +26 -0
- package/skills/spotify-player/SKILL.md +34 -0
- package/skills/summarize/SKILL.md +49 -0
- package/skills/telegram/SKILL.md +20 -0
- package/skills/telegram/docs/pairing.md +30 -0
- package/skills/telegram/docs/setup.md +41 -0
- package/skills/telegram/docs/webhook.md +17 -0
- package/skills/things-mac/SKILL.md +61 -0
- package/skills/tmux/SKILL.md +121 -0
- package/skills/tmux/scripts/find-sessions.sh +112 -0
- package/skills/tmux/scripts/wait-for-text.sh +83 -0
- package/skills/trello/SKILL.md +84 -0
- package/skills/upstream-sync/SKILL.md +151 -0
- package/skills/upstream-sync/scripts/auto-port.sh +227 -0
- package/skills/upstream-sync/scripts/check-all.sh +88 -0
- package/skills/upstream-sync/scripts/check-nexus.sh +146 -0
- package/skills/upstream-sync/scripts/check-pi-ai.sh +129 -0
- package/skills/video-frames/SKILL.md +29 -0
- package/skills/video-frames/scripts/frame.sh +81 -0
- package/skills/wacli/SKILL.md +48 -0
- package/skills/wacli/docs/auth.md +21 -0
- package/skills/wacli/docs/backup.md +9 -0
- package/skills/wacli/docs/troubleshooting.md +21 -0
- package/skills/weather/SKILL.md +53 -0
- package/skills/weather/docs/usage.md +40 -0
|
@@ -0,0 +1,2393 @@
|
|
|
1
|
+
(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))s(i);new MutationObserver(i=>{for(const a of i)if(a.type==="childList")for(const l of a.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&s(l)}).observe(document,{childList:!0,subtree:!0});function n(i){const a={};return i.integrity&&(a.integrity=i.integrity),i.referrerPolicy&&(a.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?a.credentials="include":i.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function s(i){if(i.ep)return;i.ep=!0;const a=n(i);fetch(i.href,a)}})();const wt=globalThis,vn=wt.ShadowRoot&&(wt.ShadyCSS===void 0||wt.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,Hs=Symbol(),as=new WeakMap;let Ki=class{constructor(t,n,s){if(this._$cssResult$=!0,s!==Hs)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=n}get styleSheet(){let t=this.o;const n=this.t;if(vn&&t===void 0){const s=n!==void 0&&n.length===1;s&&(t=as.get(n)),t===void 0&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),s&&as.set(n,t))}return t}toString(){return this.cssText}};const ji=e=>new Ki(typeof e=="string"?e:e+"",void 0,Hs),zi=(e,t)=>{if(vn)e.adoptedStyleSheets=t.map(n=>n instanceof CSSStyleSheet?n:n.styleSheet);else for(const n of t){const s=document.createElement("style"),i=wt.litNonce;i!==void 0&&s.setAttribute("nonce",i),s.textContent=n.cssText,e.appendChild(s)}},ls=vn?e=>e:e=>e instanceof CSSStyleSheet?(t=>{let n="";for(const s of t.cssRules)n+=s.cssText;return ji(n)})(e):e;const{is:qi,defineProperty:Wi,getOwnPropertyDescriptor:Gi,getOwnPropertyNames:Yi,getOwnPropertySymbols:Ji,getPrototypeOf:Vi}=Object,Rt=globalThis,os=Rt.trustedTypes,Zi=os?os.emptyScript:"",Qi=Rt.reactiveElementPolyfillSupport,Je=(e,t)=>e,At={toAttribute(e,t){switch(t){case Boolean:e=e?Zi:null;break;case Object:case Array:e=e==null?e:JSON.stringify(e)}return e},fromAttribute(e,t){let n=e;switch(t){case Boolean:n=e!==null;break;case Number:n=e===null?null:Number(e);break;case Object:case Array:try{n=JSON.parse(e)}catch{n=null}}return n}},yn=(e,t)=>!qi(e,t),rs={attribute:!0,type:String,converter:At,reflect:!1,useDefault:!1,hasChanged:yn};Symbol.metadata??=Symbol("metadata"),Rt.litPropertyMetadata??=new WeakMap;let Ie=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,n=rs){if(n.state&&(n.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((n=Object.create(n)).wrapped=!0),this.elementProperties.set(t,n),!n.noAccessor){const s=Symbol(),i=this.getPropertyDescriptor(t,s,n);i!==void 0&&Wi(this.prototype,t,i)}}static getPropertyDescriptor(t,n,s){const{get:i,set:a}=Gi(this.prototype,t)??{get(){return this[n]},set(l){this[n]=l}};return{get:i,set(l){const r=i?.call(this);a?.call(this,l),this.requestUpdate(t,r,s)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??rs}static _$Ei(){if(this.hasOwnProperty(Je("elementProperties")))return;const t=Vi(this);t.finalize(),t.l!==void 0&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(Je("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(Je("properties"))){const n=this.properties,s=[...Yi(n),...Ji(n)];for(const i of s)this.createProperty(i,n[i])}const t=this[Symbol.metadata];if(t!==null){const n=litPropertyMetadata.get(t);if(n!==void 0)for(const[s,i]of n)this.elementProperties.set(s,i)}this._$Eh=new Map;for(const[n,s]of this.elementProperties){const i=this._$Eu(n,s);i!==void 0&&this._$Eh.set(i,n)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){const n=[];if(Array.isArray(t)){const s=new Set(t.flat(1/0).reverse());for(const i of s)n.unshift(ls(i))}else t!==void 0&&n.push(ls(t));return n}static _$Eu(t,n){const s=n.attribute;return s===!1?void 0:typeof s=="string"?s:typeof t=="string"?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),this.renderRoot!==void 0&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,n=this.constructor.elementProperties;for(const s of n.keys())this.hasOwnProperty(s)&&(t.set(s,this[s]),delete this[s]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return zi(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,n,s){this._$AK(t,s)}_$ET(t,n){const s=this.constructor.elementProperties.get(t),i=this.constructor._$Eu(t,s);if(i!==void 0&&s.reflect===!0){const a=(s.converter?.toAttribute!==void 0?s.converter:At).toAttribute(n,s.type);this._$Em=t,a==null?this.removeAttribute(i):this.setAttribute(i,a),this._$Em=null}}_$AK(t,n){const s=this.constructor,i=s._$Eh.get(t);if(i!==void 0&&this._$Em!==i){const a=s.getPropertyOptions(i),l=typeof a.converter=="function"?{fromAttribute:a.converter}:a.converter?.fromAttribute!==void 0?a.converter:At;this._$Em=i;const r=l.fromAttribute(n,a.type);this[i]=r??this._$Ej?.get(i)??r,this._$Em=null}}requestUpdate(t,n,s,i=!1,a){if(t!==void 0){const l=this.constructor;if(i===!1&&(a=this[t]),s??=l.getPropertyOptions(t),!((s.hasChanged??yn)(a,n)||s.useDefault&&s.reflect&&a===this._$Ej?.get(t)&&!this.hasAttribute(l._$Eu(t,s))))return;this.C(t,n,s)}this.isUpdatePending===!1&&(this._$ES=this._$EP())}C(t,n,{useDefault:s,reflect:i,wrapped:a},l){s&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,l??n??this[t]),a!==!0||l!==void 0)||(this._$AL.has(t)||(this.hasUpdated||s||(n=void 0),this._$AL.set(t,n)),i===!0&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(n){Promise.reject(n)}const t=this.scheduleUpdate();return t!=null&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[i,a]of this._$Ep)this[i]=a;this._$Ep=void 0}const s=this.constructor.elementProperties;if(s.size>0)for(const[i,a]of s){const{wrapped:l}=a,r=this[i];l!==!0||this._$AL.has(i)||r===void 0||this.C(i,void 0,a,r)}}let t=!1;const n=this._$AL;try{t=this.shouldUpdate(n),t?(this.willUpdate(n),this._$EO?.forEach(s=>s.hostUpdate?.()),this.update(n)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(n)}willUpdate(t){}_$AE(t){this._$EO?.forEach(n=>n.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(n=>this._$ET(n,this[n])),this._$EM()}updated(t){}firstUpdated(t){}};Ie.elementStyles=[],Ie.shadowRootOptions={mode:"open"},Ie[Je("elementProperties")]=new Map,Ie[Je("finalized")]=new Map,Qi?.({ReactiveElement:Ie}),(Rt.reactiveElementVersions??=[]).push("2.1.2");const kn=globalThis,cs=e=>e,Tt=kn.trustedTypes,ds=Tt?Tt.createPolicy("lit-html",{createHTML:e=>e}):void 0,Ks="$lit$",me=`lit$${Math.random().toFixed(9).slice(2)}$`,js="?"+me,Xi=`<${js}>`,xe=document,nt=()=>xe.createComment(""),st=e=>e===null||typeof e!="object"&&typeof e!="function",$n=Array.isArray,ea=e=>$n(e)||typeof e?.[Symbol.iterator]=="function",Zt=`[
|
|
2
|
+
\f\r]`,Ue=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,us=/-->/g,hs=/>/g,$e=RegExp(`>|${Zt}(?:([^\\s"'>=/]+)(${Zt}*=${Zt}*(?:[^
|
|
3
|
+
\f\r"'\`<>=]|("|')|))|$)`,"g"),ps=/'/g,gs=/"/g,zs=/^(?:script|style|textarea|title)$/i,ta=e=>(t,...n)=>({_$litType$:e,strings:t,values:n}),p=ta(1),be=Symbol.for("lit-noChange"),f=Symbol.for("lit-nothing"),fs=new WeakMap,Se=xe.createTreeWalker(xe,129);function qs(e,t){if(!$n(e)||!e.hasOwnProperty("raw"))throw Error("invalid template strings array");return ds!==void 0?ds.createHTML(t):t}const na=(e,t)=>{const n=e.length-1,s=[];let i,a=t===2?"<svg>":t===3?"<math>":"",l=Ue;for(let r=0;r<n;r++){const o=e[r];let d,u,h=-1,g=0;for(;g<o.length&&(l.lastIndex=g,u=l.exec(o),u!==null);)g=l.lastIndex,l===Ue?u[1]==="!--"?l=us:u[1]!==void 0?l=hs:u[2]!==void 0?(zs.test(u[2])&&(i=RegExp("</"+u[2],"g")),l=$e):u[3]!==void 0&&(l=$e):l===$e?u[0]===">"?(l=i??Ue,h=-1):u[1]===void 0?h=-2:(h=l.lastIndex-u[2].length,d=u[1],l=u[3]===void 0?$e:u[3]==='"'?gs:ps):l===gs||l===ps?l=$e:l===us||l===hs?l=Ue:(l=$e,i=void 0);const $=l===$e&&e[r+1].startsWith("/>")?" ":"";a+=l===Ue?o+Xi:h>=0?(s.push(d),o.slice(0,h)+Ks+o.slice(h)+me+$):o+me+(h===-2?r:$)}return[qs(e,a+(e[n]||"<?>")+(t===2?"</svg>":t===3?"</math>":"")),s]};let on=class Ws{constructor({strings:t,_$litType$:n},s){let i;this.parts=[];let a=0,l=0;const r=t.length-1,o=this.parts,[d,u]=na(t,n);if(this.el=Ws.createElement(d,s),Se.currentNode=this.el.content,n===2||n===3){const h=this.el.content.firstChild;h.replaceWith(...h.childNodes)}for(;(i=Se.nextNode())!==null&&o.length<r;){if(i.nodeType===1){if(i.hasAttributes())for(const h of i.getAttributeNames())if(h.endsWith(Ks)){const g=u[l++],$=i.getAttribute(h).split(me),y=/([.?@])?(.*)/.exec(g);o.push({type:1,index:a,name:y[2],strings:$,ctor:y[1]==="."?ia:y[1]==="?"?aa:y[1]==="@"?la:Pt}),i.removeAttribute(h)}else h.startsWith(me)&&(o.push({type:6,index:a}),i.removeAttribute(h));if(zs.test(i.tagName)){const h=i.textContent.split(me),g=h.length-1;if(g>0){i.textContent=Tt?Tt.emptyScript:"";for(let $=0;$<g;$++)i.append(h[$],nt()),Se.nextNode(),o.push({type:2,index:++a});i.append(h[g],nt())}}}else if(i.nodeType===8)if(i.data===js)o.push({type:2,index:a});else{let h=-1;for(;(h=i.data.indexOf(me,h+1))!==-1;)o.push({type:7,index:a}),h+=me.length-1}a++}}static createElement(t,n){const s=xe.createElement("template");return s.innerHTML=t,s}};function Fe(e,t,n=e,s){if(t===be)return t;let i=s!==void 0?n._$Co?.[s]:n._$Cl;const a=st(t)?void 0:t._$litDirective$;return i?.constructor!==a&&(i?._$AO?.(!1),a===void 0?i=void 0:(i=new a(e),i._$AT(e,n,s)),s!==void 0?(n._$Co??=[])[s]=i:n._$Cl=i),i!==void 0&&(t=Fe(e,i._$AS(e,t.values),i,s)),t}class sa{constructor(t,n){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=n}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:n},parts:s}=this._$AD,i=(t?.creationScope??xe).importNode(n,!0);Se.currentNode=i;let a=Se.nextNode(),l=0,r=0,o=s[0];for(;o!==void 0;){if(l===o.index){let d;o.type===2?d=new Lt(a,a.nextSibling,this,t):o.type===1?d=new o.ctor(a,o.name,o.strings,this,t):o.type===6&&(d=new oa(a,this,t)),this._$AV.push(d),o=s[++r]}l!==o?.index&&(a=Se.nextNode(),l++)}return Se.currentNode=xe,i}p(t){let n=0;for(const s of this._$AV)s!==void 0&&(s.strings!==void 0?(s._$AI(t,s,n),n+=s.strings.length-2):s._$AI(t[n])),n++}}let Lt=class Gs{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,n,s,i){this.type=2,this._$AH=f,this._$AN=void 0,this._$AA=t,this._$AB=n,this._$AM=s,this.options=i,this._$Cv=i?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const n=this._$AM;return n!==void 0&&t?.nodeType===11&&(t=n.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,n=this){t=Fe(this,t,n),st(t)?t===f||t==null||t===""?(this._$AH!==f&&this._$AR(),this._$AH=f):t!==this._$AH&&t!==be&&this._(t):t._$litType$!==void 0?this.$(t):t.nodeType!==void 0?this.T(t):ea(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==f&&st(this._$AH)?this._$AA.nextSibling.data=t:this.T(xe.createTextNode(t)),this._$AH=t}$(t){const{values:n,_$litType$:s}=t,i=typeof s=="number"?this._$AC(t):(s.el===void 0&&(s.el=on.createElement(qs(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===i)this._$AH.p(n);else{const a=new sa(i,this),l=a.u(this.options);a.p(n),this.T(l),this._$AH=a}}_$AC(t){let n=fs.get(t.strings);return n===void 0&&fs.set(t.strings,n=new on(t)),n}k(t){$n(this._$AH)||(this._$AH=[],this._$AR());const n=this._$AH;let s,i=0;for(const a of t)i===n.length?n.push(s=new Gs(this.O(nt()),this.O(nt()),this,this.options)):s=n[i],s._$AI(a),i++;i<n.length&&(this._$AR(s&&s._$AB.nextSibling,i),n.length=i)}_$AR(t=this._$AA.nextSibling,n){for(this._$AP?.(!1,!0,n);t!==this._$AB;){const s=cs(t).nextSibling;cs(t).remove(),t=s}}setConnected(t){this._$AM===void 0&&(this._$Cv=t,this._$AP?.(t))}};class Pt{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,n,s,i,a){this.type=1,this._$AH=f,this._$AN=void 0,this.element=t,this.name=n,this._$AM=i,this.options=a,s.length>2||s[0]!==""||s[1]!==""?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=f}_$AI(t,n=this,s,i){const a=this.strings;let l=!1;if(a===void 0)t=Fe(this,t,n,0),l=!st(t)||t!==this._$AH&&t!==be,l&&(this._$AH=t);else{const r=t;let o,d;for(t=a[0],o=0;o<a.length-1;o++)d=Fe(this,r[s+o],n,o),d===be&&(d=this._$AH[o]),l||=!st(d)||d!==this._$AH[o],d===f?t=f:t!==f&&(t+=(d??"")+a[o+1]),this._$AH[o]=d}l&&!i&&this.j(t)}j(t){t===f?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??"")}}let ia=class extends Pt{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===f?void 0:t}},aa=class extends Pt{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==f)}},la=class extends Pt{constructor(t,n,s,i,a){super(t,n,s,i,a),this.type=5}_$AI(t,n=this){if((t=Fe(this,t,n,0)??f)===be)return;const s=this._$AH,i=t===f&&s!==f||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,a=t!==f&&(s===f||i);i&&this.element.removeEventListener(this.name,this,s),a&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){typeof this._$AH=="function"?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}},oa=class{constructor(t,n,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=n,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){Fe(this,t)}};const ra={I:Lt},ca=kn.litHtmlPolyfillSupport;ca?.(on,Lt),(kn.litHtmlVersions??=[]).push("3.3.2");const da=(e,t,n)=>{const s=n?.renderBefore??t;let i=s._$litPart$;if(i===void 0){const a=n?.renderBefore??null;s._$litPart$=i=new Lt(t.insertBefore(nt(),a),a,void 0,n??{})}return i._$AI(e),i};const wn=globalThis;let Ve=class extends Ie{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const n=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=da(n,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return be}};Ve._$litElement$=!0,Ve.finalized=!0,wn.litElementHydrateSupport?.({LitElement:Ve});const ua=wn.litElementPolyfillSupport;ua?.({LitElement:Ve});(wn.litElementVersions??=[]).push("4.2.2");const ha=e=>(t,n)=>{n!==void 0?n.addInitializer(()=>{customElements.define(e,t)}):customElements.define(e,t)};const pa={attribute:!0,type:String,converter:At,reflect:!1,hasChanged:yn},ga=(e=pa,t,n)=>{const{kind:s,metadata:i}=n;let a=globalThis.litPropertyMetadata.get(i);if(a===void 0&&globalThis.litPropertyMetadata.set(i,a=new Map),s==="setter"&&((e=Object.create(e)).wrapped=!0),a.set(n.name,e),s==="accessor"){const{name:l}=n;return{set(r){const o=t.get.call(this);t.set.call(this,r),this.requestUpdate(l,o,e,!0,r)},init(r){return r!==void 0&&this.C(l,void 0,e,r),r}}}if(s==="setter"){const{name:l}=n;return function(r){const o=this[l];t.call(this,r),this.requestUpdate(l,o,e,!0,r)}}throw Error("Unsupported decorator location: "+s)};function fa(e){return(t,n)=>typeof n=="object"?ga(e,t,n):((s,i,a)=>{const l=i.hasOwnProperty(a);return i.constructor.createProperty(a,s),l?Object.getOwnPropertyDescriptor(i,a):void 0})(e,t,n)}function v(e){return fa({...e,state:!0,attribute:!1})}function ms(e){e[6]=e[6]&15|64,e[8]=e[8]&63|128;let t="";for(let n=0;n<e.length;n++)t+=e[n].toString(16).padStart(2,"0");return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20)}`}function ma(){const e=new Uint8Array(16),t=Date.now();for(let n=0;n<e.length;n++)e[n]=Math.floor(Math.random()*256);return e[0]^=t&255,e[1]^=t>>>8&255,e[2]^=t>>>16&255,e[3]^=t>>>24&255,e}function Ys(e=globalThis.crypto){if(e&&typeof e.randomUUID=="function")return e.randomUUID();if(e&&typeof e.getRandomValues=="function"){const t=new Uint8Array(16);return e.getRandomValues(t),ms(t)}return ms(ma())}class ba{constructor(t){this.opts=t,this.ws=null,this.pending=new Map,this.closed=!1,this.lastSeq=null,this.backoffMs=800}start(){this.closed=!1,this.connect()}stop(){this.closed=!0,this.ws?.close(),this.ws=null,this.flushPending(new Error("gateway client stopped"))}get connected(){return this.ws?.readyState===WebSocket.OPEN}connect(){this.closed||(this.ws=new WebSocket(this.opts.url),this.ws.onopen=()=>this.sendConnect(),this.ws.onmessage=t=>this.handleMessage(String(t.data??"")),this.ws.onclose=t=>{const n=String(t.reason??"");this.ws=null,this.flushPending(new Error(`gateway closed (${t.code}): ${n}`)),this.opts.onClose?.({code:t.code,reason:n}),this.scheduleReconnect()},this.ws.onerror=()=>{})}scheduleReconnect(){if(this.closed)return;const t=this.backoffMs;this.backoffMs=Math.min(this.backoffMs*1.7,15e3),window.setTimeout(()=>this.connect(),t)}flushPending(t){for(const[,n]of this.pending)n.reject(t);this.pending.clear()}sendConnect(){const t=this.opts.token||this.opts.password?{token:this.opts.token,password:this.opts.password}:void 0,n={minProtocol:2,maxProtocol:2,client:{name:this.opts.clientName??"nexus-control-ui",version:this.opts.clientVersion??"dev",platform:this.opts.platform??navigator.platform??"web",mode:this.opts.mode??"webchat",instanceId:this.opts.instanceId},caps:[],auth:t,userAgent:navigator.userAgent,locale:navigator.language};this.request("connect",n).then(s=>{this.backoffMs=800,this.opts.onHello?.(s)}).catch(()=>{this.ws?.close(1008,"connect failed")})}handleMessage(t){let n;try{n=JSON.parse(t)}catch{return}const s=n;if(s.type==="event"){const i=n,a=typeof i.seq=="number"?i.seq:null;a!==null&&(this.lastSeq!==null&&a>this.lastSeq+1&&this.opts.onGap?.({expected:this.lastSeq+1,received:a}),this.lastSeq=a),this.opts.onEvent?.(i);return}if(s.type==="res"){const i=n,a=this.pending.get(i.id);if(!a)return;this.pending.delete(i.id),i.ok?a.resolve(i.payload):a.reject(new Error(i.error?.message??"request failed"));return}}request(t,n){if(!this.ws||this.ws.readyState!==WebSocket.OPEN)return Promise.reject(new Error("gateway not connected"));const s=Ys(),i={type:"req",id:s,method:t,params:n},a=new Promise((l,r)=>{this.pending.set(s,{resolve:o=>l(o),reject:r})});return this.ws.send(JSON.stringify(i)),a}}const Js="nexus.control.settings.v1";function va(){const t={gatewayUrl:`${location.protocol==="https:"?"wss":"ws"}://${location.host}`,token:"",sessionKey:"main",theme:"system",chatFocusMode:!1};try{const n=localStorage.getItem(Js);if(!n)return t;const s=JSON.parse(n);return{gatewayUrl:typeof s.gatewayUrl=="string"&&s.gatewayUrl.trim()?s.gatewayUrl.trim():t.gatewayUrl,token:typeof s.token=="string"?s.token:t.token,sessionKey:typeof s.sessionKey=="string"&&s.sessionKey.trim()?s.sessionKey.trim():t.sessionKey,theme:s.theme==="light"||s.theme==="dark"||s.theme==="system"?s.theme:t.theme,chatFocusMode:typeof s.chatFocusMode=="boolean"?s.chatFocusMode:t.chatFocusMode}}catch{return t}}function ya(e){localStorage.setItem(Js,JSON.stringify(e))}const ka=[{label:"Chat",tabs:["chat"]},{label:"Control",tabs:["overview","connections","instances","sessions","cron"]},{label:"Agent",tabs:["skills","nodes"]},{label:"Settings",tabs:["config","debug"]}],Vs={overview:"/overview",connections:"/connections",instances:"/instances",sessions:"/sessions",cron:"/cron",skills:"/skills",nodes:"/nodes",chat:"/chat",config:"/config",debug:"/debug"},Zs=new Map(Object.entries(Vs).map(([e,t])=>[t,e]));function Sn(e){if(!e)return"";let t=e.trim();return t.startsWith("/")||(t=`/${t}`),t==="/"?"":(t.endsWith("/")&&(t=t.slice(0,-1)),t)}function it(e){if(!e)return"/";let t=e.trim();return t.startsWith("/")||(t=`/${t}`),t.length>1&&t.endsWith("/")&&(t=t.slice(0,-1)),t}function Qs(e,t=""){const n=Sn(t),s=Vs[e];return n?`${n}${s}`:s}function bs(e,t=""){const n=Sn(t);let s=e||"/";n&&(s===n?s="/":s.startsWith(`${n}/`)&&(s=s.slice(n.length)));let i=it(s).toLowerCase();return i.endsWith("/index.html")&&(i="/"),i==="/"?"chat":Zs.get(i)??null}function $a(e){let t=it(e);if(t.endsWith("/index.html")&&(t=it(t.slice(0,-11))),t==="/")return"";const n=t.split("/").filter(Boolean);if(n.length===0)return"";for(let s=0;s<n.length;s++){const i=`/${n.slice(s).join("/")}`.toLowerCase();if(Zs.has(i)){const a=n.slice(0,s);return a.length?`/${a.join("/")}`:""}}return`/${n.join("/")}`}function Xs(e){switch(e){case"overview":return"Overview";case"connections":return"Connections";case"instances":return"Instances";case"sessions":return"Sessions";case"cron":return"Cron Jobs";case"skills":return"Skills";case"nodes":return"Nodes";case"chat":return"Chat";case"config":return"Config";case"debug":return"Debug";default:return"Control"}}function wa(e){switch(e){case"overview":return"Gateway status, entry points, and a fast health read.";case"connections":return"Link providers and keep transport settings in sync.";case"instances":return"Presence beacons from connected clients and nodes.";case"sessions":return"Inspect active sessions and adjust per-session defaults.";case"cron":return"Schedule wakeups and recurring agent runs.";case"skills":return"Manage skill availability and API key injection.";case"nodes":return"Paired devices, capabilities, and command exposure.";case"chat":return"Direct gateway chat session for quick interventions.";case"config":return"Edit ~/nexus/state/nexus.json safely.";case"debug":return"Gateway snapshots, events, and manual RPC calls.";default:return""}}const ei={CHILD:2},ti=e=>(...t)=>({_$litDirective$:e,values:t});let ni=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,n,s){this._$Ct=t,this._$AM=n,this._$Ci=s}_$AS(t,n){return this.update(t,n)}update(t,n){return this.render(...n)}};const{I:Sa}=ra,vs=e=>e,ys=()=>document.createComment(""),Be=(e,t,n)=>{const s=e._$AA.parentNode,i=t===void 0?e._$AB:t._$AA;if(n===void 0){const a=s.insertBefore(ys(),i),l=s.insertBefore(ys(),i);n=new Sa(a,l,e,e.options)}else{const a=n._$AB.nextSibling,l=n._$AM,r=l!==e;if(r){let o;n._$AQ?.(e),n._$AM=e,n._$AP!==void 0&&(o=e._$AU)!==l._$AU&&n._$AP(o)}if(a!==i||r){let o=n._$AA;for(;o!==a;){const d=vs(o).nextSibling;vs(s).insertBefore(o,i),o=d}}}return n},we=(e,t,n=e)=>(e._$AI(t,n),e),xa={},Aa=(e,t=xa)=>e._$AH=t,Ta=e=>e._$AH,Qt=e=>{e._$AR(),e._$AA.remove()};const ks=(e,t,n)=>{const s=new Map;for(let i=t;i<=n;i++)s.set(e[i],i);return s},Ea=ti(class extends ni{constructor(e){if(super(e),e.type!==ei.CHILD)throw Error("repeat() can only be used in text expressions")}dt(e,t,n){let s;n===void 0?n=t:t!==void 0&&(s=t);const i=[],a=[];let l=0;for(const r of e)i[l]=s?s(r,l):l,a[l]=n(r,l),l++;return{values:a,keys:i}}render(e,t,n){return this.dt(e,t,n).values}update(e,[t,n,s]){const i=Ta(e),{values:a,keys:l}=this.dt(t,n,s);if(!Array.isArray(i))return this.ut=l,a;const r=this.ut??=[],o=[];let d,u,h=0,g=i.length-1,$=0,y=a.length-1;for(;h<=g&&$<=y;)if(i[h]===null)h++;else if(i[g]===null)g--;else if(r[h]===l[$])o[$]=we(i[h],a[$]),h++,$++;else if(r[g]===l[y])o[y]=we(i[g],a[y]),g--,y--;else if(r[h]===l[y])o[y]=we(i[h],a[y]),Be(e,o[y+1],i[h]),h++,y--;else if(r[g]===l[$])o[$]=we(i[g],a[$]),Be(e,i[h],i[g]),g--,$++;else if(d===void 0&&(d=ks(l,$,y),u=ks(r,h,g)),d.has(r[h]))if(d.has(r[g])){const w=u.get(l[$]),A=w!==void 0?i[w]:null;if(A===null){const S=Be(e,i[h]);we(S,a[$]),o[$]=S}else o[$]=we(A,a[$]),Be(e,i[h],A),i[w]=null;$++}else Qt(i[g]),g--;else Qt(i[h]),h++;for(;$<=y;){const w=Be(e,o[y+1]);we(w,a[$]),o[$++]=w}for(;h<=g;){const w=i[h++];w!==null&&Qt(w)}return this.ut=l,Aa(e,o),be}});class rn extends ni{constructor(t){if(super(t),this.it=f,t.type!==ei.CHILD)throw Error(this.constructor.directiveName+"() can only be used in child bindings")}render(t){if(t===f||t==null)return this._t=void 0,this.it=t;if(t===be)return t;if(typeof t!="string")throw Error(this.constructor.directiveName+"() called with a non-string value");if(t===this.it)return this._t;this.it=t;const n=[t];return n.raw=n,this._t={_$litType$:this.constructor.resultType,strings:n,values:[]}}}rn.directiveName="unsafeHTML",rn.resultType=1;const si=ti(rn);const{entries:ii,setPrototypeOf:$s,isFrozen:Ca,getPrototypeOf:_a,getOwnPropertyDescriptor:Ma}=Object;let{freeze:Z,seal:ee,create:cn}=Object,{apply:dn,construct:un}=typeof Reflect<"u"&&Reflect;Z||(Z=function(t){return t});ee||(ee=function(t){return t});dn||(dn=function(t,n){for(var s=arguments.length,i=new Array(s>2?s-2:0),a=2;a<s;a++)i[a-2]=arguments[a];return t.apply(n,i)});un||(un=function(t){for(var n=arguments.length,s=new Array(n>1?n-1:0),i=1;i<n;i++)s[i-1]=arguments[i];return new t(...s)});const bt=Q(Array.prototype.forEach),Ra=Q(Array.prototype.lastIndexOf),ws=Q(Array.prototype.pop),He=Q(Array.prototype.push),La=Q(Array.prototype.splice),St=Q(String.prototype.toLowerCase),Xt=Q(String.prototype.toString),en=Q(String.prototype.match),Ke=Q(String.prototype.replace),Pa=Q(String.prototype.indexOf),Ia=Q(String.prototype.trim),ne=Q(Object.prototype.hasOwnProperty),J=Q(RegExp.prototype.test),je=Fa(TypeError);function Q(e){return function(t){t instanceof RegExp&&(t.lastIndex=0);for(var n=arguments.length,s=new Array(n>1?n-1:0),i=1;i<n;i++)s[i-1]=arguments[i];return dn(e,t,s)}}function Fa(e){return function(){for(var t=arguments.length,n=new Array(t),s=0;s<t;s++)n[s]=arguments[s];return un(e,n)}}function C(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:St;$s&&$s(e,null);let s=t.length;for(;s--;){let i=t[s];if(typeof i=="string"){const a=n(i);a!==i&&(Ca(t)||(t[s]=a),i=a)}e[i]=!0}return e}function Na(e){for(let t=0;t<e.length;t++)ne(e,t)||(e[t]=null);return e}function oe(e){const t=cn(null);for(const[n,s]of ii(e))ne(e,n)&&(Array.isArray(s)?t[n]=Na(s):s&&typeof s=="object"&&s.constructor===Object?t[n]=oe(s):t[n]=s);return t}function ze(e,t){for(;e!==null;){const s=Ma(e,t);if(s){if(s.get)return Q(s.get);if(typeof s.value=="function")return Q(s.value)}e=_a(e)}function n(){return null}return n}const Ss=Z(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","search","section","select","shadow","slot","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),tn=Z(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","enterkeyhint","exportparts","filter","font","g","glyph","glyphref","hkern","image","inputmode","line","lineargradient","marker","mask","metadata","mpath","part","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),nn=Z(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),Oa=Z(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),sn=Z(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","mprescripts"]),Da=Z(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),xs=Z(["#text"]),As=Z(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","exportparts","face","for","headers","height","hidden","high","href","hreflang","id","inert","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","part","pattern","placeholder","playsinline","popover","popovertarget","popovertargetaction","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","slot","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","wrap","xmlns","slot"]),an=Z(["accent-height","accumulate","additive","alignment-baseline","amplitude","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","exponent","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","intercept","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","mask-type","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","slope","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","tablevalues","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),Ts=Z(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),vt=Z(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),Ua=ee(/\{\{[\w\W]*|[\w\W]*\}\}/gm),Ba=ee(/<%[\w\W]*|[\w\W]*%>/gm),Ha=ee(/\$\{[\w\W]*/gm),Ka=ee(/^data-[\-\w.\u00B7-\uFFFF]+$/),ja=ee(/^aria-[\-\w]+$/),ai=ee(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),za=ee(/^(?:\w+script|data):/i),qa=ee(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),li=ee(/^html$/i),Wa=ee(/^[a-z][.\w]*(-[.\w]+)+$/i);var Es=Object.freeze({__proto__:null,ARIA_ATTR:ja,ATTR_WHITESPACE:qa,CUSTOM_ELEMENT:Wa,DATA_ATTR:Ka,DOCTYPE_NAME:li,ERB_EXPR:Ba,IS_ALLOWED_URI:ai,IS_SCRIPT_OR_DATA:za,MUSTACHE_EXPR:Ua,TMPLIT_EXPR:Ha});const qe={element:1,text:3,progressingInstruction:7,comment:8,document:9},Ga=function(){return typeof window>"u"?null:window},Ya=function(t,n){if(typeof t!="object"||typeof t.createPolicy!="function")return null;let s=null;const i="data-tt-policy-suffix";n&&n.hasAttribute(i)&&(s=n.getAttribute(i));const a="dompurify"+(s?"#"+s:"");try{return t.createPolicy(a,{createHTML(l){return l},createScriptURL(l){return l}})}catch{return console.warn("TrustedTypes policy "+a+" could not be created."),null}},Cs=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};function oi(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:Ga();const t=T=>oi(T);if(t.version="3.3.1",t.removed=[],!e||!e.document||e.document.nodeType!==qe.document||!e.Element)return t.isSupported=!1,t;let{document:n}=e;const s=n,i=s.currentScript,{DocumentFragment:a,HTMLTemplateElement:l,Node:r,Element:o,NodeFilter:d,NamedNodeMap:u=e.NamedNodeMap||e.MozNamedAttrMap,HTMLFormElement:h,DOMParser:g,trustedTypes:$}=e,y=o.prototype,w=ze(y,"cloneNode"),A=ze(y,"remove"),S=ze(y,"nextSibling"),R=ze(y,"childNodes"),I=ze(y,"parentNode");if(typeof l=="function"){const T=n.createElement("template");T.content&&T.content.ownerDocument&&(n=T.content.ownerDocument)}let _,E="";const{implementation:P,createNodeIterator:O,createDocumentFragment:F,getElementsByTagName:j}=n,{importNode:Y}=s;let D=Cs();t.isSupported=typeof ii=="function"&&typeof I=="function"&&P&&P.createHTMLDocument!==void 0;const{MUSTACHE_EXPR:ve,ERB_EXPR:ge,TMPLIT_EXPR:Dt,DATA_ATTR:Mi,ARIA_ATTR:Ri,IS_SCRIPT_OR_DATA:Li,ATTR_WHITESPACE:Fn,CUSTOM_ELEMENT:Pi}=Es;let{IS_ALLOWED_URI:Nn}=Es,K=null;const On=C({},[...Ss,...tn,...nn,...sn,...xs]);let z=null;const Dn=C({},[...As,...an,...Ts,...vt]);let U=Object.seal(cn(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Ne=null,Ut=null;const Ee=Object.seal(cn(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let Un=!0,Bt=!0,Bn=!1,Hn=!0,Ce=!1,dt=!0,ye=!1,Ht=!1,Kt=!1,_e=!1,ut=!1,ht=!1,Kn=!0,jn=!1;const Ii="user-content-";let jt=!0,Oe=!1,Me={},ae=null;const zt=C({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let zn=null;const qn=C({},["audio","video","img","source","image","track"]);let qt=null;const Wn=C({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),pt="http://www.w3.org/1998/Math/MathML",gt="http://www.w3.org/2000/svg",re="http://www.w3.org/1999/xhtml";let Re=re,Wt=!1,Gt=null;const Fi=C({},[pt,gt,re],Xt);let ft=C({},["mi","mo","mn","ms","mtext"]),mt=C({},["annotation-xml"]);const Ni=C({},["title","style","font","a","script"]);let De=null;const Oi=["application/xhtml+xml","text/html"],Di="text/html";let H=null,Le=null;const Ui=n.createElement("form"),Gn=function(c){return c instanceof RegExp||c instanceof Function},Yt=function(){let c=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!(Le&&Le===c)){if((!c||typeof c!="object")&&(c={}),c=oe(c),De=Oi.indexOf(c.PARSER_MEDIA_TYPE)===-1?Di:c.PARSER_MEDIA_TYPE,H=De==="application/xhtml+xml"?Xt:St,K=ne(c,"ALLOWED_TAGS")?C({},c.ALLOWED_TAGS,H):On,z=ne(c,"ALLOWED_ATTR")?C({},c.ALLOWED_ATTR,H):Dn,Gt=ne(c,"ALLOWED_NAMESPACES")?C({},c.ALLOWED_NAMESPACES,Xt):Fi,qt=ne(c,"ADD_URI_SAFE_ATTR")?C(oe(Wn),c.ADD_URI_SAFE_ATTR,H):Wn,zn=ne(c,"ADD_DATA_URI_TAGS")?C(oe(qn),c.ADD_DATA_URI_TAGS,H):qn,ae=ne(c,"FORBID_CONTENTS")?C({},c.FORBID_CONTENTS,H):zt,Ne=ne(c,"FORBID_TAGS")?C({},c.FORBID_TAGS,H):oe({}),Ut=ne(c,"FORBID_ATTR")?C({},c.FORBID_ATTR,H):oe({}),Me=ne(c,"USE_PROFILES")?c.USE_PROFILES:!1,Un=c.ALLOW_ARIA_ATTR!==!1,Bt=c.ALLOW_DATA_ATTR!==!1,Bn=c.ALLOW_UNKNOWN_PROTOCOLS||!1,Hn=c.ALLOW_SELF_CLOSE_IN_ATTR!==!1,Ce=c.SAFE_FOR_TEMPLATES||!1,dt=c.SAFE_FOR_XML!==!1,ye=c.WHOLE_DOCUMENT||!1,_e=c.RETURN_DOM||!1,ut=c.RETURN_DOM_FRAGMENT||!1,ht=c.RETURN_TRUSTED_TYPE||!1,Kt=c.FORCE_BODY||!1,Kn=c.SANITIZE_DOM!==!1,jn=c.SANITIZE_NAMED_PROPS||!1,jt=c.KEEP_CONTENT!==!1,Oe=c.IN_PLACE||!1,Nn=c.ALLOWED_URI_REGEXP||ai,Re=c.NAMESPACE||re,ft=c.MATHML_TEXT_INTEGRATION_POINTS||ft,mt=c.HTML_INTEGRATION_POINTS||mt,U=c.CUSTOM_ELEMENT_HANDLING||{},c.CUSTOM_ELEMENT_HANDLING&&Gn(c.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(U.tagNameCheck=c.CUSTOM_ELEMENT_HANDLING.tagNameCheck),c.CUSTOM_ELEMENT_HANDLING&&Gn(c.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(U.attributeNameCheck=c.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),c.CUSTOM_ELEMENT_HANDLING&&typeof c.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(U.allowCustomizedBuiltInElements=c.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Ce&&(Bt=!1),ut&&(_e=!0),Me&&(K=C({},xs),z=[],Me.html===!0&&(C(K,Ss),C(z,As)),Me.svg===!0&&(C(K,tn),C(z,an),C(z,vt)),Me.svgFilters===!0&&(C(K,nn),C(z,an),C(z,vt)),Me.mathMl===!0&&(C(K,sn),C(z,Ts),C(z,vt))),c.ADD_TAGS&&(typeof c.ADD_TAGS=="function"?Ee.tagCheck=c.ADD_TAGS:(K===On&&(K=oe(K)),C(K,c.ADD_TAGS,H))),c.ADD_ATTR&&(typeof c.ADD_ATTR=="function"?Ee.attributeCheck=c.ADD_ATTR:(z===Dn&&(z=oe(z)),C(z,c.ADD_ATTR,H))),c.ADD_URI_SAFE_ATTR&&C(qt,c.ADD_URI_SAFE_ATTR,H),c.FORBID_CONTENTS&&(ae===zt&&(ae=oe(ae)),C(ae,c.FORBID_CONTENTS,H)),c.ADD_FORBID_CONTENTS&&(ae===zt&&(ae=oe(ae)),C(ae,c.ADD_FORBID_CONTENTS,H)),jt&&(K["#text"]=!0),ye&&C(K,["html","head","body"]),K.table&&(C(K,["tbody"]),delete Ne.tbody),c.TRUSTED_TYPES_POLICY){if(typeof c.TRUSTED_TYPES_POLICY.createHTML!="function")throw je('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof c.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw je('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');_=c.TRUSTED_TYPES_POLICY,E=_.createHTML("")}else _===void 0&&(_=Ya($,i)),_!==null&&typeof E=="string"&&(E=_.createHTML(""));Z&&Z(c),Le=c}},Yn=C({},[...tn,...nn,...Oa]),Jn=C({},[...sn,...Da]),Bi=function(c){let k=I(c);(!k||!k.tagName)&&(k={namespaceURI:Re,tagName:"template"});const x=St(c.tagName),N=St(k.tagName);return Gt[c.namespaceURI]?c.namespaceURI===gt?k.namespaceURI===re?x==="svg":k.namespaceURI===pt?x==="svg"&&(N==="annotation-xml"||ft[N]):!!Yn[x]:c.namespaceURI===pt?k.namespaceURI===re?x==="math":k.namespaceURI===gt?x==="math"&&mt[N]:!!Jn[x]:c.namespaceURI===re?k.namespaceURI===gt&&!mt[N]||k.namespaceURI===pt&&!ft[N]?!1:!Jn[x]&&(Ni[x]||!Yn[x]):!!(De==="application/xhtml+xml"&&Gt[c.namespaceURI]):!1},le=function(c){He(t.removed,{element:c});try{I(c).removeChild(c)}catch{A(c)}},ke=function(c,k){try{He(t.removed,{attribute:k.getAttributeNode(c),from:k})}catch{He(t.removed,{attribute:null,from:k})}if(k.removeAttribute(c),c==="is")if(_e||ut)try{le(k)}catch{}else try{k.setAttribute(c,"")}catch{}},Vn=function(c){let k=null,x=null;if(Kt)c="<remove></remove>"+c;else{const B=en(c,/^[\r\n\t ]+/);x=B&&B[0]}De==="application/xhtml+xml"&&Re===re&&(c='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+c+"</body></html>");const N=_?_.createHTML(c):c;if(Re===re)try{k=new g().parseFromString(N,De)}catch{}if(!k||!k.documentElement){k=P.createDocument(Re,"template",null);try{k.documentElement.innerHTML=Wt?E:N}catch{}}const G=k.body||k.documentElement;return c&&x&&G.insertBefore(n.createTextNode(x),G.childNodes[0]||null),Re===re?j.call(k,ye?"html":"body")[0]:ye?k.documentElement:G},Zn=function(c){return O.call(c.ownerDocument||c,c,d.SHOW_ELEMENT|d.SHOW_COMMENT|d.SHOW_TEXT|d.SHOW_PROCESSING_INSTRUCTION|d.SHOW_CDATA_SECTION,null)},Jt=function(c){return c instanceof h&&(typeof c.nodeName!="string"||typeof c.textContent!="string"||typeof c.removeChild!="function"||!(c.attributes instanceof u)||typeof c.removeAttribute!="function"||typeof c.setAttribute!="function"||typeof c.namespaceURI!="string"||typeof c.insertBefore!="function"||typeof c.hasChildNodes!="function")},Qn=function(c){return typeof r=="function"&&c instanceof r};function ce(T,c,k){bt(T,x=>{x.call(t,c,k,Le)})}const Xn=function(c){let k=null;if(ce(D.beforeSanitizeElements,c,null),Jt(c))return le(c),!0;const x=H(c.nodeName);if(ce(D.uponSanitizeElement,c,{tagName:x,allowedTags:K}),dt&&c.hasChildNodes()&&!Qn(c.firstElementChild)&&J(/<[/\w!]/g,c.innerHTML)&&J(/<[/\w!]/g,c.textContent)||c.nodeType===qe.progressingInstruction||dt&&c.nodeType===qe.comment&&J(/<[/\w]/g,c.data))return le(c),!0;if(!(Ee.tagCheck instanceof Function&&Ee.tagCheck(x))&&(!K[x]||Ne[x])){if(!Ne[x]&&ts(x)&&(U.tagNameCheck instanceof RegExp&&J(U.tagNameCheck,x)||U.tagNameCheck instanceof Function&&U.tagNameCheck(x)))return!1;if(jt&&!ae[x]){const N=I(c)||c.parentNode,G=R(c)||c.childNodes;if(G&&N){const B=G.length;for(let X=B-1;X>=0;--X){const de=w(G[X],!0);de.__removalCount=(c.__removalCount||0)+1,N.insertBefore(de,S(c))}}}return le(c),!0}return c instanceof o&&!Bi(c)||(x==="noscript"||x==="noembed"||x==="noframes")&&J(/<\/no(script|embed|frames)/i,c.innerHTML)?(le(c),!0):(Ce&&c.nodeType===qe.text&&(k=c.textContent,bt([ve,ge,Dt],N=>{k=Ke(k,N," ")}),c.textContent!==k&&(He(t.removed,{element:c.cloneNode()}),c.textContent=k)),ce(D.afterSanitizeElements,c,null),!1)},es=function(c,k,x){if(Kn&&(k==="id"||k==="name")&&(x in n||x in Ui))return!1;if(!(Bt&&!Ut[k]&&J(Mi,k))){if(!(Un&&J(Ri,k))){if(!(Ee.attributeCheck instanceof Function&&Ee.attributeCheck(k,c))){if(!z[k]||Ut[k]){if(!(ts(c)&&(U.tagNameCheck instanceof RegExp&&J(U.tagNameCheck,c)||U.tagNameCheck instanceof Function&&U.tagNameCheck(c))&&(U.attributeNameCheck instanceof RegExp&&J(U.attributeNameCheck,k)||U.attributeNameCheck instanceof Function&&U.attributeNameCheck(k,c))||k==="is"&&U.allowCustomizedBuiltInElements&&(U.tagNameCheck instanceof RegExp&&J(U.tagNameCheck,x)||U.tagNameCheck instanceof Function&&U.tagNameCheck(x))))return!1}else if(!qt[k]){if(!J(Nn,Ke(x,Fn,""))){if(!((k==="src"||k==="xlink:href"||k==="href")&&c!=="script"&&Pa(x,"data:")===0&&zn[c])){if(!(Bn&&!J(Li,Ke(x,Fn,"")))){if(x)return!1}}}}}}}return!0},ts=function(c){return c!=="annotation-xml"&&en(c,Pi)},ns=function(c){ce(D.beforeSanitizeAttributes,c,null);const{attributes:k}=c;if(!k||Jt(c))return;const x={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:z,forceKeepAttr:void 0};let N=k.length;for(;N--;){const G=k[N],{name:B,namespaceURI:X,value:de}=G,Pe=H(B),Vt=de;let q=B==="value"?Vt:Ia(Vt);if(x.attrName=Pe,x.attrValue=q,x.keepAttr=!0,x.forceKeepAttr=void 0,ce(D.uponSanitizeAttribute,c,x),q=x.attrValue,jn&&(Pe==="id"||Pe==="name")&&(ke(B,c),q=Ii+q),dt&&J(/((--!?|])>)|<\/(style|title|textarea)/i,q)){ke(B,c);continue}if(Pe==="attributename"&&en(q,"href")){ke(B,c);continue}if(x.forceKeepAttr)continue;if(!x.keepAttr){ke(B,c);continue}if(!Hn&&J(/\/>/i,q)){ke(B,c);continue}Ce&&bt([ve,ge,Dt],is=>{q=Ke(q,is," ")});const ss=H(c.nodeName);if(!es(ss,Pe,q)){ke(B,c);continue}if(_&&typeof $=="object"&&typeof $.getAttributeType=="function"&&!X)switch($.getAttributeType(ss,Pe)){case"TrustedHTML":{q=_.createHTML(q);break}case"TrustedScriptURL":{q=_.createScriptURL(q);break}}if(q!==Vt)try{X?c.setAttributeNS(X,B,q):c.setAttribute(B,q),Jt(c)?le(c):ws(t.removed)}catch{ke(B,c)}}ce(D.afterSanitizeAttributes,c,null)},Hi=function T(c){let k=null;const x=Zn(c);for(ce(D.beforeSanitizeShadowDOM,c,null);k=x.nextNode();)ce(D.uponSanitizeShadowNode,k,null),Xn(k),ns(k),k.content instanceof a&&T(k.content);ce(D.afterSanitizeShadowDOM,c,null)};return t.sanitize=function(T){let c=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},k=null,x=null,N=null,G=null;if(Wt=!T,Wt&&(T="<!-->"),typeof T!="string"&&!Qn(T))if(typeof T.toString=="function"){if(T=T.toString(),typeof T!="string")throw je("dirty is not a string, aborting")}else throw je("toString is not a function");if(!t.isSupported)return T;if(Ht||Yt(c),t.removed=[],typeof T=="string"&&(Oe=!1),Oe){if(T.nodeName){const de=H(T.nodeName);if(!K[de]||Ne[de])throw je("root node is forbidden and cannot be sanitized in-place")}}else if(T instanceof r)k=Vn("<!---->"),x=k.ownerDocument.importNode(T,!0),x.nodeType===qe.element&&x.nodeName==="BODY"||x.nodeName==="HTML"?k=x:k.appendChild(x);else{if(!_e&&!Ce&&!ye&&T.indexOf("<")===-1)return _&&ht?_.createHTML(T):T;if(k=Vn(T),!k)return _e?null:ht?E:""}k&&Kt&&le(k.firstChild);const B=Zn(Oe?T:k);for(;N=B.nextNode();)Xn(N),ns(N),N.content instanceof a&&Hi(N.content);if(Oe)return T;if(_e){if(ut)for(G=F.call(k.ownerDocument);k.firstChild;)G.appendChild(k.firstChild);else G=k;return(z.shadowroot||z.shadowrootmode)&&(G=Y.call(s,G,!0)),G}let X=ye?k.outerHTML:k.innerHTML;return ye&&K["!doctype"]&&k.ownerDocument&&k.ownerDocument.doctype&&k.ownerDocument.doctype.name&&J(li,k.ownerDocument.doctype.name)&&(X="<!DOCTYPE "+k.ownerDocument.doctype.name+`>
|
|
4
|
+
`+X),Ce&&bt([ve,ge,Dt],de=>{X=Ke(X,de," ")}),_&&ht?_.createHTML(X):X},t.setConfig=function(){let T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Yt(T),Ht=!0},t.clearConfig=function(){Le=null,Ht=!1},t.isValidAttribute=function(T,c,k){Le||Yt({});const x=H(T),N=H(c);return es(x,N,k)},t.addHook=function(T,c){typeof c=="function"&&He(D[T],c)},t.removeHook=function(T,c){if(c!==void 0){const k=Ra(D[T],c);return k===-1?void 0:La(D[T],k,1)[0]}return ws(D[T])},t.removeHooks=function(T){D[T]=[]},t.removeAllHooks=function(){D=Cs()},t}var ri=oi();function xn(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var Te=xn();function ci(e){Te=e}var Ze={exec:()=>null};function M(e,t=""){let n=typeof e=="string"?e:e.source,s={replace:(i,a)=>{let l=typeof a=="string"?a:a.source;return l=l.replace(V.caret,"$1"),n=n.replace(i,l),s},getRegex:()=>new RegExp(n,t)};return s}var Ja=(()=>{try{return!!new RegExp("(?<=1)(?<!1)")}catch{return!1}})(),V={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceTabs:/^\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:e=>new RegExp(`^( {0,3}${e})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}#`),htmlBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}<(?:[a-z].*>|!--)`,"i")},Va=/^(?:[ \t]*(?:\n|$))+/,Za=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,Qa=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,ot=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,Xa=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,An=/(?:[*+-]|\d{1,9}[.)])/,di=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,ui=M(di).replace(/bull/g,An).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),el=M(di).replace(/bull/g,An).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),Tn=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,tl=/^[^\n]+/,En=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,nl=M(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",En).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),sl=M(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,An).getRegex(),It="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",Cn=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,il=M("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",Cn).replace("tag",It).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),hi=M(Tn).replace("hr",ot).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",It).getRegex(),al=M(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",hi).getRegex(),_n={blockquote:al,code:Za,def:nl,fences:Qa,heading:Xa,hr:ot,html:il,lheading:ui,list:sl,newline:Va,paragraph:hi,table:Ze,text:tl},_s=M("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",ot).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",It).getRegex(),ll={..._n,lheading:el,table:_s,paragraph:M(Tn).replace("hr",ot).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",_s).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",It).getRegex()},ol={..._n,html:M(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",Cn).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:Ze,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:M(Tn).replace("hr",ot).replace("heading",` *#{1,6} *[^
|
|
5
|
+
]`).replace("lheading",ui).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},rl=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,cl=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,pi=/^( {2,}|\\)\n(?!\s*$)/,dl=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,Ft=/[\p{P}\p{S}]/u,Mn=/[\s\p{P}\p{S}]/u,gi=/[^\s\p{P}\p{S}]/u,ul=M(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,Mn).getRegex(),fi=/(?!~)[\p{P}\p{S}]/u,hl=/(?!~)[\s\p{P}\p{S}]/u,pl=/(?:[^\s\p{P}\p{S}]|~)/u,gl=M(/link|precode-code|html/,"g").replace("link",/\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",Ja?"(?<!`)()":"(^^|[^`])").replace("code",/(?<b>`+)[^`]+\k<b>(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),mi=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,fl=M(mi,"u").replace(/punct/g,Ft).getRegex(),ml=M(mi,"u").replace(/punct/g,fi).getRegex(),bi="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",bl=M(bi,"gu").replace(/notPunctSpace/g,gi).replace(/punctSpace/g,Mn).replace(/punct/g,Ft).getRegex(),vl=M(bi,"gu").replace(/notPunctSpace/g,pl).replace(/punctSpace/g,hl).replace(/punct/g,fi).getRegex(),yl=M("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,gi).replace(/punctSpace/g,Mn).replace(/punct/g,Ft).getRegex(),kl=M(/\\(punct)/,"gu").replace(/punct/g,Ft).getRegex(),$l=M(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),wl=M(Cn).replace("(?:-->|$)","-->").getRegex(),Sl=M("^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment",wl).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),Et=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/,xl=M(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",Et).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),vi=M(/^!?\[(label)\]\[(ref)\]/).replace("label",Et).replace("ref",En).getRegex(),yi=M(/^!?\[(ref)\](?:\[\])?/).replace("ref",En).getRegex(),Al=M("reflink|nolink(?!\\()","g").replace("reflink",vi).replace("nolink",yi).getRegex(),Ms=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,Rn={_backpedal:Ze,anyPunctuation:kl,autolink:$l,blockSkip:gl,br:pi,code:cl,del:Ze,emStrongLDelim:fl,emStrongRDelimAst:bl,emStrongRDelimUnd:yl,escape:rl,link:xl,nolink:yi,punctuation:ul,reflink:vi,reflinkSearch:Al,tag:Sl,text:dl,url:Ze},Tl={...Rn,link:M(/^!?\[(label)\]\((.*?)\)/).replace("label",Et).getRegex(),reflink:M(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Et).getRegex()},hn={...Rn,emStrongRDelimAst:vl,emStrongLDelim:ml,url:M(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",Ms).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:M(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/).replace("protocol",Ms).getRegex()},El={...hn,br:M(pi).replace("{2,}","*").getRegex(),text:M(hn.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()},yt={normal:_n,gfm:ll,pedantic:ol},We={normal:Rn,gfm:hn,breaks:El,pedantic:Tl},Cl={"&":"&","<":"<",">":">",'"':""","'":"'"},Rs=e=>Cl[e];function ue(e,t){if(t){if(V.escapeTest.test(e))return e.replace(V.escapeReplace,Rs)}else if(V.escapeTestNoEncode.test(e))return e.replace(V.escapeReplaceNoEncode,Rs);return e}function Ls(e){try{e=encodeURI(e).replace(V.percentDecode,"%")}catch{return null}return e}function Ps(e,t){let n=e.replace(V.findPipe,(a,l,r)=>{let o=!1,d=l;for(;--d>=0&&r[d]==="\\";)o=!o;return o?"|":" |"}),s=n.split(V.splitPipe),i=0;if(s[0].trim()||s.shift(),s.length>0&&!s.at(-1)?.trim()&&s.pop(),t)if(s.length>t)s.splice(t);else for(;s.length<t;)s.push("");for(;i<s.length;i++)s[i]=s[i].trim().replace(V.slashPipe,"|");return s}function Ge(e,t,n){let s=e.length;if(s===0)return"";let i=0;for(;i<s&&e.charAt(s-i-1)===t;)i++;return e.slice(0,s-i)}function _l(e,t){if(e.indexOf(t[1])===-1)return-1;let n=0;for(let s=0;s<e.length;s++)if(e[s]==="\\")s++;else if(e[s]===t[0])n++;else if(e[s]===t[1]&&(n--,n<0))return s;return n>0?-2:-1}function Is(e,t,n,s,i){let a=t.href,l=t.title||null,r=e[1].replace(i.other.outputLinkReplace,"$1");s.state.inLink=!0;let o={type:e[0].charAt(0)==="!"?"image":"link",raw:n,href:a,title:l,text:r,tokens:s.inlineTokens(r)};return s.state.inLink=!1,o}function Ml(e,t,n){let s=e.match(n.other.indentCodeCompensation);if(s===null)return t;let i=s[1];return t.split(`
|
|
6
|
+
`).map(a=>{let l=a.match(n.other.beginningSpace);if(l===null)return a;let[r]=l;return r.length>=i.length?a.slice(i.length):a}).join(`
|
|
7
|
+
`)}var Ct=class{options;rules;lexer;constructor(e){this.options=e||Te}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:"space",raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let n=t[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?n:Ge(n,`
|
|
8
|
+
`)}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let n=t[0],s=Ml(n,t[3]||"",this.rules);return{type:"code",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t[2],text:s}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){let s=Ge(n,"#");(this.options.pedantic||!s||this.rules.other.endingSpaceChar.test(s))&&(n=s.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:Ge(t[0],`
|
|
9
|
+
`)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let n=Ge(t[0],`
|
|
10
|
+
`).split(`
|
|
11
|
+
`),s="",i="",a=[];for(;n.length>0;){let l=!1,r=[],o;for(o=0;o<n.length;o++)if(this.rules.other.blockquoteStart.test(n[o]))r.push(n[o]),l=!0;else if(!l)r.push(n[o]);else break;n=n.slice(o);let d=r.join(`
|
|
12
|
+
`),u=d.replace(this.rules.other.blockquoteSetextReplace,`
|
|
13
|
+
$1`).replace(this.rules.other.blockquoteSetextReplace2,"");s=s?`${s}
|
|
14
|
+
${d}`:d,i=i?`${i}
|
|
15
|
+
${u}`:u;let h=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(u,a,!0),this.lexer.state.top=h,n.length===0)break;let g=a.at(-1);if(g?.type==="code")break;if(g?.type==="blockquote"){let $=g,y=$.raw+`
|
|
16
|
+
`+n.join(`
|
|
17
|
+
`),w=this.blockquote(y);a[a.length-1]=w,s=s.substring(0,s.length-$.raw.length)+w.raw,i=i.substring(0,i.length-$.text.length)+w.text;break}else if(g?.type==="list"){let $=g,y=$.raw+`
|
|
18
|
+
`+n.join(`
|
|
19
|
+
`),w=this.list(y);a[a.length-1]=w,s=s.substring(0,s.length-g.raw.length)+w.raw,i=i.substring(0,i.length-$.raw.length)+w.raw,n=y.substring(a.at(-1).raw.length).split(`
|
|
20
|
+
`);continue}}return{type:"blockquote",raw:s,tokens:a,text:i}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim(),s=n.length>1,i={type:"list",raw:"",ordered:s,start:s?+n.slice(0,-1):"",loose:!1,items:[]};n=s?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=s?n:"[*+-]");let a=this.rules.other.listItemRegex(n),l=!1;for(;e;){let o=!1,d="",u="";if(!(t=a.exec(e))||this.rules.block.hr.test(e))break;d=t[0],e=e.substring(d.length);let h=t[2].split(`
|
|
21
|
+
`,1)[0].replace(this.rules.other.listReplaceTabs,w=>" ".repeat(3*w.length)),g=e.split(`
|
|
22
|
+
`,1)[0],$=!h.trim(),y=0;if(this.options.pedantic?(y=2,u=h.trimStart()):$?y=t[1].length+1:(y=t[2].search(this.rules.other.nonSpaceChar),y=y>4?1:y,u=h.slice(y),y+=t[1].length),$&&this.rules.other.blankLine.test(g)&&(d+=g+`
|
|
23
|
+
`,e=e.substring(g.length+1),o=!0),!o){let w=this.rules.other.nextBulletRegex(y),A=this.rules.other.hrRegex(y),S=this.rules.other.fencesBeginRegex(y),R=this.rules.other.headingBeginRegex(y),I=this.rules.other.htmlBeginRegex(y);for(;e;){let _=e.split(`
|
|
24
|
+
`,1)[0],E;if(g=_,this.options.pedantic?(g=g.replace(this.rules.other.listReplaceNesting," "),E=g):E=g.replace(this.rules.other.tabCharGlobal," "),S.test(g)||R.test(g)||I.test(g)||w.test(g)||A.test(g))break;if(E.search(this.rules.other.nonSpaceChar)>=y||!g.trim())u+=`
|
|
25
|
+
`+E.slice(y);else{if($||h.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||S.test(h)||R.test(h)||A.test(h))break;u+=`
|
|
26
|
+
`+g}!$&&!g.trim()&&($=!0),d+=_+`
|
|
27
|
+
`,e=e.substring(_.length+1),h=E.slice(y)}}i.loose||(l?i.loose=!0:this.rules.other.doubleBlankLine.test(d)&&(l=!0)),i.items.push({type:"list_item",raw:d,task:!!this.options.gfm&&this.rules.other.listIsTask.test(u),loose:!1,text:u,tokens:[]}),i.raw+=d}let r=i.items.at(-1);if(r)r.raw=r.raw.trimEnd(),r.text=r.text.trimEnd();else return;i.raw=i.raw.trimEnd();for(let o of i.items){if(this.lexer.state.top=!1,o.tokens=this.lexer.blockTokens(o.text,[]),o.task){if(o.text=o.text.replace(this.rules.other.listReplaceTask,""),o.tokens[0]?.type==="text"||o.tokens[0]?.type==="paragraph"){o.tokens[0].raw=o.tokens[0].raw.replace(this.rules.other.listReplaceTask,""),o.tokens[0].text=o.tokens[0].text.replace(this.rules.other.listReplaceTask,"");for(let u=this.lexer.inlineQueue.length-1;u>=0;u--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[u].src)){this.lexer.inlineQueue[u].src=this.lexer.inlineQueue[u].src.replace(this.rules.other.listReplaceTask,"");break}}let d=this.rules.other.listTaskCheckbox.exec(o.raw);if(d){let u={type:"checkbox",raw:d[0]+" ",checked:d[0]!=="[ ]"};o.checked=u.checked,i.loose?o.tokens[0]&&["paragraph","text"].includes(o.tokens[0].type)&&"tokens"in o.tokens[0]&&o.tokens[0].tokens?(o.tokens[0].raw=u.raw+o.tokens[0].raw,o.tokens[0].text=u.raw+o.tokens[0].text,o.tokens[0].tokens.unshift(u)):o.tokens.unshift({type:"paragraph",raw:u.raw,text:u.raw,tokens:[u]}):o.tokens.unshift(u)}}if(!i.loose){let d=o.tokens.filter(h=>h.type==="space"),u=d.length>0&&d.some(h=>this.rules.other.anyLine.test(h.raw));i.loose=u}}if(i.loose)for(let o of i.items){o.loose=!0;for(let d of o.tokens)d.type==="text"&&(d.type="paragraph")}return i}}html(e){let t=this.rules.block.html.exec(e);if(t)return{type:"html",block:!0,raw:t[0],pre:t[1]==="pre"||t[1]==="script"||t[1]==="style",text:t[0]}}def(e){let t=this.rules.block.def.exec(e);if(t){let n=t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),s=t[2]?t[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",i=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):t[3];return{type:"def",tag:n,raw:t[0],href:s,title:i}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=Ps(t[1]),s=t[2].replace(this.rules.other.tableAlignChars,"").split("|"),i=t[3]?.trim()?t[3].replace(this.rules.other.tableRowBlankLine,"").split(`
|
|
28
|
+
`):[],a={type:"table",raw:t[0],header:[],align:[],rows:[]};if(n.length===s.length){for(let l of s)this.rules.other.tableAlignRight.test(l)?a.align.push("right"):this.rules.other.tableAlignCenter.test(l)?a.align.push("center"):this.rules.other.tableAlignLeft.test(l)?a.align.push("left"):a.align.push(null);for(let l=0;l<n.length;l++)a.header.push({text:n[l],tokens:this.lexer.inline(n[l]),header:!0,align:a.align[l]});for(let l of i)a.rows.push(Ps(l,a.header.length).map((r,o)=>({text:r,tokens:this.lexer.inline(r),header:!1,align:a.align[o]})));return a}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t)return{type:"heading",raw:t[0],depth:t[2].charAt(0)==="="?1:2,text:t[1],tokens:this.lexer.inline(t[1])}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let n=t[1].charAt(t[1].length-1)===`
|
|
29
|
+
`?t[1].slice(0,-1):t[1];return{type:"paragraph",raw:t[0],text:n,tokens:this.lexer.inline(n)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:"text",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:"escape",raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let n=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;let a=Ge(n.slice(0,-1),"\\");if((n.length-a.length)%2===0)return}else{let a=_l(t[2],"()");if(a===-2)return;if(a>-1){let l=(t[0].indexOf("!")===0?5:4)+t[1].length+a;t[2]=t[2].substring(0,a),t[0]=t[0].substring(0,l).trim(),t[3]=""}}let s=t[2],i="";if(this.options.pedantic){let a=this.rules.other.pedanticHrefTitle.exec(s);a&&(s=a[1],i=a[3])}else i=t[3]?t[3].slice(1,-1):"";return s=s.trim(),this.rules.other.startAngleBracket.test(s)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?s=s.slice(1):s=s.slice(1,-1)),Is(t,{href:s&&s.replace(this.rules.inline.anyPunctuation,"$1"),title:i&&i.replace(this.rules.inline.anyPunctuation,"$1")},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let s=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal," "),i=t[s.toLowerCase()];if(!i){let a=n[0].charAt(0);return{type:"text",raw:a,text:a}}return Is(n,i,n[0],this.lexer,this.rules)}}emStrong(e,t,n=""){let s=this.rules.inline.emStrongLDelim.exec(e);if(!(!s||s[3]&&n.match(this.rules.other.unicodeAlphaNumeric))&&(!(s[1]||s[2])||!n||this.rules.inline.punctuation.exec(n))){let i=[...s[0]].length-1,a,l,r=i,o=0,d=s[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(d.lastIndex=0,t=t.slice(-1*e.length+i);(s=d.exec(t))!=null;){if(a=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!a)continue;if(l=[...a].length,s[3]||s[4]){r+=l;continue}else if((s[5]||s[6])&&i%3&&!((i+l)%3)){o+=l;continue}if(r-=l,r>0)continue;l=Math.min(l,l+r+o);let u=[...s[0]][0].length,h=e.slice(0,i+s.index+u+l);if(Math.min(i,l)%2){let $=h.slice(1,-1);return{type:"em",raw:h,text:$,tokens:this.lexer.inlineTokens($)}}let g=h.slice(2,-2);return{type:"strong",raw:h,text:g,tokens:this.lexer.inlineTokens(g)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal," "),s=this.rules.other.nonSpaceChar.test(n),i=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return s&&i&&(n=n.substring(1,n.length-1)),{type:"codespan",raw:t[0],text:n}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}del(e){let t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let n,s;return t[2]==="@"?(n=t[1],s="mailto:"+n):(n=t[1],s=n),{type:"link",raw:t[0],text:n,href:s,tokens:[{type:"text",raw:n,text:n}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let n,s;if(t[2]==="@")n=t[0],s="mailto:"+n;else{let i;do i=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??"";while(i!==t[0]);n=t[0],t[1]==="www."?s="http://"+t[0]:s=t[0]}return{type:"link",raw:t[0],text:n,href:s,tokens:[{type:"text",raw:n,text:n}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let n=this.lexer.state.inRawBlock;return{type:"text",raw:t[0],text:t[0],escaped:n}}}},se=class pn{tokens;options;state;inlineQueue;tokenizer;constructor(t){this.tokens=[],this.tokens.links=Object.create(null),this.options=t||Te,this.options.tokenizer=this.options.tokenizer||new Ct,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let n={other:V,block:yt.normal,inline:We.normal};this.options.pedantic?(n.block=yt.pedantic,n.inline=We.pedantic):this.options.gfm&&(n.block=yt.gfm,this.options.breaks?n.inline=We.breaks:n.inline=We.gfm),this.tokenizer.rules=n}static get rules(){return{block:yt,inline:We}}static lex(t,n){return new pn(n).lex(t)}static lexInline(t,n){return new pn(n).inlineTokens(t)}lex(t){t=t.replace(V.carriageReturn,`
|
|
30
|
+
`),this.blockTokens(t,this.tokens);for(let n=0;n<this.inlineQueue.length;n++){let s=this.inlineQueue[n];this.inlineTokens(s.src,s.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(t,n=[],s=!1){for(this.options.pedantic&&(t=t.replace(V.tabCharGlobal," ").replace(V.spaceLine,""));t;){let i;if(this.options.extensions?.block?.some(l=>(i=l.call({lexer:this},t,n))?(t=t.substring(i.raw.length),n.push(i),!0):!1))continue;if(i=this.tokenizer.space(t)){t=t.substring(i.raw.length);let l=n.at(-1);i.raw.length===1&&l!==void 0?l.raw+=`
|
|
31
|
+
`:n.push(i);continue}if(i=this.tokenizer.code(t)){t=t.substring(i.raw.length);let l=n.at(-1);l?.type==="paragraph"||l?.type==="text"?(l.raw+=(l.raw.endsWith(`
|
|
32
|
+
`)?"":`
|
|
33
|
+
`)+i.raw,l.text+=`
|
|
34
|
+
`+i.text,this.inlineQueue.at(-1).src=l.text):n.push(i);continue}if(i=this.tokenizer.fences(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.heading(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.hr(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.blockquote(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.list(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.html(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.def(t)){t=t.substring(i.raw.length);let l=n.at(-1);l?.type==="paragraph"||l?.type==="text"?(l.raw+=(l.raw.endsWith(`
|
|
35
|
+
`)?"":`
|
|
36
|
+
`)+i.raw,l.text+=`
|
|
37
|
+
`+i.raw,this.inlineQueue.at(-1).src=l.text):this.tokens.links[i.tag]||(this.tokens.links[i.tag]={href:i.href,title:i.title},n.push(i));continue}if(i=this.tokenizer.table(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.lheading(t)){t=t.substring(i.raw.length),n.push(i);continue}let a=t;if(this.options.extensions?.startBlock){let l=1/0,r=t.slice(1),o;this.options.extensions.startBlock.forEach(d=>{o=d.call({lexer:this},r),typeof o=="number"&&o>=0&&(l=Math.min(l,o))}),l<1/0&&l>=0&&(a=t.substring(0,l+1))}if(this.state.top&&(i=this.tokenizer.paragraph(a))){let l=n.at(-1);s&&l?.type==="paragraph"?(l.raw+=(l.raw.endsWith(`
|
|
38
|
+
`)?"":`
|
|
39
|
+
`)+i.raw,l.text+=`
|
|
40
|
+
`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=l.text):n.push(i),s=a.length!==t.length,t=t.substring(i.raw.length);continue}if(i=this.tokenizer.text(t)){t=t.substring(i.raw.length);let l=n.at(-1);l?.type==="text"?(l.raw+=(l.raw.endsWith(`
|
|
41
|
+
`)?"":`
|
|
42
|
+
`)+i.raw,l.text+=`
|
|
43
|
+
`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=l.text):n.push(i);continue}if(t){let l="Infinite loop on byte: "+t.charCodeAt(0);if(this.options.silent){console.error(l);break}else throw new Error(l)}}return this.state.top=!0,n}inline(t,n=[]){return this.inlineQueue.push({src:t,tokens:n}),n}inlineTokens(t,n=[]){let s=t,i=null;if(this.tokens.links){let o=Object.keys(this.tokens.links);if(o.length>0)for(;(i=this.tokenizer.rules.inline.reflinkSearch.exec(s))!=null;)o.includes(i[0].slice(i[0].lastIndexOf("[")+1,-1))&&(s=s.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+s.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(i=this.tokenizer.rules.inline.anyPunctuation.exec(s))!=null;)s=s.slice(0,i.index)+"++"+s.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let a;for(;(i=this.tokenizer.rules.inline.blockSkip.exec(s))!=null;)a=i[2]?i[2].length:0,s=s.slice(0,i.index+a)+"["+"a".repeat(i[0].length-a-2)+"]"+s.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);s=this.options.hooks?.emStrongMask?.call({lexer:this},s)??s;let l=!1,r="";for(;t;){l||(r=""),l=!1;let o;if(this.options.extensions?.inline?.some(u=>(o=u.call({lexer:this},t,n))?(t=t.substring(o.raw.length),n.push(o),!0):!1))continue;if(o=this.tokenizer.escape(t)){t=t.substring(o.raw.length),n.push(o);continue}if(o=this.tokenizer.tag(t)){t=t.substring(o.raw.length),n.push(o);continue}if(o=this.tokenizer.link(t)){t=t.substring(o.raw.length),n.push(o);continue}if(o=this.tokenizer.reflink(t,this.tokens.links)){t=t.substring(o.raw.length);let u=n.at(-1);o.type==="text"&&u?.type==="text"?(u.raw+=o.raw,u.text+=o.text):n.push(o);continue}if(o=this.tokenizer.emStrong(t,s,r)){t=t.substring(o.raw.length),n.push(o);continue}if(o=this.tokenizer.codespan(t)){t=t.substring(o.raw.length),n.push(o);continue}if(o=this.tokenizer.br(t)){t=t.substring(o.raw.length),n.push(o);continue}if(o=this.tokenizer.del(t)){t=t.substring(o.raw.length),n.push(o);continue}if(o=this.tokenizer.autolink(t)){t=t.substring(o.raw.length),n.push(o);continue}if(!this.state.inLink&&(o=this.tokenizer.url(t))){t=t.substring(o.raw.length),n.push(o);continue}let d=t;if(this.options.extensions?.startInline){let u=1/0,h=t.slice(1),g;this.options.extensions.startInline.forEach($=>{g=$.call({lexer:this},h),typeof g=="number"&&g>=0&&(u=Math.min(u,g))}),u<1/0&&u>=0&&(d=t.substring(0,u+1))}if(o=this.tokenizer.inlineText(d)){t=t.substring(o.raw.length),o.raw.slice(-1)!=="_"&&(r=o.raw.slice(-1)),l=!0;let u=n.at(-1);u?.type==="text"?(u.raw+=o.raw,u.text+=o.text):n.push(o);continue}if(t){let u="Infinite loop on byte: "+t.charCodeAt(0);if(this.options.silent){console.error(u);break}else throw new Error(u)}}return n}},_t=class{options;parser;constructor(e){this.options=e||Te}space(e){return""}code({text:e,lang:t,escaped:n}){let s=(t||"").match(V.notSpaceStart)?.[0],i=e.replace(V.endingNewline,"")+`
|
|
44
|
+
`;return s?'<pre><code class="language-'+ue(s)+'">'+(n?i:ue(i,!0))+`</code></pre>
|
|
45
|
+
`:"<pre><code>"+(n?i:ue(i,!0))+`</code></pre>
|
|
46
|
+
`}blockquote({tokens:e}){return`<blockquote>
|
|
47
|
+
${this.parser.parse(e)}</blockquote>
|
|
48
|
+
`}html({text:e}){return e}def(e){return""}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>
|
|
49
|
+
`}hr(e){return`<hr>
|
|
50
|
+
`}list(e){let t=e.ordered,n=e.start,s="";for(let l=0;l<e.items.length;l++){let r=e.items[l];s+=this.listitem(r)}let i=t?"ol":"ul",a=t&&n!==1?' start="'+n+'"':"";return"<"+i+a+`>
|
|
51
|
+
`+s+"</"+i+`>
|
|
52
|
+
`}listitem(e){return`<li>${this.parser.parse(e.tokens)}</li>
|
|
53
|
+
`}checkbox({checked:e}){return"<input "+(e?'checked="" ':"")+'disabled="" type="checkbox"> '}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>
|
|
54
|
+
`}table(e){let t="",n="";for(let i=0;i<e.header.length;i++)n+=this.tablecell(e.header[i]);t+=this.tablerow({text:n});let s="";for(let i=0;i<e.rows.length;i++){let a=e.rows[i];n="";for(let l=0;l<a.length;l++)n+=this.tablecell(a[l]);s+=this.tablerow({text:n})}return s&&(s=`<tbody>${s}</tbody>`),`<table>
|
|
55
|
+
<thead>
|
|
56
|
+
`+t+`</thead>
|
|
57
|
+
`+s+`</table>
|
|
58
|
+
`}tablerow({text:e}){return`<tr>
|
|
59
|
+
${e}</tr>
|
|
60
|
+
`}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?"th":"td";return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+t+`</${n}>
|
|
61
|
+
`}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${ue(e,!0)}</code>`}br(e){return"<br>"}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,tokens:n}){let s=this.parser.parseInline(n),i=Ls(e);if(i===null)return s;e=i;let a='<a href="'+e+'"';return t&&(a+=' title="'+ue(t)+'"'),a+=">"+s+"</a>",a}image({href:e,title:t,text:n,tokens:s}){s&&(n=this.parser.parseInline(s,this.parser.textRenderer));let i=Ls(e);if(i===null)return ue(n);e=i;let a=`<img src="${e}" alt="${n}"`;return t&&(a+=` title="${ue(t)}"`),a+=">",a}text(e){return"tokens"in e&&e.tokens?this.parser.parseInline(e.tokens):"escaped"in e&&e.escaped?e.text:ue(e.text)}},Ln=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return""+e}image({text:e}){return""+e}br(){return""}checkbox({raw:e}){return e}},ie=class gn{options;renderer;textRenderer;constructor(t){this.options=t||Te,this.options.renderer=this.options.renderer||new _t,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new Ln}static parse(t,n){return new gn(n).parse(t)}static parseInline(t,n){return new gn(n).parseInline(t)}parse(t){let n="";for(let s=0;s<t.length;s++){let i=t[s];if(this.options.extensions?.renderers?.[i.type]){let l=i,r=this.options.extensions.renderers[l.type].call({parser:this},l);if(r!==!1||!["space","hr","heading","code","table","blockquote","list","html","def","paragraph","text"].includes(l.type)){n+=r||"";continue}}let a=i;switch(a.type){case"space":{n+=this.renderer.space(a);break}case"hr":{n+=this.renderer.hr(a);break}case"heading":{n+=this.renderer.heading(a);break}case"code":{n+=this.renderer.code(a);break}case"table":{n+=this.renderer.table(a);break}case"blockquote":{n+=this.renderer.blockquote(a);break}case"list":{n+=this.renderer.list(a);break}case"checkbox":{n+=this.renderer.checkbox(a);break}case"html":{n+=this.renderer.html(a);break}case"def":{n+=this.renderer.def(a);break}case"paragraph":{n+=this.renderer.paragraph(a);break}case"text":{n+=this.renderer.text(a);break}default:{let l='Token with "'+a.type+'" type was not found.';if(this.options.silent)return console.error(l),"";throw new Error(l)}}}return n}parseInline(t,n=this.renderer){let s="";for(let i=0;i<t.length;i++){let a=t[i];if(this.options.extensions?.renderers?.[a.type]){let r=this.options.extensions.renderers[a.type].call({parser:this},a);if(r!==!1||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(a.type)){s+=r||"";continue}}let l=a;switch(l.type){case"escape":{s+=n.text(l);break}case"html":{s+=n.html(l);break}case"link":{s+=n.link(l);break}case"image":{s+=n.image(l);break}case"checkbox":{s+=n.checkbox(l);break}case"strong":{s+=n.strong(l);break}case"em":{s+=n.em(l);break}case"codespan":{s+=n.codespan(l);break}case"br":{s+=n.br(l);break}case"del":{s+=n.del(l);break}case"text":{s+=n.text(l);break}default:{let r='Token with "'+l.type+'" type was not found.';if(this.options.silent)return console.error(r),"";throw new Error(r)}}}return s}},Ye=class{options;block;constructor(e){this.options=e||Te}static passThroughHooks=new Set(["preprocess","postprocess","processAllTokens","emStrongMask"]);static passThroughHooksRespectAsync=new Set(["preprocess","postprocess","processAllTokens"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(){return this.block?se.lex:se.lexInline}provideParser(){return this.block?ie.parse:ie.parseInline}},Rl=class{defaults=xn();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=ie;Renderer=_t;TextRenderer=Ln;Lexer=se;Tokenizer=Ct;Hooks=Ye;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let s of e)switch(n=n.concat(t.call(this,s)),s.type){case"table":{let i=s;for(let a of i.header)n=n.concat(this.walkTokens(a.tokens,t));for(let a of i.rows)for(let l of a)n=n.concat(this.walkTokens(l.tokens,t));break}case"list":{let i=s;n=n.concat(this.walkTokens(i.items,t));break}default:{let i=s;this.defaults.extensions?.childTokens?.[i.type]?this.defaults.extensions.childTokens[i.type].forEach(a=>{let l=i[a].flat(1/0);n=n.concat(this.walkTokens(l,t))}):i.tokens&&(n=n.concat(this.walkTokens(i.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let s={...n};if(s.async=this.defaults.async||s.async||!1,n.extensions&&(n.extensions.forEach(i=>{if(!i.name)throw new Error("extension name required");if("renderer"in i){let a=t.renderers[i.name];a?t.renderers[i.name]=function(...l){let r=i.renderer.apply(this,l);return r===!1&&(r=a.apply(this,l)),r}:t.renderers[i.name]=i.renderer}if("tokenizer"in i){if(!i.level||i.level!=="block"&&i.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let a=t[i.level];a?a.unshift(i.tokenizer):t[i.level]=[i.tokenizer],i.start&&(i.level==="block"?t.startBlock?t.startBlock.push(i.start):t.startBlock=[i.start]:i.level==="inline"&&(t.startInline?t.startInline.push(i.start):t.startInline=[i.start]))}"childTokens"in i&&i.childTokens&&(t.childTokens[i.name]=i.childTokens)}),s.extensions=t),n.renderer){let i=this.defaults.renderer||new _t(this.defaults);for(let a in n.renderer){if(!(a in i))throw new Error(`renderer '${a}' does not exist`);if(["options","parser"].includes(a))continue;let l=a,r=n.renderer[l],o=i[l];i[l]=(...d)=>{let u=r.apply(i,d);return u===!1&&(u=o.apply(i,d)),u||""}}s.renderer=i}if(n.tokenizer){let i=this.defaults.tokenizer||new Ct(this.defaults);for(let a in n.tokenizer){if(!(a in i))throw new Error(`tokenizer '${a}' does not exist`);if(["options","rules","lexer"].includes(a))continue;let l=a,r=n.tokenizer[l],o=i[l];i[l]=(...d)=>{let u=r.apply(i,d);return u===!1&&(u=o.apply(i,d)),u}}s.tokenizer=i}if(n.hooks){let i=this.defaults.hooks||new Ye;for(let a in n.hooks){if(!(a in i))throw new Error(`hook '${a}' does not exist`);if(["options","block"].includes(a))continue;let l=a,r=n.hooks[l],o=i[l];Ye.passThroughHooks.has(a)?i[l]=d=>{if(this.defaults.async&&Ye.passThroughHooksRespectAsync.has(a))return(async()=>{let h=await r.call(i,d);return o.call(i,h)})();let u=r.call(i,d);return o.call(i,u)}:i[l]=(...d)=>{if(this.defaults.async)return(async()=>{let h=await r.apply(i,d);return h===!1&&(h=await o.apply(i,d)),h})();let u=r.apply(i,d);return u===!1&&(u=o.apply(i,d)),u}}s.hooks=i}if(n.walkTokens){let i=this.defaults.walkTokens,a=n.walkTokens;s.walkTokens=function(l){let r=[];return r.push(a.call(this,l)),i&&(r=r.concat(i.call(this,l))),r}}this.defaults={...this.defaults,...s}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return se.lex(e,t??this.defaults)}parser(e,t){return ie.parse(e,t??this.defaults)}parseMarkdown(e){return(t,n)=>{let s={...n},i={...this.defaults,...s},a=this.onError(!!i.silent,!!i.async);if(this.defaults.async===!0&&s.async===!1)return a(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof t>"u"||t===null)return a(new Error("marked(): input parameter is undefined or null"));if(typeof t!="string")return a(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(t)+", string expected"));if(i.hooks&&(i.hooks.options=i,i.hooks.block=e),i.async)return(async()=>{let l=i.hooks?await i.hooks.preprocess(t):t,r=await(i.hooks?await i.hooks.provideLexer():e?se.lex:se.lexInline)(l,i),o=i.hooks?await i.hooks.processAllTokens(r):r;i.walkTokens&&await Promise.all(this.walkTokens(o,i.walkTokens));let d=await(i.hooks?await i.hooks.provideParser():e?ie.parse:ie.parseInline)(o,i);return i.hooks?await i.hooks.postprocess(d):d})().catch(a);try{i.hooks&&(t=i.hooks.preprocess(t));let l=(i.hooks?i.hooks.provideLexer():e?se.lex:se.lexInline)(t,i);i.hooks&&(l=i.hooks.processAllTokens(l)),i.walkTokens&&this.walkTokens(l,i.walkTokens);let r=(i.hooks?i.hooks.provideParser():e?ie.parse:ie.parseInline)(l,i);return i.hooks&&(r=i.hooks.postprocess(r)),r}catch(l){return a(l)}}}onError(e,t){return n=>{if(n.message+=`
|
|
62
|
+
Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error occurred:</p><pre>"+ue(n.message+"",!0)+"</pre>";return t?Promise.resolve(s):s}if(t)return Promise.reject(n);throw n}}},Ae=new Rl;function L(e,t){return Ae.parse(e,t)}L.options=L.setOptions=function(e){return Ae.setOptions(e),L.defaults=Ae.defaults,ci(L.defaults),L};L.getDefaults=xn;L.defaults=Te;L.use=function(...e){return Ae.use(...e),L.defaults=Ae.defaults,ci(L.defaults),L};L.walkTokens=function(e,t){return Ae.walkTokens(e,t)};L.parseInline=Ae.parseInline;L.Parser=ie;L.parser=ie.parse;L.Renderer=_t;L.TextRenderer=Ln;L.Lexer=se;L.lexer=se.lex;L.Tokenizer=Ct;L.Hooks=Ye;L.parse=L;L.options;L.setOptions;L.use;L.walkTokens;L.parseInline;ie.parse;se.lex;L.setOptions({gfm:!0,breaks:!0,headerIds:!1,mangle:!1});const Ll=["a","b","blockquote","br","code","del","em","h1","h2","h3","h4","hr","i","li","ol","p","pre","strong","table","tbody","td","th","thead","tr","ul"],Pl=["class","href","rel","target","title"];let Fs=!1;function Il(){Fs||(Fs=!0,ri.addHook("afterSanitizeAttributes",e=>{!(e instanceof HTMLAnchorElement)||!e.getAttribute("href")||(e.setAttribute("rel","noreferrer noopener"),e.setAttribute("target","_blank"))}))}function ki(e){const t=e.trim();if(!t)return"";Il();const n=L.parse(t);return ri.sanitize(n,{ALLOWED_TAGS:Ll,ALLOWED_ATTR:Pl})}const Fl={emoji:"🧩",detailKeys:["command","path","url","targetUrl","targetId","ref","element","node","nodeId","id","requestId","to","channelId","guildId","userId","name","query","pattern","messageId"]},Nl={bash:{emoji:"🛠️",title:"Bash",detailKeys:["command"]},process:{emoji:"🧰",title:"Process",detailKeys:["sessionId"]},read:{emoji:"📖",title:"Read",detailKeys:["path"]},write:{emoji:"✍️",title:"Write",detailKeys:["path"]},edit:{emoji:"📝",title:"Edit",detailKeys:["path"]},attach:{emoji:"📎",title:"Attach",detailKeys:["path","url","fileName"]},browser:{emoji:"🌐",title:"Browser",actions:{status:{label:"status"},start:{label:"start"},stop:{label:"stop"},tabs:{label:"tabs"},open:{label:"open",detailKeys:["targetUrl"]},focus:{label:"focus",detailKeys:["targetId"]},close:{label:"close",detailKeys:["targetId"]},snapshot:{label:"snapshot",detailKeys:["targetUrl","targetId","ref","element","format"]},screenshot:{label:"screenshot",detailKeys:["targetUrl","targetId","ref","element"]},navigate:{label:"navigate",detailKeys:["targetUrl","targetId"]},console:{label:"console",detailKeys:["level","targetId"]},pdf:{label:"pdf",detailKeys:["targetId"]},upload:{label:"upload",detailKeys:["paths","ref","inputRef","element","targetId"]},dialog:{label:"dialog",detailKeys:["accept","promptText","targetId"]},act:{label:"act",detailKeys:["request.kind","request.ref","request.selector","request.text","request.value"]}}},canvas:{emoji:"🖼️",title:"Canvas",actions:{present:{label:"present",detailKeys:["target","node","nodeId"]},hide:{label:"hide",detailKeys:["node","nodeId"]},navigate:{label:"navigate",detailKeys:["url","node","nodeId"]},eval:{label:"eval",detailKeys:["javaScript","node","nodeId"]},snapshot:{label:"snapshot",detailKeys:["format","node","nodeId"]},a2ui_push:{label:"A2UI push",detailKeys:["jsonlPath","node","nodeId"]},a2ui_reset:{label:"A2UI reset",detailKeys:["node","nodeId"]}}},nodes:{emoji:"📱",title:"Nodes",actions:{status:{label:"status"},describe:{label:"describe",detailKeys:["node","nodeId"]},pending:{label:"pending"},approve:{label:"approve",detailKeys:["requestId"]},reject:{label:"reject",detailKeys:["requestId"]},notify:{label:"notify",detailKeys:["node","nodeId","title","body"]},camera_snap:{label:"camera snap",detailKeys:["node","nodeId","facing","deviceId"]},camera_list:{label:"camera list",detailKeys:["node","nodeId"]},camera_clip:{label:"camera clip",detailKeys:["node","nodeId","facing","duration","durationMs"]},screen_record:{label:"screen record",detailKeys:["node","nodeId","duration","durationMs","fps","screenIndex"]}}},cron:{emoji:"⏰",title:"Cron",actions:{status:{label:"status"},list:{label:"list"},add:{label:"add",detailKeys:["job.name","job.id","job.schedule","job.cron"]},update:{label:"update",detailKeys:["id"]},remove:{label:"remove",detailKeys:["id"]},run:{label:"run",detailKeys:["id"]},runs:{label:"runs",detailKeys:["id"]},wake:{label:"wake",detailKeys:["text","mode"]}}},gateway:{emoji:"🔌",title:"Gateway",actions:{restart:{label:"restart",detailKeys:["reason","delayMs"]}}},whatsapp_login:{emoji:"🟢",title:"WhatsApp Login",actions:{start:{label:"start"},wait:{label:"wait"}}},discord:{emoji:"💬",title:"Discord",actions:{react:{label:"react",detailKeys:["channelId","messageId","emoji"]},reactions:{label:"reactions",detailKeys:["channelId","messageId"]},sticker:{label:"sticker",detailKeys:["to","stickerIds"]},poll:{label:"poll",detailKeys:["question","to"]},permissions:{label:"permissions",detailKeys:["channelId"]},readMessages:{label:"read messages",detailKeys:["channelId","limit"]},sendMessage:{label:"send",detailKeys:["to","content"]},editMessage:{label:"edit",detailKeys:["channelId","messageId"]},deleteMessage:{label:"delete",detailKeys:["channelId","messageId"]},threadCreate:{label:"thread create",detailKeys:["channelId","name"]},threadList:{label:"thread list",detailKeys:["guildId","channelId"]},threadReply:{label:"thread reply",detailKeys:["channelId","content"]},pinMessage:{label:"pin",detailKeys:["channelId","messageId"]},unpinMessage:{label:"unpin",detailKeys:["channelId","messageId"]},listPins:{label:"list pins",detailKeys:["channelId"]},searchMessages:{label:"search",detailKeys:["guildId","content"]},memberInfo:{label:"member",detailKeys:["guildId","userId"]},roleInfo:{label:"roles",detailKeys:["guildId"]},emojiList:{label:"emoji list",detailKeys:["guildId"]},roleAdd:{label:"role add",detailKeys:["guildId","userId","roleId"]},roleRemove:{label:"role remove",detailKeys:["guildId","userId","roleId"]},channelInfo:{label:"channel",detailKeys:["channelId"]},channelList:{label:"channels",detailKeys:["guildId"]},voiceStatus:{label:"voice",detailKeys:["guildId","userId"]},eventList:{label:"events",detailKeys:["guildId"]},eventCreate:{label:"event create",detailKeys:["guildId","name"]},timeout:{label:"timeout",detailKeys:["guildId","userId"]},kick:{label:"kick",detailKeys:["guildId","userId"]},ban:{label:"ban",detailKeys:["guildId","userId"]}}},slack:{emoji:"💬",title:"Slack",actions:{react:{label:"react",detailKeys:["channelId","messageId","emoji"]},reactions:{label:"reactions",detailKeys:["channelId","messageId"]},sendMessage:{label:"send",detailKeys:["to","content"]},editMessage:{label:"edit",detailKeys:["channelId","messageId"]},deleteMessage:{label:"delete",detailKeys:["channelId","messageId"]},readMessages:{label:"read messages",detailKeys:["channelId","limit"]},pinMessage:{label:"pin",detailKeys:["channelId","messageId"]},unpinMessage:{label:"unpin",detailKeys:["channelId","messageId"]},listPins:{label:"list pins",detailKeys:["channelId"]},memberInfo:{label:"member",detailKeys:["userId"]},emojiList:{label:"emoji list"}}}},Ol={fallback:Fl,tools:Nl},$i=Ol,Ns=$i.fallback??{emoji:"🧩"},Dl=$i.tools??{};function Ul(e){return(e??"tool").trim()}function Bl(e){const t=e.replace(/_/g," ").trim();return t?t.split(/\s+/).map(n=>n.length<=2&&n.toUpperCase()===n?n:`${n.at(0)?.toUpperCase()??""}${n.slice(1)}`).join(" "):"Tool"}function Hl(e){const t=e?.trim();if(t)return t.replace(/_/g," ")}function wi(e){if(e!=null){if(typeof e=="string"){const t=e.trim();if(!t)return;const n=t.split(/\r?\n/)[0]?.trim()??"";return n?n.length>160?`${n.slice(0,157)}…`:n:void 0}if(typeof e=="number"||typeof e=="boolean")return String(e);if(Array.isArray(e)){const t=e.map(s=>wi(s)).filter(s=>!!s);if(t.length===0)return;const n=t.slice(0,3).join(", ");return t.length>3?`${n}…`:n}}}function Kl(e,t){if(!e||typeof e!="object")return;let n=e;for(const s of t.split(".")){if(!s||!n||typeof n!="object")return;n=n[s]}return n}function jl(e,t){for(const n of t){const s=Kl(e,n),i=wi(s);if(i)return i}}function zl(e){if(!e||typeof e!="object")return;const t=e,n=typeof t.path=="string"?t.path:void 0;if(!n)return;const s=typeof t.offset=="number"?t.offset:void 0,i=typeof t.limit=="number"?t.limit:void 0;return s!==void 0&&i!==void 0?`${n}:${s}-${s+i}`:n}function ql(e){if(!e||typeof e!="object")return;const t=e;return typeof t.path=="string"?t.path:void 0}function Wl(e,t){if(!(!e||!t))return e.actions?.[t]??void 0}function Gl(e){const t=Ul(e.name),n=t.toLowerCase(),s=Dl[n],i=s?.emoji??Ns.emoji??"🧩",a=s?.title??Bl(t),l=s?.label??t,r=e.args&&typeof e.args=="object"?e.args.action:void 0,o=typeof r=="string"?r.trim():void 0,d=Wl(s,o),u=Hl(d?.label??o);let h;n==="read"&&(h=zl(e.args)),!h&&(n==="write"||n==="edit"||n==="attach")&&(h=ql(e.args));const g=d?.detailKeys??s?.detailKeys??Ns.detailKeys??[];return!h&&g.length>0&&(h=jl(e.args,g)),!h&&e.meta&&(h=e.meta),h&&(h=Jl(h)),{name:t,emoji:i,title:a,label:l,verb:u,detail:h}}function Yl(e){const t=[];if(e.verb&&t.push(e.verb),e.detail&&t.push(e.detail),t.length!==0)return t.join(" · ")}function Jl(e){return e&&e.replace(/\/Users\/[^/]+/g,"~").replace(/\/home\/[^/]+/g,"~")}function Vl(e){const t=e.connected&&!e.sending,n=eo(e.sessionKey,e.sessions),s=e.connected?"Message (⌘↩ to send)":"Connect to the gateway to start chatting…";return p`
|
|
63
|
+
<section class="card chat">
|
|
64
|
+
<div class="chat-header">
|
|
65
|
+
<div class="chat-header__left">
|
|
66
|
+
<label class="field chat-session">
|
|
67
|
+
<span>Session Key</span>
|
|
68
|
+
<select
|
|
69
|
+
.value=${e.sessionKey}
|
|
70
|
+
?disabled=${!e.connected}
|
|
71
|
+
@change=${i=>e.onSessionKeyChange(i.target.value)}
|
|
72
|
+
>
|
|
73
|
+
${n.map(i=>p`<option value=${i.key}>
|
|
74
|
+
${i.displayName??i.key}
|
|
75
|
+
</option>`)}
|
|
76
|
+
</select>
|
|
77
|
+
</label>
|
|
78
|
+
<button
|
|
79
|
+
class="btn"
|
|
80
|
+
?disabled=${e.loading||!e.connected}
|
|
81
|
+
@click=${e.onRefresh}
|
|
82
|
+
>
|
|
83
|
+
${e.loading?"Loading…":"Refresh"}
|
|
84
|
+
</button>
|
|
85
|
+
</div>
|
|
86
|
+
<div class="chat-header__right">
|
|
87
|
+
<div class="muted">Thinking: ${e.thinkingLevel??"inherit"}</div>
|
|
88
|
+
<button
|
|
89
|
+
class="btn ${e.focusMode?"active":""}"
|
|
90
|
+
@click=${e.onToggleFocusMode}
|
|
91
|
+
aria-pressed=${e.focusMode}
|
|
92
|
+
title="Toggle focus mode (hide header + sidebar)"
|
|
93
|
+
>
|
|
94
|
+
Focus
|
|
95
|
+
</button>
|
|
96
|
+
</div>
|
|
97
|
+
</div>
|
|
98
|
+
|
|
99
|
+
${e.disabledReason?p`<div class="callout" style="margin-top: 12px;">
|
|
100
|
+
${e.disabledReason}
|
|
101
|
+
</div>`:f}
|
|
102
|
+
|
|
103
|
+
${e.error?p`<div class="callout danger" style="margin-top: 12px;">${e.error}</div>`:f}
|
|
104
|
+
|
|
105
|
+
<div class="chat-thread" role="log" aria-live="polite">
|
|
106
|
+
${e.loading?p`<div class="muted">Loading chat…</div>`:f}
|
|
107
|
+
${Ea(Zl(e),i=>i.key,i=>i.kind==="reading-indicator"?to():i.kind==="stream"?Ds({role:"assistant",content:[{type:"text",text:i.text}],timestamp:i.startedAt},{streaming:!0}):Ds(i.message))}
|
|
108
|
+
</div>
|
|
109
|
+
|
|
110
|
+
<div class="chat-compose">
|
|
111
|
+
<label class="field chat-compose__field">
|
|
112
|
+
<span>Message</span>
|
|
113
|
+
<textarea
|
|
114
|
+
.value=${e.draft}
|
|
115
|
+
?disabled=${!e.connected}
|
|
116
|
+
@keydown=${i=>{i.key==="Enter"&&(!i.metaKey&&!i.ctrlKey||(i.preventDefault(),t&&e.onSend()))}}
|
|
117
|
+
@input=${i=>e.onDraftChange(i.target.value)}
|
|
118
|
+
placeholder=${s}
|
|
119
|
+
></textarea>
|
|
120
|
+
</label>
|
|
121
|
+
<div class="row chat-compose__actions">
|
|
122
|
+
<button
|
|
123
|
+
class="btn primary"
|
|
124
|
+
?disabled=${!e.connected||e.sending}
|
|
125
|
+
@click=${e.onSend}
|
|
126
|
+
>
|
|
127
|
+
${e.sending?"Sending…":"Send"}
|
|
128
|
+
</button>
|
|
129
|
+
</div>
|
|
130
|
+
</div>
|
|
131
|
+
</section>
|
|
132
|
+
`}function Zl(e){const t=[],n=Array.isArray(e.messages)?e.messages:[],s=Array.isArray(e.toolMessages)?e.toolMessages:[];for(let i=0;i<n.length;i++)t.push({kind:"message",key:Os(n[i],i),message:n[i]});for(let i=0;i<s.length;i++)t.push({kind:"message",key:Os(s[i],i+n.length),message:s[i]});if(e.stream!==null){const i=`stream:${e.sessionKey}:${e.streamStartedAt??"live"}`;e.stream.trim().length>0?t.push({kind:"stream",key:i,text:e.stream,startedAt:e.streamStartedAt??Date.now()}):t.push({kind:"reading-indicator",key:i})}return t}function Os(e,t){const n=e,s=typeof n.toolCallId=="string"?n.toolCallId:"";if(s)return`tool:${s}`;const i=typeof n.id=="string"?n.id:"";if(i)return`msg:${i}`;const a=typeof n.messageId=="string"?n.messageId:"";if(a)return`msg:${a}`;const l=typeof n.timestamp=="number"?n.timestamp:null,r=typeof n.role=="string"?n.role:"unknown",d=Pn(e)??(typeof n.content=="string"?n.content:null)??Ql(e)??String(t),u=Xl(d);return l?`msg:${r}:${l}:${u}`:`msg:${r}:${u}`}function Ql(e){try{return JSON.stringify(e)}catch{return null}}function Xl(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(36)}function eo(e,t){const s=Date.now()-1440*60*1e3,a=[...Array.isArray(t?.sessions)?t?.sessions??[]:[]].sort((g,$)=>($.updatedAt??0)-(g.updatedAt??0)),l=[],r=new Set;for(const g of a)r.has(g.key)||(r.add(g.key),!((g.updatedAt??0)<s)&&l.push(g));const o=[],d=new Set,u="main",h=a.find(g=>g.key===u);h?(o.push(h),d.add(u)):e===u&&(o.push({key:u,updatedAt:null}),d.add(u));for(const g of l)d.has(g.key)||(o.push(g),d.add(g.key));return d.has(e)||o.push({key:e,updatedAt:null}),o}function to(){return p`
|
|
133
|
+
<div class="chat-line assistant">
|
|
134
|
+
<div class="chat-msg">
|
|
135
|
+
<div class="chat-bubble chat-reading-indicator" aria-hidden="true">
|
|
136
|
+
<span class="chat-reading-indicator__dots">
|
|
137
|
+
<span></span><span></span><span></span>
|
|
138
|
+
</span>
|
|
139
|
+
</div>
|
|
140
|
+
</div>
|
|
141
|
+
</div>
|
|
142
|
+
`}function Ds(e,t){const n=e,s=typeof n.role=="string"?n.role:"unknown",i=no(e),a=i.length>0,l=Si(e),r=Pn(e),o=typeof n.content=="string"?n.content:null,d=a?null:JSON.stringify(e,null,2),u=!l&&r?.trim()?{kind:"text",value:r}:!l&&o?.trim()?{kind:"text",value:o}:!l&&d?{kind:"json",value:d}:null,h=u?.kind==="json"?["```json",u.value,"```"].join(`
|
|
143
|
+
`):u?.value??null,g=typeof n.timestamp=="number"?new Date(n.timestamp).toLocaleTimeString():"",$=s==="assistant"?"assistant":s==="user"?"user":"other",y=s==="assistant"?"Assistant":s==="user"?"You":s;return p`
|
|
144
|
+
<div class="chat-line ${$}">
|
|
145
|
+
<div class="chat-msg">
|
|
146
|
+
<div class="chat-bubble ${t?.streaming?"streaming":""}">
|
|
147
|
+
${h?p`<div class="chat-text">${si(ki(h))}</div>`:f}
|
|
148
|
+
${i.map(w=>so(w))}
|
|
149
|
+
</div>
|
|
150
|
+
<div class="chat-stamp mono">
|
|
151
|
+
${y}${g?p` · ${g}`:f}
|
|
152
|
+
</div>
|
|
153
|
+
</div>
|
|
154
|
+
</div>
|
|
155
|
+
`}function Pn(e){const t=e,n=t.content;if(typeof n=="string")return n;if(Array.isArray(n)){const s=n.map(i=>{const a=i;return a.type==="text"&&typeof a.text=="string"?a.text:null}).filter(i=>typeof i=="string");if(s.length>0)return s.join(`
|
|
156
|
+
`)}return typeof t.text=="string"?t.text:null}function no(e){const t=e,n=io(t.content),s=[];for(const i of n){const a=String(i.type??"").toLowerCase();(["toolcall","tool_call","tooluse","tool_use"].includes(a)||typeof i.name=="string"&&i.arguments!=null)&&s.push({kind:"call",name:i.name??"tool",args:ao(i.arguments??i.args)})}for(const i of n){const a=String(i.type??"").toLowerCase();if(a!=="toolresult"&&a!=="tool_result")continue;const l=lo(i),r=typeof i.name=="string"?i.name:"tool";s.push({kind:"result",name:r,text:l})}if(Si(e)&&!s.some(i=>i.kind==="result")){const i=typeof t.toolName=="string"&&t.toolName||typeof t.tool_name=="string"&&t.tool_name||"tool",a=Pn(e)??void 0;s.push({kind:"result",name:i,text:a})}return s}function so(e){const t=Gl({name:e.name,args:e.args}),n=Yl(t);return p`
|
|
157
|
+
<div class="chat-tool-card">
|
|
158
|
+
<div class="chat-tool-card__title">${t.emoji} ${t.label}</div>
|
|
159
|
+
${n?p`<div class="chat-tool-card__detail">${n}</div>`:f}
|
|
160
|
+
${e.text?p`<div class="chat-tool-card__output chat-text">
|
|
161
|
+
${si(ki(e.text))}
|
|
162
|
+
</div>`:f}
|
|
163
|
+
</div>
|
|
164
|
+
`}function io(e){return Array.isArray(e)?e.filter(Boolean):[]}function ao(e){if(typeof e!="string")return e;const t=e.trim();if(!t||!t.startsWith("{")&&!t.startsWith("["))return e;try{return JSON.parse(t)}catch{return e}}function lo(e){if(typeof e.text=="string")return e.text;if(typeof e.content=="string")return e.content}function Si(e){const t=e,n=typeof t.role=="string"?t.role.toLowerCase():"";return n==="toolresult"||n==="tool_result"}function oo(e){if(!e.schema)return p`<div class="muted">Schema unavailable.</div>`;const t=e.schema,n=e.value??{};if(rt(t)!=="object"||!t.properties)return p`<div class="callout danger">Unsupported schema. Use Raw.</div>`;const s=new Set(e.unsupportedPaths??[]),a=Object.entries(t.properties).sort((l,r)=>{const o=fn([l[0]],e.uiHints)?.order??0,d=fn([r[0]],e.uiHints)?.order??0;return o!==d?o-d:l[0].localeCompare(r[0])});return p`
|
|
165
|
+
<div class="config-form">
|
|
166
|
+
${a.map(([l,r])=>Qe({schema:r,value:n[l],path:[l],hints:e.uiHints,unsupported:s,disabled:e.disabled??!1,onPatch:e.onPatch}))}
|
|
167
|
+
</div>
|
|
168
|
+
`}function Qe(e){const{schema:t,value:n,path:s,hints:i,unsupported:a,disabled:l,onPatch:r}=e,o=e.showLabel??!0,d=rt(t),u=fn(s,i),h=u?.label??t.title??ro(String(s.at(-1))),g=u?.help??t.description,$=Nt(s);if(a.has($))return p`<div class="callout danger">
|
|
169
|
+
${h}: unsupported schema node. Use Raw.
|
|
170
|
+
</div>`;if(t.anyOf||t.oneOf){const w=(t.anyOf??t.oneOf??[]).filter(E=>!(E.type==="null"||Array.isArray(E.type)&&E.type.includes("null")));if(w.length===1)return Qe({...e,schema:w[0]});const A=E=>{if(E.const!==void 0)return E.const;if(E.enum&&E.enum.length===1)return E.enum[0]},S=w.map(A);if(S.every(E=>E!==void 0)&&S.length>0){const E=S.findIndex(P=>P===n||String(P)===String(n));return p`
|
|
171
|
+
<label class="field">
|
|
172
|
+
${o?p`<span>${h}</span>`:f}
|
|
173
|
+
${g?p`<div class="muted">${g}</div>`:f}
|
|
174
|
+
<select
|
|
175
|
+
.value=${E>=0?String(E):""}
|
|
176
|
+
?disabled=${l}
|
|
177
|
+
@change=${P=>{const O=P.target.value;r(s,O===""?void 0:S[Number(O)])}}
|
|
178
|
+
>
|
|
179
|
+
<option value="">—</option>
|
|
180
|
+
${S.map((P,O)=>p`<option value=${String(O)}>${String(P)}</option>`)}
|
|
181
|
+
</select>
|
|
182
|
+
</label>
|
|
183
|
+
`}const I=["string","number","integer","boolean"];if(w.every(E=>E.type&&I.includes(String(E.type)))){const E=w.map(j=>j.type).join(" | "),P=w.some(j=>j.type==="boolean"),O=w.some(j=>j.type==="number"||j.type==="integer"),F=w.every(j=>j.type!=="number");return p`
|
|
184
|
+
<label class="field">
|
|
185
|
+
${o?p`<span>${h}</span>`:f}
|
|
186
|
+
${g?p`<div class="muted">${g}</div>`:f}
|
|
187
|
+
<input
|
|
188
|
+
type="text"
|
|
189
|
+
placeholder=${E}
|
|
190
|
+
.value=${n==null?"":String(n)}
|
|
191
|
+
?disabled=${l}
|
|
192
|
+
@input=${j=>{const Y=j.target.value;if(Y===""){r(s,void 0);return}if(P&&(Y==="true"||Y==="false")){r(s,Y==="true");return}if(O&&/^-?\d+(\.\d+)?$/.test(Y)){const D=Number(Y);if(Number.isFinite(D)&&(!F||Number.isInteger(D))){r(s,D);return}}r(s,Y)}}
|
|
193
|
+
/>
|
|
194
|
+
</label>
|
|
195
|
+
`}return p`<div class="callout danger">
|
|
196
|
+
${h}: unsupported schema node. Use Raw.
|
|
197
|
+
</div>`}if(t.allOf)return p`<div class="callout danger">
|
|
198
|
+
${h}: unsupported schema node. Use Raw.
|
|
199
|
+
</div>`;if(d==="object"){const y=t.properties??{},w=Object.entries(y),A=t.additionalProperties&&typeof t.additionalProperties=="object";if(w.length===0&&!A)return f;const S=new Set(w.map(([R])=>R));return p`
|
|
200
|
+
<fieldset class="field-group">
|
|
201
|
+
<legend>${h}</legend>
|
|
202
|
+
${g?p`<div class="muted">${g}</div>`:f}
|
|
203
|
+
${w.map(([R,I])=>Qe({schema:I,value:n&&typeof n=="object"?n[R]:void 0,path:[...s,R],hints:i,unsupported:a,onPatch:r,disabled:l}))}
|
|
204
|
+
${A?uo({schema:t.additionalProperties,value:n&&typeof n=="object"?n:{},path:s,hints:i,unsupported:a,disabled:l,reservedKeys:S,onPatch:r}):f}
|
|
205
|
+
</fieldset>
|
|
206
|
+
`}if(d==="array"){const y=Array.isArray(t.items)?t.items[0]:t.items,w=Array.isArray(n)?n:[];return p`
|
|
207
|
+
<div class="field">
|
|
208
|
+
<div class="row" style="justify-content: space-between;">
|
|
209
|
+
${o?p`<span>${h}</span>`:f}
|
|
210
|
+
<button
|
|
211
|
+
class="btn"
|
|
212
|
+
?disabled=${l}
|
|
213
|
+
@click=${()=>{const A=[...w,xi(y)];r(s,A)}}
|
|
214
|
+
>
|
|
215
|
+
Add
|
|
216
|
+
</button>
|
|
217
|
+
</div>
|
|
218
|
+
${g?p`<div class="muted">${g}</div>`:f}
|
|
219
|
+
${w.map((A,S)=>p`<div class="array-item">
|
|
220
|
+
${y?Qe({schema:y,value:A,path:[...s,S],hints:i,unsupported:a,disabled:l,onPatch:r}):f}
|
|
221
|
+
<button
|
|
222
|
+
class="btn danger"
|
|
223
|
+
?disabled=${l}
|
|
224
|
+
@click=${()=>{const R=w.slice();R.splice(S,1),r(s,R)}}
|
|
225
|
+
>
|
|
226
|
+
Remove
|
|
227
|
+
</button>
|
|
228
|
+
</div>`)}
|
|
229
|
+
</div>
|
|
230
|
+
`}if(t.enum){const y=t.enum,w=y.findIndex(S=>S===n||String(S)===String(n)),A="__unset__";return p`
|
|
231
|
+
<label class="field">
|
|
232
|
+
${o?p`<span>${h}</span>`:f}
|
|
233
|
+
${g?p`<div class="muted">${g}</div>`:f}
|
|
234
|
+
<select
|
|
235
|
+
.value=${w>=0?String(w):A}
|
|
236
|
+
?disabled=${l}
|
|
237
|
+
@change=${S=>{const R=S.target.value;r(s,R===A?void 0:y[Number(R)])}}
|
|
238
|
+
>
|
|
239
|
+
<option value=${A}>—</option>
|
|
240
|
+
${y.map((S,R)=>p`<option value=${String(R)}>${String(S)}</option>`)}
|
|
241
|
+
</select>
|
|
242
|
+
</label>
|
|
243
|
+
`}if(d==="boolean")return p`
|
|
244
|
+
<label class="field">
|
|
245
|
+
${o?p`<span>${h}</span>`:f}
|
|
246
|
+
${g?p`<div class="muted">${g}</div>`:f}
|
|
247
|
+
<input
|
|
248
|
+
type="checkbox"
|
|
249
|
+
.checked=${!!n}
|
|
250
|
+
?disabled=${l}
|
|
251
|
+
@change=${y=>r(s,y.target.checked)}
|
|
252
|
+
/>
|
|
253
|
+
</label>
|
|
254
|
+
`;if(d==="number"||d==="integer")return p`
|
|
255
|
+
<label class="field">
|
|
256
|
+
${o?p`<span>${h}</span>`:f}
|
|
257
|
+
${g?p`<div class="muted">${g}</div>`:f}
|
|
258
|
+
<input
|
|
259
|
+
type="number"
|
|
260
|
+
.value=${n==null?"":String(n)}
|
|
261
|
+
?disabled=${l}
|
|
262
|
+
@input=${y=>{const w=y.target.value,A=w===""?void 0:Number(w);r(s,A)}}
|
|
263
|
+
/>
|
|
264
|
+
</label>
|
|
265
|
+
`;if(d==="string"){const y=u?.sensitive??co(s),w=u?.placeholder??(y?"••••":"");return p`
|
|
266
|
+
<label class="field">
|
|
267
|
+
${o?p`<span>${h}</span>`:f}
|
|
268
|
+
${g?p`<div class="muted">${g}</div>`:f}
|
|
269
|
+
<input
|
|
270
|
+
type=${y?"password":"text"}
|
|
271
|
+
placeholder=${w}
|
|
272
|
+
.value=${n==null?"":String(n)}
|
|
273
|
+
?disabled=${l}
|
|
274
|
+
@input=${A=>r(s,A.target.value)}
|
|
275
|
+
/>
|
|
276
|
+
</label>
|
|
277
|
+
`}return p`<div class="field">
|
|
278
|
+
${o?p`<span>${h}</span>`:f}
|
|
279
|
+
<div class="muted">Unsupported type. Use Raw.</div>
|
|
280
|
+
</div>`}function rt(e){if(e)return Array.isArray(e.type)?e.type.filter(n=>n!=="null")[0]??e.type[0]:e.type}function xi(e){if(!e)return"";if(e.default!==void 0)return e.default;switch(rt(e)){case"object":return{};case"array":return[];case"boolean":return!1;case"number":case"integer":return 0;case"string":return"";default:return""}}function fn(e,t){const n=Nt(e);return t[n]}function Nt(e){return e.filter(t=>typeof t=="string").join(".")}function ro(e){return e.replace(/_/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/\s+/g," ").replace(/^./,t=>t.toUpperCase())}function co(e){const t=Nt(e).toLowerCase();return t.includes("token")||t.includes("password")||t.includes("secret")||t.includes("apikey")||t.endsWith("key")}function uo(e){const{schema:t,value:n,path:s,hints:i,unsupported:a,disabled:l,reservedKeys:r,onPatch:o}=e,d=Object.entries(n??{}).filter(([u])=>!r.has(u));return p`
|
|
281
|
+
<div class="field" style="margin-top: 12px;">
|
|
282
|
+
<div class="row" style="justify-content: space-between;">
|
|
283
|
+
<span class="muted">Extra entries</span>
|
|
284
|
+
<button
|
|
285
|
+
class="btn"
|
|
286
|
+
?disabled=${l}
|
|
287
|
+
@click=${()=>{const u={...n??{}};let h=1,g=`new-${h}`;for(;g in u;)h+=1,g=`new-${h}`;u[g]=xi(t),o(s,u)}}
|
|
288
|
+
>
|
|
289
|
+
Add
|
|
290
|
+
</button>
|
|
291
|
+
</div>
|
|
292
|
+
${d.length===0?p`<div class="muted">No entries yet.</div>`:d.map(([u,h])=>{const g=[...s,u];return p`<div class="array-item" style="gap: 8px;">
|
|
293
|
+
<input
|
|
294
|
+
class="mono"
|
|
295
|
+
style="min-width: 140px;"
|
|
296
|
+
?disabled=${l}
|
|
297
|
+
.value=${u}
|
|
298
|
+
@change=${$=>{const y=$.target.value.trim();if(!y||y===u)return;const w={...n??{}};y in w||(w[y]=w[u],delete w[u],o(s,w))}}
|
|
299
|
+
/>
|
|
300
|
+
<div style="flex: 1;">
|
|
301
|
+
${Qe({schema:t,value:h,path:g,hints:i,unsupported:a,disabled:l,showLabel:!1,onPatch:o})}
|
|
302
|
+
</div>
|
|
303
|
+
<button
|
|
304
|
+
class="btn danger"
|
|
305
|
+
?disabled=${l}
|
|
306
|
+
@click=${()=>{const $={...n??{}};delete $[u],o(s,$)}}
|
|
307
|
+
>
|
|
308
|
+
Remove
|
|
309
|
+
</button>
|
|
310
|
+
</div>`})}
|
|
311
|
+
</div>
|
|
312
|
+
`}function ho(e){return!e||typeof e!="object"?{schema:null,unsupportedPaths:["<root>"]}:Xe(e,[])}function Xe(e,t){const n=[],s={...e},i=Nt(t)||"<root>";if(e.anyOf||e.oneOf||e.allOf){const r=po(e,t);return r||(n.push(i),{schema:e,unsupportedPaths:n})}const a=Array.isArray(e.type)&&e.type.includes("null"),l=rt(e)??(e.properties||e.additionalProperties?"object":void 0);if(s.type=l??e.type,s.nullable=a||e.nullable,s.enum){const{enumValues:r,nullable:o}=Ai(s.enum);s.enum=r,o&&(s.nullable=!0),r.length===0&&n.push(i)}if(l==="object"){const r=e.properties??{},o={};for(const[d,u]of Object.entries(r)){const h=Xe(u,[...t,d]);h.schema&&(o[d]=h.schema),n.push(...h.unsupportedPaths)}if(s.properties=o,e.additionalProperties===!0)n.push(i);else if(e.additionalProperties===!1)s.additionalProperties=!1;else if(e.additionalProperties){const d=Xe(e.additionalProperties,[...t,"*"]);s.additionalProperties=d.schema??e.additionalProperties,d.unsupportedPaths.length>0&&n.push(i)}}else if(l==="array"){const r=Array.isArray(e.items)?e.items[0]:e.items;if(!r)n.push(i);else{const o=Xe(r,[...t,"*"]);s.items=o.schema??r,o.unsupportedPaths.length>0&&n.push(i)}}else l==="string"||l==="number"||l==="integer"||l==="boolean"||s.enum||n.push(i);return{schema:s,unsupportedPaths:Array.from(new Set(n))}}function po(e,t){if(e.allOf)return null;const n=e.anyOf??e.oneOf;if(!n)return null;const s=[],i=[];let a=!1;for(const o of n){if(!o||typeof o!="object")return null;if(Array.isArray(o.enum)){const{enumValues:d,nullable:u}=Ai(o.enum);s.push(...d),u&&(a=!0);continue}if("const"in o){if(o.const===null||o.const===void 0){a=!0;continue}s.push(o.const);continue}if(rt(o)==="null"){a=!0;continue}i.push(o)}if(s.length>0&&i.length===0){const o=[];for(const d of s)o.some(u=>Object.is(u,d))||o.push(d);return{schema:{...e,enum:o,nullable:a,anyOf:void 0,oneOf:void 0,allOf:void 0},unsupportedPaths:[]}}if(i.length===1){const o=Xe(i[0],t);return o.schema&&(o.schema.nullable=a||o.schema.nullable),o}const l=["string","number","integer","boolean"];return i.every(o=>o.type&&l.includes(String(o.type)))&&i.length>0&&s.length===0?{schema:{...e,nullable:a},unsupportedPaths:[]}:null}function Ai(e){const t=e.filter(i=>i!=null),n=t.length!==e.length,s=[];for(const i of t)s.some(a=>Object.is(a,i))||s.push(i);return{enumValues:s,nullable:n}}function go(e){const t=e.valid==null?"unknown":e.valid?"valid":"invalid",n=ho(e.schema),s=n.schema?n.unsupportedPaths.length>0:!1,i=!!e.formValue&&!e.loading&&!s,a=e.connected&&!e.saving&&(e.formMode==="raw"?!0:i);return p`
|
|
313
|
+
<section class="card">
|
|
314
|
+
<div class="row" style="justify-content: space-between;">
|
|
315
|
+
<div class="row">
|
|
316
|
+
<div class="card-title">Config</div>
|
|
317
|
+
<span class="pill">${t}</span>
|
|
318
|
+
</div>
|
|
319
|
+
<div class="row">
|
|
320
|
+
<div class="toggle-group">
|
|
321
|
+
<button
|
|
322
|
+
class="btn ${e.formMode==="form"?"primary":""}"
|
|
323
|
+
?disabled=${e.schemaLoading||!e.schema}
|
|
324
|
+
@click=${()=>e.onFormModeChange("form")}
|
|
325
|
+
>
|
|
326
|
+
Form
|
|
327
|
+
</button>
|
|
328
|
+
<button
|
|
329
|
+
class="btn ${e.formMode==="raw"?"primary":""}"
|
|
330
|
+
@click=${()=>e.onFormModeChange("raw")}
|
|
331
|
+
>
|
|
332
|
+
Raw
|
|
333
|
+
</button>
|
|
334
|
+
</div>
|
|
335
|
+
<button class="btn" ?disabled=${e.loading} @click=${e.onReload}>
|
|
336
|
+
${e.loading?"Loading…":"Reload"}
|
|
337
|
+
</button>
|
|
338
|
+
<button
|
|
339
|
+
class="btn primary"
|
|
340
|
+
?disabled=${!a}
|
|
341
|
+
@click=${e.onSave}
|
|
342
|
+
>
|
|
343
|
+
${e.saving?"Saving…":"Save"}
|
|
344
|
+
</button>
|
|
345
|
+
</div>
|
|
346
|
+
</div>
|
|
347
|
+
|
|
348
|
+
<div class="muted" style="margin-top: 10px;">
|
|
349
|
+
Writes to <span class="mono">~/nexus/state/nexus.json</span>. Some changes
|
|
350
|
+
require a gateway restart.
|
|
351
|
+
</div>
|
|
352
|
+
|
|
353
|
+
${e.formMode==="form"?p`<div style="margin-top: 12px;">
|
|
354
|
+
${e.schemaLoading?p`<div class="muted">Loading schema…</div>`:oo({schema:n.schema,uiHints:e.uiHints,value:e.formValue,disabled:e.loading||!e.formValue,unsupportedPaths:n.unsupportedPaths,onPatch:e.onFormPatch})}
|
|
355
|
+
${s?p`<div class="callout danger" style="margin-top: 12px;">
|
|
356
|
+
Form view can’t safely edit some fields.
|
|
357
|
+
Use Raw to avoid losing config entries.
|
|
358
|
+
</div>`:f}
|
|
359
|
+
</div>`:p`<label class="field" style="margin-top: 12px;">
|
|
360
|
+
<span>Raw JSON5</span>
|
|
361
|
+
<textarea
|
|
362
|
+
.value=${e.raw}
|
|
363
|
+
@input=${l=>e.onRawChange(l.target.value)}
|
|
364
|
+
></textarea>
|
|
365
|
+
</label>`}
|
|
366
|
+
|
|
367
|
+
${e.issues.length>0?p`<div class="callout danger" style="margin-top: 12px;">
|
|
368
|
+
<pre class="code-block">${JSON.stringify(e.issues,null,2)}</pre>
|
|
369
|
+
</div>`:f}
|
|
370
|
+
</section>
|
|
371
|
+
`}function at(e){return!e&&e!==0?"n/a":new Date(e).toLocaleString()}function W(e){if(!e&&e!==0)return"n/a";const t=Date.now()-e;if(t<0)return"just now";const n=Math.round(t/1e3);if(n<60)return`${n}s ago`;const s=Math.round(n/60);if(s<60)return`${s}m ago`;const i=Math.round(s/60);return i<48?`${i}h ago`:`${Math.round(i/24)}d ago`}function Ti(e){if(!e&&e!==0)return"n/a";if(e<1e3)return`${e}ms`;const t=Math.round(e/1e3);if(t<60)return`${t}s`;const n=Math.round(t/60);if(n<60)return`${n}m`;const s=Math.round(n/60);return s<48?`${s}h`:`${Math.round(s/24)}d`}function fo(e,t=120){return e.length<=t?e:`${e.slice(0,Math.max(0,t-1))}…`}function Mt(e,t){const n=Number(e);return Number.isFinite(n)?n:t}function pe(e){return e.split(/[,\n]/).map(t=>t.trim()).filter(t=>t.length>0)}const mo=[{key:"reactions",label:"Reactions"},{key:"stickers",label:"Stickers"},{key:"polls",label:"Polls"},{key:"permissions",label:"Permissions"},{key:"messages",label:"Messages"},{key:"threads",label:"Threads"},{key:"pins",label:"Pins"},{key:"search",label:"Search"},{key:"memberInfo",label:"Member info"},{key:"roleInfo",label:"Role info"},{key:"channelInfo",label:"Channel info"},{key:"voiceStatus",label:"Voice status"},{key:"events",label:"Events"},{key:"roles",label:"Role changes"},{key:"moderation",label:"Moderation"}],bo=[{key:"reactions",label:"Reactions"},{key:"messages",label:"Messages"},{key:"pins",label:"Pins"},{key:"memberInfo",label:"Member info"},{key:"emojiList",label:"Emoji list"}];function vo(e){const t=e.snapshot?.whatsapp,n=e.snapshot?.telegram,s=e.snapshot?.discord??null,i=e.snapshot?.slack??null,a=e.snapshot?.signal??null,l=e.snapshot?.imessage??null,o=["whatsapp","telegram","discord","slack","signal","imessage"].map((d,u)=>({key:d,enabled:ko(d,e),order:u})).sort((d,u)=>d.enabled!==u.enabled?d.enabled?-1:1:d.order-u.order);return p`
|
|
372
|
+
<section class="grid grid-cols-2">
|
|
373
|
+
${o.map(d=>$o(d.key,e,{whatsapp:t,telegram:n,discord:s,slack:i,signal:a,imessage:l}))}
|
|
374
|
+
</section>
|
|
375
|
+
|
|
376
|
+
<section class="card" style="margin-top: 18px;">
|
|
377
|
+
<div class="row" style="justify-content: space-between;">
|
|
378
|
+
<div>
|
|
379
|
+
<div class="card-title">Connection health</div>
|
|
380
|
+
<div class="card-sub">Provider status snapshots from the gateway.</div>
|
|
381
|
+
</div>
|
|
382
|
+
<div class="muted">${e.lastSuccessAt?W(e.lastSuccessAt):"n/a"}</div>
|
|
383
|
+
</div>
|
|
384
|
+
${e.lastError?p`<div class="callout danger" style="margin-top: 12px;">
|
|
385
|
+
${e.lastError}
|
|
386
|
+
</div>`:f}
|
|
387
|
+
<pre class="code-block" style="margin-top: 12px;">
|
|
388
|
+
${e.snapshot?JSON.stringify(e.snapshot,null,2):"No snapshot yet."}
|
|
389
|
+
</pre>
|
|
390
|
+
</section>
|
|
391
|
+
`}function yo(e){if(!e&&e!==0)return"n/a";const t=Math.round(e/1e3);if(t<60)return`${t}s`;const n=Math.round(t/60);return n<60?`${n}m`:`${Math.round(n/60)}h`}function ko(e,t){const n=t.snapshot;if(!n)return!1;switch(e){case"whatsapp":return n.whatsapp.configured||n.whatsapp.linked||n.whatsapp.running;case"telegram":return n.telegram.configured||n.telegram.running;case"discord":return!!(n.discord?.configured||n.discord?.running);case"slack":return!!(n.slack?.configured||n.slack?.running);case"signal":return!!(n.signal?.configured||n.signal?.running);case"imessage":return!!(n.imessage?.configured||n.imessage?.running);default:return!1}}function $o(e,t,n){switch(e){case"whatsapp":{const s=n.whatsapp;return p`
|
|
392
|
+
<div class="card">
|
|
393
|
+
<div class="card-title">WhatsApp</div>
|
|
394
|
+
<div class="card-sub">Link WhatsApp Web and monitor connection health.</div>
|
|
395
|
+
|
|
396
|
+
<div class="status-list" style="margin-top: 16px;">
|
|
397
|
+
<div>
|
|
398
|
+
<span class="label">Configured</span>
|
|
399
|
+
<span>${s?.configured?"Yes":"No"}</span>
|
|
400
|
+
</div>
|
|
401
|
+
<div>
|
|
402
|
+
<span class="label">Linked</span>
|
|
403
|
+
<span>${s?.linked?"Yes":"No"}</span>
|
|
404
|
+
</div>
|
|
405
|
+
<div>
|
|
406
|
+
<span class="label">Running</span>
|
|
407
|
+
<span>${s?.running?"Yes":"No"}</span>
|
|
408
|
+
</div>
|
|
409
|
+
<div>
|
|
410
|
+
<span class="label">Connected</span>
|
|
411
|
+
<span>${s?.connected?"Yes":"No"}</span>
|
|
412
|
+
</div>
|
|
413
|
+
<div>
|
|
414
|
+
<span class="label">Last connect</span>
|
|
415
|
+
<span>
|
|
416
|
+
${s?.lastConnectedAt?W(s.lastConnectedAt):"n/a"}
|
|
417
|
+
</span>
|
|
418
|
+
</div>
|
|
419
|
+
<div>
|
|
420
|
+
<span class="label">Last message</span>
|
|
421
|
+
<span>
|
|
422
|
+
${s?.lastMessageAt?W(s.lastMessageAt):"n/a"}
|
|
423
|
+
</span>
|
|
424
|
+
</div>
|
|
425
|
+
<div>
|
|
426
|
+
<span class="label">Auth age</span>
|
|
427
|
+
<span>
|
|
428
|
+
${s?.authAgeMs!=null?yo(s.authAgeMs):"n/a"}
|
|
429
|
+
</span>
|
|
430
|
+
</div>
|
|
431
|
+
</div>
|
|
432
|
+
|
|
433
|
+
${s?.lastError?p`<div class="callout danger" style="margin-top: 12px;">
|
|
434
|
+
${s.lastError}
|
|
435
|
+
</div>`:f}
|
|
436
|
+
|
|
437
|
+
${t.whatsappMessage?p`<div class="callout" style="margin-top: 12px;">
|
|
438
|
+
${t.whatsappMessage}
|
|
439
|
+
</div>`:f}
|
|
440
|
+
|
|
441
|
+
${t.whatsappQrDataUrl?p`<div class="qr-wrap">
|
|
442
|
+
<img src=${t.whatsappQrDataUrl} alt="WhatsApp QR" />
|
|
443
|
+
</div>`:f}
|
|
444
|
+
|
|
445
|
+
<div class="row" style="margin-top: 14px; flex-wrap: wrap;">
|
|
446
|
+
<button
|
|
447
|
+
class="btn primary"
|
|
448
|
+
?disabled=${t.whatsappBusy}
|
|
449
|
+
@click=${()=>t.onWhatsAppStart(!1)}
|
|
450
|
+
>
|
|
451
|
+
${t.whatsappBusy?"Working…":"Show QR"}
|
|
452
|
+
</button>
|
|
453
|
+
<button
|
|
454
|
+
class="btn"
|
|
455
|
+
?disabled=${t.whatsappBusy}
|
|
456
|
+
@click=${()=>t.onWhatsAppStart(!0)}
|
|
457
|
+
>
|
|
458
|
+
Relink
|
|
459
|
+
</button>
|
|
460
|
+
<button
|
|
461
|
+
class="btn"
|
|
462
|
+
?disabled=${t.whatsappBusy}
|
|
463
|
+
@click=${()=>t.onWhatsAppWait()}
|
|
464
|
+
>
|
|
465
|
+
Wait for scan
|
|
466
|
+
</button>
|
|
467
|
+
<button
|
|
468
|
+
class="btn danger"
|
|
469
|
+
?disabled=${t.whatsappBusy}
|
|
470
|
+
@click=${()=>t.onWhatsAppLogout()}
|
|
471
|
+
>
|
|
472
|
+
Logout
|
|
473
|
+
</button>
|
|
474
|
+
<button class="btn" @click=${()=>t.onRefresh(!0)}>
|
|
475
|
+
Refresh
|
|
476
|
+
</button>
|
|
477
|
+
</div>
|
|
478
|
+
</div>
|
|
479
|
+
`}case"telegram":{const s=n.telegram;return p`
|
|
480
|
+
<div class="card">
|
|
481
|
+
<div class="card-title">Telegram</div>
|
|
482
|
+
<div class="card-sub">Bot token and delivery options.</div>
|
|
483
|
+
|
|
484
|
+
<div class="status-list" style="margin-top: 16px;">
|
|
485
|
+
<div>
|
|
486
|
+
<span class="label">Configured</span>
|
|
487
|
+
<span>${s?.configured?"Yes":"No"}</span>
|
|
488
|
+
</div>
|
|
489
|
+
<div>
|
|
490
|
+
<span class="label">Running</span>
|
|
491
|
+
<span>${s?.running?"Yes":"No"}</span>
|
|
492
|
+
</div>
|
|
493
|
+
<div>
|
|
494
|
+
<span class="label">Mode</span>
|
|
495
|
+
<span>${s?.mode??"n/a"}</span>
|
|
496
|
+
</div>
|
|
497
|
+
<div>
|
|
498
|
+
<span class="label">Last start</span>
|
|
499
|
+
<span>${s?.lastStartAt?W(s.lastStartAt):"n/a"}</span>
|
|
500
|
+
</div>
|
|
501
|
+
<div>
|
|
502
|
+
<span class="label">Last probe</span>
|
|
503
|
+
<span>${s?.lastProbeAt?W(s.lastProbeAt):"n/a"}</span>
|
|
504
|
+
</div>
|
|
505
|
+
</div>
|
|
506
|
+
|
|
507
|
+
${s?.lastError?p`<div class="callout danger" style="margin-top: 12px;">
|
|
508
|
+
${s.lastError}
|
|
509
|
+
</div>`:f}
|
|
510
|
+
|
|
511
|
+
${s?.probe?p`<div class="callout" style="margin-top: 12px;">
|
|
512
|
+
Probe ${s.probe.ok?"ok":"failed"} ·
|
|
513
|
+
${s.probe.status??""}
|
|
514
|
+
${s.probe.error??""}
|
|
515
|
+
</div>`:f}
|
|
516
|
+
|
|
517
|
+
<div class="form-grid" style="margin-top: 16px;">
|
|
518
|
+
<label class="field">
|
|
519
|
+
<span>Bot token</span>
|
|
520
|
+
<input
|
|
521
|
+
type="password"
|
|
522
|
+
.value=${t.telegramForm.token}
|
|
523
|
+
?disabled=${t.telegramTokenLocked}
|
|
524
|
+
@input=${i=>t.onTelegramChange({token:i.target.value})}
|
|
525
|
+
/>
|
|
526
|
+
</label>
|
|
527
|
+
<label class="field">
|
|
528
|
+
<span>Require mention in groups</span>
|
|
529
|
+
<select
|
|
530
|
+
.value=${t.telegramForm.requireMention?"yes":"no"}
|
|
531
|
+
@change=${i=>t.onTelegramChange({requireMention:i.target.value==="yes"})}
|
|
532
|
+
>
|
|
533
|
+
<option value="yes">Yes</option>
|
|
534
|
+
<option value="no">No</option>
|
|
535
|
+
</select>
|
|
536
|
+
</label>
|
|
537
|
+
<label class="field">
|
|
538
|
+
<span>Allow from</span>
|
|
539
|
+
<input
|
|
540
|
+
.value=${t.telegramForm.allowFrom}
|
|
541
|
+
@input=${i=>t.onTelegramChange({allowFrom:i.target.value})}
|
|
542
|
+
placeholder="123456789, @team"
|
|
543
|
+
/>
|
|
544
|
+
</label>
|
|
545
|
+
<label class="field">
|
|
546
|
+
<span>Proxy</span>
|
|
547
|
+
<input
|
|
548
|
+
.value=${t.telegramForm.proxy}
|
|
549
|
+
@input=${i=>t.onTelegramChange({proxy:i.target.value})}
|
|
550
|
+
placeholder="socks5://localhost:9050"
|
|
551
|
+
/>
|
|
552
|
+
</label>
|
|
553
|
+
<label class="field">
|
|
554
|
+
<span>Webhook URL</span>
|
|
555
|
+
<input
|
|
556
|
+
.value=${t.telegramForm.webhookUrl}
|
|
557
|
+
@input=${i=>t.onTelegramChange({webhookUrl:i.target.value})}
|
|
558
|
+
placeholder="https://example.com/telegram-webhook"
|
|
559
|
+
/>
|
|
560
|
+
</label>
|
|
561
|
+
<label class="field">
|
|
562
|
+
<span>Webhook secret</span>
|
|
563
|
+
<input
|
|
564
|
+
.value=${t.telegramForm.webhookSecret}
|
|
565
|
+
@input=${i=>t.onTelegramChange({webhookSecret:i.target.value})}
|
|
566
|
+
placeholder="secret"
|
|
567
|
+
/>
|
|
568
|
+
</label>
|
|
569
|
+
<label class="field">
|
|
570
|
+
<span>Webhook path</span>
|
|
571
|
+
<input
|
|
572
|
+
.value=${t.telegramForm.webhookPath}
|
|
573
|
+
@input=${i=>t.onTelegramChange({webhookPath:i.target.value})}
|
|
574
|
+
placeholder="/telegram-webhook"
|
|
575
|
+
/>
|
|
576
|
+
</label>
|
|
577
|
+
</div>
|
|
578
|
+
|
|
579
|
+
${t.telegramTokenLocked?p`<div class="callout" style="margin-top: 12px;">
|
|
580
|
+
TELEGRAM_BOT_TOKEN is set in the environment. Config edits will not override it.
|
|
581
|
+
</div>`:f}
|
|
582
|
+
|
|
583
|
+
${t.telegramStatus?p`<div class="callout" style="margin-top: 12px;">
|
|
584
|
+
${t.telegramStatus}
|
|
585
|
+
</div>`:f}
|
|
586
|
+
|
|
587
|
+
<div class="row" style="margin-top: 14px;">
|
|
588
|
+
<button
|
|
589
|
+
class="btn primary"
|
|
590
|
+
?disabled=${t.telegramSaving}
|
|
591
|
+
@click=${()=>t.onTelegramSave()}
|
|
592
|
+
>
|
|
593
|
+
${t.telegramSaving?"Saving…":"Save"}
|
|
594
|
+
</button>
|
|
595
|
+
<button class="btn" @click=${()=>t.onRefresh(!0)}>
|
|
596
|
+
Probe
|
|
597
|
+
</button>
|
|
598
|
+
</div>
|
|
599
|
+
</div>
|
|
600
|
+
`}case"discord":{const s=n.discord,i=s?.probe?.bot?.username;return p`
|
|
601
|
+
<div class="card">
|
|
602
|
+
<div class="card-title">Discord</div>
|
|
603
|
+
<div class="card-sub">Bot connection and probe status.</div>
|
|
604
|
+
|
|
605
|
+
<div class="status-list" style="margin-top: 16px;">
|
|
606
|
+
<div>
|
|
607
|
+
<span class="label">Configured</span>
|
|
608
|
+
<span>${s?.configured?"Yes":"No"}</span>
|
|
609
|
+
</div>
|
|
610
|
+
<div>
|
|
611
|
+
<span class="label">Running</span>
|
|
612
|
+
<span>${s?.running?"Yes":"No"}</span>
|
|
613
|
+
</div>
|
|
614
|
+
<div>
|
|
615
|
+
<span class="label">Bot</span>
|
|
616
|
+
<span>${i?`@${i}`:"n/a"}</span>
|
|
617
|
+
</div>
|
|
618
|
+
<div>
|
|
619
|
+
<span class="label">Last start</span>
|
|
620
|
+
<span>${s?.lastStartAt?W(s.lastStartAt):"n/a"}</span>
|
|
621
|
+
</div>
|
|
622
|
+
<div>
|
|
623
|
+
<span class="label">Last probe</span>
|
|
624
|
+
<span>${s?.lastProbeAt?W(s.lastProbeAt):"n/a"}</span>
|
|
625
|
+
</div>
|
|
626
|
+
</div>
|
|
627
|
+
|
|
628
|
+
${s?.lastError?p`<div class="callout danger" style="margin-top: 12px;">
|
|
629
|
+
${s.lastError}
|
|
630
|
+
</div>`:f}
|
|
631
|
+
|
|
632
|
+
${s?.probe?p`<div class="callout" style="margin-top: 12px;">
|
|
633
|
+
Probe ${s.probe.ok?"ok":"failed"} ·
|
|
634
|
+
${s.probe.status??""}
|
|
635
|
+
${s.probe.error??""}
|
|
636
|
+
</div>`:f}
|
|
637
|
+
|
|
638
|
+
<div class="form-grid" style="margin-top: 16px;">
|
|
639
|
+
<label class="field">
|
|
640
|
+
<span>Enabled</span>
|
|
641
|
+
<select
|
|
642
|
+
.value=${t.discordForm.enabled?"yes":"no"}
|
|
643
|
+
@change=${a=>t.onDiscordChange({enabled:a.target.value==="yes"})}
|
|
644
|
+
>
|
|
645
|
+
<option value="yes">Yes</option>
|
|
646
|
+
<option value="no">No</option>
|
|
647
|
+
</select>
|
|
648
|
+
</label>
|
|
649
|
+
<label class="field">
|
|
650
|
+
<span>Bot token</span>
|
|
651
|
+
<input
|
|
652
|
+
type="password"
|
|
653
|
+
.value=${t.discordForm.token}
|
|
654
|
+
?disabled=${t.discordTokenLocked}
|
|
655
|
+
@input=${a=>t.onDiscordChange({token:a.target.value})}
|
|
656
|
+
/>
|
|
657
|
+
</label>
|
|
658
|
+
<label class="field">
|
|
659
|
+
<span>Allow DMs from</span>
|
|
660
|
+
<input
|
|
661
|
+
.value=${t.discordForm.allowFrom}
|
|
662
|
+
@input=${a=>t.onDiscordChange({allowFrom:a.target.value})}
|
|
663
|
+
placeholder="123456789, username#1234"
|
|
664
|
+
/>
|
|
665
|
+
</label>
|
|
666
|
+
<label class="field">
|
|
667
|
+
<span>DMs enabled</span>
|
|
668
|
+
<select
|
|
669
|
+
.value=${t.discordForm.dmEnabled?"yes":"no"}
|
|
670
|
+
@change=${a=>t.onDiscordChange({dmEnabled:a.target.value==="yes"})}
|
|
671
|
+
>
|
|
672
|
+
<option value="yes">Enabled</option>
|
|
673
|
+
<option value="no">Disabled</option>
|
|
674
|
+
</select>
|
|
675
|
+
</label>
|
|
676
|
+
<label class="field">
|
|
677
|
+
<span>Group DMs</span>
|
|
678
|
+
<select
|
|
679
|
+
.value=${t.discordForm.groupEnabled?"yes":"no"}
|
|
680
|
+
@change=${a=>t.onDiscordChange({groupEnabled:a.target.value==="yes"})}
|
|
681
|
+
>
|
|
682
|
+
<option value="yes">Enabled</option>
|
|
683
|
+
<option value="no">Disabled</option>
|
|
684
|
+
</select>
|
|
685
|
+
</label>
|
|
686
|
+
<label class="field">
|
|
687
|
+
<span>Group channels</span>
|
|
688
|
+
<input
|
|
689
|
+
.value=${t.discordForm.groupChannels}
|
|
690
|
+
@input=${a=>t.onDiscordChange({groupChannels:a.target.value})}
|
|
691
|
+
placeholder="channelId1, channelId2"
|
|
692
|
+
/>
|
|
693
|
+
</label>
|
|
694
|
+
<label class="field">
|
|
695
|
+
<span>Media max MB</span>
|
|
696
|
+
<input
|
|
697
|
+
.value=${t.discordForm.mediaMaxMb}
|
|
698
|
+
@input=${a=>t.onDiscordChange({mediaMaxMb:a.target.value})}
|
|
699
|
+
placeholder="8"
|
|
700
|
+
/>
|
|
701
|
+
</label>
|
|
702
|
+
<label class="field">
|
|
703
|
+
<span>History limit</span>
|
|
704
|
+
<input
|
|
705
|
+
.value=${t.discordForm.historyLimit}
|
|
706
|
+
@input=${a=>t.onDiscordChange({historyLimit:a.target.value})}
|
|
707
|
+
placeholder="20"
|
|
708
|
+
/>
|
|
709
|
+
</label>
|
|
710
|
+
<label class="field">
|
|
711
|
+
<span>Text chunk limit</span>
|
|
712
|
+
<input
|
|
713
|
+
.value=${t.discordForm.textChunkLimit}
|
|
714
|
+
@input=${a=>t.onDiscordChange({textChunkLimit:a.target.value})}
|
|
715
|
+
placeholder="2000"
|
|
716
|
+
/>
|
|
717
|
+
</label>
|
|
718
|
+
<label class="field">
|
|
719
|
+
<span>Reply to mode</span>
|
|
720
|
+
<select
|
|
721
|
+
.value=${t.discordForm.replyToMode}
|
|
722
|
+
@change=${a=>t.onDiscordChange({replyToMode:a.target.value})}
|
|
723
|
+
>
|
|
724
|
+
<option value="off">Off</option>
|
|
725
|
+
<option value="first">First</option>
|
|
726
|
+
<option value="all">All</option>
|
|
727
|
+
</select>
|
|
728
|
+
</label>
|
|
729
|
+
<div class="field full">
|
|
730
|
+
<span>Guilds</span>
|
|
731
|
+
<div class="card-sub">
|
|
732
|
+
Add each guild (id or slug) and optional channel rules. Empty channel
|
|
733
|
+
entries still allow that channel.
|
|
734
|
+
</div>
|
|
735
|
+
<div class="list">
|
|
736
|
+
${t.discordForm.guilds.map((a,l)=>p`
|
|
737
|
+
<div class="list-item">
|
|
738
|
+
<div class="list-main">
|
|
739
|
+
<div class="form-grid">
|
|
740
|
+
<label class="field">
|
|
741
|
+
<span>Guild id / slug</span>
|
|
742
|
+
<input
|
|
743
|
+
.value=${a.key}
|
|
744
|
+
@input=${r=>{const o=[...t.discordForm.guilds];o[l]={...o[l],key:r.target.value},t.onDiscordChange({guilds:o})}}
|
|
745
|
+
/>
|
|
746
|
+
</label>
|
|
747
|
+
<label class="field">
|
|
748
|
+
<span>Slug</span>
|
|
749
|
+
<input
|
|
750
|
+
.value=${a.slug}
|
|
751
|
+
@input=${r=>{const o=[...t.discordForm.guilds];o[l]={...o[l],slug:r.target.value},t.onDiscordChange({guilds:o})}}
|
|
752
|
+
/>
|
|
753
|
+
</label>
|
|
754
|
+
<label class="field">
|
|
755
|
+
<span>Require mention</span>
|
|
756
|
+
<select
|
|
757
|
+
.value=${a.requireMention?"yes":"no"}
|
|
758
|
+
@change=${r=>{const o=[...t.discordForm.guilds];o[l]={...o[l],requireMention:r.target.value==="yes"},t.onDiscordChange({guilds:o})}}
|
|
759
|
+
>
|
|
760
|
+
<option value="yes">Yes</option>
|
|
761
|
+
<option value="no">No</option>
|
|
762
|
+
</select>
|
|
763
|
+
</label>
|
|
764
|
+
<label class="field">
|
|
765
|
+
<span>Reaction notifications</span>
|
|
766
|
+
<select
|
|
767
|
+
.value=${a.reactionNotifications}
|
|
768
|
+
@change=${r=>{const o=[...t.discordForm.guilds];o[l]={...o[l],reactionNotifications:r.target.value},t.onDiscordChange({guilds:o})}}
|
|
769
|
+
>
|
|
770
|
+
<option value="off">Off</option>
|
|
771
|
+
<option value="own">Own</option>
|
|
772
|
+
<option value="all">All</option>
|
|
773
|
+
<option value="allowlist">Allowlist</option>
|
|
774
|
+
</select>
|
|
775
|
+
</label>
|
|
776
|
+
<label class="field">
|
|
777
|
+
<span>Users allowlist</span>
|
|
778
|
+
<input
|
|
779
|
+
.value=${a.users}
|
|
780
|
+
@input=${r=>{const o=[...t.discordForm.guilds];o[l]={...o[l],users:r.target.value},t.onDiscordChange({guilds:o})}}
|
|
781
|
+
placeholder="123456789, username#1234"
|
|
782
|
+
/>
|
|
783
|
+
</label>
|
|
784
|
+
</div>
|
|
785
|
+
${a.channels.length?p`
|
|
786
|
+
<div class="form-grid" style="margin-top: 8px;">
|
|
787
|
+
${a.channels.map((r,o)=>p`
|
|
788
|
+
<label class="field">
|
|
789
|
+
<span>Channel id / slug</span>
|
|
790
|
+
<input
|
|
791
|
+
.value=${r.key}
|
|
792
|
+
@input=${d=>{const u=[...t.discordForm.guilds],h=[...u[l].channels??[]];h[o]={...h[o],key:d.target.value},u[l]={...u[l],channels:h},t.onDiscordChange({guilds:u})}}
|
|
793
|
+
/>
|
|
794
|
+
</label>
|
|
795
|
+
<label class="field">
|
|
796
|
+
<span>Allow</span>
|
|
797
|
+
<select
|
|
798
|
+
.value=${r.allow?"yes":"no"}
|
|
799
|
+
@change=${d=>{const u=[...t.discordForm.guilds],h=[...u[l].channels??[]];h[o]={...h[o],allow:d.target.value==="yes"},u[l]={...u[l],channels:h},t.onDiscordChange({guilds:u})}}
|
|
800
|
+
>
|
|
801
|
+
<option value="yes">Yes</option>
|
|
802
|
+
<option value="no">No</option>
|
|
803
|
+
</select>
|
|
804
|
+
</label>
|
|
805
|
+
<label class="field">
|
|
806
|
+
<span>Require mention</span>
|
|
807
|
+
<select
|
|
808
|
+
.value=${r.requireMention?"yes":"no"}
|
|
809
|
+
@change=${d=>{const u=[...t.discordForm.guilds],h=[...u[l].channels??[]];h[o]={...h[o],requireMention:d.target.value==="yes"},u[l]={...u[l],channels:h},t.onDiscordChange({guilds:u})}}
|
|
810
|
+
>
|
|
811
|
+
<option value="yes">Yes</option>
|
|
812
|
+
<option value="no">No</option>
|
|
813
|
+
</select>
|
|
814
|
+
</label>
|
|
815
|
+
<label class="field">
|
|
816
|
+
<span> </span>
|
|
817
|
+
<button
|
|
818
|
+
class="btn"
|
|
819
|
+
@click=${()=>{const d=[...t.discordForm.guilds],u=[...d[l].channels??[]];u.splice(o,1),d[l]={...d[l],channels:u},t.onDiscordChange({guilds:d})}}
|
|
820
|
+
>
|
|
821
|
+
Remove
|
|
822
|
+
</button>
|
|
823
|
+
</label>
|
|
824
|
+
`)}
|
|
825
|
+
</div>
|
|
826
|
+
`:f}
|
|
827
|
+
</div>
|
|
828
|
+
<div class="list-meta">
|
|
829
|
+
<span>Channels</span>
|
|
830
|
+
<button
|
|
831
|
+
class="btn"
|
|
832
|
+
@click=${()=>{const r=[...t.discordForm.guilds],o=[...r[l].channels??[],{key:"",allow:!0,requireMention:!1}];r[l]={...r[l],channels:o},t.onDiscordChange({guilds:r})}}
|
|
833
|
+
>
|
|
834
|
+
Add channel
|
|
835
|
+
</button>
|
|
836
|
+
<button
|
|
837
|
+
class="btn danger"
|
|
838
|
+
@click=${()=>{const r=[...t.discordForm.guilds];r.splice(l,1),t.onDiscordChange({guilds:r})}}
|
|
839
|
+
>
|
|
840
|
+
Remove guild
|
|
841
|
+
</button>
|
|
842
|
+
</div>
|
|
843
|
+
</div>
|
|
844
|
+
`)}
|
|
845
|
+
</div>
|
|
846
|
+
<button
|
|
847
|
+
class="btn"
|
|
848
|
+
style="margin-top: 8px;"
|
|
849
|
+
@click=${()=>t.onDiscordChange({guilds:[...t.discordForm.guilds,{key:"",slug:"",requireMention:!1,reactionNotifications:"own",users:"",channels:[]}]})}
|
|
850
|
+
>
|
|
851
|
+
Add guild
|
|
852
|
+
</button>
|
|
853
|
+
</div>
|
|
854
|
+
<label class="field">
|
|
855
|
+
<span>Slash command</span>
|
|
856
|
+
<select
|
|
857
|
+
.value=${t.discordForm.slashEnabled?"yes":"no"}
|
|
858
|
+
@change=${a=>t.onDiscordChange({slashEnabled:a.target.value==="yes"})}
|
|
859
|
+
>
|
|
860
|
+
<option value="yes">Enabled</option>
|
|
861
|
+
<option value="no">Disabled</option>
|
|
862
|
+
</select>
|
|
863
|
+
</label>
|
|
864
|
+
<label class="field">
|
|
865
|
+
<span>Slash name</span>
|
|
866
|
+
<input
|
|
867
|
+
.value=${t.discordForm.slashName}
|
|
868
|
+
@input=${a=>t.onDiscordChange({slashName:a.target.value})}
|
|
869
|
+
placeholder="clawd"
|
|
870
|
+
/>
|
|
871
|
+
</label>
|
|
872
|
+
<label class="field">
|
|
873
|
+
<span>Slash session prefix</span>
|
|
874
|
+
<input
|
|
875
|
+
.value=${t.discordForm.slashSessionPrefix}
|
|
876
|
+
@input=${a=>t.onDiscordChange({slashSessionPrefix:a.target.value})}
|
|
877
|
+
placeholder="discord:slash"
|
|
878
|
+
/>
|
|
879
|
+
</label>
|
|
880
|
+
<label class="field">
|
|
881
|
+
<span>Slash ephemeral</span>
|
|
882
|
+
<select
|
|
883
|
+
.value=${t.discordForm.slashEphemeral?"yes":"no"}
|
|
884
|
+
@change=${a=>t.onDiscordChange({slashEphemeral:a.target.value==="yes"})}
|
|
885
|
+
>
|
|
886
|
+
<option value="yes">Yes</option>
|
|
887
|
+
<option value="no">No</option>
|
|
888
|
+
</select>
|
|
889
|
+
</label>
|
|
890
|
+
</div>
|
|
891
|
+
|
|
892
|
+
<div class="card-sub" style="margin-top: 16px;">Tool actions</div>
|
|
893
|
+
<div class="form-grid" style="margin-top: 8px;">
|
|
894
|
+
${mo.map(a=>p`<label class="field">
|
|
895
|
+
<span>${a.label}</span>
|
|
896
|
+
<select
|
|
897
|
+
.value=${t.discordForm.actions[a.key]?"yes":"no"}
|
|
898
|
+
@change=${l=>t.onDiscordChange({actions:{...t.discordForm.actions,[a.key]:l.target.value==="yes"}})}
|
|
899
|
+
>
|
|
900
|
+
<option value="yes">Enabled</option>
|
|
901
|
+
<option value="no">Disabled</option>
|
|
902
|
+
</select>
|
|
903
|
+
</label>`)}
|
|
904
|
+
</div>
|
|
905
|
+
|
|
906
|
+
${t.discordTokenLocked?p`<div class="callout" style="margin-top: 12px;">
|
|
907
|
+
DISCORD_BOT_TOKEN is set in the environment. Config edits will not override it.
|
|
908
|
+
</div>`:f}
|
|
909
|
+
|
|
910
|
+
${t.discordStatus?p`<div class="callout" style="margin-top: 12px;">
|
|
911
|
+
${t.discordStatus}
|
|
912
|
+
</div>`:f}
|
|
913
|
+
|
|
914
|
+
<div class="row" style="margin-top: 14px;">
|
|
915
|
+
<button
|
|
916
|
+
class="btn primary"
|
|
917
|
+
?disabled=${t.discordSaving}
|
|
918
|
+
@click=${()=>t.onDiscordSave()}
|
|
919
|
+
>
|
|
920
|
+
${t.discordSaving?"Saving…":"Save"}
|
|
921
|
+
</button>
|
|
922
|
+
<button class="btn" @click=${()=>t.onRefresh(!0)}>
|
|
923
|
+
Probe
|
|
924
|
+
</button>
|
|
925
|
+
</div>
|
|
926
|
+
</div>
|
|
927
|
+
`}case"slack":{const s=n.slack,i=s?.probe?.bot?.name,a=s?.probe?.team?.name;return p`
|
|
928
|
+
<div class="card">
|
|
929
|
+
<div class="card-title">Slack</div>
|
|
930
|
+
<div class="card-sub">Socket mode status and bot details.</div>
|
|
931
|
+
|
|
932
|
+
<div class="status-list" style="margin-top: 16px;">
|
|
933
|
+
<div>
|
|
934
|
+
<span class="label">Configured</span>
|
|
935
|
+
<span>${s?.configured?"Yes":"No"}</span>
|
|
936
|
+
</div>
|
|
937
|
+
<div>
|
|
938
|
+
<span class="label">Running</span>
|
|
939
|
+
<span>${s?.running?"Yes":"No"}</span>
|
|
940
|
+
</div>
|
|
941
|
+
<div>
|
|
942
|
+
<span class="label">Bot</span>
|
|
943
|
+
<span>${i||"n/a"}</span>
|
|
944
|
+
</div>
|
|
945
|
+
<div>
|
|
946
|
+
<span class="label">Team</span>
|
|
947
|
+
<span>${a||"n/a"}</span>
|
|
948
|
+
</div>
|
|
949
|
+
<div>
|
|
950
|
+
<span class="label">Last start</span>
|
|
951
|
+
<span>${s?.lastStartAt?W(s.lastStartAt):"n/a"}</span>
|
|
952
|
+
</div>
|
|
953
|
+
<div>
|
|
954
|
+
<span class="label">Last probe</span>
|
|
955
|
+
<span>${s?.lastProbeAt?W(s.lastProbeAt):"n/a"}</span>
|
|
956
|
+
</div>
|
|
957
|
+
</div>
|
|
958
|
+
|
|
959
|
+
${s?.lastError?p`<div class="callout danger" style="margin-top: 12px;">
|
|
960
|
+
${s.lastError}
|
|
961
|
+
</div>`:f}
|
|
962
|
+
|
|
963
|
+
${s?.probe?p`<div class="callout" style="margin-top: 12px;">
|
|
964
|
+
Probe ${s.probe.ok?"ok":"failed"} ·
|
|
965
|
+
${s.probe.status??""}
|
|
966
|
+
${s.probe.error??""}
|
|
967
|
+
</div>`:f}
|
|
968
|
+
|
|
969
|
+
<div class="form-grid" style="margin-top: 16px;">
|
|
970
|
+
<label class="field">
|
|
971
|
+
<span>Enabled</span>
|
|
972
|
+
<select
|
|
973
|
+
.value=${t.slackForm.enabled?"yes":"no"}
|
|
974
|
+
@change=${l=>t.onSlackChange({enabled:l.target.value==="yes"})}
|
|
975
|
+
>
|
|
976
|
+
<option value="yes">Yes</option>
|
|
977
|
+
<option value="no">No</option>
|
|
978
|
+
</select>
|
|
979
|
+
</label>
|
|
980
|
+
<label class="field">
|
|
981
|
+
<span>Bot token</span>
|
|
982
|
+
<input
|
|
983
|
+
type="password"
|
|
984
|
+
.value=${t.slackForm.botToken}
|
|
985
|
+
?disabled=${t.slackTokenLocked}
|
|
986
|
+
@input=${l=>t.onSlackChange({botToken:l.target.value})}
|
|
987
|
+
/>
|
|
988
|
+
</label>
|
|
989
|
+
<label class="field">
|
|
990
|
+
<span>App token</span>
|
|
991
|
+
<input
|
|
992
|
+
type="password"
|
|
993
|
+
.value=${t.slackForm.appToken}
|
|
994
|
+
?disabled=${t.slackAppTokenLocked}
|
|
995
|
+
@input=${l=>t.onSlackChange({appToken:l.target.value})}
|
|
996
|
+
/>
|
|
997
|
+
</label>
|
|
998
|
+
<label class="field">
|
|
999
|
+
<span>DMs enabled</span>
|
|
1000
|
+
<select
|
|
1001
|
+
.value=${t.slackForm.dmEnabled?"yes":"no"}
|
|
1002
|
+
@change=${l=>t.onSlackChange({dmEnabled:l.target.value==="yes"})}
|
|
1003
|
+
>
|
|
1004
|
+
<option value="yes">Enabled</option>
|
|
1005
|
+
<option value="no">Disabled</option>
|
|
1006
|
+
</select>
|
|
1007
|
+
</label>
|
|
1008
|
+
<label class="field">
|
|
1009
|
+
<span>Allow DMs from</span>
|
|
1010
|
+
<input
|
|
1011
|
+
.value=${t.slackForm.allowFrom}
|
|
1012
|
+
@input=${l=>t.onSlackChange({allowFrom:l.target.value})}
|
|
1013
|
+
placeholder="U123, U456, *"
|
|
1014
|
+
/>
|
|
1015
|
+
</label>
|
|
1016
|
+
<label class="field">
|
|
1017
|
+
<span>Group DMs enabled</span>
|
|
1018
|
+
<select
|
|
1019
|
+
.value=${t.slackForm.groupEnabled?"yes":"no"}
|
|
1020
|
+
@change=${l=>t.onSlackChange({groupEnabled:l.target.value==="yes"})}
|
|
1021
|
+
>
|
|
1022
|
+
<option value="yes">Enabled</option>
|
|
1023
|
+
<option value="no">Disabled</option>
|
|
1024
|
+
</select>
|
|
1025
|
+
</label>
|
|
1026
|
+
<label class="field">
|
|
1027
|
+
<span>Group DM channels</span>
|
|
1028
|
+
<input
|
|
1029
|
+
.value=${t.slackForm.groupChannels}
|
|
1030
|
+
@input=${l=>t.onSlackChange({groupChannels:l.target.value})}
|
|
1031
|
+
placeholder="G123, #team"
|
|
1032
|
+
/>
|
|
1033
|
+
</label>
|
|
1034
|
+
<label class="field">
|
|
1035
|
+
<span>Reaction notifications</span>
|
|
1036
|
+
<select
|
|
1037
|
+
.value=${t.slackForm.reactionNotifications}
|
|
1038
|
+
@change=${l=>t.onSlackChange({reactionNotifications:l.target.value})}
|
|
1039
|
+
>
|
|
1040
|
+
<option value="off">Off</option>
|
|
1041
|
+
<option value="own">Own</option>
|
|
1042
|
+
<option value="all">All</option>
|
|
1043
|
+
<option value="allowlist">Allowlist</option>
|
|
1044
|
+
</select>
|
|
1045
|
+
</label>
|
|
1046
|
+
<label class="field">
|
|
1047
|
+
<span>Reaction allowlist</span>
|
|
1048
|
+
<input
|
|
1049
|
+
.value=${t.slackForm.reactionAllowlist}
|
|
1050
|
+
@input=${l=>t.onSlackChange({reactionAllowlist:l.target.value})}
|
|
1051
|
+
placeholder="U123, U456"
|
|
1052
|
+
/>
|
|
1053
|
+
</label>
|
|
1054
|
+
<label class="field">
|
|
1055
|
+
<span>Text chunk limit</span>
|
|
1056
|
+
<input
|
|
1057
|
+
.value=${t.slackForm.textChunkLimit}
|
|
1058
|
+
@input=${l=>t.onSlackChange({textChunkLimit:l.target.value})}
|
|
1059
|
+
placeholder="4000"
|
|
1060
|
+
/>
|
|
1061
|
+
</label>
|
|
1062
|
+
<label class="field">
|
|
1063
|
+
<span>Media max (MB)</span>
|
|
1064
|
+
<input
|
|
1065
|
+
.value=${t.slackForm.mediaMaxMb}
|
|
1066
|
+
@input=${l=>t.onSlackChange({mediaMaxMb:l.target.value})}
|
|
1067
|
+
placeholder="20"
|
|
1068
|
+
/>
|
|
1069
|
+
</label>
|
|
1070
|
+
</div>
|
|
1071
|
+
|
|
1072
|
+
<div class="card-sub" style="margin-top: 16px;">Slash command</div>
|
|
1073
|
+
<div class="form-grid" style="margin-top: 8px;">
|
|
1074
|
+
<label class="field">
|
|
1075
|
+
<span>Slash enabled</span>
|
|
1076
|
+
<select
|
|
1077
|
+
.value=${t.slackForm.slashEnabled?"yes":"no"}
|
|
1078
|
+
@change=${l=>t.onSlackChange({slashEnabled:l.target.value==="yes"})}
|
|
1079
|
+
>
|
|
1080
|
+
<option value="yes">Enabled</option>
|
|
1081
|
+
<option value="no">Disabled</option>
|
|
1082
|
+
</select>
|
|
1083
|
+
</label>
|
|
1084
|
+
<label class="field">
|
|
1085
|
+
<span>Slash name</span>
|
|
1086
|
+
<input
|
|
1087
|
+
.value=${t.slackForm.slashName}
|
|
1088
|
+
@input=${l=>t.onSlackChange({slashName:l.target.value})}
|
|
1089
|
+
placeholder="clawd"
|
|
1090
|
+
/>
|
|
1091
|
+
</label>
|
|
1092
|
+
<label class="field">
|
|
1093
|
+
<span>Slash session prefix</span>
|
|
1094
|
+
<input
|
|
1095
|
+
.value=${t.slackForm.slashSessionPrefix}
|
|
1096
|
+
@input=${l=>t.onSlackChange({slashSessionPrefix:l.target.value})}
|
|
1097
|
+
placeholder="slack:slash"
|
|
1098
|
+
/>
|
|
1099
|
+
</label>
|
|
1100
|
+
<label class="field">
|
|
1101
|
+
<span>Slash ephemeral</span>
|
|
1102
|
+
<select
|
|
1103
|
+
.value=${t.slackForm.slashEphemeral?"yes":"no"}
|
|
1104
|
+
@change=${l=>t.onSlackChange({slashEphemeral:l.target.value==="yes"})}
|
|
1105
|
+
>
|
|
1106
|
+
<option value="yes">Yes</option>
|
|
1107
|
+
<option value="no">No</option>
|
|
1108
|
+
</select>
|
|
1109
|
+
</label>
|
|
1110
|
+
</div>
|
|
1111
|
+
|
|
1112
|
+
<div class="card-sub" style="margin-top: 16px;">Channels</div>
|
|
1113
|
+
<div class="card-sub">
|
|
1114
|
+
Add channel ids or #names and optionally require mentions.
|
|
1115
|
+
</div>
|
|
1116
|
+
<div class="list">
|
|
1117
|
+
${t.slackForm.channels.map((l,r)=>p`
|
|
1118
|
+
<div class="list-item">
|
|
1119
|
+
<div class="list-main">
|
|
1120
|
+
<div class="form-grid">
|
|
1121
|
+
<label class="field">
|
|
1122
|
+
<span>Channel id / name</span>
|
|
1123
|
+
<input
|
|
1124
|
+
.value=${l.key}
|
|
1125
|
+
@input=${o=>{const d=[...t.slackForm.channels];d[r]={...d[r],key:o.target.value},t.onSlackChange({channels:d})}}
|
|
1126
|
+
/>
|
|
1127
|
+
</label>
|
|
1128
|
+
<label class="field">
|
|
1129
|
+
<span>Allow</span>
|
|
1130
|
+
<select
|
|
1131
|
+
.value=${l.allow?"yes":"no"}
|
|
1132
|
+
@change=${o=>{const d=[...t.slackForm.channels];d[r]={...d[r],allow:o.target.value==="yes"},t.onSlackChange({channels:d})}}
|
|
1133
|
+
>
|
|
1134
|
+
<option value="yes">Yes</option>
|
|
1135
|
+
<option value="no">No</option>
|
|
1136
|
+
</select>
|
|
1137
|
+
</label>
|
|
1138
|
+
<label class="field">
|
|
1139
|
+
<span>Require mention</span>
|
|
1140
|
+
<select
|
|
1141
|
+
.value=${l.requireMention?"yes":"no"}
|
|
1142
|
+
@change=${o=>{const d=[...t.slackForm.channels];d[r]={...d[r],requireMention:o.target.value==="yes"},t.onSlackChange({channels:d})}}
|
|
1143
|
+
>
|
|
1144
|
+
<option value="yes">Yes</option>
|
|
1145
|
+
<option value="no">No</option>
|
|
1146
|
+
</select>
|
|
1147
|
+
</label>
|
|
1148
|
+
<label class="field">
|
|
1149
|
+
<span> </span>
|
|
1150
|
+
<button
|
|
1151
|
+
class="btn"
|
|
1152
|
+
@click=${()=>{const o=[...t.slackForm.channels];o.splice(r,1),t.onSlackChange({channels:o})}}
|
|
1153
|
+
>
|
|
1154
|
+
Remove
|
|
1155
|
+
</button>
|
|
1156
|
+
</label>
|
|
1157
|
+
</div>
|
|
1158
|
+
</div>
|
|
1159
|
+
</div>
|
|
1160
|
+
`)}
|
|
1161
|
+
</div>
|
|
1162
|
+
<button
|
|
1163
|
+
class="btn"
|
|
1164
|
+
style="margin-top: 8px;"
|
|
1165
|
+
@click=${()=>t.onSlackChange({channels:[...t.slackForm.channels,{key:"",allow:!0,requireMention:!1}]})}
|
|
1166
|
+
>
|
|
1167
|
+
Add channel
|
|
1168
|
+
</button>
|
|
1169
|
+
|
|
1170
|
+
<div class="card-sub" style="margin-top: 16px;">Tool actions</div>
|
|
1171
|
+
<div class="form-grid" style="margin-top: 8px;">
|
|
1172
|
+
${bo.map(l=>p`<label class="field">
|
|
1173
|
+
<span>${l.label}</span>
|
|
1174
|
+
<select
|
|
1175
|
+
.value=${t.slackForm.actions[l.key]?"yes":"no"}
|
|
1176
|
+
@change=${r=>t.onSlackChange({actions:{...t.slackForm.actions,[l.key]:r.target.value==="yes"}})}
|
|
1177
|
+
>
|
|
1178
|
+
<option value="yes">Enabled</option>
|
|
1179
|
+
<option value="no">Disabled</option>
|
|
1180
|
+
</select>
|
|
1181
|
+
</label>`)}
|
|
1182
|
+
</div>
|
|
1183
|
+
|
|
1184
|
+
${t.slackTokenLocked||t.slackAppTokenLocked?p`<div class="callout" style="margin-top: 12px;">
|
|
1185
|
+
${t.slackTokenLocked?"SLACK_BOT_TOKEN ":""}
|
|
1186
|
+
${t.slackAppTokenLocked?"SLACK_APP_TOKEN ":""}
|
|
1187
|
+
is set in the environment. Config edits will not override it.
|
|
1188
|
+
</div>`:f}
|
|
1189
|
+
|
|
1190
|
+
${t.slackStatus?p`<div class="callout" style="margin-top: 12px;">
|
|
1191
|
+
${t.slackStatus}
|
|
1192
|
+
</div>`:f}
|
|
1193
|
+
|
|
1194
|
+
<div class="row" style="margin-top: 14px;">
|
|
1195
|
+
<button
|
|
1196
|
+
class="btn primary"
|
|
1197
|
+
?disabled=${t.slackSaving}
|
|
1198
|
+
@click=${()=>t.onSlackSave()}
|
|
1199
|
+
>
|
|
1200
|
+
${t.slackSaving?"Saving…":"Save"}
|
|
1201
|
+
</button>
|
|
1202
|
+
<button class="btn" @click=${()=>t.onRefresh(!0)}>
|
|
1203
|
+
Probe
|
|
1204
|
+
</button>
|
|
1205
|
+
</div>
|
|
1206
|
+
</div>
|
|
1207
|
+
`}case"signal":{const s=n.signal;return p`
|
|
1208
|
+
<div class="card">
|
|
1209
|
+
<div class="card-title">Signal</div>
|
|
1210
|
+
<div class="card-sub">REST daemon status and probe details.</div>
|
|
1211
|
+
|
|
1212
|
+
<div class="status-list" style="margin-top: 16px;">
|
|
1213
|
+
<div>
|
|
1214
|
+
<span class="label">Configured</span>
|
|
1215
|
+
<span>${s?.configured?"Yes":"No"}</span>
|
|
1216
|
+
</div>
|
|
1217
|
+
<div>
|
|
1218
|
+
<span class="label">Running</span>
|
|
1219
|
+
<span>${s?.running?"Yes":"No"}</span>
|
|
1220
|
+
</div>
|
|
1221
|
+
<div>
|
|
1222
|
+
<span class="label">Base URL</span>
|
|
1223
|
+
<span>${s?.baseUrl??"n/a"}</span>
|
|
1224
|
+
</div>
|
|
1225
|
+
<div>
|
|
1226
|
+
<span class="label">Last start</span>
|
|
1227
|
+
<span>${s?.lastStartAt?W(s.lastStartAt):"n/a"}</span>
|
|
1228
|
+
</div>
|
|
1229
|
+
<div>
|
|
1230
|
+
<span class="label">Last probe</span>
|
|
1231
|
+
<span>${s?.lastProbeAt?W(s.lastProbeAt):"n/a"}</span>
|
|
1232
|
+
</div>
|
|
1233
|
+
</div>
|
|
1234
|
+
|
|
1235
|
+
${s?.lastError?p`<div class="callout danger" style="margin-top: 12px;">
|
|
1236
|
+
${s.lastError}
|
|
1237
|
+
</div>`:f}
|
|
1238
|
+
|
|
1239
|
+
${s?.probe?p`<div class="callout" style="margin-top: 12px;">
|
|
1240
|
+
Probe ${s.probe.ok?"ok":"failed"} ·
|
|
1241
|
+
${s.probe.status??""}
|
|
1242
|
+
${s.probe.error??""}
|
|
1243
|
+
</div>`:f}
|
|
1244
|
+
|
|
1245
|
+
<div class="form-grid" style="margin-top: 16px;">
|
|
1246
|
+
<label class="field">
|
|
1247
|
+
<span>Enabled</span>
|
|
1248
|
+
<select
|
|
1249
|
+
.value=${t.signalForm.enabled?"yes":"no"}
|
|
1250
|
+
@change=${i=>t.onSignalChange({enabled:i.target.value==="yes"})}
|
|
1251
|
+
>
|
|
1252
|
+
<option value="yes">Yes</option>
|
|
1253
|
+
<option value="no">No</option>
|
|
1254
|
+
</select>
|
|
1255
|
+
</label>
|
|
1256
|
+
<label class="field">
|
|
1257
|
+
<span>Account</span>
|
|
1258
|
+
<input
|
|
1259
|
+
.value=${t.signalForm.account}
|
|
1260
|
+
@input=${i=>t.onSignalChange({account:i.target.value})}
|
|
1261
|
+
placeholder="+15551234567"
|
|
1262
|
+
/>
|
|
1263
|
+
</label>
|
|
1264
|
+
<label class="field">
|
|
1265
|
+
<span>HTTP URL</span>
|
|
1266
|
+
<input
|
|
1267
|
+
.value=${t.signalForm.httpUrl}
|
|
1268
|
+
@input=${i=>t.onSignalChange({httpUrl:i.target.value})}
|
|
1269
|
+
placeholder="http://127.0.0.1:8080"
|
|
1270
|
+
/>
|
|
1271
|
+
</label>
|
|
1272
|
+
<label class="field">
|
|
1273
|
+
<span>HTTP host</span>
|
|
1274
|
+
<input
|
|
1275
|
+
.value=${t.signalForm.httpHost}
|
|
1276
|
+
@input=${i=>t.onSignalChange({httpHost:i.target.value})}
|
|
1277
|
+
placeholder="127.0.0.1"
|
|
1278
|
+
/>
|
|
1279
|
+
</label>
|
|
1280
|
+
<label class="field">
|
|
1281
|
+
<span>HTTP port</span>
|
|
1282
|
+
<input
|
|
1283
|
+
.value=${t.signalForm.httpPort}
|
|
1284
|
+
@input=${i=>t.onSignalChange({httpPort:i.target.value})}
|
|
1285
|
+
placeholder="8080"
|
|
1286
|
+
/>
|
|
1287
|
+
</label>
|
|
1288
|
+
<label class="field">
|
|
1289
|
+
<span>CLI path</span>
|
|
1290
|
+
<input
|
|
1291
|
+
.value=${t.signalForm.cliPath}
|
|
1292
|
+
@input=${i=>t.onSignalChange({cliPath:i.target.value})}
|
|
1293
|
+
placeholder="signal-cli"
|
|
1294
|
+
/>
|
|
1295
|
+
</label>
|
|
1296
|
+
<label class="field">
|
|
1297
|
+
<span>Auto start</span>
|
|
1298
|
+
<select
|
|
1299
|
+
.value=${t.signalForm.autoStart?"yes":"no"}
|
|
1300
|
+
@change=${i=>t.onSignalChange({autoStart:i.target.value==="yes"})}
|
|
1301
|
+
>
|
|
1302
|
+
<option value="yes">Yes</option>
|
|
1303
|
+
<option value="no">No</option>
|
|
1304
|
+
</select>
|
|
1305
|
+
</label>
|
|
1306
|
+
<label class="field">
|
|
1307
|
+
<span>Receive mode</span>
|
|
1308
|
+
<select
|
|
1309
|
+
.value=${t.signalForm.receiveMode}
|
|
1310
|
+
@change=${i=>t.onSignalChange({receiveMode:i.target.value})}
|
|
1311
|
+
>
|
|
1312
|
+
<option value="">Default</option>
|
|
1313
|
+
<option value="on-start">on-start</option>
|
|
1314
|
+
<option value="manual">manual</option>
|
|
1315
|
+
</select>
|
|
1316
|
+
</label>
|
|
1317
|
+
<label class="field">
|
|
1318
|
+
<span>Ignore attachments</span>
|
|
1319
|
+
<select
|
|
1320
|
+
.value=${t.signalForm.ignoreAttachments?"yes":"no"}
|
|
1321
|
+
@change=${i=>t.onSignalChange({ignoreAttachments:i.target.value==="yes"})}
|
|
1322
|
+
>
|
|
1323
|
+
<option value="yes">Yes</option>
|
|
1324
|
+
<option value="no">No</option>
|
|
1325
|
+
</select>
|
|
1326
|
+
</label>
|
|
1327
|
+
<label class="field">
|
|
1328
|
+
<span>Ignore stories</span>
|
|
1329
|
+
<select
|
|
1330
|
+
.value=${t.signalForm.ignoreStories?"yes":"no"}
|
|
1331
|
+
@change=${i=>t.onSignalChange({ignoreStories:i.target.value==="yes"})}
|
|
1332
|
+
>
|
|
1333
|
+
<option value="yes">Yes</option>
|
|
1334
|
+
<option value="no">No</option>
|
|
1335
|
+
</select>
|
|
1336
|
+
</label>
|
|
1337
|
+
<label class="field">
|
|
1338
|
+
<span>Send read receipts</span>
|
|
1339
|
+
<select
|
|
1340
|
+
.value=${t.signalForm.sendReadReceipts?"yes":"no"}
|
|
1341
|
+
@change=${i=>t.onSignalChange({sendReadReceipts:i.target.value==="yes"})}
|
|
1342
|
+
>
|
|
1343
|
+
<option value="yes">Yes</option>
|
|
1344
|
+
<option value="no">No</option>
|
|
1345
|
+
</select>
|
|
1346
|
+
</label>
|
|
1347
|
+
<label class="field">
|
|
1348
|
+
<span>Allow from</span>
|
|
1349
|
+
<input
|
|
1350
|
+
.value=${t.signalForm.allowFrom}
|
|
1351
|
+
@input=${i=>t.onSignalChange({allowFrom:i.target.value})}
|
|
1352
|
+
placeholder="12345, +1555"
|
|
1353
|
+
/>
|
|
1354
|
+
</label>
|
|
1355
|
+
<label class="field">
|
|
1356
|
+
<span>Media max MB</span>
|
|
1357
|
+
<input
|
|
1358
|
+
.value=${t.signalForm.mediaMaxMb}
|
|
1359
|
+
@input=${i=>t.onSignalChange({mediaMaxMb:i.target.value})}
|
|
1360
|
+
placeholder="8"
|
|
1361
|
+
/>
|
|
1362
|
+
</label>
|
|
1363
|
+
</div>
|
|
1364
|
+
|
|
1365
|
+
${t.signalStatus?p`<div class="callout" style="margin-top: 12px;">
|
|
1366
|
+
${t.signalStatus}
|
|
1367
|
+
</div>`:f}
|
|
1368
|
+
|
|
1369
|
+
<div class="row" style="margin-top: 14px;">
|
|
1370
|
+
<button
|
|
1371
|
+
class="btn primary"
|
|
1372
|
+
?disabled=${t.signalSaving}
|
|
1373
|
+
@click=${()=>t.onSignalSave()}
|
|
1374
|
+
>
|
|
1375
|
+
${t.signalSaving?"Saving…":"Save"}
|
|
1376
|
+
</button>
|
|
1377
|
+
<button class="btn" @click=${()=>t.onRefresh(!0)}>
|
|
1378
|
+
Probe
|
|
1379
|
+
</button>
|
|
1380
|
+
</div>
|
|
1381
|
+
</div>
|
|
1382
|
+
`}case"imessage":{const s=n.imessage;return p`
|
|
1383
|
+
<div class="card">
|
|
1384
|
+
<div class="card-title">iMessage</div>
|
|
1385
|
+
<div class="card-sub">imsg CLI and database availability.</div>
|
|
1386
|
+
|
|
1387
|
+
<div class="status-list" style="margin-top: 16px;">
|
|
1388
|
+
<div>
|
|
1389
|
+
<span class="label">Configured</span>
|
|
1390
|
+
<span>${s?.configured?"Yes":"No"}</span>
|
|
1391
|
+
</div>
|
|
1392
|
+
<div>
|
|
1393
|
+
<span class="label">Running</span>
|
|
1394
|
+
<span>${s?.running?"Yes":"No"}</span>
|
|
1395
|
+
</div>
|
|
1396
|
+
<div>
|
|
1397
|
+
<span class="label">CLI</span>
|
|
1398
|
+
<span>${s?.cliPath??"n/a"}</span>
|
|
1399
|
+
</div>
|
|
1400
|
+
<div>
|
|
1401
|
+
<span class="label">DB</span>
|
|
1402
|
+
<span>${s?.dbPath??"n/a"}</span>
|
|
1403
|
+
</div>
|
|
1404
|
+
<div>
|
|
1405
|
+
<span class="label">Last start</span>
|
|
1406
|
+
<span>
|
|
1407
|
+
${s?.lastStartAt?W(s.lastStartAt):"n/a"}
|
|
1408
|
+
</span>
|
|
1409
|
+
</div>
|
|
1410
|
+
<div>
|
|
1411
|
+
<span class="label">Last probe</span>
|
|
1412
|
+
<span>
|
|
1413
|
+
${s?.lastProbeAt?W(s.lastProbeAt):"n/a"}
|
|
1414
|
+
</span>
|
|
1415
|
+
</div>
|
|
1416
|
+
</div>
|
|
1417
|
+
|
|
1418
|
+
${s?.lastError?p`<div class="callout danger" style="margin-top: 12px;">
|
|
1419
|
+
${s.lastError}
|
|
1420
|
+
</div>`:f}
|
|
1421
|
+
|
|
1422
|
+
${s?.probe&&!s.probe.ok?p`<div class="callout" style="margin-top: 12px;">
|
|
1423
|
+
Probe failed · ${s.probe.error??"unknown error"}
|
|
1424
|
+
</div>`:f}
|
|
1425
|
+
|
|
1426
|
+
<div class="form-grid" style="margin-top: 16px;">
|
|
1427
|
+
<label class="field">
|
|
1428
|
+
<span>Enabled</span>
|
|
1429
|
+
<select
|
|
1430
|
+
.value=${t.imessageForm.enabled?"yes":"no"}
|
|
1431
|
+
@change=${i=>t.onIMessageChange({enabled:i.target.value==="yes"})}
|
|
1432
|
+
>
|
|
1433
|
+
<option value="yes">Yes</option>
|
|
1434
|
+
<option value="no">No</option>
|
|
1435
|
+
</select>
|
|
1436
|
+
</label>
|
|
1437
|
+
<label class="field">
|
|
1438
|
+
<span>CLI path</span>
|
|
1439
|
+
<input
|
|
1440
|
+
.value=${t.imessageForm.cliPath}
|
|
1441
|
+
@input=${i=>t.onIMessageChange({cliPath:i.target.value})}
|
|
1442
|
+
placeholder="imsg"
|
|
1443
|
+
/>
|
|
1444
|
+
</label>
|
|
1445
|
+
<label class="field">
|
|
1446
|
+
<span>DB path</span>
|
|
1447
|
+
<input
|
|
1448
|
+
.value=${t.imessageForm.dbPath}
|
|
1449
|
+
@input=${i=>t.onIMessageChange({dbPath:i.target.value})}
|
|
1450
|
+
placeholder="~/Library/Messages/chat.db"
|
|
1451
|
+
/>
|
|
1452
|
+
</label>
|
|
1453
|
+
<label class="field">
|
|
1454
|
+
<span>Service</span>
|
|
1455
|
+
<select
|
|
1456
|
+
.value=${t.imessageForm.service}
|
|
1457
|
+
@change=${i=>t.onIMessageChange({service:i.target.value})}
|
|
1458
|
+
>
|
|
1459
|
+
<option value="auto">Auto</option>
|
|
1460
|
+
<option value="imessage">iMessage</option>
|
|
1461
|
+
<option value="sms">SMS</option>
|
|
1462
|
+
</select>
|
|
1463
|
+
</label>
|
|
1464
|
+
<label class="field">
|
|
1465
|
+
<span>Region</span>
|
|
1466
|
+
<input
|
|
1467
|
+
.value=${t.imessageForm.region}
|
|
1468
|
+
@input=${i=>t.onIMessageChange({region:i.target.value})}
|
|
1469
|
+
placeholder="US"
|
|
1470
|
+
/>
|
|
1471
|
+
</label>
|
|
1472
|
+
<label class="field">
|
|
1473
|
+
<span>Allow from</span>
|
|
1474
|
+
<input
|
|
1475
|
+
.value=${t.imessageForm.allowFrom}
|
|
1476
|
+
@input=${i=>t.onIMessageChange({allowFrom:i.target.value})}
|
|
1477
|
+
placeholder="chat_id:101, +1555"
|
|
1478
|
+
/>
|
|
1479
|
+
</label>
|
|
1480
|
+
<label class="field">
|
|
1481
|
+
<span>Include attachments</span>
|
|
1482
|
+
<select
|
|
1483
|
+
.value=${t.imessageForm.includeAttachments?"yes":"no"}
|
|
1484
|
+
@change=${i=>t.onIMessageChange({includeAttachments:i.target.value==="yes"})}
|
|
1485
|
+
>
|
|
1486
|
+
<option value="yes">Yes</option>
|
|
1487
|
+
<option value="no">No</option>
|
|
1488
|
+
</select>
|
|
1489
|
+
</label>
|
|
1490
|
+
<label class="field">
|
|
1491
|
+
<span>Media max MB</span>
|
|
1492
|
+
<input
|
|
1493
|
+
.value=${t.imessageForm.mediaMaxMb}
|
|
1494
|
+
@input=${i=>t.onIMessageChange({mediaMaxMb:i.target.value})}
|
|
1495
|
+
placeholder="16"
|
|
1496
|
+
/>
|
|
1497
|
+
</label>
|
|
1498
|
+
</div>
|
|
1499
|
+
|
|
1500
|
+
${t.imessageStatus?p`<div class="callout" style="margin-top: 12px;">
|
|
1501
|
+
${t.imessageStatus}
|
|
1502
|
+
</div>`:f}
|
|
1503
|
+
|
|
1504
|
+
<div class="row" style="margin-top: 14px;">
|
|
1505
|
+
<button
|
|
1506
|
+
class="btn primary"
|
|
1507
|
+
?disabled=${t.imessageSaving}
|
|
1508
|
+
@click=${()=>t.onIMessageSave()}
|
|
1509
|
+
>
|
|
1510
|
+
${t.imessageSaving?"Saving…":"Save"}
|
|
1511
|
+
</button>
|
|
1512
|
+
<button class="btn" @click=${()=>t.onRefresh(!0)}>
|
|
1513
|
+
Probe
|
|
1514
|
+
</button>
|
|
1515
|
+
</div>
|
|
1516
|
+
</div>
|
|
1517
|
+
`}default:return f}}function wo(e){const t=e.host??"unknown",n=e.ip?`(${e.ip})`:"",s=e.mode??"",i=e.version??"";return`${t} ${n} ${s} ${i}`.trim()}function So(e){const t=e.ts??null;return t?W(t):"n/a"}function Ei(e){return e?`${at(e)} (${W(e)})`:"n/a"}function xo(e){if(e.totalTokens==null)return"n/a";const t=e.totalTokens??0,n=e.contextTokens??0;return n?`${t} / ${n}`:String(t)}function Ao(e){if(e==null)return"";try{return JSON.stringify(e,null,2)}catch{return String(e)}}function To(e){const t=e.state??{},n=t.nextRunAtMs?at(t.nextRunAtMs):"n/a",s=t.lastRunAtMs?at(t.lastRunAtMs):"n/a";return`${t.lastStatus??"n/a"} · next ${n} · last ${s}`}function Eo(e){const t=e.schedule;return t.kind==="at"?`At ${at(t.atMs)}`:t.kind==="every"?`Every ${Ti(t.everyMs)}`:`Cron ${t.expr}${t.tz?` (${t.tz})`:""}`}function Co(e){const t=e.payload;return t.kind==="systemEvent"?`System: ${t.text}`:`Agent: ${t.message}`}function _o(e){return p`
|
|
1518
|
+
<section class="grid grid-cols-2">
|
|
1519
|
+
<div class="card">
|
|
1520
|
+
<div class="card-title">Scheduler</div>
|
|
1521
|
+
<div class="card-sub">Gateway-owned cron scheduler status.</div>
|
|
1522
|
+
<div class="stat-grid" style="margin-top: 16px;">
|
|
1523
|
+
<div class="stat">
|
|
1524
|
+
<div class="stat-label">Enabled</div>
|
|
1525
|
+
<div class="stat-value">
|
|
1526
|
+
${e.status?e.status.enabled?"Yes":"No":"n/a"}
|
|
1527
|
+
</div>
|
|
1528
|
+
</div>
|
|
1529
|
+
<div class="stat">
|
|
1530
|
+
<div class="stat-label">Jobs</div>
|
|
1531
|
+
<div class="stat-value">${e.status?.jobs??"n/a"}</div>
|
|
1532
|
+
</div>
|
|
1533
|
+
<div class="stat">
|
|
1534
|
+
<div class="stat-label">Next wake</div>
|
|
1535
|
+
<div class="stat-value">${Ei(e.status?.nextWakeAtMs??null)}</div>
|
|
1536
|
+
</div>
|
|
1537
|
+
</div>
|
|
1538
|
+
<div class="row" style="margin-top: 12px;">
|
|
1539
|
+
<button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
|
|
1540
|
+
${e.loading?"Refreshing…":"Refresh"}
|
|
1541
|
+
</button>
|
|
1542
|
+
${e.error?p`<span class="muted">${e.error}</span>`:f}
|
|
1543
|
+
</div>
|
|
1544
|
+
</div>
|
|
1545
|
+
|
|
1546
|
+
<div class="card">
|
|
1547
|
+
<div class="card-title">New Job</div>
|
|
1548
|
+
<div class="card-sub">Create a scheduled wakeup or agent run.</div>
|
|
1549
|
+
<div class="form-grid" style="margin-top: 16px;">
|
|
1550
|
+
<label class="field">
|
|
1551
|
+
<span>Name</span>
|
|
1552
|
+
<input
|
|
1553
|
+
.value=${e.form.name}
|
|
1554
|
+
@input=${t=>e.onFormChange({name:t.target.value})}
|
|
1555
|
+
/>
|
|
1556
|
+
</label>
|
|
1557
|
+
<label class="field">
|
|
1558
|
+
<span>Description</span>
|
|
1559
|
+
<input
|
|
1560
|
+
.value=${e.form.description}
|
|
1561
|
+
@input=${t=>e.onFormChange({description:t.target.value})}
|
|
1562
|
+
/>
|
|
1563
|
+
</label>
|
|
1564
|
+
<label class="field checkbox">
|
|
1565
|
+
<span>Enabled</span>
|
|
1566
|
+
<input
|
|
1567
|
+
type="checkbox"
|
|
1568
|
+
.checked=${e.form.enabled}
|
|
1569
|
+
@change=${t=>e.onFormChange({enabled:t.target.checked})}
|
|
1570
|
+
/>
|
|
1571
|
+
</label>
|
|
1572
|
+
<label class="field">
|
|
1573
|
+
<span>Schedule</span>
|
|
1574
|
+
<select
|
|
1575
|
+
.value=${e.form.scheduleKind}
|
|
1576
|
+
@change=${t=>e.onFormChange({scheduleKind:t.target.value})}
|
|
1577
|
+
>
|
|
1578
|
+
<option value="every">Every</option>
|
|
1579
|
+
<option value="at">At</option>
|
|
1580
|
+
<option value="cron">Cron</option>
|
|
1581
|
+
</select>
|
|
1582
|
+
</label>
|
|
1583
|
+
</div>
|
|
1584
|
+
${Mo(e)}
|
|
1585
|
+
<div class="form-grid" style="margin-top: 12px;">
|
|
1586
|
+
<label class="field">
|
|
1587
|
+
<span>Session</span>
|
|
1588
|
+
<select
|
|
1589
|
+
.value=${e.form.sessionTarget}
|
|
1590
|
+
@change=${t=>e.onFormChange({sessionTarget:t.target.value})}
|
|
1591
|
+
>
|
|
1592
|
+
<option value="main">Main</option>
|
|
1593
|
+
<option value="isolated">Isolated</option>
|
|
1594
|
+
</select>
|
|
1595
|
+
</label>
|
|
1596
|
+
<label class="field">
|
|
1597
|
+
<span>Wake mode</span>
|
|
1598
|
+
<select
|
|
1599
|
+
.value=${e.form.wakeMode}
|
|
1600
|
+
@change=${t=>e.onFormChange({wakeMode:t.target.value})}
|
|
1601
|
+
>
|
|
1602
|
+
<option value="next-heartbeat">Next heartbeat</option>
|
|
1603
|
+
<option value="now">Now</option>
|
|
1604
|
+
</select>
|
|
1605
|
+
</label>
|
|
1606
|
+
<label class="field">
|
|
1607
|
+
<span>Payload</span>
|
|
1608
|
+
<select
|
|
1609
|
+
.value=${e.form.payloadKind}
|
|
1610
|
+
@change=${t=>e.onFormChange({payloadKind:t.target.value})}
|
|
1611
|
+
>
|
|
1612
|
+
<option value="systemEvent">System event</option>
|
|
1613
|
+
<option value="agentTurn">Agent turn</option>
|
|
1614
|
+
</select>
|
|
1615
|
+
</label>
|
|
1616
|
+
</div>
|
|
1617
|
+
<label class="field" style="margin-top: 12px;">
|
|
1618
|
+
<span>${e.form.payloadKind==="systemEvent"?"System text":"Agent message"}</span>
|
|
1619
|
+
<textarea
|
|
1620
|
+
.value=${e.form.payloadText}
|
|
1621
|
+
@input=${t=>e.onFormChange({payloadText:t.target.value})}
|
|
1622
|
+
rows="4"
|
|
1623
|
+
></textarea>
|
|
1624
|
+
</label>
|
|
1625
|
+
${e.form.payloadKind==="agentTurn"?p`
|
|
1626
|
+
<div class="form-grid" style="margin-top: 12px;">
|
|
1627
|
+
<label class="field checkbox">
|
|
1628
|
+
<span>Deliver</span>
|
|
1629
|
+
<input
|
|
1630
|
+
type="checkbox"
|
|
1631
|
+
.checked=${e.form.deliver}
|
|
1632
|
+
@change=${t=>e.onFormChange({deliver:t.target.checked})}
|
|
1633
|
+
/>
|
|
1634
|
+
</label>
|
|
1635
|
+
<label class="field">
|
|
1636
|
+
<span>Provider</span>
|
|
1637
|
+
<select
|
|
1638
|
+
.value=${e.form.provider}
|
|
1639
|
+
@change=${t=>e.onFormChange({provider:t.target.value})}
|
|
1640
|
+
>
|
|
1641
|
+
<option value="last">Last</option>
|
|
1642
|
+
<option value="whatsapp">WhatsApp</option>
|
|
1643
|
+
<option value="telegram">Telegram</option>
|
|
1644
|
+
<option value="discord">Discord</option>
|
|
1645
|
+
<option value="slack">Slack</option>
|
|
1646
|
+
<option value="signal">Signal</option>
|
|
1647
|
+
<option value="imessage">iMessage</option>
|
|
1648
|
+
</select>
|
|
1649
|
+
</label>
|
|
1650
|
+
<label class="field">
|
|
1651
|
+
<span>To</span>
|
|
1652
|
+
<input
|
|
1653
|
+
.value=${e.form.to}
|
|
1654
|
+
@input=${t=>e.onFormChange({to:t.target.value})}
|
|
1655
|
+
placeholder="+1555… or chat id"
|
|
1656
|
+
/>
|
|
1657
|
+
</label>
|
|
1658
|
+
<label class="field">
|
|
1659
|
+
<span>Timeout (seconds)</span>
|
|
1660
|
+
<input
|
|
1661
|
+
.value=${e.form.timeoutSeconds}
|
|
1662
|
+
@input=${t=>e.onFormChange({timeoutSeconds:t.target.value})}
|
|
1663
|
+
/>
|
|
1664
|
+
</label>
|
|
1665
|
+
${e.form.sessionTarget==="isolated"?p`
|
|
1666
|
+
<label class="field">
|
|
1667
|
+
<span>Post to main prefix</span>
|
|
1668
|
+
<input
|
|
1669
|
+
.value=${e.form.postToMainPrefix}
|
|
1670
|
+
@input=${t=>e.onFormChange({postToMainPrefix:t.target.value})}
|
|
1671
|
+
/>
|
|
1672
|
+
</label>
|
|
1673
|
+
`:f}
|
|
1674
|
+
</div>
|
|
1675
|
+
`:f}
|
|
1676
|
+
<div class="row" style="margin-top: 14px;">
|
|
1677
|
+
<button class="btn primary" ?disabled=${e.busy} @click=${e.onAdd}>
|
|
1678
|
+
${e.busy?"Saving…":"Add job"}
|
|
1679
|
+
</button>
|
|
1680
|
+
</div>
|
|
1681
|
+
</div>
|
|
1682
|
+
</section>
|
|
1683
|
+
|
|
1684
|
+
<section class="card" style="margin-top: 18px;">
|
|
1685
|
+
<div class="card-title">Jobs</div>
|
|
1686
|
+
<div class="card-sub">All scheduled jobs stored in the gateway.</div>
|
|
1687
|
+
${e.jobs.length===0?p`<div class="muted" style="margin-top: 12px;">No jobs yet.</div>`:p`
|
|
1688
|
+
<div class="list" style="margin-top: 12px;">
|
|
1689
|
+
${e.jobs.map(t=>Ro(t,e))}
|
|
1690
|
+
</div>
|
|
1691
|
+
`}
|
|
1692
|
+
</section>
|
|
1693
|
+
|
|
1694
|
+
<section class="card" style="margin-top: 18px;">
|
|
1695
|
+
<div class="card-title">Run history</div>
|
|
1696
|
+
<div class="card-sub">Latest runs for ${e.runsJobId??"(select a job)"}.</div>
|
|
1697
|
+
${e.runs.length===0?p`<div class="muted" style="margin-top: 12px;">No runs yet.</div>`:p`
|
|
1698
|
+
<div class="list" style="margin-top: 12px;">
|
|
1699
|
+
${e.runs.map(t=>Lo(t))}
|
|
1700
|
+
</div>
|
|
1701
|
+
`}
|
|
1702
|
+
</section>
|
|
1703
|
+
`}function Mo(e){const t=e.form;return t.scheduleKind==="at"?p`
|
|
1704
|
+
<label class="field" style="margin-top: 12px;">
|
|
1705
|
+
<span>Run at</span>
|
|
1706
|
+
<input
|
|
1707
|
+
type="datetime-local"
|
|
1708
|
+
.value=${t.scheduleAt}
|
|
1709
|
+
@input=${n=>e.onFormChange({scheduleAt:n.target.value})}
|
|
1710
|
+
/>
|
|
1711
|
+
</label>
|
|
1712
|
+
`:t.scheduleKind==="every"?p`
|
|
1713
|
+
<div class="form-grid" style="margin-top: 12px;">
|
|
1714
|
+
<label class="field">
|
|
1715
|
+
<span>Every</span>
|
|
1716
|
+
<input
|
|
1717
|
+
.value=${t.everyAmount}
|
|
1718
|
+
@input=${n=>e.onFormChange({everyAmount:n.target.value})}
|
|
1719
|
+
/>
|
|
1720
|
+
</label>
|
|
1721
|
+
<label class="field">
|
|
1722
|
+
<span>Unit</span>
|
|
1723
|
+
<select
|
|
1724
|
+
.value=${t.everyUnit}
|
|
1725
|
+
@change=${n=>e.onFormChange({everyUnit:n.target.value})}
|
|
1726
|
+
>
|
|
1727
|
+
<option value="minutes">Minutes</option>
|
|
1728
|
+
<option value="hours">Hours</option>
|
|
1729
|
+
<option value="days">Days</option>
|
|
1730
|
+
</select>
|
|
1731
|
+
</label>
|
|
1732
|
+
</div>
|
|
1733
|
+
`:p`
|
|
1734
|
+
<div class="form-grid" style="margin-top: 12px;">
|
|
1735
|
+
<label class="field">
|
|
1736
|
+
<span>Expression</span>
|
|
1737
|
+
<input
|
|
1738
|
+
.value=${t.cronExpr}
|
|
1739
|
+
@input=${n=>e.onFormChange({cronExpr:n.target.value})}
|
|
1740
|
+
/>
|
|
1741
|
+
</label>
|
|
1742
|
+
<label class="field">
|
|
1743
|
+
<span>Timezone (optional)</span>
|
|
1744
|
+
<input
|
|
1745
|
+
.value=${t.cronTz}
|
|
1746
|
+
@input=${n=>e.onFormChange({cronTz:n.target.value})}
|
|
1747
|
+
/>
|
|
1748
|
+
</label>
|
|
1749
|
+
</div>
|
|
1750
|
+
`}function Ro(e,t){return p`
|
|
1751
|
+
<div class="list-item">
|
|
1752
|
+
<div class="list-main">
|
|
1753
|
+
<div class="list-title">${e.name}</div>
|
|
1754
|
+
<div class="list-sub">${Eo(e)}</div>
|
|
1755
|
+
<div class="muted">${Co(e)}</div>
|
|
1756
|
+
<div class="chip-row" style="margin-top: 6px;">
|
|
1757
|
+
<span class="chip">${e.enabled?"enabled":"disabled"}</span>
|
|
1758
|
+
<span class="chip">${e.sessionTarget}</span>
|
|
1759
|
+
<span class="chip">${e.wakeMode}</span>
|
|
1760
|
+
</div>
|
|
1761
|
+
</div>
|
|
1762
|
+
<div class="list-meta">
|
|
1763
|
+
<div>${To(e)}</div>
|
|
1764
|
+
<div class="row" style="justify-content: flex-end; margin-top: 8px;">
|
|
1765
|
+
<button
|
|
1766
|
+
class="btn"
|
|
1767
|
+
?disabled=${t.busy}
|
|
1768
|
+
@click=${()=>t.onToggle(e,!e.enabled)}
|
|
1769
|
+
>
|
|
1770
|
+
${e.enabled?"Disable":"Enable"}
|
|
1771
|
+
</button>
|
|
1772
|
+
<button class="btn" ?disabled=${t.busy} @click=${()=>t.onRun(e)}>
|
|
1773
|
+
Run
|
|
1774
|
+
</button>
|
|
1775
|
+
<button
|
|
1776
|
+
class="btn"
|
|
1777
|
+
?disabled=${t.busy}
|
|
1778
|
+
@click=${()=>t.onLoadRuns(e.id)}
|
|
1779
|
+
>
|
|
1780
|
+
Runs
|
|
1781
|
+
</button>
|
|
1782
|
+
<button
|
|
1783
|
+
class="btn danger"
|
|
1784
|
+
?disabled=${t.busy}
|
|
1785
|
+
@click=${()=>t.onRemove(e)}
|
|
1786
|
+
>
|
|
1787
|
+
Remove
|
|
1788
|
+
</button>
|
|
1789
|
+
</div>
|
|
1790
|
+
</div>
|
|
1791
|
+
</div>
|
|
1792
|
+
`}function Lo(e){return p`
|
|
1793
|
+
<div class="list-item">
|
|
1794
|
+
<div class="list-main">
|
|
1795
|
+
<div class="list-title">${e.status}</div>
|
|
1796
|
+
<div class="list-sub">${e.summary??""}</div>
|
|
1797
|
+
</div>
|
|
1798
|
+
<div class="list-meta">
|
|
1799
|
+
<div>${at(e.ts)}</div>
|
|
1800
|
+
<div class="muted">${e.durationMs??0}ms</div>
|
|
1801
|
+
${e.error?p`<div class="muted">${e.error}</div>`:f}
|
|
1802
|
+
</div>
|
|
1803
|
+
</div>
|
|
1804
|
+
`}function Po(e){return p`
|
|
1805
|
+
<section class="grid grid-cols-2">
|
|
1806
|
+
<div class="card">
|
|
1807
|
+
<div class="row" style="justify-content: space-between;">
|
|
1808
|
+
<div>
|
|
1809
|
+
<div class="card-title">Snapshots</div>
|
|
1810
|
+
<div class="card-sub">Status, health, and heartbeat data.</div>
|
|
1811
|
+
</div>
|
|
1812
|
+
<button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
|
|
1813
|
+
${e.loading?"Refreshing…":"Refresh"}
|
|
1814
|
+
</button>
|
|
1815
|
+
</div>
|
|
1816
|
+
<div class="stack" style="margin-top: 12px;">
|
|
1817
|
+
<div>
|
|
1818
|
+
<div class="muted">Status</div>
|
|
1819
|
+
<pre class="code-block">${JSON.stringify(e.status??{},null,2)}</pre>
|
|
1820
|
+
</div>
|
|
1821
|
+
<div>
|
|
1822
|
+
<div class="muted">Health</div>
|
|
1823
|
+
<pre class="code-block">${JSON.stringify(e.health??{},null,2)}</pre>
|
|
1824
|
+
</div>
|
|
1825
|
+
<div>
|
|
1826
|
+
<div class="muted">Last heartbeat</div>
|
|
1827
|
+
<pre class="code-block">${JSON.stringify(e.heartbeat??{},null,2)}</pre>
|
|
1828
|
+
</div>
|
|
1829
|
+
</div>
|
|
1830
|
+
</div>
|
|
1831
|
+
|
|
1832
|
+
<div class="card">
|
|
1833
|
+
<div class="card-title">Manual RPC</div>
|
|
1834
|
+
<div class="card-sub">Send a raw gateway method with JSON params.</div>
|
|
1835
|
+
<div class="form-grid" style="margin-top: 16px;">
|
|
1836
|
+
<label class="field">
|
|
1837
|
+
<span>Method</span>
|
|
1838
|
+
<input
|
|
1839
|
+
.value=${e.callMethod}
|
|
1840
|
+
@input=${t=>e.onCallMethodChange(t.target.value)}
|
|
1841
|
+
placeholder="system-presence"
|
|
1842
|
+
/>
|
|
1843
|
+
</label>
|
|
1844
|
+
<label class="field">
|
|
1845
|
+
<span>Params (JSON)</span>
|
|
1846
|
+
<textarea
|
|
1847
|
+
.value=${e.callParams}
|
|
1848
|
+
@input=${t=>e.onCallParamsChange(t.target.value)}
|
|
1849
|
+
rows="6"
|
|
1850
|
+
></textarea>
|
|
1851
|
+
</label>
|
|
1852
|
+
</div>
|
|
1853
|
+
<div class="row" style="margin-top: 12px;">
|
|
1854
|
+
<button class="btn primary" @click=${e.onCall}>Call</button>
|
|
1855
|
+
</div>
|
|
1856
|
+
${e.callError?p`<div class="callout danger" style="margin-top: 12px;">
|
|
1857
|
+
${e.callError}
|
|
1858
|
+
</div>`:f}
|
|
1859
|
+
${e.callResult?p`<pre class="code-block" style="margin-top: 12px;">${e.callResult}</pre>`:f}
|
|
1860
|
+
</div>
|
|
1861
|
+
</section>
|
|
1862
|
+
|
|
1863
|
+
<section class="card" style="margin-top: 18px;">
|
|
1864
|
+
<div class="card-title">Models</div>
|
|
1865
|
+
<div class="card-sub">Catalog from models.list.</div>
|
|
1866
|
+
<pre class="code-block" style="margin-top: 12px;">${JSON.stringify(e.models??[],null,2)}</pre>
|
|
1867
|
+
</section>
|
|
1868
|
+
|
|
1869
|
+
<section class="card" style="margin-top: 18px;">
|
|
1870
|
+
<div class="card-title">Event Log</div>
|
|
1871
|
+
<div class="card-sub">Latest gateway events.</div>
|
|
1872
|
+
${e.eventLog.length===0?p`<div class="muted" style="margin-top: 12px;">No events yet.</div>`:p`
|
|
1873
|
+
<div class="list" style="margin-top: 12px;">
|
|
1874
|
+
${e.eventLog.map(t=>p`
|
|
1875
|
+
<div class="list-item">
|
|
1876
|
+
<div class="list-main">
|
|
1877
|
+
<div class="list-title">${t.event}</div>
|
|
1878
|
+
<div class="list-sub">${new Date(t.ts).toLocaleTimeString()}</div>
|
|
1879
|
+
</div>
|
|
1880
|
+
<div class="list-meta">
|
|
1881
|
+
<pre class="code-block">${Ao(t.payload)}</pre>
|
|
1882
|
+
</div>
|
|
1883
|
+
</div>
|
|
1884
|
+
`)}
|
|
1885
|
+
</div>
|
|
1886
|
+
`}
|
|
1887
|
+
</section>
|
|
1888
|
+
`}function Io(e){return p`
|
|
1889
|
+
<section class="card">
|
|
1890
|
+
<div class="row" style="justify-content: space-between;">
|
|
1891
|
+
<div>
|
|
1892
|
+
<div class="card-title">Connected Instances</div>
|
|
1893
|
+
<div class="card-sub">Presence beacons from the gateway and clients.</div>
|
|
1894
|
+
</div>
|
|
1895
|
+
<button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
|
|
1896
|
+
${e.loading?"Loading…":"Refresh"}
|
|
1897
|
+
</button>
|
|
1898
|
+
</div>
|
|
1899
|
+
${e.lastError?p`<div class="callout danger" style="margin-top: 12px;">
|
|
1900
|
+
${e.lastError}
|
|
1901
|
+
</div>`:f}
|
|
1902
|
+
${e.statusMessage?p`<div class="callout" style="margin-top: 12px;">
|
|
1903
|
+
${e.statusMessage}
|
|
1904
|
+
</div>`:f}
|
|
1905
|
+
<div class="list" style="margin-top: 16px;">
|
|
1906
|
+
${e.entries.length===0?p`<div class="muted">No instances reported yet.</div>`:e.entries.map(t=>Fo(t))}
|
|
1907
|
+
</div>
|
|
1908
|
+
</section>
|
|
1909
|
+
`}function Fo(e){const t=e.lastInputSeconds!=null?`${e.lastInputSeconds}s ago`:"n/a",n=e.mode??"unknown";return p`
|
|
1910
|
+
<div class="list-item">
|
|
1911
|
+
<div class="list-main">
|
|
1912
|
+
<div class="list-title">${e.host??"unknown host"}</div>
|
|
1913
|
+
<div class="list-sub">${wo(e)}</div>
|
|
1914
|
+
<div class="chip-row">
|
|
1915
|
+
<span class="chip">${n}</span>
|
|
1916
|
+
${e.platform?p`<span class="chip">${e.platform}</span>`:f}
|
|
1917
|
+
${e.deviceFamily?p`<span class="chip">${e.deviceFamily}</span>`:f}
|
|
1918
|
+
${e.modelIdentifier?p`<span class="chip">${e.modelIdentifier}</span>`:f}
|
|
1919
|
+
${e.version?p`<span class="chip">${e.version}</span>`:f}
|
|
1920
|
+
</div>
|
|
1921
|
+
</div>
|
|
1922
|
+
<div class="list-meta">
|
|
1923
|
+
<div>${So(e)}</div>
|
|
1924
|
+
<div class="muted">Last input ${t}</div>
|
|
1925
|
+
<div class="muted">Reason ${e.reason??""}</div>
|
|
1926
|
+
</div>
|
|
1927
|
+
</div>
|
|
1928
|
+
`}function No(e){return p`
|
|
1929
|
+
<section class="card">
|
|
1930
|
+
<div class="row" style="justify-content: space-between;">
|
|
1931
|
+
<div>
|
|
1932
|
+
<div class="card-title">Nodes</div>
|
|
1933
|
+
<div class="card-sub">Paired devices and live connections.</div>
|
|
1934
|
+
</div>
|
|
1935
|
+
<button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
|
|
1936
|
+
${e.loading?"Loading…":"Refresh"}
|
|
1937
|
+
</button>
|
|
1938
|
+
</div>
|
|
1939
|
+
<div class="list" style="margin-top: 16px;">
|
|
1940
|
+
${e.nodes.length===0?p`<div class="muted">No nodes found.</div>`:e.nodes.map(t=>Oo(t))}
|
|
1941
|
+
</div>
|
|
1942
|
+
</section>
|
|
1943
|
+
`}function Oo(e){const t=!!e.connected,n=!!e.paired,s=typeof e.displayName=="string"&&e.displayName.trim()||(typeof e.nodeId=="string"?e.nodeId:"unknown"),i=Array.isArray(e.caps)?e.caps:[],a=Array.isArray(e.commands)?e.commands:[];return p`
|
|
1944
|
+
<div class="list-item">
|
|
1945
|
+
<div class="list-main">
|
|
1946
|
+
<div class="list-title">${s}</div>
|
|
1947
|
+
<div class="list-sub">
|
|
1948
|
+
${typeof e.nodeId=="string"?e.nodeId:""}
|
|
1949
|
+
${typeof e.remoteIp=="string"?` · ${e.remoteIp}`:""}
|
|
1950
|
+
${typeof e.version=="string"?` · ${e.version}`:""}
|
|
1951
|
+
</div>
|
|
1952
|
+
<div class="chip-row" style="margin-top: 6px;">
|
|
1953
|
+
<span class="chip">${n?"paired":"unpaired"}</span>
|
|
1954
|
+
<span class="chip ${t?"chip-ok":"chip-warn"}">
|
|
1955
|
+
${t?"connected":"offline"}
|
|
1956
|
+
</span>
|
|
1957
|
+
${i.slice(0,12).map(l=>p`<span class="chip">${String(l)}</span>`)}
|
|
1958
|
+
${a.slice(0,8).map(l=>p`<span class="chip">${String(l)}</span>`)}
|
|
1959
|
+
</div>
|
|
1960
|
+
</div>
|
|
1961
|
+
</div>
|
|
1962
|
+
`}function Do(e){const t=e.hello?.snapshot,n=t?.uptimeMs?Ti(t.uptimeMs):"n/a",s=t?.policy?.tickIntervalMs?`${t.policy.tickIntervalMs}ms`:"n/a";return p`
|
|
1963
|
+
<section class="grid grid-cols-2">
|
|
1964
|
+
<div class="card">
|
|
1965
|
+
<div class="card-title">Gateway Access</div>
|
|
1966
|
+
<div class="card-sub">Where the dashboard connects and how it authenticates.</div>
|
|
1967
|
+
<div class="form-grid" style="margin-top: 16px;">
|
|
1968
|
+
<label class="field">
|
|
1969
|
+
<span>WebSocket URL</span>
|
|
1970
|
+
<input
|
|
1971
|
+
.value=${e.settings.gatewayUrl}
|
|
1972
|
+
@input=${i=>{const a=i.target.value;e.onSettingsChange({...e.settings,gatewayUrl:a})}}
|
|
1973
|
+
placeholder="ws://100.x.y.z:18789"
|
|
1974
|
+
/>
|
|
1975
|
+
</label>
|
|
1976
|
+
<label class="field">
|
|
1977
|
+
<span>Gateway Token</span>
|
|
1978
|
+
<input
|
|
1979
|
+
.value=${e.settings.token}
|
|
1980
|
+
@input=${i=>{const a=i.target.value;e.onSettingsChange({...e.settings,token:a})}}
|
|
1981
|
+
placeholder="CLAWDBOT_GATEWAY_TOKEN"
|
|
1982
|
+
/>
|
|
1983
|
+
</label>
|
|
1984
|
+
<label class="field">
|
|
1985
|
+
<span>Password (not stored)</span>
|
|
1986
|
+
<input
|
|
1987
|
+
type="password"
|
|
1988
|
+
.value=${e.password}
|
|
1989
|
+
@input=${i=>{const a=i.target.value;e.onPasswordChange(a)}}
|
|
1990
|
+
placeholder="system or shared password"
|
|
1991
|
+
/>
|
|
1992
|
+
</label>
|
|
1993
|
+
<label class="field">
|
|
1994
|
+
<span>Default Session Key</span>
|
|
1995
|
+
<input
|
|
1996
|
+
.value=${e.settings.sessionKey}
|
|
1997
|
+
@input=${i=>{const a=i.target.value;e.onSessionKeyChange(a)}}
|
|
1998
|
+
/>
|
|
1999
|
+
</label>
|
|
2000
|
+
</div>
|
|
2001
|
+
<div class="row" style="margin-top: 14px;">
|
|
2002
|
+
<button class="btn" @click=${()=>e.onRefresh()}>Refresh</button>
|
|
2003
|
+
<span class="muted">Reconnect to apply changes.</span>
|
|
2004
|
+
</div>
|
|
2005
|
+
</div>
|
|
2006
|
+
|
|
2007
|
+
<div class="card">
|
|
2008
|
+
<div class="card-title">Snapshot</div>
|
|
2009
|
+
<div class="card-sub">Latest gateway handshake information.</div>
|
|
2010
|
+
<div class="stat-grid" style="margin-top: 16px;">
|
|
2011
|
+
<div class="stat">
|
|
2012
|
+
<div class="stat-label">Status</div>
|
|
2013
|
+
<div class="stat-value ${e.connected?"ok":"warn"}">
|
|
2014
|
+
${e.connected?"Connected":"Disconnected"}
|
|
2015
|
+
</div>
|
|
2016
|
+
</div>
|
|
2017
|
+
<div class="stat">
|
|
2018
|
+
<div class="stat-label">Uptime</div>
|
|
2019
|
+
<div class="stat-value">${n}</div>
|
|
2020
|
+
</div>
|
|
2021
|
+
<div class="stat">
|
|
2022
|
+
<div class="stat-label">Tick Interval</div>
|
|
2023
|
+
<div class="stat-value">${s}</div>
|
|
2024
|
+
</div>
|
|
2025
|
+
<div class="stat">
|
|
2026
|
+
<div class="stat-label">Last Providers Refresh</div>
|
|
2027
|
+
<div class="stat-value">
|
|
2028
|
+
${e.lastProvidersRefresh?W(e.lastProvidersRefresh):"n/a"}
|
|
2029
|
+
</div>
|
|
2030
|
+
</div>
|
|
2031
|
+
</div>
|
|
2032
|
+
${e.lastError?p`<div class="callout danger" style="margin-top: 14px;">
|
|
2033
|
+
${e.lastError}
|
|
2034
|
+
</div>`:p`<div class="callout" style="margin-top: 14px;">
|
|
2035
|
+
Use Connections to link WhatsApp, Telegram, Discord, Signal, or iMessage.
|
|
2036
|
+
</div>`}
|
|
2037
|
+
</div>
|
|
2038
|
+
</section>
|
|
2039
|
+
|
|
2040
|
+
<section class="grid grid-cols-3" style="margin-top: 18px;">
|
|
2041
|
+
<div class="card stat-card">
|
|
2042
|
+
<div class="stat-label">Instances</div>
|
|
2043
|
+
<div class="stat-value">${e.presenceCount}</div>
|
|
2044
|
+
<div class="muted">Presence beacons in the last 5 minutes.</div>
|
|
2045
|
+
</div>
|
|
2046
|
+
<div class="card stat-card">
|
|
2047
|
+
<div class="stat-label">Sessions</div>
|
|
2048
|
+
<div class="stat-value">${e.sessionsCount??"n/a"}</div>
|
|
2049
|
+
<div class="muted">Recent session keys tracked by the gateway.</div>
|
|
2050
|
+
</div>
|
|
2051
|
+
<div class="card stat-card">
|
|
2052
|
+
<div class="stat-label">Cron</div>
|
|
2053
|
+
<div class="stat-value">
|
|
2054
|
+
${e.cronEnabled==null?"n/a":e.cronEnabled?"Enabled":"Disabled"}
|
|
2055
|
+
</div>
|
|
2056
|
+
<div class="muted">Next wake ${Ei(e.cronNext)}</div>
|
|
2057
|
+
</div>
|
|
2058
|
+
</section>
|
|
2059
|
+
|
|
2060
|
+
<section class="card" style="margin-top: 18px;">
|
|
2061
|
+
<div class="card-title">Notes</div>
|
|
2062
|
+
<div class="card-sub">Quick reminders for remote control setups.</div>
|
|
2063
|
+
<div class="note-grid" style="margin-top: 14px;">
|
|
2064
|
+
<div>
|
|
2065
|
+
<div class="note-title">Tailscale serve</div>
|
|
2066
|
+
<div class="muted">
|
|
2067
|
+
Prefer serve mode to keep the gateway on loopback with tailnet auth.
|
|
2068
|
+
</div>
|
|
2069
|
+
</div>
|
|
2070
|
+
<div>
|
|
2071
|
+
<div class="note-title">Session hygiene</div>
|
|
2072
|
+
<div class="muted">Use /new or sessions.patch to reset context.</div>
|
|
2073
|
+
</div>
|
|
2074
|
+
<div>
|
|
2075
|
+
<div class="note-title">Cron reminders</div>
|
|
2076
|
+
<div class="muted">Use isolated sessions for recurring runs.</div>
|
|
2077
|
+
</div>
|
|
2078
|
+
</div>
|
|
2079
|
+
</section>
|
|
2080
|
+
`}const Uo=["","off","minimal","low","medium","high"],Bo=["","off","on"];function Ho(e){const t=e.result?.sessions??[];return p`
|
|
2081
|
+
<section class="card">
|
|
2082
|
+
<div class="row" style="justify-content: space-between;">
|
|
2083
|
+
<div>
|
|
2084
|
+
<div class="card-title">Sessions</div>
|
|
2085
|
+
<div class="card-sub">Active session keys and per-session overrides.</div>
|
|
2086
|
+
</div>
|
|
2087
|
+
<button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
|
|
2088
|
+
${e.loading?"Loading…":"Refresh"}
|
|
2089
|
+
</button>
|
|
2090
|
+
</div>
|
|
2091
|
+
|
|
2092
|
+
<div class="filters" style="margin-top: 14px;">
|
|
2093
|
+
<label class="field">
|
|
2094
|
+
<span>Active within (minutes)</span>
|
|
2095
|
+
<input
|
|
2096
|
+
.value=${e.activeMinutes}
|
|
2097
|
+
@input=${n=>e.onFiltersChange({activeMinutes:n.target.value,limit:e.limit,includeGlobal:e.includeGlobal,includeUnknown:e.includeUnknown})}
|
|
2098
|
+
/>
|
|
2099
|
+
</label>
|
|
2100
|
+
<label class="field">
|
|
2101
|
+
<span>Limit</span>
|
|
2102
|
+
<input
|
|
2103
|
+
.value=${e.limit}
|
|
2104
|
+
@input=${n=>e.onFiltersChange({activeMinutes:e.activeMinutes,limit:n.target.value,includeGlobal:e.includeGlobal,includeUnknown:e.includeUnknown})}
|
|
2105
|
+
/>
|
|
2106
|
+
</label>
|
|
2107
|
+
<label class="field checkbox">
|
|
2108
|
+
<span>Include global</span>
|
|
2109
|
+
<input
|
|
2110
|
+
type="checkbox"
|
|
2111
|
+
.checked=${e.includeGlobal}
|
|
2112
|
+
@change=${n=>e.onFiltersChange({activeMinutes:e.activeMinutes,limit:e.limit,includeGlobal:n.target.checked,includeUnknown:e.includeUnknown})}
|
|
2113
|
+
/>
|
|
2114
|
+
</label>
|
|
2115
|
+
<label class="field checkbox">
|
|
2116
|
+
<span>Include unknown</span>
|
|
2117
|
+
<input
|
|
2118
|
+
type="checkbox"
|
|
2119
|
+
.checked=${e.includeUnknown}
|
|
2120
|
+
@change=${n=>e.onFiltersChange({activeMinutes:e.activeMinutes,limit:e.limit,includeGlobal:e.includeGlobal,includeUnknown:n.target.checked})}
|
|
2121
|
+
/>
|
|
2122
|
+
</label>
|
|
2123
|
+
</div>
|
|
2124
|
+
|
|
2125
|
+
${e.error?p`<div class="callout danger" style="margin-top: 12px;">${e.error}</div>`:f}
|
|
2126
|
+
|
|
2127
|
+
<div class="muted" style="margin-top: 12px;">
|
|
2128
|
+
${e.result?`Store: ${e.result.path}`:""}
|
|
2129
|
+
</div>
|
|
2130
|
+
|
|
2131
|
+
<div class="table" style="margin-top: 16px;">
|
|
2132
|
+
<div class="table-head">
|
|
2133
|
+
<div>Key</div>
|
|
2134
|
+
<div>Kind</div>
|
|
2135
|
+
<div>Updated</div>
|
|
2136
|
+
<div>Tokens</div>
|
|
2137
|
+
<div>Thinking</div>
|
|
2138
|
+
<div>Verbose</div>
|
|
2139
|
+
</div>
|
|
2140
|
+
${t.length===0?p`<div class="muted">No sessions found.</div>`:t.map(n=>Ko(n,e.onPatch))}
|
|
2141
|
+
</div>
|
|
2142
|
+
</section>
|
|
2143
|
+
`}function Ko(e,t){const n=e.updatedAt?W(e.updatedAt):"n/a",s=e.thinkingLevel??"",i=e.verboseLevel??"";return p`
|
|
2144
|
+
<div class="table-row">
|
|
2145
|
+
<div class="mono">${e.displayName??e.key}</div>
|
|
2146
|
+
<div>${e.kind}</div>
|
|
2147
|
+
<div>${n}</div>
|
|
2148
|
+
<div>${xo(e)}</div>
|
|
2149
|
+
<div>
|
|
2150
|
+
<select
|
|
2151
|
+
.value=${s}
|
|
2152
|
+
@change=${a=>{const l=a.target.value;t(e.key,{thinkingLevel:l||null})}}
|
|
2153
|
+
>
|
|
2154
|
+
${Uo.map(a=>p`<option value=${a}>${a||"inherit"}</option>`)}
|
|
2155
|
+
</select>
|
|
2156
|
+
</div>
|
|
2157
|
+
<div>
|
|
2158
|
+
<select
|
|
2159
|
+
.value=${i}
|
|
2160
|
+
@change=${a=>{const l=a.target.value;t(e.key,{verboseLevel:l||null})}}
|
|
2161
|
+
>
|
|
2162
|
+
${Bo.map(a=>p`<option value=${a}>${a||"inherit"}</option>`)}
|
|
2163
|
+
</select>
|
|
2164
|
+
</div>
|
|
2165
|
+
</div>
|
|
2166
|
+
`}function jo(e){const t=e.report?.skills??[],n=e.filter.trim().toLowerCase(),s=n?t.filter(i=>[i.name,i.description,i.source].join(" ").toLowerCase().includes(n)):t;return p`
|
|
2167
|
+
<section class="card">
|
|
2168
|
+
<div class="row" style="justify-content: space-between;">
|
|
2169
|
+
<div>
|
|
2170
|
+
<div class="card-title">Skills</div>
|
|
2171
|
+
<div class="card-sub">Bundled, managed, and workspace skills.</div>
|
|
2172
|
+
</div>
|
|
2173
|
+
<button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
|
|
2174
|
+
${e.loading?"Loading…":"Refresh"}
|
|
2175
|
+
</button>
|
|
2176
|
+
</div>
|
|
2177
|
+
|
|
2178
|
+
<div class="filters" style="margin-top: 14px;">
|
|
2179
|
+
<label class="field" style="flex: 1;">
|
|
2180
|
+
<span>Filter</span>
|
|
2181
|
+
<input
|
|
2182
|
+
.value=${e.filter}
|
|
2183
|
+
@input=${i=>e.onFilterChange(i.target.value)}
|
|
2184
|
+
placeholder="Search skills"
|
|
2185
|
+
/>
|
|
2186
|
+
</label>
|
|
2187
|
+
<div class="muted">${s.length} shown</div>
|
|
2188
|
+
</div>
|
|
2189
|
+
|
|
2190
|
+
${e.error?p`<div class="callout danger" style="margin-top: 12px;">${e.error}</div>`:f}
|
|
2191
|
+
|
|
2192
|
+
${s.length===0?p`<div class="muted" style="margin-top: 16px;">No skills found.</div>`:p`
|
|
2193
|
+
<div class="list" style="margin-top: 16px;">
|
|
2194
|
+
${s.map(i=>zo(i,e))}
|
|
2195
|
+
</div>
|
|
2196
|
+
`}
|
|
2197
|
+
</section>
|
|
2198
|
+
`}function zo(e,t){const n=t.busyKey===e.skillKey||t.busyKey===e.name,s=t.edits[e.skillKey]??"",i=[...e.missing.bins.map(l=>`bin:${l}`),...e.missing.env.map(l=>`env:${l}`),...e.missing.config.map(l=>`config:${l}`),...e.missing.os.map(l=>`os:${l}`)],a=[];return e.disabled&&a.push("disabled"),e.blockedByAllowlist&&a.push("blocked by allowlist"),p`
|
|
2199
|
+
<div class="list-item">
|
|
2200
|
+
<div class="list-main">
|
|
2201
|
+
<div class="list-title">
|
|
2202
|
+
${e.emoji?`${e.emoji} `:""}${e.name}
|
|
2203
|
+
</div>
|
|
2204
|
+
<div class="list-sub">${fo(e.description,140)}</div>
|
|
2205
|
+
<div class="chip-row" style="margin-top: 6px;">
|
|
2206
|
+
<span class="chip">${e.source}</span>
|
|
2207
|
+
<span class="chip ${e.eligible?"chip-ok":"chip-warn"}">
|
|
2208
|
+
${e.eligible?"eligible":"blocked"}
|
|
2209
|
+
</span>
|
|
2210
|
+
${e.disabled?p`<span class="chip chip-warn">disabled</span>`:f}
|
|
2211
|
+
</div>
|
|
2212
|
+
${i.length>0?p`
|
|
2213
|
+
<div class="muted" style="margin-top: 6px;">
|
|
2214
|
+
Missing: ${i.join(", ")}
|
|
2215
|
+
</div>
|
|
2216
|
+
`:f}
|
|
2217
|
+
${a.length>0?p`
|
|
2218
|
+
<div class="muted" style="margin-top: 6px;">
|
|
2219
|
+
Reason: ${a.join(", ")}
|
|
2220
|
+
</div>
|
|
2221
|
+
`:f}
|
|
2222
|
+
</div>
|
|
2223
|
+
<div class="list-meta">
|
|
2224
|
+
<div class="row" style="justify-content: flex-end; flex-wrap: wrap;">
|
|
2225
|
+
<button
|
|
2226
|
+
class="btn"
|
|
2227
|
+
?disabled=${n}
|
|
2228
|
+
@click=${()=>t.onToggle(e.skillKey,e.disabled)}
|
|
2229
|
+
>
|
|
2230
|
+
${e.disabled?"Enable":"Disable"}
|
|
2231
|
+
</button>
|
|
2232
|
+
${e.install.length>0?p`<button
|
|
2233
|
+
class="btn"
|
|
2234
|
+
?disabled=${n}
|
|
2235
|
+
@click=${()=>t.onInstall(e.name,e.install[0].id)}
|
|
2236
|
+
>
|
|
2237
|
+
${e.install[0].label}
|
|
2238
|
+
</button>`:f}
|
|
2239
|
+
</div>
|
|
2240
|
+
${e.primaryEnv?p`
|
|
2241
|
+
<div class="field" style="margin-top: 10px;">
|
|
2242
|
+
<span>API key</span>
|
|
2243
|
+
<input
|
|
2244
|
+
type="password"
|
|
2245
|
+
.value=${s}
|
|
2246
|
+
@input=${l=>t.onEdit(e.skillKey,l.target.value)}
|
|
2247
|
+
/>
|
|
2248
|
+
</div>
|
|
2249
|
+
<button
|
|
2250
|
+
class="btn primary"
|
|
2251
|
+
style="margin-top: 8px;"
|
|
2252
|
+
?disabled=${n}
|
|
2253
|
+
@click=${()=>t.onSaveKey(e.skillKey)}
|
|
2254
|
+
>
|
|
2255
|
+
Save key
|
|
2256
|
+
</button>
|
|
2257
|
+
`:f}
|
|
2258
|
+
</div>
|
|
2259
|
+
</div>
|
|
2260
|
+
`}const In={reactions:!0,stickers:!0,polls:!0,permissions:!0,messages:!0,threads:!0,pins:!0,search:!0,memberInfo:!0,roleInfo:!0,channelInfo:!0,voiceStatus:!0,events:!0,roles:!1,moderation:!1},fe={reactions:!0,messages:!0,pins:!0,memberInfo:!0,emojiList:!0};async function te(e,t){if(!(!e.client||!e.connected)&&!e.providersLoading){e.providersLoading=!0,e.providersError=null;try{const n=await e.client.request("providers.status",{probe:t,timeoutMs:8e3});e.providersSnapshot=n,e.providersLastSuccess=Date.now(),e.telegramTokenLocked=n.telegram.tokenSource==="env",e.discordTokenLocked=n.discord?.tokenSource==="env",e.slackTokenLocked=n.slack?.botTokenSource==="env",e.slackAppTokenLocked=n.slack?.appTokenSource==="env"}catch(n){e.providersError=String(n)}finally{e.providersLoading=!1}}}async function qo(e,t){if(!(!e.client||!e.connected||e.whatsappBusy)){e.whatsappBusy=!0;try{const n=await e.client.request("web.login.start",{force:t,timeoutMs:3e4});e.whatsappLoginMessage=n.message??null,e.whatsappLoginQrDataUrl=n.qrDataUrl??null,e.whatsappLoginConnected=null}catch(n){e.whatsappLoginMessage=String(n),e.whatsappLoginQrDataUrl=null,e.whatsappLoginConnected=null}finally{e.whatsappBusy=!1}}}async function Wo(e){if(!(!e.client||!e.connected||e.whatsappBusy)){e.whatsappBusy=!0;try{const t=await e.client.request("web.login.wait",{timeoutMs:12e4});e.whatsappLoginMessage=t.message??null,e.whatsappLoginConnected=t.connected??null,t.connected&&(e.whatsappLoginQrDataUrl=null)}catch(t){e.whatsappLoginMessage=String(t),e.whatsappLoginConnected=null}finally{e.whatsappBusy=!1}}}async function Go(e){if(!(!e.client||!e.connected||e.whatsappBusy)){e.whatsappBusy=!0;try{await e.client.request("web.logout",{}),e.whatsappLoginMessage="Logged out.",e.whatsappLoginQrDataUrl=null,e.whatsappLoginConnected=null}catch(t){e.whatsappLoginMessage=String(t)}finally{e.whatsappBusy=!1}}}function Yo(e,t){e.telegramForm={...e.telegramForm,...t}}function Jo(e,t){if(t.actions){e.discordForm={...e.discordForm,...t,actions:{...e.discordForm.actions,...t.actions}};return}e.discordForm={...e.discordForm,...t}}function Vo(e,t){if(t.actions){e.slackForm={...e.slackForm,...t,actions:{...e.slackForm.actions,...t.actions}};return}e.slackForm={...e.slackForm,...t}}function Zo(e,t){e.signalForm={...e.signalForm,...t}}function Qo(e,t){e.imessageForm={...e.imessageForm,...t}}async function Xo(e){if(!(!e.client||!e.connected)&&!e.telegramSaving){e.telegramSaving=!0,e.telegramConfigStatus=null;try{const n={...e.configSnapshot?.config??{}},s={...n.telegram??{}};if(!e.telegramTokenLocked){const g=e.telegramForm.token.trim();g?s.botToken=g:delete s.botToken}const i=s.groups&&typeof s.groups=="object"?{...s.groups}:{},a=i["*"]&&typeof i["*"]=="object"?{...i["*"]}:{};a.requireMention=e.telegramForm.requireMention,i["*"]=a,s.groups=i,delete s.requireMention;const l=pe(e.telegramForm.allowFrom);l.length>0?s.allowFrom=l:delete s.allowFrom;const r=e.telegramForm.proxy.trim();r?s.proxy=r:delete s.proxy;const o=e.telegramForm.webhookUrl.trim();o?s.webhookUrl=o:delete s.webhookUrl;const d=e.telegramForm.webhookSecret.trim();d?s.webhookSecret=d:delete s.webhookSecret;const u=e.telegramForm.webhookPath.trim();u?s.webhookPath=u:delete s.webhookPath,n.telegram=s;const h=`${JSON.stringify(n,null,2).trimEnd()}
|
|
2261
|
+
`;await e.client.request("config.set",{raw:h}),e.telegramConfigStatus="Saved. Restart gateway if needed."}catch(t){e.telegramConfigStatus=String(t)}finally{e.telegramSaving=!1}}}async function er(e){if(!(!e.client||!e.connected)&&!e.discordSaving){e.discordSaving=!0,e.discordConfigStatus=null;try{const n={...e.configSnapshot?.config??{}},s={...n.discord??{}},i=e.discordForm;if(i.enabled?delete s.enabled:s.enabled=!1,!e.discordTokenLocked){const S=i.token.trim();S?s.token=S:delete s.token}const a=pe(i.allowFrom),l=pe(i.groupChannels),r={...s.dm??{}};i.dmEnabled?delete r.enabled:r.enabled=!1,a.length>0?r.allowFrom=a:delete r.allowFrom,i.groupEnabled?r.groupEnabled=!0:delete r.groupEnabled,l.length>0?r.groupChannels=l:delete r.groupChannels,Object.keys(r).length>0?s.dm=r:delete s.dm;const o=Number(i.mediaMaxMb);Number.isFinite(o)&&o>0?s.mediaMaxMb=o:delete s.mediaMaxMb;const d=i.historyLimit.trim();if(d.length===0)delete s.historyLimit;else{const S=Number(d);Number.isFinite(S)&&S>=0?s.historyLimit=S:delete s.historyLimit}const u=i.textChunkLimit.trim();if(u.length===0)delete s.textChunkLimit;else{const S=Number(u);Number.isFinite(S)&&S>0?s.textChunkLimit=S:delete s.textChunkLimit}i.replyToMode==="off"?delete s.replyToMode:s.replyToMode=i.replyToMode;const h=Array.isArray(i.guilds)?i.guilds:[],g={};h.forEach(S=>{const R=String(S.key??"").trim();if(!R)return;const I={},_=String(S.slug??"").trim();_&&(I.slug=_),S.requireMention&&(I.requireMention=!0),(S.reactionNotifications==="off"||S.reactionNotifications==="all"||S.reactionNotifications==="own"||S.reactionNotifications==="allowlist")&&(I.reactionNotifications=S.reactionNotifications);const E=pe(S.users);E.length>0&&(I.users=E);const P={};(Array.isArray(S.channels)?S.channels:[]).forEach(F=>{const j=String(F.key??"").trim();if(!j)return;const Y={};F.allow===!1&&(Y.allow=!1),F.requireMention&&(Y.requireMention=!0),P[j]=Y}),Object.keys(P).length>0&&(I.channels=P),g[R]=I}),Object.keys(g).length>0?s.guilds=g:delete s.guilds;const $={},y=S=>{const R=i.actions[S];R!==In[S]&&($[S]=R)};y("reactions"),y("stickers"),y("polls"),y("permissions"),y("messages"),y("threads"),y("pins"),y("search"),y("memberInfo"),y("roleInfo"),y("channelInfo"),y("voiceStatus"),y("events"),y("roles"),y("moderation"),Object.keys($).length>0?s.actions=$:delete s.actions;const w={...s.slashCommand??{}};i.slashEnabled?w.enabled=!0:delete w.enabled,i.slashName.trim()?w.name=i.slashName.trim():delete w.name,i.slashSessionPrefix.trim()?w.sessionPrefix=i.slashSessionPrefix.trim():delete w.sessionPrefix,i.slashEphemeral?delete w.ephemeral:w.ephemeral=!1,Object.keys(w).length>0?s.slashCommand=w:delete s.slashCommand,Object.keys(s).length>0?n.discord=s:delete n.discord;const A=`${JSON.stringify(n,null,2).trimEnd()}
|
|
2262
|
+
`;await e.client.request("config.set",{raw:A}),e.discordConfigStatus="Saved. Restart gateway if needed."}catch(t){e.discordConfigStatus=String(t)}finally{e.discordSaving=!1}}}async function tr(e){if(!(!e.client||!e.connected)&&!e.slackSaving){e.slackSaving=!0,e.slackConfigStatus=null;try{const n={...e.configSnapshot?.config??{}},s={...n.slack??{}},i=e.slackForm;if(i.enabled?delete s.enabled:s.enabled=!1,!e.slackTokenLocked){const A=i.botToken.trim();A?s.botToken=A:delete s.botToken}if(!e.slackAppTokenLocked){const A=i.appToken.trim();A?s.appToken=A:delete s.appToken}const a={...s.dm??{}};a.enabled=i.dmEnabled;const l=pe(i.allowFrom);l.length>0?a.allowFrom=l:delete a.allowFrom,i.groupEnabled?a.groupEnabled=!0:delete a.groupEnabled;const r=pe(i.groupChannels);r.length>0?a.groupChannels=r:delete a.groupChannels,Object.keys(a).length>0?s.dm=a:delete s.dm;const o=Number.parseFloat(i.mediaMaxMb);Number.isFinite(o)&&o>0?s.mediaMaxMb=o:delete s.mediaMaxMb;const d=Number.parseInt(i.textChunkLimit,10);Number.isFinite(d)&&d>0?s.textChunkLimit=d:delete s.textChunkLimit,i.reactionNotifications==="own"?delete s.reactionNotifications:s.reactionNotifications=i.reactionNotifications;const u=pe(i.reactionAllowlist);u.length>0?s.reactionAllowlist=u:delete s.reactionAllowlist;const h={...s.slashCommand??{}};i.slashEnabled?h.enabled=!0:delete h.enabled,i.slashName.trim()?h.name=i.slashName.trim():delete h.name,i.slashSessionPrefix.trim()?h.sessionPrefix=i.slashSessionPrefix.trim():delete h.sessionPrefix,i.slashEphemeral?delete h.ephemeral:h.ephemeral=!1,Object.keys(h).length>0?s.slashCommand=h:delete s.slashCommand;const g={},$=A=>{const S=i.actions[A];S!==fe[A]&&(g[A]=S)};$("reactions"),$("messages"),$("pins"),$("memberInfo"),$("emojiList"),Object.keys(g).length>0?s.actions=g:delete s.actions;const y=i.channels.map(A=>{const S=A.key.trim();if(!S)return null;const R={allow:A.allow,requireMention:A.requireMention};return[S,R]}).filter(A=>!!A);y.length>0?s.channels=Object.fromEntries(y):delete s.channels,Object.keys(s).length>0?n.slack=s:delete n.slack;const w=`${JSON.stringify(n,null,2).trimEnd()}
|
|
2263
|
+
`;await e.client.request("config.set",{raw:w}),e.slackConfigStatus="Saved. Restart gateway if needed."}catch(t){e.slackConfigStatus=String(t)}finally{e.slackSaving=!1}}}async function nr(e){if(!(!e.client||!e.connected)&&!e.signalSaving){e.signalSaving=!0,e.signalConfigStatus=null;try{const n={...e.configSnapshot?.config??{}},s={...n.signal??{}},i=e.signalForm;i.enabled?delete s.enabled:s.enabled=!1;const a=i.account.trim();a?s.account=a:delete s.account;const l=i.httpUrl.trim();l?s.httpUrl=l:delete s.httpUrl;const r=i.httpHost.trim();r?s.httpHost=r:delete s.httpHost;const o=Number(i.httpPort);Number.isFinite(o)&&o>0?s.httpPort=o:delete s.httpPort;const d=i.cliPath.trim();d?s.cliPath=d:delete s.cliPath,i.autoStart?delete s.autoStart:s.autoStart=!1,i.receiveMode==="on-start"||i.receiveMode==="manual"?s.receiveMode=i.receiveMode:delete s.receiveMode,i.ignoreAttachments?s.ignoreAttachments=!0:delete s.ignoreAttachments,i.ignoreStories?s.ignoreStories=!0:delete s.ignoreStories,i.sendReadReceipts?s.sendReadReceipts=!0:delete s.sendReadReceipts;const u=pe(i.allowFrom);u.length>0?s.allowFrom=u:delete s.allowFrom;const h=Number(i.mediaMaxMb);Number.isFinite(h)&&h>0?s.mediaMaxMb=h:delete s.mediaMaxMb,Object.keys(s).length>0?n.signal=s:delete n.signal;const g=`${JSON.stringify(n,null,2).trimEnd()}
|
|
2264
|
+
`;await e.client.request("config.set",{raw:g}),e.signalConfigStatus="Saved. Restart gateway if needed."}catch(t){e.signalConfigStatus=String(t)}finally{e.signalSaving=!1}}}async function sr(e){if(!(!e.client||!e.connected)&&!e.imessageSaving){e.imessageSaving=!0,e.imessageConfigStatus=null;try{const n={...e.configSnapshot?.config??{}},s={...n.imessage??{}},i=e.imessageForm;i.enabled?delete s.enabled:s.enabled=!1;const a=i.cliPath.trim();a?s.cliPath=a:delete s.cliPath;const l=i.dbPath.trim();l?s.dbPath=l:delete s.dbPath,i.service==="auto"?delete s.service:s.service=i.service;const r=i.region.trim();r?s.region=r:delete s.region;const o=pe(i.allowFrom);o.length>0?s.allowFrom=o:delete s.allowFrom,i.includeAttachments?s.includeAttachments=!0:delete s.includeAttachments;const d=Number(i.mediaMaxMb);Number.isFinite(d)&&d>0?s.mediaMaxMb=d:delete s.mediaMaxMb,Object.keys(s).length>0?n.imessage=s:delete n.imessage;const u=`${JSON.stringify(n,null,2).trimEnd()}
|
|
2265
|
+
`;await e.client.request("config.set",{raw:u}),e.imessageConfigStatus="Saved. Restart gateway if needed."}catch(t){e.imessageConfigStatus=String(t)}finally{e.imessageSaving=!1}}}async function mn(e){if(!(!e.client||!e.connected)&&!e.presenceLoading){e.presenceLoading=!0,e.presenceError=null,e.presenceStatus=null;try{const t=await e.client.request("system-presence",{});Array.isArray(t)?(e.presenceEntries=t,e.presenceStatus=t.length===0?"No instances yet.":null):(e.presenceEntries=[],e.presenceStatus="No presence payload.")}catch(t){e.presenceError=String(t)}finally{e.presenceLoading=!1}}}async function et(e){if(!(!e.client||!e.connected)&&!e.sessionsLoading){e.sessionsLoading=!0,e.sessionsError=null;try{const t={includeGlobal:e.sessionsIncludeGlobal,includeUnknown:e.sessionsIncludeUnknown},n=Mt(e.sessionsFilterActive,0),s=Mt(e.sessionsFilterLimit,0);n>0&&(t.activeMinutes=n),s>0&&(t.limit=s);const i=await e.client.request("sessions.list",t);i&&(e.sessionsResult=i)}catch(t){e.sessionsError=String(t)}finally{e.sessionsLoading=!1}}}async function ir(e,t,n){if(!e.client||!e.connected)return;const s={key:t};"thinkingLevel"in n&&(s.thinkingLevel=n.thinkingLevel),"verboseLevel"in n&&(s.verboseLevel=n.verboseLevel);try{await e.client.request("sessions.patch",s),await et(e)}catch(i){e.sessionsError=String(i)}}async function ct(e){if(!(!e.client||!e.connected)&&!e.skillsLoading){e.skillsLoading=!0,e.skillsError=null;try{const t=await e.client.request("skills.status",{});t&&(e.skillsReport=t)}catch(t){e.skillsError=String(t)}finally{e.skillsLoading=!1}}}function ar(e,t,n){e.skillEdits={...e.skillEdits,[t]:n}}async function lr(e,t,n){if(!(!e.client||!e.connected)){e.skillsBusyKey=t,e.skillsError=null;try{await e.client.request("skills.update",{skillKey:t,enabled:n}),await ct(e)}catch(s){e.skillsError=String(s)}finally{e.skillsBusyKey=null}}}async function or(e,t){if(!(!e.client||!e.connected)){e.skillsBusyKey=t,e.skillsError=null;try{const n=e.skillEdits[t]??"";await e.client.request("skills.update",{skillKey:t,apiKey:n}),await ct(e)}catch(n){e.skillsError=String(n)}finally{e.skillsBusyKey=null}}}async function rr(e,t,n){if(!(!e.client||!e.connected)){e.skillsBusyKey=t,e.skillsError=null;try{await e.client.request("skills.install",{name:t,installId:n,timeoutMs:12e4}),await ct(e)}catch(s){e.skillsError=String(s)}finally{e.skillsBusyKey=null}}}async function xt(e,t){if(!(!e.client||!e.connected)&&!e.nodesLoading){e.nodesLoading=!0,t?.quiet||(e.lastError=null);try{const n=await e.client.request("node.list",{});e.nodes=Array.isArray(n.nodes)?n.nodes:[]}catch(n){t?.quiet||(e.lastError=String(n))}finally{e.nodesLoading=!1}}}async function tt(e){if(!(!e.client||!e.connected)){e.chatLoading=!0,e.lastError=null;try{const t=await e.client.request("chat.history",{sessionKey:e.sessionKey,limit:200});e.chatMessages=Array.isArray(t.messages)?t.messages:[],e.chatThinkingLevel=t.thinkingLevel??null}catch(t){e.lastError=String(t)}finally{e.chatLoading=!1}}}async function cr(e){if(!e.client||!e.connected)return!1;const t=e.chatMessage.trim();if(!t)return!1;const n=Date.now();e.chatMessages=[...e.chatMessages,{role:"user",content:[{type:"text",text:t}],timestamp:n}],e.chatSending=!0,e.chatMessage="",e.lastError=null;const s=Ys();e.chatRunId=s,e.chatStream="",e.chatStreamStartedAt=n;try{return await e.client.request("chat.send",{sessionKey:e.sessionKey,message:t,deliver:!1,idempotencyKey:s}),!0}catch(i){const a=String(i);return e.chatRunId=null,e.chatStream=null,e.chatStreamStartedAt=null,e.chatMessage=t,e.lastError=a,e.chatMessages=[...e.chatMessages,{role:"assistant",content:[{type:"text",text:"Error: "+a}],timestamp:Date.now()}],!1}finally{e.chatSending=!1}}function dr(e,t){if(!t||t.sessionKey!==e.sessionKey||t.runId&&e.chatRunId&&t.runId!==e.chatRunId)return null;if(t.state==="delta"){const n=ur(t.message);if(typeof n=="string"){const s=e.chatStream??"";(!s||n.length>=s.length)&&(e.chatStream=n)}}else t.state==="final"||t.state==="aborted"?(e.chatStream=null,e.chatRunId=null,e.chatStreamStartedAt=null):t.state==="error"&&(e.chatStream=null,e.chatRunId=null,e.chatStreamStartedAt=null,e.lastError=t.errorMessage??"chat error");return t.state}function ur(e){const t=e,n=t.content;if(typeof n=="string")return n;if(Array.isArray(n)){const s=n.map(i=>{const a=i;return a.type==="text"&&typeof a.text=="string"?a.text:null}).filter(i=>typeof i=="string");if(s.length>0)return s.join(`
|
|
2266
|
+
`)}return typeof t.text=="string"?t.text:null}async function he(e){if(!(!e.client||!e.connected)){e.configLoading=!0,e.lastError=null;try{const t=await e.client.request("config.get",{});gr(e,t)}catch(t){e.lastError=String(t)}finally{e.configLoading=!1}}}async function hr(e){if(!(!e.client||!e.connected)&&!e.configSchemaLoading){e.configSchemaLoading=!0;try{const t=await e.client.request("config.schema",{});pr(e,t)}catch(t){e.lastError=String(t)}finally{e.configSchemaLoading=!1}}}function pr(e,t){e.configSchema=t.schema??null,e.configUiHints=t.uiHints??{},e.configSchemaVersion=t.version??null}function gr(e,t){e.configSnapshot=t,typeof t.raw=="string"?e.configRaw=t.raw:t.config&&typeof t.config=="object"&&(e.configRaw=`${JSON.stringify(t.config,null,2).trimEnd()}
|
|
2267
|
+
`),e.configValid=typeof t.valid=="boolean"?t.valid:null,e.configIssues=Array.isArray(t.issues)?t.issues:[];const n=t.config??{},s=n.telegram??{},i=n.discord??{},a=n.slack??{},l=n.signal??{},r=n.imessage??{},o=P=>Array.isArray(P)?P.map(O=>String(O??"").trim()).filter(O=>O.length>0).join(", "):"",d=s.groups&&typeof s.groups=="object"?s.groups:{},u=d["*"]&&typeof d["*"]=="object"?d["*"]:{},h=Array.isArray(s.allowFrom)?o(s.allowFrom):typeof s.allowFrom=="string"?s.allowFrom:"";e.telegramForm={token:typeof s.botToken=="string"?s.botToken:"",requireMention:typeof u.requireMention=="boolean"?u.requireMention:!0,allowFrom:h,proxy:typeof s.proxy=="string"?s.proxy:"",webhookUrl:typeof s.webhookUrl=="string"?s.webhookUrl:"",webhookSecret:typeof s.webhookSecret=="string"?s.webhookSecret:"",webhookPath:typeof s.webhookPath=="string"?s.webhookPath:""};const g=i.dm??{},$=i.slashCommand??{},y=i.actions??{},w=i.guilds,A=P=>typeof y[P]=="boolean"?y[P]:In[P];e.discordForm={enabled:typeof i.enabled=="boolean"?i.enabled:!0,token:typeof i.token=="string"?i.token:"",dmEnabled:typeof g.enabled=="boolean"?g.enabled:!0,allowFrom:o(g.allowFrom),groupEnabled:typeof g.groupEnabled=="boolean"?g.groupEnabled:!1,groupChannels:o(g.groupChannels),mediaMaxMb:typeof i.mediaMaxMb=="number"?String(i.mediaMaxMb):"",historyLimit:typeof i.historyLimit=="number"?String(i.historyLimit):"",textChunkLimit:typeof i.textChunkLimit=="number"?String(i.textChunkLimit):"",replyToMode:i.replyToMode==="first"||i.replyToMode==="all"?i.replyToMode:"off",guilds:Array.isArray(w)?[]:typeof w=="object"&&w?Object.entries(w).map(([P,O])=>{const F=O&&typeof O=="object"?O:{},j=F.channels&&typeof F.channels=="object"?F.channels:{},Y=Object.entries(j).map(([D,ve])=>{const ge=ve&&typeof ve=="object"?ve:{};return{key:D,allow:typeof ge.allow=="boolean"?ge.allow:!0,requireMention:typeof ge.requireMention=="boolean"?ge.requireMention:!1}});return{key:P,slug:typeof F.slug=="string"?F.slug:"",requireMention:typeof F.requireMention=="boolean"?F.requireMention:!1,reactionNotifications:F.reactionNotifications==="off"||F.reactionNotifications==="all"||F.reactionNotifications==="own"||F.reactionNotifications==="allowlist"?F.reactionNotifications:"own",users:o(F.users),channels:Y}}):[],actions:{reactions:A("reactions"),stickers:A("stickers"),polls:A("polls"),permissions:A("permissions"),messages:A("messages"),threads:A("threads"),pins:A("pins"),search:A("search"),memberInfo:A("memberInfo"),roleInfo:A("roleInfo"),channelInfo:A("channelInfo"),voiceStatus:A("voiceStatus"),events:A("events"),roles:A("roles"),moderation:A("moderation")},slashEnabled:typeof $.enabled=="boolean"?$.enabled:!1,slashName:typeof $.name=="string"?$.name:"",slashSessionPrefix:typeof $.sessionPrefix=="string"?$.sessionPrefix:"",slashEphemeral:typeof $.ephemeral=="boolean"?$.ephemeral:!0};const S=a.dm??{},R=a.channels,I=a.slashCommand??{},_=a.actions??{};e.slackForm={enabled:typeof a.enabled=="boolean"?a.enabled:!0,botToken:typeof a.botToken=="string"?a.botToken:"",appToken:typeof a.appToken=="string"?a.appToken:"",dmEnabled:typeof S.enabled=="boolean"?S.enabled:!0,allowFrom:o(S.allowFrom),groupEnabled:typeof S.groupEnabled=="boolean"?S.groupEnabled:!1,groupChannels:o(S.groupChannels),mediaMaxMb:typeof a.mediaMaxMb=="number"?String(a.mediaMaxMb):"",textChunkLimit:typeof a.textChunkLimit=="number"?String(a.textChunkLimit):"",reactionNotifications:a.reactionNotifications==="off"||a.reactionNotifications==="all"||a.reactionNotifications==="allowlist"?a.reactionNotifications:"own",reactionAllowlist:o(a.reactionAllowlist),slashEnabled:typeof I.enabled=="boolean"?I.enabled:!1,slashName:typeof I.name=="string"?I.name:"",slashSessionPrefix:typeof I.sessionPrefix=="string"?I.sessionPrefix:"",slashEphemeral:typeof I.ephemeral=="boolean"?I.ephemeral:!0,actions:{...fe,reactions:typeof _.reactions=="boolean"?_.reactions:fe.reactions,messages:typeof _.messages=="boolean"?_.messages:fe.messages,pins:typeof _.pins=="boolean"?_.pins:fe.pins,memberInfo:typeof _.memberInfo=="boolean"?_.memberInfo:fe.memberInfo,emojiList:typeof _.emojiList=="boolean"?_.emojiList:fe.emojiList},channels:Array.isArray(R)?[]:typeof R=="object"&&R?Object.entries(R).map(([P,O])=>{const F=O&&typeof O=="object"?O:{};return{key:P,allow:typeof F.allow=="boolean"?F.allow:!0,requireMention:typeof F.requireMention=="boolean"?F.requireMention:!1}}):[]},e.signalForm={enabled:typeof l.enabled=="boolean"?l.enabled:!0,account:typeof l.account=="string"?l.account:"",httpUrl:typeof l.httpUrl=="string"?l.httpUrl:"",httpHost:typeof l.httpHost=="string"?l.httpHost:"",httpPort:typeof l.httpPort=="number"?String(l.httpPort):"",cliPath:typeof l.cliPath=="string"?l.cliPath:"",autoStart:typeof l.autoStart=="boolean"?l.autoStart:!0,receiveMode:l.receiveMode==="on-start"||l.receiveMode==="manual"?l.receiveMode:"",ignoreAttachments:typeof l.ignoreAttachments=="boolean"?l.ignoreAttachments:!1,ignoreStories:typeof l.ignoreStories=="boolean"?l.ignoreStories:!1,sendReadReceipts:typeof l.sendReadReceipts=="boolean"?l.sendReadReceipts:!1,allowFrom:o(l.allowFrom),mediaMaxMb:typeof l.mediaMaxMb=="number"?String(l.mediaMaxMb):""},e.imessageForm={enabled:typeof r.enabled=="boolean"?r.enabled:!0,cliPath:typeof r.cliPath=="string"?r.cliPath:"",dbPath:typeof r.dbPath=="string"?r.dbPath:"",service:r.service==="imessage"||r.service==="sms"||r.service==="auto"?r.service:"auto",region:typeof r.region=="string"?r.region:"",allowFrom:o(r.allowFrom),includeAttachments:typeof r.includeAttachments=="boolean"?r.includeAttachments:!1,mediaMaxMb:typeof r.mediaMaxMb=="number"?String(r.mediaMaxMb):""};const E=t.valid===!1?"Config invalid.":null;e.telegramConfigStatus=E,e.discordConfigStatus=E,e.slackConfigStatus=E,e.signalConfigStatus=E,e.imessageConfigStatus=E,e.configFormDirty||(e.configForm=Ci(t.config??{}))}async function fr(e){if(!(!e.client||!e.connected)){e.configSaving=!0,e.lastError=null;try{const t=e.configFormMode==="form"&&e.configForm?`${JSON.stringify(e.configForm,null,2).trimEnd()}
|
|
2268
|
+
`:e.configRaw;await e.client.request("config.set",{raw:t}),e.configFormDirty=!1,await he(e)}catch(t){e.lastError=String(t)}finally{e.configSaving=!1}}}function mr(e,t,n){const s=Ci(e.configForm??e.configSnapshot?.config??{});br(s,t,n),e.configForm=s,e.configFormDirty=!0}function Ci(e){return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}function br(e,t,n){if(t.length===0)return;let s=e;for(let a=0;a<t.length-1;a+=1){const l=t[a],r=t[a+1];if(typeof l=="number"){if(!Array.isArray(s))return;s[l]==null&&(s[l]=typeof r=="number"?[]:{}),s=s[l]}else{if(typeof s!="object"||s==null)return;const o=s;o[l]==null&&(o[l]=typeof r=="number"?[]:{}),s=o[l]}}const i=t[t.length-1];if(typeof i=="number"){Array.isArray(s)&&(s[i]=n);return}typeof s=="object"&&s!=null&&(s[i]=n)}async function lt(e){if(!(!e.client||!e.connected))try{const t=await e.client.request("cron.status",{});e.cronStatus=t}catch(t){e.cronError=String(t)}}async function Ot(e){if(!(!e.client||!e.connected)&&!e.cronLoading){e.cronLoading=!0,e.cronError=null;try{const t=await e.client.request("cron.list",{includeDisabled:!0});e.cronJobs=Array.isArray(t.jobs)?t.jobs:[]}catch(t){e.cronError=String(t)}finally{e.cronLoading=!1}}}function vr(e){if(e.scheduleKind==="at"){const n=Date.parse(e.scheduleAt);if(!Number.isFinite(n))throw new Error("Invalid run time.");return{kind:"at",atMs:n}}if(e.scheduleKind==="every"){const n=Mt(e.everyAmount,0);if(n<=0)throw new Error("Invalid interval amount.");const s=e.everyUnit;return{kind:"every",everyMs:n*(s==="minutes"?6e4:s==="hours"?36e5:864e5)}}const t=e.cronExpr.trim();if(!t)throw new Error("Cron expression required.");return{kind:"cron",expr:t,tz:e.cronTz.trim()||void 0}}function yr(e){if(e.payloadKind==="systemEvent"){const i=e.payloadText.trim();if(!i)throw new Error("System event text required.");return{kind:"systemEvent",text:i}}const t=e.payloadText.trim();if(!t)throw new Error("Agent message required.");const n={kind:"agentTurn",message:t};e.deliver&&(n.deliver=!0),e.provider&&(n.provider=e.provider),e.to.trim()&&(n.to=e.to.trim());const s=Mt(e.timeoutSeconds,0);return s>0&&(n.timeoutSeconds=s),n}async function kr(e){if(!(!e.client||!e.connected||e.cronBusy)){e.cronBusy=!0,e.cronError=null;try{const t=vr(e.cronForm),n=yr(e.cronForm),s={name:e.cronForm.name.trim(),description:e.cronForm.description.trim()||void 0,enabled:e.cronForm.enabled,schedule:t,sessionTarget:e.cronForm.sessionTarget,wakeMode:e.cronForm.wakeMode,payload:n,isolation:e.cronForm.postToMainPrefix.trim()&&e.cronForm.sessionTarget==="isolated"?{postToMainPrefix:e.cronForm.postToMainPrefix.trim()}:void 0};if(!s.name)throw new Error("Name required.");await e.client.request("cron.add",s),e.cronForm={...e.cronForm,name:"",description:"",payloadText:""},await Ot(e),await lt(e)}catch(t){e.cronError=String(t)}finally{e.cronBusy=!1}}}async function $r(e,t,n){if(!(!e.client||!e.connected||e.cronBusy)){e.cronBusy=!0,e.cronError=null;try{await e.client.request("cron.update",{id:t.id,patch:{enabled:n}}),await Ot(e),await lt(e)}catch(s){e.cronError=String(s)}finally{e.cronBusy=!1}}}async function wr(e,t){if(!(!e.client||!e.connected||e.cronBusy)){e.cronBusy=!0,e.cronError=null;try{await e.client.request("cron.run",{id:t.id,mode:"force"}),await _i(e,t.id)}catch(n){e.cronError=String(n)}finally{e.cronBusy=!1}}}async function Sr(e,t){if(!(!e.client||!e.connected||e.cronBusy)){e.cronBusy=!0,e.cronError=null;try{await e.client.request("cron.remove",{id:t.id}),e.cronRunsJobId===t.id&&(e.cronRunsJobId=null,e.cronRuns=[]),await Ot(e),await lt(e)}catch(n){e.cronError=String(n)}finally{e.cronBusy=!1}}}async function _i(e,t){if(!(!e.client||!e.connected))try{const n=await e.client.request("cron.runs",{id:t,limit:50});e.cronRunsJobId=t,e.cronRuns=Array.isArray(n.entries)?n.entries:[]}catch(n){e.cronError=String(n)}}async function bn(e){if(!(!e.client||!e.connected)&&!e.debugLoading){e.debugLoading=!0;try{const[t,n,s,i]=await Promise.all([e.client.request("status",{}),e.client.request("health",{}),e.client.request("models.list",{}),e.client.request("last-heartbeat",{})]);e.debugStatus=t,e.debugHealth=n;const a=s;e.debugModels=Array.isArray(a?.models)?a?.models:[],e.debugHeartbeat=i}catch(t){e.debugCallError=String(t)}finally{e.debugLoading=!1}}}async function xr(e){if(!(!e.client||!e.connected)){e.debugCallError=null,e.debugCallResult=null;try{const t=e.debugCallParams.trim()?JSON.parse(e.debugCallParams):{},n=await e.client.request(e.debugCallMethod.trim(),t);e.debugCallResult=JSON.stringify(n,null,2)}catch(t){e.debugCallError=String(t)}}}function Ar(e){const t=e.presenceEntries.length,n=e.sessionsResult?.count??null,s=e.cronStatus?.nextWakeAtMs??null,i=e.connected?null:"Disconnected from gateway.",a=e.tab==="chat",l=a&&e.settings.chatFocusMode;return p`
|
|
2269
|
+
<div class="shell ${a?"shell--chat":""} ${l?"shell--chat-focus":""}">
|
|
2270
|
+
<header class="topbar">
|
|
2271
|
+
<div class="brand">
|
|
2272
|
+
<div class="brand-title">Nexus Control</div>
|
|
2273
|
+
<div class="brand-sub">Gateway dashboard</div>
|
|
2274
|
+
</div>
|
|
2275
|
+
<div class="topbar-status">
|
|
2276
|
+
<div class="pill">
|
|
2277
|
+
<span class="statusDot ${e.connected?"ok":""}"></span>
|
|
2278
|
+
<span>Health</span>
|
|
2279
|
+
<span class="mono">${e.connected?"OK":"Offline"}</span>
|
|
2280
|
+
</div>
|
|
2281
|
+
${Cr(e)}
|
|
2282
|
+
</div>
|
|
2283
|
+
</header>
|
|
2284
|
+
<aside class="nav">
|
|
2285
|
+
${ka.map(r=>p`
|
|
2286
|
+
<div class="nav-group">
|
|
2287
|
+
<div class="nav-label">${r.label}</div>
|
|
2288
|
+
${r.tabs.map(o=>Tr(e,o))}
|
|
2289
|
+
</div>
|
|
2290
|
+
`)}
|
|
2291
|
+
</aside>
|
|
2292
|
+
<main class="content ${a?"content--chat":""}">
|
|
2293
|
+
<section class="content-header">
|
|
2294
|
+
<div>
|
|
2295
|
+
<div class="page-title">${Xs(e.tab)}</div>
|
|
2296
|
+
<div class="page-sub">${wa(e.tab)}</div>
|
|
2297
|
+
</div>
|
|
2298
|
+
<div class="page-meta">
|
|
2299
|
+
${e.lastError?p`<div class="pill danger">${e.lastError}</div>`:f}
|
|
2300
|
+
</div>
|
|
2301
|
+
</section>
|
|
2302
|
+
|
|
2303
|
+
${e.tab==="overview"?Do({connected:e.connected,hello:e.hello,settings:e.settings,password:e.password,lastError:e.lastError,presenceCount:t,sessionsCount:n,cronEnabled:e.cronStatus?.enabled??null,cronNext:s,lastProvidersRefresh:e.providersLastSuccess,onSettingsChange:r=>e.applySettings(r),onPasswordChange:r=>e.password=r,onSessionKeyChange:r=>{e.sessionKey=r,e.chatMessage="",e.resetToolStream(),e.applySettings({...e.settings,sessionKey:r})},onRefresh:()=>e.loadOverview()}):f}
|
|
2304
|
+
|
|
2305
|
+
${e.tab==="connections"?vo({connected:e.connected,loading:e.providersLoading,snapshot:e.providersSnapshot,lastError:e.providersError,lastSuccessAt:e.providersLastSuccess,whatsappMessage:e.whatsappLoginMessage,whatsappQrDataUrl:e.whatsappLoginQrDataUrl,whatsappConnected:e.whatsappLoginConnected,whatsappBusy:e.whatsappBusy,telegramForm:e.telegramForm,telegramTokenLocked:e.telegramTokenLocked,telegramSaving:e.telegramSaving,telegramStatus:e.telegramConfigStatus,discordForm:e.discordForm,discordTokenLocked:e.discordTokenLocked,discordSaving:e.discordSaving,discordStatus:e.discordConfigStatus,slackForm:e.slackForm,slackTokenLocked:e.slackTokenLocked,slackAppTokenLocked:e.slackAppTokenLocked,slackSaving:e.slackSaving,slackStatus:e.slackConfigStatus,signalForm:e.signalForm,signalSaving:e.signalSaving,signalStatus:e.signalConfigStatus,imessageForm:e.imessageForm,imessageSaving:e.imessageSaving,imessageStatus:e.imessageConfigStatus,onRefresh:r=>te(e,r),onWhatsAppStart:r=>e.handleWhatsAppStart(r),onWhatsAppWait:()=>e.handleWhatsAppWait(),onWhatsAppLogout:()=>e.handleWhatsAppLogout(),onTelegramChange:r=>Yo(e,r),onTelegramSave:()=>e.handleTelegramSave(),onDiscordChange:r=>Jo(e,r),onDiscordSave:()=>e.handleDiscordSave(),onSlackChange:r=>Vo(e,r),onSlackSave:()=>e.handleSlackSave(),onSignalChange:r=>Zo(e,r),onSignalSave:()=>e.handleSignalSave(),onIMessageChange:r=>Qo(e,r),onIMessageSave:()=>e.handleIMessageSave()}):f}
|
|
2306
|
+
|
|
2307
|
+
${e.tab==="instances"?Io({loading:e.presenceLoading,entries:e.presenceEntries,lastError:e.presenceError,statusMessage:e.presenceStatus,onRefresh:()=>mn(e)}):f}
|
|
2308
|
+
|
|
2309
|
+
${e.tab==="sessions"?Ho({loading:e.sessionsLoading,result:e.sessionsResult,error:e.sessionsError,activeMinutes:e.sessionsFilterActive,limit:e.sessionsFilterLimit,includeGlobal:e.sessionsIncludeGlobal,includeUnknown:e.sessionsIncludeUnknown,onFiltersChange:r=>{e.sessionsFilterActive=r.activeMinutes,e.sessionsFilterLimit=r.limit,e.sessionsIncludeGlobal=r.includeGlobal,e.sessionsIncludeUnknown=r.includeUnknown},onRefresh:()=>et(e),onPatch:(r,o)=>ir(e,r,o)}):f}
|
|
2310
|
+
|
|
2311
|
+
${e.tab==="cron"?_o({loading:e.cronLoading,status:e.cronStatus,jobs:e.cronJobs,error:e.cronError,busy:e.cronBusy,form:e.cronForm,runsJobId:e.cronRunsJobId,runs:e.cronRuns,onFormChange:r=>e.cronForm={...e.cronForm,...r},onRefresh:()=>e.loadCron(),onAdd:()=>kr(e),onToggle:(r,o)=>$r(e,r,o),onRun:r=>wr(e,r),onRemove:r=>Sr(e,r),onLoadRuns:r=>_i(e,r)}):f}
|
|
2312
|
+
|
|
2313
|
+
${e.tab==="skills"?jo({loading:e.skillsLoading,report:e.skillsReport,error:e.skillsError,filter:e.skillsFilter,edits:e.skillEdits,busyKey:e.skillsBusyKey,onFilterChange:r=>e.skillsFilter=r,onRefresh:()=>ct(e),onToggle:(r,o)=>lr(e,r,o),onEdit:(r,o)=>ar(e,r,o),onSaveKey:r=>or(e,r),onInstall:(r,o)=>rr(e,r,o)}):f}
|
|
2314
|
+
|
|
2315
|
+
${e.tab==="nodes"?No({loading:e.nodesLoading,nodes:e.nodes,onRefresh:()=>xt(e)}):f}
|
|
2316
|
+
|
|
2317
|
+
${e.tab==="chat"?Vl({sessionKey:e.sessionKey,onSessionKeyChange:r=>{e.sessionKey=r,e.chatMessage="",e.chatStream=null,e.chatStreamStartedAt=null,e.chatRunId=null,e.resetToolStream(),e.resetChatScroll(),e.applySettings({...e.settings,sessionKey:r}),tt(e)},thinkingLevel:e.chatThinkingLevel,loading:e.chatLoading,sending:e.chatSending,messages:e.chatMessages,toolMessages:e.chatToolMessages,stream:e.chatStream,streamStartedAt:e.chatStreamStartedAt,draft:e.chatMessage,connected:e.connected,canSend:e.connected,disabledReason:i,error:e.lastError,sessions:e.sessionsResult,focusMode:e.settings.chatFocusMode,onRefresh:()=>(e.resetToolStream(),tt(e)),onToggleFocusMode:()=>e.applySettings({...e.settings,chatFocusMode:!e.settings.chatFocusMode}),onDraftChange:r=>e.chatMessage=r,onSend:()=>e.handleSendChat()}):f}
|
|
2318
|
+
|
|
2319
|
+
${e.tab==="config"?go({raw:e.configRaw,valid:e.configValid,issues:e.configIssues,loading:e.configLoading,saving:e.configSaving,connected:e.connected,schema:e.configSchema,schemaLoading:e.configSchemaLoading,uiHints:e.configUiHints,formMode:e.configFormMode,formValue:e.configForm,onRawChange:r=>e.configRaw=r,onFormModeChange:r=>e.configFormMode=r,onFormPatch:(r,o)=>mr(e,r,o),onReload:()=>he(e),onSave:()=>fr(e)}):f}
|
|
2320
|
+
|
|
2321
|
+
${e.tab==="debug"?Po({loading:e.debugLoading,status:e.debugStatus,health:e.debugHealth,models:e.debugModels,heartbeat:e.debugHeartbeat,eventLog:e.eventLog,callMethod:e.debugCallMethod,callParams:e.debugCallParams,callResult:e.debugCallResult,callError:e.debugCallError,onCallMethodChange:r=>e.debugCallMethod=r,onCallParamsChange:r=>e.debugCallParams=r,onRefresh:()=>bn(e),onCall:()=>xr(e)}):f}
|
|
2322
|
+
</main>
|
|
2323
|
+
</div>
|
|
2324
|
+
`}function Tr(e,t){const n=Qs(t,e.basePath);return p`
|
|
2325
|
+
<a
|
|
2326
|
+
href=${n}
|
|
2327
|
+
class="nav-item ${e.tab===t?"active":""}"
|
|
2328
|
+
@click=${s=>{s.defaultPrevented||s.button!==0||s.metaKey||s.ctrlKey||s.shiftKey||s.altKey||(s.preventDefault(),e.setTab(t))}}
|
|
2329
|
+
>
|
|
2330
|
+
<span>${Xs(t)}</span>
|
|
2331
|
+
</a>
|
|
2332
|
+
`}const Er=["system","light","dark"];function Cr(e){const t=Math.max(0,Er.indexOf(e.theme)),n=s=>i=>{const l={element:i.currentTarget};(i.clientX||i.clientY)&&(l.pointerClientX=i.clientX,l.pointerClientY=i.clientY),e.setTheme(s,l)};return p`
|
|
2333
|
+
<div class="theme-toggle" style="--theme-index: ${t};">
|
|
2334
|
+
<div class="theme-toggle__track" role="group" aria-label="Theme">
|
|
2335
|
+
<span class="theme-toggle__indicator"></span>
|
|
2336
|
+
<button
|
|
2337
|
+
class="theme-toggle__button ${e.theme==="system"?"active":""}"
|
|
2338
|
+
@click=${n("system")}
|
|
2339
|
+
aria-pressed=${e.theme==="system"}
|
|
2340
|
+
aria-label="System theme"
|
|
2341
|
+
title="System"
|
|
2342
|
+
>
|
|
2343
|
+
${Rr()}
|
|
2344
|
+
</button>
|
|
2345
|
+
<button
|
|
2346
|
+
class="theme-toggle__button ${e.theme==="light"?"active":""}"
|
|
2347
|
+
@click=${n("light")}
|
|
2348
|
+
aria-pressed=${e.theme==="light"}
|
|
2349
|
+
aria-label="Light theme"
|
|
2350
|
+
title="Light"
|
|
2351
|
+
>
|
|
2352
|
+
${_r()}
|
|
2353
|
+
</button>
|
|
2354
|
+
<button
|
|
2355
|
+
class="theme-toggle__button ${e.theme==="dark"?"active":""}"
|
|
2356
|
+
@click=${n("dark")}
|
|
2357
|
+
aria-pressed=${e.theme==="dark"}
|
|
2358
|
+
aria-label="Dark theme"
|
|
2359
|
+
title="Dark"
|
|
2360
|
+
>
|
|
2361
|
+
${Mr()}
|
|
2362
|
+
</button>
|
|
2363
|
+
</div>
|
|
2364
|
+
</div>
|
|
2365
|
+
`}function _r(){return p`
|
|
2366
|
+
<svg class="theme-icon" viewBox="0 0 24 24" aria-hidden="true">
|
|
2367
|
+
<circle cx="12" cy="12" r="4"></circle>
|
|
2368
|
+
<path d="M12 2v2"></path>
|
|
2369
|
+
<path d="M12 20v2"></path>
|
|
2370
|
+
<path d="m4.93 4.93 1.41 1.41"></path>
|
|
2371
|
+
<path d="m17.66 17.66 1.41 1.41"></path>
|
|
2372
|
+
<path d="M2 12h2"></path>
|
|
2373
|
+
<path d="M20 12h2"></path>
|
|
2374
|
+
<path d="m6.34 17.66-1.41 1.41"></path>
|
|
2375
|
+
<path d="m19.07 4.93-1.41 1.41"></path>
|
|
2376
|
+
</svg>
|
|
2377
|
+
`}function Mr(){return p`
|
|
2378
|
+
<svg class="theme-icon" viewBox="0 0 24 24" aria-hidden="true">
|
|
2379
|
+
<path
|
|
2380
|
+
d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"
|
|
2381
|
+
></path>
|
|
2382
|
+
</svg>
|
|
2383
|
+
`}function Rr(){return p`
|
|
2384
|
+
<svg class="theme-icon" viewBox="0 0 24 24" aria-hidden="true">
|
|
2385
|
+
<rect width="20" height="14" x="2" y="3" rx="2"></rect>
|
|
2386
|
+
<line x1="8" x2="16" y1="21" y2="21"></line>
|
|
2387
|
+
<line x1="12" x2="12" y1="17" y2="21"></line>
|
|
2388
|
+
</svg>
|
|
2389
|
+
`}function Lr(){return typeof window>"u"||typeof window.matchMedia!="function"||window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function ln(e){return e==="system"?Lr():e}const kt=e=>Number.isNaN(e)?.5:e<=0?0:e>=1?1:e,Pr=()=>typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia("(prefers-reduced-motion: reduce)").matches??!1,$t=e=>{e.classList.remove("theme-transition"),e.style.removeProperty("--theme-switch-x"),e.style.removeProperty("--theme-switch-y")},Ir=({nextTheme:e,applyTheme:t,context:n,currentTheme:s})=>{if(s===e)return;const i=globalThis.document??null;if(!i){t();return}const a=i.documentElement,l=i,r=Pr();if(!!l.startViewTransition&&!r){let d=.5,u=.5;if(n?.pointerClientX!==void 0&&n?.pointerClientY!==void 0&&typeof window<"u")d=kt(n.pointerClientX/window.innerWidth),u=kt(n.pointerClientY/window.innerHeight);else if(n?.element){const h=n.element.getBoundingClientRect();h.width>0&&h.height>0&&typeof window<"u"&&(d=kt((h.left+h.width/2)/window.innerWidth),u=kt((h.top+h.height/2)/window.innerHeight))}a.style.setProperty("--theme-switch-x",`${d*100}%`),a.style.setProperty("--theme-switch-y",`${u*100}%`),a.classList.add("theme-transition");try{const h=l.startViewTransition?.(()=>{t()});h?.finished?h.finished.finally(()=>$t(a)):$t(a)}catch{$t(a),t()}return}t(),$t(a)};var Fr=Object.defineProperty,Nr=Object.getOwnPropertyDescriptor,b=(e,t,n,s)=>{for(var i=s>1?void 0:s?Nr(t,n):t,a=e.length-1,l;a>=0;a--)(l=e[a])&&(i=(s?l(t,n,i):l(i))||i);return s&&i&&Fr(t,n,i),i};const Us=50;function Or(e){if(!e||typeof e!="object")return null;const t=e;if(typeof t.text=="string")return t.text;const n=t.content;if(!Array.isArray(n))return null;const s=n.map(i=>{if(!i||typeof i!="object")return null;const a=i;return a.type==="text"&&typeof a.text=="string"?a.text:null}).filter(i=>!!i);return s.length===0?null:s.join(`
|
|
2390
|
+
`)}function Bs(e){if(e==null)return null;if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean")return String(e);const t=Or(e);if(t)return t;try{return JSON.stringify(e,null,2)}catch{return String(e)}}const Dr={name:"",description:"",enabled:!0,scheduleKind:"every",scheduleAt:"",everyAmount:"30",everyUnit:"minutes",cronExpr:"0 7 * * *",cronTz:"",sessionTarget:"main",wakeMode:"next-heartbeat",payloadKind:"systemEvent",payloadText:"",deliver:!1,provider:"last",to:"",timeoutSeconds:"",postToMainPrefix:""};let m=class extends Ve{constructor(){super(...arguments),this.settings=va(),this.password="",this.tab="chat",this.connected=!1,this.theme=this.settings.theme??"system",this.themeResolved="dark",this.hello=null,this.lastError=null,this.eventLog=[],this.eventLogBuffer=[],this.sessionKey=this.settings.sessionKey,this.chatLoading=!1,this.chatSending=!1,this.chatMessage="",this.chatMessages=[],this.chatToolMessages=[],this.chatStream=null,this.chatStreamStartedAt=null,this.chatRunId=null,this.chatThinkingLevel=null,this.nodesLoading=!1,this.nodes=[],this.configLoading=!1,this.configRaw=`{
|
|
2391
|
+
}
|
|
2392
|
+
`,this.configValid=null,this.configIssues=[],this.configSaving=!1,this.configSnapshot=null,this.configSchema=null,this.configSchemaVersion=null,this.configSchemaLoading=!1,this.configUiHints={},this.configForm=null,this.configFormDirty=!1,this.configFormMode="form",this.providersLoading=!1,this.providersSnapshot=null,this.providersError=null,this.providersLastSuccess=null,this.whatsappLoginMessage=null,this.whatsappLoginQrDataUrl=null,this.whatsappLoginConnected=null,this.whatsappBusy=!1,this.telegramForm={token:"",requireMention:!0,allowFrom:"",proxy:"",webhookUrl:"",webhookSecret:"",webhookPath:""},this.telegramSaving=!1,this.telegramTokenLocked=!1,this.telegramConfigStatus=null,this.discordForm={enabled:!0,token:"",dmEnabled:!0,allowFrom:"",groupEnabled:!1,groupChannels:"",mediaMaxMb:"",historyLimit:"",textChunkLimit:"",guilds:[],actions:{...In},slashEnabled:!1,slashName:"",slashSessionPrefix:"",slashEphemeral:!0},this.discordSaving=!1,this.discordTokenLocked=!1,this.discordConfigStatus=null,this.slackForm={enabled:!0,botToken:"",appToken:"",dmEnabled:!0,allowFrom:"",groupEnabled:!1,groupChannels:"",mediaMaxMb:"",textChunkLimit:"",reactionNotifications:"own",reactionAllowlist:"",slashEnabled:!1,slashName:"",slashSessionPrefix:"",slashEphemeral:!0,actions:{...fe},channels:[]},this.slackSaving=!1,this.slackTokenLocked=!1,this.slackAppTokenLocked=!1,this.slackConfigStatus=null,this.signalForm={enabled:!0,account:"",httpUrl:"",httpHost:"",httpPort:"",cliPath:"",autoStart:!0,receiveMode:"",ignoreAttachments:!1,ignoreStories:!1,sendReadReceipts:!1,allowFrom:"",mediaMaxMb:""},this.signalSaving=!1,this.signalConfigStatus=null,this.imessageForm={enabled:!0,cliPath:"",dbPath:"",service:"auto",region:"",allowFrom:"",includeAttachments:!1,mediaMaxMb:""},this.imessageSaving=!1,this.imessageConfigStatus=null,this.presenceLoading=!1,this.presenceEntries=[],this.presenceError=null,this.presenceStatus=null,this.sessionsLoading=!1,this.sessionsResult=null,this.sessionsError=null,this.sessionsFilterActive="",this.sessionsFilterLimit="120",this.sessionsIncludeGlobal=!0,this.sessionsIncludeUnknown=!1,this.cronLoading=!1,this.cronJobs=[],this.cronStatus=null,this.cronError=null,this.cronForm={...Dr},this.cronRunsJobId=null,this.cronRuns=[],this.cronBusy=!1,this.skillsLoading=!1,this.skillsReport=null,this.skillsError=null,this.skillsFilter="",this.skillEdits={},this.skillsBusyKey=null,this.debugLoading=!1,this.debugStatus=null,this.debugHealth=null,this.debugModels=[],this.debugHeartbeat=null,this.debugCallMethod="",this.debugCallParams="{}",this.debugCallResult=null,this.debugCallError=null,this.client=null,this.chatScrollFrame=null,this.chatScrollTimeout=null,this.chatHasAutoScrolled=!1,this.nodesPollInterval=null,this.toolStreamById=new Map,this.toolStreamOrder=[],this.basePath="",this.popStateHandler=()=>this.onPopState(),this.themeMedia=null,this.themeMediaHandler=null,this.topbarObserver=null}createRenderRoot(){return this}connectedCallback(){super.connectedCallback(),this.basePath=this.inferBasePath(),this.syncTabWithLocation(!0),this.syncThemeWithSettings(),this.attachThemeListener(),window.addEventListener("popstate",this.popStateHandler),this.applySettingsFromUrl(),this.connect(),this.startNodesPolling()}firstUpdated(){this.observeTopbar()}disconnectedCallback(){window.removeEventListener("popstate",this.popStateHandler),this.stopNodesPolling(),this.detachThemeListener(),this.topbarObserver?.disconnect(),this.topbarObserver=null,super.disconnectedCallback()}updated(e){if(this.tab==="chat"&&(e.has("chatMessages")||e.has("chatToolMessages")||e.has("chatStream")||e.has("chatLoading")||e.has("tab"))){const t=e.has("tab"),n=e.has("chatLoading")&&e.get("chatLoading")===!0&&this.chatLoading===!1;this.scheduleChatScroll(t||n||!this.chatHasAutoScrolled)}}connect(){this.lastError=null,this.hello=null,this.connected=!1,this.client?.stop(),this.client=new ba({url:this.settings.gatewayUrl,token:this.settings.token.trim()?this.settings.token:void 0,password:this.password.trim()?this.password:void 0,clientName:"nexus-control-ui",mode:"webchat",onHello:e=>{this.connected=!0,this.hello=e,this.applySnapshot(e),xt(this,{quiet:!0}),this.refreshActiveTab()},onClose:({code:e,reason:t})=>{this.connected=!1,this.lastError=`disconnected (${e}): ${t||"no reason"}`},onEvent:e=>this.onEvent(e),onGap:({expected:e,received:t})=>{this.lastError=`event gap detected (expected seq ${e}, got ${t}); refresh recommended`}}),this.client.start()}scheduleChatScroll(e=!1){this.chatScrollFrame&&cancelAnimationFrame(this.chatScrollFrame),this.chatScrollTimeout!=null&&(clearTimeout(this.chatScrollTimeout),this.chatScrollTimeout=null);const t=()=>{const n=this.querySelector(".chat-thread");if(n){const s=getComputedStyle(n).overflowY;if(s==="auto"||s==="scroll"||n.scrollHeight-n.clientHeight>1)return n}return document.scrollingElement??document.documentElement};this.updateComplete.then(()=>{this.chatScrollFrame=requestAnimationFrame(()=>{this.chatScrollFrame=null;const n=t();if(!n)return;const s=n.scrollHeight-n.scrollTop-n.clientHeight;if(!(e||s<200))return;e&&(this.chatHasAutoScrolled=!0),n.scrollTop=n.scrollHeight;const a=e?150:120;this.chatScrollTimeout=window.setTimeout(()=>{this.chatScrollTimeout=null;const l=t();if(!l)return;const r=l.scrollHeight-l.scrollTop-l.clientHeight;!e&&r>=250||(l.scrollTop=l.scrollHeight)},a)})})}observeTopbar(){if(typeof ResizeObserver>"u")return;const e=this.querySelector(".topbar");if(!e)return;const t=()=>{const{height:n}=e.getBoundingClientRect();this.style.setProperty("--topbar-height",`${n}px`)};t(),this.topbarObserver=new ResizeObserver(()=>t()),this.topbarObserver.observe(e)}startNodesPolling(){this.nodesPollInterval==null&&(this.nodesPollInterval=window.setInterval(()=>{xt(this,{quiet:!0})},5e3))}stopNodesPolling(){this.nodesPollInterval!=null&&(clearInterval(this.nodesPollInterval),this.nodesPollInterval=null)}resetToolStream(){this.toolStreamById.clear(),this.toolStreamOrder=[],this.chatToolMessages=[]}resetChatScroll(){this.chatHasAutoScrolled=!1}trimToolStream(){if(this.toolStreamOrder.length<=Us)return;const e=this.toolStreamOrder.length-Us,t=this.toolStreamOrder.splice(0,e);for(const n of t)this.toolStreamById.delete(n)}syncToolStreamMessages(){this.chatToolMessages=this.toolStreamOrder.map(e=>this.toolStreamById.get(e)?.message).filter(e=>!!e)}buildToolStreamMessage(e){const t=[];return t.push({type:"toolcall",name:e.name,arguments:e.args??{}}),e.output&&t.push({type:"toolresult",name:e.name,text:e.output}),{role:"assistant",toolCallId:e.toolCallId,runId:e.runId,content:t,timestamp:e.startedAt}}handleAgentEvent(e){if(!e||e.stream!=="tool")return;const t=typeof e.sessionKey=="string"?e.sessionKey:void 0;if(t&&t!==this.sessionKey||!t&&this.chatRunId&&e.runId!==this.chatRunId||this.chatRunId&&e.runId!==this.chatRunId||!this.chatRunId)return;const n=e.data??{},s=typeof n.toolCallId=="string"?n.toolCallId:"";if(!s)return;const i=typeof n.name=="string"?n.name:"tool",a=typeof n.phase=="string"?n.phase:"",l=a==="start"?n.args:void 0,r=a==="update"?Bs(n.partialResult):a==="result"?Bs(n.result):void 0,o=Date.now();let d=this.toolStreamById.get(s);d?(d.name=i,l!==void 0&&(d.args=l),r!==void 0&&(d.output=r),d.updatedAt=o):(d={toolCallId:s,runId:e.runId,sessionKey:t,name:i,args:l,output:r,startedAt:typeof e.ts=="number"?e.ts:o,updatedAt:o,message:{}},this.toolStreamById.set(s,d),this.toolStreamOrder.push(s)),d.message=this.buildToolStreamMessage(d),this.trimToolStream(),this.syncToolStreamMessages()}onEvent(e){if(this.eventLogBuffer=[{ts:Date.now(),event:e.event,payload:e.payload},...this.eventLogBuffer].slice(0,250),this.tab==="debug"&&(this.eventLog=this.eventLogBuffer),e.event==="agent"){this.handleAgentEvent(e.payload);return}if(e.event==="chat"){const t=e.payload,n=dr(this,t);(n==="final"||n==="error"||n==="aborted")&&this.resetToolStream(),n==="final"&&tt(this);return}if(e.event==="presence"){const t=e.payload;t?.presence&&Array.isArray(t.presence)&&(this.presenceEntries=t.presence,this.presenceError=null,this.presenceStatus=null);return}e.event==="cron"&&this.tab==="cron"&&this.loadCron()}applySnapshot(e){const t=e.snapshot;t?.presence&&Array.isArray(t.presence)&&(this.presenceEntries=t.presence),t?.health&&(this.debugHealth=t.health)}applySettings(e){this.settings=e,ya(e),e.theme!==this.theme&&(this.theme=e.theme,this.applyResolvedTheme(ln(e.theme)))}applySettingsFromUrl(){if(!window.location.search)return;const e=new URLSearchParams(window.location.search),t=e.get("token")?.trim();if(!t)return;this.settings.token||this.applySettings({...this.settings,token:t}),e.delete("token");const n=new URL(window.location.href);n.search=e.toString(),window.history.replaceState({},"",n.toString())}setTab(e){this.tab!==e&&(this.tab=e),e==="chat"&&(this.chatHasAutoScrolled=!1),this.refreshActiveTab(),this.syncUrlWithTab(e,!1)}setTheme(e,t){Ir({nextTheme:e,applyTheme:()=>{this.theme=e,this.applySettings({...this.settings,theme:e}),this.applyResolvedTheme(ln(e))},context:t,currentTheme:this.theme})}async refreshActiveTab(){this.tab==="overview"&&await this.loadOverview(),this.tab==="connections"&&await this.loadConnections(),this.tab==="instances"&&await mn(this),this.tab==="sessions"&&await et(this),this.tab==="cron"&&await this.loadCron(),this.tab==="skills"&&await ct(this),this.tab==="nodes"&&await xt(this),this.tab==="chat"&&(await Promise.all([tt(this),et(this)]),this.scheduleChatScroll(!this.chatHasAutoScrolled)),this.tab==="config"&&(await hr(this),await he(this)),this.tab==="debug"&&(await bn(this),this.eventLog=this.eventLogBuffer)}inferBasePath(){if(typeof window>"u")return"";const e=window.__CLAWDBOT_CONTROL_UI_BASE_PATH__;return typeof e=="string"&&e.trim()?Sn(e):$a(window.location.pathname)}syncThemeWithSettings(){this.theme=this.settings.theme??"system",this.applyResolvedTheme(ln(this.theme))}applyResolvedTheme(e){if(this.themeResolved=e,typeof document>"u")return;const t=document.documentElement;t.dataset.theme=e,t.style.colorScheme=e}attachThemeListener(){if(typeof window>"u"||typeof window.matchMedia!="function")return;if(this.themeMedia=window.matchMedia("(prefers-color-scheme: dark)"),this.themeMediaHandler=t=>{this.theme==="system"&&this.applyResolvedTheme(t.matches?"dark":"light")},typeof this.themeMedia.addEventListener=="function"){this.themeMedia.addEventListener("change",this.themeMediaHandler);return}this.themeMedia.addListener(this.themeMediaHandler)}detachThemeListener(){if(!this.themeMedia||!this.themeMediaHandler)return;if(typeof this.themeMedia.removeEventListener=="function"){this.themeMedia.removeEventListener("change",this.themeMediaHandler);return}this.themeMedia.removeListener(this.themeMediaHandler),this.themeMedia=null,this.themeMediaHandler=null}syncTabWithLocation(e){if(typeof window>"u")return;const t=bs(window.location.pathname,this.basePath)??"chat";this.setTabFromRoute(t),this.syncUrlWithTab(t,e)}onPopState(){if(typeof window>"u")return;const e=bs(window.location.pathname,this.basePath);e&&this.setTabFromRoute(e)}setTabFromRoute(e){this.tab!==e&&(this.tab=e),e==="chat"&&(this.chatHasAutoScrolled=!1),this.connected&&this.refreshActiveTab()}syncUrlWithTab(e,t){if(typeof window>"u")return;const n=it(Qs(e,this.basePath));if(it(window.location.pathname)===n)return;const i=new URL(window.location.href);i.pathname=n,t?window.history.replaceState({},"",i.toString()):window.history.pushState({},"",i.toString())}async loadOverview(){await Promise.all([te(this,!1),mn(this),et(this),lt(this),bn(this)])}async loadConnections(){await Promise.all([te(this,!0),he(this)])}async loadCron(){await Promise.all([lt(this),Ot(this)])}async handleSendChat(){if(!this.connected)return;this.resetToolStream(),await cr(this)&&this.chatRunId&&(this.chatRunId=null,this.chatStream=null,this.chatStreamStartedAt=null,this.resetToolStream(),tt(this)),this.scheduleChatScroll()}async handleWhatsAppStart(e){await qo(this,e),await te(this,!0)}async handleWhatsAppWait(){await Wo(this),await te(this,!0)}async handleWhatsAppLogout(){await Go(this),await te(this,!0)}async handleTelegramSave(){await Xo(this),await he(this),await te(this,!0)}async handleDiscordSave(){await er(this),await he(this),await te(this,!0)}async handleSlackSave(){await tr(this),await he(this),await te(this,!0)}async handleSignalSave(){await nr(this),await he(this),await te(this,!0)}async handleIMessageSave(){await sr(this),await he(this),await te(this,!0)}render(){return Ar(this)}};b([v()],m.prototype,"settings",2);b([v()],m.prototype,"password",2);b([v()],m.prototype,"tab",2);b([v()],m.prototype,"connected",2);b([v()],m.prototype,"theme",2);b([v()],m.prototype,"themeResolved",2);b([v()],m.prototype,"hello",2);b([v()],m.prototype,"lastError",2);b([v()],m.prototype,"eventLog",2);b([v()],m.prototype,"sessionKey",2);b([v()],m.prototype,"chatLoading",2);b([v()],m.prototype,"chatSending",2);b([v()],m.prototype,"chatMessage",2);b([v()],m.prototype,"chatMessages",2);b([v()],m.prototype,"chatToolMessages",2);b([v()],m.prototype,"chatStream",2);b([v()],m.prototype,"chatStreamStartedAt",2);b([v()],m.prototype,"chatRunId",2);b([v()],m.prototype,"chatThinkingLevel",2);b([v()],m.prototype,"nodesLoading",2);b([v()],m.prototype,"nodes",2);b([v()],m.prototype,"configLoading",2);b([v()],m.prototype,"configRaw",2);b([v()],m.prototype,"configValid",2);b([v()],m.prototype,"configIssues",2);b([v()],m.prototype,"configSaving",2);b([v()],m.prototype,"configSnapshot",2);b([v()],m.prototype,"configSchema",2);b([v()],m.prototype,"configSchemaVersion",2);b([v()],m.prototype,"configSchemaLoading",2);b([v()],m.prototype,"configUiHints",2);b([v()],m.prototype,"configForm",2);b([v()],m.prototype,"configFormDirty",2);b([v()],m.prototype,"configFormMode",2);b([v()],m.prototype,"providersLoading",2);b([v()],m.prototype,"providersSnapshot",2);b([v()],m.prototype,"providersError",2);b([v()],m.prototype,"providersLastSuccess",2);b([v()],m.prototype,"whatsappLoginMessage",2);b([v()],m.prototype,"whatsappLoginQrDataUrl",2);b([v()],m.prototype,"whatsappLoginConnected",2);b([v()],m.prototype,"whatsappBusy",2);b([v()],m.prototype,"telegramForm",2);b([v()],m.prototype,"telegramSaving",2);b([v()],m.prototype,"telegramTokenLocked",2);b([v()],m.prototype,"telegramConfigStatus",2);b([v()],m.prototype,"discordForm",2);b([v()],m.prototype,"discordSaving",2);b([v()],m.prototype,"discordTokenLocked",2);b([v()],m.prototype,"discordConfigStatus",2);b([v()],m.prototype,"slackForm",2);b([v()],m.prototype,"slackSaving",2);b([v()],m.prototype,"slackTokenLocked",2);b([v()],m.prototype,"slackAppTokenLocked",2);b([v()],m.prototype,"slackConfigStatus",2);b([v()],m.prototype,"signalForm",2);b([v()],m.prototype,"signalSaving",2);b([v()],m.prototype,"signalConfigStatus",2);b([v()],m.prototype,"imessageForm",2);b([v()],m.prototype,"imessageSaving",2);b([v()],m.prototype,"imessageConfigStatus",2);b([v()],m.prototype,"presenceLoading",2);b([v()],m.prototype,"presenceEntries",2);b([v()],m.prototype,"presenceError",2);b([v()],m.prototype,"presenceStatus",2);b([v()],m.prototype,"sessionsLoading",2);b([v()],m.prototype,"sessionsResult",2);b([v()],m.prototype,"sessionsError",2);b([v()],m.prototype,"sessionsFilterActive",2);b([v()],m.prototype,"sessionsFilterLimit",2);b([v()],m.prototype,"sessionsIncludeGlobal",2);b([v()],m.prototype,"sessionsIncludeUnknown",2);b([v()],m.prototype,"cronLoading",2);b([v()],m.prototype,"cronJobs",2);b([v()],m.prototype,"cronStatus",2);b([v()],m.prototype,"cronError",2);b([v()],m.prototype,"cronForm",2);b([v()],m.prototype,"cronRunsJobId",2);b([v()],m.prototype,"cronRuns",2);b([v()],m.prototype,"cronBusy",2);b([v()],m.prototype,"skillsLoading",2);b([v()],m.prototype,"skillsReport",2);b([v()],m.prototype,"skillsError",2);b([v()],m.prototype,"skillsFilter",2);b([v()],m.prototype,"skillEdits",2);b([v()],m.prototype,"skillsBusyKey",2);b([v()],m.prototype,"debugLoading",2);b([v()],m.prototype,"debugStatus",2);b([v()],m.prototype,"debugHealth",2);b([v()],m.prototype,"debugModels",2);b([v()],m.prototype,"debugHeartbeat",2);b([v()],m.prototype,"debugCallMethod",2);b([v()],m.prototype,"debugCallParams",2);b([v()],m.prototype,"debugCallResult",2);b([v()],m.prototype,"debugCallError",2);m=b([ha("nexus-app")],m);
|
|
2393
|
+
//# sourceMappingURL=index-D8Q5AI4D.js.map
|