madarx 2.13.0 → 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.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +552 -559
- package/.next/standalone/.next/app-path-routes-manifest.json +79 -80
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/routes-manifest.json +0 -6
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
- package/.next/standalone/.next/server/app/activity/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/page.js +3 -3
- package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/agents/[id]/page.js +4 -4
- package/.next/standalone/.next/server/app/agents/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/agents/page.js +1 -1
- package/.next/standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/activity/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/audit-export/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/share-links/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-memory/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-runs/[id]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-runs/[id]/events/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-runs/[id]/log/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-runs/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-runs/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[id]/chain/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[id]/memory/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[id]/reports/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[id]/run/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/create/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/ops/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/approvals/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/approvals/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/artifacts/[id]/acl/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/artifacts/[id]/protect/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/artifacts/[id]/raw/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/artifacts/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/artifacts/[id]/share-link/[linkId]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/artifacts/[id]/share-link/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/artifacts/upload/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/audit/list/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/audit/search/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/config/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/join-bootstrap/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/session/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/brand/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/chat/sessions/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/chat/sessions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/config/env/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/config/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/connections/[service]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/connections/[service]/verify/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/connections/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/cron/tick/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/dashboard/spaces/[id]/move/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/dashboard/spaces/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/dashboard/spaces/[id]/share-link/[linkId]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/dashboard/spaces/[id]/share-link/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/dashboard/spaces/import/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/dashboard/spaces/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/disk/files/[id]/blob/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/disk/files/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/disk/files/[id]/transcribe/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/disk/files/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/disk/folders/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/events/since/[cursor]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/events/stream/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/fs/create-folder/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/fs/pick-folder/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/blueprint/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/blueprint/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/diagnostic/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/diagnostic/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/governance/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/governance/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/interview/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/interview/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/pilot/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/pilot/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/quarterly/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/quarterly/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/setup-package/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/setup-package/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/interviews/[id]/responses/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/hail/interviews/[id]/responses/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/interviews/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/hail/interviews/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/setup-packages/[id]/apply/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/hail/setup-packages/[id]/apply/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/setup-packages/validate/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/heartbeat/tick/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/heartbeat/worker/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/heartbeat/worker/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/help/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hermes/jobs/[id]/events/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hermes/jobs/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hermes/jobs/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/integrations/google/callback/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/integrations/google/oauth/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/marketplace/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/marketplace/open-design/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/marketplace/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mines/import-roots/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mines/portfolio/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mines/projects/[id]/chunks/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mines/projects/[id]/diligence/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mines/projects/[id]/import/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mines/projects/[id]/publish/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mines/projects/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/missions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/models/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/onboarding/blueprint/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/onboarding/launch/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orchestrator/command/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orchestrator/stream/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orchestrator/upload/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/org/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/[id]/invites/[inviteId]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/[id]/invites/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/[id]/members/[userId]/role/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/[id]/members/[userId]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/[id]/members/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/invites/pending/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/join/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/join-complete/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/printing-press/clis/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/printing-press/install/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/printing-press/security-mode/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/privacy/config/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/privacy/verify/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/processes/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/[id]/share-link/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/processes/[id]/share-link/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/[id]/stages/[stageId]/override/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/processes/[id]/stages/[stageId]/override/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/[id]/stages/[stageId]/retry/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/processes/[id]/stages/[stageId]/retry/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/[id]/stages/[stageId]/submit/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/processes/[id]/stages/[stageId]/submit/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/definitions/[slug]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/definitions/[slug]/settings/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/definitions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/definitions/validate/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/processes/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/start-and-route/route.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/start-and-route/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/processes/start-and-route/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[slug]/library/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[slug]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/runs/approve-claude-run/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/runs/claude-code-dry-run/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/runs/competitor-report/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/runs/engine-ping/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/runs/marketing-plan/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/schedules/upsert/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/secrets/[name]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/secrets/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/settings/trust-mode/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/share/[token]/otp/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/share/[token]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/share/[token]/verify/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/share/space/[token]/otp/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/share/space/[token]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/share/space/[token]/verify/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/shared/spaces/[id]/acl/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/shared/spaces/publish/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/shared/spaces/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/shared/spaces/status/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/shared/spaces/unpublish/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/state/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/system/update/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/active-run/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/attachments/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/checklist/[itemId]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/checklist/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/checkout/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/children/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/comments/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/events/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/live-runs/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/release/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tool-allowlists/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tool-allowlists/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tool-egress/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tools/[name]/approve/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tools/[name]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tools/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/transcripts/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/voice/providers/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/voice/realtime/context/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/voice/realtime/session/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/voice/realtime/tool-result/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/voice/realtime/tools/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/voice/tts/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/whatsapp/allowlist/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/whatsapp/disconnect/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/whatsapp/messages/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/whatsapp/qr/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/whatsapp/send/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/whatsapp/status/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/approvals/page.js +2 -2
- package/.next/standalone/.next/server/app/approvals/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/architecture/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/architecture.html +2 -2
- package/.next/standalone/.next/server/app/architecture.rsc +1 -1
- package/.next/standalone/.next/server/app/audit/live/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/brand/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/brand.html +1 -1
- package/.next/standalone/.next/server/app/brand.rsc +1 -1
- package/.next/standalone/.next/server/app/disk/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/federated-ai/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/federated-ai.html +2 -2
- package/.next/standalone/.next/server/app/federated-ai.rsc +1 -1
- package/.next/standalone/.next/server/app/hail/[id]/governance/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/hail/[id]/governance/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/hail/[id]/interview/page.js +2 -2
- package/.next/standalone/.next/server/app/hail/[id]/interview/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/hail/[id]/interview/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/hail/[id]/page.js +2 -2
- package/.next/standalone/.next/server/app/hail/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/hail/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/hail/[id]/setup/page.js +2 -2
- package/.next/standalone/.next/server/app/hail/[id]/setup/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/hail/[id]/setup/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/hail/page.js +3 -3
- package/.next/standalone/.next/server/app/hail/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/hail/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/help/[slug]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +2 -2
- package/.next/standalone/.next/server/app/index.rsc +1 -1
- package/.next/standalone/.next/server/app/join/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/join.html +1 -1
- package/.next/standalone/.next/server/app/join.rsc +1 -1
- package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/marketplace/page.js +1 -1
- package/.next/standalone/.next/server/app/marketplace/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/mines/[projectId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/mines/[projectId]/results/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/mines/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/missions/page.js +1 -1
- package/.next/standalone/.next/server/app/missions/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/onboarding/org/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/onboarding.html +2 -2
- package/.next/standalone/.next/server/app/onboarding.rsc +1 -1
- package/.next/standalone/.next/server/app/org/page.js +1 -1
- package/.next/standalone/.next/server/app/org/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/org/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/[slug]/log/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/new/page.js +1 -1
- package/.next/standalone/.next/server/app/projects/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/new.html +1 -1
- package/.next/standalone/.next/server/app/projects/new.rsc +2 -2
- package/.next/standalone/.next/server/app/projects/page.js +11 -11
- package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/reports/[file]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/reports/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/runtime/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/schedules/page.js +2 -2
- package/.next/standalone/.next/server/app/schedules/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/schedules/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/account/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/advanced/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/appearance/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/brand/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/brand.html +2 -2
- package/.next/standalone/.next/server/app/settings/brand.rsc +1 -1
- package/.next/standalone/.next/server/app/settings/connectors/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/engines/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/onboarding/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/onboarding.html +2 -2
- package/.next/standalone/.next/server/app/settings/onboarding.rsc +1 -1
- package/.next/standalone/.next/server/app/settings/organization/page.js +1 -1
- package/.next/standalone/.next/server/app/settings/organization/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/organization/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/runtime/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/team/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/tools/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings.html +2 -2
- package/.next/standalone/.next/server/app/settings.rsc +1 -1
- package/.next/standalone/.next/server/app/share/[token]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/share/space/[token]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/tasks/[id]/page.js +1 -1
- package/.next/standalone/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/tasks/page.js +2 -2
- package/.next/standalone/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/team/[agentId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/team/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/whatsapp/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/whatsapp.html +1 -1
- package/.next/standalone/.next/server/app/whatsapp.rsc +1 -1
- package/.next/standalone/.next/server/app/workflows/[caseId]/page.js +1 -1
- package/.next/standalone/.next/server/app/workflows/[caseId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/workflows/[caseId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/workflows/new/[caseId]/page.js +1 -1
- package/.next/standalone/.next/server/app/workflows/new/[caseId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/workflows/new/[caseId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/workflows/new/definition/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/workflows/page.js +1 -1
- package/.next/standalone/.next/server/app/workflows/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/workflows/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/workflows/share/[caseId]/page.js +1 -1
- package/.next/standalone/.next/server/app/workflows/share/[caseId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/workflows/share/[caseId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +79 -80
- package/.next/standalone/.next/server/chunks/1699.js +1 -1
- package/.next/standalone/.next/server/chunks/5185.js +4 -27
- package/.next/standalone/.next/server/chunks/5257.js +1 -1
- package/.next/standalone/.next/server/chunks/6355.js +1 -0
- package/.next/standalone/.next/server/chunks/{1092.js → 6474.js} +1 -1
- package/.next/standalone/.next/server/functions-config-manifest.json +34 -34
- package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/.next/standalone/.next/server/middleware-manifest.json +5 -5
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/static/-LlttjOnKZXGqZXDKcj-4/_buildManifest.js +1 -0
- package/.next/standalone/.next/static/chunks/app/projects/page-09e5c527e3ba83e2.js +1 -0
- package/.next/standalone/.next/static/chunks/app/workflows/[caseId]/page-9949ff1c223e771d.js +1 -0
- package/.next/{static/chunks/app/workflows/page-25cb2c4cb90273a8.js → standalone/.next/static/chunks/app/workflows/page-d0484521369bce4c.js} +1 -1
- package/.next/standalone/.next/static/chunks/{webpack-0cfb048137bd7fce.js → webpack-86ee88827adb756d.js} +1 -1
- package/.next/standalone/CHANGELOG.md +16 -0
- package/.next/standalone/data/.artifacts-migrated-v1 +1 -1
- package/.next/standalone/data/.default-project-seeded +1 -1
- package/.next/standalone/data/madarx.sqlite +0 -0
- package/.next/standalone/data/madarx.sqlite-shm +0 -0
- package/.next/standalone/data/madarx.sqlite-wal +0 -0
- package/.next/standalone/lib/process/seeds/specs/mine-project-intake.json +12 -4
- package/.next/standalone/lib/process/seeds/specs/mine-valuation.json +6 -2
- package/.next/standalone/lib/process/stages/policy-dsl-legacy.js +178 -0
- package/.next/standalone/lib/process/stages/policy-gate.js +24 -168
- package/.next/standalone/package.json +1 -1
- package/.next/static/-LlttjOnKZXGqZXDKcj-4/_buildManifest.js +1 -0
- package/.next/static/chunks/app/projects/page-09e5c527e3ba83e2.js +1 -0
- package/.next/static/chunks/app/workflows/[caseId]/page-9949ff1c223e771d.js +1 -0
- package/.next/{standalone/.next/static/chunks/app/workflows/page-25cb2c4cb90273a8.js → static/chunks/app/workflows/page-d0484521369bce4c.js} +1 -1
- package/.next/static/chunks/{webpack-0cfb048137bd7fce.js → webpack-86ee88827adb756d.js} +1 -1
- package/CHANGELOG.md +16 -0
- package/ai-docs/process-engine.md +33 -1
- package/app/api/processes/start-and-route/route.js +5 -3
- package/app/workflows/[caseId]/case-detail-client.jsx +2 -2
- package/app/workflows/definition-card.jsx +12 -18
- package/app/workflows/new/[caseId]/page.js +8 -8
- package/app/workflows/page.js +0 -5
- package/app/workflows/share/[caseId]/page.js +0 -1
- package/lib/process/artifacts.js +12 -60
- package/lib/process/engine.js +5 -5
- package/lib/process/policy-predicates.js +116 -0
- package/lib/process/seeds/specs/mine-project-intake.json +12 -4
- package/lib/process/seeds/specs/mine-valuation.json +6 -2
- package/lib/process/spec-validator.js +46 -1
- package/lib/process/stages/policy-dsl-legacy.js +178 -0
- package/lib/process/stages/policy-gate.js +24 -168
- package/package.json +1 -1
- package/scripts/postbuild-standalone.mjs +9 -0
- package/.next/standalone/.next/server/app/workflows/new/page.js +0 -2
- package/.next/standalone/.next/server/app/workflows/new/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/workflows/new/page_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/static/cR6E_4o8_rHXujVNesWiZ/_buildManifest.js +0 -1
- package/.next/standalone/.next/static/chunks/app/projects/page-2166c214f854766e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/workflows/[caseId]/page-423e4c194c7f5bf5.js +0 -1
- package/.next/standalone/.next/static/chunks/app/workflows/new/page-1eda41616cbfc4f3.js +0 -1
- package/.next/static/cR6E_4o8_rHXujVNesWiZ/_buildManifest.js +0 -1
- package/.next/static/chunks/app/projects/page-2166c214f854766e.js +0 -1
- package/.next/static/chunks/app/workflows/[caseId]/page-423e4c194c7f5bf5.js +0 -1
- package/.next/static/chunks/app/workflows/new/page-1eda41616cbfc4f3.js +0 -1
- package/app/workflows/new/new-case-flow.jsx +0 -256
- package/app/workflows/new/page.js +0 -27
- /package/.next/standalone/.next/static/{cR6E_4o8_rHXujVNesWiZ → -LlttjOnKZXGqZXDKcj-4}/_ssgManifest.js +0 -0
- /package/.next/static/{cR6E_4o8_rHXujVNesWiZ → -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=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[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=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[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()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{"use strict";var e={},t={};function r(o){var n=t[o];if(void 0!==n)return n.exports;var a=t[o]={exports:{}},i=!0;try{e[o].call(a.exports,a,a.exports,r),i=!1}finally{i&&delete t[o]}return a.exports}r.m=e,(()=>{var e=[];r.O=(t,o,n,a)=>{if(o){a=a||0;for(var i=e.length;i>0&&e[i-1][2]>a;i--)e[i]=e[i-1];e[i]=[o,n,a];return}for(var c=1/0,i=0;i<e.length;i++){for(var[o,n,a]=e[i],d=!0,u=0;u<o.length;u++)(!1&a||c>=a)&&Object.keys(r.O).every(e=>r.O[e](o[u]))?o.splice(u--,1):(d=!1,a<c&&(c=a));if(d){e.splice(i--,1);var s=n();void 0!==s&&(t=s)}}return t}})(),r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},(()=>{var e,t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__;r.t=function(o,n){if(1&n&&(o=this(o)),8&n||"object"==typeof o&&o&&(4&n&&o.__esModule||16&n&&"function"==typeof o.then))return o;var a=Object.create(null);r.r(a);var i={};e=e||[null,t({}),t([]),t(t)];for(var c=2&n&&o;"object"==typeof c&&!~e.indexOf(c);c=t(c))Object.getOwnPropertyNames(c).forEach(e=>i[e]=()=>o[e]);return i.default=()=>o,r.d(a,i),a}})(),r.d=(e,t)=>{for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((t,o)=>(r.f[o](e,t),t),[])),r.u=e=>2769===e?"static/chunks/2769-5b75c7bddf7ca30a.js":4119===e?"static/chunks/4119-3b6adff3c7187ef3.js":930===e?"static/chunks/930-721369985da388ce.js":"static/chunks/"+(5730===e?"44530001":e)+"."+({840:"e6f27edfb8124775",1517:"ebf6fe1a9c310c88",2713:"ffa893e49f7e4183",3168:"ed91d2d25b4aca3f",4797:"c676c6ac0f39449c",5730:"a9ce8b2fb3979725",5938:"9d4468131146b81c",7130:"08b2adb325a87ad8",8217:"0beb0a316c7ad5d8",9863:"cb7415f4a67d7f45",9867:"f985c0e7589f40cf"})[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={},t="_N_E:";r.l=(o,n,a,i)=>{if(e[o])return void e[o].push(n);if(void 0!==a)for(var c,d,u=document.getElementsByTagName("script"),s=0;s<u.length;s++){var f=u[s];if(f.getAttribute("src")==o||f.getAttribute("data-webpack")==t+a){c=f;break}}c||(d=!0,(c=document.createElement("script")).charset="utf-8",c.timeout=120,r.nc&&c.setAttribute("nonce",r.nc),c.setAttribute("data-webpack",t+a),c.src=r.tu(o)),e[o]=[n];var l=(t,r)=>{c.onerror=c.onload=null,clearTimeout(p);var n=e[o];if(delete e[o],c.parentNode&&c.parentNode.removeChild(c),n&&n.forEach(e=>e(r)),t)return t(r)},p=setTimeout(l.bind(null,void 0,{type:"timeout",target:c}),12e4);c.onerror=l.bind(null,c.onerror),c.onload=l.bind(null,c.onload),d&&document.head.appendChild(c)}})(),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;r.tt=()=>(void 0===e&&(e={createScriptURL:e=>e},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(e=trustedTypes.createPolicy("nextjs#bundler",e))),e)})(),r.tu=e=>r.tt().createScriptURL(e),r.p="/_next/",(()=>{var e={8068:0,3045:0,1741:0,
|
|
1
|
+
(()=>{"use strict";var e={},t={};function r(o){var n=t[o];if(void 0!==n)return n.exports;var a=t[o]={exports:{}},i=!0;try{e[o].call(a.exports,a,a.exports,r),i=!1}finally{i&&delete t[o]}return a.exports}r.m=e,(()=>{var e=[];r.O=(t,o,n,a)=>{if(o){a=a||0;for(var i=e.length;i>0&&e[i-1][2]>a;i--)e[i]=e[i-1];e[i]=[o,n,a];return}for(var c=1/0,i=0;i<e.length;i++){for(var[o,n,a]=e[i],d=!0,u=0;u<o.length;u++)(!1&a||c>=a)&&Object.keys(r.O).every(e=>r.O[e](o[u]))?o.splice(u--,1):(d=!1,a<c&&(c=a));if(d){e.splice(i--,1);var s=n();void 0!==s&&(t=s)}}return t}})(),r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},(()=>{var e,t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__;r.t=function(o,n){if(1&n&&(o=this(o)),8&n||"object"==typeof o&&o&&(4&n&&o.__esModule||16&n&&"function"==typeof o.then))return o;var a=Object.create(null);r.r(a);var i={};e=e||[null,t({}),t([]),t(t)];for(var c=2&n&&o;"object"==typeof c&&!~e.indexOf(c);c=t(c))Object.getOwnPropertyNames(c).forEach(e=>i[e]=()=>o[e]);return i.default=()=>o,r.d(a,i),a}})(),r.d=(e,t)=>{for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((t,o)=>(r.f[o](e,t),t),[])),r.u=e=>2769===e?"static/chunks/2769-5b75c7bddf7ca30a.js":4119===e?"static/chunks/4119-3b6adff3c7187ef3.js":930===e?"static/chunks/930-721369985da388ce.js":"static/chunks/"+(5730===e?"44530001":e)+"."+({840:"e6f27edfb8124775",1517:"ebf6fe1a9c310c88",2713:"ffa893e49f7e4183",3168:"ed91d2d25b4aca3f",4797:"c676c6ac0f39449c",5730:"a9ce8b2fb3979725",5938:"9d4468131146b81c",7130:"08b2adb325a87ad8",8217:"0beb0a316c7ad5d8",9863:"cb7415f4a67d7f45",9867:"f985c0e7589f40cf"})[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={},t="_N_E:";r.l=(o,n,a,i)=>{if(e[o])return void e[o].push(n);if(void 0!==a)for(var c,d,u=document.getElementsByTagName("script"),s=0;s<u.length;s++){var f=u[s];if(f.getAttribute("src")==o||f.getAttribute("data-webpack")==t+a){c=f;break}}c||(d=!0,(c=document.createElement("script")).charset="utf-8",c.timeout=120,r.nc&&c.setAttribute("nonce",r.nc),c.setAttribute("data-webpack",t+a),c.src=r.tu(o)),e[o]=[n];var l=(t,r)=>{c.onerror=c.onload=null,clearTimeout(p);var n=e[o];if(delete e[o],c.parentNode&&c.parentNode.removeChild(c),n&&n.forEach(e=>e(r)),t)return t(r)},p=setTimeout(l.bind(null,void 0,{type:"timeout",target:c}),12e4);c.onerror=l.bind(null,c.onerror),c.onload=l.bind(null,c.onload),d&&document.head.appendChild(c)}})(),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;r.tt=()=>(void 0===e&&(e={createScriptURL:e=>e},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(e=trustedTypes.createPolicy("nextjs#bundler",e))),e)})(),r.tu=e=>r.tt().createScriptURL(e),r.p="/_next/",(()=>{var e={8068:0,3045:0,1741:0,8422:0,1776:0};r.f.j=(t,o)=>{var n=r.o(e,t)?e[t]:void 0;if(0!==n)if(n)o.push(n[2]);else if(/^(17(41|76)|3045|8068|8422)$/.test(t))e[t]=0;else{var a=new Promise((r,o)=>n=e[t]=[r,o]);o.push(n[2]=a);var i=r.p+r.u(t),c=Error();r.l(i,o=>{if(r.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var a=o&&("load"===o.type?"missing":o.type),i=o&&o.target&&o.target.src;c.message="Loading chunk "+t+" failed.\n("+a+": "+i+")",c.name="ChunkLoadError",c.type=a,c.request=i,n[1](c)}},"chunk-"+t,t)}},r.O.j=t=>0===e[t];var t=(t,o)=>{var n,a,[i,c,d]=o,u=0;if(i.some(t=>0!==e[t])){for(n in c)r.o(c,n)&&(r.m[n]=c[n]);if(d)var s=d(r)}for(t&&t(o);u<i.length;u++)a=i[u],r.o(e,a)&&e[a]&&e[a][0](),e[a]=0;return r.O(s)},o=self.webpackChunk_N_E=self.webpackChunk_N_E||[];o.forEach(t.bind(null,0)),o.push=t.bind(null,o.push.bind(o))})(),r.nc=void 0})();
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,22 @@
|
|
|
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
|
+
|
|
5
21
|
## [2.13.0] - 2026-06-04
|
|
6
22
|
|
|
7
23
|
### Added
|
|
@@ -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.
|
|
8
|
-
//
|
|
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
|
-
|
|
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
|
|
100
|
-
for this
|
|
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
|
|
12
|
-
//
|
|
13
|
-
//
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
}, [
|
|
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
|
|
10
|
-
//
|
|
11
|
-
//
|
|
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
|
|
15
|
-
//
|
|
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).
|
|
51
|
-
<Link href={`/workflows
|
|
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>
|
package/app/workflows/page.js
CHANGED
|
@@ -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
|
/>
|
package/lib/process/artifacts.js
CHANGED
|
@@ -230,59 +230,12 @@ function htmlShell({ title, kicker, bodyHtml }) {
|
|
|
230
230
|
|
|
231
231
|
// ── Renderers ───────────────────────────────────────────────────────────────
|
|
232
232
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
const fieldsHtml = fields
|
|
240
|
-
.map((f) => {
|
|
241
|
-
const req = f.required ? '<span class="req"></span>' : '';
|
|
242
|
-
const help = f.help ? `<p class="field-help">${escapeHtml(f.help)}</p>` : '';
|
|
243
|
-
let preview = '<em class="muted">Field will be captured at intake.</em>';
|
|
244
|
-
if (f.type === 'select' && Array.isArray(f.options)) {
|
|
245
|
-
preview = `<span class="muted">Choose one of:</span> ${f.options.map((o) => `<span class="pill">${escapeHtml(o)}</span>`).join(' ')}`;
|
|
246
|
-
} else if (f.type === 'shareholders') {
|
|
247
|
-
preview = '<span class="muted">Repeatable rows: shareholder name + percentage (must sum to 100).</span>';
|
|
248
|
-
} else if (f.placeholder) {
|
|
249
|
-
preview = `<span class="muted">${escapeHtml(f.placeholder)}</span>`;
|
|
250
|
-
} else if (f.type) {
|
|
251
|
-
preview = `<span class="muted">Type: ${escapeHtml(f.type)}</span>`;
|
|
252
|
-
}
|
|
253
|
-
return `
|
|
254
|
-
<div class="field">
|
|
255
|
-
<span class="field-label">${escapeHtml(f.label || f.name)}${req}</span>
|
|
256
|
-
${help}
|
|
257
|
-
<div class="field-value">${preview}</div>
|
|
258
|
-
</div>`;
|
|
259
|
-
})
|
|
260
|
-
.join('');
|
|
261
|
-
|
|
262
|
-
const body = `
|
|
263
|
-
<h1>${escapeHtml(schema?.title || `${definition?.name || 'Process'} — intake`)}</h1>
|
|
264
|
-
<div class="meta">
|
|
265
|
-
<span><strong>Process:</strong> ${escapeHtml(definition?.name || definition?.slug || '')}</span>
|
|
266
|
-
<span><strong>Case:</strong> ${escapeHtml(caseRow?.title || '')}</span>
|
|
267
|
-
<span class="pill">awaiting submission</span>
|
|
268
|
-
</div>
|
|
269
|
-
${schema?.description ? `<p class="muted">${escapeHtml(schema.description)}</p>` : ''}
|
|
270
|
-
<div class="note">
|
|
271
|
-
This artifact is the source-of-record intake page for case <code>${escapeHtml(caseRow?.id || '')}</code>.
|
|
272
|
-
Submit the live form via the workflows dashboard; on submit a companion <em>intake submission</em> artifact
|
|
273
|
-
is generated and linked to this case.
|
|
274
|
-
</div>
|
|
275
|
-
<h2>Fields</h2>
|
|
276
|
-
${fieldsHtml || '<p class="muted">No fields configured.</p>'}
|
|
277
|
-
<div class="art-footer">
|
|
278
|
-
Generated by Madarx OS process engine · definition <code>${escapeHtml(definition?.slug || '')}</code>
|
|
279
|
-
</div>
|
|
280
|
-
`;
|
|
281
|
-
return htmlShell({
|
|
282
|
-
title: schema?.title || `Intake — ${definition?.name || ''}`,
|
|
283
|
-
kicker: 'Intake form · awaiting submission',
|
|
284
|
-
bodyHtml: body,
|
|
285
|
-
});
|
|
233
|
+
// Renders the branded interactive intake form — a single self-contained HTML
|
|
234
|
+
// document with REAL form controls that POSTs to `submit_endpoint`. This is the
|
|
235
|
+
// only intake-form shape as of v2.14.0; the legacy read-only "preview" renderer
|
|
236
|
+
// and its MADARX_BRANDED_INTAKE flag were removed.
|
|
237
|
+
export function renderIntakeFormHtml({ definition, schema, caseRow, settings = null, submit_endpoint = null, submit_token = null }) {
|
|
238
|
+
return renderIntakeFormInteractiveHtml({ definition, schema, caseRow, settings, submit_endpoint, submit_token });
|
|
286
239
|
}
|
|
287
240
|
|
|
288
241
|
// ── Branded interactive renderer (Phase 2) ──────────────────────────────────
|
|
@@ -713,19 +666,18 @@ function safeCreate(opts) {
|
|
|
713
666
|
}
|
|
714
667
|
}
|
|
715
668
|
|
|
716
|
-
export function createIntakeFormArtifact({ definition, schema, caseRow, settings = null,
|
|
669
|
+
export function createIntakeFormArtifact({ definition, schema, caseRow, settings = null, submit_endpoint = null, submit_token = null }) {
|
|
717
670
|
if (!definition || !caseRow) return null;
|
|
718
|
-
const html = renderIntakeFormHtml({ definition, schema, caseRow, settings,
|
|
719
|
-
const
|
|
720
|
-
const title = `${definition.name || definition.slug || 'Process'} — intake form${modeSuffix} — ${caseRow.title || caseRow.id.slice(-8)}`;
|
|
671
|
+
const html = renderIntakeFormHtml({ definition, schema, caseRow, settings, submit_endpoint, submit_token });
|
|
672
|
+
const title = `${definition.name || definition.slug || 'Process'} — intake form — ${caseRow.title || caseRow.id.slice(-8)}`;
|
|
721
673
|
return safeCreate({
|
|
722
674
|
title,
|
|
723
675
|
kind: 'html',
|
|
724
676
|
content: html,
|
|
725
677
|
project_id: caseRow.project_id,
|
|
726
|
-
// Dedupe keyed on case
|
|
727
|
-
//
|
|
728
|
-
dedupe_key: `process_intake_form:${caseRow.id}
|
|
678
|
+
// Dedupe keyed on case so re-rendering with a fresh token (share-link mint)
|
|
679
|
+
// replaces rather than spawns a new artifact.
|
|
680
|
+
dedupe_key: `process_intake_form:${caseRow.id}`,
|
|
729
681
|
});
|
|
730
682
|
}
|
|
731
683
|
|
package/lib/process/engine.js
CHANGED
|
@@ -104,20 +104,20 @@ function appendProcessAudit({ case_id, stage_id = null, action, status = 'succes
|
|
|
104
104
|
|
|
105
105
|
// Render the case-level intake-form artifact at startCase time. Failure is
|
|
106
106
|
// observation-only — engine state stays the source of truth and the case can
|
|
107
|
-
// still progress without a presentation artifact.
|
|
108
|
-
//
|
|
107
|
+
// still progress without a presentation artifact. The artifact is always the
|
|
108
|
+
// branded interactive (in-document form) shape; it posts to the stage submit
|
|
109
|
+
// endpoint. (The legacy read-only "preview" shape and its MADARX_BRANDED_INTAKE
|
|
110
|
+
// flag were removed in v2.14.0 — branded intake is the only start path.)
|
|
109
111
|
function seedIntakeArtifact({ definition, firstStage, caseRow, snapshot }) {
|
|
110
112
|
if (firstStage.kind !== 'intake_form') return null;
|
|
111
113
|
try {
|
|
112
114
|
const schema = parseIntakeFormSchema(definition);
|
|
113
|
-
const branded = process.env.MADARX_BRANDED_INTAKE === '1';
|
|
114
115
|
return createIntakeFormArtifact({
|
|
115
116
|
definition,
|
|
116
117
|
schema,
|
|
117
118
|
caseRow,
|
|
118
119
|
settings: snapshot,
|
|
119
|
-
|
|
120
|
-
submit_endpoint: branded ? `/api/processes/${caseRow.id}/stages/${firstStage.slug}/submit` : null,
|
|
120
|
+
submit_endpoint: `/api/processes/${caseRow.id}/stages/${firstStage.slug}/submit`,
|
|
121
121
|
});
|
|
122
122
|
} catch { return null; }
|
|
123
123
|
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// lib/process/policy-predicates.js — JSON predicate evaluator for policy_gate.
|
|
2
|
+
//
|
|
3
|
+
// Replaces the hand-rolled string DSL (`stages/policy-dsl-legacy.js`) with a
|
|
4
|
+
// declarative predicate tree. No tokenizer, no parser, no escaping bugs — a
|
|
5
|
+
// predicate is plain JSON that the spec-validator can validate structurally
|
|
6
|
+
// and an agent can author without learning an expression grammar.
|
|
7
|
+
//
|
|
8
|
+
// Shape:
|
|
9
|
+
// { "op": "and", "rules": [ <predicate>, ... ] }
|
|
10
|
+
// { "op": "or", "rules": [ <predicate>, ... ] }
|
|
11
|
+
// { "op": "not", "rule": <predicate> }
|
|
12
|
+
// { "op": "eq", "path": "intake.country", "value": "US" }
|
|
13
|
+
// { "op": "gte", "path": "prior_stage.kyc-risk.risk_score", "value": 0.3 }
|
|
14
|
+
// { "op": "in", "path": "intake.type", "value": ["MSA", "SOW", "NDA"] }
|
|
15
|
+
//
|
|
16
|
+
// Path resolution (read-only):
|
|
17
|
+
// intake.<field…> → case intake payload
|
|
18
|
+
// prior_stage.<slug>.<field…> → that stage's accumulated context output
|
|
19
|
+
// context.<field…> → raw context bag
|
|
20
|
+
// <bare> → resolved against the whole ctx object
|
|
21
|
+
//
|
|
22
|
+
// Equality (`eq`/`neq`) is intentionally loose (`==`/`!=`) so a `neq null`
|
|
23
|
+
// check treats a missing path the same as an explicit null — matching the
|
|
24
|
+
// "field must be provided" idiom the legacy DSL expressed as `x != null`.
|
|
25
|
+
|
|
26
|
+
const MAX_DEPTH = 20;
|
|
27
|
+
|
|
28
|
+
export const LOGICAL_OPS = new Set(['and', 'or', 'not']);
|
|
29
|
+
export const COMPARE_OPS = new Set(['eq', 'neq', 'lt', 'lte', 'gt', 'gte', 'in', 'nin']);
|
|
30
|
+
|
|
31
|
+
const COMPARATORS = {
|
|
32
|
+
eq: (a, b) => a == b, // eslint-disable-line eqeqeq
|
|
33
|
+
neq: (a, b) => a != b, // eslint-disable-line eqeqeq
|
|
34
|
+
lt: (a, b) => Number(a) < Number(b),
|
|
35
|
+
lte: (a, b) => Number(a) <= Number(b),
|
|
36
|
+
gt: (a, b) => Number(a) > Number(b),
|
|
37
|
+
gte: (a, b) => Number(a) >= Number(b),
|
|
38
|
+
in: (a, b) => Array.isArray(b) && b.some((v) => v === a),
|
|
39
|
+
nin: (a, b) => Array.isArray(b) && !b.some((v) => v === a),
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
function isPlainObject(v) {
|
|
43
|
+
return v != null && typeof v === 'object' && !Array.isArray(v);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function readDeep(obj, path) {
|
|
47
|
+
if (!path) return obj;
|
|
48
|
+
return path.split('.').reduce((acc, key) => (acc == null ? acc : acc[key]), obj);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Resolve a `path` string against the evaluation context. `ctx` carries
|
|
52
|
+
// `intake` and `context` (the accumulated per-stage output bag).
|
|
53
|
+
export function resolvePath(path, ctx) {
|
|
54
|
+
if (typeof path !== 'string' || !path) return undefined;
|
|
55
|
+
const dot = path.indexOf('.');
|
|
56
|
+
const head = dot === -1 ? path : path.slice(0, dot);
|
|
57
|
+
const rest = dot === -1 ? '' : path.slice(dot + 1);
|
|
58
|
+
if (head === 'intake') return readDeep(ctx?.intake, rest);
|
|
59
|
+
if (head === 'context') return readDeep(ctx?.context, rest);
|
|
60
|
+
if (head === 'prior_stage') {
|
|
61
|
+
const slugDot = rest.indexOf('.');
|
|
62
|
+
const slug = slugDot === -1 ? rest : rest.slice(0, slugDot);
|
|
63
|
+
const field = slugDot === -1 ? '' : rest.slice(slugDot + 1);
|
|
64
|
+
return readDeep(ctx?.context?.[slug], field);
|
|
65
|
+
}
|
|
66
|
+
return readDeep(ctx, path);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// True when a rule entry is a JSON predicate (vs a legacy string / { expr }).
|
|
70
|
+
export function isPredicateRule(rule) {
|
|
71
|
+
return isPlainObject(rule) && typeof rule.op === 'string';
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Evaluate a predicate tree against { intake, context }. Throws on a malformed
|
|
75
|
+
// predicate so the caller can surface the error in the gate trace.
|
|
76
|
+
export function evaluatePredicate(pred, ctx, depth = 0) {
|
|
77
|
+
if (depth > MAX_DEPTH) throw new Error('policy-predicate: maximum nesting depth exceeded');
|
|
78
|
+
if (!isPlainObject(pred)) throw new Error('policy-predicate: predicate must be an object');
|
|
79
|
+
const op = pred.op;
|
|
80
|
+
if (op === 'and' || op === 'or') {
|
|
81
|
+
if (!Array.isArray(pred.rules)) throw new Error(`policy-predicate: "${op}" requires a rules[] array`);
|
|
82
|
+
const results = pred.rules.map((r) => evaluatePredicate(r, ctx, depth + 1));
|
|
83
|
+
return op === 'and' ? results.every(Boolean) : results.some(Boolean);
|
|
84
|
+
}
|
|
85
|
+
if (op === 'not') {
|
|
86
|
+
if (!isPlainObject(pred.rule)) throw new Error('policy-predicate: "not" requires a rule object');
|
|
87
|
+
return !evaluatePredicate(pred.rule, ctx, depth + 1);
|
|
88
|
+
}
|
|
89
|
+
const cmp = COMPARATORS[op];
|
|
90
|
+
if (!cmp) throw new Error(`policy-predicate: unknown op "${op}"`);
|
|
91
|
+
if (typeof pred.path !== 'string' || !pred.path) {
|
|
92
|
+
throw new Error(`policy-predicate: "${op}" requires a path`);
|
|
93
|
+
}
|
|
94
|
+
const left = resolvePath(pred.path, ctx);
|
|
95
|
+
return Boolean(cmp(left, pred.value));
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Non-throwing wrapper mirroring the legacy `evaluateRule` return shape.
|
|
99
|
+
export function evaluatePredicateSafe(pred, ctx) {
|
|
100
|
+
try {
|
|
101
|
+
return { result: Boolean(evaluatePredicate(pred, ctx)), error: null };
|
|
102
|
+
} catch (err) {
|
|
103
|
+
return { result: false, error: err?.message || String(err) };
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Short human-readable label for a predicate when the author supplied none.
|
|
108
|
+
export function describePredicate(pred) {
|
|
109
|
+
if (!isPlainObject(pred)) return String(pred);
|
|
110
|
+
if (pred.label) return pred.label;
|
|
111
|
+
if (pred.op === 'and' || pred.op === 'or') {
|
|
112
|
+
return `(${(pred.rules || []).map(describePredicate).join(` ${pred.op} `)})`;
|
|
113
|
+
}
|
|
114
|
+
if (pred.op === 'not') return `not ${describePredicate(pred.rule)}`;
|
|
115
|
+
return `${pred.path} ${pred.op} ${JSON.stringify(pred.value)}`;
|
|
116
|
+
}
|
|
@@ -64,12 +64,20 @@
|
|
|
64
64
|
"config": {
|
|
65
65
|
"rules": [
|
|
66
66
|
{
|
|
67
|
-
"
|
|
68
|
-
"
|
|
67
|
+
"label": "Project name and slug must be provided",
|
|
68
|
+
"op": "and",
|
|
69
|
+
"rules": [
|
|
70
|
+
{ "op": "neq", "path": "intake.project_name", "value": null },
|
|
71
|
+
{ "op": "neq", "path": "intake.project_slug", "value": null }
|
|
72
|
+
]
|
|
69
73
|
},
|
|
70
74
|
{
|
|
71
|
-
"
|
|
72
|
-
"
|
|
75
|
+
"label": "Data directory path must be non-empty",
|
|
76
|
+
"op": "and",
|
|
77
|
+
"rules": [
|
|
78
|
+
{ "op": "neq", "path": "intake.data_directory_path", "value": null },
|
|
79
|
+
{ "op": "neq", "path": "intake.data_directory_path", "value": "" }
|
|
80
|
+
]
|
|
73
81
|
}
|
|
74
82
|
]
|
|
75
83
|
},
|