aimeat 1.33.2 → 1.35.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 (328) hide show
  1. package/dist/locales/en.json +437 -15
  2. package/dist/locales/fi.json +437 -15
  3. package/dist/public/cortex-bundled/aimeat-charts.js +3 -3
  4. package/dist/public/cortex-bundled/aimeat-charts.yaml +3 -3
  5. package/dist/public/cortex-bundled/aimeat-i18n.js +123 -0
  6. package/dist/public/cortex-bundled/aimeat-i18n.yaml +64 -0
  7. package/dist/public/css/views/landing.css +2 -0
  8. package/dist/public/css/views/secretary.css +464 -2
  9. package/dist/public/js/i18n.js +9 -0
  10. package/dist/public/js/services/apps.js +4 -2
  11. package/dist/public/js/services/memory.js +9 -3
  12. package/dist/public/js/services/offers.js +1 -1
  13. package/dist/public/js/services/organisms.js +49 -17
  14. package/dist/public/js/services/secretary-helpers.js +266 -17
  15. package/dist/public/js/services/secretary-policy.js +28 -2
  16. package/dist/public/js/services/secretary-rules.js +70 -0
  17. package/dist/public/js/theme.js +20 -0
  18. package/dist/public/lib/VENDORED-STYLING.md +31 -0
  19. package/dist/public/lib/aimeat-daisyui-bridge.css +48 -0
  20. package/dist/public/lib/chartjs@4.js +14 -0
  21. package/dist/public/lib/daisyui@5.css +7 -0
  22. package/dist/public/lib/tailwindcss@4.js +8 -0
  23. package/dist/public/llms-template.txt +9 -6
  24. package/dist/public/showroom.html +104 -0
  25. package/dist/public/showroom.js +247 -0
  26. package/dist/public/spa.html +18 -16
  27. package/dist/public/views/aimeat-os.js +3 -2
  28. package/dist/public/views/landing.js +50 -6
  29. package/dist/public/views/profile/agents/agent-card.js +13 -4
  30. package/dist/public/views/profile/agents/state-detector.js +6 -0
  31. package/dist/public/views/profile/agents/tab-integration.js +11 -2
  32. package/dist/public/views/profile/apps-tab.js +46 -0
  33. package/dist/public/views/profile/extensions-tab.js +4 -0
  34. package/dist/public/views/profile/inbox-tab.js +1 -1
  35. package/dist/public/views/profile/landing-page.js +8 -3
  36. package/dist/public/views/profile/memory-tab.js +37 -6
  37. package/dist/public/views/profile/organisms/home.js +32 -0
  38. package/dist/public/views/profile/organisms/workspace-list.js +36 -5
  39. package/dist/public/views/profile/organisms/workspace.js +29 -4
  40. package/dist/public/views/profile/organisms-tab.js +61 -8
  41. package/dist/public/views/secretary/calendar.js +327 -0
  42. package/dist/public/views/secretary/cards-reach.js +16 -17
  43. package/dist/public/views/secretary/cards.js +217 -79
  44. package/dist/public/views/secretary/dashboard.js +617 -0
  45. package/dist/public/views/secretary/quality.js +156 -0
  46. package/dist/public/views/secretary/use-autonomy.js +17 -2
  47. package/dist/public/views/secretary/use-freshness.js +50 -0
  48. package/dist/public/views/secretary/use-intake.js +23 -4
  49. package/dist/public/views/secretary/use-layout.js +122 -0
  50. package/dist/public/views/secretary/use-quick-actions.js +98 -0
  51. package/dist/public/views/secretary/use-specialists.js +103 -0
  52. package/dist/public/views/secretary/use-triggers.js +159 -0
  53. package/dist/public/views/secretary/use-whats-next.js +340 -0
  54. package/dist/public/views/secretary/workflow-design.js +112 -0
  55. package/dist/public/views/secretary.js +836 -44
  56. package/dist/scripts/check-no-max-tokens.d.ts +2 -0
  57. package/dist/scripts/check-no-max-tokens.d.ts.map +1 -0
  58. package/dist/scripts/check-no-max-tokens.js +71 -0
  59. package/dist/scripts/check-no-max-tokens.js.map +1 -0
  60. package/dist/src/cli/connect/mcp/tools/organisms.d.ts +2 -0
  61. package/dist/src/cli/connect/mcp/tools/organisms.d.ts.map +1 -1
  62. package/dist/src/cli/connect/mcp/tools/organisms.js +9 -1
  63. package/dist/src/cli/connect/mcp/tools/organisms.js.map +1 -1
  64. package/dist/src/cli/connect/onboarding-prompt.d.ts +3 -0
  65. package/dist/src/cli/connect/onboarding-prompt.d.ts.map +1 -1
  66. package/dist/src/cli/connect/onboarding-prompt.js +10 -3
  67. package/dist/src/cli/connect/onboarding-prompt.js.map +1 -1
  68. package/dist/src/data/aimeat-iam-package.d.ts +25 -0
  69. package/dist/src/data/aimeat-iam-package.d.ts.map +1 -0
  70. package/dist/src/data/aimeat-iam-package.js +312 -0
  71. package/dist/src/data/aimeat-iam-package.js.map +1 -0
  72. package/dist/src/data/aimeat-marketplace-package.d.ts +25 -0
  73. package/dist/src/data/aimeat-marketplace-package.d.ts.map +1 -0
  74. package/dist/src/data/aimeat-marketplace-package.js +231 -0
  75. package/dist/src/data/aimeat-marketplace-package.js.map +1 -0
  76. package/dist/src/data/app-templates.d.ts +48 -0
  77. package/dist/src/data/app-templates.d.ts.map +1 -0
  78. package/dist/src/data/app-templates.js +856 -0
  79. package/dist/src/data/app-templates.js.map +1 -0
  80. package/dist/src/data/example-packages.d.ts.map +1 -1
  81. package/dist/src/data/example-packages.js +3 -1
  82. package/dist/src/data/example-packages.js.map +1 -1
  83. package/dist/src/generated/api-types.d.ts +689 -7
  84. package/dist/src/generated/api-types.d.ts.map +1 -1
  85. package/dist/src/generated/prisma-postgres/edge.js +10 -3
  86. package/dist/src/generated/prisma-postgres/index-browser.js +7 -0
  87. package/dist/src/generated/prisma-postgres/index.d.ts +205 -2
  88. package/dist/src/generated/prisma-postgres/index.js +10 -3
  89. package/dist/src/generated/prisma-postgres/package.json +1 -1
  90. package/dist/src/generated/prisma-postgres/schema.prisma +23 -13
  91. package/dist/src/generated/prisma-postgres/wasm.js +10 -3
  92. package/dist/src/mcp/agent-onboarding.d.ts +4 -0
  93. package/dist/src/mcp/agent-onboarding.d.ts.map +1 -1
  94. package/dist/src/mcp/agent-onboarding.js +28 -2
  95. package/dist/src/mcp/agent-onboarding.js.map +1 -1
  96. package/dist/src/mcp/annotations.d.ts.map +1 -1
  97. package/dist/src/mcp/annotations.js +1 -0
  98. package/dist/src/mcp/annotations.js.map +1 -1
  99. package/dist/src/mcp/catalog/definitions.d.ts.map +1 -1
  100. package/dist/src/mcp/catalog/definitions.js +16 -1
  101. package/dist/src/mcp/catalog/definitions.js.map +1 -1
  102. package/dist/src/mcp/catalog/surfaces.js +3 -3
  103. package/dist/src/mcp/catalog/surfaces.js.map +1 -1
  104. package/dist/src/mcp/index.d.ts +3 -0
  105. package/dist/src/mcp/index.d.ts.map +1 -1
  106. package/dist/src/mcp/index.js +11 -0
  107. package/dist/src/mcp/index.js.map +1 -1
  108. package/dist/src/mcp/organisms.d.ts.map +1 -1
  109. package/dist/src/mcp/organisms.js +48 -8
  110. package/dist/src/mcp/organisms.js.map +1 -1
  111. package/dist/src/mcp/workspaces.d.ts.map +1 -1
  112. package/dist/src/mcp/workspaces.js +6 -4
  113. package/dist/src/mcp/workspaces.js.map +1 -1
  114. package/dist/src/models/agent-onboarding-schemas.d.ts +47 -0
  115. package/dist/src/models/agent-onboarding-schemas.d.ts.map +1 -1
  116. package/dist/src/models/agent-onboarding-schemas.js +117 -0
  117. package/dist/src/models/agent-onboarding-schemas.js.map +1 -1
  118. package/dist/src/models/offer-schemas.d.ts +8 -8
  119. package/dist/src/routes/agent-onboarding.d.ts +5 -0
  120. package/dist/src/routes/agent-onboarding.d.ts.map +1 -1
  121. package/dist/src/routes/agent-onboarding.js +21 -2
  122. package/dist/src/routes/agent-onboarding.js.map +1 -1
  123. package/dist/src/routes/ai.d.ts +8 -4
  124. package/dist/src/routes/ai.d.ts.map +1 -1
  125. package/dist/src/routes/ai.js +38 -14
  126. package/dist/src/routes/ai.js.map +1 -1
  127. package/dist/src/routes/app-grants.d.ts +2 -0
  128. package/dist/src/routes/app-grants.d.ts.map +1 -1
  129. package/dist/src/routes/app-grants.js +7 -1
  130. package/dist/src/routes/app-grants.js.map +1 -1
  131. package/dist/src/routes/app-templates.d.ts +16 -0
  132. package/dist/src/routes/app-templates.d.ts.map +1 -0
  133. package/dist/src/routes/app-templates.js +40 -0
  134. package/dist/src/routes/app-templates.js.map +1 -0
  135. package/dist/src/routes/apps.d.ts.map +1 -1
  136. package/dist/src/routes/apps.js +55 -5
  137. package/dist/src/routes/apps.js.map +1 -1
  138. package/dist/src/routes/auth.d.ts +3 -0
  139. package/dist/src/routes/auth.d.ts.map +1 -1
  140. package/dist/src/routes/auth.js +9 -4
  141. package/dist/src/routes/auth.js.map +1 -1
  142. package/dist/src/routes/bootstrap.d.ts.map +1 -1
  143. package/dist/src/routes/bootstrap.js +1 -0
  144. package/dist/src/routes/bootstrap.js.map +1 -1
  145. package/dist/src/routes/generator.d.ts.map +1 -1
  146. package/dist/src/routes/generator.js +3 -2
  147. package/dist/src/routes/generator.js.map +1 -1
  148. package/dist/src/routes/lib-ai.d.ts +0 -1
  149. package/dist/src/routes/lib-ai.d.ts.map +1 -1
  150. package/dist/src/routes/lib-ai.js +13 -6
  151. package/dist/src/routes/lib-ai.js.map +1 -1
  152. package/dist/src/routes/lib-header.d.ts +2 -0
  153. package/dist/src/routes/lib-header.d.ts.map +1 -1
  154. package/dist/src/routes/lib-header.js +7 -16
  155. package/dist/src/routes/lib-header.js.map +1 -1
  156. package/dist/src/routes/lib-markdown.d.ts +18 -0
  157. package/dist/src/routes/lib-markdown.d.ts.map +1 -0
  158. package/dist/src/routes/lib-markdown.js +236 -0
  159. package/dist/src/routes/lib-markdown.js.map +1 -0
  160. package/dist/src/routes/libs.d.ts +22 -0
  161. package/dist/src/routes/libs.d.ts.map +1 -1
  162. package/dist/src/routes/libs.js +133 -10
  163. package/dist/src/routes/libs.js.map +1 -1
  164. package/dist/src/routes/memory.d.ts.map +1 -1
  165. package/dist/src/routes/memory.js +21 -2
  166. package/dist/src/routes/memory.js.map +1 -1
  167. package/dist/src/routes/openrouter.d.ts +4 -0
  168. package/dist/src/routes/openrouter.d.ts.map +1 -1
  169. package/dist/src/routes/openrouter.js +17 -0
  170. package/dist/src/routes/openrouter.js.map +1 -1
  171. package/dist/src/routes/organisms.d.ts.map +1 -1
  172. package/dist/src/routes/organisms.js +107 -7
  173. package/dist/src/routes/organisms.js.map +1 -1
  174. package/dist/src/routes/portal.d.ts +9 -0
  175. package/dist/src/routes/portal.d.ts.map +1 -1
  176. package/dist/src/routes/portal.js +1 -1
  177. package/dist/src/routes/portal.js.map +1 -1
  178. package/dist/src/routes/public-stats.d.ts +3 -0
  179. package/dist/src/routes/public-stats.d.ts.map +1 -1
  180. package/dist/src/routes/public-stats.js +9 -2
  181. package/dist/src/routes/public-stats.js.map +1 -1
  182. package/dist/src/routes/secretary.d.ts +34 -0
  183. package/dist/src/routes/secretary.d.ts.map +1 -0
  184. package/dist/src/routes/secretary.js +311 -0
  185. package/dist/src/routes/secretary.js.map +1 -0
  186. package/dist/src/routes/specialists.d.ts.map +1 -1
  187. package/dist/src/routes/specialists.js +21 -0
  188. package/dist/src/routes/specialists.js.map +1 -1
  189. package/dist/src/routes/subdomains.js +1 -1
  190. package/dist/src/routes/subdomains.js.map +1 -1
  191. package/dist/src/routes/workflows.d.ts +9 -3
  192. package/dist/src/routes/workflows.d.ts.map +1 -1
  193. package/dist/src/routes/workflows.js +9 -3
  194. package/dist/src/routes/workflows.js.map +1 -1
  195. package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
  196. package/dist/src/server-bootstrap/routes-loader.js +4 -0
  197. package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
  198. package/dist/src/server-bootstrap/service-init.d.ts.map +1 -1
  199. package/dist/src/server-bootstrap/service-init.js +7 -0
  200. package/dist/src/server-bootstrap/service-init.js.map +1 -1
  201. package/dist/src/server-bootstrap/static-files.d.ts +4 -0
  202. package/dist/src/server-bootstrap/static-files.d.ts.map +1 -1
  203. package/dist/src/server-bootstrap/static-files.js +18 -0
  204. package/dist/src/server-bootstrap/static-files.js.map +1 -1
  205. package/dist/src/services/archive.d.ts +74 -0
  206. package/dist/src/services/archive.d.ts.map +1 -0
  207. package/dist/src/services/archive.js +132 -0
  208. package/dist/src/services/archive.js.map +1 -0
  209. package/dist/src/services/cortex-seeder.d.ts +4 -1
  210. package/dist/src/services/cortex-seeder.d.ts.map +1 -1
  211. package/dist/src/services/cortex-seeder.js +25 -6
  212. package/dist/src/services/cortex-seeder.js.map +1 -1
  213. package/dist/src/services/directory.d.ts.map +1 -1
  214. package/dist/src/services/directory.js +3 -2
  215. package/dist/src/services/directory.js.map +1 -1
  216. package/dist/src/services/generator-prompt-seeds.d.ts.map +1 -1
  217. package/dist/src/services/generator-prompt-seeds.js +5 -4
  218. package/dist/src/services/generator-prompt-seeds.js.map +1 -1
  219. package/dist/src/services/message-send.d.ts.map +1 -1
  220. package/dist/src/services/message-send.js +14 -0
  221. package/dist/src/services/message-send.js.map +1 -1
  222. package/dist/src/services/onboarding-guide.d.ts +53 -0
  223. package/dist/src/services/onboarding-guide.d.ts.map +1 -0
  224. package/dist/src/services/onboarding-guide.js +81 -0
  225. package/dist/src/services/onboarding-guide.js.map +1 -0
  226. package/dist/src/services/organism-search.d.ts +6 -2
  227. package/dist/src/services/organism-search.d.ts.map +1 -1
  228. package/dist/src/services/organism-search.js +2 -2
  229. package/dist/src/services/organism-search.js.map +1 -1
  230. package/dist/src/services/owner-memory.d.ts +1 -0
  231. package/dist/src/services/owner-memory.d.ts.map +1 -1
  232. package/dist/src/services/owner-memory.js.map +1 -1
  233. package/dist/src/services/owner-session.d.ts +1 -0
  234. package/dist/src/services/owner-session.d.ts.map +1 -1
  235. package/dist/src/services/owner-session.js +10 -2
  236. package/dist/src/services/owner-session.js.map +1 -1
  237. package/dist/src/services/package-seeder.d.ts +22 -0
  238. package/dist/src/services/package-seeder.d.ts.map +1 -0
  239. package/dist/src/services/package-seeder.js +30 -0
  240. package/dist/src/services/package-seeder.js.map +1 -0
  241. package/dist/src/services/presence.d.ts +3 -0
  242. package/dist/src/services/presence.d.ts.map +1 -1
  243. package/dist/src/services/presence.js +10 -0
  244. package/dist/src/services/presence.js.map +1 -1
  245. package/dist/src/services/prompt-defaults.d.ts.map +1 -1
  246. package/dist/src/services/prompt-defaults.js +8 -3
  247. package/dist/src/services/prompt-defaults.js.map +1 -1
  248. package/dist/src/services/scheduler.d.ts +50 -2
  249. package/dist/src/services/scheduler.d.ts.map +1 -1
  250. package/dist/src/services/scheduler.js +454 -26
  251. package/dist/src/services/scheduler.js.map +1 -1
  252. package/dist/src/services/secretary-authoring.d.ts +71 -0
  253. package/dist/src/services/secretary-authoring.d.ts.map +1 -0
  254. package/dist/src/services/secretary-authoring.js +336 -0
  255. package/dist/src/services/secretary-authoring.js.map +1 -0
  256. package/dist/src/services/secretary-clarify.d.ts +57 -0
  257. package/dist/src/services/secretary-clarify.d.ts.map +1 -0
  258. package/dist/src/services/secretary-clarify.js +104 -0
  259. package/dist/src/services/secretary-clarify.js.map +1 -0
  260. package/dist/src/services/secretary-feed.d.ts +11 -0
  261. package/dist/src/services/secretary-feed.d.ts.map +1 -0
  262. package/dist/src/services/secretary-feed.js +28 -0
  263. package/dist/src/services/secretary-feed.js.map +1 -0
  264. package/dist/src/services/secretary-tick.d.ts +243 -3
  265. package/dist/src/services/secretary-tick.d.ts.map +1 -1
  266. package/dist/src/services/secretary-tick.js +273 -3
  267. package/dist/src/services/secretary-tick.js.map +1 -1
  268. package/dist/src/services/secretary-workbrief.d.ts +144 -0
  269. package/dist/src/services/secretary-workbrief.d.ts.map +1 -0
  270. package/dist/src/services/secretary-workbrief.js +315 -0
  271. package/dist/src/services/secretary-workbrief.js.map +1 -0
  272. package/dist/src/services/secretary-worktier.d.ts +118 -0
  273. package/dist/src/services/secretary-worktier.d.ts.map +1 -0
  274. package/dist/src/services/secretary-worktier.js +157 -0
  275. package/dist/src/services/secretary-worktier.js.map +1 -0
  276. package/dist/src/services/skill-bundle/generator.d.ts +3 -0
  277. package/dist/src/services/skill-bundle/generator.d.ts.map +1 -1
  278. package/dist/src/services/skill-bundle/generator.js +19 -0
  279. package/dist/src/services/skill-bundle/generator.js.map +1 -1
  280. package/dist/src/services/specialist-runner.d.ts +36 -0
  281. package/dist/src/services/specialist-runner.d.ts.map +1 -0
  282. package/dist/src/services/specialist-runner.js +91 -0
  283. package/dist/src/services/specialist-runner.js.map +1 -0
  284. package/dist/src/services/specialist.d.ts +9 -0
  285. package/dist/src/services/specialist.d.ts.map +1 -1
  286. package/dist/src/services/specialist.js +42 -0
  287. package/dist/src/services/specialist.js.map +1 -1
  288. package/dist/src/services/structure-overview.d.ts +13 -0
  289. package/dist/src/services/structure-overview.d.ts.map +1 -1
  290. package/dist/src/services/structure-overview.js +34 -11
  291. package/dist/src/services/structure-overview.js.map +1 -1
  292. package/dist/src/services/system-agent-responder.d.ts +36 -0
  293. package/dist/src/services/system-agent-responder.d.ts.map +1 -0
  294. package/dist/src/services/system-agent-responder.js +107 -0
  295. package/dist/src/services/system-agent-responder.js.map +1 -0
  296. package/dist/src/services/system-agent.d.ts +34 -1
  297. package/dist/src/services/system-agent.d.ts.map +1 -1
  298. package/dist/src/services/system-agent.js +73 -0
  299. package/dist/src/services/system-agent.js.map +1 -1
  300. package/dist/src/storage/interface.d.ts +33 -0
  301. package/dist/src/storage/interface.d.ts.map +1 -1
  302. package/dist/src/storage/interface.js.map +1 -1
  303. package/dist/src/storage/providers/mongodb/index.d.ts +37 -0
  304. package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
  305. package/dist/src/storage/providers/mongodb/index.js +132 -12
  306. package/dist/src/storage/providers/mongodb/index.js.map +1 -1
  307. package/dist/src/storage/providers/sqlite/index.d.ts +23 -1
  308. package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
  309. package/dist/src/storage/providers/sqlite/index.js +60 -8
  310. package/dist/src/storage/providers/sqlite/index.js.map +1 -1
  311. package/dist/src/storage/providers/sqlite/repos/memory.d.ts +29 -1
  312. package/dist/src/storage/providers/sqlite/repos/memory.d.ts.map +1 -1
  313. package/dist/src/storage/providers/sqlite/repos/memory.js +109 -10
  314. package/dist/src/storage/providers/sqlite/repos/memory.js.map +1 -1
  315. package/dist/src/storage/providers/sqlite/schema.d.ts +3 -0
  316. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  317. package/dist/src/storage/providers/sqlite/schema.js +64 -9
  318. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  319. package/dist/src/storage/repositories/app.repository.d.ts +15 -0
  320. package/dist/src/storage/repositories/app.repository.d.ts.map +1 -1
  321. package/dist/src/storage/repositories/memory.repository.d.ts +41 -1
  322. package/dist/src/storage/repositories/memory.repository.d.ts.map +1 -1
  323. package/dist/src/storage/repositories/organism.repository.d.ts +2 -1
  324. package/dist/src/storage/repositories/organism.repository.d.ts.map +1 -1
  325. package/dist/static/app-catalog.html +469 -122
  326. package/package.json +2 -1
  327. package/prisma/schema.postgres.prisma +10 -0
  328. package/prisma/schema.prisma +12 -0
