aimeat 1.30.2 → 1.32.0

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 (192) hide show
  1. package/dist/locales/en.json +246 -1
  2. package/dist/locales/fi.json +246 -1
  3. package/dist/public/components/InboxLink.js +29 -0
  4. package/dist/public/components/offer-card-view.js +87 -0
  5. package/dist/public/css/views/companies.css +65 -0
  6. package/dist/public/css/views/inbox.css +153 -1
  7. package/dist/public/css/views/members.css +33 -0
  8. package/dist/public/css/views/my-company.css +315 -0
  9. package/dist/public/css/views/profile.css +22 -0
  10. package/dist/public/js/services/messages.js +21 -3
  11. package/dist/public/js/services/notebook.js +16 -6
  12. package/dist/public/llms-template.txt +7 -0
  13. package/dist/public/spa.html +14 -0
  14. package/dist/public/views/companies.js +190 -0
  15. package/dist/public/views/members.js +42 -0
  16. package/dist/public/views/my-company.js +664 -0
  17. package/dist/public/views/portfolio-themes.js +77 -0
  18. package/dist/public/views/profile/agents-tab.js +4 -1
  19. package/dist/public/views/profile/discover-tab.js +118 -0
  20. package/dist/public/views/profile/inbox-tab.js +663 -16
  21. package/dist/public/views/profile/landing-page.js +2 -1
  22. package/dist/public/views/profile/notebook-card.js +11 -3
  23. package/dist/public/views/profile/offers-tab.js +5 -24
  24. package/dist/public/views/profile/organisms/home.js +5 -3
  25. package/dist/public/views/profile/organisms/mindmap.js +14 -3
  26. package/dist/public/views/profile/organisms/workspace.js +5 -2
  27. package/dist/public/views/profile/organisms-tab.js +12 -4
  28. package/dist/public/views/profile.js +2 -0
  29. package/dist/src/cli/connect/mcp/tools/core.d.ts.map +1 -1
  30. package/dist/src/cli/connect/mcp/tools/core.js +34 -0
  31. package/dist/src/cli/connect/mcp/tools/core.js.map +1 -1
  32. package/dist/src/cli/connect/mcp/tools/dm-messages.d.ts +1 -0
  33. package/dist/src/cli/connect/mcp/tools/dm-messages.d.ts.map +1 -1
  34. package/dist/src/cli/connect/mcp/tools/dm-messages.js +23 -0
  35. package/dist/src/cli/connect/mcp/tools/dm-messages.js.map +1 -1
  36. package/dist/src/cli/connect/mcp/tools/organisms.d.ts.map +1 -1
  37. package/dist/src/cli/connect/mcp/tools/organisms.js +31 -0
  38. package/dist/src/cli/connect/mcp/tools/organisms.js.map +1 -1
  39. package/dist/src/cli/connect/mcp/tools/workspaces.d.ts.map +1 -1
  40. package/dist/src/cli/connect/mcp/tools/workspaces.js +4 -0
  41. package/dist/src/cli/connect/mcp/tools/workspaces.js.map +1 -1
  42. package/dist/src/generated/api-types.d.ts +249 -0
  43. package/dist/src/generated/api-types.d.ts.map +1 -1
  44. package/dist/src/generated/prisma-postgres/edge.js +6 -3
  45. package/dist/src/generated/prisma-postgres/index-browser.js +3 -0
  46. package/dist/src/generated/prisma-postgres/index.d.ts +112 -1
  47. package/dist/src/generated/prisma-postgres/index.js +6 -3
  48. package/dist/src/generated/prisma-postgres/package.json +1 -1
  49. package/dist/src/generated/prisma-postgres/schema.prisma +4 -0
  50. package/dist/src/generated/prisma-postgres/wasm.js +6 -3
  51. package/dist/src/mcp/annotations.d.ts.map +1 -1
  52. package/dist/src/mcp/annotations.js +2 -0
  53. package/dist/src/mcp/annotations.js.map +1 -1
  54. package/dist/src/mcp/catalog/definitions.d.ts.map +1 -1
  55. package/dist/src/mcp/catalog/definitions.js +33 -1
  56. package/dist/src/mcp/catalog/definitions.js.map +1 -1
  57. package/dist/src/mcp/catalog/scopes.d.ts.map +1 -1
  58. package/dist/src/mcp/catalog/scopes.js +1 -0
  59. package/dist/src/mcp/catalog/scopes.js.map +1 -1
  60. package/dist/src/mcp/catalog/surfaces.d.ts.map +1 -1
  61. package/dist/src/mcp/catalog/surfaces.js +7 -4
  62. package/dist/src/mcp/catalog/surfaces.js.map +1 -1
  63. package/dist/src/mcp/core.d.ts.map +1 -1
  64. package/dist/src/mcp/core.js +49 -0
  65. package/dist/src/mcp/core.js.map +1 -1
  66. package/dist/src/mcp/dm-messages.d.ts +2 -0
  67. package/dist/src/mcp/dm-messages.d.ts.map +1 -1
  68. package/dist/src/mcp/dm-messages.js +45 -1
  69. package/dist/src/mcp/dm-messages.js.map +1 -1
  70. package/dist/src/models/message-schemas.d.ts +140 -2
  71. package/dist/src/models/message-schemas.d.ts.map +1 -1
  72. package/dist/src/models/message-schemas.js +60 -3
  73. package/dist/src/models/message-schemas.js.map +1 -1
  74. package/dist/src/routes/bootstrap.d.ts.map +1 -1
  75. package/dist/src/routes/bootstrap.js +3 -0
  76. package/dist/src/routes/bootstrap.js.map +1 -1
  77. package/dist/src/routes/discover.d.ts +22 -0
  78. package/dist/src/routes/discover.d.ts.map +1 -0
  79. package/dist/src/routes/discover.js +123 -0
  80. package/dist/src/routes/discover.js.map +1 -0
  81. package/dist/src/routes/federation-sync.d.ts.map +1 -1
  82. package/dist/src/routes/federation-sync.js +69 -2
  83. package/dist/src/routes/federation-sync.js.map +1 -1
  84. package/dist/src/routes/messages.d.ts.map +1 -1
  85. package/dist/src/routes/messages.js +102 -3
  86. package/dist/src/routes/messages.js.map +1 -1
  87. package/dist/src/routes/organisms.d.ts +3 -0
  88. package/dist/src/routes/organisms.d.ts.map +1 -1
  89. package/dist/src/routes/organisms.js +11 -32
  90. package/dist/src/routes/organisms.js.map +1 -1
  91. package/dist/src/routes/portal.d.ts.map +1 -1
  92. package/dist/src/routes/portal.js +3 -0
  93. package/dist/src/routes/portal.js.map +1 -1
  94. package/dist/src/routes/portfolio.d.ts.map +1 -1
  95. package/dist/src/routes/portfolio.js +30 -0
  96. package/dist/src/routes/portfolio.js.map +1 -1
  97. package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
  98. package/dist/src/server-bootstrap/routes-loader.js +2 -0
  99. package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
  100. package/dist/src/services/connect-tunnel.d.ts +3 -0
  101. package/dist/src/services/connect-tunnel.d.ts.map +1 -1
  102. package/dist/src/services/connect-tunnel.js +6 -0
  103. package/dist/src/services/connect-tunnel.js.map +1 -1
  104. package/dist/src/services/discovery/__tests__/discovery.test.d.ts +2 -0
  105. package/dist/src/services/discovery/__tests__/discovery.test.d.ts.map +1 -0
  106. package/dist/src/services/discovery/__tests__/discovery.test.js +178 -0
  107. package/dist/src/services/discovery/__tests__/discovery.test.js.map +1 -0
  108. package/dist/src/services/discovery/classify.d.ts +36 -0
  109. package/dist/src/services/discovery/classify.d.ts.map +1 -0
  110. package/dist/src/services/discovery/classify.js +61 -0
  111. package/dist/src/services/discovery/classify.js.map +1 -0
  112. package/dist/src/services/discovery/facets.d.ts +21 -0
  113. package/dist/src/services/discovery/facets.d.ts.map +1 -0
  114. package/dist/src/services/discovery/facets.js +0 -0
  115. package/dist/src/services/discovery/facets.js.map +1 -0
  116. package/dist/src/services/discovery/index.d.ts +22 -0
  117. package/dist/src/services/discovery/index.d.ts.map +1 -0
  118. package/dist/src/services/discovery/index.js +22 -0
  119. package/dist/src/services/discovery/index.js.map +1 -0
  120. package/dist/src/services/discovery/normalize.d.ts +25 -0
  121. package/dist/src/services/discovery/normalize.d.ts.map +1 -0
  122. package/dist/src/services/discovery/normalize.js +108 -0
  123. package/dist/src/services/discovery/normalize.js.map +1 -0
  124. package/dist/src/services/discovery/registry.d.ts +30 -0
  125. package/dist/src/services/discovery/registry.d.ts.map +1 -0
  126. package/dist/src/services/discovery/registry.js +31 -0
  127. package/dist/src/services/discovery/registry.js.map +1 -0
  128. package/dist/src/services/discovery/run.d.ts +23 -0
  129. package/dist/src/services/discovery/run.d.ts.map +1 -0
  130. package/dist/src/services/discovery/run.js +20 -0
  131. package/dist/src/services/discovery/run.js.map +1 -0
  132. package/dist/src/services/discovery/setup.d.ts +16 -0
  133. package/dist/src/services/discovery/setup.d.ts.map +1 -0
  134. package/dist/src/services/discovery/setup.js +12 -0
  135. package/dist/src/services/discovery/setup.js.map +1 -0
  136. package/dist/src/services/discovery/sources/memory-source.d.ts +24 -0
  137. package/dist/src/services/discovery/sources/memory-source.d.ts.map +1 -0
  138. package/dist/src/services/discovery/sources/memory-source.js +183 -0
  139. package/dist/src/services/discovery/sources/memory-source.js.map +1 -0
  140. package/dist/src/services/discovery/sources/table-sources.d.ts +27 -0
  141. package/dist/src/services/discovery/sources/table-sources.d.ts.map +1 -0
  142. package/dist/src/services/discovery/sources/table-sources.js +128 -0
  143. package/dist/src/services/discovery/sources/table-sources.js.map +1 -0
  144. package/dist/src/services/discovery/types.d.ts +117 -0
  145. package/dist/src/services/discovery/types.d.ts.map +1 -0
  146. package/dist/src/services/discovery/types.js +19 -0
  147. package/dist/src/services/discovery/types.js.map +1 -0
  148. package/dist/src/services/handbooks/agent.d.ts +1 -1
  149. package/dist/src/services/handbooks/agent.d.ts.map +1 -1
  150. package/dist/src/services/handbooks/agent.js +9 -3
  151. package/dist/src/services/handbooks/agent.js.map +1 -1
  152. package/dist/src/services/message-broadcast.d.ts +49 -0
  153. package/dist/src/services/message-broadcast.d.ts.map +1 -0
  154. package/dist/src/services/message-broadcast.js +116 -0
  155. package/dist/src/services/message-broadcast.js.map +1 -0
  156. package/dist/src/services/message-delivery.d.ts.map +1 -1
  157. package/dist/src/services/message-delivery.js +3 -0
  158. package/dist/src/services/message-delivery.js.map +1 -1
  159. package/dist/src/services/message-send.d.ts +9 -1
  160. package/dist/src/services/message-send.d.ts.map +1 -1
  161. package/dist/src/services/message-send.js +11 -5
  162. package/dist/src/services/message-send.js.map +1 -1
  163. package/dist/src/services/presence.d.ts +8 -0
  164. package/dist/src/services/presence.d.ts.map +1 -1
  165. package/dist/src/services/presence.js +38 -0
  166. package/dist/src/services/presence.js.map +1 -1
  167. package/dist/src/services/workspace-enrichment.d.ts +15 -5
  168. package/dist/src/services/workspace-enrichment.d.ts.map +1 -1
  169. package/dist/src/services/workspace-enrichment.js +52 -14
  170. package/dist/src/services/workspace-enrichment.js.map +1 -1
  171. package/dist/src/storage/interface.d.ts +49 -0
  172. package/dist/src/storage/interface.d.ts.map +1 -1
  173. package/dist/src/storage/providers/mongodb/index.d.ts +1 -0
  174. package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
  175. package/dist/src/storage/providers/mongodb/index.js +16 -0
  176. package/dist/src/storage/providers/mongodb/index.js.map +1 -1
  177. package/dist/src/storage/providers/sqlite/index.d.ts +1 -0
  178. package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
  179. package/dist/src/storage/providers/sqlite/index.js +3 -0
  180. package/dist/src/storage/providers/sqlite/index.js.map +1 -1
  181. package/dist/src/storage/providers/sqlite/repos/direct-message.d.ts +3 -0
  182. package/dist/src/storage/providers/sqlite/repos/direct-message.d.ts.map +1 -1
  183. package/dist/src/storage/providers/sqlite/repos/direct-message.js +15 -2
  184. package/dist/src/storage/providers/sqlite/repos/direct-message.js.map +1 -1
  185. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  186. package/dist/src/storage/providers/sqlite/schema.js +10 -0
  187. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  188. package/dist/src/storage/repositories/direct-message.repository.d.ts +3 -0
  189. package/dist/src/storage/repositories/direct-message.repository.d.ts.map +1 -1
  190. package/package.json +1 -1
  191. package/prisma/schema.postgres.prisma +4 -0
  192. package/prisma/schema.prisma +4 -0
