aimeat 1.31.0 → 1.32.1

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 (217) hide show
  1. package/dist/locales/en.json +214 -2
  2. package/dist/locales/fi.json +214 -2
  3. package/dist/public/components/InboxLink.js +29 -0
  4. package/dist/public/css/views/companies.css +65 -0
  5. package/dist/public/css/views/inbox.css +100 -1
  6. package/dist/public/css/views/members.css +33 -0
  7. package/dist/public/css/views/my-company.css +52 -0
  8. package/dist/public/css/views/profile.css +66 -0
  9. package/dist/public/css/views/secretary.css +127 -0
  10. package/dist/public/js/services/messages.js +16 -0
  11. package/dist/public/js/services/notebook.js +16 -6
  12. package/dist/public/js/services/organisms.js +32 -0
  13. package/dist/public/llms-template.txt +12 -0
  14. package/dist/public/spa.html +31 -0
  15. package/dist/public/views/companies.js +190 -0
  16. package/dist/public/views/members.js +42 -0
  17. package/dist/public/views/my-company.js +440 -47
  18. package/dist/public/views/portfolio-themes.js +77 -0
  19. package/dist/public/views/profile/agents-tab.js +4 -1
  20. package/dist/public/views/profile/discover-tab.js +118 -0
  21. package/dist/public/views/profile/inbox-tab.js +506 -12
  22. package/dist/public/views/profile/landing-page.js +2 -1
  23. package/dist/public/views/profile/notebook-card.js +11 -3
  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 +211 -30
  27. package/dist/public/views/profile/organisms-tab.js +12 -4
  28. package/dist/public/views/profile.js +2 -0
  29. package/dist/public/views/secretary.js +75 -0
  30. package/dist/src/cli/connect/mcp/tools/core.d.ts.map +1 -1
  31. package/dist/src/cli/connect/mcp/tools/core.js +34 -0
  32. package/dist/src/cli/connect/mcp/tools/core.js.map +1 -1
  33. package/dist/src/cli/connect/mcp/tools/dm-messages.d.ts +1 -0
  34. package/dist/src/cli/connect/mcp/tools/dm-messages.d.ts.map +1 -1
  35. package/dist/src/cli/connect/mcp/tools/dm-messages.js +23 -0
  36. package/dist/src/cli/connect/mcp/tools/dm-messages.js.map +1 -1
  37. package/dist/src/cli/connect/mcp/tools/organisms.d.ts.map +1 -1
  38. package/dist/src/cli/connect/mcp/tools/organisms.js +31 -0
  39. package/dist/src/cli/connect/mcp/tools/organisms.js.map +1 -1
  40. package/dist/src/cli/connect/mcp/tools/workspaces.d.ts.map +1 -1
  41. package/dist/src/cli/connect/mcp/tools/workspaces.js +4 -0
  42. package/dist/src/cli/connect/mcp/tools/workspaces.js.map +1 -1
  43. package/dist/src/cli/connect/tool-call.d.ts.map +1 -1
  44. package/dist/src/cli/connect/tool-call.js +72 -0
  45. package/dist/src/cli/connect/tool-call.js.map +1 -1
  46. package/dist/src/generated/api-types.d.ts +236 -0
  47. package/dist/src/generated/api-types.d.ts.map +1 -1
  48. package/dist/src/generated/prisma-postgres/edge.js +5 -3
  49. package/dist/src/generated/prisma-postgres/index-browser.js +2 -0
  50. package/dist/src/generated/prisma-postgres/index.d.ts +89 -1
  51. package/dist/src/generated/prisma-postgres/index.js +5 -3
  52. package/dist/src/generated/prisma-postgres/package.json +1 -1
  53. package/dist/src/generated/prisma-postgres/schema.prisma +3 -0
  54. package/dist/src/generated/prisma-postgres/wasm.js +5 -3
  55. package/dist/src/mcp/annotations.d.ts.map +1 -1
  56. package/dist/src/mcp/annotations.js +1 -0
  57. package/dist/src/mcp/annotations.js.map +1 -1
  58. package/dist/src/mcp/catalog/definitions.d.ts.map +1 -1
  59. package/dist/src/mcp/catalog/definitions.js +29 -1
  60. package/dist/src/mcp/catalog/definitions.js.map +1 -1
  61. package/dist/src/mcp/catalog/scopes.d.ts +1 -0
  62. package/dist/src/mcp/catalog/scopes.d.ts.map +1 -1
  63. package/dist/src/mcp/catalog/scopes.js +6 -0
  64. package/dist/src/mcp/catalog/scopes.js.map +1 -1
  65. package/dist/src/mcp/catalog/surfaces.d.ts.map +1 -1
  66. package/dist/src/mcp/catalog/surfaces.js +8 -3
  67. package/dist/src/mcp/catalog/surfaces.js.map +1 -1
  68. package/dist/src/mcp/core.d.ts.map +1 -1
  69. package/dist/src/mcp/core.js +49 -0
  70. package/dist/src/mcp/core.js.map +1 -1
  71. package/dist/src/models/message-schemas.d.ts +56 -0
  72. package/dist/src/models/message-schemas.d.ts.map +1 -1
  73. package/dist/src/models/message-schemas.js +13 -0
  74. package/dist/src/models/message-schemas.js.map +1 -1
  75. package/dist/src/routes/bootstrap.d.ts.map +1 -1
  76. package/dist/src/routes/bootstrap.js +3 -0
  77. package/dist/src/routes/bootstrap.js.map +1 -1
  78. package/dist/src/routes/catalogue.d.ts +11 -0
  79. package/dist/src/routes/catalogue.d.ts.map +1 -1
  80. package/dist/src/routes/catalogue.js +14 -1
  81. package/dist/src/routes/catalogue.js.map +1 -1
  82. package/dist/src/routes/discover.d.ts +22 -0
  83. package/dist/src/routes/discover.d.ts.map +1 -0
  84. package/dist/src/routes/discover.js +123 -0
  85. package/dist/src/routes/discover.js.map +1 -0
  86. package/dist/src/routes/federation-sync.d.ts.map +1 -1
  87. package/dist/src/routes/federation-sync.js +67 -2
  88. package/dist/src/routes/federation-sync.js.map +1 -1
  89. package/dist/src/routes/messages.d.ts.map +1 -1
  90. package/dist/src/routes/messages.js +86 -1
  91. package/dist/src/routes/messages.js.map +1 -1
  92. package/dist/src/routes/openrouter.d.ts +1 -0
  93. package/dist/src/routes/openrouter.d.ts.map +1 -1
  94. package/dist/src/routes/openrouter.js +15 -0
  95. package/dist/src/routes/openrouter.js.map +1 -1
  96. package/dist/src/routes/organisms.d.ts +3 -0
  97. package/dist/src/routes/organisms.d.ts.map +1 -1
  98. package/dist/src/routes/organisms.js +15 -34
  99. package/dist/src/routes/organisms.js.map +1 -1
  100. package/dist/src/routes/portal.d.ts.map +1 -1
  101. package/dist/src/routes/portal.js +3 -0
  102. package/dist/src/routes/portal.js.map +1 -1
  103. package/dist/src/routes/portfolio.d.ts.map +1 -1
  104. package/dist/src/routes/portfolio.js +30 -0
  105. package/dist/src/routes/portfolio.js.map +1 -1
  106. package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
  107. package/dist/src/server-bootstrap/routes-loader.js +2 -0
  108. package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
  109. package/dist/src/services/connect-tunnel.d.ts +3 -0
  110. package/dist/src/services/connect-tunnel.d.ts.map +1 -1
  111. package/dist/src/services/connect-tunnel.js +6 -0
  112. package/dist/src/services/connect-tunnel.js.map +1 -1
  113. package/dist/src/services/discovery/__tests__/discovery.test.d.ts +2 -0
  114. package/dist/src/services/discovery/__tests__/discovery.test.d.ts.map +1 -0
  115. package/dist/src/services/discovery/__tests__/discovery.test.js +178 -0
  116. package/dist/src/services/discovery/__tests__/discovery.test.js.map +1 -0
  117. package/dist/src/services/discovery/classify.d.ts +36 -0
  118. package/dist/src/services/discovery/classify.d.ts.map +1 -0
  119. package/dist/src/services/discovery/classify.js +61 -0
  120. package/dist/src/services/discovery/classify.js.map +1 -0
  121. package/dist/src/services/discovery/facets.d.ts +21 -0
  122. package/dist/src/services/discovery/facets.d.ts.map +1 -0
  123. package/dist/src/services/discovery/facets.js +0 -0
  124. package/dist/src/services/discovery/facets.js.map +1 -0
  125. package/dist/src/services/discovery/index.d.ts +22 -0
  126. package/dist/src/services/discovery/index.d.ts.map +1 -0
  127. package/dist/src/services/discovery/index.js +22 -0
  128. package/dist/src/services/discovery/index.js.map +1 -0
  129. package/dist/src/services/discovery/normalize.d.ts +25 -0
  130. package/dist/src/services/discovery/normalize.d.ts.map +1 -0
  131. package/dist/src/services/discovery/normalize.js +108 -0
  132. package/dist/src/services/discovery/normalize.js.map +1 -0
  133. package/dist/src/services/discovery/registry.d.ts +30 -0
  134. package/dist/src/services/discovery/registry.d.ts.map +1 -0
  135. package/dist/src/services/discovery/registry.js +31 -0
  136. package/dist/src/services/discovery/registry.js.map +1 -0
  137. package/dist/src/services/discovery/run.d.ts +23 -0
  138. package/dist/src/services/discovery/run.d.ts.map +1 -0
  139. package/dist/src/services/discovery/run.js +20 -0
  140. package/dist/src/services/discovery/run.js.map +1 -0
  141. package/dist/src/services/discovery/setup.d.ts +16 -0
  142. package/dist/src/services/discovery/setup.d.ts.map +1 -0
  143. package/dist/src/services/discovery/setup.js +12 -0
  144. package/dist/src/services/discovery/setup.js.map +1 -0
  145. package/dist/src/services/discovery/sources/memory-source.d.ts +24 -0
  146. package/dist/src/services/discovery/sources/memory-source.d.ts.map +1 -0
  147. package/dist/src/services/discovery/sources/memory-source.js +183 -0
  148. package/dist/src/services/discovery/sources/memory-source.js.map +1 -0
  149. package/dist/src/services/discovery/sources/table-sources.d.ts +27 -0
  150. package/dist/src/services/discovery/sources/table-sources.d.ts.map +1 -0
  151. package/dist/src/services/discovery/sources/table-sources.js +128 -0
  152. package/dist/src/services/discovery/sources/table-sources.js.map +1 -0
  153. package/dist/src/services/discovery/types.d.ts +117 -0
  154. package/dist/src/services/discovery/types.d.ts.map +1 -0
  155. package/dist/src/services/discovery/types.js +19 -0
  156. package/dist/src/services/discovery/types.js.map +1 -0
  157. package/dist/src/services/handbooks/agent.d.ts +4 -1
  158. package/dist/src/services/handbooks/agent.d.ts.map +1 -1
  159. package/dist/src/services/handbooks/agent.js +18 -3
  160. package/dist/src/services/handbooks/agent.js.map +1 -1
  161. package/dist/src/services/kpi-rollup.d.ts +53 -0
  162. package/dist/src/services/kpi-rollup.d.ts.map +1 -0
  163. package/dist/src/services/kpi-rollup.js +64 -0
  164. package/dist/src/services/kpi-rollup.js.map +1 -0
  165. package/dist/src/services/manifest-schema.d.ts +8 -1
  166. package/dist/src/services/manifest-schema.d.ts.map +1 -1
  167. package/dist/src/services/manifest-schema.js +48 -1
  168. package/dist/src/services/manifest-schema.js.map +1 -1
  169. package/dist/src/services/message-broadcast.d.ts +49 -0
  170. package/dist/src/services/message-broadcast.d.ts.map +1 -0
  171. package/dist/src/services/message-broadcast.js +116 -0
  172. package/dist/src/services/message-broadcast.js.map +1 -0
  173. package/dist/src/services/message-delivery.d.ts.map +1 -1
  174. package/dist/src/services/message-delivery.js +2 -0
  175. package/dist/src/services/message-delivery.js.map +1 -1
  176. package/dist/src/services/message-send.d.ts +6 -0
  177. package/dist/src/services/message-send.d.ts.map +1 -1
  178. package/dist/src/services/message-send.js +7 -5
  179. package/dist/src/services/message-send.js.map +1 -1
  180. package/dist/src/services/presence.d.ts +8 -0
  181. package/dist/src/services/presence.d.ts.map +1 -1
  182. package/dist/src/services/presence.js +38 -0
  183. package/dist/src/services/presence.js.map +1 -1
  184. package/dist/src/services/secretary.d.ts +33 -0
  185. package/dist/src/services/secretary.d.ts.map +1 -0
  186. package/dist/src/services/secretary.js +63 -0
  187. package/dist/src/services/secretary.js.map +1 -0
  188. package/dist/src/services/structure-overview.d.ts +27 -0
  189. package/dist/src/services/structure-overview.d.ts.map +1 -1
  190. package/dist/src/services/structure-overview.js +89 -2
  191. package/dist/src/services/structure-overview.js.map +1 -1
  192. package/dist/src/services/workspace-enrichment.d.ts +15 -5
  193. package/dist/src/services/workspace-enrichment.d.ts.map +1 -1
  194. package/dist/src/services/workspace-enrichment.js +52 -14
  195. package/dist/src/services/workspace-enrichment.js.map +1 -1
  196. package/dist/src/storage/interface.d.ts +5 -0
  197. package/dist/src/storage/interface.d.ts.map +1 -1
  198. package/dist/src/storage/providers/mongodb/index.d.ts +1 -0
  199. package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
  200. package/dist/src/storage/providers/mongodb/index.js +13 -0
  201. package/dist/src/storage/providers/mongodb/index.js.map +1 -1
  202. package/dist/src/storage/providers/sqlite/index.d.ts +1 -0
  203. package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
  204. package/dist/src/storage/providers/sqlite/index.js +3 -0
  205. package/dist/src/storage/providers/sqlite/index.js.map +1 -1
  206. package/dist/src/storage/providers/sqlite/repos/direct-message.d.ts +3 -0
  207. package/dist/src/storage/providers/sqlite/repos/direct-message.d.ts.map +1 -1
  208. package/dist/src/storage/providers/sqlite/repos/direct-message.js +13 -2
  209. package/dist/src/storage/providers/sqlite/repos/direct-message.js.map +1 -1
  210. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  211. package/dist/src/storage/providers/sqlite/schema.js +5 -0
  212. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  213. package/dist/src/storage/repositories/direct-message.repository.d.ts +3 -0
  214. package/dist/src/storage/repositories/direct-message.repository.d.ts.map +1 -1
  215. package/package.json +1 -1
  216. package/prisma/schema.postgres.prisma +3 -0
  217. package/prisma/schema.prisma +3 -0
