recallnest 2.2.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/.env +4 -0
  2. package/config.json +55 -0
  3. package/logs/daily-recall.error.log +0 -0
  4. package/logs/daily-recall.log +30 -0
  5. package/logs/ingest-2026-04-11.log +110 -0
  6. package/logs/ingest-2026-04-12.log +90 -0
  7. package/logs/launchagent-stderr.log +0 -0
  8. package/logs/launchagent-stdout.log +0 -0
  9. package/package.json +1 -1
  10. package/.claude-plugin/CLAUDE.md +0 -29
  11. package/.claude-plugin/marketplace.json +0 -18
  12. package/.dockerignore +0 -11
  13. package/.github/workflows/ci.yml +0 -28
  14. package/.mcp.json +0 -9
  15. package/CHANGELOG.md +0 -51
  16. package/DEMO.md +0 -94
  17. package/Dockerfile +0 -20
  18. package/EVAL.md +0 -89
  19. package/FAILURES.md +0 -75
  20. package/OPERATIONS.md +0 -59
  21. package/ROADMAP.md +0 -245
  22. package/SKILL.md +0 -250
  23. package/assets/dashboard.png +0 -0
  24. package/assets/knowledge-graph.png +0 -0
  25. package/assets/recallnest-workbench.png +0 -0
  26. package/assets/screenshots/ui-full.png +0 -0
  27. package/assets/screenshots/ui-overview.png +0 -0
  28. package/assets/screenshots/ui-search.png +0 -0
  29. package/assets/ui/app.js +0 -1031
  30. package/assets/ui/index.html +0 -224
  31. package/assets/ui/styles.css +0 -781
  32. package/assets/wechat-qr.jpg +0 -0
  33. package/bun.lock +0 -337
  34. package/daily-reflections/2026-03-05.md +0 -15
  35. package/daily-reflections/2026-03-06.md +0 -15
  36. package/daily-reflections/2026-03-07.md +0 -7
  37. package/daily-reflections/2026-03-08.md +0 -34
  38. package/daily-reflections/2026-03-09.md +0 -35
  39. package/daily-reflections/2026-03-10.md +0 -36
  40. package/daily-reflections/2026-03-11.md +0 -35
  41. package/daily-reflections/2026-03-12.md +0 -36
  42. package/daily-reflections/2026-03-13.md +0 -35
  43. package/daily-reflections/2026-03-14.md +0 -35
  44. package/daily-reflections/2026-03-15.md +0 -35
  45. package/daily-reflections/2026-03-16.md +0 -41
  46. package/daily-reflections/2026-03-17.md +0 -10
  47. package/daily-reflections/2026-03-18.md +0 -10
  48. package/daily-reflections/2026-03-19.md +0 -10
  49. package/daily-reflections/2026-03-20.md +0 -10
  50. package/daily-reflections/2026-03-21.md +0 -10
  51. package/daily-reflections/2026-03-22.md +0 -10
  52. package/daily-reflections/2026-03-23.md +0 -10
  53. package/daily-reflections/2026-03-24.md +0 -10
  54. package/daily-reflections/2026-03-25.md +0 -32
  55. package/daily-reflections/2026-03-26.md +0 -37
  56. package/daily-reflections/2026-03-27.md +0 -35
  57. package/daily-reflections/2026-03-28.md +0 -35
  58. package/daily-reflections/2026-03-29.md +0 -35
  59. package/daily-reflections/2026-03-30.md +0 -36
  60. package/daily-reflections/2026-03-31.md +0 -35
  61. package/daily-reflections/2026-04-01.md +0 -35
  62. package/daily-reflections/2026-04-02.md +0 -35
  63. package/daily-reflections/2026-04-03.md +0 -37
  64. package/daily-reflections/2026-04-04.md +0 -37
  65. package/daily-reflections/2026-04-05.md +0 -35
  66. package/daily-reflections/2026-04-06.md +0 -36
  67. package/daily-reflections/2026-04-07.md +0 -35
  68. package/daily-reflections/2026-04-08.md +0 -35
  69. package/daily-reflections/2026-04-12.md +0 -35
  70. package/data/alias-map.example.json +0 -22
  71. package/docs/api-reference.md +0 -1291
  72. package/docs/architecture.md +0 -168
  73. package/docs/memory-boundary-contract.md +0 -226
  74. package/docs/memory-categories.md +0 -119
  75. package/docs/pipeline-audit-ultramemory.md +0 -177
  76. package/docs/plans/2026-03-08-query-expansion.md +0 -270
  77. package/docs/plans/2026-03-16-continuity-layer.md +0 -196
  78. package/docs/plans/2026-04-01-recall-boost.md +0 -100
  79. package/docs/plans/mcp-tiering-plan.md +0 -126
  80. package/docs/research/recall-quality-audit-2026-03-22.md +0 -153
  81. package/docs/self-evolution.md +0 -198
  82. package/docs/superpowers/plans/2026-03-19-ingest-pipeline-upgrade.md +0 -782
  83. package/docs/superpowers/plans/2026-04-11-constructive-retrieval-emotion.md +0 -1195
  84. package/docs/superpowers/specs/2026-03-19-ingest-pipeline-upgrade-design.md +0 -77
  85. package/docs/superpowers/specs/2026-03-23-pull-claude-desktop-design.md +0 -95
  86. package/docs/superpowers/specs/2026-04-11-constructive-retrieval-emotion-design.md +0 -398
  87. package/eval/continuity/results-2026-03-16.md +0 -117
  88. package/eval/continuity/results-2026-03-19.md +0 -453
  89. package/eval/continuity/runbook.md +0 -110
  90. package/eval/continuity/seed-cases.md +0 -54
  91. package/eval/reports/2026-03-06-abstract-query-baseline.md +0 -96
  92. package/eval/reports/2026-03-06-aws-ssh-baseline.md +0 -82
  93. package/eval/reports/2026-03-06-baseline.md +0 -82
  94. package/eval/reports/query-expansion.md +0 -138
  95. package/glama.json +0 -6
  96. package/lm +0 -19
  97. package/plan-philosophy-upgrades.md +0 -363
  98. package/plan-product-upgrades.md +0 -155
  99. package/plan-v1.2-distributable.md +0 -105
  100. package/plan.md +0 -140
  101. package/research-memory-evolution.md +0 -440
  102. package/research-rl-agent-memory.md +0 -330
  103. package/scripts/archive-distilled-junk.ts +0 -116
  104. package/scripts/backfill-anchors.ts +0 -130
  105. package/scripts/backfill-l0l1l2.ts +0 -98
  106. package/scripts/blind-scan.ts +0 -588
  107. package/scripts/cleanup-step1-exact-dups.ts +0 -117
  108. package/scripts/cleanup-step2-template-dups.ts +0 -113
  109. package/scripts/cleanup-step3-stale-content.ts +0 -149
  110. package/scripts/cleanup-step4-orphan-scopes.ts +0 -131
  111. package/scripts/delete-distilled-junk.ts +0 -88
  112. package/scripts/diagnose-vector-search.ts +0 -132
  113. package/scripts/distill-facts.ts +0 -305
  114. package/scripts/health-check.ts +0 -343
  115. package/scripts/incremental-ingest.sh +0 -71
  116. package/scripts/migrate-language.ts +0 -75
  117. package/scripts/mlp-health-check.ts +0 -382
  118. package/scripts/pull-claude-desktop.ts +0 -515
  119. package/scripts/re-ingest-cc.sh +0 -66
  120. package/scripts/rebalance-memory-health.ts +0 -181
  121. package/scripts/run-desktop-ingest.sh +0 -11
  122. package/scripts/start-server.sh +0 -12
  123. package/scripts/verify-emotion-decay.ts +0 -148
  124. package/scripts/viz-dashboard.html +0 -423
  125. package/scripts/viz-export.ts +0 -703
  126. package/src/__tests__/access-tracker-novelty.test.ts +0 -228
  127. package/src/__tests__/activity-counter.test.ts +0 -96
  128. package/src/__tests__/admission-control.test.ts +0 -206
  129. package/src/__tests__/anchor-generator.test.ts +0 -67
  130. package/src/__tests__/auto-consolidation.test.ts +0 -168
  131. package/src/__tests__/auto-recall.test.ts +0 -131
  132. package/src/__tests__/babel-integration.test.ts +0 -139
  133. package/src/__tests__/batch-dedup.test.ts +0 -65
  134. package/src/__tests__/capture-engine.test.ts +0 -1144
  135. package/src/__tests__/capture-heuristic.test.ts +0 -171
  136. package/src/__tests__/cascade-forget.test.ts +0 -210
  137. package/src/__tests__/category-min-scores.test.ts +0 -33
  138. package/src/__tests__/cc8-cc1-essential-context.test.ts +0 -298
  139. package/src/__tests__/circuit-breaker.test.ts +0 -99
  140. package/src/__tests__/cluster-consolidation.test.ts +0 -712
  141. package/src/__tests__/confidence-metadata.test.ts +0 -125
  142. package/src/__tests__/confidence-tracker.test.ts +0 -249
  143. package/src/__tests__/conflict-advisor.test.ts +0 -206
  144. package/src/__tests__/conflict-escalation.test.ts +0 -149
  145. package/src/__tests__/conflict-lifecycle.test.ts +0 -83
  146. package/src/__tests__/conflict-output.test.ts +0 -85
  147. package/src/__tests__/conflict-store.test.ts +0 -374
  148. package/src/__tests__/consolidation-engine.test.ts +0 -181
  149. package/src/__tests__/constructive-retrieval.test.ts +0 -509
  150. package/src/__tests__/context-collapse-renderer.test.ts +0 -214
  151. package/src/__tests__/context-composer-pins.test.ts +0 -64
  152. package/src/__tests__/context-composer-task-selection.test.ts +0 -24
  153. package/src/__tests__/context-reconstructor.test.ts +0 -65
  154. package/src/__tests__/context-renderer.test.ts +0 -91
  155. package/src/__tests__/continuity-eval.test.ts +0 -275
  156. package/src/__tests__/continuity-schema.test.ts +0 -97
  157. package/src/__tests__/conversation-importer.test.ts +0 -692
  158. package/src/__tests__/core-recall-eval.test.ts +0 -235
  159. package/src/__tests__/core-summary.test.ts +0 -109
  160. package/src/__tests__/data-checkup.test.ts +0 -225
  161. package/src/__tests__/decay-exemption.test.ts +0 -84
  162. package/src/__tests__/dedup-actions.test.ts +0 -58
  163. package/src/__tests__/dedup-guard.test.ts +0 -39
  164. package/src/__tests__/deterministic-id.test.ts +0 -39
  165. package/src/__tests__/distill-lock.test.ts +0 -176
  166. package/src/__tests__/doctor.test.ts +0 -303
  167. package/src/__tests__/dream-pipeline.test.ts +0 -232
  168. package/src/__tests__/drill-down.test.ts +0 -108
  169. package/src/__tests__/embedder.test.ts +0 -122
  170. package/src/__tests__/emotion-decay.test.ts +0 -46
  171. package/src/__tests__/emotion-detector.test.ts +0 -56
  172. package/src/__tests__/emotion-phase1-integration.test.ts +0 -153
  173. package/src/__tests__/emotion-retrieval.test.ts +0 -56
  174. package/src/__tests__/entity-resolver.test.ts +0 -58
  175. package/src/__tests__/ethics-layer.test.ts +0 -476
  176. package/src/__tests__/event-segmenter.test.ts +0 -153
  177. package/src/__tests__/feature-flags-integration.test.ts +0 -54
  178. package/src/__tests__/frequency-tracker.test.ts +0 -113
  179. package/src/__tests__/graph-export.test.ts +0 -489
  180. package/src/__tests__/hotness-blend.test.ts +0 -76
  181. package/src/__tests__/ingest.test.ts +0 -360
  182. package/src/__tests__/interference-detector.test.ts +0 -203
  183. package/src/__tests__/kg-extractor.test.ts +0 -184
  184. package/src/__tests__/kg-store.test.ts +0 -198
  185. package/src/__tests__/llm-consolidation.test.ts +0 -226
  186. package/src/__tests__/mcp-efficiency.test.ts +0 -288
  187. package/src/__tests__/memory-boundaries.test.ts +0 -237
  188. package/src/__tests__/memory-evolution-b2-b3-e1.test.ts +0 -243
  189. package/src/__tests__/memory-evolution.test.ts +0 -271
  190. package/src/__tests__/memory-health-rebalance.test.ts +0 -144
  191. package/src/__tests__/memory-lint.test.ts +0 -271
  192. package/src/__tests__/memory-output.test.ts +0 -215
  193. package/src/__tests__/multi-vector.test.ts +0 -242
  194. package/src/__tests__/narrative-architecture.test.ts +0 -456
  195. package/src/__tests__/pending-review.test.ts +0 -77
  196. package/src/__tests__/post-retrieval-filter.test.ts +0 -178
  197. package/src/__tests__/ppr-traversal.test.ts +0 -256
  198. package/src/__tests__/prediction-engine.test.ts +0 -349
  199. package/src/__tests__/predictive-prospective-memory.test.ts +0 -416
  200. package/src/__tests__/preference-guard-smoke.test.ts +0 -211
  201. package/src/__tests__/preference-matcher.test.ts +0 -230
  202. package/src/__tests__/preference-slots.test.ts +0 -205
  203. package/src/__tests__/prospective-memory.test.ts +0 -283
  204. package/src/__tests__/query-entity-detector.test.ts +0 -171
  205. package/src/__tests__/query-expander-alias.test.ts +0 -89
  206. package/src/__tests__/query-expander.test.ts +0 -34
  207. package/src/__tests__/recall-governor.test.ts +0 -227
  208. package/src/__tests__/recall-mode.test.ts +0 -64
  209. package/src/__tests__/result-synthesizer.test.ts +0 -198
  210. package/src/__tests__/resume-context.test.ts +0 -4898
  211. package/src/__tests__/retrieval-trace.test.ts +0 -213
  212. package/src/__tests__/retriever-boundary-weight.test.ts +0 -136
  213. package/src/__tests__/retroactive-boost.test.ts +0 -223
  214. package/src/__tests__/salience-scoring.test.ts +0 -106
  215. package/src/__tests__/scope-inventory.test.ts +0 -200
  216. package/src/__tests__/scope-policy.test.ts +0 -69
  217. package/src/__tests__/session-checkpoint.test.ts +0 -259
  218. package/src/__tests__/session-distiller.test.ts +0 -611
  219. package/src/__tests__/session-gc.test.ts +0 -215
  220. package/src/__tests__/skill-engine.test.ts +0 -546
  221. package/src/__tests__/skill-promotion.test.ts +0 -349
  222. package/src/__tests__/store-scope-audit.test.ts +0 -81
  223. package/src/__tests__/supersede-chain.test.ts +0 -154
  224. package/src/__tests__/temporal-parser.test.ts +0 -241
  225. package/src/__tests__/temporal-validity.test.ts +0 -160
  226. package/src/__tests__/term-registry.test.ts +0 -121
  227. package/src/__tests__/tool-output-compressor.test.ts +0 -133
  228. package/src/__tests__/topic-tag.test.ts +0 -113
  229. package/src/__tests__/trusted-memory.test.ts +0 -828
  230. package/src/__tests__/version-manager.test.ts +0 -213
  231. package/src/__tests__/workflow-observation.test.ts +0 -400
  232. package/src/__tests__/write-verifier.test.ts +0 -122
