aimeat 3.2.0 → 3.3.1

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 (534) hide show
  1. package/README.md +1 -1
  2. package/dist/.env.example +58 -1
  3. package/dist/build-stamp.json +4 -4
  4. package/dist/locales/en.json +41 -1
  5. package/dist/locales/es.json +41 -1
  6. package/dist/locales/fi.json +43 -3
  7. package/dist/public/changelog.json +12 -0
  8. package/dist/public/css/views/chat.css +388 -0
  9. package/dist/public/js/services/chat.js +190 -0
  10. package/dist/public/js/services/speech-reader.js +26 -0
  11. package/dist/public/lib/VENDORED.md +1 -0
  12. package/dist/public/lib/duckdb-wasm@1.32.0/duckdb-browser-eh.worker.js +14 -0
  13. package/dist/public/lib/duckdb-wasm@1.32.0/duckdb-browser.js +23 -0
  14. package/dist/public/lib/duckdb-wasm@1.32.0/duckdb-eh.wasm +0 -0
  15. package/dist/public/lib/duckdb-wasm@1.32.0/extensions/v1.4.3/wasm_eh/parquet.duckdb_extension.wasm +0 -0
  16. package/dist/public/lib/vendored-assets.json +19 -0
  17. package/dist/public/llms-full-template.txt +2706 -0
  18. package/dist/public/llms-index-template.txt +60 -0
  19. package/dist/public/robots.node.txt +64 -23
  20. package/dist/public/spa.html +8 -1
  21. package/dist/public/views/chat/parts.js +257 -0
  22. package/dist/public/views/chat.js +327 -0
  23. package/dist/public/views/landing.js +24 -1
  24. package/dist/public/views/profile/agents/scope-model.js +320 -315
  25. package/dist/scripts/audit-mcp-schemas.js +50 -0
  26. package/dist/scripts/audit-mcp-schemas.js.map +1 -1
  27. package/dist/scripts/build-sdk-libs.d.ts.map +1 -1
  28. package/dist/scripts/build-sdk-libs.js +1 -0
  29. package/dist/scripts/build-sdk-libs.js.map +1 -1
  30. package/dist/scripts/check-ai-disclosure.d.ts +1 -1
  31. package/dist/scripts/check-ai-disclosure.d.ts.map +1 -1
  32. package/dist/scripts/check-ai-disclosure.js +30 -3
  33. package/dist/scripts/check-ai-disclosure.js.map +1 -1
  34. package/dist/scripts/check-denial-coverage.d.ts +29 -0
  35. package/dist/scripts/check-denial-coverage.d.ts.map +1 -0
  36. package/dist/scripts/check-denial-coverage.js +237 -0
  37. package/dist/scripts/check-denial-coverage.js.map +1 -0
  38. package/dist/scripts/check-ext-entrypoints.js +14 -2
  39. package/dist/scripts/check-ext-entrypoints.js.map +1 -1
  40. package/dist/scripts/check-outbound-fetch.d.ts.map +1 -1
  41. package/dist/scripts/check-outbound-fetch.js +16 -2
  42. package/dist/scripts/check-outbound-fetch.js.map +1 -1
  43. package/dist/scripts/check-sse-parity.js +14 -0
  44. package/dist/scripts/check-sse-parity.js.map +1 -1
  45. package/dist/scripts/indexnow.js +9 -7
  46. package/dist/scripts/indexnow.js.map +1 -1
  47. package/dist/src/auth/ai-gate.d.ts +25 -0
  48. package/dist/src/auth/ai-gate.d.ts.map +1 -0
  49. package/dist/src/auth/ai-gate.js +21 -0
  50. package/dist/src/auth/ai-gate.js.map +1 -0
  51. package/dist/src/auth/middleware.d.ts +7 -0
  52. package/dist/src/auth/middleware.d.ts.map +1 -1
  53. package/dist/src/auth/middleware.js +15 -21
  54. package/dist/src/auth/middleware.js.map +1 -1
  55. package/dist/src/cli/connect/mcp/tools/agent-tasks.d.ts +4 -0
  56. package/dist/src/cli/connect/mcp/tools/agent-tasks.d.ts.map +1 -1
  57. package/dist/src/cli/connect/mcp/tools/agent-tasks.js +11 -1
  58. package/dist/src/cli/connect/mcp/tools/agent-tasks.js.map +1 -1
  59. package/dist/src/cli/connect/mcp/tools/apps.d.ts.map +1 -1
  60. package/dist/src/cli/connect/mcp/tools/apps.js +88 -0
  61. package/dist/src/cli/connect/mcp/tools/apps.js.map +1 -1
  62. package/dist/src/cli/connect/mcp/tools/core.d.ts +7 -0
  63. package/dist/src/cli/connect/mcp/tools/core.d.ts.map +1 -1
  64. package/dist/src/cli/connect/mcp/tools/core.js +83 -4
  65. package/dist/src/cli/connect/mcp/tools/core.js.map +1 -1
  66. package/dist/src/cli/connect/onboarding-prompt.js +1 -1
  67. package/dist/src/cli/connect/skill-bundle.js +1 -1
  68. package/dist/src/cli/connect/tool-call-defs-agent.d.ts.map +1 -1
  69. package/dist/src/cli/connect/tool-call-defs-agent.js +38 -9
  70. package/dist/src/cli/connect/tool-call-defs-agent.js.map +1 -1
  71. package/dist/src/cli/connect/tool-call-defs-app-draft-edit.d.ts +21 -0
  72. package/dist/src/cli/connect/tool-call-defs-app-draft-edit.d.ts.map +1 -0
  73. package/dist/src/cli/connect/tool-call-defs-app-draft-edit.js +137 -0
  74. package/dist/src/cli/connect/tool-call-defs-app-draft-edit.js.map +1 -0
  75. package/dist/src/cli/connect/tool-call-defs-apps.d.ts.map +1 -1
  76. package/dist/src/cli/connect/tool-call-defs-apps.js +114 -25
  77. package/dist/src/cli/connect/tool-call-defs-apps.js.map +1 -1
  78. package/dist/src/cli/connect/tool-call-defs-core.d.ts +1 -0
  79. package/dist/src/cli/connect/tool-call-defs-core.d.ts.map +1 -1
  80. package/dist/src/cli/connect/tool-call-defs-core.js +179 -26
  81. package/dist/src/cli/connect/tool-call-defs-core.js.map +1 -1
  82. package/dist/src/cli/connect/tool-call-defs-organism.d.ts.map +1 -1
  83. package/dist/src/cli/connect/tool-call-defs-organism.js +20 -3
  84. package/dist/src/cli/connect/tool-call-defs-organism.js.map +1 -1
  85. package/dist/src/cli/connect/tool-call.d.ts.map +1 -1
  86. package/dist/src/cli/connect/tool-call.js +52 -1
  87. package/dist/src/cli/connect/tool-call.js.map +1 -1
  88. package/dist/src/config-types-ai.d.ts +76 -0
  89. package/dist/src/config-types-ai.d.ts.map +1 -0
  90. package/dist/src/config-types-ai.js +15 -0
  91. package/dist/src/config-types-ai.js.map +1 -0
  92. package/dist/src/config-types.d.ts +11 -2
  93. package/dist/src/config-types.d.ts.map +1 -1
  94. package/dist/src/config.d.ts.map +1 -1
  95. package/dist/src/config.js +25 -4
  96. package/dist/src/config.js.map +1 -1
  97. package/dist/src/data/builtin-skills.d.ts.map +1 -1
  98. package/dist/src/data/builtin-skills.js +3 -2
  99. package/dist/src/data/builtin-skills.js.map +1 -1
  100. package/dist/src/data/digital-signage-package.js +1 -1
  101. package/dist/src/data/library-packs/sdk.d.ts.map +1 -1
  102. package/dist/src/data/library-packs/sdk.js +76 -0
  103. package/dist/src/data/library-packs/sdk.js.map +1 -1
  104. package/dist/src/data/library-packs/vendored.d.ts.map +1 -1
  105. package/dist/src/data/library-packs/vendored.js +81 -0
  106. package/dist/src/data/library-packs/vendored.js.map +1 -1
  107. package/dist/src/data/library-packs.d.ts +2 -2
  108. package/dist/src/data/library-packs.js +2 -2
  109. package/dist/src/data/public-pages.d.ts +13 -0
  110. package/dist/src/data/public-pages.d.ts.map +1 -1
  111. package/dist/src/data/public-pages.js +153 -113
  112. package/dist/src/data/public-pages.js.map +1 -1
  113. package/dist/src/generated/api-types.d.ts +1808 -36
  114. package/dist/src/generated/api-types.d.ts.map +1 -1
  115. package/dist/src/index-start.d.ts.map +1 -1
  116. package/dist/src/index-start.js +3 -0
  117. package/dist/src/index-start.js.map +1 -1
  118. package/dist/src/mcp/agent-tasks.d.ts.map +1 -1
  119. package/dist/src/mcp/agent-tasks.js +5 -0
  120. package/dist/src/mcp/agent-tasks.js.map +1 -1
  121. package/dist/src/mcp/ai-image.d.ts +22 -0
  122. package/dist/src/mcp/ai-image.d.ts.map +1 -0
  123. package/dist/src/mcp/ai-image.js +60 -0
  124. package/dist/src/mcp/ai-image.js.map +1 -0
  125. package/dist/src/mcp/annotations.d.ts +5 -0
  126. package/dist/src/mcp/annotations.d.ts.map +1 -1
  127. package/dist/src/mcp/annotations.js +18 -0
  128. package/dist/src/mcp/annotations.js.map +1 -1
  129. package/dist/src/mcp/apps-draft-edit.d.ts +28 -0
  130. package/dist/src/mcp/apps-draft-edit.d.ts.map +1 -0
  131. package/dist/src/mcp/apps-draft-edit.js +164 -0
  132. package/dist/src/mcp/apps-draft-edit.js.map +1 -0
  133. package/dist/src/mcp/apps-screenshot.d.ts +26 -0
  134. package/dist/src/mcp/apps-screenshot.d.ts.map +1 -0
  135. package/dist/src/mcp/apps-screenshot.js +39 -0
  136. package/dist/src/mcp/apps-screenshot.js.map +1 -0
  137. package/dist/src/mcp/catalog/definitions/discovery-work-boards.d.ts +1 -0
  138. package/dist/src/mcp/catalog/definitions/discovery-work-boards.d.ts.map +1 -1
  139. package/dist/src/mcp/catalog/definitions/discovery-work-boards.js +40 -0
  140. package/dist/src/mcp/catalog/definitions/discovery-work-boards.js.map +1 -1
  141. package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.d.ts +3 -0
  142. package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.d.ts.map +1 -1
  143. package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.js +74 -0
  144. package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.js.map +1 -1
  145. package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.d.ts.map +1 -1
  146. package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.js +1 -0
  147. package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.js.map +1 -1
  148. package/dist/src/mcp/catalog/scopes.d.ts.map +1 -1
  149. package/dist/src/mcp/catalog/scopes.js +19 -1
  150. package/dist/src/mcp/catalog/scopes.js.map +1 -1
  151. package/dist/src/mcp/catalog/surfaces.d.ts.map +1 -1
  152. package/dist/src/mcp/catalog/surfaces.js +18 -4
  153. package/dist/src/mcp/catalog/surfaces.js.map +1 -1
  154. package/dist/src/mcp/core-datapackage.d.ts +32 -0
  155. package/dist/src/mcp/core-datapackage.d.ts.map +1 -0
  156. package/dist/src/mcp/core-datapackage.js +188 -0
  157. package/dist/src/mcp/core-datapackage.js.map +1 -0
  158. package/dist/src/mcp/core-storage.d.ts +7 -3
  159. package/dist/src/mcp/core-storage.d.ts.map +1 -1
  160. package/dist/src/mcp/core-storage.js +27 -4
  161. package/dist/src/mcp/core-storage.js.map +1 -1
  162. package/dist/src/mcp/core.d.ts.map +1 -1
  163. package/dist/src/mcp/core.js +3 -0
  164. package/dist/src/mcp/core.js.map +1 -1
  165. package/dist/src/mcp/extensions.d.ts.map +1 -1
  166. package/dist/src/mcp/extensions.js +11 -1
  167. package/dist/src/mcp/extensions.js.map +1 -1
  168. package/dist/src/mcp/index.d.ts +9 -0
  169. package/dist/src/mcp/index.d.ts.map +1 -1
  170. package/dist/src/mcp/index.js +34 -0
  171. package/dist/src/mcp/index.js.map +1 -1
  172. package/dist/src/models/agent-task-schemas.d.ts.map +1 -1
  173. package/dist/src/models/agent-task-schemas.js +12 -1
  174. package/dist/src/models/agent-task-schemas.js.map +1 -1
  175. package/dist/src/models/workflow-schemas.d.ts +178 -1
  176. package/dist/src/models/workflow-schemas.d.ts.map +1 -1
  177. package/dist/src/models/workflow-schemas.js +75 -0
  178. package/dist/src/models/workflow-schemas.js.map +1 -1
  179. package/dist/src/routes/admin-extensions.d.ts +4 -0
  180. package/dist/src/routes/admin-extensions.d.ts.map +1 -1
  181. package/dist/src/routes/admin-extensions.js +135 -142
  182. package/dist/src/routes/admin-extensions.js.map +1 -1
  183. package/dist/src/routes/agent-conventions.d.ts.map +1 -1
  184. package/dist/src/routes/agent-conventions.js +4 -2
  185. package/dist/src/routes/agent-conventions.js.map +1 -1
  186. package/dist/src/routes/agent-docs.d.ts +4 -4
  187. package/dist/src/routes/agent-docs.js +145 -145
  188. package/dist/src/routes/agent-docs.js.map +1 -1
  189. package/dist/src/routes/agent-messages.d.ts +6 -0
  190. package/dist/src/routes/agent-messages.d.ts.map +1 -1
  191. package/dist/src/routes/agent-messages.js +23 -1
  192. package/dist/src/routes/agent-messages.js.map +1 -1
  193. package/dist/src/routes/agent-tasks/create-read.d.ts.map +1 -1
  194. package/dist/src/routes/agent-tasks/create-read.js +8 -1
  195. package/dist/src/routes/agent-tasks/create-read.js.map +1 -1
  196. package/dist/src/routes/agent-tasks/lifecycle.d.ts +4 -1
  197. package/dist/src/routes/agent-tasks/lifecycle.d.ts.map +1 -1
  198. package/dist/src/routes/agent-tasks/lifecycle.js +80 -2
  199. package/dist/src/routes/agent-tasks/lifecycle.js.map +1 -1
  200. package/dist/src/routes/ai.d.ts +5 -0
  201. package/dist/src/routes/ai.d.ts.map +1 -1
  202. package/dist/src/routes/ai.js +55 -16
  203. package/dist/src/routes/ai.js.map +1 -1
  204. package/dist/src/routes/app-grants.d.ts.map +1 -1
  205. package/dist/src/routes/app-grants.js +5 -0
  206. package/dist/src/routes/app-grants.js.map +1 -1
  207. package/dist/src/routes/apps/drafts.d.ts +6 -0
  208. package/dist/src/routes/apps/drafts.d.ts.map +1 -1
  209. package/dist/src/routes/apps/drafts.js +133 -1
  210. package/dist/src/routes/apps/drafts.js.map +1 -1
  211. package/dist/src/routes/apps/read.d.ts.map +1 -1
  212. package/dist/src/routes/apps/read.js +38 -1
  213. package/dist/src/routes/apps/read.js.map +1 -1
  214. package/dist/src/routes/auth-otk.d.ts +28 -0
  215. package/dist/src/routes/auth-otk.d.ts.map +1 -0
  216. package/dist/src/routes/auth-otk.js +190 -0
  217. package/dist/src/routes/auth-otk.js.map +1 -0
  218. package/dist/src/routes/auth.d.ts +17 -0
  219. package/dist/src/routes/auth.d.ts.map +1 -1
  220. package/dist/src/routes/auth.js +44 -153
  221. package/dist/src/routes/auth.js.map +1 -1
  222. package/dist/src/routes/bootstrap.d.ts +6 -0
  223. package/dist/src/routes/bootstrap.d.ts.map +1 -1
  224. package/dist/src/routes/bootstrap.js +47 -20
  225. package/dist/src/routes/bootstrap.js.map +1 -1
  226. package/dist/src/routes/chat.d.ts +23 -0
  227. package/dist/src/routes/chat.d.ts.map +1 -0
  228. package/dist/src/routes/chat.js +165 -0
  229. package/dist/src/routes/chat.js.map +1 -0
  230. package/dist/src/routes/commerce.js +4 -4
  231. package/dist/src/routes/commerce.js.map +1 -1
  232. package/dist/src/routes/datapackages.d.ts +35 -0
  233. package/dist/src/routes/datapackages.d.ts.map +1 -0
  234. package/dist/src/routes/datapackages.js +217 -0
  235. package/dist/src/routes/datapackages.js.map +1 -0
  236. package/dist/src/routes/disputes.d.ts +8 -0
  237. package/dist/src/routes/disputes.d.ts.map +1 -1
  238. package/dist/src/routes/disputes.js +52 -1
  239. package/dist/src/routes/disputes.js.map +1 -1
  240. package/dist/src/routes/ecosystem-apps-advisories.d.ts +16 -0
  241. package/dist/src/routes/ecosystem-apps-advisories.d.ts.map +1 -0
  242. package/dist/src/routes/ecosystem-apps-advisories.js +104 -0
  243. package/dist/src/routes/ecosystem-apps-advisories.js.map +1 -0
  244. package/dist/src/routes/ecosystem-apps.d.ts +6 -0
  245. package/dist/src/routes/ecosystem-apps.d.ts.map +1 -1
  246. package/dist/src/routes/ecosystem-apps.js +31 -99
  247. package/dist/src/routes/ecosystem-apps.js.map +1 -1
  248. package/dist/src/routes/extensions/actions.d.ts.map +1 -1
  249. package/dist/src/routes/extensions/actions.js +29 -1
  250. package/dist/src/routes/extensions/actions.js.map +1 -1
  251. package/dist/src/routes/federation-sync/routing.d.ts.map +1 -1
  252. package/dist/src/routes/federation-sync/routing.js +12 -3
  253. package/dist/src/routes/federation-sync/routing.js.map +1 -1
  254. package/dist/src/routes/glossary.js +1 -1
  255. package/dist/src/routes/glossary.js.map +1 -1
  256. package/dist/src/routes/home/track.d.ts +5 -1
  257. package/dist/src/routes/home/track.d.ts.map +1 -1
  258. package/dist/src/routes/home/track.js +20 -6
  259. package/dist/src/routes/home/track.js.map +1 -1
  260. package/dist/src/routes/instances/install.d.ts +3 -0
  261. package/dist/src/routes/instances/install.d.ts.map +1 -1
  262. package/dist/src/routes/instances/install.js +17 -24
  263. package/dist/src/routes/instances/install.js.map +1 -1
  264. package/dist/src/routes/libs.js +1 -1
  265. package/dist/src/routes/libs.js.map +1 -1
  266. package/dist/src/routes/llm-proxy.d.ts +34 -0
  267. package/dist/src/routes/llm-proxy.d.ts.map +1 -0
  268. package/dist/src/routes/llm-proxy.js +258 -0
  269. package/dist/src/routes/llm-proxy.js.map +1 -0
  270. package/dist/src/routes/markdown-mirrors.js +1 -1
  271. package/dist/src/routes/markdown-mirrors.js.map +1 -1
  272. package/dist/src/routes/odata.d.ts +36 -0
  273. package/dist/src/routes/odata.d.ts.map +1 -0
  274. package/dist/src/routes/odata.js +143 -0
  275. package/dist/src/routes/odata.js.map +1 -0
  276. package/dist/src/routes/openrouter.d.ts +4 -0
  277. package/dist/src/routes/openrouter.d.ts.map +1 -1
  278. package/dist/src/routes/openrouter.js +10 -1
  279. package/dist/src/routes/openrouter.js.map +1 -1
  280. package/dist/src/routes/organisms/gates.d.ts.map +1 -1
  281. package/dist/src/routes/organisms/gates.js +9 -2
  282. package/dist/src/routes/organisms/gates.js.map +1 -1
  283. package/dist/src/routes/portal.d.ts +1 -0
  284. package/dist/src/routes/portal.d.ts.map +1 -1
  285. package/dist/src/routes/portal.js +13 -0
  286. package/dist/src/routes/portal.js.map +1 -1
  287. package/dist/src/routes/schedules.d.ts +4 -0
  288. package/dist/src/routes/schedules.d.ts.map +1 -1
  289. package/dist/src/routes/schedules.js +9 -1
  290. package/dist/src/routes/schedules.js.map +1 -1
  291. package/dist/src/routes/storage-files.d.ts +23 -0
  292. package/dist/src/routes/storage-files.d.ts.map +1 -1
  293. package/dist/src/routes/storage-files.js +103 -82
  294. package/dist/src/routes/storage-files.js.map +1 -1
  295. package/dist/src/routes/workflows.d.ts.map +1 -1
  296. package/dist/src/routes/workflows.js +9 -1
  297. package/dist/src/routes/workflows.js.map +1 -1
  298. package/dist/src/server-bootstrap/routes-loader.d.ts +2 -0
  299. package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
  300. package/dist/src/server-bootstrap/routes-loader.js +22 -2
  301. package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
  302. package/dist/src/server-bootstrap/service-init.d.ts.map +1 -1
  303. package/dist/src/server-bootstrap/service-init.js +12 -7
  304. package/dist/src/server-bootstrap/service-init.js.map +1 -1
  305. package/dist/src/server-bootstrap/static-files.d.ts.map +1 -1
  306. package/dist/src/server-bootstrap/static-files.js +44 -10
  307. package/dist/src/server-bootstrap/static-files.js.map +1 -1
  308. package/dist/src/services/ai-allowance.d.ts +82 -0
  309. package/dist/src/services/ai-allowance.d.ts.map +1 -0
  310. package/dist/src/services/ai-allowance.js +117 -0
  311. package/dist/src/services/ai-allowance.js.map +1 -0
  312. package/dist/src/services/ai-completion.d.ts +102 -0
  313. package/dist/src/services/ai-completion.d.ts.map +1 -1
  314. package/dist/src/services/ai-completion.js +131 -67
  315. package/dist/src/services/ai-completion.js.map +1 -1
  316. package/dist/src/services/ai-image.d.ts +70 -0
  317. package/dist/src/services/ai-image.d.ts.map +1 -0
  318. package/dist/src/services/ai-image.js +104 -0
  319. package/dist/src/services/ai-image.js.map +1 -0
  320. package/dist/src/services/ai-model-defaults.d.ts +45 -0
  321. package/dist/src/services/ai-model-defaults.d.ts.map +1 -0
  322. package/dist/src/services/ai-model-defaults.js +42 -0
  323. package/dist/src/services/ai-model-defaults.js.map +1 -0
  324. package/dist/src/services/ai-tool-setup.d.ts +5 -1
  325. package/dist/src/services/ai-tool-setup.d.ts.map +1 -1
  326. package/dist/src/services/ai-tool-setup.js +36 -0
  327. package/dist/src/services/ai-tool-setup.js.map +1 -1
  328. package/dist/src/services/ai-transcription.d.ts +5 -0
  329. package/dist/src/services/ai-transcription.d.ts.map +1 -1
  330. package/dist/src/services/ai-transcription.js +5 -2
  331. package/dist/src/services/ai-transcription.js.map +1 -1
  332. package/dist/src/services/app-agent-surfaces.js +4 -4
  333. package/dist/src/services/app-agent-surfaces.js.map +1 -1
  334. package/dist/src/services/app-draft-edit.d.ts +144 -0
  335. package/dist/src/services/app-draft-edit.d.ts.map +1 -0
  336. package/dist/src/services/app-draft-edit.js +203 -0
  337. package/dist/src/services/app-draft-edit.js.map +1 -0
  338. package/dist/src/services/auth-md.js +2 -2
  339. package/dist/src/services/auth-md.js.map +1 -1
  340. package/dist/src/services/board-write.d.ts +11 -3
  341. package/dist/src/services/board-write.d.ts.map +1 -1
  342. package/dist/src/services/board-write.js +24 -3
  343. package/dist/src/services/board-write.js.map +1 -1
  344. package/dist/src/services/chat-agent.d.ts +36 -0
  345. package/dist/src/services/chat-agent.d.ts.map +1 -0
  346. package/dist/src/services/chat-agent.js +123 -0
  347. package/dist/src/services/chat-agent.js.map +1 -0
  348. package/dist/src/services/chat-session.d.ts +58 -0
  349. package/dist/src/services/chat-session.d.ts.map +1 -0
  350. package/dist/src/services/chat-session.js +151 -0
  351. package/dist/src/services/chat-session.js.map +1 -0
  352. package/dist/src/services/chat-threads.d.ts +61 -0
  353. package/dist/src/services/chat-threads.d.ts.map +1 -0
  354. package/dist/src/services/chat-threads.js +137 -0
  355. package/dist/src/services/chat-threads.js.map +1 -0
  356. package/dist/src/services/config-schema.d.ts.map +1 -1
  357. package/dist/src/services/config-schema.js +2 -1
  358. package/dist/src/services/config-schema.js.map +1 -1
  359. package/dist/src/services/datapackage/contract.d.ts +198 -0
  360. package/dist/src/services/datapackage/contract.d.ts.map +1 -0
  361. package/dist/src/services/datapackage/contract.js +140 -0
  362. package/dist/src/services/datapackage/contract.js.map +1 -0
  363. package/dist/src/services/datapackage/ext-capability.d.ts +85 -0
  364. package/dist/src/services/datapackage/ext-capability.d.ts.map +1 -0
  365. package/dist/src/services/datapackage/ext-capability.js +72 -0
  366. package/dist/src/services/datapackage/ext-capability.js.map +1 -0
  367. package/dist/src/services/datapackage/odata.d.ts +92 -0
  368. package/dist/src/services/datapackage/odata.d.ts.map +1 -0
  369. package/dist/src/services/datapackage/odata.js +256 -0
  370. package/dist/src/services/datapackage/odata.js.map +1 -0
  371. package/dist/src/services/datapackage/odps.d.ts +24 -0
  372. package/dist/src/services/datapackage/odps.d.ts.map +1 -0
  373. package/dist/src/services/datapackage/odps.js +183 -0
  374. package/dist/src/services/datapackage/odps.js.map +1 -0
  375. package/dist/src/services/datapackage/store.d.ts +143 -0
  376. package/dist/src/services/datapackage/store.d.ts.map +1 -0
  377. package/dist/src/services/datapackage/store.js +533 -0
  378. package/dist/src/services/datapackage/store.js.map +1 -0
  379. package/dist/src/services/datapackage/table.d.ts +67 -0
  380. package/dist/src/services/datapackage/table.d.ts.map +1 -0
  381. package/dist/src/services/datapackage/table.js +0 -0
  382. package/dist/src/services/datapackage/table.js.map +1 -0
  383. package/dist/src/services/extension-ctx.d.ts +1 -0
  384. package/dist/src/services/extension-ctx.d.ts.map +1 -1
  385. package/dist/src/services/extension-ctx.js +31 -6
  386. package/dist/src/services/extension-ctx.js.map +1 -1
  387. package/dist/src/services/extension-files.d.ts +20 -0
  388. package/dist/src/services/extension-files.d.ts.map +1 -1
  389. package/dist/src/services/extension-files.js +9 -2
  390. package/dist/src/services/extension-files.js.map +1 -1
  391. package/dist/src/services/extension-lifecycle.d.ts +3 -0
  392. package/dist/src/services/extension-lifecycle.d.ts.map +1 -1
  393. package/dist/src/services/extension-lifecycle.js +2 -26
  394. package/dist/src/services/extension-lifecycle.js.map +1 -1
  395. package/dist/src/services/extension-runtime.d.ts +28 -2
  396. package/dist/src/services/extension-runtime.d.ts.map +1 -1
  397. package/dist/src/services/extension-runtime.js +22 -0
  398. package/dist/src/services/extension-runtime.js.map +1 -1
  399. package/dist/src/services/extension-schedules.d.ts +90 -0
  400. package/dist/src/services/extension-schedules.d.ts.map +1 -0
  401. package/dist/src/services/extension-schedules.js +123 -0
  402. package/dist/src/services/extension-schedules.js.map +1 -0
  403. package/dist/src/services/extension-system-run.d.ts +91 -0
  404. package/dist/src/services/extension-system-run.d.ts.map +1 -0
  405. package/dist/src/services/extension-system-run.js +100 -0
  406. package/dist/src/services/extension-system-run.js.map +1 -0
  407. package/dist/src/services/extension-upsert.d.ts +2 -0
  408. package/dist/src/services/extension-upsert.d.ts.map +1 -1
  409. package/dist/src/services/extension-upsert.js +6 -24
  410. package/dist/src/services/extension-upsert.js.map +1 -1
  411. package/dist/src/services/goose-acp.d.ts +84 -0
  412. package/dist/src/services/goose-acp.d.ts.map +1 -0
  413. package/dist/src/services/goose-acp.js +304 -0
  414. package/dist/src/services/goose-acp.js.map +1 -0
  415. package/dist/src/services/markdown-negotiation.js +1 -1
  416. package/dist/src/services/markdown-negotiation.js.map +1 -1
  417. package/dist/src/services/openrouter.d.ts +43 -1
  418. package/dist/src/services/openrouter.d.ts.map +1 -1
  419. package/dist/src/services/openrouter.js +98 -1
  420. package/dist/src/services/openrouter.js.map +1 -1
  421. package/dist/src/services/prompt-defaults/tiers-core.js +4 -4
  422. package/dist/src/services/scheduler-extension-job.d.ts +29 -6
  423. package/dist/src/services/scheduler-extension-job.d.ts.map +1 -1
  424. package/dist/src/services/scheduler-extension-job.js +29 -75
  425. package/dist/src/services/scheduler-extension-job.js.map +1 -1
  426. package/dist/src/services/scope-vocabulary-migration.d.ts +34 -1
  427. package/dist/src/services/scope-vocabulary-migration.d.ts.map +1 -1
  428. package/dist/src/services/scope-vocabulary-migration.js +60 -0
  429. package/dist/src/services/scope-vocabulary-migration.js.map +1 -1
  430. package/dist/src/services/screenshot-capture.d.ts +40 -1
  431. package/dist/src/services/screenshot-capture.d.ts.map +1 -1
  432. package/dist/src/services/screenshot-capture.js +142 -60
  433. package/dist/src/services/screenshot-capture.js.map +1 -1
  434. package/dist/src/services/skill-bundle/generator.js +1 -1
  435. package/dist/src/services/skill-bundle/generic-adapter.js +1 -1
  436. package/dist/src/services/skill-bundle/hermes-adapter.js +1 -1
  437. package/dist/src/services/storage-file-write.d.ts +36 -1
  438. package/dist/src/services/storage-file-write.d.ts.map +1 -1
  439. package/dist/src/services/storage-file-write.js +49 -3
  440. package/dist/src/services/storage-file-write.js.map +1 -1
  441. package/dist/src/services/task-outcome.d.ts +53 -0
  442. package/dist/src/services/task-outcome.d.ts.map +1 -0
  443. package/dist/src/services/task-outcome.js +28 -0
  444. package/dist/src/services/task-outcome.js.map +1 -0
  445. package/dist/src/services/workflow/engine-human.d.ts +15 -0
  446. package/dist/src/services/workflow/engine-human.d.ts.map +1 -1
  447. package/dist/src/services/workflow/engine-human.js +10 -1
  448. package/dist/src/services/workflow/engine-human.js.map +1 -1
  449. package/dist/src/services/workflow/engine-steps.d.ts +48 -3
  450. package/dist/src/services/workflow/engine-steps.d.ts.map +1 -1
  451. package/dist/src/services/workflow/engine-steps.js +361 -0
  452. package/dist/src/services/workflow/engine-steps.js.map +1 -1
  453. package/dist/src/services/workflow/engine.d.ts +1 -0
  454. package/dist/src/services/workflow/engine.d.ts.map +1 -1
  455. package/dist/src/services/workflow/engine.js +2 -1
  456. package/dist/src/services/workflow/engine.js.map +1 -1
  457. package/dist/src/services/workflow/store.d.ts.map +1 -1
  458. package/dist/src/services/workflow/store.js +60 -4
  459. package/dist/src/services/workflow/store.js.map +1 -1
  460. package/dist/src/services/write-guards.d.ts +27 -1
  461. package/dist/src/services/write-guards.d.ts.map +1 -1
  462. package/dist/src/services/write-guards.js +39 -9
  463. package/dist/src/services/write-guards.js.map +1 -1
  464. package/dist/src/storage/providers/postgres-kysely/db-types.d.ts +1 -0
  465. package/dist/src/storage/providers/postgres-kysely/db-types.d.ts.map +1 -1
  466. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.d.ts +1 -0
  467. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.d.ts.map +1 -1
  468. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.js +3 -0
  469. package/dist/src/storage/providers/postgres-kysely/methods/app-grants.js.map +1 -1
  470. package/dist/src/storage/providers/postgres-kysely/methods/files.d.ts +2 -0
  471. package/dist/src/storage/providers/postgres-kysely/methods/files.d.ts.map +1 -1
  472. package/dist/src/storage/providers/postgres-kysely/methods/files.js +34 -2
  473. package/dist/src/storage/providers/postgres-kysely/methods/files.js.map +1 -1
  474. package/dist/src/storage/providers/postgres-kysely/methods/wallet.d.ts.map +1 -1
  475. package/dist/src/storage/providers/postgres-kysely/methods/wallet.js +23 -4
  476. package/dist/src/storage/providers/postgres-kysely/methods/wallet.js.map +1 -1
  477. package/dist/src/storage/providers/postgres-kysely/migrations/0039_storage_file_utf8_verified.sql +19 -0
  478. package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
  479. package/dist/src/storage/providers/sqlite/index.js +2 -1
  480. package/dist/src/storage/providers/sqlite/index.js.map +1 -1
  481. package/dist/src/storage/providers/sqlite/methods/apps.d.ts +1 -0
  482. package/dist/src/storage/providers/sqlite/methods/apps.d.ts.map +1 -1
  483. package/dist/src/storage/providers/sqlite/methods/apps.js +33 -28
  484. package/dist/src/storage/providers/sqlite/methods/apps.js.map +1 -1
  485. package/dist/src/storage/providers/sqlite/methods/identity-nodes.d.ts +1 -12
  486. package/dist/src/storage/providers/sqlite/methods/identity-nodes.d.ts.map +1 -1
  487. package/dist/src/storage/providers/sqlite/methods/identity-nodes.js +28 -135
  488. package/dist/src/storage/providers/sqlite/methods/identity-nodes.js.map +1 -1
  489. package/dist/src/storage/providers/sqlite/methods/storage-files.d.ts +38 -0
  490. package/dist/src/storage/providers/sqlite/methods/storage-files.d.ts.map +1 -0
  491. package/dist/src/storage/providers/sqlite/methods/storage-files.js +109 -0
  492. package/dist/src/storage/providers/sqlite/methods/storage-files.js.map +1 -0
  493. package/dist/src/storage/providers/sqlite/methods/work.d.ts +5 -0
  494. package/dist/src/storage/providers/sqlite/methods/work.d.ts.map +1 -1
  495. package/dist/src/storage/providers/sqlite/methods/work.js +34 -22
  496. package/dist/src/storage/providers/sqlite/methods/work.js.map +1 -1
  497. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  498. package/dist/src/storage/providers/sqlite/schema.js +134 -130
  499. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  500. package/dist/src/storage/repositories/app-grant.repository.d.ts +11 -0
  501. package/dist/src/storage/repositories/app-grant.repository.d.ts.map +1 -1
  502. package/dist/src/storage/repositories/file.repository.d.ts +13 -0
  503. package/dist/src/storage/repositories/file.repository.d.ts.map +1 -1
  504. package/dist/src/storage/types/commerce.d.ts +6 -0
  505. package/dist/src/storage/types/commerce.d.ts.map +1 -1
  506. package/dist/src/utils/agent-footer.d.ts.map +1 -1
  507. package/dist/src/utils/agent-footer.js +1 -0
  508. package/dist/src/utils/agent-footer.js.map +1 -1
  509. package/dist/src/utils/app-content-type.d.ts +57 -3
  510. package/dist/src/utils/app-content-type.d.ts.map +1 -1
  511. package/dist/src/utils/app-content-type.js +81 -12
  512. package/dist/src/utils/app-content-type.js.map +1 -1
  513. package/dist/src/utils/env-config/sections-features.d.ts.map +1 -1
  514. package/dist/src/utils/env-config/sections-features.js +9 -3
  515. package/dist/src/utils/env-config/sections-features.js.map +1 -1
  516. package/dist/src/utils/file-download-headers.d.ts +5 -3
  517. package/dist/src/utils/file-download-headers.d.ts.map +1 -1
  518. package/dist/src/utils/file-download-headers.js +18 -5
  519. package/dist/src/utils/file-download-headers.js.map +1 -1
  520. package/dist/src/utils/http-range.d.ts +151 -0
  521. package/dist/src/utils/http-range.d.ts.map +1 -0
  522. package/dist/src/utils/http-range.js +190 -0
  523. package/dist/src/utils/http-range.js.map +1 -0
  524. package/dist/src/utils/page-head.d.ts +5 -0
  525. package/dist/src/utils/page-head.d.ts.map +1 -1
  526. package/dist/src/utils/page-head.js +10 -1
  527. package/dist/src/utils/page-head.js.map +1 -1
  528. package/dist/src/utils/reserved-keys.d.ts +4 -1
  529. package/dist/src/utils/reserved-keys.d.ts.map +1 -1
  530. package/dist/src/utils/reserved-keys.js +4 -1
  531. package/dist/src/utils/reserved-keys.js.map +1 -1
  532. package/dist/static/sdk-libs/datapackage/index.js +336 -0
  533. package/dist/static/sdk-libs/dist/aimeat-datapackage.js +305 -0
  534. package/package.json +10 -2
