madarx 2.14.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 +579 -579
- package/.next/standalone/.next/app-path-routes-manifest.json +77 -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/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 +3 -3
- package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/agents/[id]/page.js +3 -3
- 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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_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_client-reference-manifest.js +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_client-reference-manifest.js +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_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_client-reference-manifest.js +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_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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/hail/[id]/page.js +2 -2
- package/.next/standalone/.next/server/app/hail/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/hail/[id]/setup/page.js +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 +2 -2
- 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 +19 -19
- 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_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_client-reference-manifest.js +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_client-reference-manifest.js +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 +77 -77
- package/.next/standalone/.next/server/chunks/1699.js +18 -18
- package/.next/standalone/.next/server/chunks/51.js +1 -0
- package/.next/standalone/.next/server/functions-config-manifest.json +24 -24
- 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/{webpack-86ee88827adb756d.js → webpack-f916d679fe38a701.js} +1 -1
- package/.next/standalone/.next/static/css/0bd4c357d4f0c4f2.css +1 -0
- package/.next/standalone/CHANGELOG.md +12 -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/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/{webpack-86ee88827adb756d.js → webpack-f916d679fe38a701.js} +1 -1
- package/.next/static/css/0bd4c357d4f0c4f2.css +1 -0
- package/CHANGELOG.md +12 -0
- package/app/components/dashboard/whatsapp-section.jsx +54 -13
- package/lib/cli/prompt.js +110 -0
- package/lib/cli/setup.js +152 -87
- package/lib/runtime.js +8 -2
- package/package.json +2 -2
- package/scripts/whatsapp-reset.mjs +15 -0
- package/.next/standalone/.next/server/chunks/6474.js +0 -1
- package/.next/standalone/.next/static/chunks/4119-3b6adff3c7187ef3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/projects/page-09e5c527e3ba83e2.js +0 -1
- package/.next/standalone/.next/static/css/0bfed9e12afa1dc1.css +0 -1
- package/.next/static/chunks/4119-3b6adff3c7187ef3.js +0 -1
- package/.next/static/chunks/app/projects/page-09e5c527e3ba83e2.js +0 -1
- package/.next/static/css/0bfed9e12afa1dc1.css +0 -1
- /package/.next/standalone/.next/static/{-LlttjOnKZXGqZXDKcj-4 → tMcPS9JR5cRXSe0u5ne95}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{-LlttjOnKZXGqZXDKcj-4 → tMcPS9JR5cRXSe0u5ne95}/_ssgManifest.js +0 -0
- /package/.next/static/{-LlttjOnKZXGqZXDKcj-4 → tMcPS9JR5cRXSe0u5ne95}/_buildManifest.js +0 -0
- /package/.next/static/{-LlttjOnKZXGqZXDKcj-4 → tMcPS9JR5cRXSe0u5ne95}/_ssgManifest.js +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,18 @@
|
|
|
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
|
+
|
|
5
17
|
## [2.14.0] - 2026-06-04
|
|
6
18
|
|
|
7
19
|
### Changed
|
|
@@ -221,23 +221,64 @@ export default function WhatsAppSection() {
|
|
|
221
221
|
<div className="config-secrets-panel" style={{ marginTop: 0 }}>
|
|
222
222
|
<div className="config-secrets-head">
|
|
223
223
|
<div>
|
|
224
|
-
<span className="config-section-title">
|
|
225
|
-
|
|
224
|
+
<span className="config-section-title">
|
|
225
|
+
{pairingState === 'logged_out' ? 'Session logged out' : 'Pair device'}
|
|
226
|
+
</span>
|
|
227
|
+
<p>
|
|
228
|
+
{pairingState === 'logged_out'
|
|
229
|
+
? '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.'
|
|
230
|
+
: 'Open WhatsApp → Settings → Linked Devices → Link a Device, then scan the code.'}
|
|
231
|
+
</p>
|
|
226
232
|
</div>
|
|
233
|
+
{pairingState === 'logged_out' && (
|
|
234
|
+
!confirmDisconnect ? (
|
|
235
|
+
<button
|
|
236
|
+
type="button"
|
|
237
|
+
className="secrets-action-btn danger"
|
|
238
|
+
onClick={() => setConfirmDisconnect(true)}
|
|
239
|
+
disabled={disconnectBusy}
|
|
240
|
+
>
|
|
241
|
+
Reset session
|
|
242
|
+
</button>
|
|
243
|
+
) : (
|
|
244
|
+
<div className="wa-disconnect-confirm">
|
|
245
|
+
<button
|
|
246
|
+
type="button"
|
|
247
|
+
className="secrets-action-btn danger"
|
|
248
|
+
onClick={handleDisconnect}
|
|
249
|
+
disabled={disconnectBusy}
|
|
250
|
+
>
|
|
251
|
+
{disconnectBusy ? 'Resetting…' : 'Confirm reset'}
|
|
252
|
+
</button>
|
|
253
|
+
<button
|
|
254
|
+
type="button"
|
|
255
|
+
className="secrets-action-btn"
|
|
256
|
+
onClick={() => setConfirmDisconnect(false)}
|
|
257
|
+
disabled={disconnectBusy}
|
|
258
|
+
>
|
|
259
|
+
Cancel
|
|
260
|
+
</button>
|
|
261
|
+
</div>
|
|
262
|
+
)
|
|
263
|
+
)}
|
|
227
264
|
</div>
|
|
228
|
-
|
|
229
|
-
{
|
|
230
|
-
|
|
231
|
-
|
|
265
|
+
{pairingState === 'logged_out' ? (
|
|
266
|
+
<div className="whatsapp-pair-copy">{dedicatedNumberWarning}</div>
|
|
267
|
+
) : (
|
|
268
|
+
<div className="whatsapp-pair-row">
|
|
269
|
+
{qrDataUrl ? (
|
|
270
|
+
<div className="whatsapp-qr-box">
|
|
271
|
+
<img src={qrDataUrl} alt="WhatsApp pairing QR code" width={220} height={220} />
|
|
272
|
+
</div>
|
|
273
|
+
) : (
|
|
274
|
+
<div className="whatsapp-qr-pending">Waiting for QR — make sure the daemon is running.</div>
|
|
275
|
+
)}
|
|
276
|
+
<div className="whatsapp-pair-copy">
|
|
277
|
+
<p>Code rotates roughly every 20 seconds. The dashboard re-fetches automatically. The session is saved at <code>data/whatsapp/session/</code>.</p>
|
|
278
|
+
{dedicatedNumberWarning}
|
|
232
279
|
</div>
|
|
233
|
-
) : (
|
|
234
|
-
<div className="whatsapp-qr-pending">Waiting for QR — make sure the daemon is running.</div>
|
|
235
|
-
)}
|
|
236
|
-
<div className="whatsapp-pair-copy">
|
|
237
|
-
<p>Code rotates roughly every 20 seconds. The dashboard re-fetches automatically. The session is saved at <code>data/whatsapp/session/</code>.</p>
|
|
238
|
-
{dedicatedNumberWarning}
|
|
239
280
|
</div>
|
|
240
|
-
|
|
281
|
+
)}
|
|
241
282
|
</div>
|
|
242
283
|
) : (
|
|
243
284
|
<div className="config-secrets-panel" style={{ marginTop: 0 }}>
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive terminal prompts for the madarX CLI wizard.
|
|
3
|
+
*
|
|
4
|
+
* Zero dependencies — node builtins + the brand stylers in ./banner.js only.
|
|
5
|
+
* The headline piece is `select()`: an arrow-key menu (↑/↓ or j/k, number keys,
|
|
6
|
+
* Enter to choose) in the Sovereign-Mono palette with a single Mars cursor.
|
|
7
|
+
*
|
|
8
|
+
* Degrades safely: with no TTY it returns the default option without drawing.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { emitKeypressEvents } from 'node:readline';
|
|
12
|
+
import { _palette as P, fg, bold, dim } from './banner.js';
|
|
13
|
+
|
|
14
|
+
const isTTY = () => Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
15
|
+
const write = (s) => process.stdout.write(s);
|
|
16
|
+
const hideCursor = () => write('\x1b[?25l');
|
|
17
|
+
const showCursor = () => write('\x1b[?25h');
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Render one menu option line.
|
|
21
|
+
* @param {{label:string, hint?:string, tag?:string}} opt
|
|
22
|
+
* @param {boolean} active
|
|
23
|
+
*/
|
|
24
|
+
function optionLine(opt, active) {
|
|
25
|
+
const cursor = active ? fg(P.mars, '→ ') : ' ';
|
|
26
|
+
const label = active ? bold(fg(P.mars, opt.label)) : fg(P.bone, opt.label);
|
|
27
|
+
const tag = opt.tag ? ' ' + fg(opt.tag === 'recommended' ? P.platinum : P.muted, `(${opt.tag})`) : '';
|
|
28
|
+
const hint = opt.hint ? ' ' + dim(fg(P.muted, opt.hint)) : '';
|
|
29
|
+
return ` ${cursor}${label}${tag}${hint}`;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Arrow-key single-select menu.
|
|
34
|
+
*
|
|
35
|
+
* @param {string} title bold Mars header (e.g. "Select default model")
|
|
36
|
+
* @param {Array<{label:string, value:any, hint?:string, tag?:string}>} options
|
|
37
|
+
* @param {object} [opts]
|
|
38
|
+
* @param {number} [opts.default=0] initially highlighted index
|
|
39
|
+
* @param {string} [opts.help] a dim help line under the title
|
|
40
|
+
* @returns {Promise<any>} the chosen option's `value`
|
|
41
|
+
*/
|
|
42
|
+
export function select(title, options, opts = {}) {
|
|
43
|
+
const def = Math.max(0, Math.min(opts.default ?? 0, options.length - 1));
|
|
44
|
+
if (!isTTY() || options.length === 0) {
|
|
45
|
+
return Promise.resolve(options[def]?.value);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return new Promise((resolve) => {
|
|
49
|
+
let idx = def;
|
|
50
|
+
const headerLines = [
|
|
51
|
+
fg(P.mars, bold(title)),
|
|
52
|
+
...(opts.help ? [dim(fg(P.muted, opts.help))] : []),
|
|
53
|
+
'',
|
|
54
|
+
];
|
|
55
|
+
const total = headerLines.length + options.length + 1; // +1 footer
|
|
56
|
+
|
|
57
|
+
const footer = dim(fg(P.muted, '↑/↓ move · enter select · ⌃C cancel'));
|
|
58
|
+
|
|
59
|
+
const draw = (first) => {
|
|
60
|
+
if (!first) write(`\x1b[${total}A`); // jump to top of the block
|
|
61
|
+
const lines = [
|
|
62
|
+
...headerLines,
|
|
63
|
+
...options.map((o, i) => optionLine(o, i === idx)),
|
|
64
|
+
footer,
|
|
65
|
+
];
|
|
66
|
+
write('\r' + lines.map((l) => '\x1b[2K' + l).join('\n') + '\n');
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
emitKeypressEvents(process.stdin);
|
|
70
|
+
const wasRaw = process.stdin.isRaw;
|
|
71
|
+
process.stdin.setRawMode(true);
|
|
72
|
+
process.stdin.resume();
|
|
73
|
+
hideCursor();
|
|
74
|
+
draw(true);
|
|
75
|
+
|
|
76
|
+
const cleanup = () => {
|
|
77
|
+
process.stdin.removeListener('keypress', onKey);
|
|
78
|
+
process.stdin.setRawMode(wasRaw);
|
|
79
|
+
process.stdin.pause();
|
|
80
|
+
showCursor();
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const onKey = (str, key = {}) => {
|
|
84
|
+
if (key.name === 'up' || key.name === 'k' || (key.name === 'p' && key.ctrl)) {
|
|
85
|
+
idx = (idx - 1 + options.length) % options.length; draw(false);
|
|
86
|
+
} else if (key.name === 'down' || key.name === 'j' || (key.name === 'n' && key.ctrl)) {
|
|
87
|
+
idx = (idx + 1) % options.length; draw(false);
|
|
88
|
+
} else if (str && /^[1-9]$/.test(str) && Number(str) <= options.length) {
|
|
89
|
+
idx = Number(str) - 1; draw(false);
|
|
90
|
+
} else if (key.name === 'return' || key.name === 'enter') {
|
|
91
|
+
cleanup(); resolve(options[idx].value);
|
|
92
|
+
} else if (key.name === 'escape') {
|
|
93
|
+
cleanup(); resolve(options[def].value);
|
|
94
|
+
} else if (key.ctrl && key.name === 'c') {
|
|
95
|
+
cleanup(); write('\n'); process.exit(130);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
process.stdin.on('keypress', onKey);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Yes/No as a two-item arrow menu (returns boolean). */
|
|
104
|
+
export async function confirm(title, { default: dflt = true, help } = {}) {
|
|
105
|
+
const value = await select(title, [
|
|
106
|
+
{ label: 'Yes', value: true },
|
|
107
|
+
{ label: 'No', value: false },
|
|
108
|
+
], { default: dflt ? 0 : 1, help });
|
|
109
|
+
return value;
|
|
110
|
+
}
|
package/lib/cli/setup.js
CHANGED
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `madarx setup` — interactive first-run wizard.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* An arrow-key guided setup that decides the things that shape the whole
|
|
5
|
+
* install up front, then fills in credentials and preferences:
|
|
6
|
+
*
|
|
7
|
+
* 1. Usage mode personal (local-only) vs team (Supabase shared layer)
|
|
8
|
+
* 2. Main agent which model/engine the orchestrator runs on
|
|
9
|
+
* 3. Sub-agents default model/engine new agents inherit
|
|
10
|
+
* 4. Secrets vault master key (generated + persisted on first run)
|
|
11
|
+
* 5. API keys Anthropic / OpenAI → encrypted vault
|
|
12
|
+
* 6. Folder grants MADARX_ALLOWED_ROOTS (the agent's file/exec boundary)
|
|
13
|
+
* 7. WhatsApp bridge on/off
|
|
14
|
+
* 8. Auto-update weekly notify / hands-off / off
|
|
8
15
|
*
|
|
9
16
|
* Sets MADARX_DISABLE_INPROC_DAEMON=1 before importing the runtime — a setup run
|
|
10
17
|
* must not spin up cron/heartbeat loops.
|
|
@@ -13,42 +20,33 @@
|
|
|
13
20
|
import { createInterface } from 'node:readline/promises';
|
|
14
21
|
import { applyHomeEnv } from './home.js';
|
|
15
22
|
import { upsertEnvVar, removeEnvVar, readEnvFile } from './env-file.js';
|
|
16
|
-
import { renderHeader } from './banner.js';
|
|
23
|
+
import { renderHeader, _palette as P, fg, bold, dim } from './banner.js';
|
|
17
24
|
import { readVersion } from './dispatch.js';
|
|
25
|
+
import { select, confirm } from './prompt.js';
|
|
18
26
|
|
|
19
27
|
function isInteractive() {
|
|
20
28
|
return Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
21
29
|
}
|
|
22
30
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
rl.stdoutMuted = false;
|
|
27
|
-
rl._writeToOutput = function (str) {
|
|
28
|
-
if (rl.stdoutMuted) rl.output.write('*');
|
|
29
|
-
else rl.output.write(str);
|
|
30
|
-
};
|
|
31
|
-
return rl;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
async function ask(rl, prompt, dflt = '') {
|
|
35
|
-
const suffix = dflt ? ` [${dflt}]` : '';
|
|
36
|
-
const ans = (await rl.question(`${prompt}${suffix}: `)).trim();
|
|
37
|
-
return ans || dflt;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
async function askYesNo(rl, prompt, dfltYes = true) {
|
|
41
|
-
const ans = (await rl.question(`${prompt} ${dfltYes ? '[Y/n]' : '[y/N]'}: `)).trim().toLowerCase();
|
|
42
|
-
if (!ans) return dfltYes;
|
|
43
|
-
return ans === 'y' || ans === 'yes';
|
|
44
|
-
}
|
|
31
|
+
const h2 = (s) => console.log('\n' + bold(fg(P.platinum, s)));
|
|
32
|
+
const note = (s) => console.log(' ' + dim(fg(P.muted, s)));
|
|
33
|
+
const ok = (s) => console.log(' ' + fg(P.mars, '●') + ' ' + fg(P.bone, s));
|
|
45
34
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
35
|
+
/** Open an ephemeral readline for one text prompt, then close it (so it never
|
|
36
|
+
* competes with the raw-mode arrow menus). `secret` echoes `*`. */
|
|
37
|
+
async function ask(prompt, { dflt = '', secret = false } = {}) {
|
|
38
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout, terminal: true });
|
|
49
39
|
rl.stdoutMuted = false;
|
|
50
|
-
rl.output.write('
|
|
51
|
-
|
|
40
|
+
rl._writeToOutput = function (str) { rl.output.write(rl.stdoutMuted ? '*' : str); };
|
|
41
|
+
try {
|
|
42
|
+
rl.stdoutMuted = secret;
|
|
43
|
+
const suffix = dflt ? ` [${dflt}]` : '';
|
|
44
|
+
const ans = (await rl.question(` ${fg(P.bone, prompt)}${dim(suffix)}: `)).trim();
|
|
45
|
+
if (secret) rl.output.write('\n');
|
|
46
|
+
return ans || dflt;
|
|
47
|
+
} finally {
|
|
48
|
+
rl.close();
|
|
49
|
+
}
|
|
52
50
|
}
|
|
53
51
|
|
|
54
52
|
export async function setup() {
|
|
@@ -57,87 +55,154 @@ export async function setup() {
|
|
|
57
55
|
return 1;
|
|
58
56
|
}
|
|
59
57
|
|
|
60
|
-
//
|
|
61
|
-
process.env.MADARX_DISABLE_INPROC_DAEMON = '1';
|
|
62
|
-
|
|
58
|
+
process.env.MADARX_DISABLE_INPROC_DAEMON = '1'; // management command — no daemons
|
|
63
59
|
const layout = applyHomeEnv();
|
|
64
|
-
const rl = makeReader();
|
|
65
60
|
|
|
66
61
|
try {
|
|
67
62
|
console.log(renderHeader('setup', readVersion()));
|
|
68
|
-
console.log(`Data home: ${layout.home}`);
|
|
69
|
-
|
|
63
|
+
console.log(`Data home: ${fg(P.bone, layout.home)}`);
|
|
64
|
+
note('override anytime with the MADARX_HOME env var');
|
|
70
65
|
|
|
71
|
-
//
|
|
72
|
-
// to $MADARX_HOME/.env.local on first run, prints the backup instruction).
|
|
73
|
-
console.log('1) Secrets vault');
|
|
74
|
-
const { resolveMasterKey } = await import('../master-key.js');
|
|
66
|
+
// Open the DB once so vault + config tables exist for the steps below.
|
|
75
67
|
const { getDb } = await import('../db.js');
|
|
76
|
-
getDb();
|
|
77
|
-
|
|
78
|
-
console.log(' Master key ready.\n');
|
|
68
|
+
getDb();
|
|
69
|
+
const { setConfig } = await import('../config.js');
|
|
79
70
|
|
|
80
|
-
//
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
71
|
+
// ── 1. Usage mode ────────────────────────────────────────────────────────
|
|
72
|
+
h2('1 · How will you use madarX?');
|
|
73
|
+
const mode = await select('Choose a setup', [
|
|
74
|
+
{ label: 'Personal', value: 'local', tag: 'recommended', hint: 'local-only, everything on this machine' },
|
|
75
|
+
{ label: 'Team', value: 'supabase', hint: 'shared with a team via Supabase (auth, orgs, sharing)' },
|
|
76
|
+
], { default: 0 });
|
|
77
|
+
|
|
78
|
+
if (mode === 'supabase') {
|
|
79
|
+
setConfig('auth_mode', 'supabase');
|
|
80
|
+
note('Enter your Supabase project credentials (stored in ' + layout.envFile + ').');
|
|
81
|
+
const existing = readEnvFile(layout.envFile);
|
|
82
|
+
const url = await ask('Supabase URL', { dflt: existing.SUPABASE_URL || existing.NEXT_PUBLIC_SUPABASE_URL || '' });
|
|
83
|
+
const anon = await ask('Supabase anon key', { dflt: existing.SUPABASE_ANON_KEY || '' });
|
|
84
|
+
const service = await ask('Supabase service-role key', { secret: true });
|
|
85
|
+
if (url) { upsertEnvVar(layout.envFile, 'SUPABASE_URL', url); upsertEnvVar(layout.envFile, 'NEXT_PUBLIC_SUPABASE_URL', url); }
|
|
86
|
+
if (anon) { upsertEnvVar(layout.envFile, 'SUPABASE_ANON_KEY', anon); upsertEnvVar(layout.envFile, 'NEXT_PUBLIC_SUPABASE_ANON_KEY', anon); }
|
|
87
|
+
if (service) upsertEnvVar(layout.envFile, 'SUPABASE_SERVICE_ROLE_KEY', service);
|
|
88
|
+
ok('Team mode (Supabase) configured.');
|
|
89
|
+
note('Apply the cloud schema once: see supabase/README.md.');
|
|
90
|
+
} else {
|
|
91
|
+
setConfig('auth_mode', 'local');
|
|
92
|
+
ok('Personal mode — local-only.');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// ── Model catalog (probes installed CLIs + Ollama; Anthropic always listed) ─
|
|
96
|
+
const { getModels, setModel, getModel } = await import('../agent-config.js');
|
|
97
|
+
const { defaultModelForEngine } = await import('../agent-engines.js');
|
|
98
|
+
let models = [];
|
|
99
|
+
try { models = await getModels(); } catch { models = []; }
|
|
100
|
+
const recommendedId = models.find((m) => m.engine === 'claude-code') ? 'claude-code'
|
|
101
|
+
: (models.find((m) => m.id === 'claude-sonnet-4-6') ? 'claude-sonnet-4-6' : models[0]?.id);
|
|
102
|
+
const modelOption = (m) => ({
|
|
103
|
+
label: m.label,
|
|
104
|
+
value: { id: m.id, engine: m.engine },
|
|
105
|
+
hint: m.engine,
|
|
106
|
+
tag: m.id === recommendedId ? 'recommended' : undefined,
|
|
107
|
+
});
|
|
108
|
+
const orderedModels = [
|
|
109
|
+
...models.filter((m) => m.id === recommendedId),
|
|
110
|
+
...models.filter((m) => m.id !== recommendedId),
|
|
111
|
+
];
|
|
112
|
+
|
|
113
|
+
// ── 2. Main agent model ──────────────────────────────────────────────────
|
|
114
|
+
h2('2 · Main agent model');
|
|
115
|
+
note('the orchestrator that plans your work and dispatches sub-agents');
|
|
116
|
+
const current = getModel();
|
|
117
|
+
const mainChoice = await select('Select the main agent model', [
|
|
118
|
+
...orderedModels.map(modelOption),
|
|
119
|
+
{ label: `Keep current (${current})`, value: { keep: true } },
|
|
120
|
+
], { default: 0 });
|
|
121
|
+
if (!mainChoice.keep) { setModel(mainChoice.id); ok(`Main agent → ${mainChoice.id}`); }
|
|
122
|
+
else ok(`Main agent unchanged (${current})`);
|
|
123
|
+
const mainEngine = mainChoice.keep ? null : mainChoice.engine;
|
|
124
|
+
|
|
125
|
+
// ── 3. Sub-agent default model ───────────────────────────────────────────
|
|
126
|
+
h2('3 · Sub-agent default model');
|
|
127
|
+
note('what newly created agents inherit unless you pick another at creation');
|
|
128
|
+
const subChoice = await select('Select the default sub-agent model', [
|
|
129
|
+
{ label: 'Same as main agent', value: { same: true }, tag: 'recommended' },
|
|
130
|
+
...orderedModels.map(modelOption),
|
|
131
|
+
], { default: 0 });
|
|
132
|
+
let subEngine, subModel;
|
|
133
|
+
if (subChoice.same) {
|
|
134
|
+
subEngine = mainEngine || (orderedModels.find((m) => m.id === current)?.engine) || 'claude-code';
|
|
135
|
+
subModel = mainChoice.keep ? current : mainChoice.id;
|
|
90
136
|
} else {
|
|
91
|
-
|
|
137
|
+
subEngine = subChoice.engine;
|
|
138
|
+
subModel = subChoice.engine === 'anthropic' ? subChoice.id : defaultModelForEngine(subChoice.engine);
|
|
92
139
|
}
|
|
140
|
+
setConfig('default_agent_engine', subEngine);
|
|
141
|
+
setConfig('default_agent_model', subModel);
|
|
142
|
+
ok(`Sub-agents → ${subEngine}${subModel ? ' · ' + subModel : ''}`);
|
|
143
|
+
|
|
144
|
+
// ── 4. Secrets vault master key ──────────────────────────────────────────
|
|
145
|
+
h2('4 · Secrets vault');
|
|
146
|
+
const { resolveMasterKey } = await import('../master-key.js');
|
|
147
|
+
resolveMasterKey({ allowGenerate: true });
|
|
148
|
+
ok('Master key ready (AES-256-GCM).');
|
|
93
149
|
|
|
94
|
-
//
|
|
95
|
-
|
|
96
|
-
|
|
150
|
+
// ── 5. API keys → encrypted vault ────────────────────────────────────────
|
|
151
|
+
h2('5 · API keys');
|
|
152
|
+
note('stored encrypted in the vault · press Enter to skip any');
|
|
153
|
+
const { setSecret, getSecret } = await import('../secrets.js');
|
|
154
|
+
const usesAnthropic = [mainEngine, subEngine].includes('anthropic');
|
|
97
155
|
const keyPrompts = [
|
|
98
|
-
['ANTHROPIC_API_KEY', 'Anthropic API key (Claude)'],
|
|
156
|
+
['ANTHROPIC_API_KEY', 'Anthropic API key (Claude)' + (usesAnthropic ? ' — required for your selection' : '')],
|
|
99
157
|
['OPENAI_API_KEY', 'OpenAI API key (voice/realtime, optional)'],
|
|
100
158
|
];
|
|
101
159
|
for (const [name, label] of keyPrompts) {
|
|
102
|
-
|
|
160
|
+
let have = false;
|
|
161
|
+
try { have = Boolean(getSecret(name)); } catch { /* vault may be empty */ }
|
|
162
|
+
const val = await ask(label + (have ? ' (set — Enter to keep)' : ''), { secret: true });
|
|
103
163
|
if (val) {
|
|
104
|
-
try { setSecret(name, val, { scope: 'global' });
|
|
105
|
-
catch (err) { console.error(`
|
|
164
|
+
try { setSecret(name, val, { scope: 'global' }); ok(`Stored ${name}.`); }
|
|
165
|
+
catch (err) { console.error(' ' + fg(P.mars, '✗') + ` Could not store ${name}: ${err.message}`); }
|
|
106
166
|
}
|
|
107
167
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
168
|
+
|
|
169
|
+
// ── 6. Folder permissions ────────────────────────────────────────────────
|
|
170
|
+
h2('6 · Folder permissions');
|
|
171
|
+
note('the agent can read/write/run ONLY inside roots you grant (repo + workspace/ always allowed)');
|
|
172
|
+
const existingRoots = readEnvFile(layout.envFile).MADARX_ALLOWED_ROOTS || '';
|
|
173
|
+
const roots = await ask('Extra allowed roots (comma-separated absolute paths)', { dflt: existingRoots });
|
|
174
|
+
if (roots) {
|
|
175
|
+
const cleaned = roots.split(',').map((r) => r.trim()).filter(Boolean).join(',');
|
|
176
|
+
upsertEnvVar(layout.envFile, 'MADARX_ALLOWED_ROOTS', cleaned);
|
|
177
|
+
ok(`Granted: ${cleaned}`);
|
|
116
178
|
} else {
|
|
117
|
-
|
|
118
|
-
console.log(' Disabled.\n');
|
|
179
|
+
note('no extra roots granted');
|
|
119
180
|
}
|
|
120
181
|
|
|
121
|
-
//
|
|
122
|
-
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
182
|
+
// ── 7. WhatsApp bridge ───────────────────────────────────────────────────
|
|
183
|
+
h2('7 · WhatsApp bridge');
|
|
184
|
+
const enableWa = await confirm('Run the WhatsApp bridge with `madarx`?', { default: true });
|
|
185
|
+
if (enableWa) { removeEnvVar(layout.envFile, 'MADARX_DISABLE_WHATSAPP'); ok('Enabled — idles until you pair a dedicated number.'); }
|
|
186
|
+
else { upsertEnvVar(layout.envFile, 'MADARX_DISABLE_WHATSAPP', '1'); ok('Disabled.'); }
|
|
187
|
+
|
|
188
|
+
// ── 8. Auto-update ───────────────────────────────────────────────────────
|
|
189
|
+
h2('8 · Auto-update');
|
|
190
|
+
const upd = await select('How should madarX handle updates?', [
|
|
191
|
+
{ label: 'Notify weekly', value: 'notify', tag: 'recommended', hint: 'check weekly, tell me — I apply' },
|
|
192
|
+
{ label: 'Auto-apply weekly', value: 'auto', hint: 'hands-off, gated by the approval/trust tier' },
|
|
193
|
+
{ label: 'Off', value: 'off', hint: 'I will run `madarx update` myself' },
|
|
194
|
+
], { default: 0 });
|
|
195
|
+
if (upd === 'off') { setConfig('auto_update_mode', 'off'); ok('Auto-update off.'); }
|
|
196
|
+
else {
|
|
127
197
|
setConfig('auto_update_mode', 'weekly');
|
|
128
|
-
setConfig('auto_update_apply',
|
|
129
|
-
|
|
130
|
-
} else {
|
|
131
|
-
setConfig('auto_update_mode', 'off');
|
|
132
|
-
console.log(' Auto-update off. Run `madarx update` manually.\n');
|
|
198
|
+
setConfig('auto_update_apply', upd === 'auto' ? 'auto' : 'notify');
|
|
199
|
+
ok(`Weekly check on — ${upd === 'auto' ? 'auto-apply' : 'notify only'}.`);
|
|
133
200
|
}
|
|
134
201
|
|
|
135
|
-
console.log('Setup complete. Start everything with: madarx\n');
|
|
202
|
+
console.log('\n' + bold(fg(P.platinum, 'Setup complete.')) + ' Start everything with: ' + fg(P.mars, 'madarx') + '\n');
|
|
136
203
|
return 0;
|
|
137
204
|
} catch (err) {
|
|
138
205
|
console.error(`\nsetup failed: ${err?.stack || err}`);
|
|
139
206
|
return 1;
|
|
140
|
-
} finally {
|
|
141
|
-
rl.close();
|
|
142
207
|
}
|
|
143
208
|
}
|
package/lib/runtime.js
CHANGED
|
@@ -14,6 +14,7 @@ import { DEFAULT_PROJECT_ID, appendProjectChangelog, getProject } from './projec
|
|
|
14
14
|
import { listActivity, listTasks, reportingSnapshot } from './delegation.js';
|
|
15
15
|
import { getMainAgentTrustMode } from './tools/registry.js';
|
|
16
16
|
import { defaultSkillsMarkdown } from './marketplace-seeds.js';
|
|
17
|
+
import { getConfig } from './config.js';
|
|
17
18
|
import { publishLiveEvent, publishStateChanged } from './live-events.js';
|
|
18
19
|
import { resolveTargetSpace } from './dashboard-spaces.js';
|
|
19
20
|
|
|
@@ -862,9 +863,14 @@ export function createAgent(payload = {}) {
|
|
|
862
863
|
const type = payload.type || 'custom';
|
|
863
864
|
const mission = payload.mission || 'Support Client Workspace operations as a local sub-agent.';
|
|
864
865
|
const schedule = payload.schedule || 'on demand';
|
|
865
|
-
|
|
866
|
+
// Default engine/model come from the setup wizard's choices (config keys
|
|
867
|
+
// default_agent_engine / default_agent_model) when the caller didn't specify.
|
|
868
|
+
let cfgEngine = null;
|
|
869
|
+
let cfgModel = null;
|
|
870
|
+
try { cfgEngine = getConfig('default_agent_engine', null); cfgModel = getConfig('default_agent_model', null); } catch { /* config optional */ }
|
|
871
|
+
const engine = payload.engine || cfgEngine || 'claude-code';
|
|
866
872
|
const normalizedEngine = normalizeAgentEngine(engine);
|
|
867
|
-
const model = payload.model || defaultModelForEngine(normalizedEngine);
|
|
873
|
+
const model = payload.model || (!payload.engine && cfgModel) || defaultModelForEngine(normalizedEngine);
|
|
868
874
|
const tools = Array.isArray(payload.tools)
|
|
869
875
|
? payload.tools
|
|
870
876
|
: String(payload.tools || 'web-search,browser,files,cron')
|
package/package.json
CHANGED
|
@@ -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,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Wipe the WhatsApp Baileys session so the bridge offers a fresh pairing QR.
|
|
3
|
+
// Resolves the session dir from lib/paths.js so it honours $MADARX_HOME /
|
|
4
|
+
// MADARX_DATA_DIR (global installs live under ~/.madarx, not the repo cwd).
|
|
5
|
+
import fs from 'node:fs';
|
|
6
|
+
import { WHATSAPP_SESSION_DIR } from '../lib/paths.js';
|
|
7
|
+
|
|
8
|
+
try {
|
|
9
|
+
fs.rmSync(WHATSAPP_SESSION_DIR, { recursive: true, force: true });
|
|
10
|
+
console.log('[whatsapp:reset] wiped', WHATSAPP_SESSION_DIR);
|
|
11
|
+
console.log('[whatsapp:reset] restart madarx (or the WhatsApp bridge) to generate a fresh pairing QR.');
|
|
12
|
+
} catch (err) {
|
|
13
|
+
console.error('[whatsapp:reset] failed to wipe', WHATSAPP_SESSION_DIR, '—', err.message);
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
exports.id=6474,exports.ids=[6474],exports.modules={6974:(a,b,c)=>{Promise.resolve().then(c.bind(c,35271))},14420:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{"4045b474fc63a6a572f3ca03f813d3525209e55e2b":()=>e.$$RSC_SERVER_ACTION_0});var e=c(91845),f=a([e]);e=(f.then?(await f)():f)[0],d()}catch(a){d(a)}})},35271:(a,b,c)=>{"use strict";c.d(b,{default:()=>d});let d=(0,c(97954).registerClientReference)(function(){throw Error("Attempted to call the default export of \"/home/runner/work/madarx-os/madarx-os/app/components/admin/project-switcher.jsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/home/runner/work/madarx-os/madarx-os/app/components/admin/project-switcher.jsx","default")},86893:(a,b,c)=>{"use strict";c.d(b,{hI:()=>g,iN:()=>f,pp:()=>i,qs:()=>h});var d=c(75338),e=c(35271);function f({kicker:a="madarX OS v1.0",title:b,description:c,actions:f,hideProjectSwitcher:g,children:h}){return(0,d.jsxs)("main",{className:"admin-shell",children:[(0,d.jsxs)("header",{className:"admin-header",children:[(0,d.jsxs)("div",{children:[(0,d.jsx)("span",{className:"admin-kicker",children:a}),(0,d.jsx)("h1",{children:b}),c?(0,d.jsx)("p",{children:c}):null]}),(0,d.jsxs)("div",{className:"admin-header-actions",children:[g?null:(0,d.jsx)(e.default,{}),f]})]}),h]})}function g({label:a,value:b,tone:c}){return(0,d.jsxs)("div",{className:`admin-stat ${c||""}`,children:[(0,d.jsx)("b",{children:b}),(0,d.jsx)("span",{children:a})]})}function h({children:a,tone:b="neutral"}){return(0,d.jsx)("span",{className:`admin-pill ${b}`,children:a})}function i({title:a,children:b}){return(0,d.jsxs)("div",{className:"admin-empty",children:[(0,d.jsx)("b",{children:a}),(0,d.jsx)("p",{children:b})]})}},89670:(a,b,c)=>{Promise.resolve().then(c.bind(c,94657))},91845:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{$$RSC_SERVER_ACTION_0:()=>u,default:()=>p,dynamic:()=>q,runtime:()=>r});var e=c(75338),f=c(75879);c(68633);var g=c(16780),h=c(82161),i=c(86893),j=c(83963),k=c(60105),l=a([j,k]);[j,k]=l.then?(await l)():l;let q="force-dynamic",r="nodejs",s={executive:"Executive",manager:"Manager",team_lead:"Team Lead",individual_contributor:"Contributor"},t={executive:"mars",manager:"ready",team_lead:"warn",individual_contributor:"neutral"};function m(a=""){return a.split(/\s+/).map(a=>a[0]).filter(Boolean).slice(0,2).join("").toUpperCase()||"\xb7"}let u=async function(a){let b=String(a.get("agent_id")||"").trim();if(!b)return;let c=String(a.get("reports_to")||"").trim(),d={reports_to:""===c?null:c},e=String(a.get("role")||"").trim();e&&(d.role=e);let f=String(a.get("title")||"").trim();(f||a.has("title"))&&(d.title=f||null);try{(0,j.jN)(b,d)}catch(a){console.warn("updateAgentOrg failed",a?.message)}(0,g.revalidatePath)("/org"),(0,g.revalidatePath)("/agents"),(0,h.redirect)("/org")};function n({node:a,workloadById:b}){let c=function(a){if(a.role&&s[a.role])return a.role;let b=a.reports?.length||0;return b>=4?"executive":b>=2?"manager":1===b?"team_lead":"individual_contributor"}(a),d=s[c],f=t[c],g=a.reports?.length||0,h=b.get(a.id),j=Number(h?.active_tasks||0),k=Number(h?.blocked_tasks||0),l=Number(h?.completed_tasks||0),n=a.status||"created";return(0,e.jsxs)("article",{className:`org-card org-card--${c}`,"data-reports":g>0?"has":"none",children:[(0,e.jsxs)("div",{className:"org-card-head",children:[(0,e.jsx)("div",{className:"org-card-avatar","aria-hidden":"true",children:m(a.name)}),(0,e.jsxs)("div",{className:"org-card-identity",children:[(0,e.jsx)("div",{className:"org-card-name",children:a.name}),(0,e.jsx)("div",{className:"org-card-title",children:a.title||a.mission?.slice(0,64)||"No title set"})]})]}),(0,e.jsxs)("div",{className:"org-card-meta",children:[(0,e.jsx)(i.qs,{tone:f,children:d}),(0,e.jsx)(i.qs,{tone:"heartbeat ok"===n?"ready":"terminated"===n?"danger":"neutral",children:n}),g>0?(0,e.jsxs)(i.qs,{tone:"neutral",children:[g," report",1===g?"":"s"]}):null]}),(0,e.jsxs)("dl",{className:"org-card-stats",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("dt",{children:"Active"}),(0,e.jsx)("dd",{children:j})]}),(0,e.jsxs)("div",{children:[(0,e.jsx)("dt",{children:"Blocked"}),(0,e.jsx)("dd",{className:k?"is-warn":"",children:k})]}),(0,e.jsxs)("div",{children:[(0,e.jsx)("dt",{children:"Done"}),(0,e.jsx)("dd",{children:l})]})]})]})}function o({node:a,workloadById:b}){let c=(a.reports||[]).length>0;return(0,e.jsxs)("li",{className:"org-branch",children:[(0,e.jsx)(n,{node:a,workloadById:b}),c?(0,e.jsx)("ul",{className:"org-children",children:a.reports.map(a=>(0,e.jsx)(o,{node:a,workloadById:b},a.id))}):null]})}function p(){let a=(0,j.zP)(),b=(0,j.hC)(),c=(0,k.vc)(),d=new Map((b.workload||[]).map(a=>[a.agent_id,a])),f=c.filter(a=>c.some(b=>b.reports_to===a.id)).length,g=c.filter(a=>!a.reports_to&&a.id).length;return(0,e.jsxs)(i.iN,{title:"Agent chart",description:"Company-style structure for your agent workforce. Set managers, define roles, and see workload at a glance.",children:[(0,e.jsxs)("section",{className:"admin-stats",children:[(0,e.jsx)(i.hI,{label:"Headcount",value:b.totals.active_agents}),(0,e.jsx)(i.hI,{label:"Leaders",value:f}),(0,e.jsx)(i.hI,{label:"Root nodes",value:g}),(0,e.jsx)(i.hI,{label:"Active tasks",value:b.totals.active_tasks})]}),(0,e.jsxs)("section",{className:"admin-panel",children:[(0,e.jsxs)("div",{className:"admin-panel-head",children:[(0,e.jsx)("span",{children:"Agent chart"}),(0,e.jsx)("small",{children:"Top-down hierarchy. Each card shows role, status, and current workload."})]}),a.length?(0,e.jsx)("div",{className:"org-chart-scroll",children:(0,e.jsx)("ul",{className:"org-chart",children:a.map(a=>(0,e.jsx)(o,{node:a,workloadById:d},a.id))})}):(0,e.jsx)(i.pp,{title:"No agents yet",children:"Create an agent on the Agents page, then come back here to assign managers."})]}),(0,e.jsxs)("section",{className:"admin-grid reports-layout",children:[(0,e.jsxs)("div",{className:"admin-panel",children:[(0,e.jsxs)("div",{className:"admin-panel-head",children:[(0,e.jsx)("span",{children:"Reporting lines"}),(0,e.jsx)("small",{children:"Re-parent any agent. Cycles are blocked automatically."})]}),c.length?(0,e.jsx)("div",{className:"admin-card-list compact",children:c.map(a=>{let b=a.reports_to?c.find(b=>b.id===a.reports_to):null,d=c.filter(b=>b.id!==a.id),f=a.role&&s[a.role]?a.role:"individual_contributor";return(0,e.jsxs)("form",{action:u,className:"org-reporting-row",children:[(0,e.jsx)("input",{type:"hidden",name:"agent_id",value:a.id}),(0,e.jsxs)("div",{className:"org-reporting-identity",children:[(0,e.jsx)("div",{className:"org-card-avatar small","aria-hidden":"true",children:m(a.name)}),(0,e.jsxs)("div",{children:[(0,e.jsx)("div",{className:"org-reporting-name",children:a.name}),(0,e.jsx)("div",{className:"org-reporting-sub",children:b?`Reports to ${b.name}`:"Top of chain"})]})]}),(0,e.jsxs)("div",{className:"org-reporting-fields",children:[(0,e.jsxs)("label",{className:"org-reporting-field",children:[(0,e.jsx)("span",{children:"Title"}),(0,e.jsx)("input",{type:"text",name:"title",defaultValue:a.title||"",placeholder:"e.g. Marketing Manager"})]}),(0,e.jsxs)("label",{className:"org-reporting-field",children:[(0,e.jsx)("span",{children:"Role"}),(0,e.jsx)("select",{name:"role",defaultValue:f,children:Object.entries(s).map(([a,b])=>(0,e.jsx)("option",{value:a,children:b},a))})]}),(0,e.jsxs)("label",{className:"org-reporting-field",children:[(0,e.jsx)("span",{children:"Manager"}),(0,e.jsxs)("select",{name:"reports_to",defaultValue:a.reports_to||"",children:[(0,e.jsx)("option",{value:"",children:"— None (top of chain)"}),d.map(a=>(0,e.jsx)("option",{value:a.id,children:a.name},a.id))]})]}),(0,e.jsx)("button",{className:"admin-button",type:"submit",children:"Save"})]})]},a.id)})}):(0,e.jsx)(i.pp,{title:"No agents yet",children:"Create agents to start building your org."})]}),(0,e.jsxs)("div",{className:"admin-panel",children:[(0,e.jsxs)("div",{className:"admin-panel-head",children:[(0,e.jsx)("span",{children:"Workload by agent"}),(0,e.jsx)("small",{children:"Derived from active tasks."})]}),b.workload.length?(0,e.jsx)("div",{className:"admin-card-list compact",children:b.workload.map(a=>(0,e.jsxs)("div",{className:"admin-record compact",children:[(0,e.jsxs)("div",{className:"admin-record-top",children:[(0,e.jsx)("b",{children:a.agent_name||a.agent_id}),(0,e.jsxs)(i.qs,{tone:a.blocked_tasks?"danger":a.active_tasks?"ready":"neutral",children:[a.active_tasks," active"]})]}),(0,e.jsxs)("p",{children:[a.total_tasks," total \xb7 ",a.blocked_tasks," blocked \xb7 ",a.completed_tasks," complete"]})]},a.agent_id))}):(0,e.jsx)(i.pp,{title:"No workload data",children:"Assign tasks to see workload distribution."})]})]})]})}(0,f.A)(u,"4045b474fc63a6a572f3ca03f813d3525209e55e2b",null),d()}catch(a){d(a)}})},94657:(a,b,c)=>{"use strict";c.d(b,{default:()=>f});var d=c(21124),e=c(38301);function f(){let[a,b]=(0,e.useState)([]),[c,f]=(0,e.useState)("");return(0,d.jsx)("div",{className:"project-switcher","data-project-switcher":!0,children:(0,d.jsxs)("select",{value:c,onChange:a=>{var b;f(b=a.target.value),b?localStorage.setItem("madarx.activeProjectId",b):localStorage.removeItem("madarx.activeProjectId"),window.dispatchEvent(new CustomEvent("madarx:project-change",{detail:{project_id:b||null}}))},"aria-label":"Active project",children:[(0,d.jsx)("option",{value:"",children:"All projects"}),a.map(a=>(0,d.jsx)("option",{value:a.id,children:a.name},a.id))]})})}}};
|