aimeat 1.23.2 → 1.23.3

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 (154) hide show
  1. package/dist/locales/en.json +536 -21
  2. package/dist/locales/fi.json +548 -33
  3. package/dist/public/components/ContactCard.js +28 -0
  4. package/dist/public/css/views/admin.css +12 -0
  5. package/dist/public/css/views/agents-detail.css +62 -10
  6. package/dist/public/css/views/landing.css +87 -0
  7. package/dist/public/css/views/offers.css +96 -0
  8. package/dist/public/css/views/portfolio.css +18 -0
  9. package/dist/public/css/views/profile.css +153 -8
  10. package/dist/public/css/views/start.css +96 -0
  11. package/dist/public/img/business-hero.png +0 -0
  12. package/dist/public/img/toimitus.png +0 -0
  13. package/dist/public/js/components/tag-cloud.js +46 -31
  14. package/dist/public/js/components/tag-editor.js +2 -2
  15. package/dist/public/js/recents.js +40 -0
  16. package/dist/public/js/services/admin.js +6 -0
  17. package/dist/public/js/services/agents.js +34 -0
  18. package/dist/public/js/services/offers.js +152 -0
  19. package/dist/public/js/services/packages.js +1 -0
  20. package/dist/public/spa.html +32 -2
  21. package/dist/public/views/admin/subdomains-tab.js +182 -0
  22. package/dist/public/views/admin.js +2 -0
  23. package/dist/public/views/business.js +119 -0
  24. package/dist/public/views/how-it-works.js +159 -0
  25. package/dist/public/views/landing.js +235 -0
  26. package/dist/public/views/portfolio.js +120 -23
  27. package/dist/public/views/pricing.js +75 -0
  28. package/dist/public/views/profile/access-tab.js +124 -51
  29. package/dist/public/views/profile/agents/agent-card.js +68 -37
  30. package/dist/public/views/profile/agents/shared-board.js +56 -22
  31. package/dist/public/views/profile/agents/tab-activity.js +24 -12
  32. package/dist/public/views/profile/agents/tab-agent-config.js +31 -1
  33. package/dist/public/views/profile/agents/tab-data-access.js +9 -13
  34. package/dist/public/views/profile/agents/tab-integration.js +27 -1
  35. package/dist/public/views/profile/agents/tab-messages.js +6 -11
  36. package/dist/public/views/profile/agents/tab-quality.js +45 -5
  37. package/dist/public/views/profile/agents-tab.js +41 -6
  38. package/dist/public/views/profile/apps-tab.js +7 -1
  39. package/dist/public/views/profile/knowledge-tab.js +4 -1
  40. package/dist/public/views/profile/landing-page.js +427 -123
  41. package/dist/public/views/profile/memory-tab.js +409 -211
  42. package/dist/public/views/profile/nodes-tab.js +18 -3
  43. package/dist/public/views/profile/offers-tab.js +310 -0
  44. package/dist/public/views/profile/organisms-tab.js +289 -28
  45. package/dist/public/views/profile/packages-tab.js +152 -16
  46. package/dist/public/views/profile/portfolio-tab.js +98 -31
  47. package/dist/public/views/profile.js +2 -0
  48. package/dist/public/views/start-flows.js +281 -0
  49. package/dist/public/views/start.js +258 -0
  50. package/dist/src/generated/api-types.d.ts +856 -17
  51. package/dist/src/generated/api-types.d.ts.map +1 -1
  52. package/dist/src/generated/prisma-postgres/edge.js +15 -3
  53. package/dist/src/generated/prisma-postgres/index-browser.js +12 -0
  54. package/dist/src/generated/prisma-postgres/index.d.ts +1476 -160
  55. package/dist/src/generated/prisma-postgres/index.js +15 -3
  56. package/dist/src/generated/prisma-postgres/package.json +1 -1
  57. package/dist/src/generated/prisma-postgres/schema.prisma +11 -0
  58. package/dist/src/generated/prisma-postgres/wasm.js +15 -3
  59. package/dist/src/middleware/subdomain.d.ts +28 -0
  60. package/dist/src/middleware/subdomain.d.ts.map +1 -0
  61. package/dist/src/middleware/subdomain.js +32 -0
  62. package/dist/src/middleware/subdomain.js.map +1 -0
  63. package/dist/src/models/offer-schemas.d.ts +229 -0
  64. package/dist/src/models/offer-schemas.d.ts.map +1 -0
  65. package/dist/src/models/offer-schemas.js +100 -0
  66. package/dist/src/models/offer-schemas.js.map +1 -0
  67. package/dist/src/routes/agent-tasks.d.ts.map +1 -1
  68. package/dist/src/routes/agent-tasks.js +33 -0
  69. package/dist/src/routes/agent-tasks.js.map +1 -1
  70. package/dist/src/routes/agents.d.ts.map +1 -1
  71. package/dist/src/routes/agents.js +146 -1
  72. package/dist/src/routes/agents.js.map +1 -1
  73. package/dist/src/routes/apps-backup.d.ts +20 -0
  74. package/dist/src/routes/apps-backup.d.ts.map +1 -0
  75. package/dist/src/routes/apps-backup.js +165 -0
  76. package/dist/src/routes/apps-backup.js.map +1 -0
  77. package/dist/src/routes/ghii.d.ts.map +1 -1
  78. package/dist/src/routes/ghii.js +4 -0
  79. package/dist/src/routes/ghii.js.map +1 -1
  80. package/dist/src/routes/instances.d.ts +2 -1
  81. package/dist/src/routes/instances.d.ts.map +1 -1
  82. package/dist/src/routes/instances.js +59 -1
  83. package/dist/src/routes/instances.js.map +1 -1
  84. package/dist/src/routes/packages.d.ts.map +1 -1
  85. package/dist/src/routes/packages.js +32 -0
  86. package/dist/src/routes/packages.js.map +1 -1
  87. package/dist/src/routes/permissions.d.ts +12 -0
  88. package/dist/src/routes/permissions.d.ts.map +1 -1
  89. package/dist/src/routes/permissions.js +35 -3
  90. package/dist/src/routes/permissions.js.map +1 -1
  91. package/dist/src/routes/portal.d.ts +3 -0
  92. package/dist/src/routes/portal.d.ts.map +1 -1
  93. package/dist/src/routes/portal.js +12 -0
  94. package/dist/src/routes/portal.js.map +1 -1
  95. package/dist/src/routes/public-stats.d.ts +15 -0
  96. package/dist/src/routes/public-stats.d.ts.map +1 -0
  97. package/dist/src/routes/public-stats.js +90 -0
  98. package/dist/src/routes/public-stats.js.map +1 -0
  99. package/dist/src/routes/sse.d.ts +7 -2
  100. package/dist/src/routes/sse.d.ts.map +1 -1
  101. package/dist/src/routes/sse.js +35 -5
  102. package/dist/src/routes/sse.js.map +1 -1
  103. package/dist/src/routes/subdomains.d.ts +33 -0
  104. package/dist/src/routes/subdomains.d.ts.map +1 -0
  105. package/dist/src/routes/subdomains.js +208 -0
  106. package/dist/src/routes/subdomains.js.map +1 -0
  107. package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
  108. package/dist/src/server-bootstrap/routes-loader.js +12 -1
  109. package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
  110. package/dist/src/server.d.ts.map +1 -1
  111. package/dist/src/server.js +4 -0
  112. package/dist/src/server.js.map +1 -1
  113. package/dist/src/services/apps-backup-export.d.ts +22 -0
  114. package/dist/src/services/apps-backup-export.d.ts.map +1 -0
  115. package/dist/src/services/apps-backup-export.js +136 -0
  116. package/dist/src/services/apps-backup-export.js.map +1 -0
  117. package/dist/src/services/apps-backup-import.d.ts +120 -0
  118. package/dist/src/services/apps-backup-import.d.ts.map +1 -0
  119. package/dist/src/services/apps-backup-import.js +259 -0
  120. package/dist/src/services/apps-backup-import.js.map +1 -0
  121. package/dist/src/services/component-registrar.d.ts +17 -0
  122. package/dist/src/services/component-registrar.d.ts.map +1 -1
  123. package/dist/src/services/component-registrar.js +63 -5
  124. package/dist/src/services/component-registrar.js.map +1 -1
  125. package/dist/src/services/handbooks/appdev.d.ts +1 -1
  126. package/dist/src/services/handbooks/appdev.d.ts.map +1 -1
  127. package/dist/src/services/handbooks/appdev.js +5 -2
  128. package/dist/src/services/handbooks/appdev.js.map +1 -1
  129. package/dist/src/storage/interface.d.ts +11 -1
  130. package/dist/src/storage/interface.d.ts.map +1 -1
  131. package/dist/src/storage/interface.js.map +1 -1
  132. package/dist/src/storage/providers/mongodb/index.d.ts +10 -1
  133. package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
  134. package/dist/src/storage/providers/mongodb/index.js +76 -0
  135. package/dist/src/storage/providers/mongodb/index.js.map +1 -1
  136. package/dist/src/storage/providers/sqlite/index.d.ts +8 -1
  137. package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
  138. package/dist/src/storage/providers/sqlite/index.js +61 -0
  139. package/dist/src/storage/providers/sqlite/index.js.map +1 -1
  140. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  141. package/dist/src/storage/providers/sqlite/schema.js +11 -0
  142. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  143. package/dist/src/storage/repositories/index.d.ts +1 -0
  144. package/dist/src/storage/repositories/index.d.ts.map +1 -1
  145. package/dist/src/storage/repositories/package.repository.d.ts +2 -0
  146. package/dist/src/storage/repositories/package.repository.d.ts.map +1 -1
  147. package/dist/src/storage/repositories/subdomain-site.repository.d.ts +19 -0
  148. package/dist/src/storage/repositories/subdomain-site.repository.d.ts.map +1 -0
  149. package/dist/src/storage/repositories/subdomain-site.repository.js +2 -0
  150. package/dist/src/storage/repositories/subdomain-site.repository.js.map +1 -0
  151. package/dist/static/app-catalog.html +1139 -28
  152. package/package.json +1 -1
  153. package/prisma/schema.postgres.prisma +11 -0
  154. package/prisma/schema.prisma +11 -0
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @file ContactCard.js
3
+ * @description Shared "Talk to a human" contact card — used on /v1/business and
4
+ * /v1/pricing ONLY (one implementation, no copied text). tel: + mailto: links.
5
+ * @usage import { ContactCard } from '/components/ContactCard.js';
6
+ * @version-history
7
+ * v1.0.0 — 2026-06-10 — Initial (owner spec: human card).
8
+ */
9
+ import { h } from 'preact';
10
+ import htm from 'htm';
11
+ const html = htm.bind(h);
12
+ import { t } from '/js/i18n.js';
13
+
14
+ const tr = (key, fallback) => { const v = t(key); return v && v !== key ? v : fallback; };
15
+
16
+ export function ContactCard() {
17
+ return html`
18
+ <div class="ld-contact">
19
+ <div class="ld-contact-title">${tr('contact.title', 'Talk to a human.')}</div>
20
+ <div class="ld-contact-name">Jouni Miikki, founder</div>
21
+ <div class="ld-contact-links">
22
+ <a href="tel:+358408231070">+358 40 8231070</a>
23
+ <a href="mailto:jouni.miikki@aimeat.io">jouni.miikki@aimeat.io</a>
24
+ </div>
25
+ <div class="ld-contact-sub">${tr('contact.sub', 'I answer myself. A demo fits in the same call.')}</div>
26
+ </div>
27
+ `;
28
+ }
@@ -4,6 +4,8 @@
4
4
  * its distinct indigo accent and a permanently-dark sidebar, but all content
