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.
Files changed (245) hide show
  1. package/apps/web/.next/standalone/apps/web/.next/BUILD_ID +1 -1
  2. package/apps/web/.next/standalone/apps/web/.next/app-build-manifest.json +154 -154
  3. package/apps/web/.next/standalone/apps/web/.next/app-path-routes-manifest.json +47 -47
  4. package/apps/web/.next/standalone/apps/web/.next/build-manifest.json +2 -2
  5. package/apps/web/.next/standalone/apps/web/.next/cache/config.json +3 -3
  6. package/apps/web/.next/standalone/apps/web/.next/prerender-manifest.json +3 -3
  7. package/apps/web/.next/standalone/apps/web/.next/required-server-files.json +1 -1
  8. package/apps/web/.next/standalone/apps/web/.next/routes-manifest.json +1 -1
  9. package/apps/web/.next/standalone/apps/web/.next/server/app/_not-found/page.js +2 -2
  10. package/apps/web/.next/standalone/apps/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  11. package/apps/web/.next/standalone/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  12. package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/cron/route_client-reference-manifest.js +1 -1
  13. package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/proxy/route_client-reference-manifest.js +1 -1
  14. package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/route_client-reference-manifest.js +1 -1
  15. package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/serve/[...path]/route_client-reference-manifest.js +1 -1
  16. package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/store/route_client-reference-manifest.js +1 -1
  17. package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/webhooks/[...path]/route_client-reference-manifest.js +1 -1
  18. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/active/route_client-reference-manifest.js +1 -1
  19. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/route.js +1 -1
  20. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/route_client-reference-manifest.js +1 -1
  21. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/runs/route_client-reference-manifest.js +1 -1
  22. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stop/route.js +1 -1
  23. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stop/route_client-reference-manifest.js +1 -1
  24. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stream/route_client-reference-manifest.js +1 -1
  25. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/subagents/route_client-reference-manifest.js +1 -1
  26. package/apps/web/.next/standalone/apps/web/.next/server/app/api/composio/callback/route.js.nft.json +1 -1
  27. package/apps/web/.next/standalone/apps/web/.next/server/app/api/composio/callback/route_client-reference-manifest.js +1 -1
  28. package/apps/web/.next/standalone/apps/web/.next/server/app/api/composio/connect/route_client-reference-manifest.js +1 -1
  29. package/apps/web/.next/standalone/apps/web/.next/server/app/api/composio/connections/route_client-reference-manifest.js +1 -1
  30. package/apps/web/.next/standalone/apps/web/.next/server/app/api/composio/disconnect/route.js.nft.json +1 -1
  31. package/apps/web/.next/standalone/apps/web/.next/server/app/api/composio/disconnect/route_client-reference-manifest.js +1 -1
  32. package/apps/web/.next/standalone/apps/web/.next/server/app/api/composio/status/route.js.nft.json +1 -1
  33. package/apps/web/.next/standalone/apps/web/.next/server/app/api/composio/status/route_client-reference-manifest.js +1 -1
  34. package/apps/web/.next/standalone/apps/web/.next/server/app/api/composio/toolkits/route_client-reference-manifest.js +1 -1
  35. package/apps/web/.next/standalone/apps/web/.next/server/app/api/crm/calendar/[id]/route_client-reference-manifest.js +1 -1
  36. package/apps/web/.next/standalone/apps/web/.next/server/app/api/crm/calendar/route_client-reference-manifest.js +1 -1
  37. package/apps/web/.next/standalone/apps/web/.next/server/app/api/crm/companies/[id]/route_client-reference-manifest.js +1 -1
  38. package/apps/web/.next/standalone/apps/web/.next/server/app/api/crm/enrich/[type]/[id]/route_client-reference-manifest.js +1 -1
  39. package/apps/web/.next/standalone/apps/web/.next/server/app/api/crm/inbox/[threadId]/route_client-reference-manifest.js +1 -1
  40. package/apps/web/.next/standalone/apps/web/.next/server/app/api/crm/inbox/route_client-reference-manifest.js +1 -1
  41. package/apps/web/.next/standalone/apps/web/.next/server/app/api/crm/people/[id]/activity/route_client-reference-manifest.js +1 -1
  42. package/apps/web/.next/standalone/apps/web/.next/server/app/api/crm/people/[id]/route_client-reference-manifest.js +1 -1
  43. package/apps/web/.next/standalone/apps/web/.next/server/app/api/crm/people/route_client-reference-manifest.js +1 -1
  44. package/apps/web/.next/standalone/apps/web/.next/server/app/api/crm/photos/proxy/route_client-reference-manifest.js +1 -1
  45. package/apps/web/.next/standalone/apps/web/.next/server/app/api/crm/photos/sync/route_client-reference-manifest.js +1 -1
  46. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/heartbeat/route_client-reference-manifest.js +1 -1
  47. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/jobs/[jobId]/runs/route_client-reference-manifest.js +1 -1
  48. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/jobs/route_client-reference-manifest.js +1 -1
  49. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/runs/[sessionId]/route_client-reference-manifest.js +1 -1
  50. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/runs/search-transcript/route_client-reference-manifest.js +1 -1
  51. package/apps/web/.next/standalone/apps/web/.next/server/app/api/feedback/route.js +1 -1
  52. package/apps/web/.next/standalone/apps/web/.next/server/app/api/feedback/route_client-reference-manifest.js +1 -1
  53. package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/channels/route_client-reference-manifest.js +1 -1
  54. package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/chat/route_client-reference-manifest.js +1 -1
  55. package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/chat/stream/route_client-reference-manifest.js +1 -1
  56. package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/sessions/[id]/route_client-reference-manifest.js +1 -1
  57. package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/sessions/route_client-reference-manifest.js +1 -1
  58. package/apps/web/.next/standalone/apps/web/.next/server/app/api/integrations/[id]/toggle/route.js.nft.json +1 -1
  59. package/apps/web/.next/standalone/apps/web/.next/server/app/api/integrations/[id]/toggle/route_client-reference-manifest.js +1 -1
  60. package/apps/web/.next/standalone/apps/web/.next/server/app/api/integrations/repair/route.js.nft.json +1 -1
  61. package/apps/web/.next/standalone/apps/web/.next/server/app/api/integrations/repair/route_client-reference-manifest.js +1 -1
  62. package/apps/web/.next/standalone/apps/web/.next/server/app/api/integrations/route.js.nft.json +1 -1
  63. package/apps/web/.next/standalone/apps/web/.next/server/app/api/integrations/route_client-reference-manifest.js +1 -1
  64. package/apps/web/.next/standalone/apps/web/.next/server/app/api/memories/route_client-reference-manifest.js +1 -1
  65. package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/connections/route.js +1 -1
  66. package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/connections/route_client-reference-manifest.js +1 -1
  67. package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/dench-cloud/route.js +1 -1
  68. package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/dench-cloud/route.js.nft.json +1 -1
  69. package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/dench-cloud/route_client-reference-manifest.js +1 -1
  70. package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/identity/route.js +1 -1
  71. package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/identity/route_client-reference-manifest.js +1 -1
  72. package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/skill-template/consume/route_client-reference-manifest.js +1 -1
  73. package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/state/route.js +1 -1
  74. package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/state/route_client-reference-manifest.js +1 -1
  75. package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/sync/progress/route_client-reference-manifest.js +1 -1
  76. package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/sync/start/route.js +1 -1
  77. package/apps/web/.next/standalone/apps/web/.next/server/app/api/onboarding/sync/start/route_client-reference-manifest.js +1 -1
  78. package/apps/web/.next/standalone/apps/web/.next/server/app/api/profiles/route_client-reference-manifest.js +1 -1
  79. package/apps/web/.next/standalone/apps/web/.next/server/app/api/profiles/switch/route_client-reference-manifest.js +1 -1
  80. package/apps/web/.next/standalone/apps/web/.next/server/app/api/sessions/[sessionId]/route_client-reference-manifest.js +1 -1
  81. package/apps/web/.next/standalone/apps/web/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -1
  82. package/apps/web/.next/standalone/apps/web/.next/server/app/api/settings/cloud/route.js +1 -1
  83. package/apps/web/.next/standalone/apps/web/.next/server/app/api/settings/cloud/route.js.nft.json +1 -1
  84. package/apps/web/.next/standalone/apps/web/.next/server/app/api/settings/cloud/route_client-reference-manifest.js +1 -1
  85. package/apps/web/.next/standalone/apps/web/.next/server/app/api/settings/mcp/connect/callback/route_client-reference-manifest.js +1 -1
  86. package/apps/web/.next/standalone/apps/web/.next/server/app/api/settings/mcp/connect/start/route_client-reference-manifest.js +1 -1
  87. package/apps/web/.next/standalone/apps/web/.next/server/app/api/settings/mcp/connect/token/route_client-reference-manifest.js +1 -1
  88. package/apps/web/.next/standalone/apps/web/.next/server/app/api/settings/mcp/probe/route_client-reference-manifest.js +1 -1
  89. package/apps/web/.next/standalone/apps/web/.next/server/app/api/settings/mcp/route_client-reference-manifest.js +1 -1
  90. package/apps/web/.next/standalone/apps/web/.next/server/app/api/skills/[slug]/content/route_client-reference-manifest.js +1 -1
  91. package/apps/web/.next/standalone/apps/web/.next/server/app/api/skills/[slug]/route_client-reference-manifest.js +1 -1
  92. package/apps/web/.next/standalone/apps/web/.next/server/app/api/skills/browse/route_client-reference-manifest.js +1 -1
  93. package/apps/web/.next/standalone/apps/web/.next/server/app/api/skills/install/route_client-reference-manifest.js +1 -1
  94. package/apps/web/.next/standalone/apps/web/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  95. package/apps/web/.next/standalone/apps/web/.next/server/app/api/sync/poll-tick/route_client-reference-manifest.js +1 -1
  96. package/apps/web/.next/standalone/apps/web/.next/server/app/api/sync/refresh/route_client-reference-manifest.js +1 -1
  97. package/apps/web/.next/standalone/apps/web/.next/server/app/api/sync/status/route_client-reference-manifest.js +1 -1
  98. package/apps/web/.next/standalone/apps/web/.next/server/app/api/terminal/port/route_client-reference-manifest.js +1 -1
  99. package/apps/web/.next/standalone/apps/web/.next/server/app/api/voice/speech/route.js +1 -1
  100. package/apps/web/.next/standalone/apps/web/.next/server/app/api/voice/speech/route.js.nft.json +1 -1
  101. package/apps/web/.next/standalone/apps/web/.next/server/app/api/voice/speech/route_client-reference-manifest.js +1 -1
  102. package/apps/web/.next/standalone/apps/web/.next/server/app/api/voice/transcribe/route.js +1 -1
  103. package/apps/web/.next/standalone/apps/web/.next/server/app/api/voice/transcribe/route.js.nft.json +1 -1
  104. package/apps/web/.next/standalone/apps/web/.next/server/app/api/voice/transcribe/route_client-reference-manifest.js +1 -1
  105. package/apps/web/.next/standalone/apps/web/.next/server/app/api/voice/voices/route.js +1 -1
  106. package/apps/web/.next/standalone/apps/web/.next/server/app/api/voice/voices/route.js.nft.json +1 -1
  107. package/apps/web/.next/standalone/apps/web/.next/server/app/api/voice/voices/route_client-reference-manifest.js +1 -1
  108. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/[id]/messages/route_client-reference-manifest.js +1 -1
  109. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/[id]/route_client-reference-manifest.js +1 -1
  110. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/route.js +1 -1
  111. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/route_client-reference-manifest.js +1 -1
  112. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/assets/[...path]/route_client-reference-manifest.js +1 -1
  113. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/browse/route_client-reference-manifest.js +1 -1
  114. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/browse-file/route_client-reference-manifest.js +1 -1
  115. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/context/route_client-reference-manifest.js +1 -1
  116. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/copy/route_client-reference-manifest.js +1 -1
  117. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/db/introspect/route_client-reference-manifest.js +1 -1
  118. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/db/query/route_client-reference-manifest.js +1 -1
  119. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/delete/route.js +1 -1
  120. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/delete/route_client-reference-manifest.js +1 -1
  121. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/enrichment-status/route.js.nft.json +1 -1
  122. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/enrichment-status/route_client-reference-manifest.js +1 -1
  123. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/execute/route_client-reference-manifest.js +1 -1
  124. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/file/route_client-reference-manifest.js +1 -1
  125. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/init/route.js +1 -1
  126. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/init/route_client-reference-manifest.js +1 -1
  127. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/link-preview/route_client-reference-manifest.js +1 -1
  128. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/list/route_client-reference-manifest.js +1 -1
  129. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/mkdir/route_client-reference-manifest.js +1 -1
  130. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/move/route_client-reference-manifest.js +1 -1
  131. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/actions/route_client-reference-manifest.js +1 -1
  132. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/actions/runs/route_client-reference-manifest.js +1 -1
  133. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/display-field/route_client-reference-manifest.js +1 -1
  134. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/enrich/route.js.nft.json +1 -1
  135. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/enrich/route_client-reference-manifest.js +1 -1
  136. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/[id]/content/route_client-reference-manifest.js +1 -1
  137. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/[id]/route_client-reference-manifest.js +1 -1
  138. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/bulk-delete/route_client-reference-manifest.js +1 -1
  139. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/options/route_client-reference-manifest.js +1 -1
  140. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/route.js +1 -1
  141. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/route_client-reference-manifest.js +1 -1
  142. 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
  143. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/[fieldId]/route_client-reference-manifest.js +1 -1
  144. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/reorder/route_client-reference-manifest.js +1 -1
  145. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/route_client-reference-manifest.js +1 -1
  146. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/icon/route_client-reference-manifest.js +1 -1
  147. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/route_client-reference-manifest.js +1 -1
  148. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/views/route_client-reference-manifest.js +1 -1
  149. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/route_client-reference-manifest.js +1 -1
  150. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/open-file/route_client-reference-manifest.js +1 -1
  151. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/path-info/route_client-reference-manifest.js +1 -1
  152. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/query/route_client-reference-manifest.js +1 -1
  153. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/raw-file/route_client-reference-manifest.js +1 -1
  154. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/rename/route_client-reference-manifest.js +1 -1
  155. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/reports/execute/route.js +1 -1
  156. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/reports/execute/route_client-reference-manifest.js +1 -1
  157. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/search-index/route_client-reference-manifest.js +1 -1
  158. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/suggest-files/route_client-reference-manifest.js +1 -1
  159. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/switch/route.js +1 -1
  160. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/switch/route_client-reference-manifest.js +1 -1
  161. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/thumbnail/route_client-reference-manifest.js +1 -1
  162. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/tree/route_client-reference-manifest.js +1 -1
  163. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/upload/route.js +1 -1
  164. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/upload/route_client-reference-manifest.js +1 -1
  165. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/virtual-file/route_client-reference-manifest.js +1 -1
  166. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/watch/route_client-reference-manifest.js +1 -1
  167. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/write-binary/route_client-reference-manifest.js +1 -1
  168. package/apps/web/.next/standalone/apps/web/.next/server/app/onboarding/page.js +2 -2
  169. package/apps/web/.next/standalone/apps/web/.next/server/app/onboarding/page.js.nft.json +1 -1
  170. package/apps/web/.next/standalone/apps/web/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  171. package/apps/web/.next/standalone/apps/web/.next/server/app/page.js +4 -4
  172. package/apps/web/.next/standalone/apps/web/.next/server/app/page.js.nft.json +1 -1
  173. package/apps/web/.next/standalone/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
  174. package/apps/web/.next/standalone/apps/web/.next/server/app/workspace/page.js +2 -2
  175. package/apps/web/.next/standalone/apps/web/.next/server/app/workspace/page.js.nft.json +1 -1
  176. package/apps/web/.next/standalone/apps/web/.next/server/app/workspace/page_client-reference-manifest.js +1 -1
  177. package/apps/web/.next/standalone/apps/web/.next/server/app-paths-manifest.json +47 -47
  178. package/apps/web/.next/standalone/apps/web/.next/server/chunks/27221.js +15 -0
  179. package/apps/web/.next/standalone/apps/web/.next/server/chunks/27488.js +1 -1
  180. package/apps/web/.next/standalone/apps/web/.next/server/chunks/40192.js +1 -0
  181. package/apps/web/.next/standalone/apps/web/.next/server/chunks/44877.js +1 -1
  182. package/apps/web/.next/standalone/apps/web/.next/server/chunks/77515.js +1 -1
  183. package/apps/web/.next/standalone/apps/web/.next/server/chunks/80687.js +1 -1
  184. package/apps/web/.next/standalone/apps/web/.next/server/functions-config-manifest.json +10 -10
  185. package/apps/web/.next/standalone/apps/web/.next/server/pages/500.html +1 -1
  186. package/apps/web/.next/standalone/apps/web/.next/server/server-reference-manifest.json +1 -1
  187. package/apps/web/.next/{static/chunks/app/layout-4d3b6582305a2c9b.js → standalone/apps/web/.next/static/chunks/app/layout-0b073d606db56b76.js} +1 -1
  188. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/{page-a3d7c86fe4d822f9.js → page-91e10489bfb4d2cb.js} +1 -1
  189. package/apps/web/.next/standalone/apps/web/.next/static/css/df1d749df85dc392.css +1 -0
  190. package/apps/web/.next/standalone/apps/web/server.js +1 -1
  191. package/apps/web/.next/standalone/extensions/apollo-enrichment/index.mjs +294 -0
  192. package/apps/web/.next/standalone/extensions/apollo-enrichment/package.json +1 -1
  193. package/apps/web/.next/standalone/extensions/dench-ai-gateway/composio-bridge.ts +4 -1
  194. package/apps/web/.next/standalone/extensions/dench-ai-gateway/config-patch.ts +32 -0
  195. package/apps/web/.next/standalone/extensions/dench-ai-gateway/index.mjs +1128 -0
  196. package/apps/web/.next/standalone/extensions/dench-ai-gateway/index.ts +17 -5
  197. package/apps/web/.next/standalone/extensions/dench-ai-gateway/openclaw.plugin.json +10 -0
  198. package/apps/web/.next/standalone/extensions/dench-ai-gateway/package.json +1 -1
  199. package/apps/web/.next/standalone/extensions/dench-ai-gateway/sync-refresh-tools.ts +2 -2
  200. package/apps/web/.next/standalone/extensions/dench-identity/index.mjs +750 -0
  201. package/apps/web/.next/standalone/extensions/dench-identity/index.test.ts +11 -3
  202. package/apps/web/.next/standalone/extensions/dench-identity/index.ts +128 -8
  203. package/apps/web/.next/standalone/extensions/dench-identity/openclaw.plugin.json +8 -0
  204. package/apps/web/.next/standalone/extensions/dench-identity/package.json +1 -1
  205. package/apps/web/.next/standalone/extensions/exa-search/index.mjs +333 -0
  206. package/apps/web/.next/standalone/extensions/exa-search/package.json +1 -1
  207. package/apps/web/.next/standalone/extensions/posthog-analytics/index.mjs +786 -0
  208. package/apps/web/.next/standalone/extensions/posthog-analytics/lib/build-env.js +1 -1
  209. package/apps/web/.next/standalone/extensions/posthog-analytics/package.json +1 -1
  210. package/apps/web/.next/standalone/package.json +4 -2
  211. package/apps/web/.next/{standalone/apps/web/.next/static/chunks/app/layout-4d3b6582305a2c9b.js → static/chunks/app/layout-0b073d606db56b76.js} +1 -1
  212. package/apps/web/.next/static/chunks/app/{page-a3d7c86fe4d822f9.js → page-91e10489bfb4d2cb.js} +1 -1
  213. package/apps/web/.next/static/css/df1d749df85dc392.css +1 -0
  214. package/assets/seed/workspace.duckdb +0 -0
  215. package/dist/entry.js +1 -1
  216. package/dist/{program-JflTwsUD.js → program-BzTUdX93.js} +91 -2
  217. package/dist/{run-main-Db7zNm4h.js → run-main-DWpG1QJ-.js} +1 -1
  218. package/extensions/apollo-enrichment/index.mjs +294 -0
  219. package/extensions/apollo-enrichment/package.json +1 -1
  220. package/extensions/dench-ai-gateway/composio-bridge.ts +4 -1
  221. package/extensions/dench-ai-gateway/config-patch.ts +32 -0
  222. package/extensions/dench-ai-gateway/index.mjs +1128 -0
  223. package/extensions/dench-ai-gateway/index.ts +17 -5
  224. package/extensions/dench-ai-gateway/openclaw.plugin.json +10 -0
  225. package/extensions/dench-ai-gateway/package.json +1 -1
  226. package/extensions/dench-ai-gateway/sync-refresh-tools.ts +2 -2
  227. package/extensions/dench-identity/index.mjs +750 -0
  228. package/extensions/dench-identity/index.test.ts +11 -3
  229. package/extensions/dench-identity/index.ts +128 -8
  230. package/extensions/dench-identity/openclaw.plugin.json +8 -0
  231. package/extensions/dench-identity/package.json +1 -1
  232. package/extensions/exa-search/index.mjs +333 -0
  233. package/extensions/exa-search/package.json +1 -1
  234. package/extensions/posthog-analytics/index.mjs +786 -0
  235. package/extensions/posthog-analytics/lib/build-env.js +1 -1
  236. package/extensions/posthog-analytics/package.json +1 -1
  237. package/package.json +4 -2
  238. package/skills/dench-integrations/SKILL.md +2 -0
  239. package/apps/web/.next/standalone/apps/web/.next/server/chunks/6787.js +0 -15
  240. package/apps/web/.next/standalone/apps/web/.next/static/css/dd3ce8da3e14c080.css +0 -1
  241. package/apps/web/.next/static/css/dd3ce8da3e14c080.css +0 -1
  242. /package/apps/web/.next/standalone/apps/web/.next/static/{VIH2t9pSKK-Cy_SphlKAC → BJK3zoIUstVWHptp0v5ii}/_buildManifest.js +0 -0
  243. /package/apps/web/.next/standalone/apps/web/.next/static/{VIH2t9pSKK-Cy_SphlKAC → BJK3zoIUstVWHptp0v5ii}/_ssgManifest.js +0 -0
  244. /package/apps/web/.next/static/{VIH2t9pSKK-Cy_SphlKAC → BJK3zoIUstVWHptp0v5ii}/_buildManifest.js +0 -0
  245. /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 no-match guidance when a toolkit search has no matching tools", async () => {
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(0);
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("No Gmail integration tools matched");
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
- const items = asRecordArray(gatewayResult.items) ?? [];
1836
- const connectedToolkits = Array.isArray(gatewayResult.connected_toolkits)
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: 0,
1865
- results: [],
1968
+ result_count: fallbackResults.length,
1969
+ results: fallbackResults,
1866
1970
  connected_toolkits: connectedToolkits,
1867
- instruction: normalizedToolkit
1868
- ? `No ${humanizeResolverApp(normalizedToolkit)} integration tools matched. Refine the query or try a broader search.`
1869
- : "No integration tools matched. Refine the query or specify a toolkit.",
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,
@@ -4,7 +4,7 @@
4
4
  "private": true,
5
5
  "openclaw": {
6
6
  "extensions": [
7
- "./index.ts"
7
+ "./index.mjs"
8
8
  ]
9
9
  }
10
10
  }
@@ -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
+ };
@@ -4,7 +4,7 @@
4
4
  "private": true,
5
5
  "openclaw": {
6
6
  "extensions": [
7
- "./index.ts"
7
+ "./index.mjs"
8
8
  ]
9
9
  }
10
10
  }