@christopherlittle51/postclaw 1.3.1 → 1.3.2

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 (48) hide show
  1. package/README.md +69 -695
  2. package/dashboard/README.md +89 -0
  3. package/dashboard/public/app.js +903 -542
  4. package/dashboard/public/index.html +184 -73
  5. package/dashboard/public/styles.css +583 -126
  6. package/dist/dashboard/routes/graph.d.ts +2 -2
  7. package/dist/dashboard/routes/graph.d.ts.map +1 -1
  8. package/dist/dashboard/routes/graph.js +61 -23
  9. package/dist/dashboard/routes/graph.js.map +1 -1
  10. package/dist/dashboard/routes/memories.d.ts.map +1 -1
  11. package/dist/dashboard/routes/memories.js +66 -0
  12. package/dist/dashboard/routes/memories.js.map +1 -1
  13. package/dist/dashboard/routes/workspace.d.ts +4 -3
  14. package/dist/dashboard/routes/workspace.d.ts.map +1 -1
  15. package/dist/dashboard/routes/workspace.js +119 -7
  16. package/dist/dashboard/routes/workspace.js.map +1 -1
  17. package/dist/dashboard/server.js +1 -1
  18. package/dist/dashboard/server.js.map +1 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +84 -27
  21. package/dist/index.js.map +1 -1
  22. package/dist/schemas/validation.d.ts +32 -3
  23. package/dist/schemas/validation.d.ts.map +1 -1
  24. package/dist/schemas/validation.js +22 -4
  25. package/dist/schemas/validation.js.map +1 -1
  26. package/dist/scripts/setup-db.d.ts.map +1 -1
  27. package/dist/scripts/setup-db.js +28 -30
  28. package/dist/scripts/setup-db.js.map +1 -1
  29. package/dist/scripts/sleep_cycle.d.ts +1 -0
  30. package/dist/scripts/sleep_cycle.d.ts.map +1 -1
  31. package/dist/scripts/sleep_cycle.js +114 -21
  32. package/dist/scripts/sleep_cycle.js.map +1 -1
  33. package/dist/services/config.d.ts +1 -0
  34. package/dist/services/config.d.ts.map +1 -1
  35. package/dist/services/config.js +4 -22
  36. package/dist/services/config.js.map +1 -1
  37. package/dist/services/memoryService.d.ts +2 -1
  38. package/dist/services/memoryService.d.ts.map +1 -1
  39. package/dist/services/memoryService.js +90 -24
  40. package/dist/services/memoryService.js.map +1 -1
  41. package/dist/services/personaService.d.ts +25 -0
  42. package/dist/services/personaService.d.ts.map +1 -1
  43. package/dist/services/personaService.js +79 -0
  44. package/dist/services/personaService.js.map +1 -1
  45. package/dist/tests/dashboard-schemas.test.js +71 -1
  46. package/dist/tests/dashboard-schemas.test.js.map +1 -1
  47. package/package.json +1 -1
  48. package/schemas/README.md +64 -0
@@ -1,58 +1,108 @@
1
1
  /* =============================================================================
2
- * PostClaw Dashboard — Custom styles on top of AmbientCSS
2
+ * PostClaw Dashboard — AmbientCSS-first design
3
+ *
4
+ * Philosophy: let AmbientCSS own ALL surface colors via its lighting model.
5
+ * We only define text/accent tokens and layout. No hardcoded background hex.
6
+ *
7
+ * AmbientCSS primitives used in the HTML:
8
+ * amb-surface → flat panel at light intensity
9
+ * amb-surface-concave → recessed inputs / filters (gradient inset)
10
+ * amb-surface-convex → raised buttons (gradient outward)
11
+ * amb-surface-darker → deeper recessed areas (30% of key light)
12
+ * amb-chamfer → hard-edged bevel (1px inset highlight/shadow)
13
+ * amb-chamfer-2 → wider bevel
14
+ * amb-fillet → soft rounded bevel (2px blurred inset)
15
+ * amb-elevation-N → drop shadow depth: 0 (flush), 1–3 (raised)
3
16
  * ============================================================================= */
4
17
 
