aimeat 3.2.0 → 3.3.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 (507) hide show
  1. package/dist/.env.example +58 -1
  2. package/dist/build-stamp.json +4 -4
  3. package/dist/locales/en.json +41 -1
  4. package/dist/locales/es.json +41 -1
  5. package/dist/locales/fi.json +43 -3
  6. package/dist/public/changelog.json +12 -0
  7. package/dist/public/css/views/chat.css +388 -0
  8. package/dist/public/js/services/chat.js +190 -0
  9. package/dist/public/js/services/speech-reader.js +26 -0
  10. package/dist/public/lib/VENDORED.md +1 -0
  11. package/dist/public/lib/duckdb-wasm@1.32.0/duckdb-browser-eh.worker.js +14 -0
  12. package/dist/public/lib/duckdb-wasm@1.32.0/duckdb-browser.js +23 -0
  13. package/dist/public/lib/duckdb-wasm@1.32.0/duckdb-eh.wasm +0 -0
  14. package/dist/public/lib/duckdb-wasm@1.32.0/extensions/v1.4.3/wasm_eh/parquet.duckdb_extension.wasm +0 -0
  15. package/dist/public/lib/vendored-assets.json +19 -0
  16. package/dist/public/llms-full-template.txt +2706 -0
  17. package/dist/public/llms-index-template.txt +60 -0
  18. package/dist/public/robots.node.txt +64 -23
  19. package/dist/public/spa.html +8 -1
  20. package/dist/public/views/chat/parts.js +257 -0
  21. package/dist/public/views/chat.js +327 -0
  22. package/dist/public/views/landing.js +24 -1
  23. package/dist/public/views/profile/agents/scope-model.js +320 -315
  24. package/dist/scripts/audit-mcp-schemas.js +41 -0
  25. package/dist/scripts/audit-mcp-schemas.js.map +1 -1
  26. package/dist/scripts/build-sdk-libs.d.ts.map +1 -1
  27. package/dist/scripts/build-sdk-libs.js +1 -0
  28. package/dist/scripts/build-sdk-libs.js.map +1 -1
  29. package/dist/scripts/check-ai-disclosure.js +11 -0
  30. package/dist/scripts/check-ai-disclosure.js.map +1 -1
  31. package/dist/scripts/check-denial-coverage.d.ts +29 -0
  32. package/dist/scripts/check-denial-coverage.d.ts.map +1 -0
  33. package/dist/scripts/check-denial-coverage.js +237 -0
  34. package/dist/scripts/check-denial-coverage.js.map +1 -0
  35. package/dist/scripts/check-ext-entrypoints.js +14 -2
  36. package/dist/scripts/check-ext-entrypoints.js.map +1 -1
  37. package/dist/scripts/check-outbound-fetch.d.ts.map +1 -1
  38. package/dist/scripts/check-outbound-fetch.js +16 -2
  39. package/dist/scripts/check-outbound-fetch.js.map +1 -1
  40. package/dist/scripts/check-sse-parity.js +14 -0
  41. package/dist/scripts/check-sse-parity.js.map +1 -1
  42. package/dist/scripts/indexnow.js +9 -7
  43. package/dist/scripts/indexnow.js.map +1 -1
  44. package/dist/src/auth/middleware.d.ts +7 -0
  45. package/dist/src/auth/middleware.d.ts.map +1 -1
  46. package/dist/src/auth/middleware.js +15 -21
  47. package/dist/src/auth/middleware.js.map +1 -1
  48. package/dist/src/cli/connect/mcp/tools/agent-tasks.d.ts +4 -0
  49. package/dist/src/cli/connect/mcp/tools/agent-tasks.d.ts.map +1 -1
  50. package/dist/src/cli/connect/mcp/tools/agent-tasks.js +11 -1
  51. package/dist/src/cli/connect/mcp/tools/agent-tasks.js.map +1 -1
  52. package/dist/src/cli/connect/mcp/tools/apps.d.ts.map +1 -1
  53. package/dist/src/cli/connect/mcp/tools/apps.js +88 -0
  54. package/dist/src/cli/connect/mcp/tools/apps.js.map +1 -1
  55. package/dist/src/cli/connect/mcp/tools/core.d.ts +7 -0
  56. package/dist/src/cli/connect/mcp/tools/core.d.ts.map +1 -1
  57. package/dist/src/cli/connect/mcp/tools/core.js +83 -4
  58. package/dist/src/cli/connect/mcp/tools/core.js.map +1 -1
  59. package/dist/src/cli/connect/onboarding-prompt.js +1 -1
  60. package/dist/src/cli/connect/skill-bundle.js +1 -1
  61. package/dist/src/cli/connect/tool-call-defs-app-draft-edit.d.ts +21 -0
  62. package/dist/src/cli/connect/tool-call-defs-app-draft-edit.d.ts.map +1 -0
  63. package/dist/src/cli/connect/tool-call-defs-app-draft-edit.js +137 -0
  64. package/dist/src/cli/connect/tool-call-defs-app-draft-edit.js.map +1 -0
  65. package/dist/src/cli/connect/tool-call-defs-core.d.ts +1 -0
  66. package/dist/src/cli/connect/tool-call-defs-core.d.ts.map +1 -1
  67. package/dist/src/cli/connect/tool-call-defs-core.js +30 -0
  68. package/dist/src/cli/connect/tool-call-defs-core.js.map +1 -1
  69. package/dist/src/cli/connect/tool-call.d.ts.map +1 -1
  70. package/dist/src/cli/connect/tool-call.js +2 -0
  71. package/dist/src/cli/connect/tool-call.js.map +1 -1
  72. package/dist/src/config-types-ai.d.ts +76 -0
  73. package/dist/src/config-types-ai.d.ts.map +1 -0
  74. package/dist/src/config-types-ai.js +15 -0
  75. package/dist/src/config-types-ai.js.map +1 -0
  76. package/dist/src/config-types.d.ts +11 -2
  77. package/dist/src/config-types.d.ts.map +1 -1
  78. package/dist/src/config.d.ts.map +1 -1
  79. package/dist/src/config.js +25 -4
  80. package/dist/src/config.js.map +1 -1
  81. package/dist/src/data/builtin-skills.d.ts.map +1 -1
  82. package/dist/src/data/builtin-skills.js +3 -2
  83. package/dist/src/data/builtin-skills.js.map +1 -1
  84. package/dist/src/data/digital-signage-package.js +1 -1
  85. package/dist/src/data/library-packs/sdk.d.ts.map +1 -1
  86. package/dist/src/data/library-packs/sdk.js +76 -0
  87. package/dist/src/data/library-packs/sdk.js.map +1 -1
  88. package/dist/src/data/library-packs/vendored.d.ts.map +1 -1
  89. package/dist/src/data/library-packs/vendored.js +81 -0
  90. package/dist/src/data/library-packs/vendored.js.map +1 -1
  91. package/dist/src/data/library-packs.d.ts +2 -2
  92. package/dist/src/data/library-packs.js +2 -2
  93. package/dist/src/data/public-pages.d.ts +13 -0
  94. package/dist/src/data/public-pages.d.ts.map +1 -1
  95. package/dist/src/data/public-pages.js +153 -113
  96. package/dist/src/data/public-pages.js.map +1 -1
  97. package/dist/src/generated/api-types.d.ts +1652 -36
  98. package/dist/src/generated/api-types.d.ts.map +1 -1
  99. package/dist/src/index-start.d.ts.map +1 -1
  100. package/dist/src/index-start.js +3 -0
  101. package/dist/src/index-start.js.map +1 -1
  102. package/dist/src/mcp/agent-tasks.d.ts.map +1 -1
  103. package/dist/src/mcp/agent-tasks.js +5 -0
  104. package/dist/src/mcp/agent-tasks.js.map +1 -1
  105. package/dist/src/mcp/ai-image.d.ts +22 -0
  106. package/dist/src/mcp/ai-image.d.ts.map +1 -0
  107. package/dist/src/mcp/ai-image.js +60 -0
  108. package/dist/src/mcp/ai-image.js.map +1 -0
  109. package/dist/src/mcp/annotations.d.ts +5 -0
  110. package/dist/src/mcp/annotations.d.ts.map +1 -1
  111. package/dist/src/mcp/annotations.js +18 -0
  112. package/dist/src/mcp/annotations.js.map +1 -1
  113. package/dist/src/mcp/apps-draft-edit.d.ts +28 -0
  114. package/dist/src/mcp/apps-draft-edit.d.ts.map +1 -0
  115. package/dist/src/mcp/apps-draft-edit.js +164 -0
  116. package/dist/src/mcp/apps-draft-edit.js.map +1 -0
  117. package/dist/src/mcp/apps-screenshot.d.ts +26 -0
  118. package/dist/src/mcp/apps-screenshot.d.ts.map +1 -0
  119. package/dist/src/mcp/apps-screenshot.js +39 -0
  120. package/dist/src/mcp/apps-screenshot.js.map +1 -0
  121. package/dist/src/mcp/catalog/definitions/discovery-work-boards.d.ts +1 -0
  122. package/dist/src/mcp/catalog/definitions/discovery-work-boards.d.ts.map +1 -1
  123. package/dist/src/mcp/catalog/definitions/discovery-work-boards.js +40 -0
  124. package/dist/src/mcp/catalog/definitions/discovery-work-boards.js.map +1 -1
  125. package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.d.ts +3 -0
  126. package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.d.ts.map +1 -1
  127. package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.js +74 -0
  128. package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.js.map +1 -1
  129. package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.d.ts.map +1 -1
  130. package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.js +1 -0
  131. package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.js.map +1 -1
  132. package/dist/src/mcp/catalog/scopes.d.ts.map +1 -1
  133. package/dist/src/mcp/catalog/scopes.js +19 -1
  134. package/dist/src/mcp/catalog/scopes.js.map +1 -1
  135. package/dist/src/mcp/catalog/surfaces.d.ts.map +1 -1
  136. package/dist/src/mcp/catalog/surfaces.js +18 -4
  137. package/dist/src/mcp/catalog/surfaces.js.map +1 -1
  138. package/dist/src/mcp/core-datapackage.d.ts +32 -0
  139. package/dist/src/mcp/core-datapackage.d.ts.map +1 -0
  140. package/dist/src/mcp/core-datapackage.js +188 -0
  141. package/dist/src/mcp/core-datapackage.js.map +1 -0
  142. package/dist/src/mcp/core-storage.d.ts +7 -3
  143. package/dist/src/mcp/core-storage.d.ts.map +1 -1
  144. package/dist/src/mcp/core-storage.js +27 -4
  145. package/dist/src/mcp/core-storage.js.map +1 -1
  146. package/dist/src/mcp/core.d.ts.map +1 -1
  147. package/dist/src/mcp/core.js +3 -0
  148. package/dist/src/mcp/core.js.map +1 -1
  149. package/dist/src/mcp/extensions.d.ts.map +1 -1
  150. package/dist/src/mcp/extensions.js +11 -1
  151. package/dist/src/mcp/extensions.js.map +1 -1
  152. package/dist/src/mcp/index.d.ts +9 -0
  153. package/dist/src/mcp/index.d.ts.map +1 -1
  154. package/dist/src/mcp/index.js +34 -0
  155. package/dist/src/mcp/index.js.map +1 -1
  156. package/dist/src/models/agent-task-schemas.d.ts.map +1 -1
  157. package/dist/src/models/agent-task-schemas.js +12 -1
  158. package/dist/src/models/agent-task-schemas.js.map +1 -1
  159. package/dist/src/models/workflow-schemas.d.ts +178 -1
  160. package/dist/src/models/workflow-schemas.d.ts.map +1 -1
  161. package/dist/src/models/workflow-schemas.js +75 -0
  162. package/dist/src/models/workflow-schemas.js.map +1 -1
  163. package/dist/src/routes/admin-extensions.d.ts +4 -0
  164. package/dist/src/routes/admin-extensions.d.ts.map +1 -1
  165. package/dist/src/routes/admin-extensions.js +135 -142
  166. package/dist/src/routes/admin-extensions.js.map +1 -1
  167. package/dist/src/routes/agent-conventions.d.ts.map +1 -1
  168. package/dist/src/routes/agent-conventions.js +4 -2
  169. package/dist/src/routes/agent-conventions.js.map +1 -1
  170. package/dist/src/routes/agent-docs.d.ts +4 -4
  171. package/dist/src/routes/agent-docs.js +145 -145
  172. package/dist/src/routes/agent-docs.js.map +1 -1
  173. package/dist/src/routes/agent-messages.d.ts +6 -0
  174. package/dist/src/routes/agent-messages.d.ts.map +1 -1
  175. package/dist/src/routes/agent-messages.js +23 -1
  176. package/dist/src/routes/agent-messages.js.map +1 -1
  177. package/dist/src/routes/agent-tasks/create-read.d.ts.map +1 -1
  178. package/dist/src/routes/agent-tasks/create-read.js +8 -1
  179. package/dist/src/routes/agent-tasks/create-read.js.map +1 -1
  180. package/dist/src/routes/agent-tasks/lifecycle.d.ts +4 -1
  181. package/dist/src/routes/agent-tasks/lifecycle.d.ts.map +1 -1
  182. package/dist/src/routes/agent-tasks/lifecycle.js +80 -2
  183. package/dist/src/routes/agent-tasks/lifecycle.js.map +1 -1
  184. package/dist/src/routes/ai.d.ts +5 -0
  185. package/dist/src/routes/ai.d.ts.map +1 -1
  186. package/dist/src/routes/ai.js +51 -1
  187. package/dist/src/routes/ai.js.map +1 -1
  188. package/dist/src/routes/app-grants.d.ts.map +1 -1
  189. package/dist/src/routes/app-grants.js +5 -0
  190. package/dist/src/routes/app-grants.js.map +1 -1
  191. package/dist/src/routes/apps/drafts.d.ts +6 -0
  192. package/dist/src/routes/apps/drafts.d.ts.map +1 -1
  193. package/dist/src/routes/apps/drafts.js +133 -1
  194. package/dist/src/routes/apps/drafts.js.map +1 -1
  195. package/dist/src/routes/apps/read.d.ts.map +1 -1
  196. package/dist/src/routes/apps/read.js +38 -1
  197. package/dist/src/routes/apps/read.js.map +1 -1
  198. package/dist/src/routes/auth-otk.d.ts +28 -0
  199. package/dist/src/routes/auth-otk.d.ts.map +1 -0
  200. package/dist/src/routes/auth-otk.js +190 -0
  201. package/dist/src/routes/auth-otk.js.map +1 -0
  202. package/dist/src/routes/auth.d.ts +17 -0
  203. package/dist/src/routes/auth.d.ts.map +1 -1
  204. package/dist/src/routes/auth.js +44 -153
  205. package/dist/src/routes/auth.js.map +1 -1
  206. package/dist/src/routes/bootstrap.d.ts +6 -0
  207. package/dist/src/routes/bootstrap.d.ts.map +1 -1
  208. package/dist/src/routes/bootstrap.js +47 -20
  209. package/dist/src/routes/bootstrap.js.map +1 -1
  210. package/dist/src/routes/chat.d.ts +23 -0
  211. package/dist/src/routes/chat.d.ts.map +1 -0
  212. package/dist/src/routes/chat.js +165 -0
  213. package/dist/src/routes/chat.js.map +1 -0
  214. package/dist/src/routes/commerce.js +4 -4
  215. package/dist/src/routes/commerce.js.map +1 -1
  216. package/dist/src/routes/datapackages.d.ts +35 -0
  217. package/dist/src/routes/datapackages.d.ts.map +1 -0
  218. package/dist/src/routes/datapackages.js +217 -0
  219. package/dist/src/routes/datapackages.js.map +1 -0
  220. package/dist/src/routes/disputes.d.ts +8 -0
  221. package/dist/src/routes/disputes.d.ts.map +1 -1
  222. package/dist/src/routes/disputes.js +52 -1
  223. package/dist/src/routes/disputes.js.map +1 -1
  224. package/dist/src/routes/ecosystem-apps-advisories.d.ts +16 -0
  225. package/dist/src/routes/ecosystem-apps-advisories.d.ts.map +1 -0
  226. package/dist/src/routes/ecosystem-apps-advisories.js +104 -0
  227. package/dist/src/routes/ecosystem-apps-advisories.js.map +1 -0
  228. package/dist/src/routes/ecosystem-apps.d.ts +6 -0
  229. package/dist/src/routes/ecosystem-apps.d.ts.map +1 -1
  230. package/dist/src/routes/ecosystem-apps.js +31 -99
  231. package/dist/src/routes/ecosystem-apps.js.map +1 -1
  232. package/dist/src/routes/extensions/actions.d.ts.map +1 -1
  233. package/dist/src/routes/extensions/actions.js +29 -1
  234. package/dist/src/routes/extensions/actions.js.map +1 -1
  235. package/dist/src/routes/federation-sync/routing.d.ts.map +1 -1
  236. package/dist/src/routes/federation-sync/routing.js +12 -3
  237. package/dist/src/routes/federation-sync/routing.js.map +1 -1
  238. package/dist/src/routes/glossary.js +1 -1
  239. package/dist/src/routes/glossary.js.map +1 -1
  240. package/dist/src/routes/home/track.d.ts +5 -1
  241. package/dist/src/routes/home/track.d.ts.map +1 -1
  242. package/dist/src/routes/home/track.js +20 -6
  243. package/dist/src/routes/home/track.js.map +1 -1
  244. package/dist/src/routes/instances/install.d.ts +3 -0
  245. package/dist/src/routes/instances/install.d.ts.map +1 -1
  246. package/dist/src/routes/instances/install.js +17 -24
  247. package/dist/src/routes/instances/install.js.map +1 -1
  248. package/dist/src/routes/libs.js +1 -1
  249. package/dist/src/routes/libs.js.map +1 -1
  250. package/dist/src/routes/markdown-mirrors.js +1 -1
  251. package/dist/src/routes/markdown-mirrors.js.map +1 -1
  252. package/dist/src/routes/odata.d.ts +36 -0
  253. package/dist/src/routes/odata.d.ts.map +1 -0
  254. package/dist/src/routes/odata.js +143 -0
  255. package/dist/src/routes/odata.js.map +1 -0
  256. package/dist/src/routes/openrouter.d.ts +4 -0
  257. package/dist/src/routes/openrouter.d.ts.map +1 -1
  258. package/dist/src/routes/openrouter.js +10 -1
  259. package/dist/src/routes/openrouter.js.map +1 -1
  260. package/dist/src/routes/organisms/gates.d.ts.map +1 -1
  261. package/dist/src/routes/organisms/gates.js +9 -2
  262. package/dist/src/routes/organisms/gates.js.map +1 -1
  263. package/dist/src/routes/portal.d.ts +1 -0
  264. package/dist/src/routes/portal.d.ts.map +1 -1
  265. package/dist/src/routes/portal.js +13 -0
  266. package/dist/src/routes/portal.js.map +1 -1
  267. package/dist/src/routes/schedules.d.ts +4 -0
  268. package/dist/src/routes/schedules.d.ts.map +1 -1
  269. package/dist/src/routes/schedules.js +9 -1
  270. package/dist/src/routes/schedules.js.map +1 -1
  271. package/dist/src/routes/storage-files.d.ts +23 -0
  272. package/dist/src/routes/storage-files.d.ts.map +1 -1
  273. package/dist/src/routes/storage-files.js +103 -82
  274. package/dist/src/routes/storage-files.js.map +1 -1
  275. package/dist/src/routes/workflows.d.ts.map +1 -1
  276. package/dist/src/routes/workflows.js +9 -1
  277. package/dist/src/routes/workflows.js.map +1 -1
  278. package/dist/src/server-bootstrap/routes-loader.d.ts +2 -0
  279. package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
  280. package/dist/src/server-bootstrap/routes-loader.js +20 -2
  281. package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
  282. package/dist/src/server-bootstrap/service-init.d.ts.map +1 -1
  283. package/dist/src/server-bootstrap/service-init.js +12 -7
  284. package/dist/src/server-bootstrap/service-init.js.map +1 -1
  285. package/dist/src/server-bootstrap/static-files.d.ts.map +1 -1
  286. package/dist/src/server-bootstrap/static-files.js +44 -10
  287. package/dist/src/server-bootstrap/static-files.js.map +1 -1
  288. package/dist/src/services/ai-allowance.d.ts +82 -0
  289. package/dist/src/services/ai-allowance.d.ts.map +1 -0
  290. package/dist/src/services/ai-allowance.js +117 -0
  291. package/dist/src/services/ai-allowance.js.map +1 -0
  292. package/dist/src/services/ai-completion.d.ts +26 -0
  293. package/dist/src/services/ai-completion.d.ts.map +1 -1
  294. package/dist/src/services/ai-completion.js +41 -13
  295. package/dist/src/services/ai-completion.js.map +1 -1
  296. package/dist/src/services/ai-image.d.ts +70 -0
  297. package/dist/src/services/ai-image.d.ts.map +1 -0
  298. package/dist/src/services/ai-image.js +104 -0
  299. package/dist/src/services/ai-image.js.map +1 -0
  300. package/dist/src/services/ai-model-defaults.d.ts +45 -0
  301. package/dist/src/services/ai-model-defaults.d.ts.map +1 -0
  302. package/dist/src/services/ai-model-defaults.js +42 -0
  303. package/dist/src/services/ai-model-defaults.js.map +1 -0
  304. package/dist/src/services/ai-tool-setup.d.ts +5 -1
  305. package/dist/src/services/ai-tool-setup.d.ts.map +1 -1
  306. package/dist/src/services/ai-tool-setup.js +36 -0
  307. package/dist/src/services/ai-tool-setup.js.map +1 -1
  308. package/dist/src/services/ai-transcription.d.ts +5 -0
  309. package/dist/src/services/ai-transcription.d.ts.map +1 -1
  310. package/dist/src/services/ai-transcription.js +5 -2
  311. package/dist/src/services/ai-transcription.js.map +1 -1
  312. package/dist/src/services/app-agent-surfaces.js +4 -4
  313. package/dist/src/services/app-agent-surfaces.js.map +1 -1
  314. package/dist/src/services/app-draft-edit.d.ts +144 -0
  315. package/dist/src/services/app-draft-edit.d.ts.map +1 -0
  316. package/dist/src/services/app-draft-edit.js +203 -0
  317. package/dist/src/services/app-draft-edit.js.map +1 -0
  318. package/dist/src/services/auth-md.js +2 -2
  319. package/dist/src/services/auth-md.js.map +1 -1
  320. package/dist/src/services/board-write.d.ts +11 -3
  321. package/dist/src/services/board-write.d.ts.map +1 -1
  322. package/dist/src/services/board-write.js +24 -3
  323. package/dist/src/services/board-write.js.map +1 -1
  324. package/dist/src/services/chat-agent.d.ts +36 -0
  325. package/dist/src/services/chat-agent.d.ts.map +1 -0
  326. package/dist/src/services/chat-agent.js +123 -0
  327. package/dist/src/services/chat-agent.js.map +1 -0
  328. package/dist/src/services/chat-session.d.ts +58 -0
  329. package/dist/src/services/chat-session.d.ts.map +1 -0
  330. package/dist/src/services/chat-session.js +151 -0
  331. package/dist/src/services/chat-session.js.map +1 -0
  332. package/dist/src/services/chat-threads.d.ts +61 -0
  333. package/dist/src/services/chat-threads.d.ts.map +1 -0
  334. package/dist/src/services/chat-threads.js +137 -0
  335. package/dist/src/services/chat-threads.js.map +1 -0
  336. package/dist/src/services/config-schema.d.ts.map +1 -1
  337. package/dist/src/services/config-schema.js +2 -1
  338. package/dist/src/services/config-schema.js.map +1 -1
  339. package/dist/src/services/datapackage/contract.d.ts +198 -0
  340. package/dist/src/services/datapackage/contract.d.ts.map +1 -0
  341. package/dist/src/services/datapackage/contract.js +140 -0
  342. package/dist/src/services/datapackage/contract.js.map +1 -0
  343. package/dist/src/services/datapackage/ext-capability.d.ts +85 -0
  344. package/dist/src/services/datapackage/ext-capability.d.ts.map +1 -0
  345. package/dist/src/services/datapackage/ext-capability.js +72 -0
  346. package/dist/src/services/datapackage/ext-capability.js.map +1 -0
  347. package/dist/src/services/datapackage/odata.d.ts +92 -0
  348. package/dist/src/services/datapackage/odata.d.ts.map +1 -0
  349. package/dist/src/services/datapackage/odata.js +256 -0
  350. package/dist/src/services/datapackage/odata.js.map +1 -0
  351. package/dist/src/services/datapackage/odps.d.ts +24 -0
  352. package/dist/src/services/datapackage/odps.d.ts.map +1 -0
  353. package/dist/src/services/datapackage/odps.js +183 -0
  354. package/dist/src/services/datapackage/odps.js.map +1 -0
  355. package/dist/src/services/datapackage/store.d.ts +143 -0
  356. package/dist/src/services/datapackage/store.d.ts.map +1 -0
  357. package/dist/src/services/datapackage/store.js +533 -0
  358. package/dist/src/services/datapackage/store.js.map +1 -0
  359. package/dist/src/services/datapackage/table.d.ts +67 -0
  360. package/dist/src/services/datapackage/table.d.ts.map +1 -0
  361. package/dist/src/services/datapackage/table.js +0 -0
  362. package/dist/src/services/datapackage/table.js.map +1 -0
  363. package/dist/src/services/extension-ctx.d.ts +1 -0
  364. package/dist/src/services/extension-ctx.d.ts.map +1 -1
  365. package/dist/src/services/extension-ctx.js +31 -6
  366. package/dist/src/services/extension-ctx.js.map +1 -1
  367. package/dist/src/services/extension-files.d.ts +20 -0
  368. package/dist/src/services/extension-files.d.ts.map +1 -1
  369. package/dist/src/services/extension-files.js +9 -2
  370. package/dist/src/services/extension-files.js.map +1 -1
  371. package/dist/src/services/extension-lifecycle.d.ts +3 -0
  372. package/dist/src/services/extension-lifecycle.d.ts.map +1 -1
  373. package/dist/src/services/extension-lifecycle.js +2 -26
  374. package/dist/src/services/extension-lifecycle.js.map +1 -1
  375. package/dist/src/services/extension-runtime.d.ts +28 -2
  376. package/dist/src/services/extension-runtime.d.ts.map +1 -1
  377. package/dist/src/services/extension-runtime.js +22 -0
  378. package/dist/src/services/extension-runtime.js.map +1 -1
  379. package/dist/src/services/extension-schedules.d.ts +90 -0
  380. package/dist/src/services/extension-schedules.d.ts.map +1 -0
  381. package/dist/src/services/extension-schedules.js +123 -0
  382. package/dist/src/services/extension-schedules.js.map +1 -0
  383. package/dist/src/services/extension-system-run.d.ts +91 -0
  384. package/dist/src/services/extension-system-run.d.ts.map +1 -0
  385. package/dist/src/services/extension-system-run.js +100 -0
  386. package/dist/src/services/extension-system-run.js.map +1 -0
  387. package/dist/src/services/extension-upsert.d.ts +2 -0
  388. package/dist/src/services/extension-upsert.d.ts.map +1 -1
  389. package/dist/src/services/extension-upsert.js +6 -24
  390. package/dist/src/services/extension-upsert.js.map +1 -1
  391. package/dist/src/services/goose-acp.d.ts +84 -0
  392. package/dist/src/services/goose-acp.d.ts.map +1 -0
  393. package/dist/src/services/goose-acp.js +304 -0
  394. package/dist/src/services/goose-acp.js.map +1 -0
  395. package/dist/src/services/markdown-negotiation.js +1 -1
  396. package/dist/src/services/markdown-negotiation.js.map +1 -1
  397. package/dist/src/services/openrouter.d.ts +20 -1
  398. package/dist/src/services/openrouter.d.ts.map +1 -1
  399. package/dist/src/services/openrouter.js +66 -0
  400. package/dist/src/services/openrouter.js.map +1 -1
  401. package/dist/src/services/prompt-defaults/tiers-core.js +4 -4
  402. package/dist/src/services/scheduler-extension-job.d.ts +29 -6
  403. package/dist/src/services/scheduler-extension-job.d.ts.map +1 -1
  404. package/dist/src/services/scheduler-extension-job.js +29 -75
  405. package/dist/src/services/scheduler-extension-job.js.map +1 -1
  406. package/dist/src/services/scope-vocabulary-migration.d.ts +34 -1
  407. package/dist/src/services/scope-vocabulary-migration.d.ts.map +1 -1
  408. package/dist/src/services/scope-vocabulary-migration.js +60 -0
  409. package/dist/src/services/scope-vocabulary-migration.js.map +1 -1
  410. package/dist/src/services/screenshot-capture.d.ts +40 -1
  411. package/dist/src/services/screenshot-capture.d.ts.map +1 -1
  412. package/dist/src/services/screenshot-capture.js +142 -60
  413. package/dist/src/services/screenshot-capture.js.map +1 -1
  414. package/dist/src/services/skill-bundle/generator.js +1 -1
  415. package/dist/src/services/skill-bundle/generic-adapter.js +1 -1
  416. package/dist/src/services/skill-bundle/hermes-adapter.js +1 -1
  417. package/dist/src/services/storage-file-write.d.ts +36 -1
  418. package/dist/src/services/storage-file-write.d.ts.map +1 -1
  419. package/dist/src/services/storage-file-write.js +49 -3
  420. package/dist/src/services/storage-file-write.js.map +1 -1
  421. package/dist/src/services/task-outcome.d.ts +53 -0
  422. package/dist/src/services/task-outcome.d.ts.map +1 -0
  423. package/dist/src/services/task-outcome.js +28 -0
  424. package/dist/src/services/task-outcome.js.map +1 -0
  425. package/dist/src/services/workflow/engine-human.d.ts +15 -0
  426. package/dist/src/services/workflow/engine-human.d.ts.map +1 -1
  427. package/dist/src/services/workflow/engine-human.js +10 -1
  428. package/dist/src/services/workflow/engine-human.js.map +1 -1
  429. package/dist/src/services/workflow/engine-steps.d.ts +48 -3
  430. package/dist/src/services/workflow/engine-steps.d.ts.map +1 -1
  431. package/dist/src/services/workflow/engine-steps.js +361 -0
  432. package/dist/src/services/workflow/engine-steps.js.map +1 -1
  433. package/dist/src/services/workflow/engine.d.ts +1 -0
  434. package/dist/src/services/workflow/engine.d.ts.map +1 -1
  435. package/dist/src/services/workflow/engine.js +2 -1
  436. package/dist/src/services/workflow/engine.js.map +1 -1
  437. package/dist/src/services/workflow/store.d.ts.map +1 -1
  438. package/dist/src/services/workflow/store.js +60 -4
  439. package/dist/src/services/workflow/store.js.map +1 -1
  440. package/dist/src/services/write-guards.d.ts +27 -1
  441. package/dist/src/services/write-guards.d.ts.map +1 -1
  442. package/dist/src/services/write-guards.js +39 -9
  443. package/dist/src/services/write-guards.js.map +1 -1
  444. package/dist/src/storage/providers/postgres-kysely/db-types.d.ts +1 -0
  445. package/dist/src/storage/providers/postgres-kysely/db-types.d.ts.map +1 -1
  446. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.d.ts +1 -0
  447. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.d.ts.map +1 -1
  448. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.js +3 -0
  449. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.js.map +1 -1
  450. package/dist/src/storage/providers/postgres-kysely/methods/files.d.ts +2 -0
  451. package/dist/src/storage/providers/postgres-kysely/methods/files.d.ts.map +1 -1
  452. package/dist/src/storage/providers/postgres-kysely/methods/files.js +34 -2
  453. package/dist/src/storage/providers/postgres-kysely/methods/files.js.map +1 -1
  454. package/dist/src/storage/providers/postgres-kysely/migrations/0039_storage_file_utf8_verified.sql +19 -0
  455. package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
  456. package/dist/src/storage/providers/sqlite/index.js +2 -1
  457. package/dist/src/storage/providers/sqlite/index.js.map +1 -1
  458. package/dist/src/storage/providers/sqlite/methods/apps.d.ts +1 -0
  459. package/dist/src/storage/providers/sqlite/methods/apps.d.ts.map +1 -1
  460. package/dist/src/storage/providers/sqlite/methods/apps.js +33 -28
  461. package/dist/src/storage/providers/sqlite/methods/apps.js.map +1 -1
  462. package/dist/src/storage/providers/sqlite/methods/identity-nodes.d.ts +1 -12
  463. package/dist/src/storage/providers/sqlite/methods/identity-nodes.d.ts.map +1 -1
  464. package/dist/src/storage/providers/sqlite/methods/identity-nodes.js +28 -135
  465. package/dist/src/storage/providers/sqlite/methods/identity-nodes.js.map +1 -1
  466. package/dist/src/storage/providers/sqlite/methods/storage-files.d.ts +38 -0
  467. package/dist/src/storage/providers/sqlite/methods/storage-files.d.ts.map +1 -0
  468. package/dist/src/storage/providers/sqlite/methods/storage-files.js +109 -0
  469. package/dist/src/storage/providers/sqlite/methods/storage-files.js.map +1 -0
  470. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  471. package/dist/src/storage/providers/sqlite/schema.js +134 -130
  472. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  473. package/dist/src/storage/repositories/app-grant.repository.d.ts +11 -0
  474. package/dist/src/storage/repositories/app-grant.repository.d.ts.map +1 -1
  475. package/dist/src/storage/repositories/file.repository.d.ts +13 -0
  476. package/dist/src/storage/repositories/file.repository.d.ts.map +1 -1
  477. package/dist/src/storage/types/commerce.d.ts +6 -0
  478. package/dist/src/storage/types/commerce.d.ts.map +1 -1
  479. package/dist/src/utils/agent-footer.d.ts.map +1 -1
  480. package/dist/src/utils/agent-footer.js +1 -0
  481. package/dist/src/utils/agent-footer.js.map +1 -1
  482. package/dist/src/utils/app-content-type.d.ts +57 -3
  483. package/dist/src/utils/app-content-type.d.ts.map +1 -1
  484. package/dist/src/utils/app-content-type.js +81 -12
  485. package/dist/src/utils/app-content-type.js.map +1 -1
  486. package/dist/src/utils/env-config/sections-features.d.ts.map +1 -1
  487. package/dist/src/utils/env-config/sections-features.js +9 -3
  488. package/dist/src/utils/env-config/sections-features.js.map +1 -1
  489. package/dist/src/utils/file-download-headers.d.ts +5 -3
  490. package/dist/src/utils/file-download-headers.d.ts.map +1 -1
  491. package/dist/src/utils/file-download-headers.js +18 -5
  492. package/dist/src/utils/file-download-headers.js.map +1 -1
  493. package/dist/src/utils/http-range.d.ts +151 -0
  494. package/dist/src/utils/http-range.d.ts.map +1 -0
  495. package/dist/src/utils/http-range.js +190 -0
  496. package/dist/src/utils/http-range.js.map +1 -0
  497. package/dist/src/utils/page-head.d.ts +5 -0
  498. package/dist/src/utils/page-head.d.ts.map +1 -1
  499. package/dist/src/utils/page-head.js +10 -1
  500. package/dist/src/utils/page-head.js.map +1 -1
  501. package/dist/src/utils/reserved-keys.d.ts +4 -1
  502. package/dist/src/utils/reserved-keys.d.ts.map +1 -1
  503. package/dist/src/utils/reserved-keys.js +4 -1
  504. package/dist/src/utils/reserved-keys.js.map +1 -1
  505. package/dist/static/sdk-libs/datapackage/index.js +336 -0
  506. package/dist/static/sdk-libs/dist/aimeat-datapackage.js +305 -0
  507. package/package.json +10 -2