@@ -6,6 +6,12 @@ const FIRST_PASS_DELAY_MS = 30_000; // let the server settle (and be reachable a
6
6
  let running = false;
7
7
  let disabled = false;
8
8
  let timer = null;
9
+ /**
10
+ * Owner GHII -> the moments they asked for an on-demand capture, newest last. In-process on purpose:
11
+ * this is throttling, not accounting, and a node restart handing out a fresh allowance costs a few
12
+ * seconds of rendering rather than money.
13
+ */
14
+ const onDemandHistory = new Map();
9
15
  /**
10
16
  * Launch a headless browser WITHOUT a Playwright browser download: prefer the machine's installed
11
17
  * Edge/Chrome via `channel`, then a Playwright-installed Chromium. Returns null (and the caller
@@ -43,6 +49,75 @@ async function launchBrowser() {
43
49
  + '`npx playwright install --with-deps chromium`. Last error: ' + (lastErr?.message ?? 'unknown'));
44
50
  return null;
45
51
  }
52
+ /**
53
+ * Render one app and store its thumbnail. The bytes come from storage and are served to the page by
54
+ * intercepting the main document, rather than navigating to the public URL: that URL 301-redirects
55
+ * to the app origin under H-2, which 404s on a node with no separate app host and would capture an
56
+ * error page. Sub-resources still load against the node and the page URL stays the node URL, so
57
+ * relative paths and API calls resolve.
58
+ *
59
+ * Throws on failure; each caller words its own answer.
60
+ */
61
+ async function renderAndStore(ctx, config, storage, app) {
62
+ const base = config.baseUrl.replace(/\/+$/, '');
63
+ const page = await ctx.newPage();
64
+ try {
65
+ const full = await storage.getAppByOwnerName(app.ownerName, app.filename);
66
+ // storage returns `data` as a Uint8Array; a plain Uint8Array's .toString('utf8') comma-joins the
67
+ // byte values instead of decoding — wrap in Buffer.
68
+ const html = full?.data ? Buffer.from(full.data).toString('utf8') : null;
69
+ const url = `${base}/v1/apps/${encodeURIComponent(app.ownerName)}/${encodeURIComponent(app.filename)}?mode=inline`;
70
+ if (html) {
71
+ let fulfilled = false;
72
+ await page.route('**/*', (route) => {
73
+ if (!fulfilled && route.request().resourceType() === 'document') {
74
+ fulfilled = true;
75
+ route.fulfill({ status: 200, contentType: 'text/html', body: html });
76
+ }
77
+ else {
78
+ route.continue();
79
+ }
80
+ });
81
+ }
82
+ // 'load' rather than networkidle: polling and SSE apps never go idle. The settle wait after it is
83
+ // what stops an app that fetches its data post-load from being captured blank.
84
+ await page.goto(url, { waitUntil: 'load', timeout: PAGE_TIMEOUT });
85
+ await page.waitForTimeout(Math.max(0, config.screenshotSettleMs));
86
+ const jpeg = await page.screenshot({ type: 'jpeg', quality: 80 });
87
+ await storage.createStorageFile({
88
+ key: `apps/screenshots/${app.filename}`,
89
+ ownerGaii: app.ownerGaii, // match the app row's bucket so the GET route finds it
90
+ visibility: 'public',
91
+ mimeType: 'image/jpeg',
92
+ size: jpeg.length,
93
+ data: jpeg,
94
+ createdAt: new Date().toISOString(),
95
+ });
96
+ return jpeg.length;
97
+ }
98
+ finally {
99
+ await page.close();
100
+ }
101
+ }
102
+ /** Launch, hand over a context, and always close. */
103
+ async function withBrowser(fn) {
104
+ const browser = await launchBrowser();
105
+ if (!browser) {
106
+ disabled = true;
107
+ if (timer) {
108
+ clearInterval(timer);
109
+ timer = null;
110
+ }
111
+ return null;
112
+ }
113
+ try {
114
+ const ctx = await browser.newContext({ viewport: VIEWPORT, deviceScaleFactor: 1 });
115
+ return await fn(ctx);
116
+ }
117
+ finally {
118
+ await browser.close();
119
+ }
120
+ }
46
121
  /**
47
122
  * One scan: capture + store a thumbnail for every published app that still has none. Returns the
48
123
  * number captured. Exported so a manual trigger / test can run a single pass on demand.
@@ -62,74 +137,20 @@ export async function runScreenshotCapturePass(config, storage) {
62
137
  }
63
138
  if (missing.length === 0)
64
139
  return 0;
65
- const browser = await launchBrowser();
66
- if (!browser) {
67
- disabled = true;
68
- if (timer) {
69
- clearInterval(timer);
70
- timer = null;
71
- }
72
- return 0;
73
- }
74
- try {
75
- const ctx = await browser.newContext({ viewport: VIEWPORT, deviceScaleFactor: 1 });
76
- const base = config.baseUrl.replace(/\/+$/, '');
140
+ await withBrowser(async (ctx) => {
77
141
  for (const app of missing) {
78
- const page = await ctx.newPage();
79
142
  try {
80
- // Render the app's STORED HTML directly (fulfill the main document) rather than navigating
81
- // to the public inline URL: that URL 301-redirects to the app origin under H-2, which 404s
82
- // on a node with no separate app host (e.g. local dev) and would capture an error page.
83
- // Sub-resources (libs, images, API) still load against the node and the page URL stays the
84
- // node URL so relative paths resolve. Opened anonymously; 'load' (not networkidle) since
85
- // polling/SSE apps never go idle.
86
- const full = await storage.getAppByOwnerName(app.ownerName, app.filename);
87
- // storage returns `data` as a Uint8Array (Prisma 6 Bytes); a plain Uint8Array's
88
- // .toString('utf8') comma-joins the byte values instead of decoding — wrap in Buffer.
89
- const html = full?.data ? Buffer.from(full.data).toString('utf8') : null;
90
- const url = `${base}/v1/apps/${encodeURIComponent(app.ownerName)}/${encodeURIComponent(app.filename)}?mode=inline`;
91
- if (html) {
92
- let fulfilled = false;
93
- await page.route('**/*', (route) => {
94
- if (!fulfilled && route.request().resourceType() === 'document') {
95
- fulfilled = true;
96
- route.fulfill({ status: 200, contentType: 'text/html', body: html });
97
- }
98
- else {
99
- route.continue();
100
- }
101
- });
102
- }
103
- await page.goto(url, { waitUntil: 'load', timeout: PAGE_TIMEOUT });
104
- // Settle wait: many apps fetch data / render after 'load', so capturing immediately yields a
105
- // blank page. Default 6s; tune with AIMEAT_SCREENSHOT_SETTLE_MS.
106
- await page.waitForTimeout(Math.max(0, config.screenshotSettleMs));
107
- const jpeg = await page.screenshot({ type: 'jpeg', quality: 80 });
108
- await storage.createStorageFile({
109
- key: `apps/screenshots/${app.filename}`,
110
- ownerGaii: app.ownerGaii, // match the app row's bucket so the GET route finds it
111
- visibility: 'public',
112
- mimeType: 'image/jpeg',
113
- size: jpeg.length,
114
- data: jpeg,
115
- createdAt: new Date().toISOString(),
116
- });
143
+ await renderAndStore(ctx, config, storage, app);
117
144
  captured++;
