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
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,31 @@ All notable changes to Madarx OS. Newest first.
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
## [2.18.0] - 2026-06-06
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **Background-agent activity popover in the top toolbar.** The toolbar's "agents running" indicator is now a clickable **Activity** pill that opens a live panel of every background agent the Main Agent spawns — each agent's name, what triggered it, its current tool, and a recent tool-step trail (running / done / error), reusing the chat feed's tool-step icons and sublabels. The detail rides the existing SSE connection: `app/agents/agent-events-bus.js` now also forwards `agent_tool_start` / `agent_tool_result` (existing subscribers filter by `event.type`, so the extra events are inert for them), so no new socket is opened. The popover is portaled to `document.body` at `z-index:9300` so it paints above canvas artifacts (`.artifact-fs` is `9100`) and stays below the search/help overlays (12000+), anchored to the pill via the trigger's viewport rect with outside-click handling across the portal. At idle it shows an empty state describing the feature, so the control is discoverable before any agent runs. Files: `app/components/app-topbar.jsx`, `app/globals.css`.
|
|
12
|
+
- **Live thinking + verbose streaming (engine-agnostic).** The main agent's chat now surfaces the engine's work in real time — token-by-token answer text, the model's reasoning ("thinking") in a collapsible panel, a cold-start / long-tool status heartbeat with elapsed time, and richer tool steps (full input + output preview + duration). One knob governs every engine: `MADARX_CC_STREAM_VERBOSITY` = `quiet` | `thinking` (default) | `full`. `claude-code` adds `--include-partial-messages` (capability-probed via `claude --help`; older CLIs degrade gracefully to chunked streaming) plus a best-effort `MAX_THINKING_TOKENS`; `anthropic` enables extended thinking on thinking-capable models (budget `MADARX_THINKING_BUDGET_TOKENS`, default 4000) with `thinking`/`redacted_thinking` signatures preserved for tool-use turns and never persisted to chat history or artifacts; `ollama` streams NDJSON tokens (reasoning via `MADARX_OLLAMA_THINK=1`). New SSE events `cli_thinking` / `cli_status`. Reference: `ai-docs/key-constraints.md`; spec `specs/active/claude-code-engine-live-thinking-stream.md`.
|
|
13
|
+
- **Voice = the main agent (full tool parity).** The Jarvis voice console now drives the exact same brain, live tool catalog, and gates as typed chat. `lib/voice/tools.js` attaches the full `getTools()` catalog to the Realtime session (advertised list in `lib/voice/context.js` always matches what's attached), so anything the typed agent can do, voice can do. Set `MADARX_VOICE_FAST_TOOLS=1` to trim to a 10-tool conversational subset.
|
|
14
|
+
- **Greeting on connect.** Opening voice greets the operator by name ("Hello, Ak.") — spoken by the Realtime model on data-channel open (legacy brain) or via the TTS lane (transport brain). Name resolves from the signed-in session (`display_name`, else capitalised email local-part).
|
|
15
|
+
- **On-brand voice artifacts.** Voice instructions now mandate that every visual artifact route through `generate_ui` (which composes `DESIGN_RULES + brandInstructionText(getBrandProfile())`), so spoken "make me a page/brief/report" requests render on-brand with no emoji.
|
|
16
|
+
- **Skill bridge (`skill_bridge_run`).** A new, tightly-gated tool that lets the agent (and voice) drive the real **visible** GStack browser by invoking an allowlisted first-party gstack CLI skill (`connect-chrome`, `browse`, `qa-only`) via `runClaudeCodeAgent`. Risk `irreversible_external`, `enabled_default:false`, **always** approval-gated on both the main and agent paths (force-gated alongside `browser_harness_run`), hard kill-switch `MADARX_SKILL_BRIDGE_DISABLED=1`, bounded by the `.claude/settings.json` deny list. `lib/tools/adapters/skill-bridge.js` + `tests/skill-bridge.test.js`. Verified end-to-end: gate → approve → real browser opened https://example.com and read its title.
|
|
17
|
+
- **Transport voice brain (opt-in).** Behind `localStorage madarx:voice-brain='transport'`, Realtime runs STT-only and routes cognition through `/api/orchestrator/stream` (same brain as chat), speaking replies via TTS. Default stays the proven in-browser `realtime` brain.
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- **Chat hides raw HTML while streaming.** An agent turn that emits a full HTML artifact no longer types raw markup into the chat bubble — the artifact renders on the canvas while a tasteful "Designing the page…" placeholder shows in chat, replaced by the turn's summary on completion. Server-side stripping for the CLI engine also stops re-sending the growing HTML page on every SSE tick; a client-side strip covers Anthropic/Ollama deltas too.
|
|
22
|
+
- **Voice latency tuned the right way.** `session.reasoning.effort='low'` on `gpt-realtime-2` (`lib/realtime-openai.js`, model-guarded; override `OPENAI_REALTIME_REASONING`) is the latency dial instead of hiding tools — keeps first-audio snappy while voice keeps the whole toolset. Researched against the 2026 voice-agent landscape: OpenAI Realtime (speech-to-speech) stays the right provider; TTS-only alternatives would force a slower pipeline.
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
|
|
26
|
+
- **Operator stuck below admin on their own default org (auto-healed on update).** When an install flipped to Supabase auth mode, the seeded `personal-org` was owned by the synthetic `local-user-1`, so the real operator was added as a `member` and the first-login owner-bootstrap was skipped — leaving them permanently below admin (every owner/admin gate, including the folder picker, 403'd). The boot migration (`runAuthV1Migration`, runs idempotently on every start) now self-heals: when the default org has no real owner, it promotes the unambiguous operator to `owner` (the sole real member, or the `MADARX_OWNER_EMAIL` match when several). Conservative — never downgrades, never guesses on an ambiguous shared org. Existing affected installs fix themselves on the next restart after updating. Logic + tests: `scripts/migrate-auth-v1.mjs::healDefaultOrgOwnership`, `tests/default-org-owner-heal.test.js`.
|
|
27
|
+
- **"Choose folder…" returned `insufficient_role` for non-admin users.** The native folder picker (`/api/fs/pick-folder`, used by New/Edit project) required the org `admin` role, so a `member`/`viewer` (e.g. a non-owner user in supabase auth mode) hit a 403 `insufficient_role` and could never select a custom project folder — even though creating the project and creating a folder weren't gated at all. Plain folder selection now only needs an authenticated session (the picker just opens an OS dialog and returns a path; project creation + the disk layer enforce allowed roots). Registering a Mines import root stays admin-gated. Gate extracted to `lib/pick-folder-authz.js` with a regression test.
|
|
28
|
+
- **Consistent artifact corner radius.** The canvas window and the expand/fullscreen overlay (enter/open/exit) now share one `--artifact-radius` token (14px) instead of three different values (17 / 22 / 0), so a larger or fullscreen artifact no longer balloons its corners into the title-bar buttons.
|
|
29
|
+
- **Deterministic `org-invites` test isolation.** A `joinBootstrap` test left `auth_mode` flipped to `supabase` in the config table, which (since the config table outranks the env) broke a later test's clean-install precondition under a full-file run. The cleanup now clears the persisted mode so the suite is deterministic (full suite 1360/1360).
|
|
30
|
+
- **Voice no longer stalls after a transport regression.** Reverted the transport brain from default to opt-in after it shipped with unverified Realtime GA session fields that left the model silent. The default `realtime` path is restored and snappy.
|
|
31
|
+
|
|
7
32
|
## [2.17.0] - 2026-06-05
|
|
8
33
|
|
|
9
34
|
### Added
|
package/CLAUDE.md
CHANGED
|
@@ -140,7 +140,7 @@ node --no-warnings --test --test-name-pattern="your test name" tests/api-behavio
|
|
|
140
140
|
- **Main agent trust mode** — `executeRegistryTool()` gates risky calls. Default `approval_required`. `auto` skips gate for `high` and below — `blocked` and `irreversible_external` never auto-approved.
|
|
141
141
|
- **`irreversible_external` risk tier** — always creates an approval request even in trust-mode `auto`. Load-bearing guarantee that an LLM on auto-trust cannot make irreversible external writes without a human in the loop. Tiers: `blocked` → refuse | `irreversible_external` → always gate | `high`/`medium` → gate in `approval_required` mode | `low` → always execute.
|
|
142
142
|
- **Tool adapters** — Resend email, GitHub (11 tools), Supabase writes (6 tools), `flight_search` dual-provider routing (Amadeus → Google Flights fallback). Details and credentials in [`ai-docs/key-constraints.md`](ai-docs/key-constraints.md#tool-adapters).
|
|
143
|
-
- **Voice tools (Jarvis)** — provider abstraction (`realtime` → `tts` → `local` → `off`).
|
|
143
|
+
- **Voice tools (Jarvis)** — provider abstraction (`realtime` → `tts` → `local` → `off`). **Voice IS the main agent.** Default `realtime` brain is **transport-only**: OpenAI Realtime does STT (and the TTS lane speaks); cognition + tool calls run through the SAME `/api/orchestrator/stream` path as typed chat — same model, same live `getTools()` catalog, same trust/approval/allowlist/rate-limit gates. No per-session tool snapshot, so a tool enabled mid-conversation is usable on the next turn. Legacy in-browser-brain path is behind `localStorage madarx:voice-brain='realtime'` for rollback. Realtime ephemeral secrets never persisted. Brand: Onyx/Bone/Graphite, Mars Red only on active speech + approval banners.
|
|
144
144
|
- **WhatsApp gateway** — Baileys sub-package, separate-process daemon. **Pair only a dedicated WhatsApp number, not personal account.** Router enforces allowlist + 5-msg/min per-sender rate limit.
|
|
145
145
|
- **Sub-agent engines** — five engines in `lib/agent-engines.js`: `claude-code` (**default**), `anthropic`, `ollama`, `codex`, `hermes`. CC spawns the local CLI with `--permission-mode bypassPermissions`; **the `deny` list in `.claude/settings.json` is the load-bearing safety boundary**.
|
|
146
146
|
- **Process engine ownership of state** — `lib/process/engine.js` is the SOLE writer of `process_cases.current_stage_id`, `current_stage_slug`, `status`, and `context_json`. Stage handlers receive a read-only case snapshot; they never mutate case state. Every transition flows through `transitionTo`, which is transaction-wrapped and asserts the expected `from_stage_id`. Full details: [`ai-docs/process-engine.md`](ai-docs/process-engine.md).
|
package/README.md
CHANGED
|
@@ -71,7 +71,7 @@ A polished voice console for the Main Agent — open it from the chat panel's mi
|
|
|
71
71
|
| **Local** (open-source slots) | `MADARX_LOCAL_STT_URL`, `MADARX_LOCAL_TTS_URL` | URL slots for Whisper.cpp / FasterWhisper / Piper / Coqui. |
|
|
72
72
|
| **Off** | – | Default when no providers are configured. |
|
|
73
73
|
|
|
74
|
-
The voice agent is given the durable Madarx context on every session mint: today's date, active project, open tasks, recent artifact titles, pending approvals, brand voice, and non-`local_only` memory rows.
|
|
74
|
+
The voice agent is given the durable Madarx context on every session mint: today's date, active project, open tasks, recent artifact titles, pending approvals, brand voice, and non-`local_only` memory rows. **Voice is the main agent** — it sees the *full* main-agent tool catalog (the same `getTools()` list typed chat uses, not a curated subset), and every call routes through `executeRegistryTool` / `executeTool`, so trust-mode, approval gates, allowlists, rate limits, and audit are identical to typed chat. Latency is held down by `session.reasoning.effort='low'` on `gpt-realtime-2`, not by hiding tools. Voice **never** bypasses the `irreversible_external` approval gate (e.g. `gh_pr_merge`, `email_send`, `supabase_sql`, `skill_bridge_run`). Visual artifacts route through `generate_ui` so spoken page/report requests render on-brand.
|
|
75
75
|
|
|
76
76
|
Brand: Onyx surface, Bone/Graphite text, Mars Red reserved for active speech peaks + approval banners.
|
|
77
77
|
|
|
@@ -44,13 +44,15 @@ Integration credentials (`GITHUB_TOKEN`, `RESEND_API_KEY`, `SUPABASE_*`, `VERCEL
|
|
|
44
44
|
|
|
45
45
|
**GitHub (A1)** — 11 tools in `lib/tools/adapters/github.js`. All disabled by default (`enabled_default: false`), credential: `GITHUB_TOKEN` via secrets vault. Read tools (`gh_repo_read`, `gh_repo_list`, `gh_issue_list`, `gh_pr_list`) are `low` risk, rate-limited 60/min, no allowlist. Write tools (`gh_issue_create`, `gh_issue_comment`, `gh_pr_comment`) are `medium` risk, require a `repo_full_name` allowlist entry. High-risk tools (`gh_pr_create`, `gh_actions_dispatch`, `gh_release_create`) require allowlist + trust-mode gate. `gh_pr_merge` is `irreversible_external` — always requires human approval regardless of trust mode. All responses return curated shapes (never raw API blobs). All calls use `wrapFetch` for egress logging. Auth: `Authorization: Bearer <GITHUB_TOKEN>`, `Accept: application/vnd.github+json`, `X-GitHub-Api-Version: 2022-11-28`, `User-Agent: madarx-os`.
|
|
46
46
|
|
|
47
|
+
**Skill bridge (`skill_bridge_run`)** — Phase 4 of voice/main-agent unification. `lib/tools/adapters/skill-bridge.js` exposes a 3-entry allowlist of first-party gstack CLI skills (`connect-chrome`, `browse`, `qa-only`) as ONE tool so the main agent — and voice, which shares the full catalog — can drive the **visible** GStack browser the operator watches live. Risk `irreversible_external`, `enabled_default:false`, rate-limited 10/5min. It crosses the Claude Code CLI trust boundary, so it is the most sharply gated tool: ALWAYS approval-gated on the main path (even trust-mode `auto`), force-gated on the agent path (added next to `browser_harness_run` in `registry.js`'s `agentIrreversibleGate`), hard kill-switch `MADARX_SKILL_BRIDGE_DISABLED=1`, and only allowlisted skill slugs are runnable (the LLM supplies the skill choice + a plain-language instruction as data, never a shell line). It runs via `runClaudeCodeAgent` under `bypassPermissions` bounded by the load-bearing `.claude/settings.json` deny list. These are first-party skills, NOT agent-authored code, so the "never execute LLM-authored code" invariant holds. Output is capped + redacted. Tested in `tests/skill-bridge.test.js` (allowlist, kill-switch, always-gate on both paths, approved one-shot replay via `MADARX_MOCK_CLAUDE_CODE_RESPONSE`).
|
|
48
|
+
|
|
47
49
|
**Supabase writes** — six new tools in `lib/tools/adapters/supabase.js`. All disabled by default, all use `wrapFetch` for egress logging, all credentials via secrets vault (`SUPABASE_URL` + `SUPABASE_SERVICE_ROLE_KEY` or `SUPABASE_ANON_KEY`). Table and function names validated against `/^[a-zA-Z_][a-zA-Z0-9_]*(\.[a-zA-Z_][a-zA-Z0-9_]*)?$/` (schema-qualified names like `auth.users` accepted). `supabase_rest_insert` (medium, 30/min, table allowlist) — POST rows; `supabase_rest_upsert` (medium, 30/min, table allowlist) — merge-on-conflict POST; `supabase_rest_update` (high, 30/min, table allowlist) — PATCH with required filters; `supabase_rest_delete` (irreversible_external, 10/hour, table allowlist) — DELETE with required filters, always approval-gated; `supabase_rpc` (high, 30/min, function_name allowlist) — RPC call; `supabase_sql` (irreversible_external, 5/hour, default_allow) — raw SQL via `madarx_exec_sql()` Postgres function, uses service-role key and bypasses RLS, approval payload always includes RLS-bypass warning and full query text. Both `supabase_rest_update` and `supabase_rest_delete` throw synchronously on empty/missing filters before any network call.
|
|
48
50
|
|
|
49
51
|
**`flight_search` dual-provider routing** — `flight_search` is always available regardless of credential state (`required_env: []`). `lib/tools/adapters/travel.js::flightSearch` is a router: when both `AMADEUS_CLIENT_ID` and `AMADEUS_CLIENT_SECRET` resolve, it calls `_flightSearchAmadeus`; otherwise falls back to `googleFlightsSearch` in `lib/tools/adapters/google-flights.js`, a key-less reverse-engineered call to Google's batchexecute RPC (`https://www.google.com/_/TravelFrontendUi/data/batchexecute`, RPC id `H4cFwe`). Both providers return the same curated shape; callers branch on `source.provider` (`'amadeus' | 'google_flights_web'`) only when they want to disclose origin. `lib/flight-cache.js` is a 15-minute in-process LRU (cap 200) keyed by sha1 of the normalized query — cache hits skip `wrapFetch` and rate-limit accounting and set `source.cache_hit=true`. Set `MADARX_FLIGHT_SEARCH_NO_FALLBACK=1` to disable the Google fallback and surface the Amadeus error instead. Pure helpers `encodeFreq`, `parseBatchexecute`, `curateGoogleOffer` are exported for golden testing; the parser is defensive (strips `)]}'` prefix, balance-scans frames, walks the inner payload heuristically) and degrades gracefully to `{ count: 0, offers: [], source.parse_warning: ... }` if Google's RPC shape shifts.
|
|
50
52
|
|
|
51
53
|
## Voice tools (Jarvis console)
|
|
52
54
|
|
|
53
|
-
Provider abstraction lives in `lib/voice/providers.js`. Lanes: `realtime` (primary — OpenAI Realtime via WebRTC; vault keys `OPENAI_API_KEY`, optional `OPENAI_REALTIME_MODEL`, `OPENAI_REALTIME_VOICE`), `tts` (fallback — existing typed chat speaks final reply via OpenAI TTS, ElevenLabs, or the env-driven local HTTP TTS slot; vault keys `OPENAI_API_KEY`/`ELEVENLABS_API_KEY` + optional `ELEVENLABS_VOICE_ID`; local uses `MADARX_LOCAL_TTS_URL`, optional `MADARX_LOCAL_TTS_MODEL`/`MADARX_LOCAL_TTS_VOICE`), and `local` (open-source STT/TTS slots — `MADARX_LOCAL_STT_URL`/`MADARX_LOCAL_TTS_URL`; `scripts/misotts-local-server.py` provides a minimal MisoLabsAI/MisoTTS bridge). Default mode resolves at runtime (`realtime` → `tts` → `local` → `off`) and respects `MADARX_VOICE_DEFAULT_PROVIDER`. Every voice session is minted with a durable Madarx context (`lib/voice/context.js`): today's ISO date, active project, brand voice, open tasks, recent artifact titles, pending approvals, and non-`local_only` agent memory — never API keys, ephemeral tokens, or `local_only` memory.
|
|
55
|
+
Provider abstraction lives in `lib/voice/providers.js`. Lanes: `realtime` (primary — OpenAI Realtime via WebRTC; vault keys `OPENAI_API_KEY`, optional `OPENAI_REALTIME_MODEL`, `OPENAI_REALTIME_VOICE`), `tts` (fallback — existing typed chat speaks final reply via OpenAI TTS, ElevenLabs, or the env-driven local HTTP TTS slot; vault keys `OPENAI_API_KEY`/`ELEVENLABS_API_KEY` + optional `ELEVENLABS_VOICE_ID`; local uses `MADARX_LOCAL_TTS_URL`, optional `MADARX_LOCAL_TTS_MODEL`/`MADARX_LOCAL_TTS_VOICE`), and `local` (open-source STT/TTS slots — `MADARX_LOCAL_STT_URL`/`MADARX_LOCAL_TTS_URL`; `scripts/misotts-local-server.py` provides a minimal MisoLabsAI/MisoTTS bridge). Default mode resolves at runtime (`realtime` → `tts` → `local` → `off`) and respects `MADARX_VOICE_DEFAULT_PROVIDER`. Every voice session is minted with a durable Madarx context (`lib/voice/context.js`): today's ISO date, active project, brand voice, open tasks, recent artifact titles, pending approvals, and non-`local_only` agent memory — never API keys, ephemeral tokens, or `local_only` memory. **Voice IS the main agent — transport-only realtime brain (unified path).** The `realtime` lane is, by default, STT/TTS transport only: OpenAI Realtime captures speech and emits the user's final transcript (`mintOpenAIRealtimeSession({ mode: 'transport' })` forces `tools: []`, a transcribe-only instruction block, `audio.input.transcription`, and `turn_detection.create_response:false` so the Realtime model never reasons or speaks). The browser forwards each final utterance to `mainAgent.command(text)` — the SAME `/api/orchestrator/stream` path typed chat uses — so cognition, the live `getTools()` catalog, trust-mode, approval gates (including the never-bypassable `irreversible_external` tier), allowlists, rate limits, egress logging, and audit rows are literally identical to typed chat. The orchestrator's reply is voiced through the TTS lane (`speakText` → `/api/voice/tts`). Because there is no per-session tool snapshot, a tool enabled mid-conversation is usable on the next voice turn. The legacy in-browser-brain path (Realtime reasons + calls `getVoiceToolsForRealtime()` tools + speaks, via `lib/voice/tools.js` → `relayRealtimeToolCall`) still exists for rollback behind `localStorage madarx:voice-brain='realtime'` (`mode:'realtime'` on mint). Voice approvals surface in the chat panel; the voice orb says "needs your approval" and pauses. Realtime ephemeral client secrets are returned to the browser but never persisted; the long-lived OpenAI key never crosses to the browser. UI: `app/components/dashboard/voice-panel.jsx` + `voice-orb.jsx` + `use-realtime-voice.js` (the `transport` flag + `onUserUtterance` callback drive the unified loop). Brand: Onyx surface, Bone/Graphite text, Mars Red only on active speech peaks + approval banners. Operator guide: `docs/voice/jarvis.md`. `cli-printing-press` documented as a deferred external companion in `docs/integrations/cli-printing-press.md`.
|
|
54
56
|
|
|
55
57
|
## WhatsApp gateway
|
|
56
58
|
|
|
@@ -64,6 +66,12 @@ Provider abstraction lives in `lib/voice/providers.js`. Lanes: `realtime` (prima
|
|
|
64
66
|
|
|
65
67
|
`lib/agent-engines.js` defines five engines: `claude-code` (**default**), `anthropic` (madarx tool marketplace via the Anthropic Messages API — required for `create_artifact`, `generate_ui`, `whatsapp_send`, `competitor_report`, `marketing_plan` which do NOT exist on the CC path), `ollama`, `codex`, `hermes`. `claude-code` agents spawn the local CC CLI per run via `runClaudeCodeAgent` with `--permission-mode bypassPermissions --setting-sources project,local,user --max-turns 30 --add-dir workspace --add-dir data` (matches the pattern OpenClaw's `extensions/anthropic/cli-backend.ts` uses). `bypassPermissions` skips per-call confirmation prompts so multi-step agentic work runs uninterrupted; **the `deny` list in `.claude/settings.json` is the load-bearing safety boundary** — it hard-blocks `sudo`, `rm -rf/-r/-f`, `git reset --hard`, force-push, `git clean -fd`, package-manager installs/publishes, outbound network from shell (`curl`/`wget`/`nc`/`ssh`/`scp`), database CLIs (`psql`/`mysql`/`redis-cli`), filesystem ops (`dd`/`mkfs`/`fdisk`), service control (`systemctl`/`launchctl`), reads of `.env*` / `data/whatsapp/session/` / `~/.ssh` / `~/.aws` / `/etc`, and writes to `.git/`, `node_modules/`, `data/madarx.sqlite`, `.claude/`. The allow list pre-approves read-only tools (Read/Glob/Grep/LS), Web (WebSearch/WebFetch), edits inside `workspace/`, and a curated Bash safelist (git status/log/diff, ls/cat/head/tail/wc, jq, mkdir/touch/cp/mv inside `workspace/`). Extend in `.claude/settings.json` (shared) or `.claude/settings.local.json` (personal, gitignored). Override the spawn timeout via `CLAUDE_CODE_TICK_TIMEOUT_MS` (default 600000) and max turns via `CLAUDE_CODE_MAX_TURNS` (default 30).
|
|
66
68
|
|
|
69
|
+
**Live verbose streaming (engine-agnostic).** When the main agent answers in chat, madarX surfaces the engine's work in real time — token-by-token text, the model's reasoning ("thinking"), and rich tool detail (full input + output preview + elapsed ms). One knob governs every engine: `MADARX_CC_STREAM_VERBOSITY` = `quiet` | `thinking` (default) | `full` (`lib/engine-verbosity.js`). Mechanics by engine:
|
|
70
|
+
- **`claude-code`** — `runClaudeCodeAgent` adds `--include-partial-messages` (capability-probed once via `claude --help`; older CLIs degrade to chunked complete-message streaming) so the stream-json parser (`makeStreamJsonParser`) emits `stream_event` text/thinking deltas. Best-effort thinking via the `MAX_THINKING_TOKENS` subprocess env.
|
|
71
|
+
- **`anthropic`** — the orchestrator loop enables extended thinking on thinking-capable models (`modelSupportsThinking` allowlist: sonnet-4/opus-4/haiku-4/3.7-sonnet) with budget `MADARX_THINKING_BUDGET_TOKENS` (default 4000); `thinking`/`redacted_thinking` blocks (with signatures) are preserved in the assistant turn so tool-use follow-ups validate. Thinking is streamed but never persisted to chat history or saved artifacts.
|
|
72
|
+
- **`ollama`** — streams NDJSON tokens; reasoning when `MADARX_OLLAMA_THINK=1` (opt-in; `think:true` errors on some models). The fabrication guard still runs on the full output before persistence.
|
|
73
|
+
- **SSE events** — `cli_thinking` (accumulated reasoning), `cli_status` (`starting`/`working`+`elapsedMs`/`thinking`/`generating`/`done` cold-start + heartbeat), enriched `tool_result` (`durationMs`, output `preview`/`lines`). Client: `use-stream-command.js` → `ThinkingDisclosure` collapsible panel + per-step duration/preview in `chat-panel.jsx`. Set `MADARX_CC_FORCE_PARTIAL=0/1` to override the CC capability probe.
|
|
74
|
+
|
|
67
75
|
**Tool-loop capability + no-fabrication guarantee.** Only `anthropic` runs the GOVERNED madarX tool loop (`generateTickOutput`: `chatWithClaude` + `executeRegistryTool` with gates/allowlists/audit). `claude-code`/`codex` run their own native CLI tool runtimes (real, but not the madarX toolset). `ollama`/`hermes` complete text single-shot with **no tool dispatch at all** — a Hermes/Nous-template model "satisfies" a tool task by role-playing the whole loop, emitting `<tool_call>`/`<tool_response>` with **invented results** in plain text. Two layers stop that fiction ever reaching the user as a real result:
|
|
68
76
|
- **Layer A (`lib/engine-capabilities.js::assertRunnable`)** — runs in `agent-runner.js` before the engine ternary. A tool-needing agent (≥1 enabled tool) on a non-tool-executing engine (`ollama`/`hermes`) throws `engine_cannot_run_tools` → recorded as a FAILED run with remediation, never a fabricated "complete" deliverable. Tool-less agents run single-shot on any engine.
|
|
69
77
|
- **Layer B (`lib/fabricated-tool-output.js::looksFabricatedToolTranscript`)** — backstop after output. When `toolEvents.length === 0` and the output is a fabricated tool transcript, the run throws `fabricated_tool_output` (no artifact written). The detector strips fenced/inline code first so genuine reports *quoting* `<tool_call>` are not false-positives.
|
|
@@ -4,7 +4,17 @@
|
|
|
4
4
|
// browser tab, regardless of how many agents are on screen — important
|
|
5
5
|
// because the server caps subscribers per process.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
// Tool-level events (agent_tool_start / agent_tool_result) ride the same
|
|
8
|
+
// connection so the global topbar can show *what* a background agent is doing,
|
|
9
|
+
// not just that something is running. Existing subscribers filter by
|
|
10
|
+
// event.type, so the extra types are inert for them.
|
|
11
|
+
const EVENT_TYPES = [
|
|
12
|
+
'agent_created',
|
|
13
|
+
'agent_run_start',
|
|
14
|
+
'agent_run_complete',
|
|
15
|
+
'agent_tool_start',
|
|
16
|
+
'agent_tool_result',
|
|
17
|
+
];
|
|
8
18
|
|
|
9
19
|
let source = null;
|
|
10
20
|
const subscribers = new Set();
|
|
@@ -166,11 +166,39 @@ async function verifyGithub(creds) {
|
|
|
166
166
|
if (!res.ok) return { ok: false, reason: 'invalid_key' };
|
|
167
167
|
const data = await res.json().catch(() => ({}));
|
|
168
168
|
const login = typeof data?.login === 'string' ? data.login : null;
|
|
169
|
+
|
|
170
|
+
// Probe real reach: does the token see any repos beyond the owner's own?
|
|
171
|
+
// A token that authenticates fine but was never granted org/collaborator
|
|
172
|
+
// repos is the #1 "connected but can't read the repo" confusion — surface
|
|
173
|
+
// it as a non-blocking warning rather than silently reporting success.
|
|
174
|
+
let reach = null;
|
|
175
|
+
try {
|
|
176
|
+
const probe = wrapFetch('connection.verify.github.reach', null, fetch);
|
|
177
|
+
const pr = await probe(
|
|
178
|
+
'https://api.github.com/user/repos?per_page=1&affiliation=collaborator,organization_member',
|
|
179
|
+
{ method: 'GET', headers: {
|
|
180
|
+
authorization: `Bearer ${token}`,
|
|
181
|
+
accept: 'application/vnd.github+json',
|
|
182
|
+
'x-github-api-version': '2022-11-28',
|
|
183
|
+
'user-agent': 'madarx-os',
|
|
184
|
+
} },
|
|
185
|
+
);
|
|
186
|
+
if (pr.ok) {
|
|
187
|
+
const arr = await pr.json().catch(() => []);
|
|
188
|
+
reach = Array.isArray(arr) && arr.length > 0 ? 'org_or_collaborator' : 'owner_only';
|
|
189
|
+
}
|
|
190
|
+
} catch {
|
|
191
|
+
// best-effort — never fail verify on the reach probe
|
|
192
|
+
}
|
|
193
|
+
|
|
169
194
|
return {
|
|
170
195
|
ok: true,
|
|
171
196
|
account_label: login ? `@${login}` : 'GitHub',
|
|
172
197
|
last_4: fingerprintLast4(token),
|
|
173
|
-
summary: { login },
|
|
198
|
+
summary: { login, repo_reach: reach },
|
|
199
|
+
warning: reach === 'owner_only'
|
|
200
|
+
? { field: 'GITHUB_TOKEN', reason: 'owner_only_access' }
|
|
201
|
+
: null,
|
|
174
202
|
};
|
|
175
203
|
} catch {
|
|
176
204
|
return { ok: false, reason: 'network' };
|
|
@@ -2,9 +2,9 @@ import { spawn } from 'node:child_process';
|
|
|
2
2
|
import os from 'node:os';
|
|
3
3
|
import fs from 'node:fs';
|
|
4
4
|
import path from 'node:path';
|
|
5
|
-
import { requireFreshMembership, requireSession } from '
|
|
6
|
-
import {
|
|
7
|
-
import { approveMinesImportRoot } from '
|
|
5
|
+
import { requireFreshMembership, requireSession } from '../../../../lib/auth.js';
|
|
6
|
+
import { assertPickFolderRole } from '../../../../lib/pick-folder-authz.js';
|
|
7
|
+
import { approveMinesImportRoot } from '../../../../lib/mines/import-roots.js';
|
|
8
8
|
|
|
9
9
|
export const dynamic = 'force-dynamic';
|
|
10
10
|
export const runtime = 'nodejs';
|
|
@@ -30,10 +30,10 @@ function appleScriptString(value) {
|
|
|
30
30
|
return String(value || '').replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
async function
|
|
33
|
+
async function authenticatePicker(request, registerImportRoot) {
|
|
34
34
|
const session = await requireSession(request);
|
|
35
35
|
await requireFreshMembership(session, session.org_id);
|
|
36
|
-
|
|
36
|
+
assertPickFolderRole(session, registerImportRoot);
|
|
37
37
|
return session;
|
|
38
38
|
}
|
|
39
39
|
|
|
@@ -45,18 +45,20 @@ function authError(err) {
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
export async function POST(request) {
|
|
48
|
+
// Parse the body first so the auth gate knows whether this is a privileged
|
|
49
|
+
// import-root registration (admin-only) or a plain folder pick (any session).
|
|
50
|
+
const body = await request.json().catch(() => ({}));
|
|
51
|
+
const title = String(body.title || 'Select a folder').replace(/["\\]/g, '');
|
|
52
|
+
const startPath = String(body.start_path || os.homedir() || '/').trim();
|
|
53
|
+
const registerImportRoot = Boolean(body.register_import_root);
|
|
54
|
+
|
|
48
55
|
let session;
|
|
49
56
|
try {
|
|
50
|
-
session = await
|
|
57
|
+
session = await authenticatePicker(request, registerImportRoot);
|
|
51
58
|
} catch (err) {
|
|
52
59
|
return authError(err);
|
|
53
60
|
}
|
|
54
61
|
|
|
55
|
-
const body = await request.json().catch(() => ({}));
|
|
56
|
-
const title = String(body.title || 'Select a folder').replace(/["\\]/g, '');
|
|
57
|
-
const startPath = String(body.start_path || os.homedir() || '/').trim();
|
|
58
|
-
const registerImportRoot = Boolean(body.register_import_root);
|
|
59
|
-
|
|
60
62
|
try {
|
|
61
63
|
let picked;
|
|
62
64
|
if (process.platform === 'darwin') {
|
|
@@ -6,6 +6,7 @@ import { getSystemPrompt, getModel, getModels, currentDateInstruction } from '@/
|
|
|
6
6
|
import { brandInstructionText } from '@/lib/brand.js';
|
|
7
7
|
import { agentMemoryContext } from '@/lib/agent-memory-context.js';
|
|
8
8
|
import { runOllamaAgent, runClaudeCodeAgent, runCodexAgent } from '@/lib/agent-engines.js';
|
|
9
|
+
import { thinkingBudgetTokens, getStreamVerbosity } from '@/lib/engine-verbosity.js';
|
|
9
10
|
import {
|
|
10
11
|
createChatSession,
|
|
11
12
|
appendChatMessage,
|
|
@@ -510,7 +511,21 @@ export async function POST(req) {
|
|
|
510
511
|
: baseUserContent) + attachmentPromptText;
|
|
511
512
|
|
|
512
513
|
if (activeEngine === 'ollama') {
|
|
513
|
-
|
|
514
|
+
emit('cli_status', { phase: 'starting', engine: 'ollama' });
|
|
515
|
+
// Stream tokens (and reasoning, on models that support it) for a live
|
|
516
|
+
// preview. The full output is still returned so the fabrication guard
|
|
517
|
+
// below runs on the complete text before anything is persisted.
|
|
518
|
+
const output = await runOllamaAgent({
|
|
519
|
+
model: activeModel,
|
|
520
|
+
systemPrompt,
|
|
521
|
+
userMessage: userContent,
|
|
522
|
+
maxTokens: 2048,
|
|
523
|
+
onChunk: (_piece, full) => {
|
|
524
|
+
const disp = full.replace(/```madarx-action[\s\S]*?```/gi, '').replace(/```madarx-action[\s\S]*$/i, '').trim();
|
|
525
|
+
if (disp) emit('cli_stream', { text: disp });
|
|
526
|
+
},
|
|
527
|
+
onThinking: (full) => { if (full) emit('cli_thinking', { text: full }); },
|
|
528
|
+
});
|
|
514
529
|
// Ollama runs single-shot with NO madarX tool loop. A Hermes/Nous-template model
|
|
515
530
|
// satisfies a tool task by role-playing the whole loop — emitting <tool_call> and a
|
|
516
531
|
// fabricated <tool_response> in plain text. Never save that fiction as an artifact.
|
|
@@ -550,14 +565,36 @@ export async function POST(req) {
|
|
|
550
565
|
if (displayText) emit('cli_stream', { text: displayText });
|
|
551
566
|
};
|
|
552
567
|
const ccOnAssistantText = (text) => {
|
|
553
|
-
|
|
554
|
-
|
|
568
|
+
// Strip from the chat preview: (a) madarx-action blocks (complete +
|
|
569
|
+
// in-progress trailing fence) so half-streamed JSON never flashes, and
|
|
570
|
+
// (b) the HTML artifact body — it renders on the canvas, not as raw
|
|
571
|
+
// markup typing into the chat bubble. Also drops the huge re-sent HTML
|
|
572
|
+
// from every SSE tick. `building` tells the client to show a tasteful
|
|
573
|
+
// "designing the page…" placeholder when the turn is artifact-only.
|
|
574
|
+
const hadHtml = /```html|<!doctype html|<html[\s>]/i.test(text);
|
|
575
|
+
const displayText = text
|
|
576
|
+
.replace(/```madarx-action[\s\S]*?```/gi, '')
|
|
577
|
+
.replace(/```madarx-action[\s\S]*$/i, '')
|
|
578
|
+
.replace(/```html[\s\S]*?```/gi, '')
|
|
579
|
+
.replace(/```html[\s\S]*$/i, '')
|
|
580
|
+
.replace(/<!doctype html[\s\S]*$/i, '')
|
|
581
|
+
.replace(/<html[\s>][\s\S]*$/i, '')
|
|
582
|
+
.trim();
|
|
583
|
+
if (displayText || hadHtml) {
|
|
584
|
+
emit('cli_stream', { text: displayText, building: hadHtml && !displayText });
|
|
585
|
+
}
|
|
586
|
+
};
|
|
587
|
+
const ccOnThinking = (text) => {
|
|
588
|
+
if (text) emit('cli_thinking', { text });
|
|
589
|
+
};
|
|
590
|
+
const ccOnStatus = (phase) => {
|
|
591
|
+
emit('cli_status', { phase, engine: activeEngine });
|
|
555
592
|
};
|
|
556
593
|
const ccOnToolStart = ({ name, input }) => {
|
|
557
594
|
emit('tool_start', { name, input });
|
|
558
595
|
};
|
|
559
|
-
const ccOnToolResult = ({ name, isError }) => {
|
|
560
|
-
emit('tool_result', { name, output: { ok: !isError }, isError: Boolean(isError) });
|
|
596
|
+
const ccOnToolResult = ({ name, isError, durationMs, preview, lines, chars }) => {
|
|
597
|
+
emit('tool_result', { name, output: { ok: !isError, preview, lines, chars }, isError: Boolean(isError), durationMs });
|
|
561
598
|
};
|
|
562
599
|
const invokeCli = (userMessage) => activeEngine === 'claude-code'
|
|
563
600
|
? runClaudeCodeAgent({
|
|
@@ -566,13 +603,28 @@ export async function POST(req) {
|
|
|
566
603
|
allowedTools: [],
|
|
567
604
|
maxTurns: 5,
|
|
568
605
|
timeoutMs: Number(process.env.CLAUDE_CODE_CHAT_TIMEOUT_MS || 600000),
|
|
606
|
+
verbosity: getStreamVerbosity(),
|
|
569
607
|
onAssistantText: ccOnAssistantText,
|
|
608
|
+
onThinking: ccOnThinking,
|
|
609
|
+
onStatus: ccOnStatus,
|
|
570
610
|
onToolStart: ccOnToolStart,
|
|
571
611
|
onToolResult: ccOnToolResult,
|
|
572
612
|
})
|
|
573
613
|
: runCodexAgent({ systemPrompt, userMessage, onChunk: codexOnChunk });
|
|
614
|
+
// Heartbeat wrapper: the CLI can sit silent for seconds booting or inside
|
|
615
|
+
// a slow tool. Emit an elapsed status tick around each invocation so the
|
|
616
|
+
// user always sees it's alive, and clear it the instant the call returns.
|
|
617
|
+
const invokeCliWithHeartbeat = async (userMessage) => {
|
|
618
|
+
const startedAt = Date.now();
|
|
619
|
+
emit('cli_status', { phase: 'starting', engine: activeEngine });
|
|
620
|
+
const hb = setInterval(() => {
|
|
621
|
+
emit('cli_status', { phase: 'working', engine: activeEngine, elapsedMs: Date.now() - startedAt });
|
|
622
|
+
}, 3000);
|
|
623
|
+
try { return await invokeCli(userMessage); }
|
|
624
|
+
finally { clearInterval(hb); emit('cli_status', { phase: 'done', engine: activeEngine }); }
|
|
625
|
+
};
|
|
574
626
|
try {
|
|
575
|
-
raw = await
|
|
627
|
+
raw = await invokeCliWithHeartbeat(cliUserContent);
|
|
576
628
|
emit('tool_result', { name: cliLabel, output: { ok: true }, isError: false });
|
|
577
629
|
} catch (cliErr) {
|
|
578
630
|
emit('tool_result', { name: cliLabel, output: { error: cliErr.message }, isError: true });
|
|
@@ -607,7 +659,7 @@ export async function POST(req) {
|
|
|
607
659
|
emit('cli_stream', { text: 'No action ran on the first pass — retrying…' });
|
|
608
660
|
let retryRaw = null;
|
|
609
661
|
try {
|
|
610
|
-
retryRaw = await
|
|
662
|
+
retryRaw = await invokeCliWithHeartbeat(nudge);
|
|
611
663
|
} catch (retryErr) {
|
|
612
664
|
if (process.env.MADARX_DEBUG) console.error('[madarx] intent-nudge retry failed:', retryErr.message);
|
|
613
665
|
}
|
|
@@ -909,6 +961,9 @@ Rules (non-negotiable):
|
|
|
909
961
|
}
|
|
910
962
|
let iterations = 0;
|
|
911
963
|
const MAX_TURNS = 8;
|
|
964
|
+
// Extended-thinking budget for the Anthropic loop. Verbosity-gated and
|
|
965
|
+
// only applied to thinking-capable models (streamChatWithClaude guards).
|
|
966
|
+
const anthropicThinkingBudget = thinkingBudgetTokens();
|
|
912
967
|
let artifactCreated = false;
|
|
913
968
|
let totalAgentText = '';
|
|
914
969
|
let totalInputTokens = 0;
|
|
@@ -924,7 +979,8 @@ Rules (non-negotiable):
|
|
|
924
979
|
currentMessages,
|
|
925
980
|
systemPrompt,
|
|
926
981
|
getTools(),
|
|
927
|
-
loopModel
|
|
982
|
+
loopModel,
|
|
983
|
+
{ thinkingBudget: anthropicThinkingBudget }
|
|
928
984
|
);
|
|
929
985
|
|
|
930
986
|
let textBuffer = '';
|
|
@@ -936,6 +992,13 @@ Rules (non-negotiable):
|
|
|
936
992
|
let turnOutputTokens = 0;
|
|
937
993
|
let turnCacheReadTokens = 0;
|
|
938
994
|
let turnCacheCreationTokens = 0;
|
|
995
|
+
// Extended-thinking capture. Thinking/redacted_thinking blocks must be
|
|
996
|
+
// preserved (with their signatures) and replayed in the assistant turn
|
|
997
|
+
// when tool_use is present, or the API rejects the next request. They
|
|
998
|
+
// also drive the live "Thinking…" surface via the cli_thinking event.
|
|
999
|
+
let thinkingBlocks = [];
|
|
1000
|
+
let currentThinking = null;
|
|
1001
|
+
let thinkingLive = '';
|
|
939
1002
|
|
|
940
1003
|
// Stream events from the Anthropic SDK stream object
|
|
941
1004
|
for await (const event of claudeStream) {
|
|
@@ -952,6 +1015,12 @@ Rules (non-negotiable):
|
|
|
952
1015
|
input: {},
|
|
953
1016
|
};
|
|
954
1017
|
inputJsonBuffer = '';
|
|
1018
|
+
} else if (event.content_block.type === 'thinking') {
|
|
1019
|
+
currentThinking = { type: 'thinking', thinking: '', signature: '' };
|
|
1020
|
+
emit('cli_status', { phase: 'thinking', engine: activeEngine });
|
|
1021
|
+
} else if (event.content_block.type === 'redacted_thinking') {
|
|
1022
|
+
// No deltas — the encrypted payload arrives whole. Preserve it for replay.
|
|
1023
|
+
thinkingBlocks.push({ type: 'redacted_thinking', data: event.content_block.data });
|
|
955
1024
|
}
|
|
956
1025
|
} else if (event.type === 'content_block_delta') {
|
|
957
1026
|
if (event.delta.type === 'text_delta') {
|
|
@@ -959,6 +1028,12 @@ Rules (non-negotiable):
|
|
|
959
1028
|
emit('text', { delta: event.delta.text });
|
|
960
1029
|
} else if (event.delta.type === 'input_json_delta') {
|
|
961
1030
|
inputJsonBuffer += event.delta.partial_json;
|
|
1031
|
+
} else if (event.delta.type === 'thinking_delta' && currentThinking) {
|
|
1032
|
+
currentThinking.thinking += event.delta.thinking;
|
|
1033
|
+
thinkingLive += event.delta.thinking;
|
|
1034
|
+
emit('cli_thinking', { text: thinkingLive });
|
|
1035
|
+
} else if (event.delta.type === 'signature_delta' && currentThinking) {
|
|
1036
|
+
currentThinking.signature += event.delta.signature;
|
|
962
1037
|
}
|
|
963
1038
|
} else if (event.type === 'content_block_stop') {
|
|
964
1039
|
if (currentToolBlock) {
|
|
@@ -970,6 +1045,9 @@ Rules (non-negotiable):
|
|
|
970
1045
|
toolUseBlocks.push(currentToolBlock);
|
|
971
1046
|
currentToolBlock = null;
|
|
972
1047
|
inputJsonBuffer = '';
|
|
1048
|
+
} else if (currentThinking) {
|
|
1049
|
+
thinkingBlocks.push(currentThinking);
|
|
1050
|
+
currentThinking = null;
|
|
973
1051
|
}
|
|
974
1052
|
} else if (event.type === 'message_delta') {
|
|
975
1053
|
if (event.delta.stop_reason) stopReason = event.delta.stop_reason;
|
|
@@ -991,8 +1069,13 @@ Rules (non-negotiable):
|
|
|
991
1069
|
context: lastContextTokens,
|
|
992
1070
|
});
|
|
993
1071
|
|
|
994
|
-
// Build the assistant message for the agentic loop
|
|
1072
|
+
// Build the assistant message for the agentic loop. Thinking blocks
|
|
1073
|
+
// come FIRST (the API requires them ahead of text/tool_use, with their
|
|
1074
|
+
// signatures intact) so the next turn carrying tool_results validates.
|
|
995
1075
|
const assistantContent = [];
|
|
1076
|
+
if (stopReason === 'tool_use') {
|
|
1077
|
+
for (const tb of thinkingBlocks) assistantContent.push(tb);
|
|
1078
|
+
}
|
|
996
1079
|
if (textBuffer) {
|
|
997
1080
|
assistantContent.push({ type: 'text', text: textBuffer });
|
|
998
1081
|
}
|
|
@@ -37,6 +37,10 @@ export async function POST(request) {
|
|
|
37
37
|
? body.instructions
|
|
38
38
|
: undefined,
|
|
39
39
|
tools: Array.isArray(body?.tools) ? body.tools : undefined,
|
|
40
|
+
// 'transport' = STT-only (orchestrator is the brain); 'realtime' = proven
|
|
41
|
+
// in-browser brain. Default to realtime; transport is opt-in until the
|
|
42
|
+
// GA session shape is verified against a live mic.
|
|
43
|
+
mode: body?.mode === 'transport' ? 'transport' : 'realtime',
|
|
40
44
|
project_id: body?.project_id || null,
|
|
41
45
|
agent_id: body?.agent_id || 'main',
|
|
42
46
|
active_space: body?.active_space || null,
|