aimeat 2.0.0 → 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 (412) hide show
  1. package/dist/locales/en.json +35 -1
  2. package/dist/locales/fi.json +35 -1
  3. package/dist/public/components/LinkPreview.js +101 -0
  4. package/dist/public/components/NotificationBell.js +18 -1
  5. package/dist/public/css/theme.css +57 -7
  6. package/dist/public/css/views/admin.css +8 -1
  7. package/dist/public/css/views/app-grant.css +18 -0
  8. package/dist/public/css/views/inbox.css +46 -0
  9. package/dist/public/css/views/portfolio.css +46 -0
  10. package/dist/public/css/views/profile.css +29 -4
  11. package/dist/public/js/services/apps.js +19 -3
  12. package/dist/public/js/services/messages-ai-prompts.js +38 -0
  13. package/dist/public/js/services/messages.js +26 -4
  14. package/dist/public/js/services/notebook.js +76 -0
  15. package/dist/public/js/services/unfurl.js +43 -0
  16. package/dist/public/lib/samples/LICENSE.md +11 -0
  17. package/dist/public/lib/samples/bass/A1.mp3 +0 -0
  18. package/dist/public/lib/samples/bass/B2.mp3 +0 -0
  19. package/dist/public/lib/samples/bass/D2.mp3 +0 -0
  20. package/dist/public/lib/samples/bass/E1.mp3 +0 -0
  21. package/dist/public/lib/samples/bass/E3.mp3 +0 -0
  22. package/dist/public/lib/samples/bass/G2.mp3 +0 -0
  23. package/dist/public/lib/samples/epiano/C2.mp3 +0 -0
  24. package/dist/public/lib/samples/epiano/C3.mp3 +0 -0
  25. package/dist/public/lib/samples/epiano/C4.mp3 +0 -0
  26. package/dist/public/lib/samples/epiano/C5.mp3 +0 -0
  27. package/dist/public/lib/samples/epiano/C6.mp3 +0 -0
  28. package/dist/public/lib/samples/epiano/G2.mp3 +0 -0
  29. package/dist/public/lib/samples/epiano/G3.mp3 +0 -0
  30. package/dist/public/lib/samples/epiano/G4.mp3 +0 -0
  31. package/dist/public/lib/samples/epiano/G5.mp3 +0 -0
  32. package/dist/public/lib/samples/guitar-steel/A2.mp3 +0 -0
  33. package/dist/public/lib/samples/guitar-steel/A4.mp3 +0 -0
  34. package/dist/public/lib/samples/guitar-steel/B3.mp3 +0 -0
  35. package/dist/public/lib/samples/guitar-steel/D3.mp3 +0 -0
  36. package/dist/public/lib/samples/guitar-steel/E2.mp3 +0 -0
  37. package/dist/public/lib/samples/guitar-steel/E4.mp3 +0 -0
  38. package/dist/public/lib/samples/guitar-steel/E5.mp3 +0 -0
  39. package/dist/public/lib/samples/guitar-steel/G3.mp3 +0 -0
  40. package/dist/public/lib/samples/organ/C2.mp3 +0 -0
  41. package/dist/public/lib/samples/organ/C3.mp3 +0 -0
  42. package/dist/public/lib/samples/organ/C4.mp3 +0 -0
  43. package/dist/public/lib/samples/organ/C5.mp3 +0 -0
  44. package/dist/public/lib/samples/organ/C6.mp3 +0 -0
  45. package/dist/public/lib/samples/organ/G2.mp3 +0 -0
  46. package/dist/public/lib/samples/organ/G3.mp3 +0 -0
  47. package/dist/public/lib/samples/organ/G4.mp3 +0 -0
  48. package/dist/public/lib/samples/organ/G5.mp3 +0 -0
  49. package/dist/public/lib/samples/strings/C2.mp3 +0 -0
  50. package/dist/public/lib/samples/strings/C3.mp3 +0 -0
  51. package/dist/public/lib/samples/strings/C4.mp3 +0 -0
  52. package/dist/public/lib/samples/strings/C5.mp3 +0 -0
  53. package/dist/public/lib/samples/strings/C6.mp3 +0 -0
  54. package/dist/public/lib/samples/strings/G2.mp3 +0 -0
  55. package/dist/public/lib/samples/strings/G3.mp3 +0 -0
  56. package/dist/public/lib/samples/strings/G4.mp3 +0 -0
  57. package/dist/public/lib/samples/strings/G5.mp3 +0 -0
  58. package/dist/public/lib/samples/trumpet/A3.mp3 +0 -0
  59. package/dist/public/lib/samples/trumpet/A4.mp3 +0 -0
  60. package/dist/public/lib/samples/trumpet/A5.mp3 +0 -0
  61. package/dist/public/lib/samples/trumpet/C4.mp3 +0 -0
  62. package/dist/public/lib/samples/trumpet/C5.mp3 +0 -0
  63. package/dist/public/lib/samples/trumpet/E3.mp3 +0 -0
  64. package/dist/public/lib/samples/trumpet/E4.mp3 +0 -0
  65. package/dist/public/lib/samples/trumpet/E5.mp3 +0 -0
  66. package/dist/public/spa.html +2 -0
  67. package/dist/public/views/app-grant.js +24 -4
  68. package/dist/public/views/portfolio.js +61 -6
  69. package/dist/public/views/profile/apps-tab.js +18 -1
  70. package/dist/public/views/profile/inbox-tab/ai-actions.js +86 -0
  71. package/dist/public/views/profile/inbox-tab/components.js +124 -9
  72. package/dist/public/views/profile/inbox-tab/helpers.js +26 -0
  73. package/dist/public/views/profile/inbox-tab/panels.js +18 -3
  74. package/dist/public/views/profile/inbox-tab/use-thread-ux.js +18 -1
  75. package/dist/public/views/profile/inbox-tab.js +46 -49
  76. package/dist/public/views/profile/landing-page.cards.js +7 -0
  77. package/dist/public/views/profile/landing-page.js +12 -1
  78. package/dist/public/views/profile/skills-tab.js +1 -1
  79. package/dist/public/views/public-workspace-viewer.js +1 -1
  80. package/dist/public/views/start.js +2 -1
  81. package/dist/scripts/build-sdk-libs.d.ts +16 -0
  82. package/dist/scripts/build-sdk-libs.d.ts.map +1 -0
  83. package/dist/scripts/build-sdk-libs.js +112 -0
  84. package/dist/scripts/build-sdk-libs.js.map +1 -0
  85. package/dist/src/cli/connect/auth.d.ts +15 -0
  86. package/dist/src/cli/connect/auth.d.ts.map +1 -1
  87. package/dist/src/cli/connect/auth.js +25 -6
  88. package/dist/src/cli/connect/auth.js.map +1 -1
  89. package/dist/src/cli/connect/keychain.d.ts +9 -0
  90. package/dist/src/cli/connect/keychain.d.ts.map +1 -1
  91. package/dist/src/cli/connect/keychain.js +21 -8
  92. package/dist/src/cli/connect/keychain.js.map +1 -1
  93. package/dist/src/cli/connect/mcp/tools/exchange.d.ts +18 -0
  94. package/dist/src/cli/connect/mcp/tools/exchange.d.ts.map +1 -0
  95. package/dist/src/cli/connect/mcp/tools/exchange.js +170 -0
  96. package/dist/src/cli/connect/mcp/tools/exchange.js.map +1 -0
  97. package/dist/src/cli/connect/mcp/tools/index.d.ts.map +1 -1
  98. package/dist/src/cli/connect/mcp/tools/index.js +2 -0
  99. package/dist/src/cli/connect/mcp/tools/index.js.map +1 -1
  100. package/dist/src/cli/connect/tool-call-defs-exchange.d.ts +3 -0
  101. package/dist/src/cli/connect/tool-call-defs-exchange.d.ts.map +1 -0
  102. package/dist/src/cli/connect/tool-call-defs-exchange.js +146 -0
  103. package/dist/src/cli/connect/tool-call-defs-exchange.js.map +1 -0
  104. package/dist/src/cli/connect/tool-call.d.ts.map +1 -1
  105. package/dist/src/cli/connect/tool-call.js +2 -0
  106. package/dist/src/cli/connect/tool-call.js.map +1 -1
  107. package/dist/src/commerce/session-service.d.ts +14 -0
  108. package/dist/src/commerce/session-service.d.ts.map +1 -1
  109. package/dist/src/commerce/session-service.js +1 -1
  110. package/dist/src/commerce/session-service.js.map +1 -1
  111. package/dist/src/data/app-templates/shells.d.ts +7 -3
  112. package/dist/src/data/app-templates/shells.d.ts.map +1 -1
  113. package/dist/src/data/app-templates/shells.js +10 -6
  114. package/dist/src/data/app-templates/shells.js.map +1 -1
  115. package/dist/src/data/appdev-pitfalls.d.ts +2 -0
  116. package/dist/src/data/appdev-pitfalls.d.ts.map +1 -1
  117. package/dist/src/data/appdev-pitfalls.js +24 -1
  118. package/dist/src/data/appdev-pitfalls.js.map +1 -1
  119. package/dist/src/generated/api-types.d.ts +1565 -9
  120. package/dist/src/generated/api-types.d.ts.map +1 -1
  121. package/dist/src/mcp/annotations.d.ts.map +1 -1
  122. package/dist/src/mcp/annotations.js +20 -0
  123. package/dist/src/mcp/annotations.js.map +1 -1
  124. package/dist/src/mcp/apps.d.ts.map +1 -1
  125. package/dist/src/mcp/apps.js +8 -4
  126. package/dist/src/mcp/apps.js.map +1 -1
  127. package/dist/src/mcp/catalog/definitions/exchange.d.ts +18 -0
  128. package/dist/src/mcp/catalog/definitions/exchange.d.ts.map +1 -0
  129. package/dist/src/mcp/catalog/definitions/exchange.js +182 -0
  130. package/dist/src/mcp/catalog/definitions/exchange.js.map +1 -0
  131. package/dist/src/mcp/catalog/definitions.d.ts.map +1 -1
  132. package/dist/src/mcp/catalog/definitions.js +2 -0
  133. package/dist/src/mcp/catalog/definitions.js.map +1 -1
  134. package/dist/src/mcp/catalog/scopes.d.ts.map +1 -1
  135. package/dist/src/mcp/catalog/scopes.js +22 -0
  136. package/dist/src/mcp/catalog/scopes.js.map +1 -1
  137. package/dist/src/mcp/catalog/surfaces.d.ts.map +1 -1
  138. package/dist/src/mcp/catalog/surfaces.js +14 -0
  139. package/dist/src/mcp/catalog/surfaces.js.map +1 -1
  140. package/dist/src/mcp/exchange-run.d.ts +5 -0
  141. package/dist/src/mcp/exchange-run.d.ts.map +1 -0
  142. package/dist/src/mcp/exchange-run.js +226 -0
  143. package/dist/src/mcp/exchange-run.js.map +1 -0
  144. package/dist/src/mcp/exchange.d.ts +5 -0
  145. package/dist/src/mcp/exchange.d.ts.map +1 -0
  146. package/dist/src/mcp/exchange.js +351 -0
  147. package/dist/src/mcp/exchange.js.map +1 -0
  148. package/dist/src/mcp/extensions.d.ts.map +1 -1
  149. package/dist/src/mcp/extensions.js +11 -0
  150. package/dist/src/mcp/extensions.js.map +1 -1
  151. package/dist/src/mcp/index.d.ts.map +1 -1
  152. package/dist/src/mcp/index.js +6 -2
  153. package/dist/src/mcp/index.js.map +1 -1
  154. package/dist/src/models/app-tool-schemas.d.ts +55 -1
  155. package/dist/src/models/app-tool-schemas.d.ts.map +1 -1
  156. package/dist/src/models/app-tool-schemas.js +20 -1
  157. package/dist/src/models/app-tool-schemas.js.map +1 -1
  158. package/dist/src/models/offer-schemas.d.ts +2 -2
  159. package/dist/src/models/schemas.d.ts +1 -0
  160. package/dist/src/models/schemas.d.ts.map +1 -1
  161. package/dist/src/models/schemas.js +3 -0
  162. package/dist/src/models/schemas.js.map +1 -1
  163. package/dist/src/routes/agents/device-auth.d.ts +4 -0
  164. package/dist/src/routes/agents/device-auth.d.ts.map +1 -1
  165. package/dist/src/routes/agents/device-auth.js +19 -4
  166. package/dist/src/routes/agents/device-auth.js.map +1 -1
  167. package/dist/src/routes/app-grants.d.ts +6 -0
  168. package/dist/src/routes/app-grants.d.ts.map +1 -1
  169. package/dist/src/routes/app-grants.js +35 -2
  170. package/dist/src/routes/app-grants.js.map +1 -1
  171. package/dist/src/routes/apps/fork-manage.d.ts.map +1 -1
  172. package/dist/src/routes/apps/fork-manage.js +24 -1
  173. package/dist/src/routes/apps/fork-manage.js.map +1 -1
  174. package/dist/src/routes/apps/publish.d.ts +2 -0
  175. package/dist/src/routes/apps/publish.d.ts.map +1 -1
  176. package/dist/src/routes/apps/publish.js +27 -1
  177. package/dist/src/routes/apps/publish.js.map +1 -1
  178. package/dist/src/routes/apps-cost.d.ts +25 -0
  179. package/dist/src/routes/apps-cost.d.ts.map +1 -0
  180. package/dist/src/routes/apps-cost.js +107 -0
  181. package/dist/src/routes/apps-cost.js.map +1 -0
  182. package/dist/src/routes/exchange-market.d.ts +28 -0
  183. package/dist/src/routes/exchange-market.d.ts.map +1 -0
  184. package/dist/src/routes/exchange-market.js +454 -0
  185. package/dist/src/routes/exchange-market.js.map +1 -0
  186. package/dist/src/routes/exchange.d.ts +33 -0
  187. package/dist/src/routes/exchange.d.ts.map +1 -0
  188. package/dist/src/routes/exchange.js +395 -0
  189. package/dist/src/routes/exchange.js.map +1 -0
  190. package/dist/src/routes/extensions/entitlement-gate.d.ts +33 -0
  191. package/dist/src/routes/extensions/entitlement-gate.d.ts.map +1 -0
  192. package/dist/src/routes/extensions/entitlement-gate.js +143 -0
  193. package/dist/src/routes/extensions/entitlement-gate.js.map +1 -0
  194. package/dist/src/routes/extensions/manifest.d.ts +9 -0
  195. package/dist/src/routes/extensions/manifest.d.ts.map +1 -1
  196. package/dist/src/routes/extensions/manifest.js +33 -1
  197. package/dist/src/routes/extensions/manifest.js.map +1 -1
  198. package/dist/src/routes/extensions/paywall.d.ts.map +1 -1
  199. package/dist/src/routes/extensions/paywall.js +9 -0
  200. package/dist/src/routes/extensions/paywall.js.map +1 -1
  201. package/dist/src/routes/federation-sync/messaging.d.ts.map +1 -1
  202. package/dist/src/routes/federation-sync/messaging.js +3 -1
  203. package/dist/src/routes/federation-sync/messaging.js.map +1 -1
  204. package/dist/src/routes/ghii/recovery.d.ts +2 -0
  205. package/dist/src/routes/ghii/recovery.d.ts.map +1 -1
  206. package/dist/src/routes/ghii/recovery.js +7 -0
  207. package/dist/src/routes/ghii/recovery.js.map +1 -1
  208. package/dist/src/routes/ghii/register-login.d.ts +4 -0
  209. package/dist/src/routes/ghii/register-login.d.ts.map +1 -1
  210. package/dist/src/routes/ghii/register-login.js +45 -22
  211. package/dist/src/routes/ghii/register-login.js.map +1 -1
  212. package/dist/src/routes/ghii/web-verify.d.ts +5 -0
  213. package/dist/src/routes/ghii/web-verify.d.ts.map +1 -1
  214. package/dist/src/routes/ghii/web-verify.js +24 -3
  215. package/dist/src/routes/ghii/web-verify.js.map +1 -1
  216. package/dist/src/routes/libs/sdk-serve.d.ts +11 -0
  217. package/dist/src/routes/libs/sdk-serve.d.ts.map +1 -0
  218. package/dist/src/routes/libs/sdk-serve.js +53 -0
  219. package/dist/src/routes/libs/sdk-serve.js.map +1 -0
  220. package/dist/src/routes/libs.d.ts +7 -1
  221. package/dist/src/routes/libs.d.ts.map +1 -1
  222. package/dist/src/routes/libs.js +65 -146
  223. package/dist/src/routes/libs.js.map +1 -1
  224. package/dist/src/routes/messages.d.ts +3 -0
  225. package/dist/src/routes/messages.d.ts.map +1 -1
  226. package/dist/src/routes/messages.js +9 -0
  227. package/dist/src/routes/messages.js.map +1 -1
  228. package/dist/src/routes/notifications.d.ts +6 -3
  229. package/dist/src/routes/notifications.d.ts.map +1 -1
  230. package/dist/src/routes/notifications.js +32 -3
  231. package/dist/src/routes/notifications.js.map +1 -1
  232. package/dist/src/routes/organisms/workspace-access.d.ts.map +1 -1
  233. package/dist/src/routes/organisms/workspace-access.js +38 -20
  234. package/dist/src/routes/organisms/workspace-access.js.map +1 -1
  235. package/dist/src/routes/unfurl.d.ts +27 -0
  236. package/dist/src/routes/unfurl.d.ts.map +1 -0
  237. package/dist/src/routes/unfurl.js +180 -0
  238. package/dist/src/routes/unfurl.js.map +1 -0
  239. package/dist/src/routes/upload.d.ts +2 -0
  240. package/dist/src/routes/upload.d.ts.map +1 -1
  241. package/dist/src/routes/upload.js +7 -0
  242. package/dist/src/routes/upload.js.map +1 -1
  243. package/dist/src/routes/webmcp.d.ts +3 -0
  244. package/dist/src/routes/webmcp.d.ts.map +1 -1
  245. package/dist/src/routes/webmcp.js +55 -0
  246. package/dist/src/routes/webmcp.js.map +1 -1
  247. package/dist/src/server-bootstrap/routes-loader.d.ts +1 -0
  248. package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
  249. package/dist/src/server-bootstrap/routes-loader.js +8 -0
  250. package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
  251. package/dist/src/services/agent-face.d.ts +10 -2
  252. package/dist/src/services/agent-face.d.ts.map +1 -1
  253. package/dist/src/services/agent-face.js +10 -4
  254. package/dist/src/services/agent-face.js.map +1 -1
  255. package/dist/src/services/app-tool-interfaces.d.ts +37 -0
  256. package/dist/src/services/app-tool-interfaces.d.ts.map +1 -0
  257. package/dist/src/services/app-tool-interfaces.js +101 -0
  258. package/dist/src/services/app-tool-interfaces.js.map +1 -0
  259. package/dist/src/services/build-app-prompt.d.ts +3 -0
  260. package/dist/src/services/build-app-prompt.d.ts.map +1 -1
  261. package/dist/src/services/build-app-prompt.js +12 -1
  262. package/dist/src/services/build-app-prompt.js.map +1 -1
  263. package/dist/src/services/contacts.d.ts +25 -1
  264. package/dist/src/services/contacts.d.ts.map +1 -1
  265. package/dist/src/services/contacts.js +30 -0
  266. package/dist/src/services/contacts.js.map +1 -1
  267. package/dist/src/services/entitlement-money.d.ts +55 -0
  268. package/dist/src/services/entitlement-money.d.ts.map +1 -0
  269. package/dist/src/services/entitlement-money.js +68 -0
  270. package/dist/src/services/entitlement-money.js.map +1 -0
  271. package/dist/src/services/exchange-market.d.ts +247 -0
  272. package/dist/src/services/exchange-market.d.ts.map +1 -0
  273. package/dist/src/services/exchange-market.js +254 -0
  274. package/dist/src/services/exchange-market.js.map +1 -0
  275. package/dist/src/services/exchange-proposals.d.ts +47 -0
  276. package/dist/src/services/exchange-proposals.d.ts.map +1 -0
  277. package/dist/src/services/exchange-proposals.js +71 -0
  278. package/dist/src/services/exchange-proposals.js.map +1 -0
  279. package/dist/src/services/exchange-work.d.ts +30 -0
  280. package/dist/src/services/exchange-work.d.ts.map +1 -0
  281. package/dist/src/services/exchange-work.js +43 -0
  282. package/dist/src/services/exchange-work.js.map +1 -0
  283. package/dist/src/services/message-send.d.ts.map +1 -1
  284. package/dist/src/services/message-send.js +4 -1
  285. package/dist/src/services/message-send.js.map +1 -1
  286. package/dist/src/services/metered-entitlements.d.ts +203 -0
  287. package/dist/src/services/metered-entitlements.d.ts.map +1 -0
  288. package/dist/src/services/metered-entitlements.js +264 -0
  289. package/dist/src/services/metered-entitlements.js.map +1 -0
  290. package/dist/src/services/notify.d.ts +7 -0
  291. package/dist/src/services/notify.d.ts.map +1 -1
  292. package/dist/src/services/notify.js +35 -0
  293. package/dist/src/services/notify.js.map +1 -1
  294. package/dist/src/services/owner-memory.d.ts +16 -0
  295. package/dist/src/services/owner-memory.d.ts.map +1 -1
  296. package/dist/src/services/owner-memory.js +23 -0
  297. package/dist/src/services/owner-memory.js.map +1 -1
  298. package/dist/src/services/owner-provisioning.d.ts +5 -0
  299. package/dist/src/services/owner-provisioning.d.ts.map +1 -1
  300. package/dist/src/services/owner-provisioning.js +20 -2
  301. package/dist/src/services/owner-provisioning.js.map +1 -1
  302. package/dist/src/storage/providers/postgres-kysely/methods/apps.d.ts +1 -0
  303. package/dist/src/storage/providers/postgres-kysely/methods/apps.d.ts.map +1 -1
  304. package/dist/src/storage/providers/postgres-kysely/methods/apps.js +2 -0
  305. package/dist/src/storage/providers/postgres-kysely/methods/apps.js.map +1 -1
  306. package/dist/src/storage/providers/postgres-kysely/methods/identity.d.ts +1 -0
  307. package/dist/src/storage/providers/postgres-kysely/methods/identity.d.ts.map +1 -1
  308. package/dist/src/storage/providers/postgres-kysely/methods/identity.js +4 -0
  309. package/dist/src/storage/providers/postgres-kysely/methods/identity.js.map +1 -1
  310. package/dist/src/storage/providers/postgres-kysely/migrations/0011_unique_verified_email.sql +25 -0
  311. package/dist/src/storage/providers/sqlite/methods/apps.d.ts +1 -0
  312. package/dist/src/storage/providers/sqlite/methods/apps.d.ts.map +1 -1
  313. package/dist/src/storage/providers/sqlite/methods/apps.js +2 -0
  314. package/dist/src/storage/providers/sqlite/methods/apps.js.map +1 -1
  315. package/dist/src/storage/providers/sqlite/methods/identity-nodes.d.ts +1 -0
  316. package/dist/src/storage/providers/sqlite/methods/identity-nodes.d.ts.map +1 -1
  317. package/dist/src/storage/providers/sqlite/methods/identity-nodes.js +4 -0
  318. package/dist/src/storage/providers/sqlite/methods/identity-nodes.js.map +1 -1
  319. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  320. package/dist/src/storage/providers/sqlite/schema.js +20 -0
  321. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  322. package/dist/src/storage/repositories/app.repository.d.ts +0 -0
  323. package/dist/src/storage/repositories/app.repository.d.ts.map +1 -1
  324. package/dist/src/storage/repositories/identity.repository.d.ts +6 -0
  325. package/dist/src/storage/repositories/identity.repository.d.ts.map +1 -1
  326. package/dist/src/storage/types/apps.d.ts +1 -0
  327. package/dist/src/storage/types/apps.d.ts.map +1 -1
  328. package/dist/src/storage/types/organisms-federation.d.ts +21 -0
  329. package/dist/src/storage/types/organisms-federation.d.ts.map +1 -1
  330. package/dist/src/utils/app-mobile-lint.d.ts +17 -0
  331. package/dist/src/utils/app-mobile-lint.d.ts.map +1 -0
  332. package/dist/src/utils/app-mobile-lint.js +40 -0
  333. package/dist/src/utils/app-mobile-lint.js.map +1 -0
  334. package/dist/static/app-catalog/_template.html +12 -77
  335. package/dist/static/app-catalog/js/apps-io.js +51 -165
  336. package/dist/static/app-catalog/js/cost.js +100 -0
  337. package/dist/static/app-catalog/js/db.js +23 -93
  338. package/dist/static/app-catalog/js/detail.js +158 -24
  339. package/dist/static/app-catalog/js/favorites.js +71 -0
  340. package/dist/static/app-catalog/js/i18n-data.js +90 -16
  341. package/dist/static/app-catalog/js/main.js +23 -103
  342. package/dist/static/app-catalog/js/migrate.js +88 -0
  343. package/dist/static/app-catalog/js/monetize.js +1 -1
  344. package/dist/static/app-catalog/js/promote.js +70 -0
  345. package/dist/static/app-catalog/js/render.js +26 -139
  346. package/dist/static/app-catalog/js/server-io.js +126 -223
  347. package/dist/static/app-catalog/js/settings.js +11 -204
  348. package/dist/static/app-catalog/styles/app-catalog.css +40 -0
  349. package/dist/static/app-catalog.html +790 -912
  350. package/dist/static/sdk-libs/_core/config.js +52 -0
  351. package/dist/static/sdk-libs/_core/http.js +52 -0
  352. package/dist/static/sdk-libs/_core/namespace.js +33 -0
  353. package/dist/static/sdk-libs/_core/sdk-globals.d.ts +50 -0
  354. package/dist/static/sdk-libs/_core/session.js +66 -0
  355. package/dist/static/sdk-libs/agentface/index.js +102 -0
  356. package/dist/static/sdk-libs/agents/index.js +267 -0
  357. package/dist/static/sdk-libs/ai/index.js +153 -0
  358. package/dist/static/sdk-libs/audio/core.js +111 -0
  359. package/dist/static/sdk-libs/audio/index.js +380 -0
  360. package/dist/static/sdk-libs/audio/instruments.js +369 -0
  361. package/dist/static/sdk-libs/auth/config.js +46 -0
  362. package/dist/static/sdk-libs/auth/crypto.js +166 -0
  363. package/dist/static/sdk-libs/auth/events.js +27 -0
  364. package/dist/static/sdk-libs/auth/i18n.js +64 -0
  365. package/dist/static/sdk-libs/auth/index.js +37 -0
  366. package/dist/static/sdk-libs/auth/modal.js +545 -0
  367. package/dist/static/sdk-libs/auth/pill.js +167 -0
  368. package/dist/static/sdk-libs/auth/session.js +792 -0
  369. package/dist/static/sdk-libs/auth/signup.js +232 -0
  370. package/dist/static/sdk-libs/auth/theme.js +96 -0
  371. package/dist/static/sdk-libs/capabilities/index.js +179 -0
  372. package/dist/static/sdk-libs/commerce/index.js +243 -0
  373. package/dist/static/sdk-libs/data/index.js +188 -0
  374. package/dist/static/sdk-libs/dist/aimeat-agentface.js +91 -0
  375. package/dist/static/sdk-libs/dist/aimeat-agents.js +315 -0
  376. package/dist/static/sdk-libs/dist/aimeat-ai.js +168 -0
  377. package/dist/static/sdk-libs/dist/aimeat-audio.js +979 -0
  378. package/dist/static/sdk-libs/dist/aimeat-auth.js +1831 -0
  379. package/dist/static/sdk-libs/dist/aimeat-capabilities.js +177 -0
  380. package/dist/static/sdk-libs/dist/aimeat-commerce.js +265 -0
  381. package/dist/static/sdk-libs/dist/aimeat-data.js +205 -0
  382. package/dist/static/sdk-libs/dist/aimeat-editor.js +299 -0
  383. package/dist/static/sdk-libs/dist/aimeat-header.js +270 -0
  384. package/dist/static/sdk-libs/dist/aimeat-intake.js +94 -0
  385. package/dist/static/sdk-libs/dist/aimeat-live.js +265 -0
  386. package/dist/static/sdk-libs/dist/aimeat-markdown.js +602 -0
  387. package/dist/static/sdk-libs/dist/aimeat-organism.js +394 -0
  388. package/dist/static/sdk-libs/dist/aimeat-portfolio-standalone.js +90 -0
  389. package/dist/static/sdk-libs/dist/aimeat-social.js +157 -0
  390. package/dist/static/sdk-libs/dist/aimeat-speech.js +300 -0
  391. package/dist/static/sdk-libs/dist/aimeat-storage.js +210 -0
  392. package/dist/static/sdk-libs/dist/aimeat-tunnel.js +383 -0
  393. package/dist/static/sdk-libs/dist/aimeat-wallet.js +118 -0
  394. package/dist/static/sdk-libs/dist/aimeat-webmcp.js +187 -0
  395. package/dist/static/sdk-libs/dist/aimeat-work.js +213 -0
  396. package/dist/static/sdk-libs/dist/aimeat-workflows.js +147 -0
  397. package/dist/static/sdk-libs/editor/index.js +229 -0
  398. package/dist/static/sdk-libs/header/index.js +249 -0
  399. package/dist/static/sdk-libs/intake/index.js +75 -0
  400. package/dist/static/sdk-libs/live/index.js +156 -0
  401. package/dist/static/sdk-libs/markdown/index.js +522 -0
  402. package/dist/static/sdk-libs/organism/index.js +381 -0
  403. package/dist/static/sdk-libs/portfolio-standalone/index.js +78 -0
  404. package/dist/static/sdk-libs/social/index.js +140 -0
  405. package/dist/static/sdk-libs/speech/index.js +321 -0
  406. package/dist/static/sdk-libs/storage/index.js +189 -0
  407. package/dist/static/sdk-libs/tunnel/index.js +428 -0
  408. package/dist/static/sdk-libs/wallet/index.js +115 -0
  409. package/dist/static/sdk-libs/webmcp/index.js +185 -0
  410. package/dist/static/sdk-libs/work/index.js +191 -0
  411. package/dist/static/sdk-libs/workflows/index.js +113 -0
  412. package/package.json +5 -2