@@ -8,6 +8,61 @@
8
8
  "inbox.send": "Send",
9
9
  "inbox.sending": "Sending…",
10
10
  "inbox.reply": "Reply",
11
+ "inbox.contactAgentSuffix": "(your agent)",
12
+ "inbox.messageThis": "Send a message",
13
+ "nav.members": "Members",
14
+ "members.title": "Members",
15
+ "members.desc": "People on this node who have published a portfolio.",
16
+ "members.empty": "No published portfolios yet.",
17
+ "inbox.broadcast": "Broadcast",
18
+ "inbox.broadcastTitle": "Send to many",
19
+ "inbox.bcModeBroadcast": "Message (repliable)",
20
+ "inbox.bcModeAnnouncement": "Announcement (read-only)",
21
+ "inbox.bcAddPlaceholder": "Add a recipient…",
22
+ "inbox.bcAdd": "Add",
23
+ "inbox.bcRemove": "Remove",
24
+ "inbox.bcNoGroup": "— Share Group (optional) —",
25
+ "inbox.bcSend": "Send to all",
26
+ "inbox.bcNoRecipients": "Add at least one recipient or a group",
27
+ "inbox.bcSent": "Broadcast sent",
28
+ "inbox.bcNoAudience": "— Audience (optional) —",
29
+ "inbox.bcNodeUsers": "All node users (operator)",
30
+ "inbox.bcFederationUsers": "All federation users (operator)",
31
+ "inbox.close": "Close",
32
+ "inbox.loading": "Loading…",
33
+ "inbox.cmdTitle": "Commands",
34
+ "inbox.cmdInsert": "Insert into message",
35
+ "inbox.schedTitle": "Schedule",
36
+ "inbox.schedNone": "No scheduled tasks yet.",
37
+ "inbox.schedOff": "off",
38
+ "inbox.schedTaskPh": "Task title",
39
+ "inbox.schedDescPh": "What should the agent do? (optional)",
40
+ "inbox.schedCreate": "Schedule",
41
+ "inbox.schedCreated": "Scheduled.",
42
+ "inbox.schedError": "Could not schedule.",
43
+ "inbox.parkToNotebook": "Add to notebook for later",
44
+ "inbox.parkedToNotebook": "Added to your notebook.",
45
+ "inbox.announcementNote": "Announcement — replies are disabled",
46
+ "inbox.bcTypeMessage": "Message",
47
+ "inbox.bcTypePoll": "Poll",
48
+ "inbox.pollSend": "Send poll",
49
+ "inbox.pollHeader": "Short label (chip)",
50
+ "inbox.pollPrompt": "Question",
51
+ "inbox.pollOption": "Option",
52
+ "inbox.pollAddOption": "Add option",
53
+ "inbox.pollRemoveQ": "Remove question",
54
+ "inbox.pollAddQuestion": "Add question",
55
+ "inbox.pollMulti": "Multiple choice",
56
+ "inbox.pollAllowOther": "Allow \"Other\"",
57
+ "inbox.pollRequired": "Required",
58
+ "inbox.pollNeedQuestion": "Add at least one question with options",
59
+ "inbox.results": "Results",
60
+ "inbox.resultsTitle": "Broadcast results",
61
+ "inbox.resultsEmpty": "No broadcasts sent yet",
62
+ "inbox.resultsRecipients": "Recipients",
63
+ "inbox.resultsDelivered": "Delivered",
64
+ "inbox.resultsRead": "Read",
65
+ "inbox.resultsAnswered": "Answered",
11
66
  "inbox.answer.other": "Other",