@@ -0,0 +1,65 @@
1
+ /**
2
+ * @file companies.css
3
+ * @description Styles for the public company directory + company page view (cm- prefix). Two-column:
4
+ * directory list (left) + selected company's public profile + catalogue (right). Offer cards reuse
5
+ * the of-* classes from offers.css (preloaded). Theme.css variables only (dark-theme safe).
6
+ * @version-history v0.1.0 — 2026-06-23 — initial
7
+ */
8
+
9
+ .cm-container { max-width: 1100px; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
10
+ .cm-center { display: flex; justify-content: center; padding: 4rem 0; }
11
+ .cm-header { margin-bottom: 1.5rem; }
12
+ .cm-title { font-size: 1.8rem; font-weight: 700; color: var(--text-bright); margin: 0 0 0.4rem; }
13
+ .cm-desc { color: var(--text-dim); margin: 0; line-height: 1.5; }
14
+
15
+ .cm-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.5rem; max-width: 640px; margin: 1.5rem auto; }
16
+
17
+ .cm-grid { display: grid; grid-template-columns: 320px 1fr; gap: 1.5rem; align-items: start; }
18
+ @media (max-width: 760px) { .cm-grid { grid-template-columns: 1fr; } }
19
+
20
+ .cm-col { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.25rem; }
21
+ .cm-col-title { font-size: 1.1rem; font-weight: 600; color: var(--text); margin: 0 0 0.75rem; }
22
+ .cm-empty { color: var(--text-muted); font-style: italic; margin: 0.5rem 0 1rem; }
23
+ .cm-mini { color: var(--text-muted); font-size: 0.78rem; }
24
+ .cm-form-title { font-size: 0.95rem; font-weight: 600; color: var(--text); margin: 0.5rem 0 0.5rem; }
25
+
26
+ .cm-dir-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.4rem; }
27
+ .cm-dir-item {
28
+ width: 100%; text-align: left; background: var(--bg-elevated); border: 1px solid var(--border);
29
+ border-radius: var(--radius-sm); padding: 0.6rem 0.75rem; cursor: pointer;
30
+ display: flex; flex-direction: column; gap: 0.2rem; transition: border-color 0.15s, background 0.15s;
31
+ }
32
+ .cm-dir-item:hover { background: var(--bg-hover); }
33
+ .cm-dir-item.active { border-color: var(--accent); background: var(--accent-faint); }
34
+ .cm-dir-item { flex-direction: row; align-items: center; }
35
+ .cm-dir-logo { width: 36px; height: 36px; border-radius: var(--radius-sm); object-fit: cover; border: 1px solid var(--border); background: var(--bg-card); flex-shrink: 0; }
36
+ .cm-dir-text { display: flex; flex-direction: column; gap: 0.2rem; min-width: 0; }
37
+ .cm-dir-name { color: var(--text); font-weight: 600; }
38
+ .cm-dir-meta { color: var(--text-muted); font-size: 0.78rem; display: flex; align-items: center; gap: 0.4rem; flex-wrap: wrap; }
39
+ .cm-tag { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-full); padding: 0.05rem 0.45rem; font-size: 0.7rem; color: var(--text-dim); }
40
+
41
+ .cm-profile-head { display: flex; flex-direction: column; gap: 0.25rem; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border); }
42
+ .cm-profile-id { display: flex; align-items: center; gap: 0.85rem; }
43
+ .cm-profile-logo { width: 56px; height: 56px; border-radius: var(--radius-sm); object-fit: cover; border: 1px solid var(--border); background: var(--bg-elevated); }
44
+ .cm-profile-desc { color: var(--text-dim); margin: 0.3rem 0 0; line-height: 1.5; }
45
+ .cm-pf-link { align-self: flex-start; margin-top: 0.5rem; }
46
+
47
+ .cm-cat-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.6rem; }
48
+ .cm-cat-item { list-style: none; }
49
+ .cm-not-callable { color: var(--text-muted); font-size: 0.75rem; margin: 0.2rem 0; }
50
+
51
+ .cm-result { margin-top: 0.5rem; padding: 0.6rem 0.7rem; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-sm); }
52
+ .cm-result-msg { color: var(--text); font-size: 0.9rem; margin-bottom: 0.3rem; }
53
+ .cm-receipt { color: var(--accent-bright); font-size: 0.8rem; margin-top: 0.4rem; }
54
+
55
+ .cm-error { color: var(--danger); background: var(--danger-bg); border: 1px solid var(--danger-border); border-radius: var(--radius-sm); padding: 0.5rem 0.75rem; margin: 0.5rem 0; }
56
+
57
+ .cm-header-row { display: flex; justify-content: space-between; align-items: center; gap: 0.75rem; }
58
+ .cm-orders-panel { margin-bottom: 1.5rem; }
59
+ .cm-receipt-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.4rem; }
60
+ .cm-receipt-row { background: var(--bg-elevated); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 0.6rem 0.75rem; }
61
+ .cm-receipt-top { display: flex; justify-content: space-between; align-items: baseline; gap: 0.5rem; }
62
+ .cm-receipt-title { color: var(--text); font-weight: 600; }
63
+ .cm-receipt-amt { color: var(--accent-bright); font-weight: 600; white-space: nowrap; }
64
+ .cm-receipt-meta { display: flex; flex-wrap: wrap; gap: 0.6rem; color: var(--text-muted); font-size: 0.78rem; margin-top: 0.2rem; }
65
+ .cm-receipt-code { margin-top: 0.25rem; }
@@ -163,7 +163,9 @@
163
163
  }
