aimeat 1.33.2 → 1.34.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 (291) hide show
  1. package/dist/locales/en.json +388 -14
  2. package/dist/locales/fi.json +388 -14
  3. package/dist/public/cortex-bundled/aimeat-charts.js +3 -3
  4. package/dist/public/cortex-bundled/aimeat-charts.yaml +3 -3
  5. package/dist/public/cortex-bundled/aimeat-i18n.js +123 -0
  6. package/dist/public/cortex-bundled/aimeat-i18n.yaml +64 -0
  7. package/dist/public/css/views/landing.css +2 -0
  8. package/dist/public/css/views/secretary.css +412 -2
  9. package/dist/public/js/services/apps.js +4 -2
  10. package/dist/public/js/services/memory.js +9 -3
  11. package/dist/public/js/services/offers.js +1 -1
  12. package/dist/public/js/services/organisms.js +49 -17
  13. package/dist/public/js/services/secretary-helpers.js +262 -17
  14. package/dist/public/js/services/secretary-policy.js +1 -0
  15. package/dist/public/js/services/secretary-rules.js +70 -0
  16. package/dist/public/js/theme.js +20 -0
  17. package/dist/public/lib/VENDORED-STYLING.md +31 -0
  18. package/dist/public/lib/aimeat-daisyui-bridge.css +48 -0
  19. package/dist/public/lib/chartjs@4.js +14 -0
  20. package/dist/public/lib/daisyui@5.css +7 -0
  21. package/dist/public/lib/tailwindcss@4.js +8 -0
  22. package/dist/public/llms-template.txt +9 -6
  23. package/dist/public/showroom.html +104 -0
  24. package/dist/public/showroom.js +247 -0
  25. package/dist/public/spa.html +18 -16
  26. package/dist/public/views/aimeat-os.js +3 -2
  27. package/dist/public/views/landing.js +50 -6
  28. package/dist/public/views/profile/agents/agent-card.js +7 -0
  29. package/dist/public/views/profile/agents/state-detector.js +6 -0
  30. package/dist/public/views/profile/agents/tab-integration.js +6 -0
  31. package/dist/public/views/profile/apps-tab.js +46 -0
  32. package/dist/public/views/profile/extensions-tab.js +4 -0
  33. package/dist/public/views/profile/inbox-tab.js +1 -1
  34. package/dist/public/views/profile/landing-page.js +8 -3
  35. package/dist/public/views/profile/memory-tab.js +37 -6
  36. package/dist/public/views/profile/organisms/home.js +32 -0
  37. package/dist/public/views/profile/organisms/workspace-list.js +36 -5
  38. package/dist/public/views/profile/organisms/workspace.js +29 -4
  39. package/dist/public/views/profile/organisms-tab.js +61 -8
  40. package/dist/public/views/secretary/calendar.js +327 -0
  41. package/dist/public/views/secretary/cards-reach.js +16 -17
  42. package/dist/public/views/secretary/cards.js +173 -66
  43. package/dist/public/views/secretary/dashboard.js +551 -0
  44. package/dist/public/views/secretary/quality.js +156 -0
  45. package/dist/public/views/secretary/use-autonomy.js +17 -2
  46. package/dist/public/views/secretary/use-freshness.js +50 -0
  47. package/dist/public/views/secretary/use-intake.js +23 -4
  48. package/dist/public/views/secretary/use-layout.js +122 -0
  49. package/dist/public/views/secretary/use-quick-actions.js +98 -0
  50. package/dist/public/views/secretary/use-specialists.js +103 -0
  51. package/dist/public/views/secretary/use-triggers.js +159 -0
  52. package/dist/public/views/secretary/use-whats-next.js +340 -0
  53. package/dist/public/views/secretary/workflow-design.js +112 -0
  54. package/dist/public/views/secretary.js +663 -39
  55. package/dist/scripts/check-no-max-tokens.d.ts +2 -0
  56. package/dist/scripts/check-no-max-tokens.d.ts.map +1 -0
  57. package/dist/scripts/check-no-max-tokens.js +71 -0
  58. package/dist/scripts/check-no-max-tokens.js.map +1 -0
  59. package/dist/src/data/aimeat-iam-package.d.ts +25 -0
  60. package/dist/src/data/aimeat-iam-package.d.ts.map +1 -0
  61. package/dist/src/data/aimeat-iam-package.js +312 -0
  62. package/dist/src/data/aimeat-iam-package.js.map +1 -0
  63. package/dist/src/data/aimeat-marketplace-package.d.ts +25 -0
  64. package/dist/src/data/aimeat-marketplace-package.d.ts.map +1 -0
  65. package/dist/src/data/aimeat-marketplace-package.js +231 -0
  66. package/dist/src/data/aimeat-marketplace-package.js.map +1 -0
  67. package/dist/src/data/app-templates.d.ts +48 -0
  68. package/dist/src/data/app-templates.d.ts.map +1 -0
  69. package/dist/src/data/app-templates.js +856 -0
  70. package/dist/src/data/app-templates.js.map +1 -0
  71. package/dist/src/data/example-packages.d.ts.map +1 -1
  72. package/dist/src/data/example-packages.js +3 -1
  73. package/dist/src/data/example-packages.js.map +1 -1
  74. package/dist/src/generated/api-types.d.ts +380 -5
  75. package/dist/src/generated/api-types.d.ts.map +1 -1
  76. package/dist/src/generated/prisma-postgres/edge.js +10 -3
  77. package/dist/src/generated/prisma-postgres/index-browser.js +7 -0
  78. package/dist/src/generated/prisma-postgres/index.d.ts +205 -2
  79. package/dist/src/generated/prisma-postgres/index.js +10 -3
  80. package/dist/src/generated/prisma-postgres/package.json +1 -1
  81. package/dist/src/generated/prisma-postgres/schema.prisma +23 -13
  82. package/dist/src/generated/prisma-postgres/wasm.js +10 -3
  83. package/dist/src/mcp/annotations.d.ts.map +1 -1
  84. package/dist/src/mcp/annotations.js +1 -0
  85. package/dist/src/mcp/annotations.js.map +1 -1
  86. package/dist/src/mcp/catalog/definitions.d.ts.map +1 -1
  87. package/dist/src/mcp/catalog/definitions.js +16 -1
  88. package/dist/src/mcp/catalog/definitions.js.map +1 -1
  89. package/dist/src/mcp/catalog/surfaces.js +3 -3
  90. package/dist/src/mcp/catalog/surfaces.js.map +1 -1
  91. package/dist/src/mcp/index.d.ts +3 -0
  92. package/dist/src/mcp/index.d.ts.map +1 -1
  93. package/dist/src/mcp/index.js +11 -0
  94. package/dist/src/mcp/index.js.map +1 -1
  95. package/dist/src/mcp/organisms.d.ts.map +1 -1
  96. package/dist/src/mcp/organisms.js +48 -8
  97. package/dist/src/mcp/organisms.js.map +1 -1
  98. package/dist/src/mcp/workspaces.d.ts.map +1 -1
  99. package/dist/src/mcp/workspaces.js +6 -4
  100. package/dist/src/mcp/workspaces.js.map +1 -1
  101. package/dist/src/models/offer-schemas.d.ts +8 -8
  102. package/dist/src/routes/ai.d.ts +8 -4
  103. package/dist/src/routes/ai.d.ts.map +1 -1
  104. package/dist/src/routes/ai.js +38 -14
  105. package/dist/src/routes/ai.js.map +1 -1
  106. package/dist/src/routes/app-grants.d.ts +2 -0
  107. package/dist/src/routes/app-grants.d.ts.map +1 -1
  108. package/dist/src/routes/app-grants.js +7 -1
  109. package/dist/src/routes/app-grants.js.map +1 -1
  110. package/dist/src/routes/app-templates.d.ts +16 -0
  111. package/dist/src/routes/app-templates.d.ts.map +1 -0
  112. package/dist/src/routes/app-templates.js +40 -0
  113. package/dist/src/routes/app-templates.js.map +1 -0
  114. package/dist/src/routes/apps.d.ts.map +1 -1
  115. package/dist/src/routes/apps.js +55 -5
  116. package/dist/src/routes/apps.js.map +1 -1
  117. package/dist/src/routes/auth.d.ts +3 -0
  118. package/dist/src/routes/auth.d.ts.map +1 -1
  119. package/dist/src/routes/auth.js +9 -4
  120. package/dist/src/routes/auth.js.map +1 -1
  121. package/dist/src/routes/bootstrap.d.ts.map +1 -1
  122. package/dist/src/routes/bootstrap.js +1 -0
  123. package/dist/src/routes/bootstrap.js.map +1 -1
  124. package/dist/src/routes/generator.d.ts.map +1 -1
  125. package/dist/src/routes/generator.js +3 -2
  126. package/dist/src/routes/generator.js.map +1 -1
  127. package/dist/src/routes/lib-ai.d.ts +0 -1
  128. package/dist/src/routes/lib-ai.d.ts.map +1 -1
  129. package/dist/src/routes/lib-ai.js +13 -6
  130. package/dist/src/routes/lib-ai.js.map +1 -1
  131. package/dist/src/routes/lib-header.d.ts +2 -0
  132. package/dist/src/routes/lib-header.d.ts.map +1 -1
  133. package/dist/src/routes/lib-header.js +7 -16
  134. package/dist/src/routes/lib-header.js.map +1 -1
  135. package/dist/src/routes/lib-markdown.d.ts +18 -0
  136. package/dist/src/routes/lib-markdown.d.ts.map +1 -0
  137. package/dist/src/routes/lib-markdown.js +236 -0
  138. package/dist/src/routes/lib-markdown.js.map +1 -0
  139. package/dist/src/routes/libs.d.ts +22 -0
  140. package/dist/src/routes/libs.d.ts.map +1 -1
  141. package/dist/src/routes/libs.js +133 -10
  142. package/dist/src/routes/libs.js.map +1 -1
  143. package/dist/src/routes/memory.d.ts.map +1 -1
  144. package/dist/src/routes/memory.js +21 -2
  145. package/dist/src/routes/memory.js.map +1 -1
  146. package/dist/src/routes/openrouter.d.ts +4 -0
  147. package/dist/src/routes/openrouter.d.ts.map +1 -1
  148. package/dist/src/routes/openrouter.js +17 -0
  149. package/dist/src/routes/openrouter.js.map +1 -1
  150. package/dist/src/routes/organisms.d.ts.map +1 -1
  151. package/dist/src/routes/organisms.js +107 -7
  152. package/dist/src/routes/organisms.js.map +1 -1
  153. package/dist/src/routes/portal.d.ts +9 -0
  154. package/dist/src/routes/portal.d.ts.map +1 -1
  155. package/dist/src/routes/portal.js +1 -1
  156. package/dist/src/routes/portal.js.map +1 -1
  157. package/dist/src/routes/public-stats.d.ts +3 -0
  158. package/dist/src/routes/public-stats.d.ts.map +1 -1
  159. package/dist/src/routes/public-stats.js +9 -2
  160. package/dist/src/routes/public-stats.js.map +1 -1
  161. package/dist/src/routes/secretary.d.ts +29 -0
  162. package/dist/src/routes/secretary.d.ts.map +1 -0
  163. package/dist/src/routes/secretary.js +220 -0
  164. package/dist/src/routes/secretary.js.map +1 -0
  165. package/dist/src/routes/specialists.d.ts.map +1 -1
  166. package/dist/src/routes/specialists.js +21 -0
  167. package/dist/src/routes/specialists.js.map +1 -1
  168. package/dist/src/routes/subdomains.js +1 -1
  169. package/dist/src/routes/subdomains.js.map +1 -1
  170. package/dist/src/routes/workflows.d.ts +9 -3
  171. package/dist/src/routes/workflows.d.ts.map +1 -1
  172. package/dist/src/routes/workflows.js +9 -3
  173. package/dist/src/routes/workflows.js.map +1 -1
  174. package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
  175. package/dist/src/server-bootstrap/routes-loader.js +4 -0
  176. package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
  177. package/dist/src/server-bootstrap/service-init.d.ts.map +1 -1
  178. package/dist/src/server-bootstrap/service-init.js +7 -0
  179. package/dist/src/server-bootstrap/service-init.js.map +1 -1
  180. package/dist/src/server-bootstrap/static-files.d.ts +4 -0
  181. package/dist/src/server-bootstrap/static-files.d.ts.map +1 -1
  182. package/dist/src/server-bootstrap/static-files.js +18 -0
  183. package/dist/src/server-bootstrap/static-files.js.map +1 -1
  184. package/dist/src/services/archive.d.ts +74 -0
  185. package/dist/src/services/archive.d.ts.map +1 -0
  186. package/dist/src/services/archive.js +132 -0
  187. package/dist/src/services/archive.js.map +1 -0
  188. package/dist/src/services/cortex-seeder.d.ts +4 -1
  189. package/dist/src/services/cortex-seeder.d.ts.map +1 -1
  190. package/dist/src/services/cortex-seeder.js +25 -6
  191. package/dist/src/services/cortex-seeder.js.map +1 -1
  192. package/dist/src/services/directory.d.ts.map +1 -1
  193. package/dist/src/services/directory.js +3 -2
  194. package/dist/src/services/directory.js.map +1 -1
  195. package/dist/src/services/generator-prompt-seeds.d.ts.map +1 -1
  196. package/dist/src/services/generator-prompt-seeds.js +5 -4
  197. package/dist/src/services/generator-prompt-seeds.js.map +1 -1
  198. package/dist/src/services/message-send.d.ts.map +1 -1
  199. package/dist/src/services/message-send.js +14 -0
  200. package/dist/src/services/message-send.js.map +1 -1
  201. package/dist/src/services/organism-search.d.ts +6 -2
  202. package/dist/src/services/organism-search.d.ts.map +1 -1
  203. package/dist/src/services/organism-search.js +2 -2
  204. package/dist/src/services/organism-search.js.map +1 -1
  205. package/dist/src/services/owner-memory.d.ts +1 -0
  206. package/dist/src/services/owner-memory.d.ts.map +1 -1
  207. package/dist/src/services/owner-memory.js.map +1 -1
  208. package/dist/src/services/owner-session.d.ts +1 -0
  209. package/dist/src/services/owner-session.d.ts.map +1 -1
  210. package/dist/src/services/owner-session.js +10 -2
  211. package/dist/src/services/owner-session.js.map +1 -1
  212. package/dist/src/services/package-seeder.d.ts +22 -0
  213. package/dist/src/services/package-seeder.d.ts.map +1 -0
  214. package/dist/src/services/package-seeder.js +30 -0
  215. package/dist/src/services/package-seeder.js.map +1 -0
  216. package/dist/src/services/presence.d.ts +3 -0
  217. package/dist/src/services/presence.d.ts.map +1 -1
  218. package/dist/src/services/presence.js +10 -0
  219. package/dist/src/services/presence.js.map +1 -1
  220. package/dist/src/services/prompt-defaults.d.ts.map +1 -1
  221. package/dist/src/services/prompt-defaults.js +8 -3
  222. package/dist/src/services/prompt-defaults.js.map +1 -1
  223. package/dist/src/services/scheduler.d.ts +41 -2
  224. package/dist/src/services/scheduler.d.ts.map +1 -1
  225. package/dist/src/services/scheduler.js +429 -26
  226. package/dist/src/services/scheduler.js.map +1 -1
  227. package/dist/src/services/secretary-authoring.d.ts +71 -0
  228. package/dist/src/services/secretary-authoring.d.ts.map +1 -0
  229. package/dist/src/services/secretary-authoring.js +336 -0
  230. package/dist/src/services/secretary-authoring.js.map +1 -0
  231. package/dist/src/services/secretary-clarify.d.ts +57 -0
  232. package/dist/src/services/secretary-clarify.d.ts.map +1 -0
  233. package/dist/src/services/secretary-clarify.js +104 -0
  234. package/dist/src/services/secretary-clarify.js.map +1 -0
  235. package/dist/src/services/secretary-feed.d.ts +11 -0
  236. package/dist/src/services/secretary-feed.d.ts.map +1 -0
  237. package/dist/src/services/secretary-feed.js +28 -0
  238. package/dist/src/services/secretary-feed.js.map +1 -0
  239. package/dist/src/services/secretary-tick.d.ts +243 -3
  240. package/dist/src/services/secretary-tick.d.ts.map +1 -1
  241. package/dist/src/services/secretary-tick.js +273 -3
  242. package/dist/src/services/secretary-tick.js.map +1 -1
  243. package/dist/src/services/specialist-runner.d.ts +36 -0
  244. package/dist/src/services/specialist-runner.d.ts.map +1 -0
  245. package/dist/src/services/specialist-runner.js +91 -0
  246. package/dist/src/services/specialist-runner.js.map +1 -0
  247. package/dist/src/services/specialist.d.ts +9 -0
  248. package/dist/src/services/specialist.d.ts.map +1 -1
  249. package/dist/src/services/specialist.js +42 -0
  250. package/dist/src/services/specialist.js.map +1 -1
  251. package/dist/src/services/structure-overview.d.ts +13 -0
  252. package/dist/src/services/structure-overview.d.ts.map +1 -1
  253. package/dist/src/services/structure-overview.js +34 -11
  254. package/dist/src/services/structure-overview.js.map +1 -1
  255. package/dist/src/services/system-agent-responder.d.ts +36 -0
  256. package/dist/src/services/system-agent-responder.d.ts.map +1 -0
  257. package/dist/src/services/system-agent-responder.js +107 -0
  258. package/dist/src/services/system-agent-responder.js.map +1 -0
  259. package/dist/src/services/system-agent.d.ts +34 -1
  260. package/dist/src/services/system-agent.d.ts.map +1 -1
  261. package/dist/src/services/system-agent.js +73 -0
  262. package/dist/src/services/system-agent.js.map +1 -1
  263. package/dist/src/storage/interface.d.ts +33 -0
  264. package/dist/src/storage/interface.d.ts.map +1 -1
  265. package/dist/src/storage/interface.js.map +1 -1
  266. package/dist/src/storage/providers/mongodb/index.d.ts +37 -0
  267. package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
  268. package/dist/src/storage/providers/mongodb/index.js +132 -12
  269. package/dist/src/storage/providers/mongodb/index.js.map +1 -1
  270. package/dist/src/storage/providers/sqlite/index.d.ts +23 -1
  271. package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
  272. package/dist/src/storage/providers/sqlite/index.js +60 -8
  273. package/dist/src/storage/providers/sqlite/index.js.map +1 -1
  274. package/dist/src/storage/providers/sqlite/repos/memory.d.ts +29 -1
  275. package/dist/src/storage/providers/sqlite/repos/memory.d.ts.map +1 -1
  276. package/dist/src/storage/providers/sqlite/repos/memory.js +109 -10
  277. package/dist/src/storage/providers/sqlite/repos/memory.js.map +1 -1
  278. package/dist/src/storage/providers/sqlite/schema.d.ts +3 -0
  279. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  280. package/dist/src/storage/providers/sqlite/schema.js +64 -9
  281. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  282. package/dist/src/storage/repositories/app.repository.d.ts +15 -0
  283. package/dist/src/storage/repositories/app.repository.d.ts.map +1 -1
  284. package/dist/src/storage/repositories/memory.repository.d.ts +41 -1
  285. package/dist/src/storage/repositories/memory.repository.d.ts.map +1 -1
  286. package/dist/src/storage/repositories/organism.repository.d.ts +2 -1
  287. package/dist/src/storage/repositories/organism.repository.d.ts.map +1 -1
  288. package/dist/static/app-catalog.html +469 -122
  289. package/package.json +2 -1
  290. package/prisma/schema.postgres.prisma +10 -0
  291. package/prisma/schema.prisma +12 -0
