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,101 @@
1
+ /**
2
+ * @file src/services/app-tool-interfaces.ts
3
+ * @description The PINNED INTERFACE versioning for EXCHANGE app-tool offerings (TARGET-045, Gap 1 —
4
+ * cross-app selling). An app owner sells a named tool (e.g. `getCompanyBrief`) as a metered offering;
5
+ * a consumer contracts it and integrates against its I/O SCHEMA. The problem this solves: the provider
6
+ * must keep improving the app WITHOUT breaking a live consumer integration bound to that interface.
7
+ *
8
+ * The invention ("Pinned Interface, Versioned Provider"): the app product stays fully mutable, but each
9
+ * sellable interface is snapshot into an IMMUTABLE, content-addressed VERSION `{inputSchema, outputSchema,
10
+ * binding}`. Republishing an UNCHANGED interface is idempotent (same schemaHash → same version); changing
11
+ * the I/O schema or the backing binding mints a NEW version (append-only — an existing version record is
12
+ * never mutated). An offering pins one version; a contract (entitlement) pins the same version and the
13
+ * metered call routes to THAT snapshot's binding — so a provider can ship v2 freely while existing
14
+ * contracts keep hitting the frozen v1. Deprecation/migration is an offering-level lifecycle (re-point to
15
+ * the new version for NEW consumers), never a silent break.
16
+ *
17
+ * NOTE: price is intentionally NOT frozen here — it is authoritative at accept time and captured into the
18
+ * entitlement, so a provider may reprice for new consumers while existing contracts keep their agreed price.
19
+ * Only the integration contract (schema + binding) is version-frozen.
20
+ *
21
+ * Storage: PUBLIC memory under the provider's GHII (so consumers can read the frozen schema). Version
22
+ * records `apptool.iface.{hash}.v{n}` are append-only (never mutated); the `.latest` pointer is the only
23
+ * mutable record.
24
+ * @structure AppToolInterface · InterfaceDef · ifaceKeyBase · ensureInterfaceVersion · getInterfaceVersion ·
25
+ * getLatestInterface · listInterfaceVersions
26
+ * @usage
27
+ * const iface = await ensureInterfaceVersion(storage, providerGhii, appId, tool, { inputSchema, outputSchema, binding });
28
+ * const pinned = await getInterfaceVersion(storage, providerGhii, appId, tool, ent.surface.ifaceVersion);
29
+ * @version-history
30
+ * v1.0.0 — 2026-07-21 — Initial pinned-interface versioning (append-only snapshots + latest pointer + freeze).
31
+ */
32
+ import { createHash } from 'node:crypto';
33
+ const ownerNameOf = (providerGhii) => providerGhii.split('@')[0].split('#').pop() ?? providerGhii;
34
+ /** Stable, prefix-scannable key base for all versions of one (provider, app, tool). Hashed because appId
35
+ * carries dots (`.html`) and tool names carry `.`/`-`, which would make a dotted key ambiguous to scan. */
36
+ export function ifaceKeyBase(providerGhii, appId, tool) {
37
+ const h = createHash('sha256').update(`${providerGhii}|${appId}|${tool}`).digest('hex').slice(0, 24);
38
+ return `apptool.iface.${h}`;
39
+ }
40
+ const versionKey = (base, n) => `${base}.v${n}`;
41
+ const latestKey = (base) => `${base}.latest`;
42
+ /** The content identity of an interface: republishing an identical schema+binding is idempotent. */
43
+ function hashDef(def) {
44
+ const canonical = JSON.stringify({ i: def.inputSchema ?? {}, o: def.outputSchema ?? {}, b: def.binding ?? null });
45
+ return createHash('sha256').update(canonical).digest('hex').slice(0, 32);
46
+ }
47
+ /**
48
+ * Snapshot the current sellable interface into a version, minting a NEW version only when the schema/binding
49
+ * actually changed (else returns the existing latest — idempotent relisting). Existing version records are
50
+ * NEVER overwritten — that immutability IS the freeze. `providerGhii` is the full provider GHII (the PUBLIC
51
+ * owner of the snapshot records).
52
+ */
53
+ export async function ensureInterfaceVersion(storage, providerGhii, appId, tool, def) {
54
+ const base = ifaceKeyBase(providerGhii, appId, tool);
55
+ const hash = hashDef(def);
56
+ const latest = await getLatestInterface(storage, providerGhii, appId, tool);
57
+ if (latest && latest.schemaHash === hash)
58
+ return latest; // unchanged → reuse the pinned version
59
+ const nextVersion = (latest?.ifaceVersion ?? 0) + 1;
60
+ const now = new Date().toISOString();
61
+ const iface = {
62
+ appId, ownerName: ownerNameOf(providerGhii), tool, ifaceVersion: nextVersion, schemaHash: hash,
63
+ inputSchema: def.inputSchema ?? {}, outputSchema: def.outputSchema ?? {}, binding: def.binding ?? null,
64
+ createdAt: now,
65
+ };
66
+ await storage.setMemory({
67
+ key: versionKey(base, nextVersion), ownerGaii: providerGhii, value: iface,
68
+ visibility: 'public', tags: ['apptool-interface'], ttlHours: null, version: 1, createdAt: now, updatedAt: now,
69
+ });
70
+ await storage.setMemory({
71
+ key: latestKey(base), ownerGaii: providerGhii, value: { version: nextVersion, updatedAt: now },
72
+ visibility: 'public', tags: ['apptool-interface-latest'], ttlHours: null, version: 1, createdAt: now, updatedAt: now,
73
+ });
74
+ return iface;
75
+ }
76
+ /** One frozen interface version, or null. */
77
+ export async function getInterfaceVersion(storage, providerGhii, appId, tool, version) {
78
+ const base = ifaceKeyBase(providerGhii, appId, tool);
79
+ const rec = await storage.getMemory(providerGhii, versionKey(base, version));
80
+ return rec ? rec.value : null;
81
+ }
82
+ /** The current (highest) interface version, or null if the tool was never snapshot. */
83
+ export async function getLatestInterface(storage, providerGhii, appId, tool) {
84
+ const base = ifaceKeyBase(providerGhii, appId, tool);
85
+ const ptr = await storage.getMemory(providerGhii, latestKey(base));
86
+ const version = ptr?.value?.version;
87
+ if (!version)
88
+ return null;
89
+ const rec = await storage.getMemory(providerGhii, versionKey(base, version));
90
+ return rec ? rec.value : null;
91
+ }
92
+ /** Every snapshot version for a tool, oldest first (for the provider console's version history). */
93
+ export async function listInterfaceVersions(storage, providerGhii, appId, tool) {
94
+ const base = ifaceKeyBase(providerGhii, appId, tool);
95
+ const { items } = await storage.listAllMemory({ prefix: `${base}.v`, limit: 500 });
96
+ return items
97
+ .map(r => r.value)
98
+ .filter(v => v && typeof v.ifaceVersion === 'number')
99
+ .sort((a, b) => a.ifaceVersion - b.ifaceVersion);
100
+ }
101
+ //# sourceMappingURL=app-tool-interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-tool-interfaces.js","sourceRoot":"","sources":["../../../src/services/app-tool-interfaces.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,9 @@
12
12
  * @usage import { buildAppPrompt } from '../services/build-app-prompt.js';
