privateboard 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +120 -0
  3. package/dist/cli.js +10502 -0
  4. package/dist/cli.js.map +1 -0
  5. package/package.json +63 -0
  6. package/public/adjourn-overlay.css +253 -0
  7. package/public/agent-overlay.css +444 -0
  8. package/public/agent-overlay.js +604 -0
  9. package/public/agent-profile.css +3230 -0
  10. package/public/agent-profile.js +3329 -0
  11. package/public/app.js +6629 -0
  12. package/public/auto-hide-scroll.js +90 -0
  13. package/public/avatar-skill.js +793 -0
  14. package/public/avatars/chair.svg +98 -0
  15. package/public/avatars/first-principles.svg +122 -0
  16. package/public/avatars/long-horizon.svg +147 -0
  17. package/public/avatars/open_ai.png +0 -0
  18. package/public/avatars/phenomenologist.svg +130 -0
  19. package/public/avatars/socrates.svg +187 -0
  20. package/public/avatars/user-empathy.svg +117 -0
  21. package/public/avatars/value-investor.svg +117 -0
  22. package/public/favicon.svg +10 -0
  23. package/public/fonts/agent-Italic.woff2 +0 -0
  24. package/public/fonts/human-sans.woff2 +0 -0
  25. package/public/icons.css +103 -0
  26. package/public/models-cache.js +57 -0
  27. package/public/new-agent.css +1359 -0
  28. package/public/new-agent.js +675 -0
  29. package/public/onboarding.css +628 -0
  30. package/public/onboarding.js +782 -0
  31. package/public/prototype-dashboard.html +7596 -0
  32. package/public/report/spines/a16z-thesis.css +1055 -0
  33. package/public/report/spines/anthropic-essay.css +556 -0
  34. package/public/report/spines/boardroom-dark.css +1082 -0
  35. package/public/report/spines/gartner-note.css +538 -0
  36. package/public/report/spines/mckinsey-deck.css +523 -0
  37. package/public/report/spines/openai-paper.css +516 -0
  38. package/public/report.html +1417 -0
  39. package/public/room-settings.css +895 -0
  40. package/public/room-settings.js +1039 -0
  41. package/public/themes.css +338 -0
  42. package/public/user-settings.css +1236 -0
  43. package/public/user-settings.js +1291 -0
