total-recall-brain 3.39.0 → 3.39.2
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/bin/total-recall.mjs +48 -29
- package/docs/IDE_INTEGRATION.md +27 -0
- package/docs/reference/cli-reference.md +10 -0
- package/frontend/dist/assets/{index-C7_Xpk27.css → index-CvQRdT2j.css} +1 -1
- package/frontend/dist/assets/index-SOVUlZqm.js +5596 -0
- package/frontend/dist/index.html +3 -3
- package/frontend/dist/sw.js +11 -6
- package/frontend/index.html +1 -1
- package/frontend/src/App.tsx +4 -14
- package/frontend/src/api/_base.ts +10 -0
- package/frontend/src/api/auth.ts +52 -0
- package/frontend/src/api/index.ts +0 -1
- package/frontend/src/api/plugins.ts +44 -5
- package/frontend/src/components/plugins/PluginPanel.tsx +25 -12
- package/frontend/src/components/plugins/PluginSettings.tsx +17 -5
- package/frontend/src/components/plugins/card/CardEngine.tsx +115 -0
- package/frontend/src/components/plugins/card/CardScenes.tsx +74 -0
- package/frontend/src/components/plugins/card/ExecutionPicker.tsx +64 -0
- package/frontend/src/components/plugins/card/args.ts +28 -0
- package/frontend/src/components/plugins/card/card.css +35 -0
- package/frontend/src/components/plugins/card/cli-line.ts +13 -0
- package/frontend/src/components/plugins/card/contract.ts +97 -0
- package/frontend/src/components/plugins/card/format.ts +42 -0
- package/frontend/src/components/plugins/card/runner-context.ts +11 -0
- package/frontend/src/components/plugins/card/runner.tsx +43 -0
- package/frontend/src/components/plugins/card/theme.ts +35 -0
- package/frontend/src/components/plugins/card/use-source.ts +22 -0
- package/frontend/src/components/plugins/card/widgets.tsx +125 -0
- package/frontend/src/components/plugins/plugin-frame.ts +48 -7
- package/frontend/src/components/plugins/workspace/WorkspaceHost.tsx +23 -0
- package/frontend/src/pages/LoginPage.tsx +153 -2
- package/frontend/src/pages/PluginsPage.tsx +44 -190
- package/metadata.plugin.schema.json +642 -64
- package/package.json +5 -3
- package/scaffold/.agent/skills/plugins/SKILL.md +38 -190
- package/scaffold/.agent/skills/plugins/references/card-design.md +55 -0
- package/scaffold/.agent/skills/plugins/references/distribution.md +23 -0
- package/scaffold/.agent/skills/plugins/references/manifest-contract.md +90 -0
- package/scaffold/.agent/skills/start/SKILL.md +3 -0
- package/scaffold/.agent/skills/total-recall/SKILL.md +34 -40
- package/scaffold/.agent/skills/total-recall/memory-vault/invariants/operating-instructions.md +2 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/README.md +46 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/cli.mjs +384 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/package-lock.json +3993 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/package.json +39 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/plugin.json +262 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/access-keys.mjs +225 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/agent-dir.mjs +3 -0
- package/{src/cli/secret.mjs → scaffold/.agent/skills/total-recall/plugins/auth/src/cli-secret.mjs} +32 -47
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/config.mjs +4 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/configuration.mjs +19 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/credential-preservation.mjs +28 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/fact-seeker.mjs +3 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/frontmatter.mjs +3 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/google-oauth.mjs +139 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/host-runtime.mjs +7 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/leader-election.mjs +9 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/logger.mjs +3 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/mesh-auth.mjs +7 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/mesh-identity.mjs +16 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/mesh-secrets.mjs +146 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/mesh.mjs +23 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/metadata-state.mjs +17 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/project-id.mjs +3 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/research-gate.mjs +3 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/research-queue.mjs +3 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/routes/auth.mjs +207 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/routes/keys.mjs +61 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/routes/secrets-runtime.mjs +5 -0
- package/{src/server → scaffold/.agent/skills/total-recall/plugins/auth/src}/routes/secrets.mjs +45 -43
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/routes/webauthn.mjs +163 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/runtime-credentials.mjs +19 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/runtime.mjs +3 -0
- package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/secrets-gateway.mjs +15 -98
- package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/secrets-remote-deploy.mjs +7 -15
- package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/secrets-store.mjs +9 -47
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/secrets-sync.mjs +81 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/secure-file.mjs +71 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/server-auth.mjs +500 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/session-credentials.mjs +71 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/ssss-store.mjs +13 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/stdin.mjs +31 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/throttled-fetch.mjs +3 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/vault.mjs +3 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/vfs-documents.mjs +3 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/webauthn-store.mjs +265 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/ui/DESIGN.md +19 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/ui/card.js +274 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/ui/panel.js +338 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/LICENSE +21 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/README.md +38 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/cli.mjs +49 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/package.json +21 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/plugin.json +276 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/cli/agent-dir.mjs +3 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/cli/grants.mjs +36 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/cli/mesh.mjs +841 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/cli/server.mjs +120 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/config.mjs +4 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/credentials.mjs +29 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/device-io.mjs +344 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/frontmatter.mjs +3 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/headscale-client.mjs +281 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/headscale-server.mjs +303 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/lan-discovery.mjs +341 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/leader-election.mjs +112 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/logger.mjs +3 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh-access-sync.mjs +134 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh-access.mjs +276 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh-activity.mjs +89 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh-auth.mjs +52 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh-discover.mjs +173 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh-enroll.mjs +481 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh-identity.mjs +211 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh-late-bind.mjs +105 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh.mjs +779 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/meta-harness.mjs +3 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/network-interfaces.mjs +149 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/plugin-distribution.mjs +3 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/plugin-peers.mjs +163 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/presence.mjs +54 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/registration-watch.mjs +193 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/ssss-kernel-bridge.mjs +3 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/ssss-operation-service.mjs +3 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/status.mjs +29 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/tailscale-cli.mjs +69 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/throttled-fetch.mjs +3 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/vfs-documents.mjs +3 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/host-runtime.mjs +7 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/server/auth.mjs +3 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/server/routes/_shared.mjs +3 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/server/routes/headscale.mjs +112 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/server/routes/mesh-presence.mjs +20 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/server/routes/mesh.mjs +628 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/server/routes/plugins-mesh.mjs +57 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/ssss-store.mjs +13 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/test-support/memory-root.mjs +14 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/DESIGN.md +18 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/LOGO.md +7 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/card.js +34 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/logo.svg +1 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/panel.js +39 -0
- package/scaffold/.agent/skills/total-recall/references/api-reference.md +2 -0
- package/scaffold/.agent/skills/total-recall/references/architecture-reference.md +2 -80
- package/scaffold/.agent/skills/total-recall/references/auth.md +29 -0
- package/scaffold/.agent/skills/total-recall/references/cli-reference.md +2 -125
- package/scaffold/.agent/skills/total-recall/references/contributing.md +50 -0
- package/scaffold/.agent/skills/total-recall/references/crm.md +21 -0
- package/scaffold/.agent/skills/total-recall/references/memory.md +7 -0
- package/scaffold/.agent/skills/total-recall/references/mesh.md +18 -0
- package/scaffold/.agent/skills/total-recall/references/openwiki.md +7 -0
- package/scaffold/.agent/skills/total-recall/references/operations.md +9 -663
- package/scaffold/.agent/skills/total-recall/references/plugins.md +44 -0
- package/scaffold/.agent/skills/total-recall/references/security.md +14 -0
- package/scaffold/.agent/skills/total-recall/references/ssss-reference.md +2 -0
- package/scaffold/.agent/skills/total-recall/references/troubleshooting.md +2 -67
- package/scaffold/.agent/skills/total-recall/scripts/brain-state.json +2 -0
- package/src/cli/config.mjs +4 -2
- package/src/cli/deploy-ui.mjs +15 -86
- package/src/cli/deploy.mjs +13 -11
- package/src/cli/doctor.mjs +15 -11
- package/src/cli/edit.mjs +3 -9
- package/src/cli/forget.mjs +3 -5
- package/src/cli/generate-pat.mjs +2 -2
- package/src/cli/hash-password.mjs +7 -18
- package/src/cli/import-rules.mjs +2 -6
- package/src/cli/ingest.mjs +12 -2
- package/src/cli/init.mjs +33 -53
- package/src/cli/key.mjs +2 -2
- package/src/cli/mesh.mjs +4 -831
- package/src/cli/new.mjs +131 -0
- package/src/cli/plugin/codex-package.mjs +90 -0
- package/src/cli/plugin/create.mjs +17 -9
- package/src/cli/plugin/index.mjs +62 -3
- package/src/cli/plugin/install.mjs +7 -0
- package/src/cli/plugin/monetization.mjs +72 -0
- package/src/cli/plugin/remove.mjs +7 -0
- package/src/cli/plugin/scaffold-cmd.mjs +4 -0
- package/src/cli/plugin/search.mjs +2 -1
- package/src/cli/plugin/vendor.mjs +38 -0
- package/src/cli/proposals.mjs +4 -0
- package/src/cli/remember.mjs +11 -9
- package/src/cli/reset-password.mjs +4 -44
- package/src/cli/setup.mjs +2 -1
- package/src/cli/skill-config.mjs +4 -3
- package/src/cli/skill-projection.mjs +2 -2
- package/src/cli/skill.mjs +110 -93
- package/src/cli/uninstall.mjs +10 -41
- package/src/cli/update.mjs +26 -0
- package/src/cli/upgrade.mjs +2 -1
- package/src/core/api-routes.mjs +15 -50
- package/src/core/auto-compile.mjs +50 -0
- package/src/core/brain-state.json +2 -0
- package/src/core/brain-updates.mjs +201 -0
- package/src/core/command-surface.mjs +21 -0
- package/src/core/config.mjs +17 -66
- package/src/core/crons.mjs +2 -1
- package/src/core/daemon-control.mjs +5 -1
- package/src/core/daemon-loop.mjs +3 -2
- package/src/core/device-io.mjs +7 -344
- package/src/core/embeddings.mjs +5 -5
- package/src/core/github-sync.mjs +2 -1
- package/src/core/headscale-client.mjs +16 -338
- package/src/core/lan-discovery.mjs +9 -341
- package/src/core/leader-election.mjs +10 -112
- package/src/core/logger.mjs +39 -0
- package/src/core/mesh-access-sync.mjs +7 -134
- package/src/core/mesh-access.mjs +17 -276
- package/src/core/mesh-activity.mjs +7 -140
- package/src/core/mesh-auth.mjs +8 -50
- package/src/core/mesh-discover.mjs +8 -173
- package/src/core/mesh-enroll.mjs +17 -481
- package/src/core/mesh-late-bind.mjs +4 -105
- package/src/core/mesh.mjs +24 -808
- package/src/core/meta-harness.mjs +8 -16
- package/src/core/network-interfaces.mjs +9 -149
- package/src/core/okf-adapter.mjs +16 -2
- package/src/core/parallel-context.mjs +2 -2
- package/src/core/plugin-activation.mjs +15 -0
- package/src/core/plugin-catalog.mjs +53 -0
- package/src/core/plugin-context.mjs +2 -1
- package/src/core/plugin-contracts/card.mjs +185 -0
- package/src/core/plugin-contracts/ui.mjs +1 -1
- package/src/core/plugin-cron.mjs +57 -0
- package/src/core/plugin-dependencies.mjs +38 -0
- package/src/core/plugin-distribution.mjs +4 -3
- package/src/core/plugin-document-store.mjs +80 -0
- package/src/core/plugin-loader.mjs +92 -4
- package/src/core/plugin-peers.mjs +7 -163
- package/src/core/plugin-runner.mjs +42 -3
- package/src/core/plugin-runtime.mjs +46 -0
- package/src/core/plugin-state-store.mjs +176 -0
- package/src/core/plugin-state.mjs +36 -0
- package/src/core/plugin-store.mjs +50 -23
- package/src/core/plugin-tasks.mjs +3 -55
- package/src/core/plugin-vendor.mjs +237 -0
- package/src/core/registration-watch.mjs +9 -193
- package/src/core/runtime.mjs +21 -67
- package/src/core/scaffold-plugins.mjs +75 -0
- package/src/core/skill-config.mjs +15 -3
- package/src/core/source-adapters.mjs +2 -1
- package/src/core/surface.mjs +43 -20
- package/src/core/tailscale-cli.mjs +8 -69
- package/src/core/task-executors.mjs +4 -3
- package/src/core/usage-fetcher.mjs +2 -1
- package/src/core/vault-cache.mjs +19 -5
- package/src/core/webauthn-store.mjs +3 -273
- package/src/server/api.mjs +1 -1
- package/src/server/auth.mjs +7 -531
- package/src/server/index.mjs +16 -23
- package/src/server/keys.mjs +4 -206
- package/src/server/rest.mjs +1 -10
- package/src/server/route-manifest.json +72 -4
- package/src/server/routes/_shared.mjs +2 -1
- package/src/server/routes/auth.mjs +6 -77
- package/src/server/routes/collab.mjs +16 -33
- package/src/server/routes/config.mjs +3 -2
- package/src/server/routes/headscale.mjs +4 -114
- package/src/server/routes/keys.mjs +5 -53
- package/src/server/routes/mesh-presence.mjs +4 -143
- package/src/server/routes/mesh.mjs +4 -628
- package/src/server/routes/models.mjs +7 -17
- package/src/server/routes/plugins-mesh.mjs +4 -57
- package/src/server/routes/plugins.mjs +96 -4
- package/src/server/routes/webauthn.mjs +5 -182
- package/src/server/routes/webhooks.mjs +2 -1
- package/frontend/dist/assets/index-D3Y3J5MC.js +0 -5815
- package/frontend/src/api/secrets.ts +0 -53
- package/frontend/src/components/plugins/previews/CodeQualityPreview.tsx +0 -122
- package/frontend/src/components/plugins/previews/ComposableCliPreview.tsx +0 -121
- package/frontend/src/components/plugins/previews/DecisionPreview.tsx +0 -208
- package/frontend/src/components/plugins/previews/DesignPreview.tsx +0 -152
- package/frontend/src/components/plugins/previews/DomainsPreview.tsx +0 -120
- package/frontend/src/components/plugins/previews/ImageGeneratorPreview.tsx +0 -286
- package/frontend/src/components/plugins/previews/PhonePreview.tsx +0 -500
- package/frontend/src/components/plugins/previews/SigningPreview.tsx +0 -223
- package/frontend/src/components/plugins/previews/TextPreview.tsx +0 -143
- package/frontend/src/components/plugins/previews/UserAutomationsPreview.tsx +0 -30
- package/frontend/src/components/plugins/previews/index.tsx +0 -88
- package/frontend/src/pages/OpenWikiPage.tsx +0 -583
- package/frontend/src/pages/SecretsPage.css +0 -141
- package/frontend/src/pages/SecretsPage.tsx +0 -2832
- package/scaffold/.agent/skills/total-recall/derived/embeddings.db +0 -0
- package/src/cli/ingest-openwiki.mjs +0 -195
- package/src/core/legacy-init-secrets.mjs +0 -32
- package/src/core/secrets-sync.mjs +0 -66
- /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/browser-session.mjs +0 -0
- /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/crypto.mjs +0 -0
- /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/env-import.mjs +0 -0
- /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/provider-account-sync.mjs +0 -0
- /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/provider-catalog.mjs +0 -0
- /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/provider-rotation-recipes.mjs +0 -0
- /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/rotation-capability.mjs +0 -0
- /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/secret-integration-research.mjs +0 -0
- /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/secrets-env-diff.mjs +0 -0
- /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/secrets-env-export.mjs +0 -0
- /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/secrets-keychain.mjs +0 -0
- /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/secrets-rekey.mjs +0 -0
- /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/secrets-rotate.mjs +0 -0
package/bin/total-recall.mjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import fs from 'node:fs';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* total-recall CLI
|
|
@@ -87,7 +88,6 @@ const COMMANDS = {
|
|
|
87
88
|
relay: 'relay.mjs',
|
|
88
89
|
uninstall: 'uninstall.mjs',
|
|
89
90
|
map: 'map.mjs',
|
|
90
|
-
mesh: 'mesh.mjs',
|
|
91
91
|
brain: 'brain.mjs',
|
|
92
92
|
config: 'config.mjs',
|
|
93
93
|
skill: 'skill.mjs',
|
|
@@ -96,8 +96,6 @@ const COMMANDS = {
|
|
|
96
96
|
brief: 'brief.mjs',
|
|
97
97
|
group: 'group.mjs',
|
|
98
98
|
groups: 'group.mjs',
|
|
99
|
-
secret: 'secret.mjs',
|
|
100
|
-
secrets: 'secret.mjs',
|
|
101
99
|
help: 'help.mjs',
|
|
102
100
|
collab: 'collab.mjs',
|
|
103
101
|
command: 'command.mjs',
|
|
@@ -106,6 +104,7 @@ const COMMANDS = {
|
|
|
106
104
|
watch: 'rebuild.mjs',
|
|
107
105
|
agent: 'agent.mjs',
|
|
108
106
|
agents: 'agent.mjs',
|
|
107
|
+
new: 'new.mjs',
|
|
109
108
|
plugin: 'plugin/index.mjs',
|
|
110
109
|
plugins: 'plugin/index.mjs',
|
|
111
110
|
scaffold: 'plugin/scaffold-cmd.mjs',
|
|
@@ -132,6 +131,7 @@ async function printHelp() {
|
|
|
132
131
|
|
|
133
132
|
Core (default product path):
|
|
134
133
|
init [--project] Bootstrap global or project brain + openwiki
|
|
134
|
+
new <name> [--with ids] Create a project (ssss new + Total Recall) with plugins as owned bricks
|
|
135
135
|
connect <client> Wire IDE surface (Cursor, Claude, Codex, Grok, Replit, Lovable)
|
|
136
136
|
remember / forget / edit Write-path memory (SSSS vault)
|
|
137
137
|
recall Read-path hybrid search
|
|
@@ -142,8 +142,6 @@ async function printHelp() {
|
|
|
142
142
|
daemon <cmd> Background worker (start|stop|status)
|
|
143
143
|
skill <cmd> Skills registry, deploy, multi-repo sync
|
|
144
144
|
plugin <cmd> Plugin manager: list, install, search, remove, info
|
|
145
|
-
secret <cmd> Secrets store + usage (not the vault)
|
|
146
|
-
mesh <cmd> Control-server mesh: nodes, ACL policy, Tailscale SSH
|
|
147
145
|
harness <cmd> Meta-harness manager: list, usage (5h/weekly quotas), dispatch, council
|
|
148
146
|
agent <cmd> Process controller: spawn, list, logs, kill across mesh
|
|
149
147
|
brain <cmd> Register / ensure any project brain
|
|
@@ -188,20 +186,42 @@ async function main() {
|
|
|
188
186
|
process.exit(0);
|
|
189
187
|
}
|
|
190
188
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
189
|
+
// Core built-in memory and rules commands that always run from core
|
|
190
|
+
const CORE_BUILTINS = new Set([
|
|
191
|
+
'remember', 'forget', 'edit', 'recall', 'context', 'rules',
|
|
192
|
+
'compile', 'rebuild', 'dream', 'proposals', 'proposal', 'task',
|
|
193
|
+
'daemon', 'skill', 'plugin', 'plugins',
|
|
194
|
+
'harness', 'agent', 'agents', 'brain', 'status',
|
|
195
|
+
'doctor', 'brief', 'startup', 'init', 'connect', 'new'
|
|
196
|
+
]);
|
|
197
|
+
|
|
198
|
+
// Check installed plugins first for any non-core commands (e.g. deploy, phone, text)
|
|
199
|
+
if (!CORE_BUILTINS.has(command)) {
|
|
194
200
|
try {
|
|
195
|
-
const {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
201
|
+
const { discoverPlugins } = await import('../src/core/plugin-loader.mjs');
|
|
202
|
+
const plugins = discoverPlugins(process.cwd());
|
|
203
|
+
for (const p of plugins) {
|
|
204
|
+
if (p.valid && (p.manifest.cli?.command === command || (p.id === 'auth' && (command === 'secret' || command === 'secrets')))) {
|
|
205
|
+
const handlerRel = p.manifest.cli.handler;
|
|
206
|
+
if (handlerRel) {
|
|
207
|
+
const { runPluginCommand } = await import('../src/core/plugin-runner.mjs');
|
|
208
|
+
const pluginArgs = (command === 'secret' || command === 'secrets')
|
|
209
|
+
? ['secret', ...args.slice(1)]
|
|
210
|
+
: args.slice(1);
|
|
211
|
+
const result = await runPluginCommand(p, { args: pluginArgs, stdin: 'inherit' });
|
|
212
|
+
if (result.output) process.stdout.write(result.output);
|
|
213
|
+
process.exit(result.ok ? 0 : (result.exitCode || 1));
|
|
214
|
+
}
|
|
215
|
+
}
|
|
200
216
|
}
|
|
201
217
|
} catch (err) {
|
|
202
|
-
console.error(`Error: ${err.message}`);
|
|
218
|
+
console.error(`Error executing plugin command: ${err.message}`);
|
|
203
219
|
process.exit(1);
|
|
204
220
|
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const handlerFile = COMMANDS[command];
|
|
224
|
+
if (!handlerFile) {
|
|
205
225
|
|
|
206
226
|
// Check if it is a dynamic integration command configured in the VFS
|
|
207
227
|
try {
|
|
@@ -280,25 +300,24 @@ async function main() {
|
|
|
280
300
|
process.exit(0);
|
|
281
301
|
}
|
|
282
302
|
|
|
283
|
-
// Check installed plugins for custom CLI commands declared in manifest
|
|
284
|
-
const { discoverPlugins } = await import('../src/core/plugin-loader.mjs');
|
|
285
|
-
const plugins = discoverPlugins(process.cwd());
|
|
286
|
-
for (const p of plugins) {
|
|
287
|
-
if (p.valid && p.manifest.cli?.command === command) {
|
|
288
|
-
const handlerRel = p.manifest.cli.handler;
|
|
289
|
-
if (handlerRel) {
|
|
290
|
-
const { runPluginCommand } = await import('../src/core/plugin-runner.mjs');
|
|
291
|
-
const result = await runPluginCommand(p, { args: args.slice(1), stdin: 'inherit' });
|
|
292
|
-
if (result.output) process.stdout.write(result.output);
|
|
293
|
-
process.exit(result.ok ? 0 : (result.exitCode || 1));
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
303
|
} catch (err) {
|
|
298
304
|
console.error(`Error executing dynamic command: ${err.message}`);
|
|
299
305
|
process.exit(1);
|
|
300
306
|
}
|
|
301
307
|
|
|
308
|
+
// Any HTTP API route group without a dedicated verb: `total-recall <group> <action> …`
|
|
309
|
+
try {
|
|
310
|
+
const { loadApiRoutes } = await import('../src/core/api-routes.mjs');
|
|
311
|
+
if ((await loadApiRoutes()).some((r) => r.group === command)) {
|
|
312
|
+
const { default: apiCli } = await import('../src/cli/api.mjs');
|
|
313
|
+
await apiCli(args);
|
|
314
|
+
process.exit(process.exitCode ?? 0);
|
|
315
|
+
}
|
|
316
|
+
} catch (err) {
|
|
317
|
+
console.error(`Error: ${err.message}`);
|
|
318
|
+
process.exit(1);
|
|
319
|
+
}
|
|
320
|
+
|
|
302
321
|
console.error(`Unknown command: ${command}`);
|
|
303
322
|
console.error(`Run 'total-recall --help' for usage.`);
|
|
304
323
|
process.exit(1);
|
|
@@ -314,7 +333,7 @@ async function main() {
|
|
|
314
333
|
await handler.default(process.argv.slice(3));
|
|
315
334
|
}
|
|
316
335
|
} catch (err) {
|
|
317
|
-
if (err.code === 'ERR_MODULE_NOT_FOUND') {
|
|
336
|
+
if (err.code === 'ERR_MODULE_NOT_FOUND' && !fs.existsSync(handlerPath)) {
|
|
318
337
|
console.error(`Command '${command}' is not yet implemented.`);
|
|
319
338
|
console.error(`Expected handler at: ${handlerPath}`);
|
|
320
339
|
process.exit(1);
|
package/docs/IDE_INTEGRATION.md
CHANGED
|
@@ -1,5 +1,32 @@
|
|
|
1
1
|
# Total Recall — IDE & Agent Integration Guide
|
|
2
2
|
|
|
3
|
+
## Codex web skill discovery (verified 2026-10-08)
|
|
4
|
+
|
|
5
|
+
Enabled skills appear in the web composer's slash list. Creating files in a
|
|
6
|
+
remote checkout does not install or enable a web plugin. Standalone local
|
|
7
|
+
skills are documented for desktop, CLI and IDE; web distribution uses plugins.
|
|
8
|
+
For an existing cloud brain, package instruction routers without exporting
|
|
9
|
+
its vault or credentials:
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
total-recall scaffold codex-plugin repo-workflows --repo /path/to/repo --output /path/to/new-package
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
The package requires its owning repository at the original path. It preserves
|
|
16
|
+
relative resource resolution by loading each original skill. Install and enable
|
|
17
|
+
it through the host's supported plugin source. Packaging is not installation,
|
|
18
|
+
and a local marketplace does not prove web availability. Do not modify an
|
|
19
|
+
unrelated Total Recall plugin schema to make an OpenAI package.
|
|
20
|
+
|
|
21
|
+
For local Codex, repository discovery scans `.agents/skills` from CWD upward,
|
|
22
|
+
not child repositories. User skills use `~/.agents/skills`. Symlinks are supported.
|
|
23
|
+
`/skills` and `$name` are documented CLI/IDE selectors; the web slash list must
|
|
24
|
+
be checked separately. A `command` frontmatter field alone is not registration.
|
|
25
|
+
|
|
26
|
+
Sources: [slash commands](https://learn.chatgpt.com/docs/reference/slash-commands),
|
|
27
|
+
[build skills](https://learn.chatgpt.com/docs/build-skills),
|
|
28
|
+
[plugin packaging](https://developers.openai.com/plugins/build/plugins).
|
|
29
|
+
|
|
3
30
|
Total Recall serves as the core memory kernel. **Claude Code**, **Cursor**, **Codex CLI**, **Antigravity CLI**, **Aider**, and **VS Code Copilot** act as specialized interfaces on top of it. This guide details how to seamlessly wire each client to the brain.
|
|
4
31
|
|
|
5
32
|
---
|
|
@@ -646,3 +646,13 @@ agents:
|
|
|
646
646
|
|
|
647
647
|
### `secrets.enc` (AES Encrypted Credentials)
|
|
648
648
|
- Secure, GPG symmetrically password-encrypted binary container enclosing environment tokens (`google_api_key`, `github_token`, `openai_api_key`) with owner-only `0o600` access modes. Plaintext keys are never written to disk.
|
|
649
|
+
|
|
650
|
+
### `update --all-brains`
|
|
651
|
+
|
|
652
|
+
Plan a uniform SSSS and Total Recall release across registered brains, installed plugin owners and nested package consumers.
|
|
653
|
+
|
|
654
|
+
- `total-recall update --all-brains`: read-only plan.
|
|
655
|
+
- `total-recall update --all-brains --apply --json`: pin published releases, use npm/pnpm, replace shared node_modules links with local installations and verify actual versions.
|
|
656
|
+
- `--repo <path>` (repeatable) and `TR_SYNC_REPOS` include extra roots.
|
|
657
|
+
|
|
658
|
+
Import aliases and dependency sections are preserved. Failed installs restore changed manifests, owner lockfiles and detached links; verification failures produce a nonzero exit. Existing newer previews require explicit resolution rather than a silent downgrade. This command changes local dependencies only.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
:root{--bg-primary:#070b14;--bg-secondary:#0c1220;--bg-tertiary:#121a2b;--bg-elevated:#172033;--bg-hover:#1c2740;--bg-active:#243352;--accent:#3b82f6;--accent-deep:#1e3a8a;--accent-glow:#3b82f647;--accent-hover:#60a5fa;--accent-muted:#3b82f624;--accent-soft:#93c5fd1f;--purple-primary:var(--accent);--purple-border:var(--border-accent);--success:#34d399;--success-muted:#34d3991f;--warning:#fbbf24;--warning-muted:#fbbf241f;--error:#f87171;--error-muted:#f871711f;--text-primary:#f1f5f9;--text-secondary:#94a3b8;--text-tertiary:#64748b;--text-inverse:#070b14;--border:#94a3b81a;--border-hover:#94a3b838;--border-accent:#3b82f659;--glass:#0c1220b8;--glass-border:#94a3b81f;--mesh-1:#1e3a8a59;--mesh-2:#3b82f61f;--mesh-3:#0f172ae6;--font-sans:"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--font-mono:"JetBrains Mono", "SF Mono", ui-monospace, monospace;--sidebar-width:252px;--radius-sm:8px;--radius-md:12px;--radius-lg:18px;--radius-xl:24px;--shadow-sm:0 1px 2px #00000059;--shadow-md:0 8px 24px #00000059;--shadow-lg:0 24px 64px #00000073;--shadow-glow:0 0 40px #3b82f62e;--transition-fast:.14s cubic-bezier(.23, 1, .32, 1);--transition-normal:.22s cubic-bezier(.23, 1, .32, 1)}*,:before,:after{box-sizing:border-box;margin:0;padding:0}html,body,#root{background:var(--bg-primary);height:100%;color:var(--text-primary);font-family:var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizelegibility;font-size:14px;line-height:1.6}body{background:radial-gradient(1200px 600px at 10% -10%, var(--mesh-1), transparent 55%), radial-gradient(900px 500px at 100% 0%, var(--mesh-2), transparent 50%), radial-gradient(800px 400px at 50% 100%, #1e3a8a33, transparent 60%), var(--bg-primary)}a{color:var(--accent);text-decoration:none}a:hover{color:var(--accent-hover)}button{font-family:var(--font-sans);cursor:pointer;border:none;outline:none}code,pre{font-family:var(--font-mono)}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--bg-hover);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--text-tertiary)}.app-layout{height:100vh;display:flex;position:relative;overflow:hidden}.sidebar{width:var(--sidebar-width);min-width:var(--sidebar-width);background:var(--glass);-webkit-backdrop-filter:blur(20px)saturate(1.4);border-right:1px solid var(--glass-border);transition:transform var(--transition-normal);z-index:100;flex-direction:column;padding:14px 0 12px;display:flex;box-shadow:4px 0 40px #00000040}.sidebar-brand{border-bottom:1px solid var(--border);flex-direction:column;gap:10px;margin-bottom:10px;padding:4px 16px 18px;display:flex}.sidebar-brand-row{align-items:center;gap:12px;display:flex}.sidebar-brand h1{color:var(--text-primary);letter-spacing:-.03em;font-size:15px;font-weight:700;line-height:1.2}.sidebar-brand span{color:var(--text-tertiary);letter-spacing:.02em;font-size:11px;font-weight:500}.sidebar-brand-lockup{background:linear-gradient(#f8fafc 0%,#e8eef9 100%);border-radius:12px;width:100%;padding:10px 12px;overflow:hidden;box-shadow:inset 0 1px #ffffffb3,0 8px 20px #0f172a59,0 0 0 1px #94a3b833}.sidebar-brand-lockup img{object-fit:contain;width:100%;height:auto;display:block}.sidebar-nav{scrollbar-width:thin;flex-direction:column;flex:1;gap:2px;padding:0 10px;display:flex;overflow-y:auto}.nav-section-label{text-transform:uppercase;letter-spacing:.08em;color:var(--text-tertiary);opacity:.85;padding:12px 12px 6px;font-size:10px;font-weight:600}.nav-link{color:var(--text-secondary);transition:all var(--transition-fast);border:1px solid #0000;border-radius:10px;align-items:center;gap:10px;padding:9px 12px;font-size:13px;font-weight:500;text-decoration:none;display:flex;position:relative}.nav-link:hover{color:var(--text-primary);background:#94a3b814}.nav-link.active{color:#dbeafe;border-color:var(--border-accent);background:linear-gradient(135deg,#3b82f62e,#1e3a8a38);box-shadow:0 0 0 1px #3b82f614,inset 0 1px #ffffff0a}.nav-link.active:before{content:"";background:linear-gradient(#60a5fa,#2563eb);border-radius:0 3px 3px 0;width:3px;position:absolute;top:20%;bottom:20%;left:0;box-shadow:0 0 12px #3b82f699}.nav-link svg{opacity:.72;flex-shrink:0;width:18px;height:18px}.nav-link.active svg{opacity:1;color:#93c5fd}.nav-link:hover svg{opacity:.95}.sidebar-footer{border-top:1px solid var(--border);background:linear-gradient(#0000,#0f172a66);margin-top:8px;padding:12px 14px}.main-content{background:0 0;flex-direction:column;flex:1;min-width:0;display:flex;overflow:hidden}.page{flex:1;padding:28px 32px 40px;overflow-y:auto}.page-header{margin-bottom:28px}.page-header h1{letter-spacing:-.03em;background:linear-gradient(135deg,#f8fafc 0%,#93c5fd 100%);-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text;font-size:24px;font-weight:700}.page-header p{color:var(--text-secondary);max-width:56ch;margin-top:6px;font-size:13.5px}.card{border:1px solid var(--border);border-radius:var(--radius-md);transition:border-color var(--transition-normal), box-shadow var(--transition-normal), transform var(--transition-normal);box-shadow:var(--shadow-sm);background:linear-gradient(165deg,#172033e6,#0c1220f2);padding:20px}.card:hover{border-color:var(--border-hover);box-shadow:var(--shadow-md)}.card-grid{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px;display:grid}.btn{transition:all var(--transition-fast);letter-spacing:-.01em;border-radius:10px;align-items:center;gap:6px;padding:9px 16px;font-size:13px;font-weight:600;display:inline-flex}.btn-primary{color:#fff;background:linear-gradient(135deg,#3b82f6 0%,#2563eb 55%,#1d4ed8 100%);box-shadow:inset 0 1px #ffffff26,0 8px 20px #2563eb47}.btn-primary:hover{box-shadow:0 0 28px var(--accent-glow), 0 8px 24px #2563eb59;background:linear-gradient(135deg,#60a5fa 0%,#3b82f6 50%,#2563eb 100%);transform:translateY(-1px)}.btn-ghost{color:var(--text-secondary);border:1px solid var(--border);background:#94a3b80f}.btn-ghost:hover{color:var(--text-primary);border-color:var(--border-hover);background:#94a3b81f}.btn-sm{padding:6px 11px;font-size:12px}.alert{border-radius:var(--radius-sm);border:1px solid #0000;padding:12px 16px;font-size:13px;font-weight:500}.alert-error{background:var(--error-muted);color:var(--error);border-color:#f8717140}.alert-success{background:var(--success-muted);color:var(--success);border-color:#34d39940}.alert-warning{background:var(--warning-muted);color:var(--warning);border-color:#fbbf2440}.input,.select{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text-primary);font-family:var(--font-sans);transition:border-color var(--transition-fast), box-shadow var(--transition-fast);outline:none;padding:9px 12px;font-size:13px}.input:focus,.select:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-muted)}.input::placeholder{color:var(--text-tertiary)}.select{cursor:pointer;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");background-position:right 10px center;background-repeat:no-repeat;padding-right:32px}.data-table{border-collapse:collapse;width:100%}.data-table th{text-align:left;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.04em;border-bottom:1px solid var(--border);background:var(--bg-secondary);padding:12px 16px;font-size:12px;font-weight:500}.data-table td{border-bottom:1px solid var(--border);color:var(--text-primary);padding:14px 16px;font-size:13px}.data-table tbody tr{transition:background var(--transition-fast)}.data-table tbody tr:hover{background:var(--bg-hover)}.data-table tr.is-leader td{background:var(--accent-soft)}.page-container{max-width:1200px;margin:0 auto;padding:32px}.page-header{justify-content:space-between;align-items:center;margin-bottom:32px;display:flex}.page-header h1{color:var(--text-primary);font-size:24px;font-weight:600}.badge{letter-spacing:.03em;border-radius:4px;align-items:center;padding:3px 8px;font-size:11px;font-weight:600;display:inline-flex}.badge-online,.badge-active{background:var(--success-muted);color:var(--success)}.badge-offline,.badge-inactive{background:var(--error-muted);color:var(--error)}.badge-leader{color:var(--accent-hover);background:#3b82f626}.badge-follower{background:var(--bg-hover);color:var(--text-secondary)}.surface-premium{border:1px solid var(--glass-border);border-radius:var(--radius-lg);box-shadow:var(--shadow-md), inset 0 1px 0 #ffffff0a;background:linear-gradient(165deg,#172033eb,#0c1220f5)}.login-shell{justify-content:center;align-items:center;min-height:100vh;padding:24px;display:flex;position:relative;overflow:hidden}.login-shell:before{content:"";pointer-events:none;background:radial-gradient(50% 40% at 20% 20%,#2563eb47,#0000 55%),radial-gradient(45% 35% at 80% 70%,#1e3a8a59,#0000 50%),radial-gradient(30% 25%,#60a5fa14,#0000 60%);animation:18s ease-in-out infinite alternate meshDrift;position:absolute;inset:-20%}@keyframes meshDrift{0%{transform:translate(0,0)scale(1)}to{transform:translate(-2%,2%)scale(1.05)}}.login-card{z-index:1;border-radius:var(--radius-xl);-webkit-backdrop-filter:blur(24px);backdrop-filter:blur(24px);background:linear-gradient(165deg,#121a2beb,#080c16f5);border:1px solid #94a3b824;flex-direction:column;gap:28px;width:min(400px,100%);padding:40px 36px;display:flex;position:relative;box-shadow:0 0 0 1px #3b82f614,0 32px 80px #0000008c,0 0 80px #2563eb1f}.onboarding-shell{max-width:680px;margin:0 auto;padding:36px 22px 72px}.onboarding-progress{background:#94a3b81a;border-radius:99px;height:6px;overflow:hidden;box-shadow:inset 0 1px 2px #0000004d}.onboarding-progress>div{background:linear-gradient(90deg,#1e40af,#3b82f6,#93c5fd);border-radius:99px;height:100%;transition:width .3s cubic-bezier(.23,1,.32,1);box-shadow:0 0 16px #3b82f680}.loop-card{border:1px solid var(--border-accent);border-radius:var(--radius-md);font-family:var(--font-mono);color:#cbd5e1;background:linear-gradient(145deg,#1e3a8a40,#0c1220cc);padding:18px 20px;font-size:12.5px;line-height:1.85;box-shadow:inset 0 1px #ffffff0a}.badge{text-transform:uppercase;letter-spacing:.04em;border-radius:99px;align-items:center;gap:4px;padding:3px 8px;font-size:11px;font-weight:600;display:inline-flex}.badge-success{background:var(--success-muted);color:var(--success)}.badge-warning{background:var(--warning-muted);color:var(--warning)}.badge-error{background:var(--error-muted);color:var(--error)}.badge-accent{background:var(--accent-muted);color:var(--accent)}.chat-container{flex-direction:column;flex:1;height:calc(100vh - 1px);display:flex;overflow:hidden}.chat-messages{flex-direction:column;flex:1;gap:16px;padding:24px 32px;display:flex;overflow-y:auto}.chat-empty{color:var(--text-tertiary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:12px;display:flex}.chat-empty svg{opacity:.3;width:48px;height:48px}.chat-empty h2{color:var(--text-secondary);font-size:18px;font-weight:600}.chat-empty p{font-size:13px}.message{border-radius:var(--radius-md);white-space:pre-wrap;word-break:break-word;max-width:720px;padding:14px 18px;font-size:14px;line-height:1.7;animation:.2s msgIn}@keyframes msgIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.message-user{color:#fff;background:linear-gradient(135deg,#3b82f6 0%,#2563eb 100%);border-bottom-right-radius:4px;align-self:flex-end;box-shadow:0 8px 24px #2563eb38}.message-assistant{border:1px solid var(--border);box-shadow:var(--shadow-sm);background:linear-gradient(165deg,#172033f2,#0c1220fa);border-bottom-left-radius:4px;align-self:flex-start}.message-assistant code{background:var(--bg-primary);border-radius:4px;padding:1px 5px;font-size:12.5px}.chat-input-bar{border-top:1px solid var(--border);background:var(--bg-secondary);padding:16px 32px 20px}.chat-input-wrapper{align-items:flex-end;gap:8px;max-width:800px;margin:0 auto;display:flex}.chat-input-wrapper textarea{resize:none;background:var(--bg-tertiary);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text-primary);font-family:var(--font-sans);min-height:44px;max-height:160px;transition:border-color var(--transition-fast);flex:1;padding:12px 16px;font-size:14px;line-height:1.5}.chat-input-wrapper textarea:focus{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-glow);outline:none}.chat-input-wrapper textarea::placeholder{color:var(--text-tertiary)}.chat-send-btn{border-radius:var(--radius-md);color:#fff;width:44px;height:44px;transition:all var(--transition-fast);background:linear-gradient(135deg,#3b82f6,#1d4ed8);flex-shrink:0;justify-content:center;align-items:center;display:flex;box-shadow:0 4px 14px #2563eb59}.chat-send-btn:hover{box-shadow:0 0 24px var(--accent-glow);background:linear-gradient(135deg,#60a5fa,#2563eb);transform:translateY(-1px)}.chat-send-btn:disabled{opacity:.4;cursor:not-allowed;box-shadow:none}.chat-send-btn svg{width:18px;height:18px}.memory-layout{grid-template-columns:220px 1fr;gap:20px;height:calc(100vh - 120px);display:grid}.memory-sidebar{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);padding:12px;overflow-y:auto}.memory-sidebar h3{text-transform:uppercase;letter-spacing:.06em;color:var(--text-tertiary);padding:8px 8px 6px;font-size:11px}.category-btn{border-radius:var(--radius-sm);width:100%;color:var(--text-secondary);text-align:left;transition:all var(--transition-fast);background:0 0;justify-content:space-between;align-items:center;padding:8px 10px;font-size:13px;display:flex}.category-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.category-btn.active{background:var(--accent-muted);color:var(--accent)}.category-count{background:var(--bg-tertiary);color:var(--text-tertiary);border-radius:99px;padding:1px 6px;font-size:11px}.memory-main{flex-direction:column;gap:12px;display:flex;overflow:hidden}.memory-search{gap:8px;display:flex}.memory-search input{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text-primary);font-size:13px;font-family:var(--font-sans);transition:border-color var(--transition-fast);flex:1;padding:10px 14px}.memory-search input:focus{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-glow);outline:none}.memory-search input::placeholder{color:var(--text-tertiary)}.memory-list{flex-direction:column;flex:1;gap:8px;display:flex;overflow-y:auto}.memory-node-card{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);cursor:pointer;transition:all var(--transition-fast);padding:14px 16px}.memory-node-card:hover{border-color:var(--accent);background:var(--bg-tertiary)}.memory-node-card.selected{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent-glow)}.memory-node-card h4{margin-bottom:4px;font-size:14px;font-weight:600}.memory-node-card .meta{color:var(--text-tertiary);gap:12px;font-size:12px;display:flex}.memory-detail{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);padding:24px;overflow-y:auto}.memory-detail h2{margin-bottom:12px;font-size:18px}.memory-detail pre{background:var(--bg-primary);border:1px solid var(--border);border-radius:var(--radius-sm);white-space:pre-wrap;color:var(--text-secondary);padding:16px;font-size:12px;line-height:1.7;overflow-x:auto}.memory-detail .frontmatter{background:var(--bg-tertiary);border-radius:var(--radius-sm);grid-template-columns:auto 1fr;gap:4px 16px;margin-bottom:16px;padding:12px 16px;font-size:13px;display:grid}.frontmatter dt{color:var(--text-tertiary);font-weight:500}.frontmatter dd{color:var(--text-primary)}.health-grid{grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:16px;margin-bottom:24px;display:grid}.stat-card{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);text-align:center;transition:border-color var(--transition-normal);padding:20px}.stat-card:hover{border-color:var(--border-hover)}.stat-card .value{letter-spacing:-.02em;font-size:28px;font-weight:700}.stat-card .label{color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.04em;margin-top:4px;font-size:12px}.stat-card.healthy .value{color:var(--success)}.stat-card.warning .value{color:var(--warning)}.stat-card.error .value{color:var(--error)}.health-log{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);padding:20px}.health-log h3{margin-bottom:12px;font-size:14px;font-weight:600}.health-log table{border-collapse:collapse;width:100%;font-size:13px}.health-log th{text-align:left;color:var(--text-tertiary);border-bottom:1px solid var(--border);padding:8px 12px;font-weight:500}.health-log td{border-bottom:1px solid var(--border);color:var(--text-secondary);padding:8px 12px}.sandbox-layout{grid-template-rows:1fr auto 1fr;gap:0;height:calc(100vh - 120px);display:grid}.sandbox-editor{flex-direction:column;display:flex;overflow:hidden}.sandbox-editor-header{background:var(--bg-tertiary);border:1px solid var(--border);border-radius:var(--radius-md) var(--radius-md) 0 0;color:var(--text-tertiary);justify-content:space-between;align-items:center;padding:8px 12px;font-size:12px;display:flex}.sandbox-editor textarea{resize:none;background:var(--bg-secondary);border:1px solid var(--border);border-radius:0 0 var(--radius-md) var(--radius-md);width:100%;color:var(--text-primary);font-family:var(--font-mono);tab-size:2;border-top:none;flex:1;padding:16px;font-size:13px;line-height:1.6}.sandbox-editor textarea:focus{border-color:var(--accent);outline:none}.sandbox-toolbar{justify-content:center;align-items:center;padding:8px;display:flex}.sandbox-output{background:var(--bg-primary);border:1px solid var(--border);border-radius:var(--radius-md);font-family:var(--font-mono);color:var(--success);white-space:pre-wrap;padding:16px;font-size:13px;line-height:1.6;overflow-y:auto}.sandbox-output.error{color:var(--error)}.pulse{background:var(--success);border-radius:50%;width:8px;height:8px;animation:2s infinite pulseAnim;display:inline-block}@keyframes pulseAnim{0%,to{box-shadow:0 0 #00cec966}50%{box-shadow:0 0 0 6px #00cec900}}.skeleton{background:linear-gradient(90deg, var(--bg-tertiary) 25%, var(--bg-hover) 50%, var(--bg-tertiary) 75%);border-radius:var(--radius-sm);background-size:200% 100%;animation:1.5s infinite shimmer}@keyframes shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (width<=768px){.sidebar{position:fixed;top:0;bottom:0;left:0;transform:translate(-100%);box-shadow:0 0 40px #00000080}.sidebar.open{transform:translate(0)}.memory-layout{grid-template-columns:1fr;height:auto}.page{padding:16px}.btn,.nav-link,.category-btn{touch-action:manipulation;min-height:44px}.chat-input-wrapper textarea,.memory-search input,.sandbox-editor textarea{font-size:16px}.chat-input-bar{padding:12px 16px 16px}}.chat-layout{width:100%;height:100%;display:flex;overflow:hidden}.chat-threads-sidebar{background:var(--bg-secondary);border-right:1px solid var(--border);flex-direction:column;flex-shrink:0;width:260px;height:100%;display:flex;overflow:hidden}.sidebar-header{border-bottom:1px solid var(--border);padding:16px}.new-chat-btn{background:var(--accent);color:#fff;border-radius:var(--radius-sm);width:100%;transition:all var(--transition-fast);cursor:pointer;border:none;justify-content:center;align-items:center;gap:8px;padding:10px 16px;font-size:13px;font-weight:500;display:flex}.new-chat-btn:hover{background:var(--accent-hover);box-shadow:0 0 16px var(--accent-glow)}.thread-list{flex-direction:column;flex:1;gap:6px;padding:16px 12px;display:flex;overflow-y:auto}.thread-item{border-radius:var(--radius-sm);cursor:pointer;transition:all var(--transition-fast);border:1px solid #0000;justify-content:space-between;align-items:center;padding:10px 12px;display:flex;position:relative}.thread-item:hover{background:var(--bg-hover)}.thread-item.active{border-color:var(--border);background:#ffffff0d}.thread-info{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}.thread-title{color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:500;overflow:hidden}.thread-meta{color:var(--text-tertiary);align-items:center;gap:8px;font-size:11px;display:flex}.thread-delete-btn{color:var(--text-tertiary);cursor:pointer;opacity:0;transition:all var(--transition-fast);background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;padding:4px;display:flex}.thread-item:hover .thread-delete-btn{opacity:1}.thread-delete-btn:hover{color:var(--error);background:var(--error-muted)}.chat-suggestions-container{width:100%;max-width:900px;margin-top:32px;animation:.4s ease-out fadeIn}.chat-suggestions-container h3{text-transform:uppercase;letter-spacing:.08em;color:var(--text-tertiary);text-align:center;margin-bottom:16px;font-size:12px}.chat-suggestions-deck{grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:16px;width:100%;display:grid}.suggestion-card{-webkit-backdrop-filter:blur(12px);border-radius:var(--radius-md);cursor:pointer;text-align:left;transition:all var(--transition-normal);background:#12121a73;border:1px solid #ffffff0d;gap:14px;padding:16px;display:flex;position:relative;overflow:hidden}.suggestion-card:before{content:"";opacity:.8;width:4px;height:100%;transition:width var(--transition-fast) ease;position:absolute;top:0;left:0}.suggestion-card.card-fact:before{background:var(--success)}.suggestion-card.card-concept:before{background:var(--accent)}.suggestion-card.card-question:before{background:var(--warning)}.suggestion-card:hover{background:#1a1a2699;border-color:#ffffff1f;transform:translateY(-2px);box-shadow:0 8px 24px #0003}.suggestion-card:hover:before{width:6px}.suggestion-card.card-fact:hover{border-color:#00cec940;box-shadow:0 8px 24px #00cec90f}.suggestion-card.card-concept:hover{border-color:#6c5ce740;box-shadow:0 8px 24px #6c5ce70f}.suggestion-card.card-question:hover{border-color:#fdcb6e40;box-shadow:0 8px 24px #fdcb6e0f}.suggestion-card-icon{-webkit-user-select:none;user-select:none;align-items:flex-start;padding-top:2px;font-size:22px;display:flex}.suggestion-card-content{flex-direction:column;flex:1;gap:6px;min-width:0;display:flex}.suggestion-card-content h4{color:var(--text-primary);font-size:13.5px;font-weight:600;line-height:1.4}.suggestion-card-content p{color:var(--text-secondary);font-size:12.5px;line-height:1.5}.suggestion-card-nodes{flex-wrap:wrap;gap:6px;margin-top:8px;display:flex}.suggestion-node-pill{background:var(--bg-tertiary);border:1px solid var(--border);color:var(--text-secondary);white-space:nowrap;text-overflow:ellipsis;border-radius:4px;max-width:140px;padding:2px 6px;font-size:10px;font-weight:500;overflow:hidden}.grounding-pills{border:1px solid var(--border);border-radius:var(--radius-md) var(--radius-md) 0 0;background:#12121a66;border-bottom:none;flex-wrap:wrap;align-items:center;gap:8px;padding:8px 12px;display:flex}.grounding-pill{background:var(--accent-muted);color:var(--text-primary);transition:all var(--transition-fast);border:1px solid #6c5ce74d;border-radius:99px;align-items:center;gap:6px;padding:4px 10px;font-size:12px;font-weight:500;display:inline-flex}.grounding-pill:hover{background:#6c5ce733;border-color:#6c5ce780}.grounding-pill svg{color:var(--accent);flex-shrink:0}.grounding-pill-title{text-overflow:ellipsis;white-space:nowrap;max-width:150px;overflow:hidden}.grounding-pill-remove{color:var(--text-tertiary);cursor:pointer;transition:color var(--transition-fast);background:0 0;border:none;justify-content:center;align-items:center;padding:0 2px;font-size:14px;line-height:1;display:inline-flex}.grounding-pill-remove:hover{color:var(--error)}.grounding-count-badge{background:var(--accent);color:#fff;border:1.5px solid var(--bg-secondary);min-width:16px;height:16px;box-shadow:0 0 8px var(--accent-glow);border-radius:50%;justify-content:center;align-items:center;font-size:9px;font-weight:700;animation:.2s cubic-bezier(.175,.885,.32,1.275) popIn;display:flex;position:absolute;top:-4px;right:-4px}.node-selector-popover{-webkit-backdrop-filter:blur(20px);border-radius:var(--radius-lg);z-index:50;background:#12121ad9;border:1px solid #ffffff14;flex-direction:column;width:320px;max-height:380px;animation:.25s cubic-bezier(.16,1,.3,1) slideUp;display:flex;position:absolute;bottom:calc(100% + 12px);left:0;overflow:hidden;box-shadow:0 12px 32px #0006}.node-selector-header{border-bottom:1px solid var(--border);flex-direction:column;gap:8px;padding:14px 16px 10px;display:flex}.node-selector-header h4{color:var(--text-primary);letter-spacing:.02em;font-size:13px;font-weight:600}.node-search-input{background:var(--bg-tertiary);border:1px solid var(--border);border-radius:var(--radius-sm);width:100%;color:var(--text-primary);font-size:12px;font-family:var(--font-sans);transition:all var(--transition-fast);padding:6px 10px}.node-search-input:focus{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-glow);outline:none}.node-selector-list{flex-direction:column;flex:1;gap:2px;padding:8px;display:flex;overflow-y:auto}.node-selector-empty{text-align:center;color:var(--text-tertiary);padding:24px;font-size:12px}.node-selector-item{border-radius:var(--radius-sm);cursor:pointer;transition:all var(--transition-fast);align-items:center;gap:10px;padding:8px 12px;display:flex}.node-selector-item:hover{background:var(--bg-hover)}.node-selector-item.selected{background:var(--accent-muted)}.node-selector-item-checkbox{border:1px solid var(--text-tertiary);width:16px;height:16px;color:var(--accent);transition:all var(--transition-fast);background:var(--bg-tertiary);border-radius:3px;flex-shrink:0;justify-content:center;align-items:center;font-size:11px;font-weight:700;display:flex}.node-selector-item.selected .node-selector-item-checkbox{background:var(--accent);border-color:var(--accent);color:#fff}.node-selector-item-info{flex-direction:column;flex:1;min-width:0;display:flex}.node-selector-item-title{color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:500;overflow:hidden}.node-selector-item-meta{color:var(--text-tertiary);text-transform:capitalize;font-size:11px}.animate-fade-in{animation:.2s ease-out fadeIn}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideUp{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}@keyframes popIn{0%{opacity:0;transform:scale(.6)}to{opacity:1;transform:scale(1)}}.graph-3d-wrapper{-webkit-user-select:none;user-select:none;background:radial-gradient(circle,#0a0d16 0%,#020408 100%);width:100%;height:100%;position:relative;overflow:hidden}.node-detail-drawer{-webkit-backdrop-filter:blur(25px);border-radius:var(--radius-lg);z-index:100;width:350px;color:var(--text-primary);background:#0a0f1ebf;border:1px solid #ffffff14;flex-direction:column;display:flex;position:absolute;top:20px;bottom:20px;right:20px;overflow:hidden;box-shadow:0 16px 48px #00000080,inset 0 0 0 1px #ffffff0d}.animate-slide-in{animation:.4s cubic-bezier(.16,1,.3,1) forwards slideInRight}@keyframes slideInRight{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}.drawer-header{border-bottom:1px solid #ffffff0f;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.drawer-badge{text-transform:uppercase;letter-spacing:.05em;border-radius:4px;padding:4px 8px;font-size:10px;font-weight:700}.drawer-badge.badge-memory{color:#c084fc;background:#8b5cf626;border:1px solid #8b5cf64d}.drawer-badge.badge-thread{color:#22d3ee;background:#06b6d426;border:1px solid #06b6d44d}.drawer-badge.badge-research{color:#fbbf24;background:#f59e0b26;border:1px solid #f59e0b4d}.drawer-close-btn{color:var(--text-tertiary);cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;padding:4px;font-size:20px;transition:color .15s;display:flex}.drawer-close-btn:hover{color:#fff}.drawer-body{flex-direction:column;flex:1;gap:12px;padding:20px;display:flex;overflow-y:auto}.drawer-title{color:#fff;margin:0;font-size:18px;font-weight:700;line-height:1.35}.drawer-subtitle{color:var(--text-tertiary);margin-top:-4px;font-size:11px}.drawer-status{background:#ffffff08;border:1px solid #ffffff0a;border-radius:6px;align-items:center;gap:8px;width:fit-content;padding:6px 12px;font-size:12px;display:flex}.drawer-status .label{color:var(--text-tertiary)}.drawer-status .value{text-transform:capitalize;font-weight:600}.drawer-status .value.status-completed,.drawer-status .value.status-done,.drawer-status .value.status-active{color:#10b981}.drawer-status .value.status-in-progress{color:#f59e0b}.drawer-status .value.status-pending{color:#3b82f6}.drawer-excerpt{color:var(--text-secondary);white-space:pre-wrap;margin-top:8px;font-size:13.5px;line-height:1.6}.drawer-footer{background:#00000026;border-top:1px solid #ffffff0f;padding:16px 20px}.drawer-action-btn{border-radius:var(--radius-sm);cursor:pointer;width:100%;transition:all var(--transition-fast);border:none;justify-content:center;align-items:center;padding:10px 16px;font-size:13px;font-weight:600;display:flex}.drawer-action-btn.btn-cyan{color:#fff;background:#06b6d4}.drawer-action-btn.btn-cyan:hover{background:#0891b2;box-shadow:0 0 16px #06b6d466}.drawer-action-btn.btn-purple{color:#fff;background:#8b5cf6}.drawer-action-btn.btn-purple:hover{background:#7c3aed;box-shadow:0 0 16px #8b5cf666}@media (width<=768px){.node-detail-drawer{width:auto;height:300px;bottom:20px;left:20px}}.chat-messages:has(.graph-3d-wrapper){padding:0;overflow:hidden}.chat-header{-webkit-backdrop-filter:blur(16px);border-bottom:1px solid var(--border);z-index:40;background:#12121aeb;flex-shrink:0;justify-content:space-between;align-items:center;padding:12px 24px;display:flex;position:relative;overflow:visible}.chat-header-title{align-items:center;gap:10px;display:flex}.chat-header-title h2{color:var(--text-primary);letter-spacing:-.01em;font-size:15px;font-weight:600}.chat-header-model-selector{align-items:center;gap:8px;display:flex}.chat-header-model-selector span.selector-label{color:var(--text-tertiary);font-size:12px;font-weight:500}.model-selector-dropdown-wrapper{position:relative}.model-selector-dropdown-btn{border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text-secondary);transition:all var(--transition-fast);cursor:pointer;background:#ffffff0a;align-items:center;gap:8px;padding:6px 12px;font-size:13px;font-weight:500;display:flex}.model-selector-dropdown-btn:hover{border-color:var(--border-hover);color:var(--text-primary);background:#ffffff14}.model-selector-dropdown-btn.active{border-color:var(--accent);color:var(--text-primary);background:var(--accent-muted)}.model-selector-menu{-webkit-backdrop-filter:blur(20px);border:1px solid var(--border);border-radius:var(--radius-md);z-index:200;pointer-events:auto;background:#12121afa;flex-direction:column;gap:2px;width:240px;margin-top:6px;padding:6px;animation:.15s ease-out popoverIn;display:flex;position:absolute;top:100%;right:0;box-shadow:0 12px 32px #0000008c}@keyframes popoverIn{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.model-selector-item{border-radius:var(--radius-sm);cursor:pointer;transition:all var(--transition-fast);text-align:left;justify-content:space-between;align-items:center;padding:8px 12px;display:flex}.model-selector-item:hover{background:var(--bg-hover)}.model-selector-item.selected{background:var(--accent-muted)}.model-selector-item-info{flex-direction:column;gap:2px;display:flex}.model-selector-item-name{color:var(--text-primary);font-size:13px;font-weight:500}.model-selector-item.selected .model-selector-item-name{color:var(--accent)}.model-selector-item-desc{color:var(--text-tertiary);font-size:11px}.model-selector-item-badge{background:var(--bg-tertiary);color:var(--text-tertiary);text-transform:uppercase;border-radius:99px;padding:2px 6px;font-size:9px;font-weight:600}.model-selector-item.selected .model-selector-item-badge{background:var(--accent-muted);color:var(--accent)}@media (width<=768px){button,a,[role=button]{min-width:44px;min-height:44px}.chat-input-area{bottom:0;bottom:env(safe-area-inset-bottom,0);position:sticky}.app-container{padding-left:env(safe-area-inset-left,0);padding-right:env(safe-area-inset-right,0);padding-bottom:env(safe-area-inset-bottom,0)}}@media (display-mode:standalone){body{padding-top:env(safe-area-inset-top,0)}}.network-page{animation:.35s ease-out page-fade-in}@keyframes page-fade-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.stat-grid{grid-template-columns:repeat(3,1fr);gap:16px;margin-bottom:32px;display:grid}.stat-card{text-align:center;flex-direction:column;align-items:center;padding:24px 16px;display:flex}.stat-value{color:var(--text-primary);font-variant-numeric:tabular-nums;font-size:32px;font-weight:700;line-height:1.2;transition:color .3s}.stat-value.error{color:var(--error)}.stat-value.success{color:var(--success)}.stat-value.accent{color:var(--accent)}.stat-label{color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.06em;margin-top:8px;font-size:12px;font-weight:500}.network-sections{grid-template-columns:1fr 1fr;gap:24px;margin-bottom:32px;display:grid}.network-section-full{margin-bottom:32px}.section-title{color:var(--text-primary);align-items:center;gap:8px;margin-bottom:16px;font-size:15px;font-weight:600;display:flex}.blocklist-items{max-height:240px;margin:0 0 12px;padding:0;list-style:none;overflow-y:auto}.blocklist-item{border-bottom:1px solid var(--border);font-family:var(--font-mono);color:var(--text-primary);transition:background var(--transition-fast);justify-content:space-between;align-items:center;padding:8px 12px;font-size:13px;display:flex}.blocklist-item:hover{background:var(--bg-hover)}.blocklist-item:last-child{border-bottom:none}.blocklist-remove{color:var(--error);opacity:.6;transition:opacity var(--transition-fast), background var(--transition-fast);background:0 0;border-radius:4px;padding:4px 8px;font-size:12px}.blocklist-remove:hover{opacity:1;background:var(--error-muted)}.blocklist-add{gap:8px;display:flex}.blocklist-add .input{flex:1}.limits-form{flex-direction:column;gap:12px;display:flex}.limits-row{justify-content:space-between;align-items:center;gap:12px;display:flex}.limits-label{color:var(--text-secondary);flex-shrink:0;font-size:13px}.limits-input{text-align:right;width:100px}.limits-actions{justify-content:flex-end;margin-top:8px;display:flex}.audit-filters{flex-wrap:wrap;gap:12px;margin-bottom:16px;display:flex}.audit-filters .input,.audit-filters .select{flex:1;min-width:140px}.audit-status-badge{border-radius:3px;align-items:center;padding:2px 6px;font-size:11px;font-weight:600;display:inline-flex}.audit-status-badge.success{background:var(--success-muted);color:var(--success)}.audit-status-badge.error{background:var(--error-muted);color:var(--error)}.audit-status-badge.timeout{background:var(--warning-muted);color:var(--warning)}.toggle-row{align-items:center;gap:12px;margin-bottom:16px;display:flex}.toggle-switch{background:var(--bg-hover);cursor:pointer;width:44px;height:24px;transition:background var(--transition-fast);border:1px solid var(--border);border-radius:12px;flex-shrink:0;position:relative}.toggle-switch.active{background:var(--accent);border-color:var(--accent)}.toggle-switch:after{content:"";width:18px;height:18px;transition:transform var(--transition-fast);background:#fff;border-radius:50%;position:absolute;top:2px;left:2px;box-shadow:0 1px 3px #0003}.toggle-switch.active:after{transform:translate(20px)}.toggle-label{color:var(--text-secondary);font-size:13px}.refresh-controls{align-items:center;gap:8px;display:flex}.refresh-controls .select{width:auto;padding:6px 28px 6px 10px;font-size:12px}.empty-state{text-align:center;color:var(--text-tertiary);padding:32px 16px;font-size:13px;font-style:italic}@media (width<=768px){.stat-grid,.network-sections{grid-template-columns:1fr}}.secrets-page{animation:.35s ease-out secrets-fade-in}@keyframes secrets-fade-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.secrets-stats{grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:16px;margin-bottom:24px;display:grid}.stat-box{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-sm);transition:border-color var(--transition-fast);flex-direction:column;gap:4px;padding:16px 20px;display:flex}.stat-box:hover{border-color:var(--border-hover)}.stat-box .label{text-transform:uppercase;letter-spacing:.05em;color:var(--text-secondary);font-size:12px}.secrets-grid{grid-template-columns:1.8fr 1.2fr;align-items:start;gap:24px;display:grid}@media (width<=1024px){.secrets-grid{grid-template-columns:1fr}}.secrets-actions{flex-direction:column;gap:24px;display:flex}.field-label{color:var(--text-secondary);margin-bottom:6px;font-size:13px;font-weight:500;display:block}.input{background:var(--bg-tertiary);border:1px solid var(--border);border-radius:var(--radius-sm);width:100%;color:var(--text-primary);transition:all var(--transition-fast);padding:10px 14px;font-size:14px}.input:focus{border-color:var(--border-accent);box-shadow:0 0 0 2px var(--accent-muted);outline:none}.btn-reveal-toggle{cursor:pointer;opacity:.6;transition:opacity var(--transition-fast);background:0 0;border:none;font-size:16px;position:absolute;top:50%;right:12px;transform:translateY(-50%)}.btn-reveal-toggle:hover{opacity:1}.selected-row{background:var(--bg-hover)!important;border-left:3px solid var(--accent)!important}.spinner{border:2px solid #ffffff4d;border-top-color:#fff;border-radius:50%;width:16px;height:16px;animation:.8s linear infinite spin;display:inline-block}@keyframes spin{to{transform:rotate(360deg)}}.sync-logs-container::-webkit-scrollbar{width:6px}.sync-logs-container::-webkit-scrollbar-track{background:0 0}.sync-logs-container::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}.sync-logs-container::-webkit-scrollbar-thumb:hover{background:var(--border-hover)}.mesh-page{animation:.35s ease-out mesh-fade-in}@keyframes mesh-fade-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.latency-sparkline{vertical-align:middle;display:inline-block}.latency-sparkline--empty{color:var(--text-secondary);font-size:12px}.latency-matrix-wrap{overflow-x:auto}.latency-matrix{border-collapse:collapse;width:100%;font-size:13px}.latency-matrix th,.latency-matrix td{border:1px solid var(--border,#7f7f7f40);text-align:center;white-space:nowrap;padding:8px 10px}.latency-matrix th{background:var(--surface-2,#7f7f7f14);font-weight:600}.latency-matrix td.is-self{background:var(--surface-2,#7f7f7f0f);color:var(--text-secondary)}.latency-matrix .from-label{text-align:left;font-weight:500}.latency-matrix .rtt-cell{font-variant-numeric:tabular-nums}.webhooks-page{animation:.35s ease-out page-fade-in}.wizard-modal{width:100%;max-width:600px}.wizard-steps{justify-content:space-between;margin-bottom:24px;display:flex;position:relative}.wizard-steps:before{content:"";z-index:0;background:#ffffff1a;height:2px;position:absolute;top:12px;left:0;right:0}.wizard-step{background:var(--bg-surface);color:var(--text-muted);z-index:1;border:2px solid #ffffff1a;border-radius:50%;justify-content:center;align-items:center;width:28px;height:28px;font-size:14px;font-weight:600;transition:all .3s;display:flex}.wizard-step.active{background:var(--primary);color:#fff;border-color:var(--primary);box-shadow:0 0 12px #6366f180}.wizard-step.completed{background:var(--success);color:#fff;border-color:var(--success)}.json-viewer{color:#a5b4fc;background:#0003;border:1px solid #ffffff0d;border-radius:8px;margin-top:8px;padding:12px;font-family:Fira Code,monospace;font-size:13px;overflow-x:auto}.json-toggle{color:var(--primary);cursor:pointer;background:0 0;border:none;margin-top:4px;padding:0;font-size:12px}.json-toggle:hover{text-decoration:underline}.webhook-stats{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:16px;margin-bottom:24px;display:grid}.stat-box{text-align:center;background:#ffffff08;border:1px solid #ffffff0d;border-radius:12px;padding:16px}.stat-box .label{color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px;margin-bottom:8px;font-size:12px}.stat-box .value{color:var(--text-primary);font-size:24px;font-weight:700}.rotate-btn{color:var(--text-primary);cursor:pointer;background:#ffffff0d;border:1px solid #ffffff1a;border-radius:4px;padding:4px 8px;font-size:12px;transition:all .2s}.rotate-btn:hover{background:#ffffff1a}.notifications-page{animation:.35s ease-out notif-fade-in}@keyframes notif-fade-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.notif-rules-card{padding:0;overflow:hidden}.notif-rules-actions{gap:6px;display:flex}.priority-badge{text-transform:uppercase;letter-spacing:.04em;border-radius:4px;align-items:center;padding:2px 8px;font-size:11px;font-weight:600;display:inline-flex}.priority-badge.critical{background:var(--error-muted);color:var(--error)}.priority-badge.high{background:var(--warning-muted);color:var(--warning)}.priority-badge.low{background:var(--success-muted);color:var(--success)}.notif-toggle{background:var(--bg-hover);cursor:pointer;width:40px;height:22px;transition:background var(--transition-fast);border:1px solid var(--border);border-radius:11px;flex-shrink:0;position:relative}.notif-toggle.active{background:var(--accent);border-color:var(--accent)}.notif-toggle:after{content:"";width:16px;height:16px;transition:transform var(--transition-fast);background:#fff;border-radius:50%;position:absolute;top:2px;left:2px;box-shadow:0 1px 3px #0003}.notif-toggle.active:after{transform:translate(18px)}.notif-history-header{justify-content:space-between;align-items:center;margin-bottom:16px;display:flex}.notif-history-header h2{color:var(--text-primary);font-size:15px;font-weight:600}.notif-history-list{flex-direction:column;gap:10px;max-height:420px;display:flex;overflow-y:auto}.notif-history-entry{background:var(--bg-hover);border-radius:var(--radius-sm);transition:background var(--transition-fast);justify-content:space-between;align-items:flex-start;padding:14px 16px;display:flex}.notif-history-entry:hover{background:var(--bg-secondary)}.notif-entry-content{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}.notif-entry-title{color:var(--text-primary);font-size:14px;font-weight:500}.notif-entry-message{color:var(--text-secondary);white-space:nowrap;text-overflow:ellipsis;font-size:13px;overflow:hidden}.notif-entry-meta{flex-direction:column;flex-shrink:0;align-items:flex-end;gap:4px;margin-left:16px;display:flex}.notif-entry-time{color:var(--text-tertiary);white-space:nowrap;font-size:12px}.notif-status-badge{border-radius:3px;align-items:center;padding:2px 6px;font-size:11px;font-weight:600;display:inline-flex}.notif-status-badge.delivered{background:var(--success-muted);color:var(--success)}.notif-status-badge.failed{background:var(--error-muted);color:var(--error)}.notif-quiet-hours-row{align-items:center;gap:10px;display:flex}.notif-quiet-hours-label{color:var(--text-secondary);cursor:pointer;font-size:13px}.notif-empty{text-align:center;color:var(--text-tertiary);padding:32px 16px;font-size:13px;font-style:italic}@media (width<=768px){.notif-history-entry{flex-direction:column;gap:8px}.notif-entry-meta{flex-direction:row;align-items:center;margin-left:0}}
|
|
1
|
+
:root{--bg-primary:#070b14;--bg-secondary:#0c1220;--bg-tertiary:#121a2b;--bg-elevated:#172033;--bg-hover:#1c2740;--bg-active:#243352;--accent:#3b82f6;--accent-deep:#1e3a8a;--accent-glow:#3b82f647;--accent-hover:#60a5fa;--accent-muted:#3b82f624;--accent-soft:#93c5fd1f;--purple-primary:var(--accent);--purple-border:var(--border-accent);--success:#34d399;--success-muted:#34d3991f;--warning:#fbbf24;--warning-muted:#fbbf241f;--error:#f87171;--error-muted:#f871711f;--text-primary:#f1f5f9;--text-secondary:#94a3b8;--text-tertiary:#64748b;--text-inverse:#070b14;--border:#94a3b81a;--border-hover:#94a3b838;--border-accent:#3b82f659;--glass:#0c1220b8;--glass-border:#94a3b81f;--mesh-1:#1e3a8a59;--mesh-2:#3b82f61f;--mesh-3:#0f172ae6;--font-sans:"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--font-mono:"JetBrains Mono", "SF Mono", ui-monospace, monospace;--sidebar-width:252px;--radius-sm:8px;--radius-md:12px;--radius-lg:18px;--radius-xl:24px;--shadow-sm:0 1px 2px #00000059;--shadow-md:0 8px 24px #00000059;--shadow-lg:0 24px 64px #00000073;--shadow-glow:0 0 40px #3b82f62e;--transition-fast:.14s cubic-bezier(.23, 1, .32, 1);--transition-normal:.22s cubic-bezier(.23, 1, .32, 1)}*,:before,:after{box-sizing:border-box;margin:0;padding:0}html,body,#root{background:var(--bg-primary);height:100%;color:var(--text-primary);font-family:var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizelegibility;font-size:14px;line-height:1.6}body{background:radial-gradient(1200px 600px at 10% -10%, var(--mesh-1), transparent 55%), radial-gradient(900px 500px at 100% 0%, var(--mesh-2), transparent 50%), radial-gradient(800px 400px at 50% 100%, #1e3a8a33, transparent 60%), var(--bg-primary)}a{color:var(--accent);text-decoration:none}a:hover{color:var(--accent-hover)}button{font-family:var(--font-sans);cursor:pointer;border:none;outline:none}code,pre{font-family:var(--font-mono)}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--bg-hover);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--text-tertiary)}.app-layout{height:100vh;display:flex;position:relative;overflow:hidden}.sidebar{width:var(--sidebar-width);min-width:var(--sidebar-width);background:var(--glass);-webkit-backdrop-filter:blur(20px)saturate(1.4);border-right:1px solid var(--glass-border);transition:transform var(--transition-normal);z-index:100;flex-direction:column;padding:14px 0 12px;display:flex;box-shadow:4px 0 40px #00000040}.sidebar-brand{border-bottom:1px solid var(--border);flex-direction:column;gap:10px;margin-bottom:10px;padding:4px 16px 18px;display:flex}.sidebar-brand-row{align-items:center;gap:12px;display:flex}.sidebar-brand h1{color:var(--text-primary);letter-spacing:-.03em;font-size:15px;font-weight:700;line-height:1.2}.sidebar-brand span{color:var(--text-tertiary);letter-spacing:.02em;font-size:11px;font-weight:500}.sidebar-brand-lockup{background:linear-gradient(#f8fafc 0%,#e8eef9 100%);border-radius:12px;width:100%;padding:10px 12px;overflow:hidden;box-shadow:inset 0 1px #ffffffb3,0 8px 20px #0f172a59,0 0 0 1px #94a3b833}.sidebar-brand-lockup img{object-fit:contain;width:100%;height:auto;display:block}.sidebar-nav{scrollbar-width:thin;flex-direction:column;flex:1;gap:2px;padding:0 10px;display:flex;overflow-y:auto}.nav-section-label{text-transform:uppercase;letter-spacing:.08em;color:var(--text-tertiary);opacity:.85;padding:12px 12px 6px;font-size:10px;font-weight:600}.nav-link{color:var(--text-secondary);transition:all var(--transition-fast);border:1px solid #0000;border-radius:10px;align-items:center;gap:10px;padding:9px 12px;font-size:13px;font-weight:500;text-decoration:none;display:flex;position:relative}.nav-link:hover{color:var(--text-primary);background:#94a3b814}.nav-link.active{color:#dbeafe;border-color:var(--border-accent);background:linear-gradient(135deg,#3b82f62e,#1e3a8a38);box-shadow:0 0 0 1px #3b82f614,inset 0 1px #ffffff0a}.nav-link.active:before{content:"";background:linear-gradient(#60a5fa,#2563eb);border-radius:0 3px 3px 0;width:3px;position:absolute;top:20%;bottom:20%;left:0;box-shadow:0 0 12px #3b82f699}.nav-link svg{opacity:.72;flex-shrink:0;width:18px;height:18px}.nav-link.active svg{opacity:1;color:#93c5fd}.nav-link:hover svg{opacity:.95}.sidebar-footer{border-top:1px solid var(--border);background:linear-gradient(#0000,#0f172a66);margin-top:8px;padding:12px 14px}.main-content{background:0 0;flex-direction:column;flex:1;min-width:0;display:flex;overflow:hidden}.page{flex:1;padding:28px 32px 40px;overflow-y:auto}.page-header{margin-bottom:28px}.page-header h1{letter-spacing:-.03em;background:linear-gradient(135deg,#f8fafc 0%,#93c5fd 100%);-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text;font-size:24px;font-weight:700}.page-header p{color:var(--text-secondary);max-width:56ch;margin-top:6px;font-size:13.5px}.card{border:1px solid var(--border);border-radius:var(--radius-md);transition:border-color var(--transition-normal), box-shadow var(--transition-normal), transform var(--transition-normal);box-shadow:var(--shadow-sm);background:linear-gradient(165deg,#172033e6,#0c1220f2);padding:20px}.card:hover{border-color:var(--border-hover);box-shadow:var(--shadow-md)}.card-grid{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px;display:grid}.btn{transition:all var(--transition-fast);letter-spacing:-.01em;border-radius:10px;align-items:center;gap:6px;padding:9px 16px;font-size:13px;font-weight:600;display:inline-flex}.btn-primary{color:#fff;background:linear-gradient(135deg,#3b82f6 0%,#2563eb 55%,#1d4ed8 100%);box-shadow:inset 0 1px #ffffff26,0 8px 20px #2563eb47}.btn-primary:hover{box-shadow:0 0 28px var(--accent-glow), 0 8px 24px #2563eb59;background:linear-gradient(135deg,#60a5fa 0%,#3b82f6 50%,#2563eb 100%);transform:translateY(-1px)}.btn-ghost{color:var(--text-secondary);border:1px solid var(--border);background:#94a3b80f}.btn-ghost:hover{color:var(--text-primary);border-color:var(--border-hover);background:#94a3b81f}.btn-sm{padding:6px 11px;font-size:12px}.alert{border-radius:var(--radius-sm);border:1px solid #0000;padding:12px 16px;font-size:13px;font-weight:500}.alert-error{background:var(--error-muted);color:var(--error);border-color:#f8717140}.alert-success{background:var(--success-muted);color:var(--success);border-color:#34d39940}.alert-warning{background:var(--warning-muted);color:var(--warning);border-color:#fbbf2440}.input,.select{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text-primary);font-family:var(--font-sans);transition:border-color var(--transition-fast), box-shadow var(--transition-fast);outline:none;padding:9px 12px;font-size:13px}.input:focus,.select:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-muted)}.input::placeholder{color:var(--text-tertiary)}.select{cursor:pointer;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");background-position:right 10px center;background-repeat:no-repeat;padding-right:32px}.data-table{border-collapse:collapse;width:100%}.data-table th{text-align:left;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.04em;border-bottom:1px solid var(--border);background:var(--bg-secondary);padding:12px 16px;font-size:12px;font-weight:500}.data-table td{border-bottom:1px solid var(--border);color:var(--text-primary);padding:14px 16px;font-size:13px}.data-table tbody tr{transition:background var(--transition-fast)}.data-table tbody tr:hover{background:var(--bg-hover)}.data-table tr.is-leader td{background:var(--accent-soft)}.page-container{max-width:1200px;margin:0 auto;padding:32px}.page-header{justify-content:space-between;align-items:center;margin-bottom:32px;display:flex}.page-header h1{color:var(--text-primary);font-size:24px;font-weight:600}.badge{letter-spacing:.03em;border-radius:4px;align-items:center;padding:3px 8px;font-size:11px;font-weight:600;display:inline-flex}.badge-online,.badge-active{background:var(--success-muted);color:var(--success)}.badge-offline,.badge-inactive{background:var(--error-muted);color:var(--error)}.badge-leader{color:var(--accent-hover);background:#3b82f626}.badge-follower{background:var(--bg-hover);color:var(--text-secondary)}.surface-premium{border:1px solid var(--glass-border);border-radius:var(--radius-lg);box-shadow:var(--shadow-md), inset 0 1px 0 #ffffff0a;background:linear-gradient(165deg,#172033eb,#0c1220f5)}.login-shell{justify-content:center;align-items:center;min-height:100vh;padding:24px;display:flex;position:relative;overflow:hidden}.login-shell:before{content:"";pointer-events:none;background:radial-gradient(50% 40% at 20% 20%,#2563eb47,#0000 55%),radial-gradient(45% 35% at 80% 70%,#1e3a8a59,#0000 50%),radial-gradient(30% 25%,#60a5fa14,#0000 60%);animation:18s ease-in-out infinite alternate meshDrift;position:absolute;inset:-20%}@keyframes meshDrift{0%{transform:translate(0,0)scale(1)}to{transform:translate(-2%,2%)scale(1.05)}}.login-card{z-index:1;border-radius:var(--radius-xl);-webkit-backdrop-filter:blur(24px);backdrop-filter:blur(24px);background:linear-gradient(165deg,#121a2beb,#080c16f5);border:1px solid #94a3b824;flex-direction:column;gap:28px;width:min(400px,100%);padding:40px 36px;display:flex;position:relative;box-shadow:0 0 0 1px #3b82f614,0 32px 80px #0000008c,0 0 80px #2563eb1f}.onboarding-shell{max-width:680px;margin:0 auto;padding:36px 22px 72px}.onboarding-progress{background:#94a3b81a;border-radius:99px;height:6px;overflow:hidden;box-shadow:inset 0 1px 2px #0000004d}.onboarding-progress>div{background:linear-gradient(90deg,#1e40af,#3b82f6,#93c5fd);border-radius:99px;height:100%;transition:width .3s cubic-bezier(.23,1,.32,1);box-shadow:0 0 16px #3b82f680}.loop-card{border:1px solid var(--border-accent);border-radius:var(--radius-md);font-family:var(--font-mono);color:#cbd5e1;background:linear-gradient(145deg,#1e3a8a40,#0c1220cc);padding:18px 20px;font-size:12.5px;line-height:1.85;box-shadow:inset 0 1px #ffffff0a}.badge{text-transform:uppercase;letter-spacing:.04em;border-radius:99px;align-items:center;gap:4px;padding:3px 8px;font-size:11px;font-weight:600;display:inline-flex}.badge-success{background:var(--success-muted);color:var(--success)}.badge-warning{background:var(--warning-muted);color:var(--warning)}.badge-error{background:var(--error-muted);color:var(--error)}.badge-accent{background:var(--accent-muted);color:var(--accent)}.chat-container{flex-direction:column;flex:1;height:calc(100vh - 1px);display:flex;overflow:hidden}.chat-messages{flex-direction:column;flex:1;gap:16px;padding:24px 32px;display:flex;overflow-y:auto}.chat-empty{color:var(--text-tertiary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:12px;display:flex}.chat-empty svg{opacity:.3;width:48px;height:48px}.chat-empty h2{color:var(--text-secondary);font-size:18px;font-weight:600}.chat-empty p{font-size:13px}.message{border-radius:var(--radius-md);white-space:pre-wrap;word-break:break-word;max-width:720px;padding:14px 18px;font-size:14px;line-height:1.7;animation:.2s msgIn}@keyframes msgIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.message-user{color:#fff;background:linear-gradient(135deg,#3b82f6 0%,#2563eb 100%);border-bottom-right-radius:4px;align-self:flex-end;box-shadow:0 8px 24px #2563eb38}.message-assistant{border:1px solid var(--border);box-shadow:var(--shadow-sm);background:linear-gradient(165deg,#172033f2,#0c1220fa);border-bottom-left-radius:4px;align-self:flex-start}.message-assistant code{background:var(--bg-primary);border-radius:4px;padding:1px 5px;font-size:12.5px}.chat-input-bar{border-top:1px solid var(--border);background:var(--bg-secondary);padding:16px 32px 20px}.chat-input-wrapper{align-items:flex-end;gap:8px;max-width:800px;margin:0 auto;display:flex}.chat-input-wrapper textarea{resize:none;background:var(--bg-tertiary);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text-primary);font-family:var(--font-sans);min-height:44px;max-height:160px;transition:border-color var(--transition-fast);flex:1;padding:12px 16px;font-size:14px;line-height:1.5}.chat-input-wrapper textarea:focus{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-glow);outline:none}.chat-input-wrapper textarea::placeholder{color:var(--text-tertiary)}.chat-send-btn{border-radius:var(--radius-md);color:#fff;width:44px;height:44px;transition:all var(--transition-fast);background:linear-gradient(135deg,#3b82f6,#1d4ed8);flex-shrink:0;justify-content:center;align-items:center;display:flex;box-shadow:0 4px 14px #2563eb59}.chat-send-btn:hover{box-shadow:0 0 24px var(--accent-glow);background:linear-gradient(135deg,#60a5fa,#2563eb);transform:translateY(-1px)}.chat-send-btn:disabled{opacity:.4;cursor:not-allowed;box-shadow:none}.chat-send-btn svg{width:18px;height:18px}.memory-layout{grid-template-columns:220px 1fr;gap:20px;height:calc(100vh - 120px);display:grid}.memory-sidebar{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);padding:12px;overflow-y:auto}.memory-sidebar h3{text-transform:uppercase;letter-spacing:.06em;color:var(--text-tertiary);padding:8px 8px 6px;font-size:11px}.category-btn{border-radius:var(--radius-sm);width:100%;color:var(--text-secondary);text-align:left;transition:all var(--transition-fast);background:0 0;justify-content:space-between;align-items:center;padding:8px 10px;font-size:13px;display:flex}.category-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.category-btn.active{background:var(--accent-muted);color:var(--accent)}.category-count{background:var(--bg-tertiary);color:var(--text-tertiary);border-radius:99px;padding:1px 6px;font-size:11px}.memory-main{flex-direction:column;gap:12px;display:flex;overflow:hidden}.memory-search{gap:8px;display:flex}.memory-search input{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text-primary);font-size:13px;font-family:var(--font-sans);transition:border-color var(--transition-fast);flex:1;padding:10px 14px}.memory-search input:focus{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-glow);outline:none}.memory-search input::placeholder{color:var(--text-tertiary)}.memory-list{flex-direction:column;flex:1;gap:8px;display:flex;overflow-y:auto}.memory-node-card{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);cursor:pointer;transition:all var(--transition-fast);padding:14px 16px}.memory-node-card:hover{border-color:var(--accent);background:var(--bg-tertiary)}.memory-node-card.selected{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent-glow)}.memory-node-card h4{margin-bottom:4px;font-size:14px;font-weight:600}.memory-node-card .meta{color:var(--text-tertiary);gap:12px;font-size:12px;display:flex}.memory-detail{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);padding:24px;overflow-y:auto}.memory-detail h2{margin-bottom:12px;font-size:18px}.memory-detail pre{background:var(--bg-primary);border:1px solid var(--border);border-radius:var(--radius-sm);white-space:pre-wrap;color:var(--text-secondary);padding:16px;font-size:12px;line-height:1.7;overflow-x:auto}.memory-detail .frontmatter{background:var(--bg-tertiary);border-radius:var(--radius-sm);grid-template-columns:auto 1fr;gap:4px 16px;margin-bottom:16px;padding:12px 16px;font-size:13px;display:grid}.frontmatter dt{color:var(--text-tertiary);font-weight:500}.frontmatter dd{color:var(--text-primary)}.health-grid{grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:16px;margin-bottom:24px;display:grid}.stat-card{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);text-align:center;transition:border-color var(--transition-normal);padding:20px}.stat-card:hover{border-color:var(--border-hover)}.stat-card .value{letter-spacing:-.02em;font-size:28px;font-weight:700}.stat-card .label{color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.04em;margin-top:4px;font-size:12px}.stat-card.healthy .value{color:var(--success)}.stat-card.warning .value{color:var(--warning)}.stat-card.error .value{color:var(--error)}.health-log{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);padding:20px}.health-log h3{margin-bottom:12px;font-size:14px;font-weight:600}.health-log table{border-collapse:collapse;width:100%;font-size:13px}.health-log th{text-align:left;color:var(--text-tertiary);border-bottom:1px solid var(--border);padding:8px 12px;font-weight:500}.health-log td{border-bottom:1px solid var(--border);color:var(--text-secondary);padding:8px 12px}.sandbox-layout{grid-template-rows:1fr auto 1fr;gap:0;height:calc(100vh - 120px);display:grid}.sandbox-editor{flex-direction:column;display:flex;overflow:hidden}.sandbox-editor-header{background:var(--bg-tertiary);border:1px solid var(--border);border-radius:var(--radius-md) var(--radius-md) 0 0;color:var(--text-tertiary);justify-content:space-between;align-items:center;padding:8px 12px;font-size:12px;display:flex}.sandbox-editor textarea{resize:none;background:var(--bg-secondary);border:1px solid var(--border);border-radius:0 0 var(--radius-md) var(--radius-md);width:100%;color:var(--text-primary);font-family:var(--font-mono);tab-size:2;border-top:none;flex:1;padding:16px;font-size:13px;line-height:1.6}.sandbox-editor textarea:focus{border-color:var(--accent);outline:none}.sandbox-toolbar{justify-content:center;align-items:center;padding:8px;display:flex}.sandbox-output{background:var(--bg-primary);border:1px solid var(--border);border-radius:var(--radius-md);font-family:var(--font-mono);color:var(--success);white-space:pre-wrap;padding:16px;font-size:13px;line-height:1.6;overflow-y:auto}.sandbox-output.error{color:var(--error)}.pulse{background:var(--success);border-radius:50%;width:8px;height:8px;animation:2s infinite pulseAnim;display:inline-block}@keyframes pulseAnim{0%,to{box-shadow:0 0 #00cec966}50%{box-shadow:0 0 0 6px #00cec900}}.skeleton{background:linear-gradient(90deg, var(--bg-tertiary) 25%, var(--bg-hover) 50%, var(--bg-tertiary) 75%);border-radius:var(--radius-sm);background-size:200% 100%;animation:1.5s infinite shimmer}@keyframes shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (width<=768px){.sidebar{position:fixed;top:0;bottom:0;left:0;transform:translate(-100%);box-shadow:0 0 40px #00000080}.sidebar.open{transform:translate(0)}.memory-layout{grid-template-columns:1fr;height:auto}.page{padding:16px}.btn,.nav-link,.category-btn{touch-action:manipulation;min-height:44px}.chat-input-wrapper textarea,.memory-search input,.sandbox-editor textarea{font-size:16px}.chat-input-bar{padding:12px 16px 16px}}.chat-layout{width:100%;height:100%;display:flex;overflow:hidden}.chat-threads-sidebar{background:var(--bg-secondary);border-right:1px solid var(--border);flex-direction:column;flex-shrink:0;width:260px;height:100%;display:flex;overflow:hidden}.sidebar-header{border-bottom:1px solid var(--border);padding:16px}.new-chat-btn{background:var(--accent);color:#fff;border-radius:var(--radius-sm);width:100%;transition:all var(--transition-fast);cursor:pointer;border:none;justify-content:center;align-items:center;gap:8px;padding:10px 16px;font-size:13px;font-weight:500;display:flex}.new-chat-btn:hover{background:var(--accent-hover);box-shadow:0 0 16px var(--accent-glow)}.thread-list{flex-direction:column;flex:1;gap:6px;padding:16px 12px;display:flex;overflow-y:auto}.thread-item{border-radius:var(--radius-sm);cursor:pointer;transition:all var(--transition-fast);border:1px solid #0000;justify-content:space-between;align-items:center;padding:10px 12px;display:flex;position:relative}.thread-item:hover{background:var(--bg-hover)}.thread-item.active{border-color:var(--border);background:#ffffff0d}.thread-info{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}.thread-title{color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:500;overflow:hidden}.thread-meta{color:var(--text-tertiary);align-items:center;gap:8px;font-size:11px;display:flex}.thread-delete-btn{color:var(--text-tertiary);cursor:pointer;opacity:0;transition:all var(--transition-fast);background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;padding:4px;display:flex}.thread-item:hover .thread-delete-btn{opacity:1}.thread-delete-btn:hover{color:var(--error);background:var(--error-muted)}.chat-suggestions-container{width:100%;max-width:900px;margin-top:32px;animation:.4s ease-out fadeIn}.chat-suggestions-container h3{text-transform:uppercase;letter-spacing:.08em;color:var(--text-tertiary);text-align:center;margin-bottom:16px;font-size:12px}.chat-suggestions-deck{grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:16px;width:100%;display:grid}.suggestion-card{-webkit-backdrop-filter:blur(12px);border-radius:var(--radius-md);cursor:pointer;text-align:left;transition:all var(--transition-normal);background:#12121a73;border:1px solid #ffffff0d;gap:14px;padding:16px;display:flex;position:relative;overflow:hidden}.suggestion-card:before{content:"";opacity:.8;width:4px;height:100%;transition:width var(--transition-fast) ease;position:absolute;top:0;left:0}.suggestion-card.card-fact:before{background:var(--success)}.suggestion-card.card-concept:before{background:var(--accent)}.suggestion-card.card-question:before{background:var(--warning)}.suggestion-card:hover{background:#1a1a2699;border-color:#ffffff1f;transform:translateY(-2px);box-shadow:0 8px 24px #0003}.suggestion-card:hover:before{width:6px}.suggestion-card.card-fact:hover{border-color:#00cec940;box-shadow:0 8px 24px #00cec90f}.suggestion-card.card-concept:hover{border-color:#6c5ce740;box-shadow:0 8px 24px #6c5ce70f}.suggestion-card.card-question:hover{border-color:#fdcb6e40;box-shadow:0 8px 24px #fdcb6e0f}.suggestion-card-icon{-webkit-user-select:none;user-select:none;align-items:flex-start;padding-top:2px;font-size:22px;display:flex}.suggestion-card-content{flex-direction:column;flex:1;gap:6px;min-width:0;display:flex}.suggestion-card-content h4{color:var(--text-primary);font-size:13.5px;font-weight:600;line-height:1.4}.suggestion-card-content p{color:var(--text-secondary);font-size:12.5px;line-height:1.5}.suggestion-card-nodes{flex-wrap:wrap;gap:6px;margin-top:8px;display:flex}.suggestion-node-pill{background:var(--bg-tertiary);border:1px solid var(--border);color:var(--text-secondary);white-space:nowrap;text-overflow:ellipsis;border-radius:4px;max-width:140px;padding:2px 6px;font-size:10px;font-weight:500;overflow:hidden}.grounding-pills{border:1px solid var(--border);border-radius:var(--radius-md) var(--radius-md) 0 0;background:#12121a66;border-bottom:none;flex-wrap:wrap;align-items:center;gap:8px;padding:8px 12px;display:flex}.grounding-pill{background:var(--accent-muted);color:var(--text-primary);transition:all var(--transition-fast);border:1px solid #6c5ce74d;border-radius:99px;align-items:center;gap:6px;padding:4px 10px;font-size:12px;font-weight:500;display:inline-flex}.grounding-pill:hover{background:#6c5ce733;border-color:#6c5ce780}.grounding-pill svg{color:var(--accent);flex-shrink:0}.grounding-pill-title{text-overflow:ellipsis;white-space:nowrap;max-width:150px;overflow:hidden}.grounding-pill-remove{color:var(--text-tertiary);cursor:pointer;transition:color var(--transition-fast);background:0 0;border:none;justify-content:center;align-items:center;padding:0 2px;font-size:14px;line-height:1;display:inline-flex}.grounding-pill-remove:hover{color:var(--error)}.grounding-count-badge{background:var(--accent);color:#fff;border:1.5px solid var(--bg-secondary);min-width:16px;height:16px;box-shadow:0 0 8px var(--accent-glow);border-radius:50%;justify-content:center;align-items:center;font-size:9px;font-weight:700;animation:.2s cubic-bezier(.175,.885,.32,1.275) popIn;display:flex;position:absolute;top:-4px;right:-4px}.node-selector-popover{-webkit-backdrop-filter:blur(20px);border-radius:var(--radius-lg);z-index:50;background:#12121ad9;border:1px solid #ffffff14;flex-direction:column;width:320px;max-height:380px;animation:.25s cubic-bezier(.16,1,.3,1) slideUp;display:flex;position:absolute;bottom:calc(100% + 12px);left:0;overflow:hidden;box-shadow:0 12px 32px #0006}.node-selector-header{border-bottom:1px solid var(--border);flex-direction:column;gap:8px;padding:14px 16px 10px;display:flex}.node-selector-header h4{color:var(--text-primary);letter-spacing:.02em;font-size:13px;font-weight:600}.node-search-input{background:var(--bg-tertiary);border:1px solid var(--border);border-radius:var(--radius-sm);width:100%;color:var(--text-primary);font-size:12px;font-family:var(--font-sans);transition:all var(--transition-fast);padding:6px 10px}.node-search-input:focus{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-glow);outline:none}.node-selector-list{flex-direction:column;flex:1;gap:2px;padding:8px;display:flex;overflow-y:auto}.node-selector-empty{text-align:center;color:var(--text-tertiary);padding:24px;font-size:12px}.node-selector-item{border-radius:var(--radius-sm);cursor:pointer;transition:all var(--transition-fast);align-items:center;gap:10px;padding:8px 12px;display:flex}.node-selector-item:hover{background:var(--bg-hover)}.node-selector-item.selected{background:var(--accent-muted)}.node-selector-item-checkbox{border:1px solid var(--text-tertiary);width:16px;height:16px;color:var(--accent);transition:all var(--transition-fast);background:var(--bg-tertiary);border-radius:3px;flex-shrink:0;justify-content:center;align-items:center;font-size:11px;font-weight:700;display:flex}.node-selector-item.selected .node-selector-item-checkbox{background:var(--accent);border-color:var(--accent);color:#fff}.node-selector-item-info{flex-direction:column;flex:1;min-width:0;display:flex}.node-selector-item-title{color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:500;overflow:hidden}.node-selector-item-meta{color:var(--text-tertiary);text-transform:capitalize;font-size:11px}.animate-fade-in{animation:.2s ease-out fadeIn}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideUp{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}@keyframes popIn{0%{opacity:0;transform:scale(.6)}to{opacity:1;transform:scale(1)}}.graph-3d-wrapper{-webkit-user-select:none;user-select:none;background:radial-gradient(circle,#0a0d16 0%,#020408 100%);width:100%;height:100%;position:relative;overflow:hidden}.node-detail-drawer{-webkit-backdrop-filter:blur(25px);border-radius:var(--radius-lg);z-index:100;width:350px;color:var(--text-primary);background:#0a0f1ebf;border:1px solid #ffffff14;flex-direction:column;display:flex;position:absolute;top:20px;bottom:20px;right:20px;overflow:hidden;box-shadow:0 16px 48px #00000080,inset 0 0 0 1px #ffffff0d}.animate-slide-in{animation:.4s cubic-bezier(.16,1,.3,1) forwards slideInRight}@keyframes slideInRight{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}.drawer-header{border-bottom:1px solid #ffffff0f;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.drawer-badge{text-transform:uppercase;letter-spacing:.05em;border-radius:4px;padding:4px 8px;font-size:10px;font-weight:700}.drawer-badge.badge-memory{color:#c084fc;background:#8b5cf626;border:1px solid #8b5cf64d}.drawer-badge.badge-thread{color:#22d3ee;background:#06b6d426;border:1px solid #06b6d44d}.drawer-badge.badge-research{color:#fbbf24;background:#f59e0b26;border:1px solid #f59e0b4d}.drawer-close-btn{color:var(--text-tertiary);cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;padding:4px;font-size:20px;transition:color .15s;display:flex}.drawer-close-btn:hover{color:#fff}.drawer-body{flex-direction:column;flex:1;gap:12px;padding:20px;display:flex;overflow-y:auto}.drawer-title{color:#fff;margin:0;font-size:18px;font-weight:700;line-height:1.35}.drawer-subtitle{color:var(--text-tertiary);margin-top:-4px;font-size:11px}.drawer-status{background:#ffffff08;border:1px solid #ffffff0a;border-radius:6px;align-items:center;gap:8px;width:fit-content;padding:6px 12px;font-size:12px;display:flex}.drawer-status .label{color:var(--text-tertiary)}.drawer-status .value{text-transform:capitalize;font-weight:600}.drawer-status .value.status-completed,.drawer-status .value.status-done,.drawer-status .value.status-active{color:#10b981}.drawer-status .value.status-in-progress{color:#f59e0b}.drawer-status .value.status-pending{color:#3b82f6}.drawer-excerpt{color:var(--text-secondary);white-space:pre-wrap;margin-top:8px;font-size:13.5px;line-height:1.6}.drawer-footer{background:#00000026;border-top:1px solid #ffffff0f;padding:16px 20px}.drawer-action-btn{border-radius:var(--radius-sm);cursor:pointer;width:100%;transition:all var(--transition-fast);border:none;justify-content:center;align-items:center;padding:10px 16px;font-size:13px;font-weight:600;display:flex}.drawer-action-btn.btn-cyan{color:#fff;background:#06b6d4}.drawer-action-btn.btn-cyan:hover{background:#0891b2;box-shadow:0 0 16px #06b6d466}.drawer-action-btn.btn-purple{color:#fff;background:#8b5cf6}.drawer-action-btn.btn-purple:hover{background:#7c3aed;box-shadow:0 0 16px #8b5cf666}@media (width<=768px){.node-detail-drawer{width:auto;height:300px;bottom:20px;left:20px}}.chat-messages:has(.graph-3d-wrapper){padding:0;overflow:hidden}.chat-header{-webkit-backdrop-filter:blur(16px);border-bottom:1px solid var(--border);z-index:40;background:#12121aeb;flex-shrink:0;justify-content:space-between;align-items:center;padding:12px 24px;display:flex;position:relative;overflow:visible}.chat-header-title{align-items:center;gap:10px;display:flex}.chat-header-title h2{color:var(--text-primary);letter-spacing:-.01em;font-size:15px;font-weight:600}.chat-header-model-selector{align-items:center;gap:8px;display:flex}.chat-header-model-selector span.selector-label{color:var(--text-tertiary);font-size:12px;font-weight:500}.model-selector-dropdown-wrapper{position:relative}.model-selector-dropdown-btn{border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text-secondary);transition:all var(--transition-fast);cursor:pointer;background:#ffffff0a;align-items:center;gap:8px;padding:6px 12px;font-size:13px;font-weight:500;display:flex}.model-selector-dropdown-btn:hover{border-color:var(--border-hover);color:var(--text-primary);background:#ffffff14}.model-selector-dropdown-btn.active{border-color:var(--accent);color:var(--text-primary);background:var(--accent-muted)}.model-selector-menu{-webkit-backdrop-filter:blur(20px);border:1px solid var(--border);border-radius:var(--radius-md);z-index:200;pointer-events:auto;background:#12121afa;flex-direction:column;gap:2px;width:240px;margin-top:6px;padding:6px;animation:.15s ease-out popoverIn;display:flex;position:absolute;top:100%;right:0;box-shadow:0 12px 32px #0000008c}@keyframes popoverIn{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.model-selector-item{border-radius:var(--radius-sm);cursor:pointer;transition:all var(--transition-fast);text-align:left;justify-content:space-between;align-items:center;padding:8px 12px;display:flex}.model-selector-item:hover{background:var(--bg-hover)}.model-selector-item.selected{background:var(--accent-muted)}.model-selector-item-info{flex-direction:column;gap:2px;display:flex}.model-selector-item-name{color:var(--text-primary);font-size:13px;font-weight:500}.model-selector-item.selected .model-selector-item-name{color:var(--accent)}.model-selector-item-desc{color:var(--text-tertiary);font-size:11px}.model-selector-item-badge{background:var(--bg-tertiary);color:var(--text-tertiary);text-transform:uppercase;border-radius:99px;padding:2px 6px;font-size:9px;font-weight:600}.model-selector-item.selected .model-selector-item-badge{background:var(--accent-muted);color:var(--accent)}@media (width<=768px){button,a,[role=button]{min-width:44px;min-height:44px}.chat-input-area{bottom:0;bottom:env(safe-area-inset-bottom,0);position:sticky}.app-container{padding-left:env(safe-area-inset-left,0);padding-right:env(safe-area-inset-right,0);padding-bottom:env(safe-area-inset-bottom,0)}}@media (display-mode:standalone){body{padding-top:env(safe-area-inset-top,0)}}.network-page{animation:.35s ease-out page-fade-in}@keyframes page-fade-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.stat-grid{grid-template-columns:repeat(3,1fr);gap:16px;margin-bottom:32px;display:grid}.stat-card{text-align:center;flex-direction:column;align-items:center;padding:24px 16px;display:flex}.stat-value{color:var(--text-primary);font-variant-numeric:tabular-nums;font-size:32px;font-weight:700;line-height:1.2;transition:color .3s}.stat-value.error{color:var(--error)}.stat-value.success{color:var(--success)}.stat-value.accent{color:var(--accent)}.stat-label{color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.06em;margin-top:8px;font-size:12px;font-weight:500}.network-sections{grid-template-columns:1fr 1fr;gap:24px;margin-bottom:32px;display:grid}.network-section-full{margin-bottom:32px}.section-title{color:var(--text-primary);align-items:center;gap:8px;margin-bottom:16px;font-size:15px;font-weight:600;display:flex}.blocklist-items{max-height:240px;margin:0 0 12px;padding:0;list-style:none;overflow-y:auto}.blocklist-item{border-bottom:1px solid var(--border);font-family:var(--font-mono);color:var(--text-primary);transition:background var(--transition-fast);justify-content:space-between;align-items:center;padding:8px 12px;font-size:13px;display:flex}.blocklist-item:hover{background:var(--bg-hover)}.blocklist-item:last-child{border-bottom:none}.blocklist-remove{color:var(--error);opacity:.6;transition:opacity var(--transition-fast), background var(--transition-fast);background:0 0;border-radius:4px;padding:4px 8px;font-size:12px}.blocklist-remove:hover{opacity:1;background:var(--error-muted)}.blocklist-add{gap:8px;display:flex}.blocklist-add .input{flex:1}.limits-form{flex-direction:column;gap:12px;display:flex}.limits-row{justify-content:space-between;align-items:center;gap:12px;display:flex}.limits-label{color:var(--text-secondary);flex-shrink:0;font-size:13px}.limits-input{text-align:right;width:100px}.limits-actions{justify-content:flex-end;margin-top:8px;display:flex}.audit-filters{flex-wrap:wrap;gap:12px;margin-bottom:16px;display:flex}.audit-filters .input,.audit-filters .select{flex:1;min-width:140px}.audit-status-badge{border-radius:3px;align-items:center;padding:2px 6px;font-size:11px;font-weight:600;display:inline-flex}.audit-status-badge.success{background:var(--success-muted);color:var(--success)}.audit-status-badge.error{background:var(--error-muted);color:var(--error)}.audit-status-badge.timeout{background:var(--warning-muted);color:var(--warning)}.toggle-row{align-items:center;gap:12px;margin-bottom:16px;display:flex}.toggle-switch{background:var(--bg-hover);cursor:pointer;width:44px;height:24px;transition:background var(--transition-fast);border:1px solid var(--border);border-radius:12px;flex-shrink:0;position:relative}.toggle-switch.active{background:var(--accent);border-color:var(--accent)}.toggle-switch:after{content:"";width:18px;height:18px;transition:transform var(--transition-fast);background:#fff;border-radius:50%;position:absolute;top:2px;left:2px;box-shadow:0 1px 3px #0003}.toggle-switch.active:after{transform:translate(20px)}.toggle-label{color:var(--text-secondary);font-size:13px}.refresh-controls{align-items:center;gap:8px;display:flex}.refresh-controls .select{width:auto;padding:6px 28px 6px 10px;font-size:12px}.empty-state{text-align:center;color:var(--text-tertiary);padding:32px 16px;font-size:13px;font-style:italic}@media (width<=768px){.stat-grid,.network-sections{grid-template-columns:1fr}}.webhooks-page{animation:.35s ease-out page-fade-in}.wizard-modal{width:100%;max-width:600px}.wizard-steps{justify-content:space-between;margin-bottom:24px;display:flex;position:relative}.wizard-steps:before{content:"";z-index:0;background:#ffffff1a;height:2px;position:absolute;top:12px;left:0;right:0}.wizard-step{background:var(--bg-surface);color:var(--text-muted);z-index:1;border:2px solid #ffffff1a;border-radius:50%;justify-content:center;align-items:center;width:28px;height:28px;font-size:14px;font-weight:600;transition:all .3s;display:flex}.wizard-step.active{background:var(--primary);color:#fff;border-color:var(--primary);box-shadow:0 0 12px #6366f180}.wizard-step.completed{background:var(--success);color:#fff;border-color:var(--success)}.json-viewer{color:#a5b4fc;background:#0003;border:1px solid #ffffff0d;border-radius:8px;margin-top:8px;padding:12px;font-family:Fira Code,monospace;font-size:13px;overflow-x:auto}.json-toggle{color:var(--primary);cursor:pointer;background:0 0;border:none;margin-top:4px;padding:0;font-size:12px}.json-toggle:hover{text-decoration:underline}.webhook-stats{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:16px;margin-bottom:24px;display:grid}.stat-box{text-align:center;background:#ffffff08;border:1px solid #ffffff0d;border-radius:12px;padding:16px}.stat-box .label{color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px;margin-bottom:8px;font-size:12px}.stat-box .value{color:var(--text-primary);font-size:24px;font-weight:700}.rotate-btn{color:var(--text-primary);cursor:pointer;background:#ffffff0d;border:1px solid #ffffff1a;border-radius:4px;padding:4px 8px;font-size:12px;transition:all .2s}.rotate-btn:hover{background:#ffffff1a}.card{--card-surface:var(--bg-secondary,#fff);--card-text:var(--text-primary,#111);--card-muted:var(--text-secondary,#555);--card-line:var(--border,#d4d4d8);background:var(--card-surface);color:var(--card-text);border:1px solid var(--card-line);border-radius:var(--card-radius);padding:var(--card-gap);gap:var(--card-gap);display:grid;position:relative;overflow:hidden}.card h2,.card h3{margin:0}.card h2{font-size:1.15rem}.card h3{text-transform:uppercase;letter-spacing:.06em;color:var(--card-muted);margin-bottom:6px;font-size:.8rem}.card-header{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;display:flex}.card-brand{align-items:center;gap:12px;display:flex}.card-logo{object-fit:contain;max-width:140px;height:36px}.card-logo-missing{border-radius:var(--card-radius);background:var(--card-color);width:36px;height:36px}.card-header-band{background:var(--card-color);color:var(--card-on-color);margin:calc(var(--card-gap)*-1) calc(var(--card-gap)*-1) 0;padding:var(--card-gap)}.card-header-ledger-rule{border-bottom:3px double var(--card-line);padding-bottom:var(--card-gap)}.card-header-tab-strip{border-bottom:2px solid var(--card-accent);padding-bottom:6px}.card-header-badge-left{flex-direction:row-reverse;justify-content:flex-end}.card-badge{border-radius:var(--card-radius);background:var(--card-accent);color:var(--card-on-accent);margin:4px 6px 0 0;padding:1px 8px;font-size:.7rem;font-weight:600;display:inline-block}.card-badge-quiet{color:var(--card-muted);border:1px solid var(--card-line);background:0 0}.card-description{margin:0}.card-muted{color:var(--card-muted);margin:2px 0;font-size:.85rem}.card-regions{gap:var(--card-gap);grid-template-columns:repeat(12,1fr);display:grid}.card-region{grid-column:span 12;min-width:0}.card-console .card-region-status{grid-column:span 12}.card-dashboard .card-region,.card-monitor .card-region{grid-column:span 6}.card-workbench .card-regions,.card-inbox .card-regions{grid-template-columns:minmax(0,1fr) minmax(0,2fr)}.card-workbench .card-region,.card-inbox .card-region{grid-column:auto}.card-ledger .card-region-table{grid-column:span 12}.card-vault .card-region{border-left:3px solid var(--card-accent);padding-left:var(--card-gap);grid-column:span 12}@media (width<=720px){.card-regions{grid-template-columns:1fr}.card-regions>.card-region{grid-column:auto!important}}.card-row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.card-kv{grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:8px;margin:8px 0 0;display:grid}.card-kv dt{color:var(--card-muted);text-transform:uppercase;font-size:.7rem}.card-kv dd{overflow-wrap:anywhere;margin:0;font-weight:600}.card-pill{border:1px solid;border-radius:999px;padding:1px 8px;font-size:.75rem;font-weight:600}.card-pill-ok{color:#047857}.card-pill-warn{color:#b45309}.card-pill-error{color:#b91c1c}.card-pill-neutral{color:var(--card-muted)}.card-button{background:var(--card-color);color:var(--card-on-color);border-radius:var(--card-radius);font:inherit;cursor:pointer;border:0;padding:6px 12px}.card-button:disabled{opacity:.5;cursor:not-allowed}.card-button-quiet{color:var(--card-text);border:1px solid var(--card-line);background:0 0}.card-link{color:var(--card-color);cursor:pointer;font:inherit;background:0 0;border:0;padding:0;text-decoration:underline}.card :focus-visible{outline:2px solid var(--card-accent);outline-offset:2px}.card-code,.card-pre{border-radius:var(--card-radius);background:#7f7f7f1f;padding:4px 8px;font-family:ui-monospace,monospace;font-size:.78rem;overflow-x:auto}.card-pre{white-space:pre-wrap;max-height:260px;overflow:auto}.card-commands,.card-list{gap:10px;margin:0;padding:0;list-style:none;display:grid}.card-commands li{border-top:1px solid var(--card-line);padding-top:8px}.card-form{gap:8px;margin-top:8px;display:grid}.card-form label{gap:2px;font-size:.8rem;display:grid}.card-form input,.card-form select{font:inherit;border:1px solid var(--card-line);border-radius:var(--card-radius);color:inherit;background:0 0;padding:4px 6px}.card-scroll{overflow-x:auto}.card-table{border-collapse:collapse;width:100%;font-size:.85rem}.card-table th{text-align:left;text-transform:uppercase;color:var(--card-muted);border-bottom:2px solid var(--card-line);padding:4px 8px;font-size:.7rem}.card-table td{border-bottom:1px solid var(--card-line);padding:5px 8px}.card-gauge{border-radius:var(--card-radius);background:#7f7f7f33;height:10px;overflow:hidden}.card-gauge span{background:var(--card-accent);height:100%;display:block}.card-error{color:#b91c1c;margin:6px 0}.card-footer{color:var(--card-muted);font-size:.72rem}.card-footer a{color:inherit}.card-drawer{background:var(--card-surface);border-left:1px solid var(--card-line);z-index:2;flex-direction:column;width:min(420px,100%);display:flex;position:absolute;top:0;bottom:0;right:0;box-shadow:-8px 0 24px #00000026}.card-drawer-head{padding:var(--card-gap);border-bottom:1px solid var(--card-line);justify-content:space-between;display:flex}.card-drawer-body{padding:var(--card-gap);flex:1;overflow:auto}.card-tabs{border-bottom:1px solid var(--card-line);display:flex}.card-tabs button{font:inherit;color:var(--card-muted);cursor:pointer;background:0 0;border:0;border-bottom:3px solid #0000;flex:1;padding:8px}.card-tabs button[aria-selected=true]{color:var(--card-text);border-bottom-color:var(--card-accent)}@media (prefers-reduced-motion:no-preference){.card-drawer{animation:.18s ease-out card-slide}@keyframes card-slide{0%{opacity:0;transform:translate(24px)}}}.card-scene-track{scroll-snap-type:x mandatory;scrollbar-width:thin;gap:var(--card-gap);overscroll-behavior-x:contain;display:flex;overflow-x:auto}.card-scene{scroll-snap-align:start;flex:0 0 100%;min-width:0;padding:4px}.card-scene-controls{margin-bottom:var(--card-gap)}.card-scenes[data-state=inactive] .card-scene-track{opacity:.65}.card-scenes[aria-busy=true] .card-pill{animation:1.1s ease-in-out infinite card-running}@keyframes card-running{50%{box-shadow:0 0 0 3px color-mix(in srgb,var(--card-color) 28%,transparent)}}@media (prefers-reduced-motion:reduce){.card-scenes[aria-busy=true] .card-pill{animation:none}.card-scene-track{scroll-behavior:auto}}.card-scene-track{position:relative}.card-context-menu{border:1px solid var(--card-line);border-radius:var(--card-radius);background:var(--card-surface);gap:8px;padding:12px;display:grid;box-shadow:0 8px 24px #0002}.card-context-menu button{text-align:left}.card.card-owned{box-shadow:none;background:0 0;border:0;padding:0}.card-owned .card-link{color:var(--text-primary,#111)}.card-permissions{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;display:grid}.card-permissions label{align-items:center;gap:8px;display:flex}.card-execution{margin-bottom:var(--card-gap)}.card-scenes,.card-scene-track{min-width:0;max-width:100%}.card-scene{box-sizing:border-box}.card-execution fieldset{box-sizing:border-box;min-inline-size:0;width:100%}.card-execution select,.card-execution input:not([type=checkbox]){box-sizing:border-box;width:100%;min-width:0}.card-permissions label{white-space:normal}.notifications-page{animation:.35s ease-out notif-fade-in}@keyframes notif-fade-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.notif-rules-card{padding:0;overflow:hidden}.notif-rules-actions{gap:6px;display:flex}.priority-badge{text-transform:uppercase;letter-spacing:.04em;border-radius:4px;align-items:center;padding:2px 8px;font-size:11px;font-weight:600;display:inline-flex}.priority-badge.critical{background:var(--error-muted);color:var(--error)}.priority-badge.high{background:var(--warning-muted);color:var(--warning)}.priority-badge.low{background:var(--success-muted);color:var(--success)}.notif-toggle{background:var(--bg-hover);cursor:pointer;width:40px;height:22px;transition:background var(--transition-fast);border:1px solid var(--border);border-radius:11px;flex-shrink:0;position:relative}.notif-toggle.active{background:var(--accent);border-color:var(--accent)}.notif-toggle:after{content:"";width:16px;height:16px;transition:transform var(--transition-fast);background:#fff;border-radius:50%;position:absolute;top:2px;left:2px;box-shadow:0 1px 3px #0003}.notif-toggle.active:after{transform:translate(18px)}.notif-history-header{justify-content:space-between;align-items:center;margin-bottom:16px;display:flex}.notif-history-header h2{color:var(--text-primary);font-size:15px;font-weight:600}.notif-history-list{flex-direction:column;gap:10px;max-height:420px;display:flex;overflow-y:auto}.notif-history-entry{background:var(--bg-hover);border-radius:var(--radius-sm);transition:background var(--transition-fast);justify-content:space-between;align-items:flex-start;padding:14px 16px;display:flex}.notif-history-entry:hover{background:var(--bg-secondary)}.notif-entry-content{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}.notif-entry-title{color:var(--text-primary);font-size:14px;font-weight:500}.notif-entry-message{color:var(--text-secondary);white-space:nowrap;text-overflow:ellipsis;font-size:13px;overflow:hidden}.notif-entry-meta{flex-direction:column;flex-shrink:0;align-items:flex-end;gap:4px;margin-left:16px;display:flex}.notif-entry-time{color:var(--text-tertiary);white-space:nowrap;font-size:12px}.notif-status-badge{border-radius:3px;align-items:center;padding:2px 6px;font-size:11px;font-weight:600;display:inline-flex}.notif-status-badge.delivered{background:var(--success-muted);color:var(--success)}.notif-status-badge.failed{background:var(--error-muted);color:var(--error)}.notif-quiet-hours-row{align-items:center;gap:10px;display:flex}.notif-quiet-hours-label{color:var(--text-secondary);cursor:pointer;font-size:13px}.notif-empty{text-align:center;color:var(--text-tertiary);padding:32px 16px;font-size:13px;font-style:italic}@media (width<=768px){.notif-history-entry{flex-direction:column;gap:8px}.notif-entry-meta{flex-direction:row;align-items:center;margin-left:0}}
|