aimeat 1.40.1 → 2.1.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 (1816) hide show
  1. package/README.md +24 -15
  2. package/dist/.env.example +528 -495
  3. package/dist/locales/en.json +349 -298
  4. package/dist/locales/fi.json +349 -298
  5. package/dist/public/components/ContactPicker.js +145 -0
  6. package/dist/public/components/EmptyState.js +22 -7
  7. package/dist/public/components/LinkPreview.js +101 -0
  8. package/dist/public/components/NotificationBell.js +110 -8
  9. package/dist/public/cortex-bundled/aimeat-dag.js +553 -0
  10. package/dist/public/cortex-bundled/aimeat-dag.yaml +77 -0
  11. package/dist/public/cortex-bundled/aimeat-flow.js +225 -0
  12. package/dist/public/cortex-bundled/aimeat-flow.yaml +101 -0
  13. package/dist/public/cortex-bundled/aimeat-ui-motion.js +323 -0
  14. package/dist/public/cortex-bundled/aimeat-ui-motion.yaml +86 -0
  15. package/dist/public/css/components/contact-picker.css +26 -0
  16. package/dist/public/css/theme.css +109 -9
  17. package/dist/public/css/views/admin.css +59 -2
  18. package/dist/public/css/views/agents-detail.css +78 -14
  19. package/dist/public/css/views/app-grant.css +18 -0
  20. package/dist/public/css/views/capabilities.css +2 -0
  21. package/dist/public/css/views/companies.css +0 -1
  22. package/dist/public/css/views/inbox.css +188 -7
  23. package/dist/public/css/views/landing.css +2 -0
  24. package/dist/public/css/views/members.css +0 -1
  25. package/dist/public/css/views/my-company.css +5 -5
  26. package/dist/public/css/views/offers.css +0 -3
  27. package/dist/public/css/views/portal-dev.css +49 -0
  28. package/dist/public/css/views/portfolio.css +46 -0
  29. package/dist/public/css/views/profile.css +200 -17
  30. package/dist/public/css/views/public-knowledge-viewer.css +0 -17
  31. package/dist/public/css/views/scheduler.css +37 -1
  32. package/dist/public/css/views/workflows.css +1 -1
  33. package/dist/public/js/services/admin.js +10 -0
  34. package/dist/public/js/services/agent-activity.js +15 -0
  35. package/dist/public/js/services/agent-directives.js +14 -0
  36. package/dist/public/js/services/agent-integration.js +15 -0
  37. package/dist/public/js/services/agent-messages.js +14 -0
  38. package/dist/public/js/services/agent-tasks.js +14 -0
  39. package/dist/public/js/services/appdev.js +67 -0
  40. package/dist/public/js/services/apps.js +47 -3
  41. package/dist/public/js/services/calibrator.js +14 -1
  42. package/dist/public/js/services/consent.js +17 -0
  43. package/dist/public/js/services/contacts.js +47 -0
  44. package/dist/public/js/services/ecosystem.js +14 -0
  45. package/dist/public/js/services/generator.js +71 -35
  46. package/dist/public/js/services/knowledge.js +14 -0
  47. package/dist/public/js/services/ledger.js +18 -0
  48. package/dist/public/js/services/living.js +14 -0
  49. package/dist/public/js/services/messages-ai-prompts.js +38 -0
  50. package/dist/public/js/services/messages.js +33 -5
  51. package/dist/public/js/services/notebook.js +76 -0
  52. package/dist/public/js/services/organisms.js +48 -4
  53. package/dist/public/js/services/schedules.js +19 -2
  54. package/dist/public/js/services/security.js +14 -0
  55. package/dist/public/js/services/unfurl.js +43 -0
  56. package/dist/public/js/services/work.js +14 -0
  57. package/dist/public/lib/VENDORED.md +77 -0
  58. package/dist/public/lib/drawflow@0.min.css +1 -0
  59. package/dist/public/lib/drawflow@0.min.js +1 -0
  60. package/dist/public/lib/fonts/LICENSE.md +13 -0
  61. package/dist/public/lib/fonts/baloo2-latin-ext.woff2 +0 -0
  62. package/dist/public/lib/fonts/baloo2-latin.woff2 +0 -0
  63. package/dist/public/lib/fonts/bangers-latin-ext.woff2 +0 -0
  64. package/dist/public/lib/fonts/bangers-latin.woff2 +0 -0
  65. package/dist/public/lib/fonts.css +51 -0
  66. package/dist/public/lib/p5@1.min.js +2 -0
  67. package/dist/public/lib/phaser@3.min.js +1 -0
  68. package/dist/public/lib/pixi-unsafe-eval@8.min.js +22 -0
  69. package/dist/public/lib/pixi@8.min.js +2329 -0
  70. package/dist/public/lib/realtime.js +120 -3
  71. package/dist/public/lib/samples/LICENSE.md +31 -8
  72. package/dist/public/lib/samples/bass/A1.mp3 +0 -0
  73. package/dist/public/lib/samples/bass/B2.mp3 +0 -0
  74. package/dist/public/lib/samples/bass/D2.mp3 +0 -0
  75. package/dist/public/lib/samples/bass/E1.mp3 +0 -0
  76. package/dist/public/lib/samples/bass/E3.mp3 +0 -0
  77. package/dist/public/lib/samples/bass/G2.mp3 +0 -0
  78. package/dist/public/lib/samples/drums/clap.mp3 +0 -0
  79. package/dist/public/lib/samples/drums/cowbell.mp3 +0 -0
  80. package/dist/public/lib/samples/drums/crash.mp3 +0 -0
  81. package/dist/public/lib/samples/drums/hihat-open.mp3 +0 -0
  82. package/dist/public/lib/samples/drums/hihat.mp3 +0 -0
  83. package/dist/public/lib/samples/drums/kick.mp3 +0 -0
  84. package/dist/public/lib/samples/drums/ride.mp3 +0 -0
  85. package/dist/public/lib/samples/drums/snare.mp3 +0 -0
  86. package/dist/public/lib/samples/drums/tom-high.mp3 +0 -0
  87. package/dist/public/lib/samples/drums/tom-low.mp3 +0 -0
  88. package/dist/public/lib/samples/drums/tom-mid.mp3 +0 -0
  89. package/dist/public/lib/samples/epiano/C2.mp3 +0 -0
  90. package/dist/public/lib/samples/epiano/C3.mp3 +0 -0
  91. package/dist/public/lib/samples/epiano/C4.mp3 +0 -0
  92. package/dist/public/lib/samples/epiano/C5.mp3 +0 -0
  93. package/dist/public/lib/samples/epiano/C6.mp3 +0 -0
  94. package/dist/public/lib/samples/epiano/G2.mp3 +0 -0
  95. package/dist/public/lib/samples/epiano/G3.mp3 +0 -0
  96. package/dist/public/lib/samples/epiano/G4.mp3 +0 -0
  97. package/dist/public/lib/samples/epiano/G5.mp3 +0 -0
  98. package/dist/public/lib/samples/flute/A4.mp3 +0 -0
  99. package/dist/public/lib/samples/flute/A5.mp3 +0 -0
  100. package/dist/public/lib/samples/flute/C4.mp3 +0 -0
  101. package/dist/public/lib/samples/flute/C5.mp3 +0 -0
  102. package/dist/public/lib/samples/flute/C6.mp3 +0 -0
  103. package/dist/public/lib/samples/flute/E4.mp3 +0 -0
  104. package/dist/public/lib/samples/flute/E5.mp3 +0 -0
  105. package/dist/public/lib/samples/guitar/A2.mp3 +0 -0
  106. package/dist/public/lib/samples/guitar/A4.mp3 +0 -0
  107. package/dist/public/lib/samples/guitar/B3.mp3 +0 -0
  108. package/dist/public/lib/samples/guitar/D3.mp3 +0 -0
  109. package/dist/public/lib/samples/guitar/E2.mp3 +0 -0
  110. package/dist/public/lib/samples/guitar/E4.mp3 +0 -0
  111. package/dist/public/lib/samples/guitar/E5.mp3 +0 -0
  112. package/dist/public/lib/samples/guitar/G3.mp3 +0 -0
  113. package/dist/public/lib/samples/guitar-el/A2.mp3 +0 -0
  114. package/dist/public/lib/samples/guitar-el/A4.mp3 +0 -0
  115. package/dist/public/lib/samples/guitar-el/B3.mp3 +0 -0
  116. package/dist/public/lib/samples/guitar-el/D3.mp3 +0 -0
  117. package/dist/public/lib/samples/guitar-el/E2.mp3 +0 -0
  118. package/dist/public/lib/samples/guitar-el/E4.mp3 +0 -0
  119. package/dist/public/lib/samples/guitar-el/E5.mp3 +0 -0
  120. package/dist/public/lib/samples/guitar-el/G3.mp3 +0 -0
  121. package/dist/public/lib/samples/guitar-steel/A2.mp3 +0 -0
  122. package/dist/public/lib/samples/guitar-steel/A4.mp3 +0 -0
  123. package/dist/public/lib/samples/guitar-steel/B3.mp3 +0 -0
  124. package/dist/public/lib/samples/guitar-steel/D3.mp3 +0 -0
  125. package/dist/public/lib/samples/guitar-steel/E2.mp3 +0 -0
  126. package/dist/public/lib/samples/guitar-steel/E4.mp3 +0 -0
  127. package/dist/public/lib/samples/guitar-steel/E5.mp3 +0 -0
  128. package/dist/public/lib/samples/guitar-steel/G3.mp3 +0 -0
  129. package/dist/public/lib/samples/organ/C2.mp3 +0 -0
  130. package/dist/public/lib/samples/organ/C3.mp3 +0 -0
  131. package/dist/public/lib/samples/organ/C4.mp3 +0 -0
  132. package/dist/public/lib/samples/organ/C5.mp3 +0 -0
  133. package/dist/public/lib/samples/organ/C6.mp3 +0 -0
  134. package/dist/public/lib/samples/organ/G2.mp3 +0 -0
  135. package/dist/public/lib/samples/organ/G3.mp3 +0 -0
  136. package/dist/public/lib/samples/organ/G4.mp3 +0 -0
  137. package/dist/public/lib/samples/organ/G5.mp3 +0 -0
  138. package/dist/public/lib/samples/strings/C2.mp3 +0 -0
  139. package/dist/public/lib/samples/strings/C3.mp3 +0 -0
  140. package/dist/public/lib/samples/strings/C4.mp3 +0 -0
  141. package/dist/public/lib/samples/strings/C5.mp3 +0 -0
  142. package/dist/public/lib/samples/strings/C6.mp3 +0 -0
  143. package/dist/public/lib/samples/strings/G2.mp3 +0 -0
  144. package/dist/public/lib/samples/strings/G3.mp3 +0 -0
  145. package/dist/public/lib/samples/strings/G4.mp3 +0 -0
  146. package/dist/public/lib/samples/strings/G5.mp3 +0 -0
  147. package/dist/public/lib/samples/trumpet/A3.mp3 +0 -0
  148. package/dist/public/lib/samples/trumpet/A4.mp3 +0 -0
  149. package/dist/public/lib/samples/trumpet/A5.mp3 +0 -0
  150. package/dist/public/lib/samples/trumpet/C4.mp3 +0 -0
  151. package/dist/public/lib/samples/trumpet/C5.mp3 +0 -0
  152. package/dist/public/lib/samples/trumpet/E3.mp3 +0 -0
  153. package/dist/public/lib/samples/trumpet/E4.mp3 +0 -0
  154. package/dist/public/lib/samples/trumpet/E5.mp3 +0 -0
  155. package/dist/public/llms-template.txt +42 -21
  156. package/dist/public/spa.html +42 -34
  157. package/dist/public/style-testbed.html +0 -2
  158. package/dist/public/sw.js +23 -4
  159. package/dist/public/views/_template.js +21 -8
  160. package/dist/public/views/admin/cortex-tab.js +2 -2
  161. package/dist/public/views/admin/database-tab.js +140 -0
  162. package/dist/public/views/admin/feedback-tab.js +162 -0
  163. package/dist/public/views/admin/owners-tab.js +19 -29
  164. package/dist/public/views/admin/push-tab.js +2 -2
  165. package/dist/public/views/admin/services-tab.js +4 -4
  166. package/dist/public/views/admin/shared.js +9 -3
  167. package/dist/public/views/admin/sharing-groups-tab.js +13 -25
  168. package/dist/public/views/admin/stats-tab.js +33 -33
  169. package/dist/public/views/admin.js +52 -49
  170. package/dist/public/views/app-grant.js +24 -4
  171. package/dist/public/views/companies.js +9 -7
  172. package/dist/public/views/help.js +2 -1
  173. package/dist/public/views/invite-accept.js +64 -19
  174. package/dist/public/views/landing.js +41 -8
  175. package/dist/public/views/members.js +4 -2
  176. package/dist/public/views/my-company.js +27 -77
  177. package/dist/public/views/my-company.payments.js +177 -0
  178. package/dist/public/views/portal-classic.js +0 -4
  179. package/dist/public/views/portal-dev.js +11 -0
  180. package/dist/public/views/portal-dev.panels.js +52 -58
  181. package/dist/public/views/portal.components.js +18 -36
  182. package/dist/public/views/portal.prompts.js +9 -10
  183. package/dist/public/views/portfolio.js +61 -6
  184. package/dist/public/views/profile/access-tab/access-tokens.js +3 -3
  185. package/dist/public/views/profile/access-tab/agent-defaults.js +3 -3
  186. package/dist/public/views/profile/access-tab/connected-apps.js +5 -3
  187. package/dist/public/views/profile/access-tab/sharing-groups.js +8 -7
  188. package/dist/public/views/profile/access-tab.js +26 -10
  189. package/dist/public/views/profile/agents/agent-card.js +16 -5
  190. package/dist/public/views/profile/agents/tab-activity.js +27 -9
  191. package/dist/public/views/profile/agents/tab-agent-config.js +4 -1
  192. package/dist/public/views/profile/agents/tab-contracts.js +11 -3
  193. package/dist/public/views/profile/agents/tab-data-access.js +36 -20
  194. package/dist/public/views/profile/agents/tab-directives.js +2 -1
  195. package/dist/public/views/profile/agents/tab-integration.js +46 -23
  196. package/dist/public/views/profile/agents/tab-messages.js +37 -6
  197. package/dist/public/views/profile/agents/tab-quality.js +32 -8
  198. package/dist/public/views/profile/agents/tab-schedules.js +15 -10
  199. package/dist/public/views/profile/agents/tab-usage.js +19 -8
  200. package/dist/public/views/profile/agents-capabilities-subtab.js +3 -3
  201. package/dist/public/views/profile/agents-tab.js +11 -1
  202. package/dist/public/views/profile/appdev-tab.js +275 -0
  203. package/dist/public/views/profile/apps-tab.js +248 -2
  204. package/dist/public/views/profile/calibrator-batch.js +2 -2
  205. package/dist/public/views/profile/calibrator-tab.js +69 -37
  206. package/dist/public/views/profile/capabilities-tab.js +24 -13
  207. package/dist/public/views/profile/contacts-tab.js +139 -0
  208. package/dist/public/views/profile/data-wallet-tab.js +37 -18
  209. package/dist/public/views/profile/discover-tab.js +2 -1
  210. package/dist/public/views/profile/ecosystem-tab.automation.js +21 -7
  211. package/dist/public/views/profile/extensions-tab.js +4 -2
  212. package/dist/public/views/profile/extensions-tab.maturity.js +40 -0
  213. package/dist/public/views/profile/generator-dashboard/DebugPanel.js +16 -9
  214. package/dist/public/views/profile/generator-dashboard/use-dashboard-core.js +46 -26
  215. package/dist/public/views/profile/generator-dashboard/use-edit-mode.js +29 -25
  216. package/dist/public/views/profile/generator-dashboard/use-test-execution.js +14 -14
  217. package/dist/public/views/profile/generator-detail.ai.js +21 -0
  218. package/dist/public/views/profile/generator-detail.js +59 -26
  219. package/dist/public/views/profile/generator-detail.results.js +1 -1
  220. package/dist/public/views/profile/generator-settings.js +51 -47
  221. package/dist/public/views/profile/generator-tab.js +28 -7
  222. package/dist/public/views/profile/inbox-tab/ai-actions.js +86 -0
  223. package/dist/public/views/profile/inbox-tab/components.js +229 -14
  224. package/dist/public/views/profile/inbox-tab/helpers.js +38 -0
  225. package/dist/public/views/profile/inbox-tab/panels.js +51 -6
  226. package/dist/public/views/profile/inbox-tab/use-thread-ux.js +121 -0
  227. package/dist/public/views/profile/inbox-tab.js +134 -90
  228. package/dist/public/views/profile/knowledge-tab.helpers.js +20 -0
  229. package/dist/public/views/profile/knowledge-tab.js +31 -28
  230. package/dist/public/views/profile/landing-page.cards.js +66 -46
  231. package/dist/public/views/profile/landing-page.js +18 -6
  232. package/dist/public/views/profile/landing-page.modals.js +5 -2
  233. package/dist/public/views/profile/libraries-tab.js +196 -0
  234. package/dist/public/views/profile/living-tab.js +11 -0
  235. package/dist/public/views/profile/memory-tab.js +45 -4
  236. package/dist/public/views/profile/node-stats-tab.js +29 -24
  237. package/dist/public/views/profile/notebook-card.js +1 -1
  238. package/dist/public/views/profile/notebook-tab.js +20 -1
  239. package/dist/public/views/profile/offers-tab.js +2 -1
  240. package/dist/public/views/profile/openrouter-settings.js +613 -0
  241. package/dist/public/views/profile/organisms/invite-panel.js +254 -0
  242. package/dist/public/views/profile/organisms/members.js +110 -177
  243. package/dist/public/views/profile/organisms/participants-panel.js +6 -2
  244. package/dist/public/views/profile/organisms/skills-panel.js +2 -1
  245. package/dist/public/views/profile/organisms/workspace/generator.js +1 -1
  246. package/dist/public/views/profile/organisms-tab.js +24 -16
  247. package/dist/public/views/profile/packages-tab.js +28 -38
  248. package/dist/public/views/profile/scheduler-calendar.js +72 -4
  249. package/dist/public/views/profile/scheduler-tab.js +16 -5
  250. package/dist/public/views/profile/security-tab.js +44 -44
  251. package/dist/public/views/profile/skills-tab.js +4 -3
  252. package/dist/public/views/profile/wallet-tab.js +34 -7
  253. package/dist/public/views/profile/work-tab.js +10 -1
  254. package/dist/public/views/profile/workflows-tab.js +3 -2
  255. package/dist/public/views/profile.js +38 -44
  256. package/dist/public/views/public-knowledge-viewer.js +6 -7
  257. package/dist/public/views/public-workspace-viewer.js +1 -1
  258. package/dist/public/views/start-flows.js +16 -0
  259. package/dist/public/views/start.js +2 -1
  260. package/dist/scripts/aeb-ledger.d.ts +2 -0
  261. package/dist/scripts/aeb-ledger.d.ts.map +1 -0
  262. package/dist/scripts/aeb-ledger.js +28 -0
  263. package/dist/scripts/aeb-ledger.js.map +1 -0
  264. package/dist/scripts/aeb-prove.d.ts +2 -0
  265. package/dist/scripts/aeb-prove.d.ts.map +1 -0
  266. package/dist/scripts/aeb-prove.js +124 -0
  267. package/dist/scripts/aeb-prove.js.map +1 -0
  268. package/dist/scripts/archive-stale-versions.js +1 -59
  269. package/dist/scripts/archive-stale-versions.js.map +1 -1
  270. package/dist/scripts/audit-mcp-tools.d.ts +1 -0
  271. package/dist/scripts/audit-mcp-tools.d.ts.map +1 -1
  272. package/dist/scripts/audit-mcp-tools.js +25 -0
  273. package/dist/scripts/audit-mcp-tools.js.map +1 -1
  274. package/dist/scripts/build-sdk-libs.d.ts +16 -0
  275. package/dist/scripts/build-sdk-libs.d.ts.map +1 -0
  276. package/dist/scripts/build-sdk-libs.js +112 -0
  277. package/dist/scripts/build-sdk-libs.js.map +1 -0
  278. package/dist/scripts/consent-audit-prune.js +5 -58
  279. package/dist/scripts/consent-audit-prune.js.map +1 -1
  280. package/dist/scripts/db-reset.d.ts +3 -3
  281. package/dist/scripts/db-reset.js +21 -62
  282. package/dist/scripts/db-reset.js.map +1 -1
  283. package/dist/scripts/kill-port.js +25 -5
  284. package/dist/scripts/kill-port.js.map +1 -1
  285. package/dist/scripts/kill-test-servers.d.ts +3 -0
  286. package/dist/scripts/kill-test-servers.d.ts.map +1 -0
  287. package/dist/scripts/kill-test-servers.js +84 -0
  288. package/dist/scripts/kill-test-servers.js.map +1 -0
  289. package/dist/scripts/migrate-to-postgres-kysely.d.ts +2 -0
  290. package/dist/scripts/migrate-to-postgres-kysely.d.ts.map +1 -0
  291. package/dist/scripts/migrate-to-postgres-kysely.js +194 -0
  292. package/dist/scripts/migrate-to-postgres-kysely.js.map +1 -0
  293. package/dist/scripts/reassign-apps.js +1 -1
  294. package/dist/scripts/telemetry-prune.d.ts +2 -1
  295. package/dist/scripts/telemetry-prune.d.ts.map +1 -1
  296. package/dist/scripts/telemetry-prune.js +7 -58
  297. package/dist/scripts/telemetry-prune.js.map +1 -1
  298. package/dist/src/auth/middleware.d.ts +9 -0
  299. package/dist/src/auth/middleware.d.ts.map +1 -1
  300. package/dist/src/auth/middleware.js +31 -0
  301. package/dist/src/auth/middleware.js.map +1 -1
  302. package/dist/src/cli/config-import.js +2 -2
  303. package/dist/src/cli/config-import.js.map +1 -1
  304. package/dist/src/cli/connect/auth.d.ts +15 -0
  305. package/dist/src/cli/connect/auth.d.ts.map +1 -1
  306. package/dist/src/cli/connect/auth.js +25 -6
  307. package/dist/src/cli/connect/auth.js.map +1 -1
  308. package/dist/src/cli/connect/keychain.d.ts +9 -0
  309. package/dist/src/cli/connect/keychain.d.ts.map +1 -1
  310. package/dist/src/cli/connect/keychain.js +21 -8
  311. package/dist/src/cli/connect/keychain.js.map +1 -1
  312. package/dist/src/cli/connect/mcp/tools/agent-management.d.ts +2 -0
  313. package/dist/src/cli/connect/mcp/tools/agent-management.d.ts.map +1 -1
  314. package/dist/src/cli/connect/mcp/tools/agent-management.js +8 -0
  315. package/dist/src/cli/connect/mcp/tools/agent-management.js.map +1 -1
  316. package/dist/src/cli/connect/mcp/tools/appdev.d.ts +17 -0
  317. package/dist/src/cli/connect/mcp/tools/appdev.d.ts.map +1 -0
  318. package/dist/src/cli/connect/mcp/tools/appdev.js +123 -0
  319. package/dist/src/cli/connect/mcp/tools/appdev.js.map +1 -0
  320. package/dist/src/cli/connect/mcp/tools/apps.d.ts +3 -1
  321. package/dist/src/cli/connect/mcp/tools/apps.d.ts.map +1 -1
  322. package/dist/src/cli/connect/mcp/tools/apps.js +49 -1
  323. package/dist/src/cli/connect/mcp/tools/apps.js.map +1 -1
  324. package/dist/src/cli/connect/mcp/tools/commerce.d.ts +16 -0
  325. package/dist/src/cli/connect/mcp/tools/commerce.d.ts.map +1 -0
  326. package/dist/src/cli/connect/mcp/tools/commerce.js +102 -0
  327. package/dist/src/cli/connect/mcp/tools/commerce.js.map +1 -0
  328. package/dist/src/cli/connect/mcp/tools/contacts.d.ts +13 -0
  329. package/dist/src/cli/connect/mcp/tools/contacts.d.ts.map +1 -0
  330. package/dist/src/cli/connect/mcp/tools/contacts.js +35 -0
  331. package/dist/src/cli/connect/mcp/tools/contacts.js.map +1 -0
  332. package/dist/src/cli/connect/mcp/tools/dm-messages.d.ts +3 -0
  333. package/dist/src/cli/connect/mcp/tools/dm-messages.d.ts.map +1 -1
  334. package/dist/src/cli/connect/mcp/tools/dm-messages.js +24 -0
  335. package/dist/src/cli/connect/mcp/tools/dm-messages.js.map +1 -1
  336. package/dist/src/cli/connect/mcp/tools/exchange.d.ts +18 -0
  337. package/dist/src/cli/connect/mcp/tools/exchange.d.ts.map +1 -0
  338. package/dist/src/cli/connect/mcp/tools/exchange.js +170 -0
  339. package/dist/src/cli/connect/mcp/tools/exchange.js.map +1 -0
  340. package/dist/src/cli/connect/mcp/tools/feedback.d.ts +14 -0
  341. package/dist/src/cli/connect/mcp/tools/feedback.d.ts.map +1 -0
  342. package/dist/src/cli/connect/mcp/tools/feedback.js +29 -0
  343. package/dist/src/cli/connect/mcp/tools/feedback.js.map +1 -0
  344. package/dist/src/cli/connect/mcp/tools/index.d.ts.map +1 -1
  345. package/dist/src/cli/connect/mcp/tools/index.js +12 -0
  346. package/dist/src/cli/connect/mcp/tools/index.js.map +1 -1
  347. package/dist/src/cli/connect/mcp/tools/onboarding.d.ts.map +1 -1
  348. package/dist/src/cli/connect/mcp/tools/onboarding.js +4 -1
  349. package/dist/src/cli/connect/mcp/tools/onboarding.js.map +1 -1
  350. package/dist/src/cli/connect/mcp/tools/operator.d.ts +18 -0
  351. package/dist/src/cli/connect/mcp/tools/operator.d.ts.map +1 -0
  352. package/dist/src/cli/connect/mcp/tools/operator.js +65 -0
  353. package/dist/src/cli/connect/mcp/tools/operator.js.map +1 -0
  354. package/dist/src/cli/connect/mcp/tools/organisms.d.ts +2 -0
  355. package/dist/src/cli/connect/mcp/tools/organisms.d.ts.map +1 -1
  356. package/dist/src/cli/connect/mcp/tools/organisms.js +101 -2
  357. package/dist/src/cli/connect/mcp/tools/organisms.js.map +1 -1
  358. package/dist/src/cli/connect/mcp/tools/workflows.d.ts +1 -0
  359. package/dist/src/cli/connect/mcp/tools/workflows.d.ts.map +1 -1
  360. package/dist/src/cli/connect/mcp/tools/workflows.js +13 -0
  361. package/dist/src/cli/connect/mcp/tools/workflows.js.map +1 -1
  362. package/dist/src/cli/connect/tool-call-defs-agent.d.ts +6 -0
  363. package/dist/src/cli/connect/tool-call-defs-agent.d.ts.map +1 -1
  364. package/dist/src/cli/connect/tool-call-defs-agent.js +126 -0
  365. package/dist/src/cli/connect/tool-call-defs-agent.js.map +1 -1
  366. package/dist/src/cli/connect/tool-call-defs-apps.d.ts +4 -0
  367. package/dist/src/cli/connect/tool-call-defs-apps.d.ts.map +1 -1
  368. package/dist/src/cli/connect/tool-call-defs-apps.js +379 -1
  369. package/dist/src/cli/connect/tool-call-defs-apps.js.map +1 -1
  370. package/dist/src/cli/connect/tool-call-defs-exchange.d.ts +3 -0
  371. package/dist/src/cli/connect/tool-call-defs-exchange.d.ts.map +1 -0
  372. package/dist/src/cli/connect/tool-call-defs-exchange.js +146 -0
  373. package/dist/src/cli/connect/tool-call-defs-exchange.js.map +1 -0
  374. package/dist/src/cli/connect/tool-call-defs-organism.d.ts.map +1 -1
  375. package/dist/src/cli/connect/tool-call-defs-organism.js +46 -1
  376. package/dist/src/cli/connect/tool-call-defs-organism.js.map +1 -1
  377. package/dist/src/cli/connect/tool-call.d.ts.map +1 -1
  378. package/dist/src/cli/connect/tool-call.js +2 -0
  379. package/dist/src/cli/connect/tool-call.js.map +1 -1
  380. package/dist/src/cli/init-wizard/generate.js +2 -2
  381. package/dist/src/cli/init-wizard/generate.js.map +1 -1
  382. package/dist/src/cli/init-wizard/helpers.d.ts +1 -1
  383. package/dist/src/cli/init-wizard/helpers.d.ts.map +1 -1
  384. package/dist/src/cli/init-wizard/helpers.js +2 -5
  385. package/dist/src/cli/init-wizard/helpers.js.map +1 -1
  386. package/dist/src/cli/init-wizard/presets.d.ts.map +1 -1
  387. package/dist/src/cli/init-wizard/presets.js +0 -1
  388. package/dist/src/cli/init-wizard/presets.js.map +1 -1
  389. package/dist/src/cli/init-wizard/steps-core.d.ts.map +1 -1
  390. package/dist/src/cli/init-wizard/steps-core.js +7 -11
  391. package/dist/src/cli/init-wizard/steps-core.js.map +1 -1
  392. package/dist/src/commerce/sellable-resolvers.d.ts +11 -1
  393. package/dist/src/commerce/sellable-resolvers.d.ts.map +1 -1
  394. package/dist/src/commerce/sellable-resolvers.js +55 -0
  395. package/dist/src/commerce/sellable-resolvers.js.map +1 -1
  396. package/dist/src/commerce/session-service.d.ts +14 -0
  397. package/dist/src/commerce/session-service.d.ts.map +1 -1
  398. package/dist/src/commerce/session-service.js +1 -1
  399. package/dist/src/commerce/session-service.js.map +1 -1
  400. package/dist/src/commerce/test-money-handler.d.ts +5 -0
  401. package/dist/src/commerce/test-money-handler.d.ts.map +1 -0
  402. package/dist/src/commerce/test-money-handler.js +27 -0
  403. package/dist/src/commerce/test-money-handler.js.map +1 -0
  404. package/dist/src/commerce/x402-facilitator.d.ts +113 -0
  405. package/dist/src/commerce/x402-facilitator.d.ts.map +1 -0
  406. package/dist/src/commerce/x402-facilitator.js +143 -0
  407. package/dist/src/commerce/x402-facilitator.js.map +1 -0
  408. package/dist/src/commerce/x402-handler.d.ts +35 -0
  409. package/dist/src/commerce/x402-handler.d.ts.map +1 -0
  410. package/dist/src/commerce/x402-handler.js +54 -0
  411. package/dist/src/commerce/x402-handler.js.map +1 -0
  412. package/dist/src/commerce/x402.d.ts +32 -8
  413. package/dist/src/commerce/x402.d.ts.map +1 -1
  414. package/dist/src/commerce/x402.js +41 -9
  415. package/dist/src/commerce/x402.js.map +1 -1
  416. package/dist/src/config-types.d.ts +21 -2
  417. package/dist/src/config-types.d.ts.map +1 -1
  418. package/dist/src/config.d.ts.map +1 -1
  419. package/dist/src/config.js +27 -5
  420. package/dist/src/config.js.map +1 -1
  421. package/dist/src/data/app-templates/components.d.ts +13 -1
  422. package/dist/src/data/app-templates/components.d.ts.map +1 -1
  423. package/dist/src/data/app-templates/components.js +149 -1
  424. package/dist/src/data/app-templates/components.js.map +1 -1
  425. package/dist/src/data/app-templates/shells.d.ts +7 -3
  426. package/dist/src/data/app-templates/shells.d.ts.map +1 -1
  427. package/dist/src/data/app-templates/shells.js +10 -6
  428. package/dist/src/data/app-templates/shells.js.map +1 -1
  429. package/dist/src/data/app-templates.d.ts +13 -0
  430. package/dist/src/data/app-templates.d.ts.map +1 -1
  431. package/dist/src/data/app-templates.js +39 -1
  432. package/dist/src/data/app-templates.js.map +1 -1
  433. package/dist/src/data/appdev-pitfalls.d.ts +58 -0
  434. package/dist/src/data/appdev-pitfalls.d.ts.map +1 -0
  435. package/dist/src/data/appdev-pitfalls.js +365 -0
  436. package/dist/src/data/appdev-pitfalls.js.map +1 -0
  437. package/dist/src/data/builtin-skills.d.ts +6 -0
  438. package/dist/src/data/builtin-skills.d.ts.map +1 -1
  439. package/dist/src/data/builtin-skills.js +151 -0
  440. package/dist/src/data/builtin-skills.js.map +1 -1
  441. package/dist/src/data/library-packs/cortex.d.ts +18 -0
  442. package/dist/src/data/library-packs/cortex.d.ts.map +1 -0
  443. package/dist/src/data/library-packs/cortex.js +339 -0
  444. package/dist/src/data/library-packs/cortex.js.map +1 -0
  445. package/dist/src/data/library-packs/sdk.d.ts +16 -0
  446. package/dist/src/data/library-packs/sdk.d.ts.map +1 -0
  447. package/dist/src/data/library-packs/sdk.js +439 -0
  448. package/dist/src/data/library-packs/sdk.js.map +1 -0
  449. package/dist/src/data/library-packs/vendored.d.ts +21 -0
  450. package/dist/src/data/library-packs/vendored.d.ts.map +1 -0
  451. package/dist/src/data/library-packs/vendored.js +381 -0
  452. package/dist/src/data/library-packs/vendored.js.map +1 -0
  453. package/dist/src/data/library-packs.d.ts +151 -0
  454. package/dist/src/data/library-packs.d.ts.map +1 -0
  455. package/dist/src/data/library-packs.js +169 -0
  456. package/dist/src/data/library-packs.js.map +1 -0
  457. package/dist/src/generated/api-types.d.ts +30401 -17751
  458. package/dist/src/generated/api-types.d.ts.map +1 -1
  459. package/dist/src/index-help.d.ts +1 -1
  460. package/dist/src/index-help.d.ts.map +1 -1
  461. package/dist/src/index-help.js +3 -3
  462. package/dist/src/mcp/agent-onboarding.d.ts.map +1 -1
  463. package/dist/src/mcp/agent-onboarding.js +8 -2
  464. package/dist/src/mcp/agent-onboarding.js.map +1 -1
  465. package/dist/src/mcp/annotations.d.ts +1 -0
  466. package/dist/src/mcp/annotations.d.ts.map +1 -1
  467. package/dist/src/mcp/annotations.js +44 -0
  468. package/dist/src/mcp/annotations.js.map +1 -1
  469. package/dist/src/mcp/app-template-proposals.d.ts +17 -0
  470. package/dist/src/mcp/app-template-proposals.d.ts.map +1 -0
  471. package/dist/src/mcp/app-template-proposals.js +94 -0
  472. package/dist/src/mcp/app-template-proposals.js.map +1 -0
  473. package/dist/src/mcp/appdev-pitfalls.d.ts +22 -0
  474. package/dist/src/mcp/appdev-pitfalls.d.ts.map +1 -0
  475. package/dist/src/mcp/appdev-pitfalls.js +208 -0
  476. package/dist/src/mcp/appdev-pitfalls.js.map +1 -0
  477. package/dist/src/mcp/appdev-proofs.d.ts +21 -0
  478. package/dist/src/mcp/appdev-proofs.d.ts.map +1 -0
  479. package/dist/src/mcp/appdev-proofs.js +103 -0
  480. package/dist/src/mcp/appdev-proofs.js.map +1 -0
  481. package/dist/src/mcp/appdev-research.d.ts +17 -0
  482. package/dist/src/mcp/appdev-research.d.ts.map +1 -0
  483. package/dist/src/mcp/appdev-research.js +27 -0
  484. package/dist/src/mcp/appdev-research.js.map +1 -0
  485. package/dist/src/mcp/apps.d.ts +6 -0
  486. package/dist/src/mcp/apps.d.ts.map +1 -1
  487. package/dist/src/mcp/apps.js +64 -5
  488. package/dist/src/mcp/apps.js.map +1 -1
  489. package/dist/src/mcp/catalog/definitions/agent-messaging.d.ts.map +1 -1
  490. package/dist/src/mcp/catalog/definitions/agent-messaging.js +38 -0
  491. package/dist/src/mcp/catalog/definitions/agent-messaging.js.map +1 -1
  492. package/dist/src/mcp/catalog/definitions/capabilities-groups-skills.d.ts +2 -0
  493. package/dist/src/mcp/catalog/definitions/capabilities-groups-skills.d.ts.map +1 -1
  494. package/dist/src/mcp/catalog/definitions/capabilities-groups-skills.js +139 -5
  495. package/dist/src/mcp/catalog/definitions/capabilities-groups-skills.js.map +1 -1
  496. package/dist/src/mcp/catalog/definitions/exchange.d.ts +18 -0
  497. package/dist/src/mcp/catalog/definitions/exchange.d.ts.map +1 -0
  498. package/dist/src/mcp/catalog/definitions/exchange.js +182 -0
  499. package/dist/src/mcp/catalog/definitions/exchange.js.map +1 -0
  500. package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.d.ts.map +1 -1
  501. package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.js +41 -3
  502. package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.js.map +1 -1
  503. package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.d.ts.map +1 -1
  504. package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.js +20 -0
  505. package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.js.map +1 -1
  506. package/dist/src/mcp/catalog/definitions.d.ts.map +1 -1
  507. package/dist/src/mcp/catalog/definitions.js +2 -0
  508. package/dist/src/mcp/catalog/definitions.js.map +1 -1
  509. package/dist/src/mcp/catalog/scopes.d.ts +1 -0
  510. package/dist/src/mcp/catalog/scopes.d.ts.map +1 -1
  511. package/dist/src/mcp/catalog/scopes.js +40 -0
  512. package/dist/src/mcp/catalog/scopes.js.map +1 -1
  513. package/dist/src/mcp/catalog/surfaces.d.ts.map +1 -1
  514. package/dist/src/mcp/catalog/surfaces.js +31 -4
  515. package/dist/src/mcp/catalog/surfaces.js.map +1 -1
  516. package/dist/src/mcp/catalogue.d.ts +1 -0
  517. package/dist/src/mcp/catalogue.d.ts.map +1 -1
  518. package/dist/src/mcp/catalogue.js +10 -2
  519. package/dist/src/mcp/catalogue.js.map +1 -1
  520. package/dist/src/mcp/commerce.js +1 -1
  521. package/dist/src/mcp/commerce.js.map +1 -1
  522. package/dist/src/mcp/contacts.d.ts +19 -0
  523. package/dist/src/mcp/contacts.d.ts.map +1 -0
  524. package/dist/src/mcp/contacts.js +58 -0
  525. package/dist/src/mcp/contacts.js.map +1 -0
  526. package/dist/src/mcp/core-admin.js +1 -1
  527. package/dist/src/mcp/core-admin.js.map +1 -1
  528. package/dist/src/mcp/exchange-run.d.ts +5 -0
  529. package/dist/src/mcp/exchange-run.d.ts.map +1 -0
  530. package/dist/src/mcp/exchange-run.js +226 -0
  531. package/dist/src/mcp/exchange-run.js.map +1 -0
  532. package/dist/src/mcp/exchange.d.ts +5 -0
  533. package/dist/src/mcp/exchange.d.ts.map +1 -0
  534. package/dist/src/mcp/exchange.js +351 -0
  535. package/dist/src/mcp/exchange.js.map +1 -0
  536. package/dist/src/mcp/extensions.d.ts +4 -0
  537. package/dist/src/mcp/extensions.d.ts.map +1 -1
  538. package/dist/src/mcp/extensions.js +85 -12
  539. package/dist/src/mcp/extensions.js.map +1 -1
  540. package/dist/src/mcp/feedback.d.ts +20 -0
  541. package/dist/src/mcp/feedback.d.ts.map +1 -0
  542. package/dist/src/mcp/feedback.js +61 -0
  543. package/dist/src/mcp/feedback.js.map +1 -0
  544. package/dist/src/mcp/index.d.ts +1 -0
  545. package/dist/src/mcp/index.d.ts.map +1 -1
  546. package/dist/src/mcp/index.js +19 -2
  547. package/dist/src/mcp/index.js.map +1 -1
  548. package/dist/src/mcp/knowledge.d.ts +4 -0
  549. package/dist/src/mcp/knowledge.d.ts.map +1 -1
  550. package/dist/src/mcp/knowledge.js +39 -22
  551. package/dist/src/mcp/knowledge.js.map +1 -1
  552. package/dist/src/mcp/organisms-name-invites.d.ts +18 -0
  553. package/dist/src/mcp/organisms-name-invites.d.ts.map +1 -0
  554. package/dist/src/mcp/organisms-name-invites.js +143 -0
  555. package/dist/src/mcp/organisms-name-invites.js.map +1 -0
  556. package/dist/src/mcp/organisms.d.ts +3 -0
  557. package/dist/src/mcp/organisms.d.ts.map +1 -1
  558. package/dist/src/mcp/organisms.js +12 -86
  559. package/dist/src/mcp/organisms.js.map +1 -1
  560. package/dist/src/mcp/workflows.d.ts +2 -0
  561. package/dist/src/mcp/workflows.d.ts.map +1 -1
  562. package/dist/src/mcp/workflows.js +43 -3
  563. package/dist/src/mcp/workflows.js.map +1 -1
  564. package/dist/src/mcp/workspaces.d.ts +4 -0
  565. package/dist/src/mcp/workspaces.d.ts.map +1 -1
  566. package/dist/src/mcp/workspaces.js +15 -12
  567. package/dist/src/mcp/workspaces.js.map +1 -1
  568. package/dist/src/middleware/workspace-access.d.ts +3 -0
  569. package/dist/src/middleware/workspace-access.d.ts.map +1 -1
  570. package/dist/src/middleware/workspace-access.js +7 -3
  571. package/dist/src/middleware/workspace-access.js.map +1 -1
  572. package/dist/src/models/agent-onboarding-schemas.d.ts +2 -0
  573. package/dist/src/models/agent-onboarding-schemas.d.ts.map +1 -1
  574. package/dist/src/models/agent-onboarding-schemas.js +5 -0
  575. package/dist/src/models/agent-onboarding-schemas.js.map +1 -1
  576. package/dist/src/models/app-tool-schemas.d.ts +55 -1
  577. package/dist/src/models/app-tool-schemas.d.ts.map +1 -1
  578. package/dist/src/models/app-tool-schemas.js +20 -1
  579. package/dist/src/models/app-tool-schemas.js.map +1 -1
  580. package/dist/src/models/contribution-proof.d.ts +29 -0
  581. package/dist/src/models/contribution-proof.d.ts.map +1 -0
  582. package/dist/src/models/contribution-proof.js +23 -0
  583. package/dist/src/models/contribution-proof.js.map +1 -0
  584. package/dist/src/models/crew-def-schemas.d.ts +114 -0
  585. package/dist/src/models/crew-def-schemas.d.ts.map +1 -0
  586. package/dist/src/models/crew-def-schemas.js +140 -0
  587. package/dist/src/models/crew-def-schemas.js.map +1 -0
  588. package/dist/src/models/offer-schemas.d.ts +2 -2
  589. package/dist/src/models/schemas.d.ts +1 -0
  590. package/dist/src/models/schemas.d.ts.map +1 -1
  591. package/dist/src/models/schemas.js +3 -0
  592. package/dist/src/models/schemas.js.map +1 -1
  593. package/dist/src/models/workflow-schemas.d.ts +69 -1
  594. package/dist/src/models/workflow-schemas.d.ts.map +1 -1
  595. package/dist/src/models/workflow-schemas.js +26 -0
  596. package/dist/src/models/workflow-schemas.js.map +1 -1
  597. package/dist/src/routes/access-tokens.d.ts +2 -0
  598. package/dist/src/routes/access-tokens.d.ts.map +1 -1
  599. package/dist/src/routes/access-tokens.js +15 -0
  600. package/dist/src/routes/access-tokens.js.map +1 -1
  601. package/dist/src/routes/admin-config.js +1 -1
  602. package/dist/src/routes/admin-config.js.map +1 -1
  603. package/dist/src/routes/admin-maintenance.d.ts +3 -0
  604. package/dist/src/routes/admin-maintenance.d.ts.map +1 -1
  605. package/dist/src/routes/admin-maintenance.js +20 -0
  606. package/dist/src/routes/admin-maintenance.js.map +1 -1
  607. package/dist/src/routes/admin-storage-stats.d.ts +17 -0
  608. package/dist/src/routes/admin-storage-stats.d.ts.map +1 -0
  609. package/dist/src/routes/admin-storage-stats.js +56 -0
  610. package/dist/src/routes/admin-storage-stats.js.map +1 -0
  611. package/dist/src/routes/admin.d.ts +1 -0
  612. package/dist/src/routes/admin.d.ts.map +1 -1
  613. package/dist/src/routes/admin.js +10 -12
  614. package/dist/src/routes/admin.js.map +1 -1
  615. package/dist/src/routes/agent-activity.d.ts +6 -0
  616. package/dist/src/routes/agent-activity.d.ts.map +1 -1
  617. package/dist/src/routes/agent-activity.js +57 -0
  618. package/dist/src/routes/agent-activity.js.map +1 -1
  619. package/dist/src/routes/agent-directives.d.ts.map +1 -1
  620. package/dist/src/routes/agent-directives.js +30 -0
  621. package/dist/src/routes/agent-directives.js.map +1 -1
  622. package/dist/src/routes/agent-messages.d.ts +2 -0
  623. package/dist/src/routes/agent-messages.d.ts.map +1 -1
  624. package/dist/src/routes/agent-messages.js +18 -0
  625. package/dist/src/routes/agent-messages.js.map +1 -1
  626. package/dist/src/routes/agent-onboarding.d.ts +16 -0
  627. package/dist/src/routes/agent-onboarding.d.ts.map +1 -1
  628. package/dist/src/routes/agent-onboarding.js +6 -1
  629. package/dist/src/routes/agent-onboarding.js.map +1 -1
  630. package/dist/src/routes/agent-webhook.d.ts +3 -0
  631. package/dist/src/routes/agent-webhook.d.ts.map +1 -1
  632. package/dist/src/routes/agent-webhook.js +28 -0
  633. package/dist/src/routes/agent-webhook.js.map +1 -1
  634. package/dist/src/routes/agents/device-auth.d.ts +10 -0
  635. package/dist/src/routes/agents/device-auth.d.ts.map +1 -1
  636. package/dist/src/routes/agents/device-auth.js +241 -139
  637. package/dist/src/routes/agents/device-auth.js.map +1 -1
  638. package/dist/src/routes/agents/offers.d.ts +4 -0
  639. package/dist/src/routes/agents/offers.d.ts.map +1 -1
  640. package/dist/src/routes/agents/offers.js +0 -0
  641. package/dist/src/routes/agents/offers.js.map +1 -1
  642. package/dist/src/routes/agents/profile-metadata.d.ts +3 -0
  643. package/dist/src/routes/agents/profile-metadata.d.ts.map +1 -1
  644. package/dist/src/routes/agents/profile-metadata.js +23 -10
  645. package/dist/src/routes/agents/profile-metadata.js.map +1 -1
  646. package/dist/src/routes/app-grants.d.ts +6 -0
  647. package/dist/src/routes/app-grants.d.ts.map +1 -1
  648. package/dist/src/routes/app-grants.js +37 -2
  649. package/dist/src/routes/app-grants.js.map +1 -1
  650. package/dist/src/routes/appdev-overview.d.ts +17 -0
  651. package/dist/src/routes/appdev-overview.d.ts.map +1 -0
  652. package/dist/src/routes/appdev-overview.js +75 -0
  653. package/dist/src/routes/appdev-overview.js.map +1 -0
  654. package/dist/src/routes/appdev-pitfalls.d.ts +20 -0
  655. package/dist/src/routes/appdev-pitfalls.d.ts.map +1 -0
  656. package/dist/src/routes/appdev-pitfalls.js +103 -0
  657. package/dist/src/routes/appdev-pitfalls.js.map +1 -0
  658. package/dist/src/routes/appeals.d.ts +1 -0
  659. package/dist/src/routes/appeals.d.ts.map +1 -1
  660. package/dist/src/routes/appeals.js +3 -1
  661. package/dist/src/routes/appeals.js.map +1 -1
  662. package/dist/src/routes/apps/agents-deploy.d.ts +24 -0
  663. package/dist/src/routes/apps/agents-deploy.d.ts.map +1 -0
  664. package/dist/src/routes/apps/agents-deploy.js +214 -0
  665. package/dist/src/routes/apps/agents-deploy.js.map +1 -0
  666. package/dist/src/routes/apps/catalogue-admin.d.ts +5 -0
  667. package/dist/src/routes/apps/catalogue-admin.d.ts.map +1 -1
  668. package/dist/src/routes/apps/catalogue-admin.js +34 -10
  669. package/dist/src/routes/apps/catalogue-admin.js.map +1 -1
  670. package/dist/src/routes/apps/drafts.d.ts +2 -0
  671. package/dist/src/routes/apps/drafts.d.ts.map +1 -1
  672. package/dist/src/routes/apps/drafts.js +4 -0
  673. package/dist/src/routes/apps/drafts.js.map +1 -1
  674. package/dist/src/routes/apps/fork-manage.d.ts +3 -1
  675. package/dist/src/routes/apps/fork-manage.d.ts.map +1 -1
  676. package/dist/src/routes/apps/fork-manage.js +50 -1
  677. package/dist/src/routes/apps/fork-manage.js.map +1 -1
  678. package/dist/src/routes/apps/publish.d.ts +7 -0
  679. package/dist/src/routes/apps/publish.d.ts.map +1 -1
  680. package/dist/src/routes/apps/publish.js +69 -1
  681. package/dist/src/routes/apps/publish.js.map +1 -1
  682. package/dist/src/routes/apps-cost.d.ts +25 -0
  683. package/dist/src/routes/apps-cost.d.ts.map +1 -0
  684. package/dist/src/routes/apps-cost.js +107 -0
  685. package/dist/src/routes/apps-cost.js.map +1 -0
  686. package/dist/src/routes/apps.d.ts +2 -0
  687. package/dist/src/routes/apps.d.ts.map +1 -1
  688. package/dist/src/routes/apps.js +4 -0
  689. package/dist/src/routes/apps.js.map +1 -1
  690. package/dist/src/routes/auth.d.ts +2 -0
  691. package/dist/src/routes/auth.d.ts.map +1 -1
  692. package/dist/src/routes/auth.js +11 -0
  693. package/dist/src/routes/auth.js.map +1 -1
  694. package/dist/src/routes/bootstrap.d.ts +5 -0
  695. package/dist/src/routes/bootstrap.d.ts.map +1 -1
  696. package/dist/src/routes/bootstrap.js +21 -14
  697. package/dist/src/routes/bootstrap.js.map +1 -1
  698. package/dist/src/routes/calibrator.d.ts +2 -0
  699. package/dist/src/routes/calibrator.d.ts.map +1 -1
  700. package/dist/src/routes/calibrator.js +43 -0
  701. package/dist/src/routes/calibrator.js.map +1 -1
  702. package/dist/src/routes/catalogue.d.ts +2 -0
  703. package/dist/src/routes/catalogue.d.ts.map +1 -1
  704. package/dist/src/routes/catalogue.js +20 -30
  705. package/dist/src/routes/catalogue.js.map +1 -1
  706. package/dist/src/routes/commerce.d.ts.map +1 -1
  707. package/dist/src/routes/commerce.js +18 -8
  708. package/dist/src/routes/commerce.js.map +1 -1
  709. package/dist/src/routes/consent.d.ts.map +1 -1
  710. package/dist/src/routes/consent.js +10 -0
  711. package/dist/src/routes/consent.js.map +1 -1
  712. package/dist/src/routes/contacts.d.ts +20 -0
  713. package/dist/src/routes/contacts.d.ts.map +1 -0
  714. package/dist/src/routes/contacts.js +86 -0
  715. package/dist/src/routes/contacts.js.map +1 -0
  716. package/dist/src/routes/ecosystem-apps.d.ts +2 -0
  717. package/dist/src/routes/ecosystem-apps.d.ts.map +1 -1
  718. package/dist/src/routes/ecosystem-apps.js +34 -0
  719. package/dist/src/routes/ecosystem-apps.js.map +1 -1
  720. package/dist/src/routes/exchange-market.d.ts +28 -0
  721. package/dist/src/routes/exchange-market.d.ts.map +1 -0
  722. package/dist/src/routes/exchange-market.js +454 -0
  723. package/dist/src/routes/exchange-market.js.map +1 -0
  724. package/dist/src/routes/exchange.d.ts +33 -0
  725. package/dist/src/routes/exchange.d.ts.map +1 -0
  726. package/dist/src/routes/exchange.js +395 -0
  727. package/dist/src/routes/exchange.js.map +1 -0
  728. package/dist/src/routes/extensions/actions.d.ts +3 -0
  729. package/dist/src/routes/extensions/actions.d.ts.map +1 -1
  730. package/dist/src/routes/extensions/actions.js +43 -6
  731. package/dist/src/routes/extensions/actions.js.map +1 -1
  732. package/dist/src/routes/extensions/entitlement-gate.d.ts +33 -0
  733. package/dist/src/routes/extensions/entitlement-gate.d.ts.map +1 -0
  734. package/dist/src/routes/extensions/entitlement-gate.js +143 -0
  735. package/dist/src/routes/extensions/entitlement-gate.js.map +1 -0
  736. package/dist/src/routes/extensions/manifest.d.ts +11 -0
  737. package/dist/src/routes/extensions/manifest.d.ts.map +1 -1
  738. package/dist/src/routes/extensions/manifest.js +100 -8
  739. package/dist/src/routes/extensions/manifest.js.map +1 -1
  740. package/dist/src/routes/extensions/paywall.d.ts +30 -0
  741. package/dist/src/routes/extensions/paywall.d.ts.map +1 -0
  742. package/dist/src/routes/extensions/paywall.js +116 -0
  743. package/dist/src/routes/extensions/paywall.js.map +1 -0
  744. package/dist/src/routes/federation-sync/messaging.d.ts.map +1 -1
  745. package/dist/src/routes/federation-sync/messaging.js +7 -1
  746. package/dist/src/routes/federation-sync/messaging.js.map +1 -1
  747. package/dist/src/routes/feedback.d.ts +23 -0
  748. package/dist/src/routes/feedback.d.ts.map +1 -0
  749. package/dist/src/routes/feedback.js +111 -0
  750. package/dist/src/routes/feedback.js.map +1 -0
  751. package/dist/src/routes/generator/projects.d.ts.map +1 -1
  752. package/dist/src/routes/generator/projects.js +18 -0
  753. package/dist/src/routes/generator/projects.js.map +1 -1
  754. package/dist/src/routes/generator/prompts.d.ts +14 -3
  755. package/dist/src/routes/generator/prompts.d.ts.map +1 -1
  756. package/dist/src/routes/generator/prompts.js +165 -90
  757. package/dist/src/routes/generator/prompts.js.map +1 -1
  758. package/dist/src/routes/generator.d.ts +2 -0
  759. package/dist/src/routes/generator.d.ts.map +1 -1
  760. package/dist/src/routes/generator.js +2 -0
  761. package/dist/src/routes/generator.js.map +1 -1
  762. package/dist/src/routes/ghii/profile.d.ts +2 -0
  763. package/dist/src/routes/ghii/profile.d.ts.map +1 -1
  764. package/dist/src/routes/ghii/profile.js +16 -11
  765. package/dist/src/routes/ghii/profile.js.map +1 -1
  766. package/dist/src/routes/ghii/recovery.d.ts +2 -0
  767. package/dist/src/routes/ghii/recovery.d.ts.map +1 -1
  768. package/dist/src/routes/ghii/recovery.js +7 -0
  769. package/dist/src/routes/ghii/recovery.js.map +1 -1
  770. package/dist/src/routes/ghii/register-login.d.ts +4 -0
  771. package/dist/src/routes/ghii/register-login.d.ts.map +1 -1
  772. package/dist/src/routes/ghii/register-login.js +45 -22
  773. package/dist/src/routes/ghii/register-login.js.map +1 -1
  774. package/dist/src/routes/ghii/web-verify.d.ts +5 -0
  775. package/dist/src/routes/ghii/web-verify.d.ts.map +1 -1
  776. package/dist/src/routes/ghii/web-verify.js +24 -3
  777. package/dist/src/routes/ghii/web-verify.js.map +1 -1
  778. package/dist/src/routes/knowledge/admin.d.ts +1 -0
  779. package/dist/src/routes/knowledge/admin.d.ts.map +1 -1
  780. package/dist/src/routes/knowledge/admin.js +30 -40
  781. package/dist/src/routes/knowledge/admin.js.map +1 -1
  782. package/dist/src/routes/knowledge/helpers.d.ts +1 -0
  783. package/dist/src/routes/knowledge/helpers.d.ts.map +1 -1
  784. package/dist/src/routes/knowledge/helpers.js +5 -1
  785. package/dist/src/routes/knowledge/helpers.js.map +1 -1
  786. package/dist/src/routes/knowledge/organism.d.ts +1 -0
  787. package/dist/src/routes/knowledge/organism.d.ts.map +1 -1
  788. package/dist/src/routes/knowledge/organism.js +7 -11
  789. package/dist/src/routes/knowledge/organism.js.map +1 -1
  790. package/dist/src/routes/knowledge/packages-core.d.ts +1 -0
  791. package/dist/src/routes/knowledge/packages-core.d.ts.map +1 -1
  792. package/dist/src/routes/knowledge/packages-core.js +6 -16
  793. package/dist/src/routes/knowledge/packages-core.js.map +1 -1
  794. package/dist/src/routes/knowledge/sharing.d.ts +1 -0
  795. package/dist/src/routes/knowledge/sharing.d.ts.map +1 -1
  796. package/dist/src/routes/knowledge/sharing.js +11 -31
  797. package/dist/src/routes/knowledge/sharing.js.map +1 -1
  798. package/dist/src/routes/knowledge.d.ts +2 -0
  799. package/dist/src/routes/knowledge.d.ts.map +1 -1
  800. package/dist/src/routes/knowledge.js +15 -0
  801. package/dist/src/routes/knowledge.js.map +1 -1
  802. package/dist/src/routes/ledger.d.ts +4 -0
  803. package/dist/src/routes/ledger.d.ts.map +1 -1
  804. package/dist/src/routes/ledger.js +93 -53
  805. package/dist/src/routes/ledger.js.map +1 -1
  806. package/dist/src/routes/lib-data.d.ts +2 -0
  807. package/dist/src/routes/lib-data.d.ts.map +1 -1
  808. package/dist/src/routes/lib-data.js +7 -4
  809. package/dist/src/routes/lib-data.js.map +1 -1
  810. package/dist/src/routes/lib-intake.d.ts +21 -0
  811. package/dist/src/routes/lib-intake.d.ts.map +1 -0
  812. package/dist/src/routes/lib-intake.js +63 -0
  813. package/dist/src/routes/lib-intake.js.map +1 -0
  814. package/dist/src/routes/lib-organism.d.ts +13 -0
  815. package/dist/src/routes/lib-organism.d.ts.map +1 -1
  816. package/dist/src/routes/lib-organism.js +80 -0
  817. package/dist/src/routes/lib-organism.js.map +1 -1
  818. package/dist/src/routes/lib-workflows.d.ts +24 -0
  819. package/dist/src/routes/lib-workflows.d.ts.map +1 -0
  820. package/dist/src/routes/lib-workflows.js +125 -0
  821. package/dist/src/routes/lib-workflows.js.map +1 -0
  822. package/dist/src/routes/library-packs.d.ts +31 -0
  823. package/dist/src/routes/library-packs.d.ts.map +1 -0
  824. package/dist/src/routes/library-packs.js +187 -0
  825. package/dist/src/routes/library-packs.js.map +1 -0
  826. package/dist/src/routes/libs/audio-lib-part2.d.ts +2 -0
  827. package/dist/src/routes/libs/audio-lib-part2.d.ts.map +1 -1
  828. package/dist/src/routes/libs/audio-lib-part2.js +4 -0
  829. package/dist/src/routes/libs/audio-lib-part2.js.map +1 -1
  830. package/dist/src/routes/libs/auth-lib-part2.d.ts +5 -0
  831. package/dist/src/routes/libs/auth-lib-part2.d.ts.map +1 -1
  832. package/dist/src/routes/libs/auth-lib-part2.js +118 -5
  833. package/dist/src/routes/libs/auth-lib-part2.js.map +1 -1
  834. package/dist/src/routes/libs/sdk-serve.d.ts +11 -0
  835. package/dist/src/routes/libs/sdk-serve.d.ts.map +1 -0
  836. package/dist/src/routes/libs/sdk-serve.js +53 -0
  837. package/dist/src/routes/libs/sdk-serve.js.map +1 -0
  838. package/dist/src/routes/libs.d.ts +17 -1
  839. package/dist/src/routes/libs.d.ts.map +1 -1
  840. package/dist/src/routes/libs.js +83 -285
  841. package/dist/src/routes/libs.js.map +1 -1
  842. package/dist/src/routes/living.d.ts +2 -0
  843. package/dist/src/routes/living.d.ts.map +1 -1
  844. package/dist/src/routes/living.js +12 -0
  845. package/dist/src/routes/living.js.map +1 -1
  846. package/dist/src/routes/matches.d.ts +3 -0
  847. package/dist/src/routes/matches.d.ts.map +1 -1
  848. package/dist/src/routes/matches.js +47 -51
  849. package/dist/src/routes/matches.js.map +1 -1
  850. package/dist/src/routes/memory/bulk.d.ts.map +1 -1
  851. package/dist/src/routes/memory/bulk.js +185 -70
  852. package/dist/src/routes/memory/bulk.js.map +1 -1
  853. package/dist/src/routes/memory/crud.d.ts +2 -0
  854. package/dist/src/routes/memory/crud.d.ts.map +1 -1
  855. package/dist/src/routes/memory/crud.js +70 -39
  856. package/dist/src/routes/memory/crud.js.map +1 -1
  857. package/dist/src/routes/memory/key.d.ts +2 -0
  858. package/dist/src/routes/memory/key.d.ts.map +1 -1
  859. package/dist/src/routes/memory/key.js +23 -4
  860. package/dist/src/routes/memory/key.js.map +1 -1
  861. package/dist/src/routes/memory/shared.d.ts +4 -0
  862. package/dist/src/routes/memory/shared.d.ts.map +1 -1
  863. package/dist/src/routes/memory/shared.js.map +1 -1
  864. package/dist/src/routes/memory.d.ts.map +1 -1
  865. package/dist/src/routes/memory.js +29 -1
  866. package/dist/src/routes/memory.js.map +1 -1
  867. package/dist/src/routes/messages.d.ts +9 -0
  868. package/dist/src/routes/messages.d.ts.map +1 -1
  869. package/dist/src/routes/messages.js +48 -26
  870. package/dist/src/routes/messages.js.map +1 -1
  871. package/dist/src/routes/notifications.d.ts +8 -3
  872. package/dist/src/routes/notifications.d.ts.map +1 -1
  873. package/dist/src/routes/notifications.js +53 -5
  874. package/dist/src/routes/notifications.js.map +1 -1
  875. package/dist/src/routes/organisms/crud.d.ts +6 -0
  876. package/dist/src/routes/organisms/crud.d.ts.map +1 -1
  877. package/dist/src/routes/organisms/crud.js +80 -62
  878. package/dist/src/routes/organisms/crud.js.map +1 -1
  879. package/dist/src/routes/organisms/gates.d.ts.map +1 -1
  880. package/dist/src/routes/organisms/gates.js +82 -1
  881. package/dist/src/routes/organisms/gates.js.map +1 -1
  882. package/dist/src/routes/organisms/intake.d.ts +29 -0
  883. package/dist/src/routes/organisms/intake.d.ts.map +1 -0
  884. package/dist/src/routes/organisms/intake.js +251 -0
  885. package/dist/src/routes/organisms/intake.js.map +1 -0
  886. package/dist/src/routes/organisms/membership.d.ts +4 -1
  887. package/dist/src/routes/organisms/membership.d.ts.map +1 -1
  888. package/dist/src/routes/organisms/membership.js +103 -60
  889. package/dist/src/routes/organisms/membership.js.map +1 -1
  890. package/dist/src/routes/organisms/shared.d.ts +28 -0
  891. package/dist/src/routes/organisms/shared.d.ts.map +1 -1
  892. package/dist/src/routes/organisms/shared.js +339 -26
  893. package/dist/src/routes/organisms/shared.js.map +1 -1
  894. package/dist/src/routes/organisms/workspace-access.d.ts +16 -0
  895. package/dist/src/routes/organisms/workspace-access.d.ts.map +1 -1
  896. package/dist/src/routes/organisms/workspace-access.js +174 -72
  897. package/dist/src/routes/organisms/workspace-access.js.map +1 -1
  898. package/dist/src/routes/organisms/workspace-ops.d.ts +6 -0
  899. package/dist/src/routes/organisms/workspace-ops.d.ts.map +1 -1
  900. package/dist/src/routes/organisms/workspace-ops.js +224 -11
  901. package/dist/src/routes/organisms/workspace-ops.js.map +1 -1
  902. package/dist/src/routes/organisms/workspace-read.d.ts +4 -0
  903. package/dist/src/routes/organisms/workspace-read.d.ts.map +1 -1
  904. package/dist/src/routes/organisms/workspace-read.js +14 -6
  905. package/dist/src/routes/organisms/workspace-read.js.map +1 -1
  906. package/dist/src/routes/organisms.d.ts.map +1 -1
  907. package/dist/src/routes/organisms.js +2 -0
  908. package/dist/src/routes/organisms.js.map +1 -1
  909. package/dist/src/routes/owners.d.ts +2 -0
  910. package/dist/src/routes/owners.d.ts.map +1 -1
  911. package/dist/src/routes/owners.js +17 -7
  912. package/dist/src/routes/owners.js.map +1 -1
  913. package/dist/src/routes/packages.d.ts.map +1 -1
  914. package/dist/src/routes/packages.js +10 -0
  915. package/dist/src/routes/packages.js.map +1 -1
  916. package/dist/src/routes/portal.d.ts +1 -1
  917. package/dist/src/routes/portal.d.ts.map +1 -1
  918. package/dist/src/routes/portal.js +3 -7
  919. package/dist/src/routes/portal.js.map +1 -1
  920. package/dist/src/routes/portfolio.d.ts +2 -0
  921. package/dist/src/routes/portfolio.d.ts.map +1 -1
  922. package/dist/src/routes/portfolio.js +41 -31
  923. package/dist/src/routes/portfolio.js.map +1 -1
  924. package/dist/src/routes/prompts.d.ts.map +1 -1
  925. package/dist/src/routes/prompts.js +23 -0
  926. package/dist/src/routes/prompts.js.map +1 -1
  927. package/dist/src/routes/schedules.d.ts +7 -0
  928. package/dist/src/routes/schedules.d.ts.map +1 -1
  929. package/dist/src/routes/schedules.js +102 -39
  930. package/dist/src/routes/schedules.js.map +1 -1
  931. package/dist/src/routes/unfurl.d.ts +27 -0
  932. package/dist/src/routes/unfurl.d.ts.map +1 -0
  933. package/dist/src/routes/unfurl.js +180 -0
  934. package/dist/src/routes/unfurl.js.map +1 -0
  935. package/dist/src/routes/upload.d.ts +6 -0
  936. package/dist/src/routes/upload.d.ts.map +1 -1
  937. package/dist/src/routes/upload.js +28 -1
  938. package/dist/src/routes/upload.js.map +1 -1
  939. package/dist/src/routes/usage.d.ts +9 -5
  940. package/dist/src/routes/usage.d.ts.map +1 -1
  941. package/dist/src/routes/usage.js +26 -5
  942. package/dist/src/routes/usage.js.map +1 -1
  943. package/dist/src/routes/wallet.d.ts +3 -0
  944. package/dist/src/routes/wallet.d.ts.map +1 -1
  945. package/dist/src/routes/wallet.js +17 -1
  946. package/dist/src/routes/wallet.js.map +1 -1
  947. package/dist/src/routes/webmcp.d.ts +3 -0
  948. package/dist/src/routes/webmcp.d.ts.map +1 -1
  949. package/dist/src/routes/webmcp.js +55 -0
  950. package/dist/src/routes/webmcp.js.map +1 -1
  951. package/dist/src/routes/work.d.ts.map +1 -1
  952. package/dist/src/routes/work.js +14 -9
  953. package/dist/src/routes/work.js.map +1 -1
  954. package/dist/src/routes/workflows.d.ts +4 -0
  955. package/dist/src/routes/workflows.d.ts.map +1 -1
  956. package/dist/src/routes/workflows.js +58 -1
  957. package/dist/src/routes/workflows.js.map +1 -1
  958. package/dist/src/server-bootstrap/config-init.d.ts.map +1 -1
  959. package/dist/src/server-bootstrap/config-init.js +7 -6
  960. package/dist/src/server-bootstrap/config-init.js.map +1 -1
  961. package/dist/src/server-bootstrap/routes-loader.d.ts +2 -0
  962. package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
  963. package/dist/src/server-bootstrap/routes-loader.js +35 -7
  964. package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
  965. package/dist/src/server.d.ts.map +1 -1
  966. package/dist/src/server.js +4 -0
  967. package/dist/src/server.js.map +1 -1
  968. package/dist/src/services/agent-face.d.ts +10 -2
  969. package/dist/src/services/agent-face.d.ts.map +1 -1
  970. package/dist/src/services/agent-face.js +10 -4
  971. package/dist/src/services/agent-face.js.map +1 -1
  972. package/dist/src/services/app-agent-deploy.d.ts +26 -0
  973. package/dist/src/services/app-agent-deploy.d.ts.map +1 -0
  974. package/dist/src/services/app-agent-deploy.js +91 -0
  975. package/dist/src/services/app-agent-deploy.js.map +1 -0
  976. package/dist/src/services/app-template-proposals.d.ts +94 -0
  977. package/dist/src/services/app-template-proposals.d.ts.map +1 -0
  978. package/dist/src/services/app-template-proposals.js +114 -0
  979. package/dist/src/services/app-template-proposals.js.map +1 -0
  980. package/dist/src/services/app-tool-interfaces.d.ts +37 -0
  981. package/dist/src/services/app-tool-interfaces.d.ts.map +1 -0
  982. package/dist/src/services/app-tool-interfaces.js +101 -0
  983. package/dist/src/services/app-tool-interfaces.js.map +1 -0
  984. package/dist/src/services/appdev-flow-constants.d.ts +33 -0
  985. package/dist/src/services/appdev-flow-constants.d.ts.map +1 -0
  986. package/dist/src/services/appdev-flow-constants.js +43 -0
  987. package/dist/src/services/appdev-flow-constants.js.map +1 -0
  988. package/dist/src/services/appdev-flow-prompt.d.ts +15 -0
  989. package/dist/src/services/appdev-flow-prompt.d.ts.map +1 -0
  990. package/dist/src/services/appdev-flow-prompt.js +40 -0
  991. package/dist/src/services/appdev-flow-prompt.js.map +1 -0
  992. package/dist/src/services/appdev-kb.d.ts +71 -0
  993. package/dist/src/services/appdev-kb.d.ts.map +1 -0
  994. package/dist/src/services/appdev-kb.js +178 -0
  995. package/dist/src/services/appdev-kb.js.map +1 -0
  996. package/dist/src/services/appdev-overview.d.ts +28 -0
  997. package/dist/src/services/appdev-overview.d.ts.map +1 -0
  998. package/dist/src/services/appdev-overview.js +189 -0
  999. package/dist/src/services/appdev-overview.js.map +1 -0
  1000. package/dist/src/services/build-app-prompt.d.ts +17 -0
  1001. package/dist/src/services/build-app-prompt.d.ts.map +1 -1
  1002. package/dist/src/services/build-app-prompt.js +74 -35
  1003. package/dist/src/services/build-app-prompt.js.map +1 -1
  1004. package/dist/src/services/config-schema.d.ts.map +1 -1
  1005. package/dist/src/services/config-schema.js +1 -3
  1006. package/dist/src/services/config-schema.js.map +1 -1
  1007. package/dist/src/services/consent.d.ts.map +1 -1
  1008. package/dist/src/services/consent.js +8 -3
  1009. package/dist/src/services/consent.js.map +1 -1
  1010. package/dist/src/services/contacts.d.ts +88 -0
  1011. package/dist/src/services/contacts.d.ts.map +1 -0
  1012. package/dist/src/services/contacts.js +163 -0
  1013. package/dist/src/services/contacts.js.map +1 -0
  1014. package/dist/src/services/core-jobs.d.ts +4 -0
  1015. package/dist/src/services/core-jobs.d.ts.map +1 -1
  1016. package/dist/src/services/core-jobs.js +23 -0
  1017. package/dist/src/services/core-jobs.js.map +1 -1
  1018. package/dist/src/services/dangling-refs.d.ts +2 -0
  1019. package/dist/src/services/dangling-refs.d.ts.map +1 -1
  1020. package/dist/src/services/dangling-refs.js +3 -2
  1021. package/dist/src/services/dangling-refs.js.map +1 -1
  1022. package/dist/src/services/db/access-tab-db-service.d.ts +49 -0
  1023. package/dist/src/services/db/access-tab-db-service.d.ts.map +1 -0
  1024. package/dist/src/services/db/access-tab-db-service.js +87 -0
  1025. package/dist/src/services/db/access-tab-db-service.js.map +1 -0
  1026. package/dist/src/services/db/agent-activity-overview-db-service.d.ts +62 -0
  1027. package/dist/src/services/db/agent-activity-overview-db-service.d.ts.map +1 -0
  1028. package/dist/src/services/db/agent-activity-overview-db-service.js +88 -0
  1029. package/dist/src/services/db/agent-activity-overview-db-service.js.map +1 -0
  1030. package/dist/src/services/db/agent-data-access-overview-db-service.d.ts +45 -0
  1031. package/dist/src/services/db/agent-data-access-overview-db-service.d.ts.map +1 -0
  1032. package/dist/src/services/db/agent-data-access-overview-db-service.js +42 -0
  1033. package/dist/src/services/db/agent-data-access-overview-db-service.js.map +1 -0
  1034. package/dist/src/services/db/agent-db-service.d.ts +58 -0
  1035. package/dist/src/services/db/agent-db-service.d.ts.map +1 -0
  1036. package/dist/src/services/db/agent-db-service.js +49 -0
  1037. package/dist/src/services/db/agent-db-service.js.map +1 -0
  1038. package/dist/src/services/db/agent-integration-overview-db-service.d.ts +44 -0
  1039. package/dist/src/services/db/agent-integration-overview-db-service.d.ts.map +1 -0
  1040. package/dist/src/services/db/agent-integration-overview-db-service.js +44 -0
  1041. package/dist/src/services/db/agent-integration-overview-db-service.js.map +1 -0
  1042. package/dist/src/services/db/agent-messages-overview-db-service.d.ts +40 -0
  1043. package/dist/src/services/db/agent-messages-overview-db-service.d.ts.map +1 -0
  1044. package/dist/src/services/db/agent-messages-overview-db-service.js +47 -0
  1045. package/dist/src/services/db/agent-messages-overview-db-service.js.map +1 -0
  1046. package/dist/src/services/db/agent-quality-overview-db-service.d.ts +43 -0
  1047. package/dist/src/services/db/agent-quality-overview-db-service.d.ts.map +1 -0
  1048. package/dist/src/services/db/agent-quality-overview-db-service.js +34 -0
  1049. package/dist/src/services/db/agent-quality-overview-db-service.js.map +1 -0
  1050. package/dist/src/services/db/calibrator-detail-db-service.d.ts +41 -0
  1051. package/dist/src/services/db/calibrator-detail-db-service.d.ts.map +1 -0
  1052. package/dist/src/services/db/calibrator-detail-db-service.js +61 -0
  1053. package/dist/src/services/db/calibrator-detail-db-service.js.map +1 -0
  1054. package/dist/src/services/db/data-wallet-db-service.d.ts +48 -0
  1055. package/dist/src/services/db/data-wallet-db-service.d.ts.map +1 -0
  1056. package/dist/src/services/db/data-wallet-db-service.js +74 -0
  1057. package/dist/src/services/db/data-wallet-db-service.js.map +1 -0
  1058. package/dist/src/services/db/generator-state-db-service.d.ts +48 -0
  1059. package/dist/src/services/db/generator-state-db-service.d.ts.map +1 -0
  1060. package/dist/src/services/db/generator-state-db-service.js +45 -0
  1061. package/dist/src/services/db/generator-state-db-service.js.map +1 -0
  1062. package/dist/src/services/db/home-dashboard-service.d.ts +65 -0
  1063. package/dist/src/services/db/home-dashboard-service.d.ts.map +1 -0
  1064. package/dist/src/services/db/home-dashboard-service.js +57 -0
  1065. package/dist/src/services/db/home-dashboard-service.js.map +1 -0
  1066. package/dist/src/services/db/index.d.ts +48 -0
  1067. package/dist/src/services/db/index.d.ts.map +1 -0
  1068. package/dist/src/services/db/index.js +40 -0
  1069. package/dist/src/services/db/index.js.map +1 -0
  1070. package/dist/src/services/db/knowledge-tab-db-service.d.ts +35 -0
  1071. package/dist/src/services/db/knowledge-tab-db-service.d.ts.map +1 -0
  1072. package/dist/src/services/db/knowledge-tab-db-service.js +37 -0
  1073. package/dist/src/services/db/knowledge-tab-db-service.js.map +1 -0
  1074. package/dist/src/services/db/living-docs-db-service.d.ts +43 -0
  1075. package/dist/src/services/db/living-docs-db-service.d.ts.map +1 -0
  1076. package/dist/src/services/db/living-docs-db-service.js +45 -0
  1077. package/dist/src/services/db/living-docs-db-service.js.map +1 -0
  1078. package/dist/src/services/db/memory-db-service.d.ts +122 -0
  1079. package/dist/src/services/db/memory-db-service.d.ts.map +1 -0
  1080. package/dist/src/services/db/memory-db-service.js +171 -0
  1081. package/dist/src/services/db/memory-db-service.js.map +1 -0
  1082. package/dist/src/services/db/memory-tab-db-service.d.ts +54 -0
  1083. package/dist/src/services/db/memory-tab-db-service.d.ts.map +1 -0
  1084. package/dist/src/services/db/memory-tab-db-service.js +94 -0
  1085. package/dist/src/services/db/memory-tab-db-service.js.map +1 -0
  1086. package/dist/src/services/db/messages-inbox-db-service.d.ts +47 -0
  1087. package/dist/src/services/db/messages-inbox-db-service.d.ts.map +1 -0
  1088. package/dist/src/services/db/messages-inbox-db-service.js +76 -0
  1089. package/dist/src/services/db/messages-inbox-db-service.js.map +1 -0
  1090. package/dist/src/services/db/messaging-db-service.d.ts +40 -0
  1091. package/dist/src/services/db/messaging-db-service.d.ts.map +1 -0
  1092. package/dist/src/services/db/messaging-db-service.js +55 -0
  1093. package/dist/src/services/db/messaging-db-service.js.map +1 -0
  1094. package/dist/src/services/db/notebook-db-service.d.ts +35 -0
  1095. package/dist/src/services/db/notebook-db-service.d.ts.map +1 -0
  1096. package/dist/src/services/db/notebook-db-service.js +44 -0
  1097. package/dist/src/services/db/notebook-db-service.js.map +1 -0
  1098. package/dist/src/services/db/owner-identity.d.ts +36 -0
  1099. package/dist/src/services/db/owner-identity.d.ts.map +1 -0
  1100. package/dist/src/services/db/owner-identity.js +27 -0
  1101. package/dist/src/services/db/owner-identity.js.map +1 -0
  1102. package/dist/src/services/db/packages-tab-db-service.d.ts +42 -0
  1103. package/dist/src/services/db/packages-tab-db-service.d.ts.map +1 -0
  1104. package/dist/src/services/db/packages-tab-db-service.js +33 -0
  1105. package/dist/src/services/db/packages-tab-db-service.js.map +1 -0
  1106. package/dist/src/services/db/security-tab-db-service.d.ts +47 -0
  1107. package/dist/src/services/db/security-tab-db-service.d.ts.map +1 -0
  1108. package/dist/src/services/db/security-tab-db-service.js +61 -0
  1109. package/dist/src/services/db/security-tab-db-service.js.map +1 -0
  1110. package/dist/src/services/db/wallet-tab-db-service.d.ts +47 -0
  1111. package/dist/src/services/db/wallet-tab-db-service.d.ts.map +1 -0
  1112. package/dist/src/services/db/wallet-tab-db-service.js +80 -0
  1113. package/dist/src/services/db/wallet-tab-db-service.js.map +1 -0
  1114. package/dist/src/services/db/work-tab-db-service.d.ts +32 -0
  1115. package/dist/src/services/db/work-tab-db-service.d.ts.map +1 -0
  1116. package/dist/src/services/db/work-tab-db-service.js +49 -0
  1117. package/dist/src/services/db/work-tab-db-service.js.map +1 -0
  1118. package/dist/src/services/directory.d.ts +1 -0
  1119. package/dist/src/services/directory.d.ts.map +1 -1
  1120. package/dist/src/services/directory.js +6 -2
  1121. package/dist/src/services/directory.js.map +1 -1
  1122. package/dist/src/services/discovery/setup.d.ts +3 -0
  1123. package/dist/src/services/discovery/setup.d.ts.map +1 -1
  1124. package/dist/src/services/discovery/setup.js +2 -0
  1125. package/dist/src/services/discovery/setup.js.map +1 -1
  1126. package/dist/src/services/discovery/sources/memory-source.d.ts +2 -0
  1127. package/dist/src/services/discovery/sources/memory-source.d.ts.map +1 -1
  1128. package/dist/src/services/discovery/sources/memory-source.js.map +1 -1
  1129. package/dist/src/services/discovery/sources/templates-source.d.ts +20 -0
  1130. package/dist/src/services/discovery/sources/templates-source.d.ts.map +1 -0
  1131. package/dist/src/services/discovery/sources/templates-source.js +52 -0
  1132. package/dist/src/services/discovery/sources/templates-source.js.map +1 -0
  1133. package/dist/src/services/entitlement-money.d.ts +55 -0
  1134. package/dist/src/services/entitlement-money.d.ts.map +1 -0
  1135. package/dist/src/services/entitlement-money.js +68 -0
  1136. package/dist/src/services/entitlement-money.js.map +1 -0
  1137. package/dist/src/services/exchange-market.d.ts +247 -0
  1138. package/dist/src/services/exchange-market.d.ts.map +1 -0
  1139. package/dist/src/services/exchange-market.js +254 -0
  1140. package/dist/src/services/exchange-market.js.map +1 -0
  1141. package/dist/src/services/exchange-proposals.d.ts +47 -0
  1142. package/dist/src/services/exchange-proposals.d.ts.map +1 -0
  1143. package/dist/src/services/exchange-proposals.js +71 -0
  1144. package/dist/src/services/exchange-proposals.js.map +1 -0
  1145. package/dist/src/services/exchange-work.d.ts +30 -0
  1146. package/dist/src/services/exchange-work.d.ts.map +1 -0
  1147. package/dist/src/services/exchange-work.js +43 -0
  1148. package/dist/src/services/exchange-work.js.map +1 -0
  1149. package/dist/src/services/ext-pay-token.d.ts +29 -0
  1150. package/dist/src/services/ext-pay-token.d.ts.map +1 -0
  1151. package/dist/src/services/ext-pay-token.js +63 -0
  1152. package/dist/src/services/ext-pay-token.js.map +1 -0
  1153. package/dist/src/services/extension-runtime.d.ts.map +1 -1
  1154. package/dist/src/services/extension-runtime.js +9 -2
  1155. package/dist/src/services/extension-runtime.js.map +1 -1
  1156. package/dist/src/services/feedback.d.ts +38 -0
  1157. package/dist/src/services/feedback.d.ts.map +1 -0
  1158. package/dist/src/services/feedback.js +118 -0
  1159. package/dist/src/services/feedback.js.map +1 -0
  1160. package/dist/src/services/generator-autopilot.d.ts.map +1 -1
  1161. package/dist/src/services/generator-autopilot.js +12 -19
  1162. package/dist/src/services/generator-autopilot.js.map +1 -1
  1163. package/dist/src/services/generator-prompt-seeds/blueprint-prompts.d.ts.map +1 -1
  1164. package/dist/src/services/generator-prompt-seeds/blueprint-prompts.js +28 -1
  1165. package/dist/src/services/generator-prompt-seeds/blueprint-prompts.js.map +1 -1
  1166. package/dist/src/services/generator-prompt-seeds/cortex-code.d.ts +5 -0
  1167. package/dist/src/services/generator-prompt-seeds/cortex-code.d.ts.map +1 -1
  1168. package/dist/src/services/generator-prompt-seeds/cortex-code.js +54 -3
  1169. package/dist/src/services/generator-prompt-seeds/cortex-code.js.map +1 -1
  1170. package/dist/src/services/generator-prompt-seeds/extension-prompts.d.ts.map +1 -1
  1171. package/dist/src/services/generator-prompt-seeds/extension-prompts.js +106 -2
  1172. package/dist/src/services/generator-prompt-seeds/extension-prompts.js.map +1 -1
  1173. package/dist/src/services/generator-prompt-seeds/shared-fragments.js +1 -1
  1174. package/dist/src/services/generator-prompts/resolvers-blueprint.d.ts.map +1 -1
  1175. package/dist/src/services/generator-prompts/resolvers-blueprint.js +9 -0
  1176. package/dist/src/services/generator-prompts/resolvers-blueprint.js.map +1 -1
  1177. package/dist/src/services/generator-prompts/resolvers-cortex.d.ts.map +1 -1
  1178. package/dist/src/services/generator-prompts/resolvers-cortex.js +4 -0
  1179. package/dist/src/services/generator-prompts/resolvers-cortex.js.map +1 -1
  1180. package/dist/src/services/generator-prompts/resolvers-fix.d.ts +4 -0
  1181. package/dist/src/services/generator-prompts/resolvers-fix.d.ts.map +1 -1
  1182. package/dist/src/services/generator-prompts/resolvers-fix.js +68 -0
  1183. package/dist/src/services/generator-prompts/resolvers-fix.js.map +1 -1
  1184. package/dist/src/services/generator-prompts/resolvers.d.ts.map +1 -1
  1185. package/dist/src/services/generator-prompts/resolvers.js +5 -1
  1186. package/dist/src/services/generator-prompts/resolvers.js.map +1 -1
  1187. package/dist/src/services/generator-prompts/types.d.ts +9 -0
  1188. package/dist/src/services/generator-prompts/types.d.ts.map +1 -1
  1189. package/dist/src/services/handbooks/agent.d.ts +2 -1
  1190. package/dist/src/services/handbooks/agent.d.ts.map +1 -1
  1191. package/dist/src/services/handbooks/agent.js +8 -0
  1192. package/dist/src/services/handbooks/agent.js.map +1 -1
  1193. package/dist/src/services/handbooks/appdev.d.ts +2 -1
  1194. package/dist/src/services/handbooks/appdev.d.ts.map +1 -1
  1195. package/dist/src/services/handbooks/appdev.js +19 -0
  1196. package/dist/src/services/handbooks/appdev.js.map +1 -1
  1197. package/dist/src/services/invitations.d.ts +76 -1
  1198. package/dist/src/services/invitations.d.ts.map +1 -1
  1199. package/dist/src/services/invitations.js +295 -9
  1200. package/dist/src/services/invitations.js.map +1 -1
  1201. package/dist/src/services/job-seeding.d.ts.map +1 -1
  1202. package/dist/src/services/job-seeding.js +2 -0
  1203. package/dist/src/services/job-seeding.js.map +1 -1
  1204. package/dist/src/services/living-author.js +1 -1
  1205. package/dist/src/services/living-author.js.map +1 -1
  1206. package/dist/src/services/llm-strip.d.ts +13 -0
  1207. package/dist/src/services/llm-strip.d.ts.map +1 -0
  1208. package/dist/src/services/llm-strip.js +60 -0
  1209. package/dist/src/services/llm-strip.js.map +1 -0
  1210. package/dist/src/services/manifest-schema.d.ts.map +1 -1
  1211. package/dist/src/services/manifest-schema.js +1 -0
  1212. package/dist/src/services/manifest-schema.js.map +1 -1
  1213. package/dist/src/services/matching.d.ts +1 -0
  1214. package/dist/src/services/matching.d.ts.map +1 -1
  1215. package/dist/src/services/matching.js +28 -19
  1216. package/dist/src/services/matching.js.map +1 -1
  1217. package/dist/src/services/message-send.d.ts.map +1 -1
  1218. package/dist/src/services/message-send.js +9 -1
  1219. package/dist/src/services/message-send.js.map +1 -1
  1220. package/dist/src/services/metered-entitlements.d.ts +203 -0
  1221. package/dist/src/services/metered-entitlements.d.ts.map +1 -0
  1222. package/dist/src/services/metered-entitlements.js +264 -0
  1223. package/dist/src/services/metered-entitlements.js.map +1 -0
  1224. package/dist/src/services/notebook-classify.js +1 -1
  1225. package/dist/src/services/notebook-classify.js.map +1 -1
  1226. package/dist/src/services/notebook-plan.js +1 -1
  1227. package/dist/src/services/notebook-plan.js.map +1 -1
  1228. package/dist/src/services/notify.d.ts +52 -0
  1229. package/dist/src/services/notify.d.ts.map +1 -1
  1230. package/dist/src/services/notify.js +56 -2
  1231. package/dist/src/services/notify.js.map +1 -1
  1232. package/dist/src/services/owner-memory.d.ts +25 -0
  1233. package/dist/src/services/owner-memory.d.ts.map +1 -1
  1234. package/dist/src/services/owner-memory.js +65 -18
  1235. package/dist/src/services/owner-memory.js.map +1 -1
  1236. package/dist/src/services/owner-provisioning.d.ts +5 -0
  1237. package/dist/src/services/owner-provisioning.d.ts.map +1 -1
  1238. package/dist/src/services/owner-provisioning.js +20 -2
  1239. package/dist/src/services/owner-provisioning.js.map +1 -1
  1240. package/dist/src/services/perf-trace.d.ts +43 -0
  1241. package/dist/src/services/perf-trace.d.ts.map +1 -0
  1242. package/dist/src/services/perf-trace.js +149 -0
  1243. package/dist/src/services/perf-trace.js.map +1 -0
  1244. package/dist/src/services/prompt-defaults.d.ts.map +1 -1
  1245. package/dist/src/services/prompt-defaults.js +0 -5
  1246. package/dist/src/services/prompt-defaults.js.map +1 -1
  1247. package/dist/src/services/push.d.ts +5 -0
  1248. package/dist/src/services/push.d.ts.map +1 -1
  1249. package/dist/src/services/push.js.map +1 -1
  1250. package/dist/src/services/quota.d.ts +3 -1
  1251. package/dist/src/services/quota.d.ts.map +1 -1
  1252. package/dist/src/services/quota.js +6 -9
  1253. package/dist/src/services/quota.js.map +1 -1
  1254. package/dist/src/services/structure-overview.d.ts +3 -0
  1255. package/dist/src/services/structure-overview.d.ts.map +1 -1
  1256. package/dist/src/services/structure-overview.js +3 -1
  1257. package/dist/src/services/structure-overview.js.map +1 -1
  1258. package/dist/src/services/structure-snapshot.d.ts.map +1 -1
  1259. package/dist/src/services/structure-snapshot.js +24 -1
  1260. package/dist/src/services/structure-snapshot.js.map +1 -1
  1261. package/dist/src/services/tracked-classify.js +1 -1
  1262. package/dist/src/services/tracked-classify.js.map +1 -1
  1263. package/dist/src/services/usage-summary.d.ts +3 -0
  1264. package/dist/src/services/usage-summary.d.ts.map +1 -1
  1265. package/dist/src/services/usage-summary.js +31 -29
  1266. package/dist/src/services/usage-summary.js.map +1 -1
  1267. package/dist/src/services/workflow/engine-human.d.ts +33 -0
  1268. package/dist/src/services/workflow/engine-human.d.ts.map +1 -0
  1269. package/dist/src/services/workflow/engine-human.js +44 -0
  1270. package/dist/src/services/workflow/engine-human.js.map +1 -0
  1271. package/dist/src/services/workflow/engine-steps.d.ts +13 -0
  1272. package/dist/src/services/workflow/engine-steps.d.ts.map +1 -1
  1273. package/dist/src/services/workflow/engine-steps.js +33 -2
  1274. package/dist/src/services/workflow/engine-steps.js.map +1 -1
  1275. package/dist/src/services/workflow/engine.d.ts +20 -0
  1276. package/dist/src/services/workflow/engine.d.ts.map +1 -1
  1277. package/dist/src/services/workflow/engine.js +77 -3
  1278. package/dist/src/services/workflow/engine.js.map +1 -1
  1279. package/dist/src/services/workflow/store.d.ts +3 -0
  1280. package/dist/src/services/workflow/store.d.ts.map +1 -1
  1281. package/dist/src/services/workflow/store.js +29 -4
  1282. package/dist/src/services/workflow/store.js.map +1 -1
  1283. package/dist/src/services/workspace-access.d.ts +12 -0
  1284. package/dist/src/services/workspace-access.d.ts.map +1 -1
  1285. package/dist/src/services/workspace-access.js +24 -5
  1286. package/dist/src/services/workspace-access.js.map +1 -1
  1287. package/dist/src/services/workspace-provision.d.ts +51 -0
  1288. package/dist/src/services/workspace-provision.d.ts.map +1 -0
  1289. package/dist/src/services/workspace-provision.js +56 -0
  1290. package/dist/src/services/workspace-provision.js.map +1 -0
  1291. package/dist/src/services/workspace-versions.d.ts +110 -0
  1292. package/dist/src/services/workspace-versions.d.ts.map +1 -0
  1293. package/dist/src/services/workspace-versions.js +0 -0
  1294. package/dist/src/services/workspace-versions.js.map +1 -0
  1295. package/dist/src/storage/adapter/legacy-memory-adapter.d.ts +61 -0
  1296. package/dist/src/storage/adapter/legacy-memory-adapter.d.ts.map +1 -0
  1297. package/dist/src/storage/adapter/legacy-memory-adapter.js +135 -0
  1298. package/dist/src/storage/adapter/legacy-memory-adapter.js.map +1 -0
  1299. package/dist/src/storage/adapter/memory-adapter.d.ts +126 -0
  1300. package/dist/src/storage/adapter/memory-adapter.d.ts.map +1 -0
  1301. package/dist/src/storage/adapter/memory-adapter.js +2 -0
  1302. package/dist/src/storage/adapter/memory-adapter.js.map +1 -0
  1303. package/dist/src/storage/interface.d.ts +3 -1
  1304. package/dist/src/storage/interface.d.ts.map +1 -1
  1305. package/dist/src/storage/providers/mongodb/index.d.ts +28 -0
  1306. package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
  1307. package/dist/src/storage/providers/mongodb/index.js +91 -1
  1308. package/dist/src/storage/providers/mongodb/index.js.map +1 -1
  1309. package/dist/src/storage/providers/mongodb/methods/apps.d.ts +9 -0
  1310. package/dist/src/storage/providers/mongodb/methods/apps.d.ts.map +1 -1
  1311. package/dist/src/storage/providers/mongodb/methods/apps.js +38 -0
  1312. package/dist/src/storage/providers/mongodb/methods/apps.js.map +1 -1
  1313. package/dist/src/storage/providers/mongodb/methods/governance.d.ts +5 -0
  1314. package/dist/src/storage/providers/mongodb/methods/governance.d.ts.map +1 -1
  1315. package/dist/src/storage/providers/mongodb/methods/governance.js +23 -2
  1316. package/dist/src/storage/providers/mongodb/methods/governance.js.map +1 -1
  1317. package/dist/src/storage/providers/mongodb/methods/identity.d.ts +6 -0
  1318. package/dist/src/storage/providers/mongodb/methods/identity.d.ts.map +1 -1
  1319. package/dist/src/storage/providers/mongodb/methods/identity.js +51 -9
  1320. package/dist/src/storage/providers/mongodb/methods/identity.js.map +1 -1
  1321. package/dist/src/storage/providers/mongodb/methods/owner-memory-scope.d.ts +34 -0
  1322. package/dist/src/storage/providers/mongodb/methods/owner-memory-scope.d.ts.map +1 -0
  1323. package/dist/src/storage/providers/mongodb/methods/owner-memory-scope.js +77 -0
  1324. package/dist/src/storage/providers/mongodb/methods/owner-memory-scope.js.map +1 -0
  1325. package/dist/src/storage/providers/mongodb/methods/owners-memory-bulk.d.ts +30 -0
  1326. package/dist/src/storage/providers/mongodb/methods/owners-memory-bulk.d.ts.map +1 -0
  1327. package/dist/src/storage/providers/mongodb/methods/owners-memory-bulk.js +0 -0
  1328. package/dist/src/storage/providers/mongodb/methods/owners-memory-bulk.js.map +1 -0
  1329. package/dist/src/storage/providers/mongodb/methods/owners.d.ts +8 -4
  1330. package/dist/src/storage/providers/mongodb/methods/owners.d.ts.map +1 -1
  1331. package/dist/src/storage/providers/mongodb/methods/owners.js +112 -21
  1332. package/dist/src/storage/providers/mongodb/methods/owners.js.map +1 -1
  1333. package/dist/src/storage/providers/mongodb/methods/sessions.d.ts.map +1 -1
  1334. package/dist/src/storage/providers/mongodb/methods/sessions.js +4 -0
  1335. package/dist/src/storage/providers/mongodb/methods/sessions.js.map +1 -1
  1336. package/dist/src/storage/providers/mongodb/methods/storage-stats.d.ts +21 -0
  1337. package/dist/src/storage/providers/mongodb/methods/storage-stats.d.ts.map +1 -0
  1338. package/dist/src/storage/providers/mongodb/methods/storage-stats.js +58 -0
  1339. package/dist/src/storage/providers/mongodb/methods/storage-stats.js.map +1 -0
  1340. package/dist/src/storage/providers/mongodb/methods/work.d.ts +8 -0
  1341. package/dist/src/storage/providers/mongodb/methods/work.d.ts.map +1 -1
  1342. package/dist/src/storage/providers/mongodb/methods/work.js +42 -0
  1343. package/dist/src/storage/providers/mongodb/methods/work.js.map +1 -1
  1344. package/dist/src/storage/providers/postgres/index.d.ts +1 -0
  1345. package/dist/src/storage/providers/postgres/index.d.ts.map +1 -1
  1346. package/dist/src/storage/providers/postgres/index.js +1 -0
  1347. package/dist/src/storage/providers/postgres/index.js.map +1 -1
  1348. package/dist/src/storage/providers/postgres-kysely/db-types.d.ts +1538 -0
  1349. package/dist/src/storage/providers/postgres-kysely/db-types.d.ts.map +1 -0
  1350. package/dist/src/storage/providers/postgres-kysely/db-types.js +6 -0
  1351. package/dist/src/storage/providers/postgres-kysely/db-types.js.map +1 -0
  1352. package/dist/src/storage/providers/postgres-kysely/helpers.d.ts +23 -0
  1353. package/dist/src/storage/providers/postgres-kysely/helpers.d.ts.map +1 -0
  1354. package/dist/src/storage/providers/postgres-kysely/helpers.js +91 -0
  1355. package/dist/src/storage/providers/postgres-kysely/helpers.js.map +1 -0
  1356. package/dist/src/storage/providers/postgres-kysely/index.d.ts +38 -0
  1357. package/dist/src/storage/providers/postgres-kysely/index.d.ts.map +1 -0
  1358. package/dist/src/storage/providers/postgres-kysely/index.js +81 -0
  1359. package/dist/src/storage/providers/postgres-kysely/index.js.map +1 -0
  1360. package/dist/src/storage/providers/postgres-kysely/methods/actions.d.ts +16 -0
  1361. package/dist/src/storage/providers/postgres-kysely/methods/actions.d.ts.map +1 -0
  1362. package/dist/src/storage/providers/postgres-kysely/methods/actions.js +103 -0
  1363. package/dist/src/storage/providers/postgres-kysely/methods/actions.js.map +1 -0
  1364. package/dist/src/storage/providers/postgres-kysely/methods/agent-misc.d.ts +37 -0
  1365. package/dist/src/storage/providers/postgres-kysely/methods/agent-misc.d.ts.map +1 -0
  1366. package/dist/src/storage/providers/postgres-kysely/methods/agent-misc.js +306 -0
  1367. package/dist/src/storage/providers/postgres-kysely/methods/agent-misc.js.map +1 -0
  1368. package/dist/src/storage/providers/postgres-kysely/methods/agent-msg-dispute-invite.d.ts +55 -0
  1369. package/dist/src/storage/providers/postgres-kysely/methods/agent-msg-dispute-invite.d.ts.map +1 -0
  1370. package/dist/src/storage/providers/postgres-kysely/methods/agent-msg-dispute-invite.js +247 -0
  1371. package/dist/src/storage/providers/postgres-kysely/methods/agent-msg-dispute-invite.js.map +1 -0
  1372. package/dist/src/storage/providers/postgres-kysely/methods/agent-onboarding.d.ts +11 -0
  1373. package/dist/src/storage/providers/postgres-kysely/methods/agent-onboarding.d.ts.map +1 -0
  1374. package/dist/src/storage/providers/postgres-kysely/methods/agent-onboarding.js +81 -0
  1375. package/dist/src/storage/providers/postgres-kysely/methods/agent-onboarding.js.map +1 -0
  1376. package/dist/src/storage/providers/postgres-kysely/methods/agent-tasks.d.ts +50 -0
  1377. package/dist/src/storage/providers/postgres-kysely/methods/agent-tasks.d.ts.map +1 -0
  1378. package/dist/src/storage/providers/postgres-kysely/methods/agent-tasks.js +238 -0
  1379. package/dist/src/storage/providers/postgres-kysely/methods/agent-tasks.js.map +1 -0
  1380. package/dist/src/storage/providers/postgres-kysely/methods/agent-usage.d.ts +10 -0
  1381. package/dist/src/storage/providers/postgres-kysely/methods/agent-usage.d.ts.map +1 -0
  1382. package/dist/src/storage/providers/postgres-kysely/methods/agent-usage.js +146 -0
  1383. package/dist/src/storage/providers/postgres-kysely/methods/agent-usage.js.map +1 -0
  1384. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.d.ts +11 -0
  1385. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.d.ts.map +1 -0
  1386. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.js +51 -0
  1387. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.js.map +1 -0
  1388. package/dist/src/storage/providers/postgres-kysely/methods/app-purchases.d.ts +10 -0
  1389. package/dist/src/storage/providers/postgres-kysely/methods/app-purchases.d.ts.map +1 -0
  1390. package/dist/src/storage/providers/postgres-kysely/methods/app-purchases.js +53 -0
  1391. package/dist/src/storage/providers/postgres-kysely/methods/app-purchases.js.map +1 -0
  1392. package/dist/src/storage/providers/postgres-kysely/methods/apps.d.ts +49 -0
  1393. package/dist/src/storage/providers/postgres-kysely/methods/apps.d.ts.map +1 -0
  1394. package/dist/src/storage/providers/postgres-kysely/methods/apps.js +369 -0
  1395. package/dist/src/storage/providers/postgres-kysely/methods/apps.js.map +1 -0
  1396. package/dist/src/storage/providers/postgres-kysely/methods/boards.d.ts +28 -0
  1397. package/dist/src/storage/providers/postgres-kysely/methods/boards.d.ts.map +1 -0
  1398. package/dist/src/storage/providers/postgres-kysely/methods/boards.js +104 -0
  1399. package/dist/src/storage/providers/postgres-kysely/methods/boards.js.map +1 -0
  1400. package/dist/src/storage/providers/postgres-kysely/methods/capabilities.d.ts +36 -0
  1401. package/dist/src/storage/providers/postgres-kysely/methods/capabilities.d.ts.map +1 -0
  1402. package/dist/src/storage/providers/postgres-kysely/methods/capabilities.js +222 -0
  1403. package/dist/src/storage/providers/postgres-kysely/methods/capabilities.js.map +1 -0
  1404. package/dist/src/storage/providers/postgres-kysely/methods/catalogue.d.ts +19 -0
  1405. package/dist/src/storage/providers/postgres-kysely/methods/catalogue.d.ts.map +1 -0
  1406. package/dist/src/storage/providers/postgres-kysely/methods/catalogue.js +96 -0
  1407. package/dist/src/storage/providers/postgres-kysely/methods/catalogue.js.map +1 -0
  1408. package/dist/src/storage/providers/postgres-kysely/methods/consent.d.ts +26 -0
  1409. package/dist/src/storage/providers/postgres-kysely/methods/consent.d.ts.map +1 -0
  1410. package/dist/src/storage/providers/postgres-kysely/methods/consent.js +119 -0
  1411. package/dist/src/storage/providers/postgres-kysely/methods/consent.js.map +1 -0
  1412. package/dist/src/storage/providers/postgres-kysely/methods/device-auth.d.ts +13 -0
  1413. package/dist/src/storage/providers/postgres-kysely/methods/device-auth.d.ts.map +1 -0
  1414. package/dist/src/storage/providers/postgres-kysely/methods/device-auth.js +68 -0
  1415. package/dist/src/storage/providers/postgres-kysely/methods/device-auth.js.map +1 -0
  1416. package/dist/src/storage/providers/postgres-kysely/methods/direct-message.d.ts +72 -0
  1417. package/dist/src/storage/providers/postgres-kysely/methods/direct-message.d.ts.map +1 -0
  1418. package/dist/src/storage/providers/postgres-kysely/methods/direct-message.js +352 -0
  1419. package/dist/src/storage/providers/postgres-kysely/methods/direct-message.js.map +1 -0
  1420. package/dist/src/storage/providers/postgres-kysely/methods/ecosystem.d.ts +22 -0
  1421. package/dist/src/storage/providers/postgres-kysely/methods/ecosystem.d.ts.map +1 -0
  1422. package/dist/src/storage/providers/postgres-kysely/methods/ecosystem.js +201 -0
  1423. package/dist/src/storage/providers/postgres-kysely/methods/ecosystem.js.map +1 -0
  1424. package/dist/src/storage/providers/postgres-kysely/methods/federation.d.ts +42 -0
  1425. package/dist/src/storage/providers/postgres-kysely/methods/federation.d.ts.map +1 -0
  1426. package/dist/src/storage/providers/postgres-kysely/methods/federation.js +295 -0
  1427. package/dist/src/storage/providers/postgres-kysely/methods/federation.js.map +1 -0
  1428. package/dist/src/storage/providers/postgres-kysely/methods/feedback.d.ts +15 -0
  1429. package/dist/src/storage/providers/postgres-kysely/methods/feedback.d.ts.map +1 -0
  1430. package/dist/src/storage/providers/postgres-kysely/methods/feedback.js +52 -0
  1431. package/dist/src/storage/providers/postgres-kysely/methods/feedback.js.map +1 -0
  1432. package/dist/src/storage/providers/postgres-kysely/methods/files.d.ts +20 -0
  1433. package/dist/src/storage/providers/postgres-kysely/methods/files.d.ts.map +1 -0
  1434. package/dist/src/storage/providers/postgres-kysely/methods/files.js +108 -0
  1435. package/dist/src/storage/providers/postgres-kysely/methods/files.js.map +1 -0
  1436. package/dist/src/storage/providers/postgres-kysely/methods/identity-extras.d.ts +19 -0
  1437. package/dist/src/storage/providers/postgres-kysely/methods/identity-extras.d.ts.map +1 -0
  1438. package/dist/src/storage/providers/postgres-kysely/methods/identity-extras.js +101 -0
  1439. package/dist/src/storage/providers/postgres-kysely/methods/identity-extras.js.map +1 -0
  1440. package/dist/src/storage/providers/postgres-kysely/methods/identity.d.ts +35 -0
  1441. package/dist/src/storage/providers/postgres-kysely/methods/identity.d.ts.map +1 -0
  1442. package/dist/src/storage/providers/postgres-kysely/methods/identity.js +302 -0
  1443. package/dist/src/storage/providers/postgres-kysely/methods/identity.js.map +1 -0
  1444. package/dist/src/storage/providers/postgres-kysely/methods/knowledge.d.ts +21 -0
  1445. package/dist/src/storage/providers/postgres-kysely/methods/knowledge.d.ts.map +1 -0
  1446. package/dist/src/storage/providers/postgres-kysely/methods/knowledge.js +65 -0
  1447. package/dist/src/storage/providers/postgres-kysely/methods/knowledge.js.map +1 -0
  1448. package/dist/src/storage/providers/postgres-kysely/methods/marketplace.d.ts +24 -0
  1449. package/dist/src/storage/providers/postgres-kysely/methods/marketplace.d.ts.map +1 -0
  1450. package/dist/src/storage/providers/postgres-kysely/methods/marketplace.js +122 -0
  1451. package/dist/src/storage/providers/postgres-kysely/methods/marketplace.js.map +1 -0
  1452. package/dist/src/storage/providers/postgres-kysely/methods/memory.d.ts +81 -0
  1453. package/dist/src/storage/providers/postgres-kysely/methods/memory.d.ts.map +1 -0
  1454. package/dist/src/storage/providers/postgres-kysely/methods/memory.js +342 -0
  1455. package/dist/src/storage/providers/postgres-kysely/methods/memory.js.map +1 -0
  1456. package/dist/src/storage/providers/postgres-kysely/methods/micro-memory.d.ts +15 -0
  1457. package/dist/src/storage/providers/postgres-kysely/methods/micro-memory.d.ts.map +1 -0
  1458. package/dist/src/storage/providers/postgres-kysely/methods/micro-memory.js +55 -0
  1459. package/dist/src/storage/providers/postgres-kysely/methods/micro-memory.js.map +1 -0
  1460. package/dist/src/storage/providers/postgres-kysely/methods/moderation.d.ts +38 -0
  1461. package/dist/src/storage/providers/postgres-kysely/methods/moderation.d.ts.map +1 -0
  1462. package/dist/src/storage/providers/postgres-kysely/methods/moderation.js +176 -0
  1463. package/dist/src/storage/providers/postgres-kysely/methods/moderation.js.map +1 -0
  1464. package/dist/src/storage/providers/postgres-kysely/methods/node-ext-escrow.d.ts +38 -0
  1465. package/dist/src/storage/providers/postgres-kysely/methods/node-ext-escrow.d.ts.map +1 -0
  1466. package/dist/src/storage/providers/postgres-kysely/methods/node-ext-escrow.js +243 -0
  1467. package/dist/src/storage/providers/postgres-kysely/methods/node-ext-escrow.js.map +1 -0
  1468. package/dist/src/storage/providers/postgres-kysely/methods/node-infra.d.ts +30 -0
  1469. package/dist/src/storage/providers/postgres-kysely/methods/node-infra.d.ts.map +1 -0
  1470. package/dist/src/storage/providers/postgres-kysely/methods/node-infra.js +158 -0
  1471. package/dist/src/storage/providers/postgres-kysely/methods/node-infra.js.map +1 -0
  1472. package/dist/src/storage/providers/postgres-kysely/methods/notifications.d.ts +19 -0
  1473. package/dist/src/storage/providers/postgres-kysely/methods/notifications.d.ts.map +1 -0
  1474. package/dist/src/storage/providers/postgres-kysely/methods/notifications.js +106 -0
  1475. package/dist/src/storage/providers/postgres-kysely/methods/notifications.js.map +1 -0
  1476. package/dist/src/storage/providers/postgres-kysely/methods/oauth.d.ts +20 -0
  1477. package/dist/src/storage/providers/postgres-kysely/methods/oauth.d.ts.map +1 -0
  1478. package/dist/src/storage/providers/postgres-kysely/methods/oauth.js +94 -0
  1479. package/dist/src/storage/providers/postgres-kysely/methods/oauth.js.map +1 -0
  1480. package/dist/src/storage/providers/postgres-kysely/methods/organisms.d.ts +46 -0
  1481. package/dist/src/storage/providers/postgres-kysely/methods/organisms.d.ts.map +1 -0
  1482. package/dist/src/storage/providers/postgres-kysely/methods/organisms.js +247 -0
  1483. package/dist/src/storage/providers/postgres-kysely/methods/organisms.js.map +1 -0
  1484. package/dist/src/storage/providers/postgres-kysely/methods/otk.d.ts +10 -0
  1485. package/dist/src/storage/providers/postgres-kysely/methods/otk.d.ts.map +1 -0
  1486. package/dist/src/storage/providers/postgres-kysely/methods/otk.js +60 -0
  1487. package/dist/src/storage/providers/postgres-kysely/methods/otk.js.map +1 -0
  1488. package/dist/src/storage/providers/postgres-kysely/methods/packages.d.ts +32 -0
  1489. package/dist/src/storage/providers/postgres-kysely/methods/packages.d.ts.map +1 -0
  1490. package/dist/src/storage/providers/postgres-kysely/methods/packages.js +228 -0
  1491. package/dist/src/storage/providers/postgres-kysely/methods/packages.js.map +1 -0
  1492. package/dist/src/storage/providers/postgres-kysely/methods/pat.d.ts +10 -0
  1493. package/dist/src/storage/providers/postgres-kysely/methods/pat.d.ts.map +1 -0
  1494. package/dist/src/storage/providers/postgres-kysely/methods/pat.js +36 -0
  1495. package/dist/src/storage/providers/postgres-kysely/methods/pat.js.map +1 -0
  1496. package/dist/src/storage/providers/postgres-kysely/methods/schedules.d.ts +32 -0
  1497. package/dist/src/storage/providers/postgres-kysely/methods/schedules.d.ts.map +1 -0
  1498. package/dist/src/storage/providers/postgres-kysely/methods/schedules.js +131 -0
  1499. package/dist/src/storage/providers/postgres-kysely/methods/schedules.js.map +1 -0
  1500. package/dist/src/storage/providers/postgres-kysely/methods/schema.d.ts +10 -0
  1501. package/dist/src/storage/providers/postgres-kysely/methods/schema.d.ts.map +1 -0
  1502. package/dist/src/storage/providers/postgres-kysely/methods/schema.js +88 -0
  1503. package/dist/src/storage/providers/postgres-kysely/methods/schema.js.map +1 -0
  1504. package/dist/src/storage/providers/postgres-kysely/methods/sessions.d.ts +38 -0
  1505. package/dist/src/storage/providers/postgres-kysely/methods/sessions.d.ts.map +1 -0
  1506. package/dist/src/storage/providers/postgres-kysely/methods/sessions.js +66 -0
  1507. package/dist/src/storage/providers/postgres-kysely/methods/sessions.js.map +1 -0
  1508. package/dist/src/storage/providers/postgres-kysely/methods/subdomain-sites.d.ts +10 -0
  1509. package/dist/src/storage/providers/postgres-kysely/methods/subdomain-sites.d.ts.map +1 -0
  1510. package/dist/src/storage/providers/postgres-kysely/methods/subdomain-sites.js +36 -0
  1511. package/dist/src/storage/providers/postgres-kysely/methods/subdomain-sites.js.map +1 -0
  1512. package/dist/src/storage/providers/postgres-kysely/methods/system-extras.d.ts +23 -0
  1513. package/dist/src/storage/providers/postgres-kysely/methods/system-extras.d.ts.map +1 -0
  1514. package/dist/src/storage/providers/postgres-kysely/methods/system-extras.js +109 -0
  1515. package/dist/src/storage/providers/postgres-kysely/methods/system-extras.js.map +1 -0
  1516. package/dist/src/storage/providers/postgres-kysely/methods/system.d.ts +32 -0
  1517. package/dist/src/storage/providers/postgres-kysely/methods/system.d.ts.map +1 -0
  1518. package/dist/src/storage/providers/postgres-kysely/methods/system.js +144 -0
  1519. package/dist/src/storage/providers/postgres-kysely/methods/system.js.map +1 -0
  1520. package/dist/src/storage/providers/postgres-kysely/methods/template-listings.d.ts +34 -0
  1521. package/dist/src/storage/providers/postgres-kysely/methods/template-listings.d.ts.map +1 -0
  1522. package/dist/src/storage/providers/postgres-kysely/methods/template-listings.js +278 -0
  1523. package/dist/src/storage/providers/postgres-kysely/methods/template-listings.js.map +1 -0
  1524. package/dist/src/storage/providers/postgres-kysely/methods/wallet.d.ts +13 -0
  1525. package/dist/src/storage/providers/postgres-kysely/methods/wallet.d.ts.map +1 -0
  1526. package/dist/src/storage/providers/postgres-kysely/methods/wallet.js +129 -0
  1527. package/dist/src/storage/providers/postgres-kysely/methods/wallet.js.map +1 -0
  1528. package/dist/src/storage/providers/postgres-kysely/methods/work.d.ts +14 -0
  1529. package/dist/src/storage/providers/postgres-kysely/methods/work.d.ts.map +1 -0
  1530. package/dist/src/storage/providers/postgres-kysely/methods/work.js +80 -0
  1531. package/dist/src/storage/providers/postgres-kysely/methods/work.js.map +1 -0
  1532. package/dist/src/storage/providers/postgres-kysely/migrate.d.ts +4 -0
  1533. package/dist/src/storage/providers/postgres-kysely/migrate.d.ts.map +1 -0
  1534. package/dist/src/storage/providers/postgres-kysely/migrate.js +40 -0
  1535. package/dist/src/storage/providers/postgres-kysely/migrate.js.map +1 -0
  1536. package/dist/src/storage/providers/postgres-kysely/migrations/0001_base_schema.sql +2406 -0
  1537. package/dist/src/storage/providers/postgres-kysely/migrations/0002_memory_fts.sql +20 -0
  1538. package/dist/src/storage/providers/postgres-kysely/migrations/0003_id_defaults.sql +15 -0
  1539. package/dist/src/storage/providers/postgres-kysely/migrations/0004_otk_initial.sql +4 -0
  1540. package/dist/src/storage/providers/postgres-kysely/migrations/0005_storage_stats.sql +9 -0
  1541. package/dist/src/storage/providers/postgres-kysely/migrations/0006_membership_invited_workspaces.sql +5 -0
  1542. package/dist/src/storage/providers/postgres-kysely/migrations/0007_contacts_origin.sql +5 -0
  1543. package/dist/src/storage/providers/postgres-kysely/migrations/0008_feedback.sql +21 -0
  1544. package/dist/src/storage/providers/postgres-kysely/migrations/0009_invitation_return_url.sql +7 -0
  1545. package/dist/src/storage/providers/postgres-kysely/migrations/0010_agent_model.sql +5 -0
  1546. package/dist/src/storage/providers/postgres-kysely/migrations/0011_unique_verified_email.sql +25 -0
  1547. package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
  1548. package/dist/src/storage/providers/sqlite/index.js +4 -1
  1549. package/dist/src/storage/providers/sqlite/index.js.map +1 -1
  1550. package/dist/src/storage/providers/sqlite/methods/apps.d.ts +12 -1
  1551. package/dist/src/storage/providers/sqlite/methods/apps.d.ts.map +1 -1
  1552. package/dist/src/storage/providers/sqlite/methods/apps.js +42 -0
  1553. package/dist/src/storage/providers/sqlite/methods/apps.js.map +1 -1
  1554. package/dist/src/storage/providers/sqlite/methods/capability-agents.d.ts +12 -1
  1555. package/dist/src/storage/providers/sqlite/methods/capability-agents.d.ts.map +1 -1
  1556. package/dist/src/storage/providers/sqlite/methods/capability-agents.js +42 -0
  1557. package/dist/src/storage/providers/sqlite/methods/capability-agents.js.map +1 -1
  1558. package/dist/src/storage/providers/sqlite/methods/community.d.ts +6 -0
  1559. package/dist/src/storage/providers/sqlite/methods/community.d.ts.map +1 -1
  1560. package/dist/src/storage/providers/sqlite/methods/community.js +29 -3
  1561. package/dist/src/storage/providers/sqlite/methods/community.js.map +1 -1
  1562. package/dist/src/storage/providers/sqlite/methods/extensions-notify.d.ts.map +1 -1
  1563. package/dist/src/storage/providers/sqlite/methods/extensions-notify.js +11 -2
  1564. package/dist/src/storage/providers/sqlite/methods/extensions-notify.js.map +1 -1
  1565. package/dist/src/storage/providers/sqlite/methods/feedback.d.ts +23 -0
  1566. package/dist/src/storage/providers/sqlite/methods/feedback.d.ts.map +1 -0
  1567. package/dist/src/storage/providers/sqlite/methods/feedback.js +64 -0
  1568. package/dist/src/storage/providers/sqlite/methods/feedback.js.map +1 -0
  1569. package/dist/src/storage/providers/sqlite/methods/governance.d.ts +5 -0
  1570. package/dist/src/storage/providers/sqlite/methods/governance.d.ts.map +1 -1
  1571. package/dist/src/storage/providers/sqlite/methods/governance.js +43 -9
  1572. package/dist/src/storage/providers/sqlite/methods/governance.js.map +1 -1
  1573. package/dist/src/storage/providers/sqlite/methods/identity-nodes.d.ts +9 -0
  1574. package/dist/src/storage/providers/sqlite/methods/identity-nodes.d.ts.map +1 -1
  1575. package/dist/src/storage/providers/sqlite/methods/identity-nodes.js +52 -0
  1576. package/dist/src/storage/providers/sqlite/methods/identity-nodes.js.map +1 -1
  1577. package/dist/src/storage/providers/sqlite/methods/messaging.d.ts +15 -1
  1578. package/dist/src/storage/providers/sqlite/methods/messaging.d.ts.map +1 -1
  1579. package/dist/src/storage/providers/sqlite/methods/messaging.js +11 -2
  1580. package/dist/src/storage/providers/sqlite/methods/messaging.js.map +1 -1
  1581. package/dist/src/storage/providers/sqlite/methods/owner-memory-bulk.d.ts +28 -0
  1582. package/dist/src/storage/providers/sqlite/methods/owner-memory-bulk.d.ts.map +1 -0
  1583. package/dist/src/storage/providers/sqlite/methods/owner-memory-bulk.js +101 -0
  1584. package/dist/src/storage/providers/sqlite/methods/owner-memory-bulk.js.map +1 -0
  1585. package/dist/src/storage/providers/sqlite/methods/owner-memory-scope.d.ts +35 -0
  1586. package/dist/src/storage/providers/sqlite/methods/owner-memory-scope.d.ts.map +1 -0
  1587. package/dist/src/storage/providers/sqlite/methods/owner-memory-scope.js +118 -0
  1588. package/dist/src/storage/providers/sqlite/methods/owner-memory-scope.js.map +1 -0
  1589. package/dist/src/storage/providers/sqlite/methods/owner.d.ts +6 -0
  1590. package/dist/src/storage/providers/sqlite/methods/owner.d.ts.map +1 -1
  1591. package/dist/src/storage/providers/sqlite/methods/owner.js +41 -9
  1592. package/dist/src/storage/providers/sqlite/methods/owner.js.map +1 -1
  1593. package/dist/src/storage/providers/sqlite/methods/work.d.ts +8 -0
  1594. package/dist/src/storage/providers/sqlite/methods/work.d.ts.map +1 -1
  1595. package/dist/src/storage/providers/sqlite/methods/work.js +31 -0
  1596. package/dist/src/storage/providers/sqlite/methods/work.js.map +1 -1
  1597. package/dist/src/storage/providers/sqlite/repos/action.d.ts +3 -0
  1598. package/dist/src/storage/providers/sqlite/repos/action.d.ts.map +1 -1
  1599. package/dist/src/storage/providers/sqlite/repos/action.js +9 -0
  1600. package/dist/src/storage/providers/sqlite/repos/action.js.map +1 -1
  1601. package/dist/src/storage/providers/sqlite/repos/agent.d.ts.map +1 -1
  1602. package/dist/src/storage/providers/sqlite/repos/agent.js +8 -4
  1603. package/dist/src/storage/providers/sqlite/repos/agent.js.map +1 -1
  1604. package/dist/src/storage/providers/sqlite/repos/community.d.ts +1 -0
  1605. package/dist/src/storage/providers/sqlite/repos/community.d.ts.map +1 -1
  1606. package/dist/src/storage/providers/sqlite/repos/community.js +9 -3
  1607. package/dist/src/storage/providers/sqlite/repos/community.js.map +1 -1
  1608. package/dist/src/storage/providers/sqlite/repos/direct-message.d.ts +13 -1
  1609. package/dist/src/storage/providers/sqlite/repos/direct-message.d.ts.map +1 -1
  1610. package/dist/src/storage/providers/sqlite/repos/direct-message.js +70 -5
  1611. package/dist/src/storage/providers/sqlite/repos/direct-message.js.map +1 -1
  1612. package/dist/src/storage/providers/sqlite/repos/memory.d.ts +7 -0
  1613. package/dist/src/storage/providers/sqlite/repos/memory.d.ts.map +1 -1
  1614. package/dist/src/storage/providers/sqlite/repos/memory.js +24 -3
  1615. package/dist/src/storage/providers/sqlite/repos/memory.js.map +1 -1
  1616. package/dist/src/storage/providers/sqlite/repos/storage-file.d.ts +12 -0
  1617. package/dist/src/storage/providers/sqlite/repos/storage-file.d.ts.map +1 -1
  1618. package/dist/src/storage/providers/sqlite/repos/storage-file.js +24 -0
  1619. package/dist/src/storage/providers/sqlite/repos/storage-file.js.map +1 -1
  1620. package/dist/src/storage/providers/sqlite/schema-tables-1.d.ts +1 -0
  1621. package/dist/src/storage/providers/sqlite/schema-tables-1.d.ts.map +1 -1
  1622. package/dist/src/storage/providers/sqlite/schema-tables-1.js +18 -1
  1623. package/dist/src/storage/providers/sqlite/schema-tables-1.js.map +1 -1
  1624. package/dist/src/storage/providers/sqlite/schema-tables-2.d.ts +1 -0
  1625. package/dist/src/storage/providers/sqlite/schema-tables-2.d.ts.map +1 -1
  1626. package/dist/src/storage/providers/sqlite/schema-tables-2.js +4 -1
  1627. package/dist/src/storage/providers/sqlite/schema-tables-2.js.map +1 -1
  1628. package/dist/src/storage/providers/sqlite/schema-tables-3.d.ts.map +1 -1
  1629. package/dist/src/storage/providers/sqlite/schema-tables-3.js +11 -1
  1630. package/dist/src/storage/providers/sqlite/schema-tables-3.js.map +1 -1
  1631. package/dist/src/storage/providers/sqlite/schema.d.ts +0 -1
  1632. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  1633. package/dist/src/storage/providers/sqlite/schema.js +44 -0
  1634. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  1635. package/dist/src/storage/repositories/action.repository.d.ts +2 -0
  1636. package/dist/src/storage/repositories/action.repository.d.ts.map +1 -1
  1637. package/dist/src/storage/repositories/agent.repository.d.ts +3 -0
  1638. package/dist/src/storage/repositories/agent.repository.d.ts.map +1 -1
  1639. package/dist/src/storage/repositories/app.repository.d.ts +0 -0
  1640. package/dist/src/storage/repositories/app.repository.d.ts.map +1 -1
  1641. package/dist/src/storage/repositories/consent.repository.d.ts +10 -0
  1642. package/dist/src/storage/repositories/consent.repository.d.ts.map +1 -1
  1643. package/dist/src/storage/repositories/direct-message.repository.d.ts +36 -11
  1644. package/dist/src/storage/repositories/direct-message.repository.d.ts.map +1 -1
  1645. package/dist/src/storage/repositories/direct-message.repository.js +2 -0
  1646. package/dist/src/storage/repositories/direct-message.repository.js.map +1 -1
  1647. package/dist/src/storage/repositories/feedback.repository.d.ts +28 -0
  1648. package/dist/src/storage/repositories/feedback.repository.d.ts.map +1 -0
  1649. package/dist/src/storage/repositories/feedback.repository.js +13 -0
  1650. package/dist/src/storage/repositories/feedback.repository.js.map +1 -0
  1651. package/dist/src/storage/repositories/file.repository.d.ts +11 -0
  1652. package/dist/src/storage/repositories/file.repository.d.ts.map +1 -1
  1653. package/dist/src/storage/repositories/identity.repository.d.ts +13 -0
  1654. package/dist/src/storage/repositories/identity.repository.d.ts.map +1 -1
  1655. package/dist/src/storage/repositories/index.d.ts +1 -0
  1656. package/dist/src/storage/repositories/index.d.ts.map +1 -1
  1657. package/dist/src/storage/repositories/invitation.repository.d.ts +3 -0
  1658. package/dist/src/storage/repositories/invitation.repository.d.ts.map +1 -1
  1659. package/dist/src/storage/repositories/invitation.repository.js +2 -0
  1660. package/dist/src/storage/repositories/invitation.repository.js.map +1 -1
  1661. package/dist/src/storage/repositories/memory.repository.d.ts +133 -1
  1662. package/dist/src/storage/repositories/memory.repository.d.ts.map +1 -1
  1663. package/dist/src/storage/repositories/micro-memory.repository.d.ts +6 -0
  1664. package/dist/src/storage/repositories/micro-memory.repository.d.ts.map +1 -1
  1665. package/dist/src/storage/repositories/organism.repository.d.ts +10 -0
  1666. package/dist/src/storage/repositories/organism.repository.d.ts.map +1 -1
  1667. package/dist/src/storage/repositories/stats.repository.d.ts +31 -2
  1668. package/dist/src/storage/repositories/stats.repository.d.ts.map +1 -1
  1669. package/dist/src/storage/repositories/stats.repository.js +5 -2
  1670. package/dist/src/storage/repositories/stats.repository.js.map +1 -1
  1671. package/dist/src/storage/repositories/work.repository.d.ts +7 -0
  1672. package/dist/src/storage/repositories/work.repository.d.ts.map +1 -1
  1673. package/dist/src/storage/repositories-impl/memory-repository.d.ts +78 -0
  1674. package/dist/src/storage/repositories-impl/memory-repository.d.ts.map +1 -0
  1675. package/dist/src/storage/repositories-impl/memory-repository.js +121 -0
  1676. package/dist/src/storage/repositories-impl/memory-repository.js.map +1 -0
  1677. package/dist/src/storage/schema-lock-cache.d.ts +24 -0
  1678. package/dist/src/storage/schema-lock-cache.d.ts.map +1 -0
  1679. package/dist/src/storage/schema-lock-cache.js +19 -0
  1680. package/dist/src/storage/schema-lock-cache.js.map +1 -0
  1681. package/dist/src/storage/storage-factory.d.ts +6 -3
  1682. package/dist/src/storage/storage-factory.d.ts.map +1 -1
  1683. package/dist/src/storage/storage-factory.js +19 -12
  1684. package/dist/src/storage/storage-factory.js.map +1 -1
  1685. package/dist/src/storage/types/agents-messaging.d.ts +33 -0
  1686. package/dist/src/storage/types/agents-messaging.d.ts.map +1 -1
  1687. package/dist/src/storage/types/agents-messaging.js +3 -0
  1688. package/dist/src/storage/types/agents-messaging.js.map +1 -1
  1689. package/dist/src/storage/types/apps.d.ts +14 -0
  1690. package/dist/src/storage/types/apps.d.ts.map +1 -1
  1691. package/dist/src/storage/types/identity.d.ts +8 -0
  1692. package/dist/src/storage/types/identity.d.ts.map +1 -1
  1693. package/dist/src/storage/types/organisms-federation.d.ts +48 -0
  1694. package/dist/src/storage/types/organisms-federation.d.ts.map +1 -1
  1695. package/dist/src/storage/uow/batch-loader.d.ts +44 -0
  1696. package/dist/src/storage/uow/batch-loader.d.ts.map +1 -0
  1697. package/dist/src/storage/uow/batch-loader.js +101 -0
  1698. package/dist/src/storage/uow/batch-loader.js.map +1 -0
  1699. package/dist/src/storage/uow/identity-map.d.ts +0 -0
  1700. package/dist/src/storage/uow/identity-map.d.ts.map +1 -0
  1701. package/dist/src/storage/uow/identity-map.js +0 -0
  1702. package/dist/src/storage/uow/identity-map.js.map +1 -0
  1703. package/dist/src/storage/uow/unit-of-work.d.ts +42 -0
  1704. package/dist/src/storage/uow/unit-of-work.d.ts.map +1 -0
  1705. package/dist/src/storage/uow/unit-of-work.js +89 -0
  1706. package/dist/src/storage/uow/unit-of-work.js.map +1 -0
  1707. package/dist/src/utils/app-badge.d.ts +7 -22
  1708. package/dist/src/utils/app-badge.d.ts.map +1 -1
  1709. package/dist/src/utils/app-badge.js +59 -22
  1710. package/dist/src/utils/app-badge.js.map +1 -1
  1711. package/dist/src/utils/app-mobile-lint.d.ts +17 -0
  1712. package/dist/src/utils/app-mobile-lint.d.ts.map +1 -0
  1713. package/dist/src/utils/app-mobile-lint.js +40 -0
  1714. package/dist/src/utils/app-mobile-lint.js.map +1 -0
  1715. package/dist/src/utils/app-protect.d.ts +2 -0
  1716. package/dist/src/utils/app-protect.d.ts.map +1 -1
  1717. package/dist/src/utils/app-protect.js +3 -9
  1718. package/dist/src/utils/app-protect.js.map +1 -1
  1719. package/dist/src/utils/env-config/sections-node.js +4 -4
  1720. package/dist/src/utils/env-config/sections-node.js.map +1 -1
  1721. package/dist/src/utils/env-config/sections-platform.d.ts.map +1 -1
  1722. package/dist/src/utils/env-config/sections-platform.js +0 -11
  1723. package/dist/src/utils/env-config/sections-platform.js.map +1 -1
  1724. package/dist/src/utils/env-validator.d.ts.map +1 -1
  1725. package/dist/src/utils/env-validator.js +10 -6
  1726. package/dist/src/utils/env-validator.js.map +1 -1
  1727. package/dist/src/utils/html-inject.d.ts +23 -0
  1728. package/dist/src/utils/html-inject.d.ts.map +1 -0
  1729. package/dist/src/utils/html-inject.js +42 -0
  1730. package/dist/src/utils/html-inject.js.map +1 -0
  1731. package/dist/src/utils/node-descriptor.d.ts.map +1 -1
  1732. package/dist/src/utils/node-descriptor.js +0 -1
  1733. package/dist/src/utils/node-descriptor.js.map +1 -1
  1734. package/dist/static/app-catalog/_template.html +27 -77
  1735. package/dist/static/app-catalog/js/app-agents.js +232 -0
  1736. package/dist/static/app-catalog/js/apps-io.js +51 -165
  1737. package/dist/static/app-catalog/js/cortex.js +114 -0
  1738. package/dist/static/app-catalog/js/cost.js +100 -0
  1739. package/dist/static/app-catalog/js/db.js +23 -93
  1740. package/dist/static/app-catalog/js/detail.js +196 -24
  1741. package/dist/static/app-catalog/js/favorites.js +71 -0
  1742. package/dist/static/app-catalog/js/i18n-data.js +168 -16
  1743. package/dist/static/app-catalog/js/main.js +29 -103
  1744. package/dist/static/app-catalog/js/migrate.js +88 -0
  1745. package/dist/static/app-catalog/js/monetize.js +1 -1
  1746. package/dist/static/app-catalog/js/promote.js +70 -0
  1747. package/dist/static/app-catalog/js/render.js +56 -150
  1748. package/dist/static/app-catalog/js/server-io.js +126 -214
  1749. package/dist/static/app-catalog/js/settings.js +11 -204
  1750. package/dist/static/app-catalog/styles/app-catalog.css +136 -9
  1751. package/dist/static/app-catalog.html +1364 -976
  1752. package/dist/static/sdk-libs/_core/config.js +52 -0
  1753. package/dist/static/sdk-libs/_core/http.js +52 -0
  1754. package/dist/static/sdk-libs/_core/namespace.js +33 -0
  1755. package/dist/static/sdk-libs/_core/sdk-globals.d.ts +50 -0
  1756. package/dist/static/sdk-libs/_core/session.js +66 -0
  1757. package/dist/static/sdk-libs/agentface/index.js +102 -0
  1758. package/dist/static/sdk-libs/agents/index.js +267 -0
  1759. package/dist/static/sdk-libs/ai/index.js +153 -0
  1760. package/dist/static/sdk-libs/audio/core.js +111 -0
  1761. package/dist/static/sdk-libs/audio/index.js +380 -0
  1762. package/dist/static/sdk-libs/audio/instruments.js +369 -0
  1763. package/dist/static/sdk-libs/auth/config.js +46 -0
  1764. package/dist/static/sdk-libs/auth/crypto.js +166 -0
  1765. package/dist/static/sdk-libs/auth/events.js +27 -0
  1766. package/dist/static/sdk-libs/auth/i18n.js +64 -0
  1767. package/dist/static/sdk-libs/auth/index.js +37 -0
  1768. package/dist/static/sdk-libs/auth/modal.js +545 -0
  1769. package/dist/static/sdk-libs/auth/pill.js +167 -0
  1770. package/dist/static/sdk-libs/auth/session.js +792 -0
  1771. package/dist/static/sdk-libs/auth/signup.js +232 -0
  1772. package/dist/static/sdk-libs/auth/theme.js +96 -0
  1773. package/dist/static/sdk-libs/capabilities/index.js +179 -0
  1774. package/dist/static/sdk-libs/commerce/index.js +243 -0
  1775. package/dist/static/sdk-libs/data/index.js +188 -0
  1776. package/dist/static/sdk-libs/dist/aimeat-agentface.js +91 -0
  1777. package/dist/static/sdk-libs/dist/aimeat-agents.js +315 -0
  1778. package/dist/static/sdk-libs/dist/aimeat-ai.js +168 -0
  1779. package/dist/static/sdk-libs/dist/aimeat-audio.js +979 -0
  1780. package/dist/static/sdk-libs/dist/aimeat-auth.js +1831 -0
  1781. package/dist/static/sdk-libs/dist/aimeat-capabilities.js +177 -0
  1782. package/dist/static/sdk-libs/dist/aimeat-commerce.js +265 -0
  1783. package/dist/static/sdk-libs/dist/aimeat-data.js +205 -0
  1784. package/dist/static/sdk-libs/dist/aimeat-editor.js +299 -0
  1785. package/dist/static/sdk-libs/dist/aimeat-header.js +270 -0
  1786. package/dist/static/sdk-libs/dist/aimeat-intake.js +94 -0
  1787. package/dist/static/sdk-libs/dist/aimeat-live.js +265 -0
  1788. package/dist/static/sdk-libs/dist/aimeat-markdown.js +602 -0
  1789. package/dist/static/sdk-libs/dist/aimeat-organism.js +394 -0
  1790. package/dist/static/sdk-libs/dist/aimeat-portfolio-standalone.js +90 -0
  1791. package/dist/static/sdk-libs/dist/aimeat-social.js +157 -0
  1792. package/dist/static/sdk-libs/dist/aimeat-speech.js +300 -0
  1793. package/dist/static/sdk-libs/dist/aimeat-storage.js +210 -0
  1794. package/dist/static/sdk-libs/dist/aimeat-tunnel.js +383 -0
  1795. package/dist/static/sdk-libs/dist/aimeat-wallet.js +118 -0
  1796. package/dist/static/sdk-libs/dist/aimeat-webmcp.js +187 -0
  1797. package/dist/static/sdk-libs/dist/aimeat-work.js +213 -0
  1798. package/dist/static/sdk-libs/dist/aimeat-workflows.js +147 -0
  1799. package/dist/static/sdk-libs/editor/index.js +229 -0
  1800. package/dist/static/sdk-libs/header/index.js +249 -0
  1801. package/dist/static/sdk-libs/intake/index.js +75 -0
  1802. package/dist/static/sdk-libs/live/index.js +156 -0
  1803. package/dist/static/sdk-libs/markdown/index.js +522 -0
  1804. package/dist/static/sdk-libs/organism/index.js +381 -0
  1805. package/dist/static/sdk-libs/portfolio-standalone/index.js +78 -0
  1806. package/dist/static/sdk-libs/social/index.js +140 -0
  1807. package/dist/static/sdk-libs/speech/index.js +321 -0
  1808. package/dist/static/sdk-libs/storage/index.js +189 -0
  1809. package/dist/static/sdk-libs/tunnel/index.js +428 -0
  1810. package/dist/static/sdk-libs/wallet/index.js +115 -0
  1811. package/dist/static/sdk-libs/webmcp/index.js +185 -0
  1812. package/dist/static/sdk-libs/work/index.js +191 -0
  1813. package/dist/static/sdk-libs/workflows/index.js +113 -0
  1814. package/package.json +23 -21
  1815. package/prisma/schema.postgres.prisma +0 -1789
  1816. package/prisma/schema.prisma +0 -1787
@@ -2,9 +2,10 @@
2
2
  <!DOCTYPE html>
3
3
  <!--
4
4
  @file src/static/app-catalog.html
5
- @description Self-contained "My Apps" launcher SPA (IndexedDB-backed) for installing,
6
- publishing, and running user apps. Runs published app HTML only inside a sandboxed,
7
- opaque-origin iframe never as a top-level document on the apex origin (H-2).
5
+ @description Self-contained "My Apps" launcher SPA (SERVER-ONLY — no browser persistence) for
6
+ creating, publishing, and managing the owner's server apps. Creating an app publishes it to the
7
+ server (unlisted); nothing is stored in the browser. Runs published app HTML only inside a
8
+ sandboxed, opaque-origin iframe — never as a top-level document on the apex origin (H-2).
8
9
  @structure Inline <style> theme; markup; large inline <script> exposing window._launcher.
9
10
  @usage Served at GET /app-catalog.html (relaxed CSP) from server-bootstrap/static-files.ts.
10
11
  @version-history
@@ -116,6 +117,15 @@
116
117
  (text-align: justify + text-align-last: center) so a wrapped description reads flush instead
117
118
  of showing the ragged "sahalaita" the centered card produced; short single-line sources stay
118
119
  centered. Adds overflow-wrap/hyphens so long words no longer spill past the card edge.
120
+ v2.15.0 — 2026-07-16 — Card layout pass: clamp .app-source to 4 lines (long descriptions no
121
+ longer overflow), pin .app-actions to the card bottom + always-visible (buttons stop
122
+ "hyppelehtii"), retire the .st-server badge, add the purple .app-staging-badge pill +
123
+ .act-staging "Open staging" button styling.
124
+ v2.15.1 — 2026-07-18 — Fix the "Bundled agents" modal (Inspect & deploy) rendering inline at the
125
+ bottom of the page instead of as a centered overlay: #agents-overlay was missing from the shared
126
+ overlay-wrapper rule (position:fixed/inset:0/z-index/backdrop) and its [hidden] display:none
127
+ counterpart, so it had no modal styling at all — same class of miss as #lineage/#protection in
128
+ v2.9.1. Added #agents-overlay to both selector lists.
119
129
  -->
120
130
  <html lang="en">
121
131
  <head>
@@ -532,18 +542,28 @@
532
542
  text-align-last: center;
533
543
  overflow-wrap: break-word;
534
544
  hyphens: auto;
545
+ /* Clamp to a few lines so a long description (e.g. TELETYPE) never spills
546
+ past the card or shoves the action row around — every card stays uniform
547
+ and the buttons keep a fixed home at the bottom. */
548
+ display: -webkit-box;
549
+ -webkit-line-clamp: 4;
550
+ line-clamp: 4;
551
+ -webkit-box-orient: vertical;
552
+ overflow: hidden;
553
+ max-width: 100%;
535
554
  }
536
555
 
556
+ /* Actions live at the BOTTOM of every card (margin-top:auto) and are always
557
+ visible — not hover-revealed — so the buttons never jump around or feel
558
+ "hyppelehtii". flex-wrap keeps the released/staging pair tidy on a narrow card. */
537
559
  .app-card .app-actions {
538
560
  display: flex;
561
+ flex-wrap: wrap;
562
+ justify-content: center;
539
563
  gap: 6px;
540
- margin-top: 4px;
541
- opacity: 0;
542
- transition: opacity var(--transition);
543
- }
544
-
545
- .app-card:hover .app-actions {
546
- opacity: 1;
564
+ margin-top: auto;
565
+ padding-top: 8px;
566
+ width: 100%;
547
567
  }
548
568
 
549
569
  .app-card .app-actions button {
@@ -579,6 +599,46 @@
579
599
  opacity: 1;
580
600
  }
581
601
 
602
+ /* ── Server-backed favourite toggle (⭐ on any app / published card) ─── */
603
+ .fav-toggle {
604
+ position: absolute;
605
+ top: 6px;
606
+ left: 8px;
607
+ background: none;
608
+ border: none;
609
+ cursor: pointer;
610
+ font-size: 1rem;
611
+ line-height: 1;
612
+ padding: 2px;
613
+ opacity: .5;
614
+ transition: opacity var(--transition), transform var(--transition);
615
+ z-index: 2;
616
+ }
617
+ .fav-toggle:hover { opacity: 1; transform: scale(1.15); }
618
+ .fav-toggle.on { opacity: 1; }
619
+ .published-card { position: relative; }
620
+ .published-card .fav-toggle { left: auto; right: 8px; top: 8px; }
621
+ .fav-section-title {
622
+ font-size: 1rem;
623
+ font-weight: 700;
624
+ color: var(--text);
625
+ display: flex;
626
+ align-items: center;
627
+ gap: 8px;
628
+ margin: 0 0 .6rem;
629
+ }
630
+ .fav-section-count { opacity: .6; font-weight: 400; }
631
+
632
+ /* "Promoted" badge in the detail Promote section */
633
+ .dtl-badge-on {
634
+ font-size: .7rem;
635
+ font-weight: 600;
636
+ color: #34d399;
637
+ border: 1px solid #34d399;
638
+ border-radius: 10px;
639
+ padding: 1px 8px;
640
+ }
641
+
582
642
  /* ── Card Menu Button ─────────────────────────────── */
583
643
 
584
644
  .card-menu-btn {
@@ -1501,6 +1561,7 @@
1501
1561
  #json-import-overlay,
1502
1562
  #lineage-overlay,
1503
1563
  #confirm-overlay,
1564
+ #agents-overlay,
1504
1565
  #protection-overlay {
1505
1566
  position: fixed;
1506
1567
  inset: 0;
@@ -1526,6 +1587,7 @@
1526
1587
  #json-import-overlay[hidden],
1527
1588
  #lineage-overlay[hidden],
1528
1589
  #confirm-overlay[hidden],
1590
+ #agents-overlay[hidden],
1529
1591
  #protection-overlay[hidden] {
1530
1592
  display: none;
1531
1593
  }
@@ -2063,22 +2125,82 @@
2063
2125
  }
2064
2126
  .app-status-badge.st-published { color: #0e9f6e; border-color: #0e9f6e55; }
2065
2127
  .app-status-badge.st-parked { color: #d97706; border-color: #d9770655; }
2066
- .app-status-badge.st-server { color: #3b82f6; border-color: #3b82f655; }
2067
2128
  .app-card.server-only .app-icon { background: var(--bg-subtle); }
2068
- </style>
2129
+
2130
+ /* Staging pill: an owner-only marker that this app has an UNPUBLISHED draft
2131
+ waiting alongside the live version. Purple so it reads as distinct from the
2132
+ green "Listed" / amber "Unlisted" publication-state badges. Sits just under
2133
+ the status badge (top-left, second row). */
2134
+ .app-staging-badge {
2135
+ position: absolute;
2136
+ top: 30px;
2137
+ left: 8px;
2138
+ z-index: 2;
2139
+ font-size: .58rem;
2140
+ font-weight: 700;
2141
+ letter-spacing: .02em;
2142
+ padding: 2px 7px;
2143
+ border-radius: 999px;
2144
+ background: color-mix(in srgb, #7c3aed 12%, var(--surface));
2145
+ color: #7c3aed;
2146
+ border: 1px solid #7c3aed55;
2147
+ }
2148
+
2149
+ /* The "Open staging" action mirrors the staging pill's accent so the two read
2150
+ as the same concept. */
2151
+ .app-card .app-actions button.act-staging {
2152
+ color: #7c3aed;
2153
+ border-color: #7c3aed55;
2154
+ }
2155
+ .app-card .app-actions button.act-staging:hover {
2156
+ border-color: #7c3aed;
2157
+ background: color-mix(in srgb, #7c3aed 10%, transparent);
2158
+ color: #7c3aed;
2159
+ }
2160
+
2161
+ /* Prompt-builder capability-pack picker (Library Acceleration Program, Phase 4) */
2162
+ .pb-packs { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; }
2163
+ .pb-pack-item { display: inline-flex; align-items: center; gap: 6px; padding: 5px 10px; border: 1px solid var(--border); border-radius: 999px; background: var(--card); font-size: 13px; cursor: pointer; user-select: none; }
2164
+ .pb-pack-item:hover { border-color: var(--accent); }
2165
+ .pb-pack-item input { accent-color: var(--accent); margin: 0; }
2166
+ .pb-pack-item:has(input:checked) { border-color: var(--accent); background: color-mix(in srgb, var(--accent) 12%, var(--card)); }
2167
+ /* AEB reliability-tier badge on each pack (tools/aeb/acceleration-tiers.md). */
2168
+ .pb-pack-tier { font-size: 10px; text-transform: uppercase; letter-spacing: .03em; padding: 1px 5px; border-radius: 999px; background: color-mix(in srgb, var(--text-muted) 15%, transparent); color: var(--text-muted); font-weight: 600; cursor: help; }
2169
+ .pb-pack-tier.pb-tier-frontier { background: color-mix(in srgb, var(--accent) 20%, transparent); color: var(--accent); }
2170
+
2171
+ /* ── Bundled-agents modal (Agent-Bundled Apps) — inspector, hosted instances, deploy form ── */
2172
+ .aga-app-ref { font-size: .78rem; color: var(--text-muted); font-weight: normal; margin-left: 6px; }
2173
+ .aga-body { max-height: 62vh; overflow-y: auto; font-size: .88rem; }
2174
+ .aga-intro { font-size: .82rem; color: var(--text-muted); margin-bottom: 10px; }
2175
+ .aga-def { border: 1px solid var(--border); border-radius: 10px; padding: 12px; margin-bottom: 12px; background: var(--card); }
2176
+ .aga-def h3 { margin: 0 0 8px; font-size: 1rem; }
2177
+ .aga-label { font-weight: 600; font-size: .8rem; margin: 10px 0 4px; color: var(--text-muted); text-transform: uppercase; letter-spacing: .03em; }
2178
+ .aga-goal { color: var(--text-muted); font-size: .82rem; }
2179
+ .aga-crew-row { margin: 4px 0; }
2180
+ .aga-chips { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 3px; }
2181
+ .aga-chip { display: inline-block; padding: 1px 8px; border: 1px solid var(--border); border-radius: 999px; font-size: .72rem; color: var(--text-muted); background: var(--card); }
2182
+ .aga-chip-skill { border-color: var(--accent); color: var(--accent); }
2183
+ .aga-tasks { margin: 4px 0 0 18px; padding: 0; }
2184
+ .aga-tasks li { margin: 3px 0; }
2185
+ .aga-inst { border: 1px solid var(--border); border-radius: 8px; padding: 8px 10px; margin: 6px 0; }
2186
+ .aga-inst-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
2187
+ .aga-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--border); flex: none; }
2188
+ .aga-dot-on { background: #22c55e; }
2189
+ .aga-offer { display: flex; justify-content: space-between; gap: 10px; margin-top: 4px; font-size: .84rem; flex-wrap: wrap; }
2190
+ .aga-price { color: var(--accent); font-weight: 600; white-space: nowrap; }
2191
+ .aga-deploy-row { display: flex; gap: 10px; align-items: flex-end; flex-wrap: wrap; margin: 6px 0; }
2192
+ .aga-deploy-row label { display: flex; flex-direction: column; gap: 3px; font-size: .78rem; color: var(--text-muted); }
2193
+ .aga-select { min-width: 160px; padding: 5px 8px; }
2194
+ .aga-deploy-btn { white-space: nowrap; }
2195
+ .aga-btn-sm { padding: 2px 10px; font-size: .75rem; margin-left: auto; }
2196
+ .published-card-badgerow .pcb-agent { cursor: default; }
2197
+ </style>
2069
2198
  </head>
2070
2199
  <body data-active-view="library">
2071
2200
 
2072
2201
  <header>
2073
2202
  <a class="aimeat-cta aimeat-home" id="aimeat-home-link" href="/" data-i18n-title="cta.backHome" title="Back to home"><span class="aimeat-cta-spark">⚡</span><span id="aimeat-home-label">aimeat.io</span></a>
2074
2203
  <h1 data-i18n="header.title">My Apps</h1>
2075
- <div class="mode-toggle-wrap">
2076
- <span class="mode-caption" data-i18n="mode.caption" data-i18n-title="mode.caption.title" title="These toggle which browser-local apps you see — not server visibility">Local apps</span>
2077
- <div class="mode-toggle">
2078
- <button id="mode-global" class="mode-btn active" onclick="window._launcher.switchDbMode('global')" data-i18n="mode.global" data-i18n-title="mode.global.title" title="Shared across all accounts on this browser">&#x1F310; Shared</button>
2079
- <button id="mode-personal" class="mode-btn" onclick="window._launcher.switchDbMode('personal')" data-i18n="mode.personal" data-i18n-title="mode.personal.title" title="Private to your account">&#x1F464; Mine</button>
2080
- </div>
2081
- </div>
2082
2204
  <input type="text" id="search-input" placeholder="Search apps..." data-i18n-ph="search.ph" autocomplete="off" spellcheck="false"/>
2083
2205
  <div class="header-actions">
2084
2206
  <span id="headerAuth" class="header-auth-pill"></span>
@@ -2179,10 +2301,10 @@
2179
2301
  <p class="view-empty-hint" data-i18n="view.communityHint">Community apps are apps other people on this node have published. When someone publishes one, it shows up here.</p>
2180
2302
  </div>
2181
2303
 
2182
- <!-- Recently Opened Strip -->
2183
- <div id="recent-section" data-view="library" style="display:none;margin:0 24px 1rem">
2184
- <h3 style="margin:0 0 .5rem;font-size:.9rem;color:var(--text-muted)" data-i18n="sec.recent">&#x1F552; Recently Opened</h3>
2185
- <div id="recent-strip" style="display:flex;gap:.75rem;overflow-x:auto;padding-bottom:.5rem"></div>
2304
+ <!-- Favourites group (Library) — apps the owner favourited, pinned above "Your apps" -->
2305
+ <div id="favorites-section" data-view="library" style="display:none;margin:0 24px 1rem">
2306
+ <h2 class="fav-section-title"><span data-i18n="fav.title">⭐ Favourites</span> <span id="favorites-count" class="fav-section-count"></span></h2>
2307
+ <div id="favorites-grid" class="published-grid"></div>
2186
2308
  </div>
2187
2309
 
2188
2310
  <div id="local-apps-block" class="local-apps-block" data-view="library">
@@ -2203,18 +2325,10 @@
2203
2325
  <div class="modal" id="add-app-modal">
2204
2326
  <h2 id="modal-title" data-i18n="addModal.title">Add App</h2>
2205
2327
 
2206
- <!-- Source tabs -->
2328
+ <!-- Source tabs — server-only: paste HTML or upload an HTML/ZIP file; it publishes to your account. -->
2207
2329
  <div class="modal-tabs">
2208
- <button class="modal-tab active" data-tab="url" data-i18n="tab.url">URL</button>
2330
+ <button class="modal-tab active" data-tab="paste" data-i18n="tab.paste">Paste</button>
2209
2331
  <button class="modal-tab" data-tab="file" data-i18n="tab.file">File</button>
2210
- <button class="modal-tab" data-tab="paste" data-i18n="tab.paste">Paste</button>
2211
- <button class="modal-tab" data-tab="aimeat" data-i18n="tab.aimeat">AIMEAT</button>
2212
- </div>
2213
-
2214
- <!-- URL tab content -->
2215
- <div class="tab-content active" id="tab-url">
2216
- <label class="modal-label" for="app-url" data-i18n="addModal.url">App URL</label>
2217
- <input type="url" id="app-url" class="modal-input" placeholder="https://example.com/app.html" autocomplete="off"/>
2218
2332
  </div>
2219
2333
 
2220
2334
  <!-- File tab content -->
@@ -2230,22 +2344,12 @@
2230
2344
  </div>
2231
2345
  </div>
2232
2346
 
2233
- <!-- Paste tab content -->
2234
- <div class="tab-content" id="tab-paste">
2347
+ <!-- Paste tab content (default) -->
2348
+ <div class="tab-content active" id="tab-paste">
2235
2349
  <label class="modal-label" for="app-paste-code" data-i18n="addModal.paste">Paste HTML Source Code</label>
2236
2350
  <textarea id="app-paste-code" class="modal-input" rows="10" placeholder="Paste your HTML source code here..." data-i18n-ph="addModal.pastePh" style="font-family:'Consolas','Monaco','Courier New',monospace;font-size:.8rem;resize:vertical;min-height:160px;line-height:1.4"></textarea>
2237
2351
  </div>
2238
2352
 
2239
- <!-- AIMEAT tab content -->
2240
- <div class="tab-content" id="tab-aimeat">
2241
- <p style="font-size:.85rem;color:var(--text-muted);margin-bottom:14px;line-height:1.5" data-i18n="addModal.aimeatHelp">
2242
- Import apps from a connected AIMEAT server. Configure the server URL in Settings first.
2243
- </p>
2244
- <button type="button" class="modal-btn primary" onclick="window._launcher.importFromAimeat()" style="width:100%" data-i18n="addModal.fetch">
2245
- Fetch Available Apps
2246
- </button>
2247
- </div>
2248
-
2249
2353
  <!-- Common fields -->
2250
2354
  <div class="modal-fields">
2251
2355
  <div class="modal-row">
@@ -2380,21 +2484,6 @@
2380
2484
  </div>
2381
2485
  </div>
2382
2486
 
2383
- <div class="settings-section">
2384
- <div class="settings-section-title" data-i18n="settings.backup">Backup &amp; Restore</div>
2385
- <div class="settings-backup-actions">
2386
- <button type="button" class="modal-btn secondary" onclick="window._launcher.exportBackup()" data-i18n="settings.exportJson">Export JSON</button>
2387
- <button type="button" class="modal-btn secondary" onclick="document.getElementById('import-file-input').click()" data-i18n="settings.importJson">Import JSON</button>
2388
- <button type="button" class="modal-btn secondary" onclick="window._launcher.removeDuplicateApps()" data-i18n="dedup.btn">&#x1F9F9; Remove duplicate apps</button>
2389
- <input type="file" id="import-file-input" accept=".json" hidden/>
2390
- </div>
2391
- </div>
2392
-
2393
- <div class="settings-section" style="margin-bottom:0">
2394
- <div class="settings-section-title" data-i18n="settings.danger">Danger Zone</div>
2395
- <button type="button" class="modal-btn danger" onclick="window._launcher.clearAllData()" data-i18n="settings.clearAll">Clear All Data</button>
2396
- </div>
2397
-
2398
2487
  <div class="modal-actions" style="margin-top:24px">
2399
2488
  <button type="button" class="modal-btn secondary" id="settings-cancel-btn" data-i18n="common.cancel">Cancel</button>
2400
2489
  <button type="button" class="modal-btn primary" id="settings-save-btn" data-i18n="common.save">Save</button>
@@ -2421,18 +2510,6 @@
2421
2510
  </div>
2422
2511
  </div>
2423
2512
 
2424
- <!-- AIMEAT Import Dialog (dynamically populated) -->
2425
- <div id="aimeat-import-overlay" hidden>
2426
- <div class="modal" id="aimeat-import-modal">
2427
- <h2 data-i18n="import.title">Import from AIMEAT</h2>
2428
- <div class="aimeat-app-list" id="aimeat-app-list"></div>
2429
- <div class="modal-actions">
2430
- <button type="button" class="modal-btn secondary" onclick="document.getElementById('aimeat-import-overlay').hidden = true" data-i18n="common.cancel">Cancel</button>
2431
- <button type="button" class="modal-btn primary" onclick="window._launcher.processAimeatImport()" data-i18n="import.selected">Import Selected</button>
2432
- </div>
2433
- </div>
2434
- </div>
2435
-
2436
2513
  <!-- Publish Modal -->
2437
2514
  <div id="publish-overlay" hidden>
2438
2515
  <div class="modal" id="publish-modal">
@@ -2460,20 +2537,6 @@
2460
2537
  </div>
2461
2538
  </div>
2462
2539
 
2463
- <!-- JSON Backup Import Modal (user-selected, duplicate-aware) -->
2464
- <div id="json-import-overlay" hidden>
2465
- <div class="modal" id="json-import-modal">
2466
- <h2 data-i18n="jsonImport.title">&#x1F4E5; Import JSON backup</h2>
2467
- <div id="json-import-status" style="margin:4px 0;font-size:.85rem;min-height:1.1em"></div>
2468
- <div id="json-import-body" style="overflow-y:auto;max-height:55vh"></div>
2469
- <div class="modal-actions">
2470
- <button type="button" class="modal-btn secondary" onclick="document.getElementById('json-import-overlay').hidden = true" data-i18n="common.cancel">Cancel</button>
2471
- <button type="button" class="modal-btn primary" id="json-import-btn" onclick="window._launcher.submitJsonImport()" data-i18n="srvImport.import">Import selected</button>
2472
- </div>
2473
- </div>
2474
- </div>
2475
-
2476
-
2477
2540
  <!-- Backup Import Modal -->
2478
2541
  <div id="backup-overlay" hidden>
2479
2542
  <div class="modal" id="backup-modal">
@@ -2533,6 +2596,18 @@
2533
2596
  </div>
2534
2597
  </div>
2535
2598
 
2599
+ <!-- Bundled-agents modal (Agent-Bundled Apps): crew-def inspector + hosted instances with
2600
+ public offer prices + "deploy your own" (runner/organism pickers) onto the owner's fleet -->
2601
+ <div id="agents-overlay" hidden>
2602
+ <div class="modal" id="agents-modal">
2603
+ <h2>&#x1F916; <span data-i18n="agents.title">Bundled agents</span> <span id="agents-modal-app" class="aga-app-ref"></span></h2>
2604
+ <div id="agents-modal-body" class="aga-body"></div>
2605
+ <div class="modal-actions">
2606
+ <button type="button" class="modal-btn secondary" onclick="document.getElementById('agents-overlay').hidden = true" data-i18n="common.close">Close</button>
2607
+ </div>
2608
+ </div>
2609
+ </div>
2610
+
2536
2611
  <!-- Copy-protection modal: opt-in per-app flags applied to the runnable HTML at serve time -->
2537
2612
  <div id="protection-overlay" hidden>
2538
2613
  <div class="modal" id="protection-modal">
@@ -2567,6 +2642,9 @@
2567
2642
  <textarea class="pb-desc-area" id="pb-description" placeholder="Describe what the app should do..." data-i18n-ph="pb.descPh"></textarea>
2568
2643
  <label class="pb-ext-toggle" for="pb-template"><span>&#x2728; <span data-i18n="pb.template">Start from a template (optional)</span></span></label>
2569
2644
  <select id="pb-template" class="modal-input pb-template-select"><option value="">(none &#x2014; build from scratch)</option></select>
2645
+ <div class="pb-ext-toggle"><span>&#x1F9F0; <span data-i18n="pb.packs">Capability packs (optional)</span></span></div>
2646
+ <p class="pb-step-hint" data-i18n="pb.packsHint">Charts, editable flow diagrams, games, 3D… — self-hosted libraries with AI instructions baked into the prompt. Your idea text pre-selects matching packs.</p>
2647
+ <div class="pb-packs" id="pb-packs"></div>
2570
2648
  </div>
2571
2649
 
2572
2650
  <div class="pb-step">
@@ -2614,14 +2692,14 @@
2614
2692
  "action.settings": "Settings",
2615
2693
  "action.help": "Help",
2616
2694
  "help.title": "❓ How this catalog works",
2617
- "help.modesTitle": "Shared vs Mine (browser-local apps)",
2618
- "help.modes": 'The header toggle picks which BROWSER-LOCAL apps you see it is NOT about server visibility. "Shared" = local apps visible to every account signed in on this browser; "Mine" = local apps private to your account (needs you to be signed in). Your published/server apps are unaffected either way.',
2695
+ "help.modesTitle": "Creating an app",
2696
+ "help.modes": "Add app lets you paste HTML or upload an HTML/ZIP file (or Generate with AI). It publishes straight to your account as UNLISTED on the server but not yet public so you can review it before listing. Nothing is stored only in your browser.",
2619
2697
  "help.whereTitle": "Where your apps live",
2620
- "help.where": "Local apps live only in this browser (IndexedDB)they don't follow you to another browser or device. Publish an app to put it on the server, then you can manage it from anywhere. Each app shows as ONE card with a badge saying where it lives.",
2698
+ "help.where": "Every app lives on the server under your account the catalog is server-only, so nothing is kept in this browser. Your apps follow you to any browser or device automatically.",
2621
2699
  "help.sectionsTitle": "The two views",
2622
- "help.sections": "Two tabs. Library = your apps (local + on the server), each as one card with a status badge Local (this browser), Listed (public on the server), Unlisted (on the server but hidden from the catalogue, still usable by you and anyone with the link), or Server only (no local copy). Community = apps other people have published.",
2700
+ "help.sections": "Two tabs. Library = your apps, each as one card whose badge shows its publication state Listed (public in the catalogue) or Unlisted (on the server but hidden from the catalogue, still usable by you and anyone with the link). A purple Staging pill marks an app that also has an unpublished draft waiting. Community = apps other people have published.",
2623
2701
  "help.backupTitle": '"Backup" means two different things',
2624
- "help.backup": "The 💾 menu (top bar) exports/imports your SERVER apps + extensions as a .zip. Settings Export/Import JSON backs up this browser's LOCAL catalog. They are separate.",
2702
+ "help.backup": "The 💾 menu (top bar) exports/imports your SERVER apps + extensions as a .zip a full server-side backup you can restore selectively.",
2625
2703
  "help.standaloneTitle": "Which node this talks to",
2626
2704
  "help.standalone": "This catalog is served by its node and always talks to that node (same-origin) — the Server URL in Settings is fixed to it. To use your own, open /app-catalog.html on your node: localhost, aimeat-desktop, and federated nodes each serve their OWN catalog.",
2627
2705
  "action.theme": "Toggle light / dark",
@@ -2656,8 +2734,11 @@
2656
2734
  "sec.parkedBlurb": "Only you can see and use these — they stay usable but are hidden from the public catalogue. Press Publish to move one back to Published Apps.",
2657
2735
  "sec.recent": "🕒 Recently Opened",
2658
2736
  "sec.local": "📚 Your apps",
2659
- "sec.localNote": "One card per app. The badge shows where it livesLocal (this browser), Published (on the server), Parked (hidden from the public catalogue), or Server only (no local copy).",
2660
- "sec.localHint": "💡 Publish a local app to put it on the server then you can manage it from anywhere.",
2737
+ "sec.localNote": "One card per app. The badge shows its publication stateListed (public in the catalogue) or Unlisted (on the server but hidden from the public catalogue). A purple Staging pill marks an app that also has an unpublished draft.",
2738
+ "sec.localHint": "💡 Add app publishes to your account as unlistedlist it when it's ready to be public.",
2739
+ "fav.title": "⭐ Favourites",
2740
+ "fav.add": "Add to favourites",
2741
+ "fav.remove": "Remove from favourites",
2661
2742
  "stats.apps": "apps",
2662
2743
  "stats.stored": "stored",
2663
2744
  "addModal.title": "Add App",
@@ -2723,6 +2804,8 @@
2723
2804
  "publish.accessCodeHint": "4-64 chars. If set, only people with the code can download.",
2724
2805
  "publish.submit": "Publish",
2725
2806
  "publish.loginRequired": "Sign in to publish to AIMEAT. Anonymous publishing is disabled — use the Sign in button in the top bar.",
2807
+ "publish.savedUnlisted": "Saved — your app is on the server as unlisted. Open it and press List when you want it public.",
2808
+ "migrate.found": "You have {n} app(s) saved only in this browser from the old local catalog. The catalog is now server-only, so they no longer appear here. Download them as a JSON backup now? You can re-publish any you still want.",
2726
2809
  "auth.signIn": "❤️ Sign In",
2727
2810
  "auth.loggedIn": "logged in",
2728
2811
  "auth.logout": "Logout",
@@ -2738,6 +2821,8 @@
2738
2821
  "pb.step3": "Add & publish your app",
2739
2822
  "pb.step3hint": "Got the code or HTML file from the AI? Paste it (or upload the file) here — it goes live on your node and you get a shareable link.",
2740
2823
  "pb.template": "Start from a template (optional)",
2824
+ "pb.packs": "Capability packs (optional)",
2825
+ "pb.packsHint": "Charts, editable flow diagrams, games, 3D… — self-hosted libraries with AI instructions baked into the prompt. Your idea text pre-selects matching packs.",
2741
2826
  "pb.noneTemplate": "(none — build from scratch)",
2742
2827
  "pb.promptPreview": "Prompt preview",
2743
2828
  "pb.addBtn": "➕ Add your app — paste it or upload the file",
@@ -2752,6 +2837,12 @@
2752
2837
  "card.view": "Open",
2753
2838
  "card.open": "Open",
2754
2839
  "card.openHint": "Open this app",
2840
+ "card.openReleased": "Open released",
2841
+ "card.openReleasedHint": "Open the published (live) version",
2842
+ "card.openStaging": "Open staging",
2843
+ "card.openStagingHint": "Open the unpublished staging draft to test it — the live app is untouched",
2844
+ "card.stagingBadge": "Staging",
2845
+ "card.stagingHint": "This app has an unpublished staging draft waiting alongside the live version",
2755
2846
  "common.menu": "Menu",
2756
2847
  "status.local": "Local",
2757
2848
  "status.published": "Listed",
@@ -2774,6 +2865,37 @@
2774
2865
  "fork.failed": "Fork failed",
2775
2866
  "detail.forkedFrom": "⑂ Forked from",
2776
2867
  "card.forksHint": "View the fork lineage (who forked this, and where it came from)",
2868
+ "card.agent": "🤖 Agent",
2869
+ "card.agentHint": "This app ships its own agent - inspect it, use a hosted instance, or deploy your own",
2870
+ "agents.title": "Bundled agents",
2871
+ "agents.manage": "Inspect & deploy",
2872
+ "agents.none": "This app declares no bundled agents.",
2873
+ "agents.declares": "This app ships its own agent as a declarative crew definition. Use an instance someone already hosts (their prices below), or deploy your own copy onto your own fleet.",
2874
+ "agents.crew": "Crew",
2875
+ "agents.tasks": "Tasks",
2876
+ "agents.hostedTitle": "Hosted instances",
2877
+ "agents.hostedNone": "Nobody hosts this agent yet - deploy your own below and be the first.",
2878
+ "agents.hostedError": "Could not load hosted instances.",
2879
+ "agents.loading": "Loading…",
2880
+ "agents.you": "you",
2881
+ "agents.author": "author",
2882
+ "agents.trust": "trust",
2883
+ "agents.noOffers": "No public offers - contact the host to ask.",
2884
+ "agents.askPrice": "ask for price",
2885
+ "agents.instant": "instant",
2886
+ "agents.undeploy": "Undeploy",
2887
+ "agents.deployTitle": "Deploy your own",
2888
+ "agents.deployDesc": "Creates a deploy task on YOUR own runner agent (crew-forge). The fleet reads the crew definition from the app manifest and starts the agent under your account - it never runs on anyone else’s fleet.",
2889
+ "agents.runner": "Runner",
2890
+ "agents.organism": "Organism",
2891
+ "agents.deployBtn": "Deploy to my fleet",
2892
+ "agents.needLogin": "Sign in to deploy this agent onto your own fleet.",
2893
+ "agents.noRunner": "You have no runner agent yet. Connect a crew-forge (crewaimeat) from Profile → Agents first, then deploy.",
2894
+ "agents.noRunnerOption": "no agents - connect one first",
2895
+ "agents.deployFailed": "Deploy failed",
2896
+ "agents.deployStarted": "Deploy task started on your fleet",
2897
+ "agents.deployQueued": "Deploy task queued - start it from your agent’s Tasks",
2898
+ "agents.undeployQueued": "Undeploy task sent to your fleet",
2777
2899
  "lineage.title": "Fork lineage",
2778
2900
  "lineage.help": "Every app forked from this one (and where this one came from), with each fork's current status. The chain survives a fork being parked or deleted.",
2779
2901
  "lineage.loading": "Loading lineage…",
@@ -2812,6 +2934,24 @@
2812
2934
  "detail.iconLabel": "Icon (emoji)",
2813
2935
  "detail.tagsLabel": "Tags (comma separated)",
2814
2936
  "detail.descLabel": "Description",
2937
+ "detail.descEn": "Description (English)",
2938
+ "detail.descFi": "Description (Finnish)",
2939
+ "detail.translateEnFi": "Translate EN → FI",
2940
+ "detail.translateFiEn": "Translate FI → EN",
2941
+ "detail.translating": "Translating…",
2942
+ "detail.trDone": "Translated",
2943
+ "detail.trEmpty": "The AI returned nothing — try again.",
2944
+ "detail.trNeedSource": "Write the source-language description first.",
2945
+ "promote.title": "Promote",
2946
+ "promote.hint": "Showcase this app on your public profile with a short pitch. Fill English and/or Finnish; visitors see the one matching their language.",
2947
+ "promote.en": "Promotion text (English)",
2948
+ "promote.fi": "Promotion text (Finnish)",
2949
+ "promote.save": "Save promotion",
2950
+ "promote.remove": "Stop promoting",
2951
+ "promote.on": "Promoted",
2952
+ "promote.saving": "Saving…",
2953
+ "promote.saved": "Promoted on your profile.",
2954
+ "promote.removed": "No longer promoted.",
2815
2955
  "detail.renameHint": "The app link stays the same — only the displayed name and description change.",
2816
2956
  "detail.nameRequired": "Name cannot be empty.",
2817
2957
  "detail.descRequired": "Description cannot be empty.",
@@ -2886,6 +3026,20 @@
2886
3026
  "monetize.saved": "Tool manifest saved.",
2887
3027
  "monetize.saveFailed": "Saving the tool manifest failed",
2888
3028
  "monetize.needLogin": "Sign in to edit the tool manifest.",
3029
+ "cost.title": "📊 Cost & contracts — what this app sources",
3030
+ "cost.hint": "This app’s EXCHANGE contracts: durable metered entitlements it calls, with live spend against each budget and the platform rake. The per-call price comes from the provider; you set only the budget cap.",
3031
+ "cost.empty": "No EXCHANGE contracts yet — this app sources nothing priced.",
3032
+ "cost.summary": "{n} contract(s) · {spent} morsels spent · {calls} call(s)",
3033
+ "cost.capabilityCol": "Capability",
3034
+ "cost.providerCol": "Provider",
3035
+ "cost.priceCol": "Price / call",
3036
+ "cost.rakeCol": "Rake",
3037
+ "cost.budgetCol": "Budget (spent / cap)",
3038
+ "cost.stateCol": "State",
3039
+ "cost.uncapped": "uncapped",
3040
+ "cost.remaining": "{n} left",
3041
+ "cost.needLogin": "Sign in to view this app’s cost & contracts.",
3042
+ "cost.loadFailed": "Could not load cost & contracts",
2889
3043
  "detail.editAccess": "Access code",
2890
3044
  "detail.accessCodeHint": "Set or remove an optional code required to open this app.",
2891
3045
  "detail.accessCodeLabel": "Access code",
@@ -2982,7 +3136,7 @@
2982
3136
  "tag.favorites": "⭐ Favorites",
2983
3137
  "empty.noApps": "No apps yet",
2984
3138
  "empty.noAppsDesc": "Add your first app using the + button above",
2985
- "empty.formats": "Supports: HTML files, URLs, ZIP packages, AIMEAT imports",
3139
+ "empty.formats": "Supports: HTML files and ZIP packages",
2986
3140
  "empty.noMatch": "No matches",
2987
3141
  "empty.noMatchDesc": "No apps match the current filter. Try a different search term or tag."
2988
3142
  },
@@ -3005,14 +3159,14 @@
3005
3159
  "action.settings": "Asetukset",
3006
3160
  "action.help": "Ohje",
3007
3161
  "help.title": "❓ Miten tämä katalogi toimii",
3008
- "help.modesTitle": "Jaetut vs Omat (selain-paikalliset appit)",
3009
- "help.modes": 'Yläpalkin valitsin päättää mitkä SELAIN-PAIKALLISET appit näet se EI liity server-näkyvyyteen. "Jaetut" = paikalliset appit näkyvät kaikille tähän selaimeen kirjautuneille tileille; "Omat" = paikalliset appit yksityisiä tilillesi (vaatii sisäänkirjautumisen). Julkaistut/server-appisi eivät muutu kummassakaan.',
3162
+ "help.modesTitle": "Sovelluksen luominen",
3163
+ "help.modes": "Lisää sovellus antaa liittää HTML:ää tai ladata HTML/ZIP-tiedoston (tai luoda sen tekoälyllä). Se julkaistaan suoraan tilillesi EI LISTALLA palvelimelle mutta ei vielä julkiseksi joten voit tarkistaa sen ennen listaamista. Mitään ei tallenneta vain selaimeesi.",
3010
3164
  "help.whereTitle": "Missä appisi asuvat",
3011
- "help.where": "Paikalliset appit asuvat vain tässä selaimessa (IndexedDB) ne eivät seuraa toiseen selaimeen tai laitteeseen. Julkaise appi siirtääksesi sen palvelimelle, minkä jälkeen hallitset sitä mistä tahansa. Jokainen appi näkyy YHTENÄ korttina, jonka merkki kertoo missä se sijaitsee.",
3165
+ "help.where": "Jokainen sovellus sijaitsee palvelimella tililläsikatalogi on vain palvelinpohjainen, joten mitään ei säilytetä tässä selaimessa. Sovelluksesi seuraavat sinua mihin tahansa selaimeen tai laitteeseen automaattisesti.",
3012
3166
  "help.sectionsTitle": "Kaksi näkymää",
3013
- "help.sections": "Kaksi välilehteä. Kirjasto = sinun appisi (paikalliset + palvelimella), jokainen yhtenä korttina tilamerkillä Paikallinen (tämä selain), Listalla (julkinen palvelimella), Ei listalla (palvelimella mutta piilossa katalogista, sinä ja kuka tahansa linkillä voitte yhä käyttää), tai Vain serverillä (ei paikallista kopiota). Yhteisö = muiden julkaisemat appit.",
3167
+ "help.sections": "Kaksi välilehteä. Kirjasto = sinun appisi, jokainen yhtenä korttina jonka merkki kertoo julkaisutilan Listalla (näkyy julkisessa katalogissa) tai Ei listalla (palvelimella mutta piilossa katalogista, sinä ja kuka tahansa linkillä voitte yhä käyttää). Violetti Staging-merkki kertoo että apilla on myös julkaisematon luonnos odottamassa. Yhteisö = muiden julkaisemat appit.",
3014
3168
  "help.backupTitle": '"Varmuuskopio" tarkoittaa kahta eri asiaa',
3015
- "help.backup": "💾-valikko (yläpalkki) vie/tuo PALVELIN-appisi + laajennukset .zip-tiedostona. Asetukset Vie/Tuo JSON varmuuskopioi tämän selaimen PAIKALLISEN katalogin. Ne ovat erillisiä.",
3169
+ "help.backup": "💾-valikko (yläpalkki) vie/tuo PALVELIN-appisi + laajennukset .zip-tiedostona täysi palvelinpuolen varmuuskopio, jonka voit palauttaa valikoiden.",
3016
3170
  "help.standaloneTitle": "Mille nodelle tämä puhuu",
3017
3171
  "help.standalone": "Tämän katalogin tarjoilee sen node, ja se puhuu aina sille nodelle (same-origin) — Asetusten Palvelin-URL on kiinnitetty siihen. Käyttääksesi omaa: avaa /app-catalog.html omalla nodellasi. localhost, aimeat-desktop ja federoidut nodet tarjoilevat kukin OMAN kataloginsa.",
3018
3172
  "action.theme": "Vaihda vaalea / tumma",
@@ -3047,8 +3201,11 @@
3047
3201
  "sec.parkedBlurb": "Vain sinä näet ja voit käyttää näitä — ne pysyvät käytettävissä mutta eivät näy julkisessa katalogissa. Paina Julkaise siirtääksesi takaisin julkaistuihin.",
3048
3202
  "sec.recent": "🕒 Viimeksi avatut",
3049
3203
  "sec.local": "📚 Sinun sovelluksesi",
3050
- "sec.localNote": "Yksi kortti per sovellus. Merkki kertoo missä se sijaitsee Paikallinen (tässä selaimessa), Julkaistu (palvelimella), Parkissa (piilotettu julkisesta katalogista) tai Vain serverillä (ei paikallista kopiota).",
3051
- "sec.localHint": "💡 Julkaise paikallinen sovellus viedäksesi sen palvelimellesen jälkeen voit hallita sitä mistä tahansa.",
3204
+ "sec.localNote": "Yksi kortti per sovellus. Merkki kertoo julkaisutilanListalla (näkyy julkisessa katalogissa) tai Ei listalla (palvelimella mutta piilossa julkisesta katalogista). Violetti Staging-merkki kertoo että apilla on myös julkaisematon luonnos.",
3205
+ "sec.localHint": "💡 Lisää sovellus julkaisee tilillesi ei-listallalistaa se kun se on valmis julkiseksi.",
3206
+ "fav.title": "⭐ Suosikit",
3207
+ "fav.add": "Lisää suosikkeihin",
3208
+ "fav.remove": "Poista suosikeista",
3052
3209
  "stats.apps": "sovellusta",
3053
3210
  "stats.stored": "tallennettu",
3054
3211
  "addModal.title": "Lisää sovellus",
@@ -3114,6 +3271,8 @@
3114
3271
  "publish.accessCodeHint": "4–64 merkkiä. Jos asetettu, vain koodin tietävät voivat ladata.",
3115
3272
  "publish.submit": "Julkaise",
3116
3273
  "publish.loginRequired": "Kirjaudu sisään julkaistaksesi AIMEATiin. Anonyymi julkaisu on poistettu käytöstä — käytä yläpalkin Kirjaudu-painiketta.",
3274
+ "publish.savedUnlisted": "Tallennettu — sovelluksesi on palvelimella ei-listalla. Avaa se ja paina Listaa kun haluat sen julkiseksi.",
3275
+ "migrate.found": "Sinulla on {n} sovellus(ta) tallennettuna vain tähän selaimeen vanhasta paikallisesta katalogista. Katalogi on nyt vain palvelinpohjainen, joten ne eivät enää näy täällä. Ladataanko ne nyt JSON-varmuuskopiona? Voit julkaista uudelleen ne jotka haluat säilyttää.",
3117
3276
  "auth.signIn": "❤️ Kirjaudu",
3118
3277
  "auth.loggedIn": "kirjautunut",
3119
3278
  "auth.logout": "Kirjaudu ulos",
@@ -3129,6 +3288,8 @@
3129
3288
  "pb.step3": "Lisää & julkaise sovelluksesi",
3130
3289
  "pb.step3hint": "Saitko koodin tai HTML-tiedoston tekoälyltä? Liitä se (tai lataa tiedosto) tästä — se tulee live-tilaan solmuusi ja saat jaettavan linkin.",
3131
3290
  "pb.template": "Aloita mallipohjasta (valinnainen)",
3291
+ "pb.packs": "Kyvykkyyspaketit (valinnainen)",
3292
+ "pb.packsHint": "Kaaviot, muokattavat vuokaaviot, pelit, 3D… — itse isännöidyt kirjastot, joiden AI-ohjeet leivotaan promptiin. Ideatekstisi esivalitsee sopivat paketit.",
3132
3293
  "pb.noneTemplate": "(ei mitään — rakenna tyhjästä)",
3133
3294
  "pb.promptPreview": "Promptin esikatselu",
3134
3295
  "pb.addBtn": "➕ Lisää sovelluksesi — liitä se tai lataa tiedosto",
@@ -3143,6 +3304,12 @@
3143
3304
  "card.view": "Avaa",
3144
3305
  "card.open": "Avaa",
3145
3306
  "card.openHint": "Avaa tämä sovellus",
3307
+ "card.openReleased": "Avaa julkaistu",
3308
+ "card.openReleasedHint": "Avaa julkaistu (live) versio",
3309
+ "card.openStaging": "Avaa staging",
3310
+ "card.openStagingHint": "Avaa julkaisematon staging-luonnos testattavaksi — live-appi pysyy ennallaan",
3311
+ "card.stagingBadge": "Staging",
3312
+ "card.stagingHint": "Tällä sovelluksella on julkaisematon staging-luonnos odottamassa live-version rinnalla",
3146
3313
  "common.menu": "Valikko",
3147
3314
  "status.local": "Paikallinen",
3148
3315
  "status.published": "Listalla",
@@ -3165,6 +3332,37 @@
3165
3332
  "fork.failed": "Haaroitus epäonnistui",
3166
3333
  "detail.forkedFrom": "⑂ Haaroitettu kohteesta",
3167
3334
  "card.forksHint": "Näytä haaroitushistoria (kuka haaroitti ja mistä tämä on peräisin)",
3335
+ "card.agent": "🤖 Agentti",
3336
+ "card.agentHint": "Tämä sovellus tuo mukanaan oman agentin - tutki sitä, käytä valmiiksi ylläpidettyä tai ota käyttöön oma",
3337
+ "agents.title": "Mukana tulevat agentit",
3338
+ "agents.manage": "Tutki ja ota käyttöön",
3339
+ "agents.none": "Tämä sovellus ei määrittele mukana tulevia agentteja.",
3340
+ "agents.declares": "Sovellus tuo mukanaan oman agentin deklaratiivisena crew-määrityksenä. Käytä jonkun jo ylläpitämää instanssia (hinnat alla) tai ota oma kopio käyttöön omaan laivueeseesi.",
3341
+ "agents.crew": "Työryhmä",
3342
+ "agents.tasks": "Tehtävät",
3343
+ "agents.hostedTitle": "Ylläpidetyt instanssit",
3344
+ "agents.hostedNone": "Kukaan ei vielä ylläpidä tätä agenttia - ota omasi käyttöön alta ensimmäisenä.",
3345
+ "agents.hostedError": "Instanssien lataus epäonnistui.",
3346
+ "agents.loading": "Ladataan…",
3347
+ "agents.you": "sinä",
3348
+ "agents.author": "tekijä",
3349
+ "agents.trust": "luottamus",
3350
+ "agents.noOffers": "Ei julkisia tarjoomia - kysy ylläpitäjältä.",
3351
+ "agents.askPrice": "kysy hintaa",
3352
+ "agents.instant": "välitön",
3353
+ "agents.undeploy": "Poista käytöstä",
3354
+ "agents.deployTitle": "Ota oma käyttöön",
3355
+ "agents.deployDesc": "Luo käyttöönottotehtävän OMALLE ajoagentillesi (crew-forge). Laivue lukee crew-määrityksen sovelluksen manifestista ja käynnistää agentin sinun tilisi alle - se ei koskaan aja kenenkään muun laivueessa.",
3356
+ "agents.runner": "Ajoagentti",
3357
+ "agents.organism": "Organismi",
3358
+ "agents.deployBtn": "Ota käyttöön laivueeseeni",
3359
+ "agents.needLogin": "Kirjaudu sisään ottaaksesi agentin käyttöön omaan laivueeseesi.",
3360
+ "agents.noRunner": "Sinulla ei ole vielä ajoagenttia. Yhdistä crew-forge (crewaimeat) ensin: Profiili → Agentit.",
3361
+ "agents.noRunnerOption": "ei agentteja - yhdistä ensin",
3362
+ "agents.deployFailed": "Käyttöönotto epäonnistui",
3363
+ "agents.deployStarted": "Käyttöönottotehtävä käynnistyi laivueessasi",
3364
+ "agents.deployQueued": "Käyttöönottotehtävä jonossa - käynnistä se agentin Tehtävistä",
3365
+ "agents.undeployQueued": "Käytöstäpoistotehtävä lähetetty laivueellesi",
3168
3366
  "lineage.title": "Haaroitushistoria",
3169
3367
  "lineage.help": "Kaikki tästä haaroitetut sovellukset (ja mistä tämä on peräisin), kunkin haaran nykyinen tila. Ketju säilyy, vaikka haara parkitaan tai poistetaan.",
3170
3368
  "lineage.loading": "Ladataan historiaa…",
@@ -3203,6 +3401,24 @@
3203
3401
  "detail.iconLabel": "Kuvake (emoji)",
3204
3402
  "detail.tagsLabel": "Tunnisteet (pilkulla eroteltuna)",
3205
3403
  "detail.descLabel": "Kuvaus",
3404
+ "detail.descEn": "Kuvaus (englanti)",
3405
+ "detail.descFi": "Kuvaus (suomi)",
3406
+ "detail.translateEnFi": "Käännä EN → FI",
3407
+ "detail.translateFiEn": "Käännä FI → EN",
3408
+ "detail.translating": "Käännetään…",
3409
+ "detail.trDone": "Käännetty",
3410
+ "detail.trEmpty": "Tekoäly ei palauttanut mitään — yritä uudelleen.",
3411
+ "detail.trNeedSource": "Kirjoita ensin lähdekielinen kuvaus.",
3412
+ "promote.title": "Nosto",
3413
+ "promote.hint": "Nosta tämä sovellus julkiseen profiiliisi lyhyellä myyntipuheella. Täytä englanti ja/tai suomi; vierailijat näkevät kieltään vastaavan.",
3414
+ "promote.en": "Nostoteksti (englanti)",
3415
+ "promote.fi": "Nostoteksti (suomi)",
3416
+ "promote.save": "Tallenna nosto",
3417
+ "promote.remove": "Lopeta nostaminen",
3418
+ "promote.on": "Nostettu",
3419
+ "promote.saving": "Tallennetaan…",
3420
+ "promote.saved": "Nostettu profiiliisi.",
3421
+ "promote.removed": "Ei enää nostettu.",
3206
3422
  "detail.renameHint": "Sovelluksen linkki pysyy samana — vain näytettävä nimi ja kuvaus muuttuvat.",
3207
3423
  "detail.nameRequired": "Nimi ei voi olla tyhjä.",
3208
3424
  "detail.descRequired": "Kuvaus ei voi olla tyhjä.",
@@ -3275,6 +3491,20 @@
3275
3491
  "monetize.saved": "Työkalumanifesti tallennettu.",
3276
3492
  "monetize.saveFailed": "Työkalumanifestin tallennus epäonnistui",
3277
3493
  "monetize.needLogin": "Kirjaudu sisään muokataksesi työkalumanifestia.",
3494
+ "cost.title": "📊 Kulut & sopimukset — mitä tämä appi hankkii",
3495
+ "cost.hint": "Tämän appin EXCHANGE-sopimukset: pysyvät mitatut käyttöoikeudet joita se kutsuu, live-kulutus kutakin budjettia vasten ja alustan siivu. Kutsukohtainen hinta tulee tarjoajalta; sinä asetat vain budjettikaton.",
3496
+ "cost.empty": "Ei vielä EXCHANGE-sopimuksia — tämä appi ei hanki mitään hinnoiteltua.",
3497
+ "cost.summary": "{n} sopimus(ta) · {spent} morselia käytetty · {calls} kutsu(a)",
3498
+ "cost.capabilityCol": "Kyvykkyys",
3499
+ "cost.providerCol": "Tarjoaja",
3500
+ "cost.priceCol": "Hinta / kutsu",
3501
+ "cost.rakeCol": "Siivu",
3502
+ "cost.budgetCol": "Budjetti (käytetty / katto)",
3503
+ "cost.stateCol": "Tila",
3504
+ "cost.uncapped": "ei kattoa",
3505
+ "cost.remaining": "{n} jäljellä",
3506
+ "cost.needLogin": "Kirjaudu sisään nähdäksesi tämän appin kulut & sopimukset.",
3507
+ "cost.loadFailed": "Kulujen & sopimusten lataus epäonnistui",
3278
3508
  "detail.skillDetach": "Irrota",
3279
3509
  "detail.skillAttachError": "Taidon liittäminen epäonnistui",
3280
3510
  "detail.editAccess": "Pääsykoodi",
@@ -3373,7 +3603,7 @@
3373
3603
  "tag.favorites": "⭐ Suosikit",
3374
3604
  "empty.noApps": "Ei vielä sovelluksia",
3375
3605
  "empty.noAppsDesc": "Lisää ensimmäinen sovellus yllä olevalla +-painikkeella",
3376
- "empty.formats": "Tukee: HTML-tiedostot, URL-osoitteet, ZIP-paketit, AIMEAT-tuonnit",
3606
+ "empty.formats": "Tukee: HTML-tiedostot ja ZIP-paketit",
3377
3607
  "empty.noMatch": "Ei osumia",
3378
3608
  "empty.noMatchDesc": "Mikään sovellus ei vastaa nykyistä suodatinta. Kokeile eri hakusanaa tai tunnistetta."
3379
3609
  }
@@ -3496,128 +3726,25 @@
3496
3726
  }
3497
3727
 
3498
3728
  // src/static/app-catalog/js/db.js
3499
- var DB_NAME_GLOBAL = "AppLauncherDB";
3500
- var DB_VERSION = 2;
3501
- var STORE_NAME2 = "apps";
3502
- var dbInstance = null;
3503
- var currentDbMode = localStorage.getItem("appCatalogMode") || "global";
3504
- function getDbMode() {
3505
- return currentDbMode;
3506
- }
3507
- function setDbMode(mode) {
3508
- currentDbMode = mode;
3509
- try {
3510
- localStorage.setItem("appCatalogMode", mode);
3511
- } catch (e) {
3512
- }
3513
- }
3514
- function closeDbInstance() {
3515
- if (dbInstance) {
3516
- try {
3517
- dbInstance.close();
3518
- } catch (e) {
3519
- }
3520
- dbInstance = null;
3521
- }
3522
- }
3523
- function getDbName() {
3524
- if (currentDbMode === "personal") {
3525
- var owner = null;
3526
- try {
3527
- if (window.AIMEAT && window.AIMEAT.auth && window.AIMEAT.auth.getSession()) {
3528
- owner = window.AIMEAT.auth.getSession().owner || null;
3529
- }
3530
- if (!owner) {
3531
- var stored = localStorage.getItem("aimeat_session");
3532
- if (stored) owner = JSON.parse(stored).owner || null;
3533
- }
3534
- } catch (e) {
3535
- }
3536
- if (owner) return DB_NAME_GLOBAL + "_" + owner;
3537
- }
3538
- return DB_NAME_GLOBAL;
3539
- }
3540
- function openDB() {
3541
- var name = getDbName();
3542
- if (dbInstance && dbInstance.name === name) return Promise.resolve(dbInstance);
3543
- if (dbInstance) {
3544
- dbInstance.close();
3545
- dbInstance = null;
3546
- }
3547
- return new Promise(function(resolve, reject) {
3548
- const request = indexedDB.open(name, DB_VERSION);
3549
- request.onupgradeneeded = function(event) {
3550
- const db = event.target.result;
3551
- var store;
3552
- if (!db.objectStoreNames.contains(STORE_NAME2)) {
3553
- store = db.createObjectStore(STORE_NAME2, { keyPath: "id" });
3554
- store.createIndex("tags", "tags", { multiEntry: true });
3555
- store.createIndex("source", "source", { unique: false });
3556
- store.createIndex("favorite", "favorite", { unique: false });
3557
- store.createIndex("sortOrder", "sortOrder", { unique: false });
3558
- } else {
3559
- store = event.target.transaction.objectStore(STORE_NAME2);
3560
- if (!store.indexNames.contains("sortOrder")) {
3561
- store.createIndex("sortOrder", "sortOrder", { unique: false });
3562
- }
3563
- }
3564
- };
3565
- request.onsuccess = function(event) {
3566
- dbInstance = event.target.result;
3567
- resolve(dbInstance);
3568
- };
3569
- request.onerror = function(event) {
3570
- reject(event.target.error);
3571
- };
3572
- });
3573
- }
3729
+ var workingSet = [];
3574
3730
  function getAllApps() {
3575
- return openDB().then(function(db) {
3576
- return new Promise(function(resolve, reject) {
3577
- const tx = db.transaction(STORE_NAME2, "readonly");
3578
- const request = tx.objectStore(STORE_NAME2).getAll();
3579
- request.onsuccess = function() {
3580
- resolve(request.result);
3581
- };
3582
- request.onerror = function() {
3583
- reject(request.error);
3584
- };
3585
- });
3586
- });
3731
+ return Promise.resolve(workingSet.slice());
3587
3732
  }
3588
3733
  function saveApp(app) {
3589
- return openDB().then(function(db) {
3590
- return new Promise(function(resolve, reject) {
3591
- const tx = db.transaction(STORE_NAME2, "readwrite");
3592
- tx.objectStore(STORE_NAME2).put(app);
3593
- tx.oncomplete = function() {
3594
- resolve();
3595
- };
3596
- tx.onerror = function() {
3597
- reject(tx.error);
3598
- };
3599
- tx.onabort = function() {
3600
- reject(tx.error);
3601
- };
3734
+ if (app && app.id) {
3735
+ var idx = workingSet.findIndex(function(a) {
3736
+ return a.id === app.id;
3602
3737
  });
3603
- });
3738
+ if (idx >= 0) workingSet[idx] = app;
3739
+ else workingSet.push(app);
3740
+ }
3741
+ return Promise.resolve();
3604
3742
  }
3605
3743
  function deleteApp(id) {
3606
- return openDB().then(function(db) {
3607
- return new Promise(function(resolve, reject) {
3608
- const tx = db.transaction(STORE_NAME2, "readwrite");
3609
- tx.objectStore(STORE_NAME2).delete(id);
3610
- tx.oncomplete = function() {
3611
- resolve();
3612
- };
3613
- tx.onerror = function() {
3614
- reject(tx.error);
3615
- };
3616
- tx.onabort = function() {
3617
- reject(tx.error);
3618
- };
3619
- });
3744
+ workingSet = workingSet.filter(function(a) {
3745
+ return a.id !== id;
3620
3746
  });
3747
+ return Promise.resolve();
3621
3748
  }
3622
3749
 
3623
3750
  // src/static/app-catalog/js/ui.js
@@ -4177,6 +4304,7 @@
4177
4304
  }
4178
4305
  desc.placeholder = t("pb.descPh");
4179
4306
  loadPbTemplates();
4307
+ loadPbPacks();
4180
4308
  loadPbCore();
4181
4309
  overlay.style.display = "flex";
4182
4310
  desc.focus();
@@ -4190,9 +4318,9 @@
4190
4318
  function loadPbCore() {
4191
4319
  var config = loadConfig();
4192
4320
  if (!config.aimeatUrl) return;
4193
- var base = config.aimeatUrl.replace(/\/+$/, "");
4321
+ var base3 = config.aimeatUrl.replace(/\/+$/, "");
4194
4322
  ["new", "improve"].forEach(function(mode) {
4195
- fetch(base + "/v1/prompts/build-app?mode=" + mode + "&lang=" + encodeURIComponent(getLang())).then(function(r) {
4323
+ fetch(base3 + "/v1/prompts/build-app?mode=" + mode + "&lang=" + encodeURIComponent(getLang())).then(function(r) {
4196
4324
  return r.json();
4197
4325
  }).then(function(d) {
4198
4326
  var body = d && d.data && d.data.body;
@@ -4209,8 +4337,8 @@
4209
4337
  if (!sel) return;
4210
4338
  var config = loadConfig();
4211
4339
  if (!config.aimeatUrl) return;
4212
- var base = config.aimeatUrl.replace(/\/+$/, "");
4213
- fetch(base + "/v1/app-templates?lang=" + encodeURIComponent(getLang())).then(function(r) {
4340
+ var base3 = config.aimeatUrl.replace(/\/+$/, "");
4341
+ fetch(base3 + "/v1/app-templates?lang=" + encodeURIComponent(getLang())).then(function(r) {
4214
4342
  return r.json();
4215
4343
  }).then(function(d) {
4216
4344
  var list = (d.data && d.data.templates || []).filter(function(t2) {
@@ -4234,7 +4362,7 @@
4234
4362
  updatePbPreview();
4235
4363
  return;
4236
4364
  }
4237
- fetch(base + "/v1/app-templates/" + encodeURIComponent(id)).then(function(r) {
4365
+ fetch(base3 + "/v1/app-templates/" + encodeURIComponent(id)).then(function(r) {
4238
4366
  return r.json();
4239
4367
  }).then(function(d2) {
4240
4368
  window.pbTemplate = d2.data && d2.data.template || null;
@@ -4246,6 +4374,108 @@
4246
4374
  }).catch(function() {
4247
4375
  });
4248
4376
  }
4377
+ var pbPacks = [];
4378
+ var pbPackDocs = {};
4379
+ var pbPackTouched = {};
4380
+ var PB_PACK_CATEGORIES = ["visualization", "diagrams", "canvas", "game", "3d", "realtime"];
4381
+ function pbSelectedPackIds() {
4382
+ return Array.prototype.slice.call(document.querySelectorAll(".pb-pack-cb:checked")).map(function(cb) {
4383
+ return cb.value;
4384
+ });
4385
+ }
4386
+ function loadPbPacks() {
4387
+ var wrap = document.getElementById("pb-packs");
4388
+ if (!wrap) return;
4389
+ var config = loadConfig();
4390
+ if (!config.aimeatUrl) return;
4391
+ var base3 = config.aimeatUrl.replace(/\/+$/, "");
4392
+ fetch(base3 + "/v1/library-packs?lang=" + encodeURIComponent(getLang())).then(function(r) {
4393
+ return r.json();
4394
+ }).then(function(d) {
4395
+ var all = d.data && d.data.packs || [];
4396
+ pbPacks = all.filter(function(p) {
4397
+ if (p.status === "deprecated") return false;
4398
+ if (p.kind === "vendored" || p.kind === "bundle") return PB_PACK_CATEGORIES.indexOf(p.category) !== -1;
4399
+ if (p.kind === "cortex") return PB_PACK_CATEGORIES.indexOf(p.category) !== -1 && p.id !== "aimeat-charts";
4400
+ return false;
4401
+ });
4402
+ wrap.innerHTML = "";
4403
+ pbPacks.forEach(function(p) {
4404
+ var label = document.createElement("label");
4405
+ label.className = "pb-pack-item";
4406
+ label.title = p.description || "";
4407
+ var cb = document.createElement("input");
4408
+ cb.type = "checkbox";
4409
+ cb.className = "pb-pack-cb";
4410
+ cb.value = p.id;
4411
+ cb.onchange = function() {
4412
+ pbPackTouched[p.id] = true;
4413
+ if (cb.checked) loadPbPackDoc(base3, p.id);
4414
+ else updatePbPreview();
4415
+ };
4416
+ var span = document.createElement("span");
4417
+ span.textContent = p.title;
4418
+ label.appendChild(cb);
4419
+ label.appendChild(span);
4420
+ if (p.modelTier) {
4421
+ var badge = document.createElement("span");
4422
+ badge.className = "pb-pack-tier pb-tier-" + p.modelTier;
4423
+ badge.textContent = p.modelTier;
4424
+ var proven = (p.proofs || []).map(function(pr) {
4425
+ return pr.model + "→" + pr.verdict;
4426
+ }).join(", ");
4427
+ badge.title = "AEB reliability tier: " + p.modelTier + (proven ? " · proven on " + proven : " · not yet AEB-run") + (p.apiCaveat ? " · ⚠ " + p.apiCaveat : "");
4428
+ label.appendChild(badge);
4429
+ }
4430
+ wrap.appendChild(label);
4431
+ });
4432
+ var desc = document.getElementById("pb-description");
4433
+ if (desc && !desc._pbPackListener) {
4434
+ desc._pbPackListener = true;
4435
+ desc.addEventListener("input", function() {
4436
+ pbMatchPacksToIdea(base3);
4437
+ });
4438
+ }
4439
+ pbMatchPacksToIdea(base3);
4440
+ }).catch(function() {
4441
+ });
4442
+ }
4443
+ function pbMatchPacksToIdea(base3) {
4444
+ var desc = document.getElementById("pb-description");
4445
+ var text = (desc && desc.value || "").toLowerCase();
4446
+ pbPacks.forEach(function(p) {
4447
+ if (pbPackTouched[p.id]) return;
4448
+ var cb = document.querySelector('.pb-pack-cb[value="' + p.id + '"]');
4449
+ if (!cb) return;
4450
+ var hit = (p.interviewTriggers || []).some(function(t2) {
4451
+ var esc = String(t2).toLowerCase().replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
4452
+ return new RegExp("(^|[^a-zà-öø-ÿ])" + esc).test(text);
4453
+ });
4454
+ if (hit && !cb.checked) {
4455
+ cb.checked = true;
4456
+ loadPbPackDoc(base3, p.id);
4457
+ } else if (!hit && cb.checked) {
4458
+ cb.checked = false;
4459
+ updatePbPreview();
4460
+ }
4461
+ });
4462
+ }
4463
+ function loadPbPackDoc(base3, id) {
4464
+ if (pbPackDocs[id]) {
4465
+ updatePbPreview();
4466
+ return;
4467
+ }
4468
+ fetch(base3 + "/v1/library-packs/" + encodeURIComponent(id)).then(function(r) {
4469
+ return r.json();
4470
+ }).then(function(d) {
4471
+ var pack = d.data && d.data.pack;
4472
+ if (pack) {
4473
+ pbPackDocs[id] = pack;
4474
+ updatePbPreview();
4475
+ }
4476
+ }).catch(function() {
4477
+ });
4478
+ }
4249
4479
  function buildPromptFromBuilder() {
4250
4480
  var config = loadConfig();
4251
4481
  var nodeUrl = config.aimeatUrl ? config.aimeatUrl.replace(/\/+$/, "") : "https://your-aimeat-node.example";
@@ -4270,6 +4500,7 @@
4270
4500
  prompt2 += "3. How should it look and feel? (e.g. dark neon · cozy · sleek minimal · fun colorful) — it must support BOTH light and dark.\n";
4271
4501
  prompt2 += "4. Data: SHARED (a community space others can see and add to) or PRIVATE (only mine)?\n";
4272
4502
  prompt2 += "5. Should it use AI features (summaries, suggestions, generation)? If yes I can enable them via aimeat-ai.\n";
4503
+ prompt2 += "6. Does it need any special capabilities? (charts/graphs · editable flow or mindmap diagrams · static text-defined diagrams · a game or heavy 2D animation · generative art / creative canvas · 3D · live multi-user/realtime) — each maps to a capability pack in Step 2; include only what I pick.\n";
4273
4504
  prompt2 += "Skip any question I already answered in my idea above. Use my answers to customise everything in Step 2.\n\n";
4274
4505
  }
4275
4506
  var core = pbCore[isImprove ? "improve" : "new"];
@@ -4405,6 +4636,19 @@
4405
4636
  if (window.pbTemplate && window.pbTemplate.content) {
4406
4637
  prompt2 += "\n## Starting template (copy from this)\nUse this skeleton as your base — keep its boot, login pill, and self-hosted theme wiring intact; fill the {{...}} slots; build your views inside <main>. Return the COMPLETE single HTML file based on it.\n```html\n" + window.pbTemplate.content + "\n```\n";
4407
4638
  }
4639
+ var selectedPacks = pbSelectedPackIds().map(function(id) {
4640
+ return pbPackDocs[id];
4641
+ }).filter(Boolean);
4642
+ if (selectedPacks.length > 0) {
4643
+ prompt2 += "\n## Selected capability packs (self-hosted on my node — use these, never a CDN)\n";
4644
+ selectedPacks.forEach(function(pack) {
4645
+ prompt2 += "\n### Pack: " + pack.id + " — " + (pack.title || "") + "\n";
4646
+ prompt2 += "Include (in order):\n" + (pack.include || []).map(function(l) {
4647
+ return l;
4648
+ }).join("\n") + "\n";
4649
+ if (pack.ai_doc) prompt2 += "Usage:\n" + pack.ai_doc + "\n";
4650
+ });
4651
+ }
4408
4652
  return prompt2;
4409
4653
  }
4410
4654
  function updatePbPreview() {
@@ -4412,6 +4656,71 @@
4412
4656
  preview.textContent = buildPromptFromBuilder();
4413
4657
  }
4414
4658
 
4659
+ // src/static/app-catalog/js/promote.js
4660
+ var KEY = "app-catalog.promoted";
4661
+ var promoted = {};
4662
+ function base() {
4663
+ return (loadConfig().aimeatUrl || "").replace(/\/+$/, "");
4664
+ }
4665
+ function getPromotion(ref) {
4666
+ return promoted[ref] || null;
4667
+ }
4668
+ function getPromotedItems() {
4669
+ return Object.keys(promoted).map(function(ref) {
4670
+ return { ref, text: promoted[ref] || {} };
4671
+ });
4672
+ }
4673
+ function loadPromoted() {
4674
+ var token = getCortexOwnerToken();
4675
+ var b = base();
4676
+ if (!token || !b) {
4677
+ promoted = {};
4678
+ return Promise.resolve();
4679
+ }
4680
+ return fetch(b + "/v1/memory/" + encodeURIComponent(KEY), { headers: { "Authorization": "Bearer " + token } }).then(function(r) {
4681
+ return r.ok ? r.json() : null;
4682
+ }).then(function(j) {
4683
+ var items = j && j.data && j.data.value && Array.isArray(j.data.value.items) ? j.data.value.items : [];
4684
+ var map = {};
4685
+ items.forEach(function(it) {
4686
+ if (it && typeof it.ref === "string" && it.text && typeof it.text === "object") map[it.ref] = { en: it.text.en || "", fi: it.text.fi || "" };
4687
+ });
4688
+ promoted = map;
4689
+ }).catch(function() {
4690
+ });
4691
+ }
4692
+ function persist() {
4693
+ var token = getCortexOwnerToken();
4694
+ var b = base();
4695
+ if (!token || !b) return Promise.resolve();
4696
+ var items = getPromotedItems();
4697
+ return fetch(b + "/v1/memory", {
4698
+ method: "POST",
4699
+ headers: { "Content-Type": "application/json", "Authorization": "Bearer " + token },
4700
+ body: JSON.stringify({
4701
+ key: KEY,
4702
+ value: { version: 1, updatedAt: (/* @__PURE__ */ new Date()).toISOString(), items },
4703
+ visibility: "public"
4704
+ })
4705
+ }).catch(function() {
4706
+ });
4707
+ }
4708
+ function setPromotion(ref, text) {
4709
+ var en = text && text.en ? String(text.en).trim() : "";
4710
+ var fi = text && text.fi ? String(text.fi).trim() : "";
4711
+ var now;
4712
+ if (!en && !fi) {
4713
+ delete promoted[ref];
4714
+ now = false;
4715
+ } else {
4716
+ promoted[ref] = { en, fi };
4717
+ now = true;
4718
+ }
4719
+ return persist().then(function() {
4720
+ return now;
4721
+ });
4722
+ }
4723
+
4415
4724
  // src/static/app-catalog/js/monetize.js
4416
4725
  var NAME_RE = /^[a-z0-9][a-z0-9._-]*$/i;
4417
4726
  var MONEY_UNIT = 1e6;
@@ -4463,7 +4772,7 @@
4463
4772
  }
4464
4773
  function priceLabel(tool) {
4465
4774
  var parts = [];
4466
- if (tool.price && tool.price.morsels > 0) parts.push(tool.price.morsels + " 🥩");
4775
+ if (tool.price && tool.price.morsels > 0) parts.push(tool.price.morsels + " morsels");
4467
4776
  if (tool.priceMoney && tool.priceMoney.amount > 0) {
4468
4777
  parts.push(tool.priceMoney.amount / MONEY_UNIT + " " + tool.priceMoney.currency);
4469
4778
  }
@@ -4604,71 +4913,314 @@
4604
4913
  });
4605
4914
  }
4606
4915
 
4607
- // src/static/app-catalog/js/detail.js
4608
- var refreshAll;
4609
- var loadPublishedApps;
4610
- var renderApps;
4611
- var updateModeToggle;
4612
- var getCortexOwnerToken2;
4613
- var launchApp;
4614
- var viewPublished;
4615
- var viewSource;
4616
- var generateId2;
4617
- var generateSharePrompt;
4618
- var openPromptBuilder2;
4619
- var showPublishModal;
4620
- var getMainApps;
4621
- var getServerState;
4622
- var getServerManifests;
4623
- var getOwnProtection;
4624
- var setIframeUrl;
4625
- var isOperatorSession;
4626
- function initDetail(deps) {
4627
- ({ refreshAll, loadPublishedApps, renderApps, updateModeToggle, getCortexOwnerToken: getCortexOwnerToken2, launchApp, viewPublished, viewSource, generateId: generateId2, generateSharePrompt, openPromptBuilder: openPromptBuilder2, showPublishModal, getMainApps, getServerState, getServerManifests, getOwnProtection, setIframeUrl, isOperatorSession } = deps);
4916
+ // src/static/app-catalog/js/cost.js
4917
+ var cState = "off";
4918
+ var cData = null;
4919
+ var cAppId = "";
4920
+ function apiBase2() {
4921
+ var cfg = loadConfig();
4922
+ return (cfg.aimeatUrl || "").replace(/\/+$/, "");
4628
4923
  }
4629
- var detailAppId = null;
4630
- var detailDraftBlob = null;
4631
- var detailAiAvailable = false;
4632
- var detailVersionsHtml = null;
4633
- var detailSkillsHtml = null;
4634
- var detailEditingAbout = false;
4635
- var detailEditAboutOnOpen = false;
4636
- var detailEditingAccessCode = false;
4637
- var detailSkillPickerOpen = false;
4638
- var detailMySkills = null;
4639
- var detailBoundSkills = [];
4640
- var detailSkillBusy = false;
4641
- function detailGetApp() {
4642
- for (var i = 0; i < getMainApps().length; i++) {
4643
- if (getMainApps()[i].id === detailAppId) return getMainApps()[i];
4644
- }
4645
- return null;
4924
+ function rerender2() {
4925
+ var el = document.getElementById("detail-cost");
4926
+ if (el) el.innerHTML = costSectionInner();
4646
4927
  }
4647
- function detailServerOwner(app) {
4648
- var sess = currentOwnerName();
4649
- var stored = app && app.aimeatOwner || "";
4650
- if (!stored) {
4651
- var pu = app && (app.publishedUrl || app.viewUrl) || "";
4652
- var mm = pu.match(/\/v1\/apps\/([^/]+)\//);
4653
- stored = mm ? decodeURIComponent(mm[1]) : "";
4928
+ function costOnOpen(owner, appId, isOwn) {
4929
+ cData = null;
4930
+ if (!isOwn || !owner || !appId) {
4931
+ cState = "off";
4932
+ cAppId = "";
4933
+ return;
4654
4934
  }
4655
- if (sess && (!stored || stored === "anonymous" || stored === sess)) return sess;
4656
- return stored;
4935
+ cAppId = owner + "/" + appId;
4936
+ cState = "loading";
4937
+ var token = getCortexOwnerToken();
4938
+ if (!token) {
4939
+ cState = "error";
4940
+ cData = { _needLogin: true };
4941
+ return;
4942
+ }
4943
+ fetch(apiBase2() + "/v1/apps/cost?app_id=" + encodeURIComponent(cAppId), {
4944
+ headers: { "Authorization": "Bearer " + token }
4945
+ }).then(function(r) {
4946
+ return r.json();
4947
+ }).then(function(res) {
4948
+ if (!res || !res.ok || !res.data) throw new Error("bad response");
4949
+ cData = res.data;
4950
+ cState = "ready";
4951
+ rerender2();
4952
+ }).catch(function() {
4953
+ cState = "error";
4954
+ cData = null;
4955
+ rerender2();
4956
+ });
4957
+ }
4958
+ function stateBadge(state) {
4959
+ var cls = state === "active" ? "ok" : state === "paused" ? "diff" : "none";
4960
+ return '<span class="dtl-sync ' + cls + '" style="margin:0">' + escapeHtml(state) + "</span>";
4961
+ }
4962
+ function contractRow(c) {
4963
+ var b = c.budget || {};
4964
+ var cap = b.cap_units === null || b.cap_units === void 0 ? t("cost.uncapped") : b.spent_units + " / " + b.cap_units;
4965
+ var remaining = b.remaining_units === null || b.remaining_units === void 0 ? "" : ' <span class="dtl-stat-label">(' + t("cost.remaining").replace("{n}", b.remaining_units) + ")</span>";
4966
+ var providerShort = String(c.provider || "").split("@")[0];
4967
+ return '<div class="dtl-status-row" style="align-items:center;gap:10px;flex-wrap:wrap"><div class="dtl-stat" style="flex:1;min-width:150px"><span class="dtl-stat-val">' + escapeHtml(c.capability || "") + '</span><span class="dtl-stat-label">' + escapeHtml(t("cost.providerCol")) + ": " + escapeHtml(providerShort) + '</span></div><div class="dtl-stat"><span class="dtl-stat-label">' + t("cost.priceCol") + '</span><span class="dtl-stat-val">' + escapeHtml(String(c.price_per_call)) + ' morsels</span></div><div class="dtl-stat"><span class="dtl-stat-label">' + t("cost.rakeCol") + '</span><span class="dtl-stat-val">' + escapeHtml(String(c.rake_per_call)) + " morsels (" + escapeHtml(String(c.rake_percent)) + '%)</span></div><div class="dtl-stat"><span class="dtl-stat-label">' + t("cost.budgetCol") + '</span><span class="dtl-stat-val">' + escapeHtml(cap) + remaining + '</span></div><div class="dtl-stat">' + stateBadge(c.state) + "</div></div>";
4968
+ }
4969
+ function costSectionInner() {
4970
+ if (cState === "off") return "";
4971
+ var html = "<h3>" + t("cost.title") + '</h3><p class="dtl-desc">' + t("cost.hint") + "</p>";
4972
+ if (cState === "loading") {
4973
+ return html + '<span style="color:var(--text-muted);font-size:.85rem">…</span>';
4974
+ }
4975
+ if (cState === "error") {
4976
+ var msg = cData && cData._needLogin ? t("cost.needLogin") : t("cost.loadFailed");
4977
+ return html + '<span class="dtl-sync none">' + escapeHtml(msg) + "</span>";
4978
+ }
4979
+ var contracts = cData && cData.contracts || [];
4980
+ if (!contracts.length) {
4981
+ return html + '<span class="dtl-sync none">' + t("cost.empty") + "</span>";
4982
+ }
4983
+ var m = cData.totals && cData.totals.morsels || { spent_units: 0, calls: 0 };
4984
+ html += '<div class="dtl-sync ok" style="margin:0 0 10px">' + t("cost.summary").replace("{n}", cData.total_contracts).replace("{spent}", m.spent_units).replace("{calls}", m.calls) + "</div>";
4985
+ for (var i = 0; i < contracts.length; i++) html += contractRow(contracts[i]);
4986
+ return html;
4657
4987
  }
4658
- function detailIsOwnPublished(app) {
4659
- return !!(app && app.published && app.publishedFilename && getServerState()[app.publishedFilename] && currentOwnerName());
4988
+
4989
+ // src/static/app-catalog/js/app-agents.js
4990
+ var getServerManifests;
4991
+ function initAppAgents(deps) {
4992
+ ({ getServerManifests } = deps);
4660
4993
  }
4661
- function blobToHtml(blob) {
4662
- try {
4663
- return decodeURIComponent(escape(atob(blob)));
4664
- } catch (e) {
4665
- return "";
4994
+ function aimeatBase() {
4995
+ var config = loadConfig();
4996
+ return config.aimeatUrl ? config.aimeatUrl.replace(/\/+$/, "") : "";
4997
+ }
4998
+ function appManifestAgents(owner, filename) {
4999
+ var m = getServerManifests ? getServerManifests()[(owner || "") + "\n" + (filename || "")] : null;
5000
+ return m && m.cortex && Array.isArray(m.cortex.agents) ? m.cortex.agents : [];
5001
+ }
5002
+ function fmtOfferPrice(o) {
5003
+ var parts = [];
5004
+ if (o.price && typeof o.price.morsels === "number") {
5005
+ parts.push(o.price.morsels + " 🥩" + (o.price.unit ? "/" + escapeHtml(o.price.unit) : ""));
4666
5006
  }
5007
+ if (o.price_money && typeof o.price_money.amount === "number") {
5008
+ parts.push((o.price_money.amount / 1e6).toFixed(2) + " " + escapeHtml(o.price_money.currency || "EUR"));
5009
+ }
5010
+ return parts.length ? parts.join(" · ") : t("agents.askPrice");
4667
5011
  }
4668
- function htmlToBlob(html) {
4669
- return btoa(unescape(encodeURIComponent(html)));
5012
+ function inspectorHtml(def) {
5013
+ var crew = (def.agents || []).map(function(a) {
5014
+ var tools = (a.tools || []).map(function(x) {
5015
+ return '<span class="aga-chip">' + escapeHtml(x) + "</span>";
5016
+ }).join("");
5017
+ var skills = (a.skills || []).map(function(x) {
5018
+ return '<span class="aga-chip aga-chip-skill">' + escapeHtml(x) + "</span>";
5019
+ }).join("");
5020
+ return '<div class="aga-crew-row"><strong>' + escapeHtml(a.role || "") + "</strong>" + (a.goal ? ' — <span class="aga-goal">' + escapeHtml(a.goal) + "</span>" : "") + (tools || skills ? '<div class="aga-chips">' + tools + skills + "</div>" : "") + "</div>";
5021
+ }).join("");
5022
+ var tasks = (def.tasks || []).map(function(tk) {
5023
+ var desc = String(tk.description || "");
5024
+ if (desc.length > 140) desc = desc.slice(0, 140) + "…";
5025
+ return "<li>" + escapeHtml(desc) + (tk.expected_output ? ' <span class="aga-goal">→ ' + escapeHtml(String(tk.expected_output).slice(0, 80)) + "</span>" : "") + "</li>";
5026
+ }).join("");
5027
+ return '<div class="aga-inspector"><div class="aga-label">' + t("agents.crew") + (def.llm_profile ? ' <span class="aga-chip">' + escapeHtml(def.llm_profile) + "</span>" : "") + (def.process ? ' <span class="aga-chip">' + escapeHtml(def.process) + "</span>" : "") + "</div>" + crew + '<div class="aga-label">' + t("agents.tasks") + '</div><ul class="aga-tasks">' + tasks + "</ul></div>";
4670
5028
  }
4671
- function serverMgmtInner(app) {
5029
+ function instanceHtml(inst, appOwner, appFilename, agentName) {
5030
+ var dot = inst.online ? '<span class="aga-dot aga-dot-on"></span>' : '<span class="aga-dot"></span>';
5031
+ var who = escapeHtml(inst.owner) + (inst.is_yours ? ' <span class="aga-chip">' + t("agents.you") + "</span>" : "") + (inst.source === "author" ? ' <span class="aga-chip">' + t("agents.author") + "</span>" : "");
5032
+ var offers = (inst.offers || []).map(function(o) {
5033
+ return '<div class="aga-offer"><span class="aga-offer-title">' + escapeHtml(o.title || o.id) + '</span><span class="aga-price">' + fmtOfferPrice(o) + (o.callable ? " · " + t("agents.instant") : "") + "</span></div>";
5034
+ }).join("");
5035
+ var undeploy = inst.is_yours && inst.source === "deployed" ? `<button class="modal-btn secondary aga-btn-sm" onclick="window._launcher.agentsUndeploy('` + jsArg(appOwner) + "', '" + jsArg(appFilename) + "', '" + jsArg(agentName) + `')">` + t("agents.undeploy") + "</button>" : "";
5036
+ return '<div class="aga-inst"><div class="aga-inst-head">' + dot + "<strong>" + who + '</strong><span class="aga-goal">' + t("agents.trust") + " " + (inst.trust_score != null ? inst.trust_score : "—") + "</span>" + undeploy + "</div>" + (offers || '<div class="aga-goal">' + t("agents.noOffers") + "</div>") + "</div>";
5037
+ }
5038
+ function showAppAgentsModal(owner, filename) {
5039
+ var defs = appManifestAgents(owner, filename);
5040
+ if (!defs.length) {
5041
+ showNotice(t("agents.none"));
5042
+ return;
5043
+ }
5044
+ var base3 = aimeatBase();
5045
+ if (!base3) {
5046
+ showNotice("Set AIMEAT server URL in Settings first");
5047
+ return;
5048
+ }
5049
+ var token = getCortexOwnerToken();
5050
+ document.getElementById("agents-modal-app").textContent = owner + "/" + filename;
5051
+ var body = document.getElementById("agents-modal-body");
5052
+ var html = '<div class="aga-intro">' + t("agents.declares") + "</div>";
5053
+ for (var i = 0; i < defs.length; i++) {
5054
+ var def = defs[i];
5055
+ html += '<div class="aga-def"><h3>🤖 ' + escapeHtml(def.agent_name || "") + "</h3>" + inspectorHtml(def) + '<div class="aga-label">' + t("agents.hostedTitle") + '</div><div id="aga-instances-' + i + '" class="aga-goal">' + t("agents.loading") + '</div><div class="aga-label">' + t("agents.deployTitle") + "</div>" + (token ? '<div class="aga-deploy-row"><label>' + t("agents.runner") + ' <select id="aga-runner-' + i + '" class="modal-input aga-select"><option value="">' + t("agents.loading") + "</option></select></label><label>" + t("agents.organism") + ' <select id="aga-organism-' + i + `" class="modal-input aga-select"><option value="">—</option></select></label><button class="modal-btn aga-deploy-btn" onclick="window._launcher.agentsDeploy('` + jsArg(owner) + "', '" + jsArg(filename) + "', '" + jsArg(def.agent_name) + "', " + i + ')">' + t("agents.deployBtn") + '</button></div><div class="aga-goal">' + t("agents.deployDesc") + "</div>" : '<div class="aga-goal">' + t("agents.needLogin") + "</div>") + "</div>";
5056
+ }
5057
+ body.innerHTML = html;
5058
+ document.getElementById("agents-overlay").hidden = false;
5059
+ defs.forEach(function(def2, i2) {
5060
+ var headers = token ? { "Authorization": "Bearer " + token } : {};
5061
+ fetch(base3 + "/v1/apps/" + encodeURIComponent(owner) + "/" + encodeURIComponent(filename) + "/agents/" + encodeURIComponent(def2.agent_name) + "/instances", { headers }).then(function(r) {
5062
+ return r.json();
5063
+ }).then(function(json) {
5064
+ var el = document.getElementById("aga-instances-" + i2);
5065
+ if (!el) return;
5066
+ var list = json.data && json.data.instances || [];
5067
+ el.className = "";
5068
+ el.innerHTML = list.length ? list.map(function(inst) {
5069
+ return instanceHtml(inst, owner, filename, def2.agent_name);
5070
+ }).join("") : '<div class="aga-goal">' + t("agents.hostedNone") + "</div>";
5071
+ }).catch(function() {
5072
+ var el = document.getElementById("aga-instances-" + i2);
5073
+ if (el) el.textContent = t("agents.hostedError");
5074
+ });
5075
+ });
5076
+ if (token) {
5077
+ fetch(base3 + "/v1/agents", { headers: { "Authorization": "Bearer " + token } }).then(function(r) {
5078
+ return r.json();
5079
+ }).then(function(json) {
5080
+ var agents = json.data && json.data.agents || [];
5081
+ agents.sort(function(a, b) {
5082
+ var rank = function(m) {
5083
+ return m === "task-runner" ? 0 : m === "autonomous" ? 1 : 2;
5084
+ };
5085
+ return rank(a.mode) - rank(b.mode);
5086
+ });
5087
+ var opts = agents.length ? agents.map(function(a) {
5088
+ var label = a.name + (a.mode === "task-runner" ? " · task-runner" : a.mode ? " · " + a.mode : "");
5089
+ var sel = a.name === "crew-forge" ? " selected" : "";
5090
+ return '<option value="' + escapeHtml(a.name) + '"' + sel + ">" + escapeHtml(label) + "</option>";
5091
+ }).join("") : '<option value="">' + t("agents.noRunnerOption") + "</option>";
5092
+ defs.forEach(function(_, i2) {
5093
+ var el = document.getElementById("aga-runner-" + i2);
5094
+ if (el) el.innerHTML = opts;
5095
+ });
5096
+ }).catch(function() {
5097
+ });
5098
+ var me = null;
5099
+ try {
5100
+ me = JSON.parse(localStorage.getItem("aimeat_session")).owner || null;
5101
+ } catch (e) {
5102
+ }
5103
+ if (me) {
5104
+ fetch(base3 + "/v1/organisms?member=" + encodeURIComponent(me), { headers: { "Authorization": "Bearer " + token } }).then(function(r) {
5105
+ return r.json();
5106
+ }).then(function(json) {
5107
+ var orgs = json.data && json.data.organisms || [];
5108
+ var opts = '<option value="">—</option>' + orgs.map(function(o) {
5109
+ return '<option value="' + escapeHtml(o.id) + '">' + escapeHtml(o.name || o.id) + "</option>";
5110
+ }).join("");
5111
+ defs.forEach(function(_, i2) {
5112
+ var el = document.getElementById("aga-organism-" + i2);
5113
+ if (el) el.innerHTML = opts;
5114
+ });
5115
+ }).catch(function() {
5116
+ });
5117
+ }
5118
+ }
5119
+ }
5120
+ function postAction(owner, filename, agentName, action, bodyObj, doneMsgFor) {
5121
+ var token = getCortexOwnerToken();
5122
+ if (!token) {
5123
+ showNotice(t("agents.needLogin"));
5124
+ return;
5125
+ }
5126
+ fetch(aimeatBase() + "/v1/apps/" + encodeURIComponent(owner) + "/" + encodeURIComponent(filename) + "/agents/" + encodeURIComponent(agentName) + "/" + action, {
5127
+ method: "POST",
5128
+ headers: { "Content-Type": "application/json", "Authorization": "Bearer " + token },
5129
+ body: JSON.stringify(bodyObj)
5130
+ }).then(function(r) {
5131
+ return r.json();
5132
+ }).then(function(json) {
5133
+ if (json.ok) {
5134
+ showNotice(doneMsgFor(json.data || {}));
5135
+ } else {
5136
+ var code = json.error && json.error.code;
5137
+ showNotice(code === "RUNNER_NOT_FOUND" ? t("agents.noRunner") : json.error && json.error.message || t("agents.deployFailed"));
5138
+ }
5139
+ }).catch(function(err) {
5140
+ showNotice(t("agents.deployFailed") + ": " + err.message);
5141
+ });
5142
+ }
5143
+ function agentsDeploy(owner, filename, agentName, idx) {
5144
+ var runnerEl = document.getElementById("aga-runner-" + idx);
5145
+ var orgEl = document.getElementById("aga-organism-" + idx);
5146
+ var body = {};
5147
+ if (runnerEl && runnerEl.value) body.runner_agent = runnerEl.value;
5148
+ if (orgEl && orgEl.value) body.organism_id = orgEl.value;
5149
+ postAction(owner, filename, agentName, "deploy", body, function(d) {
5150
+ return d.auto_activated ? t("agents.deployStarted") : t("agents.deployQueued");
5151
+ });
5152
+ }
5153
+ function agentsUndeploy(owner, filename, agentName) {
5154
+ postAction(owner, filename, agentName, "undeploy", {}, function() {
5155
+ return t("agents.undeployQueued");
5156
+ });
5157
+ }
5158
+
5159
+ // src/static/app-catalog/js/detail.js
5160
+ var refreshAll;
5161
+ var loadPublishedApps;
5162
+ var renderApps;
5163
+ var updateModeToggle;
5164
+ var getCortexOwnerToken2;
5165
+ var launchApp;
5166
+ var viewPublished;
5167
+ var viewSource;
5168
+ var generateId2;
5169
+ var generateSharePrompt;
5170
+ var openPromptBuilder2;
5171
+ var showPublishModal;
5172
+ var getMainApps;
5173
+ var getServerState;
5174
+ var getServerManifests2;
5175
+ var getOwnProtection;
5176
+ var setIframeUrl;
5177
+ var isOperatorSession;
5178
+ function initDetail(deps) {
5179
+ ({ refreshAll, loadPublishedApps, renderApps, updateModeToggle, getCortexOwnerToken: getCortexOwnerToken2, launchApp, viewPublished, viewSource, generateId: generateId2, generateSharePrompt, openPromptBuilder: openPromptBuilder2, showPublishModal, getMainApps, getServerState, getServerManifests: getServerManifests2, getOwnProtection, setIframeUrl, isOperatorSession } = deps);
5180
+ }
5181
+ var detailAppId = null;
5182
+ var detailDraftBlob = null;
5183
+ var detailAiAvailable = false;
5184
+ var detailVersionsHtml = null;
5185
+ var detailSkillsHtml = null;
5186
+ var detailEditingAbout = false;
5187
+ var detailEditAboutOnOpen = false;
5188
+ var detailEditingAccessCode = false;
5189
+ var detailSkillPickerOpen = false;
5190
+ var detailMySkills = null;
5191
+ var detailBoundSkills = [];
5192
+ var detailSkillBusy = false;
5193
+ function detailGetApp() {
5194
+ for (var i = 0; i < getMainApps().length; i++) {
5195
+ if (getMainApps()[i].id === detailAppId) return getMainApps()[i];
5196
+ }
5197
+ return null;
5198
+ }
5199
+ function detailServerOwner(app) {
5200
+ var sess = currentOwnerName();
5201
+ var stored = app && app.aimeatOwner || "";
5202
+ if (!stored) {
5203
+ var pu = app && (app.publishedUrl || app.viewUrl) || "";
5204
+ var mm = pu.match(/\/v1\/apps\/([^/]+)\//);
5205
+ stored = mm ? decodeURIComponent(mm[1]) : "";
5206
+ }
5207
+ if (sess && (!stored || stored === "anonymous" || stored === sess)) return sess;
5208
+ return stored;
5209
+ }
5210
+ function detailIsOwnPublished(app) {
5211
+ return !!(app && app.published && app.publishedFilename && getServerState()[app.publishedFilename] && currentOwnerName());
5212
+ }
5213
+ function blobToHtml(blob) {
5214
+ try {
5215
+ return decodeURIComponent(escape(atob(blob)));
5216
+ } catch (e) {
5217
+ return "";
5218
+ }
5219
+ }
5220
+ function htmlToBlob(html) {
5221
+ return btoa(unescape(encodeURIComponent(html)));
5222
+ }
5223
+ function serverMgmtInner(app) {
4672
5224
  if (!app) return "";
4673
5225
  var isUrlApp = app.source === "url" && !app.blob;
4674
5226
  var svrState = app.publishedFilename && getServerState()[app.publishedFilename] || null;
@@ -4701,6 +5253,7 @@
4701
5253
  var app = detailGetApp();
4702
5254
  if (!app) return;
4703
5255
  monetizeOnOpen(detailServerOwner(app), app.publishedFilename || "", detailIsOwnPublished(app));
5256
+ costOnOpen(detailServerOwner(app), app.publishedFilename || "", detailIsOwnPublished(app));
4704
5257
  document.getElementById("detail-view").hidden = false;
4705
5258
  renderDetailView();
4706
5259
  detailCheckAiAvailability();
@@ -4727,14 +5280,14 @@
4727
5280
  var app = detailGetApp();
4728
5281
  if (!app) return;
4729
5282
  if (app.published && (app.publishedUrl || app.publishedFilename)) {
4730
- var base = (loadConfig().aimeatUrl || "").replace(/\/+$/, "");
5283
+ var base3 = (loadConfig().aimeatUrl || "").replace(/\/+$/, "");
4731
5284
  var url;
4732
5285
  if (app.publishedUrl) {
4733
- url = base + app.publishedUrl;
5286
+ url = base3 + app.publishedUrl;
4734
5287
  } else {
4735
5288
  var st = getServerState()[app.publishedFilename] || {};
4736
5289
  var owner = st.owner || currentOwnerName() || "";
4737
- url = base + "/v1/apps/" + encodeURIComponent(owner) + "/" + encodeURIComponent(app.publishedFilename);
5290
+ url = base3 + "/v1/apps/" + encodeURIComponent(owner) + "/" + encodeURIComponent(app.publishedFilename);
4738
5291
  }
4739
5292
  viewPublished(url + "?mode=inline", app.name);
4740
5293
  } else {
@@ -4756,11 +5309,6 @@
4756
5309
  });
4757
5310
  }
4758
5311
  function onAuthChanged() {
4759
- if (getDbMode() === "personal" && !currentOwnerName()) {
4760
- setDbMode("global");
4761
- }
4762
- closeDbInstance();
4763
- updateModeToggle();
4764
5312
  try {
4765
5313
  refreshAll();
4766
5314
  } catch (e) {
@@ -4833,22 +5381,26 @@
4833
5381
  syncClass = "ok";
4834
5382
  syncText = t("detail.inSync");
4835
5383
  }
4836
- var aimeatBase = config.aimeatUrl ? config.aimeatUrl.replace(/\/+$/, "") : "";
5384
+ var aimeatBase2 = config.aimeatUrl ? config.aimeatUrl.replace(/\/+$/, "") : "";
4837
5385
  var shotOwner = detailServerOwner(app);
4838
5386
  var shotFile = app.publishedFilename || "";
4839
- var shotUrl = app.published && shotOwner && shotFile && aimeatBase ? aimeatBase + "/v1/apps/" + encodeURIComponent(shotOwner) + "/" + encodeURIComponent(shotFile) + "/screenshot?t=" + Date.now() : "";
5387
+ var shotUrl = app.published && shotOwner && shotFile && aimeatBase2 ? aimeatBase2 + "/v1/apps/" + encodeURIComponent(shotOwner) + "/" + encodeURIComponent(shotFile) + "/screenshot?t=" + Date.now() : "";
4840
5388
  var shotImg = shotUrl ? '<img src="' + escapeHtml(shotUrl) + `" alt="App screenshot" loading="lazy" onerror="this.style.display='none'" style="max-width:260px;max-height:160px;border-radius:8px;border:1px solid var(--border-subtle);object-fit:cover;object-position:top center;flex:none" />` : "";
4841
5389
  var statusHtml = '<div class="dtl-section"><h3>' + t("detail.status") + '</h3><div style="display:flex;gap:16px;align-items:flex-start;flex-wrap:wrap"><div style="flex:1;min-width:200px"><div class="dtl-status-row"><div class="dtl-stat"><span class="dtl-stat-label">' + t("detail.statusLocal") + '</span><span class="dtl-stat-val">' + (app.blob ? fmtSize(localBytes) : isUrlApp ? "URL" : "—") + '</span></div><div class="dtl-stat"><span class="dtl-stat-label">' + t("detail.statusPublished") + '</span><span class="dtl-stat-val">' + escapeHtml(publishedV) + '</span></div></div><span class="dtl-sync ' + syncClass + '">' + escapeHtml(syncText) + "</span></div>" + shotImg + "</div></div>";
4842
5390
  var tags = app.tags && app.tags.length ? app.tags.join(", ") : "—";
4843
5391
  var cortex = app.usesCortex && app.usesCortex.length ? app.usesCortex.join(", ") : "—";
4844
5392
  var created = app.addedAt ? new Date(app.addedAt).toLocaleString() : "—";
4845
- var favBtn = app.blob ? '<button class="dtl-fav-btn" title="' + escapeHtml(t(app.favorite ? "detail.unfavorite" : "detail.favorite")) + '" onclick="window._launcher.detailToggleFavorite()">' + (app.favorite ? "⭐" : "☆") + "</button>" : "";
5393
+ var favBtn = "";
4846
5394
  var aboutHeader = '<h3 style="display:flex;align-items:center;justify-content:space-between;gap:8px"><span>' + t("detail.about") + '</span><span style="display:flex;align-items:center;gap:8px">' + favBtn + (canEditAbout && !detailEditingAbout ? dtlBtn(t("detail.editDetails"), "window._launcher.detailAboutEdit()") : "") + "</span></h3>";
5395
+ var descs = app.descriptions || {};
5396
+ var descEnVal = descs.en || (app.description || "");
5397
+ var descFiVal = descs.fi || "";
4847
5398
  var aboutBody;
4848
5399
  if (detailEditingAbout) {
4849
- aboutBody = '<label class="dtl-stat-label" for="detail-name-input">' + t("detail.nameLabel") + '</label><input id="detail-name-input" class="modal-input" maxlength="120" value="' + escapeHtml(app.name || "") + '" style="margin:4px 0 10px" /><label class="dtl-stat-label" for="detail-desc-input">' + t("detail.descLabel") + '</label><textarea id="detail-desc-input" class="modal-input" rows="3" maxlength="2000" style="margin:4px 0 8px;resize:vertical">' + escapeHtml(app.description || "") + '</textarea><label class="dtl-stat-label" for="detail-icon-input">' + t("detail.iconLabel") + '</label><input id="detail-icon-input" class="modal-input" maxlength="4" value="' + escapeHtml(app.icon || "") + '" style="margin:4px 0 10px;text-align:center;font-size:1.2rem" /><label class="dtl-stat-label" for="detail-tags-input">' + t("detail.tagsLabel") + '</label><input id="detail-tags-input" class="modal-input" value="' + escapeHtml((app.tags || []).join(", ")) + '" placeholder="tools, productivity" style="margin:4px 0 8px" /><div class="dtl-sync none" style="margin:0 0 10px">' + t("detail.renameHint") + '</div><div class="dtl-btn-row">' + dtlBtn(t("detail.saveDetails"), "window._launcher.detailAboutSave()", { variant: "primary" }) + dtlBtn(t("detail.cancelEdit"), "window._launcher.detailAboutCancel()") + "</div>";
5400
+ aboutBody = '<label class="dtl-stat-label" for="detail-name-input">' + t("detail.nameLabel") + '</label><input id="detail-name-input" class="modal-input" maxlength="120" value="' + escapeHtml(app.name || "") + '" style="margin:4px 0 10px" /><label class="dtl-stat-label" for="detail-desc-en">' + t("detail.descEn") + '</label><textarea id="detail-desc-en" class="modal-input" rows="3" maxlength="2000" style="margin:4px 0 6px;resize:vertical">' + escapeHtml(descEnVal) + '</textarea><label class="dtl-stat-label" for="detail-desc-fi">' + t("detail.descFi") + '</label><textarea id="detail-desc-fi" class="modal-input" rows="3" maxlength="2000" style="margin:4px 0 6px;resize:vertical">' + escapeHtml(descFiVal) + '</textarea><div class="dtl-btn-row" style="margin:0 0 4px">' + dtlBtn("🌐 " + t("detail.translateEnFi"), "window._launcher.detailTranslateDesc('en','fi')", { id: "detail-tr-enfi" }) + dtlBtn("🌐 " + t("detail.translateFiEn"), "window._launcher.detailTranslateDesc('fi','en')", { id: "detail-tr-fien" }) + '</div><div class="dtl-ai-status" id="detail-tr-status" style="margin:0 0 8px"></div><label class="dtl-stat-label" for="detail-icon-input">' + t("detail.iconLabel") + '</label><input id="detail-icon-input" class="modal-input" maxlength="4" value="' + escapeHtml(app.icon || "") + '" style="margin:4px 0 10px;text-align:center;font-size:1.2rem" /><label class="dtl-stat-label" for="detail-tags-input">' + t("detail.tagsLabel") + '</label><input id="detail-tags-input" class="modal-input" value="' + escapeHtml((app.tags || []).join(", ")) + '" placeholder="tools, productivity" style="margin:4px 0 8px" /><div class="dtl-sync none" style="margin:0 0 10px">' + t("detail.renameHint") + '</div><div class="dtl-btn-row">' + dtlBtn(t("detail.saveDetails"), "window._launcher.detailAboutSave()", { variant: "primary" }) + dtlBtn(t("detail.cancelEdit"), "window._launcher.detailAboutCancel()") + "</div>";
4850
5401
  } else {
4851
- aboutBody = (app.description ? '<p class="dtl-desc">' + escapeHtml(app.description) + "</p>" : "") + '<div class="dtl-meta-grid">' + metaItem(t("detail.category"), app.category || "utility") + metaItem(t("detail.tags"), tags) + metaItem(t("detail.sourceLabel"), sourceLabelText(app.source)) + metaItem(t("detail.size"), app.blob ? fmtSize(localBytes) : "—") + metaItem(t("detail.created"), created) + metaItem(t("detail.usesCortex"), cortex) + // Provenance: if this app was forked from another, credit the source app.
5402
+ var shownDesc = app.descriptions && app.descriptions[getLang()] || app.description || "";
5403
+ aboutBody = (shownDesc ? '<p class="dtl-desc">' + escapeHtml(shownDesc) + "</p>" : "") + '<div class="dtl-meta-grid">' + metaItem(t("detail.category"), app.category || "utility") + metaItem(t("detail.tags"), tags) + metaItem(t("detail.sourceLabel"), sourceLabelText(app.source)) + metaItem(t("detail.size"), app.blob ? fmtSize(localBytes) : "—") + metaItem(t("detail.created"), created) + metaItem(t("detail.usesCortex"), cortex) + // Provenance: if this app was forked from another, credit the source app.
4852
5404
  (app.forkedFrom && app.forkedFrom.owner && app.forkedFrom.filename ? metaItem(t("detail.forkedFrom"), app.forkedFrom.owner + "/" + app.forkedFrom.filename + (app.forkedFrom.version ? " v" + app.forkedFrom.version : "")) : "") + "</div>";
4853
5405
  }
4854
5406
  var aboutHtml = '<div class="dtl-section">' + aboutHeader + aboutBody + "</div>";
@@ -4874,7 +5426,59 @@
4874
5426
  (ownPub ? '<div id="detail-skill-attach" style="margin-top:8px">' + detailSkillAttachInner() + "</div>" : "") + "</div>";
4875
5427
  }
4876
5428
  var monetizeHtml = app.published && detailIsOwnPublished(app) ? '<div class="dtl-section" id="detail-monetize">' + monetizeSectionInner() + "</div>" : "";
4877
- document.getElementById("detail-body").innerHTML = statusHtml + aboutHtml + aiHtml + versionsHtml + skillsHtml + monetizeHtml + mgmtHtml + actionsHtml;
5429
+ var costHtml = app.published && detailIsOwnPublished(app) ? '<div class="dtl-section" id="detail-cost">' + costSectionInner() + "</div>" : "";
5430
+ var promoteHtml = app.published && detailIsOwnPublished(app) ? buildPromoteSection(app) : "";
5431
+ var agentsHtml = "";
5432
+ if (app.published) {
5433
+ var agOwner = detailServerOwner(app);
5434
+ var agFile = app.publishedFilename || "";
5435
+ var agDefs = appManifestAgents(agOwner, agFile);
5436
+ if (agDefs.length) {
5437
+ agentsHtml = '<div class="dtl-section"><h3>🤖 ' + (t("agents.title") || "Bundled agents") + '</h3><div style="font-size:.85rem;color:var(--text-muted);margin-bottom:6px">' + (t("agents.declares") || "") + '</div><div style="margin-bottom:8px">' + agDefs.map(function(d) {
5438
+ return '<span class="aga-chip">' + escapeHtml(d.agent_name || "") + "</span>";
5439
+ }).join(" ") + "</div>" + dtlBtn(
5440
+ "🤖 " + (t("agents.manage") || "Inspect & deploy"),
5441
+ "window._launcher.showAppAgentsModal('" + jsArg(agOwner) + "', '" + jsArg(agFile) + "')"
5442
+ ) + "</div>";
5443
+ }
5444
+ }
5445
+ document.getElementById("detail-body").innerHTML = statusHtml + aboutHtml + aiHtml + versionsHtml + skillsHtml + agentsHtml + monetizeHtml + costHtml + promoteHtml + mgmtHtml + actionsHtml;
5446
+ }
5447
+ function promoteRef(app) {
5448
+ return detailServerOwner(app) + "/" + (app.publishedFilename || "");
5449
+ }
5450
+ function buildPromoteSection(app) {
5451
+ var ref = promoteRef(app);
5452
+ var cur = getPromotion(ref) || {};
5453
+ var on = !!(cur.en || cur.fi);
5454
+ return '<div class="dtl-section" id="detail-promote"><h3 style="display:flex;align-items:center;gap:8px">📣 ' + t("promote.title") + (on ? ' <span class="dtl-badge-on">' + t("promote.on") + "</span>" : "") + '</h3><p class="dtl-desc">' + t("promote.hint") + '</p><label class="dtl-stat-label" for="detail-promo-en">' + t("promote.en") + '</label><textarea id="detail-promo-en" class="modal-input" rows="2" maxlength="500" style="margin:4px 0 6px;resize:vertical">' + escapeHtml(cur.en || "") + '</textarea><label class="dtl-stat-label" for="detail-promo-fi">' + t("promote.fi") + '</label><textarea id="detail-promo-fi" class="modal-input" rows="2" maxlength="500" style="margin:4px 0 6px;resize:vertical">' + escapeHtml(cur.fi || "") + '</textarea><div class="dtl-btn-row" style="margin:0 0 4px">' + dtlBtn("🌐 " + t("detail.translateEnFi"), "window._launcher.detailTranslateDesc('en','fi','detail-promo-','detail-promo-tr-status')") + dtlBtn("🌐 " + t("detail.translateFiEn"), "window._launcher.detailTranslateDesc('fi','en','detail-promo-','detail-promo-tr-status')") + '</div><div class="dtl-ai-status" id="detail-promo-tr-status" style="margin:0 0 8px"></div><div class="dtl-btn-row">' + dtlBtn(t("promote.save"), "window._launcher.detailPromoteSave()", { variant: "primary" }) + (on ? dtlBtn(t("promote.remove"), "window._launcher.detailPromoteClear()") : "") + '</div><div class="dtl-ai-status" id="detail-promo-status"></div></div>';
5455
+ }
5456
+ function detailPromoteSave() {
5457
+ var app = detailGetApp();
5458
+ if (!app || !detailIsOwnPublished(app)) return;
5459
+ var en = (document.getElementById("detail-promo-en") || {}).value || "";
5460
+ var fi = (document.getElementById("detail-promo-fi") || {}).value || "";
5461
+ var statusEl = document.getElementById("detail-promo-status");
5462
+ if (statusEl) {
5463
+ statusEl.style.color = "var(--text-muted)";
5464
+ statusEl.textContent = t("promote.saving");
5465
+ }
5466
+ setPromotion(promoteRef(app), { en, fi }).then(function(nowOn) {
5467
+ renderApps();
5468
+ renderDetailView();
5469
+ var s2 = document.getElementById("detail-promo-status");
5470
+ if (s2) {
5471
+ s2.style.color = "#34d399";
5472
+ s2.textContent = nowOn ? "✔ " + t("promote.saved") : "✔ " + t("promote.removed");
5473
+ }
5474
+ });
5475
+ }
5476
+ function detailPromoteClear() {
5477
+ var en = document.getElementById("detail-promo-en");
5478
+ if (en) en.value = "";
5479
+ var fi = document.getElementById("detail-promo-fi");
5480
+ if (fi) fi.value = "";
5481
+ detailPromoteSave();
4878
5482
  }
4879
5483
  function detailLoadSkills(owner, filename) {
4880
5484
  var config = loadConfig();
@@ -5086,27 +5690,27 @@
5086
5690
  return h;
5087
5691
  }
5088
5692
  function skillListMine() {
5089
- var base = skillApiBase();
5090
- if (!base) return Promise.reject(new Error("No server configured"));
5091
- return fetch(base + "/v1/skills?scope=user", { headers: skillAuthHeaders(false) }).then(function(r) {
5693
+ var base3 = skillApiBase();
5694
+ if (!base3) return Promise.reject(new Error("No server configured"));
5695
+ return fetch(base3 + "/v1/skills?scope=user", { headers: skillAuthHeaders(false) }).then(function(r) {
5092
5696
  return r.json();
5093
5697
  }).then(function(j) {
5094
5698
  return j.data && j.data.skills ? j.data.skills : [];
5095
5699
  });
5096
5700
  }
5097
5701
  function skillGetMine(name) {
5098
- var base = skillApiBase();
5099
- return fetch(base + "/v1/skills/" + encodeURIComponent(name) + "?scope=user", { headers: skillAuthHeaders(false) }).then(function(r) {
5702
+ var base3 = skillApiBase();
5703
+ return fetch(base3 + "/v1/skills/" + encodeURIComponent(name) + "?scope=user", { headers: skillAuthHeaders(false) }).then(function(r) {
5100
5704
  return r.json();
5101
5705
  }).then(function(j) {
5102
5706
  return j.data && j.data.skill || null;
5103
5707
  });
5104
5708
  }
5105
5709
  function skillPublish(skillMd, files) {
5106
- var base = skillApiBase();
5710
+ var base3 = skillApiBase();
5107
5711
  var body = { skill_md: skillMd };
5108
5712
  if (files && Object.keys(files).length) body.files = files;
5109
- return fetch(base + "/v1/skills", { method: "POST", headers: skillAuthHeaders(true), body: JSON.stringify(body) }).then(function(r) {
5713
+ return fetch(base3 + "/v1/skills", { method: "POST", headers: skillAuthHeaders(true), body: JSON.stringify(body) }).then(function(r) {
5110
5714
  return r.json().then(function(j) {
5111
5715
  if (!j.ok) throw new Error(j.error && (j.error.message || j.error.code) || "HTTP " + r.status);
5112
5716
  return j.data && j.data.skill || null;
@@ -5164,11 +5768,17 @@
5164
5768
  var app = detailGetApp();
5165
5769
  if (!app) return;
5166
5770
  var nameEl = document.getElementById("detail-name-input");
5167
- var descEl = document.getElementById("detail-desc-input");
5771
+ var enEl = document.getElementById("detail-desc-en");
5772
+ var fiEl = document.getElementById("detail-desc-fi");
5168
5773
  var iconEl = document.getElementById("detail-icon-input");
5169
5774
  var tagsEl = document.getElementById("detail-tags-input");
5170
5775
  var newName = nameEl ? nameEl.value.trim() : "";
5171
- var newDesc = descEl ? descEl.value.trim() : "";
5776
+ var enDesc = enEl ? enEl.value.trim() : "";
5777
+ var fiDesc = fiEl ? fiEl.value.trim() : "";
5778
+ var newDescriptions = {};
5779
+ if (enDesc) newDescriptions.en = enDesc;
5780
+ if (fiDesc) newDescriptions.fi = fiDesc;
5781
+ var newDesc = enDesc || fiDesc || "";
5172
5782
  var newIcon = iconEl ? iconEl.value.trim() : app.icon || "";
5173
5783
  var newTags = tagsEl ? tagsEl.value.split(",").map(function(s) {
5174
5784
  return s.trim();
@@ -5180,12 +5790,13 @@
5180
5790
  }
5181
5791
  if (app.published && !newDesc) {
5182
5792
  showNotice(t("detail.descRequired") || "Description cannot be empty.");
5183
- if (descEl) descEl.focus();
5793
+ if (enEl) enEl.focus();
5184
5794
  return;
5185
5795
  }
5186
5796
  function finishLocal() {
5187
5797
  app.name = newName;
5188
5798
  app.description = newDesc;
5799
+ app.descriptions = newDescriptions;
5189
5800
  app.icon = newIcon;
5190
5801
  app.tags = newTags;
5191
5802
  saveApp(app).then(function() {
@@ -5211,7 +5822,7 @@
5211
5822
  fetch(aimeatUrl + "/v1/apps/" + encodeURIComponent(filename), {
5212
5823
  method: "PATCH",
5213
5824
  headers: { "Authorization": "Bearer " + token, "Content-Type": "application/json" },
5214
- body: JSON.stringify({ name: newName, description: newDesc })
5825
+ body: JSON.stringify({ name: newName, description: newDesc, descriptions: newDescriptions })
5215
5826
  }).then(function(resp) {
5216
5827
  return resp.json().then(function(j) {
5217
5828
  return { ok: resp.ok, j };
@@ -5219,9 +5830,10 @@
5219
5830
  }).then(function(res) {
5220
5831
  if (res.ok && res.j && res.j.ok !== false) {
5221
5832
  var key = owner + "\n" + filename;
5222
- getServerManifests()[key] = getServerManifests()[key] || {};
5223
- getServerManifests()[key].name = newName;
5224
- getServerManifests()[key].description = newDesc;
5833
+ getServerManifests2()[key] = getServerManifests2()[key] || {};
5834
+ getServerManifests2()[key].name = newName;
5835
+ getServerManifests2()[key].description = newDesc;
5836
+ getServerManifests2()[key].descriptions = newDescriptions;
5225
5837
  finishLocal();
5226
5838
  } else {
5227
5839
  showNotice("Failed: " + (res.j && res.j.error && res.j.error.message || "Unknown error"));
@@ -5230,6 +5842,69 @@
5230
5842
  showNotice("Error: " + (err.message || err));
5231
5843
  });
5232
5844
  }
5845
+ function detailTranslateDesc(srcLang, dstLang, prefix, statusId) {
5846
+ prefix = prefix || "detail-desc-";
5847
+ var srcEl = document.getElementById(prefix + srcLang);
5848
+ var dstEl = document.getElementById(prefix + dstLang);
5849
+ var statusEl = document.getElementById(statusId || "detail-tr-status");
5850
+ if (!srcEl || !dstEl) return;
5851
+ var text = (srcEl.value || "").trim();
5852
+ if (!text) {
5853
+ if (statusEl) statusEl.textContent = t("detail.trNeedSource");
5854
+ return;
5855
+ }
5856
+ var token = getCortexOwnerToken2();
5857
+ if (!token) {
5858
+ if (statusEl) statusEl.textContent = t("detail.aiLoginNeeded");
5859
+ return;
5860
+ }
5861
+ var config = loadConfig();
5862
+ var aimeatUrl = (config.aimeatUrl || "").replace(/\/+$/, "");
5863
+ if (!aimeatUrl) {
5864
+ if (statusEl) statusEl.textContent = t("detail.aiUnavailable");
5865
+ return;
5866
+ }
5867
+ var langName = { en: "English", fi: "Finnish" };
5868
+ if (statusEl) {
5869
+ statusEl.style.color = "var(--text-muted)";
5870
+ statusEl.textContent = t("detail.translating");
5871
+ }
5872
+ var systemPrompt = "You are a professional translator for short app-store copy. Translate the text from " + (langName[srcLang] || srcLang) + " to " + (langName[dstLang] || dstLang) + ". Return ONLY the translated text — no quotes, no notes, no explanation. Keep it concise and natural.";
5873
+ fetch(aimeatUrl + "/v1/ai/complete", {
5874
+ method: "POST",
5875
+ headers: { "Content-Type": "application/json", "Authorization": "Bearer " + token },
5876
+ body: JSON.stringify({ prompt: text, systemPrompt, app_id: "app-catalog" })
5877
+ }).then(function(resp) {
5878
+ return resp.json();
5879
+ }).then(function(json) {
5880
+ if (!json || !json.ok) {
5881
+ var msg = json && json.error && json.error.message || "Translation failed";
5882
+ if (statusEl) {
5883
+ statusEl.style.color = "var(--accent)";
5884
+ statusEl.textContent = "✘ " + msg;
5885
+ }
5886
+ return;
5887
+ }
5888
+ var out = (json.data && json.data.content ? json.data.content : "").trim();
5889
+ if (!out) {
5890
+ if (statusEl) {
5891
+ statusEl.style.color = "var(--accent)";
5892
+ statusEl.textContent = "✘ " + t("detail.trEmpty");
5893
+ }
5894
+ return;
5895
+ }
5896
+ dstEl.value = out;
5897
+ if (statusEl) {
5898
+ statusEl.style.color = "#34d399";
5899
+ statusEl.textContent = "✔ " + t("detail.trDone");
5900
+ }
5901
+ }).catch(function(err) {
5902
+ if (statusEl) {
5903
+ statusEl.style.color = "var(--accent)";
5904
+ statusEl.textContent = "✘ " + (err.message || "Translation failed");
5905
+ }
5906
+ });
5907
+ }
5233
5908
  function detailSetScreenshot() {
5234
5909
  var app = detailGetApp();
5235
5910
  if (!app) return;
@@ -5522,9 +6197,9 @@
5522
6197
  function draftApi(method, owner, filename, sub, body) {
5523
6198
  var cfg = loadConfig();
5524
6199
  if (!cfg.aimeatUrl) return Promise.reject(new Error("Set the AIMEAT server URL in Settings first"));
5525
- var base = cfg.aimeatUrl.replace(/\/+$/, "");
6200
+ var base3 = cfg.aimeatUrl.replace(/\/+$/, "");
5526
6201
  var path = "/v1/apps/" + encodeURIComponent(owner) + "/" + encodeURIComponent(filename) + "/" + sub;
5527
- return fetch(base + path, {
6202
+ return fetch(base3 + path, {
5528
6203
  method,
5529
6204
  headers: { "Authorization": "Bearer " + getCortexOwnerToken2(), "Content-Type": "application/json" },
5530
6205
  body: body ? JSON.stringify(body) : void 0
@@ -5576,6 +6251,21 @@
5576
6251
  return false;
5577
6252
  });
5578
6253
  }
6254
+ function openStagingPreview(owner, filename) {
6255
+ if (!getCortexOwnerToken2()) {
6256
+ showNotice(t("detail.draftNeedsSignin"));
6257
+ return;
6258
+ }
6259
+ if (!owner || !filename) {
6260
+ showNotice(t("detail.draftNeedsPublished"));
6261
+ return;
6262
+ }
6263
+ draftApi("POST", owner, filename, "draft/preview-token").then(function(data) {
6264
+ window.open(data.preview_url, "_blank", "noopener");
6265
+ }).catch(function(err) {
6266
+ showNotice(err.message || "Draft preview failed");
6267
+ });
6268
+ }
5579
6269
  function publishDraftBytes(app, contentB64, statusEl, onDone) {
5580
6270
  var tgt = draftStageTarget(app, statusEl);
5581
6271
  if (!tgt) return;
@@ -5693,12 +6383,13 @@
5693
6383
  return;
5694
6384
  }
5695
6385
  var aimeatUrl = config.aimeatUrl.replace(/\/+$/, "");
5696
- var meta = getServerManifests()[owner + "\n" + filename] || {};
6386
+ var meta = getServerManifests2()[owner + "\n" + filename] || {};
5697
6387
  fetchAppContentBase64(aimeatUrl, owner, filename).then(function(b64) {
5698
6388
  var app = {
5699
6389
  id: generateId2(),
5700
6390
  name: meta.name || filename.replace(/\.html?$/i, ""),
5701
6391
  description: meta.description || "",
6392
+ descriptions: meta.descriptions || null,
5702
6393
  category: meta.category || "utility",
5703
6394
  tags: meta.tags || [],
5704
6395
  usesCortex: meta.usesCortex || [],
@@ -5924,7 +6615,7 @@
5924
6615
  var statusEl = document.getElementById("versions-status");
5925
6616
  statusEl.textContent = "Restoring version " + version + "…";
5926
6617
  statusEl.style.color = "#34d399";
5927
- var meta = getServerManifests()[owner + "\n" + filename] || {};
6618
+ var meta = getServerManifests2()[owner + "\n" + filename] || {};
5928
6619
  fetchAppContentBase64(aimeatUrl, owner, filename, version).then(function(b64) {
5929
6620
  var body = {
5930
6621
  filename,
@@ -5932,6 +6623,7 @@
5932
6623
  mime_type: "text/html",
5933
6624
  name: meta.name || filename.replace(/\.html?$/i, ""),
5934
6625
  description: meta.description || "",
6626
+ descriptions: meta.descriptions || null,
5935
6627
  category: meta.category || "utility",
5936
6628
  tags: meta.tags || [],
5937
6629
  uses_cortex: meta.usesCortex || []
@@ -5967,8 +6659,8 @@
5967
6659
  showNotice(t("common.loginRequired") || "You must be logged in to fork an app into your own catalogue. Sign in first.");
5968
6660
  return;
5969
6661
  }
5970
- var base = (filename || "app").replace(/\.html?$/i, "");
5971
- var suggested = base + "-fork.html";
6662
+ var base3 = (filename || "app").replace(/\.html?$/i, "");
6663
+ var suggested = base3 + "-fork.html";
5972
6664
  var newName = prompt(t("fork.prompt") || 'Fork "' + filename + '" into a new app.\n\nNew filename:', suggested);
5973
6665
  if (!newName) return;
5974
6666
  newName = newName.trim();
@@ -6017,11 +6709,7 @@
6017
6709
  }
6018
6710
 
6019
6711
  // src/static/app-catalog/js/settings.js
6020
- var generateId3;
6021
- var renderApps2;
6022
- var loadPublishedApps2;
6023
- function initSettings(deps) {
6024
- ({ generateId: generateId3, renderApps: renderApps2, loadPublishedApps: loadPublishedApps2 } = deps);
6712
+ function initSettings() {
6025
6713
  }
6026
6714
  function applyTheme(theme) {
6027
6715
  if (theme === "dark") {
@@ -6168,260 +6856,36 @@
6168
6856
  function closeHelp() {
6169
6857
  document.getElementById("help-overlay").hidden = true;
6170
6858
  }
6171
- function exportBackup() {
6172
- getAllApps().then(function(apps) {
6173
- var config = loadConfig();
6174
- var backup = {
6175
- version: 1,
6176
- exportedAt: (/* @__PURE__ */ new Date()).toISOString(),
6177
- config,
6178
- apps
6179
- };
6180
- var json = JSON.stringify(backup, null, 2);
6181
- var blob = new Blob([json], { type: "application/json" });
6182
- var url = URL.createObjectURL(blob);
6183
- var a = document.createElement("a");
6184
- a.href = url;
6185
- a.download = "app-catalog-backup-" + (/* @__PURE__ */ new Date()).toISOString().slice(0, 10) + ".json";
6186
- document.body.appendChild(a);
6187
- a.click();
6188
- document.body.removeChild(a);
6189
- URL.revokeObjectURL(url);
6190
- });
6191
- }
6192
- function localAppKey(a) {
6193
- if (a.publishedFilename) return "pf:" + a.publishedFilename;
6194
- return "nm:" + (a.name || "") + "|" + (a.blob ? a.blob.length : a.url || "");
6195
- }
6196
- var jsonImportState = null;
6197
- function handleImportBackup(file) {
6198
- if (!file) return;
6199
- var reader = new FileReader();
6200
- reader.onload = function() {
6201
- var backup;
6202
- try {
6203
- backup = JSON.parse(reader.result);
6204
- } catch (e) {
6205
- showNotice("Failed to parse backup file: " + (e.message || e));
6206
- return;
6207
- }
6208
- if (!backup.apps || !Array.isArray(backup.apps)) {
6209
- showNotice("Invalid backup file: missing apps array");
6210
- return;
6211
- }
6212
- getAllApps().then(function(existing) {
6213
- var existingKeys = {};
6214
- existing.forEach(function(a) {
6215
- existingKeys[localAppKey(a)] = true;
6216
- });
6217
- jsonImportState = {
6218
- backup,
6219
- rows: backup.apps.map(function(a) {
6220
- return { app: a, isDup: !!existingKeys[localAppKey(a)] };
6221
- })
6222
- };
6223
- renderJsonImportModal();
6224
- });
6225
- };
6226
- reader.readAsText(file);
6227
- }
6228
- function renderJsonImportModal() {
6229
- var rows = jsonImportState.rows;
6230
- var body = document.getElementById("json-import-body");
6231
- var html = '<p style="font-size:.8rem;color:var(--text-muted);margin:4px 0 8px">' + t("jsonImport.desc") + '</p><div class="backup-toolbar-row"><div><button class="backup-link-btn" onclick="window._launcher.jsonImportSelectAll(true)">' + t("backup.selectAll") + '</button> / <button class="backup-link-btn" onclick="window._launcher.jsonImportSelectAll(false)">' + t("backup.selectNone") + '</button></div></div><table class="backup-table"><tbody>';
6232
- for (var i = 0; i < rows.length; i++) {
6233
- var a = rows[i].app;
6234
- html += '<tr><td><input type="checkbox" class="json-import-cb" data-i="' + i + '"' + (rows[i].isDup ? "" : " checked") + "/></td><td>" + escapeHtml(a.name || a.publishedFilename || "Untitled") + (a.publishedFilename ? '<div class="mono-cell">' + escapeHtml(a.publishedFilename) + "</div>" : "") + "</td><td>" + sourceLabel(a.source) + "</td><td>" + (rows[i].isDup ? '<span class="backup-status-badge backup-status-exists">' + t("jsonImport.statusDup") + "</span>" : '<span class="backup-status-badge backup-status-new">' + t("backup.statusNew") + "</span>") + "</td></tr>";
6235
- }
6236
- html += "</tbody></table>";
6237
- if (jsonImportState.backup.config && typeof jsonImportState.backup.config === "object") {
6238
- html += '<label style="display:flex;align-items:center;gap:8px;margin-top:10px;font-size:.85rem"><input type="checkbox" id="json-import-config"/> ' + t("jsonImport.config") + "</label>";
6239
- }
6240
- body.innerHTML = html;
6241
- document.getElementById("json-import-status").textContent = "";
6242
- document.getElementById("json-import-btn").style.display = "";
6243
- document.getElementById("json-import-overlay").hidden = false;
6244
- }
6245
- function jsonImportSelectAll(checked) {
6246
- document.querySelectorAll(".json-import-cb").forEach(function(b) {
6247
- b.checked = checked;
6248
- });
6249
- }
6250
- function submitJsonImport() {
6251
- var statusEl = document.getElementById("json-import-status");
6252
- var selected = [];
6253
- document.querySelectorAll(".json-import-cb").forEach(function(b) {
6254
- if (b.checked) selected.push(jsonImportState.rows[parseInt(b.getAttribute("data-i"), 10)].app);
6255
- });
6256
- var configCb = document.getElementById("json-import-config");
6257
- var importConfig = !!(configCb && configCb.checked);
6258
- if (selected.length === 0 && !importConfig) {
6259
- statusEl.style.color = "#ef4444";
6260
- statusEl.textContent = t("backup.nothingSelected");
6261
- return;
6262
- }
6263
- if (importConfig) {
6264
- var merged = Object.assign({}, loadConfig(), jsonImportState.backup.config);
6265
- saveConfig(merged);
6266
- applyTheme(merged.theme);
6267
- }
6268
- Promise.all(selected.map(function(a) {
6269
- var app = Object.assign({}, a);
6270
- app.id = generateId3();
6271
- return saveApp(app);
6272
- })).then(function() {
6273
- statusEl.style.color = "#34d399";
6274
- statusEl.textContent = "✔ " + t("jsonImport.done") + ": " + selected.length;
6275
- document.getElementById("json-import-btn").style.display = "none";
6276
- renderApps2();
6277
- loadPublishedApps2();
6278
- });
6279
- }
6280
- function removeDuplicateApps() {
6281
- getAllApps().then(async function(apps) {
6282
- var groups = {};
6283
- apps.forEach(function(a) {
6284
- var k = localAppKey(a);
6285
- (groups[k] = groups[k] || []).push(a);
6286
- });
6287
- var toDelete = [];
6288
- Object.keys(groups).forEach(function(k) {
6289
- var g = groups[k];
6290
- if (g.length < 2) return;
6291
- g.sort(function(x, y) {
6292
- if (!!y.favorite !== !!x.favorite) return (y.favorite ? 1 : 0) - (x.favorite ? 1 : 0);
6293
- return (x.addedAt || "") < (y.addedAt || "") ? -1 : 1;
6294
- });
6295
- toDelete = toDelete.concat(g.slice(1));
6296
- });
6297
- if (toDelete.length === 0) {
6298
- showNotice(t("dedup.none"));
6299
- return;
6300
- }
6301
- if (!await showConfirm(t("dedup.confirm") + " " + toDelete.length)) return;
6302
- Promise.all(toDelete.map(function(a) {
6303
- return deleteApp(a.id);
6304
- })).then(function() {
6305
- renderApps2();
6306
- loadPublishedApps2();
6307
- showNotice(t("dedup.done") + ": " + toDelete.length);
6308
- });
6309
- });
6310
- }
6311
- async function clearAllData() {
6312
- if (!await showConfirm(t("confirm.clearAll1"))) return;
6313
- if (!await showConfirm(t("confirm.clearAll2"))) return;
6314
- openDB().then(function(db) {
6315
- return new Promise(function(resolve, reject) {
6316
- var tx = db.transaction(STORE_NAME, "readwrite");
6317
- tx.objectStore(STORE_NAME).clear();
6318
- tx.oncomplete = function() {
6319
- resolve();
6320
- };
6321
- tx.onerror = function() {
6322
- reject(tx.error);
6323
- };
6324
- });
6325
- }).then(function() {
6326
- localStorage.removeItem("appLauncherConfig");
6327
- applyTheme("dark");
6328
- renderApps2();
6329
- document.getElementById("settings-overlay").hidden = true;
6330
- showNotice("All data cleared");
6331
- });
6332
- }
6333
6859
 
6334
6860
  // src/static/app-catalog/js/apps-io.js
6335
- var generateId4;
6861
+ var generateId3;
6336
6862
  var readFileAsText2;
6337
- var renderApps3;
6863
+ var renderApps2;
6338
6864
  var getMainApps2;
6865
+ var showPublishModal2;
6339
6866
  function initAppsIo(deps) {
6340
- ({ generateId: generateId4, readFileAsText: readFileAsText2, renderApps: renderApps3, getMainApps: getMainApps2 } = deps);
6867
+ ({ generateId: generateId3, readFileAsText: readFileAsText2, renderApps: renderApps2, getMainApps: getMainApps2, showPublishModal: showPublishModal2 } = deps);
6341
6868
  }
6342
- async function addAppFromZip(name, arrayBuffer, icon, tags, openMode) {
6343
- var files = await extractZip(arrayBuffer);
6344
- var bundledHtml = await bundleZip(files);
6345
- var encoded = btoa(unescape(encodeURIComponent(bundledHtml)));
6869
+ function createAppFromHtml(name, html, icon, tags, description) {
6870
+ var encoded = btoa(unescape(encodeURIComponent(html)));
6346
6871
  var app = {
6347
- id: generateId4(),
6872
+ id: generateId3(),
6348
6873
  name,
6349
- description: "",
6350
- source: "zip",
6874
+ description: description || "",
6875
+ source: "create",
6351
6876
  url: null,
6352
6877
  blob: encoded,
6353
- tags,
6354
- openMode,
6355
- icon: icon || "📦",
6356
- screenshot: null,
6357
- favorite: false,
6358
- addedAt: (/* @__PURE__ */ new Date()).toISOString(),
6359
- lastOpenedAt: null
6360
- };
6361
- await saveApp(app);
6362
- return app;
6363
- }
6364
- function addAppFromUrl(name, url, icon, tags, openMode) {
6365
- var app = {
6366
- id: generateId4(),
6367
- name,
6368
- description: "",
6369
- source: "url",
6370
- url,
6371
- blob: null,
6372
- tags,
6373
- openMode,
6878
+ tags: tags || [],
6374
6879
  icon: icon || "📝",
6375
- screenshot: null,
6376
- favorite: false,
6377
- addedAt: (/* @__PURE__ */ new Date()).toISOString(),
6378
- lastOpenedAt: null
6379
- };
6380
- return saveApp(app).then(function() {
6381
- return app;
6382
- });
6383
- }
6384
- function addAppFromFile(name, file, icon, tags, openMode) {
6385
- return readFileAsText2(file).then(function(content) {
6386
- var encoded = btoa(unescape(encodeURIComponent(content)));
6387
- var app = {
6388
- id: generateId4(),
6389
- name,
6390
- description: "",
6391
- source: "local",
6392
- url: null,
6393
- blob: encoded,
6394
- tags,
6395
- openMode,
6396
- icon: icon || "📝",
6397
- screenshot: null,
6398
- favorite: false,
6399
- addedAt: (/* @__PURE__ */ new Date()).toISOString(),
6400
- lastOpenedAt: null
6401
- };
6402
- return saveApp(app).then(function() {
6403
- return app;
6404
- });
6405
- });
6406
- }
6407
- function addAppFromSource(name, sourceCode, icon, tags, openMode) {
6408
- var encoded = btoa(unescape(encodeURIComponent(sourceCode)));
6409
- var app = {
6410
- id: generateId4(),
6411
- name,
6412
- description: parseAppMeta(sourceCode).description || "",
6413
- source: "local",
6414
- url: null,
6415
- blob: encoded,
6416
- tags,
6417
- openMode,
6418
- icon: icon || "📝",
6419
- screenshot: null,
6420
- favorite: false,
6421
- addedAt: (/* @__PURE__ */ new Date()).toISOString(),
6422
- lastOpenedAt: null
6880
+ published: false,
6881
+ addedAt: (/* @__PURE__ */ new Date()).toISOString()
6423
6882
  };
6424
6883
  return saveApp(app).then(function() {
6884
+ try {
6885
+ getMainApps2().push(app);
6886
+ } catch (e) {
6887
+ }
6888
+ if (typeof showPublishModal2 === "function") showPublishModal2(app.id, { unlisted: true });
6425
6889
  return app;
6426
6890
  });
6427
6891
  }
@@ -6430,7 +6894,7 @@
6430
6894
  function showModal() {
6431
6895
  document.getElementById("modal-overlay").hidden = false;
6432
6896
  document.getElementById("modal-title").textContent = t("addModal.title");
6433
- switchTab("url");
6897
+ switchTab("paste");
6434
6898
  }
6435
6899
  function requireSignInThen(next) {
6436
6900
  if (getCortexOwnerToken()) {
@@ -6478,7 +6942,6 @@
6478
6942
  }
6479
6943
  function closeModal() {
6480
6944
  document.getElementById("modal-overlay").hidden = true;
6481
- document.getElementById("app-url").value = "";
6482
6945
  document.getElementById("app-name").value = "";
6483
6946
  document.getElementById("app-icon").value = "";
6484
6947
  document.getElementById("app-tags").value = "";
@@ -6532,7 +6995,6 @@
6532
6995
  var name = document.getElementById("app-name").value.trim();
6533
6996
  var icon = document.getElementById("app-icon").value.trim();
6534
6997
  var tagsRaw = document.getElementById("app-tags").value.trim();
6535
- var openMode = "tab";
6536
6998
  var tags = tagsRaw ? tagsRaw.split(",").map(function(t2) {
6537
6999
  return t2.trim();
6538
7000
  }).filter(Boolean) : [];
@@ -6555,218 +7017,133 @@
6555
7017
  app.name = name;
6556
7018
  app.icon = icon || app.icon;
6557
7019
  app.tags = tags;
6558
- app.openMode = openMode;
6559
7020
  saveApp(app).then(function() {
6560
7021
  closeModal();
6561
- renderApps3();
7022
+ renderApps2();
6562
7023
  });
6563
7024
  return;
6564
7025
  }
6565
7026
  var activeTab = document.querySelector(".modal-tab.active");
6566
- var tabName = activeTab ? activeTab.getAttribute("data-tab") : "url";
6567
- if (tabName === "url") {
6568
- var url = document.getElementById("app-url").value.trim();
6569
- if (!url) {
6570
- showNotice("Please enter a URL");
6571
- return;
6572
- }
6573
- if (!name) {
6574
- try {
6575
- name = new URL(url).hostname;
6576
- } catch (e) {
6577
- name = url;
6578
- }
6579
- }
6580
- addAppFromUrl(name, url, icon, tags, openMode).then(function() {
6581
- closeModal();
6582
- renderApps3();
6583
- });
6584
- } else if (tabName === "paste") {
7027
+ var tabName = activeTab ? activeTab.getAttribute("data-tab") : "paste";
7028
+ if (tabName === "paste") {
6585
7029
  var pastedCode = document.getElementById("app-paste-code").value.trim();
6586
7030
  if (!pastedCode) {
6587
7031
  showNotice("Please paste your HTML source code");
6588
7032
  return;
6589
7033
  }
6590
- if (!name) {
6591
- var titleMatch = pastedCode.match(/<title[^>]*>([^<]+)<\/title>/i);
6592
- name = titleMatch ? titleMatch[1].trim() : "Pasted App";
6593
- }
6594
- addAppFromSource(name, pastedCode, icon, tags, openMode).then(function() {
6595
- closeModal();
6596
- renderApps3();
6597
- });
7034
+ var meta = parseAppMeta(pastedCode);
7035
+ if (!name) name = meta.name || "Pasted App";
7036
+ closeModal();
7037
+ createAppFromHtml(name, pastedCode, icon, tags, meta.description);
6598
7038
  } else if (tabName === "file") {
6599
7039
  if (!selectedFile) {
6600
7040
  showNotice("Please select a file");
6601
7041
  return;
6602
7042
  }
6603
- if (selectedFile.name.toLowerCase().endsWith(".zip")) {
6604
- if (!name) {
6605
- name = selectedFile.name.replace(/\.zip$/i, "");
6606
- }
6607
- selectedFile.arrayBuffer().then(function(arrayBuffer) {
6608
- return addAppFromZip(name, arrayBuffer, icon, tags, openMode);
6609
- }).then(function() {
7043
+ var file = selectedFile;
7044
+ if (file.name.toLowerCase().endsWith(".zip")) {
7045
+ if (!name) name = file.name.replace(/\.zip$/i, "");
7046
+ file.arrayBuffer().then(function(arrayBuffer) {
7047
+ return extractZip(arrayBuffer);
7048
+ }).then(function(files) {
7049
+ return bundleZip(files);
7050
+ }).then(function(html) {
6610
7051
  closeModal();
6611
- renderApps3();
7052
+ return createAppFromHtml(name, html, icon, tags, parseAppMeta(html).description);
6612
7053
  }).catch(function(err) {
6613
7054
  showNotice("ZIP import failed: " + (err.message || err));
6614
7055
  });
6615
7056
  } else {
6616
- if (!name) {
6617
- name = selectedFile.name.replace(/\.html?$/i, "");
6618
- }
6619
- addAppFromFile(name, selectedFile, icon, tags, openMode).then(function() {
7057
+ if (!name) name = file.name.replace(/\.html?$/i, "");
7058
+ readFileAsText2(file).then(function(html) {
6620
7059
  closeModal();
6621
- renderApps3();
7060
+ createAppFromHtml(name, html, icon, tags, parseAppMeta(html).description);
6622
7061
  });
6623
7062
  }
6624
7063
  }
6625
7064
  }
6626
- function setEditingAppId(v) {
6627
- editingAppId = v;
7065
+
7066
+ // src/static/app-catalog/js/favorites.js
7067
+ var KEY2 = "app-catalog.favorites";
7068
+ var favSet = /* @__PURE__ */ new Set();
7069
+ function base2() {
7070
+ return (loadConfig().aimeatUrl || "").replace(/\/+$/, "");
7071
+ }
7072
+ function isFavorite(ref) {
7073
+ return favSet.has(ref);
7074
+ }
7075
+ function loadFavorites() {
7076
+ var token = getCortexOwnerToken();
7077
+ var b = base2();
7078
+ if (!token || !b) {
7079
+ favSet = /* @__PURE__ */ new Set();
7080
+ return Promise.resolve();
7081
+ }
7082
+ return fetch(b + "/v1/memory/" + encodeURIComponent(KEY2), { headers: { "Authorization": "Bearer " + token } }).then(function(r) {
7083
+ return r.ok ? r.json() : null;
7084
+ }).then(function(j) {
7085
+ var refs = j && j.data && j.data.value && Array.isArray(j.data.value.refs) ? j.data.value.refs : [];
7086
+ favSet = new Set(refs.filter(function(x) {
7087
+ return typeof x === "string";
7088
+ }));
7089
+ }).catch(function() {
7090
+ });
7091
+ }
7092
+ function persist2() {
7093
+ var token = getCortexOwnerToken();
7094
+ var b = base2();
7095
+ if (!token || !b) return Promise.resolve();
7096
+ return fetch(b + "/v1/memory", {
7097
+ method: "POST",
7098
+ headers: { "Content-Type": "application/json", "Authorization": "Bearer " + token },
7099
+ body: JSON.stringify({
7100
+ key: KEY2,
7101
+ value: { version: 1, updatedAt: (/* @__PURE__ */ new Date()).toISOString(), refs: Array.from(favSet) },
7102
+ visibility: "private"
7103
+ })
7104
+ }).catch(function() {
7105
+ });
7106
+ }
7107
+ function toggleFavorite(ref) {
7108
+ var now;
7109
+ if (favSet.has(ref)) {
7110
+ favSet.delete(ref);
7111
+ now = false;
7112
+ } else {
7113
+ favSet.add(ref);
7114
+ now = true;
7115
+ }
7116
+ return persist2().then(function() {
7117
+ return now;
7118
+ });
7119
+ }
7120
+ function favStarHtml(ref) {
7121
+ var on = favSet.has(ref);
7122
+ var title = on ? t("fav.remove") || "Remove from favourites" : t("fav.add") || "Add to favourites";
7123
+ return '<button class="fav-toggle' + (on ? " on" : "") + `" onclick="event.stopPropagation(); window._launcher.toggleFavorite('` + String(ref).replace(/'/g, "\\'") + `')" title="` + title + '">' + (on ? "⭐" : "☆") + "</button>";
6628
7124
  }
6629
7125
 
6630
7126
  // src/static/app-catalog/js/server-io.js
6631
7127
  var getMainApps3;
6632
7128
  var getServerState2;
6633
- var getServerManifests2;
7129
+ var getServerManifests3;
6634
7130
  var setServerManifests;
6635
7131
  var getOwnServerApps;
6636
7132
  var setOwnServerApps;
6637
7133
  var getActiveTag;
6638
7134
  var getSearchQuery;
6639
- var generateId5;
6640
- var renderApps4;
7135
+ var generateId4;
7136
+ var renderApps3;
6641
7137
  var refreshAll2;
6642
7138
  function initServerIo(deps) {
6643
- ({ getMainApps: getMainApps3, getServerState: getServerState2, getServerManifests: getServerManifests2, setServerManifests, getOwnServerApps, setOwnServerApps, getActiveTag, getSearchQuery, generateId: generateId5, renderApps: renderApps4, refreshAll: refreshAll2 } = deps);
6644
- }
6645
- var aimeatAppsCache = [];
6646
- function formatFileSize(bytes) {
6647
- if (bytes < 1024) return bytes + " B";
6648
- if (bytes < 1048576) return (bytes / 1024).toFixed(1) + " KB";
6649
- return (bytes / 1048576).toFixed(1) + " MB";
6650
- }
6651
- function importFromAimeat() {
6652
- var config = loadConfig();
6653
- if (!config.aimeatUrl) {
6654
- showNotice("Set AIMEAT server URL in Settings first");
6655
- return;
6656
- }
6657
- var aimeatUrl = config.aimeatUrl.replace(/\/+$/, "");
6658
- closeModal();
6659
- fetch(aimeatUrl + "/v1/apps?include_peers=true").then(function(resp) {
6660
- if (!resp.ok) throw new Error("Server returned " + resp.status);
6661
- return resp.json();
6662
- }).then(function(json) {
6663
- var apps = json.data && json.data.apps ? json.data.apps : [];
6664
- var peerApps = json.data && json.data.peer_apps ? json.data.peer_apps : [];
6665
- for (var p = 0; p < peerApps.length; p++) {
6666
- peerApps[p]._from_peer = true;
6667
- }
6668
- var allFetched = apps.concat(peerApps);
6669
- if (allFetched.length === 0) {
6670
- showNotice("No apps found on the AIMEAT server");
6671
- return;
6672
- }
6673
- aimeatAppsCache = allFetched;
6674
- showAimeatImportDialog(allFetched, aimeatUrl);
6675
- }).catch(function(err) {
6676
- var msg = "Failed to fetch apps from AIMEAT server.\n\n" + (err.message || err);
6677
- if (err.message && err.message.indexOf("Failed to fetch") !== -1) {
6678
- msg += "\n\nIf the launcher is opened via file://, CORS will block the request. Open it from the AIMEAT server instead.";
6679
- }
6680
- showNotice(msg);
6681
- });
6682
- }
6683
- function showAimeatImportDialog(apps, aimeatUrl) {
6684
- var listEl = document.getElementById("aimeat-app-list");
6685
- var html = "";
6686
- for (var i = 0; i < apps.length; i++) {
6687
- var app = apps[i];
6688
- var displayName = app.manifest && app.manifest.name ? app.manifest.name : app.filename;
6689
- var displayAuthor = app.manifest && app.manifest.authorDisplay ? app.manifest.authorDisplay : app.owner || "";
6690
- var displayDesc = app.manifest && app.manifest.description ? app.manifest.description : "";
6691
- var displayVer = app.version_number ? "v" + app.version_number : "";
6692
- var displayCat = app.manifest && app.manifest.category ? app.manifest.category : "";
6693
- var peerLabel = app._from_peer && app._peer_node ? " · 🌐 " + escapeHtml(app._peer_node) : "";
6694
- html += '<div class="aimeat-app-item"><input type="checkbox" data-index="' + i + '" checked/><div class="aimeat-app-info"><div class="aimeat-app-name">' + escapeHtml(displayName) + (displayVer ? ' <span style="opacity:.5;font-size:.85em">' + escapeHtml(displayVer) + "</span>" : "") + '</div><div class="aimeat-app-size">' + formatFileSize(app.size) + (displayAuthor ? " · " + escapeHtml(displayAuthor) : "") + (displayCat ? " · " + escapeHtml(displayCat) : "") + peerLabel + "</div>" + (displayDesc ? '<div class="aimeat-app-size" style="opacity:.6">' + escapeHtml(displayDesc.substring(0, 100)) + "</div>" : "") + '</div><select data-index="' + i + '"><option value="link">Link (online only)</option><option value="download">Download (offline)</option></select></div>';
6695
- }
6696
- listEl.innerHTML = html;
6697
- listEl.dataset.aimeatUrl = aimeatUrl;
6698
- document.getElementById("aimeat-import-overlay").hidden = false;
6699
- }
6700
- function processAimeatImport() {
6701
- var listEl = document.getElementById("aimeat-app-list");
6702
- var aimeatUrl = listEl.dataset.aimeatUrl;
6703
- var checkboxes = listEl.querySelectorAll('input[type="checkbox"]');
6704
- var selects = listEl.querySelectorAll("select");
6705
- var config = loadConfig();
6706
- var defaultOpenMode = config.defaultOpenMode || "tab";
6707
- var toImport = [];
6708
- for (var i = 0; i < checkboxes.length; i++) {
6709
- if (checkboxes[i].checked) {
6710
- var idx = parseInt(checkboxes[i].getAttribute("data-index"), 10);
6711
- var mode = selects[i].value;
6712
- toImport.push({ app: aimeatAppsCache[idx], mode });
6713
- }
6714
- }
6715
- if (toImport.length === 0) {
6716
- showNotice("No apps selected");
6717
- return;
6718
- }
6719
- var promises = [];
6720
- for (var j = 0; j < toImport.length; j++) {
6721
- (function(item) {
6722
- var app = item.app;
6723
- var name = app.manifest && app.manifest.name ? app.manifest.name : app.filename.replace(/\.html?$/i, "");
6724
- var importedVersion = app.version_number || 1;
6725
- var baseUrl = app._from_peer && app._peer_url ? app._peer_url.replace(/\/+$/, "") : aimeatUrl;
6726
- if (item.mode === "link") {
6727
- var inlineUrl = baseUrl + app.download_url + "?mode=inline";
6728
- promises.push(addAppFromUrl(name, inlineUrl, "📦", ["aimeat"], defaultOpenMode));
6729
- } else {
6730
- var downloadUrl = baseUrl + app.download_url;
6731
- promises.push(
6732
- fetch(downloadUrl).then(function(resp) {
6733
- if (!resp.ok) throw new Error("Download failed: " + resp.status);
6734
- return resp.text();
6735
- }).then(function(content) {
6736
- var encoded = btoa(unescape(encodeURIComponent(content)));
6737
- var record = {
6738
- id: generateId5(),
6739
- name,
6740
- description: app.manifest && app.manifest.description ? app.manifest.description : "",
6741
- source: "aimeat",
6742
- aimeatOwner: app.owner || null,
6743
- aimeatFilename: app.filename || null,
6744
- aimeatVersion: importedVersion,
6745
- url: null,
6746
- blob: encoded,
6747
- tags: ["aimeat"],
6748
- openMode: defaultOpenMode,
6749
- icon: "📦",
6750
- screenshot: null,
6751
- favorite: false,
6752
- addedAt: (/* @__PURE__ */ new Date()).toISOString(),
6753
- lastOpenedAt: null
6754
- };
6755
- return saveApp(record);
6756
- })
6757
- );
6758
- }
6759
- })(toImport[j]);
6760
- }
6761
- Promise.all(promises).then(function() {
6762
- document.getElementById("aimeat-import-overlay").hidden = true;
6763
- renderApps4();
6764
- }).catch(function(err) {
6765
- showNotice("Import error: " + (err.message || err));
6766
- });
7139
+ ({ getMainApps: getMainApps3, getServerState: getServerState2, getServerManifests: getServerManifests3, setServerManifests, getOwnServerApps, setOwnServerApps, getActiveTag, getSearchQuery, generateId: generateId4, renderApps: renderApps3, refreshAll: refreshAll2 } = deps);
6767
7140
  }
7141
+ var lastAllServerApps = [];
7142
+ var lastAimeatUrl = "";
6768
7143
  var publishAppId = null;
6769
- function showPublishModal2(appId) {
7144
+ var publishUnlisted = false;
7145
+ function showPublishModal3(appId, opts) {
7146
+ publishUnlisted = !!(opts && opts.unlisted);
6770
7147
  var app = null;
6771
7148
  for (var i = 0; i < getMainApps3().length; i++) {
6772
7149
  if (getMainApps3()[i].id === appId) {
@@ -6888,7 +7265,16 @@
6888
7265
  app.publishedVersionNumber = json.data.version_number || 1;
6889
7266
  app.publishedVersionsUrl = json.data.versions_url || null;
6890
7267
  saveApp(app).then(function() {
6891
- loadPublishedApps3();
7268
+ if (publishUnlisted) {
7269
+ app.parked = true;
7270
+ statusEl.textContent = "✔ " + (t("publish.savedUnlisted") || "Saved (unlisted)");
7271
+ try {
7272
+ toggleParkApp(filename, true);
7273
+ } catch (e) {
7274
+ }
7275
+ }
7276
+ publishUnlisted = false;
7277
+ loadPublishedApps2();
6892
7278
  setTimeout(function() {
6893
7279
  var ov = document.getElementById("publish-overlay");
6894
7280
  if (ov) ov.hidden = true;
@@ -7042,7 +7428,7 @@
7042
7428
  statusEl.textContent = "✔ " + t("subModal.assigned") + " — " + sub + "." + apexHostLabel();
7043
7429
  return loadSubdomainSites();
7044
7430
  }).then(function() {
7045
- loadPublishedApps3();
7431
+ loadPublishedApps2();
7046
7432
  }).catch(function(err) {
7047
7433
  statusEl.style.color = "#ef4444";
7048
7434
  statusEl.textContent = err.message || String(err);
@@ -7060,7 +7446,7 @@
7060
7446
  subdomainModalState.existingSub = null;
7061
7447
  return loadSubdomainSites();
7062
7448
  }).then(function() {
7063
- loadPublishedApps3();
7449
+ loadPublishedApps2();
7064
7450
  }).catch(function(err) {
7065
7451
  statusEl.style.color = "#ef4444";
7066
7452
  statusEl.textContent = err.message || String(err);
@@ -7385,7 +7771,7 @@
7385
7771
  }
7386
7772
  return page(0);
7387
7773
  }
7388
- function loadPublishedApps3() {
7774
+ function loadPublishedApps2() {
7389
7775
  var config = loadConfig();
7390
7776
  var aimeatUrl = config.aimeatUrl ? config.aimeatUrl.replace(/\/+$/, "") : "";
7391
7777
  var communitySection = document.getElementById("community-section");
@@ -7404,10 +7790,10 @@
7404
7790
  }
7405
7791
  } catch (e) {
7406
7792
  }
7407
- getAllApps().then(function() {
7793
+ Promise.all([getAllApps(), loadFavorites(), loadPromoted()]).then(function() {
7408
7794
  if (!aimeatUrl) {
7409
7795
  setOwnServerApps([]);
7410
- renderApps4();
7796
+ renderApps3();
7411
7797
  if (communitySection) communitySection.style.display = "none";
7412
7798
  return;
7413
7799
  }
@@ -7419,7 +7805,7 @@
7419
7805
  setServerManifests({});
7420
7806
  for (var mi = 0; mi < serverApps.length; mi++) {
7421
7807
  var msa = serverApps[mi];
7422
- getServerManifests2()[(msa.owner || "") + "\n" + (msa.filename || "")] = msa.manifest || {};
7808
+ getServerManifests3()[(msa.owner || "") + "\n" + (msa.filename || "")] = msa.manifest || {};
7423
7809
  }
7424
7810
  var ownApps = currentOwner ? serverApps.filter(function(a) {
7425
7811
  return sameOwner(a.owner, currentOwner);
@@ -7427,15 +7813,18 @@
7427
7813
  var communityApps = currentOwner ? serverApps.filter(function(a) {
7428
7814
  return !sameOwner(a.owner, currentOwner);
7429
7815
  }) : serverApps;
7816
+ lastAllServerApps = serverApps;
7817
+ lastAimeatUrl = aimeatUrl;
7430
7818
  return loadSubdomainSites().then(function() {
7431
7819
  setOwnServerApps(currentOwner ? ownApps : []);
7432
- renderApps4();
7820
+ renderApps3();
7433
7821
  renderCommunityApps(communityApps, aimeatUrl, communitySection, communityGrid, communityCountEl, currentOwner);
7822
+ renderFavorites(serverApps, aimeatUrl);
7434
7823
  applyServerFilter();
7435
7824
  });
7436
7825
  }).catch(function() {
7437
7826
  setOwnServerApps([]);
7438
- renderApps4();
7827
+ renderApps3();
7439
7828
  if (communitySection) communitySection.style.display = "none";
7440
7829
  });
7441
7830
  });
@@ -7465,6 +7854,21 @@
7465
7854
  var sectionEl = document.getElementById("community-section");
7466
7855
  if (sectionEl) sectionEl.style.display = filtering && shown === 0 ? "none" : "";
7467
7856
  }
7857
+ function publishedCardHtml(sa, aimeatUrl) {
7858
+ var owner = sa.owner || "";
7859
+ var fn = sa.filename || "";
7860
+ var ref = owner + "/" + fn;
7861
+ var m = sa.manifest || {};
7862
+ var name = m.name || fn;
7863
+ var version = sa.version_number ? "v" + sa.version_number : "";
7864
+ var description = m.descriptions && m.descriptions[getLang()] || m.description || "";
7865
+ var date = sa.created_at ? new Date(sa.created_at).toLocaleDateString() : "";
7866
+ var author = m.authorDisplay || owner;
7867
+ var viewUrl = aimeatUrl + "/v1/apps/" + encodeURIComponent(owner) + "/" + encodeURIComponent(fn);
7868
+ var shipsAgent = !!(m.cortex && m.cortex.agents && m.cortex.agents.length);
7869
+ return '<div class="published-card"' + filterAttr(name, m.tags || []) + ">" + favStarHtml(ref) + '<div class="published-card-name">' + escapeHtml(name) + "</div>" + (description ? '<div class="published-card-desc">' + escapeHtml(description) + "</div>" : "") + '<div class="published-card-footer"><div class="published-card-metaline"><span class="pcm-main" style="color:var(--accent)">&#x1F464; ' + escapeHtml(author) + "</span>" + (date ? '<span class="pcm-date">' + date + "</span>" : "") + `</div><div class="published-card-actions"><button onclick="window._launcher.viewPublished('` + escapeHtml(viewUrl) + "?mode=inline', '" + jsArg(name) + `')">` + t("card.view") + "</button>" + // Fork is offered on a community app only when its owner marked it forkable.
7870
+ (sa.forkable ? `<button onclick="window._launcher.forkVersion('` + escapeHtml(owner) + "', '" + escapeHtml(fn) + "', " + (sa.version_number || 0) + ')" title="' + escapeHtml(t("card.forkHint")) + '">' + t("card.fork") + "</button>" : "") + (shipsAgent ? `<button onclick="window._launcher.showAppAgentsModal('` + jsArg(owner) + "', '" + jsArg(fn) + `')" title="` + escapeHtml(t("card.agentHint")) + '">' + t("card.agent") + "</button>" : "") + "</div>" + (version || sa.forks && sa.forks > 0 || shipsAgent ? '<div class="published-card-badgerow">' + (shipsAgent ? '<span class="pcb-agent" title="' + escapeHtml(t("card.agentHint")) + '">&#x1F916;</span>' : "") + (sa.forks && sa.forks > 0 ? '<span class="pcb-forks" title="' + escapeHtml(t("card.forksHint")) + `" onclick="window._launcher.showLineageModal('` + escapeHtml(owner) + "', '" + escapeHtml(fn) + `')">⑂ ` + sa.forks + "</span>" : "") + (version ? '<span class="pcb-version">' + escapeHtml(version) + "</span>" : "") + "</div>" : "") + "</div></div>";
7871
+ }
7468
7872
  function renderCommunityApps(serverApps, aimeatUrl, section, grid, countEl, currentOwner) {
7469
7873
  if (!section || !grid || !countEl) return;
7470
7874
  if (serverApps.length === 0) {
@@ -7476,21 +7880,51 @@
7476
7880
  section.style.display = "";
7477
7881
  countEl.textContent = "(" + serverApps.length + ")";
7478
7882
  var html = "";
7479
- for (var i = 0; i < serverApps.length; i++) {
7480
- var sa = serverApps[i];
7481
- var name = sa.manifest && sa.manifest.name ? sa.manifest.name : sa.filename || "";
7482
- var version = sa.version_number ? "v" + sa.version_number : "";
7483
- var description = sa.manifest && sa.manifest.description ? sa.manifest.description : "";
7484
- var date = sa.created_at ? new Date(sa.created_at).toLocaleDateString() : "";
7485
- var author = sa.manifest && sa.manifest.authorDisplay ? sa.manifest.authorDisplay : sa.owner || "";
7486
- var viewUrl = aimeatUrl + "/v1/apps/" + encodeURIComponent(sa.owner || "") + "/" + encodeURIComponent(sa.filename || "");
7487
- html += '<div class="published-card"' + filterAttr(name, sa.manifest && sa.manifest.tags || []) + '><div class="published-card-name">' + escapeHtml(name) + "</div>" + (description ? '<div class="published-card-desc">' + escapeHtml(description) + "</div>" : "") + '<div class="published-card-footer"><div class="published-card-metaline"><span class="pcm-main" style="color:var(--accent)">&#x1F464; ' + escapeHtml(author) + "</span>" + (date ? '<span class="pcm-date">' + date + "</span>" : "") + `</div><div class="published-card-actions"><button onclick="window._launcher.viewPublished('` + escapeHtml(viewUrl) + "?mode=inline', '" + jsArg(name) + `')">` + t("card.view") + "</button>" + // Fork is offered on a community (someone else's) app only when its owner
7488
- // marked it forkable; otherwise the server would reject the fork (403).
7489
- (sa.forkable ? `<button onclick="window._launcher.forkVersion('` + escapeHtml(sa.owner || "") + "', '" + escapeHtml(sa.filename || "") + "', " + (sa.version_number || 0) + ')" title="' + escapeHtml(t("card.forkHint")) + '">' + t("card.fork") + "</button>" : "") + "</div>" + (version || sa.forks && sa.forks > 0 ? '<div class="published-card-badgerow">' + (sa.forks && sa.forks > 0 ? '<span class="pcb-forks" title="' + escapeHtml(t("card.forksHint")) + `" onclick="window._launcher.showLineageModal('` + escapeHtml(sa.owner || "") + "', '" + escapeHtml(sa.filename || "") + `')">⑂ ` + sa.forks + "</span>" : "") + (version ? '<span class="pcb-version">' + escapeHtml(version) + "</span>" : "") + "</div>" : "") + "</div></div>";
7490
- }
7883
+ for (var i = 0; i < serverApps.length; i++) html += publishedCardHtml(serverApps[i], aimeatUrl);
7491
7884
  grid.innerHTML = html;
7492
7885
  updateCommunityEmpty();
7493
7886
  }
7887
+ function renderFavorites(allServerApps, aimeatUrl) {
7888
+ var section = document.getElementById("favorites-section");
7889
+ var grid = document.getElementById("favorites-grid");
7890
+ var countEl = document.getElementById("favorites-count");
7891
+ if (!section || !grid) return;
7892
+ var favs = (allServerApps || []).filter(function(sa) {
7893
+ return isFavorite((sa.owner || "") + "/" + (sa.filename || ""));
7894
+ });
7895
+ if (favs.length === 0) {
7896
+ section.style.display = "none";
7897
+ grid.innerHTML = "";
7898
+ return;
7899
+ }
7900
+ section.style.display = "";
7901
+ if (countEl) countEl.textContent = "(" + favs.length + ")";
7902
+ var html = "";
7903
+ for (var i = 0; i < favs.length; i++) html += publishedCardHtml(favs[i], aimeatUrl);
7904
+ grid.innerHTML = html;
7905
+ }
7906
+ function refreshFavoritesUI() {
7907
+ renderFavorites(lastAllServerApps, lastAimeatUrl);
7908
+ var currentOwner = null;
7909
+ try {
7910
+ var s = window.AIMEAT && window.AIMEAT.auth && window.AIMEAT.auth.getSession();
7911
+ currentOwner = s && s.owner || JSON.parse(localStorage.getItem("aimeat_session") || "{}").owner || null;
7912
+ } catch (e) {
7913
+ }
7914
+ var communityApps = currentOwner ? lastAllServerApps.filter(function(a) {
7915
+ return !sameOwner(a.owner, currentOwner);
7916
+ }) : lastAllServerApps;
7917
+ renderCommunityApps(
7918
+ communityApps,
7919
+ lastAimeatUrl,
7920
+ document.getElementById("community-section"),
7921
+ document.getElementById("community-grid"),
7922
+ document.getElementById("community-count"),
7923
+ currentOwner
7924
+ );
7925
+ applyServerFilter();
7926
+ renderApps3();
7927
+ }
7494
7928
  async function unpublishApp(appId) {
7495
7929
  if (!await showConfirm(t("confirm.removePublished"))) return;
7496
7930
  var app = null;
@@ -7522,7 +7956,7 @@
7522
7956
  delete app.publishedVersionNumber;
7523
7957
  delete app.publishedVersionsUrl;
7524
7958
  saveApp(app).then(function() {
7525
- loadPublishedApps3();
7959
+ loadPublishedApps2();
7526
7960
  });
7527
7961
  } else {
7528
7962
  showNotice("Failed to remove: " + (json.error && json.error.message || "Unknown error"));
@@ -7548,7 +7982,7 @@
7548
7982
  }).then(function(json) {
7549
7983
  if (json.ok) {
7550
7984
  if (getServerState2()[filename]) getServerState2()[filename].parked = !!parked;
7551
- loadPublishedApps3();
7985
+ loadPublishedApps2();
7552
7986
  refreshServerMgmt();
7553
7987
  } else {
7554
7988
  showNotice("Failed: " + (json.error && json.error.message ? json.error.message : "Unknown error"));
@@ -7574,7 +8008,7 @@
7574
8008
  }).then(function(json) {
7575
8009
  if (json.ok) {
7576
8010
  if (getServerState2()[filename]) getServerState2()[filename].forkable = !!forkable;
7577
- loadPublishedApps3();
8011
+ loadPublishedApps2();
7578
8012
  refreshServerMgmt();
7579
8013
  } else {
7580
8014
  showNotice("Failed: " + (json.error && json.error.message ? json.error.message : "Unknown error"));
@@ -7601,7 +8035,7 @@
7601
8035
  return resp.json();
7602
8036
  }).then(function(json) {
7603
8037
  if (json.ok) {
7604
- loadPublishedApps3();
8038
+ loadPublishedApps2();
7605
8039
  } else {
7606
8040
  showNotice("Failed to delete: " + (json.error && json.error.message ? json.error.message : "Unknown error"));
7607
8041
  }
@@ -7660,7 +8094,7 @@
7660
8094
  }
7661
8095
  function filterByTag(tag) {
7662
8096
  setActiveTag(tag);
7663
- renderApps5();
8097
+ renderApps4();
7664
8098
  applyServerFilter();
7665
8099
  }
7666
8100
  function launchApp2(id, mode) {
@@ -7720,7 +8154,6 @@
7720
8154
  var serverAppManifests = {};
7721
8155
  function libStatus(e) {
7722
8156
  if (e.parked) return "parked";
7723
- if (e.serverOnly) return "server";
7724
8157
  if (e.published) return "published";
7725
8158
  return "local";
7726
8159
  }
@@ -7728,8 +8161,6 @@
7728
8161
  switch (libStatus(e)) {
7729
8162
  case "parked":
7730
8163
  return t("status.parked");
7731
- case "server":
7732
- return t("status.serverOnly");
7733
8164
  case "published":
7734
8165
  return t("status.published") + (e.versionNumber ? " v" + e.versionNumber : "");
7735
8166
  default:
@@ -7737,7 +8168,7 @@
7737
8168
  }
7738
8169
  }
7739
8170
  function buildLibraryEntries(localApps, serverApps) {
7740
- var base = (loadConfig().aimeatUrl || "").replace(/\/+$/, "");
8171
+ var base3 = (loadConfig().aimeatUrl || "").replace(/\/+$/, "");
7741
8172
  var byFilename = {};
7742
8173
  var entries = [];
7743
8174
  serverStateByFilename = {};
@@ -7763,10 +8194,11 @@
7763
8194
  published: !!la.published,
7764
8195
  parked: false,
7765
8196
  serverOnly: false,
8197
+ hasDraft: false,
7766
8198
  filename: la.publishedFilename || null,
7767
8199
  owner: null,
7768
8200
  versionNumber: la.publishedVersionNumber || null,
7769
- viewUrl: la.publishedUrl ? base + la.publishedUrl : "",
8201
+ viewUrl: la.publishedUrl ? base3 + la.publishedUrl : "",
7770
8202
  forkable: false,
7771
8203
  forks: 0
7772
8204
  };
@@ -7777,6 +8209,7 @@
7777
8209
  var sa = serverApps[s];
7778
8210
  var fn = sa.filename || "";
7779
8211
  var prot = sa.manifest && sa.manifest.protection || {};
8212
+ var shipsAgent = !!(sa.manifest && sa.manifest.cortex && sa.manifest.cortex.agents && sa.manifest.cortex.agents.length);
7780
8213
  var m = fn ? byFilename[fn] : null;
7781
8214
  if (m) {
7782
8215
  m.parked = !!sa.parked;
@@ -7785,8 +8218,10 @@
7785
8218
  m.versionNumber = sa.version_number || m.versionNumber;
7786
8219
  m.forkable = !!sa.forkable;
7787
8220
  m.forks = sa.forks || 0;
8221
+ m.hasDraft = !!sa.has_draft;
8222
+ m.hasAgents = shipsAgent;
7788
8223
  m.protection = prot;
7789
- m.viewUrl = base + "/v1/apps/" + encodeURIComponent(sa.owner || "") + "/" + encodeURIComponent(fn);
8224
+ m.viewUrl = base3 + "/v1/apps/" + encodeURIComponent(sa.owner || "") + "/" + encodeURIComponent(fn);
7790
8225
  if (!m.description && sa.manifest && sa.manifest.description) m.description = sa.manifest.description;
7791
8226
  } else {
7792
8227
  var se = {
@@ -7795,6 +8230,7 @@
7795
8230
  name: sa.manifest && sa.manifest.name || fn,
7796
8231
  icon: "🌐",
7797
8232
  description: sa.manifest && sa.manifest.description || "",
8233
+ descriptions: sa.manifest && sa.manifest.descriptions || null,
7798
8234
  tags: sa.manifest && sa.manifest.tags || [],
7799
8235
  favorite: false,
7800
8236
  sortOrder: void 0,
@@ -7806,13 +8242,15 @@
7806
8242
  published: !sa.parked,
7807
8243
  parked: !!sa.parked,
7808
8244
  serverOnly: true,
8245
+ hasDraft: !!sa.has_draft,
7809
8246
  filename: fn,
7810
8247
  owner: sa.owner || "",
7811
8248
  versionNumber: sa.version_number || null,
7812
- viewUrl: base && fn ? base + "/v1/apps/" + encodeURIComponent(sa.owner || "") + "/" + encodeURIComponent(fn) : "",
8249
+ viewUrl: base3 && fn ? base3 + "/v1/apps/" + encodeURIComponent(sa.owner || "") + "/" + encodeURIComponent(fn) : "",
7813
8250
  forkable: !!sa.forkable,
7814
8251
  forks: sa.forks || 0,
7815
- protection: prot
8252
+ protection: prot,
8253
+ hasAgents: shipsAgent
7816
8254
  };
7817
8255
  entries.push(se);
7818
8256
  if (fn) byFilename[fn] = se;
@@ -7834,20 +8272,12 @@
7834
8272
  }
7835
8273
  return entries;
7836
8274
  }
7837
- function renderApps5() {
8275
+ function renderApps4() {
7838
8276
  getAllApps().then(function(apps) {
7839
8277
  setAllApps(apps);
7840
- var entries = buildLibraryEntries(apps, ownServerApps);
8278
+ var entries = buildLibraryEntries([], ownServerApps);
7841
8279
  entries.sort(function(a, b) {
7842
- if (a.favorite && !b.favorite) return -1;
7843
- if (!a.favorite && b.favorite) return 1;
7844
- var oA = typeof a.sortOrder === "number" ? a.sortOrder : Infinity;
7845
- var oB = typeof b.sortOrder === "number" ? b.sortOrder : Infinity;
7846
- if (oA !== oB) return oA - oB;
7847
- var dateA = a.lastOpenedAt || a.addedAt || "";
7848
- var dateB = b.lastOpenedAt || b.addedAt || "";
7849
- if (dateA > dateB) return -1;
7850
- if (dateA < dateB) return 1;
8280
+ if (!!a.parked !== !!b.parked) return a.parked ? 1 : -1;
7851
8281
  return 0;
7852
8282
  });
7853
8283
  var filtered = entries;
@@ -7896,42 +8326,24 @@
7896
8326
  grid.innerHTML = html;
7897
8327
  }
7898
8328
  var statsEl = document.getElementById("stats");
7899
- var totalSize = 0;
7900
- for (var sz = 0; sz < entries.length; sz++) {
7901
- if (entries[sz].blob) totalSize += entries[sz].blob.length;
7902
- }
7903
- var sizeLabel = totalSize < 1024 ? totalSize + " B" : totalSize < 1048576 ? (totalSize / 1024).toFixed(1) + " KB" : (totalSize / 1048576).toFixed(1) + " MB";
7904
- statsEl.textContent = entries.length + " " + t("stats.apps") + " · " + sizeLabel + " " + t("stats.stored");
8329
+ statsEl.textContent = entries.length + " " + t("stats.apps");
7905
8330
  renderTags();
7906
- renderRecentlyOpened();
7907
8331
  });
7908
8332
  }
7909
8333
  function libraryCardHtml(e, i) {
7910
8334
  var idAttr = e.hasLocal ? escapeHtml(e.localId) : "srv:" + escapeHtml(e.filename);
7911
8335
  var detailCall = e.filename ? "window._launcher.openPublishedDetail('" + jsArg(e.owner || "") + "', '" + jsArg(e.filename) + "', '" + jsArg(e.hasLocal ? e.localId : "") + "', " + (e.versionNumber || 0) + ")" : "window._launcher.openDetailView('" + jsArg(e.localId) + "')";
7912
8336
  var openCall = (e.published || e.parked || e.serverOnly) && e.viewUrl ? "window._launcher.viewPublished('" + jsArg(e.viewUrl) + "?mode=inline', '" + jsArg(e.name) + "')" : e.hasLocal ? "window._launcher.launchApp('" + jsArg(e.localId) + "', '" + jsArg(e.openMode || "tab") + "')" : detailCall;
8337
+ var stagingCall = "window._launcher.openStagingPreview('" + jsArg(e.owner || "") + "', '" + jsArg(e.filename || "") + "')";
8338
+ var openBtns = e.hasDraft && e.viewUrl ? `<button onclick="event.stopPropagation(); window._launcher.viewPublished('` + jsArg(e.viewUrl) + "?mode=inline', '" + jsArg(e.name) + `')" title="` + escapeHtml(t("card.openReleasedHint")) + '">▶ ' + escapeHtml(t("card.openReleased")) + '</button><button class="act-staging" onclick="event.stopPropagation(); ' + stagingCall + '" title="' + escapeHtml(t("card.openStagingHint")) + '">⏫ ' + escapeHtml(t("card.openStaging")) + "</button>" : '<button onclick="event.stopPropagation(); ' + openCall + '" title="' + escapeHtml(t("card.openHint")) + '">▶ ' + escapeHtml(t("card.open")) + "</button>";
7913
8339
  var st = libStatus(e);
7914
8340
  var dragAttrs = e.hasLocal ? ' draggable="true" ondragstart="window._launcher.onCardDragStart(event)" ondragend="window._launcher.onCardDragEnd(event)" ondragover="window._launcher.onCardDragOver(event)" ondrop="window._launcher.onCardDrop(event)"' : "";
7915
8341
  var menuBtn = e.hasLocal ? `<button class="card-menu-btn" onclick="event.stopPropagation(); window._launcher.showContextMenu(event, '` + jsArg(e.localId) + `')" title="` + escapeHtml(t("common.menu")) + '">⋮</button>' : "";
7916
- return '<div class="app-card' + (e.hasLocal ? "" : " server-only") + '" data-id="' + idAttr + '"' + dragAttrs + filterAttr(e.name, e.tags) + ' onclick="' + detailCall + '"' + (e.hasLocal ? ` oncontextmenu="window._launcher.showContextMenu(event, '` + jsArg(e.localId) + `')"` : "") + ' style="animation-delay:' + i * 0.04 + 's"><span class="app-status-badge st-' + st + '">' + escapeHtml(libStatusLabel(e)) + "</span>" + menuBtn + '<div class="app-icon">' + escapeHtml(e.icon || "📝") + '</div><div class="app-name">' + escapeHtml(e.name) + (e.origin === "ai-published" ? ' <span class="ai-origin-badge">AI</span>' : "") + "</div>" + (e.description ? '<div class="app-source">' + escapeHtml(e.description) + "</div>" : '<div class="app-source">' + sourceLabel(e.source) + "</div>") + '<div class="app-actions"><button onclick="event.stopPropagation(); ' + openCall + '" title="' + escapeHtml(t("card.openHint")) + '">▶ ' + escapeHtml(t("card.open")) + '</button><button onclick="event.stopPropagation(); ' + detailCall + '">' + escapeHtml(t("ctx.details")) + "</button></div>" + (e.favorite ? '<span class="fav-star visible">⭐</span>' : "") + "</div>";
7917
- }
7918
- function renderRecentlyOpened() {
7919
- var section = document.getElementById("recent-section");
7920
- var strip = document.getElementById("recent-strip");
7921
- var recent = getMainApps4().filter(function(a) {
7922
- return a.lastOpenedAt;
7923
- }).sort(function(a, b) {
7924
- return (b.lastOpenedAt || "") > (a.lastOpenedAt || "") ? 1 : -1;
7925
- }).slice(0, 5);
7926
- if (recent.length === 0) {
7927
- section.style.display = "none";
7928
- return;
7929
- }
7930
- section.style.display = "block";
7931
- strip.innerHTML = recent.map(function(app) {
7932
- var icon = app.icon || "📝";
7933
- return `<div style="background:var(--surface-glass);border:1px solid var(--border-subtle);border-radius:10px;padding:.6rem .8rem;cursor:pointer;min-width:120px;flex-shrink:0;transition:all .15s" onclick="window._launcher.launchApp('` + escapeHtml(app.id) + "', '" + escapeHtml(app.openMode || "tab") + `')" onmouseover="this.style.borderColor='var(--border-hover)'" onmouseout="this.style.borderColor='var(--border-subtle)'"><div style="font-size:1.3rem;text-align:center">` + escapeHtml(icon) + '</div><div style="font-size:.75rem;font-weight:600;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100px">' + escapeHtml(app.name) + "</div></div>";
7934
- }).join("");
8342
+ return '<div class="app-card' + (e.hasLocal ? "" : " server-only") + '" data-id="' + idAttr + '"' + dragAttrs + filterAttr(e.name, e.tags) + ' onclick="' + detailCall + '"' + (e.hasLocal ? ` oncontextmenu="window._launcher.showContextMenu(event, '` + jsArg(e.localId) + `')"` : "") + ' style="animation-delay:' + i * 0.04 + 's"><span class="app-status-badge st-' + st + '">' + escapeHtml(libStatusLabel(e)) + "</span>" + (e.hasDraft ? '<span class="app-staging-badge" title="' + escapeHtml(t("card.stagingHint")) + '">' + escapeHtml(t("card.stagingBadge")) + "</span>" : "") + menuBtn + '<div class="app-icon">' + escapeHtml(e.icon || "📝") + '</div><div class="app-name">' + escapeHtml(e.name) + (e.origin === "ai-published" ? ' <span class="ai-origin-badge">AI</span>' : "") + (e.hasAgents ? ' <span class="pcb-agent" title="' + escapeHtml(t("card.agentHint")) + '">🤖</span>' : "") + "</div>" + (function() {
8343
+ var d = e.descriptions && e.descriptions[getLang()] || e.description || "";
8344
+ return d ? '<div class="app-source">' + escapeHtml(d) + "</div>" : '<div class="app-source">' + sourceLabel(e.source) + "</div>";
8345
+ })() + '<div class="app-actions">' + openBtns + '<button onclick="event.stopPropagation(); ' + detailCall + '">' + escapeHtml(t("ctx.details")) + "</button></div>" + // Server-backed favourite toggle (owner/filename); only for server apps with a filename.
8346
+ (e.filename ? favStarHtml((e.owner || e.aimeatOwner || "") + "/" + e.filename) : "") + "</div>";
7935
8347
  }
7936
8348
  var currentIframeUrl = "";
7937
8349
  function closeIframe() {
@@ -7993,24 +8405,12 @@
7993
8405
  openDetailView(appId);
7994
8406
  break;
7995
8407
  case "edit":
7996
- setEditingAppId(appId);
7997
- document.getElementById("modal-title").textContent = "Edit App";
7998
- document.getElementById("app-name").value = app.name || "";
7999
- document.getElementById("app-icon").value = app.icon || "";
8000
- document.getElementById("app-tags").value = (app.tags || []).join(", ");
8001
- if (app.source === "url") {
8002
- switchTab("url");
8003
- document.getElementById("app-url").value = app.url || "";
8004
- } else {
8005
- switchTab("file");
8006
- document.getElementById("selected-file-name").textContent = "(existing file)";
8007
- }
8008
- document.getElementById("modal-overlay").hidden = false;
8408
+ openDetailView(appId);
8009
8409
  break;
8010
8410
  case "favorite":
8011
8411
  app.favorite = !app.favorite;
8012
8412
  saveApp(app).then(function() {
8013
- renderApps5();
8413
+ renderApps4();
8014
8414
  });
8015
8415
  break;
8016
8416
  case "view-source":
@@ -8021,13 +8421,13 @@
8021
8421
  return app.name || "this app";
8022
8422
  }))) {
8023
8423
  deleteApp(appId).then(function() {
8024
- renderApps5();
8025
- loadPublishedApps3();
8424
+ renderApps4();
8425
+ loadPublishedApps2();
8026
8426
  });
8027
8427
  }
8028
8428
  break;
8029
8429
  case "publish":
8030
- showPublishModal2(appId);
8430
+ showPublishModal3(appId);
8031
8431
  break;
8032
8432
  case "improve-ai":
8033
8433
  openPromptBuilder(app);
@@ -8119,58 +8519,107 @@
8119
8519
  overlay.dataset.appName = "Homepage";
8120
8520
  overlay.hidden = false;
8121
8521
  }
8122
- var dragSourceId = null;
8123
- function onCardDragStart(e) {
8124
- var card = e.target.closest(".app-card");
8125
- if (!card) return;
8126
- dragSourceId = card.dataset.id;
8127
- card.classList.add("dragging");
8128
- e.dataTransfer.effectAllowed = "move";
8129
- e.dataTransfer.setData("text/plain", dragSourceId);
8130
- }
8131
- function onCardDragEnd(e) {
8132
- var card = e.target.closest(".app-card");
8133
- if (card) card.classList.remove("dragging");
8134
- var cards = document.querySelectorAll(".app-card.drag-over");
8135
- for (var i = 0; i < cards.length; i++) cards[i].classList.remove("drag-over");
8136
- dragSourceId = null;
8137
- }
8138
- function onCardDragOver(e) {
8139
- e.preventDefault();
8140
- e.dataTransfer.dropEffect = "move";
8141
- var card = e.target.closest(".app-card");
8142
- if (!card || card.dataset.id === dragSourceId) return;
8143
- var cards = document.querySelectorAll(".app-card.drag-over");
8144
- for (var i = 0; i < cards.length; i++) cards[i].classList.remove("drag-over");
8145
- card.classList.add("drag-over");
8146
- }
8147
- function onCardDrop(e) {
8148
- e.preventDefault();
8149
- var targetCard = e.target.closest(".app-card");
8150
- if (!targetCard) return;
8151
- var targetId = targetCard.dataset.id;
8152
- if (!dragSourceId || dragSourceId === targetId) return;
8153
- var srcIdx = -1, tgtIdx = -1;
8154
- for (var i = 0; i < getMainApps4().length; i++) {
8155
- if (getMainApps4()[i].id === dragSourceId) srcIdx = i;
8156
- if (getMainApps4()[i].id === targetId) tgtIdx = i;
8522
+
8523
+ // src/static/app-catalog/js/migrate.js
8524
+ var DONE_KEY = "appCatalogLocalMigrated";
8525
+ async function legacyDbNames() {
8526
+ var names = ["AppLauncherDB"];
8527
+ try {
8528
+ if (indexedDB.databases) {
8529
+ var list = await indexedDB.databases();
8530
+ list.forEach(function(d) {
8531
+ if (d && d.name && d.name.indexOf("AppLauncherDB") === 0 && names.indexOf(d.name) < 0) names.push(d.name);
8532
+ });
8533
+ }
8534
+ } catch (e) {
8535
+ }
8536
+ return names;
8537
+ }
8538
+ function openExisting(name) {
8539
+ return new Promise(function(resolve) {
8540
+ var req;
8541
+ try {
8542
+ req = indexedDB.open(name);
8543
+ } catch (e) {
8544
+ resolve(null);
8545
+ return;
8546
+ }
8547
+ req.onsuccess = function() {
8548
+ resolve(req.result);
8549
+ };
8550
+ req.onerror = function() {
8551
+ resolve(null);
8552
+ };
8553
+ req.onupgradeneeded = function() {
8554
+ };
8555
+ });
8556
+ }
8557
+ function readApps(db) {
8558
+ return new Promise(function(resolve) {
8559
+ if (!db || !db.objectStoreNames || !db.objectStoreNames.contains("apps")) {
8560
+ resolve([]);
8561
+ return;
8562
+ }
8563
+ try {
8564
+ var tx = db.transaction("apps", "readonly");
8565
+ var r = tx.objectStore("apps").getAll();
8566
+ r.onsuccess = function() {
8567
+ resolve(r.result || []);
8568
+ };
8569
+ r.onerror = function() {
8570
+ resolve([]);
8571
+ };
8572
+ } catch (e) {
8573
+ resolve([]);
8574
+ }
8575
+ });
8576
+ }
8577
+ function downloadJson(apps) {
8578
+ var json = JSON.stringify({ version: 1, exportedAt: (/* @__PURE__ */ new Date()).toISOString(), apps }, null, 2);
8579
+ var blob = new Blob([json], { type: "application/json" });
8580
+ var url = URL.createObjectURL(blob);
8581
+ var a = document.createElement("a");
8582
+ a.href = url;
8583
+ a.download = "app-catalog-local-apps.json";
8584
+ document.body.appendChild(a);
8585
+ a.click();
8586
+ document.body.removeChild(a);
8587
+ URL.revokeObjectURL(url);
8588
+ }
8589
+ async function checkLegacyLocalApps() {
8590
+ try {
8591
+ if (localStorage.getItem(DONE_KEY)) return;
8592
+ } catch (e) {
8593
+ return;
8157
8594
  }
8158
- if (srcIdx === -1 || tgtIdx === -1) return;
8159
- var moved = getMainApps4().splice(srcIdx, 1)[0];
8160
- getMainApps4().splice(tgtIdx, 0, moved);
8161
- var saves = [];
8162
- for (var j = 0; j < getMainApps4().length; j++) {
8163
- getMainApps4()[j].sortOrder = j;
8164
- saves.push(saveApp(getMainApps4()[j]));
8595
+ var apps = [];
8596
+ try {
8597
+ var names = await legacyDbNames();
8598
+ for (var i = 0; i < names.length; i++) {
8599
+ var db = await openExisting(names[i]);
8600
+ var found = await readApps(db);
8601
+ if (found && found.length) apps = apps.concat(found);
8602
+ try {
8603
+ if (db) db.close();
8604
+ } catch (e) {
8605
+ }
8606
+ }
8607
+ } catch (e) {
8165
8608
  }
8166
- var grid = document.getElementById("app-grid");
8167
- var cards = grid.querySelectorAll(".app-card");
8168
- for (var k = 0; k < cards.length; k++) {
8169
- cards[k].classList.remove("drag-over", "dragging");
8609
+ if (!apps.length) {
8610
+ try {
8611
+ localStorage.setItem(DONE_KEY, "1");
8612
+ } catch (e) {
8613
+ }
8614
+ return;
8615
+ }
8616
+ var msg = (t("migrate.found") || "You have {n} local app(s) from the old catalog. Download them as a backup?").replace("{n}", String(apps.length));
8617
+ var wants = await showConfirm(msg);
8618
+ if (wants) downloadJson(apps);
8619
+ try {
8620
+ localStorage.setItem(DONE_KEY, "1");
8621
+ } catch (e) {
8170
8622
  }
8171
- Promise.all(saves).then(function() {
8172
- renderApps5();
8173
- });
8174
8623
  }
8175
8624
 
8176
8625
  // src/static/app-catalog/js/main.js
@@ -8184,7 +8633,7 @@
8184
8633
  }
8185
8634
  applyI18n();
8186
8635
  try {
8187
- renderApps5();
8636
+ renderApps4();
8188
8637
  } catch (e) {
8189
8638
  }
8190
8639
  try {
@@ -8192,11 +8641,7 @@
8192
8641
  } catch (e) {
8193
8642
  }
8194
8643
  try {
8195
- loadPublishedApps3();
8196
- } catch (e) {
8197
- }
8198
- try {
8199
- renderRecentlyOpened();
8644
+ loadPublishedApps2();
8200
8645
  } catch (e) {
8201
8646
  }
8202
8647
  try {
@@ -8208,41 +8653,16 @@
8208
8653
  } catch (e) {
8209
8654
  }
8210
8655
  }
8211
- function switchDbMode(mode) {
8212
- if (mode === getDbMode()) return;
8213
- if (mode === "personal" && !currentOwnerName()) {
8214
- updateModeToggle2();
8215
- requireSignInThen(function() {
8216
- switchDbMode("personal");
8217
- });
8218
- return;
8219
- }
8220
- setDbMode(mode);
8221
- closeDbInstance();
8222
- updateModeToggle2();
8223
- refreshAll3();
8224
- }
8225
- function updateModeToggle2() {
8226
- var globalBtn = document.getElementById("mode-global");
8227
- var personalBtn = document.getElementById("mode-personal");
8228
- if (!globalBtn || !personalBtn) return;
8229
- globalBtn.classList.toggle("active", getDbMode() === "global");
8230
- personalBtn.classList.toggle("active", getDbMode() === "personal");
8231
- var signedIn = !!currentOwnerName();
8232
- personalBtn.classList.toggle("mode-btn-locked", !signedIn);
8233
- personalBtn.title = signedIn ? t("mode.personal.title") : t("mode.personal.needsLogin");
8234
- }
8235
8656
  var allApps = [];
8236
8657
  var activeTag = null;
8237
8658
  var searchQuery = "";
8238
8659
  window._launcher = {
8239
- openDB,
8240
8660
  getAllApps,
8241
8661
  saveApp,
8242
8662
  deleteApp,
8243
8663
  loadConfig,
8244
8664
  saveConfig,
8245
- renderApps: renderApps5,
8665
+ renderApps: renderApps4,
8246
8666
  renderTags,
8247
8667
  filterByTag,
8248
8668
  launchApp: launchApp2,
@@ -8259,10 +8679,6 @@
8259
8679
  handleContextAction,
8260
8680
  generateId,
8261
8681
  readFileAsText,
8262
- addAppFromUrl,
8263
- addAppFromFile,
8264
- addAppFromSource,
8265
- addAppFromZip,
8266
8682
  showModal,
8267
8683
  closeModal,
8268
8684
  openSettings,
@@ -8271,18 +8687,22 @@
8271
8687
  saveSettings,
8272
8688
  closeSettings,
8273
8689
  applyTheme,
8274
- exportBackup,
8275
- clearAllData,
8276
- importFromAimeat,
8277
- processAimeatImport,
8278
8690
  viewSource: viewSource2,
8279
8691
  generateHomepagePrompt,
8280
- showPublishModal: showPublishModal2,
8692
+ showPublishModal: showPublishModal3,
8281
8693
  submitPublish,
8282
- loadPublishedApps: loadPublishedApps3,
8694
+ loadPublishedApps: loadPublishedApps2,
8695
+ // Toggle a server-backed favourite (ref = "owner/filename"), then re-render the ⭐ group + stars.
8696
+ toggleFavorite: function(ref) {
8697
+ toggleFavorite(ref).then(function() {
8698
+ try {
8699
+ refreshFavoritesUI();
8700
+ } catch (e) {
8701
+ }
8702
+ });
8703
+ },
8283
8704
  toggleCommunity,
8284
8705
  switchView,
8285
- switchDbMode,
8286
8706
  unpublishApp,
8287
8707
  deleteServerApp,
8288
8708
  toggleParkApp,
@@ -8290,6 +8710,9 @@
8290
8710
  detailAboutEdit,
8291
8711
  detailAboutCancel,
8292
8712
  detailAboutSave,
8713
+ detailTranslateDesc,
8714
+ detailPromoteSave,
8715
+ detailPromoteClear,
8293
8716
  detailToggleFavorite,
8294
8717
  detailAccessCodeEdit,
8295
8718
  detailAccessCodeCancel,
@@ -8309,9 +8732,6 @@
8309
8732
  revokeConsent,
8310
8733
  submitSubdomainAssign,
8311
8734
  unassignSubdomain,
8312
- jsonImportSelectAll,
8313
- submitJsonImport,
8314
- removeDuplicateApps,
8315
8735
  toggleBackupMenu,
8316
8736
  toggleCreateMenu,
8317
8737
  toggleCortexBar,
@@ -8322,6 +8742,9 @@
8322
8742
  submitBackupRestore,
8323
8743
  showVersionsModal,
8324
8744
  showLineageModal,
8745
+ showAppAgentsModal,
8746
+ agentsDeploy,
8747
+ agentsUndeploy,
8325
8748
  showProtectionModal,
8326
8749
  saveProtection,
8327
8750
  restoreVersion,
@@ -8335,6 +8758,7 @@
8335
8758
  detailAiDiscard,
8336
8759
  detailTestDraftLive,
8337
8760
  detailPublishTestedDraft,
8761
+ openStagingPreview,
8338
8762
  detailEditSource,
8339
8763
  detailImproveExternal,
8340
8764
  detailSharePrompt,
@@ -8343,7 +8767,6 @@
8343
8767
  detailSetScreenshot,
8344
8768
  detailRefreshScreenshot,
8345
8769
  openPublishedDetail,
8346
- renderRecentlyOpened,
8347
8770
  loadCortexExtensions,
8348
8771
  showCortexPopup,
8349
8772
  cortexCopy,
@@ -8354,10 +8777,6 @@
8354
8777
  cortexEditorExport,
8355
8778
  openPromptBuilder,
8356
8779
  closePbPanel,
8357
- onCardDragStart,
8358
- onCardDragEnd,
8359
- onCardDragOver,
8360
- onCardDrop,
8361
8780
  syncConfigToServer,
8362
8781
  loadConfigFromServer,
8363
8782
  setLanguage,
@@ -8368,16 +8787,16 @@
8368
8787
  window.cortexCopy = cortexCopy;
8369
8788
  function refreshAll3() {
8370
8789
  allApps = [];
8371
- renderApps5();
8372
- loadPublishedApps3();
8373
- renderRecentlyOpened();
8790
+ renderApps4();
8791
+ loadPublishedApps2();
8374
8792
  }
8375
8793
  document.addEventListener("DOMContentLoaded", function() {
8376
8794
  initDetail({
8377
8795
  refreshAll: refreshAll3,
8378
- loadPublishedApps: loadPublishedApps3,
8379
- renderApps: renderApps5,
8380
- updateModeToggle: updateModeToggle2,
8796
+ loadPublishedApps: loadPublishedApps2,
8797
+ renderApps: renderApps4,
8798
+ updateModeToggle: function() {
8799
+ },
8381
8800
  getCortexOwnerToken,
8382
8801
  launchApp: launchApp2,
8383
8802
  viewPublished: viewPublished2,
@@ -8385,7 +8804,7 @@
8385
8804
  generateId,
8386
8805
  generateSharePrompt: generateSharePrompt2,
8387
8806
  openPromptBuilder,
8388
- showPublishModal: showPublishModal2,
8807
+ showPublishModal: showPublishModal3,
8389
8808
  getMainApps: function() {
8390
8809
  return allApps;
8391
8810
  },
@@ -8401,10 +8820,13 @@
8401
8820
  setIframeUrl: setIframeUrl2,
8402
8821
  isOperatorSession: isOperatorSession2
8403
8822
  });
8404
- initSettings({ generateId, renderApps: renderApps5, loadPublishedApps: loadPublishedApps3 });
8405
- initAppsIo({ generateId, readFileAsText, renderApps: renderApps5, getMainApps: function() {
8406
- return allApps;
8823
+ initAppAgents({ getServerManifests: function() {
8824
+ return serverAppManifests;
8407
8825
  } });
8826
+ initSettings({ generateId, renderApps: renderApps4, loadPublishedApps: loadPublishedApps2 });
8827
+ initAppsIo({ generateId, readFileAsText, renderApps: renderApps4, getMainApps: function() {
8828
+ return allApps;
8829
+ }, showPublishModal: showPublishModal3 });
8408
8830
  initServerIo({
8409
8831
  getMainApps: function() {
8410
8832
  return allApps;
@@ -8427,7 +8849,7 @@
8427
8849
  return searchQuery;
8428
8850
  },
8429
8851
  generateId,
8430
- renderApps: renderApps5,
8852
+ renderApps: renderApps4,
8431
8853
  refreshAll: refreshAll3
8432
8854
  });
8433
8855
  initRender({
@@ -8459,7 +8881,6 @@
8459
8881
  var _urlLang = _params.get("lang");
8460
8882
  setLang(_urlLang === "fi" || _urlLang === "en" ? _urlLang : loadConfig().language === "fi" ? "fi" : "en");
8461
8883
  applyI18n();
8462
- updateModeToggle2();
8463
8884
  var _savedView = "library";
8464
8885
  try {
8465
8886
  _savedView = localStorage.getItem("appCatalogView") || "library";
@@ -8472,8 +8893,8 @@
8472
8893
  if (_homeLabel && location.host) _homeLabel.textContent = location.host.replace(/^apps\./, "");
8473
8894
  } catch (e) {
8474
8895
  }
8475
- renderApps5();
8476
- loadPublishedApps3();
8896
+ renderApps4();
8897
+ loadPublishedApps2();
8477
8898
  loadCortexExtensions();
8478
8899
  loadConfigFromServer();
8479
8900
  document.getElementById("confirm-ok-btn").addEventListener("click", function() {
@@ -8485,6 +8906,10 @@
8485
8906
  document.getElementById("confirm-overlay").addEventListener("click", function(e) {
8486
8907
  if (e.target === this) closeConfirm(false);
8487
8908
  });
8909
+ try {
8910
+ checkLegacyLocalApps();
8911
+ } catch (e) {
8912
+ }
8488
8913
  if (_params.get("create") === "1") {
8489
8914
  try {
8490
8915
  openPromptBuilder(null);
@@ -8493,7 +8918,7 @@
8493
8918
  }
8494
8919
  document.getElementById("search-input").addEventListener("input", function(e) {
8495
8920
  searchQuery = e.target.value.trim();
8496
- renderApps5();
8921
+ renderApps4();
8497
8922
  applyServerFilter();
8498
8923
  });
8499
8924
  document.getElementById("add-btn").addEventListener("click", function() {
@@ -8518,17 +8943,6 @@
8518
8943
  closeSettings();
8519
8944
  }
8520
8945
  });
8521
- document.getElementById("import-file-input").addEventListener("change", function() {
8522
- if (this.files && this.files.length > 0) {
8523
- handleImportBackup(this.files[0]);
8524
- this.value = "";
8525
- }
8526
- });
8527
- document.getElementById("aimeat-import-overlay").addEventListener("click", function(e) {
8528
- if (e.target === this) {
8529
- this.hidden = true;
8530
- }
8531
- });
8532
8946
  document.getElementById("publish-overlay").addEventListener("click", function(e) {
8533
8947
  if (e.target === this) {
8534
8948
  this.hidden = true;
@@ -8553,11 +8967,6 @@
8553
8967
  this.hidden = true;
8554
8968
  }
8555
8969
  });
8556
- document.getElementById("json-import-overlay").addEventListener("click", function(e) {
8557
- if (e.target === this) {
8558
- this.hidden = true;
8559
- }
8560
- });
8561
8970
  document.addEventListener("click", function(e) {
8562
8971
  var menu = document.getElementById("backup-menu");
8563
8972
  if (!menu.hidden && !menu.contains(e.target) && e.target.id !== "backup-btn") {
@@ -8688,16 +9097,12 @@
8688
9097
  document.getElementById("source-overlay").hidden = true;
8689
9098
  } else if (!document.getElementById("context-menu").hidden) {
8690
9099
  hideContextMenu();
8691
- } else if (!document.getElementById("aimeat-import-overlay").hidden) {
8692
- document.getElementById("aimeat-import-overlay").hidden = true;
8693
9100
  } else if (!document.getElementById("publish-overlay").hidden) {
8694
9101
  document.getElementById("publish-overlay").hidden = true;
8695
9102
  } else if (!document.getElementById("subdomain-overlay").hidden) {
8696
9103
  document.getElementById("subdomain-overlay").hidden = true;
8697
9104
  } else if (!document.getElementById("backup-overlay").hidden) {
8698
9105
  document.getElementById("backup-overlay").hidden = true;
8699
- } else if (!document.getElementById("json-import-overlay").hidden) {
8700
- document.getElementById("json-import-overlay").hidden = true;
8701
9106
  } else if (!document.getElementById("settings-overlay").hidden) {
8702
9107
  closeSettings();
8703
9108
  } else if (!document.getElementById("modal-overlay").hidden) {
@@ -8717,23 +9122,6 @@
8717
9122
  document.getElementById("search-input").focus();
8718
9123
  }
8719
9124
  });
8720
- document.getElementById("app-grid").addEventListener("touchstart", function(e) {
8721
- var card = e.target.closest(".app-card");
8722
- if (!card) return;
8723
- var appId = card.getAttribute("data-id");
8724
- card._longPressTimer = setTimeout(function() {
8725
- e.preventDefault();
8726
- window._launcher.showContextMenu(e.touches[0], appId);
8727
- }, 500);
8728
- }, { passive: false });
8729
- document.getElementById("app-grid").addEventListener("touchend", function(e) {
8730
- var card = e.target.closest(".app-card");
8731
- if (card && card._longPressTimer) clearTimeout(card._longPressTimer);
8732
- });
8733
- document.getElementById("app-grid").addEventListener("touchmove", function(e) {
8734
- var card = e.target.closest(".app-card");
8735
- if (card && card._longPressTimer) clearTimeout(card._longPressTimer);
8736
- });
8737
9125
  document.getElementById("copy-source-btn").addEventListener("click", function() {
8738
9126
  var code = document.getElementById("source-code").value;
8739
9127
  var btn = this;
@@ -8804,7 +9192,7 @@
8804
9192
  btn.textContent = "Save Changes";
8805
9193
  btn.disabled = true;
8806
9194
  }, 1500);
8807
- renderApps5();
9195
+ renderApps4();
8808
9196
  }).catch(function(err) {
8809
9197
  btn.textContent = "Save Changes";
8810
9198
  btn.disabled = false;