denchclaw 3.1.2 → 3.1.4
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/apps/web/.next/standalone/apps/web/.next/BUILD_ID +1 -1
- package/apps/web/.next/standalone/apps/web/.next/app-build-manifest.json +154 -154
- package/apps/web/.next/standalone/apps/web/.next/app-path-routes-manifest.json +47 -47
- package/apps/web/.next/standalone/apps/web/.next/build-manifest.json +2 -2
- package/apps/web/.next/standalone/apps/web/.next/cache/config.json +3 -3
- package/apps/web/.next/standalone/apps/web/.next/prerender-manifest.json +3 -3
- package/apps/web/.next/standalone/apps/web/.next/required-server-files.json +1 -1
- package/apps/web/.next/standalone/apps/web/.next/routes-manifest.json +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/_not-found/page.js +2 -2
- package/apps/web/.next/standalone/apps/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/cron/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/proxy/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/serve/[...path]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/store/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/webhooks/[...path]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/active/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/runs/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stop/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stop/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stream/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/subagents/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/composio/callback/route.js.nft.json +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/composio/callback/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/composio/connect/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/composio/connections/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/composio/disconnect/route.js.nft.json +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/composio/disconnect/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/composio/status/route.js.nft.json +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/composio/status/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/composio/toolkits/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/crm/calendar/[id]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/crm/calendar/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/crm/companies/[id]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/crm/enrich/[type]/[id]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/crm/inbox/[threadId]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/crm/inbox/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/crm/people/[id]/activity/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/crm/people/[id]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/crm/people/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/crm/photos/proxy/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/crm/photos/sync/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/heartbeat/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/jobs/[jobId]/runs/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/jobs/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/runs/[sessionId]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/runs/search-transcript/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/feedback/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/feedback/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/channels/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/chat/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/chat/stream/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/sessions/[id]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/sessions/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/integrations/[id]/toggle/route.js.nft.json +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/integrations/[id]/toggle/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/integrations/repair/route.js.nft.json +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/integrations/repair/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/integrations/route.js.nft.json +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/integrations/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/memories/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/connections/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/connections/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/dench-cloud/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/dench-cloud/route.js.nft.json +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/dench-cloud/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/identity/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/identity/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/skill-template/consume/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/state/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/state/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/sync/progress/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/sync/start/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/sync/start/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/profiles/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/profiles/switch/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/sessions/[sessionId]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/settings/cloud/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/settings/cloud/route.js.nft.json +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/settings/cloud/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/settings/mcp/connect/callback/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/settings/mcp/connect/start/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/settings/mcp/connect/token/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/settings/mcp/probe/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/settings/mcp/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/skills/[slug]/content/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/skills/[slug]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/skills/browse/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/skills/install/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/sync/poll-tick/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/sync/refresh/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/sync/status/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/terminal/port/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/voice/speech/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/voice/speech/route.js.nft.json +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/voice/speech/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/voice/transcribe/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/voice/transcribe/route.js.nft.json +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/voice/transcribe/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/voice/voices/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/voice/voices/route.js.nft.json +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/voice/voices/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/[id]/messages/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/[id]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/assets/[...path]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/browse/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/browse-file/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/context/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/copy/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/db/introspect/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/db/query/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/delete/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/delete/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/enrichment-status/route.js.nft.json +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/enrichment-status/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/execute/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/file/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/init/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/init/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/link-preview/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/list/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/mkdir/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/move/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/actions/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/actions/runs/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/display-field/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/enrich/route.js.nft.json +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/enrich/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/[id]/content/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/[id]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/bulk-delete/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/options/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/[fieldId]/enum-rename/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/[fieldId]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/reorder/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/icon/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/views/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/open-file/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/path-info/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/query/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/raw-file/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/rename/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/reports/execute/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/reports/execute/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/search-index/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/suggest-files/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/switch/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/switch/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/thumbnail/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/tree/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/upload/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/upload/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/virtual-file/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/watch/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/write-binary/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/onboarding/page.js +2 -2
- package/apps/web/.next/standalone/apps/web/.next/server/app/onboarding/page.js.nft.json +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/page.js +4 -4
- package/apps/web/.next/standalone/apps/web/.next/server/app/page.js.nft.json +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/workspace/page.js +2 -2
- package/apps/web/.next/standalone/apps/web/.next/server/app/workspace/page.js.nft.json +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/workspace/page_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app-paths-manifest.json +47 -47
- package/apps/web/.next/standalone/apps/web/.next/server/chunks/27221.js +15 -0
- package/apps/web/.next/standalone/apps/web/.next/server/chunks/27488.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/chunks/40192.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/server/chunks/44877.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/chunks/77515.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/chunks/80687.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/functions-config-manifest.json +10 -10
- package/apps/web/.next/standalone/apps/web/.next/server/pages/500.html +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/server-reference-manifest.json +1 -1
- package/apps/web/.next/{static/chunks/app/layout-4d3b6582305a2c9b.js → standalone/apps/web/.next/static/chunks/app/layout-0b073d606db56b76.js} +1 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/{page-a3d7c86fe4d822f9.js → page-91e10489bfb4d2cb.js} +1 -1
- package/apps/web/.next/standalone/apps/web/.next/static/css/df1d749df85dc392.css +1 -0
- package/apps/web/.next/standalone/apps/web/server.js +1 -1
- package/apps/web/.next/standalone/extensions/apollo-enrichment/index.mjs +294 -0
- package/apps/web/.next/standalone/extensions/apollo-enrichment/package.json +1 -1
- package/apps/web/.next/standalone/extensions/dench-ai-gateway/composio-bridge.ts +4 -1
- package/apps/web/.next/standalone/extensions/dench-ai-gateway/config-patch.ts +32 -0
- package/apps/web/.next/standalone/extensions/dench-ai-gateway/index.mjs +1128 -0
- package/apps/web/.next/standalone/extensions/dench-ai-gateway/index.ts +17 -5
- package/apps/web/.next/standalone/extensions/dench-ai-gateway/openclaw.plugin.json +10 -0
- package/apps/web/.next/standalone/extensions/dench-ai-gateway/package.json +1 -1
- package/apps/web/.next/standalone/extensions/dench-ai-gateway/sync-refresh-tools.ts +2 -2
- package/apps/web/.next/standalone/extensions/dench-identity/index.mjs +750 -0
- package/apps/web/.next/standalone/extensions/dench-identity/index.test.ts +11 -3
- package/apps/web/.next/standalone/extensions/dench-identity/index.ts +128 -8
- package/apps/web/.next/standalone/extensions/dench-identity/openclaw.plugin.json +8 -0
- package/apps/web/.next/standalone/extensions/dench-identity/package.json +1 -1
- package/apps/web/.next/standalone/extensions/exa-search/index.mjs +333 -0
- package/apps/web/.next/standalone/extensions/exa-search/package.json +1 -1
- package/apps/web/.next/standalone/extensions/posthog-analytics/index.mjs +786 -0
- package/apps/web/.next/standalone/extensions/posthog-analytics/lib/build-env.js +1 -1
- package/apps/web/.next/standalone/extensions/posthog-analytics/package.json +1 -1
- package/apps/web/.next/standalone/package.json +4 -2
- package/apps/web/.next/{standalone/apps/web/.next/static/chunks/app/layout-4d3b6582305a2c9b.js → static/chunks/app/layout-0b073d606db56b76.js} +1 -1
- package/apps/web/.next/static/chunks/app/{page-a3d7c86fe4d822f9.js → page-91e10489bfb4d2cb.js} +1 -1
- package/apps/web/.next/static/css/df1d749df85dc392.css +1 -0
- package/assets/seed/workspace.duckdb +0 -0
- package/dist/entry.js +1 -1
- package/dist/{program-JflTwsUD.js → program-BzTUdX93.js} +91 -2
- package/dist/{run-main-Db7zNm4h.js → run-main-DWpG1QJ-.js} +1 -1
- package/extensions/apollo-enrichment/index.mjs +294 -0
- package/extensions/apollo-enrichment/package.json +1 -1
- package/extensions/dench-ai-gateway/composio-bridge.ts +4 -1
- package/extensions/dench-ai-gateway/config-patch.ts +32 -0
- package/extensions/dench-ai-gateway/index.mjs +1128 -0
- package/extensions/dench-ai-gateway/index.ts +17 -5
- package/extensions/dench-ai-gateway/openclaw.plugin.json +10 -0
- package/extensions/dench-ai-gateway/package.json +1 -1
- package/extensions/dench-ai-gateway/sync-refresh-tools.ts +2 -2
- package/extensions/dench-identity/index.mjs +750 -0
- package/extensions/dench-identity/index.test.ts +11 -3
- package/extensions/dench-identity/index.ts +128 -8
- package/extensions/dench-identity/openclaw.plugin.json +8 -0
- package/extensions/dench-identity/package.json +1 -1
- package/extensions/exa-search/index.mjs +333 -0
- package/extensions/exa-search/package.json +1 -1
- package/extensions/posthog-analytics/index.mjs +786 -0
- package/extensions/posthog-analytics/lib/build-env.js +1 -1
- package/extensions/posthog-analytics/package.json +1 -1
- package/package.json +4 -2
- package/skills/dench-integrations/SKILL.md +2 -0
- package/apps/web/.next/standalone/apps/web/.next/server/chunks/6787.js +0 -15
- package/apps/web/.next/standalone/apps/web/.next/static/css/dd3ce8da3e14c080.css +0 -1
- package/apps/web/.next/static/css/dd3ce8da3e14c080.css +0 -1
- /package/apps/web/.next/standalone/apps/web/.next/static/{VIH2t9pSKK-Cy_SphlKAC → BJK3zoIUstVWHptp0v5ii}/_buildManifest.js +0 -0
- /package/apps/web/.next/standalone/apps/web/.next/static/{VIH2t9pSKK-Cy_SphlKAC → BJK3zoIUstVWHptp0v5ii}/_ssgManifest.js +0 -0
- /package/apps/web/.next/static/{VIH2t9pSKK-Cy_SphlKAC → BJK3zoIUstVWHptp0v5ii}/_buildManifest.js +0 -0
- /package/apps/web/.next/static/{VIH2t9pSKK-Cy_SphlKAC → BJK3zoIUstVWHptp0v5ii}/_ssgManifest.js +0 -0
|
@@ -311,6 +311,7 @@ describe("register", () => {
|
|
|
311
311
|
|
|
312
312
|
expect(api.registerTool).toHaveBeenCalledWith(
|
|
313
313
|
expect.objectContaining({ name: "dench_search_integrations" }),
|
|
314
|
+
{ name: "dench_search_integrations", optional: true },
|
|
314
315
|
);
|
|
315
316
|
expect(getRegisteredTool(api as any, "dench_execute_integrations")).toBeUndefined();
|
|
316
317
|
|
|
@@ -694,7 +695,7 @@ describe("register", () => {
|
|
|
694
695
|
rmSync(tmp, { recursive: true, force: true });
|
|
695
696
|
});
|
|
696
697
|
|
|
697
|
-
it("returns
|
|
698
|
+
it("returns static fallback recipes when a connected toolkit search has no gateway matches", async () => {
|
|
698
699
|
const tmp = path.join(
|
|
699
700
|
os.tmpdir(),
|
|
700
701
|
`dench-identity-no-match-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
@@ -720,9 +721,16 @@ describe("register", () => {
|
|
|
720
721
|
});
|
|
721
722
|
const payload = JSON.parse(result.content[0].text);
|
|
722
723
|
|
|
723
|
-
expect(payload.result_count).toBe(
|
|
724
|
+
expect(payload.result_count).toBe(1);
|
|
725
|
+
expect(payload.results[0].tool_slug).toBe("GMAIL_FETCH_EMAILS");
|
|
726
|
+
expect(payload.results[0].suggested_arguments).toEqual({
|
|
727
|
+
label_ids: ["INBOX"],
|
|
728
|
+
max_results: 10,
|
|
729
|
+
});
|
|
730
|
+
expect(payload.search_source).toBe("static_recipe_fallback");
|
|
724
731
|
expect(payload.connected_toolkits).toEqual(["gmail"]);
|
|
725
|
-
expect(payload.instruction).toContain("
|
|
732
|
+
expect(payload.instruction).toContain("dench_execute_integrations");
|
|
733
|
+
expect(payload.instruction).toContain("Do NOT stop");
|
|
726
734
|
|
|
727
735
|
rmSync(tmp, { recursive: true, force: true });
|
|
728
736
|
});
|
|
@@ -1213,6 +1213,80 @@ function chooseFallbackTool(app: string, queryText: string) {
|
|
|
1213
1213
|
return best;
|
|
1214
1214
|
}
|
|
1215
1215
|
|
|
1216
|
+
function buildStaticFallbackInputSchema(
|
|
1217
|
+
recipe: (typeof STATIC_COMPOSIO_FALLBACK)[string][number],
|
|
1218
|
+
) {
|
|
1219
|
+
const properties: Record<string, unknown> = {};
|
|
1220
|
+
for (const arg of recipe.required_args ?? []) {
|
|
1221
|
+
properties[arg] = { type: "string" };
|
|
1222
|
+
}
|
|
1223
|
+
for (const [key, hint] of Object.entries(recipe.arg_hints ?? {})) {
|
|
1224
|
+
properties[key] = {
|
|
1225
|
+
type: typeof hint === "number" ? "number" : Array.isArray(hint) ? "array" : "string",
|
|
1226
|
+
description: Array.isArray(hint) ? JSON.stringify(hint) : String(hint),
|
|
1227
|
+
};
|
|
1228
|
+
}
|
|
1229
|
+
return {
|
|
1230
|
+
type: "object",
|
|
1231
|
+
properties,
|
|
1232
|
+
required: recipe.required_args ?? [],
|
|
1233
|
+
};
|
|
1234
|
+
}
|
|
1235
|
+
|
|
1236
|
+
function buildStaticFallbackSearchResults(toolkitSlug: string, queryText: string) {
|
|
1237
|
+
const recipe = chooseFallbackTool(toolkitSlug, queryText);
|
|
1238
|
+
if (!recipe) {
|
|
1239
|
+
return [];
|
|
1240
|
+
}
|
|
1241
|
+
|
|
1242
|
+
return [
|
|
1243
|
+
{
|
|
1244
|
+
tool_slug: recipe.tool,
|
|
1245
|
+
name: recipe.intent,
|
|
1246
|
+
description: `Known ${humanizeResolverApp(toolkitSlug)} recipe (local fallback because gateway search returned no matches).`,
|
|
1247
|
+
toolkit: {
|
|
1248
|
+
slug: toolkitSlug,
|
|
1249
|
+
name: humanizeResolverApp(toolkitSlug),
|
|
1250
|
+
},
|
|
1251
|
+
input_schema: buildStaticFallbackInputSchema(recipe),
|
|
1252
|
+
suggested_arguments: recipe.default_args ?? {},
|
|
1253
|
+
is_connected: true,
|
|
1254
|
+
account_count: null,
|
|
1255
|
+
accounts: [],
|
|
1256
|
+
match_source: "static_recipe_fallback",
|
|
1257
|
+
},
|
|
1258
|
+
];
|
|
1259
|
+
}
|
|
1260
|
+
|
|
1261
|
+
function buildEmptyConnectedSearchInstruction(params: {
|
|
1262
|
+
normalizedToolkit: string;
|
|
1263
|
+
query: string;
|
|
1264
|
+
fallbackResults: Array<Record<string, unknown>>;
|
|
1265
|
+
}): string {
|
|
1266
|
+
if (params.fallbackResults.length > 0) {
|
|
1267
|
+
const top = params.fallbackResults[0] ?? {};
|
|
1268
|
+
const slug = readString(top.tool_slug) ?? "the top fallback tool_slug";
|
|
1269
|
+
const suggested = top.suggested_arguments;
|
|
1270
|
+
const suggestedText =
|
|
1271
|
+
suggested && typeof suggested === "object" && Object.keys(suggested as object).length > 0
|
|
1272
|
+
? ` and suggested_arguments ${JSON.stringify(suggested)}`
|
|
1273
|
+
: "";
|
|
1274
|
+
return [
|
|
1275
|
+
`Gateway search returned no matches, but ${humanizeResolverApp(params.normalizedToolkit)} is connected.`,
|
|
1276
|
+
"Do NOT stop the task, do NOT mention gog, and do NOT switch to shell CLIs.",
|
|
1277
|
+
`Call ${DENCH_EXECUTE_INTEGRATIONS_NAME} immediately with tool_slug "${slug}"${suggestedText}.`,
|
|
1278
|
+
`If execution fails, retry ${DENCH_SEARCH_INTEGRATIONS_NAME} with toolkit only (omit query) or a shorter query.`,
|
|
1279
|
+
].join(" ");
|
|
1280
|
+
}
|
|
1281
|
+
|
|
1282
|
+
return [
|
|
1283
|
+
`No ${humanizeResolverApp(params.normalizedToolkit)} integration tools matched gateway search.`,
|
|
1284
|
+
"Do NOT stop — retry search with toolkit only (omit query), a shorter query, or a different keyword.",
|
|
1285
|
+
`Then execute the best match with ${DENCH_EXECUTE_INTEGRATIONS_NAME}.`,
|
|
1286
|
+
"Never fall back to gog while this app is connected.",
|
|
1287
|
+
].join(" ");
|
|
1288
|
+
}
|
|
1289
|
+
|
|
1216
1290
|
type ComposioSearchPresentationResult = {
|
|
1217
1291
|
app: ComposioToolIndexFile["connected_apps"][number];
|
|
1218
1292
|
search: ComposioToolSearchResult;
|
|
@@ -1832,11 +1906,36 @@ function createDenchSearchIntegrationsTool(api: OpenClawPluginApi): AnyAgentTool
|
|
|
1832
1906
|
});
|
|
1833
1907
|
}
|
|
1834
1908
|
|
|
1835
|
-
|
|
1836
|
-
|
|
1909
|
+
let items = asRecordArray(gatewayResult.items) ?? [];
|
|
1910
|
+
let connectedToolkits = Array.isArray(gatewayResult.connected_toolkits)
|
|
1837
1911
|
? (gatewayResult.connected_toolkits as string[])
|
|
1838
1912
|
: [];
|
|
1839
1913
|
|
|
1914
|
+
if (
|
|
1915
|
+
items.length === 0 &&
|
|
1916
|
+
normalizedToolkit &&
|
|
1917
|
+
query &&
|
|
1918
|
+
connectedToolkits.includes(normalizedToolkit)
|
|
1919
|
+
) {
|
|
1920
|
+
const retryResult = await postComposioGatewayJson({
|
|
1921
|
+
api,
|
|
1922
|
+
path: "/v1/composio/tools/search",
|
|
1923
|
+
body: {
|
|
1924
|
+
toolkit_slug: normalizedToolkit,
|
|
1925
|
+
limit,
|
|
1926
|
+
},
|
|
1927
|
+
});
|
|
1928
|
+
if (retryResult) {
|
|
1929
|
+
const retryItems = asRecordArray(retryResult.items) ?? [];
|
|
1930
|
+
if (retryItems.length > 0) {
|
|
1931
|
+
items = retryItems;
|
|
1932
|
+
}
|
|
1933
|
+
if (Array.isArray(retryResult.connected_toolkits)) {
|
|
1934
|
+
connectedToolkits = retryResult.connected_toolkits as string[];
|
|
1935
|
+
}
|
|
1936
|
+
}
|
|
1937
|
+
}
|
|
1938
|
+
|
|
1840
1939
|
if (
|
|
1841
1940
|
items.length === 0 &&
|
|
1842
1941
|
normalizedToolkit &&
|
|
@@ -1858,15 +1957,29 @@ function createDenchSearchIntegrationsTool(api: OpenClawPluginApi): AnyAgentTool
|
|
|
1858
1957
|
}
|
|
1859
1958
|
|
|
1860
1959
|
if (items.length === 0) {
|
|
1960
|
+
const fallbackResults =
|
|
1961
|
+
normalizedToolkit && connectedToolkits.includes(normalizedToolkit)
|
|
1962
|
+
? buildStaticFallbackSearchResults(normalizedToolkit, query)
|
|
1963
|
+
: [];
|
|
1964
|
+
|
|
1861
1965
|
return jsonResult({
|
|
1862
1966
|
query,
|
|
1863
1967
|
toolkit_filter: normalizedToolkit,
|
|
1864
|
-
result_count:
|
|
1865
|
-
results:
|
|
1968
|
+
result_count: fallbackResults.length,
|
|
1969
|
+
results: fallbackResults,
|
|
1866
1970
|
connected_toolkits: connectedToolkits,
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
|
|
1971
|
+
search_source:
|
|
1972
|
+
fallbackResults.length > 0 ? "static_recipe_fallback" : "gateway_tool_router",
|
|
1973
|
+
instruction:
|
|
1974
|
+
normalizedToolkit && connectedToolkits.includes(normalizedToolkit)
|
|
1975
|
+
? buildEmptyConnectedSearchInstruction({
|
|
1976
|
+
normalizedToolkit,
|
|
1977
|
+
query,
|
|
1978
|
+
fallbackResults,
|
|
1979
|
+
})
|
|
1980
|
+
: normalizedToolkit
|
|
1981
|
+
? `No ${humanizeResolverApp(normalizedToolkit)} integration tools matched. Refine the query or try a broader search.`
|
|
1982
|
+
: "No integration tools matched. Refine the query or specify a toolkit.",
|
|
1870
1983
|
});
|
|
1871
1984
|
}
|
|
1872
1985
|
|
|
@@ -1927,6 +2040,7 @@ function buildComposioDefaultGuidance(composioAppsSkillPath: string): string {
|
|
|
1927
2040
|
"- Missing first-time connection example: `[Connect Slack](dench://composio/connect?toolkit=slack&name=Slack)`.",
|
|
1928
2041
|
'- If the search returns `availability: "connect_required"`, briefly explain the app is not connected and end with the connect link.',
|
|
1929
2042
|
"- If an integration tool call fails because of argument shape, fix the arguments and retry once before considering any fallback.",
|
|
2043
|
+
"- When search returns zero gateway matches but the app is connected, the tool may include `static_recipe_fallback` results with `suggested_arguments`. Execute the top match immediately — do NOT stop the turn or switch to gog.",
|
|
1930
2044
|
"- When the user implicitly asks for the full dataset, keep paginating until the tool response no longer advertises more pages.",
|
|
1931
2045
|
"",
|
|
1932
2046
|
].join("\n");
|
|
@@ -2081,7 +2195,13 @@ export default function register(api: any) {
|
|
|
2081
2195
|
typeof api.registerTool === "function" &&
|
|
2082
2196
|
shouldRegisterIntegrationTools(workspaceDir)
|
|
2083
2197
|
) {
|
|
2084
|
-
api.registerTool(createDenchSearchIntegrationsTool(api)
|
|
2198
|
+
api.registerTool(createDenchSearchIntegrationsTool(api), {
|
|
2199
|
+
name: DENCH_SEARCH_INTEGRATIONS_NAME,
|
|
2200
|
+
optional: true,
|
|
2201
|
+
});
|
|
2202
|
+
api.logger?.info?.(
|
|
2203
|
+
`[dench-identity] registered ${DENCH_SEARCH_INTEGRATIONS_NAME} integration tool`,
|
|
2204
|
+
);
|
|
2085
2205
|
}
|
|
2086
2206
|
|
|
2087
2207
|
api.on(
|
|
@@ -3,6 +3,14 @@
|
|
|
3
3
|
"name": "DenchClaw Identity",
|
|
4
4
|
"version": "1.0.0",
|
|
5
5
|
"description": "Injects the DenchClaw identity and behavioral contracts into the agent system prompt.",
|
|
6
|
+
"activation": {
|
|
7
|
+
"onStartup": true
|
|
8
|
+
},
|
|
9
|
+
"contracts": {
|
|
10
|
+
"tools": [
|
|
11
|
+
"dench_search_integrations"
|
|
12
|
+
]
|
|
13
|
+
},
|
|
6
14
|
"configSchema": {
|
|
7
15
|
"type": "object",
|
|
8
16
|
"additionalProperties": false,
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
// extensions/shared/dench-auth.ts
|
|
2
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
var DEFAULT_GATEWAY_URL = "https://gateway.merseoriginals.com";
|
|
5
|
+
var AUTH_PROFILES_REL = path.join("agents", "main", "agent", "auth-profiles.json");
|
|
6
|
+
function readDenchAuthProfileKey() {
|
|
7
|
+
const stateDir = process.env.OPENCLAW_STATE_DIR;
|
|
8
|
+
if (stateDir) {
|
|
9
|
+
const key = readKeyFromAuthProfiles(path.join(stateDir, AUTH_PROFILES_REL));
|
|
10
|
+
if (key) return key;
|
|
11
|
+
}
|
|
12
|
+
return envFallback();
|
|
13
|
+
}
|
|
14
|
+
function readKeyFromAuthProfiles(authPath) {
|
|
15
|
+
try {
|
|
16
|
+
if (!existsSync(authPath)) return void 0;
|
|
17
|
+
const raw = JSON.parse(readFileSync(authPath, "utf-8"));
|
|
18
|
+
const key = raw?.profiles?.["dench-cloud:default"]?.key;
|
|
19
|
+
return typeof key === "string" && key.trim() ? key.trim() : void 0;
|
|
20
|
+
} catch {
|
|
21
|
+
return void 0;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function envFallback() {
|
|
25
|
+
return process.env.DENCH_CLOUD_API_KEY?.trim() || process.env.DENCH_API_KEY?.trim() || void 0;
|
|
26
|
+
}
|
|
27
|
+
function resolveDenchGatewayUrl(pluginConfig) {
|
|
28
|
+
const configured = pluginConfig?.gatewayUrl;
|
|
29
|
+
if (typeof configured === "string" && configured.trim()) return configured.trim();
|
|
30
|
+
return process.env.DENCH_GATEWAY_URL?.trim() || DEFAULT_GATEWAY_URL;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// extensions/exa-search/index.ts
|
|
34
|
+
var id = "exa-search";
|
|
35
|
+
function asRecord(value) {
|
|
36
|
+
return value && typeof value === "object" ? value : void 0;
|
|
37
|
+
}
|
|
38
|
+
function readTrimmedString(value) {
|
|
39
|
+
return typeof value === "string" && value.trim() ? value.trim() : void 0;
|
|
40
|
+
}
|
|
41
|
+
function readStringList(value) {
|
|
42
|
+
if (!Array.isArray(value)) {
|
|
43
|
+
return void 0;
|
|
44
|
+
}
|
|
45
|
+
const items = value.map((item) => readTrimmedString(item)).filter((item) => Boolean(item));
|
|
46
|
+
return items.length > 0 ? items : void 0;
|
|
47
|
+
}
|
|
48
|
+
function jsonResult(payload) {
|
|
49
|
+
return {
|
|
50
|
+
content: [{ type: "text", text: JSON.stringify(payload, null, 2) }],
|
|
51
|
+
details: payload
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
var SEARCH_TYPES = ["auto", "neural", "fast", "deep", "deep-reasoning", "instant"];
|
|
55
|
+
var SEARCH_CATEGORIES = [
|
|
56
|
+
"company",
|
|
57
|
+
"research paper",
|
|
58
|
+
"news",
|
|
59
|
+
"personal site",
|
|
60
|
+
"financial report",
|
|
61
|
+
"people"
|
|
62
|
+
];
|
|
63
|
+
var ExaSearchParameters = {
|
|
64
|
+
type: "object",
|
|
65
|
+
additionalProperties: false,
|
|
66
|
+
properties: {
|
|
67
|
+
query: { type: "string", description: "Search query." },
|
|
68
|
+
searchType: { type: "string", enum: [...SEARCH_TYPES], description: "Exa search type." },
|
|
69
|
+
category: { type: "string", enum: [...SEARCH_CATEGORIES], description: "Exa search category." },
|
|
70
|
+
numResults: { type: "number", description: "Maximum number of results." },
|
|
71
|
+
includeDomains: {
|
|
72
|
+
type: "array",
|
|
73
|
+
items: { type: "string" },
|
|
74
|
+
description: "Only search these domains."
|
|
75
|
+
},
|
|
76
|
+
excludeDomains: {
|
|
77
|
+
type: "array",
|
|
78
|
+
items: { type: "string" },
|
|
79
|
+
description: "Exclude these domains."
|
|
80
|
+
},
|
|
81
|
+
startPublishedDate: { type: "string", description: "ISO date lower bound for published date." },
|
|
82
|
+
endPublishedDate: { type: "string", description: "ISO date upper bound for published date." },
|
|
83
|
+
text: { type: "boolean", description: "Include extracted page text." },
|
|
84
|
+
textMaxCharacters: { type: "number", description: "Maximum characters of extracted text." },
|
|
85
|
+
highlights: { type: "boolean", description: "Include highlights." },
|
|
86
|
+
highlightsMaxCharacters: { type: "number", description: "Maximum characters in highlights." },
|
|
87
|
+
summary: { type: "boolean", description: "Include a summary." },
|
|
88
|
+
summaryQuery: { type: "string", description: "Summary query prompt to send upstream." }
|
|
89
|
+
},
|
|
90
|
+
required: ["query"]
|
|
91
|
+
};
|
|
92
|
+
var ExaContentsParameters = {
|
|
93
|
+
type: "object",
|
|
94
|
+
additionalProperties: false,
|
|
95
|
+
properties: {
|
|
96
|
+
urls: { type: "array", items: { type: "string" }, description: "URLs to fetch content for." },
|
|
97
|
+
text: { type: "boolean", description: "Include extracted page text." },
|
|
98
|
+
textMaxCharacters: { type: "number", description: "Maximum characters of extracted text." },
|
|
99
|
+
highlights: { type: "boolean", description: "Include highlights." },
|
|
100
|
+
highlightsMaxCharacters: { type: "number", description: "Maximum characters in highlights." },
|
|
101
|
+
summary: { type: "boolean", description: "Include a summary." },
|
|
102
|
+
summaryQuery: { type: "string", description: "Summary query prompt to send upstream." }
|
|
103
|
+
},
|
|
104
|
+
required: ["urls"]
|
|
105
|
+
};
|
|
106
|
+
var ExaAnswerParameters = {
|
|
107
|
+
type: "object",
|
|
108
|
+
additionalProperties: false,
|
|
109
|
+
properties: {
|
|
110
|
+
query: { type: "string", description: "Question to answer." },
|
|
111
|
+
text: { type: "boolean", description: "Include extra answer text fields." }
|
|
112
|
+
},
|
|
113
|
+
required: ["query"]
|
|
114
|
+
};
|
|
115
|
+
function buildTextOption(params) {
|
|
116
|
+
if (typeof params.textMaxCharacters === "number") {
|
|
117
|
+
return { maxCharacters: params.textMaxCharacters };
|
|
118
|
+
}
|
|
119
|
+
if (params.text === true) {
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
return void 0;
|
|
123
|
+
}
|
|
124
|
+
function buildHighlightsOption(params) {
|
|
125
|
+
if (typeof params.highlightsMaxCharacters === "number") {
|
|
126
|
+
return { maxCharacters: params.highlightsMaxCharacters };
|
|
127
|
+
}
|
|
128
|
+
if (params.highlights === true) {
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
return void 0;
|
|
132
|
+
}
|
|
133
|
+
function buildSummaryOption(params) {
|
|
134
|
+
const query = readTrimmedString(params.summaryQuery);
|
|
135
|
+
if (query) {
|
|
136
|
+
return { query };
|
|
137
|
+
}
|
|
138
|
+
if (params.summary === true) {
|
|
139
|
+
return {};
|
|
140
|
+
}
|
|
141
|
+
return void 0;
|
|
142
|
+
}
|
|
143
|
+
function buildSearchBody(params) {
|
|
144
|
+
const body = {
|
|
145
|
+
query: params.query
|
|
146
|
+
};
|
|
147
|
+
const searchType = readTrimmedString(params.searchType);
|
|
148
|
+
const category = readTrimmedString(params.category);
|
|
149
|
+
const includeDomains = readStringList(params.includeDomains);
|
|
150
|
+
const excludeDomains = readStringList(params.excludeDomains);
|
|
151
|
+
const startPublishedDate = readTrimmedString(params.startPublishedDate);
|
|
152
|
+
const endPublishedDate = readTrimmedString(params.endPublishedDate);
|
|
153
|
+
const text = buildTextOption(params);
|
|
154
|
+
const highlights = buildHighlightsOption(params);
|
|
155
|
+
const summary = buildSummaryOption(params);
|
|
156
|
+
const contents = {};
|
|
157
|
+
if (searchType) {
|
|
158
|
+
body.type = searchType;
|
|
159
|
+
}
|
|
160
|
+
if (category) {
|
|
161
|
+
body.category = category;
|
|
162
|
+
}
|
|
163
|
+
if (typeof params.numResults === "number") {
|
|
164
|
+
body.numResults = params.numResults;
|
|
165
|
+
}
|
|
166
|
+
if (includeDomains) {
|
|
167
|
+
body.includeDomains = includeDomains;
|
|
168
|
+
}
|
|
169
|
+
if (excludeDomains) {
|
|
170
|
+
body.excludeDomains = excludeDomains;
|
|
171
|
+
}
|
|
172
|
+
if (startPublishedDate) {
|
|
173
|
+
body.startPublishedDate = startPublishedDate;
|
|
174
|
+
}
|
|
175
|
+
if (endPublishedDate) {
|
|
176
|
+
body.endPublishedDate = endPublishedDate;
|
|
177
|
+
}
|
|
178
|
+
if (text !== void 0) {
|
|
179
|
+
contents.text = text;
|
|
180
|
+
}
|
|
181
|
+
if (highlights !== void 0) {
|
|
182
|
+
contents.highlights = highlights;
|
|
183
|
+
}
|
|
184
|
+
if (summary !== void 0) {
|
|
185
|
+
contents.summary = summary;
|
|
186
|
+
}
|
|
187
|
+
if (Object.keys(contents).length > 0) {
|
|
188
|
+
body.contents = contents;
|
|
189
|
+
}
|
|
190
|
+
return body;
|
|
191
|
+
}
|
|
192
|
+
function buildContentsBody(params) {
|
|
193
|
+
const urls = readStringList(params.urls);
|
|
194
|
+
const body = {
|
|
195
|
+
urls: urls ?? []
|
|
196
|
+
};
|
|
197
|
+
const text = buildTextOption(params);
|
|
198
|
+
const highlights = buildHighlightsOption(params);
|
|
199
|
+
const summary = buildSummaryOption(params);
|
|
200
|
+
if (text !== void 0) {
|
|
201
|
+
body.text = text;
|
|
202
|
+
}
|
|
203
|
+
if (highlights !== void 0) {
|
|
204
|
+
body.highlights = highlights;
|
|
205
|
+
}
|
|
206
|
+
if (summary !== void 0) {
|
|
207
|
+
body.summary = summary;
|
|
208
|
+
}
|
|
209
|
+
return body;
|
|
210
|
+
}
|
|
211
|
+
async function parseResponse(response) {
|
|
212
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
213
|
+
if (contentType.includes("application/json")) {
|
|
214
|
+
return response.json();
|
|
215
|
+
}
|
|
216
|
+
return response.text();
|
|
217
|
+
}
|
|
218
|
+
async function postJson(params) {
|
|
219
|
+
const response = await fetch(`${params.gatewayUrl}${params.path}`, {
|
|
220
|
+
method: "POST",
|
|
221
|
+
headers: {
|
|
222
|
+
"content-type": "application/json",
|
|
223
|
+
authorization: `Bearer ${params.apiKey}`
|
|
224
|
+
},
|
|
225
|
+
body: JSON.stringify(params.body)
|
|
226
|
+
});
|
|
227
|
+
if (!response.ok) {
|
|
228
|
+
const detail = await parseResponse(response).catch(() => "");
|
|
229
|
+
return jsonResult({
|
|
230
|
+
error: `Search request failed (HTTP ${response.status}).`,
|
|
231
|
+
detail: detail || void 0
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
return jsonResult(await parseResponse(response));
|
|
235
|
+
}
|
|
236
|
+
function createExaSearchTool(gatewayUrl, apiKey) {
|
|
237
|
+
return {
|
|
238
|
+
name: "exa_search",
|
|
239
|
+
label: "Exa Search",
|
|
240
|
+
description: "Search the web through Exa via the Dench Cloud gateway, with optional text extraction, highlights, and summary generation.",
|
|
241
|
+
parameters: ExaSearchParameters,
|
|
242
|
+
execute: async (_toolCallId, params) => {
|
|
243
|
+
try {
|
|
244
|
+
return await postJson({
|
|
245
|
+
gatewayUrl,
|
|
246
|
+
apiKey,
|
|
247
|
+
path: "/v1/search",
|
|
248
|
+
body: buildSearchBody(params)
|
|
249
|
+
});
|
|
250
|
+
} catch (err) {
|
|
251
|
+
return jsonResult({
|
|
252
|
+
error: "Search request failed.",
|
|
253
|
+
detail: err instanceof Error ? err.message : String(err)
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
function createExaContentsTool(gatewayUrl, apiKey) {
|
|
260
|
+
return {
|
|
261
|
+
name: "exa_get_contents",
|
|
262
|
+
label: "Exa Get Contents",
|
|
263
|
+
description: "Fetch page contents for one or more URLs through Exa via the Dench Cloud gateway.",
|
|
264
|
+
parameters: ExaContentsParameters,
|
|
265
|
+
execute: async (_toolCallId, params) => {
|
|
266
|
+
try {
|
|
267
|
+
const urls = readStringList(params.urls);
|
|
268
|
+
if (!urls) {
|
|
269
|
+
return jsonResult({ error: "At least one URL is required." });
|
|
270
|
+
}
|
|
271
|
+
return await postJson({
|
|
272
|
+
gatewayUrl,
|
|
273
|
+
apiKey,
|
|
274
|
+
path: "/v1/search/contents",
|
|
275
|
+
body: buildContentsBody({ ...params, urls })
|
|
276
|
+
});
|
|
277
|
+
} catch (err) {
|
|
278
|
+
return jsonResult({
|
|
279
|
+
error: "Contents request failed.",
|
|
280
|
+
detail: err instanceof Error ? err.message : String(err)
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
function createExaAnswerTool(gatewayUrl, apiKey) {
|
|
287
|
+
return {
|
|
288
|
+
name: "exa_answer",
|
|
289
|
+
label: "Exa Answer",
|
|
290
|
+
description: "Ask Exa for a citation-backed answer through the Dench Cloud gateway.",
|
|
291
|
+
parameters: ExaAnswerParameters,
|
|
292
|
+
execute: async (_toolCallId, params) => {
|
|
293
|
+
try {
|
|
294
|
+
return await postJson({
|
|
295
|
+
gatewayUrl,
|
|
296
|
+
apiKey,
|
|
297
|
+
path: "/v1/search/answer",
|
|
298
|
+
body: {
|
|
299
|
+
query: params.query,
|
|
300
|
+
...params.text === true ? { text: true } : {}
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
} catch (err) {
|
|
304
|
+
return jsonResult({
|
|
305
|
+
error: "Answer request failed.",
|
|
306
|
+
detail: err instanceof Error ? err.message : String(err)
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
function register(api) {
|
|
313
|
+
const rootConfig = asRecord(api.config);
|
|
314
|
+
const pluginEntries = asRecord(asRecord(rootConfig?.plugins)?.entries);
|
|
315
|
+
const pluginConfig = asRecord(asRecord(pluginEntries?.[id])?.config);
|
|
316
|
+
if (pluginConfig?.enabled === false) {
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
const gwPluginConfig = asRecord(asRecord(pluginEntries?.["dench-ai-gateway"])?.config);
|
|
320
|
+
const gatewayUrl = resolveDenchGatewayUrl(gwPluginConfig);
|
|
321
|
+
const apiKey = readDenchAuthProfileKey();
|
|
322
|
+
if (!apiKey) {
|
|
323
|
+
api.logger?.info?.("[exa-search] No Dench Cloud API key found; tools will not be registered.");
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
api.registerTool(createExaSearchTool(gatewayUrl, apiKey));
|
|
327
|
+
api.registerTool(createExaContentsTool(gatewayUrl, apiKey));
|
|
328
|
+
api.registerTool(createExaAnswerTool(gatewayUrl, apiKey));
|
|
329
|
+
}
|
|
330
|
+
export {
|
|
331
|
+
register as default,
|
|
332
|
+
id
|
|
333
|
+
};
|