fraim-hub 2.0.204

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 (120) hide show
  1. package/README.md +467 -0
  2. package/bin/fraim-hub.js +17 -0
  3. package/dist/src/ai-hub/brand-store.js +17 -0
  4. package/dist/src/ai-hub/catalog.js +412 -0
  5. package/dist/src/ai-hub/cert-store.js +70 -0
  6. package/dist/src/ai-hub/cli.js +212 -0
  7. package/dist/src/ai-hub/configured-agents.js +283 -0
  8. package/dist/src/ai-hub/conversation-store.js +428 -0
  9. package/dist/src/ai-hub/desktop-main.js +449 -0
  10. package/dist/src/ai-hub/hosts.js +1669 -0
  11. package/dist/src/ai-hub/hub-latest-version.js +52 -0
  12. package/dist/src/ai-hub/hub-launch-decision.js +57 -0
  13. package/dist/src/ai-hub/hub-runtime-file.js +43 -0
  14. package/dist/src/ai-hub/managed-browser.js +269 -0
  15. package/dist/src/ai-hub/manager-turns.js +64 -0
  16. package/dist/src/ai-hub/office-sideload.js +156 -0
  17. package/dist/src/ai-hub/openclaw-bridge.js +250 -0
  18. package/dist/src/ai-hub/preferences.js +201 -0
  19. package/dist/src/ai-hub/remote-hub-gateway.js +88 -0
  20. package/dist/src/ai-hub/server.js +4013 -0
  21. package/dist/src/ai-hub/types.js +2 -0
  22. package/dist/src/ai-hub/url-safety.js +19 -0
  23. package/dist/src/api/admin/payments.js +33 -0
  24. package/dist/src/api/admin/sales-leads.js +21 -0
  25. package/dist/src/api/payment/create-session.js +338 -0
  26. package/dist/src/api/payment/dashboard-link.js +149 -0
  27. package/dist/src/api/payment/session-details.js +31 -0
  28. package/dist/src/api/payment/webhook.js +587 -0
  29. package/dist/src/api/sales/contact.js +44 -0
  30. package/dist/src/cli/api/get-provider-client.js +41 -0
  31. package/dist/src/cli/api/provider-client.js +107 -0
  32. package/dist/src/cli/commands/add-ide.js +462 -0
  33. package/dist/src/cli/fraim-hub.js +50 -0
  34. package/dist/src/cli/internal/device-flow-service.js +83 -0
  35. package/dist/src/cli/mcp/command-resolution.js +81 -0
  36. package/dist/src/cli/mcp/fraim-mcp-latest-launcher.js +136 -0
  37. package/dist/src/cli/mcp/ide-formats.js +317 -0
  38. package/dist/src/cli/mcp/mcp-server-builder.js +48 -0
  39. package/dist/src/cli/mcp/mcp-server-registry.js +173 -0
  40. package/dist/src/cli/providers/local-provider-registry.js +165 -0
  41. package/dist/src/cli/providers/provider-registry.js +230 -0
  42. package/dist/src/cli/setup/claude-code-telemetry.js +59 -0
  43. package/dist/src/cli/setup/codex-local-config.js +37 -0
  44. package/dist/src/cli/setup/ide-detector.js +383 -0
  45. package/dist/src/cli/setup/ide-global-integration.js +100 -0
  46. package/dist/src/cli/setup/ide-invocation-surfaces.js +160 -0
  47. package/dist/src/cli/setup/mcp-config-generator.js +225 -0
  48. package/dist/src/cli/setup/provider-prompts.js +339 -0
  49. package/dist/src/cli/utils/managed-agent-paths.js +118 -0
  50. package/dist/src/cli/utils/script-sync-utils.js +221 -0
  51. package/dist/src/cli/utils/user-config.js +100 -0
  52. package/dist/src/cli/utils/version-utils.js +35 -0
  53. package/dist/src/config/ai-manager-hiring.js +121 -0
  54. package/dist/src/config/feature-flags.js +25 -0
  55. package/dist/src/config/persona-capability-bundles.js +277 -0
  56. package/dist/src/config/persona-hiring.js +270 -0
  57. package/dist/src/config/portfolio-slug-overrides.js +17 -0
  58. package/dist/src/config/pricing.js +37 -0
  59. package/dist/src/config/stripe.js +43 -0
  60. package/dist/src/core/brand-store.js +232 -0
  61. package/dist/src/core/quality-evidence.js +331 -0
  62. package/dist/src/core/utils/git-utils.js +194 -0
  63. package/dist/src/core/utils/ports.js +32 -0
  64. package/dist/src/core/utils/project-fraim-paths.js +220 -0
  65. package/dist/src/db/payment-repository.js +61 -0
  66. package/dist/src/first-run/types.js +93 -0
  67. package/dist/src/fraim/db-service.js +2409 -0
  68. package/dist/src/local-mcp-server/agent-token-prices.js +167 -0
  69. package/dist/src/local-mcp-server/learning-context-builder.js +975 -0
  70. package/dist/src/middleware/rate-limit.js +110 -0
  71. package/dist/src/models/payment.js +2 -0
  72. package/dist/src/routes/payment-routes.js +186 -0
  73. package/dist/src/routes/persona-catalog-routes.js +84 -0
  74. package/dist/src/services/dashboard-access.js +27 -0
  75. package/dist/src/services/email-service.js +951 -0
  76. package/dist/src/services/persona-entitlement-service.js +352 -0
  77. package/dist/src/services/workspace-identity.js +21 -0
  78. package/dist/src/types/analytics.js +2 -0
  79. package/dist/src/utils/payment-calculator.js +52 -0
  80. package/extensions/office-word/favicon.ico +0 -0
  81. package/extensions/office-word/icon-64.png +0 -0
  82. package/extensions/office-word/manifest.xml +33 -0
  83. package/extensions/office-word/taskpane.html +242 -0
  84. package/index.js +85 -0
  85. package/package.json +106 -0
  86. package/public/ai-hub/index.html +910 -0
  87. package/public/ai-hub/powerpoint-taskpane/icon-64.png +0 -0
  88. package/public/ai-hub/powerpoint-taskpane/index.html +236 -0
  89. package/public/ai-hub/powerpoint-taskpane/manifest.xml +30 -0
  90. package/public/ai-hub/review.css +444 -0
  91. package/public/ai-hub/script.js +11737 -0
  92. package/public/ai-hub/styles.css +5102 -0
  93. package/public/first-run/error-frame.js +100 -0
  94. package/public/first-run/index.html +35 -0
  95. package/public/first-run/script.js +739 -0
  96. package/public/first-run/styles.css +929 -0
  97. package/public/portfolio/ashley.html +523 -0
  98. package/public/portfolio/auditya.html +83 -0
  99. package/public/portfolio/banke.html +83 -0
  100. package/public/portfolio/beza.html +659 -0
  101. package/public/portfolio/careena.html +632 -0
  102. package/public/portfolio/casey.html +568 -0
  103. package/public/portfolio/celia.html +490 -0
  104. package/public/portfolio/deidre.html +642 -0
  105. package/public/portfolio/gautam.html +597 -0
  106. package/public/portfolio/hari.html +469 -0
  107. package/public/portfolio/huxley.html +1354 -0
  108. package/public/portfolio/index.html +741 -0
  109. package/public/portfolio/maestro.html +518 -0
  110. package/public/portfolio/mandy.html +590 -0
  111. package/public/portfolio/mona.html +597 -0
  112. package/public/portfolio/pam.html +887 -0
  113. package/public/portfolio/procella.html +107 -0
  114. package/public/portfolio/qasm.html +569 -0
  115. package/public/portfolio/ricardo.html +489 -0
  116. package/public/portfolio/sade.html +560 -0
  117. package/public/portfolio/sam.html +654 -0
  118. package/public/portfolio/sechar.html +580 -0
  119. package/public/portfolio/sreya.html +599 -0
  120. package/public/portfolio/swen.html +601 -0
