madarx 2.12.1 → 2.14.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 +277 -284
- package/.next/standalone/.next/app-path-routes-manifest.json +67 -68
- package/.next/standalone/.next/build-manifest.json +2 -2
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/routes-manifest.json +0 -6
- 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 +2 -2
- 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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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_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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/processes/start-and-route/route.js.nft.json +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.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 +2 -2
- 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 +3 -3
- 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_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 +2 -2
- 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 +28 -28
- 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 +1 -1
- 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_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 +2 -2
- 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.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_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 +67 -68
- package/.next/standalone/.next/server/chunks/1699.js +28 -28
- package/.next/standalone/.next/server/chunks/5185.js +4 -27
- package/.next/standalone/.next/server/chunks/5257.js +1 -1
- package/.next/standalone/.next/server/chunks/6355.js +1 -0
- package/.next/standalone/.next/server/chunks/{3784.js → 6474.js} +1 -1
- package/.next/standalone/.next/server/functions-config-manifest.json +24 -24
- 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/-LlttjOnKZXGqZXDKcj-4/_buildManifest.js +1 -0
- package/.next/standalone/.next/static/chunks/app/projects/page-09e5c527e3ba83e2.js +1 -0
- package/.next/standalone/.next/static/chunks/app/workflows/[caseId]/page-9949ff1c223e771d.js +1 -0
- package/.next/{static/chunks/app/workflows/page-25cb2c4cb90273a8.js → standalone/.next/static/chunks/app/workflows/page-d0484521369bce4c.js} +1 -1
- package/.next/standalone/CHANGELOG.md +31 -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/lib/process/seeds/specs/mine-project-intake.json +12 -4
- package/.next/standalone/lib/process/seeds/specs/mine-valuation.json +6 -2
- package/.next/standalone/lib/process/stages/policy-dsl-legacy.js +178 -0
- package/.next/standalone/lib/process/stages/policy-gate.js +24 -168
- 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/-LlttjOnKZXGqZXDKcj-4/_buildManifest.js +1 -0
- package/.next/static/chunks/app/projects/page-09e5c527e3ba83e2.js +1 -0
- package/.next/static/chunks/app/workflows/[caseId]/page-9949ff1c223e771d.js +1 -0
- package/.next/{standalone/.next/static/chunks/app/workflows/page-25cb2c4cb90273a8.js → static/chunks/app/workflows/page-d0484521369bce4c.js} +1 -1
- package/CHANGELOG.md +31 -0
- package/ai-docs/process-engine.md +33 -1
- package/app/api/processes/start-and-route/route.js +5 -3
- package/app/workflows/[caseId]/case-detail-client.jsx +2 -2
- package/app/workflows/definition-card.jsx +12 -18
- package/app/workflows/new/[caseId]/page.js +8 -8
- package/app/workflows/page.js +0 -5
- package/app/workflows/share/[caseId]/page.js +0 -1
- package/lib/cli/banner.js +200 -21
- package/lib/cli/run.js +33 -11
- package/lib/cli/splash.js +120 -0
- package/lib/marketplace-seeds.js +141 -3
- package/lib/process/artifacts.js +12 -60
- package/lib/process/engine.js +5 -5
- package/lib/process/policy-predicates.js +116 -0
- package/lib/process/seeds/specs/mine-project-intake.json +12 -4
- package/lib/process/seeds/specs/mine-valuation.json +6 -2
- package/lib/process/spec-validator.js +46 -1
- package/lib/process/stages/policy-dsl-legacy.js +178 -0
- package/lib/process/stages/policy-gate.js +24 -168
- 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/postbuild-standalone.mjs +9 -0
- package/scripts/postinstall-splash.mjs +81 -0
- package/scripts/preview-banner.mjs +24 -0
- package/.next/standalone/.next/server/app/workflows/new/page.js +0 -2
- package/.next/standalone/.next/server/app/workflows/new/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/workflows/new/page_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/static/BTzAhaVl8-xEC5Te-d7Ns/_buildManifest.js +0 -1
- package/.next/standalone/.next/static/chunks/app/projects/page-7b6c6e010183e070.js +0 -1
- package/.next/standalone/.next/static/chunks/app/workflows/[caseId]/page-423e4c194c7f5bf5.js +0 -1
- package/.next/standalone/.next/static/chunks/app/workflows/new/page-1eda41616cbfc4f3.js +0 -1
- package/.next/static/BTzAhaVl8-xEC5Te-d7Ns/_buildManifest.js +0 -1
- package/.next/static/chunks/app/projects/page-7b6c6e010183e070.js +0 -1
- package/.next/static/chunks/app/workflows/[caseId]/page-423e4c194c7f5bf5.js +0 -1
- package/.next/static/chunks/app/workflows/new/page-1eda41616cbfc4f3.js +0 -1
- package/app/workflows/new/new-case-flow.jsx +0 -256
- package/app/workflows/new/page.js +0 -27
- /package/.next/standalone/.next/static/{BTzAhaVl8-xEC5Te-d7Ns → -LlttjOnKZXGqZXDKcj-4}/_ssgManifest.js +0 -0
- /package/.next/static/{BTzAhaVl8-xEC5Te-d7Ns → -LlttjOnKZXGqZXDKcj-4}/_ssgManifest.js +0 -0
|
@@ -116,6 +116,46 @@ function validateAgentRun(stage, errors, prefix, opts, stageSlugs) {
|
|
|
116
116
|
}
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
+
// Predicate operator sets (mirror lib/process/policy-predicates.js).
|
|
120
|
+
const PREDICATE_LOGICAL_OPS = new Set(['and', 'or']);
|
|
121
|
+
const PREDICATE_COMPARE_OPS = new Set(['eq', 'neq', 'lt', 'lte', 'gt', 'gte', 'in', 'nin']);
|
|
122
|
+
const PREDICATE_MAX_DEPTH = 20;
|
|
123
|
+
|
|
124
|
+
// Validate a JSON predicate tree structurally. Mirrors the evaluator so an
|
|
125
|
+
// invalid predicate is rejected at authoring time, not at case run time.
|
|
126
|
+
function validatePredicate(pred, errors, prefix, depth = 0) {
|
|
127
|
+
if (depth > PREDICATE_MAX_DEPTH) {
|
|
128
|
+
pushErr(errors, prefix, 'predicate nesting too deep');
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (!isPlainObject(pred)) {
|
|
132
|
+
pushErr(errors, prefix, 'predicate must be an object');
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const op = pred.op;
|
|
136
|
+
if (PREDICATE_LOGICAL_OPS.has(op)) {
|
|
137
|
+
if (!Array.isArray(pred.rules) || pred.rules.length === 0) {
|
|
138
|
+
pushErr(errors, `${prefix}.rules`, `"${op}" requires a non-empty rules[] array`);
|
|
139
|
+
} else {
|
|
140
|
+
pred.rules.forEach((r, i) => validatePredicate(r, errors, `${prefix}.rules[${i}]`, depth + 1));
|
|
141
|
+
}
|
|
142
|
+
} else if (op === 'not') {
|
|
143
|
+
if (!isPlainObject(pred.rule)) pushErr(errors, `${prefix}.rule`, '"not" requires a rule object');
|
|
144
|
+
else validatePredicate(pred.rule, errors, `${prefix}.rule`, depth + 1);
|
|
145
|
+
} else if (PREDICATE_COMPARE_OPS.has(op)) {
|
|
146
|
+
if (typeof pred.path !== 'string' || !pred.path.trim()) {
|
|
147
|
+
pushErr(errors, `${prefix}.path`, 'required (non-empty string)');
|
|
148
|
+
}
|
|
149
|
+
if (!('value' in pred)) {
|
|
150
|
+
pushErr(errors, `${prefix}.value`, 'required');
|
|
151
|
+
} else if ((op === 'in' || op === 'nin') && !Array.isArray(pred.value)) {
|
|
152
|
+
pushErr(errors, `${prefix}.value`, `"${op}" requires an array value`);
|
|
153
|
+
}
|
|
154
|
+
} else {
|
|
155
|
+
pushErr(errors, `${prefix}.op`, `unknown predicate op "${op}"`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
119
159
|
function validatePolicyGate(stage, errors, prefix) {
|
|
120
160
|
const config = stage.config || {};
|
|
121
161
|
if (!Array.isArray(config.rules) || config.rules.length === 0) {
|
|
@@ -125,13 +165,18 @@ function validatePolicyGate(stage, errors, prefix) {
|
|
|
125
165
|
config.rules.forEach((rule, i) => {
|
|
126
166
|
const rpath = `${prefix}.config.rules[${i}]`;
|
|
127
167
|
if (typeof rule === 'string') {
|
|
168
|
+
// Legacy string DSL (deprecated; accepted one release for migration).
|
|
128
169
|
if (!rule.trim()) pushErr(errors, rpath, 'empty rule expression');
|
|
170
|
+
} else if (isPlainObject(rule) && typeof rule.op === 'string') {
|
|
171
|
+
// JSON predicate (canonical form).
|
|
172
|
+
validatePredicate(rule, errors, rpath);
|
|
129
173
|
} else if (isPlainObject(rule)) {
|
|
174
|
+
// Legacy { expr, label } wrapper.
|
|
130
175
|
if (!rule.expr || typeof rule.expr !== 'string' || !rule.expr.trim()) {
|
|
131
176
|
pushErr(errors, `${rpath}.expr`, 'required (non-empty string)');
|
|
132
177
|
}
|
|
133
178
|
} else {
|
|
134
|
-
pushErr(errors, rpath, 'rule must be a string or { expr, label }
|
|
179
|
+
pushErr(errors, rpath, 'rule must be a JSON predicate, a string, or { expr, label }');
|
|
135
180
|
}
|
|
136
181
|
});
|
|
137
182
|
}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
// lib/process/stages/policy-dsl-legacy.js — DEPRECATED string-expression DSL.
|
|
2
|
+
//
|
|
3
|
+
// The hand-rolled tokenizer/parser kept for ONE release as a back-compat path
|
|
4
|
+
// while string rules migrate to JSON predicates (`../policy-predicates.js`).
|
|
5
|
+
// New workflows must author predicate JSON; the spec-validator accepts both
|
|
6
|
+
// forms for now and the policy_gate handler routes per-rule. Do not extend
|
|
7
|
+
// this grammar — it is on a removal track.
|
|
8
|
+
//
|
|
9
|
+
// Rule grammar:
|
|
10
|
+
// - intake.<field>
|
|
11
|
+
// - prior_stage('<slug>').<field>
|
|
12
|
+
// - Comparison: ==, !=, <, <=, >, >=
|
|
13
|
+
// - Logical: && ||, parens
|
|
14
|
+
// - String literals: 'foo'
|
|
15
|
+
// - Number literals: 1, 0.5
|
|
16
|
+
// - Membership: <left> IN [<lit>, <lit>, ...]
|
|
17
|
+
|
|
18
|
+
function readPath(obj, path) {
|
|
19
|
+
if (!obj || !path) return undefined;
|
|
20
|
+
return path.split('.').reduce((acc, key) => (acc == null ? acc : acc[key]), obj);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function tokenize(expr) {
|
|
24
|
+
const tokens = [];
|
|
25
|
+
let i = 0;
|
|
26
|
+
while (i < expr.length) {
|
|
27
|
+
const ch = expr[i];
|
|
28
|
+
if (/\s/.test(ch)) { i++; continue; }
|
|
29
|
+
if (ch === '(' || ch === ')' || ch === '[' || ch === ']' || ch === ',') {
|
|
30
|
+
tokens.push({ type: ch }); i++; continue;
|
|
31
|
+
}
|
|
32
|
+
if (ch === '&' && expr[i + 1] === '&') { tokens.push({ type: '&&' }); i += 2; continue; }
|
|
33
|
+
if (ch === '|' && expr[i + 1] === '|') { tokens.push({ type: '||' }); i += 2; continue; }
|
|
34
|
+
if (ch === '=' && expr[i + 1] === '=') { tokens.push({ type: 'op', value: '==' }); i += 2; continue; }
|
|
35
|
+
if (ch === '!' && expr[i + 1] === '=') { tokens.push({ type: 'op', value: '!=' }); i += 2; continue; }
|
|
36
|
+
if (ch === '<' && expr[i + 1] === '=') { tokens.push({ type: 'op', value: '<=' }); i += 2; continue; }
|
|
37
|
+
if (ch === '>' && expr[i + 1] === '=') { tokens.push({ type: 'op', value: '>=' }); i += 2; continue; }
|
|
38
|
+
if (ch === '<' || ch === '>') { tokens.push({ type: 'op', value: ch }); i++; continue; }
|
|
39
|
+
if (ch === "'" || ch === '"') {
|
|
40
|
+
const end = expr.indexOf(ch, i + 1);
|
|
41
|
+
if (end === -1) throw new Error(`policy-gate: unterminated string at ${i}`);
|
|
42
|
+
tokens.push({ type: 'string', value: expr.slice(i + 1, end) });
|
|
43
|
+
i = end + 1; continue;
|
|
44
|
+
}
|
|
45
|
+
if (/[0-9.]/.test(ch)) {
|
|
46
|
+
let j = i;
|
|
47
|
+
while (j < expr.length && /[0-9.]/.test(expr[j])) j++;
|
|
48
|
+
tokens.push({ type: 'number', value: Number(expr.slice(i, j)) });
|
|
49
|
+
i = j; continue;
|
|
50
|
+
}
|
|
51
|
+
if (/[A-Za-z_]/.test(ch)) {
|
|
52
|
+
let j = i;
|
|
53
|
+
while (j < expr.length && /[A-Za-z0-9_.]/.test(expr[j])) j++;
|
|
54
|
+
const word = expr.slice(i, j);
|
|
55
|
+
if (word === 'IN' || word === 'in') { tokens.push({ type: 'IN' }); }
|
|
56
|
+
else if (word === 'true') { tokens.push({ type: 'boolean', value: true }); }
|
|
57
|
+
else if (word === 'false') { tokens.push({ type: 'boolean', value: false }); }
|
|
58
|
+
else if (word === 'prior_stage' && expr[j] === '(') {
|
|
59
|
+
// Parse prior_stage('slug').field
|
|
60
|
+
const closeQuote = expr.indexOf(')', j);
|
|
61
|
+
const inner = expr.slice(j + 1, closeQuote).trim().replace(/^['"]|['"]$/g, '');
|
|
62
|
+
let k = closeQuote + 1;
|
|
63
|
+
// Expect .field
|
|
64
|
+
if (expr[k] !== '.') throw new Error("policy-gate: expected '.' after prior_stage(...)");
|
|
65
|
+
let m = k + 1;
|
|
66
|
+
while (m < expr.length && /[A-Za-z0-9_.]/.test(expr[m])) m++;
|
|
67
|
+
tokens.push({ type: 'ref', kind: 'prior_stage', stage: inner, path: expr.slice(k + 1, m) });
|
|
68
|
+
i = m; continue;
|
|
69
|
+
} else {
|
|
70
|
+
tokens.push({ type: 'ref', kind: 'path', path: word });
|
|
71
|
+
}
|
|
72
|
+
i = j; continue;
|
|
73
|
+
}
|
|
74
|
+
throw new Error(`policy-gate: unexpected character "${ch}" at ${i}`);
|
|
75
|
+
}
|
|
76
|
+
return tokens;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function resolveRef(token, ctx) {
|
|
80
|
+
if (token.kind === 'prior_stage') {
|
|
81
|
+
return readPath(ctx.context?.[token.stage], token.path);
|
|
82
|
+
}
|
|
83
|
+
// path like intake.email or stage_output.foo.bar
|
|
84
|
+
if (token.path.startsWith('intake.')) {
|
|
85
|
+
return readPath(ctx.intake, token.path.slice('intake.'.length));
|
|
86
|
+
}
|
|
87
|
+
if (token.path.startsWith('context.')) {
|
|
88
|
+
return readPath(ctx.context, token.path.slice('context.'.length));
|
|
89
|
+
}
|
|
90
|
+
return readPath(ctx, token.path);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function evalTokens(tokens, ctx) {
|
|
94
|
+
// Pratt-ish recursive descent. Grammar:
|
|
95
|
+
// expr := or
|
|
96
|
+
// or := and ('||' and)*
|
|
97
|
+
// and := cmp ('&&' cmp)*
|
|
98
|
+
// cmp := value (op value)?
|
|
99
|
+
// | value IN '[' values ']'
|
|
100
|
+
// value := ref | number | string | boolean | '(' or ')'
|
|
101
|
+
let pos = 0;
|
|
102
|
+
function peek() { return tokens[pos]; }
|
|
103
|
+
function consume(type) {
|
|
104
|
+
const t = tokens[pos];
|
|
105
|
+
if (!t || t.type !== type) throw new Error(`policy-gate: expected ${type}, got ${t?.type || 'EOF'}`);
|
|
106
|
+
pos++;
|
|
107
|
+
return t;
|
|
108
|
+
}
|
|
109
|
+
function value() {
|
|
110
|
+
const t = peek();
|
|
111
|
+
if (!t) throw new Error('policy-gate: unexpected end of expression');
|
|
112
|
+
if (t.type === '(') { pos++; const e = or(); consume(')'); return e; }
|
|
113
|
+
if (t.type === 'number' || t.type === 'string' || t.type === 'boolean') {
|
|
114
|
+
pos++;
|
|
115
|
+
return t.value;
|
|
116
|
+
}
|
|
117
|
+
if (t.type === 'ref') {
|
|
118
|
+
pos++;
|
|
119
|
+
return resolveRef(t, ctx);
|
|
120
|
+
}
|
|
121
|
+
throw new Error(`policy-gate: unexpected token ${t.type}`);
|
|
122
|
+
}
|
|
123
|
+
function cmp() {
|
|
124
|
+
const left = value();
|
|
125
|
+
const t = peek();
|
|
126
|
+
if (!t) return Boolean(left);
|
|
127
|
+
if (t.type === 'op') {
|
|
128
|
+
pos++;
|
|
129
|
+
const right = value();
|
|
130
|
+
switch (t.value) {
|
|
131
|
+
case '==': return left == right; // eslint-disable-line eqeqeq
|
|
132
|
+
case '!=': return left != right; // eslint-disable-line eqeqeq
|
|
133
|
+
case '<': return Number(left) < Number(right);
|
|
134
|
+
case '<=': return Number(left) <= Number(right);
|
|
135
|
+
case '>': return Number(left) > Number(right);
|
|
136
|
+
case '>=': return Number(left) >= Number(right);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (t.type === 'IN') {
|
|
140
|
+
pos++;
|
|
141
|
+
consume('[');
|
|
142
|
+
const list = [];
|
|
143
|
+
while (peek() && peek().type !== ']') {
|
|
144
|
+
const v = value();
|
|
145
|
+
list.push(v);
|
|
146
|
+
if (peek() && peek().type === ',') pos++;
|
|
147
|
+
}
|
|
148
|
+
consume(']');
|
|
149
|
+
return list.includes(left);
|
|
150
|
+
}
|
|
151
|
+
return Boolean(left);
|
|
152
|
+
}
|
|
153
|
+
function and() {
|
|
154
|
+
let left = cmp();
|
|
155
|
+
while (peek() && peek().type === '&&') { pos++; const right = cmp(); left = Boolean(left) && Boolean(right); }
|
|
156
|
+
return left;
|
|
157
|
+
}
|
|
158
|
+
function or() {
|
|
159
|
+
let left = and();
|
|
160
|
+
while (peek() && peek().type === '||') { pos++; const right = and(); left = Boolean(left) || Boolean(right); }
|
|
161
|
+
return left;
|
|
162
|
+
}
|
|
163
|
+
const result = or();
|
|
164
|
+
if (pos !== tokens.length) throw new Error(`policy-gate: unexpected trailing token at ${pos}`);
|
|
165
|
+
return result;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// DEPRECATED — evaluate a legacy string-DSL rule. Returns { result, error }.
|
|
169
|
+
export function evaluateRule(rule, { intake, context }) {
|
|
170
|
+
if (!rule || typeof rule !== 'string') return { result: true, error: null };
|
|
171
|
+
try {
|
|
172
|
+
const tokens = tokenize(rule);
|
|
173
|
+
const result = Boolean(evalTokens(tokens, { intake, context }));
|
|
174
|
+
return { result, error: null };
|
|
175
|
+
} catch (err) {
|
|
176
|
+
return { result: false, error: err?.message || String(err) };
|
|
177
|
+
}
|
|
178
|
+
}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
// lib/process/stages/policy-gate.js — handler for policy_gate stages.
|
|
2
2
|
//
|
|
3
3
|
// Evaluates declarative rules against the case's intake + accumulated context.
|
|
4
|
-
//
|
|
5
|
-
// -
|
|
6
|
-
// -
|
|
7
|
-
//
|
|
8
|
-
// -
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
// - Membership: <left> IN [<lit>, <lit>, ...]
|
|
4
|
+
// Each entry in `config.rules` is one of:
|
|
5
|
+
// - a JSON predicate → `../policy-predicates.js` (the canonical form)
|
|
6
|
+
// - a string expression → legacy DSL (`./policy-dsl-legacy.js`, deprecated,
|
|
7
|
+
// kept one release for back-compat; routed per-rule)
|
|
8
|
+
// - { expr, label } → legacy DSL wrapper
|
|
9
|
+
//
|
|
10
|
+
// All rules must pass (implicit AND across the array) for the gate to pass.
|
|
12
11
|
//
|
|
13
12
|
// Outcomes:
|
|
14
13
|
// - rules all pass → kind=pass
|
|
@@ -17,166 +16,25 @@
|
|
|
17
16
|
// downstream human_approval handles this)
|
|
18
17
|
|
|
19
18
|
import { createApprovalRequest } from '../../approvals.js';
|
|
19
|
+
import { evaluatePredicateSafe, isPredicateRule, describePredicate } from '../policy-predicates.js';
|
|
20
|
+
import { evaluateRule } from './policy-dsl-legacy.js';
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function tokenize(expr) {
|
|
27
|
-
const tokens = [];
|
|
28
|
-
let i = 0;
|
|
29
|
-
while (i < expr.length) {
|
|
30
|
-
const ch = expr[i];
|
|
31
|
-
if (/\s/.test(ch)) { i++; continue; }
|
|
32
|
-
if (ch === '(' || ch === ')' || ch === '[' || ch === ']' || ch === ',') {
|
|
33
|
-
tokens.push({ type: ch }); i++; continue;
|
|
34
|
-
}
|
|
35
|
-
if (ch === '&' && expr[i + 1] === '&') { tokens.push({ type: '&&' }); i += 2; continue; }
|
|
36
|
-
if (ch === '|' && expr[i + 1] === '|') { tokens.push({ type: '||' }); i += 2; continue; }
|
|
37
|
-
if (ch === '=' && expr[i + 1] === '=') { tokens.push({ type: 'op', value: '==' }); i += 2; continue; }
|
|
38
|
-
if (ch === '!' && expr[i + 1] === '=') { tokens.push({ type: 'op', value: '!=' }); i += 2; continue; }
|
|
39
|
-
if (ch === '<' && expr[i + 1] === '=') { tokens.push({ type: 'op', value: '<=' }); i += 2; continue; }
|
|
40
|
-
if (ch === '>' && expr[i + 1] === '=') { tokens.push({ type: 'op', value: '>=' }); i += 2; continue; }
|
|
41
|
-
if (ch === '<' || ch === '>') { tokens.push({ type: 'op', value: ch }); i++; continue; }
|
|
42
|
-
if (ch === "'" || ch === '"') {
|
|
43
|
-
const end = expr.indexOf(ch, i + 1);
|
|
44
|
-
if (end === -1) throw new Error(`policy-gate: unterminated string at ${i}`);
|
|
45
|
-
tokens.push({ type: 'string', value: expr.slice(i + 1, end) });
|
|
46
|
-
i = end + 1; continue;
|
|
47
|
-
}
|
|
48
|
-
if (/[0-9.]/.test(ch)) {
|
|
49
|
-
let j = i;
|
|
50
|
-
while (j < expr.length && /[0-9.]/.test(expr[j])) j++;
|
|
51
|
-
tokens.push({ type: 'number', value: Number(expr.slice(i, j)) });
|
|
52
|
-
i = j; continue;
|
|
53
|
-
}
|
|
54
|
-
if (/[A-Za-z_]/.test(ch)) {
|
|
55
|
-
let j = i;
|
|
56
|
-
while (j < expr.length && /[A-Za-z0-9_.]/.test(expr[j])) j++;
|
|
57
|
-
const word = expr.slice(i, j);
|
|
58
|
-
if (word === 'IN' || word === 'in') { tokens.push({ type: 'IN' }); }
|
|
59
|
-
else if (word === 'true') { tokens.push({ type: 'boolean', value: true }); }
|
|
60
|
-
else if (word === 'false') { tokens.push({ type: 'boolean', value: false }); }
|
|
61
|
-
else if (word === 'prior_stage' && expr[j] === '(') {
|
|
62
|
-
// Parse prior_stage('slug').field
|
|
63
|
-
const closeQuote = expr.indexOf(')', j);
|
|
64
|
-
const inner = expr.slice(j + 1, closeQuote).trim().replace(/^['"]|['"]$/g, '');
|
|
65
|
-
let k = closeQuote + 1;
|
|
66
|
-
// Expect .field
|
|
67
|
-
if (expr[k] !== '.') throw new Error("policy-gate: expected '.' after prior_stage(...)");
|
|
68
|
-
let m = k + 1;
|
|
69
|
-
while (m < expr.length && /[A-Za-z0-9_.]/.test(expr[m])) m++;
|
|
70
|
-
tokens.push({ type: 'ref', kind: 'prior_stage', stage: inner, path: expr.slice(k + 1, m) });
|
|
71
|
-
i = m; continue;
|
|
72
|
-
} else {
|
|
73
|
-
tokens.push({ type: 'ref', kind: 'path', path: word });
|
|
74
|
-
}
|
|
75
|
-
i = j; continue;
|
|
76
|
-
}
|
|
77
|
-
throw new Error(`policy-gate: unexpected character "${ch}" at ${i}`);
|
|
78
|
-
}
|
|
79
|
-
return tokens;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
function resolveRef(token, ctx) {
|
|
83
|
-
if (token.kind === 'prior_stage') {
|
|
84
|
-
return readPath(ctx.context?.[token.stage], token.path);
|
|
85
|
-
}
|
|
86
|
-
// path like intake.email or stage_output.foo.bar
|
|
87
|
-
if (token.path.startsWith('intake.')) {
|
|
88
|
-
return readPath(ctx.intake, token.path.slice('intake.'.length));
|
|
89
|
-
}
|
|
90
|
-
if (token.path.startsWith('context.')) {
|
|
91
|
-
return readPath(ctx.context, token.path.slice('context.'.length));
|
|
92
|
-
}
|
|
93
|
-
return readPath(ctx, token.path);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
function evalTokens(tokens, ctx) {
|
|
97
|
-
// Pratt-ish recursive descent. Grammar:
|
|
98
|
-
// expr := or
|
|
99
|
-
// or := and ('||' and)*
|
|
100
|
-
// and := cmp ('&&' cmp)*
|
|
101
|
-
// cmp := value (op value)?
|
|
102
|
-
// | value IN '[' values ']'
|
|
103
|
-
// value := ref | number | string | boolean | '(' or ')'
|
|
104
|
-
let pos = 0;
|
|
105
|
-
function peek() { return tokens[pos]; }
|
|
106
|
-
function consume(type) {
|
|
107
|
-
const t = tokens[pos];
|
|
108
|
-
if (!t || t.type !== type) throw new Error(`policy-gate: expected ${type}, got ${t?.type || 'EOF'}`);
|
|
109
|
-
pos++;
|
|
110
|
-
return t;
|
|
111
|
-
}
|
|
112
|
-
function value() {
|
|
113
|
-
const t = peek();
|
|
114
|
-
if (!t) throw new Error('policy-gate: unexpected end of expression');
|
|
115
|
-
if (t.type === '(') { pos++; const e = or(); consume(')'); return e; }
|
|
116
|
-
if (t.type === 'number' || t.type === 'string' || t.type === 'boolean') {
|
|
117
|
-
pos++;
|
|
118
|
-
return t.value;
|
|
119
|
-
}
|
|
120
|
-
if (t.type === 'ref') {
|
|
121
|
-
pos++;
|
|
122
|
-
return resolveRef(t, ctx);
|
|
123
|
-
}
|
|
124
|
-
throw new Error(`policy-gate: unexpected token ${t.type}`);
|
|
125
|
-
}
|
|
126
|
-
function cmp() {
|
|
127
|
-
const left = value();
|
|
128
|
-
const t = peek();
|
|
129
|
-
if (!t) return Boolean(left);
|
|
130
|
-
if (t.type === 'op') {
|
|
131
|
-
pos++;
|
|
132
|
-
const right = value();
|
|
133
|
-
switch (t.value) {
|
|
134
|
-
case '==': return left == right; // eslint-disable-line eqeqeq
|
|
135
|
-
case '!=': return left != right; // eslint-disable-line eqeqeq
|
|
136
|
-
case '<': return Number(left) < Number(right);
|
|
137
|
-
case '<=': return Number(left) <= Number(right);
|
|
138
|
-
case '>': return Number(left) > Number(right);
|
|
139
|
-
case '>=': return Number(left) >= Number(right);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
if (t.type === 'IN') {
|
|
143
|
-
pos++;
|
|
144
|
-
consume('[');
|
|
145
|
-
const list = [];
|
|
146
|
-
while (peek() && peek().type !== ']') {
|
|
147
|
-
const v = value();
|
|
148
|
-
list.push(v);
|
|
149
|
-
if (peek() && peek().type === ',') pos++;
|
|
150
|
-
}
|
|
151
|
-
consume(']');
|
|
152
|
-
return list.includes(left);
|
|
153
|
-
}
|
|
154
|
-
return Boolean(left);
|
|
155
|
-
}
|
|
156
|
-
function and() {
|
|
157
|
-
let left = cmp();
|
|
158
|
-
while (peek() && peek().type === '&&') { pos++; const right = cmp(); left = Boolean(left) && Boolean(right); }
|
|
159
|
-
return left;
|
|
160
|
-
}
|
|
161
|
-
function or() {
|
|
162
|
-
let left = and();
|
|
163
|
-
while (peek() && peek().type === '||') { pos++; const right = and(); left = Boolean(left) || Boolean(right); }
|
|
164
|
-
return left;
|
|
165
|
-
}
|
|
166
|
-
const result = or();
|
|
167
|
-
if (pos !== tokens.length) throw new Error(`policy-gate: unexpected trailing token at ${pos}`);
|
|
168
|
-
return result;
|
|
169
|
-
}
|
|
22
|
+
// Re-exported for back-compat: tests and any callers still importing the
|
|
23
|
+
// legacy string-DSL evaluator from this module keep working during the
|
|
24
|
+
// deprecation window.
|
|
25
|
+
export { evaluateRule };
|
|
170
26
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
const result =
|
|
176
|
-
return { result, error:
|
|
177
|
-
} catch (err) {
|
|
178
|
-
return { result: false, error: err?.message || String(err) };
|
|
27
|
+
// Evaluate one rule entry — predicate JSON or legacy string — returning a
|
|
28
|
+
// uniform { result, error, label } record for the trace.
|
|
29
|
+
function evaluateRuleEntry(rule, ctx) {
|
|
30
|
+
if (isPredicateRule(rule)) {
|
|
31
|
+
const { result, error } = evaluatePredicateSafe(rule, ctx);
|
|
32
|
+
return { result, error, label: rule.label || describePredicate(rule) };
|
|
179
33
|
}
|
|
34
|
+
const expr = typeof rule === 'string' ? rule : rule?.expr;
|
|
35
|
+
const label = typeof rule === 'string' ? rule : (rule?.label || rule?.expr);
|
|
36
|
+
const { result, error } = evaluateRule(expr, ctx);
|
|
37
|
+
return { result, error, label };
|
|
180
38
|
}
|
|
181
39
|
|
|
182
40
|
export async function executeStage({ case: c, stage }) {
|
|
@@ -187,9 +45,7 @@ export async function executeStage({ case: c, stage }) {
|
|
|
187
45
|
const trace = [];
|
|
188
46
|
let allPass = true;
|
|
189
47
|
for (const rule of rules) {
|
|
190
|
-
const
|
|
191
|
-
const label = typeof rule === 'string' ? rule : (rule?.label || rule?.expr);
|
|
192
|
-
const { result, error } = evaluateRule(expr, { intake, context });
|
|
48
|
+
const { result, error, label } = evaluateRuleEntry(rule, { intake, context });
|
|
193
49
|
trace.push({ rule: label, result, error });
|
|
194
50
|
if (!result) allPass = false;
|
|
195
51
|
}
|
package/lib/runtime.js
CHANGED
|
@@ -13,6 +13,7 @@ import { defaultModelForEngine, normalizeAgentEngine } from './agent-engines.js'
|
|
|
13
13
|
import { DEFAULT_PROJECT_ID, appendProjectChangelog, getProject } from './projects.js';
|
|
14
14
|
import { listActivity, listTasks, reportingSnapshot } from './delegation.js';
|
|
15
15
|
import { getMainAgentTrustMode } from './tools/registry.js';
|
|
16
|
+
import { defaultSkillsMarkdown } from './marketplace-seeds.js';
|
|
16
17
|
import { publishLiveEvent, publishStateChanged } from './live-events.js';
|
|
17
18
|
import { resolveTargetSpace } from './dashboard-spaces.js';
|
|
18
19
|
|
|
@@ -777,9 +778,17 @@ function writeAgentFiles(agent) {
|
|
|
777
778
|
fs.writeFileSync(path.join(dir, 'AGENTS.md'),
|
|
778
779
|
`# ${agent.name}\n\nParent orchestrator: madarX Main Agent.\n\n## Mission\n${agent.mission}\n\n## Runtime\n- Engine: ${agent.engine}\n- Model: ${agent.model || 'default'}\n- Schedule: ${agent.schedule}\n- Approval: human-in-loop before external sends/posts/deployments.\n\n## Operating rules\n1. Work only inside the approved local project/workspace unless the orchestrator grants a path.\n2. Use web/social/email tools in read or draft mode first.\n3. Save artifacts under your project's artifacts folder (workspace/projects/<slug>/artifacts/).\n4. Never send emails, WhatsApp messages, social posts, deployments, purchases, or destructive commands without explicit approval.\n5. Update heartbeat.json after each run.\n`);
|
|
779
780
|
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
781
|
+
let skillsMarkdown;
|
|
782
|
+
if (typeof agent.skills_markdown === 'string' && agent.skills_markdown.trim()) {
|
|
783
|
+
skillsMarkdown = agent.skills_markdown.trim() + '\n';
|
|
784
|
+
} else {
|
|
785
|
+
// Default skills.md: mission + core playbooks + the business-default skill
|
|
786
|
+
// pack so a fresh agent can do real work out of the box (the runtime reads
|
|
787
|
+
// this file into the prompt; the default skills are gated by the same tools).
|
|
788
|
+
let defaultSkills = '';
|
|
789
|
+
try { defaultSkills = '\n' + defaultSkillsMarkdown(); } catch { /* optional */ }
|
|
790
|
+
skillsMarkdown = `# ${agent.name} Skills\n\n## Mission\n${agent.mission}\n\n## Core playbooks\n- Plan each run from the mission, then execute against the ${agent.schedule} window.\n- Use only the approved tools (${(agent.tools || []).join(', ') || 'web-search, browser, files'}); never reach for tools the owner has not enabled.\n- Save every output as a local artifact under your project's artifacts folder (workspace/projects/<slug>/artifacts/).\n- Hand off any external send, post, deployment, or destructive command to the main agent for approval.\n- After each run, update heartbeat.json with status, summary, and next-run plan.\n${defaultSkills}`;
|
|
791
|
+
}
|
|
783
792
|
fs.writeFileSync(path.join(dir, 'skills.md'), skillsMarkdown);
|
|
784
793
|
|
|
785
794
|
fs.writeFileSync(path.join(dir, 'tools.md'),
|
|
@@ -806,6 +815,46 @@ function writeAgentFiles(agent) {
|
|
|
806
815
|
return files;
|
|
807
816
|
}
|
|
808
817
|
|
|
818
|
+
/**
|
|
819
|
+
* One-time migration: refresh the business-default skills block in existing
|
|
820
|
+
* agents' skills.md. Only touches files that are the GENERATED DEFAULT (they
|
|
821
|
+
* carry the `## Core playbooks` header) — a user-customized skills.md is left
|
|
822
|
+
* untouched. Idempotent: re-running replaces an existing `## Default skills`
|
|
823
|
+
* section in place rather than appending, and is a no-op once current.
|
|
824
|
+
*
|
|
825
|
+
* @returns {{ scanned: number, updated: number }}
|
|
826
|
+
*/
|
|
827
|
+
export function migrateDefaultAgentSkills() {
|
|
828
|
+
let scanned = 0;
|
|
829
|
+
let updated = 0;
|
|
830
|
+
let block;
|
|
831
|
+
try { block = defaultSkillsMarkdown().trimEnd() + '\n'; } catch { return { scanned, updated }; }
|
|
832
|
+
let dirs = [];
|
|
833
|
+
try { dirs = fs.readdirSync(AGENTS_DIR, { withFileTypes: true }).filter(d => d.isDirectory()); } catch { return { scanned, updated }; }
|
|
834
|
+
|
|
835
|
+
for (const d of dirs) {
|
|
836
|
+
const p = path.join(AGENTS_DIR, d.name, 'skills.md');
|
|
837
|
+
let body;
|
|
838
|
+
try { body = fs.readFileSync(p, 'utf8'); } catch { continue; }
|
|
839
|
+
scanned++;
|
|
840
|
+
// Only refresh the generated-default shape; never overwrite custom content.
|
|
841
|
+
if (!body.includes('## Core playbooks')) continue;
|
|
842
|
+
|
|
843
|
+
let next;
|
|
844
|
+
const marker = '\n## Default skills';
|
|
845
|
+
const idx = body.indexOf(marker);
|
|
846
|
+
if (idx >= 0) {
|
|
847
|
+
next = body.slice(0, idx).trimEnd() + '\n\n' + block; // replace old section
|
|
848
|
+
} else {
|
|
849
|
+
next = body.trimEnd() + '\n\n' + block; // append, was missing
|
|
850
|
+
}
|
|
851
|
+
if (next !== body) {
|
|
852
|
+
try { fs.writeFileSync(p, next); updated++; } catch { /* best-effort */ }
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
return { scanned, updated };
|
|
856
|
+
}
|
|
857
|
+
|
|
809
858
|
export function createAgent(payload = {}) {
|
|
810
859
|
const db = getDb();
|
|
811
860
|
const name = payload.name || 'Client Workspace Custom Agent';
|
package/lib/seeds.js
CHANGED
|
@@ -5,7 +5,7 @@ import { ROOT } from './paths.js';
|
|
|
5
5
|
import { seedMarketplaceItems } from './marketplace-seeds.js';
|
|
6
6
|
import { ensureDefaultProject } from './projects.js';
|
|
7
7
|
import { seedAgentTemplates, installAgentTemplate } from './agent-templates.js';
|
|
8
|
-
import { ensureOpsAgent, createArtifact } from './runtime.js';
|
|
8
|
+
import { ensureOpsAgent, createArtifact, migrateDefaultAgentSkills } from './runtime.js';
|
|
9
9
|
import { renderChangelogHtml } from './artifact-format.js';
|
|
10
10
|
import { migrateArtifactsToProjects } from './artifact-migration.js';
|
|
11
11
|
import { runAuthV1Migration } from '../scripts/migrate-auth-v1.mjs';
|
|
@@ -538,6 +538,10 @@ export function seedDefaults(db) {
|
|
|
538
538
|
// Auto-seed the Tool Smith agent so request_capability delegation has a target.
|
|
539
539
|
seedToolSmithAgentIfMissing(db);
|
|
540
540
|
|
|
541
|
+
// Refresh the business-default skills in existing default-shaped skills.md
|
|
542
|
+
// files (no-op for fresh installs and user-customized agents). Idempotent.
|
|
543
|
+
try { migrateDefaultAgentSkills(); } catch (err) { console.warn('[seeds] migrateDefaultAgentSkills failed:', err?.message || err); }
|
|
544
|
+
|
|
541
545
|
// Dashboard spaces: seed the 'default' space and backfill any NULL-space
|
|
542
546
|
// artifacts so the dashboard never has to reconcile orphans client-side.
|
|
543
547
|
// Idempotent. Must run after schema migration adds artifacts.space_id.
|
package/lib/tools/registry.js
CHANGED
|
@@ -1971,6 +1971,26 @@ export function listPrimitiveToolMeta() {
|
|
|
1971
1971
|
return { names, riskByName };
|
|
1972
1972
|
}
|
|
1973
1973
|
|
|
1974
|
+
/**
|
|
1975
|
+
* Static tool catalog grouped by category — pure read of MARKETPLACE_TOOLS, no
|
|
1976
|
+
* DB, no install state. Used by the CLI banner (which runs in the DB-free
|
|
1977
|
+
* supervisor) to render a grouped capability list à la Hermes.
|
|
1978
|
+
*
|
|
1979
|
+
* @returns {Array<{category: string, count: number, names: string[]}>}
|
|
1980
|
+
* sorted by descending count.
|
|
1981
|
+
*/
|
|
1982
|
+
export function listToolCategories() {
|
|
1983
|
+
const byCat = new Map();
|
|
1984
|
+
for (const t of MARKETPLACE_TOOLS) {
|
|
1985
|
+
const cat = t.category || 'other';
|
|
1986
|
+
if (!byCat.has(cat)) byCat.set(cat, []);
|
|
1987
|
+
byCat.get(cat).push(t.name);
|
|
1988
|
+
}
|
|
1989
|
+
return [...byCat.entries()]
|
|
1990
|
+
.map(([category, names]) => ({ category, count: names.length, names }))
|
|
1991
|
+
.sort((a, b) => b.count - a.count || a.category.localeCompare(b.category));
|
|
1992
|
+
}
|
|
1993
|
+
|
|
1974
1994
|
/**
|
|
1975
1995
|
* Dynamic tool descriptors (composites + connector endpoints), normalized into
|
|
1976
1996
|
* the SAME shape as a static row so every downstream consumer (executeRegistryTool
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "madarx",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.14.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Madarx OS — Next.js product with SQLite-backed runtime, scheduled cron daemon, and approval-gated local runners.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -44,6 +44,9 @@
|
|
|
44
44
|
"prepublishOnly": "npm run build",
|
|
45
45
|
"build": "NODE_OPTIONS=--no-warnings next build",
|
|
46
46
|
"postbuild": "node --no-warnings scripts/postbuild-standalone.mjs",
|
|
47
|
+
"postinstall": "node --no-warnings scripts/postinstall-splash.mjs",
|
|
48
|
+
"splash": "MADARX_FORCE_SPLASH=1 FORCE_COLOR=1 node --no-warnings scripts/postinstall-splash.mjs",
|
|
49
|
+
"banner": "FORCE_COLOR=1 node --no-warnings scripts/preview-banner.mjs",
|
|
47
50
|
"start": "next start -p 8787 -H 127.0.0.1",
|
|
48
51
|
"test": "node --no-warnings --test tests/*.test.js",
|
|
49
52
|
"daemon": "node --no-warnings --env-file-if-exists=.env.local scripts/cron-daemon.mjs",
|
|
@@ -38,4 +38,13 @@ if (!fs.existsSync(STANDALONE)) {
|
|
|
38
38
|
|
|
39
39
|
copyInto(path.join('.next', 'static'), path.join('.next', 'static'));
|
|
40
40
|
copyInto('public', 'public');
|
|
41
|
+
|
|
42
|
+
for (const envName of ['.env', '.env.local', '.env.development', '.env.production', '.env.test']) {
|
|
43
|
+
const envPath = path.join(STANDALONE, envName);
|
|
44
|
+
if (fs.existsSync(envPath)) {
|
|
45
|
+
fs.rmSync(envPath, { force: true });
|
|
46
|
+
console.log(`[postbuild] removed ${path.join('.next', 'standalone', envName)} from publish bundle`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
41
50
|
console.log('[postbuild] standalone bundle is self-serving.');
|