nodal-agents 0.6.7 → 0.6.8

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 (144) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/runner.js +118 -18
  4. package/web/.next/BUILD_ID +1 -1
  5. package/web/.next/app-path-routes-manifest.json +2 -2
  6. package/web/.next/build-manifest.json +2 -2
  7. package/web/.next/prerender-manifest.json +3 -3
  8. package/web/.next/server/app/(dashboard)/agents/[id]/edit/page.js +3 -3
  9. package/web/.next/server/app/(dashboard)/agents/[id]/edit/page_client-reference-manifest.js +1 -1
  10. package/web/.next/server/app/(dashboard)/agents/[id]/telegram/page.js +2 -2
  11. package/web/.next/server/app/(dashboard)/agents/[id]/telegram/page.js.nft.json +1 -1
  12. package/web/.next/server/app/(dashboard)/agents/[id]/telegram/page_client-reference-manifest.js +1 -1
  13. package/web/.next/server/app/(dashboard)/agents/page.js +2 -2
  14. package/web/.next/server/app/(dashboard)/agents/page.js.nft.json +1 -1
  15. package/web/.next/server/app/(dashboard)/agents/page_client-reference-manifest.js +1 -1
  16. package/web/.next/server/app/(dashboard)/approvals/page.js +2 -2
  17. package/web/.next/server/app/(dashboard)/approvals/page.js.nft.json +1 -1
  18. package/web/.next/server/app/(dashboard)/approvals/page_client-reference-manifest.js +1 -1
  19. package/web/.next/server/app/(dashboard)/automations/page.js +2 -2
  20. package/web/.next/server/app/(dashboard)/automations/page.js.nft.json +1 -1
  21. package/web/.next/server/app/(dashboard)/automations/page_client-reference-manifest.js +1 -1
  22. package/web/.next/server/app/(dashboard)/chat/page.js +2 -2
  23. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  24. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  25. package/web/.next/server/app/(dashboard)/connectors/page.js +2 -2
  26. package/web/.next/server/app/(dashboard)/connectors/page.js.nft.json +1 -1
  27. package/web/.next/server/app/(dashboard)/connectors/page_client-reference-manifest.js +1 -1
  28. package/web/.next/server/app/(dashboard)/credentials/page.js +1 -1
  29. package/web/.next/server/app/(dashboard)/credentials/page.js.nft.json +1 -1
  30. package/web/.next/server/app/(dashboard)/credentials/page_client-reference-manifest.js +1 -1
  31. package/web/.next/server/app/(dashboard)/jobs/[id]/page.js +2 -2
  32. package/web/.next/server/app/(dashboard)/jobs/[id]/page.js.nft.json +1 -1
  33. package/web/.next/server/app/(dashboard)/jobs/[id]/page_client-reference-manifest.js +1 -1
  34. package/web/.next/server/app/(dashboard)/jobs/page.js +2 -2
  35. package/web/.next/server/app/(dashboard)/jobs/page.js.nft.json +1 -1
  36. package/web/.next/server/app/(dashboard)/jobs/page_client-reference-manifest.js +1 -1
  37. package/web/.next/server/app/(dashboard)/learned-skills/page.js +2 -2
  38. package/web/.next/server/app/(dashboard)/learned-skills/page_client-reference-manifest.js +1 -1
  39. package/web/.next/server/app/(dashboard)/llm-providers/page.js +2 -2
  40. package/web/.next/server/app/(dashboard)/llm-providers/page.js.nft.json +1 -1
  41. package/web/.next/server/app/(dashboard)/llm-providers/page_client-reference-manifest.js +1 -1
  42. package/web/.next/server/app/(dashboard)/logs/page.js +1 -1
  43. package/web/.next/server/app/(dashboard)/logs/page.js.nft.json +1 -1
  44. package/web/.next/server/app/(dashboard)/logs/page_client-reference-manifest.js +1 -1
  45. package/web/.next/server/app/(dashboard)/mcp/page.js +2 -2
  46. package/web/.next/server/app/(dashboard)/mcp/page_client-reference-manifest.js +1 -1
  47. package/web/.next/server/app/(dashboard)/memories/page.js +2 -2
  48. package/web/.next/server/app/(dashboard)/memories/page.js.nft.json +1 -1
  49. package/web/.next/server/app/(dashboard)/memories/page_client-reference-manifest.js +1 -1
  50. package/web/.next/server/app/(dashboard)/page.js +3 -3
  51. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  52. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  53. package/web/.next/server/app/(dashboard)/settings/page.js +2 -2
  54. package/web/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
  55. package/web/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
  56. package/web/.next/server/app/(dashboard)/settings/root-context/page.js +2 -2
  57. package/web/.next/server/app/(dashboard)/settings/root-context/page.js.nft.json +1 -1
  58. package/web/.next/server/app/(dashboard)/settings/root-context/page_client-reference-manifest.js +1 -1
  59. package/web/.next/server/app/(dashboard)/skills/[id]/edit/page.js +2 -2
  60. package/web/.next/server/app/(dashboard)/skills/[id]/edit/page.js.nft.json +1 -1
  61. package/web/.next/server/app/(dashboard)/skills/[id]/edit/page_client-reference-manifest.js +1 -1
  62. package/web/.next/server/app/(dashboard)/skills/new/page.js +2 -2
  63. package/web/.next/server/app/(dashboard)/skills/new/page.js.nft.json +1 -1
  64. package/web/.next/server/app/(dashboard)/skills/new/page_client-reference-manifest.js +1 -1
  65. package/web/.next/server/app/(dashboard)/skills/page.js +2 -2
  66. package/web/.next/server/app/(dashboard)/skills/page_client-reference-manifest.js +1 -1
  67. package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  68. package/web/.next/server/app/_global-error.html +1 -1
  69. package/web/.next/server/app/_global-error.rsc +2 -2
  70. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +2 -2
  71. package/web/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  72. package/web/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  73. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  74. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +2 -2
  75. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  76. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  77. package/web/.next/server/app/_not-found.html +1 -1
  78. package/web/.next/server/app/_not-found.rsc +3 -3
  79. package/web/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  80. package/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  81. package/web/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  82. package/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  83. package/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  84. package/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  85. package/web/.next/server/app/api/oauth/[provider]/callback/route.js +1 -1
  86. package/web/.next/server/app/login/page_client-reference-manifest.js +1 -1
  87. package/web/.next/server/app/onboarding/page.js +1288 -1288
  88. package/web/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  89. package/web/.next/server/app-paths-manifest.json +2 -2
  90. package/web/.next/server/chunks/2053.js +1 -0
  91. package/web/.next/server/chunks/2713.js +3 -3
  92. package/web/.next/server/chunks/{7495.js → 5290.js} +1 -1
  93. package/web/.next/server/chunks/9282.js +1 -0
  94. package/web/.next/server/middleware-build-manifest.js +1 -1
  95. package/web/.next/server/pages/404.html +1 -1
  96. package/web/.next/server/pages/500.html +1 -1
  97. package/web/.next/server/server-reference-manifest.js +1 -1
  98. package/web/.next/server/server-reference-manifest.json +1 -1
  99. package/web/.next/static/chunks/{9836-14f7e30f77745e80.js → 9836-6a7e70d2572d9671.js} +1 -1
  100. package/web/.next/static/chunks/app/(dashboard)/agents/[id]/edit/page-1172f97f44c6b953.js +6 -0
  101. package/web/.next/static/chunks/app/(dashboard)/agents/[id]/telegram/page-a858be2a0b9d5d42.js +1 -0
  102. package/web/.next/static/chunks/app/(dashboard)/agents/page-637555c8b299e4d7.js +1 -0
  103. package/web/.next/static/chunks/app/(dashboard)/approvals/{page-64cdc8de03714da8.js → page-6435e07096efe1ef.js} +1 -1
  104. package/web/.next/static/chunks/app/(dashboard)/automations/page-416f63bbd11d1a93.js +1 -0
  105. package/web/.next/static/chunks/app/(dashboard)/chat/page-53507d81c2ceee4c.js +1 -0
  106. package/web/.next/static/chunks/app/(dashboard)/connectors/page-f6a4d52ef7ea8c7f.js +1 -0
  107. package/web/.next/static/chunks/app/(dashboard)/jobs/[id]/page-acb7d1383384f27b.js +1 -0
  108. package/web/.next/static/chunks/app/(dashboard)/jobs/page-b82e456c240416ad.js +1 -0
  109. package/web/.next/static/chunks/app/(dashboard)/layout-d0662737b23eaebb.js +1 -0
  110. package/web/.next/static/chunks/app/(dashboard)/learned-skills/page-3c67b5a3869a9224.js +1 -0
  111. package/web/.next/static/chunks/app/(dashboard)/llm-providers/page-294135b03955dd45.js +1 -0
  112. package/web/.next/static/chunks/app/(dashboard)/logs/{page-69a02d29acd3d812.js → page-f9efb4dd80bf104a.js} +1 -1
  113. package/web/.next/static/chunks/app/(dashboard)/mcp/{page-3ddd2e2c8973fb2f.js → page-482dc02cf953c197.js} +1 -1
  114. package/web/.next/static/chunks/app/(dashboard)/memories/page-ce432008a8a4c118.js +1 -0
  115. package/web/.next/static/chunks/app/(dashboard)/page-d76a7350bf5bea10.js +1 -0
  116. package/web/.next/static/chunks/app/(dashboard)/settings/page-80cb948b3c0cef7d.js +1 -0
  117. package/web/.next/static/chunks/app/(dashboard)/settings/root-context/page-8e7dabbb399e369d.js +1 -0
  118. package/web/.next/static/chunks/app/(dashboard)/skills/[id]/edit/page-d20237d23a440118.js +1 -0
  119. package/web/.next/static/chunks/app/(dashboard)/skills/new/page-8454b37bed789c4e.js +1 -0
  120. package/web/.next/static/chunks/app/(dashboard)/skills/{page-c47e251b87d38cc7.js → page-af8d329facf31c8f.js} +1 -1
  121. package/web/.next/static/chunks/app/onboarding/page-3543225eab5f4029.js +26 -0
  122. package/web/.next/static/css/{9fc24595c3687cfb.css → b06a60c5d9b30bc8.css} +1 -1
  123. package/web/.next/server/chunks/4088.js +0 -1
  124. package/web/.next/server/chunks/4122.js +0 -1
  125. package/web/.next/static/chunks/app/(dashboard)/agents/[id]/edit/page-499eb81b66c74dc5.js +0 -6
  126. package/web/.next/static/chunks/app/(dashboard)/agents/[id]/telegram/page-e26c56155c37f38e.js +0 -1
  127. package/web/.next/static/chunks/app/(dashboard)/agents/page-f4c535f30d385857.js +0 -1
  128. package/web/.next/static/chunks/app/(dashboard)/automations/page-b654ebf59b7a0a76.js +0 -1
  129. package/web/.next/static/chunks/app/(dashboard)/chat/page-687c72476c5097c1.js +0 -1
  130. package/web/.next/static/chunks/app/(dashboard)/connectors/page-c417cceb9b25870c.js +0 -1
  131. package/web/.next/static/chunks/app/(dashboard)/jobs/[id]/page-4a258111bca49454.js +0 -1
  132. package/web/.next/static/chunks/app/(dashboard)/jobs/page-4ef0c0002fb31c13.js +0 -1
  133. package/web/.next/static/chunks/app/(dashboard)/layout-04e80131398f1551.js +0 -1
  134. package/web/.next/static/chunks/app/(dashboard)/learned-skills/page-31b01dbe3baa44cc.js +0 -1
  135. package/web/.next/static/chunks/app/(dashboard)/llm-providers/page-96df36ea1bf14242.js +0 -1
  136. package/web/.next/static/chunks/app/(dashboard)/memories/page-2e127cc802ee8e72.js +0 -1
  137. package/web/.next/static/chunks/app/(dashboard)/page-a25fd0011e21ba38.js +0 -1
  138. package/web/.next/static/chunks/app/(dashboard)/settings/page-06062fc5a2d536f6.js +0 -1
  139. package/web/.next/static/chunks/app/(dashboard)/settings/root-context/page-fd80a1645212a6d1.js +0 -1
  140. package/web/.next/static/chunks/app/(dashboard)/skills/[id]/edit/page-59bb2de0f81b5ed6.js +0 -1
  141. package/web/.next/static/chunks/app/(dashboard)/skills/new/page-0970daf889c085c9.js +0 -1
  142. package/web/.next/static/chunks/app/onboarding/page-995403cba38e26cc.js +0 -26
  143. /package/web/.next/static/{vB-0ke6pDH6vYyme7Pz5G → RORb5LJdSgtd7i6KVr0zl}/_buildManifest.js +0 -0
  144. /package/web/.next/static/{vB-0ke6pDH6vYyme7Pz5G → RORb5LJdSgtd7i6KVr0zl}/_ssgManifest.js +0 -0