@@ -0,0 +1,444 @@
1
+ /* ===========================================================================
2
+ Issue #512 S6 — Review experience (R7), Learnings over sleep-on-learnings
3
+ (R9), and Reverse mentoring (R10). Additive stylesheet linked after
4
+ styles.css so it can build on the existing Hub token system without
5
+ touching the shipped rules. Tokens: --accent, --accent-strong,
6
+ --accent-soft, --muted, --line, --surface, --text, --done, --warn,
7
+ --danger.
8
+ =========================================================================== */
9
+
10
+ /* ── R7: completion card + format-derived artifact strip (in the thread) ── */
11
+ .review-completion {
12
+ margin: 2px 18px 10px;
13
+ display: flex;
14
+ flex-direction: column;
15
+ gap: 8px;
16
+ }
17
+ .review-card {
18
+ /* #700: token-driven so the card follows light/dark. Was a hardcoded
19
+ near-white that made var(--text) unreadable in dark mode. */
20
+ background: var(--surface);
21
+ border: 1px solid var(--line);
22
+ border-radius: 10px;
23
+ padding: 10px 14px;
24
+ display: flex;
25
+ flex-direction: column;
26
+ gap: 6px;
27
+ box-shadow: 0 4px 12px rgba(35, 30, 23, 0.05);
28
+ }
29
+ .review-card .rc-heading {
30
+ font-size: 15px;
31
+ font-weight: 700;
32
+ color: var(--text);
33
+ }
34
+ .review-card .rc-row {
35
+ display: grid;
36
+ grid-template-columns: 110px minmax(0, 1fr);
37
+ gap: 10px;
38
+ align-items: baseline;
39
+ }
40
+ .review-card .rc-k {
41
+ font-size: 11px;
42
+ font-weight: 700;
43
+ text-transform: uppercase;
44
+ letter-spacing: 0.06em;
45
+ color: var(--muted);
46
+ }
47
+ .review-card .rc-v {
48
+ font-size: 13px;
49
+ color: var(--text);
50
+ line-height: 1.35;
51
+ }
52
+ .rc-artifact-strip {
53
+ display: flex;
54
+ flex-wrap: wrap;
55
+ gap: 8px;
56
+ }
57
+ .rc-art-btn {
58
+ background: var(--accent);
59
+ color: #fff;
60
+ border: none;
61
+ border-radius: 8px;
62
+ padding: 7px 12px;
63
+ font-size: 13px;
64
+ font-weight: 600;
65
+ }
66
+ .rc-art-btn:hover { background: var(--accent-strong); }
67
+ .rc-art-btn.ghost {
68
+ background: transparent;
69
+ color: var(--text);
70
+ border: 1px solid var(--line);
71
+ font-weight: 500;
72
+ }
73
+ .rc-art-btn.ghost:hover { background: var(--soft); }
74
+
75
+ /* ── Issue #566: success-confirmed growth offer + teach action ──────────────
76
+ Reuses the .review-card surface with the personalization "teach" accent
77
+ (defined in styles.css :root) so the offer reads as the employee proposing
78
+ to grow, distinct from a plain review card. */
79
+ .review-card--offer .rc-heading { color: var(--teach); }
80
+ .review-card--growth .rc-heading { color: var(--teach); }
81
+ .rc-art-btn--teach {
82
+ background: var(--teach-soft);
83
+ color: var(--teach);
84
+ border: 1px solid var(--teach-line);
85
+ }
86
+ .rc-art-btn--teach:hover { background: #ece3ff; }
87
+
88
+ /* ── R7.7: unified action bar — review actions sit beside the always-on
89
+ coaching chips inside the coach panel. The chips/input never disappear. ── */
90
+ .review-actions {
91
+ display: flex;
92
+ flex-wrap: wrap;
93
+ align-items: center;
94
+ gap: 8px;
95
+ margin-bottom: 8px;
96
+ padding-bottom: 8px;
97
+ border-bottom: 1px dashed var(--line);
98
+ }
99
+ .review-actions .rb-approve {
100
+ background: var(--done, #2e7d32);
101
+ color: #fff;
102
+ border: none;
103
+ border-radius: 8px;
104
+ padding: 7px 14px;
105
+ font-size: 13px;
106
+ font-weight: 700;
107
+ max-width: min(100%, 280px);
108
+ white-space: normal;
109
+ line-height: 1.2;
110
+ text-align: center;
111
+ }
112
+ .review-actions .rb-approve:hover { filter: brightness(0.94); }
113
+ .review-actions .rb-approve:disabled,
114
+ .review-actions .rb-approve.managed-disabled {
115
+ background: var(--soft, #e8e8e8);
116
+ color: var(--muted, #888);
117
+ filter: none;
118
+ }
119
+ .review-approve-combo {
120
+ position: relative;
121
+ display: inline-flex;
122
+ align-items: stretch;
123
+ max-width: min(100%, 360px);
124
+ }
125
+ .review-approve-combo--menu #review-approve {
126
+ border-radius: 8px 0 0 8px;
127
+ }
128
+ .review-actions .rb-approve-toggle {
129
+ min-width: 34px;
130
+ max-width: 34px;
131
+ padding: 7px 8px;
132
+ border-left: 1px solid color-mix(in srgb, #fff 28%, transparent);
133
+ border-radius: 0 8px 8px 0;
134
+ }
135
+ .review-approve-menu {
136
+ position: absolute;
137
+ top: calc(100% + 4px);
138
+ left: 0;
139
+ z-index: 20;
140
+ min-width: min(260px, calc(100vw - 48px));
141
+ max-width: min(360px, calc(100vw - 48px));
142
+ padding: 6px;
143
+ background: var(--surface);
144
+ border: 1px solid var(--line);
145
+ border-radius: 8px;
146
+ box-shadow: 0 12px 28px rgba(35, 30, 23, 0.16);
147
+ }
148
+ .review-approve-menu[hidden] {
149
+ display: none;
150
+ }
151
+ .review-approve-menu-item {
152
+ display: block;
153
+ width: 100%;
154
+ border: 0;
155
+ border-radius: 6px;
156
+ background: transparent;
157
+ color: var(--text);
158
+ padding: 8px 10px;
159
+ font-size: 13px;
160
+ font-weight: 600;
161
+ line-height: 1.25;
162
+ text-align: left;
163
+ white-space: normal;
164
+ }
165
+ .review-approve-menu-item:hover,
166
+ .review-approve-menu-item:focus {
167
+ background: var(--soft);
168
+ outline: none;
169
+ }
170
+ .review-actions .rb-secondary {
171
+ background: var(--warn, #f57c00);
172
+ border: none;
173
+ border-radius: 8px;
174
+ padding: 7px 12px;
175
+ font-size: 13px;
176
+ font-weight: 600;
177
+ color: #fff;
178
+ max-width: min(100%, 280px);
179
+ white-space: normal;
180
+ line-height: 1.2;
181
+ text-align: center;
182
+ }
183
+ .review-actions .rb-secondary:hover { filter: brightness(0.94); }
184
+ .review-actions .rb-secondary:disabled,
185
+ .review-actions .rb-secondary.managed-disabled {
186
+ background: var(--soft, #e8e8e8);
187
+ color: var(--muted, #888);
188
+ filter: none;
189
+ }
190
+ .review-actions .rb-handoff {
191
+ font-size: 12px;
192
+ color: var(--muted);
193
+ flex: 1 1 220px;
194
+ min-width: 0;
195
+ }
196
+
197
+ /* ── R9: Learnings surface (Share learnings + Bless/Skip proposals) ── */
198
+ .learn-head-row {
199
+ display: flex;
200
+ align-items: flex-start;
201
+ justify-content: space-between;
202
+ gap: 12px;
203
+ margin-bottom: 12px;
204
+ }
205
+ .learn-head-row .lh-title {
206
+ font-size: 16px;
207
+ font-weight: 700;
208
+ color: var(--text);
209
+ }
210
+ .learn-head-row .lh-sub {
211
+ font-size: 13px;
212
+ color: var(--muted);
213
+ margin-top: 2px;
214
+ }
215
+ .lh-run {
216
+ flex-shrink: 0;
217
+ background: var(--accent);
218
+ color: #fff;
219
+ border: none;
220
+ border-radius: 12px;
221
+ padding: 9px 16px;
222
+ font-size: 13px;
223
+ font-weight: 600;
224
+ box-shadow: var(--shadow);
225
+ }
226
+ .lh-run:hover { background: var(--accent-strong); }
227
+
228
+ .learn-list {
229
+ display: flex;
230
+ flex-direction: column;
231
+ gap: 12px;
232
+ }
233
+ .learn-prop {
234
+ background: var(--surface);
235
+ border: 1px solid var(--line);
236
+ border-radius: 16px;
237
+ padding: 14px 16px;
238
+ display: flex;
239
+ flex-direction: column;
240
+ gap: 8px;
241
+ transition: opacity 160ms ease;
242
+ }
243
+ .learn-prop.resolved { opacity: 0.45; }
244
+ .learn-prop .lp-head {
245
+ display: flex;
246
+ align-items: center;
247
+ gap: 10px;
248
+ }
249
+ .learn-prop .lp-scope {
250
+ font-size: 10px;
251
+ font-weight: 700;
252
+ padding: 2px 8px;
253
+ border-radius: 6px;
254
+ text-transform: uppercase;
255
+ letter-spacing: 0.04em;
256
+ flex-shrink: 0;
257
+ }
258
+ .learn-prop .lp-scope.scope-org { background: var(--accent-soft); color: var(--accent-strong); }
259
+ .learn-prop .lp-scope.scope-mgr { background: #ede5ff; color: #6b4c92; }
260
+ .learn-prop .lp-scope.scope-proj { background: #e3f0e8; color: #2e7d4f; }
261
+ .learn-prop .lp-title {
262
+ font-size: 14px;
263
+ font-weight: 600;
264
+ color: var(--text);
265
+ }
266
+ .learn-prop .lp-body {
267
+ font-size: 13px;
268
+ color: var(--text);
269
+ line-height: 1.5;
270
+ }
271
+ .learn-prop .lp-example {
272
+ font-size: 13px;
273
+ color: var(--muted);
274
+ font-style: italic;
275
+ border-left: 3px solid var(--line);
276
+ padding-left: 10px;
277
+ }
278
+ .learn-prop .lp-actions {
279
+ display: flex;
280
+ align-items: center;
281
+ gap: 8px;
282
+ flex-wrap: wrap;
283
+ margin-top: 2px;
284
+ }
285
+
286
+ /* #533 #3: per-card edit/delete + per-section add + inline editor. */
287
+ .learn-prop .lp-head .lp-title { flex: 1; min-width: 0; }
288
+ .learn-prop .lp-act {
289
+ width: 24px; height: 24px; border-radius: 6px; border: 1px solid var(--line);
290
+ background: var(--surface); color: var(--muted); font-size: 12px; line-height: 1;
291
+ display: none; align-items: center; justify-content: center; cursor: pointer; flex-shrink: 0;
292
+ }
293
+ .learn-prop:hover .lp-act, .learn-prop:focus-within .lp-act { display: inline-flex; }
294
+ .learn-prop .lp-act:hover { color: var(--accent); border-color: var(--accent); }
295
+ .learn-prop .lp-act-del:hover { color: var(--danger, #d2261f); border-color: var(--danger, #d2261f); }
296
+ .learn-prop .lp-edit { display: flex; flex-direction: column; gap: 8px; }
297
+ .learn-prop .lp-edit-row { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
298
+ .learn-prop .lp-edit-cat, .learn-prop .lp-edit-prio {
299
+ font: inherit; font-size: 12px; padding: 6px 8px; border: 1px solid var(--line);
300
+ border-radius: 8px; background: var(--surface); color: var(--text);
301
+ }
302
+ .learn-prop .lp-edit-title {
303
+ flex: 1; min-width: 140px; font: inherit; font-size: 13px; padding: 7px 10px;
304
+ border: 1px solid var(--line); border-radius: 8px; background: var(--surface); color: var(--text);
305
+ }
306
+ .learn-prop .lp-edit-body {
307
+ width: 100%; min-height: 90px; box-sizing: border-box; resize: vertical; font: inherit;
308
+ font-size: 13px; line-height: 1.5; padding: 8px 10px; border: 1px solid var(--line);
309
+ border-radius: 8px; background: var(--surface); color: var(--text);
310
+ }
311
+ .learn-prop .lp-edit-title:focus, .learn-prop .lp-edit-body:focus { outline: none; border-color: var(--accent); }
312
+ .learn-prop .lp-edit-bar { display: flex; align-items: center; gap: 10px; }
313
+ .learn-prop .lp-confirm { font-size: 12px; color: var(--text); margin-top: 8px; display: flex; flex-direction: column; gap: 8px; }
314
+ .lp-add-btn {
315
+ align-self: flex-start; margin-top: 10px; font-size: 12px; font-weight: 600; color: var(--accent);
316
+ background: var(--surface); border: 1px solid var(--line); border-radius: 9px; padding: 7px 14px; cursor: pointer;
317
+ }
318
+ .lp-add-btn:hover { background: var(--accent-soft); border-color: var(--accent); }
319
+ .learn-prop .lp-bless {
320
+ background: var(--done, #2e7d32);
321
+ color: #fff;
322
+ border: none;
323
+ border-radius: 9px;
324
+ padding: 6px 14px;
325
+ font-size: 12px;
326
+ font-weight: 700;
327
+ }
328
+ .learn-prop .lp-skip {
329
+ background: transparent;
330
+ border: 1px solid var(--line);
331
+ color: var(--text);
332
+ border-radius: 9px;
333
+ padding: 6px 14px;
334
+ font-size: 12px;
335
+ font-weight: 600;
336
+ }
337
+ .learn-prop .lp-bless:disabled,
338
+ .learn-prop .lp-skip:disabled { cursor: default; opacity: 0.7; }
339
+ .learn-prop .lp-scope-note {
340
+ font-size: 11px;
341
+ color: var(--muted);
342
+ }
343
+
344
+ /* #521 R7: promote-to-scope buttons on project candidates */
345
+ .learn-prop .lp-promote-label { font-size: 11px; font-weight: 600; color: var(--muted); }
346
+ .learn-prop .lp-promote {
347
+ border: 1px solid var(--line);
348
+ background: var(--surface);
349
+ color: var(--text);
350
+ border-radius: 9px;
351
+ padding: 6px 12px;
352
+ font-size: 12px;
353
+ font-weight: 600;
354
+ }
355
+ .learn-prop .lp-promote.scope-proj { border-color: rgba(46,125,50,.5); }
356
+ .learn-prop .lp-promote.scope-mgr { border-color: rgba(139,95,191,.5); }
357
+ .learn-prop .lp-promote.scope-org { border-color: rgba(0,113,227,.5); }
358
+ .learn-prop .lp-promote.done { background: var(--done, #2e7d32); color: #fff; border-color: transparent; }
359
+ .learn-prop .lp-promote:disabled { cursor: default; opacity: 0.7; }
360
+
361
+ /* ── R10: Reverse mentoring items (Got it / Dismiss) ── */
362
+ .rev-item {
363
+ background: var(--surface);
364
+ border: 1px solid var(--line);
365
+ border-radius: 16px;
366
+ padding: 14px 16px;
367
+ display: flex;
368
+ flex-direction: column;
369
+ gap: 8px;
370
+ transition: opacity 160ms ease;
371
+ }
372
+ .rev-item .rev-from {
373
+ display: flex;
374
+ align-items: center;
375
+ gap: 8px;
376
+ font-size: 13px;
377
+ font-weight: 600;
378
+ color: var(--text);
379
+ }
380
+ .rev-item .rev-av {
381
+ width: 24px;
382
+ height: 24px;
383
+ border-radius: 8px;
384
+ background: var(--accent-soft);
385
+ color: var(--accent-strong);
386
+ display: inline-flex;
387
+ align-items: center;
388
+ justify-content: center;
389
+ font-size: 10px;
390
+ font-weight: 700;
391
+ }
392
+ .rev-item .rev-msg {
393
+ font-size: 14px;
394
+ color: var(--text);
395
+ line-height: 1.5;
396
+ }
397
+ .rev-item .rev-actions {
398
+ display: flex;
399
+ gap: 8px;
400
+ }
401
+ .rev-item .rev-gotit {
402
+ background: var(--accent);
403
+ color: #fff;
404
+ border: none;
405
+ border-radius: 9px;
406
+ padding: 6px 14px;
407
+ font-size: 12px;
408
+ font-weight: 600;
409
+ }
410
+ .rev-item .rev-gotit:hover { background: var(--accent-strong); }
411
+ .rev-item .rev-dismiss {
412
+ background: transparent;
413
+ border: 1px solid var(--line);
414
+ color: var(--text);
415
+ border-radius: 9px;
416
+ padding: 6px 14px;
417
+ font-size: 12px;
418
+ font-weight: 500;
419
+ }
420
+ .rev-item .rev-dismiss:hover { background: var(--soft); }
421
+
422
+ /* ── #770: Deliverables panel body spacing for the relocated artifact strip. ── */
423
+ #deliverables-panel .panel-body { padding-top: 8px; }
424
+ #deliverables-panel .rc-artifact-strip { margin: 0; }
425
+
426
+ /* ── R9: project-scoped learnings panel (over the workspace conversation) ── */
427
+ .proj-learnings-panel {
428
+ position: absolute;
429
+ inset: 0;
430
+ background: var(--bg);
431
+ overflow-y: auto;
432
+ z-index: 5;
433
+ }
434
+ .proj-learnings-panel .pl-back {
435
+ background: transparent;
436
+ border: 1px solid var(--line);
437
+ border-radius: 10px;
438
+ padding: 7px 14px;
439
+ font-size: 13px;
440
+ font-weight: 600;
441
+ color: var(--text);
442
+ }
443
+ .proj-learnings-panel .pl-back:hover { background: var(--soft); }
444
+ .workspace-conv { position: relative; }