madarx 2.13.0 → 2.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +544 -551
- package/.next/standalone/.next/app-path-routes-manifest.json +76 -77
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/react-loadable-manifest.json +1 -1
- 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 +2 -2
- package/.next/standalone/.next/server/app/activity/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/page.js +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +1 -1
- 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 +2 -2
- 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 +2 -2
- package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/marketplace/page.js +2 -2
- 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 +2 -2
- 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 +3 -3
- package/.next/standalone/.next/server/app/projects/page.js +20 -20
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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.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 +3 -3
- 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 +76 -77
- package/.next/standalone/.next/server/chunks/1699.js +19 -19
- package/.next/standalone/.next/server/chunks/51.js +1 -0
- 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/functions-config-manifest.json +15 -15
- 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/middleware-react-loadable-manifest.js +1 -1
- 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/chunks/4119-cfb6260557a0a3d2.js +1 -0
- package/.next/standalone/.next/static/chunks/app/projects/page-f136822590202f9f.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-f916d679fe38a701.js} +1 -1
- package/.next/standalone/.next/static/css/0bd4c357d4f0c4f2.css +1 -0
- package/.next/standalone/.next/static/tMcPS9JR5cRXSe0u5ne95/_buildManifest.js +1 -0
- package/.next/standalone/CHANGELOG.md +28 -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 +2 -2
- package/.next/static/chunks/4119-cfb6260557a0a3d2.js +1 -0
- package/.next/static/chunks/app/projects/page-f136822590202f9f.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-f916d679fe38a701.js} +1 -1
- package/.next/static/css/0bd4c357d4f0c4f2.css +1 -0
- package/.next/static/tMcPS9JR5cRXSe0u5ne95/_buildManifest.js +1 -0
- package/CHANGELOG.md +28 -0
- package/ai-docs/process-engine.md +33 -1
- package/app/api/processes/start-and-route/route.js +5 -3
- package/app/components/dashboard/whatsapp-section.jsx +54 -13
- 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/cli/prompt.js +110 -0
- package/lib/cli/setup.js +152 -87
- 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/lib/runtime.js +8 -2
- package/package.json +2 -2
- package/scripts/postbuild-standalone.mjs +9 -0
- package/scripts/whatsapp-reset.mjs +15 -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/server/chunks/1092.js +0 -1
- package/.next/standalone/.next/static/cR6E_4o8_rHXujVNesWiZ/_buildManifest.js +0 -1
- package/.next/standalone/.next/static/chunks/4119-3b6adff3c7187ef3.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/standalone/.next/static/css/0bfed9e12afa1dc1.css +0 -1
- package/.next/static/cR6E_4o8_rHXujVNesWiZ/_buildManifest.js +0 -1
- package/.next/static/chunks/4119-3b6adff3c7187ef3.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/.next/static/css/0bfed9e12afa1dc1.css +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 → tMcPS9JR5cRXSe0u5ne95}/_ssgManifest.js +0 -0
- /package/.next/static/{cR6E_4o8_rHXujVNesWiZ → tMcPS9JR5cRXSe0u5ne95}/_ssgManifest.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
self.__BUILD_MANIFEST=function(e,r,t,_){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:140,errorRate:1e-4,numBits:2684,numHashes:14,bitArray:[0,1,1,e,e,0,e,r,r,e,r,r,e,r,r,r,e,e,r,r,r,r,e,e,e,e,e,e,r,r,e,e,e,e,e,r,r,r,e,e,r,e,r,e,e,r,r,e,r,r,r,r,e,e,e,r,r,r,e,e,r,e,e,e,r,r,e,r,e,e,e,r,e,e,r,e,e,r,e,e,e,e,e,e,r,e,r,r,r,r,r,r,r,e,e,e,r,r,e,r,r,r,r,r,e,r,e,r,e,r,e,e,e,r,r,r,e,r,r,r,r,e,r,e,e,e,e,r,e,r,r,e,r,e,e,e,e,r,e,e,r,e,e,r,e,e,e,e,r,r,e,e,e,e,r,e,e,r,e,e,e,e,e,r,e,e,r,e,r,e,e,e,r,r,r,e,r,e,e,e,e,r,e,r,r,e,r,r,r,r,e,r,e,r,r,e,r,r,e,r,r,r,r,r,e,r,e,r,r,r,r,e,e,e,e,e,r,e,e,e,e,e,e,e,e,r,e,e,e,r,e,e,e,r,r,r,e,e,r,e,e,e,e,r,e,r,e,e,e,r,e,r,r,e,e,r,r,r,r,r,e,r,r,e,e,e,r,r,e,e,r,r,r,e,r,r,e,e,e,e,e,e,e,r,r,e,r,r,r,e,e,r,r,e,e,e,e,e,r,e,r,e,e,e,e,e,e,e,e,e,r,r,e,e,e,e,e,r,r,e,r,e,r,e,e,r,r,r,e,e,r,e,r,r,r,r,r,e,e,r,e,e,r,e,r,e,r,r,r,r,e,r,e,r,r,r,r,r,e,r,r,r,e,e,r,r,r,e,r,e,r,e,e,r,r,r,r,r,e,e,r,e,r,r,r,e,r,r,r,e,e,e,r,e,r,e,r,e,r,r,r,e,e,e,r,e,r,e,r,e,e,e,e,e,e,r,e,e,e,r,e,r,e,r,r,e,e,r,r,r,r,r,e,e,r,r,r,r,r,e,e,r,r,r,e,r,r,e,r,r,e,e,e,r,e,r,e,e,e,e,e,e,r,e,r,r,e,e,r,r,r,r,r,e,e,e,e,r,r,e,e,e,r,r,r,e,e,e,r,r,e,r,r,r,r,e,r,r,r,r,e,r,r,r,r,e,e,e,e,r,r,e,e,e,e,r,e,e,r,r,e,r,e,e,e,r,e,e,r,e,r,r,r,r,r,e,e,r,r,e,r,e,e,r,e,e,e,r,r,e,r,e,e,e,e,e,e,e,e,r,r,e,r,r,r,e,r,r,r,r,r,r,r,e,r,e,e,r,e,e,e,r,e,r,r,e,e,r,r,e,e,e,e,e,e,r,r,e,e,r,e,r,e,e,r,r,e,r,e,r,r,r,r,r,e,r,e,r,r,r,r,e,e,e,e,e,r,r,r,r,e,r,e,e,e,r,e,e,e,r,e,r,r,e,e,r,e,e,r,r,r,e,e,r,r,e,r,e,r,r,r,r,e,e,r,e,r,e,e,e,r,r,e,r,e,r,e,e,r,r,r,e,r,r,e,e,e,e,e,r,r,e,e,e,r,e,r,e,r,r,r,r,r,e,r,r,r,r,e,r,e,r,r,e,r,e,e,r,r,e,e,r,e,r,r,e,e,r,r,r,r,e,e,e,r,r,r,e,r,r,e,r,r,e,r,r,r,r,r,r,r,r,r,r,e,e,e,e,e,r,e,r,r,r,e,e,r,r,r,e,r,e,r,e,e,r,e,r,e,r,e,r,e,e,r,e,r,r,e,r,e,r,r,r,r,r,e,r,r,r,e,r,e,e,r,r,e,e,r,r,r,e,r,e,e,r,r,e,e,r,e,r,r,r,r,r,e,r,e,e,e,r,r,r,r,r,e,r,e,e,e,r,e,e,r,e,r,e,e,r,r,r,e,r,r,r,r,r,r,e,e,r,e,r,e,e,e,r,e,r,r,e,e,e,e,r,e,r,r,r,e,r,e,e,r,e,e,e,r,r,e,r,r,e,e,e,e,e,e,e,e,r,r,e,e,e,e,e,r,r,r,r,e,r,e,e,r,r,r,e,r,e,r,e,e,e,e,e,e,e,e,e,e,r,r,e,e,r,e,e,e,e,r,r,e,e,e,e,r,r,r,e,e,r,e,e,e,r,e,r,e,r,r,e,r,r,e,e,e,e,r,r,e,r,r,r,e,e,r,e,r,r,r,e,e,r,e,r,e,r,e,e,e,e,r,e,r,r,e,r,r,r,r,e,e,r,e,e,r,r,e,r,e,e,r,r,e,r,e,r,e,e,e,e,r,e,r,r,e,e,r,e,e,e,e,e,e,e,e,r,r,e,r,r,e,r,r,e,r,e,r,r,r,r,e,r,e,r,e,e,r,r,e,r,r,r,r,e,r,e,e,r,e,e,r,r,r,r,e,e,r,e,e,r,r,e,r,e,r,e,r,e,r,e,e,e,e,e,e,e,e,e,e,e,e,e,r,e,e,r,e,e,r,e,e,e,r,r,e,e,r,r,r,e,e,e,e,r,e,e,r,r,r,e,e,r,e,e,e,r,e,e,e,e,e,r,r,e,e,r,e,r,r,e,e,e,e,e,e,r,e,r,e,r,e,e,r,e,e,e,e,r,e,r,r,e,e,r,r,e,e,r,e,r,e,r,e,e,e,r,e,e,r,e,r,e,r,r,e,r,r,e,e,r,r,e,e,r,e,e,e,r,e,r,r,e,r,e,r,r,e,r,r,e,e,r,e,e,e,e,r,e,e,e,e,e,r,r,e,e,e,r,r,r,e,e,e,r,r,e,r,e,r,r,r,e,e,e,r,e,e,e,r,r,r,r,e,r,e,r,r,e,r,r,e,r,e,r,r,r,e,r,r,r,r,r,e,e,r,e,r,e,r,e,e,e,e,e,e,r,r,r,r,e,e,r,r,r,e,r,r,e,e,r,e,e,r,e,e,r,r,r,r,r,r,e,e,r,e,e,e,r,e,r,r,r,r,e,r,r,e,e,r,e,e,e,e,e,e,r,r,r,e,e,e,r,r,e,e,e,r,e,e,e,e,e,r,r,r,r,e,e,e,r,r,e,r,r,e,e,r,r,e,r,e,r,r,e,e,r,r,r,e,e,r,r,r,e,e,e,e,r,e,e,e,e,r,r,r,r,e,r,r,r,e,r,r,e,r,r,r,e,r,e,e,e,r,e,r,e,r,e,r,e,r,r,e,e,r,e,e,r,r,r,e,e,e,e,e,e,r,r,e,r,r,r,r,r,e,r,r,e,r,e,r,e,r,r,e,r,e,e,e,e,r,e,r,r,r,e,r,e,r,r,e,e,e,r,r,r,e,r,e,r,e,e,e,e,e,r,r,r,r,e,e,r,r,r,e,r,r,e,r,r,r,e,r,r,r,r,r,r,r,r,e,e,e,r,r,r,e,e,e,e,e,r,r,e,r,r,r,e,r,r,e,r,e,e,e,e,e,r,e,e,r,e,r,r,e,r,e,r,r,r,r,r,r,e,e,r,r,r,r,r,r,r,e,r,e,e,r,r,e,r,e,e,r,e,r,r,r,e,e,r,e,r,r,r,r,r,e,e,e,e,r,r,r,e,e,e,r,e,r,e,e,r,e,r,e,r,r,r,e,e,r,r,e,e,r,r,e,r,r,e,e,e,e,e,r,e,e,e,e,r,r,e,r,r,e,e,e,r,r,e,r,r,r,e,r,r,r,r,r,e,e,r,e,e,r,e,r,e,r,e,r,e,r,e,e,r,r,r,r,e,r,r,e,e,r,r,e,r,r,e,r,r,r,r,r,e,e,e,r,r,e,e,r,r,e,r,r,e,e,r,r,e,e,r,e,r,r,r,r,e,e,e,r,e,r,e,e,r,r,r,r,e,r,r,e,e,e,r,e,e,e,r,e,e,r,e,e,e,e,e,r,e,r,e,r,e,r,e,r,r,e,e,e,r,e,r,e,r,r,r,e,e,e,e,e,e,r,e,e,r,e,r,e,e,e,r,r,r,e,e,e,r,e,e,r,r,e,e,r,e,r,e,e,e,e,e,r,r,e,e,r,r,e,e,r,e,r,r,e,e,r,r,r,r,e,r,r,e,e,e,e,r,r,e,e,e,e,e,e,r,e,e,e,e,r,e,r,r,r,e,e,e,e,e,r,e,e,e,r,e,r,e,e,r,r,e,e,r,r,r,e,r,e,r,e,e,e,r,r,r,e,e,r,e,r,r,e,e,e,r,e,r,r,r,r,e,e,r,r,e,r,r,r,r,r,e,e,e,e,e,r,e,r,e,e,e,r,r,e,r,e,e,e,r,r,r,e,r,e,e,r,r,r,r,r,e,r,e,r,e,e,r,e,e,e,r,r,r,r,r,r,e,r,e,r,r,e,e,e,e,r,e,e,e,r,e,e,r,e,r,r,e,r,r,r,r,r,e,r,r,e,r,r,e,r,e,r,e,r,e,e,e,e,r,r,e,r,e,r,r,r,e,e,r,r,e,r,e,r,e,e,r,r,e,e,e,e,e,r,e,r,r,r,r,r,r,e,e,r,r,e,e,e,r,r,e,r,e,r,r,r,r,r,e,e,e,r,r,e,e,r,r,e,r,e,e,e,r,r,r,r,r,r,r,r,e,r,r,r,r,r,r,e,e,r,e,r,e,r,e,r,e,e,e,e,r,r,e,r,r,e,e,r,r,e,e,e,r,e,e,e,r,r,e,e,e,r,e,e,r,e,e,e,e,e,r,r,e,r,e,r,r,r,r,r,e,e,r,r,e,e,r,e,r,r,r,r,r,r,r,e,r,e,e,e,e,r,e,e,r,e,r,e,e,e,r,e,e,e,e,r,e,e,r,r,e,r,r,r,e,e,r,e,r,r,e,e,e,e,r,e,e,r,r,r,e,r,e,e,r,r,e,e,r,r,r,e,r,e,e,r,r,e,e,e,e,r,r,e,e,r,e,r,r,e,e,r,e,e,r,e,r,e,r,r,r,e,r,r,e,e,r,e,e,e,r,r,r,r,e,e,e,r,r,e,e,e,e,r,e,r,e,r,e,r,r,r,r,r,e,r,r,r,e,r,r,e,e,r,r,r,e,e,r,e,r,r,r,r,e,e,e,r,e,e,e,r,r,r,e,r,e,r,e,r,r,e,r,e,e,e,e,r,r,r,r,r,r,r,e,e,e,e,e,e,r,r,r,e,r,r,e,e,r,e,e,e,e,e,r,r,r,r,r,e,r,r,r,r,r,r,e,e,e,r,r,e,e,e,r,e,e,r,e,e,r,e,r,e,e,e,e,e,e,e,r,e,e,e,e,r,e,r,e,e,r,r,e,r,r,e,r,r,r,e,e,e,e,e,r,e,r,r,e,e,e,r,e,e,r,e,e,r,r,r,e,e,e,e,e,r,r,e,e,r,r,e,r,e,e,r,r,e,r,r,e,e,e,e,r,e,e,e,r,e,e,r,r,r,r,r,r,e,e,r,e,r,e,r,r,r,e,r,e,e,e,e,e,r,e,r,e,e,r,r,e,r,r,r,r,r,e,e,r,e,r,e,r,e,r,e,e,e,e,r,r,e,e,r,e,e,e,r,e,r,r,e,e,r,r,e,r,r,r,r,r,e,e,e,r,r,r,e,r,r,r,e,r,e,e,e,r,e,r,e,e,e,r,e,r,e,e,e,e,r,e,r,e,r,r,e,e,r,r,r,r,r,r,e,e,e,r,e,r,e,e,e,r,e,e,r,e,e,r,r,e,r,r,e,e,e,e,e,r,r,e,e,r,r,r,e,e,r,e,e,e,e,e,r,r,e,r,e,e,r,r,e,r,e,e,r,e,r,r,e,e,e,e,r,e,r,e,r,e,e,e,e,e,e,r,e,e,r,r,e,e,e,r,r,e,e,e,e,e,e,r,r,e,r,r,r,r,r,r,r,e,e,r,e,r,e,r,r,e,e,e,e,e,e,e,r,r,r,r,e,r,e,e,e,e,e,e,e,e,e,r,r,r,e,r]},__routerFilterDynamic:{numItems:39,errorRate:1e-4,numBits:748,numHashes:14,bitArray:[r,e,r,r,e,e,e,e,r,r,r,e,r,r,e,r,e,r,e,r,e,e,r,e,e,r,e,e,e,e,r,r,e,r,e,r,e,r,e,r,e,e,e,r,r,r,r,r,e,r,r,r,e,e,r,e,e,r,r,r,r,r,e,e,r,r,r,e,e,r,r,e,r,e,e,r,r,e,r,e,e,e,e,e,e,r,e,e,r,r,r,e,e,e,r,e,r,e,r,r,e,r,e,r,e,e,e,r,e,e,e,e,r,r,e,e,r,r,e,r,r,r,r,e,e,r,e,e,e,r,e,e,e,r,r,r,r,r,e,r,r,r,r,e,r,e,e,r,r,e,e,r,e,r,e,r,r,r,r,r,e,r,r,e,r,e,r,r,e,r,r,e,e,e,e,e,r,r,r,e,r,r,e,e,r,r,e,e,e,r,r,e,r,e,e,e,r,r,e,e,r,e,r,r,e,r,e,e,e,e,e,r,r,r,e,r,r,r,e,r,e,e,e,r,e,e,e,e,r,e,r,e,e,r,e,e,r,e,e,r,r,r,r,e,e,r,e,r,r,r,e,e,r,r,r,r,e,e,r,r,e,r,r,r,e,e,e,r,r,e,e,r,e,e,e,e,e,e,e,r,r,e,r,e,r,e,e,r,r,r,r,r,r,r,e,r,r,e,r,r,e,r,e,e,r,e,e,e,e,r,r,e,r,e,e,r,r,r,e,e,e,r,e,e,r,r,e,r,e,r,r,r,r,r,r,e,r,e,e,e,r,r,e,r,e,r,r,e,r,e,r,e,e,e,r,e,e,r,r,r,r,r,r,r,r,e,e,e,e,r,r,e,r,e,e,r,r,e,e,r,e,e,r,e,e,e,e,e,e,e,r,r,e,e,e,r,r,e,e,r,r,e,e,r,r,r,r,r,r,r,r,e,e,r,r,r,e,e,r,r,e,e,e,e,r,r,e,r,r,r,r,r,r,e,r,e,r,e,e,e,e,e,e,r,e,r,r,e,r,r,e,e,r,e,e,r,e,e,r,r,r,r,e,r,r,e,r,r,r,e,e,e,e,r,e,e,e,e,r,r,r,r,r,e,e,e,r,e,e,e,e,r,r,e,r,r,r,e,r,r,e,e,r,r,r,e,e,e,r,r,r,e,r,e,r,r,e,r,e,e,e,e,e,r,r,e,r,r,e,r,e,r,e,r,e,r,e,r,r,r,e,r,e,e,r,r,e,e,r,r,e,e,e,e,r,r,r,e,r,r,e,e,e,e,e,e,e,r,e,r,e,e,r,e,r,e,r,r,e,r,e,e,e,e,e,e,r,r,e,e,r,r,e,e,e,e,e,e,r,e,r,e,e,r,r,r,r,e,r,e,e,e,e,r,r,r,r,e,e,e,r,e,r,r,r,r,e,e,r,e,r,r,r,e,r,e,e,r,e,r,r,e,e,e,r,r,r,r,e,r,r,r,e,r,e,e,r,e,e,r,e,r,r,r,e,r,r,e,e,e,r,e,r,e,e,e,e,r,e,e,e,e,e,e,e,e,r,e,e,r,r,r,r,e,r,e,e,e,r,r,e,r,e,e,r,e,e,e,e,r,e,r,e,e,r,e,e,e,e,e,r,e,e,e,r,e,r,r,e,r,e,e,e,e,r,r,r,e,e,r,e,e,r,e,r,e,r,r]},"/_error":["static/chunks/pages/_error-c970d8b55ace1b48.js"],sortedPages:["/_app","/_error"]}}(1,0,1e-4,14),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
|
|
@@ -2,6 +2,34 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to Madarx OS. Newest first.
|
|
4
4
|
|
|
5
|
+
## [2.15.0] - 2026-06-04
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- **Guided `madarx setup` wizard.** Setup is now an arrow-key experience (↑/↓ or j/k, Enter, number keys) that decides what shapes the whole install up front: **usage mode** — Personal (local-only) or Team (Supabase shared layer, with credential capture) — then the **main agent model** and the **default sub-agent model**, chosen from the engines actually available on your machine (it probes the Claude Code and Codex CLIs and a running Ollama, and always lists the Anthropic models). It then walks the secrets-vault master key, API keys (masked, and only flags Anthropic as *required* when your selected engine needs it), folder permissions, the WhatsApp toggle, and the auto-update policy. Re-running is safe — every step shows your current value as the default. New zero-dependency `lib/cli/prompt.js` (`select`/`confirm`).
|
|
10
|
+
- The sub-agent default model picked at setup is honored at runtime: `createAgent` now falls back to the `default_agent_engine` / `default_agent_model` config when a caller doesn't specify one.
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **WhatsApp could get stuck "logged out" with no way to re-pair.** When WhatsApp unlinked the device server-side (you removed it from Linked Devices, the number got flagged, or its anti-unofficial-client sweep caught a fresh Baileys session), the bridge left the now-invalid credentials on disk and stopped — which silently blocked a new pairing QR (Baileys only offers a QR on an empty session). The Pairing screen sat on "Waiting for QR" forever, and the only recovery control lived in the *paired* branch of the UI, so there was no visible button to reset. The logged-out state now shows a **Reset session** button (with a confirm step) that wipes the dead session and brings up a fresh QR — the same recovery the dashboard already offered after a deliberate disconnect.
|
|
15
|
+
- **`npm run whatsapp:reset` wiped the wrong directory on global installs.** It hardcoded `<cwd>/data/whatsapp/session`, so for a `npm i -g madarx` install (whose data lives under `$MADARX_HOME`, default `~/.madarx`) it deleted a repo-relative path that didn't exist and never touched the real session. It now resolves the session directory from `lib/paths.js`, honoring `MADARX_HOME` / `MADARX_DATA_DIR`, via the new `scripts/whatsapp-reset.mjs`.
|
|
16
|
+
|
|
17
|
+
## [2.14.0] - 2026-06-04
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- **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.)
|
|
22
|
+
- **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.)
|
|
23
|
+
|
|
24
|
+
### Deprecated
|
|
25
|
+
|
|
26
|
+
- **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.
|
|
27
|
+
|
|
28
|
+
### Notes
|
|
29
|
+
|
|
30
|
+
- `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.
|
|
31
|
+
- 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).
|
|
32
|
+
|
|
5
33
|
## [2.13.0] - 2026-06-04
|
|
6
34
|
|
|
7
35
|
### Added
|
|
@@ -1 +1 @@
|
|
|
1
|
-
2026-06-
|
|
1
|
+
2026-06-04T18:31:33.193Z
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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
|
},
|
|
@@ -50,8 +50,12 @@
|
|
|
50
50
|
"config": {
|
|
51
51
|
"rules": [
|
|
52
52
|
{
|
|
53
|
-
"
|
|
54
|
-
"
|
|
53
|
+
"label": "Project ID must be provided",
|
|
54
|
+
"op": "and",
|
|
55
|
+
"rules": [
|
|
56
|
+
{ "op": "neq", "path": "intake.project_id", "value": null },
|
|
57
|
+
{ "op": "neq", "path": "intake.project_id", "value": "" }
|
|
58
|
+
]
|
|
55
59
|
}
|
|
56
60
|
]
|
|
57
61
|
},
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
// lib/process/stages/policy-dsl-legacy.js — DEPRECATED string-expression DSL.
|
|
2
|
+
//
|
|
3
|
+
// The hand-rolled tokenizer/parser kept for ONE release as a back-compat path
|
|
4
|
+
// while string rules migrate to JSON predicates (`../policy-predicates.js`).
|
|
5
|
+
// New workflows must author predicate JSON; the spec-validator accepts both
|
|
6
|
+
// forms for now and the policy_gate handler routes per-rule. Do not extend
|
|
7
|
+
// this grammar — it is on a removal track.
|
|
8
|
+
//
|
|
9
|
+
// Rule grammar:
|
|
10
|
+
// - intake.<field>
|
|
11
|
+
// - prior_stage('<slug>').<field>
|
|
12
|
+
// - Comparison: ==, !=, <, <=, >, >=
|
|
13
|
+
// - Logical: && ||, parens
|
|
14
|
+
// - String literals: 'foo'
|
|
15
|
+
// - Number literals: 1, 0.5
|
|
16
|
+
// - Membership: <left> IN [<lit>, <lit>, ...]
|
|
17
|
+
|
|
18
|
+
function readPath(obj, path) {
|
|
19
|
+
if (!obj || !path) return undefined;
|
|
20
|
+
return path.split('.').reduce((acc, key) => (acc == null ? acc : acc[key]), obj);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function tokenize(expr) {
|
|
24
|
+
const tokens = [];
|
|
25
|
+
let i = 0;
|
|
26
|
+
while (i < expr.length) {
|
|
27
|
+
const ch = expr[i];
|
|
28
|
+
if (/\s/.test(ch)) { i++; continue; }
|
|
29
|
+
if (ch === '(' || ch === ')' || ch === '[' || ch === ']' || ch === ',') {
|
|
30
|
+
tokens.push({ type: ch }); i++; continue;
|
|
31
|
+
}
|
|
32
|
+
if (ch === '&' && expr[i + 1] === '&') { tokens.push({ type: '&&' }); i += 2; continue; }
|
|
33
|
+
if (ch === '|' && expr[i + 1] === '|') { tokens.push({ type: '||' }); i += 2; continue; }
|
|
34
|
+
if (ch === '=' && expr[i + 1] === '=') { tokens.push({ type: 'op', value: '==' }); i += 2; continue; }
|
|
35
|
+
if (ch === '!' && expr[i + 1] === '=') { tokens.push({ type: 'op', value: '!=' }); i += 2; continue; }
|
|
36
|
+
if (ch === '<' && expr[i + 1] === '=') { tokens.push({ type: 'op', value: '<=' }); i += 2; continue; }
|
|
37
|
+
if (ch === '>' && expr[i + 1] === '=') { tokens.push({ type: 'op', value: '>=' }); i += 2; continue; }
|
|
38
|
+
if (ch === '<' || ch === '>') { tokens.push({ type: 'op', value: ch }); i++; continue; }
|
|
39
|
+
if (ch === "'" || ch === '"') {
|
|
40
|
+
const end = expr.indexOf(ch, i + 1);
|
|
41
|
+
if (end === -1) throw new Error(`policy-gate: unterminated string at ${i}`);
|
|
42
|
+
tokens.push({ type: 'string', value: expr.slice(i + 1, end) });
|
|
43
|
+
i = end + 1; continue;
|
|
44
|
+
}
|
|
45
|
+
if (/[0-9.]/.test(ch)) {
|
|
46
|
+
let j = i;
|
|
47
|
+
while (j < expr.length && /[0-9.]/.test(expr[j])) j++;
|
|
48
|
+
tokens.push({ type: 'number', value: Number(expr.slice(i, j)) });
|
|
49
|
+
i = j; continue;
|
|
50
|
+
}
|
|
51
|
+
if (/[A-Za-z_]/.test(ch)) {
|
|
52
|
+
let j = i;
|
|
53
|
+
while (j < expr.length && /[A-Za-z0-9_.]/.test(expr[j])) j++;
|
|
54
|
+
const word = expr.slice(i, j);
|
|
55
|
+
if (word === 'IN' || word === 'in') { tokens.push({ type: 'IN' }); }
|
|
56
|
+
else if (word === 'true') { tokens.push({ type: 'boolean', value: true }); }
|
|
57
|
+
else if (word === 'false') { tokens.push({ type: 'boolean', value: false }); }
|
|
58
|
+
else if (word === 'prior_stage' && expr[j] === '(') {
|
|
59
|
+
// Parse prior_stage('slug').field
|
|
60
|
+
const closeQuote = expr.indexOf(')', j);
|
|
61
|
+
const inner = expr.slice(j + 1, closeQuote).trim().replace(/^['"]|['"]$/g, '');
|
|
62
|
+
let k = closeQuote + 1;
|
|
63
|
+
// Expect .field
|
|
64
|
+
if (expr[k] !== '.') throw new Error("policy-gate: expected '.' after prior_stage(...)");
|
|
65
|
+
let m = k + 1;
|
|
66
|
+
while (m < expr.length && /[A-Za-z0-9_.]/.test(expr[m])) m++;
|
|
67
|
+
tokens.push({ type: 'ref', kind: 'prior_stage', stage: inner, path: expr.slice(k + 1, m) });
|
|
68
|
+
i = m; continue;
|
|
69
|
+
} else {
|
|
70
|
+
tokens.push({ type: 'ref', kind: 'path', path: word });
|
|
71
|
+
}
|
|
72
|
+
i = j; continue;
|
|
73
|
+
}
|
|
74
|
+
throw new Error(`policy-gate: unexpected character "${ch}" at ${i}`);
|
|
75
|
+
}
|
|
76
|
+
return tokens;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function resolveRef(token, ctx) {
|
|
80
|
+
if (token.kind === 'prior_stage') {
|
|
81
|
+
return readPath(ctx.context?.[token.stage], token.path);
|
|
82
|
+
}
|
|
83
|
+
// path like intake.email or stage_output.foo.bar
|
|
84
|
+
if (token.path.startsWith('intake.')) {
|
|
85
|
+
return readPath(ctx.intake, token.path.slice('intake.'.length));
|
|
86
|
+
}
|
|
87
|
+
if (token.path.startsWith('context.')) {
|
|
88
|
+
return readPath(ctx.context, token.path.slice('context.'.length));
|
|
89
|
+
}
|
|
90
|
+
return readPath(ctx, token.path);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function evalTokens(tokens, ctx) {
|
|
94
|
+
// Pratt-ish recursive descent. Grammar:
|
|
95
|
+
// expr := or
|
|
96
|
+
// or := and ('||' and)*
|
|
97
|
+
// and := cmp ('&&' cmp)*
|
|
98
|
+
// cmp := value (op value)?
|
|
99
|
+
// | value IN '[' values ']'
|
|
100
|
+
// value := ref | number | string | boolean | '(' or ')'
|
|
101
|
+
let pos = 0;
|
|
102
|
+
function peek() { return tokens[pos]; }
|
|
103
|
+
function consume(type) {
|
|
104
|
+
const t = tokens[pos];
|
|
105
|
+
if (!t || t.type !== type) throw new Error(`policy-gate: expected ${type}, got ${t?.type || 'EOF'}`);
|
|
106
|
+
pos++;
|
|
107
|
+
return t;
|
|
108
|
+
}
|
|
109
|
+
function value() {
|
|
110
|
+
const t = peek();
|
|
111
|
+
if (!t) throw new Error('policy-gate: unexpected end of expression');
|
|
112
|
+
if (t.type === '(') { pos++; const e = or(); consume(')'); return e; }
|
|
113
|
+
if (t.type === 'number' || t.type === 'string' || t.type === 'boolean') {
|
|
114
|
+
pos++;
|
|
115
|
+
return t.value;
|
|
116
|
+
}
|
|
117
|
+
if (t.type === 'ref') {
|
|
118
|
+
pos++;
|
|
119
|
+
return resolveRef(t, ctx);
|
|
120
|
+
}
|
|
121
|
+
throw new Error(`policy-gate: unexpected token ${t.type}`);
|
|
122
|
+
}
|
|
123
|
+
function cmp() {
|
|
124
|
+
const left = value();
|
|
125
|
+
const t = peek();
|
|
126
|
+
if (!t) return Boolean(left);
|
|
127
|
+
if (t.type === 'op') {
|
|
128
|
+
pos++;
|
|
129
|
+
const right = value();
|
|
130
|
+
switch (t.value) {
|
|
131
|
+
case '==': return left == right; // eslint-disable-line eqeqeq
|
|
132
|
+
case '!=': return left != right; // eslint-disable-line eqeqeq
|
|
133
|
+
case '<': return Number(left) < Number(right);
|
|
134
|
+
case '<=': return Number(left) <= Number(right);
|
|
135
|
+
case '>': return Number(left) > Number(right);
|
|
136
|
+
case '>=': return Number(left) >= Number(right);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (t.type === 'IN') {
|
|
140
|
+
pos++;
|
|
141
|
+
consume('[');
|
|
142
|
+
const list = [];
|
|
143
|
+
while (peek() && peek().type !== ']') {
|
|
144
|
+
const v = value();
|
|
145
|
+
list.push(v);
|
|
146
|
+
if (peek() && peek().type === ',') pos++;
|
|
147
|
+
}
|
|
148
|
+
consume(']');
|
|
149
|
+
return list.includes(left);
|
|
150
|
+
}
|
|
151
|
+
return Boolean(left);
|
|
152
|
+
}
|
|
153
|
+
function and() {
|
|
154
|
+
let left = cmp();
|
|
155
|
+
while (peek() && peek().type === '&&') { pos++; const right = cmp(); left = Boolean(left) && Boolean(right); }
|
|
156
|
+
return left;
|
|
157
|
+
}
|
|
158
|
+
function or() {
|
|
159
|
+
let left = and();
|
|
160
|
+
while (peek() && peek().type === '||') { pos++; const right = and(); left = Boolean(left) || Boolean(right); }
|
|
161
|
+
return left;
|
|
162
|
+
}
|
|
163
|
+
const result = or();
|
|
164
|
+
if (pos !== tokens.length) throw new Error(`policy-gate: unexpected trailing token at ${pos}`);
|
|
165
|
+
return result;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// DEPRECATED — evaluate a legacy string-DSL rule. Returns { result, error }.
|
|
169
|
+
export function evaluateRule(rule, { intake, context }) {
|
|
170
|
+
if (!rule || typeof rule !== 'string') return { result: true, error: null };
|
|
171
|
+
try {
|
|
172
|
+
const tokens = tokenize(rule);
|
|
173
|
+
const result = Boolean(evalTokens(tokens, { intake, context }));
|
|
174
|
+
return { result, error: null };
|
|
175
|
+
} catch (err) {
|
|
176
|
+
return { result: false, error: err?.message || String(err) };
|
|
177
|
+
}
|
|
178
|
+
}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
// lib/process/stages/policy-gate.js — handler for policy_gate stages.
|
|
2
2
|
//
|
|
3
3
|
// Evaluates declarative rules against the case's intake + accumulated context.
|
|
4
|
-
//
|
|
5
|
-
// -
|
|
6
|
-
// -
|
|
7
|
-
//
|
|
8
|
-
// -
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
// - Membership: <left> IN [<lit>, <lit>, ...]
|
|
4
|
+
// Each entry in `config.rules` is one of:
|
|
5
|
+
// - a JSON predicate → `../policy-predicates.js` (the canonical form)
|
|
6
|
+
// - a string expression → legacy DSL (`./policy-dsl-legacy.js`, deprecated,
|
|
7
|
+
// kept one release for back-compat; routed per-rule)
|
|
8
|
+
// - { expr, label } → legacy DSL wrapper
|
|
9
|
+
//
|
|
10
|
+
// All rules must pass (implicit AND across the array) for the gate to pass.
|
|
12
11
|
//
|
|
13
12
|
// Outcomes:
|
|
14
13
|
// - rules all pass → kind=pass
|
|
@@ -17,166 +16,25 @@
|
|
|
17
16
|
// downstream human_approval handles this)
|
|
18
17
|
|
|
19
18
|
import { createApprovalRequest } from '../../approvals.js';
|
|
19
|
+
import { evaluatePredicateSafe, isPredicateRule, describePredicate } from '../policy-predicates.js';
|
|
20
|
+
import { evaluateRule } from './policy-dsl-legacy.js';
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function tokenize(expr) {
|
|
27
|
-
const tokens = [];
|
|
28
|
-
let i = 0;
|
|
29
|
-
while (i < expr.length) {
|
|
30
|
-
const ch = expr[i];
|
|
31
|
-
if (/\s/.test(ch)) { i++; continue; }
|
|
32
|
-
if (ch === '(' || ch === ')' || ch === '[' || ch === ']' || ch === ',') {
|
|
33
|
-
tokens.push({ type: ch }); i++; continue;
|
|
34
|
-
}
|
|
35
|
-
if (ch === '&' && expr[i + 1] === '&') { tokens.push({ type: '&&' }); i += 2; continue; }
|
|
36
|
-
if (ch === '|' && expr[i + 1] === '|') { tokens.push({ type: '||' }); i += 2; continue; }
|
|
37
|
-
if (ch === '=' && expr[i + 1] === '=') { tokens.push({ type: 'op', value: '==' }); i += 2; continue; }
|
|
38
|
-
if (ch === '!' && expr[i + 1] === '=') { tokens.push({ type: 'op', value: '!=' }); i += 2; continue; }
|
|
39
|
-
if (ch === '<' && expr[i + 1] === '=') { tokens.push({ type: 'op', value: '<=' }); i += 2; continue; }
|
|
40
|
-
if (ch === '>' && expr[i + 1] === '=') { tokens.push({ type: 'op', value: '>=' }); i += 2; continue; }
|
|
41
|
-
if (ch === '<' || ch === '>') { tokens.push({ type: 'op', value: ch }); i++; continue; }
|
|
42
|
-
if (ch === "'" || ch === '"') {
|
|
43
|
-
const end = expr.indexOf(ch, i + 1);
|
|
44
|
-
if (end === -1) throw new Error(`policy-gate: unterminated string at ${i}`);
|
|
45
|
-
tokens.push({ type: 'string', value: expr.slice(i + 1, end) });
|
|
46
|
-
i = end + 1; continue;
|
|
47
|
-
}
|
|
48
|
-
if (/[0-9.]/.test(ch)) {
|
|
49
|
-
let j = i;
|
|
50
|
-
while (j < expr.length && /[0-9.]/.test(expr[j])) j++;
|
|
51
|
-
tokens.push({ type: 'number', value: Number(expr.slice(i, j)) });
|
|
52
|
-
i = j; continue;
|
|
53
|
-
}
|
|
54
|
-
if (/[A-Za-z_]/.test(ch)) {
|
|
55
|
-
let j = i;
|
|
56
|
-
while (j < expr.length && /[A-Za-z0-9_.]/.test(expr[j])) j++;
|
|
57
|
-
const word = expr.slice(i, j);
|
|
58
|
-
if (word === 'IN' || word === 'in') { tokens.push({ type: 'IN' }); }
|
|
59
|
-
else if (word === 'true') { tokens.push({ type: 'boolean', value: true }); }
|
|
60
|
-
else if (word === 'false') { tokens.push({ type: 'boolean', value: false }); }
|
|
61
|
-
else if (word === 'prior_stage' && expr[j] === '(') {
|
|
62
|
-
// Parse prior_stage('slug').field
|
|
63
|
-
const closeQuote = expr.indexOf(')', j);
|
|
64
|
-
const inner = expr.slice(j + 1, closeQuote).trim().replace(/^['"]|['"]$/g, '');
|
|
65
|
-
let k = closeQuote + 1;
|
|
66
|
-
// Expect .field
|
|
67
|
-
if (expr[k] !== '.') throw new Error("policy-gate: expected '.' after prior_stage(...)");
|
|
68
|
-
let m = k + 1;
|
|
69
|
-
while (m < expr.length && /[A-Za-z0-9_.]/.test(expr[m])) m++;
|
|
70
|
-
tokens.push({ type: 'ref', kind: 'prior_stage', stage: inner, path: expr.slice(k + 1, m) });
|
|
71
|
-
i = m; continue;
|
|
72
|
-
} else {
|
|
73
|
-
tokens.push({ type: 'ref', kind: 'path', path: word });
|
|
74
|
-
}
|
|
75
|
-
i = j; continue;
|
|
76
|
-
}
|
|
77
|
-
throw new Error(`policy-gate: unexpected character "${ch}" at ${i}`);
|
|
78
|
-
}
|
|
79
|
-
return tokens;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
function resolveRef(token, ctx) {
|
|
83
|
-
if (token.kind === 'prior_stage') {
|
|
84
|
-
return readPath(ctx.context?.[token.stage], token.path);
|
|
85
|
-
}
|
|
86
|
-
// path like intake.email or stage_output.foo.bar
|
|
87
|
-
if (token.path.startsWith('intake.')) {
|
|
88
|
-
return readPath(ctx.intake, token.path.slice('intake.'.length));
|
|
89
|
-
}
|
|
90
|
-
if (token.path.startsWith('context.')) {
|
|
91
|
-
return readPath(ctx.context, token.path.slice('context.'.length));
|
|
92
|
-
}
|
|
93
|
-
return readPath(ctx, token.path);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
function evalTokens(tokens, ctx) {
|
|
97
|
-
// Pratt-ish recursive descent. Grammar:
|
|
98
|
-
// expr := or
|
|
99
|
-
// or := and ('||' and)*
|
|
100
|
-
// and := cmp ('&&' cmp)*
|
|
101
|
-
// cmp := value (op value)?
|
|
102
|
-
// | value IN '[' values ']'
|
|
103
|
-
// value := ref | number | string | boolean | '(' or ')'
|
|
104
|
-
let pos = 0;
|
|
105
|
-
function peek() { return tokens[pos]; }
|
|
106
|
-
function consume(type) {
|
|
107
|
-
const t = tokens[pos];
|
|
108
|
-
if (!t || t.type !== type) throw new Error(`policy-gate: expected ${type}, got ${t?.type || 'EOF'}`);
|
|
109
|
-
pos++;
|
|
110
|
-
return t;
|
|
111
|
-
}
|
|
112
|
-
function value() {
|
|
113
|
-
const t = peek();
|
|
114
|
-
if (!t) throw new Error('policy-gate: unexpected end of expression');
|
|
115
|
-
if (t.type === '(') { pos++; const e = or(); consume(')'); return e; }
|
|
116
|
-
if (t.type === 'number' || t.type === 'string' || t.type === 'boolean') {
|
|
117
|
-
pos++;
|
|
118
|
-
return t.value;
|
|
119
|
-
}
|
|
120
|
-
if (t.type === 'ref') {
|
|
121
|
-
pos++;
|
|
122
|
-
return resolveRef(t, ctx);
|
|
123
|
-
}
|
|
124
|
-
throw new Error(`policy-gate: unexpected token ${t.type}`);
|
|
125
|
-
}
|
|
126
|
-
function cmp() {
|
|
127
|
-
const left = value();
|
|
128
|
-
const t = peek();
|
|
129
|
-
if (!t) return Boolean(left);
|
|
130
|
-
if (t.type === 'op') {
|
|
131
|
-
pos++;
|
|
132
|
-
const right = value();
|
|
133
|
-
switch (t.value) {
|
|
134
|
-
case '==': return left == right; // eslint-disable-line eqeqeq
|
|
135
|
-
case '!=': return left != right; // eslint-disable-line eqeqeq
|
|
136
|
-
case '<': return Number(left) < Number(right);
|
|
137
|
-
case '<=': return Number(left) <= Number(right);
|
|
138
|
-
case '>': return Number(left) > Number(right);
|
|
139
|
-
case '>=': return Number(left) >= Number(right);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
if (t.type === 'IN') {
|
|
143
|
-
pos++;
|
|
144
|
-
consume('[');
|
|
145
|
-
const list = [];
|
|
146
|
-
while (peek() && peek().type !== ']') {
|
|
147
|
-
const v = value();
|
|
148
|
-
list.push(v);
|
|
149
|
-
if (peek() && peek().type === ',') pos++;
|
|
150
|
-
}
|
|
151
|
-
consume(']');
|
|
152
|
-
return list.includes(left);
|
|
153
|
-
}
|
|
154
|
-
return Boolean(left);
|
|
155
|
-
}
|
|
156
|
-
function and() {
|
|
157
|
-
let left = cmp();
|
|
158
|
-
while (peek() && peek().type === '&&') { pos++; const right = cmp(); left = Boolean(left) && Boolean(right); }
|
|
159
|
-
return left;
|
|
160
|
-
}
|
|
161
|
-
function or() {
|
|
162
|
-
let left = and();
|
|
163
|
-
while (peek() && peek().type === '||') { pos++; const right = and(); left = Boolean(left) || Boolean(right); }
|
|
164
|
-
return left;
|
|
165
|
-
}
|
|
166
|
-
const result = or();
|
|
167
|
-
if (pos !== tokens.length) throw new Error(`policy-gate: unexpected trailing token at ${pos}`);
|
|
168
|
-
return result;
|
|
169
|
-
}
|
|
22
|
+
// Re-exported for back-compat: tests and any callers still importing the
|
|
23
|
+
// legacy string-DSL evaluator from this module keep working during the
|
|
24
|
+
// deprecation window.
|
|
25
|
+
export { evaluateRule };
|
|
170
26
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
const result =
|
|
176
|
-
return { result, error:
|
|
177
|
-
} catch (err) {
|
|
178
|
-
return { result: false, error: err?.message || String(err) };
|
|
27
|
+
// Evaluate one rule entry — predicate JSON or legacy string — returning a
|
|
28
|
+
// uniform { result, error, label } record for the trace.
|
|
29
|
+
function evaluateRuleEntry(rule, ctx) {
|
|
30
|
+
if (isPredicateRule(rule)) {
|
|
31
|
+
const { result, error } = evaluatePredicateSafe(rule, ctx);
|
|
32
|
+
return { result, error, label: rule.label || describePredicate(rule) };
|
|
179
33
|
}
|
|
34
|
+
const expr = typeof rule === 'string' ? rule : rule?.expr;
|
|
35
|
+
const label = typeof rule === 'string' ? rule : (rule?.label || rule?.expr);
|
|
36
|
+
const { result, error } = evaluateRule(expr, ctx);
|
|
37
|
+
return { result, error, label };
|
|
180
38
|
}
|
|
181
39
|
|
|
182
40
|
export async function executeStage({ case: c, stage }) {
|
|
@@ -187,9 +45,7 @@ export async function executeStage({ case: c, stage }) {
|
|
|
187
45
|
const trace = [];
|
|
188
46
|
let allPass = true;
|
|
189
47
|
for (const rule of rules) {
|
|
190
|
-
const
|
|
191
|
-
const label = typeof rule === 'string' ? rule : (rule?.label || rule?.expr);
|
|
192
|
-
const { result, error } = evaluateRule(expr, { intake, context });
|
|
48
|
+
const { result, error, label } = evaluateRuleEntry(rule, { intake, context });
|
|
193
49
|
trace.push({ rule: label, result, error });
|
|
194
50
|
if (!result) allPass = false;
|
|
195
51
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "madarx",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.15.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Madarx OS — Next.js product with SQLite-backed runtime, scheduled cron daemon, and approval-gated local runners.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"hermes:job": "node --no-warnings --env-file-if-exists=.env.local scripts/hermes-job-runner.mjs",
|
|
57
57
|
"whatsapp:bridge": "node --no-warnings --env-file-if-exists=.env.local scripts/whatsapp-daemon.mjs",
|
|
58
58
|
"whatsapp:once": "WHATSAPP_DAEMON_ONCE=1 node --no-warnings --env-file-if-exists=.env.local scripts/whatsapp-daemon.mjs",
|
|
59
|
-
"whatsapp:reset": "node -
|
|
59
|
+
"whatsapp:reset": "node --no-warnings --env-file-if-exists=.env.local scripts/whatsapp-reset.mjs",
|
|
60
60
|
"smoke:routes": "node --no-warnings scripts/smoke-routes.mjs",
|
|
61
61
|
"vendor:open-design": "node --no-warnings scripts/vendor-open-design.mjs",
|
|
62
62
|
"check:disk-enc": "node --no-warnings scripts/check-disk-encryption.mjs",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4119],{94119:(e,s,a)=>{a.d(s,{A:()=>r});var t=a(95155),n=a(12115),i=a(52769);let l=[["pairing","Pairing","Bridge status + QR"],["allowlist","Allowlist","Permitted senders"],["messages","Messages","Inbound + outbound"],["send","Send","Manual message"]];async function c(e,s){let a=await fetch(e,s),t=await a.text();try{return{ok:a.ok,status:a.status,json:t?JSON.parse(t):null}}catch(e){return{ok:a.ok,status:a.status,json:null,text:t}}}function r(){var e;let[s,a]=(0,n.useState)("pairing"),[r,d]=(0,n.useState)(null),[o,h]=(0,n.useState)(null),[p,u]=(0,n.useState)(""),[m,x]=(0,n.useState)([]),[j,g]=(0,n.useState)(null),[v,f]=(0,n.useState)(""),[b,w]=(0,n.useState)(""),[N,y]=(0,n.useState)(!1),[S,k]=(0,n.useState)(""),[_,C]=(0,n.useState)(null),[A,D]=(0,n.useState)(!1),[R,T]=(0,n.useState)(!1),[q,W]=(0,n.useState)(""),[L,P]=(0,n.useState)(""),[O,X]=(0,n.useState)(!1),[E,I]=(0,n.useState)(""),[z,F]=(0,n.useState)(!1),M=(0,n.useCallback)(async()=>{try{var e;let[s,a,t]=await Promise.all([c("/api/whatsapp/status"),c("/api/whatsapp/qr"),c("/api/whatsapp/messages?limit=50")]);d(s.json),h(a.json),x((null==(e=t.json)?void 0:e.messages)||[]),g(null)}catch(e){g(e.message)}},[]);(0,n.useEffect)(()=>{M();let e=setInterval(M,3500);return()=>clearInterval(e)},[M]),(0,n.useEffect)(()=>{let e=!1;return async function(){if((null==o?void 0:o.paired)||!(null==o?void 0:o.qr))return u("");try{let s=await i.toDataURL(o.qr,{margin:1,width:220,errorCorrectionLevel:"M"});e||u(s)}catch(s){e||u("")}}(),()=>{e=!0}},[o]);let Q=(null==r?void 0:r.health)||{},B=(null==r?void 0:r.allowlist)||[],J=Q.pairing_state||(!1===Q.ok?"offline":"unknown"),U=Q.last_connected_at?new Date(Q.last_connected_at).toLocaleTimeString():"—",Y=(0,n.useMemo)(()=>(0,t.jsx)("p",{className:"whatsapp-warn-copy",children:"Pair only a dedicated WhatsApp number, not your personal account. Baileys is an unofficial WhatsApp Web client and the paired account can be banned."}),[]);async function G(e){if(e.preventDefault(),!v.trim())return;y(!0),k("");let s=await c("/api/whatsapp/allowlist",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({chat_id:v.trim(),label:b.trim()||null})});if(y(!1),!s.ok){var a;k((null==(a=s.json)?void 0:a.error)||"Failed to add");return}f(""),w(""),M()}async function H(e){var s;C(e);let a=await c("/api/whatsapp/allowlist?chat_id=".concat(encodeURIComponent(e)),{method:"DELETE"});C(null),a.ok?M():g((null==(s=a.json)?void 0:s.error)||"Failed to remove")}async function K(){D(!0),g(null);let e=await c("/api/whatsapp/disconnect",{method:"POST"});if(D(!1),T(!1),!e.ok){var s;g((null==(s=e.json)?void 0:s.error)||"Failed to disconnect");return}M()}async function V(e){if(e.preventDefault(),!q.trim()||!L.trim())return;X(!0),I(""),F(!1);let s=await c("/api/whatsapp/send",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({chat_id:q.trim(),text:L.trim()})});if(X(!1),!s.ok){var a;I((null==(a=s.json)?void 0:a.error)||"Failed to send");return}P(""),F(!0),M()}return(0,t.jsxs)("div",{className:"wa-section",children:[(0,t.jsxs)("div",{className:"wa-status-row",children:[(0,t.jsx)("span",{className:"admin-pill ".concat("paired"===J?"ready":"qr_required"===J||"reconnecting"===J||"starting"===J?"warn":"danger"),children:"paired"===J?"Connected":"qr_required"===J?"Awaiting QR scan":"reconnecting"===J?"Reconnecting":"logged_out"===J?"Logged out — reset session":"starting"===J?"Starting":"Bridge offline"}),Q.user&&(0,t.jsx)("span",{className:"wa-status-user",children:Q.user})]}),j&&(0,t.jsx)("div",{className:"wa-error-banner",children:j}),(0,t.jsx)("nav",{className:"tools-subnav",role:"tablist","aria-label":"WhatsApp sections",children:l.map(e=>{let[n,i,l]=e;return(0,t.jsxs)("button",{type:"button",role:"tab","aria-selected":s===n,className:"tools-subnav-pill"+(s===n?" on":""),onClick:()=>a(n),children:[(0,t.jsx)("b",{children:i}),(0,t.jsx)("small",{children:l})]},n)})}),"pairing"===s&&(0,t.jsxs)("div",{className:"tools-pane",children:[(0,t.jsxs)("div",{className:"wa-stats-row",children:[(0,t.jsxs)("div",{className:"wa-stat",children:[(0,t.jsx)("span",{className:"wa-stat-label",children:"Paired account"}),(0,t.jsx)("span",{className:"wa-stat-value",children:Q.user||"—"})]}),(0,t.jsxs)("div",{className:"wa-stat",children:[(0,t.jsx)("span",{className:"wa-stat-label",children:"Bridge queue"}),(0,t.jsx)("span",{className:"wa-stat-value",children:null!=(e=Q.queue_size)?e:0})]}),(0,t.jsxs)("div",{className:"wa-stat",children:[(0,t.jsx)("span",{className:"wa-stat-label",children:"Last connected"}),(0,t.jsx)("span",{className:"wa-stat-value",children:U})]})]}),Q.last_error&&(0,t.jsx)("div",{className:"wa-error-banner",children:Q.last_error}),"paired"!==J?(0,t.jsxs)("div",{className:"config-secrets-panel",style:{marginTop:0},children:[(0,t.jsxs)("div",{className:"config-secrets-head",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"config-section-title",children:"logged_out"===J?"Session logged out":"Pair device"}),(0,t.jsx)("p",{children:"logged_out"===J?"WhatsApp unlinked this device server-side, so the stale credentials block a fresh QR. Reset the session to wipe them and generate a new pairing code.":"Open WhatsApp → Settings → Linked Devices → Link a Device, then scan the code."})]}),"logged_out"===J&&(R?(0,t.jsxs)("div",{className:"wa-disconnect-confirm",children:[(0,t.jsx)("button",{type:"button",className:"secrets-action-btn danger",onClick:K,disabled:A,children:A?"Resetting…":"Confirm reset"}),(0,t.jsx)("button",{type:"button",className:"secrets-action-btn",onClick:()=>T(!1),disabled:A,children:"Cancel"})]}):(0,t.jsx)("button",{type:"button",className:"secrets-action-btn danger",onClick:()=>T(!0),disabled:A,children:"Reset session"}))]}),"logged_out"===J?(0,t.jsx)("div",{className:"whatsapp-pair-copy",children:Y}):(0,t.jsxs)("div",{className:"whatsapp-pair-row",children:[p?(0,t.jsx)("div",{className:"whatsapp-qr-box",children:(0,t.jsx)("img",{src:p,alt:"WhatsApp pairing QR code",width:220,height:220})}):(0,t.jsx)("div",{className:"whatsapp-qr-pending",children:"Waiting for QR — make sure the daemon is running."}),(0,t.jsxs)("div",{className:"whatsapp-pair-copy",children:[(0,t.jsxs)("p",{children:["Code rotates roughly every 20 seconds. The dashboard re-fetches automatically. The session is saved at ",(0,t.jsx)("code",{children:"data/whatsapp/session/"}),"."]}),Y]})]})]}):(0,t.jsxs)("div",{className:"config-secrets-panel",style:{marginTop:0},children:[(0,t.jsxs)("div",{className:"config-secrets-head",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"config-section-title",children:"Bridge is paired"}),(0,t.jsx)("p",{children:"The WhatsApp session is active. Allowlisted senders can message this agent directly."})]}),R?(0,t.jsxs)("div",{className:"wa-disconnect-confirm",children:[(0,t.jsx)("button",{type:"button",className:"secrets-action-btn danger",onClick:K,disabled:A,children:A?"Disconnecting...":"Confirm disconnect"}),(0,t.jsx)("button",{type:"button",className:"secrets-action-btn",onClick:()=>T(!1),disabled:A,children:"Cancel"})]}):(0,t.jsx)("button",{type:"button",className:"secrets-action-btn danger",onClick:()=>T(!0),disabled:A,children:"Disconnect"})]}),R&&(0,t.jsx)("p",{className:"whatsapp-warn-copy",children:"Unlinks this device from WhatsApp and wipes the local session. You will need to scan a new QR code to reconnect."}),Y]})]}),"allowlist"===s&&(0,t.jsx)("div",{className:"tools-pane",children:(0,t.jsxs)("div",{className:"config-secrets-panel",children:[(0,t.jsx)("div",{className:"config-secrets-head",children:(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"config-section-title",children:"Allowed senders"}),(0,t.jsx)("p",{children:"Only chats on this list can message the agent. Add new entries below."})]})}),(0,t.jsxs)("form",{className:"secrets-add-form",onSubmit:G,children:[(0,t.jsxs)("div",{className:"secrets-add-fields",children:[(0,t.jsxs)("label",{className:"config-env-field",children:[(0,t.jsx)("span",{className:"config-env-field-top",children:(0,t.jsx)("b",{children:"Chat id"})}),(0,t.jsx)("input",{type:"text",autoComplete:"off",placeholder:"9715XXXXXXXX or full JID",value:v,onChange:e=>f(e.target.value),required:!0})]}),(0,t.jsxs)("label",{className:"config-env-field",children:[(0,t.jsxs)("span",{className:"config-env-field-top",children:[(0,t.jsx)("b",{children:"Label"}),(0,t.jsx)("em",{style:{fontStyle:"normal",fontSize:"10px",color:"#68707b",background:"transparent",padding:0},children:"optional"})]}),(0,t.jsx)("input",{type:"text",autoComplete:"off",placeholder:"e.g. Founder phone",value:b,onChange:e=>w(e.target.value)})]})]}),(0,t.jsxs)("div",{className:"secrets-add-footer",children:[S&&(0,t.jsx)("span",{className:"secrets-error",children:S}),(0,t.jsx)("button",{type:"submit",className:"config-save-btn",disabled:N||!v.trim(),children:N?"Adding...":"Add to allowlist"})]})]}),0===B.length?(0,t.jsx)("div",{className:"allowlists-entries-empty",children:"No senders allowlisted — all inbound messages are dropped. Add at least one chat id above."}):(0,t.jsx)("div",{className:"config-tools-list",children:B.map(e=>(0,t.jsx)("div",{className:"config-tool-row on",children:(0,t.jsxs)("div",{className:"secrets-row-inner",children:[(0,t.jsxs)("div",{className:"secrets-row-meta",children:[(0,t.jsxs)("div",{className:"config-tool-titleline",children:[(0,t.jsx)("span",{className:"config-tool-name",style:{textTransform:"none"},children:(0,t.jsx)("code",{className:"whatsapp-mono",children:e.chat_id})}),e.kind&&(0,t.jsx)("span",{className:"config-tool-risk",children:e.kind})]}),(e.label||e.created_at)&&(0,t.jsxs)("div",{className:"config-tool-status",children:[e.label&&(0,t.jsx)("span",{children:e.label}),e.created_at&&(0,t.jsx)("span",{children:new Date(e.created_at).toLocaleString()})]})]}),(0,t.jsx)("div",{className:"secrets-row-actions",children:(0,t.jsx)("button",{type:"button",className:"secrets-action-btn danger",disabled:_===e.chat_id,onClick:()=>H(e.chat_id),children:_===e.chat_id?"...":"Remove"})})]})},e.chat_id))})]})}),"messages"===s&&(0,t.jsx)("div",{className:"tools-pane",children:(0,t.jsxs)("div",{className:"config-secrets-panel",children:[(0,t.jsx)("div",{className:"config-secrets-head",children:(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"config-section-title",children:"Recent messages"}),(0,t.jsxs)("p",{children:[m.length," of last 50 inbound + outbound."]})]})}),0===m.length?(0,t.jsx)("div",{className:"secrets-empty",children:"No messages yet. Inbound and outbound traffic from the bridge will appear here."}):(0,t.jsx)("div",{style:{overflowX:"auto"},children:(0,t.jsxs)("table",{className:"admin-table",style:{minWidth:520},children:[(0,t.jsx)("thead",{children:(0,t.jsxs)("tr",{children:[(0,t.jsx)("th",{children:"When"}),(0,t.jsx)("th",{children:"Dir"}),(0,t.jsx)("th",{children:"Chat"}),(0,t.jsx)("th",{children:"Sender"}),(0,t.jsx)("th",{children:"Text"})]})}),(0,t.jsx)("tbody",{children:m.map(e=>(0,t.jsxs)("tr",{children:[(0,t.jsx)("td",{style:{whiteSpace:"nowrap"},children:new Date(e.created_at).toLocaleTimeString()}),(0,t.jsx)("td",{children:(0,t.jsx)("span",{className:"admin-pill ".concat("inbound"===e.direction?"warn":"ready"),children:e.direction})}),(0,t.jsx)("td",{children:(0,t.jsx)("code",{className:"whatsapp-mono",children:e.chat_id})}),(0,t.jsx)("td",{children:(0,t.jsx)("code",{className:"whatsapp-mono",children:e.sender||"—"})}),(0,t.jsx)("td",{style:{maxWidth:260,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.text})]},e.id))})]})})]})}),"send"===s&&(0,t.jsx)("div",{className:"tools-pane",children:(0,t.jsxs)("div",{className:"config-secrets-panel",children:[(0,t.jsx)("div",{className:"config-secrets-head",children:(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"config-section-title",children:"Send a message"}),(0,t.jsx)("p",{children:"Manual outbound send. Logs to whatsapp_messages with an audit row."})]})}),(0,t.jsxs)("form",{className:"secrets-add-form",onSubmit:V,children:[(0,t.jsxs)("div",{className:"secrets-add-fields",children:[(0,t.jsxs)("label",{className:"config-env-field",children:[(0,t.jsx)("span",{className:"config-env-field-top",children:(0,t.jsx)("b",{children:"Chat id"})}),(0,t.jsx)("input",{type:"text",autoComplete:"off",placeholder:"Digits or full JID",value:q,onChange:e=>{W(e.target.value),F(!1)},required:!0})]}),(0,t.jsxs)("label",{className:"config-env-field",children:[(0,t.jsx)("span",{className:"config-env-field-top",children:(0,t.jsx)("b",{children:"Message"})}),(0,t.jsx)("textarea",{rows:4,placeholder:"Plain text only",value:L,onChange:e=>{P(e.target.value),F(!1)},required:!0,style:{resize:"vertical",fontFamily:"inherit",fontSize:"13px",padding:"8px 10px",borderRadius:8,border:"1px solid rgba(17,19,24,.12)",outline:"none",width:"100%",boxSizing:"border-box"}})]})]}),(0,t.jsxs)("div",{className:"secrets-add-footer",children:[E&&(0,t.jsx)("span",{className:"secrets-error",children:E}),z&&(0,t.jsx)("span",{style:{fontSize:12,color:"#2d7044",fontWeight:650},children:"Sent"}),(0,t.jsx)("button",{type:"submit",className:"config-save-btn",disabled:O||!q.trim()||!L.trim(),children:O?"Sending...":"Send message"})]})]})]})})]})}}}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[893],{45:(e,a,t)=>{"use strict";t.d(a,{default:()=>o});var s=t(12115),n={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"},l=t(64250);let r=(0,s.createContext)({}),o=(0,s.forwardRef)((e,a)=>{var t,o,c;let{color:i,size:d,strokeWidth:u,absoluteStrokeWidth:m,className:h="",children:p,iconNode:f,...j}=e,{size:x=24,strokeWidth:g=2,absoluteStrokeWidth:v=!1,color:b="currentColor",className:y=""}=null!=(t=(0,s.useContext)(r))?t:{},k=(null!=m?m:v)?24*Number(null!=u?u:g)/Number(null!=d?d:x):null!=u?u:g;return(0,s.createElement)("svg",{ref:a,...n,width:null!=(o=null!=d?d:x)?o:n.width,height:null!=(c=null!=d?d:x)?c:n.height,stroke:null!=i?i:b,strokeWidth:k,className:(0,l.z)("lucide",y,h),...!p&&!(e=>{for(let a in e)if(a.startsWith("aria-")||"role"===a||"title"===a)return!0;return!1})(j)&&{"aria-hidden":"true"},...j},[...f.map(e=>{let[a,t]=e;return(0,s.createElement)(a,t)}),...Array.isArray(p)?p:[p]])})},10677:(e,a,t)=>{"use strict";t.d(a,{default:()=>l});var s=t(95155),n=t(12115);function l(){let[e,a]=(0,n.useState)([]),[t,l]=(0,n.useState)("");return(0,n.useEffect)(()=>{l(localStorage.getItem("madarx.activeProjectId")||""),fetch("/api/projects").then(e=>e.json()).then(e=>a(e.projects||[])).catch(()=>{})},[]),(0,s.jsx)("div",{className:"project-switcher","data-project-switcher":!0,children:(0,s.jsxs)("select",{value:t,onChange:e=>{var a;l(a=e.target.value),a?localStorage.setItem("madarx.activeProjectId",a):localStorage.removeItem("madarx.activeProjectId"),window.dispatchEvent(new CustomEvent("madarx:project-change",{detail:{project_id:a||null}}))},"aria-label":"Active project",children:[(0,s.jsx)("option",{value:"",children:"All projects"}),e.map(e=>(0,s.jsx)("option",{value:e.id,children:e.name},e.id))]})})}},13185:(e,a,t)=>{"use strict";t.d(a,{A:()=>o});var s=t(12115),n=t(64250);let l=e=>{let a=e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,a,t)=>t?t.toUpperCase():a.toLowerCase());return a.charAt(0).toUpperCase()+a.slice(1)};var r=t(45);let o=(e,a)=>{let t=(0,s.forwardRef)((t,o)=>{let{className:c,...i}=t;return(0,s.createElement)(r.default,{ref:o,iconNode:a,className:(0,n.z)("lucide-".concat(l(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()),"lucide-".concat(e),c),...i})});return t.displayName=l(e),t}},30926:(e,a,t)=>{"use strict";Object.defineProperty(a,"__esModule",{value:!0}),!function(e,a){for(var t in a)Object.defineProperty(e,t,{enumerable:!0,get:a[t]})}(a,{callServer:function(){return s.callServer},createServerReference:function(){return l.createServerReference},findSourceMapURL:function(){return n.findSourceMapURL}});let s=t(41209),n=t(85153),l=t(77197)},34788:(e,a,t)=>{"use strict";t.d(a,{A:()=>s});let s=(0,t(13185).A)("x",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]])},39230:(e,a,t)=>{"use strict";t.d(a,{default:()=>d});var s=t(95155),n=t(12115),l=t(47650),r=t(85649),o=t(30926);let c=(0,o.createServerReference)("40eef5ddc0668dac68deb5c8543ccb863ed3003f56",o.callServer,void 0,o.findSourceMapURL,"deleteProjectAction");function i(e){let{disabled:a}=e,{pending:t}=(0,l.useFormStatus)();return(0,s.jsx)("button",{type:"submit",className:"admin-button danger",disabled:t||a,"aria-busy":t?"true":void 0,children:t?"Deleting…":"Delete project"})}function d(e){let{projectId:a,projectName:t,projectSlug:l,isProtected:o}=e,[d,u]=n.useState(!1),[m,h]=n.useState("");if(o)return(0,s.jsxs)("span",{className:"admin-button secondary project-delete is-locked","aria-disabled":"true",title:"The Personal project is the default scope and cannot be deleted.",children:[(0,s.jsxs)("svg",{width:"11",height:"11",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",style:{marginRight:6,verticalAlign:"-1px"},children:[(0,s.jsx)("rect",{x:"3",y:"11",width:"18",height:"11",rx:"2"}),(0,s.jsx)("path",{d:"M7 11V7a5 5 0 0 1 10 0v4"})]}),"Protected"]});n.useEffect(()=>{d||h("")},[d]);let p=m.trim()===l;return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("button",{type:"button",className:"admin-button secondary project-delete",onClick:()=>u(!0),"aria-label":"Delete ".concat(t),children:"Delete"}),(0,s.jsx)(r.A,{open:d,onClose:()=>u(!1),eyebrow:"Delete project",title:"Delete ".concat(t,"?"),tone:"danger",children:(0,s.jsxs)("form",{className:"agents-modal-form",action:c,children:[(0,s.jsx)("input",{type:"hidden",name:"project_id",value:a}),(0,s.jsx)("p",{className:"agents-modal-help",children:"This removes the project, its agents, Disk files, memory, secrets, and audit history. The folder on your local drive is left untouched."}),(0,s.jsx)("section",{className:"agents-modal-section",children:(0,s.jsxs)("label",{className:"agents-modal-field wide",children:[(0,s.jsxs)("span",{children:["Type ",(0,s.jsx)("code",{className:"agents-modal-inline-code",children:l})," to confirm"]}),(0,s.jsx)("input",{type:"text",autoComplete:"off",spellCheck:!1,value:m,onChange:e=>h(e.target.value),placeholder:l,autoFocus:!0})]})}),(0,s.jsxs)("footer",{className:"agents-modal-foot",children:[(0,s.jsx)("button",{type:"button",className:"admin-button secondary",onClick:()=>u(!1),children:"Cancel"}),(0,s.jsx)(i,{disabled:!p})]})]})})]})}},59097:(e,a,t)=>{"use strict";t.d(a,{A:()=>l});var s=t(95155),n=t(12115);function l(e){let{name:a="folder_path",value:t,onChange:l,inputRef:r,placeholder:o="/Users/you/Documents/my-project"}=e,[c,i]=n.useState(null),[d,u]=n.useState(!1),[m,h]=n.useState(""),[p,f]=n.useState(""),[j,x]=n.useState(null);async function g(){var e;let a;if(i(null),!(null==(e=navigator.clipboard)?void 0:e.readText))return void i({kind:"error",message:"Clipboard not available."});try{a=await navigator.clipboard.readText()}catch(e){i({kind:"error",message:"Allow clipboard access."});return}let t=(a||"").trim();if((t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'"))&&(t=t.slice(1,-1)),t.startsWith("file://"))try{t=decodeURI(t.slice(7))}catch(e){}return t?t.startsWith("/")||t.startsWith("~")?void(l(t),i({kind:"success",message:"Pasted."})):void i({kind:"error",message:"Path must be absolute."}):void i({kind:"error",message:"Clipboard is empty."})}async function v(){i(null),x("pick");try{let e=await fetch("/api/fs/pick-folder",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({title:"Choose project folder",start_path:t&&t.startsWith("/")?t:void 0})});if(499===e.status)return void i({kind:"error",message:"Cancelled."});let a=await e.json();if(!e.ok)return void i({kind:"error",message:a.error||"Picker failed."});l(a.folder_path),i({kind:"success",message:"Selected ".concat(a.folder_path)})}catch(e){i({kind:"error",message:String((null==e?void 0:e.message)||e)})}finally{x(null)}}async function b(){if(i(null),!m.trim()||!p.trim())return void i({kind:"error",message:"Parent and name required."});x("create");try{let e=await fetch("/api/fs/create-folder",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({parent:m.trim(),name:p.trim()})}),a=await e.json();if(!e.ok)return void i({kind:"error",message:a.error||"Create failed."});l(a.folder_path),u(!1),f(""),i({kind:"success",message:"Created ".concat(a.folder_path)})}catch(e){i({kind:"error",message:String((null==e?void 0:e.message)||e)})}finally{x(null)}}return n.useEffect(()=>{d&&!m&&h(t||"~/Documents")},[d,t,m]),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("div",{className:"agents-modal-paste-row",children:[(0,s.jsx)("input",{ref:r,name:a,type:"text",placeholder:o,autoComplete:"off",spellCheck:!1,value:t||"",onChange:e=>{l(e.target.value),c&&i(null)},required:!0}),(0,s.jsx)("button",{type:"button",className:"admin-button secondary",onClick:v,disabled:"pick"===j,children:"pick"===j?"Opening…":"Choose folder…"})]}),(0,s.jsxs)("div",{className:"agents-modal-folder-tools",children:[(0,s.jsx)("button",{type:"button",className:"admin-button secondary",onClick:g,children:"Paste from clipboard"}),(0,s.jsx)("button",{type:"button",className:"admin-button secondary",onClick:()=>l("~/Documents"),children:"~/Documents"}),(0,s.jsx)("button",{type:"button",className:"admin-button secondary",onClick:()=>l("~/Desktop"),children:"~/Desktop"}),(0,s.jsx)("button",{type:"button",className:"admin-button secondary",onClick:()=>u(e=>!e),children:d?"Cancel new folder":"+ New folder"})]}),d?(0,s.jsxs)("div",{className:"agents-modal-create-folder",children:[(0,s.jsx)("small",{children:"Create a folder anywhere outside system directories. Parent must exist."}),(0,s.jsx)("div",{className:"agents-modal-create-row",children:(0,s.jsx)("input",{type:"text",placeholder:"Parent (e.g. ~/Documents)",value:m,onChange:e=>h(e.target.value),spellCheck:!1,autoComplete:"off"})}),(0,s.jsxs)("div",{className:"agents-modal-create-row",children:[(0,s.jsx)("input",{type:"text",placeholder:"New folder name",value:p,onChange:e=>f(e.target.value),spellCheck:!1,autoComplete:"off"}),(0,s.jsx)("button",{type:"button",className:"admin-button",onClick:b,disabled:"create"===j,children:"create"===j?"Creating…":"Create"})]})]}):null,c?(0,s.jsx)("p",{className:"agents-modal-feedback ".concat(c.kind),role:"status","aria-live":"polite",children:c.message}):null]})}},64250:(e,a,t)=>{"use strict";t.d(a,{z:()=>s});let s=function(){for(var e=arguments.length,a=Array(e),t=0;t<e;t++)a[t]=arguments[t];return a.filter((e,a,t)=>!!e&&""!==e.trim()&&t.indexOf(e)===a).join(" ").trim()}},65308:(e,a,t)=>{"use strict";t.d(a,{default:()=>m});var s=t(95155),n=t(12115),l=t(47650),r=t(85649),o=t(30926);let c=(0,o.createServerReference)("40791a84a4b0a499f400f89a19df24f021c541ae27",o.callServer,void 0,o.findSourceMapURL,"createProjectAction");var i=t(59097);let d=[{value:"#c2452a",name:"Mars Red"},{value:"#a83a22",name:"Deep Red"},{value:"#7c2b19",name:"Dark Red"},{value:"#111318",name:"Charcoal"},{value:"#3f3a30",name:"Warm Black"},{value:"#68707b",name:"Slate"},{value:"#cdb78a",name:"Warm Sand"},{value:"#1f6c9f",name:"Skill Blue"}];function u(){let{pending:e}=(0,l.useFormStatus)();return(0,s.jsx)("button",{type:"submit",className:"admin-button",disabled:e,"aria-busy":e?"true":void 0,children:e?"Creating…":"Create project"})}function m(e){let{workspaceRoot:a="~/workspace/projects"}=e,[t,l]=n.useState(!1),[o,m]=n.useState(""),[h,p]=n.useState("workspace"),[f,j]=n.useState(""),x=n.useRef(null),g=n.useMemo(()=>"".concat(a.replace(/\/$/,""),"/").concat(String(o||"").toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,64)||"project"),[a,o]);return n.useEffect(()=>{var e;"custom"===h&&(null==(e=x.current)||e.focus())},[h]),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("button",{type:"button",className:"admin-button agents-new-cta",onClick:()=>l(!0),children:[(0,s.jsx)("span",{"aria-hidden":!0,className:"agents-new-cta-glyph",children:"+"}),"New project"]}),(0,s.jsx)(r.A,{open:t,onClose:()=>l(!1),eyebrow:"New project",title:"Create a project",children:(0,s.jsxs)("form",{className:"agents-modal-form",action:c,children:[(0,s.jsx)("p",{className:"agents-modal-help",children:"Scope agents, documents, memory, and integrations together."}),(0,s.jsx)("section",{className:"agents-modal-section",children:(0,s.jsxs)("label",{className:"agents-modal-field wide",children:[(0,s.jsx)("span",{children:"Name"}),(0,s.jsx)("input",{name:"name",type:"text",required:!0,placeholder:"Acme Co.",autoComplete:"off",value:o,onChange:e=>m(e.target.value),autoFocus:!0})]})}),(0,s.jsxs)("section",{className:"agents-modal-section",children:[(0,s.jsxs)("div",{className:"agents-modal-section-head",children:[(0,s.jsx)("span",{children:"Folder location"}),(0,s.jsx)("small",{children:"Where this project lives on disk."})]}),(0,s.jsxs)("div",{className:"agents-modal-radio-group",children:[(0,s.jsxs)("label",{className:"agents-modal-radio ".concat("workspace"===h?"on":""),children:[(0,s.jsx)("input",{type:"radio",name:"folder_mode",value:"workspace",checked:"workspace"===h,onChange:()=>p("workspace")}),(0,s.jsxs)("span",{className:"agents-modal-radio-body",children:[(0,s.jsx)("b",{children:"madarX workspace"}),(0,s.jsx)("code",{title:g,children:function(e){let a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:48;if(!e||e.length<=a)return e;let t=e.slice(0,Math.floor(a/2)-1),s=e.slice(e.length-Math.floor(a/2)+2);return"".concat(t,"…").concat(s)}(g)})]})]}),(0,s.jsxs)("label",{className:"agents-modal-radio ".concat("custom"===h?"on":""),children:[(0,s.jsx)("input",{type:"radio",name:"folder_mode",value:"custom",checked:"custom"===h,onChange:()=>p("custom")}),(0,s.jsxs)("span",{className:"agents-modal-radio-body",children:[(0,s.jsx)("b",{children:"Custom path"}),(0,s.jsx)("small",{children:"Any absolute folder. Created if missing."})]})]})]}),"custom"===h?(0,s.jsx)(i.A,{inputRef:x,value:f,onChange:j}):(0,s.jsx)("input",{type:"hidden",name:"folder_path",value:""})]}),(0,s.jsxs)("section",{className:"agents-modal-section",children:[(0,s.jsxs)("div",{className:"agents-modal-section-head",children:[(0,s.jsx)("span",{children:"Color"}),(0,s.jsx)("small",{children:"Used for the project tile across the app."})]}),(0,s.jsxs)("fieldset",{className:"agents-modal-swatches",children:[(0,s.jsx)("legend",{className:"visually-hidden",children:"Project color"}),d.map(e=>(0,s.jsxs)("label",{className:"agents-modal-swatch",style:{"--swatch":e.value},children:[(0,s.jsx)("input",{type:"radio",name:"color",value:e.value,defaultChecked:"#c2452a"===e.value}),(0,s.jsx)("span",{className:"agents-modal-swatch-ring","aria-hidden":"true"}),(0,s.jsx)("span",{className:"visually-hidden",children:e.name})]},e.value))]})]}),(0,s.jsxs)("section",{className:"agents-modal-section",children:[(0,s.jsxs)("div",{className:"agents-modal-section-head",children:[(0,s.jsx)("span",{children:"Description"}),(0,s.jsx)("small",{children:"Used as context for agents working in this project."})]}),(0,s.jsx)("label",{className:"agents-modal-field wide",children:(0,s.jsx)("textarea",{name:"description",rows:3,placeholder:"What is this project for? Goals, audience, voice, constraints."})})]}),(0,s.jsxs)("footer",{className:"agents-modal-foot",children:[(0,s.jsx)("button",{type:"button",className:"admin-button secondary",onClick:()=>l(!1),children:"Cancel"}),(0,s.jsx)(u,{})]})]})})]})}},73746:(e,a,t)=>{"use strict";t.d(a,{default:()=>m});var s=t(95155),n=t(12115),l=t(47650),r=t(85649),o=t(30926);let c=(0,o.createServerReference)("402cbf907da0274afb9d1571cc8534d973c40176ab",o.callServer,void 0,o.findSourceMapURL,"updateProjectAction");var i=t(59097);let d=[{value:"#c2452a",name:"Mars Red"},{value:"#a83a22",name:"Deep Red"},{value:"#7c2b19",name:"Dark Red"},{value:"#111318",name:"Charcoal"},{value:"#3f3a30",name:"Warm Black"},{value:"#68707b",name:"Slate"},{value:"#cdb78a",name:"Warm Sand"},{value:"#1f6c9f",name:"Skill Blue"}];function u(){let{pending:e}=(0,l.useFormStatus)();return(0,s.jsx)("button",{type:"submit",className:"admin-button",disabled:e,"aria-busy":e?"true":void 0,children:e?"Saving…":"Save changes"})}function m(e){let{projectId:a,projectName:t,projectColor:l,projectDescription:o,projectFolderPath:m}=e,[h,p]=n.useState(!1),[f,j]=n.useState("keep"),[x,g]=n.useState(m||""),v=n.useRef(null);return n.useEffect(()=>{h&&(j("keep"),g(m||""))},[h,m]),n.useEffect(()=>{var e;"custom"===f&&(null==(e=v.current)||e.focus())},[f]),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("button",{type:"button",className:"admin-button secondary project-edit",onClick:()=>p(!0),"aria-label":"Edit ".concat(t),children:"Edit"}),(0,s.jsx)(r.A,{open:h,onClose:()=>p(!1),eyebrow:"Edit project",title:"Edit ".concat(t),children:(0,s.jsxs)("form",{className:"agents-modal-form",action:c,children:[(0,s.jsx)("input",{type:"hidden",name:"project_id",value:a}),(0,s.jsx)("section",{className:"agents-modal-section",children:(0,s.jsxs)("label",{className:"agents-modal-field wide",children:[(0,s.jsx)("span",{children:"Name"}),(0,s.jsx)("input",{name:"name",type:"text",defaultValue:t,autoComplete:"off",required:!0})]})}),(0,s.jsxs)("section",{className:"agents-modal-section",children:[(0,s.jsxs)("div",{className:"agents-modal-section-head",children:[(0,s.jsx)("span",{children:"Folder location"}),(0,s.jsx)("small",{children:"Where project files live on disk. Move only if you've already moved the folder yourself."})]}),(0,s.jsxs)("div",{className:"agents-modal-radio-group",children:[(0,s.jsxs)("label",{className:"agents-modal-radio ".concat("keep"===f?"on":""),children:[(0,s.jsx)("input",{type:"radio",name:"folder_mode",value:"keep",checked:"keep"===f,onChange:()=>j("keep")}),(0,s.jsxs)("span",{className:"agents-modal-radio-body",children:[(0,s.jsx)("b",{children:"Keep current"}),(0,s.jsx)("code",{title:m||"",children:function(e){let a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:48;if(!e||e.length<=a)return e;let t=e.slice(0,Math.floor(a/2)-1),s=e.slice(e.length-Math.floor(a/2)+2);return"".concat(t,"…").concat(s)}(m)||"(not set)"})]})]}),(0,s.jsxs)("label",{className:"agents-modal-radio ".concat("custom"===f?"on":""),children:[(0,s.jsx)("input",{type:"radio",name:"folder_mode",value:"custom",checked:"custom"===f,onChange:()=>j("custom")}),(0,s.jsxs)("span",{className:"agents-modal-radio-body",children:[(0,s.jsx)("b",{children:"Change to…"}),(0,s.jsx)("small",{children:"Absolute path. Must already exist or be writable."})]})]})]}),"custom"===f?(0,s.jsx)(i.A,{inputRef:v,value:x,onChange:g}):(0,s.jsx)("input",{type:"hidden",name:"folder_path",value:""})]}),(0,s.jsxs)("section",{className:"agents-modal-section",children:[(0,s.jsxs)("div",{className:"agents-modal-section-head",children:[(0,s.jsx)("span",{children:"Color"}),(0,s.jsx)("small",{children:"Tile color across the app."})]}),(0,s.jsxs)("fieldset",{className:"agents-modal-swatches",children:[(0,s.jsx)("legend",{className:"visually-hidden",children:"Project color"}),d.map(e=>(0,s.jsxs)("label",{className:"agents-modal-swatch",style:{"--swatch":e.value},children:[(0,s.jsx)("input",{type:"radio",name:"color",value:e.value,defaultChecked:e.value===(l||"#c2452a")}),(0,s.jsx)("span",{className:"agents-modal-swatch-ring","aria-hidden":"true"}),(0,s.jsx)("span",{className:"visually-hidden",children:e.name})]},e.value))]})]}),(0,s.jsxs)("section",{className:"agents-modal-section",children:[(0,s.jsxs)("div",{className:"agents-modal-section-head",children:[(0,s.jsx)("span",{children:"Description"}),(0,s.jsx)("small",{children:"Used as context for agents working in this project."})]}),(0,s.jsx)("label",{className:"agents-modal-field wide",children:(0,s.jsx)("textarea",{name:"description",rows:3,defaultValue:o||"",placeholder:"What is this project for? Goals, audience, voice, constraints."})})]}),(0,s.jsxs)("footer",{className:"agents-modal-foot",children:[(0,s.jsx)("button",{type:"button",className:"admin-button secondary",onClick:()=>p(!1),children:"Cancel"}),(0,s.jsx)(u,{})]})]})})]})}},85649:(e,a,t)=>{"use strict";t.d(a,{A:()=>r});var s=t(95155),n=t(12115),l=t(34788);function r(e){let{open:a,onClose:t,eyebrow:r,title:o,tone:c="default",size:i="default",children:d}=e,u=n.useRef(null);return n.useEffect(()=>{let e=u.current;e&&(a&&!e.open&&("function"==typeof e.showModal?e.showModal():e.setAttribute("open","")),!a&&e.open&&e.close())},[a]),n.useEffect(()=>{let e=u.current;if(!e)return;let a=e=>{e.preventDefault(),t()};return e.addEventListener("cancel",a),()=>e.removeEventListener("cancel",a)},[t]),(0,s.jsx)("dialog",{ref:u,className:"agents-modal".concat("wide"===i?" agents-modal--wide":""),onClick:e=>{e.target===u.current&&t()},children:a?(0,s.jsxs)("div",{className:"agents-modal-card".concat("danger"===c?" agents-modal-card--danger":""),onClick:e=>e.stopPropagation(),children:[(0,s.jsxs)("header",{className:"agents-modal-head",children:[(0,s.jsxs)("div",{children:[r?(0,s.jsx)("span",{className:"admin-kicker",children:r}):null,(0,s.jsx)("h2",{children:o})]}),(0,s.jsx)("button",{type:"button",className:"agents-modal-close",onClick:t,"aria-label":"Close",children:(0,s.jsx)(l.A,{size:14})})]}),d]}):null})}},99168:(e,a,t)=>{Promise.resolve().then(t.bind(t,10677)),Promise.resolve().then(t.bind(t,39230)),Promise.resolve().then(t.bind(t,73746)),Promise.resolve().then(t.bind(t,65308)),Promise.resolve().then(t.t.bind(t,52619,23))}},e=>{e.O(0,[2619,8441,1255,7358],()=>e(e.s=99168)),_N_E=e.O()}]);
|