madarx 2.17.0 → 2.18.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 +536 -536
- package/.next/standalone/.next/app-path-routes-manifest.json +68 -68
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +15 -15
- package/.next/standalone/.next/react-loadable-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.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 +2 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +4 -4
- package/.next/standalone/.next/server/app/activity/page.js +1 -1
- package/.next/standalone/.next/server/app/activity/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/activity/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/page.js +4 -4
- package/.next/standalone/.next/server/app/admin/page.js.nft.json +1 -1
- 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.js.nft.json +1 -1
- 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.js.nft.json +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]/active-run/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/brand/share/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.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.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.js +2 -2
- 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.js +13 -13
- 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.js +2 -2
- 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.js +2 -2
- 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.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.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/approvals/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/architecture/page.js +1 -1
- package/.next/standalone/.next/server/app/architecture/page.js.nft.json +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 +4 -4
- package/.next/standalone/.next/server/app/audit/live/page.js +1 -1
- package/.next/standalone/.next/server/app/audit/live/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/live/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/audit/page.js +1 -1
- package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/brand/page.js +1 -1
- package/.next/standalone/.next/server/app/brand/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/brand/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/brand.html +2 -1
- package/.next/standalone/.next/server/app/brand.rsc +4 -4
- package/.next/standalone/.next/server/app/disk/page.js +1 -1
- package/.next/standalone/.next/server/app/disk/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/disk/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/federated-ai/page.js +1 -1
- package/.next/standalone/.next/server/app/federated-ai/page.js.nft.json +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 +4 -4
- package/.next/standalone/.next/server/app/hail/[id]/governance/page.js +1 -1
- package/.next/standalone/.next/server/app/hail/[id]/governance/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/hail/[id]/governance/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/hail/[id]/interview/page.js +1 -1
- 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 +1 -1
- 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 +2 -2
- 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.js +1 -1
- package/.next/standalone/.next/server/app/help/[slug]/page.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/help/page.js.nft.json +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 +5 -5
- package/.next/standalone/.next/server/app/join/page.js +1 -1
- package/.next/standalone/.next/server/app/join/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/join/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/join.html +1 -1
- package/.next/standalone/.next/server/app/join.rsc +4 -4
- package/.next/standalone/.next/server/app/login/page.js +1 -1
- package/.next/standalone/.next/server/app/login/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/marketplace/page.js +4 -4
- package/.next/standalone/.next/server/app/marketplace/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/marketplace/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/mines/[projectId]/page.js +1 -1
- package/.next/standalone/.next/server/app/mines/[projectId]/page.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/mines/[projectId]/results/page.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/mines/page.js.nft.json +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 +2 -2
- package/.next/standalone/.next/server/app/missions/page.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/onboarding/org/page.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +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 +4 -4
- 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.js +5 -5
- package/.next/standalone/.next/server/app/page.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/projects/[slug]/log/page.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/projects/[slug]/page.js.nft.json +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 +3 -3
- package/.next/standalone/.next/server/app/projects/new/page.js.nft.json +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 +2 -2
- package/.next/standalone/.next/server/app/projects/new.rsc +5 -5
- package/.next/standalone/.next/server/app/projects/page.js +34 -24
- package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
- 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.js +1 -1
- package/.next/standalone/.next/server/app/reports/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/reports/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/runtime/page.js +1 -1
- package/.next/standalone/.next/server/app/runtime/page.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/settings/account/page.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/settings/advanced/page.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/settings/appearance/page.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/settings/brand/page.js.nft.json +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 +5 -5
- package/.next/standalone/.next/server/app/settings/connectors/page.js +1 -1
- package/.next/standalone/.next/server/app/settings/connectors/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/connectors/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/engines/page.js +1 -1
- package/.next/standalone/.next/server/app/settings/engines/page.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/settings/onboarding/page.js.nft.json +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 +5 -5
- package/.next/standalone/.next/server/app/settings/organization/page.js +2 -2
- 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.js +1 -1
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/settings/runtime/page.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/settings/team/page.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/settings/tools/page.js.nft.json +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 +5 -5
- package/.next/standalone/.next/server/app/share/[token]/page.js +1 -1
- package/.next/standalone/.next/server/app/share/[token]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/share/[token]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/share/space/[token]/page.js +1 -1
- package/.next/standalone/.next/server/app/share/space/[token]/page.js.nft.json +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 +2 -2
- package/.next/standalone/.next/server/app/tasks/[id]/page.js.nft.json +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.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/team/[agentId]/page.js +1 -1
- package/.next/standalone/.next/server/app/team/[agentId]/page.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/team/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/team/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/tools/page.js +1 -1
- package/.next/standalone/.next/server/app/tools/page.js.nft.json +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.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/whatsapp/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/whatsapp.html +2 -2
- package/.next/standalone/.next/server/app/whatsapp.rsc +4 -4
- 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.js +1 -1
- package/.next/standalone/.next/server/app/workflows/new/definition/page.js.nft.json +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 +68 -68
- package/.next/standalone/.next/server/chunks/1648.js +1 -1
- package/.next/standalone/.next/server/chunks/1699.js +35 -18
- package/.next/standalone/.next/server/chunks/{3806.js → 3379.js} +1 -1
- package/.next/standalone/.next/server/chunks/4804.js +1 -1
- package/.next/standalone/.next/server/chunks/6059.js +1 -1
- package/.next/standalone/.next/server/chunks/{9195.js → 9483.js} +1 -1
- package/.next/standalone/.next/server/functions-config-manifest.json +45 -45
- 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 +2 -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/494-02cf75066d25e8ac.js +1 -0
- package/.next/standalone/.next/static/chunks/8217.9459315d921fdd61.js +1 -0
- package/.next/{static/chunks/app/agents/[id]/page-e4bcb0ace2900a11.js → standalone/.next/static/chunks/app/agents/[id]/page-fd263522f6c29653.js} +1 -1
- package/.next/{static/chunks/app/agents/page-47a00aa58327a35e.js → standalone/.next/static/chunks/app/agents/page-5860869c305cc54b.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/layout-457acc50d33a5e0e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/login/page-69e66f7316e3aaf2.js +1 -0
- package/.next/standalone/.next/static/chunks/app/marketplace/page-b21a9b2946742aa4.js +1 -0
- package/.next/standalone/.next/static/chunks/app/page-9a013fdb2983cbf4.js +1 -0
- package/.next/standalone/.next/static/chunks/app/projects/page-3d7140091264933a.js +1 -0
- package/.next/standalone/.next/static/chunks/app/settings/layout-fd443bfa8cac181e.js +1 -0
- package/.next/standalone/.next/static/chunks/webpack-e4f2cfb4ad98f256.js +1 -0
- package/.next/standalone/.next/static/css/31fb2fdadf8f1c6b.css +1 -0
- package/.next/standalone/CHANGELOG.md +25 -0
- package/.next/standalone/package.json +1 -1
- package/.next/static/chunks/494-02cf75066d25e8ac.js +1 -0
- package/.next/static/chunks/8217.9459315d921fdd61.js +1 -0
- package/.next/{standalone/.next/static/chunks/app/agents/[id]/page-e4bcb0ace2900a11.js → static/chunks/app/agents/[id]/page-fd263522f6c29653.js} +1 -1
- package/.next/{standalone/.next/static/chunks/app/agents/page-47a00aa58327a35e.js → static/chunks/app/agents/page-5860869c305cc54b.js} +1 -1
- package/.next/static/chunks/app/layout-457acc50d33a5e0e.js +1 -0
- package/.next/static/chunks/app/login/page-69e66f7316e3aaf2.js +1 -0
- package/.next/static/chunks/app/marketplace/page-b21a9b2946742aa4.js +1 -0
- package/.next/static/chunks/app/page-9a013fdb2983cbf4.js +1 -0
- package/.next/static/chunks/app/projects/page-3d7140091264933a.js +1 -0
- package/.next/static/chunks/app/settings/layout-fd443bfa8cac181e.js +1 -0
- package/.next/static/chunks/webpack-e4f2cfb4ad98f256.js +1 -0
- package/.next/static/css/31fb2fdadf8f1c6b.css +1 -0
- package/CHANGELOG.md +25 -0
- package/CLAUDE.md +1 -1
- package/README.md +1 -1
- package/ai-docs/key-constraints.md +9 -1
- package/app/agents/agent-events-bus.js +11 -1
- package/app/api/connections/[service]/verify/route.js +29 -1
- package/app/api/fs/pick-folder/route.js +13 -11
- package/app/api/orchestrator/stream/route.js +92 -9
- package/app/api/voice/realtime/session/route.js +4 -0
- package/app/components/app-topbar.jsx +265 -28
- package/app/components/dashboard/chat-panel.jsx +54 -5
- package/app/components/dashboard/thinking-disclosure.jsx +59 -0
- package/app/components/dashboard/tool-steps.js +9 -0
- package/app/components/dashboard/use-main-agent-stream.js +2 -0
- package/app/components/dashboard/use-realtime-voice.js +33 -5
- package/app/components/dashboard/use-stream-command.js +29 -2
- package/app/components/dashboard/voice-panel.jsx +148 -36
- package/app/components/ui/marketplace/install-toggle.jsx +44 -9
- package/app/globals.css +148 -8
- package/app/login/login-client.jsx +23 -5
- package/app/marketplace/connection-setup-modal.jsx +31 -1
- package/app/marketplace/connection-setup-steps/api-key-step.jsx +20 -3
- package/app/marketplace/install-toast.jsx +1 -1
- package/app/marketplace/marketplace-row.jsx +8 -1
- package/app/marketplace/marketplace-shell.jsx +78 -7
- package/app/marketplace/workflow-card.jsx +2 -1
- package/lib/agent-config.js +7 -0
- package/lib/agent-engines.js +182 -21
- package/lib/auth-config.js +24 -8
- package/lib/claude.js +19 -2
- package/lib/cli/doctor.js +25 -0
- package/lib/connection-seeds.js +1 -1
- package/lib/engine-verbosity.js +42 -0
- package/lib/env-file.js +3 -0
- package/lib/pick-folder-authz.js +15 -0
- package/lib/realtime-openai.js +49 -1
- package/lib/tools/adapters/browser-session.js +37 -8
- package/lib/tools/adapters/github.js +47 -5
- package/lib/tools/adapters/skill-bridge.js +146 -0
- package/lib/tools/registry.js +40 -4
- package/lib/voice/context.js +1 -1
- package/lib/voice/tools.js +34 -2
- package/package.json +1 -1
- package/scripts/migrate-auth-v1.mjs +92 -0
- package/.next/standalone/.next/static/chunks/3054-451abdd7b9afc2ac.js +0 -1
- package/.next/standalone/.next/static/chunks/8217.0beb0a316c7ad5d8.js +0 -1
- package/.next/standalone/.next/static/chunks/app/layout-b7e1918b9125641e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/login/page-d2298bc1803944ae.js +0 -1
- package/.next/standalone/.next/static/chunks/app/marketplace/page-0b7d3a6309302de3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/page-887ef6f96897f78a.js +0 -1
- package/.next/standalone/.next/static/chunks/app/projects/page-739d4cc74824d336.js +0 -1
- package/.next/standalone/.next/static/chunks/app/settings/layout-08f6b30132b26dd1.js +0 -1
- package/.next/standalone/.next/static/chunks/webpack-f916d679fe38a701.js +0 -1
- package/.next/standalone/.next/static/css/2587cd46c922a6d8.css +0 -1
- package/.next/static/chunks/3054-451abdd7b9afc2ac.js +0 -1
- package/.next/static/chunks/8217.0beb0a316c7ad5d8.js +0 -1
- package/.next/static/chunks/app/layout-b7e1918b9125641e.js +0 -1
- package/.next/static/chunks/app/login/page-d2298bc1803944ae.js +0 -1
- package/.next/static/chunks/app/marketplace/page-0b7d3a6309302de3.js +0 -1
- package/.next/static/chunks/app/page-887ef6f96897f78a.js +0 -1
- package/.next/static/chunks/app/projects/page-739d4cc74824d336.js +0 -1
- package/.next/static/chunks/app/settings/layout-08f6b30132b26dd1.js +0 -1
- package/.next/static/chunks/webpack-f916d679fe38a701.js +0 -1
- package/.next/static/css/2587cd46c922a6d8.css +0 -1
- /package/.next/standalone/.next/static/{ZxaTPKGC9lESQlvHfrHgp → -FRz43s1H_LZFhx24FvnL}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{ZxaTPKGC9lESQlvHfrHgp → -FRz43s1H_LZFhx24FvnL}/_ssgManifest.js +0 -0
- /package/.next/static/{ZxaTPKGC9lESQlvHfrHgp → -FRz43s1H_LZFhx24FvnL}/_buildManifest.js +0 -0
- /package/.next/static/{ZxaTPKGC9lESQlvHfrHgp → -FRz43s1H_LZFhx24FvnL}/_ssgManifest.js +0 -0
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* browser-session.js — native Playwright browser-interaction adapter.
|
|
3
3
|
*
|
|
4
|
-
* Drives a real
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* Drives a real Chromium so the main agent can navigate, click, type, read, and
|
|
5
|
+
* screenshot pages that need JavaScript (unlike browser_navigate, which is
|
|
6
|
+
* fetch + regex only). One managed persistent context is shared across calls and
|
|
7
|
+
* auto-closed after an idle window so we never leak browser processes.
|
|
8
|
+
*
|
|
9
|
+
* Headless by default. Set MADARX_BROWSER_HEADED=1 (or true/yes/on) to open a
|
|
10
|
+
* VISIBLE window the operator can watch — it prefers the installed Chrome
|
|
11
|
+
* (channel:'chrome'), falling back to bundled Chromium. The idle auto-close
|
|
12
|
+
* (90s) still applies, so a visible window left untouched closes on its own.
|
|
8
13
|
*
|
|
9
14
|
* Safety posture:
|
|
10
15
|
* - Dedicated profile under DATA_DIR/browser-profile — NOT the user's personal
|
|
@@ -45,6 +50,33 @@ function cap(text) {
|
|
|
45
50
|
return redactToolOutput(String(text ?? '').slice(0, MAX_TEXT_CHARS));
|
|
46
51
|
}
|
|
47
52
|
|
|
53
|
+
// Headed mode lets the operator watch the agent drive a real, visible browser.
|
|
54
|
+
// Off by default so headless servers and CI stay unattended. When on, prefer the
|
|
55
|
+
// operator's installed Chrome (channel:'chrome') so it looks/behaves like a real
|
|
56
|
+
// browser; we transparently fall back to bundled Chromium if that channel is
|
|
57
|
+
// unavailable. The persistent profile (PROFILE_DIR) is still the dedicated
|
|
58
|
+
// madarX profile, never the user's personal Chrome data.
|
|
59
|
+
function isHeaded() {
|
|
60
|
+
const v = String(process.env.MADARX_BROWSER_HEADED || '').trim().toLowerCase();
|
|
61
|
+
return v === '1' || v === 'true' || v === 'yes' || v === 'on';
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
async function launchContext(chromium) {
|
|
65
|
+
const headed = isHeaded();
|
|
66
|
+
const base = {
|
|
67
|
+
headless: !headed,
|
|
68
|
+
args: ['--no-sandbox', '--disable-dev-shm-usage'],
|
|
69
|
+
};
|
|
70
|
+
if (headed) {
|
|
71
|
+
try {
|
|
72
|
+
return await chromium.launchPersistentContext(PROFILE_DIR, { ...base, channel: 'chrome' });
|
|
73
|
+
} catch {
|
|
74
|
+
// Installed Chrome not found — fall back to bundled Chromium, still headed.
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return await chromium.launchPersistentContext(PROFILE_DIR, base);
|
|
78
|
+
}
|
|
79
|
+
|
|
48
80
|
function touchIdleTimer() {
|
|
49
81
|
if (_idleTimer) clearTimeout(_idleTimer);
|
|
50
82
|
_idleTimer = setTimeout(() => { closeBrowser().catch(() => {}); }, IDLE_CLOSE_MS);
|
|
@@ -75,10 +107,7 @@ async function ensurePage() {
|
|
|
75
107
|
}
|
|
76
108
|
fs.mkdirSync(PROFILE_DIR, { recursive: true });
|
|
77
109
|
try {
|
|
78
|
-
_context = await chromium
|
|
79
|
-
headless: true,
|
|
80
|
-
args: ['--no-sandbox', '--disable-dev-shm-usage'],
|
|
81
|
-
});
|
|
110
|
+
_context = await launchContext(chromium);
|
|
82
111
|
} catch (err) {
|
|
83
112
|
_context = null;
|
|
84
113
|
throw new Error(
|
|
@@ -65,12 +65,30 @@ function parseOwnerRepo(repo_full_name) {
|
|
|
65
65
|
// ── Error extraction ──────────────────────────────────────────────────────────
|
|
66
66
|
|
|
67
67
|
async function extractGitHubError(res) {
|
|
68
|
+
let message = `GitHub API error: ${res.status}`;
|
|
68
69
|
try {
|
|
69
70
|
const data = await res.json();
|
|
70
|
-
|
|
71
|
+
if (data?.message) message = data.message;
|
|
71
72
|
} catch {
|
|
72
|
-
|
|
73
|
+
// non-JSON body — keep the status-based message
|
|
73
74
|
}
|
|
75
|
+
|
|
76
|
+
// Actionable guidance for the two access failures users actually hit.
|
|
77
|
+
// SAML SSO: the org requires the token to be explicitly authorized. GitHub
|
|
78
|
+
// signals this via the x-github-sso response header.
|
|
79
|
+
const sso = res.headers?.get?.('x-github-sso');
|
|
80
|
+
if (res.status === 403 && sso) {
|
|
81
|
+
const urlMatch = /url=([^;,\s]+)/i.exec(sso);
|
|
82
|
+
const where = urlMatch ? ` Authorize it here: ${urlMatch[1]}` : '';
|
|
83
|
+
return `${message} — this org requires SAML SSO authorization for your token.${where}`;
|
|
84
|
+
}
|
|
85
|
+
if (res.status === 403) {
|
|
86
|
+
return `${message} — the token is valid but lacks permission for this resource (check the fine-grained PAT's repository access / scopes, and authorize SSO if the org uses it).`;
|
|
87
|
+
}
|
|
88
|
+
if (res.status === 404) {
|
|
89
|
+
return `${message} — not found, OR your token cannot see it. A fine-grained PAT only sees repos it was explicitly granted; a classic PAT needs the 'repo' scope. Grant access to this repo/org and retry.`;
|
|
90
|
+
}
|
|
91
|
+
return message;
|
|
74
92
|
}
|
|
75
93
|
|
|
76
94
|
// ── Response shapers ──────────────────────────────────────────────────────────
|
|
@@ -146,12 +164,36 @@ export async function ghRepoList(input = {}, options = {}) {
|
|
|
146
164
|
const token = requireCredential('GITHUB_TOKEN', options);
|
|
147
165
|
const agentId = options.agent_id ?? null;
|
|
148
166
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
167
|
+
// Two listing modes:
|
|
168
|
+
// - `org` set → GET /orgs/{org}/repos (repos owned by that org the token can
|
|
169
|
+
// see). This is how you reach org repos you were granted access to.
|
|
170
|
+
// - otherwise → GET /user/repos across every affiliation the token has, so
|
|
171
|
+
// collaborator + organization_member repos show up, not just owned ones.
|
|
172
|
+
const org = input.org ? String(input.org).trim() : '';
|
|
173
|
+
let url;
|
|
174
|
+
if (org) {
|
|
175
|
+
if (!/^[A-Za-z0-9_.-]+$/.test(org)) {
|
|
176
|
+
throw new Error(`org must be a valid GitHub org/owner name, got: ${org}`);
|
|
177
|
+
}
|
|
178
|
+
url = new URL(`${GH_API}/orgs/${org}/repos`);
|
|
179
|
+
if (input.type) url.searchParams.set('type', String(input.type)); // all|public|private|forks|sources|member
|
|
180
|
+
} else {
|
|
181
|
+
url = new URL(`${GH_API}/user/repos`);
|
|
182
|
+
// Default to the full affiliation set so org/collaborator repos are listed.
|
|
183
|
+
url.searchParams.set('affiliation', String(input.affiliation || 'owner,collaborator,organization_member'));
|
|
184
|
+
if (input.visibility) url.searchParams.set('visibility', String(input.visibility));
|
|
185
|
+
// `type` and `affiliation` are mutually exclusive on /user/repos — only send
|
|
186
|
+
// `type` when the caller did not narrow by affiliation themselves.
|
|
187
|
+
if (input.type && !input.affiliation) {
|
|
188
|
+
url.searchParams.delete('affiliation');
|
|
189
|
+
url.searchParams.set('type', String(input.type));
|
|
190
|
+
}
|
|
191
|
+
}
|
|
152
192
|
if (input.sort) url.searchParams.set('sort', String(input.sort));
|
|
153
193
|
const perPage = Math.min(Math.max(Number(input.per_page || 30), 1), 100);
|
|
154
194
|
url.searchParams.set('per_page', String(perPage));
|
|
195
|
+
const page = Math.max(Number(input.page || 1), 1);
|
|
196
|
+
if (page > 1) url.searchParams.set('page', String(page));
|
|
155
197
|
|
|
156
198
|
const res = await wrapFetch('gh_repo_list', agentId)(url, {
|
|
157
199
|
headers: githubHeaders(token),
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
// Skill bridge — Phase 4 of voice/main-agent unification.
|
|
2
|
+
//
|
|
3
|
+
// Exposes a tightly-allowlisted set of first-party gstack CLI skills (the
|
|
4
|
+
// visible-browser flows: /connect-chrome, /browse, /qa-only) as ONE in-app
|
|
5
|
+
// tool. The main agent (and, by extension, voice — which now shares the full
|
|
6
|
+
// catalog) can drive the same real browser the operator watches live.
|
|
7
|
+
//
|
|
8
|
+
// SECURITY — this crosses the Claude Code CLI trust boundary, so it is the most
|
|
9
|
+
// sharply gated tool in the registry:
|
|
10
|
+
// • risk_level 'irreversible_external' → the main-agent path ALWAYS creates an
|
|
11
|
+
// approval request, even in trust-mode 'auto' (never bypassable).
|
|
12
|
+
// • registry.js force-gates it on the AGENT path too (added alongside
|
|
13
|
+
// browser_harness_run), so a sub-agent on auto can never self-run it.
|
|
14
|
+
// • enabled_default:false → the owner must explicitly install it first.
|
|
15
|
+
// • Hard env kill-switch MADARX_SKILL_BRIDGE_DISABLED=1.
|
|
16
|
+
// • Only skills on SKILL_BRIDGE_ALLOWLIST may be invoked — the LLM cannot
|
|
17
|
+
// name an arbitrary skill or shell command. The instruction is passed as
|
|
18
|
+
// data, never interpolated into a shell line.
|
|
19
|
+
// • The spawned CLI still runs under bypassPermissions bounded by the
|
|
20
|
+
// load-bearing deny list in .claude/settings.json (no rm/sudo/secret reads/
|
|
21
|
+
// network-from-shell/etc.).
|
|
22
|
+
//
|
|
23
|
+
// These are FIRST-PARTY skills (gstack, shipped with the repo), NOT
|
|
24
|
+
// agent-authored code — so this does not violate the "never load/execute
|
|
25
|
+
// LLM-authored code" invariant. The agent only chooses WHICH allowlisted skill
|
|
26
|
+
// and WHAT instruction; it never supplies the skill body.
|
|
27
|
+
|
|
28
|
+
import { runClaudeCodeAgent } from '../../agent-engines.js';
|
|
29
|
+
import { DATA_DIR, WORKSPACE } from '../../paths.js';
|
|
30
|
+
import { redactToolOutput } from '../safety.js';
|
|
31
|
+
|
|
32
|
+
const DEFAULT_TIMEOUT_MS = 180000;
|
|
33
|
+
const MAX_TIMEOUT_MS = 600000;
|
|
34
|
+
const MAX_INSTRUCTION_CHARS = 4000;
|
|
35
|
+
const MAX_SUMMARY_CHARS = 12000;
|
|
36
|
+
const DEFAULT_MAX_TURNS = 25;
|
|
37
|
+
|
|
38
|
+
// Allowlisted skills the bridge may invoke, keyed by the slug the agent passes.
|
|
39
|
+
// Each entry: how to phrase the invocation + a one-line purpose. Keep this list
|
|
40
|
+
// SHORT and visible-browser-focused; adding an entry widens the trust surface.
|
|
41
|
+
const SKILL_BRIDGE_ALLOWLIST = {
|
|
42
|
+
'connect-chrome': {
|
|
43
|
+
purpose: 'Launch the visible GStack Chromium browser the operator can watch live.',
|
|
44
|
+
invoke: 'connect-chrome',
|
|
45
|
+
},
|
|
46
|
+
browse: {
|
|
47
|
+
purpose: 'Drive a browser to navigate, click, type, read pages, and capture screenshots.',
|
|
48
|
+
invoke: 'browse',
|
|
49
|
+
},
|
|
50
|
+
'qa-only': {
|
|
51
|
+
purpose: 'Run a QA pass against a running site and report findings (no fixes).',
|
|
52
|
+
invoke: 'qa-only',
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export function listBridgeableSkills() {
|
|
57
|
+
return Object.entries(SKILL_BRIDGE_ALLOWLIST).map(([slug, meta]) => ({ slug, purpose: meta.purpose }));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function maxSummaryChars() {
|
|
61
|
+
const v = Number(process.env.MADARX_TOOL_OUTPUT_MAX_BYTES || MAX_SUMMARY_CHARS);
|
|
62
|
+
if (!Number.isFinite(v) || v <= 0) return MAX_SUMMARY_CHARS;
|
|
63
|
+
return Math.min(MAX_SUMMARY_CHARS, Math.floor(v));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function capSummary(text) {
|
|
67
|
+
return redactToolOutput(String(text || '').slice(0, maxSummaryChars()));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Sync validation — runs BEFORE the approval/trust gates (PREFLIGHTS map). Throw
|
|
71
|
+
// to reject outright; never reach the model with an off-allowlist skill.
|
|
72
|
+
export function skillBridgeRunPreflight(input = {}) {
|
|
73
|
+
if (process.env.MADARX_SKILL_BRIDGE_DISABLED === '1') {
|
|
74
|
+
throw new Error('skill bridge is disabled (MADARX_SKILL_BRIDGE_DISABLED=1)');
|
|
75
|
+
}
|
|
76
|
+
const skill = String(input.skill || '').trim().toLowerCase();
|
|
77
|
+
if (!skill) throw new Error('skill is required');
|
|
78
|
+
const entry = SKILL_BRIDGE_ALLOWLIST[skill];
|
|
79
|
+
if (!entry) {
|
|
80
|
+
throw new Error(`skill "${skill}" is not bridgeable. Allowed: ${Object.keys(SKILL_BRIDGE_ALLOWLIST).join(', ')}`);
|
|
81
|
+
}
|
|
82
|
+
const instruction = String(input.instruction || '').trim();
|
|
83
|
+
if (!instruction) throw new Error('instruction is required');
|
|
84
|
+
if (instruction.length > MAX_INSTRUCTION_CHARS) {
|
|
85
|
+
throw new Error(`instruction is too long: ${instruction.length} chars; max ${MAX_INSTRUCTION_CHARS}`);
|
|
86
|
+
}
|
|
87
|
+
const timeoutMs = Math.max(
|
|
88
|
+
5000,
|
|
89
|
+
Math.min(MAX_TIMEOUT_MS, Number(input.timeout_ms || DEFAULT_TIMEOUT_MS) || DEFAULT_TIMEOUT_MS),
|
|
90
|
+
);
|
|
91
|
+
return { skill, entry, instruction, timeoutMs };
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function buildSystemPrompt(skill, entry) {
|
|
95
|
+
return [
|
|
96
|
+
'You are a single-purpose runner spawned by the madarX main agent.',
|
|
97
|
+
`Your ONLY job: invoke the /${entry.invoke} skill and carry out the operator instruction with it.`,
|
|
98
|
+
`Purpose of this skill: ${entry.purpose}`,
|
|
99
|
+
'Rules:',
|
|
100
|
+
`- Use ONLY the /${entry.invoke} skill. Do not invoke other skills, write files outside workspace, or run unrelated commands.`,
|
|
101
|
+
'- Do not read secrets, .env files, or anything the deny list blocks.',
|
|
102
|
+
'- When done, reply with a concise plain-text summary of what happened and what you observed (URLs visited, key results). No markdown tables.',
|
|
103
|
+
].join('\n');
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export async function skillBridgeRun(input = {}, options = {}) {
|
|
107
|
+
const { skill, entry, instruction, timeoutMs } = skillBridgeRunPreflight(input);
|
|
108
|
+
const started = Date.now();
|
|
109
|
+
|
|
110
|
+
const systemPrompt = buildSystemPrompt(skill, entry);
|
|
111
|
+
const userMessage = `Use the /${entry.invoke} skill to do the following:\n\n${instruction}`;
|
|
112
|
+
|
|
113
|
+
try {
|
|
114
|
+
const text = await runClaudeCodeAgent({
|
|
115
|
+
systemPrompt,
|
|
116
|
+
userMessage,
|
|
117
|
+
maxTurns: DEFAULT_MAX_TURNS,
|
|
118
|
+
timeoutMs,
|
|
119
|
+
// Bounded toolset the gstack skills need (browser daemon runs via Bash).
|
|
120
|
+
// bypassPermissions + the .claude deny list remain the hard boundary.
|
|
121
|
+
allowedTools: ['Skill', 'Bash', 'Read', 'Write', 'Glob', 'Grep', 'WebFetch', 'WebSearch'],
|
|
122
|
+
addDirs: [WORKSPACE, DATA_DIR],
|
|
123
|
+
agentId: options.agent_id || 'main',
|
|
124
|
+
agentName: 'skill-bridge',
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
const summary = capSummary(text);
|
|
128
|
+
return {
|
|
129
|
+
ok: true,
|
|
130
|
+
tool: 'skill_bridge_run',
|
|
131
|
+
status: 'complete',
|
|
132
|
+
skill,
|
|
133
|
+
summary,
|
|
134
|
+
duration_ms: Date.now() - started,
|
|
135
|
+
};
|
|
136
|
+
} catch (err) {
|
|
137
|
+
return {
|
|
138
|
+
ok: false,
|
|
139
|
+
tool: 'skill_bridge_run',
|
|
140
|
+
status: 'failed',
|
|
141
|
+
skill,
|
|
142
|
+
error: String(err?.message || err).slice(0, 1000),
|
|
143
|
+
duration_ms: Date.now() - started,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
}
|
package/lib/tools/registry.js
CHANGED
|
@@ -61,6 +61,7 @@ import { gmail_messages_list, gmail_message_read, gmail_thread_read } from './ad
|
|
|
61
61
|
import { calendar_events_list, calendar_event_read } from './adapters/google-calendar.js';
|
|
62
62
|
import { transcribe_audio } from './adapters/transcribe.js';
|
|
63
63
|
import { browserHarnessRun, browserHarnessRunPreflight } from './adapters/browser-harness.js';
|
|
64
|
+
import { skillBridgeRun, skillBridgeRunPreflight } from './adapters/skill-bridge.js';
|
|
64
65
|
import { browserNavigate, browserExtractStructured } from './adapters/browser-fetch.js';
|
|
65
66
|
import { browserOpen, browserAct, browserExtract, browserScreenshot } from './adapters/browser-session.js';
|
|
66
67
|
import { voice_speak } from './adapters/tts.js';
|
|
@@ -348,6 +349,36 @@ const MARKETPLACE_TOOLS = [
|
|
|
348
349
|
required: ['script'],
|
|
349
350
|
},
|
|
350
351
|
},
|
|
352
|
+
{
|
|
353
|
+
name: 'skill_bridge_run',
|
|
354
|
+
title: 'Skill Bridge',
|
|
355
|
+
description: 'Run one allowlisted first-party gstack CLI skill (connect-chrome, browse, qa-only) to drive the real visible browser the operator can watch live. Crosses the Claude Code CLI trust boundary, so it is ALWAYS approval-gated for every run (even in trust-mode auto) and disabled by default. Pass the skill slug and a plain-language instruction; the bridge invokes only that skill, bounded by the .claude deny list.',
|
|
356
|
+
category: 'browser',
|
|
357
|
+
risk_level: 'irreversible_external',
|
|
358
|
+
approval_required: true,
|
|
359
|
+
approval_mode: 'approval_required',
|
|
360
|
+
required_env: [],
|
|
361
|
+
enabled_default: false,
|
|
362
|
+
allowlist_required: false,
|
|
363
|
+
rate_limit: { window_seconds: 300, max: 10 },
|
|
364
|
+
input_schema: {
|
|
365
|
+
type: 'object',
|
|
366
|
+
properties: {
|
|
367
|
+
skill: {
|
|
368
|
+
type: 'string',
|
|
369
|
+
description: 'Skill slug to invoke. One of: connect-chrome, browse, qa-only.',
|
|
370
|
+
enum: ['connect-chrome', 'browse', 'qa-only'],
|
|
371
|
+
},
|
|
372
|
+
instruction: {
|
|
373
|
+
type: 'string',
|
|
374
|
+
description: 'Plain-language instruction for the skill (e.g. "open Google News and search US Iran war, read the top 3 headlines"). Max 4000 chars.',
|
|
375
|
+
},
|
|
376
|
+
timeout_ms: { type: 'number', description: 'Timeout in milliseconds, capped at 600000. Default 180000.' },
|
|
377
|
+
approval_id: { type: 'string', description: 'Approval request ID for one-shot execution.' },
|
|
378
|
+
},
|
|
379
|
+
required: ['skill', 'instruction'],
|
|
380
|
+
},
|
|
381
|
+
},
|
|
351
382
|
{
|
|
352
383
|
name: 'browser_open',
|
|
353
384
|
title: 'Browser Open (Playwright)',
|
|
@@ -773,7 +804,7 @@ const MARKETPLACE_TOOLS = [
|
|
|
773
804
|
{
|
|
774
805
|
name: 'gh_repo_list',
|
|
775
806
|
title: 'List GitHub repos',
|
|
776
|
-
description: 'List GitHub repositories
|
|
807
|
+
description: 'List GitHub repositories the token can access. Without `org`, lists across all affiliations (owned + collaborator + organization_member). Pass `org` to list a specific organization\'s repos you were granted access to.',
|
|
777
808
|
category: 'github',
|
|
778
809
|
risk_level: 'low',
|
|
779
810
|
required_env: ['GITHUB_TOKEN'],
|
|
@@ -784,10 +815,13 @@ const MARKETPLACE_TOOLS = [
|
|
|
784
815
|
input_schema: {
|
|
785
816
|
type: 'object',
|
|
786
817
|
properties: {
|
|
787
|
-
|
|
788
|
-
|
|
818
|
+
org: { type: 'string', description: 'List repos for this organization/owner (GET /orgs/{org}/repos). Use this to reach org repos you were granted access to.' },
|
|
819
|
+
affiliation: { type: 'string', description: 'Comma-separated: owner, collaborator, organization_member. Default lists all three. Ignored when `org` is set.' },
|
|
820
|
+
visibility: { type: 'string', description: 'Filter by visibility: all, public, private. Ignored when `org` is set.' },
|
|
821
|
+
type: { type: 'string', description: 'Without org: all|owner|member (mutually exclusive with affiliation). With org: all|public|private|forks|sources|member.' },
|
|
789
822
|
sort: { type: 'string', description: 'Sort by: created, updated, pushed, full_name.' },
|
|
790
823
|
per_page: { type: 'number', description: 'Results per page, 1-100. Default 30.' },
|
|
824
|
+
page: { type: 'number', description: 'Page number for pagination. Default 1.' },
|
|
791
825
|
},
|
|
792
826
|
},
|
|
793
827
|
},
|
|
@@ -1737,6 +1771,7 @@ const ADAPTERS = {
|
|
|
1737
1771
|
calendar_event_read,
|
|
1738
1772
|
transcribe_audio,
|
|
1739
1773
|
browser_harness_run: browserHarnessRun,
|
|
1774
|
+
skill_bridge_run: skillBridgeRun,
|
|
1740
1775
|
browser_open: browserOpen,
|
|
1741
1776
|
browser_act: browserAct,
|
|
1742
1777
|
browser_extract: browserExtract,
|
|
@@ -1786,6 +1821,7 @@ const PREFLIGHTS = {
|
|
|
1786
1821
|
process_start: processStartPreflight,
|
|
1787
1822
|
process_kill: processKillPreflight,
|
|
1788
1823
|
browser_harness_run: browserHarnessRunPreflight,
|
|
1824
|
+
skill_bridge_run: skillBridgeRunPreflight,
|
|
1789
1825
|
};
|
|
1790
1826
|
|
|
1791
1827
|
function requiredEnvNames(required = []) {
|
|
@@ -2461,7 +2497,7 @@ export async function executeRegistryTool(toolName, input = {}, options = {}) {
|
|
|
2461
2497
|
// existing contract — the owner's explicit per-agent permission mode governs
|
|
2462
2498
|
// them — except browser_harness_run, which has always force-gated here.
|
|
2463
2499
|
const agentIrreversibleGate = isIrreversibleExternal(tool, input)
|
|
2464
|
-
&& (toolName === 'browser_harness_run' || Boolean(tool.source));
|
|
2500
|
+
&& (toolName === 'browser_harness_run' || toolName === 'skill_bridge_run' || Boolean(tool.source));
|
|
2465
2501
|
if (options.agent_id && agentIrreversibleGate && !consumeApprovalRequest(input.approval_id, { action_type: `agent_tool_irreversible:${toolName}` })) {
|
|
2466
2502
|
const req = createApprovalRequest({
|
|
2467
2503
|
action_type: `agent_tool_irreversible:${toolName}`,
|
package/lib/voice/context.js
CHANGED
|
@@ -210,7 +210,7 @@ export function buildVoiceContext(opts = {}) {
|
|
|
210
210
|
'Cross-scope access: find_artifacts searches every project, not just the active one. Call list_projects to enumerate projects on demand. Call get_state with project_id="<slug or id>" to read a specific project, or with project_id=null to read across all projects. Spaces are client-side UI tabs that group artifacts — they do not gate your reach; any artifact in any space is reachable via find_artifacts.',
|
|
211
211
|
);
|
|
212
212
|
sections.push(
|
|
213
|
-
'Rules: never speak API keys, ephemeral tokens, or secret values aloud. If a tool returns approval_required, tell the operator one short sentence and stop. Prefer artifact creation for anything longer than ~30 spoken seconds. Never invent artifact IDs — call find_artifacts or get_state first. To read an artifact\'s body, call read_artifact with the id from find_artifacts; do NOT claim you have read it until that call returns content. ARTIFACT CREATION — choose the right tool: (1) For any VISUAL result the operator expects to look designed — a list page, snapshot, brief, report, dashboard, presentation, landing page, "make a page for X", "show me X" — call generate_ui with a specific description that includes the actual content/data to render. generate_ui produces a full styled HTML document using the madarX brand system (typography, color, layout). (2) For plain written notes, scratch summaries, or pure markdown exports the operator asked for explicitly, use create_artifact with kind="markdown". Never use create_artifact for visual outputs — it stores raw text and the dashboard renders it as a basic document, not a designed page. Whenever the operator asks for a summary, brief, page, doc, or report, create the artifact unprompted as the result of the turn — do not ask for permission first.',
|
|
213
|
+
'Rules: never speak API keys, ephemeral tokens, or secret values aloud. If a tool returns approval_required, tell the operator one short sentence and stop. Prefer artifact creation for anything longer than ~30 spoken seconds. Never invent artifact IDs — call find_artifacts or get_state first. To read an artifact\'s body, call read_artifact with the id from find_artifacts; do NOT claim you have read it until that call returns content. ARTIFACT CREATION — choose the right tool: (1) For any VISUAL result the operator expects to look designed — a list page, snapshot, brief, report, dashboard, presentation, landing page, "make a page for X", "show me X" — call generate_ui with a specific description that includes the actual content/data to render. generate_ui produces a full styled HTML document using the madarX brand system (typography, color, layout). (2) For plain written notes, scratch summaries, or pure markdown exports the operator asked for explicitly, use create_artifact with kind="markdown". Never use create_artifact for visual outputs — it stores raw text and the dashboard renders it as a basic document, not a designed page. Whenever the operator asks for a summary, brief, page, doc, or report, create the artifact unprompted as the result of the turn — do not ask for permission first. BRAND IS MANDATORY: every visual artifact MUST follow the madarX brand guidelines above (palette, typography, layout) — generate_ui applies them automatically, so always route designed output through generate_ui. Never emit an off-brand layout, default-looking page, or any emoji in an artifact.',
|
|
214
214
|
);
|
|
215
215
|
|
|
216
216
|
const instructions = sections.join('\n\n').slice(0, 7800);
|
package/lib/voice/tools.js
CHANGED
|
@@ -64,8 +64,40 @@ function mainAgentToolList() {
|
|
|
64
64
|
return getTools();
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
+
// Voice gets the SAME full tool catalog as the typed main agent — that is the
|
|
68
|
+
// product contract (voice IS the main agent) and it must match what the voice
|
|
69
|
+
// instruction block advertises (lib/voice/context.js lists every tool by name).
|
|
70
|
+
// Latency is controlled the right way instead: session.reasoning.effort='low'
|
|
71
|
+
// on gpt-realtime-2 (lib/realtime-openai.js) keeps first-audio snappy while the
|
|
72
|
+
// model still has the whole toolset. The model's improved tool-selection avoids
|
|
73
|
+
// over-calling on chit-chat. For deployments that prefer a tiny conversational
|
|
74
|
+
// toolset over capability, set MADARX_VOICE_FAST_TOOLS=1 to trim to this set.
|
|
75
|
+
const FAST_VOICE_TOOL_NAMES = new Set([
|
|
76
|
+
'web_search',
|
|
77
|
+
'web_fetch',
|
|
78
|
+
'find_artifacts',
|
|
79
|
+
'get_state',
|
|
80
|
+
'create_artifact',
|
|
81
|
+
'update_artifact',
|
|
82
|
+
'generate_ui',
|
|
83
|
+
'voice_speak',
|
|
84
|
+
'create_agent',
|
|
85
|
+
'upsert_schedule',
|
|
86
|
+
]);
|
|
87
|
+
|
|
88
|
+
function voiceToolList() {
|
|
89
|
+
const all = mainAgentToolList();
|
|
90
|
+
if (process.env.MADARX_VOICE_FAST_TOOLS === '1') {
|
|
91
|
+
const trimmed = all.filter(t => FAST_VOICE_TOOL_NAMES.has(t.name));
|
|
92
|
+
if (trimmed.length) return trimmed;
|
|
93
|
+
}
|
|
94
|
+
return all;
|
|
95
|
+
}
|
|
96
|
+
|
|
67
97
|
export function getVoiceToolCatalog() {
|
|
68
|
-
|
|
98
|
+
// Same source as getVoiceToolsForRealtime so the advertised tool list in the
|
|
99
|
+
// instruction block always matches what is actually attached to the session.
|
|
100
|
+
return voiceToolList().map(tool => ({
|
|
69
101
|
name: tool.name,
|
|
70
102
|
title: humanTitle(tool.name),
|
|
71
103
|
description: tool.description || '',
|
|
@@ -74,7 +106,7 @@ export function getVoiceToolCatalog() {
|
|
|
74
106
|
}
|
|
75
107
|
|
|
76
108
|
export function getVoiceToolsForRealtime() {
|
|
77
|
-
return
|
|
109
|
+
return voiceToolList().map(toRealtimeShape);
|
|
78
110
|
}
|
|
79
111
|
|
|
80
112
|
export function isVoiceTool(name) {
|
package/package.json
CHANGED
|
@@ -83,6 +83,15 @@ export function runAuthV1Migration(db) {
|
|
|
83
83
|
VALUES ('mem-local-owner', 'personal-org', 'local-user-1', 'owner', ?)`
|
|
84
84
|
).run(now);
|
|
85
85
|
|
|
86
|
+
// ── Step 4b: Self-heal default-org ownership ──────────────────────────────
|
|
87
|
+
// The synthetic `local-user-1` owns personal-org (step 4). When the operator
|
|
88
|
+
// flips to Supabase mode and signs in, they get a `member` row — and because a
|
|
89
|
+
// membership now exists, the first-login owner-bootstrap is skipped, so they
|
|
90
|
+
// are permanently stuck below admin (every owner/admin gate 403s). Promote the
|
|
91
|
+
// real operator to owner of their own default org. Idempotent + conservative:
|
|
92
|
+
// only acts when there is NO real owner yet and the operator is unambiguous.
|
|
93
|
+
const heal = healDefaultOrgOwnership(db);
|
|
94
|
+
|
|
86
95
|
// ── Step 5: Bind orphaned projects to personal-org ────────────────────────
|
|
87
96
|
const projectsResult = db
|
|
88
97
|
.prepare("UPDATE projects SET org_id = 'personal-org' WHERE org_id IS NULL")
|
|
@@ -97,9 +106,91 @@ export function runAuthV1Migration(db) {
|
|
|
97
106
|
return {
|
|
98
107
|
projectsUpdated: projectsResult.changes,
|
|
99
108
|
artifactsUpdated: artifactsResult.changes,
|
|
109
|
+
ownershipHeal: heal,
|
|
100
110
|
};
|
|
101
111
|
}
|
|
102
112
|
|
|
113
|
+
const SYNTHETIC_LOCAL_USER = 'local-user-1';
|
|
114
|
+
const DEFAULT_ORG = 'personal-org';
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Ensure the real operator owns the default org (`personal-org`).
|
|
118
|
+
*
|
|
119
|
+
* Why: the seed makes the synthetic `local-user-1` the owner. In Supabase mode a
|
|
120
|
+
* real user is added as a `member`, and the owner-bootstrap is then skipped (a
|
|
121
|
+
* membership already exists), leaving the operator permanently below admin.
|
|
122
|
+
*
|
|
123
|
+
* Rule (idempotent, conservative — never downgrades, never guesses):
|
|
124
|
+
* • If a real (non-synthetic) owner already exists → no-op.
|
|
125
|
+
* • Else, among real members of the default org:
|
|
126
|
+
* - exactly one → promote them to owner (they are the operator).
|
|
127
|
+
* - two or more → ambiguous; promote only the one matching
|
|
128
|
+
* MADARX_OWNER_EMAIL if set, else leave for a human.
|
|
129
|
+
* - zero → no-op (pure local install, no real user yet).
|
|
130
|
+
*
|
|
131
|
+
* @param {DatabaseSync} db
|
|
132
|
+
* @returns {{ status: string, user_id?: string, basis?: string, count?: number }}
|
|
133
|
+
*/
|
|
134
|
+
export function healDefaultOrgOwnership(db) {
|
|
135
|
+
const org = db.prepare('SELECT id FROM organizations WHERE id = ?').get(DEFAULT_ORG);
|
|
136
|
+
if (!org) return { status: 'no_default_org' };
|
|
137
|
+
|
|
138
|
+
const realOwner = db
|
|
139
|
+
.prepare("SELECT user_id FROM org_memberships WHERE org_id = ? AND role = 'owner' AND user_id != ?")
|
|
140
|
+
.get(DEFAULT_ORG, SYNTHETIC_LOCAL_USER);
|
|
141
|
+
if (realOwner) return { status: 'already_owned', user_id: realOwner.user_id };
|
|
142
|
+
|
|
143
|
+
const realMembers = db
|
|
144
|
+
.prepare("SELECT user_id FROM org_memberships WHERE org_id = ? AND user_id != ?")
|
|
145
|
+
.all(DEFAULT_ORG, SYNTHETIC_LOCAL_USER);
|
|
146
|
+
if (realMembers.length === 0) return { status: 'no_real_user' };
|
|
147
|
+
|
|
148
|
+
let targetUserId;
|
|
149
|
+
let basis;
|
|
150
|
+
if (realMembers.length === 1) {
|
|
151
|
+
targetUserId = realMembers[0].user_id;
|
|
152
|
+
basis = 'sole_member';
|
|
153
|
+
} else {
|
|
154
|
+
// Ambiguous default org — only act on an explicit operator-of-record.
|
|
155
|
+
const ownerEmail = process.env.MADARX_OWNER_EMAIL;
|
|
156
|
+
if (!ownerEmail || ownerEmail === 'owner@local.dev') return { status: 'ambiguous', count: realMembers.length };
|
|
157
|
+
const match = db
|
|
158
|
+
.prepare(
|
|
159
|
+
`SELECT m.user_id FROM org_memberships m JOIN users u ON u.id = m.user_id
|
|
160
|
+
WHERE m.org_id = ? AND m.user_id != ? AND lower(u.email) = lower(?)`
|
|
161
|
+
)
|
|
162
|
+
.all(DEFAULT_ORG, SYNTHETIC_LOCAL_USER, ownerEmail);
|
|
163
|
+
if (match.length !== 1) return { status: 'ambiguous', count: realMembers.length };
|
|
164
|
+
targetUserId = match[0].user_id;
|
|
165
|
+
basis = 'owner_email';
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const res = db
|
|
169
|
+
.prepare("UPDATE org_memberships SET role = 'owner' WHERE org_id = ? AND user_id = ? AND role != 'owner'")
|
|
170
|
+
.run(DEFAULT_ORG, targetUserId);
|
|
171
|
+
if (!res.changes) return { status: 'already_owned', user_id: targetUserId };
|
|
172
|
+
|
|
173
|
+
// Best-effort audit — never block boot on it.
|
|
174
|
+
try {
|
|
175
|
+
db.prepare(
|
|
176
|
+
`INSERT INTO audit_logs (id, at, type, summary, status, meta, user_id, org_id, action_target_id, action_target_type)
|
|
177
|
+
VALUES (?, ?, 'auth.default_org.owner_healed', ?, 'success', ?, ?, ?, ?, 'org_membership')`
|
|
178
|
+
).run(
|
|
179
|
+
`audit-orgheal-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
|
|
180
|
+
nowIso(),
|
|
181
|
+
`Promoted real operator to owner of ${DEFAULT_ORG} (was member; default org was owned only by synthetic ${SYNTHETIC_LOCAL_USER})`,
|
|
182
|
+
JSON.stringify({ org_id: DEFAULT_ORG, user_id: targetUserId, basis }),
|
|
183
|
+
targetUserId,
|
|
184
|
+
DEFAULT_ORG,
|
|
185
|
+
targetUserId,
|
|
186
|
+
);
|
|
187
|
+
} catch {
|
|
188
|
+
// audit table not ready / schema drift — promotion still stands.
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
return { status: 'promoted', user_id: targetUserId, basis };
|
|
192
|
+
}
|
|
193
|
+
|
|
103
194
|
// ── CLI entry point ───────────────────────────────────────────────────────────
|
|
104
195
|
// ESM direct-run guard: only execute main() when this file is the entry point,
|
|
105
196
|
// not when imported as a module (e.g. by lib/seeds.js).
|
|
@@ -133,6 +224,7 @@ async function main() {
|
|
|
133
224
|
console.log(' personal-org: ensured');
|
|
134
225
|
console.log(' local-user-1: ensured (email: ' + ownerEmail + ')');
|
|
135
226
|
console.log(' owner membership: ensured');
|
|
227
|
+
console.log(' ownership heal: ' + result.ownershipHeal.status + (result.ownershipHeal.user_id ? ' (' + result.ownershipHeal.user_id + ')' : ''));
|
|
136
228
|
console.log(' projects bound: ' + result.projectsUpdated);
|
|
137
229
|
console.log(' artifacts defaulted: ' + result.artifactsUpdated);
|
|
138
230
|
console.log(' marker: ' + MARKER);
|