13
13
  * const { full, body } = buildAppPrompt(config, { lang: 'en', mode: 'new', idea: '...' });
14
14
  * @version-history
15
+ * 2026-07-19 — Mobile safety checklist section (overflow-x:clip, minmax(0,1fr)+min-width:0,
16
+ * wrap-wide-content, verify scrollWidth===clientWidth) + viewport meta gains viewport-fit=cover
17
+ * + interactive-widget=resizes-content. Prevention baked into the paved path.
15
18
  * 2026-07-19 — Research-first flow (AppDev KB Phase 7): Step 0 + tier decision tree + finish checklist / appdev-flow prompt / handbook module
16
19
  * v1.5.0 — 2026-07-19 — MCP-agent section: load node:aimeat-app-builder first + curated
17
20
  * pitfall registry pointer (/v1/appdev/pitfalls) (AppDev KB Phase 2)
@@ -1 +1 @@
1
- {"version":3,"file":"build-app-prompt.d.ts","sourceRoot":"","sources":["../../../src/services/build-app-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAUjD,MAAM,WAAW,qBAAqB;IACpC,wFAAwF;IACxF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sFAAsF;IACtF,IAAI,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;IACzB,4FAA4F;IAC5F,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAKD,8FAA8F;AAC9F,wBAAgB,cAAc,CAC5B,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,qBAA0B,GAC/B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CA0PhC"}
1
+ {"version":3,"file":"build-app-prompt.d.ts","sourceRoot":"","sources":["../../../src/services/build-app-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAUjD,MAAM,WAAW,qBAAqB;IACpC,wFAAwF;IACxF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sFAAsF;IACtF,IAAI,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;IACzB,4FAA4F;IAC5F,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAKD,8FAA8F;AAC9F,wBAAgB,cAAc,CAC5B,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,qBAA0B,GAC/B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAsQhC"}
@@ -181,7 +181,18 @@ export function buildAppPrompt(config, opts = {}) {
181
181
  body += ' apply(localStorage.getItem("aimeat-theme") || (matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"));\n';
182
182
  body += ' addEventListener("storage", function(e){ if(e.key==="aimeat-theme" && e.newValue) apply(e.newValue); }); })();\n';
183
183
  body += '```\n';
184
- body += 'Always include <meta name="viewport" content="width=device-width, initial-scale=1.0">. Mobile-first, single self-contained HTML file with embedded CSS + JS.\n\n';
184
+ body += 'Always include the viewport meta: `<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover, interactive-widget=resizes-content">` (the last part makes the on-screen keyboard resize the layout instead of hiding bottom inputs). Mobile-first, single self-contained HTML file with embedded CSS + JS.\n\n';
185
+ // Mobile safety checklist — the recurring "it looks tiny / overflows on a phone" class of bug,
186
+ // as positive DO-rules. The app-shell templates already bake these in; hand-rolled layouts must
187
+ // follow them. (Distilled from the curated mobile pitfalls — auth-pill-overflow, grid-track-blowout.)
188
+ body += '### Mobile safety checklist (do these — they prevent the #1 phone bug)\n';
189
+ body += 'One element wider than the screen makes mobile browsers shrink-to-fit the WHOLE page, so every font renders tiny. Prevent it:\n';
190
+ body += '- **`body { overflow-x: clip; }`** — a belt-and-braces guard against horizontal overflow. Use `clip`, NOT `hidden` (hidden makes body a scroll container and breaks `position: sticky` headers).\n';
191
+ body += '- **The login pill is already mobile-safe** — `mountLoginButton` renders a compact account button + popover on phones automatically on an app origin. Do NOT put other fixed-width widgets in the header row next to it; let header children shrink (`min-width: 0`).\n';
192
+ body += '- **CSS grid: use `grid-template-columns: … minmax(0,1fr)` and `min-width: 0` on grid/flex children.** A plain `1fr` is `minmax(auto,1fr)`, so a wide non-wrapping child (a table, `<pre>`, long code) inflates the track and overflows the page even inside an `overflow-x:auto` wrapper. `minmax(0,…)` + `min-width:0` let it shrink so the wrapper actually scrolls.\n';
193
+ body += '- **Wrap wide content** — put tables / code blocks / diagrams in a `overflow-x:auto` container, and `flex-wrap: wrap` any toolbar/nav row whose item count can grow (tabs, pager dots).\n';
194
+ body += '- **Verify**: at 390px (portrait) AND ~844px (landscape), `document.documentElement.scrollWidth === clientWidth` (zero horizontal overflow) and body text stays ≥14px.\n';
195
+ body += 'For a focused view (chat/editor/wizard) on ≤760px, go full-screen (`position:fixed; inset:0` gated on an is-active class) with a Back affordance, rather than sharing the screen with app chrome.\n\n';
185
196
  // Game form language — palette alone reads as a dashboard; the FORM LANGUAGE makes the game.
186
197
  // Born from pitfall app/candy-palette-alone-is-not-a-game-look (TOWER TETRIS, 2026-07-19).
187
198
  body += '### Game / playful look — form language, not just palette\n';
@@ -1 +1 @@
1
- {"version":3,"file":"build-app-prompt.js","sourceRoot":"","sources":["../../../src/services/build-app-prompt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build-app-prompt.js","sourceRoot":"","sources":["../../../src/services/build-app-prompt.ts"],"names":[],"mappings":"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"}
@@ -7,9 +7,13 @@
7
7
  * list view unions the consent rows with the owner's DM conversation peers and resolves display
8
8
  * names at read time (nothing cached on the row). Email lookup is EXACT-match only via the same
9
9
  * privacy-preserving hash the invite flow uses.
10
- * @structure ContactsError; contactKind; listContactsMerged; saveContact; removeContact; resolveContactEmail.
10
+ * @structure ContactsError; contactKind; listContactsMerged; saveContact; removeContact;
11
+ * resolveContactEmail; resolveOwnerByVerifiedEmail (verified email → owner handle, invariant-asserted).
11
12
  * @usage const { contacts } = await listContactsMerged(storage, config, ownerGhii, { q });
12
13
  * @version-history
14
+ * v1.1.0 — 2026-07-19 — Add resolveOwnerByVerifiedEmail: verified-email → owner handle for
15
+ * email-or-handle connect (device-auth --owner), reading the full match set to assert the
16
+ * one-verified-email-per-account invariant instead of silently picking.
13
17
  * v1.0.0 — 2026-07-16 — Initial: merged list, proactive save, gate-safe remove, email resolve.
14
18
  */
15
19
  import type { AimeatConfig } from '../config.js';
@@ -61,4 +65,24 @@ export type ResolveEmailResult = {
61
65
  /** EXACT-match email → local owner (privacy-preserving hash equality; no enumeration). Not found
62
66
  * → can_invite signals whether an email invitation could be sent. Throws ContactsError on a bad email. */
63
67
  export declare function resolveContactEmail(storage: Storage, email: string): Promise<ResolveEmailResult>;
68
+ export type ResolveOwnerByEmailResult = {
69
+ ok: true;
70
+ ownerName: string;
71
+ ghii: string;
72
+ } | {
73
+ ok: false;
74
+ code: 'INVALID_EMAIL' | 'NO_ACCOUNT' | 'AMBIGUOUS';
75
+ message: string;
76
+ };
77
+ /**
78
+ * Resolve an account's VERIFIED email → its local owner handle, case-insensitively (same
79
+ * privacy-preserving hash as resolveContactEmail, gated to `emailVerifiedAt`). Used where a user may
80
+ * name their account by email instead of handle (e.g. the connector's device-auth `--owner`). The
81
+ * email only SELECTS the target account; it is never an authentication factor.
82
+ *
83
+ * Enforcement is layered: a partial-unique index on `emailHash` makes >1 verified match impossible at
84
+ * the DB, but we still read the full set and ASSERT it (log + AMBIGUOUS) rather than silently pick one,
85
+ * so any drift is surfaced loudly. Unverified email bindings never resolve.
86
+ */
87
+ export declare function resolveOwnerByVerifiedEmail(storage: Storage, email: string): Promise<ResolveOwnerByEmailResult>;
64
88
  //# sourceMappingURL=contacts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"contacts.d.ts","sourceRoot":"","sources":["../../../src/services/contacts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAQ7E,2GAA2G;AAC3G,qBAAa,aAAc,SAAQ,KAAK;IACnB,MAAM,EAAE,MAAM;IAAS,IAAI,EAAE,MAAM;gBAAnC,MAAM,EAAE,MAAM,EAAS,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAIxE;AAED,0EAA0E;AAC1E,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAIhE;AAED;qCACqC;AACrC,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAItE;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAC/B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAeD;;oDAEoD;AACpD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EACnC,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3D,OAAO,CAAC,UAAU,EAAE,CAAC,CA+BvB;AAED;0DAC0D;AAC1D,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAC9E,OAAO,CAAC,oBAAoB,CAAC,CAgB/B;AAED;;yFAEyF;AACzF,wBAAsB,aAAa,CACjC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GACrD,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACzE;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC;AAE1C;2GAC2G;AAC3G,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAMtG"}
1
+ {"version":3,"file":"contacts.d.ts","sourceRoot":"","sources":["../../../src/services/contacts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAS7E,2GAA2G;AAC3G,qBAAa,aAAc,SAAQ,KAAK;IACnB,MAAM,EAAE,MAAM;IAAS,IAAI,EAAE,MAAM;gBAAnC,MAAM,EAAE,MAAM,EAAS,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAIxE;AAED,0EAA0E;AAC1E,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAIhE;AAED;qCACqC;AACrC,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAItE;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAC/B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAeD;;oDAEoD;AACpD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EACnC,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3D,OAAO,CAAC,UAAU,EAAE,CAAC,CA+BvB;AAED;0DAC0D;AAC1D,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAC9E,OAAO,CAAC,oBAAoB,CAAC,CAgB/B;AAED;;yFAEyF;AACzF,wBAAsB,aAAa,CACjC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GACrD,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACzE;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC;AAE1C;2GAC2G;AAC3G,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAMtG;AAED,MAAM,MAAM,yBAAyB,GACjC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,eAAe,GAAG,YAAY,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvF;;;;;;;;;GASG;AACH,wBAAsB,2BAA2B,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAkBrH"}
@@ -2,6 +2,7 @@ import { conversationIdFor } from '../utils/messaging.js';
2
2
  import { emitChange } from './event-bus.js';
3
3
  import { inviteEmailHash } from './invitations.js';
4
4
  import { getActiveEmailService } from './email.js';
5
+ import { logger } from '../utils/logger.js';
5
6
  const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
6
7
  /** A validation/precondition failure the caller maps to its own error shape (HTTP envelope / MCP text). */
7
8
  export class ContactsError extends Error {
@@ -130,4 +131,33 @@ export async function resolveContactEmail(storage, email) {
130
131
  return { found: true, ghii: rec.ghii, owner: rec.ghii.split('@')[0], display_name: rec.displayName ?? null };
131
132
  return { found: false, can_invite: !!getActiveEmailService()?.enabled };
132
133
  }
134
+ /**
135
+ * Resolve an account's VERIFIED email → its local owner handle, case-insensitively (same
136
+ * privacy-preserving hash as resolveContactEmail, gated to `emailVerifiedAt`). Used where a user may
137
+ * name their account by email instead of handle (e.g. the connector's device-auth `--owner`). The
138
+ * email only SELECTS the target account; it is never an authentication factor.
139
+ *
140
+ * Enforcement is layered: a partial-unique index on `emailHash` makes >1 verified match impossible at
141
+ * the DB, but we still read the full set and ASSERT it (log + AMBIGUOUS) rather than silently pick one,
142
+ * so any drift is surfaced loudly. Unverified email bindings never resolve.
143
+ */
144
+ export async function resolveOwnerByVerifiedEmail(storage, email) {
145
+ const clean = (email || '').trim().toLowerCase();
146
+ if (!clean || !EMAIL_RE.test(clean)) {
147
+ return { ok: false, code: 'INVALID_EMAIL', message: `"${email}" is not a valid email address.` };
148
+ }
149
+ const verified = (await storage.getGHIIsByEmailHash(inviteEmailHash(clean))).filter(m => !!m.emailVerifiedAt);
150
+ if (verified.length === 0) {
151
+ return { ok: false, code: 'NO_ACCOUNT', message: 'No account on this node has that email as a verified address.' };
152
+ }
153
+ if (verified.length > 1) {
154
+ // Should be impossible under the one-verified-email-per-account-per-node invariant (DB-enforced).
155
+ logger.error('Email→owner resolution is ambiguous: >1 account shares a verified email hash', {
156
+ matches: verified.map(m => m.ghii),
157
+ });
158
+ return { ok: false, code: 'AMBIGUOUS', message: 'That email maps to more than one account — contact the node operator.' };
159
+ }
160
+ const rec = verified[0];
161
+ return { ok: true, ownerName: rec.ownerName ?? rec.ghii.split('@')[0], ghii: rec.ghii };
162
+ }
133
163
  //# sourceMappingURL=contacts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../../src/services/contacts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../../src/services/contacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * @file src/services/entitlement-money.ts
3
+ * @description The MONEY settlement rail for EXCHANGE entitlements (TARGET-045) — the "identical seam"
4
+ * the morsel gateway (entitlement-gate.ts) mirrors, but settling REAL money (EUR/USD) per call via the
5
+ * ACCRUAL model: each metered call records a real currency obligation (buyer → seller, minus the
6
+ * platform rake) through a registered money PaymentHandler, off the morsel ledger. No per-call PSP
7
+ * charge and no custodial escrow — amounts accrue and settle in a batch (the `io.aimeat.invoice`
8
+ * receivable rail in prod, or `com.stripe.spt` when activated; the OSS `test.money` double in E2E),
9
+ * which matches AIMEAT's non-custodial + aggregation design (see money.ts). The entitlement's budget
10
+ * (in currency micro-units) is the buyer's committed spend cap.
11
+ * @structure resolveAccrualHandler · settleEntitlementMoney · refundEntitlementMoney
12
+ * @usage
13
+ * const s = await settleEntitlementMoney(storage, config, { consumerGhii, providerGhii, priceMicros, currency, feePct, reference });
14
+ * if (!s.ok) // deny; else keep s.trackingCode for a later refund
15
+ * @version-history
16
+ * v1.0.0 — 2026-07-20 — Initial money accrual rail for the entitlement gateway (EXCHANGE money unit).
17
+ */
18
+ import type { AimeatConfig } from '../config.js';
19
+ import type { Storage } from '../storage/interface.js';
20
+ import type { PaymentHandler } from '../commerce/types.js';
21
+ /** Pick the money handler to accrue against for a currency: prefer the invoice receivable rail, then the
22
+ * OSS test double, then any other non-morsel handler. Null when no money handler is registered. */
23
+ export declare function resolveAccrualHandler(currency: string): PaymentHandler | null;
24
+ /**
25
+ * Settle ONE metered call in real money: collect the price from the consumer, pay the provider its net
26
+ * (price − rake), and account the operator's rake — all through the resolved money handler (accrual).
27
+ * Returns the tracking code so a post-payment script throw can refund. Never throws — a handler failure
28
+ * comes back as `{ ok:false }` so the gateway denies the call cleanly (no partial settlement).
29
+ */
30
+ export declare function settleEntitlementMoney(storage: Storage, config: AimeatConfig, args: {
31
+ consumerGhii: string;
32
+ providerGhii: string;
33
+ priceMicros: number;
34
+ currency: string;
35
+ feePct: number;
36
+ reference: string;
37
+ }): Promise<{
38
+ ok: true;
39
+ handler: string;
40
+ trackingCode: string;
41
+ fee: number;
42
+ net: number;
43
+ } | {
44
+ ok: false;
45
+ reason: string;
46
+ }>;
47
+ /** Best-effort reverse of a money accrual (post-payment script throw), mirroring the handler's refund leg. */
48
+ export declare function refundEntitlementMoney(storage: Storage, config: AimeatConfig, args: {
49
+ consumerGhii: string;
50
+ providerGhii: string;
51
+ priceMicros: number;
52
+ currency: string;
53
+ trackingCode: string;
54
+ }): Promise<void>;
55
+ //# sourceMappingURL=entitlement-money.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entitlement-money.d.ts","sourceRoot":"","sources":["../../../src/services/entitlement-money.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAkB,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAS3E;oGACoG;AACpG,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAM7E;AAID;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC7H,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA4BxH;AAED,8GAA8G;AAC9G,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAChH,OAAO,CAAC,IAAI,CAAC,CAUf"}
@@ -0,0 +1,68 @@
1
+ import { listPaymentHandlers, MORSEL_HANDLER_ID } from '../commerce/payment-handlers.js';
2
+ import { TEST_MONEY_HANDLER_ID } from '../commerce/test-money-handler.js';
3
+ import { percentFee } from '../commerce/money.js';
4
+ import { recordMoneyPlatformFee } from '../commerce/session-service.js';
5
+ /** The invoice/receivable rail that accrues real money without a live per-call PSP charge (prod EE). */
6
+ const ACCRUAL_HANDLER_ID = 'io.aimeat.invoice';
7
+ /** Pick the money handler to accrue against for a currency: prefer the invoice receivable rail, then the
8
+ * OSS test double, then any other non-morsel handler. Null when no money handler is registered. */
9
+ export function resolveAccrualHandler(currency) {
10
+ const money = listPaymentHandlers().filter(h => h.id !== MORSEL_HANDLER_ID && h.currencies.includes(currency));
11
+ return money.find(h => h.id === ACCRUAL_HANDLER_ID)
12
+ ?? money.find(h => h.id === TEST_MONEY_HANDLER_ID)
13
+ ?? money[0]
14
+ ?? null;
15
+ }
16
+ const ownerOf = (ghii) => ghii.split('@')[0].split('#').pop() ?? ghii;
17
+ /**
18
+ * Settle ONE metered call in real money: collect the price from the consumer, pay the provider its net
19
+ * (price − rake), and account the operator's rake — all through the resolved money handler (accrual).
20
+ * Returns the tracking code so a post-payment script throw can refund. Never throws — a handler failure
21
+ * comes back as `{ ok:false }` so the gateway denies the call cleanly (no partial settlement).
22
+ */
23
+ export async function settleEntitlementMoney(storage, config, args) {
24
+ const handler = resolveAccrualHandler(args.currency);
25
+ if (!handler)
26
+ return { ok: false, reason: 'no_money_handler' };
27
+ const price = Math.max(0, Math.floor(args.priceMicros));
28
+ const fee = percentFee(price, args.feePct);
29
+ const net = price - fee;
30
+ const ctx = { config, storage };
31
+ const seller = { ghii: args.providerGhii, owner: ownerOf(args.providerGhii) };
32
+ try {
33
+ const collected = await handler.collect(ctx, {
34
+ buyerGhii: args.consumerGhii, amount: price, currency: args.currency, reference: args.reference, fee, seller,
35
+ });
36
+ if (net > 0) {
37
+ await handler.payout(ctx, {
38
+ toGhii: args.providerGhii, amount: net, currency: args.currency,
39
+ buyerGhii: args.consumerGhii, trackingCode: collected.trackingCode, reference: args.reference,
40
+ });
41
+ }
42
+ if (fee > 0) {
43
+ await recordMoneyPlatformFee(storage, config, {
44
+ fee, currency: args.currency, sellerGhii: args.providerGhii, buyerGhii: args.consumerGhii,
45
+ trackingCode: collected.trackingCode, handler: handler.id,
46
+ });
47
+ }
48
+ return { ok: true, handler: handler.id, trackingCode: collected.trackingCode, fee, net };
49
+ }
50
+ catch {
51
+ return { ok: false, reason: 'settlement_failed' };
52
+ }
53
+ }
54
+ /** Best-effort reverse of a money accrual (post-payment script throw), mirroring the handler's refund leg. */
55
+ export async function refundEntitlementMoney(storage, config, args) {
56
+ const handler = resolveAccrualHandler(args.currency);
57
+ if (!handler)
58
+ return;
59
+ const ctx = { config, storage };
60
+ try {
61
+ await handler.refund(ctx, {
62
+ buyerGhii: args.consumerGhii, amount: Math.max(0, Math.floor(args.priceMicros)), trackingCode: args.trackingCode,
63
+ seller: { ghii: args.providerGhii, owner: ownerOf(args.providerGhii) },
64
+ });
65
+ }
66
+ catch { /* refund is best-effort; the handler contract says it must not throw, but guard anyway */ }
67
+ }
68
+ //# sourceMappingURL=entitlement-money.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entitlement-money.js","sourceRoot":"","sources":["../../../src/services/entitlement-money.ts"],"names":[],"mappings":"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"}