aimeat 2.1.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 (422) hide show
  1. package/dist/.env.example +9 -4
  2. package/dist/locales/en.json +28 -0
  3. package/dist/locales/fi.json +28 -0
  4. package/dist/public/cortex-bundled/aimeat-charts.js +158 -10
  5. package/dist/public/cortex-bundled/aimeat-charts.yaml +1 -1
  6. package/dist/public/cortex-bundled/aimeat-dag.js +515 -173
  7. package/dist/public/cortex-bundled/aimeat-dag.yaml +1 -1
  8. package/dist/public/cortex-bundled/aimeat-i18n.js +6 -1
  9. package/dist/public/cortex-bundled/aimeat-i18n.yaml +1 -1
  10. package/dist/public/cortex-bundled/aimeat-surface.js +577 -0
  11. package/dist/public/cortex-bundled/aimeat-surface.yaml +107 -0
  12. package/dist/public/cortex-bundled/aimeat-viewport.js +405 -0
  13. package/dist/public/cortex-bundled/aimeat-viewport.yaml +100 -0
  14. package/dist/public/css/views/inbox.css +1 -1
  15. package/dist/public/css/views/profile.css +9 -0
  16. package/dist/public/lib/VENDORED.md +6 -3
  17. package/dist/public/lib/aimeat-daisyui-bridge.css +39 -2
  18. package/dist/public/lib/aimeat-theme.css +538 -0
  19. package/dist/public/lib/fonts/LICENSE.md +11 -4
  20. package/dist/public/lib/fonts/fraunces-var-latin-ext.woff2 +0 -0
  21. package/dist/public/lib/fonts/fraunces-var-latin.woff2 +0 -0
  22. package/dist/public/lib/fonts/inter-var-latin-ext.woff2 +0 -0
  23. package/dist/public/lib/fonts/inter-var-latin.woff2 +0 -0
  24. package/dist/public/lib/fonts/jetbrains-mono-var-latin-ext.woff2 +0 -0
  25. package/dist/public/lib/fonts/jetbrains-mono-var-latin.woff2 +0 -0
  26. package/dist/public/lib/fonts/space-grotesk-var-latin-ext.woff2 +0 -0
  27. package/dist/public/lib/fonts/space-grotesk-var-latin.woff2 +0 -0
  28. package/dist/public/lib/samples/theme-check.html +92 -0
  29. package/dist/public/lib/samples/themes-boot.js +20 -0
  30. package/dist/public/lib/samples/themes.html +154 -0
  31. package/dist/public/lib/samples/themes.js +60 -0
  32. package/dist/public/views/profile/access-tab/connected-apps.js +81 -5
  33. package/dist/public/views/profile/extensions-tab.maturity.js +4 -1
  34. package/dist/public/views/profile/inbox-tab/components.js +17 -1
  35. package/dist/public/views/profile/inbox-tab/use-thread-ux.js +29 -2
  36. package/dist/public/views/profile/libraries-tab.js +10 -2
  37. package/dist/public/views/profile/wallet-tab.js +64 -0
  38. package/dist/scripts/check-openapi.d.ts +2 -0
  39. package/dist/scripts/check-openapi.d.ts.map +1 -0
  40. package/dist/scripts/check-openapi.js +139 -0
  41. package/dist/scripts/check-openapi.js.map +1 -0
  42. package/dist/scripts/embed-viewport.d.ts +23 -0
  43. package/dist/scripts/embed-viewport.d.ts.map +1 -0
  44. package/dist/scripts/embed-viewport.js +116 -0
  45. package/dist/scripts/embed-viewport.js.map +1 -0
  46. package/dist/src/auth/sse-domain-scopes.d.ts +50 -0
  47. package/dist/src/auth/sse-domain-scopes.d.ts.map +1 -0
  48. package/dist/src/auth/sse-domain-scopes.js +111 -0
  49. package/dist/src/auth/sse-domain-scopes.js.map +1 -0
  50. package/dist/src/cli/connect/mcp/tools/agent-tasks.d.ts.map +1 -1
  51. package/dist/src/cli/connect/mcp/tools/agent-tasks.js +4 -1
  52. package/dist/src/cli/connect/mcp/tools/agent-tasks.js.map +1 -1
  53. package/dist/src/cli/connect/mcp/tools/core.d.ts.map +1 -1
  54. package/dist/src/cli/connect/mcp/tools/core.js +14 -3
  55. package/dist/src/cli/connect/mcp/tools/core.js.map +1 -1
  56. package/dist/src/cli/connect/mcp/tools/workspaces.d.ts +3 -0
  57. package/dist/src/cli/connect/mcp/tools/workspaces.d.ts.map +1 -1
  58. package/dist/src/cli/connect/mcp/tools/workspaces.js +4 -2
  59. package/dist/src/cli/connect/mcp/tools/workspaces.js.map +1 -1
  60. package/dist/src/cli/connect/tool-call-defs-core.d.ts.map +1 -1
  61. package/dist/src/cli/connect/tool-call-defs-core.js +13 -1
  62. package/dist/src/cli/connect/tool-call-defs-core.js.map +1 -1
  63. package/dist/src/commerce/__tests__/x402-registry.test.d.ts +2 -0
  64. package/dist/src/commerce/__tests__/x402-registry.test.d.ts.map +1 -0
  65. package/dist/src/commerce/__tests__/x402-registry.test.js +105 -0
  66. package/dist/src/commerce/__tests__/x402-registry.test.js.map +1 -0
  67. package/dist/src/commerce/evm-address.d.ts +21 -0
  68. package/dist/src/commerce/evm-address.d.ts.map +1 -0
  69. package/dist/src/commerce/evm-address.js +94 -0
  70. package/dist/src/commerce/evm-address.js.map +1 -0
  71. package/dist/src/commerce/money.d.ts +18 -5
  72. package/dist/src/commerce/money.d.ts.map +1 -1
  73. package/dist/src/commerce/money.js +27 -6
  74. package/dist/src/commerce/money.js.map +1 -1
  75. package/dist/src/commerce/x402-facilitator.d.ts +64 -13
  76. package/dist/src/commerce/x402-facilitator.d.ts.map +1 -1
  77. package/dist/src/commerce/x402-facilitator.js +71 -19
  78. package/dist/src/commerce/x402-facilitator.js.map +1 -1
  79. package/dist/src/commerce/x402-handler.d.ts +13 -7
  80. package/dist/src/commerce/x402-handler.d.ts.map +1 -1
  81. package/dist/src/commerce/x402-handler.js +23 -10
  82. package/dist/src/commerce/x402-handler.js.map +1 -1
  83. package/dist/src/commerce/x402.d.ts +11 -6
  84. package/dist/src/commerce/x402.d.ts.map +1 -1
  85. package/dist/src/commerce/x402.js +10 -7
  86. package/dist/src/commerce/x402.js.map +1 -1
  87. package/dist/src/config-types.d.ts +12 -0
  88. package/dist/src/config-types.d.ts.map +1 -1
  89. package/dist/src/config.d.ts.map +1 -1
  90. package/dist/src/config.js +8 -0
  91. package/dist/src/config.js.map +1 -1
  92. package/dist/src/data/app-templates/shells.d.ts +11 -3
  93. package/dist/src/data/app-templates/shells.d.ts.map +1 -1
  94. package/dist/src/data/app-templates/shells.js +87 -6
  95. package/dist/src/data/app-templates/shells.js.map +1 -1
  96. package/dist/src/data/app-templates.js +2 -2
  97. package/dist/src/data/app-templates.js.map +1 -1
  98. package/dist/src/data/library-packs/cortex.d.ts.map +1 -1
  99. package/dist/src/data/library-packs/cortex.js +108 -5
  100. package/dist/src/data/library-packs/cortex.js.map +1 -1
  101. package/dist/src/data/library-packs/sdk.d.ts.map +1 -1
  102. package/dist/src/data/library-packs/sdk.js +32 -8
  103. package/dist/src/data/library-packs/sdk.js.map +1 -1
  104. package/dist/src/data/library-packs/vendored.d.ts.map +1 -1
  105. package/dist/src/data/library-packs/vendored.js +83 -6
  106. package/dist/src/data/library-packs/vendored.js.map +1 -1
  107. package/dist/src/generated/api-types.d.ts +478 -19
  108. package/dist/src/generated/api-types.d.ts.map +1 -1
  109. package/dist/src/mcp/agent-tasks.d.ts +4 -0
  110. package/dist/src/mcp/agent-tasks.d.ts.map +1 -1
  111. package/dist/src/mcp/agent-tasks.js +20 -2
  112. package/dist/src/mcp/agent-tasks.js.map +1 -1
  113. package/dist/src/mcp/capabilities.d.ts +7 -1
  114. package/dist/src/mcp/capabilities.d.ts.map +1 -1
  115. package/dist/src/mcp/capabilities.js +5 -2
  116. package/dist/src/mcp/capabilities.js.map +1 -1
  117. package/dist/src/mcp/catalog/definitions/commerce.d.ts.map +1 -1
  118. package/dist/src/mcp/catalog/definitions/commerce.js +4 -2
  119. package/dist/src/mcp/catalog/definitions/commerce.js.map +1 -1
  120. package/dist/src/mcp/catalog/definitions/discovery-work-boards.d.ts.map +1 -1
  121. package/dist/src/mcp/catalog/definitions/discovery-work-boards.js +4 -3
  122. package/dist/src/mcp/catalog/definitions/discovery-work-boards.js.map +1 -1
  123. package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.js +1 -1
  124. package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.js.map +1 -1
  125. package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.d.ts.map +1 -1
  126. package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.js +3 -2
  127. package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.js.map +1 -1
  128. package/dist/src/mcp/catalog/output-schemas.d.ts +6 -1
  129. package/dist/src/mcp/catalog/output-schemas.d.ts.map +1 -1
  130. package/dist/src/mcp/catalog/output-schemas.js +6 -1
  131. package/dist/src/mcp/catalog/output-schemas.js.map +1 -1
  132. package/dist/src/mcp/commerce.d.ts.map +1 -1
  133. package/dist/src/mcp/commerce.js +15 -3
  134. package/dist/src/mcp/commerce.js.map +1 -1
  135. package/dist/src/mcp/core-storage.d.ts +23 -0
  136. package/dist/src/mcp/core-storage.d.ts.map +1 -0
  137. package/dist/src/mcp/core-storage.js +157 -0
  138. package/dist/src/mcp/core-storage.js.map +1 -0
  139. package/dist/src/mcp/core.d.ts +16 -0
  140. package/dist/src/mcp/core.d.ts.map +1 -1
  141. package/dist/src/mcp/core.js +75 -119
  142. package/dist/src/mcp/core.js.map +1 -1
  143. package/dist/src/mcp/dm-messages.d.ts +4 -0
  144. package/dist/src/mcp/dm-messages.d.ts.map +1 -1
  145. package/dist/src/mcp/dm-messages.js +43 -2
  146. package/dist/src/mcp/dm-messages.js.map +1 -1
  147. package/dist/src/mcp/exchange.d.ts.map +1 -1
  148. package/dist/src/mcp/exchange.js +3 -2
  149. package/dist/src/mcp/exchange.js.map +1 -1
  150. package/dist/src/mcp/extensions.d.ts.map +1 -1
  151. package/dist/src/mcp/extensions.js +6 -2
  152. package/dist/src/mcp/extensions.js.map +1 -1
  153. package/dist/src/mcp/index.d.ts +5 -0
  154. package/dist/src/mcp/index.d.ts.map +1 -1
  155. package/dist/src/mcp/index.js +23 -4
  156. package/dist/src/mcp/index.js.map +1 -1
  157. package/dist/src/mcp/memory-namespace-hints.d.ts +33 -0
  158. package/dist/src/mcp/memory-namespace-hints.d.ts.map +1 -0
  159. package/dist/src/mcp/memory-namespace-hints.js +60 -0
  160. package/dist/src/mcp/memory-namespace-hints.js.map +1 -0
  161. package/dist/src/mcp/workspaces.d.ts +5 -0
  162. package/dist/src/mcp/workspaces.d.ts.map +1 -1
  163. package/dist/src/mcp/workspaces.js +5 -3
  164. package/dist/src/mcp/workspaces.js.map +1 -1
  165. package/dist/src/models/agent-task-schemas.d.ts +25 -3
  166. package/dist/src/models/agent-task-schemas.d.ts.map +1 -1
  167. package/dist/src/models/agent-task-schemas.js +16 -0
  168. package/dist/src/models/agent-task-schemas.js.map +1 -1
  169. package/dist/src/models/app-tool-schemas.d.ts +518 -1
  170. package/dist/src/models/app-tool-schemas.d.ts.map +1 -1
  171. package/dist/src/models/app-tool-schemas.js +53 -1
  172. package/dist/src/models/app-tool-schemas.js.map +1 -1
  173. package/dist/src/models/odps-schemas.d.ts +305 -0
  174. package/dist/src/models/odps-schemas.d.ts.map +1 -0
  175. package/dist/src/models/odps-schemas.js +182 -0
  176. package/dist/src/models/odps-schemas.js.map +1 -0
  177. package/dist/src/models/offer-schemas.d.ts +357 -2
  178. package/dist/src/models/offer-schemas.d.ts.map +1 -1
  179. package/dist/src/models/offer-schemas.js +37 -0
  180. package/dist/src/models/offer-schemas.js.map +1 -1
  181. package/dist/src/models/schemas.d.ts +6 -3
  182. package/dist/src/models/schemas.d.ts.map +1 -1
  183. package/dist/src/models/schemas.js +10 -1
  184. package/dist/src/models/schemas.js.map +1 -1
  185. package/dist/src/models/webhook-schemas.d.ts +8 -8
  186. package/dist/src/routes/agent-tasks/create-read.d.ts +4 -0
  187. package/dist/src/routes/agent-tasks/create-read.d.ts.map +1 -1
  188. package/dist/src/routes/agent-tasks/create-read.js +20 -1
  189. package/dist/src/routes/agent-tasks/create-read.js.map +1 -1
  190. package/dist/src/routes/agent-tasks/lifecycle.d.ts.map +1 -1
  191. package/dist/src/routes/agent-tasks/lifecycle.js +10 -0
  192. package/dist/src/routes/agent-tasks/lifecycle.js.map +1 -1
  193. package/dist/src/routes/agents/offers.d.ts +2 -0
  194. package/dist/src/routes/agents/offers.d.ts.map +1 -1
  195. package/dist/src/routes/agents/offers.js +0 -0
  196. package/dist/src/routes/agents/offers.js.map +1 -1
  197. package/dist/src/routes/app-grants.d.ts +6 -0
  198. package/dist/src/routes/app-grants.d.ts.map +1 -1
  199. package/dist/src/routes/app-grants.js +55 -25
  200. package/dist/src/routes/app-grants.js.map +1 -1
  201. package/dist/src/routes/apps/drafts.d.ts +3 -0
  202. package/dist/src/routes/apps/drafts.d.ts.map +1 -1
  203. package/dist/src/routes/apps/drafts.js +63 -1
  204. package/dist/src/routes/apps/drafts.js.map +1 -1
  205. package/dist/src/routes/apps/publish.d.ts +2 -0
  206. package/dist/src/routes/apps/publish.d.ts.map +1 -1
  207. package/dist/src/routes/apps/publish.js +17 -2
  208. package/dist/src/routes/apps/publish.js.map +1 -1
  209. package/dist/src/routes/commerce.d.ts.map +1 -1
  210. package/dist/src/routes/commerce.js +122 -2
  211. package/dist/src/routes/commerce.js.map +1 -1
  212. package/dist/src/routes/exchange-market.d.ts +6 -2
  213. package/dist/src/routes/exchange-market.d.ts.map +1 -1
  214. package/dist/src/routes/exchange-market.js +154 -28
  215. package/dist/src/routes/exchange-market.js.map +1 -1
  216. package/dist/src/routes/exchange.d.ts.map +1 -1
  217. package/dist/src/routes/exchange.js +5 -2
  218. package/dist/src/routes/exchange.js.map +1 -1
  219. package/dist/src/routes/extensions/actions.d.ts.map +1 -1
  220. package/dist/src/routes/extensions/actions.js +18 -0
  221. package/dist/src/routes/extensions/actions.js.map +1 -1
  222. package/dist/src/routes/extensions/crud.d.ts.map +1 -1
  223. package/dist/src/routes/extensions/crud.js +36 -3
  224. package/dist/src/routes/extensions/crud.js.map +1 -1
  225. package/dist/src/routes/extensions/entitlement-gate.d.ts.map +1 -1
  226. package/dist/src/routes/extensions/entitlement-gate.js +13 -0
  227. package/dist/src/routes/extensions/entitlement-gate.js.map +1 -1
  228. package/dist/src/routes/extensions/manifest.d.ts +6 -0
  229. package/dist/src/routes/extensions/manifest.d.ts.map +1 -1
  230. package/dist/src/routes/extensions/manifest.js +68 -1
  231. package/dist/src/routes/extensions/manifest.js.map +1 -1
  232. package/dist/src/routes/extensions/pacing.d.ts +31 -0
  233. package/dist/src/routes/extensions/pacing.d.ts.map +1 -0
  234. package/dist/src/routes/extensions/pacing.js +73 -0
  235. package/dist/src/routes/extensions/pacing.js.map +1 -0
  236. package/dist/src/routes/extensions/paywall.d.ts.map +1 -1
  237. package/dist/src/routes/extensions/paywall.js +17 -17
  238. package/dist/src/routes/extensions/paywall.js.map +1 -1
  239. package/dist/src/routes/memory/crud.d.ts.map +1 -1
  240. package/dist/src/routes/memory/crud.js +10 -0
  241. package/dist/src/routes/memory/crud.js.map +1 -1
  242. package/dist/src/routes/organisms/crud.d.ts +3 -0
  243. package/dist/src/routes/organisms/crud.d.ts.map +1 -1
  244. package/dist/src/routes/organisms/crud.js +5 -2
  245. package/dist/src/routes/organisms/crud.js.map +1 -1
  246. package/dist/src/routes/organisms/workspace-read.d.ts.map +1 -1
  247. package/dist/src/routes/organisms/workspace-read.js +7 -2
  248. package/dist/src/routes/organisms/workspace-read.js.map +1 -1
  249. package/dist/src/routes/public-stats.d.ts +7 -0
  250. package/dist/src/routes/public-stats.d.ts.map +1 -1
  251. package/dist/src/routes/public-stats.js +28 -7
  252. package/dist/src/routes/public-stats.js.map +1 -1
  253. package/dist/src/routes/sse.d.ts +7 -0
  254. package/dist/src/routes/sse.d.ts.map +1 -1
  255. package/dist/src/routes/sse.js +36 -6
  256. package/dist/src/routes/sse.js.map +1 -1
  257. package/dist/src/routes/storage-files.d.ts +11 -0
  258. package/dist/src/routes/storage-files.d.ts.map +1 -1
  259. package/dist/src/routes/storage-files.js +58 -51
  260. package/dist/src/routes/storage-files.js.map +1 -1
  261. package/dist/src/routes/subdomains.d.ts +4 -0
  262. package/dist/src/routes/subdomains.d.ts.map +1 -1
  263. package/dist/src/routes/subdomains.js +42 -5
  264. package/dist/src/routes/subdomains.js.map +1 -1
  265. package/dist/src/routes/upload.d.ts +11 -0
  266. package/dist/src/routes/upload.d.ts.map +1 -1
  267. package/dist/src/routes/upload.js +108 -28
  268. package/dist/src/routes/upload.js.map +1 -1
  269. package/dist/src/routes/webmcp.d.ts.map +1 -1
  270. package/dist/src/routes/webmcp.js +4 -0
  271. package/dist/src/routes/webmcp.js.map +1 -1
  272. package/dist/src/schemas/knowledge-package.d.ts +1 -1
  273. package/dist/src/server-bootstrap/static-files.d.ts +4 -0
  274. package/dist/src/server-bootstrap/static-files.d.ts.map +1 -1
  275. package/dist/src/server-bootstrap/static-files.js +11 -0
  276. package/dist/src/server-bootstrap/static-files.js.map +1 -1
  277. package/dist/src/services/build-app-prompt.d.ts +19 -0
  278. package/dist/src/services/build-app-prompt.d.ts.map +1 -1
  279. package/dist/src/services/build-app-prompt.js +97 -11
  280. package/dist/src/services/build-app-prompt.js.map +1 -1
  281. package/dist/src/services/call-timing.d.ts +51 -0
  282. package/dist/src/services/call-timing.d.ts.map +1 -0
  283. package/dist/src/services/call-timing.js +91 -0
  284. package/dist/src/services/call-timing.js.map +1 -0
  285. package/dist/src/services/capability-invoke.d.ts +2 -0
  286. package/dist/src/services/capability-invoke.d.ts.map +1 -1
  287. package/dist/src/services/capability-invoke.js +10 -0
  288. package/dist/src/services/capability-invoke.js.map +1 -1
  289. package/dist/src/services/config-schema.d.ts.map +1 -1
  290. package/dist/src/services/config-schema.js +6 -0
  291. package/dist/src/services/config-schema.js.map +1 -1
  292. package/dist/src/services/draft-token.d.ts +22 -2
  293. package/dist/src/services/draft-token.d.ts.map +1 -1
  294. package/dist/src/services/draft-token.js +52 -3
  295. package/dist/src/services/draft-token.js.map +1 -1
  296. package/dist/src/services/exchange-market.d.ts +41 -8
  297. package/dist/src/services/exchange-market.d.ts.map +1 -1
  298. package/dist/src/services/exchange-market.js +24 -2
  299. package/dist/src/services/exchange-market.js.map +1 -1
  300. package/dist/src/services/exchange-odps.d.ts +58 -0
  301. package/dist/src/services/exchange-odps.d.ts.map +1 -0
  302. package/dist/src/services/exchange-odps.js +400 -0
  303. package/dist/src/services/exchange-odps.js.map +1 -0
  304. package/dist/src/services/exchange-projection.d.ts +61 -0
  305. package/dist/src/services/exchange-projection.d.ts.map +1 -0
  306. package/dist/src/services/exchange-projection.js +504 -0
  307. package/dist/src/services/exchange-projection.js.map +1 -0
  308. package/dist/src/services/exchange-proposals.d.ts.map +1 -1
  309. package/dist/src/services/exchange-proposals.js +2 -0
  310. package/dist/src/services/exchange-proposals.js.map +1 -1
  311. package/dist/src/services/extension-files.d.ts +64 -0
  312. package/dist/src/services/extension-files.d.ts.map +1 -0
  313. package/dist/src/services/extension-files.js +88 -0
  314. package/dist/src/services/extension-files.js.map +1 -0
  315. package/dist/src/services/extension-runtime.d.ts +33 -0
  316. package/dist/src/services/extension-runtime.d.ts.map +1 -1
  317. package/dist/src/services/extension-runtime.js +52 -0
  318. package/dist/src/services/extension-runtime.js.map +1 -1
  319. package/dist/src/services/file-refs.d.ts +105 -0
  320. package/dist/src/services/file-refs.d.ts.map +1 -0
  321. package/dist/src/services/file-refs.js +106 -0
  322. package/dist/src/services/file-refs.js.map +1 -0
  323. package/dist/src/services/metered-entitlements.d.ts +7 -0
  324. package/dist/src/services/metered-entitlements.d.ts.map +1 -1
  325. package/dist/src/services/metered-entitlements.js +4 -0
  326. package/dist/src/services/metered-entitlements.js.map +1 -1
  327. package/dist/src/services/owner-memory.d.ts +14 -1
  328. package/dist/src/services/owner-memory.d.ts.map +1 -1
  329. package/dist/src/services/owner-memory.js +8 -14
  330. package/dist/src/services/owner-memory.js.map +1 -1
  331. package/dist/src/services/task-files.d.ts +51 -0
  332. package/dist/src/services/task-files.d.ts.map +1 -0
  333. package/dist/src/services/task-files.js +58 -0
  334. package/dist/src/services/task-files.js.map +1 -0
  335. package/dist/src/services/upload-token.d.ts +29 -0
  336. package/dist/src/services/upload-token.d.ts.map +1 -1
  337. package/dist/src/services/upload-token.js +37 -0
  338. package/dist/src/services/upload-token.js.map +1 -1
  339. package/dist/src/services/upload-zip.d.ts +2 -0
  340. package/dist/src/services/upload-zip.d.ts.map +1 -1
  341. package/dist/src/services/upload-zip.js +5 -1
  342. package/dist/src/services/upload-zip.js.map +1 -1
  343. package/dist/src/services/workspace-meta.d.ts +15 -0
  344. package/dist/src/services/workspace-meta.d.ts.map +1 -1
  345. package/dist/src/services/workspace-meta.js +17 -0
  346. package/dist/src/services/workspace-meta.js.map +1 -1
  347. package/dist/src/services/workspace-provision.d.ts +3 -0
  348. package/dist/src/services/workspace-provision.d.ts.map +1 -1
  349. package/dist/src/services/workspace-provision.js +5 -3
  350. package/dist/src/services/workspace-provision.js.map +1 -1
  351. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.d.ts +1 -0
  352. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.d.ts.map +1 -1
  353. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.js +10 -0
  354. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.js.map +1 -1
  355. package/dist/src/storage/providers/postgres-kysely/methods/memory.d.ts +2 -0
  356. package/dist/src/storage/providers/postgres-kysely/methods/memory.d.ts.map +1 -1
  357. package/dist/src/storage/providers/postgres-kysely/methods/memory.js +12 -1
  358. package/dist/src/storage/providers/postgres-kysely/methods/memory.js.map +1 -1
  359. package/dist/src/storage/providers/postgres-kysely/methods/organisms.d.ts.map +1 -1
  360. package/dist/src/storage/providers/postgres-kysely/methods/organisms.js +5 -1
  361. package/dist/src/storage/providers/postgres-kysely/methods/organisms.js.map +1 -1
  362. package/dist/src/storage/providers/postgres-kysely/migrations/0012_unique_live_app_grant.sql +29 -0
  363. package/dist/src/storage/providers/sqlite/methods/apps.d.ts +3 -0
  364. package/dist/src/storage/providers/sqlite/methods/apps.d.ts.map +1 -1
  365. package/dist/src/storage/providers/sqlite/methods/apps.js +7 -0
  366. package/dist/src/storage/providers/sqlite/methods/apps.js.map +1 -1
  367. package/dist/src/storage/providers/sqlite/methods/governance.d.ts +1 -0
  368. package/dist/src/storage/providers/sqlite/methods/governance.d.ts.map +1 -1
  369. package/dist/src/storage/providers/sqlite/methods/governance.js +4 -1
  370. package/dist/src/storage/providers/sqlite/methods/governance.js.map +1 -1
  371. package/dist/src/storage/providers/sqlite/methods/owner.d.ts +5 -0
  372. package/dist/src/storage/providers/sqlite/methods/owner.d.ts.map +1 -1
  373. package/dist/src/storage/providers/sqlite/methods/owner.js +8 -0
  374. package/dist/src/storage/providers/sqlite/methods/owner.js.map +1 -1
  375. package/dist/src/storage/providers/sqlite/schema.d.ts +3 -0
  376. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  377. package/dist/src/storage/providers/sqlite/schema.js +20 -0
  378. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  379. package/dist/src/storage/repositories/app-grant.repository.d.ts +9 -1
  380. package/dist/src/storage/repositories/app-grant.repository.d.ts.map +1 -1
  381. package/dist/src/storage/repositories/memory.repository.d.ts +14 -0
  382. package/dist/src/storage/repositories/memory.repository.d.ts.map +1 -1
  383. package/dist/src/storage/repositories-impl/memory-repository.d.ts +8 -1
  384. package/dist/src/storage/repositories-impl/memory-repository.d.ts.map +1 -1
  385. package/dist/src/storage/repositories-impl/memory-repository.js +15 -4
  386. package/dist/src/storage/repositories-impl/memory-repository.js.map +1 -1
  387. package/dist/src/storage/types/agents-messaging.d.ts +19 -0
  388. package/dist/src/storage/types/agents-messaging.d.ts.map +1 -1
  389. package/dist/src/storage/types/agents-messaging.js.map +1 -1
  390. package/dist/src/storage/types/organisms-federation.d.ts +29 -0
  391. package/dist/src/storage/types/organisms-federation.d.ts.map +1 -1
  392. package/dist/src/utils/app-badge.d.ts.map +1 -1
  393. package/dist/src/utils/app-badge.js +7 -3
  394. package/dist/src/utils/app-badge.js.map +1 -1
  395. package/dist/static/app-catalog/_template.html +6 -5
  396. package/dist/static/app-catalog/js/cortex.js +3 -1
  397. package/dist/static/app-catalog/js/detail.js +411 -36
  398. package/dist/static/app-catalog/js/i18n-data.js +279 -3
  399. package/dist/static/app-catalog/js/main.js +28 -37
  400. package/dist/static/app-catalog/js/monetize.js +204 -16
  401. package/dist/static/app-catalog/js/odps.js +489 -0
  402. package/dist/static/app-catalog/js/render.js +3 -0
  403. package/dist/static/app-catalog/js/workcopy.js +198 -0
  404. package/dist/static/app-catalog/styles/app-catalog.css +60 -0
  405. package/dist/static/app-catalog.html +1450 -137
  406. package/dist/static/sdk-libs/agents/index.js +45 -7
  407. package/dist/static/sdk-libs/auth/cluster.js +97 -0
  408. package/dist/static/sdk-libs/auth/index.js +25 -1
  409. package/dist/static/sdk-libs/auth/locale.js +151 -0
  410. package/dist/static/sdk-libs/auth/modal.js +11 -2
  411. package/dist/static/sdk-libs/auth/palette.js +172 -0
  412. package/dist/static/sdk-libs/auth/pill.js +37 -6
  413. package/dist/static/sdk-libs/auth/theme.js +61 -20
  414. package/dist/static/sdk-libs/data/index.js +70 -8
  415. package/dist/static/sdk-libs/dist/aimeat-agents.js +41 -8
  416. package/dist/static/sdk-libs/dist/aimeat-auth.js +422 -21
  417. package/dist/static/sdk-libs/dist/aimeat-data.js +50 -8
  418. package/dist/static/sdk-libs/dist/aimeat-live.js +54 -2
  419. package/dist/static/sdk-libs/dist/aimeat-markdown.js +32 -1
  420. package/dist/static/sdk-libs/live/index.js +71 -4
  421. package/dist/static/sdk-libs/markdown/index.js +49 -1
  422. package/package.json +6 -2
