databricks-agentbricks 0.2.0__py3-none-any.whl

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 (159) hide show
  1. databricks_agentbricks/__init__.py +1 -0
  2. databricks_agentbricks/_group.py +217 -0
  3. databricks_agentbricks/agent_project.py +657 -0
  4. databricks_agentbricks/app_resources.py +139 -0
  5. databricks_agentbricks/cli/__init__.py +12 -0
  6. databricks_agentbricks/cli/app.py +108 -0
  7. databricks_agentbricks/cli/app_auth.py +198 -0
  8. databricks_agentbricks/cli/auth.py +142 -0
  9. databricks_agentbricks/cli/deploy.py +954 -0
  10. databricks_agentbricks/cli/dev.py +310 -0
  11. databricks_agentbricks/cli/endpoint.py +145 -0
  12. databricks_agentbricks/cli/endpoint_examples.py +33 -0
  13. databricks_agentbricks/cli/endpoint_output.py +53 -0
  14. databricks_agentbricks/cli/endpoint_request.py +71 -0
  15. databricks_agentbricks/cli/endpoint_transport.py +148 -0
  16. databricks_agentbricks/cli/help.py +467 -0
  17. databricks_agentbricks/cli/init.py +496 -0
  18. databricks_agentbricks/cli/mcp.py +75 -0
  19. databricks_agentbricks/cli/memory.py +520 -0
  20. databricks_agentbricks/cli/sandbox.py +823 -0
  21. databricks_agentbricks/cli/sessions.py +588 -0
  22. databricks_agentbricks/cli/tools.py +456 -0
  23. databricks_agentbricks/cli/tracing.py +724 -0
  24. databricks_agentbricks/databricks_cli.py +38 -0
  25. databricks_agentbricks/errors.py +114 -0
  26. databricks_agentbricks/lakebase_runtime_store.py +107 -0
  27. databricks_agentbricks/legacy_lakebase_runtime_store.py +74 -0
  28. databricks_agentbricks/project_config.py +157 -0
  29. databricks_agentbricks/project_types.py +55 -0
  30. databricks_agentbricks/py.typed +0 -0
  31. databricks_agentbricks/render.py +349 -0
  32. databricks_agentbricks/templates/agent-bricks-migrate/SKILL.md +101 -0
  33. databricks_agentbricks/templates/agent-langgraph/.env.example +36 -0
  34. databricks_agentbricks/templates/agent-langgraph/.gitignore +199 -0
  35. databricks_agentbricks/templates/agent-langgraph/AGENTKIT_CONTRACT.md +95 -0
  36. databricks_agentbricks/templates/agent-langgraph/AGENTS.md +31 -0
  37. databricks_agentbricks/templates/agent-langgraph/CLAUDE.md +1 -0
  38. databricks_agentbricks/templates/agent-langgraph/README.md +141 -0
  39. databricks_agentbricks/templates/agent-langgraph/agent/__init__.py +0 -0
  40. databricks_agentbricks/templates/agent-langgraph/agent/agent.py +177 -0
  41. databricks_agentbricks/templates/agent-langgraph/agent/mcps.py +27 -0
  42. databricks_agentbricks/templates/agent-langgraph/agent/tools/__init__.py +24 -0
  43. databricks_agentbricks/templates/agent-langgraph/agent/tools/sample_tool.py +15 -0
  44. databricks_agentbricks/templates/agent-langgraph/agent/tools/send_message.py +17 -0
  45. databricks_agentbricks/templates/agent-langgraph/app.yaml +15 -0
  46. databricks_agentbricks/templates/agent-langgraph/pyproject.toml +42 -0
  47. databricks_agentbricks/templates/agent-langgraph/runtime/__init__.py +0 -0
  48. databricks_agentbricks/templates/agent-langgraph/runtime/adapter.py +144 -0
  49. databricks_agentbricks/templates/agent-langgraph/runtime/main.py +25 -0
  50. databricks_agentbricks/templates/agent-langgraph/tests/__init__.py +0 -0
  51. databricks_agentbricks/templates/agent-langgraph/tests/test_agent.py +211 -0
  52. databricks_agentbricks/templates/agent-langgraph/tests/test_runtime.py +19 -0
  53. databricks_agentbricks/templates/agent-langgraph/tests/test_workspace.py +28 -0
  54. databricks_agentbricks/templates/agent-openai/.env.example +37 -0
  55. databricks_agentbricks/templates/agent-openai/.gitignore +199 -0
  56. databricks_agentbricks/templates/agent-openai/AGENTKIT_CONTRACT.md +107 -0
  57. databricks_agentbricks/templates/agent-openai/AGENTS.md +76 -0
  58. databricks_agentbricks/templates/agent-openai/CLAUDE.md +1 -0
  59. databricks_agentbricks/templates/agent-openai/README.md +143 -0
  60. databricks_agentbricks/templates/agent-openai/agent/__init__.py +0 -0
  61. databricks_agentbricks/templates/agent-openai/agent/agent.py +205 -0
  62. databricks_agentbricks/templates/agent-openai/agent/mcps.py +28 -0
  63. databricks_agentbricks/templates/agent-openai/agent/tools/__init__.py +24 -0
  64. databricks_agentbricks/templates/agent-openai/agent/tools/sample_tool.py +15 -0
  65. databricks_agentbricks/templates/agent-openai/agent/tools/send_message.py +18 -0
  66. databricks_agentbricks/templates/agent-openai/app.yaml +15 -0
  67. databricks_agentbricks/templates/agent-openai/pyproject.toml +42 -0
  68. databricks_agentbricks/templates/agent-openai/runtime/__init__.py +0 -0
  69. databricks_agentbricks/templates/agent-openai/runtime/adapter.py +188 -0
  70. databricks_agentbricks/templates/agent-openai/runtime/main.py +25 -0
  71. databricks_agentbricks/templates/agent-openai/tests/__init__.py +0 -0
  72. databricks_agentbricks/templates/agent-openai/tests/test_agent.py +326 -0
  73. databricks_agentbricks/templates/agent-openai/tests/test_runtime.py +19 -0
  74. databricks_agentbricks/templates/agent-openai/tests/test_workspace.py +28 -0
  75. databricks_agentbricks/templates/custom-agent-langgraph/.env.example +1 -0
  76. databricks_agentbricks/templates/custom-agent-langgraph/.gitignore +11 -0
  77. databricks_agentbricks/templates/custom-agent-langgraph/README.md +22 -0
  78. databricks_agentbricks/templates/custom-agent-langgraph/agent/__init__.py +0 -0
  79. databricks_agentbricks/templates/custom-agent-langgraph/agent/agent.py +27 -0
  80. databricks_agentbricks/templates/custom-agent-langgraph/app.yaml +1 -0
  81. databricks_agentbricks/templates/custom-agent-langgraph/pyproject.toml +38 -0
  82. databricks_agentbricks/templates/custom-agent-langgraph/runtime/__init__.py +0 -0
  83. databricks_agentbricks/templates/custom-agent-langgraph/runtime/main.py +31 -0
  84. databricks_agentbricks/templates/custom-agent-langgraph/tests/test_runtime.py +29 -0
  85. databricks_agentbricks/templates/custom-agent-openai/.env.example +1 -0
  86. databricks_agentbricks/templates/custom-agent-openai/.gitignore +11 -0
  87. databricks_agentbricks/templates/custom-agent-openai/README.md +22 -0
  88. databricks_agentbricks/templates/custom-agent-openai/agent/__init__.py +0 -0
  89. databricks_agentbricks/templates/custom-agent-openai/agent/agent.py +29 -0
  90. databricks_agentbricks/templates/custom-agent-openai/app.yaml +1 -0
  91. databricks_agentbricks/templates/custom-agent-openai/pyproject.toml +38 -0
  92. databricks_agentbricks/templates/custom-agent-openai/runtime/__init__.py +0 -0
  93. databricks_agentbricks/templates/custom-agent-openai/runtime/main.py +31 -0
  94. databricks_agentbricks/templates/custom-agent-openai/tests/test_runtime.py +29 -0
  95. databricks_agentbricks/templates/sandbox_mcp.py +39 -0
  96. databricks_agentbricks/templates/sandbox_mcp_langgraph.py +39 -0
  97. databricks_agentbricks/templates/ui/agent-langgraph/CHAT_APP.md +49 -0
  98. databricks_agentbricks/templates/ui/agent-langgraph/runtime/main.py +26 -0
  99. databricks_agentbricks/templates/ui/agent-langgraph/runtime/ui.py +528 -0
  100. databricks_agentbricks/templates/ui/agent-langgraph/tests/test_demo_ui.py +542 -0
  101. databricks_agentbricks/templates/ui/agent-langgraph/ui/agentbricks-mark.png +0 -0
  102. databricks_agentbricks/templates/ui/agent-langgraph/ui/app.js +1464 -0
  103. databricks_agentbricks/templates/ui/agent-langgraph/ui/index.html +281 -0
  104. databricks_agentbricks/templates/ui/agent-langgraph/ui/styles.css +1913 -0
  105. databricks_agentbricks/templates/ui/agent-openai/CHAT_APP.md +54 -0
  106. databricks_agentbricks/templates/ui/agent-openai/runtime/main.py +26 -0
  107. databricks_agentbricks/templates/ui/agent-openai/runtime/ui.py +521 -0
  108. databricks_agentbricks/templates/ui/agent-openai/tests/test_demo_ui.py +512 -0
  109. databricks_agentbricks/templates/ui/agent-openai/ui/agentbricks-mark.png +0 -0
  110. databricks_agentbricks/templates/ui/agent-openai/ui/app.js +1428 -0
  111. databricks_agentbricks/templates/ui/agent-openai/ui/index.html +281 -0
  112. databricks_agentbricks/templates/ui/agent-openai/ui/styles.css +1913 -0
  113. databricks_agentbricks/theme.py +72 -0
  114. databricks_agentbricks-0.2.0.dist-info/METADATA +897 -0
  115. databricks_agentbricks-0.2.0.dist-info/RECORD +159 -0
  116. databricks_agentbricks-0.2.0.dist-info/WHEEL +4 -0
  117. databricks_agentbricks-0.2.0.dist-info/entry_points.txt +2 -0
  118. databricks_agentbricks-0.2.0.dist-info/licenses/NOTICE +39 -0
  119. databricks_agentkit/__init__.py +67 -0
  120. databricks_agentkit/_api_client.py +673 -0
  121. databricks_agentkit/_pagination.py +25 -0
  122. databricks_agentkit/client.py +31 -0
  123. databricks_agentkit/langgraph/__init__.py +98 -0
  124. databricks_agentkit/langgraph/genie.py +50 -0
  125. databricks_agentkit/langgraph/mcp.py +216 -0
  126. databricks_agentkit/langgraph/memory.py +67 -0
  127. databricks_agentkit/langgraph/session_store.py +485 -0
  128. databricks_agentkit/memory_store.py +371 -0
  129. databricks_agentkit/models.py +330 -0
  130. databricks_agentkit/openai/__init__.py +93 -0
  131. databricks_agentkit/openai/genie.py +50 -0
  132. databricks_agentkit/openai/mcp.py +189 -0
  133. databricks_agentkit/openai/memory.py +67 -0
  134. databricks_agentkit/openai/sessions.py +157 -0
  135. databricks_agentkit/py.typed +0 -0
  136. databricks_agentkit/runtime/ARCHITECTURE.md +64 -0
  137. databricks_agentkit/runtime/README.md +184 -0
  138. databricks_agentkit/runtime/__init__.py +69 -0
  139. databricks_agentkit/runtime/app.py +316 -0
  140. databricks_agentkit/runtime/auth.py +149 -0
  141. databricks_agentkit/runtime/durability/__init__.py +1 -0
  142. databricks_agentkit/runtime/durability/execution.py +133 -0
  143. databricks_agentkit/runtime/durability/heartbeat.py +64 -0
  144. databricks_agentkit/runtime/durability/lakebase_runtime_store.py +648 -0
  145. databricks_agentkit/runtime/durability/recovery.py +70 -0
  146. databricks_agentkit/runtime/durability/store.py +33 -0
  147. databricks_agentkit/runtime/execution.py +160 -0
  148. databricks_agentkit/runtime/genie.py +224 -0
  149. databricks_agentkit/runtime/mcp_auth.py +114 -0
  150. databricks_agentkit/runtime/model_services.py +90 -0
  151. databricks_agentkit/runtime/runtime.py +273 -0
  152. databricks_agentkit/runtime/session_store_client.py +120 -0
  153. databricks_agentkit/runtime/store.py +287 -0
  154. databricks_agentkit/runtime/tool_manifest.py +223 -0
  155. databricks_agentkit/runtime/tracing.py +71 -0
  156. databricks_agentkit/runtime/types.py +118 -0
  157. databricks_agentkit/runtime/workspace.py +27 -0
  158. databricks_agentkit/session_store.py +434 -0
  159. databricks_agentkit/timefmt.py +85 -0