package/README.md CHANGED
@@ -10,7 +10,7 @@ A self-hosted platform for building and orchestrating a **team of AI agents** on
10
10
  [![Node](https://img.shields.io/badge/node-22%2B-339933?logo=node.js&logoColor=white)](https://nodejs.org)
11
11
  [![TypeScript](https://img.shields.io/badge/typescript-strict-3178c6?logo=typescript&logoColor=white)](https://www.typescriptlang.org)
12
12
  [![Docs](https://img.shields.io/badge/docs-online-3565ff)](https://kwintspiracy.github.io/nodal-agents/)
13
- [![Changelog](https://img.shields.io/badge/changelog-v0.6.7-d4ff2e)](CHANGELOG.md)
13
+ [![Changelog](https://img.shields.io/badge/changelog-v0.6.8-d4ff2e)](CHANGELOG.md)
14
14
 
15
15
  | Home dashboard — light theme | Agent detail — dark theme |
16
16
  | :---: | :---: |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodal-agents",
3
- "version": "0.6.7",
3
+ "version": "0.6.8",
4
4
  "description": "Local-first AI agent platform with a web dashboard — install in one command.",
5
5
  "license": "MIT",
6
6
  "repository": {
package/runner.js CHANGED
@@ -19575,13 +19575,6 @@ var WhitelistDriftError = class extends Error {
19575
19575
  undeclaredTools;
19576
19576
  code = "whitelist_drift";
19577
19577
  };
19578
- var WebSearchNotConfiguredError = class extends Error {
19579
- code = "web_search_not_configured";
19580
- constructor() {
19581
- super("web_search_not_configured");
19582
- this.name = "WebSearchNotConfiguredError";
19583
- }
19584
- };
19585
19578
 
19586
19579
  // ../../packages/tools/src/registry.ts
19587
19580
  function createToolRegistry() {
@@ -20584,17 +20577,80 @@ import { z as z25 } from "zod";
20584
20577
  var WebSearchInputSchema = z25.object({
20585
20578
  query: z25.string().min(1).describe("The search query.")
20586
20579
  });
20580
+ var DEGRADED_GUIDANCE = "Free best-effort web search failed (it can be rate-limited or blocked). For reliable results, add a Tavily key (free tier) in the dashboard under Connectors, and I'll use it automatically.";
20581
+ var DDG_ENDPOINT = "https://html.duckduckgo.com/html/";
20582
+ function stripHtml(html) {
20583
+ return html.replace(/<[^>]*>/g, "").replace(/&amp;/g, "&").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&quot;/g, '"').replace(/&#x27;/g, "'").replace(/&#39;/g, "'").replace(/&nbsp;/g, " ").replace(/\s+/g, " ").trim();
20584
+ }
20585
+ function resolveDdgHref(href) {
20586
+ const normalized = href.startsWith("//") ? `https:${href}` : href;
20587
+ const uddg = normalized.match(/[?&]uddg=([^&]+)/);
20588
+ if (uddg?.[1]) {
20589
+ try {
20590
+ return decodeURIComponent(uddg[1]);
20591
+ } catch {
20592
+ }
20593
+ }
20594
+ return normalized;
20595
+ }
20596
+ function parseDuckDuckGoHtml(html) {
20597
+ const results = [];
20598
+ const anchorRe = /<a[^>]*class="[^"]*result__a[^"]*"[^>]*href="([^"]+)"[^>]*>([\s\S]*?)<\/a>/gi;
20599
+ const snippetRe = /<a[^>]*class="[^"]*result__snippet[^"]*"[^>]*>([\s\S]*?)<\/a>/gi;
20600
+ let match;
20601
+ while ((match = anchorRe.exec(html)) !== null) {
20602
+ const href = match[1];
20603
+ const rawTitle = match[2];
20604
+ if (!href || rawTitle === void 0) continue;
20605
+ const title = stripHtml(rawTitle);
20606
+ const url2 = resolveDdgHref(href);
20607
+ if (!title || !url2) continue;
20608
+ snippetRe.lastIndex = anchorRe.lastIndex;
20609
+ const snippetMatch = snippetRe.exec(html);
20610
+ const snippet = snippetMatch?.[1] ? stripHtml(snippetMatch[1]) : "";
20611
+ results.push({ title, url: url2, snippet });
20612
+ }
20613
+ return results;
20614
+ }
20615
+ async function duckDuckGoSearch(query) {
20616
+ let html;
20617
+ try {
20618
+ const res = await fetch(DDG_ENDPOINT, {
20619
+ // The html endpoint blocks GET (returns 202 with an empty challenge page)
20620
+ // but serves 200 + real results for a form POST. A browser-ish UA is also
20621
+ // required (bare requests are refused).
20622
+ method: "POST",
20623
+ headers: {
20624
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36",
20625
+ Accept: "text/html",
20626
+ "Content-Type": "application/x-www-form-urlencoded"
20627
+ },
20628
+ body: "q=" + encodeURIComponent(query)
20629
+ });
20630
+ if (!res.ok) {
20631
+ return { results: [], degraded: true, guidance: DEGRADED_GUIDANCE };
20632
+ }
20633
+ html = await res.text();
20634
+ } catch {
20635
+ return { results: [], degraded: true, guidance: DEGRADED_GUIDANCE };
20636
+ }
20637
+ const results = parseDuckDuckGoHtml(html);
20638
+ if (results.length === 0) {
20639
+ return { results: [], degraded: true, guidance: DEGRADED_GUIDANCE };
20640
+ }
20641
+ return { results };
20642
+ }
20587
20643
  var webSearchTool = {
20588
20644
  name: "web_search",
20589
- description: "Search the web for current information. Use when you need up-to-date data, news, or any facts you are not sure about.",
20645
+ description: "Search the web. Uses your configured Tavily/Firecrawl provider if any, otherwise a free best-effort search.",
20590
20646
  inputSchema: WebSearchInputSchema,
20591
20647
  riskLevel: "read",
20592
- execute: async (_input, _ctx) => {
20593
- const searchUrl = process.env["NODALAI_WEB_SEARCH_URL"];
20594
- if (!searchUrl) {
20595
- throw new WebSearchNotConfiguredError();
20648
+ execute: async (input, ctx) => {
20649
+ if (ctx.searchBackend) {
20650
+ const { results } = await ctx.searchBackend(input.query);
20651
+ return { results };
20596
20652
  }
20597
- throw new WebSearchNotConfiguredError();
20653
+ return duckDuckGoSearch(input.query);
20598
20654
  }
20599
20655
  };
20600
20656
 
@@ -23519,6 +23575,7 @@ var ALWAYS_ON_TOOLS = [
23519
23575
  "search_history",
23520
23576
  "mark_memory_helpful",
23521
23577
  "mark_memory_outdated",
23578
+ "web_search",
23522
23579
  "dashboard_publish",
23523
23580
  "file_read",
23524
23581
  "file_write",
@@ -23536,6 +23593,7 @@ var ALWAYS_ON_TOOL_DOCS = [
23536
23593
  { name: searchHistoryTool.name, description: searchHistoryTool.description },
23537
23594
  { name: markMemoryHelpfulTool.name, description: markMemoryHelpfulTool.description },
23538
23595
  { name: markMemoryOutdatedTool.name, description: markMemoryOutdatedTool.description },
23596
+ { name: webSearchTool.name, description: webSearchTool.description },
23539
23597
  { name: dashboardPublishTool.name, description: dashboardPublishTool.description },
23540
23598
  { name: fileReadTool.name, description: fileReadTool.description },
23541
23599
  { name: fileWriteTool.name, description: fileWriteTool.description },
@@ -27325,7 +27383,7 @@ function decodeBase64Url(encoded) {
27325
27383
  return "";
27326
27384
  }
27327
27385
  }
27328
- function stripHtml(html) {
27386
+ function stripHtml2(html) {
27329
27387
  return html.replace(/<style[^>]*>[\s\S]*?<\/style>/gi, "").replace(/<script[^>]*>[\s\S]*?<\/script>/gi, "").replace(/<[^>]+>/g, " ").replace(/&nbsp;/gi, " ").replace(/&amp;/gi, "&").replace(/&lt;/gi, "<").replace(/&gt;/gi, ">").replace(/&quot;/gi, '"').replace(/&#39;/gi, "'").replace(/[ \t]+/g, " ").replace(/\n\s*\n\s*\n/g, "\n\n").trim();
27330
27388
  }
27331
27389
  function decodePartBody(part) {
@@ -27340,7 +27398,7 @@ function extractTextFromPayload(payload) {
27340
27398
  return decodePartBody(payload);
27341
27399
  }
27342
27400
  if (mime.startsWith("text/html")) {
27343
- return stripHtml(decodePartBody(payload));
27401
+ return stripHtml2(decodePartBody(payload));
27344
27402
  }
27345
27403
  if (mime.startsWith("multipart/")) {
27346
27404
  const parts = payload.parts ?? [];
@@ -42081,6 +42139,44 @@ var TOOL_PROVISIONING = {
42081
42139
  },
42082
42140
  encrypt
42083
42141
  };
42142
+ async function resolveSearchBackend(db, agentId) {
42143
+ const rows = await db.select({
42144
+ slug: connectors.slug,
42145
+ apiKey: connectors.apiKey
42146
+ }).from(agentConnectorAssignments).innerJoin(connectors, eq5(connectors.id, agentConnectorAssignments.connectorId)).where(eq5(agentConnectorAssignments.agentId, agentId));
42147
+ for (const slug of ["tavily", "firecrawl"]) {
42148
+ const row = rows.find((r) => r.slug === slug);
42149
+ if (!row?.apiKey) continue;
42150
+ let key;
42151
+ try {
42152
+ key = decrypt(row.apiKey);
42153
+ } catch {
42154
+ continue;
42155
+ }
42156
+ const entry = ADAPTER_REGISTRY[slug];
42157
+ if (!entry) continue;
42158
+ const toolName = slug === "tavily" ? "tavily_search" : "firecrawl_search";
42159
+ const searchTool = entry.toolFactory(key).find((t) => t.name === toolName);
42160
+ if (!searchTool) continue;
42161
+ return async (query) => {
42162
+ const out = await searchTool.execute({ query }, {
42163
+ jobId: "",
42164
+ agentId,
42165
+ entityId: "",
42166
+ db,
42167
+ jobChatId: null
42168
+ });
42169
+ const results = (out.results ?? []).map((r) => ({
42170
+ title: r.title ?? "",
42171
+ url: r.url ?? "",
42172
+ // Tavily → `content`; Firecrawl → `description`.
42173
+ snippet: r.content ?? r.description ?? ""
42174
+ }));
42175
+ return { results };
42176
+ };
42177
+ }
42178
+ return void 0;
42179
+ }
42084
42180
  var DELIVERY_TOOL_NAMES = /* @__PURE__ */ new Set([
42085
42181
  "telegram_send_message",
42086
42182
  "send_image",
@@ -42328,6 +42424,7 @@ async function runJob(jobId, deps, runnerEnv, opts) {
42328
42424
  const scriptAuthorizedSkillSlugs = assignedSkillRows.filter((r) => r.scriptsAuthorized).map((r) => r.slug);
42329
42425
  const fileWritableSkillSlugs = assignedSkillRows.filter((r) => r.filesWritable).map((r) => r.slug);
42330
42426
  const skillStore = skillStoreDir(job.entityId);
42427
+ const searchBackend = await resolveSearchBackend(db, agentRow.id);
42331
42428
  if (!agentRow.llmKeyId) {
42332
42429
  await failJob(db, jobId, "agent_no_llm_configured", runStats(), messages);
42333
42430
  return { status: "failed", error: "agent_no_llm_configured" };
@@ -42647,7 +42744,8 @@ async function runJob(jobId, deps, runnerEnv, opts) {
42647
42744
  assignedSkillSlugs,
42648
42745
  scriptAuthorizedSkillSlugs,
42649
42746
  fileWritableSkillSlugs,
42650
- provisioning: TOOL_PROVISIONING
42747
+ provisioning: TOOL_PROVISIONING,
42748
+ searchBackend
42651
42749
  },
42652
42750
  {
42653
42751
  approvalRules: resumeApprovalRules,
@@ -43059,7 +43157,8 @@ async function runJob(jobId, deps, runnerEnv, opts) {
43059
43157
  assignedSkillSlugs,
43060
43158
  scriptAuthorizedSkillSlugs,
43061
43159
  fileWritableSkillSlugs,
43062
- provisioning: TOOL_PROVISIONING
43160
+ provisioning: TOOL_PROVISIONING,
43161
+ searchBackend
43063
43162
  };
43064
43163
  const sharedToolOpts = {
43065
43164
  approvalRules: approvalRuleList,
@@ -43190,7 +43289,8 @@ async function runJob(jobId, deps, runnerEnv, opts) {
43190
43289
  assignedSkillSlugs,
43191
43290
  scriptAuthorizedSkillSlugs,
43192
43291
  fileWritableSkillSlugs,
43193
- provisioning: TOOL_PROVISIONING
43292
+ provisioning: TOOL_PROVISIONING,
43293
+ searchBackend
43194
43294
  },
43195
43295
  {
43196
43296
  approvalRules: approvalRuleList,
@@ -1 +1 @@
1
- vB-0ke6pDH6vYyme7Pz5G
1
+ RORb5LJdSgtd7i6KVr0zl
@@ -24,9 +24,9 @@
24
24
  "/(dashboard)/logs/page": "/logs",
25
25
  "/(dashboard)/mcp/page": "/mcp",
26
26
  "/(dashboard)/memories/page": "/memories",
27
- "/(dashboard)/settings/root-context/page": "/settings/root-context",
28
- "/(dashboard)/page": "/",
29
27
  "/(dashboard)/settings/page": "/settings",
28
+ "/(dashboard)/page": "/",
29
+ "/(dashboard)/settings/root-context/page": "/settings/root-context",
30
30
  "/(dashboard)/skills/[id]/edit/page": "/skills/[id]/edit",
31
31
  "/(dashboard)/skills/page": "/skills"
32
32
  }
@@ -4,8 +4,8 @@
4
4
  ],
5
5
  "devFiles": [],
6
6
  "lowPriorityFiles": [
7
- "static/vB-0ke6pDH6vYyme7Pz5G/_buildManifest.js",
8
- "static/vB-0ke6pDH6vYyme7Pz5G/_ssgManifest.js"
7
+ "static/RORb5LJdSgtd7i6KVr0zl/_buildManifest.js",
8
+ "static/RORb5LJdSgtd7i6KVr0zl/_ssgManifest.js"
9
9
  ],
10
10
  "rootMainFiles": [
11
11
  "static/chunks/webpack-3741bf0a7636d65e.js",
@@ -54,8 +54,8 @@
54
54
  "dynamicRoutes": {},
55
55
  "notFoundRoutes": [],
56
56
  "preview": {
57
- "previewModeId": "3ddad284aca041171a552f29c79b2200",
58
- "previewModeSigningKey": "f2ff4ccd9469bedec6018f452f10feb96216a89db18329912414b8fc3c4cb1af",
59
- "previewModeEncryptionKey": "9a716beb1723a56c4e5ebee6c2b7f7efc7dad2855ea8eca4ff499e88c104f0c1"
57
+ "previewModeId": "0fe1567311ac81058123d2fb29f471aa",
58
+ "previewModeSigningKey": "d42bb4f2e429384a32bfb655168a3f79da18f56daff5a3f3f76ee18b63cb0a44",
59
+ "previewModeEncryptionKey": "ba9fd61dfd6daabaa848e4ac8b5f2a9e61c371b568524018b3fbe46345657779"
60
60
  }
61
61
  }