aimeat 1.27.0 → 1.28.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 (421) hide show
  1. package/dist/.env.example +2 -0
  2. package/dist/locales/en.json +538 -297
  3. package/dist/locales/fi.json +500 -259
  4. package/dist/public/components/NotificationBell.js +2 -4
  5. package/dist/public/css/views/agents-detail.css +11 -0
  6. package/dist/public/css/views/app-grant.css +35 -3
  7. package/dist/public/css/views/inbox.css +78 -0
  8. package/dist/public/css/views/landing.css +8 -0
  9. package/dist/public/css/views/living.css +187 -0
  10. package/dist/public/css/views/notebook.css +89 -0
  11. package/dist/public/css/views/profile.css +78 -85
  12. package/dist/public/js/app-sandbox.js +18 -59
  13. package/dist/public/js/presence-store.js +7 -1
  14. package/dist/public/js/services/agents.js +10 -3
  15. package/dist/public/js/services/generator-prompts-base.js +40 -3
  16. package/dist/public/js/services/living.js +506 -0
  17. package/dist/public/js/services/memory.js +23 -3
  18. package/dist/public/js/services/nodes.js +1 -1
  19. package/dist/public/js/services/notebook-plan.js +211 -0
  20. package/dist/public/js/services/notebook.js +97 -0
  21. package/dist/public/js/services/organisms.js +41 -2
  22. package/dist/public/js/services/tracked-responses.js +103 -0
  23. package/dist/public/js/utils.js +15 -0
  24. package/dist/public/lib/live-updates.js +231 -94
  25. package/dist/public/spa.html +8 -1
  26. package/dist/public/types/aimeat-globals.d.ts +4 -0
  27. package/dist/public/views/admin/agent-integration-tab.js +2 -5
  28. package/dist/public/views/admin/agent-tasks-tab.js +2 -5
  29. package/dist/public/views/admin/cortex-tab.js +2 -5
  30. package/dist/public/views/admin/federation-tab.js +3 -10
  31. package/dist/public/views/admin/memory-tab.js +2 -5
  32. package/dist/public/views/admin/messages-tab.js +2 -5
  33. package/dist/public/views/admin/packages-tab.js +2 -5
  34. package/dist/public/views/admin/sharing-groups-tab.js +2 -5
  35. package/dist/public/views/app-grant.js +126 -23
  36. package/dist/public/views/landing-node-totals.js +71 -0
  37. package/dist/public/views/landing.js +6 -4
  38. package/dist/public/views/profile/agents/agent-card.js +8 -5
  39. package/dist/public/views/profile/agents/tab-activity.js +2 -3
  40. package/dist/public/views/profile/agents/tab-agent-config.js +2 -3
  41. package/dist/public/views/profile/agents/tab-data-access.js +2 -3
  42. package/dist/public/views/profile/agents/tab-integration.js +2 -3
  43. package/dist/public/views/profile/agents/tab-messages.js +2 -6
  44. package/dist/public/views/profile/agents/tab-quality.js +2 -5
  45. package/dist/public/views/profile/agents/tab-schedules.js +2 -4
  46. package/dist/public/views/profile/agents-activity-subtab.js +2 -5
  47. package/dist/public/views/profile/agents-capabilities-subtab.js +2 -2
  48. package/dist/public/views/profile/agents-messages-subtab.js +2 -5
  49. package/dist/public/views/profile/agents-services-subtab.js +2 -3
  50. package/dist/public/views/profile/agents-tab.js +70 -90
  51. package/dist/public/views/profile/agents-tasks-subtab.js +3 -8
  52. package/dist/public/views/profile/apps-tab.js +17 -0
  53. package/dist/public/views/profile/boards-tab.js +2 -5
  54. package/dist/public/views/profile/chat-sessions-tab.js +2 -5
  55. package/dist/public/views/profile/ecosystem-tab.js +7 -12
  56. package/dist/public/views/profile/extensions-tab.js +2 -5
  57. package/dist/public/views/profile/federation-tab.js +2 -5
  58. package/dist/public/views/profile/inbox-tab.js +280 -14
  59. package/dist/public/views/profile/knowledge-tab.js +2 -5
  60. package/dist/public/views/profile/landing-page.js +260 -184
  61. package/dist/public/views/profile/living-tab.js +480 -0
  62. package/dist/public/views/profile/memory-tab.js +2 -5
  63. package/dist/public/views/profile/notebook-card.js +515 -0
  64. package/dist/public/views/profile/notebook-helpers.js +48 -0
  65. package/dist/public/views/profile/notebook-tab.js +40 -260
  66. package/dist/public/views/profile/organisms/activity-panel.js +3 -2
  67. package/dist/public/views/profile/organisms/home.js +52 -3
  68. package/dist/public/views/profile/organisms/members.js +2 -5
  69. package/dist/public/views/profile/organisms/mindmap.js +194 -0
  70. package/dist/public/views/profile/organisms/panels.js +3 -10
  71. package/dist/public/views/profile/organisms/participants-panel.js +3 -2
  72. package/dist/public/views/profile/organisms/readme-panel.js +97 -0
  73. package/dist/public/views/profile/organisms/sources-panel.js +2 -5
  74. package/dist/public/views/profile/organisms/timeline-panel.js +104 -0
  75. package/dist/public/views/profile/organisms/workspace-comments.js +2 -5
  76. package/dist/public/views/profile/organisms/workspace-list.js +8 -8
  77. package/dist/public/views/profile/organisms/workspace.js +41 -6
  78. package/dist/public/views/profile/organisms-tab.js +3 -6
  79. package/dist/public/views/profile/packages-tab.js +2 -5
  80. package/dist/public/views/profile/scheduler-tab.js +2 -4
  81. package/dist/public/views/profile/track-response-modal.js +211 -0
  82. package/dist/public/views/profile/workflows-tab.js +4 -13
  83. package/dist/public/views/profile.js +10 -9
  84. package/dist/scripts/consent-audit-prune.d.ts +21 -0
  85. package/dist/scripts/consent-audit-prune.d.ts.map +1 -0
  86. package/dist/scripts/consent-audit-prune.js +198 -0
  87. package/dist/scripts/consent-audit-prune.js.map +1 -0
  88. package/dist/scripts/reassign-apps.d.ts +2 -0
  89. package/dist/scripts/reassign-apps.d.ts.map +1 -0
  90. package/dist/scripts/reassign-apps.js +99 -0
  91. package/dist/scripts/reassign-apps.js.map +1 -0
  92. package/dist/scripts/telemetry-prune.d.ts +20 -0
  93. package/dist/scripts/telemetry-prune.d.ts.map +1 -0
  94. package/dist/scripts/telemetry-prune.js +195 -0
  95. package/dist/scripts/telemetry-prune.js.map +1 -0
  96. package/dist/src/auth/jwt.d.ts +1 -0
  97. package/dist/src/auth/jwt.d.ts.map +1 -1
  98. package/dist/src/auth/jwt.js +13 -0
  99. package/dist/src/auth/jwt.js.map +1 -1
  100. package/dist/src/cli/connect/mcp/local-server.d.ts.map +1 -1
  101. package/dist/src/cli/connect/mcp/local-server.js +109 -0
  102. package/dist/src/cli/connect/mcp/local-server.js.map +1 -1
  103. package/dist/src/cli/connect/tool-call.d.ts.map +1 -1
  104. package/dist/src/cli/connect/tool-call.js +9 -0
  105. package/dist/src/cli/connect/tool-call.js.map +1 -1
  106. package/dist/src/cli/connect/tunnel-client.d.ts +16 -0
  107. package/dist/src/cli/connect/tunnel-client.d.ts.map +1 -1
  108. package/dist/src/cli/connect/tunnel-client.js +42 -0
  109. package/dist/src/cli/connect/tunnel-client.js.map +1 -1
  110. package/dist/src/config.d.ts +7 -0
  111. package/dist/src/config.d.ts.map +1 -1
  112. package/dist/src/config.js +4 -0
  113. package/dist/src/config.js.map +1 -1
  114. package/dist/src/generated/api-types.d.ts +1449 -128
  115. package/dist/src/generated/api-types.d.ts.map +1 -1
  116. package/dist/src/generated/prisma-postgres/edge.js +17 -3
  117. package/dist/src/generated/prisma-postgres/index-browser.js +14 -0
  118. package/dist/src/generated/prisma-postgres/index.d.ts +1580 -161
  119. package/dist/src/generated/prisma-postgres/index.js +17 -3
  120. package/dist/src/generated/prisma-postgres/package.json +1 -1
  121. package/dist/src/generated/prisma-postgres/schema.prisma +18 -0
  122. package/dist/src/generated/prisma-postgres/wasm.js +17 -3
  123. package/dist/src/index.js +4 -0
  124. package/dist/src/index.js.map +1 -1
  125. package/dist/src/mcp/agent-telemetry.d.ts +2 -0
  126. package/dist/src/mcp/agent-telemetry.d.ts.map +1 -1
  127. package/dist/src/mcp/agent-telemetry.js +8 -3
  128. package/dist/src/mcp/agent-telemetry.js.map +1 -1
  129. package/dist/src/mcp/annotations.d.ts.map +1 -1
  130. package/dist/src/mcp/annotations.js +1 -0
  131. package/dist/src/mcp/annotations.js.map +1 -1
  132. package/dist/src/mcp/apps.d.ts.map +1 -1
  133. package/dist/src/mcp/apps.js +14 -1
  134. package/dist/src/mcp/apps.js.map +1 -1
  135. package/dist/src/mcp/catalog/definitions.d.ts.map +1 -1
  136. package/dist/src/mcp/catalog/definitions.js +15 -0
  137. package/dist/src/mcp/catalog/definitions.js.map +1 -1
  138. package/dist/src/mcp/organisms.d.ts +2 -0
  139. package/dist/src/mcp/organisms.d.ts.map +1 -1
  140. package/dist/src/mcp/organisms.js +43 -0
  141. package/dist/src/mcp/organisms.js.map +1 -1
  142. package/dist/src/mcp/workspaces.d.ts.map +1 -1
  143. package/dist/src/mcp/workspaces.js +8 -1
  144. package/dist/src/mcp/workspaces.js.map +1 -1
  145. package/dist/src/routes/agent-messages.js +2 -2
  146. package/dist/src/routes/agent-messages.js.map +1 -1
  147. package/dist/src/routes/agent-tasks.js +14 -14
  148. package/dist/src/routes/agent-tasks.js.map +1 -1
  149. package/dist/src/routes/agent-telemetry.d.ts +3 -0
  150. package/dist/src/routes/agent-telemetry.d.ts.map +1 -1
  151. package/dist/src/routes/agent-telemetry.js +11 -6
  152. package/dist/src/routes/agent-telemetry.js.map +1 -1
  153. package/dist/src/routes/agents.d.ts.map +1 -1
  154. package/dist/src/routes/agents.js +41 -3
  155. package/dist/src/routes/agents.js.map +1 -1
  156. package/dist/src/routes/app-grants.d.ts +3 -0
  157. package/dist/src/routes/app-grants.d.ts.map +1 -1
  158. package/dist/src/routes/app-grants.js +120 -7
  159. package/dist/src/routes/app-grants.js.map +1 -1
  160. package/dist/src/routes/apps.d.ts +9 -0
  161. package/dist/src/routes/apps.d.ts.map +1 -1
  162. package/dist/src/routes/apps.js +110 -16
  163. package/dist/src/routes/apps.js.map +1 -1
  164. package/dist/src/routes/boards.d.ts.map +1 -1
  165. package/dist/src/routes/boards.js +4 -2
  166. package/dist/src/routes/boards.js.map +1 -1
  167. package/dist/src/routes/consent.d.ts.map +1 -1
  168. package/dist/src/routes/consent.js +14 -1
  169. package/dist/src/routes/consent.js.map +1 -1
  170. package/dist/src/routes/ghii.d.ts.map +1 -1
  171. package/dist/src/routes/ghii.js +20 -10
  172. package/dist/src/routes/ghii.js.map +1 -1
  173. package/dist/src/routes/librarian.d.ts.map +1 -1
  174. package/dist/src/routes/librarian.js +64 -2
  175. package/dist/src/routes/librarian.js.map +1 -1
  176. package/dist/src/routes/libs.d.ts +9 -0
  177. package/dist/src/routes/libs.d.ts.map +1 -1
  178. package/dist/src/routes/libs.js +261 -2
  179. package/dist/src/routes/libs.js.map +1 -1
  180. package/dist/src/routes/living.d.ts +18 -0
  181. package/dist/src/routes/living.d.ts.map +1 -0
  182. package/dist/src/routes/living.js +63 -0
  183. package/dist/src/routes/living.js.map +1 -0
  184. package/dist/src/routes/matches.d.ts.map +1 -1
  185. package/dist/src/routes/matches.js +1 -3
  186. package/dist/src/routes/matches.js.map +1 -1
  187. package/dist/src/routes/memory.d.ts.map +1 -1
  188. package/dist/src/routes/memory.js +40 -1
  189. package/dist/src/routes/memory.js.map +1 -1
  190. package/dist/src/routes/messages.d.ts +2 -0
  191. package/dist/src/routes/messages.d.ts.map +1 -1
  192. package/dist/src/routes/messages.js +27 -96
  193. package/dist/src/routes/messages.js.map +1 -1
  194. package/dist/src/routes/organisms.d.ts +8 -0
  195. package/dist/src/routes/organisms.d.ts.map +1 -1
  196. package/dist/src/routes/organisms.js +124 -3
  197. package/dist/src/routes/organisms.js.map +1 -1
  198. package/dist/src/routes/owners.d.ts.map +1 -1
  199. package/dist/src/routes/owners.js +2 -0
  200. package/dist/src/routes/owners.js.map +1 -1
  201. package/dist/src/routes/personal.d.ts.map +1 -1
  202. package/dist/src/routes/personal.js +7 -0
  203. package/dist/src/routes/personal.js.map +1 -1
  204. package/dist/src/routes/portal.d.ts +3 -0
  205. package/dist/src/routes/portal.d.ts.map +1 -1
  206. package/dist/src/routes/portal.js +19 -12
  207. package/dist/src/routes/portal.js.map +1 -1
  208. package/dist/src/routes/public-stats.d.ts +3 -0
  209. package/dist/src/routes/public-stats.d.ts.map +1 -1
  210. package/dist/src/routes/public-stats.js +48 -0
  211. package/dist/src/routes/public-stats.js.map +1 -1
  212. package/dist/src/routes/sse.d.ts +3 -0
  213. package/dist/src/routes/sse.d.ts.map +1 -1
  214. package/dist/src/routes/sse.js +27 -15
  215. package/dist/src/routes/sse.js.map +1 -1
  216. package/dist/src/routes/storage-files.d.ts +2 -0
  217. package/dist/src/routes/storage-files.d.ts.map +1 -1
  218. package/dist/src/routes/storage-files.js +14 -17
  219. package/dist/src/routes/storage-files.js.map +1 -1
  220. package/dist/src/routes/subdomains.d.ts +28 -0
  221. package/dist/src/routes/subdomains.d.ts.map +1 -1
  222. package/dist/src/routes/subdomains.js +138 -11
  223. package/dist/src/routes/subdomains.js.map +1 -1
  224. package/dist/src/routes/tracked-responses.d.ts +27 -0
  225. package/dist/src/routes/tracked-responses.d.ts.map +1 -0
  226. package/dist/src/routes/tracked-responses.js +212 -0
  227. package/dist/src/routes/tracked-responses.js.map +1 -0
  228. package/dist/src/routes/upload.js +8 -0
  229. package/dist/src/routes/upload.js.map +1 -1
  230. package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
  231. package/dist/src/server-bootstrap/routes-loader.js +24 -0
  232. package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
  233. package/dist/src/server-bootstrap/service-init.d.ts.map +1 -1
  234. package/dist/src/server-bootstrap/service-init.js +4 -0
  235. package/dist/src/server-bootstrap/service-init.js.map +1 -1
  236. package/dist/src/server-bootstrap/static-files.d.ts +5 -0
  237. package/dist/src/server-bootstrap/static-files.d.ts.map +1 -1
  238. package/dist/src/server-bootstrap/static-files.js +33 -1
  239. package/dist/src/server-bootstrap/static-files.js.map +1 -1
  240. package/dist/src/services/access-guard.d.ts +4 -4
  241. package/dist/src/services/access-guard.d.ts.map +1 -1
  242. package/dist/src/services/access-guard.js +7 -8
  243. package/dist/src/services/access-guard.js.map +1 -1
  244. package/dist/src/services/activity-recorder.d.ts +2 -13
  245. package/dist/src/services/activity-recorder.d.ts.map +1 -1
  246. package/dist/src/services/activity-recorder.js +0 -42
  247. package/dist/src/services/activity-recorder.js.map +1 -1
  248. package/dist/src/services/connect-tunnel.d.ts +56 -3
  249. package/dist/src/services/connect-tunnel.d.ts.map +1 -1
  250. package/dist/src/services/connect-tunnel.js +216 -1
  251. package/dist/src/services/connect-tunnel.js.map +1 -1
  252. package/dist/src/services/consent-audit-buffer.d.ts +45 -0
  253. package/dist/src/services/consent-audit-buffer.d.ts.map +1 -0
  254. package/dist/src/services/consent-audit-buffer.js +85 -0
  255. package/dist/src/services/consent-audit-buffer.js.map +1 -0
  256. package/dist/src/services/consent.d.ts +9 -3
  257. package/dist/src/services/consent.d.ts.map +1 -1
  258. package/dist/src/services/consent.js +13 -5
  259. package/dist/src/services/consent.js.map +1 -1
  260. package/dist/src/services/core-jobs.d.ts.map +1 -1
  261. package/dist/src/services/core-jobs.js +20 -4
  262. package/dist/src/services/core-jobs.js.map +1 -1
  263. package/dist/src/services/event-bus.d.ts +24 -1
  264. package/dist/src/services/event-bus.d.ts.map +1 -1
  265. package/dist/src/services/event-bus.js +17 -2
  266. package/dist/src/services/event-bus.js.map +1 -1
  267. package/dist/src/services/generator-prompts/resolvers.d.ts +2 -0
  268. package/dist/src/services/generator-prompts/resolvers.d.ts.map +1 -1
  269. package/dist/src/services/generator-prompts/resolvers.js +22 -3
  270. package/dist/src/services/generator-prompts/resolvers.js.map +1 -1
  271. package/dist/src/services/job-seeding.d.ts.map +1 -1
  272. package/dist/src/services/job-seeding.js +4 -0
  273. package/dist/src/services/job-seeding.js.map +1 -1
  274. package/dist/src/services/living-author-prompt.d.ts +14 -0
  275. package/dist/src/services/living-author-prompt.d.ts.map +1 -0
  276. package/dist/src/services/living-author-prompt.js +47 -0
  277. package/dist/src/services/living-author-prompt.js.map +1 -0
  278. package/dist/src/services/living-author.d.ts +55 -0
  279. package/dist/src/services/living-author.d.ts.map +1 -0
  280. package/dist/src/services/living-author.js +91 -0
  281. package/dist/src/services/living-author.js.map +1 -0
  282. package/dist/src/services/living-pulse.d.ts +29 -0
  283. package/dist/src/services/living-pulse.d.ts.map +1 -0
  284. package/dist/src/services/living-pulse.js +363 -0
  285. package/dist/src/services/living-pulse.js.map +1 -0
  286. package/dist/src/services/message-delivery.d.ts +1 -1
  287. package/dist/src/services/message-delivery.d.ts.map +1 -1
  288. package/dist/src/services/message-delivery.js +10 -7
  289. package/dist/src/services/message-delivery.js.map +1 -1
  290. package/dist/src/services/message-send.d.ts +24 -0
  291. package/dist/src/services/message-send.d.ts.map +1 -0
  292. package/dist/src/services/message-send.js +122 -0
  293. package/dist/src/services/message-send.js.map +1 -0
  294. package/dist/src/services/notebook-ai.d.ts +36 -0
  295. package/dist/src/services/notebook-ai.d.ts.map +1 -0
  296. package/dist/src/services/notebook-ai.js +51 -0
  297. package/dist/src/services/notebook-ai.js.map +1 -0
  298. package/dist/src/services/notebook-classify.d.ts +32 -5
  299. package/dist/src/services/notebook-classify.d.ts.map +1 -1
  300. package/dist/src/services/notebook-classify.js +59 -43
  301. package/dist/src/services/notebook-classify.js.map +1 -1
  302. package/dist/src/services/notebook-distribute-prompt.d.ts +16 -0
  303. package/dist/src/services/notebook-distribute-prompt.d.ts.map +1 -0
  304. package/dist/src/services/notebook-distribute-prompt.js +40 -0
  305. package/dist/src/services/notebook-distribute-prompt.js.map +1 -0
  306. package/dist/src/services/notebook-plan-prompt.d.ts +19 -0
  307. package/dist/src/services/notebook-plan-prompt.d.ts.map +1 -0
  308. package/dist/src/services/notebook-plan-prompt.js +54 -0
  309. package/dist/src/services/notebook-plan-prompt.js.map +1 -0
  310. package/dist/src/services/notebook-plan.d.ts +70 -0
  311. package/dist/src/services/notebook-plan.d.ts.map +1 -0
  312. package/dist/src/services/notebook-plan.js +118 -0
  313. package/dist/src/services/notebook-plan.js.map +1 -0
  314. package/dist/src/services/onboarding-validator.d.ts.map +1 -1
  315. package/dist/src/services/onboarding-validator.js +13 -3
  316. package/dist/src/services/onboarding-validator.js.map +1 -1
  317. package/dist/src/services/organism-comments.d.ts +5 -1
  318. package/dist/src/services/organism-comments.d.ts.map +1 -1
  319. package/dist/src/services/organism-comments.js +7 -22
  320. package/dist/src/services/organism-comments.js.map +1 -1
  321. package/dist/src/services/organism-readme.d.ts +24 -0
  322. package/dist/src/services/organism-readme.d.ts.map +1 -0
  323. package/dist/src/services/organism-readme.js +37 -0
  324. package/dist/src/services/organism-readme.js.map +1 -0
  325. package/dist/src/services/prompt-defaults.d.ts.map +1 -1
  326. package/dist/src/services/prompt-defaults.js +30 -0
  327. package/dist/src/services/prompt-defaults.js.map +1 -1
  328. package/dist/src/services/readiness-scorer.d.ts.map +1 -1
  329. package/dist/src/services/readiness-scorer.js +11 -6
  330. package/dist/src/services/readiness-scorer.js.map +1 -1
  331. package/dist/src/services/scheduler.d.ts +5 -0
  332. package/dist/src/services/scheduler.d.ts.map +1 -1
  333. package/dist/src/services/scheduler.js +13 -3
  334. package/dist/src/services/scheduler.js.map +1 -1
  335. package/dist/src/services/screenshot-capture.d.ts +28 -0
  336. package/dist/src/services/screenshot-capture.d.ts.map +1 -0
  337. package/dist/src/services/screenshot-capture.js +154 -0
  338. package/dist/src/services/screenshot-capture.js.map +1 -0
  339. package/dist/src/services/structure-graph.d.ts +65 -0
  340. package/dist/src/services/structure-graph.d.ts.map +1 -0
  341. package/dist/src/services/structure-graph.js +53 -0
  342. package/dist/src/services/structure-graph.js.map +1 -0
  343. package/dist/src/services/structure-overview.d.ts +6 -0
  344. package/dist/src/services/structure-overview.d.ts.map +1 -1
  345. package/dist/src/services/structure-overview.js +1 -1
  346. package/dist/src/services/structure-overview.js.map +1 -1
  347. package/dist/src/services/structure-snapshot.d.ts +47 -0
  348. package/dist/src/services/structure-snapshot.d.ts.map +1 -0
  349. package/dist/src/services/structure-snapshot.js +101 -0
  350. package/dist/src/services/structure-snapshot.js.map +1 -0
  351. package/dist/src/services/telemetry-buffer.d.ts +73 -0
  352. package/dist/src/services/telemetry-buffer.d.ts.map +1 -0
  353. package/dist/src/services/telemetry-buffer.js +185 -0
  354. package/dist/src/services/telemetry-buffer.js.map +1 -0
  355. package/dist/src/services/track-registry.d.ts +29 -0
  356. package/dist/src/services/track-registry.d.ts.map +1 -0
  357. package/dist/src/services/track-registry.js +61 -0
  358. package/dist/src/services/track-registry.js.map +1 -0
  359. package/dist/src/services/tracked-classify.d.ts +98 -0
  360. package/dist/src/services/tracked-classify.d.ts.map +1 -0
  361. package/dist/src/services/tracked-classify.js +182 -0
  362. package/dist/src/services/tracked-classify.js.map +1 -0
  363. package/dist/src/services/tracked-response.d.ts +98 -0
  364. package/dist/src/services/tracked-response.d.ts.map +1 -0
  365. package/dist/src/services/tracked-response.js +304 -0
  366. package/dist/src/services/tracked-response.js.map +1 -0
  367. package/dist/src/services/workspace-access.d.ts +36 -0
  368. package/dist/src/services/workspace-access.d.ts.map +1 -0
  369. package/dist/src/services/workspace-access.js +38 -0
  370. package/dist/src/services/workspace-access.js.map +1 -0
  371. package/dist/src/storage/interface.d.ts +6 -1
  372. package/dist/src/storage/interface.d.ts.map +1 -1
  373. package/dist/src/storage/interface.js.map +1 -1
  374. package/dist/src/storage/providers/mongodb/index.d.ts +26 -1
  375. package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
  376. package/dist/src/storage/providers/mongodb/index.js +144 -1
  377. package/dist/src/storage/providers/mongodb/index.js.map +1 -1
  378. package/dist/src/storage/providers/sqlite/index.d.ts +26 -1
  379. package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
  380. package/dist/src/storage/providers/sqlite/index.js +73 -6
  381. package/dist/src/storage/providers/sqlite/index.js.map +1 -1
  382. package/dist/src/storage/providers/sqlite/repos/agent-message.d.ts +4 -0
  383. package/dist/src/storage/providers/sqlite/repos/agent-message.d.ts.map +1 -1
  384. package/dist/src/storage/providers/sqlite/repos/agent-message.js +14 -0
  385. package/dist/src/storage/providers/sqlite/repos/agent-message.js.map +1 -1
  386. package/dist/src/storage/providers/sqlite/repos/agent-task.d.ts +9 -0
  387. package/dist/src/storage/providers/sqlite/repos/agent-task.d.ts.map +1 -1
  388. package/dist/src/storage/providers/sqlite/repos/agent-task.js +25 -0
  389. package/dist/src/storage/providers/sqlite/repos/agent-task.js.map +1 -1
  390. package/dist/src/storage/providers/sqlite/repos/memory.d.ts +22 -1
  391. package/dist/src/storage/providers/sqlite/repos/memory.d.ts.map +1 -1
  392. package/dist/src/storage/providers/sqlite/repos/memory.js +61 -3
  393. package/dist/src/storage/providers/sqlite/repos/memory.js.map +1 -1
  394. package/dist/src/storage/providers/sqlite/schema.d.ts +16 -3
  395. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  396. package/dist/src/storage/providers/sqlite/schema.js +33 -6
  397. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  398. package/dist/src/storage/repositories/agent-message.repository.d.ts +10 -0
  399. package/dist/src/storage/repositories/agent-message.repository.d.ts.map +1 -1
  400. package/dist/src/storage/repositories/agent-task.repository.d.ts +15 -0
  401. package/dist/src/storage/repositories/agent-task.repository.d.ts.map +1 -1
  402. package/dist/src/storage/repositories/app.repository.d.ts +9 -0
  403. package/dist/src/storage/repositories/app.repository.d.ts.map +1 -1
  404. package/dist/src/storage/repositories/consent.repository.d.ts +2 -0
  405. package/dist/src/storage/repositories/consent.repository.d.ts.map +1 -1
  406. package/dist/src/storage/repositories/memory.repository.d.ts +31 -0
  407. package/dist/src/storage/repositories/memory.repository.d.ts.map +1 -1
  408. package/dist/src/utils/env-config.d.ts.map +1 -1
  409. package/dist/src/utils/env-config.js +18 -0
  410. package/dist/src/utils/env-config.js.map +1 -1
  411. package/dist/src/utils/messaging.d.ts +5 -0
  412. package/dist/src/utils/messaging.d.ts.map +1 -1
  413. package/dist/src/utils/messaging.js +0 -0
  414. package/dist/src/utils/messaging.js.map +1 -1
  415. package/dist/static/app-catalog.html +452 -34
  416. package/dist/static/app-login.js +67 -0
  417. package/dist/static/app-silent.html +14 -0
  418. package/dist/static/app-silent.js +32 -0
  419. package/package.json +5 -1
  420. package/prisma/schema.postgres.prisma +36 -18
  421. package/prisma/schema.prisma +20 -0
