madarx 2.16.2 → 2.16.3

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 (329) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +602 -602
  3. package/.next/standalone/.next/app-path-routes-manifest.json +91 -91
  4. package/.next/standalone/.next/build-manifest.json +5 -5
  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 +3 -3
  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 +3 -3
  13. package/.next/standalone/.next/server/app/agents/[id]/page_client-reference-manifest.js +1 -1
  14. package/.next/standalone/.next/server/app/agents/page.js +1 -1
  15. package/.next/standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  16. package/.next/standalone/.next/server/app/api/activity/route_client-reference-manifest.js +1 -1
  17. package/.next/standalone/.next/server/app/api/admin/audit-export/route_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/api/admin/share-links/route_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/api/agent-memory/route_client-reference-manifest.js +1 -1
  20. package/.next/standalone/.next/server/app/api/agent-runs/[id]/cancel/route_client-reference-manifest.js +1 -1
  21. package/.next/standalone/.next/server/app/api/agent-runs/[id]/events/route_client-reference-manifest.js +1 -1
  22. package/.next/standalone/.next/server/app/api/agent-runs/[id]/log/route_client-reference-manifest.js +1 -1
  23. package/.next/standalone/.next/server/app/api/agent-runs/[id]/route_client-reference-manifest.js +1 -1
  24. package/.next/standalone/.next/server/app/api/agent-runs/route_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/api/agents/[id]/chain/route_client-reference-manifest.js +1 -1
  26. package/.next/standalone/.next/server/app/api/agents/[id]/memory/route_client-reference-manifest.js +1 -1
  27. package/.next/standalone/.next/server/app/api/agents/[id]/reports/route_client-reference-manifest.js +1 -1
  28. package/.next/standalone/.next/server/app/api/agents/[id]/run/route_client-reference-manifest.js +1 -1
  29. package/.next/standalone/.next/server/app/api/agents/[id]/skills/route_client-reference-manifest.js +1 -1
  30. package/.next/standalone/.next/server/app/api/agents/create/route_client-reference-manifest.js +1 -1
  31. package/.next/standalone/.next/server/app/api/agents/ops/route_client-reference-manifest.js +1 -1
  32. package/.next/standalone/.next/server/app/api/approvals/[id]/route_client-reference-manifest.js +1 -1
  33. package/.next/standalone/.next/server/app/api/approvals/route_client-reference-manifest.js +1 -1
  34. package/.next/standalone/.next/server/app/api/artifacts/[id]/acl/route_client-reference-manifest.js +1 -1
  35. package/.next/standalone/.next/server/app/api/artifacts/[id]/protect/route_client-reference-manifest.js +1 -1
  36. package/.next/standalone/.next/server/app/api/artifacts/[id]/raw/route_client-reference-manifest.js +1 -1
  37. package/.next/standalone/.next/server/app/api/artifacts/[id]/route_client-reference-manifest.js +1 -1
  38. package/.next/standalone/.next/server/app/api/artifacts/[id]/share-link/[linkId]/route_client-reference-manifest.js +1 -1
  39. package/.next/standalone/.next/server/app/api/artifacts/[id]/share-link/route_client-reference-manifest.js +1 -1
  40. package/.next/standalone/.next/server/app/api/artifacts/upload/route_client-reference-manifest.js +1 -1
  41. package/.next/standalone/.next/server/app/api/audit/list/route_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/api/audit/search/route_client-reference-manifest.js +1 -1
  43. package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
  44. package/.next/standalone/.next/server/app/api/auth/config/route_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/api/auth/join-bootstrap/route_client-reference-manifest.js +1 -1
  46. package/.next/standalone/.next/server/app/api/auth/session/route_client-reference-manifest.js +1 -1
  47. package/.next/standalone/.next/server/app/api/brand/route_client-reference-manifest.js +1 -1
  48. package/.next/standalone/.next/server/app/api/brand/share/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 +1 -1
  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.js +1 -1
  224. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  225. package/.next/standalone/.next/server/app/marketplace/page.js +3 -3
  226. package/.next/standalone/.next/server/app/marketplace/page_client-reference-manifest.js +1 -1
  227. package/.next/standalone/.next/server/app/mines/[projectId]/page_client-reference-manifest.js +1 -1
  228. package/.next/standalone/.next/server/app/mines/[projectId]/results/page_client-reference-manifest.js +1 -1
  229. package/.next/standalone/.next/server/app/mines/page_client-reference-manifest.js +1 -1
  230. package/.next/standalone/.next/server/app/missions/page.js +1 -1
  231. package/.next/standalone/.next/server/app/missions/page_client-reference-manifest.js +1 -1
  232. package/.next/standalone/.next/server/app/onboarding/org/page_client-reference-manifest.js +1 -1
  233. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  234. package/.next/standalone/.next/server/app/onboarding.html +2 -2
  235. package/.next/standalone/.next/server/app/onboarding.rsc +2 -2
  236. package/.next/standalone/.next/server/app/org/page.js +1 -1
  237. package/.next/standalone/.next/server/app/org/page.js.nft.json +1 -1
  238. package/.next/standalone/.next/server/app/org/page_client-reference-manifest.js +1 -1
  239. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  240. package/.next/standalone/.next/server/app/projects/[slug]/log/page_client-reference-manifest.js +1 -1
  241. package/.next/standalone/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
  242. package/.next/standalone/.next/server/app/projects/new/page.js +2 -2
  243. package/.next/standalone/.next/server/app/projects/new/page_client-reference-manifest.js +1 -1
  244. package/.next/standalone/.next/server/app/projects/new.html +1 -1
  245. package/.next/standalone/.next/server/app/projects/new.rsc +3 -3
  246. package/.next/standalone/.next/server/app/projects/page.js +11 -11
  247. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  248. package/.next/standalone/.next/server/app/reports/[file]/route_client-reference-manifest.js +1 -1
  249. package/.next/standalone/.next/server/app/reports/page_client-reference-manifest.js +1 -1
  250. package/.next/standalone/.next/server/app/runtime/page_client-reference-manifest.js +1 -1
  251. package/.next/standalone/.next/server/app/schedules/page.js +2 -2
  252. package/.next/standalone/.next/server/app/schedules/page_client-reference-manifest.js +1 -1
  253. package/.next/standalone/.next/server/app/settings/account/page_client-reference-manifest.js +1 -1
  254. package/.next/standalone/.next/server/app/settings/advanced/page_client-reference-manifest.js +1 -1
  255. package/.next/standalone/.next/server/app/settings/appearance/page_client-reference-manifest.js +1 -1
  256. package/.next/standalone/.next/server/app/settings/brand/page_client-reference-manifest.js +1 -1
  257. package/.next/standalone/.next/server/app/settings/brand.html +2 -2
  258. package/.next/standalone/.next/server/app/settings/brand.rsc +2 -2
  259. package/.next/standalone/.next/server/app/settings/connectors/page_client-reference-manifest.js +1 -1
  260. package/.next/standalone/.next/server/app/settings/engines/page_client-reference-manifest.js +1 -1
  261. package/.next/standalone/.next/server/app/settings/onboarding/page_client-reference-manifest.js +1 -1
  262. package/.next/standalone/.next/server/app/settings/onboarding.html +2 -2
  263. package/.next/standalone/.next/server/app/settings/onboarding.rsc +2 -2
  264. package/.next/standalone/.next/server/app/settings/organization/page.js +1 -1
  265. package/.next/standalone/.next/server/app/settings/organization/page.js.nft.json +1 -1
  266. package/.next/standalone/.next/server/app/settings/organization/page_client-reference-manifest.js +1 -1
  267. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  268. package/.next/standalone/.next/server/app/settings/runtime/page_client-reference-manifest.js +1 -1
  269. package/.next/standalone/.next/server/app/settings/team/page_client-reference-manifest.js +1 -1
  270. package/.next/standalone/.next/server/app/settings/tools/page_client-reference-manifest.js +1 -1
  271. package/.next/standalone/.next/server/app/settings.html +2 -2
  272. package/.next/standalone/.next/server/app/settings.rsc +2 -2
  273. package/.next/standalone/.next/server/app/share/[token]/page_client-reference-manifest.js +1 -1
  274. package/.next/standalone/.next/server/app/share/space/[token]/page_client-reference-manifest.js +1 -1
  275. package/.next/standalone/.next/server/app/tasks/[id]/page.js +1 -1
  276. package/.next/standalone/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  277. package/.next/standalone/.next/server/app/tasks/page.js +2 -2
  278. package/.next/standalone/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  279. package/.next/standalone/.next/server/app/team/[agentId]/page_client-reference-manifest.js +1 -1
  280. package/.next/standalone/.next/server/app/team/page_client-reference-manifest.js +1 -1
  281. package/.next/standalone/.next/server/app/tools/page_client-reference-manifest.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 +2 -2
  284. package/.next/standalone/.next/server/app/whatsapp.rsc +2 -2
  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 +91 -91
  291. package/.next/standalone/.next/server/chunks/1699.js +2 -2
  292. package/.next/standalone/.next/server/chunks/{5875.js → 9860.js} +1 -1
  293. package/.next/standalone/.next/server/functions-config-manifest.json +38 -38
  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/pages/404.html +1 -1
  297. package/.next/standalone/.next/server/pages/500.html +1 -1
  298. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  299. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  300. package/.next/standalone/.next/static/chunks/app/login/page-e23d5fe32a5160d5.js +1 -0
  301. package/.next/standalone/.next/static/chunks/app/projects/page-9792d7b57f298e6f.js +1 -0
  302. package/.next/standalone/.next/static/chunks/{webpack-e43c507177dcbe32.js → webpack-f916d679fe38a701.js} +1 -1
  303. package/.next/standalone/.next/static/css/{46782d1598444516.css → 54018a2de582f8bf.css} +1 -1
  304. package/.next/standalone/CHANGELOG.md +8 -0
  305. package/.next/standalone/data/.artifacts-migrated-v1 +1 -1
  306. package/.next/standalone/data/.default-project-seeded +1 -1
  307. package/.next/standalone/data/madarx.sqlite-shm +0 -0
  308. package/.next/standalone/data/madarx.sqlite-wal +0 -0
  309. package/.next/standalone/package.json +1 -1
  310. package/.next/static/chunks/app/login/page-e23d5fe32a5160d5.js +1 -0
  311. package/.next/static/chunks/app/projects/page-9792d7b57f298e6f.js +1 -0
  312. package/.next/static/chunks/{webpack-e43c507177dcbe32.js → webpack-f916d679fe38a701.js} +1 -1
  313. package/.next/static/css/{46782d1598444516.css → 54018a2de582f8bf.css} +1 -1
  314. package/CHANGELOG.md +8 -0
  315. package/ai-docs/api-surface.md +1 -1
  316. package/ai-docs/key-constraints.md +1 -1
  317. package/app/globals.css +12 -5
  318. package/app/login/login-client.jsx +16 -22
  319. package/lib/tts.js +75 -5
  320. package/package.json +1 -1
  321. package/scripts/misotts-local-server.py +150 -0
  322. package/.next/standalone/.next/static/chunks/app/login/page-f990dfc0fe6af059.js +0 -1
  323. package/.next/standalone/.next/static/chunks/app/projects/page-054a548cf5443c3f.js +0 -1
  324. package/.next/static/chunks/app/login/page-f990dfc0fe6af059.js +0 -1
  325. package/.next/static/chunks/app/projects/page-054a548cf5443c3f.js +0 -1
  326. /package/.next/standalone/.next/static/{FudFirvPoaz8nsaeW6PBB → PoL-cD5mauHkRGcYCq0A2}/_buildManifest.js +0 -0
  327. /package/.next/standalone/.next/static/{FudFirvPoaz8nsaeW6PBB → PoL-cD5mauHkRGcYCq0A2}/_ssgManifest.js +0 -0
  328. /package/.next/static/{FudFirvPoaz8nsaeW6PBB → PoL-cD5mauHkRGcYCq0A2}/_buildManifest.js +0 -0
  329. /package/.next/static/{FudFirvPoaz8nsaeW6PBB → PoL-cD5mauHkRGcYCq0A2}/_ssgManifest.js +0 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  All notable changes to Madarx OS. Newest first.
