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,580 @@
1
+ /**
2
+ * @file src/routes/exchange-market.ts
3
+ * @description The two-sided EXCHANGE MARKETPLACE surface (TARGET-045 Phase C): supply (OFFERINGs), demand
4
+ * (NEEDs), and BIDs against needs — the browse/post/bid/accept flow above the metered entitlement. Pricing
5
+ * is always AUTHORITATIVE from the provider extension action (resolveActionPricing), so listings and bids
6
+ * cannot undercut the provider. Accepting a bid mints the durable entitlement (same primitive as the
7
+ * direct acceptance route). Records are public (browsable); writes are owner-authorised. The heavy
8
+ * orchestration (agent negotiation, composite assembly) lives in the marketplace app/agent — this router
9
+ * is the generic store + capability match.
10
+ * @structure exchangeMarketRouter — offerings (POST/GET/GET :id detail/GET :id/odps(.yaml)/GET :id/consumers/
11
+ * DELETE) · needs (POST/GET/close) · bids (POST/GET/accept) · offeringContext (shared detail/ODPS builder)
12
+ * @usage import { exchangeMarketRouter } from './routes/exchange-market.js'; app.use(exchangeMarketRouter(config, storage));
13
+ * @version-history
14
+ * v1.5.0 — 2026-07-25 — ODPS v4.1 (TARGET-045 §4): GET /v1/exchange/offerings/{id}/odps(.yaml) projects the
15
+ * listing as an Open Data Product Specification document; `provenance` is now VALIDATED (400
16
+ * INVALID_PROVENANCE) instead of cast, and a new `odps` authoring block carries the standard fields the
17
+ * node cannot derive (400 INVALID_ODPS). Detail + ODPS share one context builder.
18
+ * v1.4.0 — 2026-07-21 — Needs are app-bound (app_id required → 400 NEED_APP_REQUIRED) + carry an I/O
19
+ * interface spec (inputSchema/outputSchema) — the emergent app-to-app data-API request.
20
+ * v1.3.0 — 2026-07-21 — Cross-app selling (Gap 1): `kind: 'app-tool'` listing branch (a provider app sells a
21
+ * tool as a pinned-interface metered offering) + app-tool offering DETAIL (frozen schema + WebMCP recipe).
22
+ * v1.2.0 — 2026-07-20 — Legibility GATE: listing an offering now REQUIRES a published input+output schema
23
+ * (400 SCHEMA_REQUIRED) and usage_terms (400 USAGE_TERMS_REQUIRED) — every listing integrable + governed.
24
+ * v1.1.0 — 2026-07-20 — Legibility: offering detail (I/O schema + call-recipe + stats), provider consumers
25
+ * (lineage), usage_terms on offerings, spec on needs, ?stats=1 on the list.
26
+ * v1.0.0 — 2026-07-20 — Initial marketplace: offerings, needs, bids, capability match, accept-bid → mint (Phase C).
27
+ */
28
+ import { Router } from 'express';
29
+ import { requireAuth } from '../auth/middleware.js';
30
+ import { success, error } from '../middleware/envelope.js';
31
+ import { resolveIdentity } from '../utils/gaii.js';
32
+ import { resolvePacingToll } from './extensions/pacing.js';
33
+ import { commerceFeePercent } from '../services/marketplace-fee.js';
34
+ import { createEntitlement, readEntitlementForCall } from '../services/metered-entitlements.js';
35
+ import { resolveActionPricing, newOfferingId, newNeedId, newBidId, appToolCoordinate, agentWorkCoordinate, putOffering, getOffering, listOfferings, deleteOffering, matchOfferings, putNeed, getNeed, listNeeds, putBid, listBids, getBid, offeringStats, offeringConsumers, enrichNeeds, } from '../services/exchange-market.js';
36
+ import { ProvenanceSchema, OdpsExtrasSchema } from '../models/odps-schemas.js';
37
+ import { offeringToOdps, odpsToYaml, ODPS_VERSION } from '../services/exchange-odps.js';
38
+ import { AppToolsDocSchema, appToolsKey } from '../models/app-tool-schemas.js';
39
+ import { ensureInterfaceVersion, getInterfaceVersion } from '../services/app-tool-interfaces.js';
40
+ import { reconcileOwnerOfferings, reconcileOwnerOfferingsThrottled, migrateLegacyOfferings } from '../services/exchange-projection.js';
41
+ const str = (v) => (typeof v === 'string' ? v : '');
42
+ const posOrNull = (v) => (typeof v === 'number' && Number.isFinite(v) && v >= 0 ? Math.floor(v) : null);
43
+ /** A publishable schema is a non-empty object (an empty `{}` counts as "not published"). */
44
+ const hasSchema = (v) => !!v && typeof v === 'object' && Object.keys(v).length > 0;
45
+ /** Parse a provider-declared usage licence from a request body (all fields optional; defaults are permissive-but-attributed). */
46
+ function parseUsageTerms(v) {
47
+ if (!v || typeof v !== 'object')
48
+ return null;
49
+ const o = v;
50
+ return {
51
+ derivatives: o.derivatives !== false,
52
+ resale: o.resale === true,
53
+ attribution: o.attribution !== false,
54
+ note: typeof o.note === 'string' ? o.note : undefined,
55
+ };
56
+ }
57
+ /**
58
+ * Parse the provider's provenance attestation. Validated (not cast) because it lands in a PUBLIC record and
59
+ * is republished as ODPS: an unchecked object here would let a provider write arbitrary keys into the market.
60
+ * The node stamps `odpsVersion` so the descriptor always says which ODPS version it follows.
61
+ */
62
+ function parseProvenance(v) {
63
+ if (v === undefined || v === null)
64
+ return { ok: true, value: null };
65
+ const parsed = ProvenanceSchema.safeParse(v);
66
+ if (!parsed.success)
67
+ return { ok: false, message: parsed.error.issues.map(i => `${i.path.join('.') || 'provenance'}: ${i.message}`).join('; ') };
68
+ const value = parsed.data;
69
+ if (!Object.keys(value).length)
70
+ return { ok: true, value: null };
71
+ return { ok: true, value: { ...value, odpsVersion: value.odpsVersion ?? ODPS_VERSION } };
72
+ }
73
+ /** Parse the provider's ODPS authoring block (the standard fields the node cannot derive). */
74
+ function parseOdpsExtras(v) {
75
+ if (v === undefined || v === null)
76
+ return { ok: true, value: null };
77
+ const parsed = OdpsExtrasSchema.safeParse(v);
78
+ if (!parsed.success)
79
+ return { ok: false, message: parsed.error.issues.map(i => `${i.path.join('.') || 'odps'}: ${i.message}`).join('; ') };
80
+ return { ok: true, value: Object.keys(parsed.data).length ? parsed.data : null };
81
+ }
82
+ /** Parse a need's interface-spec (the shape it sends/expects + light hints) from a request body. */
83
+ function parseNeedSpec(v) {
84
+ if (!v || typeof v !== 'object')
85
+ return null;
86
+ const o = v;
87
+ const isObj = (x) => !!x && typeof x === 'object' && !Array.isArray(x);
88
+ const requiredFields = Array.isArray(o.requiredFields) ? o.requiredFields.filter(f => typeof f === 'string') : [];
89
+ const spec = { requiredFields };
90
+ if (typeof o.format === 'string')
91
+ spec.format = o.format;
92
+ if (typeof o.sample === 'string')
93
+ spec.sample = o.sample;
94
+ if (typeof o.notes === 'string')
95
+ spec.notes = o.notes;
96
+ if (isObj(o.inputSchema))
97
+ spec.inputSchema = o.inputSchema;
98
+ if (isObj(o.outputSchema))
99
+ spec.outputSchema = o.outputSchema;
100
+ return (requiredFields.length || spec.format || spec.sample || spec.notes || spec.inputSchema || spec.outputSchema) ? spec : null;
101
+ }
102
+ export function exchangeMarketRouter(config, storage) {
103
+ const router = Router();
104
+ // ── INFO — the marketplace's public economics (rake, currencies) ─────────────
105
+ /** Public: what the platform takes on each metered call + the units in play. */
106
+ router.get('/v1/exchange/info', (_req, res) => {
107
+ return res.json(success(config.nodeId, {
108
+ rake_percent: commerceFeePercent(config),
109
+ rake_note: 'Platform fee applied to each metered call (provider keeps the rest). Set by the node operator.',
110
+ units: ['morsels', 'EUR', 'USD'],
111
+ morsel_note: 'Morsels are the node’s throttle unit (plain integers); real money settles in EUR/USD.',
112
+ }));
113
+ });
114
+ // ── OFFERINGS (supply) ─────────────────────────────────────────────────────
115
+ /** List a supply offering. Two kinds: an extension action (the raw data-service surface, default) or an
116
+ * `app-tool` (a method a provider app sells cross-app — a pinned interface version). Pricing is always
117
+ * authoritative from the provider. Both require a published I/O schema + usage terms (the legibility gate). */
118
+ router.post('/v1/exchange/offerings', requireAuth(), async (req, res) => {
119
+ const owner = req.auth.owner;
120
+ const b = (req.body ?? {});
121
+ // Provenance + the ODPS authoring block are validated once, before any kind branch: both are provider
122
+ // promises that get republished as an ODPS document, so a malformed one fails the listing loudly (400).
123
+ const prov = parseProvenance(b.provenance);
124
+ if (!prov.ok)
125
+ return res.status(400).json(error(config.nodeId, 'INVALID_PROVENANCE', `provenance is malformed — ${prov.message}`));
126
+ const odps = parseOdpsExtras(b.odps);
127
+ if (!odps.ok)
128
+ return res.status(400).json(error(config.nodeId, 'INVALID_ODPS', `odps is malformed — ${odps.message}`));
129
+ // ── kind: app-tool — a provider app sells one of its tools (cross-app selling, Gap 1) ──
130
+ if (b.kind === 'app-tool') {
131
+ const appId = str(b.app_id), toolName = str(b.tool);
132
+ if (!appId || !toolName)
133
+ return res.status(400).json(error(config.nodeId, 'BAD_REQUEST', 'app_id and tool are required for an app-tool offering'));
134
+ const providerGhii = resolveIdentity(req.auth, config.nodeId);
135
+ const manifestRec = await storage.getMemory(providerGhii, appToolsKey(appId));
136
+ if (!manifestRec)
137
+ return res.status(404).json(error(config.nodeId, 'NOT_FOUND', `App "${appId}" declares no tool manifest (${appToolsKey(appId)}) under your account`));
138
+ const parsed = AppToolsDocSchema.safeParse(manifestRec.value);
139
+ if (!parsed.success)
140
+ return res.status(422).json(error(config.nodeId, 'INVALID_TOOL_MANIFEST', `App "${appId}" has a malformed tool manifest: ${parsed.error.message}`));
141
+ const tool = parsed.data.tools.find(t => t.name === toolName);
142
+ if (!tool)
143
+ return res.status(404).json(error(config.nodeId, 'NOT_FOUND', `Tool "${toolName}" not found on app "${appId}"`));
144
+ // Gap 1 = synchronous metered calls → the tool MUST be bound to a capability. Unbound (task) tools are
145
+ // agent-work (metered-per-task, Gap 2) and are offered through the agent-work path, not here.
146
+ if (!tool.action_id)
147
+ return res.status(400).json(error(config.nodeId, 'TOOL_UNBOUND', `Tool "${toolName}" has no capability binding (action_id); only callable tools can be offered as a metered service today`));
148
+ // LEGIBILITY GATE (same as ext-action): input + output schema + usage terms are mandatory to list.
149
+ if (!hasSchema(tool.inputSchema) || !hasSchema(tool.outputSchema)) {
150
+ return res.status(400).json(error(config.nodeId, 'SCHEMA_REQUIRED', `Tool "${appId}/${toolName}" must declare a non-empty inputSchema AND outputSchema before it can be offered on EXCHANGE (a consumer must know what to send and receive)`));
151
+ }
152
+ const usageTerms = parseUsageTerms(b.usage_terms);
153
+ if (!usageTerms)
154
+ return res.status(400).json(error(config.nodeId, 'USAGE_TERMS_REQUIRED', 'usage_terms is required to list an offering — state { derivatives, resale, attribution, note? } so a consumer knows how they may use the output'));
155
+ // Authoritative pricing from the tool's own price/plans.
156
+ const commercial = {
157
+ payMorsels: tool.price && tool.price.morsels > 0 ? tool.price.morsels : undefined,
158
+ payMoney: tool.priceMoney ?? undefined,
159
+ plans: tool.plans,
160
+ };
161
+ const priced = resolveActionPricing(commercial, null);
162
+ if (!priced.ok)
163
+ return res.status(400).json(error(config.nodeId, priced.code, `Tool "${appId}/${toolName}": ${priced.message}`));
164
+ // Snapshot / pin the interface version (idempotent when unchanged; a schema/binding change mints v+1).
165
+ const iface = await ensureInterfaceVersion(storage, providerGhii, appId, toolName, {
166
+ inputSchema: tool.inputSchema ?? {}, outputSchema: tool.outputSchema ?? {}, binding: tool.action_id,
167
+ });
168
+ const coord = appToolCoordinate(owner, appId, toolName);
169
+ const now = new Date().toISOString();
170
+ const offering = {
171
+ offeringId: newOfferingId(), providerGhii, providerOwner: owner,
172
+ kind: 'app-tool', ext: coord.ext, action: coord.action,
173
+ surface: { kind: 'app-tool', ownerName: owner, appId, tool: toolName, ifaceVersion: iface.ifaceVersion },
174
+ title: str(b.title) || `${appId} · ${toolName}`,
175
+ description: str(b.description) || tool.description || '',
176
+ unit: priced.unit, basePrice: priced.pricePerCall, currency: priced.currency,
177
+ plans: commercial.plans ?? [],
178
+ provenance: prov.value, odps: odps.value,
179
+ usageTerms,
180
+ tags: Array.isArray(b.tags) ? b.tags.filter(t => typeof t === 'string') : [],
181
+ state: 'listed', createdAt: now, updatedAt: now,
182
+ };
183
+ await putOffering(storage, offering);
184
+ return res.status(201).json(success(config.nodeId, { offering }));
185
+ }
186
+ // ── kind: agent-work — a provider AGENT sells a task type it performs (metered per delivered task, Gap 2) ──
187
+ if (b.kind === 'agent-work') {
188
+ const agentName = str(b.agent_name), taskType = str(b.task_type);
189
+ if (!agentName || !taskType)
190
+ return res.status(400).json(error(config.nodeId, 'BAD_REQUEST', 'agent_name and task_type are required for an agent-work offering'));
191
+ const agentGaii = `${agentName}#${owner}@${config.nodeId}`;
192
+ const agent = await storage.getAgent(agentGaii);
193
+ if (!agent)
194
+ return res.status(404).json(error(config.nodeId, 'NOT_FOUND', `Agent "${agentName}" not found under your account`));
195
+ // Legibility gate: the task interface (what you send / what the agent delivers) + usage terms are mandatory.
196
+ const inSchema = (b.input_schema && typeof b.input_schema === 'object') ? b.input_schema : {};
197
+ const outSchema = (b.output_schema && typeof b.output_schema === 'object') ? b.output_schema : {};
198
+ if (!hasSchema(inSchema) || !hasSchema(outSchema)) {
199
+ return res.status(400).json(error(config.nodeId, 'SCHEMA_REQUIRED', `Agent-work "${agentName}:${taskType}" must declare a non-empty input_schema AND output_schema (a consumer must know what to send and what the agent delivers)`));
200
+ }
201
+ const usageTerms = parseUsageTerms(b.usage_terms);
202
+ if (!usageTerms)
203
+ return res.status(400).json(error(config.nodeId, 'USAGE_TERMS_REQUIRED', 'usage_terms is required to list an offering — state { derivatives, resale, attribution, note? }'));
204
+ // Pricing is authoritative from the provider (set on the listing): per-task morsels or money + optional plans.
205
+ const commercial = {
206
+ payMorsels: typeof b.price_morsels === 'number' && b.price_morsels > 0 ? Math.floor(b.price_morsels) : undefined,
207
+ payMoney: (b.price_money && typeof b.price_money === 'object') ? b.price_money : undefined,
208
+ plans: Array.isArray(b.plans) ? b.plans : undefined,
209
+ };
210
+ const priced = resolveActionPricing(commercial, null);
211
+ if (!priced.ok)
212
+ return res.status(400).json(error(config.nodeId, priced.code, `Agent-work "${agentName}:${taskType}": ${priced.message}`));
213
+ const providerGhii = resolveIdentity(req.auth, config.nodeId);
214
+ const coord = agentWorkCoordinate(owner, agentName, taskType);
215
+ const now = new Date().toISOString();
216
+ const offering = {
217
+ offeringId: newOfferingId(), providerGhii, providerOwner: owner,
218
+ kind: 'agent-work', ext: coord.ext, action: coord.action,
219
+ surface: { kind: 'agent-work', ownerName: owner, agentName, taskType },
220
+ title: str(b.title) || `${agentName}: ${taskType}`,
221
+ description: str(b.description) || agent.description || '',
222
+ unit: priced.unit, basePrice: priced.pricePerCall, currency: priced.currency,
223
+ plans: commercial.plans ?? [],
224
+ taskSpec: { inputSchema: inSchema, outputSchema: outSchema },
225
+ provenance: prov.value, odps: odps.value,
226
+ usageTerms,
227
+ tags: Array.isArray(b.tags) ? b.tags.filter(t => typeof t === 'string') : [],
228
+ state: 'listed', createdAt: now, updatedAt: now,
229
+ };
230
+ await putOffering(storage, offering);
231
+ return res.status(201).json(success(config.nodeId, { offering }));
232
+ }
233
+ // ── kind: ext-action (default) — the raw data-service surface ──
234
+ const ext = str(b.ext), action = str(b.action);
235
+ if (!ext || !action)
236
+ return res.status(400).json(error(config.nodeId, 'BAD_REQUEST', 'ext and action are required'));
237
+ const extRec = await storage.getExtension(ext);
238
+ if (!extRec)
239
+ return res.status(404).json(error(config.nodeId, 'NOT_FOUND', `Extension "${ext}" not found`));
240
+ if (extRec.installedBy !== owner)
241
+ return res.status(403).json(error(config.nodeId, 'FORBIDDEN', 'Only the extension owner may list it'));
242
+ const act = extRec.actions.find(a => a.id === action);
243
+ if (!act)
244
+ return res.status(404).json(error(config.nodeId, 'NOT_FOUND', `Action "${action}" not found on "${ext}"`));
245
+ const priced = resolveActionPricing(act.commercial, null);
246
+ if (!priced.ok)
247
+ return res.status(400).json(error(config.nodeId, priced.code, priced.message));
248
+ // LEGIBILITY GATE: an offering must be integrable + governed to be listed. The action MUST publish an
249
+ // input AND output schema (so a consumer/agent knows what to send and gets back), and the listing MUST
250
+ // state usage terms (so a consumer knows if they may refine/resell). Enforced at the supply source.
251
+ if (!hasSchema(act.inputSchema) || !hasSchema(act.outputSchema)) {
252
+ return res.status(400).json(error(config.nodeId, 'SCHEMA_REQUIRED', `Action "${ext}/${action}" must publish a non-empty input AND output schema before it can be offered on EXCHANGE (a consumer must know what to send and receive)`));
253
+ }
254
+ const usageTerms = parseUsageTerms(b.usage_terms);
255
+ if (!usageTerms) {
256
+ return res.status(400).json(error(config.nodeId, 'USAGE_TERMS_REQUIRED', 'usage_terms is required to list an offering — state { derivatives, resale, attribution, note? } so a consumer knows how they may use the output'));
257
+ }
258
+ const now = new Date().toISOString();
259
+ const offering = {
260
+ offeringId: newOfferingId(),
261
+ providerGhii: resolveIdentity(req.auth, config.nodeId),
262
+ providerOwner: owner,
263
+ kind: 'ext-action', surface: null,
264
+ ext, action,
265
+ title: str(b.title) || `${ext}/${action}`,
266
+ description: str(b.description),
267
+ unit: priced.unit, basePrice: priced.pricePerCall, currency: priced.currency,
268
+ plans: act.commercial?.plans ?? [],
269
+ provenance: prov.value, odps: odps.value,
270
+ usageTerms,
271
+ tags: Array.isArray(b.tags) ? b.tags.filter(t => typeof t === 'string') : [],
272
+ state: 'listed', createdAt: now, updatedAt: now,
273
+ };
274
+ await putOffering(storage, offering);
275
+ return res.status(201).json(success(config.nodeId, { offering }));
276
+ });
277
+ /**
278
+ * The full decision + integration context for one offering: the capability's I/O SCHEMA, the CALL RECIPE
279
+ * (the contract IS the access — you call as yourself, no API key) and the usage STATS. Shared by the JSON
280
+ * detail route and the ODPS projection, so the two can never describe the same offering differently.
281
+ */
282
+ async function offeringContext(o) {
283
+ const stats = await offeringStats(storage, o);
284
+ // The listing is the source for app-tool and agent-work (the provider authored it there); a raw ext
285
+ // action is read live from the extension below, the same way its price is.
286
+ const tollMorsels = o.tollMorsels ?? null;
287
+ // app-tool: the capability schema is the PINNED interface snapshot; the call goes to the WebMCP invoke
288
+ // endpoint (the accepted contract meters it). This is the freeze made visible — the version is explicit.
289
+ if (o.kind === 'app-tool' && o.surface && o.surface.kind === 'app-tool') {
290
+ const s = o.surface;
291
+ const iface = await getInterfaceVersion(storage, o.providerGhii, s.appId, s.tool, s.ifaceVersion);
292
+ return {
293
+ capability: iface ? {
294
+ kind: 'app-tool', app: `${s.ownerName}/${s.appId}`, tool: s.tool, iface_version: s.ifaceVersion,
295
+ input_schema: iface.inputSchema, output_schema: iface.outputSchema,
296
+ } : null,
297
+ iface: iface ? { inputSchema: iface.inputSchema, outputSchema: iface.outputSchema } : null,
298
+ callRecipe: {
299
+ method: 'POST',
300
+ url: `/v1/apps/${encodeURIComponent(s.ownerName)}/${encodeURIComponent(s.appId)}/webmcp/tools/${encodeURIComponent(s.tool)}`,
301
+ auth: 'Your own AIMEAT token — the accepted contract (metered entitlement) authorises the call; no separate API key is issued.',
302
+ note: `Each call is metered + charged to your budget at the provider price. The contract is pinned to interface v${s.ifaceVersion}; the provider may ship newer app versions without breaking your integration.`,
303
+ body: '{ "input": { … } }',
304
+ },
305
+ stats, tollMorsels,
306
+ };
307
+ }
308
+ // agent-work: the "capability" is the task interface; the call recipe is "start work → agent delivers".
309
+ if (o.kind === 'agent-work' && o.surface && o.surface.kind === 'agent-work') {
310
+ const s = o.surface;
311
+ return {
312
+ capability: o.taskSpec ? { kind: 'agent-work', agent: `${s.ownerName}/${s.agentName}`, task_type: s.taskType,
313
+ input_schema: o.taskSpec.inputSchema, output_schema: o.taskSpec.outputSchema } : null,
314
+ iface: o.taskSpec ? { inputSchema: o.taskSpec.inputSchema, outputSchema: o.taskSpec.outputSchema } : null,
315
+ callRecipe: {
316
+ method: 'POST', url: '/v1/exchange/work',
317
+ body: `{ "offering_id": "${o.offeringId}", "input": { … } }`,
318
+ auth: 'Your own AIMEAT token — the accepted contract authorises starting work; no separate API key.',
319
+ note: `Async: you START a task, the provider agent (${s.agentName}) DELIVERS, and you are charged the per-task price ON DELIVERY (metered + rake against your budget).`,
320
+ },
321
+ stats, tollMorsels,
322
+ };
323
+ }
324
+ // ext-action: schema comes live from the provider's extension action.
325
+ const extRec = await storage.getExtension(o.ext);
326
+ const act = extRec?.actions.find(a => a.id === o.action);
327
+ return {
328
+ capability: act ? {
329
+ input_schema: act.inputSchema ?? {},
330
+ output_schema: act.outputSchema ?? {},
331
+ toll_morsels: act.tollMorsels ?? 0,
332
+ } : null,
333
+ iface: act ? { inputSchema: (act.inputSchema ?? {}), outputSchema: (act.outputSchema ?? {}) } : null,
334
+ callRecipe: {
335
+ method: 'POST',
336
+ url: `/v1/ext/${o.ext}/${o.action}`,
337
+ auth: 'Your own AIMEAT token — the accepted contract (metered entitlement) authorises the call; no separate API key is issued.',
338
+ note: 'Each call is metered + charged to your budget at the provider price; the provider’s own upstream keys stay server-side.',
339
+ mcp: `aimeat_extension_invoke { "name": "${o.ext}", "action": "${o.action}", "input": { … } }`,
340
+ },
341
+ stats, tollMorsels: act?.tollMorsels ?? null,
342
+ };
343
+ }
344
+ /**
345
+ * Offering DETAIL (public) — everything a human or agent needs to decide + integrate: the I/O SCHEMA of
346
+ * the underlying action, the CALL RECIPE (the contract IS the access — you call as yourself, no API key),
347
+ * usage terms, provenance, and usage STATS (reputation). One call, so the app/agent needn't stitch it.
348
+ */
349
+ router.get('/v1/exchange/offerings/:id', async (req, res) => {
350
+ const o = await getOffering(storage, str(req.params.id));
351
+ if (!o)
352
+ return res.status(404).json(error(config.nodeId, 'NOT_FOUND', 'No such offering'));
353
+ const ctx = await offeringContext(o);
354
+ return res.json(success(config.nodeId, {
355
+ offering: o, capability: ctx.capability, call_recipe: ctx.callRecipe, stats: ctx.stats,
356
+ // Stated before the contract is signed, because it changes what a call costs the CONSUMER even
357
+ // though it moves nothing to the provider. `source` says who set it: the seller, or the node.
358
+ pacing: {
359
+ toll_morsels: resolvePacingToll(config, ctx.tollMorsels),
360
+ source: typeof ctx.tollMorsels === 'number' && ctx.tollMorsels >= 0 ? 'capability' : 'node',
361
+ note: 'Morsels burned per call to bound consumption rate. A burn, not revenue: nobody is credited it, '
362
+ + 'and calling your own capability is free.',
363
+ },
364
+ odps: { version: ODPS_VERSION, url: `/v1/exchange/offerings/${o.offeringId}/odps.yaml` },
365
+ }));
366
+ });
367
+ /**
368
+ * The offering as an **Open Data Product Specification v4.1** document (opendataproducts.org, Linux
369
+ * Foundation) — the interoperable descriptor an outside catalogue or a negotiating agent can read without
370
+ * knowing anything about AIMEAT. Public, like the listing itself. Derived on read (never stored in ODPS
371
+ * form), so it cannot drift from the offering it describes. `.yaml` serves the spec's native format;
372
+ * `/odps` serves the same document as JSON inside the standard AIMEAT envelope (`?format=yaml` for raw).
373
+ * AIMEAT-specific truth (metered coordinate, pinned interface, provenance, observed usage) travels under
374
+ * `product.x-aimeat`, which keeps the document valid against the official schema.
375
+ */
376
+ async function serveOdps(req, res, format) {
377
+ const o = await getOffering(storage, str(req.params.id));
378
+ if (!o)
379
+ return res.status(404).json(error(config.nodeId, 'NOT_FOUND', 'No such offering'));
380
+ const ctx = await offeringContext(o);
381
+ const doc = offeringToOdps({
382
+ offering: o, iface: ctx.iface, callRecipe: ctx.callRecipe, stats: ctx.stats,
383
+ rakePercent: commerceFeePercent(config), baseUrl: config.baseUrl, nodeId: config.nodeId,
384
+ });
385
+ if (format === 'json')
386
+ return res.json(success(config.nodeId, { odps_version: ODPS_VERSION, odps: doc }));
387
+ res.type('text/yaml; charset=utf-8');
388
+ return res.send(odpsToYaml(doc));
389
+ }
390
+ router.get('/v1/exchange/offerings/:id/odps.yaml', (req, res) => serveOdps(req, res, 'yaml'));
391
+ router.get('/v1/exchange/offerings/:id/odps', (req, res) => serveOdps(req, res, str(req.query.format) === 'yaml' ? 'yaml' : 'json'));
392
+ /**
393
+ * Offering CONSUMERS (provider lineage) — who holds a contract against my offering, how much they consumed,
394
+ * when they last used it. Provider-only: "where is my data used, by whom?".
395
+ */
396
+ router.get('/v1/exchange/offerings/:id/consumers', requireAuth(), async (req, res) => {
397
+ const o = await getOffering(storage, str(req.params.id));
398
+ if (!o || o.providerOwner !== req.auth.owner)
399
+ return res.status(404).json(error(config.nodeId, 'NOT_FOUND', 'No such offering of yours'));
400
+ const consumers = await offeringConsumers(storage, o);
401
+ return res.json(success(config.nodeId, { offeringId: o.offeringId, consumers, count: consumers.length }));
402
+ });
403
+ /** Browse listed offerings (matching a capability or free text). Public. `?stats=1` folds in usage/reputation. */
404
+ router.get('/v1/exchange/offerings', async (req, res) => {
405
+ // Safety net for the source-of-truth model: bring the CALLER's own projections up to date before
406
+ // they read the market (bounded to one owner — a browse never reconciles the whole node).
407
+ if (req.auth) {
408
+ await reconcileOwnerOfferingsThrottled(storage, resolveIdentity(req.auth, config.nodeId))
409
+ .catch(() => { });
410
+ }
411
+ const ext = str(req.query.ext), action = str(req.query.action), q = str(req.query.q);
412
+ const offerings = (ext && action) || q
413
+ ? await matchOfferings(storage, { ext: ext || null, action: action || null, text: q || null })
414
+ : await listOfferings(storage);
415
+ if (str(req.query.stats) === '1') {
416
+ const withStats = await Promise.all(offerings.map(async (o) => ({ ...o, stats: await offeringStats(storage, o) })));
417
+ return res.json(success(config.nodeId, { offerings: withStats, count: withStats.length }));
418
+ }
419
+ return res.json(success(config.nodeId, { offerings, count: offerings.length }));
420
+ });
421
+ /**
422
+ * Delist an offering (owner only). A PROJECTED listing (`auto`) exists because its source says so, so
423
+ * delisting it by hand would come straight back on the next reconcile — the honest answer is to turn the
424
+ * source's `exchange` flag off, and that is what this reports (409) instead of lying about the outcome.
425
+ */
426
+ router.delete('/v1/exchange/offerings/:id', requireAuth(), async (req, res) => {
427
+ const o = await getOffering(storage, str(req.params.id));
428
+ if (!o || o.providerOwner !== req.auth.owner)
429
+ return res.status(404).json(error(config.nodeId, 'NOT_FOUND', 'No such offering of yours'));
430
+ if (o.auto && str(req.query.force) !== '1') {
431
+ return res.status(409).json(error(config.nodeId, 'SOURCE_MANAGED', `This listing is projected from its source (${o.ext}/${o.action}). Turn "exchange" off there (app-catalog → app details → app tools, the extension action, or the agent offer) and it is removed. Pass ?force=1 to delist until the next reconcile.`));
432
+ }
433
+ await deleteOffering(storage, o.offeringId);
434
+ return res.json(success(config.nodeId, { offeringId: o.offeringId, state: 'delisted' }));
435
+ });
436
+ /**
437
+ * Reconcile the caller's own listings against their sources (TARGET-050). Normally automatic — writing a
438
+ * tool manifest, an extension or an offer projects it — this is the explicit handle: a `dry_run` report
439
+ * before anything changes, and `migrate` to adopt hand-authored listings into the projection model
440
+ * (flag their source, keep their offeringId so existing contracts keep resolving).
441
+ */
442
+ router.post('/v1/exchange/reconcile', requireAuth(), async (req, res) => {
443
+ const b = (req.body ?? {});
444
+ const dryRun = b.dry_run === true || str(req.query.dry_run) === '1';
445
+ const migrate = b.migrate === true || str(req.query.migrate) === '1';
446
+ const ownerGhii = resolveIdentity(req.auth, config.nodeId);
447
+ const report = migrate
448
+ ? await migrateLegacyOfferings(storage, ownerGhii, { dryRun })
449
+ : await reconcileOwnerOfferings(storage, ownerGhii, {
450
+ dryRun,
451
+ ...(str(b.app_id) ? { appId: str(b.app_id) } : {}),
452
+ ...(str(b.ext) ? { extName: str(b.ext) } : {}),
453
+ ...(str(b.agent) ? { agentName: str(b.agent) } : {}),
454
+ });
455
+ return res.json(success(config.nodeId, report, [
456
+ { description: 'Browse the marketplace', method: 'GET', url: '/v1/exchange/offerings' },
457
+ ]));
458
+ });
459
+ // ── NEEDS (demand) ──────────────────────────────────────────────────────────
460
+ /** Post an open need. Providers browse open needs and bid. */
461
+ router.post('/v1/exchange/needs', requireAuth(), async (req, res) => {
462
+ const b = (req.body ?? {});
463
+ const description = str(b.description);
464
+ if (!description)
465
+ return res.status(400).json(error(config.nodeId, 'BAD_REQUEST', 'description is required'));
466
+ // A need is ALWAYS posted on behalf of a specific app — the app that needs data/a method it can't produce
467
+ // itself. This binds the demand to a requester a provider can judge (per the emergent app-to-app market).
468
+ const appId = str(b.app_id);
469
+ if (!appId)
470
+ return res.status(400).json(error(config.nodeId, 'NEED_APP_REQUIRED', 'app_id is required — a need is posted on behalf of the specific app that needs the data (owner/filename)'));
471
+ const budgetUnit = b.budget_unit === 'money' || b.budget_unit === 'morsels' ? b.budget_unit : null;
472
+ const now = new Date().toISOString();
473
+ const need = {
474
+ needId: newNeedId(),
475
+ requesterGaii: resolveIdentity(req.auth, config.nodeId),
476
+ requesterOwner: req.auth.owner,
477
+ appId,
478
+ ext: str(b.ext) || null, action: str(b.action) || null,
479
+ description,
480
+ spec: parseNeedSpec(b.spec),
481
+ usageIntent: str(b.usage_intent) || null,
482
+ budgetUnit, budgetCap: posOrNull(b.budget_cap),
483
+ autonomy: b.autonomy === 'auto' ? 'auto' : 'supervised',
484
+ state: 'open', createdAt: now, updatedAt: now,
485
+ };
486
+ await putNeed(storage, need);
487
+ // Surface offerings that already satisfy it (so the requester can accept directly, no bid needed).
488
+ const matches = await matchOfferings(storage, { ext: need.ext, action: need.action, text: need.description });
489
+ return res.status(201).json(success(config.nodeId, { need, matches: matches.slice(0, 10) }));
490
+ });
491
+ /** Browse needs. `?open=1` for open only; `?mine=1` for the caller's own (auth then). */
492
+ router.get('/v1/exchange/needs', async (req, res) => {
493
+ const openOnly = str(req.query.open) === '1';
494
+ const mine = str(req.query.mine) === '1';
495
+ const owner = mine ? (req.auth?.owner ?? undefined) : undefined;
496
+ const needs = await enrichNeeds(storage, await listNeeds(storage, { openOnly, owner }));
497
+ return res.json(success(config.nodeId, { needs, count: needs.length }));
498
+ });
499
+ /** Close a need (requester only). */
500
+ router.post('/v1/exchange/needs/:id/close', requireAuth(), async (req, res) => {
501
+ const n = await getNeed(storage, str(req.params.id));
502
+ if (!n || n.requesterOwner !== req.auth.owner)
503
+ return res.status(404).json(error(config.nodeId, 'NOT_FOUND', 'No such need of yours'));
504
+ n.state = 'closed';
505
+ n.updatedAt = new Date().toISOString();
506
+ await putNeed(storage, n);
507
+ return res.json(success(config.nodeId, { needId: n.needId, state: 'closed' }));
508
+ });
509
+ // ── BIDS ────────────────────────────────────────────────────────────────────
510
+ /** A provider bids on an open need (must own the bid's extension). */
511
+ router.post('/v1/exchange/needs/:id/bids', requireAuth(), async (req, res) => {
512
+ const owner = req.auth.owner;
513
+ const n = await getNeed(storage, str(req.params.id));
514
+ if (!n)
515
+ return res.status(404).json(error(config.nodeId, 'NOT_FOUND', 'No such need'));
516
+ if (n.state !== 'open')
517
+ return res.status(409).json(error(config.nodeId, 'NEED_CLOSED', `Need is ${n.state}`));
518
+ const b = (req.body ?? {});
519
+ const ext = str(b.ext), action = str(b.action);
520
+ if (!ext || !action)
521
+ return res.status(400).json(error(config.nodeId, 'BAD_REQUEST', 'ext and action are required'));
522
+ const extRec = await storage.getExtension(ext);
523
+ if (!extRec || extRec.installedBy !== owner)
524
+ return res.status(403).json(error(config.nodeId, 'FORBIDDEN', 'Bid only with an action your extension owns'));
525
+ if (!extRec.actions.find(a => a.id === action))
526
+ return res.status(404).json(error(config.nodeId, 'NOT_FOUND', `Action "${action}" not found`));
527
+ const bid = {
528
+ bidId: newBidId(), needId: n.needId,
529
+ bidderGhii: resolveIdentity(req.auth, config.nodeId), bidderOwner: owner,
530
+ offeringId: str(b.offering_id) || null, ext, action,
531
+ planId: str(b.plan_id) || null, note: str(b.note),
532
+ state: 'open', createdAt: new Date().toISOString(),
533
+ };
534
+ await putBid(storage, bid);
535
+ return res.status(201).json(success(config.nodeId, { bid }));
536
+ });
537
+ /** List bids on a need (public). */
538
+ router.get('/v1/exchange/needs/:id/bids', async (req, res) => {
539
+ const bids = await listBids(storage, str(req.params.id));
540
+ return res.json(success(config.nodeId, { bids, count: bids.length }));
541
+ });
542
+ /** The requester accepts a bid → mints the entitlement (consumer = requester, provider = bidder). */
543
+ router.post('/v1/exchange/needs/:id/bids/:bidId/accept', requireAuth(), async (req, res) => {
544
+ const owner = req.auth.owner;
545
+ const consumerGaii = resolveIdentity(req.auth, config.nodeId);
546
+ const n = await getNeed(storage, str(req.params.id));
547
+ if (!n || n.requesterOwner !== owner)
548
+ return res.status(404).json(error(config.nodeId, 'NOT_FOUND', 'No such need of yours'));
549
+ const bid = await getBid(storage, n.needId, str(req.params.bidId));
550
+ if (!bid || bid.state !== 'open')
551
+ return res.status(404).json(error(config.nodeId, 'NOT_FOUND', 'No such open bid'));
552
+ const extRec = await storage.getExtension(bid.ext);
553
+ const act = extRec?.actions.find(a => a.id === bid.action);
554
+ if (!extRec || !act)
555
+ return res.status(404).json(error(config.nodeId, 'NOT_FOUND', 'Bid capability no longer exists'));
556
+ const priced = resolveActionPricing(act.commercial, bid.planId);
557
+ if (!priced.ok)
558
+ return res.status(400).json(error(config.nodeId, priced.code, priced.message));
559
+ const capCap = posOrNull((req.body ?? {})?.cap_units) ?? n.budgetCap;
560
+ const existing = await readEntitlementForCall(storage, consumerGaii, bid.ext, bid.action);
561
+ const ent = await createEntitlement(storage, {
562
+ consumerGaii, appId: n.appId, providerGhii: `${extRec.installedBy}@${config.nodeId}`,
563
+ ext: bid.ext, action: bid.action, capabilityLabel: `${bid.ext}/${bid.action}`,
564
+ unit: priced.unit, pricePerCall: priced.pricePerCall, currency: priced.currency, pricing: priced.pricing,
565
+ capUnits: capCap, contractRef: `bid:${bid.bidId}`, tollMorsels: act.tollMorsels ?? null,
566
+ createdBy: owner, carrySpend: existing,
567
+ });
568
+ // Mark the bid accepted + the need matched (append updates; other bids stay for the record).
569
+ bid.state = 'accepted';
570
+ await putBid(storage, bid);
571
+ n.state = 'matched';
572
+ n.updatedAt = new Date().toISOString();
573
+ await putNeed(storage, n);
574
+ return res.status(201).json(success(config.nodeId, { entitlement_id: ent.entitlementId, ext: ent.ext, action: ent.action, unit: ent.unit, pricing: ent.pricing }, [
575
+ { description: 'This app’s cost & contracts', method: 'GET', url: n.appId ? `/v1/apps/cost?app_id=${encodeURIComponent(n.appId)}` : '/v1/exchange/entitlements' },
576
+ ]));
577
+ });
578
+ return router;
579
+ }
580
+ //# sourceMappingURL=exchange-market.js.map