@@ -60,8 +60,9 @@ entry: index.html
60
60
  <meta charset="UTF-8">
61
61
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
62
62
  <title>App Name</title>
63
- <link href="https://cdn.jsdelivr.net/npm/daisyui@5" rel="stylesheet" />
64
- <script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
63
+ <link href="/lib/daisyui@5.css" rel="stylesheet" />
64
+ <link href="/lib/aimeat-daisyui-bridge.css" rel="stylesheet" />
65
+ <script src="/lib/tailwindcss@4.js"></script>
65
66
  </head>
66
67
  <body class="bg-base-100 min-h-screen flex flex-col">
67
68
  <nav class="navbar bg-base-200 shadow-sm px-4">
@@ -136,8 +137,9 @@ entry: index.html
136
137
  <meta charset="UTF-8">
137
138
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
138
139
  <title>Public Viewer</title>
139
- <link href="https://cdn.jsdelivr.net/npm/daisyui@5" rel="stylesheet" />
140
- <script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
140
+ <link href="/lib/daisyui@5.css" rel="stylesheet" />
141
+ <link href="/lib/aimeat-daisyui-bridge.css" rel="stylesheet" />
142
+ <script src="/lib/tailwindcss@4.js"></script>
141
143
  </head>
142
144
  <body class="bg-base-100 min-h-screen flex flex-col">
