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,151 @@
1
+ /**
2
+ * @file src/utils/http-range.ts
3
+ * @description HTTP byte-range parsing for the stored-file download paths, in one place.
4
+ *
5
+ * WHAT WAS WRONG. Three download handlers each carried the same four lines, and those four lines
6
+ * were `/bytes=(\d+)-(\d*)/`. That regex does not match `bytes=-8` — the SUFFIX range, which is
7
+ * exactly the request a Parquet reader makes first, because the footer is at the end of the file.
8
+ * A client asking for the last eight bytes got status 200 and the whole file, with no header
9
+ * anywhere saying the request had not been honoured. That is a silent fallback: the reader
10
+ * believes it is streaming and is in fact downloading everything, once per range it asks for.
11
+ * The fourth path, `GET /v1/pub`, never looked at `Range` at all.
12
+ *
13
+ * And no path ever sent `Accept-Ranges`. A client cannot discover range support by guessing, so
14
+ * DuckDB, pandas and every HTTP range reader concluded the node does not do ranges — correctly,
15
+ * from the evidence they had.
16
+ *
17
+ * THE RULES THIS ENCODES, and why each one is what it is:
18
+ *
19
+ * - `bytes=N-M`, `bytes=N-` and `bytes=-N` all parse. `M` past the end clamps to the last byte,
20
+ * which RFC 9110 §14.1.2 requires; `-N` larger than the file means the whole file, same clause.
21
+ * - A range unit that is NOT `bytes` is IGNORED and the full representation is sent. RFC 9110
22
+ * §14.2 says MUST on this, and it is not a covering fallback: `Accept-Ranges: bytes` on the
23
+ * same response has already told the client which unit this server speaks.
24
+ * - A `bytes=` header that does not parse, or that starts past the end of the file, is
25
+ * UNSATISFIABLE. That answers 416 with a `Content-Range` of `bytes STAR/size`, never a 200. This is
26
+ * the case the old regex covered up.
27
+ * - A MULTI-range request (`bytes=0-9, 20-29`) is refused with 416 rather than served as one
28
+ * coalesced span or silently reduced to its first range. A `multipart/byteranges` body is not
29
+ * implemented here, and answering a two-range request with one range's bytes, under a status
30
+ * code that claims the request was honoured, is the same class of defect this file exists to
31
+ * remove. No stored-file client on this node sends one.
32
+ * @structure parseRangeHeader() — the verdict · sendPartialContent() / setAcceptRanges() /
33
+ * rangeNotSatisfiable() — the three response shapes a door needs · serveStoredFile() — all three,
34
+ * plus the read, in the one order that does not load a file to send part of it
35
+ * @usage
36
+ * const file = await storage.getStorageFileMeta(gaii, key); // no bytes yet
37
+ * if (!file) { …404… }
38
+ * res.setHeader('Cache-Control', 'public, max-age=300'); // this door's own headers first
39
+ * const served = await serveStoredFile(res, file, req.headers.range, {
40
+ * range: (start, length) => storage.readStorageFileRange(gaii, key, start, length),
41
+ * all: () => storage.getStorageFile(gaii, key).then(f => f?.data ?? null),
42
+ * });
43
+ * if (!served) { …404… } // it vanished mid-request
44
+ * @version-history
45
+ * v1.1.0 -- 2026-08-15 -- TARGET-063: serveStoredFile(), so a range is read as a range. The four
46
+ * doors each carried the same three-line dance and each began by loading the whole file.
47
+ * v1.0.0 -- 2026-08-15 -- TARGET-063 A1: extracted from the three copies in routes/storage-files.ts,
48
+ * with suffix ranges, 416 and Accept-Ranges added. GET /v1/pub gains range support for the first
49
+ * time; it is the door a program reading a data package from its permanent address knocks at.
50
+ */
51
+ import type { Response } from 'express';
52
+ /** What a `Range` header means for one representation of a known size. */
53
+ export type RangeVerdict =
54
+ /** No usable range: absent header, or a unit this server does not speak. Send the whole thing, 200. */
55
+ {
56
+ kind: 'full';
57
+ }
58
+ /** Inclusive byte offsets into the representation. Send 206. */
59
+ | {
60
+ kind: 'partial';
61
+ start: number;
62
+ end: number;
63
+ }
64
+ /** The header named `bytes` and could not be honoured. Send 416 — never 200. */
65
+ | {
66
+ kind: 'unsatisfiable';
67
+ reason: string;
68
+ };
69
+ /**
70
+ * Decide what a `Range` header asks for.
71
+ *
72
+ * `size` is the complete length of the representation. A zero-length file makes every byte range
73
+ * unsatisfiable, which is what RFC 9110 §15.5.17 describes and what a client needs to hear rather
74
+ * than a 200 with no bytes and a status that says it was a partial answer.
75
+ */
76
+ export declare function parseRangeHeader(header: string | undefined | null, size: number): RangeVerdict;
77
+ /**
78
+ * Announce range support. Belongs on EVERY response that carries (or describes) stored bytes,
79
+ * including the 200 and the HEAD: a client decides whether to range-read from this header, and a
80
+ * server that answers ranges without advertising them is a server nothing ranges against.
81
+ */
82
+ export declare function setAcceptRanges(res: Response): void;
83
+ /**
84
+ * 416 with the one header that makes it actionable: a `Content-Range` of `bytes STAR/size` tells the
85
+ * client how long the representation actually is, so its next request can be a valid one.
86
+ *
87
+ * Deliberately NOT the envelope. This is a byte-serving path, the caller may be a database engine
88
+ * rather than a browser, and the status plus Content-Range is the whole message.
89
+ */
90
+ export declare function rangeNotSatisfiable(res: Response, size: number, reason: string): void;
91
+ /**
92
+ * 206 with the slice.
93
+ *
94
+ * `chunk` is the slice and `file` describes the WHOLE representation, which is the distinction the
95
+ * Content-Range header itself makes. `setStoredFileHeaders` follows the same rule: it takes the
96
+ * file's stored UTF-8 verdict when there is one, so this response names the same content type the
97
+ * full GET does. Sniffing the slice would not — a multi-byte character straddling the boundary
98
+ * fails a decode that the whole file passes.
99
+ */
100
+ export declare function sendPartialContent(res: Response, file: {
101
+ key: string;
102
+ mimeType: string;
103
+ size: number;
104
+ data?: Buffer;
105
+ utf8Verified?: boolean;
106
+ }, range: {
107
+ start: number;
108
+ end: number;
109
+ }, chunk: Buffer): void;
110
+ /**
111
+ * Does naming this file's content type still require reading it?
112
+ *
113
+ * Only for a row written before the UTF-8 verdict was recorded, and only for a type whose served
114
+ * form the verdict would change. Everything written since answers from metadata alone, and this
115
+ * shrinks to nothing as old rows are rewritten.
116
+ */
117
+ export declare function needsBytesForType(file: {
118
+ mimeType: string;
119
+ utf8Verified?: boolean;
120
+ }): boolean;
121
+ /** How a door gets at the bytes it is about to serve. Both halves come from the storage layer, and
122
+ * a range read never touches the rest of the file. */
123
+ export interface StoredFileReader {
124
+ /** `length` bytes from byte offset `start`. Null only if the file has disappeared. */
125
+ range(start: number, length: number): Promise<Buffer | null>;
126
+ /** The whole representation. Null only if the file has disappeared. */
127
+ all(): Promise<Buffer | null>;
128
+ }
129
+ /**
130
+ * Serve one stored file, honouring `Range`, from METADATA plus a reader.
131
+ *
132
+ * WHY THE READER IS A CALLBACK AND NOT A BUFFER. Every door here used to load the entire file and
133
+ * then decide what part of it to send, which meant an eight-byte suffix request — the first thing a
134
+ * Parquet reader asks for — read 25 MB out of the database to answer it. Measured on Postgres:
135
+ * 181 ms that way, 3 ms as a database-side substring, and the gap widens with the file. Taking the
136
+ * reader rather than the bytes is what lets the decision come BEFORE the read.
137
+ *
138
+ * The caller sets its own caching and CORS headers first; they differ per door and these do not.
139
+ * Returns false when the file vanished between the metadata read and the bytes, and sends nothing —
140
+ * the caller owns the 404 because only it knows which shape of "not found" that door tells.
141
+ */
142
+ export declare function serveStoredFile(res: Response, file: {
143
+ key: string;
144
+ mimeType: string;
145
+ size: number;
146
+ utf8Verified?: boolean;
147
+ createdAt?: string;
148
+ }, rangeHeader: string | undefined, read: StoredFileReader, opts?: {
149
+ headOnly?: boolean;
150
+ }): Promise<boolean>;
151
+ //# sourceMappingURL=http-range.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-range.d.ts","sourceRoot":"","sources":["../../../src/utils/http-range.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAIxC,0EAA0E;AAC1E,MAAM,MAAM,YAAY;AACpB,uGAAuG;AACrG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE;AAClB,gEAAgE;GAC9D;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE;AACjD,gFAAgF;GAC9E;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAyC9F;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAEnD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAMrF;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAC9B,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,EAC5F,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EACrC,KAAK,EAAE,MAAM,GACd,IAAI,CAON;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAE7F;AAED;uDACuD;AACvD,MAAM,WAAW,gBAAgB;IAC7B,sFAAsF;IACtF,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7D,uEAAuE;IACvE,GAAG,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACjC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,eAAe,CACjC,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EACjG,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,IAAI,EAAE,gBAAgB,EACtB,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC,OAAO,CAAC,OAAO,CAAC,CAoElB"}
@@ -0,0 +1,190 @@
1
+ import { setStoredFileHeaders } from './file-download-headers.js';
2
+ import { needsUtf8Verdict } from './app-content-type.js';
3
+ /**
4
+ * Decide what a `Range` header asks for.
5
+ *
6
+ * `size` is the complete length of the representation. A zero-length file makes every byte range
7
+ * unsatisfiable, which is what RFC 9110 §15.5.17 describes and what a client needs to hear rather
8
+ * than a 200 with no bytes and a status that says it was a partial answer.
9
+ */
10
+ export function parseRangeHeader(header, size) {
11
+ const raw = (header ?? '').trim();
12
+ if (!raw)
13
+ return { kind: 'full' };
14
+ // A unit we do not speak. RFC 9110 §14.2: ignore it and answer with the full representation.
15
+ // `Accept-Ranges: bytes` is on that same response, so the client is not left guessing.
16
+ if (!/^bytes\s*=/i.test(raw))
17
+ return { kind: 'full' };
18
+ const spec = raw.slice(raw.indexOf('=') + 1).trim();
19
+ if (spec.includes(',')) {
20
+ return {
21
+ kind: 'unsatisfiable',
22
+ reason: 'This server serves one byte range per request. A multipart/byteranges response is '
23
+ + 'not implemented, and answering part of what was asked under a success status would '
24
+ + 'hide that. Ask for one range at a time.',
25
+ };
26
+ }
27
+ // suffix-byte-range-spec: "-N" — the LAST N bytes. The shape a Parquet reader opens with.
28
+ const suffix = /^-(\d+)$/.exec(spec);
29
+ if (suffix) {
30
+ const wanted = parseInt(suffix[1], 10);
31
+ if (!Number.isFinite(wanted) || wanted <= 0 || size === 0) {
32
+ return { kind: 'unsatisfiable', reason: `suffix range "${spec}" against a ${size}-byte representation` };
33
+ }
34
+ // Asking for more than there is means the whole thing (RFC 9110 §14.1.2), not an error.
35
+ return { kind: 'partial', start: Math.max(0, size - wanted), end: size - 1 };
36
+ }
37
+ // int-byte-range-spec: "N-" or "N-M".
38
+ const explicit = /^(\d+)-(\d*)$/.exec(spec);
39
+ if (!explicit) {
40
+ return { kind: 'unsatisfiable', reason: `unparseable byte range "${spec}"` };
41
+ }
42
+ const start = parseInt(explicit[1], 10);
43
+ // An absent last-byte-pos means "to the end"; one past the end clamps to the last byte.
44
+ const end = explicit[2] === '' ? size - 1 : Math.min(parseInt(explicit[2], 10), size - 1);
45
+ if (!Number.isFinite(start) || size === 0 || start >= size || end < start) {
46
+ return { kind: 'unsatisfiable', reason: `byte range "${spec}" against a ${size}-byte representation` };
47
+ }
48
+ return { kind: 'partial', start, end };
49
+ }
50
+ /**
51
+ * Announce range support. Belongs on EVERY response that carries (or describes) stored bytes,
52
+ * including the 200 and the HEAD: a client decides whether to range-read from this header, and a
53
+ * server that answers ranges without advertising them is a server nothing ranges against.
54
+ */
55
+ export function setAcceptRanges(res) {
56
+ res.setHeader('Accept-Ranges', 'bytes');
57
+ }
58
+ /**
59
+ * 416 with the one header that makes it actionable: a `Content-Range` of `bytes STAR/size` tells the
60
+ * client how long the representation actually is, so its next request can be a valid one.
61
+ *
62
+ * Deliberately NOT the envelope. This is a byte-serving path, the caller may be a database engine
63
+ * rather than a browser, and the status plus Content-Range is the whole message.
64
+ */
65
+ export function rangeNotSatisfiable(res, size, reason) {
66
+ res.status(416);
67
+ setAcceptRanges(res);
68
+ res.setHeader('Content-Range', `bytes */${size}`);
69
+ res.setHeader('Content-Type', 'text/plain; charset=utf-8');
70
+ res.end(`416 Range Not Satisfiable: ${reason}\n`);
71
+ }
72
+ /**
73
+ * 206 with the slice.
74
+ *
75
+ * `chunk` is the slice and `file` describes the WHOLE representation, which is the distinction the
76
+ * Content-Range header itself makes. `setStoredFileHeaders` follows the same rule: it takes the
77
+ * file's stored UTF-8 verdict when there is one, so this response names the same content type the
78
+ * full GET does. Sniffing the slice would not — a multi-byte character straddling the boundary
79
+ * fails a decode that the whole file passes.
80
+ */
81
+ export function sendPartialContent(res, file, range, chunk) {
82
+ res.status(206);
83
+ setStoredFileHeaders(res, file);
84
+ setAcceptRanges(res);
85
+ res.setHeader('Content-Range', `bytes ${range.start}-${range.end}/${file.size}`);
86
+ res.setHeader('Content-Length', chunk.length);
87
+ res.end(chunk);
88
+ }
89
+ /**
90
+ * Does naming this file's content type still require reading it?
91
+ *
92
+ * Only for a row written before the UTF-8 verdict was recorded, and only for a type whose served
93
+ * form the verdict would change. Everything written since answers from metadata alone, and this
94
+ * shrinks to nothing as old rows are rewritten.
95
+ */
96
+ export function needsBytesForType(file) {
97
+ return file.utf8Verified === undefined && needsUtf8Verdict(file.mimeType);
98
+ }
99
+ /**
100
+ * Serve one stored file, honouring `Range`, from METADATA plus a reader.
101
+ *
102
+ * WHY THE READER IS A CALLBACK AND NOT A BUFFER. Every door here used to load the entire file and
103
+ * then decide what part of it to send, which meant an eight-byte suffix request — the first thing a
104
+ * Parquet reader asks for — read 25 MB out of the database to answer it. Measured on Postgres:
105
+ * 181 ms that way, 3 ms as a database-side substring, and the gap widens with the file. Taking the
106
+ * reader rather than the bytes is what lets the decision come BEFORE the read.
107
+ *
108
+ * The caller sets its own caching and CORS headers first; they differ per door and these do not.
109
+ * Returns false when the file vanished between the metadata read and the bytes, and sends nothing —
110
+ * the caller owns the 404 because only it knows which shape of "not found" that door tells.
111
+ */
112
+ export async function serveStoredFile(res, file, rangeHeader, read, opts = {}) {
113
+ // A validator, on every representation of the file. A ranged reader keeps one of these between
114
+ // requests to know the bytes did not move under it, and DuckDB reads Last-Modified straight off
115
+ // the probe. It costs nothing: the write time is already in the metadata.
116
+ if (file.createdAt) {
117
+ const at = new Date(file.createdAt);
118
+ if (!Number.isNaN(at.getTime()))
119
+ res.setHeader('Last-Modified', at.toUTCString());
120
+ }
121
+ // ONE decision, made before anything is sent: can this file's content type be named without its
122
+ // bytes? With a stored verdict, yes, and nothing outside the requested range is ever read. For a
123
+ // file written before the verdict existed the charset still lives in the content, so the whole
124
+ // file is read — the same cost as before this change, paid only by rows that predate it, and
125
+ // gone the next time each one is written.
126
+ //
127
+ // Getting this wrong is not a slow response but a false one. An earlier draft passed the
128
+ // metadata record straight through, and its `data` is an EMPTY buffer: the sniffer decoded zero
129
+ // bytes, found them valid UTF-8, and stamped `charset=utf-8` on a range reply. On a genuinely
130
+ // cp1252 file that declares an encoding the file does not have, over a GET of the same file that
131
+ // correctly declares nothing.
132
+ const whole = needsBytesForType(file) ? await read.all() : null;
133
+ if (needsBytesForType(file) && !whole)
134
+ return false;
135
+ const described = whole ? { ...file, data: whole } : file;
136
+ const verdict = parseRangeHeader(rangeHeader, file.size);
137
+ // A HEAD answers out of the metadata and reads nothing more. Express auto-handles HEAD through
138
+ // the GET handler, so /v1/pub was loading the entire file and discarding the body: 114 ms
139
+ // measured, for a 10 MB file, to send zero bytes.
140
+ //
141
+ // IT STILL HONOURS `Range`, and that is not pedantry about RFC 9110's "same headers a GET would
142
+ // send". A HEAD carrying `Range: bytes=0-` is how a client ASKS whether this server does ranges,
143
+ // and DuckDB-Wasm's own words for the answer are `if (contentLength !== null && status == 206)`.
144
+ // An earlier version of this function short-circuited before reading the Range header, so that
145
+ // probe got 200 and the full length. DuckDB read it as "no ranges here" and downloaded an 8.45 MB
146
+ // Parquet file in one request to answer a two-column aggregate — and with full reads disabled it
147
+ // refused to open the file at all. A fast HEAD that lies about ranges is worse than a slow one.
148
+ if (opts.headOnly) {
149
+ if (verdict.kind === 'unsatisfiable') {
150
+ rangeNotSatisfiable(res, file.size, verdict.reason);
151
+ return true;
152
+ }
153
+ setStoredFileHeaders(res, described);
154
+ setAcceptRanges(res);
155
+ if (verdict.kind === 'partial') {
156
+ res.status(206);
157
+ res.setHeader('Content-Range', `bytes ${verdict.start}-${verdict.end}/${file.size}`);
158
+ res.setHeader('Content-Length', verdict.end - verdict.start + 1);
159
+ }
160
+ else {
161
+ res.setHeader('Content-Length', file.size);
162
+ }
163
+ res.end();
164
+ return true;
165
+ }
166
+ if (verdict.kind === 'unsatisfiable') {
167
+ rangeNotSatisfiable(res, file.size, verdict.reason);
168
+ return true;
169
+ }
170
+ if (verdict.kind === 'partial') {
171
+ // When the file is already in hand there is nothing to gain from asking the database for a
172
+ // slice of it, so the second read is skipped rather than repeated.
173
+ const chunk = whole
174
+ ? whole.subarray(verdict.start, verdict.end + 1)
175
+ : await read.range(verdict.start, verdict.end - verdict.start + 1);
176
+ if (!chunk)
177
+ return false;
178
+ sendPartialContent(res, described, verdict, chunk);
179
+ return true;
180
+ }
181
+ const data = whole ?? await read.all();
182
+ if (!data)
183
+ return false;
184
+ setStoredFileHeaders(res, { ...described, data });
185
+ setAcceptRanges(res);
186
+ res.setHeader('Content-Length', file.size);
187
+ res.end(data);
188
+ return true;
189
+ }
190
+ //# sourceMappingURL=http-range.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-range.js","sourceRoot":"","sources":["../../../src/utils/http-range.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,11 @@
19
19
  * @usage