@@ -0,0 +1,232 @@
1
+ /**
2
+ * @file auth/signup.js
3
+ * @description aimeat-auth first-time social-signup flow (SDK-libs migration Phase 3). After a first
4
+ * Google/OIDC sign-in the server does NOT auto-create the account — it bounces back with
5
+ * ?aimeat_signup=1 + a short-lived signed cookie. showGoogleSignupModal prompts for a permanent
6
+ * username (live availability check) + display name, then POSTs finalize (creates account +
7
+ * session). showSignupNoticeModal handles the link-existing / expired-pending explanations.
8
+ * maybeShowGoogleSignup runs on load. Extracted from auth-lib-part3.ts.
9
+ * @structure USERNAME_RE · fillTemplate · cleanSignupParam · showSignupNoticeModal ·
10
+ * showGoogleSignupModal · maybeShowGoogleSignup.
11
+ * @usage import { maybeShowGoogleSignup } from './signup.js'; (boot calls it on load)
12
+ * @version-history
13
+ * v1.0.0 — 2026-07-19 — Extracted from src/routes/libs/auth-lib-part3.ts (SDK-libs migration Phase 3).
14
+ */
15
+ import { api } from './session.js';
16
+ import { escHtml } from './theme.js';
17
+ import { currentModalLang, loadModalI18n } from './i18n.js';
18
+ import { NODE_URL } from './config.js';
19
+ import { showLoginModal } from './modal.js';
20
+
21
+ var USERNAME_RE = new RegExp('^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$');
22
+
23
+ function fillTemplate(str, vars) {
24
+ return String(str || '').replace(/\{(\w+)\}/g, function (_, k) { return vars[k] != null ? vars[k] : ''; });
25
+ }
26
+
27
+ // Drop ?aimeat_signup=1 from the address bar so a reload doesn't re-open the modal.
28
+ function cleanSignupParam() {
29
+ try {
30
+ var url = new URL(location.href);
31
+ if (!url.searchParams.has('aimeat_signup')) return;
32
+ url.searchParams.delete('aimeat_signup');
33
+ history.replaceState(null, '', url.pathname + (url.search ? url.search : '') + url.hash);
34
+ } catch { /* URL/history unavailable */ }
35
+ }
36
+
37
+ // Minimal notice modal sharing the signup modal's chrome — used when the username-choice step is
38
+ // replaced by an explanation (existing unverified-email account; expired pending sign-up).
39
+ function showSignupNoticeModal(i, opts) {
40
+ var old = document.getElementById('aimeat-modal');
41
+ if (old) old.remove();
42
+ var modal = document.createElement('div');
43
+ modal.id = 'aimeat-modal';
44
+ document.body.appendChild(modal);
45
+ modal.innerHTML = '<style>'
46
+ + '.aimeat-go{flex:1;padding:12px;background:linear-gradient(135deg,#E8564A,#D4493F);color:#fff;border:none;border-radius:10px;cursor:pointer;font-weight:700;font-size:15px;font-family:DM Sans,system-ui,sans-serif;box-shadow:0 2px 8px rgba(232,86,74,.25);transition:transform .15s,box-shadow .15s}'
47
+ + '.aimeat-cancel{padding:12px 20px;background:none;color:#1A1A2E;border:1px solid #E5E7EB;border-radius:10px;cursor:pointer;font-size:15px;font-weight:500;font-family:DM Sans,system-ui,sans-serif;transition:background .15s}'
48
+ + '.aimeat-cancel:hover{background:#F3F4F6}'
49
+ + '</style>'
50
+ + '<div style="position:fixed;inset:0;background:rgba(26,26,46,.4);backdrop-filter:blur(8px);display:flex;align-items:flex-start;justify-content:center;overflow-y:auto;z-index:99999;font-family:DM Sans,system-ui,sans-serif;padding:24px">'
51
+ + '<div style="background:#FFFFFF;border-radius:16px;max-width:440px;width:100%;margin:auto;overflow:hidden;box-shadow:0 20px 60px rgba(0,0,0,.15),0 0 0 1px rgba(0,0,0,.05)">'
52
+ + '<div style="padding:28px 32px 24px">'
53
+ + '<h2 style="margin:0 0 8px;font-size:21px;font-weight:800;color:#1A1A2E">' + escHtml(opts.title || '') + '</h2>'
54
+ + '<p style="margin:0 0 18px;font-size:14px;color:#6B7280;line-height:1.55">' + escHtml(opts.body || '') + '</p>'
55
+ + '<div style="display:flex;gap:10px">'
56
+ + '<button id="aimeat-sn-primary" class="aimeat-go">' + escHtml(opts.primaryLabel || 'OK') + '</button>'
57
+ + (opts.showCancel ? '<button id="aimeat-sn-cancel" class="aimeat-cancel">' + escHtml(i.signupCancelBtn || 'Cancel') + '</button>' : '')
58
+ + '</div>'
59
+ + '</div></div></div>';
60
+ function close() { modal.remove(); cleanSignupParam(); }
61
+ document.getElementById('aimeat-sn-primary').addEventListener('click', function () {
62
+ close();
63
+ if (opts.onPrimary) opts.onPrimary();
64
+ });
65
+ var cancelEl = document.getElementById('aimeat-sn-cancel');
66
+ if (cancelEl) cancelEl.addEventListener('click', close);
67
+ }
68
+
69
+ function showGoogleSignupModal(pending, i) {
70
+ i = i || {};
71
+
72
+ // An account already claims this email but never verified it — explain the one-time password
73
+ // sign-in path instead of dead-ending at "username taken".
74
+ if (pending && pending.mode === 'link_existing') {
75
+ var hint = pending.existing_hint
76
+ ? ' ' + fillTemplate(i.signupLinkHint || '(Username hint: {hint}.)', { hint: pending.existing_hint })
77
+ : '';
78
+ showSignupNoticeModal(i, {
79
+ title: i.signupLinkTitle || 'This email already has an account',
80
+ body: fillTemplate(i.signupLinkIntro || 'An AIMEAT account already uses {email}, but its email has not been verified yet. Sign in with your username and password once — that verifies your email, and after that this sign-in connects to your account automatically.', { email: pending.email || '' }) + hint,
81
+ primaryLabel: i.signupLinkSignInBtn || 'Sign in with password',
82
+ showCancel: true,
83
+ onPrimary: function () { showLoginModal({ i18n: i }, function () {}); },
84
+ });
85
+ return;
86
+ }
87
+
88
+ var old = document.getElementById('aimeat-modal');
89
+ if (old) old.remove();
90
+ var modal = document.createElement('div');
91
+ modal.id = 'aimeat-modal';
92
+ document.body.appendChild(modal);
93
+
94
+ var emailNote = pending.email
95
+ ? '<p style="margin:0 0 14px;font-size:13px;color:#6B7280">' + escHtml(fillTemplate(i.signupEmailNote || 'Signing up as {email}', { email: pending.email })) + '</p>'
96
+ : '';
97
+
98
+ modal.innerHTML = '<style>'
99
+ + '.aimeat-inp{width:100%;padding:11px 14px;border:1.5px solid #E5E7EB;border-radius:10px;font-family:DM Sans,system-ui,sans-serif;font-size:15px;color:#1A1A2E;background:#FAFAF8;box-sizing:border-box;transition:all .15s;outline:none}'
100
+ + '.aimeat-inp:focus{border-color:#E8564A;box-shadow:0 0 0 3px rgba(232,86,74,.1)}'
101
+ + '.aimeat-go{flex:1;padding:12px;background:linear-gradient(135deg,#E8564A,#D4493F);color:#fff;border:none;border-radius:10px;cursor:pointer;font-weight:700;font-size:15px;font-family:DM Sans,system-ui,sans-serif;box-shadow:0 2px 8px rgba(232,86,74,.25);transition:transform .15s,box-shadow .15s}'
102
+ + '.aimeat-go:disabled{opacity:.55;cursor:not-allowed;box-shadow:none}'
103
+ + '.aimeat-label{display:block;margin-bottom:5px;font-size:12px;font-weight:600;letter-spacing:.5px;text-transform:uppercase;color:#6B7280}'
104
+ + '.aimeat-cancel{padding:12px 20px;background:none;color:#1A1A2E;border:1px solid #E5E7EB;border-radius:10px;cursor:pointer;font-size:15px;font-weight:500;font-family:DM Sans,system-ui,sans-serif;transition:background .15s}'
105
+ + '.aimeat-cancel:hover{background:#F3F4F6}'
106
+ + '</style>'
107
+ + '<div style="position:fixed;inset:0;background:rgba(26,26,46,.4);backdrop-filter:blur(8px);display:flex;align-items:flex-start;justify-content:center;overflow-y:auto;z-index:99999;font-family:DM Sans,system-ui,sans-serif;padding:24px">'
108
+ + '<div style="background:#FFFFFF;border-radius:16px;max-width:440px;width:100%;margin:auto;overflow:hidden;box-shadow:0 20px 60px rgba(0,0,0,.15),0 0 0 1px rgba(0,0,0,.05)">'
109
+ + '<div style="padding:28px 32px 24px">'
110
+ + '<h2 style="margin:0 0 8px;font-size:21px;font-weight:800;color:#1A1A2E">' + escHtml(i.signupTitle || 'Choose your username') + '</h2>'
111
+ + '<p style="margin:0 0 6px;font-size:14px;color:#6B7280;line-height:1.5">' + escHtml(i.signupIntro || "You're signing in for the first time. Pick the username for your AIMEAT account.") + '</p>'
112
+ + emailNote
113
+ + '<label class="aimeat-label" for="aimeat-su-name">' + escHtml(i.signupUsernameLabel || 'Username') + '</label>'
114
+ + '<input id="aimeat-su-name" class="aimeat-inp" autocomplete="off" autocapitalize="none" spellcheck="false" value="' + escHtml(pending.suggested || '') + '">'
115
+ + '<p id="aimeat-su-status" style="margin:6px 0 0;font-size:13px;min-height:18px"></p>'
116
+ + '<p style="margin:8px 0 0;font-size:12px;color:#9CA3AF;line-height:1.45">' + escHtml(i.signupSuggestedHint || 'We suggested one from your account — change it to anything you like.') + '</p>'
117
+ + '<div style="margin:16px 0 0;padding:12px 14px;background:#FFF7ED;border:1px solid #FED7AA;border-radius:10px;font-size:13px;color:#9A3412;line-height:1.5">' + escHtml(i.signupPermanentWarning || 'This username is permanent. It identifies you across AIMEAT and cannot be changed later — the only way to change it is to delete your account and create a new one.') + '</div>'
118
+ + '<label class="aimeat-label" for="aimeat-su-display" style="margin-top:16px">' + escHtml(i.signupDisplayNameLabel || 'Display name') + '</label>'
119
+ + '<input id="aimeat-su-display" class="aimeat-inp" autocomplete="off" maxlength="80" value="' + escHtml(pending.displayName || '') + '">'
120
+ + '<p style="margin:6px 0 0;font-size:12px;color:#9CA3AF;line-height:1.45">' + escHtml(i.signupDisplayNameHint || 'Shown to others — not permanent, you can change it anytime later.') + '</p>'
121
+ + '<div style="display:flex;gap:10px;margin-top:20px">'
122
+ + '<button id="aimeat-su-create" class="aimeat-go">' + escHtml(i.signupCreateBtn || 'Create my account') + '</button>'
123
+ + '<button id="aimeat-su-cancel" class="aimeat-cancel">' + escHtml(i.signupCancelBtn || 'Cancel') + '</button>'
124
+ + '</div>'
125
+ + '<p id="aimeat-su-err" style="margin:10px 0 0;font-size:13px;color:#ef4444;display:none"></p>'
126
+ + '</div></div></div>';
127
+
128
+ var input = /** @type {any} */ (document.getElementById('aimeat-su-name'));
129
+ var statusEl = document.getElementById('aimeat-su-status');
130
+ var createBtn = /** @type {any} */ (document.getElementById('aimeat-su-create'));
131
+ var cancelBtn = document.getElementById('aimeat-su-cancel');
132
+ var errEl = document.getElementById('aimeat-su-err');
133
+ var checkTimer = null;
134
+ var lastChecked = '';
135
+
136
+ function setStatus(text, color) {
137
+ statusEl.textContent = text || '';
138
+ statusEl.style.color = color || '#6B7280';
139
+ }
140
+
141
+ // Validate format locally, then confirm availability against the node (debounced).
142
+ function evaluate() {
143
+ errEl.style.display = 'none';
144
+ var name = (input.value || '').trim().toLowerCase();
145
+ if (!USERNAME_RE.test(name)) {
146
+ createBtn.disabled = true;
147
+ setStatus(i.signupInvalid || 'Username must be 3–64 characters: lowercase letters, numbers and hyphens.', '#ef4444');
148
+ return;
149
+ }
150
+ createBtn.disabled = true; // until availability confirms
151
+ setStatus('…', '#9CA3AF');
152
+ if (checkTimer) clearTimeout(checkTimer);
153
+ checkTimer = setTimeout(function () {
154
+ lastChecked = name;
155
+ api('/v1/ghii/username-available?name=' + encodeURIComponent(name))
156
+ .then(function (res) {
157
+ var d = res && res.data;
158
+ if (!d || (input.value || '').trim().toLowerCase() !== lastChecked) return; // stale
159
+ if (d.valid && d.available) { createBtn.disabled = false; setStatus(i.signupAvailable || '✓ Available', '#16a34a'); }
160
+ else if (!d.valid) { createBtn.disabled = true; setStatus(i.signupInvalid || d.reason || 'Invalid username', '#ef4444'); }
161
+ else { createBtn.disabled = true; setStatus(i.signupTaken || 'That username is already taken — pick another.', '#ef4444'); }
162
+ })
163
+ .catch(function () { /* network blip — allow submit; finalize re-validates */ createBtn.disabled = false; setStatus('', '#6B7280'); });
164
+ }, 350);
165
+ }
166
+
167
+ input.addEventListener('input', evaluate);
168
+ input.addEventListener('keydown', function (e) { if (e.key === 'Enter' && !createBtn.disabled) { e.preventDefault(); createBtn.click(); } });
169
+
170
+ function close() { if (checkTimer) clearTimeout(checkTimer); modal.remove(); cleanSignupParam(); }
171
+ cancelBtn.addEventListener('click', close);
172
+
173
+ createBtn.addEventListener('click', async function () {
174
+ var name = (input.value || '').trim().toLowerCase();
175
+ if (!USERNAME_RE.test(name)) { evaluate(); return; }
176
+ var displayEl = /** @type {any} */ (document.getElementById('aimeat-su-display'));
177
+ var displayName = displayEl ? (displayEl.value || '').trim() : '';
178
+ createBtn.disabled = true;
179
+ createBtn.textContent = i.signupCreating || 'Creating account...';
180
+ errEl.style.display = 'none';
181
+ try {
182
+ var res = await api('/v1/ghii/login/' + (pending.provider || 'google') + '/finalize', {
183
+ method: 'POST',
184
+ credentials: 'include',
185
+ body: JSON.stringify({ username: name, displayName: displayName }),
186
+ });
187
+ cleanSignupParam();
188
+ var redirect = (res && res.data && res.data.redirect) || pending.redirect || '/';
189
+ // Full navigation to the post-login target — the page boots logged-in from the new refresh cookie.
190
+ location.href = NODE_URL + redirect;
191
+ } catch (e) {
192
+ var msg = e && e.message ? e.message : 'Could not create account';
193
+ if (msg.indexOf('already registered') >= 0 || msg.indexOf('NAME_TAKEN') >= 0) msg = i.signupTaken || msg;
194
+ errEl.textContent = msg;
195
+ errEl.style.display = 'block';
196
+ createBtn.textContent = i.signupCreateBtn || 'Create my account';
197
+ evaluate();
198
+ }
199
+ });
200
+
201
+ // Confirm the pre-filled suggestion's availability on open.
202
+ evaluate();
203
+ }
204
+
205
+ // On load, if the OIDC callback flagged a pending sign-up, fetch it and prompt. If the signed cookie
206
+ // is missing/expired the pending fetch 404s — explain that (retry, no password needed) instead of
207
+ // doing nothing.
208
+ export function maybeShowGoogleSignup() {
209
+ var params;
210
+ try { params = new URLSearchParams(location.search); } catch { return; }
211
+ if (params.get('aimeat_signup') !== '1') return;
212
+ function showExpired() {
213
+ function open(i) {
214
+ showSignupNoticeModal(i || {}, {
215
+ title: (i && i.signupExpiredTitle) || 'Sign-in session expired',
216
+ body: (i && i.signupExpiredBody) || 'Your sign-in session expired or was interrupted. No password is needed — just click “Continue with Google” again to restart.',
217
+ primaryLabel: (i && i.signupExpiredOkBtn) || 'OK',
218
+ showCancel: false,
219
+ });
220
+ }
221
+ loadModalI18n(currentModalLang()).then(open).catch(function () { open({}); });
222
+ }
223
+ api('/v1/ghii/login/pending', { credentials: 'include' })
224
+ .then(function (res) {
225
+ var pending = res && res.data;
226
+ if (!pending) { showExpired(); return; }
227
+ loadModalI18n(currentModalLang())
228
+ .then(function (i) { showGoogleSignupModal(pending, i || {}); })
229
+ .catch(function () { showGoogleSignupModal(pending, {}); });
230
+ })
231
+ .catch(function () { showExpired(); });
232
+ }
@@ -0,0 +1,96 @@
1
+ /**
2
+ * @file auth/theme.js
3
+ * @description aimeat-auth presentation helpers (SDK-libs migration Phase 3): the light/dark theme
4
+ * toggle that travels INSIDE the login pill (so every embedding app inherits it for free — reads/
5
+ * writes the same 'aimeat-theme' localStorage key + <html data-theme> the SPA uses, and fires an
6
+ * 'aimeat-theme-change' window event), plus escHtml, the compact-pill CSS injector, and the
7
+ * two-letter pill initials. Extracted from auth-lib-part2.ts.
8
+ * @structure escHtml · aimeatReadTheme/aimeatApplyTheme · themeToggleHtml/wireThemeToggle ·
9
+ * ensureAuthPillStyles · pillInitials.
10
+ * @usage import { escHtml, themeToggleHtml, wireThemeToggle } from './theme.js';
11
+ * @version-history
12
+ * v1.0.0 — 2026-07-19 — Extracted from src/routes/libs/auth-lib-part2.ts (SDK-libs migration Phase 3).
13
+ */
14
+
15
+ export function escHtml(s) { const d = document.createElement('div'); d.textContent = s; return d.innerHTML; }
16
+
17
+ // ── Theme toggle (travels with the login pill) ──
18
+ var AIMEAT_THEME_KEY = 'aimeat-theme';
19
+
20
+ export function aimeatReadTheme() {
21
+ try { var s = localStorage.getItem(AIMEAT_THEME_KEY); if (s === 'light' || s === 'dark') return s; } catch { /* storage blocked */ }
22
+ var attr = document.documentElement.dataset.theme;
23
+ if (attr === 'light' || attr === 'dark') return attr;
24
+ return (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) ? 'dark' : 'light';
25
+ }
26
+
27
+ export function aimeatApplyTheme(t) {
28
+ document.documentElement.dataset.theme = t;
29
+ try { localStorage.setItem(AIMEAT_THEME_KEY, t); } catch { /* storage blocked */ }
30
+ try { window.dispatchEvent(new CustomEvent('aimeat-theme-change', { detail: { theme: t } })); } catch { /* no window */ }
31
+ }
32
+
33
+ export function themeToggleHtml(i) {
34
+ var dark = aimeatReadTheme() === 'dark';
35
+ var title = dark ? (i.themeToLight || 'Switch to light mode') : (i.themeToDark || 'Switch to dark mode');
36
+ return '<button id="aimeat-theme-toggle" class="aimeat-theme-toggle" title="' + escHtml(title) + '" '
37
+ + 'aria-label="' + escHtml(title) + '" style="display:inline-flex;align-items:center;justify-content:center;'
38
+ + 'width:30px;height:30px;flex:0 0 auto;background:transparent;border:1px solid rgba(127,127,127,.4);'
39
+ + 'border-radius:8px;cursor:pointer;font-size:15px;line-height:1;padding:0;color:currentColor">'
40
+ + (dark ? '☀' : '☾') + '</button>';
41
+ }
42
+
43
+ export function wireThemeToggle(container, i) {
44
+ var btn = container.querySelector('#aimeat-theme-toggle');
45
+ if (!btn) return;
46
+ btn.addEventListener('click', function () {
47
+ var next = aimeatReadTheme() === 'dark' ? 'light' : 'dark';
48
+ aimeatApplyTheme(next);
49
+ var dark = next === 'dark';
50
+ btn.textContent = dark ? '☀' : '☾';
51
+ var title = dark ? (i.themeToLight || 'Switch to light mode') : (i.themeToDark || 'Switch to dark mode');
52
+ btn.title = title; btn.setAttribute('aria-label', title);
53
+ });
54
+ }
55
+
56
+ // ── Compact login pill styles (default ON on app origins) ──
57
+ // On viewports ≤600px the full gold pill is replaced by a small gold "account" button (green dot +
58
+ // initials + caret); tapping it opens the full pill as an anchored popover. Styles are injected once;
59
+ // the show/hide is pure CSS media so it reflows on rotation.
60
+ export function ensureAuthPillStyles() {
61
+ if (document.getElementById('aimeat-auth-pill-css')) return;
62
+ var st = document.createElement('style');
63
+ st.id = 'aimeat-auth-pill-css';
64
+ st.textContent = [
65
+ '.aimeat-auth-wrap{position:relative;display:inline-flex;align-items:center}',
66
+ '.aimeat-auth-compact{display:none;align-items:center;gap:7px;padding:5px 11px 5px 9px;cursor:pointer;',
67
+ 'background:linear-gradient(160deg,#3d2e1a 0%,#6b4c2a 15%,#c9a84c 30%,#f5e6a3 45%,#c9a84c 55%,#8b6914 70%,#4a3520 100%);',
68
+ 'border:1px solid rgba(201,168,76,.6);border-top-color:rgba(245,230,163,.5);border-bottom-color:rgba(75,53,32,.8);',
69
+ 'border-radius:10px;box-shadow:0 1px 0 rgba(245,230,163,.3) inset,0 -1px 0 rgba(75,53,32,.5) inset,0 3px 10px rgba(0,0,0,.4);',
70
+ 'font-family:system-ui;font-size:13px;color:#2a1800;text-shadow:0 1px 0 rgba(245,230,163,.5)}',
71
+ '.aimeat-auth-compact .cdot{width:8px;height:8px;border-radius:50%;flex:0 0 auto;',
72
+ 'background:radial-gradient(circle at 35% 35%,#b0ffc8,#00c853 40%,#00802e 80%,#003d15);box-shadow:0 0 5px rgba(0,200,83,.6)}',
73
+ '.aimeat-auth-compact .cini{font-weight:800;letter-spacing:.3px;max-width:96px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}',
74
+ '.aimeat-auth-compact .ccar{font-size:9px;opacity:.75;transition:transform .18s}',
75
+ '.aimeat-auth-wrap.aimeat-open .aimeat-auth-compact .ccar{transform:rotate(180deg)}',
76
+ '@media (max-width:600px){',
77
+ '.aimeat-auth-compact{display:inline-flex}',
78
+ '.aimeat-auth-wrap>.aimeat-auth-pill{position:absolute;top:calc(100% + 8px);right:0;z-index:1000;',
79
+ 'display:none!important;flex-wrap:wrap!important;justify-content:flex-start;row-gap:9px;',
80
+ 'min-width:210px;max-width:calc(100vw - 24px)}',
81
+ '.aimeat-auth-wrap.aimeat-open>.aimeat-auth-pill{display:flex!important}',
82
+ '}',
83
+ ].join('');
84
+ (document.head || document.documentElement).appendChild(st);
85
+ }
86
+
87
+ // Two-letter initials for the compact button, from a display name / GHII / owner (strips the
88
+ // @node and #owner suffixes so a GAII/GHII shows the person, not the node).
89
+ export function pillInitials(s) {
90
+ s = (s || '').trim();
91
+ if (!s) return '•'; // bullet fallback
92
+ s = s.split('@')[0].split('#')[0].trim();
93
+ var parts = s.split(/\s+/).filter(Boolean);
94
+ if (parts.length >= 2) return (parts[0].charAt(0) + parts[1].charAt(0)).toUpperCase();
95
+ return s.slice(0, 2).toUpperCase();
96
+ }
@@ -0,0 +1,179 @@
1
+ /**
2
+ * @file capabilities/index.js
3
+ * @description The aimeat-capabilities library (SDK-libs migration Phase 1). Exposes
4
+ * AIMEAT.capabilities — discovery (list/search/get), invocation (client-side cortex + server-side
5
+ * /v1/capabilities/:id/invoke), management (create/update/delete/mine), testing and vouching, all
6
+ * over the AIMEAT.auth session. Componentized ESM source esbuild bundles to the IIFE served,
7
+ * unchanged, at /v1/libs/aimeat-capabilities.js. Ported verbatim from lib-capabilities.ts.
8
+ * @structure imports getSession/authFetch (session) + attach (namespace); loadCortexLib(); the
9
+ * `capabilities` object; attach('capabilities', …).
10
+ * @usage <script src="/v1/libs/aimeat-auth.js"></script><script src="/v1/libs/aimeat-capabilities.js"></script>
11
+ * await AIMEAT.capabilities.list(); await AIMEAT.capabilities.invoke('id', input);
12
+ * @version-history
13
+ * v1.0.0 — 2026-07-19 — Migrated from src/routes/lib-capabilities.ts (SDK-libs migration Phase 1).
14
+ */
15
+ import { makeSession } from '../_core/session.js';
16
+ const { getSession, authFetch } = makeSession('aimeat-capabilities.js');
17
+ import { attach } from '../_core/namespace.js';
18
+
19
+ // Cortex library cache (loaded libs stay in memory)
20
+ const _loadedCortex = {};
21
+
22
+ async function loadCortexLib(url) {
23
+ if (_loadedCortex[url]) return;
24
+ return new Promise(function (resolve, reject) {
25
+ var s = document.createElement('script');
26
+ s.src = url;
27
+ s.onload = function () { _loadedCortex[url] = true; resolve(undefined); };
28
+ s.onerror = function () { reject(new Error('Failed to load: ' + url)); };
29
+ document.head.appendChild(s);
30
+ });
31
+ }
32
+
33
+ const capabilities = {
34
+
35
+ // ── Discovery ──
36
+
37
+ async list(filters) {
38
+ var params = new URLSearchParams();
39
+ if (filters) {
40
+ if (filters.search) params.set('search', filters.search);
41
+ if (filters.tags) params.set('tags', filters.tags.join(','));
42
+ if (filters.callable !== undefined) params.set('callable', String(filters.callable));
43
+ if (filters.authRequired) params.set('authRequired', filters.authRequired);
44
+ if (filters.source_type) params.set('source_type', filters.source_type);
45
+ if (filters.status) params.set('status', filters.status);
46
+ if (filters.page) params.set('page', String(filters.page));
47
+ if (filters.per_page) params.set('per_page', String(filters.per_page));
48
+ }
49
+ var qs = params.toString();
50
+ var res = await authFetch('/v1/capabilities' + (qs ? '?' + qs : ''));
51
+ if (!res.ok) throw new Error(res.error?.message || 'Failed to list capabilities');
52
+ return res.data;
53
+ },
54
+
55
+ async search(query) {
56
+ return capabilities.list({ search: query });
57
+ },
58
+
59
+ async get(id) {
60
+ var res = await authFetch('/v1/capabilities/' + encodeURIComponent(id));
61
+ if (!res.ok) throw new Error(res.error?.message || 'Capability not found');
62
+ return res.data;
63
+ },
64
+
65
+ // ── Invocation ──
66
+
67
+ async invoke(id, input, opts) {
68
+ var cap = await capabilities.get(id);
69
+ var mode = (opts && opts.mode) || 'normal';
70
+
71
+ // Client-side cortex invoke
72
+ if (cap.source && cap.source.type === 'cortex') {
73
+ var usage = cap.usage || '';
74
+ // Try to load the cortex lib
75
+ var libMatch = usage.match(/loadScript\(['"]([^'"]+)['"]/);
76
+ if (libMatch) {
77
+ await loadCortexLib(libMatch[1]);
78
+ }
79
+ // Find the export function
80
+ if (cap.exports && cap.exports.length > 0) {
81
+ // If id contains export name like "cortex:name:funcName"
82
+ var parts = id.split(':');
83
+ var funcName = parts.length >= 3 ? parts[2] : null;
84
+ if (funcName) {
85
+ // Search global scope for the function
86
+ var fn = window[funcName] || (window.AIMEAT && window.AIMEAT[funcName]);
87
+ if (typeof fn === 'function') {
88
+ var start = performance.now();
89
+ var result = await fn(input);
90
+ var duration = Math.round(performance.now() - start);
91
+ // Fire-and-forget telemetry
92
+ try {
93
+ authFetch('/v1/capabilities/' + encodeURIComponent(id) + '/telemetry', {
94
+ method: 'POST',
95
+ body: JSON.stringify({ duration_ms: duration, status: 'success' }),
96
+ }).catch(function () {});
97
+ } catch { /* telemetry is fire-and-forget */ }
98
+ return result;
99
+ }
100
+ }
101
+ }
102
+ throw new Error('Cortex capability loaded but export function not found. Use direct loadScript() instead.');
103
+ }
104
+
105
+ // Server-side invoke (extensions, webhooks)
106
+ var res = await authFetch('/v1/capabilities/' + encodeURIComponent(id) + '/invoke' + (mode === 'raw' ? '?mode=raw' : ''), {
107
+ method: 'POST',
108
+ body: JSON.stringify({ input: input || {} }),
109
+ });
110
+ if (!res.ok) throw new Error(res.error?.message || 'Invoke failed');
111
+ return res.data.result !== undefined ? res.data.result : res.data;
112
+ },
113
+
114
+ // ── Management ──
115
+
116
+ async create(record) {
117
+ var res = await authFetch('/v1/capabilities', {
118
+ method: 'POST',
119
+ body: JSON.stringify(record),
120
+ });
121
+ if (!res.ok) throw new Error(res.error?.message || 'Failed to create capability');
122
+ return res.data;
123
+ },
124
+
125
+ async update(id, updates) {
126
+ var res = await authFetch('/v1/capabilities/' + encodeURIComponent(id), {
127
+ method: 'PUT',
128
+ body: JSON.stringify(updates),
129
+ });
130
+ if (!res.ok) throw new Error(res.error?.message || 'Failed to update capability');
131
+ return res.data;
132
+ },
133
+
134
+ async delete(id) {
135
+ var res = await authFetch('/v1/capabilities/' + encodeURIComponent(id), {
136
+ method: 'DELETE',
137
+ });
138
+ if (!res.ok) throw new Error(res.error?.message || 'Failed to delete capability');
139
+ return res.data;
140
+ },
141
+
142
+ async mine() {
143
+ var session = getSession();
144
+ return capabilities.list({ owner: session.ghii || session.owner });
145
+ },
146
+
147
+ // ── Testing ──
148
+
149
+ async test(id, input) {
150
+ var res = await authFetch('/v1/capabilities/' + encodeURIComponent(id) + '/test', {
151
+ method: 'POST',
152
+ body: JSON.stringify({ input: input || {} }),
153
+ });
154
+ if (!res.ok) throw new Error(res.error?.message || 'Test failed');
155
+ return res.data;
156
+ },
157
+
158
+ // ── Vouching ──
159
+
160
+ async vouch(id, comment) {
161
+ var body = comment ? { comment } : {};
162
+ var res = await authFetch('/v1/capabilities/' + encodeURIComponent(id) + '/vouch', {
163
+ method: 'POST',
164
+ body: JSON.stringify(body),
165
+ });
166
+ if (!res.ok) throw new Error(res.error?.message || 'Vouch failed');
167
+ return res.data;
168
+ },
169
+
170
+ async unvouch(id) {
171
+ var res = await authFetch('/v1/capabilities/' + encodeURIComponent(id) + '/vouch', {
172
+ method: 'DELETE',
173
+ });
174
+ if (!res.ok) throw new Error(res.error?.message || 'Unvouch failed');
175
+ return res.data;
176
+ },
177
+ };
178
+
179
+ attach('capabilities', capabilities);