@lmctl-ai/lmctl 0.2.37 → 0.2.39

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 (199) hide show
  1. package/README.md +16 -0
  2. package/THIRD_PARTY_NOTICES.md +35 -0
  3. package/bin/lmbee +2 -0
  4. package/bin/lmscript +3 -0
  5. package/build-info.json +1 -0
  6. package/dist/cli/index.js +569 -494
  7. package/dist/cli/schema.sql +0 -169
  8. package/dist/cli/script.js +273 -266
  9. package/dist/lmbee.js +960 -0
  10. package/dist/lmscript.js +388 -0
  11. package/dist/public/app.js +379 -0
  12. package/dist/public/index.html +78 -0
  13. package/dist/public/styles.css +160 -0
  14. package/dist/schema.sql +455 -0
  15. package/dist/vendor-webui/index.html +18 -0
  16. package/dist/vendor-webui/local.js +231 -0
  17. package/dist/vendor-webui/styles.css +1852 -0
  18. package/package.json +12 -7
  19. package/dist/cli/batch.d.ts +0 -2
  20. package/dist/cli/busy-evidence.d.ts +0 -27
  21. package/dist/cli/chat-cycle.d.ts +0 -59
  22. package/dist/cli/chat-exec.d.ts +0 -91
  23. package/dist/cli/chat-policy.d.ts +0 -22
  24. package/dist/cli/chat.d.ts +0 -14
  25. package/dist/cli/code-resolver.d.ts +0 -8
  26. package/dist/cli/common.d.ts +0 -57
  27. package/dist/cli/context.d.ts +0 -12
  28. package/dist/cli/cost.d.ts +0 -2
  29. package/dist/cli/export.d.ts +0 -2
  30. package/dist/cli/hello.d.ts +0 -10
  31. package/dist/cli/index.d.ts +0 -3
  32. package/dist/cli/infra.d.ts +0 -78
  33. package/dist/cli/init.d.ts +0 -21
  34. package/dist/cli/intent-input.d.ts +0 -16
  35. package/dist/cli/intent-match.d.ts +0 -30
  36. package/dist/cli/intent-sessions.d.ts +0 -24
  37. package/dist/cli/intent-team.d.ts +0 -25
  38. package/dist/cli/intent.d.ts +0 -22
  39. package/dist/cli/ls.d.ts +0 -2
  40. package/dist/cli/mailbox-cli.d.ts +0 -6
  41. package/dist/cli/managed.d.ts +0 -62
  42. package/dist/cli/mcp-install.d.ts +0 -23
  43. package/dist/cli/mcp.d.ts +0 -2
  44. package/dist/cli/model.d.ts +0 -21
  45. package/dist/cli/paths.d.ts +0 -50
  46. package/dist/cli/plan-wizard.d.ts +0 -42
  47. package/dist/cli/plan.d.ts +0 -20
  48. package/dist/cli/queue-delivery.d.ts +0 -122
  49. package/dist/cli/quickrun.d.ts +0 -14
  50. package/dist/cli/ratelimit.d.ts +0 -2
  51. package/dist/cli/remote-fetch.d.ts +0 -7
  52. package/dist/cli/run-queries.d.ts +0 -82
  53. package/dist/cli/running.d.ts +0 -5
  54. package/dist/cli/save-script.d.ts +0 -41
  55. package/dist/cli/script.d.ts +0 -6
  56. package/dist/cli/seed-flight.d.ts +0 -2
  57. package/dist/cli/self-identity.d.ts +0 -25
  58. package/dist/cli/session-idle.d.ts +0 -118
  59. package/dist/cli/status.d.ts +0 -22
  60. package/dist/cli/tail.d.ts +0 -18
  61. package/dist/cli/target-resolver.d.ts +0 -139
  62. package/dist/cli/team-status.d.ts +0 -91
  63. package/dist/cli/teamfile-compat.d.ts +0 -116
  64. package/dist/cli/teamfile-store.d.ts +0 -18
  65. package/dist/cli/teamfile-template.d.ts +0 -47
  66. package/dist/cli/template-env.d.ts +0 -25
  67. package/dist/cli/terminal-lock.d.ts +0 -25
  68. package/dist/cli/terminal.d.ts +0 -23
  69. package/dist/cli/time-filter.d.ts +0 -10
  70. package/dist/cli/update-notifier.d.ts +0 -11
  71. package/dist/cli/version-util.d.ts +0 -23
  72. package/dist/config/seed_templates.d.ts +0 -1
  73. package/dist/db/backfill-event-log.d.ts +0 -26
  74. package/dist/db/delegation.d.ts +0 -37
  75. package/dist/db/escalation_vocab.d.ts +0 -45
  76. package/dist/db/event-log.d.ts +0 -40
  77. package/dist/db/index.d.ts +0 -1213
  78. package/dist/db/inflight-acquire.d.ts +0 -70
  79. package/dist/db/invocation-event-projections.d.ts +0 -65
  80. package/dist/db/ledger-identity.test.d.ts +0 -1
  81. package/dist/db/live-event-projections.d.ts +0 -92
  82. package/dist/db/migrate.d.ts +0 -51
  83. package/dist/db/open-readonly.d.ts +0 -2
  84. package/dist/db/process-liveness.d.ts +0 -37
  85. package/dist/db/sqlite.d.ts +0 -53
  86. package/dist/db/sqlite.test.d.ts +0 -1
  87. package/dist/db/terminal-lock.d.ts +0 -14
  88. package/dist/db/tracked-invocation-reconcile.d.ts +0 -52
  89. package/dist/db/tracked-invocation.d.ts +0 -116
  90. package/dist/mcp/dispatch.d.ts +0 -45
  91. package/dist/mcp/mediation.d.ts +0 -128
  92. package/dist/mcp/path-warning.d.ts +0 -7
  93. package/dist/mcp/server.d.ts +0 -63
  94. package/dist/mcp/tools.d.ts +0 -24
  95. package/dist/providers/adapter.d.ts +0 -271
  96. package/dist/providers/adapters/agy-adapter.d.ts +0 -18
  97. package/dist/providers/adapters/claude-adapter.d.ts +0 -20
  98. package/dist/providers/adapters/codex-adapter.d.ts +0 -22
  99. package/dist/providers/adapters/copilot-adapter.d.ts +0 -16
  100. package/dist/providers/adapters/dsh-adapter.d.ts +0 -89
  101. package/dist/providers/adapters/gemini-adapter.d.ts +0 -44
  102. package/dist/providers/adapters/hermes-adapter.d.ts +0 -71
  103. package/dist/providers/adapters/index.d.ts +0 -35
  104. package/dist/providers/adapters/kimi-adapter.d.ts +0 -16
  105. package/dist/providers/adapters/lmplayer-adapter.d.ts +0 -14
  106. package/dist/providers/adapters/opencode-adapter.d.ts +0 -11
  107. package/dist/providers/adapters/pi-adapter.d.ts +0 -17
  108. package/dist/providers/adapters/print-turn.d.ts +0 -29
  109. package/dist/providers/adapters/qwen-adapter.d.ts +0 -11
  110. package/dist/providers/agy.d.ts +0 -32
  111. package/dist/providers/base-adapter.d.ts +0 -110
  112. package/dist/providers/base.d.ts +0 -12
  113. package/dist/providers/binary-check.d.ts +0 -102
  114. package/dist/providers/bundle.d.ts +0 -124
  115. package/dist/providers/claude-mock.d.ts +0 -90
  116. package/dist/providers/claude.d.ts +0 -21
  117. package/dist/providers/codex-config.d.ts +0 -15
  118. package/dist/providers/codex.d.ts +0 -25
  119. package/dist/providers/config/init-config.d.ts +0 -43
  120. package/dist/providers/config/model-selection-lint.d.ts +0 -70
  121. package/dist/providers/config/team-config.d.ts +0 -184
  122. package/dist/providers/config/types.d.ts +0 -146
  123. package/dist/providers/config/user-config.d.ts +0 -88
  124. package/dist/providers/copilot.d.ts +0 -21
  125. package/dist/providers/debug.d.ts +0 -128
  126. package/dist/providers/dsh-sidecar.d.ts +0 -65
  127. package/dist/providers/dsh-zstd.d.ts +0 -27
  128. package/dist/providers/dsh.d.ts +0 -37
  129. package/dist/providers/frontmatter.d.ts +0 -46
  130. package/dist/providers/gemini-session-reader.d.ts +0 -151
  131. package/dist/providers/gemini.d.ts +0 -39
  132. package/dist/providers/hermes.d.ts +0 -90
  133. package/dist/providers/index.d.ts +0 -423
  134. package/dist/providers/kimi.d.ts +0 -37
  135. package/dist/providers/model-catalog.d.ts +0 -145
  136. package/dist/providers/model-suggestions.d.ts +0 -4
  137. package/dist/providers/one-shot-timeout.d.ts +0 -1
  138. package/dist/providers/opencode-config.d.ts +0 -62
  139. package/dist/providers/opencode.d.ts +0 -40
  140. package/dist/providers/parsers/acp.d.ts +0 -71
  141. package/dist/providers/parsers/codex-app-server.d.ts +0 -60
  142. package/dist/providers/parsers/stream-json.d.ts +0 -57
  143. package/dist/providers/passive-readers/agy.d.ts +0 -155
  144. package/dist/providers/passive-readers/copilot.d.ts +0 -173
  145. package/dist/providers/passive-readers/dsh.d.ts +0 -34
  146. package/dist/providers/passive-readers/kimi.d.ts +0 -44
  147. package/dist/providers/passive-readers/opencode.d.ts +0 -89
  148. package/dist/providers/passive-readers/qwen.d.ts +0 -151
  149. package/dist/providers/passive-readers/shared.d.ts +0 -138
  150. package/dist/providers/passive-session-reader.d.ts +0 -188
  151. package/dist/providers/path-utils.d.ts +0 -1
  152. package/dist/providers/pi.d.ts +0 -32
  153. package/dist/providers/pricing.d.ts +0 -107
  154. package/dist/providers/qwen.d.ts +0 -22
  155. package/dist/providers/ratelimit/agy.d.ts +0 -22
  156. package/dist/providers/ratelimit/claude-auth.d.ts +0 -13
  157. package/dist/providers/ratelimit/claude.d.ts +0 -6
  158. package/dist/providers/ratelimit/codex.d.ts +0 -7
  159. package/dist/providers/ratelimit/kimi-auth.d.ts +0 -15
  160. package/dist/providers/ratelimit/kimi.d.ts +0 -6
  161. package/dist/providers/ratelimit/schema.d.ts +0 -28
  162. package/dist/providers/ratelimit-readings.d.ts +0 -19
  163. package/dist/providers/registry.d.ts +0 -31
  164. package/dist/providers/resume.d.ts +0 -43
  165. package/dist/providers/seed-instruction.d.ts +0 -3
  166. package/dist/providers/self-session-env.d.ts +0 -21
  167. package/dist/providers/session-limit.d.ts +0 -9
  168. package/dist/providers/strip-ansi.d.ts +0 -5
  169. package/dist/providers/transport-errors.d.ts +0 -94
  170. package/dist/providers/transport-lifecycle.d.ts +0 -63
  171. package/dist/providers/transport-wrappers.d.ts +0 -110
  172. package/dist/providers/transports/acp-profiles/config-option-step.d.ts +0 -24
  173. package/dist/providers/transports/acp-profiles/copilot.d.ts +0 -12
  174. package/dist/providers/transports/acp-profiles/gemini.d.ts +0 -22
  175. package/dist/providers/transports/acp-profiles/hermes.d.ts +0 -27
  176. package/dist/providers/transports/acp-profiles/index.d.ts +0 -19
  177. package/dist/providers/transports/acp-profiles/kimi.d.ts +0 -24
  178. package/dist/providers/transports/acp-profiles/opencode.d.ts +0 -26
  179. package/dist/providers/transports/acp-profiles/types.d.ts +0 -258
  180. package/dist/providers/transports/acp-rpc.d.ts +0 -18
  181. package/dist/providers/transports/acp.d.ts +0 -217
  182. package/dist/providers/transports/codex-app-server.d.ts +0 -190
  183. package/dist/providers/transports/hold-open.d.ts +0 -120
  184. package/dist/providers/transports/manager.d.ts +0 -21
  185. package/dist/providers/transports/stream-json.d.ts +0 -162
  186. package/dist/providers/transports/types.d.ts +0 -56
  187. package/dist/providers/types.d.ts +0 -154
  188. package/dist/providers/yolo-contract.d.ts +0 -131
  189. package/dist/script/adapter.d.ts +0 -104
  190. package/dist/script/batch-script.d.ts +0 -7
  191. package/dist/script/index.d.ts +0 -3
  192. package/dist/script/lmbee-module.d.ts +0 -2
  193. package/dist/script/lmscript.d.ts +0 -616
  194. package/dist/shared/policy.d.ts +0 -74
  195. package/dist/shared-lib/db.d.ts +0 -25
  196. package/dist/shared-lib/passive-session-reader.d.ts +0 -2
  197. package/dist/shared-lib/provider-parse.d.ts +0 -6
  198. package/dist/templates/basedir.d.ts +0 -52
  199. package/dist/uri/lmctl_uri.d.ts +0 -38
