madarx 2.14.0 → 2.15.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 (333) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +579 -579
  3. package/.next/standalone/.next/app-path-routes-manifest.json +77 -77
  4. package/.next/standalone/.next/build-manifest.json +5 -5
  5. package/.next/standalone/.next/prerender-manifest.json +3 -3
  6. package/.next/standalone/.next/react-loadable-manifest.json +1 -1
  7. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  8. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  9. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  10. package/.next/standalone/.next/server/app/activity/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/admin/page.js +3 -3
  12. package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/.next/server/app/agents/[id]/page.js +3 -3
  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_client-reference-manifest.js +1 -1
  17. package/.next/standalone/.next/server/app/api/activity/route_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/api/admin/audit-export/route_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/api/admin/share-links/route_client-reference-manifest.js +1 -1
  20. package/.next/standalone/.next/server/app/api/agent-memory/route_client-reference-manifest.js +1 -1
  21. package/.next/standalone/.next/server/app/api/agent-runs/[id]/cancel/route_client-reference-manifest.js +1 -1
  22. package/.next/standalone/.next/server/app/api/agent-runs/[id]/events/route_client-reference-manifest.js +1 -1
  23. package/.next/standalone/.next/server/app/api/agent-runs/[id]/log/route_client-reference-manifest.js +1 -1
  24. package/.next/standalone/.next/server/app/api/agent-runs/[id]/route_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/api/agent-runs/route_client-reference-manifest.js +1 -1
  26. package/.next/standalone/.next/server/app/api/agents/[id]/chain/route_client-reference-manifest.js +1 -1
  27. package/.next/standalone/.next/server/app/api/agents/[id]/memory/route_client-reference-manifest.js +1 -1
  28. package/.next/standalone/.next/server/app/api/agents/[id]/reports/route_client-reference-manifest.js +1 -1
  29. package/.next/standalone/.next/server/app/api/agents/[id]/run/route_client-reference-manifest.js +1 -1
  30. package/.next/standalone/.next/server/app/api/agents/[id]/skills/route_client-reference-manifest.js +1 -1
  31. package/.next/standalone/.next/server/app/api/agents/create/route_client-reference-manifest.js +1 -1
  32. package/.next/standalone/.next/server/app/api/agents/ops/route_client-reference-manifest.js +1 -1
  33. package/.next/standalone/.next/server/app/api/approvals/[id]/route_client-reference-manifest.js +1 -1
  34. package/.next/standalone/.next/server/app/api/approvals/route_client-reference-manifest.js +1 -1
  35. package/.next/standalone/.next/server/app/api/artifacts/[id]/acl/route_client-reference-manifest.js +1 -1
  36. package/.next/standalone/.next/server/app/api/artifacts/[id]/protect/route_client-reference-manifest.js +1 -1
  37. package/.next/standalone/.next/server/app/api/artifacts/[id]/raw/route_client-reference-manifest.js +1 -1
  38. package/.next/standalone/.next/server/app/api/artifacts/[id]/route_client-reference-manifest.js +1 -1
  39. package/.next/standalone/.next/server/app/api/artifacts/[id]/share-link/[linkId]/route_client-reference-manifest.js +1 -1
  40. package/.next/standalone/.next/server/app/api/artifacts/[id]/share-link/route_client-reference-manifest.js +1 -1
  41. package/.next/standalone/.next/server/app/api/artifacts/upload/route_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/api/audit/list/route_client-reference-manifest.js +1 -1
  43. package/.next/standalone/.next/server/app/api/audit/search/route_client-reference-manifest.js +1 -1
  44. package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/api/auth/config/route_client-reference-manifest.js +1 -1
  46. package/.next/standalone/.next/server/app/api/auth/join-bootstrap/route_client-reference-manifest.js +1 -1
  47. package/.next/standalone/.next/server/app/api/auth/session/route_client-reference-manifest.js +1 -1
  48. package/.next/standalone/.next/server/app/api/brand/route_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/api/chat/sessions/[id]/route_client-reference-manifest.js +1 -1
  50. package/.next/standalone/.next/server/app/api/chat/sessions/route_client-reference-manifest.js +1 -1
  51. package/.next/standalone/.next/server/app/api/config/env/route_client-reference-manifest.js +1 -1
  52. package/.next/standalone/.next/server/app/api/config/route_client-reference-manifest.js +1 -1
  53. package/.next/standalone/.next/server/app/api/connections/[service]/route_client-reference-manifest.js +1 -1
  54. package/.next/standalone/.next/server/app/api/connections/[service]/verify/route_client-reference-manifest.js +1 -1
  55. package/.next/standalone/.next/server/app/api/connections/route_client-reference-manifest.js +1 -1
  56. package/.next/standalone/.next/server/app/api/cron/tick/route_client-reference-manifest.js +1 -1
  57. package/.next/standalone/.next/server/app/api/dashboard/spaces/[id]/move/route_client-reference-manifest.js +1 -1
  58. package/.next/standalone/.next/server/app/api/dashboard/spaces/[id]/route_client-reference-manifest.js +1 -1
  59. package/.next/standalone/.next/server/app/api/dashboard/spaces/[id]/share-link/[linkId]/route_client-reference-manifest.js +1 -1
  60. package/.next/standalone/.next/server/app/api/dashboard/spaces/[id]/share-link/route_client-reference-manifest.js +1 -1
  61. package/.next/standalone/.next/server/app/api/dashboard/spaces/import/route_client-reference-manifest.js +1 -1
  62. package/.next/standalone/.next/server/app/api/dashboard/spaces/route_client-reference-manifest.js +1 -1
  63. package/.next/standalone/.next/server/app/api/disk/files/[id]/blob/route_client-reference-manifest.js +1 -1
  64. package/.next/standalone/.next/server/app/api/disk/files/[id]/route_client-reference-manifest.js +1 -1
  65. package/.next/standalone/.next/server/app/api/disk/files/[id]/transcribe/route_client-reference-manifest.js +1 -1
  66. package/.next/standalone/.next/server/app/api/disk/files/route_client-reference-manifest.js +1 -1
  67. package/.next/standalone/.next/server/app/api/disk/folders/route_client-reference-manifest.js +1 -1
  68. package/.next/standalone/.next/server/app/api/events/since/[cursor]/route_client-reference-manifest.js +1 -1
  69. package/.next/standalone/.next/server/app/api/events/stream/route_client-reference-manifest.js +1 -1
  70. package/.next/standalone/.next/server/app/api/fs/create-folder/route_client-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/app/api/fs/pick-folder/route_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/blueprint/route_client-reference-manifest.js +1 -1
  73. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/diagnostic/route_client-reference-manifest.js +1 -1
  74. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/governance/route_client-reference-manifest.js +1 -1
  75. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/interview/route_client-reference-manifest.js +1 -1
  76. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/pilot/route_client-reference-manifest.js +1 -1
  77. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/quarterly/route_client-reference-manifest.js +1 -1
  78. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/route_client-reference-manifest.js +1 -1
  79. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/setup-package/route_client-reference-manifest.js +1 -1
  80. package/.next/standalone/.next/server/app/api/hail/engagements/route_client-reference-manifest.js +1 -1
  81. package/.next/standalone/.next/server/app/api/hail/interviews/[id]/responses/route_client-reference-manifest.js +1 -1
  82. package/.next/standalone/.next/server/app/api/hail/interviews/[id]/route_client-reference-manifest.js +1 -1
  83. package/.next/standalone/.next/server/app/api/hail/setup-packages/[id]/apply/route_client-reference-manifest.js +1 -1
  84. package/.next/standalone/.next/server/app/api/hail/setup-packages/validate/route_client-reference-manifest.js +1 -1
  85. package/.next/standalone/.next/server/app/api/heartbeat/tick/route_client-reference-manifest.js +1 -1
  86. package/.next/standalone/.next/server/app/api/heartbeat/worker/route_client-reference-manifest.js +1 -1
  87. package/.next/standalone/.next/server/app/api/help/route_client-reference-manifest.js +1 -1
  88. package/.next/standalone/.next/server/app/api/hermes/jobs/[id]/events/route_client-reference-manifest.js +1 -1
  89. package/.next/standalone/.next/server/app/api/hermes/jobs/[id]/route_client-reference-manifest.js +1 -1
  90. package/.next/standalone/.next/server/app/api/hermes/jobs/route_client-reference-manifest.js +1 -1
  91. package/.next/standalone/.next/server/app/api/integrations/google/callback/route_client-reference-manifest.js +1 -1
  92. package/.next/standalone/.next/server/app/api/integrations/google/oauth/route_client-reference-manifest.js +1 -1
  93. package/.next/standalone/.next/server/app/api/marketplace/[id]/route_client-reference-manifest.js +1 -1
  94. package/.next/standalone/.next/server/app/api/marketplace/open-design/route_client-reference-manifest.js +1 -1
  95. package/.next/standalone/.next/server/app/api/marketplace/route_client-reference-manifest.js +1 -1
  96. package/.next/standalone/.next/server/app/api/mines/import-roots/route_client-reference-manifest.js +1 -1
  97. package/.next/standalone/.next/server/app/api/mines/portfolio/route_client-reference-manifest.js +1 -1
  98. package/.next/standalone/.next/server/app/api/mines/projects/[id]/chunks/route_client-reference-manifest.js +1 -1
  99. package/.next/standalone/.next/server/app/api/mines/projects/[id]/diligence/route_client-reference-manifest.js +1 -1
  100. package/.next/standalone/.next/server/app/api/mines/projects/[id]/import/route_client-reference-manifest.js +1 -1
  101. package/.next/standalone/.next/server/app/api/mines/projects/[id]/publish/route_client-reference-manifest.js +1 -1
  102. package/.next/standalone/.next/server/app/api/mines/projects/route_client-reference-manifest.js +1 -1
  103. package/.next/standalone/.next/server/app/api/missions/route_client-reference-manifest.js +1 -1
  104. package/.next/standalone/.next/server/app/api/models/route_client-reference-manifest.js +1 -1
  105. package/.next/standalone/.next/server/app/api/onboarding/blueprint/route_client-reference-manifest.js +1 -1
  106. package/.next/standalone/.next/server/app/api/onboarding/launch/route_client-reference-manifest.js +1 -1
  107. package/.next/standalone/.next/server/app/api/orchestrator/command/route_client-reference-manifest.js +1 -1
  108. package/.next/standalone/.next/server/app/api/orchestrator/stream/route_client-reference-manifest.js +1 -1
  109. package/.next/standalone/.next/server/app/api/orchestrator/upload/route_client-reference-manifest.js +1 -1
  110. package/.next/standalone/.next/server/app/api/org/route_client-reference-manifest.js +1 -1
  111. package/.next/standalone/.next/server/app/api/orgs/[id]/invites/[inviteId]/route_client-reference-manifest.js +1 -1
  112. package/.next/standalone/.next/server/app/api/orgs/[id]/invites/route_client-reference-manifest.js +1 -1
  113. package/.next/standalone/.next/server/app/api/orgs/[id]/members/[userId]/role/route_client-reference-manifest.js +1 -1
  114. package/.next/standalone/.next/server/app/api/orgs/[id]/members/[userId]/route_client-reference-manifest.js +1 -1
  115. package/.next/standalone/.next/server/app/api/orgs/[id]/members/route_client-reference-manifest.js +1 -1
  116. package/.next/standalone/.next/server/app/api/orgs/[id]/route_client-reference-manifest.js +1 -1
  117. package/.next/standalone/.next/server/app/api/orgs/invites/pending/route_client-reference-manifest.js +1 -1
  118. package/.next/standalone/.next/server/app/api/orgs/join/route_client-reference-manifest.js +1 -1
  119. package/.next/standalone/.next/server/app/api/orgs/join-complete/route_client-reference-manifest.js +1 -1
  120. package/.next/standalone/.next/server/app/api/orgs/route_client-reference-manifest.js +1 -1
  121. package/.next/standalone/.next/server/app/api/printing-press/clis/route_client-reference-manifest.js +1 -1
  122. package/.next/standalone/.next/server/app/api/printing-press/install/route_client-reference-manifest.js +1 -1
  123. package/.next/standalone/.next/server/app/api/printing-press/security-mode/route_client-reference-manifest.js +1 -1
  124. package/.next/standalone/.next/server/app/api/privacy/config/route_client-reference-manifest.js +1 -1
  125. package/.next/standalone/.next/server/app/api/privacy/verify/route_client-reference-manifest.js +1 -1
  126. package/.next/standalone/.next/server/app/api/processes/[id]/route_client-reference-manifest.js +1 -1
  127. package/.next/standalone/.next/server/app/api/processes/[id]/share-link/route_client-reference-manifest.js +1 -1
  128. package/.next/standalone/.next/server/app/api/processes/[id]/stages/[stageId]/override/route_client-reference-manifest.js +1 -1
  129. package/.next/standalone/.next/server/app/api/processes/[id]/stages/[stageId]/retry/route_client-reference-manifest.js +1 -1
  130. package/.next/standalone/.next/server/app/api/processes/[id]/stages/[stageId]/submit/route_client-reference-manifest.js +1 -1
  131. package/.next/standalone/.next/server/app/api/processes/definitions/[slug]/route_client-reference-manifest.js +1 -1
  132. package/.next/standalone/.next/server/app/api/processes/definitions/[slug]/settings/route_client-reference-manifest.js +1 -1
  133. package/.next/standalone/.next/server/app/api/processes/definitions/route_client-reference-manifest.js +1 -1
  134. package/.next/standalone/.next/server/app/api/processes/definitions/validate/route_client-reference-manifest.js +1 -1
  135. package/.next/standalone/.next/server/app/api/processes/route_client-reference-manifest.js +1 -1
  136. package/.next/standalone/.next/server/app/api/processes/start-and-route/route_client-reference-manifest.js +1 -1
  137. package/.next/standalone/.next/server/app/api/projects/[slug]/library/route_client-reference-manifest.js +1 -1
  138. package/.next/standalone/.next/server/app/api/projects/[slug]/route_client-reference-manifest.js +1 -1
  139. package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  140. package/.next/standalone/.next/server/app/api/runs/approve-claude-run/route_client-reference-manifest.js +1 -1
  141. package/.next/standalone/.next/server/app/api/runs/claude-code-dry-run/route_client-reference-manifest.js +1 -1
  142. package/.next/standalone/.next/server/app/api/runs/competitor-report/route_client-reference-manifest.js +1 -1
  143. package/.next/standalone/.next/server/app/api/runs/engine-ping/route_client-reference-manifest.js +1 -1
  144. package/.next/standalone/.next/server/app/api/runs/marketing-plan/route_client-reference-manifest.js +1 -1
  145. package/.next/standalone/.next/server/app/api/schedules/upsert/route_client-reference-manifest.js +1 -1
  146. package/.next/standalone/.next/server/app/api/secrets/[name]/route_client-reference-manifest.js +1 -1
  147. package/.next/standalone/.next/server/app/api/secrets/route_client-reference-manifest.js +1 -1
  148. package/.next/standalone/.next/server/app/api/settings/trust-mode/route_client-reference-manifest.js +1 -1
  149. package/.next/standalone/.next/server/app/api/share/[token]/otp/route_client-reference-manifest.js +1 -1
  150. package/.next/standalone/.next/server/app/api/share/[token]/route_client-reference-manifest.js +1 -1
  151. package/.next/standalone/.next/server/app/api/share/[token]/verify/route_client-reference-manifest.js +1 -1
  152. package/.next/standalone/.next/server/app/api/share/space/[token]/otp/route_client-reference-manifest.js +1 -1
  153. package/.next/standalone/.next/server/app/api/share/space/[token]/route_client-reference-manifest.js +1 -1
  154. package/.next/standalone/.next/server/app/api/share/space/[token]/verify/route_client-reference-manifest.js +1 -1
  155. package/.next/standalone/.next/server/app/api/shared/spaces/[id]/acl/route_client-reference-manifest.js +1 -1
  156. package/.next/standalone/.next/server/app/api/shared/spaces/publish/route_client-reference-manifest.js +1 -1
  157. package/.next/standalone/.next/server/app/api/shared/spaces/route_client-reference-manifest.js +1 -1
  158. package/.next/standalone/.next/server/app/api/shared/spaces/status/route_client-reference-manifest.js +1 -1
  159. package/.next/standalone/.next/server/app/api/shared/spaces/unpublish/route_client-reference-manifest.js +1 -1
  160. package/.next/standalone/.next/server/app/api/state/route_client-reference-manifest.js +1 -1
  161. package/.next/standalone/.next/server/app/api/system/update/route_client-reference-manifest.js +1 -1
  162. package/.next/standalone/.next/server/app/api/tasks/[id]/active-run/route_client-reference-manifest.js +1 -1
  163. package/.next/standalone/.next/server/app/api/tasks/[id]/attachments/route_client-reference-manifest.js +1 -1
  164. package/.next/standalone/.next/server/app/api/tasks/[id]/checklist/[itemId]/route_client-reference-manifest.js +1 -1
  165. package/.next/standalone/.next/server/app/api/tasks/[id]/checklist/route_client-reference-manifest.js +1 -1
  166. package/.next/standalone/.next/server/app/api/tasks/[id]/checkout/route_client-reference-manifest.js +1 -1
  167. package/.next/standalone/.next/server/app/api/tasks/[id]/children/route_client-reference-manifest.js +1 -1
  168. package/.next/standalone/.next/server/app/api/tasks/[id]/comments/route_client-reference-manifest.js +1 -1
  169. package/.next/standalone/.next/server/app/api/tasks/[id]/events/route_client-reference-manifest.js +1 -1
  170. package/.next/standalone/.next/server/app/api/tasks/[id]/live-runs/route_client-reference-manifest.js +1 -1
  171. package/.next/standalone/.next/server/app/api/tasks/[id]/release/route_client-reference-manifest.js +1 -1
  172. package/.next/standalone/.next/server/app/api/tasks/[id]/route_client-reference-manifest.js +1 -1
  173. package/.next/standalone/.next/server/app/api/tasks/route_client-reference-manifest.js +1 -1
  174. package/.next/standalone/.next/server/app/api/tool-allowlists/[id]/route_client-reference-manifest.js +1 -1
  175. package/.next/standalone/.next/server/app/api/tool-allowlists/route_client-reference-manifest.js +1 -1
  176. package/.next/standalone/.next/server/app/api/tool-egress/route_client-reference-manifest.js +1 -1
  177. package/.next/standalone/.next/server/app/api/tools/[name]/approve/route_client-reference-manifest.js +1 -1
  178. package/.next/standalone/.next/server/app/api/tools/[name]/route_client-reference-manifest.js +1 -1
  179. package/.next/standalone/.next/server/app/api/tools/route_client-reference-manifest.js +1 -1
  180. package/.next/standalone/.next/server/app/api/transcripts/route_client-reference-manifest.js +1 -1
  181. package/.next/standalone/.next/server/app/api/voice/providers/route_client-reference-manifest.js +1 -1
  182. package/.next/standalone/.next/server/app/api/voice/realtime/context/route_client-reference-manifest.js +1 -1
  183. package/.next/standalone/.next/server/app/api/voice/realtime/session/route_client-reference-manifest.js +1 -1
  184. package/.next/standalone/.next/server/app/api/voice/realtime/tool-result/route_client-reference-manifest.js +1 -1
  185. package/.next/standalone/.next/server/app/api/voice/realtime/tools/route_client-reference-manifest.js +1 -1
  186. package/.next/standalone/.next/server/app/api/voice/tts/route_client-reference-manifest.js +1 -1
  187. package/.next/standalone/.next/server/app/api/whatsapp/allowlist/route_client-reference-manifest.js +1 -1
  188. package/.next/standalone/.next/server/app/api/whatsapp/disconnect/route_client-reference-manifest.js +1 -1
  189. package/.next/standalone/.next/server/app/api/whatsapp/messages/route_client-reference-manifest.js +1 -1
  190. package/.next/standalone/.next/server/app/api/whatsapp/qr/route_client-reference-manifest.js +1 -1
  191. package/.next/standalone/.next/server/app/api/whatsapp/send/route_client-reference-manifest.js +1 -1
  192. package/.next/standalone/.next/server/app/api/whatsapp/status/route_client-reference-manifest.js +1 -1
  193. package/.next/standalone/.next/server/app/approvals/page.js +2 -2
  194. package/.next/standalone/.next/server/app/approvals/page_client-reference-manifest.js +1 -1
  195. package/.next/standalone/.next/server/app/architecture/page_client-reference-manifest.js +1 -1
  196. package/.next/standalone/.next/server/app/architecture.html +2 -2
  197. package/.next/standalone/.next/server/app/architecture.rsc +2 -2
  198. package/.next/standalone/.next/server/app/audit/live/page_client-reference-manifest.js +1 -1
  199. package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
  200. package/.next/standalone/.next/server/app/brand/page_client-reference-manifest.js +1 -1
  201. package/.next/standalone/.next/server/app/brand.html +1 -1
  202. package/.next/standalone/.next/server/app/brand.rsc +2 -2
  203. package/.next/standalone/.next/server/app/disk/page_client-reference-manifest.js +1 -1
  204. package/.next/standalone/.next/server/app/federated-ai/page_client-reference-manifest.js +1 -1
  205. package/.next/standalone/.next/server/app/federated-ai.html +2 -2
  206. package/.next/standalone/.next/server/app/federated-ai.rsc +2 -2
  207. package/.next/standalone/.next/server/app/hail/[id]/governance/page_client-reference-manifest.js +1 -1
  208. package/.next/standalone/.next/server/app/hail/[id]/interview/page.js +2 -2
  209. package/.next/standalone/.next/server/app/hail/[id]/interview/page_client-reference-manifest.js +1 -1
  210. package/.next/standalone/.next/server/app/hail/[id]/page.js +2 -2
  211. package/.next/standalone/.next/server/app/hail/[id]/page_client-reference-manifest.js +1 -1
  212. package/.next/standalone/.next/server/app/hail/[id]/setup/page.js +1 -1
  213. package/.next/standalone/.next/server/app/hail/[id]/setup/page_client-reference-manifest.js +1 -1
  214. package/.next/standalone/.next/server/app/hail/page.js +2 -2
  215. package/.next/standalone/.next/server/app/hail/page_client-reference-manifest.js +1 -1
  216. package/.next/standalone/.next/server/app/help/[slug]/page_client-reference-manifest.js +1 -1
  217. package/.next/standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  218. package/.next/standalone/.next/server/app/index.html +2 -2
  219. package/.next/standalone/.next/server/app/index.rsc +2 -2
  220. package/.next/standalone/.next/server/app/join/page_client-reference-manifest.js +1 -1
  221. package/.next/standalone/.next/server/app/join.html +1 -1
  222. package/.next/standalone/.next/server/app/join.rsc +2 -2
  223. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  224. package/.next/standalone/.next/server/app/marketplace/page.js +2 -2
  225. package/.next/standalone/.next/server/app/marketplace/page_client-reference-manifest.js +1 -1
  226. package/.next/standalone/.next/server/app/mines/[projectId]/page_client-reference-manifest.js +1 -1
  227. package/.next/standalone/.next/server/app/mines/[projectId]/results/page_client-reference-manifest.js +1 -1
  228. package/.next/standalone/.next/server/app/mines/page_client-reference-manifest.js +1 -1
  229. package/.next/standalone/.next/server/app/missions/page.js +1 -1
  230. package/.next/standalone/.next/server/app/missions/page_client-reference-manifest.js +1 -1
  231. package/.next/standalone/.next/server/app/onboarding/org/page_client-reference-manifest.js +1 -1
  232. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  233. package/.next/standalone/.next/server/app/onboarding.html +2 -2
  234. package/.next/standalone/.next/server/app/onboarding.rsc +2 -2
  235. package/.next/standalone/.next/server/app/org/page.js +1 -1
  236. package/.next/standalone/.next/server/app/org/page.js.nft.json +1 -1
  237. package/.next/standalone/.next/server/app/org/page_client-reference-manifest.js +1 -1
  238. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  239. package/.next/standalone/.next/server/app/projects/[slug]/log/page_client-reference-manifest.js +1 -1
  240. package/.next/standalone/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
  241. package/.next/standalone/.next/server/app/projects/new/page.js +1 -1
  242. package/.next/standalone/.next/server/app/projects/new/page_client-reference-manifest.js +1 -1
  243. package/.next/standalone/.next/server/app/projects/new.html +1 -1
  244. package/.next/standalone/.next/server/app/projects/new.rsc +3 -3
  245. package/.next/standalone/.next/server/app/projects/page.js +19 -19
  246. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  247. package/.next/standalone/.next/server/app/reports/[file]/route_client-reference-manifest.js +1 -1
  248. package/.next/standalone/.next/server/app/reports/page_client-reference-manifest.js +1 -1
  249. package/.next/standalone/.next/server/app/runtime/page_client-reference-manifest.js +1 -1
  250. package/.next/standalone/.next/server/app/schedules/page.js +2 -2
  251. package/.next/standalone/.next/server/app/schedules/page_client-reference-manifest.js +1 -1
  252. package/.next/standalone/.next/server/app/settings/account/page_client-reference-manifest.js +1 -1
  253. package/.next/standalone/.next/server/app/settings/advanced/page_client-reference-manifest.js +1 -1
  254. package/.next/standalone/.next/server/app/settings/appearance/page_client-reference-manifest.js +1 -1
  255. package/.next/standalone/.next/server/app/settings/brand/page_client-reference-manifest.js +1 -1
  256. package/.next/standalone/.next/server/app/settings/brand.html +2 -2
  257. package/.next/standalone/.next/server/app/settings/brand.rsc +2 -2
  258. package/.next/standalone/.next/server/app/settings/connectors/page_client-reference-manifest.js +1 -1
  259. package/.next/standalone/.next/server/app/settings/engines/page_client-reference-manifest.js +1 -1
  260. package/.next/standalone/.next/server/app/settings/onboarding/page_client-reference-manifest.js +1 -1
  261. package/.next/standalone/.next/server/app/settings/onboarding.html +2 -2
  262. package/.next/standalone/.next/server/app/settings/onboarding.rsc +2 -2
  263. package/.next/standalone/.next/server/app/settings/organization/page.js +1 -1
  264. package/.next/standalone/.next/server/app/settings/organization/page.js.nft.json +1 -1
  265. package/.next/standalone/.next/server/app/settings/organization/page_client-reference-manifest.js +1 -1
  266. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  267. package/.next/standalone/.next/server/app/settings/runtime/page_client-reference-manifest.js +1 -1
  268. package/.next/standalone/.next/server/app/settings/team/page_client-reference-manifest.js +1 -1
  269. package/.next/standalone/.next/server/app/settings/tools/page_client-reference-manifest.js +1 -1
  270. package/.next/standalone/.next/server/app/settings.html +2 -2
  271. package/.next/standalone/.next/server/app/settings.rsc +2 -2
  272. package/.next/standalone/.next/server/app/share/[token]/page_client-reference-manifest.js +1 -1
  273. package/.next/standalone/.next/server/app/share/space/[token]/page_client-reference-manifest.js +1 -1
  274. package/.next/standalone/.next/server/app/tasks/[id]/page.js +1 -1
  275. package/.next/standalone/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  276. package/.next/standalone/.next/server/app/tasks/page.js +2 -2
  277. package/.next/standalone/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  278. package/.next/standalone/.next/server/app/team/[agentId]/page_client-reference-manifest.js +1 -1
  279. package/.next/standalone/.next/server/app/team/page_client-reference-manifest.js +1 -1
  280. package/.next/standalone/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  281. package/.next/standalone/.next/server/app/whatsapp/page.js +1 -1
  282. package/.next/standalone/.next/server/app/whatsapp/page_client-reference-manifest.js +1 -1
  283. package/.next/standalone/.next/server/app/whatsapp.html +1 -1
  284. package/.next/standalone/.next/server/app/whatsapp.rsc +3 -3
  285. package/.next/standalone/.next/server/app/workflows/[caseId]/page_client-reference-manifest.js +1 -1
  286. package/.next/standalone/.next/server/app/workflows/new/[caseId]/page_client-reference-manifest.js +1 -1
  287. package/.next/standalone/.next/server/app/workflows/new/definition/page_client-reference-manifest.js +1 -1
  288. package/.next/standalone/.next/server/app/workflows/page_client-reference-manifest.js +1 -1
  289. package/.next/standalone/.next/server/app/workflows/share/[caseId]/page_client-reference-manifest.js +1 -1
  290. package/.next/standalone/.next/server/app-paths-manifest.json +77 -77
  291. package/.next/standalone/.next/server/chunks/1699.js +18 -18
  292. package/.next/standalone/.next/server/chunks/51.js +1 -0
  293. package/.next/standalone/.next/server/functions-config-manifest.json +24 -24
  294. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  295. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  296. package/.next/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  297. package/.next/standalone/.next/server/pages/404.html +1 -1
  298. package/.next/standalone/.next/server/pages/500.html +1 -1
  299. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  300. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  301. package/.next/standalone/.next/static/chunks/4119-cfb6260557a0a3d2.js +1 -0
  302. package/.next/standalone/.next/static/chunks/app/projects/page-f136822590202f9f.js +1 -0
  303. package/.next/standalone/.next/static/chunks/{webpack-86ee88827adb756d.js → webpack-f916d679fe38a701.js} +1 -1
  304. package/.next/standalone/.next/static/css/0bd4c357d4f0c4f2.css +1 -0
  305. package/.next/standalone/CHANGELOG.md +12 -0
  306. package/.next/standalone/data/.artifacts-migrated-v1 +1 -1
  307. package/.next/standalone/data/.default-project-seeded +1 -1
  308. package/.next/standalone/data/madarx.sqlite +0 -0
  309. package/.next/standalone/data/madarx.sqlite-shm +0 -0
  310. package/.next/standalone/data/madarx.sqlite-wal +0 -0
  311. package/.next/standalone/package.json +2 -2
  312. package/.next/static/chunks/4119-cfb6260557a0a3d2.js +1 -0
  313. package/.next/static/chunks/app/projects/page-f136822590202f9f.js +1 -0
  314. package/.next/static/chunks/{webpack-86ee88827adb756d.js → webpack-f916d679fe38a701.js} +1 -1
  315. package/.next/static/css/0bd4c357d4f0c4f2.css +1 -0
  316. package/CHANGELOG.md +12 -0
  317. package/app/components/dashboard/whatsapp-section.jsx +54 -13
  318. package/lib/cli/prompt.js +110 -0
  319. package/lib/cli/setup.js +152 -87
  320. package/lib/runtime.js +8 -2
  321. package/package.json +2 -2
  322. package/scripts/whatsapp-reset.mjs +15 -0
  323. package/.next/standalone/.next/server/chunks/6474.js +0 -1
  324. package/.next/standalone/.next/static/chunks/4119-3b6adff3c7187ef3.js +0 -1
  325. package/.next/standalone/.next/static/chunks/app/projects/page-09e5c527e3ba83e2.js +0 -1
  326. package/.next/standalone/.next/static/css/0bfed9e12afa1dc1.css +0 -1
  327. package/.next/static/chunks/4119-3b6adff3c7187ef3.js +0 -1
  328. package/.next/static/chunks/app/projects/page-09e5c527e3ba83e2.js +0 -1
  329. package/.next/static/css/0bfed9e12afa1dc1.css +0 -1
  330. /package/.next/standalone/.next/static/{-LlttjOnKZXGqZXDKcj-4 → tMcPS9JR5cRXSe0u5ne95}/_buildManifest.js +0 -0
  331. /package/.next/standalone/.next/static/{-LlttjOnKZXGqZXDKcj-4 → tMcPS9JR5cRXSe0u5ne95}/_ssgManifest.js +0 -0
  332. /package/.next/static/{-LlttjOnKZXGqZXDKcj-4 → tMcPS9JR5cRXSe0u5ne95}/_buildManifest.js +0 -0
  333. /package/.next/static/{-LlttjOnKZXGqZXDKcj-4 → tMcPS9JR5cRXSe0u5ne95}/_ssgManifest.js +0 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  All notable changes to Madarx OS. Newest first.
