aimeat 1.23.1 → 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 (173) hide show
  1. package/dist/locales/en.json +674 -125
  2. package/dist/locales/fi.json +712 -163
  3. package/dist/public/components/ContactCard.js +28 -0
  4. package/dist/public/css/theme.css +25 -10
  5. package/dist/public/css/views/admin.css +12 -0
  6. package/dist/public/css/views/agents-detail.css +62 -10
  7. package/dist/public/css/views/landing.css +87 -0
  8. package/dist/public/css/views/offers.css +96 -0
  9. package/dist/public/css/views/portfolio.css +18 -0
  10. package/dist/public/css/views/profile.css +216 -7
  11. package/dist/public/css/views/start.css +96 -0
  12. package/dist/public/img/business-hero.png +0 -0
  13. package/dist/public/img/toimitus.png +0 -0
  14. package/dist/public/js/components/tag-cloud.js +46 -31
  15. package/dist/public/js/components/tag-editor.js +2 -2
  16. package/dist/public/js/recents.js +40 -0
  17. package/dist/public/js/services/admin.js +6 -0
  18. package/dist/public/js/services/agents.js +34 -0
  19. package/dist/public/js/services/offers.js +152 -0
  20. package/dist/public/js/services/organisms.js +28 -5
  21. package/dist/public/js/services/packages.js +1 -0
  22. package/dist/public/spa.html +32 -2
  23. package/dist/public/views/admin/subdomains-tab.js +182 -0
  24. package/dist/public/views/admin.js +2 -0
  25. package/dist/public/views/business.js +119 -0
  26. package/dist/public/views/how-it-works.js +159 -0
  27. package/dist/public/views/landing.js +235 -0
  28. package/dist/public/views/portfolio.js +120 -23
  29. package/dist/public/views/pricing.js +75 -0
  30. package/dist/public/views/profile/access-tab.js +124 -51
  31. package/dist/public/views/profile/agents/agent-card.js +68 -37
  32. package/dist/public/views/profile/agents/shared-board.js +56 -22
  33. package/dist/public/views/profile/agents/tab-activity.js +24 -12
  34. package/dist/public/views/profile/agents/tab-agent-config.js +31 -1
  35. package/dist/public/views/profile/agents/tab-data-access.js +9 -13
  36. package/dist/public/views/profile/agents/tab-integration.js +27 -1
  37. package/dist/public/views/profile/agents/tab-messages.js +6 -11
  38. package/dist/public/views/profile/agents/tab-quality.js +45 -5
  39. package/dist/public/views/profile/agents-tab.js +41 -6
  40. package/dist/public/views/profile/apps-tab.js +7 -1
  41. package/dist/public/views/profile/knowledge-tab.js +4 -1
  42. package/dist/public/views/profile/landing-page.js +427 -123
  43. package/dist/public/views/profile/memory-tab.js +409 -211
  44. package/dist/public/views/profile/nodes-tab.js +18 -3
  45. package/dist/public/views/profile/offers-tab.js +310 -0
  46. package/dist/public/views/profile/organisms-tab.js +1330 -485
  47. package/dist/public/views/profile/packages-tab.js +152 -16
  48. package/dist/public/views/profile/portfolio-tab.js +98 -31
  49. package/dist/public/views/profile.js +2 -0
  50. package/dist/public/views/start-flows.js +281 -0
  51. package/dist/public/views/start.js +258 -0
  52. package/dist/src/cli/connect/mcp/tools/organisms.d.ts +3 -0
  53. package/dist/src/cli/connect/mcp/tools/organisms.d.ts.map +1 -1
  54. package/dist/src/cli/connect/mcp/tools/organisms.js +20 -3
  55. package/dist/src/cli/connect/mcp/tools/organisms.js.map +1 -1
  56. package/dist/src/cli/connect/tool-call.d.ts.map +1 -1
  57. package/dist/src/cli/connect/tool-call.js +20 -1
  58. package/dist/src/cli/connect/tool-call.js.map +1 -1
  59. package/dist/src/generated/api-types.d.ts +856 -17
  60. package/dist/src/generated/api-types.d.ts.map +1 -1
  61. package/dist/src/generated/prisma-postgres/edge.js +15 -3
  62. package/dist/src/generated/prisma-postgres/index-browser.js +12 -0
  63. package/dist/src/generated/prisma-postgres/index.d.ts +1476 -160
  64. package/dist/src/generated/prisma-postgres/index.js +15 -3
  65. package/dist/src/generated/prisma-postgres/package.json +1 -1
  66. package/dist/src/generated/prisma-postgres/schema.prisma +11 -0
  67. package/dist/src/generated/prisma-postgres/wasm.js +15 -3
  68. package/dist/src/mcp/organisms.d.ts +3 -0
  69. package/dist/src/mcp/organisms.d.ts.map +1 -1
  70. package/dist/src/mcp/organisms.js +18 -0
  71. package/dist/src/mcp/organisms.js.map +1 -1
  72. package/dist/src/middleware/subdomain.d.ts +28 -0
  73. package/dist/src/middleware/subdomain.d.ts.map +1 -0
  74. package/dist/src/middleware/subdomain.js +32 -0
  75. package/dist/src/middleware/subdomain.js.map +1 -0
  76. package/dist/src/models/offer-schemas.d.ts +229 -0
  77. package/dist/src/models/offer-schemas.d.ts.map +1 -0
  78. package/dist/src/models/offer-schemas.js +100 -0
  79. package/dist/src/models/offer-schemas.js.map +1 -0
  80. package/dist/src/routes/agent-tasks.d.ts.map +1 -1
  81. package/dist/src/routes/agent-tasks.js +33 -0
  82. package/dist/src/routes/agent-tasks.js.map +1 -1
  83. package/dist/src/routes/agents.d.ts.map +1 -1
  84. package/dist/src/routes/agents.js +146 -1
  85. package/dist/src/routes/agents.js.map +1 -1
  86. package/dist/src/routes/apps-backup.d.ts +20 -0
  87. package/dist/src/routes/apps-backup.d.ts.map +1 -0
  88. package/dist/src/routes/apps-backup.js +165 -0
  89. package/dist/src/routes/apps-backup.js.map +1 -0
  90. package/dist/src/routes/ghii.d.ts.map +1 -1
  91. package/dist/src/routes/ghii.js +4 -0
  92. package/dist/src/routes/ghii.js.map +1 -1
  93. package/dist/src/routes/instances.d.ts +2 -1
  94. package/dist/src/routes/instances.d.ts.map +1 -1
  95. package/dist/src/routes/instances.js +59 -1
  96. package/dist/src/routes/instances.js.map +1 -1
  97. package/dist/src/routes/organisms.d.ts.map +1 -1
  98. package/dist/src/routes/organisms.js +27 -5
  99. package/dist/src/routes/organisms.js.map +1 -1
  100. package/dist/src/routes/packages.d.ts.map +1 -1
  101. package/dist/src/routes/packages.js +32 -0
  102. package/dist/src/routes/packages.js.map +1 -1
  103. package/dist/src/routes/permissions.d.ts +12 -0
  104. package/dist/src/routes/permissions.d.ts.map +1 -1
  105. package/dist/src/routes/permissions.js +35 -3
  106. package/dist/src/routes/permissions.js.map +1 -1
  107. package/dist/src/routes/portal.d.ts +3 -0
  108. package/dist/src/routes/portal.d.ts.map +1 -1
  109. package/dist/src/routes/portal.js +12 -0
  110. package/dist/src/routes/portal.js.map +1 -1
  111. package/dist/src/routes/public-stats.d.ts +15 -0
  112. package/dist/src/routes/public-stats.d.ts.map +1 -0
  113. package/dist/src/routes/public-stats.js +90 -0
  114. package/dist/src/routes/public-stats.js.map +1 -0
  115. package/dist/src/routes/sse.d.ts +7 -2
  116. package/dist/src/routes/sse.d.ts.map +1 -1
  117. package/dist/src/routes/sse.js +35 -5
  118. package/dist/src/routes/sse.js.map +1 -1
  119. package/dist/src/routes/subdomains.d.ts +33 -0
  120. package/dist/src/routes/subdomains.d.ts.map +1 -0
  121. package/dist/src/routes/subdomains.js +208 -0
  122. package/dist/src/routes/subdomains.js.map +1 -0
  123. package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
  124. package/dist/src/server-bootstrap/routes-loader.js +12 -1
  125. package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
  126. package/dist/src/server.d.ts.map +1 -1
  127. package/dist/src/server.js +4 -0
  128. package/dist/src/server.js.map +1 -1
  129. package/dist/src/services/apps-backup-export.d.ts +22 -0
  130. package/dist/src/services/apps-backup-export.d.ts.map +1 -0
  131. package/dist/src/services/apps-backup-export.js +136 -0
  132. package/dist/src/services/apps-backup-export.js.map +1 -0
  133. package/dist/src/services/apps-backup-import.d.ts +120 -0
  134. package/dist/src/services/apps-backup-import.d.ts.map +1 -0
  135. package/dist/src/services/apps-backup-import.js +259 -0
  136. package/dist/src/services/apps-backup-import.js.map +1 -0
  137. package/dist/src/services/component-registrar.d.ts +17 -0
  138. package/dist/src/services/component-registrar.d.ts.map +1 -1
  139. package/dist/src/services/component-registrar.js +63 -5
  140. package/dist/src/services/component-registrar.js.map +1 -1
  141. package/dist/src/services/handbooks/appdev.d.ts +1 -1
  142. package/dist/src/services/handbooks/appdev.d.ts.map +1 -1
  143. package/dist/src/services/handbooks/appdev.js +5 -2
  144. package/dist/src/services/handbooks/appdev.js.map +1 -1
  145. package/dist/src/services/schema-validator.d.ts.map +1 -1
  146. package/dist/src/services/schema-validator.js +12 -0
  147. package/dist/src/services/schema-validator.js.map +1 -1
  148. package/dist/src/storage/interface.d.ts +11 -1
  149. package/dist/src/storage/interface.d.ts.map +1 -1
  150. package/dist/src/storage/interface.js.map +1 -1
  151. package/dist/src/storage/providers/mongodb/index.d.ts +10 -1
  152. package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
  153. package/dist/src/storage/providers/mongodb/index.js +76 -0
  154. package/dist/src/storage/providers/mongodb/index.js.map +1 -1
  155. package/dist/src/storage/providers/sqlite/index.d.ts +8 -1
  156. package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
  157. package/dist/src/storage/providers/sqlite/index.js +61 -0
  158. package/dist/src/storage/providers/sqlite/index.js.map +1 -1
  159. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  160. package/dist/src/storage/providers/sqlite/schema.js +11 -0
  161. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  162. package/dist/src/storage/repositories/index.d.ts +1 -0
  163. package/dist/src/storage/repositories/index.d.ts.map +1 -1
  164. package/dist/src/storage/repositories/package.repository.d.ts +2 -0
  165. package/dist/src/storage/repositories/package.repository.d.ts.map +1 -1
  166. package/dist/src/storage/repositories/subdomain-site.repository.d.ts +19 -0
  167. package/dist/src/storage/repositories/subdomain-site.repository.d.ts.map +1 -0
  168. package/dist/src/storage/repositories/subdomain-site.repository.js +2 -0
  169. package/dist/src/storage/repositories/subdomain-site.repository.js.map +1 -0
  170. package/dist/static/app-catalog.html +1139 -28
  171. package/package.json +1 -1
  172. package/prisma/schema.postgres.prisma +11 -0
  173. 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