5
- /* ---------- Design Tokens ---------- */
18
+ /* ---------- AmbientCSS Lighting Configuration ---------- */
6
19
  :root {
7
- --bg-primary: #0f1117;
8
- --bg-surface: #1a1d27;
9
- --bg-surface-alt: #22252f;
10
- --bg-hover: #2a2d3a;
11
- --text-primary: #e8eaed;
12
- --text-secondary: #9aa0a6;
13
- --text-muted: #6b7280;
20
+ /* Light from top-left — crisp, canonical */
21
+ --amb-light-x: -0.3;
22
+ --amb-light-y: -0.3;
23
+
24
+ /* Dark theme: low key light, fixed gap (0.15) for subtle edge contrast */
25
+ --amb-key-light-intensity: 0.22;
26
+ --amb-fill-light-intensity: 0.75;
27
+
28
+ /* Cool slate-blue palette */
29
+ --amb-light-hue: 234;
30
+ --amb-light-saturation: 0%;
31
+
32
+ /* ---- Text (neutral, adapted by JS light slider) ---- */
33
+ --text-primary: hsl(0 0% 90%);
34
+ --text-secondary: hsl(0 0% 65%);
35
+ --text-muted: hsl(0 0% 48%);
36
+
37
+ /* ---- Accents (standalone colors, not surfaces) ---- */
14
38
  --accent-cyan: #00d4aa;
15
39
  --accent-blue: #4f9cf7;
16
40
  --accent-amber: #f7b955;
17
41
  --accent-red: #f7555a;
18
42
  --accent-green: #4ade80;
19
43
  --accent-purple: #a78bfa;
20
- --border: rgba(255, 255, 255, 0.06);
44
+
45
+ /* ---- Spacing / Shape ---- */
21
46
  --radius: 12px;
22
47
  --radius-sm: 8px;
23
48
  --transition: 0.2s ease;
24
-
25
- /* AmbientCSS light config */
26
- --amb-light-x: -0.7;
27
- --amb-light-y: -0.8;
28
- --amb-key-light-intensity: 0.4;
29
- --amb-fill-light-intensity: 0.15;
30
- --amb-surface-color: var(--bg-surface);
31
- --amb-environment-color: var(--bg-primary);
32
49
  }
33
50
 
34
- /* ---------- Base ---------- */
35
- * { box-sizing: border-box; margin: 0; padding: 0; }
51
+ /* ---------- Base Reset ---------- */
52
+ * {
53
+ box-sizing: border-box;
54
+ margin: 0;
55
+ padding: 0;
56
+ }
36
57
 
37
58
  body {
38
59
  font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
39
- background: var(--bg-primary);
60
+ /* Body sits just below amb-surface brightness — neutral gray */
61
+ background: hsl(0 0% calc(var(--amb-key-light-intensity) * 100%));
40
62
  color: var(--text-primary);
41
63
  line-height: 1.5;
42
64
  min-height: 100vh;
43
65
  }
44
66
 
45
- h1 { font-size: 1.5rem; font-weight: 700; }
46
- h2 { font-size: 1.25rem; font-weight: 600; margin-bottom: 0.5rem; }
47
- h3 { font-size: 1.1rem; font-weight: 600; margin-bottom: 0.5rem; }
48
- p { color: var(--text-secondary); }
49
- .hint { font-size: 0.85rem; color: var(--text-muted); margin-bottom: 0.5rem; }
67
+ /* ---------- Typography ---------- */
68
+ h1 {
69
+ font-size: 1.5rem;
70
+ font-weight: 700;
71
+ }
72
+
73
+ h2 {
74
+ font-size: 1.25rem;
75
+ font-weight: 600;
76
+ margin-bottom: 0.5rem;
77
+ }
78
+
79
+ h3 {
80
+ font-size: 1.1rem;
81
+ font-weight: 600;
82
+ margin-bottom: 0.5rem;
83
+ }
84
+
85
+ h4 {
86
+ font-size: 0.95rem;
87
+ font-weight: 600;
88
+ margin-bottom: 0.4rem;
89
+ color: var(--text-secondary);
90
+ }
91
+
92
+ p {
93
+ color: var(--text-secondary);
94
+ }
95
+
96
+ .hint {
97
+ font-size: 0.85rem;
98
+ color: var(--text-secondary);
99
+ margin-bottom: 0.5rem;
100
+ }
50
101
 
51
102
  /* ---------- Header ---------- */
52
103
  .dashboard-header {
53
104
  padding: 1rem 1.5rem;
54
- background: var(--bg-surface);
55
- border-bottom: 1px solid var(--border);
105
+ /* AmbientCSS classes handle background & shadow via HTML */
56
106
  }
57
107
 
58
108
  .header-content {
@@ -77,10 +127,8 @@ p { color: var(--text-secondary); }
77
127
  /* ---------- Tab Navigation ---------- */
78
128
  .tab-nav {
79
129
  display: flex;
80
- gap: 0.25rem;
130
+ gap: 0.35rem;
81
131
  padding: 0.5rem 1.5rem;
82
- background: var(--bg-surface);
83
- border-bottom: 1px solid var(--border);
84
132
  max-width: 1400px;
85
133
  margin: 0 auto;
86
134
  }
@@ -98,12 +146,10 @@ p { color: var(--text-secondary); }
98
146
 
99
147
  .tab-btn:hover {
100
148
  color: var(--text-primary);
101
- background: var(--bg-hover);
102
149
  }
103
150
 
104
151
  .tab-btn.active {
105
- color: var(--accent-cyan);
106
- background: var(--bg-surface-alt);
152
+ color: var(--text-primary);
107
153
  font-weight: 600;
108
154
  }
109
155
 
@@ -114,12 +160,25 @@ p { color: var(--text-secondary); }
114
160
  padding: 0 1.5rem;
115
161
  }
116
162
 
117
- .tab-panel { display: none; }
118
- .tab-panel.active { display: block; animation: fadeIn 0.3s ease; }
163
+ .tab-panel {
164
+ display: none;
165
+ }
166
+
167
+ .tab-panel.active {
168
+ display: block;
169
+ animation: fadeIn 0.3s ease;
170
+ }
119
171
 