4
4
 
5
+ ## [2.15.0] - 2026-06-04
6
+
7
+ ### Added
8
+
9
+ - **Guided `madarx setup` wizard.** Setup is now an arrow-key experience (↑/↓ or j/k, Enter, number keys) that decides what shapes the whole install up front: **usage mode** — Personal (local-only) or Team (Supabase shared layer, with credential capture) — then the **main agent model** and the **default sub-agent model**, chosen from the engines actually available on your machine (it probes the Claude Code and Codex CLIs and a running Ollama, and always lists the Anthropic models). It then walks the secrets-vault master key, API keys (masked, and only flags Anthropic as *required* when your selected engine needs it), folder permissions, the WhatsApp toggle, and the auto-update policy. Re-running is safe — every step shows your current value as the default. New zero-dependency `lib/cli/prompt.js` (`select`/`confirm`).
10
+ - The sub-agent default model picked at setup is honored at runtime: `createAgent` now falls back to the `default_agent_engine` / `default_agent_model` config when a caller doesn't specify one.
11
+
12
+ ### Fixed
13
+
14
+ - **WhatsApp could get stuck "logged out" with no way to re-pair.** When WhatsApp unlinked the device server-side (you removed it from Linked Devices, the number got flagged, or its anti-unofficial-client sweep caught a fresh Baileys session), the bridge left the now-invalid credentials on disk and stopped — which silently blocked a new pairing QR (Baileys only offers a QR on an empty session). The Pairing screen sat on "Waiting for QR" forever, and the only recovery control lived in the *paired* branch of the UI, so there was no visible button to reset. The logged-out state now shows a **Reset session** button (with a confirm step) that wipes the dead session and brings up a fresh QR — the same recovery the dashboard already offered after a deliberate disconnect.
15
+ - **`npm run whatsapp:reset` wiped the wrong directory on global installs.** It hardcoded `<cwd>/data/whatsapp/session`, so for a `npm i -g madarx` install (whose data lives under `$MADARX_HOME`, default `~/.madarx`) it deleted a repo-relative path that didn't exist and never touched the real session. It now resolves the session directory from `lib/paths.js`, honoring `MADARX_HOME` / `MADARX_DATA_DIR`, via the new `scripts/whatsapp-reset.mjs`.
16
+
5
17
  ## [2.14.0] - 2026-06-04
