open-managed-agents 0.1.0

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 (197) hide show
  1. package/LICENSE +93 -0
  2. package/README.md +248 -0
  3. package/bin/oma.mjs +499 -0
  4. package/dist/scripts/alpha-openai-compatible-fixture.mjs +134 -0
  5. package/dist/scripts/alpha-smoke-models.mjs +92 -0
  6. package/dist/scripts/alpha-smoke.mjs +581 -0
  7. package/dist/scripts/oma-doctor.js +230 -0
  8. package/dist/scripts/oma-models.js +299 -0
  9. package/dist/scripts/oma-workspaces.js +133 -0
  10. package/dist/src/control-plane/admin/auth.js +43 -0
  11. package/dist/src/control-plane/admin/routes.js +76 -0
  12. package/dist/src/control-plane/admin/service.js +102 -0
  13. package/dist/src/control-plane/admission.js +90 -0
  14. package/dist/src/control-plane/agents/routes.js +63 -0
  15. package/dist/src/control-plane/agents/service.js +687 -0
  16. package/dist/src/control-plane/agents/store.js +391 -0
  17. package/dist/src/control-plane/agents/types.js +1 -0
  18. package/dist/src/control-plane/api-constants.js +3 -0
  19. package/dist/src/control-plane/app.js +907 -0
  20. package/dist/src/control-plane/console/auth.js +68 -0
  21. package/dist/src/control-plane/console/static.js +112 -0
  22. package/dist/src/control-plane/deployment-runtime-config.js +328 -0
  23. package/dist/src/control-plane/deployment-runtime-event-coordinator.js +25 -0
  24. package/dist/src/control-plane/deployment-runtime-turn-guard.js +14 -0
  25. package/dist/src/control-plane/deployment-session-coordinator.js +25 -0
  26. package/dist/src/control-plane/deployment-session-output-coordinator.js +27 -0
  27. package/dist/src/control-plane/deployment-storage.js +354 -0
  28. package/dist/src/control-plane/egress/image.js +48 -0
  29. package/dist/src/control-plane/egress/policy.js +571 -0
  30. package/dist/src/control-plane/egress/presets.js +77 -0
  31. package/dist/src/control-plane/egress/proxy.js +72 -0
  32. package/dist/src/control-plane/egress/ssrf.js +106 -0
  33. package/dist/src/control-plane/egress/utils/debug.js +14 -0
  34. package/dist/src/control-plane/egress/vendor/http-proxy.js +335 -0
  35. package/dist/src/control-plane/egress/vendor/mitm-ca.js +226 -0
  36. package/dist/src/control-plane/egress/vendor/mitm-leaf.js +124 -0
  37. package/dist/src/control-plane/egress/vendor/parent-proxy.js +438 -0
  38. package/dist/src/control-plane/egress/vendor/request-filter.js +105 -0
  39. package/dist/src/control-plane/egress/vendor/sandbox-config.js +1 -0
  40. package/dist/src/control-plane/egress/vendor/tls-terminate-proxy.js +269 -0
  41. package/dist/src/control-plane/environments/routes.js +54 -0
  42. package/dist/src/control-plane/environments/service.js +112 -0
  43. package/dist/src/control-plane/environments/store.js +132 -0
  44. package/dist/src/control-plane/environments/types.js +1 -0
  45. package/dist/src/control-plane/errors.js +81 -0
  46. package/dist/src/control-plane/events/broadcaster.js +217 -0
  47. package/dist/src/control-plane/events/constants.js +2 -0
  48. package/dist/src/control-plane/events/persist.js +39 -0
  49. package/dist/src/control-plane/events/request.js +190 -0
  50. package/dist/src/control-plane/events/routes.js +159 -0
  51. package/dist/src/control-plane/events/runtime-helpers.js +134 -0
  52. package/dist/src/control-plane/events/service.js +1985 -0
  53. package/dist/src/control-plane/events/session-guards.js +29 -0
  54. package/dist/src/control-plane/events/sse.js +6 -0
  55. package/dist/src/control-plane/events/store.js +772 -0
  56. package/dist/src/control-plane/events/tool-persistence.js +102 -0
  57. package/dist/src/control-plane/events/types.js +21 -0
  58. package/dist/src/control-plane/files/routes.js +121 -0
  59. package/dist/src/control-plane/files/service.js +65 -0
  60. package/dist/src/control-plane/files/store-common.js +87 -0
  61. package/dist/src/control-plane/files/store-local.js +488 -0
  62. package/dist/src/control-plane/files/store-memory.js +270 -0
  63. package/dist/src/control-plane/files/store.js +2 -0
  64. package/dist/src/control-plane/files/types.js +7 -0
  65. package/dist/src/control-plane/http.js +25 -0
  66. package/dist/src/control-plane/ids.js +43 -0
  67. package/dist/src/control-plane/logging.js +263 -0
  68. package/dist/src/control-plane/models/auth-storage-backend.js +238 -0
  69. package/dist/src/control-plane/models/catalog.js +78 -0
  70. package/dist/src/control-plane/models/config-security.js +376 -0
  71. package/dist/src/control-plane/models/deployment-config.js +93 -0
  72. package/dist/src/control-plane/models/routes.js +32 -0
  73. package/dist/src/control-plane/models/service.js +138 -0
  74. package/dist/src/control-plane/observability/instruments.js +65 -0
  75. package/dist/src/control-plane/observability/metrics.js +125 -0
  76. package/dist/src/control-plane/observability/routes.js +95 -0
  77. package/dist/src/control-plane/openapi/document.js +282 -0
  78. package/dist/src/control-plane/openapi/routes.js +78 -0
  79. package/dist/src/control-plane/request-idempotency.js +85 -0
  80. package/dist/src/control-plane/secrets/envelope.js +132 -0
  81. package/dist/src/control-plane/secrets/master-key.js +44 -0
  82. package/dist/src/control-plane/secrets/routes.js +20 -0
  83. package/dist/src/control-plane/secrets/service.js +71 -0
  84. package/dist/src/control-plane/secrets/store.js +212 -0
  85. package/dist/src/control-plane/secrets/types.js +3 -0
  86. package/dist/src/control-plane/sessions/pi/custom-tools.js +146 -0
  87. package/dist/src/control-plane/sessions/pi/mcp/bridge.js +527 -0
  88. package/dist/src/control-plane/sessions/pi/mcp/client.js +157 -0
  89. package/dist/src/control-plane/sessions/pi/mcp/credential.js +28 -0
  90. package/dist/src/control-plane/sessions/pi/mcp/fetch.js +69 -0
  91. package/dist/src/control-plane/sessions/pi/mcp/probe.js +202 -0
  92. package/dist/src/control-plane/sessions/pi/mcp/runtime.js +13 -0
  93. package/dist/src/control-plane/sessions/pi/runner.js +1104 -0
  94. package/dist/src/control-plane/sessions/pi/sandbox/cma-glob.js +388 -0
  95. package/dist/src/control-plane/sessions/pi/sandbox/cma-grep.js +124 -0
  96. package/dist/src/control-plane/sessions/pi/sandbox/docker-egress.js +347 -0
  97. package/dist/src/control-plane/sessions/pi/sandbox/docker.js +1589 -0
  98. package/dist/src/control-plane/sessions/pi/sandbox/glob.js +48 -0
  99. package/dist/src/control-plane/sessions/pi/sandbox/image.js +7 -0
  100. package/dist/src/control-plane/sessions/pi/sandbox/microsandbox.js +1677 -0
  101. package/dist/src/control-plane/sessions/pi/sandbox/provider.js +561 -0
  102. package/dist/src/control-plane/sessions/pi/sandbox/selection.js +168 -0
  103. package/dist/src/control-plane/sessions/pi/span-normalizer.js +82 -0
  104. package/dist/src/control-plane/sessions/pi/tool-permissions.js +392 -0
  105. package/dist/src/control-plane/sessions/pi/translator.js +100 -0
  106. package/dist/src/control-plane/sessions/request.js +164 -0
  107. package/dist/src/control-plane/sessions/resources.js +63 -0
  108. package/dist/src/control-plane/sessions/routes.js +88 -0
  109. package/dist/src/control-plane/sessions/serialize.js +24 -0
  110. package/dist/src/control-plane/sessions/service.js +733 -0
  111. package/dist/src/control-plane/sessions/store.js +538 -0
  112. package/dist/src/control-plane/sessions/types.js +1 -0
  113. package/dist/src/control-plane/skills/archive.js +169 -0
  114. package/dist/src/control-plane/skills/routes.js +41 -0
  115. package/dist/src/control-plane/skills/service.js +29 -0
  116. package/dist/src/control-plane/skills/store.js +233 -0
  117. package/dist/src/control-plane/skills/types.js +5 -0
  118. package/dist/src/control-plane/sqlite-transaction.js +15 -0
  119. package/dist/src/control-plane/vaults/mcp-oauth-validate.js +165 -0
  120. package/dist/src/control-plane/vaults/oauth-refresh-ticker.js +43 -0
  121. package/dist/src/control-plane/vaults/oauth-refresh.js +448 -0
  122. package/dist/src/control-plane/vaults/routes.js +66 -0
  123. package/dist/src/control-plane/vaults/service.js +553 -0
  124. package/dist/src/control-plane/vaults/store.js +691 -0
  125. package/dist/src/control-plane/vaults/types.js +1 -0
  126. package/dist/src/control-plane/wake-loop.js +65 -0
  127. package/dist/src/control-plane/wiring.js +92 -0
  128. package/dist/src/control-plane/workspace.js +4 -0
  129. package/dist/src/control-plane/workspaces/store.js +158 -0
  130. package/dist/src/egress-proxy-main.js +103 -0
  131. package/dist/src/main.js +124 -0
  132. package/dist/src/types/agents.js +1 -0
  133. package/dist/src/types/common.js +1 -0
  134. package/dist/src/types/environments.js +1 -0
  135. package/dist/src/types/events.js +121 -0
  136. package/dist/src/types/files.js +1 -0
  137. package/dist/src/types/json.js +19 -0
  138. package/dist/src/types/sessions.js +1 -0
  139. package/dist/ui/managed-agents-console/README.md +52 -0
  140. package/dist/ui/managed-agents-console/docs/agents.md +23 -0
  141. package/dist/ui/managed-agents-console/docs/console.md +23 -0
  142. package/dist/ui/managed-agents-console/docs/dreams.md +5 -0
  143. package/dist/ui/managed-agents-console/docs/environments.md +27 -0
  144. package/dist/ui/managed-agents-console/docs/events.md +19 -0
  145. package/dist/ui/managed-agents-console/docs/files.md +17 -0
  146. package/dist/ui/managed-agents-console/docs/github.md +11 -0
  147. package/dist/ui/managed-agents-console/docs/integrations.md +19 -0
  148. package/dist/ui/managed-agents-console/docs/memory.md +11 -0
  149. package/dist/ui/managed-agents-console/docs/migration.md +17 -0
  150. package/dist/ui/managed-agents-console/docs/multiagent.md +11 -0
  151. package/dist/ui/managed-agents-console/docs/outcomes.md +11 -0
  152. package/dist/ui/managed-agents-console/docs/overview.md +41 -0
  153. package/dist/ui/managed-agents-console/docs/permissions.md +24 -0
  154. package/dist/ui/managed-agents-console/docs/quickstart.md +51 -0
  155. package/dist/ui/managed-agents-console/docs/reference.md +27 -0
  156. package/dist/ui/managed-agents-console/docs/sandbox-reference.md +19 -0
  157. package/dist/ui/managed-agents-console/docs/sandbox-security.md +15 -0
  158. package/dist/ui/managed-agents-console/docs/scheduled-deployments.md +5 -0
  159. package/dist/ui/managed-agents-console/docs/self-hosted-sandboxes.md +15 -0
  160. package/dist/ui/managed-agents-console/docs/session-operations.md +21 -0
  161. package/dist/ui/managed-agents-console/docs/sessions.md +21 -0
  162. package/dist/ui/managed-agents-console/docs/skills.md +15 -0
  163. package/dist/ui/managed-agents-console/docs/tools.md +23 -0
  164. package/dist/ui/managed-agents-console/docs/vaults.md +19 -0
  165. package/dist/ui/managed-agents-console/docs/webhooks.md +11 -0
  166. package/dist/ui/managed-agents-console/index.html +47 -0
  167. package/dist/ui/managed-agents-console/serve.mjs +116 -0
  168. package/dist/ui/managed-agents-console/src/agents-files.jsx +273 -0
  169. package/dist/ui/managed-agents-console/src/api.js +1043 -0
  170. package/dist/ui/managed-agents-console/src/app.jsx +633 -0
  171. package/dist/ui/managed-agents-console/src/auth.jsx +215 -0
  172. package/dist/ui/managed-agents-console/src/console.css +733 -0
  173. package/dist/ui/managed-agents-console/src/data.js +188 -0
  174. package/dist/ui/managed-agents-console/src/detail.jsx +719 -0
  175. package/dist/ui/managed-agents-console/src/docs.jsx +200 -0
  176. package/dist/ui/managed-agents-console/src/environments.jsx +365 -0
  177. package/dist/ui/managed-agents-console/src/forms.jsx +494 -0
  178. package/dist/ui/managed-agents-console/src/icons.jsx +48 -0
  179. package/dist/ui/managed-agents-console/src/skills.jsx +21 -0
  180. package/dist/ui/managed-agents-console/src/sse.js +185 -0
  181. package/dist/ui/managed-agents-console/src/states.jsx +90 -0
  182. package/dist/ui/managed-agents-console/src/tweaks-panel.jsx +541 -0
  183. package/dist/ui/managed-agents-console/src/ui.jsx +190 -0
  184. package/dist/ui/managed-agents-console/src/vaults-data.js +89 -0
  185. package/dist/ui/managed-agents-console/src/vaults.jsx +171 -0
  186. package/dist/ui/managed-agents-console/vendor/babel.min.js +4 -0
  187. package/dist/ui/managed-agents-console/vendor/react-dom.production.min.js +267 -0
  188. package/dist/ui/managed-agents-console/vendor/react.production.min.js +31 -0
  189. package/dist/ui/openapi-docs/VENDOR.md +27 -0
  190. package/dist/ui/openapi-docs/index.html +16 -0
  191. package/dist/ui/openapi-docs/swagger-initializer.js +14 -0
  192. package/dist/ui/openapi-docs/vendor/LICENSE +202 -0
  193. package/dist/ui/openapi-docs/vendor/NOTICE +2 -0
  194. package/dist/ui/openapi-docs/vendor/swagger-ui-bundle.js +2 -0
  195. package/dist/ui/openapi-docs/vendor/swagger-ui-standalone-preset.js +2 -0
  196. package/dist/ui/openapi-docs/vendor/swagger-ui.css +3 -0
  197. package/package.json +53 -0