164
164
 
165
165
  /* ── Right pane ── */
166
- .inbox-panel { display: flex; flex-direction: column; min-width: 0; height: 100%; }
166
+ /* min-height:0 lets this grid item respect the fixed .inbox-body height instead of growing to fit a tall
167
+ thread (grid/flex items default to min-height:auto = content size). */
168
+ .inbox-panel { display: flex; flex-direction: column; min-width: 0; min-height: 0; height: 100%; }
167
169
  .inbox-panel--empty { align-items: center; justify-content: center; }
168
170
 
169
171
  .inbox-empty { text-align: center; color: var(--text-dim); display: flex; flex-direction: column; align-items: center; gap: 8px; }
@@ -182,6 +184,7 @@
182
184
  /* Message scroll area. */
183
185
  .inbox-msgs {
184
186
  flex: 1;
187
+ min-height: 0; /* required so the flex child scrolls instead of growing past the composer */
185
188
  overflow-y: auto;
186
189
  padding: 16px;
187
190
  display: flex;
@@ -423,3 +426,152 @@
423
426
  .inbox-tracked-err { color: var(--danger); }
424
427
  .inbox-tracked-actions { display: flex; gap: 6px; flex-shrink: 0; }
425
428
  .inbox-tracked-done { color: var(--text-dim); font-size: 12px; padding: 8px 6px 2px; border-top: 1px solid var(--border); margin-top: 4px; }
429
+
430
+ /* ── Interactive messages (federated AskUserQuestion): the inline question form ── */
431
+ .inbox-iform {
432
+ margin-top: 10px;
433
+ display: flex;
434
+ flex-direction: column;
435
+ gap: 14px;
436
+ }
437
+ .inbox-iform-q { display: flex; flex-direction: column; gap: 6px; }
438
+ .inbox-iform-chip {
439
+ align-self: flex-start;
440
+ font-size: 11px;
441
+ font-weight: 600;
442
+ color: var(--accent);
443
+ background: var(--accent-subtle);
444
+ border: 1px solid var(--accent-border);
445
+ border-radius: var(--radius-full);
446
+ padding: 1px 8px;
447
+ }
448
+ .inbox-iform-prompt { font-weight: 600; font-size: 13px; }
449
+ .inbox-iform-req { color: var(--accent); }
450
+ .inbox-iform-opts { display: flex; flex-direction: column; gap: 6px; }
451
+ .inbox-iform-opt {
452
+ display: flex;
453
+ align-items: center;
454
+ gap: 9px;
455
+ padding: 8px 10px;
456
+ border: 1px solid var(--border);
457
+ border-radius: var(--radius-sm);
458
+ background: var(--card-bg);
459
+ cursor: pointer;
460
+ font-size: 13px;
461
+ transition: border-color 0.12s, background 0.12s;
462
+ }
463
+ .inbox-iform-opt:hover { border-color: var(--accent-border); }
464
+ .inbox-iform-opt--on { border-color: var(--accent); background: var(--accent-subtle); }
465
+ .inbox-iform-opt input { accent-color: var(--accent); flex-shrink: 0; }
466
+ .inbox-iform-opt-label { min-width: 0; }
467
+ .inbox-iform-other {
468
+ margin-top: 2px;
469
+ padding: 8px 10px;
470
+ border: 1px solid var(--border);
471
+ border-radius: var(--radius-sm);
472
+ background: var(--card-bg);
473
+ color: var(--text);
474
+ font-size: 13px;
475
+ }
476
+ .inbox-iform-other:focus { outline: none; border-color: var(--accent); }
477
+ .inbox-iform-submit { align-self: flex-start; margin-top: 2px; }
478
+
479
+ /* Read-only summary once the question has been answered. */
480
+ .inbox-iform--done { gap: 8px; }
481
+ .inbox-iform-answered { font-size: 13px; color: var(--text-dim); }
482
+
483
+ /* ── Broadcast / send-to-many compose ── */
484
+ .inbox-bc-mode { display: flex; gap: 8px; flex-wrap: wrap; }
485
+ .inbox-bc-modeopt {
486
+ display: flex; align-items: center; gap: 6px;
487
+ padding: 6px 10px; border: 1px solid var(--border); border-radius: var(--radius-sm);
488
+ background: var(--card-bg); cursor: pointer; font-size: 13px;
489
+ }
490
+ .inbox-bc-modeopt input { accent-color: var(--accent); }
491
+ .inbox-bc-modeopt--on { border-color: var(--accent); background: var(--accent-subtle); }
492
+ .inbox-bc-chips { display: flex; flex-wrap: wrap; gap: 6px; }
493
+ .inbox-bc-chip {
494
+ display: inline-flex; align-items: center; gap: 6px;
495
+ padding: 3px 6px 3px 10px; border: 1px solid var(--accent-border); border-radius: var(--radius-full);
496
+ background: var(--accent-subtle); font-size: 12px; max-width: 100%;
497
+ }
498
+ .inbox-bc-chip-x {
499
+ border: none; background: transparent; color: var(--text-dim); cursor: pointer;
500
+ font-size: 12px; line-height: 1; padding: 2px 4px; border-radius: var(--radius-full);
501
+ }
502
+ .inbox-bc-chip-x:hover { color: var(--danger); background: var(--card-bg); }
503
+ .inbox-bc-add { display: flex; gap: 8px; }
504
+ .inbox-bc-add .inbox-input { flex: 1; }
505
+ /* Operator audience select (all node / all federation users). */
506
+ .inbox-bc-audience--on { border-color: var(--accent); background: var(--accent-subtle); }
507
+
508
+ /* Announcement note shown in place of the reply composer (read-only thread). */
509
+ .inbox-announce-note {
510
+ border-top: 1px solid var(--border-subtle);
511
+ padding: 12px 16px; color: var(--text-dim); font-size: 13px; text-align: center;
512
+ }
513
+
514
+ /* ── Poll builder (compose a poll broadcast) ── */
515
+ .inbox-poll-builder { display: flex; flex-direction: column; gap: 12px; }
516
+ .inbox-poll-q {
517
+ display: flex; flex-direction: column; gap: 8px;
518
+ border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 10px; background: var(--card-bg);
519
+ }
520
+ .inbox-poll-q-head { display: flex; align-items: center; gap: 8px; }
521
+ .inbox-poll-q-head .inbox-input { flex: 1; }
522
+ .inbox-poll-q-n { font-weight: 600; color: var(--text-dim); }
523
+ .inbox-poll-opts { display: flex; flex-direction: column; gap: 6px; padding-left: 12px; }
524
+ .inbox-poll-opt { display: flex; align-items: center; gap: 6px; }
525
+ .inbox-poll-opt .inbox-input { flex: 1; }
526
+ .inbox-poll-flags { display: flex; flex-wrap: wrap; gap: 12px; font-size: 12px; color: var(--text-dim); }
527
+ .inbox-poll-flags label { display: inline-flex; align-items: center; gap: 5px; cursor: pointer; }
528
+ .inbox-poll-flags input { accent-color: var(--accent); }
529
+
530
+ /* ── Broadcast / poll results ── */
531
+ .inbox-results-summary { font-size: 13px; color: var(--text-dim); padding-bottom: 8px; border-bottom: 1px solid var(--border-subtle); }
532
+ .inbox-results-q { display: flex; flex-direction: column; gap: 6px; padding: 10px 0; }
533
+ .inbox-results-prompt { font-weight: 600; font-size: 14px; }
534
+ .inbox-results-bar { display: flex; flex-direction: column; gap: 3px; }
535
+ .inbox-results-bar-label { display: flex; justify-content: space-between; font-size: 13px; }
536
+ .inbox-results-bar-track { height: 8px; border-radius: var(--radius-full); background: var(--card-bg-alt); overflow: hidden; }
537
+ .inbox-results-bar-fill { height: 100%; width: var(--w, 0%); background: var(--accent); border-radius: var(--radius-full); transition: width 0.3s; }
538
+ .inbox-results-others { font-size: 12px; color: var(--text-dim); }
539
+ .inbox-results-reclist { display: flex; flex-direction: column; gap: 4px; padding-top: 8px; }
540
+ .inbox-results-rec { display: flex; justify-content: space-between; font-size: 13px; color: var(--text-dim); }
541
+
542
+ /* ── Agent capabilities in chat: command chips + fill-in form (Phase A) ── */
543
+ .inbox-cmdbar {
544
+ display: flex; align-items: center; flex-wrap: wrap; gap: 6px;
545
+ padding: 8px 12px; border-top: 1px solid var(--border-subtle);
546
+ }
547
+ .inbox-cmdbar-label { font-size: 12px; color: var(--text-dim); margin-right: 2px; }
548
+ .inbox-cmd-chip {
549
+ border: 1px solid var(--accent-border); background: var(--accent-subtle); color: var(--text);
550
+ font-size: 12px; padding: 4px 10px; border-radius: var(--radius-full); cursor: pointer;
551
+ }
552
+ .inbox-cmd-chip:hover { border-color: var(--accent); }
553
+ .inbox-cmdfill {
554
+ display: flex; flex-direction: column; gap: 8px;
555
+ padding: 10px 12px; border-top: 1px solid var(--border-subtle); background: var(--card-bg-alt);
556
+ }
557
+ .inbox-cmdfill-head { display: flex; align-items: center; justify-content: space-between; font-weight: 600; font-size: 13px; }
558
+ .inbox-cmdfill-desc { font-size: 12px; color: var(--text-dim); }
559
+ .inbox-cmdfill-field { display: flex; flex-direction: column; gap: 3px; }
560
+ .inbox-cmdfill-pname { font-size: 12px; color: var(--text-dim); }
561
+ .inbox-cmdfill-go { align-self: flex-start; }
562
+
563
+ /* ── Agent schedule panel (Phase B — own agents only) ── */
564
+ .inbox-sched-btn { margin-left: auto; }
565
+ .inbox-sched-btn--on { background: var(--accent-subtle); border-color: var(--accent); }
566
+ .inbox-sched {
567
+ display: flex; flex-direction: column; gap: 10px;
568
+ padding: 10px 12px; border-top: 1px solid var(--border-subtle); background: var(--card-bg-alt);
569
+ }
570
+ .inbox-sched-head { display: flex; align-items: center; justify-content: space-between; font-weight: 600; font-size: 13px; }
571
+ .inbox-sched-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }
572
+ .inbox-sched-item { display: flex; justify-content: space-between; gap: 8px; font-size: 13px; }
573
+ .inbox-sched-name { color: var(--text); }
574
+ .inbox-sched-cron { color: var(--text-dim); font-family: var(--font-mono, monospace); font-size: 12px; }
575
+ .inbox-sched-new { display: flex; flex-direction: column; gap: 6px; }
576
+ .inbox-sched-new .btn-primary { align-self: flex-start; }
577
+ .inbox-sched-desc { min-height: 38px; resize: vertical; }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * @file members.css
3
+ * @description Node members showcase grid (published-portfolio owners). Card grid with avatar + name +
4
+ * bio, linking to each member's portfolio.
5
+ * @version-history
6
+ * v1.0.0 — 2026-06-23 — Initial.
7
+ */
8
+ .mbr { max-width: 1100px; margin: 0 auto; padding: 24px 16px; }
9
+ .mbr-title { font-size: 1.6rem; margin: 0 0 6px; }
10
+ .mbr-desc { color: var(--text-dim); margin: 0 0 24px; }
11
+ .mbr-empty { color: var(--text-dim); text-align: center; padding: 40px; }
12
+ .mbr-grid {
13
+ display: grid;
14
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
15
+ gap: 16px;
16
+ }
17
+ .mbr-card {
18
+ display: flex; flex-direction: column; align-items: center; gap: 8px; text-align: center;
19
+ padding: 20px 14px; border: 1px solid var(--card-border, var(--border)); border-radius: var(--radius-md, 12px);
20
+ background: var(--card-bg); text-decoration: none; color: inherit;
21
+ transition: border-color 0.12s, transform 0.12s;
22
+ }
23
+ .mbr-card:hover { border-color: var(--accent); transform: translateY(-2px); }
24
+ .mbr-avatar {
25
+ width: 64px; height: 64px; border-radius: var(--radius-full, 50%);
26
+ display: flex; align-items: center; justify-content: center;
27
+ font-size: 32px; background: var(--accent-subtle); border: 1px solid var(--accent-border);
28
+ }
29
+ .mbr-name { font-weight: 600; }
30
+ .mbr-bio {
31
+ font-size: 13px; color: var(--text-dim);
32
+ display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
33
+ }
@@ -0,0 +1,315 @@
1
+ /**
2
+ * @file my-company.css
3
+ * @description Styles for the "Yritykseni" (My Company) view (mc- prefix). Two-column layout:
4
+ * company list + create form (left), selected-company offerings + add form + org wallet (right).
5
+ * Uses theme.css variables only (dark-theme safe).
6
+ * @version-history v0.1.0 — 2026-06-23 — initial
7
+ */
8
+
9
+ .mc-container {
10
+ max-width: 1100px;
11
+ margin: 0 auto;
12
+ padding: 2rem 1.25rem 4rem;
13
+ }
14
+
15
+ .mc-center {
16
+ display: flex;
17
+ justify-content: center;
18
+ padding: 4rem 0;
19
+ }
20
+
21
+ .mc-header { margin-bottom: 1.5rem; }
22
+
23
+ .mc-title {
24
+ font-size: 1.8rem;
25
+ font-weight: 700;
26
+ color: var(--text-bright);
27
+ margin: 0 0 0.4rem;
28
+ }
29
+
30
+ .mc-desc {
31
+ color: var(--text-dim);
32
+ margin: 0;
33
+ line-height: 1.5;
34
+ }
35
+
36
+ .mc-grid {
37
+ display: grid;
38
+ grid-template-columns: 340px 1fr;
39
+ gap: 1.5rem;
40
+ align-items: start;
41
+ }
42
+
43
+ @media (max-width: 760px) {
44
+ .mc-grid { grid-template-columns: 1fr; }
45
+ }
46
+
47
+ .mc-col {
48
+ background: var(--bg-card);
49
+ border: 1px solid var(--border);
50
+ border-radius: var(--radius);
51
+ padding: 1.25rem;
52
+ }
53
+
54
+ .mc-card {
55
+ background: var(--bg-card);
56
+ border: 1px solid var(--border);
57
+ border-radius: var(--radius);
58
+ padding: 1.5rem;
59
+ max-width: 640px;
60
+ margin: 1.5rem auto;
61
+ }
62
+
63
+ .mc-col-title {
64
+ font-size: 1.1rem;
65
+ font-weight: 600;
66
+ color: var(--text);
67
+ margin: 0 0 0.75rem;
68
+ }
69
+
70
+ .mc-empty {
71
+ color: var(--text-muted);
72
+ font-style: italic;
73
+ margin: 0.5rem 0 1rem;
74
+ }
75
+
76
+ .mc-org-list {
77
+ list-style: none;
78
+ margin: 0 0 1rem;
79
+ padding: 0;
80
+ display: flex;
81
+ flex-direction: column;
82
+ gap: 0.4rem;
83
+ }
84
+
85
+ .mc-org-item {
86
+ width: 100%;
87
+ text-align: left;
88
+ background: var(--bg-elevated);
89
+ border: 1px solid var(--border);
90
+ border-radius: var(--radius-sm);
91
+ padding: 0.6rem 0.75rem;
92
+ cursor: pointer;
93
+ display: flex;
94
+ flex-direction: column;
95
+ gap: 0.15rem;
96
+ transition: border-color 0.15s, background 0.15s;
97
+ }
98
+
99
+ .mc-org-item:hover { background: var(--bg-hover); }
100
+ .mc-org-item.active { border-color: var(--accent); background: var(--accent-faint); }
101
+
102
+ .mc-org-name { color: var(--text); font-weight: 600; }
103
+ .mc-org-meta { color: var(--text-muted); font-size: 0.78rem; }
104
+
105
+ .mc-form {
106
+ border-top: 1px solid var(--border);
107
+ margin-top: 1rem;
108
+ padding-top: 1rem;
109
+ display: flex;
110
+ flex-direction: column;
111
+ gap: 0.6rem;
112
+ }
113
+
114
+ .mc-form-title {
115
+ font-size: 0.95rem;
116
+ font-weight: 600;
117
+ color: var(--text);
118
+ margin: 0 0 0.25rem;
119
+ }
120
+
121
+ .mc-label {
122
+ display: flex;
123
+ flex-direction: column;
124
+ gap: 0.3rem;
125
+ color: var(--text-dim);
126
+ font-size: 0.85rem;
127
+ }
128
+
129
+ .mc-input {
130
+ background: var(--bg-input);
131
+ border: 1px solid var(--border);
132
+ border-radius: var(--radius-sm);
133
+ padding: 0.5rem 0.6rem;
134
+ color: var(--text);
135
+ font-size: 0.9rem;
136
+ }
137
+
138
+ .mc-input:focus {
139
+ outline: none;
140
+ border-color: var(--border-focus);
141
+ background: var(--bg-input-focus);
142
+ }
143
+
144
+ .mc-detail-head {
145
+ display: flex;
146
+ justify-content: space-between;
147
+ align-items: baseline;
148
+ flex-wrap: wrap;
149
+ gap: 0.5rem;
150
+ margin-bottom: 1rem;
151
+ }
152
+
153
+ .mc-wallet { color: var(--text-dim); font-size: 0.9rem; }
154
+ .mc-wallet strong { color: var(--accent-bright); }
155
+
156
+ .mc-off-list {
157
+ list-style: none;
158
+ margin: 0 0 1rem;
159
+ padding: 0;
160
+ display: flex;
161
+ flex-direction: column;
162
+ gap: 0.4rem;
163
+ }
164
+
165
+ .mc-off-item {
166
+ background: var(--bg-elevated);
167
+ border: 1px solid var(--border);
168
+ border-radius: var(--radius-sm);
169
+ padding: 0.75rem 0.85rem;
170
+ }
171
+
172
+ .mc-off-main { display: flex; flex-direction: column; gap: 0.4rem; }
173
+ .mc-off-row { display: flex; justify-content: space-between; align-items: baseline; gap: 0.5rem; }
174
+ .mc-off-title { color: var(--text); font-weight: 600; }
175
+ .mc-off-price { color: var(--accent-bright); font-weight: 600; white-space: nowrap; }
176
+ .mc-off-ask { color: var(--text-dim); font-size: 0.85rem; }
177
+ .mc-off-meta { display: flex; flex-wrap: wrap; gap: 0.35rem; }
178
+
179
+ .mc-chip {
180
+ background: var(--bg-card);
181
+ border: 1px solid var(--border);
182
+ border-radius: var(--radius-full);
183
+ padding: 0.1rem 0.55rem;
184
+ font-size: 0.72rem;
185
+ color: var(--text-dim);
186
+ }
187
+
188
+ .mc-use { display: flex; gap: 0.5rem; align-items: flex-end; margin-top: 0.3rem; }
189
+ .mc-use-input { flex: 1; resize: vertical; font-family: inherit; }
190
+
191
+ .mc-result {
192
+ margin-top: 0.5rem;
193
+ padding: 0.6rem 0.7rem;
194
+ background: var(--bg-card);
195
+ border: 1px solid var(--border);
196
+ border-radius: var(--radius-sm);
197
+ }
198
+ .mc-result-label { color: var(--text-muted); font-size: 0.75rem; margin-bottom: 0.3rem; }
199
+ .mc-result-msg { color: var(--text); font-size: 0.9rem; }
200
+ .mc-receipt { color: var(--accent-bright); font-size: 0.8rem; margin-top: 0.4rem; }
201
+ .mc-mini { color: var(--text-muted); font-size: 0.75rem; }
202
+
203
+ .mc-section-head { display: flex; justify-content: space-between; align-items: center; gap: 0.5rem; }
204
+
205
+ .mc-picker {
206
+ border: 1px dashed var(--border);
207
+ border-radius: var(--radius-sm);
208
+ padding: 0.75rem;
209
+ margin: 0.5rem 0 1rem;
210
+ background: var(--bg-card);
211
+ }
212
+ .mc-pick-hint { color: var(--text-dim); font-size: 0.85rem; margin: 0 0 0.6rem; }
213
+ .mc-pick-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.4rem; }
214
+ .mc-pick-item {
215
+ display: flex; justify-content: space-between; align-items: center; gap: 0.5rem;
216
+ background: var(--bg-elevated); border: 1px solid var(--border);
217
+ border-radius: var(--radius-sm); padding: 0.5rem 0.7rem;
218
+ }
219
+ .mc-listed { color: var(--success); font-size: 0.8rem; font-weight: 600; }
220
+ .mc-pick-agents { display: flex; flex-direction: column; gap: 0.75rem; }
221
+ .mc-pick-agent { border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 0.5rem 0.6rem; background: var(--bg-elevated); }
222
+ .mc-pick-agent-name { font-weight: 600; color: var(--text); font-size: 0.85rem; margin-bottom: 0.35rem; }
223
+ .mc-pick-none { color: var(--text-muted); }
224
+
225
+ .mc-manage { border: 1px dashed var(--border); border-radius: var(--radius-sm); padding: 0.5rem 0.6rem; margin: 0.4rem 0 0.6rem; }
226
+ .mc-manage-head { display: flex; justify-content: space-between; align-items: center; gap: 0.5rem; margin-bottom: 0.4rem; }
227
+ .mc-config { display: flex; flex-direction: column; gap: 0.2rem; color: var(--text-dim); font-size: 0.85rem; }
228
+ .mc-config b { color: var(--text); }
229
+ .mc-manage-row { align-items: center; gap: 0.4rem; }
230
+ .mc-price-input { width: 5rem; }
231
+ .mc-saved { color: var(--success); }
232
+ .mc-warn { color: var(--text-muted); }
233
+ .mc-remove { color: var(--danger); }
234
+
235
+ .mc-cat-item { list-style: none; margin-bottom: 0.6rem; }
236
+ .of-card-head--static { cursor: default; }
237
+ .mc-not-callable { color: var(--text-muted); font-size: 0.75rem; margin: 0.2rem 0; }
238
+
239
+ .mc-subtabs { display: flex; gap: 0.25rem; border-bottom: 1px solid var(--border); margin: 0.5rem 0 1rem; flex-wrap: wrap; }
240
+ .mc-subtab {
241
+ background: transparent; border: none; border-bottom: 2px solid transparent;
242
+ padding: 0.4rem 0.7rem; cursor: pointer; color: var(--text-dim); font-size: 0.9rem; font-weight: 600;
243
+ }
244
+ .mc-subtab:hover { color: var(--text); }
245
+ .mc-subtab.active { color: var(--accent-bright); border-bottom-color: var(--accent); }
246
+ .mc-role-chip { margin-left: auto; align-self: center; font-size: 0.72rem; font-weight: 600; color: var(--text-dim); background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-full); padding: 0.1rem 0.55rem; }
247
+
248
+ .mc-cust-list, .mc-member-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.4rem; }
249
+ .mc-cust { background: var(--bg-elevated); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 0.6rem 0.75rem; }
250
+ .mc-cust-head { display: flex; justify-content: space-between; align-items: baseline; gap: 0.5rem; }
251
+ .mc-cust-name { color: var(--text); font-weight: 600; }
252
+ .mc-cust-spend { color: var(--accent-bright); font-weight: 600; }
253
+ .mc-cust-meta { color: var(--text-muted); font-size: 0.78rem; margin: 0.2rem 0 0.4rem; }
254
+
255
+ .mc-member { display: flex; justify-content: space-between; align-items: center; gap: 0.5rem; background: var(--bg-elevated); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 0.5rem 0.7rem; }
256
+ .mc-member-name { color: var(--text); font-weight: 600; }
257
+
258
+ .mc-head-id { display: flex; align-items: center; gap: 0.75rem; }
259
+ .mc-head-logo { width: 44px; height: 44px; border-radius: var(--radius-sm); object-fit: cover; border: 1px solid var(--border); background: var(--bg-elevated); }
260
+ .mc-logo-row { display: flex; align-items: center; gap: 0.75rem; margin-top: 0.3rem; }
261
+ .mc-logo-preview { width: 56px; height: 56px; border-radius: var(--radius-sm); object-fit: cover; border: 1px solid var(--border); background: var(--bg-elevated); }
262
+ .mc-logo-empty { width: 56px; height: 56px; border-radius: var(--radius-sm); border: 1px dashed var(--border); display: flex; align-items: center; justify-content: center; color: var(--text-muted); font-size: 0.7rem; text-align: center; }
263
+ .mc-upload-btn { position: relative; overflow: hidden; cursor: pointer; }
264
+ .mc-file-hidden { position: absolute; inset: 0; opacity: 0; cursor: pointer; }
265
+ .mc-checkbox-row { display: flex; align-items: center; gap: 0.5rem; color: var(--text); font-size: 0.9rem; cursor: pointer; }
266
+
267
+ .mc-portfolio { display: flex; flex-direction: column; gap: 0.6rem; }
268
+ .mc-pf-live { background: var(--success-bg); border: 1px solid var(--success); border-radius: var(--radius-sm); padding: 0.6rem 0.75rem; display: flex; flex-direction: column; gap: 0.4rem; }
269
+ .mc-pf-prompt { font-family: var(--font-mono, monospace); font-size: 0.8rem; white-space: pre; }
270
+ .mc-pf-html { font-family: var(--font-mono, monospace); font-size: 0.8rem; }
271
+ .mc-theme-row { display: flex; flex-wrap: wrap; gap: 0.5rem; margin: 0.3rem 0 0.6rem; }
272
+ .mc-theme-btn { background: var(--bg-elevated); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 0.4rem 0.9rem; cursor: pointer; color: var(--text-dim); font-weight: 600; font-size: 0.85rem; transition: border-color 0.15s, color 0.15s; }
273
+ .mc-theme-btn:hover { color: var(--text); }
274
+ .mc-theme-btn.active { border-color: var(--accent); color: var(--accent-bright); background: var(--accent-faint); }
275
+
276
+ .mc-header-row { display: flex; justify-content: space-between; align-items: center; gap: 0.75rem; }
277
+
278
+ .mc-orders-received { border-top: 1px solid var(--border); margin-top: 1.25rem; padding-top: 1rem; }
279
+ .mc-order-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.4rem; }
280
+ .mc-order {
281
+ background: var(--bg-elevated); border: 1px solid var(--border);
282
+ border-radius: var(--radius-sm); padding: 0.6rem 0.75rem;
283
+ }
284
+ .mc-order-head { display: flex; justify-content: space-between; align-items: center; gap: 0.5rem; }
285
+ .mc-order-title { color: var(--text); font-weight: 600; }
286
+ .mc-order-meta { display: flex; flex-wrap: wrap; gap: 0.6rem; color: var(--text-muted); font-size: 0.78rem; margin-top: 0.2rem; }
287
+ .mc-order-input { color: var(--text-dim); font-size: 0.85rem; margin-top: 0.3rem; }
288
+ .mc-order-receipt { color: var(--accent-bright); font-size: 0.82rem; margin-top: 0.3rem; }
289
+
290
+ .mc-status { font-size: 0.72rem; font-weight: 600; padding: 0.1rem 0.55rem; border-radius: var(--radius-full); white-space: nowrap; }
291
+ .mc-status--queued { background: var(--bg-card); color: var(--text-dim); border: 1px solid var(--border); }
292
+ .mc-status--active { background: var(--accent-faint); color: var(--accent-bright); border: 1px solid var(--accent-border); }
293
+ .mc-status--done { background: var(--success-bg); color: var(--success); border: 1px solid var(--success); }
294
+ .mc-status--failed { background: var(--danger-bg); color: var(--danger); border: 1px solid var(--danger-border); }
295
+
296
+ .mc-error {
297
+ color: var(--danger);
298
+ background: var(--danger-bg);
299
+ border: 1px solid var(--danger-border);
300
+ border-radius: var(--radius-sm);
301
+ padding: 0.5rem 0.75rem;
302
+ margin: 0 0 1rem;
303
+ }
304
+
305
+ .mc-stub-badge {
306
+ display: inline-block;
307
+ background: var(--accent-faint);
308
+ color: var(--accent-bright);
309
+ border: 1px solid var(--accent-border);
310
+ border-radius: var(--radius-full);
311
+ padding: 0.2rem 0.7rem;
312
+ font-size: 0.78rem;
313
+ font-weight: 600;
314
+ margin: 0 0 0.75rem;
315
+ }
@@ -482,6 +482,7 @@
482
482
  .pf .scope-modal {max-width:560px}