@@ -1,781 +0,0 @@
1
- :root {
2
- --bg: #f3eadc;
3
- --paper: rgba(255, 251, 244, 0.92);
4
- --ink: #1d2a2b;
5
- --muted: #5c6b69;
6
- --line: rgba(29, 42, 43, 0.12);
7
- --accent: #1d6b66;
8
- --accent-soft: #d5ece7;
9
- --signal: #c96f3b;
10
- --shadow: 0 24px 60px rgba(36, 28, 18, 0.12);
11
- }
12
-
13
- * { box-sizing: border-box; }
14
- body {
15
- margin: 0;
16
- min-height: 100vh;
17
- color: var(--ink);
18
- background:
19
- radial-gradient(circle at top left, rgba(201, 111, 59, 0.18), transparent 30%),
20
- radial-gradient(circle at top right, rgba(29, 107, 102, 0.18), transparent 28%),
21
- linear-gradient(180deg, #f8f2e8 0%, var(--bg) 100%);
22
- font-family: "Avenir Next", "Segoe UI", sans-serif;
23
- }
24
-
25
- .page-shell {
26
- width: min(1440px, calc(100vw - 32px));
27
- margin: 0 auto;
28
- padding: 18px 0 28px;
29
- }
30
-
31
- .hero {
32
- display: flex;
33
- gap: 24px;
34
- justify-content: space-between;
35
- align-items: center;
36
- padding: 10px 8px 8px;
37
- animation: fade-up 320ms ease;
38
- }
39
-
40
- .eyebrow {
41
- margin: 0 0 4px;
42
- color: var(--signal);
43
- text-transform: uppercase;
44
- letter-spacing: 0.14em;
45
- font-size: 11px;
46
- font-weight: 700;
47
- }
48
-
49
- .hero h1 {
50
- margin: 0;
51
- font-family: "Iowan Old Style", "Palatino Linotype", serif;
52
- font-size: clamp(24px, 3.2vw, 38px);
53
- line-height: 0.98;
54
- max-width: none;
55
- white-space: nowrap;
56
- }
57
-
58
- .subtitle {
59
- margin: 6px 0 0;
60
- max-width: 46ch;
61
- color: var(--muted);
62
- font-size: 14px;
63
- line-height: 1.35;
64
- }
65
-
66
- .hero-badge {
67
- display: flex;
68
- flex-wrap: wrap;
69
- gap: 8px;
70
- max-width: 320px;
71
- justify-content: flex-end;
72
- }
73
-
74
- .hero-badge span,
75
- .brand-card {
76
- border: 1px solid var(--line);
77
- background: rgba(255,255,255,0.55);
78
- border-radius: 20px;
79
- }
80
-
81
- .hero-badge span {
82
- padding: 8px 12px;
83
- font-size: 12px;
84
- }
85
-
86
- .brand-strip {
87
- display: grid;
88
- grid-template-columns: repeat(3, 1fr);
89
- gap: 12px;
90
- margin: 0 8px 12px;
91
- }
92
-
93
- .brand-card {
94
- padding: 10px 14px;
95
- display: flex;
96
- flex-direction: column;
97
- gap: 4px;
98
- color: var(--ink);
99
- text-align: left;
100
- width: 100%;
101
- }
102
-
103
- .brand-card strong {
104
- font-size: 14px;
105
- }
106
-
107
- .brand-card span {
108
- color: var(--muted);
109
- font-size: 12px;
110
- }
111
-
112
- .quick-card {
113
- cursor: pointer;
114
- transition: transform 140ms ease, background 140ms ease, border-color 140ms ease, box-shadow 140ms ease;
115
- }
116
-
117
- .quick-card:hover {
118
- transform: translateY(-1px);
119
- background: rgba(255,255,255,0.82);
120
- border-color: rgba(29, 107, 102, 0.2);
121
- box-shadow: 0 12px 24px rgba(36, 28, 18, 0.08);
122
- }
123
-
124
- .workspace {
125
- display: grid;
126
- grid-template-columns: 0.82fr 1.42fr 0.68fr;
127
- gap: 18px;
128
- }
129
-
130
- .card {
131
- background: var(--paper);
132
- backdrop-filter: blur(18px);
133
- border: 1px solid rgba(255,255,255,0.45);
134
- box-shadow: var(--shadow);
135
- border-radius: 24px;
136
- padding: 20px;
137
- }
138
-
139
- .section-head {
140
- display: flex;
141
- justify-content: space-between;
142
- align-items: center;
143
- gap: 12px;
144
- margin-bottom: 18px;
145
- }
146
-
147
- .section-head.compact {
148
- margin-top: 20px;
149
- margin-bottom: 10px;
150
- }
151
-
152
- h2, h3 {
153
- margin: 0;
154
- font-family: "Iowan Old Style", "Palatino Linotype", serif;
155
- }
156
-
157
- .field {
158
- display: flex;
159
- flex-direction: column;
160
- gap: 8px;
161
- margin-bottom: 14px;
162
- }
163
-
164
- .field span {
165
- font-size: 13px;
166
- color: var(--muted);
167
- text-transform: uppercase;
168
- letter-spacing: 0.08em;
169
- }
170
-
171
- .view-switch {
172
- display: grid;
173
- grid-template-columns: repeat(4, 1fr);
174
- gap: 8px;
175
- margin-bottom: 14px;
176
- }
177
-
178
- .view-tab {
179
- border: 1px solid var(--line);
180
- background: rgba(255,255,255,0.66);
181
- border-radius: 14px;
182
- padding: 10px 12px;
183
- cursor: pointer;
184
- }
185
-
186
- .view-tab.is-active {
187
- background: var(--ink);
188
- color: #f6f2ea;
189
- border-color: transparent;
190
- }
191
-
192
- input, textarea, select, button { font: inherit; }
193
-
194
- input, textarea, select {
195
- border: 1px solid var(--line);
196
- background: rgba(255,255,255,0.74);
197
- border-radius: 16px;
198
- padding: 12px 14px;
199
- color: var(--ink);
200
- }
201
-
202
- textarea { resize: vertical; min-height: 120px; }
203
-
204
- .grid.two-up {
205
- display: grid;
206
- grid-template-columns: 1fr 1fr;
207
- gap: 12px;
208
- }
209
- .grid.three-up {
210
- display: grid;
211
- grid-template-columns: 1fr 1fr 1fr;
212
- gap: 12px;
213
- }
214
-
215
- .action-row {
216
- display: flex;
217
- flex-wrap: wrap;
218
- gap: 10px;
219
- margin-top: 10px;
220
- }
221
-
222
- .action-button,
223
- .ghost-button,
224
- .card-chip {
225
- border: 1px solid var(--line);
226
- border-radius: 999px;
227
- padding: 11px 16px;
228
- background: rgba(255,255,255,0.75);
229
- cursor: pointer;
230
- transition: transform 140ms ease, background 140ms ease, border-color 140ms ease;
231
- }
232
-
233
- .action-button:hover,
234
- .ghost-button:hover,
235
- .card-chip:hover {
236
- transform: translateY(-1px);
237
- }
238
-
239
- .action-button.primary {
240
- background: var(--accent);
241
- color: #f6fffd;
242
- border-color: transparent;
243
- }
244
-
245
- .action-button.accent {
246
- background: var(--signal);
247
- color: #fffaf4;
248
- border-color: transparent;
249
- }
250
-
251
- .full-width { width: 100%; }
252
-
253
- .tag-chip {
254
- border: 1px solid var(--line);
255
- border-radius: 999px;
256
- padding: 7px 12px;
257
- background: rgba(29, 107, 102, 0.08);
258
- color: var(--ink);
259
- cursor: pointer;
260
- transition: transform 140ms ease, background 140ms ease, border-color 140ms ease;
261
- }
262
-
263
- .tag-chip:hover {
264
- transform: translateY(-1px);
265
- }
266
-
267
- .tag-chip.is-active {
268
- background: var(--accent);
269
- color: #f6fffd;
270
- border-color: transparent;
271
- }
272
-
273
- .tag-chip.inline {
274
- padding: 5px 10px;
275
- font-size: 12px;
276
- }
277
-
278
- .tag-chip span {
279
- opacity: 0.72;
280
- }
281
-
282
- .status-line {
283
- min-height: 20px;
284
- color: var(--muted);
285
- margin: 14px 0 0;
286
- }
287
-
288
- .result-meta {
289
- font-size: 13px;
290
- color: var(--muted);
291
- margin-bottom: 12px;
292
- }
293
-
294
- .view-toolbar {
295
- display: grid;
296
- gap: 10px;
297
- margin-bottom: 12px;
298
- }
299
-
300
- .view-toolbar.is-hidden {
301
- display: none;
302
- }
303
-
304
- .tag-bar {
305
- display: flex;
306
- flex-wrap: wrap;
307
- gap: 8px;
308
- }
309
-
310
- .tag-bar.is-hidden {
311
- display: none;
312
- }
313
-
314
- .ops-bar {
315
- display: flex;
316
- flex-wrap: wrap;
317
- gap: 10px;
318
- align-items: center;
319
- }
320
-
321
- .ops-bar.is-hidden {
322
- display: none;
323
- }
324
-
325
- .ops-copy {
326
- color: var(--muted);
327
- font-size: 13px;
328
- }
329
-
330
- .artifact-bar {
331
- display: grid;
332
- gap: 10px;
333
- margin-bottom: 12px;
334
- }
335
-
336
- .artifact-card {
337
- display: flex;
338
- justify-content: space-between;
339
- align-items: center;
340
- gap: 12px;
341
- padding: 12px 14px;
342
- border: 1px solid rgba(29, 42, 43, 0.1);
343
- border-radius: 18px;
344
- background: rgba(255,255,255,0.72);
345
- }
346
-
347
- .artifact-copy {
348
- display: grid;
349
- gap: 4px;
350
- }
351
-
352
- .artifact-copy strong {
353
- font-size: 14px;
354
- }
355
-
356
- .artifact-copy span {
357
- font-size: 12px;
358
- color: var(--muted);
359
- word-break: break-all;
360
- }
361
-
362
- .result-cards {
363
- display: grid;
364
- gap: 12px;
365
- }
366
-
367
- .result-group {
368
- display: grid;
369
- gap: 12px;
370
- }
371
-
372
- .result-group-head {
373
- display: flex;
374
- justify-content: space-between;
375
- align-items: center;
376
- gap: 12px;
377
- padding: 0 2px;
378
- }
379
-
380
- .result-group-head strong {
381
- font-size: 12px;
382
- text-transform: uppercase;
383
- letter-spacing: 0.08em;
384
- color: var(--signal);
385
- }
386
-
387
- .result-group-head span {
388
- font-size: 12px;
389
- color: var(--muted);
390
- }
391
-
392
- .result-card {
393
- border: 1px solid rgba(29, 42, 43, 0.1);
394
- background: rgba(255,255,255,0.68);
395
- border-radius: 20px;
396
- padding: 16px;
397
- display: grid;
398
- gap: 12px;
399
- }
400
-
401
- .result-card.is-open {
402
- border-color: rgba(29, 107, 102, 0.22);
403
- background: rgba(255,255,255,0.82);
404
- }
405
-
406
- .result-card.is-asset {
407
- background: linear-gradient(135deg, rgba(29, 107, 102, 0.16), rgba(255,255,255,0.82));
408
- border-color: rgba(29, 107, 102, 0.26);
409
- }
410
-
411
- .result-card-header,
412
- .result-card-meta,
413
- .result-card-actions {
414
- display: flex;
415
- flex-wrap: wrap;
416
- gap: 8px;
417
- align-items: center;
418
- }
419
-
420
- .result-card-detail {
421
- display: none;
422
- gap: 10px;
423
- padding-top: 4px;
424
- }
425
-
426
- .result-card.is-open .result-card-detail {
427
- display: grid;
428
- }
429
-
430
- .detail-block {
431
- border-radius: 16px;
432
- background: rgba(29, 42, 43, 0.05);
433
- padding: 12px;
434
- }
435
-
436
- .detail-block strong {
437
- display: block;
438
- font-size: 12px;
439
- text-transform: uppercase;
440
- letter-spacing: 0.08em;
441
- color: var(--muted);
442
- margin-bottom: 8px;
443
- }
444
-
445
- .detail-block pre,
446
- .detail-block code {
447
- margin: 0;
448
- white-space: pre-wrap;
449
- word-break: break-word;
450
- font-family: "SFMono-Regular", "Menlo", monospace;
451
- font-size: 12px;
452
- color: var(--ink);
453
- }
454
-
455
- .detail-actions {
456
- display: flex;
457
- flex-wrap: wrap;
458
- gap: 8px;
459
- margin-top: 10px;
460
- }
461
-
462
- .evidence-chip {
463
- max-width: 100%;
464
- }
465
-
466
- .result-card-header {
467
- justify-content: space-between;
468
- }
469
-
470
- .result-score {
471
- font-weight: 700;
472
- color: var(--accent);
473
- }
474
-
475
- .result-id {
476
- font-family: "SFMono-Regular", "Menlo", monospace;
477
- font-size: 12px;
478
- padding: 6px 10px;
479
- border-radius: 999px;
480
- background: var(--accent-soft);
481
- }
482
-
483
- .result-snippet {
484
- margin: 0;
485
- color: var(--ink);
486
- line-height: 1.55;
487
- display: -webkit-box;
488
- -webkit-line-clamp: 3;
489
- -webkit-box-orient: vertical;
490
- overflow: hidden;
491
- }
492
-
493
- .result-card-meta span {
494
- font-size: 12px;
495
- color: var(--muted);
496
- padding: 6px 10px;
497
- border-radius: 999px;
498
- background: rgba(29, 42, 43, 0.06);
499
- }
500
-
501
- .mini-output {
502
- margin: 0;
503
- white-space: pre-wrap;
504
- word-break: break-word;
505
- background: rgba(23, 29, 29, 0.94);
506
- color: #d8ece7;
507
- border-radius: 18px;
508
- padding: 16px;
509
- min-height: 130px;
510
- overflow: auto;
511
- font-family: "SFMono-Regular", "Menlo", monospace;
512
- font-size: 13px;
513
- line-height: 1.55;
514
- }
515
-
516
- .mini-output.tall {
517
- min-height: 240px;
518
- }
519
-
520
- .mini-output.tall.is-collapsed {
521
- max-height: 132px;
522
- }
523
-
524
- .mini-output.is-collapsed {
525
- max-height: 148px;
526
- overflow: hidden;
527
- position: relative;
528
- }
529
-
530
- .mini-output.is-collapsed::after {
531
- content: "";
532
- position: absolute;
533
- inset: auto 0 0 0;
534
- height: 42px;
535
- background: linear-gradient(180deg, rgba(23, 29, 29, 0) 0%, rgba(23, 29, 29, 0.96) 100%);
536
- }
537
-
538
- .empty-state {
539
- border: 1px dashed var(--line);
540
- border-radius: 20px;
541
- padding: 24px;
542
- color: var(--muted);
543
- background: rgba(255,255,255,0.45);
544
- }
545
-
546
- .list-card {
547
- border: 1px solid rgba(29, 42, 43, 0.1);
548
- background: rgba(255,255,255,0.68);
549
- border-radius: 18px;
550
- padding: 14px;
551
- display: grid;
552
- gap: 10px;
553
- }
554
-
555
- .list-card-head,
556
- .list-card-meta,
557
- .list-card-actions {
558
- display: flex;
559
- flex-wrap: wrap;
560
- gap: 8px;
561
- align-items: center;
562
- }
563
-
564
- .list-card-head strong {
565
- font-size: 15px;
566
- }
567
-
568
- .list-card-meta span {
569
- font-size: 12px;
570
- color: var(--muted);
571
- padding: 6px 10px;
572
- border-radius: 999px;
573
- background: rgba(29, 42, 43, 0.06);
574
- }
575
-
576
- @keyframes fade-up {
577
- from { opacity: 0; transform: translateY(10px); }
578
- to { opacity: 1; transform: translateY(0); }
579
- }
580
-
581
- @media (max-width: 1180px) {
582
- .workspace,
583
- .brand-strip {
584
- grid-template-columns: 1fr;
585
- }
586
- .hero {
587
- flex-direction: column;
588
- align-items: start;
589
- }
590
- .hero h1 {
591
- white-space: normal;
592
- }
593
- .hero-badge {
594
- justify-content: flex-start;
595
- }
596
- }
597
-
598
- @media (max-width: 720px) {
599
- .page-shell {
600
- width: min(100vw - 18px, 100%);
601
- padding-top: 16px;
602
- }
603
- .grid.two-up, .grid.three-up {
604
- grid-template-columns: 1fr;
605
- }
606
- .card {
607
- border-radius: 18px;
608
- padding: 16px;
609
- }
610
- }
611
-
612
- .is-hidden {
613
- display: none !important;
614
- }
615
-
616
- /* ---------------------------------------------------------------------------
617
- Dashboard
618
- --------------------------------------------------------------------------- */
619
-
620
- .dashboard-view {
621
- grid-column: 1 / -1;
622
- }
623
-
624
- .dash-stats-row {
625
- display: grid;
626
- grid-template-columns: repeat(4, 1fr);
627
- gap: 1rem;
628
- margin-bottom: 1.5rem;
629
- }
630
-
631
- .stat-card {
632
- display: flex;
633
- flex-direction: column;
634
- align-items: center;
635
- padding: 1.25rem;
636
- border-radius: 0.75rem;
637
- background: rgba(29, 42, 43, 0.05);
638
- border: 1px solid var(--line);
639
- }
640
-
641
- .stat-value {
642
- font-size: 2rem;
643
- font-weight: 700;
644
- font-variant-numeric: tabular-nums;
645
- line-height: 1.2;
646
- }
647
-
648
- .stat-value.good { color: #10b981; }
649
- .stat-value.warn { color: #f59e0b; }
650
- .stat-value.bad { color: #ef4444; }
651
-
652
- .stat-label {
653
- font-size: 0.8rem;
654
- color: var(--muted);
655
- margin-top: 0.25rem;
656
- text-transform: uppercase;
657
- letter-spacing: 0.05em;
658
- }
659
-
660
- .dash-grid {
661
- display: grid;
662
- grid-template-columns: 1fr 1fr;
663
- gap: 1.5rem;
664
- margin-bottom: 1.5rem;
665
- }
666
-
667
- .dash-panel {
668
- padding: 1rem;
669
- border-radius: 0.75rem;
670
- background: rgba(29, 42, 43, 0.05);
671
- border: 1px solid var(--line);
672
- }
673
-
674
- .dash-panel.full-width {
675
- grid-column: 1 / -1;
676
- }
677
-
678
- .dash-panel h3 {
679
- font-size: 0.85rem;
680
- font-weight: 600;
681
- margin-bottom: 0.75rem;
682
- color: var(--ink);
683
- }
684
-
685
- .badge {
686
- display: inline-block;
687
- background: rgba(29, 42, 43, 0.08);
688
- color: var(--muted);
689
- padding: 0.1em 0.5em;
690
- border-radius: 999px;
691
- font-size: 0.75rem;
692
- font-weight: 500;
693
- margin-left: 0.5rem;
694
- }
695
-
696
- /* Category bar chart */
697
- .category-bars {
698
- display: flex;
699
- flex-direction: column;
700
- gap: 0.5rem;
701
- }
702
-
703
- .bar-row {
704
- display: grid;
705
- grid-template-columns: 5.5rem 1fr 2.5rem;
706
- align-items: center;
707
- gap: 0.5rem;
708
- }
709
-
710
- .bar-label {
711
- font-size: 0.8rem;
712
- color: var(--muted);
713
- text-align: right;
714
- }
715
-
716
- .bar-track {
717
- height: 1.25rem;
718
- background: rgba(29, 42, 43, 0.06);
719
- border-radius: 0.25rem;
720
- overflow: hidden;
721
- }
722
-
723
- .bar-fill {
724
- height: 100%;
725
- border-radius: 0.25rem;
726
- transition: width 0.4s ease;
727
- }
728
-
729
- .bar-count {
730
- font-size: 0.8rem;
731
- color: var(--muted);
732
- font-variant-numeric: tabular-nums;
733
- }
734
-
735
- /* Lint summary */
736
- .lint-summary {
737
- display: flex;
738
- flex-direction: column;
739
- gap: 0.5rem;
740
- }
741
-
742
- .lint-ok {
743
- color: var(--accent);
744
- font-size: 0.85rem;
745
- }
746
-
747
- .lint-issue {
748
- font-size: 0.85rem;
749
- padding: 0.35rem 0;
750
- border-bottom: 1px solid var(--line);
751
- }
752
-
753
- .lint-issue:last-child {
754
- border-bottom: none;
755
- }
756
-
757
- /* Stale list */
758
- .stale-list {
759
- max-height: 300px;
760
- overflow-y: auto;
761
- }
762
-
763
- .stale-item {
764
- font-size: 0.8rem;
765
- color: var(--muted);
766
- padding: 0.35rem 0;
767
- border-bottom: 1px solid var(--line);
768
- }
769
-
770
- .stale-item:last-child {
771
- border-bottom: none;
772
- }
773
-
774
- @media (max-width: 768px) {
775
- .dash-stats-row {
776
- grid-template-columns: repeat(2, 1fr);
777
- }
778
- .dash-grid {
779
- grid-template-columns: 1fr;
780
- }
781
- }