+ }
@@ -10,6 +10,11 @@
10
10
  @usage Loaded first in spa.html <head>; the theme is toggled by /js/theme.js
11
11
  which flips the data-theme attribute on <html>.
12
12
  @version-history
13
+ v1.19.0 — 2026-06-10 — Controls get their own surface: new --control-bg/--control-border tokens
14
+ (light: white + gray-300; dark: raised #262934 + #4A4E5A). .btn-outline/.btn-ghost drop
15
+ background:transparent (they melted into the page as "framed text") and .input-field drops
16
+ background:var(--bg) (fields were LITERALLY the page color) — all three now use the control
17
+ tokens, buttons additionally get --shadow-sm so they read as pressable.
13
18
  v1.18.0 — 2026-06-02 — Component unification (#10 third toast pathway): tokenize the shared .toast color literals. Added a theme-invariant --toast-success-bg (green-500 #22C55E @ .95, the legacy toast green — deliberately NOT --success emerald, which would shift the hue), --toast-danger-bg (= --danger #EF4444 @ .95) and --toast-fg (white), same rationale as the badge palette. The base .toast and the .toast.error/.toast-error/.toast-success modifiers now reference these tokens instead of raw rgba()/#fff. Appearance-preserving: identical resolved values; solid saturated pills intentionally do not flip in dark mode. profile.js keeps its own showToast pathway (distinct .pf.toast-container wrapper + .toast.error markup) — left as a convergence candidate, NOT migrated, to avoid changing DOM/behavior.
14
19
  v1.17.0 — 2026-06-02 — Component unification (#26 recipient badge): add a theme-invariant --badge-*-bg palette (wildcard→danger, ghii→purple, organism→success, gaii→blue; domain #F97316 / node #6B7280 kept as own invariant swatches as they have no palette match) + --badge-fg white, so the profile .badge-* recipient classifier can drop its hardcoded hex (#8b5cf6/#f97316/#6b7280/#3b82f6) and dead light-only fallbacks (var(--success,#22c55e)/var(--danger,#ef4444)). Appearance-preserving: values resolve identically and these solid swatches intentionally do not flip in dark mode.
15
20
  v1.16.0 — 2026-06-02 — Component unification (#25 pill base): add a canonical token-only .pill shape primitive (inline-flex chip, --radius-full, compact padding, small bold text, pointer + opacity hover) — shape only, no colors; tints come from caller classes. Mirrors the shape the profile .vis-pill already used. The scoped .pf .vis-pill keeps its own shape declaration (the (0,2,0)-beats-bare-.pill specificity trap) but its radius was retokenized to the same --radius-full so the two stay in lockstep.
@@ -140,6 +145,12 @@
140
145
  --bg-input: var(--bg);
141
146
  --bg-input-focus: #FFFFFF;
142
147
 
148
+ /* Controls (outline/ghost buttons, input fields) — a surface DISTINCT from both the page bg and
149
+ white cards: white fill + a clearly visible border, so controls read as controls instead of
150
+ "framed text" that melts into the background. */
151
+ --control-bg: #FFFFFF;
152
+ --control-border: #D1D5DB;
153
+
143
154
  /* Code */
144
155
  --code-bg: #F3F4F6;
145
156
 
@@ -238,6 +249,10 @@
238
249
  --bg-input: #1C1E26;
239
250
  --bg-input-focus: #23262F;
240
251
 
252
+ /* Controls — slightly lighter than the card surface so they read as raised, with a visible border */
253
+ --control-bg: #262934;
254
+ --control-border: #4A4E5A;
255
+
241
256
  /* Code */
242
257
  --code-bg: #0E0F13;
243
258
 
@@ -603,8 +618,8 @@ a { color: inherit; text-decoration: none; }
603
618
 
604
619
  .btn-outline {
605
620
  padding: 0.65rem 1.5rem;
606
- background: transparent;
607
- border: 1px solid var(--border);
621
+ background: var(--control-bg);
622
+ border: 1px solid var(--control-border);
608
623
  border-radius: var(--radius-sm);
609
624
  color: var(--text-dim);
610
625
  font-size: 0.84rem;
@@ -613,15 +628,15 @@ a { color: inherit; text-decoration: none; }
613
628
  cursor: pointer;
614
629
  transition: all 0.15s;
615
630
  letter-spacing: 0;
616
- box-shadow: none;
631
+ box-shadow: var(--shadow-sm);
617
632
  animation: none;
618
633
  }
619
634
 
620
635
  .btn-outline:hover {
621
636
  border-color: var(--text-muted);
622
637
  color: var(--text);
623
- background: transparent;
624
- box-shadow: none;
638
+ background: var(--control-bg);
639
+ box-shadow: var(--shadow-sm);
625
640
  transform: none;
626
641
  }
627
642
 
@@ -680,8 +695,8 @@ a { color: inherit; text-decoration: none; }
680
695
  gap: 0.35rem;
681
696
  padding: 7px 16px;
682
697
  border-radius: var(--radius-sm);
683
- border: 1px solid var(--border);
684
- background: transparent;
698
+ border: 1px solid var(--control-border);
699
+ background: var(--control-bg);
685
700
  color: var(--text-dim);
686
701
  text-decoration: none;
687
702
  font-size: 0.81rem;
@@ -692,7 +707,7 @@ a { color: inherit; text-decoration: none; }
692
707
  .btn-ghost:hover {
693
708
  border-color: var(--text-muted);
694
709
  color: var(--text);
695
- background: transparent;
710
+ background: var(--control-bg);
696
711
  }
697
712
 
698
713
  /* ── Cards ── */
@@ -1040,8 +1055,8 @@ a { color: inherit; text-decoration: none; }
1040
1055
  .input-field {
1041
1056
  width: 100%;
1042
1057
  padding: 11px 14px;
1043
- background: var(--bg);
1044
- border: 1.5px solid var(--border);
1058
+ background: var(--control-bg);
1059
+ border: 1.5px solid var(--control-border);
1045
1060
  border-radius: var(--radius-sm);
1046
1061
  color: var(--text);
1047
1062
  font-family: var(--font);
@@ -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; }