@@ -0,0 +1,1852 @@
1
+ :root {
2
+ color-scheme: light;
3
+ font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
4
+ --bg: #f7f7f4;
5
+ --panel: #ffffff;
6
+ --panel-2: #efeee9;
7
+ --ink: #1f2723;
8
+ --muted: #64706a;
9
+ --line: #d7d8d2;
10
+ --accent: #2e7d6b;
11
+ --accent-2: #315f9d;
12
+ --warn: #b4771f;
13
+ --bad: #ba3d3d;
14
+ --good: #2f7d4f;
15
+ }
16
+
17
+ * {
18
+ box-sizing: border-box;
19
+ }
20
+
21
+ [hidden] {
22
+ display: none !important;
23
+ }
24
+
25
+ html,
26
+ body {
27
+ height: 100%;
28
+ margin: 0;
29
+ }
30
+
31
+ /* min-height, not height: pages that now render a .session-header as a sibling
32
+ of #app (device/admin-usage) would otherwise force #app to exactly 100% of
33
+ the viewport ON TOP OF the header's own height, overflowing the page. */
34
+ #app {
35
+ min-height: 100%;
36
+ }
37
+
38
+ body {
39
+ background: var(--bg);
40
+ color: var(--ink);
41
+ }
42
+
43
+ button,
44
+ select,
45
+ input,
46
+ textarea {
47
+ font: inherit;
48
+ }
49
+
50
+ button {
51
+ border: 1px solid var(--line);
52
+ background: var(--panel);
53
+ color: var(--ink);
54
+ border-radius: 6px;
55
+ min-height: 32px;
56
+ padding: 0 10px;
57
+ cursor: pointer;
58
+ }
59
+
60
+ button:hover {
61
+ border-color: var(--accent);
62
+ }
63
+
64
+ button[data-active="true"] {
65
+ background: var(--accent);
66
+ border-color: var(--accent);
67
+ color: white;
68
+ }
69
+
70
+ .app-shell {
71
+ display: grid;
72
+ grid-template-columns: 280px minmax(0, 1fr) 340px;
73
+ grid-template-rows: minmax(0, 1fr) 220px;
74
+ height: 100%;
75
+ min-width: 960px;
76
+ }
77
+
78
+ .runtime-shell {
79
+ display: grid;
80
+ grid-template-rows: 56px minmax(0, 1fr);
81
+ height: 100%;
82
+ min-width: 0;
83
+ }
84
+
85
+ .top-tabs {
86
+ align-items: center;
87
+ background: var(--panel);
88
+ border-bottom: 1px solid var(--line);
89
+ display: flex;
90
+ justify-content: space-between;
91
+ padding: 0 16px;
92
+ }
93
+
94
+ .top-tabs > div {
95
+ display: flex;
96
+ flex-direction: column;
97
+ gap: 2px;
98
+ }
99
+
100
+ .top-tabs span,
101
+ .muted {
102
+ color: var(--muted);
103
+ font-size: 13px;
104
+ }
105
+
106
+ .top-tabs nav {
107
+ display: flex;
108
+ gap: 8px;
109
+ overflow-x: auto;
110
+ padding: 6px 0;
111
+ }
112
+
113
+ .top-tab {
114
+ min-width: 92px;
115
+ }
116
+
117
+ .two-column {
118
+ display: grid;
119
+ grid-template-columns: 300px minmax(0, 1fr);
120
+ min-height: 0;
121
+ }
122
+
123
+ .left-panel {
124
+ background: var(--panel);
125
+ border-right: 1px solid var(--line);
126
+ overflow: auto;
127
+ padding: 16px;
128
+ }
129
+
130
+ .left-panel h2,
131
+ .panel-header h2,
132
+ .manager-drawer h2 {
133
+ font-size: 18px;
134
+ margin: 0 0 6px;
135
+ }
136
+
137
+ .console-impersonation-banner {
138
+ background: #fff3dc;
139
+ border: 1px solid var(--warn);
140
+ border-left: 4px solid var(--warn);
141
+ border-radius: 8px;
142
+ display: grid;
143
+ gap: 10px;
144
+ margin: 12px 16px 0;
145
+ padding: 12px;
146
+ }
147
+
148
+ .impersonation-banner-message {
149
+ color: #5f3f00;
150
+ margin: 0;
151
+ font-weight: 700;
152
+ }
153
+
154
+ .impersonation-banner-actions {
155
+ display: flex;
156
+ gap: 8px;
157
+ align-items: center;
158
+ }
159
+
160
+
161
+ .list-button {
162
+ display: block;
163
+ height: auto;
164
+ margin-bottom: 8px;
165
+ padding: 10px;
166
+ text-align: left;
167
+ width: 100%;
168
+ }
169
+
170
+ .list-button strong,
171
+ .list-button span {
172
+ display: block;
173
+ }
174
+
175
+ .list-button span {
176
+ color: var(--muted);
177
+ font-size: 12px;
178
+ line-height: 1.4;
179
+ margin-top: 4px;
180
+ }
181
+
182
+ .chat-panel,
183
+ .project-shell {
184
+ min-height: 0;
185
+ overflow: hidden;
186
+ }
187
+
188
+ .chat-panel {
189
+ display: grid;
190
+ grid-template-rows: auto minmax(0, 1fr) auto;
191
+ padding: 16px;
192
+ }
193
+
194
+ .panel-header,
195
+ .workspace-heading {
196
+ align-items: flex-start;
197
+ display: flex;
198
+ gap: 12px;
199
+ justify-content: space-between;
200
+ }
201
+
202
+ .context-pill {
203
+ background: #e7f0ec;
204
+ border: 1px solid rgba(46, 125, 107, 0.24);
205
+ border-radius: 999px;
206
+ color: var(--accent);
207
+ font-size: 12px;
208
+ max-width: 460px;
209
+ overflow-wrap: anywhere;
210
+ padding: 6px 10px;
211
+ }
212
+
213
+ .workspace-layout,
214
+ .admin-layout {
215
+ height: 100%;
216
+ }
217
+
218
+ .project-shell {
219
+ display: grid;
220
+ grid-template-columns: minmax(0, 1fr) auto;
221
+ min-width: 0;
222
+ }
223
+
224
+ .project-panel {
225
+ display: grid;
226
+ grid-template-rows: auto 38vh minmax(0, 1fr) auto;
227
+ min-width: 0;
228
+ min-height: 0;
229
+ overflow: hidden;
230
+ padding: 16px;
231
+ }
232
+
233
+ .project-graph {
234
+ border: 1px solid var(--line);
235
+ border-radius: 8px;
236
+ margin-top: 12px;
237
+ min-height: 260px;
238
+ }
239
+
240
+ .history-panel {
241
+ display: grid;
242
+ gap: 14px;
243
+ grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr);
244
+ min-height: 0;
245
+ overflow: hidden;
246
+ padding: 14px 0;
247
+ }
248
+
249
+ .project-shell[data-manager-open="true"] .history-panel {
250
+ grid-template-columns: minmax(0, 1fr);
251
+ }
252
+
253
+ .history-panel > div,
254
+ .chat-history {
255
+ min-height: 0;
256
+ overflow: auto;
257
+ }
258
+
259
+ .chat-message {
260
+ background: var(--panel);
261
+ border: 1px solid var(--line);
262
+ border-radius: 8px;
263
+ margin-bottom: 10px;
264
+ padding: 10px 12px;
265
+ }
266
+
267
+ .chat-message[data-role="system"],
268
+ .chat-message[data-role="event"] {
269
+ background: #f1f0ea;
270
+ }
271
+
272
+ .chat-message header {
273
+ align-items: center;
274
+ display: flex;
275
+ gap: 10px;
276
+ justify-content: space-between;
277
+ }
278
+
279
+ .chat-message header span,
280
+ .chat-message small {
281
+ color: var(--muted);
282
+ font-size: 12px;
283
+ }
284
+
285
+ .chat-message p {
286
+ line-height: 1.45;
287
+ margin: 8px 0 0;
288
+ }
289
+
290
+ .composer {
291
+ align-items: flex-end;
292
+ background: var(--panel);
293
+ border: 1px solid var(--line);
294
+ border-radius: 8px;
295
+ display: grid;
296
+ gap: 10px;
297
+ grid-template-columns: minmax(0, 1fr) auto;
298
+ padding: 12px;
299
+ }
300
+
301
+ .composer label,
302
+ .composer span,
303
+ .composer textarea {
304
+ display: block;
305
+ width: 100%;
306
+ }
307
+
308
+ .composer span {
309
+ color: var(--muted);
310
+ font-size: 12px;
311
+ margin-bottom: 6px;
312
+ }
313
+
314
+ .composer textarea {
315
+ border: 1px solid var(--line);
316
+ border-radius: 6px;
317
+ min-height: 72px;
318
+ padding: 10px;
319
+ resize: vertical;
320
+ }
321
+
322
+ .manager-drawer {
323
+ background: var(--panel);
324
+ border-left: 1px solid var(--line);
325
+ display: grid;
326
+ grid-template-rows: auto minmax(0, 1fr) auto;
327
+ padding: 16px;
328
+ width: 380px;
329
+ }
330
+
331
+ .compact-event {
332
+ grid-template-columns: 160px 130px minmax(220px, 1fr);
333
+ font-size: 12px;
334
+ min-width: 540px;
335
+ }
336
+
337
+ .playback-status {
338
+ align-self: center;
339
+ color: var(--muted);
340
+ font-size: 12px;
341
+ padding: 0 4px;
342
+ }
343
+
344
+ .sidebar,
345
+ .details,
346
+ .timeline {
347
+ background: var(--panel);
348
+ border-color: var(--line);
349
+ }
350
+
351
+ .sidebar {
352
+ border-right: 1px solid var(--line);
353
+ overflow: auto;
354
+ padding: 16px;
355
+ }
356
+
357
+ .graph-region {
358
+ position: relative;
359
+ overflow: hidden;
360
+ background:
361
+ linear-gradient(var(--line) 1px, transparent 1px),
362
+ linear-gradient(90deg, var(--line) 1px, transparent 1px);
363
+ background-color: #fbfbf8;
364
+ background-size: 28px 28px;
365
+ }
366
+
367
+ .static-graph {
368
+ max-width: 100%;
369
+ width: 100% !important;
370
+ }
371
+
372
+ .static-graph-inner {
373
+ min-width: max-content;
374
+ }
375
+
376
+ .details {
377
+ border-left: 1px solid var(--line);
378
+ overflow: auto;
379
+ padding: 16px;
380
+ }
381
+
382
+ .timeline {
383
+ grid-column: 1 / -1;
384
+ border-top: 1px solid var(--line);
385
+ overflow: hidden;
386
+ display: grid;
387
+ grid-template-columns: 420px minmax(0, 1fr);
388
+ }
389
+
390
+ .section-title {
391
+ font-size: 12px;
392
+ color: var(--muted);
393
+ text-transform: uppercase;
394
+ letter-spacing: 0;
395
+ margin: 0 0 10px;
396
+ }
397
+
398
+ .template-button,
399
+ .run-button {
400
+ width: 100%;
401
+ text-align: left;
402
+ display: block;
403
+ margin-bottom: 8px;
404
+ padding: 10px;
405
+ height: auto;
406
+ }
407
+
408
+ .template-button strong,
409
+ .run-button strong {
410
+ display: block;
411
+ font-size: 14px;
412
+ }
413
+
414
+ .template-button span,
415
+ .run-button span {
416
+ color: var(--muted);
417
+ display: block;
418
+ font-size: 12px;
419
+ line-height: 1.4;
420
+ margin-top: 4px;
421
+ }
422
+
423
+ .toolbar {
424
+ position: absolute;
425
+ top: 12px;
426
+ left: 12px;
427
+ z-index: 5;
428
+ display: flex;
429
+ gap: 8px;
430
+ background: rgba(255, 255, 255, 0.9);
431
+ border: 1px solid var(--line);
432
+ border-radius: 8px;
433
+ padding: 8px;
434
+ }
435
+
436
+ .graph-content {
437
+ position: absolute;
438
+ inset: 0;
439
+ transform-origin: 0 0;
440
+ }
441
+
442
+ .edge-layer {
443
+ position: absolute;
444
+ inset: 0;
445
+ overflow: visible;
446
+ pointer-events: none;
447
+ }
448
+
449
+ .edge-path {
450
+ fill: none;
451
+ stroke: #8b9690;
452
+ stroke-width: 2;
453
+ }
454
+
455
+ .edge-path[data-back-edge="true"] {
456
+ stroke-dasharray: 6 5;
457
+ opacity: 0.45;
458
+ }
459
+
460
+ .edge-path[data-status="active"] {
461
+ stroke: var(--accent-2);
462
+ stroke-width: 3;
463
+ }
464
+
465
+ .edge-path[data-status="traversed"] {
466
+ stroke: var(--good);
467
+ stroke-width: 3;
468
+ }
469
+
470
+ .edge-path[data-status="failed"] {
471
+ stroke: var(--bad);
472
+ stroke-width: 3;
473
+ }
474
+
475
+ .node {
476
+ position: absolute;
477
+ width: 190px;
478
+ min-height: 54px;
479
+ border: 2px solid var(--line);
480
+ border-radius: 8px;
481
+ background: var(--panel);
482
+ box-shadow: 0 6px 18px rgba(31, 39, 35, 0.08);
483
+ padding: 14px 14px;
484
+ cursor: pointer;
485
+ overflow: visible;
486
+ }
487
+
488
+ .node[data-selected="true"] {
489
+ outline: 3px solid rgba(46, 125, 107, 0.24);
490
+ border-color: var(--accent);
491
+ }
492
+
493
+ .node[data-visual-state="not-reached"] {
494
+ background: #f4f4f0;
495
+ color: #737d78;
496
+ border-color: #d7d8d2;
497
+ }
498
+
499
+ .node[data-visual-state="work-in-progress"] {
500
+ background: #e9f1fb;
501
+ border-color: var(--accent-2);
502
+ }
503
+
504
+ .node[data-visual-state="done"] {
505
+ background: #e9f5ed;
506
+ border-color: var(--good);
507
+ }
508
+
509
+ .node[data-status="failed"] {
510
+ background: #f8e8e8;
511
+ border-color: var(--bad);
512
+ }
513
+
514
+ .node[data-visual-state="human-escalation"] {
515
+ background: #fff2dc;
516
+ border-color: var(--warn);
517
+ border-radius: 999px;
518
+ }
519
+
520
+ .node[data-emphasis="human"],
521
+ .node[data-emphasis="review"] {
522
+ box-shadow: 0 0 0 2px rgba(46, 125, 107, .16), 0 12px 24px rgba(31, 39, 35, .1);
523
+ }
524
+
525
+ .node[data-status="skipped"] {
526
+ opacity: 0.72;
527
+ }
528
+
529
+ .node[data-visual-state="work-in-progress"]::after {
530
+ animation: pulse-star 1.1s ease-in-out infinite;
531
+ color: var(--accent-2);
532
+ content: "✦";
533
+ font-size: 22px;
534
+ line-height: 1;
535
+ position: absolute;
536
+ right: -10px;
537
+ top: -12px;
538
+ }
539
+
540
+ .node-title {
541
+ font-weight: 650;
542
+ font-size: 14px;
543
+ overflow-wrap: anywhere;
544
+ }
545
+
546
+ @keyframes pulse-star {
547
+ 0%, 100% { transform: scale(0.75) rotate(-8deg); opacity: 0.65; }
548
+ 50% { transform: scale(1.28) rotate(8deg); opacity: 1; }
549
+ }
550
+
551
+ @media (max-width: 1099px) {
552
+ html,
553
+ body,
554
+ #app {
555
+ min-width: 0;
556
+ overflow-x: hidden;
557
+ }
558
+
559
+ .runtime-shell {
560
+ grid-template-rows: auto minmax(0, 1fr);
561
+ }
562
+
563
+ .top-tabs {
564
+ align-items: stretch;
565
+ flex-direction: column;
566
+ gap: 8px;
567
+ padding: 10px 12px;
568
+ }
569
+
570
+ .top-tabs nav {
571
+ width: 100%;
572
+ }
573
+
574
+ .top-tab {
575
+ flex: 0 0 auto;
576
+ }
577
+
578
+ .two-column {
579
+ grid-template-columns: 1fr;
580
+ grid-template-rows: auto minmax(0, 1fr);
581
+ overflow: auto;
582
+ }
583
+
584
+ .left-panel {
585
+ border-bottom: 1px solid var(--line);
586
+ border-right: 0;
587
+ max-height: none;
588
+ }
589
+
590
+ .project-shell {
591
+ display: block;
592
+ overflow: visible;
593
+ }
594
+
595
+ .project-panel {
596
+ grid-template-rows: auto 320px auto auto;
597
+ overflow: visible;
598
+ }
599
+
600
+ .history-panel {
601
+ grid-template-columns: 1fr;
602
+ }
603
+
604
+ .manager-drawer {
605
+ bottom: 0;
606
+ box-shadow: 0 -12px 40px rgba(31, 39, 35, 0.18);
607
+ left: 0;
608
+ max-height: 86vh;
609
+ overflow: auto;
610
+ position: fixed;
611
+ right: 0;
612
+ top: auto;
613
+ width: auto;
614
+ z-index: 20;
615
+ }
616
+ }
617
+
618
+ @media (max-width: 560px) {
619
+ .left-panel,
620
+ .project-panel,
621
+ .chat-panel,
622
+ .manager-drawer {
623
+ padding: 12px;
624
+ }
625
+
626
+ .panel-header {
627
+ display: block;
628
+ }
629
+
630
+ .context-pill {
631
+ display: inline-block;
632
+ margin-top: 8px;
633
+ max-width: 100%;
634
+ }
635
+
636
+ .project-panel {
637
+ grid-template-rows: auto 300px auto auto;
638
+ }
639
+
640
+ .composer {
641
+ grid-template-columns: 1fr;
642
+ }
643
+
644
+ .toolbar {
645
+ flex-wrap: wrap;
646
+ max-width: calc(100% - 24px);
647
+ }
648
+
649
+ .graph-region {
650
+ overflow: auto;
651
+ }
652
+ }
653
+
654
+ .badge {
655
+ border-radius: 999px;
656
+ background: var(--panel-2);
657
+ color: var(--muted);
658
+ font-size: 11px;
659
+ padding: 2px 7px;
660
+ }
661
+
662
+ .badge[data-kind="entry"] {
663
+ background: rgba(46, 125, 107, 0.12);
664
+ color: var(--accent);
665
+ }
666
+
667
+ .field {
668
+ margin-bottom: 14px;
669
+ }
670
+
671
+ .field dt {
672
+ color: var(--muted);
673
+ font-size: 12px;
674
+ margin-bottom: 4px;
675
+ }
676
+
677
+ .field dd {
678
+ margin: 0;
679
+ overflow-wrap: anywhere;
680
+ }
681
+
682
+ pre {
683
+ white-space: pre-wrap;
684
+ overflow-wrap: anywhere;
685
+ background: #272d2a;
686
+ color: #f5f2e9;
687
+ border-radius: 8px;
688
+ padding: 10px;
689
+ font-size: 12px;
690
+ }
691
+
692
+ .playback {
693
+ padding: 16px;
694
+ border-right: 1px solid var(--line);
695
+ overflow: auto;
696
+ }
697
+
698
+ .playback-controls {
699
+ display: flex;
700
+ gap: 8px;
701
+ flex-wrap: wrap;
702
+ align-items: center;
703
+ }
704
+
705
+ .events {
706
+ overflow: auto;
707
+ padding: 12px 16px;
708
+ }
709
+
710
+ .event-row {
711
+ border-bottom: 1px solid var(--line);
712
+ padding: 8px 0;
713
+ display: grid;
714
+ grid-template-columns: 180px 150px minmax(0, 1fr);
715
+ gap: 12px;
716
+ font-size: 13px;
717
+ }
718
+
719
+ .event-row[data-active="true"] {
720
+ background: rgba(46, 125, 107, 0.08);
721
+ }
722
+
723
+ .event-row span {
724
+ overflow-wrap: anywhere;
725
+ }
726
+
727
+ .state-message {
728
+ margin: 18px;
729
+ padding: 16px;
730
+ border: 1px solid var(--line);
731
+ border-radius: 8px;
732
+ background: var(--panel);
733
+ }
734
+
735
+ .state-message.compact {
736
+ margin: 0;
737
+ }
738
+
739
+ .muted {
740
+ color: var(--muted);
741
+ margin: 0;
742
+ }
743
+
744
+ .login-shell {
745
+ align-items: center;
746
+ display: grid;
747
+ min-height: 100%;
748
+ padding: 24px;
749
+ }
750
+
751
+ .auth-entry-switch {
752
+ display: flex;
753
+ gap: 10px;
754
+ justify-content: center;
755
+ margin: 0 auto 14px;
756
+ }
757
+
758
+ .auth-entry-switch button {
759
+ min-width: 120px;
760
+ }
761
+
762
+ .login-card {
763
+ background: var(--panel);
764
+ border: 1px solid var(--line);
765
+ border-radius: 8px;
766
+ display: grid;
767
+ gap: 18px;
768
+ margin: 0 auto;
769
+ max-width: 420px;
770
+ padding: 28px;
771
+ width: min(100%, 420px);
772
+ }
773
+
774
+ .login-card h1,
775
+ .l2-topbar h1,
776
+ .l2-panel-title h2,
777
+ .prompt-header h2 {
778
+ letter-spacing: 0;
779
+ margin: 0;
780
+ }
781
+
782
+ .login-card label,
783
+ .prompt-form label {
784
+ display: grid;
785
+ gap: 6px;
786
+ }
787
+
788
+ .login-card input,
789
+ .prompt-form textarea {
790
+ background: var(--panel);
791
+ border: 1px solid var(--line);
792
+ border-radius: 6px;
793
+ color: var(--ink);
794
+ min-width: 0;
795
+ padding: 10px 12px;
796
+ }
797
+
798
+ .login-card button,
799
+ .prompt-form button {
800
+ background: var(--accent);
801
+ border-color: var(--accent);
802
+ color: white;
803
+ }
804
+
805
+ .login-card button:disabled,
806
+ .prompt-form button:disabled,
807
+ .prompt-form textarea:disabled {
808
+ cursor: not-allowed;
809
+ opacity: 0.55;
810
+ }
811
+
812
+ .form-error {
813
+ color: var(--bad);
814
+ min-height: 20px;
815
+ margin: 0;
816
+ }
817
+
818
+ .form-hint {
819
+ color: var(--muted);
820
+ font-size: 0.85em;
821
+ margin: -8px 0 0;
822
+ }
823
+
824
+ .form-notice {
825
+ color: var(--ink);
826
+ margin: 0;
827
+ }
828
+
829
+ .form-switch {
830
+ color: var(--muted);
831
+ margin: 0;
832
+ text-align: center;
833
+ }
834
+
835
+ .oauth-button {
836
+ align-items: center;
837
+ background: var(--panel);
838
+ border: 1px solid var(--line);
839
+ border-radius: 6px;
840
+ color: var(--ink);
841
+ cursor: pointer;
842
+ display: flex;
843
+ font: inherit;
844
+ gap: 8px;
845
+ justify-content: center;
846
+ padding: 10px 12px;
847
+ width: 100%;
848
+ }
849
+
850
+ .oauth-button:hover:not(:disabled) {
851
+ border-color: var(--accent);
852
+ }
853
+
854
+ .oauth-button:disabled {
855
+ cursor: not-allowed;
856
+ opacity: 0.55;
857
+ }
858
+
859
+ .console-admin-tools {
860
+ background: var(--panel);
861
+ border: 1px solid var(--line);
862
+ border-radius: 8px;
863
+ display: grid;
864
+ gap: 14px;
865
+ margin: 18px 0 0;
866
+ padding: 18px;
867
+ }
868
+
869
+ .console-admin-tools h2 {
870
+ margin: 0;
871
+ }
872
+
873
+ .console-admin-tools-search {
874
+ align-items: end;
875
+ display: flex;
876
+ flex-wrap: wrap;
877
+ gap: 10px;
878
+ }
879
+
880
+ .console-admin-tools-search label {
881
+ display: grid;
882
+ flex: 1 1 240px;
883
+ gap: 6px;
884
+ }
885
+
886
+ .console-admin-tools-search input {
887
+ background: var(--panel);
888
+ border: 1px solid var(--line);
889
+ border-radius: 6px;
890
+ color: var(--ink);
891
+ min-width: 0;
892
+ padding: 10px 12px;
893
+ }
894
+
895
+ .console-admin-tools-search button {
896
+ background: var(--accent);
897
+ border-color: var(--accent);
898
+ color: white;
899
+ }
900
+
901
+ .console-admin-tools-search button:disabled {
902
+ cursor: not-allowed;
903
+ opacity: 0.55;
904
+ }
905
+
906
+ .console-admin-tools-result {
907
+ overflow-x: auto;
908
+ }
909
+
910
+ .admin-tools-table {
911
+ border-collapse: collapse;
912
+ margin-top: 10px;
913
+ width: 100%;
914
+ }
915
+
916
+ .admin-tools-table th,
917
+ .admin-tools-table td {
918
+ border-bottom: 1px solid var(--line);
919
+ padding: 8px 10px;
920
+ text-align: left;
921
+ vertical-align: top;
922
+ }
923
+
924
+ .admin-tools-table th {
925
+ font-size: 12px;
926
+ letter-spacing: 0.02em;
927
+ text-transform: uppercase;
928
+ }
929
+
930
+ .admin-tools-table button:disabled {
931
+ cursor: not-allowed;
932
+ opacity: 0.55;
933
+ }
934
+
935
+ .home-shell {
936
+ align-items: start;
937
+ display: grid;
938
+ gap: 14px;
939
+ margin: 0 auto;
940
+ max-width: 860px;
941
+ padding: 18px 18px 28px;
942
+ }
943
+
944
+ .session-header {
945
+ align-items: center;
946
+ display: flex;
947
+ flex-wrap: wrap;
948
+ gap: 10px;
949
+ justify-content: space-between;
950
+ padding: 14px 18px;
951
+ }
952
+
953
+ .session-header-actions {
954
+ display: flex;
955
+ flex-wrap: wrap;
956
+ gap: 8px;
957
+ }
958
+
959
+ .session-header-user {
960
+ margin: 0;
961
+ }
962
+
963
+ .session-header-action {
964
+ align-items: center;
965
+ background: var(--panel);
966
+ border: 1px solid var(--line);
967
+ border-radius: 999px;
968
+ color: var(--ink);
969
+ display: inline-flex;
970
+ justify-content: center;
971
+ min-height: 34px;
972
+ padding: 0 12px;
973
+ text-decoration: none;
974
+ }
975
+
976
+ .session-header-action:hover {
977
+ border-color: var(--accent);
978
+ }
979
+
980
+ .session-header-logout {
981
+ background: var(--accent);
982
+ border-color: var(--accent);
983
+ color: white;
984
+ }
985
+
986
+ .home-hero {
987
+ display: grid;
988
+ gap: 6px;
989
+ }
990
+
991
+ .home-panel {
992
+ background: var(--panel);
993
+ border: 1px solid var(--line);
994
+ border-radius: 8px;
995
+ padding: 12px 14px;
996
+ }
997
+
998
+ .home-tools,
999
+ .home-how-to {
1000
+ display: grid;
1001
+ gap: 8px;
1002
+ list-style: none;
1003
+ margin: 8px 0 0;
1004
+ padding: 0;
1005
+ }
1006
+
1007
+ .home-tool {
1008
+ border: 1px solid var(--line);
1009
+ border-radius: 8px;
1010
+ color: inherit;
1011
+ display: grid;
1012
+ gap: 2px;
1013
+ padding: 10px 12px;
1014
+ text-decoration: none;
1015
+ }
1016
+
1017
+ .home-tool:hover {
1018
+ border-color: var(--accent);
1019
+ }
1020
+
1021
+ .home-tool span {
1022
+ color: var(--muted);
1023
+ font-size: 13px;
1024
+ }
1025
+
1026
+ .home-actions {
1027
+ display: flex;
1028
+ flex-wrap: wrap;
1029
+ gap: 8px;
1030
+ }
1031
+
1032
+ .home-action {
1033
+ align-items: center;
1034
+ background: var(--panel);
1035
+ border: 1px solid var(--line);
1036
+ border-radius: 999px;
1037
+ color: var(--ink);
1038
+ display: inline-flex;
1039
+ min-height: 34px;
1040
+ padding: 0 12px;
1041
+ text-decoration: none;
1042
+ }
1043
+
1044
+ .home-action:hover {
1045
+ border-color: var(--accent);
1046
+ }
1047
+
1048
+ .device-code-display {
1049
+ background: #f4f8f6;
1050
+ border: 1px solid rgba(46, 125, 107, 0.28);
1051
+ border-radius: 8px;
1052
+ display: grid;
1053
+ gap: 8px;
1054
+ padding: 14px;
1055
+ text-align: center;
1056
+ }
1057
+
1058
+ .device-code-display span {
1059
+ color: var(--muted);
1060
+ font-size: 12px;
1061
+ }
1062
+
1063
+ .device-code-display strong {
1064
+ color: var(--ink);
1065
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
1066
+ font-size: 26px;
1067
+ overflow-wrap: anywhere;
1068
+ }
1069
+
1070
+ .form-divider {
1071
+ align-items: center;
1072
+ color: var(--muted);
1073
+ display: grid;
1074
+ gap: 10px;
1075
+ grid-template-columns: 1fr auto 1fr;
1076
+ margin: 0;
1077
+ }
1078
+
1079
+ .form-divider::before,
1080
+ .form-divider::after {
1081
+ background: var(--line);
1082
+ content: "";
1083
+ height: 1px;
1084
+ }
1085
+
1086
+ .link-button {
1087
+ background: none;
1088
+ border: none;
1089
+ color: var(--accent);
1090
+ cursor: pointer;
1091
+ font: inherit;
1092
+ padding: 0;
1093
+ text-decoration: underline;
1094
+ }
1095
+
1096
+ .link-button:disabled {
1097
+ cursor: not-allowed;
1098
+ opacity: 0.55;
1099
+ }
1100
+
1101
+ .l2-shell {
1102
+ display: grid;
1103
+ grid-template-rows: auto auto minmax(0, 1fr);
1104
+ height: 100%;
1105
+ min-width: 0;
1106
+ }
1107
+
1108
+ .l2-topbar {
1109
+ align-items: center;
1110
+ background: var(--panel);
1111
+ border-bottom: 1px solid var(--line);
1112
+ display: flex;
1113
+ gap: 16px;
1114
+ justify-content: space-between;
1115
+ padding: 12px 16px;
1116
+ }
1117
+
1118
+ .l2-session {
1119
+ align-items: center;
1120
+ display: flex;
1121
+ gap: 10px;
1122
+ min-width: 0;
1123
+ }
1124
+
1125
+ .l2-session > span:first-child {
1126
+ max-width: 260px;
1127
+ overflow: hidden;
1128
+ text-overflow: ellipsis;
1129
+ white-space: nowrap;
1130
+ }
1131
+
1132
+ .l2-status {
1133
+ background: #fff8e8;
1134
+ border-bottom: 1px solid #ead7ab;
1135
+ color: #6a4b12;
1136
+ padding: 8px 16px;
1137
+ }
1138
+
1139
+ .quota-banner {
1140
+ align-items: center;
1141
+ background: #fceeee;
1142
+ border-bottom: 1px solid rgba(186, 61, 61, 0.32);
1143
+ color: #742323;
1144
+ display: flex;
1145
+ gap: 12px;
1146
+ justify-content: space-between;
1147
+ padding: 8px 16px;
1148
+ }
1149
+
1150
+ .quota-banner button {
1151
+ border-color: rgba(186, 61, 61, 0.35);
1152
+ }
1153
+
1154
+ .device-access-overlay {
1155
+ align-items: flex-start;
1156
+ background: rgba(17, 24, 39, 0.45);
1157
+ display: flex;
1158
+ inset: 0;
1159
+ justify-content: center;
1160
+ overflow: auto;
1161
+ padding: 48px 16px;
1162
+ position: fixed;
1163
+ z-index: 50;
1164
+ }
1165
+
1166
+ .device-access-card {
1167
+ background: var(--panel);
1168
+ border: 1px solid var(--line);
1169
+ border-radius: 12px;
1170
+ box-shadow: 0 12px 40px rgba(17, 24, 39, 0.25);
1171
+ display: grid;
1172
+ gap: 14px;
1173
+ max-width: 560px;
1174
+ padding: 20px;
1175
+ width: 100%;
1176
+ }
1177
+
1178
+ .device-field {
1179
+ display: grid;
1180
+ gap: 6px;
1181
+ }
1182
+
1183
+ .device-field > span {
1184
+ font-weight: 600;
1185
+ }
1186
+
1187
+ .device-field-row {
1188
+ align-items: center;
1189
+ display: flex;
1190
+ gap: 8px;
1191
+ }
1192
+
1193
+ .device-field-row input {
1194
+ flex: 1 1 auto;
1195
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1196
+ min-width: 0;
1197
+ }
1198
+
1199
+ .device-caption {
1200
+ color: var(--muted, #555);
1201
+ font-size: 0.9em;
1202
+ }
1203
+
1204
+ .device-caption code,
1205
+ .device-access-card code {
1206
+ word-break: break-all;
1207
+ }
1208
+
1209
+ .device-actions {
1210
+ display: flex;
1211
+ gap: 8px;
1212
+ }
1213
+
1214
+ .device-regenerate {
1215
+ border-top: 1px solid var(--line);
1216
+ display: grid;
1217
+ gap: 10px;
1218
+ padding-top: 14px;
1219
+ }
1220
+
1221
+ .l2-body {
1222
+ display: grid;
1223
+ grid-template-columns: 320px minmax(0, 1fr);
1224
+ min-height: 0;
1225
+ }
1226
+
1227
+ .l2-left,
1228
+ .l2-main {
1229
+ min-width: 0;
1230
+ overflow: auto;
1231
+ padding: 16px;
1232
+ }
1233
+
1234
+ .l2-left {
1235
+ background: var(--panel);
1236
+ border-right: 1px solid var(--line);
1237
+ }
1238
+
1239
+ .l2-panel-title,
1240
+ .prompt-header {
1241
+ align-items: flex-start;
1242
+ display: flex;
1243
+ gap: 12px;
1244
+ justify-content: space-between;
1245
+ margin-bottom: 14px;
1246
+ }
1247
+
1248
+ .project-selector-list {
1249
+ display: grid;
1250
+ gap: 8px;
1251
+ }
1252
+
1253
+ .project-selector-item {
1254
+ align-items: flex-start;
1255
+ border-radius: 8px;
1256
+ display: grid;
1257
+ gap: 4px;
1258
+ justify-items: start;
1259
+ min-height: 56px;
1260
+ padding: 10px;
1261
+ text-align: left;
1262
+ width: 100%;
1263
+ }
1264
+
1265
+ .project-selector-item small {
1266
+ color: var(--muted);
1267
+ overflow-wrap: anywhere;
1268
+ }
1269
+
1270
+ .project-prompt {
1271
+ background: var(--panel);
1272
+ border: 1px solid var(--line);
1273
+ border-radius: 8px;
1274
+ display: grid;
1275
+ gap: 16px;
1276
+ min-height: 100%;
1277
+ padding: 16px;
1278
+ }
1279
+
1280
+ .prompt-form {
1281
+ display: grid;
1282
+ gap: 10px;
1283
+ }
1284
+
1285
+ .prompt-results {
1286
+ display: grid;
1287
+ gap: 10px;
1288
+ }
1289
+
1290
+ .prompt-result {
1291
+ border: 1px solid var(--line);
1292
+ border-radius: 8px;
1293
+ padding: 12px;
1294
+ }
1295
+
1296
+ .prompt-result > div {
1297
+ align-items: center;
1298
+ display: flex;
1299
+ gap: 10px;
1300
+ justify-content: space-between;
1301
+ }
1302
+
1303
+ .prompt-result time {
1304
+ color: var(--muted);
1305
+ font-size: 12px;
1306
+ }
1307
+
1308
+ .prompt-result[data-status="error"] {
1309
+ border-color: rgba(186, 61, 61, 0.45);
1310
+ }
1311
+
1312
+ /* DX-2 Item 1 — paused runs (engine __paused__ / member attention_needed)
1313
+ * get a distinct yellow border + banner block so the operator sees the
1314
+ * escalation instead of staring at a "pending" status forever. */
1315
+ .prompt-result[data-status="paused"] {
1316
+ background: rgba(214, 158, 46, 0.06);
1317
+ border-color: rgba(214, 158, 46, 0.55);
1318
+ }
1319
+
1320
+ .paused-banner {
1321
+ background: rgba(214, 158, 46, 0.12);
1322
+ border-left: 3px solid rgba(214, 158, 46, 0.8);
1323
+ border-radius: 4px;
1324
+ color: #604200;
1325
+ font-size: 13px;
1326
+ margin: 8px 0 6px;
1327
+ padding: 8px 10px;
1328
+ }
1329
+
1330
+ .paused-banner .paused-step {
1331
+ margin: 0 0 4px;
1332
+ }
1333
+
1334
+ .paused-banner .paused-step code {
1335
+ background: rgba(214, 158, 46, 0.18);
1336
+ border-radius: 3px;
1337
+ padding: 1px 5px;
1338
+ }
1339
+
1340
+ .paused-banner .paused-members {
1341
+ list-style: disc inside;
1342
+ margin: 4px 0 0;
1343
+ padding: 0;
1344
+ }
1345
+
1346
+ /* DX-3 fixup — live-viz progress block. Replaces the DX-3 v1 linear
1347
+ * `<progress>` bar (deleted this commit) with a per-step viz: a
1348
+ * tier-colored header label + one row per completed step (green
1349
+ * check + actual duration) + the current step row (yellow/red
1350
+ * border + subtle pulsing animation when the step has overrun its
1351
+ * estimate).
1352
+ */
1353
+ .live-viz {
1354
+ margin: 8px 0 10px;
1355
+ border-radius: 6px;
1356
+ border: 1px solid var(--panel-2);
1357
+ background: var(--panel-1, var(--panel-2));
1358
+ padding: 6px 10px;
1359
+ }
1360
+
1361
+ .live-viz-header {
1362
+ font-size: 12px;
1363
+ font-weight: 500;
1364
+ color: var(--muted);
1365
+ padding: 2px 0 4px;
1366
+ }
1367
+
1368
+ .live-viz-header[data-tier="warn"] {
1369
+ color: var(--warn);
1370
+ }
1371
+
1372
+ .live-viz-header[data-tier="bad"] {
1373
+ color: var(--bad);
1374
+ }
1375
+
1376
+ .live-viz-steps {
1377
+ list-style: none;
1378
+ margin: 4px 0 0;
1379
+ padding: 0;
1380
+ display: flex;
1381
+ flex-direction: column;
1382
+ gap: 2px;
1383
+ }
1384
+
1385
+ .step-row {
1386
+ display: grid;
1387
+ grid-template-columns: 14px 1fr auto;
1388
+ gap: 6px;
1389
+ align-items: center;
1390
+ font-size: 12px;
1391
+ padding: 3px 6px;
1392
+ border-radius: 4px;
1393
+ border-left: 3px solid transparent;
1394
+ }
1395
+
1396
+ .step-row.completed {
1397
+ color: var(--muted);
1398
+ border-left-color: var(--ok, #2ea043);
1399
+ }
1400
+
1401
+ .step-row.completed .step-icon {
1402
+ color: var(--ok, #2ea043);
1403
+ }
1404
+
1405
+ .step-row.failed {
1406
+ color: var(--bad);
1407
+ border-left-color: var(--bad);
1408
+ }
1409
+
1410
+ .step-row.failed .step-icon {
1411
+ color: var(--bad);
1412
+ }
1413
+
1414
+ .step-row.current {
1415
+ border-left-color: var(--accent);
1416
+ background: var(--panel-2);
1417
+ }
1418
+
1419
+ .step-row.current.pulse-ok {
1420
+ border-left-color: var(--accent);
1421
+ }
1422
+
1423
+ .step-row.current.pulse-warn {
1424
+ border-left-color: var(--warn);
1425
+ animation: live-viz-pulse 1.6s ease-in-out infinite;
1426
+ }
1427
+
1428
+ .step-row.current.pulse-bad {
1429
+ border-left-color: var(--bad);
1430
+ animation: live-viz-pulse 1.1s ease-in-out infinite;
1431
+ }
1432
+
1433
+ .step-row.current.pulse-paused {
1434
+ border-left-color: var(--warn);
1435
+ }
1436
+
1437
+ .step-row.current .step-icon {
1438
+ color: var(--accent);
1439
+ }
1440
+
1441
+ .step-row .step-name {
1442
+ overflow: hidden;
1443
+ text-overflow: ellipsis;
1444
+ white-space: nowrap;
1445
+ }
1446
+
1447
+ .step-row .step-duration,
1448
+ .step-row .step-progress,
1449
+ .step-row .step-error {
1450
+ color: var(--muted);
1451
+ font-variant-numeric: tabular-nums;
1452
+ font-size: 11px;
1453
+ }
1454
+
1455
+ .step-row .step-attention {
1456
+ grid-column: 1 / -1;
1457
+ color: var(--warn);
1458
+ font-size: 11px;
1459
+ padding-left: 20px;
1460
+ }
1461
+
1462
+ @keyframes live-viz-pulse {
1463
+ 0%, 100% { opacity: 1; }
1464
+ 50% { opacity: 0.65; }
1465
+ }
1466
+
1467
+ @media (max-width: 760px) {
1468
+ .l2-topbar,
1469
+ .l2-session,
1470
+ .l2-panel-title,
1471
+ .prompt-header {
1472
+ align-items: stretch;
1473
+ flex-direction: column;
1474
+ }
1475
+
1476
+ .l2-body {
1477
+ grid-template-columns: 1fr;
1478
+ }
1479
+
1480
+ .l2-left {
1481
+ border-bottom: 1px solid var(--line);
1482
+ border-right: 0;
1483
+ }
1484
+ }
1485
+
1486
+ /* TXL-ui — admin transaction-log page */
1487
+ .txl-page {
1488
+ display: grid;
1489
+ gap: 14px;
1490
+ padding: 16px;
1491
+ }
1492
+
1493
+ .txl-form {
1494
+ display: flex;
1495
+ flex-wrap: wrap;
1496
+ gap: 10px;
1497
+ align-items: flex-end;
1498
+ background: var(--panel);
1499
+ border: 1px solid var(--line);
1500
+ border-radius: 8px;
1501
+ padding: 12px;
1502
+ }
1503
+
1504
+ .txl-form label {
1505
+ display: grid;
1506
+ gap: 4px;
1507
+ }
1508
+
1509
+ .txl-form label span {
1510
+ color: var(--muted);
1511
+ font-size: 12px;
1512
+ }
1513
+
1514
+ .txl-form input {
1515
+ border: 1px solid var(--line);
1516
+ border-radius: 6px;
1517
+ padding: 4px 8px;
1518
+ min-height: 32px;
1519
+ }
1520
+
1521
+ .txl-status {
1522
+ color: var(--muted);
1523
+ min-height: 18px;
1524
+ }
1525
+
1526
+ .txl-status-bad {
1527
+ color: var(--bad);
1528
+ }
1529
+
1530
+ .txl-chips {
1531
+ display: flex;
1532
+ flex-wrap: wrap;
1533
+ gap: 8px;
1534
+ }
1535
+
1536
+ .txl-chip {
1537
+ border: 1px solid var(--line);
1538
+ border-radius: 999px;
1539
+ padding: 4px 10px;
1540
+ background: var(--panel);
1541
+ }
1542
+
1543
+ .txl-chip-complete { border-color: var(--good); }
1544
+ .txl-chip-stuck { border-color: var(--warn); }
1545
+ .txl-chip-dropped { border-color: var(--bad); }
1546
+ .txl-chip-fnf { border-color: var(--line); }
1547
+
1548
+ .txl-window {
1549
+ margin: 4px 0 0;
1550
+ }
1551
+
1552
+ .txl-table {
1553
+ border-collapse: collapse;
1554
+ width: 100%;
1555
+ }
1556
+
1557
+ .txl-table th,
1558
+ .txl-table td {
1559
+ border: 1px solid var(--line);
1560
+ padding: 6px 8px;
1561
+ text-align: left;
1562
+ vertical-align: top;
1563
+ font-size: 13px;
1564
+ }
1565
+
1566
+ .txl-table thead th {
1567
+ background: var(--panel-2);
1568
+ }
1569
+
1570
+ .txl-row {
1571
+ cursor: pointer;
1572
+ }
1573
+
1574
+ .txl-row:hover {
1575
+ background: var(--panel-2);
1576
+ }
1577
+
1578
+ .txl-row-dropped td {
1579
+ border-color: var(--bad);
1580
+ }
1581
+
1582
+ .txl-row-stuck td {
1583
+ border-color: var(--warn);
1584
+ }
1585
+
1586
+ .txl-detail-card {
1587
+ background: var(--panel);
1588
+ border: 1px solid var(--line);
1589
+ border-radius: 8px;
1590
+ padding: 12px;
1591
+ }
1592
+
1593
+ .txl-detail-head {
1594
+ display: flex;
1595
+ align-items: center;
1596
+ justify-content: space-between;
1597
+ margin-bottom: 8px;
1598
+ }
1599
+
1600
+ .txl-detail-body {
1601
+ background: var(--panel-2);
1602
+ border-radius: 6px;
1603
+ max-height: 400px;
1604
+ overflow: auto;
1605
+ padding: 8px;
1606
+ white-space: pre-wrap;
1607
+ word-break: break-all;
1608
+ }
1609
+
1610
+ .admin-nav-link {
1611
+ align-items: center;
1612
+ background: var(--panel);
1613
+ border: 1px solid var(--line);
1614
+ border-radius: 6px;
1615
+ color: var(--ink);
1616
+ display: inline-flex;
1617
+ min-height: 32px;
1618
+ padding: 0 10px;
1619
+ text-decoration: none;
1620
+ }
1621
+
1622
+ .admin-nav-link:hover {
1623
+ border-color: var(--accent);
1624
+ }
1625
+
1626
+ .usage-progress-track {
1627
+ background: var(--panel-2);
1628
+ border: 1px solid var(--line);
1629
+ border-radius: 999px;
1630
+ height: 12px;
1631
+ margin-bottom: 4px;
1632
+ overflow: hidden;
1633
+ width: min(280px, 100%);
1634
+ }
1635
+
1636
+ .usage-progress-fill {
1637
+ border-radius: 999px;
1638
+ height: 100%;
1639
+ min-width: 4px;
1640
+ }
1641
+
1642
+ .usage-progress-fill[data-usage-tone="green"] {
1643
+ background: var(--good);
1644
+ }
1645
+
1646
+ .usage-progress-fill[data-usage-tone="amber"] {
1647
+ background: var(--warn);
1648
+ }
1649
+
1650
+ .usage-progress-fill[data-usage-tone="red"] {
1651
+ background: var(--bad);
1652
+ }
1653
+
1654
+ .usage-page th,
1655
+ .usage-page td,
1656
+ .admin-usage-table th,
1657
+ .admin-usage-table td {
1658
+ border: 1px solid var(--line);
1659
+ padding: 6px 8px;
1660
+ text-align: left;
1661
+ vertical-align: top;
1662
+ font-size: 13px;
1663
+ }
1664
+
1665
+ .usage-tier-badge {
1666
+ border-radius: 999px;
1667
+ display: inline-block;
1668
+ font-size: 12px;
1669
+ padding: 4px 8px;
1670
+ }
1671
+
1672
+ .admin-usage-controls {
1673
+ align-items: flex-end;
1674
+ display: flex;
1675
+ gap: 8px;
1676
+ margin-bottom: 8px;
1677
+ }
1678
+
1679
+ .admin-usage-config {
1680
+ border: 1px solid var(--line);
1681
+ margin-bottom: 10px;
1682
+ padding: 10px;
1683
+ }
1684
+
1685
+ .admin-usage-config-form {
1686
+ align-items: center;
1687
+ display: flex;
1688
+ gap: 8px;
1689
+ flex-wrap: wrap;
1690
+ }
1691
+
1692
+ .admin-usage-config-form label {
1693
+ display: grid;
1694
+ gap: 4px;
1695
+ }
1696
+
1697
+ .admin-usage-controls label {
1698
+ display: grid;
1699
+ gap: 4px;
1700
+ }
1701
+
1702
+ .admin-usage-controls input {
1703
+ max-width: 170px;
1704
+ }
1705
+
1706
+ .admin-usage-services {
1707
+ margin: 0;
1708
+ padding-left: 18px;
1709
+ }
1710
+
1711
+ .admin-usage-services li {
1712
+ list-style: square;
1713
+ }
1714
+
1715
+ .admin-usage-tier-row,
1716
+ .admin-usage-limit-row {
1717
+ align-items: start;
1718
+ display: grid;
1719
+ gap: 6px;
1720
+ }
1721
+
1722
+ .mail-mailbox-nav {
1723
+ display: flex;
1724
+ flex-wrap: wrap;
1725
+ gap: 8px;
1726
+ margin-bottom: 12px;
1727
+ }
1728
+
1729
+ .mail-message-host {
1730
+ display: grid;
1731
+ gap: 12px;
1732
+ margin-bottom: 16px;
1733
+ }
1734
+
1735
+ .mail-thread {
1736
+ background: var(--panel);
1737
+ border: 1px solid var(--line);
1738
+ border-radius: 8px;
1739
+ display: grid;
1740
+ gap: 12px;
1741
+ padding: 14px;
1742
+ }
1743
+
1744
+ .mail-message-half {
1745
+ display: grid;
1746
+ gap: 4px;
1747
+ }
1748
+
1749
+ .mail-message-half p {
1750
+ white-space: pre-wrap;
1751
+ }
1752
+
1753
+ .mail-messages {
1754
+ display: grid;
1755
+ gap: 8px;
1756
+ list-style: none;
1757
+ margin: 0;
1758
+ padding: 0;
1759
+ }
1760
+
1761
+ .mail-message-row {
1762
+ background: var(--panel);
1763
+ border: 1px solid var(--line);
1764
+ border-radius: 8px;
1765
+ cursor: pointer;
1766
+ display: block;
1767
+ padding: 10px 12px;
1768
+ text-align: left;
1769
+ width: 100%;
1770
+ }
1771
+
1772
+ .mail-message-row:hover {
1773
+ border-color: var(--accent);
1774
+ }
1775
+
1776
+ .mail-thread-view {
1777
+ display: grid;
1778
+ gap: 12px;
1779
+ }
1780
+
1781
+ .mail-compose {
1782
+ border-top: 1px solid var(--line);
1783
+ display: grid;
1784
+ gap: 10px;
1785
+ padding-top: 16px;
1786
+ }
1787
+
1788
+ .mail-compose label {
1789
+ display: grid;
1790
+ gap: 6px;
1791
+ }
1792
+
1793
+ .mail-compose input,
1794
+ .mail-compose textarea {
1795
+ background: var(--panel);
1796
+ border: 1px solid var(--line);
1797
+ border-radius: 6px;
1798
+ color: var(--ink);
1799
+ min-width: 0;
1800
+ padding: 10px 12px;
1801
+ }
1802
+
1803
+ .mail-compose textarea {
1804
+ min-height: 80px;
1805
+ }
1806
+
1807
+ .mail-compose button {
1808
+ background: var(--accent);
1809
+ border-color: var(--accent);
1810
+ color: white;
1811
+ justify-self: start;
1812
+ }
1813
+
1814
+ .running-devices {
1815
+ display: grid;
1816
+ gap: 12px;
1817
+ list-style: none;
1818
+ margin: 0;
1819
+ padding: 0;
1820
+ }
1821
+
1822
+ .running-device {
1823
+ background: var(--panel);
1824
+ border: 1px solid var(--line);
1825
+ border-radius: 8px;
1826
+ padding: 14px;
1827
+ }
1828
+
1829
+ .running-device pre {
1830
+ background: var(--panel-2);
1831
+ border-radius: 6px;
1832
+ max-height: 320px;
1833
+ overflow: auto;
1834
+ padding: 8px;
1835
+ white-space: pre-wrap;
1836
+ word-break: break-word;
1837
+ }
1838
+
1839
+ .sites-list {
1840
+ display: grid;
1841
+ gap: 10px;
1842
+ list-style: none;
1843
+ margin: 0;
1844
+ padding: 0;
1845
+ }
1846
+
1847
+ .site-row {
1848
+ background: var(--panel);
1849
+ border: 1px solid var(--line);
1850
+ border-radius: 8px;
1851
+ padding: 12px;
1852
+ }