@open-mercato/ai-assistant 0.5.1-develop.3036.f02c281f23 → 0.5.1-develop.3045.b4b3320cc2

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 (273) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/AGENTS.md +361 -0
  3. package/README.md +5 -0
  4. package/dist/index.js +154 -0
  5. package/dist/index.js.map +2 -2
  6. package/dist/modules/ai_assistant/__integration__/TC-AI-002-agent-policy.spec.js +73 -0
  7. package/dist/modules/ai_assistant/__integration__/TC-AI-002-agent-policy.spec.js.map +7 -0
  8. package/dist/modules/ai_assistant/__integration__/TC-AI-AGENT-SETTINGS-005-settings-page.spec.js +484 -0
  9. package/dist/modules/ai_assistant/__integration__/TC-AI-AGENT-SETTINGS-005-settings-page.spec.js.map +7 -0
  10. package/dist/modules/ai_assistant/__integration__/TC-AI-PLAYGROUND-004-playground.spec.js +251 -0
  11. package/dist/modules/ai_assistant/__integration__/TC-AI-PLAYGROUND-004-playground.spec.js.map +7 -0
  12. package/dist/modules/ai_assistant/__integration__/TC-INT-AI-TOOLS.spec.js +91 -0
  13. package/dist/modules/ai_assistant/__integration__/TC-INT-AI-TOOLS.spec.js.map +7 -0
  14. package/dist/modules/ai_assistant/ai-tools/attachments-pack.js +202 -0
  15. package/dist/modules/ai_assistant/ai-tools/attachments-pack.js.map +7 -0
  16. package/dist/modules/ai_assistant/ai-tools/meta-pack.js +121 -0
  17. package/dist/modules/ai_assistant/ai-tools/meta-pack.js.map +7 -0
  18. package/dist/modules/ai_assistant/ai-tools/search-pack.js +94 -0
  19. package/dist/modules/ai_assistant/ai-tools/search-pack.js.map +7 -0
  20. package/dist/modules/ai_assistant/ai-tools.js +14 -0
  21. package/dist/modules/ai_assistant/ai-tools.js.map +7 -0
  22. package/dist/modules/ai_assistant/api/ai/actions/[id]/cancel/route.js +175 -0
  23. package/dist/modules/ai_assistant/api/ai/actions/[id]/cancel/route.js.map +7 -0
  24. package/dist/modules/ai_assistant/api/ai/actions/[id]/confirm/route.js +174 -0
  25. package/dist/modules/ai_assistant/api/ai/actions/[id]/confirm/route.js.map +7 -0
  26. package/dist/modules/ai_assistant/api/ai/actions/[id]/route.js +101 -0
  27. package/dist/modules/ai_assistant/api/ai/actions/[id]/route.js.map +7 -0
  28. package/dist/modules/ai_assistant/api/ai/agents/[agentId]/mutation-policy/route.js +311 -0
  29. package/dist/modules/ai_assistant/api/ai/agents/[agentId]/mutation-policy/route.js.map +7 -0
  30. package/dist/modules/ai_assistant/api/ai/agents/[agentId]/prompt-override/route.js +246 -0
  31. package/dist/modules/ai_assistant/api/ai/agents/[agentId]/prompt-override/route.js.map +7 -0
  32. package/dist/modules/ai_assistant/api/ai/agents/route.js +94 -0
  33. package/dist/modules/ai_assistant/api/ai/agents/route.js.map +7 -0
  34. package/dist/modules/ai_assistant/api/ai/chat/route.js +173 -0
  35. package/dist/modules/ai_assistant/api/ai/chat/route.js.map +7 -0
  36. package/dist/modules/ai_assistant/api/ai/run-object/route.js +167 -0
  37. package/dist/modules/ai_assistant/api/ai/run-object/route.js.map +7 -0
  38. package/dist/modules/ai_assistant/backend/config/ai-assistant/agents/AiAgentSettingsPageClient.js +1111 -0
  39. package/dist/modules/ai_assistant/backend/config/ai-assistant/agents/AiAgentSettingsPageClient.js.map +7 -0
  40. package/dist/modules/ai_assistant/backend/config/ai-assistant/agents/page.js +10 -0
  41. package/dist/modules/ai_assistant/backend/config/ai-assistant/agents/page.js.map +7 -0
  42. package/dist/modules/ai_assistant/backend/config/ai-assistant/agents/page.meta.js +28 -0
  43. package/dist/modules/ai_assistant/backend/config/ai-assistant/agents/page.meta.js.map +7 -0
  44. package/dist/modules/ai_assistant/backend/config/ai-assistant/legacy/page.js +10 -0
  45. package/dist/modules/ai_assistant/backend/config/ai-assistant/legacy/page.js.map +7 -0
  46. package/dist/modules/ai_assistant/backend/config/ai-assistant/legacy/page.meta.js +30 -0
  47. package/dist/modules/ai_assistant/backend/config/ai-assistant/legacy/page.meta.js.map +7 -0
  48. package/dist/modules/ai_assistant/backend/config/ai-assistant/page.js +4 -6
  49. package/dist/modules/ai_assistant/backend/config/ai-assistant/page.js.map +2 -2
  50. package/dist/modules/ai_assistant/backend/config/ai-assistant/page.meta.js +1 -21
  51. package/dist/modules/ai_assistant/backend/config/ai-assistant/page.meta.js.map +2 -2
  52. package/dist/modules/ai_assistant/backend/config/ai-assistant/playground/AiPlaygroundPageClient.js +462 -0
  53. package/dist/modules/ai_assistant/backend/config/ai-assistant/playground/AiPlaygroundPageClient.js.map +7 -0
  54. package/dist/modules/ai_assistant/backend/config/ai-assistant/playground/page.js +10 -0
  55. package/dist/modules/ai_assistant/backend/config/ai-assistant/playground/page.js.map +7 -0
  56. package/dist/modules/ai_assistant/backend/config/ai-assistant/playground/page.meta.js +28 -0
  57. package/dist/modules/ai_assistant/backend/config/ai-assistant/playground/page.meta.js.map +7 -0
  58. package/dist/modules/ai_assistant/cli.js +78 -12
  59. package/dist/modules/ai_assistant/cli.js.map +2 -2
  60. package/dist/modules/ai_assistant/data/entities/AiAgentMutationPolicyOverride.js +5 -0
  61. package/dist/modules/ai_assistant/data/entities/AiAgentMutationPolicyOverride.js.map +7 -0
  62. package/dist/modules/ai_assistant/data/entities/AiAgentPromptOverride.js +5 -0
  63. package/dist/modules/ai_assistant/data/entities/AiAgentPromptOverride.js.map +7 -0
  64. package/dist/modules/ai_assistant/data/entities/AiPendingAction.js +5 -0
  65. package/dist/modules/ai_assistant/data/entities/AiPendingAction.js.map +7 -0
  66. package/dist/modules/ai_assistant/data/entities.js +228 -0
  67. package/dist/modules/ai_assistant/data/entities.js.map +7 -0
  68. package/dist/modules/ai_assistant/data/repositories/AiAgentMutationPolicyOverrideRepository.js +95 -0
  69. package/dist/modules/ai_assistant/data/repositories/AiAgentMutationPolicyOverrideRepository.js.map +7 -0
  70. package/dist/modules/ai_assistant/data/repositories/AiAgentPromptOverrideRepository.js +95 -0
  71. package/dist/modules/ai_assistant/data/repositories/AiAgentPromptOverrideRepository.js.map +7 -0
  72. package/dist/modules/ai_assistant/data/repositories/AiPendingActionRepository.js +223 -0
  73. package/dist/modules/ai_assistant/data/repositories/AiPendingActionRepository.js.map +7 -0
  74. package/dist/modules/ai_assistant/events.js +33 -0
  75. package/dist/modules/ai_assistant/events.js.map +7 -0
  76. package/dist/modules/ai_assistant/i18n/de.json +252 -0
  77. package/dist/modules/ai_assistant/i18n/en.json +252 -0
  78. package/dist/modules/ai_assistant/i18n/es.json +252 -0
  79. package/dist/modules/ai_assistant/i18n/pl.json +252 -0
  80. package/dist/modules/ai_assistant/lib/agent-policy.js +168 -0
  81. package/dist/modules/ai_assistant/lib/agent-policy.js.map +7 -0
  82. package/dist/modules/ai_assistant/lib/agent-registry.js +195 -0
  83. package/dist/modules/ai_assistant/lib/agent-registry.js.map +7 -0
  84. package/dist/modules/ai_assistant/lib/agent-runtime.js +451 -0
  85. package/dist/modules/ai_assistant/lib/agent-runtime.js.map +7 -0
  86. package/dist/modules/ai_assistant/lib/agent-tools.js +223 -0
  87. package/dist/modules/ai_assistant/lib/agent-tools.js.map +7 -0
  88. package/dist/modules/ai_assistant/lib/agent-transport.js +25 -0
  89. package/dist/modules/ai_assistant/lib/agent-transport.js.map +7 -0
  90. package/dist/modules/ai_assistant/lib/ai-agent-definition.js +11 -0
  91. package/dist/modules/ai_assistant/lib/ai-agent-definition.js.map +7 -0
  92. package/dist/modules/ai_assistant/lib/ai-agents-generated.d.js +1 -0
  93. package/dist/modules/ai_assistant/lib/ai-agents-generated.d.js.map +7 -0
  94. package/dist/modules/ai_assistant/lib/ai-api-operation-runner.js +239 -0
  95. package/dist/modules/ai_assistant/lib/ai-api-operation-runner.js.map +7 -0
  96. package/dist/modules/ai_assistant/lib/ai-overrides.js +189 -0
  97. package/dist/modules/ai_assistant/lib/ai-overrides.js.map +7 -0
  98. package/dist/modules/ai_assistant/lib/ai-tool-definition.js +7 -0
  99. package/dist/modules/ai_assistant/lib/ai-tool-definition.js.map +7 -0
  100. package/dist/modules/ai_assistant/lib/ai-tools-generated.d.js +1 -0
  101. package/dist/modules/ai_assistant/lib/ai-tools-generated.d.js.map +7 -0
  102. package/dist/modules/ai_assistant/lib/api-backed-tool.js +48 -0
  103. package/dist/modules/ai_assistant/lib/api-backed-tool.js.map +7 -0
  104. package/dist/modules/ai_assistant/lib/attachment-bridge-types.js +1 -0
  105. package/dist/modules/ai_assistant/lib/attachment-bridge-types.js.map +7 -0
  106. package/dist/modules/ai_assistant/lib/attachment-parts.js +276 -0
  107. package/dist/modules/ai_assistant/lib/attachment-parts.js.map +7 -0
  108. package/dist/modules/ai_assistant/lib/model-factory.js +68 -0
  109. package/dist/modules/ai_assistant/lib/model-factory.js.map +7 -0
  110. package/dist/modules/ai_assistant/lib/pending-action-cancel.js +86 -0
  111. package/dist/modules/ai_assistant/lib/pending-action-cancel.js.map +7 -0
  112. package/dist/modules/ai_assistant/lib/pending-action-client.js +35 -0
  113. package/dist/modules/ai_assistant/lib/pending-action-client.js.map +7 -0
  114. package/dist/modules/ai_assistant/lib/pending-action-executor.js +243 -0
  115. package/dist/modules/ai_assistant/lib/pending-action-executor.js.map +7 -0
  116. package/dist/modules/ai_assistant/lib/pending-action-recheck.js +246 -0
  117. package/dist/modules/ai_assistant/lib/pending-action-recheck.js.map +7 -0
  118. package/dist/modules/ai_assistant/lib/pending-action-types.js +70 -0
  119. package/dist/modules/ai_assistant/lib/pending-action-types.js.map +7 -0
  120. package/dist/modules/ai_assistant/lib/prepare-mutation.js +315 -0
  121. package/dist/modules/ai_assistant/lib/prepare-mutation.js.map +7 -0
  122. package/dist/modules/ai_assistant/lib/prompt-composition-types.js +7 -0
  123. package/dist/modules/ai_assistant/lib/prompt-composition-types.js.map +7 -0
  124. package/dist/modules/ai_assistant/lib/prompt-override-merge.js +175 -0
  125. package/dist/modules/ai_assistant/lib/prompt-override-merge.js.map +7 -0
  126. package/dist/modules/ai_assistant/lib/schema-utils.js +5 -1
  127. package/dist/modules/ai_assistant/lib/schema-utils.js.map +2 -2
  128. package/dist/modules/ai_assistant/lib/tool-executor.js +13 -2
  129. package/dist/modules/ai_assistant/lib/tool-executor.js.map +2 -2
  130. package/dist/modules/ai_assistant/lib/tool-loader.js +86 -11
  131. package/dist/modules/ai_assistant/lib/tool-loader.js.map +2 -2
  132. package/dist/modules/ai_assistant/lib/tool-test-fixtures.js +120 -0
  133. package/dist/modules/ai_assistant/lib/tool-test-fixtures.js.map +7 -0
  134. package/dist/modules/ai_assistant/lib/tool-test-runner.js +418 -0
  135. package/dist/modules/ai_assistant/lib/tool-test-runner.js.map +7 -0
  136. package/dist/modules/ai_assistant/migrations/Migration20260419100521.js +17 -0
  137. package/dist/modules/ai_assistant/migrations/Migration20260419100521.js.map +7 -0
  138. package/dist/modules/ai_assistant/migrations/Migration20260419132948.js +16 -0
  139. package/dist/modules/ai_assistant/migrations/Migration20260419132948.js.map +7 -0
  140. package/dist/modules/ai_assistant/migrations/Migration20260419134235.js +17 -0
  141. package/dist/modules/ai_assistant/migrations/Migration20260419134235.js.map +7 -0
  142. package/dist/modules/ai_assistant/setup.js +36 -0
  143. package/dist/modules/ai_assistant/setup.js.map +2 -2
  144. package/dist/modules/ai_assistant/workers/ai-pending-action-cleanup.js +161 -0
  145. package/dist/modules/ai_assistant/workers/ai-pending-action-cleanup.js.map +7 -0
  146. package/generated/entities/ai_agent_mutation_policy_override/index.ts +9 -0
  147. package/generated/entities/ai_agent_prompt_override/index.ts +10 -0
  148. package/generated/entities/ai_pending_action/index.ts +24 -0
  149. package/generated/entities.ids.generated.ts +13 -0
  150. package/generated/entity-fields-registry.ts +57 -0
  151. package/jest.config.cjs +7 -0
  152. package/package.json +4 -4
  153. package/src/index.ts +215 -0
  154. package/src/modules/ai_assistant/__integration__/README.md +5 -0
  155. package/src/modules/ai_assistant/__integration__/TC-AI-002-agent-policy.spec.ts +115 -0
  156. package/src/modules/ai_assistant/__integration__/TC-AI-AGENT-SETTINGS-005-settings-page.spec.ts +574 -0
  157. package/src/modules/ai_assistant/__integration__/TC-AI-PLAYGROUND-004-playground.spec.ts +333 -0
  158. package/src/modules/ai_assistant/__integration__/TC-INT-AI-TOOLS.spec.ts +135 -0
  159. package/src/modules/ai_assistant/__tests__/events.test.ts +145 -0
  160. package/src/modules/ai_assistant/__tests__/integration/pending-action-contract.test.ts +1015 -0
  161. package/src/modules/ai_assistant/__tests__/integration/ws-c-attachment-bridge.test.ts +235 -0
  162. package/src/modules/ai_assistant/__tests__/integration/ws-c-policy-and-tools.test.ts +330 -0
  163. package/src/modules/ai_assistant/__tests__/integration/ws-c-tool-pack-coverage.test.ts +285 -0
  164. package/src/modules/ai_assistant/ai-tools/__tests__/attachments-pack.test.ts +322 -0
  165. package/src/modules/ai_assistant/ai-tools/__tests__/meta-pack.test.ts +218 -0
  166. package/src/modules/ai_assistant/ai-tools/__tests__/search-pack.test.ts +192 -0
  167. package/src/modules/ai_assistant/ai-tools/attachments-pack.ts +269 -0
  168. package/src/modules/ai_assistant/ai-tools/meta-pack.ts +140 -0
  169. package/src/modules/ai_assistant/ai-tools/search-pack.ts +122 -0
  170. package/src/modules/ai_assistant/ai-tools.ts +21 -0
  171. package/src/modules/ai_assistant/api/ai/actions/[id]/__tests__/route.test.ts +222 -0
  172. package/src/modules/ai_assistant/api/ai/actions/[id]/cancel/__tests__/route.test.ts +286 -0
  173. package/src/modules/ai_assistant/api/ai/actions/[id]/cancel/route.ts +237 -0
  174. package/src/modules/ai_assistant/api/ai/actions/[id]/confirm/__tests__/route.test.ts +339 -0
  175. package/src/modules/ai_assistant/api/ai/actions/[id]/confirm/route.ts +229 -0
  176. package/src/modules/ai_assistant/api/ai/actions/[id]/route.ts +142 -0
  177. package/src/modules/ai_assistant/api/ai/agents/[agentId]/mutation-policy/__tests__/route.test.ts +367 -0
  178. package/src/modules/ai_assistant/api/ai/agents/[agentId]/mutation-policy/route.ts +380 -0
  179. package/src/modules/ai_assistant/api/ai/agents/[agentId]/prompt-override/__tests__/route.test.ts +333 -0
  180. package/src/modules/ai_assistant/api/ai/agents/[agentId]/prompt-override/route.ts +307 -0
  181. package/src/modules/ai_assistant/api/ai/agents/route.ts +107 -0
  182. package/src/modules/ai_assistant/api/ai/chat/__tests__/route.test.ts +282 -0
  183. package/src/modules/ai_assistant/api/ai/chat/route.ts +207 -0
  184. package/src/modules/ai_assistant/api/ai/run-object/__tests__/route.test.ts +282 -0
  185. package/src/modules/ai_assistant/api/ai/run-object/route.ts +204 -0
  186. package/src/modules/ai_assistant/backend/config/ai-assistant/agents/AiAgentSettingsPageClient.tsx +1419 -0
  187. package/src/modules/ai_assistant/backend/config/ai-assistant/agents/page.meta.ts +26 -0
  188. package/src/modules/ai_assistant/backend/config/ai-assistant/agents/page.tsx +12 -0
  189. package/src/modules/ai_assistant/backend/config/ai-assistant/legacy/page.meta.ts +28 -0
  190. package/src/modules/ai_assistant/backend/config/ai-assistant/legacy/page.tsx +12 -0
  191. package/src/modules/ai_assistant/backend/config/ai-assistant/page.meta.ts +8 -23
  192. package/src/modules/ai_assistant/backend/config/ai-assistant/page.tsx +15 -10
  193. package/src/modules/ai_assistant/backend/config/ai-assistant/playground/AiPlaygroundPageClient.tsx +604 -0
  194. package/src/modules/ai_assistant/backend/config/ai-assistant/playground/page.meta.ts +26 -0
  195. package/src/modules/ai_assistant/backend/config/ai-assistant/playground/page.tsx +12 -0
  196. package/src/modules/ai_assistant/cli.ts +99 -24
  197. package/src/modules/ai_assistant/data/__tests__/schema-unique-indexes.test.ts +69 -0
  198. package/src/modules/ai_assistant/data/entities/AiAgentMutationPolicyOverride.ts +7 -0
  199. package/src/modules/ai_assistant/data/entities/AiAgentPromptOverride.ts +7 -0
  200. package/src/modules/ai_assistant/data/entities/AiPendingAction.ts +7 -0
  201. package/src/modules/ai_assistant/data/entities.ts +270 -0
  202. package/src/modules/ai_assistant/data/repositories/AiAgentMutationPolicyOverrideRepository.ts +129 -0
  203. package/src/modules/ai_assistant/data/repositories/AiAgentPromptOverrideRepository.ts +132 -0
  204. package/src/modules/ai_assistant/data/repositories/AiPendingActionRepository.ts +334 -0
  205. package/src/modules/ai_assistant/data/repositories/__tests__/AiAgentMutationPolicyOverrideRepository.test.ts +195 -0
  206. package/src/modules/ai_assistant/data/repositories/__tests__/AiAgentPromptOverrideRepository.test.ts +197 -0
  207. package/src/modules/ai_assistant/data/repositories/__tests__/AiPendingActionRepository.test.ts +357 -0
  208. package/src/modules/ai_assistant/events.ts +112 -0
  209. package/src/modules/ai_assistant/i18n/de.json +252 -0
  210. package/src/modules/ai_assistant/i18n/en.json +252 -0
  211. package/src/modules/ai_assistant/i18n/es.json +252 -0
  212. package/src/modules/ai_assistant/i18n/pl.json +252 -0
  213. package/src/modules/ai_assistant/lib/__tests__/agent-policy.mutation-override.test.ts +203 -0
  214. package/src/modules/ai_assistant/lib/__tests__/agent-policy.test.ts +385 -0
  215. package/src/modules/ai_assistant/lib/__tests__/agent-registry.test.ts +217 -0
  216. package/src/modules/ai_assistant/lib/__tests__/agent-runtime-object.test.ts +329 -0
  217. package/src/modules/ai_assistant/lib/__tests__/agent-runtime-parity.test.ts +573 -0
  218. package/src/modules/ai_assistant/lib/__tests__/agent-runtime.test.ts +291 -0
  219. package/src/modules/ai_assistant/lib/__tests__/agent-tools.test.ts +172 -0
  220. package/src/modules/ai_assistant/lib/__tests__/agent-transport.test.ts +41 -0
  221. package/src/modules/ai_assistant/lib/__tests__/ai-agent-definition.test.ts +183 -0
  222. package/src/modules/ai_assistant/lib/__tests__/ai-api-operation-runner.test.ts +432 -0
  223. package/src/modules/ai_assistant/lib/__tests__/ai-overrides.test.ts +308 -0
  224. package/src/modules/ai_assistant/lib/__tests__/api-backed-tool.test.ts +302 -0
  225. package/src/modules/ai_assistant/lib/__tests__/attachment-bridge-and-prompt-types.test.ts +188 -0
  226. package/src/modules/ai_assistant/lib/__tests__/attachment-parts.test.ts +531 -0
  227. package/src/modules/ai_assistant/lib/__tests__/max-steps-budget.integration.test.ts +263 -0
  228. package/src/modules/ai_assistant/lib/__tests__/model-factory.integration.test.ts +183 -0
  229. package/src/modules/ai_assistant/lib/__tests__/model-factory.test.ts +168 -0
  230. package/src/modules/ai_assistant/lib/__tests__/pending-action-cancel.test.ts +235 -0
  231. package/src/modules/ai_assistant/lib/__tests__/pending-action-client.test.ts +148 -0
  232. package/src/modules/ai_assistant/lib/__tests__/pending-action-executor.test.ts +348 -0
  233. package/src/modules/ai_assistant/lib/__tests__/pending-action-recheck.test.ts +378 -0
  234. package/src/modules/ai_assistant/lib/__tests__/phase-0-additive-contract.test.ts +299 -0
  235. package/src/modules/ai_assistant/lib/__tests__/prepare-mutation.test.ts +610 -0
  236. package/src/modules/ai_assistant/lib/__tests__/prompt-override-merge.test.ts +136 -0
  237. package/src/modules/ai_assistant/lib/__tests__/tool-loader.test.ts +125 -0
  238. package/src/modules/ai_assistant/lib/agent-policy.ts +270 -0
  239. package/src/modules/ai_assistant/lib/agent-registry.ts +277 -0
  240. package/src/modules/ai_assistant/lib/agent-runtime.ts +751 -0
  241. package/src/modules/ai_assistant/lib/agent-tools.ts +396 -0
  242. package/src/modules/ai_assistant/lib/agent-transport.ts +51 -0
  243. package/src/modules/ai_assistant/lib/ai-agent-definition.ts +86 -0
  244. package/src/modules/ai_assistant/lib/ai-agents-generated.d.ts +18 -0
  245. package/src/modules/ai_assistant/lib/ai-api-operation-runner.ts +333 -0
  246. package/src/modules/ai_assistant/lib/ai-overrides.ts +389 -0
  247. package/src/modules/ai_assistant/lib/ai-tool-definition.ts +7 -0
  248. package/src/modules/ai_assistant/lib/ai-tools-generated.d.ts +7 -0
  249. package/src/modules/ai_assistant/lib/api-backed-tool.ts +85 -0
  250. package/src/modules/ai_assistant/lib/attachment-bridge-types.ts +24 -0
  251. package/src/modules/ai_assistant/lib/attachment-parts.ts +433 -0
  252. package/src/modules/ai_assistant/lib/model-factory.ts +212 -0
  253. package/src/modules/ai_assistant/lib/pending-action-cancel.ts +179 -0
  254. package/src/modules/ai_assistant/lib/pending-action-client.ts +126 -0
  255. package/src/modules/ai_assistant/lib/pending-action-executor.ts +424 -0
  256. package/src/modules/ai_assistant/lib/pending-action-recheck.ts +410 -0
  257. package/src/modules/ai_assistant/lib/pending-action-types.ts +194 -0
  258. package/src/modules/ai_assistant/lib/prepare-mutation.ts +448 -0
  259. package/src/modules/ai_assistant/lib/prompt-composition-types.ts +24 -0
  260. package/src/modules/ai_assistant/lib/prompt-override-merge.ts +253 -0
  261. package/src/modules/ai_assistant/lib/schema-utils.ts +14 -2
  262. package/src/modules/ai_assistant/lib/tool-executor.ts +25 -3
  263. package/src/modules/ai_assistant/lib/tool-loader.ts +159 -13
  264. package/src/modules/ai_assistant/lib/tool-test-fixtures.ts +160 -0
  265. package/src/modules/ai_assistant/lib/tool-test-runner.ts +596 -0
  266. package/src/modules/ai_assistant/lib/types.ts +105 -2
  267. package/src/modules/ai_assistant/migrations/.snapshot-open-mercato.json +871 -0
  268. package/src/modules/ai_assistant/migrations/Migration20260419100521.ts +17 -0
  269. package/src/modules/ai_assistant/migrations/Migration20260419132948.ts +16 -0
  270. package/src/modules/ai_assistant/migrations/Migration20260419134235.ts +17 -0
  271. package/src/modules/ai_assistant/setup.ts +53 -0
  272. package/src/modules/ai_assistant/workers/__tests__/ai-pending-action-cleanup.test.ts +333 -0
  273. package/src/modules/ai_assistant/workers/ai-pending-action-cleanup.ts +269 -0