@@ -90,6 +90,34 @@ export class PrismaStorage {
90
90
  }
91
91
  this.prisma = new PrismaClient({ datasourceUrl: databaseUrl });
92
92
  await this.prisma.$connect();
93
+ await this.backfillArchiveFlag();
94
+ }
95
+ /**
96
+ * Backfill `archived: false` onto documents written BEFORE the archive feature added the field.
97
+ * In MongoDB such docs simply lack the field, and the default-exclude read filter does NOT match a
98
+ * missing field — so without this, ALL pre-archive content (workspaces, manifests, registries,
99
+ * records) silently vanishes from every default read. SQLite gets this for free via
100
+ * `safeAddColumn(... DEFAULT 0)`; MongoDB needs an explicit one-time, idempotent backfill (only
101
+ * touches docs missing the field; a no-op once every doc has it). Collections are the Prisma model
102
+ * names (no @@map). Best-effort: logged, never fatal.
103
+ */
104
+ async backfillArchiveFlag() {
105
+ if (!this.prisma)
106
+ return;
107
+ for (const collection of ['Memory', 'Organism']) {
108
+ try {
109
+ const res = await this.prisma.$runCommandRaw({
110
+ update: collection,
111
+ updates: [{ q: { archived: { $exists: false } }, u: { $set: { archived: false } }, multi: true }],
112
+ });
113
+ const n = res?.nModified ?? res?.n ?? 0;
114
+ if (n > 0)
115
+ logger.info(`Archive backfill: set archived=false on ${n} legacy ${collection} document(s)`);
116
+ }
117
+ catch (err) {
118
+ logger.warn(`Archive backfill skipped for ${collection}: ${err?.message ?? err}`);
119
+ }
120
+ }
93
121
  }
