madarx 2.15.1 → 2.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (377) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +322 -321
  3. package/.next/standalone/.next/app-path-routes-manifest.json +81 -81
  4. package/.next/standalone/.next/build-manifest.json +2 -2
  5. package/.next/standalone/.next/prerender-manifest.json +9 -9
  6. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  7. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  8. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  9. package/.next/standalone/.next/server/app/activity/page_client-reference-manifest.js +1 -1
  10. package/.next/standalone/.next/server/app/admin/page.js +2 -2
  11. package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  12. package/.next/standalone/.next/server/app/agents/[id]/page.js +6 -6
  13. package/.next/standalone/.next/server/app/agents/[id]/page.js.nft.json +1 -1
  14. package/.next/standalone/.next/server/app/agents/[id]/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/agents/page.js +1 -1
  16. package/.next/standalone/.next/server/app/agents/page.js.nft.json +1 -1
  17. package/.next/standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/api/activity/route_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/api/admin/audit-export/route_client-reference-manifest.js +1 -1
  20. package/.next/standalone/.next/server/app/api/admin/share-links/route_client-reference-manifest.js +1 -1
  21. package/.next/standalone/.next/server/app/api/agent-memory/route_client-reference-manifest.js +1 -1
  22. package/.next/standalone/.next/server/app/api/agent-runs/[id]/cancel/route_client-reference-manifest.js +1 -1
  23. package/.next/standalone/.next/server/app/api/agent-runs/[id]/events/route_client-reference-manifest.js +1 -1
  24. package/.next/standalone/.next/server/app/api/agent-runs/[id]/log/route_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/api/agent-runs/[id]/route_client-reference-manifest.js +1 -1
  26. package/.next/standalone/.next/server/app/api/agent-runs/route_client-reference-manifest.js +1 -1
  27. package/.next/standalone/.next/server/app/api/agents/[id]/chain/route_client-reference-manifest.js +1 -1
  28. package/.next/standalone/.next/server/app/api/agents/[id]/memory/route_client-reference-manifest.js +1 -1
  29. package/.next/standalone/.next/server/app/api/agents/[id]/reports/route_client-reference-manifest.js +1 -1
  30. package/.next/standalone/.next/server/app/api/agents/[id]/run/route_client-reference-manifest.js +1 -1
  31. package/.next/standalone/.next/server/app/api/agents/[id]/skills/route_client-reference-manifest.js +1 -1
  32. package/.next/standalone/.next/server/app/api/agents/create/route_client-reference-manifest.js +1 -1
  33. package/.next/standalone/.next/server/app/api/agents/ops/route_client-reference-manifest.js +1 -1
  34. package/.next/standalone/.next/server/app/api/approvals/[id]/route_client-reference-manifest.js +1 -1
  35. package/.next/standalone/.next/server/app/api/approvals/route_client-reference-manifest.js +1 -1
  36. package/.next/standalone/.next/server/app/api/artifacts/[id]/acl/route_client-reference-manifest.js +1 -1
  37. package/.next/standalone/.next/server/app/api/artifacts/[id]/protect/route_client-reference-manifest.js +1 -1
  38. package/.next/standalone/.next/server/app/api/artifacts/[id]/raw/route_client-reference-manifest.js +1 -1
  39. package/.next/standalone/.next/server/app/api/artifacts/[id]/route_client-reference-manifest.js +1 -1
  40. package/.next/standalone/.next/server/app/api/artifacts/[id]/share-link/[linkId]/route_client-reference-manifest.js +1 -1
  41. package/.next/standalone/.next/server/app/api/artifacts/[id]/share-link/route_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/api/artifacts/upload/route_client-reference-manifest.js +1 -1
  43. package/.next/standalone/.next/server/app/api/audit/list/route_client-reference-manifest.js +1 -1
  44. package/.next/standalone/.next/server/app/api/audit/search/route_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
  46. package/.next/standalone/.next/server/app/api/auth/config/route_client-reference-manifest.js +1 -1
  47. package/.next/standalone/.next/server/app/api/auth/join-bootstrap/route_client-reference-manifest.js +1 -1
  48. package/.next/standalone/.next/server/app/api/auth/session/route_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/api/brand/route_client-reference-manifest.js +1 -1
  50. package/.next/standalone/.next/server/app/api/chat/sessions/[id]/route_client-reference-manifest.js +1 -1
  51. package/.next/standalone/.next/server/app/api/chat/sessions/route_client-reference-manifest.js +1 -1
  52. package/.next/standalone/.next/server/app/api/config/env/route_client-reference-manifest.js +1 -1
  53. package/.next/standalone/.next/server/app/api/config/route_client-reference-manifest.js +1 -1
  54. package/.next/standalone/.next/server/app/api/connections/[service]/route_client-reference-manifest.js +1 -1
  55. package/.next/standalone/.next/server/app/api/connections/[service]/verify/route.js +2 -2
  56. package/.next/standalone/.next/server/app/api/connections/[service]/verify/route_client-reference-manifest.js +1 -1
  57. package/.next/standalone/.next/server/app/api/connections/route_client-reference-manifest.js +1 -1
  58. package/.next/standalone/.next/server/app/api/cron/tick/route_client-reference-manifest.js +1 -1
  59. package/.next/standalone/.next/server/app/api/dashboard/spaces/[id]/move/route_client-reference-manifest.js +1 -1
  60. package/.next/standalone/.next/server/app/api/dashboard/spaces/[id]/route_client-reference-manifest.js +1 -1
  61. package/.next/standalone/.next/server/app/api/dashboard/spaces/[id]/share-link/[linkId]/route_client-reference-manifest.js +1 -1
  62. package/.next/standalone/.next/server/app/api/dashboard/spaces/[id]/share-link/route_client-reference-manifest.js +1 -1
  63. package/.next/standalone/.next/server/app/api/dashboard/spaces/import/route_client-reference-manifest.js +1 -1
  64. package/.next/standalone/.next/server/app/api/dashboard/spaces/route_client-reference-manifest.js +1 -1
  65. package/.next/standalone/.next/server/app/api/disk/files/[id]/blob/route_client-reference-manifest.js +1 -1
  66. package/.next/standalone/.next/server/app/api/disk/files/[id]/route_client-reference-manifest.js +1 -1
  67. package/.next/standalone/.next/server/app/api/disk/files/[id]/transcribe/route_client-reference-manifest.js +1 -1
  68. package/.next/standalone/.next/server/app/api/disk/files/route_client-reference-manifest.js +1 -1
  69. package/.next/standalone/.next/server/app/api/disk/folders/route_client-reference-manifest.js +1 -1
  70. package/.next/standalone/.next/server/app/api/events/since/[cursor]/route_client-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/app/api/events/stream/route_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/api/fs/create-folder/route_client-reference-manifest.js +1 -1
  73. package/.next/standalone/.next/server/app/api/fs/pick-folder/route_client-reference-manifest.js +1 -1
  74. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/blueprint/route_client-reference-manifest.js +1 -1
  75. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/diagnostic/route_client-reference-manifest.js +1 -1
  76. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/governance/route_client-reference-manifest.js +1 -1
  77. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/interview/route_client-reference-manifest.js +1 -1
  78. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/pilot/route_client-reference-manifest.js +1 -1
  79. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/quarterly/route_client-reference-manifest.js +1 -1
  80. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/route_client-reference-manifest.js +1 -1
  81. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/setup-package/route_client-reference-manifest.js +1 -1
  82. package/.next/standalone/.next/server/app/api/hail/engagements/route_client-reference-manifest.js +1 -1
  83. package/.next/standalone/.next/server/app/api/hail/interviews/[id]/responses/route_client-reference-manifest.js +1 -1
  84. package/.next/standalone/.next/server/app/api/hail/interviews/[id]/route_client-reference-manifest.js +1 -1
  85. package/.next/standalone/.next/server/app/api/hail/setup-packages/[id]/apply/route_client-reference-manifest.js +1 -1
  86. package/.next/standalone/.next/server/app/api/hail/setup-packages/validate/route_client-reference-manifest.js +1 -1
  87. package/.next/standalone/.next/server/app/api/heartbeat/tick/route_client-reference-manifest.js +1 -1
  88. package/.next/standalone/.next/server/app/api/heartbeat/worker/route_client-reference-manifest.js +1 -1
  89. package/.next/standalone/.next/server/app/api/help/route_client-reference-manifest.js +1 -1
  90. package/.next/standalone/.next/server/app/api/hermes/jobs/[id]/events/route_client-reference-manifest.js +1 -1
  91. package/.next/standalone/.next/server/app/api/hermes/jobs/[id]/route_client-reference-manifest.js +1 -1
  92. package/.next/standalone/.next/server/app/api/hermes/jobs/route_client-reference-manifest.js +1 -1
  93. package/.next/standalone/.next/server/app/api/integrations/google/callback/route_client-reference-manifest.js +1 -1
  94. package/.next/standalone/.next/server/app/api/integrations/google/oauth/route_client-reference-manifest.js +1 -1
  95. package/.next/standalone/.next/server/app/api/marketplace/[id]/route_client-reference-manifest.js +1 -1
  96. package/.next/standalone/.next/server/app/api/marketplace/open-design/route_client-reference-manifest.js +1 -1
  97. package/.next/standalone/.next/server/app/api/marketplace/route_client-reference-manifest.js +1 -1
  98. package/.next/standalone/.next/server/app/api/mines/import-roots/route_client-reference-manifest.js +1 -1
  99. package/.next/standalone/.next/server/app/api/mines/portfolio/route_client-reference-manifest.js +1 -1
  100. package/.next/standalone/.next/server/app/api/mines/projects/[id]/chunks/route_client-reference-manifest.js +1 -1
  101. package/.next/standalone/.next/server/app/api/mines/projects/[id]/diligence/route_client-reference-manifest.js +1 -1
  102. package/.next/standalone/.next/server/app/api/mines/projects/[id]/import/route_client-reference-manifest.js +1 -1
  103. package/.next/standalone/.next/server/app/api/mines/projects/[id]/publish/route_client-reference-manifest.js +1 -1
  104. package/.next/standalone/.next/server/app/api/mines/projects/route_client-reference-manifest.js +1 -1
  105. package/.next/standalone/.next/server/app/api/missions/route_client-reference-manifest.js +1 -1
  106. package/.next/standalone/.next/server/app/api/models/route_client-reference-manifest.js +1 -1
  107. package/.next/standalone/.next/server/app/api/onboarding/blueprint/route_client-reference-manifest.js +1 -1
  108. package/.next/standalone/.next/server/app/api/onboarding/launch/route_client-reference-manifest.js +1 -1
  109. package/.next/standalone/.next/server/app/api/orchestrator/command/route_client-reference-manifest.js +1 -1
  110. package/.next/standalone/.next/server/app/api/orchestrator/stream/route_client-reference-manifest.js +1 -1
  111. package/.next/standalone/.next/server/app/api/orchestrator/upload/route_client-reference-manifest.js +1 -1
  112. package/.next/standalone/.next/server/app/api/org/route_client-reference-manifest.js +1 -1
  113. package/.next/standalone/.next/server/app/api/orgs/[id]/invites/[inviteId]/route_client-reference-manifest.js +1 -1
  114. package/.next/standalone/.next/server/app/api/orgs/[id]/invites/route_client-reference-manifest.js +1 -1
  115. package/.next/standalone/.next/server/app/api/orgs/[id]/members/[userId]/role/route_client-reference-manifest.js +1 -1
  116. package/.next/standalone/.next/server/app/api/orgs/[id]/members/[userId]/route_client-reference-manifest.js +1 -1
  117. package/.next/standalone/.next/server/app/api/orgs/[id]/members/route_client-reference-manifest.js +1 -1
  118. package/.next/standalone/.next/server/app/api/orgs/[id]/route_client-reference-manifest.js +1 -1
  119. package/.next/standalone/.next/server/app/api/orgs/invites/pending/route_client-reference-manifest.js +1 -1
  120. package/.next/standalone/.next/server/app/api/orgs/join/route_client-reference-manifest.js +1 -1
  121. package/.next/standalone/.next/server/app/api/orgs/join-complete/route_client-reference-manifest.js +1 -1
  122. package/.next/standalone/.next/server/app/api/orgs/route_client-reference-manifest.js +1 -1
  123. package/.next/standalone/.next/server/app/api/printing-press/clis/route_client-reference-manifest.js +1 -1
  124. package/.next/standalone/.next/server/app/api/printing-press/install/route_client-reference-manifest.js +1 -1
  125. package/.next/standalone/.next/server/app/api/printing-press/security-mode/route_client-reference-manifest.js +1 -1
  126. package/.next/standalone/.next/server/app/api/privacy/config/route_client-reference-manifest.js +1 -1
  127. package/.next/standalone/.next/server/app/api/privacy/verify/route_client-reference-manifest.js +1 -1
  128. package/.next/standalone/.next/server/app/api/processes/[id]/route_client-reference-manifest.js +1 -1
  129. package/.next/standalone/.next/server/app/api/processes/[id]/share-link/route_client-reference-manifest.js +1 -1
  130. package/.next/standalone/.next/server/app/api/processes/[id]/stages/[stageId]/override/route_client-reference-manifest.js +1 -1
  131. package/.next/standalone/.next/server/app/api/processes/[id]/stages/[stageId]/retry/route_client-reference-manifest.js +1 -1
  132. package/.next/standalone/.next/server/app/api/processes/[id]/stages/[stageId]/submit/route_client-reference-manifest.js +1 -1
  133. package/.next/standalone/.next/server/app/api/processes/definitions/[slug]/route_client-reference-manifest.js +1 -1
  134. package/.next/standalone/.next/server/app/api/processes/definitions/[slug]/settings/route_client-reference-manifest.js +1 -1
  135. package/.next/standalone/.next/server/app/api/processes/definitions/route_client-reference-manifest.js +1 -1
  136. package/.next/standalone/.next/server/app/api/processes/definitions/validate/route_client-reference-manifest.js +1 -1
  137. package/.next/standalone/.next/server/app/api/processes/route_client-reference-manifest.js +1 -1
  138. package/.next/standalone/.next/server/app/api/processes/start-and-route/route_client-reference-manifest.js +1 -1
  139. package/.next/standalone/.next/server/app/api/projects/[slug]/library/route_client-reference-manifest.js +1 -1
  140. package/.next/standalone/.next/server/app/api/projects/[slug]/route_client-reference-manifest.js +1 -1
  141. package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  142. package/.next/standalone/.next/server/app/api/runs/approve-claude-run/route_client-reference-manifest.js +1 -1
  143. package/.next/standalone/.next/server/app/api/runs/claude-code-dry-run/route_client-reference-manifest.js +1 -1
  144. package/.next/standalone/.next/server/app/api/runs/competitor-report/route_client-reference-manifest.js +1 -1
  145. package/.next/standalone/.next/server/app/api/runs/engine-ping/route_client-reference-manifest.js +1 -1
  146. package/.next/standalone/.next/server/app/api/runs/marketing-plan/route_client-reference-manifest.js +1 -1
  147. package/.next/standalone/.next/server/app/api/schedules/upsert/route_client-reference-manifest.js +1 -1
  148. package/.next/standalone/.next/server/app/api/secrets/[name]/route_client-reference-manifest.js +1 -1
  149. package/.next/standalone/.next/server/app/api/secrets/route_client-reference-manifest.js +1 -1
  150. package/.next/standalone/.next/server/app/api/settings/trust-mode/route_client-reference-manifest.js +1 -1
  151. package/.next/standalone/.next/server/app/api/share/[token]/otp/route_client-reference-manifest.js +1 -1
  152. package/.next/standalone/.next/server/app/api/share/[token]/route_client-reference-manifest.js +1 -1
  153. package/.next/standalone/.next/server/app/api/share/[token]/verify/route_client-reference-manifest.js +1 -1
  154. package/.next/standalone/.next/server/app/api/share/space/[token]/otp/route_client-reference-manifest.js +1 -1
  155. package/.next/standalone/.next/server/app/api/share/space/[token]/route_client-reference-manifest.js +1 -1
  156. package/.next/standalone/.next/server/app/api/share/space/[token]/verify/route_client-reference-manifest.js +1 -1
  157. package/.next/standalone/.next/server/app/api/shared/spaces/[id]/acl/route_client-reference-manifest.js +1 -1
  158. package/.next/standalone/.next/server/app/api/shared/spaces/publish/route_client-reference-manifest.js +1 -1
  159. package/.next/standalone/.next/server/app/api/shared/spaces/route_client-reference-manifest.js +1 -1
  160. package/.next/standalone/.next/server/app/api/shared/spaces/status/route_client-reference-manifest.js +1 -1
  161. package/.next/standalone/.next/server/app/api/shared/spaces/unpublish/route_client-reference-manifest.js +1 -1
  162. package/.next/standalone/.next/server/app/api/state/route_client-reference-manifest.js +1 -1
  163. package/.next/standalone/.next/server/app/api/system/update/route_client-reference-manifest.js +1 -1
  164. package/.next/standalone/.next/server/app/api/tasks/[id]/active-run/route_client-reference-manifest.js +1 -1
  165. package/.next/standalone/.next/server/app/api/tasks/[id]/attachments/route_client-reference-manifest.js +1 -1
  166. package/.next/standalone/.next/server/app/api/tasks/[id]/checklist/[itemId]/route_client-reference-manifest.js +1 -1
  167. package/.next/standalone/.next/server/app/api/tasks/[id]/checklist/route_client-reference-manifest.js +1 -1
  168. package/.next/standalone/.next/server/app/api/tasks/[id]/checkout/route_client-reference-manifest.js +1 -1
  169. package/.next/standalone/.next/server/app/api/tasks/[id]/children/route_client-reference-manifest.js +1 -1
  170. package/.next/standalone/.next/server/app/api/tasks/[id]/comments/route_client-reference-manifest.js +1 -1
  171. package/.next/standalone/.next/server/app/api/tasks/[id]/events/route_client-reference-manifest.js +1 -1
  172. package/.next/standalone/.next/server/app/api/tasks/[id]/live-runs/route_client-reference-manifest.js +1 -1
  173. package/.next/standalone/.next/server/app/api/tasks/[id]/release/route_client-reference-manifest.js +1 -1
  174. package/.next/standalone/.next/server/app/api/tasks/[id]/route_client-reference-manifest.js +1 -1
  175. package/.next/standalone/.next/server/app/api/tasks/route_client-reference-manifest.js +1 -1
  176. package/.next/standalone/.next/server/app/api/tool-allowlists/[id]/route_client-reference-manifest.js +1 -1
  177. package/.next/standalone/.next/server/app/api/tool-allowlists/route_client-reference-manifest.js +1 -1
  178. package/.next/standalone/.next/server/app/api/tool-egress/route_client-reference-manifest.js +1 -1
  179. package/.next/standalone/.next/server/app/api/tools/[name]/approve/route_client-reference-manifest.js +1 -1
  180. package/.next/standalone/.next/server/app/api/tools/[name]/route_client-reference-manifest.js +1 -1
  181. package/.next/standalone/.next/server/app/api/tools/route_client-reference-manifest.js +1 -1
  182. package/.next/standalone/.next/server/app/api/transcripts/route_client-reference-manifest.js +1 -1
  183. package/.next/standalone/.next/server/app/api/voice/providers/route_client-reference-manifest.js +1 -1
  184. package/.next/standalone/.next/server/app/api/voice/realtime/context/route_client-reference-manifest.js +1 -1
  185. package/.next/standalone/.next/server/app/api/voice/realtime/session/route_client-reference-manifest.js +1 -1
  186. package/.next/standalone/.next/server/app/api/voice/realtime/tool-result/route_client-reference-manifest.js +1 -1
  187. package/.next/standalone/.next/server/app/api/voice/realtime/tools/route_client-reference-manifest.js +1 -1
  188. package/.next/standalone/.next/server/app/api/voice/tts/route_client-reference-manifest.js +1 -1
  189. package/.next/standalone/.next/server/app/api/whatsapp/allowlist/route_client-reference-manifest.js +1 -1
  190. package/.next/standalone/.next/server/app/api/whatsapp/disconnect/route_client-reference-manifest.js +1 -1
  191. package/.next/standalone/.next/server/app/api/whatsapp/messages/route_client-reference-manifest.js +1 -1
  192. package/.next/standalone/.next/server/app/api/whatsapp/qr/route_client-reference-manifest.js +1 -1
  193. package/.next/standalone/.next/server/app/api/whatsapp/send/route_client-reference-manifest.js +1 -1
  194. package/.next/standalone/.next/server/app/api/whatsapp/status/route_client-reference-manifest.js +1 -1
  195. package/.next/standalone/.next/server/app/approvals/page.js +1 -1
  196. package/.next/standalone/.next/server/app/approvals/page_client-reference-manifest.js +1 -1
  197. package/.next/standalone/.next/server/app/architecture/page_client-reference-manifest.js +1 -1
  198. package/.next/standalone/.next/server/app/architecture.html +2 -2
  199. package/.next/standalone/.next/server/app/architecture.rsc +2 -2
  200. package/.next/standalone/.next/server/app/audit/live/page_client-reference-manifest.js +1 -1
  201. package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
  202. package/.next/standalone/.next/server/app/brand/page_client-reference-manifest.js +1 -1
  203. package/.next/standalone/.next/server/app/brand.html +1 -1
  204. package/.next/standalone/.next/server/app/brand.rsc +2 -2
  205. package/.next/standalone/.next/server/app/disk/page_client-reference-manifest.js +1 -1
  206. package/.next/standalone/.next/server/app/federated-ai/page_client-reference-manifest.js +1 -1
  207. package/.next/standalone/.next/server/app/federated-ai.html +2 -2
  208. package/.next/standalone/.next/server/app/federated-ai.rsc +2 -2
  209. package/.next/standalone/.next/server/app/hail/[id]/governance/page_client-reference-manifest.js +1 -1
  210. package/.next/standalone/.next/server/app/hail/[id]/interview/page.js +1 -1
  211. package/.next/standalone/.next/server/app/hail/[id]/interview/page_client-reference-manifest.js +1 -1
  212. package/.next/standalone/.next/server/app/hail/[id]/page.js +1 -1
  213. package/.next/standalone/.next/server/app/hail/[id]/page_client-reference-manifest.js +1 -1
  214. package/.next/standalone/.next/server/app/hail/[id]/setup/page.js +2 -2
  215. package/.next/standalone/.next/server/app/hail/[id]/setup/page_client-reference-manifest.js +1 -1
  216. package/.next/standalone/.next/server/app/hail/page.js +1 -1
  217. package/.next/standalone/.next/server/app/hail/page_client-reference-manifest.js +1 -1
  218. package/.next/standalone/.next/server/app/help/[slug]/page_client-reference-manifest.js +1 -1
  219. package/.next/standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  220. package/.next/standalone/.next/server/app/index.html +2 -2
  221. package/.next/standalone/.next/server/app/index.rsc +2 -2
  222. package/.next/standalone/.next/server/app/join/page_client-reference-manifest.js +1 -1
  223. package/.next/standalone/.next/server/app/join.html +1 -1
  224. package/.next/standalone/.next/server/app/join.rsc +2 -2
  225. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  226. package/.next/standalone/.next/server/app/marketplace/page.js +4 -3
  227. package/.next/standalone/.next/server/app/marketplace/page.js.nft.json +1 -1
  228. package/.next/standalone/.next/server/app/marketplace/page_client-reference-manifest.js +1 -1
  229. package/.next/standalone/.next/server/app/mines/[projectId]/page_client-reference-manifest.js +1 -1
  230. package/.next/standalone/.next/server/app/mines/[projectId]/results/page_client-reference-manifest.js +1 -1
  231. package/.next/standalone/.next/server/app/mines/page_client-reference-manifest.js +1 -1
  232. package/.next/standalone/.next/server/app/missions/page.js +2 -2
  233. package/.next/standalone/.next/server/app/missions/page_client-reference-manifest.js +1 -1
  234. package/.next/standalone/.next/server/app/onboarding/org/page_client-reference-manifest.js +1 -1
  235. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  236. package/.next/standalone/.next/server/app/onboarding.html +2 -2
  237. package/.next/standalone/.next/server/app/onboarding.rsc +2 -2
  238. package/.next/standalone/.next/server/app/org/page.js +1 -1
  239. package/.next/standalone/.next/server/app/org/page.js.nft.json +1 -1
  240. package/.next/standalone/.next/server/app/org/page_client-reference-manifest.js +1 -1
  241. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  242. package/.next/standalone/.next/server/app/projects/[slug]/log/page_client-reference-manifest.js +1 -1
  243. package/.next/standalone/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
  244. package/.next/standalone/.next/server/app/projects/new/page.js +3 -2
  245. package/.next/standalone/.next/server/app/projects/new/page.js.nft.json +1 -1
  246. package/.next/standalone/.next/server/app/projects/new/page_client-reference-manifest.js +1 -1
  247. package/.next/standalone/.next/server/app/projects/new.html +1 -1
  248. package/.next/standalone/.next/server/app/projects/new.rsc +3 -3
  249. package/.next/standalone/.next/server/app/projects/page.js +32 -15
  250. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  251. package/.next/standalone/.next/server/app/reports/[file]/route_client-reference-manifest.js +1 -1
  252. package/.next/standalone/.next/server/app/reports/page_client-reference-manifest.js +1 -1
  253. package/.next/standalone/.next/server/app/runtime/page_client-reference-manifest.js +1 -1
  254. package/.next/standalone/.next/server/app/schedules/page.js +2 -2
  255. package/.next/standalone/.next/server/app/schedules/page_client-reference-manifest.js +1 -1
  256. package/.next/standalone/.next/server/app/settings/account/page_client-reference-manifest.js +1 -1
  257. package/.next/standalone/.next/server/app/settings/advanced/page_client-reference-manifest.js +1 -1
  258. package/.next/standalone/.next/server/app/settings/appearance/page.js +1 -1
  259. package/.next/standalone/.next/server/app/settings/appearance/page_client-reference-manifest.js +1 -1
  260. package/.next/standalone/.next/server/app/settings/brand/page.js +1 -1
  261. package/.next/standalone/.next/server/app/settings/brand/page_client-reference-manifest.js +1 -1
  262. package/.next/standalone/.next/server/app/settings/brand.html +2 -2
  263. package/.next/standalone/.next/server/app/settings/brand.rsc +3 -3
  264. package/.next/standalone/.next/server/app/settings/connectors/page_client-reference-manifest.js +1 -1
  265. package/.next/standalone/.next/server/app/settings/engines/page_client-reference-manifest.js +1 -1
  266. package/.next/standalone/.next/server/app/settings/onboarding/page.js +1 -1
  267. package/.next/standalone/.next/server/app/settings/onboarding/page_client-reference-manifest.js +1 -1
  268. package/.next/standalone/.next/server/app/settings/onboarding.html +2 -2
  269. package/.next/standalone/.next/server/app/settings/onboarding.rsc +3 -3
  270. package/.next/standalone/.next/server/app/settings/organization/page.js +2 -2
  271. package/.next/standalone/.next/server/app/settings/organization/page.js.nft.json +1 -1
  272. package/.next/standalone/.next/server/app/settings/organization/page_client-reference-manifest.js +1 -1
  273. package/.next/standalone/.next/server/app/settings/page.js +1 -1
  274. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  275. package/.next/standalone/.next/server/app/settings/runtime/page.js +1 -1
  276. package/.next/standalone/.next/server/app/settings/runtime/page_client-reference-manifest.js +1 -1
  277. package/.next/standalone/.next/server/app/settings/team/page.js +1 -1
  278. package/.next/standalone/.next/server/app/settings/team/page_client-reference-manifest.js +1 -1
  279. package/.next/standalone/.next/server/app/settings/tools/page_client-reference-manifest.js +1 -1
  280. package/.next/standalone/.next/server/app/settings.html +2 -2
  281. package/.next/standalone/.next/server/app/settings.rsc +3 -3
  282. package/.next/standalone/.next/server/app/share/[token]/page_client-reference-manifest.js +1 -1
  283. package/.next/standalone/.next/server/app/share/space/[token]/page_client-reference-manifest.js +1 -1
  284. package/.next/standalone/.next/server/app/tasks/[id]/page.js +2 -2
  285. package/.next/standalone/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  286. package/.next/standalone/.next/server/app/tasks/page.js +2 -2
  287. package/.next/standalone/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  288. package/.next/standalone/.next/server/app/team/[agentId]/page_client-reference-manifest.js +1 -1
  289. package/.next/standalone/.next/server/app/team/page_client-reference-manifest.js +1 -1
  290. package/.next/standalone/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  291. package/.next/standalone/.next/server/app/whatsapp/page_client-reference-manifest.js +1 -1
  292. package/.next/standalone/.next/server/app/whatsapp.html +1 -1
  293. package/.next/standalone/.next/server/app/whatsapp.rsc +2 -2
  294. package/.next/standalone/.next/server/app/workflows/[caseId]/page_client-reference-manifest.js +1 -1
  295. package/.next/standalone/.next/server/app/workflows/new/[caseId]/page_client-reference-manifest.js +1 -1
  296. package/.next/standalone/.next/server/app/workflows/new/definition/page_client-reference-manifest.js +1 -1
  297. package/.next/standalone/.next/server/app/workflows/page_client-reference-manifest.js +1 -1
  298. package/.next/standalone/.next/server/app/workflows/share/[caseId]/page_client-reference-manifest.js +1 -1
  299. package/.next/standalone/.next/server/app-paths-manifest.json +81 -81
  300. package/.next/standalone/.next/server/chunks/1648.js +1 -1
  301. package/.next/standalone/.next/server/chunks/1699.js +39 -22
  302. package/.next/standalone/.next/server/chunks/3230.js +2 -2
  303. package/.next/standalone/.next/server/chunks/5093.js +1 -0
  304. package/.next/standalone/.next/server/chunks/5864.js +1 -0
  305. package/.next/standalone/.next/server/chunks/{9801.js → 7500.js} +1 -1
  306. package/.next/standalone/.next/server/functions-config-manifest.json +42 -42
  307. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  308. package/.next/standalone/.next/server/pages/404.html +1 -1
  309. package/.next/standalone/.next/server/pages/500.html +1 -1
  310. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  311. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  312. package/.next/standalone/.next/static/chunks/7695-04c7f1a5233de027.js +1 -0
  313. package/.next/standalone/.next/static/chunks/app/agents/[id]/page-474f640e84f7b4b5.js +1 -0
  314. package/.next/standalone/.next/static/chunks/app/agents/page-b79b611acd56712b.js +1 -0
  315. package/.next/standalone/.next/static/chunks/app/marketplace/page-0b7d3a6309302de3.js +1 -0
  316. package/.next/standalone/.next/static/chunks/app/projects/page-e1cfb0b17418e719.js +1 -0
  317. package/.next/standalone/.next/static/chunks/app/settings/layout-08f6b30132b26dd1.js +1 -0
  318. package/.next/standalone/.next/static/chunks/app/settings/team/page-9a2e675124de6aac.js +1 -0
  319. package/.next/standalone/.next/static/css/{65c472079b6fd086.css → 9fbf057b7ce95c36.css} +1 -1
  320. package/.next/standalone/CHANGELOG.md +14 -0
  321. package/.next/standalone/data/.artifacts-migrated-v1 +1 -1
  322. package/.next/standalone/data/.default-project-seeded +1 -1
  323. package/.next/standalone/data/madarx.sqlite +0 -0
  324. package/.next/standalone/data/madarx.sqlite-shm +0 -0
  325. package/.next/standalone/data/madarx.sqlite-wal +0 -0
  326. package/.next/standalone/package.json +1 -1
  327. package/.next/static/chunks/7695-04c7f1a5233de027.js +1 -0
  328. package/.next/static/chunks/app/agents/[id]/page-474f640e84f7b4b5.js +1 -0
  329. package/.next/static/chunks/app/agents/page-b79b611acd56712b.js +1 -0
  330. package/.next/static/chunks/app/marketplace/page-0b7d3a6309302de3.js +1 -0
  331. package/.next/static/chunks/app/projects/page-e1cfb0b17418e719.js +1 -0
  332. package/.next/static/chunks/app/settings/layout-08f6b30132b26dd1.js +1 -0
  333. package/.next/static/chunks/app/settings/team/page-9a2e675124de6aac.js +1 -0
  334. package/.next/static/css/{65c472079b6fd086.css → 9fbf057b7ce95c36.css} +1 -1
  335. package/CHANGELOG.md +14 -0
  336. package/app/agents/[id]/agent-activity-feed.tsx +96 -0
  337. package/app/agents/[id]/agent-detail-simple.tsx +71 -83
  338. package/app/agents/[id]/agent-quick-controls.tsx +497 -0
  339. package/app/agents/[id]/page.js +90 -2
  340. package/app/api/connections/[service]/verify/route.js +17 -2
  341. package/app/globals.css +347 -32
  342. package/lib/agent-templates.js +12 -0
  343. package/lib/connection-grant.js +106 -0
  344. package/lib/connection-seeds.js +126 -0
  345. package/lib/connections/health-check-verify.js +114 -0
  346. package/lib/connections/manifest-validator.js +161 -0
  347. package/lib/marketplace-modules.js +45 -0
  348. package/lib/marketplace-seeds.js +105 -0
  349. package/lib/marketplace.js +1 -0
  350. package/lib/oauth/flow.js +204 -0
  351. package/lib/oauth/provider-registry.js +102 -0
  352. package/lib/runtime.js +74 -1
  353. package/lib/schema.js +17 -0
  354. package/lib/tools/adapters/http-api-call.js +92 -28
  355. package/lib/tools/connectors/connector-validator.js +27 -1
  356. package/package.json +1 -1
  357. package/.next/standalone/.next/server/chunks/1887.js +0 -2
  358. package/.next/standalone/.next/server/chunks/3711.js +0 -1
  359. package/.next/standalone/.next/server/chunks/6098.js +0 -1
  360. package/.next/standalone/.next/static/chunks/9077-f54ea987eb597e43.js +0 -1
  361. package/.next/standalone/.next/static/chunks/app/agents/[id]/page-66477263de089865.js +0 -1
  362. package/.next/standalone/.next/static/chunks/app/agents/page-64d6bdc6ba3ad4d7.js +0 -1
  363. package/.next/standalone/.next/static/chunks/app/marketplace/page-45c6d49f8eddad67.js +0 -1
  364. package/.next/standalone/.next/static/chunks/app/projects/page-15a7a85fa216b575.js +0 -1
  365. package/.next/standalone/.next/static/chunks/app/settings/layout-2c1e6807acb6fdad.js +0 -1
  366. package/.next/standalone/.next/static/chunks/app/settings/team/page-0aee40dfa9e7a430.js +0 -1
  367. package/.next/static/chunks/9077-f54ea987eb597e43.js +0 -1
  368. package/.next/static/chunks/app/agents/[id]/page-66477263de089865.js +0 -1
  369. package/.next/static/chunks/app/agents/page-64d6bdc6ba3ad4d7.js +0 -1
  370. package/.next/static/chunks/app/marketplace/page-45c6d49f8eddad67.js +0 -1
  371. package/.next/static/chunks/app/projects/page-15a7a85fa216b575.js +0 -1
  372. package/.next/static/chunks/app/settings/layout-2c1e6807acb6fdad.js +0 -1
  373. package/.next/static/chunks/app/settings/team/page-0aee40dfa9e7a430.js +0 -1
  374. /package/.next/standalone/.next/static/{JcJc6PlL89SQvtZvP-LnU → JGJBLnQfb05RAKCcECbJt}/_buildManifest.js +0 -0
  375. /package/.next/standalone/.next/static/{JcJc6PlL89SQvtZvP-LnU → JGJBLnQfb05RAKCcECbJt}/_ssgManifest.js +0 -0
  376. /package/.next/static/{JcJc6PlL89SQvtZvP-LnU → JGJBLnQfb05RAKCcECbJt}/_buildManifest.js +0 -0
  377. /package/.next/static/{JcJc6PlL89SQvtZvP-LnU → JGJBLnQfb05RAKCcECbJt}/_ssgManifest.js +0 -0