20
20
  * html = injectPageHead(html, findPublicPage('/v1/connect'), config, nonceAttr);
21
21
  * @version-history
22
+ * v1.1.0 — 2026-08-16 — The per-page WebPage JSON-LD is emitted again. Its guard was "the
23
+ * document has no ld+json at all", and spa.html always ships SoftwareApplication +
24
+ * Organization, so on every SPA route — which is every page in the registry — the per-page
25
+ * block was silently skipped. Guard is now the WebPage marker itself. Adds the llmstxt.org
26
+ * v2 rel="describedby" link beside the markdown alternate.
22
27
  * v1.0.0 — 2026-07-28 — Initial (agent-readability phases 07 + 08)
23
28
  */
24
29
  import type { AimeatConfig } from '../config.js';
@@ -1 +1 @@
1
- {"version":3,"file":"page-head.d.ts","sourceRoot":"","sources":["../../../src/utils/page-head.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAc1D;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,YAAY,EACpB,SAAS,SAAK,GACb,MAAM,CAqCR"}
1
+ {"version":3,"file":"page-head.d.ts","sourceRoot":"","sources":["../../../src/utils/page-head.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAc1D;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,YAAY,EACpB,SAAS,SAAK,GACb,MAAM,CAgDR"}
@@ -30,7 +30,16 @@ export function injectPageHead(html, page, config, nonceAttr = '') {
30
30
  if (page.markdown) {
31
31
  out = upsert(out, /<link rel="alternate" type="text\/markdown"[^>]*>/i, `<link rel="alternate" type="text/markdown" href="${mirror}">`);
32
32
  }
33
- if (!/application\/ld\+json/i.test(out)) {
33
+ // llmstxt.org v2 names rel="describedby" as the link from a page to the llms.txt that covers it,
34
+ // beside the markdown alternate above. A reader that finds one convention and not the other has
35
+ // to guess the path.
36
+ out = upsert(out, /<link rel="describedby"[^>]*>/i, `<link rel="describedby" type="text/plain" href="${b}/llms.txt">`);
37
+ // The WebPage block describes THIS page and is separate from the site-level SoftwareApplication
38
+ // and Organization blocks that spa.html ships. This used to be guarded by "does the document
39
+ // already contain any ld+json", which spa.html always does — so on every SPA route, which is
40
+ // every page in the registry, the per-page structured data was never emitted. Multiple ld+json
41
+ // blocks in one document are legal, and are how you say two different things.
42
+ if (!/"@type"\s*:\s*"WebPage"/.test(out)) {
34
43
  const jsonLd = JSON.stringify({
35
44
  '@context': 'https://schema.org',
36
45
  '@type': 'WebPage',
@@ -1 +1 @@
1
- {"version":3,"file":"page-head.js","sourceRoot":"","sources":["../../../src/utils/page-head.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"page-head.js","sourceRoot":"","sources":["../../../src/utils/page-head.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,9 @@
16
16
  * appMayWriteKey(roles, key, delegatedOwnerWrite?, reservedAllowed?)
17
17
  * @usage import { appMayWriteKey } from '../utils/reserved-keys.js';
18
18
  * @version-history
19
+ * v1.4.0 — 2026-08-16 — `chat.` joins the list. A conversation is what the person said and what
20
+ * the agent did on their behalf, and an app-grant token that could append to one could put
21
+ * words in either mouth — including instructions the next turn would read as the person's own.
19
22
  * v1.3.0 — 2026-08-11 — `finance.` and `commerce.` join the list (August 2026 audit H-6, H-23).
20
23
  * Both became server-trusted after the list was written and neither was added.
21
24
  * `finance.accountants` is the CROSS-OWNER authorization list for the whole finance area:
@@ -57,7 +60,7 @@
57
60
  * write that never passes through this gate, which is what the openrouter, finance and commerce
58
61
  * keys all use.
59
62
  */
60
- export declare const RESERVED_OWNER_KEY_PREFIXES: readonly ["openrouter.", "ai-usage.", "profile.", "finance.", "commerce."];
63
+ export declare const RESERVED_OWNER_KEY_PREFIXES: readonly ["openrouter.", "ai-usage.", "profile.", "finance.", "commerce.", "chat."];
61
64
  /** True iff `key` falls under a reserved, server-trusted owner-namespace prefix. */
62
65
  export declare function isReservedServerKey(key: string): boolean;
63
66
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"reserved-keys.d.ts","sourceRoot":"","sources":["../../../src/utils/reserved-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,2BAA2B,4EAE9B,CAAC;AAEX,oFAAoF;AACpF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,mBAAmB,UAAQ,EAAE,eAAe,UAAQ,GACjF,OAAO,CAQT"}
1
+ {"version":3,"file":"reserved-keys.d.ts","sourceRoot":"","sources":["../../../src/utils/reserved-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAEH;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,2BAA2B,qFAE9B,CAAC;AAEX,oFAAoF;AACpF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,mBAAmB,UAAQ,EAAE,eAAe,UAAQ,GACjF,OAAO,CAQT"}
@@ -16,6 +16,9 @@
16
16
  * appMayWriteKey(roles, key, delegatedOwnerWrite?, reservedAllowed?)
17
17
  * @usage import { appMayWriteKey } from '../utils/reserved-keys.js';
18
18
  * @version-history
19
+ * v1.4.0 — 2026-08-16 — `chat.` joins the list. A conversation is what the person said and what
20
+ * the agent did on their behalf, and an app-grant token that could append to one could put
21
+ * words in either mouth — including instructions the next turn would read as the person's own.
19
22
  * v1.3.0 — 2026-08-11 — `finance.` and `commerce.` join the list (August 2026 audit H-6, H-23).
20
23
  * Both became server-trusted after the list was written and neither was added.
21
24
  * `finance.accountants` is the CROSS-OWNER authorization list for the whole finance area:
@@ -58,7 +61,7 @@
58
61
  * keys all use.
59
62
  */
60
63
  export const RESERVED_OWNER_KEY_PREFIXES = [
61
- 'openrouter.', 'ai-usage.', 'profile.', 'finance.', 'commerce.',
64
+ 'openrouter.', 'ai-usage.', 'profile.', 'finance.', 'commerce.', 'chat.',
62
65
  ];
63
66
  /** True iff `key` falls under a reserved, server-trusted owner-namespace prefix. */
64
67
  export function isReservedServerKey(key) {
@@ -1 +1 @@
1
- {"version":3,"file":"reserved-keys.js","sourceRoot":"","sources":["../../../src/utils/reserved-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW;CACvD,CAAC;AAEX,oFAAoF;AACpF,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,OAAO,2BAA2B,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAe,EAAE,GAAW,EAAE,mBAAmB,GAAG,KAAK,EAAE,eAAe,GAAG,KAAK;IAElF,MAAM,cAAc,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC3G,IAAI,cAAc;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB;QAAE,OAAO,IAAI,CAAC;IAChE,+FAA+F;IAC/F,kFAAkF;IAClF,IAAI,eAAe;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC"}
1
+ {"version":3,"file":"reserved-keys.js","sourceRoot":"","sources":["../../../src/utils/reserved-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAEH;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO;CAChE,CAAC;AAEX,oFAAoF;AACpF,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,OAAO,2BAA2B,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAe,EAAE,GAAW,EAAE,mBAAmB,GAAG,KAAK,EAAE,eAAe,GAAG,KAAK;IAElF,MAAM,cAAc,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC3G,IAAI,cAAc;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB;QAAE,OAAO,IAAI,CAAC;IAChE,+FAA+F;IAC/F,kFAAkF;IAClF,IAAI,eAAe;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC"}