118
145
  }
119
146
  catch (e) {
120
147
  logger.warn(`Screenshot auto-capture failed for ${app.ownerName}/${app.filename}: ${e.message}`);
121
148
  }
122
- finally {
123
- await page.close();
124
- }
125
- }
126
- if (captured > 0) {
127
- logger.info(`Screenshot auto-capture: ${captured}/${missing.length} app thumbnail(s) generated.`);
128
- emitChange('apps');
129
149
  }
130
- }
131
- finally {
132
- await browser.close();
150
+ });
151
+ if (captured > 0) {
152
+ logger.info(`Screenshot auto-capture: ${captured}/${missing.length} app thumbnail(s) generated.`);
153
+ emitChange('apps');
133
154
  }
134
155
  }
135
156
  catch (e) {
@@ -140,6 +161,67 @@ export async function runScreenshotCapturePass(config, storage) {
140
161
  }
141
162
  return captured;
142
163
  }
164
+ /**
165
+ * Capture ONE app now, for a caller who asked.
166
+ *
167
+ * Separate from the batch on purpose. The batch may skip, retry next interval and answer with a
168
+ * count; someone who just published an app and wants to look at it needs either a picture or a
169
+ * reason. The batch's `running` flag is deliberately NOT consulted here: a scan in progress is no
170
+ * reason to refuse a person, and the two writing the same key is an upsert either way.
171
+ *
172
+ * Rendering is the most expensive thing this node does per request, so it is throttled per owner.
173
+ */
174
+ export async function captureAppScreenshot(config, storage, app) {
175
+ if (disabled) {
176
+ return {
177
+ ok: false, status: 503, code: 'NO_BROWSER',
178
+ message: 'This node has no usable browser, so it cannot render app screenshots. An operator can '
179
+ + 'install one with `npx playwright install --with-deps chromium`.',
180
+ };
181
+ }
182
+ // The lookup lives here rather than at each door: it decides both "is there anything to render"
183
+ // and WHICH storage bucket the thumbnail belongs in, and a door that answered the first half for
184
+ // itself would be the second implementation of the same decision.
185
+ const live = await storage.getAppByOwnerName(app.ownerName, app.filename);
186
+ if (!live) {
187
+ return {
188
+ ok: false, status: 404, code: 'NOT_FOUND',
189
+ message: `No published app "${app.filename}" to render. Publish it first; a draft has no public `
190
+ + 'page to photograph.',
191
+ };
192
+ }
193
+ const ownerGaii = live.ownerGaii;
194
+ const perHour = Math.max(1, config.screenshotOnDemandPerHour);
195
+ const now = Date.now();
196
+ const recent = (onDemandHistory.get(ownerGaii) ?? []).filter((t) => now - t < 3_600_000);
197
+ if (recent.length >= perHour) {
198
+ const waitMin = Math.ceil((3_600_000 - (now - recent[0])) / 60_000);
199
+ return {
200
+ ok: false, status: 429, code: 'RATE_LIMITED',
201
+ message: `Screenshot limit reached (${perHour} per hour). Try again in about ${waitMin} minute(s).`,
202
+ };
203
+ }
204
+ recent.push(now);
205
+ onDemandHistory.set(ownerGaii, recent);
206
+ try {
207
+ const bytes = await withBrowser((ctx) => renderAndStore(ctx, config, storage, { ownerName: app.ownerName, ownerGaii, filename: app.filename }));
208
+ if (bytes === null) {
209
+ return {
210
+ ok: false, status: 503, code: 'NO_BROWSER',
211
+ message: 'This node has no usable browser, so it cannot render app screenshots.',
212
+ };
213
+ }
214
+ emitChange('apps');
215
+ logger.info(`Screenshot captured on demand: ${app.ownerName}/${app.filename} (${bytes} bytes)`);
216
+ return { ok: true, sizeBytes: bytes };
217
+ }
218
+ catch (e) {
219
+ return {
220
+ ok: false, status: 502, code: 'RENDER_FAILED',
221
+ message: `The page did not render: ${e.message}`,
222
+ };
223
+ }
224
+ }
143
225
  /** Start the interval-driven auto-capture job (no-op unless config.screenshotAutoCapture is on). */