@@ -0,0 +1,497 @@
1
+ 'use client';
2
+
3
+ import { useMemo, useState } from 'react';
4
+ import { Pencil, X, Search, Wrench } from 'lucide-react';
5
+ import EngineModelPicker from '../engine-model-picker.jsx';
6
+ import { ToolIcon, getToolIcon } from '@/app/components/ui/tool-icons';
7
+ import { humanizeSchedule } from './format-helpers';
8
+
9
+ type Engine = {
10
+ id: string;
11
+ label: string;
12
+ available?: boolean;
13
+ default_model?: string;
14
+ models?: { name: string }[];
15
+ };
16
+
17
+ type ToolDef = {
18
+ name: string;
19
+ title: string;
20
+ description: string;
21
+ category: string;
22
+ risk_level: string;
23
+ available: boolean;
24
+ missing_env: string[];
25
+ };
26
+
27
+ type ServerAction = (formData: FormData) => Promise<void>;
28
+
29
+ type EditorKey = 'publish' | 'model' | 'schedule' | 'tools';
30
+
31
+ export function AgentQuickControls({
32
+ agentId,
33
+ engine,
34
+ model,
35
+ engines,
36
+ scheduleRaw,
37
+ lastRun,
38
+ statusLabel,
39
+ statusTone,
40
+ defaultSpaceId,
41
+ spaces,
42
+ agentTools,
43
+ availableTools,
44
+ toolCategories,
45
+ updateModelAction,
46
+ updateScheduleAction,
47
+ updateToolsAction,
48
+ updateDefaultSpaceAction,
49
+ }: {
50
+ agentId: string;
51
+ engine: string;
52
+ model: string;
53
+ engines: Engine[];
54
+ scheduleRaw: string;
55
+ lastRun: string | null;
56
+ statusLabel: string;
57
+ statusTone: string;
58
+ defaultSpaceId: string | null;
59
+ spaces: { id: string; name: string }[];
60
+ agentTools: string[];
61
+ availableTools: ToolDef[];
62
+ toolCategories: string[];
63
+ updateModelAction: ServerAction;
64
+ updateScheduleAction: ServerAction;
65
+ updateToolsAction: ServerAction;
66
+ updateDefaultSpaceAction: ServerAction;
67
+ }) {
68
+ const [open, setOpen] = useState<EditorKey | null>(null);
69
+ const toggle = (key: EditorKey) => setOpen((cur) => (cur === key ? null : key));
70
+
71
+ const engineLabel = engines.find((e) => e.id === engine)?.label || engine || '—';
72
+ const modelValue = model ? model : 'default';
73
+ const spaceValue = spaces.find((s) => s.id === defaultSpaceId)?.name || 'Active space (default)';
74
+
75
+ return (
76
+ <div className="ad-controls">
77
+ {/* Glanceable facts. Publish, Model + Schedule are tap-to-edit;
78
+ Last run + Status are read-only. */}
79
+ <div className="ad-facts">
80
+ <EditableFact
81
+ label="Publish artifacts to"
82
+ value={spaceValue}
83
+ active={open === 'publish'}
84
+ onClick={() => toggle('publish')}
85
+ />
86
+
87
+ <EditableFact
88
+ label="Model"
89
+ value={`${engineLabel} · ${modelValue}`}
90
+ active={open === 'model'}
91
+ onClick={() => toggle('model')}
92
+ />
93
+
94
+ <EditableFact
95
+ label="Schedule"
96
+ value={humanizeSchedule(scheduleRaw)}
97
+ active={open === 'schedule'}
98
+ onClick={() => toggle('schedule')}
99
+ />
100
+
101
+ <div className="ad-fact ad-fact--static">
102
+ <span className="ad-fact-label">Last run</span>
103
+ <span className="ad-fact-value">{lastRun || 'Never run yet'}</span>
104
+ </div>
105
+
106
+ <div className="ad-fact ad-fact--static">
107
+ <span className="ad-fact-label">Status</span>
108
+ <span className={`ad-fact-value ad-fact-status tone-${statusTone}`}>
109
+ <span className="ad-dot" aria-hidden />
110
+ {statusLabel}
111
+ </span>
112
+ </div>
113
+ </div>
114
+
115
+ {/* Tools — shown as icons, editable in one place. */}
116
+ <div className="ad-tools-strip">
117
+ <span className="ad-fact-label">Tools</span>
118
+ <div className="ad-tools-icons">
119
+ {toolCategories.length ? (
120
+ toolCategories.slice(0, 10).map((category) => {
121
+ const entry = getToolIcon(category);
122
+ return (
123
+ <span key={category} className="ad-tool-chip" title={entry?.label || category}>
124
+ <ToolIcon category={category} size={14} />
125
+ </span>
126
+ );
127
+ })
128
+ ) : (
129
+ <span className="ad-tools-empty">No tools yet</span>
130
+ )}
131
+ </div>
132
+ <button
133
+ type="button"
134
+ className={`admin-button secondary ad-edit-btn ${open === 'tools' ? 'on' : ''}`}
135
+ onClick={() => toggle('tools')}
136
+ >
137
+ <Wrench size={13} />
138
+ {agentTools.length ? 'Edit tools' : 'Add tools'}
139
+ </button>
140
+ </div>
141
+
142
+ {/* Shared editor drawer — one open at a time. */}
143
+ <div className="ad-drawer" data-open={open ? 'true' : 'false'}>
144
+ <div className="ad-drawer-inner">
145
+ {open === 'publish' ? (
146
+ <EditorPanel title="Where artifacts are saved" onClose={() => setOpen(null)}>
147
+ <form action={updateDefaultSpaceAction} className="ad-editor-form">
148
+ <input type="hidden" name="agent_id" value={agentId} />
149
+ <label className="ad-field">
150
+ <span>Publish artifacts to</span>
151
+ <select
152
+ name="default_space_id"
153
+ defaultValue={defaultSpaceId || ''}
154
+ className="admin-input"
155
+ >
156
+ <option value="">Active space (default)</option>
157
+ {spaces.map((s) => (
158
+ <option key={s.id} value={s.id}>{s.name}</option>
159
+ ))}
160
+ </select>
161
+ </label>
162
+ <div className="ad-editor-actions">
163
+ <button type="submit" className="admin-button">Save destination</button>
164
+ <button type="button" className="admin-button secondary" onClick={() => setOpen(null)}>Cancel</button>
165
+ </div>
166
+ </form>
167
+ </EditorPanel>
168
+ ) : null}
169
+
170
+ {open === 'model' ? (
171
+ <EditorPanel title="Choose the model" onClose={() => setOpen(null)}>
172
+ <form action={updateModelAction} className="ad-editor-form">
173
+ <input type="hidden" name="agent_id" value={agentId} />
174
+ <div className="ad-editor-row">
175
+ <EngineModelPicker engines={engines} initialEngine={engine} initialModel={model || ''} />
176
+ </div>
177
+ <div className="ad-editor-actions">
178
+ <button type="submit" className="admin-button">Save model</button>
179
+ <button type="button" className="admin-button secondary" onClick={() => setOpen(null)}>Cancel</button>
180
+ </div>
181
+ </form>
182
+ </EditorPanel>
183
+ ) : null}
184
+
185
+ {open === 'schedule' ? (
186
+ <EditorPanel title="Set the schedule" onClose={() => setOpen(null)}>
187
+ <ScheduleComposer
188
+ agentId={agentId}
189
+ initial={scheduleRaw}
190
+ action={updateScheduleAction}
191
+ onCancel={() => setOpen(null)}
192
+ />
193
+ </EditorPanel>
194
+ ) : null}
195
+
196
+ {open === 'tools' ? (
197
+ <EditorPanel title="Pick this agent's tools" onClose={() => setOpen(null)}>
198
+ <ToolsPicker
199
+ agentId={agentId}
200
+ selected={agentTools}
201
+ tools={availableTools}
202
+ action={updateToolsAction}
203
+ onCancel={() => setOpen(null)}
204
+ />
205
+ </EditorPanel>
206
+ ) : null}
207
+ </div>
208
+ </div>
209
+ </div>
210
+ );
211
+ }
212
+
213
+ function EditableFact({
214
+ label,
215
+ value,
216
+ active,
217
+ onClick,
218
+ }: {
219
+ label: string;
220
+ value: string;
221
+ active: boolean;
222
+ onClick: () => void;
223
+ }) {
224
+ return (
225
+ <button
226
+ type="button"
227
+ className={`ad-fact ad-fact--edit ${active ? 'is-active' : ''}`}
228
+ onClick={onClick}
229
+ aria-expanded={active}
230
+ >
231
+ <span className="ad-fact-label">{label}</span>
232
+ <span className="ad-fact-value">{value}</span>
233
+ <span className="ad-fact-edit" aria-hidden>
234
+ <Pencil size={12} />
235
+ </span>
236
+ </button>
237
+ );
238
+ }
239
+
240
+ function EditorPanel({
241
+ title,
242
+ onClose,
243
+ children,
244
+ }: {
245
+ title: string;
246
+ onClose: () => void;
247
+ children: React.ReactNode;
248
+ }) {
249
+ return (
250
+ <section className="ad-editor">
251
+ <header className="ad-editor-head">
252
+ <h3>{title}</h3>
253
+ <button type="button" className="ad-editor-close" aria-label="Close" onClick={onClose}>
254
+ <X size={14} />
255
+ </button>
256
+ </header>
257
+ {children}
258
+ </section>
259
+ );
260
+ }
261
+
262
+ /* ---- Schedule composer ------------------------------------------------- */
263
+
264
+ type Freq = 'ondemand' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'advanced';
265
+
266
+ const WEEKDAYS = [
267
+ ['mon', 'Monday'], ['tue', 'Tuesday'], ['wed', 'Wednesday'], ['thu', 'Thursday'],
268
+ ['fri', 'Friday'], ['sat', 'Saturday'], ['sun', 'Sunday'],
269
+ ] as const;
270
+
271
+ function parseSchedule(raw: string): {
272
+ freq: Freq; time: string; day: string; dom: string; everyN: number; advanced: string;
273
+ } {
274
+ const s = String(raw || '').trim().toLowerCase();
275
+ const base = { freq: 'ondemand' as Freq, time: '09:00', day: 'mon', dom: '1', everyN: 1, advanced: s };
276
+ if (!s || ['on demand', 'manual', 'event based', 'live'].includes(s)) return base;
277
+ let m;
278
+ if ((m = s.match(/^every\s+(\d+)\s*h$/))) return { ...base, freq: 'hourly', everyN: Number(m[1]) };
279
+ if ((m = s.match(/^daily\s+(\d{1,2}):(\d{2})$/))) return { ...base, freq: 'daily', time: `${m[1].padStart(2, '0')}:${m[2]}` };
280
+ if ((m = s.match(/^weekly\s+(\w+)\s+(\d{1,2}):(\d{2})$/))) return { ...base, freq: 'weekly', day: m[1].slice(0, 3), time: `${m[2].padStart(2, '0')}:${m[3]}` };
281
+ if ((m = s.match(/^monthly\s+(last|\d{1,2})\s+(\d{1,2}):(\d{2})$/))) return { ...base, freq: 'monthly', dom: m[1], time: `${m[2].padStart(2, '0')}:${m[3]}` };
282
+ return { ...base, freq: 'advanced', advanced: s };
283
+ }
284
+
285
+ function composeSchedule(state: {
286
+ freq: Freq; time: string; day: string; dom: string; everyN: number; advanced: string;
287
+ }): string {
288
+ switch (state.freq) {
289
+ case 'ondemand': return 'on demand';
290
+ case 'hourly': return `every ${Math.max(1, state.everyN)}h`;
291
+ case 'daily': return `daily ${state.time}`;
292
+ case 'weekly': return `weekly ${state.day} ${state.time}`;
293
+ case 'monthly': return `monthly ${state.dom} ${state.time}`;
294
+ case 'advanced': return state.advanced.trim() || 'on demand';
295
+ }
296
+ }
297
+
298
+ function ScheduleComposer({
299
+ agentId,
300
+ initial,
301
+ action,
302
+ onCancel,
303
+ }: {
304
+ agentId: string;
305
+ initial: string;
306
+ action: ServerAction;
307
+ onCancel: () => void;
308
+ }) {
309
+ const [state, setState] = useState(() => parseSchedule(initial));
310
+ const set = (patch: Partial<typeof state>) => setState((s) => ({ ...s, ...patch }));
311
+ const schedule = composeSchedule(state);
312
+
313
+ return (
314
+ <form action={action} className="ad-editor-form">
315
+ <input type="hidden" name="agent_id" value={agentId} />
316
+ <input type="hidden" name="schedule" value={schedule} />
317
+
318
+ <div className="ad-sched-grid">
319
+ <label className="ad-field">
320
+ <span>Frequency</span>
321
+ <select value={state.freq} onChange={(e) => set({ freq: e.target.value as Freq })} className="admin-input">
322
+ <option value="ondemand">On demand</option>
323
+ <option value="hourly">Hourly</option>
324
+ <option value="daily">Daily</option>
325
+ <option value="weekly">Weekly</option>
326
+ <option value="monthly">Monthly</option>
327
+ <option value="advanced">Advanced…</option>
328
+ </select>
329
+ </label>
330
+
331
+ {state.freq === 'hourly' ? (
332
+ <label className="ad-field">
333
+ <span>Every</span>
334
+ <span className="ad-inline-num">
335
+ <input
336
+ type="number" min={1} max={24} value={state.everyN}
337
+ onChange={(e) => set({ everyN: Number(e.target.value) })}
338
+ className="admin-input"
339
+ />
340
+ <em>hours</em>
341
+ </span>
342
+ </label>
343
+ ) : null}
344
+
345
+ {(state.freq === 'daily' || state.freq === 'weekly' || state.freq === 'monthly') ? (
346
+ <label className="ad-field">
347
+ <span>At</span>
348
+ <input type="time" value={state.time} onChange={(e) => set({ time: e.target.value })} className="admin-input" />
349
+ </label>
350
+ ) : null}
351
+
352
+ {state.freq === 'weekly' ? (
353
+ <label className="ad-field">
354
+ <span>On</span>
355
+ <select value={state.day} onChange={(e) => set({ day: e.target.value })} className="admin-input">
356
+ {WEEKDAYS.map(([v, l]) => <option key={v} value={v}>{l}</option>)}
357
+ </select>
358
+ </label>
359
+ ) : null}
360
+
361
+ {state.freq === 'monthly' ? (
362
+ <label className="ad-field">
363
+ <span>Day</span>
364
+ <select value={state.dom} onChange={(e) => set({ dom: e.target.value })} className="admin-input">
365
+ {Array.from({ length: 28 }, (_, i) => String(i + 1)).map((d) => (
366
+ <option key={d} value={d}>{d}</option>
367
+ ))}
368
+ <option value="last">Last day</option>
369
+ </select>
370
+ </label>
371
+ ) : null}
372
+
373
+ {state.freq === 'advanced' ? (
374
+ <label className="ad-field ad-field--wide">
375
+ <span>Schedule expression</span>
376
+ <input
377
+ type="text" value={state.advanced}
378
+ onChange={(e) => set({ advanced: e.target.value })}
379
+ placeholder="e.g. every 5m · daily 07:30 · weekly fri 17:00"
380
+ className="admin-input"
381
+ />
382
+ </label>
383
+ ) : null}
384
+ </div>
385
+
386
+ <p className="ad-sched-preview">{humanizeSchedule(schedule)}</p>
387
+
388
+ <div className="ad-editor-actions">
389
+ <button type="submit" className="admin-button">Save schedule</button>
390
+ <button type="button" className="admin-button secondary" onClick={onCancel}>Cancel</button>
391
+ </div>
392
+ </form>
393
+ );
394
+ }
395
+
396
+ /* ---- Tools picker ------------------------------------------------------ */
397
+
398
+ function ToolsPicker({
399
+ agentId,
400
+ selected,
401
+ tools,
402
+ action,
403
+ onCancel,
404
+ }: {
405
+ agentId: string;
406
+ selected: string[];
407
+ tools: ToolDef[];
408
+ action: ServerAction;
409
+ onCancel: () => void;
410
+ }) {
411
+ const [chosen, setChosen] = useState<Set<string>>(() => new Set(selected));
412
+ const [query, setQuery] = useState('');
413
+
414
+ const toggle = (name: string) =>
415
+ setChosen((cur) => {
416
+ const next = new Set(cur);
417
+ if (next.has(name)) next.delete(name); else next.add(name);
418
+ return next;
419
+ });
420
+
421
+ // Group available tools by category; keep currently-selected tools visible
422
+ // even if they're filtered out by search.
423
+ const groups = useMemo(() => {
424
+ const q = query.trim().toLowerCase();
425
+ const byCat = new Map<string, ToolDef[]>();
426
+ for (const tool of tools) {
427
+ const match = !q
428
+ || tool.title.toLowerCase().includes(q)
429
+ || tool.name.toLowerCase().includes(q)
430
+ || tool.description.toLowerCase().includes(q);
431
+ if (!match && !chosen.has(tool.name)) continue;
432
+ const cat = tool.category || 'core';
433
+ if (!byCat.has(cat)) byCat.set(cat, []);
434
+ byCat.get(cat)!.push(tool);
435
+ }
436
+ return [...byCat.entries()].sort((a, b) => a[0].localeCompare(b[0]));
437
+ }, [tools, query, chosen]);
438
+
439
+ return (
440
+ <form action={action} className="ad-editor-form">
441
+ <input type="hidden" name="agent_id" value={agentId} />
442
+ {[...chosen].map((name) => <input key={name} type="hidden" name="tool" value={name} />)}
443
+
444
+ <div className="ad-tools-search">
445
+ <Search size={14} aria-hidden />
446
+ <input
447
+ type="text" value={query} onChange={(e) => setQuery(e.target.value)}
448
+ placeholder="Search tools" aria-label="Search tools"
449
+ />
450
+ <span className="ad-tools-count">{chosen.size} selected</span>
451
+ </div>
452
+
453
+ <div className="ad-tools-groups">
454
+ {groups.length ? groups.map(([cat, list]) => {
455
+ const entry = getToolIcon(cat);
456
+ return (
457
+ <div key={cat} className="ad-tools-group">
458
+ <div className="ad-tools-group-head">
459
+ <ToolIcon category={cat} size={13} />
460
+ <span>{entry?.label || cat}</span>
461
+ </div>
462
+ <div className="ad-tools-options">
463
+ {list.map((tool) => {
464
+ const on = chosen.has(tool.name);
465
+ const unavailable = !tool.available;
466
+ return (
467
+ <button
468
+ key={tool.name}
469
+ type="button"
470
+ className={`ad-tool-option ${on ? 'is-on' : ''}`}
471
+ onClick={() => toggle(tool.name)}
472
+ title={tool.description}
473
+ aria-pressed={on}
474
+ >
475
+ <span className="ad-tool-option-name">{tool.title}</span>
476
+ {tool.risk_level !== 'low' ? (
477
+ <span className="ad-tool-tag">approval</span>
478
+ ) : null}
479
+ {unavailable ? <span className="ad-tool-tag warn">setup</span> : null}
480
+ </button>
481
+ );
482
+ })}
483
+ </div>
484
+ </div>
485
+ );
486
+ }) : (
487
+ <p className="ad-tools-noresult">No tools match “{query}”.</p>
488
+ )}
489
+ </div>
490
+
491
+ <div className="ad-editor-actions">
492
+ <button type="submit" className="admin-button">Save tools</button>
493
+ <button type="button" className="admin-button secondary" onClick={onCancel}>Cancel</button>
494
+ </div>
495
+ </form>
496
+ );
497
+ }
@@ -1,7 +1,9 @@
1
1
  import { revalidatePath } from 'next/cache';