@@ -32,11 +32,19 @@ const KIND_GROUPS = [
32
32
  ];
33
33
  const TIER_FILTERS = ['all', 'any', 'frontier', 'needs-doc'];
34
34
 
35
+ // The tier is an INSTRUCTION to the reader ("this API has no training-data priors, so an
36
+ // AI must fetch its doc"), not a statement that documentation is missing. The raw key
37
+ // `needs-doc` read as "docs missing" to everyone including the registry's own author, so
38
+ // the badge shows the instruction and keeps the key only as a CSS/filter value.
39
+ function tierLabel(tier) {
40
+ return t('profile.extensions.tierLabel.' + tier) || tier;
41
+ }
42
+
35
43
  function tierBadge(p) {
36
44
  if (!p.modelTier) return null;
37
45
  const measured = p.proofs && p.proofs.length;
38
46
  return html`<span class="ext-tier ext-tier-${p.modelTier}${measured ? ' ext-tier-measured' : ''}"
39
- title=${t('profile.extensions.tier.' + p.modelTier)}>${p.modelTier}</span>`;
47
+ title=${t('profile.extensions.tier.' + p.modelTier)}>${tierLabel(p.modelTier)}</span>`;
40
48
  }
41
49
 
42
50
  function statusBadge(p) {
@@ -157,7 +165,7 @@ export default function LibrariesTab() {
157
165
  <div class="lib-tier-filters">
158
166
  ${TIER_FILTERS.map(tf => html`
159
167
  <button class=${'btn-ghost lib-tier-btn' + (tier === tf ? ' lib-tier-active' : '')}
160
- onClick=${() => setTier(tf)}>${tf === 'all' ? t('librariesTab.tierAll') : tf}</button>`)}
168
+ onClick=${() => setTier(tf)}>${tf === 'all' ? t('librariesTab.tierAll') : tierLabel(tf)}</button>`)}
161
169
  </div>