94
122
  /**
95
123
  * Run `prisma db push --skip-generate` to create any missing
@@ -629,7 +657,7 @@ export class PrismaStorage {
629
657
  }
630
658
  async listMemory(ownerGaii, opts) {
631
659
  this.ensureReady();
632
- const where = { ownerGaii };
660
+ const where = { ownerGaii, ...this.archivedWhere(opts?.archived) };
633
661
  if (opts?.prefix)
634
662
  where.key = { startsWith: opts.prefix };
635
663
  if (opts?.visibility)
@@ -654,7 +682,7 @@ export class PrismaStorage {
654
682
  this.ensureReady();
655
683
  if (ownerGaiis.length === 0)
656
684
  return 0;
657
- const where = { ownerGaii: { in: ownerGaiis } };
685
+ const where = { ownerGaii: { in: ownerGaiis }, ...this.archivedWhere(opts?.archived) };
658
686
  if (opts?.prefix)
659
687
  where.key = { startsWith: opts.prefix };
660
688
  if (opts?.visibility)
@@ -666,7 +694,7 @@ export class PrismaStorage {
666
694
  }
667
695
  async listAllMemory(opts) {
668
696
  this.ensureReady();
669
- const where = {};
697
+ const where = { ...this.archivedWhere(opts?.archived) };
670
698
  if (opts?.ownerPrefix)
671
699
  where.ownerGaii = { startsWith: opts.ownerPrefix };
672
700
  if (opts?.prefix)
@@ -717,7 +745,7 @@ export class PrismaStorage {
717
745
  async searchMemory(ownerGaii, query, opts) {
718
746
  this.ensureReady();
719
747
  // MongoDB text search — search keys and string values
720
- const where = { ownerGaii };
748
+ const where = { ownerGaii, ...this.archivedWhere(opts?.archived) };
721
749
  if (opts?.visibility)
722
750
  where.visibility = opts.visibility;
723
751
  if (opts?.prefix)
@@ -775,7 +803,7 @@ export class PrismaStorage {
775
803
  const tokens = query.toLowerCase().match(/[\p{L}\p{N}]+/gu);
776
804
  if (!tokens || tokens.length === 0)
777
805
  return [];
778
- const where = { OR: tokens.map(tok => ({ searchBlob: { contains: tok, mode: 'insensitive' } })) };
806
+ const where = { OR: tokens.map(tok => ({ searchBlob: { contains: tok, mode: 'insensitive' } })), ...this.archivedWhere(opts?.archived) };
779
807
  if (opts?.ownerGaiis?.length)
780
808
  where.ownerGaii = { in: opts.ownerGaiis };
781
809
  if (opts?.visibility)
@@ -798,6 +826,54 @@ export class PrismaStorage {
798
826
  .slice(0, limit)
799
827
  .map(({ record, score }) => ({ record, score }));
800
828
  }
829
+ async archiveMemoryByKey(keyOrPrefix, opts) {
830
+ this.ensureReady();
831
+ const match = opts.match ?? 'prefix';
832
+ const where = { archived: { not: true } };
833
+ if (match === 'exact')
834
+ where.key = keyOrPrefix;
835
+ else if (match === 'subtree')
836
+ where.OR = [{ key: keyOrPrefix }, { key: { startsWith: keyOrPrefix + '.' } }];
837
+ else
838
+ where.key = { startsWith: keyOrPrefix };
839
+ const res = await this.prisma.memory.updateMany({
840
+ where,
841
+ data: { archived: true, archivedAt: new Date(opts.archivedAt), archivedBy: opts.archivedBy, archivedRoot: opts.archivedRoot },
842
+ });
843
+ return res.count;
844
+ }
845
+ async unarchiveMemoryByRoot(archivedRoot) {
846
+ this.ensureReady();
847
+ const res = await this.prisma.memory.updateMany({
848
+ where: { archived: true, archivedRoot },
849
+ data: { archived: false, archivedAt: null, archivedBy: null, archivedRoot: null },
850
+ });
851
+ return res.count;
852
+ }
853
+ async unarchiveMemoryByKey(keyOrPrefix, opts) {
854
+ this.ensureReady();
855
+ const match = opts?.match ?? 'subtree';
856
+ const where = { archived: true };
857
+ if (match === 'exact')
858
+ where.key = keyOrPrefix;
859
+ else if (match === 'subtree')
860
+ where.OR = [{ key: keyOrPrefix }, { key: { startsWith: keyOrPrefix + '.' } }];
861
+ else
862
+ where.key = { startsWith: keyOrPrefix };
863
+ const res = await this.prisma.memory.updateMany({
864
+ where,
865
+ data: { archived: false, archivedAt: null, archivedBy: null, archivedRoot: null },
866
+ });
867
+ return res.count;
868
+ }
869
+ async countArchivedByKeyPrefix(keyPrefix) {
870
+ this.ensureReady();
871
+ const [active, archived] = await Promise.all([
872
+ this.prisma.memory.count({ where: { key: { startsWith: keyPrefix }, archived: { not: true } } }),
873
+ this.prisma.memory.count({ where: { key: { startsWith: keyPrefix }, archived: true } }),
874
+ ]);
875
+ return { active, archived };
876
+ }
801
877
  // ── Actions ─────────────────────────────────────────────────
802
878
  async createAction(action) {
803
879
  this.ensureReady();
@@ -1608,7 +1684,17 @@ export class PrismaStorage {
1608
1684
  return { name: row.name, owner: row.owner, gaii: row.gaii, displayName: row.displayName ?? undefined, description: row.description ?? undefined, capabilities: row.capabilities, publicKey: row.publicKey, trustScore: row.trustScore, morselBalance: row.morselBalance, defaultScopes: row.defaultScopes?.length ? row.defaultScopes : undefined, allowedOrigins: row.allowedOrigins?.length ? row.allowedOrigins : undefined, federate: row.federate ?? false, technicalCapabilities: row.technicalCapabilities ?? undefined, domainCapabilities: row.domainCapabilities ?? undefined, languages: row.languages ?? undefined, activityStats: row.activityStats ?? undefined, modulesLoaded: row.modulesLoaded ?? undefined, agentLimitations: row.agentLimitations ?? undefined, webhookUrl: row.webhookUrl ?? undefined, webhookSecret: row.webhookSecret ?? undefined, webhookEnabled: row.webhookEnabled ?? false, webhookLastSuccess: row.webhookLastSuccess ? row.webhookLastSuccess.toISOString() : undefined, webhookLastFailure: row.webhookLastFailure ? row.webhookLastFailure.toISOString() : undefined, webhookFailCount: row.webhookFailCount ?? 0, platform: row.platform ?? undefined, platformVersion: row.platformVersion ?? undefined, platformDetectedBy: row.platformDetectedBy ?? undefined, tags: row.tags?.length ? row.tags : undefined, mode: (row.mode ?? 'interactive'), maxConcurrentTasks: row.maxConcurrentTasks ?? 1, dailySpendLimit: row.dailySpendLimit ?? undefined, scheduleConstraintDefaults: row.scheduleConstraintDefaults ?? undefined, createdAt: row.createdAt.toISOString(), lastSeen: row.lastSeen.toISOString() };
1609
1685
  }
1610
1686
  toMemoryRecord(row) {
1611
- return { key: row.key, ownerGaii: row.ownerGaii, value: row.value, visibility: row.visibility, groupId: row.groupId ?? undefined, tags: row.tags, ttlHours: row.ttlHours, version: row.version, createdAt: row.createdAt.toISOString(), updatedAt: row.updatedAt.toISOString(), flagCount: row.flagCount ?? undefined, allowedOrigins: row.allowedOrigins?.length ? row.allowedOrigins : undefined, trackable: row.trackable ? true : undefined };
1687
+ return { key: row.key, ownerGaii: row.ownerGaii, value: row.value, visibility: row.visibility, groupId: row.groupId ?? undefined, tags: row.tags, ttlHours: row.ttlHours, version: row.version, createdAt: row.createdAt.toISOString(), updatedAt: row.updatedAt.toISOString(), flagCount: row.flagCount ?? undefined, allowedOrigins: row.allowedOrigins?.length ? row.allowedOrigins : undefined, trackable: row.trackable ? true : undefined, archived: row.archived ? true : undefined, archivedAt: row.archivedAt ? row.archivedAt.toISOString() : undefined, archivedBy: row.archivedBy ?? undefined, archivedRoot: row.archivedRoot ?? undefined };
1688
+ }
1689
+ /** Prisma `where` fragment restricting memory rows by archive filter. Default `exclude` uses
1690
+ * `{ not: true }` (NOT `false`) so legacy docs written before the field existed — which have no
1691
+ * `archived` key at all — are still treated as active. Mirrors SQLite's `archived = 0` default. */
1692
+ archivedWhere(archived) {
1693
+ if (archived === 'include')
1694
+ return {};
1695
+ if (archived === 'only')
1696
+ return { archived: true };
1697
+ return { archived: { not: true } };
1612
1698
  }