143
145
  <nav class="navbar bg-base-200 shadow-sm px-4">
@@ -487,8 +489,9 @@ entry: index.html
487
489
  <meta charset="UTF-8">
488
490
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
489
491
  <title>App Name</title>
490
- <link href="https://cdn.jsdelivr.net/npm/daisyui@5" rel="stylesheet" type="text/css" />
491
- <script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
492
+ <link href="/lib/daisyui@5.css" rel="stylesheet" type="text/css" />
493
+ <link href="/lib/aimeat-daisyui-bridge.css" rel="stylesheet" type="text/css" />
494
+ <script src="/lib/tailwindcss@4.js"></script>
492
495
  <style>
493
496
  /* App-specific styles here */
494
497
  </style>
@@ -0,0 +1,104 @@
1
+ <!DOCTYPE html>
2
+ <!-- AIMEAT App Manifest
3
+ name: aimeat-cortex-showroom
4
+ version: 0.2.0
5
+ description: Comprehensive live showroom of every bundled AIMEAT cortex UI component, styled with self-hosted Tailwind + daisyUI.
6
+ entry: index.html
7
+ -->
8
+ <html lang="en" data-theme="dark">
9
+ <head>
10
+ <meta charset="UTF-8" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
12
+ <title>AIMEAT Cortex Library Showroom</title>
13
+ <!-- Self-hosted (vendored) — served from our own node /lib/, not a CDN -->
14
+ <link href="/lib/daisyui@5.css" rel="stylesheet" type="text/css" />
15
+ <!-- Bridge: makes the cortex UI libs follow daisyUI's data-theme (maps --text/--bg-card/… → --color-*) -->
16
+ <link href="/lib/aimeat-daisyui-bridge.css" rel="stylesheet" type="text/css" />
17
+ <script src="/lib/tailwindcss@4.js"></script>
18
+ <script src="/lib/chartjs@4.js"></script>
19
+ <!-- All logic in an external same-origin file so the apex CSP ('self') allows it
20
+ without an inline nonce. The published single-file app inlines this. -->
21
+ <script src="/showroom.js" defer></script>
22
+ </head>
23
+ <body class="bg-base-100 text-base-content min-h-screen flex flex-col">
24
+ <nav class="navbar bg-base-200 shadow-sm px-4 sticky top-0 z-50">
25
+ <div class="flex-1 gap-3">
26
+ <span class="text-lg font-bold">AIME<span style="color:#E8564A">&#9829;</span>AT</span>
27
+ <span class="opacity-70 hidden sm:inline">Cortex Library Showroom</span>
28
+ </div>
29
+ <div class="flex-none gap-2">
30
+ <span class="badge badge-soft badge-success" id="vendor-badge">self-hosted Tailwind + daisyUI</span>
31
+ <button class="btn btn-sm btn-primary" id="theme-toggle">Toggle theme</button>
32
+ </div>
33
+ </nav>
34
+
35
+ <main class="flex-1 w-full max-w-6xl mx-auto p-4 flex flex-col gap-6">
36
+
37
+ <section class="card bg-base-200 shadow"><div class="card-body">
38
+ <h2 class="card-title">daisyUI chrome <span class="badge badge-info badge-sm">Tailwind v4 + daisyUI 5 (self-hosted)</span></h2>
39
+ <p class="opacity-70 text-sm">Styled chrome below ⇒ vendored Tailwind + daisyUI loaded from <code>/lib/</code>.</p>
40
+ <div class="flex flex-wrap items-center gap-2 mt-2">
41
+ <button class="btn btn-primary btn-sm">Primary</button>
42
+ <button class="btn btn-secondary btn-sm">Secondary</button>
43
+ <button class="btn btn-accent btn-sm">Accent</button>
44
+ <button class="btn btn-outline btn-sm">Outline</button>
45
+ <span class="badge badge-primary">badge</span>
46
+ <span class="badge badge-success">ok</span>
47
+ <span class="badge badge-warning">warn</span>
48
+ <input type="checkbox" class="toggle toggle-primary" checked />
49
+ <progress class="progress progress-primary w-32" value="70" max="100"></progress>
50
+ </div>
51
+ </div></section>
52
+
53
+ <section class="card bg-base-200 shadow"><div class="card-body">
54
+ <h2 class="card-title">Cortex libraries loaded <span id="load-summary" class="badge badge-sm">…</span></h2>
55
+ <div id="load-status" class="flex flex-wrap gap-2"></div>
56
+ </div></section>
57
+
58
+ <section class="card bg-base-200 shadow"><div class="card-body">
59
+ <h2 class="card-title">aimeat-ui-forms <span class="badge badge-ghost badge-sm">7 components</span></h2>
60
+ <div id="demo-forms" class="grid gap-3 md:grid-cols-2 mt-2"></div>
61
+ </div></section>
62
+
63
+ <section class="card bg-base-200 shadow"><div class="card-body">
64
+ <h2 class="card-title">aimeat-i18n <span class="badge badge-ghost badge-sm">new · AIMEAT.i18n</span></h2>
65
+ <div id="demo-i18n" class="grid gap-3 md:grid-cols-2 mt-2"></div>
66
+ </div></section>
67
+
68
+ <section class="card bg-base-200 shadow"><div class="card-body">
69
+ <h2 class="card-title">aimeat-ui-dialogs <span class="badge badge-ghost badge-sm">6 components</span></h2>
70
+ <div id="demo-dialogs" class="grid gap-3 md:grid-cols-2 mt-2"></div>
71
+ </div></section>
72
+
73
+ <section class="card bg-base-200 shadow"><div class="card-body">
74
+ <h2 class="card-title">aimeat-ui-viewers <span class="badge badge-ghost badge-sm">6 components</span></h2>
75
+ <div id="demo-viewers" class="grid gap-3 md:grid-cols-2 mt-2"></div>
76
+ </div></section>
77
+
78
+ <section class="card bg-base-200 shadow"><div class="card-body">
79
+ <h2 class="card-title">aimeat-ui-nav <span class="badge badge-ghost badge-sm">5 components</span></h2>
80
+ <div id="demo-nav" class="grid gap-3 md:grid-cols-2 mt-2"></div>
81
+ </div></section>
82
+
83
+ <section class="card bg-base-200 shadow"><div class="card-body">
84
+ <h2 class="card-title">aimeat-ui-layout <span class="badge badge-ghost badge-sm">10 components</span></h2>
85
+ <div id="demo-layout" class="grid gap-3 md:grid-cols-2 mt-2"></div>
86
+ </div></section>
87
+
88
+ <section class="card bg-base-200 shadow"><div class="card-body">
89
+ <h2 class="card-title">aimeat-charts <span class="badge badge-ghost badge-sm">self-hosted Chart.js</span></h2>
90
+ <div id="demo-charts" class="grid gap-3 md:grid-cols-2 mt-2"></div>
91
+ </div></section>
92
+
93
+ <section class="card bg-base-200 shadow"><div class="card-body">
94
+ <h2 class="card-title">aimeat-canvas <span class="badge badge-ghost badge-sm">DrawingCanvas</span></h2>
95
+ <div id="demo-canvas" class="mt-2"></div>
96
+ </div></section>
97
+
98
+ </main>
99
+
100
+ <footer class="footer footer-center p-4 text-sm opacity-60">
101
+ <span>AIMEAT Cortex Library Showroom — vendored Tailwind v4 · daisyUI 5 · Chart.js 4</span>
102
+ </footer>
103
+ </body>
104
+ </html>
@@ -0,0 +1,247 @@
1
+ /**
2
+ * @file showroom.js
3
+ * @description Comprehensive demo logic for the AIMEAT Cortex Library Showroom. Loads the
4
+ * 7 bundled cortex UI libraries (with a /v1/cortex → /cortex-bundled fallback) and
5
+ * exercises EVERY exported component, on top of self-hosted Tailwind v4 + daisyUI 5.
6
+ * Kept external (same-origin) so the apex CSP ('self') runs it without an inline nonce;
7
+ * the published single-file app inlines this into a <script> block.
8
+ * @version-history
9
+ * v0.1.0 — 2026-06-26 — Initial showroom for vendored-styling verification.
10
+ * v0.2.0 — 2026-06-26 — Comprehensive: every component of all 7 libraries.
11
+ */
12
+ (function () {
13
+ 'use strict';
14
+
15
+ var CORTEX = ['aimeat-ui-forms', 'aimeat-i18n', 'aimeat-ui-dialogs', 'aimeat-ui-viewers',
16
+ 'aimeat-ui-nav', 'aimeat-ui-layout', 'aimeat-charts', 'aimeat-canvas'];
17
+
18
+ function loadScript(src) {
19
+ return new Promise(function (res, rej) {
20
+ var s = document.createElement('script');
21
+ s.src = src; s.onload = function () { res(src); }; s.onerror = function () { rej(new Error(src)); };
22
+ document.head.appendChild(s);
23
+ });
24
+ }
25
+ function loadCortex(name) {
26
+ return loadScript('/v1/cortex/' + name + '/libs/' + name + '.js')
27
+ .then(function () { return { name: name, ok: true, via: 'v1/cortex' }; })
28
+ .catch(function () {
29
+ return loadScript('/cortex-bundled/' + name + '.js')
30
+ .then(function () { return { name: name, ok: true, via: 'cortex-bundled' }; })
31
+ .catch(function () { return { name: name, ok: false, via: 'none' }; });
32
+ });
33
+ }
34
+ function ns(path) { var o = window.AIMEAT || {}; for (var i = 0; i < path.length; i++) o = o && o[path[i]]; return o; }
35
+
36
+ var uid = 0;
37
+ function nextId() { uid += 1; return 'sr-host-' + uid; }
38
+ function el(tag, cls, text) { var e = document.createElement(tag); if (cls) e.className = cls; if (text != null) e.textContent = text; return e; }
39
+ function svg(color, label) {
40
+ var s = '<svg xmlns="http://www.w3.org/2000/svg" width="120" height="80"><rect width="120" height="80" fill="' + color + '"/>'
41
+ + '<text x="60" y="44" font-size="12" fill="#fff" text-anchor="middle" font-family="sans-serif">' + label + '</text></svg>';
42
+ return 'data:image/svg+xml;utf8,' + encodeURIComponent(s);
43
+ }
44
+
45
+ // A labelled sub-card for one component. fn(mount) renders into mount.
46
+ function sub(host, title, fn) {
47
+ var card = el('div', 'card bg-base-100 border border-base-300');
48
+ var body = el('div', 'card-body p-3 gap-2');
49
+ var h = el('h3', 'font-semibold text-sm opacity-80'); h.textContent = title;
50
+ var mount = el('div', 'min-h-8');
51
+ body.appendChild(h); body.appendChild(mount); card.appendChild(body); host.appendChild(card);
52
+ try { fn(mount); }
53
+ catch (e) {
54
+ var a = el('div', 'alert alert-error text-xs', 'error: ' + (e && e.message ? e.message : e));
55
+ mount.appendChild(a);
56
+ // eslint-disable-next-line no-console
57
+ console.error('[showroom] ' + title, e);
58
+ }
59
+ }
60
+ function btn(label, onClick) { var b = el('button', 'btn btn-sm btn-outline', label); b.onclick = onClick; return b; }
61
+
62
+ /* ───────── forms ───────── */
63
+ function renderForms(host) {
64
+ var f = ns(['ui', 'forms']); if (!f) return;
65
+ sub(host, 'Input', function (m) { m.appendChild(f.Input({ label: 'Email', type: 'email' }).el); });
66
+ sub(host, 'Select', function (m) { m.appendChild(f.Select({ label: 'Country', options: [{ value: 'fi', label: 'Finland' }, { value: 'se', label: 'Sweden' }, { value: 'no', label: 'Norway' }] }).el); });
67
+ sub(host, 'Checkbox', function (m) { m.appendChild(f.Checkbox({ label: 'Subscribe', checked: true }).el); });
68
+ sub(host, 'Radio', function (m) { m.appendChild(f.Radio({ label: 'Plan', options: [{ value: 'free', label: 'Free' }, { value: 'pro', label: 'Pro' }] }).el); });
69
+ sub(host, 'Toggle', function (m) { m.appendChild(f.Toggle({ label: 'Notifications' }).el); });
70
+ sub(host, 'Textarea', function (m) { m.appendChild(f.Textarea({ label: 'Bio', autoGrow: true }).el); });
71
+ sub(host, 'FormGroup', function (m) {
72
+ m.appendChild(f.FormGroup({
73
+ submitLabel: 'Save',
74
+ fields: [{ name: 'name', type: 'text', label: 'Name', required: true }, { name: 'agree', type: 'checkbox', label: 'I agree', required: true }],
75
+ onSubmit: function (d) { var t = ns(['ui', 'dialogs']); if (t) t.toast('Saved: ' + JSON.stringify(d), 'success'); },
76
+ }).el);
77
+ });
78
+ }
79
+
80
+ /* ───────── i18n ───────── */
81
+ function renderI18n(host) {
82
+ var i = ns(['i18n']); if (!i) return;
83
+ var trans = {
84
+ en: { greet: 'Hello, {name}!', tagline: 'Localized via data-i18n', hint: 'Switch language above — the text updates live.' },
85
+ fi: { greet: 'Hei, {name}!', tagline: 'Lokalisoitu data-i18n:llä', hint: 'Vaihda kieli yltä — teksti päivittyy heti.' },
86
+ sv: { greet: 'Hej, {name}!', tagline: 'Lokaliserad via data-i18n', hint: 'Byt språk ovan — texten uppdateras direkt.' },
87
+ };
88
+ i.init({ locales: ['en', 'fi', 'sv'], default: 'en', translations: trans }).then(function () {
89
+ sub(host, 'LanguageSwitcher + t() + data-i18n', function (m) {
90
+ var greet = el('div', 'text-lg font-semibold');
91
+ var hint = el('div', 'text-sm opacity-70');
92
+ var tag = el('p', 'mt-1 badge badge-soft'); tag.setAttribute('data-i18n', 'tagline');
93
+ function render() { greet.textContent = i.t('greet', { name: 'AIMEAT' }); hint.textContent = i.t('hint'); i.apply(m); }
94
+ i.LanguageSwitcher({ target: m, onChange: render });
95
+ m.appendChild(greet); m.appendChild(hint); m.appendChild(tag); render();
96
+ });
97
+ sub(host, 'locales() / getLocale()', function (m) {
98
+ m.appendChild(el('div', 'text-sm opacity-70', 'available: ' + i.locales().join(', ') + ' · current: ' + i.getLocale()));
99
+ });
100
+ });
101
+ }
102
+
103
+ /* ───────── dialogs ───────── */
104
+ function renderDialogs(host) {
105
+ var d = ns(['ui', 'dialogs']); if (!d) return;
106
+ sub(host, 'toast', function (m) { m.appendChild(btn('Show toast', function () { d.toast('Hello from aimeat-ui-dialogs', 'info', 2500); })); });
107
+ sub(host, 'Modal', function (m) { m.appendChild(btn('Open modal', function () { d.Modal({ title: 'Demo modal', content: 'Rendered by the cortex library.', width: 'md' }); })); });
108
+ sub(host, 'Confirm', function (m) { m.appendChild(btn('Confirm…', function () { var p = d.Confirm({ message: 'Proceed?', title: 'Confirm' }); if (p && p.then) p.then(function (ok) { d.toast('Chose: ' + ok, ok ? 'success' : 'warning'); }); })); });
109
+ sub(host, 'Alert', function (m) { m.appendChild(d.Alert({ message: 'Inline alert — informational.', type: 'info', dismissible: true }).el); });
110
+ sub(host, 'ContextMenu', function (m) {
111
+ var box = el('div', 'p-4 rounded border border-dashed border-base-300 text-sm cursor-context-menu', 'Right-click me');
112
+ d.ContextMenu({ target: box, items: [{ label: 'Edit', onClick: function () { d.toast('Edit', 'info'); } }, { label: 'Delete', onClick: function () { d.toast('Delete', 'error'); } }] });
113
+ m.appendChild(box);
114
+ });
115
+ sub(host, 'Dropdown', function (m) {
116
+ var trigger = el('button', 'btn btn-sm', 'Open dropdown ▾');
117
+ m.appendChild(trigger);
118
+ d.Dropdown({ trigger: trigger, items: [{ label: 'Profile', onClick: function () { d.toast('Profile', 'info'); } }, { label: 'Settings', onClick: function () { d.toast('Settings', 'info'); } }] });
119
+ });
120
+ }
121
+
122
+ /* ───────── viewers ───────── */
123
+ function renderViewers(host) {
124
+ var v = ns(['ui', 'viewers']); if (!v) return;
125
+ sub(host, 'Carousel', function (m) {
126
+ v.Carousel({ target: m, items: [el('div', 'p-8 text-center', 'Slide 1'), el('div', 'p-8 text-center', 'Slide 2'), el('div', 'p-8 text-center', 'Slide 3')], loop: true });
127
+ });
128
+ sub(host, 'Grid', function (m) {
129
+ v.Grid({ target: m, items: [1, 2, 3, 4], minColWidth: 90, renderItem: function (i) { return el('div', 'p-4 rounded bg-base-200 text-center text-sm', 'Card ' + i); } });
130
+ });
131
+ sub(host, 'List', function (m) {
132
+ v.List({ target: m, items: [{ title: 'Alice', subtitle: 'Admin', badge: 'A' }, { title: 'Bob', subtitle: 'User', badge: 'B' }] });
133
+ });
134
+ sub(host, 'Gallery', function (m) {
135
+ v.Gallery({ target: m, cols: 3, images: [svg('#6366f1', 'one'), svg('#10b981', 'two'), svg('#f59e0b', 'three')] });
136
+ });
137
+ sub(host, 'DataTable', function (m) {
138
+ v.DataTable({
139
+ target: m, sortable: true, filterable: true, pageSize: 4,
140
+ columns: [{ key: 'name', label: 'Name' }, { key: 'role', label: 'Role' }, { key: 'score', label: 'Score' }],
141
+ rows: [{ name: 'Alice', role: 'Admin', score: 92 }, { name: 'Bob', role: 'User', score: 71 }, { name: 'Carol', role: 'User', score: 85 }, { name: 'Dave', role: 'Editor', score: 64 }, { name: 'Erin', role: 'Admin', score: 78 }],
142
+ });
143
+ });
144
+ sub(host, 'Timeline', function (m) {
145
+ v.Timeline({ target: m, events: [{ title: 'Created', content: 'Project created', date: '2026-06-01' }, { title: 'Shipped', content: 'First release', date: '2026-06-20' }] });
146
+ });
147
+ }
148
+
149
+ /* ───────── nav ───────── */
150
+ function renderNav(host) {
151
+ var n = ns(['ui', 'nav']); if (!n) return;
152
+ sub(host, 'Tabs', function (m) {
153
+ var out = el('div', 'text-xs opacity-70 mt-1');
154
+ n.Tabs({ target: m, active: 'a', tabs: [{ id: 'a', label: 'Overview' }, { id: 'b', label: 'Details' }, { id: 'c', label: 'Settings' }], onChange: function (id) { out.textContent = 'active: ' + id; } });
155
+ m.appendChild(out);
156
+ });
157
+ sub(host, 'Breadcrumbs', function (m) { n.Breadcrumbs({ target: m, items: [{ label: 'Home' }, { label: 'Libraries' }, { label: 'Nav' }] }); });
158
+ sub(host, 'Sidebar', function (m) {
159
+ var box = el('div', 'border border-base-300 rounded', null); box.style.height = '160px'; box.style.position = 'relative'; box.style.overflow = 'hidden';
160
+ n.Sidebar({ target: box, items: [{ label: 'Dashboard' }, { label: 'Reports' }, { label: 'Settings' }] });
161
+ m.appendChild(box);
162
+ });
163
+ sub(host, 'BottomNav (mobile-only)', function (m) {
164
+ var box = el('div', 'border border-base-300 rounded', null); box.style.height = '64px'; box.style.position = 'relative'; box.style.overflow = 'hidden';
165
+ n.BottomNav({ target: box, active: 0, items: [{ label: 'Home' }, { label: 'Search' }, { label: 'Profile' }] });
166
+ m.appendChild(box);
167
+ m.appendChild(el('div', 'text-xs opacity-60 mt-1', 'Hidden >768px by design.'));
168
+ });
169
+ sub(host, 'BurgerMenu', function (m) {
170
+ var box = el('div', 'border border-base-300 rounded p-2', null); box.style.minHeight = '56px'; box.style.position = 'relative';
171
+ n.BurgerMenu({ target: box, logo: 'Menu', items: [{ label: 'Home' }, { label: 'About' }, { label: 'Contact' }] });
172
+ m.appendChild(box);
173
+ });
174
+ }
175
+
176
+ /* ───────── layout ───────── */
177
+ function renderLayout(host) {
178
+ var L = ns(['ui', 'layout']); if (!L) return;
179
+ function frame(h) { var box = el('div', 'border border-base-300 rounded overflow-hidden'); box.style.height = (h || 140) + 'px'; return box; }
180
+ function pane(t) { return el('div', 'p-3 text-sm', t); }
181
+ sub(host, 'MainDetail', function (m) { var b = frame(); L.MainDetail({ target: b, list: pane('List pane'), detail: pane('Detail pane') }); m.appendChild(b); });
182
+ sub(host, 'Split', function (m) { var b = frame(); L.Split({ target: b, left: pane('Left'), right: pane('Right'), ratio: '60/40' }); m.appendChild(b); });
183
+ sub(host, 'Fibonacci', function (m) { var b = frame(); L.Fibonacci({ target: b, primary: pane('Primary 61.8%'), secondary: pane('Secondary 38.2%') }); m.appendChild(b); });
184
+ sub(host, 'HolyGrail', function (m) { var b = frame(170); L.HolyGrail({ target: b, header: pane('Header'), left: pane('Left'), main: pane('Main'), right: pane('Right'), footer: pane('Footer') }); m.appendChild(b); });
185
+ sub(host, 'DashboardGrid', function (m) { var b = frame(); L.DashboardGrid({ target: b, cols: 2, widgets: [pane('W1'), pane('W2'), pane('W3'), pane('W4')] }); m.appendChild(b); });
186
+ sub(host, 'Stacked', function (m) { var b = frame(); L.Stacked({ target: b, sections: [pane('Section A'), pane('Section B'), pane('Section C')] }); m.appendChild(b); });
187
+ sub(host, 'Portrait', function (m) { var b = frame(); L.Portrait({ target: b, content: pane('Portrait (centred column)'), maxWidth: 360 }); m.appendChild(b); });
188
+ sub(host, 'Landscape', function (m) { var b = frame(); L.Landscape({ target: b, content: pane('Landscape (full width)') }); m.appendChild(b); });
189
+ sub(host, 'Header', function (m) { var b = frame(70); L.Header({ target: b, title: 'App title', actions: ['Action'] }); m.appendChild(b); });
190
+ sub(host, 'Footer', function (m) { var b = frame(70); L.Footer({ target: b, content: 'Footer content', links: [{ label: 'Privacy' }, { label: 'Terms' }] }); m.appendChild(b); });
191
+ }
192
+
193
+ /* ───────── charts ───────── */
194
+ function renderCharts(host) {
195
+ var c = ns(['charts']); if (!c) return;
196
+ if (!window.Chart) { sub(host, 'charts', function (m) { m.appendChild(el('div', 'alert alert-error text-xs', 'Chart.js not loaded')); }); return; }
197
+ function chart(title, type, data) {
198
+ sub(host, 'ChartBuilder · ' + type, function (m) {
199
+ var id = nextId(); var div = el('div', null); div.id = id; div.style.height = '220px'; m.appendChild(div);
200
+ c.ChartBuilder({ elementId: id, type: type, data: data });
201
+ });
202
+ }
203
+ var labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'];
204
+ chart('bar', 'bar', { labels: labels, datasets: [{ label: 'Plays', data: [12, 19, 8, 15, 22] }] });
205
+ chart('line', 'line', { labels: labels, datasets: [{ label: 'Trend', data: [5, 9, 7, 12, 14] }] });
206
+ chart('doughnut', 'doughnut', { labels: ['A', 'B', 'C'], datasets: [{ label: 'Share', data: [40, 35, 25] }] });
207
+ sub(host, 'ChartPanel', function (m) { m.appendChild(el('div', 'text-xs opacity-70', 'ChartPanel reads a stored chart:* key from memory (needs nodeUrl + token) — demonstrated live in a logged-in app.')); });
208
+ }
209
+
210
+ /* ───────── canvas ───────── */
211
+ function renderCanvas(host) {
212
+ var k = ns(['canvas']); if (!k) return;
213
+ var id = nextId(); var div = el('div', null); div.id = id; host.appendChild(div);
214
+ k.DrawingCanvas({ elementId: id, options: { width: 760, height: 300, autoSave: false } });
215
+ }
216
+
217
+ function renderStatus(results) {
218
+ var host = document.getElementById('load-status'); var ok = 0;
219
+ results.forEach(function (r) {
220
+ var b = el('span', 'badge badge-sm ' + (r.ok ? 'badge-success' : 'badge-error'), r.name + (r.ok ? ' · ' + r.via : ' · missing'));
221
+ host.appendChild(b); if (r.ok) ok++;
222
+ });
223
+ var sum = document.getElementById('load-summary');
224
+ sum.textContent = ok + '/' + results.length + ' loaded';
225
+ sum.className = 'badge badge-sm ' + (ok === results.length ? 'badge-success' : 'badge-warning');
226
+ }
227
+
228
+ function init() {
229
+ var tg = document.getElementById('theme-toggle');
230
+ if (tg) tg.onclick = function () { var e = document.documentElement; e.setAttribute('data-theme', e.getAttribute('data-theme') === 'dark' ? 'light' : 'dark'); };
231
+ window.AIMEAT = window.AIMEAT || {};
232
+ Promise.all(CORTEX.map(loadCortex)).then(function (results) {
233
+ renderStatus(results);
234
+ renderForms(document.getElementById('demo-forms'));
235
+ renderI18n(document.getElementById('demo-i18n'));
236
+ renderDialogs(document.getElementById('demo-dialogs'));
237
+ renderViewers(document.getElementById('demo-viewers'));
238
+ renderNav(document.getElementById('demo-nav'));
239
+ renderLayout(document.getElementById('demo-layout'));
240
+ renderCharts(document.getElementById('demo-charts'));
241
+ renderCanvas(document.getElementById('demo-canvas'));
242
+ });
243
+ }
244
+
245
+ if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init);
246
+ else init();
247
+ })();
@@ -176,12 +176,22 @@
176
176
  "/js/services/organisms.js": "/js/services/organisms.js",
