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
@@ -58,6 +58,20 @@ export function buildAppPrompt(config, opts = {}) {
58
58
  body += '</' + 'script>\n';
59
59
  body += '```\n\n';
60
60
  // App permissions — the scope vocabulary, generated from the authorize endpoint's own constant
61
+ // The language control. Every app used to hand-roll its own EN/FI switch — a text button here, a
62
+ // select there, a pair of links elsewhere — against three different storage keys. It now travels
63
+ // in the login pill exactly as the theme toggle does. (Reported 2026-07-25: "it is ALWAYS
64
+ // different in every single app".)
65
+ body += '### Language: declare it, never build the switch\n';
66
+ body += 'A bilingual app does NOT build its own language button. The login pill carries the platform control cluster — a segmented language switch (every declared language visible, one click to any), the light/dark switch and the palette picker — so every app on the node has the identical controls in the identical place. You declare which languages you have and react to the change:\n';
67
+ body += '```html\n';
68
+ body += '<meta name="aimeat-locales" content="en fi">\n';
69
+ body += '```\n';
70
+ body += '```javascript\n';
71
+ body += 'var lang = AIMEAT.auth.getLang(); // "en" | "fi" — resolved ?lang= > localStorage > cookie > navigator\n';
72
+ body += 'window.addEventListener("aimeat-lang-change", function (e) { lang = e.detail.lang; render(); });\n';
73
+ body += '```\n';
74
+ body += 'Declare one language (or none) and no control renders. The choice is stored under the ONE platform key `aimeat-lang`, the same one the AIMEAT SPA and the sign-in modal use, so an app and the site agree. `AIMEAT.auth.setLang("fi")` sets it programmatically. Do not invent a second key, a second control, or a `?locale=` parameter.\n\n';
61
75
  body += '### App permissions (scopes)\n';
62
76
  body += 'An app that declares nothing gets the DEFAULT grant: `memory:read memory:write storage:read storage:write`. If the app needs more, declare EVERY scope it uses in the head — the user approves them at sign-in:\n';
63
77
  body += '```html\n';
@@ -83,6 +97,20 @@ export function buildAppPrompt(config, opts = {}) {
83
97
  body += 'Works only when logged in. After a write, read it back to confirm it persisted.\n';
84
98
  body += 'A key is a plain string: `get(key)` / `getPublic(gaii, key)` always return the LATEST value — never append a version, index or `:0`/`:N` suffix to a key, and read back the SAME key you wrote (a store-as-`x` / read-as-`x:0` mismatch just 404s and your UI shows nothing). To page a large list, store it as ONE array under one key (or shard with your OWN explicit id scheme), not a magic version suffix.\n';
85
99
  body += 'Shared feeds, journals, comments and discussions are ALL built this way — one public key per entry, `getPublic()` to read others\'. Never reach for Boards (deprecated, removal-bound) or organism workspaces as an app\'s data layer. When a rule must be enforced server-side (only-author-can-delete, one-vote-per-user), that logic goes into an extension — see the extension guide, not into boards/organisms.\n\n';
100
+ // Reading what the owner's AGENTS produced. This is the single most common "my app shows
101
+ // nothing" cause for fleet-facing apps: agent output is NOT in the owner's namespace, and an
102
+ // app-grant token gets no automatic broadening, so an unscoped list() legitimately returns [].
103
+ body += '### Reading data your AGENTS produced (not your own keys)\n';
104
+ body += 'An agent publishes under **its own** namespace (`agentname#owner@node`), NOT the owner\'s. Your app token is role `app`, which gets no automatic owner-scope broadening — so a plain `list({prefix})` returns NOTHING for agent data and the app looks empty while the data is right there. Say which namespace you mean:\n';
105
+ body += '```javascript\n';
106
+ body += '// every same-owner namespace (owner GHII + all their agents) — the usual choice:\n';
107
+ body += 'const { items } = await AIMEAT.data.list({ prefix: "crews.", ownerScope: true, meta: true });\n';
108
+ body += '// one specific agent (full GAII), e.g. from AIMEAT.agents.list():\n';
109
+ body += 'const mine = await AIMEAT.data.list({ prefix: "watch.", agent: "uutisankka#alice@node-id" });\n';
110
+ body += 'const value = await AIMEAT.data.get(items[0].key, { agent: items[0].owner_gaii });\n';
111
+ body += '```\n';
112
+ body += '**`meta: true` on any listing you render as a table/board/archive.** The default response inlines EVERY value, so a fleet-wide prefix can be megabytes on each load; `meta` returns keys + `bytes` + `tags` + `updated_at` and you fetch a value only when the user opens that row. `count: true` (or `AIMEAT.data.count({prefix})`) returns just a number — the cheap way to ask "did anything change?".\n';
113
+ body += 'Each listed item carries `owner_gaii` (which namespace it lives in) and `tags`. Agent task-runners commonly tag their published output `task:<taskId>`, which is how you tie a record back to the task that produced it — `task.deliverableKey` is OPTIONAL and many agents never set it, so never require that field to find a result. `AIMEAT.agents.deliverable()` already falls back to the tag.\n\n';
86
114
  // Public Intake — the ONLY way an anonymous (not-logged-in) visitor can submit data into an owner's
87
115
  // space. Every other write path requires auth, so lead/contact/feedback/RSVP/survey forms need this.
88
116
  body += '### Collecting input from anonymous visitors (Public Intake)\n';
@@ -140,6 +168,17 @@ export function buildAppPrompt(config, opts = {}) {
140
168
  body += '// 3) for low-latency P2P, GET /v1/realtime/ice-servers and use WebRTC\n';
141
169
  body += '```\n';
142
170
  body += 'Simpler apps can skip rooms and just observe shared AIMEAT.data keys on a timer.\n\n';
171
+ // Live updates — the firehose trap. Correct-looking code that makes the app poll forever
172
+ // and repaint over the user, on any account with more than a couple of active agents.
173
+ body += '### Live updates without a firehose (aimeat-live.js)\n';
174
+ body += '`AIMEAT.live.subscribe(["memory"], reload)` means "call me whenever ANY of this owner\'s memory changed". On an account with an active agent fleet that is near-continuous, so a handler that re-fetches a full listing turns one agent\'s activity into a permanent poll. Gate it:\n';
175
+ body += '```javascript\n';
176
+ body += '// fire only when the number of keys under a prefix actually changed:\n';
177
+ body += 'AIMEAT.live.subscribe(["memory"], reload, { keyPrefix: "crews.", ownerScope: true });\n';
178
+ body += 'AIMEAT.live.subscribe(["memory"], reload, { minIntervalMs: 10000 }); // or just rate-limit\n';
179
+ body += '```\n';
180
+ body += 'The change frame carries a DOMAIN name, never the key that changed, so `keyPrefix` is a client-side count gate: it catches a NEW key, not an in-place update of an existing one. Use `minIntervalMs` for update-sensitive views.\n';
181
+ body += '**Never let a live event repaint a surface the user is currently reading.** If a dialog/detail view is open, refresh its data in the background and leave the visible content alone — only an explicit user action should replace it. Rebuilding a list or blanking a pane to "Loading…" on every event is what makes an app flicker, and it looks like a crash, not a refresh. Also: render into a detached element and swap it in one operation instead of clearing then filling.\n\n';
143
182
  // Agent face — the markdown read-surface agents get on the app URL
144
183
  body += '### Agent face (markdown read-surface for agents)\n';
145
184
  body += 'A published app has THREE surfaces for AI agents: READ — its agent face, the markdown document the node serves on the app URL when a request prefers text/markdown (Accept header, or ?format=md); ACT — its WebMCP tools (GET /v1/apps/{owner}/{filename}/webmcp); LEARN — its bound skill (GET /v1/apps/{owner}/{filename}/skills). Give your app a good face and agents can use it without scraping the DOM.\n';
@@ -170,18 +209,33 @@ export function buildAppPrompt(config, opts = {}) {
170
209
  body += 'Pass { app: "my-app.html" } (your published filename) explicitly — on per-app subdomain origins the filename cannot be derived from the URL (alternatively add <meta name="aimeat-app" content="my-app.html"> to the page). publish() requires a signed-in session (aimeat-auth), and the node serves ONLY the record written by the APP OWNER — a visitor\'s publish lands in their own namespace and is never served, so it is safe to call on every save.\n\n';
171
210
  // Design guidelines
172
211
  body += '### Design Guidelines\n';
173
- body += 'For rich UIs use the self-hosted styling stack (the same one the app-shell templates use) instead of hand-rolling a CSS framework: the `styling` capability pack — daisyUI v5 components + Tailwind v4 utilities + the AIMEAT theme bridge, all loaded from this node (see the capability packs list above). For minimal pages plain CSS variables are fine.\n';
174
- body += "Use CSS variables so the app themes cleanly, and RESPECT the user's AIMEAT theme: the light/dark choice they made in the AIMEAT pill is saved in localStorage \"aimeat-theme\" (\"light\"|\"dark\"). Define light as the default and dark under [data-theme=\"dark\"], then set that attribute from the saved choice on load (fall back to the OS preference, and live-update if it changes):\n";
175
- body += '```css\n';
176
- body += ':root { --bg:#fafaf8; --card:#fff; --text:#1a1a2e; --accent:#e8564a; --border:#e5e7eb; --radius:12px; }\n';
177
- body += ':root[data-theme="dark"] { --bg:#14141c; --card:#1e1e2a; --text:#ececf4; --border:#2e2e40; }\n';
178
- body += '```\n';
212
+ body += 'For rich UIs use the self-hosted styling stack (the same one the app-shell templates use) instead of hand-rolling a CSS framework: the `styling` capability pack — daisyUI v5 components + Tailwind v4 utilities + the AIMEAT daisyUI theme + the cortex theme bridge, all loaded from this node (see the capability packs list above). For minimal pages plain CSS variables are fine.\n';
213
+ body += '**The brand is a token, never a hex.** The theme sets `--color-primary` to the AIMEAT coral (#E8564A light, #FF6F62 dark, each with the right readable text colour on top). Write `btn-primary`, `text-primary`, `border-primary` and the brand appears correctly in BOTH modes and under EVERY palette. If you find yourself typing a brand hex into an app, you are creating something that will be wrong the moment the user switches look.\n';
214
+ body += "**The theme system has two axes, and both belong to the user.** `data-theme` on `<html>` is the light/dark MODE (localStorage `aimeat-theme`); `data-palette` is the designed LOOK (localStorage `aimeat-palette`: `aimeat` coral default, `paper` warm editorial serif, `circuit` cold technical mono, `contrast` high-contrast accessible, `mist` quiet neutral — every one defines both modes, its own display face and radii, all contrast-verified; preview them at /lib/samples/themes.html). Style with the daisyUI/theme tokens and all ten combinations work for free. Restore both axes in <head> so there is no flash of the wrong look:\n";
179
215
  body += '```js\n';
180
- body += '(function(){ function apply(t){ document.documentElement.setAttribute("data-theme", t==="dark"?"dark":"light"); }\n';
181
- body += ' apply(localStorage.getItem("aimeat-theme") || (matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"));\n';
182
- body += ' addEventListener("storage", function(e){ if(e.key==="aimeat-theme" && e.newValue) apply(e.newValue); }); })();\n';
216
+ body += '(function(){ function mode(t){ document.documentElement.setAttribute("data-theme", t==="dark"?"dark":"light"); }\n';
217
+ body += ' function pal(p){ if(p && p!=="aimeat") document.documentElement.setAttribute("data-palette", p); else document.documentElement.removeAttribute("data-palette"); }\n';
218
+ body += ' mode(localStorage.getItem("aimeat-theme") || (matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"));\n';
219
+ body += ' pal(localStorage.getItem("aimeat-palette"));\n';
220
+ body += ' addEventListener("storage", function(e){ if(e.key==="aimeat-theme" && e.newValue) mode(e.newValue);\n';
221
+ body += ' if(e.key==="aimeat-palette" && e.newValue) pal(e.newValue); }); })();\n';
183
222
  body += '```\n';
223
+ body += 'An app may SUGGEST a palette that fits its character (a reading app might default to `paper` for first-time visitors via `AIMEAT.auth.setPalette("paper")` before any stored choice exists) — but it never overrides a stored user choice and never builds its own picker: the login pill already carries one.\n';
224
+ body += '**Typography is part of the theme.** Body text is Inter, headings and `.card-title` get the palette display face, `code`/`pre` get JetBrains Mono — automatically, self-hosted, with Finnish ä/ö covered. Never link an external font CDN (the app CSP forbids it) and never fight the display face with a hardcoded `font-family` on headings. Type-scale tokens when you size things yourself: `var(--text-hero)` for the one biggest thing on the page, `--text-title`, `--text-body`, `--text-fine` (13px floor). Elevation tokens for depth: `box-shadow: var(--elev-card)` resting, `--elev-raise` on hover, `--elev-pop` for menus/dialogs. Motion tokens: `var(--motion-fast|base|slow)` with `var(--ease-out)`.\n';
184
225
  body += 'Always include the viewport meta: `<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover, interactive-widget=resizes-content">` (the last part makes the on-screen keyboard resize the layout instead of hiding bottom inputs). Mobile-first, single self-contained HTML file with embedded CSS + JS.\n\n';
226
+ // Visual design for NON-game apps. Before this section the prompt's only real design content was
227
+ // the game form-language block, which ended by telling every tool app that a flat daisyUI page was
228
+ // "the right default" — so the paved path reliably produced nine identical grey cards with one type
229
+ // size and no focal point. Components are not design; hierarchy is. (ODPS app review, 2026-07-25.)
230
+ body += '### Visual design — components are not a design\n';
231
+ body += 'daisyUI gives you correct, accessible COMPONENTS. It does not give you a design, and a page of stacked `card bg-base-200` blocks with one type size reads as unfinished no matter how good the logic underneath is. Six rules turn components into something worth looking at. They cost minutes, not hours:\n';
232
+ body += '- **One focal point per screen.** Decide the single most important thing (the verdict, the number, the next action) and make it visually dominant — bigger, heavier, or the only saturated colour in view. If everything is the same weight, the eye has nowhere to land and the page reads as a wall.\n';
233
+ body += '- **Use at least three type steps, and mean them.** A key metric set in the same 14px run as the sentence around it is invisible. Give numbers that matter display treatment: large, `font-semibold`, `tabular-nums`, tight tracking. Labels go small and `uppercase tracking-wide opacity-60`. Body text stays one comfortable size.\n';
234
+ body += '- **Colour carries meaning or it carries nothing.** Default to neutral surfaces and reserve saturation for state and the primary action. Prefer the quiet variants (`badge-soft`, `alert-soft`, `btn-soft`, `badge-outline`) and keep ONE solid fill for the thing that genuinely has to shout.\n';
235
+ body += '- **Group, do not stack.** Related facts belong in ONE card with internal structure, not one card each. A vertical run of more than about five sibling cards is a sign the content was never grouped. Give cards an edge (`card-border` / `border border-base-300`): the surface step alone makes a card read as a lighter patch, the hairline makes it read as a card.\n';
236
+ body += '- **Cap the measure, use the space.** Long prose past ~70 characters per line is tiring, and a single `max-w-5xl` column on a wide screen is mostly empty gutters. Either keep the container narrower or put the freed width to work (a summary rail, a two-column split via `AIMEAT.ui.layout`).\n';
237
+ body += '- **Design the empty, loading and error states.** They are most of what a new user sees. Use `AIMEAT.ui.motion.skeleton()` rather than a spinner (shimmer in the SHAPE of the coming content reads as fast; a spinner reads as stuck), and say what an empty state means plus what to do about it.\n';
238
+ body += 'Reach for the cortex UI packs before hand-rolling: `aimeat-ui-motion` (`statTiles()` for a KPI row with count-up numbers and sparklines, `skeleton()`, `staggerIn()` for lists), `aimeat-ui-viewers` (`DataTable`, `List`, `Timeline`), `aimeat-ui-layout` (`MainDetail`, `DashboardGrid`, `Split`). Hand-rolling a `<ul>` where `statTiles` was one script tag away is the single most common reason an AIMEAT app looks poorer than it is.\n\n';
185
239
  // Mobile safety checklist — the recurring "it looks tiny / overflows on a phone" class of bug,
186
240
  // as positive DO-rules. The app-shell templates already bake these in; hand-rolled layouts must
187
241
  // follow them. (Distilled from the curated mobile pitfalls — auth-pill-overflow, grid-track-blowout.)
@@ -193,6 +247,38 @@ export function buildAppPrompt(config, opts = {}) {
193
247
  body += '- **Wrap wide content** — put tables / code blocks / diagrams in a `overflow-x:auto` container, and `flex-wrap: wrap` any toolbar/nav row whose item count can grow (tabs, pager dots).\n';
194
248
  body += '- **Verify**: at 390px (portrait) AND ~844px (landscape), `document.documentElement.scrollWidth === clientWidth` (zero horizontal overflow) and body text stays ≥14px.\n';
195
249
  body += 'For a focused view (chat/editor/wizard) on ≤760px, go full-screen (`position:fixed; inset:0` gated on an is-active class) with a Back affordance, rather than sharing the screen with app chrome.\n\n';
250
+ // Visual verification. The mobile checklist proved a machine-checkable rule beats good intentions
251
+ // (scrollWidth === clientWidth). These are the same idea for appearance: an app can pass every
252
+ // functional test and still ship an unreadable dark theme, because nobody ever opened it.
253
+ body += '### Verify what it LOOKS like, not just that it works\n';
254
+ body += 'An app can pass every functional check and still be unreadable, because the builder developed in one theme and never opened the other. Before calling a UI finished, run these on the real page:\n';
255
+ body += '- **Open BOTH modes.** Set `data-theme` to `light` AND `dark` and look at each. A dark screenshot is not optional — it is where hardcoded colours, invisible card edges and solid-fill badges go wrong. If you used only tokens, spot-check one non-default palette too (`document.documentElement.setAttribute("data-palette","circuit")`): a token-clean app passes every palette for free, and a hardcoded colour shows up immediately.\n';
256
+ body += '- **Contrast**: body text ≥ 4.5:1 against its own background, large/bold text and UI components ≥ 3:1. The AIMEAT theme tokens are pre-verified in both themes, so if you only used tokens you are done; the moment you hardcode a colour you own its contrast.\n';
257
+ body += '- **Brand present**: `getComputedStyle(document.documentElement).getPropertyValue("--color-primary")` resolves to the AIMEAT coral, and the primary action on screen actually uses it.\n';
258
+ body += '- **Type scale real**: at least three distinct rendered font sizes, and the largest one is on the thing that matters most — not on a decorative page title above a wall of identical 14px text.\n';
259
+ body += '- **No horizontal overflow** at 390px and ~844px (the mobile checklist above).\n';
260
+ body += 'This one-liner returns the audit; run it in each theme:\n';
261
+ body += '```js\n';
262
+ body += '(() => { // elements carrying their OWN text — a leaf-only filter misses "31" inside <div>31<span>%</span></div>\n';
263
+ body += ' const el = [...document.querySelectorAll("body *")].filter(e => [...e.childNodes].some(n => n.nodeType === 3 && n.textContent.trim()));\n';
264
+ body += ' const px = e => parseFloat(getComputedStyle(e).fontSize);\n';
265
+ body += ' const sizes = [...new Set(el.map(px))].sort((a,b) => b-a);\n';
266
+ body += ' const d = document.documentElement;\n';
267
+ body += ' return { theme: d.getAttribute("data-theme"), primary: getComputedStyle(d).getPropertyValue("--color-primary").trim(),\n';
268
+ body += ' typeSteps: sizes, biggestText: el.find(e => px(e) === sizes[0])?.textContent.trim().slice(0,60),\n';
269
+ body += ' smallestText: sizes[sizes.length-1], overflowPx: d.scrollWidth - d.clientWidth }; })()\n';
270
+ body += '```\n';
271
+ body += 'Pass: `typeSteps.length >= 3`, `overflowPx === 0`, `primary` resolves to the active palette\'s brand token (the coral under the default palette), `biggestText` is genuinely the most important thing on the page (if it is a decorative glyph or the page title, your hierarchy is upside down), and `smallestText >= 11` — note daisyUI renders `badge-xs` at 10px, so prefer `badge-sm` for anything a user has to read.\n\n';
272
+ // Publish gate for dialogs + live data. Both bugs this encodes shipped from checks that
273
+ // PASSED: an overlay verified only at 390px (it rendered below the footer on desktop), and a
274
+ // "0 console errors" reading on an app that repainted its open dialog every second. Proxy
275
+ // measurements generalise badly; these three are the actual behaviours.
276
+ body += '### Before you call it done: measure it, do not glance at it\n';
277
+ body += 'A clean console, compiling JS and one screenshot at one size prove almost nothing. If the app has a **dialog/overlay** or reads **live data**, run these three and report the numbers:\n';
278
+ body += '1. **Three viewports, every interactive surface**: 390x844, 1280x900 and **1280x460**. The short one is the one that catches it: a centred/overlay panel that looks perfect at 900px high often clips its own top, becomes unscrollable, or renders below the page at 460px. Check `document.documentElement.scrollWidth - clientWidth === 0` at each, and that the dialog\'s top edge is >= 0 and its close control reachable.\n';
279
+ body += '2. **Live channel connected, dialog open, count the repaints.** Put a `MutationObserver` on the open panel\'s content node and watch for 20 seconds while other work is happening on the account. Expected: **zero**. Anything above zero means a live event is repainting a surface the user is reading.\n';
280
+ body += '3. **Read the network log after 60 idle seconds.** A repeating full listing is a bug even when nothing visibly breaks: it is a poll you did not intend. Gate it (see the live-updates section) so an idle app is idle.\n';
281
+ body += 'Verify the FEATURE too, not just the render: perform the real interaction (commission the thing, save the thing, delete the thing) and confirm the result actually appears and persists. "It did not crash" is not a pass.\n\n';
196
282
  // Game form language — palette alone reads as a dashboard; the FORM LANGUAGE makes the game.
197
283
  // Born from pitfall app/candy-palette-alone-is-not-a-game-look (TOWER TETRIS, 2026-07-19).
198
284
  body += '### Game / playful look — form language, not just palette\n';
@@ -202,7 +288,7 @@ export function buildAppPrompt(config, opts = {}) {
202
288
  body += '- **Frame the play area**: wrap the game canvas in a gradient border div; give its interior life (checkerboard tint, inner glow) instead of a plain background.\n';
203
289
  body += "- **Juice**: screen-shake keyframes on big events, scale-pop on changing numbers, a shine-sweep ::after on primary buttons, floating combo text. Small, cheap, and they carry most of the game feel.\n";
204
290
  body += '- **Ambient life lives IN the scene**: with a 3D/canvas view, decorations must be world objects (orbiting meshes, drifting sprites INSIDE the canvas) — never flat absolutely-positioned CSS elements over the canvas; those do not parallax and read as mistakes. CSS sky layers (clouds/stars) BEHIND a transparent canvas are fine.\n';
205
- body += 'Non-game apps: skip this section the styling pack + clean CSS variables are the right default.\n\n';
291
+ body += 'Non-game apps: skip THIS section, but do not skip design apply "Visual design: components are not a design" above. A tool app still needs a focal point, a real type scale and grouped content; it just gets there with restraint instead of stickers and juice.\n\n';
206
292
  // Rules
207
293
  body += '### Important Rules\n';
208
294
  body += '- Return the COMPLETE HTML file, not fragments\n';
@@ -210,7 +296,7 @@ export function buildAppPrompt(config, opts = {}) {
210
296
  body += '- Keep it as a single self-contained HTML file\n';
211
297
  body += '- Load only the libraries you actually use; load aimeat-auth before libs that need a session\n';
212
298
  body += '- Gate AI features on AIMEAT.ai.isAvailable() and handle the logged-out / no-key case\n';
213
- body += "- Theme with CSS variables; respect the user's AIMEAT light/dark choice (localStorage \"aimeat-theme\") with an OS-preference fallback\n";
299
+ body += "- Theme with the platform tokens; respect BOTH user choices light/dark mode (localStorage \"aimeat-theme\", OS-preference fallback) and palette (localStorage \"aimeat-palette\") — and never build your own theme/language/palette control (the login pill carries the cluster)\n";
214
300
  body += '- Include error handling and loading states for API calls\n\n';
215
301
  // Conscious-upgrade rule (improve mode): library packs version consciously, never silently.
216
302
  if (isImprove) {
@@ -1 +1 @@
1
- {"version":3,"file":"build-app-prompt.js","sourceRoot":"","sources":["../../../src/services/build-app-prompt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build-app-prompt.js","sourceRoot":"","sources":["../../../src/services/build-app-prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * @file src/services/call-timing.ts
3
+ * @description How long a capability actually takes to answer, measured per (ext, action) coordinate so
4
+ * a provider can commit to a service level from EVIDENCE instead of a guess.
5
+ *
6
+ * An SLA typed from imagination is worse than no SLA: it is a promise the provider has no reason to
7
+ * believe they can keep, and a buyer has no reason to trust. The honest sequence is the other way
8
+ * round — serve real calls, measure them, then commit to a number with headroom over what was measured.
9
+ * That is what this file supplies: the measurement. The commitment stays a human act.
10
+ *
11
+ * Durations vary enormously by capability (a register lookup answers in tens of milliseconds, an LLM
12
+ * call can take half a minute), so the number that matters is per-capability p95, never a node-wide
13
+ * average. Timings buffer in memory and flush on an interval — the same shape the telemetry buffer
14
+ * uses — so a metered call never pays for an extra write.
15
+ * @structure recordCallDuration · readCallTiming · timingKey · flushCallTimings
16
+ * @usage
17
+ * const started = Date.now();
18
+ * ... invoke ...
19
+ * recordCallDuration(storage, providerGhii, ext, action, Date.now() - started);
20
+ * @version-history
21
+ * v1.0.0 — 2026-07-25 — Initial: measure so an ODPS service commitment can be proposed from data.
22
+ */
23
+ import type { Storage } from '../storage/interface.js';
24
+ /** The public record a coordinate's timings live in, under the PROVIDER's GHII. */
25
+ export declare function timingKey(ext: string, action: string): string;
26
+ /** What a buyer (and the provider's own editor) can read about a capability's observed speed. */
27
+ export interface CallTiming {
28
+ /** Calls actually timed. Not the same as billed calls: only successful invokes are measured. */
29
+ count: number;
30
+ p50Ms: number;
31
+ p95Ms: number;
32
+ maxMs: number;
33
+ /** The most recent durations, kept bounded so percentiles stay recomputable without a metrics store. */
34
+ samples: number[];
35
+ updatedAt: string;
36
+ }
37
+ /**
38
+ * Buffer one observed duration. Never awaited by the call path: a slow or failing metrics write must
39
+ * not slow down, or fail, the call it is measuring.
40
+ */
41
+ export declare function recordCallDuration(storage: Storage, providerGhii: string, ext: string, action: string, ms: number): void;
42
+ /** Merge the buffer into the stored records. Safe to call at any time; a failure only loses samples. */
43
+ export declare function flushCallTimings(storage: Storage): Promise<void>;
44
+ /**
45
+ * Read what has been measured for a coordinate, INCLUDING durations still sitting in the buffer.
46
+ * Reader and recorder share a process, so there is no reason to make a provider wait out a flush
47
+ * interval to see the call they just made: an empty measurement they cannot explain is exactly the
48
+ * kind of thing that makes a UI look broken.
49
+ */
50
+ export declare function readCallTiming(storage: Storage, providerGhii: string, ext: string, action: string): Promise<CallTiming | null>;
51
+ //# sourceMappingURL=call-timing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-timing.d.ts","sourceRoot":"","sources":["../../../src/services/call-timing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAGvD,mFAAmF;AACnF,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,iGAAiG;AACjG,MAAM,WAAW,UAAU;IACzB,gGAAgG;IAChG,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,wGAAwG;IACxG,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAeD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAUxH;AAED,wGAAwG;AACxG,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BtE;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAmBpI"}
@@ -0,0 +1,91 @@
1
+ import { logger } from '../utils/logger.js';
2
+ /** The public record a coordinate's timings live in, under the PROVIDER's GHII. */
3
+ export function timingKey(ext, action) {
4
+ return `exchange.timing.${ext}.${action}`;
5
+ }
6
+ const SAMPLE_CAP = 200;
7
+ const FLUSH_MS = 60_000;
8
+ const pending = new Map();
9
+ let timer = null;
10
+ function percentile(sorted, p) {
11
+ if (!sorted.length)
12
+ return 0;
13
+ const idx = Math.min(sorted.length - 1, Math.max(0, Math.ceil((p / 100) * sorted.length) - 1));
14
+ return sorted[idx];
15
+ }
16
+ /**
17
+ * Buffer one observed duration. Never awaited by the call path: a slow or failing metrics write must
18
+ * not slow down, or fail, the call it is measuring.
19
+ */
20
+ export function recordCallDuration(storage, providerGhii, ext, action, ms) {
21
+ if (!Number.isFinite(ms) || ms < 0)
22
+ return;
23
+ const k = `${providerGhii}|${ext}|${action}`;
24
+ const entry = pending.get(k) ?? { providerGhii, ext, action, durations: [] };
25
+ entry.durations.push(Math.round(ms));
26
+ pending.set(k, entry);
27
+ if (!timer) {
28
+ timer = setInterval(() => { void flushCallTimings(storage); }, FLUSH_MS);
29
+ timer.unref?.();
30
+ }
31
+ }
32
+ /** Merge the buffer into the stored records. Safe to call at any time; a failure only loses samples. */
33
+ export async function flushCallTimings(storage) {
34
+ if (!pending.size)
35
+ return;
36
+ const batch = [...pending.values()];
37
+ pending.clear();
38
+ for (const item of batch) {
39
+ try {
40
+ const key = timingKey(item.ext, item.action);
41
+ const existing = (await storage.getMemory(item.providerGhii, key))?.value;
42
+ const samples = [...(existing?.samples ?? []), ...item.durations].slice(-SAMPLE_CAP);
43
+ const sorted = [...samples].sort((a, b) => a - b);
44
+ const now = new Date().toISOString();
45
+ const value = {
46
+ count: (existing?.count ?? 0) + item.durations.length,
47
+ p50Ms: percentile(sorted, 50),
48
+ p95Ms: percentile(sorted, 95),
49
+ maxMs: Math.max(existing?.maxMs ?? 0, ...item.durations),
50
+ samples,
51
+ updatedAt: now,
52
+ };
53
+ await storage.setMemory({
54
+ key, ownerGaii: item.providerGhii, value, visibility: 'public',
55
+ tags: ['exchange', 'timing'], ttlHours: null, version: 1, createdAt: now, updatedAt: now,
56
+ });
57
+ }
58
+ catch (err) {
59
+ logger.warn('[call-timing] could not flush timings', { ext: item.ext, action: item.action, error: String(err) });
60
+ }
61
+ }
62
+ }
63
+ /**
64
+ * Read what has been measured for a coordinate, INCLUDING durations still sitting in the buffer.
65
+ * Reader and recorder share a process, so there is no reason to make a provider wait out a flush
66
+ * interval to see the call they just made: an empty measurement they cannot explain is exactly the
67
+ * kind of thing that makes a UI look broken.
68
+ */
69
+ export async function readCallTiming(storage, providerGhii, ext, action) {
70
+ let stored;
71
+ try {
72
+ stored = (await storage.getMemory(providerGhii, timingKey(ext, action)))?.value ?? null;
73
+ }
74
+ catch {
75
+ stored = null;
76
+ }
77
+ const buffered = pending.get(`${providerGhii}|${ext}|${action}`)?.durations ?? [];
78
+ if (!buffered.length)
79
+ return stored;
80
+ const samples = [...(stored?.samples ?? []), ...buffered].slice(-SAMPLE_CAP);
81
+ const sorted = [...samples].sort((a, b) => a - b);
82
+ return {
83
+ count: (stored?.count ?? 0) + buffered.length,
84
+ p50Ms: percentile(sorted, 50),
85
+ p95Ms: percentile(sorted, 95),
86
+ maxMs: Math.max(stored?.maxMs ?? 0, ...buffered),
87
+ samples,
88
+ updatedAt: new Date().toISOString(),
89
+ };
90
+ }
91
+ //# sourceMappingURL=call-timing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-timing.js","sourceRoot":"","sources":["../../../src/services/call-timing.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,8 @@
5
5
  * @version-history
6
6
  * v1.0.0 - 2026-05-02 - Initial invoke proxy for extensions and manual webhooks
7
7
  * v1.1.0 - 2026-06-14 - Add `case 'ecosystem'`: route invocation over the tunnel to a bound GEAI.
8
+ * v1.2.0 - 2026-07-25 - Name the caller-token failures (CALLER_TOKEN_MISSING / CALLER_TOKEN_INVALID)
9
+ * instead of reporting the route's AUTH_REQUIRED as an opaque EXTENSION_ERROR.
8
10
  */
9
11
  import type { AimeatConfig } from '../config.js';
10
12
  import type { Storage, CapabilityRecord } from '../storage/interface.js';
@@ -1 +1 @@
1
- {"version":3,"file":"capability-invoke.d.ts","sourceRoot":"","sources":["../../../src/services/capability-invoke.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAKzE,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,IAAI,EAAE,QAAQ,GAAG,KAAK,CAAC;CACxB;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,gBAAgB,EAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,QAAQ,GAAG,KAAgB,GAChC,OAAO,CAAC,YAAY,CAAC,CAmHvB"}
1
+ {"version":3,"file":"capability-invoke.d.ts","sourceRoot":"","sources":["../../../src/services/capability-invoke.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAKzE,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,IAAI,EAAE,QAAQ,GAAG,KAAK,CAAC;CACxB;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,gBAAgB,EAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,QAAQ,GAAG,KAAgB,GAChC,OAAO,CAAC,YAAY,CAAC,CAoIvB"}
@@ -23,6 +23,13 @@ export async function invokeCapability(config, storage, capability, input, calle
23
23
  const parts = capability.source.ref.split(':');
24
24
  const extName = parts[1];
25
25
  const actionId = parts[2];
26
+ // The extension runs behind the node's own AUTHENTICATED HTTP surface, so the caller's token
27
+ // travels with the invocation. A caller that hands us no token cannot be served here — say so
28
+ // before the round trip, because the route's generic AUTH_REQUIRED surfaces as an opaque
29
+ // "extension failed" and sends the reader hunting inside the extension instead.
30
+ if (!jwt) {
31
+ throw Object.assign(new Error(`Cannot invoke "${capability.id}": no caller token was supplied. An extension-backed capability runs as the caller, so the invocation needs the caller's current bearer token.`), { statusCode: 401, code: 'CALLER_TOKEN_MISSING' });
32
+ }
26
33
  const response = await fetch(`http://127.0.0.1:${config.port}/v1/ext/${extName}/${actionId}`, {
27
34
  method: 'POST',
28
35
  headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${jwt}` },
@@ -30,6 +37,9 @@ export async function invokeCapability(config, storage, capability, input, calle
30
37
  });
31
38
  const body = await response.json();
32
39
  if (!body.ok) {
40
+ if (response.status === 401) {
41
+ throw Object.assign(new Error(`Cannot invoke "${capability.id}": the caller's token was rejected (expired or revoked). Refresh the session token and call again.`), { statusCode: 401, code: 'CALLER_TOKEN_INVALID' });
42
+ }
33
43
  throw Object.assign(new Error(body.error?.message || 'Extension invoke failed'), { statusCode: response.status, code: 'EXTENSION_ERROR' });
34
44
  }
35
45
  result = mode === 'raw' ? body : body.data;
@@ -1 +1 @@
1
- {"version":3,"file":"capability-invoke.js","sourceRoot":"","sources":["../../../src/services/capability-invoke.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capability-invoke.js","sourceRoot":"","sources":["../../../src/services/capability-invoke.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config-schema.d.ts","sourceRoot":"","sources":["../../../src/services/config-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAIjD,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,GAAG,EAAE,MAAM,YAAY,CAAC;IACxB,2EAA2E;IAC3E,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC3D,0BAA0B;IAC1B,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;IAClC,6CAA6C;IAC7C,SAAS,EAAE,OAAO,CAAC;IACnB,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,YAAY,CAAC,EAAE,SAAS,GAAG,YAAY,GAAG,QAAQ,CAAC;CACpD;AAID,eAAO,MAAM,aAAa,EAAE,cAAc,EAkUzC,CAAC;AAIF,sDAAsD;AACtD,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAM,CAAC;AAErE,6CAA6C;AAC7C,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAM,CAAC;AAEjE,uCAAuC;AACvC,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,CAAC;AAE1D,uCAAuC;AACvC,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,CAAC;AAW1D,wFAAwF;AACxF,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAY5E;AAED,wDAAwD;AACxD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAG3D"}
1
+ {"version":3,"file":"config-schema.d.ts","sourceRoot":"","sources":["../../../src/services/config-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAIjD,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,GAAG,EAAE,MAAM,YAAY,CAAC;IACxB,2EAA2E;IAC3E,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC3D,0BAA0B;IAC1B,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;IAClC,6CAA6C;IAC7C,SAAS,EAAE,OAAO,CAAC;IACnB,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,YAAY,CAAC,EAAE,SAAS,GAAG,YAAY,GAAG,QAAQ,CAAC;CACpD;AAID,eAAO,MAAM,aAAa,EAAE,cAAc,EAwUzC,CAAC;AAIF,sDAAsD;AACtD,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAM,CAAC;AAErE,6CAA6C;AAC7C,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAM,CAAC;AAEjE,uCAAuC;AACvC,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,CAAC;AAE1D,uCAAuC;AACvC,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,CAAC;AAW1D,wFAAwF;AACxF,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAY5E;AAED,wDAAwD;AACxD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAG3D"}
@@ -26,6 +26,12 @@ export const CONFIG_FIELDS = [
26
26
  // ── Morsel Policy (mutable) ──
27
27
  { key: 'welcomeBonus', dotPath: 'morsel_policy.welcome_bonus', envVar: 'AIMEAT_WELCOME_BONUS', type: 'number', validate: v => typeof v === 'number' && Number.isInteger(v) && v >= 0, immutable: false, description: 'Morsels granted to new agents', range: '0-10000' },
28
28
  { key: 'dailyAllowance', dotPath: 'morsel_policy.daily_allowance', envVar: 'AIMEAT_DAILY_ALLOWANCE', type: 'number', validate: v => typeof v === 'number' && Number.isInteger(v) && v >= 0, immutable: false, description: 'Daily morsel allowance per agent', range: '0-10000' },
29
+ // The pacing floor sits with the morsel policy because that is what it is: how fast the daily
30
+ // allowance lets anyone consume a capability, whatever they pay for it in.
31
+ { key: 'pacingTollDefault', dotPath: 'morsel_policy.pacing_toll_default', envVar: 'AIMEAT_PACING_TOLL_DEFAULT', type: 'number',
32
+ validate: v => typeof v === 'number' && Number.isInteger(v) && v >= 0 && v <= 100, immutable: false,
33
+ description: 'Morsels burned per metered call when a capability declares no toll of its own. Bounds the call RATE for every capability, including money-priced ones. 0 = off; at 1 a consumer can make about 500 calls a day.',
34
+ range: '0-100' },
29
35
  { key: 'dailyAllowanceCap', dotPath: 'morsel_policy.daily_allowance_cap', envVar: 'AIMEAT_DAILY_ALLOWANCE_CAP', type: 'number', validate: v => typeof v === 'number' && Number.isInteger(v) && v >= 0, immutable: false, description: 'Max balance for daily allowance eligibility', range: '0-100000' },
30
36
  { key: 'burnRate', dotPath: 'morsel_policy.burn_rate', envVar: 'AIMEAT_BURN_RATE', type: 'float', validate: v => typeof v === 'number' && v >= 0 && v <= 1, immutable: false, description: 'Fraction of network fees burned', range: '0.0-1.0' },
31
37
  { key: 'maxOperatorMintPerDay', dotPath: 'morsel_policy.max_operator_mint_per_day', envVar: 'AIMEAT_MAX_OPERATOR_MINT_PER_DAY', type: 'number', validate: v => typeof v === 'number' && Number.isInteger(v) && v >= 0, immutable: false, description: 'Max morsels operator can mint per day', range: '0-1000000' },