12
67
  "inbox.answer.otherPlaceholder": "Type your answer…",
13
68
  "inbox.answer.send": "Send answers",
@@ -488,7 +543,50 @@
488
543
  "themeToLight": "Switch to light mode",
489
544
  "howItWorks": "How it works",
490
545
  "business": "For your business",
491
- "myCompany": "My Company"
546
+ "myCompany": "My Company",
547
+ "companies": "Companies",
548
+ "secretary": "Secretary"
549
+ },
550
+ "secretary": {
551
+ "title": "Secretary",
552
+ "desc": "Your personal AIMEAT secretary — set up and ready to help.",
553
+ "ready": "Secretary is set up",
554
+ "notReady": "Your Secretary isn't set up yet. Configure OpenRouter in your profile settings to enable it.",
555
+ "identity": "Identity",
556
+ "scopes": "Permissions",
557
+ "soon": "Chat, schedule, and decisions are coming soon."
558
+ },
559
+ "companies": {
560
+ "title": "Companies",
561
+ "desc": "Browse companies on this node and order their agents' offerings.",
562
+ "directory": "Directory",
563
+ "none": "No companies yet.",
564
+ "offeringsShort": "offerings",
565
+ "selectHint": "Pick a company to see its profile and catalogue.",
566
+ "businessId": "Business ID (Y-tunnus)",
567
+ "catalogue": "Offerings for sale",
568
+ "noOfferings": "This company has no offerings listed yet.",
569
+ "callable": "Runs instantly — result appears below.",
570
+ "viaInbox": "Handled by the seller's agent — track it in My orders.",
571
+ "usePlaceholder": "Describe what you need (optional)…",
572
+ "order": "Order",
573
+ "morsels": "morsels",
574
+ "loginToOrder": "Log in to order",
575
+ "orderResult": "Done — result below.",
576
+ "orderTask": "Order received — the seller's agent {agent} will handle it.",
577
+ "charged": "Charged {n} morsels",
578
+ "myOrders": "My orders",
579
+ "noMyOrders": "You haven't ordered anything yet.",
580
+ "done": "Done",
581
+ "free": "Free",
582
+ "fromCompany": "Company",
583
+ "stQueued": "Queued",
584
+ "stActive": "In progress",
585
+ "stDone": "Done",
586
+ "stFailed": "Failed",
587
+ "stInstant": "Instant",
588
+ "viewPortfolio": "View portfolio",
589
+ "enterpriseRequired": "The company directory requires the AIMEAT Enterprise edition. This node runs the free Community edition."
492
590
  },
