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
@@ -116,6 +116,46 @@ function validateAgentRun(stage, errors, prefix, opts, stageSlugs) {
116
116
  }
117
117
  }
118
118
 
119
+ // Predicate operator sets (mirror lib/process/policy-predicates.js).
120
+ const PREDICATE_LOGICAL_OPS = new Set(['and', 'or']);
121
+ const PREDICATE_COMPARE_OPS = new Set(['eq', 'neq', 'lt', 'lte', 'gt', 'gte', 'in', 'nin']);
122
+ const PREDICATE_MAX_DEPTH = 20;
123
+
124
+ // Validate a JSON predicate tree structurally. Mirrors the evaluator so an
125
+ // invalid predicate is rejected at authoring time, not at case run time.
126
+ function validatePredicate(pred, errors, prefix, depth = 0) {
127
+ if (depth > PREDICATE_MAX_DEPTH) {
128
+ pushErr(errors, prefix, 'predicate nesting too deep');
129
+ return;
130
+ }
131
+ if (!isPlainObject(pred)) {
132
+ pushErr(errors, prefix, 'predicate must be an object');
133
+ return;
134
+ }
135
+ const op = pred.op;
136
+ if (PREDICATE_LOGICAL_OPS.has(op)) {
137
+ if (!Array.isArray(pred.rules) || pred.rules.length === 0) {
138
+ pushErr(errors, `${prefix}.rules`, `"${op}" requires a non-empty rules[] array`);
139
+ } else {
140
+ pred.rules.forEach((r, i) => validatePredicate(r, errors, `${prefix}.rules[${i}]`, depth + 1));
141
+ }
142
+ } else if (op === 'not') {
143
+ if (!isPlainObject(pred.rule)) pushErr(errors, `${prefix}.rule`, '"not" requires a rule object');
144
+ else validatePredicate(pred.rule, errors, `${prefix}.rule`, depth + 1);
145
+ } else if (PREDICATE_COMPARE_OPS.has(op)) {
146
+ if (typeof pred.path !== 'string' || !pred.path.trim()) {
147
+ pushErr(errors, `${prefix}.path`, 'required (non-empty string)');
148
+ }
149
+ if (!('value' in pred)) {
150
+ pushErr(errors, `${prefix}.value`, 'required');
151
+ } else if ((op === 'in' || op === 'nin') && !Array.isArray(pred.value)) {
152
+ pushErr(errors, `${prefix}.value`, `"${op}" requires an array value`);
153
+ }
154
+ } else {
155
+ pushErr(errors, `${prefix}.op`, `unknown predicate op "${op}"`);
156
+ }
157
+ }
158
+
119
159
  function validatePolicyGate(stage, errors, prefix) {
120
160
  const config = stage.config || {};
121
161
  if (!Array.isArray(config.rules) || config.rules.length === 0) {
@@ -125,13 +165,18 @@ function validatePolicyGate(stage, errors, prefix) {
125
165
  config.rules.forEach((rule, i) => {
126
166
  const rpath = `${prefix}.config.rules[${i}]`;
127
167
  if (typeof rule === 'string') {
168
+ // Legacy string DSL (deprecated; accepted one release for migration).
128
169
  if (!rule.trim()) pushErr(errors, rpath, 'empty rule expression');
170
+ } else if (isPlainObject(rule) && typeof rule.op === 'string') {
171
+ // JSON predicate (canonical form).
172
+ validatePredicate(rule, errors, rpath);
129
173
  } else if (isPlainObject(rule)) {
174
+ // Legacy { expr, label } wrapper.
130
175
  if (!rule.expr || typeof rule.expr !== 'string' || !rule.expr.trim()) {
131
176
  pushErr(errors, `${rpath}.expr`, 'required (non-empty string)');
132
177
  }
133
178
  } else {
134
- pushErr(errors, rpath, 'rule must be a string or { expr, label } object');
179
+ pushErr(errors, rpath, 'rule must be a JSON predicate, a string, or { expr, label }');
135
180
  }
136
181
  });
137
182
  }
@@ -0,0 +1,178 @@
1
+ // lib/process/stages/policy-dsl-legacy.js — DEPRECATED string-expression DSL.
2
+ //
3
+ // The hand-rolled tokenizer/parser kept for ONE release as a back-compat path
4
+ // while string rules migrate to JSON predicates (`../policy-predicates.js`).
5
+ // New workflows must author predicate JSON; the spec-validator accepts both
6
+ // forms for now and the policy_gate handler routes per-rule. Do not extend
7
+ // this grammar — it is on a removal track.
8
+ //
9
+ // Rule grammar:
10
+ // - intake.<field>
11
+ // - prior_stage('<slug>').<field>
12
+ // - Comparison: ==, !=, <, <=, >, >=
13
+ // - Logical: && ||, parens
14
+ // - String literals: 'foo'
15
+ // - Number literals: 1, 0.5
16
+ // - Membership: <left> IN [<lit>, <lit>, ...]
17
+
18
+ function readPath(obj, path) {
19
+ if (!obj || !path) return undefined;
20
+ return path.split('.').reduce((acc, key) => (acc == null ? acc : acc[key]), obj);
21
+ }
22
+
23
+ function tokenize(expr) {
24
+ const tokens = [];
25
+ let i = 0;
26
+ while (i < expr.length) {
27
+ const ch = expr[i];
28
+ if (/\s/.test(ch)) { i++; continue; }
29
+ if (ch === '(' || ch === ')' || ch === '[' || ch === ']' || ch === ',') {
30
+ tokens.push({ type: ch }); i++; continue;
31
+ }
32
+ if (ch === '&' && expr[i + 1] === '&') { tokens.push({ type: '&&' }); i += 2; continue; }
33
+ if (ch === '|' && expr[i + 1] === '|') { tokens.push({ type: '||' }); i += 2; continue; }
34
+ if (ch === '=' && expr[i + 1] === '=') { tokens.push({ type: 'op', value: '==' }); i += 2; continue; }
35
+ if (ch === '!' && expr[i + 1] === '=') { tokens.push({ type: 'op', value: '!=' }); i += 2; continue; }
36
+ if (ch === '<' && expr[i + 1] === '=') { tokens.push({ type: 'op', value: '<=' }); i += 2; continue; }
37
+ if (ch === '>' && expr[i + 1] === '=') { tokens.push({ type: 'op', value: '>=' }); i += 2; continue; }
38
+ if (ch === '<' || ch === '>') { tokens.push({ type: 'op', value: ch }); i++; continue; }
39
+ if (ch === "'" || ch === '"') {
40
+ const end = expr.indexOf(ch, i + 1);
41
+ if (end === -1) throw new Error(`policy-gate: unterminated string at ${i}`);
42
+ tokens.push({ type: 'string', value: expr.slice(i + 1, end) });
43
+ i = end + 1; continue;
44
+ }
45
+ if (/[0-9.]/.test(ch)) {
46
+ let j = i;
47
+ while (j < expr.length && /[0-9.]/.test(expr[j])) j++;
48
+ tokens.push({ type: 'number', value: Number(expr.slice(i, j)) });
49
+ i = j; continue;
50
+ }
51
+ if (/[A-Za-z_]/.test(ch)) {
52
+ let j = i;
53
+ while (j < expr.length && /[A-Za-z0-9_.]/.test(expr[j])) j++;
54
+ const word = expr.slice(i, j);
55
+ if (word === 'IN' || word === 'in') { tokens.push({ type: 'IN' }); }
56
+ else if (word === 'true') { tokens.push({ type: 'boolean', value: true }); }
57
+ else if (word === 'false') { tokens.push({ type: 'boolean', value: false }); }
58
+ else if (word === 'prior_stage' && expr[j] === '(') {
59
+ // Parse prior_stage('slug').field
60
+ const closeQuote = expr.indexOf(')', j);
61
+ const inner = expr.slice(j + 1, closeQuote).trim().replace(/^['"]|['"]$/g, '');
62
+ let k = closeQuote + 1;
63
+ // Expect .field
64
+ if (expr[k] !== '.') throw new Error("policy-gate: expected '.' after prior_stage(...)");
65
+ let m = k + 1;
66
+ while (m < expr.length && /[A-Za-z0-9_.]/.test(expr[m])) m++;
67
+ tokens.push({ type: 'ref', kind: 'prior_stage', stage: inner, path: expr.slice(k + 1, m) });
68
+ i = m; continue;
69
+ } else {
70
+ tokens.push({ type: 'ref', kind: 'path', path: word });
71
+ }
72
+ i = j; continue;
73
+ }
74
+ throw new Error(`policy-gate: unexpected character "${ch}" at ${i}`);
75
+ }
76
+ return tokens;
77
+ }
78
+
79
+ function resolveRef(token, ctx) {
80
+ if (token.kind === 'prior_stage') {
81
+ return readPath(ctx.context?.[token.stage], token.path);
82
+ }
83
+ // path like intake.email or stage_output.foo.bar
84
+ if (token.path.startsWith('intake.')) {
85
+ return readPath(ctx.intake, token.path.slice('intake.'.length));
86
+ }
87
+ if (token.path.startsWith('context.')) {
88
+ return readPath(ctx.context, token.path.slice('context.'.length));
89
+ }
90
+ return readPath(ctx, token.path);
91
+ }
92
+
93
+ function evalTokens(tokens, ctx) {
94
+ // Pratt-ish recursive descent. Grammar:
95
+ // expr := or
96
+ // or := and ('||' and)*
97
+ // and := cmp ('&&' cmp)*
98
+ // cmp := value (op value)?
99
+ // | value IN '[' values ']'
100
+ // value := ref | number | string | boolean | '(' or ')'
101
+ let pos = 0;
102
+ function peek() { return tokens[pos]; }
103
+ function consume(type) {
104
+ const t = tokens[pos];
105
+ if (!t || t.type !== type) throw new Error(`policy-gate: expected ${type}, got ${t?.type || 'EOF'}`);
106
+ pos++;
107
+ return t;
108
+ }
109
+ function value() {
110
+ const t = peek();
111
+ if (!t) throw new Error('policy-gate: unexpected end of expression');
112
+ if (t.type === '(') { pos++; const e = or(); consume(')'); return e; }
113
+ if (t.type === 'number' || t.type === 'string' || t.type === 'boolean') {
114
+ pos++;
115
+ return t.value;
116
+ }
117
+ if (t.type === 'ref') {
118
+ pos++;
119
+ return resolveRef(t, ctx);
120
+ }
121
+ throw new Error(`policy-gate: unexpected token ${t.type}`);
122
+ }
123
+ function cmp() {
124
+ const left = value();
125
+ const t = peek();
126
+ if (!t) return Boolean(left);
127
+ if (t.type === 'op') {
128
+ pos++;
129
+ const right = value();
130
+ switch (t.value) {
131
+ case '==': return left == right; // eslint-disable-line eqeqeq
132
+ case '!=': return left != right; // eslint-disable-line eqeqeq
133
+ case '<': return Number(left) < Number(right);
134
+ case '<=': return Number(left) <= Number(right);
135
+ case '>': return Number(left) > Number(right);
136
+ case '>=': return Number(left) >= Number(right);
137
+ }
138
+ }
139
+ if (t.type === 'IN') {
140
+ pos++;
141
+ consume('[');
142
+ const list = [];
143
+ while (peek() && peek().type !== ']') {
144
+ const v = value();
145
+ list.push(v);
146
+ if (peek() && peek().type === ',') pos++;
147
+ }
148
+ consume(']');
149
+ return list.includes(left);
150
+ }
151
+ return Boolean(left);
152
+ }
153
+ function and() {
154
+ let left = cmp();
155
+ while (peek() && peek().type === '&&') { pos++; const right = cmp(); left = Boolean(left) && Boolean(right); }
156
+ return left;
157
+ }
158
+ function or() {
159
+ let left = and();
160
+ while (peek() && peek().type === '||') { pos++; const right = and(); left = Boolean(left) || Boolean(right); }
161
+ return left;
162
+ }
163
+ const result = or();
164
+ if (pos !== tokens.length) throw new Error(`policy-gate: unexpected trailing token at ${pos}`);
165
+ return result;
166
+ }
167
+
168
+ // DEPRECATED — evaluate a legacy string-DSL rule. Returns { result, error }.
169
+ export function evaluateRule(rule, { intake, context }) {
170
+ if (!rule || typeof rule !== 'string') return { result: true, error: null };
171
+ try {
172
+ const tokens = tokenize(rule);
173
+ const result = Boolean(evalTokens(tokens, { intake, context }));
174
+ return { result, error: null };
175
+ } catch (err) {
176
+ return { result: false, error: err?.message || String(err) };
177
+ }
178
+ }
@@ -1,14 +1,13 @@
1
1
  // lib/process/stages/policy-gate.js — handler for policy_gate stages.
2
2
  //
3
3
  // Evaluates declarative rules against the case's intake + accumulated context.
4
- // Rule grammar is a small expression dialect supporting:
5
- // - intake.<field>
6
- // - prior_stage('<slug>').<field>
7
- // - Comparison: ==, !=, <, <=, >, >=
8
- // - Logical: && ||, parens
9
- // - String literals: 'foo'
10
- // - Number literals: 1, 0.5
11
- // - Membership: <left> IN [<lit>, <lit>, ...]
4
+ // Each entry in `config.rules` is one of:
5
+ // - a JSON predicate → `../policy-predicates.js` (the canonical form)
6
+ // - a string expression → legacy DSL (`./policy-dsl-legacy.js`, deprecated,
7
+ // kept one release for back-compat; routed per-rule)
8
+ // - { expr, label } → legacy DSL wrapper
9
+ //
10
+ // All rules must pass (implicit AND across the array) for the gate to pass.
12
11
  //
13
12
  // Outcomes:
14
13
  // - rules all pass → kind=pass
@@ -17,166 +16,25 @@
17
16
  // downstream human_approval handles this)
18
17
 
19
18
  import { createApprovalRequest } from '../../approvals.js';
19
+ import { evaluatePredicateSafe, isPredicateRule, describePredicate } from '../policy-predicates.js';
20
+ import { evaluateRule } from './policy-dsl-legacy.js';
20
21
 
21
- function readPath(obj, path) {
22
- if (!obj || !path) return undefined;
23
- return path.split('.').reduce((acc, key) => (acc == null ? acc : acc[key]), obj);
24
- }
25
-
26
- function tokenize(expr) {
27
- const tokens = [];
28
- let i = 0;
29
- while (i < expr.length) {
30
- const ch = expr[i];
31
- if (/\s/.test(ch)) { i++; continue; }
32
- if (ch === '(' || ch === ')' || ch === '[' || ch === ']' || ch === ',') {
33
- tokens.push({ type: ch }); i++; continue;
34
- }
35
- if (ch === '&' && expr[i + 1] === '&') { tokens.push({ type: '&&' }); i += 2; continue; }
36
- if (ch === '|' && expr[i + 1] === '|') { tokens.push({ type: '||' }); i += 2; continue; }
37
- if (ch === '=' && expr[i + 1] === '=') { tokens.push({ type: 'op', value: '==' }); i += 2; continue; }
38
- if (ch === '!' && expr[i + 1] === '=') { tokens.push({ type: 'op', value: '!=' }); i += 2; continue; }
39
- if (ch === '<' && expr[i + 1] === '=') { tokens.push({ type: 'op', value: '<=' }); i += 2; continue; }
40
- if (ch === '>' && expr[i + 1] === '=') { tokens.push({ type: 'op', value: '>=' }); i += 2; continue; }
41
- if (ch === '<' || ch === '>') { tokens.push({ type: 'op', value: ch }); i++; continue; }
42
- if (ch === "'" || ch === '"') {
43
- const end = expr.indexOf(ch, i + 1);
44
- if (end === -1) throw new Error(`policy-gate: unterminated string at ${i}`);
45
- tokens.push({ type: 'string', value: expr.slice(i + 1, end) });
46
- i = end + 1; continue;
47
- }
48
- if (/[0-9.]/.test(ch)) {
49
- let j = i;
50
- while (j < expr.length && /[0-9.]/.test(expr[j])) j++;
51
- tokens.push({ type: 'number', value: Number(expr.slice(i, j)) });
52
- i = j; continue;
53
- }
54
- if (/[A-Za-z_]/.test(ch)) {
55
- let j = i;
56
- while (j < expr.length && /[A-Za-z0-9_.]/.test(expr[j])) j++;
57
- const word = expr.slice(i, j);
58
- if (word === 'IN' || word === 'in') { tokens.push({ type: 'IN' }); }
59
- else if (word === 'true') { tokens.push({ type: 'boolean', value: true }); }
60
- else if (word === 'false') { tokens.push({ type: 'boolean', value: false }); }
61
- else if (word === 'prior_stage' && expr[j] === '(') {
62
- // Parse prior_stage('slug').field
63
- const closeQuote = expr.indexOf(')', j);
64
- const inner = expr.slice(j + 1, closeQuote).trim().replace(/^['"]|['"]$/g, '');
65
- let k = closeQuote + 1;
66
- // Expect .field
67
- if (expr[k] !== '.') throw new Error("policy-gate: expected '.' after prior_stage(...)");
68
- let m = k + 1;
69
- while (m < expr.length && /[A-Za-z0-9_.]/.test(expr[m])) m++;
70
- tokens.push({ type: 'ref', kind: 'prior_stage', stage: inner, path: expr.slice(k + 1, m) });
71
- i = m; continue;
72
- } else {
73
- tokens.push({ type: 'ref', kind: 'path', path: word });
74
- }
75
- i = j; continue;
76
- }
77
- throw new Error(`policy-gate: unexpected character "${ch}" at ${i}`);
78
- }
79
- return tokens;
80
- }
81
-
82
- function resolveRef(token, ctx) {
83
- if (token.kind === 'prior_stage') {
84
- return readPath(ctx.context?.[token.stage], token.path);
85
- }
86
- // path like intake.email or stage_output.foo.bar
87
- if (token.path.startsWith('intake.')) {
88
- return readPath(ctx.intake, token.path.slice('intake.'.length));
89
- }
90
- if (token.path.startsWith('context.')) {
91
- return readPath(ctx.context, token.path.slice('context.'.length));
92
- }
93
- return readPath(ctx, token.path);
94
- }
95
-
96
- function evalTokens(tokens, ctx) {
97
- // Pratt-ish recursive descent. Grammar:
98
- // expr := or
99
- // or := and ('||' and)*
100
- // and := cmp ('&&' cmp)*
101
- // cmp := value (op value)?
102
- // | value IN '[' values ']'
103
- // value := ref | number | string | boolean | '(' or ')'
104
- let pos = 0;
105
- function peek() { return tokens[pos]; }
106
- function consume(type) {
107
- const t = tokens[pos];
108
- if (!t || t.type !== type) throw new Error(`policy-gate: expected ${type}, got ${t?.type || 'EOF'}`);
109
- pos++;
110
- return t;
111
- }
112
- function value() {
113
- const t = peek();
114
- if (!t) throw new Error('policy-gate: unexpected end of expression');
115
- if (t.type === '(') { pos++; const e = or(); consume(')'); return e; }
116
- if (t.type === 'number' || t.type === 'string' || t.type === 'boolean') {
117
- pos++;
118
- return t.value;
119
- }
120
- if (t.type === 'ref') {
121
- pos++;
122
- return resolveRef(t, ctx);
123
- }
124
- throw new Error(`policy-gate: unexpected token ${t.type}`);
125
- }
126
- function cmp() {
127
- const left = value();
128
- const t = peek();
129
- if (!t) return Boolean(left);
130
- if (t.type === 'op') {
131
- pos++;
132
- const right = value();
133
- switch (t.value) {
134
- case '==': return left == right; // eslint-disable-line eqeqeq
135
- case '!=': return left != right; // eslint-disable-line eqeqeq
136
- case '<': return Number(left) < Number(right);
137
- case '<=': return Number(left) <= Number(right);
138
- case '>': return Number(left) > Number(right);
139
- case '>=': return Number(left) >= Number(right);
140
- }
141
- }
142
- if (t.type === 'IN') {
143
- pos++;
144
- consume('[');
145
- const list = [];
146
- while (peek() && peek().type !== ']') {
147
- const v = value();
148
- list.push(v);
149
- if (peek() && peek().type === ',') pos++;
150
- }
151
- consume(']');
152
- return list.includes(left);
153
- }
154
- return Boolean(left);
155
- }
156
- function and() {
157
- let left = cmp();
158
- while (peek() && peek().type === '&&') { pos++; const right = cmp(); left = Boolean(left) && Boolean(right); }
159
- return left;
160
- }
161
- function or() {
162
- let left = and();
163
- while (peek() && peek().type === '||') { pos++; const right = and(); left = Boolean(left) || Boolean(right); }
164
- return left;
165
- }
166
- const result = or();
167
- if (pos !== tokens.length) throw new Error(`policy-gate: unexpected trailing token at ${pos}`);
168
- return result;
169
- }
22
+ // Re-exported for back-compat: tests and any callers still importing the
23
+ // legacy string-DSL evaluator from this module keep working during the
24
+ // deprecation window.
25
+ export { evaluateRule };
170
26
 
171
- export function evaluateRule(rule, { intake, context }) {
172
- if (!rule || typeof rule !== 'string') return { result: true, error: null };
173
- try {
174
- const tokens = tokenize(rule);
175
- const result = Boolean(evalTokens(tokens, { intake, context }));
176
- return { result, error: null };
177
- } catch (err) {
178
- return { result: false, error: err?.message || String(err) };
27
+ // Evaluate one rule entry predicate JSON or legacy string — returning a
28
+ // uniform { result, error, label } record for the trace.
29
+ function evaluateRuleEntry(rule, ctx) {
30
+ if (isPredicateRule(rule)) {
31
+ const { result, error } = evaluatePredicateSafe(rule, ctx);
32
+ return { result, error, label: rule.label || describePredicate(rule) };
179
33
  }
34
+ const expr = typeof rule === 'string' ? rule : rule?.expr;
35
+ const label = typeof rule === 'string' ? rule : (rule?.label || rule?.expr);
36
+ const { result, error } = evaluateRule(expr, ctx);
37
+ return { result, error, label };
180
38
  }
181
39
 
182
40
  export async function executeStage({ case: c, stage }) {
@@ -187,9 +45,7 @@ export async function executeStage({ case: c, stage }) {
187
45
  const trace = [];
188
46
  let allPass = true;
189
47
  for (const rule of rules) {
190
- const expr = typeof rule === 'string' ? rule : rule?.expr;
191
- const label = typeof rule === 'string' ? rule : (rule?.label || rule?.expr);
192
- const { result, error } = evaluateRule(expr, { intake, context });
48
+ const { result, error, label } = evaluateRuleEntry(rule, { intake, context });
193
49
  trace.push({ rule: label, result, error });
194
50
  if (!result) allPass = false;
195
51
  }
package/lib/runtime.js CHANGED
@@ -13,6 +13,7 @@ import { defaultModelForEngine, normalizeAgentEngine } from './agent-engines.js'
13
13
  import { DEFAULT_PROJECT_ID, appendProjectChangelog, getProject } from './projects.js';
14
14
  import { listActivity, listTasks, reportingSnapshot } from './delegation.js';
15
15
  import { getMainAgentTrustMode } from './tools/registry.js';
16
+ import { defaultSkillsMarkdown } from './marketplace-seeds.js';
16
17
  import { publishLiveEvent, publishStateChanged } from './live-events.js';
17
18
  import { resolveTargetSpace } from './dashboard-spaces.js';
18
19
 
@@ -777,9 +778,17 @@ function writeAgentFiles(agent) {
777
778
  fs.writeFileSync(path.join(dir, 'AGENTS.md'),
778
779
  `# ${agent.name}\n\nParent orchestrator: madarX Main Agent.\n\n## Mission\n${agent.mission}\n\n## Runtime\n- Engine: ${agent.engine}\n- Model: ${agent.model || 'default'}\n- Schedule: ${agent.schedule}\n- Approval: human-in-loop before external sends/posts/deployments.\n\n## Operating rules\n1. Work only inside the approved local project/workspace unless the orchestrator grants a path.\n2. Use web/social/email tools in read or draft mode first.\n3. Save artifacts under your project's artifacts folder (workspace/projects/<slug>/artifacts/).\n4. Never send emails, WhatsApp messages, social posts, deployments, purchases, or destructive commands without explicit approval.\n5. Update heartbeat.json after each run.\n`);
779
780
 
780
- const skillsMarkdown = typeof agent.skills_markdown === 'string' && agent.skills_markdown.trim()
781
- ? agent.skills_markdown.trim() + '\n'
782
- : `# ${agent.name} Skills\n\n## Mission\n${agent.mission}\n\n## Core playbooks\n- Plan each run from the mission, then execute against the ${agent.schedule} window.\n- Use only the approved tools (${(agent.tools || []).join(', ') || 'web-search, browser, files'}); never reach for tools the owner has not enabled.\n- Save every output as a local artifact under your project's artifacts folder (workspace/projects/<slug>/artifacts/).\n- Hand off any external send, post, deployment, or destructive command to the main agent for approval.\n- After each run, update heartbeat.json with status, summary, and next-run plan.\n`;
781
+ let skillsMarkdown;
782
+ if (typeof agent.skills_markdown === 'string' && agent.skills_markdown.trim()) {
783
+ skillsMarkdown = agent.skills_markdown.trim() + '\n';
784
+ } else {
785
+ // Default skills.md: mission + core playbooks + the business-default skill
786
+ // pack so a fresh agent can do real work out of the box (the runtime reads
787
+ // this file into the prompt; the default skills are gated by the same tools).
788
+ let defaultSkills = '';
789
+ try { defaultSkills = '\n' + defaultSkillsMarkdown(); } catch { /* optional */ }
790
+ skillsMarkdown = `# ${agent.name} Skills\n\n## Mission\n${agent.mission}\n\n## Core playbooks\n- Plan each run from the mission, then execute against the ${agent.schedule} window.\n- Use only the approved tools (${(agent.tools || []).join(', ') || 'web-search, browser, files'}); never reach for tools the owner has not enabled.\n- Save every output as a local artifact under your project's artifacts folder (workspace/projects/<slug>/artifacts/).\n- Hand off any external send, post, deployment, or destructive command to the main agent for approval.\n- After each run, update heartbeat.json with status, summary, and next-run plan.\n${defaultSkills}`;
791
+ }
783
792
  fs.writeFileSync(path.join(dir, 'skills.md'), skillsMarkdown);
784
793
 
785
794
  fs.writeFileSync(path.join(dir, 'tools.md'),
@@ -806,6 +815,46 @@ function writeAgentFiles(agent) {
806
815
  return files;
807
816
  }
808
817
 
818
+ /**
819
+ * One-time migration: refresh the business-default skills block in existing
820
+ * agents' skills.md. Only touches files that are the GENERATED DEFAULT (they
821
+ * carry the `## Core playbooks` header) — a user-customized skills.md is left
822
+ * untouched. Idempotent: re-running replaces an existing `## Default skills`
823
+ * section in place rather than appending, and is a no-op once current.
824
+ *
825
+ * @returns {{ scanned: number, updated: number }}
826
+ */
827
+ export function migrateDefaultAgentSkills() {
828
+ let scanned = 0;
829
+ let updated = 0;
830
+ let block;
831
+ try { block = defaultSkillsMarkdown().trimEnd() + '\n'; } catch { return { scanned, updated }; }
832
+ let dirs = [];
833
+ try { dirs = fs.readdirSync(AGENTS_DIR, { withFileTypes: true }).filter(d => d.isDirectory()); } catch { return { scanned, updated }; }
834
+
835
+ for (const d of dirs) {
836
+ const p = path.join(AGENTS_DIR, d.name, 'skills.md');
837
+ let body;
838
+ try { body = fs.readFileSync(p, 'utf8'); } catch { continue; }
839
+ scanned++;
840
+ // Only refresh the generated-default shape; never overwrite custom content.
841
+ if (!body.includes('## Core playbooks')) continue;
842
+
843
+ let next;
844
+ const marker = '\n## Default skills';
845
+ const idx = body.indexOf(marker);
846
+ if (idx >= 0) {
847
+ next = body.slice(0, idx).trimEnd() + '\n\n' + block; // replace old section
848
+ } else {
849
+ next = body.trimEnd() + '\n\n' + block; // append, was missing
850
+ }
851
+ if (next !== body) {
852
+ try { fs.writeFileSync(p, next); updated++; } catch { /* best-effort */ }
853
+ }
854
+ }
855
+ return { scanned, updated };
856
+ }
857
+
809
858
  export function createAgent(payload = {}) {
810
859
  const db = getDb();
811
860
  const name = payload.name || 'Client Workspace Custom Agent';
package/lib/seeds.js CHANGED
@@ -5,7 +5,7 @@ import { ROOT } from './paths.js';
5
5
  import { seedMarketplaceItems } from './marketplace-seeds.js';
6
6
  import { ensureDefaultProject } from './projects.js';
7
7
  import { seedAgentTemplates, installAgentTemplate } from './agent-templates.js';
8
- import { ensureOpsAgent, createArtifact } from './runtime.js';
8
+ import { ensureOpsAgent, createArtifact, migrateDefaultAgentSkills } from './runtime.js';
9
9
  import { renderChangelogHtml } from './artifact-format.js';
10
10
  import { migrateArtifactsToProjects } from './artifact-migration.js';
11
11
  import { runAuthV1Migration } from '../scripts/migrate-auth-v1.mjs';
@@ -538,6 +538,10 @@ export function seedDefaults(db) {
538
538
  // Auto-seed the Tool Smith agent so request_capability delegation has a target.
539
539
  seedToolSmithAgentIfMissing(db);
540
540
 
541
+ // Refresh the business-default skills in existing default-shaped skills.md
542
+ // files (no-op for fresh installs and user-customized agents). Idempotent.
543
+ try { migrateDefaultAgentSkills(); } catch (err) { console.warn('[seeds] migrateDefaultAgentSkills failed:', err?.message || err); }
544
+
541
545
  // Dashboard spaces: seed the 'default' space and backfill any NULL-space
542
546
  // artifacts so the dashboard never has to reconcile orphans client-side.
543
547
  // Idempotent. Must run after schema migration adds artifacts.space_id.
@@ -1971,6 +1971,26 @@ export function listPrimitiveToolMeta() {
1971
1971
  return { names, riskByName };
1972
1972
  }
1973
1973
 
1974
+ /**
1975
+ * Static tool catalog grouped by category — pure read of MARKETPLACE_TOOLS, no
1976
+ * DB, no install state. Used by the CLI banner (which runs in the DB-free
1977
+ * supervisor) to render a grouped capability list à la Hermes.
1978
+ *
1979
+ * @returns {Array<{category: string, count: number, names: string[]}>}
1980
+ * sorted by descending count.
1981
+ */
1982
+ export function listToolCategories() {
1983
+ const byCat = new Map();
1984
+ for (const t of MARKETPLACE_TOOLS) {
1985
+ const cat = t.category || 'other';
1986
+ if (!byCat.has(cat)) byCat.set(cat, []);
1987
+ byCat.get(cat).push(t.name);
1988
+ }
1989
+ return [...byCat.entries()]
1990
+ .map(([category, names]) => ({ category, count: names.length, names }))
1991
+ .sort((a, b) => b.count - a.count || a.category.localeCompare(b.category));
1992
+ }
1993
+
1974
1994
  /**
1975
1995
  * Dynamic tool descriptors (composites + connector endpoints), normalized into
1976
1996
  * the SAME shape as a static row so every downstream consumer (executeRegistryTool
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "madarx",
3
- "version": "2.12.1",
3
+ "version": "2.14.0",
4
4
  "type": "module",
5
5
  "description": "Madarx OS — Next.js product with SQLite-backed runtime, scheduled cron daemon, and approval-gated local runners.",
6
6
  "license": "MIT",
@@ -44,6 +44,9 @@
44
44
  "prepublishOnly": "npm run build",
45
45
  "build": "NODE_OPTIONS=--no-warnings next build",
46
46
  "postbuild": "node --no-warnings scripts/postbuild-standalone.mjs",
47
+ "postinstall": "node --no-warnings scripts/postinstall-splash.mjs",
48
+ "splash": "MADARX_FORCE_SPLASH=1 FORCE_COLOR=1 node --no-warnings scripts/postinstall-splash.mjs",
49
+ "banner": "FORCE_COLOR=1 node --no-warnings scripts/preview-banner.mjs",
47
50
  "start": "next start -p 8787 -H 127.0.0.1",
48
51
  "test": "node --no-warnings --test tests/*.test.js",
49
52
  "daemon": "node --no-warnings --env-file-if-exists=.env.local scripts/cron-daemon.mjs",
@@ -38,4 +38,13 @@ if (!fs.existsSync(STANDALONE)) {
38
38
 
39
39
  copyInto(path.join('.next', 'static'), path.join('.next', 'static'));
40
40
  copyInto('public', 'public');
41
+
42
+ for (const envName of ['.env', '.env.local', '.env.development', '.env.production', '.env.test']) {
43
+ const envPath = path.join(STANDALONE, envName);
44
+ if (fs.existsSync(envPath)) {
45
+ fs.rmSync(envPath, { force: true });
46
+ console.log(`[postbuild] removed ${path.join('.next', 'standalone', envName)} from publish bundle`);
47
+ }
48
+ }
49
+
41
50
  console.log('[postbuild] standalone bundle is self-serving.');