aimeat 2.0.0 → 2.2.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 (722) hide show
  1. package/dist/.env.example +9 -4
  2. package/dist/locales/en.json +63 -1
  3. package/dist/locales/fi.json +63 -1
  4. package/dist/public/components/LinkPreview.js +101 -0
  5. package/dist/public/components/NotificationBell.js +18 -1
  6. package/dist/public/cortex-bundled/aimeat-charts.js +158 -10
  7. package/dist/public/cortex-bundled/aimeat-charts.yaml +1 -1
  8. package/dist/public/cortex-bundled/aimeat-dag.js +515 -173
  9. package/dist/public/cortex-bundled/aimeat-dag.yaml +1 -1
  10. package/dist/public/cortex-bundled/aimeat-i18n.js +6 -1
  11. package/dist/public/cortex-bundled/aimeat-i18n.yaml +1 -1
  12. package/dist/public/cortex-bundled/aimeat-surface.js +577 -0
  13. package/dist/public/cortex-bundled/aimeat-surface.yaml +107 -0
  14. package/dist/public/cortex-bundled/aimeat-viewport.js +405 -0
  15. package/dist/public/cortex-bundled/aimeat-viewport.yaml +100 -0
  16. package/dist/public/css/theme.css +57 -7
  17. package/dist/public/css/views/admin.css +8 -1
  18. package/dist/public/css/views/app-grant.css +18 -0
  19. package/dist/public/css/views/inbox.css +47 -1
  20. package/dist/public/css/views/portfolio.css +46 -0
  21. package/dist/public/css/views/profile.css +38 -4
  22. package/dist/public/js/services/apps.js +19 -3
  23. package/dist/public/js/services/messages-ai-prompts.js +38 -0
  24. package/dist/public/js/services/messages.js +26 -4
  25. package/dist/public/js/services/notebook.js +76 -0
  26. package/dist/public/js/services/unfurl.js +43 -0
  27. package/dist/public/lib/VENDORED.md +6 -3
  28. package/dist/public/lib/aimeat-daisyui-bridge.css +39 -2
  29. package/dist/public/lib/aimeat-theme.css +538 -0
  30. package/dist/public/lib/fonts/LICENSE.md +11 -4
  31. package/dist/public/lib/fonts/fraunces-var-latin-ext.woff2 +0 -0
  32. package/dist/public/lib/fonts/fraunces-var-latin.woff2 +0 -0
  33. package/dist/public/lib/fonts/inter-var-latin-ext.woff2 +0 -0
  34. package/dist/public/lib/fonts/inter-var-latin.woff2 +0 -0
  35. package/dist/public/lib/fonts/jetbrains-mono-var-latin-ext.woff2 +0 -0
  36. package/dist/public/lib/fonts/jetbrains-mono-var-latin.woff2 +0 -0
  37. package/dist/public/lib/fonts/space-grotesk-var-latin-ext.woff2 +0 -0
  38. package/dist/public/lib/fonts/space-grotesk-var-latin.woff2 +0 -0
  39. package/dist/public/lib/samples/LICENSE.md +11 -0
  40. package/dist/public/lib/samples/bass/A1.mp3 +0 -0
  41. package/dist/public/lib/samples/bass/B2.mp3 +0 -0
  42. package/dist/public/lib/samples/bass/D2.mp3 +0 -0
  43. package/dist/public/lib/samples/bass/E1.mp3 +0 -0
  44. package/dist/public/lib/samples/bass/E3.mp3 +0 -0
  45. package/dist/public/lib/samples/bass/G2.mp3 +0 -0
  46. package/dist/public/lib/samples/epiano/C2.mp3 +0 -0
  47. package/dist/public/lib/samples/epiano/C3.mp3 +0 -0
  48. package/dist/public/lib/samples/epiano/C4.mp3 +0 -0
  49. package/dist/public/lib/samples/epiano/C5.mp3 +0 -0
  50. package/dist/public/lib/samples/epiano/C6.mp3 +0 -0
  51. package/dist/public/lib/samples/epiano/G2.mp3 +0 -0
  52. package/dist/public/lib/samples/epiano/G3.mp3 +0 -0
  53. package/dist/public/lib/samples/epiano/G4.mp3 +0 -0
  54. package/dist/public/lib/samples/epiano/G5.mp3 +0 -0
  55. package/dist/public/lib/samples/guitar-steel/A2.mp3 +0 -0
  56. package/dist/public/lib/samples/guitar-steel/A4.mp3 +0 -0
  57. package/dist/public/lib/samples/guitar-steel/B3.mp3 +0 -0
  58. package/dist/public/lib/samples/guitar-steel/D3.mp3 +0 -0
  59. package/dist/public/lib/samples/guitar-steel/E2.mp3 +0 -0
  60. package/dist/public/lib/samples/guitar-steel/E4.mp3 +0 -0
  61. package/dist/public/lib/samples/guitar-steel/E5.mp3 +0 -0
  62. package/dist/public/lib/samples/guitar-steel/G3.mp3 +0 -0
  63. package/dist/public/lib/samples/organ/C2.mp3 +0 -0
  64. package/dist/public/lib/samples/organ/C3.mp3 +0 -0
  65. package/dist/public/lib/samples/organ/C4.mp3 +0 -0
  66. package/dist/public/lib/samples/organ/C5.mp3 +0 -0
  67. package/dist/public/lib/samples/organ/C6.mp3 +0 -0
  68. package/dist/public/lib/samples/organ/G2.mp3 +0 -0
  69. package/dist/public/lib/samples/organ/G3.mp3 +0 -0
  70. package/dist/public/lib/samples/organ/G4.mp3 +0 -0
  71. package/dist/public/lib/samples/organ/G5.mp3 +0 -0
  72. package/dist/public/lib/samples/strings/C2.mp3 +0 -0
  73. package/dist/public/lib/samples/strings/C3.mp3 +0 -0
  74. package/dist/public/lib/samples/strings/C4.mp3 +0 -0
  75. package/dist/public/lib/samples/strings/C5.mp3 +0 -0
  76. package/dist/public/lib/samples/strings/C6.mp3 +0 -0
  77. package/dist/public/lib/samples/strings/G2.mp3 +0 -0
  78. package/dist/public/lib/samples/strings/G3.mp3 +0 -0
  79. package/dist/public/lib/samples/strings/G4.mp3 +0 -0
  80. package/dist/public/lib/samples/strings/G5.mp3 +0 -0
  81. package/dist/public/lib/samples/theme-check.html +92 -0
  82. package/dist/public/lib/samples/themes-boot.js +20 -0
  83. package/dist/public/lib/samples/themes.html +154 -0
  84. package/dist/public/lib/samples/themes.js +60 -0
  85. package/dist/public/lib/samples/trumpet/A3.mp3 +0 -0
  86. package/dist/public/lib/samples/trumpet/A4.mp3 +0 -0
  87. package/dist/public/lib/samples/trumpet/A5.mp3 +0 -0
  88. package/dist/public/lib/samples/trumpet/C4.mp3 +0 -0
  89. package/dist/public/lib/samples/trumpet/C5.mp3 +0 -0
  90. package/dist/public/lib/samples/trumpet/E3.mp3 +0 -0
  91. package/dist/public/lib/samples/trumpet/E4.mp3 +0 -0
  92. package/dist/public/lib/samples/trumpet/E5.mp3 +0 -0
  93. package/dist/public/spa.html +2 -0
  94. package/dist/public/views/app-grant.js +24 -4
  95. package/dist/public/views/portfolio.js +61 -6
  96. package/dist/public/views/profile/access-tab/connected-apps.js +81 -5
  97. package/dist/public/views/profile/apps-tab.js +18 -1
  98. package/dist/public/views/profile/extensions-tab.maturity.js +4 -1
  99. package/dist/public/views/profile/inbox-tab/ai-actions.js +86 -0
  100. package/dist/public/views/profile/inbox-tab/components.js +141 -10
  101. package/dist/public/views/profile/inbox-tab/helpers.js +26 -0
  102. package/dist/public/views/profile/inbox-tab/panels.js +18 -3
  103. package/dist/public/views/profile/inbox-tab/use-thread-ux.js +47 -3
  104. package/dist/public/views/profile/inbox-tab.js +46 -49
  105. package/dist/public/views/profile/landing-page.cards.js +7 -0
  106. package/dist/public/views/profile/landing-page.js +12 -1
  107. package/dist/public/views/profile/libraries-tab.js +10 -2
  108. package/dist/public/views/profile/skills-tab.js +1 -1
  109. package/dist/public/views/profile/wallet-tab.js +64 -0
  110. package/dist/public/views/public-workspace-viewer.js +1 -1
  111. package/dist/public/views/start.js +2 -1
  112. package/dist/scripts/build-sdk-libs.d.ts +16 -0
  113. package/dist/scripts/build-sdk-libs.d.ts.map +1 -0
  114. package/dist/scripts/build-sdk-libs.js +112 -0
  115. package/dist/scripts/build-sdk-libs.js.map +1 -0
  116. package/dist/scripts/check-openapi.d.ts +2 -0
  117. package/dist/scripts/check-openapi.d.ts.map +1 -0
  118. package/dist/scripts/check-openapi.js +139 -0
  119. package/dist/scripts/check-openapi.js.map +1 -0
  120. package/dist/scripts/embed-viewport.d.ts +23 -0
  121. package/dist/scripts/embed-viewport.d.ts.map +1 -0
  122. package/dist/scripts/embed-viewport.js +116 -0
  123. package/dist/scripts/embed-viewport.js.map +1 -0
  124. package/dist/src/auth/sse-domain-scopes.d.ts +50 -0
  125. package/dist/src/auth/sse-domain-scopes.d.ts.map +1 -0
  126. package/dist/src/auth/sse-domain-scopes.js +111 -0
  127. package/dist/src/auth/sse-domain-scopes.js.map +1 -0
  128. package/dist/src/cli/connect/auth.d.ts +15 -0
  129. package/dist/src/cli/connect/auth.d.ts.map +1 -1
  130. package/dist/src/cli/connect/auth.js +25 -6
  131. package/dist/src/cli/connect/auth.js.map +1 -1
  132. package/dist/src/cli/connect/keychain.d.ts +9 -0
  133. package/dist/src/cli/connect/keychain.d.ts.map +1 -1
  134. package/dist/src/cli/connect/keychain.js +21 -8
  135. package/dist/src/cli/connect/keychain.js.map +1 -1
  136. package/dist/src/cli/connect/mcp/tools/agent-tasks.d.ts.map +1 -1
  137. package/dist/src/cli/connect/mcp/tools/agent-tasks.js +4 -1
  138. package/dist/src/cli/connect/mcp/tools/agent-tasks.js.map +1 -1
  139. package/dist/src/cli/connect/mcp/tools/core.d.ts.map +1 -1
  140. package/dist/src/cli/connect/mcp/tools/core.js +14 -3
  141. package/dist/src/cli/connect/mcp/tools/core.js.map +1 -1
  142. package/dist/src/cli/connect/mcp/tools/exchange.d.ts +18 -0
  143. package/dist/src/cli/connect/mcp/tools/exchange.d.ts.map +1 -0
  144. package/dist/src/cli/connect/mcp/tools/exchange.js +170 -0
  145. package/dist/src/cli/connect/mcp/tools/exchange.js.map +1 -0
  146. package/dist/src/cli/connect/mcp/tools/index.d.ts.map +1 -1
  147. package/dist/src/cli/connect/mcp/tools/index.js +2 -0
  148. package/dist/src/cli/connect/mcp/tools/index.js.map +1 -1
  149. package/dist/src/cli/connect/mcp/tools/workspaces.d.ts +3 -0
  150. package/dist/src/cli/connect/mcp/tools/workspaces.d.ts.map +1 -1
  151. package/dist/src/cli/connect/mcp/tools/workspaces.js +4 -2
  152. package/dist/src/cli/connect/mcp/tools/workspaces.js.map +1 -1
  153. package/dist/src/cli/connect/tool-call-defs-core.d.ts.map +1 -1
  154. package/dist/src/cli/connect/tool-call-defs-core.js +13 -1
  155. package/dist/src/cli/connect/tool-call-defs-core.js.map +1 -1
  156. package/dist/src/cli/connect/tool-call-defs-exchange.d.ts +3 -0
  157. package/dist/src/cli/connect/tool-call-defs-exchange.d.ts.map +1 -0
  158. package/dist/src/cli/connect/tool-call-defs-exchange.js +146 -0
  159. package/dist/src/cli/connect/tool-call-defs-exchange.js.map +1 -0
  160. package/dist/src/cli/connect/tool-call.d.ts.map +1 -1
  161. package/dist/src/cli/connect/tool-call.js +2 -0
  162. package/dist/src/cli/connect/tool-call.js.map +1 -1
  163. package/dist/src/commerce/__tests__/x402-registry.test.d.ts +2 -0
  164. package/dist/src/commerce/__tests__/x402-registry.test.d.ts.map +1 -0
  165. package/dist/src/commerce/__tests__/x402-registry.test.js +105 -0
  166. package/dist/src/commerce/__tests__/x402-registry.test.js.map +1 -0
  167. package/dist/src/commerce/evm-address.d.ts +21 -0
  168. package/dist/src/commerce/evm-address.d.ts.map +1 -0
  169. package/dist/src/commerce/evm-address.js +94 -0
  170. package/dist/src/commerce/evm-address.js.map +1 -0
  171. package/dist/src/commerce/money.d.ts +18 -5
  172. package/dist/src/commerce/money.d.ts.map +1 -1
  173. package/dist/src/commerce/money.js +27 -6
  174. package/dist/src/commerce/money.js.map +1 -1
  175. package/dist/src/commerce/session-service.d.ts +14 -0
  176. package/dist/src/commerce/session-service.d.ts.map +1 -1
  177. package/dist/src/commerce/session-service.js +1 -1
  178. package/dist/src/commerce/session-service.js.map +1 -1
  179. package/dist/src/commerce/x402-facilitator.d.ts +64 -13
  180. package/dist/src/commerce/x402-facilitator.d.ts.map +1 -1
  181. package/dist/src/commerce/x402-facilitator.js +71 -19
  182. package/dist/src/commerce/x402-facilitator.js.map +1 -1
  183. package/dist/src/commerce/x402-handler.d.ts +13 -7
  184. package/dist/src/commerce/x402-handler.d.ts.map +1 -1
  185. package/dist/src/commerce/x402-handler.js +23 -10
  186. package/dist/src/commerce/x402-handler.js.map +1 -1
  187. package/dist/src/commerce/x402.d.ts +11 -6
  188. package/dist/src/commerce/x402.d.ts.map +1 -1
  189. package/dist/src/commerce/x402.js +10 -7
  190. package/dist/src/commerce/x402.js.map +1 -1
  191. package/dist/src/config-types.d.ts +12 -0
  192. package/dist/src/config-types.d.ts.map +1 -1
  193. package/dist/src/config.d.ts.map +1 -1
  194. package/dist/src/config.js +8 -0
  195. package/dist/src/config.js.map +1 -1
  196. package/dist/src/data/app-templates/shells.d.ts +15 -3
  197. package/dist/src/data/app-templates/shells.d.ts.map +1 -1
  198. package/dist/src/data/app-templates/shells.js +97 -12
  199. package/dist/src/data/app-templates/shells.js.map +1 -1
  200. package/dist/src/data/app-templates.js +2 -2
  201. package/dist/src/data/app-templates.js.map +1 -1
  202. package/dist/src/data/appdev-pitfalls.d.ts +2 -0
  203. package/dist/src/data/appdev-pitfalls.d.ts.map +1 -1
  204. package/dist/src/data/appdev-pitfalls.js +24 -1
  205. package/dist/src/data/appdev-pitfalls.js.map +1 -1
  206. package/dist/src/data/library-packs/cortex.d.ts.map +1 -1
  207. package/dist/src/data/library-packs/cortex.js +108 -5
  208. package/dist/src/data/library-packs/cortex.js.map +1 -1
  209. package/dist/src/data/library-packs/sdk.d.ts.map +1 -1
  210. package/dist/src/data/library-packs/sdk.js +32 -8
  211. package/dist/src/data/library-packs/sdk.js.map +1 -1
  212. package/dist/src/data/library-packs/vendored.d.ts.map +1 -1
  213. package/dist/src/data/library-packs/vendored.js +83 -6
  214. package/dist/src/data/library-packs/vendored.js.map +1 -1
  215. package/dist/src/generated/api-types.d.ts +2039 -24
  216. package/dist/src/generated/api-types.d.ts.map +1 -1
  217. package/dist/src/mcp/agent-tasks.d.ts +4 -0
  218. package/dist/src/mcp/agent-tasks.d.ts.map +1 -1
  219. package/dist/src/mcp/agent-tasks.js +20 -2
  220. package/dist/src/mcp/agent-tasks.js.map +1 -1
  221. package/dist/src/mcp/annotations.d.ts.map +1 -1
  222. package/dist/src/mcp/annotations.js +20 -0
  223. package/dist/src/mcp/annotations.js.map +1 -1
  224. package/dist/src/mcp/apps.d.ts.map +1 -1
  225. package/dist/src/mcp/apps.js +8 -4
  226. package/dist/src/mcp/apps.js.map +1 -1
  227. package/dist/src/mcp/capabilities.d.ts +7 -1
  228. package/dist/src/mcp/capabilities.d.ts.map +1 -1
  229. package/dist/src/mcp/capabilities.js +5 -2
  230. package/dist/src/mcp/capabilities.js.map +1 -1
  231. package/dist/src/mcp/catalog/definitions/commerce.d.ts.map +1 -1
  232. package/dist/src/mcp/catalog/definitions/commerce.js +4 -2
  233. package/dist/src/mcp/catalog/definitions/commerce.js.map +1 -1
  234. package/dist/src/mcp/catalog/definitions/discovery-work-boards.d.ts.map +1 -1
  235. package/dist/src/mcp/catalog/definitions/discovery-work-boards.js +4 -3
  236. package/dist/src/mcp/catalog/definitions/discovery-work-boards.js.map +1 -1
  237. package/dist/src/mcp/catalog/definitions/exchange.d.ts +18 -0
  238. package/dist/src/mcp/catalog/definitions/exchange.d.ts.map +1 -0
  239. package/dist/src/mcp/catalog/definitions/exchange.js +182 -0
  240. package/dist/src/mcp/catalog/definitions/exchange.js.map +1 -0
  241. package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.js +1 -1
  242. package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.js.map +1 -1
  243. package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.d.ts.map +1 -1
  244. package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.js +3 -2
  245. package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.js.map +1 -1
  246. package/dist/src/mcp/catalog/definitions.d.ts.map +1 -1
  247. package/dist/src/mcp/catalog/definitions.js +2 -0
  248. package/dist/src/mcp/catalog/definitions.js.map +1 -1
  249. package/dist/src/mcp/catalog/output-schemas.d.ts +6 -1
  250. package/dist/src/mcp/catalog/output-schemas.d.ts.map +1 -1
  251. package/dist/src/mcp/catalog/output-schemas.js +6 -1
  252. package/dist/src/mcp/catalog/output-schemas.js.map +1 -1
  253. package/dist/src/mcp/catalog/scopes.d.ts.map +1 -1
  254. package/dist/src/mcp/catalog/scopes.js +22 -0
  255. package/dist/src/mcp/catalog/scopes.js.map +1 -1
  256. package/dist/src/mcp/catalog/surfaces.d.ts.map +1 -1
  257. package/dist/src/mcp/catalog/surfaces.js +14 -0
  258. package/dist/src/mcp/catalog/surfaces.js.map +1 -1
  259. package/dist/src/mcp/commerce.d.ts.map +1 -1
  260. package/dist/src/mcp/commerce.js +15 -3
  261. package/dist/src/mcp/commerce.js.map +1 -1
  262. package/dist/src/mcp/core-storage.d.ts +23 -0
  263. package/dist/src/mcp/core-storage.d.ts.map +1 -0
  264. package/dist/src/mcp/core-storage.js +157 -0
  265. package/dist/src/mcp/core-storage.js.map +1 -0
  266. package/dist/src/mcp/core.d.ts +16 -0
  267. package/dist/src/mcp/core.d.ts.map +1 -1
  268. package/dist/src/mcp/core.js +75 -119
  269. package/dist/src/mcp/core.js.map +1 -1
  270. package/dist/src/mcp/dm-messages.d.ts +4 -0
  271. package/dist/src/mcp/dm-messages.d.ts.map +1 -1
  272. package/dist/src/mcp/dm-messages.js +43 -2
  273. package/dist/src/mcp/dm-messages.js.map +1 -1
  274. package/dist/src/mcp/exchange-run.d.ts +5 -0
  275. package/dist/src/mcp/exchange-run.d.ts.map +1 -0
  276. package/dist/src/mcp/exchange-run.js +226 -0
  277. package/dist/src/mcp/exchange-run.js.map +1 -0
  278. package/dist/src/mcp/exchange.d.ts +5 -0
  279. package/dist/src/mcp/exchange.d.ts.map +1 -0
  280. package/dist/src/mcp/exchange.js +352 -0
  281. package/dist/src/mcp/exchange.js.map +1 -0
  282. package/dist/src/mcp/extensions.d.ts.map +1 -1
  283. package/dist/src/mcp/extensions.js +17 -2
  284. package/dist/src/mcp/extensions.js.map +1 -1
  285. package/dist/src/mcp/index.d.ts +5 -0
  286. package/dist/src/mcp/index.d.ts.map +1 -1
  287. package/dist/src/mcp/index.js +26 -3
  288. package/dist/src/mcp/index.js.map +1 -1
  289. package/dist/src/mcp/memory-namespace-hints.d.ts +33 -0
  290. package/dist/src/mcp/memory-namespace-hints.d.ts.map +1 -0
  291. package/dist/src/mcp/memory-namespace-hints.js +60 -0
  292. package/dist/src/mcp/memory-namespace-hints.js.map +1 -0
  293. package/dist/src/mcp/workspaces.d.ts +5 -0
  294. package/dist/src/mcp/workspaces.d.ts.map +1 -1
  295. package/dist/src/mcp/workspaces.js +5 -3
  296. package/dist/src/mcp/workspaces.js.map +1 -1
  297. package/dist/src/models/agent-task-schemas.d.ts +25 -3
  298. package/dist/src/models/agent-task-schemas.d.ts.map +1 -1
  299. package/dist/src/models/agent-task-schemas.js +16 -0
  300. package/dist/src/models/agent-task-schemas.js.map +1 -1
  301. package/dist/src/models/app-tool-schemas.d.ts +573 -2
  302. package/dist/src/models/app-tool-schemas.d.ts.map +1 -1
  303. package/dist/src/models/app-tool-schemas.js +73 -2
  304. package/dist/src/models/app-tool-schemas.js.map +1 -1
  305. package/dist/src/models/odps-schemas.d.ts +305 -0
  306. package/dist/src/models/odps-schemas.d.ts.map +1 -0
  307. package/dist/src/models/odps-schemas.js +182 -0
  308. package/dist/src/models/odps-schemas.js.map +1 -0
  309. package/dist/src/models/offer-schemas.d.ts +359 -4
  310. package/dist/src/models/offer-schemas.d.ts.map +1 -1
  311. package/dist/src/models/offer-schemas.js +37 -0
  312. package/dist/src/models/offer-schemas.js.map +1 -1
  313. package/dist/src/models/schemas.d.ts +7 -3
  314. package/dist/src/models/schemas.d.ts.map +1 -1
  315. package/dist/src/models/schemas.js +13 -1
  316. package/dist/src/models/schemas.js.map +1 -1
  317. package/dist/src/models/webhook-schemas.d.ts +8 -8
  318. package/dist/src/routes/agent-tasks/create-read.d.ts +4 -0
  319. package/dist/src/routes/agent-tasks/create-read.d.ts.map +1 -1
  320. package/dist/src/routes/agent-tasks/create-read.js +20 -1
  321. package/dist/src/routes/agent-tasks/create-read.js.map +1 -1
  322. package/dist/src/routes/agent-tasks/lifecycle.d.ts.map +1 -1
  323. package/dist/src/routes/agent-tasks/lifecycle.js +10 -0
  324. package/dist/src/routes/agent-tasks/lifecycle.js.map +1 -1
  325. package/dist/src/routes/agents/device-auth.d.ts +4 -0
  326. package/dist/src/routes/agents/device-auth.d.ts.map +1 -1
  327. package/dist/src/routes/agents/device-auth.js +19 -4
  328. package/dist/src/routes/agents/device-auth.js.map +1 -1
  329. package/dist/src/routes/agents/offers.d.ts +2 -0
  330. package/dist/src/routes/agents/offers.d.ts.map +1 -1
  331. package/dist/src/routes/agents/offers.js +0 -0
  332. package/dist/src/routes/agents/offers.js.map +1 -1
  333. package/dist/src/routes/app-grants.d.ts +12 -0
  334. package/dist/src/routes/app-grants.d.ts.map +1 -1
  335. package/dist/src/routes/app-grants.js +90 -27
  336. package/dist/src/routes/app-grants.js.map +1 -1
  337. package/dist/src/routes/apps/drafts.d.ts +3 -0
  338. package/dist/src/routes/apps/drafts.d.ts.map +1 -1
  339. package/dist/src/routes/apps/drafts.js +63 -1
  340. package/dist/src/routes/apps/drafts.js.map +1 -1
  341. package/dist/src/routes/apps/fork-manage.d.ts.map +1 -1
  342. package/dist/src/routes/apps/fork-manage.js +24 -1
  343. package/dist/src/routes/apps/fork-manage.js.map +1 -1
  344. package/dist/src/routes/apps/publish.d.ts +4 -0
  345. package/dist/src/routes/apps/publish.d.ts.map +1 -1
  346. package/dist/src/routes/apps/publish.js +44 -3
  347. package/dist/src/routes/apps/publish.js.map +1 -1
  348. package/dist/src/routes/apps-cost.d.ts +25 -0
  349. package/dist/src/routes/apps-cost.d.ts.map +1 -0
  350. package/dist/src/routes/apps-cost.js +107 -0
  351. package/dist/src/routes/apps-cost.js.map +1 -0
  352. package/dist/src/routes/commerce.d.ts.map +1 -1
  353. package/dist/src/routes/commerce.js +122 -2
  354. package/dist/src/routes/commerce.js.map +1 -1
  355. package/dist/src/routes/exchange-market.d.ts +32 -0
  356. package/dist/src/routes/exchange-market.d.ts.map +1 -0
  357. package/dist/src/routes/exchange-market.js +580 -0
  358. package/dist/src/routes/exchange-market.js.map +1 -0
  359. package/dist/src/routes/exchange.d.ts +33 -0
  360. package/dist/src/routes/exchange.d.ts.map +1 -0
  361. package/dist/src/routes/exchange.js +398 -0
  362. package/dist/src/routes/exchange.js.map +1 -0
  363. package/dist/src/routes/extensions/actions.d.ts.map +1 -1
  364. package/dist/src/routes/extensions/actions.js +18 -0
  365. package/dist/src/routes/extensions/actions.js.map +1 -1
  366. package/dist/src/routes/extensions/crud.d.ts.map +1 -1
  367. package/dist/src/routes/extensions/crud.js +36 -3
  368. package/dist/src/routes/extensions/crud.js.map +1 -1
  369. package/dist/src/routes/extensions/entitlement-gate.d.ts +33 -0
  370. package/dist/src/routes/extensions/entitlement-gate.d.ts.map +1 -0
  371. package/dist/src/routes/extensions/entitlement-gate.js +156 -0
  372. package/dist/src/routes/extensions/entitlement-gate.js.map +1 -0
  373. package/dist/src/routes/extensions/manifest.d.ts +15 -0
  374. package/dist/src/routes/extensions/manifest.d.ts.map +1 -1
  375. package/dist/src/routes/extensions/manifest.js +101 -2
  376. package/dist/src/routes/extensions/manifest.js.map +1 -1
  377. package/dist/src/routes/extensions/pacing.d.ts +31 -0
  378. package/dist/src/routes/extensions/pacing.d.ts.map +1 -0
  379. package/dist/src/routes/extensions/pacing.js +73 -0
  380. package/dist/src/routes/extensions/pacing.js.map +1 -0
  381. package/dist/src/routes/extensions/paywall.d.ts.map +1 -1
  382. package/dist/src/routes/extensions/paywall.js +20 -11
  383. package/dist/src/routes/extensions/paywall.js.map +1 -1
  384. package/dist/src/routes/federation-sync/messaging.d.ts.map +1 -1
  385. package/dist/src/routes/federation-sync/messaging.js +3 -1
  386. package/dist/src/routes/federation-sync/messaging.js.map +1 -1
  387. package/dist/src/routes/ghii/recovery.d.ts +2 -0
  388. package/dist/src/routes/ghii/recovery.d.ts.map +1 -1
  389. package/dist/src/routes/ghii/recovery.js +7 -0
  390. package/dist/src/routes/ghii/recovery.js.map +1 -1
  391. package/dist/src/routes/ghii/register-login.d.ts +4 -0
  392. package/dist/src/routes/ghii/register-login.d.ts.map +1 -1
  393. package/dist/src/routes/ghii/register-login.js +45 -22
  394. package/dist/src/routes/ghii/register-login.js.map +1 -1
  395. package/dist/src/routes/ghii/web-verify.d.ts +5 -0
  396. package/dist/src/routes/ghii/web-verify.d.ts.map +1 -1
  397. package/dist/src/routes/ghii/web-verify.js +24 -3
  398. package/dist/src/routes/ghii/web-verify.js.map +1 -1
  399. package/dist/src/routes/libs/sdk-serve.d.ts +11 -0
  400. package/dist/src/routes/libs/sdk-serve.d.ts.map +1 -0
  401. package/dist/src/routes/libs/sdk-serve.js +53 -0
  402. package/dist/src/routes/libs/sdk-serve.js.map +1 -0
  403. package/dist/src/routes/libs.d.ts +7 -1
  404. package/dist/src/routes/libs.d.ts.map +1 -1
  405. package/dist/src/routes/libs.js +65 -146
  406. package/dist/src/routes/libs.js.map +1 -1
  407. package/dist/src/routes/memory/crud.d.ts.map +1 -1
  408. package/dist/src/routes/memory/crud.js +10 -0
  409. package/dist/src/routes/memory/crud.js.map +1 -1
  410. package/dist/src/routes/messages.d.ts +3 -0
  411. package/dist/src/routes/messages.d.ts.map +1 -1
  412. package/dist/src/routes/messages.js +9 -0
  413. package/dist/src/routes/messages.js.map +1 -1
  414. package/dist/src/routes/notifications.d.ts +6 -3
  415. package/dist/src/routes/notifications.d.ts.map +1 -1
  416. package/dist/src/routes/notifications.js +32 -3
  417. package/dist/src/routes/notifications.js.map +1 -1
  418. package/dist/src/routes/organisms/crud.d.ts +3 -0
  419. package/dist/src/routes/organisms/crud.d.ts.map +1 -1
  420. package/dist/src/routes/organisms/crud.js +5 -2
  421. package/dist/src/routes/organisms/crud.js.map +1 -1
  422. package/dist/src/routes/organisms/workspace-access.d.ts.map +1 -1
  423. package/dist/src/routes/organisms/workspace-access.js +38 -20
  424. package/dist/src/routes/organisms/workspace-access.js.map +1 -1
  425. package/dist/src/routes/organisms/workspace-read.d.ts.map +1 -1
  426. package/dist/src/routes/organisms/workspace-read.js +7 -2
  427. package/dist/src/routes/organisms/workspace-read.js.map +1 -1
  428. package/dist/src/routes/public-stats.d.ts +7 -0
  429. package/dist/src/routes/public-stats.d.ts.map +1 -1
  430. package/dist/src/routes/public-stats.js +28 -7
  431. package/dist/src/routes/public-stats.js.map +1 -1
  432. package/dist/src/routes/sse.d.ts +7 -0
  433. package/dist/src/routes/sse.d.ts.map +1 -1
  434. package/dist/src/routes/sse.js +36 -6
  435. package/dist/src/routes/sse.js.map +1 -1
  436. package/dist/src/routes/storage-files.d.ts +11 -0
  437. package/dist/src/routes/storage-files.d.ts.map +1 -1
  438. package/dist/src/routes/storage-files.js +58 -51
  439. package/dist/src/routes/storage-files.js.map +1 -1
  440. package/dist/src/routes/subdomains.d.ts +4 -0
  441. package/dist/src/routes/subdomains.d.ts.map +1 -1
  442. package/dist/src/routes/subdomains.js +42 -5
  443. package/dist/src/routes/subdomains.js.map +1 -1
  444. package/dist/src/routes/unfurl.d.ts +27 -0
  445. package/dist/src/routes/unfurl.d.ts.map +1 -0
  446. package/dist/src/routes/unfurl.js +180 -0
  447. package/dist/src/routes/unfurl.js.map +1 -0
  448. package/dist/src/routes/upload.d.ts +13 -0
  449. package/dist/src/routes/upload.d.ts.map +1 -1
  450. package/dist/src/routes/upload.js +115 -28
  451. package/dist/src/routes/upload.js.map +1 -1
  452. package/dist/src/routes/webmcp.d.ts +3 -0
  453. package/dist/src/routes/webmcp.d.ts.map +1 -1
  454. package/dist/src/routes/webmcp.js +59 -0
  455. package/dist/src/routes/webmcp.js.map +1 -1
  456. package/dist/src/schemas/knowledge-package.d.ts +1 -1
  457. package/dist/src/server-bootstrap/routes-loader.d.ts +1 -0
  458. package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
  459. package/dist/src/server-bootstrap/routes-loader.js +8 -0
  460. package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
  461. package/dist/src/server-bootstrap/static-files.d.ts +4 -0
  462. package/dist/src/server-bootstrap/static-files.d.ts.map +1 -1
  463. package/dist/src/server-bootstrap/static-files.js +11 -0
  464. package/dist/src/server-bootstrap/static-files.js.map +1 -1
  465. package/dist/src/services/agent-face.d.ts +10 -2
  466. package/dist/src/services/agent-face.d.ts.map +1 -1
  467. package/dist/src/services/agent-face.js +10 -4
  468. package/dist/src/services/agent-face.js.map +1 -1
  469. package/dist/src/services/app-tool-interfaces.d.ts +37 -0
  470. package/dist/src/services/app-tool-interfaces.d.ts.map +1 -0
  471. package/dist/src/services/app-tool-interfaces.js +101 -0
  472. package/dist/src/services/app-tool-interfaces.js.map +1 -0
  473. package/dist/src/services/build-app-prompt.d.ts +22 -0
  474. package/dist/src/services/build-app-prompt.d.ts.map +1 -1
  475. package/dist/src/services/build-app-prompt.js +108 -11
  476. package/dist/src/services/build-app-prompt.js.map +1 -1
  477. package/dist/src/services/call-timing.d.ts +51 -0
  478. package/dist/src/services/call-timing.d.ts.map +1 -0
  479. package/dist/src/services/call-timing.js +91 -0
  480. package/dist/src/services/call-timing.js.map +1 -0
  481. package/dist/src/services/capability-invoke.d.ts +2 -0
  482. package/dist/src/services/capability-invoke.d.ts.map +1 -1
  483. package/dist/src/services/capability-invoke.js +10 -0
  484. package/dist/src/services/capability-invoke.js.map +1 -1
  485. package/dist/src/services/config-schema.d.ts.map +1 -1
  486. package/dist/src/services/config-schema.js +6 -0
  487. package/dist/src/services/config-schema.js.map +1 -1
  488. package/dist/src/services/contacts.d.ts +25 -1
  489. package/dist/src/services/contacts.d.ts.map +1 -1
  490. package/dist/src/services/contacts.js +30 -0
  491. package/dist/src/services/contacts.js.map +1 -1
  492. package/dist/src/services/draft-token.d.ts +22 -2
  493. package/dist/src/services/draft-token.d.ts.map +1 -1
  494. package/dist/src/services/draft-token.js +52 -3
  495. package/dist/src/services/draft-token.js.map +1 -1
  496. package/dist/src/services/entitlement-money.d.ts +55 -0
  497. package/dist/src/services/entitlement-money.d.ts.map +1 -0
  498. package/dist/src/services/entitlement-money.js +68 -0
  499. package/dist/src/services/entitlement-money.js.map +1 -0
  500. package/dist/src/services/exchange-market.d.ts +280 -0
  501. package/dist/src/services/exchange-market.d.ts.map +1 -0
  502. package/dist/src/services/exchange-market.js +276 -0
  503. package/dist/src/services/exchange-market.js.map +1 -0
  504. package/dist/src/services/exchange-odps.d.ts +58 -0
  505. package/dist/src/services/exchange-odps.d.ts.map +1 -0
  506. package/dist/src/services/exchange-odps.js +400 -0
  507. package/dist/src/services/exchange-odps.js.map +1 -0
  508. package/dist/src/services/exchange-projection.d.ts +61 -0
  509. package/dist/src/services/exchange-projection.d.ts.map +1 -0
  510. package/dist/src/services/exchange-projection.js +504 -0
  511. package/dist/src/services/exchange-projection.js.map +1 -0
  512. package/dist/src/services/exchange-proposals.d.ts +47 -0
  513. package/dist/src/services/exchange-proposals.d.ts.map +1 -0
  514. package/dist/src/services/exchange-proposals.js +73 -0
  515. package/dist/src/services/exchange-proposals.js.map +1 -0
  516. package/dist/src/services/exchange-work.d.ts +30 -0
  517. package/dist/src/services/exchange-work.d.ts.map +1 -0
  518. package/dist/src/services/exchange-work.js +43 -0
  519. package/dist/src/services/exchange-work.js.map +1 -0
  520. package/dist/src/services/extension-files.d.ts +64 -0
  521. package/dist/src/services/extension-files.d.ts.map +1 -0
  522. package/dist/src/services/extension-files.js +88 -0
  523. package/dist/src/services/extension-files.js.map +1 -0
  524. package/dist/src/services/extension-runtime.d.ts +33 -0
  525. package/dist/src/services/extension-runtime.d.ts.map +1 -1
  526. package/dist/src/services/extension-runtime.js +52 -0
  527. package/dist/src/services/extension-runtime.js.map +1 -1
  528. package/dist/src/services/file-refs.d.ts +105 -0
  529. package/dist/src/services/file-refs.d.ts.map +1 -0
  530. package/dist/src/services/file-refs.js +106 -0
  531. package/dist/src/services/file-refs.js.map +1 -0
  532. package/dist/src/services/message-send.d.ts.map +1 -1
  533. package/dist/src/services/message-send.js +4 -1
  534. package/dist/src/services/message-send.js.map +1 -1
  535. package/dist/src/services/metered-entitlements.d.ts +210 -0
  536. package/dist/src/services/metered-entitlements.d.ts.map +1 -0
  537. package/dist/src/services/metered-entitlements.js +268 -0
  538. package/dist/src/services/metered-entitlements.js.map +1 -0
  539. package/dist/src/services/notify.d.ts +7 -0
  540. package/dist/src/services/notify.d.ts.map +1 -1
  541. package/dist/src/services/notify.js +35 -0
  542. package/dist/src/services/notify.js.map +1 -1
  543. package/dist/src/services/owner-memory.d.ts +30 -1
  544. package/dist/src/services/owner-memory.d.ts.map +1 -1
  545. package/dist/src/services/owner-memory.js +31 -14
  546. package/dist/src/services/owner-memory.js.map +1 -1
  547. package/dist/src/services/owner-provisioning.d.ts +5 -0
  548. package/dist/src/services/owner-provisioning.d.ts.map +1 -1
  549. package/dist/src/services/owner-provisioning.js +20 -2
  550. package/dist/src/services/owner-provisioning.js.map +1 -1
  551. package/dist/src/services/task-files.d.ts +51 -0
  552. package/dist/src/services/task-files.d.ts.map +1 -0
  553. package/dist/src/services/task-files.js +58 -0
  554. package/dist/src/services/task-files.js.map +1 -0
  555. package/dist/src/services/upload-token.d.ts +29 -0
  556. package/dist/src/services/upload-token.d.ts.map +1 -1
  557. package/dist/src/services/upload-token.js +37 -0
  558. package/dist/src/services/upload-token.js.map +1 -1
  559. package/dist/src/services/upload-zip.d.ts +2 -0
  560. package/dist/src/services/upload-zip.d.ts.map +1 -1
  561. package/dist/src/services/upload-zip.js +5 -1
  562. package/dist/src/services/upload-zip.js.map +1 -1
  563. package/dist/src/services/workspace-meta.d.ts +15 -0
  564. package/dist/src/services/workspace-meta.d.ts.map +1 -1
  565. package/dist/src/services/workspace-meta.js +17 -0
  566. package/dist/src/services/workspace-meta.js.map +1 -1
  567. package/dist/src/services/workspace-provision.d.ts +3 -0
  568. package/dist/src/services/workspace-provision.d.ts.map +1 -1
  569. package/dist/src/services/workspace-provision.js +5 -3
  570. package/dist/src/services/workspace-provision.js.map +1 -1
  571. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.d.ts +1 -0
  572. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.d.ts.map +1 -1
  573. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.js +10 -0
  574. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.js.map +1 -1
  575. package/dist/src/storage/providers/postgres-kysely/methods/apps.d.ts +1 -0
  576. package/dist/src/storage/providers/postgres-kysely/methods/apps.d.ts.map +1 -1
  577. package/dist/src/storage/providers/postgres-kysely/methods/apps.js +2 -0
  578. package/dist/src/storage/providers/postgres-kysely/methods/apps.js.map +1 -1
  579. package/dist/src/storage/providers/postgres-kysely/methods/identity.d.ts +1 -0
  580. package/dist/src/storage/providers/postgres-kysely/methods/identity.d.ts.map +1 -1
  581. package/dist/src/storage/providers/postgres-kysely/methods/identity.js +4 -0
  582. package/dist/src/storage/providers/postgres-kysely/methods/identity.js.map +1 -1
  583. package/dist/src/storage/providers/postgres-kysely/methods/memory.d.ts +2 -0
  584. package/dist/src/storage/providers/postgres-kysely/methods/memory.d.ts.map +1 -1
  585. package/dist/src/storage/providers/postgres-kysely/methods/memory.js +12 -1
  586. package/dist/src/storage/providers/postgres-kysely/methods/memory.js.map +1 -1
  587. package/dist/src/storage/providers/postgres-kysely/methods/organisms.d.ts.map +1 -1
  588. package/dist/src/storage/providers/postgres-kysely/methods/organisms.js +5 -1
  589. package/dist/src/storage/providers/postgres-kysely/methods/organisms.js.map +1 -1
  590. package/dist/src/storage/providers/postgres-kysely/migrations/0011_unique_verified_email.sql +25 -0
  591. package/dist/src/storage/providers/postgres-kysely/migrations/0012_unique_live_app_grant.sql +29 -0
  592. package/dist/src/storage/providers/sqlite/methods/apps.d.ts +4 -0
  593. package/dist/src/storage/providers/sqlite/methods/apps.d.ts.map +1 -1
  594. package/dist/src/storage/providers/sqlite/methods/apps.js +9 -0
  595. package/dist/src/storage/providers/sqlite/methods/apps.js.map +1 -1
  596. package/dist/src/storage/providers/sqlite/methods/governance.d.ts +1 -0
  597. package/dist/src/storage/providers/sqlite/methods/governance.d.ts.map +1 -1
  598. package/dist/src/storage/providers/sqlite/methods/governance.js +4 -1
  599. package/dist/src/storage/providers/sqlite/methods/governance.js.map +1 -1
  600. package/dist/src/storage/providers/sqlite/methods/identity-nodes.d.ts +1 -0
  601. package/dist/src/storage/providers/sqlite/methods/identity-nodes.d.ts.map +1 -1
  602. package/dist/src/storage/providers/sqlite/methods/identity-nodes.js +4 -0
  603. package/dist/src/storage/providers/sqlite/methods/identity-nodes.js.map +1 -1
  604. package/dist/src/storage/providers/sqlite/methods/owner.d.ts +5 -0
  605. package/dist/src/storage/providers/sqlite/methods/owner.d.ts.map +1 -1
  606. package/dist/src/storage/providers/sqlite/methods/owner.js +8 -0
  607. package/dist/src/storage/providers/sqlite/methods/owner.js.map +1 -1
  608. package/dist/src/storage/providers/sqlite/schema.d.ts +3 -0
  609. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  610. package/dist/src/storage/providers/sqlite/schema.js +40 -0
  611. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  612. package/dist/src/storage/repositories/app-grant.repository.d.ts +9 -1
  613. package/dist/src/storage/repositories/app-grant.repository.d.ts.map +1 -1
  614. package/dist/src/storage/repositories/app.repository.d.ts +0 -0
  615. package/dist/src/storage/repositories/app.repository.d.ts.map +1 -1
  616. package/dist/src/storage/repositories/identity.repository.d.ts +6 -0
  617. package/dist/src/storage/repositories/identity.repository.d.ts.map +1 -1
  618. package/dist/src/storage/repositories/memory.repository.d.ts +14 -0
  619. package/dist/src/storage/repositories/memory.repository.d.ts.map +1 -1
  620. package/dist/src/storage/repositories-impl/memory-repository.d.ts +8 -1
  621. package/dist/src/storage/repositories-impl/memory-repository.d.ts.map +1 -1
  622. package/dist/src/storage/repositories-impl/memory-repository.js +15 -4
  623. package/dist/src/storage/repositories-impl/memory-repository.js.map +1 -1
  624. package/dist/src/storage/types/agents-messaging.d.ts +19 -0
  625. package/dist/src/storage/types/agents-messaging.d.ts.map +1 -1
  626. package/dist/src/storage/types/agents-messaging.js.map +1 -1
  627. package/dist/src/storage/types/apps.d.ts +1 -0
  628. package/dist/src/storage/types/apps.d.ts.map +1 -1
  629. package/dist/src/storage/types/organisms-federation.d.ts +50 -0
  630. package/dist/src/storage/types/organisms-federation.d.ts.map +1 -1
  631. package/dist/src/utils/app-badge.d.ts.map +1 -1
  632. package/dist/src/utils/app-badge.js +7 -3
  633. package/dist/src/utils/app-badge.js.map +1 -1
  634. package/dist/src/utils/app-mobile-lint.d.ts +17 -0
  635. package/dist/src/utils/app-mobile-lint.d.ts.map +1 -0
  636. package/dist/src/utils/app-mobile-lint.js +40 -0
  637. package/dist/src/utils/app-mobile-lint.js.map +1 -0
  638. package/dist/static/app-catalog/_template.html +18 -82
  639. package/dist/static/app-catalog/js/apps-io.js +51 -165
  640. package/dist/static/app-catalog/js/cortex.js +3 -1
  641. package/dist/static/app-catalog/js/cost.js +100 -0
  642. package/dist/static/app-catalog/js/db.js +23 -93
  643. package/dist/static/app-catalog/js/detail.js +568 -59
  644. package/dist/static/app-catalog/js/favorites.js +71 -0
  645. package/dist/static/app-catalog/js/i18n-data.js +369 -19
  646. package/dist/static/app-catalog/js/main.js +50 -139
  647. package/dist/static/app-catalog/js/migrate.js +88 -0
  648. package/dist/static/app-catalog/js/monetize.js +205 -17
  649. package/dist/static/app-catalog/js/odps.js +489 -0
  650. package/dist/static/app-catalog/js/promote.js +70 -0
  651. package/dist/static/app-catalog/js/render.js +29 -139
  652. package/dist/static/app-catalog/js/server-io.js +126 -223
  653. package/dist/static/app-catalog/js/settings.js +11 -204
  654. package/dist/static/app-catalog/js/workcopy.js +198 -0
  655. package/dist/static/app-catalog/styles/app-catalog.css +100 -0
  656. package/dist/static/app-catalog.html +2220 -1029
  657. package/dist/static/sdk-libs/_core/config.js +52 -0
  658. package/dist/static/sdk-libs/_core/http.js +52 -0
  659. package/dist/static/sdk-libs/_core/namespace.js +33 -0
  660. package/dist/static/sdk-libs/_core/sdk-globals.d.ts +50 -0
  661. package/dist/static/sdk-libs/_core/session.js +66 -0
  662. package/dist/static/sdk-libs/agentface/index.js +102 -0
  663. package/dist/static/sdk-libs/agents/index.js +305 -0
  664. package/dist/static/sdk-libs/ai/index.js +153 -0
  665. package/dist/static/sdk-libs/audio/core.js +111 -0
  666. package/dist/static/sdk-libs/audio/index.js +380 -0
  667. package/dist/static/sdk-libs/audio/instruments.js +369 -0
  668. package/dist/static/sdk-libs/auth/cluster.js +97 -0
  669. package/dist/static/sdk-libs/auth/config.js +46 -0
  670. package/dist/static/sdk-libs/auth/crypto.js +166 -0
  671. package/dist/static/sdk-libs/auth/events.js +27 -0
  672. package/dist/static/sdk-libs/auth/i18n.js +64 -0
  673. package/dist/static/sdk-libs/auth/index.js +61 -0
  674. package/dist/static/sdk-libs/auth/locale.js +151 -0
  675. package/dist/static/sdk-libs/auth/modal.js +554 -0
  676. package/dist/static/sdk-libs/auth/palette.js +172 -0
  677. package/dist/static/sdk-libs/auth/pill.js +198 -0
  678. package/dist/static/sdk-libs/auth/session.js +792 -0
  679. package/dist/static/sdk-libs/auth/signup.js +232 -0
  680. package/dist/static/sdk-libs/auth/theme.js +137 -0
  681. package/dist/static/sdk-libs/capabilities/index.js +179 -0
  682. package/dist/static/sdk-libs/commerce/index.js +243 -0
  683. package/dist/static/sdk-libs/data/index.js +250 -0
  684. package/dist/static/sdk-libs/dist/aimeat-agentface.js +91 -0
  685. package/dist/static/sdk-libs/dist/aimeat-agents.js +348 -0
  686. package/dist/static/sdk-libs/dist/aimeat-ai.js +168 -0
  687. package/dist/static/sdk-libs/dist/aimeat-audio.js +979 -0
  688. package/dist/static/sdk-libs/dist/aimeat-auth.js +2232 -0
  689. package/dist/static/sdk-libs/dist/aimeat-capabilities.js +177 -0
  690. package/dist/static/sdk-libs/dist/aimeat-commerce.js +265 -0
  691. package/dist/static/sdk-libs/dist/aimeat-data.js +247 -0
  692. package/dist/static/sdk-libs/dist/aimeat-editor.js +299 -0
  693. package/dist/static/sdk-libs/dist/aimeat-header.js +270 -0
  694. package/dist/static/sdk-libs/dist/aimeat-intake.js +94 -0
  695. package/dist/static/sdk-libs/dist/aimeat-live.js +317 -0
  696. package/dist/static/sdk-libs/dist/aimeat-markdown.js +633 -0
  697. package/dist/static/sdk-libs/dist/aimeat-organism.js +394 -0
  698. package/dist/static/sdk-libs/dist/aimeat-portfolio-standalone.js +90 -0
  699. package/dist/static/sdk-libs/dist/aimeat-social.js +157 -0
  700. package/dist/static/sdk-libs/dist/aimeat-speech.js +300 -0
  701. package/dist/static/sdk-libs/dist/aimeat-storage.js +210 -0
  702. package/dist/static/sdk-libs/dist/aimeat-tunnel.js +383 -0
  703. package/dist/static/sdk-libs/dist/aimeat-wallet.js +118 -0
  704. package/dist/static/sdk-libs/dist/aimeat-webmcp.js +187 -0
  705. package/dist/static/sdk-libs/dist/aimeat-work.js +213 -0
  706. package/dist/static/sdk-libs/dist/aimeat-workflows.js +147 -0
  707. package/dist/static/sdk-libs/editor/index.js +229 -0
  708. package/dist/static/sdk-libs/header/index.js +249 -0
  709. package/dist/static/sdk-libs/intake/index.js +75 -0
  710. package/dist/static/sdk-libs/live/index.js +223 -0
  711. package/dist/static/sdk-libs/markdown/index.js +570 -0
  712. package/dist/static/sdk-libs/organism/index.js +381 -0
  713. package/dist/static/sdk-libs/portfolio-standalone/index.js +78 -0
  714. package/dist/static/sdk-libs/social/index.js +140 -0
  715. package/dist/static/sdk-libs/speech/index.js +321 -0
  716. package/dist/static/sdk-libs/storage/index.js +189 -0
  717. package/dist/static/sdk-libs/tunnel/index.js +428 -0
  718. package/dist/static/sdk-libs/wallet/index.js +115 -0
  719. package/dist/static/sdk-libs/webmcp/index.js +185 -0
  720. package/dist/static/sdk-libs/work/index.js +191 -0
  721. package/dist/static/sdk-libs/workflows/index.js +113 -0
  722. package/package.json +10 -3