177
177
  "/js/services/secretary-policy.js": "/js/services/secretary-policy.js",
178
178
  "/js/services/secretary-helpers.js": "/js/services/secretary-helpers.js",
179
+ "/js/services/secretary-rules.js": "/js/services/secretary-rules.js",
179
180
  "/js/services/secretary-routing.js": "/js/services/secretary-routing.js",
180
181
  "/views/secretary/cards.js": "/views/secretary/cards.js",
181
182
  "/views/secretary/cards-reach.js": "/views/secretary/cards-reach.js",
183
+ "/views/secretary/dashboard.js": "/views/secretary/dashboard.js",
182
184
  "/views/secretary/use-intake.js": "/views/secretary/use-intake.js",
183
- "/views/secretary/use-guided-plan.js": "/views/secretary/use-guided-plan.js",
185
+ "/views/secretary/use-whats-next.js": "/views/secretary/use-whats-next.js",
186
+ "/views/secretary/use-quick-actions.js": "/views/secretary/use-quick-actions.js",
187
+ "/views/secretary/use-freshness.js": "/views/secretary/use-freshness.js",
184
188
  "/views/secretary/use-autonomy.js": "/views/secretary/use-autonomy.js",
189
+ "/views/secretary/calendar.js": "/views/secretary/calendar.js",
190
+ "/views/secretary/use-triggers.js": "/views/secretary/use-triggers.js",
191
+ "/views/secretary/use-layout.js": "/views/secretary/use-layout.js",
192
+ "/views/secretary/quality.js": "/views/secretary/quality.js",
193
+ "/views/secretary/workflow-design.js": "/views/secretary/workflow-design.js",
194
+ "/views/secretary/use-specialists.js": "/views/secretary/use-specialists.js",
185
195
  "/views/secretary/use-learning.js": "/views/secretary/use-learning.js",
