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.
Files changed (299) hide show
  1. package/bin/total-recall.mjs +48 -29
  2. package/docs/IDE_INTEGRATION.md +27 -0
  3. package/docs/reference/cli-reference.md +10 -0
  4. package/frontend/dist/assets/{index-C7_Xpk27.css → index-CvQRdT2j.css} +1 -1
  5. package/frontend/dist/assets/index-SOVUlZqm.js +5596 -0
  6. package/frontend/dist/index.html +3 -3
  7. package/frontend/dist/sw.js +11 -6
  8. package/frontend/index.html +1 -1
  9. package/frontend/src/App.tsx +4 -14
  10. package/frontend/src/api/_base.ts +10 -0
  11. package/frontend/src/api/auth.ts +52 -0
  12. package/frontend/src/api/index.ts +0 -1
  13. package/frontend/src/api/plugins.ts +44 -5
  14. package/frontend/src/components/plugins/PluginPanel.tsx +25 -12
  15. package/frontend/src/components/plugins/PluginSettings.tsx +17 -5
  16. package/frontend/src/components/plugins/card/CardEngine.tsx +115 -0
  17. package/frontend/src/components/plugins/card/CardScenes.tsx +74 -0
  18. package/frontend/src/components/plugins/card/ExecutionPicker.tsx +64 -0
  19. package/frontend/src/components/plugins/card/args.ts +28 -0
  20. package/frontend/src/components/plugins/card/card.css +35 -0
  21. package/frontend/src/components/plugins/card/cli-line.ts +13 -0
  22. package/frontend/src/components/plugins/card/contract.ts +97 -0
  23. package/frontend/src/components/plugins/card/format.ts +42 -0
  24. package/frontend/src/components/plugins/card/runner-context.ts +11 -0
  25. package/frontend/src/components/plugins/card/runner.tsx +43 -0
  26. package/frontend/src/components/plugins/card/theme.ts +35 -0
  27. package/frontend/src/components/plugins/card/use-source.ts +22 -0
  28. package/frontend/src/components/plugins/card/widgets.tsx +125 -0
  29. package/frontend/src/components/plugins/plugin-frame.ts +48 -7
  30. package/frontend/src/components/plugins/workspace/WorkspaceHost.tsx +23 -0
  31. package/frontend/src/pages/LoginPage.tsx +153 -2
  32. package/frontend/src/pages/PluginsPage.tsx +44 -190
  33. package/metadata.plugin.schema.json +642 -64
  34. package/package.json +5 -3
  35. package/scaffold/.agent/skills/plugins/SKILL.md +38 -190
  36. package/scaffold/.agent/skills/plugins/references/card-design.md +55 -0
  37. package/scaffold/.agent/skills/plugins/references/distribution.md +23 -0
  38. package/scaffold/.agent/skills/plugins/references/manifest-contract.md +90 -0
  39. package/scaffold/.agent/skills/start/SKILL.md +3 -0
  40. package/scaffold/.agent/skills/total-recall/SKILL.md +34 -40
  41. package/scaffold/.agent/skills/total-recall/memory-vault/invariants/operating-instructions.md +2 -0
  42. package/scaffold/.agent/skills/total-recall/plugins/auth/README.md +46 -0
  43. package/scaffold/.agent/skills/total-recall/plugins/auth/cli.mjs +384 -0
  44. package/scaffold/.agent/skills/total-recall/plugins/auth/package-lock.json +3993 -0
  45. package/scaffold/.agent/skills/total-recall/plugins/auth/package.json +39 -0
  46. package/scaffold/.agent/skills/total-recall/plugins/auth/plugin.json +262 -0
  47. package/scaffold/.agent/skills/total-recall/plugins/auth/src/access-keys.mjs +225 -0
  48. package/scaffold/.agent/skills/total-recall/plugins/auth/src/agent-dir.mjs +3 -0
  49. package/{src/cli/secret.mjs → scaffold/.agent/skills/total-recall/plugins/auth/src/cli-secret.mjs} +32 -47
  50. package/scaffold/.agent/skills/total-recall/plugins/auth/src/config.mjs +4 -0
  51. package/scaffold/.agent/skills/total-recall/plugins/auth/src/configuration.mjs +19 -0
  52. package/scaffold/.agent/skills/total-recall/plugins/auth/src/credential-preservation.mjs +28 -0
  53. package/scaffold/.agent/skills/total-recall/plugins/auth/src/fact-seeker.mjs +3 -0
  54. package/scaffold/.agent/skills/total-recall/plugins/auth/src/frontmatter.mjs +3 -0
  55. package/scaffold/.agent/skills/total-recall/plugins/auth/src/google-oauth.mjs +139 -0
  56. package/scaffold/.agent/skills/total-recall/plugins/auth/src/host-runtime.mjs +7 -0
  57. package/scaffold/.agent/skills/total-recall/plugins/auth/src/leader-election.mjs +9 -0
  58. package/scaffold/.agent/skills/total-recall/plugins/auth/src/logger.mjs +3 -0
  59. package/scaffold/.agent/skills/total-recall/plugins/auth/src/mesh-auth.mjs +7 -0
  60. package/scaffold/.agent/skills/total-recall/plugins/auth/src/mesh-identity.mjs +16 -0
  61. package/scaffold/.agent/skills/total-recall/plugins/auth/src/mesh-secrets.mjs +146 -0
  62. package/scaffold/.agent/skills/total-recall/plugins/auth/src/mesh.mjs +23 -0
  63. package/scaffold/.agent/skills/total-recall/plugins/auth/src/metadata-state.mjs +17 -0
  64. package/scaffold/.agent/skills/total-recall/plugins/auth/src/project-id.mjs +3 -0
  65. package/scaffold/.agent/skills/total-recall/plugins/auth/src/research-gate.mjs +3 -0
  66. package/scaffold/.agent/skills/total-recall/plugins/auth/src/research-queue.mjs +3 -0
  67. package/scaffold/.agent/skills/total-recall/plugins/auth/src/routes/auth.mjs +207 -0
  68. package/scaffold/.agent/skills/total-recall/plugins/auth/src/routes/keys.mjs +61 -0
  69. package/scaffold/.agent/skills/total-recall/plugins/auth/src/routes/secrets-runtime.mjs +5 -0
  70. package/{src/server → scaffold/.agent/skills/total-recall/plugins/auth/src}/routes/secrets.mjs +45 -43
  71. package/scaffold/.agent/skills/total-recall/plugins/auth/src/routes/webauthn.mjs +163 -0
  72. package/scaffold/.agent/skills/total-recall/plugins/auth/src/runtime-credentials.mjs +19 -0
  73. package/scaffold/.agent/skills/total-recall/plugins/auth/src/runtime.mjs +3 -0
  74. package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/secrets-gateway.mjs +15 -98
  75. package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/secrets-remote-deploy.mjs +7 -15
  76. package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/secrets-store.mjs +9 -47
  77. package/scaffold/.agent/skills/total-recall/plugins/auth/src/secrets-sync.mjs +81 -0
  78. package/scaffold/.agent/skills/total-recall/plugins/auth/src/secure-file.mjs +71 -0
  79. package/scaffold/.agent/skills/total-recall/plugins/auth/src/server-auth.mjs +500 -0
  80. package/scaffold/.agent/skills/total-recall/plugins/auth/src/session-credentials.mjs +71 -0
  81. package/scaffold/.agent/skills/total-recall/plugins/auth/src/ssss-store.mjs +13 -0
  82. package/scaffold/.agent/skills/total-recall/plugins/auth/src/stdin.mjs +31 -0
  83. package/scaffold/.agent/skills/total-recall/plugins/auth/src/throttled-fetch.mjs +3 -0
  84. package/scaffold/.agent/skills/total-recall/plugins/auth/src/vault.mjs +3 -0
  85. package/scaffold/.agent/skills/total-recall/plugins/auth/src/vfs-documents.mjs +3 -0
  86. package/scaffold/.agent/skills/total-recall/plugins/auth/src/webauthn-store.mjs +265 -0
  87. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/DESIGN.md +19 -0
  88. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/card.js +274 -0
  89. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/panel.js +338 -0
  90. package/scaffold/.agent/skills/total-recall/plugins/mesh/LICENSE +21 -0
  91. package/scaffold/.agent/skills/total-recall/plugins/mesh/README.md +38 -0
  92. package/scaffold/.agent/skills/total-recall/plugins/mesh/cli.mjs +49 -0
  93. package/scaffold/.agent/skills/total-recall/plugins/mesh/package.json +21 -0
  94. package/scaffold/.agent/skills/total-recall/plugins/mesh/plugin.json +276 -0
  95. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/cli/agent-dir.mjs +3 -0
  96. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/cli/grants.mjs +36 -0
  97. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/cli/mesh.mjs +841 -0
  98. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/cli/server.mjs +120 -0
  99. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/config.mjs +4 -0
  100. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/credentials.mjs +29 -0
  101. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/device-io.mjs +344 -0
  102. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/frontmatter.mjs +3 -0
  103. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/headscale-client.mjs +281 -0
  104. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/headscale-server.mjs +303 -0
  105. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/lan-discovery.mjs +341 -0
  106. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/leader-election.mjs +112 -0
  107. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/logger.mjs +3 -0
  108. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh-access-sync.mjs +134 -0
  109. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh-access.mjs +276 -0
  110. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh-activity.mjs +89 -0
  111. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh-auth.mjs +52 -0
  112. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh-discover.mjs +173 -0
  113. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh-enroll.mjs +481 -0
  114. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh-identity.mjs +211 -0
  115. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh-late-bind.mjs +105 -0
  116. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh.mjs +779 -0
  117. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/meta-harness.mjs +3 -0
  118. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/network-interfaces.mjs +149 -0
  119. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/plugin-distribution.mjs +3 -0
  120. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/plugin-peers.mjs +163 -0
  121. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/presence.mjs +54 -0
  122. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/registration-watch.mjs +193 -0
  123. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/ssss-kernel-bridge.mjs +3 -0
  124. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/ssss-operation-service.mjs +3 -0
  125. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/status.mjs +29 -0
  126. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/tailscale-cli.mjs +69 -0
  127. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/throttled-fetch.mjs +3 -0
  128. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/vfs-documents.mjs +3 -0
  129. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/host-runtime.mjs +7 -0
  130. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/server/auth.mjs +3 -0
  131. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/server/routes/_shared.mjs +3 -0
  132. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/server/routes/headscale.mjs +112 -0
  133. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/server/routes/mesh-presence.mjs +20 -0
  134. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/server/routes/mesh.mjs +628 -0
  135. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/server/routes/plugins-mesh.mjs +57 -0
  136. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/ssss-store.mjs +13 -0
  137. package/scaffold/.agent/skills/total-recall/plugins/mesh/test-support/memory-root.mjs +14 -0
  138. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/DESIGN.md +18 -0
  139. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/LOGO.md +7 -0
  140. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/card.js +34 -0
  141. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/logo.svg +1 -0
  142. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/panel.js +39 -0
  143. package/scaffold/.agent/skills/total-recall/references/api-reference.md +2 -0
  144. package/scaffold/.agent/skills/total-recall/references/architecture-reference.md +2 -80
  145. package/scaffold/.agent/skills/total-recall/references/auth.md +29 -0
  146. package/scaffold/.agent/skills/total-recall/references/cli-reference.md +2 -125
  147. package/scaffold/.agent/skills/total-recall/references/contributing.md +50 -0
  148. package/scaffold/.agent/skills/total-recall/references/crm.md +21 -0
  149. package/scaffold/.agent/skills/total-recall/references/memory.md +7 -0
  150. package/scaffold/.agent/skills/total-recall/references/mesh.md +18 -0
  151. package/scaffold/.agent/skills/total-recall/references/openwiki.md +7 -0
  152. package/scaffold/.agent/skills/total-recall/references/operations.md +9 -663
  153. package/scaffold/.agent/skills/total-recall/references/plugins.md +44 -0
  154. package/scaffold/.agent/skills/total-recall/references/security.md +14 -0
  155. package/scaffold/.agent/skills/total-recall/references/ssss-reference.md +2 -0
  156. package/scaffold/.agent/skills/total-recall/references/troubleshooting.md +2 -67
  157. package/scaffold/.agent/skills/total-recall/scripts/brain-state.json +2 -0
  158. package/src/cli/config.mjs +4 -2
  159. package/src/cli/deploy-ui.mjs +15 -86
  160. package/src/cli/deploy.mjs +13 -11
  161. package/src/cli/doctor.mjs +15 -11
  162. package/src/cli/edit.mjs +3 -9
  163. package/src/cli/forget.mjs +3 -5
  164. package/src/cli/generate-pat.mjs +2 -2
  165. package/src/cli/hash-password.mjs +7 -18
  166. package/src/cli/import-rules.mjs +2 -6
  167. package/src/cli/ingest.mjs +12 -2
  168. package/src/cli/init.mjs +33 -53
  169. package/src/cli/key.mjs +2 -2
  170. package/src/cli/mesh.mjs +4 -831
  171. package/src/cli/new.mjs +131 -0
  172. package/src/cli/plugin/codex-package.mjs +90 -0
  173. package/src/cli/plugin/create.mjs +17 -9
  174. package/src/cli/plugin/index.mjs +62 -3
  175. package/src/cli/plugin/install.mjs +7 -0
  176. package/src/cli/plugin/monetization.mjs +72 -0
  177. package/src/cli/plugin/remove.mjs +7 -0
  178. package/src/cli/plugin/scaffold-cmd.mjs +4 -0
  179. package/src/cli/plugin/search.mjs +2 -1
  180. package/src/cli/plugin/vendor.mjs +38 -0
  181. package/src/cli/proposals.mjs +4 -0
  182. package/src/cli/remember.mjs +11 -9
  183. package/src/cli/reset-password.mjs +4 -44
  184. package/src/cli/setup.mjs +2 -1
  185. package/src/cli/skill-config.mjs +4 -3
  186. package/src/cli/skill-projection.mjs +2 -2
  187. package/src/cli/skill.mjs +110 -93
  188. package/src/cli/uninstall.mjs +10 -41
  189. package/src/cli/update.mjs +26 -0
  190. package/src/cli/upgrade.mjs +2 -1
  191. package/src/core/api-routes.mjs +15 -50
  192. package/src/core/auto-compile.mjs +50 -0
  193. package/src/core/brain-state.json +2 -0
  194. package/src/core/brain-updates.mjs +201 -0
  195. package/src/core/command-surface.mjs +21 -0
  196. package/src/core/config.mjs +17 -66
  197. package/src/core/crons.mjs +2 -1
  198. package/src/core/daemon-control.mjs +5 -1
  199. package/src/core/daemon-loop.mjs +3 -2
  200. package/src/core/device-io.mjs +7 -344
  201. package/src/core/embeddings.mjs +5 -5
  202. package/src/core/github-sync.mjs +2 -1
  203. package/src/core/headscale-client.mjs +16 -338
  204. package/src/core/lan-discovery.mjs +9 -341
  205. package/src/core/leader-election.mjs +10 -112
  206. package/src/core/logger.mjs +39 -0
  207. package/src/core/mesh-access-sync.mjs +7 -134
  208. package/src/core/mesh-access.mjs +17 -276
  209. package/src/core/mesh-activity.mjs +7 -140
  210. package/src/core/mesh-auth.mjs +8 -50
  211. package/src/core/mesh-discover.mjs +8 -173
  212. package/src/core/mesh-enroll.mjs +17 -481
  213. package/src/core/mesh-late-bind.mjs +4 -105
  214. package/src/core/mesh.mjs +24 -808
  215. package/src/core/meta-harness.mjs +8 -16
  216. package/src/core/network-interfaces.mjs +9 -149
  217. package/src/core/okf-adapter.mjs +16 -2
  218. package/src/core/parallel-context.mjs +2 -2
  219. package/src/core/plugin-activation.mjs +15 -0
  220. package/src/core/plugin-catalog.mjs +53 -0
  221. package/src/core/plugin-context.mjs +2 -1
  222. package/src/core/plugin-contracts/card.mjs +185 -0
  223. package/src/core/plugin-contracts/ui.mjs +1 -1
  224. package/src/core/plugin-cron.mjs +57 -0
  225. package/src/core/plugin-dependencies.mjs +38 -0
  226. package/src/core/plugin-distribution.mjs +4 -3
  227. package/src/core/plugin-document-store.mjs +80 -0
  228. package/src/core/plugin-loader.mjs +92 -4
  229. package/src/core/plugin-peers.mjs +7 -163
  230. package/src/core/plugin-runner.mjs +42 -3
  231. package/src/core/plugin-runtime.mjs +46 -0
  232. package/src/core/plugin-state-store.mjs +176 -0
  233. package/src/core/plugin-state.mjs +36 -0
  234. package/src/core/plugin-store.mjs +50 -23
  235. package/src/core/plugin-tasks.mjs +3 -55
  236. package/src/core/plugin-vendor.mjs +237 -0
  237. package/src/core/registration-watch.mjs +9 -193
  238. package/src/core/runtime.mjs +21 -67
  239. package/src/core/scaffold-plugins.mjs +75 -0
  240. package/src/core/skill-config.mjs +15 -3
  241. package/src/core/source-adapters.mjs +2 -1
  242. package/src/core/surface.mjs +43 -20
  243. package/src/core/tailscale-cli.mjs +8 -69
  244. package/src/core/task-executors.mjs +4 -3
  245. package/src/core/usage-fetcher.mjs +2 -1
  246. package/src/core/vault-cache.mjs +19 -5
  247. package/src/core/webauthn-store.mjs +3 -273
  248. package/src/server/api.mjs +1 -1
  249. package/src/server/auth.mjs +7 -531
  250. package/src/server/index.mjs +16 -23
  251. package/src/server/keys.mjs +4 -206
  252. package/src/server/rest.mjs +1 -10
  253. package/src/server/route-manifest.json +72 -4
  254. package/src/server/routes/_shared.mjs +2 -1
  255. package/src/server/routes/auth.mjs +6 -77
  256. package/src/server/routes/collab.mjs +16 -33
  257. package/src/server/routes/config.mjs +3 -2
  258. package/src/server/routes/headscale.mjs +4 -114
  259. package/src/server/routes/keys.mjs +5 -53
  260. package/src/server/routes/mesh-presence.mjs +4 -143
  261. package/src/server/routes/mesh.mjs +4 -628
  262. package/src/server/routes/models.mjs +7 -17
  263. package/src/server/routes/plugins-mesh.mjs +4 -57
  264. package/src/server/routes/plugins.mjs +96 -4
  265. package/src/server/routes/webauthn.mjs +5 -182
  266. package/src/server/routes/webhooks.mjs +2 -1
  267. package/frontend/dist/assets/index-D3Y3J5MC.js +0 -5815
  268. package/frontend/src/api/secrets.ts +0 -53
  269. package/frontend/src/components/plugins/previews/CodeQualityPreview.tsx +0 -122
  270. package/frontend/src/components/plugins/previews/ComposableCliPreview.tsx +0 -121
  271. package/frontend/src/components/plugins/previews/DecisionPreview.tsx +0 -208
  272. package/frontend/src/components/plugins/previews/DesignPreview.tsx +0 -152
  273. package/frontend/src/components/plugins/previews/DomainsPreview.tsx +0 -120
  274. package/frontend/src/components/plugins/previews/ImageGeneratorPreview.tsx +0 -286
  275. package/frontend/src/components/plugins/previews/PhonePreview.tsx +0 -500
  276. package/frontend/src/components/plugins/previews/SigningPreview.tsx +0 -223
  277. package/frontend/src/components/plugins/previews/TextPreview.tsx +0 -143
  278. package/frontend/src/components/plugins/previews/UserAutomationsPreview.tsx +0 -30
  279. package/frontend/src/components/plugins/previews/index.tsx +0 -88
  280. package/frontend/src/pages/OpenWikiPage.tsx +0 -583
  281. package/frontend/src/pages/SecretsPage.css +0 -141
  282. package/frontend/src/pages/SecretsPage.tsx +0 -2832
  283. package/scaffold/.agent/skills/total-recall/derived/embeddings.db +0 -0
  284. package/src/cli/ingest-openwiki.mjs +0 -195
  285. package/src/core/legacy-init-secrets.mjs +0 -32
  286. package/src/core/secrets-sync.mjs +0 -66
  287. /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/browser-session.mjs +0 -0
  288. /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/crypto.mjs +0 -0
  289. /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/env-import.mjs +0 -0
  290. /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/provider-account-sync.mjs +0 -0
  291. /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/provider-catalog.mjs +0 -0
  292. /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/provider-rotation-recipes.mjs +0 -0
  293. /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/rotation-capability.mjs +0 -0
  294. /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/secret-integration-research.mjs +0 -0
  295. /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/secrets-env-diff.mjs +0 -0
  296. /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/secrets-env-export.mjs +0 -0
  297. /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/secrets-keychain.mjs +0 -0
  298. /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/secrets-rekey.mjs +0 -0
  299. /package/{src/core → scaffold/.agent/skills/total-recall/plugins/auth/src}/secrets-rotate.mjs +0 -0
@@ -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
- const handlerFile = COMMANDS[command];
192
- if (!handlerFile) {
193
- // Any HTTP API route group without a dedicated verb: `total-recall <group> <action> …`
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 { loadApiRoutes } = await import('../src/core/api-routes.mjs');
196
- if ((await loadApiRoutes()).some((r) => r.group === command)) {
197
- const { default: apiCli } = await import('../src/cli/api.mjs');
198
- await apiCli(args);
199
- process.exit(process.exitCode ?? 0);
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);
@@ -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}}