1613
1699
  /** Read an optional `_actor` / `_event` annotation off a record value (the structure-timeline
1614
1700
  * convention) so archived history rows carry who/why. Best-effort. */
@@ -2496,7 +2582,7 @@ export class PrismaStorage {
2496
2582
  // ── Organisms (Phase 2.2) ──
2497
2583
  async createOrganism(record) {
2498
2584
  this.ensureReady();
2499
- await this.prisma.organism.create({ data: { id: record.id, name: record.name, description: record.description, type: record.type, location: record.location ?? null, interests: record.interests, creatorGhii: record.creatorGhii, admins: record.admins, members: record.members, agentGaiis: record.agentGaiis, boardId: record.boardId, joinPolicy: record.joinPolicy, maxMembers: record.maxMembers, visibility: record.visibility, moderationConfig: record.moderationConfig, memoryNamespace: record.memoryNamespace, semantic: record.semantic ?? null, createdAt: new Date(record.createdAt) } });
2585
+ await this.prisma.organism.create({ data: { id: record.id, name: record.name, description: record.description, type: record.type, location: record.location ?? null, interests: record.interests, creatorGhii: record.creatorGhii, admins: record.admins, members: record.members, agentGaiis: record.agentGaiis, boardId: record.boardId, joinPolicy: record.joinPolicy, maxMembers: record.maxMembers, visibility: record.visibility, moderationConfig: record.moderationConfig, memoryNamespace: record.memoryNamespace, semantic: record.semantic ?? null, archived: record.archived ?? false, archivedAt: record.archivedAt ? new Date(record.archivedAt) : null, archivedBy: record.archivedBy ?? null, createdAt: new Date(record.createdAt) } });
2500
2586
  return record;
2501
2587
  }
2502
2588
  async getOrganism(id) {
@@ -2513,6 +2599,12 @@ export class PrismaStorage {
2513
2599
  where.type = opts.type;
2514
2600
  if (opts?.visibility)
2515
2601
  where.visibility = opts.visibility;
2602
+ // Archive filter — default include; `{ not: true }` for exclude also matches legacy docs that
2603
+ // predate the field (belt-and-suspenders alongside the startup backfill).
2604
+ if (opts?.archived === 'exclude')
2605
+ where.archived = { not: true };
2606
+ else if (opts?.archived === 'only')
2607
+ where.archived = true;
2516
2608
  // city and interest filtering done post-query (JSON field)
2517
2609
  const rows = await this.prisma.organism.findMany({ where, orderBy: { createdAt: 'desc' } });
2518
2610
  let results = rows.map((r) => this.toOrganismRecord(r));
@@ -2538,6 +2630,8 @@ export class PrismaStorage {
2538
2630
  data.semantic = data.semantic;
2539
2631
  if (data.createdAt && typeof data.createdAt === 'string')
2540
2632
  data.createdAt = new Date(data.createdAt);
2633
+ if (data.archivedAt && typeof data.archivedAt === 'string')
2634
+ data.archivedAt = new Date(data.archivedAt);
2541
2635
  const row = await this.prisma.organism.update({ where: { id }, data });
2542
2636
  return this.toOrganismRecord(row);
2543
2637
  }
@@ -2583,7 +2677,7 @@ export class PrismaStorage {
2583
2677
  }
2584
2678
  }
2585
2679
  toOrganismRecord(row) {
2586
- return { id: row.id, name: row.name, description: row.description, type: row.type, location: row.location ?? undefined, interests: row.interests, creatorGhii: row.creatorGhii, admins: row.admins, members: row.members, agentGaiis: row.agentGaiis, boardId: row.boardId, joinPolicy: row.joinPolicy, maxMembers: row.maxMembers, visibility: row.visibility, moderationConfig: row.moderationConfig, memoryNamespace: row.memoryNamespace, semantic: row.semantic ?? undefined, createdAt: row.createdAt instanceof Date ? row.createdAt.toISOString() : row.createdAt, updatedAt: row.updatedAt instanceof Date ? row.updatedAt.toISOString() : row.updatedAt };
2680
+ return { id: row.id, name: row.name, description: row.description, type: row.type, location: row.location ?? undefined, interests: row.interests, creatorGhii: row.creatorGhii, admins: row.admins, members: row.members, agentGaiis: row.agentGaiis, boardId: row.boardId, joinPolicy: row.joinPolicy, maxMembers: row.maxMembers, visibility: row.visibility, moderationConfig: row.moderationConfig, memoryNamespace: row.memoryNamespace, semantic: row.semantic ?? undefined, archived: row.archived ? true : undefined, archivedAt: row.archivedAt ? (row.archivedAt instanceof Date ? row.archivedAt.toISOString() : row.archivedAt) : undefined, archivedBy: row.archivedBy ?? undefined, createdAt: row.createdAt instanceof Date ? row.createdAt.toISOString() : row.createdAt, updatedAt: row.updatedAt instanceof Date ? row.updatedAt.toISOString() : row.updatedAt };
2587
2681
  }
2588
2682
  async createMembership(record) {
2589
2683
  this.ensureReady();
@@ -3944,10 +4038,11 @@ export class PrismaStorage {
3944
4038
  }
3945
4039
  if (opts?.freeOnly)
3946
4040
  apps = apps.filter((a) => !a.manifest.priceMorsels);
3947
- // Parked + operator-hidden apps are hidden from everyone EXCEPT their
3948
- // owner. A scoped ownerGaii query already returns only that owner's apps
3949
- // (their "my apps" view, which should include both), so only filter the
3950
- // unscoped listing. adminView (operator moderation) bypasses both filters.
4041
+ // Parked + operator-hidden apps are hidden from everyone EXCEPT their owner
4042
+ // (viewerGhii) — decided purely from who is authenticated. The owner sees
4043
+ // their own (operator-hidden ones carry operator_hidden=true so the client
4044
+ // can badge them); everyone else does not. A scoped ownerGaii query already
4045
+ // returns only that owner's apps, so skip the filters there. adminView sees all.
3951
4046
  if (!opts?.ownerGaii && !opts?.adminView) {
3952
4047
  apps = apps.filter((a) => !a.parked || (opts?.viewerGhii && a.ownerGaii === opts.viewerGhii));
3953
4048
  apps = apps.filter((a) => !a.operatorHidden || (opts?.viewerGhii && a.ownerGaii === opts.viewerGhii));
@@ -3995,6 +4090,31 @@ export class PrismaStorage {
3995
4090
  });
3996
4091
  return result.count > 0;
3997
4092
  }
4093
+ async updateAppMeta(ownerGaii, filename, meta) {
4094
+ this.ensureReady();
4095
+ // Rename/re-describe in place on the LATEST version (the one the catalogue
4096
+ // shows). Read the current manifest, merge only the supplied fields, write
4097
+ // it back — the URL (owner/filename) is untouched. Older versions keep the
4098
+ // name they were published under.
4099
+ const rows = await this.prisma.app.findMany({
4100
+ where: { ownerGaii, filename },
4101
+ orderBy: { versionNumber: 'desc' },
4102
+ take: 1,
4103
+ });
4104
+ if (rows.length === 0)
4105
+ return false;
4106
+ const latest = rows[0];
4107
+ const manifest = { ...latest.manifest };
4108
+ if (meta.name !== undefined)
4109
+ manifest.name = meta.name;
4110
+ if (meta.description !== undefined)
4111
+ manifest.description = meta.description;
4112
+ await this.prisma.app.update({
4113
+ where: { ownerGaii_filename_versionNumber: { ownerGaii, filename, versionNumber: latest.versionNumber } },
4114
+ data: { manifest: manifest },
4115
+ });
4116
+ return true;
4117
+ }
3998
4118
  async setAppParked(ownerGaii, filename, parked) {
3999
4119
  this.ensureReady();
4000
4120
  // Park/unpark applies to the whole app — flag every version row.