@@ -0,0 +1,3230 @@
1
+ /* ═══════════════════════════════════════════
2
+ AGENT PROFILE — single-page layout
3
+ No tabs. Just: Bio · Instruction · Memory · Knowledge.
4
+ Stacked, generously spaced, easy to read.
5
+ ═══════════════════════════════════════════ */
6
+
7
+ .agent-page {
8
+ display: flex;
9
+ flex-direction: column;
10
+ height: 100%;
11
+ min-height: 0;
12
+ overflow: hidden;
13
+ background: var(--panel);
14
+ }
15
+
16
+ /* ─── Cover ─── */
17
+ .agent-page-cover {
18
+ height: 88px;
19
+ background:
20
+ repeating-linear-gradient(
21
+ 45deg,
22
+ transparent 0 22px,
23
+ rgba(111, 181, 114, 0.04) 22px 23px
24
+ ),
25
+ linear-gradient(120deg, var(--lime-dim) 0%, var(--panel-3) 42%, var(--panel) 100%);
26
+ border-bottom: 0.5px solid var(--line-bright);
27
+ position: relative;
28
+ flex-shrink: 0;
29
+ overflow: hidden;
30
+ z-index: 0;
31
+ }
32
+ .agent-page-cover .cover-quote {
33
+ position: absolute;
34
+ inset: 0;
35
+ display: flex;
36
+ align-items: center;
37
+ justify-content: flex-end;
38
+ padding: 0 32px;
39
+ font-family: "Agent", var(--font-agent);
40
+ font-size: 22px;
41
+ color: var(--lime);
42
+ opacity: 0.42;
43
+ pointer-events: none;
44
+ user-select: none;
45
+ white-space: nowrap;
46
+ overflow: hidden;
47
+ }
48
+ /* Top-left corner: creator + joined date, on a small dark backdrop
49
+ so it stays legible against the gradient cover. */
50
+ .agent-page-cover .cover-meta-corner {
51
+ position: absolute;
52
+ top: 10px;
53
+ left: 14px;
54
+ font-family: var(--mono);
55
+ font-size: 9.5px;
56
+ color: var(--text-soft);
57
+ letter-spacing: 0.12em;
58
+ text-transform: uppercase;
59
+ background: rgba(10, 10, 10, 0.55);
60
+ -webkit-backdrop-filter: blur(2px);
61
+ backdrop-filter: blur(2px);
62
+ padding: 3px 8px;
63
+ border: 0.5px solid rgba(111, 181, 114, 0.3);
64
+ pointer-events: none;
65
+ user-select: none;
66
+ }
67
+ .agent-page-cover .cover-meta-corner .sep { color: var(--text-faint); margin: 0 5px; }
68
+ .agent-page-cover .cover-meta-corner .v { color: var(--text); font-weight: 700; }
69
+
70
+ /* ─── Identity row (avatar overlaps cover) ─── */
71
+ .agent-page-identity {
72
+ display: grid;
73
+ grid-template-columns: auto 1fr auto;
74
+ gap: 16px;
75
+ align-items: start;
76
+ padding: 12px 32px 14px;
77
+ flex-shrink: 0;
78
+ background: var(--panel);
79
+ border-bottom: 0.5px solid var(--line-bright);
80
+ position: relative;
81
+ }
82
+ .agent-page-avatar {
83
+ width: 76px;
84
+ height: 76px;
85
+ background: var(--bg);
86
+ border: 0.5px solid var(--line-strong);
87
+ padding: 5px;
88
+ margin-top: -42px;
89
+ image-rendering: pixelated;
90
+ image-rendering: crisp-edges;
91
+ position: relative;
92
+ z-index: 2;
93
+ }
94
+
95
+ .agent-page-id { padding-top: 6px; min-width: 0; }
96
+ .agent-page-id .name-row {
97
+ display: flex;
98
+ align-items: center;
99
+ gap: 10px;
100
+ flex-wrap: wrap;
101
+ margin-bottom: 4px;
102
+ }
103
+ .agent-page-id .name {
104
+ font-size: 22px;
105
+ font-weight: 700;
106
+ color: var(--text);
107
+ letter-spacing: -0.018em;
108
+ line-height: 1.1;
109
+ }
110
+ .agent-page-id .role-tag {
111
+ font-family: var(--mono);
112
+ font-size: 9.5px;
113
+ font-weight: 700;
114
+ text-transform: uppercase;
115
+ letter-spacing: 0.14em;
116
+ padding: 2px 8px;
117
+ background: rgba(111, 181, 114, 0.10);
118
+ border: 0.5px solid var(--lime-dim);
119
+ color: var(--lime);
120
+ }
121
+ .agent-page-id .status-pill {
122
+ font-family: var(--mono);
123
+ font-size: 9.5px;
124
+ font-weight: 700;
125
+ text-transform: uppercase;
126
+ letter-spacing: 0.12em;
127
+ padding: 2px 8px;
128
+ border: 0.5px solid;
129
+ }
130
+ .agent-page-id .status-pill.active { color: var(--lime); border-color: var(--lime); }
131
+ .agent-page-id .status-pill.intern { color: var(--amber); border-color: var(--amber); }
132
+ .agent-page-id .status-pill.off-duty { color: var(--text-dim); border-color: var(--line-bright); }
133
+ .agent-page-id .status-pill.active::before { content: "● "; }
134
+ .agent-page-id .status-pill.intern::before { content: "▲ "; }
135
+ .agent-page-id .status-pill.off-duty::before { content: "◌ "; }
136
+ /* Bio: single line truncated next to the avatar; full text on hover. */
137
+ .agent-page-id .bio {
138
+ position: relative;
139
+ margin-top: 6px;
140
+ max-width: 600px;
141
+ }
142
+ .agent-page-id .bio-line {
143
+ font-family: var(--font-human);
144
+ font-size: 12.5px;
145
+ color: var(--text-soft);
146
+ line-height: 1.6;
147
+ letter-spacing: -0.003em;
148
+ white-space: nowrap;
149
+ overflow: hidden;
150
+ text-overflow: ellipsis;
151
+ cursor: help;
152
+ padding-right: 8px;
153
+ border-bottom: 0.5px dotted transparent;
154
+ transition: border-color 0.12s;
155
+ }
156
+ .agent-page-id .bio:hover .bio-line {
157
+ border-bottom-color: var(--lime-dim);
158
+ }
159
+ .agent-page-id .bio-tooltip {
160
+ position: absolute;
161
+ top: calc(100% + 6px);
162
+ left: 0;
163
+ width: 460px;
164
+ max-width: 90vw;
165
+ padding: 14px 16px;
166
+ background: var(--panel);
167
+ border: 0.5px solid var(--lime-dim);
168
+ font-family: var(--font-human);
169
+ font-size: 12.5px;
170
+ color: var(--text-soft);
171
+ line-height: 1.65;
172
+ letter-spacing: -0.003em;
173
+ z-index: 50;
174
+ opacity: 0;
175
+ visibility: hidden;
176
+ transform: translateY(-2px);
177
+ transition: opacity 0.12s ease, transform 0.12s ease, visibility 0s linear 0.12s;
178
+ pointer-events: none;
179
+ }
180
+ .agent-page-id .bio-tooltip::before, .agent-page-id .bio-tooltip::after {
181
+ content: "";
182
+ position: absolute;
183
+ width: 8px; height: 8px;
184
+ border: 0.5px solid var(--lime);
185
+ pointer-events: none;
186
+ }
187
+ .agent-page-id .bio-tooltip::before { top: -1px; left: -1px; border-right: none; border-bottom: none; }
188
+ .agent-page-id .bio-tooltip::after { bottom: -1px; right: -1px; border-left: none; border-top: none; }
189
+ .agent-page-id .bio-tooltip p + p { margin-top: 8px; }
190
+ .agent-page-id .bio:hover .bio-tooltip,
191
+ .agent-page-id .bio:focus-within .bio-tooltip {
192
+ opacity: 1;
193
+ visibility: visible;
194
+ transform: translateY(0);
195
+ transition: opacity 0.12s ease, transform 0.12s ease, visibility 0s;
196
+ }
197
+
198
+ .agent-page-id-buttons { display: flex; gap: 6px; padding-top: 8px; }
199
+ .agent-page-id-buttons .ap-pill-btn {
200
+ font-family: var(--mono);
201
+ font-size: 10px;
202
+ font-weight: 700;
203
+ text-transform: uppercase;
204
+ letter-spacing: 0.1em;
205
+ padding: 6px 11px;
206
+ border: 0.5px solid var(--line-strong);
207
+ background: transparent;
208
+ color: var(--text-soft);
209
+ cursor: pointer;
210
+ text-decoration: none;
211
+ transition: all 0.12s;
212
+ }
213
+ .agent-page-id-buttons .ap-pill-btn:hover { border-color: var(--lime); color: var(--lime); }
214
+ .agent-page-id-buttons .ap-pill-btn.primary {
215
+ background: var(--lime); color: var(--bg); border-color: var(--lime);
216
+ }
217
+ .agent-page-id-buttons .ap-pill-btn.primary:hover {
218
+ background: transparent; color: var(--lime);
219
+ }
220
+
221
+ /* ─── Metrics row · inline body block, sits right under bio ─── */
222
+ .agent-page-metrics {
223
+ display: grid;
224
+ grid-template-columns: repeat(4, 1fr);
225
+ gap: 1px;
226
+ background: var(--line-bright);
227
+ border: 0.5px solid var(--line-bright);
228
+ }
229
+ @media (max-width: 700px) {
230
+ .agent-page-metrics { grid-template-columns: repeat(2, 1fr); }
231
+ }
232
+ .agent-page-metrics .cell {
233
+ background: var(--bg);
234
+ padding: 12px 16px;
235
+ display: flex;
236
+ flex-direction: column;
237
+ gap: 4px;
238
+ }
239
+ .agent-page-metrics .lbl {
240
+ font-family: var(--mono);
241
+ font-size: 9px;
242
+ color: var(--text-faint);
243
+ text-transform: uppercase;
244
+ letter-spacing: 0.16em;
245
+ font-weight: 700;
246
+ }
247
+ .agent-page-metrics .v {
248
+ font-family: var(--mono);
249
+ font-size: 20px;
250
+ color: var(--text);
251
+ font-weight: 700;
252
+ letter-spacing: -0.01em;
253
+ line-height: 1;
254
+ }
255
+ .agent-page-metrics .v.text {
256
+ font-size: 13.5px;
257
+ letter-spacing: -0.005em;
258
+ }
259
+ .agent-page-metrics .v .unit {
260
+ font-size: 11px;
261
+ color: var(--text-dim);
262
+ font-weight: 400;
263
+ margin-left: 4px;
264
+ letter-spacing: 0.04em;
265
+ }
266
+ .agent-page-metrics .deck {
267
+ font-family: var(--font-human);
268
+ font-size: 10.5px;
269
+ color: var(--text-dim);
270
+ letter-spacing: -0.003em;
271
+ }
272
+ .agent-page-metrics .deck .lime { color: var(--lime); }
273
+
274
+ /* ─── Body — single scroll, stacked sections ─── */
275
+ .agent-page-body {
276
+ flex: 1;
277
+ min-height: 0;
278
+ overflow-y: auto;
279
+ }
280
+ .agent-page-stack {
281
+ max-width: 760px;
282
+ margin: 0 auto;
283
+ padding: 32px 32px 56px;
284
+ display: flex;
285
+ flex-direction: column;
286
+ gap: 36px;
287
+ }
288
+
289
+ /* Section primitives */
290
+ .ap-sec { display: flex; flex-direction: column; gap: 14px; }
291
+ .ap-sec-head {
292
+ display: flex;
293
+ align-items: end;
294
+ justify-content: space-between;
295
+ gap: 12px;
296
+ padding-bottom: 10px;
297
+ border-bottom: 0.5px solid var(--line-bright);
298
+ }
299
+ .ap-sec-head .label-row {
300
+ display: flex;
301
+ align-items: baseline;
302
+ gap: 10px;
303
+ }
304
+ .ap-sec-head .eyebrow {
305
+ font-family: var(--mono);
306
+ font-size: 9.5px;
307
+ font-weight: 700;
308
+ text-transform: uppercase;
309
+ letter-spacing: 0.18em;
310
+ color: var(--lime);
311
+ }
312
+ .ap-sec-head .title {
313
+ font-size: 14px;
314
+ font-weight: 700;
315
+ color: var(--text);
316
+ letter-spacing: -0.01em;
317
+ }
318
+ .ap-sec-head .deck {
319
+ font-family: var(--font-human);
320
+ font-size: 11.5px;
321
+ color: var(--text-dim);
322
+ letter-spacing: -0.003em;
323
+ margin-top: 4px;
324
+ }
325
+ .ap-sec-head .right {
326
+ font-family: var(--mono);
327
+ font-size: 10px;
328
+ color: var(--text-faint);
329
+ letter-spacing: 0.06em;
330
+ text-align: right;
331
+ white-space: nowrap;
332
+ }
333
+
334
+ /* ─── Bio (top of body) ─── */
335
+ .ap-bio-block {
336
+ font-family: var(--font-human);
337
+ font-size: 14px;
338
+ line-height: 1.7;
339
+ color: var(--text-soft);
340
+ letter-spacing: -0.003em;
341
+ }
342
+ .ap-bio-block p + p { margin-top: 10px; }
343
+ .ap-bio-block .bio-tag {
344
+ display: block;
345
+ font-family: var(--mono);
346
+ font-size: 9.5px;
347
+ text-transform: uppercase;
348
+ letter-spacing: 0.18em;
349
+ color: var(--lime);
350
+ margin-bottom: 10px;
351
+ }
352
+
353
+ /* ─── Instruction (read-only doc) ─── */
354
+ .ap-instr-doc {
355
+ background: var(--bg);
356
+ border: 0.5px solid var(--line-bright);
357
+ padding: 22px 26px;
358
+ display: flex;
359
+ flex-direction: column;
360
+ gap: 18px;
361
+ position: relative;
362
+ }
363
+ .ap-instr-doc .meta-strip {
364
+ position: absolute;
365
+ top: 10px;
366
+ right: 14px;
367
+ font-family: var(--mono);
368
+ font-size: 9px;
369
+ color: var(--text-faint);
370
+ letter-spacing: 0.12em;
371
+ text-transform: uppercase;
372
+ }
373
+ .ap-instr-doc .meta-strip::before { content: "🔒 "; font-size: 9px; }
374
+ .ap-instr-section .lbl {
375
+ font-family: var(--mono);
376
+ font-size: 9.5px;
377
+ font-weight: 700;
378
+ text-transform: uppercase;
379
+ letter-spacing: 0.16em;
380
+ color: var(--text-dim);
381
+ margin-bottom: 6px;
382
+ }
383
+ .ap-instr-section p {
384
+ font-family: var(--font-human);
385
+ font-size: 13px;
386
+ color: var(--text-soft);
387
+ line-height: 1.65;
388
+ letter-spacing: -0.003em;
389
+ }
390
+ .ap-instr-section p .ink { color: var(--text); font-weight: 600; font-family: var(--mono); }
391
+ .ap-instr-section p .mono { font-family: var(--mono); color: var(--text); }
392
+
393
+ /* ─── Memory · About You ─── */
394
+ .about-you-card {
395
+ background: linear-gradient(135deg, var(--bg) 0%, rgba(111, 181, 114, 0.04) 100%);
396
+ border: 0.5px solid var(--lime-dim);
397
+ padding: 22px 24px;
398
+ position: relative;
399
+ }
400
+ .about-you-card::before, .about-you-card::after {
401
+ content: "";
402
+ position: absolute;
403
+ width: 10px;
404
+ height: 10px;
405
+ border: 1.5px solid var(--lime);
406
+ pointer-events: none;
407
+ }
408
+ .about-you-card::before { top: -1px; left: -1px; border-right: none; border-bottom: none; }
409
+ .about-you-card::after { bottom: -1px; right: -1px; border-left: none; border-top: none; }
410
+ .about-you-card .headline {
411
+ font-family: var(--font-human);
412
+ font-size: 13.5px;
413
+ color: var(--text);
414
+ line-height: 1.55;
415
+ letter-spacing: -0.005em;
416
+ font-weight: 600;
417
+ margin-bottom: 10px;
418
+ }
419
+ .about-you-card .summary {
420
+ font-family: var(--font-human);
421
+ font-size: 12.5px;
422
+ color: var(--text-soft);
423
+ line-height: 1.65;
424
+ letter-spacing: -0.003em;
425
+ }
426
+ .about-you-card .summary p + p { margin-top: 8px; }
427
+ .about-you-card .grid {
428
+ display: grid;
429
+ grid-template-columns: 1fr 1fr;
430
+ gap: 18px;
431
+ margin-top: 18px;
432
+ padding-top: 16px;
433
+ border-top: 0.5px dashed var(--lime-dim);
434
+ }
435
+ @media (max-width: 700px) { .about-you-card .grid { grid-template-columns: 1fr; } }
436
+ .about-you-card .group .lbl {
437
+ font-family: var(--mono);
438
+ font-size: 9.5px;
439
+ font-weight: 700;
440
+ text-transform: uppercase;
441
+ letter-spacing: 0.16em;
442
+ margin-bottom: 8px;
443
+ color: var(--lime);
444
+ }
445
+ .about-you-card .group.warn .lbl { color: var(--amber); }
446
+ .about-you-card .group ul {
447
+ list-style: none;
448
+ padding: 0;
449
+ margin: 0;
450
+ display: flex;
451
+ flex-direction: column;
452
+ gap: 6px;
453
+ }
454
+ .about-you-card .group li {
455
+ font-family: var(--font-human);
456
+ font-size: 12px;
457
+ color: var(--text-soft);
458
+ line-height: 1.55;
459
+ letter-spacing: -0.003em;
460
+ padding-left: 14px;
461
+ position: relative;
462
+ }
463
+ .about-you-card .group.traits li::before {
464
+ content: "·";
465
+ position: absolute;
466
+ left: 4px;
467
+ color: var(--lime);
468
+ font-weight: 700;
469
+ }
470
+ .about-you-card .group.warn li::before {
471
+ content: "▲";
472
+ position: absolute;
473
+ left: 0;
474
+ color: var(--amber);
475
+ font-size: 9px;
476
+ top: 4px;
477
+ }
478
+ .about-you-card .relationship {
479
+ margin-top: 18px;
480
+ padding-top: 14px;
481
+ border-top: 0.5px dashed var(--lime-dim);
482
+ display: flex;
483
+ flex-wrap: wrap;
484
+ gap: 24px;
485
+ font-family: var(--mono);
486
+ font-size: 10.5px;
487
+ color: var(--text-dim);
488
+ letter-spacing: 0.04em;
489
+ }
490
+ .about-you-card .relationship .cell .l {
491
+ font-family: var(--font-human);
492
+ color: var(--text-faint);
493
+ font-size: 10px;
494
+ letter-spacing: 0.02em;
495
+ display: block;
496
+ margin-bottom: 2px;
497
+ }
498
+ .about-you-card .relationship .cell .v {
499
+ font-family: var(--mono);
500
+ color: var(--text);
501
+ font-size: 13px;
502
+ font-weight: 700;
503
+ letter-spacing: -0.005em;
504
+ }
505
+
506
+ /* ─── Memory · Per-room cards ─── */
507
+ .room-mem-list {
508
+ display: flex;
509
+ flex-direction: column;
510
+ gap: 12px;
511
+ }
512
+ .room-mem-card {
513
+ background: var(--bg);
514
+ border: 0.5px solid var(--line-bright);
515
+ padding: 16px 18px;
516
+ transition: border-color 0.12s;
517
+ }
518
+ .room-mem-card:hover { border-color: var(--lime-dim); }
519
+ .room-mem-card .head-row {
520
+ display: flex;
521
+ align-items: baseline;
522
+ justify-content: space-between;
523
+ gap: 12px;
524
+ margin-bottom: 4px;
525
+ }
526
+ .room-mem-card .name-row {
527
+ display: flex;
528
+ align-items: baseline;
529
+ gap: 8px;
530
+ flex-wrap: wrap;
531
+ min-width: 0;
532
+ }
533
+ .room-mem-card .num {
534
+ font-family: var(--mono);
535
+ font-size: 10.5px;
536
+ color: var(--lime);
537
+ letter-spacing: 0.06em;
538
+ font-weight: 700;
539
+ }
540
+ .room-mem-card .name {
541
+ font-size: 14px;
542
+ font-weight: 700;
543
+ color: var(--text);
544
+ letter-spacing: -0.008em;
545
+ }
546
+ .room-mem-card .stats {
547
+ font-family: var(--mono);
548
+ font-size: 10px;
549
+ color: var(--text-faint);
550
+ letter-spacing: 0.06em;
551
+ white-space: nowrap;
552
+ }
553
+ .room-mem-card .stats .v { color: var(--text-soft); }
554
+ .room-mem-card .summary {
555
+ font-family: var(--font-human);
556
+ font-size: 12px;
557
+ color: var(--text-dim);
558
+ line-height: 1.55;
559
+ letter-spacing: -0.003em;
560
+ margin-bottom: 12px;
561
+ }
562
+ .room-mem-card .lessons {
563
+ list-style: none;
564
+ padding: 0;
565
+ margin: 0;
566
+ display: flex;
567
+ flex-direction: column;
568
+ gap: 5px;
569
+ padding-top: 11px;
570
+ border-top: 0.5px dotted var(--line-bright);
571
+ }
572
+ .room-mem-card .lessons li {
573
+ font-family: var(--font-human);
574
+ font-size: 12.5px;
575
+ color: var(--text-soft);
576
+ line-height: 1.5;
577
+ letter-spacing: -0.003em;
578
+ padding-left: 14px;
579
+ position: relative;
580
+ }
581
+ .room-mem-card .lessons li::before {
582
+ content: "▸";
583
+ position: absolute;
584
+ left: 0;
585
+ top: 3px;
586
+ color: var(--lime);
587
+ font-size: 9px;
588
+ }
589
+
590
+ /* ─── Knowledge ─── */
591
+ .ap-know-block { display: flex; flex-direction: column; gap: 12px; }
592
+
593
+ .ap-know-drop {
594
+ display: grid;
595
+ grid-template-columns: auto 1fr auto;
596
+ gap: 14px;
597
+ align-items: center;
598
+ padding: 16px 18px;
599
+ background: var(--bg);
600
+ border: 0.5px dashed var(--line-strong);
601
+ cursor: pointer;
602
+ transition: all 0.12s;
603
+ }
604
+ .ap-know-drop:hover {
605
+ border-color: var(--lime);
606
+ border-style: solid;
607
+ background: linear-gradient(135deg, var(--bg) 0%, rgba(111, 181, 114, 0.04) 100%);
608
+ }
609
+ .ap-know-drop .icon {
610
+ width: 36px;
611
+ height: 36px;
612
+ border: 0.5px solid var(--line-strong);
613
+ display: flex;
614
+ align-items: center;
615
+ justify-content: center;
616
+ font-family: var(--mono);
617
+ font-size: 18px;
618
+ color: var(--text-dim);
619
+ font-weight: 700;
620
+ }
621
+ .ap-know-drop:hover .icon { border-color: var(--lime); color: var(--lime); }
622
+ .ap-know-drop .title {
623
+ font-family: var(--mono);
624
+ font-size: 12px;
625
+ color: var(--text);
626
+ font-weight: 700;
627
+ letter-spacing: -0.003em;
628
+ }
629
+ .ap-know-drop .deck {
630
+ font-family: var(--font-human);
631
+ font-size: 11px;
632
+ color: var(--text-dim);
633
+ margin-top: 2px;
634
+ letter-spacing: -0.003em;
635
+ }
636
+ .ap-know-drop .pill {
637
+ font-family: var(--mono);
638
+ font-size: 9.5px;
639
+ font-weight: 700;
640
+ text-transform: uppercase;
641
+ letter-spacing: 0.1em;
642
+ padding: 5px 10px;
643
+ border: 0.5px solid var(--line-strong);
644
+ color: var(--text-soft);
645
+ background: var(--panel-2);
646
+ white-space: nowrap;
647
+ }
648
+ .ap-know-drop:hover .pill { border-color: var(--lime); color: var(--lime); }
649
+
650
+ .ap-know-list { display: flex; flex-direction: column; }
651
+ .ap-know-row {
652
+ display: grid;
653
+ grid-template-columns: auto 1fr auto auto;
654
+ gap: 14px;
655
+ align-items: center;
656
+ padding: 11px 14px;
657
+ background: var(--bg);
658
+ border: 0.5px solid var(--line-bright);
659
+ border-top: none;
660
+ transition: background 0.1s;
661
+ }
662
+ .ap-know-row:first-child { border-top: 0.5px solid var(--line-bright); }
663
+ .ap-know-row:hover { background: var(--panel-2); }
664
+ .ap-know-row .ext {
665
+ width: 32px;
666
+ height: 32px;
667
+ display: flex;
668
+ align-items: center;
669
+ justify-content: center;
670
+ font-family: var(--mono);
671
+ font-size: 9px;
672
+ font-weight: 700;
673
+ text-transform: uppercase;
674
+ letter-spacing: 0.04em;
675
+ border: 0.5px solid;
676
+ color: var(--text-soft);
677
+ background: var(--panel-2);
678
+ }
679
+ .ap-know-row .ext[data-type="pdf"] { color: var(--red); border-color: rgba(181, 112, 106, 0.5); background: rgba(181, 112, 106, 0.06); }
680
+ .ap-know-row .ext[data-type="md"] { color: var(--lime); border-color: var(--lime-dim); background: rgba(111, 181, 114, 0.06); }
681
+ .ap-know-row .ext[data-type="doc"] { color: var(--cyan); border-color: rgba(106, 155, 151, 0.4); background: rgba(106, 155, 151, 0.06); }
682
+ .ap-know-row .ext[data-type="epub"] { color: var(--magenta); border-color: rgba(142, 122, 142, 0.5); background: rgba(142, 122, 142, 0.06); }
683
+ .ap-know-row .ext[data-type="txt"] { color: var(--text-soft); border-color: var(--line-strong); }
684
+ .ap-know-row .ext[data-type="link"] { color: var(--amber); border-color: rgba(181, 149, 96, 0.5); background: rgba(181, 149, 96, 0.06); }
685
+
686
+ .ap-know-row .info { min-width: 0; }
687
+ .ap-know-row .name {
688
+ font-family: var(--mono);
689
+ font-size: 12px;
690
+ color: var(--text);
691
+ font-weight: 700;
692
+ letter-spacing: -0.003em;
693
+ white-space: nowrap;
694
+ overflow: hidden;
695
+ text-overflow: ellipsis;
696
+ }
697
+ .ap-know-row .meta {
698
+ font-family: var(--font-human);
699
+ font-size: 10.5px;
700
+ color: var(--text-faint);
701
+ margin-top: 2px;
702
+ letter-spacing: 0.02em;
703
+ }
704
+ .ap-know-row .meta .sep { color: var(--line-bright); margin: 0 5px; }
705
+ .ap-know-row .indexed {
706
+ font-family: var(--mono);
707
+ font-size: 9px;
708
+ text-transform: uppercase;
709
+ letter-spacing: 0.12em;
710
+ color: var(--lime);
711
+ font-weight: 700;
712
+ white-space: nowrap;
713
+ }
714
+ .ap-know-row .indexed::before { content: "● "; }
715
+ .ap-know-row .indexed.pending { color: var(--amber); }
716
+ .ap-know-row .indexed.pending::before { content: "▲ "; }
717
+ .ap-know-row .actions { display: flex; gap: 4px; }
718
+ .ap-know-row .actions .icon-btn {
719
+ width: 24px; height: 24px;
720
+ border: 0.5px solid var(--line-bright);
721
+ background: transparent;
722
+ color: var(--text-faint);
723
+ font-family: var(--mono);
724
+ font-size: 11px;
725
+ cursor: pointer;
726
+ display: inline-flex;
727
+ align-items: center;
728
+ justify-content: center;
729
+ text-decoration: none;
730
+ transition: all 0.12s;
731
+ }
732
+ .ap-know-row .actions .icon-btn:hover { border-color: var(--lime); color: var(--lime); }
733
+ .ap-know-row .actions .icon-btn.danger:hover { border-color: var(--red); color: var(--red); }
734
+
735
+ .ap-know-empty {
736
+ padding: 24px;
737
+ text-align: center;
738
+ font-family: var(--mono);
739
+ font-size: 11px;
740
+ color: var(--text-faint);
741
+ letter-spacing: 0.06em;
742
+ text-transform: uppercase;
743
+ border: 0.5px dashed var(--line-bright);
744
+ }
745
+
746
+ /* Active state for sidebar agent rows is defined in each dashboard's
747
+ stylesheet (matched to .session-row.active for consistency). */
748
+
749
+ /* Mobile */
750
+ @media (max-width: 600px) {
751
+ .agent-page-cover { height: 70px; }
752
+ .agent-page-identity { grid-template-columns: auto 1fr; padding: 10px 16px 14px; }
753
+ .agent-page-id-buttons { display: none; }
754
+ .agent-page-avatar { width: 64px; height: 64px; margin-top: -34px; }
755
+ .agent-page-id .name { font-size: 18px; }
756
+ .agent-page-stack { padding: 22px 16px 36px; gap: 28px; }
757
+ .ap-instr-doc { padding: 18px 16px; }
758
+ }
759
+
760
+
761
+ /* ═══════════════════════════════════════════
762
+ GAME-CARD layout (Director console)
763
+ ─────────────────────────────────────────────
764
+ New chrome inspired by an RPG character sheet:
765
+ header tabs · left portrait · right 2x2 grid
766
+ (Badges / Intel / Skills / Equipment) · roster row
767
+ · single bright lime CTA. Boardroom palette
768
+ (lime on charcoal), no shadows, hairline lines.
769
+ ═════════════════════════════════════════════ */
770
+
771
+ /* NOTE: agent-picker.css also defines `.ap-card` (each director tile in
772
+ the convene overlay is an .ap-card grid of avatar + info + add-btn).
773
+ That stylesheet loads earlier but defines `display: grid`, a hover
774
+ background, etc. — and our rule below doesn't redeclare those, so
775
+ the grid + hover would leak into the profile. Override every
776
+ conflicting prop (including :hover) to keep the profile shell calm. */
777
+ .ap-card {
778
+ display: block;
779
+ grid-template-columns: none;
780
+ gap: 0;
781
+ align-items: stretch;
782
+ cursor: default;
783
+ text-decoration: none;
784
+ transition: none;
785
+ max-width: 1100px;
786
+ margin: 22px auto 40px;
787
+ padding: 0 28px;
788
+ background: transparent;
789
+ border: none;
790
+ position: relative;
791
+ font-family: var(--sans);
792
+ }
793
+ /* Full-width profile card variant · sibling of .ap-card directly
794
+ inside .main-view, so it spans the entire main-view width without
795
+ the 1100px max-width or horizontal padding that constrains the
796
+ two-column layout below. Sticky to the top of the scroll container
797
+ (.main-view) so the avatar/name banner stays visible while the
798
+ content below scrolls. */
799
+ .ap-profile-card.ap-profile-card-full {
800
+ position: sticky;
801
+ top: 0;
802
+ z-index: 50;
803
+ width: 100%;
804
+ max-width: none;
805
+ margin: 0;
806
+ border-left: none;
807
+ border-right: none;
808
+ border-top: none;
809
+ }
810
+ .ap-card:hover {
811
+ background: transparent;
812
+ border-color: transparent;
813
+ }
814
+ .ap-layout {
815
+ display: grid;
816
+ grid-template-columns: minmax(0, 1fr) 320px;
817
+ gap: 18px;
818
+ align-items: start;
819
+ }
820
+ @media (max-width: 880px) {
821
+ .ap-layout { grid-template-columns: 1fr; }
822
+ }
823
+ .ap-main-col,
824
+ .ap-side-col {
825
+ display: flex;
826
+ flex-direction: column;
827
+ gap: 16px;
828
+ min-width: 0;
829
+ }
830
+ /* Standalone module card · used by every block in both columns.
831
+ Soft rounded corners + a single subtle border so the card reads as
832
+ a calm surface, not a HUD chrome panel. Works equally well on
833
+ dark themes (eastwood/jtriley) and light themes (atrium/pinterest). */
834
+ /* Block · column layout, padding lives on the body so the header
835
+ reads as a full-width strip (mirrors the convene overlay's
836
+ .panel + .panel-head pattern). */
837
+ .ap-block {
838
+ background: var(--panel-2);
839
+ border: 0.5px solid var(--line);
840
+ padding: 0;
841
+ display: flex;
842
+ flex-direction: column;
843
+ gap: 0;
844
+ position: relative;
845
+ }
846
+ .ap-block > *:not(.ap-block-h) {
847
+ padding: 18px 22px 20px;
848
+ }
849
+ .ap-block-body {
850
+ display: flex;
851
+ flex-direction: column;
852
+ gap: 0;
853
+ min-width: 0;
854
+ }
855
+ /* Section header · compact strip across the top of the block. Tight
856
+ padding, panel-3 surface, mono uppercase title with the lime "// "
857
+ prefix lifted from the convene overlay's tune_room treatment. */
858
+ .ap-block-h {
859
+ display: flex;
860
+ align-items: center;
861
+ justify-content: space-between;
862
+ gap: 12px;
863
+ margin: 0;
864
+ padding: 6px 14px;
865
+ background: var(--panel-3);
866
+ border-bottom: 0.5px solid var(--line-bright);
867
+ font-family: var(--mono);
868
+ font-size: 10px;
869
+ font-weight: 700;
870
+ letter-spacing: 0.14em;
871
+ text-transform: uppercase;
872
+ color: var(--text);
873
+ line-height: 1.4;
874
+ min-height: 28px;
875
+ }
876
+ .ap-block-h-title {
877
+ display: inline-flex;
878
+ align-items: center;
879
+ gap: 6px;
880
+ line-height: 1.2;
881
+ }
882
+ .ap-block-h-title::before {
883
+ content: "// ";
884
+ color: var(--lime);
885
+ }
886
+ .ap-block-h-tag {
887
+ font-family: var(--mono);
888
+ font-size: 9.5px;
889
+ font-weight: 600;
890
+ letter-spacing: 0.06em;
891
+ color: var(--text-dim);
892
+ text-transform: uppercase;
893
+ }
894
+ .ap-block-h-action {
895
+ font-family: var(--mono);
896
+ font-size: 9px;
897
+ font-weight: 700;
898
+ letter-spacing: 0.12em;
899
+ color: var(--text-soft);
900
+ text-transform: uppercase;
901
+ background: transparent;
902
+ border: 0.5px solid var(--line-bright);
903
+ padding: 3px 8px;
904
+ cursor: pointer;
905
+ transition: border-color 0.12s, color 0.12s, background 0.12s;
906
+ }
907
+ .ap-block-h-action:hover {
908
+ border-color: var(--text-faint);
909
+ color: var(--text);
910
+ background: var(--panel);
911
+ }
912
+ .ap-sec-hint {
913
+ font-family: var(--mono);
914
+ font-size: 9px;
915
+ font-weight: 500;
916
+ letter-spacing: 0.06em;
917
+ color: var(--text-faint);
918
+ text-transform: uppercase;
919
+ margin-left: 8px;
920
+ }
921
+ /* Profile card · the new-agent overlay still uses the corner brackets,
922
+ so scope them to .ap-card.create only. The read-only profile reads
923
+ as a calmer panel. */
924
+ .ap-card.create::before, .ap-card.create::after,
925
+ .ap-card.create .ap-card-corner {
926
+ content: "";
927
+ position: absolute;
928
+ width: 10px; height: 10px;
929
+ border: 2px solid var(--lime);
930
+ pointer-events: none;
931
+ }
932
+ .ap-card.create::before { top: -2px; left: -2px; border-right: none; border-bottom: none; }
933
+ .ap-card.create::after { bottom: -2px; right: -2px; border-left: none; border-top: none; }
934
+ .ap-card.create .ap-card-corner.tr { top: -2px; right: -2px; border-left: none; border-bottom: none; }
935
+ .ap-card.create .ap-card-corner.bl { bottom: -2px; left: -2px; border-right: none; border-top: none; }
936
+ .ap-card.create { border: 2px solid var(--lime-dim); }
937
+
938
+ /* ── Header bar with tabs ─────────────────────────── */
939
+ .ap-card-head {
940
+ display: grid;
941
+ grid-template-columns: 36px 1fr 36px;
942
+ align-items: center;
943
+ gap: 12px;
944
+ padding: 12px 16px;
945
+ border-bottom: 0.5px solid var(--line-bright);
946
+ background: var(--panel-3);
947
+ }
948
+ .ap-back, .ap-menu {
949
+ width: 32px; height: 32px;
950
+ background: transparent;
951
+ border: 0.5px solid var(--line-bright);
952
+ color: var(--text-soft);
953
+ font-family: var(--mono);
954
+ font-size: 14px;
955
+ line-height: 1;
956
+ cursor: pointer;
957
+ display: flex;
958
+ align-items: center;
959
+ justify-content: center;
960
+ transition: all 0.12s;
961
+ }
962
+ .ap-back:hover, .ap-menu:hover {
963
+ border-color: var(--lime);
964
+ color: var(--lime);
965
+ }
966
+ .ap-tabs {
967
+ display: inline-flex;
968
+ justify-content: center;
969
+ background: var(--bg);
970
+ border: 0.5px solid var(--line-bright);
971
+ padding: 3px;
972
+ margin: 0 auto;
973
+ }
974
+ .ap-tab {
975
+ background: transparent;
976
+ border: none;
977
+ color: var(--text-soft);
978
+ padding: 6px 16px;
979
+ font-family: var(--mono);
980
+ font-size: 10.5px;
981
+ font-weight: 700;
982
+ letter-spacing: 0.18em;
983
+ text-transform: uppercase;
984
+ cursor: pointer;
985
+ transition: all 0.12s;
986
+ }
987
+ .ap-tab:hover {
988
+ color: var(--lime);
989
+ }
990
+ .ap-tab.active {
991
+ background: var(--lime);
992
+ color: var(--bg);
993
+ cursor: default;
994
+ }
995
+ .ap-tab[disabled] { opacity: 0.4; cursor: not-allowed; pointer-events: none; }
996
+
997
+ /* ── Profile-header card (cover + overlapping avatar) ──
998
+ The cover image fills the top of the card edge-to-edge;
999
+ the circular avatar is absolutely positioned so it
1000
+ overlaps the cover/body boundary; name + meta sit in
1001
+ the body below. Reference: Dribbble Amanda Smith. */
1002
+ .ap-profile-card {
1003
+ position: relative;
1004
+ background: var(--panel-2);
1005
+ border: 0.5px solid var(--line-bright);
1006
+ overflow: hidden;
1007
+ }
1008
+ .ap-cover {
1009
+ height: 84px;
1010
+ position: relative;
1011
+ overflow: hidden;
1012
+ border-bottom: 0.5px solid var(--line-bright);
1013
+ }
1014
+ .ap-cover-art {
1015
+ position: absolute;
1016
+ inset: 0;
1017
+ background:
1018
+ linear-gradient(120deg, var(--panel-3) 0%, var(--panel-2) 100%);
1019
+ }
1020
+ /* ⋯ menu now lives inside the body row at the right end · sits in
1021
+ line with the name+meta column rather than floating in the cover. */
1022
+ .ap-id-menu {
1023
+ flex-shrink: 0;
1024
+ align-self: center;
1025
+ width: 28px;
1026
+ height: 28px;
1027
+ border: 0.5px solid var(--line-bright);
1028
+ background: transparent;
1029
+ color: var(--text-soft);
1030
+ font-size: 16px;
1031
+ line-height: 1;
1032
+ cursor: pointer;
1033
+ display: flex;
1034
+ align-items: center;
1035
+ justify-content: center;
1036
+ transition: background 0.12s, color 0.12s, border-color 0.12s;
1037
+ }
1038
+ .ap-id-menu:hover { background: var(--panel-3); color: var(--text); border-color: var(--text-faint); }
1039
+
1040
+ /* ⋯ menu popover · floats over the profile, anchored to the
1041
+ menu button via fixed positioning set in JS. */
1042
+ .ap-id-menu-pop {
1043
+ position: fixed;
1044
+ z-index: 9100;
1045
+ min-width: 220px;
1046
+ background: var(--panel);
1047
+ border: 0.5px solid var(--line-strong);
1048
+ display: flex;
1049
+ flex-direction: column;
1050
+ }
1051
+ .ap-id-menu-item {
1052
+ display: flex;
1053
+ align-items: center;
1054
+ gap: 10px;
1055
+ padding: 10px 14px;
1056
+ background: transparent;
1057
+ border: none;
1058
+ border-bottom: 0.5px solid var(--line-bright);
1059
+ color: var(--text);
1060
+ font-family: var(--font-human);
1061
+ font-size: 12.5px;
1062
+ text-align: left;
1063
+ cursor: pointer;
1064
+ transition: background 0.1s;
1065
+ }
1066
+ .ap-id-menu-item:last-child { border-bottom: none; }
1067
+ .ap-id-menu-item:hover { background: var(--panel-2); }
1068
+ .ap-id-menu-mark { font-family: var(--mono); font-size: 11px; color: var(--lime); }
1069
+ /* Disabled state · used for the chair's locked-avatar row. Looks like
1070
+ the active items but doesn't react to hover and the mark switches
1071
+ to the muted ⊘ glyph. */
1072
+ .ap-id-menu-item.disabled {
1073
+ cursor: not-allowed;
1074
+ color: var(--text-faint);
1075
+ opacity: 0.85;
1076
+ }
1077
+ .ap-id-menu-item.disabled:hover { background: transparent; }
1078
+ .ap-id-menu-item.disabled .ap-id-menu-mark { color: var(--text-faint); }
1079
+ /* Hairline divider · separates routine actions from destructive ones
1080
+ (Delete) so the menu reads as two distinct groups. */
1081
+ .ap-id-menu-divider {
1082
+ height: 0.5px;
1083
+ background: var(--line-strong);
1084
+ margin: 4px 0;
1085
+ }
1086
+ /* Danger variant · used for "Delete director". Red label + glyph
1087
+ on idle, full red fill on hover so the destructive action is
1088
+ unmistakeably distinct from the regular ones. */
1089
+ .ap-id-menu-item-danger {
1090
+ color: var(--red, #B5706A);
1091
+ }
1092
+ .ap-id-menu-item-danger .ap-id-menu-mark {
1093
+ color: var(--red, #B5706A);
1094
+ }
1095
+ .ap-id-menu-item-danger:hover {
1096
+ background: var(--red, #B5706A);
1097
+ color: var(--bg);
1098
+ }
1099
+ .ap-id-menu-item-danger:hover .ap-id-menu-mark { color: var(--bg); }
1100
+ .ap-profile-body {
1101
+ position: relative;
1102
+ display: flex;
1103
+ align-items: center;
1104
+ gap: 18px;
1105
+ padding: 8px 32px 12px;
1106
+ }
1107
+ .ap-avatar {
1108
+ position: relative;
1109
+ width: 76px;
1110
+ height: 76px;
1111
+ margin-top: -46px;
1112
+ margin-bottom: 0;
1113
+ border-radius: 50%;
1114
+ background: var(--panel-2);
1115
+ /* Ring color follows the page bg so the avatar reads as separated
1116
+ from the cover gradient on every theme · in light themes the ring
1117
+ is white against the gray cover; in dark themes the ring is the
1118
+ near-black bg against the panel-toned cover. */
1119
+ border: 4px solid var(--bg);
1120
+ overflow: hidden;
1121
+ display: flex;
1122
+ align-items: center;
1123
+ justify-content: center;
1124
+ flex-shrink: 0;
1125
+ z-index: 2;
1126
+ }
1127
+ .ap-avatar img {
1128
+ width: 100%;
1129
+ height: 100%;
1130
+ object-fit: cover;
1131
+ image-rendering: pixelated;
1132
+ image-rendering: crisp-edges;
1133
+ }
1134
+ /* Text column · sits to the right of the avatar in the same row,
1135
+ so name + meta read as one tight identifier block. */
1136
+ .ap-id-text {
1137
+ display: flex;
1138
+ flex-direction: column;
1139
+ gap: 6px;
1140
+ flex: 1;
1141
+ min-width: 0;
1142
+ padding-top: 2px;
1143
+ }
1144
+ .ap-id-name {
1145
+ font-family: var(--font-human);
1146
+ font-size: 22px;
1147
+ font-weight: 700;
1148
+ color: var(--text);
1149
+ letter-spacing: -0.018em;
1150
+ line-height: 1.15;
1151
+ margin: 0;
1152
+ }
1153
+ .ap-id-meta {
1154
+ display: flex;
1155
+ align-items: center;
1156
+ gap: 8px;
1157
+ flex-wrap: wrap;
1158
+ line-height: 1.2;
1159
+ }
1160
+ .ap-id-role {
1161
+ font-family: var(--mono);
1162
+ font-size: 10px;
1163
+ font-weight: 700;
1164
+ letter-spacing: 0.18em;
1165
+ text-transform: uppercase;
1166
+ color: var(--text-soft);
1167
+ }
1168
+ .ap-id-dot { color: var(--text-faint); font-size: 10px; }
1169
+ .ap-id-handle {
1170
+ font-family: var(--mono);
1171
+ font-size: 10.5px;
1172
+ color: var(--text-faint);
1173
+ letter-spacing: 0.02em;
1174
+ }
1175
+ .ap-status-pill {
1176
+ display: inline-flex;
1177
+ align-items: center;
1178
+ padding: 3px 10px;
1179
+ margin-left: 6px;
1180
+ background: var(--panel-3);
1181
+ border: 0.5px solid var(--line-bright);
1182
+ color: var(--text-soft);
1183
+ font-family: var(--mono);
1184
+ font-size: 8.5px;
1185
+ font-weight: 700;
1186
+ letter-spacing: 0.14em;
1187
+ text-transform: uppercase;
1188
+ line-height: 1.2;
1189
+ }
1190
+
1191
+ /* ── Body · single-column module stack ─────────────── */
1192
+ .ap-card-body {
1193
+ padding: 18px 28px 32px;
1194
+ }
1195
+
1196
+ /* ── Module grid (single col by default; sections opt-in to span) ── */
1197
+ .ap-grid {
1198
+ display: grid;
1199
+ grid-template-columns: 1fr 1fr;
1200
+ gap: 16px;
1201
+ }
1202
+ @media (max-width: 560px) {
1203
+ .ap-grid { grid-template-columns: 1fr; }
1204
+ }
1205
+ .ap-sec {
1206
+ display: flex;
1207
+ flex-direction: column;
1208
+ gap: 10px;
1209
+ padding: 14px;
1210
+ background: var(--panel);
1211
+ border: 0.5px solid var(--line-bright);
1212
+ position: relative;
1213
+ }
1214
+ .ap-sec h3 {
1215
+ font-family: var(--mono);
1216
+ font-size: 9.5px;
1217
+ font-weight: 700;
1218
+ letter-spacing: 0.22em;
1219
+ text-transform: uppercase;
1220
+ color: var(--text-soft);
1221
+ margin: 0;
1222
+ padding-bottom: 6px;
1223
+ border-bottom: 0.5px dashed var(--line-bright);
1224
+ }
1225
+ .ap-sec.full { grid-column: 1 / -1; }
1226
+
1227
+ /* Badges · square tiles */
1228
+ .ap-badges-tiles {
1229
+ display: flex;
1230
+ gap: 8px;
1231
+ flex-wrap: wrap;
1232
+ align-items: center;
1233
+ min-height: 48px;
1234
+ }
1235
+ .ap-tile {
1236
+ width: 44px; height: 44px;
1237
+ border: 0.5px solid var(--lime-dim);
1238
+ background: var(--panel-3);
1239
+ color: var(--lime);
1240
+ display: flex;
1241
+ align-items: center;
1242
+ justify-content: center;
1243
+ font-size: 18px;
1244
+ font-family: var(--mono);
1245
+ position: relative;
1246
+ }
1247
+ .ap-tile .ap-tile-label {
1248
+ position: absolute;
1249
+ bottom: -14px;
1250
+ left: 50%;
1251
+ transform: translateX(-50%);
1252
+ font-size: 8px;
1253
+ letter-spacing: 0.14em;
1254
+ color: var(--text-faint);
1255
+ text-transform: uppercase;
1256
+ white-space: nowrap;
1257
+ }
1258
+ .ap-tile.empty {
1259
+ border-style: dashed;
1260
+ border-color: var(--line-bright);
1261
+ color: var(--text-faint);
1262
+ background: transparent;
1263
+ }
1264
+
1265
+ /* Intel · bio prose. The .ap-intel-view variant matches body but
1266
+ rendered inside the .ap-intel container so the edit toggle can swap
1267
+ it with a textarea (mirrors the Instruction edit pattern). */
1268
+ .ap-intel-view,
1269
+ .ap-intel-body {
1270
+ font-family: var(--font-human);
1271
+ font-size: 12.5px;
1272
+ line-height: 1.55;
1273
+ color: var(--text);
1274
+ letter-spacing: -0.003em;
1275
+ }
1276
+
1277
+ /* Skills · 4 progress bars */
1278
+ .ap-skill-rows { display: flex; flex-direction: column; gap: 9px; }
1279
+ .ap-skill-row {
1280
+ display: grid;
1281
+ grid-template-columns: 96px 1fr 32px;
1282
+ align-items: center;
1283
+ gap: 10px;
1284
+ }
1285
+ .ap-skill-label {
1286
+ font-family: var(--mono);
1287
+ font-size: 9.5px;
1288
+ letter-spacing: 0.1em;
1289
+ text-transform: uppercase;
1290
+ color: var(--text-soft);
1291
+ }
1292
+ .ap-skill-bar {
1293
+ height: 8px;
1294
+ background: var(--bg);
1295
+ border: 0.5px solid var(--line-bright);
1296
+ position: relative;
1297
+ overflow: hidden;
1298
+ }
1299
+ .ap-skill-fill {
1300
+ height: 100%;
1301
+ background: var(--lime);
1302
+ /* Pixel-art segment scan so the bar feels 8-bit. */
1303
+ background-image: linear-gradient(
1304
+ 90deg, transparent 0, transparent 7px,
1305
+ rgba(0,0,0,0.18) 7px, rgba(0,0,0,0.18) 8px
1306
+ );
1307
+ background-size: 8px 100%;
1308
+ }
1309
+ .ap-skill-val {
1310
+ font-family: var(--mono);
1311
+ font-size: 10px;
1312
+ color: var(--lime);
1313
+ font-weight: 700;
1314
+ text-align: right;
1315
+ }
1316
+
1317
+ /* ─── Skills v2 · uploaded Skill.md files ────────────────────────────
1318
+ Replaces the prototype inventory grid. Pattern · radar at top,
1319
+ per-skill rows below, drop-zone at the foot. PRD: docs/PRD-skills.md. */
1320
+ .ap-skills-v2 {
1321
+ display: flex;
1322
+ flex-direction: column;
1323
+ gap: 14px;
1324
+ }
1325
+ .ap-skills-radar-wrap {
1326
+ display: flex;
1327
+ align-items: center;
1328
+ justify-content: center;
1329
+ }
1330
+ .ap-radar {
1331
+ width: 100%;
1332
+ max-width: 290px;
1333
+ height: auto;
1334
+ display: block;
1335
+ }
1336
+ .ap-radar-grid {
1337
+ fill: none;
1338
+ stroke: var(--line-bright);
1339
+ stroke-width: 1;
1340
+ opacity: 0.45;
1341
+ }
1342
+ .ap-radar-spoke {
1343
+ stroke: var(--line);
1344
+ stroke-width: 1;
1345
+ opacity: 0.6;
1346
+ }
1347
+ .ap-radar-base {
1348
+ fill: var(--text-faint);
1349
+ fill-opacity: 0.18;
1350
+ stroke: var(--text-faint);
1351
+ stroke-width: 1;
1352
+ stroke-opacity: 0.7;
1353
+ }
1354
+ .ap-radar-current {
1355
+ fill: var(--lime);
1356
+ fill-opacity: 0.32;
1357
+ stroke: var(--lime);
1358
+ stroke-width: 1.5;
1359
+ }
1360
+ .ap-radar-axis-label {
1361
+ font-family: var(--mono);
1362
+ font-size: 8px;
1363
+ font-weight: 700;
1364
+ letter-spacing: 0.12em;
1365
+ fill: var(--text-soft);
1366
+ text-transform: uppercase;
1367
+ }
1368
+
1369
+ /* List · scrolls internally past 6 rows so a 12-skill chair doesn't
1370
+ blow up the panel height. The thumb fades in on hover/scroll via the
1371
+ same auto-hide pattern used in the agent overlay. */
1372
+ .ap-skills-list {
1373
+ display: flex;
1374
+ flex-direction: column;
1375
+ gap: 4px;
1376
+ max-height: 252px;
1377
+ overflow-y: auto;
1378
+ margin: 0 -2px;
1379
+ padding: 0 2px;
1380
+ scrollbar-width: thin;
1381
+ scrollbar-color: transparent transparent;
1382
+ scrollbar-gutter: stable;
1383
+ }
1384
+ .ap-skills-list:hover { scrollbar-color: var(--text-faint) transparent; }
1385
+ .ap-skills-list::-webkit-scrollbar { width: 6px; }
1386
+ .ap-skills-list::-webkit-scrollbar-track { background: transparent; }
1387
+ .ap-skills-list::-webkit-scrollbar-thumb { background: transparent; transition: background 0.18s; }
1388
+ .ap-skills-list:hover::-webkit-scrollbar-thumb { background: var(--text-faint); }
1389
+
1390
+ /* Single-line dense row · ◆ + name + inline deltas + ⋯ menu.
1391
+ Total height ≈ 32px. Uninstall folded into the popover so the row
1392
+ stays single-line at common widths. */
1393
+ .ap-skill-row {
1394
+ display: flex;
1395
+ align-items: center;
1396
+ gap: 10px;
1397
+ padding: 7px 10px;
1398
+ background: var(--bg);
1399
+ border: 0.5px solid var(--line-bright);
1400
+ font-family: var(--font-human);
1401
+ transition: border-color 0.12s, background 0.12s;
1402
+ min-height: 32px;
1403
+ }
1404
+ .ap-skill-row:hover {
1405
+ border-color: var(--text-faint);
1406
+ background: var(--panel);
1407
+ }
1408
+ .ap-skill-row-mark {
1409
+ flex-shrink: 0;
1410
+ color: var(--lime);
1411
+ font-size: 9px;
1412
+ line-height: 1;
1413
+ }
1414
+ .ap-skill-row-name {
1415
+ flex: 1 1 auto;
1416
+ min-width: 0;
1417
+ font-size: 12.5px;
1418
+ font-weight: 600;
1419
+ color: var(--text);
1420
+ letter-spacing: -0.005em;
1421
+ line-height: 1.3;
1422
+ white-space: nowrap;
1423
+ overflow: hidden;
1424
+ text-overflow: ellipsis;
1425
+ }
1426
+ .ap-skill-row-deltas {
1427
+ flex-shrink: 0;
1428
+ display: inline-flex;
1429
+ align-items: baseline;
1430
+ gap: 8px;
1431
+ font-family: var(--mono);
1432
+ font-size: 9.5px;
1433
+ letter-spacing: 0.02em;
1434
+ color: var(--text-soft);
1435
+ white-space: nowrap;
1436
+ overflow: hidden;
1437
+ max-width: 50%;
1438
+ text-overflow: ellipsis;
1439
+ }
1440
+ .ap-skill-row-menu {
1441
+ flex-shrink: 0;
1442
+ width: 20px;
1443
+ height: 20px;
1444
+ background: transparent;
1445
+ border: 0.5px solid transparent;
1446
+ color: var(--text-faint);
1447
+ font-family: var(--mono);
1448
+ font-size: 14px;
1449
+ line-height: 1;
1450
+ cursor: pointer;
1451
+ display: flex;
1452
+ align-items: center;
1453
+ justify-content: center;
1454
+ letter-spacing: 0;
1455
+ transition: color 0.12s, border-color 0.12s, background 0.12s;
1456
+ }
1457
+ .ap-skill-row-menu:hover {
1458
+ color: var(--text);
1459
+ border-color: var(--line-bright);
1460
+ background: var(--bg);
1461
+ }
1462
+
1463
+ /* Inline delta · "rigor +2" · axis label muted, value color-coded by
1464
+ sign. Tight gap so multiple deltas read as one breath. */
1465
+ .ap-sd { display: inline-flex; align-items: baseline; gap: 3px; }
1466
+ .ap-sd-l {
1467
+ color: var(--text-faint);
1468
+ text-transform: lowercase;
1469
+ letter-spacing: 0;
1470
+ }
1471
+ .ap-sd-v { font-weight: 700; }
1472
+ .ap-sd-v.pos { color: var(--lime); }
1473
+ .ap-sd-v.neg { color: var(--amber); }
1474
+ .ap-sd-empty {
1475
+ color: var(--text-faint);
1476
+ font-style: italic;
1477
+ font-family: var(--font-human);
1478
+ font-size: 10px;
1479
+ }
1480
+
1481
+ .ap-skills-drop {
1482
+ display: flex;
1483
+ align-items: center;
1484
+ justify-content: center;
1485
+ gap: 6px;
1486
+ padding: 7px 12px;
1487
+ background: var(--panel);
1488
+ border: 0.5px dashed var(--line-bright);
1489
+ color: var(--text-soft);
1490
+ font-family: var(--font-human);
1491
+ font-size: 11.5px;
1492
+ font-weight: 400;
1493
+ letter-spacing: -0.003em;
1494
+ cursor: pointer;
1495
+ transition: border-color 0.12s, color 0.12s, background 0.12s;
1496
+ }
1497
+ .ap-skills-drop:hover {
1498
+ border-color: var(--text-faint);
1499
+ color: var(--text);
1500
+ background: var(--panel-2);
1501
+ }
1502
+ .ap-skills-drop.dragging {
1503
+ border-color: var(--lime);
1504
+ color: var(--lime);
1505
+ background: var(--panel-3);
1506
+ }
1507
+ .ap-skills-drop.disabled {
1508
+ cursor: not-allowed;
1509
+ opacity: 0.65;
1510
+ border-color: var(--line);
1511
+ }
1512
+ .ap-skills-drop.disabled:hover {
1513
+ border-color: var(--line);
1514
+ color: var(--text-soft);
1515
+ background: var(--panel);
1516
+ }
1517
+ .ap-skills-drop-mark { font-size: 12px; line-height: 1; color: var(--lime); }
1518
+ .ap-skills-drop-text code {
1519
+ font-family: var(--mono);
1520
+ font-size: 11px;
1521
+ letter-spacing: 0;
1522
+ color: inherit;
1523
+ }
1524
+
1525
+ /* Skill info popover · fixed to the viewport, anchored above the
1526
+ trigger. Folds info + uninstall into one menu so the row stays
1527
+ single-line dense. Closed on outside click (capture-phase listener). */
1528
+ .ap-skill-info-pop {
1529
+ position: fixed;
1530
+ z-index: 9200;
1531
+ width: 300px;
1532
+ max-height: calc(100vh - 32px);
1533
+ overflow-y: auto;
1534
+ padding: 14px 16px;
1535
+ background: var(--panel);
1536
+ border: 0.5px solid var(--line-strong);
1537
+ font-family: var(--font-human);
1538
+ display: flex;
1539
+ flex-direction: column;
1540
+ gap: 10px;
1541
+ }
1542
+ .ap-skill-info-head {
1543
+ font-size: 13.5px;
1544
+ font-weight: 700;
1545
+ color: var(--text);
1546
+ letter-spacing: -0.008em;
1547
+ line-height: 1.25;
1548
+ }
1549
+ .ap-skill-info-sub {
1550
+ font-family: var(--mono);
1551
+ font-size: 9.5px;
1552
+ letter-spacing: 0.06em;
1553
+ color: var(--text-faint);
1554
+ margin-top: -6px;
1555
+ }
1556
+ .ap-skill-info-desc {
1557
+ font-size: 12px;
1558
+ color: var(--text-soft);
1559
+ line-height: 1.55;
1560
+ letter-spacing: -0.003em;
1561
+ }
1562
+ .ap-skill-info-when,
1563
+ .ap-skill-info-ability,
1564
+ .ap-skill-info-tips-wrap {
1565
+ font-size: 11.5px;
1566
+ color: var(--text);
1567
+ line-height: 1.5;
1568
+ }
1569
+ .ap-skill-info-when .lbl,
1570
+ .ap-skill-info-ability .lbl,
1571
+ .ap-skill-info-tips-wrap .lbl {
1572
+ display: block;
1573
+ font-family: var(--mono);
1574
+ font-size: 8.5px;
1575
+ font-weight: 700;
1576
+ letter-spacing: 0.18em;
1577
+ text-transform: uppercase;
1578
+ color: var(--text-faint);
1579
+ margin-bottom: 5px;
1580
+ }
1581
+ .ap-skill-info-ability-row {
1582
+ display: flex;
1583
+ flex-wrap: wrap;
1584
+ gap: 10px;
1585
+ font-family: var(--mono);
1586
+ font-size: 10.5px;
1587
+ }
1588
+ .ap-skill-info-tips {
1589
+ list-style: none;
1590
+ margin: 0;
1591
+ padding: 0;
1592
+ display: flex;
1593
+ flex-direction: column;
1594
+ gap: 4px;
1595
+ }
1596
+ .ap-skill-info-tips li {
1597
+ position: relative;
1598
+ padding-left: 12px;
1599
+ font-size: 11.5px;
1600
+ color: var(--text-soft);
1601
+ line-height: 1.5;
1602
+ }
1603
+ .ap-skill-info-tips li::before {
1604
+ content: "·";
1605
+ position: absolute;
1606
+ left: 4px;
1607
+ color: var(--lime);
1608
+ font-weight: 700;
1609
+ }
1610
+ .ap-skill-info-empty {
1611
+ font-size: 11.5px;
1612
+ color: var(--text-faint);
1613
+ font-style: italic;
1614
+ }
1615
+ .ap-skill-info-actions {
1616
+ margin-top: 4px;
1617
+ padding-top: 12px;
1618
+ border-top: 0.5px solid var(--line-bright);
1619
+ display: flex;
1620
+ justify-content: flex-end;
1621
+ }
1622
+ .ap-skill-info-uninstall {
1623
+ font-family: var(--mono);
1624
+ font-size: 10px;
1625
+ font-weight: 700;
1626
+ letter-spacing: 0.14em;
1627
+ text-transform: uppercase;
1628
+ padding: 6px 12px;
1629
+ background: transparent;
1630
+ border: 0.5px solid var(--line-bright);
1631
+ color: var(--text-soft);
1632
+ cursor: pointer;
1633
+ transition: border-color 0.12s, color 0.12s, background 0.12s;
1634
+ }
1635
+ .ap-skill-info-uninstall:hover {
1636
+ border-color: var(--red, #C85A5A);
1637
+ color: var(--red, #C85A5A);
1638
+ }
1639
+
1640
+ /* System skill variant · row tinted lime, "system" badge, locked notice
1641
+ replaces the uninstall button in the popover. */
1642
+ .ap-skill-row-system .ap-skill-row-mark {
1643
+ color: var(--lime);
1644
+ }
1645
+ .ap-skill-row-sys {
1646
+ display: inline-block;
1647
+ margin-left: 8px;
1648
+ padding: 1px 6px;
1649
+ font-family: var(--mono);
1650
+ font-size: 8.5px;
1651
+ font-weight: 700;
1652
+ letter-spacing: 0.16em;
1653
+ text-transform: uppercase;
1654
+ color: var(--lime);
1655
+ border: 0.5px solid var(--lime-dim, var(--lime));
1656
+ background: transparent;
1657
+ vertical-align: 1px;
1658
+ }
1659
+ .ap-skill-info-sys-badge {
1660
+ display: inline-block;
1661
+ margin-left: 8px;
1662
+ padding: 2px 7px;
1663
+ font-family: var(--mono);
1664
+ font-size: 8.5px;
1665
+ font-weight: 700;
1666
+ letter-spacing: 0.16em;
1667
+ text-transform: uppercase;
1668
+ color: var(--lime);
1669
+ border: 0.5px solid var(--lime-dim, var(--lime));
1670
+ background: transparent;
1671
+ vertical-align: 2px;
1672
+ }
1673
+ .ap-skill-info-locked {
1674
+ margin-top: 4px;
1675
+ padding-top: 12px;
1676
+ border-top: 0.5px solid var(--line-bright);
1677
+ display: flex;
1678
+ align-items: center;
1679
+ gap: 8px;
1680
+ font-family: var(--mono);
1681
+ font-size: 10px;
1682
+ letter-spacing: 0.1em;
1683
+ text-transform: uppercase;
1684
+ color: var(--text-faint);
1685
+ }
1686
+ .ap-skill-info-locked-mark {
1687
+ color: var(--lime);
1688
+ font-size: 12px;
1689
+ line-height: 1;
1690
+ }
1691
+
1692
+ /* Equipment · 6 inventory slots */
1693
+ .ap-equipment-grid {
1694
+ display: grid;
1695
+ grid-template-columns: repeat(6, 1fr);
1696
+ gap: 6px;
1697
+ }
1698
+ /* Compact variant for the right rail · 3 cols, smaller slots. */
1699
+ .ap-equipment-grid.compact {
1700
+ grid-template-columns: repeat(3, 1fr);
1701
+ gap: 8px;
1702
+ }
1703
+ .ap-slot {
1704
+ aspect-ratio: 1;
1705
+ border: 0.5px solid var(--line);
1706
+ background: transparent;
1707
+ display: flex;
1708
+ align-items: center;
1709
+ justify-content: center;
1710
+ font-family: var(--mono);
1711
+ color: var(--text-faint);
1712
+ font-size: 14px;
1713
+ cursor: default;
1714
+ position: relative;
1715
+ opacity: 0.7;
1716
+ transition: border-color 0.12s, background 0.12s, opacity 0.12s, color 0.12s;
1717
+ }
1718
+ .ap-slot:hover {
1719
+ border-color: var(--line-bright);
1720
+ background: var(--panel);
1721
+ opacity: 1;
1722
+ color: var(--text-soft);
1723
+ }
1724
+ .ap-slot.filled {
1725
+ border-color: var(--line-bright);
1726
+ color: var(--text);
1727
+ background: var(--panel-3);
1728
+ opacity: 1;
1729
+ }
1730
+ .ap-slot.filled:hover { border-color: var(--text-faint); }
1731
+ .ap-slot .ap-slot-ext {
1732
+ position: absolute;
1733
+ bottom: 2px;
1734
+ left: 50%;
1735
+ transform: translateX(-50%);
1736
+ font-size: 7.5px;
1737
+ letter-spacing: 0.1em;
1738
+ color: var(--text-faint);
1739
+ text-transform: uppercase;
1740
+ }
1741
+
1742
+ /* Coming-soon block · used by sections (e.g., Equipment) whose feature
1743
+ isn't shipped yet. Centered glyph + title + body copy + status tag,
1744
+ so the section reads as deliberately reserved space rather than an
1745
+ empty grid. */
1746
+ .ap-coming-soon {
1747
+ display: flex;
1748
+ flex-direction: column;
1749
+ align-items: center;
1750
+ text-align: center;
1751
+ gap: 8px;
1752
+ padding: 6px 4px 4px;
1753
+ }
1754
+ .ap-coming-soon-mark {
1755
+ font-family: var(--mono);
1756
+ font-size: 18px;
1757
+ line-height: 1;
1758
+ color: var(--lime-dim);
1759
+ letter-spacing: 0;
1760
+ }
1761
+ .ap-coming-soon-title {
1762
+ font-family: var(--font-human);
1763
+ font-size: 13.5px;
1764
+ font-weight: 700;
1765
+ letter-spacing: -0.005em;
1766
+ color: var(--text);
1767
+ line-height: 1.2;
1768
+ }
1769
+ .ap-coming-soon-body {
1770
+ font-family: var(--font-human);
1771
+ font-size: 12px;
1772
+ line-height: 1.55;
1773
+ color: var(--text-soft);
1774
+ letter-spacing: -0.003em;
1775
+ margin: 0;
1776
+ max-width: 280px;
1777
+ }
1778
+ .ap-coming-soon-tag {
1779
+ margin-top: 4px;
1780
+ font-family: var(--mono);
1781
+ font-size: 9px;
1782
+ font-weight: 700;
1783
+ letter-spacing: 0.16em;
1784
+ text-transform: uppercase;
1785
+ color: var(--lime);
1786
+ border: 0.5px solid var(--lime-dim);
1787
+ padding: 3px 9px;
1788
+ }
1789
+
1790
+ /* Roster · bottom-spanning row showing recent room avatars */
1791
+ .ap-roster-portraits {
1792
+ display: flex;
1793
+ gap: 10px;
1794
+ flex-wrap: wrap;
1795
+ }
1796
+ .ap-portrait-mini {
1797
+ width: 56px; height: 56px;
1798
+ border: 0.5px solid var(--line-strong);
1799
+ background: var(--bg);
1800
+ display: flex;
1801
+ align-items: center;
1802
+ justify-content: center;
1803
+ position: relative;
1804
+ }
1805
+ .ap-portrait-mini img {
1806
+ width: 80%; height: 80%;
1807
+ image-rendering: pixelated;
1808
+ }
1809
+ .ap-portrait-mini.empty {
1810
+ border-style: dashed;
1811
+ border-color: var(--line-bright);
1812
+ color: var(--text-faint);
1813
+ font-family: var(--mono);
1814
+ font-size: 18px;
1815
+ }
1816
+
1817
+ /* ── Footer CTA bar ────────────────────────────────── */
1818
+ .ap-card-foot {
1819
+ border-top: 0.5px solid var(--line-bright);
1820
+ padding: 14px 20px;
1821
+ display: flex;
1822
+ align-items: center;
1823
+ justify-content: space-between;
1824
+ gap: 10px;
1825
+ background: var(--panel-3);
1826
+ }
1827
+ .ap-foot-meta {
1828
+ font-family: var(--mono);
1829
+ font-size: 9.5px;
1830
+ letter-spacing: 0.14em;
1831
+ text-transform: uppercase;
1832
+ color: var(--text-faint);
1833
+ }
1834
+ .ap-cta {
1835
+ display: inline-flex;
1836
+ align-items: center;
1837
+ gap: 10px;
1838
+ background: var(--lime);
1839
+ color: var(--bg);
1840
+ border: 0.5px solid var(--lime);
1841
+ padding: 11px 22px;
1842
+ font-family: var(--mono);
1843
+ font-size: 11px;
1844
+ font-weight: 700;
1845
+ letter-spacing: 0.18em;
1846
+ text-transform: uppercase;
1847
+ cursor: pointer;
1848
+ text-decoration: none;
1849
+ transition: all 0.14s;
1850
+ }
1851
+ .ap-cta:hover {
1852
+ background: transparent;
1853
+ color: var(--lime);
1854
+ }
1855
+ .ap-cta-arrow { font-size: 14px; line-height: 1; }
1856
+
1857
+ /* ═══════════════════════════════════════════
1858
+ PROFILE · MODEL dropdown
1859
+ ─────────────────────────────────────────────
1860
+ Native <select> styled to match the calm
1861
+ panel chrome — no lime accents.
1862
+ ═════════════════════════════════════════════ */
1863
+ /* Model · custom dropdown trigger + popover (replaces native select). */
1864
+ .ap-model-row {
1865
+ display: flex;
1866
+ flex-direction: column;
1867
+ gap: 6px;
1868
+ }
1869
+ /* Single-line trigger · name on the left, provider chip on the right,
1870
+ caret last. Was previously a 2-row layout with provider stacked
1871
+ below the name; the row read way too tall for what's effectively
1872
+ a dropdown trigger. Long names still wrap-protected with ellipsis. */
1873
+ .ap-model-trigger {
1874
+ display: grid;
1875
+ grid-template-columns: minmax(0, 1fr) auto;
1876
+ gap: 10px;
1877
+ align-items: center;
1878
+ background: var(--bg);
1879
+ border: 0.5px solid var(--line-bright);
1880
+ color: var(--text);
1881
+ padding: 6px 12px;
1882
+ cursor: pointer;
1883
+ font-family: inherit;
1884
+ text-align: left;
1885
+ width: 100%;
1886
+ min-width: 0;
1887
+ transition: border-color 0.1s;
1888
+ }
1889
+ .ap-model-trigger-text {
1890
+ display: flex;
1891
+ flex-direction: row;
1892
+ align-items: baseline;
1893
+ gap: 10px;
1894
+ min-width: 0;
1895
+ }
1896
+ .ap-model-trigger:hover { border-color: var(--line-bright); background: var(--panel); }
1897
+ .ap-model-trigger-name {
1898
+ flex: 1 1 auto;
1899
+ font-family: var(--font-human);
1900
+ font-size: 12.5px;
1901
+ font-weight: 700;
1902
+ color: var(--text);
1903
+ letter-spacing: -0.005em;
1904
+ line-height: 1.3;
1905
+ white-space: nowrap;
1906
+ overflow: hidden;
1907
+ text-overflow: ellipsis;
1908
+ min-width: 0;
1909
+ }
1910
+ .ap-model-trigger-provider {
1911
+ flex: 0 0 auto;
1912
+ font-family: var(--mono);
1913
+ font-size: 9px;
1914
+ font-weight: 700;
1915
+ letter-spacing: 0.14em;
1916
+ text-transform: uppercase;
1917
+ color: var(--text-faint);
1918
+ white-space: nowrap;
1919
+ }
1920
+ .ap-model-trigger-caret {
1921
+ color: var(--text-faint);
1922
+ font-size: 11px;
1923
+ line-height: 1;
1924
+ flex-shrink: 0;
1925
+ }
1926
+
1927
+ /* Track Record stats · read-only counters shown below the model
1928
+ selector. Deliberately no background / no border / no padding on
1929
+ the cells: keeping stats as pure typography (vs. the bordered
1930
+ model trigger above) signals that these are passive data, not
1931
+ interactive controls. A hairline divider above the group
1932
+ separates them from the dropdown; thin verticals between the
1933
+ three cells form a clean spec-readout rhythm. */
1934
+ /* Inline status row · "12 rooms · 47 rounds · 1.2k tokens".
1935
+ Replaces the older 3-up tile grid which read as a dashboard widget
1936
+ detached from the rest of the block. Mono with tabular-nums keeps
1937
+ the numerals aligned; lowercase labels match the memory meta-line
1938
+ typography so the whole panel reads as one family. */
1939
+ .ap-stats-grid {
1940
+ display: flex;
1941
+ flex-wrap: wrap;
1942
+ align-items: baseline;
1943
+ gap: 6px 18px;
1944
+ margin-top: 14px;
1945
+ padding-top: 14px;
1946
+ border-top: 0.5px solid var(--line);
1947
+ }
1948
+ .ap-stat {
1949
+ display: inline-flex;
1950
+ align-items: baseline;
1951
+ gap: 5px;
1952
+ padding: 0;
1953
+ background: transparent;
1954
+ border: none;
1955
+ text-align: left;
1956
+ min-width: 0;
1957
+ }
1958
+ .ap-stat-v {
1959
+ font-family: var(--mono);
1960
+ font-size: 13px;
1961
+ font-weight: 700;
1962
+ color: var(--text);
1963
+ letter-spacing: -0.005em;
1964
+ line-height: 1;
1965
+ font-variant-numeric: tabular-nums;
1966
+ }
1967
+ .ap-stat-l {
1968
+ font-family: var(--mono);
1969
+ font-size: 9px;
1970
+ font-weight: 400;
1971
+ letter-spacing: 0.06em;
1972
+ text-transform: lowercase;
1973
+ color: var(--text-faint);
1974
+ line-height: 1;
1975
+ }
1976
+
1977
+ /* Popover — anchored under the trigger. Mirrors the room composer's
1978
+ .cmp-dd-pop dropdown: tight rows, mono micro-type hint inline with
1979
+ the label, provider section headers, hairline scrollbar. One
1980
+ coherent dropdown vocabulary across the prototype. */
1981
+ .ap-model-picker {
1982
+ position: fixed;
1983
+ z-index: 9100;
1984
+ background: var(--panel);
1985
+ border: 0.5px solid var(--line-strong);
1986
+ padding: 2px 0;
1987
+ overflow-y: auto;
1988
+ max-height: 60vh;
1989
+ border-radius: 4px;
1990
+ }
1991
+ .ap-model-picker::-webkit-scrollbar { width: 6px; }
1992
+ .ap-model-picker::-webkit-scrollbar-thumb { background: var(--line-strong); }
1993
+
1994
+ /* Provider section header · matches .cmp-dd-group · mono / faint /
1995
+ uppercase, hairline divider above (suppressed on the first one). */
1996
+ .ap-model-group {
1997
+ font-family: var(--mono);
1998
+ font-size: 8.5px;
1999
+ letter-spacing: 0.18em;
2000
+ text-transform: uppercase;
2001
+ color: var(--text-faint);
2002
+ padding: 8px 10px 3px;
2003
+ border-top: 0.5px solid var(--line);
2004
+ }
2005
+ .ap-model-group:first-child {
2006
+ border-top: none;
2007
+ padding-top: 5px;
2008
+ }
2009
+
2010
+ /* Row · single-line label + uppercase mono hint, baseline-aligned,
2011
+ same vertical rhythm as .cmp-dd-opt. No per-row divider. */
2012
+ .ap-model-opt {
2013
+ display: flex;
2014
+ align-items: baseline;
2015
+ gap: 10px;
2016
+ width: 100%;
2017
+ padding: 5px 10px;
2018
+ background: transparent;
2019
+ border: none;
2020
+ text-align: left;
2021
+ cursor: pointer;
2022
+ transition: background 0.1s;
2023
+ font-family: inherit;
2024
+ color: var(--text);
2025
+ min-width: 0;
2026
+ }
2027
+ .ap-model-opt:hover { background: var(--panel-2); }
2028
+ .ap-model-opt.active { background: var(--panel-3); }
2029
+ .ap-model-opt-label {
2030
+ font-family: var(--font-human);
2031
+ font-size: 12.5px;
2032
+ font-weight: 600;
2033
+ color: var(--text);
2034
+ letter-spacing: -0.005em;
2035
+ line-height: 1.3;
2036
+ flex-shrink: 0;
2037
+ white-space: nowrap;
2038
+ overflow: hidden;
2039
+ text-overflow: ellipsis;
2040
+ min-width: 0;
2041
+ }
2042
+ .ap-model-opt.active .ap-model-opt-label { color: var(--lime); }
2043
+ .ap-model-opt-hint {
2044
+ font-family: var(--mono);
2045
+ font-size: 8.5px;
2046
+ letter-spacing: 0.08em;
2047
+ text-transform: uppercase;
2048
+ /* `--text-dim` (not `--text-faint`) because the deck — "fast · cheap
2049
+ · good", "reasoning · long context", etc. — carries the meaning of
2050
+ each model. Matches `.cmp-dd-opt-hint` in the new-room composer. */
2051
+ color: var(--text-dim);
2052
+ line-height: 1.3;
2053
+ overflow: hidden;
2054
+ text-overflow: ellipsis;
2055
+ white-space: nowrap;
2056
+ }
2057
+ /* Tiny mono square-tag on each picker row · "direct" / "OR" / "direct
2058
+ · OR" so the user can tell at a glance how this model would route.
2059
+ Mirrors `.composer-pick-model` from the new-room "select a director"
2060
+ picker: square corners (no radius), no uppercase, tight 1×5 padding,
2061
+ `--text-soft` on `--panel-2`, `0.5px var(--line)` border. Pinned to
2062
+ the right edge so the label/hint pair keeps its layout. */
2063
+ .ap-model-opt-route {
2064
+ margin-left: auto;
2065
+ padding: 1px 5px;
2066
+ font-family: var(--mono);
2067
+ font-size: 8.5px;
2068
+ letter-spacing: 0.04em;
2069
+ color: var(--text-soft);
2070
+ background: var(--panel-2);
2071
+ border: 0.5px solid var(--line);
2072
+ flex-shrink: 0;
2073
+ line-height: 1.3;
2074
+ white-space: nowrap;
2075
+ }
2076
+ .ap-model-opt.active .ap-model-opt-route {
2077
+ color: var(--lime);
2078
+ border-color: var(--lime-dim);
2079
+ }
2080
+
2081
+ /* Stale-model warning under the trigger · the agent's saved modelV
2082
+ isn't reachable with the current key set. Doesn't block the click
2083
+ (runtime resolves to the global default), but the user should
2084
+ know their pick won't actually be used. */
2085
+ .ap-model-stale {
2086
+ display: flex;
2087
+ align-items: center;
2088
+ gap: 6px;
2089
+ margin-top: 6px;
2090
+ padding: 4px 8px;
2091
+ font-family: var(--mono);
2092
+ font-size: 9.5px;
2093
+ letter-spacing: 0.06em;
2094
+ color: var(--text-soft);
2095
+ background: var(--panel-2);
2096
+ border: 0.5px solid var(--line);
2097
+ border-radius: 3px;
2098
+ }
2099
+ .ap-model-stale-mark {
2100
+ color: var(--amber, #C9A46B);
2101
+ font-size: 11px;
2102
+ line-height: 1;
2103
+ }
2104
+ .ap-model-stale-text {
2105
+ letter-spacing: 0.04em;
2106
+ }
2107
+
2108
+ /* ═══════════════════════════════════════════
2109
+ PROFILE · SKILL slot grid
2110
+ ─────────────────────────────────────────────
2111
+ Read-only mirror of the new-agent overlay's
2112
+ slot grid. Same vocabulary (8 slots in a 4×2
2113
+ inventory), same icons + names — just no
2114
+ click-to-install affordance.
2115
+ ═══════════════════════════════════════════ */
2116
+ .ap-skill-grid {
2117
+ /* 3×3-ish inventory (8 slots, 3 per row + 2 in last row) · fits the
2118
+ 320px right rail with comfortable cell size. */
2119
+ display: grid;
2120
+ grid-template-columns: repeat(3, 1fr);
2121
+ gap: 10px;
2122
+ }
2123
+ .ap-skill-slot {
2124
+ aspect-ratio: 1;
2125
+ background: var(--panel);
2126
+ border: 0.5px solid var(--line);
2127
+ color: var(--text-faint);
2128
+ display: flex;
2129
+ flex-direction: column;
2130
+ align-items: center;
2131
+ justify-content: center;
2132
+ gap: 7px;
2133
+ font-family: var(--mono);
2134
+ position: relative;
2135
+ padding: 8px 6px;
2136
+ cursor: default;
2137
+ transition: border-color 0.12s, background 0.12s, color 0.12s;
2138
+ }
2139
+ .ap-skill-slot.filled {
2140
+ border-color: var(--line-bright);
2141
+ background: var(--panel-3);
2142
+ color: var(--text);
2143
+ }
2144
+ .ap-skill-slot.filled:hover { border-color: var(--text-faint); }
2145
+ /* Info badge · top-right of each filled slot. Hover shows the
2146
+ skill description as a small popover-tooltip (CSS-only). */
2147
+ .ap-skill-info {
2148
+ position: absolute;
2149
+ top: 4px;
2150
+ right: 4px;
2151
+ width: 14px;
2152
+ height: 14px;
2153
+ border: 0.5px solid var(--line-bright);
2154
+ background: var(--bg);
2155
+ color: var(--text-faint);
2156
+ font-family: var(--mono);
2157
+ font-size: 9px;
2158
+ font-weight: 700;
2159
+ font-style: italic;
2160
+ line-height: 1;
2161
+ display: flex;
2162
+ align-items: center;
2163
+ justify-content: center;
2164
+ cursor: help;
2165
+ border-radius: 50%;
2166
+ z-index: 2;
2167
+ transition: color 0.1s, border-color 0.1s;
2168
+ }
2169
+ .ap-skill-info:hover { color: var(--text); border-color: var(--text-soft); }
2170
+ .ap-skill-info::after {
2171
+ content: attr(data-tip);
2172
+ position: absolute;
2173
+ bottom: calc(100% + 6px);
2174
+ right: 0;
2175
+ padding: 6px 9px;
2176
+ background: var(--panel);
2177
+ border: 0.5px solid var(--line-strong);
2178
+ font-family: var(--font-human);
2179
+ font-size: 11px;
2180
+ font-weight: 400;
2181
+ font-style: normal;
2182
+ letter-spacing: -0.003em;
2183
+ color: var(--text);
2184
+ white-space: nowrap;
2185
+ opacity: 0;
2186
+ pointer-events: none;
2187
+ transition: opacity 0.1s;
2188
+ z-index: 3;
2189
+ }
2190
+ .ap-skill-info:hover::after { opacity: 1; }
2191
+ .ap-skill-slot .ap-skill-icon {
2192
+ font-size: 24px;
2193
+ line-height: 1;
2194
+ }
2195
+ .ap-skill-slot.empty {
2196
+ border-style: solid;
2197
+ border-color: var(--line);
2198
+ background: transparent;
2199
+ opacity: 0.7;
2200
+ }
2201
+ .ap-skill-slot.empty .ap-skill-icon {
2202
+ font-size: 20px;
2203
+ font-weight: 300;
2204
+ color: var(--text-faint);
2205
+ opacity: 1;
2206
+ }
2207
+ .ap-skill-slot.empty:hover {
2208
+ border-color: var(--text-faint);
2209
+ background: var(--panel);
2210
+ opacity: 1;
2211
+ }
2212
+ .ap-skill-slot.empty:hover .ap-skill-icon { color: var(--text-soft); }
2213
+ .ap-skill-slot .ap-skill-name {
2214
+ font-family: var(--mono);
2215
+ font-size: 8.5px;
2216
+ font-weight: 700;
2217
+ letter-spacing: 0.08em;
2218
+ text-transform: uppercase;
2219
+ text-align: center;
2220
+ white-space: nowrap;
2221
+ overflow: hidden;
2222
+ text-overflow: ellipsis;
2223
+ max-width: 100%;
2224
+ }
2225
+ .ap-skill-meta {
2226
+ font-family: var(--mono);
2227
+ font-size: 9.5px;
2228
+ color: var(--text-faint);
2229
+ letter-spacing: 0.06em;
2230
+ text-transform: uppercase;
2231
+ margin-top: 4px;
2232
+ }
2233
+ .ap-skill-meta .ap-skill-count {
2234
+ color: var(--text);
2235
+ font-weight: 700;
2236
+ }
2237
+
2238
+
2239
+ /* ═══════════════════════════════════════════
2240
+ PROFILE · INSTRUCTION / RULES / MEMORY blocks
2241
+ ═══════════════════════════════════════════ */
2242
+
2243
+ /* Section subhead next to the h3, used to inline a short usage hint
2244
+ (e.g. "click an empty slot to install"). */
2245
+ .ap-sec h3 .ap-sec-hint {
2246
+ font-size: 9px;
2247
+ font-weight: 400;
2248
+ letter-spacing: 0.06em;
2249
+ text-transform: none;
2250
+ color: var(--text-faint);
2251
+ margin-left: 8px;
2252
+ }
2253
+
2254
+ /* Generic empty-state for sections that have nothing to show. */
2255
+ .ap-empty {
2256
+ padding: 10px 12px;
2257
+ border: 0.5px dashed var(--line-bright);
2258
+ background: var(--bg);
2259
+ font-family: var(--mono);
2260
+ font-size: 11px;
2261
+ color: var(--text-faint);
2262
+ letter-spacing: 0.06em;
2263
+ text-transform: lowercase;
2264
+ text-align: center;
2265
+ }
2266
+
2267
+ /* INSTRUCTION block — labelled prose paragraphs. */
2268
+ /* INSTRUCTION · markdown view + edit toggle. View renders the
2269
+ markdown to HTML; click 'edit' in the section header to swap to
2270
+ the textarea editor. */
2271
+ .ap-instr { display: flex; flex-direction: column; gap: 0; }
2272
+ .ap-instr-view {
2273
+ font-family: var(--font-human);
2274
+ font-size: 12.5px;
2275
+ line-height: 1.6;
2276
+ color: var(--text);
2277
+ /* Collapsed default · ~12 lines of body copy. JS adds an
2278
+ .overflowing class on the parent when scrollHeight exceeds this,
2279
+ which reveals the fade gradient and the show-more toggle. */
2280
+ position: relative;
2281
+ max-height: 240px;
2282
+ overflow: hidden;
2283
+ transition: max-height 0.25s ease;
2284
+ }
2285
+ .ap-instr-view.expanded {
2286
+ max-height: none;
2287
+ }
2288
+ /* Fade-out gradient hugging the bottom edge while collapsed — fades to
2289
+ the parent .ap-block panel colour so it reads as "more below". */
2290
+ .ap-instr-view::after {
2291
+ content: "";
2292
+ position: absolute;
2293
+ left: 0;
2294
+ right: 0;
2295
+ bottom: 0;
2296
+ height: 56px;
2297
+ pointer-events: none;
2298
+ opacity: 0;
2299
+ transition: opacity 0.15s ease;
2300
+ background: linear-gradient(to bottom, transparent, var(--panel-2));
2301
+ }
2302
+ .ap-instr.overflowing .ap-instr-view:not(.expanded)::after { opacity: 1; }
2303
+ /* Toggle button · hidden unless content actually overflows. Mirrors
2304
+ .ap-block-h-action's mono-uppercase look so it sits in the page. */
2305
+ .ap-instr-toggle {
2306
+ display: none;
2307
+ align-self: flex-start;
2308
+ margin-top: 10px;
2309
+ font-family: var(--mono);
2310
+ font-size: 9.5px;
2311
+ font-weight: 700;
2312
+ letter-spacing: 0.14em;
2313
+ text-transform: uppercase;
2314
+ padding: 5px 10px;
2315
+ background: transparent;
2316
+ border: 0.5px solid var(--line-bright);
2317
+ color: var(--text-soft);
2318
+ cursor: pointer;
2319
+ transition: border-color 0.1s, color 0.1s;
2320
+ }
2321
+ .ap-instr-toggle:hover { border-color: var(--text-soft); color: var(--text); }
2322
+ .ap-instr.overflowing .ap-instr-toggle { display: inline-block; }
2323
+ .ap-instr-view > *:first-child { margin-top: 0; }
2324
+ .ap-instr-view > *:last-child { margin-bottom: 0; }
2325
+ .ap-instr-view h3 {
2326
+ font-family: var(--mono);
2327
+ font-size: 10px;
2328
+ font-weight: 700;
2329
+ letter-spacing: 0.2em;
2330
+ text-transform: uppercase;
2331
+ color: var(--text-faint);
2332
+ margin: 14px 0 6px;
2333
+ padding: 0;
2334
+ border: none;
2335
+ }
2336
+ .ap-instr-view h4 {
2337
+ font-family: var(--font-human);
2338
+ font-size: 13px;
2339
+ font-weight: 700;
2340
+ color: var(--text);
2341
+ margin: 12px 0 4px;
2342
+ letter-spacing: -0.005em;
2343
+ }
2344
+ .ap-instr-view h5 {
2345
+ font-family: var(--font-human);
2346
+ font-size: 12px;
2347
+ font-weight: 700;
2348
+ color: var(--text-soft);
2349
+ margin: 10px 0 4px;
2350
+ }
2351
+ .ap-instr-view p { margin: 0 0 8px; }
2352
+ .ap-instr-view ul, .ap-instr-view ol {
2353
+ margin: 0 0 10px;
2354
+ padding-left: 20px;
2355
+ }
2356
+ .ap-instr-view li { margin-bottom: 3px; }
2357
+ .ap-instr-view strong { color: var(--text); font-weight: 700; }
2358
+ .ap-instr-view em { color: var(--text-soft); font-style: italic; }
2359
+ .ap-instr-view code {
2360
+ font-family: var(--mono);
2361
+ font-size: 11.5px;
2362
+ background: var(--bg);
2363
+ border: 0.5px solid var(--line-bright);
2364
+ padding: 1px 5px;
2365
+ color: var(--text);
2366
+ }
2367
+ .ap-instr-view pre {
2368
+ background: var(--bg);
2369
+ border: 0.5px solid var(--line-bright);
2370
+ padding: 10px 12px;
2371
+ margin: 8px 0;
2372
+ overflow-x: auto;
2373
+ }
2374
+ .ap-instr-view pre code {
2375
+ background: transparent;
2376
+ border: none;
2377
+ padding: 0;
2378
+ font-size: 11.5px;
2379
+ line-height: 1.5;
2380
+ }
2381
+
2382
+ /* Edit mode · textarea + footer with save/cancel. */
2383
+ .ap-instr-edit { display: flex; flex-direction: column; gap: 10px; }
2384
+ .ap-instr-textarea {
2385
+ background: var(--bg);
2386
+ border: 0.5px solid var(--line-bright);
2387
+ color: var(--text);
2388
+ font-family: var(--mono);
2389
+ font-size: 12px;
2390
+ line-height: 1.55;
2391
+ padding: 12px 14px;
2392
+ min-height: 220px;
2393
+ width: 100%;
2394
+ resize: vertical;
2395
+ outline: none;
2396
+ transition: border-color 0.1s;
2397
+ }
2398
+ .ap-instr-textarea:focus { border-color: var(--text-soft); }
2399
+ .ap-instr-textarea::placeholder { color: var(--text-faint); }
2400
+ .ap-instr-edit-foot {
2401
+ display: flex;
2402
+ align-items: center;
2403
+ justify-content: space-between;
2404
+ gap: 12px;
2405
+ }
2406
+ .ap-instr-edit-hint {
2407
+ font-family: var(--mono);
2408
+ font-size: 9.5px;
2409
+ letter-spacing: 0.1em;
2410
+ text-transform: uppercase;
2411
+ color: var(--text-faint);
2412
+ }
2413
+ .ap-instr-edit-actions { display: flex; gap: 8px; }
2414
+ .ap-instr-cancel,
2415
+ .ap-instr-save {
2416
+ font-family: var(--mono);
2417
+ font-size: 9.5px;
2418
+ font-weight: 700;
2419
+ letter-spacing: 0.14em;
2420
+ text-transform: uppercase;
2421
+ padding: 8px 14px;
2422
+ cursor: pointer;
2423
+ border: 0.5px solid var(--line-bright);
2424
+ background: transparent;
2425
+ color: var(--text-soft);
2426
+ transition: border-color 0.1s, color 0.1s, background 0.1s;
2427
+ }
2428
+ .ap-instr-cancel:hover { border-color: var(--text-soft); color: var(--text); }
2429
+ .ap-instr-save {
2430
+ background: var(--text);
2431
+ border-color: var(--text);
2432
+ color: var(--bg);
2433
+ }
2434
+ .ap-instr-save:hover { background: var(--text-soft); border-color: var(--text-soft); }
2435
+
2436
+ /* Intel edit · same shape as the instruction editor but with a shorter
2437
+ single-line textarea (bio is 8-280 chars, not multi-section markdown). */
2438
+ .ap-intel-edit { display: flex; flex-direction: column; gap: 10px; }
2439
+ .ap-intel-textarea {
2440
+ background: var(--bg);
2441
+ border: 0.5px solid var(--line-bright);
2442
+ color: var(--text);
2443
+ font-family: var(--font-human);
2444
+ font-size: 12.5px;
2445
+ line-height: 1.5;
2446
+ padding: 10px 14px;
2447
+ min-height: 64px;
2448
+ width: 100%;
2449
+ resize: vertical;
2450
+ outline: none;
2451
+ transition: border-color 0.12s;
2452
+ letter-spacing: -0.003em;
2453
+ }
2454
+ .ap-intel-textarea:focus { border-color: var(--text-soft); }
2455
+ .ap-intel-textarea::placeholder { color: var(--text-faint); }
2456
+ .ap-intel-edit-foot {
2457
+ display: flex;
2458
+ align-items: center;
2459
+ justify-content: space-between;
2460
+ gap: 12px;
2461
+ }
2462
+ .ap-intel-edit-hint {
2463
+ font-family: var(--mono);
2464
+ font-size: 9.5px;
2465
+ letter-spacing: 0.1em;
2466
+ text-transform: uppercase;
2467
+ color: var(--text-faint);
2468
+ }
2469
+ .ap-intel-edit-hint.error { color: var(--red, #C85A5A); text-transform: none; letter-spacing: 0; }
2470
+ .ap-intel-edit-actions { display: flex; gap: 8px; }
2471
+
2472
+ /* RULES block · editable numbered list + add button. */
2473
+ .ap-rules-block { display: flex; flex-direction: column; gap: 8px; }
2474
+ .ap-rules-list {
2475
+ list-style: none;
2476
+ margin: 0;
2477
+ padding: 0;
2478
+ display: flex;
2479
+ flex-direction: column;
2480
+ gap: 6px;
2481
+ }
2482
+ .ap-rule {
2483
+ display: grid;
2484
+ grid-template-columns: 22px 1fr 22px;
2485
+ gap: 8px;
2486
+ align-items: center;
2487
+ padding: 6px 10px;
2488
+ background: var(--bg);
2489
+ border: 0.5px solid var(--line-bright);
2490
+ transition: border-color 0.1s;
2491
+ }
2492
+ .ap-rule:focus-within { border-color: var(--text-soft); }
2493
+ .ap-rule-num {
2494
+ font-family: var(--mono);
2495
+ font-size: 10.5px;
2496
+ font-weight: 700;
2497
+ color: var(--text-soft);
2498
+ text-align: center;
2499
+ }
2500
+ .ap-rule-input {
2501
+ background: transparent;
2502
+ border: none;
2503
+ color: var(--text);
2504
+ font-family: var(--font-human);
2505
+ font-size: 12.5px;
2506
+ line-height: 1.4;
2507
+ padding: 4px 0;
2508
+ width: 100%;
2509
+ outline: none;
2510
+ }
2511
+ .ap-rule-input::placeholder { color: var(--text-faint); }
2512
+ .ap-rule-rm {
2513
+ background: transparent;
2514
+ border: none;
2515
+ color: var(--text-faint);
2516
+ font-size: 12px;
2517
+ line-height: 1;
2518
+ cursor: pointer;
2519
+ padding: 2px;
2520
+ opacity: 0;
2521
+ transition: opacity 0.1s, color 0.1s;
2522
+ }
2523
+ .ap-rule:hover .ap-rule-rm,
2524
+ .ap-rule:focus-within .ap-rule-rm { opacity: 1; }
2525
+ .ap-rule-rm:hover { color: var(--red); }
2526
+ .ap-rule-empty {
2527
+ font-family: var(--font-human);
2528
+ font-size: 12px;
2529
+ color: var(--text-faint);
2530
+ padding: 8px 10px;
2531
+ border: 0.5px dashed var(--line-bright);
2532
+ background: transparent;
2533
+ text-align: center;
2534
+ }
2535
+ .ap-rule-empty strong { color: var(--text-soft); font-weight: 700; }
2536
+ /* (the rules add button now lives in the section heading as
2537
+ .ap-block-h-action; the disabled state below applies there too.) */
2538
+ .ap-block-h-action[disabled] {
2539
+ cursor: not-allowed;
2540
+ opacity: 0.4;
2541
+ pointer-events: none;
2542
+ }
2543
+
2544
+ /* ─── Memory · v1 (live, API-driven) ────────────────────────
2545
+ List of editable rows pulled from /api/agents/:id/memories.
2546
+ Each row · [kind tag + source] [content] [pin / edit / delete]. */
2547
+ .ap-memory {
2548
+ display: flex;
2549
+ flex-direction: column;
2550
+ gap: 12px;
2551
+ }
2552
+ .ap-memory-add {
2553
+ display: grid;
2554
+ grid-template-columns: 1fr auto auto;
2555
+ gap: 8px;
2556
+ align-items: stretch;
2557
+ }
2558
+ .ap-memory-add[hidden] { display: none; }
2559
+ .ap-memory-add-cancel {
2560
+ font-family: var(--mono);
2561
+ font-size: 9.5px;
2562
+ font-weight: 700;
2563
+ letter-spacing: 0.16em;
2564
+ text-transform: uppercase;
2565
+ padding: 0 12px;
2566
+ background: transparent;
2567
+ color: var(--text-soft);
2568
+ border: 0.5px solid var(--line-bright);
2569
+ cursor: pointer;
2570
+ transition: border-color 0.12s, color 0.12s, background 0.12s;
2571
+ }
2572
+ .ap-memory-add-cancel:hover {
2573
+ border-color: var(--text-faint);
2574
+ color: var(--text);
2575
+ background: var(--panel-3);
2576
+ }
2577
+ .ap-memory-add-input {
2578
+ background: var(--bg);
2579
+ border: 0.5px solid var(--line-bright);
2580
+ color: var(--text);
2581
+ font-family: var(--font-human);
2582
+ font-size: 12.5px;
2583
+ padding: 9px 12px;
2584
+ outline: none;
2585
+ letter-spacing: -0.003em;
2586
+ transition: border-color 0.1s;
2587
+ }
2588
+ .ap-memory-add-input:focus { border-color: var(--text-soft); }
2589
+ .ap-memory-add-input::placeholder { color: var(--text-faint); }
2590
+ .ap-memory-add-btn {
2591
+ font-family: var(--mono);
2592
+ font-size: 9.5px;
2593
+ font-weight: 700;
2594
+ letter-spacing: 0.16em;
2595
+ text-transform: uppercase;
2596
+ padding: 0 14px;
2597
+ background: var(--text);
2598
+ color: var(--bg);
2599
+ border: 0.5px solid var(--text);
2600
+ cursor: pointer;
2601
+ transition: background 0.1s, color 0.1s, border-color 0.1s;
2602
+ }
2603
+ .ap-memory-add-btn:hover { background: var(--text-soft); border-color: var(--text-soft); }
2604
+ .ap-memory-add-btn[disabled] { opacity: 0.6; cursor: not-allowed; }
2605
+
2606
+ /* Open list · rows are separated by hairlines, no per-row border or
2607
+ filled background. Hover bleeds edge-to-edge inside the block-body
2608
+ for a clean Notes/Notion-style read. The list uses negative margin
2609
+ to escape the block-body's 22px horizontal padding so hover/dividers
2610
+ reach the panel border. */
2611
+ .ap-memory-list {
2612
+ display: flex;
2613
+ flex-direction: column;
2614
+ margin: 0 -22px;
2615
+ gap: 0;
2616
+ }
2617
+ .ap-memory-row {
2618
+ position: relative;
2619
+ display: flex;
2620
+ flex-direction: column;
2621
+ gap: 5px;
2622
+ padding: 9px 22px 10px;
2623
+ background: transparent;
2624
+ border: none;
2625
+ border-bottom: 0.5px solid var(--line);
2626
+ transition: background 0.12s;
2627
+ }
2628
+ .ap-memory-row:last-child { border-bottom: none; }
2629
+ .ap-memory-row:hover { background: var(--panel); }
2630
+
2631
+ /* Overflow rows · everything past the first 5. Hidden by default,
2632
+ revealed when the toggle below is clicked. Inline with the rest
2633
+ of the list so dividers + hover states stay continuous. */
2634
+ .ap-memory-overflow {
2635
+ display: contents;
2636
+ }
2637
+ .ap-memory-overflow[hidden] { display: none; }
2638
+ /* Toggle button · sits inside the already-outdented .ap-memory-list,
2639
+ so it doesn't add its own negative margin (that double-outdent was
2640
+ what was making it overflow the block on the right). Padding-only,
2641
+ width 100% so the dashed-top hairline + fill span edge-to-edge. */
2642
+ .ap-memory-toggle {
2643
+ display: flex;
2644
+ width: 100%;
2645
+ box-sizing: border-box;
2646
+ margin: 0;
2647
+ padding: 9px 22px;
2648
+ align-items: center;
2649
+ justify-content: center;
2650
+ gap: 8px;
2651
+ background: var(--panel-2);
2652
+ border: none;
2653
+ border-top: 0.5px dashed var(--line);
2654
+ color: var(--text-soft);
2655
+ font-family: var(--mono);
2656
+ font-size: 10px;
2657
+ letter-spacing: 0.18em;
2658
+ text-transform: uppercase;
2659
+ font-weight: 600;
2660
+ cursor: pointer;
2661
+ transition: background 0.14s, color 0.14s;
2662
+ }
2663
+ .ap-memory-toggle:hover {
2664
+ background: var(--panel);
2665
+ color: var(--lime);
2666
+ }
2667
+ .ap-memory-toggle-icon {
2668
+ font-size: 11px;
2669
+ line-height: 1;
2670
+ color: var(--text-faint);
2671
+ transition: transform 0.18s ease, color 0.14s;
2672
+ }
2673
+ .ap-memory-toggle:hover .ap-memory-toggle-icon { color: var(--lime); }
2674
+ .ap-memory-toggle.expanded .ap-memory-toggle-icon { transform: rotate(180deg); }
2675
+ /* Show / hide labels swap based on the .expanded state. Default is
2676
+ collapsed (▾ Show all N) · clicked → expanded (▴ Collapse). */
2677
+ .ap-memory-toggle-show,
2678
+ .ap-memory-toggle-hide { line-height: 1; }
2679
+ .ap-memory-toggle:not(.expanded) .ap-memory-toggle-hide { display: none; }
2680
+ .ap-memory-toggle.expanded .ap-memory-toggle-show { display: none; }
2681
+
2682
+ /* Pinned · 2px lime bar on the very left edge, no layout shift. */
2683
+ .ap-memory-row::before {
2684
+ content: "";
2685
+ position: absolute;
2686
+ left: 0;
2687
+ top: 0;
2688
+ bottom: 0;
2689
+ width: 2px;
2690
+ background: transparent;
2691
+ transition: background 0.12s;
2692
+ }
2693
+ .ap-memory-row.pinned::before { background: var(--lime); }
2694
+
2695
+ .ap-memory-content {
2696
+ font-family: var(--font-human);
2697
+ font-size: 12.5px;
2698
+ line-height: 1.5;
2699
+ color: var(--text);
2700
+ letter-spacing: -0.003em;
2701
+ min-width: 0;
2702
+ word-break: break-word;
2703
+ }
2704
+
2705
+ .ap-memory-row-foot {
2706
+ display: flex;
2707
+ align-items: center;
2708
+ justify-content: space-between;
2709
+ gap: 8px;
2710
+ min-height: 16px;
2711
+ }
2712
+ /* Meta · single mono micro-line "fact · manual" at the foot of the row.
2713
+ No border / chip — just type in faint color, kind highlighted lime. */
2714
+ .ap-memory-meta {
2715
+ display: inline-flex;
2716
+ align-items: center;
2717
+ gap: 5px;
2718
+ font-family: var(--mono);
2719
+ font-size: 8.5px;
2720
+ letter-spacing: 0.12em;
2721
+ text-transform: uppercase;
2722
+ color: var(--text-faint);
2723
+ line-height: 1.2;
2724
+ }
2725
+ .ap-memory-kind { color: var(--lime); font-weight: 700; }
2726
+ .ap-memory-meta-sep { opacity: 0.5; }
2727
+ .ap-memory-source { color: var(--text-faint); }
2728
+ .ap-memory-edit-area {
2729
+ width: 100%;
2730
+ background: var(--bg);
2731
+ border: 0.5px solid var(--text-soft);
2732
+ color: var(--text);
2733
+ font-family: var(--font-human);
2734
+ font-size: 12.5px;
2735
+ line-height: 1.5;
2736
+ padding: 8px 10px;
2737
+ outline: none;
2738
+ resize: vertical;
2739
+ min-height: 56px;
2740
+ letter-spacing: -0.003em;
2741
+ }
2742
+ .ap-memory-edit-actions {
2743
+ display: flex;
2744
+ gap: 6px;
2745
+ margin-top: 6px;
2746
+ }
2747
+ .ap-memory-edit-cancel,
2748
+ .ap-memory-edit-save {
2749
+ font-family: var(--mono);
2750
+ font-size: 9px;
2751
+ font-weight: 700;
2752
+ letter-spacing: 0.14em;
2753
+ text-transform: uppercase;
2754
+ padding: 5px 10px;
2755
+ cursor: pointer;
2756
+ border: 0.5px solid var(--line-bright);
2757
+ background: transparent;
2758
+ color: var(--text-soft);
2759
+ }
2760
+ .ap-memory-edit-save { background: var(--text); color: var(--bg); border-color: var(--text); }
2761
+ .ap-memory-edit-cancel:hover { color: var(--text); border-color: var(--text-soft); }
2762
+ .ap-memory-edit-save:hover { background: var(--text-soft); border-color: var(--text-soft); }
2763
+
2764
+ .ap-memory-actions {
2765
+ display: flex;
2766
+ align-items: center;
2767
+ gap: 2px;
2768
+ flex-shrink: 0;
2769
+ margin-left: auto;
2770
+ }
2771
+ .ap-memory-pin,
2772
+ .ap-memory-edit,
2773
+ .ap-memory-delete {
2774
+ font-family: var(--mono);
2775
+ font-size: 11px;
2776
+ line-height: 1;
2777
+ width: 18px;
2778
+ height: 18px;
2779
+ display: inline-flex;
2780
+ align-items: center;
2781
+ justify-content: center;
2782
+ padding: 0;
2783
+ background: transparent;
2784
+ border: 0;
2785
+ color: var(--text-faint);
2786
+ cursor: pointer;
2787
+ transition: color 0.12s, background 0.12s, opacity 0.12s;
2788
+ opacity: 0;
2789
+ }
2790
+ .ap-memory-row:hover .ap-memory-pin,
2791
+ .ap-memory-row:hover .ap-memory-edit,
2792
+ .ap-memory-row:hover .ap-memory-delete { opacity: 0.7; }
2793
+ .ap-memory-pin:hover,
2794
+ .ap-memory-edit:hover {
2795
+ opacity: 1;
2796
+ color: var(--text);
2797
+ background: var(--line-bright);
2798
+ }
2799
+ .ap-memory-pin { font-size: 12px; }
2800
+ .ap-memory-edit svg { display: block; width: 9px; height: 9px; }
2801
+ .ap-memory-delete { font-size: 14px; font-weight: 300; }
2802
+ .ap-memory-delete:hover {
2803
+ opacity: 1;
2804
+ color: var(--red, #C85A5A);
2805
+ background: var(--line-bright);
2806
+ }
2807
+
2808
+ .ap-memory-row.pinned .ap-memory-pin {
2809
+ color: var(--lime);
2810
+ opacity: 1;
2811
+ }
2812
+ .ap-memory-row.pinned .ap-memory-pin:hover { background: var(--line-bright); color: var(--lime); }
2813
+
2814
+ .ap-memory-row.editing .ap-memory-actions { visibility: hidden; }
2815
+
2816
+ /* ─── Memory · legacy prototype tile gallery (kept for callers
2817
+ that still pass `p.memory` shape). v1 profiles render the
2818
+ .ap-memory list above and never enter this block. */
2819
+ .ap-memory-gallery {
2820
+ display: grid;
2821
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
2822
+ gap: 10px;
2823
+ }
2824
+ /* Memory tile · game-HUD style. Reads like a save-slot / quest entry:
2825
+ chunky room number set in mono display weight, corner brackets that
2826
+ frame the tile like an old game card, a small "▸" affordance on
2827
+ hover. Background uses a subtle linear gradient + scanline pattern
2828
+ so each tile feels like a tactile chip rather than flat panel. */
2829
+ .ap-memory-gallery {
2830
+ display: grid;
2831
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
2832
+ gap: 12px;
2833
+ }
2834
+ .ap-memory-tile {
2835
+ position: relative;
2836
+ background:
2837
+ repeating-linear-gradient(
2838
+ 0deg,
2839
+ transparent 0,
2840
+ transparent 3px,
2841
+ rgba(255,255,255,0.012) 3px,
2842
+ rgba(255,255,255,0.012) 4px
2843
+ ),
2844
+ linear-gradient(135deg, var(--panel-3) 0%, var(--panel-2) 100%);
2845
+ border: 0.5px solid var(--line-bright);
2846
+ padding: 14px 14px 12px;
2847
+ text-align: left;
2848
+ font-family: inherit;
2849
+ cursor: pointer;
2850
+ display: grid;
2851
+ grid-template-rows: auto 1fr auto;
2852
+ gap: 8px;
2853
+ color: var(--text);
2854
+ min-height: 128px;
2855
+ transition: border-color 0.14s, transform 0.14s, box-shadow 0.14s;
2856
+ overflow: hidden;
2857
+ }
2858
+ /* Corner brackets · classic HUD frame. */
2859
+ .ap-memory-tile::before,
2860
+ .ap-memory-tile::after {
2861
+ content: "";
2862
+ position: absolute;
2863
+ width: 9px;
2864
+ height: 9px;
2865
+ border: 1.5px solid var(--text-faint);
2866
+ pointer-events: none;
2867
+ transition: border-color 0.14s;
2868
+ }
2869
+ .ap-memory-tile::before { top: -1px; left: -1px; border-right: none; border-bottom: none; }
2870
+ .ap-memory-tile::after { bottom: -1px; right: -1px; border-left: none; border-top: none; }
2871
+ .ap-memory-tile:hover {
2872
+ border-color: var(--text-soft);
2873
+ transform: translateY(-2px);
2874
+ }
2875
+ .ap-memory-tile:hover::before,
2876
+ .ap-memory-tile:hover::after { border-color: var(--text); }
2877
+
2878
+ /* ROOM # · two-line treatment · "ROOM" on top, big "#04" below. */
2879
+ .ap-memory-tile-num {
2880
+ display: flex;
2881
+ flex-direction: column;
2882
+ align-items: flex-start;
2883
+ gap: 0;
2884
+ font-family: var(--mono);
2885
+ color: var(--text-soft);
2886
+ letter-spacing: 0.22em;
2887
+ text-transform: uppercase;
2888
+ line-height: 1;
2889
+ }
2890
+ .ap-memory-tile-num::before {
2891
+ content: attr(data-label);
2892
+ font-size: 8.5px;
2893
+ color: var(--text-faint);
2894
+ letter-spacing: 0.28em;
2895
+ margin-bottom: 4px;
2896
+ }
2897
+ .ap-memory-tile-num-id {
2898
+ font-size: 18px;
2899
+ font-weight: 700;
2900
+ color: var(--text);
2901
+ letter-spacing: 0.04em;
2902
+ }
2903
+
2904
+ /* Name · the hero text. */
2905
+ .ap-memory-tile-name {
2906
+ font-family: var(--font-human);
2907
+ font-size: 14px;
2908
+ font-weight: 700;
2909
+ color: var(--text);
2910
+ letter-spacing: -0.008em;
2911
+ line-height: 1.35;
2912
+ overflow: hidden;
2913
+ text-overflow: ellipsis;
2914
+ display: -webkit-box;
2915
+ -webkit-line-clamp: 2;
2916
+ -webkit-box-orient: vertical;
2917
+ }
2918
+
2919
+ /* Hint · stats row + open arrow. */
2920
+ .ap-memory-tile-hint {
2921
+ display: flex;
2922
+ align-items: center;
2923
+ justify-content: space-between;
2924
+ gap: 6px;
2925
+ font-family: var(--mono);
2926
+ font-size: 9px;
2927
+ color: var(--text-faint);
2928
+ letter-spacing: 0.14em;
2929
+ text-transform: uppercase;
2930
+ padding-top: 8px;
2931
+ border-top: 0.5px solid var(--line-bright);
2932
+ }
2933
+ .ap-memory-tile-hint::after {
2934
+ content: "▸";
2935
+ font-size: 11px;
2936
+ color: var(--text-faint);
2937
+ transition: transform 0.14s, color 0.14s;
2938
+ }
2939
+ .ap-memory-tile:hover .ap-memory-tile-hint::after {
2940
+ color: var(--text);
2941
+ transform: translateX(2px);
2942
+ }
2943
+
2944
+ /* ── Memory · YOU tile (about-user) ─────────────────
2945
+ Distinct warm amber treatment so the self-card reads
2946
+ as the special "first card" in the gallery vs the
2947
+ uniform room cards. */
2948
+ .ap-memory-tile-self {
2949
+ background:
2950
+ repeating-linear-gradient(
2951
+ 0deg,
2952
+ transparent 0,
2953
+ transparent 3px,
2954
+ rgba(200, 152, 90, 0.04) 3px,
2955
+ rgba(200, 152, 90, 0.04) 4px
2956
+ ),
2957
+ linear-gradient(135deg, rgba(200, 152, 90, 0.18) 0%, var(--panel-3) 60%);
2958
+ border-color: var(--amber, #C8985A);
2959
+ border-width: 1px;
2960
+ }
2961
+ .ap-memory-tile-self::before,
2962
+ .ap-memory-tile-self::after {
2963
+ border-color: var(--amber, #C8985A);
2964
+ border-width: 2px;
2965
+ width: 11px;
2966
+ height: 11px;
2967
+ }
2968
+ .ap-memory-tile-self:hover {
2969
+ border-color: var(--amber, #C8985A);
2970
+ background:
2971
+ repeating-linear-gradient(
2972
+ 0deg,
2973
+ transparent 0,
2974
+ transparent 3px,
2975
+ rgba(200, 152, 90, 0.06) 3px,
2976
+ rgba(200, 152, 90, 0.06) 4px
2977
+ ),
2978
+ linear-gradient(135deg, rgba(200, 152, 90, 0.26) 0%, var(--panel-3) 60%);
2979
+ }
2980
+ .ap-memory-tile-self .ap-memory-tile-num {
2981
+ color: var(--amber, #C8985A);
2982
+ }
2983
+ .ap-memory-tile-self .ap-memory-tile-num::before {
2984
+ color: rgba(200, 152, 90, 0.7);
2985
+ }
2986
+ .ap-memory-tile-self .ap-memory-tile-num-id {
2987
+ color: var(--amber, #C8985A);
2988
+ font-size: 22px;
2989
+ letter-spacing: 0.08em;
2990
+ }
2991
+ .ap-memory-tile-self .ap-memory-tile-hint {
2992
+ border-top-color: rgba(200, 152, 90, 0.28);
2993
+ color: rgba(200, 152, 90, 0.7);
2994
+ }
2995
+ .ap-memory-tile-self .ap-memory-tile-hint::after { color: var(--amber, #C8985A); }
2996
+ /* Watermark star top-right */
2997
+ .ap-memory-self-mark {
2998
+ position: absolute;
2999
+ top: 6px;
3000
+ right: 8px;
3001
+ font-size: 14px;
3002
+ line-height: 1;
3003
+ color: var(--amber, #C8985A);
3004
+ pointer-events: none;
3005
+ opacity: 0.7;
3006
+ }
3007
+
3008
+ /* Overlay shown when a tile is clicked. */
3009
+ .ap-memory-overlay {
3010
+ position: fixed;
3011
+ inset: 0;
3012
+ z-index: 9200;
3013
+ display: flex;
3014
+ align-items: center;
3015
+ justify-content: center;
3016
+ padding: 20px;
3017
+ }
3018
+ .ap-memory-overlay-backdrop {
3019
+ position: absolute;
3020
+ inset: 0;
3021
+ background: rgba(0,0,0,0.6);
3022
+ backdrop-filter: blur(2px);
3023
+ -webkit-backdrop-filter: blur(2px);
3024
+ }
3025
+ .ap-memory-overlay-card {
3026
+ position: relative;
3027
+ z-index: 1;
3028
+ width: min(560px, 100%);
3029
+ max-height: 80vh;
3030
+ overflow-y: auto;
3031
+ background: var(--panel-2);
3032
+ border: 0.5px solid var(--line-bright);
3033
+ padding: 22px 24px;
3034
+ display: flex;
3035
+ flex-direction: column;
3036
+ gap: 14px;
3037
+ }
3038
+ .ap-memory-overlay-close {
3039
+ position: absolute;
3040
+ top: 10px;
3041
+ right: 10px;
3042
+ width: 28px;
3043
+ height: 28px;
3044
+ background: transparent;
3045
+ border: 0.5px solid var(--line-bright);
3046
+ color: var(--text-soft);
3047
+ font-size: 16px;
3048
+ line-height: 1;
3049
+ cursor: pointer;
3050
+ display: flex;
3051
+ align-items: center;
3052
+ justify-content: center;
3053
+ }
3054
+ .ap-memory-overlay-close:hover { color: var(--text); border-color: var(--text-faint); }
3055
+ .ap-memory-detail-head {
3056
+ display: flex;
3057
+ gap: 12px;
3058
+ align-items: baseline;
3059
+ padding-right: 32px;
3060
+ }
3061
+ .ap-memory-detail-num {
3062
+ font-family: var(--mono);
3063
+ font-size: 10px;
3064
+ font-weight: 700;
3065
+ color: var(--text-faint);
3066
+ letter-spacing: 0.18em;
3067
+ text-transform: uppercase;
3068
+ }
3069
+ .ap-memory-detail-name {
3070
+ font-family: var(--font-human);
3071
+ font-size: 16px;
3072
+ font-weight: 700;
3073
+ color: var(--text);
3074
+ letter-spacing: -0.008em;
3075
+ }
3076
+ .ap-memory-detail-stats {
3077
+ font-family: var(--mono);
3078
+ font-size: 9.5px;
3079
+ color: var(--text-faint);
3080
+ letter-spacing: 0.08em;
3081
+ text-transform: uppercase;
3082
+ margin-top: 2px;
3083
+ }
3084
+ .ap-memory-detail-summary {
3085
+ font-family: var(--font-human);
3086
+ font-size: 12.5px;
3087
+ line-height: 1.55;
3088
+ color: var(--text);
3089
+ margin: 0;
3090
+ }
3091
+ .ap-memory-detail-body {
3092
+ font-family: var(--font-human);
3093
+ font-size: 12.5px;
3094
+ line-height: 1.55;
3095
+ color: var(--text);
3096
+ }
3097
+ .ap-memory-detail-body p { margin: 0 0 8px; }
3098
+ .ap-memory-detail-body p:last-child { margin-bottom: 0; }
3099
+ .ap-memory-detail-lessons {
3100
+ list-style: none;
3101
+ margin: 0;
3102
+ padding: 0;
3103
+ display: flex;
3104
+ flex-direction: column;
3105
+ gap: 6px;
3106
+ }
3107
+ .ap-memory-detail-lessons li {
3108
+ font-family: var(--font-human);
3109
+ font-size: 12px;
3110
+ color: var(--text);
3111
+ line-height: 1.5;
3112
+ padding-left: 16px;
3113
+ position: relative;
3114
+ }
3115
+ .ap-memory-detail-lessons li::before {
3116
+ content: "▸";
3117
+ position: absolute;
3118
+ left: 0;
3119
+ top: 0;
3120
+ color: var(--text-soft);
3121
+ font-family: var(--mono);
3122
+ }
3123
+
3124
+ /* Profile skill slots are interactive (click to install / remove);
3125
+ cursor signals affordance. Hover-state border colour changes were
3126
+ removed at the user's request — the profile reads as a calm panel. */
3127
+ .ap-skill-slot[data-ap-skill-slot] { cursor: pointer; }
3128
+
3129
+ /* ─── Web Search · per-agent toggle row ─── */
3130
+ .ap-skill-row-web-search {
3131
+ /* the system row already has its own styling; we only touch the
3132
+ middle cell (toggle / configure) */
3133
+ }
3134
+ .ap-skill-row-toggle {
3135
+ display: inline-flex;
3136
+ align-items: center;
3137
+ gap: 10px;
3138
+ background: transparent;
3139
+ border: none;
3140
+ padding: 0;
3141
+ cursor: pointer;
3142
+ font-family: var(--mono, "Inter", system-ui, sans-serif);
3143
+ font-size: 10px;
3144
+ letter-spacing: 0.18em;
3145
+ text-transform: uppercase;
3146
+ color: var(--text-faint, #3A382F);
3147
+ font-weight: 600;
3148
+ }
3149
+ .ap-skill-row-toggle-track {
3150
+ position: relative;
3151
+ width: 30px;
3152
+ height: 16px;
3153
+ border-radius: 8px;
3154
+ background: var(--panel-3, #21211E);
3155
+ border: 1px solid var(--line-strong, #4D4B45);
3156
+ transition: background 0.15s ease, border-color 0.15s ease;
3157
+ }
3158
+ .ap-skill-row-toggle-knob {
3159
+ position: absolute;
3160
+ top: 2px;
3161
+ left: 2px;
3162
+ width: 10px;
3163
+ height: 10px;
3164
+ border-radius: 50%;
3165
+ /* Off state uses --text-soft (visibly grey) so the knob reads
3166
+ against the dark track without depending on theme nuance. The
3167
+ `on` state below overrides this with the bg color so the gold
3168
+ knob pops on the gold track. */
3169
+ background: var(--text-soft, #8E8B83);
3170
+ transition: left 0.15s ease, background 0.15s ease;
3171
+ }
3172
+ .ap-skill-row-toggle.on .ap-skill-row-toggle-track {
3173
+ background: var(--lime, #6FB572);
3174
+ border-color: var(--lime-deep, #427A48);
3175
+ }
3176
+ .ap-skill-row-toggle.on .ap-skill-row-toggle-knob {
3177
+ left: 17px;
3178
+ background: var(--bg, #0A0A0A);
3179
+ }
3180
+ .ap-skill-row-toggle.on .ap-skill-row-toggle-text { color: var(--text, #C8C5BE); }
3181
+ .ap-skill-row-toggle:hover .ap-skill-row-toggle-track {
3182
+ border-color: var(--text-soft, #8E8B83);
3183
+ }
3184
+
3185
+ /* ─── Web Search · "needs key" state · same toggle shape, dotted
3186
+ track so the row layout never shifts. The click prompt +
3187
+ Configure-key action live in the JS handler + ⋯ popover. ─── */
3188
+ .ap-skill-row-toggle.needs-key .ap-skill-row-toggle-track {
3189
+ background: transparent;
3190
+ border: 1px dashed var(--line-strong, #4D4B45);
3191
+ }
3192
+ .ap-skill-row-toggle.needs-key .ap-skill-row-toggle-knob {
3193
+ background: var(--text-faint, #5C5A4D);
3194
+ opacity: 0.65;
3195
+ }
3196
+ .ap-skill-row-toggle.needs-key .ap-skill-row-toggle-text {
3197
+ color: var(--text-faint, #5C5A4D);
3198
+ }
3199
+ .ap-skill-row-toggle.needs-key:hover .ap-skill-row-toggle-track {
3200
+ border-color: var(--lime, #6FB572);
3201
+ border-style: solid;
3202
+ }
3203
+ .ap-skill-row-toggle.needs-key:hover .ap-skill-row-toggle-text {
3204
+ color: var(--lime, #6FB572);
3205
+ }
3206
+
3207
+ /* ─── Configure-key action inside the ⋯ skill-info popover ─── */
3208
+ .ap-skill-info-configure {
3209
+ display: inline-flex;
3210
+ align-items: center;
3211
+ gap: 8px;
3212
+ width: 100%;
3213
+ background: transparent;
3214
+ border: 0.5px solid var(--lime, #6FB572);
3215
+ padding: 8px 12px;
3216
+ cursor: pointer;
3217
+ font-family: var(--mono, "Inter", system-ui, sans-serif);
3218
+ font-size: 10px;
3219
+ letter-spacing: 0.14em;
3220
+ text-transform: uppercase;
3221
+ color: var(--lime, #6FB572);
3222
+ font-weight: 700;
3223
+ transition: background 0.12s ease, color 0.12s ease;
3224
+ margin-bottom: 8px;
3225
+ }
3226
+ .ap-skill-info-configure:hover {
3227
+ background: var(--lime, #6FB572);
3228
+ color: var(--bg, #0A0A0A);
3229
+ }
3230
+ .ap-skill-info-configure-mark { font-size: 12px; }