162
170
  <label class="lib-measured-toggle">
163
171
  <input type="checkbox" checked=${measuredOnly} onChange=${e => setMeasuredOnly(e.target.checked)} />
@@ -3,6 +3,11 @@
3
3
  * @description Profile tab for morsel wallet: balance overview, lifetime stats,
4
4
  * morsel request form, and transaction history with expandable details.
5
5
  * @version-history
6
+ * v1.5.1 — 2026-07-25 — The x402 chip reports every currency → token pair the node can settle
7
+ * (USD → USDC, EUR → EURC) instead of a single hardcoded token (TARGET-042).
8
+ * v1.5.0 — 2026-07-25 — Payout rails: an x402 USDC payout-address section beside the Stripe one, so a
9
+ * seller can set the address a stablecoin sale settles to and tell the two rails apart (Stripe moves
10
+ * fiat through a provider; x402 settles USDC on-chain to an address the seller controls).
6
11
  * v1.0.0 — 2026-03-16 — Initial wallet tab
7
12
  * v1.1.0 — 2026-03-17 — Replace inline styles with CSS classes
8
13
  * v1.2.0 — 2026-05-22 — Show info message for federated users instead of infinite spinner
@@ -83,6 +88,64 @@ function PspSection() {
83
88
  </div>`;
84
89
  }
85
90
 
91
+ /* "Stablecoin payouts (x402)" — the seller's on-chain payout address.
92
+ * A different rail from Stripe, and the difference matters at sale time: Stripe settles EUR/USD to a
93
+ * connected account through a provider that holds the funds; x402 settles a stablecoin on-chain
94
+ * straight to this address, non-custodially, with the node holding no key. The token follows the
95
+ * price (USD → USDC, EUR → EURC) and ONE address receives them all, so the chip reports the pairs
96
+ * the node can actually settle rather than naming a single token. A money sale over x402 without an
97
+ * address fails with SELLER_NO_X402_ADDRESS, which is exactly what this section prevents. */
98
+ function X402Section() {
99
+ const [state, setState] = useState(null);
100
+ const [addr, setAddr] = useState('');
101
+ const [busy, setBusy] = useState(false);
102
+ const [msg, setMsg] = useState('');
103
+ const load = useCallback(() => {
104
+ apiGet('/v1/commerce/payout').then(r => setState(r.data ?? null)).catch(() => setState(false));
105
+ }, []);
106
+ useEffect(() => { load(); }, [load]);
107
+ useEffect(() => {
108
+ const handler = () => load();
109
+ window.addEventListener('aimeat-live-update', handler);
110
+ return () => window.removeEventListener('aimeat-live-update', handler);
111
+ }, [load]);
112
+ if (state === null || state === false) return null;
113
+ const x = state.x402 || {};
114
+ if (!x.enabled) return null; // the operator has not enabled the rail on this node
115
+ const valid = /^0x[a-fA-F0-9]{40}$/.test(addr.trim());
116
+ async function save() {
117
+ setBusy(true); setMsg('');
118
+ try { await apiPut('/v1/commerce/payout/x402', { address: addr.trim() }); setAddr(''); setMsg(t('profile.wallet.x402Saved')); load(); }
119
+ catch (e) { setMsg(e.message || 'Save failed'); }
120
+ finally { setBusy(false); }
121
+ }
122
+ async function remove() {
123
+ setBusy(true); setMsg('');
124
+ try { await apiDelete('/v1/commerce/payout/x402'); setMsg(t('profile.wallet.x402Removed')); load(); }
125
+ catch (e) { setMsg(e.message || 'Remove failed'); }
126
+ finally { setBusy(false); }
127
+ }
128
+ return html`
129
+ <div class="section-title mt-2">${t('profile.wallet.x402Title')}</div>
130
+ <div class="section-desc">${t('profile.wallet.x402Desc')}</div>
131
+ <div class="card wallet-psp">
132
+ <div class="wallet-rail-row">
133
+ ${x.configured
134
+ ? html`<span class="pf-psp-chip pf-psp-chip--ok">${t('profile.wallet.x402Configured')} <code>${x.address}</code></span>`
135
+ : html`<span class="pf-psp-chip pf-psp-chip--warn">${t('profile.wallet.x402Missing')}</span>`}
136
+ <span class="pf-psp-chip">${(x.assets || []).map(a => `${a.currency} → ${a.symbol}`).join(' · ')} · ${x.network}${x.testnet ? ` · ${t('profile.wallet.x402Testnet')}` : ''}</span>
137
+ </div>
138
+ <div class="wallet-psp-row">
139
+ <input class="input-field input-sm wallet-psp-input" type="text" spellcheck="false" placeholder="0x…"
140
+ value=${addr} onInput=${(e) => setAddr(e.target.value)} />
141
+ <button class="btn-primary btn-sm" disabled=${busy || !valid} onClick=${save}>${t('profile.wallet.x402Save')}</button>
142
+ ${x.configured && html`<button class="btn-ghost btn-sm" disabled=${busy} onClick=${remove}>${t('profile.wallet.x402Remove')}</button>`}
143
+ </div>
144
+ ${addr.trim() && !valid && html`<span class="text-meta">${t('profile.wallet.x402Invalid')}</span>`}
145
+ ${msg && html`<span class="text-meta">${msg}</span>`}
146
+ </div>`;
147
+ }
148
+
86
149
  /* "Money purchases & sales" — real-money (EUR/USD) checkout activity, separate from morsels.
87
150
  * Purchases come from the buyer's checkout sessions, sales from received orders; both filtered to
88
151
  * money currencies (minor units → major). Renders nothing when there is no money activity. */
@@ -247,6 +310,7 @@ export default function WalletTab({ session, showToast, onStats }) {
247
310
 
248
311
  <!-- Selling & payment provider (individual seller's own Stripe key; EE nodes only) -->
249
312
  <${PspSection} />
313
+ <${X402Section} />
250
314
 
251
315
  <!-- Real-money (EUR/USD) purchases & sales, separate from the morsel ledger -->
252
316
  <${MoneyActivity} initial=${moneyInitial} />
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=check-openapi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-openapi.d.ts","sourceRoot":"","sources":["../../scripts/check-openapi.ts"],"names":[],"mappings":""}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * @file check-openapi.ts
3
+ * @description Pre-commit / CI guard for `openapi.yaml`. Rule 3 makes the spec the canonical API
4
+ * contract, but nothing verified it was still machine-readable — and it had quietly stopped being
5
+ * so in two different ways, both found live on main:
6
+ *
7
+ * 1. A DANGLING $ref (`#/components/schemas/SuccessEnvelope`; the schema is `AimeatEnvelope`)
8
+ * broke `pnpm generate:types` outright. Rule 3's OWN tool could not run.
9
+ * 2. A PORTABILITY trap: `description: Whole document portion public? }` inside a flow mapping.
10
+ * The repo's `yaml` package and openapi-typescript both accept it, so nothing here complained
11
+ * — but PyYAML rejects it, and PyYAML is what most Python OpenAPI tooling is built on
12
+ * (openapi-spec-validator, prance, datamodel-code-generator). A consumer would have seen a
13
+ * syntax error instead of our API, and we would never have known.
14
+ *
15
+ * So this checks three things, cheapest first, and each one exists because it already failed.
16
+ * @structure
17
+ * - parse with the `yaml` package (genuine syntax errors)
18
+ * - resolve every internal `$ref` (the break that stopped codegen)
19
+ * - flag unquoted flow-mapping scalars containing `?` (accepted here, rejected by YAML 1.1 parsers)
20
+ * @usage pnpm check:openapi (exits non-zero on a parse error, a dangling $ref, or a portability trap)
21
+ * @version-history
22
+ * v1.0.0 — 2026-07-26 — Initial guard, after both failure modes were found live on main.
23
+ */
24
+ import { readFileSync } from 'node:fs';
25
+ import { fileURLToPath } from 'node:url';
26
+ import { dirname, join } from 'node:path';
27
+ import { parse as parseYaml, parseDocument, visit, isCollection } from 'yaml';
28
+ const here = dirname(fileURLToPath(import.meta.url));
29
+ const SPEC = join(here, '..', '..', 'openapi.yaml');
30
+ const raw = readFileSync(SPEC, 'utf8');
31
+ // ── 1. Does it parse at all? ────────────────────────────────────────────────
32
+ let doc;
33
+ try {
34
+ doc = parseYaml(raw, { strict: true });
35
+ }
36
+ catch (err) {
37
+ console.error('✗ openapi.yaml does not parse');
38
+ console.error(` ${err.message}`);
39
+ process.exit(1);
40
+ }
41
+ // ── 2. Does every internal $ref resolve? ────────────────────────────────────
42
+ /** Resolve a `#/a/b/c` JSON pointer against the document. undefined when it dangles. */
43
+ function resolvePointer(root, ref) {
44
+ const parts = ref.slice(2).split('/').map(p => p.replace(/~1/g, '/').replace(/~0/g, '~'));
45
+ let node = root;
46
+ for (const part of parts) {
47
+ if (node === null || typeof node !== 'object')
48
+ return undefined;
49
+ node = node[part];
50
+ if (node === undefined)
51
+ return undefined;
52
+ }
53
+ return node;
54
+ }
55
+ const dangling = [];
56
+ let refCount = 0;
57
+ function walk(node, path) {
58
+ if (Array.isArray(node)) {
59
+ node.forEach((v, i) => walk(v, `${path}/${i}`));
60
+ return;
61
+ }
62
+ if (node === null || typeof node !== 'object')
63
+ return;
64
+ for (const [key, value] of Object.entries(node)) {
65
+ if (key === '$ref' && typeof value === 'string') {
66
+ // Only internal pointers are ours to guarantee; an external file/URL ref is the
67
+ // codegen tool's business.
68
+ if (value.startsWith('#/')) {
69
+ refCount++;
70
+ if (resolvePointer(doc, value) === undefined)
71
+ dangling.push({ path, ref: value });
72
+ }
73
+ continue;
74
+ }
75
+ walk(value, `${path}/${key.replace(/~/g, '~0').replace(/\//g, '~1')}`);
76
+ }
77
+ }
78
+ walk(doc, '#');
79
+ // ── 3. Portability: plain scalars inside { } that YAML 1.1 parsers reject ───
80
+ // `?` is an indicator character. Inside a flow collection a PLAIN (unquoted) scalar containing one
81
+ // is accepted by the `yaml` package but rejected by PyYAML, so the spec parses here and fails for a
82
+ // Python consumer. Quoting the value fixes it and costs nothing.
83
+ //
84
+ // This walks the AST rather than the text: a line-based scan cannot tell a real flow mapping from a
85
+ // `{ … }` that is merely prose inside a block description, and this file is full of the latter (12
86
+ // false positives on the first attempt). Node type PLAIN + an ancestor collection with flow=true is
87
+ // the exact condition, and nothing else.
88
+ const portability = [];
89
+ const lineStarts = [0];
90
+ for (let i = 0; i < raw.length; i++)
91
+ if (raw[i] === '\n')
92
+ lineStarts.push(i + 1);
93
+ const lineOf = (offset) => {
94
+ let lo = 0, hi = lineStarts.length - 1;
95
+ while (lo < hi) {
96
+ const mid = (lo + hi + 1) >> 1;
97
+ if (lineStarts[mid] <= offset)
98
+ lo = mid;
99
+ else
100
+ hi = mid - 1;
101
+ }
102
+ return lo + 1;
103
+ };
104
+ const cst = parseDocument(raw);
105
+ visit(cst, {
106
+ Scalar(_key, node, path) {
107
+ if (node.type !== 'PLAIN')
108
+ return;
109
+ const value = typeof node.value === 'string' ? node.value : '';
110
+ if (!value.includes('?'))
111
+ return;
112
+ const inFlow = path.some(p => isCollection(p) && p.flow === true);
113
+ if (!inFlow)
114
+ return;
115
+ const line = node.range ? lineOf(node.range[0]) : 0;
116
+ portability.push({ line, text: raw.split(/\r?\n/)[line - 1]?.trim() ?? value });
117
+ },
118
+ });
119
+ // ── Report ──────────────────────────────────────────────────────────────────
120
+ let failed = false;
121
+ if (dangling.length) {
122
+ failed = true;
123
+ console.error(`✗ ${dangling.length} dangling $ref(s) — \`pnpm generate:types\` cannot run:`);
124
+ for (const d of dangling)
125
+ console.error(` ${d.ref}\n at ${d.path}`);
126
+ }
127
+ if (portability.length) {
128
+ failed = true;
129
+ console.error(`✗ ${portability.length} unquoted flow scalar(s) containing "?" — this file parses here but`);
130
+ console.error(' fails in PyYAML-based OpenAPI tooling. Quote the value:');
131
+ for (const p of portability)
132
+ console.error(` openapi.yaml:${p.line} ${p.text.slice(0, 110)}`);
133
+ }
134
+ if (failed)
135
+ process.exit(1);
136
+ const spec = doc;
137
+ console.log(`✓ openapi.yaml parses, all ${refCount} internal $refs resolve, no flow-scalar portability traps `
138
+ + `— ${Object.keys(spec.paths ?? {}).length} paths, ${Object.keys(spec.components?.schemas ?? {}).length} schemas.`);
139
+ //# sourceMappingURL=check-openapi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-openapi.js","sourceRoot":"","sources":["../../scripts/check-openapi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @file embed-viewport.ts
3
+ * @description Keeps the copy of aimeat-viewport.js that is embedded inside other cortex packs
4
+ * byte-identical to the source. Cortex packs are served live and each declares a single script
5
+ * tag with no `requires`, so a pack that needs the shared camera cannot simply depend on it —
6
+ * splitting a pack into two files would break every app carrying the old single tag. The camera
7
+ * is therefore copied INTO the consuming pack between generated markers, and this script is the
8
+ * only thing allowed to write that region. `--check` (pre-commit + CI) fails on drift, so the
9
+ * duplicate can never quietly diverge from the source.
10
+ * @structure
11
+ * - SOURCE / TARGETS → the camera file and every pack that embeds it
12
+ * - detectEol/toEol → preserve each target's existing line endings (Windows checkouts)
13
+ * - main() → write mode (default) or --check mode (exit 1 on drift)
14
+ * @usage
15
+ * pnpm sync:viewport # rewrite the embedded region in every target
16
+ * pnpm check:viewport # verify, non-zero exit on drift
17
+ * @version-history
18
+ * v1.0.0 — 2026-07-25 — Initial (TARGET-051 Slice 1): aimeat-dag embeds aimeat-viewport.
19
+ * v1.1.0 — 2026-07-25 — Also assert every pack's VERSION constant matches its manifest;
20
+ * they crossed once already (constant 1.0.1 while the manifest said 1.0.2).
21
+ */
22
+ export {};
23
+ //# sourceMappingURL=embed-viewport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed-viewport.d.ts","sourceRoot":"","sources":["../../scripts/embed-viewport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * @file embed-viewport.ts
3
+ * @description Keeps the copy of aimeat-viewport.js that is embedded inside other cortex packs
4
+ * byte-identical to the source. Cortex packs are served live and each declares a single script
5
+ * tag with no `requires`, so a pack that needs the shared camera cannot simply depend on it —
6
+ * splitting a pack into two files would break every app carrying the old single tag. The camera
7
+ * is therefore copied INTO the consuming pack between generated markers, and this script is the
8
+ * only thing allowed to write that region. `--check` (pre-commit + CI) fails on drift, so the
9
+ * duplicate can never quietly diverge from the source.
10
+ * @structure
11
+ * - SOURCE / TARGETS → the camera file and every pack that embeds it
12
+ * - detectEol/toEol → preserve each target's existing line endings (Windows checkouts)
13
+ * - main() → write mode (default) or --check mode (exit 1 on drift)
14
+ * @usage
15
+ * pnpm sync:viewport # rewrite the embedded region in every target
16
+ * pnpm check:viewport # verify, non-zero exit on drift
17
+ * @version-history
18
+ * v1.0.0 — 2026-07-25 — Initial (TARGET-051 Slice 1): aimeat-dag embeds aimeat-viewport.
19
+ * v1.1.0 — 2026-07-25 — Also assert every pack's VERSION constant matches its manifest;
20
+ * they crossed once already (constant 1.0.1 while the manifest said 1.0.2).
21
+ */
22
+ import { readFileSync, writeFileSync, readdirSync, existsSync } from 'node:fs';
23
+ import { join, dirname, relative } from 'node:path';
24
+ import { fileURLToPath } from 'node:url';
25
+ const __dirname = dirname(fileURLToPath(import.meta.url));
26
+ const REPO = join(__dirname, '..');
27
+ const BUNDLED = join(REPO, 'public', 'cortex-bundled');
28
+ const SOURCE = join(BUNDLED, 'aimeat-viewport.js');
29
+ const TARGETS = [join(BUNDLED, 'aimeat-dag.js')];
30
+ const BEGIN = '/* BEGIN embedded aimeat-viewport — GENERATED, DO NOT EDIT (pnpm sync:viewport) */';
31
+ const END = '/* END embedded aimeat-viewport */';
32
+ /** Windows checkouts may hold CRLF; keep whatever the target already uses. */
33
+ function detectEol(text) {
34
+ return text.includes('\r\n') ? '\r\n' : '\n';
35
+ }
36
+ function toEol(text, eol) {
37
+ const lf = text.replace(/\r\n/g, '\n');
38
+ return eol === '\n' ? lf : lf.replace(/\n/g, '\r\n');
39
+ }
40
+ function main() {
41
+ const check = process.argv.includes('--check');
42
+ const source = readFileSync(SOURCE, 'utf-8');
43
+ let drifted = 0;
44
+ for (const target of TARGETS) {
45
+ const rel = relative(REPO, target).replace(/\\/g, '/');
46
+ const current = readFileSync(target, 'utf-8');
47
+ const eol = detectEol(current);
48
+ const begin = current.indexOf(BEGIN);
49
+ const end = current.indexOf(END);
50
+ if (begin === -1 || end === -1 || end < begin) {
51
+ console.error(`✗ ${rel}: embed markers missing or out of order.`);
52
+ console.error(` Expected a region delimited by:\n ${BEGIN}\n ${END}`);
53
+ process.exit(1);
54
+ }
55
+ const head = current.slice(0, begin + BEGIN.length);
56
+ const tail = current.slice(end);
57
+ const body = toEol(source, eol);
58
+ const next = head + eol + body + (body.endsWith(eol) ? '' : eol) + tail;
59
+ if (next === current) {
60
+ if (!check)
61
+ console.log(`✓ ${rel}: already in sync`);
62
+ continue;
63
+ }
64
+ drifted++;
65
+ if (check) {
66
+ console.error(`✗ ${rel}: embedded aimeat-viewport has drifted from public/cortex-bundled/aimeat-viewport.js`);
67
+ }
68
+ else {
69
+ writeFileSync(target, next, 'utf-8');
70
+ console.log(`✓ ${rel}: embedded region updated`);
71
+ }
72
+ }
73
+ drifted += checkVersions(check);
74
+ if (check) {
75
+ if (drifted > 0) {
76
+ console.error(`\n${drifted} problem(s). Run: pnpm sync:viewport (embed) and align the versions by hand.`);
77
+ process.exit(1);
78
+ }
79
+ console.log('✓ embedded aimeat-viewport is in sync; pack VERSION constants match their manifests');
80
+ }
81
+ }
82
+ /**
83
+ * A cortex pack that exposes a VERSION constant must report the version its manifest declares.
84
+ * These drift trivially — the manifest gets bumped to make the seeder republish, the constant is
85
+ * forgotten, and from then on the lib lies to anyone reading it from the console. Checking it is
86
+ * three lines; noticing it in production is not.
87
+ */
88
+ function checkVersions(check) {
89
+ let bad = 0;
90
+ for (const file of readdirSync(BUNDLED)) {
91
+ if (!file.endsWith('.js'))
92
+ continue;
93
+ const js = readFileSync(join(BUNDLED, file), 'utf-8');
94
+ const yamlPath = join(BUNDLED, file.replace(/\.js$/, '.yaml'));
95
+ if (!existsSync(yamlPath))
96
+ continue;
97
+ // Only the pack's OWN constant, not one embedded from another pack.
98
+ const own = js.split(BEGIN)[0] + (js.includes(END) ? js.split(END).slice(1).join(END) : '');
99
+ const m = own.match(/VERSION:\s*'([\d.]+)'/);
100
+ if (!m)
101
+ continue;
102
+ const y = readFileSync(yamlPath, 'utf-8').match(/^\s*version:\s*"([\d.]+)"/m);
103
+ if (!y)
104
+ continue;
105
+ if (m[1] !== y[1]) {
106
+ bad++;
107
+ console.error(`✗ ${file}: VERSION constant is ${m[1]} but ${file.replace(/\.js$/, '.yaml')} declares ${y[1]}`);
108
+ }
109
+ else if (!check) {
110
+ console.log(`✓ ${file}: VERSION ${m[1]} matches its manifest`);
111
+ }
112
+ }
113
+ return bad;
114
+ }
115
+ main();
116
+ //# sourceMappingURL=embed-viewport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed-viewport.js","sourceRoot":"","sources":["../../scripts/embed-viewport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @file sse-domain-scopes.ts
3
+ * @description Authorization for the SSE live-update stream: which change DOMAINS a given
4
+ * principal may be told about. The stream carries no payload (only domain names), but a
5
+ * domain name plus its timing is still metadata: an app granted `memory:read` must not
6
+ * learn that the owner's messages, wallet or agent tasks just changed. H-2 app-origin
7
+ * isolation fences an app's DATA access; this fences its CHANGE-NOTIFICATION access the
8
+ * same way, using the very same scope vocabulary the owner approved at sign-in.
9
+ *
10
+ * Owner sessions (a human on the apex portal) see everything — the whole keyspace is
11
+ * theirs. Every other principal (app grant, agent, ecosystem app, anonymous) is RESTRICTED:
12
+ * a domain is forwarded only when the principal holds the scope that domain maps to, and a
13
+ * domain absent from the map is DENIED. Deny-by-default is deliberate: a new domain added
14
+ * elsewhere in the node must not silently start leaking to sandboxed apps. Adding the
15
+ * mapping is a one-line, reviewable decision.
16
+ * @structure DOMAIN_SCOPE (domain → required scope) · isOwnerPrincipal · allowedDomains ·
17
+ * filterDomains
18
+ * @usage
19
+ * const restricted = !isOwnerPrincipal(req.auth!);
20
+ * const allow = allowedDomains(req.auth!.scopes); // Set<string> | null (null = all)
21
+ * const visible = filterDomains(['memory', 'wallet'], allow);
22
+ * @version-history
23
+ * v1.0.0 — 2026-07-25 — Initial: scope-gated SSE domains (an app-grant stream no longer
24
+ * sees every domain in the owner's keyspace).
25
+ */
26
+ /**
27
+ * Change domain → the scope a RESTRICTED principal must hold to be told about it.
28
+ * Keys are the domain strings passed to `emitChange(domain, …)`. Anything not listed here
29
+ * is invisible to restricted principals (operator/infra domains: config, features, admin-*,
30
+ * federation, disputes, appeals, verification, totp, ghii, owners, consent, flags, feedback,
31
+ * instances, extensions, cortex, skills, portfolio, ecosystem-apps, presence, realtime).
32
+ */
33
+ export declare const DOMAIN_SCOPE: Readonly<Record<string, string>>;
34
+ /**
35
+ * True for a human owner session on the apex portal — the principal whose keyspace this is.
36
+ * An app grant carries roles ['app'] (never 'owner'), so it is restricted even though it acts
37
+ * on the owner's behalf; agents and ecosystem apps are restricted for the same reason.
38
+ */
39
+ export declare function isOwnerPrincipal(auth: {
40
+ roles?: string[];
41
+ }): boolean;
42
+ /**
43
+ * The domains a restricted principal holding `scopes` may be told about, or `null` when no
44
+ * filtering applies (owner sessions). A wildcard scope ('*') also disables filtering — the
45
+ * node's own dev/default-scope escape hatch, unchanged in meaning here.
46
+ */
47
+ export declare function allowedDomains(scopes: string[] | undefined): Set<string> | null;
48
+ /** Keep only the domains this principal may see. `allow === null` passes everything through. */
49
+ export declare function filterDomains(domains: string[], allow: Set<string> | null): string[];
50
+ //# sourceMappingURL=sse-domain-scopes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-domain-scopes.d.ts","sourceRoot":"","sources":["../../../src/auth/sse-domain-scopes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAqDxD,CAAC;AAEH;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,OAAO,CAIpE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAQ/E;AAED,gGAAgG;AAChG,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,MAAM,EAAE,CAGpF"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * @file sse-domain-scopes.ts
3
+ * @description Authorization for the SSE live-update stream: which change DOMAINS a given
4
+ * principal may be told about. The stream carries no payload (only domain names), but a
5
+ * domain name plus its timing is still metadata: an app granted `memory:read` must not
6
+ * learn that the owner's messages, wallet or agent tasks just changed. H-2 app-origin
7
+ * isolation fences an app's DATA access; this fences its CHANGE-NOTIFICATION access the
8
+ * same way, using the very same scope vocabulary the owner approved at sign-in.
9
+ *
10
+ * Owner sessions (a human on the apex portal) see everything — the whole keyspace is
11
+ * theirs. Every other principal (app grant, agent, ecosystem app, anonymous) is RESTRICTED:
12
+ * a domain is forwarded only when the principal holds the scope that domain maps to, and a
13
+ * domain absent from the map is DENIED. Deny-by-default is deliberate: a new domain added
14
+ * elsewhere in the node must not silently start leaking to sandboxed apps. Adding the
15
+ * mapping is a one-line, reviewable decision.
16
+ * @structure DOMAIN_SCOPE (domain → required scope) · isOwnerPrincipal · allowedDomains ·
17
+ * filterDomains
18
+ * @usage
19
+ * const restricted = !isOwnerPrincipal(req.auth!);
20
+ * const allow = allowedDomains(req.auth!.scopes); // Set<string> | null (null = all)
21
+ * const visible = filterDomains(['memory', 'wallet'], allow);
22
+ * @version-history
23
+ * v1.0.0 — 2026-07-25 — Initial: scope-gated SSE domains (an app-grant stream no longer
24
+ * sees every domain in the owner's keyspace).
25
+ */
26
+ /**
27
+ * Change domain → the scope a RESTRICTED principal must hold to be told about it.
28
+ * Keys are the domain strings passed to `emitChange(domain, …)`. Anything not listed here
29
+ * is invisible to restricted principals (operator/infra domains: config, features, admin-*,
30
+ * federation, disputes, appeals, verification, totp, ghii, owners, consent, flags, feedback,
31
+ * instances, extensions, cortex, skills, portfolio, ecosystem-apps, presence, realtime).
32
+ */
33
+ export const DOMAIN_SCOPE = Object.freeze({
34
+ // Owner data the app already reads
35
+ memory: 'memory:read',
36
+ personal: 'memory:read',
37
+ files: 'storage:read',
38
+ // Structured spaces
39
+ organisms: 'organism:read',
40
+ schemas: 'organism:read',
41
+ templates: 'organism:read',
42
+ csm: 'organism:read',
43
+ msm: 'organism:read',
44
+ // Public discovery surfaces
45
+ catalogue: 'catalogue:read',
46
+ apps: 'catalogue:read',
47
+ 'app-store': 'catalogue:read',
48
+ site: 'catalogue:read',
49
+ // Social
50
+ boards: 'social:read',
51
+ groups: 'social:read',
52
+ matches: 'social:read',
53
+ // Conversations
54
+ messages: 'messages:read',
55
+ 'agent-messages': 'messages:read',
56
+ chat: 'messages:read',
57
+ // Economy
58
+ wallet: 'wallet:read',
59
+ // Knowledge
60
+ knowledge: 'knowledge:read',
61
+ packages: 'knowledge:read',
62
+ // The owner's fleet
63
+ 'agent-tasks': 'task:read',
64
+ agents: 'task:read',
65
+ work: 'task:read',
66
+ actions: 'task:read',
67
+ 'agent-usage': 'task:read',
68
+ 'agent-capabilities': 'task:read',
69
+ 'agent-directives': 'task:read',
70
+ 'agent-onboarding': 'task:read',
71
+ // Automation
72
+ workflows: 'workflow:read',
73
+ scheduler: 'workflow:read',
74
+ // Nudges
75
+ notifications: 'notifications:send',
76
+ push: 'notifications:send',
77
+ });
78
+ /**
79
+ * True for a human owner session on the apex portal — the principal whose keyspace this is.
80
+ * An app grant carries roles ['app'] (never 'owner'), so it is restricted even though it acts
81
+ * on the owner's behalf; agents and ecosystem apps are restricted for the same reason.
82
+ */
83
+ export function isOwnerPrincipal(auth) {
84
+ const roles = auth.roles ?? [];
85
+ if (roles.includes('app') || roles.includes('agent') || roles.includes('ecosystem'))
86
+ return false;
87
+ return roles.includes('owner');
88
+ }
89
+ /**
90
+ * The domains a restricted principal holding `scopes` may be told about, or `null` when no
91
+ * filtering applies (owner sessions). A wildcard scope ('*') also disables filtering — the
92
+ * node's own dev/default-scope escape hatch, unchanged in meaning here.
93
+ */
94
+ export function allowedDomains(scopes) {
95
+ const held = new Set(scopes ?? []);
96
+ if (held.has('*'))
97
+ return null;
98
+ const out = new Set();
99
+ for (const [domain, needed] of Object.entries(DOMAIN_SCOPE)) {
100
+ if (held.has(needed))
101
+ out.add(domain);
102
+ }
103
+ return out;
104
+ }
105
+ /** Keep only the domains this principal may see. `allow === null` passes everything through. */
106
+ export function filterDomains(domains, allow) {
107
+ if (!allow)
108
+ return domains;
109
+ return domains.filter(d => allow.has(d));
110
+ }
111
+ //# sourceMappingURL=sse-domain-scopes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-domain-scopes.js","sourceRoot":"","sources":["../../../src/auth/sse-domain-scopes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAqC,MAAM,CAAC,MAAM,CAAC;IAC1E,mCAAmC;IACnC,MAAM,EAAE,aAAa;IACrB,QAAQ,EAAE,aAAa;IACvB,KAAK,EAAE,cAAc;IAErB,oBAAoB;IACpB,SAAS,EAAE,eAAe;IAC1B,OAAO,EAAE,eAAe;IACxB,SAAS,EAAE,eAAe;IAC1B,GAAG,EAAE,eAAe;IACpB,GAAG,EAAE,eAAe;IAEpB,4BAA4B;IAC5B,SAAS,EAAE,gBAAgB;IAC3B,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE,gBAAgB;IAC7B,IAAI,EAAE,gBAAgB;IAEtB,SAAS;IACT,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,aAAa;IACrB,OAAO,EAAE,aAAa;IAEtB,gBAAgB;IAChB,QAAQ,EAAE,eAAe;IACzB,gBAAgB,EAAE,eAAe;IACjC,IAAI,EAAE,eAAe;IAErB,UAAU;IACV,MAAM,EAAE,aAAa;IAErB,YAAY;IACZ,SAAS,EAAE,gBAAgB;IAC3B,QAAQ,EAAE,gBAAgB;IAE1B,oBAAoB;IACpB,aAAa,EAAE,WAAW;IAC1B,MAAM,EAAE,WAAW;IACnB,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,WAAW;IACpB,aAAa,EAAE,WAAW;IAC1B,oBAAoB,EAAE,WAAW;IACjC,kBAAkB,EAAE,WAAW;IAC/B,kBAAkB,EAAE,WAAW;IAE/B,aAAa;IACb,SAAS,EAAE,eAAe;IAC1B,SAAS,EAAE,eAAe;IAE1B,SAAS;IACT,aAAa,EAAE,oBAAoB;IACnC,IAAI,EAAE,oBAAoB;CAC3B,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAA0B;IACzD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC/B,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IAClG,OAAO,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAA4B;IACzD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5D,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,aAAa,CAAC,OAAiB,EAAE,KAAyB;IACxE,IAAI,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC;IAC3B,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"agent-tasks.d.ts","sourceRoot":"","sources":["../../../../../../src/cli/connect/mcp/tools/agent-tasks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAK7D,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAqJrF"}
1
+ {"version":3,"file":"agent-tasks.d.ts","sourceRoot":"","sources":["../../../../../../src/cli/connect/mcp/tools/agent-tasks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAK7D,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAuJrF"}
@@ -28,7 +28,8 @@ export function registerAgentTasksTools(mcp, registry) {
28
28
  title: z.string().describe('Short human-readable title for the task. Shows up in the owner\'s dashboard. Example: "Research 2026 agent orchestration trends".'),
29
29
  description: z.string().describe('The actual prompt / instruction for the target agent. This is what its liaison / runtime will read and act on.'),
30
30
  status: z.enum(['draft', 'queued']).optional().describe('Default "queued" (visible to the target agent immediately). Use "draft" if you want the owner to review before it goes live.'),
31
- }, annotationsFor('aimeat_task_create'), async ({ agent_name, target_agent, title, description, status }) => {
31
+ files: z.array(z.string()).max(20).optional().describe('Files the target agent needs, by REFERENCE: "<owner@node>/<storage key>" each (a bare key means a file the calling agent owns). The caller must be able to read each file itself; the target agent gets a presigned download_url from aimeat_task_get.'),
32
+ }, annotationsFor('aimeat_task_create'), async ({ agent_name, target_agent, title, description, status, files }) => {
32
33
  const { client } = pickAgent(registry, agent_name);
33
34
  const body = {
34
35
  title,
@@ -39,6 +40,8 @@ export function registerAgentTasksTools(mcp, registry) {
39
40
  verification: { user_expects: '', technical_checks: [] },
40
41
  todos: [],
41
42
  };
43
+ if (files?.length)
44
+ body.resources = { files: files.map(ref => ({ ref })) };
42
45
  const resp = await client.post(`/v1/agents/${encodeURIComponent(target_agent)}/tasks`, body);
43
46
  return { content: [{ type: 'text', text: JSON.stringify(resp.data ?? resp, null, 2) }] };
44
47
  });