@@ -0,0 +1,792 @@
1
+ /**
2
+ * @file auth/session.js
3
+ * @description aimeat-auth stateful core (SDK-libs migration Phase 3). Holds the mutable module state
4
+ * (currentSession / refreshTimer / ownerRefreshInFlight / in-flight guards) so every reassignment
5
+ * stays in ONE module — no cross-module setter plumbing. Contains: api/authApi; the session object
6
+ * factory + persistence + refresh scheduling; the H-2 app-origin seamless SSO (silent same-site
7
+ * bridge, scope-drift self-heal, apex logout, PKCE consent popup); and the full AIMEAT.auth public
8
+ * API. The UI methods delegate out — mountLoginButton → pill.js, showLoginModal → modal.js (circular
9
+ * imports, resolved at call time). Merges the session code from auth-lib-part1/2/3.ts.
10
+ * @structure state · api/authApi · persistSession/restoreSessionFromCookie · isAppOrigin/appScopeDrift/
11
+ * silentAppToken/apexLogout/PKCE consent/_buildAppSession/restoreSessionFromAppOrigin ·
12
+ * scheduleAutoRefresh/createSession · refreshOnFocus · the `auth` object.
13
+ * @usage import { auth, api, isAppOrigin, restoreSessionFromAppOrigin } from './session.js';
14
+ * @version-history
15
+ * v1.0.0 — 2026-07-19 — Merged from src/routes/libs/auth-lib-part1/2/3.ts (SDK-libs migration Phase 3).
16
+ */
17
+ import { importEd25519Key, storeKey, loadKey, deleteKey, migrateKeysToIndexedDB, sign, save, load, remove, parseJwt, isExpired } from './crypto.js';
18
+ import { NODE_URL, APEX_URL, NODE_ID, appDeclaredScopes } from './config.js';
19
+ import { emit, on, off } from './events.js';
20
+ import { mountPill } from './pill.js';
21
+ import { showLoginModal } from './modal.js';
22
+
23
+ // ── Module state (every reassignment lives in this file) ──
24
+ /** @type {any} */ let currentSession = null;
25
+ /** @type {any} */ let refreshTimer = null;
26
+ /** @type {any} */ let ownerRefreshInFlight = null; // shared promise so concurrent owner refreshes don't each rotate
27
+ /** @type {any} */ let _appOriginLoginInFlight = null;
28
+ /** @type {any} */ let focusRefreshInFlight = null;
29
+
30
+ // ── API helpers ──
31
+
32
+ export async function api(path, opts = {}) {
33
+ const url = NODE_URL + path;
34
+ const headers = { 'Content-Type': 'application/json', ...opts.headers };
35
+ const resp = await fetch(url, { ...opts, headers });
36
+ const data = await resp.json();
37
+ if (!data.ok) {
38
+ // Preserve the machine-readable code + details on the thrown Error so callers can branch
39
+ // (e.g. EMAIL_NOT_VERIFIED → open the email-completion flow) instead of matching on text.
40
+ const err = /** @type {Error & { code?: string, details?: unknown }} */ (new Error(data.error?.message || 'API error'));
41
+ err.code = data.error?.code;
42
+ err.details = data.error?.details;
43
+ throw err;
44
+ }
45
+ return data;
46
+ }
47
+
48
+ export async function authApi(path, jwt, opts = {}) {
49
+ return api(path, { ...opts, headers: { ...opts.headers, 'Authorization': 'Bearer ' + jwt } });
50
+ }
51
+
52
+ // ── Session persistence ──
53
+
54
+ // Persist non-secret session metadata (+ short-lived access token) to localStorage.
55
+ // The long-lived refresh token is an httpOnly cookie and is never readable here.
56
+ export function persistSession(session) {
57
+ save('session', {
58
+ owner: session.owner, gaii: session.gaii, ghii: session.ghii,
59
+ jwt: session.jwt, publicKey: session.publicKey, roles: session.roles,
60
+ displayName: session.displayName || '',
61
+ federated: session.federated || false,
62
+ homeNode: session.homeNode || '',
63
+ homeUrl: session.homeUrl || '',
64
+ // H-2 app-origin grant session metadata (drives the consent gear on the login pill).
65
+ _appOrigin: session._appOrigin || false,
66
+ _app: session._app || null,
67
+ _own: session._own || false,
68
+ });
69
+ }
70
+
71
+ // Restore a session purely from the httpOnly refresh cookie, with NO local metadata. Makes the app
72
+ // boot "logged in" when a cookie exists but localStorage is empty. Returns null when no usable cookie.
73
+ export async function restoreSessionFromCookie() {
74
+ try {
75
+ const data = await api('/v1/auth/refresh', {
76
+ method: 'POST',
77
+ credentials: 'include',
78
+ headers: { 'X-AIMEAT-Refresh': '1' },
79
+ });
80
+ const token = data && data.data && data.data.token;
81
+ if (!token) return null;
82
+ const payload = parseJwt(token) || {};
83
+ const ownerName = payload.owner || payload.sub;
84
+ if (!ownerName) return null;
85
+ const session = createSession({
86
+ owner: ownerName,
87
+ ghii: String(ownerName).indexOf('@') >= 0 ? ownerName : (ownerName + '@' + NODE_ID),
88
+ gaii: null,
89
+ jwt: token,
90
+ roles: payload.roles || [],
91
+ displayName: '',
92
+ });
93
+ persistSession(session);
94
+ currentSession = session;
95
+ scheduleAutoRefresh(session);
96
+ emit('login', session);
97
+ return session;
98
+ } catch {
99
+ return null;
100
+ }
101
+ }
102
+
103
+ // ── App-origin seamless SSO (H-2) ──
104
+ // When this SDK runs on an APP ORIGIN (a *.apps.<domain> host, different from the node/apex), the
105
+ // host-only session cookie can't be read directly. The same-site silent bridge (a hidden iframe to
106
+ // the apex, where the cookie IS first-party) mints a SCOPED, revocable grant token and posts it back.
107
+ export function isAppOrigin() {
108
+ try { return location.origin !== new URL(APEX_URL).origin; } catch { return false; }
109
+ }
110
+
111
+ // Scopes the app DECLARES that this app-origin session's token does NOT carry — the self-heal signal.
112
+ function appScopeDrift(session) {
113
+ if (!session || !session._appOrigin || !session.jwt) return [];
114
+ var have = (parseJwt(session.jwt) || {}).scopes || [];
115
+ return appDeclaredScopes().split(' ').filter(function (s) { return s && have.indexOf(s) < 0; });
116
+ }
117
+
118
+ function silentAppToken() {
119
+ return new Promise(function (resolve) {
120
+ var apexOrigin;
121
+ try { apexOrigin = new URL(APEX_URL).origin; } catch { resolve(null); return; }
122
+ if (location.origin === apexOrigin) { resolve(null); return; }
123
+ var settled = false, iframe = null, timer = null;
124
+ function finish(v) {
125
+ if (settled) return; settled = true;
126
+ window.removeEventListener('message', onMsg);
127
+ if (timer) clearTimeout(timer);
128
+ if (iframe && iframe.parentNode) iframe.parentNode.removeChild(iframe);
129
+ resolve(v);
130
+ }
131
+ function onMsg(e) {
132
+ if (e.origin !== apexOrigin) return;
133
+ var d = e.data || {};
134
+ if (d.type !== 'aimeat_app_login') return;
135
+ // Return the FULL result (token on success, or { error:'consent_required', app, scope }) so the
136
+ // caller can launch the visible consent popup). null only when the bridge produced nothing.
137
+ finish(d.result || null);
138
+ }
139
+ window.addEventListener('message', onMsg);
140
+ iframe = document.createElement('iframe');
141
+ iframe.style.display = 'none';
142
+ iframe.setAttribute('aria-hidden', 'true');
143
+ iframe.src = apexOrigin + '/app-silent.html?scope=' + encodeURIComponent(appDeclaredScopes());
144
+ (document.body || document.documentElement).appendChild(iframe);
145
+ timer = setTimeout(function () { finish(null); }, 8000);
146
+ });
147
+ }
148
+
149
+ // End the shared apex session from an APP ORIGIN (frames the same-site apex bridge in ?mode=logout).
150
+ export function apexLogout() {
151
+ return new Promise(function (resolve) {
152
+ var apexOrigin;
153
+ try { apexOrigin = new URL(APEX_URL).origin; } catch { resolve(false); return; }
154
+ if (location.origin === apexOrigin) { resolve(false); return; }
155
+ var settled = false, iframe = null, timer = null;
156
+ function finish(v) {
157
+ if (settled) return; settled = true;
158
+ window.removeEventListener('message', onMsg);
159
+ if (timer) clearTimeout(timer);
160
+ if (iframe && iframe.parentNode) iframe.parentNode.removeChild(iframe);
161
+ resolve(v);
162
+ }
163
+ function onMsg(e) {
164
+ if (e.origin !== apexOrigin) return;
165
+ var d = e.data || {};
166
+ if (d.type !== 'aimeat_app_logout') return;
167
+ finish(!!(d.result && d.result.ok));
168
+ }
169
+ window.addEventListener('message', onMsg);
170
+ iframe = document.createElement('iframe');
171
+ iframe.style.display = 'none';
172
+ iframe.setAttribute('aria-hidden', 'true');
173
+ iframe.src = apexOrigin + '/app-silent.html?mode=logout';
174
+ (document.body || document.documentElement).appendChild(iframe);
175
+ timer = setTimeout(function () { finish(false); }, 8000);
176
+ });
177
+ }
178
+
179
+ // ── App-grant consent popup (H-2, PKCE code flow) ──
180
+ function _b64url(buf) {
181
+ var bytes = new Uint8Array(buf), s = '';
182
+ for (var i = 0; i < bytes.length; i++) s += String.fromCharCode(bytes[i]);
183
+ return btoa(s).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
184
+ }
185
+ async function _pkce() {
186
+ var verifier = _b64url(crypto.getRandomValues(new Uint8Array(32)).buffer);
187
+ if (crypto.subtle && crypto.subtle.digest) {
188
+ var digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(verifier));
189
+ return { verifier: verifier, challenge: _b64url(digest), method: 'S256' };
190
+ }
191
+ // Non-secure context (http on a non-localhost host): crypto.subtle is unavailable. Fall back to
192
+ // PKCE "plain". Acceptable — such transport is already non-confidential; real app origins are https.
193
+ return { verifier: verifier, challenge: verifier, method: 'plain' };
194
+ }
195
+ export async function requestConsentPopup(app, scopeStr, manage) {
196
+ var apexOrigin;
197
+ try { apexOrigin = new URL(APEX_URL).origin; } catch { return null; }
198
+ var p = await _pkce();
199
+ var state = _b64url(crypto.getRandomValues(new Uint8Array(16)).buffer);
200
+ var redirectUri = location.origin + '/'; // app origin; never navigated in web_message mode (origin binding only)
201
+ var scope = scopeStr || appDeclaredScopes();
202
+ // manage=1 → the consent page always shows the management screen (the gear).
203
+ var url = apexOrigin + '/v1/app-grants/authorize?response_type=code&response_mode=web_message'
204
+ + (manage ? '&manage=1' : '')
205
+ + '&app=' + encodeURIComponent(app)
206
+ + '&scope=' + encodeURIComponent(scope)
207
+ + '&redirect_uri=' + encodeURIComponent(redirectUri)
208
+ + '&code_challenge=' + encodeURIComponent(p.challenge)
209
+ + '&code_challenge_method=' + encodeURIComponent(p.method)
210
+ + '&state=' + encodeURIComponent(state);
211
+ var w = 460, h = 660;
212
+ var left = (window.screen && window.screen.width ? (window.screen.width - w) / 2 : 0);
213
+ var top = (window.screen && window.screen.height ? (window.screen.height - h) / 2 : 0);
214
+ var popup = window.open(url, 'aimeat_consent', 'width=' + w + ',height=' + h + ',left=' + left + ',top=' + top);
215
+ if (!popup) {
216
+ // Popup blocked (no user activation / aggressive blocker). Fail LOUDLY so the app can react.
217
+ try { console.warn('[aimeat-auth] consent popup blocked — app-origin sign-in needs a real user click (user activation). Synthetic/automated clicks cannot open the consent window.'); } catch { /* no console */ }
218
+ emit('popup-blocked', { app: app });
219
+ return null;
220
+ }
221
+ var msg = await new Promise(function (resolve) {
222
+ var done = false, iv = null;
223
+ function onMsg(e) {
224
+ if (e.origin !== apexOrigin) return;
225
+ var d = e.data || {};
226
+ if (d.type !== 'aimeat_app_grant' || d.state !== state) return;
227
+ done = true; cleanup(); resolve(d);
228
+ }
229
+ function cleanup() { window.removeEventListener('message', onMsg); if (iv) clearInterval(iv); }
230
+ window.addEventListener('message', onMsg);
231
+ iv = setInterval(function () { if (popup.closed && !done) { cleanup(); resolve(null); } }, 500);
232
+ });
233
+ if (msg && msg.revoked) return { revoked: true }; // user revoked from the consent screen
234
+ if (!msg || !msg.code) return null; // denied / closed
235
+ try {
236
+ var resp = await fetch(apexOrigin + '/v1/app-grants/token', {
237
+ method: 'POST', headers: { 'Content-Type': 'application/json' },
238
+ body: JSON.stringify({ grant_type: 'authorization_code', code: msg.code, code_verifier: p.verifier, redirect_uri: redirectUri }),
239
+ });
240
+ var j = await resp.json();
241
+ return (j && j.ok && j.data && j.data.access_token) ? j.data : null;
242
+ } catch { return null; }
243
+ }
244
+
245
+ // Build + install an app-origin session from a freshly issued grant access token.
246
+ export function _buildAppSession(accessToken, appId, own, displayName) {
247
+ var payload = parseJwt(accessToken) || {};
248
+ var ownerName = payload.owner || payload.sub;
249
+ if (!ownerName) return null;
250
+ var session = createSession({
251
+ owner: ownerName,
252
+ ghii: String(ownerName).indexOf('@') >= 0 ? ownerName : (ownerName + '@' + NODE_ID),
253
+ gaii: null, jwt: accessToken, roles: payload.roles || [], displayName: displayName || '',
254
+ });
255
+ session._appOrigin = true;
256
+ session._app = appId || null;
257
+ session._own = !!own;
258
+ persistSession(session);
259
+ currentSession = session;
260
+ scheduleAutoRefresh(session);
261
+ emit('login', session);
262
+ return session;
263
+ }
264
+
265
+ // Shared in-flight promise so concurrent callers reuse a single silent bridge instead of two iframes.
266
+ export function restoreSessionFromAppOrigin(interactive) {
267
+ if (currentSession) return Promise.resolve(currentSession);
268
+ if (_appOriginLoginInFlight) return _appOriginLoginInFlight;
269
+ _appOriginLoginInFlight = (async function () {
270
+ var r = await silentAppToken();
271
+ var grant = (r && r.ok && r.access_token) ? r : null;
272
+ var appId = (r && r.app) || null;
273
+ var own = !!(r && r.own);
274
+ // consent_required → not yet granted; login_required → not logged into the apex at all. BOTH are
275
+ // resolved by the visible popup — ONLY on a user gesture (interactive).
276
+ if (!grant && interactive && r && (r.error === 'consent_required' || r.error === 'login_required') && r.app) {
277
+ appId = r.app;
278
+ grant = await requestConsentPopup(r.app, r.scope);
279
+ // login_required hits OWN apps too — the token exchange reports own/app itself, so trust it.
280
+ own = !!(grant && grant.own);
281
+ if (grant && grant.app) appId = grant.app;
282
+ }
283
+ if (!grant || !grant.access_token) return null;
284
+ return _buildAppSession(grant.access_token, appId, own, grant.display_name);
285
+ })();
286
+ _appOriginLoginInFlight.finally(function () { _appOriginLoginInFlight = null; });
287
+ return _appOriginLoginInFlight;
288
+ }
289
+
290
+ export function scheduleAutoRefresh(session) {
291
+ if (refreshTimer) clearTimeout(refreshTimer);
292
+ if (!session?.jwt) return;
293
+ try {
294
+ const payload = JSON.parse(atob(session.jwt.split('.')[1].replace(/-/g, '+').replace(/_/g, '/')));
295
+ if (!payload.exp) return;
296
+ // Refresh 5 minutes before expiry (or immediately if less than 5 min left)
297
+ const msUntilExpiry = (payload.exp * 1000) - Date.now();
298
+ const refreshIn = Math.max(msUntilExpiry - 5 * 60 * 1000, 10_000); // min 10s
299
+ refreshTimer = setTimeout(async () => {
300
+ try {
301
+ await session.refresh();
302
+ emit('refreshed', session);
303
+ scheduleAutoRefresh(session); // Schedule next refresh
304
+ } catch (e) {
305
+ console.warn('[aimeat-auth] Auto-refresh failed:', e.message);
306
+ emit('expired', { reason: 'refresh_failed', error: e.message });
307
+ }
308
+ }, refreshIn);
309
+ } catch { /* invalid JWT, skip scheduling */ }
310
+ }
311
+
312
+ export function createSession(data) {
313
+ const jwtPayload = data.jwt ? parseJwt(data.jwt) : null;
314
+ // owner MUST be a string (or null): downstream code calls owner.split (identicon avatar). Coerce here.
315
+ let ownerVal = data.owner;
316
+ if (ownerVal != null && typeof ownerVal !== 'string') {
317
+ ownerVal = (typeof ownerVal === 'object' && typeof ownerVal.name === 'string') ? ownerVal.name : String(ownerVal);
318
+ }
319
+ // ghii MUST be a string (or null): downstream calls ghii.split('@'). Some writers persisted the whole
320
+ // ghii object; extract the string at the one funnel every path goes through.
321
+ let ghiiVal = data.ghii;
322
+ if (ghiiVal != null && typeof ghiiVal !== 'string') {
323
+ ghiiVal = (typeof ghiiVal === 'object' && typeof ghiiVal.ghii === 'string') ? ghiiVal.ghii : String(ghiiVal);
324
+ }
325
+ const session = /** @type {Record<string, any>} */ ({
326
+ ghii: ghiiVal || null,
327
+ owner: ownerVal,
328
+ gaii: data.gaii || null,
329
+ identity: data.gaii || ghiiVal || null,
330
+ jwt: data.jwt,
331
+ roles: jwtPayload?.roles || data.roles || [],
332
+ displayName: data.displayName || '',
333
+ // SECURITY: Private keys are non-extractable CryptoKeys in IndexedDB, NOT here. _cryptoKey = in-memory ref only.
334
+ _cryptoKey: data._cryptoKey || null,
335
+ publicKey: data.publicKey,
336
+ nodeUrl: NODE_URL,
337
+ federated: data.federated || false,
338
+ homeNode: data.homeNode || '',
339
+ homeUrl: data.homeUrl || '',
340
+
341
+ // Authenticated fetch wrapper — returns parsed JSON without throwing on error so callers
342
+ // (e.g. AIMEAT.data.get) can inspect res.ok / res.error themselves.
343
+ async fetch(path, opts = {}) {
344
+ if (isExpired(session.jwt)) {
345
+ await session.refresh();
346
+ }
347
+ const url = NODE_URL + path;
348
+ const headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + session.jwt, ...(opts.headers || {}) };
349
+ const resp = await fetch(url, { ...opts, headers });
350
+ // Scope-drift self-heal (H-2): a 403 on an app-origin session whose token is missing scopes the
351
+ // app now DECLARES → one silent bridge re-run upgrades the owner's own app in place; else emit
352
+ // 'scopes-stale'. One attempt per session — never a retry loop.
353
+ if (resp.status === 403 && session._appOrigin && !session._scopeHealTried) {
354
+ var missing = appScopeDrift(session);
355
+ if (missing.length) {
356
+ session._scopeHealTried = true;
357
+ var t = await silentAppToken();
358
+ if (t && t.ok && t.access_token && !appScopeDrift({ _appOrigin: true, jwt: t.access_token })) {
359
+ session.jwt = t.access_token;
360
+ persistSession(session);
361
+ scheduleAutoRefresh(session);
362
+ var retry = await fetch(url, { ...opts, headers: { ...headers, 'Authorization': 'Bearer ' + session.jwt } });
363
+ return retry.json();
364
+ }
365
+ emit('scopes-stale', { app: session._app || null, missing: missing });
366
+ }
367
+ }
368
+ return resp.json();
369
+ },
370
+
371
+ // Notify the signed-in owner (header bell + browser push if subscribed).
372
+ async notify(title, opts = {}) {
373
+ return session.fetch('/v1/notifications', {
374
+ method: 'POST',
375
+ body: JSON.stringify({ title, body: opts.body, link: opts.link, type: opts.type }),
376
+ });
377
+ },
378
+
379
+ // Get a fresh access token. Owner sessions use the httpOnly refresh cookie; agent sessions
380
+ // re-sign with their IndexedDB key. Concurrent owner refreshes share one in-flight request.
381
+ async refresh() {
382
+ // App-origin sessions re-mint via the silent bridge (the apex cookie isn't reachable here).
383
+ if (session._appOrigin) {
384
+ var t = await silentAppToken();
385
+ if (!t || !t.access_token) throw new Error('App session expired — the owner is not logged in on the node.');
386
+ session.jwt = t.access_token;
387
+ session.roles = (parseJwt(session.jwt) || {}).roles || session.roles || [];
388
+ persistSession(session);
389
+ scheduleAutoRefresh(session);
390
+ return session;
391
+ }
392
+ // Federated sessions can't self-refresh yet — user must re-login.
393
+ if (session.federated) {
394
+ throw new Error('Federated session expired. Please log in again.');
395
+ }
396
+
397
+ if (session.gaii) {
398
+ // Agent session — legacy key-signing refresh.
399
+ const key = session._cryptoKey || await loadKey('agent_key');
400
+ if (!key) throw new Error('Cannot refresh — no signing key found in IndexedDB');
401
+ const timestamp = new Date().toISOString();
402
+ const signature = await sign(key, session.gaii + timestamp);
403
+ const d2 = await api('/v1/auth/token', {
404
+ method: 'POST',
405
+ body: JSON.stringify({ gaii: session.gaii, timestamp, signature }),
406
+ });
407
+ session.jwt = d2.data.token;
408
+ session.roles = (parseJwt(session.jwt) || {}).roles || session.roles || [];
409
+ persistSession(session);
410
+ scheduleAutoRefresh(session);
411
+ return session;
412
+ }
413
+
414
+ // Owner session — httpOnly refresh-cookie rotation (single-flight).
415
+ if (ownerRefreshInFlight) return ownerRefreshInFlight;
416
+ ownerRefreshInFlight = (async () => {
417
+ const resp = await fetch(NODE_URL + '/v1/auth/refresh', {
418
+ method: 'POST',
419
+ credentials: 'include',
420
+ headers: { 'Content-Type': 'application/json', 'X-AIMEAT-Refresh': '1' },
421
+ });
422
+ let data2 = null;
423
+ try { data2 = await resp.json(); } catch { /* no body */ }
424
+ if (!resp.ok || !data2 || data2.ok === false) {
425
+ throw new Error(data2?.error?.message || 'Session refresh failed');
426
+ }
427
+ session.jwt = data2.data.token;
428
+ session.roles = (parseJwt(session.jwt) || {}).roles || session.roles || [];
429
+ // The refreshed token is AUTHORITATIVE for identity. If it is for a different owner than the
430
+ // persisted session, adopt the owner + GHII from the token (else a stale identity shows).
431
+ var freshClaims = parseJwt(session.jwt) || {};
432
+ if (freshClaims.owner && freshClaims.owner !== session.owner) {
433
+ session.owner = freshClaims.owner;
434
+ if (freshClaims.node) session.ghii = freshClaims.owner + '@' + freshClaims.node;
435
+ session.identity = session.gaii || session.ghii || null;
436
+ }
437
+ // Adopt the fresh display name the server returns so the pill stays current without a re-login.
438
+ if (typeof data2.data.display_name === 'string') session.displayName = data2.data.display_name;
439
+ persistSession(session);
440
+ scheduleAutoRefresh(session);
441
+ return session;
442
+ })();
443
+ try { return await ownerRefreshInFlight; }
444
+ finally { ownerRefreshInFlight = null; }
445
+ },
446
+
447
+ // Check if session is valid
448
+ get valid() { return session.jwt && !isExpired(session.jwt); },
449
+ });
450
+ return session;
451
+ }
452
+
453
+ // ── Refresh on focus / visibility ──
454
+ // The auto-refresh setTimeout fires 5 min before expiry, but timers do NOT fire while the machine is
455
+ // asleep or the tab is frozen. Re-check the token whenever the tab regains visibility/focus.
456
+ export function refreshOnFocus() {
457
+ const session = currentSession;
458
+ if (!session || !session.jwt || session.federated) return;
459
+ const payload = parseJwt(session.jwt);
460
+ if (!payload || !payload.exp) return;
461
+ const msUntilExpiry = (payload.exp * 1000) - Date.now();
462
+ if (msUntilExpiry > 5 * 60 * 1000) return; // still comfortably valid
463
+ if (focusRefreshInFlight) return; // focus + visibilitychange can both fire — de-dupe
464
+ const wasExpired = msUntilExpiry <= 0;
465
+ focusRefreshInFlight = session.refresh()
466
+ .then(() => { emit('refreshed', session); })
467
+ .catch((e) => {
468
+ console.warn('[aimeat-auth] Focus refresh failed:', e.message);
469
+ // Only declare the session dead if the token had actually expired.
470
+ if (wasExpired) emit('expired', { reason: 'refresh_failed', error: e.message });
471
+ })
472
+ .finally(() => { focusRefreshInFlight = null; });
473
+ }
474
+
475
+ // ── Public API ──
476
+
477
+ export const auth = {
478
+ nodeUrl: NODE_URL,
479
+ nodeId: NODE_ID,
480
+
481
+ /**
482
+ * Register a new human identity (GHII) and get an authenticated session.
483
+ * @returns {Promise<object>} Session object with .fetch(), .refresh(), .jwt, .ghii
484
+ */
485
+ async register(username, displayName, opts = {}) {
486
+ const regData = await api('/v1/ghii', {
487
+ method: 'POST',
488
+ credentials: 'include',
489
+ body: JSON.stringify({
490
+ username,
491
+ display_name: displayName,
492
+ bio: opts.bio,
493
+ avatar: opts.avatar,
494
+ locale: opts.locale,
495
+ password: opts.password || undefined,
496
+ }),
497
+ });
498
+
499
+ // With a password, establish a cookie-backed session via the login endpoint.
500
+ if (opts.password) {
501
+ return this.loginWithPassword(username, opts.password);
502
+ }
503
+
504
+ // ── Legacy no-password path: key-signing token, no refresh cookie ──
505
+ const ownerName = regData.data.owner.name;
506
+ const ghii = regData.data.ghii.ghii;
507
+ // Normal registration returns private_key/public_key; dev-mode reset returns owner_private_key/owner_public_key.
508
+ const serverPrivateKey = regData.data.private_key || regData.data.owner_private_key;
509
+ const serverPublicKey = regData.data.public_key || regData.data.owner_public_key || '';
510
+ if (!serverPrivateKey) {
511
+ throw new Error('Server did not return an owner signing key. Please try signing in again.');
512
+ }
513
+
514
+ // Dev-mode reset already returns an owner JWT. Fresh registration still needs to mint one.
515
+ let ownerToken = regData.data.token || null;
516
+ if (!ownerToken) {
517
+ const ownerTimestamp = new Date().toISOString();
518
+ const ownerMessage = ownerName + NODE_ID + ownerTimestamp;
519
+ const ownerSig = await sign(serverPrivateKey, ownerMessage);
520
+ const ownerTokenData = await api('/v1/auth/token', {
521
+ method: 'POST',
522
+ body: JSON.stringify({ owner: ownerName, timestamp: ownerTimestamp, signature: ownerSig }),
523
+ });
524
+ ownerToken = ownerTokenData.data.token;
525
+ }
526
+
527
+ // SECURITY: Import owner private key as non-extractable CryptoKey in IndexedDB
528
+ const ownerCryptoKey = await importEd25519Key(serverPrivateKey);
529
+ await storeKey('owner_key', ownerCryptoKey);
530
+
531
+ // Owner session — agents are connected later via device auth
532
+ const session = createSession({
533
+ ghii, owner: ownerName, gaii: null,
534
+ jwt: ownerToken,
535
+ _cryptoKey: ownerCryptoKey, publicKey: serverPublicKey,
536
+ displayName: regData.data.ghii.display_name || '',
537
+ });
538
+
539
+ // SECURITY: Only save metadata to localStorage (no private keys)
540
+ save('session', {
541
+ owner: ownerName, gaii: null, ghii,
542
+ jwt: session.jwt, publicKey: serverPublicKey, roles: session.roles,
543
+ displayName: session.displayName || '',
544
+ });
545
+
546
+ currentSession = session;
547
+ scheduleAutoRefresh(session);
548
+ emit('login', session);
549
+ return session;
550
+ },
551
+
552
+ /**
553
+ * Login with stored credentials (auto-refreshes JWT if expired).
554
+ * @returns {Promise<object|null>} Session or null if no stored credentials
555
+ */
556
+ async login(username) {
557
+ // On an app origin the host-only cookie is unreachable; use the same-site silent bridge (H-2).
558
+ // Non-interactive (no popup) — login() is commonly called on boot, not from a user gesture.
559
+ if (isAppOrigin()) return await restoreSessionFromAppOrigin(false);
560
+ const stored = load('session');
561
+ // No local metadata — but an httpOnly refresh cookie may exist. Restore from the cookie alone.
562
+ if (!stored) return await restoreSessionFromCookie();
563
+ if (username && stored.owner !== username) return null;
564
+
565
+ // SECURITY: Run one-time migration from localStorage to IndexedDB
566
+ await migrateKeysToIndexedDB();
567
+
568
+ // Migrate old agent sessions to owner sessions.
569
+ if (stored.gaii) {
570
+ stored.gaii = null;
571
+ }
572
+
573
+ const cryptoKey = stored.gaii ? await loadKey('agent_key') : await loadKey('owner_key');
574
+ const session = createSession({ ...stored, _cryptoKey: cryptoKey });
575
+
576
+ // Owner-local sessions ALWAYS refresh on boot (the httpOnly cookie is the source of truth).
577
+ const isOwnerLocal = !session.federated && !session.gaii;
578
+ if (isOwnerLocal || isExpired(session.jwt)) {
579
+ try {
580
+ await session.refresh();
581
+ } catch {
582
+ remove('session');
583
+ emit('expired');
584
+ return null;
585
+ }
586
+ }
587
+
588
+ currentSession = session;
589
+ scheduleAutoRefresh(session);
590
+ emit('login', session);
591
+ return session;
592
+ },
593
+
594
+ /**
595
+ * Login with username + password (works from any device).
596
+ * @returns {Promise<object>} Session object
597
+ */
598
+ async loginWithPassword(username, password) {
599
+ // Owner sessions refresh via the httpOnly cookie, so no signing key is needed. credentials:'include'
600
+ // lets the server set the refresh cookie.
601
+ const data = await api('/v1/ghii/login', {
602
+ method: 'POST',
603
+ credentials: 'include',
604
+ body: JSON.stringify({ username, password }),
605
+ });
606
+
607
+ const d = data.data;
608
+
609
+ // Federated logins may still return an owner key pair; store it if present (harmless).
610
+ let ownerCryptoKey = null;
611
+ if (d.owner_private_key) {
612
+ ownerCryptoKey = await importEd25519Key(d.owner_private_key);
613
+ await storeKey('owner_key', ownerCryptoKey);
614
+ }
615
+
616
+ const session = createSession({
617
+ ghii: d.ghii.ghii,
618
+ owner: d.owner.name,
619
+ gaii: null,
620
+ jwt: d.token,
621
+ _cryptoKey: ownerCryptoKey,
622
+ publicKey: d.owner_public_key || '',
623
+ displayName: d.ghii.display_name || '',
624
+ federated: d.federated || false,
625
+ homeNode: d.home_node || '',
626
+ homeUrl: d.home_url || '',
627
+ });
628
+
629
+ // First sign-in of a provisioned-code account issues durable credentials in the response.
630
+ // Expose them once on the returned session (NOT persisted) so the entry surface can show them.
631
+ if (d.key_credentials) session._keyCredentials = d.key_credentials;
632
+
633
+ persistSession(session);
634
+
635
+ currentSession = session;
636
+ scheduleAutoRefresh(session);
637
+ emit('login', session);
638
+ return session;
639
+ },
640
+
641
+ /** Get the current session (or null if not logged in) */
642
+ getSession() {
643
+ return currentSession;
644
+ },
645
+
646
+ /**
647
+ * Patch mutable, non-secret session metadata in place (e.g. displayName after a profile edit),
648
+ * persist it, and notify the login pill so it re-renders live — no page reload.
649
+ */
650
+ updateSessionMeta(patch) {
651
+ if (!currentSession || !patch) return;
652
+ Object.assign(currentSession, patch);
653
+ persistSession(currentSession);
654
+ emit('session-updated', currentSession);
655
+ },
656
+
657
+ /** Logout — clear stored credentials from localStorage and IndexedDB */
658
+ async logout() {
659
+ if (refreshTimer) { clearTimeout(refreshTimer); refreshTimer = null; }
660
+ ownerRefreshInFlight = null;
661
+ // Revoke the session and clear the httpOnly refresh cookie server-side.
662
+ try {
663
+ await fetch(NODE_URL + '/v1/auth/revoke', {
664
+ method: 'POST',
665
+ credentials: 'include',
666
+ headers: {
667
+ 'Content-Type': 'application/json',
668
+ ...(currentSession?.jwt ? { 'Authorization': 'Bearer ' + currentSession.jwt } : {}),
669
+ },
670
+ });
671
+ } catch { /* best effort — still clear local state below */ }
672
+ // On an app origin, end the apex session too so EXIT sticks across the whole family.
673
+ if (isAppOrigin()) { try { await apexLogout(); } catch { /* best effort */ } }
674
+ currentSession = null;
675
+ remove('session');
676
+ remove('owner_key');
677
+ // SECURITY: Delete CryptoKeys from IndexedDB
678
+ await deleteKey('agent_key');
679
+ await deleteKey('owner_key');
680
+ emit('logout');
681
+ },
682
+
683
+ /**
684
+ * Re-open the consent screen for the current app (H-2 in-app grant management).
685
+ */
686
+ async manageGrant() {
687
+ const s = currentSession || load('session');
688
+ if (!s || !s._app) return null;
689
+ const res = await requestConsentPopup(s._app, appDeclaredScopes(), true);
690
+ if (res && res.revoked) { await auth.logout(); return { revoked: true }; }
691
+ if (res && res.access_token) return _buildAppSession(res.access_token, res.app || s._app, res.own != null ? !!res.own : s._own);
692
+ return null;
693
+ },
694
+
695
+ /** True when running inside a published app on its isolated origin (not the apex). */
696
+ isAppOrigin() { return isAppOrigin(); },
697
+
698
+ /** Open the sign-in modal (password + Google if configured). */
699
+ showLoginModal(opts) { showLoginModal(opts || {}, function () {}); },
700
+
701
+ /** Check if there are stored credentials */
702
+ get hasSession() { return !!load('session'); },
703
+
704
+ /** Get stored GHII without authenticating */
705
+ get storedGhii() { const s = load('session'); return s?.ghii || null; },
706
+
707
+ /** Register an event listener */
708
+ on(event, fn) { on(event, fn); },
709
+
710
+ /** Remove an event listener */
711
+ off(event, fn) { off(event, fn); },
712
+
713
+ /** Check if running inside a sandboxed iframe (no localStorage access) */
714
+ get inSandbox() {
715
+ try { localStorage.getItem('_test'); return false; } catch { return true; }
716
+ },
717
+
718
+ /**
719
+ * Request auth credentials from the parent window via postMessage (sandboxed-iframe fallback).
720
+ * @returns {Promise<object|null>} Session-like object with .jwt and .fetch(), or null
721
+ */
722
+ requestParentAuth(timeout = 3000) {
723
+ return new Promise((resolve) => {
724
+ if (window === window.parent) { resolve(null); return; }
725
+
726
+ let resolved = false;
727
+ const timer = setTimeout(() => { if (!resolved) { resolved = true; resolve(null); } }, timeout);
728
+
729
+ function handler(e) {
730
+ if (resolved) return;
731
+ if (!e.data || e.data.type !== 'aimeat-auth') return;
732
+ resolved = true;
733
+ clearTimeout(timer);
734
+ window.removeEventListener('message', handler);
735
+
736
+ const jwt = e.data.jwt;
737
+ const parentNodeUrl = e.data.nodeUrl;
738
+ if (!jwt) { resolve(null); return; }
739
+
740
+ const effectiveNodeUrl = parentNodeUrl || NODE_URL;
741
+
742
+ const session = /** @type {Record<string, any>} */ ({
743
+ jwt,
744
+ nodeUrl: effectiveNodeUrl,
745
+ owner: null,
746
+ gaii: null,
747
+ ghii: null,
748
+ identity: null,
749
+ get valid() { return jwt && !isExpired(jwt); },
750
+ async fetch(path, opts = {}) {
751
+ const url = effectiveNodeUrl + path;
752
+ const headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + jwt, ...(opts.headers || {}) };
753
+ const resp = await fetch(url, { ...opts, headers });
754
+ return resp.json();
755
+ },
756
+ async notify(title, opts = {}) {
757
+ return session.fetch('/v1/notifications', {
758
+ method: 'POST',
759
+ body: JSON.stringify({ title, body: opts.body, link: opts.link, type: opts.type }),
760
+ });
761
+ },
762
+ });
763
+
764
+ const payload = parseJwt(jwt);
765
+ if (payload) {
766
+ session.gaii = payload.sub || null;
767
+ session.owner = payload.owner || null;
768
+ session.identity = session.gaii || session.ghii || null;
769
+ }
770
+
771
+ currentSession = session;
772
+ emit('login', session);
773
+ resolve(session);
774
+ }
775
+
776
+ window.addEventListener('message', handler);
777
+ window.parent.postMessage({ type: 'aimeat-request-auth' }, '*');
778
+ });
779
+ },
780
+
781
+ // Capability flag so an embedding app can feature-detect the compact login pill.
782
+ compactPill: true,
783
+
784
+ /**
785
+ * Mount a login/register button that handles the full flow. Delegates the render to pill.js.
786
+ * @param {string|Element|object} selector - CSS selector, DOM element, OR (options-first) the opts.
787
+ * @param {object} [opts] - { onLogin, onLogout, buttonText, compact }.
788
+ */
789
+ mountLoginButton(selector, opts = {}) {
790
+ return mountPill(auth, selector, opts);
791
+ },
792
+ };