@tool-bridge/server 0.13.1 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/dist/{airtable-UNWCQOO5.js → airtable-NVGQVZJW.js} +4 -4
  2. package/dist/{alt_text_generator_ai-7U2B7DWL.js → alt_text_generator_ai-WF7NHVWE.js} +4 -4
  3. package/dist/{amap-SAB3CM4I.js → amap-EPI7AQ4O.js} +4 -4
  4. package/dist/{anthropic-IHWDMPTS.js → anthropic-KVYWBZIV.js} +4 -4
  5. package/dist/{apify-PJOKBSVM.js → apify-MB56RQIA.js} +4 -4
  6. package/dist/{brave_search-UTFAT6LW.js → brave_search-JDAGJ7PO.js} +4 -4
  7. package/dist/{chunk-EF33TVRV.js → chunk-ABHHWYEV.js} +154 -189
  8. package/dist/{chunk-QMBAFKBX.js → chunk-BWGAV3MR.js} +2 -2
  9. package/dist/{chunk-YZMU3Y2S.js → chunk-CDOWN2AB.js} +1 -1
  10. package/dist/{chunk-7KSQ6GMZ.js → chunk-HGIPJFHA.js} +1 -1
  11. package/dist/{chunk-O7XJFJIP.js → chunk-X6LLG5OZ.js} +2 -2
  12. package/dist/{circleci-CYNZ4RNR.js → circleci-2IL5RU2O.js} +4 -4
  13. package/dist/{clerk-LEO34VS5.js → clerk-A5YYGWYM.js} +4 -4
  14. package/dist/{cloudflare_dns-GR2QRDOR.js → cloudflare_dns-GUA5BUWO.js} +4 -4
  15. package/dist/{cohere-GGMHBGBX.js → cohere-BS27QMKR.js} +4 -4
  16. package/dist/{confluence-BV3HXUK5.js → confluence-675IWLHU.js} +4 -4
  17. package/dist/{convertapi-GS2YMFYF.js → convertapi-DGKXP2T3.js} +4 -4
  18. package/dist/{currencyapi-PVT6NG64.js → currencyapi-PFH3UKVU.js} +4 -4
  19. package/dist/{deepseek-N3A33XJS.js → deepseek-5U3STDGY.js} +4 -4
  20. package/dist/{docker_hub-T52LCIXM.js → docker_hub-UVXRU2L3.js} +4 -4
  21. package/dist/{dropbox-7D5KGZWB.js → dropbox-BC54XUXF.js} +4 -4
  22. package/dist/{dub-4MYONVIJ.js → dub-GV5M6PWD.js} +4 -4
  23. package/dist/{e2b-D4RJYFWX.js → e2b-KEQ3PYPV.js} +4 -4
  24. package/dist/{exa-QY3FJWKM.js → exa-OGQR7D47.js} +4 -4
  25. package/dist/{fal_ai-KZWNB4EL.js → fal_ai-ULI6YF4O.js} +4 -4
  26. package/dist/{feishu-5A2BTU5Z.js → feishu-YWLRRUGP.js} +3 -3
  27. package/dist/{feishu_custom_bot-JSPSGC7F.js → feishu_custom_bot-7HP4UHB7.js} +4 -4
  28. package/dist/{figma-SLJPNPIA.js → figma-BFGC24YI.js} +4 -4
  29. package/dist/{firehydrant-RWAQFAPG.js → firehydrant-R6DG7SBL.js} +4 -4
  30. package/dist/{fixer-KN7PNA2S.js → fixer-ZVXOVTMF.js} +4 -4
  31. package/dist/{fly-EUUMRUOA.js → fly-EBKWMDWV.js} +4 -4
  32. package/dist/{front-NDQEA5FF.js → front-CFWVIQYX.js} +4 -4
  33. package/dist/{geocodio-43AW5OCB.js → geocodio-N27RDBFV.js} +4 -4
  34. package/dist/{ghost-MZCUCRIB.js → ghost-2HT2SJYO.js} +4 -4
  35. package/dist/{github-2DAQEJIN.js → github-ZDLAIRXP.js} +4 -4
  36. package/dist/{gmail-XHLM4BQE.js → gmail-TICKPP6S.js} +4 -4
  37. package/dist/{googlecalendar-C6TQ5TPM.js → googlecalendar-GUR47UTF.js} +4 -4
  38. package/dist/{googledocs-PHWMCVQJ.js → googledocs-QGDIJA4S.js} +4 -4
  39. package/dist/{grafana-34MZYU2V.js → grafana-33Y3WEU5.js} +4 -4
  40. package/dist/{graphhopper-X6APDY3M.js → graphhopper-KWTMYEVH.js} +4 -4
  41. package/dist/index.d.ts +8 -9
  42. package/dist/index.js +2 -2
  43. package/dist/{ip2proxy-AODVERWD.js → ip2proxy-4SAYDJPQ.js} +4 -4
  44. package/dist/{ipgeolocation_io-2WZ3462V.js → ipgeolocation_io-4WT2WKHF.js} +4 -4
  45. package/dist/{ipqualityscore-AWRQEQKM.js → ipqualityscore-VGZCROJJ.js} +4 -4
  46. package/dist/{jina_ai-BTBWMSHI.js → jina_ai-X5VJVORK.js} +4 -4
  47. package/dist/{jira-ME62KT7T.js → jira-XUAF2UPM.js} +4 -4
  48. package/dist/{langsmith-X4V62JDO.js → langsmith-RRLFNL6D.js} +4 -4
  49. package/dist/{lemlist-X2F4X4XI.js → lemlist-KQKG6JHM.js} +4 -4
  50. package/dist/{linear-NXXHNHYR.js → linear-I32UBCBL.js} +4 -4
  51. package/dist/{logsnag-CMNFM5DD.js → logsnag-TVNUQEM7.js} +4 -4
  52. package/dist/main.js +101 -101
  53. package/dist/{mattermost-UUPXATVV.js → mattermost-OCIA7Z4P.js} +4 -4
  54. package/dist/{mem0-J4ZT6KFD.js → mem0-FARYP2ZM.js} +4 -4
  55. package/dist/{memos-O7OLF43F.js → memos-6M6QEUYI.js} +4 -4
  56. package/dist/{metabase-LW5CT4SE.js → metabase-VCNMPHIR.js} +4 -4
  57. package/dist/{mistral_ai-UBPH5I2O.js → mistral_ai-SMPVEWBM.js} +4 -4
  58. package/dist/{mother_duck-FSXTF7W3.js → mother_duck-CMHFH5A6.js} +4 -4
  59. package/dist/{ngrok-7ZEFTQFO.js → ngrok-WRQJ3X54.js} +4 -4
  60. package/dist/{notes-E2SOGAC5.js → notes-HLPED7H7.js} +2 -2
  61. package/dist/{notion-6L2B5SOP.js → notion-FFCK2KZ4.js} +4 -4
  62. package/dist/{open_exchange_rates-5MEDCXDA.js → open_exchange_rates-VKQICRS6.js} +4 -4
  63. package/dist/{openai-DGZ4UVGN.js → openai-PJDJ2AZ2.js} +4 -4
  64. package/dist/{opengraph_io-3WZHS2G7.js → opengraph_io-DMQQXMEC.js} +4 -4
  65. package/dist/{openrouter-AEVJKGL2.js → openrouter-I52ZZHQT.js} +4 -4
  66. package/dist/{outline-NIDSWKQL.js → outline-I6EIBEHQ.js} +4 -4
  67. package/dist/{paddle-KXUMVYWP.js → paddle-4DU7GKCS.js} +4 -4
  68. package/dist/{perplexity-SGCXVRPL.js → perplexity-DE6K444O.js} +4 -4
  69. package/dist/{pinecone-TEPE2YN6.js → pinecone-KMRF5YWJ.js} +4 -4
  70. package/dist/{pipedrive-HSLALJJF.js → pipedrive-4OC5UU3L.js} +4 -4
  71. package/dist/{polar-W3MS7L3S.js → polar-OACUFN7P.js} +4 -4
  72. package/dist/{posthog-Q26LDFUB.js → posthog-PSGNT66O.js} +4 -4
  73. package/dist/{postmark-Y4CGMQ6N.js → postmark-CSOVREPD.js} +4 -4
  74. package/dist/{prerender-ZXDEGJFM.js → prerender-B7M6SAIA.js} +4 -4
  75. package/dist/{pubmed-M5D6VUDC.js → pubmed-JJ5URMS6.js} +4 -4
  76. package/dist/{railway-IMKRAE5U.js → railway-VO42EWHC.js} +4 -4
  77. package/dist/{readwise-KVO2HGRR.js → readwise-O7I4HLU4.js} +4 -4
  78. package/dist/{render-PCF3BY2W.js → render-24X3H3WB.js} +4 -4
  79. package/dist/{replicate-SPYM2A2X.js → replicate-TO6OPISC.js} +4 -4
  80. package/dist/{resend-J2VSMZEQ.js → resend-IBVGUV4X.js} +4 -4
  81. package/dist/{rootly-XLVVLQ5E.js → rootly-MD5GFDUC.js} +4 -4
  82. package/dist/{scrapfly-4MCQ2L3S.js → scrapfly-ZKDGE4IL.js} +4 -4
  83. package/dist/{scrapingbee-I5B45KRL.js → scrapingbee-2FVX2BFI.js} +4 -4
  84. package/dist/{screenshot_fyi-ZRVS7KGW.js → screenshot_fyi-HNPNS43Z.js} +4 -4
  85. package/dist/{semantic_scholar-EOOCAOGH.js → semantic_scholar-EJ2CYAKO.js} +4 -4
  86. package/dist/{sentry-NQFN5QWM.js → sentry-DXB3CQZA.js} +4 -4
  87. package/dist/{shodan-NA4YQ5EF.js → shodan-HEFZ6NHP.js} +4 -4
  88. package/dist/{shopify-SSQWQLVZ.js → shopify-SUN5J257.js} +4 -4
  89. package/dist/{stripe-4O4LFWWX.js → stripe-N3HNTHD5.js} +4 -4
  90. package/dist/{supabase-L6HIG3AO.js → supabase-IMZ6YRES.js} +4 -4
  91. package/dist/{tavily-YIZ257JR.js → tavily-QMPSOIGW.js} +4 -4
  92. package/dist/{telegram-GCHRPOUO.js → telegram-SHZX3C73.js} +4 -4
  93. package/dist/{telnyx-SAPDG42W.js → telnyx-SF6KMQ7W.js} +4 -4
  94. package/dist/{todoist-PLWNX5EV.js → todoist-Y252DAZ2.js} +4 -4
  95. package/dist/{trello-P373RD2Z.js → trello-BTRC6I5Y.js} +4 -4
  96. package/dist/{turso-UOK734KL.js → turso-SB4KFTUP.js} +4 -4
  97. package/dist/{twilio-QTZ5B5JF.js → twilio-CRRJZ6MR.js} +4 -4
  98. package/dist/{umami-JR24H6UL.js → umami-7PJKITQ5.js} +4 -4
  99. package/dist/{unsplash-2REBXIN5.js → unsplash-PYZXMXH2.js} +4 -4
  100. package/dist/{upstash_redis-JW5CLN3M.js → upstash_redis-L2IJTHFW.js} +4 -4
  101. package/dist/{uptimerobot-T7ZY334I.js → uptimerobot-XDYEYFJQ.js} +4 -4
  102. package/dist/{v2ex-OZXEQ7YR.js → v2ex-TNACDCAO.js} +4 -4
  103. package/dist/{vercel-IRS2BQMP.js → vercel-QRU4UC5M.js} +4 -4
  104. package/dist/{wolfram_alpha_api-FXO3FCL6.js → wolfram_alpha_api-TS663Q5L.js} +4 -4
  105. package/dist/{wordpress-HDJP5IKC.js → wordpress-RTEUS26Y.js} +4 -4
  106. package/dist/{workos-HDXADI3J.js → workos-4NGPU4VP.js} +4 -4
  107. package/dist/{zhihu-6MRZYPMO.js → zhihu-GGLOXAVO.js} +4 -4
  108. package/package.json +4 -4