186
196
  "/views/secretary/use-create-resource.js": "/views/secretary/use-create-resource.js",
187
197
  "/views/secretary/use-knowledge.js": "/views/secretary/use-knowledge.js",
@@ -306,7 +316,7 @@
306
316
  import { useState, useEffect, useCallback } from 'preact/hooks';
307
317
  import htm from 'htm';
308
318
  import { loadTranslations, t, getLocale, switchLocale, onLocaleChange } from '/js/i18n.js';
309
- import { initThemeSystem, getTheme, toggleTheme, onThemeChange } from '/js/theme.js';
319
+ import { initThemeSystem } from '/js/theme.js';
310
320
  import { NotificationBell } from '/components/NotificationBell.js';
311
321
  import { CommandPalette } from '/views/command-palette.js';
312
322
  import { openAppSandboxed, isAppHtmlUrl } from '/js/app-sandbox.js';
@@ -511,19 +521,9 @@
511
521
  }
512
522
 
513
523
  // ── Theme Toggle ──
514
- // Renders next to the language buttons; flips light <-> dark and persists.
515
- // Shows a moon in light mode (click → dark) and a sun in dark mode.
516
- function ThemeToggle() {
517
- const [theme, setThemeState] = useState(getTheme());
518
- useEffect(() => onThemeChange((next) => setThemeState(next)), []);
519
- const isDark = theme === 'dark';
520
- const label = isDark ? t('nav.themeToLight') : t('nav.themeToDark');
521
- return html`
522
- <button class="theme-toggle-btn" onClick=${toggleTheme} title=${label} aria-label=${label}>
523
- ${isDark ? '☀' : '☾'}
524
- </button>
525
- `;
526
- }
524
+ // The light/dark switch now lives INSIDE the golden login pill (served by libs.ts →
525
+ // mountLoginButton) so every app embedding the pill inherits it for free. theme.js still
526
+ // runs (initThemeSystem) to track OS preference and adopt the pill's theme changes.
527
527
 
