@yiaany/ghostapi 0.1.9 → 0.2.1

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 (292) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/CONTRIBUTING.md +132 -119
  3. package/LICENSE +21 -21
  4. package/PROVENANCE.md +13 -0
  5. package/README.md +78 -84
  6. package/SECURITY.md +56 -53
  7. package/dist/actions/gateway.js +320 -72
  8. package/dist/actions/gateway.js.map +1 -1
  9. package/dist/actions/index.d.ts +2 -2
  10. package/dist/actions/index.js +1 -1
  11. package/dist/actions/index.js.map +1 -1
  12. package/dist/agents/agentPrompt.js +7 -5
  13. package/dist/agents/agentPrompt.js.map +1 -1
  14. package/dist/ai/aiClient.js +5 -5
  15. package/dist/ai/aiClient.js.map +1 -1
  16. package/dist/ai/aiGenerator.js +66 -26
  17. package/dist/ai/aiGenerator.js.map +1 -1
  18. package/dist/ai/genericInference.js +151 -36
  19. package/dist/ai/genericInference.js.map +1 -1
  20. package/dist/ai/prompts.js +55 -49
  21. package/dist/ai/prompts.js.map +1 -1
  22. package/dist/approvals/approvalInbox.js +649 -133
  23. package/dist/approvals/approvalInbox.js.map +1 -1
  24. package/dist/approvals/index.d.ts +2 -2
  25. package/dist/approvals/index.js +1 -1
  26. package/dist/approvals/index.js.map +1 -1
  27. package/dist/behavior/behaviorStore.js +34 -14
  28. package/dist/behavior/behaviorStore.js.map +1 -1
  29. package/dist/cache/index.js +14 -5
  30. package/dist/cache/index.js.map +1 -1
  31. package/dist/cli/index.js +226 -93
  32. package/dist/cli/index.js.map +1 -1
  33. package/dist/cli/openUrl.js +17 -3
  34. package/dist/cli/openUrl.js.map +1 -1
  35. package/dist/cli/parser.js +79 -18
  36. package/dist/cli/parser.js.map +1 -1
  37. package/dist/config/dataPaths.js +4 -2
  38. package/dist/config/dataPaths.js.map +1 -1
  39. package/dist/config/localConfig.js +5 -2
  40. package/dist/config/localConfig.js.map +1 -1
  41. package/dist/config/serverConfig.js +11 -5
  42. package/dist/config/serverConfig.js.map +1 -1
  43. package/dist/contracts/contract.js +311 -83
  44. package/dist/contracts/contract.js.map +1 -1
  45. package/dist/contracts/index.d.ts +2 -2
  46. package/dist/contracts/index.js +1 -1
  47. package/dist/contracts/index.js.map +1 -1
  48. package/dist/credentials/credentialBroker.js +391 -79
  49. package/dist/credentials/credentialBroker.js.map +1 -1
  50. package/dist/credentials/index.d.ts +2 -2
  51. package/dist/credentials/index.js +1 -1
  52. package/dist/credentials/index.js.map +1 -1
  53. package/dist/dashboard/app.js +823 -685
  54. package/dist/dashboard/dashboard.js.map +1 -1
  55. package/dist/dashboard/index.html +704 -267
  56. package/dist/dashboard/styles.css +1040 -349
  57. package/dist/egress/capabilities.js +55 -25
  58. package/dist/egress/capabilities.js.map +1 -1
  59. package/dist/egress/linuxBootstrap.js +47 -11
  60. package/dist/egress/linuxBootstrap.js.map +1 -1
  61. package/dist/egress/run.js +170 -31
  62. package/dist/egress/run.js.map +1 -1
  63. package/dist/errors/errorEngine.js +15 -3
  64. package/dist/errors/errorEngine.js.map +1 -1
  65. package/dist/errors/providerErrors.js.map +1 -1
  66. package/dist/evals/evals.js +304 -78
  67. package/dist/evals/evals.js.map +1 -1
  68. package/dist/evals/index.d.ts +2 -2
  69. package/dist/evals/index.js +1 -1
  70. package/dist/evals/index.js.map +1 -1
  71. package/dist/evidence/index.d.ts +2 -2
  72. package/dist/evidence/index.js +1 -1
  73. package/dist/evidence/index.js.map +1 -1
  74. package/dist/evidence/report.d.ts +1 -1
  75. package/dist/evidence/report.js +263 -79
  76. package/dist/evidence/report.js.map +1 -1
  77. package/dist/fault/faultLab.js +24 -9
  78. package/dist/fault/faultLab.js.map +1 -1
  79. package/dist/index.d.ts +42 -42
  80. package/dist/index.js +21 -21
  81. package/dist/index.js.map +1 -1
  82. package/dist/inventory/analysis.d.ts +1 -1
  83. package/dist/inventory/analysis.js +174 -50
  84. package/dist/inventory/analysis.js.map +1 -1
  85. package/dist/inventory/index.d.ts +4 -4
  86. package/dist/inventory/index.js +3 -3
  87. package/dist/inventory/index.js.map +1 -1
  88. package/dist/inventory/inventoryController.js +362 -115
  89. package/dist/inventory/inventoryController.js.map +1 -1
  90. package/dist/inventory/types.js +680 -140
  91. package/dist/inventory/types.js.map +1 -1
  92. package/dist/ledger/actionLedger.js +355 -78
  93. package/dist/ledger/actionLedger.js.map +1 -1
  94. package/dist/ledger/index.d.ts +2 -2
  95. package/dist/ledger/index.js +1 -1
  96. package/dist/ledger/index.js.map +1 -1
  97. package/dist/mcp/server.js +26 -11
  98. package/dist/mcp/server.js.map +1 -1
  99. package/dist/policy/index.d.ts +2 -2
  100. package/dist/policy/index.js +1 -1
  101. package/dist/policy/index.js.map +1 -1
  102. package/dist/policy/policy.js +112 -32
  103. package/dist/policy/policy.js.map +1 -1
  104. package/dist/productTelemetry/index.js +71 -20
  105. package/dist/productTelemetry/index.js.map +1 -1
  106. package/dist/providers/conformance.js +10 -5
  107. package/dist/providers/conformance.js.map +1 -1
  108. package/dist/providers/discord.js +2 -2
  109. package/dist/providers/generic.js +3 -3
  110. package/dist/providers/github.js +2 -2
  111. package/dist/providers/index.d.ts +3 -3
  112. package/dist/providers/index.js +2 -2
  113. package/dist/providers/index.js.map +1 -1
  114. package/dist/providers/openai.js +3 -3
  115. package/dist/providers/packs/resendPack.js +51 -25
  116. package/dist/providers/packs/resendPack.js.map +1 -1
  117. package/dist/providers/packs/stripePack.js +590 -121
  118. package/dist/providers/packs/stripePack.js.map +1 -1
  119. package/dist/providers/registry.js +4 -4
  120. package/dist/providers/registry.js.map +1 -1
  121. package/dist/providers/runtime.js +7 -6
  122. package/dist/providers/runtime.js.map +1 -1
  123. package/dist/providers/stripeWebhook.js +39 -10
  124. package/dist/providers/stripeWebhook.js.map +1 -1
  125. package/dist/providers/twilio.js +2 -2
  126. package/dist/proxy/cacheKey.js +9 -2
  127. package/dist/proxy/cacheKey.js.map +1 -1
  128. package/dist/proxy/providerDetector.js +22 -9
  129. package/dist/proxy/providerDetector.js.map +1 -1
  130. package/dist/proxy/proxyHandler.js +57 -22
  131. package/dist/proxy/proxyHandler.js.map +1 -1
  132. package/dist/proxy/requestNormalizer.js +4 -2
  133. package/dist/proxy/requestNormalizer.js.map +1 -1
  134. package/dist/reliability/costGovernance.js +211 -49
  135. package/dist/reliability/costGovernance.js.map +1 -1
  136. package/dist/reliability/index.d.ts +8 -8
  137. package/dist/reliability/index.js +4 -4
  138. package/dist/reliability/index.js.map +1 -1
  139. package/dist/reliability/reconciliation.js +274 -65
  140. package/dist/reliability/reconciliation.js.map +1 -1
  141. package/dist/reliability/runtimeHealth.js +127 -35
  142. package/dist/reliability/runtimeHealth.js.map +1 -1
  143. package/dist/reliability/slo.js +257 -50
  144. package/dist/reliability/slo.js.map +1 -1
  145. package/dist/report/safetyReport.d.ts +6 -0
  146. package/dist/report/safetyReport.js +56 -12
  147. package/dist/report/safetyReport.js.map +1 -1
  148. package/dist/rules/aiRules.js +5 -5
  149. package/dist/rules/aiRules.js.map +1 -1
  150. package/dist/safety/index.d.ts +2 -2
  151. package/dist/safety/index.js +1 -1
  152. package/dist/safety/index.js.map +1 -1
  153. package/dist/safety/safetyController.js +675 -165
  154. package/dist/safety/safetyController.js.map +1 -1
  155. package/dist/scenarios/scenarioBundle.js +204 -71
  156. package/dist/scenarios/scenarioBundle.js.map +1 -1
  157. package/dist/scenarios/scenarioStore.js +88 -29
  158. package/dist/scenarios/scenarioStore.js.map +1 -1
  159. package/dist/security/headerSanitizer.js +52 -10
  160. package/dist/security/headerSanitizer.js.map +1 -1
  161. package/dist/security/secrets.js +10 -5
  162. package/dist/security/secrets.js.map +1 -1
  163. package/dist/server/accessControl.js +37 -10
  164. package/dist/server/accessControl.js.map +1 -1
  165. package/dist/server/createServer.js +1 -1
  166. package/dist/server/createServer.js.map +1 -1
  167. package/dist/server/eventsStore.js +15 -5
  168. package/dist/server/eventsStore.js.map +1 -1
  169. package/dist/server/routes.js +61 -19
  170. package/dist/server/routes.js.map +1 -1
  171. package/dist/server/sse.js +1 -1
  172. package/dist/server/sse.js.map +1 -1
  173. package/dist/setup/sdkDetector.js +7 -2
  174. package/dist/setup/sdkDetector.js.map +1 -1
  175. package/dist/setup/setupGenerator.js +136 -48
  176. package/dist/setup/setupGenerator.js.map +1 -1
  177. package/dist/state/stateExtractor.js +3 -1
  178. package/dist/state/stateExtractor.js.map +1 -1
  179. package/dist/state/stateResolver.js +10 -7
  180. package/dist/state/stateResolver.js.map +1 -1
  181. package/dist/state/stateStore.js +13 -4
  182. package/dist/state/stateStore.js.map +1 -1
  183. package/dist/storage/fileStore.js +12 -4
  184. package/dist/storage/fileStore.js.map +1 -1
  185. package/dist/teamControl/controlPlane.js +846 -174
  186. package/dist/teamControl/controlPlane.js.map +1 -1
  187. package/dist/teamControl/deployment.js +19 -5
  188. package/dist/teamControl/deployment.js.map +1 -1
  189. package/dist/teamControl/index.d.ts +4 -4
  190. package/dist/teamControl/index.js +2 -2
  191. package/dist/teamControl/index.js.map +1 -1
  192. package/dist/tests/testGenerator.js +15 -7
  193. package/dist/tests/testGenerator.js.map +1 -1
  194. package/dist/trust/index.d.ts +2 -2
  195. package/dist/trust/index.js +1 -1
  196. package/dist/trust/index.js.map +1 -1
  197. package/dist/trust/trustLadder.js +309 -63
  198. package/dist/trust/trustLadder.js.map +1 -1
  199. package/dist/worlds/index.d.ts +2 -2
  200. package/dist/worlds/index.js +1 -1
  201. package/dist/worlds/index.js.map +1 -1
  202. package/dist/worlds/worlds.js +364 -65
  203. package/dist/worlds/worlds.js.map +1 -1
  204. package/docs/assets/dashboard.png +0 -0
  205. package/docs/ci.md +49 -49
  206. package/docs/github-actions.md +84 -84
  207. package/docs/mcp.md +58 -52
  208. package/docs/policy.md +63 -61
  209. package/docs/providers/authoring-packs.md +180 -175
  210. package/docs/providers/stripe-core-pack.md +84 -82
  211. package/docs/releases/README.md +13 -0
  212. package/docs/security/action-gateway-threat-model.md +34 -34
  213. package/docs/security/action-ledger-incident-replay-threat-model.md +42 -42
  214. package/docs/security/approval-inbox-threat-model.md +35 -35
  215. package/docs/security/credential-broker-threat-model.md +52 -52
  216. package/docs/security/egress-threat-model.md +126 -126
  217. package/docs/security/inventory-threat-model.md +104 -104
  218. package/docs/security/kill-switch-budgets-threat-model.md +37 -37
  219. package/docs/security/reliability-threat-model.md +111 -111
  220. package/docs/security/trust-ladder-threat-model.md +33 -33
  221. package/docs/telemetry.md +14 -0
  222. package/docs/usage.md +680 -571
  223. package/examples/README.md +10 -10
  224. package/examples/agent-instructions/README.md +39 -39
  225. package/examples/ci-smoke/README.md +21 -21
  226. package/examples/ci-smoke/ghostapi.policy.yaml +22 -22
  227. package/examples/ci-smoke/package.json +9 -9
  228. package/examples/ci-smoke/production-egress.mjs +4 -2
  229. package/examples/ci-smoke/safe.mjs +21 -17
  230. package/examples/evals/README.md +24 -24
  231. package/examples/evals/retry-after.eval.json +71 -52
  232. package/examples/generic-rest/README.md +27 -27
  233. package/examples/github-fetch/README.md +38 -35
  234. package/examples/openai-streaming/README.md +16 -16
  235. package/examples/openai-streaming/streaming-tool-call.mjs +44 -31
  236. package/examples/policy/ghostapi.policy.yaml +27 -27
  237. package/examples/record-replay/README.md +19 -19
  238. package/examples/record-replay/replay-requests.json +22 -22
  239. package/examples/record-replay/stripe-checkout.har.json +30 -30
  240. package/examples/resend-node/README.md +22 -22
  241. package/examples/stripe-node/README.md +35 -35
  242. package/examples/stripe-node/checkout-flow.mjs +87 -61
  243. package/examples/twilio-node/README.md +21 -21
  244. package/examples/worlds/README.md +19 -19
  245. package/examples/worlds/subscription-recovery.mjs +21 -12
  246. package/package.json +28 -6
  247. package/dist/landing/assets/index-BXR41fAD.css +0 -1
  248. package/dist/landing/assets/index-CxWsopzP.css +0 -1
  249. package/dist/landing/assets/index-D8_ggMRE.js +0 -55
  250. package/dist/landing/assets/index-DZlpyhqd.js +0 -55
  251. package/dist/landing/assets/index-Dk-Xezs3.js +0 -55
  252. package/dist/landing/index.html +0 -15
  253. package/dist/landing/landing.d.ts +0 -3
  254. package/dist/landing/landing.js +0 -12
  255. package/dist/landing/landing.js.map +0 -1
  256. package/docs/commercial/README.md +0 -29
  257. package/docs/commercial/data-inventory.md +0 -36
  258. package/docs/commercial/manual-invoicing.md +0 -44
  259. package/docs/commercial/metrics.md +0 -51
  260. package/docs/commercial/pricing.md +0 -103
  261. package/docs/commercial/privacy-policy-draft.md +0 -41
  262. package/docs/commercial/terms-topics-for-counsel.md +0 -51
  263. package/docs/design-partners/README.md +0 -52
  264. package/docs/design-partners/demo-narratives.md +0 -33
  265. package/docs/design-partners/design-partner-offer.md +0 -39
  266. package/docs/design-partners/discovery-questions.md +0 -28
  267. package/docs/design-partners/feedback-capture-template.md +0 -48
  268. package/docs/design-partners/icp-one-pager.md +0 -43
  269. package/docs/design-partners/onboarding-checklist.md +0 -33
  270. package/docs/design-partners/pilot-success-criteria.md +0 -27
  271. package/docs/design-partners/pricing-interview-script.md +0 -18
  272. package/docs/design-partners/telemetry-plan.md +0 -48
  273. package/docs/development/baseline.md +0 -114
  274. package/docs/development/onboarding-smoke.md +0 -37
  275. package/docs/development/verification-0.1.8.md +0 -25
  276. package/docs/enterprise-product-roadmap-ru.md +0 -1879
  277. package/docs/fundraising/README.md +0 -87
  278. package/docs/fundraising/data-room-checklist.md +0 -72
  279. package/docs/fundraising/demo-script.md +0 -52
  280. package/docs/fundraising/design-partners-50.md +0 -74
  281. package/docs/fundraising/launch-posts.md +0 -37
  282. package/docs/fundraising/metrics-and-evidence.md +0 -30
  283. package/docs/fundraising/roadmap-12-month.md +0 -25
  284. package/docs/fundraising/technical-due-diligence-index.md +0 -37
  285. package/docs/fundraising/yc-application.md +0 -25
  286. package/docs/hosted-pilot.md +0 -111
  287. package/docs/operations/disaster-recovery-runbook.md +0 -81
  288. package/docs/operations/kill-switch-runbook.md +0 -32
  289. package/docs/release-checklist.md +0 -83
  290. package/docs/release-migration-and-rollback.md +0 -63
  291. package/docs/release-readiness.md +0 -39
  292. package/docs/team-control-plane.md +0 -72