493
591
  "myCompany": {
494
592
  "title": "My Company",
@@ -514,6 +612,38 @@
514
612
  "use": "Order",
515
613
  "usePlaceholder": "What do you want? (optional)…",
516
614
  "result": "Result",
615
+ "manage": "Manage",
616
+ "edit": "Edit",
617
+ "cancel": "Cancel",
618
+ "visibilityLabel": "Visibility",
619
+ "priceLabel": "Price",
620
+ "lastSavedBy": "Last saved by",
621
+ "notForSale": "not for sale",
622
+ "neverEdited": "Not configured yet — click Edit to set price + visibility.",
623
+ "tabCatalog": "Catalog",
624
+ "tabOrders": "Orders",
625
+ "tabCustomers": "Customers",
626
+ "tabMembers": "Members",
627
+ "noCustomers": "No customers yet.",
628
+ "orderCount": "Orders",
629
+ "lastOrder": "Last order",
630
+ "creator": "creator",
631
+ "byMember": "Offered by",
632
+ "roleAdmin": "Admin",
633
+ "roleMember": "Member",
634
+ "roleVisitor": "Visitor",
635
+ "removeMember": "Remove",
636
+ "addMember": "Add a member",
637
+ "memberUsername": "Username",
638
+ "addMemberBtn": "Add",
639
+ "visPrivate": "Private (only me)",
640
+ "visUnlisted": "Unlisted (by link)",
641
+ "visPublic": "Public (listed)",
642
+ "savePrice": "Save",
643
+ "saved": "Saved ✓",
644
+ "removeFromCatalog": "Remove from catalog",
645
+ "privateHint": "Private — others can't see or order this. Set Public to sell it.",
646
+ "agentNoOfferings": "No offerings yet — create one in Profile › Offerings.",
517
647
  "orderPlacedTask": "Order received — the seller's agent {agent} will handle it. Track it under My orders.",
518
648
  "orderPlacedResult": "Done — result below.",
519
649
  "charged": "Charged {n} morsels",
@@ -534,7 +664,54 @@
534
664
  "morsels": "morsels",
535
665
  "enterpriseBadge": "Enterprise feature",
536
666
  "enterpriseRequired": "Company commerce requires the AIMEAT Enterprise edition. This node runs the free Community edition.",
537
- "loginRequired": "Please log in to manage your companies."
667
+ "loginRequired": "Please log in to manage your companies.",
668
+ "tabSettings": "Settings",
669
+ "businessId": "Business ID (Y-tunnus)",
670
+ "businessIdOptional": "Business ID (Y-tunnus) — optional",
671
+ "businessIdHint": "Finnish format: 1234567-8. Required to sell as a registered company (KYB).",
672
+ "noBusinessId": "No business ID set — add it in Settings.",
673
+ "description": "Description",
674
+ "commission": "Company commission %",
675
+ "commissionHint": "The company's cut of each sale; the rest goes to the fulfilling member. Default 20%.",
676
+ "settingsSaved": "Settings saved ✓",
677
+ "saveSettings": "Save settings",
678
+ "receiptLabel": "Receipt",
679
+ "logo": "Company logo",
680
+ "noLogo": "No logo",
681
+ "uploadLogo": "Upload logo",
682
+ "removeLogo": "Remove",
683
+ "uploading": "Uploading…",
684
+ "logoTooBig": "Logo must be under 1 MB.",
685
+ "listedLabel": "Show this company in the public AIMEAT company directory",
686
+ "listedHint": "When on, your company — with its published services and pricing — appears in the corp catalogue. Turn off to stay private.",
687
+ "unlistedBadge": "not in directory",
688
+ "tabPortfolio": "Portfolio",
689
+ "pfIntro": "Build a public portfolio page for your company. Pick what to include, generate a prompt, paste it into your AI chat, then paste the HTML it returns back here and publish.",
690
+ "pfLive": "Portfolio is live ✓",
691
+ "pfVisit": "Visit",
692
+ "pfUnpublish": "Unpublish",
693
+ "pfLastPublished": "Last published",
694
+ "pfStep1": "1. Choose what to include",
695
+ "pfIncludeInfo": "Company info (name, Y-tunnus, about)",
696
+ "pfIncludeOfferings": "Services & pricing",
697
+ "pfUseLogo": "Use the company logo",
698
+ "pfNoLogo": "upload one in Settings first",
699
+ "pfLook": "Describe how you'd like it to look",
700
+ "pfLookPlaceholder": "e.g. clean and modern, dark theme, bold headings, trustworthy and corporate…",
701
+ "pfGenerate": "Generate prompt",
702
+ "pfStep2": "2. Copy this prompt into your AI chat",
703
+ "pfStep2Hint": "Paste it into ChatGPT / Claude / any AI, then copy the HTML it produces.",
704
+ "pfCopyPrompt": "Copy prompt",
705
+ "pfStep3": "3. Paste the HTML here and publish",
706
+ "pfPublish": "Publish portfolio",
707
+ "pfPublished": "Portfolio published ✓",
708
+ "pfNeedHtml": "Paste the HTML your AI produced first.",
709
+ "pfCopied": "Prompt copied ✓",
710
+ "pfThemeHeading": "Ready-made theme",
711
+ "pfThemeHint": "Pick a theme and publish instantly — no AI needed. Uses your choices above.",
712
+ "pfPreview": "Preview",
713
+ "pfPublishTheme": "Publish with this theme",
714
+ "pfOrAi": "Or design your own with AI"
538
715
  },