528
528
  // ── Header Component ──
529
529
  // Built-in public links. Operators can show/hide and reorder these via the admin
@@ -668,7 +668,6 @@
668
668
  `}
669
669
  `}
670
670
  <div class="topnav-center">
671
- <${ThemeToggle} />
672
671
  <button class="lang-btn ${locale === 'en' ? 'active' : ''}" onClick=${() => handleLangSwitch('en')}>EN</button>
673
672
  <button class="lang-btn ${locale === 'fi' ? 'active' : ''}" onClick=${() => handleLangSwitch('fi')}>FI</button>
674
673
  </div>
@@ -746,6 +745,9 @@
746
745
  const v = t('modal.' + k);
747
746
  if (v !== 'modal.' + k) obj[k] = v;
748
747
  }
748
+ // Labels for the theme toggle that now lives inside the login pill.
749
+ obj.themeToDark = t('nav.themeToDark');
750
+ obj.themeToLight = t('nav.themeToLight');
749
751
  return obj;
750
752
  }
751
753
 
@@ -137,8 +137,9 @@ function generateMarkdown(nodeUrl) {
137
137
  md += `<!DOCTYPE html>\n<html lang="en">\n<head>\n`;
138
138
  md += ` <meta charset="UTF-8">\n <meta name="viewport" content="width=device-width, initial-scale=1.0">\n`;
139
139
  md += ` <title>App Name</title>\n`;
140
- md += ` <link href="https://cdn.jsdelivr.net/npm/daisyui@5" rel="stylesheet" />\n`;
141
- md += ` <script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"><` + `/script>\n`;
140
+ md += ` <link href="/lib/daisyui@5.css" rel="stylesheet" />\n`;
141
+ md += ` <link href="/lib/aimeat-daisyui-bridge.css" rel="stylesheet" />\n`;
142
+ md += ` <script src="/lib/tailwindcss@4.js"><` + `/script>\n`;
142
143
  md += `</head>\n<body class="bg-base-100 min-h-screen flex flex-col">\n`;
143
144
  md += ` <nav class="navbar bg-base-200 shadow-sm px-4">\n`;
144
145
  md += ` <div class="flex-1"><span class="text-lg font-bold">App Name</span></div>\n`;
@@ -37,7 +37,7 @@ import { h } from 'preact';
37
37
  import { useState, useEffect } from 'preact/hooks';
38
38
  import htm from 'htm';
39
39
  const html = htm.bind(h);
40
- import { t } from '/js/i18n.js';
40
+ import { t, getLocale } from '/js/i18n.js';
41
41
  import { escHtml } from '/js/utils.js';
42
42
  import { openAppSandboxed } from '/js/app-sandbox.js';
43
43
  import NodeTotals from './landing-node-totals.js';
@@ -90,6 +90,8 @@ function Gallery() {
90
90
  const [apps, setApps] = useState([]);
91
91
  const [q, setQ] = useState('');
92
92
  useEffect(() => {
93
+ // Public proof wall: the default listing already excludes parked + operator-hidden
94
+ // apps (no manage flag), so the wall never surfaces moderated/hidden apps.
93
95
  fetch('/v1/apps?sort=popular&limit=60').then(r => r.json())
94
96
  .then(j => setApps(j?.data?.apps || []))
95
97
  .catch(() => { /* empty state renders */ });
@@ -168,9 +170,13 @@ hosting is the only subscription.`;
168
170
 
169
171
  // Mirrors buildPromptFromBuilder() in app-catalog.html for the "new app / no description" case,
170
172
  // with the current node URL injected. If no idea is given the prompt explicitly tells the AI to ask.
171
- function buildLandingAppPrompt(nodeUrl) {
173
+ function buildLandingAppPrompt(nodeUrl, templateContent) {
172
174
  const base = (nodeUrl || '').replace(/\/+$/, '') || window.location.origin;
175
+ const LANGS = { en: 'English', fi: 'Finnish (Suomi)' };
176
+ const langName = LANGS[getLocale()] || 'English';
173
177
  let p = '';
178
+ // Converse + build the UI in the visitor's site language (instructions stay English).
179
+ p += 'Language: talk to me and write ALL user-facing text (UI labels, buttons, messages) in ' + langName + '. These build instructions are in English, but converse with me and build the app interface in ' + langName + '.\n\n';
174
180
  p += 'Help me build a single-file HTML app that runs on AIMEAT.\n';
175
181
  p += 'My initial idea: (not given yet — ask me what to build)\n\n';
176
182
  p += '## Step 1 — Interview me first\n';
@@ -203,13 +209,22 @@ function buildLandingAppPrompt(nodeUrl) {
203
209
  p += '- aimeat-header.js — drop-in canonical site header (nav + theme)\n';
204
210
  p += '- aimeat-tunnel.js — personal-node tunnel client (advanced)\n\n';
205
211
  p += '### Auth Pattern\n';
212
+ p += 'Handle BOTH login paths: a fresh sign-in click (the onLogin callback) AND a page that loads already signed in (restore the session yourself). `onLogin` fires ONLY on a fresh sign-in — it does NOT fire on reload when a session already exists, so a page that relies on onLogin alone shows nothing to an already-logged-in returning user.\n';
206
213
  p += '```html\n';
207
214
  p += '<script src="' + base + '/v1/libs/aimeat-auth.js"></' + 'script>\n';
208
215
  p += '<script>\n';
216
+ p += 'function showApp(session) { /* session.owner, session.jwt, session.fetch() */ }\n';
217
+ p += 'function hideApp() { /* hide content, show a "Sign in" message */ }\n';
218
+ p += '\n';
219
+ p += '// Path 1 — fresh sign-in / sign-out via the login button:\n';
209
220
  p += 'AIMEAT.auth.mountLoginButton("#login", {\n';
210
- p += ' onLogin: function(session) { /* session.owner, session.jwt, session.fetch() */ },\n';
211
- p += ' onLogout: function() { /* hide content */ }\n';
221
+ p += ' onLogin: showApp, // fires ONLY on a fresh sign-in click, NOT on reload\n';
222
+ p += ' onLogout: hideApp\n';
212
223
  p += '});\n';
224
+ p += '\n';
225
+ p += '// Path 2 — already signed in when the page loads. Restore the stored session\n';
226
+ p += '// explicitly; login() returns the session (or null if not signed in).\n';
227
+ p += 'AIMEAT.auth.login().then(function (session) { if (session) showApp(session); });\n';
213
228
  p += '</' + 'script>\n';
214
229
  p += '```\n\n';
215
230
  p += '### Data Storage\n';
@@ -266,13 +281,40 @@ function buildLandingAppPrompt(nodeUrl) {
266
281
  p += '- Load only the libraries you actually use; load aimeat-auth before libs that need a session\n';
267
282
  p += '- Gate AI features on AIMEAT.ai.isAvailable() and handle the logged-out / no-key case\n';
268
283
  p += '- Theme with CSS variables and support both light and dark\n';
269
- p += '- Include error handling and loading states for API calls\n';
284
+ p += '- Include error handling and loading states for API calls\n\n';
285
+ p += '## When the app is ready — tell me how to publish it\n';
286
+ p += 'After you hand me the finished single HTML file, END your reply by telling me (in my language) to do exactly this:\n';
287
+ p += '1. Open ' + base + '/app-catalog.html\n';
288
+ p += '2. Click "+ Add" → open the "Paste" tab → paste the HTML (or drop it as a file). The app name + description fill in automatically.\n';
289
+ p += '3. Click Publish.\n';
290
+ p += 'I will be asked to sign in first — it is fast: one click with Google, or a quick email + password, and a brand-new account is created right there in seconds.\n';
291
+ p += 'What I get: once published, the app is LIVE on my own AIMEAT node and PUBLIC — anyone can find it in the community catalogue and use it, and I get a link to share. From my catalogue I can launch it, publish updates (older versions are always kept), park it (hide it), or delete it. It keeps working with my AIMEAT login, saved data, files, AI and realtime features.\n';
292
+ if (templateContent) {
293
+ p += '\n## Starting template (copy from this)\nUse this skeleton as your base — keep its boot, login pill, and self-hosted theme wiring; fill the {{...}} slots; build your views inside <main>. Return the COMPLETE single HTML file based on it.\n```html\n' + templateContent + '\n```\n';
294
+ }
270
295
  return p;
271
296
  }
272
297
 
273
298
  function BuildAppPrompt() {
274
299
  const [copied, setCopied] = useState(false);
275
- const prompt = buildLandingAppPrompt(window.location.origin);
300
+ const [templates, setTemplates] = useState([]);
301
+ const [tplId, setTplId] = useState('');
302
+ const [tplContent, setTplContent] = useState('');
303
+ useEffect(() => {
304
+ // Starting points only: full use-case scaffolds first, then blank app-shells (not components).
305
+ fetch('/v1/app-templates?lang=' + encodeURIComponent(getLocale())).then(r => r.json()).then(d => {
306
+ const list = ((d.data && d.data.templates) || []).filter(t => t.kind !== 'component');
307
+ list.sort((a, b) => (a.kind === 'use-case' ? 0 : 1) - (b.kind === 'use-case' ? 0 : 1));
308
+ setTemplates(list);
309
+ }).catch(() => {});
310
+ }, []);
311
+ const onPick = async (e) => {
312
+ const id = e.target.value; setTplId(id);
313
+ if (!id) { setTplContent(''); return; }
314
+ try { const d = await (await fetch('/v1/app-templates/' + encodeURIComponent(id))).json(); setTplContent((d.data && d.data.template && d.data.template.content) || ''); }
315
+ catch { setTplContent(''); }
316
+ };
317
+ const prompt = buildLandingAppPrompt(window.location.origin, tplContent);
276
318
  const copy = async () => {
277
319
  try {
278
320
  await navigator.clipboard.writeText(prompt);
@@ -284,6 +326,7 @@ function BuildAppPrompt() {
284
326
  <section class="ld-askai">
285
327
  <h2 class="ld-askai-title">${tr('landing.buildTitle', 'Build your app in 10 minutes — copy this prompt')}</h2>
286
328
  <p class="ld-askai-sub">${tr('landing.buildSub', 'Paste into Claude, ChatGPT or any AI. It asks about your idea, builds the app and publishes it to your node. Share the link when done.')}</p>
329
+ ${templates.length ? html`<div class="ld-askai-tpl mb-half">${'✨'} ${tr('landing.startTemplate', 'Start from a template')}: <select class="input-field" onChange=${onPick} value=${tplId}><option value="">${tr('landing.fromScratch', '(none — build from scratch)')}</option>${templates.map(t => html`<option value=${t.id}>${t.kind === 'use-case' ? '★ ' : ''}${t.title}</option>`)}</select></div>` : ''}
287
330
  <div class="ld-askai-box">
288
331
  <pre class="ld-askai-prompt">${prompt}</pre>
289
332
  <button class="btn-primary ld-askai-copy" onClick=${copy}>${copied ? tr('landing.buildCopied', 'Copied ✓') : tr('landing.buildCopy', 'Copy prompt')}</button>
@@ -429,6 +472,7 @@ function BuildHero() {
429
472
  <button class="btn-primary" type="button" onClick=${copy}>${copied ? tr('landing.buildHeroCopied', 'Copied ✓ — paste into your AI') : tr('landing.buildHeroCopy', 'Copy the build prompt →')}</button>
430
473
  <a class="btn-outline" href="https://github.com/miikkij/aimeat-protocol/releases/latest" target="_blank" rel="noopener">${tr('landing.heroGetOwn', 'Get your own →')}</a>
431
474
  </div>
475
+ ${copied ? html`<p class="ld-hero2-after">${tr('landing.buildHeroAfter', 'Paste it into your AI and answer its questions. When your app is ready,')} <a href="/app-catalog.html">${tr('landing.openAppsToPublish', 'open your apps to add & publish it →')}</a> ${tr('landing.buildHeroAfter2', '(signing in takes seconds — Google or email).')}</p>` : ''}
432
476
  </section>
433
477
  `;
434
478
  }
@@ -402,6 +402,10 @@ function renderPlatformBadge(onboarding) {
402
402
  const READINESS_RANKS = { none: 0, basic: 1, standard: 2, advanced: 3, full: 4 };
403
403
 
404
404
  function renderReadinessBadge(state, onboarding) {
405
+ if (state === 'system') {
406
+ // Internal (auto-provisioned) agent — no device-auth onboarding / readiness.
407
+ return html`<span class="pf-agd-badge pf-agd-badge--readiness-none">${t('profile.agents.detail.state.internal')}</span>`;
408
+ }
405
409
  if (state === 'new') {
406
410
  return html`<span class="pf-agd-badge pf-agd-badge--readiness-none">--</span>`;
407
411
  }
@@ -454,6 +458,9 @@ function renderCollapsedStats(state, agent, onboarding) {
454
458
 
455
459
  function renderZone2(state, agent, onboarding, setActiveTab, showToast) {
456
460
  switch (state) {
461
+ case 'system':
462
+ // Internal agents (Secretary / company Secretary / specialists) skip the Hello Integration banner.
463
+ return null;
457
464
  case 'new':
458
465
  return html`
459
466
  <div class="pf-agd-zone2 pf-agd-zone2--new">