madarx 2.17.0 → 2.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +536 -536
- package/.next/standalone/.next/app-path-routes-manifest.json +68 -68
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +15 -15
- package/.next/standalone/.next/react-loadable-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +2 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +4 -4
- package/.next/standalone/.next/server/app/activity/page.js +1 -1
- package/.next/standalone/.next/server/app/activity/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/activity/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/page.js +4 -4
- package/.next/standalone/.next/server/app/admin/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/agents/[id]/page.js +4 -4
- package/.next/standalone/.next/server/app/agents/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/agents/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/agents/page.js +1 -1
- package/.next/standalone/.next/server/app/agents/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/activity/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/audit-export/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/share-links/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-memory/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-runs/[id]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-runs/[id]/events/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-runs/[id]/log/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-runs/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-runs/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[id]/active-run/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[id]/chain/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[id]/memory/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[id]/reports/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[id]/run/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/create/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/ops/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/approvals/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/approvals/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/artifacts/[id]/acl/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/artifacts/[id]/protect/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/artifacts/[id]/raw/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/artifacts/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/artifacts/[id]/share-link/[linkId]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/artifacts/[id]/share-link/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/artifacts/upload/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/audit/list/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/audit/search/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/config/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/join-bootstrap/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/session/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/brand/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/brand/share/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/chat/sessions/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/chat/sessions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/config/env/route.js +1 -1
- package/.next/standalone/.next/server/app/api/config/env/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/config/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/connections/[service]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/connections/[service]/verify/route.js +1 -1
- package/.next/standalone/.next/server/app/api/connections/[service]/verify/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/connections/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/cron/tick/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/dashboard/spaces/[id]/move/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/dashboard/spaces/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/dashboard/spaces/[id]/share-link/[linkId]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/dashboard/spaces/[id]/share-link/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/dashboard/spaces/import/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/dashboard/spaces/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/disk/files/[id]/blob/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/disk/files/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/disk/files/[id]/transcribe/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/disk/files/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/disk/folders/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/events/since/[cursor]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/events/stream/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/fs/create-folder/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/fs/pick-folder/route.js +2 -2
- package/.next/standalone/.next/server/app/api/fs/pick-folder/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/blueprint/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/diagnostic/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/governance/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/interview/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/pilot/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/quarterly/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/setup-package/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/interviews/[id]/responses/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/interviews/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/setup-packages/[id]/apply/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/setup-packages/validate/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/heartbeat/tick/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/heartbeat/worker/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/help/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hermes/jobs/[id]/events/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hermes/jobs/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hermes/jobs/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/integrations/google/callback/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/integrations/google/oauth/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/marketplace/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/marketplace/open-design/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/marketplace/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mines/import-roots/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mines/portfolio/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mines/projects/[id]/chunks/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mines/projects/[id]/diligence/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mines/projects/[id]/import/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mines/projects/[id]/publish/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mines/projects/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/missions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/models/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/onboarding/blueprint/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/onboarding/launch/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orchestrator/command/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orchestrator/stream/route.js +13 -13
- package/.next/standalone/.next/server/app/api/orchestrator/stream/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orchestrator/upload/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/org/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/[id]/invites/[inviteId]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/[id]/invites/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/[id]/members/[userId]/role/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/[id]/members/[userId]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/[id]/members/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/invites/pending/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/join/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/join-complete/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/printing-press/clis/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/printing-press/install/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/printing-press/security-mode/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/privacy/config/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/privacy/verify/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/[id]/share-link/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/[id]/stages/[stageId]/override/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/[id]/stages/[stageId]/retry/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/[id]/stages/[stageId]/submit/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/definitions/[slug]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/definitions/[slug]/settings/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/definitions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/definitions/validate/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/start-and-route/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[slug]/library/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[slug]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/runs/approve-claude-run/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/runs/claude-code-dry-run/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/runs/competitor-report/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/runs/engine-ping/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/runs/marketing-plan/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/schedules/upsert/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/secrets/[name]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/secrets/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/settings/trust-mode/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/share/[token]/otp/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/share/[token]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/share/[token]/verify/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/share/space/[token]/otp/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/share/space/[token]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/share/space/[token]/verify/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/shared/spaces/[id]/acl/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/shared/spaces/publish/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/shared/spaces/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/shared/spaces/status/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/shared/spaces/unpublish/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/state/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/system/update/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/active-run/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/attachments/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/checklist/[itemId]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/checklist/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/checkout/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/children/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/comments/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/events/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/live-runs/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/release/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tool-allowlists/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tool-allowlists/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tool-egress/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tools/[name]/approve/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tools/[name]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tools/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/transcripts/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/voice/providers/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/voice/realtime/context/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/voice/realtime/session/route.js +2 -2
- package/.next/standalone/.next/server/app/api/voice/realtime/session/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/voice/realtime/tool-result/route.js +2 -2
- package/.next/standalone/.next/server/app/api/voice/realtime/tool-result/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/voice/realtime/tools/route.js +1 -1
- package/.next/standalone/.next/server/app/api/voice/realtime/tools/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/voice/tts/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/whatsapp/allowlist/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/whatsapp/disconnect/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/whatsapp/messages/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/whatsapp/qr/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/whatsapp/send/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/whatsapp/status/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/approvals/page.js +2 -2
- package/.next/standalone/.next/server/app/approvals/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/approvals/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/architecture/page.js +1 -1
- package/.next/standalone/.next/server/app/architecture/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/architecture/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/architecture.html +2 -2
- package/.next/standalone/.next/server/app/architecture.rsc +4 -4
- package/.next/standalone/.next/server/app/audit/live/page.js +1 -1
- package/.next/standalone/.next/server/app/audit/live/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/live/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/audit/page.js +1 -1
- package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/brand/page.js +1 -1
- package/.next/standalone/.next/server/app/brand/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/brand/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/brand.html +2 -1
- package/.next/standalone/.next/server/app/brand.rsc +4 -4
- package/.next/standalone/.next/server/app/disk/page.js +1 -1
- package/.next/standalone/.next/server/app/disk/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/disk/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/federated-ai/page.js +1 -1
- package/.next/standalone/.next/server/app/federated-ai/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/federated-ai/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/federated-ai.html +2 -2
- package/.next/standalone/.next/server/app/federated-ai.rsc +4 -4
- package/.next/standalone/.next/server/app/hail/[id]/governance/page.js +1 -1
- package/.next/standalone/.next/server/app/hail/[id]/governance/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/hail/[id]/governance/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/hail/[id]/interview/page.js +1 -1
- package/.next/standalone/.next/server/app/hail/[id]/interview/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/hail/[id]/interview/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/hail/[id]/page.js +1 -1
- package/.next/standalone/.next/server/app/hail/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/hail/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/hail/[id]/setup/page.js +1 -1
- package/.next/standalone/.next/server/app/hail/[id]/setup/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/hail/[id]/setup/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/hail/page.js +2 -2
- package/.next/standalone/.next/server/app/hail/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/hail/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/help/[slug]/page.js +1 -1
- package/.next/standalone/.next/server/app/help/[slug]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/help/[slug]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/help/page.js +1 -1
- package/.next/standalone/.next/server/app/help/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +2 -2
- package/.next/standalone/.next/server/app/index.rsc +5 -5
- package/.next/standalone/.next/server/app/join/page.js +1 -1
- package/.next/standalone/.next/server/app/join/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/join/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/join.html +1 -1
- package/.next/standalone/.next/server/app/join.rsc +4 -4
- package/.next/standalone/.next/server/app/login/page.js +1 -1
- package/.next/standalone/.next/server/app/login/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/marketplace/page.js +4 -4
- package/.next/standalone/.next/server/app/marketplace/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/marketplace/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/mines/[projectId]/page.js +1 -1
- package/.next/standalone/.next/server/app/mines/[projectId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/mines/[projectId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/mines/[projectId]/results/page.js +1 -1
- package/.next/standalone/.next/server/app/mines/[projectId]/results/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/mines/[projectId]/results/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/mines/page.js +1 -1
- package/.next/standalone/.next/server/app/mines/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/mines/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/missions/page.js +2 -2
- package/.next/standalone/.next/server/app/missions/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/missions/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/onboarding/org/page.js +1 -1
- package/.next/standalone/.next/server/app/onboarding/org/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/onboarding/org/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/onboarding/page.js +1 -1
- package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/onboarding.html +2 -2
- package/.next/standalone/.next/server/app/onboarding.rsc +4 -4
- package/.next/standalone/.next/server/app/org/page.js +1 -1
- package/.next/standalone/.next/server/app/org/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/org/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/page.js +5 -5
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/[slug]/log/page.js +1 -1
- package/.next/standalone/.next/server/app/projects/[slug]/log/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/projects/[slug]/log/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/[slug]/page.js +1 -1
- package/.next/standalone/.next/server/app/projects/[slug]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/new/page.js +3 -3
- package/.next/standalone/.next/server/app/projects/new/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/projects/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/new.html +2 -2
- package/.next/standalone/.next/server/app/projects/new.rsc +5 -5
- package/.next/standalone/.next/server/app/projects/page.js +34 -24
- package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/reports/[file]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/reports/page.js +1 -1
- package/.next/standalone/.next/server/app/reports/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/reports/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/runtime/page.js +1 -1
- package/.next/standalone/.next/server/app/runtime/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/runtime/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/schedules/page.js +2 -2
- package/.next/standalone/.next/server/app/schedules/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/schedules/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/account/page.js +1 -1
- package/.next/standalone/.next/server/app/settings/account/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/account/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/advanced/page.js +1 -1
- package/.next/standalone/.next/server/app/settings/advanced/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/advanced/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/appearance/page.js +1 -1
- package/.next/standalone/.next/server/app/settings/appearance/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/appearance/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/brand/page.js +1 -1
- package/.next/standalone/.next/server/app/settings/brand/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/brand/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/brand.html +2 -2
- package/.next/standalone/.next/server/app/settings/brand.rsc +5 -5
- package/.next/standalone/.next/server/app/settings/connectors/page.js +1 -1
- package/.next/standalone/.next/server/app/settings/connectors/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/connectors/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/engines/page.js +1 -1
- package/.next/standalone/.next/server/app/settings/engines/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/engines/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/onboarding/page.js +1 -1
- package/.next/standalone/.next/server/app/settings/onboarding/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/onboarding/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/onboarding.html +2 -2
- package/.next/standalone/.next/server/app/settings/onboarding.rsc +5 -5
- package/.next/standalone/.next/server/app/settings/organization/page.js +2 -2
- package/.next/standalone/.next/server/app/settings/organization/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/organization/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/page.js +1 -1
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/runtime/page.js +1 -1
- package/.next/standalone/.next/server/app/settings/runtime/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/runtime/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/team/page.js +1 -1
- package/.next/standalone/.next/server/app/settings/team/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/team/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/tools/page.js +1 -1
- package/.next/standalone/.next/server/app/settings/tools/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/tools/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings.html +2 -2
- package/.next/standalone/.next/server/app/settings.rsc +5 -5
- package/.next/standalone/.next/server/app/share/[token]/page.js +1 -1
- package/.next/standalone/.next/server/app/share/[token]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/share/[token]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/share/space/[token]/page.js +1 -1
- package/.next/standalone/.next/server/app/share/space/[token]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/share/space/[token]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/tasks/[id]/page.js +2 -2
- package/.next/standalone/.next/server/app/tasks/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/tasks/page.js +2 -2
- package/.next/standalone/.next/server/app/tasks/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/team/[agentId]/page.js +1 -1
- package/.next/standalone/.next/server/app/team/[agentId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/team/[agentId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/team/page.js +1 -1
- package/.next/standalone/.next/server/app/team/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/team/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/tools/page.js +1 -1
- package/.next/standalone/.next/server/app/tools/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/whatsapp/page.js +1 -1
- package/.next/standalone/.next/server/app/whatsapp/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/whatsapp/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/whatsapp.html +2 -2
- package/.next/standalone/.next/server/app/whatsapp.rsc +4 -4
- package/.next/standalone/.next/server/app/workflows/[caseId]/page.js +1 -1
- package/.next/standalone/.next/server/app/workflows/[caseId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/workflows/[caseId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/workflows/new/[caseId]/page.js +1 -1
- package/.next/standalone/.next/server/app/workflows/new/[caseId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/workflows/new/[caseId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/workflows/new/definition/page.js +1 -1
- package/.next/standalone/.next/server/app/workflows/new/definition/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/workflows/new/definition/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/workflows/page.js +1 -1
- package/.next/standalone/.next/server/app/workflows/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/workflows/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/workflows/share/[caseId]/page.js +1 -1
- package/.next/standalone/.next/server/app/workflows/share/[caseId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/workflows/share/[caseId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +68 -68
- package/.next/standalone/.next/server/chunks/1648.js +1 -1
- package/.next/standalone/.next/server/chunks/1699.js +35 -18
- package/.next/standalone/.next/server/chunks/{3806.js → 3379.js} +1 -1
- package/.next/standalone/.next/server/chunks/4804.js +1 -1
- package/.next/standalone/.next/server/chunks/6059.js +1 -1
- package/.next/standalone/.next/server/chunks/{9195.js → 9483.js} +1 -1
- package/.next/standalone/.next/server/functions-config-manifest.json +45 -45
- package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/.next/standalone/.next/server/middleware-manifest.json +5 -5
- package/.next/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/standalone/.next/server/pages/404.html +2 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/static/chunks/494-02cf75066d25e8ac.js +1 -0
- package/.next/standalone/.next/static/chunks/8217.9459315d921fdd61.js +1 -0
- package/.next/{static/chunks/app/agents/[id]/page-e4bcb0ace2900a11.js → standalone/.next/static/chunks/app/agents/[id]/page-fd263522f6c29653.js} +1 -1
- package/.next/{static/chunks/app/agents/page-47a00aa58327a35e.js → standalone/.next/static/chunks/app/agents/page-5860869c305cc54b.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/layout-457acc50d33a5e0e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/login/page-69e66f7316e3aaf2.js +1 -0
- package/.next/standalone/.next/static/chunks/app/marketplace/page-b21a9b2946742aa4.js +1 -0
- package/.next/standalone/.next/static/chunks/app/page-9a013fdb2983cbf4.js +1 -0
- package/.next/standalone/.next/static/chunks/app/projects/page-3d7140091264933a.js +1 -0
- package/.next/standalone/.next/static/chunks/app/settings/layout-fd443bfa8cac181e.js +1 -0
- package/.next/standalone/.next/static/chunks/webpack-e4f2cfb4ad98f256.js +1 -0
- package/.next/standalone/.next/static/css/31fb2fdadf8f1c6b.css +1 -0
- package/.next/standalone/CHANGELOG.md +25 -0
- package/.next/standalone/package.json +1 -1
- package/.next/static/chunks/494-02cf75066d25e8ac.js +1 -0
- package/.next/static/chunks/8217.9459315d921fdd61.js +1 -0
- package/.next/{standalone/.next/static/chunks/app/agents/[id]/page-e4bcb0ace2900a11.js → static/chunks/app/agents/[id]/page-fd263522f6c29653.js} +1 -1
- package/.next/{standalone/.next/static/chunks/app/agents/page-47a00aa58327a35e.js → static/chunks/app/agents/page-5860869c305cc54b.js} +1 -1
- package/.next/static/chunks/app/layout-457acc50d33a5e0e.js +1 -0
- package/.next/static/chunks/app/login/page-69e66f7316e3aaf2.js +1 -0
- package/.next/static/chunks/app/marketplace/page-b21a9b2946742aa4.js +1 -0
- package/.next/static/chunks/app/page-9a013fdb2983cbf4.js +1 -0
- package/.next/static/chunks/app/projects/page-3d7140091264933a.js +1 -0
- package/.next/static/chunks/app/settings/layout-fd443bfa8cac181e.js +1 -0
- package/.next/static/chunks/webpack-e4f2cfb4ad98f256.js +1 -0
- package/.next/static/css/31fb2fdadf8f1c6b.css +1 -0
- package/CHANGELOG.md +25 -0
- package/CLAUDE.md +1 -1
- package/README.md +1 -1
- package/ai-docs/key-constraints.md +9 -1
- package/app/agents/agent-events-bus.js +11 -1
- package/app/api/connections/[service]/verify/route.js +29 -1
- package/app/api/fs/pick-folder/route.js +13 -11
- package/app/api/orchestrator/stream/route.js +92 -9
- package/app/api/voice/realtime/session/route.js +4 -0
- package/app/components/app-topbar.jsx +265 -28
- package/app/components/dashboard/chat-panel.jsx +54 -5
- package/app/components/dashboard/thinking-disclosure.jsx +59 -0
- package/app/components/dashboard/tool-steps.js +9 -0
- package/app/components/dashboard/use-main-agent-stream.js +2 -0
- package/app/components/dashboard/use-realtime-voice.js +33 -5
- package/app/components/dashboard/use-stream-command.js +29 -2
- package/app/components/dashboard/voice-panel.jsx +148 -36
- package/app/components/ui/marketplace/install-toggle.jsx +44 -9
- package/app/globals.css +148 -8
- package/app/login/login-client.jsx +23 -5
- package/app/marketplace/connection-setup-modal.jsx +31 -1
- package/app/marketplace/connection-setup-steps/api-key-step.jsx +20 -3
- package/app/marketplace/install-toast.jsx +1 -1
- package/app/marketplace/marketplace-row.jsx +8 -1
- package/app/marketplace/marketplace-shell.jsx +78 -7
- package/app/marketplace/workflow-card.jsx +2 -1
- package/lib/agent-config.js +7 -0
- package/lib/agent-engines.js +182 -21
- package/lib/auth-config.js +24 -8
- package/lib/claude.js +19 -2
- package/lib/cli/doctor.js +25 -0
- package/lib/connection-seeds.js +1 -1
- package/lib/engine-verbosity.js +42 -0
- package/lib/env-file.js +3 -0
- package/lib/pick-folder-authz.js +15 -0
- package/lib/realtime-openai.js +49 -1
- package/lib/tools/adapters/browser-session.js +37 -8
- package/lib/tools/adapters/github.js +47 -5
- package/lib/tools/adapters/skill-bridge.js +146 -0
- package/lib/tools/registry.js +40 -4
- package/lib/voice/context.js +1 -1
- package/lib/voice/tools.js +34 -2
- package/package.json +1 -1
- package/scripts/migrate-auth-v1.mjs +92 -0
- package/.next/standalone/.next/static/chunks/3054-451abdd7b9afc2ac.js +0 -1
- package/.next/standalone/.next/static/chunks/8217.0beb0a316c7ad5d8.js +0 -1
- package/.next/standalone/.next/static/chunks/app/layout-b7e1918b9125641e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/login/page-d2298bc1803944ae.js +0 -1
- package/.next/standalone/.next/static/chunks/app/marketplace/page-0b7d3a6309302de3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/page-887ef6f96897f78a.js +0 -1
- package/.next/standalone/.next/static/chunks/app/projects/page-739d4cc74824d336.js +0 -1
- package/.next/standalone/.next/static/chunks/app/settings/layout-08f6b30132b26dd1.js +0 -1
- package/.next/standalone/.next/static/chunks/webpack-f916d679fe38a701.js +0 -1
- package/.next/standalone/.next/static/css/2587cd46c922a6d8.css +0 -1
- package/.next/static/chunks/3054-451abdd7b9afc2ac.js +0 -1
- package/.next/static/chunks/8217.0beb0a316c7ad5d8.js +0 -1
- package/.next/static/chunks/app/layout-b7e1918b9125641e.js +0 -1
- package/.next/static/chunks/app/login/page-d2298bc1803944ae.js +0 -1
- package/.next/static/chunks/app/marketplace/page-0b7d3a6309302de3.js +0 -1
- package/.next/static/chunks/app/page-887ef6f96897f78a.js +0 -1
- package/.next/static/chunks/app/projects/page-739d4cc74824d336.js +0 -1
- package/.next/static/chunks/app/settings/layout-08f6b30132b26dd1.js +0 -1
- package/.next/static/chunks/webpack-f916d679fe38a701.js +0 -1
- package/.next/static/css/2587cd46c922a6d8.css +0 -1
- /package/.next/standalone/.next/static/{ZxaTPKGC9lESQlvHfrHgp → -FRz43s1H_LZFhx24FvnL}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{ZxaTPKGC9lESQlvHfrHgp → -FRz43s1H_LZFhx24FvnL}/_ssgManifest.js +0 -0
- /package/.next/static/{ZxaTPKGC9lESQlvHfrHgp → -FRz43s1H_LZFhx24FvnL}/_buildManifest.js +0 -0
- /package/.next/static/{ZxaTPKGC9lESQlvHfrHgp → -FRz43s1H_LZFhx24FvnL}/_ssgManifest.js +0 -0
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { useEffect, useMemo, useState } from 'react';
|
|
3
|
+
import { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';
|
|
4
|
+
import { createPortal } from 'react-dom';
|
|
4
5
|
import { usePathname } from 'next/navigation';
|
|
5
|
-
import { Search, Command } from 'lucide-react';
|
|
6
|
+
import { Search, Command, Activity } from 'lucide-react';
|
|
6
7
|
import { subscribeAgentEvents } from '../agents/agent-events-bus.js';
|
|
8
|
+
import { SpinnerIcon, CheckIcon, StepXIcon } from './dashboard/icons';
|
|
9
|
+
import { toolStepDisplayName, toolStepSublabel } from './dashboard/tool-steps.js';
|
|
7
10
|
|
|
8
11
|
// Pathname prefix → human section label. Longest-prefix wins via order: list
|
|
9
12
|
// more specific paths before their parents.
|
|
@@ -31,35 +34,193 @@ function sectionFor(pathname) {
|
|
|
31
34
|
return hit ? hit[1] : 'madarX';
|
|
32
35
|
}
|
|
33
36
|
|
|
37
|
+
const STEP_CAP = 8; // most recent tool steps kept per agent
|
|
38
|
+
const LINGER_MS = 6000; // keep a finished agent in the list briefly
|
|
39
|
+
const ORPHAN_TTL_MS = 120000; // drop a "running" agent with no activity for 2m
|
|
40
|
+
|
|
41
|
+
// Fold a single live event into the keyed-by-agent activity map. Mirrors the
|
|
42
|
+
// dashboard's use-bg-agents reducer, kept inline here so the global topbar can
|
|
43
|
+
// show background-agent detail on every page from the shared SSE bus.
|
|
44
|
+
function reduceEvent(prev, event) {
|
|
45
|
+
const id = event.agent_id;
|
|
46
|
+
if (!id) return prev;
|
|
47
|
+
const existing = prev[id];
|
|
48
|
+
|
|
49
|
+
switch (event.type) {
|
|
50
|
+
case 'agent_run_start':
|
|
51
|
+
return {
|
|
52
|
+
...prev,
|
|
53
|
+
[id]: {
|
|
54
|
+
agent_id: id,
|
|
55
|
+
agent_name: event.agent_name || id,
|
|
56
|
+
triggered_by: event.triggered_by || null,
|
|
57
|
+
status: 'running',
|
|
58
|
+
started_at: event.ts || Date.now(),
|
|
59
|
+
current_tool: null,
|
|
60
|
+
current_input: null,
|
|
61
|
+
last_activity: event.ts || Date.now(),
|
|
62
|
+
steps: existing?.steps?.slice(-4) ?? [],
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
case 'agent_tool_start': {
|
|
67
|
+
const base = existing || {
|
|
68
|
+
agent_id: id,
|
|
69
|
+
agent_name: event.agent_name || id,
|
|
70
|
+
triggered_by: null,
|
|
71
|
+
status: 'running',
|
|
72
|
+
started_at: Date.now(),
|
|
73
|
+
steps: [],
|
|
74
|
+
};
|
|
75
|
+
const ts = event.ts || Date.now();
|
|
76
|
+
return {
|
|
77
|
+
...prev,
|
|
78
|
+
[id]: {
|
|
79
|
+
...base,
|
|
80
|
+
agent_name: event.agent_name || base.agent_name,
|
|
81
|
+
status: 'running',
|
|
82
|
+
current_tool: event.tool,
|
|
83
|
+
current_input: event.input_summary ?? null,
|
|
84
|
+
last_activity: ts,
|
|
85
|
+
steps: [
|
|
86
|
+
...base.steps,
|
|
87
|
+
{ tool: event.tool, input: event.input_summary ?? null, status: 'running', ts },
|
|
88
|
+
].slice(-STEP_CAP),
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
case 'agent_tool_result': {
|
|
94
|
+
if (!existing) return prev;
|
|
95
|
+
const steps = [...existing.steps];
|
|
96
|
+
for (let i = steps.length - 1; i >= 0; i--) {
|
|
97
|
+
if (steps[i].tool === event.tool && steps[i].status === 'running') {
|
|
98
|
+
steps[i] = { ...steps[i], status: event.isError ? 'error' : 'done' };
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
...prev,
|
|
104
|
+
[id]: { ...existing, current_tool: null, last_activity: event.ts || Date.now(), steps },
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
case 'agent_run_complete':
|
|
109
|
+
if (!existing) return prev;
|
|
110
|
+
return {
|
|
111
|
+
...prev,
|
|
112
|
+
[id]: {
|
|
113
|
+
...existing,
|
|
114
|
+
status: event.isError ? 'failed' : 'complete',
|
|
115
|
+
finished_at: event.ts || Date.now(),
|
|
116
|
+
current_tool: null,
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
default:
|
|
121
|
+
return prev;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
34
125
|
export default function AppTopbar() {
|
|
35
126
|
const pathname = usePathname();
|
|
36
127
|
const section = useMemo(() => sectionFor(pathname), [pathname]);
|
|
37
128
|
|
|
38
|
-
//
|
|
39
|
-
//
|
|
40
|
-
|
|
129
|
+
// Per-agent background activity, keyed by agent id. Fed by the shared SSE bus
|
|
130
|
+
// (same connection the Run buttons use) so the topbar reflects every
|
|
131
|
+
// sub-agent the Main Agent spawns, plus scheduled/heartbeat ticks.
|
|
132
|
+
const [agents, setAgents] = useState({});
|
|
133
|
+
const [open, setOpen] = useState(false);
|
|
134
|
+
const wrapRef = useRef(null);
|
|
41
135
|
|
|
42
136
|
useEffect(() => {
|
|
43
137
|
return subscribeAgentEvents((event) => {
|
|
44
|
-
|
|
45
|
-
if (event.type === 'agent_run_start') {
|
|
46
|
-
setRunningIds((cur) => {
|
|
47
|
-
const next = new Set(cur);
|
|
48
|
-
next.add(event.agent_id);
|
|
49
|
-
return next;
|
|
50
|
-
});
|
|
51
|
-
} else if (event.type === 'agent_run_complete') {
|
|
52
|
-
setRunningIds((cur) => {
|
|
53
|
-
if (!cur.has(event.agent_id)) return cur;
|
|
54
|
-
const next = new Set(cur);
|
|
55
|
-
next.delete(event.agent_id);
|
|
56
|
-
return next;
|
|
57
|
-
});
|
|
58
|
-
}
|
|
138
|
+
setAgents((cur) => reduceEvent(cur, event));
|
|
59
139
|
});
|
|
60
140
|
}, []);
|
|
61
141
|
|
|
62
|
-
|
|
142
|
+
// Sweep: evict finished agents after a short linger, and orphaned "running"
|
|
143
|
+
// agents whose run-complete event we never received.
|
|
144
|
+
useEffect(() => {
|
|
145
|
+
const timer = setInterval(() => {
|
|
146
|
+
const now = Date.now();
|
|
147
|
+
setAgents((cur) => {
|
|
148
|
+
let changed = false;
|
|
149
|
+
const next = {};
|
|
150
|
+
for (const [id, a] of Object.entries(cur)) {
|
|
151
|
+
if (a.status !== 'running') {
|
|
152
|
+
if (a.finished_at && now - a.finished_at > LINGER_MS) { changed = true; continue; }
|
|
153
|
+
} else if ((a.last_activity || a.started_at || 0) < now - ORPHAN_TTL_MS) {
|
|
154
|
+
changed = true; continue;
|
|
155
|
+
}
|
|
156
|
+
next[id] = a;
|
|
157
|
+
}
|
|
158
|
+
return changed ? next : cur;
|
|
159
|
+
});
|
|
160
|
+
}, 4000);
|
|
161
|
+
return () => clearInterval(timer);
|
|
162
|
+
}, []);
|
|
163
|
+
|
|
164
|
+
// The popover renders in a body portal (so it escapes the topbar's
|
|
165
|
+
// backdrop-filter stacking context and paints above canvas artifacts).
|
|
166
|
+
// It's anchored to the button via the button's viewport rect.
|
|
167
|
+
const popRef = useRef(null);
|
|
168
|
+
const [coords, setCoords] = useState(null);
|
|
169
|
+
|
|
170
|
+
useLayoutEffect(() => {
|
|
171
|
+
if (!open) return;
|
|
172
|
+
function reposition() {
|
|
173
|
+
const el = wrapRef.current;
|
|
174
|
+
if (!el) return;
|
|
175
|
+
const r = el.getBoundingClientRect();
|
|
176
|
+
setCoords({ top: Math.round(r.bottom + 8), right: Math.round(window.innerWidth - r.right) });
|
|
177
|
+
}
|
|
178
|
+
reposition();
|
|
179
|
+
window.addEventListener('resize', reposition);
|
|
180
|
+
window.addEventListener('scroll', reposition, true);
|
|
181
|
+
return () => {
|
|
182
|
+
window.removeEventListener('resize', reposition);
|
|
183
|
+
window.removeEventListener('scroll', reposition, true);
|
|
184
|
+
};
|
|
185
|
+
}, [open]);
|
|
186
|
+
|
|
187
|
+
// Close the popover on navigation and on Escape.
|
|
188
|
+
useEffect(() => { setOpen(false); }, [pathname]);
|
|
189
|
+
useEffect(() => {
|
|
190
|
+
if (!open) return;
|
|
191
|
+
function onKey(e) { if (e.key === 'Escape') setOpen(false); }
|
|
192
|
+
function onClick(e) {
|
|
193
|
+
// Outside-click must account for the portaled popover, which lives
|
|
194
|
+
// outside wrapRef in the DOM tree.
|
|
195
|
+
const inTrigger = wrapRef.current && wrapRef.current.contains(e.target);
|
|
196
|
+
const inPop = popRef.current && popRef.current.contains(e.target);
|
|
197
|
+
if (!inTrigger && !inPop) setOpen(false);
|
|
198
|
+
}
|
|
199
|
+
document.addEventListener('keydown', onKey);
|
|
200
|
+
document.addEventListener('mousedown', onClick);
|
|
201
|
+
return () => {
|
|
202
|
+
document.removeEventListener('keydown', onKey);
|
|
203
|
+
document.removeEventListener('mousedown', onClick);
|
|
204
|
+
};
|
|
205
|
+
}, [open]);
|
|
206
|
+
|
|
207
|
+
const list = useMemo(
|
|
208
|
+
() => Object.values(agents).sort((a, b) => (b.started_at || 0) - (a.started_at || 0)),
|
|
209
|
+
[agents],
|
|
210
|
+
);
|
|
211
|
+
const running = list.filter((a) => a.status === 'running');
|
|
212
|
+
const runningCount = running.length;
|
|
213
|
+
|
|
214
|
+
// Pill summary: one agent → name · current tool; many → a count; idle → label
|
|
215
|
+
// that reads as a feature ("Activity") so the control is discoverable even
|
|
216
|
+
// when nothing is running.
|
|
217
|
+
let label = 'Activity';
|
|
218
|
+
if (runningCount === 1) {
|
|
219
|
+
const a = running[0];
|
|
220
|
+
label = a.current_tool ? `${a.agent_name} · ${toolStepDisplayName(a.current_tool)}` : a.agent_name;
|
|
221
|
+
} else if (runningCount > 1) {
|
|
222
|
+
label = `${runningCount} agents running`;
|
|
223
|
+
}
|
|
63
224
|
|
|
64
225
|
function openSearch() {
|
|
65
226
|
if (typeof window !== 'undefined') {
|
|
@@ -81,13 +242,89 @@ export default function AppTopbar() {
|
|
|
81
242
|
there is ONE toolbar instead of two. Empty on every other page. */}
|
|
82
243
|
<div id="app-topbar-slot" className="app-topbar-slot" />
|
|
83
244
|
|
|
84
|
-
<
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
245
|
+
<div className="app-topbar-activity-wrap" ref={wrapRef}>
|
|
246
|
+
<button
|
|
247
|
+
type="button"
|
|
248
|
+
className={`app-topbar-activity is-clickable ${runningCount ? 'is-running' : ''}`}
|
|
249
|
+
title={runningCount ? `${runningCount} agent${runningCount === 1 ? '' : 's'} running — click for details` : 'Background agent activity'}
|
|
250
|
+
onClick={() => setOpen((v) => !v)}
|
|
251
|
+
aria-expanded={open}
|
|
252
|
+
aria-haspopup="dialog"
|
|
253
|
+
>
|
|
254
|
+
<Activity size={12} className="app-topbar-activity-glyph" aria-hidden />
|
|
255
|
+
<span className="app-topbar-dot" aria-hidden />
|
|
256
|
+
<span className="app-topbar-activity-label">{label}</span>
|
|
257
|
+
</button>
|
|
258
|
+
|
|
259
|
+
{open && typeof document !== 'undefined' && createPortal(
|
|
260
|
+
<div
|
|
261
|
+
className="bg-activity-pop"
|
|
262
|
+
role="dialog"
|
|
263
|
+
aria-label="Background agent activity"
|
|
264
|
+
ref={popRef}
|
|
265
|
+
style={coords ? { top: coords.top, right: coords.right } : { visibility: 'hidden' }}
|
|
266
|
+
>
|
|
267
|
+
<div className="bg-activity-head">
|
|
268
|
+
<b>Background agents</b>
|
|
269
|
+
<small>
|
|
270
|
+
{runningCount
|
|
271
|
+
? `${runningCount} working now`
|
|
272
|
+
: list.length
|
|
273
|
+
? 'Recently finished'
|
|
274
|
+
: 'Live view of agents the Main Agent spawns'}
|
|
275
|
+
</small>
|
|
276
|
+
</div>
|
|
277
|
+
{list.length === 0 && (
|
|
278
|
+
<div className="bg-activity-empty">
|
|
279
|
+
<Activity size={18} aria-hidden />
|
|
280
|
+
<span>No background agents active right now.</span>
|
|
281
|
+
<small>When the Main Agent calls a sub-agent, it shows here live.</small>
|
|
282
|
+
</div>
|
|
283
|
+
)}
|
|
284
|
+
<div className="bg-activity-list">
|
|
285
|
+
{list.map((a) => (
|
|
286
|
+
<div key={a.agent_id} className={`bg-activity-agent bg-activity-agent--${a.status}`}>
|
|
287
|
+
<div className="bg-activity-agent-head">
|
|
288
|
+
<span className="bg-activity-agent-icon" aria-hidden>
|
|
289
|
+
{a.status === 'running' && <SpinnerIcon />}
|
|
290
|
+
{a.status === 'complete' && <CheckIcon />}
|
|
291
|
+
{a.status === 'failed' && <StepXIcon />}
|
|
292
|
+
</span>
|
|
293
|
+
<span className="bg-activity-agent-name">{a.agent_name}</span>
|
|
294
|
+
{a.triggered_by && (
|
|
295
|
+
<span className="bg-activity-agent-by">via {a.triggered_by}</span>
|
|
296
|
+
)}
|
|
297
|
+
<span className="bg-activity-agent-status">
|
|
298
|
+
{a.status === 'running'
|
|
299
|
+
? (a.current_tool ? toolStepDisplayName(a.current_tool) : 'working…')
|
|
300
|
+
: a.status === 'complete' ? 'done' : 'failed'}
|
|
301
|
+
</span>
|
|
302
|
+
</div>
|
|
303
|
+
{a.steps.length > 0 && (
|
|
304
|
+
<div className="bg-activity-steps">
|
|
305
|
+
{a.steps.slice(-5).map((s, i) => (
|
|
306
|
+
<div key={i} className={`bg-activity-step bg-activity-step--${s.status}`}>
|
|
307
|
+
<span className="bg-activity-step-icon" aria-hidden>
|
|
308
|
+
{s.status === 'running' && <SpinnerIcon />}
|
|
309
|
+
{s.status === 'done' && <CheckIcon />}
|
|
310
|
+
{s.status === 'error' && <StepXIcon />}
|
|
311
|
+
</span>
|
|
312
|
+
<code className="bg-activity-step-name">{toolStepDisplayName(s.tool)}</code>
|
|
313
|
+
{toolStepSublabel(s.tool, s.input) && (
|
|
314
|
+
<span className="bg-activity-step-sub">{toolStepSublabel(s.tool, s.input)}</span>
|
|
315
|
+
)}
|
|
316
|
+
</div>
|
|
317
|
+
))}
|
|
318
|
+
</div>
|
|
319
|
+
)}
|
|
320
|
+
</div>
|
|
321
|
+
))}
|
|
322
|
+
</div>
|
|
323
|
+
<a className="bg-activity-foot" href="/activity">Open activity log →</a>
|
|
324
|
+
</div>,
|
|
325
|
+
document.body,
|
|
326
|
+
)}
|
|
327
|
+
</div>
|
|
91
328
|
|
|
92
329
|
<button type="button" className="app-topbar-search" onClick={openSearch} aria-label="Open search (Command K)">
|
|
93
330
|
<Search size={13} aria-hidden />
|
|
@@ -3,7 +3,8 @@ import { memo, useCallback, useEffect, useRef, useState } from 'react';
|
|
|
3
3
|
import Markdown from 'react-markdown';
|
|
4
4
|
import remarkGfm from 'remark-gfm';
|
|
5
5
|
import { SpinnerIcon, CheckIcon, StepXIcon, ElapsedTime } from './icons';
|
|
6
|
-
import { toolStepSublabel, toolStepDisplayName } from './tool-steps';
|
|
6
|
+
import { toolStepSublabel, toolStepDisplayName, formatToolDuration } from './tool-steps';
|
|
7
|
+
import { ThinkingDisclosure } from './thinking-disclosure';
|
|
7
8
|
import { useDashboard } from './dashboard-context';
|
|
8
9
|
import { useDraftPersist } from './use-draft-persist';
|
|
9
10
|
|
|
@@ -27,6 +28,29 @@ function formatBytes(n) {
|
|
|
27
28
|
return `${(n / 1024 / 1024).toFixed(1)} MB`;
|
|
28
29
|
}
|
|
29
30
|
|
|
31
|
+
// Whether a streamed agent turn contains HTML artifact markup (a ```html fence,
|
|
32
|
+
// or a raw document the model started emitting). Such content renders on the
|
|
33
|
+
// canvas — it should never type out as raw markup in the chat bubble.
|
|
34
|
+
function hasArtifactMarkup(text) {
|
|
35
|
+
return /```html|<!doctype html|<html[\s>]/i.test(text || '');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Strip artifact markup (and any half-streamed action block) from a streaming
|
|
39
|
+
// preview so the chat shows only the conversational prose. Engine-agnostic
|
|
40
|
+
// safety net — the CLI path already strips server-side, but Anthropic/Ollama
|
|
41
|
+
// deltas pass through here.
|
|
42
|
+
function cleanStreamingPreview(text) {
|
|
43
|
+
if (!text) return '';
|
|
44
|
+
return text
|
|
45
|
+
.replace(/```madarx-action[\s\S]*?```/gi, '')
|
|
46
|
+
.replace(/```madarx-action[\s\S]*$/i, '')
|
|
47
|
+
.replace(/```html[\s\S]*?```/gi, '')
|
|
48
|
+
.replace(/```html[\s\S]*$/i, '')
|
|
49
|
+
.replace(/<!doctype html[\s\S]*$/i, '')
|
|
50
|
+
.replace(/<html[\s>][\s\S]*$/i, '')
|
|
51
|
+
.trim();
|
|
52
|
+
}
|
|
53
|
+
|
|
30
54
|
function ChatPanel() {
|
|
31
55
|
const {
|
|
32
56
|
initializing,
|
|
@@ -63,6 +87,8 @@ function ChatPanel() {
|
|
|
63
87
|
const liveSteps = mainAgent.liveSteps;
|
|
64
88
|
const busyStartTime = mainAgent.busyStartTime;
|
|
65
89
|
const agentPhase = mainAgent.agentPhase;
|
|
90
|
+
const liveThinking = mainAgent.liveThinking;
|
|
91
|
+
const liveStatus = mainAgent.liveStatus;
|
|
66
92
|
const busy = mainAgent.busy;
|
|
67
93
|
const command = mainAgent.command;
|
|
68
94
|
const stop = mainAgent.stop;
|
|
@@ -375,11 +401,25 @@ function ChatPanel() {
|
|
|
375
401
|
</div>
|
|
376
402
|
</div>
|
|
377
403
|
) : chat.map((m, i) => {
|
|
404
|
+
const isAgent = m.role === 'agent';
|
|
405
|
+
// While an agent turn streams, the model may be emitting a full HTML
|
|
406
|
+
// artifact — that belongs on the canvas, not as raw markup typing into the
|
|
407
|
+
// chat bubble. Strip it from the preview; if the turn is artifact-only,
|
|
408
|
+
// show a tasteful "designing" placeholder instead.
|
|
409
|
+
const cleaned = isAgent && m.streaming ? cleanStreamingPreview(m.text) : m.text;
|
|
410
|
+
const building = isAgent && (m.building || (m.streaming && !cleaned && hasArtifactMarkup(m.text)));
|
|
378
411
|
// Empty agent placeholder — never shown. Live activity below covers it.
|
|
379
|
-
if (
|
|
412
|
+
if (isAgent && !cleaned && !building) return null;
|
|
380
413
|
return (
|
|
381
|
-
<div className={'msg ' + m.role + (m.streaming ? ' msg--streaming' : '')} key={i}>
|
|
382
|
-
|
|
414
|
+
<div className={'msg ' + m.role + (m.streaming ? ' msg--streaming' : '') + (building ? ' msg--building' : '')} key={i}>
|
|
415
|
+
{building ? (
|
|
416
|
+
<div className="artifact-building" aria-live="polite">
|
|
417
|
+
<span className="artifact-building-orb" aria-hidden="true" />
|
|
418
|
+
<span className="artifact-building-label">Designing the page<span className="artifact-building-dots"><i>.</i><i>.</i><i>.</i></span></span>
|
|
419
|
+
</div>
|
|
420
|
+
) : (
|
|
421
|
+
<Markdown remarkPlugins={[remarkGfm]}>{cleaned}</Markdown>
|
|
422
|
+
)}
|
|
383
423
|
{Array.isArray(m.attachments) && m.attachments.length > 0 && (
|
|
384
424
|
<div className="msg-attachments">
|
|
385
425
|
{m.attachments.map(a => (
|
|
@@ -396,12 +436,17 @@ function ChatPanel() {
|
|
|
396
436
|
</div>
|
|
397
437
|
);
|
|
398
438
|
})}
|
|
439
|
+
{(busy || (liveThinking && liveThinking.trim())) && (
|
|
440
|
+
<ThinkingDisclosure thinking={liveThinking} status={liveStatus} busy={busy} />
|
|
441
|
+
)}
|
|
399
442
|
{liveSteps.length > 0 && (
|
|
400
443
|
<div className="tool-steps">
|
|
401
444
|
{liveSteps.map(step => {
|
|
402
445
|
const isCli = step.name === 'claude_code_cli' || step.name === 'codex_cli';
|
|
403
446
|
const sub = toolStepSublabel(step.name, step.input);
|
|
404
447
|
const awaiting = step.status === 'awaiting_approval';
|
|
448
|
+
const dur = typeof step.durationMs === 'number' && step.durationMs > 0 ? formatToolDuration(step.durationMs) : null;
|
|
449
|
+
const previewLine = step.preview ? String(step.preview).split('\n').find(l => l.trim()) : null;
|
|
405
450
|
return (
|
|
406
451
|
<div key={step.id} className={`tool-step tool-step--${step.status}` + (isCli ? ' tool-step--cli' : '')}>
|
|
407
452
|
<span className="tool-step-icon" aria-hidden="true">
|
|
@@ -413,6 +458,10 @@ function ChatPanel() {
|
|
|
413
458
|
</span>
|
|
414
459
|
{!isCli && <code className="tool-step-name">{toolStepDisplayName(step.name)}</code>}
|
|
415
460
|
{sub && <span className="tool-step-sub">{sub}</span>}
|
|
461
|
+
{previewLine && step.status === 'done' && (
|
|
462
|
+
<span className="tool-step-preview" title={step.preview}>{previewLine.slice(0, 64)}</span>
|
|
463
|
+
)}
|
|
464
|
+
{dur && !awaiting && <span className="tool-step-dur">{dur}</span>}
|
|
416
465
|
{awaiting && step.approval_id ? (
|
|
417
466
|
<span className="tool-step-approve" style={{ marginLeft: 'auto', display: 'inline-flex', gap: 6 }}>
|
|
418
467
|
<button
|
|
@@ -441,7 +490,7 @@ function ChatPanel() {
|
|
|
441
490
|
)}
|
|
442
491
|
</div>
|
|
443
492
|
)}
|
|
444
|
-
{busy && liveSteps.length === 0 && <div className="typing-indicator"><span /><span /><span /></div>}
|
|
493
|
+
{busy && liveSteps.length === 0 && !liveStatus && !(liveThinking && liveThinking.trim()) && <div className="typing-indicator"><span /><span /><span /></div>}
|
|
445
494
|
</div>
|
|
446
495
|
</section>
|
|
447
496
|
<div
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useEffect, useRef, useState } from 'react';
|
|
3
|
+
|
|
4
|
+
// Engine-agnostic live reasoning + status surface. Streams the model's extended
|
|
5
|
+
// "thinking" into a collapsible panel (Claude-Code-TUI style) and shows a status
|
|
6
|
+
// line with elapsed time so cold-start and long tools never look frozen. Fed by
|
|
7
|
+
// the cli_thinking / cli_status events, which every engine that supports them
|
|
8
|
+
// emits in the same shape.
|
|
9
|
+
|
|
10
|
+
const PHASE_LABELS = {
|
|
11
|
+
starting: 'Starting engine…',
|
|
12
|
+
working: 'Working…',
|
|
13
|
+
generating: 'Composing…',
|
|
14
|
+
thinking: 'Thinking…',
|
|
15
|
+
done: 'Finishing…',
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export function ThinkingDisclosure({ thinking, status, busy }) {
|
|
19
|
+
const [open, setOpen] = useState(false);
|
|
20
|
+
const bodyRef = useRef(null);
|
|
21
|
+
|
|
22
|
+
const hasThinking = Boolean(thinking && thinking.trim());
|
|
23
|
+
|
|
24
|
+
// Keep the streaming reasoning pinned to the latest token while open.
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
if (open && bodyRef.current) bodyRef.current.scrollTop = bodyRef.current.scrollHeight;
|
|
27
|
+
}, [thinking, open]);
|
|
28
|
+
|
|
29
|
+
if (!hasThinking && !busy) return null;
|
|
30
|
+
|
|
31
|
+
const phase = status?.phase;
|
|
32
|
+
const label = PHASE_LABELS[phase] || (hasThinking ? 'Thinking' : 'Working…');
|
|
33
|
+
const elapsed = status?.elapsedMs ? `${Math.round(status.elapsedMs / 1000)}s` : null;
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<div className={'thinking-disclosure' + (open ? ' open' : '')}>
|
|
37
|
+
<button
|
|
38
|
+
type="button"
|
|
39
|
+
className="thinking-toggle"
|
|
40
|
+
onClick={() => hasThinking && setOpen(o => !o)}
|
|
41
|
+
aria-expanded={open}
|
|
42
|
+
disabled={!hasThinking}
|
|
43
|
+
title={hasThinking ? 'Show reasoning' : undefined}
|
|
44
|
+
>
|
|
45
|
+
<span className={'thinking-dot' + (busy ? ' pulsing' : '')} aria-hidden="true" />
|
|
46
|
+
<span className="thinking-label">{label}</span>
|
|
47
|
+
{elapsed && <span className="thinking-elapsed">{elapsed}</span>}
|
|
48
|
+
{hasThinking && (
|
|
49
|
+
<svg className={'thinking-caret' + (open ? ' open' : '')} width="10" height="10" viewBox="0 0 10 10" fill="none" aria-hidden="true">
|
|
50
|
+
<path d="M2 3.5L5 6.5L8 3.5" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
|
|
51
|
+
</svg>
|
|
52
|
+
)}
|
|
53
|
+
</button>
|
|
54
|
+
{open && hasThinking && (
|
|
55
|
+
<div className="thinking-body" ref={bodyRef}>{thinking}</div>
|
|
56
|
+
)}
|
|
57
|
+
</div>
|
|
58
|
+
);
|
|
59
|
+
}
|
|
@@ -28,6 +28,15 @@ function hostname(u) {
|
|
|
28
28
|
try { return new URL(String(u)).hostname; } catch { return String(u).slice(0, 52); }
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
+
// Compact elapsed-time label for a finished tool step (e.g. "820ms", "3.4s", "1m 5s").
|
|
32
|
+
export function formatToolDuration(ms) {
|
|
33
|
+
if (!ms || ms < 0) return null;
|
|
34
|
+
if (ms < 1000) return `${Math.round(ms)}ms`;
|
|
35
|
+
if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;
|
|
36
|
+
const s = Math.round(ms / 1000);
|
|
37
|
+
return `${Math.floor(s / 60)}m ${s % 60}s`;
|
|
38
|
+
}
|
|
39
|
+
|
|
31
40
|
export function toolStepDisplayName(name) {
|
|
32
41
|
if (!name) return '';
|
|
33
42
|
if (CC_DISPLAY_NAMES[name]) return CC_DISPLAY_NAMES[name];
|
|
@@ -16,6 +16,8 @@ export function useMainAgentStream(opts) {
|
|
|
16
16
|
liveSteps: stream.liveSteps,
|
|
17
17
|
busyStartTime: stream.busyStartTime,
|
|
18
18
|
agentPhase: stream.agentPhase,
|
|
19
|
+
liveThinking: stream.liveThinking,
|
|
20
|
+
liveStatus: stream.liveStatus,
|
|
19
21
|
bgAgentList,
|
|
20
22
|
hasBgActivity,
|
|
21
23
|
feedRef: stream.feedRef,
|
|
@@ -24,7 +24,12 @@ function safeJson(text) {
|
|
|
24
24
|
try { return JSON.parse(text); } catch { return null; }
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
// `transport` (default true): Realtime is STT-only. Final user transcripts are
|
|
28
|
+
// handed to `onUserUtterance(text)` and the answer is produced by the main
|
|
29
|
+
// orchestrator (same brain as typed chat), then spoken via the TTS lane. When
|
|
30
|
+
// false, the legacy in-browser-brain path runs (Realtime reasons + calls tools
|
|
31
|
+
// + speaks) for rollback.
|
|
32
|
+
export function useRealtimeVoice({ projectId = null, agentId = 'main', activeSpace = null, allSpaces = null, transport = true, greetingText = '', onUserUtterance, onTranscript } = {}) {
|
|
28
33
|
const [state, setState] = useState(STATE_IDLE);
|
|
29
34
|
const [error, setError] = useState(null);
|
|
30
35
|
const [transcript, setTranscript] = useState([]);
|
|
@@ -186,6 +191,12 @@ export function useRealtimeVoice({ projectId = null, agentId = 'main', activeSpa
|
|
|
186
191
|
case 'conversation.item.input_audio_transcription.completed':
|
|
187
192
|
if (event.transcript) {
|
|
188
193
|
appendTranscript({ role: 'user', text: event.transcript, at: Date.now() });
|
|
194
|
+
// Transport mode: the Realtime model does not answer. Forward the
|
|
195
|
+
// final user utterance to the main orchestrator brain.
|
|
196
|
+
if (transport) {
|
|
197
|
+
const said = String(event.transcript || '').trim();
|
|
198
|
+
if (said) onUserUtterance?.(said);
|
|
199
|
+
}
|
|
189
200
|
}
|
|
190
201
|
break;
|
|
191
202
|
case 'response.created':
|
|
@@ -202,7 +213,9 @@ export function useRealtimeVoice({ projectId = null, agentId = 'main', activeSpa
|
|
|
202
213
|
}
|
|
203
214
|
break;
|
|
204
215
|
case 'response.function_call_arguments.done':
|
|
205
|
-
|
|
216
|
+
// Transport mode has no tools on the Realtime session; ignore any stray
|
|
217
|
+
// function-call event so the brain stays solely with the orchestrator.
|
|
218
|
+
if (!transport) handleToolCall(event);
|
|
206
219
|
break;
|
|
207
220
|
case 'error': {
|
|
208
221
|
const code = event.error?.code || '';
|
|
@@ -220,7 +233,7 @@ export function useRealtimeVoice({ projectId = null, agentId = 'main', activeSpa
|
|
|
220
233
|
default:
|
|
221
234
|
break;
|
|
222
235
|
}
|
|
223
|
-
}, [handleToolCall, onTranscript, sendEvent]);
|
|
236
|
+
}, [handleToolCall, onTranscript, onUserUtterance, sendEvent, transport]);
|
|
224
237
|
|
|
225
238
|
const startAudioLevelMeter = useCallback((stream) => {
|
|
226
239
|
try {
|
|
@@ -278,6 +291,7 @@ export function useRealtimeVoice({ projectId = null, agentId = 'main', activeSpa
|
|
|
278
291
|
speaking_style: speakingStyle,
|
|
279
292
|
active_space: activeSpace,
|
|
280
293
|
all_spaces: allSpaces,
|
|
294
|
+
mode: transport ? 'transport' : 'realtime',
|
|
281
295
|
}),
|
|
282
296
|
});
|
|
283
297
|
if (!mintRes.ok) {
|
|
@@ -318,7 +332,21 @@ export function useRealtimeVoice({ projectId = null, agentId = 'main', activeSpa
|
|
|
318
332
|
const dc = pc.createDataChannel('oai-events');
|
|
319
333
|
dcRef.current = dc;
|
|
320
334
|
dc.onmessage = (event) => handleMessage(event.data);
|
|
321
|
-
dc.onopen = () =>
|
|
335
|
+
dc.onopen = () => {
|
|
336
|
+
setState(STATE_LIVE);
|
|
337
|
+
// Greet on connect. In the legacy (brain) mode the Realtime model can
|
|
338
|
+
// speak it directly via a one-off response.create. In transport mode the
|
|
339
|
+
// model is silent, so the panel handles the greeting via the TTS lane.
|
|
340
|
+
const greet = String(greetingText || '').trim();
|
|
341
|
+
if (greet && !transport) {
|
|
342
|
+
try {
|
|
343
|
+
dc.send(JSON.stringify({
|
|
344
|
+
type: 'response.create',
|
|
345
|
+
response: { instructions: `Greet the operator now, once, briefly and warmly. Say exactly: "${greet}" and nothing else.` },
|
|
346
|
+
}));
|
|
347
|
+
} catch {}
|
|
348
|
+
}
|
|
349
|
+
};
|
|
322
350
|
dc.onclose = () => {
|
|
323
351
|
cleanup();
|
|
324
352
|
setState(STATE_IDLE);
|
|
@@ -349,7 +377,7 @@ export function useRealtimeVoice({ projectId = null, agentId = 'main', activeSpa
|
|
|
349
377
|
setState(STATE_ERROR);
|
|
350
378
|
setError(String(err?.message || err));
|
|
351
379
|
}
|
|
352
|
-
}, [activeSpace, agentId, allSpaces, cleanup, handleMessage, projectId, startAudioLevelMeter, state]);
|
|
380
|
+
}, [activeSpace, agentId, allSpaces, cleanup, greetingText, handleMessage, projectId, startAudioLevelMeter, state, transport]);
|
|
353
381
|
|
|
354
382
|
// Toggle the local mic track without dropping the WebRTC connection. The
|
|
355
383
|
// model still streams audio out (so the user can listen), but their voice
|