@@ -0,0 +1,60 @@
1
+ ---
2
+ description: AIMEAT Protocol Node — index
3
+ version: v2
4
+ downloadedFrom: {{BASE_URL}}/llms.txt
5
+ ---
6
+
7
+ # AIMEAT Protocol Node
8
+
9
+ > This page is the index. The full builder's manual is at {{BASE_URL}}/llms-full.txt, and that is
10
+ > the document to fetch when you are helping someone build an app or calling this API directly.
11
+ > An AIMEAT node holds persistent memory, identity for humans and their AI agents (GHII/GAII),
12
+ > shared workspaces, skills, tasks and a usage meter, reachable over REST and MCP. The person who
13
+ > owns an account here owns what is stored under it and grants or revokes each agent's reach, one
14
+ > scope at a time.
15
+
16
+ - Node URL: {{BASE_URL}}
17
+ - Node ID: {{NODE_ID}}
18
+ - Protocol: AIMEAT v1
19
+
20
+ ## Start here
21
+
22
+ - [You are a person]({{BASE_URL}}/v1/portal): register in the portal, then connect an assistant
23
+ - [You are an assistant helping someone build]({{BASE_URL}}/llms-full.txt): the manual, with SDK libraries, app templates and worked examples
24
+ - [You are an agent joining under your own identity]({{BASE_URL}}/auth.md): RFC 8628 device flow, the owner approves you and picks your scopes
25
+ - [You are a coding agent meeting AIMEAT as a dependency]({{BASE_URL}}/AGENTS.md): short orientation, installation and configuration
26
+
27
+ ## Documentation
28
+
29
+ - [Full builder's manual]({{BASE_URL}}/llms-full.txt): everything below in one document — SDK libraries, app templates, core concepts, connection flows and the complete endpoint reference
30
+ - [Site map]({{BASE_URL}}/sitemap.md): every page and endpoint on this node, one page
31
+ - [Glossary]({{BASE_URL}}/v1/glossary): GHII, GAII, GEAI, morsels, organisms and the rest, defined
32
+ - [OpenAPI contract]({{BASE_URL}}/v1/spec): the canonical API contract this node is held to
33
+ - [API documentation]({{BASE_URL}}/v1/docs): browsable endpoint reference
34
+ - [Agent registration]({{BASE_URL}}/auth.md): RFC 8628 device flow, owner-approved
35
+ - [App building prompt]({{BASE_URL}}/v1/prompts/build-app): the canonical single-file app spec
36
+ - [App templates]({{BASE_URL}}/v1/app-templates): starter skeletons
37
+ - [App-build pitfalls]({{BASE_URL}}/v1/appdev/pitfalls): what breaks app builds, curated
38
+
39
+ ## Discovery
40
+
41
+ - [Node descriptor]({{BASE_URL}}/.well-known/aimeat): id, type, public key, capabilities
42
+ - [MCP Server Card]({{BASE_URL}}/.well-known/mcp.json): the MCP server, its transport and auth
43
+ - [Machine-readable bootstrap]({{BASE_URL}}/?format=json): what this node is and what to call next
44
+ - [API catalog]({{BASE_URL}}/.well-known/api-catalog): RFC 9727 linkset
45
+ - [Agent Skills index]({{BASE_URL}}/.well-known/agent-skills/index.json): skill packs published here
46
+ - [Crawl policy]({{BASE_URL}}/robots.txt): the content signals this node sets
47
+
48
+ ## Human pages
49
+
50
+ {{HUMAN_PAGES}}
51
+
52
+ ## Optional
53
+
54
+ Secondary reading. Skip these when you need a shorter context.
55
+
56
+ {{OPTIONAL_PAGES}}
57
+ - [AI transparency]({{BASE_URL}}/v1/ai-transparency): what this node marks as AI-generated, how, and in which posture. Content generated here carries an `aimeat.provenance/v1` record on every surface; ask {{BASE_URL}}/v1/provenance/by-hash/<sha256> about bytes you hold, no account needed
58
+ - [UCP profile]({{BASE_URL}}/.well-known/ucp): commerce transports, checkout capability, payment handlers
59
+ - [ACP profile]({{BASE_URL}}/.well-known/acp.json): agentic-commerce discovery and the product feed
60
+ - [Web Bot Auth directory]({{BASE_URL}}/.well-known/http-message-signatures-directory): the keys this node signs outbound requests with
@@ -23,52 +23,93 @@ User-agent: *
23
23
  Content-Signal: search=yes, ai-input=yes, ai-train=no
24
24
  Allow: /
25
25
 
26
- # ── OpenAI ──────────────────────────────────────────────────────────────────
27
- # OAI-SearchBot: powers ChatGPT search results (allow we want to show up)
26
+ # ── Search and retrieval ────────────────────────────────────────────────────
27
+ # These are the bots that decide whether an AI assistant can answer a live question about this
28
+ # node correctly. Every one of them is allowed, on every node, and that is not operator-tunable:
29
+ # a node nobody can look up is a node nobody can join.
30
+ #
31
+ # Two kinds are mixed here on purpose, because blocking them has different costs. A SEARCH bot
32
+ # feeds the index an assistant queries; blocking it removes this node from that assistant's
33
+ # answers. A USER bot fetches one page because a human asked for it, and the vendors document
34
+ # that those may ignore robots.txt precisely because a person asked.
35
+
36
+ # OpenAI — OAI-SearchBot powers ChatGPT search results; blocking it removes this node from them.
28
37
  User-agent: OAI-SearchBot
29
38
  Allow: /
30
39
 
31
- # GPTBot: training data crawler (blocked — training is a separate decision)
32
- User-agent: GPTBot
33
- Disallow: /
40
+ User-agent: ChatGPT-User
41
+ Allow: /
34
42
 
35
- # ── Anthropic / Claude ───────────────────────────────────────────────────────
36
- # Claude-SearchBot: search indexing
43
+ User-agent: OAI-AdsBot
44
+ Allow: /
45
+
46
+ # Anthropic — rules apply per subdomain, which is why app origins serve their own robots.txt.
37
47
  User-agent: Claude-SearchBot
38
48
  Allow: /
39
49
 
40
- # Claude-User: user-initiated fetches (cowork, claude.ai browsing)
41
50
  User-agent: Claude-User
42
51
  Allow: /
43
52
 
44
- # ClaudeBot: training crawler
45
- User-agent: ClaudeBot
46
- Disallow: /
47
-
48
- # ── Perplexity ───────────────────────────────────────────────────────────────
49
- # PerplexityBot: search indexing (respects robots.txt)
53
+ # Perplexity
50
54
  User-agent: PerplexityBot
51
55
  Allow: /
52
56
 
53
- # Perplexity-User: user-initiated fetches (typically ignores robots.txt anyway)
54
57
  User-agent: Perplexity-User
55
58
  Allow: /
56
59
 
57
- # ── Google ───────────────────────────────────────────────────────────────────
58
- # Googlebot: standard search indexing (allow)
60
+ # Google — Googlebot feeds Search, and therefore AI Overviews and AI Mode, which are retrieval
61
+ # over the Search index. Google-Extended is a separate decision and sits in the training block.
59
62
  User-agent: Googlebot
60
63
  Allow: /
61
64
 
62
- # Google-Extended: Gemini training/grounding does NOT affect Google Search
65
+ # Microsoft bingbot feeds both Bing Search and Copilot.
66
+ User-agent: Bingbot
67
+ Allow: /
68
+
69
+ # Apple — Applebot indexes for Siri and Spotlight. Applebot-Extended does not crawl at all; it is
70
+ # the training opt-out token, so it belongs in the block below.
71
+ User-agent: Applebot
72
+ Allow: /
73
+
74
+ # Meta — meta-externalfetcher is the user-requested single-link fetch.
75
+ User-agent: meta-externalfetcher
76
+ Allow: /
77
+
78
+ # xAI / Grok: deliberately absent. No vendor-documented crawler token exists — none appears in
79
+ # x.ai/robots.txt, grok.com/robots.txt or Cloudflare's bot reference — so there is nothing to name
80
+ # here that would not be a guess. The `User-agent: *` rule above covers Grok, and every other
81
+ # undocumented crawler, which is the whole of the available answer.
82
+
83
+ # ── AI training crawlers ────────────────────────────────────────────────────
84
+ # A separate decision from the block above, and an operator's to make: AIMEAT_AI_TRAINING=allow
85
+ # flips every Disallow between the markers to Allow and pairs the Content-Signal line to
86
+ # ai-train=yes. The default is deny, because a personal node holds one person's data and a safe
87
+ # default has to assume that case.
88
+ #
89
+ # The cost of denying, stated plainly so the choice is an informed one: it keeps this node out of
90
+ # what the models know without being pointed at it, and it is a stated preference rather than an
91
+ # enforceable control. It protects a right; it does not protect bytes.
92
+ #AIMEAT-TRAINING-BEGIN
93
+ User-agent: GPTBot
94
+ Disallow: /
95
+
96
+ User-agent: ClaudeBot
97
+ Disallow: /
98
+
99
+ # Google-Extended controls Gemini training and grounding ONLY. Per Google's own documentation it
100
+ # does not affect Google Search, and it does not remove this node from AI Overviews.
63
101
  User-agent: Google-Extended
64
102
  Disallow: /
65
103
 
66
- # ── Bing / Copilot ───────────────────────────────────────────────────────────
67
- User-agent: Bingbot
68
- Allow: /
104
+ User-agent: Applebot-Extended
105
+ Disallow: /
106
+
107
+ User-agent: meta-externalagent
108
+ Disallow: /
109
+ #AIMEAT-TRAINING-END
69
110
 
70
111
  # ── AI agents: machine-readable docs ────────────────────────────────────────
71
- # See /llms.txt for structured API documentation
112
+ # /llms.txt is the curated index; /llms-full.txt is the full builder's manual.
72
113
  # API entry point for AI agents: GET /?format=json
73
114
 
74
- Sitemap: https://aimeat.io/sitemap.xml
115
+ Sitemap: {{BASE_URL}}/sitemap.xml
@@ -1,7 +1,8 @@
1
1
  <!DOCTYPE html>
2
2
  <html lang="en">
3
3
  <head>
4
- <!-- AI: To help this user build apps on AIMEAT, fetch /llms.txt for templates and API docs. Ask what they want to build. -->
4
+ <!-- AI: /llms.txt is the index of this node. To help this user build apps on AIMEAT, fetch
5
+ /llms-full.txt for templates and API docs, then ask what they want to build. -->
5
6
  <meta charset="UTF-8">
6
7
  <!-- interactive-widget=resizes-content: the on-screen keyboard resizes the layout viewport so dvh units
7
8
  + sticky/bottom-pinned composers stay above the keyboard. viewport-fit=cover exposes env(safe-area-*)
@@ -67,6 +68,7 @@
67
68
  checks whether a site points at its own llms.txt finds the pointer. -->
68
69
  <link rel="alternate" type="text/plain" href="/llms.txt" title="LLM-friendly description">
69
70
  <link rel="alternate" type="text/plain" href="/llms-full.txt" title="Full content for LLMs">
71
+ <link rel="describedby" type="text/plain" href="/llms.txt">
70
72
  <link rel="icon" href="/favicon.svg" type="image/svg+xml">
71
73
  <link rel="manifest" href="/manifest.json">
72
74
  <!-- WebMCP bridge (TARGET-034 phase C): registers node-level tools (commerce feed, node info)
@@ -116,6 +118,7 @@
116
118
  <link rel="stylesheet" href="/css/views/portfolio.css">
117
119
  <link rel="stylesheet" href="/css/views/members.css">
118
120
  <link rel="stylesheet" href="/css/views/inbox.css">
121
+ <link rel="stylesheet" href="/css/views/chat.css">
119
122
  <link rel="stylesheet" href="/css/views/glossary.css">
120
123
  <link rel="stylesheet" href="/css/components/tags.css">
121
124
  <link rel="stylesheet" href="/css/components/image-deliverable.css">
@@ -158,6 +161,7 @@
158
161
  "/js/use-session.js": "/js/use-session.js",
159
162
  "/js/services/boards.js": "/js/services/boards.js",
160
163
  "/js/services/catalogue.js": "/js/services/catalogue.js",
164
+ "/js/services/chat.js": "/js/services/chat.js",
161
165
  "/js/services/consent.js": "/js/services/consent.js",
162
166
  "/js/services/cortex.js": "/js/services/cortex.js",
163
167
  "/js/services/extensions.js": "/js/services/extensions.js",
@@ -430,6 +434,7 @@
430
434
  '/v1/glossary': () => import('/views/glossary.js' + B),
431
435
  '/v1/business': () => import('/views/business.js' + B),
432
436
  '/v1/transparency': () => import('/views/transparency.js' + B),
437
+ '/v1/chat': () => import('/views/chat.js' + B),
433
438
  '/v1/profile': () => import('/views/profile.js' + B),
434
439
  '/v1/home': () => import('/views/home/index.js' + B),
435
440
  '/v1/app-grant': () => import('/views/app-grant.js' + B),
@@ -810,6 +815,8 @@
810
815
  only existed because the bar was carrying the marketing links at the same
811
816
  time. Those links are anon-only now, so these three fit on the row. -->
812
817
  ${session && html`
818
+ <a href="/v1/chat" class="${currentPath === '/v1/chat' ? 'active' : ''}"
819
+ onClick=${(e) => { handleNav(e, '/v1/chat'); setMenuOpen(false); }}>${t('nav.chat') || 'Chat'}</a>
813
820
  <a href="/app-catalog.html" target="_blank" onClick=${() => setMenuOpen(false)}
814
821
  class="${currentPath === '/app-catalog.html' ? 'active' : ''}">${t('nav.apps') || 'Apps'}</a>
815
822
  <a href="/v1/profile" class="profile-link visible ${currentPath === '/v1/profile' ? 'active' : ''}"
@@ -0,0 +1,257 @@
1
+ /**
2
+ * @file public/views/chat/parts.js
3
+ * @description What the chat page is made of: the conversation list, one turn, the work log, and
4
+ * the box a person types into.
5
+ *
6
+ * Two registers share one column. The conversation is what was said; the work log is what was
7
+ * actually done, one line per tool call, and it is shown by default rather than folded away. A
8
+ * chat that reports "done" without showing the calls asks to be believed; this one can be checked.
9
+ * @structure
10
+ * - ThreadList — the person's conversations
11
+ * - Turn — one thing said, with the tools that ran while it was said
12
+ * - WorkLine — one tool call, its status, and what it was
13
+ * - Composer — the box, Enter to send, Shift+Enter for a newline, and a recorder beside it
14
+ * - StatusBar — which agent, what is left to spend, and what is wrong when something is
15
+ * @usage import { ThreadList, Turn, Composer, StatusBar } from './chat/parts.js';
16
+ * @version-history
17
+ * v1.1.0 — 2026-08-16 — Speech both ways: a recording becomes text in the box, which the person
18
+ * reads before sending, and an agent turn can be read aloud.
19
+ * v1.0.0 — 2026-08-16 — Initial.
20
+ */
21
+ import { h } from 'preact';
22
+ import { useRef, useEffect, useState } from 'preact/hooks';
23
+ import htm from 'htm';
24
+ import { t } from '/js/i18n.js';
25
+ import { Markdown } from '/components/Markdown.js';
26
+ import { VoiceRecorder } from '/components/VoiceRecorder.js';
27
+ import { speak, stop as stopSpeaking, isSpeechSupported, textToParagraphs } from '/js/services/speech-reader.js';
28
+
29
+ const html = htm.bind(h);
30
+ const tr = (key, fallback) => { const v = t(key); return v && v !== key ? v : fallback; };
31
+
32
+ /** hh:mm in the reader's own locale, which is all a turn needs. */
33
+ function timeShort(iso) {
34
+ if (!iso) return '';
35
+ const d = new Date(iso);
36
+ return Number.isNaN(d.getTime()) ? '' : d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
37
+ }
38
+
39
+ /**
40
+ * One tool call, as a line in the work log.
41
+ *
42
+ * The status is a word rather than a colour alone: a person who cannot see the difference between
43
+ * two greens still has to be able to tell a call that finished from one that failed.
44
+ */
45
+ export function WorkLine({ tool }) {
46
+ const status = String(tool.status || 'pending');
47
+ const label = tr(`chat.work.${status}`, status);
48
+ return html`
49
+ <li class="chat-work-line chat-work-line--${status}">
50
+ <span class="chat-work-status">${label}</span>
51
+ <span class="chat-work-title">${tool.title || tr('chat.work.untitled', 'a tool call')}</span>
52
+ </li>
53
+ `;
54
+ }
55
+
56
+ /** The work log for one turn: every tool call it made, in the order it made them. */
57
+ export function WorkLog({ tools }) {
58
+ if (!tools || tools.length === 0) return null;
59
+ return html`
60
+ <div class="chat-work">
61
+ <div class="chat-work-head">${tr('chat.work.title', 'What was done')}</div>
62
+ <ul class="chat-work-list">
63
+ ${tools.map((tool, i) => html`<${WorkLine} key=${i} tool=${tool} />`)}
64
+ </ul>
65
+ </div>
66
+ `;
67
+ }
68
+
69
+ /**
70
+ * One turn.
71
+ *
72
+ * The agent's words go through the markdown renderer because the agent writes markdown; the
73
+ * person's do not, because what they typed is what they meant.
74
+ */
75
+ export function Turn({ turn, id }) {
76
+ const mine = turn.role === 'user';
77
+ const [reading, setReading] = useState(false);
78
+ // A turn that failed before the agent said anything leaves an empty record, and an empty bubble
79
+ // on screen reads as a message that arrived blank. Nothing was said, so nothing is drawn; the
80
+ // error above it is what happened.
81
+ if (!mine && !turn.text && !(turn.tools && turn.tools.length)) return null;
82
+
83
+ const listen = () => {
84
+ if (reading) { stopSpeaking(); setReading(false); return; }
85
+ setReading(speak(id, textToParagraphs(turn.text || '')));
86
+ };
87
+
88
+ return html`
89
+ <div class="chat-turn chat-turn--${mine ? 'user' : 'agent'}">
90
+ <div class="chat-bubble">
91
+ ${mine
92
+ ? html`<p class="chat-said">${turn.text}</p>`
93
+ : html`<${Markdown} text=${turn.text || ''} />`}
94
+ <${WorkLog} tools=${turn.tools} />
95
+ </div>
96
+ <div class="chat-meta">
97
+ <span>${timeShort(turn.at)}</span>
98
+ ${turn.model ? html`<span class="chat-model" title=${tr('chat.modelTitle', 'The model that answered this turn')}>${turn.model}</span>` : ''}
99
+ ${!mine && turn.text && isSpeechSupported() ? html`
100
+ <button type="button" class="btn-ghost chat-listen" onClick=${listen}>
101
+ ${reading ? tr('chat.stopListening', 'Stop') : tr('chat.listen', 'Listen')}
102
+ </button>` : ''}
103
+ </div>
104
+ </div>
105
+ `;
106
+ }
107
+
108
+ /**
109
+ * What the agent is doing right now, before the turn is over.
110
+ *
111
+ * A person watching a spinner for four minutes cannot tell work from a hang, so the live turn shows
112
+ * the words as they are written and each tool call as it starts.
113
+ */
114
+ export function LiveTurn({ text, thought, tools, busy }) {
115
+ if (!busy && !text && (!tools || tools.length === 0)) return null;
116
+ return html`
117
+ <div class="chat-turn chat-turn--agent chat-turn--live">
118
+ <div class="chat-bubble">
119
+ ${text ? html`<${Markdown} text=${text} />` : ''}
120
+ ${!text && thought ? html`<p class="chat-thinking">${thought}</p>` : ''}
121
+ ${!text && !thought && busy ? html`<p class="chat-thinking">${tr('chat.working', 'Working…')}</p>` : ''}
122
+ <${WorkLog} tools=${tools} />
123
+ </div>
124
+ </div>
125
+ `;
126
+ }
127
+
128
+ /** A turn that could not run, with the reason and a way to try again. */
129
+ export function TurnError({ message, onRetry }) {
130
+ if (!message) return null;
131
+ return html`
132
+ <div class="chat-error" role="alert">
133
+ <p class="chat-error-msg">${message}</p>
134
+ ${onRetry && html`
135
+ <button type="button" class="btn-outline chat-error-retry" onClick=${onRetry}>
136
+ ${tr('chat.retry', 'Try again')}
137
+ </button>`}
138
+ </div>
139
+ `;
140
+ }
141
+
142
+ /**
143
+ * The person's conversations.
144
+ *
145
+ * `onClose` is the way back on a phone, where this list covers the conversation and the header that
146
+ * would otherwise carry the control is hidden. Without it, opening the list is a room with no door:
147
+ * the only exit is picking a different conversation than the one you were reading.
148
+ */
149
+ export function ThreadList({ threads, activeId, onOpen, onNew, onDelete, onClose }) {
150
+ return html`
151
+ <aside class="chat-threads">
152
+ <button type="button" class="btn-ghost chat-threads-close" onClick=${onClose}>
153
+ ↩ ${tr('chat.backToChat', 'Back to the conversation')}
154
+ </button>
155
+ <button type="button" class="btn-primary chat-new" onClick=${onNew}>
156
+ ${tr('chat.new', 'New conversation')}
157
+ </button>
158
+ ${threads.length === 0
159
+ ? html`<p class="chat-threads-empty">${tr('chat.noThreads', 'Nothing here yet. Say something and this is where it will be.')}</p>`
160
+ : html`
161
+ <ul class="chat-thread-list">
162
+ ${threads.map((thread) => html`
163
+ <li key=${thread.id} class="chat-thread ${thread.id === activeId ? 'chat-thread--active' : ''}">
164
+ <button type="button" class="chat-thread-open" onClick=${() => onOpen(thread.id)}>
165
+ <span class="chat-thread-title">${thread.title}</span>
166
+ <span class="chat-thread-sub">${tr('chat.turnCount', '{n} messages').replace('{n}', String(thread.turns ?? 0))}</span>
167
+ </button>
168
+ <button type="button" class="btn-ghost chat-thread-del"
169
+ aria-label=${tr('chat.delete', 'Delete conversation')}
170
+ onClick=${() => onDelete(thread.id)}>✗</button>
171
+ </li>
172
+ `)}
173
+ </ul>`}
174
+ </aside>
175
+ `;
176
+ }
177
+
178
+ /**
179
+ * The box.
180
+ *
181
+ * Enter sends and Shift+Enter opens a line, which is what every chat does and therefore what a
182
+ * person's hands already expect. The field grows with what is in it up to a ceiling, so a long ask
183
+ * is readable while being written without the composer eating the conversation.
184
+ */
185
+ export function Composer({ value, onInput, onSend, onStop, onSpeak, busy, disabled, note, listening, voiceMaxSeconds = 300 }) {
186
+ const ref = useRef(null);
187
+
188
+ // Re-measured on a resize as well as on every keystroke. Height depends on WIDTH: a line that
189
+ // fits on a desktop wraps on a phone, and a height measured before the turn left the field
190
+ // scrolling by two pixels behind a scrollbar nobody wanted.
191
+ useEffect(() => {
192
+ const fit = () => {
193
+ const el = ref.current;
194
+ if (!el) return;
195
+ el.style.height = 'auto';
196
+ el.style.height = `${Math.min(el.scrollHeight, 200)}px`;
197
+ };
198
+ fit();
199
+ window.addEventListener('resize', fit);
200
+ return () => window.removeEventListener('resize', fit);
201
+ }, [value]);
202
+
203
+ const keydown = (e) => {
204
+ if (e.key === 'Enter' && !e.shiftKey) {
205
+ e.preventDefault();
206
+ if (!busy && !disabled && value.trim()) onSend();
207
+ }
208
+ };
209
+
210
+ return html`
211
+ <div class="chat-composer">
212
+ ${note ? html`<p class="chat-composer-note">${note}</p>` : ''}
213
+ ${listening ? html`<p class="chat-composer-note">${tr('chat.hearing', 'Working out what you said…')}</p>` : ''}
214
+ <div class="chat-composer-row">
215
+ <textarea ref=${ref} class="chat-input" rows="1"
216
+ value=${value}
217
+ disabled=${disabled}
218
+ placeholder=${disabled
219
+ ? tr('chat.disabledPlaceholder', 'This node has no chat agent yet.')
220
+ : tr('chat.placeholder', 'Ask for something, or describe what you want built.')}
221
+ onInput=${(e) => onInput(e.target.value)}
222
+ onKeyDown=${keydown}></textarea>
223
+ ${onSpeak && !busy ? html`
224
+ <${VoiceRecorder} maxSeconds=${voiceMaxSeconds} disabled=${disabled || listening}
225
+ className="btn-outline chat-voice" onRecorded=${(file) => onSpeak(file)} />` : ''}
226
+ ${busy
227
+ ? html`<button type="button" class="btn-outline chat-send" onClick=${onStop}>${tr('chat.stop', 'Stop')}</button>`
228
+ : html`<button type="button" class="btn-primary chat-send"
229
+ disabled=${disabled || !value.trim()}
230
+ onClick=${onSend}>${tr('chat.send', 'Send')}</button>`}
231
+ </div>
232
+ </div>
233
+ `;
234
+ }
235
+
236
+ /**
237
+ * Who is answering, and what it costs.
238
+ *
239
+ * The allowance is shown because a person about to fall back to a free model deserves to have seen
240
+ * it coming. It is a line of text, not a gauge: this is not the thing they came here to look at.
241
+ */
242
+ export function StatusBar({ status, onReset }) {
243
+ if (!status) return null;
244
+ const remaining = Number(status.allowance_remaining_usd ?? 0);
245
+ return html`
246
+ <div class="chat-status">
247
+ <span class="chat-status-agent">${status.agent_name}</span>
248
+ ${status.has_own_key
249
+ ? html`<span class="chat-status-key">${tr('chat.ownKey', 'Running on your own OpenRouter key.')}</span>`
250
+ : html`<span class="chat-status-key">${tr('chat.allowance', '{n} USD left of your allowance.').replace('{n}', remaining.toFixed(2))}</span>`}
251
+ ${onReset && html`
252
+ <button type="button" class="btn-ghost chat-status-reset"
253
+ title=${tr('chat.resetTitle', 'Start a fresh agent session for this conversation. Needed after changing what the agent may do.')}
254
+ onClick=${onReset}>${tr('chat.reset', 'Reset session')}</button>`}
255
+ </div>
256
+ `;
257
+ }