recallnest 2.2.1 → 2.5.4

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 (227) hide show
  1. package/CHANGELOG.md +150 -0
  2. package/README.md +46 -35
  3. package/README_CN.md +41 -26
  4. package/assets/ui/app.js +1031 -0
  5. package/assets/ui/index.html +224 -0
  6. package/assets/ui/styles.css +781 -0
  7. package/config.json.example +4 -1
  8. package/connectors/examples/email-adapter.ts +73 -0
  9. package/connectors/examples/logs-adapter.ts +103 -0
  10. package/connectors/examples/rss-adapter.ts +95 -0
  11. package/docs/api-reference.md +1291 -0
  12. package/docs/architecture.md +168 -0
  13. package/docs/connector-spec.md +126 -0
  14. package/eval/cases-canary.json +58 -0
  15. package/eval/cases-scope-robustness.json +278 -0
  16. package/eval/cases.json +117 -20
  17. package/package.json +22 -1
  18. package/src/__tests__/access-tracker-novelty.test.ts +238 -0
  19. package/src/__tests__/activity-counter.test.ts +125 -0
  20. package/src/__tests__/adaptive-fidelity.test.ts +102 -0
  21. package/src/__tests__/admission-control.test.ts +206 -0
  22. package/src/__tests__/anchor-generator.test.ts +67 -0
  23. package/src/__tests__/auto-consolidation.test.ts +168 -0
  24. package/src/__tests__/auto-recall.test.ts +131 -0
  25. package/src/__tests__/babel-integration.test.ts +144 -0
  26. package/src/__tests__/batch-dedup.test.ts +65 -0
  27. package/src/__tests__/canary-eval.test.ts +114 -0
  28. package/src/__tests__/capture-engine.test.ts +1238 -0
  29. package/src/__tests__/capture-heuristic.test.ts +171 -0
  30. package/src/__tests__/cascade-forget.test.ts +210 -0
  31. package/src/__tests__/category-min-scores.test.ts +33 -0
  32. package/src/__tests__/cc8-cc1-essential-context.test.ts +298 -0
  33. package/src/__tests__/circuit-breaker.test.ts +99 -0
  34. package/src/__tests__/cluster-consolidation.test.ts +782 -0
  35. package/src/__tests__/confidence-metadata.test.ts +125 -0
  36. package/src/__tests__/confidence-tracker.test.ts +261 -0
  37. package/src/__tests__/conflict-advisor.test.ts +206 -0
  38. package/src/__tests__/conflict-escalation.test.ts +149 -0
  39. package/src/__tests__/conflict-lifecycle.test.ts +83 -0
  40. package/src/__tests__/conflict-output.test.ts +85 -0
  41. package/src/__tests__/conflict-store.test.ts +374 -0
  42. package/src/__tests__/connector-v1.test.ts +181 -0
  43. package/src/__tests__/consolidation-engine.test.ts +333 -0
  44. package/src/__tests__/constructive-retrieval.test.ts +509 -0
  45. package/src/__tests__/context-collapse-renderer.test.ts +214 -0
  46. package/src/__tests__/context-composer-pins.test.ts +64 -0
  47. package/src/__tests__/context-composer-task-selection.test.ts +24 -0
  48. package/src/__tests__/context-reconstructor.test.ts +65 -0
  49. package/src/__tests__/context-renderer.test.ts +91 -0
  50. package/src/__tests__/continuity-eval.test.ts +275 -0
  51. package/src/__tests__/continuity-schema.test.ts +97 -0
  52. package/src/__tests__/contracts.test.ts +216 -0
  53. package/src/__tests__/conversation-importer.test.ts +692 -0
  54. package/src/__tests__/core-recall-eval.test.ts +235 -0
  55. package/src/__tests__/core-summary.test.ts +109 -0
  56. package/src/__tests__/data-checkup.test.ts +276 -0
  57. package/src/__tests__/decay-exemption.test.ts +84 -0
  58. package/src/__tests__/dedup-actions.test.ts +58 -0
  59. package/src/__tests__/dedup-guard.test.ts +39 -0
  60. package/src/__tests__/deterministic-id.test.ts +39 -0
  61. package/src/__tests__/distill-lock.test.ts +305 -0
  62. package/src/__tests__/distill-session-argshape.test.ts +79 -0
  63. package/src/__tests__/doctor.test.ts +319 -0
  64. package/src/__tests__/dream-pipeline.test.ts +321 -0
  65. package/src/__tests__/drill-down.test.ts +108 -0
  66. package/src/__tests__/embedder.test.ts +122 -0
  67. package/src/__tests__/emotion-decay.test.ts +46 -0
  68. package/src/__tests__/emotion-detector.test.ts +56 -0
  69. package/src/__tests__/emotion-phase1-integration.test.ts +153 -0
  70. package/src/__tests__/emotion-retrieval.test.ts +56 -0
  71. package/src/__tests__/entity-resolver.test.ts +58 -0
  72. package/src/__tests__/env-config.test.ts +151 -0
  73. package/src/__tests__/error-signature-boost.test.ts +87 -0
  74. package/src/__tests__/error-signature.test.ts +95 -0
  75. package/src/__tests__/error-taxonomy.test.ts +129 -0
  76. package/src/__tests__/ethics-layer.test.ts +476 -0
  77. package/src/__tests__/event-segmenter.test.ts +153 -0
  78. package/src/__tests__/feature-flags-integration.test.ts +54 -0
  79. package/src/__tests__/frequency-tracker.test.ts +113 -0
  80. package/src/__tests__/graph-export.test.ts +489 -0
  81. package/src/__tests__/hotness-blend.test.ts +76 -0
  82. package/src/__tests__/ingest-chunking.test.ts +44 -0
  83. package/src/__tests__/ingest.test.ts +360 -0
  84. package/src/__tests__/interference-detector.test.ts +203 -0
  85. package/src/__tests__/kg-extractor.test.ts +192 -0
  86. package/src/__tests__/kg-store.test.ts +300 -0
  87. package/src/__tests__/llm-consolidation.test.ts +226 -0
  88. package/src/__tests__/maintenance-locks.test.ts +174 -0
  89. package/src/__tests__/mcp-efficiency.test.ts +288 -0
  90. package/src/__tests__/mcp-related-scopes.test.ts +151 -0
  91. package/src/__tests__/memory-boundaries.test.ts +250 -0
  92. package/src/__tests__/memory-evolution-b2-b3-e1.test.ts +345 -0
  93. package/src/__tests__/memory-evolution.test.ts +271 -0
  94. package/src/__tests__/memory-health-rebalance.test.ts +144 -0
  95. package/src/__tests__/memory-lint.test.ts +421 -0
  96. package/src/__tests__/memory-output.test.ts +215 -0
  97. package/src/__tests__/memory-promotion.test.ts +315 -0
  98. package/src/__tests__/migrate-dedup-ids.test.ts +65 -0
  99. package/src/__tests__/multi-vector.test.ts +242 -0
  100. package/src/__tests__/narrative-architecture.test.ts +456 -0
  101. package/src/__tests__/noise-filter.test.ts +205 -0
  102. package/src/__tests__/obsidian-connector.test.ts +363 -0
  103. package/src/__tests__/omitted-reporting.test.ts +98 -0
  104. package/src/__tests__/pending-review.test.ts +77 -0
  105. package/src/__tests__/pii-redact.test.ts +314 -0
  106. package/src/__tests__/post-retrieval-filter.test.ts +178 -0
  107. package/src/__tests__/ppr-traversal.test.ts +256 -0
  108. package/src/__tests__/prediction-engine.test.ts +349 -0
  109. package/src/__tests__/predictive-prospective-memory.test.ts +416 -0
  110. package/src/__tests__/preference-guard-smoke.test.ts +211 -0
  111. package/src/__tests__/preference-matcher.test.ts +230 -0
  112. package/src/__tests__/preference-slots.test.ts +205 -0
  113. package/src/__tests__/prospective-memory.test.ts +283 -0
  114. package/src/__tests__/query-entity-detector.test.ts +171 -0
  115. package/src/__tests__/query-expander-alias.test.ts +146 -0
  116. package/src/__tests__/query-expander.test.ts +34 -0
  117. package/src/__tests__/recall-governor.test.ts +227 -0
  118. package/src/__tests__/recall-mode.test.ts +64 -0
  119. package/src/__tests__/result-synthesizer.test.ts +198 -0
  120. package/src/__tests__/resume-context.test.ts +4898 -0
  121. package/src/__tests__/retrieval-trace.test.ts +213 -0
  122. package/src/__tests__/retriever-boundary-weight.test.ts +136 -0
  123. package/src/__tests__/retroactive-boost.test.ts +223 -0
  124. package/src/__tests__/salience-scoring.test.ts +106 -0
  125. package/src/__tests__/scope-inventory.test.ts +200 -0
  126. package/src/__tests__/scope-policy.test.ts +69 -0
  127. package/src/__tests__/scope-suggester.test.ts +80 -0
  128. package/src/__tests__/session-checkpoint.test.ts +291 -0
  129. package/src/__tests__/session-distiller.test.ts +640 -0
  130. package/src/__tests__/session-gc.test.ts +215 -0
  131. package/src/__tests__/skill-engine.test.ts +552 -0
  132. package/src/__tests__/skill-promotion.test.ts +601 -0
  133. package/src/__tests__/skill-verifier.test.ts +122 -0
  134. package/src/__tests__/source-heartbeat.test.ts +250 -0
  135. package/src/__tests__/store-patch-metadata.test.ts +205 -0
  136. package/src/__tests__/store-scope-audit.test.ts +81 -0
  137. package/src/__tests__/store-upsert.test.ts +184 -0
  138. package/src/__tests__/supersede-chain.test.ts +154 -0
  139. package/src/__tests__/temporal-parser.test.ts +241 -0
  140. package/src/__tests__/temporal-validity.test.ts +160 -0
  141. package/src/__tests__/term-registry.test.ts +121 -0
  142. package/src/__tests__/tool-error-surfacing.test.ts +98 -0
  143. package/src/__tests__/tool-output-compressor.test.ts +160 -0
  144. package/src/__tests__/topic-tag.test.ts +113 -0
  145. package/src/__tests__/trusted-memory.test.ts +839 -0
  146. package/src/__tests__/usage-tracker.test.ts +287 -0
  147. package/src/__tests__/version-manager.test.ts +213 -0
  148. package/src/__tests__/workflow-observation-skill-outcome.test.ts +352 -0
  149. package/src/__tests__/workflow-observation.test.ts +433 -0
  150. package/src/__tests__/write-verifier.test.ts +122 -0
  151. package/src/access-tracker.ts +38 -32
  152. package/src/activity-counter.ts +46 -18
  153. package/src/aliases.ts +133 -0
  154. package/src/api-server.ts +27 -7
  155. package/src/audit-log.ts +4 -2
  156. package/src/auto-consolidation.ts +8 -3
  157. package/src/auto-gc.ts +85 -21
  158. package/src/capture-engine.ts +54 -21
  159. package/src/cli.ts +199 -37
  160. package/src/confidence-tracker.ts +36 -18
  161. package/src/connector-types.ts +57 -0
  162. package/src/consolidation-engine.ts +109 -11
  163. package/src/context-composer.ts +8 -1
  164. package/src/conversation-importer.ts +25 -1
  165. package/src/data-checkup.ts +126 -7
  166. package/src/distill-lock.ts +194 -15
  167. package/src/doctor.ts +38 -2
  168. package/src/dream-pipeline.ts +118 -34
  169. package/src/env-config.ts +77 -0
  170. package/src/error-signature.ts +153 -0
  171. package/src/error-taxonomy.ts +115 -0
  172. package/src/eval.ts +251 -6
  173. package/src/idempotency.ts +8 -0
  174. package/src/ingest.ts +234 -10
  175. package/src/kg-extractor.ts +6 -2
  176. package/src/kg-store.ts +236 -44
  177. package/src/llm-consolidation.ts +2 -1
  178. package/src/mcp-server.ts +85 -1799
  179. package/src/mcp-tool-deps.ts +48 -0
  180. package/src/mcp-tools-advanced.ts +941 -0
  181. package/src/mcp-tools-core.ts +633 -0
  182. package/src/mcp-tools-governance.ts +475 -0
  183. package/src/memory-boundaries.ts +3 -1
  184. package/src/memory-evolution.ts +73 -1
  185. package/src/memory-lint.ts +183 -10
  186. package/src/memory-output.ts +114 -3
  187. package/src/memory-promotion.ts +246 -0
  188. package/src/memory-schema.ts +25 -2
  189. package/src/memory-store-port.ts +43 -0
  190. package/src/multi-vector.ts +2 -1
  191. package/src/narrative-schema.ts +2 -1
  192. package/src/noise-filter.ts +57 -6
  193. package/src/obsidian-connector.ts +282 -0
  194. package/src/pii-detector.ts +157 -5
  195. package/src/query-expander.ts +90 -9
  196. package/src/result-synthesizer.ts +2 -1
  197. package/src/retention-policy.ts +2 -1
  198. package/src/retriever.ts +259 -139
  199. package/src/runtime-config.ts +8 -1
  200. package/src/scope-suggester.ts +113 -0
  201. package/src/session-distiller.ts +23 -2
  202. package/src/session-engine.ts +2 -1
  203. package/src/session-schema.ts +3 -2
  204. package/src/session-store.ts +5 -0
  205. package/src/skill-engine.ts +78 -0
  206. package/src/skill-promotion.ts +247 -47
  207. package/src/skill-schema.ts +16 -3
  208. package/src/skill-verifier.ts +152 -0
  209. package/src/source-heartbeat.ts +108 -0
  210. package/src/store.ts +267 -38
  211. package/src/tool-output-compressor.ts +3 -1
  212. package/src/ui-server.ts +2 -1
  213. package/src/usage-tracker.ts +242 -0
  214. package/src/version-manager.ts +3 -2
  215. package/src/workflow-observation-engine.ts +2 -1
  216. package/src/workflow-observation-schema.ts +2 -1
  217. package/src/workflow-observation-store.ts +6 -2
  218. package/.env +0 -4
  219. package/CLAUDE.md +0 -46
  220. package/config.json +0 -55
  221. package/daily-recall.sh +0 -110
  222. package/logs/daily-recall.error.log +0 -0
  223. package/logs/daily-recall.log +0 -30
  224. package/logs/ingest-2026-04-11.log +0 -110
  225. package/logs/ingest-2026-04-12.log +0 -90
  226. package/logs/launchagent-stderr.log +0 -0
  227. package/logs/launchagent-stdout.log +0 -0
@@ -0,0 +1,781 @@
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
+ }