483
483
  .pf .scope-modal h3 {margin-bottom:.25rem}
484
484
  .pf .scope-modal .scope-agent-info {color:var(--text-dim,#6B7280);font-size:.8rem;margin-bottom:1.25rem;font-family:monospace}
485
+ .pf .scope-agent-msg {margin-left:.5rem;text-decoration:none;font-family:initial}
485
486
  .pf .scope-templates {display:flex;gap:.5rem;flex-wrap:wrap;margin-bottom:1.25rem}
486
487
  .pf .scope-tpl-btn {flex:1;min-width:100px;padding:.6rem .75rem;background:var(--bg-card,#FFFFFF);border:1px solid var(--border,#E5E7EB);border-radius:8px;cursor:pointer;color:var(--text-dim,#6B7280);font-size:.8rem;font-weight:600;transition:all .2s;text-align:center}
487
488
  .pf .scope-tpl-btn:hover {color:var(--text,#1A1A2E);border-color:var(--accent,#E8564A)}
@@ -3027,3 +3028,24 @@
3027
3028
  .pf-presence-pill--on { background: var(--accent); border-color: var(--accent); color: #fff; }
3028
3029
  .pf-presence-pill:disabled { opacity: .6; cursor: default; }
3029
3030
  .pf-presence-hint { font-size: .78rem; color: var(--text-dim); margin: .15rem 0 .35rem; }
3031
+
3032
+ /* ── Discover tab (master directory) ───────────────────────────────────── */
3033
+ .dsc-controls { display: flex; flex-wrap: wrap; gap: .75rem; align-items: center; margin: 1rem 0 .75rem; }
3034
+ .dsc-scope { display: inline-flex; gap: .25rem; background: var(--bg-dim); border: 1px solid var(--border); border-radius: var(--radius-full); padding: .2rem; }
3035
+ .dsc-scope-btn { border-radius: var(--radius-full); padding: .3rem .85rem; font-size: .85rem; }
3036
+ .dsc-scope-active { background: var(--accent); color: #fff; }
3037
+ .dsc-search { flex: 1; min-width: 200px; padding: .5rem .75rem; background: var(--control-bg); border: 1px solid var(--control-border); border-radius: var(--radius); color: inherit; }
3038
+ .dsc-facets { display: flex; flex-wrap: wrap; gap: .4rem; margin-bottom: 1rem; }
3039
+ .dsc-facet { padding: .3rem .7rem; font-size: .82rem; background: var(--card); border: 1px solid var(--border); border-radius: var(--radius-full); cursor: pointer; color: inherit; }
3040
+ .dsc-facet:hover { border-color: var(--accent-border); }
3041
+ .dsc-facet-active { background: var(--accent-subtle); border-color: var(--accent-border); color: var(--accent); }
3042
+ .dsc-item { display: block; padding: .75rem .9rem; margin-bottom: .6rem; background: var(--card); border: 1px solid var(--border); border-radius: var(--radius); text-decoration: none; color: inherit; transition: border-color .12s; }
3043
+ .dsc-item:hover { border-color: var(--accent-border); box-shadow: var(--shadow-sm); }
3044
+ .dsc-item-head { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; }
3045
+ .dsc-type-badge { font-size: .72rem; text-transform: uppercase; letter-spacing: .03em; color: var(--accent); background: var(--accent-subtle); border: 1px solid var(--accent-border); border-radius: var(--radius-full); padding: .1rem .5rem; }
3046
+ .dsc-item-title { font-size: .98rem; }
3047
+ .dsc-segment { font-size: .75rem; color: var(--text-dim); background: var(--bg-dim); border-radius: var(--radius-full); padding: .1rem .5rem; }
3048
+ .dsc-item-desc { margin-top: .35rem; font-size: .87rem; color: var(--text-dim); overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
3049
+ .dsc-item-meta { margin-top: .5rem; display: flex; flex-wrap: wrap; align-items: center; gap: .35rem; }
3050
+ .dsc-tag { font-size: .72rem; color: var(--muted); background: var(--bg-dim); border-radius: var(--radius-full); padding: .08rem .45rem; }
3051
+ .dsc-owner { margin-left: auto; font-size: .72rem; color: var(--muted); font-family: var(--mono); }
@@ -10,20 +10,38 @@
10
10
  * @version-history
11
11
  * v1.0.0 -- 2026-06-16 -- Initial creation for user-to-user messaging (layer 5: Inbox tab).
12
12
  * v1.0.1 -- 2026-06-19 -- JSDoc type annotations for frontend type-checking
13
+ * v1.1.0 -- 2026-06-23 -- send() carries the optional `interactive` payload (federated AskUserQuestion).
13
14
  */
14
15
  import { api, apiGet } from '/js/api.js';
15
16
 
16
17
  const enc = encodeURIComponent;
17
18
 
18
19
  /** Send a direct message. `attachments` is an array of descriptors (storage_key, mime, size, kind, inline, id).
19
- * `subject` opens a new topic thread; `conversationId` continues a specific existing thread. */
20
- export async function send({ to, body, attachments, replyTo, subject, conversationId } = /** @type {{ to?: any, body?: any, attachments?: any, replyTo?: any, subject?: any, conversationId?: any }} */ ({})) {
20
+ * `subject` opens a new topic thread; `conversationId` continues a specific existing thread.
21
+ * `interactive` carries a structured AskUserQuestion payload (a `questions` spec or the human's `answers`). */
22
+ export async function send({ to, body, attachments, replyTo, subject, conversationId, interactive } = /** @type {{ to?: any, body?: any, attachments?: any, replyTo?: any, subject?: any, conversationId?: any, interactive?: any }} */ ({})) {
21
23
  return api('/v1/messages', {
22
24
  method: 'POST',
23
- body: JSON.stringify({ to, body, attachments, reply_to: replyTo, subject, conversation_id: conversationId }),
25
+ body: JSON.stringify({ to, body, attachments, reply_to: replyTo, subject, conversation_id: conversationId, interactive }),
24
26
  });
25
27
  }
26
28
 
29
+ /** Send one message to MANY recipients. `to` is an array of identities and/or `groupId` is a Share Group
30
+ * whose members are the audience. `mode` 'announcement' = read-only; 'broadcast' = repliable. `interactive`
31
+ * makes it a poll. Returns { broadcast_id, recipients, sent, failed }. */
32
+ export async function sendBroadcast({ to, groupId, audience, mode, body, attachments, interactive } = /** @type {{ to?: any, groupId?: any, audience?: any, mode?: any, body?: any, attachments?: any, interactive?: any }} */ ({})) {
33
+ return api('/v1/messages/broadcast', {
34
+ method: 'POST',
35
+ body: JSON.stringify({ to, group_id: groupId, audience, mode, body, attachments, interactive }),
36
+ });
37
+ }
38
+
39
+ /** Aggregated results for a broadcast (recipients, delivered/read/answered counts, poll answers). */
40
+ export async function getBroadcastResults(broadcastId) {
41
+ const r = await apiGet(`/v1/messages/broadcast/${enc(broadcastId)}`);
42
+ return r?.data || null;
43
+ }
44
+
27
45
  export async function listInbox(unreadOnly = false) {
28
46
  const r = await apiGet(`/v1/messages/inbox${unreadOnly ? '?unread=true' : ''}`);
29
47
  return r?.data || { messages: [], total: 0, unread: 0 };