@@ -2,15 +2,15 @@ import {
2
2
  createProviderPlugin,
3
3
  requireApiKey,
4
4
  upstreamError
5
- } from "./chunk-QMBAFKBX.js";
5
+ } from "./chunk-BWGAV3MR.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-7KSQ6GMZ.js";
9
- import "./chunk-YZMU3Y2S.js";
8
+ } from "./chunk-HGIPJFHA.js";
9
+ import "./chunk-CDOWN2AB.js";
10
10
  import {
11
11
  TBError,
12
12
  external_exports
13
- } from "./chunk-EF33TVRV.js";
13
+ } from "./chunk-ABHHWYEV.js";
14
14
  import "./chunk-MLKGABMK.js";
15
15
 
16
16
  // ../plugins/src/airtable/api.ts
@@ -2,15 +2,15 @@ import {
2
2
  createProviderPlugin,
3
3
  requireApiKey,
4
4
  upstreamError
5
- } from "./chunk-QMBAFKBX.js";
5
+ } from "./chunk-BWGAV3MR.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-7KSQ6GMZ.js";
9
- import "./chunk-YZMU3Y2S.js";
8
+ } from "./chunk-HGIPJFHA.js";
9
+ import "./chunk-CDOWN2AB.js";
10
10
  import {
11
11
  TBError,
12
12
  external_exports
13
- } from "./chunk-EF33TVRV.js";
13
+ } from "./chunk-ABHHWYEV.js";
14
14
  import "./chunk-MLKGABMK.js";