6
18
 
7
19
  ### Changed
@@ -221,23 +221,64 @@ export default function WhatsAppSection() {
221
221
  <div className="config-secrets-panel" style={{ marginTop: 0 }}>
222
222
  <div className="config-secrets-head">
223
223
  <div>
224
- <span className="config-section-title">Pair device</span>
225
- <p>Open WhatsApp Settings Linked Devices Link a Device, then scan the code.</p>
224
+ <span className="config-section-title">
225
+ {pairingState === 'logged_out' ? 'Session logged out' : 'Pair device'}
226
+ </span>
227
+ <p>
228
+ {pairingState === 'logged_out'
229
+ ? 'WhatsApp unlinked this device server-side, so the stale credentials block a fresh QR. Reset the session to wipe them and generate a new pairing code.'
230
+ : 'Open WhatsApp → Settings → Linked Devices → Link a Device, then scan the code.'}
231
+ </p>
226
232
  </div>
233
+ {pairingState === 'logged_out' && (
234
+ !confirmDisconnect ? (
235
+ <button
236
+ type="button"
237
+ className="secrets-action-btn danger"
238
+ onClick={() => setConfirmDisconnect(true)}
239
+ disabled={disconnectBusy}
240
+ >
241
+ Reset session
242
+ </button>
243
+ ) : (
244
+ <div className="wa-disconnect-confirm">
245
+ <button
246
+ type="button"
247
+ className="secrets-action-btn danger"
248
+ onClick={handleDisconnect}
249
+ disabled={disconnectBusy}
250
+ >
251
+ {disconnectBusy ? 'Resetting…' : 'Confirm reset'}
252
+ </button>
253
+ <button
254
+ type="button"
255
+ className="secrets-action-btn"
256
+ onClick={() => setConfirmDisconnect(false)}
257
+ disabled={disconnectBusy}
258
+ >
259
+ Cancel
260
+ </button>
261
+ </div>
262
+ )
263
+ )}
227
264
  </div>
228
- <div className="whatsapp-pair-row">
229
- {qrDataUrl ? (
230
- <div className="whatsapp-qr-box">
231
- <img src={qrDataUrl} alt="WhatsApp pairing QR code" width={220} height={220} />
265
+ {pairingState === 'logged_out' ? (
266
+ <div className="whatsapp-pair-copy">{dedicatedNumberWarning}</div>
267
+ ) : (
268
+ <div className="whatsapp-pair-row">
269
+ {qrDataUrl ? (
270
+ <div className="whatsapp-qr-box">
271
+ <img src={qrDataUrl} alt="WhatsApp pairing QR code" width={220} height={220} />
272
+ </div>
273
+ ) : (
274
+ <div className="whatsapp-qr-pending">Waiting for QR — make sure the daemon is running.</div>
275
+ )}
276
+ <div className="whatsapp-pair-copy">
277
+ <p>Code rotates roughly every 20 seconds. The dashboard re-fetches automatically. The session is saved at <code>data/whatsapp/session/</code>.</p>
278
+ {dedicatedNumberWarning}
232
279
  </div>
233
- ) : (
234
- <div className="whatsapp-qr-pending">Waiting for QR — make sure the daemon is running.</div>
235
- )}
236
- <div className="whatsapp-pair-copy">
237
- <p>Code rotates roughly every 20 seconds. The dashboard re-fetches automatically. The session is saved at <code>data/whatsapp/session/</code>.</p>
238
- {dedicatedNumberWarning}
239
280
  </div>
240
- </div>
281
+ )}
241
282
  </div>
242
283
  ) : (
243
284
  <div className="config-secrets-panel" style={{ marginTop: 0 }}>
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Interactive terminal prompts for the madarX CLI wizard.
3
+ *
4
+ * Zero dependencies — node builtins + the brand stylers in ./banner.js only.
5
+ * The headline piece is `select()`: an arrow-key menu (↑/↓ or j/k, number keys,
6
+ * Enter to choose) in the Sovereign-Mono palette with a single Mars cursor.
7
+ *
8
+ * Degrades safely: with no TTY it returns the default option without drawing.
9
+ */
10
+
11
+ import { emitKeypressEvents } from 'node:readline';
12
+ import { _palette as P, fg, bold, dim } from './banner.js';
13
+
14
+ const isTTY = () => Boolean(process.stdin.isTTY && process.stdout.isTTY);
15
+ const write = (s) => process.stdout.write(s);
16
+ const hideCursor = () => write('\x1b[?25l');
17
+ const showCursor = () => write('\x1b[?25h');
18
+
19
+ /**
20
+ * Render one menu option line.
21
+ * @param {{label:string, hint?:string, tag?:string}} opt
22
+ * @param {boolean} active
23
+ */
24
+ function optionLine(opt, active) {
25
+ const cursor = active ? fg(P.mars, '→ ') : ' ';
26
+ const label = active ? bold(fg(P.mars, opt.label)) : fg(P.bone, opt.label);
27
+ const tag = opt.tag ? ' ' + fg(opt.tag === 'recommended' ? P.platinum : P.muted, `(${opt.tag})`) : '';
28
+ const hint = opt.hint ? ' ' + dim(fg(P.muted, opt.hint)) : '';
29
+ return ` ${cursor}${label}${tag}${hint}`;
30
+ }
31
+
32
+ /**
33
+ * Arrow-key single-select menu.
34
+ *
35
+ * @param {string} title bold Mars header (e.g. "Select default model")
36
+ * @param {Array<{label:string, value:any, hint?:string, tag?:string}>} options
37
+ * @param {object} [opts]
38
+ * @param {number} [opts.default=0] initially highlighted index
39
+ * @param {string} [opts.help] a dim help line under the title
40
+ * @returns {Promise<any>} the chosen option's `value`
41
+ */
42
+ export function select(title, options, opts = {}) {
43
+ const def = Math.max(0, Math.min(opts.default ?? 0, options.length - 1));
44
+ if (!isTTY() || options.length === 0) {
45
+ return Promise.resolve(options[def]?.value);
46
+ }
47
+
48
+ return new Promise((resolve) => {
49
+ let idx = def;
50
+ const headerLines = [
51
+ fg(P.mars, bold(title)),
52
+ ...(opts.help ? [dim(fg(P.muted, opts.help))] : []),
53
+ '',
54
+ ];
55
+ const total = headerLines.length + options.length + 1; // +1 footer
56
+
57
+ const footer = dim(fg(P.muted, '↑/↓ move · enter select · ⌃C cancel'));
58
+
59
+ const draw = (first) => {
60
+ if (!first) write(`\x1b[${total}A`); // jump to top of the block
61
+ const lines = [
62
+ ...headerLines,
63
+ ...options.map((o, i) => optionLine(o, i === idx)),
64
+ footer,
65
+ ];
66
+ write('\r' + lines.map((l) => '\x1b[2K' + l).join('\n') + '\n');
67
+ };
68
+
69
+ emitKeypressEvents(process.stdin);
70
+ const wasRaw = process.stdin.isRaw;
71
+ process.stdin.setRawMode(true);
72
+ process.stdin.resume();
73
+ hideCursor();
74
+ draw(true);
75
+
76
+ const cleanup = () => {
77
+ process.stdin.removeListener('keypress', onKey);
78
+ process.stdin.setRawMode(wasRaw);
79
+ process.stdin.pause();
80
+ showCursor();
81
+ };
82
+
83
+ const onKey = (str, key = {}) => {
84
+ if (key.name === 'up' || key.name === 'k' || (key.name === 'p' && key.ctrl)) {
85
+ idx = (idx - 1 + options.length) % options.length; draw(false);
86
+ } else if (key.name === 'down' || key.name === 'j' || (key.name === 'n' && key.ctrl)) {
87
+ idx = (idx + 1) % options.length; draw(false);
88
+ } else if (str && /^[1-9]$/.test(str) && Number(str) <= options.length) {
89
+ idx = Number(str) - 1; draw(false);
90
+ } else if (key.name === 'return' || key.name === 'enter') {
91
+ cleanup(); resolve(options[idx].value);
92
+ } else if (key.name === 'escape') {
93
+ cleanup(); resolve(options[def].value);
94
+ } else if (key.ctrl && key.name === 'c') {
95
+ cleanup(); write('\n'); process.exit(130);
96
+ }
97
+ };
98
+
99
+ process.stdin.on('keypress', onKey);
100
+ });
101
+ }
102
+
103
+ /** Yes/No as a two-item arrow menu (returns boolean). */
104
+ export async function confirm(title, { default: dflt = true, help } = {}) {
105
+ const value = await select(title, [
106
+ { label: 'Yes', value: true },
107
+ { label: 'No', value: false },
108
+ ], { default: dflt ? 0 : 1, help });
109
+ return value;
110
+ }
package/lib/cli/setup.js CHANGED
@@ -1,10 +1,17 @@
1
1
  /**
2
2
  * `madarx setup` — interactive first-run wizard.
3
3
  *
4
- * Walks the operator through: data home, secrets-vault master key, the folder
5
- * permissions the bundled agent may read/write (MADARX_ALLOWED_ROOTS), optional
6
- * API keys (stored in the encrypted vault), the WhatsApp toggle, and the weekly
7
- * auto-update preference (consumed by T3's self-update).
4
+ * An arrow-key guided setup that decides the things that shape the whole
5
+ * install up front, then fills in credentials and preferences:
6
+ *
7
+ * 1. Usage mode personal (local-only) vs team (Supabase shared layer)
8
+ * 2. Main agent which model/engine the orchestrator runs on
9
+ * 3. Sub-agents default model/engine new agents inherit
10
+ * 4. Secrets vault master key (generated + persisted on first run)
11
+ * 5. API keys Anthropic / OpenAI → encrypted vault
12
+ * 6. Folder grants MADARX_ALLOWED_ROOTS (the agent's file/exec boundary)
13
+ * 7. WhatsApp bridge on/off
14
+ * 8. Auto-update weekly notify / hands-off / off
8
15
  *
9
16
  * Sets MADARX_DISABLE_INPROC_DAEMON=1 before importing the runtime — a setup run
10
17
  * must not spin up cron/heartbeat loops.
@@ -13,42 +20,33 @@
13
20
  import { createInterface } from 'node:readline/promises';
14
21
  import { applyHomeEnv } from './home.js';
15
22
  import { upsertEnvVar, removeEnvVar, readEnvFile } from './env-file.js';
16
- import { renderHeader } from './banner.js';
23
+ import { renderHeader, _palette as P, fg, bold, dim } from './banner.js';
17
24
  import { readVersion } from './dispatch.js';
25
+ import { select, confirm } from './prompt.js';
18
26
 
19
27
  function isInteractive() {
20
28
  return Boolean(process.stdin.isTTY && process.stdout.isTTY);
21
29
  }
22
30
 
23
- /** readline with a muted variant for secret entry (echoes `*`). */
24
- function makeReader() {
25
- const rl = createInterface({ input: process.stdin, output: process.stdout, terminal: true });
26
- rl.stdoutMuted = false;
27
- rl._writeToOutput = function (str) {
28
- if (rl.stdoutMuted) rl.output.write('*');
29
- else rl.output.write(str);
30
- };
31
- return rl;
32
- }
33
-
34
- async function ask(rl, prompt, dflt = '') {
35
- const suffix = dflt ? ` [${dflt}]` : '';
36
- const ans = (await rl.question(`${prompt}${suffix}: `)).trim();
37
- return ans || dflt;
38
- }
39
-
40
- async function askYesNo(rl, prompt, dfltYes = true) {
41
- const ans = (await rl.question(`${prompt} ${dfltYes ? '[Y/n]' : '[y/N]'}: `)).trim().toLowerCase();
42
- if (!ans) return dfltYes;
43
- return ans === 'y' || ans === 'yes';
44
- }
31
+ const h2 = (s) => console.log('\n' + bold(fg(P.platinum, s)));
32
+ const note = (s) => console.log(' ' + dim(fg(P.muted, s)));
33
+ const ok = (s) => console.log(' ' + fg(P.mars, '●') + ' ' + fg(P.bone, s));
45
34
 
46
- async function askSecret(rl, prompt) {
47
- rl.stdoutMuted = true;
48
- const val = (await rl.question(`${prompt}: `)).trim();
35
+ /** Open an ephemeral readline for one text prompt, then close it (so it never
36
+ * competes with the raw-mode arrow menus). `secret` echoes `*`. */
37
+ async function ask(prompt, { dflt = '', secret = false } = {}) {
38
+ const rl = createInterface({ input: process.stdin, output: process.stdout, terminal: true });
49
39
  rl.stdoutMuted = false;
50
- rl.output.write('\n');
51
- return val;
40
+ rl._writeToOutput = function (str) { rl.output.write(rl.stdoutMuted ? '*' : str); };
41
+ try {
42
+ rl.stdoutMuted = secret;
43
+ const suffix = dflt ? ` [${dflt}]` : '';
44
+ const ans = (await rl.question(` ${fg(P.bone, prompt)}${dim(suffix)}: `)).trim();
45
+ if (secret) rl.output.write('\n');
46
+ return ans || dflt;
47
+ } finally {
48
+ rl.close();
49
+ }
52
50
  }
53
51
 
54
52
  export async function setup() {
@@ -57,87 +55,154 @@ export async function setup() {
57
55
  return 1;
58
56
  }
59
57
 
60
- // Management command — never run the in-process daemons.
61
- process.env.MADARX_DISABLE_INPROC_DAEMON = '1';
62
-
58
+ process.env.MADARX_DISABLE_INPROC_DAEMON = '1'; // management command — no daemons
63
59
  const layout = applyHomeEnv();
64
- const rl = makeReader();
65
60
 
66
61
  try {
67
62
  console.log(renderHeader('setup', readVersion()));
68
- console.log(`Data home: ${layout.home}`);
69
- console.log('(override anytime with the MADARX_HOME env var)\n');
63
+ console.log(`Data home: ${fg(P.bone, layout.home)}`);
64
+ note('override anytime with the MADARX_HOME env var');
70
65
 
71
- // 1. Master key delegate to the canonical resolver (generates + persists
72
- // to $MADARX_HOME/.env.local on first run, prints the backup instruction).
73
- console.log('1) Secrets vault');
74
- const { resolveMasterKey } = await import('../master-key.js');
66
+ // Open the DB once so vault + config tables exist for the steps below.
75
67
  const { getDb } = await import('../db.js');
76
- getDb(); // open/create the DB so the vault + config tables exist
77
- resolveMasterKey({ allowGenerate: true });
78
- console.log(' Master key ready.\n');
68
+ getDb();
69
+ const { setConfig } = await import('../config.js');
79
70
 
80
- // 2. Folder permissions for the bundled agent.
81
- console.log('2) Folder permissions');
82
- console.log(' The agent can read/write/run commands ONLY inside roots you grant here.');
83
- console.log(' (The repo root and workspace/ are always allowed. Leave blank to skip.)');
84
- const existingRoots = readEnvFile(layout.envFile).MADARX_ALLOWED_ROOTS || '';
85
- const roots = await ask(rl, ' Extra allowed roots (comma-separated absolute paths)', existingRoots);
86
- if (roots) {
87
- const cleaned = roots.split(',').map((r) => r.trim()).filter(Boolean).join(',');
88
- upsertEnvVar(layout.envFile, 'MADARX_ALLOWED_ROOTS', cleaned);
89
- console.log(` Granted: ${cleaned}\n`);
71
+ // ── 1. Usage mode ────────────────────────────────────────────────────────
72
+ h2('1 · How will you use madarX?');
73
+ const mode = await select('Choose a setup', [
74
+ { label: 'Personal', value: 'local', tag: 'recommended', hint: 'local-only, everything on this machine' },
75
+ { label: 'Team', value: 'supabase', hint: 'shared with a team via Supabase (auth, orgs, sharing)' },
76
+ ], { default: 0 });
77
+
78
+ if (mode === 'supabase') {
79
+ setConfig('auth_mode', 'supabase');
80
+ note('Enter your Supabase project credentials (stored in ' + layout.envFile + ').');
81
+ const existing = readEnvFile(layout.envFile);
82
+ const url = await ask('Supabase URL', { dflt: existing.SUPABASE_URL || existing.NEXT_PUBLIC_SUPABASE_URL || '' });
83
+ const anon = await ask('Supabase anon key', { dflt: existing.SUPABASE_ANON_KEY || '' });
84
+ const service = await ask('Supabase service-role key', { secret: true });
85
+ if (url) { upsertEnvVar(layout.envFile, 'SUPABASE_URL', url); upsertEnvVar(layout.envFile, 'NEXT_PUBLIC_SUPABASE_URL', url); }
86
+ if (anon) { upsertEnvVar(layout.envFile, 'SUPABASE_ANON_KEY', anon); upsertEnvVar(layout.envFile, 'NEXT_PUBLIC_SUPABASE_ANON_KEY', anon); }
87
+ if (service) upsertEnvVar(layout.envFile, 'SUPABASE_SERVICE_ROLE_KEY', service);
88
+ ok('Team mode (Supabase) configured.');
89
+ note('Apply the cloud schema once: see supabase/README.md.');
90
+ } else {
91
+ setConfig('auth_mode', 'local');
92
+ ok('Personal mode — local-only.');
93
+ }
94
+
95
+ // ── Model catalog (probes installed CLIs + Ollama; Anthropic always listed) ─
96
+ const { getModels, setModel, getModel } = await import('../agent-config.js');
97
+ const { defaultModelForEngine } = await import('../agent-engines.js');
98
+ let models = [];
99
+ try { models = await getModels(); } catch { models = []; }
100
+ const recommendedId = models.find((m) => m.engine === 'claude-code') ? 'claude-code'
101
+ : (models.find((m) => m.id === 'claude-sonnet-4-6') ? 'claude-sonnet-4-6' : models[0]?.id);
102
+ const modelOption = (m) => ({
103
+ label: m.label,
104
+ value: { id: m.id, engine: m.engine },
105
+ hint: m.engine,
106
+ tag: m.id === recommendedId ? 'recommended' : undefined,
107
+ });
108
+ const orderedModels = [
109
+ ...models.filter((m) => m.id === recommendedId),
110
+ ...models.filter((m) => m.id !== recommendedId),
111
+ ];
112
+
113
+ // ── 2. Main agent model ──────────────────────────────────────────────────
114
+ h2('2 · Main agent model');
115
+ note('the orchestrator that plans your work and dispatches sub-agents');
116
+ const current = getModel();
117
+ const mainChoice = await select('Select the main agent model', [
118
+ ...orderedModels.map(modelOption),
119
+ { label: `Keep current (${current})`, value: { keep: true } },
120
+ ], { default: 0 });
121
+ if (!mainChoice.keep) { setModel(mainChoice.id); ok(`Main agent → ${mainChoice.id}`); }
122
+ else ok(`Main agent unchanged (${current})`);
123
+ const mainEngine = mainChoice.keep ? null : mainChoice.engine;
124
+
125
+ // ── 3. Sub-agent default model ───────────────────────────────────────────
126
+ h2('3 · Sub-agent default model');
127
+ note('what newly created agents inherit unless you pick another at creation');
128
+ const subChoice = await select('Select the default sub-agent model', [
129
+ { label: 'Same as main agent', value: { same: true }, tag: 'recommended' },
130
+ ...orderedModels.map(modelOption),
131
+ ], { default: 0 });
132
+ let subEngine, subModel;
133
+ if (subChoice.same) {
134
+ subEngine = mainEngine || (orderedModels.find((m) => m.id === current)?.engine) || 'claude-code';
135
+ subModel = mainChoice.keep ? current : mainChoice.id;
90
136
  } else {
91
- console.log(' No extra roots granted.\n');
137
+ subEngine = subChoice.engine;
138
+ subModel = subChoice.engine === 'anthropic' ? subChoice.id : defaultModelForEngine(subChoice.engine);
92
139
  }
140
+ setConfig('default_agent_engine', subEngine);
141
+ setConfig('default_agent_model', subModel);
142
+ ok(`Sub-agents → ${subEngine}${subModel ? ' · ' + subModel : ''}`);
143
+
144
+ // ── 4. Secrets vault master key ──────────────────────────────────────────
145
+ h2('4 · Secrets vault');
146
+ const { resolveMasterKey } = await import('../master-key.js');
147
+ resolveMasterKey({ allowGenerate: true });
148
+ ok('Master key ready (AES-256-GCM).');
93
149
 
94
- // 3. API keys → encrypted vault.
95
- console.log('3) API keys (stored encrypted in the vault; press Enter to skip any)');
96
- const { setSecret } = await import('../secrets.js');
150
+ // ── 5. API keys → encrypted vault ────────────────────────────────────────
151
+ h2('5 · API keys');
152
+ note('stored encrypted in the vault · press Enter to skip any');
153
+ const { setSecret, getSecret } = await import('../secrets.js');
154
+ const usesAnthropic = [mainEngine, subEngine].includes('anthropic');
97
155
  const keyPrompts = [
98
- ['ANTHROPIC_API_KEY', 'Anthropic API key (Claude)'],
156
+ ['ANTHROPIC_API_KEY', 'Anthropic API key (Claude)' + (usesAnthropic ? ' — required for your selection' : '')],
99
157
  ['OPENAI_API_KEY', 'OpenAI API key (voice/realtime, optional)'],
100
158
  ];
101
159
  for (const [name, label] of keyPrompts) {
102
- const val = await askSecret(rl, ` ${label}`);
160
+ let have = false;
161
+ try { have = Boolean(getSecret(name)); } catch { /* vault may be empty */ }
162
+ const val = await ask(label + (have ? ' (set — Enter to keep)' : ''), { secret: true });
103
163
  if (val) {
104
- try { setSecret(name, val, { scope: 'global' }); console.log(` Stored ${name}.`); }
105
- catch (err) { console.error(` Could not store ${name}: ${err.message}`); }
164
+ try { setSecret(name, val, { scope: 'global' }); ok(`Stored ${name}.`); }
165
+ catch (err) { console.error(' ' + fg(P.mars, '✗') + ` Could not store ${name}: ${err.message}`); }
106
166
  }
107
167
  }
108
- console.log('');
109
-
110
- // 4. WhatsApp bridge toggle.
111
- console.log('4) WhatsApp bridge');
112
- const enableWa = await askYesNo(rl, ' Run the WhatsApp bridge with `madarx`?', true);
113
- if (enableWa) {
114
- removeEnvVar(layout.envFile, 'MADARX_DISABLE_WHATSAPP');
115
- console.log(' Enabled (idles until you pair a dedicated number).\n');
168
+
169
+ // ── 6. Folder permissions ────────────────────────────────────────────────
170
+ h2('6 · Folder permissions');
171
+ note('the agent can read/write/run ONLY inside roots you grant (repo + workspace/ always allowed)');
172
+ const existingRoots = readEnvFile(layout.envFile).MADARX_ALLOWED_ROOTS || '';
173
+ const roots = await ask('Extra allowed roots (comma-separated absolute paths)', { dflt: existingRoots });
174
+ if (roots) {
175
+ const cleaned = roots.split(',').map((r) => r.trim()).filter(Boolean).join(',');
176
+ upsertEnvVar(layout.envFile, 'MADARX_ALLOWED_ROOTS', cleaned);
177
+ ok(`Granted: ${cleaned}`);
116
178
  } else {
117
- upsertEnvVar(layout.envFile, 'MADARX_DISABLE_WHATSAPP', '1');
118
- console.log(' Disabled.\n');
179
+ note('no extra roots granted');
119
180
  }
120
181
 
121
- // 5. Auto-update preference (consumed by T3 self-update).
122
- console.log('5) Auto-update');
123
- const weekly = await askYesNo(rl, ' Check weekly for updates?', true);
124
- const { setConfig } = await import('../config.js');
125
- if (weekly) {
126
- const handsOff = await askYesNo(rl, ' Apply updates automatically (hands-off) instead of just notifying?', false);
182
+ // ── 7. WhatsApp bridge ───────────────────────────────────────────────────
183
+ h2('7 · WhatsApp bridge');
184
+ const enableWa = await confirm('Run the WhatsApp bridge with `madarx`?', { default: true });
185
+ if (enableWa) { removeEnvVar(layout.envFile, 'MADARX_DISABLE_WHATSAPP'); ok('Enabled idles until you pair a dedicated number.'); }
186
+ else { upsertEnvVar(layout.envFile, 'MADARX_DISABLE_WHATSAPP', '1'); ok('Disabled.'); }
187
+
188
+ // ── 8. Auto-update ───────────────────────────────────────────────────────
189
+ h2('8 · Auto-update');
190
+ const upd = await select('How should madarX handle updates?', [
191
+ { label: 'Notify weekly', value: 'notify', tag: 'recommended', hint: 'check weekly, tell me — I apply' },
192
+ { label: 'Auto-apply weekly', value: 'auto', hint: 'hands-off, gated by the approval/trust tier' },
193
+ { label: 'Off', value: 'off', hint: 'I will run `madarx update` myself' },
194
+ ], { default: 0 });
195
+ if (upd === 'off') { setConfig('auto_update_mode', 'off'); ok('Auto-update off.'); }
196
+ else {
127
197
  setConfig('auto_update_mode', 'weekly');
128
- setConfig('auto_update_apply', handsOff ? 'auto' : 'notify');
129
- console.log(` Weekly check on; updates will ${handsOff ? 'auto-apply (gated by the approval/trust tier)' : 'notify only'}.\n`);
130
- } else {
131
- setConfig('auto_update_mode', 'off');
132
- console.log(' Auto-update off. Run `madarx update` manually.\n');
198
+ setConfig('auto_update_apply', upd === 'auto' ? 'auto' : 'notify');
199
+ ok(`Weekly check on ${upd === 'auto' ? 'auto-apply' : 'notify only'}.`);
133
200
  }
134
201
 
135
- console.log('Setup complete. Start everything with: madarx\n');
202
+ console.log('\n' + bold(fg(P.platinum, 'Setup complete.')) + ' Start everything with: ' + fg(P.mars, 'madarx') + '\n');
136
203
  return 0;
137
204
  } catch (err) {
138
205
  console.error(`\nsetup failed: ${err?.stack || err}`);
139
206
  return 1;
140
- } finally {
141
- rl.close();
142
207
  }
143
208
  }
package/lib/runtime.js CHANGED
@@ -14,6 +14,7 @@ import { DEFAULT_PROJECT_ID, appendProjectChangelog, getProject } from './projec
14
14
  import { listActivity, listTasks, reportingSnapshot } from './delegation.js';
15
15
  import { getMainAgentTrustMode } from './tools/registry.js';
16
16
  import { defaultSkillsMarkdown } from './marketplace-seeds.js';
17
+ import { getConfig } from './config.js';
17
18
  import { publishLiveEvent, publishStateChanged } from './live-events.js';
18
19
  import { resolveTargetSpace } from './dashboard-spaces.js';
19
20
 
@@ -862,9 +863,14 @@ export function createAgent(payload = {}) {
862
863
  const type = payload.type || 'custom';
863
864
  const mission = payload.mission || 'Support Client Workspace operations as a local sub-agent.';
864
865
  const schedule = payload.schedule || 'on demand';
865
- const engine = payload.engine || 'claude-code';
866
+ // Default engine/model come from the setup wizard's choices (config keys
867
+ // default_agent_engine / default_agent_model) when the caller didn't specify.
868
+ let cfgEngine = null;
869
+ let cfgModel = null;
870
+ try { cfgEngine = getConfig('default_agent_engine', null); cfgModel = getConfig('default_agent_model', null); } catch { /* config optional */ }
871
+ const engine = payload.engine || cfgEngine || 'claude-code';
866
872
  const normalizedEngine = normalizeAgentEngine(engine);
867
- const model = payload.model || defaultModelForEngine(normalizedEngine);
873
+ const model = payload.model || (!payload.engine && cfgModel) || defaultModelForEngine(normalizedEngine);
868
874
  const tools = Array.isArray(payload.tools)
869
875
  ? payload.tools
870
876
  : String(payload.tools || 'web-search,browser,files,cron')
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "madarx",
3
- "version": "2.14.0",
3
+ "version": "2.15.0",
4
4
  "type": "module",
5
5
  "description": "Madarx OS — Next.js product with SQLite-backed runtime, scheduled cron daemon, and approval-gated local runners.",
6
6
  "license": "MIT",
@@ -56,7 +56,7 @@
56
56
  "hermes:job": "node --no-warnings --env-file-if-exists=.env.local scripts/hermes-job-runner.mjs",
57
57
  "whatsapp:bridge": "node --no-warnings --env-file-if-exists=.env.local scripts/whatsapp-daemon.mjs",
58
58
  "whatsapp:once": "WHATSAPP_DAEMON_ONCE=1 node --no-warnings --env-file-if-exists=.env.local scripts/whatsapp-daemon.mjs",
59
- "whatsapp:reset": "node -e \"const fs=require('node:fs');const p=require('node:path');const dir=p.join(process.cwd(),'data','whatsapp','session');fs.rmSync(dir,{recursive:true,force:true});console.log('Wiped',dir);\"",
59
+ "whatsapp:reset": "node --no-warnings --env-file-if-exists=.env.local scripts/whatsapp-reset.mjs",
60
60
  "smoke:routes": "node --no-warnings scripts/smoke-routes.mjs",
61
61
  "vendor:open-design": "node --no-warnings scripts/vendor-open-design.mjs",
62
62
  "check:disk-enc": "node --no-warnings scripts/check-disk-encryption.mjs",
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ // Wipe the WhatsApp Baileys session so the bridge offers a fresh pairing QR.
3
+ // Resolves the session dir from lib/paths.js so it honours $MADARX_HOME /
4
+ // MADARX_DATA_DIR (global installs live under ~/.madarx, not the repo cwd).
5
+ import fs from 'node:fs';
6
+ import { WHATSAPP_SESSION_DIR } from '../lib/paths.js';
7
+
8
+ try {
9
+ fs.rmSync(WHATSAPP_SESSION_DIR, { recursive: true, force: true });
10
+ console.log('[whatsapp:reset] wiped', WHATSAPP_SESSION_DIR);
11
+ console.log('[whatsapp:reset] restart madarx (or the WhatsApp bridge) to generate a fresh pairing QR.');
12
+ } catch (err) {
13
+ console.error('[whatsapp:reset] failed to wipe', WHATSAPP_SESSION_DIR, '—', err.message);
14
+ process.exit(1);
15
+ }
@@ -1 +0,0 @@
1
- exports.id=6474,exports.ids=[6474],exports.modules={6974:(a,b,c)=>{Promise.resolve().then(c.bind(c,35271))},14420:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{"4045b474fc63a6a572f3ca03f813d3525209e55e2b":()=>e.$$RSC_SERVER_ACTION_0});var e=c(91845),f=a([e]);e=(f.then?(await f)():f)[0],d()}catch(a){d(a)}})},35271:(a,b,c)=>{"use strict";c.d(b,{default:()=>d});let d=(0,c(97954).registerClientReference)(function(){throw Error("Attempted to call the default export of \"/home/runner/work/madarx-os/madarx-os/app/components/admin/project-switcher.jsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/home/runner/work/madarx-os/madarx-os/app/components/admin/project-switcher.jsx","default")},86893:(a,b,c)=>{"use strict";c.d(b,{hI:()=>g,iN:()=>f,pp:()=>i,qs:()=>h});var d=c(75338),e=c(35271);function f({kicker:a="madarX OS v1.0",title:b,description:c,actions:f,hideProjectSwitcher:g,children:h}){return(0,d.jsxs)("main",{className:"admin-shell",children:[(0,d.jsxs)("header",{className:"admin-header",children:[(0,d.jsxs)("div",{children:[(0,d.jsx)("span",{className:"admin-kicker",children:a}),(0,d.jsx)("h1",{children:b}),c?(0,d.jsx)("p",{children:c}):null]}),(0,d.jsxs)("div",{className:"admin-header-actions",children:[g?null:(0,d.jsx)(e.default,{}),f]})]}),h]})}function g({label:a,value:b,tone:c}){return(0,d.jsxs)("div",{className:`admin-stat ${c||""}`,children:[(0,d.jsx)("b",{children:b}),(0,d.jsx)("span",{children:a})]})}function h({children:a,tone:b="neutral"}){return(0,d.jsx)("span",{className:`admin-pill ${b}`,children:a})}function i({title:a,children:b}){return(0,d.jsxs)("div",{className:"admin-empty",children:[(0,d.jsx)("b",{children:a}),(0,d.jsx)("p",{children:b})]})}},89670:(a,b,c)=>{Promise.resolve().then(c.bind(c,94657))},91845:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{$$RSC_SERVER_ACTION_0:()=>u,default:()=>p,dynamic:()=>q,runtime:()=>r});var e=c(75338),f=c(75879);c(68633);var g=c(16780),h=c(82161),i=c(86893),j=c(83963),k=c(60105),l=a([j,k]);[j,k]=l.then?(await l)():l;let q="force-dynamic",r="nodejs",s={executive:"Executive",manager:"Manager",team_lead:"Team Lead",individual_contributor:"Contributor"},t={executive:"mars",manager:"ready",team_lead:"warn",individual_contributor:"neutral"};function m(a=""){return a.split(/\s+/).map(a=>a[0]).filter(Boolean).slice(0,2).join("").toUpperCase()||"\xb7"}let u=async function(a){let b=String(a.get("agent_id")||"").trim();if(!b)return;let c=String(a.get("reports_to")||"").trim(),d={reports_to:""===c?null:c},e=String(a.get("role")||"").trim();e&&(d.role=e);let f=String(a.get("title")||"").trim();(f||a.has("title"))&&(d.title=f||null);try{(0,j.jN)(b,d)}catch(a){console.warn("updateAgentOrg failed",a?.message)}(0,g.revalidatePath)("/org"),(0,g.revalidatePath)("/agents"),(0,h.redirect)("/org")};function n({node:a,workloadById:b}){let c=function(a){if(a.role&&s[a.role])return a.role;let b=a.reports?.length||0;return b>=4?"executive":b>=2?"manager":1===b?"team_lead":"individual_contributor"}(a),d=s[c],f=t[c],g=a.reports?.length||0,h=b.get(a.id),j=Number(h?.active_tasks||0),k=Number(h?.blocked_tasks||0),l=Number(h?.completed_tasks||0),n=a.status||"created";return(0,e.jsxs)("article",{className:`org-card org-card--${c}`,"data-reports":g>0?"has":"none",children:[(0,e.jsxs)("div",{className:"org-card-head",children:[(0,e.jsx)("div",{className:"org-card-avatar","aria-hidden":"true",children:m(a.name)}),(0,e.jsxs)("div",{className:"org-card-identity",children:[(0,e.jsx)("div",{className:"org-card-name",children:a.name}),(0,e.jsx)("div",{className:"org-card-title",children:a.title||a.mission?.slice(0,64)||"No title set"})]})]}),(0,e.jsxs)("div",{className:"org-card-meta",children:[(0,e.jsx)(i.qs,{tone:f,children:d}),(0,e.jsx)(i.qs,{tone:"heartbeat ok"===n?"ready":"terminated"===n?"danger":"neutral",children:n}),g>0?(0,e.jsxs)(i.qs,{tone:"neutral",children:[g," report",1===g?"":"s"]}):null]}),(0,e.jsxs)("dl",{className:"org-card-stats",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("dt",{children:"Active"}),(0,e.jsx)("dd",{children:j})]}),(0,e.jsxs)("div",{children:[(0,e.jsx)("dt",{children:"Blocked"}),(0,e.jsx)("dd",{className:k?"is-warn":"",children:k})]}),(0,e.jsxs)("div",{children:[(0,e.jsx)("dt",{children:"Done"}),(0,e.jsx)("dd",{children:l})]})]})]})}function o({node:a,workloadById:b}){let c=(a.reports||[]).length>0;return(0,e.jsxs)("li",{className:"org-branch",children:[(0,e.jsx)(n,{node:a,workloadById:b}),c?(0,e.jsx)("ul",{className:"org-children",children:a.reports.map(a=>(0,e.jsx)(o,{node:a,workloadById:b},a.id))}):null]})}function p(){let a=(0,j.zP)(),b=(0,j.hC)(),c=(0,k.vc)(),d=new Map((b.workload||[]).map(a=>[a.agent_id,a])),f=c.filter(a=>c.some(b=>b.reports_to===a.id)).length,g=c.filter(a=>!a.reports_to&&a.id).length;return(0,e.jsxs)(i.iN,{title:"Agent chart",description:"Company-style structure for your agent workforce. Set managers, define roles, and see workload at a glance.",children:[(0,e.jsxs)("section",{className:"admin-stats",children:[(0,e.jsx)(i.hI,{label:"Headcount",value:b.totals.active_agents}),(0,e.jsx)(i.hI,{label:"Leaders",value:f}),(0,e.jsx)(i.hI,{label:"Root nodes",value:g}),(0,e.jsx)(i.hI,{label:"Active tasks",value:b.totals.active_tasks})]}),(0,e.jsxs)("section",{className:"admin-panel",children:[(0,e.jsxs)("div",{className:"admin-panel-head",children:[(0,e.jsx)("span",{children:"Agent chart"}),(0,e.jsx)("small",{children:"Top-down hierarchy. Each card shows role, status, and current workload."})]}),a.length?(0,e.jsx)("div",{className:"org-chart-scroll",children:(0,e.jsx)("ul",{className:"org-chart",children:a.map(a=>(0,e.jsx)(o,{node:a,workloadById:d},a.id))})}):(0,e.jsx)(i.pp,{title:"No agents yet",children:"Create an agent on the Agents page, then come back here to assign managers."})]}),(0,e.jsxs)("section",{className:"admin-grid reports-layout",children:[(0,e.jsxs)("div",{className:"admin-panel",children:[(0,e.jsxs)("div",{className:"admin-panel-head",children:[(0,e.jsx)("span",{children:"Reporting lines"}),(0,e.jsx)("small",{children:"Re-parent any agent. Cycles are blocked automatically."})]}),c.length?(0,e.jsx)("div",{className:"admin-card-list compact",children:c.map(a=>{let b=a.reports_to?c.find(b=>b.id===a.reports_to):null,d=c.filter(b=>b.id!==a.id),f=a.role&&s[a.role]?a.role:"individual_contributor";return(0,e.jsxs)("form",{action:u,className:"org-reporting-row",children:[(0,e.jsx)("input",{type:"hidden",name:"agent_id",value:a.id}),(0,e.jsxs)("div",{className:"org-reporting-identity",children:[(0,e.jsx)("div",{className:"org-card-avatar small","aria-hidden":"true",children:m(a.name)}),(0,e.jsxs)("div",{children:[(0,e.jsx)("div",{className:"org-reporting-name",children:a.name}),(0,e.jsx)("div",{className:"org-reporting-sub",children:b?`Reports to ${b.name}`:"Top of chain"})]})]}),(0,e.jsxs)("div",{className:"org-reporting-fields",children:[(0,e.jsxs)("label",{className:"org-reporting-field",children:[(0,e.jsx)("span",{children:"Title"}),(0,e.jsx)("input",{type:"text",name:"title",defaultValue:a.title||"",placeholder:"e.g. Marketing Manager"})]}),(0,e.jsxs)("label",{className:"org-reporting-field",children:[(0,e.jsx)("span",{children:"Role"}),(0,e.jsx)("select",{name:"role",defaultValue:f,children:Object.entries(s).map(([a,b])=>(0,e.jsx)("option",{value:a,children:b},a))})]}),(0,e.jsxs)("label",{className:"org-reporting-field",children:[(0,e.jsx)("span",{children:"Manager"}),(0,e.jsxs)("select",{name:"reports_to",defaultValue:a.reports_to||"",children:[(0,e.jsx)("option",{value:"",children:"— None (top of chain)"}),d.map(a=>(0,e.jsx)("option",{value:a.id,children:a.name},a.id))]})]}),(0,e.jsx)("button",{className:"admin-button",type:"submit",children:"Save"})]})]},a.id)})}):(0,e.jsx)(i.pp,{title:"No agents yet",children:"Create agents to start building your org."})]}),(0,e.jsxs)("div",{className:"admin-panel",children:[(0,e.jsxs)("div",{className:"admin-panel-head",children:[(0,e.jsx)("span",{children:"Workload by agent"}),(0,e.jsx)("small",{children:"Derived from active tasks."})]}),b.workload.length?(0,e.jsx)("div",{className:"admin-card-list compact",children:b.workload.map(a=>(0,e.jsxs)("div",{className:"admin-record compact",children:[(0,e.jsxs)("div",{className:"admin-record-top",children:[(0,e.jsx)("b",{children:a.agent_name||a.agent_id}),(0,e.jsxs)(i.qs,{tone:a.blocked_tasks?"danger":a.active_tasks?"ready":"neutral",children:[a.active_tasks," active"]})]}),(0,e.jsxs)("p",{children:[a.total_tasks," total \xb7 ",a.blocked_tasks," blocked \xb7 ",a.completed_tasks," complete"]})]},a.agent_id))}):(0,e.jsx)(i.pp,{title:"No workload data",children:"Assign tasks to see workload distribution."})]})]})]})}(0,f.A)(u,"4045b474fc63a6a572f3ca03f813d3525209e55e2b",null),d()}catch(a){d(a)}})},94657:(a,b,c)=>{"use strict";c.d(b,{default:()=>f});var d=c(21124),e=c(38301);function f(){let[a,b]=(0,e.useState)([]),[c,f]=(0,e.useState)("");return(0,d.jsx)("div",{className:"project-switcher","data-project-switcher":!0,children:(0,d.jsxs)("select",{value:c,onChange:a=>{var b;f(b=a.target.value),b?localStorage.setItem("madarx.activeProjectId",b):localStorage.removeItem("madarx.activeProjectId"),window.dispatchEvent(new CustomEvent("madarx:project-change",{detail:{project_id:b||null}}))},"aria-label":"Active project",children:[(0,d.jsx)("option",{value:"",children:"All projects"}),a.map(a=>(0,d.jsx)("option",{value:a.id,children:a.name},a.id))]})})}}};