madarx 2.12.0 → 2.13.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 +582 -582
- package/.next/standalone/.next/app-path-routes-manifest.json +83 -83
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +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 +3 -3
- package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/agents/[id]/page.js +4 -4
- package/.next/standalone/.next/server/app/agents/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/agents/page.js +1 -1
- package/.next/standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/activity/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/audit-export/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/share-links/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-memory/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-runs/[id]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-runs/[id]/events/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-runs/[id]/log/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-runs/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-runs/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[id]/chain/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[id]/memory/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[id]/reports/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[id]/run/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/create/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/ops/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/approvals/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/approvals/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/artifacts/[id]/acl/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/artifacts/[id]/protect/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/artifacts/[id]/raw/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/artifacts/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/artifacts/[id]/share-link/[linkId]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/artifacts/[id]/share-link/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/artifacts/upload/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/audit/list/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/audit/search/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/config/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/join-bootstrap/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/session/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/brand/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/chat/sessions/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/chat/sessions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/config/env/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/config/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/connections/[service]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/connections/[service]/verify/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/connections/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/cron/tick/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/dashboard/spaces/[id]/move/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/dashboard/spaces/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/dashboard/spaces/[id]/share-link/[linkId]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/dashboard/spaces/[id]/share-link/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/dashboard/spaces/import/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/dashboard/spaces/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/disk/files/[id]/blob/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/disk/files/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/disk/files/[id]/transcribe/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/disk/files/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/disk/folders/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/events/since/[cursor]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/events/stream/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/fs/create-folder/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/fs/pick-folder/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/blueprint/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/diagnostic/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/governance/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/interview/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/pilot/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/quarterly/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/[id]/setup-package/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/engagements/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/interviews/[id]/responses/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/interviews/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/setup-packages/[id]/apply/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hail/setup-packages/validate/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/heartbeat/tick/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/heartbeat/worker/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/help/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hermes/jobs/[id]/events/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hermes/jobs/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/hermes/jobs/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/integrations/google/callback/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/integrations/google/oauth/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/marketplace/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/marketplace/open-design/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/marketplace/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mines/import-roots/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mines/portfolio/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mines/projects/[id]/chunks/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mines/projects/[id]/diligence/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mines/projects/[id]/import/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mines/projects/[id]/publish/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mines/projects/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/missions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/models/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/onboarding/blueprint/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/onboarding/launch/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orchestrator/command/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orchestrator/stream/route.js +12 -12
- package/.next/standalone/.next/server/app/api/orchestrator/stream/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orchestrator/upload/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/org/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/[id]/invites/[inviteId]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/[id]/invites/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/[id]/members/[userId]/role/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/[id]/members/[userId]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/[id]/members/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/invites/pending/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/join/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/join-complete/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/orgs/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/printing-press/clis/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/printing-press/install/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/printing-press/security-mode/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/privacy/config/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/privacy/verify/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/[id]/share-link/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/[id]/stages/[stageId]/override/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/[id]/stages/[stageId]/retry/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/[id]/stages/[stageId]/submit/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/definitions/[slug]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/definitions/[slug]/settings/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/definitions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/definitions/validate/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/start-and-route/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[slug]/library/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[slug]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/runs/approve-claude-run/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/runs/claude-code-dry-run/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/runs/competitor-report/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/runs/engine-ping/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/runs/marketing-plan/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/schedules/upsert/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/secrets/[name]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/secrets/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/settings/trust-mode/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/share/[token]/otp/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/share/[token]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/share/[token]/verify/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/share/space/[token]/otp/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/share/space/[token]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/share/space/[token]/verify/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/shared/spaces/[id]/acl/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/shared/spaces/publish/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/shared/spaces/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/shared/spaces/status/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/shared/spaces/unpublish/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/state/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/system/update/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/active-run/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/attachments/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/checklist/[itemId]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/checklist/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/checkout/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/children/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/comments/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/events/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/live-runs/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/release/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tool-allowlists/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tool-allowlists/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tool-egress/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tools/[name]/approve/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tools/[name]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tools/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/transcripts/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/voice/providers/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/voice/realtime/context/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/voice/realtime/session/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/voice/realtime/tool-result/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/voice/realtime/tools/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/voice/tts/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/whatsapp/allowlist/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/whatsapp/disconnect/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/whatsapp/messages/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/whatsapp/qr/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/whatsapp/send/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/whatsapp/status/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/approvals/page.js +2 -2
- package/.next/standalone/.next/server/app/approvals/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/architecture/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/architecture.html +2 -2
- package/.next/standalone/.next/server/app/architecture.rsc +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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/brand/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/brand.html +1 -1
- package/.next/standalone/.next/server/app/brand.rsc +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_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 +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 +2 -2
- package/.next/standalone/.next/server/app/hail/[id]/interview/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/hail/[id]/page.js +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 +2 -2
- package/.next/standalone/.next/server/app/hail/[id]/setup/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/hail/page.js +2 -2
- package/.next/standalone/.next/server/app/hail/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/help/[slug]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +2 -2
- package/.next/standalone/.next/server/app/index.rsc +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 +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 +2 -2
- package/.next/standalone/.next/server/app/marketplace/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/mines/[projectId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/mines/[projectId]/results/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/mines/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/missions/page.js +1 -1
- package/.next/standalone/.next/server/app/missions/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/onboarding/org/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/onboarding.html +2 -2
- package/.next/standalone/.next/server/app/onboarding.rsc +1 -1
- package/.next/standalone/.next/server/app/org/page.js +1 -1
- package/.next/standalone/.next/server/app/org/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/org/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/[slug]/log/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/new/page.js +1 -1
- package/.next/standalone/.next/server/app/projects/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/new.html +1 -1
- package/.next/standalone/.next/server/app/projects/new.rsc +2 -2
- package/.next/standalone/.next/server/app/projects/page.js +30 -30
- package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/reports/[file]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/reports/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/runtime/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/schedules/page.js +2 -2
- package/.next/standalone/.next/server/app/schedules/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/account/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/advanced/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/appearance/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/brand/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/brand.html +2 -2
- package/.next/standalone/.next/server/app/settings/brand.rsc +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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/onboarding/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/onboarding.html +2 -2
- package/.next/standalone/.next/server/app/settings/onboarding.rsc +1 -1
- package/.next/standalone/.next/server/app/settings/organization/page.js +1 -1
- package/.next/standalone/.next/server/app/settings/organization/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/organization/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/runtime/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/team/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/tools/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings.html +2 -2
- package/.next/standalone/.next/server/app/settings.rsc +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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/tasks/[id]/page.js +1 -1
- package/.next/standalone/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/tasks/page.js +2 -2
- package/.next/standalone/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/team/[agentId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/team/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/whatsapp/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/whatsapp.html +1 -1
- package/.next/standalone/.next/server/app/whatsapp.rsc +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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/workflows/new/definition/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/workflows/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/workflows/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/workflows/share/[caseId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +83 -83
- package/.next/standalone/.next/server/chunks/{8332.js → 1092.js} +1 -1
- package/.next/standalone/.next/server/chunks/1699.js +44 -44
- package/.next/standalone/.next/server/functions-config-manifest.json +46 -46
- 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/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/static/chunks/app/projects/page-2166c214f854766e.js +1 -0
- package/.next/standalone/.next/static/chunks/{webpack-86ee88827adb756d.js → webpack-0cfb048137bd7fce.js} +1 -1
- package/.next/standalone/CHANGELOG.md +21 -0
- package/.next/standalone/data/.artifacts-migrated-v1 +1 -1
- package/.next/standalone/data/.default-project-seeded +1 -1
- package/.next/standalone/data/madarx.sqlite +0 -0
- package/.next/standalone/data/madarx.sqlite-shm +0 -0
- package/.next/standalone/data/madarx.sqlite-wal +0 -0
- package/.next/standalone/package.json +4 -1
- package/.next/standalone/workspace/agents/ops-agent/skills.md +24 -0
- package/.next/standalone/workspace/agents/tool-smith-agent/skills.md +24 -0
- package/.next/static/chunks/app/projects/page-2166c214f854766e.js +1 -0
- package/.next/static/chunks/{webpack-86ee88827adb756d.js → webpack-0cfb048137bd7fce.js} +1 -1
- package/CHANGELOG.md +21 -0
- package/ai-docs/key-constraints.md +5 -0
- package/app/api/orchestrator/stream/route.js +39 -3
- package/lib/agent-engines.js +4 -1
- package/lib/agent-runner.js +24 -0
- package/lib/cli/banner.js +200 -21
- package/lib/cli/run.js +33 -11
- package/lib/cli/splash.js +120 -0
- package/lib/engine-capabilities.js +92 -0
- package/lib/fabricated-tool-output.js +77 -0
- package/lib/marketplace-seeds.js +141 -3
- package/lib/runtime.js +52 -3
- package/lib/seeds.js +5 -1
- package/lib/tools/registry.js +20 -0
- package/package.json +4 -1
- package/scripts/postinstall-splash.mjs +81 -0
- package/scripts/preview-banner.mjs +24 -0
- package/.next/standalone/.next/static/chunks/app/projects/page-e51d5f90e549d669.js +0 -1
- package/.next/static/chunks/app/projects/page-e51d5f90e549d669.js +0 -1
- /package/.next/standalone/.next/static/{61oz5Ag6h45ZPi6uZn01m → cR6E_4o8_rHXujVNesWiZ}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{61oz5Ag6h45ZPi6uZn01m → cR6E_4o8_rHXujVNesWiZ}/_ssgManifest.js +0 -0
- /package/.next/static/{61oz5Ag6h45ZPi6uZn01m → cR6E_4o8_rHXujVNesWiZ}/_buildManifest.js +0 -0
- /package/.next/static/{61oz5Ag6h45ZPi6uZn01m → cR6E_4o8_rHXujVNesWiZ}/_ssgManifest.js +0 -0
package/lib/cli/banner.js
CHANGED
|
@@ -12,16 +12,22 @@
|
|
|
12
12
|
|
|
13
13
|
// ── palette ────────────────────────────────────────────────────────────────
|
|
14
14
|
const PALETTE = {
|
|
15
|
-
mars: [0xc2, 0x45, 0x2a], // brand primary
|
|
15
|
+
mars: [0xc2, 0x45, 0x2a], // brand primary / THE accent
|
|
16
16
|
marsHi: [0xde, 0x6a, 0x53], // lighter mars (top of gradient)
|
|
17
17
|
marsLo: [0x7c, 0x2b, 0x19], // dark mars (bottom of gradient)
|
|
18
18
|
gold: [0xd4, 0xb7, 0x7f],
|
|
19
19
|
sand: [0xf6, 0xf3, 0xed],
|
|
20
20
|
ink: [0x68, 0x70, 0x7b], // "muted" — used for secondary text
|
|
21
21
|
green: [0x4c, 0xae, 0x6a],
|
|
22
|
+
// ── Sovereign-Mono palette (brand-guidelines v1.3) — used by the splash ──
|
|
23
|
+
onyx: [0x0F, 0x0F, 0x11], // ground / black letter fill
|
|
24
|
+
platinum: [0xE8, 0xE8, 0xE5], // mark / wordmark / "done" ✓
|
|
25
|
+
bone: [0xDC, 0xDC, 0xD8], // body labels
|
|
26
|
+
graphite: [0x4A, 0x4A, 0x4D], // rules, borders, pending ·
|
|
27
|
+
muted: [0x8A, 0x82, 0x78], // datelines, subtitle, secondary
|
|
22
28
|
};
|
|
23
29
|
|
|
24
|
-
function colorEnabled() {
|
|
30
|
+
export function colorEnabled() {
|
|
25
31
|
if (process.env.FORCE_COLOR && process.env.FORCE_COLOR !== '0') return true;
|
|
26
32
|
if (process.env.NO_COLOR) return false;
|
|
27
33
|
return Boolean(process.stdout && process.stdout.isTTY);
|
|
@@ -29,32 +35,49 @@ function colorEnabled() {
|
|
|
29
35
|
|
|
30
36
|
const ON = colorEnabled();
|
|
31
37
|
|
|
32
|
-
function fg([r, g, b], s) {
|
|
38
|
+
export function fg([r, g, b], s) {
|
|
33
39
|
if (!ON) return s;
|
|
34
40
|
return `\x1b[38;2;${r};${g};${b}m${s}\x1b[0m`;
|
|
35
41
|
}
|
|
36
|
-
function bold(s) { return ON ? `\x1b[1m${s}\x1b[0m` : s; }
|
|
37
|
-
function dim(s) { return ON ? `\x1b[2m${s}\x1b[0m` : s; }
|
|
42
|
+
export function bold(s) { return ON ? `\x1b[1m${s}\x1b[0m` : s; }
|
|
43
|
+
export function dim(s) { return ON ? `\x1b[2m${s}\x1b[0m` : s; }
|
|
38
44
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
D: ['████ ', '█ █', '█ █', '█ █', '████ '],
|
|
45
|
-
R: ['████ ', '█ █', '████ ', '█ █ ', '█ █'],
|
|
46
|
-
X: ['█ █', ' █ █ ', ' █ ', ' █ █ ', '█ █'],
|
|
47
|
-
};
|
|
45
|
+
/** Visible (printable) length of a string, ignoring ANSI escape sequences. */
|
|
46
|
+
export function visibleLength(s) {
|
|
47
|
+
// eslint-disable-next-line no-control-regex
|
|
48
|
+
return String(s).replace(/\x1b\[[0-9;]*m/g, '').length;
|
|
49
|
+
}
|
|
48
50
|
|
|
49
|
-
|
|
51
|
+
// ── wordmark ─────────────────────────────────────────────────────────────────
|
|
52
|
+
// Embedded figlet "Standard" font art for "madar" + "X", captured offline so the
|
|
53
|
+
// banner stays dependency-free (no figlet at runtime). "madar" renders in Sand,
|
|
54
|
+
// the "X" in Mars — the single brand accent (the X is a permanent constant, so
|
|
55
|
+
// it never counts against the one-Mars-per-surface rule).
|
|
56
|
+
const FIG_MADAR = [
|
|
57
|
+
' _ ',
|
|
58
|
+
' _ __ ___ __ _ __| | __ _ _ __ ',
|
|
59
|
+
" | '_ ` _ \\ / _` |/ _` |/ _` | '__|",
|
|
60
|
+
' | | | | | | (_| | (_| | (_| | | ',
|
|
61
|
+
' |_| |_| |_|\\__,_|\\__,_|\\__,_|_| ',
|
|
62
|
+
' ',
|
|
63
|
+
];
|
|
64
|
+
const FIG_X = [
|
|
65
|
+
' __ __',
|
|
66
|
+
' \\ \\/ /',
|
|
67
|
+
' \\ / ',
|
|
68
|
+
' / \\ ',
|
|
69
|
+
' /_/\\_\\',
|
|
70
|
+
' ',
|
|
71
|
+
];
|
|
50
72
|
|
|
51
|
-
/** The
|
|
52
|
-
function wordmark() {
|
|
53
|
-
const
|
|
73
|
+
/** The "madarX" wordmark as a colored, multi-line string. */
|
|
74
|
+
export function wordmark() {
|
|
75
|
+
const rows = Math.max(FIG_MADAR.length, FIG_X.length);
|
|
54
76
|
const lines = [];
|
|
55
|
-
for (let
|
|
56
|
-
const
|
|
57
|
-
|
|
77
|
+
for (let i = 0; i < rows; i++) {
|
|
78
|
+
const l = FIG_MADAR[i] ?? '';
|
|
79
|
+
const r = FIG_X[i] ?? '';
|
|
80
|
+
lines.push(fg(PALETTE.platinum, l) + fg(PALETTE.mars, r));
|
|
58
81
|
}
|
|
59
82
|
return lines.join('\n');
|
|
60
83
|
}
|
|
@@ -145,4 +168,160 @@ export function renderHeader(title = 'setup', version) {
|
|
|
145
168
|
return out.join('\n');
|
|
146
169
|
}
|
|
147
170
|
|
|
171
|
+
// ── hero banner (Hermes-style: 3D wordmark + orbit mark + grouped catalog) ────
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Hero wordmark — identical to the install splash: the lowercase Standard
|
|
175
|
+
* "madar" (FIG_MADAR, Platinum) beside the Standard "X" (FIG_X, Mars).
|
|
176
|
+
* Returns an array of lines so the hero can indent/compose them.
|
|
177
|
+
*/
|
|
178
|
+
function heroWordmark() {
|
|
179
|
+
return wordmark().split('\n');
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Orbit mark — "madar" (مدار) is Arabic for orbit. Graphite ring, Mars core + bead.
|
|
183
|
+
const ORBIT = [
|
|
184
|
+
' ╭───────╮ ● ',
|
|
185
|
+
' ╭─╯ ╰─╮ ',
|
|
186
|
+
'│ ╲ ╱ │',
|
|
187
|
+
'│ ╳ │',
|
|
188
|
+
'│ ╱ ╲ │',
|
|
189
|
+
' ╰─╮ ╭─╯ ',
|
|
190
|
+
' ╰───────╯ ',
|
|
191
|
+
];
|
|
192
|
+
function orbitMark() {
|
|
193
|
+
return ORBIT.map((line) => {
|
|
194
|
+
let out = '';
|
|
195
|
+
for (const ch of line) {
|
|
196
|
+
if (ch === ' ') out += ' ';
|
|
197
|
+
else if (ch === '╳' || ch === '╲' || ch === '╱' || ch === '●') out += fg(PALETTE.mars, ch);
|
|
198
|
+
else out += fg(PALETTE.graphite, ch);
|
|
199
|
+
}
|
|
200
|
+
return out;
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/** Truncate raw (uncolored) text to a visible width with an ellipsis. */
|
|
205
|
+
function clip(s, width) {
|
|
206
|
+
if (s.length <= width) return s;
|
|
207
|
+
return s.slice(0, Math.max(0, width - 1)) + '…';
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Hermes-style hero banner: a big 3D MADARX wordmark, a titled rule, then a
|
|
212
|
+
* two-column body — orbit mark + runtime meta on the left, a grouped capability
|
|
213
|
+
* catalog (tools by category, then skills) on the right.
|
|
214
|
+
*
|
|
215
|
+
* Dependency-free and DB-free: all inputs are passed in by the caller (the CLI
|
|
216
|
+
* supervisor), so importing this never opens the database.
|
|
217
|
+
*
|
|
218
|
+
* @param {object} info
|
|
219
|
+
* @param {string} info.version
|
|
220
|
+
* @param {string} [info.home] data home path
|
|
221
|
+
* @param {string} [info.url] dashboard URL
|
|
222
|
+
* @param {string} [info.engine] default sub-agent engine
|
|
223
|
+
* @param {string} [info.commit] short git hash (optional)
|
|
224
|
+
* @param {string} [info.session] session id (optional)
|
|
225
|
+
* @param {Array<{category:string,count:number,names:string[]}>} [info.toolCats]
|
|
226
|
+
* @param {number} [info.toolCount]
|
|
227
|
+
* @param {Array<{category:string,count:number,names:string[]}>} [info.skillGroups]
|
|
228
|
+
* @param {number} [info.skillCount]
|
|
229
|
+
* @param {boolean}[info.behind]
|
|
230
|
+
* @param {string} [info.latest]
|
|
231
|
+
* @returns {string}
|
|
232
|
+
*/
|
|
233
|
+
export function renderHeroBanner(info = {}) {
|
|
234
|
+
const {
|
|
235
|
+
version = '0.0.0', home, url,
|
|
236
|
+
commit, session, toolCats = [], toolCount, skillGroups = [], skillCount,
|
|
237
|
+
behind = false, latest,
|
|
238
|
+
} = info;
|
|
239
|
+
|
|
240
|
+
const cols = (process.stdout && process.stdout.columns) || 84;
|
|
241
|
+
const out = [''];
|
|
242
|
+
|
|
243
|
+
// 1) 3D wordmark.
|
|
244
|
+
for (const l of heroWordmark()) out.push(' ' + l);
|
|
245
|
+
out.push('');
|
|
246
|
+
|
|
247
|
+
// 2) Titled rule: ── madarX OS v… · date · commit ─────────
|
|
248
|
+
const stamp = new Date().toISOString().slice(0, 10).replace(/-/g, '.');
|
|
249
|
+
const title = `${bold(fg(PALETTE.platinum, 'madar'))}${bold(fg(PALETTE.mars, 'X'))}${bold(fg(PALETTE.platinum, ' OS'))}`
|
|
250
|
+
+ ` ${fg(PALETTE.mars, 'v' + version)}`
|
|
251
|
+
+ fg(PALETTE.muted, ` · ${stamp}${commit ? ' · ' + commit : ''}`);
|
|
252
|
+
const titleVis = visibleLength(title);
|
|
253
|
+
const railLen = Math.max(3, cols - 4 - titleVis - 3);
|
|
254
|
+
out.push(' ' + fg(PALETTE.graphite, '── ') + title + ' ' + fg(PALETTE.graphite, '─'.repeat(railLen)));
|
|
255
|
+
out.push('');
|
|
256
|
+
|
|
257
|
+
// 3) Two columns. Left: orbit mark + meta. Right: catalog.
|
|
258
|
+
const left = orbitMark();
|
|
259
|
+
const leftMeta = [
|
|
260
|
+
'',
|
|
261
|
+
home ? ' ' + fg(PALETTE.muted, home.replace(process.env.HOME || '~', '~')) : '',
|
|
262
|
+
url ? ' ' + fg(PALETTE.muted, url) : '',
|
|
263
|
+
session ? ' ' + fg(PALETTE.muted, 'session ' + session) : '',
|
|
264
|
+
].filter(Boolean);
|
|
265
|
+
const leftAll = [...left, ...leftMeta];
|
|
266
|
+
// Left column width = its widest line (orbit block or the longer meta lines
|
|
267
|
+
// like the dashboard URL / session id), so the right column never collides
|
|
268
|
+
// with the address/session under the logo.
|
|
269
|
+
const LW = Math.max(...leftAll.map(visibleLength));
|
|
270
|
+
const GAP = 6; // breathing room between the two columns
|
|
271
|
+
|
|
272
|
+
const right = [];
|
|
273
|
+
const rw = Math.max(28, cols - LW - GAP - 2);
|
|
274
|
+
// One "label: a, b, c…" row, clipped to the right column.
|
|
275
|
+
const groupLine = (label, names) => {
|
|
276
|
+
const body = clip(names.join(', '), rw - label.length - 2);
|
|
277
|
+
return `${fg(PALETTE.bone, label + ':')} ${fg(PALETTE.muted, body)}`;
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
right.push(fg(PALETTE.mars, bold('Available Tools')) + fg(PALETTE.muted, toolCount ? ` ${toolCount}` : ''));
|
|
281
|
+
// Feature the toolsets a business agent actually reaches for, in priority
|
|
282
|
+
// order — not raw count. Domain/installable packs (mines, travel,
|
|
283
|
+
// cli_generator, vercel, …) stay in the registry but fold into "more toolsets".
|
|
284
|
+
const FEATURED_TOOL_CATEGORIES = [
|
|
285
|
+
'web', 'email', 'calendar', 'local_machine', 'browser',
|
|
286
|
+
'supabase', 'workflow', 'authoring', 'github', 'voice',
|
|
287
|
+
];
|
|
288
|
+
// Friendly display labels for the slugs that read like internals.
|
|
289
|
+
const TOOL_LABELS = {
|
|
290
|
+
local_machine: 'files', web: 'web', email: 'email', calendar: 'calendar',
|
|
291
|
+
browser: 'browser', supabase: 'data', workflow: 'automations',
|
|
292
|
+
authoring: 'build-tools', github: 'github', voice: 'voice',
|
|
293
|
+
};
|
|
294
|
+
const byName = new Map(toolCats.map((c) => [c.category, c]));
|
|
295
|
+
const featured = FEATURED_TOOL_CATEGORIES.map((n) => byName.get(n)).filter(Boolean);
|
|
296
|
+
const shownCats = featured.slice(0, 8);
|
|
297
|
+
for (const c of shownCats) right.push(groupLine(TOOL_LABELS[c.category] || c.category, c.names));
|
|
298
|
+
const moreCats = toolCats.length - shownCats.length;
|
|
299
|
+
if (moreCats > 0) right.push(fg(PALETTE.muted, `(and ${moreCats} more toolsets…)`));
|
|
300
|
+
|
|
301
|
+
right.push('');
|
|
302
|
+
right.push(fg(PALETTE.mars, bold('Available Skills')) + fg(PALETTE.muted, skillCount ? ` ${skillCount}` : ''));
|
|
303
|
+
// Business-default skills, grouped by category (research, comms, …).
|
|
304
|
+
for (const g of skillGroups) right.push(groupLine(g.category, g.names));
|
|
305
|
+
|
|
306
|
+
// Zip columns.
|
|
307
|
+
const rows = Math.max(leftAll.length, right.length);
|
|
308
|
+
for (let i = 0; i < rows; i++) {
|
|
309
|
+
const l = leftAll[i] ?? '';
|
|
310
|
+
const r = right[i] ?? '';
|
|
311
|
+
const pad = ' '.repeat(Math.max(0, LW - visibleLength(l)));
|
|
312
|
+
out.push(' ' + (l || '') + pad + ' '.repeat(GAP) + r);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// 4) Update status footer + dateline.
|
|
316
|
+
out.push('');
|
|
317
|
+
if (behind && latest) {
|
|
318
|
+
out.push(' ' + fg(PALETTE.mars, '▲') + ' ' + fg(PALETTE.bone, `v${latest} available`) + fg(PALETTE.muted, ' — run ') + fg(PALETTE.mars, 'madarx update'));
|
|
319
|
+
} else {
|
|
320
|
+
out.push(' ' + fg(PALETTE.muted, '● up to date'));
|
|
321
|
+
}
|
|
322
|
+
out.push(' ' + fg(PALETTE.muted, `${stamp} · Designed in UAE · v${version}`));
|
|
323
|
+
out.push('');
|
|
324
|
+
return out.join('\n');
|
|
325
|
+
}
|
|
326
|
+
|
|
148
327
|
export const _palette = PALETTE;
|
package/lib/cli/run.js
CHANGED
|
@@ -17,7 +17,8 @@ import fs from 'node:fs';
|
|
|
17
17
|
import { spawn } from 'node:child_process';
|
|
18
18
|
import { applyHomeEnv } from './home.js';
|
|
19
19
|
import { PKG_ROOT } from './dispatch.js';
|
|
20
|
-
import { renderBanner } from './banner.js';
|
|
20
|
+
import { renderBanner, renderHeroBanner } from './banner.js';
|
|
21
|
+
import { readyPanel } from './splash.js';
|
|
21
22
|
import { readUpdateCheck } from '../update-check.js';
|
|
22
23
|
import { loadProjectEnv } from '../load-env.js';
|
|
23
24
|
|
|
@@ -157,25 +158,39 @@ export async function run({ flags = {} } = {}) {
|
|
|
157
158
|
// Catalog counts: best-effort dynamic import so a count never blocks or
|
|
158
159
|
// breaks boot. These modules build static catalogs at eval time and do NOT
|
|
159
160
|
// open the database, so the supervisor stays DB-free.
|
|
160
|
-
let
|
|
161
|
+
let toolCats = [];
|
|
162
|
+
let toolCount;
|
|
163
|
+
let skillGroups = [];
|
|
164
|
+
let skillCount;
|
|
161
165
|
try {
|
|
162
|
-
const [{ MARKETPLACE_TOOL_COUNT }, seeds] = await Promise.all([
|
|
166
|
+
const [{ MARKETPLACE_TOOL_COUNT, listToolCategories }, seeds] = await Promise.all([
|
|
163
167
|
import('../tools/registry.js'),
|
|
164
168
|
import('../marketplace-seeds.js'),
|
|
165
169
|
]);
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
170
|
+
toolCount = MARKETPLACE_TOOL_COUNT;
|
|
171
|
+
toolCats = listToolCategories();
|
|
172
|
+
// Showcase the business-default skill pack (research, comms, documents,
|
|
173
|
+
// data, web) grouped by category — what most teams need out of the box.
|
|
174
|
+
skillGroups = seeds.listDefaultSkillGroups ? seeds.listDefaultSkillGroups() : [];
|
|
175
|
+
skillCount = (seeds.DEFAULT_SKILL_SLUGS || []).length;
|
|
176
|
+
} catch { /* catalog is optional — banner still renders without it */ }
|
|
169
177
|
const version = pkgVersion() || '0.0.0';
|
|
170
|
-
|
|
178
|
+
const hero = process.env.MADARX_BANNER_LEGACY !== '1';
|
|
179
|
+
const render = hero ? renderHeroBanner : renderBanner;
|
|
180
|
+
console.log(render({
|
|
171
181
|
version,
|
|
172
182
|
home: layout.home,
|
|
173
183
|
url: BASE_URL,
|
|
174
|
-
engine: process.env.MADARX_DEFAULT_ENGINE || 'claude-code
|
|
184
|
+
engine: process.env.MADARX_DEFAULT_ENGINE || 'claude-code',
|
|
185
|
+
commit: process.env.MADARX_COMMIT || undefined,
|
|
175
186
|
latest: ledger?.latest || null,
|
|
176
187
|
behind: Boolean(ledger?.latest && ledger.latest !== version && ledger?.behind),
|
|
177
|
-
|
|
178
|
-
|
|
188
|
+
toolCats,
|
|
189
|
+
toolCount,
|
|
190
|
+
skillGroups,
|
|
191
|
+
skillCount,
|
|
192
|
+
// legacy renderBanner still understands these:
|
|
193
|
+
tools: toolCount,
|
|
179
194
|
}));
|
|
180
195
|
} else {
|
|
181
196
|
log(`data home: ${layout.home}`);
|
|
@@ -213,7 +228,14 @@ export async function run({ flags = {} } = {}) {
|
|
|
213
228
|
// Health gate + browser open run alongside; never block shutdown on them.
|
|
214
229
|
waitForHealth().then((ok) => {
|
|
215
230
|
if (stopping) return;
|
|
216
|
-
if (ok) {
|
|
231
|
+
if (ok) {
|
|
232
|
+
if (!flags.quiet && process.env.MADARX_NO_BANNER !== '1') {
|
|
233
|
+
console.log('\n' + readyPanel({ version: pkgVersion() || undefined, url: BASE_URL }) + '\n');
|
|
234
|
+
} else {
|
|
235
|
+
log(`ready → ${BASE_URL}`);
|
|
236
|
+
}
|
|
237
|
+
openBrowser(BASE_URL, flags);
|
|
238
|
+
}
|
|
217
239
|
else warn(`web tier did not answer on ${BASE_URL} within the timeout — it may still be starting.`);
|
|
218
240
|
});
|
|
219
241
|
});
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branded boot/install splash for the madarX OS CLI.
|
|
3
|
+
*
|
|
4
|
+
* Zero dependencies — node builtins + the ANSI primitives in ./banner.js only —
|
|
5
|
+
* so it is safe to import from the CLI supervisor (lib/cli/run.js) and from the
|
|
6
|
+
* postinstall script (scripts/postinstall-splash.mjs) without pulling in the
|
|
7
|
+
* runtime or opening the database.
|
|
8
|
+
*
|
|
9
|
+
* Look is the brand-guidelines v1.3 "Sovereign-Mono" splash (see preview.svg):
|
|
10
|
+
* the whole step list prints upfront — pending in Graphite, the active step
|
|
11
|
+
* carries the single live Mars spinner, settled steps resolve to a neutral
|
|
12
|
+
* Platinum ✓ (never green, so Mars never repeats on a settled surface). Closes
|
|
13
|
+
* on a Muted dateline. Degrades to a plain auditable record off-TTY.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { _palette as P, fg, bold, dim, wordmark, colorEnabled, visibleLength } from './banner.js';
|
|
17
|
+
|
|
18
|
+
const ON = colorEnabled();
|
|
19
|
+
const isTTY = ON && Boolean(process.stdout && process.stdout.isTTY);
|
|
20
|
+
|
|
21
|
+
// Monospace-safe braille spinner — reads as motion without noise.
|
|
22
|
+
const SPINNER = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
23
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
24
|
+
|
|
25
|
+
const GLYPH = {
|
|
26
|
+
done: fg(P.platinum, '✓'),
|
|
27
|
+
fail: fg(P.mars, '✗'),
|
|
28
|
+
pending: fg(P.graphite, '·'),
|
|
29
|
+
bead: fg(P.mars, '●'),
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// ── cursor hygiene: hide during animation, always restore ─────────────────────
|
|
33
|
+
let cursorHidden = false;
|
|
34
|
+
function hideCursor() { if (isTTY && !cursorHidden) { process.stdout.write('\x1b[?25l'); cursorHidden = true; } }
|
|
35
|
+
function showCursor() { if (cursorHidden) { process.stdout.write('\x1b[?25h'); cursorHidden = false; } }
|
|
36
|
+
process.on('exit', showCursor);
|
|
37
|
+
process.on('SIGINT', () => { showCursor(); process.exit(130); });
|
|
38
|
+
|
|
39
|
+
// A step line at a given state. `state`: 'pending' | 'active' | 'done' | 'fail'.
|
|
40
|
+
function lineFor(label, state, frame) {
|
|
41
|
+
if (state === 'pending') return ` ${GLYPH.pending} ${fg(P.graphite, label)}`;
|
|
42
|
+
if (state === 'active') return ` ${fg(P.mars, frame)} ${fg(P.bone, label)}`;
|
|
43
|
+
if (state === 'fail') return ` ${GLYPH.fail} ${fg(P.bone, label)}`;
|
|
44
|
+
return ` ${GLYPH.done} ${fg(P.bone, label)}`;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Run a list of boot steps, rendered the way preview.svg shows them: the whole
|
|
49
|
+
* list appears at once (pending/Graphite), then each step lights its Mars
|
|
50
|
+
* spinner while its real work runs and resolves to a Platinum ✓.
|
|
51
|
+
*
|
|
52
|
+
* @param {Array<{label: string, work: () => Promise<any>}>} steps
|
|
53
|
+
*/
|
|
54
|
+
export async function bootSequence(steps) {
|
|
55
|
+
if (!isTTY) {
|
|
56
|
+
// CI / piped / NO_COLOR: no animation, just the record an auditor would want.
|
|
57
|
+
for (const s of steps) {
|
|
58
|
+
try { await s.work(); process.stdout.write(lineFor(s.label, 'done') + '\n'); }
|
|
59
|
+
catch { process.stdout.write(lineFor(s.label, 'fail') + '\n'); }
|
|
60
|
+
}
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const n = steps.length;
|
|
65
|
+
hideCursor();
|
|
66
|
+
try {
|
|
67
|
+
// Paint the full list pending, then park the cursor below it.
|
|
68
|
+
for (const s of steps) process.stdout.write(lineFor(s.label, 'pending') + '\n');
|
|
69
|
+
|
|
70
|
+
// Redraw line `i` (0 = top) in place: jump up, clear, write, jump back down.
|
|
71
|
+
const redraw = (i, text) => {
|
|
72
|
+
const up = n - i;
|
|
73
|
+
process.stdout.write(`\x1b[${up}A\r\x1b[2K${text}\r\x1b[${up}B`);
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
for (let i = 0; i < n; i++) {
|
|
77
|
+
const s = steps[i];
|
|
78
|
+
let spinning = true, f = 0;
|
|
79
|
+
const anim = (async () => {
|
|
80
|
+
while (spinning) { redraw(i, lineFor(s.label, 'active', SPINNER[f++ % SPINNER.length])); await sleep(80); }
|
|
81
|
+
})();
|
|
82
|
+
try { await s.work(); spinning = false; await anim; redraw(i, lineFor(s.label, 'done')); }
|
|
83
|
+
catch { spinning = false; await anim; redraw(i, lineFor(s.label, 'fail')); }
|
|
84
|
+
}
|
|
85
|
+
} finally {
|
|
86
|
+
showCursor();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** The dateline rule: a Muted mono `date · place · version` stamp. */
|
|
91
|
+
export function dateline(version, place = 'Designed in UAE') {
|
|
92
|
+
const stamp = new Date().toISOString().slice(0, 10).replace(/-/g, '.');
|
|
93
|
+
const v = version ? ` · v${version}` : '';
|
|
94
|
+
return fg(P.muted, `${stamp} · ${place}${v}`);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// ── optional framed panel (used by `madarx run` ready-state, not the splash) ──
|
|
98
|
+
|
|
99
|
+
/** A framed panel. Graphite border; a single Mars bead leads the headline. */
|
|
100
|
+
export function readyBox(lines) {
|
|
101
|
+
const pad = 2;
|
|
102
|
+
const inner = Math.max(...lines.map(visibleLength)) + pad * 2;
|
|
103
|
+
const top = fg(P.graphite, '╭' + '─'.repeat(inner) + '╮');
|
|
104
|
+
const bot = fg(P.graphite, '╰' + '─'.repeat(inner) + '╯');
|
|
105
|
+
const bar = fg(P.graphite, '│');
|
|
106
|
+
const body = lines.map((l) => {
|
|
107
|
+
const gap = inner - visibleLength(l) - pad * 2;
|
|
108
|
+
return `${bar}${' '.repeat(pad)}${l}${' '.repeat(pad + gap)}${bar}`;
|
|
109
|
+
});
|
|
110
|
+
return [' ' + top, ...body.map((b) => ' ' + b), ' ' + bot].join('\n');
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Standard "ready" panel for a booted instance (the `madarx run` close). */
|
|
114
|
+
export function readyPanel({ version, url } = {}) {
|
|
115
|
+
const head = `${GLYPH.bead} ${bold(fg(P.platinum, 'madarX is ready'))}`;
|
|
116
|
+
const hint = `${fg(P.muted, 'run')} ${fg(P.mars, 'madarx')} ${fg(P.muted, '→ dashboard on')} ${fg(P.bone, url || 'http://127.0.0.1:8787')}`;
|
|
117
|
+
return [readyBox([head, hint]), ' ' + dateline(version)].join('\n');
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export { GLYPH, isTTY as splashIsTTY };
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// Engine capability model — which engines can actually run tools, and whether a
|
|
2
|
+
// given agent's job depends on that.
|
|
3
|
+
//
|
|
4
|
+
// Two tiers:
|
|
5
|
+
// - GOVERNED tool loop: dispatches madarX registry tools through
|
|
6
|
+
// executeRegistryTool (gates, allowlists, audit). Today ONLY `anthropic`
|
|
7
|
+
// (generateTickOutput in lib/agent-runner.js).
|
|
8
|
+
// - REAL tool execution of SOME kind: the CLI agents (`claude-code`, `codex`)
|
|
9
|
+
// run their own native tool runtimes (WebSearch/WebFetch/Write/etc.) in a
|
|
10
|
+
// subprocess, so they do real work even though it isn't the governed madarX
|
|
11
|
+
// toolset.
|
|
12
|
+
//
|
|
13
|
+
// Engines with NEITHER (`ollama`, `hermes`) run a single-shot text completion
|
|
14
|
+
// with NO tool dispatch at all. A Hermes/Nous-template instruct model "satisfies"
|
|
15
|
+
// a tool task by role-playing the whole loop — emitting `<tool_call>` and an
|
|
16
|
+
// invented `<tool_response>` in plain text. Saving that as a deliverable ships
|
|
17
|
+
// fiction as a real result. This module is the single source of truth for the
|
|
18
|
+
// capability check so the runner can fail loudly instead.
|
|
19
|
+
|
|
20
|
+
import { normalizeAgentEngine } from './agent-engines.js';
|
|
21
|
+
import { getEnabledToolSchemasForAgent } from './tools/registry.js';
|
|
22
|
+
|
|
23
|
+
// Engines that run the GOVERNED madarX tool loop end-to-end.
|
|
24
|
+
const GOVERNED_TOOL_LOOP_ENGINES = new Set(['anthropic']);
|
|
25
|
+
|
|
26
|
+
// Engines that execute tools for real in SOME form (governed loop OR a native
|
|
27
|
+
// CLI tool runtime). Engines NOT in this set produce single-shot text only and
|
|
28
|
+
// will fabricate a tool transcript when asked to use tools.
|
|
29
|
+
const TOOL_EXECUTING_ENGINES = new Set(['anthropic', 'claude-code', 'codex']);
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* True when the engine runs the governed madarX tool loop (dispatches registry
|
|
33
|
+
* tools through executeRegistryTool with gates/allowlists/audit).
|
|
34
|
+
*/
|
|
35
|
+
export function engineHasGovernedToolLoop(engine) {
|
|
36
|
+
return GOVERNED_TOOL_LOOP_ENGINES.has(normalizeAgentEngine(engine));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* True when the engine can execute tools for real (governed loop or native CLI
|
|
41
|
+
* runtime). `ollama` / `hermes` return false — they only complete text.
|
|
42
|
+
*/
|
|
43
|
+
export function engineCanExecuteTools(engine) {
|
|
44
|
+
return TOOL_EXECUTING_ENGINES.has(normalizeAgentEngine(engine));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* True when the agent has at least one enabled madarX tool — i.e. its work
|
|
49
|
+
* depends on tools actually running. An agent with zero enabled tools is a
|
|
50
|
+
* pure-reasoning/summarize job and runs fine single-shot on any engine.
|
|
51
|
+
*/
|
|
52
|
+
export function agentNeedsTools(agent) {
|
|
53
|
+
if (!agent?.id) return false;
|
|
54
|
+
try {
|
|
55
|
+
return getEnabledToolSchemasForAgent(agent.id).length > 0;
|
|
56
|
+
} catch {
|
|
57
|
+
// If we can't determine the toolset, do NOT over-block — treat as no tools.
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Assert that `agent` can actually run its job on its selected engine. Throws a
|
|
64
|
+
* tagged error (`code = 'engine_cannot_run_tools'`) when the agent needs tools
|
|
65
|
+
* but the engine cannot execute any (`ollama` / `hermes`). The caller records
|
|
66
|
+
* this as a FAILED run with the remediation message rather than saving a
|
|
67
|
+
* fabricated transcript as a "complete" deliverable.
|
|
68
|
+
*
|
|
69
|
+
* CLI engines (`claude-code` / `codex`) pass this check — they run real tool
|
|
70
|
+
* runtimes — and rely on the fabricated-transcript detector (Layer B) as the
|
|
71
|
+
* backstop on the rare turn they role-play instead of dispatching.
|
|
72
|
+
*
|
|
73
|
+
* @returns {{ needsTools: boolean, engineCanExecuteTools: boolean }}
|
|
74
|
+
*/
|
|
75
|
+
export function assertRunnable(agent) {
|
|
76
|
+
const engine = normalizeAgentEngine(agent?.engine);
|
|
77
|
+
const canExecute = engineCanExecuteTools(engine);
|
|
78
|
+
const needsTools = agentNeedsTools(agent);
|
|
79
|
+
|
|
80
|
+
if (!needsTools || canExecute) {
|
|
81
|
+
return { needsTools, engineCanExecuteTools: canExecute };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const e = new Error(
|
|
85
|
+
`This agent has live tools enabled but its engine (${engine}) cannot run tools — it only completes text, ` +
|
|
86
|
+
`so it would fabricate a tool transcript instead of doing real work. The run was stopped. ` +
|
|
87
|
+
`Fix: switch this agent's engine to "Anthropic API" (governed tools) or "Claude Code" in its Details view.`
|
|
88
|
+
);
|
|
89
|
+
e.code = 'engine_cannot_run_tools';
|
|
90
|
+
e.engine = engine;
|
|
91
|
+
throw e;
|
|
92
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// Detector for FABRICATED tool-call transcripts.
|
|
2
|
+
//
|
|
3
|
+
// Some engines (Hermes/Nous-template instruct models on Ollama, and even the
|
|
4
|
+
// Claude Code CLI when asked to "run an agent") role-play an entire tool loop in
|
|
5
|
+
// PLAIN TEXT instead of dispatching real tools — emitting `<tool_call>` and a
|
|
6
|
+
// hallucinated `<tool_response>` with invented results. Nothing actually runs.
|
|
7
|
+
// If that text is saved verbatim as a deliverable or delivered as a chat answer,
|
|
8
|
+
// the user gets fiction presented as a real result.
|
|
9
|
+
//
|
|
10
|
+
// This module spots that pattern so callers can refuse to deliver/persist it.
|
|
11
|
+
//
|
|
12
|
+
// CRITICAL false-positive guard: a GENUINE report may legitimately *quote*
|
|
13
|
+
// `<tool_call>` inside a fenced code block (e.g. a bug write-up about this very
|
|
14
|
+
// problem). We must only flag the markers when they appear as BARE text — i.e.
|
|
15
|
+
// the model is emitting them as its own turn — never when they sit inside a
|
|
16
|
+
// ``` ``` ``` fence or inline `code` span. We strip fenced/inline code first and
|
|
17
|
+
// only scan what remains.
|
|
18
|
+
|
|
19
|
+
// Remove fenced code blocks (``` ... ``` and ~~~ ... ~~~) and inline `code`
|
|
20
|
+
// spans so quoted tool syntax inside documentation is NOT mistaken for a real
|
|
21
|
+
// (fabricated) emission.
|
|
22
|
+
function stripCodeContext(text) {
|
|
23
|
+
return String(text || '')
|
|
24
|
+
.replace(/```[\s\S]*?```/g, ' ')
|
|
25
|
+
.replace(/~~~[\s\S]*?~~~/g, ' ')
|
|
26
|
+
.replace(/`[^`\n]*`/g, ' ');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Bare `<tool_call>` / `<tool_response>` XML tags (Hermes/Nous chat template).
|
|
30
|
+
const BARE_TOOL_TAG_RE = /<\s*tool_(call|response)\s*>/i;
|
|
31
|
+
|
|
32
|
+
// A bare JSON function-call blob the model wrote as text, e.g.
|
|
33
|
+
// {"name": "web-search", "parameters": { ... }}
|
|
34
|
+
// {"name": "web_fetch", "arguments": { ... }}
|
|
35
|
+
// Hyphenated tool names are an especially strong tell — the real registry uses
|
|
36
|
+
// underscores, so a hyphenated `"name"` call is almost certainly invented.
|
|
37
|
+
const BARE_JSON_CALL_RE = /\{\s*"name"\s*:\s*"[a-z0-9._-]+"\s*,\s*"(parameters|arguments)"\s*:/i;
|
|
38
|
+
|
|
39
|
+
// A fabricated tool RESULT echoed as text — the model inventing what a tool
|
|
40
|
+
// "returned". Pairs with the call markers above to raise confidence.
|
|
41
|
+
const BARE_TOOL_RESULT_RE = /"(snippet|tool_response)"\s*:/i;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* True when `text` looks like a model that role-played a tool loop in plain text
|
|
45
|
+
* (fabricated calls + invented results) rather than dispatching real tools.
|
|
46
|
+
*
|
|
47
|
+
* Conservative by design: requires a bare (non-code-fenced) call marker. Quoting
|
|
48
|
+
* tool syntax inside ``` fences ``` or `inline code` does NOT trip it.
|
|
49
|
+
*/
|
|
50
|
+
export function looksFabricatedToolTranscript(text) {
|
|
51
|
+
const bare = stripCodeContext(text);
|
|
52
|
+
if (!bare.trim()) return false;
|
|
53
|
+
// Primary tell: the Hermes `<tool_call>`/`<tool_response>` XML template.
|
|
54
|
+
if (BARE_TOOL_TAG_RE.test(bare)) return true;
|
|
55
|
+
// Secondary tell: a bare JSON function-call blob. Require a corroborating
|
|
56
|
+
// signal (a second call OR a fabricated result echo) so a single inline JSON
|
|
57
|
+
// object in prose can't false-positive.
|
|
58
|
+
if (BARE_JSON_CALL_RE.test(bare)) {
|
|
59
|
+
const callCount = (bare.match(/\{\s*"name"\s*:\s*"[a-z0-9._-]+"\s*,\s*"(parameters|arguments)"\s*:/gi) || []).length;
|
|
60
|
+
if (callCount >= 2) return true;
|
|
61
|
+
if (BARE_TOOL_RESULT_RE.test(bare)) return true;
|
|
62
|
+
}
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Remove fabricated tool-call / tool-response blocks from text, leaving any
|
|
68
|
+
* genuine prose. Used when we want to salvage a clean message rather than reject
|
|
69
|
+
* the whole turn. Best-effort — primarily strips the bare XML template.
|
|
70
|
+
*/
|
|
71
|
+
export function stripFabricatedToolBlocks(text) {
|
|
72
|
+
return String(text || '')
|
|
73
|
+
// <tool_call> ... </tool_call> (with or without closing tag before EOF)
|
|
74
|
+
.replace(/<\s*tool_call\s*>[\s\S]*?(<\s*\/\s*tool_call\s*>|$)/gi, '')
|
|
75
|
+
.replace(/<\s*tool_response\s*>[\s\S]*?(<\s*\/\s*tool_response\s*>|$)/gi, '')
|
|
76
|
+
.trim();
|
|
77
|
+
}
|