@@ -0,0 +1,168 @@
1
+ import { getAgent } from "./agent-registry.js";
2
+ import { hasRequiredFeatures } from "./auth.js";
3
+ import { toolRegistry } from "./tool-registry.js";
4
+ const POLICY_RESTRICTIVENESS = {
5
+ "read-only": 0,
6
+ "destructive-confirm-required": 1,
7
+ "confirm-required": 2
8
+ };
9
+ function isKnownMutationPolicy(value) {
10
+ return value === "read-only" || value === "confirm-required" || value === "destructive-confirm-required";
11
+ }
12
+ function resolveEffectiveMutationPolicy(codeDeclared, override, agentId) {
13
+ const base = codeDeclared && isKnownMutationPolicy(codeDeclared) ? codeDeclared : "read-only";
14
+ if (override === void 0 || override === null) return base;
15
+ if (!isKnownMutationPolicy(override)) {
16
+ console.warn(
17
+ `[AI Agents] Ignoring corrupt mutationPolicy override for agent "${agentId ?? "<unknown>"}": ${String(
18
+ override
19
+ )}. Falling back to code-declared policy "${base}".`
20
+ );
21
+ return base;
22
+ }
23
+ const baseRank = POLICY_RESTRICTIVENESS[base];
24
+ const overrideRank = POLICY_RESTRICTIVENESS[override];
25
+ return overrideRank < baseRank ? override : base;
26
+ }
27
+ function isMutationPolicyEscalation(codeDeclared, candidate) {
28
+ const base = codeDeclared && isKnownMutationPolicy(codeDeclared) ? codeDeclared : "read-only";
29
+ return POLICY_RESTRICTIVENESS[candidate] > POLICY_RESTRICTIVENESS[base];
30
+ }
31
+ function classifyMediaType(value) {
32
+ const normalized = value.trim().toLowerCase();
33
+ if (normalized.startsWith("image/")) return "image";
34
+ if (normalized === "application/pdf") return "pdf";
35
+ return "file";
36
+ }
37
+ function isAgentReadOnly(agent) {
38
+ if (typeof agent.readOnly === "boolean") return agent.readOnly;
39
+ return true;
40
+ }
41
+ function resolvePolicyCheckMutationPolicy(agent, override) {
42
+ return resolveEffectiveMutationPolicy(agent.mutationPolicy, override, agent.id);
43
+ }
44
+ function hasAgentStructuredOutput(agent) {
45
+ return Boolean(agent.output);
46
+ }
47
+ function agentExecutionMode(agent) {
48
+ return agent.executionMode ?? "chat";
49
+ }
50
+ function checkAgentPolicy(input) {
51
+ const {
52
+ agentId,
53
+ authContext,
54
+ toolName,
55
+ attachmentMediaTypes,
56
+ requestedExecutionMode,
57
+ mutationPolicyOverride
58
+ } = input;
59
+ const agent = getAgent(agentId);
60
+ if (!agent) {
61
+ return {
62
+ ok: false,
63
+ code: "agent_unknown",
64
+ message: `Agent "${agentId}" is not registered.`
65
+ };
66
+ }
67
+ const agentFeatures = agent.requiredFeatures ?? [];
68
+ if (!hasRequiredFeatures(agentFeatures, authContext.userFeatures, authContext.isSuperAdmin)) {
69
+ return {
70
+ ok: false,
71
+ code: "agent_features_denied",
72
+ message: `Access to agent "${agentId}" requires features: ${agentFeatures.join(", ")}`
73
+ };
74
+ }
75
+ let resolvedTool;
76
+ if (typeof toolName === "string") {
77
+ if (!agent.allowedTools.includes(toolName)) {
78
+ return {
79
+ ok: false,
80
+ code: "tool_not_whitelisted",
81
+ message: `Tool "${toolName}" is not whitelisted for agent "${agentId}".`
82
+ };
83
+ }
84
+ const toolRecord = toolRegistry.getTool(toolName);
85
+ if (!toolRecord) {
86
+ return {
87
+ ok: false,
88
+ code: "tool_unknown",
89
+ message: `Tool "${toolName}" is not registered in the tool registry.`
90
+ };
91
+ }
92
+ const toolFeatures = toolRecord.requiredFeatures ?? [];
93
+ if (!hasRequiredFeatures(toolFeatures, authContext.userFeatures, authContext.isSuperAdmin)) {
94
+ return {
95
+ ok: false,
96
+ code: "tool_features_denied",
97
+ message: `Access to tool "${toolName}" requires features: ${toolFeatures.join(", ")}`
98
+ };
99
+ }
100
+ if (toolRecord.isMutation === true) {
101
+ if (isAgentReadOnly(agent)) {
102
+ return {
103
+ ok: false,
104
+ code: "mutation_blocked_by_readonly",
105
+ message: `Mutation tool "${toolName}" cannot be executed by read-only agent "${agentId}".`
106
+ };
107
+ }
108
+ const effectivePolicy = resolvePolicyCheckMutationPolicy(agent, mutationPolicyOverride);
109
+ if (effectivePolicy === "read-only") {
110
+ return {
111
+ ok: false,
112
+ code: "mutation_blocked_by_policy",
113
+ message: `Mutation tool "${toolName}" is blocked by agent "${agentId}" mutationPolicy=read-only.`
114
+ };
115
+ }
116
+ }
117
+ resolvedTool = toolRecord;
118
+ }
119
+ if (requestedExecutionMode) {
120
+ const declaredMode = agentExecutionMode(agent);
121
+ if (requestedExecutionMode === "object") {
122
+ if (declaredMode !== "object" && !hasAgentStructuredOutput(agent)) {
123
+ return {
124
+ ok: false,
125
+ code: "execution_mode_not_supported",
126
+ message: `Agent "${agentId}" does not support execution mode "object" (no output schema declared).`
127
+ };
128
+ }
129
+ } else if (requestedExecutionMode === "chat") {
130
+ if (declaredMode === "object" && hasAgentStructuredOutput(agent)) {
131
+ return {
132
+ ok: false,
133
+ code: "execution_mode_not_supported",
134
+ message: `Agent "${agentId}" is declared as object-mode and cannot run via chat transport.`
135
+ };
136
+ }
137
+ }
138
+ }
139
+ if (Array.isArray(attachmentMediaTypes) && attachmentMediaTypes.length > 0) {
140
+ const accepted = agent.acceptedMediaTypes;
141
+ if (!accepted || accepted.length === 0) {
142
+ return {
143
+ ok: false,
144
+ code: "attachment_type_not_accepted",
145
+ message: `Agent "${agentId}" does not accept attachments.`
146
+ };
147
+ }
148
+ const acceptedSet = new Set(accepted);
149
+ for (const raw of attachmentMediaTypes) {
150
+ const kind = classifyMediaType(raw);
151
+ if (!acceptedSet.has(kind)) {
152
+ return {
153
+ ok: false,
154
+ code: "attachment_type_not_accepted",
155
+ message: `Agent "${agentId}" does not accept media type "${raw}" (classified as "${kind}").`
156
+ };
157
+ }
158
+ }
159
+ }
160
+ return { ok: true, agent, tool: resolvedTool };
161
+ }
162
+ export {
163
+ checkAgentPolicy,
164
+ isKnownMutationPolicy,
165
+ isMutationPolicyEscalation,
166
+ resolveEffectiveMutationPolicy
167
+ };
168
+ //# sourceMappingURL=agent-policy.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/ai_assistant/lib/agent-policy.ts"],
4
+ "sourcesContent": ["import { getAgent } from './agent-registry'\nimport { hasRequiredFeatures } from './auth'\nimport { toolRegistry } from './tool-registry'\nimport type {\n AiAgentAcceptedMediaType,\n AiAgentDefinition,\n AiAgentMutationPolicy,\n} from './ai-agent-definition'\nimport type { AiToolDefinition } from './types'\n\nexport type AgentPolicyDenyCode =\n | 'agent_unknown'\n | 'agent_features_denied'\n | 'tool_not_whitelisted'\n | 'tool_unknown'\n | 'tool_features_denied'\n | 'mutation_blocked_by_readonly'\n | 'mutation_blocked_by_policy'\n | 'execution_mode_not_supported'\n | 'attachment_type_not_accepted'\n\nexport type AgentPolicyDecision =\n | { ok: true; agent: AiAgentDefinition; tool?: AiToolDefinition }\n | { ok: false; code: AgentPolicyDenyCode; message: string }\n\nexport interface AgentPolicyAuthContext {\n userFeatures: string[]\n isSuperAdmin: boolean\n}\n\nexport interface AgentPolicyCheckInput {\n agentId: string\n authContext: AgentPolicyAuthContext\n toolName?: string\n attachmentMediaTypes?: string[]\n requestedExecutionMode?: 'chat' | 'object'\n /**\n * Optional tenant-scoped downgrade for the agent's code-declared\n * `mutationPolicy`. When supplied, the effective policy is the MOST\n * RESTRICTIVE of `{ code-declared, override }` \u2014 escalation is never\n * allowed through this channel (that is enforced at the route layer).\n * Callers that omit this field get the exact pre-Step-5.4 behavior.\n */\n mutationPolicyOverride?: AiAgentMutationPolicy | null\n}\n\n/**\n * Restrictiveness ranking of `AiAgentMutationPolicy` (most restrictive first).\n * `read-only` blocks all mutation tools. `destructive-confirm-required` forces\n * confirmation for every write (including non-destructive ones). `confirm-required`\n * is the least restrictive policy \u2014 writes go through a single confirmation.\n *\n * This ordering is load-bearing for both the runtime's effective-policy\n * computation AND the route-layer escalation guard. Changing the order is a\n * security-sensitive change.\n */\nconst POLICY_RESTRICTIVENESS: Record<AiAgentMutationPolicy, number> = {\n 'read-only': 0,\n 'destructive-confirm-required': 1,\n 'confirm-required': 2,\n}\n\nexport function isKnownMutationPolicy(value: unknown): value is AiAgentMutationPolicy {\n return (\n value === 'read-only' ||\n value === 'confirm-required' ||\n value === 'destructive-confirm-required'\n )\n}\n\n/**\n * Returns the effective mutation policy \u2014 the MOST RESTRICTIVE of\n * `{ codeDeclared, override }`. Missing override \u2192 `codeDeclared`. A corrupt\n * override value (unknown string from DB) is logged and falls back to\n * `codeDeclared` so the system fails SAFE when a schema drift leaks through.\n */\nexport function resolveEffectiveMutationPolicy(\n codeDeclared: AiAgentMutationPolicy | undefined,\n override: AiAgentMutationPolicy | null | undefined,\n agentId?: string,\n): AiAgentMutationPolicy {\n const base: AiAgentMutationPolicy =\n codeDeclared && isKnownMutationPolicy(codeDeclared) ? codeDeclared : 'read-only'\n if (override === undefined || override === null) return base\n if (!isKnownMutationPolicy(override)) {\n console.warn(\n `[AI Agents] Ignoring corrupt mutationPolicy override for agent \"${agentId ?? '<unknown>'}\": ${String(\n override,\n )}. Falling back to code-declared policy \"${base}\".`,\n )\n return base\n }\n const baseRank = POLICY_RESTRICTIVENESS[base]\n const overrideRank = POLICY_RESTRICTIVENESS[override]\n return overrideRank < baseRank ? override : base\n}\n\n/**\n * Returns `true` when `candidate` would WIDEN `codeDeclared` \u2014 i.e. would\n * grant the agent more mutation surface than its code declares. Used by the\n * mutation-policy override route to reject escalation attempts with 400.\n */\nexport function isMutationPolicyEscalation(\n codeDeclared: AiAgentMutationPolicy | undefined,\n candidate: AiAgentMutationPolicy,\n): boolean {\n const base: AiAgentMutationPolicy =\n codeDeclared && isKnownMutationPolicy(codeDeclared) ? codeDeclared : 'read-only'\n return POLICY_RESTRICTIVENESS[candidate] > POLICY_RESTRICTIVENESS[base]\n}\n\nfunction classifyMediaType(value: string): AiAgentAcceptedMediaType {\n const normalized = value.trim().toLowerCase()\n if (normalized.startsWith('image/')) return 'image'\n if (normalized === 'application/pdf') return 'pdf'\n return 'file'\n}\n\nfunction isAgentReadOnly(agent: AiAgentDefinition): boolean {\n if (typeof agent.readOnly === 'boolean') return agent.readOnly\n return true\n}\n\n/**\n * Returns the effective mutation policy for a policy-check invocation \u2014 the\n * most restrictive of `{ agent.mutationPolicy, input.mutationPolicyOverride }`.\n * Pure-lookup helper; no I/O. Callers that need to know the same value outside\n * of a policy check should use {@link resolveEffectiveMutationPolicy} directly.\n */\nfunction resolvePolicyCheckMutationPolicy(\n agent: AiAgentDefinition,\n override: AiAgentMutationPolicy | null | undefined,\n): AiAgentMutationPolicy {\n return resolveEffectiveMutationPolicy(agent.mutationPolicy, override, agent.id)\n}\n\nfunction hasAgentStructuredOutput(agent: AiAgentDefinition): boolean {\n return Boolean(agent.output)\n}\n\nfunction agentExecutionMode(agent: AiAgentDefinition): 'chat' | 'object' {\n return agent.executionMode ?? 'chat'\n}\n\nexport function checkAgentPolicy(input: AgentPolicyCheckInput): AgentPolicyDecision {\n const {\n agentId,\n authContext,\n toolName,\n attachmentMediaTypes,\n requestedExecutionMode,\n mutationPolicyOverride,\n } = input\n\n const agent = getAgent(agentId)\n if (!agent) {\n return {\n ok: false,\n code: 'agent_unknown',\n message: `Agent \"${agentId}\" is not registered.`,\n }\n }\n\n const agentFeatures = agent.requiredFeatures ?? []\n if (\n !hasRequiredFeatures(agentFeatures, authContext.userFeatures, authContext.isSuperAdmin)\n ) {\n return {\n ok: false,\n code: 'agent_features_denied',\n message: `Access to agent \"${agentId}\" requires features: ${agentFeatures.join(', ')}`,\n }\n }\n\n let resolvedTool: AiToolDefinition | undefined\n if (typeof toolName === 'string') {\n if (!agent.allowedTools.includes(toolName)) {\n return {\n ok: false,\n code: 'tool_not_whitelisted',\n message: `Tool \"${toolName}\" is not whitelisted for agent \"${agentId}\".`,\n }\n }\n\n const toolRecord = toolRegistry.getTool(toolName) as AiToolDefinition | undefined\n if (!toolRecord) {\n return {\n ok: false,\n code: 'tool_unknown',\n message: `Tool \"${toolName}\" is not registered in the tool registry.`,\n }\n }\n\n const toolFeatures = toolRecord.requiredFeatures ?? []\n if (\n !hasRequiredFeatures(toolFeatures, authContext.userFeatures, authContext.isSuperAdmin)\n ) {\n return {\n ok: false,\n code: 'tool_features_denied',\n message: `Access to tool \"${toolName}\" requires features: ${toolFeatures.join(', ')}`,\n }\n }\n\n if (toolRecord.isMutation === true) {\n if (isAgentReadOnly(agent)) {\n return {\n ok: false,\n code: 'mutation_blocked_by_readonly',\n message: `Mutation tool \"${toolName}\" cannot be executed by read-only agent \"${agentId}\".`,\n }\n }\n const effectivePolicy = resolvePolicyCheckMutationPolicy(agent, mutationPolicyOverride)\n if (effectivePolicy === 'read-only') {\n return {\n ok: false,\n code: 'mutation_blocked_by_policy',\n message: `Mutation tool \"${toolName}\" is blocked by agent \"${agentId}\" mutationPolicy=read-only.`,\n }\n }\n }\n\n resolvedTool = toolRecord\n }\n\n if (requestedExecutionMode) {\n const declaredMode = agentExecutionMode(agent)\n if (requestedExecutionMode === 'object') {\n if (declaredMode !== 'object' && !hasAgentStructuredOutput(agent)) {\n return {\n ok: false,\n code: 'execution_mode_not_supported',\n message: `Agent \"${agentId}\" does not support execution mode \"object\" (no output schema declared).`,\n }\n }\n } else if (requestedExecutionMode === 'chat') {\n if (declaredMode === 'object' && hasAgentStructuredOutput(agent)) {\n return {\n ok: false,\n code: 'execution_mode_not_supported',\n message: `Agent \"${agentId}\" is declared as object-mode and cannot run via chat transport.`,\n }\n }\n }\n }\n\n if (Array.isArray(attachmentMediaTypes) && attachmentMediaTypes.length > 0) {\n const accepted = agent.acceptedMediaTypes\n if (!accepted || accepted.length === 0) {\n return {\n ok: false,\n code: 'attachment_type_not_accepted',\n message: `Agent \"${agentId}\" does not accept attachments.`,\n }\n }\n const acceptedSet = new Set<AiAgentAcceptedMediaType>(accepted)\n for (const raw of attachmentMediaTypes) {\n const kind = classifyMediaType(raw)\n if (!acceptedSet.has(kind)) {\n return {\n ok: false,\n code: 'attachment_type_not_accepted',\n message: `Agent \"${agentId}\" does not accept media type \"${raw}\" (classified as \"${kind}\").`,\n }\n }\n }\n }\n\n return { ok: true, agent, tool: resolvedTool }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,195 @@
1
+ import {
2
+ applyAgentOverrideMap,
3
+ composeAgentExtensionEntries,
4
+ composeAgentOverrideMap
5
+ } from "./ai-overrides.js";
6
+ const agentsById = /* @__PURE__ */ new Map();
7
+ let loaded = false;
8
+ function isStringArray(value) {
9
+ return Array.isArray(value) && value.every((item) => typeof item === "string");
10
+ }
11
+ function isAiAgentSuggestion(value) {
12
+ if (!value || typeof value !== "object") return false;
13
+ const candidate = value;
14
+ return typeof candidate.label === "string" && typeof candidate.prompt === "string";
15
+ }
16
+ function isAiAgentExtension(value) {
17
+ if (!value || typeof value !== "object") return false;
18
+ const candidate = value;
19
+ return typeof candidate.targetAgentId === "string" && (!("replaceAllowedTools" in candidate) || isStringArray(candidate.replaceAllowedTools)) && (!("deleteAllowedTools" in candidate) || isStringArray(candidate.deleteAllowedTools)) && (!("appendAllowedTools" in candidate) || isStringArray(candidate.appendAllowedTools)) && (!("replaceSystemPrompt" in candidate) || typeof candidate.replaceSystemPrompt === "string") && (!("appendSystemPrompt" in candidate) || typeof candidate.appendSystemPrompt === "string") && (!("replaceSuggestions" in candidate) || Array.isArray(candidate.replaceSuggestions) && candidate.replaceSuggestions.every(isAiAgentSuggestion)) && (!("deleteSuggestions" in candidate) || isStringArray(candidate.deleteSuggestions)) && (!("appendSuggestions" in candidate) || Array.isArray(candidate.appendSuggestions) && candidate.appendSuggestions.every(isAiAgentSuggestion)) && (!("suggestions" in candidate) || Array.isArray(candidate.suggestions) && candidate.suggestions.every(isAiAgentSuggestion));
20
+ }
21
+ function isAiAgentDefinition(value) {
22
+ if (!value || typeof value !== "object") return false;
23
+ const candidate = value;
24
+ return typeof candidate.id === "string" && typeof candidate.moduleId === "string" && typeof candidate.label === "string" && typeof candidate.description === "string" && typeof candidate.systemPrompt === "string" && isStringArray(candidate.allowedTools);
25
+ }
26
+ function uniqueStrings(values) {
27
+ return Array.from(new Set(values.filter((value) => typeof value === "string" && value.length > 0)));
28
+ }
29
+ function applyStringListPatch(current, patch) {
30
+ const deleted = new Set(patch.delete ?? []);
31
+ return uniqueStrings([
32
+ ...(patch.replace ?? current).filter((value) => !deleted.has(value)),
33
+ ...patch.append ?? []
34
+ ]);
35
+ }
36
+ function suggestionDeleteKey(suggestion) {
37
+ return [suggestion.label, suggestion.prompt].filter((value) => value.length > 0);
38
+ }
39
+ function applySuggestionPatch(current, patch) {
40
+ const deleted = new Set(patch.delete ?? []);
41
+ const base = patch.replace ?? current;
42
+ const out = [];
43
+ const seen = /* @__PURE__ */ new Set();
44
+ for (const suggestion of base) {
45
+ if (suggestionDeleteKey(suggestion).some((key2) => deleted.has(key2))) continue;
46
+ const key = `${suggestion.label}
47
+ ${suggestion.prompt}`;
48
+ if (seen.has(key)) continue;
49
+ seen.add(key);
50
+ out.push(suggestion);
51
+ }
52
+ for (const suggestion of patch.append ?? []) {
53
+ const key = `${suggestion.label}
54
+ ${suggestion.prompt}`;
55
+ if (seen.has(key)) continue;
56
+ seen.add(key);
57
+ out.push(suggestion);
58
+ }
59
+ return out;
60
+ }
61
+ function populateFromAgents(agents) {
62
+ for (const candidate of agents) {
63
+ if (!isAiAgentDefinition(candidate)) {
64
+ console.warn("[AI Agents] Skipping malformed agent entry in ai-agents.generated.ts");
65
+ continue;
66
+ }
67
+ const existing = agentsById.get(candidate.id);
68
+ if (existing) {
69
+ throw new Error(
70
+ `[AI Agents] Duplicate agent id "${candidate.id}" \u2014 already registered by module "${existing.moduleId}", conflicts with module "${candidate.moduleId}". Export \`aiAgentOverrides\` from your module's \`ai-agents.ts\` (or set it on the modules.ts entry) to replace an agent across modules.`
71
+ );
72
+ }
73
+ agentsById.set(candidate.id, candidate);
74
+ }
75
+ }
76
+ async function loadOverrideEntries() {
77
+ try {
78
+ const mod = await import("@/.mercato/generated/ai-agents.generated");
79
+ return Array.isArray(mod.aiAgentOverrideEntries) ? mod.aiAgentOverrideEntries : [];
80
+ } catch {
81
+ return [];
82
+ }
83
+ }
84
+ function applyOverridesToRegistry(entries) {
85
+ const overrideMap = composeAgentOverrideMap(entries);
86
+ if (Object.keys(overrideMap).length === 0) return;
87
+ const overridden = applyAgentOverrideMap(Array.from(agentsById.values()), overrideMap);
88
+ agentsById.clear();
89
+ for (const agent of overridden) agentsById.set(agent.id, agent);
90
+ for (const [id, value] of Object.entries(overrideMap)) {
91
+ const verb = value === null ? "disabled" : "replaced";
92
+ console.info(`[AI Overrides] Agent "${id}" ${verb} by override.`);
93
+ }
94
+ }
95
+ async function loadExtensionEntries() {
96
+ try {
97
+ const mod = await import("@/.mercato/generated/ai-agents.generated");
98
+ const entries = Array.isArray(mod.aiAgentExtensionEntries) ? mod.aiAgentExtensionEntries : [];
99
+ return composeAgentExtensionEntries(entries).filter(isAiAgentExtension);
100
+ } catch {
101
+ return [];
102
+ }
103
+ }
104
+ function applyExtensionsToRegistry(extensions) {
105
+ if (extensions.length === 0) return;
106
+ for (const extension of extensions) {
107
+ const agent = agentsById.get(extension.targetAgentId);
108
+ if (!agent) {
109
+ console.warn(
110
+ `[AI Agents] Skipping extension for unknown agent "${extension.targetAgentId}".`
111
+ );
112
+ continue;
113
+ }
114
+ const replacementSystemPrompt = extension.replaceSystemPrompt?.trim();
115
+ const appendSystemPrompt = extension.appendSystemPrompt?.trim();
116
+ const systemPrompt = replacementSystemPrompt ?? agent.systemPrompt.trim();
117
+ agentsById.set(agent.id, {
118
+ ...agent,
119
+ allowedTools: applyStringListPatch(agent.allowedTools, {
120
+ replace: extension.replaceAllowedTools,
121
+ delete: extension.deleteAllowedTools,
122
+ append: extension.appendAllowedTools
123
+ }),
124
+ systemPrompt: appendSystemPrompt ? `${systemPrompt}
125
+
126
+ ${appendSystemPrompt}` : systemPrompt,
127
+ suggestions: applySuggestionPatch(agent.suggestions ?? [], {
128
+ replace: extension.replaceSuggestions,
129
+ delete: extension.deleteSuggestions,
130
+ append: [
131
+ ...extension.appendSuggestions ?? [],
132
+ ...extension.suggestions ?? []
133
+ ]
134
+ })
135
+ });
136
+ }
137
+ }
138
+ async function loadAgentRegistry() {
139
+ if (loaded) return;
140
+ try {
141
+ const mod = await import("@/.mercato/generated/ai-agents.generated");
142
+ const agents = Array.isArray(mod.allAiAgents) ? mod.allAiAgents : [];
143
+ populateFromAgents(agents);
144
+ } catch (error) {
145
+ console.error(
146
+ "[AI Agents] Could not load ai-agents.generated.ts (agent registry empty):",
147
+ error
148
+ );
149
+ } finally {
150
+ try {
151
+ const overrideEntries = await loadOverrideEntries();
152
+ applyOverridesToRegistry(overrideEntries);
153
+ const extensionEntries = await loadExtensionEntries();
154
+ applyExtensionsToRegistry(extensionEntries);
155
+ } catch (error) {
156
+ console.error("[AI Agents] Failed to apply agent overrides/extensions:", error);
157
+ }
158
+ loaded = true;
159
+ }
160
+ }
161
+ function getAgent(id) {
162
+ return agentsById.get(id);
163
+ }
164
+ function listAgents() {
165
+ return Array.from(agentsById.values()).sort((a, b) => a.id.localeCompare(b.id));
166
+ }
167
+ function listAgentsByModule(moduleId) {
168
+ return listAgents().filter((agent) => agent.moduleId === moduleId);
169
+ }
170
+ function resetAgentRegistryForTests() {
171
+ agentsById.clear();
172
+ loaded = false;
173
+ }
174
+ function seedAgentRegistryForTests(agents) {
175
+ agentsById.clear();
176
+ populateFromAgents(agents);
177
+ loaded = true;
178
+ }
179
+ function applyAgentOverrideEntriesForTests(entries) {
180
+ applyOverridesToRegistry(entries);
181
+ }
182
+ function applyAgentExtensionEntriesForTests(entries) {
183
+ applyExtensionsToRegistry(entries);
184
+ }
185
+ export {
186
+ applyAgentExtensionEntriesForTests,
187
+ applyAgentOverrideEntriesForTests,
188
+ getAgent,
189
+ listAgents,
190
+ listAgentsByModule,
191
+ loadAgentRegistry,
192
+ resetAgentRegistryForTests,
193
+ seedAgentRegistryForTests
194
+ };
195
+ //# sourceMappingURL=agent-registry.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/ai_assistant/lib/agent-registry.ts"],
4
+ "sourcesContent": ["import type { AiAgentDefinition, AiAgentExtension, AiAgentSuggestion } from './ai-agent-definition'\nimport {\n applyAgentOverrideMap,\n composeAgentExtensionEntries,\n composeAgentOverrideMap,\n type AiAgentExtensionConfigEntry,\n type AiAgentOverrideConfigEntry,\n} from './ai-overrides'\n\nconst agentsById = new Map<string, AiAgentDefinition>()\nlet loaded = false\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === 'string')\n}\n\nfunction isAiAgentSuggestion(value: unknown): value is AiAgentSuggestion {\n if (!value || typeof value !== 'object') return false\n const candidate = value as Record<string, unknown>\n return typeof candidate.label === 'string' && typeof candidate.prompt === 'string'\n}\n\nfunction isAiAgentExtension(value: unknown): value is AiAgentExtension {\n if (!value || typeof value !== 'object') return false\n const candidate = value as Record<string, unknown>\n return (\n typeof candidate.targetAgentId === 'string' &&\n (!('replaceAllowedTools' in candidate) || isStringArray(candidate.replaceAllowedTools)) &&\n (!('deleteAllowedTools' in candidate) || isStringArray(candidate.deleteAllowedTools)) &&\n (!('appendAllowedTools' in candidate) || isStringArray(candidate.appendAllowedTools)) &&\n (!('replaceSystemPrompt' in candidate) || typeof candidate.replaceSystemPrompt === 'string') &&\n (!('appendSystemPrompt' in candidate) || typeof candidate.appendSystemPrompt === 'string') &&\n (!('replaceSuggestions' in candidate) ||\n (Array.isArray(candidate.replaceSuggestions) && candidate.replaceSuggestions.every(isAiAgentSuggestion))) &&\n (!('deleteSuggestions' in candidate) || isStringArray(candidate.deleteSuggestions)) &&\n (!('appendSuggestions' in candidate) ||\n (Array.isArray(candidate.appendSuggestions) && candidate.appendSuggestions.every(isAiAgentSuggestion))) &&\n (!('suggestions' in candidate) ||\n (Array.isArray(candidate.suggestions) && candidate.suggestions.every(isAiAgentSuggestion)))\n )\n}\n\nfunction isAiAgentDefinition(value: unknown): value is AiAgentDefinition {\n if (!value || typeof value !== 'object') return false\n const candidate = value as Record<string, unknown>\n return (\n typeof candidate.id === 'string' &&\n typeof candidate.moduleId === 'string' &&\n typeof candidate.label === 'string' &&\n typeof candidate.description === 'string' &&\n typeof candidate.systemPrompt === 'string' &&\n isStringArray(candidate.allowedTools)\n )\n}\n\nfunction uniqueStrings(values: readonly string[]): string[] {\n return Array.from(new Set(values.filter((value) => typeof value === 'string' && value.length > 0)))\n}\n\nfunction applyStringListPatch(\n current: readonly string[],\n patch: {\n replace?: readonly string[]\n delete?: readonly string[]\n append?: readonly string[]\n },\n): string[] {\n const deleted = new Set(patch.delete ?? [])\n return uniqueStrings([\n ...(patch.replace ?? current).filter((value) => !deleted.has(value)),\n ...(patch.append ?? []),\n ])\n}\n\nfunction suggestionDeleteKey(suggestion: AiAgentSuggestion): string[] {\n return [suggestion.label, suggestion.prompt].filter((value) => value.length > 0)\n}\n\nfunction applySuggestionPatch(\n current: readonly AiAgentSuggestion[],\n patch: {\n replace?: readonly AiAgentSuggestion[]\n delete?: readonly string[]\n append?: readonly AiAgentSuggestion[]\n },\n): AiAgentSuggestion[] {\n const deleted = new Set(patch.delete ?? [])\n const base = patch.replace ?? current\n const out: AiAgentSuggestion[] = []\n const seen = new Set<string>()\n for (const suggestion of base) {\n if (suggestionDeleteKey(suggestion).some((key) => deleted.has(key))) continue\n const key = `${suggestion.label}\\n${suggestion.prompt}`\n if (seen.has(key)) continue\n seen.add(key)\n out.push(suggestion)\n }\n for (const suggestion of patch.append ?? []) {\n const key = `${suggestion.label}\\n${suggestion.prompt}`\n if (seen.has(key)) continue\n seen.add(key)\n out.push(suggestion)\n }\n return out\n}\n\nfunction populateFromAgents(agents: unknown[]): void {\n for (const candidate of agents) {\n if (!isAiAgentDefinition(candidate)) {\n console.warn('[AI Agents] Skipping malformed agent entry in ai-agents.generated.ts')\n continue\n }\n const existing = agentsById.get(candidate.id)\n if (existing) {\n throw new Error(\n `[AI Agents] Duplicate agent id \"${candidate.id}\" \u2014 already registered by module \"${existing.moduleId}\", conflicts with module \"${candidate.moduleId}\". Export \\`aiAgentOverrides\\` from your module's \\`ai-agents.ts\\` (or set it on the modules.ts entry) to replace an agent across modules.`\n )\n }\n agentsById.set(candidate.id, candidate)\n }\n}\n\nasync function loadOverrideEntries(): Promise<AiAgentOverrideConfigEntry[]> {\n try {\n const mod = (await import(\n '@/.mercato/generated/ai-agents.generated'\n )) as { aiAgentOverrideEntries?: unknown[] }\n return Array.isArray(mod.aiAgentOverrideEntries)\n ? (mod.aiAgentOverrideEntries as AiAgentOverrideConfigEntry[])\n : []\n } catch {\n // No generated file yet \u2014 pre-generate builds and tests fall through.\n return []\n }\n}\n\nfunction applyOverridesToRegistry(entries: readonly AiAgentOverrideConfigEntry[]): void {\n const overrideMap = composeAgentOverrideMap(entries)\n if (Object.keys(overrideMap).length === 0) return\n const overridden = applyAgentOverrideMap(Array.from(agentsById.values()), overrideMap)\n agentsById.clear()\n for (const agent of overridden) agentsById.set(agent.id, agent)\n for (const [id, value] of Object.entries(overrideMap)) {\n const verb = value === null ? 'disabled' : 'replaced'\n console.info(`[AI Overrides] Agent \"${id}\" ${verb} by override.`)\n }\n}\n\nasync function loadExtensionEntries(): Promise<AiAgentExtension[]> {\n try {\n const mod = (await import(\n '@/.mercato/generated/ai-agents.generated'\n )) as { aiAgentExtensionEntries?: unknown[] }\n const entries = Array.isArray(mod.aiAgentExtensionEntries)\n ? (mod.aiAgentExtensionEntries as AiAgentExtensionConfigEntry[])\n : []\n return composeAgentExtensionEntries(entries).filter(isAiAgentExtension)\n } catch {\n return []\n }\n}\n\nfunction applyExtensionsToRegistry(extensions: readonly AiAgentExtension[]): void {\n if (extensions.length === 0) return\n for (const extension of extensions) {\n const agent = agentsById.get(extension.targetAgentId)\n if (!agent) {\n console.warn(\n `[AI Agents] Skipping extension for unknown agent \"${extension.targetAgentId}\".`,\n )\n continue\n }\n\n const replacementSystemPrompt = extension.replaceSystemPrompt?.trim()\n const appendSystemPrompt = extension.appendSystemPrompt?.trim()\n const systemPrompt = replacementSystemPrompt ?? agent.systemPrompt.trim()\n agentsById.set(agent.id, {\n ...agent,\n allowedTools: applyStringListPatch(agent.allowedTools, {\n replace: extension.replaceAllowedTools,\n delete: extension.deleteAllowedTools,\n append: extension.appendAllowedTools,\n }),\n systemPrompt: appendSystemPrompt\n ? `${systemPrompt}\\n\\n${appendSystemPrompt}`\n : systemPrompt,\n suggestions: applySuggestionPatch(agent.suggestions ?? [], {\n replace: extension.replaceSuggestions,\n delete: extension.deleteSuggestions,\n append: [\n ...(extension.appendSuggestions ?? []),\n ...(extension.suggestions ?? []),\n ],\n }),\n })\n }\n}\n\nexport async function loadAgentRegistry(): Promise<void> {\n if (loaded) return\n try {\n const mod = (await import(\n '@/.mercato/generated/ai-agents.generated'\n )) as { allAiAgents?: unknown[] }\n const agents = Array.isArray(mod.allAiAgents) ? mod.allAiAgents : []\n populateFromAgents(agents)\n } catch (error) {\n console.error(\n '[AI Agents] Could not load ai-agents.generated.ts (agent registry empty):',\n error\n )\n } finally {\n try {\n const overrideEntries = await loadOverrideEntries()\n applyOverridesToRegistry(overrideEntries)\n const extensionEntries = await loadExtensionEntries()\n applyExtensionsToRegistry(extensionEntries)\n } catch (error) {\n console.error('[AI Agents] Failed to apply agent overrides/extensions:', error)\n }\n loaded = true\n }\n}\n\nexport function getAgent(id: string): AiAgentDefinition | undefined {\n return agentsById.get(id)\n}\n\nexport function listAgents(): AiAgentDefinition[] {\n return Array.from(agentsById.values()).sort((a, b) => a.id.localeCompare(b.id))\n}\n\nexport function listAgentsByModule(moduleId: string): AiAgentDefinition[] {\n return listAgents().filter((agent) => agent.moduleId === moduleId)\n}\n\n/**\n * @__internal\n * Test-only hook \u2014 clears the cached registry so `loadAgentRegistry` re-evaluates its source.\n */\nexport function resetAgentRegistryForTests(): void {\n agentsById.clear()\n loaded = false\n}\n\n/**\n * @__internal\n * Test-only hook \u2014 seeds the registry directly from a fixture array without going through\n * the dynamic generated-file import. Used by the registry's own unit tests.\n */\nexport function seedAgentRegistryForTests(agents: unknown[]): void {\n agentsById.clear()\n populateFromAgents(agents)\n loaded = true\n}\n\n/**\n * @__internal\n * Test-only hook \u2014 apply override entries against the seeded registry to\n * exercise the override pipeline without round-tripping through the\n * generated file.\n */\nexport function applyAgentOverrideEntriesForTests(\n entries: readonly AiAgentOverrideConfigEntry[],\n): void {\n applyOverridesToRegistry(entries)\n}\n\n/**\n * @__internal Test-only hook \u2014 apply additive extension entries against the\n * seeded registry without round-tripping through the generated file.\n */\nexport function applyAgentExtensionEntriesForTests(\n entries: readonly AiAgentExtension[],\n): void {\n applyExtensionsToRegistry(entries)\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["key"]
7
+ }