4
4
 
5
+ ## Unreleased
6
+
7
+ ## [2.16.3] - 2026-06-05
8
+
9
+ ### Added
10
+
11
+ - **Local MisoTTS-compatible voice fallback.** `voice_speak` and `/api/voice/tts` now support a `local` provider through `MADARX_LOCAL_TTS_URL`, with optional `MADARX_LOCAL_TTS_MODEL` / `MADARX_LOCAL_TTS_VOICE`, so self-hosted engines can speak replies without OpenAI or ElevenLabs. Added `scripts/misotts-local-server.py` as a minimal bridge for `MisoLabsAI/MisoTTS`.
12
+
5
13
  ## [2.16.2] - 2026-06-05
6
14
 
7
15
  ### Changed
@@ -57,7 +57,7 @@ Reference for every `app/api/**/route.js` route. Read this when you need to find
57
57
 
58
58
  | Route | Description |
59
59
  |-------|-------------|
60
- | `GET/POST /api/voice/tts` | TTS provider status + audio synthesis for OpenAI / ElevenLabs. Audio streams; credentials stay in vault. |
60
+ | `GET/POST /api/voice/tts` | TTS provider status + audio synthesis for OpenAI / ElevenLabs / local HTTP TTS (`MADARX_LOCAL_TTS_URL`, including the optional MisoTTS bridge). Audio streams; credentials stay in vault. |
61
61
  | `GET/POST /api/voice/realtime/session` | OpenAI Realtime availability + ephemeral browser session. Client secret returned but never stored. Body accepts `project_id`/`agent_id`. |
62
62
  | `POST /api/voice/realtime/tool-result` | Relays model-requested tools through `executeVoiceTool` / `executeRegistryTool`. All gates preserved. |
63
63
  | `GET /api/voice/providers` | Provider capabilities snapshot (realtime/tts/stt/llm) + default mode + local slot URLs. |