15
15
 
16
16
  // ../plugins/src/alt_text_generator_ai/schema.ts
@@ -2,15 +2,15 @@ import {
2
2
  createProviderPlugin,
3
3
  requireApiKey,
4
4
  upstreamError
5
- } from "./chunk-QMBAFKBX.js";
5
+ } from "./chunk-BWGAV3MR.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-7KSQ6GMZ.js";
9
- import "./chunk-YZMU3Y2S.js";
8
+ } from "./chunk-HGIPJFHA.js";
9
+ import "./chunk-CDOWN2AB.js";
10
10
  import {
11
11
  TBError,
12
12
  external_exports
13
- } from "./chunk-EF33TVRV.js";
13
+ } from "./chunk-ABHHWYEV.js";
14
14
  import "./chunk-MLKGABMK.js";
15
15
 
16
16
  // ../plugins/src/amap/api.ts
@@ -2,15 +2,15 @@ import {
2
2
  createProviderPlugin,
3
3
  requireApiKey,
4
4
  upstreamError
5
- } from "./chunk-QMBAFKBX.js";
5
+ } from "./chunk-BWGAV3MR.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-7KSQ6GMZ.js";
9
- import "./chunk-YZMU3Y2S.js";
8
+ } from "./chunk-HGIPJFHA.js";
9
+ import "./chunk-CDOWN2AB.js";
10
10
  import {
11
11
  TBError,
12
12
  external_exports
13
- } from "./chunk-EF33TVRV.js";
13
+ } from "./chunk-ABHHWYEV.js";
14
14
  import "./chunk-MLKGABMK.js";
15
15
 
16
16
  // ../plugins/src/anthropic/api.ts
@@ -2,15 +2,15 @@ import {
2
2
  createProviderPlugin,
3
3
  requireApiKey,
4
4
  upstreamError
5
- } from "./chunk-QMBAFKBX.js";
5
+ } from "./chunk-BWGAV3MR.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-7KSQ6GMZ.js";
9
- import "./chunk-YZMU3Y2S.js";
8
+ } from "./chunk-HGIPJFHA.js";
9
+ import "./chunk-CDOWN2AB.js";
10
10
  import {
11
11
  TBError,
12
12
  external_exports
13
- } from "./chunk-EF33TVRV.js";
13
+ } from "./chunk-ABHHWYEV.js";
14
14
  import "./chunk-MLKGABMK.js";
15
15
 
16
16
  // ../plugins/src/apify/api.ts
@@ -2,15 +2,15 @@ import {
2
2
  createProviderPlugin,
3
3
  requireApiKey,
4
4
  upstreamError
5
- } from "./chunk-QMBAFKBX.js";
5
+ } from "./chunk-BWGAV3MR.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-7KSQ6GMZ.js";
9
- import "./chunk-YZMU3Y2S.js";
8
+ } from "./chunk-HGIPJFHA.js";
9
+ import "./chunk-CDOWN2AB.js";
10
10
  import {
11
11
  TBError,
12
12
  external_exports
13
- } from "./chunk-EF33TVRV.js";
13
+ } from "./chunk-ABHHWYEV.js";
14
14
  import "./chunk-MLKGABMK.js";
15
15
 
16
16
  // ../plugins/src/brave_search/api.ts
@@ -18476,6 +18476,8 @@ var TOOL_SEARCH_SNAPSHOT_CHUNKS_MAX = Math.ceil(
18476
18476
  );
18477
18477
  var TOOL_SEARCH_REBUILD_CHUNKS_MAX = TOOL_SEARCH_SOURCE_CHUNKS_MAX + TOOL_SEARCH_SNAPSHOT_CHUNKS_MAX;
18478
18478
  var TOOL_SEARCH_TERM_LIMIT = 32;
18479
+ var TOOL_SEARCH_UNIT_LIMIT = 98;
18480
+ var TOOL_SEARCH_LIKE_PATTERN_BYTES_MAX = 50;
18479
18481
  var TOOL_SEARCH_QUERY_MAX = 1024;
18480
18482
  var TOOL_SEARCH_CURSOR_OFFSET_MAX = 1e6;
