@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,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/ai_assistant/backend/config/ai-assistant/agents/AiAgentSettingsPageClient.tsx"],
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport {\n AlertCircle,\n Bot,\n BookOpen,\n CheckCircle2,\n History,\n Image as ImageIcon,\n FileText,\n Loader2,\n Lock,\n Paperclip,\n RefreshCcw,\n Save,\n ShieldAlert,\n Trash2,\n Wand2,\n Wrench,\n} from 'lucide-react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Alert, AlertDescription, AlertTitle } from '@open-mercato/ui/primitives/alert'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { IconButton } from '@open-mercato/ui/primitives/icon-button'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { StatusBadge, type StatusMap } from '@open-mercato/ui/primitives/status-badge'\nimport { Switch } from '@open-mercato/ui/primitives/switch'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@open-mercato/ui/primitives/tooltip'\nimport { EmptyState } from '@open-mercato/ui/backend/EmptyState'\nimport { apiCall, apiCallOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { useAiShortcuts } from '@open-mercato/ui/ai'\n\n// Step 4.6: the <select>-based agent picker is deliberately duplicated between the\n// playground and this settings page. Duplicated markup is under the 50-line\n// threshold, so extraction stays deferred per the Step 4.6 brief.\n\ntype AgentTool = {\n name: string\n displayName: string\n isMutation: boolean\n registered: boolean\n}\n\ntype AgentSettings = {\n id: string\n moduleId: string\n label: string\n description: string\n systemPrompt: string\n executionMode: 'chat' | 'object'\n mutationPolicy: string\n readOnly: boolean\n maxSteps: number | null\n allowedTools: string[]\n tools: AgentTool[]\n requiredFeatures: string[]\n acceptedMediaTypes: string[]\n hasOutputSchema: boolean\n}\n\ntype AgentsResponse = {\n agents: AgentSettings[]\n total: number\n}\n\nconst PROMPT_SECTION_IDS = [\n 'role',\n 'scope',\n 'data',\n 'tools',\n 'attachments',\n 'mutationPolicy',\n 'responseStyle',\n 'overrides',\n] as const\n\ntype PromptSectionId = (typeof PROMPT_SECTION_IDS)[number]\n\nconst mutationPolicyStatusMap: StatusMap<string> = {\n 'read-only': 'neutral',\n 'confirm-required': 'warning',\n 'destructive-confirm-required': 'error',\n}\n\nconst executionModeStatusMap: StatusMap<'chat' | 'object'> = {\n chat: 'info',\n object: 'success',\n}\n\nconst mediaTypeIconMap: Record<string, React.ElementType> = {\n image: ImageIcon,\n pdf: FileText,\n file: Paperclip,\n}\n\nasync function fetchAgents(): Promise<AgentsResponse> {\n const { result, status } = await apiCallOrThrow<AgentsResponse>(\n '/api/ai_assistant/ai/agents',\n { method: 'GET', credentials: 'include' },\n { errorMessage: 'Failed to load agents' },\n )\n if (!result) throw new Error(`Failed to load agents (${status})`)\n return result\n}\n\ntype OverrideVersion = {\n id: string\n agentId: string\n version: number\n sections: Record<string, string>\n notes: string | null\n createdByUserId: string | null\n createdAt: string\n updatedAt: string\n}\n\ntype OverrideResponse = {\n agentId: string\n override: OverrideVersion | null\n versions: OverrideVersion[]\n}\n\nasync function fetchOverride(agentId: string): Promise<OverrideResponse> {\n const { result, status } = await apiCallOrThrow<OverrideResponse>(\n `/api/ai_assistant/ai/agents/${encodeURIComponent(agentId)}/prompt-override`,\n { method: 'GET', credentials: 'include' },\n { errorMessage: 'Failed to load prompt override' },\n )\n if (!result) throw new Error(`Failed to load prompt override (${status})`)\n return result\n}\n\ntype MutationPolicy = 'read-only' | 'confirm-required' | 'destructive-confirm-required'\n\nconst MUTATION_POLICY_OPTIONS: MutationPolicy[] = [\n 'read-only',\n 'destructive-confirm-required',\n 'confirm-required',\n]\n\n// Higher number = less restrictive. Mirrors\n// `lib/agent-policy.ts#POLICY_RESTRICTIVENESS` \u2014 UI must match the server's\n// escalation guard so disabled options line up with 400 responses.\nconst POLICY_RESTRICTIVENESS_UI: Record<MutationPolicy, number> = {\n 'read-only': 0,\n 'destructive-confirm-required': 1,\n 'confirm-required': 2,\n}\n\ntype MutationPolicyOverrideRow = {\n id: string\n agentId: string\n mutationPolicy: MutationPolicy\n notes: string | null\n createdByUserId: string | null\n createdAt: string\n updatedAt: string\n}\n\ntype MutationPolicyResponse = {\n agentId: string\n codeDeclared: MutationPolicy\n override: MutationPolicyOverrideRow | null\n}\n\nasync function fetchMutationPolicy(agentId: string): Promise<MutationPolicyResponse> {\n const { result, status } = await apiCallOrThrow<MutationPolicyResponse>(\n `/api/ai_assistant/ai/agents/${encodeURIComponent(agentId)}/mutation-policy`,\n { method: 'GET', credentials: 'include' },\n { errorMessage: 'Failed to load mutation policy' },\n )\n if (!result) throw new Error(`Failed to load mutation policy (${status})`)\n return result\n}\n\nfunction SettingsLoading({ message }: { message: string }) {\n return (\n <div\n className=\"flex items-center gap-2 rounded-lg border border-border bg-background p-4 text-sm text-muted-foreground\"\n role=\"status\"\n >\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n <span>{message}</span>\n </div>\n )\n}\n\nfunction EmptyAgents() {\n const t = useT()\n return (\n <EmptyState\n icon={<Bot className=\"size-6\" aria-hidden />}\n title={t(\n 'ai_assistant.agents.empty.title',\n 'No AI agents are registered for your role yet.',\n )}\n description={t(\n 'ai_assistant.agents.empty.description',\n 'Declare agents inside `packages/<module>/src/modules/<module>/ai-agents.ts`, run `yarn generate`, and ensure the caller holds the agent\\'s required features.',\n )}\n >\n <div className=\"mt-2 inline-flex items-center gap-2 text-xs text-muted-foreground\">\n <BookOpen className=\"size-3\" aria-hidden />\n <span>\n {t(\n 'ai_assistant.agents.empty.docLabel',\n 'See packages/ai-assistant/AGENTS.md for the agent definition reference.',\n )}\n </span>\n </div>\n </EmptyState>\n )\n}\n\nfunction PromptSectionEditor({\n sectionId,\n defaultText,\n overrideText,\n override,\n onToggleOverride,\n onOverrideChange,\n onSaveShortcut,\n}: {\n sectionId: PromptSectionId\n defaultText: string\n overrideText: string\n override: boolean\n onToggleOverride: (next: boolean) => void\n onOverrideChange: (next: string) => void\n onSaveShortcut: () => void\n}) {\n const t = useT()\n const sectionLabel = t(\n `ai_assistant.agents.prompt.sections.${sectionId}`,\n sectionId.charAt(0).toUpperCase() + sectionId.slice(1),\n )\n const textareaId = `ai-agent-prompt-${sectionId}`\n\n const textareaRef = React.useRef<HTMLTextAreaElement | null>(null)\n const { handleKeyDown } = useAiShortcuts({\n onSubmit: onSaveShortcut,\n onCancel: () => {\n textareaRef.current?.blur()\n },\n })\n\n return (\n <div\n className=\"flex flex-col gap-2 rounded-md border border-border bg-muted/20 p-3\"\n data-ai-agent-prompt-section={sectionId}\n >\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex flex-col\">\n <span className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {sectionLabel}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {override\n ? t(\n 'ai_assistant.agents.prompt.overrideModeLabel',\n 'Override mode \u2014 replaces the default when persistence lands.',\n )\n : t(\n 'ai_assistant.agents.prompt.defaultModeLabel',\n 'Default \u2014 shipped with the agent definition.',\n )}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <Label htmlFor={`${textareaId}-toggle`} className=\"text-xs\">\n {t('ai_assistant.agents.prompt.toggleOverride', 'Override')}\n </Label>\n <Switch\n id={`${textareaId}-toggle`}\n checked={override}\n onCheckedChange={(next: boolean) => onToggleOverride(next)}\n aria-label={t('ai_assistant.agents.prompt.toggleOverride', 'Override')}\n data-ai-agent-prompt-toggle={sectionId}\n />\n </div>\n </div>\n {override ? (\n <Textarea\n id={textareaId}\n ref={textareaRef}\n rows={4}\n value={overrideText}\n onChange={(event) => onOverrideChange(event.target.value)}\n onKeyDown={handleKeyDown}\n className=\"resize-y font-mono text-xs\"\n placeholder={t(\n 'ai_assistant.agents.prompt.overridePlaceholder',\n 'Write the replacement text for this section...',\n )}\n aria-label={`${sectionLabel} override`}\n data-ai-agent-prompt-override={sectionId}\n />\n ) : (\n <pre\n className=\"max-h-40 overflow-auto rounded border border-border bg-background p-2 text-xs font-mono whitespace-pre-wrap\"\n data-ai-agent-prompt-default={sectionId}\n >\n {defaultText}\n </pre>\n )}\n </div>\n )\n}\n\nfunction ToolRow({ tool }: { tool: AgentTool }) {\n const t = useT()\n return (\n <div\n className=\"flex items-center justify-between gap-3 rounded-md border border-border bg-background px-3 py-2\"\n data-ai-agent-tool-row={tool.name}\n >\n <div className=\"flex items-start gap-2 min-w-0\">\n <Wrench className=\"mt-0.5 size-4 text-muted-foreground\" aria-hidden />\n <div className=\"flex flex-col min-w-0\">\n <span className=\"truncate text-sm font-medium\">{tool.displayName}</span>\n <span className=\"truncate text-xs font-mono text-muted-foreground\">{tool.name}</span>\n </div>\n </div>\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n {tool.isMutation ? (\n <StatusBadge variant=\"warning\" dot>\n {t('ai_assistant.agents.tools.mutationBadge', 'Mutation')}\n </StatusBadge>\n ) : (\n <StatusBadge variant=\"neutral\" dot>\n {t('ai_assistant.agents.tools.readBadge', 'Read')}\n </StatusBadge>\n )}\n {!tool.registered ? (\n <StatusBadge variant=\"error\" dot>\n {t('ai_assistant.agents.tools.missingBadge', 'Missing')}\n </StatusBadge>\n ) : null}\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"inline-flex items-center gap-1\">\n <Label\n htmlFor={`ai-agent-tool-${tool.name}`}\n className=\"text-xs text-muted-foreground\"\n >\n {t('ai_assistant.agents.tools.enabledLabel', 'Enabled')}\n </Label>\n <Switch\n id={`ai-agent-tool-${tool.name}`}\n checked\n disabled\n aria-label={t('ai_assistant.agents.tools.enabledLabel', 'Enabled')}\n data-ai-agent-tool-switch={tool.name}\n />\n </span>\n </TooltipTrigger>\n <TooltipContent>\n {t(\n 'ai_assistant.agents.tools.tooltipDisabled',\n 'Editable after Phase 3 lands mutation policy controls.',\n )}\n </TooltipContent>\n </Tooltip>\n </div>\n </div>\n )\n}\n\nfunction AttachmentPolicyBadges({ mediaTypes }: { mediaTypes: string[] }) {\n const t = useT()\n if (!mediaTypes.length) {\n return (\n <Badge variant=\"neutral\">\n {t('ai_assistant.agents.attachments.noneBadge', 'No attachments accepted')}\n </Badge>\n )\n }\n return (\n <div className=\"flex flex-wrap items-center gap-2\">\n {mediaTypes.map((mediaType) => {\n const Icon = mediaTypeIconMap[mediaType] ?? Paperclip\n return (\n <Badge\n key={mediaType}\n variant=\"info\"\n className=\"gap-1.5\"\n data-ai-agent-attachment-badge={mediaType}\n >\n <Icon className=\"size-3\" aria-hidden />\n <span className=\"font-mono text-xs\">{mediaType}</span>\n </Badge>\n )\n })}\n </div>\n )\n}\n\nfunction MutationPolicySection({ agent }: { agent: AgentSettings }) {\n const t = useT()\n const queryClient = useQueryClient()\n\n const query = useQuery<MutationPolicyResponse>({\n queryKey: ['ai_assistant', 'agent_settings', 'mutation_policy', agent.id],\n queryFn: () => fetchMutationPolicy(agent.id),\n retry: false,\n })\n\n const codeDeclared = (query.data?.codeDeclared ?? (agent.mutationPolicy as MutationPolicy))\n const currentOverride = query.data?.override ?? null\n\n const [selected, setSelected] = React.useState<MutationPolicy | null>(null)\n const [isSaving, setIsSaving] = React.useState(false)\n const [isClearing, setIsClearing] = React.useState(false)\n const [state, setState] = React.useState<\n | { kind: 'idle' }\n | { kind: 'success'; message: string }\n | { kind: 'error'; message: string }\n >({ kind: 'idle' })\n\n React.useEffect(() => {\n setSelected(currentOverride?.mutationPolicy ?? null)\n setState({ kind: 'idle' })\n }, [agent.id, currentOverride?.mutationPolicy])\n\n const codeRank = POLICY_RESTRICTIVENESS_UI[codeDeclared] ?? 0\n const effectivePolicy: MutationPolicy = (() => {\n if (!currentOverride) return codeDeclared\n const overrideRank = POLICY_RESTRICTIVENESS_UI[currentOverride.mutationPolicy]\n return overrideRank < codeRank ? currentOverride.mutationPolicy : codeDeclared\n })()\n\n const hasChange = selected !== null && selected !== (currentOverride?.mutationPolicy ?? null)\n\n const save = React.useCallback(async () => {\n if (!selected || isSaving) return\n setIsSaving(true)\n setState({ kind: 'idle' })\n try {\n const { ok, status, result } = await apiCall<{\n ok?: boolean\n error?: string\n code?: string\n codeDeclared?: MutationPolicy\n requested?: MutationPolicy\n }>(\n `/api/ai_assistant/ai/agents/${encodeURIComponent(agent.id)}/mutation-policy`,\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({ mutationPolicy: selected }),\n },\n )\n const payload = result ?? {}\n if (!ok) {\n const message =\n payload.code === 'escalation_not_allowed'\n ? (payload.error ??\n t(\n 'ai_assistant.agents.mutation_policy.errors.escalationNotAllowed',\n 'Cannot upgrade beyond the agent\\'s declared policy \u2014 this is a code-level change.',\n ))\n : (payload.error ??\n `Failed to save mutation policy (${status}).`)\n setState({ kind: 'error', message })\n return\n }\n setState({\n kind: 'success',\n message: t(\n 'ai_assistant.agents.mutation_policy.savedMessage',\n 'Mutation policy override saved.',\n ),\n })\n await queryClient.invalidateQueries({\n queryKey: ['ai_assistant', 'agent_settings', 'mutation_policy', agent.id],\n })\n } catch (err) {\n setState({\n kind: 'error',\n message: err instanceof Error ? err.message : String(err),\n })\n } finally {\n setIsSaving(false)\n }\n }, [agent.id, isSaving, queryClient, selected, t])\n\n const clear = React.useCallback(async () => {\n if (isClearing) return\n setIsClearing(true)\n setState({ kind: 'idle' })\n try {\n const { ok, status, result } = await apiCall<{\n ok?: boolean\n error?: string\n }>(\n `/api/ai_assistant/ai/agents/${encodeURIComponent(agent.id)}/mutation-policy`,\n {\n method: 'DELETE',\n credentials: 'include',\n },\n )\n const payload = result ?? {}\n if (!ok) {\n setState({\n kind: 'error',\n message: payload.error ?? `Failed to clear override (${status}).`,\n })\n return\n }\n setState({\n kind: 'success',\n message: t(\n 'ai_assistant.agents.mutation_policy.clearedMessage',\n 'Mutation policy override cleared; agent is using its code-declared policy.',\n ),\n })\n await queryClient.invalidateQueries({\n queryKey: ['ai_assistant', 'agent_settings', 'mutation_policy', agent.id],\n })\n } catch (err) {\n setState({\n kind: 'error',\n message: err instanceof Error ? err.message : String(err),\n })\n } finally {\n setIsClearing(false)\n }\n }, [agent.id, isClearing, queryClient, t])\n\n return (\n <section\n className=\"rounded-lg border border-border bg-background p-4\"\n data-ai-agent-mutation-policy={agent.id}\n >\n <header className=\"flex items-center justify-between gap-3 border-b border-border pb-3\">\n <div className=\"flex items-center gap-2\">\n <ShieldAlert className=\"size-4 text-muted-foreground\" aria-hidden />\n <div>\n <h3 className=\"text-sm font-semibold\">\n {t('ai_assistant.agents.mutation_policy.title', 'Mutation policy')}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.mutation_policy.subtitle',\n 'Downgrade this agent\\'s mutation capability per tenant. Upgrading beyond the code-declared policy is blocked by the server.',\n )}\n </p>\n </div>\n </div>\n <StatusBadge\n variant={mutationPolicyStatusMap[effectivePolicy] ?? 'neutral'}\n dot\n data-ai-agent-mutation-policy-effective\n >\n {effectivePolicy}\n </StatusBadge>\n </header>\n\n <div className=\"mt-3 flex flex-col gap-3\">\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <div>\n <span className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.mutation_policy.codeDeclared', 'Code-declared')}\n </span>\n <div className=\"mt-1 flex items-center gap-2\">\n <StatusBadge\n variant={mutationPolicyStatusMap[codeDeclared] ?? 'neutral'}\n dot\n data-ai-agent-mutation-policy-code-declared\n >\n {codeDeclared}\n </StatusBadge>\n <Lock className=\"size-3 text-muted-foreground\" aria-hidden />\n <span className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.mutation_policy.codeDeclaredHint',\n 'Compiled into the agent definition.',\n )}\n </span>\n </div>\n </div>\n <div>\n <span className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.mutation_policy.tenantOverride', 'Tenant override')}\n </span>\n <div className=\"mt-1\">\n {currentOverride ? (\n <StatusBadge\n variant={mutationPolicyStatusMap[currentOverride.mutationPolicy] ?? 'neutral'}\n dot\n data-ai-agent-mutation-policy-override-current\n >\n {currentOverride.mutationPolicy}\n </StatusBadge>\n ) : (\n <span\n className=\"text-xs text-muted-foreground\"\n data-ai-agent-mutation-policy-override-empty\n >\n {t(\n 'ai_assistant.agents.mutation_policy.noOverride',\n 'No override \u2014 using code-declared policy.',\n )}\n </span>\n )}\n </div>\n </div>\n </div>\n\n <Alert variant=\"info\" data-ai-agent-mutation-policy-notice>\n <ShieldAlert className=\"size-4\" aria-hidden />\n <AlertTitle>\n {t(\n 'ai_assistant.agents.mutation_policy.noticeTitle',\n 'Downgrade only \u2014 escalation is a code change',\n )}\n </AlertTitle>\n <AlertDescription>\n {t(\n 'ai_assistant.agents.mutation_policy.noticeBody',\n 'Overrides can only make the policy more restrictive. Options more permissive than the code-declared policy are disabled and rejected server-side.',\n )}\n </AlertDescription>\n </Alert>\n\n {query.isLoading ? (\n <SettingsLoading\n message={t(\n 'ai_assistant.agents.mutation_policy.loading',\n 'Loading mutation policy...',\n )}\n />\n ) : query.isError ? (\n <Alert variant=\"destructive\" data-ai-agent-mutation-policy-load-error>\n <AlertCircle className=\"size-4\" aria-hidden />\n <AlertTitle>\n {t(\n 'ai_assistant.agents.mutation_policy.loadErrorTitle',\n 'Failed to load mutation policy',\n )}\n </AlertTitle>\n <AlertDescription>\n {query.error instanceof Error ? query.error.message : String(query.error)}\n </AlertDescription>\n </Alert>\n ) : (\n <div\n className=\"flex flex-col gap-2\"\n role=\"radiogroup\"\n aria-label={t(\n 'ai_assistant.agents.mutation_policy.pickerLabel',\n 'Mutation policy override',\n )}\n data-ai-agent-mutation-policy-picker\n >\n {MUTATION_POLICY_OPTIONS.map((option) => {\n const optionRank = POLICY_RESTRICTIVENESS_UI[option]\n const wouldEscalate = optionRank > codeRank\n const isSelected = selected === option\n return (\n <Tooltip key={option}>\n <TooltipTrigger asChild>\n <label\n className={`flex items-start gap-3 rounded-md border px-3 py-2 text-sm cursor-pointer transition-colors ${\n wouldEscalate\n ? 'border-border bg-muted/30 cursor-not-allowed opacity-60'\n : isSelected\n ? 'border-primary bg-primary/5'\n : 'border-border bg-background hover:bg-muted/40'\n }`}\n data-ai-agent-mutation-policy-option={option}\n data-ai-agent-mutation-policy-option-disabled={wouldEscalate ? 'true' : 'false'}\n >\n <input\n type=\"radio\"\n name={`mutation-policy-${agent.id}`}\n value={option}\n checked={isSelected}\n disabled={wouldEscalate}\n onChange={() => {\n if (wouldEscalate) return\n setSelected(option)\n }}\n className=\"mt-0.5\"\n aria-disabled={wouldEscalate}\n />\n <div className=\"flex flex-col gap-0.5 min-w-0\">\n <span className=\"flex items-center gap-2\">\n <StatusBadge\n variant={mutationPolicyStatusMap[option] ?? 'neutral'}\n dot\n >\n {option}\n </StatusBadge>\n {wouldEscalate ? (\n <Lock className=\"size-3 text-muted-foreground\" aria-hidden />\n ) : null}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {t(\n `ai_assistant.agents.mutation_policy.options.${option}`,\n option,\n )}\n </span>\n </div>\n </label>\n </TooltipTrigger>\n {wouldEscalate ? (\n <TooltipContent>\n {t(\n 'ai_assistant.agents.mutation_policy.escalationTooltip',\n \"Cannot be set above the agent's declared policy \u2014 this is a code-level change.\",\n )}\n </TooltipContent>\n ) : null}\n </Tooltip>\n )\n })}\n </div>\n )}\n\n {state.kind === 'success' ? (\n <Alert variant=\"success\" data-ai-agent-mutation-policy-state=\"success\">\n <CheckCircle2 className=\"size-4\" aria-hidden />\n <AlertTitle>\n {t('ai_assistant.agents.mutation_policy.savedTitle', 'Mutation policy updated')}\n </AlertTitle>\n <AlertDescription>{state.message}</AlertDescription>\n </Alert>\n ) : null}\n {state.kind === 'error' ? (\n <Alert variant=\"destructive\" data-ai-agent-mutation-policy-state=\"error\">\n <AlertCircle className=\"size-4\" aria-hidden />\n <AlertTitle>\n {t(\n 'ai_assistant.agents.mutation_policy.errorTitle',\n 'Failed to update mutation policy',\n )}\n </AlertTitle>\n <AlertDescription>{state.message}</AlertDescription>\n </Alert>\n ) : null}\n\n <div className=\"flex items-center justify-end gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => void clear()}\n disabled={isClearing || isSaving || !currentOverride}\n data-ai-agent-mutation-policy-clear\n >\n {isClearing ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Trash2 className=\"size-4\" aria-hidden />\n )}\n <span>{t('ai_assistant.agents.mutation_policy.clear', 'Clear override')}</span>\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void save()}\n disabled={isSaving || isClearing || !hasChange || selected === null}\n data-ai-agent-mutation-policy-save\n >\n {isSaving ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Save className=\"size-4\" aria-hidden />\n )}\n <span>{t('ai_assistant.agents.mutation_policy.save', 'Save override')}</span>\n </Button>\n </div>\n </div>\n </section>\n )\n}\n\nfunction AgentDetailPanel({ agent }: { agent: AgentSettings }) {\n const t = useT()\n const queryClient = useQueryClient()\n const [overrideFlags, setOverrideFlags] = React.useState<Record<PromptSectionId, boolean>>(() => ({\n role: false,\n scope: false,\n data: false,\n tools: false,\n attachments: false,\n mutationPolicy: false,\n responseStyle: false,\n overrides: false,\n }))\n const [overrideDrafts, setOverrideDrafts] = React.useState<Record<PromptSectionId, string>>(() => ({\n role: '',\n scope: '',\n data: '',\n tools: '',\n attachments: '',\n mutationPolicy: '',\n responseStyle: '',\n overrides: '',\n }))\n const [isSaving, setIsSaving] = React.useState(false)\n const [saveState, setSaveState] = React.useState<\n | { kind: 'idle' }\n | { kind: 'success'; message: string; version: number }\n | { kind: 'error'; message: string }\n >({ kind: 'idle' })\n\n const overrideQuery = useQuery<OverrideResponse>({\n queryKey: ['ai_assistant', 'agent_settings', 'override', agent.id],\n queryFn: () => fetchOverride(agent.id),\n retry: false,\n })\n\n // Reset override state whenever the selected agent changes.\n React.useEffect(() => {\n setOverrideFlags({\n role: false,\n scope: false,\n data: false,\n tools: false,\n attachments: false,\n mutationPolicy: false,\n responseStyle: false,\n overrides: false,\n })\n setOverrideDrafts({\n role: '',\n scope: '',\n data: '',\n tools: '',\n attachments: '',\n mutationPolicy: '',\n responseStyle: '',\n overrides: '',\n })\n setSaveState({ kind: 'idle' })\n }, [agent.id])\n\n // Hydrate drafts when the latest override lands.\n React.useEffect(() => {\n const latest = overrideQuery.data?.override\n if (!latest) return\n const nextFlags: Record<PromptSectionId, boolean> = {\n role: false,\n scope: false,\n data: false,\n tools: false,\n attachments: false,\n mutationPolicy: false,\n responseStyle: false,\n overrides: false,\n }\n const nextDrafts: Record<PromptSectionId, string> = {\n role: '',\n scope: '',\n data: '',\n tools: '',\n attachments: '',\n mutationPolicy: '',\n responseStyle: '',\n overrides: '',\n }\n for (const [rawKey, value] of Object.entries(latest.sections ?? {})) {\n if (typeof value !== 'string') continue\n const key = rawKey as PromptSectionId\n if (PROMPT_SECTION_IDS.includes(key)) {\n nextFlags[key] = true\n nextDrafts[key] = value\n }\n }\n setOverrideFlags(nextFlags)\n setOverrideDrafts(nextDrafts)\n }, [overrideQuery.data?.override])\n\n const activeOverrides = React.useMemo(() => {\n const payload: Record<string, string> = {}\n for (const section of PROMPT_SECTION_IDS) {\n if (overrideFlags[section]) {\n payload[section] = overrideDrafts[section]\n }\n }\n return payload\n }, [overrideDrafts, overrideFlags])\n\n const hasAnyOverride = Object.keys(activeOverrides).length > 0\n\n const handleSave = React.useCallback(async () => {\n if (isSaving) return\n setIsSaving(true)\n setSaveState({ kind: 'idle' })\n try {\n const { ok, status, result } = await apiCall<{\n ok?: boolean\n pending?: boolean\n version?: number\n updatedAt?: string\n message?: string\n error?: string\n code?: string\n reservedKeys?: string[]\n }>(\n `/api/ai_assistant/ai/agents/${encodeURIComponent(agent.id)}/prompt-override`,\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({\n // Send both keys so a pre-Step-5.3 server still accepts the payload.\n sections: activeOverrides,\n overrides: activeOverrides,\n }),\n },\n )\n const payload = result ?? {}\n if (!ok) {\n const message =\n payload.code === 'reserved_key'\n ? t(\n 'ai_assistant.agents.override.errors.reservedKey',\n 'Prompt overrides cannot modify policy fields (mutationPolicy, readOnly, allowedTools, acceptedMediaTypes). Remove those sections and retry.',\n )\n : (payload.error ?? `Failed to save overrides (${status}).`)\n setSaveState({ kind: 'error', message })\n return\n }\n if (payload.ok === true && typeof payload.version === 'number') {\n setSaveState({\n kind: 'success',\n version: payload.version,\n message: t(\n 'ai_assistant.agents.override.savedMessage',\n 'Prompt override saved.',\n ),\n })\n await queryClient.invalidateQueries({\n queryKey: ['ai_assistant', 'agent_settings', 'override', agent.id],\n })\n return\n }\n // Legacy placeholder response: surfaces the Step-4.5 wording for BC.\n setSaveState({\n kind: 'success',\n version: 0,\n message:\n payload.message ??\n t(\n 'ai_assistant.agents.prompt.pendingMessage',\n 'Prompt overrides accepted.',\n ),\n })\n } catch (err) {\n setSaveState({\n kind: 'error',\n message: err instanceof Error ? err.message : String(err),\n })\n } finally {\n setIsSaving(false)\n }\n }, [activeOverrides, agent.id, isSaving, queryClient, t])\n\n return (\n <div className=\"flex flex-col gap-4\" data-ai-agent-detail={agent.id}>\n <section className=\"rounded-lg border border-border bg-background p-4\">\n <h2 className=\"text-xl font-semibold\">{agent.label}</h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">{agent.description}</p>\n <dl className=\"mt-4 grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4 text-sm\">\n <div>\n <dt className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.meta.module', 'Module')}\n </dt>\n <dd className=\"mt-1 font-mono text-xs\">{agent.moduleId}</dd>\n </div>\n <div>\n <dt className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.meta.id', 'Agent id')}\n </dt>\n <dd className=\"mt-1 font-mono text-xs\">{agent.id}</dd>\n </div>\n <div>\n <dt className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.meta.executionMode', 'Execution mode')}\n </dt>\n <dd className=\"mt-1\">\n <StatusBadge variant={executionModeStatusMap[agent.executionMode]}>\n {agent.executionMode}\n </StatusBadge>\n </dd>\n </div>\n <div>\n <dt className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.meta.mutationPolicy', 'Mutation policy')}\n </dt>\n <dd className=\"mt-1\">\n <StatusBadge\n variant={mutationPolicyStatusMap[agent.mutationPolicy] ?? 'neutral'}\n dot\n >\n {agent.mutationPolicy}\n </StatusBadge>\n </dd>\n </div>\n <div>\n <dt className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.meta.readOnly', 'Read-only')}\n </dt>\n <dd className=\"mt-1 text-xs\">\n {agent.readOnly\n ? t('ai_assistant.agents.meta.readOnlyYes', 'Yes')\n : t('ai_assistant.agents.meta.readOnlyNo', 'No')}\n </dd>\n </div>\n <div>\n <dt className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.meta.maxSteps', 'Max steps')}\n </dt>\n <dd className=\"mt-1 font-mono text-xs\">\n {agent.maxSteps ?? t('ai_assistant.agents.meta.unlimited', 'Unlimited')}\n </dd>\n </div>\n </dl>\n </section>\n\n <MutationPolicySection agent={agent} />\n\n <section\n className=\"rounded-lg border border-border bg-background p-4\"\n data-ai-agent-prompt-editor={agent.id}\n >\n <header className=\"flex items-center justify-between gap-3 border-b border-border pb-3\">\n <div>\n <h3 className=\"text-sm font-semibold\">\n {t('ai_assistant.agents.prompt.title', 'Prompt sections')}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.prompt.subtitle',\n 'Toggle any section to write an additive override. Saving stores a new tenant-scoped version; built-in section text is always preserved.',\n )}\n </p>\n </div>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void handleSave()}\n disabled={isSaving || !hasAnyOverride}\n data-ai-agent-prompt-save\n >\n {isSaving ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Save className=\"size-4\" aria-hidden />\n )}\n <span>{t('ai_assistant.agents.prompt.save', 'Save overrides')}</span>\n </Button>\n </header>\n <div className=\"mt-3\">\n <Alert variant=\"info\" data-ai-agent-prompt-notice>\n <Wand2 className=\"size-4\" aria-hidden />\n <AlertTitle>\n {t('ai_assistant.agents.override.noticeTitle', 'Prompt overrides are additive')}\n </AlertTitle>\n <AlertDescription>\n {t(\n 'ai_assistant.agents.override.noticeBody',\n 'Overrides append to the built-in sections \u2014 they never remove or replace shipped text. Saved versions are tenant-scoped and auditable from the history panel below.',\n )}\n </AlertDescription>\n </Alert>\n </div>\n {saveState.kind === 'success' ? (\n <Alert variant=\"success\" className=\"mt-3\" data-ai-agent-prompt-state=\"success\">\n <CheckCircle2 className=\"size-4\" aria-hidden />\n <AlertTitle>\n {saveState.version > 0\n ? t('ai_assistant.agents.override.savedTitle', 'Prompt override saved')\n : t('ai_assistant.agents.prompt.pendingTitle', 'Overrides accepted')}\n </AlertTitle>\n <AlertDescription>\n {saveState.version > 0\n ? `${saveState.message} ${t('ai_assistant.agents.override.versionLabel', 'Version')} ${saveState.version}.`\n : saveState.message}\n </AlertDescription>\n </Alert>\n ) : null}\n {saveState.kind === 'error' ? (\n <Alert variant=\"destructive\" className=\"mt-3\" data-ai-agent-prompt-state=\"error\">\n <AlertCircle className=\"size-4\" aria-hidden />\n <AlertTitle>\n {t('ai_assistant.agents.override.errorTitle', 'Failed to save prompt override')}\n </AlertTitle>\n <AlertDescription>{saveState.message}</AlertDescription>\n </Alert>\n ) : null}\n <div className=\"mt-3 flex flex-col gap-3\">\n <div>\n <span className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.prompt.fullSystemPromptLabel', 'Full system prompt (default)')}\n </span>\n <pre className=\"mt-2 max-h-40 overflow-auto rounded border border-border bg-muted/30 p-2 text-xs font-mono whitespace-pre-wrap\">\n {agent.systemPrompt}\n </pre>\n </div>\n {PROMPT_SECTION_IDS.map((sectionId) => (\n <PromptSectionEditor\n key={sectionId}\n sectionId={sectionId}\n defaultText={\n sectionId === 'role'\n ? agent.systemPrompt\n : t(\n 'ai_assistant.agents.prompt.defaultSectionPlaceholder',\n 'No default copy declared for this section \u2014 the agent ships a single systemPrompt. Override to inject additional text once Step 5.3 lands.',\n )\n }\n overrideText={overrideDrafts[sectionId]}\n override={overrideFlags[sectionId]}\n onToggleOverride={(next) => {\n setOverrideFlags((prev) => ({ ...prev, [sectionId]: next }))\n if (next) {\n setOverrideDrafts((prev) => {\n if (prev[sectionId]) return prev\n const defaultText =\n sectionId === 'role'\n ? agent.systemPrompt\n : ''\n return { ...prev, [sectionId]: defaultText }\n })\n }\n }}\n onOverrideChange={(next) =>\n setOverrideDrafts((prev) => ({ ...prev, [sectionId]: next }))\n }\n onSaveShortcut={() => void handleSave()}\n />\n ))}\n </div>\n </section>\n\n <section\n className=\"rounded-lg border border-border bg-background p-4\"\n data-ai-agent-tools-list={agent.id}\n >\n <header className=\"flex items-center justify-between gap-3 border-b border-border pb-3\">\n <div>\n <h3 className=\"text-sm font-semibold\">\n {t('ai_assistant.agents.tools.title', 'Allowed tools')}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.tools.subtitle',\n 'Read-only surface in Phase 2. Editing the per-tool toggle and mutation policy lands in Step 5.4 / Phase 3.',\n )}\n </p>\n </div>\n <Badge variant=\"neutral\" className=\"font-mono text-xs\">\n {agent.tools.length}\n </Badge>\n </header>\n <div className=\"mt-3 flex flex-col gap-2\">\n {agent.tools.length === 0 ? (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.tools.emptyBody',\n 'This agent declares no tools in its allowedTools whitelist.',\n )}\n </p>\n ) : (\n agent.tools.map((tool) => <ToolRow key={tool.name} tool={tool} />)\n )}\n </div>\n </section>\n\n <section\n className=\"rounded-lg border border-border bg-background p-4\"\n data-ai-agent-override-history={agent.id}\n >\n <header className=\"flex items-center justify-between gap-3 border-b border-border pb-3\">\n <div className=\"flex items-center gap-2\">\n <History className=\"size-4 text-muted-foreground\" aria-hidden />\n <div>\n <h3 className=\"text-sm font-semibold\">\n {t('ai_assistant.agents.override.history.title', 'Prompt override history')}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.override.history.subtitle',\n 'Newest first. Each save creates a new version scoped to the current tenant.',\n )}\n </p>\n </div>\n </div>\n {overrideQuery.data ? (\n <Badge variant=\"neutral\" className=\"font-mono text-xs\">\n {overrideQuery.data.versions.length}\n </Badge>\n ) : null}\n </header>\n <div className=\"mt-3 flex flex-col gap-2\">\n {overrideQuery.isLoading ? (\n <SettingsLoading\n message={t(\n 'ai_assistant.agents.override.history.loading',\n 'Loading override history...',\n )}\n />\n ) : overrideQuery.isError ? (\n <Alert variant=\"destructive\" data-ai-agent-override-history-error>\n <AlertCircle className=\"size-4\" aria-hidden />\n <AlertTitle>\n {t(\n 'ai_assistant.agents.override.history.errorTitle',\n 'Failed to load override history',\n )}\n </AlertTitle>\n <AlertDescription>\n {overrideQuery.error instanceof Error\n ? overrideQuery.error.message\n : String(overrideQuery.error)}\n </AlertDescription>\n </Alert>\n ) : (overrideQuery.data?.versions ?? []).length === 0 ? (\n <p\n className=\"text-xs text-muted-foreground\"\n data-ai-agent-override-history-empty\n >\n {t(\n 'ai_assistant.agents.override.history.empty',\n 'No prompt overrides have been saved for this agent yet.',\n )}\n </p>\n ) : (\n (overrideQuery.data?.versions ?? []).slice(0, 5).map((entry) => (\n <div\n key={entry.id}\n className=\"flex items-center justify-between gap-3 rounded-md border border-border bg-background px-3 py-2\"\n data-ai-agent-override-history-row={entry.version}\n >\n <div className=\"flex flex-col min-w-0\">\n <span className=\"text-xs font-semibold\">\n {t('ai_assistant.agents.override.versionLabel', 'Version')} {entry.version}\n </span>\n <span className=\"truncate text-xs text-muted-foreground\">\n {new Date(entry.updatedAt).toLocaleString()}\n </span>\n </div>\n <Badge variant=\"neutral\" className=\"font-mono text-xs\">\n {Object.keys(entry.sections ?? {}).length}{' '}\n {t('ai_assistant.agents.override.history.sectionsLabel', 'sections')}\n </Badge>\n </div>\n ))\n )}\n </div>\n </section>\n\n <section\n className=\"rounded-lg border border-border bg-background p-4\"\n data-ai-agent-attachments={agent.id}\n >\n <header className=\"flex items-center justify-between gap-3 border-b border-border pb-3\">\n <div>\n <h3 className=\"text-sm font-semibold\">\n {t('ai_assistant.agents.attachments.title', 'Attachment policy')}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.attachments.subtitle',\n 'Accepted media types the agent declares. Read-only in Phase 2.',\n )}\n </p>\n </div>\n </header>\n <div className=\"mt-3\">\n <AttachmentPolicyBadges mediaTypes={agent.acceptedMediaTypes} />\n </div>\n </section>\n </div>\n )\n}\n\nexport function AiAgentSettingsPageClient() {\n const t = useT()\n const [selectedAgentId, setSelectedAgentId] = React.useState<string | null>(null)\n\n const { data, isLoading, isError, error, refetch, isFetching } = useQuery<AgentsResponse>({\n queryKey: ['ai_assistant', 'agent_settings', 'agents'],\n queryFn: fetchAgents,\n })\n\n const agents = React.useMemo<AgentSettings[]>(() => data?.agents ?? [], [data])\n\n React.useEffect(() => {\n if (!agents.length) {\n if (selectedAgentId !== null) setSelectedAgentId(null)\n return\n }\n if (!selectedAgentId || !agents.some((agent) => agent.id === selectedAgentId)) {\n setSelectedAgentId(agents[0].id)\n }\n }, [agents, selectedAgentId])\n\n const selectedAgent = React.useMemo<AgentSettings | null>(() => {\n if (!selectedAgentId) return null\n return agents.find((agent) => agent.id === selectedAgentId) ?? null\n }, [agents, selectedAgentId])\n\n if (isLoading) {\n return (\n <SettingsLoading\n message={t('ai_assistant.agents.loadingAgents', 'Loading AI agents...')}\n />\n )\n }\n\n if (isError) {\n return (\n <Alert variant=\"destructive\" data-ai-agent-settings-error>\n <AlertCircle className=\"size-4\" aria-hidden />\n <AlertTitle>\n {t('ai_assistant.agents.loadErrorTitle', 'Failed to load AI agents')}\n </AlertTitle>\n <AlertDescription>\n <span>{error instanceof Error ? error.message : String(error)}</span>\n <div className=\"mt-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => {\n void refetch()\n }}\n >\n <RefreshCcw className=\"size-4\" aria-hidden />\n <span>{t('ai_assistant.agents.retry', 'Retry')}</span>\n </Button>\n </div>\n </AlertDescription>\n </Alert>\n )\n }\n\n if (!agents.length) {\n return <EmptyAgents />\n }\n\n return (\n <TooltipProvider delayDuration={200}>\n <div className=\"flex flex-col gap-4\" data-ai-agent-settings>\n <header className=\"flex flex-col gap-1\">\n <h1 className=\"text-2xl font-bold tracking-tight\">\n {t('ai_assistant.agents.title', 'AI Agents')}\n </h1>\n <p className=\"text-sm text-muted-foreground\">\n {t(\n 'ai_assistant.agents.subtitle',\n 'Inspect every registered agent and manage tenant-scoped additive prompt-section overrides.',\n )}\n </p>\n </header>\n\n <section\n className=\"flex flex-col gap-3 rounded-lg border border-border bg-background p-3\"\n data-ai-agent-settings-picker-wrap\n >\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between\">\n <div className=\"flex flex-col gap-2 sm:flex-1\">\n <Label htmlFor=\"ai-agent-settings-picker\">\n {t('ai_assistant.agents.agentPickerLabel', 'Agent')}\n </Label>\n <select\n id=\"ai-agent-settings-picker\"\n data-ai-agent-settings-picker\n className=\"h-9 rounded-md border border-input bg-background px-3 text-sm\"\n value={selectedAgentId ?? ''}\n onChange={(event) => setSelectedAgentId(event.target.value)}\n >\n {agents.map((agent) => (\n <option key={agent.id} value={agent.id}>\n {agent.label} ({agent.id})\n </option>\n ))}\n </select>\n </div>\n <div className=\"flex items-center gap-2 sm:flex-shrink-0\">\n <IconButton\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n void refetch()\n }}\n aria-label={t('ai_assistant.agents.refresh', 'Refresh agents')}\n disabled={isFetching}\n >\n <RefreshCcw className=\"size-4\" aria-hidden />\n </IconButton>\n </div>\n </div>\n </section>\n\n {selectedAgent ? <AgentDetailPanel agent={selectedAgent} /> : null}\n </div>\n </TooltipProvider>\n )\n}\n\nexport default AiAgentSettingsPageClient\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,10 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { Page, PageBody } from "@open-mercato/ui/backend/Page";
3
+ import { AiAgentSettingsPageClient } from "./AiAgentSettingsPageClient.js";
4
+ async function AiAssistantAgentSettingsPage() {
5
+ return /* @__PURE__ */ jsx(Page, { children: /* @__PURE__ */ jsx(PageBody, { children: /* @__PURE__ */ jsx(AiAgentSettingsPageClient, {}) }) });
6
+ }
7
+ export {
8
+ AiAssistantAgentSettingsPage as default
9
+ };
10
+ //# sourceMappingURL=page.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/ai_assistant/backend/config/ai-assistant/agents/page.tsx"],
4
+ "sourcesContent": ["import { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { AiAgentSettingsPageClient } from './AiAgentSettingsPageClient'\n\nexport default async function AiAssistantAgentSettingsPage() {\n return (\n <Page>\n <PageBody>\n <AiAgentSettingsPageClient />\n </PageBody>\n </Page>\n )\n}\n"],
5
+ "mappings": "AAOQ;AAPR,SAAS,MAAM,gBAAgB;AAC/B,SAAS,iCAAiC;AAE1C,eAAO,+BAAsD;AAC3D,SACE,oBAAC,QACC,8BAAC,YACC,8BAAC,6BAA0B,GAC7B,GACF;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,28 @@
1
+ import React from "react";
2
+ const agentsIcon = React.createElement(
3
+ "svg",
4
+ { width: 16, height: 16, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round" },
5
+ React.createElement("rect", { width: 18, height: 10, x: 3, y: 11, rx: 2 }),
6
+ React.createElement("circle", { cx: 12, cy: 5, r: 2 }),
7
+ React.createElement("path", { d: "M12 7v4" }),
8
+ React.createElement("line", { x1: 8, y1: 16, x2: 8, y2: 16 }),
9
+ React.createElement("line", { x1: 16, y1: 16, x2: 16, y2: 16 })
10
+ );
11
+ const metadata = {
12
+ requireAuth: true,
13
+ requireFeatures: ["ai_assistant.settings.manage"],
14
+ pageTitle: "AI Agents",
15
+ pageTitleKey: "ai_assistant.agents.navTitle",
16
+ pageGroup: "Module Configs",
17
+ pageGroupKey: "settings.sections.moduleConfigs",
18
+ pageOrder: 430,
19
+ icon: agentsIcon,
20
+ pageContext: "settings",
21
+ breadcrumb: [
22
+ { label: "AI Agents", labelKey: "ai_assistant.agents.navTitle" }
23
+ ]
24
+ };
25
+ export {
26
+ metadata
27
+ };
28
+ //# sourceMappingURL=page.meta.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/ai_assistant/backend/config/ai-assistant/agents/page.meta.ts"],
4
+ "sourcesContent": ["import React from 'react'\n\nconst agentsIcon = React.createElement(\n 'svg',\n { width: 16, height: 16, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 2, strokeLinecap: 'round', strokeLinejoin: 'round' },\n React.createElement('rect', { width: 18, height: 10, x: 3, y: 11, rx: 2 }),\n React.createElement('circle', { cx: 12, cy: 5, r: 2 }),\n React.createElement('path', { d: 'M12 7v4' }),\n React.createElement('line', { x1: 8, y1: 16, x2: 8, y2: 16 }),\n React.createElement('line', { x1: 16, y1: 16, x2: 16, y2: 16 }),\n)\n\nexport const metadata = {\n requireAuth: true,\n requireFeatures: ['ai_assistant.settings.manage'],\n pageTitle: 'AI Agents',\n pageTitleKey: 'ai_assistant.agents.navTitle',\n pageGroup: 'Module Configs',\n pageGroupKey: 'settings.sections.moduleConfigs',\n pageOrder: 430,\n icon: agentsIcon,\n pageContext: 'settings' as const,\n breadcrumb: [\n { label: 'AI Agents', labelKey: 'ai_assistant.agents.navTitle' },\n ],\n} as const\n"],
5
+ "mappings": "AAAA,OAAO,WAAW;AAElB,MAAM,aAAa,MAAM;AAAA,EACvB;AAAA,EACA,EAAE,OAAO,IAAI,QAAQ,IAAI,SAAS,aAAa,MAAM,QAAQ,QAAQ,gBAAgB,aAAa,GAAG,eAAe,SAAS,gBAAgB,QAAQ;AAAA,EACrJ,MAAM,cAAc,QAAQ,EAAE,OAAO,IAAI,QAAQ,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;AAAA,EACzE,MAAM,cAAc,UAAU,EAAE,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC;AAAA,EACrD,MAAM,cAAc,QAAQ,EAAE,GAAG,UAAU,CAAC;AAAA,EAC5C,MAAM,cAAc,QAAQ,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,CAAC;AAAA,EAC5D,MAAM,cAAc,QAAQ,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC;AAChE;AAEO,MAAM,WAAW;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB,CAAC,8BAA8B;AAAA,EAChD,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,MAAM;AAAA,EACN,aAAa;AAAA,EACb,YAAY;AAAA,IACV,EAAE,OAAO,aAAa,UAAU,+BAA+B;AAAA,EACjE;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,10 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { Page, PageBody } from "@open-mercato/ui/backend/Page";
3
+ import { AiAssistantSettingsPageClient } from "../../../../components/AiAssistantSettingsPageClient.js";
4
+ async function AiAssistantLegacySettingsPage() {
5
+ return /* @__PURE__ */ jsx(Page, { children: /* @__PURE__ */ jsx(PageBody, { children: /* @__PURE__ */ jsx(AiAssistantSettingsPageClient, {}) }) });
6
+ }
7
+ export {
8
+ AiAssistantLegacySettingsPage as default
9
+ };
10
+ //# sourceMappingURL=page.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/ai_assistant/backend/config/ai-assistant/legacy/page.tsx"],
4
+ "sourcesContent": ["import { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { AiAssistantSettingsPageClient } from '../../../../components/AiAssistantSettingsPageClient'\n\nexport default async function AiAssistantLegacySettingsPage() {\n return (\n <Page>\n <PageBody>\n <AiAssistantSettingsPageClient />\n </PageBody>\n </Page>\n )\n}\n"],
5
+ "mappings": "AAOQ;AAPR,SAAS,MAAM,gBAAgB;AAC/B,SAAS,qCAAqC;AAE9C,eAAO,gCAAuD;AAC5D,SACE,oBAAC,QACC,8BAAC,YACC,8BAAC,iCAA8B,GACjC,GACF;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,30 @@
1
+ import React from "react";
2
+ const aiIcon = React.createElement(
3
+ "svg",
4
+ { width: 16, height: 16, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round" },
5
+ React.createElement("path", { d: "M12 8V4H8" }),
6
+ React.createElement("rect", { width: 16, height: 12, x: 4, y: 8, rx: 2 }),
7
+ React.createElement("path", { d: "M2 14h2" }),
8
+ React.createElement("path", { d: "M20 14h2" }),
9
+ React.createElement("path", { d: "M15 13v2" }),
10
+ React.createElement("path", { d: "M9 13v2" })
11
+ );
12
+ const metadata = {
13
+ requireAuth: true,
14
+ requireFeatures: ["ai_assistant.settings.manage"],
15
+ pageTitle: "AI Assistant (legacy)",
16
+ pageTitleKey: "ai_assistant.config.nav.settingsLegacy",
17
+ pageGroup: "Module Configs",
18
+ pageGroupKey: "settings.sections.moduleConfigs",
19
+ pageOrder: 432,
20
+ icon: aiIcon,
21
+ pageContext: "settings",
22
+ breadcrumb: [
23
+ { label: "AI Agents", labelKey: "ai_assistant.agents.navTitle" },
24
+ { label: "AI Assistant (legacy)", labelKey: "ai_assistant.config.nav.settingsLegacy" }
25
+ ]
26
+ };
27
+ export {
28
+ metadata
29
+ };
30
+ //# sourceMappingURL=page.meta.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/ai_assistant/backend/config/ai-assistant/legacy/page.meta.ts"],
4
+ "sourcesContent": ["import React from 'react'\n\nconst aiIcon = React.createElement(\n 'svg',\n { width: 16, height: 16, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 2, strokeLinecap: 'round', strokeLinejoin: 'round' },\n React.createElement('path', { d: 'M12 8V4H8' }),\n React.createElement('rect', { width: 16, height: 12, x: 4, y: 8, rx: 2 }),\n React.createElement('path', { d: 'M2 14h2' }),\n React.createElement('path', { d: 'M20 14h2' }),\n React.createElement('path', { d: 'M15 13v2' }),\n React.createElement('path', { d: 'M9 13v2' }),\n)\n\nexport const metadata = {\n requireAuth: true,\n requireFeatures: ['ai_assistant.settings.manage'],\n pageTitle: 'AI Assistant (legacy)',\n pageTitleKey: 'ai_assistant.config.nav.settingsLegacy',\n pageGroup: 'Module Configs',\n pageGroupKey: 'settings.sections.moduleConfigs',\n pageOrder: 432,\n icon: aiIcon,\n pageContext: 'settings' as const,\n breadcrumb: [\n { label: 'AI Agents', labelKey: 'ai_assistant.agents.navTitle' },\n { label: 'AI Assistant (legacy)', labelKey: 'ai_assistant.config.nav.settingsLegacy' },\n ],\n} as const\n"],
5
+ "mappings": "AAAA,OAAO,WAAW;AAElB,MAAM,SAAS,MAAM;AAAA,EACnB;AAAA,EACA,EAAE,OAAO,IAAI,QAAQ,IAAI,SAAS,aAAa,MAAM,QAAQ,QAAQ,gBAAgB,aAAa,GAAG,eAAe,SAAS,gBAAgB,QAAQ;AAAA,EACrJ,MAAM,cAAc,QAAQ,EAAE,GAAG,YAAY,CAAC;AAAA,EAC9C,MAAM,cAAc,QAAQ,EAAE,OAAO,IAAI,QAAQ,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,CAAC;AAAA,EACxE,MAAM,cAAc,QAAQ,EAAE,GAAG,UAAU,CAAC;AAAA,EAC5C,MAAM,cAAc,QAAQ,EAAE,GAAG,WAAW,CAAC;AAAA,EAC7C,MAAM,cAAc,QAAQ,EAAE,GAAG,WAAW,CAAC;AAAA,EAC7C,MAAM,cAAc,QAAQ,EAAE,GAAG,UAAU,CAAC;AAC9C;AAEO,MAAM,WAAW;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB,CAAC,8BAA8B;AAAA,EAChD,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,MAAM;AAAA,EACN,aAAa;AAAA,EACb,YAAY;AAAA,IACV,EAAE,OAAO,aAAa,UAAU,+BAA+B;AAAA,IAC/D,EAAE,OAAO,yBAAyB,UAAU,yCAAyC;AAAA,EACvF;AACF;",
6
+ "names": []
7
+ }
@@ -1,10 +1,8 @@
1
- import { jsx } from "react/jsx-runtime";
2
- import { Page, PageBody } from "@open-mercato/ui/backend/Page";
3
- import { AiAssistantSettingsPageClient } from "../../../components/AiAssistantSettingsPageClient.js";
4
- async function AiAssistantSettingsPage() {
5
- return /* @__PURE__ */ jsx(Page, { children: /* @__PURE__ */ jsx(PageBody, { children: /* @__PURE__ */ jsx(AiAssistantSettingsPageClient, {}) }) });
1
+ import { redirect } from "next/navigation";
2
+ async function AiAssistantSectionRoot() {
3
+ redirect("/backend/config/ai-assistant/agents");
6
4
  }
7
5
  export {
8
- AiAssistantSettingsPage as default
6
+ AiAssistantSectionRoot as default
9
7
  };
10
8
  //# sourceMappingURL=page.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/modules/ai_assistant/backend/config/ai-assistant/page.tsx"],
4
- "sourcesContent": ["import { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { AiAssistantSettingsPageClient } from '../../../components/AiAssistantSettingsPageClient'\n\nexport default async function AiAssistantSettingsPage() {\n return (\n <Page>\n <PageBody>\n <AiAssistantSettingsPageClient />\n </PageBody>\n </Page>\n )\n}\n"],
5
- "mappings": "AAOQ;AAPR,SAAS,MAAM,gBAAgB;AAC/B,SAAS,qCAAqC;AAE9C,eAAO,0BAAiD;AACtD,SACE,oBAAC,QACC,8BAAC,YACC,8BAAC,iCAA8B,GACjC,GACF;AAEJ;",
4
+ "sourcesContent": ["import { redirect } from 'next/navigation'\n\n/**\n * The AI section's root URL (`/backend/config/ai-assistant`) used to render\n * the legacy command palette settings page; that legacy surface now lives at\n * `/backend/config/ai-assistant/legacy`. Make the section root point to the\n * AI Agents list, which is the canonical entrypoint for the framework.\n *\n * `redirect()` throws (its return type is `never`) so the function never\n * yields a real value, but Next.js infers `Promise<void>` here unless we\n * pin the return to `Promise<never>` \u2014 and React's page-component contract\n * rejects `void`. Declaring it explicitly keeps the generated route map\n * happy without forcing a no-op `return null` after a non-returning call.\n */\nexport default async function AiAssistantSectionRoot(): Promise<never> {\n redirect('/backend/config/ai-assistant/agents')\n}\n"],
5
+ "mappings": "AAAA,SAAS,gBAAgB;AAczB,eAAO,yBAAgE;AACrE,WAAS,qCAAqC;AAChD;",
6
6
  "names": []
7
7
  }
@@ -1,27 +1,7 @@
1
- import React from "react";
2
- const aiIcon = React.createElement(
3
- "svg",
4
- { width: 16, height: 16, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round" },
5
- React.createElement("path", { d: "M12 8V4H8" }),
6
- React.createElement("rect", { width: 16, height: 12, x: 4, y: 8, rx: 2 }),
7
- React.createElement("path", { d: "M2 14h2" }),
8
- React.createElement("path", { d: "M20 14h2" }),
9
- React.createElement("path", { d: "M15 13v2" }),
10
- React.createElement("path", { d: "M9 13v2" })
11
- );
12
1
  const metadata = {
13
2
  requireAuth: true,
14
3
  requireFeatures: ["ai_assistant.settings.manage"],
15
- pageTitle: "AI Assistant",
16
- pageTitleKey: "ai_assistant.config.nav.settings",
17
- pageGroup: "Module Configs",
18
- pageGroupKey: "settings.sections.moduleConfigs",
19
- pageOrder: 430,
20
- icon: aiIcon,
21
- pageContext: "settings",
22
- breadcrumb: [
23
- { label: "AI Assistant", labelKey: "ai_assistant.config.nav.settings" }
24
- ]
4
+ navHidden: true
25
5
  };
26
6
  export {
27
7
  metadata
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/modules/ai_assistant/backend/config/ai-assistant/page.meta.ts"],
4
- "sourcesContent": ["import React from 'react'\n\nconst aiIcon = React.createElement(\n 'svg',\n { width: 16, height: 16, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 2, strokeLinecap: 'round', strokeLinejoin: 'round' },\n React.createElement('path', { d: 'M12 8V4H8' }),\n React.createElement('rect', { width: 16, height: 12, x: 4, y: 8, rx: 2 }),\n React.createElement('path', { d: 'M2 14h2' }),\n React.createElement('path', { d: 'M20 14h2' }),\n React.createElement('path', { d: 'M15 13v2' }),\n React.createElement('path', { d: 'M9 13v2' }),\n)\n\nexport const metadata = {\n requireAuth: true,\n requireFeatures: ['ai_assistant.settings.manage'],\n pageTitle: 'AI Assistant',\n pageTitleKey: 'ai_assistant.config.nav.settings',\n pageGroup: 'Module Configs',\n pageGroupKey: 'settings.sections.moduleConfigs',\n pageOrder: 430,\n icon: aiIcon,\n pageContext: 'settings' as const,\n breadcrumb: [\n { label: 'AI Assistant', labelKey: 'ai_assistant.config.nav.settings' },\n ],\n} as const\n"],
5
- "mappings": "AAAA,OAAO,WAAW;AAElB,MAAM,SAAS,MAAM;AAAA,EACnB;AAAA,EACA,EAAE,OAAO,IAAI,QAAQ,IAAI,SAAS,aAAa,MAAM,QAAQ,QAAQ,gBAAgB,aAAa,GAAG,eAAe,SAAS,gBAAgB,QAAQ;AAAA,EACrJ,MAAM,cAAc,QAAQ,EAAE,GAAG,YAAY,CAAC;AAAA,EAC9C,MAAM,cAAc,QAAQ,EAAE,OAAO,IAAI,QAAQ,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,CAAC;AAAA,EACxE,MAAM,cAAc,QAAQ,EAAE,GAAG,UAAU,CAAC;AAAA,EAC5C,MAAM,cAAc,QAAQ,EAAE,GAAG,WAAW,CAAC;AAAA,EAC7C,MAAM,cAAc,QAAQ,EAAE,GAAG,WAAW,CAAC;AAAA,EAC7C,MAAM,cAAc,QAAQ,EAAE,GAAG,UAAU,CAAC;AAC9C;AAEO,MAAM,WAAW;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB,CAAC,8BAA8B;AAAA,EAChD,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,MAAM;AAAA,EACN,aAAa;AAAA,EACb,YAAY;AAAA,IACV,EAAE,OAAO,gBAAgB,UAAU,mCAAmC;AAAA,EACxE;AACF;",
4
+ "sourcesContent": ["/**\n * The section root (`/backend/config/ai-assistant`) is a redirect to the AI\n * Agents page (see `page.tsx`). It MUST NOT appear in the sidebar \u2014 leaving\n * it out of the structural cache prevents the legacy \"AI Assistant\n * (legacy)\" entry from anchoring the AI section. The actual legacy surface\n * lives at `/backend/config/ai-assistant/legacy` with its own meta.\n */\nexport const metadata = {\n requireAuth: true,\n requireFeatures: ['ai_assistant.settings.manage'],\n navHidden: true,\n} as const\n"],
5
+ "mappings": "AAOO,MAAM,WAAW;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB,CAAC,8BAA8B;AAAA,EAChD,WAAW;AACb;",
6
6
  "names": []
7
7
  }