@@ -1,349 +1,1040 @@
1
- @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap');
2
-
3
- :root {
4
- --background: #09090b; /* zinc-950 */
5
- --foreground: #fafafa;
6
- --card: #09090b;
7
- --card-foreground: #fafafa;
8
- --popover: #09090b;
9
- --popover-foreground: #fafafa;
10
- --primary: #fafafa;
11
- --primary-foreground: #18181b;
12
- --secondary: #27272a;
13
- --secondary-foreground: #fafafa;
14
- --muted: #27272a;
15
- --muted-foreground: #a1a1aa; /* zinc-400 */
16
- --accent: #27272a;
17
- --accent-foreground: #fafafa;
18
- --border: rgba(255, 255, 255, 0.1);
19
- --input: #27272a;
20
- --ring: #d4d4d8;
21
-
22
- --radius: 0.5rem;
23
-
24
- --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
25
- --font-mono: 'JetBrains Mono', "Geist Mono", "Fira Code", monospace;
26
-
27
- --sys-green: #4ade80;
28
- --sys-blue: #60a5fa;
29
- --sys-red: #f87171;
30
- --sys-orange: #fbbf24;
31
- }
32
-
33
- * {
34
- box-sizing: border-box;
35
- margin: 0;
36
- padding: 0;
37
- }
38
-
39
- body {
40
- background-color: var(--background);
41
- color: var(--foreground);
42
- font-family: var(--font-sans);
43
- -webkit-font-smoothing: antialiased;
44
- font-size: 13px;
45
- overflow: hidden;
46
- }
47
-
48
- /* Layout Wrappers */
49
- .app-wrapper {
50
- display: flex;
51
- width: 100vw;
52
- height: 100vh;
53
- background: var(--background);
54
- }
55
-
56
- /* Sidebar */
57
- .sidebar {
58
- width: 260px;
59
- height: 100%;
60
- background-color: rgba(255, 255, 255, 0.02);
61
- border-right: 1px solid var(--border);
62
- padding: 12px;
63
- display: flex;
64
- flex-direction: column;
65
- flex-shrink: 0;
66
- transition: width 0.3s ease, opacity 0.3s ease;
67
- overflow: hidden;
68
- }
69
-
70
- .sidebar.closed {
71
- width: 0;
72
- padding-left: 0;
73
- padding-right: 0;
74
- opacity: 0;
75
- border-right: none;
76
- }
77
-
78
- /* Workspace Switcher */
79
- .ws-switcher {
80
- position: relative;
81
- margin-bottom: 24px;
82
- }
83
- .ws-btn {
84
- display: flex;
85
- align-items: center;
86
- justify-content: space-between;
87
- padding: 8px;
88
- border-radius: var(--radius);
89
- user-select: none;
90
- }
91
- .ws-btn-content { display: flex; align-items: center; gap: 12px; }
92
- .ws-avatar {
93
- width: 32px; height: 32px;
94
- border-radius: 6px;
95
- background: var(--primary);
96
- color: var(--primary-foreground);
97
- display: flex; align-items: center; justify-content: center;
98
- font-weight: 600; font-size: 13px;
99
- box-shadow: 0 1px 2px rgba(0,0,0,0.1);
100
- }
101
- .ws-info { display: flex; flex-direction: column; overflow: hidden; }
102
- .ws-title { font-size: 13px; font-weight: 500; line-height: 1; margin-bottom: 4px; color: var(--foreground); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 120px; }
103
- .ws-subtitle { font-size: 11px; color: var(--muted-foreground); line-height: 1; }
104
- .ws-icon { color: rgba(161, 161, 170, 0.5); width: 16px; height: 16px; transition: color 0.2s; }
105
- .ws-btn:hover .ws-icon { color: rgba(250, 250, 250, 0.7); }
106
-
107
- /* Sidebar Nav Groups */
108
- .nav-scroll-area {
109
- flex: 1;
110
- overflow-y: auto;
111
- display: flex;
112
- flex-direction: column;
113
- gap: 16px;
114
- margin-top: 8px;
115
- }
116
- .nav-scroll-area::-webkit-scrollbar { display: none; }
117
- .nav-group { display: flex; flex-direction: column; gap: 2px; }
118
- .nav-heading {
119
- padding: 0 10px; margin-bottom: 4px;
120
- font-size: 11px; font-weight: 600; letter-spacing: 0.05em;
121
- color: rgba(161, 161, 170, 0.5); text-transform: uppercase;
122
- }
123
-
124
- /* Nav Item */
125
- .nav-item {
126
- display: flex; align-items: center; justify-content: space-between;
127
- padding: 7px 10px;
128
- border-radius: 6px;
129
- cursor: pointer;
130
- transition: all 0.2s;
131
- user-select: none;
132
- color: var(--muted-foreground);
133
- }
134
- .nav-item:hover { color: rgba(250, 250, 250, 0.9); background: rgba(255, 255, 255, 0.05); }
135
- .nav-item.active { background: rgba(255, 255, 255, 0.1); color: var(--foreground); font-weight: 500; }
136
- .nav-item-left { display: flex; align-items: center; gap: 10px; }
137
- .nav-item-icon { width: 16px; height: 16px; color: rgba(161, 161, 170, 0.7); transition: color 0.2s; }
138
- .nav-item:hover .nav-item-icon { color: rgba(250, 250, 250, 0.7); }
139
- .nav-item.active .nav-item-icon { color: var(--foreground); }
140
- .nav-item-title { font-size: 13px; tracking-wide; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
141
- .nav-item-right { display: flex; align-items: center; gap: 8px; }
142
-
143
- /* Status Badge/Shortcuts injected via JS natively */
144
- .sc-badge { display: none; align-items: center; justify-content: center; height: 20px; padding: 0 6px; font-size: 10px; font-weight: 500; font-family: var(--font-mono); color: rgba(161, 161, 170, 0.6); background: rgba(0, 0, 0, 0.5); border: 1px solid var(--border); border-radius: 4px; }
145
- .nav-item:hover .sc-badge { display: flex; }
146
- .num-badge { display: flex; align-items: center; justify-content: center; min-width: 20px; height: 20px; padding: 0 6px; font-size: 10px; font-weight: 500; border-radius: 99px; background: rgba(250, 250, 250, 0.1); color: var(--primary); }
147
- .fault-toggle.active { color: #fef3c7; background: rgba(251, 191, 36, 0.1); }
148
- .fault-toggle.active .nav-item-icon { color: var(--sys-orange); }
149
- .fault-state { font-family: var(--font-mono); font-size: 10px; color: var(--muted-foreground); border: 1px solid var(--border); border-radius: 99px; padding: 2px 6px; }
150
- .fault-toggle.active .fault-state { color: var(--sys-orange); border-color: rgba(251, 191, 36, 0.25); background: rgba(251, 191, 36, 0.08); }
151
-
152
- .nav-bottom {
153
- margin-top: auto;
154
- padding-top: 16px;
155
- border-top: 1px solid var(--border);
156
- display: flex;
157
- flex-direction: column;
158
- gap: 2px;
159
- }
160
-
161
- /* Main Content Area */
162
- .main {
163
- flex: 1;
164
- display: flex;
165
- flex-direction: column;
166
- background: rgba(255, 255, 255, 0.01);
167
- min-width: 0;
168
- transition: all 0.3s;
169
- }
170
-
171
- /* Topbar */
172
- .topbar {
173
- height: 56px;
174
- border-bottom: 1px solid var(--border);
175
- display: flex;
176
- align-items: center;
177
- justify-content: space-between;
178
- padding: 0 16px;
179
- background: var(--card);
180
- flex-shrink: 0;
181
- }
182
- .topbar-left { display: flex; align-items: center; gap: 12px; }
183
- .toggle-btn {
184
- padding: 6px; border-radius: 6px; color: var(--muted-foreground); cursor: pointer; transition: all 0.2s; background: transparent; border: none; outline: none;
185
- }
186
- .toggle-btn:hover { background: rgba(255,255,255,0.05); color: var(--foreground); }
187
-
188
- .breadcrumb { display: flex; align-items: center; gap: 8px; font-size: 14px; color: var(--muted-foreground); }
189
- .breadcrumb-active { font-weight: 500; color: var(--foreground); }
190
-
191
- .topbar-right { display: flex; align-items: center; gap: 12px; }
192
- .status-indicator {
193
- display: flex; align-items: center; gap: 6px; padding: 4px 10px; border-radius: 6px; font-size: 12px; background: rgba(255,255,255,0.03); color: var(--muted-foreground); border: 1px solid var(--border);
194
- }
195
- .status-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--muted-foreground); }
196
- .status-indicator.connected .status-dot { background: var(--sys-green); box-shadow: 0 0 10px rgba(74, 222, 128, 0.4); }
197
- .status-indicator.connected { color: var(--foreground); }
198
-
199
- /* Main Split View: Event List (Left) + Event Details (Right) */
200
- .content-wrapper {
201
- flex: 1;
202
- display: flex;
203
- overflow: hidden;
204
- }
205
-
206
- /* Event List Pane */
207
- .event-list-pane {
208
- width: 340px;
209
- border-right: 1px solid var(--border);
210
- display: flex;
211
- flex-direction: column;
212
- background: var(--background);
213
- }
214
- .event-list-header {
215
- padding: 12px 16px;
216
- border-bottom: 1px solid var(--border);
217
- display: flex; justify-content: space-between; align-items: center;
218
- }
219
- .event-list-header h2 { font-size: 13px; font-weight: 600; color: var(--foreground); }
220
- .event-count { font-family: var(--font-mono); font-size: 11px; color: var(--muted-foreground); background: rgba(255,255,255,0.05); padding: 2px 6px; border-radius: 4px;}
221
-
222
- .events-scroll { flex: 1; overflow-y: auto; }
223
- .events-scroll::-webkit-scrollbar { display: none; }
224
-
225
- .event-card {
226
- padding: 12px 16px; border-bottom: 1px solid var(--border); cursor: pointer; transition: background 0.2s;
227
- }
228
- .event-card:hover { background: rgba(255,255,255,0.02); }
229
- .event-card.active { background: rgba(255,255,255,0.04); border-left: 2px solid var(--sys-blue); padding-left: 14px; }
230
-
231
- .ec-top { display: flex; align-items: center; justify-content: space-between; margin-bottom: 6px; }
232
- .ec-method { font-family: var(--font-mono); font-size: 11px; font-weight: 600; padding: 2px 6px; border-radius: 4px; background: rgba(255,255,255,0.05); color: var(--foreground);}
233
- .ec-time { font-size: 11px; color: var(--muted-foreground); }
234
- .ec-path { font-family: var(--font-mono); font-size: 12px; color: var(--foreground); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-bottom: 8px;}
235
- .ec-bottom { display: flex; align-items: center; gap: 8px; font-size: 11px; }
236
- .provider-pill { margin-left: auto; }
237
-
238
- .pill { padding: 2px 6px; border-radius: 4px; background: rgba(255,255,255,0.05); color: var(--muted-foreground); border: 1px solid var(--border); font-family: var(--font-mono); }
239
- .pill-status-200 { color: var(--sys-green); border-color: rgba(74, 222, 128, 0.2); background: rgba(74, 222, 128, 0.05); }
240
- .pill-status-400, .pill-status-500 { color: var(--sys-red); border-color: rgba(248, 113, 113, 0.2); background: rgba(248, 113, 113, 0.05); }
241
-
242
- /* Details Pane */
243
- .details-pane {
244
- flex: 1;
245
- display: flex;
246
- flex-direction: column;
247
- background: var(--background);
248
- min-width: 0;
249
- }
250
- .empty-view {
251
- flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; color: var(--muted-foreground); gap: 12px;
252
- }
253
- .empty-view svg { opacity: 0.3; }
254
-
255
- .details-content { flex: 1; display: flex; flex-direction: column; display: none; }
256
- .details-content.visible { display: flex; }
257
-
258
- .dep-header {
259
- padding: 16px 24px; border-bottom: 1px solid var(--border); display: flex; align-items: center; justify-content: space-between; background: rgba(255,255,255,0.01);
260
- }
261
- .dep-title { display: flex; align-items: center; gap: 12px; font-family: var(--font-mono); font-size: 14px; }
262
- .dep-badges { display: flex; gap: 8px; }
263
- .mini-action { border: 1px solid var(--border); background: rgba(255,255,255,0.04); color: var(--foreground); border-radius: 6px; padding: 3px 8px; font: 500 11px var(--font-sans); cursor: pointer; }
264
- .mini-action:hover { background: rgba(255,255,255,0.08); }
265
-
266
- .json-split {
267
- flex: 1; display: flex; overflow: hidden;
268
- }
269
- .json-pane {
270
- flex: 1; display: flex; flex-direction: column; border-right: 1px solid var(--border); min-width: 0;
271
- }
272
- .json-pane:last-child { border-right: none; }
273
-
274
- .json-header {
275
- padding: 8px 16px; border-bottom: 1px solid var(--border); display: flex; align-items: center; justify-content: space-between;
276
- font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; font-weight: 600; color: var(--muted-foreground); background: var(--background);
277
- }
278
- .json-body {
279
- flex: 1; overflow: auto; padding: 16px; background: rgba(255,255,255,0.01);
280
- }
281
- .json-body pre { font-family: var(--font-mono); font-size: 12px; line-height: 1.6; color: var(--foreground); white-space: pre-wrap; word-wrap: break-word; }
282
-
283
- /* Modal / Search */
284
- .modal-overlay {
285
- position: fixed; inset: 0; z-index: 50; display: none; align-items: flex-start; justify-content: center; padding: 12vh 16px 24px; background: rgba(0,0,0,0.4); backdrop-filter: blur(2px); overflow: auto;
286
- }
287
- .modal-overlay.open { display: flex; }
288
- .modal-content {
289
- position: relative; width: 100%; max-width: 600px; max-height: calc(100vh - 48px); background: var(--card); border: 1px solid var(--border); border-radius: 12px; box-shadow: 0 24px 48px rgba(0,0,0,0.4); overflow: hidden; animation: zoomIn 0.15s ease-out;
290
- }
291
- .modal-header {
292
- display: flex; align-items: center; padding: 0 16px; border-bottom: 1px solid var(--border);
293
- }
294
- .modal-header svg { color: var(--muted-foreground); margin-right: 12px; }
295
- .modal-input {
296
- flex: 1; background: transparent; border: none; padding: 16px 0; outline: none; font-size: 14px; color: var(--foreground); font-family: var(--font-sans);
297
- }
298
- .modal-input::placeholder { color: rgba(161, 161, 170, 0.5); }
299
- .modal-body { padding: 32px 16px; display: flex; flex-direction: column; align-items: center; justify-content: center; color: var(--muted-foreground); gap: 8px; }
300
- .rules-modal-content { max-width: 860px; }
301
- .rules-modal-header { gap: 12px; padding: 12px 16px; }
302
- .rules-title-block { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
303
- .rules-title-block strong { font-size: 13px; color: var(--foreground); }
304
- .rules-title-block span { font-size: 11px; color: var(--muted-foreground); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
305
- .modal-action { border: 1px solid rgba(250,250,250,0.16); background: rgba(250,250,250,0.92); color: #18181b; border-radius: 6px; padding: 6px 10px; font: 500 12px var(--font-sans); cursor: pointer; }
306
- .modal-action.ghost { background: rgba(255,255,255,0.04); color: var(--muted-foreground); }
307
- .modal-action:hover { filter: brightness(1.08); }
308
- .rules-body { max-height: 70vh; overflow: auto; padding: 16px; background: radial-gradient(circle at top left, rgba(96,165,250,0.08), transparent 28%), rgba(255,255,255,0.01); }
309
- .rules-body pre { font-family: var(--font-mono); font-size: 12px; line-height: 1.7; white-space: pre-wrap; color: var(--foreground); }
310
- .setup-modal-content { max-width: 980px; height: min(74vh, 680px); display: flex; flex-direction: column; }
311
- .setup-grid, .scenario-shell { display: grid; grid-template-columns: 300px minmax(0, 1fr); flex: 1 1 auto; min-height: 0; }
312
- .setup-list, .scenario-list { min-height: 0; border-right: 1px solid var(--border); overflow: auto; padding: 10px; background: rgba(255,255,255,0.01); }
313
- .setup-output, .scenario-output { min-height: 0; max-height: none; height: 100%; overflow: auto; }
314
- .setup-item { width: 100%; border: 1px solid transparent; background: transparent; color: var(--muted-foreground); border-radius: 8px; padding: 10px; text-align: left; cursor: pointer; display: flex; flex-direction: column; gap: 4px; }
315
- .setup-item:hover, .setup-item.active { background: rgba(255,255,255,0.05); border-color: var(--border); color: var(--foreground); }
316
- .setup-item strong { font: 600 12px var(--font-sans); color: inherit; }
317
- .setup-item span { font-size: 11px; line-height: 1.4; color: var(--muted-foreground); }
318
- .scenario-card { border: 1px solid var(--border); border-radius: 10px; padding: 12px; margin-bottom: 10px; background: rgba(255,255,255,0.02); }
319
- .scenario-card-top { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 8px; }
320
- .scenario-card strong { font-size: 13px; color: var(--foreground); }
321
- .scenario-card p { font-size: 12px; line-height: 1.5; color: var(--muted-foreground); margin-bottom: 12px; }
322
- .scenario-actions { display: flex; gap: 6px; }
323
- .scenario-actions button { flex: 1; border: 1px solid var(--border); background: rgba(255,255,255,0.04); color: var(--foreground); border-radius: 6px; padding: 6px; font: 500 11px var(--font-sans); cursor: pointer; }
324
- .scenario-actions button:hover { background: rgba(255,255,255,0.08); }
325
-
326
- @media (max-width: 900px) {
327
- .modal-overlay { padding-top: 24px; }
328
- .setup-grid, .scenario-shell { grid-template-columns: 1fr; grid-template-rows: minmax(0, 260px) minmax(0, 1fr); }
329
- .setup-list, .scenario-list { border-right: none; border-bottom: 1px solid var(--border); max-height: none; }
330
- }
331
-
332
- @media (max-height: 720px) {
333
- .setup-modal-content { height: calc(100vh - 48px); }
334
- }
335
-
336
- @keyframes zoomIn { from { opacity: 0; transform: scale(0.96); } to { opacity: 1; transform: scale(1); } }
337
-
338
- /* Method Colors */
339
- .m-get { color: var(--sys-blue); }
340
- .m-post { color: var(--sys-green); }
341
- .m-delete { color: var(--sys-red); }
342
- .m-put, .m-patch { color: var(--sys-orange); }
343
-
344
- /* Syntax Highlight */
345
- .j-key { color: #86efac; opacity: 0.9; }
346
- .j-str { color: #fca5a5; opacity: 0.9; }
347
- .j-num { color: #7dd3fc; opacity: 0.9; }
348
- .j-bool { color: #c4b5fd; opacity: 0.9; }
349
- .j-null { color: var(--muted-foreground); font-style: italic; }
1
+ :root {
2
+ --background: #09090b; /* zinc-950 */
3
+ --foreground: #fafafa;
4
+ --card: #09090b;
5
+ --card-foreground: #fafafa;
6
+ --popover: #09090b;
7
+ --popover-foreground: #fafafa;
8
+ --primary: #fafafa;
9
+ --primary-foreground: #18181b;
10
+ --secondary: #27272a;
11
+ --secondary-foreground: #fafafa;
12
+ --muted: #27272a;
13
+ --muted-foreground: #a1a1aa; /* zinc-400 */
14
+ --accent: #27272a;
15
+ --accent-foreground: #fafafa;
16
+ --border: rgba(255, 255, 255, 0.1);
17
+ --input: #27272a;
18
+ --ring: #d4d4d8;
19
+
20
+ --radius: 0.5rem;
21
+
22
+ --font-sans:
23
+ Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica,
24
+ Arial, sans-serif;
25
+ --font-mono: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
26
+
27
+ --sys-green: #4ade80;
28
+ --sys-blue: #60a5fa;
29
+ --sys-red: #f87171;
30
+ --sys-orange: #fbbf24;
31
+ }
32
+
33
+ * {
34
+ box-sizing: border-box;
35
+ margin: 0;
36
+ padding: 0;
37
+ }
38
+
39
+ body {
40
+ background-color: var(--background);
41
+ color: var(--foreground);
42
+ font-family: var(--font-sans);
43
+ -webkit-font-smoothing: antialiased;
44
+ font-size: 13px;
45
+ overflow: hidden;
46
+ }
47
+
48
+ /* Layout Wrappers */
49
+ .app-wrapper {
50
+ display: flex;
51
+ width: 100vw;
52
+ height: 100vh;
53
+ background: var(--background);
54
+ }
55
+
56
+ /* Sidebar */
57
+ .sidebar {
58
+ width: 260px;
59
+ height: 100%;
60
+ background-color: rgba(255, 255, 255, 0.02);
61
+ border-right: 1px solid var(--border);
62
+ padding: 12px;
63
+ display: flex;
64
+ flex-direction: column;
65
+ flex-shrink: 0;
66
+ transition:
67
+ width 0.3s ease,
68
+ opacity 0.3s ease;
69
+ overflow: hidden;
70
+ }
71
+
72
+ .sidebar.closed {
73
+ width: 0;
74
+ padding-left: 0;
75
+ padding-right: 0;
76
+ opacity: 0;
77
+ border-right: none;
78
+ }
79
+ .sidebar-backdrop {
80
+ display: none;
81
+ position: fixed;
82
+ inset: 0;
83
+ z-index: 30;
84
+ border: 0;
85
+ background: rgba(0, 0, 0, 0.58);
86
+ backdrop-filter: blur(2px);
87
+ }
88
+
89
+ /* Workspace Switcher */
90
+ .ws-switcher {
91
+ position: relative;
92
+ margin-bottom: 24px;
93
+ }
94
+ .ws-btn {
95
+ display: flex;
96
+ align-items: center;
97
+ justify-content: space-between;
98
+ padding: 8px;
99
+ border-radius: var(--radius);
100
+ user-select: none;
101
+ }
102
+ .ws-btn-content {
103
+ display: flex;
104
+ align-items: center;
105
+ gap: 12px;
106
+ }
107
+ .ws-avatar {
108
+ width: 32px;
109
+ height: 32px;
110
+ border-radius: 6px;
111
+ background: var(--primary);
112
+ color: var(--primary-foreground);
113
+ display: flex;
114
+ align-items: center;
115
+ justify-content: center;
116
+ font-weight: 600;
117
+ font-size: 13px;
118
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
119
+ }
120
+ .ws-info {
121
+ display: flex;
122
+ flex-direction: column;
123
+ overflow: hidden;
124
+ }
125
+ .ws-title {
126
+ font-size: 13px;
127
+ font-weight: 500;
128
+ line-height: 1;
129
+ margin-bottom: 4px;
130
+ color: var(--foreground);
131
+ white-space: nowrap;
132
+ overflow: hidden;
133
+ text-overflow: ellipsis;
134
+ max-width: 120px;
135
+ }
136
+ .ws-subtitle {
137
+ font-size: 11px;
138
+ color: var(--muted-foreground);
139
+ line-height: 1;
140
+ }
141
+ .ws-icon {
142
+ color: rgba(161, 161, 170, 0.5);
143
+ width: 16px;
144
+ height: 16px;
145
+ transition: color 0.2s;
146
+ }
147
+ .ws-btn:hover .ws-icon {
148
+ color: rgba(250, 250, 250, 0.7);
149
+ }
150
+
151
+ /* Sidebar Nav Groups */
152
+ .nav-scroll-area {
153
+ flex: 1;
154
+ overflow-y: auto;
155
+ display: flex;
156
+ flex-direction: column;
157
+ gap: 16px;
158
+ margin-top: 8px;
159
+ }
160
+ .nav-scroll-area::-webkit-scrollbar {
161
+ display: none;
162
+ }
163
+ .nav-group {
164
+ display: flex;
165
+ flex-direction: column;
166
+ gap: 2px;
167
+ }
168
+ .nav-heading {
169
+ padding: 0 10px;
170
+ margin-bottom: 4px;
171
+ font-size: 11px;
172
+ font-weight: 600;
173
+ letter-spacing: 0.05em;
174
+ color: rgba(161, 161, 170, 0.5);
175
+ text-transform: uppercase;
176
+ }
177
+
178
+ /* Nav Item */
179
+ .nav-item {
180
+ display: flex;
181
+ align-items: center;
182
+ justify-content: space-between;
183
+ padding: 7px 10px;
184
+ border-radius: 6px;
185
+ cursor: pointer;
186
+ transition: all 0.2s;
187
+ user-select: none;
188
+ color: var(--muted-foreground);
189
+ }
190
+ .nav-item:hover {
191
+ color: rgba(250, 250, 250, 0.9);
192
+ background: rgba(255, 255, 255, 0.05);
193
+ }
194
+ .nav-item.active {
195
+ background: rgba(255, 255, 255, 0.1);
196
+ color: var(--foreground);
197
+ font-weight: 500;
198
+ }
199
+ .nav-item-left {
200
+ display: flex;
201
+ align-items: center;
202
+ gap: 10px;
203
+ }
204
+ .nav-item-icon {
205
+ width: 16px;
206
+ height: 16px;
207
+ color: rgba(161, 161, 170, 0.7);
208
+ transition: color 0.2s;
209
+ }
210
+ .nav-item:hover .nav-item-icon {
211
+ color: rgba(250, 250, 250, 0.7);
212
+ }
213
+ .nav-item.active .nav-item-icon {
214
+ color: var(--foreground);
215
+ }
216
+ .nav-item-title {
217
+ font-size: 13px;
218
+ letter-spacing: 0.01em;
219
+ white-space: nowrap;
220
+ overflow: hidden;
221
+ text-overflow: ellipsis;
222
+ }
223
+ .nav-item-right {
224
+ display: flex;
225
+ align-items: center;
226
+ gap: 8px;
227
+ }
228
+
229
+ /* Status Badge/Shortcuts injected via JS natively */
230
+ .sc-badge {
231
+ display: none;
232
+ align-items: center;
233
+ justify-content: center;
234
+ height: 20px;
235
+ padding: 0 6px;
236
+ font-size: 10px;
237
+ font-weight: 500;
238
+ font-family: var(--font-mono);
239
+ color: rgba(161, 161, 170, 0.6);
240
+ background: rgba(0, 0, 0, 0.5);
241
+ border: 1px solid var(--border);
242
+ border-radius: 4px;
243
+ }
244
+ .nav-item:hover .sc-badge {
245
+ display: flex;
246
+ }
247
+ .num-badge {
248
+ display: flex;
249
+ align-items: center;
250
+ justify-content: center;
251
+ min-width: 20px;
252
+ height: 20px;
253
+ padding: 0 6px;
254
+ font-size: 10px;
255
+ font-weight: 500;
256
+ border-radius: 99px;
257
+ background: rgba(250, 250, 250, 0.1);
258
+ color: var(--primary);
259
+ }
260
+ .fault-toggle.active {
261
+ color: #fef3c7;
262
+ background: rgba(251, 191, 36, 0.1);
263
+ }
264
+ .fault-toggle.active .nav-item-icon {
265
+ color: var(--sys-orange);
266
+ }
267
+ .fault-state {
268
+ font-family: var(--font-mono);
269
+ font-size: 10px;
270
+ color: var(--muted-foreground);
271
+ border: 1px solid var(--border);
272
+ border-radius: 99px;
273
+ padding: 2px 6px;
274
+ }
275
+ .fault-toggle.active .fault-state {
276
+ color: var(--sys-orange);
277
+ border-color: rgba(251, 191, 36, 0.25);
278
+ background: rgba(251, 191, 36, 0.08);
279
+ }
280
+
281
+ .nav-bottom {
282
+ margin-top: auto;
283
+ padding-top: 16px;
284
+ border-top: 1px solid var(--border);
285
+ display: flex;
286
+ flex-direction: column;
287
+ gap: 2px;
288
+ }
289
+
290
+ /* Main Content Area */
291
+ .main {
292
+ flex: 1;
293
+ display: flex;
294
+ flex-direction: column;
295
+ background: rgba(255, 255, 255, 0.01);
296
+ min-width: 0;
297
+ transition: all 0.3s;
298
+ }
299
+
300
+ /* Topbar */
301
+ .topbar {
302
+ height: 56px;
303
+ border-bottom: 1px solid var(--border);
304
+ display: grid;
305
+ grid-template-columns: minmax(44px, 1fr) auto minmax(44px, 1fr);
306
+ align-items: center;
307
+ padding: 0 16px;
308
+ background: var(--card);
309
+ flex-shrink: 0;
310
+ }
311
+ .topbar-left {
312
+ display: flex;
313
+ align-items: center;
314
+ gap: 12px;
315
+ grid-column: 1;
316
+ justify-self: start;
317
+ }
318
+ .toggle-btn {
319
+ padding: 6px;
320
+ border-radius: 6px;
321
+ color: var(--muted-foreground);
322
+ cursor: pointer;
323
+ transition: all 0.2s;
324
+ background: transparent;
325
+ border: none;
326
+ outline: none;
327
+ }
328
+ .toggle-btn:hover {
329
+ background: rgba(255, 255, 255, 0.05);
330
+ color: var(--foreground);
331
+ }
332
+
333
+ .breadcrumb {
334
+ display: flex;
335
+ align-items: center;
336
+ gap: 8px;
337
+ font-size: 14px;
338
+ color: var(--muted-foreground);
339
+ }
340
+ .topbar-center {
341
+ position: fixed;
342
+ top: 0;
343
+ left: 50%;
344
+ z-index: 5;
345
+ height: 56px;
346
+ transform: translateX(-50%);
347
+ min-width: 0;
348
+ }
349
+ .brand-lockup {
350
+ display: inline-flex;
351
+ align-items: center;
352
+ gap: 8px;
353
+ color: var(--foreground);
354
+ }
355
+ .brand-lockup strong {
356
+ font-size: 14px;
357
+ font-weight: 650;
358
+ letter-spacing: -0.01em;
359
+ }
360
+ .topbar-brand-icon {
361
+ width: 22px;
362
+ height: 22px;
363
+ border-radius: 6px;
364
+ object-fit: cover;
365
+ }
366
+ .breadcrumb-divider {
367
+ color: rgba(161, 161, 170, 0.42);
368
+ }
369
+ .breadcrumb-active {
370
+ font-weight: 500;
371
+ color: var(--foreground);
372
+ }
373
+
374
+ .topbar-right {
375
+ display: flex;
376
+ align-items: center;
377
+ gap: 12px;
378
+ grid-column: 3;
379
+ justify-self: end;
380
+ }
381
+ .status-indicator {
382
+ display: flex;
383
+ align-items: center;
384
+ gap: 6px;
385
+ padding: 4px 10px;
386
+ border-radius: 6px;
387
+ font-size: 12px;
388
+ background: rgba(255, 255, 255, 0.03);
389
+ color: var(--muted-foreground);
390
+ border: 1px solid var(--border);
391
+ }
392
+ .status-dot {
393
+ width: 8px;
394
+ height: 8px;
395
+ border-radius: 50%;
396
+ background: var(--muted-foreground);
397
+ }
398
+ .status-indicator.connected .status-dot {
399
+ background: var(--sys-green);
400
+ box-shadow: 0 0 10px rgba(74, 222, 128, 0.4);
401
+ }
402
+ .status-indicator.connected {
403
+ color: var(--foreground);
404
+ }
405
+
406
+ /* Main Split View: Event List (Left) + Event Details (Right) */
407
+ .content-wrapper {
408
+ flex: 1;
409
+ display: flex;
410
+ overflow: hidden;
411
+ }
412
+
413
+ /* Event List Pane */
414
+ .event-list-pane {
415
+ width: 340px;
416
+ border-right: 1px solid var(--border);
417
+ display: flex;
418
+ flex-direction: column;
419
+ background: var(--background);
420
+ }
421
+ .event-list-header {
422
+ padding: 12px 16px;
423
+ border-bottom: 1px solid var(--border);
424
+ display: flex;
425
+ justify-content: space-between;
426
+ align-items: center;
427
+ }
428
+ .event-list-header h2 {
429
+ font-size: 13px;
430
+ font-weight: 600;
431
+ color: var(--foreground);
432
+ }
433
+ .event-count {
434
+ font-family: var(--font-mono);
435
+ font-size: 11px;
436
+ color: var(--muted-foreground);
437
+ background: rgba(255, 255, 255, 0.05);
438
+ padding: 2px 6px;
439
+ border-radius: 4px;
440
+ }
441
+
442
+ .events-scroll {
443
+ flex: 1;
444
+ overflow-y: auto;
445
+ }
446
+ .events-scroll::-webkit-scrollbar {
447
+ display: none;
448
+ }
449
+
450
+ .event-card {
451
+ padding: 12px 16px;
452
+ border-bottom: 1px solid var(--border);
453
+ cursor: pointer;
454
+ transition: background 0.2s;
455
+ }
456
+ .event-card:hover {
457
+ background: rgba(255, 255, 255, 0.02);
458
+ }
459
+ .event-card.active {
460
+ background: rgba(255, 255, 255, 0.04);
461
+ border-left: 2px solid var(--sys-blue);
462
+ padding-left: 14px;
463
+ }
464
+
465
+ .ec-top {
466
+ display: flex;
467
+ align-items: center;
468
+ justify-content: space-between;
469
+ margin-bottom: 6px;
470
+ }
471
+ .ec-method {
472
+ font-family: var(--font-mono);
473
+ font-size: 11px;
474
+ font-weight: 600;
475
+ padding: 2px 6px;
476
+ border-radius: 4px;
477
+ background: rgba(255, 255, 255, 0.05);
478
+ color: var(--foreground);
479
+ }
480
+ .ec-time {
481
+ font-size: 11px;
482
+ color: var(--muted-foreground);
483
+ }
484
+ .ec-path {
485
+ font-family: var(--font-mono);
486
+ font-size: 12px;
487
+ color: var(--foreground);
488
+ white-space: nowrap;
489
+ overflow: hidden;
490
+ text-overflow: ellipsis;
491
+ margin-bottom: 8px;
492
+ }
493
+ .ec-bottom {
494
+ display: flex;
495
+ align-items: center;
496
+ gap: 8px;
497
+ font-size: 11px;
498
+ }
499
+ .provider-pill {
500
+ margin-left: auto;
501
+ }
502
+
503
+ .pill {
504
+ padding: 2px 6px;
505
+ border-radius: 4px;
506
+ background: rgba(255, 255, 255, 0.05);
507
+ color: var(--muted-foreground);
508
+ border: 1px solid var(--border);
509
+ font-family: var(--font-mono);
510
+ }
511
+ .pill-status-200 {
512
+ color: var(--sys-green);
513
+ border-color: rgba(74, 222, 128, 0.2);
514
+ background: rgba(74, 222, 128, 0.05);
515
+ }
516
+ .pill-status-400,
517
+ .pill-status-500 {
518
+ color: var(--sys-red);
519
+ border-color: rgba(248, 113, 113, 0.2);
520
+ background: rgba(248, 113, 113, 0.05);
521
+ }
522
+
523
+ /* Details Pane */
524
+ .details-pane {
525
+ flex: 1;
526
+ display: flex;
527
+ flex-direction: column;
528
+ background: var(--background);
529
+ min-width: 0;
530
+ }
531
+ .empty-view {
532
+ flex: 1;
533
+ display: flex;
534
+ flex-direction: column;
535
+ align-items: center;
536
+ justify-content: center;
537
+ color: var(--muted-foreground);
538
+ gap: 12px;
539
+ }
540
+ .empty-view svg {
541
+ opacity: 0.3;
542
+ }
543
+
544
+ .details-content {
545
+ flex: 1;
546
+ display: flex;
547
+ flex-direction: column;
548
+ display: none;
549
+ }
550
+ .details-content.visible {
551
+ display: flex;
552
+ }
553
+
554
+ .dep-header {
555
+ padding: 16px 24px;
556
+ border-bottom: 1px solid var(--border);
557
+ display: flex;
558
+ align-items: center;
559
+ justify-content: space-between;
560
+ background: rgba(255, 255, 255, 0.01);
561
+ }
562
+ .dep-title {
563
+ display: flex;
564
+ align-items: center;
565
+ gap: 12px;
566
+ font-family: var(--font-mono);
567
+ font-size: 14px;
568
+ }
569
+ .dep-badges {
570
+ display: flex;
571
+ gap: 8px;
572
+ }
573
+ .mini-action {
574
+ border: 1px solid var(--border);
575
+ background: rgba(255, 255, 255, 0.04);
576
+ color: var(--foreground);
577
+ border-radius: 6px;
578
+ padding: 3px 8px;
579
+ font: 500 11px var(--font-sans);
580
+ cursor: pointer;
581
+ }
582
+ .mini-action:hover {
583
+ background: rgba(255, 255, 255, 0.08);
584
+ }
585
+
586
+ .json-split {
587
+ flex: 1;
588
+ display: flex;
589
+ overflow: hidden;
590
+ }
591
+ .json-pane {
592
+ flex: 1;
593
+ display: flex;
594
+ flex-direction: column;
595
+ border-right: 1px solid var(--border);
596
+ min-width: 0;
597
+ }
598
+ .json-pane:last-child {
599
+ border-right: none;
600
+ }
601
+
602
+ .json-header {
603
+ padding: 8px 16px;
604
+ border-bottom: 1px solid var(--border);
605
+ display: flex;
606
+ align-items: center;
607
+ justify-content: space-between;
608
+ font-size: 11px;
609
+ text-transform: uppercase;
610
+ letter-spacing: 0.05em;
611
+ font-weight: 600;
612
+ color: var(--muted-foreground);
613
+ background: var(--background);
614
+ }
615
+ .json-body {
616
+ flex: 1;
617
+ overflow: auto;
618
+ padding: 16px;
619
+ background: rgba(255, 255, 255, 0.01);
620
+ }
621
+ .json-body pre {
622
+ font-family: var(--font-mono);
623
+ font-size: 12px;
624
+ line-height: 1.6;
625
+ color: var(--foreground);
626
+ white-space: pre-wrap;
627
+ word-wrap: break-word;
628
+ }
629
+
630
+ /* Modal / Search */
631
+ .modal-overlay {
632
+ position: fixed;
633
+ inset: 0;
634
+ z-index: 50;
635
+ display: none;
636
+ align-items: flex-start;
637
+ justify-content: center;
638
+ padding: 12vh 16px 24px;
639
+ background: rgba(0, 0, 0, 0.4);
640
+ backdrop-filter: blur(2px);
641
+ overflow: auto;
642
+ }
643
+ .modal-overlay.open {
644
+ display: flex;
645
+ }
646
+ .modal-content {
647
+ position: relative;
648
+ width: 100%;
649
+ max-width: 600px;
650
+ max-height: calc(100vh - 48px);
651
+ background: var(--card);
652
+ border: 1px solid var(--border);
653
+ border-radius: 12px;
654
+ box-shadow: 0 24px 48px rgba(0, 0, 0, 0.4);
655
+ overflow: hidden;
656
+ animation: zoomIn 0.15s ease-out;
657
+ }
658
+ .modal-header {
659
+ display: flex;
660
+ align-items: center;
661
+ padding: 0 16px;
662
+ border-bottom: 1px solid var(--border);
663
+ }
664
+ .modal-header svg {
665
+ color: var(--muted-foreground);
666
+ margin-right: 12px;
667
+ }
668
+ .modal-input {
669
+ flex: 1;
670
+ background: transparent;
671
+ border: none;
672
+ padding: 16px 0;
673
+ outline: none;
674
+ font-size: 14px;
675
+ color: var(--foreground);
676
+ font-family: var(--font-sans);
677
+ }
678
+ .modal-input::placeholder {
679
+ color: rgba(161, 161, 170, 0.5);
680
+ }
681
+ .modal-body {
682
+ padding: 32px 16px;
683
+ display: flex;
684
+ flex-direction: column;
685
+ align-items: center;
686
+ justify-content: center;
687
+ color: var(--muted-foreground);
688
+ gap: 8px;
689
+ }
690
+ .rules-modal-content {
691
+ max-width: 860px;
692
+ }
693
+ .rules-modal-header {
694
+ gap: 12px;
695
+ padding: 12px 16px;
696
+ }
697
+ .rules-title-block {
698
+ flex: 1;
699
+ min-width: 0;
700
+ display: flex;
701
+ flex-direction: column;
702
+ gap: 3px;
703
+ }
704
+ .rules-title-block strong {
705
+ font-size: 13px;
706
+ color: var(--foreground);
707
+ }
708
+ .rules-title-block span {
709
+ font-size: 11px;
710
+ color: var(--muted-foreground);
711
+ white-space: nowrap;
712
+ overflow: hidden;
713
+ text-overflow: ellipsis;
714
+ }
715
+ .modal-action {
716
+ border: 1px solid rgba(250, 250, 250, 0.16);
717
+ background: rgba(250, 250, 250, 0.92);
718
+ color: #18181b;
719
+ border-radius: 6px;
720
+ padding: 6px 10px;
721
+ font: 500 12px var(--font-sans);
722
+ cursor: pointer;
723
+ }
724
+ .modal-action.ghost {
725
+ background: rgba(255, 255, 255, 0.04);
726
+ color: var(--muted-foreground);
727
+ }
728
+ .modal-action:hover {
729
+ filter: brightness(1.08);
730
+ }
731
+ .rules-body {
732
+ max-height: 70vh;
733
+ overflow: auto;
734
+ padding: 16px;
735
+ background:
736
+ radial-gradient(
737
+ circle at top left,
738
+ rgba(96, 165, 250, 0.08),
739
+ transparent 28%
740
+ ),
741
+ rgba(255, 255, 255, 0.01);
742
+ }
743
+ .rules-body pre {
744
+ font-family: var(--font-mono);
745
+ font-size: 12px;
746
+ line-height: 1.7;
747
+ white-space: pre-wrap;
748
+ color: var(--foreground);
749
+ }
750
+ .setup-modal-content {
751
+ max-width: 980px;
752
+ height: min(74vh, 680px);
753
+ display: flex;
754
+ flex-direction: column;
755
+ }
756
+ .setup-grid,
757
+ .scenario-shell {
758
+ display: grid;
759
+ grid-template-columns: 300px minmax(0, 1fr);
760
+ flex: 1 1 auto;
761
+ min-height: 0;
762
+ }
763
+ .setup-list,
764
+ .scenario-list {
765
+ min-height: 0;
766
+ border-right: 1px solid var(--border);
767
+ overflow: auto;
768
+ padding: 10px;
769
+ background: rgba(255, 255, 255, 0.01);
770
+ }
771
+ .setup-output,
772
+ .scenario-output {
773
+ min-height: 0;
774
+ max-height: none;
775
+ height: 100%;
776
+ overflow: auto;
777
+ }
778
+ .setup-item {
779
+ width: 100%;
780
+ border: 1px solid transparent;
781
+ background: transparent;
782
+ color: var(--muted-foreground);
783
+ border-radius: 8px;
784
+ padding: 10px;
785
+ text-align: left;
786
+ cursor: pointer;
787
+ display: flex;
788
+ flex-direction: column;
789
+ gap: 4px;
790
+ }
791
+ .setup-item:hover,
792
+ .setup-item.active {
793
+ background: rgba(255, 255, 255, 0.05);
794
+ border-color: var(--border);
795
+ color: var(--foreground);
796
+ }
797
+ .setup-item strong {
798
+ font: 600 12px var(--font-sans);
799
+ color: inherit;
800
+ }
801
+ .setup-item span {
802
+ font-size: 11px;
803
+ line-height: 1.4;
804
+ color: var(--muted-foreground);
805
+ }
806
+ .scenario-card {
807
+ border: 1px solid var(--border);
808
+ border-radius: 10px;
809
+ padding: 12px;
810
+ margin-bottom: 10px;
811
+ background: rgba(255, 255, 255, 0.02);
812
+ }
813
+ .scenario-card-top {
814
+ display: flex;
815
+ align-items: center;
816
+ justify-content: space-between;
817
+ gap: 8px;
818
+ margin-bottom: 8px;
819
+ }
820
+ .scenario-card strong {
821
+ font-size: 13px;
822
+ color: var(--foreground);
823
+ }
824
+ .scenario-card p {
825
+ font-size: 12px;
826
+ line-height: 1.5;
827
+ color: var(--muted-foreground);
828
+ margin-bottom: 12px;
829
+ }
830
+ .scenario-actions {
831
+ display: flex;
832
+ gap: 6px;
833
+ }
834
+ .scenario-actions button {
835
+ flex: 1;
836
+ border: 1px solid var(--border);
837
+ background: rgba(255, 255, 255, 0.04);
838
+ color: var(--foreground);
839
+ border-radius: 6px;
840
+ padding: 6px;
841
+ font: 500 11px var(--font-sans);
842
+ cursor: pointer;
843
+ }
844
+ .scenario-actions button:hover {
845
+ background: rgba(255, 255, 255, 0.08);
846
+ }
847
+
848
+ @media (max-width: 900px) {
849
+ .modal-overlay {
850
+ padding-top: 24px;
851
+ }
852
+ .setup-grid,
853
+ .scenario-shell {
854
+ grid-template-columns: 1fr;
855
+ grid-template-rows: minmax(0, 260px) minmax(0, 1fr);
856
+ }
857
+ .setup-list,
858
+ .scenario-list {
859
+ border-right: none;
860
+ border-bottom: 1px solid var(--border);
861
+ max-height: none;
862
+ }
863
+ }
864
+
865
+ @media (max-width: 760px) {
866
+ .sidebar {
867
+ position: fixed;
868
+ inset: 0 auto 0 0;
869
+ z-index: 40;
870
+ width: min(84vw, 300px);
871
+ transform: translateX(-100%);
872
+ opacity: 0;
873
+ pointer-events: none;
874
+ border-right: 1px solid rgba(255, 255, 255, 0.14);
875
+ background: #0d0d10;
876
+ box-shadow: 24px 0 64px rgba(0, 0, 0, 0.42);
877
+ transition:
878
+ transform 0.22s ease,
879
+ opacity 0.22s ease;
880
+ }
881
+ .sidebar.closed {
882
+ width: min(84vw, 300px);
883
+ padding: 12px;
884
+ opacity: 0;
885
+ border-right: 1px solid rgba(255, 255, 255, 0.14);
886
+ }
887
+ .sidebar.mobile-open {
888
+ transform: translateX(0);
889
+ opacity: 1;
890
+ pointer-events: auto;
891
+ }
892
+ .sidebar-backdrop.open {
893
+ display: block;
894
+ }
895
+ .topbar {
896
+ height: 52px;
897
+ padding: 0 12px;
898
+ grid-template-columns: 36px minmax(0, 1fr) 36px;
899
+ }
900
+ .topbar-center {
901
+ height: 52px;
902
+ max-width: 100%;
903
+ gap: 6px;
904
+ }
905
+ .breadcrumb-active {
906
+ max-width: 32vw;
907
+ overflow: hidden;
908
+ text-overflow: ellipsis;
909
+ white-space: nowrap;
910
+ }
911
+ .status-indicator {
912
+ padding: 5px;
913
+ border-radius: 50%;
914
+ }
915
+ #status-text {
916
+ display: none;
917
+ }
918
+ .content-wrapper {
919
+ flex-direction: column;
920
+ }
921
+ .event-list-pane {
922
+ width: 100%;
923
+ height: 42%;
924
+ min-height: 210px;
925
+ border-right: none;
926
+ border-bottom: 1px solid var(--border);
927
+ }
928
+ .details-pane {
929
+ min-height: 0;
930
+ }
931
+ .dep-header {
932
+ align-items: flex-start;
933
+ flex-direction: column;
934
+ gap: 12px;
935
+ padding: 12px 16px;
936
+ }
937
+ .dep-title {
938
+ width: 100%;
939
+ overflow: hidden;
940
+ }
941
+ .dep-title > span:last-child {
942
+ overflow: hidden;
943
+ text-overflow: ellipsis;
944
+ white-space: nowrap;
945
+ }
946
+ .dep-badges {
947
+ width: 100%;
948
+ flex-wrap: wrap;
949
+ }
950
+ .json-split {
951
+ flex-direction: column;
952
+ overflow: auto;
953
+ }
954
+ .json-pane {
955
+ min-height: 230px;
956
+ border-right: none;
957
+ border-bottom: 1px solid var(--border);
958
+ }
959
+ .json-pane:last-child {
960
+ border-bottom: none;
961
+ }
962
+ .rules-modal-header {
963
+ flex-wrap: wrap;
964
+ }
965
+ }
966
+
967
+ @media (max-width: 420px) {
968
+ .brand-lockup strong {
969
+ font-size: 13px;
970
+ }
971
+ .topbar-brand-icon {
972
+ width: 19px;
973
+ height: 19px;
974
+ }
975
+ .breadcrumb-divider,
976
+ .breadcrumb-active {
977
+ font-size: 12px;
978
+ }
979
+ .event-list-pane {
980
+ height: 46%;
981
+ min-height: 190px;
982
+ }
983
+ .event-card {
984
+ padding: 10px 12px;
985
+ }
986
+ }
987
+
988
+ @media (max-height: 720px) {
989
+ .setup-modal-content {
990
+ height: calc(100vh - 48px);
991
+ }
992
+ }
993
+
994
+ @keyframes zoomIn {
995
+ from {
996
+ opacity: 0;
997
+ transform: scale(0.96);
998
+ }
999
+ to {
1000
+ opacity: 1;
1001
+ transform: scale(1);
1002
+ }
1003
+ }
1004
+
1005
+ /* Method Colors */
1006
+ .m-get {
1007
+ color: var(--sys-blue);
1008
+ }
1009
+ .m-post {
1010
+ color: var(--sys-green);
1011
+ }
1012
+ .m-delete {
1013
+ color: var(--sys-red);
1014
+ }
1015
+ .m-put,
1016
+ .m-patch {
1017
+ color: var(--sys-orange);
1018
+ }
1019
+
1020
+ /* Syntax Highlight */
1021
+ .j-key {
1022
+ color: #86efac;
1023
+ opacity: 0.9;
1024
+ }
1025
+ .j-str {
1026
+ color: #fca5a5;
1027
+ opacity: 0.9;
1028
+ }
1029
+ .j-num {
1030
+ color: #7dd3fc;
1031
+ opacity: 0.9;
1032
+ }
1033
+ .j-bool {
1034
+ color: #c4b5fd;
1035
+ opacity: 0.9;
1036
+ }
1037
+ .j-null {
1038
+ color: var(--muted-foreground);
1039
+ font-style: italic;
1040
+ }