2
2
  import { notFound, redirect } from 'next/navigation';
3
3
  import { AdminShell, EmptyState, StatusPill } from '@/app/components/admin/admin-page.jsx';
4
- import { appendAudit, deleteAgentMemory, getAgent, getAgentMemory, listAgentToolPermissions, listArtifacts, listAudit, listRuns, listSchedules, updateAgent } from '@/lib/runtime.js';
4
+ import { appendAudit, deleteAgentMemory, getAgent, getAgentMemory, listAgentToolPermissions, listArtifacts, listAudit, listRuns, listSchedules, updateAgent, updateAgentToolset, upsertSchedule } from '@/lib/runtime.js';
5
+ import { listMarketplaceTools } from '@/lib/tools/registry.js';
6
+ import { listApprovalRequests } from '@/lib/approvals.js';
5
7
  import { listSpaces } from '@/lib/dashboard-spaces.js';
6
8
  import { listAgentEngines } from '@/lib/agent-engines.js';
7
9
  import { defaultAgentSkillsTemplate, readAgentSkills, writeAgentSkills } from '@/lib/agent-skills.js';
@@ -219,9 +221,48 @@ export default async function AgentDetailPage({ params, searchParams }) {
219
221
  );
220
222
 
221
223
  if (view === 'simple') {
222
- const description = agent.mission || 'Open Details to configure skills, memory, permissions, and engine.';
224
+ const description = agent.mission || 'Open Configuration to set skills, memory, permissions, and engine.';
223
225
  const { spaces } = listSpaces();
224
226
 
227
+ // The full tool catalogue, slimmed to what the picker needs. The registry
228
+ // already carries each tool's category, so icons resolve without regex.
229
+ const registryTools = listMarketplaceTools();
230
+ const availableTools = registryTools.map(tool => ({
231
+ name: tool.name,
232
+ title: tool.title || tool.name,
233
+ description: tool.description || '',
234
+ category: tool.category || 'core',
235
+ risk_level: tool.risk_level || 'medium',
236
+ available: tool.available !== false,
237
+ missing_env: tool.missing_env || [],
238
+ }));
239
+ const categoryByTool = new Map(availableTools.map(t => [t.name, t.category]));
240
+ const agentTools = Array.isArray(agent.tools) ? agent.tools : [];
241
+
242
+ // One searchable feed: executions (runs) + the approvals this agent raised.
243
+ const executionItems = runs.map(run => ({
244
+ id: `run-${run.id}`,
245
+ kind: 'execution',
246
+ status: run.status || '',
247
+ title: run.title || run.kind || 'Run',
248
+ at: run.at || null,
249
+ }));
250
+ const approvalItems = listApprovalRequests({ limit: 200 })
251
+ .filter(req => req.payload?.agent_id === agent.id
252
+ || req.requested_by === agent.id
253
+ || String(req.summary || '').includes(agent.id))
254
+ .map(req => ({
255
+ id: `approval-${req.id}`,
256
+ kind: 'approval',
257
+ status: req.status || '',
258
+ title: req.summary || req.action_type || 'Approval',
259
+ risk: req.risk || null,
260
+ at: req.decided_at || req.created_at || null,
261
+ }));
262
+ const activity = [...executionItems, ...approvalItems]
263
+ .sort((a, b) => String(b.at || '').localeCompare(String(a.at || '')))
264
+ .slice(0, 40);
265
+
225
266
  async function updateDefaultSpaceAction(formData) {
226
267
  'use server';
227
268
  const agentId = String(formData.get('agent_id') || '');
@@ -233,6 +274,45 @@ export default async function AgentDetailPage({ params, searchParams }) {
233
274
  redirect(`/agents/${agentId}`);
234
275
  }
235
276
 
277
+ async function updateModelSimpleAction(formData) {
278
+ 'use server';
279
+ const agentId = String(formData.get('agent_id') || '');
280
+ const a = agentId ? getAgent(agentId) : null;
281
+ if (!a) redirect('/agents');
282
+ const engine = String(formData.get('engine') || '');
283
+ const model = String(formData.get('model') || '').trim();
284
+ if (engine) updateAgent(a.id, { engine, model: model || undefined });
285
+ revalidatePath('/agents');
286
+ revalidatePath(`/agents/${a.id}`);
287
+ redirect(`/agents/${a.id}`);
288
+ }
289
+
290
+ async function updateScheduleSimpleAction(formData) {
291
+ 'use server';
292
+ const agentId = String(formData.get('agent_id') || '');
293
+ const a = agentId ? getAgent(agentId) : null;
294
+ if (!a) redirect('/agents');
295
+ const schedule = String(formData.get('schedule') || 'on demand').trim() || 'on demand';
296
+ upsertSchedule({ agent_id: a.id, name: a.name, schedule, action_kind: 'agent-tick' });
297
+ updateAgent(a.id, { schedule });
298
+ revalidatePath('/agents');
299
+ revalidatePath('/schedules');
300
+ revalidatePath(`/agents/${a.id}`);
301
+ redirect(`/agents/${a.id}`);
302
+ }
303
+
304
+ async function updateToolsSimpleAction(formData) {
305
+ 'use server';
306
+ const agentId = String(formData.get('agent_id') || '');
307
+ const a = agentId ? getAgent(agentId) : null;
308
+ if (!a) redirect('/agents');
309
+ const tools = formData.getAll('tool').map(t => String(t || '').trim()).filter(Boolean);
310
+ updateAgentToolset(a.id, tools);
311
+ revalidatePath('/agents');
312
+ revalidatePath(`/agents/${a.id}`);
313
+ redirect(`/agents/${a.id}`);
314
+ }
315
+
236
316
  return (
237
317
  <AdminShell
238
318
  kicker="Agent"
@@ -246,8 +326,16 @@ export default async function AgentDetailPage({ params, searchParams }) {
246
326
  agent={agent}
247
327
  scheduleRaw={scheduleRaw}
248
328
  recentRuns={runs}
329
+ activity={activity}
249
330
  spaces={spaces}
331
+ engines={engines}
332
+ agentTools={agentTools}
333
+ availableTools={availableTools}
334
+ toolCategories={[...new Set(agentTools.map(t => categoryByTool.get(t)).filter(Boolean))]}
250
335
  updateDefaultSpaceAction={updateDefaultSpaceAction}
336
+ updateModelAction={updateModelSimpleAction}
337
+ updateScheduleAction={updateScheduleSimpleAction}
338
+ updateToolsAction={updateToolsSimpleAction}
251
339
  />
252
340
  </div>
253
341
  </AdminShell>
@@ -14,8 +14,9 @@
14
14
  // whatsapp — qr_pair (reads bridge health)
15
15
  // hermes — binary_detect (reads local FS)
16
16
 
17
- import { getConnection, markConnectionVerified } from '../../../../../lib/connections.js';
17
+ import { getConnection, markConnectionVerified, credentialNamesFor } from '../../../../../lib/connections.js';
18
18
  import { markInstanceVerified, normalizeScopeInput } from '../../../../../lib/connection-instances.js';
19
+ import { verifyViaHealthCheck } from '../../../../../lib/connections/health-check-verify.js';
19
20
  import { summarizeConnection, fingerprintLast4 } from '../../../../../lib/connection-status.js';
20
21
  import { setSecret } from '../../../../../lib/secrets.js';
21
22
  import { wrapFetch } from '../../../../../lib/egress.js';
@@ -368,7 +369,21 @@ export async function POST(request, context) {
368
369
  return Response.json({ ok: false, reason: 'not_found', error: friendly('not_found') }, { status: 404 });
369
370
  }
370
371
 
371
- const verifier = VERIFIERS[service];
372
+ // Curated verifier wins; otherwise fall back to a generic health_check verifier
373
+ // driven entirely by the connection manifest. This gives every Tool-Smith /
374
+ // OAuth connection that declares `health_check` a working "Test connection" with
375
+ // no edits to this route. The fallback persists whatever credential fields the
376
+ // manifest declares.
377
+ let verifier = VERIFIERS[service];
378
+ if (!verifier) {
379
+ const healthCheck = connection.manifest?.health_check;
380
+ if (healthCheck) {
381
+ verifier = {
382
+ fn: (creds) => verifyViaHealthCheck(healthCheck, creds, { serviceKey: service }),
383
+ persist: credentialNamesFor(connection),
384
+ };
385
+ }
386
+ }
372
387
  if (!verifier) {
373
388
  return Response.json(
374
389
  { ok: false, reason: 'unsupported', error: friendly('unsupported') },