@@ -1591,83 +1591,45 @@
1591
1591
  }
1592
1592
  .pf .pf-fed-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--success, #22c55e); }
1593
1593
 
1594
- /* --- Hero Onboarding (new user) --- */
1595
- .pf .pf-hero-onboard {
1596
- background: var(--card, #fff); border-radius: 16px;
1597
- padding: 24px; box-shadow: 0 4px 12px rgba(0,0,0,.06);
1598
- }
1599
- .pf .pf-hero-ob-title { font-size: 1.2rem; font-weight: 700; margin-bottom: 4px; letter-spacing: -0.3px; }
1600
- .pf .pf-hero-ob-subtitle {
1601
- font-size: .85rem; color: var(--text-dim, #6B7280); margin-bottom: 20px;
1602
- max-width: 560px; line-height: 1.6;
1603
- }
1604
- .pf .pf-onboard-grid { display: grid; grid-template-columns: 1fr; gap: 12px; }
1605
- .pf .pf-onboard-card {
1606
- padding: 16px; border-radius: 12px; border: 1.5px solid var(--border, #e5e5e0);
1607
- cursor: pointer; transition: all .2s; position: relative;
1608
- }
1609
- .pf .pf-onboard-card:hover { border-color: var(--accent, #E8564A); box-shadow: 0 4px 12px rgba(0,0,0,.06); transform: translateY(-1px); }
1610
- .pf .pf-onboard-card.highlight { border-color: var(--accent, #E8564A); background: var(--accent-soft, #FFF0EE); }
1611
- .pf .pf-onboard-card.highlight:hover { background: var(--accent-subtle); }
1612
- .pf .pf-onboard-icon { font-size: 24px; margin-bottom: 8px; display: block; }
1613
- .pf .pf-onboard-title { font-size: .93rem; font-weight: 600; margin-bottom: 4px; }
1614
- .pf .pf-onboard-desc { font-size: .81rem; color: var(--text-dim, #6B7280); line-height: 1.5; }
1615
- .pf .pf-onboard-tag {
1616
- position: absolute; top: 10px; right: 10px; font-size: .6rem; font-weight: 700;
1617
- text-transform: uppercase; letter-spacing: .5px; padding: 2px 8px; border-radius: 4px;
1618
- background: var(--accent, #E8564A); color: #fff;
1619
- }
1620
- .pf .pf-onboard-tag.pf-tag-later { background: var(--border, #e5e5e0); color: var(--text-dim, #6B7280); }
1621
-
1622
- /* --- Knowledge Callout (new user, after hero) --- */
1623
- .pf .pf-knowledge-callout {
1624
- background: var(--pf-callout-gradient);
1625
- border-radius: 12px; padding: 16px 20px;
1626
- display: flex; align-items: flex-start; gap: 14px;
1627
- border: 1px solid rgba(99,102,241,.15); cursor: pointer;
1628
- transition: all .2s;
1629
- }
1630
- .pf .pf-knowledge-callout:hover { border-color: #6366F1; box-shadow: 0 4px 12px rgba(0,0,0,.06); }
1631
- .pf .pf-knowledge-callout-icon { font-size: 28px; flex-shrink: 0; margin-top: 2px; }
1632
- .pf .pf-knowledge-callout-body { flex: 1; min-width: 0; }
1633
- .pf .pf-knowledge-callout-title { font-size: .93rem; font-weight: 600; margin-bottom: 4px; }
1634
- .pf .pf-knowledge-callout-desc { font-size: .81rem; color: var(--text-dim, #6B7280); line-height: 1.55; }
1635
- .pf .pf-ai-pills { display: flex; gap: 6px; margin-top: 8px; flex-wrap: wrap; }
1636
- .pf .pf-ai-pill {
1637
- font-size: .68rem; font-weight: 500; padding: 2px 10px; border-radius: 20px;
1638
- background: var(--card, #fff); color: var(--text-dim, #6B7280);
1639
- border: 1px solid var(--border, #e5e5e0);
1640
- }
1641
-
1642
- /* --- Knowledge Button (active user) --- */
1643
- .pf .pf-knowledge-btn {
1644
- display: flex; align-items: center; gap: 12px;
1645
- background: var(--pf-callout-gradient);
1646
- border: 1px solid rgba(99,102,241,.15);
1647
- border-radius: 12px; padding: 14px 20px;
1648
- cursor: pointer; transition: all .2s;
1649
- color: var(--text, #1a1a1a);
1650
- }
1651
- .pf .pf-knowledge-btn:hover { border-color: #6366F1; box-shadow: 0 4px 12px rgba(0,0,0,.06); transform: translateY(-1px); }
1652
- .pf .pf-kb-icon { font-size: 22px; flex-shrink: 0; }
1653
- .pf .pf-kb-text { flex: 1; min-width: 0; }
1654
- .pf .pf-kb-title { font-size: .87rem; font-weight: 600; }
1655
- .pf .pf-kb-desc { font-size: .75rem; color: var(--text-dim, #6B7280); }
1656
- .pf .pf-kb-arrow { font-size: 1rem; color: #6366F1; }
1657
-
1658
- /* --- Ghost App Tiles (new user) --- */
1659
- .pf .pf-ghost-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; }
1660
- .pf .pf-ghost-tile {
1661
- aspect-ratio: 1; border-radius: 12px;
1662
- display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px;
1663
- cursor: pointer; transition: all .15s;
1664
- border: 1.5px dashed var(--border, #e5e5e0); background: var(--card, #FAFAF8);
1665
- padding: 8px; opacity: .55;
1666
- }
1667
- .pf .pf-ghost-tile:hover { opacity: .85; border-color: var(--accent, #E8564A); }
1668
- .pf .pf-ghost-icon { font-size: 26px; filter: grayscale(50%); }
1669
- .pf .pf-ghost-name { font-size: .68rem; font-weight: 500; text-align: center; color: var(--text-dim, #9CA3AF); line-height: 1.3; }
1670
- .pf .pf-ghost-cta { font-size: .56rem; font-weight: 600; color: var(--accent, #E8564A); text-transform: uppercase; letter-spacing: .3px; margin-top: 2px; }
1594
+ /* --- Header actions + presence pill (ProfileCard header) --- */
1595
+ .pf .pf-lp-actions {
1596
+ margin-left: auto; display: flex; align-items: center; gap: 10px;
1597
+ align-self: flex-start; flex-wrap: wrap;
1598
+ }
1599
+ .pf .pf-presence-pill-btn {
1600
+ display: inline-flex; align-items: center; gap: 4px;
1601
+ border: 1px solid var(--border, #e5e5e0); background: var(--bg-dim, #FAFAF8);
1602
+ color: var(--text, #1a1a1a); border-radius: 999px; padding: 4px 10px 4px 8px;
1603
+ cursor: pointer; font: inherit; font-size: .8rem;
1604
+ transition: border-color .15s, background .15s;
1605
+ }
1606
+ .pf .pf-presence-pill-btn:hover { border-color: var(--accent, #E8564A); background: var(--surface, var(--card)); }
1607
+ .pf .pf-presence-pill-caret { font-size: .7rem; color: var(--text-dim, #9CA3AF); margin-left: 2px; }
1608
+
1609
+ /* --- Suggested next steps (home dashboard) --- */
1610
+ .pf .pf-next {
1611
+ background: var(--card, #fff); border-radius: 16px; padding: 18px 20px;
1612
+ box-shadow: 0 1px 3px rgba(0,0,0,.04); border: 1px solid var(--border-soft, #f0f0ec);
1613
+ }
1614
+ .pf .pf-next-title {
1615
+ font-size: .72rem; font-weight: 700; text-transform: uppercase; letter-spacing: .5px;
1616
+ color: var(--text-dim, #9CA3AF); margin-bottom: 12px;
1617
+ }
1618
+ .pf .pf-next-grid { display: grid; grid-template-columns: 1fr; gap: 10px; }
1619
+ .pf .pf-next-card {
1620
+ display: flex; align-items: center; gap: 14px; width: 100%; text-align: left;
1621
+ padding: 14px 16px; border-radius: 12px; cursor: pointer; font: inherit;
1622
+ border: 1.5px solid var(--border, #e5e5e0); background: var(--card, #fff);
1623
+ color: var(--text, #1a1a1a); transition: all .18s;
1624
+ }
1625
+ .pf .pf-next-card:hover { border-color: var(--accent, #E8564A); box-shadow: 0 4px 12px rgba(0,0,0,.06); transform: translateY(-1px); }
1626
+ .pf .pf-next-card--primary { border-color: var(--accent, #E8564A); background: var(--accent-soft, #FFF0EE); }
1627
+ .pf .pf-next-card--primary:hover { background: var(--accent-subtle); }
1628
+ .pf .pf-next-ico { font-size: 22px; flex-shrink: 0; line-height: 1; }
1629
+ .pf .pf-next-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
1630
+ .pf .pf-next-card-title { font-size: .92rem; font-weight: 600; }
1631
+ .pf .pf-next-card-desc { font-size: .8rem; color: var(--text-dim, #6B7280); line-height: 1.45; }
1632
+ .pf .pf-next-arrow { font-size: 1.1rem; color: var(--accent, #E8564A); flex-shrink: 0; opacity: .7; }
1671
1633
 
1672
1634
  /* --- Cortex Extensions (new user) --- */
1673
1635
  .pf .pf-cortex-grid { display: grid; grid-template-columns: 1fr; gap: 10px; }
@@ -2035,11 +1997,7 @@
2035
1997
  }
2036
1998
 
2037
1999
  /* ─── Responsive: tablet ─── */
2038
- @media (min-width: 480px) {
2039
- .pf .pf-ghost-grid { grid-template-columns: repeat(4, 1fr); }
2040
- }
2041
2000
  @media (min-width: 640px) {
2042
- .pf .pf-onboard-grid { grid-template-columns: 1fr 1fr; }
2043
2001
  .pf .pf-cortex-grid { grid-template-columns: 1fr 1fr; }
2044
2002
  }
2045
2003
  @media (min-width: 900px) {
@@ -2585,6 +2543,42 @@
2585
2543
  .pj-struct-body .md-body strong { font-weight: 600; }
2586
2544
  .pj-struct-body .md-body em { color: var(--muted); font-style: normal; }
2587
2545
 
2546
+ /* ── README panel (free-form description, Osa A) ── */
2547
+ .pj-readme { margin: 0.4rem 0 0.9rem; padding: 0.85rem 1rem; background: var(--card); border: 1px solid var(--border); border-radius: 10px; }
2548
+ .pj-readme-empty { display: flex; flex-wrap: wrap; align-items: center; gap: 0.75rem; justify-content: space-between; }
2549
+ .pj-readme-bar { display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; margin-bottom: 0.5rem; }
2550
+ .pj-readme-actions { display: inline-flex; gap: 0.4rem; flex-wrap: wrap; }
2551
+ .pj-readme-body .md-body { font-size: 0.9rem; color: var(--text); line-height: 1.55; }
2552
+ .pj-readme-body .md-body > :first-child { margin-top: 0; }
2553
+ .pj-readme-textarea { width: 100%; font-family: var(--font-mono, monospace); font-size: 0.82rem; line-height: 1.5; resize: vertical; }
2554
+
2555
+ /* ── Interactive mindmap (Osa C) — reuses .of-mapwrap--clickable cursor/hover from offers.css ── */
2556
+ .pj-mindmap { margin: 0.4rem 0 0.9rem; }
2557
+ .pj-mindmap-body { margin-top: 0.4rem; padding: 0.75rem 0.9rem; background: var(--card); border: 1px solid var(--border); border-radius: 10px; }
2558
+ .pj-mindmap-opts { display: flex; flex-wrap: wrap; align-items: center; gap: 0.9rem; margin-bottom: 0.6rem; }
2559
+ .pj-mm-opt { display: inline-flex; align-items: center; gap: 0.4rem; font-size: 0.8rem; color: var(--text-dim); }
2560
+ .pj-mm-opt select { width: auto; }
2561
+ .pj-mm-check { display: inline-flex; align-items: center; gap: 0.35rem; font-size: 0.8rem; color: var(--text-dim); cursor: pointer; }
2562
+ .pj-mindmap-canvas { overflow: auto; max-height: 36rem; }
2563
+ .pj-mindmap-canvas .node { cursor: pointer; }
2564
+ .pj-mindmap-canvas .node:hover { opacity: 0.82; }
2565
+ .pj-mindmap-hint { margin-top: 0.4rem; }
2566
+
2567
+ /* ── Structure timeline / development (Osa D) ── */
2568
+ .pj-timeline { margin: 0.4rem 0 0.9rem; }
2569
+ .pj-timeline-body { margin-top: 0.4rem; padding: 0.75rem 0.9rem; background: var(--card); border: 1px solid var(--border); border-radius: 10px; }
2570
+ .pj-timeline-grid { display: grid; grid-template-columns: minmax(14rem, 22rem) 1fr; gap: 1rem; align-items: start; }
2571
+ .pj-timeline-list { list-style: none; margin: 0; padding: 0; max-height: 30rem; overflow: auto; }
2572
+ .pj-timeline-item { margin: 0; }
2573
+ .pj-timeline-entry { display: flex; flex-direction: column; gap: 0.1rem; width: 100%; text-align: left; background: none; border: none; border-left: 2px solid var(--border); padding: 0.4rem 0.6rem; cursor: pointer; color: var(--text); }
2574
+ .pj-timeline-entry:hover { background: var(--bg-dim); }
2575
+ .pj-timeline-item.is-active .pj-timeline-entry { border-left-color: var(--accent); background: var(--bg-dim); }
2576
+ .pj-timeline-date { font-size: 0.75rem; color: var(--muted); }
2577
+ .pj-timeline-event { font-size: 0.84rem; }
2578
+ .pj-timeline-counts { font-size: 0.72rem; }
2579
+ .pj-timeline-map { overflow: auto; max-height: 30rem; }
2580
+ @media (max-width: 720px) { .pj-timeline-grid { grid-template-columns: 1fr; } }
2581
+
2588
2582
  /* ── Workspace renew (phase 2): header actions, review banner, add-space tab ── */
2589
2583
  .pj-ws-head-actions { margin-left: auto; display: flex; gap: 0.4rem; align-items: center; }
2590
2584
  .pj-ws-banner { display: flex; align-items: center; gap: 0.75rem; flex-wrap: wrap; border: 1px solid var(--border); border-left: 3px solid var(--warn, var(--accent)); border-radius: 10px; background: var(--card); padding: 0.55rem 0.75rem; margin: 0.6rem 0 0.2rem; }
@@ -2668,7 +2662,6 @@
2668
2662
  .pf-home-row-meta.pf-ok { color: var(--success-fg, var(--text)); }
2669
2663
  .pf-lp-stat-link { background: none; border: none; padding: 0.15rem 0.35rem; border-radius: 8px; cursor: pointer; font: inherit; color: inherit; }
2670
2664
  .pf-lp-stat-link:hover { background: var(--bg-surface); }
2671
- .pf-lp-profile-btn { margin-left: auto; align-self: flex-start; }
2672
2665
  .pf-promo-dismiss { float: right; background: none; border: none; cursor: pointer; color: var(--muted); font-size: 0.85rem; padding: 0 0.2rem; }
2673
2666
  .pf-promo-dismiss:hover { color: var(--text); }
2674
2667
  /* Edit profile / password dialogs */
@@ -2945,9 +2938,9 @@
2945
2938
  .pf-eco-tech-principal { display: inline-block; background: var(--card); border: 1px solid var(--border); border-radius: 6px; padding: .3rem .5rem; word-break: break-all; }
2946
2939
  .pf-eco-tech-access { margin: -.15rem 0 .4rem; }
2947
2940
 
2948
- /* ── Presence control (Koti home) — backed by PresenceControl in landing-page.js.
2949
- Self-contained card; previews the same <PresenceDot> shown next to people. ── */
2950
- .pf-presence-card { border: 1px solid var(--border); border-radius: 12px; background: var(--card); padding: 1rem 1.1rem; margin-bottom: 1rem; }
2941
+ /* ── Presence settings dialog — backed by PresenceDialog in landing-page.js, opened
2942
+ from the <PresencePill> in the ProfileCard header; previews the same <PresenceDot>
2943
+ shown next to people. ── */
2951
2944
  .pf-presence-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; }
2952
2945
  .pf-presence-head .section-desc { margin-bottom: .75rem; }
2953
2946
  .pf-presence-row { display: flex; align-items: center; justify-content: space-between; gap: 1rem; margin: .5rem 0; }
@@ -1,16 +1,22 @@
1
1
  /**
2
2
  * @file public/js/app-sandbox.js
3
- * @description Open a user-published app's HTML inside a full-screen, sandboxed,
4
- * opaque-origin iframe overlay — the H-2-safe way to "view" an app from anywhere in
5
- * the SPA. The iframe's `sandbox` deliberately omits `allow-same-origin`, so even
6
- * apex-hosted (`/v1/apps/...?mode=inline`) content runs with an opaque origin and can
7
- * neither read aimeat.io localStorage nor send credentialed same-origin requests
8
- * (e.g. POST /v1/auth/refresh). Replaces every top-level `window.open(...?mode=inline)`
9
- * / `<a target="_blank">` app link that previously ran app HTML on the apex origin.
10
- * @structure isAppHtmlUrl() route matcher · openAppSandboxed() overlay builder.
3
+ * @description Open a user-published app from anywhere in the SPA. Apps always open TOP-LEVEL
4
+ * in a new tab via the apex `?mode=inline` URL — a clean, full-screen page (no overlay/X).
5
+ * The server decides isolation:
6
+ * - app origin OFF → the app is served inline on the apex (same host as the SPA), so the
7
+ * user's session carries into the app (it can refresh + read its own data — "logged in");
8
+ * - app origin ON → the apex 301s to `apps.<domain>`, an isolated origin with no ambient
9
+ * session (apps then use the explicit grant flow).
10
+ * So "logged into aimeat.io ⇒ apps are logged in" is the OFF (default) behaviour; ON is the
11
+ * opt-in hardened mode for multi-user/public nodes.
12
+ * @structure isAppHtmlUrl() route matcher · openAppSandboxed() top-level opener.
11
13
  * @usage import { openAppSandboxed, isAppHtmlUrl } from '/js/app-sandbox.js'
12
14
  * @version-history
13
15
  * v1.0.0 — 2026-06-20 — Initial (H-2 app-origin isolation, Phase 0).
16
+ * v1.1.0 — 2026-06-20 — App origin live → open apps top-level; opaque-sandbox overlay fallback.
17
+ * v2.0.0 — 2026-06-20 — Always open apps TOP-LEVEL (the opaque sandbox gave apps origin `null`,
18
+ * breaking their storage/API and forcing a re-login). Isolation is now the server's job via
19
+ * the app origin; with it off, apps run on the apex and inherit the user's session.
14
20
  */
15
21
 
16
22
  /** Matches the published-app HTML route: /v1/apps/<owner>/<file> (optionally ?mode=inline). */
@@ -27,57 +33,10 @@ export function isAppHtmlUrl(href) {
27
33
  return /^\/v1\/apps\/[^/]+\/[^/]+$/.test(path);
28
34
  }
29
35
 
30
- let escHandler = null;
31
-
32
- /** Remove the overlay (if present) and detach the Escape handler. */
33
- function closeOverlay() {
34
- const existing = document.getElementById('app-sandbox-overlay');
35
- if (existing) existing.remove();
36
- if (escHandler) {
37
- document.removeEventListener('keydown', escHandler);
38
- escHandler = null;
39
- }
40
- }
41
-
42
36
  /**
43
- * Show `url` in a sandboxed (opaque-origin) iframe overlay. `name` labels the toolbar.
44
- * Any previously-open overlay is replaced.
37
+ * Open a published app in a new top-level tab. `url` is the apex `?mode=inline` URL; the server
38
+ * either serves it inline (session inherited) or 301s it to the isolated app origin.
45
39
  */
46
- export function openAppSandboxed(url, name) {
47
- closeOverlay();
48
-
49
- const overlay = document.createElement('div');
50
- overlay.id = 'app-sandbox-overlay';
51
- overlay.className = 'app-sandbox-overlay';
52
-
53
- const toolbar = document.createElement('div');
54
- toolbar.className = 'app-sandbox-toolbar';
55
-
56
- const title = document.createElement('span');
57
- title.className = 'app-sandbox-title';
58
- title.textContent = name || 'App';
59
-
60
- const close = document.createElement('button');
61
- close.type = 'button';
62
- close.className = 'app-sandbox-close';
63
- close.setAttribute('aria-label', 'Close');
64
- close.textContent = '✕';
65
- close.addEventListener('click', closeOverlay);
66
-
67
- toolbar.appendChild(title);
68
- toolbar.appendChild(close);
69
-
70
- const iframe = document.createElement('iframe');
71
- iframe.className = 'app-sandbox-frame';
72
- // No allow-same-origin → opaque origin. This is the entire H-2 protection.
73
- iframe.setAttribute('sandbox', 'allow-scripts allow-forms allow-popups allow-modals');
74
- iframe.setAttribute('referrerpolicy', 'no-referrer');
75
- iframe.src = url;
76
-
77
- overlay.appendChild(toolbar);
78
- overlay.appendChild(iframe);
79
- document.body.appendChild(overlay);
80
-
81
- escHandler = (e) => { if (e.key === 'Escape') closeOverlay(); };
82
- document.addEventListener('keydown', escHandler);
40
+ export function openAppSandboxed(url, _name) {
41
+ window.open(url, '_blank', 'noopener');
83
42
  }
@@ -70,7 +70,13 @@ export function refreshAll() {
70
70
  function bindLive() {
71
71
  if (liveBound) return;
72
72
  liveBound = true;
73
- window.addEventListener('aimeat-live-update', refreshAll);
73
+ // Refresh presence only when the 'presence' domain actually changed (or on a legacy
74
+ // "everything changed" payload), not on every unrelated live update.
75
+ window.addEventListener('aimeat-live-update', (e) => {
76
+ const d = /** @type {CustomEvent} */ (e).detail?.domains;
77
+ if (d && !d.has('presence')) return;
78
+ refreshAll();
79
+ });
74
80
  }
75
81
 
76
82
  /**
@@ -4,9 +4,16 @@
4
4
  */
5
5
  import { apiGet, apiPost, apiDelete, api } from '/js/api.js';
6
6
 
7
- /** List agents owned by the given owner. Returns array. */
8
- export async function listAgents(owner) {
9
- const data = await apiGet('/v1/agents');
7
+ /**
8
+ * List agents owned by the given owner. Returns array.
9
+ * @param {string} [owner] filter to this owner
10
+ * @param {{ include?: string }} [opts] `include:'stats'` attaches a per-agent `stats` projection
11
+ * (task/message counts + latest timestamps + active_tasks + onboarding) in ONE request,
12
+ * replacing the old N+1 per-agent fan-out.
13
+ */
14
+ export async function listAgents(owner, opts = {}) {
15
+ const qs = opts.include ? `?include=${encodeURIComponent(opts.include)}` : '';
16
+ const data = await apiGet(`/v1/agents${qs}`);
10
17
  const list = data?.data?.agents || data?.data || [];
11
18
  return owner ? list.filter(a => a.owner === owner) : list;
12
19
  }
@@ -13,6 +13,8 @@
13
13
  * import { AIMEAT_CONTEXT, INSTRUCTION_DISCLAIMER, COMPONENT_TEMPLATES } from '/js/services/generator-prompts-base.js';
14
14
  * @version-history
15
15
  * v1.0.0 — 2026-03-22 — Extracted from generator-prompts.js
16
+ * v1.1.0 — 2026-06-20 — App-build prompt: teach H-2 app-origin isolation (no ambient session;
17
+ * public data via /v1/..., private data via the app-grant PKCE flow + scoped Bearer token).
16
18
  */
17
19
 
18
20
  export const AIMEAT_CONTEXT = `
@@ -600,9 +602,44 @@ Create an AIMEAT App (HTML/JS) for: ${label}
600
602
 
601
603
  ${context}
602
604
 
603
- ## CRITICAL: Authentication & API Calls
604
-
605
- The app runs on the SAME ORIGIN as the AIMEAT node. Use relative API paths (e.g., "/v1/ext/..."), NOT absolute URLs.
605
+ ## CRITICAL: App origin isolation & data access (read this first)
606
+
607
+ Your published app runs on an ISOLATED app origin (\`*.apps.<domain>\`, e.g. \`apps.aimeat.io\`) — a DIFFERENT browser origin from the AIMEAT node (\`aimeat.io\`). Consequences you MUST respect:
608
+ - The app has NO access to the user's AIMEAT login session, cookie, or localStorage. There is no ambient/owner session.
609
+ - NEVER call \`/v1/auth/refresh\` and NEVER fetch with \`credentials:'include'\` expecting the user's session — that pattern was removed for security (H-2) and now returns 401/403.
610
+ - Same-origin \`fetch('/v1/...')\` to the app origin still works (CORS \`*\`) for PUBLIC data that needs no auth — public memory (\`getPublic\`), the catalogue, public boards.
611
+ - For the user's OWN/PRIVATE data, you MUST use the explicit, revocable **app-grant** flow (OAuth-style, PKCE) below. The token you obtain is scoped and stored in YOUR OWN origin's localStorage; you call APIs with \`Authorization: Bearer <that token>\` — never the user's session.
612
+ - Apps that use the user's OpenRouter key via cortex (\`AIMEAT.ai.complete()\`) are UNAFFECTED — that path is separate; use it as documented.
613
+
614
+ ### App-grant flow for private data (only when you need the user's own data)
615
+ 1. Send the user to the trusted apex to approve (PKCE \`code_challenge\` = base64url(SHA-256(verifier)), method S256):
616
+ \\\`\\\`\\\`javascript
617
+ // scope = space-separated agent scopes: memory:read memory:write memory:delete
618
+ // catalogue:read social:read social:write wallet:read knowledge:read
619
+ const verifier = base64url(crypto.getRandomValues(new Uint8Array(32)));
620
+ sessionStorage.setItem('pkce', verifier);
621
+ const challenge = base64url(new Uint8Array(await crypto.subtle.digest('SHA-256', new TextEncoder().encode(verifier))));
622
+ const url = 'https://aimeat.io/v1/app-grants/authorize'
623
+ + '?app=' + encodeURIComponent('<owner>/<file>') // your published app id
624
+ + '&response_type=code&scope=' + encodeURIComponent('memory:read')
625
+ + '&redirect_uri=' + encodeURIComponent(location.origin + location.pathname) // your URL on the app origin
626
+ + '&state=' + state + '&code_challenge=' + challenge + '&code_challenge_method=S256';
627
+ location.href = url;
628
+ \\\`\\\`\\\`
629
+ 2. On return, exchange the \`code\` for a scoped token (store it in YOUR localStorage):
630
+ \\\`\\\`\\\`javascript
631
+ const r = await fetch('https://aimeat.io/v1/app-grants/token', {
632
+ method: 'POST', headers: { 'Content-Type': 'application/json' },
633
+ body: JSON.stringify({ grant_type: 'authorization_code', code, code_verifier: verifier, redirect_uri: location.origin + location.pathname })
634
+ }).then(x => x.json());
635
+ localStorage.setItem('aimeat_token', r.data.access_token); // scoped, revocable
636
+ localStorage.setItem('aimeat_refresh', r.data.refresh_token); // re-exchange with grant_type:'refresh_token'
637
+ \\\`\\\`\\\`
638
+ 3. Call AIMEAT APIs with that Bearer token (NOT the user's session):
639
+ \\\`\\\`\\\`javascript
640
+ await fetch('https://aimeat.io/v1/memory/my.key', { headers: { Authorization: 'Bearer ' + localStorage.getItem('aimeat_token') } });
641
+ \\\`\\\`\\\`
642
+ The user manages/revokes these tokens in Profile → Access → "Connected Apps". Request the FEWEST scopes you need.
606
643
 
607
644
  ### Library setup (copy this exactly — load BOTH libraries):
608
645
  \`\`\`javascript