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,264 @@
1
+ /**
2
+ * @file src/services/metered-entitlements.ts
3
+ * @description G1 — the durable METERED ENTITLEMENT primitive (EXCHANGE / TARGET-045). Generalises the
4
+ * single-use `ext-pay-token` into a lasting, budget-capped, contract-bound right: "consumer C may call
5
+ * provider P's capability (ext/action) at price X, under contract K, until budget B is spent." This is
6
+ * the object app-grants deliberately do NOT provide — a grant confers scopes (capability *classes*),
7
+ * never a priced call-right to a specific provider. An entitlement is server-minted by the
8
+ * contract-acceptance flow (a human in an MCP chat, or a closed negotiation agent) and consulted by the
9
+ * metered-call gateway (G2) on every call. Memory-backed (no new table — per
10
+ * docs/coding-guidelines/memory-contracts.md; keeps the node holding only refined data, EXCHANGE's
11
+ * design principle), stored under a system namespace and never client-readable.
12
+ * @structure MeteredEntitlement · entitlementKey · readEntitlementForCall · listEntitlementsByConsumer /
13
+ * ByProvider · createEntitlement · authorizeAndCharge · pauseEntitlement · revokeEntitlement
14
+ * @usage
15
+ * await createEntitlement(storage, { consumerGaii, providerGhii, ext, action, priceMoney, budget, contractRef, ... });
16
+ * const gate = await authorizeAndCharge(storage, consumerGaii, ext, action, priceMicros);
17
+ * if (!gate.ok) return res.status(402)...;
18
+ * @version-history
19
+ * v1.3.0 — 2026-07-21 — Contract history: archiveEntitlement + listEntitlementHistoryByConsumer/ByProvider
20
+ * (superseded contracts survive the live-key overwrite for the "past contracts" view — renegotiation).
21
+ * v1.2.0 — 2026-07-21 — Add optional `surface` (AppToolSurface) so a contract can bind an app-tool's pinned
22
+ * interface version (Gap 1 cross-app selling); the (ext, action) coordinate stays the shared key.
23
+ * v1.1.0 — 2026-07-20 — Add `appId` dimension + listEntitlementsByApp for the per-app cost surface (G3)
24
+ * v1.0.0 — 2026-07-20 — Initial G1 entitlement object (EXCHANGE slice-1): create / lookup-by-call /
25
+ * authorize+charge (budget decrement) / pause / revoke. Read-modify-write budget counter — see the
26
+ * concurrency note on authorizeAndCharge (a dedicated atomic counter is deferred to G5).
27
+ */
28
+ import { createHash, randomUUID } from 'node:crypto';
29
+ /** System namespace — server-side only, never surfaced to a client (mirrors `ext-pay-token`). */
30
+ const NS = 'metered-entitlement';
31
+ /** History namespace — superseded (renegotiated) contracts are archived here so the record survives the
32
+ * live-key overwrite; the consumer/provider "past contracts" views read it. Append-only. */
33
+ const NS_HISTORY = 'metered-entitlement-history';
34
+ /** Deterministic, dot-safe key: a call `(consumer, ext, action)` maps to exactly one entitlement, so the
35
+ * gateway does an O(1) `getMemory` lookup (no scan). GAII contains `@`/`#` — hashing sidesteps key-segment
36
+ * rules while staying reproducible. The full identifiers live in the value for verification. */
37
+ export function entitlementKey(consumerGaii, ext, action) {
38
+ const h = createHash('sha256').update(`${consumerGaii}|${ext}|${action}`).digest('hex').slice(0, 32);
39
+ return `entitlement.${h}`;
40
+ }
41
+ /** Look up the live entitlement authorising this exact call, or null. */
42
+ export async function readEntitlementForCall(storage, consumerGaii, ext, action) {
43
+ const rec = await storage.getMemory(NS, entitlementKey(consumerGaii, ext, action));
44
+ return rec ? rec.value : null;
45
+ }
46
+ /** Every entitlement a consumer holds (for the app cost/contract surface, G3). Filtered prefix scan. */
47
+ export async function listEntitlementsByConsumer(storage, consumerGaii) {
48
+ const { items } = await storage.listAllMemory({ prefix: 'entitlement.', limit: 5000 });
49
+ return items.map(r => r.value).filter(v => v && v.consumerGaii === consumerGaii);
50
+ }
51
+ /** Every entitlement a provider sells (for the provider/earnings view). Filtered prefix scan. */
52
+ export async function listEntitlementsByProvider(storage, providerGhii) {
53
+ const { items } = await storage.listAllMemory({ prefix: 'entitlement.', limit: 5000 });
54
+ return items.map(r => r.value).filter(v => v && v.providerGhii === providerGhii);
55
+ }
56
+ /** Every entitlement a consuming app holds (the per-app cost/contract surface, G3). Filtered prefix scan. */
57
+ export async function listEntitlementsByApp(storage, appId) {
58
+ const { items } = await storage.listAllMemory({ prefix: 'entitlement.', limit: 5000 });
59
+ return items.map(r => r.value).filter(v => v && v.appId === appId);
60
+ }
61
+ /** Mint (or overwrite) an entitlement — called by the contract-acceptance flow after both sides agree.
62
+ * One `(consumer, ext, action)` triple has one entitlement; re-minting replaces it (e.g. renegotiated price),
63
+ * carrying spend forward only when explicitly asked. */
64
+ export async function createEntitlement(storage, input) {
65
+ const now = new Date().toISOString();
66
+ const value = {
67
+ entitlementId: input.carrySpend?.entitlementId || randomUUID(),
68
+ consumerGaii: input.consumerGaii,
69
+ appId: input.appId ?? input.carrySpend?.appId ?? null,
70
+ providerGhii: input.providerGhii,
71
+ ext: input.ext,
72
+ action: input.action,
73
+ capabilityLabel: input.capabilityLabel || `${input.ext}/${input.action}`,
74
+ unit: input.unit,
75
+ pricePerCall: input.pricePerCall,
76
+ currency: input.unit === 'money' ? (input.currency ?? 'EUR') : null,
77
+ pricing: input.pricing ?? input.carrySpend?.pricing ?? { model: 'per_call' },
78
+ surface: input.surface ?? input.carrySpend?.surface ?? null,
79
+ budget: {
80
+ capUnits: input.capUnits ?? null,
81
+ spentUnits: input.carrySpend?.budget.spentUnits ?? 0,
82
+ calls: input.carrySpend?.budget.calls ?? 0,
83
+ },
84
+ rakePercent: input.rakePercent ?? null,
85
+ contractRef: input.contractRef,
86
+ escrowParty: input.escrowParty ?? null,
87
+ state: 'active',
88
+ createdAt: input.carrySpend?.createdAt || now,
89
+ createdBy: input.carrySpend?.createdBy || input.createdBy,
90
+ updatedAt: now,
91
+ };
92
+ await persist(storage, value);
93
+ return value;
94
+ }
95
+ /**
96
+ * Authorize a single metered call and record its spend against the budget.
97
+ *
98
+ * Returns `{ ok: true, entitlement }` when the entitlement is `active` and the (money) price fits under the
99
+ * remaining cap; the caller (the G2 gateway) then executes and settles. The budget counter is incremented
100
+ * here so an exhausted entitlement flips to `exhausted` and stops authorising.
101
+ *
102
+ * CONCURRENCY: this is a read-modify-write on a memory record — under heavy simultaneous calls on the SAME
103
+ * entitlement the cap can be marginally overshot. The cap is an *authorization ceiling*, not a fund gate:
104
+ * every actual payment still moves through the atomic debit/credit settle path per call, so no funds are
105
+ * lost — only the ceiling can be exceeded by a few in-flight calls. A dedicated atomic counter (or table)
106
+ * is deferred to G5. The per-call price is read from the entitlement itself (`pricePerCall`, in its `unit`).
107
+ */
108
+ export async function authorizeAndCharge(storage, consumerGaii, ext, action) {
109
+ const ent = await readEntitlementForCall(storage, consumerGaii, ext, action);
110
+ if (!ent)
111
+ return { ok: false, reason: 'no_entitlement' };
112
+ if (ent.state !== 'active')
113
+ return { ok: false, reason: ent.state }; // paused | exhausted | revoked
114
+ const price = Math.max(0, ent.pricePerCall);
115
+ const nextSpent = ent.budget.spentUnits + price;
116
+ if (ent.budget.capUnits !== null && nextSpent > ent.budget.capUnits) {
117
+ // Freeze it so the surface reflects the exhaustion; this call is denied.
118
+ if (ent.state === 'active') {
119
+ ent.state = 'exhausted';
120
+ ent.updatedAt = new Date().toISOString();
121
+ await persist(storage, ent);
122
+ }
123
+ return { ok: false, reason: 'budget_exhausted' };
124
+ }
125
+ ent.budget.spentUnits = nextSpent;
126
+ ent.budget.calls += 1;
127
+ if (ent.budget.capUnits !== null && nextSpent >= ent.budget.capUnits)
128
+ ent.state = 'exhausted';
129
+ ent.updatedAt = new Date().toISOString();
130
+ await persist(storage, ent);
131
+ return { ok: true, entitlement: ent };
132
+ }
133
+ /**
134
+ * Compute what THIS call costs + the advanced pricing state, per the entitlement's pricing model. Pure —
135
+ * no mutation, no I/O (`nowMs` is passed in so it stays testable). The gate uses the result to check the
136
+ * budget, settle `chargeUnits`, and then {@link commitSpend} the advanced `pricing`. `allowed:false` means
137
+ * the call is refused without charge (a subscription rate-limit window is full).
138
+ */
139
+ export function computeCharge(ent, nowMs) {
140
+ const p = ent.pricing ?? { model: 'per_call' };
141
+ if (p.model === 'bundle') {
142
+ if (p.callsRemaining > 0) {
143
+ return { allowed: true, chargeUnits: 0, pricing: { ...p, callsRemaining: p.callsRemaining - 1 } };
144
+ }
145
+ // Quota drained → refill: charge one more block and consume a call from it.
146
+ return { allowed: true, chargeUnits: Math.max(0, p.blockPrice), pricing: { ...p, callsRemaining: Math.max(0, p.blockSize - 1) } };
147
+ }
148
+ if (p.model === 'subscription') {
149
+ const nowIso = new Date(nowMs).toISOString();
150
+ let validUntil = p.validUntil, windowStart = p.windowStart, windowCount = p.windowCount, charge = 0;
151
+ if (nowMs >= new Date(validUntil).getTime()) { // period expired → renew (charge the period fee)
152
+ charge = Math.max(0, p.periodPrice);
153
+ validUntil = new Date(nowMs + p.periodSeconds * 1000).toISOString();
154
+ windowStart = nowIso;
155
+ windowCount = 0;
156
+ }
157
+ if (nowMs >= new Date(windowStart).getTime() + p.windowSeconds * 1000) { // rate window rolled over
158
+ windowStart = nowIso;
159
+ windowCount = 0;
160
+ }
161
+ if (windowCount >= p.callsPerWindow) { // rate limit hit — refuse without charge
162
+ return { allowed: false, reason: 'rate_limited', chargeUnits: 0, pricing: { ...p, validUntil, windowStart, windowCount } };
163
+ }
164
+ return { allowed: true, chargeUnits: charge, pricing: { ...p, validUntil, windowStart, windowCount: windowCount + 1 } };
165
+ }
166
+ return { allowed: true, chargeUnits: Math.max(0, ent.pricePerCall), pricing: { model: 'per_call' } };
167
+ }
168
+ /** Peek: would a charge of `chargeUnits` fit under the cap right now? (No mutation — the G2 gate checks this
169
+ * BEFORE moving money, then calls {@link commitSpend} only after settlement succeeds, so a failed debit
170
+ * never leaves a phantom spend.) */
171
+ export function budgetAllows(ent, chargeUnits) {
172
+ if (ent.state !== 'active')
173
+ return false;
174
+ return ent.budget.capUnits === null || ent.budget.spentUnits + Math.max(0, chargeUnits) <= ent.budget.capUnits;
175
+ }
176
+ /** Commit one call AFTER settlement succeeded: add `chargeUnits` to spend, bump calls, advance the pricing
177
+ * state, flip to `exhausted` at the cap. (Read-modify-write — see the concurrency note on {@link authorizeAndCharge}.) */
178
+ export async function commitSpend(storage, ent, chargeUnits, pricing) {
179
+ ent.budget.spentUnits += Math.max(0, chargeUnits);
180
+ ent.budget.calls += 1;
181
+ if (pricing)
182
+ ent.pricing = pricing;
183
+ if (ent.budget.capUnits !== null && ent.budget.spentUnits >= ent.budget.capUnits)
184
+ ent.state = 'exhausted';
185
+ ent.updatedAt = new Date().toISOString();
186
+ await persist(storage, ent);
187
+ return ent;
188
+ }
189
+ /** Roll back one call's spend by `chargeUnits` (the gate calls this when the sandbox script throws AFTER
190
+ * settlement, in lockstep with the money refund). Floors at 0 and un-exhausts if this frees headroom. Does
191
+ * NOT rewind the pricing quota/window (a thrown call still consumed its slot — conservative). No-op if gone. */
192
+ export async function refundSpend(storage, consumerGaii, ext, action, chargeUnits) {
193
+ const e = await readEntitlementForCall(storage, consumerGaii, ext, action);
194
+ if (!e)
195
+ return;
196
+ e.budget.spentUnits = Math.max(0, e.budget.spentUnits - Math.max(0, chargeUnits));
197
+ e.budget.calls = Math.max(0, e.budget.calls - 1);
198
+ if (e.state === 'exhausted' && (e.budget.capUnits === null || e.budget.spentUnits < e.budget.capUnits)) {
199
+ e.state = 'active';
200
+ }
201
+ e.updatedAt = new Date().toISOString();
202
+ await persist(storage, e);
203
+ }
204
+ /** Pause (owner off-switch) — stops authorising without losing the record/spend history. */
205
+ export async function pauseEntitlement(storage, consumerGaii, ext, action) {
206
+ return flip(storage, consumerGaii, ext, action, 'paused');
207
+ }
208
+ /** Revoke — terminal; the entitlement no longer authorises and must be re-minted to resume. */
209
+ export async function revokeEntitlement(storage, consumerGaii, ext, action) {
210
+ return flip(storage, consumerGaii, ext, action, 'revoked');
211
+ }
212
+ async function flip(storage, consumerGaii, ext, action, state) {
213
+ const ent = await readEntitlementForCall(storage, consumerGaii, ext, action);
214
+ if (!ent)
215
+ return false;
216
+ ent.state = state;
217
+ ent.updatedAt = new Date().toISOString();
218
+ await persist(storage, ent);
219
+ return true;
220
+ }
221
+ async function persist(storage, value) {
222
+ await storage.setMemory({
223
+ key: entitlementKey(value.consumerGaii, value.ext, value.action),
224
+ ownerGaii: NS,
225
+ value,
226
+ visibility: 'private',
227
+ tags: ['metered-entitlement'],
228
+ ttlHours: null,
229
+ version: 1,
230
+ createdAt: value.createdAt,
231
+ updatedAt: value.updatedAt,
232
+ });
233
+ }
234
+ /**
235
+ * Archive a copy of an entitlement to history (append-only) before the live record is overwritten by a
236
+ * renegotiation (supersede) — so the old terms + final spend/period survive for the "past contracts" view.
237
+ * Does NOT touch the live record. The `from → to` period is `createdAt → archivedAt`.
238
+ */
239
+ export async function archiveEntitlement(storage, ent, reason, proposalId) {
240
+ const now = new Date().toISOString();
241
+ const archivedId = randomUUID();
242
+ const entry = {
243
+ ...ent, archivedId, archivedAt: now, archiveReason: reason, supersededByProposal: proposalId ?? null,
244
+ };
245
+ await storage.setMemory({
246
+ key: `me-hist.${archivedId}`, ownerGaii: NS_HISTORY, value: entry,
247
+ visibility: 'private', tags: ['metered-entitlement-history'], ttlHours: null, version: 1, createdAt: now, updatedAt: now,
248
+ });
249
+ }
250
+ /** Past (archived) contracts a consumer held — newest first. */
251
+ export async function listEntitlementHistoryByConsumer(storage, consumerGaii) {
252
+ const { items } = await storage.listAllMemory({ prefix: 'me-hist.', limit: 5000 });
253
+ return items.map(r => r.value)
254
+ .filter(v => v && v.archivedId && v.consumerGaii === consumerGaii)
255
+ .sort((a, b) => (a.archivedAt < b.archivedAt ? 1 : -1));
256
+ }
257
+ /** Past (archived) contracts a provider sold — newest first. */
258
+ export async function listEntitlementHistoryByProvider(storage, providerGhii) {
259
+ const { items } = await storage.listAllMemory({ prefix: 'me-hist.', limit: 5000 });
260
+ return items.map(r => r.value)
261
+ .filter(v => v && v.archivedId && v.providerGhii === providerGhii)
262
+ .sort((a, b) => (a.archivedAt < b.archivedAt ? 1 : -1));
263
+ }
264
+ //# sourceMappingURL=metered-entitlements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metered-entitlements.js","sourceRoot":"","sources":["../../../src/services/metered-entitlements.ts"],"names":[],"mappings":"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"}
@@ -41,6 +41,13 @@ export type NotifAction = {
41
41
  /** Same-node path guard for an action endpoint/link ('/...' only — never '//host' or a full URL). */
42
42
  export declare function isSafeNotifActionEndpoint(path: unknown): path is string;
43
43
  export declare function setNotifyPushService(push: PushService | null): void;
44
+ /**
45
+ * Delete the recipient's bell notifications that deep-link to a given conversation — called when they
46
+ * open/read that thread, so a message they've now seen stops nagging from the header bell. Matches both
47
+ * the delivered-message link (#inbox/<id>) and the "wants to message you" request link (#inbox/req:<id>).
48
+ * Best-effort: never throws into the caller. Returns the number removed (0 if none / on any error).
49
+ */
50
+ export declare function dismissConversationNotifications(storage: Storage, recipientGhii: string, conversationId: string): Promise<number>;
44
51
  export interface NotifyInput {
45
52
  /** Machine type, e.g. 'workspace_access_request' | 'workspace_access_approved'. */
46
53
  type: string;
@@ -1 +1 @@
1
- {"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../../src/services/notify.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,eAAO,MAAM,YAAY,WAAW,CAAC;AAErC,wFAAwF;AACxF,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC,sFAAsF;AACtF,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEhE;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,gBAAgB,CAAA;CAAE,GACvF;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,gBAAgB,CAAA;CAAE,GAC/I;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAEnL,qGAAqG;AACrG,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,MAAM,CAEvE;AAID,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAEnE;AAED,MAAM,WAAW,WAAW;IAC1B,mFAAmF;IACnF,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0FAA0F;IAC1F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCvG"}
1
+ {"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../../src/services/notify.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,eAAO,MAAM,YAAY,WAAW,CAAC;AAErC,wFAAwF;AACxF,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC,sFAAsF;AACtF,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEhE;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,gBAAgB,CAAA;CAAE,GACvF;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,gBAAgB,CAAA;CAAE,GAC/I;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAEnL,qGAAqG;AACrG,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,MAAM,CAEvE;AAID,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAEnE;AAED;;;;;GAKG;AACH,wBAAsB,gCAAgC,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBvI;AAED,MAAM,WAAW,WAAW;IAC1B,mFAAmF;IACnF,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0FAA0F;IAC1F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCvG"}
@@ -9,6 +9,8 @@
9
9
  * browser push (best-effort) whose click deep-links to the same target as the bell entry.
10
10
  * @structure
11
11
  * - notify(storage, recipientGhii, { type, title, body?, link?, actions? })
12
+ * - dismissConversationNotifications(storage, recipientGhii, conversationId) — delete the bell
13
+ * notifications deep-linking to a conversation once its owner has read that thread
12
14
  * - setNotifyPushService(push) — wired once at boot so notify() can bridge to web push
13
15
  * - notifLinkToUrl(link) — bell link vocabulary ('/v1/profile#inbox/<id>') → openable URL
14
16
  * - NotifAction — an inline action a notification carries (reply | api | navigate), rendered as a
@@ -23,6 +25,9 @@
23
25
  * v1.1.0 -- 2026-07-02 -- Bridge bell notifications to web push with deep-link URL translation.
24
26
  * v1.2.0 -- 2026-07-18 -- Inline notification actions (reply/api/navigate); mirror up to two into
25
27
  * the web-push payload so the SW can offer OS-level action buttons.
28
+ * v1.3.0 -- 2026-07-21 -- dismissConversationNotifications(): reading a DM thread deletes its bell
29
+ * notifications (delivered #inbox/<id> + request #inbox/req:<id> links) so a seen message stops
30
+ * lingering in the header bell. Called from POST /v1/messages/conversations/:id/read.
26
31
  */
27
32
  import { randomUUID } from 'node:crypto';
28
33
  export const NOTIF_PREFIX = 'notif.';
@@ -38,6 +43,36 @@ let pushService = null;
38
43
  export function setNotifyPushService(push) {
39
44
  pushService = push;
40
45
  }
46
+ /**
47
+ * Delete the recipient's bell notifications that deep-link to a given conversation — called when they
48
+ * open/read that thread, so a message they've now seen stops nagging from the header bell. Matches both
49
+ * the delivered-message link (#inbox/<id>) and the "wants to message you" request link (#inbox/req:<id>).
50
+ * Best-effort: never throws into the caller. Returns the number removed (0 if none / on any error).
51
+ */
52
+ export async function dismissConversationNotifications(storage, recipientGhii, conversationId) {
53
+ if (!conversationId)
54
+ return 0;
55
+ try {
56
+ const links = new Set([`/v1/profile#inbox/${conversationId}`, `/v1/profile#inbox/req:${conversationId}`]);
57
+ const mine = await storage.listMemory(recipientGhii, { prefix: NOTIF_PREFIX });
58
+ const refs = mine
59
+ .filter(r => { const v = r.value; return !!v && typeof v.link === 'string' && links.has(v.link); })
60
+ .map(r => ({ ownerGaii: recipientGhii, key: r.key }));
61
+ if (!refs.length)
62
+ return 0;
63
+ if (storage.bulkDeleteMemory)
64
+ return await storage.bulkDeleteMemory(refs);
65
+ let removed = 0;
66
+ for (const ref of refs) {
67
+ if (await storage.deleteMemory(ref.ownerGaii, ref.key))
68
+ removed++;
69
+ }
70
+ return removed;
71
+ }
72
+ catch {
73
+ return 0;
74
+ }
75
+ }
41
76
  /**
42
77
  * Translate a bell-vocabulary link into a URL that opens correctly from a cold start (push
43
78
  * notification click, new window). The bell's '/v1/profile#<tab>[/<rest>]' hash form only works
@@ -1 +1 @@
1
- {"version":3,"file":"notify.js","sourceRoot":"","sources":["../../../src/services/notify.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"notify.js","sourceRoot":"","sources":["../../../src/services/notify.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,8 @@
9
9
  * @structure
10
10
  * - listOwnerScopeMemory(storage, nodeId, ownerName, opts) — aggregated list (deduped, GHII-first)
11
11
  * - getOwnerScopeMemory(storage, nodeId, ownerName, key) — one key across owner+agents (GHII-first)
12
+ * - getOwnerScopePublicMemory(storage, nodeId, ownerName, key) — first PUBLIC record for a key across
13
+ * owner+agents (GHII-first); a non-public record never shadows a public one (anonymous serve paths)
12
14
  * @usage import { listOwnerScopeMemory, getOwnerScopeMemory } from '../services/owner-memory.js';
13
15
  * @version-history
14
16
  * v1.0.0 — 2026-06-13 — Extracted from routes/memory.ts owner-scope branch; reused by the workflow
@@ -16,6 +18,9 @@
16
18
  * v1.1.0 — 2026-06-14 — Fold the owner's ecosystem apps (GEAIs) into the owner-scope union
17
19
  * (ecosystem-apps foundation, chunk 1).
18
20
  * v1.2.0 — 2026-07-14 — Add listOwnerScopeMemoryMeta (value-free owner-scope listing) for ?include=meta.
21
+ * v1.3.0 — 2026-07-21 — Add getOwnerScopePublicMemory so anonymous public-serve paths (agent face) can
22
+ * resolve a record an owner's AGENT published under its own GAII — a non-public record never shadows
23
+ * a public one on the same key.
19
24
  */
20
25
  import type { Storage, MemoryRecord } from '../storage/interface.js';
21
26
  import type { MemoryMetaRow } from '../storage/repositories/memory.repository.js';
@@ -41,4 +46,15 @@ export declare function listOwnerScopeMemory(storage: Storage, nodeId: string, o
41
46
  export declare function listOwnerScopeMemoryMeta(storage: Storage, nodeId: string, ownerName: string, opts?: OwnerScopeListOpts): Promise<MemoryMetaRow[]>;
42
47
  /** Read ONE key across the owner's GHII + all the owner's agents (GHII first). null if found nowhere. */
43
48
  export declare function getOwnerScopeMemory(storage: Storage, nodeId: string, ownerName: string, key: string): Promise<MemoryRecord | null>;
49
+ /**
50
+ * Read the first PUBLIC record for an exact key across the owner's GHII + all the owner's agents + eco
51
+ * apps, GHII-first. Unlike {@link getOwnerScopeMemory}, a NON-public record on the same key never
52
+ * shadows a public one — so this must NOT short-circuit on the GHII copy (a private GHII record must not
53
+ * hide a public agent record). One query across the whole union, then filter to `visibility === 'public'`
54
+ * and pick the highest-priority (GHII-first) survivor. null if no public copy exists anywhere.
55
+ *
56
+ * Used by anonymous public-serve paths (the Agent Face) where only `visibility:'public'` is servable and
57
+ * an owner's agent may have written the record under its own GAII (memory is keyed by the writer).
58
+ */
59
+ export declare function getOwnerScopePublicMemory(storage: Storage, nodeId: string, ownerName: string, key: string): Promise<MemoryRecord | null>;
44
60
  //# sourceMappingURL=owner-memory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"owner-memory.d.ts","sourceRoot":"","sources":["../../../src/services/owner-memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAElF,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,yBAAyB,EAAE,aAAa,CAAC;CAC5D;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAC7E,OAAO,CAAC,YAAY,EAAE,CAAC,CAWzB;AAcD;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAC7E,OAAO,CAAC,aAAa,EAAE,CAAC,CAQ1B;AAED,yGAAyG;AACzG,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAC/D,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAiB9B"}
1
+ {"version":3,"file":"owner-memory.d.ts","sourceRoot":"","sources":["../../../src/services/owner-memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAElF,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,yBAAyB,EAAE,aAAa,CAAC;CAC5D;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAC7E,OAAO,CAAC,YAAY,EAAE,CAAC,CAWzB;AAcD;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAC7E,OAAO,CAAC,aAAa,EAAE,CAAC,CAQ1B;AAED,yGAAyG;AACzG,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAC/D,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAiB9B;AAED;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAC/D,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAW9B"}
@@ -68,4 +68,27 @@ export async function getOwnerScopeMemory(storage, nodeId, ownerName, key) {
68
68
  rows.sort((a, b) => (priority.get(a.ownerGaii) ?? others.length) - (priority.get(b.ownerGaii) ?? others.length));
69
69
  return rows[0];
70
70
  }
71
+ /**
72
+ * Read the first PUBLIC record for an exact key across the owner's GHII + all the owner's agents + eco
73
+ * apps, GHII-first. Unlike {@link getOwnerScopeMemory}, a NON-public record on the same key never
74
+ * shadows a public one — so this must NOT short-circuit on the GHII copy (a private GHII record must not
75
+ * hide a public agent record). One query across the whole union, then filter to `visibility === 'public'`
76
+ * and pick the highest-priority (GHII-first) survivor. null if no public copy exists anywhere.
77
+ *
78
+ * Used by anonymous public-serve paths (the Agent Face) where only `visibility:'public'` is servable and
79
+ * an owner's agent may have written the record under its own GAII (memory is keyed by the writer).
80
+ */
81
+ export async function getOwnerScopePublicMemory(storage, nodeId, ownerName, key) {
82
+ const ownerGhii = `${ownerName}@${nodeId}`;
83
+ const agents = await storage.getAgentsByOwner(ownerName);
84
+ const ecoApps = await storage.getEcosystemAppsByOwner(ownerName);
85
+ const identities = [ownerGhii, ...agents.map(a => a.gaii), ...ecoApps.map(e => e.geai)];
86
+ const rows = (await storage.listMemoryForOwners(identities, { prefix: key, visibility: 'public' }))
87
+ .filter(r => r.key === key);
88
+ if (!rows.length)
89
+ return null;
90
+ const priority = new Map(identities.map((id, i) => [id, i]));
91
+ rows.sort((a, b) => (priority.get(a.ownerGaii) ?? identities.length) - (priority.get(b.ownerGaii) ?? identities.length));
92
+ return rows[0];
93
+ }
71
94
  //# sourceMappingURL=owner-memory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"owner-memory.js","sourceRoot":"","sources":["../../../src/services/owner-memory.ts"],"names":[],"mappings":"AA8BA;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAgB,EAAE,MAAc,EAAE,SAAiB,EAAE,IAAyB;IAE9E,MAAM,SAAS,GAAG,GAAG,SAAS,IAAI,MAAM,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;IACjE,iGAAiG;IACjG,mGAAmG;IACnG,gDAAgD;IAChD,MAAM,UAAU,GAAG,CAAC,SAAS,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACxF,mGAAmG;IACnG,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACjE,OAAO,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAC1C,CAAC;AAED;;wEAEwE;AACxE,SAAS,cAAc,CAA+C,IAAS,EAAE,UAAoB;IACnG,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7I,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAQ,EAAE,CAAC;IACpB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;IAAC,CAAC;IACnF,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAgB,EAAE,MAAc,EAAE,SAAiB,EAAE,IAAyB;IAE9E,MAAM,SAAS,GAAG,GAAG,SAAS,IAAI,MAAM,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,CAAC,SAAS,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACxF,4EAA4E;IAC5E,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,uBAAuB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACrE,OAAO,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAC1C,CAAC;AAED,yGAAyG;AACzG,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAgB,EAAE,MAAc,EAAE,SAAiB,EAAE,GAAW;IAEhE,MAAM,SAAS,GAAG,GAAG,SAAS,IAAI,MAAM,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACrD,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IACtB,qGAAqG;IACrG,qGAAqG;IACrG,uGAAuG;IACvG,sEAAsE;IACtE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACzE,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,mBAAmB,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IACrG,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACjH,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"owner-memory.js","sourceRoot":"","sources":["../../../src/services/owner-memory.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,10 @@
1
1
  import type { AimeatConfig } from '../config.js';
2
2
  import type { Storage, GHIIRecord, OwnerRecord } from '../storage/interface.js';
3
+ /** Thrown by provisionOwner when the requested verified email is already bound to another account.
4
+ * Callers map it to a 409 EMAIL_TAKEN. */
5
+ export declare class ProvisionEmailTakenError extends Error {
6
+ constructor(message: string);
7
+ }
3
8
  export interface ProvisionOwnerOpts {
4
9
  /** Bare owner name (already validated + confirmed free by the caller). */
5
10
  username: string;
@@ -1 +1 @@
1
- {"version":3,"file":"owner-provisioning.d.ts","sourceRoot":"","sources":["../../../src/services/owner-provisioning.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAQhF,MAAM,WAAW,kBAAkB;IACjC,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,wFAAwF;IACxF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yGAAyG;IACzG,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,kGAAkG;IAClG,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,UAAU,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,gBAAgB,CAAC,CAyD3B"}
1
+ {"version":3,"file":"owner-provisioning.d.ts","sourceRoot":"","sources":["../../../src/services/owner-provisioning.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAQhF;2CAC2C;AAC3C,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,wFAAwF;IACxF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yGAAyG;IACzG,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,kGAAkG;IAClG,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,UAAU,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,gBAAgB,CAAC,CAqE3B"}
@@ -5,9 +5,12 @@
5
5
  * profile (optionally with a password hash, a verified email, and/or a linked external identity),
6
6
  * and records the welcome-bonus transaction. Used by the OIDC signup finalize path and the email
7
7
  * invitation accept path so account creation stays identical across entry points.
8
- * @structure ProvisionOwnerOpts / ProvisionedOwner; provisionOwner(storage, config, opts).
8
+ * @structure ProvisionEmailTakenError; ProvisionOwnerOpts / ProvisionedOwner; provisionOwner(storage, config, opts).
9
9
  * @usage const { owner, ghii } = await provisionOwner(storage, config, { username, displayName, passwordHash });
10
10
  * @version-history
11
+ * v1.1.0 — 2026-07-19 — Enforce one-verified-email-per-account-per-node: reject a verifiedEmail already
12
+ * bound elsewhere BEFORE creating any rows (ProvisionEmailTakenError), so the DB-unique emailHash can
13
+ * never leave a dangling owner.
11
14
  * v1.0.0 — 2026-07-04 — Extracted from oauth-login.createOwnerForProvider + /v1/ghii register, for
12
15
  * reuse by the email-invitation accept flow.
13
16
  */
@@ -17,6 +20,11 @@ import { generateKeyPair } from '../auth/keypair.js';
17
20
  function emailHashOf(email) {
18
21
  return createHash('sha256').update(email.toLowerCase().trim()).digest('hex');
19
22
  }
23
+ /** Thrown by provisionOwner when the requested verified email is already bound to another account.
24
+ * Callers map it to a 409 EMAIL_TAKEN. */
25
+ export class ProvisionEmailTakenError extends Error {
26
+ constructor(message) { super(message); this.name = 'ProvisionEmailTakenError'; }
27
+ }
20
28
  /**
21
29
  * Create a fresh owner + GHII with the welcome bonus. The caller MUST have already validated that
22
30
  * `username` is a valid, free owner name. Promotes the account to operator when it is the first real
@@ -25,6 +33,16 @@ function emailHashOf(email) {
25
33
  export async function provisionOwner(storage, config, opts) {
26
34
  const { username, displayName } = opts;
27
35
  const now = new Date().toISOString();
36
+ // One-email-per-account-per-node: refuse to provision a verified email already bound elsewhere BEFORE
37
+ // creating any rows (the GHII's emailHash is DB-unique — creating the owner first would leave a
38
+ // dangling owner when createGHII hit the constraint). Callers surface this as a clean 4xx.
39
+ const verifiedEmail = opts.verifiedEmail ? opts.verifiedEmail.toLowerCase().trim() : null;
40
+ if (verifiedEmail) {
41
+ const taken = await storage.getGHIIByEmailHash(emailHashOf(verifiedEmail));
42
+ if (taken) {
43
+ throw new ProvisionEmailTakenError(`Email already registered to ${taken.ghii}`);
44
+ }
45
+ }
28
46
  const keyPair = await generateKeyPair();
29
47
  // First real owner becomes operator (self-heal: also promote if no operator exists anywhere).
30
48
  const allOwners = await storage.listOwners();
@@ -40,7 +58,7 @@ export async function provisionOwner(storage, config, opts) {
40
58
  roles,
41
59
  createdAt: now,
42
60
  });
43
- const verified = opts.verifiedEmail ? opts.verifiedEmail.toLowerCase().trim() : null;
61
+ const verified = verifiedEmail;
44
62
  const ghii = `${username}@${config.nodeId}`;
45
63
  const ghiiRecord = await storage.createGHII({
46
64
  username,
@@ -1 +1 @@
1
- {"version":3,"file":"owner-provisioning.js","sourceRoot":"","sources":["../../../src/services/owner-provisioning.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"owner-provisioning.js","sourceRoot":"","sources":["../../../src/services/owner-provisioning.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,7 @@ export declare const appMethods: {
19
19
  updateAppMeta(this: PostgresKyselyStorage, ownerGaii: string, filename: string, meta: {
20
20
  name?: string;
21
21
  description?: string;
22
+ descriptions?: Record<string, string>;
22
23
  protection?: AppProtection;
23
24
  cortex?: AppManifestCortex | null;
24
25
  }): Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"apps.d.ts","sourceRoot":"","sources":["../../../../../../src/storage/providers/postgres-kysely/methods/apps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"apps.d.ts","sourceRoot":"","sources":["../../../../../../src/storage/providers/postgres-kysely/methods/apps.ts"],"names":[],"mappings":"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"}
@@ -182,6 +182,8 @@ export const appMethods = {
182
182
  manifest.name = meta.name;
183
183
  if (meta.description !== undefined)
184
184
  manifest.description = meta.description;
185
+ if (meta.descriptions !== undefined)
186
+ manifest.descriptions = meta.descriptions;
185
187
  if (meta.protection !== undefined)
186
188
  manifest.protection = meta.protection;
187
189
  // Agent-Bundled Apps: replace the crew-def section in place (null clears it).