5
5
  * surfaces map to global theme.css tokens so they flip with dark/light mode.
6
6
  * @version-history
7
+ * v1.6.0 — 2026-06-12 — Subdomains tab: .adm-subdomain-form create-form grid
8
+ * + .adm-subdomain-modal-actions (right-aligned type-to-confirm buttons).
7
9
  * v1.5.0 — 2026-06-02 — Component unification (#13 tables): strip the dead
8
10
  * `, #E5E7EB` hardcoded fallback from `.adm-breakdown-table th` border
9
11
  * (.adm always maps --glass-border → --border, so the fallback was dead
@@ -577,6 +579,16 @@
577
579
  /* Subtabs row */
578
580
  .adm-subtabs { display: flex; gap: 8px; margin: 16px 0; flex-wrap: wrap; }
579
581
 
582
+ /* Subdomains tab — create-form row: subdomain | kind | target (grows) | button */
583
+ .adm-subdomain-form {
584
+ display: grid;
585
+ grid-template-columns: minmax(120px, 200px) minmax(100px, 140px) 1fr auto;
586
+ gap: 8px;
587
+ align-items: center;
588
+ }
589
+ .adm-subdomain-form .adm-text-error { grid-column: 1 / -1; }
590
+ .adm-subdomain-modal-actions { justify-content: flex-end; }
591
+
580
592
  /* Active subtab button */
581
593
  .adm-btn-active,
582
594
  .adm-btn-active:hover { background: var(--accent); color: #fff; }
@@ -18,8 +18,11 @@
18
18
  * (var(--text-dim, #6B7280) -> var(--text-dim); var(--text, #1A1A2E) ->
19
19
  * var(--text)) so the agent-detail info rows flip in dark mode. Markup left
20
20
  * in place (borderless look differs from canonical .kv-row).
21
- * v1.7.0 -- 2026-06-02 -- Component unification (#6 stat cards): remove .agd-stat*/
22
- * .pf-agd-stat*; agent activity/quality stats use canonical .stat-card family.
21
+ * v1.7.0 -- 2026-06-02 -- Component unification (#6 stat cards): remove .agd-stat- and
22
+ * .pf-agd-stat- prefixed rules; agent activity/quality stats use canonical .stat-card
23
+ * family. (NB: the original entry ended in "star-slash" which TERMINATED this comment
24
+ * block early and made the parser eat the next rule — keep raw selector globs out of
25
+ * comments.)
23
26
  * v1.0.0 -- 2026-05-21 -- Initial creation for Agent Dashboard Phase 1
24
27
  * v1.1.0 -- 2026-05-22 -- Add capability badge styles for Capabilities sub-tab
25
28
  * v1.2.0 -- 2026-05-22 -- Add Activity sub-tab styles (stats cards, chart, jobs, event log)
@@ -59,14 +62,35 @@
59
62
  * v2.13.0 -- 2026-05-31 -- Add per-task blur-title toggle styles (pf-agd-blur-toggle, pf-agd-task-title--blurred) for hiding sensitive titles in screen recordings
60
63
  * v2.26.0 -- 2026-06-09 -- Add custom agent-group styles (pf-agd-cgroup-bar/header/toggle/name/empty) for the drag-to-assign "Custom groups" list mode
61
64
  * v2.27.0 -- 2026-06-09 -- Add editable tag-strip styles (pf-agd-tag-chip--editable, pf-agd-tag-chip-remove, pf-agd-tag-add-btn/input) for inline tag add/remove in the expanded card header
65
+ * v2.28.0 -- 2026-06-10 -- Detail-tab stat cards: content-sized + centered as a group
66
+ * (labels like "Onnistumisprosentti" no longer overflow); header-row gains bottom
67
+ * margin so the connect button isn't flush against the description text.
62
68
  */
63
69
 
64
- /* Header row: title left, connect button right */
70
+ /* Header row: title left, connect button right. The bottom margin keeps the
71
+ connect button from sitting flush against the description text below. */
65
72
  .pf-agd-header-row {
66
73
  display: flex;
67
74
  align-items: center;
68
75
  justify-content: space-between;
69
76
  gap: 1rem;
77
+ margin-bottom: 0.65rem;
78
+ }
79
+
80
+ /* Stat cards inside agent detail tabs (Activity, Quality): size each card to its
81
+ content so long uppercase labels ("Onnistumisprosentti") fit, and center the
82
+ group instead of left-stacking it. */
83
+ .pf .pf-agd-tab-content .stat-grid {
84
+ display: flex;
85
+ flex-wrap: wrap;
86
+ justify-content: center;
87
+ gap: 12px;
88
+ margin-bottom: 1.25rem;
89
+ }
90
+ .pf .pf-agd-tab-content .stat-card {
91
+ flex: 0 1 auto;
92
+ min-width: 170px;
93
+ padding: 14px 26px;
70
94
  }
71
95
 
72
96
  /* Sub-tab bar */
@@ -1925,9 +1949,9 @@
1925
1949
  }
1926
1950
 
1927
1951
  /* ── Unseen-change badges ──
1928
- Collapsed-card mini-badge (total new across Tasks/Messages/Memory) + per-tab
1929
- number badges. Both use the accent colour so "something changed" reads at a
1930
- glance. Counts come from the localStorage last-seen baseline (agents-tab.js). */
1952
+ Collapsed-card mini-badge + per-tab number badges (Tasks/Messages only). Neutral
1953
+ gray by default — red is reserved for unseen FAILED tasks, so a real alarm never
1954
+ drowns in routine counts. Counts come from the localStorage last-seen baseline. */
1931
1955
  .pf .pf-agd-change-badge {
1932
1956
  display: inline-flex;
1933
1957
  align-items: center;
@@ -1937,13 +1961,19 @@
1937
1961
  padding: 0 5px;
1938
1962
  margin-left: 6px;
1939
1963
  border-radius: 9px;
1940
- background: var(--accent, #E8564A);
1941
- color: #fff;
1964
+ background: var(--bg-dim, #F3F4F6);
1965
+ color: var(--text-dim, #4B5563);
1966
+ border: 1px solid var(--border, #E5E7EB);
1942
1967
  font-size: 0.68rem;
1943
1968
  font-weight: 700;
1944
1969
  line-height: 1;
1945
1970
  flex-shrink: 0;
1946
1971
  }
1972
+ .pf .pf-agd-change-badge--failed {
1973
+ background: var(--danger-bg, #FEE2E2);
1974
+ color: var(--danger-fg, #DC2626);
1975
+ border-color: var(--danger-border, #FECACA);
1976
+ }
1947
1977
  .pf .pf-agd-tab {
1948
1978
  /* allow the inline count badge to sit beside the label */
1949
1979
  display: inline-flex;
@@ -1958,12 +1988,34 @@
1958
1988
  height: 16px;
1959
1989
  padding: 0 4px;
1960
1990
  border-radius: 8px;
1961
- background: var(--accent, #E8564A);
1962
- color: #fff;
1991
+ background: var(--bg-dim, #F3F4F6);
1992
+ color: var(--text-dim, #4B5563);
1993
+ border: 1px solid var(--border, #E5E7EB);
1963
1994
  font-size: 0.62rem;
1964
1995
  font-weight: 700;
1965
1996
  line-height: 1;
1966
1997
  }
1998
+ .pf .pf-agd-tab-badge--failed {
1999
+ background: var(--danger-bg, #FEE2E2);
2000
+ color: var(--danger-fg, #DC2626);
2001
+ border-color: var(--danger-border, #FECACA);
2002
+ }
2003
+
2004
+ /* ── Board legend (filter pills), capability summary, inline misc (2026-06-10 round) ── */
2005
+ .pf .pf-agd-board-legend { display: flex; gap: 0.4rem; flex-wrap: wrap; margin-bottom: 0.6rem; }
2006
+ .pf .pf-agd-legend-pill { display: inline-flex; align-items: center; gap: 0.35rem; background: var(--control-bg, var(--card)); border: 1px solid var(--control-border, var(--border)); border-radius: 999px; padding: 0.2rem 0.6rem; font-size: 0.76rem; color: var(--text-dim); cursor: pointer; }
2007
+ .pf .pf-agd-legend-pill:disabled { opacity: 0.45; cursor: default; }
2008
+ .pf .pf-agd-legend-pill--active { border-color: var(--accent); color: var(--text); }
2009
+ .pf .pf-agd-legend-dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; }
2010
+ .pf .pf-agd-legend-count { color: var(--muted); }
2011
+ .pf .pf-agd-cap-summary { background: none; border: none; padding: 0.15rem 0; font-size: 0.78rem; color: var(--text-dim); cursor: pointer; }
2012
+ .pf .pf-agd-cap-summary:hover { color: var(--text); }
2013
+ .pf .pf-agd-none-inline { font-size: 0.78rem; color: var(--muted); margin: 0 auto 0 0.5rem; }
2014
+ .pf .pf-agd-inline-stars { display: inline-flex; gap: 1px; }
2015
+ .pf .pf-agd-inline-star { background: none; border: none; cursor: pointer; font-size: 1rem; color: var(--border); padding: 0 1px; line-height: 1; }
2016
+ .pf .pf-agd-inline-star--hot, .pf .pf-agd-inline-star:hover { color: var(--warn, #F59E0B); }
2017
+ .pf .pf-agd-quality-pending-when { font-size: 0.74rem; color: var(--muted); white-space: nowrap; }
2018
+ .pf .pf-agd-commands--empty { display: flex; align-items: center; gap: 0.5rem; padding: 0.35rem 0.6rem; font-size: 0.82rem; color: var(--text-dim); }
1967
2019
 
1968
2020
  /* ── README tab (rendered from agents.<name>.readme markdown) ── */
1969
2021
  .pf .pf-agd-readme {
@@ -0,0 +1,87 @@
1
+ /**
2
+ * @file landing.css
3
+ * @description Logged-out landing + pricing pages (ld- prefix). Theme tokens only;
4
+ * path cards stack on mobile, ticker truncates to one line.
5
+ * @version-history
6
+ * v1.0.0 — 2026-06-10 — Initial (landing/portal split).
7
+ */
8
+ .ld { max-width: 980px; margin: 0 auto; padding: 2rem 1.25rem 3rem; color: var(--text); }
9
+ .ld-hero { text-align: center; padding: 2.5rem 0 1.25rem; }
10
+ .ld-h1 { font-size: 2.1rem; font-weight: 800; letter-spacing: -0.5px; margin: 0 0 .6rem; }
11
+ .ld-hero-sub { color: var(--text-dim); font-size: 1.05rem; margin: 0; }
12
+ .ld-ticker { display: flex; align-items: center; gap: .5rem; justify-content: center; margin: 1rem auto; max-width: 760px; padding: .45rem .9rem; border: 1px solid var(--border); border-radius: 999px; background: var(--card); font-size: .85rem; color: var(--text-dim); white-space: nowrap; overflow: hidden; }
13
+ .ld-ticker-text { overflow: hidden; text-overflow: ellipsis; }
14
+ .ld-ticker-dot { color: var(--success-fg, #2E9E5B); flex: none; }
15
+ .ld-stats { max-width: 760px; margin: 1.25rem auto 2rem; padding: 1rem 1.25rem; border: 1px solid var(--border); border-radius: 12px; background: var(--bg-surface, var(--bg-dim)); text-align: center; }
16
+ .ld-stats-line { font-size: 1.05rem; font-weight: 600; }
17
+ .ld-stats-own { margin-top: .6rem; color: var(--text-dim); font-size: .95rem; }
18
+ .ld-stats-cta { color: var(--accent); font-weight: 700; text-decoration: none; margin-left: .35rem; }
19
+ .ld-stats-cta:hover { text-decoration: underline; }
20
+ .ld-paths { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; margin: 1.5rem 0; }
21
+ @media (max-width: 760px) { .ld-paths { grid-template-columns: 1fr; } }
22
+ .ld-path { border: 1px solid var(--border); border-radius: 12px; background: var(--card); padding: 1.1rem 1.2rem; display: flex; flex-direction: column; }
23
+ .ld-path--hot { border-color: var(--accent); border-width: 2px; }
24
+ .ld-path h3 { margin: 0 0 .4rem; font-size: 1.05rem; }
25
+ .ld-path p { margin: 0 0 .9rem; color: var(--text-dim); font-size: .9rem; flex: 1; }
26
+ .ld-path-cta { color: var(--accent); font-weight: 700; text-decoration: none; font-size: .92rem; }
27
+ .ld-path-cta:hover { text-decoration: underline; }
28
+ .ld-loop { display: flex; align-items: center; justify-content: center; gap: .6rem; flex-wrap: wrap; margin: 1.5rem 0 2rem; padding: .8rem 1rem; border: 1px solid var(--border); border-radius: 10px; background: var(--bg-surface, var(--bg-dim)); font-size: .9rem; }
29
+ .ld-loop-arrow { color: var(--text-dim); }
30
+ .ld-section { margin: 2rem 0; }
31
+ .ld-h2 { font-size: 1.3rem; margin: 0 0 1rem; }
32
+ .ld-gallery { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: .9rem; }
33
+ .ld-app-card { display: block; border: 1px solid var(--border); border-radius: 10px; background: var(--card); padding: .9rem 1rem; text-decoration: none; color: var(--text); }
34
+ .ld-app-card:hover { border-color: var(--accent); }
35
+ .ld-app-name { font-weight: 700; margin-bottom: .25rem; }
36
+ .ld-app-desc { font-size: .82rem; color: var(--text-dim); margin-bottom: .4rem; }
37
+ .ld-app-meta { font-size: .72rem; color: var(--muted); }
38
+ .ld-footer { display: flex; gap: 1.25rem; flex-wrap: wrap; justify-content: center; margin-top: 2.5rem; padding-top: 1.25rem; border-top: 1px solid var(--border); font-size: .88rem; }
39
+ .ld-footer a { color: var(--text-dim); text-decoration: none; }
40
+ .ld-footer a:hover { color: var(--text); }
41
+ /* Pricing */
42
+ .ld-pricing .ld-h1 { text-align: center; }
43
+ .ld-pricing .ld-hero-sub { text-align: center; margin-bottom: 1.5rem; }
44
+ .ld-tiers { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 1rem; margin: 1.25rem 0; }
45
+ .ld-tier { border: 1px solid var(--border); border-radius: 12px; background: var(--card); padding: 1.1rem 1.2rem; display: flex; flex-direction: column; }
46
+ .ld-tier--hot { border-color: var(--accent); border-width: 2px; }
47
+ .ld-tier-name { margin: 0 0 .2rem; font-size: 1.05rem; }
48
+ .ld-tier-price { font-size: 1.3rem; font-weight: 800; margin-bottom: .6rem; }
49
+ .ld-tier-lines { margin: 0 0 1rem; padding-left: 1.1rem; color: var(--text-dim); font-size: .88rem; flex: 1; }
50
+ .ld-tier-lines li { margin-bottom: .3rem; }
51
+
52
+ /* ── How it works ── */
53
+ .hiw-diagram { margin: 1.5rem 0; }
54
+ .hiw-svg { width: 100%; height: auto; display: block; }
55
+ .hiw-svg--tall { display: none; max-width: 360px; margin: 0 auto; }
56
+ @media (max-width: 700px) { .hiw-svg--wide { display: none; } .hiw-svg--tall { display: block; } }
57
+ .ld-ctarow { display: flex; gap: .9rem; justify-content: center; flex-wrap: wrap; margin: 2rem 0 1rem; }
58
+ .ld-ctarow a { text-decoration: none; }
59
+
60
+ /* ── Business ── */
61
+ .ld-bhero { position: relative; display: grid; grid-template-columns: 1fr 1fr; align-items: center; gap: 1.25rem; margin: 1rem 0 2rem; border-radius: 14px; overflow: hidden; background: var(--bg-surface, var(--bg-dim)); border: 1px solid var(--border); }
62
+ .ld-bhero-img { width: 100%; height: 100%; object-fit: cover; min-height: 260px; }
63
+ .ld-bhero-text { padding: 1.5rem 1.5rem 1.5rem .25rem; }
64
+ .ld-bhero--noimg { grid-template-columns: 1fr; text-align: center; }
65
+ .ld-bhero--noimg .ld-bhero-text { padding: 2.25rem 1.5rem; }
66
+ @media (max-width: 700px) { .ld-bhero { grid-template-columns: 1fr; } .ld-bhero-text { padding: 1.25rem; } .ld-bhero-img { max-height: 220px; } }
67
+ .ld-cases { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1rem; margin: 1.5rem 0; }
68
+ @media (max-width: 760px) { .ld-cases { grid-template-columns: 1fr; } }
69
+ .ld-case { border: 1px solid var(--border); border-radius: 12px; background: var(--card); padding: 1.1rem 1.2rem; display: flex; flex-direction: column; gap: .55rem; }
70
+ .ld-case-title { margin: 0; font-size: 1.05rem; }
71
+ .ld-case-text { margin: 0; color: var(--text-dim); font-size: .9rem; flex: 1; }
72
+ .ld-case-quote { margin: 0; padding: .5rem .8rem; border-left: 3px solid var(--accent); background: var(--bg-surface, var(--bg-dim)); border-radius: 6px; font-size: .88rem; }
73
+ .ld-case-quote footer { color: var(--text-dim); font-size: .78rem; margin-top: .25rem; }
74
+ .ld-case-proof { font-size: .85rem; color: var(--accent); text-decoration: none; font-weight: 600; }
75
+ .ld-case-proof:hover { text-decoration: underline; }
76
+ .ld-case-proofnote { font-size: .8rem; color: var(--text-dim); font-style: italic; background: var(--bg-surface, var(--bg-dim)); border-radius: 6px; padding: .45rem .7rem; }
77
+
78
+ /* ── Contact card (business + pricing only) ── */
79
+ .ld-contact { max-width: 460px; margin: 2.25rem auto 0; padding: 1.25rem 1.5rem; border: 2px solid var(--accent); border-radius: 14px; background: var(--card); text-align: center; }
80
+ .ld-contact-title { font-size: 1.15rem; font-weight: 800; margin-bottom: .4rem; }
81
+ .ld-contact-name { font-weight: 600; margin-bottom: .35rem; }
82
+ .ld-contact-links { display: flex; gap: 1rem; justify-content: center; flex-wrap: wrap; margin-bottom: .45rem; }
83
+ .ld-contact-links a { color: var(--accent); text-decoration: none; font-weight: 600; }
84
+ .ld-contact-links a:hover { text-decoration: underline; }
85
+ .ld-contact-sub { color: var(--text-dim); font-size: .88rem; }
86
+ .ld-example-img { width: 100%; max-height: 260px; object-fit: cover; border-radius: 10px; margin-bottom: .9rem; }
87
+ .ld-app-badge { font-size: .68rem; font-weight: 600; color: var(--text-dim); border: 1px solid var(--border); border-radius: 999px; padding: 1px 7px; vertical-align: 2px; }
@@ -0,0 +1,96 @@
1
+ /**
2
+ * @file offers.css
3
+ * @description Styles for the Agent Offers "Do" surface (offers-tab.js). Prefix `of-`. Uses theme.css
4
+ * variables only (no hardcoded colors / no rgba(255,255,255)).
5
+ * @version-history
6
+ * v1.0.0 -- 2026-06-12 -- Initial: Do feed cards, badges, offer detail, provenance footer.
7
+ * v1.1.0 -- 2026-06-12 -- Billable offers: price/visibility badges + the Selling editor row.
8
+ * v1.2.0 -- 2026-06-12 -- Markdown deliverable/sample (.of-md) + Inbox deep-link (.of-link).
9
+ * v1.2.1 -- 2026-06-12 -- Scope markdown headings/tables/lists to the card (LLM h1 was giant; tables
10
+ * now render with borders).
11
+ */
12
+ .of { max-width: 920px; }
13
+ .of-search { width: 100%; margin: 0.5rem 0 0.75rem; }
14
+
15
+ .of-card { border: 1px solid var(--border); background: var(--card); border-radius: 8px; padding: 0.6rem 0.75rem; margin: 0.5rem 0; }
16
+ .of-card--open { border-color: var(--accent, var(--border)); }
17
+ .of-card-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 0.75rem; cursor: pointer; }
18
+ .of-card-title { display: flex; flex-direction: column; gap: 0.15rem; min-width: 0; }
19
+ .of-offer-title { font-weight: 600; }
20
+ .of-agent { font-size: 0.82rem; color: var(--muted); display: inline-flex; align-items: center; gap: 0.35rem; }
21
+ .of-dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; }
22
+ .of-dot--on { background: var(--success, #10b981); }
23
+ .of-dot--off { background: var(--border); }
24
+
25
+ .of-badges { display: flex; flex-wrap: wrap; gap: 0.3rem; align-items: flex-start; }
26
+ .of-badge { font-size: 0.72rem; padding: 0.05rem 0.4rem; border-radius: 10px; background: var(--bg-dim); color: var(--muted); border: 1px solid var(--border); white-space: nowrap; }
27
+ .of-badge--ver { color: var(--success, #10b981); }
28
+ .of-badge--data { color: var(--info, var(--accent)); }
29
+ .of-badge--cost { color: var(--warn, #f59e0b); }
30
+ .of-badge--untested { color: var(--muted); font-style: italic; }
31
+
32
+ .of-ask { margin: 0.35rem 0 0; color: var(--text); }
33
+ .of-detail { margin-top: 0.5rem; padding-top: 0.5rem; border-top: 1px solid var(--border); display: flex; flex-direction: column; gap: 0.4rem; }
34
+ .of-example { font-size: 0.88rem; color: var(--muted); }
35
+ .of-label { font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.04em; color: var(--muted); font-weight: 600; }
36
+ .of-mini { font-size: 0.8rem; color: var(--muted); }
37
+
38
+ .of-req-list, .of-conseq-list { display: flex; flex-wrap: wrap; gap: 0.35rem; }
39
+ .of-req { font-size: 0.82rem; background: var(--bg-dim); border: 1px solid var(--border); border-radius: 6px; padding: 0.1rem 0.45rem; }
40
+ .of-fix { color: var(--accent); font-weight: 600; }
41
+ .of-conseq { font-size: 0.78rem; background: var(--surface); border: 1px solid var(--border); border-radius: 6px; padding: 0.1rem 0.45rem; }
42
+ .of-conseq--warn { color: var(--warn, #f59e0b); border-color: var(--warn, #f59e0b); }
43
+
44
+ .of-sample { font-size: 0.8rem; background: var(--bg-dim); border: 1px solid var(--border); border-radius: 6px; padding: 0.4rem 0.6rem; white-space: pre-wrap; overflow-x: auto; max-height: 200px; margin: 0; }
45
+ .of-input { width: 100%; resize: vertical; }
46
+
47
+ .of-result { margin-top: 0.4rem; padding: 0.5rem 0.6rem; background: var(--bg-dim); border: 1px solid var(--border); border-radius: 6px; }
48
+ .of-result-msg { font-weight: 600; }
49
+ .of-prov { font-size: 0.78rem; color: var(--muted); margin-top: 0.25rem; }
50
+
51
+ /* Do/Inbox segment */
52
+ .of-seg { display: inline-flex; border: 1px solid var(--border); border-radius: 8px; overflow: hidden; margin: 0.25rem 0 0.75rem; }
53
+ .of-seg-btn { background: var(--card); color: var(--muted); border: none; padding: 0.3rem 0.9rem; cursor: pointer; font-weight: 600; }
54
+ .of-seg-btn--on { background: var(--accent, var(--bg-dim)); color: var(--accent-contrast, var(--text)); }
55
+
56
+ /* Inbox status badges */
57
+ .of-status { font-size: 0.72rem; padding: 0.05rem 0.5rem; border-radius: 10px; border: 1px solid var(--border); white-space: nowrap; }
58
+ .of-st--done { color: var(--success, #10b981); border-color: var(--success, #10b981); }
59
+ .of-st--failed { color: var(--danger, #ef4444); border-color: var(--danger, #ef4444); }
60
+ .of-st--active { color: var(--info, var(--accent)); }
61
+ .of-st--queued { color: var(--muted); }
62
+ .of-fail { color: var(--danger, #ef4444); font-size: 0.88rem; }
63
+
64
+ /* Rating */
65
+ .of-rate { display: flex; flex-wrap: wrap; align-items: center; gap: 0.4rem; margin-top: 0.3rem; }
66
+ .of-stars { display: inline-flex; }
67
+ .of-star { background: none; border: none; cursor: pointer; font-size: 1.1rem; line-height: 1; color: var(--muted); padding: 0 0.05rem; }
68
+ .of-star--on { color: var(--warn, #f59e0b); }
69
+ .of-rate-note { flex: 1 1 200px; min-width: 140px; }
70
+
71
+ /* Billing badges + the Selling editor */
72
+ .of-badge--vis { color: var(--accent); border-color: var(--accent); }
73
+ .of-badge--price { color: var(--warn, #f59e0b); font-weight: 600; }
74
+ .of-bill { margin-top: 0.4rem; padding-top: 0.5rem; border-top: 1px dashed var(--border); display: flex; flex-direction: column; gap: 0.35rem; }
75
+ .of-bill-row { align-items: center; gap: 0.4rem; }
76
+ .of-bill-vis { flex: 0 1 180px; }
77
+ .of-bill-price { flex: 0 1 110px; }
78
+ .of-warn { color: var(--warn, #f59e0b); }
79
+
80
+ /* Rendered markdown (deliverable + sample) + the Inbox deep-link */
81
+ .of-md { font-size: 0.86rem; background: var(--bg-dim); border: 1px solid var(--border); border-radius: 6px; padding: 0.4rem 0.7rem; overflow-x: auto; max-height: 360px; }
82
+ .of-md > :first-child { margin-top: 0; }
83
+ .of-md > :last-child { margin-bottom: 0; }
84
+ .of-sample-md { max-height: 200px; }
85
+ /* Scale headings/tables/lists to the card context (an LLM h1 must not be giant here). */
86
+ .of-md h1, .of-md h2, .of-md h3, .of-md h4, .of-md h5, .of-md h6 { font-size: 0.95rem; font-weight: 700; line-height: 1.3; margin: 0.45rem 0 0.2rem; }
87
+ .of-md h1 { font-size: 1.02rem; }
88
+ .of-md p { margin: 0.3rem 0; }
89
+ .of-md ul, .of-md ol { margin: 0.3rem 0; padding-left: 1.2rem; }
90
+ .of-md li { margin: 0.1rem 0; }
91
+ .of-md table { border-collapse: collapse; font-size: 0.8rem; margin: 0.3rem 0; }
92
+ .of-md th, .of-md td { border: 1px solid var(--border); padding: 0.15rem 0.45rem; text-align: left; }
93
+ .of-md th { background: var(--surface); font-weight: 600; }
94
+ .of-md pre { font-size: 0.8rem; background: var(--surface); border: 1px solid var(--border); border-radius: 4px; padding: 0.4rem 0.6rem; overflow-x: auto; }
95
+ .of-md code { font-size: 0.82em; }
96
+ .of-link { background: none; border: none; padding: 0; margin-left: 0.35rem; color: var(--accent); cursor: pointer; font: inherit; text-decoration: underline; }
@@ -320,3 +320,21 @@
320
320
  flex-direction: column;
321
321
  }
322
322
  }
323
+
324
+ /* ── Builder workflow round (2026-06-10): flow banner, summaries, preview, publish bits ── */
325
+ .portfolio-subtitle-text { color: var(--text-dim); margin-bottom: 1rem; }
326
+ .portfolio-flow { display: flex; align-items: center; gap: .6rem; flex-wrap: wrap; padding: .7rem 1rem; margin-bottom: 1.5rem; background: var(--bg-surface, var(--bg-dim)); border: 1px solid var(--border); border-radius: 10px; font-size: .88rem; color: var(--text); }
327
+ .portfolio-flow-num { font-weight: 700; margin-right: .25rem; }
328
+ .portfolio-flow-arrow { color: var(--text-dim); }
329
+ .portfolio-published-bar { margin-bottom: 1.5rem; padding: .75rem 1rem; background: rgba(80,200,120,.08); border: 1px solid rgba(80,200,120,.25); border-radius: 8px; display: flex; align-items: center; gap: .75rem; flex-wrap: wrap; }
330
+ .portfolio-published-dot { color: var(--success-fg, #2E9E5B); }
331
+ .portfolio-published-link { margin-left: auto; }
332
+ .portfolio-group-checkall { margin-right: .65rem; cursor: pointer; accent-color: var(--accent, #E8564A); width: 15px; height: 15px; }
333
+ .portfolio-custom-desc { width: 100%; margin-top: .6rem; background: var(--control-bg, var(--card)); border: 1px solid var(--control-border, var(--border)); border-radius: 8px; padding: .5rem .65rem; color: var(--text); font: inherit; font-size: .88rem; resize: vertical; }
334
+ .portfolio-generate-row { display: flex; align-items: center; gap: .75rem; flex-wrap: wrap; margin-bottom: 1rem; }
335
+ .portfolio-generate-hint { font-size: .82rem; color: var(--text-dim); }
336
+ .portfolio-prompt-meta { font-size: .76rem; color: var(--text-dim); margin: .35rem 0 .6rem; }
337
+ .portfolio-publish-target { font-size: .85rem; color: var(--text-dim); margin-bottom: .75rem; }
338
+ .portfolio-publish-url { font-family: monospace; word-break: break-all; }
339
+ .portfolio-paste-actions { display: flex; gap: .6rem; margin-top: .5rem; flex-wrap: wrap; }
340
+ .portfolio-preview-frame { margin-top: .75rem; min-height: 420px; width: 100%; border: 1px solid var(--border); border-radius: 8px; background: #fff; }
@@ -174,9 +174,52 @@
174
174
  Unified 2026-06-02 (#6). (.pf .wallet-lifetime grid wrapper kept.) */
175
175
  .pf .wallet-balance-copy{display:inline-block;margin-left:.5rem;font-size:.7rem;padding:2px 8px;background:rgba(232,86,74,.15);border:1px solid rgba(232,86,74,.3);border-radius:4px;color:var(--text,#1A1A2E);cursor:pointer;vertical-align:middle}
176
176
  .pf .wallet-balance-copy:hover{background:rgba(232,86,74,.25)}
177
- .pf .mem-item{display:flex;justify-content:space-between;align-items:center;padding:.5rem 0;border-bottom:1px solid rgba(232,86,74,.08);font-size:.85rem;cursor:pointer;gap:.5rem}
178
- .pf .mem-item:hover{background:rgba(232,86,74,.05)}
179
- .pf .mem-key{font-family:monospace;color:var(--accent,#E8564A);font-weight:500;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
177
+ .pf .mem-item{display:flex;justify-content:space-between;align-items:center;padding:.5rem 0;border-bottom:1px solid var(--border-subtle,var(--border));font-size:.85rem;cursor:pointer;gap:.5rem}
178
+ .pf .mem-item:hover{background:var(--bg-surface,var(--bg-dim))}
179
+ /* Keys in the NEUTRAL text color — monospace already separates them; a list of all-red
180
+ keys read like an error log and burned out red's alarm meaning. */
181
+ .pf .mem-key{font-family:monospace;color:var(--text);font-weight:500;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
182
+ /* ── Grouped key list (2026-06-10): collapsible groups by first key segment ── */
183
+ .pf .mem-group{margin-bottom:.35rem}
184
+ .pf .mem-group-header{display:flex;align-items:center;gap:.5rem;width:100%;background:none;border:none;border-bottom:1px solid var(--border);padding:.45rem .2rem;cursor:pointer;font:inherit;text-align:left}
185
+ .pf .mem-group-header:hover{background:var(--bg-surface,var(--bg-dim))}
186
+ .pf .mem-group-name{font-family:monospace;font-weight:700;color:var(--text);font-size:.85rem}
187
+ .pf .mem-group-count{font-size:.75rem;color:var(--text-dim)}
188
+ .pf .mem-group-sub{font-family:monospace;font-size:.7rem;color:var(--muted)}
189
+ .pf .mem-item--grouped{padding-left:1.4rem}
190
+ .pf .mem-detail-key{font-family:monospace;font-size:.72rem;color:var(--muted);margin-bottom:.4rem;word-break:break-all}
191
+ .pf .mem-detail-visrow{display:flex;align-items:center;gap:.5rem;margin-top:.5rem}
192
+ .pf .mem-row-check{flex:none;margin:0 .15rem 0 0;cursor:pointer}
193
+ .pf .mem-vis-pop{display:flex;flex-wrap:wrap;gap:.35rem;padding:.5rem .75rem;margin:.25rem 0 .25rem 1.4rem;background:var(--card);border:1px solid var(--border);border-radius:8px;box-shadow:var(--shadow-sm)}
194
+ .pf .mem-vis-opt{background:var(--control-bg,var(--card));border:1px solid var(--control-border,var(--border));border-radius:999px;padding:.2rem .65rem;font-size:.76rem;color:var(--text);cursor:pointer}
195
+ .pf .mem-vis-opt:hover{border-color:var(--accent)}
196
+ .pf .mem-vis-opt--current{border-color:var(--accent);font-weight:700}
197
+ .pf .mem-vis-opt--dim{color:var(--text-dim);border-style:dashed}
198
+ .pf .mem-bulkbar{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap;padding:.45rem .75rem;margin-bottom:.5rem;background:var(--bg-surface,var(--bg-dim));border:1px solid var(--border);border-radius:8px}
199
+ .pf .mem-bulkbar-count{font-size:.82rem;font-weight:600;color:var(--text)}
200
+ .pf .mem-actions .mem-delete-btn{margin-left:auto}
201
+ .pf .mem-vis-select{font-size:.72rem;padding:2px 6px;min-width:auto;width:auto}
202
+ .pf .mem-edit-textarea{min-height:280px;resize:vertical;font-family:monospace;font-size:.8rem}
203
+ .pf .mem-edit-textarea--error{border-color:var(--danger-fg,#DC2626)}
204
+ .pf .mem-json-error{color:var(--danger-fg,#DC2626);font-size:.78rem;margin-top:.35rem}
205
+ .pf .tag-pill.tag-more{border-style:dashed;color:var(--text-dim)}
206
+ .pf .tag-pill.tag-removable{background:var(--control-bg,var(--card));color:var(--text);border:1px solid var(--control-border,var(--border))}
207
+ .pf .tag-pill.tag-removable .tag-x{color:var(--muted);margin-left:2px}
208
+ .pf .tag-pill.tag-removable:hover .tag-x{color:var(--text)}
209
+ /* ── Access tab polish (2026-06-10): neutral headers, compact empties, fed coupling ── */
210
+ .pf .card-h3.access-h3{color:var(--text)}
211
+ .pf .access-empty-row{display:flex;align-items:center;gap:.75rem;padding:.4rem 0;margin-bottom:1rem}
212
+ .pf .access-fed-allowall{padding:.4rem 0;border-bottom:1px solid var(--border-subtle,var(--border))}
213
+ .pf .access-fed-warn-caption{font-size:.78rem;color:var(--warn-fg,#B45309);margin:.25rem 0 .1rem 1.6rem}
214
+ .pf .access-fed-list--inactive{opacity:.45;pointer-events:none}
215
+ .pf .access-copy-val{display:inline-flex;align-items:center;gap:.25rem;min-width:0;overflow-wrap:anywhere}
216
+ /* ── Sidebar reorg (2026-06-10): collapsible groups + pin-on-hover ── */
217
+ .pf .pf-side-group-toggle{display:flex;align-items:center;gap:.35rem;width:100%;background:none;border:none;cursor:pointer;font:inherit;text-align:left;padding:0}
218
+ .pf .pf-side-group-toggle .pf-chevron{font-size:.55rem;color:var(--muted)}
219
+ .pf .pf-side-pin{display:none;margin-left:auto;font-size:.72rem;opacity:.55;cursor:pointer;filter:grayscale(1)}
220
+ .pf .pf-side-item:hover .pf-side-pin{display:inline}
221
+ .pf .pf-side-pin:hover{opacity:1}
222
+ .pf .pf-side-pin--on{display:inline;opacity:.9;filter:none}
180
223
  .pf .mem-time{font-size:.7rem;color:var(--text-dim,#6B7280);white-space:nowrap;flex-shrink:0}
181
224
  .pf .mem-sort-bar{display:flex;align-items:center;gap:.35rem}
182
225
  .pf .mem-sort-select{font-size:.75rem;padding:2px 6px;min-width:auto;width:auto}
@@ -467,6 +510,22 @@
467
510
  .pf .pkg-badge-published{background:var(--success-bg);color:var(--success-fg)}
468
511
  .pf .pkg-badge-draft{background:var(--bg-surface);color:var(--text-dim)}
469
512
  .pf .pkg-empty{color:var(--muted,#888);font-size:.85rem;text-align:center;padding:2rem 0}
513
+ /* Expanded instance card: per-component list with status dots and inline actions */
514
+ .pf .pkg-card-expanded{grid-column:span 2}
515
+ @media (max-width:720px){.pf .pkg-card-expanded{grid-column:span 1}}
516
+ .pf .pkg-badge-sub{font-weight:400;text-transform:none;letter-spacing:0;opacity:.85;margin-left:.25rem}
517
+ .pf .pkg-comp-list{list-style:none;padding:0;margin:.75rem 0 .5rem;border-top:1px solid var(--border,#E5E7EB)}
518
+ .pf .pkg-comp{display:grid;grid-template-columns:1.5rem 1fr auto auto auto;gap:.5rem;align-items:center;padding:.4rem 0;border-bottom:1px dashed var(--border,#E5E7EB);font-size:.8rem}
519
+ .pf .pkg-comp:last-child{border-bottom:0}
520
+ .pf .pkg-comp-icon{font-size:1.1rem;line-height:1}
521
+ .pf .pkg-comp-id{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.78rem;color:var(--text,#111);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
522
+ .pf .pkg-comp-type{font-size:.7rem;color:var(--text-dim,#6B7280);background:var(--bg-dim,#F3F4F6);padding:1px 6px;border-radius:4px;text-transform:lowercase}
523
+ .pf .pkg-comp-status{display:flex;align-items:center;gap:.25rem}
524
+ .pf .pkg-dot{display:inline-block;width:.55rem;height:.55rem;border-radius:50%;background:var(--muted,#9CA3AF)}
525
+ .pf .pkg-dot-active{background:#22c55e;box-shadow:0 0 0 2px rgba(34,197,94,.18)}
526
+ .pf .pkg-comp-customized{font-size:.85rem;color:var(--warn-fg,#b45309)}
527
+ .pf .pkg-comp-actions{display:flex;gap:.25rem;flex-wrap:wrap}
528
+ .pf .pkg-comp-actions .btn-xs,.pf .pkg-card-meta .btn-xs{font-size:.7rem;padding:2px 6px}
470
529
  .pf .pkg-stats{display:flex;gap:.5rem;align-items:center;font-size:.8rem;color:var(--muted,#888)}
471
530
  .pf .pkg-section-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem}
472
531
  .pf .pkg-section-header h3{margin:0}
@@ -1981,7 +2040,8 @@
1981
2040
  border-right: 1px solid var(--border);
1982
2041
  }
1983
2042
  .pf-side-identity { display: flex; align-items: center; gap: 0.6rem; padding: 0.4rem 0.6rem 0.8rem; }
1984
- .pf-side-avatar { width: 34px; height: 34px; border-radius: var(--radius-full, 999px); flex: 0 0 auto; background: linear-gradient(135deg, var(--accent), var(--accent-deep, var(--accent))); }
2043
+ .pf-side-avatar { width: 34px; height: 34px; border-radius: var(--radius-full, 999px); flex: 0 0 auto; background: var(--card); border: 1.5px solid var(--border); overflow: hidden; }
2044
+ .pf-side-avatar svg { width: 100%; height: 100%; }
1985
2045
  .pf-side-id-name { font-weight: 700; font-size: 0.95rem; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1986
2046
 
1987
2047
  .pf-side-group { margin-top: 0.4rem; }
@@ -2070,6 +2130,11 @@
2070
2130
  /* A declared space whose data does not live in workspace records (backing 'tasks', or a legacy
2071
2131
  unsupported backing) — shown as a notice instead of silently dropped from the view. */
2072
2132
  .pj-space-notice { font-size: 0.88rem; color: var(--muted); padding: 0.2rem 0 0.3rem; }
2133
+ /* The viewer's own contract-advertising agents (tag 'workspace-contract'), surfaced in the
2134
+ workspace People panel so the user sees which of their agents can serve this workspace. */
2135
+ .pj-contract-agents { border: 1px solid var(--border); border-radius: 10px; padding: 0.5rem 0.75rem; margin-bottom: 0.6rem; background: var(--card); }
2136
+ /* The per-contract one-click adopt action inside a contract-agent chip. */
2137
+ .pj-adopt-btn { margin-left: 0.4rem; padding: 0.1rem 0.5rem; font-size: 0.78rem; }
2073
2138
  .pj-draft-form { margin: 0.4rem 0; }
2074
2139
  .pj-drafts { display: flex; flex-direction: column; gap: 0.3rem; margin-bottom: 0.3rem; }
2075
2140
  .pj-item { display: flex; align-items: center; gap: 0.5rem; padding: 0.35rem 0; }
@@ -2337,6 +2402,44 @@
2337
2402
  .md-img { max-width: 100%; height: auto; border-radius: 6px; }
2338
2403
  @media (max-width: 640px) { .pj-docspace { flex-direction: column; } .pj-doc-index { flex: none; width: 100%; } }
2339
2404
 
2405
+ /* ───────────────── Workspace Overview tab ─────────────────
2406
+ * The landing view: a "what happened here" strip + every space stacked on one vertical scroll.
2407
+ * Sections collapse as accordions on mobile; documents expand inline there (no popups). */
2408
+ .pj-ov { display: flex; flex-direction: column; gap: 0.6rem; }
2409
+ .pj-ov-strip { border: 1px solid var(--border); border-radius: 10px; padding: 0.5rem 0.6rem; background: var(--card); }
2410
+ .pj-ov-strip-title { font-weight: 600; font-size: 0.85rem; color: var(--muted); margin-bottom: 0.3rem; }
2411
+ .pj-ov-event { display: flex; align-items: center; gap: 0.45rem; width: 100%; padding: 0.2rem 0.25rem; border: 0; background: none; border-radius: 6px; cursor: pointer; text-align: left; font-size: 0.85rem; color: var(--text); }
2412
+ .pj-ov-event:hover { background: var(--bg-dim); }
2413
+ .pj-ov-event-who { font-weight: 600; flex-shrink: 0; }
2414
+ .pj-ov-event-act { color: var(--muted); flex-shrink: 0; }
2415
+ .pj-ov-event-what { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
2416
+ .pj-ov-event-time { margin-left: auto; color: var(--muted); font-size: 0.75rem; flex-shrink: 0; }
2417
+ .pj-ov-sec { border: 1px solid var(--border); border-radius: 10px; background: var(--card); }
2418
+ .pj-ov-sec-head { display: flex; align-items: center; gap: 0.4rem; padding: 0.45rem 0.6rem; cursor: pointer; }
2419
+ .pj-ov-chevron { color: var(--muted); font-size: 0.8rem; width: 1em; flex-shrink: 0; }
2420
+ .pj-ov-name { font-weight: 600; color: var(--text); font-size: 0.95rem; }
2421
+ .pj-ov-name-link { border: 0; background: none; cursor: pointer; padding: 0; text-align: left; }
2422
+ .pj-ov-spacer { flex: 1; }
2423
+ .pj-ov-items { display: flex; flex-direction: column; gap: 0.1rem; padding: 0 0.6rem 0.5rem 1.5rem; }
2424
+ .pj-ov-row { display: flex; align-items: center; gap: 0.5rem; border: 1px solid var(--border); border-radius: 10px; background: var(--card); padding: 0.35rem 0.6rem; }
2425
+ .pj-ov-row .pj-ov-name { flex-shrink: 0; }
2426
+ .pj-ov-item { display: flex; align-items: center; gap: 0.45rem; width: 100%; padding: 0.25rem 0.3rem; border: 0; background: none; border-radius: 6px; cursor: pointer; text-align: left; font-size: 0.88rem; color: var(--text); min-width: 0; }
2427
+ .pj-ov-item:hover { background: var(--bg-dim); }
2428
+ .pj-ov-item-title { flex-shrink: 0; max-width: 60%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2429
+ .pj-ov-preview { color: var(--muted); font-size: 0.8rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
2430
+ .pj-ov-more { border: 0; background: none; color: var(--accent); cursor: pointer; text-align: left; padding: 0.25rem 0.3rem; font-size: 0.85rem; }
2431
+ .pj-ov-more:hover { text-decoration: underline; }
2432
+ .pj-ov-doc-inline { border-top: 1px solid var(--border); margin: 0.2rem 0 0.4rem; padding-top: 0.4rem; }
2433
+ /* Unseen-changes badge on workspace tabs — neutral gray pill (red is reserved for errors). */
2434
+ .pj-org-tab-unseen { background: var(--bg-dim); color: var(--muted); border: 1px solid var(--border); border-radius: 999px; font-size: 0.68rem; padding: 0 0.35rem; margin-left: 0.3rem; line-height: 1.3; }
2435
+ @media (max-width: 640px) {
2436
+ .pj-ov-event { flex-wrap: wrap; } /* "what/where" wraps to its own line — never hidden */
2437
+ .pj-ov-event-what { flex-basis: 100%; padding-left: calc(9px + 0.45rem); }
2438
+ .pj-ov-item { flex-wrap: wrap; }
2439
+ .pj-ov-item-title { max-width: none; flex-shrink: 1; white-space: normal; }
2440
+ .pj-ov-preview { flex-basis: 100%; }
2441
+ }
2442
+
2340
2443
  /* ───────────────── Organisms list renew (phase 1) ─────────────────
2341
2444
  * Compact list rows + kebab menu + organism home page. All colors via theme tokens. */
2342
2445
 
@@ -2441,8 +2544,50 @@
2441
2544
  .pj-stat-btn.active { background: var(--bg-dim); color: var(--text); }
2442
2545
  .pj-ws-person { display: flex; align-items: center; gap: 0.4rem; padding: 0.2rem 0; font-size: 0.83rem; color: var(--text); }
2443
2546
  .pj-ws-person-agents { font-size: 0.76rem; color: var(--muted); }
2444
-
2445
- /* ── Settings polish: menu divider, bounded form card ── */
2446
- .pj-menu-sep { height: 1px; background: var(--border); margin: 0.25rem 0.3rem; }
2447
- .pj-form-card { border: 1px solid var(--border); border-radius: 10px; background: var(--card); padding: 0.75rem 0.9rem 0.6rem; margin-bottom: 0.25rem; }
2547
+
2548
+ /* ── Settings polish: menu divider, bounded form card ── */
2549
+ .pj-menu-sep { height: 1px; background: var(--border); margin: 0.25rem 0.3rem; }
2550
+ .pj-form-card { border: 1px solid var(--border); border-radius: 10px; background: var(--card); padding: 0.75rem 0.9rem 0.6rem; margin-bottom: 0.25rem; }
2448
2551
  .pj-form-card .pj-form-group:first-child { margin-top: 0; }
2552
+
2553
+ /* ── Home dashboard: waiting-for-you box, continue/agents cards, clickable stats, promo dismiss ── */
2554
+ .pf-waiting { border: 1px solid var(--warn-border, var(--border)); border-left: 3px solid var(--warn, var(--accent)); border-radius: 12px; background: var(--card); padding: 0.8rem 1rem; margin: 1rem 0; }
2555
+ .pf-waiting-title { font-size: 0.78rem; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--warn-fg, var(--text-dim)); margin-bottom: 0.5rem; }
2556
+ .pf-waiting-row { display: flex; align-items: center; gap: 0.75rem; padding: 0.35rem 0; }
2557
+ .pf-waiting-row + .pf-waiting-row { border-top: 1px solid var(--border-subtle, var(--border)); }
2558
+ .pf-waiting-text { flex: 1; font-size: 0.88rem; color: var(--text-dim); }
2559
+ .pf-waiting-text b { font-weight: 600; color: var(--text); }
2560
+ .pf-waiting-where { color: var(--muted); }
2561
+ .pf-home-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; margin: 1rem 0; }
2562
+ @media (max-width: 760px) { .pf-home-grid { grid-template-columns: 1fr; } }
2563
+ .pf-home-card { border: 1px solid var(--border); border-radius: 12px; background: var(--card); padding: 0.8rem 1rem; }
2564
+ .pf-home-card-title { font-size: 0.78rem; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--text-dim); margin-bottom: 0.5rem; background: none; border: none; padding: 0; text-align: left; }
2565
+ .pf-home-card-link { cursor: pointer; }
2566
+ .pf-home-card-link:hover { color: var(--text); }
2567
+ .pf-home-card-note { font-weight: 500; text-transform: none; letter-spacing: 0; color: var(--muted); }
2568
+ .pf-home-row { display: flex; align-items: center; gap: 0.55rem; width: 100%; background: none; border: none; padding: 0.32rem 0.2rem; border-radius: 8px; cursor: pointer; font-size: 0.88rem; color: var(--text-dim); text-align: left; }
2569
+ .pf-home-row:hover { background: var(--bg-surface); color: var(--text); }
2570
+ .pf-home-row-static { cursor: default; }
2571
+ .pf-home-row-static:hover { background: none; color: var(--text-dim); }
2572
+ .pf-home-row-ico { flex: none; }
2573
+ .pf-home-row-label { flex: 1; font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2574
+ .pf-home-row-meta { flex: none; font-size: 0.78rem; color: var(--muted); }
2575
+ .pf-home-row-meta.pf-ok { color: var(--success-fg, var(--text)); }
2576
+ .pf-lp-stat-link { background: none; border: none; padding: 0.15rem 0.35rem; border-radius: 8px; cursor: pointer; font: inherit; color: inherit; }
2577
+ .pf-lp-stat-link:hover { background: var(--bg-surface); }
2578
+ .pf-lp-profile-btn { margin-left: auto; align-self: flex-start; }
2579
+ .pf-promo-dismiss { float: right; background: none; border: none; cursor: pointer; color: var(--muted); font-size: 0.85rem; padding: 0 0.2rem; }
2580
+ .pf-promo-dismiss:hover { color: var(--text); }
2581
+ /* Edit profile / password dialogs */
2582
+ .pf-avatar-row { display: flex; align-items: center; gap: 0.6rem; }
2583
+ .pf-avatar-preview { width: 42px; height: 42px; border-radius: 50%; border: 1px solid var(--border); background: var(--bg-dim); display: inline-flex; align-items: center; justify-content: center; font-size: 1.3rem; flex: none; }
2584
+ .pf-edit-link { font-size: 0.82rem; color: var(--accent); cursor: pointer; text-decoration: none; }
2585
+ .pf-edit-link:hover { text-decoration: underline; }
2586
+ .pf-edit-footer-left { margin-right: auto; }
2587
+ .pf-pw-wrap { position: relative; }
2588
+ .pf-pw-wrap .pf-edit-input { padding-right: 4.2rem; }
2589
+ .pf-pw-eye { position: absolute; right: 0.5rem; top: 50%; transform: translateY(-50%); background: none; border: none; cursor: pointer; color: var(--muted); font-size: 0.76rem; padding: 0.15rem 0.3rem; }
2590
+ .pf-pw-eye:hover { color: var(--text); }
2591
+ .pf-pw-rules { list-style: none; margin: 0.1rem 0 0.5rem; padding: 0; font-size: 0.78rem; color: var(--muted); }
2592
+ .pf-pw-rules li { padding: 0.08rem 0; }
2593
+ .pf-pw-rules li.ok { color: var(--success-fg, var(--text)); }