18481
18483
  function assertKeywordToolSearchMode(opts) {
@@ -18643,25 +18645,70 @@ function likePattern(term) {
18643
18645
  const escaped = term.replaceAll("!", "!!").replaceAll("%", "!%").replaceAll("_", "!_");
18644
18646
  return `%${escaped}%`;
18645
18647
  }
18646
- function toolSearchLikePatterns(query) {
18647
- const terms = normalizeToolSearchQuery(query).split(/\s+/u);
18648
- if (terms.length > TOOL_SEARCH_TERM_LIMIT) {
18649
- throw new TBError("invalid_argument", `\u641C\u7D22 query \u6700\u591A ${TOOL_SEARCH_TERM_LIMIT} \u4E2A terms`);
18648
+ function likePatternBytes(term) {
18649
+ return new TextEncoder().encode(likePattern(term)).length;
18650
+ }
18651
+ function isCjkCodePoint(value) {
18652
+ return new RegExp("^(?:\\p{Script=Han}|\\p{Script=Hiragana}|\\p{Script=Katakana}|\\p{Script=Hangul})$", "u").test(value);
18653
+ }
18654
+ function scriptRuns(term) {
18655
+ const runs = [];
18656
+ for (const codePoint of term) {
18657
+ const cjk = isCjkCodePoint(codePoint);
18658
+ const current = runs.at(-1);
18659
+ if (current?.cjk === cjk) current.codePoints.push(codePoint);
18660
+ else runs.push({ cjk, codePoints: [codePoint] });
18650
18661
  }
18651
- return terms.map(likePattern);
18662
+ return runs;
18652
18663
  }
18653
- function prepareToolSearchQuery(query) {
18654
- const normalized = normalizeToolSearchQuery(query);
18655
- const terms = normalized.split(/\s+/u);
18664
+ function addSearchUnit(units, value, tier) {
18665
+ const pattern = likePattern(value);
18666
+ if (new TextEncoder().encode(pattern).length > TOOL_SEARCH_LIKE_PATTERN_BYTES_MAX) return false;
18667
+ const existing = units.get(pattern);
18668
+ if (existing === void 0 || tier > existing.tier) {
18669
+ units.set(pattern, { pattern, tier });
18670
+ }
18671
+ return true;
18672
+ }
18673
+ function addChunkedSearchUnits(units, value, tier) {
18674
+ let chunk = "";
18675
+ for (const codePoint of value) {
18676
+ if (likePatternBytes(chunk + codePoint) <= TOOL_SEARCH_LIKE_PATTERN_BYTES_MAX) {
18677
+ chunk += codePoint;
18678
+ continue;
18679
+ }
18680
+ if (chunk.length > 0) addSearchUnit(units, chunk, tier);
18681
+ chunk = codePoint;
18682
+ }
18683
+ if (chunk.length > 0) addSearchUnit(units, chunk, tier);
18684
+ }
18685
+ function prepareToolSearchUnits(query) {
18686
+ const terms = normalizeToolSearchQuery(query).split(/\s+/u);
18656
18687
  if (terms.length > TOOL_SEARCH_TERM_LIMIT) {
18657
18688
  throw new TBError("invalid_argument", `\u641C\u7D22 query \u6700\u591A ${TOOL_SEARCH_TERM_LIMIT} \u4E2A terms`);
18658
18689
  }
18659
- const short = terms.filter((term) => Array.from(term).length < 3);
18660
- const long = terms.filter((term) => Array.from(term).length >= 3);
18661
- const patterns = short.map(likePattern);
18662
- if (long.length === 0) return { kind: "like", patterns };
18663
- const expression = long.map((term) => `"${term.replaceAll('"', '""')}"`).join(" ");
18664
- return patterns.length === 0 ? { kind: "fts", expression } : { kind: "hybrid", expression, patterns };
18690
+ const units = /* @__PURE__ */ new Map();
18691
+ for (const term of terms) {
18692
+ const wholeAdded = addSearchUnit(units, term, 4);
18693
+ const runs = scriptRuns(term);
18694
+ if (runs.length > 1) {
18695
+ for (const run of runs) {
18696
+ const value = run.codePoints.join("");
18697
+ if (run.cjk) addSearchUnit(units, value, 2);
18698
+ else addChunkedSearchUnits(units, value, 2);
18699
+ }
18700
+ } else if (!wholeAdded && runs[0]?.cjk === false) {
18701
+ addChunkedSearchUnits(units, term, 2);
18702
+ }
18703
+ for (const run of runs) {
18704
+ if (!run.cjk) continue;
18705
+ for (let index = 0; index < run.codePoints.length - 1; index += 1) {
18706
+ addSearchUnit(units, run.codePoints.slice(index, index + 2).join(""), 2);
18707
+ }
18708
+ for (const codePoint of run.codePoints) addSearchUnit(units, codePoint, 1);
18709
+ }
18710
+ }
18711
+ return [...units.values()].sort((left, right) => right.tier - left.tier).slice(0, TOOL_SEARCH_UNIT_LIMIT);
18665
18712
  }
18666
18713
  function cursorBase64UrlDecode(value) {
18667
18714
  if (value.length === 0 || value.length > 4096) {
@@ -18734,35 +18781,9 @@ async function decodeToolSearchCursor(cursor, query, mode, revision, secret) {
18734
18781
  return payload.o ?? 0;
18735
18782
  }
18736
18783
 
18737
- // ../core/src/search/shortTermSql.ts
18738
- function shortTermsSql(patterns) {
18739
- return `short_terms(pattern) AS (VALUES ${patterns.map(() => "(?)").join(", ")})`;
18740
- }
18741
- var SHORT_MATCH_SQL = `
18742
- NOT EXISTS (
18743
- SELECT 1 FROM short_terms
18744
- WHERE tools.name NOT LIKE pattern ESCAPE '!'
18745
- AND tools.description NOT LIKE pattern ESCAPE '!'
18746
- AND tools.feedback NOT LIKE pattern ESCAPE '!'
18747
- )
18748
- `;
18749
- var SHORT_SCORE_SQL = `
18750
- (
18751
- SELECT COALESCE(SUM(
18752
- CASE
18753
- WHEN tools.name LIKE pattern ESCAPE '!' THEN 10
18754
- WHEN tools.description LIKE pattern ESCAPE '!' THEN 3
18755
- WHEN tools.feedback LIKE pattern ESCAPE '!' THEN 1
18756
- ELSE 0
18757
- END
18758
- ), 0)
18759
- FROM short_terms
18760
- )
18761
- `;
18762
-
18763
18784
  // ../core/src/search/sqlSearchIndex.ts
18764
18785
  var TOOL_SEARCH_SCHEMA_STATEMENTS = [
18765
- `CREATE TABLE IF NOT EXISTS tb_search_tools_v3 (
18786
+ `CREATE TABLE IF NOT EXISTS tb_search_tools_v4 (
18766
18787
  id INTEGER PRIMARY KEY,
18767
18788
  path TEXT NOT NULL,
18768
18789
  name TEXT NOT NULL,
@@ -18770,135 +18791,99 @@ var TOOL_SEARCH_SCHEMA_STATEMENTS = [
18770
18791
  feedback TEXT NOT NULL DEFAULT '',
18771
18792
  UNIQUE(path, name)
18772
18793
  )`,
18773
- `CREATE VIRTUAL TABLE IF NOT EXISTS tb_search_tools_fts_v3 USING fts5(
18774
- name,
18775
- description,
18776
- feedback,
18777
- content='tb_search_tools_v3',
18778
- content_rowid='id',
18779
- tokenize='trigram'
18780
- )`,
18781
- `CREATE TRIGGER IF NOT EXISTS tb_search_tools_v3_ai AFTER INSERT ON tb_search_tools_v3 BEGIN
18782
- INSERT INTO tb_search_tools_fts_v3(rowid, name, description, feedback)
18783
- VALUES (new.id, new.name, new.description, new.feedback);
18784
- END`,
18785
- `CREATE TRIGGER IF NOT EXISTS tb_search_tools_v3_ad AFTER DELETE ON tb_search_tools_v3 BEGIN
18786
- INSERT INTO tb_search_tools_fts_v3(tb_search_tools_fts_v3, rowid, name, description, feedback)
18787
- VALUES ('delete', old.id, old.name, old.description, old.feedback);
18788
- END`,
18789
- `CREATE TRIGGER IF NOT EXISTS tb_search_tools_v3_au
18790
- AFTER UPDATE OF name, description, feedback ON tb_search_tools_v3 BEGIN
18791
- INSERT INTO tb_search_tools_fts_v3(tb_search_tools_fts_v3, rowid, name, description, feedback)
18792
- VALUES ('delete', old.id, old.name, old.description, old.feedback);
18793
- INSERT INTO tb_search_tools_fts_v3(rowid, name, description, feedback)
18794
- VALUES (new.id, new.name, new.description, new.feedback);
18795
- END`,
18796
- `CREATE TABLE IF NOT EXISTS tb_search_meta_v3 (
18794
+ `CREATE TABLE IF NOT EXISTS tb_search_meta_v4 (
18797
18795
  singleton INTEGER PRIMARY KEY CHECK (singleton = 1),
18798
18796
  revision INTEGER NOT NULL DEFAULT 0,
18799
18797
  seeded INTEGER NOT NULL DEFAULT 0,
18800
18798
  cursor_secret TEXT NOT NULL
18801
18799
  )`,
18802
- `INSERT OR IGNORE INTO tb_search_meta_v3(
18800
+ `INSERT OR IGNORE INTO tb_search_meta_v4(
18803
18801
  singleton, revision, seeded, cursor_secret
18804
18802
  ) VALUES (1, 0, 0, lower(hex(randomblob(32))))`,
18805
- `CREATE TABLE IF NOT EXISTS tb_search_snapshots_v3 (
18803
+ `CREATE TABLE IF NOT EXISTS tb_search_snapshots_v4 (
18806
18804
  path TEXT PRIMARY KEY,
18807
18805
  digest TEXT NOT NULL
18808
18806
  )`,
18809
- `CREATE TRIGGER IF NOT EXISTS tb_search_snapshots_v3_capacity
18810
- BEFORE INSERT ON tb_search_snapshots_v3
18807
+ `CREATE TRIGGER IF NOT EXISTS tb_search_snapshots_v4_capacity
18808
+ BEFORE INSERT ON tb_search_snapshots_v4
18811
18809
  WHEN NOT EXISTS (
18812
- SELECT 1 FROM tb_search_snapshots_v3 WHERE path = new.path
18813
- ) AND (SELECT COUNT(*) FROM tb_search_snapshots_v3) >= ${TOOL_SEARCH_AUDIT_NODE_LIMIT}
18810
+ SELECT 1 FROM tb_search_snapshots_v4 WHERE path = new.path
18811
+ ) AND (SELECT COUNT(*) FROM tb_search_snapshots_v4) >= ${TOOL_SEARCH_AUDIT_NODE_LIMIT}
18814
18812
  BEGIN
18815
18813
  SELECT RAISE(ABORT, 'tb_search_path_capacity');
18816
18814
  END`
18817
18815
  ];
18818
18816
  var TOOL_SEARCH_CAPACITY_MARKER = "tb_search_path_capacity";
18819
18817
  var TOOL_SEARCH_INSERT_SQL = `
18820
- INSERT INTO tb_search_tools_v3 (path, name, description, feedback)
18818
+ INSERT INTO tb_search_tools_v4 (path, name, description, feedback)
18821
18819
  VALUES (?, ?, ?, ?)
18822
18820
  `;
18823
- var TOOL_SEARCH_INSERT_SNAPSHOT_SQL = "INSERT INTO tb_search_snapshots_v3(path, digest) VALUES (?, ?)";
18824
- var META_SQL = "SELECT revision, seeded, cursor_secret FROM tb_search_meta_v3 WHERE singleton = 1";
18825
- var SNAPSHOT_DIGESTS_SQL = "SELECT path, digest FROM tb_search_snapshots_v3 ORDER BY path";
18821
+ var TOOL_SEARCH_INSERT_SNAPSHOT_SQL = "INSERT INTO tb_search_snapshots_v4(path, digest) VALUES (?, ?)";
18822
+ var META_SQL = "SELECT revision, seeded, cursor_secret FROM tb_search_meta_v4 WHERE singleton = 1";
18823
+ var SNAPSHOT_DIGESTS_SQL = "SELECT path, digest FROM tb_search_snapshots_v4 ORDER BY path";
18826
18824
  var PATH_STATE_SQL = `
18827
18825
  SELECT snapshots.digest,
18828
- EXISTS(SELECT 1 FROM tb_search_tools_v3 WHERE path = ?) AS has_tools,
18829
- (SELECT COUNT(*) FROM tb_search_snapshots_v3) AS path_count
18826
+ EXISTS(SELECT 1 FROM tb_search_tools_v4 WHERE path = ?) AS has_tools,
18827
+ (SELECT COUNT(*) FROM tb_search_snapshots_v4) AS path_count
18830
18828
  FROM (SELECT 1) AS singleton
18831
- LEFT JOIN tb_search_snapshots_v3 AS snapshots ON snapshots.path = ?
18829
+ LEFT JOIN tb_search_snapshots_v4 AS snapshots ON snapshots.path = ?
18832
18830
  `;
18833
- var PRESENT_SQL = "SELECT 1 AS present FROM tb_search_tools_v3 WHERE path = ? LIMIT 1";
18831
+ var PRESENT_SQL = "SELECT 1 AS present FROM tb_search_tools_v4 WHERE path = ? LIMIT 1";
18834
18832
  var PRESENT_PREFIX_SQL = `
18835
- SELECT 1 AS present FROM tb_search_tools_v3
18833
+ SELECT 1 AS present FROM tb_search_tools_v4
18836
18834
  WHERE path = ? OR substr(path, 1, length(?) + 1) = ? || '/'
18837
18835
  LIMIT 1
18838
18836
  `;
18839
- var DELETE_TOOLS_SQL = "DELETE FROM tb_search_tools_v3 WHERE path = ?";
18840
- var DELETE_SNAPSHOT_SQL = "DELETE FROM tb_search_snapshots_v3 WHERE path = ?";
18837
+ var DELETE_TOOLS_SQL = "DELETE FROM tb_search_tools_v4 WHERE path = ?";
18838
+ var DELETE_SNAPSHOT_SQL = "DELETE FROM tb_search_snapshots_v4 WHERE path = ?";
18841
18839
  var DELETE_TOOLS_PREFIX_SQL = `
18842
- DELETE FROM tb_search_tools_v3
18840
+ DELETE FROM tb_search_tools_v4
18843
18841
  WHERE path = ? OR substr(path, 1, length(?) + 1) = ? || '/'
18844
18842
  `;
18845
18843
  var DELETE_SNAPSHOT_PREFIX_SQL = `
18846
- DELETE FROM tb_search_snapshots_v3
18844
+ DELETE FROM tb_search_snapshots_v4
18847
18845
  WHERE path = ? OR substr(path, 1, length(?) + 1) = ? || '/'
18848
18846
  `;
18849
- var DELETE_ALL_TOOLS_SQL = "DELETE FROM tb_search_tools_v3";
18850
- var DELETE_ALL_SNAPSHOTS_SQL = "DELETE FROM tb_search_snapshots_v3";
18851
- var BUMP_REVISION_SQL = "UPDATE tb_search_meta_v3 SET revision = revision + 1 WHERE singleton = 1";
18852
- var COMPLETE_REBUILD_SQL = "UPDATE tb_search_meta_v3 SET seeded = 1, revision = revision + 1 WHERE singleton = 1";
18853
- function toolSearchCandidateStatement(prepared, limit, offset) {
18854
- if (prepared.kind === "like") {
18855
- return {
18856
- params: [...prepared.patterns, limit + 1, offset],
18857
- sql: `
18858
- WITH ${shortTermsSql(prepared.patterns)}
18859
- SELECT tools.id, tools.path, tools.name, ${SHORT_SCORE_SQL} AS short_score
18860
- FROM tb_search_tools_v3 AS tools
18861
- WHERE ${SHORT_MATCH_SQL}
18862
- ORDER BY short_score DESC, tools.path, tools.name
18863
- LIMIT ? OFFSET ?
18864
- `
18865
- };
18866
- }
18867
- if (prepared.kind === "hybrid") {
18868
- return {
18869
- params: [...prepared.patterns, prepared.expression, limit + 1, offset],
18870
- sql: `
18871
- WITH ${shortTermsSql(prepared.patterns)},
18872
- long_hits AS (
18873
- SELECT tools.id, bm25(tb_search_tools_fts_v3, 10.0, 3.0, 1.0) AS fts_rank
18874
- FROM tb_search_tools_fts_v3
18875
- JOIN tb_search_tools_v3 AS tools ON tools.id = tb_search_tools_fts_v3.rowid
18876
- WHERE tb_search_tools_fts_v3 MATCH ?
18877
- )
18878
- SELECT tools.id, tools.path, tools.name, long_hits.fts_rank,
18879
- ${SHORT_SCORE_SQL} AS short_score
18880
- FROM long_hits
18881
- JOIN tb_search_tools_v3 AS tools ON tools.id = long_hits.id
18882
- WHERE ${SHORT_MATCH_SQL}
18883
- ORDER BY long_hits.fts_rank, short_score DESC, tools.path, tools.name
18884
- LIMIT ? OFFSET ?
18885
- `
18886
- };
18887
- }
18847
+ var DELETE_ALL_TOOLS_SQL = "DELETE FROM tb_search_tools_v4";
18848
+ var DELETE_ALL_SNAPSHOTS_SQL = "DELETE FROM tb_search_snapshots_v4";
18849
+ var BUMP_REVISION_SQL = "UPDATE tb_search_meta_v4 SET revision = revision + 1 WHERE singleton = 1";
18850
+ var COMPLETE_REBUILD_SQL = "UPDATE tb_search_meta_v4 SET seeded = 1, revision = revision + 1 WHERE singleton = 1";
18851
+ function toolSearchCandidateStatement(units, limit, offset, syntax) {
18852
+ const values = units.map((unit, index) => `(${syntax.placeholder(index + 1)}, ${unit.tier})`).join(", ");
18853
+ const limitParam = syntax.placeholder(units.length + 1);
18854
+ const offsetParam = syntax.placeholder(units.length + 2);
18855
+ const like = syntax.likeOperator;
18888
18856
  return {
18889
- params: [prepared.expression, limit + 1, offset],
18857
+ params: [...units.map((unit) => unit.pattern), limit + 1, offset],
18890
18858
  sql: `
18891
- SELECT tools.id, tools.path, tools.name
18892
- FROM tb_search_tools_fts_v3
18893
- JOIN tb_search_tools_v3 AS tools ON tools.id = tb_search_tools_fts_v3.rowid
18894
- WHERE tb_search_tools_fts_v3 MATCH ?
18895
- ORDER BY bm25(tb_search_tools_fts_v3, 10.0, 3.0, 1.0), tools.path, tools.name
18896
- LIMIT ? OFFSET ?
18859
+ WITH units(pattern, tier) AS (VALUES ${values})
18860
+ SELECT * FROM (
18861
+ SELECT tools.id, tools.path, tools.name,
18862
+ (
18863
+ SELECT COALESCE(SUM(units.tier * CASE
18864
+ WHEN tools.name ${like} units.pattern ESCAPE '!' THEN 10
18865
+ WHEN tools.path ${like} units.pattern ESCAPE '!' THEN 5
18866
+ WHEN tools.description ${like} units.pattern ESCAPE '!' THEN 3
18867
+ WHEN tools.feedback ${like} units.pattern ESCAPE '!' THEN 1
18868
+ ELSE 0
18869
+ END), 0)
18870
+ FROM units
18871
+ ) AS score
18872
+ FROM tb_search_tools_v4 AS tools
18873
+ ) AS scored_tools
18874
+ WHERE score > 0
18875
+ ORDER BY score DESC, path, name
18876
+ LIMIT ${limitParam} OFFSET ${offsetParam}
18897
18877
  `
18898
18878
  };
18899
18879
  }
18900
18880
  var sqliteSearchDialect = {
18901
- candidateStatement: (query, limit, offset) => toolSearchCandidateStatement(prepareToolSearchQuery(query), limit, offset),
18881
+ candidateStatement: (query, limit, offset) => toolSearchCandidateStatement(
18882
+ prepareToolSearchUnits(query),
18883
+ limit,
18884
+ offset,
18885
+ { likeOperator: "LIKE", placeholder: () => "?" }
18886
+ ),
18902
18887
  schemaStatements: TOOL_SEARCH_SCHEMA_STATEMENTS,
18903
18888
  statements: {
18904
18889
  bumpRevision: BUMP_REVISION_SQL,
@@ -19084,7 +19069,7 @@ var SqlSearchIndex = class {
19084
19069
 
19085
19070
  // ../core/src/search/pgSearchDialect.ts
19086
19071
  var PG_SEARCH_SCHEMA_STATEMENTS = [
19087
- `CREATE TABLE IF NOT EXISTS tb_search_tools_v3 (
19072
+ `CREATE TABLE IF NOT EXISTS tb_search_tools_v4 (
19088
19073
  id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
19089
19074
  path text NOT NULL,
19090
19075
  name text NOT NULL,
@@ -19092,13 +19077,11 @@ var PG_SEARCH_SCHEMA_STATEMENTS = [
19092
19077
  feedback text NOT NULL DEFAULT '',
19093
19078
  UNIQUE(path, name)
19094
19079
  )`,
19095
- // 这里**故意不建 trigram GIN 索引**。实测(4000 条记录 = 500 节点上限满载):
19096
- // 候选查询是"三列 ILIKE OR 连接 + LIMIT",规划器一律选 Seq Scan(整表仅 1 个
19097
- // buffer),GIN 索引一次都没被使用;而它让插入从 13.7ms 涨到 75.8ms(5.5×)、表总大小
19098
- // 1072 kB 涨到 7208 kB(6.7×),检索却仍是 0.50 vs 0.53ms —— 纯负担。
19099
- // 索引记录数受 TOOL_SEARCH_AUDIT_NODE_LIMIT 硬顶约束,不会增长到需要索引的规模;
19100
- // 若将来放宽该上限,应连同候选查询形状(拆成 UNION 或改单列检索列)一起重新评估。
19101
- `CREATE TABLE IF NOT EXISTS tb_search_meta_v3 (
19080
+ // 这里**故意不建 trigram GIN 索引**。历史基准在 500 节点 × 8 工具(4000 行)
19081
+ // 样本上对单 unit 多列 ILIKE 一律选 Seq Scan;GIN 让写入和体积显著增加却未改善
19082
+ // 检索。4000 行只是代表样本,不是严格工具行上限(节点内还受 20KB JSON 约束);
19083
+ // 查询单元数或容量边界变化时,应重跑 searchBench 并重新评估查询形状与索引。
19084
+ `CREATE TABLE IF NOT EXISTS tb_search_meta_v4 (
19102
19085
  singleton integer PRIMARY KEY CHECK (singleton = 1),
19103
19086
  revision bigint NOT NULL DEFAULT 0,
19104
19087
  seeded integer NOT NULL DEFAULT 0,
@@ -19106,32 +19089,32 @@ var PG_SEARCH_SCHEMA_STATEMENTS = [
19106
19089
  )`,
19107
19090
  // cursor_secret 需 64 hex(32 字节)。两个内置 gen_random_uuid() 去连字符正好 64
19108
19091
  // hex,避免依赖 pgcrypto 的 gen_random_bytes(自托管 PG 未必预装 pgcrypto)。
19109
- `INSERT INTO tb_search_meta_v3(singleton, revision, seeded, cursor_secret)
19092
+ `INSERT INTO tb_search_meta_v4(singleton, revision, seeded, cursor_secret)
19110
19093
  VALUES (
19111
19094
  1, 0, 0,
19112
19095
  replace(gen_random_uuid()::text, '-', '') || replace(gen_random_uuid()::text, '-', '')
19113
19096
  )
19114
19097
  ON CONFLICT (singleton) DO NOTHING`,
19115
- `CREATE TABLE IF NOT EXISTS tb_search_snapshots_v3 (
19098
+ `CREATE TABLE IF NOT EXISTS tb_search_snapshots_v4 (
19116
19099
  path text PRIMARY KEY,
19117
19100
  digest text NOT NULL
19118
19101
  )`,
19119
- `CREATE OR REPLACE FUNCTION tb_search_snapshots_v3_capacity()
19102
+ `CREATE OR REPLACE FUNCTION tb_search_snapshots_v4_capacity()
19120
19103
  RETURNS trigger AS $$
19121
19104
  BEGIN
19122
- IF (SELECT COUNT(*) FROM tb_search_snapshots_v3) >= ${TOOL_SEARCH_AUDIT_NODE_LIMIT} THEN
19105
+ IF (SELECT COUNT(*) FROM tb_search_snapshots_v4) >= ${TOOL_SEARCH_AUDIT_NODE_LIMIT} THEN
19123
19106
  RAISE EXCEPTION '${TOOL_SEARCH_CAPACITY_MARKER}';
19124
19107
  END IF;
19125
19108
  RETURN NEW;
19126
19109
  END;
19127
19110
  $$ LANGUAGE plpgsql`,
19128
- `DROP TRIGGER IF EXISTS tb_search_snapshots_v3_capacity_trg ON tb_search_snapshots_v3`,
19129
- `CREATE TRIGGER tb_search_snapshots_v3_capacity_trg
19130
- BEFORE INSERT ON tb_search_snapshots_v3
19131
- FOR EACH ROW EXECUTE FUNCTION tb_search_snapshots_v3_capacity()`
19111
+ `DROP TRIGGER IF EXISTS tb_search_snapshots_v4_capacity_trg ON tb_search_snapshots_v4`,
19112
+ `CREATE TRIGGER tb_search_snapshots_v4_capacity_trg
19113
+ BEFORE INSERT ON tb_search_snapshots_v4
19114
+ FOR EACH ROW EXECUTE FUNCTION tb_search_snapshots_v4_capacity()`
19132
19115
  ];
19133
19116
  var PG_SEARCH_WRITE_LOCK_KEY = 2069799624;
19134
- var PG_SEARCH_INSERT_SNAPSHOT_SQL = "INSERT INTO tb_search_snapshots_v3(path, digest) VALUES ($1, $2)";
19117
+ var PG_SEARCH_INSERT_SNAPSHOT_SQL = "INSERT INTO tb_search_snapshots_v4(path, digest) VALUES ($1, $2)";
19135
19118
  function pgBulkInsertSql(table, columns, rows) {
19136
19119
  const tuples = [];
19137
19120
  for (let r = 0; r < rows; r++) {
@@ -19140,68 +19123,50 @@ function pgBulkInsertSql(table, columns, rows) {
19140
19123
  }
19141
19124
  return `INSERT INTO ${table} (${columns.join(", ")}) VALUES ${tuples.join(", ")}`;
19142
19125
  }
19143
- var PG_SEARCH_TOOLS_TABLE = "tb_search_tools_v3";
19126
+ var PG_SEARCH_TOOLS_TABLE = "tb_search_tools_v4";
19144
19127
  var PG_SEARCH_TOOLS_COLUMNS = ["path", "name", "description", "feedback"];
19145
- var PG_SEARCH_SNAPSHOTS_TABLE = "tb_search_snapshots_v3";
19128
+ var PG_SEARCH_SNAPSHOTS_TABLE = "tb_search_snapshots_v4";
19146
19129
  var PG_SEARCH_SNAPSHOTS_COLUMNS = ["path", "digest"];
19147
19130
  var PG_SEARCH_INSERT_ROWS_MAX = 1e3;
19148
19131
  var META_SQL2 = `
19149
19132
  SELECT revision::int AS revision, seeded::int AS seeded, cursor_secret
19150
- FROM tb_search_meta_v3 WHERE singleton = 1
19133
+ FROM tb_search_meta_v4 WHERE singleton = 1
19151
19134
  `;
19152
- var SNAPSHOT_DIGESTS_SQL2 = "SELECT path, digest FROM tb_search_snapshots_v3 ORDER BY path";
19135
+ var SNAPSHOT_DIGESTS_SQL2 = "SELECT path, digest FROM tb_search_snapshots_v4 ORDER BY path";
19153
19136
  var PATH_STATE_SQL2 = `
19154
19137
  SELECT snapshots.digest,
19155
- EXISTS(SELECT 1 FROM tb_search_tools_v3 WHERE path = $1)::int AS has_tools,
19156
- (SELECT COUNT(*) FROM tb_search_snapshots_v3)::int AS path_count
19138
+ EXISTS(SELECT 1 FROM tb_search_tools_v4 WHERE path = $1)::int AS has_tools,
19139
+ (SELECT COUNT(*) FROM tb_search_snapshots_v4)::int AS path_count
19157
19140
  FROM (SELECT 1) AS singleton
19158
- LEFT JOIN tb_search_snapshots_v3 AS snapshots ON snapshots.path = $2
19141
+ LEFT JOIN tb_search_snapshots_v4 AS snapshots ON snapshots.path = $2
19159
19142
  `;
19160
- var PRESENT_SQL2 = "SELECT 1 AS present FROM tb_search_tools_v3 WHERE path = $1 LIMIT 1";
19143
+ var PRESENT_SQL2 = "SELECT 1 AS present FROM tb_search_tools_v4 WHERE path = $1 LIMIT 1";
19161
19144
  var PRESENT_PREFIX_SQL2 = `
19162
- SELECT 1 AS present FROM tb_search_tools_v3
19145
+ SELECT 1 AS present FROM tb_search_tools_v4
19163
19146
  WHERE path = $1 OR substr(path, 1, length($2) + 1) = $3 || '/'
19164
19147
  LIMIT 1
19165
19148
  `;
19166
- var DELETE_TOOLS_SQL2 = "DELETE FROM tb_search_tools_v3 WHERE path = $1";
19167
- var DELETE_SNAPSHOT_SQL2 = "DELETE FROM tb_search_snapshots_v3 WHERE path = $1";
19149
+ var DELETE_TOOLS_SQL2 = "DELETE FROM tb_search_tools_v4 WHERE path = $1";
19150
+ var DELETE_SNAPSHOT_SQL2 = "DELETE FROM tb_search_snapshots_v4 WHERE path = $1";
19168
19151
  var DELETE_TOOLS_PREFIX_SQL2 = `
19169
- DELETE FROM tb_search_tools_v3
19152
+ DELETE FROM tb_search_tools_v4
19170
19153
  WHERE path = $1 OR substr(path, 1, length($2) + 1) = $3 || '/'
19171
19154
  `;
19172
19155
  var DELETE_SNAPSHOT_PREFIX_SQL2 = `
19173
- DELETE FROM tb_search_snapshots_v3
19156
+ DELETE FROM tb_search_snapshots_v4
19174
19157
  WHERE path = $1 OR substr(path, 1, length($2) + 1) = $3 || '/'
19175
19158
  `;
19176
- var DELETE_ALL_TOOLS_SQL2 = "DELETE FROM tb_search_tools_v3";
19177
- var DELETE_ALL_SNAPSHOTS_SQL2 = "DELETE FROM tb_search_snapshots_v3";
19178
- var BUMP_REVISION_SQL2 = "UPDATE tb_search_meta_v3 SET revision = revision + 1 WHERE singleton = 1";
19179
- var COMPLETE_REBUILD_SQL2 = "UPDATE tb_search_meta_v3 SET seeded = 1, revision = revision + 1 WHERE singleton = 1";
19180
- function pgCandidateStatement(query, limit, offset) {
19181
- const patterns = toolSearchLikePatterns(query);
19182
- const matchClauses = patterns.map((_, i) => {
19183
- const p = `$${i + 1}`;
19184
- return `(name ILIKE ${p} ESCAPE '!' OR description ILIKE ${p} ESCAPE '!' OR feedback ILIKE ${p} ESCAPE '!')`;
19185
- });
19186
- const scoreTerms = patterns.map((_, i) => {
19187
- const p = `$${i + 1}`;
19188
- return `CASE WHEN name ILIKE ${p} ESCAPE '!' THEN 10 WHEN description ILIKE ${p} ESCAPE '!' THEN 3 WHEN feedback ILIKE ${p} ESCAPE '!' THEN 1 ELSE 0 END`;
19189
- });
19190
- const limitParam = `$${patterns.length + 1}`;
19191
- const offsetParam = `$${patterns.length + 2}`;
19192
- return {
19193
- params: [...patterns, limit + 1, offset],
19194
- sql: `
19195
- SELECT id, path, name, (${scoreTerms.join(" + ")}) AS score
19196
- FROM tb_search_tools_v3
19197
- WHERE ${matchClauses.join(" AND ")}
19198
- ORDER BY score DESC, path, name
19199
- LIMIT ${limitParam} OFFSET ${offsetParam}
19200
- `
19201
- };
19202
- }
19159
+ var DELETE_ALL_TOOLS_SQL2 = "DELETE FROM tb_search_tools_v4";
19160
+ var DELETE_ALL_SNAPSHOTS_SQL2 = "DELETE FROM tb_search_snapshots_v4";
19161
+ var BUMP_REVISION_SQL2 = "UPDATE tb_search_meta_v4 SET revision = revision + 1 WHERE singleton = 1";
19162
+ var COMPLETE_REBUILD_SQL2 = "UPDATE tb_search_meta_v4 SET seeded = 1, revision = revision + 1 WHERE singleton = 1";
19203
19163
  var pgSearchDialect = {
19204
- candidateStatement: pgCandidateStatement,
19164
+ candidateStatement: (query, limit, offset) => toolSearchCandidateStatement(
19165
+ prepareToolSearchUnits(query),
19166
+ limit,
19167
+ offset,
19168
+ { likeOperator: "ILIKE", placeholder: (index) => `$${index}` }
19169
+ ),
19205
19170
  schemaStatements: PG_SEARCH_SCHEMA_STATEMENTS,
19206
19171
  statements: {
19207
19172
  bumpRevision: BUMP_REVISION_SQL2,
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  createPlugin
3
- } from "./chunk-YZMU3Y2S.js";
3
+ } from "./chunk-CDOWN2AB.js";
4
4
  import {
5
5
  TBError
6
- } from "./chunk-EF33TVRV.js";
6
+ } from "./chunk-ABHHWYEV.js";
7
7
 
8
8
  // ../plugins/src/_runtime/plugin.ts
9
9
  function requireApiKey(ctx, service) {
@@ -10,7 +10,7 @@ import {
10
10
  isTBError,
11
11
  parseCredentialValues,
12
12
  toToolResult
13
- } from "./chunk-EF33TVRV.js";
13
+ } from "./chunk-ABHHWYEV.js";
14
14
 
15
15
  // ../plugin-sdk/src/index.ts
16
16
  var CONTEXT_HANDLER_VERBS = ["list", "get", "write", "update", "delete", "search"];
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  TBError
3
- } from "./chunk-EF33TVRV.js";
3
+ } from "./chunk-ABHHWYEV.js";
4
4
 
5
5
  // ../plugins/src/_runtime/ipPolicy.ts
6
6
  function parseIpv4(value) {