539
716
  "hero": {
540
717
  "title": "Your data is yours. Your AI works for you.",
@@ -6239,6 +6416,33 @@
6239
6416
  "exportSuccess": "Exported {count} config values in {format} format",
6240
6417
  "migrationHint": "Tip: To migrate .env to database, run: aimeat config import --file .env"
6241
6418
  },
6419
+ "discover": {
6420
+ "tabLabel": "Discover",
6421
+ "title": "Discover",
6422
+ "desc": "The master directory — find anything on the node across every domain: capabilities, workflows, knowledge, decisions, research, produced material, companies and their offerings, documents, apps, and memory.",
6423
+ "searchPlaceholder": "Search everything…",
6424
+ "allTypes": "All",
6425
+ "empty": "Nothing matches yet. Try a different scope or query.",
6426
+ "scope": {
6427
+ "own": "Mine",
6428
+ "public": "Public",
6429
+ "shared": "Shared with me"
6430
+ },
6431
+ "type": {
6432
+ "capability": "Capability",
6433
+ "workflow": "Workflow",
6434
+ "knowledge": "Knowledge",
6435
+ "decision": "Decision",
6436
+ "research": "Research",
6437
+ "material": "Material",
6438
+ "company": "Company",
6439
+ "offering": "Offering",
6440
+ "document": "Document",
6441
+ "organism": "Organism",
6442
+ "app": "App",
6443
+ "memory": "Memory"
6444
+ }
6445
+ },
6242
6446
  "knowledge": {
6243
6447
  "tabLabel": "Knowledge",
6244
6448
  "actionBar": {
@@ -6665,6 +6869,8 @@
6665
6869
  "orPaste": "…or paste / drag an image into the editor",
6666
6870
  "saving": "Saving…",
6667
6871
  "pageSaved": "Document saved",
6872
+ "color": "Color",
6873
+ "noColor": "No color",
6668
6874
  "section": "Section",
6669
6875
  "sectionName": "Section name",
6670
6876
  "unsorted": "Unsorted",
@@ -6719,6 +6925,12 @@
6719
6925
  "descSources": "References this workspace draws on: memory entries, files, and knowledge packages. Pointers only; nothing is copied.",
6720
6926
  "descReview": "Gated publishes waiting for a human decision before they go live.",
6721
6927
  "ovRecent": "What happened here",
6928
+ "objectivesTitle": "Objectives",
6929
+ "kpiTarget": "target {t}",
6930
+ "kpiDeclared": "self-reported",
6931
+ "kpiDeclaredHint": "Self-reported — not computed from records",
6932
+ "objStatusMet": "met",
6933
+ "objStatusAbandoned": "abandoned",
6722
6934
  "ovShowAll": "Show all {n} →",
6723
6935
  "unseenHint": "Changed since your last visit",
6724
6936
  "forAgentsHint": "Copy a ready prompt that teaches an AI to use this workspace",
@@ -8,6 +8,61 @@
8
8
  "inbox.send": "Lähetä",
9
9
  "inbox.sending": "Lähetetään…",
10
10
  "inbox.reply": "Vastaa",
11
+ "inbox.contactAgentSuffix": "(agenttisi)",
12
+ "inbox.messageThis": "Lähetä viesti",
13
+ "nav.members": "Jäsenet",
14
+ "members.title": "Jäsenet",
15
+ "members.desc": "Tämän solmun käyttäjät, jotka ovat julkaisseet portfolion.",
16
+ "members.empty": "Ei julkaistuja portfolioita vielä.",
17
+ "inbox.broadcast": "Joukkoviesti",
18
+ "inbox.broadcastTitle": "Lähetä monelle",
19
+ "inbox.bcModeBroadcast": "Viesti (vastattava)",
20
+ "inbox.bcModeAnnouncement": "Tiedote (vain luku)",
21
+ "inbox.bcAddPlaceholder": "Lisää vastaanottaja…",
22
+ "inbox.bcAdd": "Lisää",
23
+ "inbox.bcRemove": "Poista",
24
+ "inbox.bcNoGroup": "— Jakoryhmä (valinnainen) —",
25
+ "inbox.bcSend": "Lähetä kaikille",
26
+ "inbox.bcNoRecipients": "Lisää vähintään yksi vastaanottaja tai ryhmä",
27
+ "inbox.bcSent": "Joukkoviesti lähetetty",
28
+ "inbox.bcNoAudience": "— Yleisö (valinnainen) —",
29
+ "inbox.bcNodeUsers": "Kaikki solmun käyttäjät (operaattori)",
30
+ "inbox.bcFederationUsers": "Koko federaatio (operaattori)",
31
+ "inbox.close": "Sulje",
32
+ "inbox.loading": "Ladataan…",
33
+ "inbox.cmdTitle": "Komennot",
34
+ "inbox.cmdInsert": "Lisää viestiin",
35
+ "inbox.schedTitle": "Ajastus",
36
+ "inbox.schedNone": "Ei ajastettuja tehtäviä vielä.",
37
+ "inbox.schedOff": "pois",
38
+ "inbox.schedTaskPh": "Tehtävän otsikko",
39
+ "inbox.schedDescPh": "Mitä agentin pitäisi tehdä? (valinnainen)",
40
+ "inbox.schedCreate": "Ajasta",
41
+ "inbox.schedCreated": "Ajastettu.",
42
+ "inbox.schedError": "Ajastus epäonnistui.",
43
+ "inbox.parkToNotebook": "Lisää muistikirjaan myöhempää varten",
44
+ "inbox.parkedToNotebook": "Lisätty muistikirjaasi.",
45
+ "inbox.announcementNote": "Tiedote — vastaaminen ei ole käytössä",
46
+ "inbox.bcTypeMessage": "Viesti",
47
+ "inbox.bcTypePoll": "Kysely",
48
+ "inbox.pollSend": "Lähetä kysely",
49
+ "inbox.pollHeader": "Lyhyt otsikko",
50
+ "inbox.pollPrompt": "Kysymys",
51
+ "inbox.pollOption": "Vaihtoehto",
52
+ "inbox.pollAddOption": "Lisää vaihtoehto",
53
+ "inbox.pollRemoveQ": "Poista kysymys",
54
+ "inbox.pollAddQuestion": "Lisää kysymys",
55
+ "inbox.pollMulti": "Monivalinta",
56
+ "inbox.pollAllowOther": "Salli \"Muu\"",
57
+ "inbox.pollRequired": "Pakollinen",
58
+ "inbox.pollNeedQuestion": "Lisää vähintään yksi kysymys vaihtoehtoineen",
59
+ "inbox.results": "Tulokset",
60
+ "inbox.resultsTitle": "Joukkoviestin tulokset",
61
+ "inbox.resultsEmpty": "Ei lähetettyjä joukkoviestejä vielä",
62
+ "inbox.resultsRecipients": "Vastaanottajat",
63
+ "inbox.resultsDelivered": "Toimitettu",
64
+ "inbox.resultsRead": "Luettu",
65
+ "inbox.resultsAnswered": "Vastattu",
11
66
  "inbox.answer.other": "Muu",
12
67
  "inbox.answer.otherPlaceholder": "Kirjoita vastauksesi…",
13
68
  "inbox.answer.send": "Lähetä vastaukset",
@@ -488,7 +543,50 @@
488
543
  "themeToLight": "Vaihda vaaleaan tilaan",
489
544
  "howItWorks": "Miten se toimii",
490
545
  "business": "Yrityksellesi",
491
- "myCompany": "Yritykseni"
546
+ "myCompany": "Yritykseni",
547
+ "companies": "Yritykset",
548
+ "secretary": "Sihteeri"
549
+ },
550
+ "secretary": {
551
+ "title": "Sihteeri",
552
+ "desc": "Henkilökohtainen AIMEAT-sihteerisi — pystytetty ja valmiina auttamaan.",
553
+ "ready": "Sihteeri on pystytetty",
554
+ "notReady": "Sihteeriäsi ei ole vielä pystytetty. Ota se käyttöön määrittämällä OpenRouter profiilisi asetuksissa.",
555
+ "identity": "Identiteetti",
556
+ "scopes": "Oikeudet",
557
+ "soon": "Chat, kalenteri ja päätökset tulossa pian."
558
+ },
559
+ "companies": {
560
+ "title": "Yritykset",
561
+ "desc": "Selaa noden yrityksiä ja tilaa niiden agenttien tarjoamia.",
562
+ "directory": "Hakemisto",
563
+ "none": "Ei vielä yrityksiä.",
564
+ "offeringsShort": "tarjoamaa",
565
+ "selectHint": "Valitse yritys nähdäksesi sen profiilin ja katalogin.",
566
+ "businessId": "Y-tunnus",
567
+ "catalogue": "Tarjoamat myynnissä",
568
+ "noOfferings": "Tällä yrityksellä ei ole vielä tarjoamia listattuna.",
569
+ "callable": "Suoritetaan heti — tulos näkyy alla.",
570
+ "viaInbox": "Myyjän agentti hoitaa — seuraa kohdasta Omat tilaukset.",
571
+ "usePlaceholder": "Kuvaile mitä tarvitset (valinnainen)…",
572
+ "order": "Tilaa",
573
+ "morsels": "morselia",
574
+ "loginToOrder": "Kirjaudu tilataksesi",
575
+ "orderResult": "Valmis — tulos alla.",
576
+ "orderTask": "Tilaus vastaanotettu — myyjän agentti {agent} hoitaa sen.",
577
+ "charged": "Veloitettu {n} morselia",
578
+ "myOrders": "Omat tilaukset",
579
+ "noMyOrders": "Et ole vielä tilannut mitään.",
580
+ "done": "Valmis",
581
+ "free": "Ilmainen",
582
+ "fromCompany": "Yritys",
583
+ "stQueued": "Jonossa",
584
+ "stActive": "Käynnissä",
585
+ "stDone": "Valmis",
586
+ "stFailed": "Epäonnistui",
587
+ "stInstant": "Heti",
588
+ "viewPortfolio": "Katso portfolio",
589
+ "enterpriseRequired": "Yrityshakemisto vaatii AIMEAT Enterprise -version. Tämä node ajaa ilmaista Community-versiota."
492
590
  },
493
591
  "myCompany": {
494
592
  "title": "Yritykseni",
@@ -514,6 +612,38 @@
514
612
  "use": "Tilaa",
515
613
  "usePlaceholder": "Mitä haluat? (valinnainen)…",
516
614
  "result": "Tulos",
615
+ "manage": "Hallinta",
616
+ "edit": "Muokkaa",
617
+ "cancel": "Peruuta",
618
+ "visibilityLabel": "Näkyvyys",
619
+ "priceLabel": "Hinta",
620
+ "lastSavedBy": "Viimeksi tallentanut",
621
+ "notForSale": "ei myynnissä",
622
+ "neverEdited": "Ei vielä konfiguroitu — paina Muokkaa asettaaksesi hinnan + näkyvyyden.",
623
+ "tabCatalog": "Katalogi",
624
+ "tabOrders": "Tilaukset",
625
+ "tabCustomers": "Asiakkaat",
626
+ "tabMembers": "Jäsenet",
627
+ "noCustomers": "Ei vielä asiakkaita.",
628
+ "orderCount": "Tilauksia",
629
+ "lastOrder": "Viimeisin tilaus",
630
+ "creator": "perustaja",
631
+ "byMember": "Tarjoaa",
632
+ "roleAdmin": "Ylläpitäjä",
633
+ "roleMember": "Jäsen",
634
+ "roleVisitor": "Vierailija",
635
+ "removeMember": "Poista",
636
+ "addMember": "Lisää jäsen",
637
+ "memberUsername": "Käyttäjänimi",
638
+ "addMemberBtn": "Lisää",
639
+ "visPrivate": "Yksityinen (vain minä)",
640
+ "visUnlisted": "Linkillä (ei listattu)",
641
+ "visPublic": "Julkinen (myynnissä)",
642
+ "savePrice": "Tallenna",
643
+ "saved": "Tallennettu ✓",
644
+ "removeFromCatalog": "Poista katalogista",
645
+ "privateHint": "Yksityinen — muut eivät näe tai voi tilata. Aseta Julkiseksi myydäksesi.",
646
+ "agentNoOfferings": "Ei vielä tarjoamia — luo profiilissa › Tarjoama.",
517
647
  "orderPlacedTask": "Tilaus vastaanotettu — myyjän agentti {agent} käsittelee. Seuraa Omat tilaukset -kohdasta.",
518
648
  "orderPlacedResult": "Valmis — tulos alla.",
519
649
  "charged": "Veloitettu {n} morselia",
@@ -534,7 +664,54 @@
534
664
  "morsels": "morselia",
535
665
  "enterpriseBadge": "Enterprise-ominaisuus",
536
666
  "enterpriseRequired": "Yrityskauppa vaatii AIMEAT Enterprise -version. Tämä node ajaa ilmaista Community-versiota.",
537
- "loginRequired": "Kirjaudu sisään hallitaksesi yrityksiäsi."
667
+ "loginRequired": "Kirjaudu sisään hallitaksesi yrityksiäsi.",
668
+ "tabSettings": "Asetukset",
669
+ "businessId": "Y-tunnus",
670
+ "businessIdOptional": "Y-tunnus — valinnainen",
671
+ "businessIdHint": "Suomalainen muoto: 1234567-8. Vaaditaan myyntiin rekisteröitynä yrityksenä (KYB).",
672
+ "noBusinessId": "Y-tunnusta ei asetettu — lisää se Asetuksissa.",
673
+ "description": "Kuvaus",
674
+ "commission": "Yrityksen komissio %",
675
+ "commissionHint": "Yrityksen osuus jokaisesta myynnistä; loppu menee tarjoaman toteuttavalle jäsenelle. Oletus 20 %.",
676
+ "settingsSaved": "Asetukset tallennettu ✓",
677
+ "saveSettings": "Tallenna asetukset",
678
+ "receiptLabel": "Kuitti",
679
+ "logo": "Yrityksen logo",
680
+ "noLogo": "Ei logoa",
681
+ "uploadLogo": "Lataa logo",
682
+ "removeLogo": "Poista",
683
+ "uploading": "Ladataan…",
684
+ "logoTooBig": "Logon tulee olla alle 1 Mt.",
685
+ "listedLabel": "Näytä tämä yritys julkisessa AIMEAT-yrityshakemistossa",
686
+ "listedHint": "Päällä yrityksesi — julkaistuine palveluineen ja hinnastoineen — näkyy corp-katalogissa. Pois päältä pysyt yksityisenä.",
687
+ "unlistedBadge": "ei hakemistossa",
688
+ "tabPortfolio": "Portfolio",
689
+ "pfIntro": "Rakenna yrityksellesi julkinen portfolio-sivu. Valitse mukaan otettavat, generoi prompt, liitä se AI-chattiisi, ja liitä sen palauttama HTML takaisin tähän ja julkaise.",
690
+ "pfLive": "Portfolio julkaistu ✓",
691
+ "pfVisit": "Avaa",
692
+ "pfUnpublish": "Poista julkaisu",
693
+ "pfLastPublished": "Viimeksi julkaistu",
694
+ "pfStep1": "1. Valitse mitä otetaan mukaan",
695
+ "pfIncludeInfo": "Yritystiedot (nimi, Y-tunnus, esittely)",
696
+ "pfIncludeOfferings": "Palvelut & hinnasto",
697
+ "pfUseLogo": "Käytä yrityksen logoa",
698
+ "pfNoLogo": "lataa logo ensin Asetuksissa",
699
+ "pfLook": "Kuvaile millaiselta toivoisit sen näyttävän",
700
+ "pfLookPlaceholder": "esim. selkeä ja moderni, tumma teema, isot otsikot, luotettava ja yritysmäinen…",
701
+ "pfGenerate": "Generoi prompt",
702
+ "pfStep2": "2. Kopioi tämä prompt AI-chattiisi",
703
+ "pfStep2Hint": "Liitä se ChatGPT:hen / Claudeen / mihin tahansa AI:hin, ja kopioi sen tuottama HTML.",
704
+ "pfCopyPrompt": "Kopioi prompt",
705
+ "pfStep3": "3. Liitä HTML tähän ja julkaise",
706
+ "pfPublish": "Julkaise portfolio",
707
+ "pfPublished": "Portfolio julkaistu ✓",
708
+ "pfNeedHtml": "Liitä ensin AI:n tuottama HTML.",
709
+ "pfCopied": "Prompt kopioitu ✓",
710
+ "pfThemeHeading": "Valmis teema",
711
+ "pfThemeHint": "Valitse teema ja julkaise heti — ei AI:ta tarvita. Käyttää yllä tekemiäsi valintoja.",
712
+ "pfPreview": "Esikatsele",
713
+ "pfPublishTheme": "Julkaise tällä teemalla",
714
+ "pfOrAi": "Tai suunnittele oma tekoälyllä"
538
715
  },
539
716
  "hero": {
540
717
  "title": "Tietosi on sinun. AI:si työskentelee puolestasi.",
@@ -6239,6 +6416,33 @@
6239
6416
  "exportSuccess": "Vietiin {count} asetusarvoa {format}-muodossa",
6240
6417
  "migrationHint": "Vinkki: Siirrä .env tietokantaan komennolla: aimeat config import --file .env"
6241
6418
  },
6419
+ "discover": {
6420
+ "tabLabel": "Löydä",
6421
+ "title": "Löydä",
6422
+ "desc": "Päähakemisto — löydä mitä tahansa solmusta kaikilta alueilta: kyvyt, työnkulut, tieto, päätökset, tutkimus, tuotettu materiaali, yritykset ja niiden tarjoukset, dokumentit, sovellukset ja muisti.",
6423
+ "searchPlaceholder": "Hae kaikkea…",
6424
+ "allTypes": "Kaikki",
6425
+ "empty": "Ei vielä osumia. Kokeile eri näkymää tai hakusanaa.",
6426
+ "scope": {
6427
+ "own": "Omat",
6428
+ "public": "Julkiset",
6429
+ "shared": "Jaetut minulle"
6430
+ },
6431
+ "type": {
6432
+ "capability": "Kyky",
6433
+ "workflow": "Työnkulku",
6434
+ "knowledge": "Tieto",
6435
+ "decision": "Päätös",
6436
+ "research": "Tutkimus",
6437
+ "material": "Materiaali",
6438
+ "company": "Yritys",
6439
+ "offering": "Tarjous",
6440
+ "document": "Dokumentti",
6441
+ "organism": "Organismi",
6442
+ "app": "Sovellus",
6443
+ "memory": "Muisti"
6444
+ }
6445
+ },
6242
6446
  "knowledge": {
6243
6447
  "tabLabel": "Tietopankki",
6244
6448
  "actionBar": {
@@ -6665,6 +6869,8 @@
6665
6869
  "orPaste": "…tai liitä / vedä kuva editoriin",
6666
6870
  "saving": "Tallennetaan…",
6667
6871
  "pageSaved": "Dokumentti tallennettu",
6872
+ "color": "Väri",
6873
+ "noColor": "Ei väriä",
6668
6874
  "section": "Osio",
6669
6875
  "sectionName": "Osion nimi",
6670
6876
  "unsorted": "Lajittelematon",
@@ -6719,6 +6925,12 @@
6719
6925
  "descSources": "Lähteet, joihin työtila nojaa: muistimerkinnät, tiedostot ja tietopaketit. Vain viittauksia; mitään ei kopioida.",
6720
6926
  "descReview": "Portitetut julkaisut, jotka odottavat ihmisen päätöstä ennen julkaisua.",
6721
6927
  "ovRecent": "Mitä täällä tapahtui",
6928
+ "objectivesTitle": "Tavoitteet",
6929
+ "kpiTarget": "tavoite {t}",
6930
+ "kpiDeclared": "itse ilmoitettu",
6931
+ "kpiDeclaredHint": "Itse ilmoitettu — ei laskettu tietueista",
6932
+ "objStatusMet": "saavutettu",
6933
+ "objStatusAbandoned": "hylätty",
6722
6934
  "ovShowAll": "Näytä kaikki {n} →",
6723
6935
  "unseenHint": "Muuttunut edellisen käyntisi jälkeen",
6724
6936
  "forAgentsHint": "Kopioi valmis kehote, joka opettaa tekoälyn käyttämään tätä työtilaa",
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @file InboxLink.js
3
+ * @description Mailto-style "message this person/agent" link. Renders an anchor to the inbox compose
4
+ * prefilled with the recipient(s) + optional subject — drop it next to any GHII/GAII (people directory,
5
+ * organism members, agent cards) for one-click DM. The inbox tab reads ?to=&subject= on mount and opens
6
+ * a prefilled compose (single recipient) or broadcast (multiple, comma-separated).
7
+ * @structure inboxLinkHref(to, subject) -> string · InboxLink({ to, subject?, title?, className?, children? })
8
+ * @usage import { InboxLink } from '/components/InboxLink.js';
9
+ * html`<${InboxLink} to=${gaii} title=${t('inbox.messageThis')}>✉️</${InboxLink}>`
10
+ * @version-history
11
+ * v1.0.0 — 2026-06-23 — Initial inbox-link (mailto-style deep link to a prefilled compose).
12
+ */
13
+ import { h } from 'preact';
14
+ import htm from 'htm';
15
+ const html = htm.bind(h);
16
+
17
+ /** Build the inbox-compose deep link for one or more recipients (array or comma-joined string). */
18
+ export function inboxLinkHref(to, subject) {
19
+ const ids = Array.isArray(to) ? to.join(',') : String(to || '');
20
+ const params = new URLSearchParams({ tab: 'messages', to: ids });
21
+ if (subject) params.set('subject', subject);
22
+ return `/v1/profile?${params.toString()}`;
23
+ }
24
+
25
+ /** A clickable link that opens the inbox composer prefilled to `to` (with an optional `subject`). */
26
+ export function InboxLink({ to, subject, title, className, children }) {
27
+ return html`<a class=${className || 'inbox-link'} href=${inboxLinkHref(to, subject)}
28
+ title=${title || 'Message'}>${children || '✉️'}</a>`;
29
+ }
@@ -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; }