144
226
  export function startScreenshotAutoCapture(config, storage) {
145
227
  if (!config.screenshotAutoCapture)
@@ -1 +1 @@
1
- {"version":3,"file":"screenshot-capture.js","sourceRoot":"","sources":["../../../src/services/screenshot-capture.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"screenshot-capture.js","sourceRoot":"","sources":["../../../src/services/screenshot-capture.ts"],"names":[],"mappings":"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"}
@@ -359,7 +359,7 @@ When the owner sends one of these slash-prefixed messages, treat it as a command
359
359
  When the owner assigns shared tags in the Data Access tab, use those tags as same-owner collaboration areas. Write shared project state, handoff notes, queues, and team context under \`agents.tag.<tag>.*\` with \`visibility: "owner"\` and \`tags: ["<tag>"]\`. Read the area with \`GET /v1/memory?owner_scope=true&prefix=agents.tag.<tag>.&tags=<tag>\` or the equivalent \`aimeat_memory_list\` parameters. Do not put private local secrets in shared tag memory.
360
360
 
361
361
  ### Publish Knowledge Artifacts
362
- If onboarding or later work produced structured research, documentation, datasets, or reusable knowledge, create a real knowledge package instead of writing an arbitrary \`research.*\` memory placeholder. Follow \`/llms.txt\` and use \`POST /v1/knowledge/import\` for a new package, \`aimeat_knowledge_contribute\` for entries in an existing package, and \`aimeat_storage_upload\` for large source files or attachments.
362
+ If onboarding or later work produced structured research, documentation, datasets, or reusable knowledge, create a real knowledge package instead of writing an arbitrary \`research.*\` memory placeholder. Follow \`/llms-full.txt\` and use \`POST /v1/knowledge/import\` for a new package, \`aimeat_knowledge_contribute\` for entries in an existing package, and \`aimeat_storage_upload\` for large source files or attachments.
363
363
 
364
364
  After import, report the package ID, manifest key, visibility, and whether it is catalog-listed so the owner can link it from Data Access if desired.
365
365
 
@@ -200,7 +200,7 @@ POST ${ctx.nodeUrl}/v1/memory
200
200
  If the owner assigns shared tags in the Data Access tab, those tags are collaboration labels for same-owner agents. Use \`agents.tag.<tag>.*\` keys for shared project state, handoff notes, queues, and team context. Write shared entries with \`visibility: "owner"\` and \`tags: ["<tag>"]\`, then list the area with \`owner_scope=true\`, \`prefix=agents.tag.<tag>.\`, and the same tag filter. Do not store private agent-local secrets in shared tag memory.
201
201
 
202
202
  ### Publish Knowledge Artifacts
203
- If setup or work produced structured research, documentation, datasets, or reusable knowledge, create a real knowledge package instead of a placeholder memory key. Follow \`/llms.txt\`: use \`POST /v1/knowledge/import\` for new packages, \`aimeat_knowledge_contribute\` for entries in existing packages, and \`aimeat_storage_upload\` for large source files or attachments. Report the package ID and manifest key to the owner.
203
+ If setup or work produced structured research, documentation, datasets, or reusable knowledge, create a real knowledge package instead of a placeholder memory key. Follow \`/llms-full.txt\`: use \`POST /v1/knowledge/import\` for new packages, \`aimeat_knowledge_contribute\` for entries in existing packages, and \`aimeat_storage_upload\` for large source files or attachments. Report the package ID and manifest key to the owner.
204
204
 
205
205
  ## References
206
206
  - references/api-overview.md -- Endpoints, auth, response format
@@ -150,7 +150,7 @@ POST ${ctx.nodeUrl}/v1/memory
150
150
  If the owner assigns shared tags in the Data Access tab, those tags are collaboration labels for same-owner agents. Use \`agents.tag.<tag>.*\` keys for shared project state, handoff notes, queues, and team context. Write shared entries with \`visibility: "owner"\` and \`tags: ["<tag>"]\`, then list the area with \`owner_scope=true\`, \`prefix=agents.tag.<tag>.\`, and the same tag filter. Do not store private agent-local secrets in shared tag memory.
151
151
 
152
152
  ### Publish Knowledge Artifacts
153
- If setup or work produced structured research, documentation, datasets, or reusable knowledge, create a real knowledge package instead of a placeholder memory key. Follow \`/llms.txt\`: use \`POST /v1/knowledge/import\` for new packages, \`aimeat_knowledge_contribute\` for entries in existing packages, and \`aimeat_storage_upload\` for large source files or attachments. Report the package ID and manifest key to the owner.
153
+ If setup or work produced structured research, documentation, datasets, or reusable knowledge, create a real knowledge package instead of a placeholder memory key. Follow \`/llms-full.txt\`: use \`POST /v1/knowledge/import\` for new packages, \`aimeat_knowledge_contribute\` for entries in existing packages, and \`aimeat_storage_upload\` for large source files or attachments. Report the package ID and manifest key to the owner.
154
154
 
155
155
  ## References
156
156
  See references/ directory for detailed API documentation:
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @file src/services/storage-file-write.ts
3
- * @description Storing one binary file, once, for every surface that can store one.
3
+ * @description Storing and removing one binary file, once, for every surface that can do either.
4
4
  *
5
5
  * WHY THIS FILE EXISTS. `POST /v1/storage` and `aimeat_storage_upload` are the same capability, and
6
6
  * the two copies had drifted in the way that costs money and access rather than tidiness:
@@ -28,12 +28,19 @@
28
28
  * - StorageWriteDeps / StorageFileInput / StorageFileWriteResult — the contract
29
29
  * - writeStorageFile() — the inline write, in order, with the fence first
30
30
  * - mintStorageUploadUrl() — the presigned representation of the same write
31
+ * - removeStorageFile() — the delete, sharing the same key fence and change events
31
32
  * @usage
32
33
  * const out = await writeStorageFile({ storage, config, emitResourceUpdated }, gaii, input);
33
34
  * if (!out.ok) return renderRefusal(out); // each door renders its own way
34
35
  * @version-history
35
36
  * v1.0.0 — 2026-08-11 — Initial (August 2026 audit step 8, unit storage-files). Collapses
36
37
  * POST /v1/storage and aimeat_storage_upload onto one write.
38
+ * v1.1.0 — 2026-08-15 — removeStorageFile(): the delete, which had one door (DELETE /v1/storage)
39
+ * and no tool, so an agent could store a file over MCP and never take it back. Written here
40
+ * rather than in the new tool because the anonymous key fence was already a hand-copied second
41
+ * copy on that route, and because the route emitted only `files` while the upload emits `files`
42
+ * and `memory` — a delete moves the byte budget the memory view renders exactly as an upload
43
+ * does, and the two views disagreed about it.
37
44
  */
38
45
  import type { AimeatConfig } from '../config.js';
39
46
  import type { Storage, StorageFileRecord } from '../storage/interface.js';
@@ -78,6 +85,34 @@ export type StorageFileWriteResult = {
78
85
  } | StorageWriteRefusal;
79
86
  /** Store one file under `ownerGaii`, with every gate and side effect the capability carries. */
80
87
  export declare function writeStorageFile(deps: StorageWriteDeps, ownerGaii: string, input: StorageFileInput): Promise<StorageFileWriteResult>;
88
+ export interface StorageDeleteRefusal {
89
+ ok: false;
90
+ status: number;
91
+ code: 'INVALID_INPUT' | 'FORBIDDEN' | 'NOT_FOUND' | 'ACCESS_DENIED';
92
+ message: string;
93
+ }
94
+ export type StorageFileDeleteResult = {
95
+ ok: true;
96
+ key: string;
97
+ size: number;
98
+ mimeType: string;
99
+ visibility: StorageFileRecord['visibility'];
100
+ } | StorageDeleteRefusal;
101
+ /**
102
+ * Remove one file from `ownerGaii`'s namespace. Irreversible: there is no version history behind a
103
+ * stored file the way there is behind a memory record, so what this deletes is gone.
104
+ *
105
+ * THE ORDER IS THE POINT. Fence, then read, then compare, then delete — a refusal must happen before
106
+ * anything is removed, which is the same rule the write follows for the quota. It also lets the
107
+ * caller be told WHAT it deleted (size, type), because those are read before the row goes.
108
+ *
109
+ * WHY NO CROSS-OWNER FORM. Reading has one, and it is the reason aimeat_storage_download takes a
110
+ * reference: a file is keyed by (owner, key) and an agent legitimately reads its owner's uploads.
111
+ * Deleting does not get the same door. `getStorageFile(ownerGaii, key)` is namespaced to the caller,
112
+ * so a file belonging to anyone else is simply absent here, and the ownership comparison below is a
113
+ * second lock on a door that is already shut rather than the lock that shuts it.
114
+ */
115
+ export declare function removeStorageFile(deps: StorageWriteDeps, ownerGaii: string, key: string): Promise<StorageFileDeleteResult>;
81
116
  export interface StorageUploadUrlInput {
82
117
  key: string;
83
118
  mimeType?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"storage-file-write.d.ts","sourceRoot":"","sources":["../../../src/services/storage-file-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAM1E;+EAC+E;AAC/E,eAAO,MAAM,8BAA8B,OAAO,CAAC;AAEnD,0EAA0E;AAC1E,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB,gFAAgF;IAChF,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,uBAAuB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACpD;AAED,MAAM,WAAW,mBAAmB;IAChC,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,eAAe,GAAG,WAAW,GAAG,gBAAgB,CAAC;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wFAAwF;IACxF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,MAAM,sBAAsB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAC7D,mBAAmB,CAAC;AAmB1B,gGAAgG;AAChG,wBAAsB,gBAAgB,CAClC,IAAI,EAAE,gBAAgB,EACtB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,gBAAgB,GACxB,OAAO,CAAC,sBAAsB,CAAC,CA2DjC;AAED,MAAM,WAAW,qBAAqB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,sBAAsB,GAC5B;IACE,EAAE,EAAE,IAAI,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;CAC5B,GACC,mBAAmB,CAAC;AAE1B;;;;GAIG;AACH,wBAAsB,oBAAoB,CACtC,IAAI,EAAE,gBAAgB,EACtB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,qBAAqB,GAC7B,OAAO,CAAC,sBAAsB,CAAC,CAgCjC"}
1
+ {"version":3,"file":"storage-file-write.d.ts","sourceRoot":"","sources":["../../../src/services/storage-file-write.ts"],"names":[],"mappings":"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"}
@@ -6,8 +6,9 @@ import { isAnonymousGaii } from '../routes/memory/shared.js';
6
6
  * the token is signed with are the same value, so they cannot drift apart. */
7
7
  export const STORAGE_UPLOAD_URL_TTL_SECONDS = 3600;
8
8
  /**
9
- * May this principal write this key at all. Both representations of the upload run it, which is the
10
- * point: the fence is on the write, not on the shape the caller happens to ask for.
9
+ * May this principal touch this key at all. Every representation of the upload runs it, and so does
10
+ * the delete, which is the point: the fence is on the act, not on the shape the caller happens to
11
+ * ask for. The DELETE route carried its own copy of this until v1.1.0.
11
12
  */
12
13
  function checkKey(ownerGaii, key) {
13
14
  if (!key) {
@@ -16,7 +17,7 @@ function checkKey(ownerGaii, key) {
16
17
  if (isAnonymousGaii(ownerGaii) && !key.startsWith('anonymous/')) {
17
18
  return {
18
19
  ok: false, status: 403, code: 'FORBIDDEN',
19
- message: 'Anonymous agents can only upload to keys prefixed with "anonymous/"',
20
+ message: 'Anonymous agents can only use keys prefixed with "anonymous/"',
20
21
  };
21
22
  }
22
23
  return null;
@@ -74,6 +75,51 @@ export async function writeStorageFile(deps, ownerGaii, input) {
74
75
  emitChange('memory');
75
76
  return { ok: true, file, overageMorsels: quota.overageMorsels };
76
77
  }
78
+ /**
79
+ * Remove one file from `ownerGaii`'s namespace. Irreversible: there is no version history behind a
80
+ * stored file the way there is behind a memory record, so what this deletes is gone.
81
+ *
82
+ * THE ORDER IS THE POINT. Fence, then read, then compare, then delete — a refusal must happen before
83
+ * anything is removed, which is the same rule the write follows for the quota. It also lets the
84
+ * caller be told WHAT it deleted (size, type), because those are read before the row goes.
85
+ *
86
+ * WHY NO CROSS-OWNER FORM. Reading has one, and it is the reason aimeat_storage_download takes a
87
+ * reference: a file is keyed by (owner, key) and an agent legitimately reads its owner's uploads.
88
+ * Deleting does not get the same door. `getStorageFile(ownerGaii, key)` is namespaced to the caller,
89
+ * so a file belonging to anyone else is simply absent here, and the ownership comparison below is a
90
+ * second lock on a door that is already shut rather than the lock that shuts it.
91
+ */
92
+ export async function removeStorageFile(deps, ownerGaii, key) {
93
+ const { storage } = deps;
94
+ const fenced = checkKey(ownerGaii, key);
95
+ if (fenced)
96
+ return fenced;
97
+ const existing = await storage.getStorageFile(ownerGaii, key);
98
+ if (!existing) {
99
+ return {
100
+ ok: false, status: 404, code: 'NOT_FOUND',
101
+ message: `File not found in your namespace: ${key}. This deletes only your own files — a file someone else owns is not reachable here, whatever you may be allowed to read.`,
102
+ };
103
+ }
104
+ if (existing.ownerGaii !== ownerGaii) {
105
+ return { ok: false, status: 403, code: 'ACCESS_DENIED', message: 'You can only delete your own files' };
106
+ }
107
+ const deleted = await storage.deleteStorageFile(ownerGaii, key);
108
+ if (!deleted) {
109
+ // The row was there a moment ago and is not now. Another door removed it in between, which
110
+ // is the caller's desired end state, but saying "deleted" would claim work we did not do.
111
+ return { ok: false, status: 404, code: 'NOT_FOUND', message: `File not found: ${key}` };
112
+ }
113
+ deps.emitResourceUpdated?.(ownerGaii, `aimeat://storage/${encodeURIComponent(key)}`);
114
+ deps.emitResourceListChanged?.(ownerGaii);
115
+ // Both views, for the same reason the write emits both: the file leaves the files list AND frees
116
+ // bytes in the budget the memory view renders. The route emitted only 'files'.
117
+ emitChange('files');
118
+ emitChange('memory');
119
+ return {
120
+ ok: true, key, size: existing.size, mimeType: existing.mimeType, visibility: existing.visibility,
121
+ };
122
+ }
77
123
  /**
78
124
  * Mint a presigned URL for the same write. The options the caller states here ride in the SIGNED
79
125
  * token (PRESIGNED_META_KEYS.storage) and are applied by PUT /v1/upload/:token, so what was asked
@@ -1 +1 @@
1
- {"version":3,"file":"storage-file-write.js","sourceRoot":"","sources":["../../../src/services/storage-file-write.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storage-file-write.js","sourceRoot":"","sources":["../../../src/services/storage-file-write.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * @file src/services/task-outcome.ts
3
+ * @description What a finished task actually produced, in one place, for every door that reports a
4
+ * task.
5
+ *
6
+ * THE HOLE THIS CLOSES, and it was found by a crew rather than by us. A task-runner completed a
7
+ * real job in 104 seconds, the task went to `done`, and the answer could not be read back from
8
+ * anywhere: `aimeat_task_get` returns fifteen fields and not one of them is the output. The
9
+ * completion MESSAGE — the agent's own sentence about what it did — is written to the 'completed'
10
+ * event and nowhere else, and `deliverableKey` is on the record but was never returned. So the
11
+ * caller saw `status: "done"` and had to already know that a second, differently-shaped endpoint
12
+ * exists before it could find out what happened. A finished task whose result nobody can reach is
13
+ * indistinguishable from one that produced nothing.
14
+ *
15
+ * WHY NOT A NEW COLUMN. The two facts already exist: the sentence is on the terminal event, the
16
+ * pointer is on the record. A `completionMessage` column would be a third copy of something
17
+ * stored twice, on both providers, with a migration — to fix a READ. The read is what was broken.
18
+ *
19
+ * The deliverable is returned as an ADDRESS, not as content. It is a memory key under the agent's
20
+ * own namespace and may be any size; a task read that inlined it would make every listing as
21
+ * expensive as its largest output.
22
+ * @structure taskOutcome() — the terminal event plus the deliverable pointer, or null while running
23
+ * @usage
24
+ * import { taskOutcome } from '../services/task-outcome.js';
25
+ * const outcome = await taskOutcome(storage, task); // null unless done/failed
26
+ * @version-history
27
+ * v1.0.0 — 2026-08-16 — Initial. Reported by crewaimeat-dev against aimeat-crewai 0.20.0: a
28
+ * completed task-runner leaves its output where the caller cannot read it.
29
+ */
30
+ import type { Storage, AgentTaskRecord } from '../storage/interface.js';
31
+ /** What a finished task produced. Null while it is still running — an unfinished task has no
32
+ * outcome, and reporting an empty one would read as "finished with nothing". */
33
+ export interface TaskOutcome {
34
+ /** 'done' or 'failed' — the same word the terminal event carries. */
35
+ state: 'done' | 'failed';
36
+ /** The agent's own sentence about what it did, from the terminal event. */
37
+ message: string;
38
+ at: string;
39
+ /** Memory key under the AGENT's namespace where the deliverable was published, when one was
40
+ * named. The pointer, never the content: an output may be megabytes. */
41
+ deliverable_key?: string;
42
+ /** A ready-to-follow address for that key, so a caller does not have to assemble one. */
43
+ deliverable_url?: string;
44
+ }
45
+ /**
46
+ * The outcome of a task, or null if it has not finished.
47
+ *
48
+ * Reads the events newest-first and takes the first terminal one, so a task that was completed,
49
+ * reopened and completed again reports the LATEST completion rather than the first — which is what
50
+ * "what happened" means to whoever is asking.
51
+ */
52
+ export declare function taskOutcome(storage: Storage, task: AgentTaskRecord): Promise<TaskOutcome | null>;
53
+ //# sourceMappingURL=task-outcome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-outcome.d.ts","sourceRoot":"","sources":["../../../src/services/task-outcome.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAExE;iFACiF;AACjF,MAAM,WAAW,WAAW;IACxB,qEAAqE;IACrE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC;IACzB,2EAA2E;IAC3E,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX;6EACyE;IACzE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yFAAyF;IACzF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAID;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAmBtG"}
@@ -0,0 +1,28 @@
1
+ const TERMINAL = new Set(['completed', 'failed']);
2
+ /**
3
+ * The outcome of a task, or null if it has not finished.
4
+ *
5
+ * Reads the events newest-first and takes the first terminal one, so a task that was completed,
6
+ * reopened and completed again reports the LATEST completion rather than the first — which is what
7
+ * "what happened" means to whoever is asking.
8
+ */
9
+ export async function taskOutcome(storage, task) {
10
+ if (task.status !== 'done' && task.status !== 'failed')
11
+ return null;
12
+ const { events } = await storage.listTaskEvents(task.id, { page: 1, perPage: 50 });
13
+ // listTaskEvents orders oldest-first; the terminal one is at the end.
14
+ const terminal = [...events].reverse().find(e => TERMINAL.has(e.type));
15
+ return {
16
+ state: task.status,
17
+ // A task can reach a terminal state without a terminal event — an owner-side cancel, an
18
+ // older record from before the event existed. Saying so beats an empty string that reads
19
+ // like an agent who had nothing to report.
20
+ message: terminal?.message ?? '(no completion message was recorded)',
21
+ at: terminal?.timestamp ?? task.completedAt ?? task.updatedAt,
22
+ ...(task.deliverableKey ? {
23
+ deliverable_key: task.deliverableKey,
24
+ deliverable_url: `/v1/memory/${encodeURIComponent(task.agentGaii)}/${encodeURIComponent(task.deliverableKey)}`,
25
+ } : {}),
26
+ };
27
+ }
28
+ //# sourceMappingURL=task-outcome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-outcome.js","sourceRoot":"","sources":["../../../src/services/task-outcome.ts"],"names":[],"mappings":"AA8CA,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;AAElD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAgB,EAAE,IAAqB;IACrE,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEpE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IACnF,sEAAsE;IACtE,MAAM,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEvE,OAAO;QACH,KAAK,EAAE,IAAI,CAAC,MAAM;QAClB,wFAAwF;QACxF,yFAAyF;QACzF,2CAA2C;QAC3C,OAAO,EAAE,QAAQ,EAAE,OAAO,IAAI,sCAAsC;QACpE,EAAE,EAAE,QAAQ,EAAE,SAAS,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS;QAC7D,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YACtB,eAAe,EAAE,IAAI,CAAC,cAAc;YACpC,eAAe,EAAE,cAAc,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE;SACjH,CAAC,CAAC,CAAC,EAAE,CAAC;KACV,CAAC;AACN,CAAC"}
@@ -6,6 +6,13 @@
6
6
  * Extracted from engine.ts to satisfy max-file-lines.
7
7
  * @usage import { validateHumanAnswer, applyHumanAnswer } from './engine-human.js';
8
8
  * @version-history
9
+ * v1.2.0 — 2026-08-15 — The upgrade requires a PERSON, which the paragraph guarding it always
10
+ * said and the code never asked. An agent could call aimeat_workflow_answer on the step holding
11
+ * its own draft and the node stamped that content 'editorial-control' with the note "reviewed
12
+ * by <the agent>", turning the public disclosure label from "no human editorial review" into
13
+ * the reviewed wording with nobody having read the bytes. `byIsHuman` is set by the door that
14
+ * knows the principal class and absent everywhere else, so agents keep answering and stop
15
+ * upgrading. E2E test-quality audit finding A18.
9
16
  * v1.1.0 — 2026-08-01 — TARGET-058 Phase 4: a human-input step that names `reviews_key` re-stamps
10
17
  * the reviewed content with humanInvolvement 'editorial-control'. This is the ONLY place in
11
18
  * the engine that may upgrade that field, and a watchdog timeout default never does — nobody
@@ -20,6 +27,14 @@ export interface HumanAnswerValue {
20
27
  pick: string;
21
28
  other?: string;
22
29
  by: string;
30
+ /**
31
+ * Was the answerer a PERSON? Absent means no, deliberately: the upgrade below is the one thing in
32
+ * the engine that can turn "no human editorial review" into "reviewed by a person", so a caller
33
+ * has to say so on purpose. `by` alone cannot answer it — an agent's GAII and a human's GHII are
34
+ * both just strings here, and inferring humanness from their shape would break the moment a new
35
+ * principal class arrives.
36
+ */
37
+ byIsHuman?: boolean;
23
38
  }
24
39
  /**
25
40
  * Validate an incoming answer against the question PINNED at ask time (not the current def — a
@@ -1 +1 @@
1
- {"version":3,"file":"engine-human.d.ts","sourceRoot":"","sources":["../../../../src/services/workflow/engine-human.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGpD,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAE3F,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,qBAAqB,EAAE,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,GAAG,IAAI,CAOxH;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,GACjH,OAAO,CAAC,IAAI,CAAC,CAwDf"}
1
+ {"version":3,"file":"engine-human.d.ts","sourceRoot":"","sources":["../../../../src/services/workflow/engine-human.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGpD,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAE3F,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,qBAAqB,EAAE,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,GAAG,IAAI,CAOxH;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,GACjH,OAAO,CAAC,IAAI,CAAC,CAiEf"}