@@ -0,0 +1,1913 @@
1
+ :root {
2
+ /* Surfaces — cool lavender shell with white card panels. */
3
+ --page: #f1f3ff;
4
+ --surface: #ffffff;
5
+ --surface-raised: #ffffff;
6
+ --surface-muted: #f7f8fc;
7
+ --hover: #f0f2f8;
8
+ --ink: #1f2124;
9
+ --ink-soft: #5f6469;
10
+ --ink-faint: #777d86;
11
+ --line: #e7e9f0;
12
+ --line-strong: #d9dce6;
13
+
14
+ /* Accent — Google-blue, used for interactive chrome and focus. */
15
+ --accent: #1a73e8;
16
+ --accent-deep: #1a5fc4;
17
+ --accent-soft: #edf3fd;
18
+
19
+ /* Brand mark stays warm terracotta. */
20
+ --brand: #c2410c;
21
+
22
+ --success: #137333;
23
+ --success-soft: #e6f4ea;
24
+ --warning: #8b5000;
25
+ --warning-soft: #fef3d9;
26
+ --danger: #b3261e;
27
+ --danger-soft: #fce8e6;
28
+ --purple: #7040a0;
29
+ --focus: #1a73e8;
30
+
31
+ --shadow: 0 1px 2px rgba(15, 23, 42, 0.04), 0 1px 3px rgba(15, 23, 42, 0.03);
32
+ --radius-large: 12px;
33
+ --radius-medium: 10px;
34
+ --radius-small: 8px;
35
+
36
+ color-scheme: light;
37
+ font-family: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
38
+ }
39
+
40
+ * {
41
+ box-sizing: border-box;
42
+ }
43
+
44
+ body {
45
+ margin: 0;
46
+ min-width: 320px;
47
+ min-height: 100vh;
48
+ background-color: var(--page);
49
+ background-image:
50
+ radial-gradient(ellipse 56% 42% at 12% -2%, rgba(108, 121, 255, 0.13), transparent 66%),
51
+ radial-gradient(ellipse 54% 40% at 88% -2%, rgba(84, 200, 140, 0.12), transparent 66%),
52
+ radial-gradient(ellipse 50% 40% at 100% 102%, rgba(116, 143, 255, 0.06), transparent 70%);
53
+ background-attachment: fixed;
54
+ color: var(--ink);
55
+ font-size: 13px;
56
+ line-height: 1.5;
57
+ -webkit-font-smoothing: antialiased;
58
+ }
59
+
60
+ button,
61
+ input,
62
+ textarea,
63
+ select {
64
+ font: inherit;
65
+ }
66
+
67
+ button {
68
+ color: inherit;
69
+ }
70
+
71
+ button:focus-visible,
72
+ input:focus-visible,
73
+ textarea:focus-visible,
74
+ select:focus-visible {
75
+ outline: 2px solid color-mix(in srgb, var(--focus) 45%, transparent);
76
+ outline-offset: 1px;
77
+ }
78
+
79
+ ::selection {
80
+ background: color-mix(in srgb, var(--accent) 22%, transparent);
81
+ color: var(--ink);
82
+ }
83
+
84
+ code {
85
+ font-family: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
86
+ font-size: 0.92em;
87
+ }
88
+
89
+ .app-shell {
90
+ min-height: 100vh;
91
+ }
92
+
93
+ .icon {
94
+ width: 18px;
95
+ height: 18px;
96
+ flex: 0 0 auto;
97
+ display: block;
98
+ }
99
+
100
+ /* -------------------------------------------------------------------------- */
101
+ /* Header */
102
+ /* -------------------------------------------------------------------------- */
103
+
104
+ .topbar {
105
+ height: 56px;
106
+ display: flex;
107
+ align-items: center;
108
+ gap: 16px;
109
+ padding: 0 16px;
110
+ border-bottom: 1px solid var(--line);
111
+ background: color-mix(in srgb, var(--surface) 82%, transparent);
112
+ backdrop-filter: blur(12px);
113
+ position: sticky;
114
+ top: 0;
115
+ z-index: 20;
116
+ }
117
+
118
+ .brand-lockup,
119
+ .section-heading,
120
+ .button-row,
121
+ .composer-footer,
122
+ .approval-actions {
123
+ display: flex;
124
+ align-items: center;
125
+ }
126
+
127
+ .brand-lockup {
128
+ min-width: 0;
129
+ gap: 10px;
130
+ }
131
+
132
+ .brand-mark {
133
+ width: 30px;
134
+ height: 30px;
135
+ flex: 0 0 auto;
136
+ display: grid;
137
+ place-items: center;
138
+ border: 1px solid var(--brand);
139
+ border-radius: 6px;
140
+ color: var(--brand);
141
+ font-size: 12px;
142
+ font-weight: 700;
143
+ }
144
+
145
+ .brand-copy {
146
+ min-width: 0;
147
+ }
148
+
149
+ .brand-copy h1,
150
+ .brand-copy .brand-sub {
151
+ display: block;
152
+ overflow: hidden;
153
+ text-overflow: ellipsis;
154
+ white-space: nowrap;
155
+ }
156
+
157
+ .brand-copy .brand-sub {
158
+ margin: 0;
159
+ color: var(--ink-soft);
160
+ font-size: 13px;
161
+ font-weight: 400;
162
+ line-height: 18px;
163
+ }
164
+
165
+ .header-actions {
166
+ min-width: 0;
167
+ margin-inline-start: auto;
168
+ display: flex;
169
+ align-items: center;
170
+ gap: 10px;
171
+ }
172
+
173
+ .viewer-chip {
174
+ min-width: 0;
175
+ display: flex;
176
+ align-items: center;
177
+ gap: 9px;
178
+ }
179
+
180
+ #viewer-value {
181
+ min-width: 0;
182
+ margin: 0;
183
+ overflow: hidden;
184
+ font-size: 14px;
185
+ font-weight: 500;
186
+ text-overflow: ellipsis;
187
+ white-space: nowrap;
188
+ }
189
+
190
+ .avatar {
191
+ width: 30px;
192
+ height: 30px;
193
+ flex: 0 0 auto;
194
+ display: grid;
195
+ place-items: center;
196
+ border-radius: 50%;
197
+ background: var(--accent);
198
+ color: #ffffff;
199
+ font-size: 11px;
200
+ font-weight: 600;
201
+ text-transform: uppercase;
202
+ }
203
+
204
+ .eyebrow {
205
+ margin: 0 0 4px;
206
+ color: var(--ink-faint);
207
+ font-size: 11px;
208
+ font-weight: 600;
209
+ letter-spacing: 0.06em;
210
+ text-transform: uppercase;
211
+ }
212
+
213
+ h1,
214
+ h2,
215
+ p {
216
+ margin-top: 0;
217
+ }
218
+
219
+ h1 {
220
+ margin-bottom: 0;
221
+ font-size: 15px;
222
+ font-weight: 550;
223
+ line-height: 19px;
224
+ }
225
+
226
+ h2 {
227
+ margin-bottom: 0;
228
+ font-size: 15px;
229
+ font-weight: 550;
230
+ line-height: 1.3;
231
+ }
232
+
233
+ /* -------------------------------------------------------------------------- */
234
+ /* Trust strip */
235
+ /* -------------------------------------------------------------------------- */
236
+
237
+ .trust-strip {
238
+ min-height: 30px;
239
+ display: flex;
240
+ align-items: center;
241
+ gap: 16px;
242
+ padding: 6px 16px;
243
+ border-bottom: 1px solid var(--line);
244
+ background: color-mix(in srgb, var(--surface) 55%, transparent);
245
+ color: var(--ink-soft);
246
+ font-size: 12px;
247
+ }
248
+
249
+ /* -------------------------------------------------------------------------- */
250
+ /* Layout */
251
+ /* -------------------------------------------------------------------------- */
252
+
253
+ .workspace {
254
+ display: grid;
255
+ grid-template-columns: minmax(280px, 0.82fr) minmax(440px, 1.9fr) minmax(300px, 1fr);
256
+ gap: 12px;
257
+ width: min(1600px, 100%);
258
+ min-height: calc(100vh - 87px);
259
+ margin: 0 auto;
260
+ padding: 12px;
261
+ }
262
+
263
+ .left-rail,
264
+ .right-rail {
265
+ min-height: 0;
266
+ display: flex;
267
+ flex-direction: column;
268
+ gap: 12px;
269
+ }
270
+
271
+ .rail-section,
272
+ .control-card,
273
+ .chat-panel {
274
+ border: 1px solid var(--line);
275
+ background: var(--surface);
276
+ box-shadow: var(--shadow);
277
+ }
278
+
279
+ .rail-section {
280
+ border-radius: var(--radius-large);
281
+ overflow: hidden;
282
+ }
283
+
284
+ .control-card {
285
+ border-radius: var(--radius-large);
286
+ padding: 14px;
287
+ }
288
+
289
+ /* -------------------------------------------------------------------------- */
290
+ /* Left rail — single card, divided by lines */
291
+ /* -------------------------------------------------------------------------- */
292
+
293
+ .left-card {
294
+ flex: 1;
295
+ min-height: 0;
296
+ display: flex;
297
+ flex-direction: column;
298
+ }
299
+
300
+ .card-block {
301
+ padding: 12px 14px;
302
+ }
303
+
304
+ .card-block + .card-block {
305
+ border-top: 1px solid var(--line);
306
+ }
307
+
308
+ .card-block.sessions-block {
309
+ flex: 1;
310
+ min-height: 0;
311
+ display: flex;
312
+ flex-direction: column;
313
+ }
314
+
315
+ .panel-subhead {
316
+ display: flex;
317
+ align-items: center;
318
+ gap: 8px;
319
+ min-height: 30px;
320
+ margin-bottom: 6px;
321
+ }
322
+
323
+ .panel-subhead h2 {
324
+ flex: 1;
325
+ min-width: 0;
326
+ font-size: 15px;
327
+ font-weight: 550;
328
+ }
329
+
330
+ /* Full-bleed divider under the top header of the left card (matches the chat header). */
331
+ .capabilities-block > .panel-subhead,
332
+ .memory-pane > .panel-subhead {
333
+ margin: -12px -14px 10px;
334
+ padding: 10px 14px;
335
+ border-bottom: 1px solid var(--line);
336
+ }
337
+
338
+ .subhead-actions {
339
+ display: flex;
340
+ align-items: center;
341
+ gap: 4px;
342
+ }
343
+
344
+ .icon-button,
345
+ .text-button {
346
+ border: 0;
347
+ background: transparent;
348
+ cursor: pointer;
349
+ }
350
+
351
+ .icon-button {
352
+ width: 30px;
353
+ height: 30px;
354
+ display: grid;
355
+ place-items: center;
356
+ border-radius: 50%;
357
+ color: var(--ink-soft);
358
+ }
359
+
360
+ .icon-button .icon {
361
+ width: 16px;
362
+ height: 16px;
363
+ }
364
+
365
+ .icon-button:hover {
366
+ background: var(--hover);
367
+ color: var(--ink);
368
+ }
369
+
370
+ .icon-button.active {
371
+ color: var(--ink);
372
+ background: var(--hover);
373
+ }
374
+
375
+ .icon-button:disabled {
376
+ cursor: default;
377
+ opacity: 0.4;
378
+ }
379
+
380
+ .text-button {
381
+ display: inline-flex;
382
+ align-items: center;
383
+ gap: 5px;
384
+ padding: 5px 10px;
385
+ border: 1px solid var(--line-strong);
386
+ border-radius: 999px;
387
+ color: var(--ink);
388
+ font-size: 12px;
389
+ font-weight: 500;
390
+ white-space: nowrap;
391
+ }
392
+
393
+ .text-button:hover {
394
+ background: var(--hover);
395
+ }
396
+
397
+ .text-button .icon {
398
+ width: 14px;
399
+ height: 14px;
400
+ }
401
+
402
+ .text-button.plain {
403
+ border: 0;
404
+ color: var(--accent);
405
+ font-weight: 600;
406
+ }
407
+
408
+ .text-button.plain:hover {
409
+ background: var(--hover);
410
+ }
411
+
412
+ /* Capabilities — click to expand */
413
+
414
+ .capability-list {
415
+ display: flex;
416
+ flex-direction: column;
417
+ }
418
+
419
+ .capability-item + .capability-item {
420
+ border-top: 1px solid var(--line);
421
+ }
422
+
423
+ .capability {
424
+ width: 100%;
425
+ display: grid;
426
+ grid-template-columns: 22px minmax(0, 1fr) 12px 14px;
427
+ align-items: center;
428
+ gap: 10px;
429
+ padding: 10px 6px;
430
+ border: 0;
431
+ border-radius: var(--radius-small);
432
+ background: transparent;
433
+ text-align: start;
434
+ cursor: pointer;
435
+ }
436
+
437
+ .capability:hover {
438
+ background: var(--hover);
439
+ }
440
+
441
+ .capability-item.expanded {
442
+ border-radius: var(--radius-small);
443
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent) 55%, transparent);
444
+ background: var(--accent-soft);
445
+ }
446
+
447
+ .capability-item.expanded .capability:hover {
448
+ background: transparent;
449
+ }
450
+
451
+ .capability-icon {
452
+ width: 22px;
453
+ height: 22px;
454
+ display: grid;
455
+ place-items: center;
456
+ color: var(--accent);
457
+ }
458
+
459
+ .capability-icon .icon {
460
+ width: 18px;
461
+ height: 18px;
462
+ }
463
+
464
+ .capability-copy {
465
+ min-width: 0;
466
+ }
467
+
468
+ .capability-copy strong,
469
+ .capability-copy small {
470
+ display: block;
471
+ }
472
+
473
+ .capability-copy strong {
474
+ font-size: 14px;
475
+ font-weight: 500;
476
+ line-height: 18px;
477
+ }
478
+
479
+ .capability-copy small {
480
+ overflow: hidden;
481
+ color: var(--ink-soft);
482
+ font-size: 12px;
483
+ line-height: 15px;
484
+ text-overflow: ellipsis;
485
+ white-space: nowrap;
486
+ }
487
+
488
+ .status-orb {
489
+ width: 9px;
490
+ height: 9px;
491
+ justify-self: center;
492
+ border-radius: 50%;
493
+ background: var(--line-strong);
494
+ }
495
+
496
+ .status-orb.enabled {
497
+ background: var(--success);
498
+ }
499
+
500
+ .status-orb.degraded {
501
+ background: var(--warning);
502
+ }
503
+
504
+ .status-orb.disabled {
505
+ background: var(--danger);
506
+ }
507
+
508
+ .capability-chevron {
509
+ width: 14px;
510
+ height: 14px;
511
+ justify-self: center;
512
+ color: var(--ink-faint);
513
+ transition: transform 150ms ease;
514
+ }
515
+
516
+ .capability-item.expanded .capability-chevron {
517
+ transform: rotate(90deg);
518
+ }
519
+
520
+ .capability-detail {
521
+ padding: 0 8px 12px 40px;
522
+ color: var(--ink-soft);
523
+ font-size: 12px;
524
+ line-height: 1.5;
525
+ }
526
+
527
+ .capability-detail[hidden] {
528
+ display: none;
529
+ }
530
+
531
+ /* Direct text children (status + description) each take their own line so a
532
+ following link/command sits below them, not inline. */
533
+ .capability-detail > span {
534
+ display: block;
535
+ }
536
+
537
+ .capability-detail .cap-status {
538
+ margin-bottom: 4px;
539
+ font-size: 11px;
540
+ font-weight: 600;
541
+ letter-spacing: 0.06em;
542
+ text-transform: uppercase;
543
+ }
544
+
545
+ .capability-detail.enabled .cap-status {
546
+ color: var(--success);
547
+ }
548
+
549
+ .capability-detail.degraded .cap-status {
550
+ color: var(--warning);
551
+ }
552
+
553
+ .capability-detail.disabled .cap-status {
554
+ color: var(--danger);
555
+ }
556
+
557
+ .capability-detail .cap-command-label {
558
+ display: block;
559
+ margin: 8px 0 4px;
560
+ color: var(--ink-faint);
561
+ }
562
+
563
+ .capability-detail .cap-command {
564
+ display: flex;
565
+ align-items: center;
566
+ gap: 6px;
567
+ padding: 6px 8px;
568
+ border-radius: 6px;
569
+ background: var(--surface-muted);
570
+ color: var(--ink);
571
+ font-size: 11px;
572
+ overflow-wrap: anywhere;
573
+ }
574
+
575
+ .capability-detail .cap-command code {
576
+ flex: 1;
577
+ min-width: 0;
578
+ }
579
+
580
+ .capability-detail .cap-command button {
581
+ flex: 0 0 auto;
582
+ display: grid;
583
+ place-items: center;
584
+ width: 22px;
585
+ height: 22px;
586
+ border: 0;
587
+ border-radius: 5px;
588
+ background: transparent;
589
+ color: var(--ink-soft);
590
+ cursor: pointer;
591
+ }
592
+
593
+ .capability-detail .cap-command button:hover {
594
+ background: var(--hover);
595
+ color: var(--ink);
596
+ }
597
+
598
+ .capability-detail .cap-command .icon {
599
+ width: 13px;
600
+ height: 13px;
601
+ }
602
+
603
+ .capability-detail .cap-link {
604
+ display: flex;
605
+ width: fit-content;
606
+ align-items: center;
607
+ gap: 6px;
608
+ margin-top: 10px;
609
+ color: var(--accent);
610
+ font-weight: 500;
611
+ text-decoration: none;
612
+ }
613
+
614
+ .capability-detail .cap-link:hover {
615
+ text-decoration: underline;
616
+ }
617
+
618
+ .capability-detail .cap-link .icon {
619
+ width: 14px;
620
+ height: 14px;
621
+ }
622
+
623
+ /* Sessions */
624
+
625
+ .session-search {
626
+ position: relative;
627
+ display: flex;
628
+ align-items: center;
629
+ margin-bottom: 8px;
630
+ }
631
+
632
+ .session-search .icon {
633
+ position: absolute;
634
+ left: 10px;
635
+ width: 15px;
636
+ height: 15px;
637
+ color: var(--ink-faint);
638
+ pointer-events: none;
639
+ }
640
+
641
+ .session-search input {
642
+ width: 100%;
643
+ padding: 8px 10px 8px 31px;
644
+ border: 1px solid var(--line);
645
+ border-radius: var(--radius-small);
646
+ background: var(--surface-muted);
647
+ color: var(--ink);
648
+ font-size: 13px;
649
+ }
650
+
651
+ .session-list {
652
+ flex: 1;
653
+ min-height: 0;
654
+ overflow-y: auto;
655
+ margin: 0 -6px;
656
+ }
657
+
658
+ .session-item {
659
+ display: block;
660
+ width: 100%;
661
+ padding: 10px 8px;
662
+ border: 1px solid transparent;
663
+ border-radius: var(--radius-small);
664
+ background: transparent;
665
+ text-align: start;
666
+ cursor: pointer;
667
+ }
668
+
669
+ .session-item:hover {
670
+ background: var(--hover);
671
+ }
672
+
673
+ .session-item.current {
674
+ background: var(--accent-soft);
675
+ border-color: color-mix(in srgb, var(--accent) 45%, transparent);
676
+ }
677
+
678
+ .session-item-top {
679
+ display: flex;
680
+ align-items: baseline;
681
+ justify-content: space-between;
682
+ gap: 10px;
683
+ }
684
+
685
+ .session-item-title {
686
+ min-width: 0;
687
+ overflow: hidden;
688
+ font-size: 13px;
689
+ font-weight: 500;
690
+ text-overflow: ellipsis;
691
+ white-space: nowrap;
692
+ }
693
+
694
+ .session-item-time {
695
+ flex: 0 0 auto;
696
+ color: var(--ink-faint);
697
+ font-size: 12px;
698
+ }
699
+
700
+ .session-item-id {
701
+ display: block;
702
+ margin-top: 2px;
703
+ color: var(--ink-soft);
704
+ font-family: "SFMono-Regular", Consolas, monospace;
705
+ font-size: 12px;
706
+ }
707
+
708
+ .session-item-actions {
709
+ margin-top: 6px;
710
+ }
711
+
712
+ /* Utility rows preserved for JS wiring but not central to the mock. */
713
+
714
+ .muted-list {
715
+ max-height: 150px;
716
+ margin-top: 8px;
717
+ overflow: auto;
718
+ border: 1px solid var(--line);
719
+ border-radius: var(--radius-small);
720
+ background: var(--surface-raised);
721
+ }
722
+
723
+ .supporting-text {
724
+ margin: 8px 0 0;
725
+ color: var(--ink-soft);
726
+ font-size: 12px;
727
+ line-height: 1.5;
728
+ }
729
+
730
+ .state-empty,
731
+ .state-loading,
732
+ .state-error {
733
+ padding: 12px;
734
+ color: var(--ink-soft);
735
+ font-size: 12px;
736
+ line-height: 1.45;
737
+ }
738
+
739
+ .state-loading {
740
+ color: var(--accent-deep);
741
+ }
742
+
743
+ .state-error {
744
+ color: var(--danger);
745
+ background: var(--danger-soft);
746
+ }
747
+
748
+ .state-item {
749
+ padding: 10px 11px;
750
+ border-bottom: 1px solid var(--line);
751
+ }
752
+
753
+ .state-item:last-child {
754
+ border-bottom: 0;
755
+ }
756
+
757
+ .state-item strong,
758
+ .state-item p,
759
+ .state-item small {
760
+ display: block;
761
+ overflow-wrap: anywhere;
762
+ }
763
+
764
+ .state-item strong {
765
+ color: var(--ink);
766
+ font-size: 12px;
767
+ }
768
+
769
+ .state-item p {
770
+ margin: 5px 0;
771
+ color: var(--ink-soft);
772
+ font-size: 12px;
773
+ line-height: 1.42;
774
+ white-space: pre-wrap;
775
+ }
776
+
777
+ .state-item small {
778
+ color: var(--ink-faint);
779
+ font-size: 11px;
780
+ }
781
+
782
+ .session-item-heading {
783
+ display: flex;
784
+ align-items: center;
785
+ justify-content: space-between;
786
+ gap: 8px;
787
+ }
788
+
789
+ /* Elements kept for the JS contract but not shown in the streamlined layout. */
790
+ .offscreen {
791
+ position: absolute;
792
+ width: 1px;
793
+ height: 1px;
794
+ padding: 0;
795
+ margin: -1px;
796
+ overflow: hidden;
797
+ clip: rect(0, 0, 0, 0);
798
+ white-space: nowrap;
799
+ border: 0;
800
+ }
801
+
802
+ /* -------------------------------------------------------------------------- */
803
+ /* Chat panel */
804
+ /* -------------------------------------------------------------------------- */
805
+
806
+ .chat-panel {
807
+ min-height: 700px;
808
+ display: grid;
809
+ grid-template-rows: auto minmax(0, 1fr) auto auto;
810
+ border-radius: var(--radius-large);
811
+ overflow: hidden;
812
+ }
813
+
814
+ .chat-header {
815
+ display: flex;
816
+ align-items: center;
817
+ justify-content: space-between;
818
+ gap: 16px;
819
+ padding: 12px 16px;
820
+ border-bottom: 1px solid var(--line);
821
+ }
822
+
823
+ .run-status {
824
+ display: inline-flex;
825
+ align-items: center;
826
+ min-height: 24px;
827
+ padding: 4px 10px;
828
+ border-radius: 999px;
829
+ background: var(--success-soft);
830
+ color: var(--success);
831
+ font-size: 12px;
832
+ font-weight: 600;
833
+ white-space: nowrap;
834
+ }
835
+
836
+ .run-status.busy {
837
+ background: var(--accent-soft);
838
+ color: var(--accent-deep);
839
+ }
840
+
841
+ .run-status.error {
842
+ background: var(--danger-soft);
843
+ color: var(--danger);
844
+ }
845
+
846
+ .chat-log {
847
+ min-height: 0;
848
+ overflow-y: auto;
849
+ padding: 22px 24px;
850
+ scroll-behavior: smooth;
851
+ scrollbar-gutter: stable;
852
+ }
853
+
854
+ .empty-state {
855
+ width: min(560px, 100%);
856
+ min-height: 100%;
857
+ display: flex;
858
+ flex-direction: column;
859
+ justify-content: center;
860
+ padding: 40px 0;
861
+ }
862
+
863
+ .empty-state[hidden] {
864
+ display: none;
865
+ }
866
+
867
+ .empty-mark {
868
+ width: 46px;
869
+ height: 46px;
870
+ display: grid;
871
+ place-items: center;
872
+ margin-bottom: 22px;
873
+ border-radius: var(--radius-medium);
874
+ background: var(--accent-soft);
875
+ color: var(--accent);
876
+ }
877
+
878
+ .empty-mark .icon {
879
+ width: 26px;
880
+ height: 26px;
881
+ }
882
+
883
+ .empty-state h2 {
884
+ margin-bottom: 12px;
885
+ font-size: 1.75rem;
886
+ font-weight: 550;
887
+ }
888
+
889
+ .empty-state > p:not(.eyebrow) {
890
+ max-width: 480px;
891
+ margin: 0;
892
+ color: var(--ink-soft);
893
+ font-size: 0.95rem;
894
+ line-height: 1.6;
895
+ }
896
+
897
+ /* Higher specificity than `.empty-state > p:not(.eyebrow)` so this margin wins
898
+ (that rule's margin:0 was collapsing the label against the description). */
899
+ .empty-state > p.empty-prompts-label {
900
+ margin: 32px 0 14px;
901
+ color: var(--ink);
902
+ font-size: 0.95rem;
903
+ font-weight: 600;
904
+ }
905
+
906
+ .prompt-grid {
907
+ display: flex;
908
+ flex-direction: column;
909
+ align-items: flex-start;
910
+ gap: 10px;
911
+ }
912
+
913
+ .prompt-grid button {
914
+ padding: 9px 16px;
915
+ border: 1px solid var(--line-strong);
916
+ border-radius: 999px;
917
+ background: var(--surface-raised);
918
+ cursor: pointer;
919
+ font-size: 13px;
920
+ font-weight: 500;
921
+ }
922
+
923
+ .prompt-grid button:hover {
924
+ border-color: var(--accent);
925
+ background: var(--accent-soft);
926
+ color: var(--accent-deep);
927
+ }
928
+
929
+ /* Messages */
930
+
931
+ .message {
932
+ margin-bottom: 22px;
933
+ }
934
+
935
+ .message.user {
936
+ display: flex;
937
+ justify-content: flex-end;
938
+ }
939
+
940
+ .message.user .message-content {
941
+ max-width: min(560px, 82%);
942
+ padding: 10px 14px;
943
+ border-radius: 14px;
944
+ background: var(--accent-soft);
945
+ color: var(--ink);
946
+ font-size: 0.95rem;
947
+ line-height: 1.6;
948
+ overflow-wrap: anywhere;
949
+ white-space: pre-wrap;
950
+ }
951
+
952
+ .message-head {
953
+ display: flex;
954
+ align-items: baseline;
955
+ gap: 8px;
956
+ margin-bottom: 6px;
957
+ }
958
+
959
+ .message-name {
960
+ font-size: 0.95rem;
961
+ font-weight: 600;
962
+ }
963
+
964
+ .message-time {
965
+ color: var(--ink-faint);
966
+ font-size: 12px;
967
+ }
968
+
969
+ .message.assistant .message-content,
970
+ .message.tool .message-content,
971
+ .message.system .message-content,
972
+ .message.error .message-content {
973
+ font-size: 0.95rem;
974
+ line-height: 1.65;
975
+ overflow-wrap: anywhere;
976
+ white-space: pre-wrap;
977
+ }
978
+
979
+ .message.tool .message-content,
980
+ .message.system .message-content {
981
+ padding: 10px 13px;
982
+ border-radius: var(--radius-small);
983
+ background: var(--surface-muted);
984
+ color: var(--ink-soft);
985
+ font-family: "SFMono-Regular", Consolas, monospace;
986
+ font-size: 0.85rem;
987
+ }
988
+
989
+ .message.error .message-content {
990
+ padding: 10px 13px;
991
+ border-radius: var(--radius-small);
992
+ border: 1px solid color-mix(in srgb, var(--danger) 38%, var(--line));
993
+ background: var(--danger-soft);
994
+ color: var(--danger);
995
+ }
996
+
997
+ .message.streaming .message-content::after {
998
+ content: "";
999
+ display: inline-block;
1000
+ width: 7px;
1001
+ height: 14px;
1002
+ margin-left: 3px;
1003
+ background: var(--accent);
1004
+ vertical-align: -2px;
1005
+ animation: blink 0.8s infinite;
1006
+ }
1007
+
1008
+ .message-actions {
1009
+ display: flex;
1010
+ align-items: center;
1011
+ gap: 4px;
1012
+ margin-top: 8px;
1013
+ opacity: 0;
1014
+ transition: opacity 120ms ease;
1015
+ }
1016
+
1017
+ .message:hover .message-actions,
1018
+ .message:focus-within .message-actions {
1019
+ opacity: 1;
1020
+ }
1021
+
1022
+ .message-action {
1023
+ display: inline-flex;
1024
+ align-items: center;
1025
+ gap: 6px;
1026
+ padding: 4px 8px;
1027
+ border: 0;
1028
+ border-radius: 6px;
1029
+ background: transparent;
1030
+ color: var(--ink-soft);
1031
+ cursor: pointer;
1032
+ font-size: 12px;
1033
+ font-weight: 500;
1034
+ }
1035
+
1036
+ .message-action:hover {
1037
+ background: var(--hover);
1038
+ color: var(--ink);
1039
+ }
1040
+
1041
+ .message-action .icon {
1042
+ width: 15px;
1043
+ height: 15px;
1044
+ }
1045
+
1046
+ /* Approval panel */
1047
+
1048
+ .approval-panel {
1049
+ margin: 0 16px 12px;
1050
+ padding: 13px 16px;
1051
+ display: flex;
1052
+ align-items: center;
1053
+ justify-content: space-between;
1054
+ gap: 16px;
1055
+ border: 1px solid color-mix(in srgb, var(--warning) 35%, var(--line));
1056
+ border-radius: var(--radius-medium);
1057
+ background: var(--warning-soft);
1058
+ }
1059
+
1060
+ .approval-panel[hidden] {
1061
+ display: none;
1062
+ }
1063
+
1064
+ .approval-panel p:last-child {
1065
+ margin-bottom: 0;
1066
+ font-size: 0.9rem;
1067
+ }
1068
+
1069
+ .approval-actions,
1070
+ .button-row {
1071
+ gap: 8px;
1072
+ }
1073
+
1074
+ .button-row.wrap {
1075
+ flex-wrap: wrap;
1076
+ }
1077
+
1078
+ /* Composer */
1079
+
1080
+ .composer {
1081
+ margin: 0 16px 16px;
1082
+ padding: 12px 14px;
1083
+ border: 1px solid var(--line-strong);
1084
+ border-radius: var(--radius-medium);
1085
+ background: var(--surface-raised);
1086
+ box-shadow: var(--shadow);
1087
+ }
1088
+
1089
+ .composer:focus-within {
1090
+ border-color: var(--focus);
1091
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--focus) 15%, transparent);
1092
+ }
1093
+
1094
+ .composer textarea {
1095
+ width: 100%;
1096
+ max-height: 180px;
1097
+ resize: none;
1098
+ padding: 2px 0 10px;
1099
+ border: 0;
1100
+ outline: 0;
1101
+ background: transparent;
1102
+ color: var(--ink);
1103
+ font-size: 0.95rem;
1104
+ line-height: 1.5;
1105
+ }
1106
+
1107
+ .composer-footer {
1108
+ justify-content: space-between;
1109
+ gap: 12px;
1110
+ }
1111
+
1112
+ .composer-right {
1113
+ display: flex;
1114
+ align-items: center;
1115
+ gap: 10px;
1116
+ }
1117
+
1118
+ .mode-switcher {
1119
+ display: inline-flex;
1120
+ padding: 3px;
1121
+ border-radius: var(--radius-small);
1122
+ background: var(--surface-muted);
1123
+ }
1124
+
1125
+ .mode-button {
1126
+ padding: 6px 12px;
1127
+ border: 1px solid transparent;
1128
+ border-radius: 6px;
1129
+ background: transparent;
1130
+ color: var(--ink-soft);
1131
+ cursor: pointer;
1132
+ font-size: 12px;
1133
+ font-weight: 600;
1134
+ }
1135
+
1136
+ .mode-button.active {
1137
+ background: var(--surface-raised);
1138
+ border-color: color-mix(in srgb, var(--accent) 40%, transparent);
1139
+ color: var(--ink);
1140
+ box-shadow: 0 1px 3px rgba(15, 23, 42, 0.1);
1141
+ }
1142
+
1143
+ .composer-model {
1144
+ position: relative;
1145
+ display: inline-flex;
1146
+ align-items: center;
1147
+ }
1148
+
1149
+ .composer-model select {
1150
+ max-width: 260px;
1151
+ padding: 5px 22px 5px 8px;
1152
+ border: 0;
1153
+ border-radius: 6px;
1154
+ background: transparent;
1155
+ color: var(--ink);
1156
+ font-size: 13px;
1157
+ font-weight: 500;
1158
+ cursor: pointer;
1159
+ appearance: none;
1160
+ -webkit-appearance: none;
1161
+ /* Width is sized to the selected option in JS so the chevron sits right
1162
+ after the name (native selects otherwise size to the widest option). */
1163
+ }
1164
+
1165
+ .composer-model select:hover {
1166
+ background: var(--hover);
1167
+ }
1168
+
1169
+ .composer-model select:disabled {
1170
+ cursor: default;
1171
+ opacity: 0.7;
1172
+ }
1173
+
1174
+ .composer-model .chevron {
1175
+ position: absolute;
1176
+ right: 6px;
1177
+ width: 14px;
1178
+ height: 14px;
1179
+ color: var(--ink-faint);
1180
+ pointer-events: none;
1181
+ }
1182
+
1183
+ .send-button {
1184
+ width: 36px;
1185
+ height: 36px;
1186
+ flex: 0 0 auto;
1187
+ display: grid;
1188
+ place-items: center;
1189
+ border: 0;
1190
+ border-radius: 50%;
1191
+ background: var(--accent);
1192
+ color: #ffffff;
1193
+ cursor: pointer;
1194
+ }
1195
+
1196
+ .send-button .icon {
1197
+ width: 18px;
1198
+ height: 18px;
1199
+ }
1200
+
1201
+ .send-button:hover {
1202
+ background: var(--accent-deep);
1203
+ }
1204
+
1205
+ .send-button:disabled {
1206
+ cursor: not-allowed;
1207
+ background: var(--line-strong);
1208
+ color: var(--ink-faint);
1209
+ }
1210
+
1211
+ /* -------------------------------------------------------------------------- */
1212
+ /* Right rail — memory (compact) + events (fills) */
1213
+ /* -------------------------------------------------------------------------- */
1214
+
1215
+ .control-card-heading {
1216
+ display: flex;
1217
+ align-items: center;
1218
+ gap: 11px;
1219
+ margin-bottom: 12px;
1220
+ }
1221
+
1222
+ .control-card-heading > div {
1223
+ flex: 1;
1224
+ min-width: 0;
1225
+ }
1226
+
1227
+ .memory-card {
1228
+ flex: 0 0 auto;
1229
+ }
1230
+
1231
+ .control-card label {
1232
+ display: block;
1233
+ margin: 12px 0 5px;
1234
+ color: var(--ink-soft);
1235
+ font-size: 12px;
1236
+ font-weight: 600;
1237
+ }
1238
+
1239
+ .state-list {
1240
+ max-height: 170px;
1241
+ margin-top: 12px;
1242
+ overflow: auto;
1243
+ border: 1px solid var(--line);
1244
+ border-radius: var(--radius-small);
1245
+ background: var(--surface-raised);
1246
+ }
1247
+
1248
+ .event-card {
1249
+ flex: 1;
1250
+ min-height: 220px;
1251
+ display: flex;
1252
+ flex-direction: column;
1253
+ padding: 0;
1254
+ }
1255
+
1256
+ .panel-head {
1257
+ display: flex;
1258
+ align-items: center;
1259
+ gap: 8px;
1260
+ padding: 12px 14px;
1261
+ border-bottom: 1px solid var(--line);
1262
+ }
1263
+
1264
+ .panel-head h2 {
1265
+ flex: 1;
1266
+ min-width: 0;
1267
+ }
1268
+
1269
+ .event-actions {
1270
+ display: flex;
1271
+ align-items: center;
1272
+ gap: 2px;
1273
+ }
1274
+
1275
+ .event-filters {
1276
+ display: flex;
1277
+ gap: 6px;
1278
+ padding: 10px 14px;
1279
+ overflow-x: auto;
1280
+ border-bottom: 1px solid var(--line);
1281
+ scrollbar-width: thin;
1282
+ }
1283
+
1284
+ .event-filters[hidden] {
1285
+ display: none;
1286
+ }
1287
+
1288
+ .event-filter {
1289
+ flex: 0 0 auto;
1290
+ padding: 5px 12px;
1291
+ border: 1px solid var(--line-strong);
1292
+ border-radius: 999px;
1293
+ background: var(--surface-raised);
1294
+ color: var(--ink-soft);
1295
+ cursor: pointer;
1296
+ font-size: 12px;
1297
+ font-weight: 500;
1298
+ }
1299
+
1300
+ .event-filter:hover {
1301
+ background: var(--hover);
1302
+ }
1303
+
1304
+ .event-filter.active {
1305
+ border-color: color-mix(in srgb, var(--accent) 45%, transparent);
1306
+ background: var(--accent-soft);
1307
+ color: var(--accent-deep);
1308
+ }
1309
+
1310
+ .event-log {
1311
+ flex: 1;
1312
+ min-height: 0;
1313
+ overflow: auto;
1314
+ padding: 14px 16px 18px;
1315
+ }
1316
+
1317
+ .event-empty {
1318
+ display: flex;
1319
+ flex-direction: column;
1320
+ align-items: center;
1321
+ justify-content: center;
1322
+ height: 100%;
1323
+ min-height: 160px;
1324
+ padding: 20px;
1325
+ color: var(--ink-soft);
1326
+ text-align: center;
1327
+ }
1328
+
1329
+ .event-empty .icon {
1330
+ width: 26px;
1331
+ height: 26px;
1332
+ margin-bottom: 12px;
1333
+ color: var(--ink-faint);
1334
+ }
1335
+
1336
+ .event-empty strong {
1337
+ font-size: 13px;
1338
+ font-weight: 600;
1339
+ color: var(--ink);
1340
+ }
1341
+
1342
+ .event-empty span {
1343
+ margin-top: 4px;
1344
+ font-size: 12px;
1345
+ }
1346
+
1347
+ /* Logs view — JSON blocks */
1348
+
1349
+ .event-entry {
1350
+ margin-bottom: 14px;
1351
+ }
1352
+
1353
+ .event-entry:last-child {
1354
+ margin-bottom: 0;
1355
+ }
1356
+
1357
+ .event-entry-header {
1358
+ display: flex;
1359
+ justify-content: space-between;
1360
+ gap: 8px;
1361
+ margin-bottom: 5px;
1362
+ font-size: 11px;
1363
+ font-weight: 600;
1364
+ text-transform: uppercase;
1365
+ letter-spacing: 0.04em;
1366
+ }
1367
+
1368
+ .event-entry-header .event-type {
1369
+ color: var(--ink);
1370
+ }
1371
+
1372
+ .event-entry-header .event-time {
1373
+ color: var(--ink-faint);
1374
+ }
1375
+
1376
+ .event-entry pre {
1377
+ margin: 0;
1378
+ padding: 13px 15px;
1379
+ border: 1px solid var(--line);
1380
+ border-radius: var(--radius-small);
1381
+ background: var(--surface-muted);
1382
+ color: var(--ink);
1383
+ font-family: "SFMono-Regular", Consolas, monospace;
1384
+ font-size: 11px;
1385
+ line-height: 1.5;
1386
+ overflow-wrap: anywhere;
1387
+ white-space: pre-wrap;
1388
+ }
1389
+
1390
+ /* Basic JSON syntax highlighting for event payloads. */
1391
+ .json-key { color: var(--accent-deep); }
1392
+ .json-str { color: var(--success); }
1393
+ .json-num { color: var(--purple); }
1394
+ .json-bool,
1395
+ .json-null { color: var(--warning); }
1396
+
1397
+ /* List view — compact rows */
1398
+
1399
+ .event-row {
1400
+ display: block;
1401
+ width: 100%;
1402
+ padding: 10px 8px;
1403
+ border: 1px solid transparent;
1404
+ border-radius: var(--radius-small);
1405
+ background: transparent;
1406
+ text-align: start;
1407
+ cursor: pointer;
1408
+ }
1409
+
1410
+ .event-row + .event-row {
1411
+ border-top: 1px solid var(--line);
1412
+ border-radius: 0;
1413
+ }
1414
+
1415
+ .event-row:hover {
1416
+ background: var(--hover);
1417
+ border-color: transparent;
1418
+ }
1419
+
1420
+ .event-row.selected {
1421
+ background: var(--accent-soft);
1422
+ border-color: color-mix(in srgb, var(--accent) 45%, transparent);
1423
+ border-radius: var(--radius-small);
1424
+ }
1425
+
1426
+ .event-row-top {
1427
+ display: flex;
1428
+ align-items: baseline;
1429
+ justify-content: space-between;
1430
+ gap: 10px;
1431
+ }
1432
+
1433
+ .event-row-type {
1434
+ min-width: 0;
1435
+ overflow: hidden;
1436
+ font-family: "SFMono-Regular", Consolas, monospace;
1437
+ font-size: 13px;
1438
+ text-overflow: ellipsis;
1439
+ white-space: nowrap;
1440
+ }
1441
+
1442
+ .event-row-time {
1443
+ flex: 0 0 auto;
1444
+ color: var(--ink-faint);
1445
+ font-size: 12px;
1446
+ }
1447
+
1448
+ .event-row-summary {
1449
+ margin-top: 3px;
1450
+ color: var(--ink-soft);
1451
+ font-size: 12px;
1452
+ }
1453
+
1454
+ .event-row-run {
1455
+ margin-top: 2px;
1456
+ color: var(--ink-faint);
1457
+ font-family: "SFMono-Regular", Consolas, monospace;
1458
+ font-size: 11px;
1459
+ }
1460
+
1461
+ .cat-invocation { color: var(--accent); }
1462
+ .cat-sessions { color: var(--success); }
1463
+ .cat-memory { color: var(--purple); }
1464
+ .cat-system { color: var(--ink-soft); }
1465
+ .cat-error { color: var(--danger); }
1466
+
1467
+ /* Event detail — bottom pane in list view */
1468
+
1469
+ .event-detail {
1470
+ flex: 0 0 auto;
1471
+ max-height: 40%;
1472
+ overflow: auto;
1473
+ padding: 12px 14px;
1474
+ border-top: 1px solid var(--line);
1475
+ background: var(--surface-muted);
1476
+ }
1477
+
1478
+ .event-detail[hidden] {
1479
+ display: none;
1480
+ }
1481
+
1482
+ .event-detail-head {
1483
+ display: flex;
1484
+ align-items: center;
1485
+ gap: 8px;
1486
+ margin-bottom: 8px;
1487
+ }
1488
+
1489
+ .event-detail-head span {
1490
+ flex: 1;
1491
+ font-size: 12px;
1492
+ font-weight: 600;
1493
+ color: var(--ink-soft);
1494
+ }
1495
+
1496
+ .event-detail pre {
1497
+ margin: 0;
1498
+ padding: 13px 15px;
1499
+ border: 1px solid var(--line);
1500
+ border-radius: var(--radius-small);
1501
+ background: var(--surface-raised);
1502
+ color: var(--ink);
1503
+ font-family: "SFMono-Regular", Consolas, monospace;
1504
+ font-size: 11px;
1505
+ line-height: 1.5;
1506
+ overflow-wrap: anywhere;
1507
+ white-space: pre-wrap;
1508
+ }
1509
+
1510
+ .sr-only {
1511
+ width: 1px;
1512
+ height: 1px;
1513
+ padding: 0;
1514
+ margin: -1px;
1515
+ overflow: hidden;
1516
+ clip: rect(0, 0, 0, 0);
1517
+ white-space: nowrap;
1518
+ border: 0;
1519
+ position: absolute;
1520
+ }
1521
+
1522
+ @keyframes blink {
1523
+ 0%, 45% { opacity: 1; }
1524
+ 46%, 100% { opacity: 0; }
1525
+ }
1526
+
1527
+ /* -------------------------------------------------------------------------- */
1528
+ /* Responsive */
1529
+ /* -------------------------------------------------------------------------- */
1530
+
1531
+ @media (min-width: 1181px) {
1532
+ html,
1533
+ body,
1534
+ .app-shell {
1535
+ height: 100%;
1536
+ overflow: hidden;
1537
+ }
1538
+
1539
+ .workspace {
1540
+ height: calc(100vh - 87px);
1541
+ min-height: 0;
1542
+ }
1543
+
1544
+ .left-rail,
1545
+ .right-rail {
1546
+ min-height: 0;
1547
+ overflow: hidden;
1548
+ }
1549
+
1550
+ .chat-panel {
1551
+ height: 100%;
1552
+ min-height: 0;
1553
+ }
1554
+ }
1555
+
1556
+ @media (max-width: 1180px) {
1557
+ .workspace {
1558
+ grid-template-columns: minmax(280px, 1fr) minmax(440px, 1.9fr);
1559
+ }
1560
+
1561
+ .right-rail {
1562
+ grid-column: 1 / -1;
1563
+ }
1564
+
1565
+ .event-card {
1566
+ min-height: 320px;
1567
+ }
1568
+ }
1569
+
1570
+ @media (max-width: 820px) {
1571
+ .topbar {
1572
+ height: auto;
1573
+ padding: 12px 16px;
1574
+ }
1575
+
1576
+ .workspace {
1577
+ display: flex;
1578
+ flex-direction: column;
1579
+ padding: 10px;
1580
+ }
1581
+
1582
+ .chat-panel {
1583
+ min-height: 680px;
1584
+ order: -1;
1585
+ }
1586
+ }
1587
+
1588
+ @media (max-width: 560px) {
1589
+ .chat-log {
1590
+ padding: 18px 14px;
1591
+ }
1592
+
1593
+ .approval-panel,
1594
+ .composer-footer {
1595
+ align-items: stretch;
1596
+ flex-direction: column;
1597
+ }
1598
+
1599
+ .mode-switcher {
1600
+ display: grid;
1601
+ grid-template-columns: repeat(3, 1fr);
1602
+ }
1603
+ }
1604
+
1605
+ /* -------------------------------------------------------------------------- */
1606
+ /* Memory pane (left rail sub-view) */
1607
+ /* -------------------------------------------------------------------------- */
1608
+
1609
+ .memory-pane {
1610
+ flex: 1 1 auto;
1611
+ min-height: 0;
1612
+ display: flex;
1613
+ flex-direction: column;
1614
+ }
1615
+
1616
+ /* `hidden` must win over the flex display above. */
1617
+ .memory-pane[hidden] {
1618
+ display: none;
1619
+ }
1620
+
1621
+ /* When the memory pane is open, keep the sessions list compact at the bottom. */
1622
+ .left-card.memory-open .sessions-block {
1623
+ flex: 0 0 auto;
1624
+ }
1625
+
1626
+ .left-card.memory-open .sessions-block .session-list {
1627
+ max-height: 150px;
1628
+ }
1629
+
1630
+ .memory-pane .panel-subhead h2 {
1631
+ flex: 1;
1632
+ }
1633
+
1634
+ .memory-store {
1635
+ display: flex;
1636
+ align-items: center;
1637
+ gap: 10px;
1638
+ margin-bottom: 10px;
1639
+ padding: 10px 12px;
1640
+ border: 1px solid var(--line);
1641
+ border-radius: var(--radius-small);
1642
+ background: var(--surface-muted);
1643
+ }
1644
+
1645
+ .memory-store-icon {
1646
+ width: 26px;
1647
+ height: 26px;
1648
+ flex: 0 0 auto;
1649
+ display: grid;
1650
+ place-items: center;
1651
+ color: var(--accent);
1652
+ }
1653
+
1654
+ .memory-store-icon .icon {
1655
+ width: 20px;
1656
+ height: 20px;
1657
+ }
1658
+
1659
+ .memory-store-copy {
1660
+ min-width: 0;
1661
+ }
1662
+
1663
+ .memory-store-copy strong {
1664
+ display: block;
1665
+ overflow: hidden;
1666
+ font-size: 13px;
1667
+ font-weight: 600;
1668
+ text-overflow: ellipsis;
1669
+ white-space: nowrap;
1670
+ }
1671
+
1672
+ .memory-store-copy span {
1673
+ display: block;
1674
+ overflow: hidden;
1675
+ color: var(--ink-faint);
1676
+ font-family: "SFMono-Regular", Consolas, monospace;
1677
+ font-size: 11px;
1678
+ text-overflow: ellipsis;
1679
+ white-space: nowrap;
1680
+ }
1681
+
1682
+ .memory-field-label {
1683
+ display: block;
1684
+ margin-bottom: 2px;
1685
+ color: var(--ink);
1686
+ font-size: 12px;
1687
+ font-weight: 600;
1688
+ }
1689
+
1690
+ .memory-field-hint {
1691
+ margin: 0 0 6px;
1692
+ color: var(--ink-soft);
1693
+ font-size: 12px;
1694
+ line-height: 1.4;
1695
+ }
1696
+
1697
+ .memory-actor {
1698
+ width: 100%;
1699
+ margin-bottom: 8px;
1700
+ padding: 8px 10px;
1701
+ border: 1px solid var(--line);
1702
+ border-radius: var(--radius-small);
1703
+ background: var(--surface-muted);
1704
+ color: var(--ink);
1705
+ font-family: "SFMono-Regular", Consolas, monospace;
1706
+ font-size: 12px;
1707
+ }
1708
+
1709
+ .memory-search {
1710
+ position: relative;
1711
+ display: flex;
1712
+ align-items: center;
1713
+ margin-bottom: 8px;
1714
+ }
1715
+
1716
+ .memory-search .icon {
1717
+ position: absolute;
1718
+ left: 10px;
1719
+ width: 15px;
1720
+ height: 15px;
1721
+ color: var(--ink-faint);
1722
+ pointer-events: none;
1723
+ }
1724
+
1725
+ .memory-search input {
1726
+ width: 100%;
1727
+ padding: 8px 10px 8px 31px;
1728
+ border: 1px solid var(--line);
1729
+ border-radius: var(--radius-small);
1730
+ background: var(--surface-muted);
1731
+ color: var(--ink);
1732
+ font-size: 13px;
1733
+ }
1734
+
1735
+ .memory-count {
1736
+ margin: 2px 2px 8px;
1737
+ color: var(--ink-faint);
1738
+ font-size: 12px;
1739
+ text-align: end;
1740
+ }
1741
+
1742
+ .memory-entries {
1743
+ flex: 1;
1744
+ min-height: 0;
1745
+ overflow-y: auto;
1746
+ display: flex;
1747
+ flex-direction: column;
1748
+ gap: 8px;
1749
+ margin: 0 -2px;
1750
+ padding: 0 2px 2px;
1751
+ }
1752
+
1753
+ .memory-entry {
1754
+ display: block;
1755
+ width: 100%;
1756
+ padding: 11px 12px;
1757
+ border: 1px solid var(--line);
1758
+ border-radius: var(--radius-small);
1759
+ background: var(--surface-raised);
1760
+ text-align: start;
1761
+ cursor: pointer;
1762
+ }
1763
+
1764
+ .memory-entry:hover {
1765
+ border-color: var(--line-strong);
1766
+ background: var(--hover);
1767
+ }
1768
+
1769
+ .memory-entry-top {
1770
+ display: flex;
1771
+ align-items: center;
1772
+ gap: 8px;
1773
+ }
1774
+
1775
+ .memory-entry-path {
1776
+ flex: 1;
1777
+ min-width: 0;
1778
+ overflow: hidden;
1779
+ font-family: "SFMono-Regular", Consolas, monospace;
1780
+ font-size: 13px;
1781
+ text-overflow: ellipsis;
1782
+ white-space: nowrap;
1783
+ }
1784
+
1785
+ .memory-entry-expand {
1786
+ flex: 0 0 auto;
1787
+ width: 15px;
1788
+ height: 15px;
1789
+ color: var(--ink-faint);
1790
+ }
1791
+
1792
+ .memory-entry-preview {
1793
+ margin: 6px 0 0;
1794
+ color: var(--ink-soft);
1795
+ font-size: 12px;
1796
+ line-height: 1.45;
1797
+ display: -webkit-box;
1798
+ -webkit-line-clamp: 2;
1799
+ -webkit-box-orient: vertical;
1800
+ overflow: hidden;
1801
+ }
1802
+
1803
+ .memory-entry-foot {
1804
+ display: flex;
1805
+ align-items: baseline;
1806
+ justify-content: space-between;
1807
+ gap: 10px;
1808
+ margin-top: 8px;
1809
+ }
1810
+
1811
+ .memory-entry-actor {
1812
+ min-width: 0;
1813
+ overflow: hidden;
1814
+ color: var(--ink-faint);
1815
+ font-size: 11px;
1816
+ text-overflow: ellipsis;
1817
+ white-space: nowrap;
1818
+ }
1819
+
1820
+ .memory-entry-time {
1821
+ flex: 0 0 auto;
1822
+ color: var(--ink-faint);
1823
+ font-size: 11px;
1824
+ }
1825
+
1826
+ .memory-empty,
1827
+ .memory-loading,
1828
+ .memory-error {
1829
+ padding: 16px 4px;
1830
+ color: var(--ink-soft);
1831
+ font-size: 12px;
1832
+ line-height: 1.5;
1833
+ }
1834
+
1835
+ .memory-error {
1836
+ color: var(--danger);
1837
+ }
1838
+
1839
+ /* -------------------------------------------------------------------------- */
1840
+ /* Memory modal */
1841
+ /* -------------------------------------------------------------------------- */
1842
+
1843
+ .modal-backdrop {
1844
+ position: fixed;
1845
+ inset: 0;
1846
+ z-index: 50;
1847
+ display: flex;
1848
+ align-items: center;
1849
+ justify-content: center;
1850
+ padding: 24px;
1851
+ background: rgba(15, 23, 42, 0.32);
1852
+ }
1853
+
1854
+ .modal-backdrop[hidden] {
1855
+ display: none;
1856
+ }
1857
+
1858
+ .modal-card {
1859
+ width: min(560px, 100%);
1860
+ max-height: min(80vh, 640px);
1861
+ display: flex;
1862
+ flex-direction: column;
1863
+ border-radius: var(--radius-large);
1864
+ background: var(--surface);
1865
+ box-shadow: 0 24px 60px rgba(15, 23, 42, 0.28);
1866
+ overflow: hidden;
1867
+ }
1868
+
1869
+ .modal-head {
1870
+ display: flex;
1871
+ align-items: center;
1872
+ gap: 12px;
1873
+ padding: 14px 12px 14px 18px;
1874
+ border-bottom: 1px solid var(--line);
1875
+ }
1876
+
1877
+ .modal-title {
1878
+ flex: 1;
1879
+ min-width: 0;
1880
+ overflow: hidden;
1881
+ font-family: "SFMono-Regular", Consolas, monospace;
1882
+ font-size: 14px;
1883
+ font-weight: 600;
1884
+ text-overflow: ellipsis;
1885
+ white-space: nowrap;
1886
+ }
1887
+
1888
+ .modal-body {
1889
+ min-height: 0;
1890
+ overflow: auto;
1891
+ padding: 16px 18px;
1892
+ }
1893
+
1894
+ .modal-body pre {
1895
+ margin: 0;
1896
+ padding: 12px 14px;
1897
+ border-radius: var(--radius-small);
1898
+ background: var(--surface-muted);
1899
+ color: var(--ink);
1900
+ font-family: "SFMono-Regular", Consolas, monospace;
1901
+ font-size: 12px;
1902
+ line-height: 1.55;
1903
+ overflow-wrap: anywhere;
1904
+ white-space: pre-wrap;
1905
+ }
1906
+
1907
+ .modal-foot {
1908
+ flex: 0 0 auto;
1909
+ padding: 12px 18px;
1910
+ border-top: 1px solid var(--line);
1911
+ color: var(--ink-faint);
1912
+ font-size: 12px;
1913
+ }