@@ -0,0 +1,733 @@
1
+ /* console.css — OMA Managed Agents console · dense graphite theme
2
+ CMA-inspired visual language, with OMA branding and behavior. */
3
+
4
+ :root {
5
+ /* dense, neutral graphite surfaces */
6
+ --bg: #181916;
7
+ --surface: #11120f;
8
+ --surface-2: #20211e;
9
+ --raised: #30312d;
10
+ --hover: rgba(255,255,255,.045);
11
+
12
+ --border: #292a26;
13
+ --border-2: #41423d;
14
+
15
+ --ink: #f1f0eb;
16
+ --soft: #b8b8b0;
17
+ --faint: #898a82;
18
+ --dim: #66675f;
19
+
20
+ /* single accent */
21
+ --accent: #e6b04b;
22
+ --accent-2: #f0c873;
23
+ --accent-ink: #1a1a16;
24
+ --accent-wash: rgba(230,176,75,.14);
25
+ --accent-line: rgba(230,176,75,.34);
26
+
27
+ /* semantic */
28
+ --green:#66c28c; --green-wash:rgba(102,194,140,.14);
29
+ --red: #ec8170; --red-wash:rgba(236,129,112,.14);
30
+ --idle: #9a9b94; --idle-wash:rgba(154,155,148,.12);
31
+
32
+ /* role tints (event scanning) */
33
+ --r-user:#d98fb0; --r-user-bg:rgba(217,143,176,.13);
34
+ --r-agent:#7ba4e6; --r-agent-bg:rgba(123,164,230,.13);
35
+ --r-tool:#d6ab5e; --r-tool-bg:rgba(214,171,94,.13);
36
+ --r-span:#5fc187; --r-span-bg:rgba(95,193,135,.13);
37
+ --r-sys:#9aa2ae; --r-sys-bg:rgba(154,162,174,.11);
38
+
39
+ --shadow: 0 1px 0 rgba(255,255,255,.025) inset, 0 12px 30px -18px rgba(0,0,0,.7);
40
+ --r-sm:7px; --r-md:9px; --r-lg:12px;
41
+
42
+ --font: 'Geist', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif;
43
+ --mono: 'Geist Mono', ui-monospace, 'SF Mono', 'JetBrains Mono', monospace;
44
+
45
+ --row-pad: 12px; /* density-controlled */
46
+ --gutter: 30px;
47
+ }
48
+
49
+ :root.darker { --bg:#10110f; --surface:#0d0e0c; --surface-2:#181916; --raised:#282925; }
50
+ :root.compact { --row-pad:7px; --gutter:18px; }
51
+
52
+ * { box-sizing:border-box; }
53
+ html,body { margin:0; height:100%; }
54
+ body {
55
+ background:var(--bg); color:var(--ink);
56
+ font-family:var(--font); font-size:14px; line-height:1.5;
57
+ -webkit-font-smoothing:antialiased; text-rendering:optimizeLegibility;
58
+ }
59
+ ::selection { background:var(--accent-wash); }
60
+ .mono { font-family:var(--mono); font-feature-settings:"tnum" 1, "ss01" 1; letter-spacing:-.1px; }
61
+ .scroll { overflow:auto; scrollbar-width:thin; scrollbar-color:var(--border-2) transparent; }
62
+ .scroll::-webkit-scrollbar { width:9px; height:9px; }
63
+ .scroll::-webkit-scrollbar-thumb { background:var(--border-2); border-radius:9px; border:2px solid transparent; background-clip:padding-box; }
64
+ .scroll::-webkit-scrollbar-thumb:hover { background:rgba(255,255,255,.2); background-clip:padding-box; }
65
+
66
+ /* ───────── app shell ───────── */
67
+ .app { display:grid; grid-template-columns:248px 1fr; height:100vh; min-height:100dvh; }
68
+ .sidebar {
69
+ background:#0f100e; border-right:1px solid var(--border);
70
+ display:flex; flex-direction:column; padding:16px 14px; gap:3px; min-width:0;
71
+ }
72
+ .brand { display:flex; align-items:center; gap:10px; padding:5px 8px 7px; }
73
+ .brand-mark {
74
+ width:26px; height:26px; border-radius:7px; flex:0 0 auto;
75
+ background:linear-gradient(150deg,var(--accent),#c98a2e);
76
+ display:flex; align-items:center; justify-content:center;
77
+ color:var(--accent-ink); font-weight:700; font-size:14px;
78
+ box-shadow:0 0 0 1px rgba(0,0,0,.2), 0 2px 8px -2px rgba(234,180,76,.5);
79
+ }
80
+ .brand-name { font-weight:600; font-size:16px; letter-spacing:-.25px; }
81
+ .brand-name small { display:block; font-size:11.5px; color:var(--faint); font-weight:400; letter-spacing:0; }
82
+
83
+ .workspace-switcher { position:relative; }
84
+ .ws {
85
+ margin:10px 2px 15px; padding:9px 10px; border:1px solid var(--border);
86
+ border-radius:var(--r-md); background:#141512; display:flex; align-items:center; gap:9px;
87
+ cursor:pointer; transition:border-color .15s, background .15s; width:calc(100% - 4px); color:var(--ink); font:inherit; text-align:left;
88
+ }
89
+ .ws:hover { border-color:var(--border-2); }
90
+ .ws-dot { width:16px; height:16px; border-radius:5px; background:var(--surface-2); border:1px solid var(--border-2); flex:0 0 auto; }
91
+ .ws-name { font-size:13px; font-weight:500; flex:1; }
92
+ .ws-chev { color:var(--faint); }
93
+ .workspace-menu { position:absolute; z-index:20; top:48px; left:2px; right:2px; padding:5px; border:1px solid var(--border-2); border-radius:var(--r-md); background:var(--surface); box-shadow:0 12px 28px rgba(0,0,0,.32); }
94
+ .workspace-menu-label { padding:6px 8px 4px; color:var(--faint); font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.06em; }
95
+ .workspace-menu-note { padding:8px; color:var(--soft); font-size:12px; }
96
+ .workspace-menu-item { display:block; width:100%; border:0; border-radius:var(--r-sm); padding:8px; background:transparent; color:var(--ink); cursor:pointer; font:inherit; font-size:13px; text-align:left; }
97
+ .workspace-menu-item:hover { background:var(--hover); }
98
+ .workspace-menu-item small { display:block; margin-top:2px; color:var(--faint); font-size:10px; }
99
+ .workspace-signout { margin-top:4px; border-top:1px solid var(--border); color:var(--soft); }
100
+
101
+ .nav-label { font-size:10.5px; font-weight:650; letter-spacing:.09em; color:var(--dim); padding:11px 9px 6px; text-transform:uppercase; }
102
+ .nav-item {
103
+ display:flex; align-items:center; gap:10px; padding:8px 10px; border-radius:var(--r-sm);
104
+ border:0; width:100%; background:transparent; color:var(--soft); cursor:pointer; font:inherit; font-size:13.5px; font-weight:450; text-align:left;
105
+ transition:background .12s, color .12s; position:relative; user-select:none;
106
+ }
107
+ .nav-item svg { width:16px; height:16px; flex:0 0 auto; opacity:.85; }
108
+ .nav-item:hover { background:var(--hover); color:var(--ink); }
109
+ .nav-item.active { background:#1d1e1a; color:var(--ink); font-weight:550; }
110
+ .nav-item.active::before { content:""; position:absolute; left:-14px; top:7px; bottom:7px; width:3px; border-radius:0 3px 3px 0; background:var(--accent); }
111
+ .nav-item.dim { color:var(--faint); }
112
+ .nav-item.dim:hover { color:var(--soft); }
113
+ .sidebar-spacer { flex:1; }
114
+ .sidebar-foot { border-top:1px solid var(--border); margin-top:8px; padding-top:10px; }
115
+
116
+ .main { display:flex; flex-direction:column; min-width:0; overflow:hidden; }
117
+ .main-scroll { flex:1; overflow:auto; padding:32px var(--gutter) 48px; }
118
+
119
+ /* ───────── page chrome ───────── */
120
+ .page-head { display:flex; align-items:flex-start; justify-content:space-between; gap:16px; margin-bottom:22px; }
121
+ .page-head > div:first-child { flex:1; min-width:0; }
122
+ .page-title { font-size:25px; font-weight:600; letter-spacing:-.55px; margin:0; }
123
+ .page-sub { color:var(--soft); font-size:14px; margin-top:4px; }
124
+ .crumbs { display:flex; align-items:center; gap:8px; color:var(--soft); font-size:13px; margin-bottom:14px; white-space:nowrap; }
125
+ .crumbs a { color:var(--soft); text-decoration:none; cursor:pointer; }
126
+ .crumbs a:hover { color:var(--ink); }
127
+ .crumbs .sep { color:var(--dim); }
128
+
129
+ /* ───────── controls ───────── */
130
+ .btn {
131
+ display:inline-flex; align-items:center; gap:7px; height:34px; padding:0 14px;
132
+ border-radius:var(--r-md); border:1px solid var(--border-2); background:#292a26;
133
+ color:var(--ink); font:inherit; font-size:13.5px; font-weight:500; cursor:pointer;
134
+ transition:background .14s, border-color .14s, transform .05s; white-space:nowrap;
135
+ }
136
+ .btn:hover { background:#353631; border-color:#595a52; }
137
+ .btn:active { transform:translateY(1px); }
138
+ .btn:disabled,.btn:disabled:hover {
139
+ opacity:.5; cursor:not-allowed; transform:none; background:var(--surface-2);
140
+ border-color:var(--border-2);
141
+ }
142
+ .btn svg { width:15px; height:15px; }
143
+ .btn-primary { background:#f4f3ed; color:#1a1a16; border-color:transparent; font-weight:600; }
144
+ .btn-primary:hover { background:#fffefa; }
145
+ .btn-ghost { background:transparent; border-color:transparent; color:var(--soft); }
146
+ .btn-ghost:hover { background:var(--hover); color:var(--ink); }
147
+ .btn-accent { background:var(--accent); color:var(--accent-ink); border-color:transparent; font-weight:600; }
148
+ .btn-accent:hover { background:var(--accent-2); }
149
+ .btn-sm { height:28px; padding:0 11px; font-size:12.5px; border-radius:var(--r-sm); }
150
+ .btn-icon { width:34px; padding:0; justify-content:center; }
151
+ .btn-danger { color:var(--red); }
152
+ .btn-danger:hover { background:var(--red-wash); border-color:transparent; }
153
+ .btn.ro { opacity:.55; }
154
+ .action-wrap { display:flex; flex-direction:column; align-items:flex-end; gap:4px; }
155
+ .endpoint-hint { color:var(--faint); font-size:10.5px; line-height:1; }
156
+
157
+ .field {
158
+ display:flex; align-items:center; gap:8px; height:34px; padding:0 11px;
159
+ border:1px solid var(--border); border-radius:var(--r-md); background:#242521;
160
+ color:var(--soft); font-size:13px; transition:border-color .15s;
161
+ }
162
+ .field:focus-within { border-color:var(--accent-line); }
163
+ .field svg { width:15px; height:15px; color:var(--faint); flex:0 0 auto; }
164
+ .field input { background:none; border:none; outline:none; color:var(--ink); font:inherit; font-size:13px; width:100%; }
165
+ .field input::placeholder { color:var(--faint); }
166
+ .result-count { color:var(--faint); font-size:11.5px; white-space:nowrap; }
167
+ .select { cursor:pointer; gap:6px; }
168
+ .select b { color:var(--ink); font-weight:500; }
169
+ .select .chev { margin-left:auto; color:var(--faint); }
170
+ .toolbar { display:flex; align-items:center; gap:10px; margin-bottom:14px; flex-wrap:wrap; }
171
+ .grow { flex:1; }
172
+
173
+ /* ───────── pills / badges / status ───────── */
174
+ .pill {
175
+ display:inline-flex; align-items:center; gap:6px; height:23px; padding:0 9px;
176
+ border-radius:999px; background:var(--surface-2); border:1px solid var(--border);
177
+ color:var(--soft); font-size:12px; font-weight:500; white-space:nowrap;
178
+ }
179
+ .pill svg { width:12px; height:12px; opacity:.8; }
180
+ .badge {
181
+ display:inline-flex; align-items:center; gap:6px; padding:2px 8px; border-radius:999px;
182
+ font-size:11.5px; font-weight:550; line-height:1.5; white-space:nowrap;
183
+ }
184
+ .badge .dot { width:6px; height:6px; border-radius:50%; flex:0 0 auto; }
185
+ .st-running,.st-active { color:var(--green); background:var(--green-wash); }
186
+ .st-running .dot,.st-active .dot { background:var(--green); box-shadow:0 0 0 3px var(--green-wash); }
187
+ .st-rescheduling { color:var(--accent); background:var(--accent-wash); }
188
+ .st-rescheduling .dot { background:var(--accent); box-shadow:0 0 0 3px var(--accent-wash); }
189
+ .st-idle { color:var(--soft); background:var(--idle-wash); }
190
+ .st-idle .dot { background:var(--idle); }
191
+ .st-error { color:var(--red); background:var(--red-wash); }
192
+ .st-error .dot { background:var(--red); }
193
+ .st-archived,.st-terminated { color:var(--faint); background:var(--idle-wash); }
194
+ .st-archived .dot,.st-terminated .dot { background:var(--faint); }
195
+ .st-open { color:var(--accent); background:var(--accent-wash); }
196
+ .st-open .dot { background:var(--accent); }
197
+ .st-action { color:var(--accent); background:var(--accent-wash); }
198
+ .st-action .dot { background:var(--accent); box-shadow:0 0 0 3px var(--accent-wash); }
199
+
200
+ /* ───────── panel / table ───────── */
201
+ .panel { background:transparent; border:1px solid var(--border); border-radius:var(--r-lg); box-shadow:none; }
202
+ .table { width:100%; }
203
+ .thead, .trow { display:flex; align-items:center; gap:14px; padding:0 16px; }
204
+ .thead { height:42px; border-bottom:1px solid var(--border); }
205
+ .th { font-size:11.5px; font-weight:600; color:var(--faint); letter-spacing:.02em; text-transform:none; }
206
+ .trow {
207
+ min-height:0; padding-top:var(--row-pad); padding-bottom:var(--row-pad);
208
+ border-bottom:1px solid var(--border); cursor:pointer; transition:background .1s;
209
+ }
210
+ .trow:last-child { border-bottom:none; }
211
+ .trow:hover { background:#1d1e1a; }
212
+ .trow.sel { background:var(--accent-wash); }
213
+ .trow.sel::before { content:""; }
214
+ .td { min-width:0; font-size:13.5px; }
215
+ .td.ell { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
216
+ .cell-strong { font-weight:500; color:var(--ink); white-space:nowrap; }
217
+ .cell-sub { font-size:11.5px; color:var(--faint); margin-top:2px; }
218
+ .checkbox { width:15px; height:15px; border-radius:4px; border:1.5px solid var(--border-2); flex:0 0 auto; cursor:pointer; }
219
+ .checkbox.on { background:var(--accent); border-color:var(--accent); }
220
+ .kebab { color:var(--faint); cursor:pointer; padding:4px; border-radius:5px; line-height:0; }
221
+ .kebab:hover { background:var(--hover); color:var(--ink); }
222
+
223
+ .empty { padding:48px; text-align:center; color:var(--faint); font-size:13.5px; }
224
+ .pager { display:flex; gap:6px; margin-top:14px; }
225
+ .pager .btn { width:32px; height:30px; padding:0; justify-content:center; }
226
+
227
+ /* ───────── tabs (segmented) ───────── */
228
+ .tabs { display:inline-flex; padding:3px; gap:2px; background:var(--bg); border:1px solid var(--border); border-radius:var(--r-md); }
229
+ .tab { padding:5px 13px; border-radius:var(--r-sm); font-size:13px; font-weight:500; color:var(--soft); cursor:pointer; transition:background .12s,color .12s; }
230
+ .tab:hover { color:var(--ink); }
231
+ .tab.active { background:var(--surface-2); color:var(--ink); box-shadow:0 1px 2px rgba(0,0,0,.25); }
232
+
233
+ /* ───────── session detail ───────── */
234
+ .sess-head { display:flex; align-items:flex-start; justify-content:space-between; gap:16px; margin-bottom:14px; }
235
+ .sess-title { display:flex; align-items:center; gap:12px; }
236
+ .sess-title h1 { font-size:21px; font-weight:600; letter-spacing:-.3px; margin:0; white-space:nowrap; }
237
+ .meta-row { display:flex; align-items:center; gap:12px; flex-wrap:wrap; margin-top:9px; color:var(--soft); }
238
+ .meta-row .m { display:inline-flex; align-items:center; gap:5px; font-size:12.5px; white-space:nowrap; }
239
+ .meta-row .m svg { width:13px; height:13px; opacity:.7; }
240
+ .meta-row .dotsep { color:var(--dim); }
241
+
242
+ .detail-grid { display:grid; grid-template-columns:1fr 340px; gap:14px; min-height:0; }
243
+ .detail-grid.threecol { grid-template-columns:150px 1fr 320px; }
244
+ .detail-grid.full { grid-template-columns:1fr; }
245
+ .detail-grid > * { min-width:0; }
246
+ .stream { display:flex; flex-direction:column; min-height:0; }
247
+ .stream-body { min-height:0; }
248
+
249
+ .scrubber { height:24px; border-radius:7px; background:var(--bg); border:1px solid var(--border); position:relative; margin-bottom:12px; overflow:hidden; }
250
+ .scrubber .fill { position:absolute; left:0; top:0; bottom:0; background:var(--accent-wash); }
251
+ .scrubber .hd { position:absolute; top:3px; bottom:3px; width:3px; border-radius:3px; background:var(--accent); }
252
+
253
+ /* event rows */
254
+ .ev { display:flex; align-items:center; gap:11px; padding:10px 14px; border-bottom:1px solid var(--border); cursor:pointer; transition:background .1s; }
255
+ .ev:last-child { border-bottom:none; }
256
+ .ev:hover { background:var(--hover); }
257
+ .ev.sel { background:var(--accent-wash); box-shadow:inset 2.5px 0 0 var(--accent); }
258
+ .role { display:inline-flex; align-items:center; justify-content:center; width:52px; height:21px; flex:0 0 auto; border-radius:5px; font-size:11px; font-weight:600; letter-spacing:.01em; }
259
+ .role.user { color:var(--r-user); background:var(--r-user-bg); }
260
+ .role.agent { color:var(--r-agent); background:var(--r-agent-bg); }
261
+ .role.tool { color:var(--r-tool); background:var(--r-tool-bg); }
262
+ .role.span { color:var(--r-span); background:var(--r-span-bg); }
263
+ .role.sys { color:var(--r-sys); background:var(--r-sys-bg); }
264
+ .ev-text { flex:1; min-width:0; font-size:13px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; color:var(--ink); }
265
+ .ev-type { flex:0 0 auto; font-size:12px; color:var(--soft); }
266
+ .ev-tok { font-size:11.5px; color:var(--faint); flex:0 0 auto; }
267
+ .ev-time { font-size:11.5px; color:var(--faint); flex:0 0 auto; width:50px; text-align:right; }
268
+
269
+ /* type filter chips */
270
+ .chips { display:flex; gap:7px; flex-wrap:wrap; margin-bottom:12px; }
271
+ .chip { display:inline-flex; align-items:center; gap:6px; padding:4px 10px; border-radius:999px; border:1px solid var(--border); background:var(--surface-2); color:var(--soft); font-size:12px; font-weight:500; cursor:pointer; transition:.12s; }
272
+ .chip:hover { border-color:var(--border-2); color:var(--ink); }
273
+ .chip.on { background:var(--accent-wash); border-color:var(--accent-line); color:var(--accent); }
274
+ .chip .x { width:12px; height:12px; border-radius:3px; border:1.5px solid currentColor; opacity:.5; }
275
+ .chip.on .x { background:var(--accent); border-color:var(--accent); opacity:1; }
276
+
277
+ /* detail / inspector panel */
278
+ .inspector { display:flex; flex-direction:column; min-height:0; }
279
+ .insp-head { display:flex; align-items:center; gap:10px; padding:14px 16px; border-bottom:1px solid var(--border); }
280
+ .insp-head h3 { margin:0; font-size:15px; font-weight:600; }
281
+ .insp-body { padding:14px 16px; display:flex; flex-direction:column; gap:13px; }
282
+ .sec-label { font-size:11px; font-weight:600; letter-spacing:.05em; text-transform:uppercase; color:var(--faint); }
283
+ .kv { display:flex; align-items:center; justify-content:space-between; gap:12px; font-size:12.5px; }
284
+ .kv .k { color:var(--soft); }
285
+ .kv .v { color:var(--ink); }
286
+ .divider { height:1px; background:var(--border); }
287
+ .content-block { font-size:13px; line-height:1.6; color:var(--ink); }
288
+
289
+ .code { background:#14171c; border:1px solid var(--border); border-radius:var(--r-sm); padding:12px 13px; overflow:auto; }
290
+ .darker .code { background:#0d0f13; }
291
+ .code pre { margin:0; font-family:var(--mono); font-size:12px; line-height:1.65; color:#c7cdd6; white-space:pre; }
292
+ .code .k { color:var(--r-agent); } .code .s { color:var(--green); } .code .n { color:var(--accent); } .code .p { color:var(--faint); }
293
+
294
+ /* composer */
295
+ .composer { display:flex; align-items:center; gap:10px; padding:9px 10px 9px 14px; border:1px solid var(--border); border-radius:var(--r-lg); background:var(--surface); margin-top:12px; transition:border-color .15s; }
296
+ .composer:focus-within { border-color:var(--accent-line); }
297
+ .composer input { flex:1; background:none; border:none; outline:none; color:var(--ink); font:inherit; font-size:13.5px; }
298
+ .composer input::placeholder { color:var(--faint); }
299
+
300
+ /* section rail (three-col) */
301
+ .rail { display:flex; flex-direction:column; gap:3px; }
302
+ .rail-item { display:flex; align-items:center; gap:9px; padding:8px 10px; border-radius:var(--r-sm); color:var(--soft); font-size:13px; cursor:pointer; transition:.12s; }
303
+ .rail-item svg { width:15px; height:15px; opacity:.8; }
304
+ .rail-item:hover { background:var(--hover); color:var(--ink); }
305
+ .rail-item.active { background:var(--accent-wash); color:var(--ink); font-weight:550; }
306
+
307
+ /* span waterfall */
308
+ .axis { display:flex; justify-content:space-between; padding:0 4px 0 158px; margin-bottom:14px; }
309
+ .axis span { font-size:11px; color:var(--faint); }
310
+ .span-row { display:flex; align-items:center; gap:12px; height:30px; }
311
+ .span-label { width:150px; flex:0 0 auto; display:flex; align-items:center; gap:8px; min-width:0; }
312
+ .span-track { flex:1; position:relative; height:26px; }
313
+ .span-track::before { content:""; position:absolute; left:0; right:0; top:50%; border-top:1px dashed var(--border); }
314
+ .span-bar { position:absolute; top:2px; height:22px; border-radius:5px; display:flex; align-items:center; padding:0 8px; font-size:10.5px; border:1px solid; white-space:nowrap; overflow:hidden; }
315
+ .span-bar.model { background:var(--r-agent-bg); border-color:var(--r-agent); color:var(--r-agent); }
316
+ .span-bar.tool { background:var(--r-tool-bg); border-color:var(--r-tool); color:var(--r-tool); }
317
+ .span-bar.open { background:var(--accent-wash); border-color:var(--accent-line); color:var(--accent); border-style:dashed; }
318
+ .span-bar.error { background:var(--red-wash); border-color:var(--red); color:var(--red); }
319
+ .span-note { display:flex; justify-content:space-between; gap:12px; color:var(--faint); font-size:12px; margin-bottom:12px; }
320
+ .legend { display:flex; gap:18px; margin-top:18px; padding-top:16px; border-top:1px solid var(--border); }
321
+ .legend span { display:inline-flex; align-items:center; gap:7px; font-size:12px; color:var(--soft); }
322
+ .legend i { width:13px; height:13px; border-radius:4px; border:1px solid; }
323
+
324
+ /* agent detail */
325
+ .section { margin-bottom:22px; }
326
+ .prompt-box { background:#0d0e0c; border:1px solid var(--border); border-radius:var(--r-md); padding:14px 15px; font-size:13px; line-height:1.62; color:var(--soft); }
327
+ .tool-card { display:flex; align-items:center; gap:12px; padding:12px 14px; }
328
+ .tool-ico { width:34px; height:34px; border-radius:8px; background:var(--surface-2); border:1px solid var(--border); display:flex; align-items:center; justify-content:center; color:var(--accent); flex:0 0 auto; }
329
+ .disclosure { display:flex; align-items:center; justify-content:space-between; padding:11px 14px; border-top:1px solid var(--border); cursor:pointer; }
330
+ .linked { display:flex; align-items:center; justify-content:space-between; padding:9px 0; border-bottom:1px solid var(--border); font-size:13px; }
331
+ .linked:last-child { border-bottom:none; }
332
+
333
+ /* files */
334
+ .dl { display:inline-flex; align-items:center; gap:6px; color:var(--accent); font-size:13px; cursor:pointer; font-weight:500; white-space:nowrap; }
335
+ a.dl { text-decoration:none; }
336
+ .dl:hover { text-decoration:underline; }
337
+ .file-ico { width:22px; height:26px; border-radius:4px; border:1px solid var(--border-2); background:var(--surface-2); flex:0 0 auto; display:flex; align-items:center; justify-content:center; color:var(--faint); font-size:9px; font-weight:700; }
338
+ .inert { color:var(--faint); font-size:12px; }
339
+ .trow.inert-row { opacity:.5; cursor:default; }
340
+ .trow.inert-row:hover { background:transparent; }
341
+
342
+ .api-banner {
343
+ position:fixed; right:18px; bottom:18px; z-index:30;
344
+ display:flex; align-items:center; gap:8px;
345
+ max-width:360px; padding:9px 12px; border-radius:var(--r-md);
346
+ border:1px solid var(--accent-line); background:var(--accent-wash);
347
+ color:var(--accent); font-size:12.5px; font-weight:550;
348
+ box-shadow:var(--shadow);
349
+ }
350
+ .api-banner.warn { max-width:520px; }
351
+ .modebar {
352
+ display:flex; align-items:center; gap:9px; padding:9px var(--gutter);
353
+ min-height:38px; border-bottom:1px solid var(--border); background:var(--surface);
354
+ color:var(--soft); font-size:12.5px;
355
+ }
356
+ .modebar svg { color:var(--accent); flex:0 0 auto; }
357
+ .mode-main { color:var(--ink); font-weight:600; white-space:nowrap; }
358
+ .mode-copy { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
359
+ .mode-warn { margin-left:auto; max-width:45%; color:var(--accent); font-weight:550; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
360
+ .mode-demo,.mode-error { background:var(--accent-wash); border-bottom-color:var(--accent-line); }
361
+ .inline-warn {
362
+ display:flex; align-items:flex-start; gap:8px; margin:-6px 0 18px;
363
+ max-width:820px; padding:9px 12px; border-radius:var(--r-md);
364
+ border:1px solid var(--accent-line); background:var(--accent-wash);
365
+ color:var(--accent); font-size:12.5px; font-weight:550;
366
+ }
367
+ .inline-warn svg { flex:0 0 auto; margin-top:2px; }
368
+ .inline-note {
369
+ display:flex; align-items:flex-start; gap:8px; margin:-6px 0 18px;
370
+ max-width:820px; padding:9px 12px; border-radius:var(--r-md);
371
+ border:1px solid var(--line); background:var(--surface-2);
372
+ color:var(--text-muted); font-size:12.5px; font-weight:550;
373
+ }
374
+ .inline-note svg { flex:0 0 auto; margin-top:2px; color:var(--text-dim); }
375
+ .inline-ok {
376
+ display:flex; align-items:flex-start; gap:8px; margin:-6px 0 18px;
377
+ max-width:820px; padding:9px 12px; border-radius:var(--r-md);
378
+ border:1px solid rgba(95,193,135,.28); background:var(--green-wash);
379
+ color:var(--green); font-size:12.5px; font-weight:550;
380
+ }
381
+ .inline-ok svg { flex:0 0 auto; margin-top:2px; }
382
+
383
+ /* ───────── readiness / environments ───────── */
384
+ .readiness-summary {
385
+ display:flex; align-items:flex-start; justify-content:space-between; gap:18px;
386
+ padding:18px 20px; margin-bottom:14px;
387
+ }
388
+ .readiness-summary h2 { margin:0; font-size:18px; letter-spacing:-.2px; }
389
+ .readiness-summary p { max-width:760px; margin:5px 0 0; color:var(--soft); font-size:13.5px; line-height:1.6; }
390
+ .readiness-grid { display:grid; grid-template-columns:repeat(3, minmax(0, 1fr)); gap:14px; }
391
+ .readiness-card { padding:16px; display:flex; flex-direction:column; gap:14px; align-items:flex-start; }
392
+ .readiness-card-head { display:flex; gap:12px; align-items:flex-start; }
393
+ .readiness-card h3 { margin:0; font-size:14.5px; font-weight:600; }
394
+ .readiness-card p { margin:4px 0 0; color:var(--soft); font-size:12.5px; line-height:1.55; }
395
+ .readiness-mark {
396
+ width:30px; height:30px; border-radius:8px; display:flex; align-items:center; justify-content:center; flex:0 0 auto;
397
+ }
398
+ .readiness-mark.ok { color:var(--green); background:var(--green-wash); }
399
+ .readiness-mark.todo { color:var(--accent); background:var(--accent-wash); }
400
+ .env-preset {
401
+ display:flex; gap:12px; align-items:flex-start; padding:12px 14px;
402
+ border:1px solid var(--border); border-radius:var(--r-md); background:var(--bg);
403
+ }
404
+ .env-preset-grid { display:grid; grid-template-columns:1fr 1fr; gap:9px; }
405
+ .env-choice {
406
+ appearance:none; font:inherit; text-align:left; display:flex; gap:10px; align-items:flex-start;
407
+ padding:11px 12px; border:1px solid var(--border); border-radius:var(--r-md);
408
+ background:var(--bg); color:var(--ink); cursor:pointer; transition:border-color .12s, background .12s;
409
+ }
410
+ .env-choice:hover { border-color:var(--border-2); }
411
+ .env-choice.on { border-color:var(--accent-line); background:var(--accent-wash); }
412
+ .env-choice .dot-r { width:15px; height:15px; border-radius:50%; border:2px solid var(--border-2); flex:0 0 auto; position:relative; margin-top:2px; }
413
+ .env-choice.on .dot-r { border-color:var(--accent); }
414
+ .env-choice.on .dot-r::after { content:""; position:absolute; inset:3px; border-radius:50%; background:var(--accent); }
415
+ .env-choice .r-main { display:block; font-size:13px; font-weight:550; color:var(--ink); }
416
+ .env-choice .r-sub { display:block; margin-top:2px; font-size:11.5px; line-height:1.45; color:var(--faint); }
417
+ .env-actions { display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
418
+ .env-host-preview {
419
+ min-height:36px; max-height:120px; overflow:auto; margin:5px 0 0;
420
+ padding:8px 9px; border:1px solid var(--border); border-radius:var(--r-sm);
421
+ background:#0d0e0c; color:var(--soft); font-size:11.5px; line-height:1.55; white-space:pre-wrap;
422
+ }
423
+ .env-config { margin-top:4px; color:var(--faint); font-size:11.5px; white-space:normal; overflow-wrap:anywhere; }
424
+ .trow.env-row { cursor:default; }
425
+ .trow.env-row:hover { background:transparent; }
426
+
427
+ /* misc */
428
+ .fade-in { }
429
+
430
+ /* ───────── documentation ───────── */
431
+ .docs-app { height:100vh; min-height:100dvh; background:var(--bg); }
432
+ .docs-shell { display:grid; grid-template-columns:244px minmax(0, 1fr) 188px; height:100%; min-height:0; }
433
+ .docs-nav { padding:20px 14px 28px; border-right:1px solid var(--border); background:var(--surface); overflow:auto; }
434
+ .docs-nav-brand { display:flex; width:100%; align-items:center; gap:9px; padding:0 5px 18px; border:0; background:transparent; color:var(--ink); font:inherit; font-size:13.5px; font-weight:600; text-align:left; cursor:pointer; }
435
+ .docs-nav-brand .brand-mark { width:23px; height:23px; border-radius:6px; font-size:12px; }
436
+ .docs-nav-brand small { display:block; color:var(--faint); font-size:10.5px; font-weight:400; }
437
+ .docs-nav-group { margin:0 0 15px; }
438
+ .docs-nav-label { padding:0 7px 5px; color:var(--dim); font-size:10.5px; font-weight:600; letter-spacing:.075em; text-transform:uppercase; }
439
+ .docs-nav-link, .docs-toc button { appearance:none; width:100%; border:0; background:transparent; font:inherit; text-align:left; cursor:pointer; }
440
+ .docs-nav-link { display:block; padding:6px 8px; border-radius:var(--r-sm); color:var(--soft); font-size:12.5px; }
441
+ .docs-nav-link:hover { background:var(--hover); color:var(--ink); }
442
+ .docs-nav-link.active { background:var(--accent-wash); color:var(--ink); font-weight:550; box-shadow:inset 2px 0 var(--accent); }
443
+ .docs-nav-footer { margin:20px 5px 0; padding-top:9px; border-top:1px solid var(--border); }
444
+ .docs-nav-api { display:flex; align-items:center; gap:8px; padding:5px 2px; color:var(--soft); font-size:12px; text-decoration:none; }
445
+ .docs-nav-api:hover { color:var(--accent); }
446
+ .docs-nav-console { display:flex; align-items:center; gap:8px; width:100%; padding:5px 2px; border:0; background:transparent; color:var(--soft); font:inherit; font-size:12px; text-align:left; cursor:pointer; }
447
+ .docs-nav-console:hover { color:var(--accent); }
448
+ .docs-article { padding:42px clamp(30px, 5vw, 76px) 70px; overflow:auto; }
449
+ .docs-article > * { max-width:760px; }
450
+ .docs-crumbs { margin-bottom:13px; color:var(--faint); font-size:12.5px; }
451
+ .docs-crumbs span { margin:0 7px; color:var(--dim); }
452
+ .docs-article h1 { margin:0 0 14px; color:var(--ink); font-size:31px; line-height:1.12; letter-spacing:-.7px; }
453
+ .docs-article h2 { scroll-margin-top:20px; margin:38px 0 10px; color:var(--ink); font-size:19px; line-height:1.25; letter-spacing:-.25px; }
454
+ .docs-article h3 { scroll-margin-top:20px; margin:26px 0 8px; color:var(--ink); font-size:15px; line-height:1.35; }
455
+ .docs-article p, .docs-article li { color:var(--soft); font-size:14px; line-height:1.72; }
456
+ .docs-article p { margin:0 0 14px; }
457
+ .docs-article a { color:var(--accent-2); text-underline-offset:3px; }
458
+ .docs-article code { border:1px solid var(--border); border-radius:4px; background:var(--bg); padding:1px 4px; color:#d6dae0; font-family:var(--mono); font-size:.9em; }
459
+ .docs-page-actions { display:flex; justify-content:flex-end; gap:8px; margin:0 0 18px; }
460
+ .docs-inline-link { padding:0; border:0; background:transparent; color:var(--accent-2); font:inherit; text-decoration:underline; text-underline-offset:3px; cursor:pointer; }
461
+ .docs-inline-link:hover { color:var(--accent); }
462
+ .docs-loading { display:flex; align-items:center; gap:8px; padding:18px 0; color:var(--soft); font-size:13px; }
463
+ .docs-loading.error { color:var(--red); }
464
+ .docs-list { margin:15px 0; padding-left:21px; }
465
+ .docs-list li { margin:6px 0; }
466
+ .docs-lede { margin:0 0 22px !important; color:#c7ccd5 !important; font-size:17px !important; line-height:1.55 !important; }
467
+ .docs-callout { display:flex; align-items:flex-start; gap:10px; margin:20px 0; padding:12px 14px; border:1px solid rgba(123,164,230,.34); border-radius:var(--r-md); background:rgba(123,164,230,.1); color:#aac2ed; font-size:12.5px; line-height:1.55; }
468
+ .docs-callout.warn { border-color:var(--accent-line); background:var(--accent-wash); color:var(--accent-2); }
469
+ .docs-callout svg { flex:0 0 auto; margin-top:2px; }
470
+ .docs-card-grid { display:grid; grid-template-columns:repeat(3, minmax(0, 1fr)); gap:12px; margin:26px 0 6px; }
471
+ .docs-card { appearance:none; min-height:122px; display:flex; align-items:flex-start; gap:10px; padding:15px; border:1px solid var(--border); border-radius:var(--r-lg); background:var(--surface); color:var(--ink); font:inherit; text-align:left; cursor:pointer; box-shadow:var(--shadow); transition:border-color .14s, background .14s, transform .05s; }
472
+ .docs-card:hover { border-color:var(--accent-line); background:var(--surface-2); }
473
+ .docs-card:active { transform:translateY(1px); }
474
+ .docs-card-icon { display:flex; align-items:center; justify-content:center; width:30px; height:30px; border-radius:8px; background:var(--accent-wash); color:var(--accent); flex:0 0 auto; }
475
+ .docs-card strong { display:block; margin:1px 0 4px; font-size:13px; }
476
+ .docs-card small { display:block; color:var(--soft); font-size:11.5px; line-height:1.5; }
477
+ .docs-card-arrow { margin-left:auto; color:var(--faint); flex:0 0 auto; }
478
+ .docs-table-wrap { overflow:auto; margin:16px 0; border:1px solid var(--border); border-radius:var(--r-md); }
479
+ .docs-table { width:100%; min-width:520px; border-collapse:collapse; text-align:left; font-size:13px; }
480
+ .docs-table th, .docs-table td { padding:11px 14px; border-bottom:1px solid var(--border); vertical-align:top; line-height:1.55; }
481
+ .docs-table tr:last-child th, .docs-table tr:last-child td { border-bottom:0; }
482
+ .docs-table thead th { background:var(--surface-2); color:var(--soft); font-size:11.5px; font-weight:600; text-transform:uppercase; letter-spacing:.035em; }
483
+ .docs-table tbody th { width:30%; color:var(--ink); font-weight:550; }
484
+ .docs-table td { color:var(--soft); }
485
+ .docs-steps { display:flex; flex-direction:column; gap:15px; margin:17px 0; padding:0; list-style:none; counter-reset:docs-step; }
486
+ .docs-steps li { position:relative; min-height:38px; padding-left:48px; }
487
+ .docs-steps li::before { counter-increment:docs-step; content:counter(docs-step); position:absolute; left:0; top:1px; display:flex; align-items:center; justify-content:center; width:28px; height:28px; border-radius:50%; background:var(--accent-wash); color:var(--accent); font-size:12px; font-weight:650; }
488
+ .docs-steps strong, .docs-steps span { display:block; }
489
+ .docs-steps strong { color:var(--ink); font-weight:600; }
490
+ .docs-steps span { margin-top:2px; color:var(--soft); font-size:13px; line-height:1.55; }
491
+ .docs-steps.compact { gap:11px; }
492
+ .docs-code { margin:16px 0; padding:14px 16px; overflow:auto; border:1px solid var(--border); border-radius:var(--r-md); background:#14171c; color:#d5dae2; font-family:var(--mono); font-size:12.5px; line-height:1.65; }
493
+ .docs-code code { padding:0; border:0; background:transparent; color:inherit; }
494
+ .docs-toc { padding:46px 20px; border-left:1px solid var(--border); background:var(--bg); overflow:auto; }
495
+ .docs-toc strong { display:block; margin:0 0 10px; color:var(--soft); font-size:12px; font-weight:600; }
496
+ .docs-toc button { padding:4px 0; color:var(--faint); font-size:12px; line-height:1.45; }
497
+ .docs-toc button.nested { padding-left:10px; font-size:11.5px; }
498
+ .docs-toc button:hover { color:var(--accent-2); }
499
+ .docs-nav-brand:focus-visible, .docs-nav-link:focus-visible, .docs-nav-console:focus-visible, .docs-toc button:focus-visible, .docs-card:focus-visible { outline:2px solid var(--accent); outline-offset:2px; }
500
+
501
+ @media (max-width:1120px) {
502
+ .docs-shell { grid-template-columns:216px minmax(0, 1fr); }
503
+ .docs-toc { display:none; }
504
+ .docs-card-grid { grid-template-columns:1fr; }
505
+ }
506
+ @media (max-width:760px) {
507
+ .docs-shell { grid-template-columns:1fr; overflow:auto; }
508
+ .docs-nav { border-right:0; border-bottom:1px solid var(--border); padding:14px; overflow:visible; }
509
+ .docs-nav-group { display:inline-block; vertical-align:top; min-width:150px; margin:0 14px 0 0; }
510
+ .docs-nav-brand { padding-bottom:12px; }
511
+ .docs-nav-api { display:none; }
512
+ .docs-article { padding:28px 20px 52px; overflow:visible; }
513
+ .docs-article h1 { font-size:27px; }
514
+ }
515
+
516
+ /* Documentation reference refresh: a dense editorial shell inspired by the
517
+ CMA information architecture, using OMA's own mark, copy, and navigation. */
518
+ .docs-app { background:#10110f; color:#dfdfd8; }
519
+ .docs-shell { grid-template-columns:304px minmax(0,1fr) 268px; grid-template-rows:60px minmax(0,1fr); background:#10110f; }
520
+ .docs-topbar { grid-column:1 / -1; display:flex; align-items:center; gap:24px; padding:0 20px; border-bottom:1px solid #2b2c28; background:#161714; }
521
+ .docs-topbar-brand { display:flex; align-items:center; gap:10px; min-width:280px; padding:0; border:0; background:transparent; color:#f4f2eb; font-family:ui-serif,Georgia,Cambria,serif; font-size:18px; font-weight:600; letter-spacing:-.015em; cursor:pointer; }
522
+ .docs-topbar-brand .brand-mark { width:22px; height:22px; border-radius:6px; font-family:var(--font); font-size:12px; }
523
+ .docs-topbar-nav { display:flex; align-items:center; justify-content:center; gap:8px; flex:1; }
524
+ .docs-topbar-nav span { padding:8px 13px; border-radius:9px; color:#969790; font-size:14px; }
525
+ .docs-topbar-nav .active { background:#22231f; color:#efeee8; }
526
+ .docs-topbar-actions { display:flex; align-items:center; justify-content:flex-end; gap:18px; min-width:280px; }
527
+ .docs-topbar-link, .docs-topbar-console { display:flex; align-items:center; gap:7px; border:0; background:transparent; color:#b8b9b1; font:inherit; font-size:13px; text-decoration:none; cursor:pointer; }
528
+ .docs-topbar-link:hover { color:#f4f2eb; }
529
+ .docs-topbar-console { padding:7px 11px; border:1px solid #393a35; border-radius:8px; color:#e7e5de; }
530
+ .docs-topbar-console:hover { border-color:#63645c; background:#20211e; }
531
+ .docs-nav { grid-column:1; grid-row:2; display:flex; flex-direction:column; min-height:0; padding:18px 14px 16px; border-right:1px solid #282925; background:#11120f; }
532
+ .docs-search { display:flex; align-items:center; gap:8px; margin-bottom:20px; padding:9px 11px; border:1px solid #3b3c37; border-radius:9px; background:#292a26; color:#8e8f87; }
533
+ .docs-search input { width:100%; min-width:0; border:0; outline:0; background:transparent; color:#edede6; font:inherit; font-size:13px; }
534
+ .docs-search input::placeholder { color:#989991; }
535
+ .docs-search kbd { padding:1px 4px; border:1px solid #4b4c45; border-radius:4px; color:#979890; font:inherit; font-size:10px; }
536
+ .docs-nav-group { margin:0 0 19px; }
537
+ .docs-nav-label { padding:0 5px 7px; color:#edede7; font-size:13px; font-weight:650; letter-spacing:0; text-transform:none; }
538
+ .docs-nav-link { padding:6px 7px; border-radius:7px; color:#b9bab2; font-size:13px; line-height:1.35; }
539
+ .docs-nav-link:hover { color:#f2f1eb; background:#1d1e1a; }
540
+ .docs-nav-link.active { background:#242520; color:#f6f5ef; font-weight:550; box-shadow:none; }
541
+ .docs-nav-empty { padding:8px 7px; color:#969790; font-size:12px; }
542
+ .docs-nav-footer { margin-top:auto; margin-bottom:0; padding:16px 7px 2px; border-top:1px solid #292a26; color:#b6b7af; font-size:12px; }
543
+ .docs-nav-footer small { display:block; margin-top:2px; color:#7d7e77; font-size:11px; }
544
+ .docs-main { grid-column:2; grid-row:2; min-width:0; overflow:auto; }
545
+ .docs-article { width:min(960px,calc(100% - 96px)); margin:0 auto; padding:39px 0 90px; overflow:visible; }
546
+ .docs-crumbs { margin-bottom:14px; color:#8e8f87; font-size:13px; }
547
+ .docs-crumbs span { margin:0 8px; color:#5e5f58; }
548
+ .docs-title-row { display:flex; align-items:flex-start; justify-content:space-between; gap:24px; margin-bottom:14px; }
549
+ .docs-title-row h1, .docs-article > h1 { margin:0; color:#f6f4ee; font-family:ui-serif,Georgia,Cambria,serif; font-size:37px; font-weight:500; letter-spacing:-.022em; line-height:1.16; }
550
+ .docs-page-actions { position:relative; display:flex; flex:0 0 auto; margin:5px 0 0; border:1px solid #3c3d37; border-radius:9px; background:#20211e; }
551
+ .docs-copy-main, .docs-copy-caret { display:flex; align-items:center; gap:8px; border:0; background:transparent; color:#e6e5de; font:inherit; font-size:13px; cursor:pointer; }
552
+ .docs-copy-main { padding:8px 11px 8px 13px; border-radius:8px 0 0 8px; }
553
+ .docs-copy-caret { padding:7px 10px; border-left:1px solid #3c3d37; border-radius:0 8px 8px 0; font-size:17px; line-height:1; }
554
+ .docs-copy-main:hover, .docs-copy-caret:hover { background:#292a26; }
555
+ .docs-copy-main:disabled { cursor:wait; opacity:.55; }
556
+ .docs-copy-menu { position:absolute; top:calc(100% + 7px); right:0; z-index:5; width:222px; padding:5px; border:1px solid #454640; border-radius:10px; background:#2b2c28; box-shadow:0 16px 38px rgba(0,0,0,.38); }
557
+ .docs-copy-menu button { display:flex; align-items:center; gap:9px; width:100%; padding:8px 9px; border:0; border-radius:6px; background:transparent; color:#eeece5; font:inherit; font-size:12.5px; text-align:left; cursor:pointer; }
558
+ .docs-copy-menu button:hover { background:#3a3b35; }
559
+ .docs-article h2 { scroll-margin-top:82px; margin:56px 0 15px; color:#f2f0ea; font-family:ui-serif,Georgia,Cambria,serif; font-size:27px; font-weight:500; letter-spacing:-.015em; line-height:1.27; }
560
+ .docs-article h3 { scroll-margin-top:82px; margin:28px 0 9px; color:#ecebe4; font-size:16px; line-height:1.35; }
561
+ .docs-article p, .docs-article li { color:#c5c5bd; font-size:15.5px; line-height:1.72; }
562
+ .docs-article p { margin:0 0 18px; }
563
+ .docs-article > p:first-of-type { color:#aaaba4; font-size:20px; line-height:1.52; }
564
+ .docs-article a, .docs-inline-link { color:#e8e6df; text-decoration-color:#5f6059; }
565
+ .docs-article a:hover, .docs-inline-link:hover { color:#fff; text-decoration-color:#a4a59c; }
566
+ .docs-article code { border-color:#3a3b35; border-radius:5px; background:#1d1e1a; padding:2px 5px; color:#dfded6; }
567
+ .docs-lede { color:#aaaba4 !important; font-size:20px !important; line-height:1.52 !important; }
568
+ .docs-callout { gap:12px; margin:24px 0; padding:15px 17px; border-color:rgba(92,151,237,.55); border-radius:10px; background:rgba(61,100,152,.17); color:#adc8ef; font-size:14px; line-height:1.6; }
569
+ .docs-callout.warn { border-color:rgba(234,180,76,.55); background:rgba(234,180,76,.1); color:#edd29b; }
570
+ .docs-card-grid { gap:16px; margin:28px 0 8px; }
571
+ .docs-card { min-height:148px; padding:19px; border-color:#353630; border-radius:12px; background:#151613; color:#ecebe4; box-shadow:none; }
572
+ .docs-card:hover { border-color:#696a61; background:#1b1c18; }
573
+ .docs-card-icon { background:transparent; }
574
+ .docs-table-wrap { margin:12px 0 28px; border:0; border-radius:0; }
575
+ .docs-table { font-size:14px; }
576
+ .docs-table th, .docs-table td { padding:13px 20px 13px 0; border-bottom-color:#30312c; line-height:1.58; }
577
+ .docs-table thead th { background:transparent; color:#f0efe8; font-size:14px; text-transform:none; letter-spacing:0; }
578
+ .docs-table tbody th { width:23%; color:#acada6; }
579
+ .docs-table td { color:#bbbcb4; }
580
+ .docs-steps li::before { width:27px; height:27px; border:1px solid #4b4c45; border-radius:6px; background:#1b1c18; color:#e6e4dc; }
581
+ .docs-code { border-color:#32332e; border-radius:9px; background:#171815; color:#d7d6ce; }
582
+ .docs-toc { grid-column:3; grid-row:2; padding:86px 28px 40px 14px; border-left:1px solid #282925; background:#11120f; }
583
+ .docs-toc strong { margin:0 0 12px; padding-left:14px; border-left:2px solid #e6e5de; color:#eeece5; font-size:13px; }
584
+ .docs-toc button { padding:5px 0 5px 16px; color:#989991; font-size:13px; }
585
+ .docs-toc button.nested { padding-left:27px; font-size:12px; }
586
+ .docs-toc button:hover { color:#efede7; }
587
+ .docs-topbar-brand:focus-visible, .docs-nav-link:focus-visible, .docs-topbar-console:focus-visible, .docs-toc button:focus-visible, .docs-card:focus-visible, .docs-search:focus-within { outline:2px solid var(--accent); outline-offset:2px; }
588
+
589
+ @media (max-width:1180px) {
590
+ .docs-shell { grid-template-columns:250px minmax(0,1fr); }
591
+ .docs-toc { display:none; }
592
+ .docs-article { width:min(800px,calc(100% - 64px)); }
593
+ }
594
+ @media (max-width:760px) {
595
+ .docs-app { height:auto; min-height:100dvh; }
596
+ .docs-shell { grid-template-columns:1fr; grid-template-rows:auto auto auto; height:auto; overflow:visible; }
597
+ .docs-topbar { grid-column:1; padding:0 15px; min-height:56px; }
598
+ .docs-topbar-brand, .docs-topbar-actions { min-width:0; }
599
+ .docs-topbar-brand { font-size:16px; }
600
+ .docs-topbar-nav, .docs-topbar-link { display:none; }
601
+ .docs-topbar-actions { margin-left:auto; }
602
+ .docs-nav { grid-column:1; grid-row:2; max-height:265px; border-right:0; border-bottom:1px solid #282925; }
603
+ .docs-main { grid-column:1; grid-row:3; overflow:visible; }
604
+ .docs-article { width:auto; margin:0; padding:28px 20px 58px; }
605
+ .docs-title-row { display:block; }
606
+ .docs-title-row h1 { font-size:30px; }
607
+ .docs-page-actions { display:inline-flex; margin-top:17px; }
608
+ }
609
+
610
+ /* ───────── live streaming ───────── */
611
+ .badge.live .dot { animation:livepulse 1.4s ease-in-out infinite; }
612
+ @keyframes livepulse { 0%,100%{ opacity:1; box-shadow:0 0 0 0 var(--green-wash); } 50%{ opacity:.45; box-shadow:0 0 0 4px var(--green-wash); } }
613
+
614
+ .stream.live { max-height:calc(100vh - 320px); min-height:300px; overflow-y:auto; }
615
+ .stream.live .panel { overflow:visible; }
616
+ .stream.live .ev { opacity:1; animation:evIn .3s cubic-bezier(.2,.7,.3,1); }
617
+ @keyframes evIn { from{ transform:translateY(7px); } to{ transform:none; } }
618
+
619
+ .working-row { animation:none !important; }
620
+ .working { display:inline-flex; align-items:center; gap:4px; width:52px; justify-content:center; flex:0 0 auto; }
621
+ .working i { width:5px; height:5px; border-radius:50%; background:var(--accent); animation:dotpulse 1.1s ease-in-out infinite; }
622
+ .working i:nth-child(2){ animation-delay:.18s; } .working i:nth-child(3){ animation-delay:.36s; }
623
+ @keyframes dotpulse { 0%,100%{ opacity:.25; transform:translateY(0); } 40%{ opacity:1; transform:translateY(-2px); } }
624
+
625
+ .composer input:disabled { opacity:.6; cursor:not-allowed; }
626
+ .composer.ro { border-style:dashed; }
627
+
628
+ /* ───────── modals / forms ───────── */
629
+ .overlay { position:fixed; inset:0; z-index:200; background:rgba(0,0,0,.72); backdrop-filter:blur(4px); display:flex; align-items:flex-start; justify-content:center; padding:60px 20px; overflow:auto; }
630
+ .modal { width:100%; max-width:540px; background:#383936; border:1px solid #5a5b55; border-radius:12px; box-shadow:0 28px 76px -18px rgba(0,0,0,.78); animation:modalIn .2s cubic-bezier(.2,.7,.3,1); }
631
+ @keyframes modalIn { from{ transform:translateY(-10px); } to{ transform:none; } }
632
+ .modal-head { display:flex; align-items:flex-start; gap:12px; padding:18px 20px 14px; border-bottom:1px solid var(--border); }
633
+ .modal-head .ic { width:34px; height:34px; border-radius:9px; background:var(--accent-wash); color:var(--accent); display:flex; align-items:center; justify-content:center; flex:0 0 auto; }
634
+ .modal-head h2 { margin:0; font-size:17px; font-weight:600; letter-spacing:-.2px; }
635
+ .modal-head p { margin:3px 0 0; font-size:12.5px; color:var(--soft); }
636
+ .modal-head .x { margin-left:auto; }
637
+ .modal-body { padding:18px 20px; display:flex; flex-direction:column; gap:16px; max-height:60vh; overflow:auto; }
638
+ .modal-foot { display:flex; align-items:center; gap:10px; justify-content:flex-end; padding:14px 20px; border-top:1px solid var(--border); }
639
+ .modal-foot .left { margin-right:auto; color:var(--faint); font-size:12px; }
640
+
641
+ .form-row { display:flex; flex-direction:column; gap:7px; }
642
+ .form-row.two { display:grid; grid-template-columns:1fr 1fr; gap:14px; }
643
+ .form-label { font-size:12.5px; font-weight:550; color:var(--soft); display:flex; align-items:center; gap:7px; }
644
+ .form-label .opt { color:var(--faint); font-weight:400; font-size:11.5px; }
645
+ .input, .textarea, .selectbox {
646
+ width:100%; background:#242521; border:1px solid var(--border); border-radius:var(--r-md);
647
+ color:var(--ink); font:inherit; font-size:13.5px; padding:9px 11px; outline:none; transition:border-color .15s;
648
+ }
649
+ .input:focus, .textarea:focus, .selectbox:focus { border-color:var(--accent-line); }
650
+ .modal .input, .modal .textarea, .modal .selectbox { background:#4a4b46; border-color:#5d5e58; }
651
+ .modal .input:focus, .modal .textarea:focus, .modal .selectbox:focus { border-color:#71aaf3; box-shadow:0 0 0 1px #71aaf3; }
652
+ .input::placeholder, .textarea::placeholder { color:var(--faint); }
653
+ .textarea { resize:vertical; min-height:74px; line-height:1.55; font-family:var(--mono); font-size:12.5px; }
654
+ .selectbox { appearance:none; cursor:pointer; background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%236d7480' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M6 9l6 6 6-6'/></svg>"); background-repeat:no-repeat; background-position:right 11px center; padding-right:32px; }
655
+ .field-hint { font-size:11.5px; color:var(--faint); }
656
+ .seg-tools { display:flex; flex-wrap:wrap; gap:8px; }
657
+ .tool-toggle { appearance:none; font-family:inherit; display:inline-flex; align-items:center; gap:7px; padding:6px 11px; border-radius:999px; border:1px solid var(--border); background:var(--surface-2); color:var(--soft); font-size:12.5px; font-weight:500; cursor:pointer; transition:.12s; }
658
+ .tool-toggle:hover { border-color:var(--border-2); color:var(--ink); }
659
+ .tool-toggle.on { background:var(--accent-wash); border-color:var(--accent-line); color:var(--accent); }
660
+ .tool-toggle .chk { width:13px; height:13px; border-radius:4px; border:1.5px solid currentColor; opacity:.55; display:flex; align-items:center; justify-content:center; }
661
+ .tool-toggle.on .chk { background:var(--accent); border-color:var(--accent); opacity:1; }
662
+ .radio-set { display:flex; flex-direction:column; gap:8px; }
663
+ .radio { display:flex; align-items:center; gap:10px; padding:10px 12px; border:1px solid var(--border); border-radius:var(--r-md); background:var(--bg); cursor:pointer; transition:border-color .12s; }
664
+ .radio:hover { border-color:var(--border-2); }
665
+ .radio.on { border-color:var(--accent-line); background:var(--accent-wash); }
666
+ .radio .dot-r { width:15px; height:15px; border-radius:50%; border:2px solid var(--border-2); flex:0 0 auto; position:relative; }
667
+ .radio.on .dot-r { border-color:var(--accent); }
668
+ .radio.on .dot-r::after { content:""; position:absolute; inset:3px; border-radius:50%; background:var(--accent); }
669
+ .radio .r-main { font-size:13px; color:var(--ink); }
670
+ .radio .r-sub { font-size:11.5px; color:var(--faint); margin-top:1px; }
671
+ .radio .r-mono { font-family:var(--mono); }
672
+
673
+ /* ───────── tool-confirmation card (requires_action) ───────── */
674
+ .confirm-card { border:1px solid var(--accent-line); border-radius:var(--r-lg); background:var(--accent-wash); margin-top:12px; overflow:hidden; }
675
+ .confirm-card .cc-head { display:flex; align-items:center; gap:10px; padding:13px 16px; }
676
+ .confirm-card .cc-ic { width:30px; height:30px; border-radius:8px; background:var(--accent); color:var(--accent-ink); display:flex; align-items:center; justify-content:center; flex:0 0 auto; }
677
+ .confirm-card .cc-title { font-size:14px; font-weight:600; }
678
+ .confirm-card .cc-label { font-size:10.5px; font-weight:600; letter-spacing:.06em; text-transform:uppercase; color:var(--accent); }
679
+ .confirm-card .cc-body { padding:0 16px 14px; }
680
+ .confirm-card .cc-tool { display:flex; align-items:center; gap:9px; background:#0d0e0c; border:1px solid var(--border); border-radius:var(--r-md); padding:10px 12px; font-family:var(--mono); font-size:12.5px; color:#d3d3cb; }
681
+ .darker .confirm-card .cc-tool { background:#080906; }
682
+ .confirm-card .cc-tool .tn { color:var(--r-tool); font-weight:500; }
683
+ .confirm-card .cc-actions { display:flex; gap:9px; padding:0 16px 14px; }
684
+ .confirm-resolved { display:flex; align-items:center; gap:8px; padding:10px 16px 14px; font-size:12.5px; }
685
+ .confirm-resolved.allow { color:var(--green); }
686
+ .confirm-resolved.deny { color:var(--red); }
687
+
688
+ /* ───────── action menu (dropdown) ───────── */
689
+ .menu-wrap { position:relative; }
690
+ .menu { position:absolute; right:0; top:calc(100% + 6px); z-index:50; min-width:210px; background:#353632; border:1px solid #50514b; border-radius:var(--r-md); box-shadow:0 16px 38px -12px rgba(0,0,0,.72); padding:5px; animation:modalIn .14s ease; }
691
+ .menu-item { display:flex; align-items:center; gap:10px; padding:8px 10px; border-radius:var(--r-sm); font-size:13px; color:var(--ink); cursor:pointer; white-space:nowrap; }
692
+ .menu-item:hover { background:var(--hover); }
693
+ .menu-item svg { width:15px; height:15px; color:var(--soft); }
694
+ .menu-item.danger { color:var(--red); } .menu-item.danger svg { color:var(--red); }
695
+ .menu-sep { height:1px; background:var(--border); margin:4px 2px; }
696
+
697
+ /* small confirm dialog */
698
+ .modal.sm { max-width:420px; }
699
+ .modal.sm .modal-body { gap:0; }
700
+ .confirm-msg { font-size:13.5px; color:var(--soft); line-height:1.6; }
701
+ .confirm-msg b { color:var(--ink); font-weight:600; }
702
+ .modal-head .ic.danger { background:var(--red-wash); color:var(--red); }
703
+
704
+ /* ───────── loading / empty / error states ───────── */
705
+ .skel { background:var(--surface-2); background-image:linear-gradient(90deg, rgba(255,255,255,0) 0%, rgba(255,255,255,.05) 50%, rgba(255,255,255,0) 100%); background-size:240% 100%; background-repeat:no-repeat; border-radius:6px; animation:shimmer 1.3s ease-in-out infinite; }
706
+ @keyframes shimmer { 0%{ background-position:140% 0; } 100%{ background-position:-140% 0; } }
707
+ @media (prefers-reduced-motion:reduce){ .skel{ animation:none; } }
708
+ .skel-row { display:flex; align-items:center; gap:14px; padding:var(--row-pad) 16px; border-bottom:1px solid var(--border); }
709
+ .skel-row:last-child { border-bottom:none; }
710
+ .skel-dot { width:15px; height:15px; border-radius:4px; flex:0 0 auto; }
711
+ .skel-pill { height:21px; border-radius:999px; }
712
+
713
+ .state { display:flex; flex-direction:column; align-items:center; justify-content:center; text-align:center; padding:60px 24px; gap:5px; }
714
+ .state-ic { width:50px; height:50px; border-radius:14px; background:var(--surface-2); border:1px solid var(--border); display:flex; align-items:center; justify-content:center; color:var(--faint); margin-bottom:8px; }
715
+ .state-ic.err { background:var(--red-wash); border-color:transparent; color:var(--red); }
716
+ .state h3 { margin:0; font-size:16px; font-weight:600; letter-spacing:-.2px; }
717
+ .state p { margin:2px 0 0; font-size:13.5px; color:var(--soft); max-width:400px; line-height:1.6; }
718
+ .state .actions { display:flex; gap:10px; margin-top:14px; }
719
+ .err-envelope { width:100%; max-width:440px; margin-top:16px; text-align:left; }
720
+ .err-envelope .req { display:flex; align-items:center; gap:8px; justify-content:center; margin-top:10px; font-size:12px; color:var(--faint); }
721
+ .err-envelope .req .mono { color:var(--soft); }
722
+ .banner { display:flex; align-items:center; gap:11px; padding:11px 14px; border-radius:var(--r-md); background:var(--red-wash); border:1px solid rgba(229,127,99,.25); margin-bottom:14px; }
723
+ .banner svg { color:var(--red); flex:0 0 auto; }
724
+ .banner .b-main { font-size:13px; color:var(--ink); font-weight:500; }
725
+ .banner .b-sub { font-size:12px; color:var(--soft); }
726
+ .banner .mono { color:var(--soft); }
727
+
728
+
729
+
730
+
731
+ @media (prefers-reduced-motion:reduce){
732
+ .badge.live .dot, .working i, .stream.live .ev { animation:none !important; }
733
+ }