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/lib/agent-engines.js
CHANGED
|
@@ -7,18 +7,42 @@ import { chatWithClaude } from './claude.js';
|
|
|
7
7
|
const ANTHROPIC_MODEL = 'claude-sonnet-4-6';
|
|
8
8
|
import { publishLiveEvent } from './live-events.js';
|
|
9
9
|
import { WORKSPACE, DATA_DIR, ensureDirs } from './paths.js';
|
|
10
|
+
import { getStreamVerbosity, verbosityStreamsThinking, thinkingBudgetTokens } from './engine-verbosity.js';
|
|
10
11
|
|
|
11
12
|
const PROJECT_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
12
13
|
|
|
14
|
+
// Extract a short, human-readable preview from a tool_result block's content.
|
|
15
|
+
// Content can be a string or an array of {type:'text', text} / image parts.
|
|
16
|
+
function previewToolResultContent(block) {
|
|
17
|
+
const c = block?.content;
|
|
18
|
+
let text = '';
|
|
19
|
+
if (typeof c === 'string') text = c;
|
|
20
|
+
else if (Array.isArray(c)) {
|
|
21
|
+
text = c.map(p => (typeof p === 'string' ? p : (p?.type === 'text' && typeof p.text === 'string' ? p.text : ''))).join('');
|
|
22
|
+
}
|
|
23
|
+
text = String(text || '');
|
|
24
|
+
return {
|
|
25
|
+
preview: text.slice(0, 200),
|
|
26
|
+
chars: text.length,
|
|
27
|
+
lines: text ? text.split('\n').length : 0,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
13
31
|
// Parses Claude Code's `--output-format stream-json` stdout. Each line is a JSON
|
|
14
32
|
// envelope. We care about:
|
|
15
33
|
// - assistant.message.content[].type === 'text' → accumulate response text
|
|
34
|
+
// - assistant.message.content[].type === 'thinking' → surface reasoning (onThinkingDelta)
|
|
16
35
|
// - assistant.message.content[].type === 'tool_use' → emit agent_tool_start
|
|
17
36
|
// - user.message.content[].type === 'tool_result' → emit agent_tool_result
|
|
18
|
-
//
|
|
19
|
-
|
|
37
|
+
// - stream_event (only with --include-partial-messages) → incremental text /
|
|
38
|
+
// thinking deltas for smooth token-by-token streaming.
|
|
39
|
+
// `partial` tells us deltas are active: when true the live preview is driven by
|
|
40
|
+
// stream_event deltas, and the complete assistant envelope is used ONLY to
|
|
41
|
+
// accumulate the authoritative final answer (avoids double-counting).
|
|
42
|
+
export function makeStreamJsonParser({ agentId, agentName, partial = false, onText, onTextDelta, onThinkingDelta, onToolStart, onToolResult, onResult, onStatus }) {
|
|
20
43
|
let buffer = '';
|
|
21
44
|
const toolNameById = new Map();
|
|
45
|
+
const toolStartedAt = new Map();
|
|
22
46
|
return function handleChunk(chunk) {
|
|
23
47
|
buffer += chunk;
|
|
24
48
|
let nl;
|
|
@@ -29,6 +53,28 @@ function makeStreamJsonParser({ agentId, agentName, onText, onToolStart, onToolR
|
|
|
29
53
|
let evt;
|
|
30
54
|
try { evt = JSON.parse(raw); } catch { continue; }
|
|
31
55
|
if (!evt || typeof evt !== 'object') continue;
|
|
56
|
+
|
|
57
|
+
// Partial-message deltas (present only with --include-partial-messages).
|
|
58
|
+
// These wrap the raw Anthropic SSE event under evt.event. They drive the
|
|
59
|
+
// live preview; the authoritative answer still comes from the complete
|
|
60
|
+
// `assistant` envelopes below.
|
|
61
|
+
if (evt.type === 'stream_event' && evt.event && typeof evt.event === 'object') {
|
|
62
|
+
const se = evt.event;
|
|
63
|
+
if (se.type === 'content_block_delta' && se.delta) {
|
|
64
|
+
const d = se.delta;
|
|
65
|
+
if (d.type === 'text_delta' && typeof d.text === 'string') {
|
|
66
|
+
onTextDelta?.(d.text);
|
|
67
|
+
} else if (d.type === 'thinking_delta' && typeof d.thinking === 'string') {
|
|
68
|
+
onThinkingDelta?.(d.thinking);
|
|
69
|
+
}
|
|
70
|
+
} else if (se.type === 'content_block_start' && se.content_block?.type === 'thinking') {
|
|
71
|
+
onStatus?.('thinking');
|
|
72
|
+
} else if (se.type === 'message_start') {
|
|
73
|
+
onStatus?.('generating');
|
|
74
|
+
}
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
|
|
32
78
|
// Terminal result event carries the run's final text at top level
|
|
33
79
|
// (`evt.result`), not inside message.content. Capture it as a last-resort
|
|
34
80
|
// answer for turns that emitted only tool_use blocks and no clean text
|
|
@@ -52,6 +98,16 @@ function makeStreamJsonParser({ agentId, agentName, onText, onToolStart, onToolR
|
|
|
52
98
|
// can keep it for the live chat preview but exclude it from the
|
|
53
99
|
// final return value.
|
|
54
100
|
const hasToolUse = content.some(b => b?.type === 'tool_use');
|
|
101
|
+
// Thinking blocks in a complete envelope: only surface here when partial
|
|
102
|
+
// streaming is OFF (otherwise the stream_event deltas already did, and
|
|
103
|
+
// re-emitting would duplicate the reasoning).
|
|
104
|
+
if (!partial) {
|
|
105
|
+
for (const b of content) {
|
|
106
|
+
if (b?.type === 'thinking' && typeof b.thinking === 'string' && b.thinking) {
|
|
107
|
+
onThinkingDelta?.(b.thinking);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
55
111
|
const messageText = content
|
|
56
112
|
.filter(b => b?.type === 'text' && typeof b.text === 'string')
|
|
57
113
|
.map(b => b.text)
|
|
@@ -59,7 +115,10 @@ function makeStreamJsonParser({ agentId, agentName, onText, onToolStart, onToolR
|
|
|
59
115
|
if (messageText) onText?.(messageText, { isFinal: !hasToolUse });
|
|
60
116
|
for (const block of content) {
|
|
61
117
|
if (block?.type === 'tool_use') {
|
|
62
|
-
if (block.id)
|
|
118
|
+
if (block.id) {
|
|
119
|
+
toolNameById.set(block.id, block.name || 'tool');
|
|
120
|
+
toolStartedAt.set(block.id, Date.now());
|
|
121
|
+
}
|
|
63
122
|
onToolStart?.({ id: block.id, name: block.name || 'tool', input: block.input });
|
|
64
123
|
if (agentId) {
|
|
65
124
|
publishLiveEvent({
|
|
@@ -76,7 +135,18 @@ function makeStreamJsonParser({ agentId, agentName, onText, onToolStart, onToolR
|
|
|
76
135
|
for (const block of content) {
|
|
77
136
|
if (block?.type === 'tool_result') {
|
|
78
137
|
const toolName = toolNameById.get(block.tool_use_id) || 'tool';
|
|
79
|
-
|
|
138
|
+
const startedAt = toolStartedAt.get(block.tool_use_id);
|
|
139
|
+
const durationMs = startedAt ? Date.now() - startedAt : null;
|
|
140
|
+
const { preview, chars, lines } = previewToolResultContent(block);
|
|
141
|
+
onToolResult?.({
|
|
142
|
+
tool_use_id: block.tool_use_id,
|
|
143
|
+
name: toolName,
|
|
144
|
+
isError: Boolean(block.is_error),
|
|
145
|
+
durationMs,
|
|
146
|
+
preview,
|
|
147
|
+
chars,
|
|
148
|
+
lines,
|
|
149
|
+
});
|
|
80
150
|
if (agentId) {
|
|
81
151
|
publishLiveEvent({
|
|
82
152
|
type: 'agent_tool_result',
|
|
@@ -85,9 +155,11 @@ function makeStreamJsonParser({ agentId, agentName, onText, onToolStart, onToolR
|
|
|
85
155
|
tool: toolName,
|
|
86
156
|
status: block.is_error ? 'error' : 'done',
|
|
87
157
|
isError: Boolean(block.is_error),
|
|
158
|
+
duration_ms: durationMs,
|
|
88
159
|
});
|
|
89
160
|
}
|
|
90
161
|
toolNameById.delete(block.tool_use_id);
|
|
162
|
+
toolStartedAt.delete(block.tool_use_id);
|
|
91
163
|
}
|
|
92
164
|
}
|
|
93
165
|
}
|
|
@@ -292,6 +364,30 @@ export async function commandExists(command) {
|
|
|
292
364
|
});
|
|
293
365
|
}
|
|
294
366
|
|
|
367
|
+
// Whether the installed `claude` CLI understands --include-partial-messages
|
|
368
|
+
// (needed for token-by-token streaming + thinking deltas). Older CLIs reject
|
|
369
|
+
// unknown flags and fail the whole spawn, so we probe `claude --help` once and
|
|
370
|
+
// cache the result, degrading gracefully to chunked streaming when absent.
|
|
371
|
+
// Force with MADARX_CC_FORCE_PARTIAL=1, disable with =0.
|
|
372
|
+
let _ccPartialSupport;
|
|
373
|
+
async function claudeSupportsPartialMessages() {
|
|
374
|
+
if (process.env.MADARX_MOCK_CLAUDE_CODE_RESPONSE) return false;
|
|
375
|
+
if (process.env.MADARX_CC_FORCE_PARTIAL === '1') return true;
|
|
376
|
+
if (process.env.MADARX_CC_FORCE_PARTIAL === '0') return false;
|
|
377
|
+
if (_ccPartialSupport !== undefined) return _ccPartialSupport;
|
|
378
|
+
_ccPartialSupport = await new Promise(resolve => {
|
|
379
|
+
try {
|
|
380
|
+
const child = spawn(commandSpawnTarget('claude'), ['--help'], { shell: false });
|
|
381
|
+
let out = '';
|
|
382
|
+
child.stdout.on('data', c => { out += c.toString(); });
|
|
383
|
+
child.stderr.on('data', c => { out += c.toString(); });
|
|
384
|
+
child.on('error', () => resolve(false));
|
|
385
|
+
child.on('close', () => resolve(out.includes('include-partial-messages')));
|
|
386
|
+
} catch { resolve(false); }
|
|
387
|
+
});
|
|
388
|
+
return _ccPartialSupport;
|
|
389
|
+
}
|
|
390
|
+
|
|
295
391
|
async function listOllamaModels() {
|
|
296
392
|
try {
|
|
297
393
|
const response = await fetch(`${OLLAMA_BASE_URL}/api/tags`, { signal: AbortSignal.timeout(1500) });
|
|
@@ -384,32 +480,73 @@ function cliOutput(command, args, { cwd = process.cwd(), timeoutMs = 120000, clo
|
|
|
384
480
|
});
|
|
385
481
|
}
|
|
386
482
|
|
|
387
|
-
export async function runOllamaAgent({ model, systemPrompt, userMessage, maxTokens = 2048 }) {
|
|
483
|
+
export async function runOllamaAgent({ model, systemPrompt, userMessage, maxTokens = 2048, onChunk, onThinking } = {}) {
|
|
388
484
|
if (process.env.MADARX_MOCK_OLLAMA_RESPONSE) return process.env.MADARX_MOCK_OLLAMA_RESPONSE;
|
|
485
|
+
// Stream only when a consumer wants live output. `think` surfaces reasoning on
|
|
486
|
+
// models that support it (deepseek-r1, qwen3, …) but errors on some Ollama
|
|
487
|
+
// versions/models, so it's opt-in via MADARX_OLLAMA_THINK=1.
|
|
488
|
+
const wantStream = Boolean(onChunk || onThinking);
|
|
489
|
+
const wantThink = wantStream && verbosityStreamsThinking() && process.env.MADARX_OLLAMA_THINK === '1';
|
|
490
|
+
const body = {
|
|
491
|
+
model: model || process.env.OLLAMA_MODEL,
|
|
492
|
+
stream: wantStream,
|
|
493
|
+
options: { num_predict: maxTokens },
|
|
494
|
+
messages: [
|
|
495
|
+
{ role: 'system', content: systemPrompt },
|
|
496
|
+
{ role: 'user', content: userMessage },
|
|
497
|
+
],
|
|
498
|
+
};
|
|
499
|
+
if (wantThink) body.think = true;
|
|
389
500
|
const response = await fetch(`${OLLAMA_BASE_URL}/api/chat`, {
|
|
390
501
|
method: 'POST',
|
|
391
502
|
headers: { 'Content-Type': 'application/json' },
|
|
392
|
-
body: JSON.stringify(
|
|
393
|
-
model: model || process.env.OLLAMA_MODEL,
|
|
394
|
-
stream: false,
|
|
395
|
-
options: { num_predict: maxTokens },
|
|
396
|
-
messages: [
|
|
397
|
-
{ role: 'system', content: systemPrompt },
|
|
398
|
-
{ role: 'user', content: userMessage },
|
|
399
|
-
],
|
|
400
|
-
}),
|
|
503
|
+
body: JSON.stringify(body),
|
|
401
504
|
});
|
|
402
505
|
if (!response.ok) throw new Error(`Ollama chat failed: HTTP ${response.status}`);
|
|
403
|
-
|
|
404
|
-
|
|
506
|
+
if (!wantStream) {
|
|
507
|
+
const data = await response.json();
|
|
508
|
+
const content = data.message?.content || data.response || '';
|
|
509
|
+
if (!content.trim()) throw new Error('Ollama returned no text');
|
|
510
|
+
return content.trim();
|
|
511
|
+
}
|
|
512
|
+
// Streaming: Ollama emits newline-delimited JSON. Accumulate content + thinking
|
|
513
|
+
// and forward incremental pieces to the callbacks for a live chat preview.
|
|
514
|
+
let content = '';
|
|
515
|
+
let thinking = '';
|
|
516
|
+
const reader = response.body.getReader();
|
|
517
|
+
const dec = new TextDecoder();
|
|
518
|
+
let buf = '';
|
|
519
|
+
while (true) {
|
|
520
|
+
const { done, value } = await reader.read();
|
|
521
|
+
if (done) break;
|
|
522
|
+
buf += dec.decode(value, { stream: true });
|
|
523
|
+
let nl;
|
|
524
|
+
while ((nl = buf.indexOf('\n')) >= 0) {
|
|
525
|
+
const line = buf.slice(0, nl).trim();
|
|
526
|
+
buf = buf.slice(nl + 1);
|
|
527
|
+
if (!line) continue;
|
|
528
|
+
let evt;
|
|
529
|
+
try { evt = JSON.parse(line); } catch { continue; }
|
|
530
|
+
const piece = evt.message?.content || evt.response || '';
|
|
531
|
+
const think = evt.message?.thinking || '';
|
|
532
|
+
if (piece) { content += piece; onChunk?.(piece, content); }
|
|
533
|
+
if (think) { thinking += think; onThinking?.(thinking, think); }
|
|
534
|
+
}
|
|
535
|
+
}
|
|
405
536
|
if (!content.trim()) throw new Error('Ollama returned no text');
|
|
406
537
|
return content.trim();
|
|
407
538
|
}
|
|
408
539
|
|
|
409
|
-
export async function runClaudeCodeAgent({ model, systemPrompt, userMessage, maxTurns, allowedTools = [], timeoutMs, onChunk, onAssistantText, onToolStart, onToolResult, cwd, addDirs = [], agentId, agentName } = {}) {
|
|
540
|
+
export async function runClaudeCodeAgent({ model, systemPrompt, userMessage, maxTurns, allowedTools = [], timeoutMs, onChunk, onAssistantText, onThinking, onStatus, onToolStart, onToolResult, cwd, addDirs = [], agentId, agentName, verbosity } = {}) {
|
|
410
541
|
if (process.env.MADARX_MOCK_CLAUDE_CODE_RESPONSE) return process.env.MADARX_MOCK_CLAUDE_CODE_RESPONSE;
|
|
411
542
|
const prompt = `${systemPrompt}\n\n${userMessage}`;
|
|
412
543
|
const effectiveMaxTurns = Number(maxTurns || process.env.CLAUDE_CODE_MAX_TURNS || 30);
|
|
544
|
+
const v = verbosity || getStreamVerbosity();
|
|
545
|
+
const wantsThinking = verbosityStreamsThinking(v);
|
|
546
|
+
// Token-by-token streaming + reasoning need --include-partial-messages, which
|
|
547
|
+
// only newer CLIs support. Probe once; fall back to chunked complete-message
|
|
548
|
+
// streaming when unavailable so nothing breaks on older installs.
|
|
549
|
+
const partial = wantsThinking && await claudeSupportsPartialMessages();
|
|
413
550
|
const args = [
|
|
414
551
|
'-p', prompt,
|
|
415
552
|
'--max-turns', String(effectiveMaxTurns),
|
|
@@ -418,12 +555,21 @@ export async function runClaudeCodeAgent({ model, systemPrompt, userMessage, max
|
|
|
418
555
|
'--permission-mode', 'bypassPermissions',
|
|
419
556
|
'--setting-sources', 'project,local,user',
|
|
420
557
|
];
|
|
558
|
+
if (partial) args.push('--include-partial-messages');
|
|
421
559
|
for (const dir of addDirs) {
|
|
422
560
|
if (dir) args.push('--add-dir', dir);
|
|
423
561
|
}
|
|
424
562
|
if (allowedTools.length) args.push('--allowedTools', allowedTools.join(','));
|
|
425
563
|
if (model && model !== 'claude-code') args.splice(2, 0, '--model', model);
|
|
426
564
|
|
|
565
|
+
// Best-effort nudge for the spawned CLI to actually produce extended thinking.
|
|
566
|
+
// Harmless when unsupported (the env var is simply ignored).
|
|
567
|
+
const subEnv = claudeSubprocessEnv();
|
|
568
|
+
if (wantsThinking) {
|
|
569
|
+
const budget = thinkingBudgetTokens(v);
|
|
570
|
+
if (budget > 0) subEnv.MAX_THINKING_TOKENS = String(Math.max(1024, budget));
|
|
571
|
+
}
|
|
572
|
+
|
|
427
573
|
// Two buffers: `narrationParts` keeps every assistant text block (used only
|
|
428
574
|
// for the live chat preview), `finalParts` keeps text from messages that had
|
|
429
575
|
// NO tool_use — i.e. the actual answer, not the "let me search next…" prose.
|
|
@@ -433,17 +579,32 @@ export async function runClaudeCodeAgent({ model, systemPrompt, userMessage, max
|
|
|
433
579
|
const finalParts = [];
|
|
434
580
|
let lastNarration = '';
|
|
435
581
|
let resultText = '';
|
|
582
|
+
// Live preview accumulators for partial mode. `liveDelta` is the running
|
|
583
|
+
// answer text (token deltas); `liveThinking` is the running reasoning. They
|
|
584
|
+
// never feed the returned answer — only the live chat surface.
|
|
585
|
+
let liveDelta = '';
|
|
586
|
+
let liveThinking = '';
|
|
436
587
|
const parse = makeStreamJsonParser({
|
|
437
588
|
agentId,
|
|
438
589
|
agentName,
|
|
590
|
+
partial,
|
|
439
591
|
onText: (t, opts = {}) => {
|
|
440
592
|
narrationParts.push(t);
|
|
441
593
|
if (opts.isFinal) finalParts.push(t);
|
|
442
594
|
else lastNarration = t;
|
|
443
|
-
//
|
|
444
|
-
//
|
|
445
|
-
onAssistantText?.(narrationParts.join('').trim());
|
|
595
|
+
// When partial deltas are streaming the preview, the complete envelope is
|
|
596
|
+
// authoritative-only — don't also drive the preview from it (would double).
|
|
597
|
+
if (!partial) onAssistantText?.(narrationParts.join('').trim());
|
|
598
|
+
},
|
|
599
|
+
onTextDelta: (delta) => {
|
|
600
|
+
liveDelta += delta;
|
|
601
|
+
onAssistantText?.(liveDelta.trim());
|
|
602
|
+
},
|
|
603
|
+
onThinkingDelta: (delta) => {
|
|
604
|
+
liveThinking += delta;
|
|
605
|
+
onThinking?.(liveThinking.trim(), delta);
|
|
446
606
|
},
|
|
607
|
+
onStatus: (phase) => { onStatus?.(phase); },
|
|
447
608
|
onResult: (t) => { resultText = t; },
|
|
448
609
|
onToolStart,
|
|
449
610
|
onToolResult,
|
|
@@ -461,7 +622,7 @@ export async function runClaudeCodeAgent({ model, systemPrompt, userMessage, max
|
|
|
461
622
|
// local CLI engine. Strip them so CC uses the logged-in subscription.
|
|
462
623
|
// Honor an explicit opt-out for users who genuinely want API-key billing
|
|
463
624
|
// for the spawned CLI (MADARX_CLI_USE_API_KEY=1).
|
|
464
|
-
env:
|
|
625
|
+
env: subEnv,
|
|
465
626
|
onChunk: (chunk) => {
|
|
466
627
|
parse(chunk);
|
|
467
628
|
onChunk?.(chunk);
|
package/lib/auth-config.js
CHANGED
|
@@ -74,26 +74,42 @@ export function verifyRecoveryToken(provided) {
|
|
|
74
74
|
|
|
75
75
|
function envMode() {
|
|
76
76
|
const raw = process.env.MADARX_AUTH_MODE;
|
|
77
|
-
if (raw && String(raw).trim())
|
|
77
|
+
if (raw && String(raw).trim()) {
|
|
78
|
+
const m = String(raw).trim().toLowerCase();
|
|
79
|
+
if (VALID_MODES.has(m)) return m;
|
|
80
|
+
}
|
|
78
81
|
return null;
|
|
79
82
|
}
|
|
80
83
|
|
|
81
|
-
/**
|
|
84
|
+
/**
|
|
85
|
+
* True ONLY when the operator opts into a hard lock via MADARX_AUTH_MODE_LOCK=1
|
|
86
|
+
* (alongside a valid MADARX_AUTH_MODE). In that state the UI / recovery flow
|
|
87
|
+
* cannot change the mode — for multi-tenant deployments that must fail closed.
|
|
88
|
+
*
|
|
89
|
+
* A bare `MADARX_AUTH_MODE` is NOT a lock: it only seeds the initial default the
|
|
90
|
+
* UI can still override. This is deliberate — a stray `MADARX_AUTH_MODE=supabase`
|
|
91
|
+
* with no resolvable credentials must never strand the operator behind a login
|
|
92
|
+
* that can't initialise, because the config-table mode (written by the login
|
|
93
|
+
* screen and the recovery-token hatch) always wins over the env seed.
|
|
94
|
+
*/
|
|
82
95
|
export function isAuthModeEnvLocked() {
|
|
83
|
-
const
|
|
84
|
-
return Boolean(
|
|
96
|
+
const lock = String(process.env.MADARX_AUTH_MODE_LOCK || '').trim().toLowerCase();
|
|
97
|
+
return Boolean(envMode() && (lock === '1' || lock === 'true'));
|
|
85
98
|
}
|
|
86
99
|
|
|
87
100
|
export function getAuthMode() {
|
|
88
|
-
|
|
89
|
-
if (
|
|
101
|
+
// Hard lock (opt-in): env wins outright, UI cannot override.
|
|
102
|
+
if (isAuthModeEnvLocked()) return envMode();
|
|
103
|
+
// Normal precedence: the config table (UI/recovery-managed) wins, so the
|
|
104
|
+
// login screen and the recovery-token hatch can always change the mode.
|
|
90
105
|
try {
|
|
91
106
|
const stored = getConfig(AUTH_MODE_KEY, null);
|
|
92
107
|
if (stored && VALID_MODES.has(stored)) return stored;
|
|
93
108
|
} catch {
|
|
94
|
-
// DB not ready (very early boot) — fall through to the
|
|
109
|
+
// DB not ready (very early boot) — fall through to the env seed / default.
|
|
95
110
|
}
|
|
96
|
-
|
|
111
|
+
// No stored mode yet → env acts as the initial default (seed), else local.
|
|
112
|
+
return envMode() || 'local';
|
|
97
113
|
}
|
|
98
114
|
|
|
99
115
|
export function getSupabaseAuthConfig() {
|
package/lib/claude.js
CHANGED
|
@@ -76,15 +76,32 @@ export async function chatWithClaude(messages, systemPrompt, tools = [], options
|
|
|
76
76
|
return withRetry(() => client.messages.create(params), `chat(${params.model})`);
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
-
|
|
79
|
+
// Extended thinking is supported on Claude 3.7+ Sonnet and the Claude 4 family.
|
|
80
|
+
// Enabling it on an older model (e.g. 3.5 Haiku/Sonnet) is a 400 — so we
|
|
81
|
+
// allowlist and silently skip otherwise rather than break the turn.
|
|
82
|
+
export function modelSupportsThinking(model) {
|
|
83
|
+
return /(sonnet-4|opus-4|haiku-4|3-7-sonnet)/i.test(String(model || ''));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export async function streamChatWithClaude(messages, systemPrompt, tools = [], model = MODEL, options = {}) {
|
|
80
87
|
const client = getClient();
|
|
81
88
|
const params = {
|
|
82
89
|
model,
|
|
83
|
-
max_tokens: 8192,
|
|
90
|
+
max_tokens: options.max_tokens || 8192,
|
|
84
91
|
system: systemPrompt,
|
|
85
92
|
messages,
|
|
86
93
|
};
|
|
87
94
|
if (tools.length) params.tools = tools;
|
|
95
|
+
// Extended thinking: when a budget is requested AND the model supports it,
|
|
96
|
+
// enable interleaved reasoning so the route can stream `thinking` deltas.
|
|
97
|
+
// max_tokens must exceed the thinking budget — leave generous headroom for
|
|
98
|
+
// the actual answer (HTML artifacts can be large). temperature must be unset
|
|
99
|
+
// with thinking, so we never pass it here.
|
|
100
|
+
if (options.thinkingBudget > 0 && modelSupportsThinking(model)) {
|
|
101
|
+
const budget = Math.max(1024, Math.floor(options.thinkingBudget));
|
|
102
|
+
params.thinking = { type: 'enabled', budget_tokens: budget };
|
|
103
|
+
params.max_tokens = Math.max(params.max_tokens, budget + 8192);
|
|
104
|
+
}
|
|
88
105
|
// Stream cannot be resumed mid-flight; outer retry only covers establishing
|
|
89
106
|
// the stream (connection/429 before the first token), not a mid-stream drop.
|
|
90
107
|
return withRetry(() => client.messages.stream(params), `stream(${model})`);
|
package/lib/cli/doctor.js
CHANGED
|
@@ -60,6 +60,30 @@ function checkMasterKey(layout) {
|
|
|
60
60
|
};
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
+
// Catches the "team mode set but no credentials" lockout BEFORE boot. Soft +
|
|
64
|
+
// env-only (doctor never opens the DB), so it can't see vault-stored keys — the
|
|
65
|
+
// message is hedged accordingly. Precedence here mirrors getSupabaseAuthConfig:
|
|
66
|
+
// process.env → env file, with NEXT_PUBLIC_* aliases honored.
|
|
67
|
+
function checkAuthConfig(layout) {
|
|
68
|
+
const env = readEnvFile(layout.envFile);
|
|
69
|
+
const pick = (k) => process.env[k] || env[k] || '';
|
|
70
|
+
const mode = (pick('MADARX_AUTH_MODE') || '').trim().toLowerCase();
|
|
71
|
+
if (mode !== 'supabase') {
|
|
72
|
+
return { name: 'Auth config', ok: true, hard: false, detail: mode ? `mode=${mode}` : 'mode=local (default)' };
|
|
73
|
+
}
|
|
74
|
+
const url = pick('SUPABASE_URL') || pick('NEXT_PUBLIC_SUPABASE_URL');
|
|
75
|
+
const anon = pick('SUPABASE_ANON_KEY') || pick('NEXT_PUBLIC_SUPABASE_ANON_KEY');
|
|
76
|
+
if (url && anon) {
|
|
77
|
+
return { name: 'Auth config', ok: true, hard: false, detail: 'team mode + Supabase keys present' };
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
name: 'Auth config',
|
|
81
|
+
ok: false,
|
|
82
|
+
hard: false,
|
|
83
|
+
detail: 'team mode set but no SUPABASE_URL/ANON_KEY in env — if they are not in the vault, login will fail. Configure on the login screen or run `madarx setup`.',
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
63
87
|
function checkStandalone() {
|
|
64
88
|
const p = path.join(PKG_ROOT, '.next', 'standalone', 'server.js');
|
|
65
89
|
const ok = fs.existsSync(p);
|
|
@@ -100,6 +124,7 @@ export async function runDoctor() {
|
|
|
100
124
|
await checkSqlite(),
|
|
101
125
|
checkHomeWritable(layout),
|
|
102
126
|
checkMasterKey(layout),
|
|
127
|
+
checkAuthConfig(layout),
|
|
103
128
|
checkStandalone(),
|
|
104
129
|
checkWhatsAppDeps(),
|
|
105
130
|
await checkPort(),
|
package/lib/connection-seeds.js
CHANGED
|
@@ -207,7 +207,7 @@ const CONNECTION_SEEDS = [
|
|
|
207
207
|
type: 'password',
|
|
208
208
|
placeholder: 'ghp_…',
|
|
209
209
|
help_url: 'https://github.com/settings/tokens',
|
|
210
|
-
help_text: '
|
|
210
|
+
help_text: 'To read repos beyond your own, the token must be granted access to them. Fine-grained PAT: under "Repository access" pick the orgs/repos (org owner may need to approve); classic PAT: enable the "repo" scope and, for SSO orgs, click "Authorize" / "Configure SSO" next to the token.',
|
|
211
211
|
required: true,
|
|
212
212
|
},
|
|
213
213
|
],
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Shared streaming-verbosity + extended-thinking config for sub-agent engines.
|
|
2
|
+
//
|
|
3
|
+
// One knob controls how much of an engine's work madarX surfaces live in the
|
|
4
|
+
// chat. It applies engine-agnostically: the Claude Code CLI, the Anthropic
|
|
5
|
+
// Messages API, and (best-effort) Ollama all read the same setting.
|
|
6
|
+
//
|
|
7
|
+
// MADARX_CC_STREAM_VERBOSITY = 'quiet' | 'thinking' | 'full' (default 'thinking')
|
|
8
|
+
// quiet — legacy behavior: only complete assistant text + tool start/stop.
|
|
9
|
+
// thinking — stream token-by-token text, the model's reasoning, and rich
|
|
10
|
+
// tool detail (full input + output preview + duration).
|
|
11
|
+
// full — everything in `thinking`, plus raw engine envelopes routed to
|
|
12
|
+
// the client's "engine log" disclosure for deep debugging.
|
|
13
|
+
//
|
|
14
|
+
// The name keeps the `CC_` prefix for backwards compatibility with the first
|
|
15
|
+
// Claude-Code-only iteration; it now governs every engine.
|
|
16
|
+
|
|
17
|
+
const VALID = new Set(['quiet', 'thinking', 'full']);
|
|
18
|
+
|
|
19
|
+
export function getStreamVerbosity() {
|
|
20
|
+
const v = String(process.env.MADARX_CC_STREAM_VERBOSITY || 'thinking').trim().toLowerCase();
|
|
21
|
+
return VALID.has(v) ? v : 'thinking';
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function verbosityStreamsThinking(v = getStreamVerbosity()) {
|
|
25
|
+
return v === 'thinking' || v === 'full';
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function verbosityIsFull(v = getStreamVerbosity()) {
|
|
29
|
+
return v === 'full';
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Extended-thinking budget in tokens for engines where we control the request
|
|
33
|
+
// (Anthropic Messages API directly; the spawned Claude Code CLI via the
|
|
34
|
+
// MAX_THINKING_TOKENS env var, best-effort). 0 disables thinking. Anthropic
|
|
35
|
+
// requires a floor of 1024 when enabled — callers clamp up to that. Default
|
|
36
|
+
// 4000; override with MADARX_THINKING_BUDGET_TOKENS.
|
|
37
|
+
export function thinkingBudgetTokens(v = getStreamVerbosity()) {
|
|
38
|
+
if (!verbosityStreamsThinking(v)) return 0;
|
|
39
|
+
const raw = Number(process.env.MADARX_THINKING_BUDGET_TOKENS);
|
|
40
|
+
if (Number.isFinite(raw) && raw >= 0) return Math.floor(raw);
|
|
41
|
+
return 4000;
|
|
42
|
+
}
|
package/lib/env-file.js
CHANGED
|
@@ -20,6 +20,9 @@ export const ENV_DEFINITIONS = [
|
|
|
20
20
|
// secrets vault, not here.
|
|
21
21
|
{ name: 'MADARX_WEB_PROVIDER', label: 'Web Provider Override', group: 'Web', description: 'Force a specific search provider: firecrawl, searxng, brave, or fetch.' },
|
|
22
22
|
|
|
23
|
+
// --- Browser tool config ---
|
|
24
|
+
{ name: 'MADARX_BROWSER_HEADED', label: 'Visible Browser (headed)', group: 'Browser', description: 'Set to 1 to open a VISIBLE browser window you can watch the agent drive (click/type). Prefers your installed Chrome, falls back to bundled Chromium. Leave blank or 0 for headless. Applies on the next browser launch.' },
|
|
25
|
+
|
|
23
26
|
// --- File tool config ---
|
|
24
27
|
{ name: 'MADARX_ALLOWED_ROOTS', label: 'Allowed File Roots', group: 'Local Tools', description: 'Colon-separated absolute paths the file adapter may read/write.' },
|
|
25
28
|
{ name: 'MADARX_FILE_READ_MAX_BYTES', label: 'Max File Read Bytes', group: 'Local Tools', description: 'Maximum bytes returned by a single file_read call (default: 1MB).' },
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { requireRole } from './authz.js';
|
|
2
|
+
|
|
3
|
+
// Authorization for the native folder picker (/api/fs/pick-folder).
|
|
4
|
+
//
|
|
5
|
+
// Plain folder selection is a benign local helper: it opens a native OS dialog
|
|
6
|
+
// and returns the chosen path string, which only fills a form field — it grants
|
|
7
|
+
// no access on its own (project creation and the disk layer enforce allowed
|
|
8
|
+
// roots). So ANY authenticated user may use it; gating it on the org `admin`
|
|
9
|
+
// role wrongly 403s a member/viewer with `insufficient_role`.
|
|
10
|
+
//
|
|
11
|
+
// Registering a Mines import root, by contrast, grants agents access to that
|
|
12
|
+
// root, so that branch stays admin-gated.
|
|
13
|
+
export function assertPickFolderRole(session, registerImportRoot) {
|
|
14
|
+
if (registerImportRoot) requireRole(session, 'admin', session?.org_id);
|
|
15
|
+
}
|
package/lib/realtime-openai.js
CHANGED
|
@@ -28,6 +28,17 @@ export function realtimeConfigured() {
|
|
|
28
28
|
return Boolean(getSecret('OPENAI_API_KEY') || process.env.OPENAI_API_KEY);
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
+
// Transport-only instruction block. In this mode the Realtime model is a
|
|
32
|
+
// dumb microphone+transcriber: it must NOT reason, answer, or call tools.
|
|
33
|
+
// All cognition runs through the main orchestrator stream (same brain as typed
|
|
34
|
+
// chat); the Realtime model only converts speech → text. Output is suppressed
|
|
35
|
+
// server-side via turn_detection.create_response:false, but we also instruct
|
|
36
|
+
// the model explicitly as a belt-and-suspenders guard.
|
|
37
|
+
const TRANSPORT_INSTRUCTIONS =
|
|
38
|
+
'You are a transcription microphone only. Do NOT respond, answer, comment, '
|
|
39
|
+
+ 'or call any tool. Never speak. Your sole job is to let the system capture '
|
|
40
|
+
+ 'the user\'s spoken words as text. Stay silent at all times.';
|
|
41
|
+
|
|
31
42
|
export async function mintOpenAIRealtimeSession(opts = {}) {
|
|
32
43
|
const apiKey = getSecret('OPENAI_API_KEY') || process.env.OPENAI_API_KEY;
|
|
33
44
|
if (!apiKey) throw new Error('OPENAI_API_KEY missing for OpenAI Realtime');
|
|
@@ -35,12 +46,24 @@ export async function mintOpenAIRealtimeSession(opts = {}) {
|
|
|
35
46
|
const model = String(opts.model || getSecret('OPENAI_REALTIME_MODEL') || process.env.OPENAI_REALTIME_MODEL || DEFAULT_REALTIME_MODEL);
|
|
36
47
|
const voice = safeVoice(opts.voice || getSecret('OPENAI_REALTIME_VOICE') || process.env.OPENAI_REALTIME_VOICE);
|
|
37
48
|
|
|
49
|
+
// Transport mode: Realtime is STT-only. The orchestrator (Claude) is the
|
|
50
|
+
// brain; the TTS lane is the mouth. Force no tools + transcribe-only
|
|
51
|
+
// instructions and suppress the model's auto-response. This is the default
|
|
52
|
+
// for the unified voice=main-agent path; pass mode:'realtime' to fall back
|
|
53
|
+
// to the legacy in-browser-brain behaviour.
|
|
54
|
+
const transport = opts.mode === 'transport';
|
|
55
|
+
|
|
38
56
|
// Build the durable Madarx instruction block from project + memory + state
|
|
39
57
|
// unless the caller passed an override. Tools default to the curated voice
|
|
40
58
|
// catalog; callers can pass a custom list (e.g. [] to disable tool calling).
|
|
41
59
|
let instructions = String(opts.instructions || '').trim();
|
|
42
60
|
let tools = Array.isArray(opts.tools) ? opts.tools : null;
|
|
43
|
-
if (
|
|
61
|
+
if (transport) {
|
|
62
|
+
// Transport mode never reasons or acts — ignore any caller-supplied tools
|
|
63
|
+
// and context, and pin the transcribe-only instruction block.
|
|
64
|
+
instructions = TRANSPORT_INSTRUCTIONS;
|
|
65
|
+
tools = [];
|
|
66
|
+
} else if (!instructions || !tools) {
|
|
44
67
|
const ctx = buildVoiceContext({
|
|
45
68
|
project_id: opts.project_id,
|
|
46
69
|
agent_id: opts.agent_id,
|
|
@@ -66,6 +89,31 @@ export async function mintOpenAIRealtimeSession(opts = {}) {
|
|
|
66
89
|
instructions,
|
|
67
90
|
audio: { output: { voice } },
|
|
68
91
|
};
|
|
92
|
+
if (transport) {
|
|
93
|
+
// Enable input transcription so we receive
|
|
94
|
+
// conversation.item.input_audio_transcription.completed events, and turn
|
|
95
|
+
// OFF automatic response generation so the Realtime model stays silent —
|
|
96
|
+
// the orchestrator produces the answer instead.
|
|
97
|
+
session.audio.input = {
|
|
98
|
+
transcription: { model: 'gpt-4o-mini-transcribe' },
|
|
99
|
+
turn_detection: { type: 'server_vad', create_response: false, interrupt_response: false },
|
|
100
|
+
};
|
|
101
|
+
session.output_modalities = ['text'];
|
|
102
|
+
}
|
|
103
|
+
// Reasoning effort is the biggest latency dial on gpt-realtime-2: lower =
|
|
104
|
+
// snappier first audio. session.reasoning.effort accepts minimal|low|medium|
|
|
105
|
+
// high; 'low' is OpenAI's recommended default for production voice agents.
|
|
106
|
+
// Guard on the model name so older realtime models (which reject the field)
|
|
107
|
+
// do not fail the mint.
|
|
108
|
+
if (/realtime-2/.test(model)) {
|
|
109
|
+
const effort = String(
|
|
110
|
+
opts.reasoning_effort
|
|
111
|
+
|| getSecret('OPENAI_REALTIME_REASONING')
|
|
112
|
+
|| process.env.OPENAI_REALTIME_REASONING
|
|
113
|
+
|| 'low',
|
|
114
|
+
);
|
|
115
|
+
session.reasoning = { effort };
|
|
116
|
+
}
|
|
69
117
|
if (Array.isArray(tools) && tools.length) session.tools = tools;
|
|
70
118
|
const body = { session };
|
|
71
119
|
|