120
172
  @keyframes fadeIn {
121
- from { opacity: 0; transform: translateY(4px); }
122
- to { opacity: 1; transform: translateY(0); }
173
+ from {
174
+ opacity: 0;
175
+ transform: translateY(4px);
176
+ }
177
+
178
+ to {
179
+ opacity: 1;
180
+ transform: translateY(0);
181
+ }
123
182
  }
124
183
 
125
184
  .panel-header {
@@ -132,38 +191,40 @@ p { color: var(--text-secondary); }
132
191
  .panel-section {
133
192
  margin-top: 2rem;
134
193
  padding-top: 1.5rem;
135
- border-top: 1px solid var(--border);
194
+ border-top: 1px solid hsl(var(--amb-light-hue) var(--amb-light-saturation) 15%);
136
195
  }
137
196
 
138
197
  /* ---------- Buttons ---------- */
139
- .btn-primary, .btn-secondary {
198
+ .btn-primary,
199
+ .btn-secondary {
140
200
  padding: 0.5rem 1rem;
141
201
  border: none;
142
202
  border-radius: var(--radius-sm);
143
203
  cursor: pointer;
144
204
  font-size: 0.85rem;
145
205
  font-weight: 500;
206
+ color: var(--text-primary);
146
207
  transition: all var(--transition);
208
+ /* AmbientCSS handles background via amb-surface-convex on these elements */
147
209
  }
148
210
 
149
- .btn-primary {
150
- background: var(--accent-cyan);
151
- color: var(--bg-primary);
211
+ .btn-primary:hover {
212
+ transform: translateY(-1px);
213
+ filter: brightness(1.15);
152
214
  }
153
215
 
154
- .btn-primary:hover { filter: brightness(1.15); transform: translateY(-1px); }
155
-
156
216
  .btn-secondary {
157
- background: var(--bg-surface-alt);
158
- color: var(--text-primary);
159
- border: 1px solid var(--border);
217
+ color: var(--text-secondary);
160
218
  }
161
219
 
162
- .btn-secondary:hover { background: var(--bg-hover); }
220
+ .btn-secondary:hover {
221
+ color: var(--text-primary);
222
+ filter: brightness(1.1);
223
+ }
163
224
 
164
225
  .btn-danger {
165
- background: var(--accent-red);
166
- color: white;
226
+ background: transparent;
227
+ color: var(--accent-red);
167
228
  border: none;
168
229
  padding: 0.25rem 0.5rem;
169
230
  border-radius: var(--radius-sm);
@@ -172,7 +233,9 @@ p { color: var(--text-secondary); }
172
233
  transition: all var(--transition);
173
234
  }
174
235
 
175
- .btn-danger:hover { filter: brightness(1.2); }
236
+ .btn-danger:hover {
237
+ filter: brightness(1.3);
238
+ }
176
239
 
177
240
  .btn-sm {
178
241
  padding: 0.25rem 0.6rem;
@@ -183,15 +246,33 @@ p { color: var(--text-secondary); }
183
246
  .form-card {
184
247
  padding: 1.25rem;
185
248
  margin-bottom: 1rem;
186
- background: var(--bg-surface);
187
249
  border-radius: var(--radius);
188
- border: 1px solid var(--border);
250
+ /* amb-surface amb-chamfer amb-elevation-2 applied via HTML */
251
+ }
252
+
253
+ .form-row {
254
+ margin-bottom: 0.75rem;
255
+ }
256
+
257
+ .form-row label {
258
+ display: block;
259
+ font-size: 0.85rem;
260
+ margin-bottom: 0.25rem;
261
+ color: var(--text-secondary);
189
262
  }
190
263
 
191
- .form-row { margin-bottom: 0.75rem; }
192
- .form-row label { display: block; font-size: 0.85rem; margin-bottom: 0.25rem; color: var(--text-secondary); }
193
- .form-row-inline { display: flex; align-items: center; gap: 0.5rem; }
194
- .form-row-inline label { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0; }
264
+ .form-row-inline {
265
+ display: flex;
266
+ align-items: center;
267
+ gap: 0.5rem;
268
+ }
269
+
270
+ .form-row-inline label {
271
+ display: flex;
272
+ align-items: center;
273
+ gap: 0.5rem;
274
+ margin-bottom: 0;
275
+ }
195
276
 
196
277
  .form-row-grid {
197
278
  display: grid;
@@ -199,58 +280,277 @@ p { color: var(--text-secondary); }
199
280
  gap: 0.75rem;
200
281
  }
201
282
 
202
- input[type="text"], textarea, select {
283
+ /* Inputs: AmbientCSS handles the recessed look via amb-surface-concave.
284
+ Invert fillet direction so bevel reads as inset, not raised. */
285
+ input[type="text"],
286
+ input[type="number"],
287
+ textarea,
288
+ select {
203
289
  width: 100%;
204
290
  padding: 0.5rem 0.75rem;
205
- background: var(--bg-surface-alt);
206
- border: 1px solid var(--border);
291
+ border: none;
207
292
  border-radius: var(--radius-sm);
208
293
  color: var(--text-primary);
209
294
  font-size: 0.9rem;
210
295
  font-family: inherit;
211
- transition: border-color var(--transition);
296
+ transition: all var(--transition);
297
+ --amb-fillet-width: -1;
298
+ }
299
+
300
+ /* ---------- Light Sliders ---------- */
301
+ .light-slider-group {
302
+ display: flex;
303
+ align-items: center;
304
+ gap: 0.5rem;
305
+ }
306
+
307
+ .light-slider-group label {
308
+ font-size: 0.75rem;
309
+ color: var(--text-muted);
310
+ white-space: nowrap;
311
+ }
312
+
313
+ .light-slider-label {
314
+ font-size: 0.7rem;
315
+ color: var(--text-muted);
316
+ text-transform: uppercase;
317
+ letter-spacing: 0.05em;
212
318
  }
213
319
 
214
- input[type="text"]:focus, textarea:focus, select:focus {
320
+ .light-slider {
321
+ -webkit-appearance: none;
322
+ appearance: none;
323
+ width: 120px;
324
+ height: 4px;
325
+ border-radius: 2px;
326
+ background: linear-gradient(to right,
327
+ hsl(var(--amb-light-hue) var(--amb-light-saturation) 8%),
328
+ hsl(var(--amb-light-hue) var(--amb-light-saturation) 85%));
215
329
  outline: none;
216
- border-color: var(--accent-cyan);
330
+ cursor: pointer;
331
+ }
332
+
333
+ .light-slider-narrow {
334
+ width: 70px;
335
+ }
336
+
337
+ .light-slider::-webkit-slider-thumb {
338
+ -webkit-appearance: none;
339
+ appearance: none;
340
+ width: 14px;
341
+ height: 14px;
342
+ border-radius: 50%;
343
+ background: var(--text-primary);
344
+ border: 2px solid hsl(var(--amb-light-hue) var(--amb-light-saturation) 40%);
345
+ cursor: pointer;
346
+ transition: transform 0.1s ease;
347
+ }
348
+
349
+ .light-slider::-webkit-slider-thumb:hover {
350
+ transform: scale(1.2);
351
+ }
352
+
353
+ .light-slider::-moz-range-thumb {
354
+ width: 14px;
355
+ height: 14px;
356
+ border-radius: 50%;
357
+ background: var(--text-primary);
358
+ border: 2px solid hsl(var(--amb-light-hue) var(--amb-light-saturation) 40%);
359
+ cursor: pointer;
360
+ }
361
+
362
+ .light-value {
363
+ font-size: 0.7rem;
364
+ color: var(--text-muted);
365
+ font-family: 'Fira Code', 'Consolas', monospace;
366
+ min-width: 2.5em;
367
+ text-align: right;
368
+ }
369
+
370
+ input[type="text"]:focus,
371
+ input[type="number"]:focus,
372
+ textarea:focus,
373
+ select:focus {
374
+ outline: 2px solid hsl(234 30% 55% / 0.5);
375
+ outline-offset: 1px;
376
+ }
377
+
378
+ .form-actions {
379
+ display: flex;
380
+ gap: 0.5rem;
381
+ margin-top: 0.75rem;
382
+ }
383
+
384
+ /* ---------- Memory Links Section ---------- */
385
+ .memory-links-section {
386
+ margin-top: 1rem;
387
+ padding-top: 0.75rem;
388
+ border-top: 1px solid hsl(var(--amb-light-hue) var(--amb-light-saturation) 15%);
389
+ }
390
+
391
+ .edge-list {
392
+ margin-bottom: 0.5rem;
393
+ }
394
+
395
+ .edge-item {
396
+ display: flex;
397
+ align-items: center;
398
+ gap: 0.5rem;
399
+ padding: 0.35rem 0.5rem;
400
+ margin-bottom: 0.25rem;
401
+ border-radius: var(--radius-sm);
402
+ font-size: 0.8rem;
403
+ background: hsl(var(--amb-light-hue) var(--amb-light-saturation) calc(var(--amb-key-light-intensity) * 70%));
404
+ }
405
+
406
+ .edge-item .edge-rel {
407
+ font-weight: 500;
408
+ color: var(--accent-cyan);
409
+ min-width: 80px;
410
+ }
411
+
412
+ .edge-item .edge-target {
413
+ flex: 1;
414
+ color: var(--text-secondary);
415
+ overflow: hidden;
416
+ text-overflow: ellipsis;
417
+ white-space: nowrap;
418
+ }
419
+
420
+ .edge-item .edge-type-badge {
421
+ font-size: 0.65rem;
422
+ padding: 0.1rem 0.35rem;
423
+ border-radius: 4px;
424
+ background: rgba(167, 139, 250, 0.15);
425
+ color: var(--accent-purple);
426
+ }
427
+
428
+ .edge-item button {
429
+ margin-left: auto;
430
+ flex-shrink: 0;
431
+ }
432
+
433
+ .link-form {
434
+ display: flex;
435
+ gap: 0.4rem;
436
+ align-items: flex-end;
437
+ flex-wrap: wrap;
438
+ position: relative;
439
+ }
440
+
441
+ .link-form input {
442
+ flex: 1;
443
+ min-width: 120px;
444
+ }
445
+
446
+ .link-search-results {
447
+ position: absolute;
448
+ top: 100%;
449
+ left: 0;
450
+ right: 0;
451
+ background: hsl(var(--amb-light-hue) var(--amb-light-saturation) calc(var(--amb-key-light-intensity) * 100%));
452
+ border: 1px solid hsl(var(--amb-light-hue) var(--amb-light-saturation) 30%);
453
+ border-radius: var(--radius-sm);
454
+ max-height: 200px;
455
+ overflow-y: auto;
456
+ z-index: 20;
457
+ }
458
+
459
+ .link-search-item {
460
+ padding: 0.4rem 0.75rem;
461
+ cursor: pointer;
462
+ font-size: 0.8rem;
463
+ display: flex;
464
+ align-items: center;
465
+ gap: 0.5rem;
466
+ border-bottom: 1px solid hsl(var(--amb-light-hue) var(--amb-light-saturation) 18%);
467
+ }
468
+
469
+ .link-search-item:hover {
470
+ background: hsl(var(--amb-light-hue) var(--amb-light-saturation) calc(var(--amb-key-light-intensity) * 130%));
471
+ }
472
+
473
+ .link-search-item .node-type {
474
+ font-size: 0.65rem;
475
+ padding: 0.05rem 0.3rem;
476
+ border-radius: 3px;
477
+ font-weight: 500;
478
+ }
479
+
480
+ .link-search-item .node-type.memory {
481
+ background: rgba(79, 156, 247, 0.15);
482
+ color: var(--accent-blue);
217
483
  }
218
484
 
219
- .form-actions { display: flex; gap: 0.5rem; margin-top: 0.75rem; }
485
+ .link-search-item .node-type.persona {
486
+ background: rgba(247, 185, 85, 0.15);
487
+ color: var(--accent-amber);
488
+ }
220
489
 
221
490
  /* ---------- Data Tables ---------- */
222
- .data-table-container { overflow-x: auto; }
491
+ .data-table-container {
492
+ overflow-x: auto;
493
+ }
223
494
 
224
495
  .data-table {
225
496
  width: 100%;
226
497
  border-collapse: collapse;
227
- font-size: 0.85rem;
498
+ font-size: 0.82rem;
228
499
  }
229
500
 
230
501
  .data-table th {
231
502
  text-align: left;
232
- padding: 0.6rem 0.75rem;
233
- background: var(--bg-surface-alt);
503
+ padding: 0.5rem 0.6rem;
234
504
  color: var(--text-secondary);
235
505
  font-weight: 500;
236
- border-bottom: 1px solid var(--border);
506
+ white-space: nowrap;
507
+ border-bottom: 1px solid hsl(var(--amb-light-hue) var(--amb-light-saturation) 18%);
508
+ background: hsl(var(--amb-light-hue) var(--amb-light-saturation) calc(var(--amb-key-light-intensity) * 70%));
237
509
  position: sticky;
238
510
  top: 0;
239
511
  }
240
512
 
241
513
  .data-table td {
242
- padding: 0.6rem 0.75rem;
243
- border-bottom: 1px solid var(--border);
514
+ padding: 0.35rem 0.5rem;
515
+ border-bottom: 1px solid hsl(var(--amb-light-hue) var(--amb-light-saturation) 14%);
244
516
  max-width: 400px;
245
517
  overflow: hidden;
246
518
  text-overflow: ellipsis;
247
519
  white-space: nowrap;
248
520
  }
249
521
 
250
- .data-table tr:hover td { background: var(--bg-hover); }
522
+ .data-table td:first-child {
523
+ white-space: normal;
524
+ max-width: 280px;
525
+ }
526
+
527
+ .data-table tr:hover td {
528
+ background: hsl(var(--amb-light-hue) var(--amb-light-saturation) calc(var(--amb-key-light-intensity) * 130%));
529
+ }
530
+
531
+ .data-table .actions {
532
+ white-space: nowrap;
533
+ }
534
+
535
+ .data-table .actions button {
536
+ margin-right: 0.25rem;
537
+ }
538
+
539
+ .memory-pointer {
540
+ border-left: 3px solid var(--accent-cyan);
541
+ }
542
+
543
+ .vol-low {
544
+ color: var(--accent-green);
545
+ }
546
+
547
+ .vol-medium {
548
+ color: var(--accent-amber);
549
+ }
251
550
 
252
- .data-table .actions { white-space: nowrap; }
253
- .data-table .actions button { margin-right: 0.25rem; }
551
+ .vol-high {
552
+ color: var(--accent-red);
553
+ }
254
554
 
255
555
  /* ---------- Filters ---------- */
256
556
  .filters {
@@ -258,11 +558,14 @@ input[type="text"]:focus, textarea:focus, select:focus {
258
558
  gap: 0.5rem;
259
559
  padding: 0.75rem;
260
560
  margin-bottom: 1rem;
261
- background: var(--bg-surface);
262
561
  border-radius: var(--radius);
562
+ /* amb-surface-concave applied via HTML — recessed filter bar */
263
563
  }
264
564
 
265
- .filters input, .filters select { max-width: 250px; }
565
+ .filters input,
566
+ .filters select {
567
+ max-width: 250px;
568
+ }
266
569
 
267
570
  /* ---------- Pagination ---------- */
268
571
  .pagination {
@@ -284,11 +587,11 @@ input[type="text"]:focus, textarea:focus, select:focus {
284
587
  width: 100%;
285
588
  height: calc(100vh - 280px);
286
589
  min-height: 400px;
287
- background: var(--bg-surface);
288
590
  border-radius: var(--radius);
289
591
  overflow: hidden;
290
592
  position: relative;
291
593
  cursor: grab;
594
+ /* amb-surface-concave amb-chamfer — recessed canvas */
292
595
  }
293
596
 
294
597
  .graph-container:active {
@@ -322,9 +625,8 @@ input[type="text"]:focus, textarea:focus, select:focus {
322
625
  flex-wrap: wrap;
323
626
  gap: 0.5rem;
324
627
  padding: 0.5rem 0.75rem;
325
- background: rgba(15, 17, 23, 0.85);
628
+ background: hsl(var(--amb-light-hue) var(--amb-light-saturation) calc(var(--amb-key-light-intensity) * 50%) / 0.85);
326
629
  border-radius: var(--radius-sm);
327
- border: 1px solid var(--border);
328
630
  font-size: 0.75rem;
329
631
  color: var(--text-secondary);
330
632
  z-index: 10;
@@ -346,14 +648,22 @@ input[type="text"]:focus, textarea:focus, select:focus {
346
648
  flex-shrink: 0;
347
649
  }
348
650
 
651
+ .legend-diamond {
652
+ width: 10px;
653
+ height: 10px;
654
+ display: inline-block;
655
+ flex-shrink: 0;
656
+ transform: rotate(45deg);
657
+ border-radius: 2px;
658
+ }
659
+
349
660
  /* Detail panel */
350
661
  .graph-detail-panel {
351
662
  margin-top: 0.5rem;
352
663
  padding: 1rem 1.25rem;
353
- background: var(--bg-surface);
354
664
  border-radius: var(--radius);
355
- border: 1px solid var(--border);
356
665
  animation: fadeIn 0.2s ease;
666
+ /* amb-surface amb-chamfer amb-elevation-2 via HTML */
357
667
  }
358
668
 
359
669
  .detail-header {
@@ -396,14 +706,58 @@ input[type="text"]:focus, textarea:focus, select:focus {
396
706
  }
397
707
 
398
708
  /* Graph node/edge styles */
399
- .graph-node { cursor: pointer; }
400
- .graph-node .node-circle { transition: all 0.15s ease; }
401
- .graph-node:hover .node-circle { filter: brightness(1.3); }
402
- .graph-node:hover .node-glow { stroke-opacity: 0.4; }
403
- .graph-node .node-label { font-size: 10px; fill: var(--text-secondary); pointer-events: none; font-weight: 500; }
404
- .graph-edge { stroke-opacity: 0.35; transition: stroke-opacity 0.15s ease; }
405
- .graph-edge:hover { stroke-opacity: 0.8; }
406
- .graph-edge-label { font-size: 7px; fill: var(--text-muted); pointer-events: none; }
709
+ .graph-node {
710
+ cursor: pointer;
711
+ }
712
+
713
+ .graph-node .node-circle {
714
+ transition: all 0.15s ease;
715
+ }
716
+
717
+ .graph-node:hover .node-circle {
718
+ filter: brightness(1.3);
719
+ }
720
+
721
+ .graph-node:hover .node-glow {
722
+ stroke-opacity: 0.4;
723
+ }
724
+
725
+ .graph-node .node-label {
726
+ font-size: 10px;
727
+ fill: var(--text-secondary);
728
+ pointer-events: none;
729
+ font-weight: 500;
730
+ }
731
+
732
+ .graph-node .node-diamond {
733
+ transition: all 0.15s ease;
734
+ }
735
+
736
+ .graph-node:hover .node-diamond {
737
+ filter: brightness(1.3);
738
+ }
739
+
740
+ .graph-edge {
741
+ stroke-opacity: 0.35;
742
+ transition: stroke-opacity 0.15s ease;
743
+ }
744
+
745
+ .graph-edge:hover {
746
+ stroke-opacity: 0.8;
747
+ }
748
+
749
+ .graph-edge-label {
750
+ font-size: 7px;
751
+ fill: var(--text-muted);
752
+ pointer-events: none;
753
+ }
754
+
755
+ .graph-link-preview {
756
+ stroke: var(--accent-cyan);
757
+ stroke-width: 2;
758
+ stroke-dasharray: 6 3;
759
+ stroke-opacity: 0.8;
760
+ }
407
761
 
408
762
  /* ---------- Scripts ---------- */
409
763
  .scripts-grid {
@@ -414,14 +768,22 @@ input[type="text"]:focus, textarea:focus, select:focus {
414
768
 
415
769
  .script-card {
416
770
  padding: 1.25rem;
417
- background: var(--bg-surface);
418
771
  border-radius: var(--radius);
419
- border: 1px solid var(--border);
772
+ /* amb-surface amb-chamfer amb-elevation-2 via HTML */
773
+ }
774
+
775
+ .script-card h3 {
776
+ margin-bottom: 0.5rem;
777
+ }
778
+
779
+ .script-card p {
780
+ font-size: 0.85rem;
781
+ margin-bottom: 1rem;
420
782
  }
421
783
 
422
- .script-card h3 { margin-bottom: 0.5rem; }
423
- .script-card p { font-size: 0.85rem; margin-bottom: 1rem; }
424
- .script-card .form-row { margin-bottom: 0.75rem; }
784
+ .script-card .form-row {
785
+ margin-bottom: 0.75rem;
786
+ }
425
787
 
426
788
  .script-status {
427
789
  margin-top: 0.75rem;
@@ -429,9 +791,17 @@ input[type="text"]:focus, textarea:focus, select:focus {
429
791
  color: var(--text-secondary);
430
792
  }
431
793
 
432
- .script-status.running { color: var(--accent-amber); }
433
- .script-status.success { color: var(--accent-green); }
434
- .script-status.error { color: var(--accent-red); }
794
+ .script-status.running {
795
+ color: var(--accent-amber);
796
+ }
797
+
798
+ .script-status.success {
799
+ color: var(--accent-green);
800
+ }
801
+
802
+ .script-status.error {
803
+ color: var(--accent-red);
804
+ }
435
805
 
436
806
  /* ---------- Workspace Files ---------- */
437
807
  .workspace-files {
@@ -443,16 +813,41 @@ input[type="text"]:focus, textarea:focus, select:focus {
443
813
 
444
814
  .workspace-file-btn {
445
815
  padding: 0.35rem 0.75rem;
446
- background: var(--bg-surface-alt);
447
- border: 1px solid var(--border);
816
+ border: none;
448
817
  border-radius: var(--radius-sm);
449
818
  color: var(--text-primary);
450
819
  cursor: pointer;
451
820
  font-size: 0.8rem;
452
821
  transition: all var(--transition);
822
+ background: hsl(var(--amb-light-hue) var(--amb-light-saturation) calc(var(--amb-key-light-intensity) * 80%));
823
+ }
824
+
825
+ .workspace-file-btn:hover {
826
+ filter: brightness(1.2);
827
+ color: var(--accent-cyan);
828
+ }
829
+
830
+ .workspace-import-actions {
831
+ display: flex;
832
+ gap: 0.25rem;
833
+ margin-top: 0.35rem;
834
+ }
835
+
836
+ .workspace-import-btn {
837
+ padding: 0.2rem 0.5rem;
838
+ border: none;
839
+ border-radius: 4px;
840
+ color: var(--text-secondary);
841
+ cursor: pointer;
842
+ font-size: 0.7rem;
843
+ transition: all var(--transition);
844
+ background: hsl(var(--amb-light-hue) var(--amb-light-saturation) calc(var(--amb-key-light-intensity) * 60%));
453
845
  }
454
846
 
455
- .workspace-file-btn:hover { border-color: var(--accent-cyan); }
847
+ .workspace-import-btn:hover {
848
+ color: var(--accent-cyan);
849
+ filter: brightness(1.3);
850
+ }
456
851
 
457
852
  .workspace-content {
458
853
  padding: 1rem;
@@ -463,9 +858,10 @@ input[type="text"]:focus, textarea:focus, select:focus {
463
858
  font-size: 0.8rem;
464
859
  color: var(--text-secondary);
465
860
  line-height: 1.6;
861
+ /* amb-surface-concave amb-fillet via HTML */
466
862
  }
467
863
 
468
- /* ---------- Badge ---------- */
864
+ /* ---------- Badges ---------- */
469
865
  .badge {
470
866
  display: inline-block;
471
867
  padding: 0.15rem 0.5rem;
@@ -474,13 +870,50 @@ input[type="text"]:focus, textarea:focus, select:focus {
474
870
  font-weight: 500;
475
871
  }
476
872
 
477
- .badge-permanent { background: rgba(74, 222, 128, 0.15); color: var(--accent-green); }
478
- .badge-stable { background: rgba(79, 156, 247, 0.15); color: var(--accent-blue); }
479
- .badge-daily { background: rgba(247, 185, 85, 0.15); color: var(--accent-amber); }
480
- .badge-session { background: rgba(167, 139, 250, 0.15); color: var(--accent-purple); }
481
- .badge-volatile { background: rgba(247, 85, 90, 0.15); color: var(--accent-red); }
482
- .badge-true { background: rgba(0, 212, 170, 0.15); color: var(--accent-cyan); }
483
- .badge-false { background: rgba(107, 114, 128, 0.15); color: var(--text-muted); }
873
+ .badge-permanent {
874
+ background: rgba(74, 222, 128, 0.15);
875
+ color: var(--accent-green);
876
+ }
877
+
878
+ .badge-stable {
879
+ background: rgba(79, 156, 247, 0.15);
880
+ color: var(--accent-blue);
881
+ }
882
+
883
+ .badge-daily {
884
+ background: rgba(247, 185, 85, 0.15);
885
+ color: var(--accent-amber);
886
+ }
887
+
888
+ .badge-session {
889
+ background: rgba(167, 139, 250, 0.15);
890
+ color: var(--accent-purple);
891
+ }
892
+
893
+ .badge-volatile {
894
+ background: rgba(247, 85, 90, 0.15);
895
+ color: var(--accent-red);
896
+ }
897
+
898
+ .badge-true {
899
+ background: rgba(0, 212, 170, 0.15);
900
+ color: var(--accent-cyan);
901
+ }
902
+
903
+ .badge-false {
904
+ background: rgba(107, 114, 128, 0.15);
905
+ color: var(--text-muted);
906
+ }
907
+
908
+ .badge-memory {
909
+ background: rgba(79, 156, 247, 0.1);
910
+ color: var(--accent-blue);
911
+ }
912
+
913
+ .badge-persona {
914
+ background: rgba(247, 185, 85, 0.1);
915
+ color: var(--accent-amber);
916
+ }
484
917
 
485
918
  /* ---------- Toast Notifications ---------- */
486
919
  .toast-container {
@@ -502,12 +935,41 @@ input[type="text"]:focus, textarea:focus, select:focus {
502
935
  max-width: 350px;
503
936
  }
504
937
 
505
- .toast-success { background: rgba(74, 222, 128, 0.9); color: var(--bg-primary); }
506
- .toast-error { background: rgba(247, 85, 90, 0.9); }
507
- .toast-info { background: rgba(79, 156, 247, 0.9); }
938
+ .toast-success {
939
+ background: rgba(74, 222, 128, 0.9);
940
+ color: #0a0c0f;
941
+ }
942
+
943
+ .toast-error {
944
+ background: rgba(247, 85, 90, 0.9);
945
+ }
946
+
947
+ .toast-info {
948
+ background: rgba(79, 156, 247, 0.9);
949
+ }
950
+
951
+ @keyframes toastIn {
952
+ from {
953
+ opacity: 0;
954
+ transform: translateX(100px);
955
+ }
956
+
957
+ to {
958
+ opacity: 1;
959
+ transform: translateX(0);
960
+ }
961
+ }
962
+
963
+ @keyframes toastOut {
964
+ from {
965
+ opacity: 1;
966
+ }
508
967
 
509
- @keyframes toastIn { from { opacity: 0; transform: translateX(100px); } to { opacity: 1; transform: translateX(0); } }
510
- @keyframes toastOut { from { opacity: 1; } to { opacity: 0; transform: translateY(10px); } }
968
+ to {
969
+ opacity: 0;
970
+ transform: translateY(10px);
971
+ }
972
+ }
511
973
 
512
974
  /* ---------- Config Grid ---------- */
513
975
  .config-grid {
@@ -519,6 +981,8 @@ input[type="text"]:focus, textarea:focus, select:focus {
519
981
 
520
982
  .config-card {
521
983
  padding: 1.5rem;
984
+ border-radius: var(--radius);
985
+ /* amb-surface amb-chamfer amb-elevation-2 via HTML */
522
986
  }
523
987
 
524
988
  .config-card-full {
@@ -528,21 +992,20 @@ input[type="text"]:focus, textarea:focus, select:focus {
528
992
  .config-card h3 {
529
993
  margin-bottom: 0.5rem;
530
994
  font-size: 1.1rem;
531
- color: var(--accent-cyan);
995
+ color: var(--text-primary);
532
996
  }
533
997
 
534
998
  .config-card .hint {
535
999
  margin-bottom: 1.25rem;
536
1000
  font-size: 0.85rem;
537
- color: var(--text-muted);
1001
+ color: var(--text-secondary);
538
1002
  }
539
1003
 
540
1004
  .config-card small {
541
1005
  display: block;
542
1006
  margin-top: 0.25rem;
543
- color: var(--text-muted);
544
- font-size: 0.75rem;
545
- opacity: 0.8;
1007
+ color: var(--text-secondary);
1008
+ font-size: 0.78rem;
546
1009
  }
547
1010
 
548
1011
  .code-font {
@@ -558,14 +1021,8 @@ input[type="text"]:focus, textarea:focus, select:focus {
558
1021
  }
559
1022
 
560
1023
  /* Responsive grid for internal form rows */
561
- .form-row-grid {
562
- display: grid;
563
- grid-template-columns: 1fr 1fr;
564
- gap: 1.25rem;
565
- }
566
-
567
1024
  @media (max-width: 600px) {
568
1025
  .form-row-grid {
569
1026
  grid-template-columns: 1fr;
570
1027
  }
571
- }
1028
+ }