@@ -50,7 +50,7 @@ Integration credentials (`GITHUB_TOKEN`, `RESEND_API_KEY`, `SUPABASE_*`, `VERCEL
50
50
 
51
51
  ## Voice tools (Jarvis console)
52
52
 
53
- Provider abstraction lives in `lib/voice/providers.js`. Lanes: `realtime` (primary — OpenAI Realtime via WebRTC; vault keys `OPENAI_API_KEY`, optional `OPENAI_REALTIME_MODEL`, `OPENAI_REALTIME_VOICE`), `tts` (fallback — existing typed chat speaks final reply via OpenAI TTS or ElevenLabs; vault keys `OPENAI_API_KEY`/`ELEVENLABS_API_KEY` + optional `ELEVENLABS_VOICE_ID`), and `local` (open-source slots — env-driven `MADARX_LOCAL_STT_URL`/`MADARX_LOCAL_TTS_URL`). Default mode resolves at runtime (`realtime` → `tts` → `local` → `off`) and respects `MADARX_VOICE_DEFAULT_PROVIDER`. Every voice session is minted with a durable Madarx context (`lib/voice/context.js`): today's ISO date, active project, brand voice, open tasks, recent artifact titles, pending approvals, and non-`local_only` agent memory — never API keys, ephemeral tokens, or `local_only` memory. The voice model sees a curated tool catalog (`lib/voice/tools.js`): `create_artifact`, `update_artifact`, `delete_artifact`, `find_artifacts`, `get_state`, `web_search`, `web_fetch`, `voice_speak`. All calls flow through `executeVoiceTool` → `executeTool` → `executeRegistryTool`, so trust-mode, approval gates (including the never-bypassable `irreversible_external` tier), allowlists, rate limits, egress logging, and audit rows are preserved exactly as for typed chat. Realtime ephemeral client secrets are returned to the browser but never persisted; the long-lived OpenAI key never crosses to the browser. UI: `app/components/dashboard/voice-panel.jsx` + `voice-orb.jsx` + `use-realtime-voice.js`. Brand: Onyx surface, Bone/Graphite text, Mars Red only on active speech peaks + approval banners. Operator guide: `docs/voice/jarvis.md`. `cli-printing-press` documented as a deferred external companion in `docs/integrations/cli-printing-press.md`.
53
+ Provider abstraction lives in `lib/voice/providers.js`. Lanes: `realtime` (primary — OpenAI Realtime via WebRTC; vault keys `OPENAI_API_KEY`, optional `OPENAI_REALTIME_MODEL`, `OPENAI_REALTIME_VOICE`), `tts` (fallback — existing typed chat speaks final reply via OpenAI TTS, ElevenLabs, or the env-driven local HTTP TTS slot; vault keys `OPENAI_API_KEY`/`ELEVENLABS_API_KEY` + optional `ELEVENLABS_VOICE_ID`; local uses `MADARX_LOCAL_TTS_URL`, optional `MADARX_LOCAL_TTS_MODEL`/`MADARX_LOCAL_TTS_VOICE`), and `local` (open-source STT/TTS slots — `MADARX_LOCAL_STT_URL`/`MADARX_LOCAL_TTS_URL`; `scripts/misotts-local-server.py` provides a minimal MisoLabsAI/MisoTTS bridge). Default mode resolves at runtime (`realtime` → `tts` → `local` → `off`) and respects `MADARX_VOICE_DEFAULT_PROVIDER`. Every voice session is minted with a durable Madarx context (`lib/voice/context.js`): today's ISO date, active project, brand voice, open tasks, recent artifact titles, pending approvals, and non-`local_only` agent memory — never API keys, ephemeral tokens, or `local_only` memory. The voice model sees a curated tool catalog (`lib/voice/tools.js`): `create_artifact`, `update_artifact`, `delete_artifact`, `find_artifacts`, `get_state`, `web_search`, `web_fetch`, `voice_speak`. All calls flow through `executeVoiceTool` → `executeTool` → `executeRegistryTool`, so trust-mode, approval gates (including the never-bypassable `irreversible_external` tier), allowlists, rate limits, egress logging, and audit rows are preserved exactly as for typed chat. Realtime ephemeral client secrets are returned to the browser but never persisted; the long-lived OpenAI key never crosses to the browser. UI: `app/components/dashboard/voice-panel.jsx` + `voice-orb.jsx` + `use-realtime-voice.js`. Brand: Onyx surface, Bone/Graphite text, Mars Red only on active speech peaks + approval banners. Operator guide: `docs/voice/jarvis.md`. `cli-printing-press` documented as a deferred external companion in `docs/integrations/cli-printing-press.md`.
54
54
 
55
55
  ## WhatsApp gateway
56
56
 
package/app/globals.css CHANGED
@@ -3668,8 +3668,8 @@ a.admin-record-link{display:block;text-decoration:none;color:inherit;transition:
3668
3668
  .login-wordmark{font:500 22px/1 var(--font-mono-brand,'IBM Plex Mono',ui-monospace,monospace);letter-spacing:-.06em;color:#E8E8E5;position:relative;z-index:1;}.login-wordmark span{color:#C2452A;}
3669
3669
  .login-kicker{margin:72px 0 16px;color:#DCDCD8;text-transform:uppercase;letter-spacing:.18em;font-size:11px;position:relative;z-index:1;}.login-hero-panel h1{font-size:clamp(48px,7.8vw,104px);line-height:.88;letter-spacing:-.09em;max-width:960px;margin:0;color:#E8E8E5;position:relative;z-index:1;}.login-lede{max-width:690px;margin:28px 0 0;color:#BEBEB9;line-height:1.75;font-family:ui-sans-serif,system-ui,sans-serif;font-size:16px;position:relative;z-index:1;}
3670
3670
  .login-proof-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1px;margin-top:56px;border:1px solid rgba(232,232,229,.10);position:relative;z-index:1;}.login-proof-grid div{padding:18px;background:rgba(232,232,229,.035);}.login-proof-grid b{display:block;color:#E8E8E5;font-size:12px;margin-bottom:8px;text-transform:uppercase;letter-spacing:.08em;}.login-proof-grid span{display:block;color:#A9AAA5;font:13px/1.55 ui-sans-serif,system-ui,sans-serif;}
3671
- .login-card{padding:clamp(24px,5vw,56px);display:flex;flex-direction:column;justify-content:center;min-height:100vh;border-left:1px solid rgba(232,232,229,.10);}.login-card-head p{margin:0 0 10px;color:#C2452A;text-transform:uppercase;letter-spacing:.16em;font-size:11px;font-weight:800;}.login-card-head h2{margin:0 0 24px;color:#E8E8E5;font-size:28px;letter-spacing:-.05em;}.login-mode-toggle{display:grid;grid-template-columns:1fr 1fr;gap:4px;padding:4px;border:1px solid rgba(232,232,229,.12);border-radius:16px;background:rgba(232,232,229,.04);margin-bottom:18px;}.login-mode-toggle button{border:0;border-radius:12px;background:transparent;color:#A9AAA5;padding:10px 12px;cursor:pointer;font-weight:800;}.login-mode-toggle button.active{background:#E8E8E5;color:#0F0F11;}.login-message{border-left:2px solid #C2452A;background:rgba(194,69,42,.10);padding:12px 14px;margin-bottom:16px;color:#E8E8E5;font:13px/1.45 ui-sans-serif,system-ui,sans-serif;}.login-form{display:grid;gap:14px;}.login-form label{display:grid;gap:8px;color:#DCDCD8;font-size:11px;text-transform:uppercase;letter-spacing:.12em;font-weight:800;}.login-sso{display:grid;gap:10px;margin-top:18px;}.login-sso>span{display:flex;align-items:center;gap:12px;color:#8D8E8A;font-size:11px;text-transform:uppercase;letter-spacing:.12em;}.login-sso>span::before,.login-sso>span::after{content:'';height:1px;background:rgba(232,232,229,.12);flex:1;}.login-footnote{margin:22px 0 0;color:#8D8E8A;font:12px/1.65 ui-sans-serif,system-ui,sans-serif;}.login-local-card{min-height:100vh;display:grid;place-content:center;padding:36px;text-align:center;}.login-local-card h1{font-size:42px;letter-spacing:-.07em;margin:22px 0 12px;}.login-local-card p{max-width:560px;color:#BEBEB9;font:15px/1.7 ui-sans-serif,system-ui,sans-serif;}.login-link-button{display:inline-flex;align-items:center;gap:8px;justify-content:center;margin:24px auto 0;padding:12px 16px;border-radius:14px;background:#E8E8E5;color:#0F0F11;text-decoration:none;font-weight:850;}
3672
- .login-link-button--ghost{margin-top:12px;background:transparent;color:#E8E8E5;border:1px solid rgba(232,232,229,.18);}
3671
+ .login-card{padding:clamp(24px,5vw,56px);display:flex;flex-direction:column;justify-content:center;min-height:100vh;border-left:1px solid rgba(232,232,229,.10);}.login-card-head p{margin:0 0 10px;color:#C2452A;text-transform:uppercase;letter-spacing:.16em;font-size:11px;font-weight:800;}.login-card-head h2{margin:0 0 24px;color:#E8E8E5;font-size:28px;letter-spacing:-.05em;}.login-mode-toggle{display:grid;grid-template-columns:1fr 1fr;gap:4px;padding:4px;border:1px solid rgba(232,232,229,.12);border-radius:8px;background:rgba(232,232,229,.04);margin-bottom:18px;}.login-mode-toggle button{border:0;border-radius:5px;background:transparent;color:#A9AAA5;padding:10px 12px;cursor:pointer;font-family:var(--font-mono-brand,'IBM Plex Mono',ui-monospace,monospace);font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.1em;transition:background .14s ease,color .14s ease,box-shadow .14s ease;}.login-mode-toggle button.active{background:rgba(194,69,42,.14);color:#E8E8E5;box-shadow:inset 0 0 0 1px rgba(194,69,42,.5);}.login-message{border-left:2px solid #C2452A;background:rgba(194,69,42,.10);padding:12px 14px;margin-bottom:16px;color:#E8E8E5;font:13px/1.45 ui-sans-serif,system-ui,sans-serif;}.login-form{display:grid;gap:14px;}.login-form label{display:grid;gap:8px;color:#DCDCD8;font-size:11px;text-transform:uppercase;letter-spacing:.12em;font-weight:800;}.login-sso{display:grid;gap:10px;margin-top:18px;}.login-sso>span{display:flex;align-items:center;gap:12px;color:#8D8E8A;font-size:11px;text-transform:uppercase;letter-spacing:.12em;}.login-sso>span::before,.login-sso>span::after{content:'';height:1px;background:rgba(232,232,229,.12);flex:1;}.login-footnote{margin:22px 0 0;color:#8D8E8A;font:12px/1.65 ui-sans-serif,system-ui,sans-serif;}.login-local-card{min-height:100vh;display:grid;place-content:center;padding:36px;text-align:center;}.login-local-card h1{font-size:42px;letter-spacing:-.07em;margin:22px 0 12px;}.login-local-card p{max-width:560px;color:#BEBEB9;font:15px/1.7 ui-sans-serif,system-ui,sans-serif;}.login-link-button{display:inline-flex;align-items:center;gap:10px;justify-content:center;margin:24px auto 0;padding:13px 20px;border-radius:4px;background:#C2452A;color:#fff;text-decoration:none;font-family:var(--font-mono-brand,'IBM Plex Mono',ui-monospace,monospace);font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.14em;transition:opacity .15s ease;}.login-link-button:hover{opacity:.86;}
3672
+ .login-link-button--ghost{margin-top:12px;background:transparent;color:#C2452A;border:1px solid rgba(194,69,42,.4);}.login-link-button--ghost:hover{opacity:1;background:rgba(194,69,42,.1);border-color:#C2452A;}
3673
3673
  .login-message--warn{border-left-color:#C2452A;background:rgba(194,69,42,.08);}
3674
3674
  .login-message--warn code,.login-local-card code{font:600 12px/1.4 ui-monospace,SFMono-Regular,Menlo,monospace;color:#E8E8E5;background:rgba(232,232,229,.10);padding:1px 6px;border-radius:6px;}
3675
3675
  .login-env-block{text-align:left;max-width:560px;margin:18px auto;padding:16px 18px;border-radius:14px;background:rgba(0,0,0,.34);border:1px solid rgba(232,232,229,.12);color:#DCDCD8;font:600 12.5px/1.7 ui-monospace,SFMono-Regular,Menlo,monospace;white-space:pre;overflow-x:auto;}
@@ -3677,9 +3677,9 @@ a.admin-record-link{display:block;text-decoration:none;color:inherit;transition:
3677
3677
  .login-text-button{background:none;border:0;padding:0;color:#C2452A;font:inherit;font-weight:700;cursor:pointer;text-decoration:underline;}
3678
3678
  .login-text-button:disabled{opacity:.6;cursor:default;}
3679
3679
  /* Personal vs Team chooser (top of the login card) */
3680
- .login-seg{display:grid;grid-template-columns:1fr 1fr;gap:4px;padding:4px;border:1px solid rgba(232,232,229,.12);border-radius:16px;background:rgba(232,232,229,.04);margin-bottom:22px;}
3681
- .login-seg button{border:0;border-radius:12px;background:transparent;color:#A9AAA5;padding:11px 12px;cursor:pointer;font-weight:800;letter-spacing:-.01em;transition:background .14s ease,color .14s ease;}
3682
- .login-seg button.active{background:#E8E8E5;color:#0F0F11;}
3680
+ .login-seg{display:grid;grid-template-columns:1fr 1fr;gap:4px;padding:4px;border:1px solid rgba(232,232,229,.12);border-radius:8px;background:rgba(232,232,229,.04);margin-bottom:22px;}
3681
+ .login-seg button{border:0;border-radius:5px;background:transparent;color:#A9AAA5;padding:11px 12px;cursor:pointer;font-family:var(--font-mono-brand,'IBM Plex Mono',ui-monospace,monospace);font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.1em;transition:background .14s ease,color .14s ease,box-shadow .14s ease;}
3682
+ .login-seg button.active{background:rgba(194,69,42,.14);color:#E8E8E5;box-shadow:inset 0 0 0 1px rgba(194,69,42,.5);}
3683
3683
  /* Join-with-a-link row (Team view) */
3684
3684
  .login-join{margin-top:22px;padding-top:18px;border-top:1px solid rgba(232,232,229,.10);}
3685
3685
  .login-join-label{display:block;color:#8D8E8A;font-size:11px;text-transform:uppercase;letter-spacing:.12em;font-weight:800;margin-bottom:10px;}
@@ -3687,6 +3687,13 @@ a.admin-record-link{display:block;text-decoration:none;color:inherit;transition:
3687
3687
  /* Inline Create-a-team form (Team view, fresh install) */
3688
3688
  .login-create-team{margin-top:2px;}
3689
3689
  .login-create-actions{display:flex;gap:8px;align-items:stretch;}
3690
+ /* Marketing-matched buttons (madarx.io): solid Mars primary, Mars-outline secondary, uppercase mono, crisp corners */
3691
+ .login-btn{width:100%;min-height:46px;display:inline-flex;align-items:center;justify-content:center;gap:10px;padding:0 18px;border:0;border-radius:4px;background:#C2452A;color:#fff;font-family:var(--font-mono-brand,'IBM Plex Mono',ui-monospace,monospace);font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.14em;cursor:pointer;transition:opacity .15s ease,background .15s ease,border-color .15s ease;}
3692
+ .login-btn:hover:not(:disabled){opacity:.86;}
3693
+ .login-btn:disabled{opacity:.5;cursor:default;}
3694
+ .login-btn--ghost{background:transparent;color:#C2452A;border:1px solid rgba(194,69,42,.4);}
3695
+ .login-btn--ghost:hover:not(:disabled){opacity:1;background:rgba(194,69,42,.1);border-color:#C2452A;}
3696
+ .login-btn--inline{width:auto;flex:0 0 auto;}
3690
3697
  .auth-mode-toggle{display:grid;grid-template-columns:1fr 1fr;gap:8px;}
3691
3698
  .auth-mode-toggle button{display:flex;flex-direction:column;gap:3px;text-align:left;padding:12px 14px;border-radius:12px;border:1px solid rgba(20,22,26,.14);background:#fff;color:#313740;font-weight:700;cursor:pointer;transition:border-color 140ms ease,background 140ms ease;}
3692
3699
  .auth-mode-toggle button small{font-weight:450;color:#737a85;font-size:11.5px;}
@@ -17,15 +17,9 @@ const inputStyle = {
17
17
  border: '1px solid rgba(232,232,229,.18)', background: 'rgba(255,255,255,.06)',
18
18
  color: '#E8E8E5', outline: 'none', fontSize: 14,
19
19
  };
20
- const buttonStyle = {
21
- width: '100%', minHeight: 46, border: 0, borderRadius: 14,
22
- background: '#E8E8E5', color: '#0F0F11', fontWeight: 800,
23
- display: 'inline-flex', alignItems: 'center', justifyContent: 'center', gap: 8,
24
- cursor: 'pointer', letterSpacing: '-0.01em',
25
- };
26
- const secondaryButtonStyle = {
27
- ...buttonStyle, background: 'rgba(232,232,229,.06)', color: '#E8E8E5', border: '1px solid rgba(232,232,229,.16)',
28
- };
20
+ // Button visuals live in globals.css (.login-btn / --ghost / --inline) so they can
21
+ // carry hover + disabled states. Marketing-matched: solid Mars red primary, Mars
22
+ // outline secondary, uppercase mono labels, crisp corners.
29
23
 
30
24
  export default function LoginClient({ authMode, nextPath = '/', errorCode = '', forceSupabase = false, initialView = '' }) {
31
25
  const isLocalServer = authMode === 'local';
@@ -230,7 +224,7 @@ export default function LoginClient({ authMode, nextPath = '/', errorCode = '',
230
224
  <input style={inputStyle} type="text" value={recoveryToken} onChange={(e) => setRecoveryToken(e.target.value)} placeholder="paste recovery token" autoComplete="off" />
231
225
  </label>
232
226
  <span className="login-footnote" style={{ marginTop: 0 }}>Found in <code>data/.auth-recovery-token</code> on the server machine.</span>
233
- <button type="button" style={{ ...buttonStyle, opacity: resetting ? .65 : 1 }} disabled={resetting} onClick={resetToLocal}>
227
+ <button type="button" className="login-btn" disabled={resetting} onClick={resetToLocal}>
234
228
  {resetting ? 'Switching…' : 'Switch to personal mode'}
235
229
  </button>
236
230
  </div>
@@ -258,13 +252,13 @@ export default function LoginClient({ authMode, nextPath = '/', errorCode = '',
258
252
  <form onSubmit={signIn} className="login-form">
259
253
  <label>Email<input style={inputStyle} type="email" value={email} onChange={(e) => setEmail(e.target.value)} placeholder="you@company.com" autoComplete="email" required /></label>
260
254
  {mode === 'password' ? <label>Password<input style={inputStyle} type="password" value={password} onChange={(e) => setPassword(e.target.value)} placeholder="Password" autoComplete="current-password" required /></label> : null}
261
- <button type="submit" disabled={loading} style={{ ...buttonStyle, opacity: loading ? .65 : 1 }}>{loading ? 'Working...' : mode === 'password' ? 'Sign in' : 'Send magic link'} {!loading ? <IconArrowRight /> : null}</button>
255
+ <button type="submit" className="login-btn" disabled={loading}>{loading ? 'Working...' : mode === 'password' ? 'Sign in' : 'Send magic link'} {!loading ? <IconArrowRight /> : null}</button>
262
256
  </form>
263
257
  {(process.env.NEXT_PUBLIC_GOOGLE_SSO_ENABLED === 'true' || process.env.NEXT_PUBLIC_MICROSOFT_SSO_ENABLED === 'true') ? (
264
258
  <div className="login-sso">
265
259
  <span>or continue with</span>
266
- {process.env.NEXT_PUBLIC_GOOGLE_SSO_ENABLED === 'true' ? <button type="button" onClick={() => sso('google')} style={secondaryButtonStyle}><IconGoogle /> Google</button> : null}
267
- {process.env.NEXT_PUBLIC_MICROSOFT_SSO_ENABLED === 'true' ? <button type="button" onClick={() => sso('azure')} style={secondaryButtonStyle}><IconMicrosoft /> Microsoft</button> : null}
260
+ {process.env.NEXT_PUBLIC_GOOGLE_SSO_ENABLED === 'true' ? <button type="button" onClick={() => sso('google')} className="login-btn login-btn--ghost"><IconGoogle /> Google</button> : null}
261
+ {process.env.NEXT_PUBLIC_MICROSOFT_SSO_ENABLED === 'true' ? <button type="button" onClick={() => sso('azure')} className="login-btn login-btn--ghost"><IconMicrosoft /> Microsoft</button> : null}
268
262
  </div>
269
263
  ) : null}
270
264
  </>
@@ -281,8 +275,8 @@ export default function LoginClient({ authMode, nextPath = '/', errorCode = '',
281
275
  <label>Anon key<input style={inputStyle} type="text" value={ct.anonKey} onChange={(e) => setCt((s) => ({ ...s, anonKey: e.target.value }))} placeholder="eyJ…" autoComplete="off" required /></label>
282
276
  <label>Service-role key<input style={inputStyle} type="password" value={ct.serviceKey} onChange={(e) => setCt((s) => ({ ...s, serviceKey: e.target.value }))} placeholder="eyJ… (kept server-side)" autoComplete="off" required /></label>
283
277
  <div className="login-create-actions">
284
- <button type="button" style={{ ...secondaryButtonStyle, width: 'auto', flex: '0 0 auto', padding: '0 16px' }} disabled={Boolean(ctBusy)} onClick={testTeam}>{ctBusy === 'test' ? 'Testing…' : 'Test'}</button>
285
- <button type="submit" style={{ ...buttonStyle, opacity: ctBusy ? .65 : 1 }} disabled={Boolean(ctBusy)}>{ctBusy === 'save' ? 'Creating…' : 'Create team'} {!ctBusy ? <IconArrowRight /> : null}</button>
278
+ <button type="button" className="login-btn login-btn--ghost login-btn--inline" disabled={Boolean(ctBusy)} onClick={testTeam}>{ctBusy === 'test' ? 'Testing…' : 'Test'}</button>
279
+ <button type="submit" className="login-btn" disabled={Boolean(ctBusy)}>{ctBusy === 'save' ? 'Creating…' : 'Create team'} {!ctBusy ? <IconArrowRight /> : null}</button>
286
280
  </div>
287
281
  </form>
288
282
  );
@@ -299,7 +293,7 @@ export default function LoginClient({ authMode, nextPath = '/', errorCode = '',
299
293
  <span className="login-join-label">Have an invite link?</span>
300
294
  <form className="login-join-row" onSubmit={joinWithLink}>
301
295
  <input style={inputStyle} type="text" value={inviteLink} onChange={(e) => setInviteLink(e.target.value)} placeholder="paste invite link" autoComplete="off" />
302
- <button type="submit" style={{ ...secondaryButtonStyle, width: 'auto', flex: '0 0 auto', padding: '0 18px', whiteSpace: 'nowrap' }}>Join</button>
296
+ <button type="submit" className="login-btn login-btn--ghost login-btn--inline">Join</button>
303
297
  </form>
304
298
  </div>
305
299
 
@@ -340,13 +334,13 @@ export default function LoginClient({ authMode, nextPath = '/', errorCode = '',
340
334
  </svg>
341
335
  <div className="login-wordmark">madar<span>X</span> OS</div>
342
336
  </div>
343
- <p className="login-kicker">Institutional agent control plane</p>
344
- <h1>AI generates. Humans approve. Regulators can inspect.</h1>
345
- <p className="login-lede">Run it personally on your machine, or set up an organization boundary with Supabase and share generated HTML artifacts through signed, expiring access links.</p>
337
+ <p className="login-kicker">Core operating layer</p>
338
+ <h1>AI does the work. You hold the controls.</h1>
339
+ <p className="login-lede">madarX OS is the operating layer for AI-run operations. Agents draft, plan, and execute &mdash; every consequential action waits for a human, and nothing happens off the record.</p>
346
340
  <div className="login-proof-grid">
347
- <div><b>Personal or team</b><span>Local-first by default. Add Supabase when you want an org.</span></div>
348
- <div><b>Artifact ACLs</b><span>Private, organization, team-ready, and link-scoped controls.</span></div>
349
- <div><b>Audit ledger</b><span>Share creation, access, and revocation are recorded.</span></div>
341
+ <div><b>Human in the loop</b><span>Agents propose. People approve. The HAIL methodology, built in.</span></div>
342
+ <div><b>One operating logic</b><span>Workflows, governance, and orchestration in a single layer.</span></div>
343
+ <div><b>Every action logged</b><span>Nothing is inferred. Creation, access, and approval are recorded.</span></div>
350
344
  </div>
351
345
  </section>
352
346
  <section className="login-card" aria-label="Sign in">
package/lib/tts.js CHANGED
@@ -1,6 +1,7 @@
1
1
  // Text-to-speech domain layer.
2
2
  //
3
- // Providers: 'openai' (default — uses `tts-1` / `tts-1-hd`) and 'elevenlabs'.
3
+ // Providers: 'openai' (default — uses `tts-1` / `tts-1-hd`), 'elevenlabs',
4
+ // and 'local' (env-driven HTTP slot for self-hosted engines such as MisoTTS).
4
5
  // Returns the raw audio buffer plus mime metadata. When `save_to_disk` is
5
6
  // requested AND a project_id is supplied, writes an artifact under
6
7
  // data/disk/<project>/voice/ mirroring the transcribeFile pattern.
@@ -16,7 +17,7 @@ import { wrapFetch } from './egress.js';
16
17
  import { uploadFile, getRootFolder, createFolder } from './disk.js';
17
18
  import { getProject } from './projects.js';
18
19
 
19
- export const TTS_PROVIDERS = ['openai', 'elevenlabs'];
20
+ export const TTS_PROVIDERS = ['openai', 'elevenlabs', 'local'];
20
21
  export const DEFAULT_OPENAI_TTS_MODEL = 'tts-1';
21
22
  export const DEFAULT_OPENAI_VOICE = 'alloy';
22
23
  export const DEFAULT_ELEVENLABS_MODEL = 'eleven_multilingual_v2';
@@ -24,6 +25,11 @@ export const DEFAULT_ELEVENLABS_VOICE_ID = '21m00Tcm4TlvDq8ikWAM'; // Rachel —
24
25
 
25
26
  const OPENAI_VOICES = new Set(['alloy', 'echo', 'fable', 'onyx', 'nova', 'shimmer']);
26
27
 
28
+ function localTtsUrl() {
29
+ const value = process.env.MADARX_LOCAL_TTS_URL;
30
+ return value && /^https?:\/\//i.test(value.trim()) ? value.trim() : null;
31
+ }
32
+
27
33
  function ensureVoiceFolder(projectId) {
28
34
  const db = getDb();
29
35
  const root = getRootFolder(projectId);
@@ -130,12 +136,75 @@ async function synthesizeElevenLabs({ text, voice, model, format, fetchFn }) {
130
136
  };
131
137
  }
132
138
 
139
+ async function synthesizeLocal({ text, voice, model, format, fetchFn }) {
140
+ const url = localTtsUrl();
141
+ if (!url) throw new Error('MADARX_LOCAL_TTS_URL missing for local TTS');
142
+ const useFormat = format || 'wav';
143
+ const useModel = model || process.env.MADARX_LOCAL_TTS_MODEL || 'local';
144
+ const useVoice = voice || process.env.MADARX_LOCAL_TTS_VOICE || 'default';
145
+
146
+ let res;
147
+ try {
148
+ res = await fetchFn(url, {
149
+ method: 'POST',
150
+ headers: {
151
+ 'Content-Type': 'application/json',
152
+ Accept: useFormat === 'mp3' ? 'audio/mpeg,application/json' : 'audio/wav,audio/*,application/json',
153
+ },
154
+ body: JSON.stringify({
155
+ text,
156
+ voice: useVoice,
157
+ model: useModel,
158
+ format: useFormat,
159
+ }),
160
+ });
161
+ } catch (err) {
162
+ throw new Error(`local tts failed: ${maskMessage(err?.message)}`);
163
+ }
164
+ if (!res.ok) {
165
+ let detail = '';
166
+ try { detail = (await res.text()).slice(0, 256); } catch {}
167
+ throw new Error(`local tts http ${res.status}: ${detail}`);
168
+ }
169
+
170
+ const contentType = String(res.headers.get('content-type') || '').toLowerCase();
171
+ if (contentType.includes('application/json')) {
172
+ let payload;
173
+ try { payload = await res.json(); } catch {
174
+ throw new Error('local tts returned invalid JSON');
175
+ }
176
+ const b64 = payload?.audio_base64 || payload?.audio;
177
+ if (!b64) throw new Error('local tts JSON must include audio_base64');
178
+ const mime = payload.mime_type || payload.content_type || (useFormat === 'mp3' ? 'audio/mpeg' : 'audio/wav');
179
+ const ext = payload.extension || (String(mime).includes('mpeg') || String(mime).includes('mp3') ? 'mp3' : 'wav');
180
+ return {
181
+ audio_buffer: Buffer.from(String(b64), 'base64'),
182
+ mime_type: mime,
183
+ extension: ext,
184
+ provider: 'local',
185
+ voice: payload.voice || useVoice,
186
+ model: payload.model || useModel,
187
+ };
188
+ }
189
+
190
+ const buffer = Buffer.from(await res.arrayBuffer());
191
+ const isMp3 = contentType.includes('mpeg') || contentType.includes('mp3') || useFormat === 'mp3';
192
+ return {
193
+ audio_buffer: buffer,
194
+ mime_type: contentType || (isMp3 ? 'audio/mpeg' : 'audio/wav'),
195
+ extension: isMp3 ? 'mp3' : 'wav',
196
+ provider: 'local',
197
+ voice: useVoice,
198
+ model: useModel,
199
+ };
200
+ }
201
+
133
202
  /**
134
203
  * Synthesize speech.
135
204
  *
136
205
  * @param {{
137
206
  * text: string,
138
- * provider?: 'openai' | 'elevenlabs',
207
+ * provider?: 'openai' | 'elevenlabs' | 'local',
139
208
  * voice?: string,
140
209
  * model?: string,
141
210
  * format?: 'mp3' | 'wav',
@@ -156,11 +225,11 @@ export async function synthesizeSpeech(opts = {}) {
156
225
  if (!text) throw new Error('text is required');
157
226
  if (text.length > 4000) throw new Error('text too long: max 4000 characters');
158
227
 
159
- const providerHint = String(opts.provider || process.env.TTS_DEFAULT_PROVIDER || 'openai').toLowerCase();
228
+ const providerHint = String(opts.provider || process.env.MADARX_VOICE_DEFAULT_PROVIDER || process.env.TTS_DEFAULT_PROVIDER || 'openai').toLowerCase();
160
229
  const provider = TTS_PROVIDERS.includes(providerHint) ? providerHint : 'openai';
161
230
  const fetchFn = wrapFetch('voice_speak', opts.agent_id ?? null, opts.fetch || fetch);
162
231
 
163
- const synth = provider === 'elevenlabs' ? synthesizeElevenLabs : synthesizeOpenAi;
232
+ const synth = provider === 'elevenlabs' ? synthesizeElevenLabs : provider === 'local' ? synthesizeLocal : synthesizeOpenAi;
164
233
  const result = await synth({ text, voice: opts.voice, model: opts.model, format: opts.format, fetchFn });
165
234
 
166
235
  // Rough estimate: ~14 chars per second of speech at default rate.
@@ -221,5 +290,6 @@ export function ttsProvidersConfigured() {
221
290
  return {
222
291
  openai: Boolean(getSecret('OPENAI_API_KEY') || process.env.OPENAI_API_KEY),
223
292
  elevenlabs: Boolean(getSecret('ELEVENLABS_API_KEY') || process.env.ELEVENLABS_API_KEY),
293
+ local: Boolean(localTtsUrl()),
224
294
  };
225
295
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "madarx",
3
- "version": "2.16.2",
3
+ "version": "2.16.3",
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",
@@ -0,0 +1,150 @@
1
+ #!/usr/bin/env python3
2
+ """Minimal local HTTP bridge for MisoLabsAI/MisoTTS.
3
+
4
+ Run this outside the Next.js process and point Madarx at it:
5
+
6
+ git clone https://github.com/MisoLabsAI/MisoTTS.git ~/MisoTTS
7
+ cd ~/MisoTTS
8
+ uv sync --python 3.10
9
+ MISO_TTS_REPO_DIR=$PWD uv run python /path/to/madarx-os/scripts/misotts-local-server.py
10
+ MADARX_LOCAL_TTS_URL=http://127.0.0.1:8799/tts MADARX_VOICE_DEFAULT_PROVIDER=local npm run dev
11
+
12
+ POST /tts with JSON {"text":"...","voice":"0","format":"wav"} returns audio/wav.
13
+ The model is loaded lazily on first request and cached in-process.
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ import json
19
+ import os
20
+ import sys
21
+ import tempfile
22
+ from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
23
+ from pathlib import Path
24
+ from typing import Any
25
+
26
+ # MisoTTS is intentionally not vendored into Madarx. Point at a local clone or
27
+ # install it into this Python environment with `pip install -e /path/to/MisoTTS`.
28
+ _repo_dir = os.environ.get("MISO_TTS_REPO_DIR")
29
+ if _repo_dir:
30
+ sys.path.insert(0, _repo_dir)
31
+
32
+ os.environ.setdefault("HF_HUB_ETAG_TIMEOUT", "60")
33
+ os.environ.setdefault("HF_HUB_DOWNLOAD_TIMEOUT", "60")
34
+ os.environ.setdefault("NO_TORCH_COMPILE", "1")
35
+
36
+ _generator: Any | None = None
37
+ _torch: Any | None = None
38
+ _torchaudio: Any | None = None
39
+ _segment_cls: Any | None = None
40
+
41
+
42
+ def _load_generator():
43
+ global _generator, _torch, _torchaudio, _segment_cls
44
+ if _generator is not None:
45
+ return _generator
46
+
47
+ import torch # type: ignore
48
+ import torchaudio # type: ignore
49
+ from generator import DEFAULT_MISO_TTS_REPO_ID, load_miso_8b, Segment # type: ignore
50
+
51
+ device = os.environ.get("MISO_TTS_DEVICE") or ("cuda" if torch.cuda.is_available() else "cpu")
52
+ model_source = os.environ.get("MISO_TTS_8B_MODEL", DEFAULT_MISO_TTS_REPO_ID)
53
+ _generator = load_miso_8b(device=device, model_path_or_repo_id=model_source)
54
+ _torch = torch
55
+ _torchaudio = torchaudio
56
+ _segment_cls = Segment
57
+ return _generator
58
+
59
+
60
+ def _speaker_id(raw: Any) -> int:
61
+ if raw is None or raw == "":
62
+ return 0
63
+ if isinstance(raw, int):
64
+ return raw
65
+ value = str(raw).strip().lower()
66
+ if value.startswith("speaker-"):
67
+ value = value.split("-", 1)[1]
68
+ try:
69
+ return int(value)
70
+ except ValueError:
71
+ return 0
72
+
73
+
74
+ class Handler(BaseHTTPRequestHandler):
75
+ server_version = "MadarxMisoTTS/0.1"
76
+
77
+ def _json(self, status: int, payload: dict[str, Any]) -> None:
78
+ data = json.dumps(payload).encode("utf-8")
79
+ self.send_response(status)
80
+ self.send_header("Content-Type", "application/json")
81
+ self.send_header("Content-Length", str(len(data)))
82
+ self.end_headers()
83
+ self.wfile.write(data)
84
+
85
+ def do_GET(self) -> None: # noqa: N802 - stdlib handler name
86
+ if self.path.rstrip("/") in ("", "/health"):
87
+ self._json(200, {"ok": True, "provider": "misotts", "loaded": _generator is not None})
88
+ return
89
+ self._json(404, {"error": "not_found"})
90
+
91
+ def do_POST(self) -> None: # noqa: N802 - stdlib handler name
92
+ if self.path.rstrip("/") != "/tts":
93
+ self._json(404, {"error": "not_found"})
94
+ return
95
+ try:
96
+ length = int(self.headers.get("Content-Length", "0"))
97
+ body = json.loads(self.rfile.read(length).decode("utf-8"))
98
+ except Exception as exc: # pragma: no cover - defensive request parsing
99
+ self._json(400, {"error": f"invalid_json: {exc}"})
100
+ return
101
+
102
+ text = str(body.get("text") or "").strip()
103
+ if not text:
104
+ self._json(400, {"error": "text is required"})
105
+ return
106
+ if len(text) > int(os.environ.get("MISO_TTS_MAX_CHARS", "800")):
107
+ self._json(413, {"error": "text too long for local MisoTTS bridge"})
108
+ return
109
+
110
+ try:
111
+ generator = _load_generator()
112
+ if generator is None:
113
+ raise RuntimeError("MisoTTS generator did not initialize")
114
+ torchaudio = _torchaudio
115
+ if torchaudio is None:
116
+ raise RuntimeError("torchaudio did not initialize")
117
+ audio = generator.generate(
118
+ text=text,
119
+ speaker=_speaker_id(body.get("voice")),
120
+ context=[],
121
+ max_audio_length_ms=int(body.get("max_audio_length_ms") or os.environ.get("MISO_TTS_MAX_AUDIO_MS", "10000")),
122
+ )
123
+ with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as tmp:
124
+ tmp_path = Path(tmp.name)
125
+ try:
126
+ torchaudio.save(str(tmp_path), audio.unsqueeze(0).cpu(), generator.sample_rate)
127
+ data = tmp_path.read_bytes()
128
+ finally:
129
+ tmp_path.unlink(missing_ok=True)
130
+ except Exception as exc:
131
+ self._json(500, {"error": f"misotts_generation_failed: {exc}"})
132
+ return
133
+
134
+ self.send_response(200)
135
+ self.send_header("Content-Type", "audio/wav")
136
+ self.send_header("Content-Length", str(len(data)))
137
+ self.send_header("X-Provider", "misotts")
138
+ self.end_headers()
139
+ self.wfile.write(data)
140
+
141
+
142
+ def main() -> None:
143
+ host = os.environ.get("MISO_TTS_HOST", "127.0.0.1")
144
+ port = int(os.environ.get("MISO_TTS_PORT", "8799"))
145
+ print(f"MisoTTS local bridge listening on http://{host}:{port}/tts", flush=True)
146
+ ThreadingHTTPServer((host, port), Handler).serve_forever()
147
+
148
+
149
+ if __name__ == "__main__":
150
+ main()
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4520],{30407:(e,t,n)=>{Promise.resolve().then(n.bind(n,57622))},57622:(e,t,n)=>{"use strict";n.d(t,{default:()=>u});var i=n(95155),s=n(12115),a=n(95704);function o(){return(0,i.jsx)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:(0,i.jsx)("path",{d:"M5 12h14M12 5l7 7-7 7"})})}function l(){return(0,i.jsxs)("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true",children:[(0,i.jsx)("path",{fill:"#4285F4",d:"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"}),(0,i.jsx)("path",{fill:"#34A853",d:"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"}),(0,i.jsx)("path",{fill:"#FBBC05",d:"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"}),(0,i.jsx)("path",{fill:"#EA4335",d:"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"})]})}function r(){return(0,i.jsxs)("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true",children:[(0,i.jsx)("rect",{x:"1",y:"1",width:"10",height:"10",fill:"#f25022"}),(0,i.jsx)("rect",{x:"13",y:"1",width:"10",height:"10",fill:"#7fba00"}),(0,i.jsx)("rect",{x:"1",y:"13",width:"10",height:"10",fill:"#00a4ef"}),(0,i.jsx)("rect",{x:"13",y:"13",width:"10",height:"10",fill:"#ffb900"})]})}let c={width:"100%",padding:"13px 14px",borderRadius:14,border:"1px solid rgba(232,232,229,.18)",background:"rgba(255,255,255,.06)",color:"#E8E8E5",outline:"none",fontSize:14},d={width:"100%",minHeight:46,border:0,borderRadius:14,background:"#E8E8E5",color:"#0F0F11",fontWeight:800,display:"inline-flex",alignItems:"center",justifyContent:"center",gap:8,cursor:"pointer",letterSpacing:"-0.01em"},h={...d,background:"rgba(232,232,229,.06)",color:"#E8E8E5",border:"1px solid rgba(232,232,229,.16)"};function u(e){let{authMode:t,nextPath:u="/",errorCode:p="",forceSupabase:g=!1,initialView:m=""}=e,x="local"===t,y="string"==typeof u&&u.startsWith("/")?u:"/",[j,b]=(0,s.useState)("personal"===m||"team"===m?m:x&&!g?"personal":"team"),[f,v]=(0,s.useState)("password"),[k,w]=(0,s.useState)(""),[S,C]=(0,s.useState)(""),[N,E]=(0,s.useState)(!1),[O,A]=(0,s.useState)(p?"Supabase could not complete sign-in. Try again.":""),[T,_]=(0,s.useState)(null),[L,K]=(0,s.useState)(!1),[P,B]=(0,s.useState)(!1),[I,W]=(0,s.useState)(""),[M,R]=(0,s.useState)(""),[U,F]=(0,s.useState)({url:"",anonKey:"",serviceKey:""}),[z,D]=(0,s.useState)("");(0,s.useEffect)(()=>{let e=!0;return fetch("/api/auth/config",{cache:"no-store"}).then(e=>e.json()).then(t=>{e&&_(t)}).catch(()=>{e&&_({authMode:t,supabaseConfigured:!1})}),()=>{e=!1}},[t]);let H=!!((null==T?void 0:T.supabaseUrl)&&(null==T?void 0:T.supabaseAnonKey)),X=!x||g||H;async function J(){if(!I.trim())return void A("Enter the recovery token to switch.");K(!0),A("");try{let e=await fetch("/api/auth/config",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({action:"save",mode:"local",recoveryToken:I.trim()})}),t=await e.json().catch(()=>({}));if(e.ok&&t.ok)return void window.location.assign("/");K(!1),A(403===e.status?"Invalid recovery token.":"Could not switch to personal mode.")}catch(e){K(!1),A("Could not switch to personal mode.")}}async function q(e){e.preventDefault(),D("save"),A("");try{let e=await fetch("/api/auth/config",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({action:"save",mode:"supabase",url:U.url.trim(),anonKey:U.anonKey.trim(),serviceKey:U.serviceKey.trim()})}),t=await e.json().catch(()=>({}));if(!e.ok||!t.ok)throw Error("connection_failed"===t.error?"Could not connect to that Supabase project. Check the URL and keys.":t.error||"Could not save team settings.");_(e=>({...e||{},authMode:"supabase",supabaseConfigured:!0,supabaseUrl:U.url.trim(),supabaseAnonKey:U.anonKey.trim()})),A("Team created. Sign in to finish — your first sign-in makes you the owner.")}catch(e){A((null==e?void 0:e.message)||"Could not create the team.")}finally{D("")}}async function G(){D("test"),A("");try{let e=await fetch("/api/auth/config",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({action:"test",url:U.url.trim(),anonKey:U.anonKey.trim()})}),t=await e.json().catch(()=>({}));A(t.ok?"Connection OK. Create the team to continue.":"Connection failed. Check the URL and anon key.")}catch(e){A("Connection test failed.")}finally{D("")}}async function Y(){let{createBrowserClient:e}=await Promise.all([n.e(5730),n.e(840)]).then(n.bind(n,9230)),t=null==T?void 0:T.supabaseUrl,i=null==T?void 0:T.supabaseAnonKey;if(!t||!i)throw Error("Supabase is not configured. Create a team or set it in Settings → Account.");return e(t,i)}async function V(e){e.preventDefault(),E(!0),A("");try{let e=await Y(),t="".concat(window.location.origin,"/api/auth/callback?next=").concat(encodeURIComponent(y)),n="magic"===f?await e.auth.signInWithOtp({email:k,options:{emailRedirectTo:t}}):await e.auth.signInWithPassword({email:k,password:S});if(n.error)throw n.error;"magic"===f?A("Secure sign-in link sent to ".concat(k,".")):window.location.assign(y)}catch(e){A((null==e?void 0:e.message)||"Sign-in failed.")}finally{E(!1)}}async function Q(e){E(!0),A("");try{let t=await Y(),{error:n}=await t.auth.signInWithOAuth({provider:e,options:{redirectTo:"".concat(window.location.origin,"/api/auth/callback?next=").concat(encodeURIComponent(y))}});if(n)throw n}catch(e){A((null==e?void 0:e.message)||"SSO failed."),E(!1)}}return(0,i.jsxs)("main",{className:"login-page-shell",children:[(0,i.jsxs)("section",{className:"login-hero-panel","aria-label":"madarX OS landing",children:[(0,i.jsx)("div",{className:"login-orbit","aria-hidden":"true",children:(0,i.jsxs)("svg",{viewBox:"0 0 700 700",width:"700",height:"700",children:[(0,i.jsxs)("g",{className:"login-orbit-spin",children:[(0,i.jsx)("circle",{cx:"350",cy:"350",r:"320",stroke:"#E8E8E5",strokeWidth:"1",fill:"none",opacity:".10"}),(0,i.jsx)("circle",{cx:"350",cy:"350",r:"240",stroke:"#E8E8E5",strokeWidth:"1",fill:"none",opacity:".08"})]}),(0,i.jsxs)("g",{className:"login-orbit-spin login-orbit-spin--rev",children:[(0,i.jsx)("circle",{cx:"350",cy:"350",r:"160",stroke:"#C2452A",strokeWidth:"1.2",fill:"none",opacity:".30"}),(0,i.jsx)("circle",{cx:"350",cy:"350",r:"80",stroke:"#E8E8E5",strokeWidth:".8",fill:"none",opacity:".06"})]}),(0,i.jsx)("g",{className:"login-orbit-bead",children:(0,i.jsx)("circle",{cx:"350",cy:"190",r:"3.5",fill:"#C2452A"})}),(0,i.jsx)("g",{className:"login-orbit-bead login-orbit-bead--outer",children:(0,i.jsx)("circle",{cx:"350",cy:"30",r:"2.5",fill:"#E8E8E5",opacity:".5"})})]})}),(0,i.jsxs)("div",{className:"login-brand-lockup",children:[(0,i.jsxs)("svg",{className:"login-mark",width:"40",height:"40",viewBox:"0 0 100 100","aria-hidden":"true",children:[(0,i.jsx)("path",{className:"lm-arc",d:"M 85.32 31.22 A 40 40 0 1 1 78.78 22.20",stroke:"#E8E8E5",strokeWidth:"2.4",fill:"none",strokeLinecap:"round"}),(0,i.jsx)("line",{className:"lm-x1",x1:"21.72",y1:"21.72",x2:"78.28",y2:"78.28",stroke:"#E8E8E5",strokeWidth:"2.4",strokeLinecap:"round"}),(0,i.jsx)("line",{className:"lm-x2",x1:"21.72",y1:"78.28",x2:"78.28",y2:"21.72",stroke:"#E8E8E5",strokeWidth:"2.4",strokeLinecap:"round"}),(0,i.jsx)("circle",{className:"lm-bead",cx:"82.36",cy:"26.49",r:"3",fill:"#C2452A"})]}),(0,i.jsxs)("div",{className:"login-wordmark",children:["madar",(0,i.jsx)("span",{children:"X"})," OS"]})]}),(0,i.jsx)("p",{className:"login-kicker",children:"Institutional agent control plane"}),(0,i.jsx)("h1",{children:"AI generates. Humans approve. Regulators can inspect."}),(0,i.jsx)("p",{className:"login-lede",children:"Run it personally on your machine, or set up an organization boundary with Supabase and share generated HTML artifacts through signed, expiring access links."}),(0,i.jsxs)("div",{className:"login-proof-grid",children:[(0,i.jsxs)("div",{children:[(0,i.jsx)("b",{children:"Personal or team"}),(0,i.jsx)("span",{children:"Local-first by default. Add Supabase when you want an org."})]}),(0,i.jsxs)("div",{children:[(0,i.jsx)("b",{children:"Artifact ACLs"}),(0,i.jsx)("span",{children:"Private, organization, team-ready, and link-scoped controls."})]}),(0,i.jsxs)("div",{children:[(0,i.jsx)("b",{children:"Audit ledger"}),(0,i.jsx)("span",{children:"Share creation, access, and revocation are recorded."})]})]})]}),(0,i.jsxs)("section",{className:"login-card","aria-label":"Sign in",children:[(0,i.jsxs)("div",{className:"login-seg",role:"tablist","aria-label":"Account type",children:[(0,i.jsx)("button",{type:"button",role:"tab","aria-selected":"personal"===j,className:"personal"===j?"active":"",onClick:()=>b("personal"),children:"Personal"}),(0,i.jsx)("button",{type:"button",role:"tab","aria-selected":"team"===j,className:"team"===j?"active":"",onClick:()=>b("team"),children:"Team"})]}),"personal"===j?x&&!H?(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)("div",{className:"login-card-head",children:[(0,i.jsx)("p",{children:"This device"}),(0,i.jsx)("h2",{children:"Personal mode"})]}),(0,i.jsx)("p",{className:"login-footnote",style:{marginTop:0},children:"You're the local owner — no account needed. Work stays on this machine and sharing uses the local signed-link registry."}),O?(0,i.jsx)("div",{className:"login-message",children:O}):null,(0,i.jsxs)("a",{className:"login-link-button",href:y,style:{margin:"20px 0 0"},children:["Enter dashboard ",(0,i.jsx)(o,{})]}),(0,i.jsxs)("button",{type:"button",className:"login-link-button login-link-button--ghost",style:{margin:"12px 0 0",cursor:"pointer"},onClick:()=>{A(""),b("team")},children:["Create or join a team ",(0,i.jsx)(o,{})]}),(0,i.jsx)("p",{className:"login-footnote",style:{textAlign:"center"},children:"Collaborate with others through a shared Supabase organization."})]}):(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)("div",{className:"login-card-head",children:[(0,i.jsx)("p",{children:"This device"}),(0,i.jsx)("h2",{children:"Use it personally"})]}),(0,i.jsxs)("div",{className:"login-message login-message--warn",children:["This server runs in ",(0,i.jsx)("b",{children:"team mode"}),". Switching to personal (local) mode turns off organization sign-in for everyone on this server, so it needs the on-disk recovery token."]}),O?(0,i.jsx)("div",{className:"login-message",children:O}):null,P?(0,i.jsxs)("div",{className:"login-form",children:[(0,i.jsxs)("label",{children:["Recovery token",(0,i.jsx)("input",{style:c,type:"text",value:I,onChange:e=>W(e.target.value),placeholder:"paste recovery token",autoComplete:"off"})]}),(0,i.jsxs)("span",{className:"login-footnote",style:{marginTop:0},children:["Found in ",(0,i.jsx)("code",{children:"data/.auth-recovery-token"})," on the server machine."]}),(0,i.jsx)("button",{type:"button",style:{...d,opacity:L?.65:1},disabled:L,onClick:J,children:L?"Switching…":"Switch to personal mode"})]}):(0,i.jsxs)("button",{type:"button",className:"login-link-button login-link-button--ghost",style:{cursor:"pointer"},onClick:()=>B(!0),children:["Switch to personal mode ",(0,i.jsx)(o,{})]})]}):(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)("div",{className:"login-card-head",children:[(0,i.jsx)("p",{children:"Secure access"}),(0,i.jsx)("h2",{children:X?"Sign in to your team":"Set up your team"})]}),O?(0,i.jsx)("div",{className:"login-message",children:O}):null,X?(0,i.jsxs)(i.Fragment,{children:[x?(0,i.jsxs)("div",{className:"login-message login-message--warn",children:["Server is in ",(0,i.jsx)("b",{children:"local mode"}),". You can sign in to test, but sessions persist only after switching to team mode in ",(0,i.jsx)("a",{href:"/settings/account",children:"Settings → Account"}),"."]}):null,(0,i.jsxs)("div",{className:"login-mode-toggle",role:"tablist","aria-label":"Sign-in method",children:[(0,i.jsx)("button",{type:"button",className:"password"===f?"active":"",onClick:()=>v("password"),children:"Password"}),(0,i.jsx)("button",{type:"button",className:"magic"===f?"active":"",onClick:()=>v("magic"),children:"Magic link"})]}),(0,i.jsxs)("form",{onSubmit:V,className:"login-form",children:[(0,i.jsxs)("label",{children:["Email",(0,i.jsx)("input",{style:c,type:"email",value:k,onChange:e=>w(e.target.value),placeholder:"you@company.com",autoComplete:"email",required:!0})]}),"password"===f?(0,i.jsxs)("label",{children:["Password",(0,i.jsx)("input",{style:c,type:"password",value:S,onChange:e=>C(e.target.value),placeholder:"Password",autoComplete:"current-password",required:!0})]}):null,(0,i.jsxs)("button",{type:"submit",disabled:N,style:{...d,opacity:N?.65:1},children:[N?"Working...":"password"===f?"Sign in":"Send magic link"," ",N?null:(0,i.jsx)(o,{})]})]}),"true"===a.env.NEXT_PUBLIC_GOOGLE_SSO_ENABLED||"true"===a.env.NEXT_PUBLIC_MICROSOFT_SSO_ENABLED?(0,i.jsxs)("div",{className:"login-sso",children:[(0,i.jsx)("span",{children:"or continue with"}),"true"===a.env.NEXT_PUBLIC_GOOGLE_SSO_ENABLED?(0,i.jsxs)("button",{type:"button",onClick:()=>Q("google"),style:h,children:[(0,i.jsx)(l,{})," Google"]}):null,"true"===a.env.NEXT_PUBLIC_MICROSOFT_SSO_ENABLED?(0,i.jsxs)("button",{type:"button",onClick:()=>Q("azure"),style:h,children:[(0,i.jsx)(r,{})," Microsoft"]}):null]}):null]}):(0,i.jsxs)("form",{className:"login-form login-create-team",onSubmit:q,children:[(0,i.jsx)("p",{className:"login-footnote",style:{marginTop:0},children:"Connect a Supabase project to host your team. Your first sign-in becomes the owner. Keys are stored encrypted on this server, never in the browser."}),(0,i.jsxs)("label",{children:["Supabase URL",(0,i.jsx)("input",{style:c,type:"url",value:U.url,onChange:e=>F(t=>({...t,url:e.target.value})),placeholder:"https://xxxx.supabase.co",autoComplete:"off",required:!0})]}),(0,i.jsxs)("label",{children:["Anon key",(0,i.jsx)("input",{style:c,type:"text",value:U.anonKey,onChange:e=>F(t=>({...t,anonKey:e.target.value})),placeholder:"eyJ…",autoComplete:"off",required:!0})]}),(0,i.jsxs)("label",{children:["Service-role key",(0,i.jsx)("input",{style:c,type:"password",value:U.serviceKey,onChange:e=>F(t=>({...t,serviceKey:e.target.value})),placeholder:"eyJ… (kept server-side)",autoComplete:"off",required:!0})]}),(0,i.jsxs)("div",{className:"login-create-actions",children:[(0,i.jsx)("button",{type:"button",style:{...h,width:"auto",flex:"0 0 auto",padding:"0 16px"},disabled:!!z,onClick:G,children:"test"===z?"Testing…":"Test"}),(0,i.jsxs)("button",{type:"submit",style:{...d,opacity:z?.65:1},disabled:!!z,children:["save"===z?"Creating…":"Create team"," ",z?null:(0,i.jsx)(o,{})]})]})]}),(0,i.jsxs)("div",{className:"login-join",children:[(0,i.jsx)("span",{className:"login-join-label",children:"Have an invite link?"}),(0,i.jsxs)("form",{className:"login-join-row",onSubmit:function(e){e.preventDefault();let t=M.trim();if(!t)return void A("Paste your invite link first.");let n="#invite=",i=t.indexOf(n),s=i>=0?t.slice(i+n.length):t;if(!(s=s.split(/[?&\s]/)[0]))return void A("That invite link looks incomplete.");window.location.href="/join#invite=".concat(s)},children:[(0,i.jsx)("input",{style:c,type:"text",value:M,onChange:e=>R(e.target.value),placeholder:"paste invite link",autoComplete:"off"}),(0,i.jsx)("button",{type:"submit",style:{...h,width:"auto",flex:"0 0 auto",padding:"0 18px",whiteSpace:"nowrap"},children:"Join"})]})]}),X?(0,i.jsx)("p",{className:"login-footnote",children:"Supabase stores identity. madarX OS stores local runtime state, artifact ACLs, and share-link audit events."}):null]})]})]})}}},e=>{e.O(0,[8441,1255,7358],()=>e(e.s=30407)),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[893],{45:(e,a,t)=>{"use strict";t.d(a,{default:()=>o});var s=t(12115),n={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"},l=t(64250);let r=(0,s.createContext)({}),o=(0,s.forwardRef)((e,a)=>{var t,o,c;let{color:i,size:d,strokeWidth:u,absoluteStrokeWidth:m,className:h="",children:p,iconNode:f,...j}=e,{size:x=24,strokeWidth:g=2,absoluteStrokeWidth:v=!1,color:b="currentColor",className:y=""}=null!=(t=(0,s.useContext)(r))?t:{},k=(null!=m?m:v)?24*Number(null!=u?u:g)/Number(null!=d?d:x):null!=u?u:g;return(0,s.createElement)("svg",{ref:a,...n,width:null!=(o=null!=d?d:x)?o:n.width,height:null!=(c=null!=d?d:x)?c:n.height,stroke:null!=i?i:b,strokeWidth:k,className:(0,l.z)("lucide",y,h),...!p&&!(e=>{for(let a in e)if(a.startsWith("aria-")||"role"===a||"title"===a)return!0;return!1})(j)&&{"aria-hidden":"true"},...j},[...f.map(e=>{let[a,t]=e;return(0,s.createElement)(a,t)}),...Array.isArray(p)?p:[p]])})},666:(e,a,t)=>{"use strict";t.d(a,{default:()=>m});var s=t(95155),n=t(12115),l=t(47650),r=t(85649),o=t(30926);let c=(0,o.createServerReference)("40c62f1577c61cd15928c045fd78ddcbd2e1f9d318",o.callServer,void 0,o.findSourceMapURL,"createProjectAction");var i=t(59097);let d=[{value:"#c2452a",name:"Mars Red"},{value:"#a83a22",name:"Deep Red"},{value:"#7c2b19",name:"Dark Red"},{value:"#111318",name:"Charcoal"},{value:"#3f3a30",name:"Warm Black"},{value:"#68707b",name:"Slate"},{value:"#cdb78a",name:"Warm Sand"},{value:"#1f6c9f",name:"Skill Blue"}];function u(){let{pending:e}=(0,l.useFormStatus)();return(0,s.jsx)("button",{type:"submit",className:"admin-button",disabled:e,"aria-busy":e?"true":void 0,children:e?"Creating…":"Create project"})}function m(e){let{workspaceRoot:a="~/workspace/projects"}=e,[t,l]=n.useState(!1),[o,m]=n.useState(""),[h,p]=n.useState("workspace"),[f,j]=n.useState(""),x=n.useRef(null),g=n.useMemo(()=>"".concat(a.replace(/\/$/,""),"/").concat(String(o||"").toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,64)||"project"),[a,o]);return n.useEffect(()=>{var e;"custom"===h&&(null==(e=x.current)||e.focus())},[h]),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("button",{type:"button",className:"admin-button agents-new-cta",onClick:()=>l(!0),children:[(0,s.jsx)("span",{"aria-hidden":!0,className:"agents-new-cta-glyph",children:"+"}),"New project"]}),(0,s.jsx)(r.A,{open:t,onClose:()=>l(!1),eyebrow:"New project",title:"Create a project",children:(0,s.jsxs)("form",{className:"agents-modal-form",action:c,children:[(0,s.jsx)("p",{className:"agents-modal-help",children:"Scope agents, documents, memory, and integrations together."}),(0,s.jsx)("section",{className:"agents-modal-section",children:(0,s.jsxs)("label",{className:"agents-modal-field wide",children:[(0,s.jsx)("span",{children:"Name"}),(0,s.jsx)("input",{name:"name",type:"text",required:!0,placeholder:"Acme Co.",autoComplete:"off",value:o,onChange:e=>m(e.target.value),autoFocus:!0})]})}),(0,s.jsxs)("section",{className:"agents-modal-section",children:[(0,s.jsxs)("div",{className:"agents-modal-section-head",children:[(0,s.jsx)("span",{children:"Folder location"}),(0,s.jsx)("small",{children:"Where this project lives on disk."})]}),(0,s.jsxs)("div",{className:"agents-modal-radio-group",children:[(0,s.jsxs)("label",{className:"agents-modal-radio ".concat("workspace"===h?"on":""),children:[(0,s.jsx)("input",{type:"radio",name:"folder_mode",value:"workspace",checked:"workspace"===h,onChange:()=>p("workspace")}),(0,s.jsxs)("span",{className:"agents-modal-radio-body",children:[(0,s.jsx)("b",{children:"madarX workspace"}),(0,s.jsx)("code",{title:g,children:function(e){let a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:48;if(!e||e.length<=a)return e;let t=e.slice(0,Math.floor(a/2)-1),s=e.slice(e.length-Math.floor(a/2)+2);return"".concat(t,"…").concat(s)}(g)})]})]}),(0,s.jsxs)("label",{className:"agents-modal-radio ".concat("custom"===h?"on":""),children:[(0,s.jsx)("input",{type:"radio",name:"folder_mode",value:"custom",checked:"custom"===h,onChange:()=>p("custom")}),(0,s.jsxs)("span",{className:"agents-modal-radio-body",children:[(0,s.jsx)("b",{children:"Custom path"}),(0,s.jsx)("small",{children:"Any absolute folder. Created if missing."})]})]})]}),"custom"===h?(0,s.jsx)(i.A,{inputRef:x,value:f,onChange:j}):(0,s.jsx)("input",{type:"hidden",name:"folder_path",value:""})]}),(0,s.jsxs)("section",{className:"agents-modal-section",children:[(0,s.jsxs)("div",{className:"agents-modal-section-head",children:[(0,s.jsx)("span",{children:"Color"}),(0,s.jsx)("small",{children:"Used for the project tile across the app."})]}),(0,s.jsxs)("fieldset",{className:"agents-modal-swatches",children:[(0,s.jsx)("legend",{className:"visually-hidden",children:"Project color"}),d.map(e=>(0,s.jsxs)("label",{className:"agents-modal-swatch",style:{"--swatch":e.value},children:[(0,s.jsx)("input",{type:"radio",name:"color",value:e.value,defaultChecked:"#c2452a"===e.value}),(0,s.jsx)("span",{className:"agents-modal-swatch-ring","aria-hidden":"true"}),(0,s.jsx)("span",{className:"visually-hidden",children:e.name})]},e.value))]})]}),(0,s.jsxs)("section",{className:"agents-modal-section",children:[(0,s.jsxs)("div",{className:"agents-modal-section-head",children:[(0,s.jsx)("span",{children:"Description"}),(0,s.jsx)("small",{children:"Used as context for agents working in this project."})]}),(0,s.jsx)("label",{className:"agents-modal-field wide",children:(0,s.jsx)("textarea",{name:"description",rows:3,placeholder:"What is this project for? Goals, audience, voice, constraints."})})]}),(0,s.jsxs)("footer",{className:"agents-modal-foot",children:[(0,s.jsx)("button",{type:"button",className:"admin-button secondary",onClick:()=>l(!1),children:"Cancel"}),(0,s.jsx)(u,{})]})]})})]})}},10677:(e,a,t)=>{"use strict";t.d(a,{default:()=>l});var s=t(95155),n=t(12115);function l(){let[e,a]=(0,n.useState)([]),[t,l]=(0,n.useState)("");return(0,n.useEffect)(()=>{l(localStorage.getItem("madarx.activeProjectId")||""),fetch("/api/projects").then(e=>e.json()).then(e=>a(e.projects||[])).catch(()=>{})},[]),(0,s.jsx)("div",{className:"project-switcher","data-project-switcher":!0,children:(0,s.jsxs)("select",{value:t,onChange:e=>{var a;l(a=e.target.value),a?localStorage.setItem("madarx.activeProjectId",a):localStorage.removeItem("madarx.activeProjectId"),window.dispatchEvent(new CustomEvent("madarx:project-change",{detail:{project_id:a||null}}))},"aria-label":"Active project",children:[(0,s.jsx)("option",{value:"",children:"All projects"}),e.map(e=>(0,s.jsx)("option",{value:e.id,children:e.name},e.id))]})})}},13185:(e,a,t)=>{"use strict";t.d(a,{A:()=>o});var s=t(12115),n=t(64250);let l=e=>{let a=e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,a,t)=>t?t.toUpperCase():a.toLowerCase());return a.charAt(0).toUpperCase()+a.slice(1)};var r=t(45);let o=(e,a)=>{let t=(0,s.forwardRef)((t,o)=>{let{className:c,...i}=t;return(0,s.createElement)(r.default,{ref:o,iconNode:a,className:(0,n.z)("lucide-".concat(l(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()),"lucide-".concat(e),c),...i})});return t.displayName=l(e),t}},30926:(e,a,t)=>{"use strict";Object.defineProperty(a,"__esModule",{value:!0}),!function(e,a){for(var t in a)Object.defineProperty(e,t,{enumerable:!0,get:a[t]})}(a,{callServer:function(){return s.callServer},createServerReference:function(){return l.createServerReference},findSourceMapURL:function(){return n.findSourceMapURL}});let s=t(41209),n=t(85153),l=t(77197)},31478:(e,a,t)=>{"use strict";t.d(a,{default:()=>d});var s=t(95155),n=t(12115),l=t(47650),r=t(85649),o=t(30926);let c=(0,o.createServerReference)("402113651be9d61319cdae940bac4826787656ed56",o.callServer,void 0,o.findSourceMapURL,"deleteProjectAction");function i(e){let{disabled:a}=e,{pending:t}=(0,l.useFormStatus)();return(0,s.jsx)("button",{type:"submit",className:"admin-button danger",disabled:t||a,"aria-busy":t?"true":void 0,children:t?"Deleting…":"Delete project"})}function d(e){let{projectId:a,projectName:t,projectSlug:l,isProtected:o}=e,[d,u]=n.useState(!1),[m,h]=n.useState("");if(o)return(0,s.jsxs)("span",{className:"admin-button secondary project-delete is-locked","aria-disabled":"true",title:"The Personal project is the default scope and cannot be deleted.",children:[(0,s.jsxs)("svg",{width:"11",height:"11",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",style:{marginRight:6,verticalAlign:"-1px"},children:[(0,s.jsx)("rect",{x:"3",y:"11",width:"18",height:"11",rx:"2"}),(0,s.jsx)("path",{d:"M7 11V7a5 5 0 0 1 10 0v4"})]}),"Protected"]});n.useEffect(()=>{d||h("")},[d]);let p=m.trim()===l;return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("button",{type:"button",className:"admin-button secondary project-delete",onClick:()=>u(!0),"aria-label":"Delete ".concat(t),children:"Delete"}),(0,s.jsx)(r.A,{open:d,onClose:()=>u(!1),eyebrow:"Delete project",title:"Delete ".concat(t,"?"),tone:"danger",children:(0,s.jsxs)("form",{className:"agents-modal-form",action:c,children:[(0,s.jsx)("input",{type:"hidden",name:"project_id",value:a}),(0,s.jsx)("p",{className:"agents-modal-help",children:"This removes the project, its agents, Disk files, memory, secrets, and audit history. The folder on your local drive is left untouched."}),(0,s.jsx)("section",{className:"agents-modal-section",children:(0,s.jsxs)("label",{className:"agents-modal-field wide",children:[(0,s.jsxs)("span",{children:["Type ",(0,s.jsx)("code",{className:"agents-modal-inline-code",children:l})," to confirm"]}),(0,s.jsx)("input",{type:"text",autoComplete:"off",spellCheck:!1,value:m,onChange:e=>h(e.target.value),placeholder:l,autoFocus:!0})]})}),(0,s.jsxs)("footer",{className:"agents-modal-foot",children:[(0,s.jsx)("button",{type:"button",className:"admin-button secondary",onClick:()=>u(!1),children:"Cancel"}),(0,s.jsx)(i,{disabled:!p})]})]})})]})}},34788:(e,a,t)=>{"use strict";t.d(a,{A:()=>s});let s=(0,t(13185).A)("x",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]])},37434:(e,a,t)=>{"use strict";t.d(a,{default:()=>m});var s=t(95155),n=t(12115),l=t(47650),r=t(85649),o=t(30926);let c=(0,o.createServerReference)("4046bff3f50a4d8e21373406b0bd9a355d7a6d6f77",o.callServer,void 0,o.findSourceMapURL,"updateProjectAction");var i=t(59097);let d=[{value:"#c2452a",name:"Mars Red"},{value:"#a83a22",name:"Deep Red"},{value:"#7c2b19",name:"Dark Red"},{value:"#111318",name:"Charcoal"},{value:"#3f3a30",name:"Warm Black"},{value:"#68707b",name:"Slate"},{value:"#cdb78a",name:"Warm Sand"},{value:"#1f6c9f",name:"Skill Blue"}];function u(){let{pending:e}=(0,l.useFormStatus)();return(0,s.jsx)("button",{type:"submit",className:"admin-button",disabled:e,"aria-busy":e?"true":void 0,children:e?"Saving…":"Save changes"})}function m(e){let{projectId:a,projectName:t,projectColor:l,projectDescription:o,projectFolderPath:m}=e,[h,p]=n.useState(!1),[f,j]=n.useState("keep"),[x,g]=n.useState(m||""),v=n.useRef(null);return n.useEffect(()=>{h&&(j("keep"),g(m||""))},[h,m]),n.useEffect(()=>{var e;"custom"===f&&(null==(e=v.current)||e.focus())},[f]),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("button",{type:"button",className:"admin-button secondary project-edit",onClick:()=>p(!0),"aria-label":"Edit ".concat(t),children:"Edit"}),(0,s.jsx)(r.A,{open:h,onClose:()=>p(!1),eyebrow:"Edit project",title:"Edit ".concat(t),children:(0,s.jsxs)("form",{className:"agents-modal-form",action:c,children:[(0,s.jsx)("input",{type:"hidden",name:"project_id",value:a}),(0,s.jsx)("section",{className:"agents-modal-section",children:(0,s.jsxs)("label",{className:"agents-modal-field wide",children:[(0,s.jsx)("span",{children:"Name"}),(0,s.jsx)("input",{name:"name",type:"text",defaultValue:t,autoComplete:"off",required:!0})]})}),(0,s.jsxs)("section",{className:"agents-modal-section",children:[(0,s.jsxs)("div",{className:"agents-modal-section-head",children:[(0,s.jsx)("span",{children:"Folder location"}),(0,s.jsx)("small",{children:"Where project files live on disk. Move only if you've already moved the folder yourself."})]}),(0,s.jsxs)("div",{className:"agents-modal-radio-group",children:[(0,s.jsxs)("label",{className:"agents-modal-radio ".concat("keep"===f?"on":""),children:[(0,s.jsx)("input",{type:"radio",name:"folder_mode",value:"keep",checked:"keep"===f,onChange:()=>j("keep")}),(0,s.jsxs)("span",{className:"agents-modal-radio-body",children:[(0,s.jsx)("b",{children:"Keep current"}),(0,s.jsx)("code",{title:m||"",children:function(e){let a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:48;if(!e||e.length<=a)return e;let t=e.slice(0,Math.floor(a/2)-1),s=e.slice(e.length-Math.floor(a/2)+2);return"".concat(t,"…").concat(s)}(m)||"(not set)"})]})]}),(0,s.jsxs)("label",{className:"agents-modal-radio ".concat("custom"===f?"on":""),children:[(0,s.jsx)("input",{type:"radio",name:"folder_mode",value:"custom",checked:"custom"===f,onChange:()=>j("custom")}),(0,s.jsxs)("span",{className:"agents-modal-radio-body",children:[(0,s.jsx)("b",{children:"Change to…"}),(0,s.jsx)("small",{children:"Absolute path. Must already exist or be writable."})]})]})]}),"custom"===f?(0,s.jsx)(i.A,{inputRef:v,value:x,onChange:g}):(0,s.jsx)("input",{type:"hidden",name:"folder_path",value:""})]}),(0,s.jsxs)("section",{className:"agents-modal-section",children:[(0,s.jsxs)("div",{className:"agents-modal-section-head",children:[(0,s.jsx)("span",{children:"Color"}),(0,s.jsx)("small",{children:"Tile color across the app."})]}),(0,s.jsxs)("fieldset",{className:"agents-modal-swatches",children:[(0,s.jsx)("legend",{className:"visually-hidden",children:"Project color"}),d.map(e=>(0,s.jsxs)("label",{className:"agents-modal-swatch",style:{"--swatch":e.value},children:[(0,s.jsx)("input",{type:"radio",name:"color",value:e.value,defaultChecked:e.value===(l||"#c2452a")}),(0,s.jsx)("span",{className:"agents-modal-swatch-ring","aria-hidden":"true"}),(0,s.jsx)("span",{className:"visually-hidden",children:e.name})]},e.value))]})]}),(0,s.jsxs)("section",{className:"agents-modal-section",children:[(0,s.jsxs)("div",{className:"agents-modal-section-head",children:[(0,s.jsx)("span",{children:"Description"}),(0,s.jsx)("small",{children:"Used as context for agents working in this project."})]}),(0,s.jsx)("label",{className:"agents-modal-field wide",children:(0,s.jsx)("textarea",{name:"description",rows:3,defaultValue:o||"",placeholder:"What is this project for? Goals, audience, voice, constraints."})})]}),(0,s.jsxs)("footer",{className:"agents-modal-foot",children:[(0,s.jsx)("button",{type:"button",className:"admin-button secondary",onClick:()=>p(!1),children:"Cancel"}),(0,s.jsx)(u,{})]})]})})]})}},59097:(e,a,t)=>{"use strict";t.d(a,{A:()=>l});var s=t(95155),n=t(12115);function l(e){let{name:a="folder_path",value:t,onChange:l,inputRef:r,placeholder:o="/Users/you/Documents/my-project"}=e,[c,i]=n.useState(null),[d,u]=n.useState(!1),[m,h]=n.useState(""),[p,f]=n.useState(""),[j,x]=n.useState(null);async function g(){var e;let a;if(i(null),!(null==(e=navigator.clipboard)?void 0:e.readText))return void i({kind:"error",message:"Clipboard not available."});try{a=await navigator.clipboard.readText()}catch(e){i({kind:"error",message:"Allow clipboard access."});return}let t=(a||"").trim();if((t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'"))&&(t=t.slice(1,-1)),t.startsWith("file://"))try{t=decodeURI(t.slice(7))}catch(e){}return t?t.startsWith("/")||t.startsWith("~")?void(l(t),i({kind:"success",message:"Pasted."})):void i({kind:"error",message:"Path must be absolute."}):void i({kind:"error",message:"Clipboard is empty."})}async function v(){i(null),x("pick");try{let e=await fetch("/api/fs/pick-folder",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({title:"Choose project folder",start_path:t&&t.startsWith("/")?t:void 0})});if(499===e.status)return void i({kind:"error",message:"Cancelled."});let a=await e.json();if(!e.ok)return void i({kind:"error",message:a.error||"Picker failed."});l(a.folder_path),i({kind:"success",message:"Selected ".concat(a.folder_path)})}catch(e){i({kind:"error",message:String((null==e?void 0:e.message)||e)})}finally{x(null)}}async function b(){if(i(null),!m.trim()||!p.trim())return void i({kind:"error",message:"Parent and name required."});x("create");try{let e=await fetch("/api/fs/create-folder",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({parent:m.trim(),name:p.trim()})}),a=await e.json();if(!e.ok)return void i({kind:"error",message:a.error||"Create failed."});l(a.folder_path),u(!1),f(""),i({kind:"success",message:"Created ".concat(a.folder_path)})}catch(e){i({kind:"error",message:String((null==e?void 0:e.message)||e)})}finally{x(null)}}return n.useEffect(()=>{d&&!m&&h(t||"~/Documents")},[d,t,m]),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("div",{className:"agents-modal-paste-row",children:[(0,s.jsx)("input",{ref:r,name:a,type:"text",placeholder:o,autoComplete:"off",spellCheck:!1,value:t||"",onChange:e=>{l(e.target.value),c&&i(null)},required:!0}),(0,s.jsx)("button",{type:"button",className:"admin-button secondary",onClick:v,disabled:"pick"===j,children:"pick"===j?"Opening…":"Choose folder…"})]}),(0,s.jsxs)("div",{className:"agents-modal-folder-tools",children:[(0,s.jsx)("button",{type:"button",className:"admin-button secondary",onClick:g,children:"Paste from clipboard"}),(0,s.jsx)("button",{type:"button",className:"admin-button secondary",onClick:()=>l("~/Documents"),children:"~/Documents"}),(0,s.jsx)("button",{type:"button",className:"admin-button secondary",onClick:()=>l("~/Desktop"),children:"~/Desktop"}),(0,s.jsx)("button",{type:"button",className:"admin-button secondary",onClick:()=>u(e=>!e),children:d?"Cancel new folder":"+ New folder"})]}),d?(0,s.jsxs)("div",{className:"agents-modal-create-folder",children:[(0,s.jsx)("small",{children:"Create a folder anywhere outside system directories. Parent must exist."}),(0,s.jsx)("div",{className:"agents-modal-create-row",children:(0,s.jsx)("input",{type:"text",placeholder:"Parent (e.g. ~/Documents)",value:m,onChange:e=>h(e.target.value),spellCheck:!1,autoComplete:"off"})}),(0,s.jsxs)("div",{className:"agents-modal-create-row",children:[(0,s.jsx)("input",{type:"text",placeholder:"New folder name",value:p,onChange:e=>f(e.target.value),spellCheck:!1,autoComplete:"off"}),(0,s.jsx)("button",{type:"button",className:"admin-button",onClick:b,disabled:"create"===j,children:"create"===j?"Creating…":"Create"})]})]}):null,c?(0,s.jsx)("p",{className:"agents-modal-feedback ".concat(c.kind),role:"status","aria-live":"polite",children:c.message}):null]})}},64250:(e,a,t)=>{"use strict";t.d(a,{z:()=>s});let s=function(){for(var e=arguments.length,a=Array(e),t=0;t<e;t++)a[t]=arguments[t];return a.filter((e,a,t)=>!!e&&""!==e.trim()&&t.indexOf(e)===a).join(" ").trim()}},85649:(e,a,t)=>{"use strict";t.d(a,{A:()=>r});var s=t(95155),n=t(12115),l=t(34788);function r(e){let{open:a,onClose:t,eyebrow:r,title:o,tone:c="default",size:i="default",children:d}=e,u=n.useRef(null);return n.useEffect(()=>{let e=u.current;e&&(a&&!e.open&&("function"==typeof e.showModal?e.showModal():e.setAttribute("open","")),!a&&e.open&&e.close())},[a]),n.useEffect(()=>{let e=u.current;if(!e)return;let a=e=>{e.preventDefault(),t()};return e.addEventListener("cancel",a),()=>e.removeEventListener("cancel",a)},[t]),(0,s.jsx)("dialog",{ref:u,className:"agents-modal".concat("wide"===i?" agents-modal--wide":""),onClick:e=>{e.target===u.current&&t()},children:a?(0,s.jsxs)("div",{className:"agents-modal-card".concat("danger"===c?" agents-modal-card--danger":""),onClick:e=>e.stopPropagation(),children:[(0,s.jsxs)("header",{className:"agents-modal-head",children:[(0,s.jsxs)("div",{children:[r?(0,s.jsx)("span",{className:"admin-kicker",children:r}):null,(0,s.jsx)("h2",{children:o})]}),(0,s.jsx)("button",{type:"button",className:"agents-modal-close",onClick:t,"aria-label":"Close",children:(0,s.jsx)(l.A,{size:14})})]}),d]}):null})}},99168:(e,a,t)=>{Promise.resolve().then(t.bind(t,10677)),Promise.resolve().then(t.bind(t,31478)),Promise.resolve().then(t.bind(t,37434)),Promise.resolve().then(t.bind(t,666)),Promise.resolve().then(t.t.bind(t,52619,23))}},e=>{e.O(0,[2619,8441,1255,7358],()=>e(e.s=99168)),_N_E=e.O()}]);