madarx 2.12.1 → 2.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (398) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +277 -284
  3. package/.next/standalone/.next/app-path-routes-manifest.json +67 -68
  4. package/.next/standalone/.next/build-manifest.json +2 -2
  5. package/.next/standalone/.next/prerender-manifest.json +3 -3
  6. package/.next/standalone/.next/routes-manifest.json +0 -6
  7. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  8. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  9. package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
  10. package/.next/standalone/.next/server/app/activity/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/admin/page.js +2 -2
  12. package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/.next/server/app/agents/[id]/page.js +4 -4
  14. package/.next/standalone/.next/server/app/agents/[id]/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/agents/page.js +1 -1
  16. package/.next/standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  17. package/.next/standalone/.next/server/app/api/activity/route_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/api/admin/audit-export/route_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/api/admin/share-links/route_client-reference-manifest.js +1 -1
  20. package/.next/standalone/.next/server/app/api/agent-memory/route_client-reference-manifest.js +1 -1
  21. package/.next/standalone/.next/server/app/api/agent-runs/[id]/cancel/route_client-reference-manifest.js +1 -1
  22. package/.next/standalone/.next/server/app/api/agent-runs/[id]/events/route_client-reference-manifest.js +1 -1
  23. package/.next/standalone/.next/server/app/api/agent-runs/[id]/log/route_client-reference-manifest.js +1 -1
  24. package/.next/standalone/.next/server/app/api/agent-runs/[id]/route_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/api/agent-runs/route_client-reference-manifest.js +1 -1
  26. package/.next/standalone/.next/server/app/api/agents/[id]/chain/route_client-reference-manifest.js +1 -1
  27. package/.next/standalone/.next/server/app/api/agents/[id]/memory/route_client-reference-manifest.js +1 -1
  28. package/.next/standalone/.next/server/app/api/agents/[id]/reports/route_client-reference-manifest.js +1 -1
  29. package/.next/standalone/.next/server/app/api/agents/[id]/run/route_client-reference-manifest.js +1 -1
  30. package/.next/standalone/.next/server/app/api/agents/[id]/skills/route_client-reference-manifest.js +1 -1
  31. package/.next/standalone/.next/server/app/api/agents/create/route_client-reference-manifest.js +1 -1
  32. package/.next/standalone/.next/server/app/api/agents/ops/route_client-reference-manifest.js +1 -1
  33. package/.next/standalone/.next/server/app/api/approvals/[id]/route_client-reference-manifest.js +1 -1
  34. package/.next/standalone/.next/server/app/api/approvals/route_client-reference-manifest.js +1 -1
  35. package/.next/standalone/.next/server/app/api/artifacts/[id]/acl/route_client-reference-manifest.js +1 -1
  36. package/.next/standalone/.next/server/app/api/artifacts/[id]/protect/route_client-reference-manifest.js +1 -1
  37. package/.next/standalone/.next/server/app/api/artifacts/[id]/raw/route_client-reference-manifest.js +1 -1
  38. package/.next/standalone/.next/server/app/api/artifacts/[id]/route_client-reference-manifest.js +1 -1
  39. package/.next/standalone/.next/server/app/api/artifacts/[id]/share-link/[linkId]/route_client-reference-manifest.js +1 -1
  40. package/.next/standalone/.next/server/app/api/artifacts/[id]/share-link/route_client-reference-manifest.js +1 -1
  41. package/.next/standalone/.next/server/app/api/artifacts/upload/route_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/api/audit/list/route_client-reference-manifest.js +1 -1
  43. package/.next/standalone/.next/server/app/api/audit/search/route_client-reference-manifest.js +1 -1
  44. package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/api/auth/config/route_client-reference-manifest.js +1 -1
  46. package/.next/standalone/.next/server/app/api/auth/join-bootstrap/route_client-reference-manifest.js +1 -1
  47. package/.next/standalone/.next/server/app/api/auth/session/route_client-reference-manifest.js +1 -1
  48. package/.next/standalone/.next/server/app/api/brand/route_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/api/chat/sessions/[id]/route_client-reference-manifest.js +1 -1
  50. package/.next/standalone/.next/server/app/api/chat/sessions/route_client-reference-manifest.js +1 -1
  51. package/.next/standalone/.next/server/app/api/config/env/route_client-reference-manifest.js +1 -1
  52. package/.next/standalone/.next/server/app/api/config/route_client-reference-manifest.js +1 -1
  53. package/.next/standalone/.next/server/app/api/connections/[service]/route_client-reference-manifest.js +1 -1
  54. package/.next/standalone/.next/server/app/api/connections/[service]/verify/route_client-reference-manifest.js +1 -1
  55. package/.next/standalone/.next/server/app/api/connections/route_client-reference-manifest.js +1 -1
  56. package/.next/standalone/.next/server/app/api/cron/tick/route_client-reference-manifest.js +1 -1
  57. package/.next/standalone/.next/server/app/api/dashboard/spaces/[id]/move/route_client-reference-manifest.js +1 -1
  58. package/.next/standalone/.next/server/app/api/dashboard/spaces/[id]/route_client-reference-manifest.js +1 -1
  59. package/.next/standalone/.next/server/app/api/dashboard/spaces/[id]/share-link/[linkId]/route_client-reference-manifest.js +1 -1
  60. package/.next/standalone/.next/server/app/api/dashboard/spaces/[id]/share-link/route_client-reference-manifest.js +1 -1
  61. package/.next/standalone/.next/server/app/api/dashboard/spaces/import/route_client-reference-manifest.js +1 -1
  62. package/.next/standalone/.next/server/app/api/dashboard/spaces/route_client-reference-manifest.js +1 -1
  63. package/.next/standalone/.next/server/app/api/disk/files/[id]/blob/route_client-reference-manifest.js +1 -1
  64. package/.next/standalone/.next/server/app/api/disk/files/[id]/route_client-reference-manifest.js +1 -1
  65. package/.next/standalone/.next/server/app/api/disk/files/[id]/transcribe/route_client-reference-manifest.js +1 -1
  66. package/.next/standalone/.next/server/app/api/disk/files/route_client-reference-manifest.js +1 -1
  67. package/.next/standalone/.next/server/app/api/disk/folders/route_client-reference-manifest.js +1 -1
  68. package/.next/standalone/.next/server/app/api/events/since/[cursor]/route_client-reference-manifest.js +1 -1
  69. package/.next/standalone/.next/server/app/api/events/stream/route_client-reference-manifest.js +1 -1
  70. package/.next/standalone/.next/server/app/api/fs/create-folder/route_client-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/app/api/fs/pick-folder/route_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/blueprint/route.js.nft.json +1 -1
  73. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/blueprint/route_client-reference-manifest.js +1 -1
  74. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/diagnostic/route.js.nft.json +1 -1
  75. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/diagnostic/route_client-reference-manifest.js +1 -1
  76. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/governance/route.js.nft.json +1 -1
  77. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/governance/route_client-reference-manifest.js +1 -1
  78. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/interview/route.js.nft.json +1 -1
  79. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/interview/route_client-reference-manifest.js +1 -1
  80. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/pilot/route.js.nft.json +1 -1
  81. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/pilot/route_client-reference-manifest.js +1 -1
  82. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/quarterly/route.js.nft.json +1 -1
  83. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/quarterly/route_client-reference-manifest.js +1 -1
  84. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/route.js.nft.json +1 -1
  85. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/route_client-reference-manifest.js +1 -1
  86. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/setup-package/route.js.nft.json +1 -1
  87. package/.next/standalone/.next/server/app/api/hail/engagements/[id]/setup-package/route_client-reference-manifest.js +1 -1
  88. package/.next/standalone/.next/server/app/api/hail/engagements/route.js.nft.json +1 -1
  89. package/.next/standalone/.next/server/app/api/hail/engagements/route_client-reference-manifest.js +1 -1
  90. package/.next/standalone/.next/server/app/api/hail/interviews/[id]/responses/route.js.nft.json +1 -1
  91. package/.next/standalone/.next/server/app/api/hail/interviews/[id]/responses/route_client-reference-manifest.js +1 -1
  92. package/.next/standalone/.next/server/app/api/hail/interviews/[id]/route.js.nft.json +1 -1
  93. package/.next/standalone/.next/server/app/api/hail/interviews/[id]/route_client-reference-manifest.js +1 -1
  94. package/.next/standalone/.next/server/app/api/hail/setup-packages/[id]/apply/route.js.nft.json +1 -1
  95. package/.next/standalone/.next/server/app/api/hail/setup-packages/[id]/apply/route_client-reference-manifest.js +1 -1
  96. package/.next/standalone/.next/server/app/api/hail/setup-packages/validate/route_client-reference-manifest.js +1 -1
  97. package/.next/standalone/.next/server/app/api/heartbeat/tick/route_client-reference-manifest.js +1 -1
  98. package/.next/standalone/.next/server/app/api/heartbeat/worker/route.js.nft.json +1 -1
  99. package/.next/standalone/.next/server/app/api/heartbeat/worker/route_client-reference-manifest.js +1 -1
  100. package/.next/standalone/.next/server/app/api/help/route_client-reference-manifest.js +1 -1
  101. package/.next/standalone/.next/server/app/api/hermes/jobs/[id]/events/route_client-reference-manifest.js +1 -1
  102. package/.next/standalone/.next/server/app/api/hermes/jobs/[id]/route_client-reference-manifest.js +1 -1
  103. package/.next/standalone/.next/server/app/api/hermes/jobs/route_client-reference-manifest.js +1 -1
  104. package/.next/standalone/.next/server/app/api/integrations/google/callback/route_client-reference-manifest.js +1 -1
  105. package/.next/standalone/.next/server/app/api/integrations/google/oauth/route_client-reference-manifest.js +1 -1
  106. package/.next/standalone/.next/server/app/api/marketplace/[id]/route_client-reference-manifest.js +1 -1
  107. package/.next/standalone/.next/server/app/api/marketplace/open-design/route_client-reference-manifest.js +1 -1
  108. package/.next/standalone/.next/server/app/api/marketplace/route_client-reference-manifest.js +1 -1
  109. package/.next/standalone/.next/server/app/api/mines/import-roots/route_client-reference-manifest.js +1 -1
  110. package/.next/standalone/.next/server/app/api/mines/portfolio/route_client-reference-manifest.js +1 -1
  111. package/.next/standalone/.next/server/app/api/mines/projects/[id]/chunks/route_client-reference-manifest.js +1 -1
  112. package/.next/standalone/.next/server/app/api/mines/projects/[id]/diligence/route_client-reference-manifest.js +1 -1
  113. package/.next/standalone/.next/server/app/api/mines/projects/[id]/import/route_client-reference-manifest.js +1 -1
  114. package/.next/standalone/.next/server/app/api/mines/projects/[id]/publish/route_client-reference-manifest.js +1 -1
  115. package/.next/standalone/.next/server/app/api/mines/projects/route_client-reference-manifest.js +1 -1
  116. package/.next/standalone/.next/server/app/api/missions/route_client-reference-manifest.js +1 -1
  117. package/.next/standalone/.next/server/app/api/models/route_client-reference-manifest.js +1 -1
  118. package/.next/standalone/.next/server/app/api/onboarding/blueprint/route_client-reference-manifest.js +1 -1
  119. package/.next/standalone/.next/server/app/api/onboarding/launch/route_client-reference-manifest.js +1 -1
  120. package/.next/standalone/.next/server/app/api/orchestrator/command/route_client-reference-manifest.js +1 -1
  121. package/.next/standalone/.next/server/app/api/orchestrator/stream/route_client-reference-manifest.js +1 -1
  122. package/.next/standalone/.next/server/app/api/orchestrator/upload/route_client-reference-manifest.js +1 -1
  123. package/.next/standalone/.next/server/app/api/org/route_client-reference-manifest.js +1 -1
  124. package/.next/standalone/.next/server/app/api/orgs/[id]/invites/[inviteId]/route_client-reference-manifest.js +1 -1
  125. package/.next/standalone/.next/server/app/api/orgs/[id]/invites/route_client-reference-manifest.js +1 -1
  126. package/.next/standalone/.next/server/app/api/orgs/[id]/members/[userId]/role/route_client-reference-manifest.js +1 -1
  127. package/.next/standalone/.next/server/app/api/orgs/[id]/members/[userId]/route_client-reference-manifest.js +1 -1
  128. package/.next/standalone/.next/server/app/api/orgs/[id]/members/route_client-reference-manifest.js +1 -1
  129. package/.next/standalone/.next/server/app/api/orgs/[id]/route_client-reference-manifest.js +1 -1
  130. package/.next/standalone/.next/server/app/api/orgs/invites/pending/route_client-reference-manifest.js +1 -1
  131. package/.next/standalone/.next/server/app/api/orgs/join/route_client-reference-manifest.js +1 -1
  132. package/.next/standalone/.next/server/app/api/orgs/join-complete/route_client-reference-manifest.js +1 -1
  133. package/.next/standalone/.next/server/app/api/orgs/route_client-reference-manifest.js +1 -1
  134. package/.next/standalone/.next/server/app/api/printing-press/clis/route_client-reference-manifest.js +1 -1
  135. package/.next/standalone/.next/server/app/api/printing-press/install/route_client-reference-manifest.js +1 -1
  136. package/.next/standalone/.next/server/app/api/printing-press/security-mode/route_client-reference-manifest.js +1 -1
  137. package/.next/standalone/.next/server/app/api/privacy/config/route_client-reference-manifest.js +1 -1
  138. package/.next/standalone/.next/server/app/api/privacy/verify/route_client-reference-manifest.js +1 -1
  139. package/.next/standalone/.next/server/app/api/processes/[id]/route.js.nft.json +1 -1
  140. package/.next/standalone/.next/server/app/api/processes/[id]/route_client-reference-manifest.js +1 -1
  141. package/.next/standalone/.next/server/app/api/processes/[id]/share-link/route.js.nft.json +1 -1
  142. package/.next/standalone/.next/server/app/api/processes/[id]/share-link/route_client-reference-manifest.js +1 -1
  143. package/.next/standalone/.next/server/app/api/processes/[id]/stages/[stageId]/override/route.js.nft.json +1 -1
  144. package/.next/standalone/.next/server/app/api/processes/[id]/stages/[stageId]/override/route_client-reference-manifest.js +1 -1
  145. package/.next/standalone/.next/server/app/api/processes/[id]/stages/[stageId]/retry/route.js.nft.json +1 -1
  146. package/.next/standalone/.next/server/app/api/processes/[id]/stages/[stageId]/retry/route_client-reference-manifest.js +1 -1
  147. package/.next/standalone/.next/server/app/api/processes/[id]/stages/[stageId]/submit/route.js.nft.json +1 -1
  148. package/.next/standalone/.next/server/app/api/processes/[id]/stages/[stageId]/submit/route_client-reference-manifest.js +1 -1
  149. package/.next/standalone/.next/server/app/api/processes/definitions/[slug]/route_client-reference-manifest.js +1 -1
  150. package/.next/standalone/.next/server/app/api/processes/definitions/[slug]/settings/route_client-reference-manifest.js +1 -1
  151. package/.next/standalone/.next/server/app/api/processes/definitions/route_client-reference-manifest.js +1 -1
  152. package/.next/standalone/.next/server/app/api/processes/definitions/validate/route_client-reference-manifest.js +1 -1
  153. package/.next/standalone/.next/server/app/api/processes/route.js.nft.json +1 -1
  154. package/.next/standalone/.next/server/app/api/processes/route_client-reference-manifest.js +1 -1
  155. package/.next/standalone/.next/server/app/api/processes/start-and-route/route.js +1 -1
  156. package/.next/standalone/.next/server/app/api/processes/start-and-route/route.js.nft.json +1 -1
  157. package/.next/standalone/.next/server/app/api/processes/start-and-route/route_client-reference-manifest.js +1 -1
  158. package/.next/standalone/.next/server/app/api/projects/[slug]/library/route_client-reference-manifest.js +1 -1
  159. package/.next/standalone/.next/server/app/api/projects/[slug]/route_client-reference-manifest.js +1 -1
  160. package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  161. package/.next/standalone/.next/server/app/api/runs/approve-claude-run/route_client-reference-manifest.js +1 -1
  162. package/.next/standalone/.next/server/app/api/runs/claude-code-dry-run/route_client-reference-manifest.js +1 -1
  163. package/.next/standalone/.next/server/app/api/runs/competitor-report/route_client-reference-manifest.js +1 -1
  164. package/.next/standalone/.next/server/app/api/runs/engine-ping/route_client-reference-manifest.js +1 -1
  165. package/.next/standalone/.next/server/app/api/runs/marketing-plan/route_client-reference-manifest.js +1 -1
  166. package/.next/standalone/.next/server/app/api/schedules/upsert/route_client-reference-manifest.js +1 -1
  167. package/.next/standalone/.next/server/app/api/secrets/[name]/route_client-reference-manifest.js +1 -1
  168. package/.next/standalone/.next/server/app/api/secrets/route_client-reference-manifest.js +1 -1
  169. package/.next/standalone/.next/server/app/api/settings/trust-mode/route_client-reference-manifest.js +1 -1
  170. package/.next/standalone/.next/server/app/api/share/[token]/otp/route_client-reference-manifest.js +1 -1
  171. package/.next/standalone/.next/server/app/api/share/[token]/route_client-reference-manifest.js +1 -1
  172. package/.next/standalone/.next/server/app/api/share/[token]/verify/route_client-reference-manifest.js +1 -1
  173. package/.next/standalone/.next/server/app/api/share/space/[token]/otp/route_client-reference-manifest.js +1 -1
  174. package/.next/standalone/.next/server/app/api/share/space/[token]/route_client-reference-manifest.js +1 -1
  175. package/.next/standalone/.next/server/app/api/share/space/[token]/verify/route_client-reference-manifest.js +1 -1
  176. package/.next/standalone/.next/server/app/api/shared/spaces/[id]/acl/route_client-reference-manifest.js +1 -1
  177. package/.next/standalone/.next/server/app/api/shared/spaces/publish/route_client-reference-manifest.js +1 -1
  178. package/.next/standalone/.next/server/app/api/shared/spaces/route_client-reference-manifest.js +1 -1
  179. package/.next/standalone/.next/server/app/api/shared/spaces/status/route_client-reference-manifest.js +1 -1
  180. package/.next/standalone/.next/server/app/api/shared/spaces/unpublish/route_client-reference-manifest.js +1 -1
  181. package/.next/standalone/.next/server/app/api/state/route_client-reference-manifest.js +1 -1
  182. package/.next/standalone/.next/server/app/api/system/update/route_client-reference-manifest.js +1 -1
  183. package/.next/standalone/.next/server/app/api/tasks/[id]/active-run/route_client-reference-manifest.js +1 -1
  184. package/.next/standalone/.next/server/app/api/tasks/[id]/attachments/route_client-reference-manifest.js +1 -1
  185. package/.next/standalone/.next/server/app/api/tasks/[id]/checklist/[itemId]/route_client-reference-manifest.js +1 -1
  186. package/.next/standalone/.next/server/app/api/tasks/[id]/checklist/route_client-reference-manifest.js +1 -1
  187. package/.next/standalone/.next/server/app/api/tasks/[id]/checkout/route_client-reference-manifest.js +1 -1
  188. package/.next/standalone/.next/server/app/api/tasks/[id]/children/route_client-reference-manifest.js +1 -1
  189. package/.next/standalone/.next/server/app/api/tasks/[id]/comments/route_client-reference-manifest.js +1 -1
  190. package/.next/standalone/.next/server/app/api/tasks/[id]/events/route_client-reference-manifest.js +1 -1
  191. package/.next/standalone/.next/server/app/api/tasks/[id]/live-runs/route_client-reference-manifest.js +1 -1
  192. package/.next/standalone/.next/server/app/api/tasks/[id]/release/route_client-reference-manifest.js +1 -1
  193. package/.next/standalone/.next/server/app/api/tasks/[id]/route_client-reference-manifest.js +1 -1
  194. package/.next/standalone/.next/server/app/api/tasks/route_client-reference-manifest.js +1 -1
  195. package/.next/standalone/.next/server/app/api/tool-allowlists/[id]/route_client-reference-manifest.js +1 -1
  196. package/.next/standalone/.next/server/app/api/tool-allowlists/route_client-reference-manifest.js +1 -1
  197. package/.next/standalone/.next/server/app/api/tool-egress/route_client-reference-manifest.js +1 -1
  198. package/.next/standalone/.next/server/app/api/tools/[name]/approve/route_client-reference-manifest.js +1 -1
  199. package/.next/standalone/.next/server/app/api/tools/[name]/route_client-reference-manifest.js +1 -1
  200. package/.next/standalone/.next/server/app/api/tools/route_client-reference-manifest.js +1 -1
  201. package/.next/standalone/.next/server/app/api/transcripts/route_client-reference-manifest.js +1 -1
  202. package/.next/standalone/.next/server/app/api/voice/providers/route_client-reference-manifest.js +1 -1
  203. package/.next/standalone/.next/server/app/api/voice/realtime/context/route_client-reference-manifest.js +1 -1
  204. package/.next/standalone/.next/server/app/api/voice/realtime/session/route_client-reference-manifest.js +1 -1
  205. package/.next/standalone/.next/server/app/api/voice/realtime/tool-result/route_client-reference-manifest.js +1 -1
  206. package/.next/standalone/.next/server/app/api/voice/realtime/tools/route_client-reference-manifest.js +1 -1
  207. package/.next/standalone/.next/server/app/api/voice/tts/route_client-reference-manifest.js +1 -1
  208. package/.next/standalone/.next/server/app/api/whatsapp/allowlist/route_client-reference-manifest.js +1 -1
  209. package/.next/standalone/.next/server/app/api/whatsapp/disconnect/route_client-reference-manifest.js +1 -1
  210. package/.next/standalone/.next/server/app/api/whatsapp/messages/route_client-reference-manifest.js +1 -1
  211. package/.next/standalone/.next/server/app/api/whatsapp/qr/route_client-reference-manifest.js +1 -1
  212. package/.next/standalone/.next/server/app/api/whatsapp/send/route_client-reference-manifest.js +1 -1
  213. package/.next/standalone/.next/server/app/api/whatsapp/status/route_client-reference-manifest.js +1 -1
  214. package/.next/standalone/.next/server/app/approvals/page.js +2 -2
  215. package/.next/standalone/.next/server/app/approvals/page_client-reference-manifest.js +1 -1
  216. package/.next/standalone/.next/server/app/architecture/page_client-reference-manifest.js +1 -1
  217. package/.next/standalone/.next/server/app/architecture.html +2 -2
  218. package/.next/standalone/.next/server/app/architecture.rsc +1 -1
  219. package/.next/standalone/.next/server/app/audit/live/page_client-reference-manifest.js +1 -1
  220. package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
  221. package/.next/standalone/.next/server/app/brand/page_client-reference-manifest.js +1 -1
  222. package/.next/standalone/.next/server/app/brand.html +1 -1
  223. package/.next/standalone/.next/server/app/brand.rsc +1 -1
  224. package/.next/standalone/.next/server/app/disk/page_client-reference-manifest.js +1 -1
  225. package/.next/standalone/.next/server/app/federated-ai/page_client-reference-manifest.js +1 -1
  226. package/.next/standalone/.next/server/app/federated-ai.html +2 -2
  227. package/.next/standalone/.next/server/app/federated-ai.rsc +1 -1
  228. package/.next/standalone/.next/server/app/hail/[id]/governance/page.js.nft.json +1 -1
  229. package/.next/standalone/.next/server/app/hail/[id]/governance/page_client-reference-manifest.js +1 -1
  230. package/.next/standalone/.next/server/app/hail/[id]/interview/page.js +1 -1
  231. package/.next/standalone/.next/server/app/hail/[id]/interview/page.js.nft.json +1 -1
  232. package/.next/standalone/.next/server/app/hail/[id]/interview/page_client-reference-manifest.js +1 -1
  233. package/.next/standalone/.next/server/app/hail/[id]/page.js +2 -2
  234. package/.next/standalone/.next/server/app/hail/[id]/page.js.nft.json +1 -1
  235. package/.next/standalone/.next/server/app/hail/[id]/page_client-reference-manifest.js +1 -1
  236. package/.next/standalone/.next/server/app/hail/[id]/setup/page.js +1 -1
  237. package/.next/standalone/.next/server/app/hail/[id]/setup/page.js.nft.json +1 -1
  238. package/.next/standalone/.next/server/app/hail/[id]/setup/page_client-reference-manifest.js +1 -1
  239. package/.next/standalone/.next/server/app/hail/page.js +3 -3
  240. package/.next/standalone/.next/server/app/hail/page.js.nft.json +1 -1
  241. package/.next/standalone/.next/server/app/hail/page_client-reference-manifest.js +1 -1
  242. package/.next/standalone/.next/server/app/help/[slug]/page_client-reference-manifest.js +1 -1
  243. package/.next/standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  244. package/.next/standalone/.next/server/app/index.html +2 -2
  245. package/.next/standalone/.next/server/app/index.rsc +1 -1
  246. package/.next/standalone/.next/server/app/join/page_client-reference-manifest.js +1 -1
  247. package/.next/standalone/.next/server/app/join.html +1 -1
  248. package/.next/standalone/.next/server/app/join.rsc +1 -1
  249. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  250. package/.next/standalone/.next/server/app/marketplace/page.js +2 -2
  251. package/.next/standalone/.next/server/app/marketplace/page_client-reference-manifest.js +1 -1
  252. package/.next/standalone/.next/server/app/mines/[projectId]/page_client-reference-manifest.js +1 -1
  253. package/.next/standalone/.next/server/app/mines/[projectId]/results/page_client-reference-manifest.js +1 -1
  254. package/.next/standalone/.next/server/app/mines/page_client-reference-manifest.js +1 -1
  255. package/.next/standalone/.next/server/app/missions/page.js +2 -2
  256. package/.next/standalone/.next/server/app/missions/page_client-reference-manifest.js +1 -1
  257. package/.next/standalone/.next/server/app/onboarding/org/page_client-reference-manifest.js +1 -1
  258. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  259. package/.next/standalone/.next/server/app/onboarding.html +2 -2
  260. package/.next/standalone/.next/server/app/onboarding.rsc +1 -1
  261. package/.next/standalone/.next/server/app/org/page.js +1 -1
  262. package/.next/standalone/.next/server/app/org/page.js.nft.json +1 -1
  263. package/.next/standalone/.next/server/app/org/page_client-reference-manifest.js +1 -1
  264. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  265. package/.next/standalone/.next/server/app/projects/[slug]/log/page_client-reference-manifest.js +1 -1
  266. package/.next/standalone/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
  267. package/.next/standalone/.next/server/app/projects/new/page.js +1 -1
  268. package/.next/standalone/.next/server/app/projects/new/page_client-reference-manifest.js +1 -1
  269. package/.next/standalone/.next/server/app/projects/new.html +1 -1
  270. package/.next/standalone/.next/server/app/projects/new.rsc +2 -2
  271. package/.next/standalone/.next/server/app/projects/page.js +28 -28
  272. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  273. package/.next/standalone/.next/server/app/reports/[file]/route_client-reference-manifest.js +1 -1
  274. package/.next/standalone/.next/server/app/reports/page_client-reference-manifest.js +1 -1
  275. package/.next/standalone/.next/server/app/runtime/page_client-reference-manifest.js +1 -1
  276. package/.next/standalone/.next/server/app/schedules/page.js +1 -1
  277. package/.next/standalone/.next/server/app/schedules/page.js.nft.json +1 -1
  278. package/.next/standalone/.next/server/app/schedules/page_client-reference-manifest.js +1 -1
  279. package/.next/standalone/.next/server/app/settings/account/page_client-reference-manifest.js +1 -1
  280. package/.next/standalone/.next/server/app/settings/advanced/page_client-reference-manifest.js +1 -1
  281. package/.next/standalone/.next/server/app/settings/appearance/page_client-reference-manifest.js +1 -1
  282. package/.next/standalone/.next/server/app/settings/brand/page_client-reference-manifest.js +1 -1
  283. package/.next/standalone/.next/server/app/settings/brand.html +2 -2
  284. package/.next/standalone/.next/server/app/settings/brand.rsc +1 -1
  285. package/.next/standalone/.next/server/app/settings/connectors/page_client-reference-manifest.js +1 -1
  286. package/.next/standalone/.next/server/app/settings/engines/page_client-reference-manifest.js +1 -1
  287. package/.next/standalone/.next/server/app/settings/onboarding/page_client-reference-manifest.js +1 -1
  288. package/.next/standalone/.next/server/app/settings/onboarding.html +2 -2
  289. package/.next/standalone/.next/server/app/settings/onboarding.rsc +1 -1
  290. package/.next/standalone/.next/server/app/settings/organization/page.js +1 -1
  291. package/.next/standalone/.next/server/app/settings/organization/page.js.nft.json +1 -1
  292. package/.next/standalone/.next/server/app/settings/organization/page_client-reference-manifest.js +1 -1
  293. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  294. package/.next/standalone/.next/server/app/settings/runtime/page_client-reference-manifest.js +1 -1
  295. package/.next/standalone/.next/server/app/settings/team/page_client-reference-manifest.js +1 -1
  296. package/.next/standalone/.next/server/app/settings/tools/page_client-reference-manifest.js +1 -1
  297. package/.next/standalone/.next/server/app/settings.html +2 -2
  298. package/.next/standalone/.next/server/app/settings.rsc +1 -1
  299. package/.next/standalone/.next/server/app/share/[token]/page_client-reference-manifest.js +1 -1
  300. package/.next/standalone/.next/server/app/share/space/[token]/page_client-reference-manifest.js +1 -1
  301. package/.next/standalone/.next/server/app/tasks/[id]/page.js +2 -2
  302. package/.next/standalone/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  303. package/.next/standalone/.next/server/app/tasks/page.js +2 -2
  304. package/.next/standalone/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  305. package/.next/standalone/.next/server/app/team/[agentId]/page_client-reference-manifest.js +1 -1
  306. package/.next/standalone/.next/server/app/team/page_client-reference-manifest.js +1 -1
  307. package/.next/standalone/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  308. package/.next/standalone/.next/server/app/whatsapp/page_client-reference-manifest.js +1 -1
  309. package/.next/standalone/.next/server/app/whatsapp.html +1 -1
  310. package/.next/standalone/.next/server/app/whatsapp.rsc +1 -1
  311. package/.next/standalone/.next/server/app/workflows/[caseId]/page.js +1 -1
  312. package/.next/standalone/.next/server/app/workflows/[caseId]/page.js.nft.json +1 -1
  313. package/.next/standalone/.next/server/app/workflows/[caseId]/page_client-reference-manifest.js +1 -1
  314. package/.next/standalone/.next/server/app/workflows/new/[caseId]/page.js +1 -1
  315. package/.next/standalone/.next/server/app/workflows/new/[caseId]/page.js.nft.json +1 -1
  316. package/.next/standalone/.next/server/app/workflows/new/[caseId]/page_client-reference-manifest.js +1 -1
  317. package/.next/standalone/.next/server/app/workflows/new/definition/page_client-reference-manifest.js +1 -1
  318. package/.next/standalone/.next/server/app/workflows/page.js +1 -1
  319. package/.next/standalone/.next/server/app/workflows/page.js.nft.json +1 -1
  320. package/.next/standalone/.next/server/app/workflows/page_client-reference-manifest.js +1 -1
  321. package/.next/standalone/.next/server/app/workflows/share/[caseId]/page.js +1 -1
  322. package/.next/standalone/.next/server/app/workflows/share/[caseId]/page.js.nft.json +1 -1
  323. package/.next/standalone/.next/server/app/workflows/share/[caseId]/page_client-reference-manifest.js +1 -1
  324. package/.next/standalone/.next/server/app-paths-manifest.json +67 -68
  325. package/.next/standalone/.next/server/chunks/1699.js +28 -28
  326. package/.next/standalone/.next/server/chunks/5185.js +4 -27
  327. package/.next/standalone/.next/server/chunks/5257.js +1 -1
  328. package/.next/standalone/.next/server/chunks/6355.js +1 -0
  329. package/.next/standalone/.next/server/chunks/{3784.js → 6474.js} +1 -1
  330. package/.next/standalone/.next/server/functions-config-manifest.json +24 -24
  331. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  332. package/.next/standalone/.next/server/pages/404.html +1 -1
  333. package/.next/standalone/.next/server/pages/500.html +1 -1
  334. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  335. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  336. package/.next/standalone/.next/static/-LlttjOnKZXGqZXDKcj-4/_buildManifest.js +1 -0
  337. package/.next/standalone/.next/static/chunks/app/projects/page-09e5c527e3ba83e2.js +1 -0
  338. package/.next/standalone/.next/static/chunks/app/workflows/[caseId]/page-9949ff1c223e771d.js +1 -0
  339. package/.next/{static/chunks/app/workflows/page-25cb2c4cb90273a8.js → standalone/.next/static/chunks/app/workflows/page-d0484521369bce4c.js} +1 -1
  340. package/.next/standalone/CHANGELOG.md +31 -0
  341. package/.next/standalone/data/.artifacts-migrated-v1 +1 -1
  342. package/.next/standalone/data/.default-project-seeded +1 -1
  343. package/.next/standalone/data/madarx.sqlite +0 -0
  344. package/.next/standalone/data/madarx.sqlite-shm +0 -0
  345. package/.next/standalone/data/madarx.sqlite-wal +0 -0
  346. package/.next/standalone/lib/process/seeds/specs/mine-project-intake.json +12 -4
  347. package/.next/standalone/lib/process/seeds/specs/mine-valuation.json +6 -2
  348. package/.next/standalone/lib/process/stages/policy-dsl-legacy.js +178 -0
  349. package/.next/standalone/lib/process/stages/policy-gate.js +24 -168
  350. package/.next/standalone/package.json +4 -1
  351. package/.next/standalone/workspace/agents/ops-agent/skills.md +24 -0
  352. package/.next/standalone/workspace/agents/tool-smith-agent/skills.md +24 -0
  353. package/.next/static/-LlttjOnKZXGqZXDKcj-4/_buildManifest.js +1 -0
  354. package/.next/static/chunks/app/projects/page-09e5c527e3ba83e2.js +1 -0
  355. package/.next/static/chunks/app/workflows/[caseId]/page-9949ff1c223e771d.js +1 -0
  356. package/.next/{standalone/.next/static/chunks/app/workflows/page-25cb2c4cb90273a8.js → static/chunks/app/workflows/page-d0484521369bce4c.js} +1 -1
  357. package/CHANGELOG.md +31 -0
  358. package/ai-docs/process-engine.md +33 -1
  359. package/app/api/processes/start-and-route/route.js +5 -3
  360. package/app/workflows/[caseId]/case-detail-client.jsx +2 -2
  361. package/app/workflows/definition-card.jsx +12 -18
  362. package/app/workflows/new/[caseId]/page.js +8 -8
  363. package/app/workflows/page.js +0 -5
  364. package/app/workflows/share/[caseId]/page.js +0 -1
  365. package/lib/cli/banner.js +200 -21
  366. package/lib/cli/run.js +33 -11
  367. package/lib/cli/splash.js +120 -0
  368. package/lib/marketplace-seeds.js +141 -3
  369. package/lib/process/artifacts.js +12 -60
  370. package/lib/process/engine.js +5 -5
  371. package/lib/process/policy-predicates.js +116 -0
  372. package/lib/process/seeds/specs/mine-project-intake.json +12 -4
  373. package/lib/process/seeds/specs/mine-valuation.json +6 -2
  374. package/lib/process/spec-validator.js +46 -1
  375. package/lib/process/stages/policy-dsl-legacy.js +178 -0
  376. package/lib/process/stages/policy-gate.js +24 -168
  377. package/lib/runtime.js +52 -3
  378. package/lib/seeds.js +5 -1
  379. package/lib/tools/registry.js +20 -0
  380. package/package.json +4 -1
  381. package/scripts/postbuild-standalone.mjs +9 -0
  382. package/scripts/postinstall-splash.mjs +81 -0
  383. package/scripts/preview-banner.mjs +24 -0
  384. package/.next/standalone/.next/server/app/workflows/new/page.js +0 -2
  385. package/.next/standalone/.next/server/app/workflows/new/page.js.nft.json +0 -1
  386. package/.next/standalone/.next/server/app/workflows/new/page_client-reference-manifest.js +0 -1
  387. package/.next/standalone/.next/static/BTzAhaVl8-xEC5Te-d7Ns/_buildManifest.js +0 -1
  388. package/.next/standalone/.next/static/chunks/app/projects/page-7b6c6e010183e070.js +0 -1
  389. package/.next/standalone/.next/static/chunks/app/workflows/[caseId]/page-423e4c194c7f5bf5.js +0 -1
  390. package/.next/standalone/.next/static/chunks/app/workflows/new/page-1eda41616cbfc4f3.js +0 -1
  391. package/.next/static/BTzAhaVl8-xEC5Te-d7Ns/_buildManifest.js +0 -1
  392. package/.next/static/chunks/app/projects/page-7b6c6e010183e070.js +0 -1
  393. package/.next/static/chunks/app/workflows/[caseId]/page-423e4c194c7f5bf5.js +0 -1
  394. package/.next/static/chunks/app/workflows/new/page-1eda41616cbfc4f3.js +0 -1
  395. package/app/workflows/new/new-case-flow.jsx +0 -256
  396. package/app/workflows/new/page.js +0 -27
  397. /package/.next/standalone/.next/static/{BTzAhaVl8-xEC5Te-d7Ns → -LlttjOnKZXGqZXDKcj-4}/_ssgManifest.js +0 -0
  398. /package/.next/static/{BTzAhaVl8-xEC5Te-d7Ns → -LlttjOnKZXGqZXDKcj-4}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7143],{10677:(e,a,s)=>{"use strict";s.d(a,{default:()=>n});var r=s(95155),t=s(12115);function n(){let[e,a]=(0,t.useState)([]),[s,n]=(0,t.useState)("");return(0,t.useEffect)(()=>{n(localStorage.getItem("madarx.activeProjectId")||""),fetch("/api/projects").then(e=>e.json()).then(e=>a(e.projects||[])).catch(()=>{})},[]),(0,r.jsx)("div",{className:"project-switcher","data-project-switcher":!0,children:(0,r.jsxs)("select",{value:s,onChange:e=>{var a;n(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,r.jsx)("option",{value:"",children:"All projects"}),e.map(e=>(0,r.jsx)("option",{value:e.id,children:e.name},e.id))]})})}},20063:(e,a,s)=>{"use strict";var r=s(47260);s.o(r,"usePathname")&&s.d(a,{usePathname:function(){return r.usePathname}}),s.o(r,"useRouter")&&s.d(a,{useRouter:function(){return r.useRouter}}),s.o(r,"useSearchParams")&&s.d(a,{useSearchParams:function(){return r.useSearchParams}})},53749:(e,a,s)=>{"use strict";s.d(a,{default:()=>d});var r=s(95155),t=s(12115),n=s(47650),l=s(20063);function c(){return{sender_name:"",cover_image_url:"",cover_copy:{title:"",subtitle:""},accent_hex:"",logo_url:""}}function i(e){let{definition:a,projects:s,initialProjectId:n,onClose:l}=e,[i,d]=(0,t.useState)(n),[h,u]=(0,t.useState)(null),[p,m]=(0,t.useState)(null),[f,x]=(0,t.useState)(!0),[v,g]=(0,t.useState)(null),[j,w]=(0,t.useState)(null),[b,_]=(0,t.useState)(c()),[y,N]=(0,t.useState)("{}"),[k,S]=(0,t.useState)("[]"),[C,P]=(0,t.useState)(!1),[O,E]=(0,t.useState)(14),[I,J]=(0,t.useState)(!1);(0,t.useEffect)(()=>{let e=!1;return x(!0),g(null),fetch("/api/processes/definitions/".concat(a.slug,"/settings?project_id=").concat(encodeURIComponent(i),"&include_brand=1")).then(e=>e.json()).then(a=>{var s,r,t,n,l,i,o,d;if(e)return;if(a.error){g(a.error),x(!1);return}u(a.settings),m(a.resolved_brand||null);let h=(null==(s=a.settings)?void 0:s.brand)||c();_({sender_name:h.sender_name||"",cover_image_url:h.cover_image_url||"",cover_copy:{title:(null==(r=h.cover_copy)?void 0:r.title)||"",subtitle:(null==(t=h.cover_copy)?void 0:t.subtitle)||""},accent_hex:h.accent_hex||"",logo_url:h.logo_url||""}),N(JSON.stringify((null==(n=a.settings)?void 0:n.agent_overrides)||{},null,2)),S(JSON.stringify((null==(l=a.settings)?void 0:l.auto_approve_rules)||[],null,2)),P(!!(null==(i=a.settings)?void 0:i.share_link_enabled)),E(Number((null==(o=a.settings)?void 0:o.share_link_default_expiry_days)||14)),J(!!(null==(d=a.settings)?void 0:d.default_for_project)),x(!1)}).catch(a=>{e||(g(String(a)),x(!1))}),()=>{e=!0}},[a.slug,i]);let A=async(e,s)=>{w(s),g(null);try{let s=await fetch("/api/processes/definitions/".concat(a.slug,"/settings"),{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({project_id:i,...e})}),r=await s.json();if(!s.ok)throw Error(r.error||"save_failed");u(r.settings)}catch(e){g(String((null==e?void 0:e.message)||e))}finally{w(null)}},L=(0,t.useMemo)(()=>({accent_hex:b.accent_hex||(null==p?void 0:p.accent_hex)||"#c2452a",sender_name:b.sender_name||(null==p?void 0:p.sender_name)||"Madarx OS",logo_url:b.logo_url||(null==p?void 0:p.logo_url)||null,cover_image_url:b.cover_image_url||null,cover_copy:b.cover_copy,fonts:(null==p?void 0:p.fonts)||[]}),[b,p]),R=(0,t.useMemo)(()=>{let e=L.accent_hex,s=o(L.sender_name),r=o(b.cover_copy.title||a.name),t=o(b.cover_copy.subtitle||"Submit the details below to start."),n=L.cover_image_url?"background-image:linear-gradient(135deg,".concat(e,"cc,#0e0d0ccc),url('").concat(o(L.cover_image_url),"');background-size:cover;background-position:center;"):"background:linear-gradient(135deg,".concat(e,",#0e0d0c);");return"<!DOCTYPE html><html><head><style>body{margin:0;font:13px/1.45 ui-sans-serif,system-ui,sans-serif;background:#f7f4ee;padding:14px;color:#1a1817}.hdr{font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:#69707a;margin-bottom:8px}.cv{".concat(n,';height:74px;border-radius:12px;margin-bottom:10px}h1{font-size:18px;margin:0 0 4px}p{margin:0;color:#5f5a55;font-size:12px}.ftr{margin-top:10px;color:#69707a;font-size:10.5px}</style></head><body><div class="hdr">').concat(s,' \xb7 Intake</div><div class="cv"></div><h1>').concat(r,"</h1><p>").concat(t,'</p><p class="ftr">Powered by ').concat(s,"</p></body></html>")},[a.name,L,b.cover_copy]);return(0,r.jsx)("div",{className:"wf-drawer-scrim",role:"dialog","aria-label":"Workflow settings",onClick:l,children:(0,r.jsxs)("aside",{className:"wf-drawer",onClick:e=>e.stopPropagation(),children:[(0,r.jsxs)("header",{className:"wf-drawer-head",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("span",{className:"wf-drawer-kicker",children:"Configure workflow"}),(0,r.jsx)("h3",{children:a.name}),(0,r.jsxs)("small",{children:[a.category||"process"," \xb7 v",a.version]})]}),(0,r.jsx)("button",{type:"button",className:"wf-drawer-close",onClick:l,"aria-label":"Close",children:"\xd7"})]}),v?(0,r.jsx)("p",{className:"wf-drawer-error",children:v}):null,f?(0,r.jsx)("div",{className:"wf-drawer-body",children:(0,r.jsx)("p",{className:"wf-drawer-muted",children:"Loading…"})}):(0,r.jsxs)("div",{className:"wf-drawer-body",children:[(0,r.jsxs)("section",{className:"wf-drawer-section wf-drawer-brand-row",children:[(0,r.jsxs)("header",{className:"wf-drawer-section-head",children:[(0,r.jsx)("h4",{children:"Brand"}),(0,r.jsx)("a",{href:"/settings/brand",target:"_blank",rel:"noreferrer",className:"wf-drawer-link",children:"Edit at /settings/brand ↗"})]}),(0,r.jsx)("p",{className:"wf-drawer-muted",children:"Logo, palette, fonts, and voice inherit from the global brand. You can override the sender name + accent below, but everything else flows through."}),(0,r.jsxs)("div",{className:"wf-brand-chips",children:[(0,r.jsxs)("div",{className:"wf-brand-chip",children:[(0,r.jsx)("span",{children:"Sender"}),(0,r.jsx)("strong",{children:(null==p?void 0:p.company_name)||(null==p?void 0:p.sender_name)||"—"})]}),(0,r.jsxs)("div",{className:"wf-brand-chip",children:[(0,r.jsx)("span",{children:"Accent"}),(0,r.jsxs)("strong",{style:{display:"inline-flex",gap:6,alignItems:"center"},children:[(0,r.jsx)("i",{className:"wf-brand-swatch",style:{background:(null==p?void 0:p.accent_hex)||"#c2452a"}}),(null==p?void 0:p.accent_hex)||"#c2452a"]})]}),(0,r.jsxs)("div",{className:"wf-brand-chip",children:[(0,r.jsx)("span",{children:"Fonts"}),(0,r.jsx)("strong",{children:((null==p?void 0:p.fonts)||[]).slice(0,2).join(" \xb7 ")||"—"})]})]})]}),(0,r.jsxs)("section",{className:"wf-drawer-section",children:[(0,r.jsx)("header",{className:"wf-drawer-section-head",children:(0,r.jsx)("h4",{children:"1 \xb7 Project"})}),(0,r.jsxs)("label",{className:"wf-field",children:[(0,r.jsx)("span",{children:"Project"}),(0,r.jsx)("select",{value:i,onChange:e=>d(e.target.value),children:s.map(e=>(0,r.jsx)("option",{value:e.id,children:e.name||e.slug||e.id},e.id))})]}),(0,r.jsxs)("label",{className:"wf-checkbox",children:[(0,r.jsx)("input",{type:"checkbox",checked:I,onChange:e=>J(e.target.checked)}),(0,r.jsx)("span",{children:"Default process for this project"})]}),(0,r.jsx)("button",{type:"button",className:"wf-btn",disabled:"project"===j,onClick:()=>A({default_for_project:I},"project"),children:"project"===j?"Saving…":"Save"})]}),(0,r.jsxs)("section",{className:"wf-drawer-section",children:[(0,r.jsx)("header",{className:"wf-drawer-section-head",children:(0,r.jsx)("h4",{children:"2 \xb7 Presentation"})}),(0,r.jsx)("p",{className:"wf-drawer-muted",children:"Workflow-specific copy and artwork. The intake form's wrapping inherits from your brand; these fields only override the surface details unique to this workflow."}),(0,r.jsxs)("label",{className:"wf-field",children:[(0,r.jsxs)("span",{children:["Cover image URL ",(0,r.jsx)("em",{className:"wf-optional",children:"optional"})]}),(0,r.jsx)("input",{type:"url",value:b.cover_image_url,onChange:e=>_({...b,cover_image_url:e.target.value}),placeholder:"https://…/cover.jpg"})]}),(0,r.jsxs)("label",{className:"wf-field",children:[(0,r.jsx)("span",{children:"Cover title"}),(0,r.jsx)("input",{type:"text",value:b.cover_copy.title,onChange:e=>_({...b,cover_copy:{...b.cover_copy,title:e.target.value}}),placeholder:"".concat(a.name," — Intake")})]}),(0,r.jsxs)("label",{className:"wf-field",children:[(0,r.jsx)("span",{children:"Cover subtitle"}),(0,r.jsx)("input",{type:"text",value:b.cover_copy.subtitle,onChange:e=>_({...b,cover_copy:{...b.cover_copy,subtitle:e.target.value}}),placeholder:"Submit the details below to start."})]}),(0,r.jsxs)("details",{className:"wf-advanced",children:[(0,r.jsx)("summary",{children:"Override sender name / accent (optional)"}),(0,r.jsxs)("label",{className:"wf-field",children:[(0,r.jsxs)("span",{children:["Sender name override ",(0,r.jsxs)("em",{className:"wf-optional",children:["defaults to ",(null==p?void 0:p.company_name)||"brand"]})]}),(0,r.jsx)("input",{type:"text",value:b.sender_name,onChange:e=>_({...b,sender_name:e.target.value}),placeholder:(null==p?void 0:p.company_name)||""})]}),(0,r.jsxs)("label",{className:"wf-field",children:[(0,r.jsxs)("span",{children:["Accent override ",(0,r.jsxs)("em",{className:"wf-optional",children:["defaults to ",(null==p?void 0:p.accent_hex)||"#c2452a"]})]}),(0,r.jsxs)("div",{className:"wf-accent-row",children:[(0,r.jsx)("input",{type:"color",value:b.accent_hex||(null==p?void 0:p.accent_hex)||"#c2452a",onChange:e=>_({...b,accent_hex:e.target.value})}),(0,r.jsx)("input",{type:"text",value:b.accent_hex,onChange:e=>_({...b,accent_hex:e.target.value}),placeholder:"leave empty to use brand"})]})]}),(0,r.jsxs)("label",{className:"wf-field",children:[(0,r.jsxs)("span",{children:["Logo URL override ",(0,r.jsx)("em",{className:"wf-optional",children:"defaults to brand logo"})]}),(0,r.jsx)("input",{type:"url",value:b.logo_url,onChange:e=>_({...b,logo_url:e.target.value}),placeholder:"https://…/logo.svg"})]})]}),(0,r.jsxs)("div",{className:"wf-preview",children:[(0,r.jsx)("small",{children:"Live preview"}),(0,r.jsx)("iframe",{title:"Brand preview",srcDoc:R,sandbox:"allow-same-origin"})]}),(0,r.jsx)("button",{type:"button",className:"wf-btn",disabled:"presentation"===j,onClick:()=>A({brand:b},"presentation"),children:"presentation"===j?"Saving…":"Save presentation"})]}),(0,r.jsxs)("section",{className:"wf-drawer-section",children:[(0,r.jsx)("header",{className:"wf-drawer-section-head",children:(0,r.jsx)("h4",{children:"3 \xb7 Agents"})}),(0,r.jsxs)("p",{className:"wf-drawer-muted",children:["Per-stage agent template overrides. JSON map: ",(0,r.jsx)("code",{children:"{ stage_slug: { agent_template_slug, prompt_override } }"}),"."]}),(0,r.jsx)("textarea",{rows:6,className:"wf-code",value:y,onChange:e=>N(e.target.value)}),(0,r.jsx)("button",{type:"button",className:"wf-btn",disabled:"agents"===j,onClick:()=>{try{A({agent_overrides:JSON.parse(y)},"agents")}catch(e){g("agents: invalid JSON — ".concat(e.message))}},children:"agents"===j?"Saving…":"Save agent overrides"})]}),(0,r.jsxs)("section",{className:"wf-drawer-section",children:[(0,r.jsx)("header",{className:"wf-drawer-section-head",children:(0,r.jsx)("h4",{children:"4 \xb7 Auto-approval"})}),(0,r.jsxs)("p",{className:"wf-drawer-muted",children:["Declarative rules (same dialect as ",(0,r.jsx)("code",{children:"policy_gate"}),"). Array of ",(0,r.jsx)("code",{children:"{ when, decision }"})," entries."]}),(0,r.jsx)("textarea",{rows:5,className:"wf-code",value:k,onChange:e=>S(e.target.value)}),(0,r.jsx)("button",{type:"button",className:"wf-btn",disabled:"autoapprove"===j,onClick:()=>{try{A({auto_approve_rules:JSON.parse(k)},"autoapprove")}catch(e){g("auto-approve: invalid JSON — ".concat(e.message))}},children:"autoapprove"===j?"Saving…":"Save auto-approval"})]}),(0,r.jsxs)("section",{className:"wf-drawer-section",children:[(0,r.jsx)("header",{className:"wf-drawer-section-head",children:(0,r.jsx)("h4",{children:"5 \xb7 Sharing"})}),(0,r.jsxs)("label",{className:"wf-checkbox",children:[(0,r.jsx)("input",{type:"checkbox",checked:C,onChange:e=>P(e.target.checked)}),(0,r.jsx)("span",{children:"Allow share-link submissions"})]}),(0,r.jsxs)("label",{className:"wf-field",children:[(0,r.jsx)("span",{children:"Default link expiry (days)"}),(0,r.jsx)("input",{type:"number",min:1,max:90,value:O,onChange:e=>E(Number(e.target.value))})]}),(0,r.jsx)("button",{type:"button",className:"wf-btn",disabled:"sharing"===j,onClick:()=>A({share_link_enabled:C,share_link_default_expiry_days:O},"sharing"),children:"sharing"===j?"Saving…":"Save sharing"})]})]})]})})}function o(e){return String(e||"").replace(/[&<>"']/g,e=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[e])}function d(e){var a;let{definition:s,projects:c,brandedIntake:o,defaultProjectId:d,usage:h=0}=e,u=(0,l.useRouter)(),[p,m]=(0,t.useState)(!1),[f,x]=(0,t.useState)(!1),[v,g]=(0,t.useState)(null);(0,t.useEffect)(()=>{x(!0)},[]);let[j,w]=(0,t.useState)(null),[b,_]=(0,t.useState)(!1),[y,N]=(0,t.useState)(null),k=d||(null==c||null==(a=c[0])?void 0:a.id)||"personal",S=(0,t.useCallback)(async()=>{N(null),_(!0);try{if(o){let e=await fetch("/api/processes/start-and-route",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({definition_slug:s.slug,project_id:k})}),a=await e.json();if(!e.ok)throw Error(a.error||"start_failed");u.push(a.redirect_url||"/workflows/".concat(a.case_id))}else u.push("/workflows/new?definition=".concat(s.slug))}catch(e){N(String((null==e?void 0:e.message)||e)),_(!1)}},[o,s.slug,k,u]),C=(0,t.useCallback)(async()=>{w(null),g(null);try{let e=await fetch("/api/processes/start-and-route",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({definition_slug:s.slug,project_id:k})}),a=await e.json();if(!e.ok)throw Error(a.error||"start_failed");let r=await fetch("/api/processes/".concat(a.case_id,"/share-link"),{method:"POST",headers:{"content-type":"application/json"},body:"{}"}),t=await r.json();if(!r.ok)throw Error(t.error||"mint_failed");g(t.link);try{await navigator.clipboard.writeText(t.link)}catch(e){}}catch(e){w(String((null==e?void 0:e.message)||e))}},[s.slug,k]),P=(s.name||"??").replace(/[^a-zA-Z]/g,"").slice(0,2).toUpperCase()||"??";return(0,r.jsxs)("li",{className:"mkt-card wf-defcard",children:[(0,r.jsxs)("div",{className:"mkt-card-head wf-defcard-top",children:[(0,r.jsx)("div",{className:"wf-defcard-cover","aria-hidden":!0,children:(0,r.jsx)("span",{className:"wf-defcard-initials",children:P})}),(0,r.jsxs)("span",{className:"wf-defcard-version",children:["v",s.version]})]}),(0,r.jsxs)("div",{className:"mkt-card-body wf-defcard-body",children:[(0,r.jsxs)("header",{className:"wf-defcard-head",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("span",{className:"wf-defcard-kicker",children:s.category||"process"}),(0,r.jsx)("h3",{className:"mkt-card-title",children:s.name})]}),(0,r.jsxs)("span",{className:"wf-defcard-usage",title:"".concat(h," cases started"),children:[h," ",1===h?"case":"cases"]})]}),(0,r.jsx)("p",{className:"mkt-card-desc wf-defcard-desc",children:s.description||"No description."}),y?(0,r.jsx)("p",{className:"wf-defcard-error",children:y}):null,j?(0,r.jsxs)("p",{className:"wf-defcard-error",children:["Share: ",j]}):null,v?(0,r.jsxs)("p",{className:"wf-defcard-share",children:[(0,r.jsx)("span",{children:"Link copied:"}),(0,r.jsx)("a",{href:v,target:"_blank",rel:"noreferrer",children:v})]}):null,(0,r.jsxs)("div",{className:"wf-defcard-actions",children:[(0,r.jsx)("button",{type:"button",className:"wf-defcard-btn wf-defcard-btn--primary",onClick:S,disabled:b,children:b?"Starting…":"Start case"}),(0,r.jsx)("button",{type:"button",className:"wf-defcard-btn",onClick:()=>m(!0),children:"Configure"}),(0,r.jsx)("button",{type:"button",className:"wf-defcard-btn",onClick:C,children:"Share"})]})]}),p&&f?(0,n.createPortal)((0,r.jsx)(i,{definition:s,projects:c,initialProjectId:k,onClose:()=>m(!1)}),document.body):null]})}},77547:(e,a,s)=>{Promise.resolve().then(s.bind(s,10677)),Promise.resolve().then(s.bind(s,53749)),Promise.resolve().then(s.t.bind(s,52619,23))}},e=>{e.O(0,[2619,8441,1255,7358],()=>e(e.s=77547)),_N_E=e.O()}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7143],{10677:(e,a,s)=>{"use strict";s.d(a,{default:()=>n});var r=s(95155),t=s(12115);function n(){let[e,a]=(0,t.useState)([]),[s,n]=(0,t.useState)("");return(0,t.useEffect)(()=>{n(localStorage.getItem("madarx.activeProjectId")||""),fetch("/api/projects").then(e=>e.json()).then(e=>a(e.projects||[])).catch(()=>{})},[]),(0,r.jsx)("div",{className:"project-switcher","data-project-switcher":!0,children:(0,r.jsxs)("select",{value:s,onChange:e=>{var a;n(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,r.jsx)("option",{value:"",children:"All projects"}),e.map(e=>(0,r.jsx)("option",{value:e.id,children:e.name},e.id))]})})}},20063:(e,a,s)=>{"use strict";var r=s(47260);s.o(r,"usePathname")&&s.d(a,{usePathname:function(){return r.usePathname}}),s.o(r,"useRouter")&&s.d(a,{useRouter:function(){return r.useRouter}}),s.o(r,"useSearchParams")&&s.d(a,{useSearchParams:function(){return r.useSearchParams}})},53749:(e,a,s)=>{"use strict";s.d(a,{default:()=>d});var r=s(95155),t=s(12115),n=s(47650),l=s(20063);function c(){return{sender_name:"",cover_image_url:"",cover_copy:{title:"",subtitle:""},accent_hex:"",logo_url:""}}function i(e){let{definition:a,projects:s,initialProjectId:n,onClose:l}=e,[i,d]=(0,t.useState)(n),[h,u]=(0,t.useState)(null),[p,m]=(0,t.useState)(null),[f,x]=(0,t.useState)(!0),[v,g]=(0,t.useState)(null),[j,w]=(0,t.useState)(null),[b,_]=(0,t.useState)(c()),[y,N]=(0,t.useState)("{}"),[k,S]=(0,t.useState)("[]"),[C,P]=(0,t.useState)(!1),[O,E]=(0,t.useState)(14),[I,J]=(0,t.useState)(!1);(0,t.useEffect)(()=>{let e=!1;return x(!0),g(null),fetch("/api/processes/definitions/".concat(a.slug,"/settings?project_id=").concat(encodeURIComponent(i),"&include_brand=1")).then(e=>e.json()).then(a=>{var s,r,t,n,l,i,o,d;if(e)return;if(a.error){g(a.error),x(!1);return}u(a.settings),m(a.resolved_brand||null);let h=(null==(s=a.settings)?void 0:s.brand)||c();_({sender_name:h.sender_name||"",cover_image_url:h.cover_image_url||"",cover_copy:{title:(null==(r=h.cover_copy)?void 0:r.title)||"",subtitle:(null==(t=h.cover_copy)?void 0:t.subtitle)||""},accent_hex:h.accent_hex||"",logo_url:h.logo_url||""}),N(JSON.stringify((null==(n=a.settings)?void 0:n.agent_overrides)||{},null,2)),S(JSON.stringify((null==(l=a.settings)?void 0:l.auto_approve_rules)||[],null,2)),P(!!(null==(i=a.settings)?void 0:i.share_link_enabled)),E(Number((null==(o=a.settings)?void 0:o.share_link_default_expiry_days)||14)),J(!!(null==(d=a.settings)?void 0:d.default_for_project)),x(!1)}).catch(a=>{e||(g(String(a)),x(!1))}),()=>{e=!0}},[a.slug,i]);let A=async(e,s)=>{w(s),g(null);try{let s=await fetch("/api/processes/definitions/".concat(a.slug,"/settings"),{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({project_id:i,...e})}),r=await s.json();if(!s.ok)throw Error(r.error||"save_failed");u(r.settings)}catch(e){g(String((null==e?void 0:e.message)||e))}finally{w(null)}},L=(0,t.useMemo)(()=>({accent_hex:b.accent_hex||(null==p?void 0:p.accent_hex)||"#c2452a",sender_name:b.sender_name||(null==p?void 0:p.sender_name)||"Madarx OS",logo_url:b.logo_url||(null==p?void 0:p.logo_url)||null,cover_image_url:b.cover_image_url||null,cover_copy:b.cover_copy,fonts:(null==p?void 0:p.fonts)||[]}),[b,p]),R=(0,t.useMemo)(()=>{let e=L.accent_hex,s=o(L.sender_name),r=o(b.cover_copy.title||a.name),t=o(b.cover_copy.subtitle||"Submit the details below to start."),n=L.cover_image_url?"background-image:linear-gradient(135deg,".concat(e,"cc,#0e0d0ccc),url('").concat(o(L.cover_image_url),"');background-size:cover;background-position:center;"):"background:linear-gradient(135deg,".concat(e,",#0e0d0c);");return"<!DOCTYPE html><html><head><style>body{margin:0;font:13px/1.45 ui-sans-serif,system-ui,sans-serif;background:#f7f4ee;padding:14px;color:#1a1817}.hdr{font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:#69707a;margin-bottom:8px}.cv{".concat(n,';height:74px;border-radius:12px;margin-bottom:10px}h1{font-size:18px;margin:0 0 4px}p{margin:0;color:#5f5a55;font-size:12px}.ftr{margin-top:10px;color:#69707a;font-size:10.5px}</style></head><body><div class="hdr">').concat(s,' \xb7 Intake</div><div class="cv"></div><h1>').concat(r,"</h1><p>").concat(t,'</p><p class="ftr">Powered by ').concat(s,"</p></body></html>")},[a.name,L,b.cover_copy]);return(0,r.jsx)("div",{className:"wf-drawer-scrim",role:"dialog","aria-label":"Workflow settings",onClick:l,children:(0,r.jsxs)("aside",{className:"wf-drawer",onClick:e=>e.stopPropagation(),children:[(0,r.jsxs)("header",{className:"wf-drawer-head",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("span",{className:"wf-drawer-kicker",children:"Configure workflow"}),(0,r.jsx)("h3",{children:a.name}),(0,r.jsxs)("small",{children:[a.category||"process"," \xb7 v",a.version]})]}),(0,r.jsx)("button",{type:"button",className:"wf-drawer-close",onClick:l,"aria-label":"Close",children:"\xd7"})]}),v?(0,r.jsx)("p",{className:"wf-drawer-error",children:v}):null,f?(0,r.jsx)("div",{className:"wf-drawer-body",children:(0,r.jsx)("p",{className:"wf-drawer-muted",children:"Loading…"})}):(0,r.jsxs)("div",{className:"wf-drawer-body",children:[(0,r.jsxs)("section",{className:"wf-drawer-section wf-drawer-brand-row",children:[(0,r.jsxs)("header",{className:"wf-drawer-section-head",children:[(0,r.jsx)("h4",{children:"Brand"}),(0,r.jsx)("a",{href:"/settings/brand",target:"_blank",rel:"noreferrer",className:"wf-drawer-link",children:"Edit at /settings/brand ↗"})]}),(0,r.jsx)("p",{className:"wf-drawer-muted",children:"Logo, palette, fonts, and voice inherit from the global brand. You can override the sender name + accent below, but everything else flows through."}),(0,r.jsxs)("div",{className:"wf-brand-chips",children:[(0,r.jsxs)("div",{className:"wf-brand-chip",children:[(0,r.jsx)("span",{children:"Sender"}),(0,r.jsx)("strong",{children:(null==p?void 0:p.company_name)||(null==p?void 0:p.sender_name)||"—"})]}),(0,r.jsxs)("div",{className:"wf-brand-chip",children:[(0,r.jsx)("span",{children:"Accent"}),(0,r.jsxs)("strong",{style:{display:"inline-flex",gap:6,alignItems:"center"},children:[(0,r.jsx)("i",{className:"wf-brand-swatch",style:{background:(null==p?void 0:p.accent_hex)||"#c2452a"}}),(null==p?void 0:p.accent_hex)||"#c2452a"]})]}),(0,r.jsxs)("div",{className:"wf-brand-chip",children:[(0,r.jsx)("span",{children:"Fonts"}),(0,r.jsx)("strong",{children:((null==p?void 0:p.fonts)||[]).slice(0,2).join(" \xb7 ")||"—"})]})]})]}),(0,r.jsxs)("section",{className:"wf-drawer-section",children:[(0,r.jsx)("header",{className:"wf-drawer-section-head",children:(0,r.jsx)("h4",{children:"1 \xb7 Project"})}),(0,r.jsxs)("label",{className:"wf-field",children:[(0,r.jsx)("span",{children:"Project"}),(0,r.jsx)("select",{value:i,onChange:e=>d(e.target.value),children:s.map(e=>(0,r.jsx)("option",{value:e.id,children:e.name||e.slug||e.id},e.id))})]}),(0,r.jsxs)("label",{className:"wf-checkbox",children:[(0,r.jsx)("input",{type:"checkbox",checked:I,onChange:e=>J(e.target.checked)}),(0,r.jsx)("span",{children:"Default process for this project"})]}),(0,r.jsx)("button",{type:"button",className:"wf-btn",disabled:"project"===j,onClick:()=>A({default_for_project:I},"project"),children:"project"===j?"Saving…":"Save"})]}),(0,r.jsxs)("section",{className:"wf-drawer-section",children:[(0,r.jsx)("header",{className:"wf-drawer-section-head",children:(0,r.jsx)("h4",{children:"2 \xb7 Presentation"})}),(0,r.jsx)("p",{className:"wf-drawer-muted",children:"Workflow-specific copy and artwork. The intake form's wrapping inherits from your brand; these fields only override the surface details unique to this workflow."}),(0,r.jsxs)("label",{className:"wf-field",children:[(0,r.jsxs)("span",{children:["Cover image URL ",(0,r.jsx)("em",{className:"wf-optional",children:"optional"})]}),(0,r.jsx)("input",{type:"url",value:b.cover_image_url,onChange:e=>_({...b,cover_image_url:e.target.value}),placeholder:"https://…/cover.jpg"})]}),(0,r.jsxs)("label",{className:"wf-field",children:[(0,r.jsx)("span",{children:"Cover title"}),(0,r.jsx)("input",{type:"text",value:b.cover_copy.title,onChange:e=>_({...b,cover_copy:{...b.cover_copy,title:e.target.value}}),placeholder:"".concat(a.name," — Intake")})]}),(0,r.jsxs)("label",{className:"wf-field",children:[(0,r.jsx)("span",{children:"Cover subtitle"}),(0,r.jsx)("input",{type:"text",value:b.cover_copy.subtitle,onChange:e=>_({...b,cover_copy:{...b.cover_copy,subtitle:e.target.value}}),placeholder:"Submit the details below to start."})]}),(0,r.jsxs)("details",{className:"wf-advanced",children:[(0,r.jsx)("summary",{children:"Override sender name / accent (optional)"}),(0,r.jsxs)("label",{className:"wf-field",children:[(0,r.jsxs)("span",{children:["Sender name override ",(0,r.jsxs)("em",{className:"wf-optional",children:["defaults to ",(null==p?void 0:p.company_name)||"brand"]})]}),(0,r.jsx)("input",{type:"text",value:b.sender_name,onChange:e=>_({...b,sender_name:e.target.value}),placeholder:(null==p?void 0:p.company_name)||""})]}),(0,r.jsxs)("label",{className:"wf-field",children:[(0,r.jsxs)("span",{children:["Accent override ",(0,r.jsxs)("em",{className:"wf-optional",children:["defaults to ",(null==p?void 0:p.accent_hex)||"#c2452a"]})]}),(0,r.jsxs)("div",{className:"wf-accent-row",children:[(0,r.jsx)("input",{type:"color",value:b.accent_hex||(null==p?void 0:p.accent_hex)||"#c2452a",onChange:e=>_({...b,accent_hex:e.target.value})}),(0,r.jsx)("input",{type:"text",value:b.accent_hex,onChange:e=>_({...b,accent_hex:e.target.value}),placeholder:"leave empty to use brand"})]})]}),(0,r.jsxs)("label",{className:"wf-field",children:[(0,r.jsxs)("span",{children:["Logo URL override ",(0,r.jsx)("em",{className:"wf-optional",children:"defaults to brand logo"})]}),(0,r.jsx)("input",{type:"url",value:b.logo_url,onChange:e=>_({...b,logo_url:e.target.value}),placeholder:"https://…/logo.svg"})]})]}),(0,r.jsxs)("div",{className:"wf-preview",children:[(0,r.jsx)("small",{children:"Live preview"}),(0,r.jsx)("iframe",{title:"Brand preview",srcDoc:R,sandbox:"allow-same-origin"})]}),(0,r.jsx)("button",{type:"button",className:"wf-btn",disabled:"presentation"===j,onClick:()=>A({brand:b},"presentation"),children:"presentation"===j?"Saving…":"Save presentation"})]}),(0,r.jsxs)("section",{className:"wf-drawer-section",children:[(0,r.jsx)("header",{className:"wf-drawer-section-head",children:(0,r.jsx)("h4",{children:"3 \xb7 Agents"})}),(0,r.jsxs)("p",{className:"wf-drawer-muted",children:["Per-stage agent template overrides. JSON map: ",(0,r.jsx)("code",{children:"{ stage_slug: { agent_template_slug, prompt_override } }"}),"."]}),(0,r.jsx)("textarea",{rows:6,className:"wf-code",value:y,onChange:e=>N(e.target.value)}),(0,r.jsx)("button",{type:"button",className:"wf-btn",disabled:"agents"===j,onClick:()=>{try{A({agent_overrides:JSON.parse(y)},"agents")}catch(e){g("agents: invalid JSON — ".concat(e.message))}},children:"agents"===j?"Saving…":"Save agent overrides"})]}),(0,r.jsxs)("section",{className:"wf-drawer-section",children:[(0,r.jsx)("header",{className:"wf-drawer-section-head",children:(0,r.jsx)("h4",{children:"4 \xb7 Auto-approval"})}),(0,r.jsxs)("p",{className:"wf-drawer-muted",children:["Declarative rules (same dialect as ",(0,r.jsx)("code",{children:"policy_gate"}),"). Array of ",(0,r.jsx)("code",{children:"{ when, decision }"})," entries."]}),(0,r.jsx)("textarea",{rows:5,className:"wf-code",value:k,onChange:e=>S(e.target.value)}),(0,r.jsx)("button",{type:"button",className:"wf-btn",disabled:"autoapprove"===j,onClick:()=>{try{A({auto_approve_rules:JSON.parse(k)},"autoapprove")}catch(e){g("auto-approve: invalid JSON — ".concat(e.message))}},children:"autoapprove"===j?"Saving…":"Save auto-approval"})]}),(0,r.jsxs)("section",{className:"wf-drawer-section",children:[(0,r.jsx)("header",{className:"wf-drawer-section-head",children:(0,r.jsx)("h4",{children:"5 \xb7 Sharing"})}),(0,r.jsxs)("label",{className:"wf-checkbox",children:[(0,r.jsx)("input",{type:"checkbox",checked:C,onChange:e=>P(e.target.checked)}),(0,r.jsx)("span",{children:"Allow share-link submissions"})]}),(0,r.jsxs)("label",{className:"wf-field",children:[(0,r.jsx)("span",{children:"Default link expiry (days)"}),(0,r.jsx)("input",{type:"number",min:1,max:90,value:O,onChange:e=>E(Number(e.target.value))})]}),(0,r.jsx)("button",{type:"button",className:"wf-btn",disabled:"sharing"===j,onClick:()=>A({share_link_enabled:C,share_link_default_expiry_days:O},"sharing"),children:"sharing"===j?"Saving…":"Save sharing"})]})]})]})})}function o(e){return String(e||"").replace(/[&<>"']/g,e=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[e])}function d(e){var a;let{definition:s,projects:c,defaultProjectId:o,usage:d=0}=e,h=(0,l.useRouter)(),[u,p]=(0,t.useState)(!1),[m,f]=(0,t.useState)(!1),[x,v]=(0,t.useState)(null);(0,t.useEffect)(()=>{f(!0)},[]);let[g,j]=(0,t.useState)(null),[w,b]=(0,t.useState)(!1),[_,y]=(0,t.useState)(null),N=o||(null==c||null==(a=c[0])?void 0:a.id)||"personal",k=(0,t.useCallback)(async()=>{y(null),b(!0);try{let e=await fetch("/api/processes/start-and-route",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({definition_slug:s.slug,project_id:N})}),a=await e.json();if(!e.ok)throw Error(a.error||"start_failed");h.push(a.redirect_url||"/workflows/".concat(a.case_id))}catch(e){y(String((null==e?void 0:e.message)||e)),b(!1)}},[s.slug,N,h]),S=(0,t.useCallback)(async()=>{j(null),v(null);try{let e=await fetch("/api/processes/start-and-route",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({definition_slug:s.slug,project_id:N})}),a=await e.json();if(!e.ok)throw Error(a.error||"start_failed");let r=await fetch("/api/processes/".concat(a.case_id,"/share-link"),{method:"POST",headers:{"content-type":"application/json"},body:"{}"}),t=await r.json();if(!r.ok)throw Error(t.error||"mint_failed");v(t.link);try{await navigator.clipboard.writeText(t.link)}catch(e){}}catch(e){j(String((null==e?void 0:e.message)||e))}},[s.slug,N]),C=(s.name||"??").replace(/[^a-zA-Z]/g,"").slice(0,2).toUpperCase()||"??";return(0,r.jsxs)("li",{className:"mkt-card wf-defcard",children:[(0,r.jsxs)("div",{className:"mkt-card-head wf-defcard-top",children:[(0,r.jsx)("div",{className:"wf-defcard-cover","aria-hidden":!0,children:(0,r.jsx)("span",{className:"wf-defcard-initials",children:C})}),(0,r.jsxs)("span",{className:"wf-defcard-version",children:["v",s.version]})]}),(0,r.jsxs)("div",{className:"mkt-card-body wf-defcard-body",children:[(0,r.jsxs)("header",{className:"wf-defcard-head",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("span",{className:"wf-defcard-kicker",children:s.category||"process"}),(0,r.jsx)("h3",{className:"mkt-card-title",children:s.name})]}),(0,r.jsxs)("span",{className:"wf-defcard-usage",title:"".concat(d," cases started"),children:[d," ",1===d?"case":"cases"]})]}),(0,r.jsx)("p",{className:"mkt-card-desc wf-defcard-desc",children:s.description||"No description."}),_?(0,r.jsx)("p",{className:"wf-defcard-error",children:_}):null,g?(0,r.jsxs)("p",{className:"wf-defcard-error",children:["Share: ",g]}):null,x?(0,r.jsxs)("p",{className:"wf-defcard-share",children:[(0,r.jsx)("span",{children:"Link copied:"}),(0,r.jsx)("a",{href:x,target:"_blank",rel:"noreferrer",children:x})]}):null,(0,r.jsxs)("div",{className:"wf-defcard-actions",children:[(0,r.jsx)("button",{type:"button",className:"wf-defcard-btn wf-defcard-btn--primary",onClick:k,disabled:w,children:w?"Starting…":"Start case"}),(0,r.jsx)("button",{type:"button",className:"wf-defcard-btn",onClick:()=>p(!0),children:"Configure"}),(0,r.jsx)("button",{type:"button",className:"wf-defcard-btn",onClick:S,children:"Share"})]})]}),u&&m?(0,n.createPortal)((0,r.jsx)(i,{definition:s,projects:c,initialProjectId:N,onClose:()=>p(!1)}),document.body):null]})}},77547:(e,a,s)=>{Promise.resolve().then(s.bind(s,10677)),Promise.resolve().then(s.bind(s,53749)),Promise.resolve().then(s.t.bind(s,52619,23))}},e=>{e.O(0,[2619,8441,1255,7358],()=>e(e.s=77547)),_N_E=e.O()}]);
package/CHANGELOG.md CHANGED
@@ -2,6 +2,37 @@
2
2
 
3
3
  All notable changes to Madarx OS. Newest first.
4
4
 
5
+ ## [2.14.0] - 2026-06-04
6
+
7
+ ### Changed
8
+
9
+ - **One intake form, branded by default.** Starting a workflow case now always opens the branded, interactive intake artifact — a self-contained page with real form controls that submits straight to the engine. The old bare React intake form and its route are gone, and the `MADARX_BRANDED_INTAKE` feature flag is removed (branded is no longer optional). The Start button, the Share link, and direct case links all lead to the same single intake surface, so there is no longer a "two forms running side by side" split to reason about. Share links keep working exactly as before. (Workflow simplification Phase 3.)
10
+ - **Policy gates are now JSON, not a custom mini-language.** Workflow `policy_gate` rules move from a hand-written string expression grammar (`intake.x == 'y' && prior_stage('kyc').score < 0.5`) to a declarative JSON predicate tree (`{ "op": "and", "rules": [ { "op": "eq", "path": "intake.x", "value": "y" }, … ] }`). This removes a bespoke tokenizer/parser from a security-sensitive path, makes rules validatable at authoring time, and eliminates string-escaping edge cases. Operators: `and`/`or`/`not` and `eq`/`neq`/`lt`/`lte`/`gt`/`gte`/`in`/`nin`, over `intake.*`, `prior_stage.<slug>.*`, and `context.*` paths. New `lib/process/policy-predicates.js` with a 55-case unit test. The seeded mine workflows are migrated to the new format. (Workflow simplification Phase 4.)
11
+
12
+ ### Deprecated
13
+
14
+ - **Legacy policy-gate string expressions.** The old string DSL still evaluates for one release (isolated in `lib/process/stages/policy-dsl-legacy.js`) so existing definitions keep working, but it is on a removal track. Author new gates as JSON predicates; the spec validator and `ai-docs/process-engine.md` document the canonical shape.
15
+
16
+ ### Notes
17
+
18
+ - `process_definitions.intake_form_schema_json` is intentionally retained — it is the live storage the engine reads to render the intake form. Dropping it is deferred to a future migration that first relocates the schema onto the first stage's config; intake stays backward compatible.
19
+ - Optional Phases 6 (settings-drawer preview endpoint) and 7 (audit-writer unification) are deliberately deferred — see `specs/active/simplification-dev-plan.md` for the reasons (cosmetic-vs-fragility for 6; the canonical writer the plan assumed doesn't exist and the real one is a distinct compliance channel for 7).
20
+
21
+ ## [2.13.0] - 2026-06-04
22
+
23
+ ### Added
24
+
25
+ - **Branded CLI experience.** `npm i -g madarx` now ends on an on-brand install splash (madarX wordmark, animated checks, "Designed in UAE" dateline), and launching `madarx` shows a Hermes-style hero banner: a 3D wordmark, a titled rule, the orbit mark (madar = "orbit"), and a two-column capability catalog. Sovereign-Mono palette, single Mars accent, zero new dependencies (embedded figlet art, pure-ANSI rendering). Honors `NO_COLOR`, non-TTY, and CI; guarded so it never slows or breaks an install. Preview with `npm run splash` / `npm run banner`.
26
+ - **Business-default skill pack.** A fresh agent now ships with nine ready-to-use business skills grouped by what most teams need first — research (market-research, competitor-watch), comms (inbox-triage, meeting-scheduler), documents (document-extraction, report-builder), data (database-q&a, spreadsheet-analysis), and web (web-automation). Each is backed by the default tools and stays within the usual approval gates. They seed as installed in the marketplace and are injected into every default agent's `skills.md`.
27
+
28
+ ### Changed
29
+
30
+ - **Banner features business tools, not internals.** The boot banner highlights the toolsets a business agent actually reaches for (web, email, calendar, files, browser, data, automations, build-tools) with friendly labels; domain/installable packs (mines, travel, …) fold into "more toolsets". The default skills showcase replaces the engineering/design skills (design-shotgun, design-review, qa-only, cso-audit), which remain in the marketplace.
31
+
32
+ ### Migration
33
+
34
+ - Existing installs' default agents (including the Caretaker) have their `skills.md` refreshed with the business-default skill pack on next launch. Idempotent and customization-safe: a user-edited `skills.md` is never overwritten.
35
+
5
36
  ## [2.12.1] - 2026-06-04
6
37
 
7
38
  ### Fixed
@@ -45,10 +45,42 @@ Implementation: `lib/process/artifacts.js`. All three flow through `lib/runtime.
45
45
  |---|---|---|
46
46
  | `intake_form` | Human submitting the form via UI or `submitIntake` API | Writes `intake_payload` onto the case |
47
47
  | `agent_run` | Agent engine (`runAgentEngine`) with the configured template | Structured JSON output |
48
- | `policy_gate` | Engine — evaluates declarative rules over `intake` + `context` | `{ trace, all_pass }` |
48
+ | `policy_gate` | Engine — evaluates declarative JSON predicate rules over `intake` + `context` | `{ trace, all_pass }` |
49
49
  | `human_approval` | Approval request → `/approvals` UI or API | Approved/denied decision |
50
50
  | `package` | Engine — renders a markdown cover sheet + supporting docs into artifacts | `case_package` artifact id(s) |
51
51
 
52
+ ### `intake_form` — branded interactive artifact (only intake path as of v2.14.0)
53
+
54
+ At `startCase`, the engine renders the first `intake_form` stage as a **branded interactive HTML artifact** (`createIntakeFormArtifact` → `renderIntakeFormHtml`): a self-contained document with real form controls that POSTs to `/api/processes/<id>/stages/<slug>/submit`. The artifact id is stored on `context_json.intake_form_artifact_id`.
55
+
56
+ The Start button on `/workflows` routes through `POST /api/processes/start-and-route`, which creates the case and redirects to `/workflows/new/<case_id>` (the branded intake page) for intake-first definitions, or to `/workflows/<case_id>` for non-intake first stages. Anonymous share links (`/workflows/share/<case_id>?token=…`) render the same artifact with a one-time submit token.
57
+
58
+ The legacy read-only "preview" renderer, the bare-React intake form (`app/workflows/new/page.js` + `new-case-flow.jsx`), and the `MADARX_BRANDED_INTAKE` env flag were all removed in v2.14.0 — there is exactly one intake surface. Artifact write failure is observation-only: engine state stays the source of truth and the case still advances.
59
+
60
+ ### `policy_gate` — JSON predicate rules
61
+
62
+ `config.rules[]` is an array of rules, ALL of which must pass (implicit AND) for the gate to pass. Each rule is a **JSON predicate** (the canonical form):
63
+
64
+ ```json
65
+ {
66
+ "op": "and",
67
+ "rules": [
68
+ { "op": "eq", "path": "intake.country", "value": "US" },
69
+ { "op": "gte", "path": "prior_stage.kyc-risk.risk_score", "value": 0.3 },
70
+ { "op": "in", "path": "intake.type", "value": ["MSA", "SOW", "NDA"] }
71
+ ]
72
+ }
73
+ ```
74
+
75
+ - **Logical ops:** `and` / `or` (with `rules[]`), `not` (with `rule`).
76
+ - **Compare ops:** `eq` / `neq` (loose `==`/`!=`, so `neq null` is the "field must be provided" idiom), `lt` / `lte` / `gt` / `gte` (numeric coercion), `in` / `nin` (array `value`).
77
+ - **Path resolution:** `intake.<field…>`, `prior_stage.<slug>.<field…>`, `context.<field…>`. Missing paths resolve to `undefined`. Max nesting depth 20.
78
+ - An optional `label` on any rule is shown in the gate trace.
79
+
80
+ Evaluator: `lib/process/policy-predicates.js`. Validator: `lib/process/spec-validator.js::validatePredicate` checks predicate shape at authoring time. There is no string parsing — no tokenizer, no escaping bugs.
81
+
82
+ **Legacy string DSL (deprecated, one-release back-compat).** The old string-expression grammar (`intake.x == 'y' && prior_stage('kyc').score < 0.5`) still evaluates via `lib/process/stages/policy-dsl-legacy.js`, routed per-rule by the handler. Seeds, docs, and new authoring use predicate JSON only; the string path is on a removal track and should not be used in new workflows.
83
+
52
84
  Stage handlers live at `lib/process/stages/<kind>.js`. Each exports `executeStage({ case, stage, execution, heartbeat_task_id })` and returns an outcome envelope:
53
85
 
54
86
  ```js
@@ -4,8 +4,8 @@ export const runtime = 'nodejs';
4
4
  export const dynamic = 'force-dynamic';
5
5
 
6
6
  // One-shot create — returns the case id, the intake artifact id (when the
7
- // first stage is intake_form), and the dashboard URL to redirect to. Saves
8
- // the round-trip the bare-React form needed (POST + redirect).
7
+ // first stage is intake_form), and the dashboard URL to redirect to. The case
8
+ // always lands on the branded interactive intake artifact page.
9
9
  //
10
10
  // Body: { definition_slug, project_id, title?, created_by_user_id? }
11
11
  export async function POST(req) {
@@ -21,7 +21,9 @@ export async function POST(req) {
21
21
  });
22
22
  const fresh = getCase(c.id);
23
23
  const intake_artifact_id = fresh?.context?.intake_form_artifact_id || null;
24
- const redirect_url = process.env.MADARX_BRANDED_INTAKE === '1'
24
+ // Intake cases land on the branded interactive intake page; non-intake
25
+ // first stages go straight to the case detail view.
26
+ const redirect_url = fresh?.status === 'intake'
25
27
  ? `/workflows/new/${c.id}`
26
28
  : `/workflows/${c.id}`;
27
29
  return Response.json({
@@ -96,8 +96,8 @@ function IntakeStagePanel({ caseRow, artifacts, latestExec }) {
96
96
  {!caseRow.intake_payload ? (
97
97
  <p>
98
98
  Intake form not submitted yet. Submit via{' '}
99
- <a href={`/workflows/new?definition=${caseRow.definition_slug}`}>the new-case page</a>{' '}
100
- for this definition.
99
+ <a href={`/workflows/new/${caseRow.id}`}>the intake page</a>{' '}
100
+ for this case.
101
101
  </p>
102
102
  ) : null}
103
103
 
@@ -8,10 +8,9 @@ import SettingsDrawer from './settings-drawer.jsx';
8
8
  // Workflows page definition card. Kept visually aligned with Projects and
9
9
  // Marketplace: quiet white card, small tile, minimal metadata, direct actions.
10
10
  //
11
- // Start either (a) calls /api/processes/start-and-route to create the case
12
- // immediately then routes to the branded artifact page (when
13
- // MADARX_BRANDED_INTAKE=1), or (b) falls back to
14
- // /workflows/new?definition=<slug> for the bare React form.
11
+ // Start calls /api/processes/start-and-route to create the case immediately,
12
+ // then routes to the branded interactive intake artifact page (the only intake
13
+ // path as of v2.14.0).
15
14
  //
16
15
  // Configure opens a right-edge drawer (`SettingsDrawer`) for the
17
16
  // per-(definition, project) settings. Share mints + copies a share token
@@ -19,7 +18,6 @@ import SettingsDrawer from './settings-drawer.jsx';
19
18
  export default function DefinitionCard({
20
19
  definition,
21
20
  projects,
22
- brandedIntake,
23
21
  defaultProjectId,
24
22
  usage = 0,
25
23
  }) {
@@ -38,23 +36,19 @@ export default function DefinitionCard({
38
36
  setError(null);
39
37
  setStarting(true);
40
38
  try {
41
- if (brandedIntake) {
42
- const res = await fetch('/api/processes/start-and-route', {
43
- method: 'POST',
44
- headers: { 'content-type': 'application/json' },
45
- body: JSON.stringify({ definition_slug: definition.slug, project_id: initialProjectId }),
46
- });
47
- const json = await res.json();
48
- if (!res.ok) throw new Error(json.error || 'start_failed');
49
- router.push(json.redirect_url || `/workflows/${json.case_id}`);
50
- } else {
51
- router.push(`/workflows/new?definition=${definition.slug}`);
52
- }
39
+ const res = await fetch('/api/processes/start-and-route', {
40
+ method: 'POST',
41
+ headers: { 'content-type': 'application/json' },
42
+ body: JSON.stringify({ definition_slug: definition.slug, project_id: initialProjectId }),
43
+ });
44
+ const json = await res.json();
45
+ if (!res.ok) throw new Error(json.error || 'start_failed');
46
+ router.push(json.redirect_url || `/workflows/${json.case_id}`);
53
47
  } catch (err) {
54
48
  setError(String(err?.message || err));
55
49
  setStarting(false);
56
50
  }
57
- }, [brandedIntake, definition.slug, initialProjectId, router]);
51
+ }, [definition.slug, initialProjectId, router]);
58
52
 
59
53
  const onShare = useCallback(async () => {
60
54
  setShareError(null);
@@ -6,13 +6,13 @@ import { getDefinition } from '../../../../lib/process/definitions.js';
6
6
 
7
7
  export const dynamic = 'force-dynamic';
8
8
 
9
- // Branded intake artifact page. Renders the case's intake-form artifact in
10
- // a sandboxed iframe the artifact ships its own form controls and POSTs
11
- // directly to /api/processes/<id>/stages/<stage>/submit. The host page is
12
- // chrome only.
9
+ // Branded intake artifact page the canonical "start a case" intake surface.
10
+ // Renders the case's intake-form artifact in a sandboxed iframe; the artifact
11
+ // ships its own form controls and POSTs directly to
12
+ // /api/processes/<id>/stages/<stage>/submit. The host page is chrome only.
13
13
  //
14
- // Reached two ways: (a) from /workflows when MADARX_BRANDED_INTAKE=1, or
15
- // (b) by deep link to a known case.
14
+ // Reached from /workflows (Start) via /api/processes/start-and-route, or by
15
+ // deep link to a known case.
16
16
  export default async function BrandedIntakePage({ params }) {
17
17
  const { caseId } = await params;
18
18
  const c = getCase(caseId);
@@ -47,8 +47,8 @@ export default async function BrandedIntakePage({ params }) {
47
47
  ) : (
48
48
  <p className="muted">
49
49
  No intake artifact was generated. Either the first stage is not an intake_form,
50
- or the artifact write failed (engine state is unaffected). Use the standard form at{' '}
51
- <Link href={`/workflows/new?definition=${definition?.slug || ''}`}>/workflows/new</Link>.
50
+ or the artifact write failed (engine state is unaffected).{' '}
51
+ <Link href={`/workflows/${caseId}`}>Open the case ›</Link>
52
52
  </p>
53
53
  )}
54
54
  </div>
@@ -10,10 +10,6 @@ import DefinitionCard from './definition-card.jsx';
10
10
 
11
11
  export const dynamic = 'force-dynamic';
12
12
 
13
- // MADARX_BRANDED_INTAKE=1: Start → /workflows/new/<case_id> (branded
14
- // artifact). Off: Start → /workflows/new?definition=<slug> (bare form).
15
- const BRANDED_INTAKE = process.env.MADARX_BRANDED_INTAKE === '1';
16
-
17
13
  const ACTIVE_STATES = new Set(['intake', 'running', 'awaiting_approval']);
18
14
 
19
15
  function formatRelative(iso) {
@@ -94,7 +90,6 @@ export default function WorkflowsPage() {
94
90
  key={def.id}
95
91
  definition={def}
96
92
  projects={projects}
97
- brandedIntake={BRANDED_INTAKE}
98
93
  defaultProjectId={defaultProjectId}
99
94
  usage={usage.get(def.slug) || 0}
100
95
  />
@@ -56,7 +56,6 @@ export default async function ShareLinkPage({ params, searchParams }) {
56
56
  schema,
57
57
  caseRow: c,
58
58
  settings,
59
- mode: 'interactive',
60
59
  submit_endpoint: `/api/processes/${c.id}/stages/${stage.slug}/submit`,
61
60
  submit_token: token,
62
61
  });
package/lib/cli/banner.js CHANGED
@@ -12,16 +12,22 @@
12
12
 
13
13
  // ── palette ────────────────────────────────────────────────────────────────
14
14
  const PALETTE = {
15
- mars: [0xc2, 0x45, 0x2a], // brand primary
15
+ mars: [0xc2, 0x45, 0x2a], // brand primary / THE accent
16
16
  marsHi: [0xde, 0x6a, 0x53], // lighter mars (top of gradient)
17
17
  marsLo: [0x7c, 0x2b, 0x19], // dark mars (bottom of gradient)
18
18
  gold: [0xd4, 0xb7, 0x7f],
19
19
  sand: [0xf6, 0xf3, 0xed],
20
20
  ink: [0x68, 0x70, 0x7b], // "muted" — used for secondary text
21
21
  green: [0x4c, 0xae, 0x6a],
22
+ // ── Sovereign-Mono palette (brand-guidelines v1.3) — used by the splash ──
23
+ onyx: [0x0F, 0x0F, 0x11], // ground / black letter fill
24
+ platinum: [0xE8, 0xE8, 0xE5], // mark / wordmark / "done" ✓
25
+ bone: [0xDC, 0xDC, 0xD8], // body labels
26
+ graphite: [0x4A, 0x4A, 0x4D], // rules, borders, pending ·
27
+ muted: [0x8A, 0x82, 0x78], // datelines, subtitle, secondary
22
28
  };
23
29
 
24
- function colorEnabled() {
30
+ export function colorEnabled() {
25
31
  if (process.env.FORCE_COLOR && process.env.FORCE_COLOR !== '0') return true;
26
32
  if (process.env.NO_COLOR) return false;
27
33
  return Boolean(process.stdout && process.stdout.isTTY);
@@ -29,32 +35,49 @@ function colorEnabled() {
29
35
 
30
36
  const ON = colorEnabled();
31
37
 
32
- function fg([r, g, b], s) {
38
+ export function fg([r, g, b], s) {
33
39
  if (!ON) return s;
34
40
  return `\x1b[38;2;${r};${g};${b}m${s}\x1b[0m`;
35
41
  }
36
- function bold(s) { return ON ? `\x1b[1m${s}\x1b[0m` : s; }
37
- function dim(s) { return ON ? `\x1b[2m${s}\x1b[0m` : s; }
42
+ export function bold(s) { return ON ? `\x1b[1m${s}\x1b[0m` : s; }
43
+ export function dim(s) { return ON ? `\x1b[2m${s}\x1b[0m` : s; }
38
44
 
39
- // ── wordmark ─────────────────────────────────────────────────────────────────
40
- // 5-row block alphabet, just the glyphs we need for "MADARX".
41
- const GLYPHS = {
42
- M: ['█ █', '██ ██', '█ █ █', '█ █', '█ █'],
43
- A: [' ███ ', '█ █', '█████', '█ █', '█ █'],
44
- D: ['████ ', '█ █', '█ █', '█ █', '████ '],
45
- R: ['████ ', '█ █', '████ ', '█ █ ', '█ █'],
46
- X: ['█ █', ' █ █ ', ' █ ', ' █ █ ', '█ █'],
47
- };
45
+ /** Visible (printable) length of a string, ignoring ANSI escape sequences. */
46
+ export function visibleLength(s) {
47
+ // eslint-disable-next-line no-control-regex
48
+ return String(s).replace(/\x1b\[[0-9;]*m/g, '').length;
49
+ }
48
50
 
49
- const ROW_TINT = [PALETTE.marsHi, PALETTE.mars, PALETTE.mars, PALETTE.marsLo, PALETTE.marsLo];
51
+ // ── wordmark ─────────────────────────────────────────────────────────────────
52
+ // Embedded figlet "Standard" font art for "madar" + "X", captured offline so the
53
+ // banner stays dependency-free (no figlet at runtime). "madar" renders in Sand,
54
+ // the "X" in Mars — the single brand accent (the X is a permanent constant, so
55
+ // it never counts against the one-Mars-per-surface rule).
56
+ const FIG_MADAR = [
57
+ ' _ ',
58
+ ' _ __ ___ __ _ __| | __ _ _ __ ',
59
+ " | '_ ` _ \\ / _` |/ _` |/ _` | '__|",
60
+ ' | | | | | | (_| | (_| | (_| | | ',
61
+ ' |_| |_| |_|\\__,_|\\__,_|\\__,_|_| ',
62
+ ' ',
63
+ ];
64
+ const FIG_X = [
65
+ ' __ __',
66
+ ' \\ \\/ /',
67
+ ' \\ / ',
68
+ ' / \\ ',
69
+ ' /_/\\_\\',
70
+ ' ',
71
+ ];
50
72
 
51
- /** The MADARX wordmark as a colored, multi-line string. */
52
- function wordmark() {
53
- const word = 'MADARX'.split('');
73
+ /** The "madarX" wordmark as a colored, multi-line string. */
74
+ export function wordmark() {
75
+ const rows = Math.max(FIG_MADAR.length, FIG_X.length);
54
76
  const lines = [];
55
- for (let row = 0; row < 5; row++) {
56
- const segs = word.map((ch) => GLYPHS[ch][row]).join(' ');
57
- lines.push(fg(ROW_TINT[row], segs));
77
+ for (let i = 0; i < rows; i++) {
78
+ const l = FIG_MADAR[i] ?? '';
79
+ const r = FIG_X[i] ?? '';
80
+ lines.push(fg(PALETTE.platinum, l) + fg(PALETTE.mars, r));
58
81
  }
59
82
  return lines.join('\n');
60
83
  }
@@ -145,4 +168,160 @@ export function renderHeader(title = 'setup', version) {
145
168
  return out.join('\n');
146
169
  }
147
170
 
171
+ // ── hero banner (Hermes-style: 3D wordmark + orbit mark + grouped catalog) ────
172
+
173
+ /**
174
+ * Hero wordmark — identical to the install splash: the lowercase Standard
175
+ * "madar" (FIG_MADAR, Platinum) beside the Standard "X" (FIG_X, Mars).
176
+ * Returns an array of lines so the hero can indent/compose them.
177
+ */
178
+ function heroWordmark() {
179
+ return wordmark().split('\n');
180
+ }
181
+
182
+ // Orbit mark — "madar" (مدار) is Arabic for orbit. Graphite ring, Mars core + bead.
183
+ const ORBIT = [
184
+ ' ╭───────╮ ● ',
185
+ ' ╭─╯ ╰─╮ ',
186
+ '│ ╲ ╱ │',
187
+ '│ ╳ │',
188
+ '│ ╱ ╲ │',
189
+ ' ╰─╮ ╭─╯ ',
190
+ ' ╰───────╯ ',
191
+ ];
192
+ function orbitMark() {
193
+ return ORBIT.map((line) => {
194
+ let out = '';
195
+ for (const ch of line) {
196
+ if (ch === ' ') out += ' ';
197
+ else if (ch === '╳' || ch === '╲' || ch === '╱' || ch === '●') out += fg(PALETTE.mars, ch);
198
+ else out += fg(PALETTE.graphite, ch);
199
+ }
200
+ return out;
201
+ });
202
+ }
203
+
204
+ /** Truncate raw (uncolored) text to a visible width with an ellipsis. */
205
+ function clip(s, width) {
206
+ if (s.length <= width) return s;
207
+ return s.slice(0, Math.max(0, width - 1)) + '…';
208
+ }
209
+
210
+ /**
211
+ * Hermes-style hero banner: a big 3D MADARX wordmark, a titled rule, then a
212
+ * two-column body — orbit mark + runtime meta on the left, a grouped capability
213
+ * catalog (tools by category, then skills) on the right.
214
+ *
215
+ * Dependency-free and DB-free: all inputs are passed in by the caller (the CLI
216
+ * supervisor), so importing this never opens the database.
217
+ *
218
+ * @param {object} info
219
+ * @param {string} info.version
220
+ * @param {string} [info.home] data home path
221
+ * @param {string} [info.url] dashboard URL
222
+ * @param {string} [info.engine] default sub-agent engine
223
+ * @param {string} [info.commit] short git hash (optional)
224
+ * @param {string} [info.session] session id (optional)
225
+ * @param {Array<{category:string,count:number,names:string[]}>} [info.toolCats]
226
+ * @param {number} [info.toolCount]
227
+ * @param {Array<{category:string,count:number,names:string[]}>} [info.skillGroups]
228
+ * @param {number} [info.skillCount]
229
+ * @param {boolean}[info.behind]
230
+ * @param {string} [info.latest]
231
+ * @returns {string}
232
+ */
233
+ export function renderHeroBanner(info = {}) {
234
+ const {
235
+ version = '0.0.0', home, url,
236
+ commit, session, toolCats = [], toolCount, skillGroups = [], skillCount,
237
+ behind = false, latest,
238
+ } = info;
239
+
240
+ const cols = (process.stdout && process.stdout.columns) || 84;
241
+ const out = [''];
242
+
243
+ // 1) 3D wordmark.
244
+ for (const l of heroWordmark()) out.push(' ' + l);
245
+ out.push('');
246
+
247
+ // 2) Titled rule: ── madarX OS v… · date · commit ─────────
248
+ const stamp = new Date().toISOString().slice(0, 10).replace(/-/g, '.');
249
+ const title = `${bold(fg(PALETTE.platinum, 'madar'))}${bold(fg(PALETTE.mars, 'X'))}${bold(fg(PALETTE.platinum, ' OS'))}`
250
+ + ` ${fg(PALETTE.mars, 'v' + version)}`
251
+ + fg(PALETTE.muted, ` · ${stamp}${commit ? ' · ' + commit : ''}`);
252
+ const titleVis = visibleLength(title);
253
+ const railLen = Math.max(3, cols - 4 - titleVis - 3);
254
+ out.push(' ' + fg(PALETTE.graphite, '── ') + title + ' ' + fg(PALETTE.graphite, '─'.repeat(railLen)));
255
+ out.push('');
256
+
257
+ // 3) Two columns. Left: orbit mark + meta. Right: catalog.
258
+ const left = orbitMark();
259
+ const leftMeta = [
260
+ '',
261
+ home ? ' ' + fg(PALETTE.muted, home.replace(process.env.HOME || '~', '~')) : '',
262
+ url ? ' ' + fg(PALETTE.muted, url) : '',
263
+ session ? ' ' + fg(PALETTE.muted, 'session ' + session) : '',
264
+ ].filter(Boolean);
265
+ const leftAll = [...left, ...leftMeta];
266
+ // Left column width = its widest line (orbit block or the longer meta lines
267
+ // like the dashboard URL / session id), so the right column never collides
268
+ // with the address/session under the logo.
269
+ const LW = Math.max(...leftAll.map(visibleLength));
270
+ const GAP = 6; // breathing room between the two columns
271
+
272
+ const right = [];
273
+ const rw = Math.max(28, cols - LW - GAP - 2);
274
+ // One "label: a, b, c…" row, clipped to the right column.
275
+ const groupLine = (label, names) => {
276
+ const body = clip(names.join(', '), rw - label.length - 2);
277
+ return `${fg(PALETTE.bone, label + ':')} ${fg(PALETTE.muted, body)}`;
278
+ };
279
+
280
+ right.push(fg(PALETTE.mars, bold('Available Tools')) + fg(PALETTE.muted, toolCount ? ` ${toolCount}` : ''));
281
+ // Feature the toolsets a business agent actually reaches for, in priority
282
+ // order — not raw count. Domain/installable packs (mines, travel,
283
+ // cli_generator, vercel, …) stay in the registry but fold into "more toolsets".
284
+ const FEATURED_TOOL_CATEGORIES = [
285
+ 'web', 'email', 'calendar', 'local_machine', 'browser',
286
+ 'supabase', 'workflow', 'authoring', 'github', 'voice',
287
+ ];
288
+ // Friendly display labels for the slugs that read like internals.
289
+ const TOOL_LABELS = {
290
+ local_machine: 'files', web: 'web', email: 'email', calendar: 'calendar',
291
+ browser: 'browser', supabase: 'data', workflow: 'automations',
292
+ authoring: 'build-tools', github: 'github', voice: 'voice',
293
+ };
294
+ const byName = new Map(toolCats.map((c) => [c.category, c]));
295
+ const featured = FEATURED_TOOL_CATEGORIES.map((n) => byName.get(n)).filter(Boolean);
296
+ const shownCats = featured.slice(0, 8);
297
+ for (const c of shownCats) right.push(groupLine(TOOL_LABELS[c.category] || c.category, c.names));
298
+ const moreCats = toolCats.length - shownCats.length;
299
+ if (moreCats > 0) right.push(fg(PALETTE.muted, `(and ${moreCats} more toolsets…)`));
300
+
301
+ right.push('');
302
+ right.push(fg(PALETTE.mars, bold('Available Skills')) + fg(PALETTE.muted, skillCount ? ` ${skillCount}` : ''));
303
+ // Business-default skills, grouped by category (research, comms, …).
304
+ for (const g of skillGroups) right.push(groupLine(g.category, g.names));
305
+
306
+ // Zip columns.
307
+ const rows = Math.max(leftAll.length, right.length);
308
+ for (let i = 0; i < rows; i++) {
309
+ const l = leftAll[i] ?? '';
310
+ const r = right[i] ?? '';
311
+ const pad = ' '.repeat(Math.max(0, LW - visibleLength(l)));
312
+ out.push(' ' + (l || '') + pad + ' '.repeat(GAP) + r);
313
+ }
314
+
315
+ // 4) Update status footer + dateline.
316
+ out.push('');
317
+ if (behind && latest) {
318
+ out.push(' ' + fg(PALETTE.mars, '▲') + ' ' + fg(PALETTE.bone, `v${latest} available`) + fg(PALETTE.muted, ' — run ') + fg(PALETTE.mars, 'madarx update'));
319
+ } else {
320
+ out.push(' ' + fg(PALETTE.muted, '● up to date'));
321
+ }
322
+ out.push(' ' + fg(PALETTE.muted, `${stamp} · Designed in UAE · v${version}`));
323
+ out.push('');
324
+ return out.join('\n');
325
+ }
326
+
148
327
  export const _palette = PALETTE;