@tool-bridge/server 0.7.0 → 0.10.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-BNVPDLF2.js → airtable-5W6SJMSM.js} +4 -4
  2. package/dist/{alt_text_generator_ai-RMQPHK2Y.js → alt_text_generator_ai-YYVJM3RG.js} +4 -4
  3. package/dist/{amap-PRNZPQ34.js → amap-EREMQZHQ.js} +4 -4
  4. package/dist/{anthropic-A76VIXR7.js → anthropic-53H7WGSE.js} +4 -4
  5. package/dist/{apify-2Q2CTLKE.js → apify-CMRNU7VZ.js} +4 -4
  6. package/dist/{brave_search-5YJJVPXH.js → brave_search-AFZVZ3QK.js} +4 -4
  7. package/dist/{chunk-BUHY4IE6.js → chunk-2DA2UI37.js} +2 -2
  8. package/dist/{chunk-GMHELPK3.js → chunk-Q44CYUSI.js} +1 -1
  9. package/dist/{chunk-7ASYWVYP.js → chunk-Q7YHZ2SD.js} +624 -36
  10. package/dist/{chunk-EBO6Q4NR.js → chunk-SBJMMSPA.js} +1 -1
  11. package/dist/{chunk-76YX7XSX.js → chunk-TPGTA43F.js} +228 -48
  12. package/dist/{circleci-TDXP3CPQ.js → circleci-JG7RV2RU.js} +4 -4
  13. package/dist/{clerk-JRSGMXMS.js → clerk-U7OS5ALG.js} +4 -4
  14. package/dist/{cloudflare_dns-G4CHNLO7.js → cloudflare_dns-ADCTFMMI.js} +4 -4
  15. package/dist/{cohere-3KN27F2B.js → cohere-Z7ZEC2YV.js} +4 -4
  16. package/dist/{confluence-QV6J2PBV.js → confluence-FT22JGYQ.js} +4 -4
  17. package/dist/{convertapi-HETITAHL.js → convertapi-UQQCWVWP.js} +4 -4
  18. package/dist/{currencyapi-647DEY6G.js → currencyapi-Y63O7JTP.js} +4 -4
  19. package/dist/{deepseek-G63RUHM6.js → deepseek-7TSAMZJ6.js} +4 -4
  20. package/dist/{docker_hub-RH72CRWO.js → docker_hub-AJYTVI25.js} +4 -4
  21. package/dist/{dropbox-T4Y5KSZW.js → dropbox-CNGGNR5J.js} +4 -4
  22. package/dist/{dub-ECKQT3DC.js → dub-WTADKHA7.js} +4 -4
  23. package/dist/{e2b-N5SRTPLF.js → e2b-75EKXMN5.js} +4 -4
  24. package/dist/{exa-525ZDM7G.js → exa-OFLA5XND.js} +4 -4
  25. package/dist/{fal_ai-BFMVHAUW.js → fal_ai-5542HB7N.js} +4 -4
  26. package/dist/{feishu-NIDOD7EW.js → feishu-QQIZ7G24.js} +3 -3
  27. package/dist/{feishu_custom_bot-V5RGAIUH.js → feishu_custom_bot-EVDKIZCR.js} +4 -4
  28. package/dist/{figma-GH7TXJMP.js → figma-ZEBDUMWI.js} +4 -4
  29. package/dist/{firehydrant-5T3UHAQM.js → firehydrant-CTBNY6FL.js} +4 -4
  30. package/dist/{fixer-3RMJLMFO.js → fixer-ITDYMRBW.js} +4 -4
  31. package/dist/{fly-NPHJC5MH.js → fly-IBFMSAAO.js} +4 -4
  32. package/dist/{front-PYGXJAQK.js → front-AZQLLUJQ.js} +4 -4
  33. package/dist/{geocodio-T6G3FVIF.js → geocodio-XHZHEWQW.js} +4 -4
  34. package/dist/{ghost-L3XIF4SJ.js → ghost-RTIKXD3T.js} +4 -4
  35. package/dist/{github-7YDUB6N6.js → github-WRJBJ5N7.js} +4 -4
  36. package/dist/{gmail-RY2ZDG3B.js → gmail-527RVDXV.js} +4 -4
  37. package/dist/{googlecalendar-EHOFMXHE.js → googlecalendar-WZJSK2MR.js} +4 -4
  38. package/dist/{googledocs-BA3OAMKA.js → googledocs-LFBVIHIK.js} +4 -4
  39. package/dist/{grafana-PYZQ4CKI.js → grafana-3JEKO7NT.js} +4 -4
  40. package/dist/{graphhopper-3P4YU45N.js → graphhopper-TOJN6K2Q.js} +4 -4
  41. package/dist/index.d.ts +370 -26
  42. package/dist/index.js +14 -2
  43. package/dist/{ip2proxy-GQO6VF4P.js → ip2proxy-KOA2JUNV.js} +4 -4
  44. package/dist/{ipgeolocation_io-VOZU6E7H.js → ipgeolocation_io-KNOQD7R7.js} +4 -4
  45. package/dist/{ipqualityscore-XDJ3TTMM.js → ipqualityscore-GF2MQKXI.js} +4 -4
  46. package/dist/{jina_ai-ELXPSTUJ.js → jina_ai-GB3CQPJ4.js} +4 -4
  47. package/dist/{jira-INDXWO4I.js → jira-35XYV6G4.js} +4 -4
  48. package/dist/{langsmith-PMCQBCIK.js → langsmith-W5234OE7.js} +4 -4
  49. package/dist/{lemlist-VWZXIHJX.js → lemlist-QB6W2G7N.js} +4 -4
  50. package/dist/{linear-YXG4KZR4.js → linear-MHBD6A7X.js} +4 -4
  51. package/dist/{logsnag-XENBYHHK.js → logsnag-RN57XIJS.js} +4 -4
  52. package/dist/main.js +113 -106
  53. package/dist/{mattermost-BHVJP5MA.js → mattermost-QRXSZMZA.js} +4 -4
  54. package/dist/{mem0-7AP5UBJV.js → mem0-K63NN3LA.js} +4 -4
  55. package/dist/{memos-MNVRYSLG.js → memos-4IOUOFKH.js} +4 -4
  56. package/dist/{metabase-NSXM7EID.js → metabase-IOE44EKL.js} +4 -4
  57. package/dist/{mistral_ai-HXN625YX.js → mistral_ai-X7ASGV5I.js} +4 -4
  58. package/dist/{mother_duck-46VQ3V3D.js → mother_duck-CNN3QWQH.js} +4 -4
  59. package/dist/{ngrok-BWCVMS3T.js → ngrok-QNE4AHEH.js} +4 -4
  60. package/dist/{notes-AVHKCFLU.js → notes-Q6OLBS2L.js} +2 -2
  61. package/dist/{notion-BSEN3KSU.js → notion-ADDRQTCE.js} +4 -4
  62. package/dist/{open_exchange_rates-DWO4T5TF.js → open_exchange_rates-WR5PJQTG.js} +4 -4
  63. package/dist/{openai-HPZYRS3M.js → openai-UZBNNAAH.js} +4 -4
  64. package/dist/{opengraph_io-OLUAYD5P.js → opengraph_io-2JNEXCPJ.js} +4 -4
  65. package/dist/{openrouter-4DQYZIG3.js → openrouter-EF62BDIH.js} +4 -4
  66. package/dist/{outline-ZDNMKXZ6.js → outline-O4TIRWJT.js} +4 -4
  67. package/dist/{paddle-HCOOYW3F.js → paddle-SEFKNENH.js} +4 -4
  68. package/dist/{perplexity-2GJJPDA7.js → perplexity-FZYOIPDS.js} +4 -4
  69. package/dist/{pinecone-ZPOBKL5T.js → pinecone-EXDPYDY7.js} +4 -4
  70. package/dist/{pipedrive-3WN2RFMB.js → pipedrive-EDO4C3AM.js} +4 -4
  71. package/dist/{polar-DJFGBTXW.js → polar-QJXHVFIP.js} +4 -4
  72. package/dist/{posthog-G4OXNEXP.js → posthog-U6QEXJE2.js} +4 -4
  73. package/dist/{postmark-NJMGDQKO.js → postmark-PFZIWXMP.js} +4 -4
  74. package/dist/{prerender-2TUPKRK5.js → prerender-SK2AXNJY.js} +4 -4
  75. package/dist/{pubmed-CCXZZT34.js → pubmed-CB7OJNBH.js} +4 -4
  76. package/dist/{railway-ZUUY5YYR.js → railway-BMMNQ6XH.js} +4 -4
  77. package/dist/{readwise-PYSRGJ4J.js → readwise-YQY7O5QR.js} +4 -4
  78. package/dist/{render-SFA3EMGM.js → render-7CRNEEJ3.js} +4 -4
  79. package/dist/{replicate-KGZHYBPK.js → replicate-V6AX7WFC.js} +4 -4
  80. package/dist/{resend-HENMZC5U.js → resend-ZBH56UAQ.js} +4 -4
  81. package/dist/{rootly-HV2PXIDP.js → rootly-C4FIXIF7.js} +4 -4
  82. package/dist/{scrapfly-FOZFHUN3.js → scrapfly-UE434KD7.js} +4 -4
  83. package/dist/{scrapingbee-VHUMSO2J.js → scrapingbee-PQCNKALD.js} +4 -4
  84. package/dist/{screenshot_fyi-FFDXAKHD.js → screenshot_fyi-U6QGI6ZH.js} +4 -4
  85. package/dist/{semantic_scholar-GHO37BZF.js → semantic_scholar-PSMUOG2W.js} +4 -4
  86. package/dist/{sentry-MZVZW3YE.js → sentry-F5CNVQA2.js} +4 -4
  87. package/dist/{shodan-IDICOPGU.js → shodan-NOWG7NV5.js} +4 -4
  88. package/dist/{shopify-WQLO23JO.js → shopify-GGPLJIGC.js} +4 -4
  89. package/dist/{stripe-XOAKLAKU.js → stripe-72K2UMK3.js} +4 -4
  90. package/dist/{supabase-6DKGSLST.js → supabase-H7NRCSAO.js} +4 -4
  91. package/dist/{tavily-76QZGEHM.js → tavily-ISP24QUX.js} +4 -4
  92. package/dist/{telegram-O536CLFR.js → telegram-POII6NKE.js} +4 -4
  93. package/dist/{telnyx-XOPYXF3K.js → telnyx-3D7TOVNA.js} +4 -4
  94. package/dist/{todoist-YXHVWPP3.js → todoist-LKYPKRKB.js} +4 -4
  95. package/dist/{trello-WMTM3WA2.js → trello-WW74UYIQ.js} +4 -4
  96. package/dist/{turso-CG7PR5HM.js → turso-SUFRHBHW.js} +4 -4
  97. package/dist/{twilio-ZW4SD36D.js → twilio-QB7PBL2B.js} +4 -4
  98. package/dist/{umami-IJQ5VH77.js → umami-CAHHP3SV.js} +4 -4
  99. package/dist/{unsplash-JBQY7NKO.js → unsplash-ZCGEPHGQ.js} +4 -4
  100. package/dist/{upstash_redis-2BAO776T.js → upstash_redis-DZ4AKZWT.js} +4 -4
  101. package/dist/{uptimerobot-BRIHMPB3.js → uptimerobot-KVEQJGTZ.js} +4 -4
  102. package/dist/{v2ex-HWIHF4HX.js → v2ex-BCYYBPH7.js} +4 -4
  103. package/dist/{vercel-MGMRY2DJ.js → vercel-GH4G7EUS.js} +4 -4
  104. package/dist/{wolfram_alpha_api-JG6JD33L.js → wolfram_alpha_api-XFG2MQBL.js} +4 -4
  105. package/dist/{wordpress-ZSYJERWV.js → wordpress-DZ2TVNAA.js} +4 -4
  106. package/dist/{workos-QFEOSJAN.js → workos-EHUAGTGN.js} +4 -4
  107. package/dist/{zhihu-5RF7BBFV.js → zhihu-OJJW3ZIH.js} +4 -4
  108. package/package.json +5 -3
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  TBError
3
- } from "./chunk-76YX7XSX.js";
3
+ } from "./chunk-TPGTA43F.js";
4
4
 
5
5
  // ../plugins/src/_runtime/ipPolicy.ts
6
6
  function parseIpv4(value) {
@@ -14820,7 +14820,7 @@ function checkRegisterPath(input) {
14820
14820
  if (!checkScopes(sk.scopes, targetPath, "register")) {
14821
14821
  return deny(`no scope grants 'register' on '${targetPath}'`);
14822
14822
  }
14823
- if (existing && existing.registeredBy !== sk.id && existing.registeredBy !== SYSTEM_AUTO) {
14823
+ if (existing && existing.registeredBy !== sk.id && existing.registeredBy !== SYSTEM_AUTO && !checkScopes(sk.scopes, targetPath, "admin")) {
14824
14824
  return {
14825
14825
  allow: false,
14826
14826
  error: new TBError("conflict", `path '${targetPath}' is registered by another key`)
@@ -16362,7 +16362,7 @@ function registryCmds(nodePath) {
16362
16362
  name: "delete",
16363
16363
  method: "POST",
16364
16364
  path,
16365
- h: "unmount a node (and reclaim empty auto-created parents)",
16365
+ h: "unmount a node (and reclaim empty auto-created parents); a node registered by another key can only be removed by its registrar or by a key holding the 'admin' scope on that path",
16366
16366
  inputSchema: {
16367
16367
  type: "object",
16368
16368
  properties: { path: { type: "string", description: "exact tree path" } },
@@ -18428,32 +18428,6 @@ function decodePluginCall(body) {
18428
18428
  return parsed.data;
18429
18429
  }
18430
18430
 
18431
- // ../core/src/search/shortTermSql.ts
18432
- function shortTermsSql(patterns) {
18433
- return `short_terms(pattern) AS (VALUES ${patterns.map(() => "(?)").join(", ")})`;
18434
- }
18435
- var SHORT_MATCH_SQL = `
18436
- NOT EXISTS (
18437
- SELECT 1 FROM short_terms
18438
- WHERE tools.name NOT LIKE pattern ESCAPE '!'
18439
- AND tools.description NOT LIKE pattern ESCAPE '!'
18440
- AND tools.feedback NOT LIKE pattern ESCAPE '!'
18441
- )
18442
- `;
18443
- var SHORT_SCORE_SQL = `
18444
- (
18445
- SELECT COALESCE(SUM(
18446
- CASE
18447
- WHEN tools.name LIKE pattern ESCAPE '!' THEN 10
18448
- WHEN tools.description LIKE pattern ESCAPE '!' THEN 3
18449
- WHEN tools.feedback LIKE pattern ESCAPE '!' THEN 1
18450
- ELSE 0
18451
- END
18452
- ), 0)
18453
- FROM short_terms
18454
- )
18455
- `;
18456
-
18457
18431
  // ../core/src/search/types.ts
18458
18432
  var TOOL_SEARCH_BATCH_LIMIT = 100;
18459
18433
  var TOOL_SEARCH_WORK_LIMIT = 400;
@@ -18638,6 +18612,13 @@ function likePattern(term) {
18638
18612
  const escaped = term.replaceAll("!", "!!").replaceAll("%", "!%").replaceAll("_", "!_");
18639
18613
  return `%${escaped}%`;
18640
18614
  }
18615
+ function toolSearchLikePatterns(query) {
18616
+ const terms = normalizeToolSearchQuery(query).split(/\s+/u);
18617
+ if (terms.length > TOOL_SEARCH_TERM_LIMIT) {
18618
+ throw new TBError("invalid_argument", `\u641C\u7D22 query \u6700\u591A ${TOOL_SEARCH_TERM_LIMIT} \u4E2A terms`);
18619
+ }
18620
+ return terms.map(likePattern);
18621
+ }
18641
18622
  function prepareToolSearchQuery(query) {
18642
18623
  const normalized = normalizeToolSearchQuery(query);
18643
18624
  const terms = normalized.split(/\s+/u);
@@ -18722,6 +18703,32 @@ async function decodeToolSearchCursor(cursor, query, mode, revision, secret) {
18722
18703
  return payload.o ?? 0;
18723
18704
  }
18724
18705
 
18706
+ // ../core/src/search/shortTermSql.ts
18707
+ function shortTermsSql(patterns) {
18708
+ return `short_terms(pattern) AS (VALUES ${patterns.map(() => "(?)").join(", ")})`;
18709
+ }
18710
+ var SHORT_MATCH_SQL = `
18711
+ NOT EXISTS (
18712
+ SELECT 1 FROM short_terms
18713
+ WHERE tools.name NOT LIKE pattern ESCAPE '!'
18714
+ AND tools.description NOT LIKE pattern ESCAPE '!'
18715
+ AND tools.feedback NOT LIKE pattern ESCAPE '!'
18716
+ )
18717
+ `;
18718
+ var SHORT_SCORE_SQL = `
18719
+ (
18720
+ SELECT COALESCE(SUM(
18721
+ CASE
18722
+ WHEN tools.name LIKE pattern ESCAPE '!' THEN 10
18723
+ WHEN tools.description LIKE pattern ESCAPE '!' THEN 3
18724
+ WHEN tools.feedback LIKE pattern ESCAPE '!' THEN 1
18725
+ ELSE 0
18726
+ END
18727
+ ), 0)
18728
+ FROM short_terms
18729
+ )
18730
+ `;
18731
+
18725
18732
  // ../core/src/search/sqlSearchIndex.ts
18726
18733
  var TOOL_SEARCH_SCHEMA_STATEMENTS = [
18727
18734
  `CREATE TABLE IF NOT EXISTS tb_search_tools_v3 (
@@ -18859,12 +18866,34 @@ function toolSearchCandidateStatement(prepared, limit, offset) {
18859
18866
  `
18860
18867
  };
18861
18868
  }
18869
+ var sqliteSearchDialect = {
18870
+ candidateStatement: (query, limit, offset) => toolSearchCandidateStatement(prepareToolSearchQuery(query), limit, offset),
18871
+ schemaStatements: TOOL_SEARCH_SCHEMA_STATEMENTS,
18872
+ statements: {
18873
+ bumpRevision: BUMP_REVISION_SQL,
18874
+ completeRebuild: COMPLETE_REBUILD_SQL,
18875
+ deleteAllSnapshots: DELETE_ALL_SNAPSHOTS_SQL,
18876
+ deleteAllTools: DELETE_ALL_TOOLS_SQL,
18877
+ deleteSnapshot: DELETE_SNAPSHOT_SQL,
18878
+ deleteSnapshotPrefix: DELETE_SNAPSHOT_PREFIX_SQL,
18879
+ deleteTools: DELETE_TOOLS_SQL,
18880
+ deleteToolsPrefix: DELETE_TOOLS_PREFIX_SQL,
18881
+ insertSnapshot: TOOL_SEARCH_INSERT_SNAPSHOT_SQL,
18882
+ meta: META_SQL,
18883
+ pathState: PATH_STATE_SQL,
18884
+ present: PRESENT_SQL,
18885
+ presentPrefix: PRESENT_PREFIX_SQL,
18886
+ snapshotDigests: SNAPSHOT_DIGESTS_SQL
18887
+ }
18888
+ };
18862
18889
  var SqlSearchIndex = class {
18863
- constructor(driver) {
18890
+ constructor(driver, dialect = sqliteSearchDialect) {
18864
18891
  this.driver = driver;
18892
+ this.dialect = dialect;
18865
18893
  }
18866
18894
  driver;
18867
18895
  capabilities = ["search"];
18896
+ dialect;
18868
18897
  /** 容量 trigger 的 ABORT 在各驱动里错误形状不同,统一按标记串归一。 */
18869
18898
  async writeOrCapacity(statements) {
18870
18899
  try {
@@ -18877,14 +18906,14 @@ var SqlSearchIndex = class {
18877
18906
  }
18878
18907
  }
18879
18908
  async meta() {
18880
- const row = await this.driver.first({ params: [], sql: META_SQL });
18909
+ const row = await this.driver.first({ params: [], sql: this.dialect.statements.meta });
18881
18910
  if (row === null) throw new TBError("internal", "\u5DE5\u5177\u641C\u7D22 meta \u7F3A\u5931");
18882
18911
  return row;
18883
18912
  }
18884
18913
  async snapshotDigests() {
18885
18914
  const rows = await this.driver.all({
18886
18915
  params: [],
18887
- sql: SNAPSHOT_DIGESTS_SQL
18916
+ sql: this.dialect.statements.snapshotDigests
18888
18917
  });
18889
18918
  return new Map(rows.map((row) => [row.path, row.digest]));
18890
18919
  }
@@ -18898,7 +18927,7 @@ var SqlSearchIndex = class {
18898
18927
  await this.driver.ensureSchema();
18899
18928
  const current = await this.driver.first({
18900
18929
  params: [canonical, canonical],
18901
- sql: PATH_STATE_SQL
18930
+ sql: this.dialect.statements.pathState
18902
18931
  });
18903
18932
  const digest = records.length === 0 ? null : toolSearchSnapshotDigest(records);
18904
18933
  if (current !== null && (digest !== null && current.digest === digest || digest === null && current.digest === null && current.has_tools === 0)) return;
@@ -18907,12 +18936,13 @@ var SqlSearchIndex = class {
18907
18936
  }
18908
18937
  const inserts = this.driver.insertRecords(records);
18909
18938
  this.driver.assertInsertBudget?.(inserts.length);
18939
+ const statements = this.dialect.statements;
18910
18940
  await this.writeOrCapacity([
18911
- { params: [canonical], sql: DELETE_TOOLS_SQL },
18941
+ { params: [canonical], sql: statements.deleteTools },
18912
18942
  ...inserts,
18913
- { params: [canonical], sql: DELETE_SNAPSHOT_SQL },
18914
- ...digest === null ? [] : [{ params: [canonical, digest], sql: TOOL_SEARCH_INSERT_SNAPSHOT_SQL }],
18915
- { params: [], sql: BUMP_REVISION_SQL }
18943
+ { params: [canonical], sql: statements.deleteSnapshot },
18944
+ ...digest === null ? [] : [{ params: [canonical, digest], sql: statements.insertSnapshot }],
18945
+ { params: [], sql: statements.bumpRevision }
18916
18946
  ]);
18917
18947
  }
18918
18948
  async remove(path) {
@@ -18920,13 +18950,14 @@ var SqlSearchIndex = class {
18920
18950
  await this.driver.ensureSchema();
18921
18951
  const current = await this.driver.first({
18922
18952
  params: [canonical],
18923
- sql: PRESENT_SQL
18953
+ sql: this.dialect.statements.present
18924
18954
  });
18925
18955
  if (current === null) return;
18956
+ const statements = this.dialect.statements;
18926
18957
  await this.driver.write([
18927
- { params: [canonical], sql: DELETE_TOOLS_SQL },
18928
- { params: [canonical], sql: DELETE_SNAPSHOT_SQL },
18929
- { params: [], sql: BUMP_REVISION_SQL }
18958
+ { params: [canonical], sql: statements.deleteTools },
18959
+ { params: [canonical], sql: statements.deleteSnapshot },
18960
+ { params: [], sql: statements.bumpRevision }
18930
18961
  ]);
18931
18962
  }
18932
18963
  async removePrefix(path) {
@@ -18935,13 +18966,14 @@ var SqlSearchIndex = class {
18935
18966
  const prefixParams = [canonical, canonical, canonical];
18936
18967
  const current = await this.driver.first({
18937
18968
  params: prefixParams,
18938
- sql: PRESENT_PREFIX_SQL
18969
+ sql: this.dialect.statements.presentPrefix
18939
18970
  });
18940
18971
  if (current === null) return;
18972
+ const statements = this.dialect.statements;
18941
18973
  await this.driver.write([
18942
- { params: prefixParams, sql: DELETE_TOOLS_PREFIX_SQL },
18943
- { params: prefixParams, sql: DELETE_SNAPSHOT_PREFIX_SQL },
18944
- { params: [], sql: BUMP_REVISION_SQL }
18974
+ { params: prefixParams, sql: statements.deleteToolsPrefix },
18975
+ { params: prefixParams, sql: statements.deleteSnapshotPrefix },
18976
+ { params: [], sql: statements.bumpRevision }
18945
18977
  ]);
18946
18978
  }
18947
18979
  async rebuild(documents) {
@@ -18955,12 +18987,13 @@ var SqlSearchIndex = class {
18955
18987
  const inserts = this.driver.insertRecords(records);
18956
18988
  const snapshots = this.driver.insertSnapshots(desired);
18957
18989
  this.driver.assertInsertBudget?.(inserts.length + snapshots.length);
18990
+ const statements = this.dialect.statements;
18958
18991
  await this.writeOrCapacity([
18959
- { params: [], sql: DELETE_ALL_TOOLS_SQL },
18960
- { params: [], sql: DELETE_ALL_SNAPSHOTS_SQL },
18992
+ { params: [], sql: statements.deleteAllTools },
18993
+ { params: [], sql: statements.deleteAllSnapshots },
18961
18994
  ...inserts,
18962
18995
  ...snapshots,
18963
- { params: [], sql: COMPLETE_REBUILD_SQL }
18996
+ { params: [], sql: statements.completeRebuild }
18964
18997
  ]);
18965
18998
  }
18966
18999
  async search(query, opts) {
@@ -18979,7 +19012,7 @@ var SqlSearchIndex = class {
18979
19012
  );
18980
19013
  const limit = Math.min(normalizeToolSearchLimit(opts?.limit), TOOL_SEARCH_BATCH_LIMIT);
18981
19014
  const rows = await this.driver.all(
18982
- toolSearchCandidateStatement(prepareToolSearchQuery(normalized), limit, offset)
19015
+ this.dialect.candidateStatement(normalized, limit, offset)
18983
19016
  );
18984
19017
  const hasMore = rows.length > limit;
18985
19018
  const page = hasMore ? rows.slice(0, limit) : rows;
@@ -19018,6 +19051,145 @@ var SqlSearchIndex = class {
19018
19051
  }
19019
19052
  };
19020
19053
 
19054
+ // ../core/src/search/pgSearchDialect.ts
19055
+ var PG_SEARCH_SCHEMA_STATEMENTS = [
19056
+ `CREATE TABLE IF NOT EXISTS tb_search_tools_v3 (
19057
+ id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
19058
+ path text NOT NULL,
19059
+ name text NOT NULL,
19060
+ description text NOT NULL DEFAULT '',
19061
+ feedback text NOT NULL DEFAULT '',
19062
+ UNIQUE(path, name)
19063
+ )`,
19064
+ // 这里**故意不建 trigram GIN 索引**。实测(4000 条记录 = 500 节点上限满载):
19065
+ // 候选查询是"三列 ILIKE 用 OR 连接 + LIMIT",规划器一律选 Seq Scan(整表仅 1 个
19066
+ // buffer),GIN 索引一次都没被使用;而它让插入从 13.7ms 涨到 75.8ms(5.5×)、表总大小
19067
+ // 从 1072 kB 涨到 7208 kB(6.7×),检索却仍是 0.50 vs 0.53ms —— 纯负担。
19068
+ // 索引记录数受 TOOL_SEARCH_AUDIT_NODE_LIMIT 硬顶约束,不会增长到需要索引的规模;
19069
+ // 若将来放宽该上限,应连同候选查询形状(拆成 UNION 或改单列检索列)一起重新评估。
19070
+ `CREATE TABLE IF NOT EXISTS tb_search_meta_v3 (
19071
+ singleton integer PRIMARY KEY CHECK (singleton = 1),
19072
+ revision bigint NOT NULL DEFAULT 0,
19073
+ seeded integer NOT NULL DEFAULT 0,
19074
+ cursor_secret text NOT NULL
19075
+ )`,
19076
+ // cursor_secret 需 64 hex(32 字节)。两个内置 gen_random_uuid() 去连字符正好 64
19077
+ // hex,避免依赖 pgcrypto 的 gen_random_bytes(自托管 PG 未必预装 pgcrypto)。
19078
+ `INSERT INTO tb_search_meta_v3(singleton, revision, seeded, cursor_secret)
19079
+ VALUES (
19080
+ 1, 0, 0,
19081
+ replace(gen_random_uuid()::text, '-', '') || replace(gen_random_uuid()::text, '-', '')
19082
+ )
19083
+ ON CONFLICT (singleton) DO NOTHING`,
19084
+ `CREATE TABLE IF NOT EXISTS tb_search_snapshots_v3 (
19085
+ path text PRIMARY KEY,
19086
+ digest text NOT NULL
19087
+ )`,
19088
+ `CREATE OR REPLACE FUNCTION tb_search_snapshots_v3_capacity()
19089
+ RETURNS trigger AS $$
19090
+ BEGIN
19091
+ IF (SELECT COUNT(*) FROM tb_search_snapshots_v3) >= ${TOOL_SEARCH_AUDIT_NODE_LIMIT} THEN
19092
+ RAISE EXCEPTION '${TOOL_SEARCH_CAPACITY_MARKER}';
19093
+ END IF;
19094
+ RETURN NEW;
19095
+ END;
19096
+ $$ LANGUAGE plpgsql`,
19097
+ `DROP TRIGGER IF EXISTS tb_search_snapshots_v3_capacity_trg ON tb_search_snapshots_v3`,
19098
+ `CREATE TRIGGER tb_search_snapshots_v3_capacity_trg
19099
+ BEFORE INSERT ON tb_search_snapshots_v3
19100
+ FOR EACH ROW EXECUTE FUNCTION tb_search_snapshots_v3_capacity()`
19101
+ ];
19102
+ var PG_SEARCH_WRITE_LOCK_KEY = 2069799624;
19103
+ var PG_SEARCH_INSERT_SNAPSHOT_SQL = "INSERT INTO tb_search_snapshots_v3(path, digest) VALUES ($1, $2)";
19104
+ function pgBulkInsertSql(table, columns, rows) {
19105
+ const tuples = [];
19106
+ for (let r = 0; r < rows; r++) {
19107
+ const placeholders = columns.map((_, c) => `$${r * columns.length + c + 1}`);
19108
+ tuples.push(`(${placeholders.join(", ")})`);
19109
+ }
19110
+ return `INSERT INTO ${table} (${columns.join(", ")}) VALUES ${tuples.join(", ")}`;
19111
+ }
19112
+ var PG_SEARCH_TOOLS_TABLE = "tb_search_tools_v3";
19113
+ var PG_SEARCH_TOOLS_COLUMNS = ["path", "name", "description", "feedback"];
19114
+ var PG_SEARCH_SNAPSHOTS_TABLE = "tb_search_snapshots_v3";
19115
+ var PG_SEARCH_SNAPSHOTS_COLUMNS = ["path", "digest"];
19116
+ var PG_SEARCH_INSERT_ROWS_MAX = 1e3;
19117
+ var META_SQL2 = `
19118
+ SELECT revision::int AS revision, seeded::int AS seeded, cursor_secret
19119
+ FROM tb_search_meta_v3 WHERE singleton = 1
19120
+ `;
19121
+ var SNAPSHOT_DIGESTS_SQL2 = "SELECT path, digest FROM tb_search_snapshots_v3 ORDER BY path";
19122
+ var PATH_STATE_SQL2 = `
19123
+ SELECT snapshots.digest,
19124
+ EXISTS(SELECT 1 FROM tb_search_tools_v3 WHERE path = $1)::int AS has_tools,
19125
+ (SELECT COUNT(*) FROM tb_search_snapshots_v3)::int AS path_count
19126
+ FROM (SELECT 1) AS singleton
19127
+ LEFT JOIN tb_search_snapshots_v3 AS snapshots ON snapshots.path = $2
19128
+ `;
19129
+ var PRESENT_SQL2 = "SELECT 1 AS present FROM tb_search_tools_v3 WHERE path = $1 LIMIT 1";
19130
+ var PRESENT_PREFIX_SQL2 = `
19131
+ SELECT 1 AS present FROM tb_search_tools_v3
19132
+ WHERE path = $1 OR substr(path, 1, length($2) + 1) = $3 || '/'
19133
+ LIMIT 1
19134
+ `;
19135
+ var DELETE_TOOLS_SQL2 = "DELETE FROM tb_search_tools_v3 WHERE path = $1";
19136
+ var DELETE_SNAPSHOT_SQL2 = "DELETE FROM tb_search_snapshots_v3 WHERE path = $1";
19137
+ var DELETE_TOOLS_PREFIX_SQL2 = `
19138
+ DELETE FROM tb_search_tools_v3
19139
+ WHERE path = $1 OR substr(path, 1, length($2) + 1) = $3 || '/'
19140
+ `;
19141
+ var DELETE_SNAPSHOT_PREFIX_SQL2 = `
19142
+ DELETE FROM tb_search_snapshots_v3
19143
+ WHERE path = $1 OR substr(path, 1, length($2) + 1) = $3 || '/'
19144
+ `;
19145
+ var DELETE_ALL_TOOLS_SQL2 = "DELETE FROM tb_search_tools_v3";
19146
+ var DELETE_ALL_SNAPSHOTS_SQL2 = "DELETE FROM tb_search_snapshots_v3";
19147
+ var BUMP_REVISION_SQL2 = "UPDATE tb_search_meta_v3 SET revision = revision + 1 WHERE singleton = 1";
19148
+ var COMPLETE_REBUILD_SQL2 = "UPDATE tb_search_meta_v3 SET seeded = 1, revision = revision + 1 WHERE singleton = 1";
19149
+ function pgCandidateStatement(query, limit, offset) {
19150
+ const patterns = toolSearchLikePatterns(query);
19151
+ const matchClauses = patterns.map((_, i) => {
19152
+ const p = `$${i + 1}`;
19153
+ return `(name ILIKE ${p} ESCAPE '!' OR description ILIKE ${p} ESCAPE '!' OR feedback ILIKE ${p} ESCAPE '!')`;
19154
+ });
19155
+ const scoreTerms = patterns.map((_, i) => {
19156
+ const p = `$${i + 1}`;
19157
+ 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`;
19158
+ });
19159
+ const limitParam = `$${patterns.length + 1}`;
19160
+ const offsetParam = `$${patterns.length + 2}`;
19161
+ return {
19162
+ params: [...patterns, limit + 1, offset],
19163
+ sql: `
19164
+ SELECT id, path, name, (${scoreTerms.join(" + ")}) AS score
19165
+ FROM tb_search_tools_v3
19166
+ WHERE ${matchClauses.join(" AND ")}
19167
+ ORDER BY score DESC, path, name
19168
+ LIMIT ${limitParam} OFFSET ${offsetParam}
19169
+ `
19170
+ };
19171
+ }
19172
+ var pgSearchDialect = {
19173
+ candidateStatement: pgCandidateStatement,
19174
+ schemaStatements: PG_SEARCH_SCHEMA_STATEMENTS,
19175
+ statements: {
19176
+ bumpRevision: BUMP_REVISION_SQL2,
19177
+ completeRebuild: COMPLETE_REBUILD_SQL2,
19178
+ deleteAllSnapshots: DELETE_ALL_SNAPSHOTS_SQL2,
19179
+ deleteAllTools: DELETE_ALL_TOOLS_SQL2,
19180
+ deleteSnapshot: DELETE_SNAPSHOT_SQL2,
19181
+ deleteSnapshotPrefix: DELETE_SNAPSHOT_PREFIX_SQL2,
19182
+ deleteTools: DELETE_TOOLS_SQL2,
19183
+ deleteToolsPrefix: DELETE_TOOLS_PREFIX_SQL2,
19184
+ insertSnapshot: PG_SEARCH_INSERT_SNAPSHOT_SQL,
19185
+ meta: META_SQL2,
19186
+ pathState: PATH_STATE_SQL2,
19187
+ present: PRESENT_SQL2,
19188
+ presentPrefix: PRESENT_PREFIX_SQL2,
19189
+ snapshotDigests: SNAPSHOT_DIGESTS_SQL2
19190
+ }
19191
+ };
19192
+
19021
19193
  // ../core/src/secret/secretStore.ts
19022
19194
  var AES_GCM_IV_BYTES = 12;
19023
19195
  var MASTER_KEY_BYTES = 32;
@@ -20185,6 +20357,14 @@ export {
20185
20357
  TOOL_SEARCH_INSERT_SQL,
20186
20358
  TOOL_SEARCH_INSERT_SNAPSHOT_SQL,
20187
20359
  SqlSearchIndex,
20360
+ PG_SEARCH_WRITE_LOCK_KEY,
20361
+ pgBulkInsertSql,
20362
+ PG_SEARCH_TOOLS_TABLE,
20363
+ PG_SEARCH_TOOLS_COLUMNS,
20364
+ PG_SEARCH_SNAPSHOTS_TABLE,
20365
+ PG_SEARCH_SNAPSHOTS_COLUMNS,
20366
+ PG_SEARCH_INSERT_ROWS_MAX,
20367
+ pgSearchDialect,
20188
20368
  SecretStoreImpl,
20189
20369
  SKILLHUB_CAPABILITIES,
20190
20370
  skillhubScopeForCmd,
@@ -2,15 +2,15 @@ import {
2
2
  createProviderPlugin,
3
3
  requireApiKey,
4
4
  upstreamError
5
- } from "./chunk-BUHY4IE6.js";
5
+ } from "./chunk-2DA2UI37.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-EBO6Q4NR.js";
9
- import "./chunk-GMHELPK3.js";
8
+ } from "./chunk-SBJMMSPA.js";
9
+ import "./chunk-Q44CYUSI.js";
10
10
  import {
11
11
  TBError,
12
12
  external_exports
13
- } from "./chunk-76YX7XSX.js";
13
+ } from "./chunk-TPGTA43F.js";
14
14
  import "./chunk-MLKGABMK.js";
15
15
 
16
16
  // ../plugins/src/circleci/api.ts
@@ -2,14 +2,14 @@ import {
2
2
  createProviderPlugin,
3
3
  requireApiKey,
4
4
  upstreamError
5
- } from "./chunk-BUHY4IE6.js";
5
+ } from "./chunk-2DA2UI37.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-EBO6Q4NR.js";
9
- import "./chunk-GMHELPK3.js";
8
+ } from "./chunk-SBJMMSPA.js";
9
+ import "./chunk-Q44CYUSI.js";
10
10
  import {
11
11
  external_exports
12
- } from "./chunk-76YX7XSX.js";
12
+ } from "./chunk-TPGTA43F.js";
13
13
  import "./chunk-MLKGABMK.js";
14
14
 
15
15
  // ../plugins/src/clerk/api.ts
@@ -2,15 +2,15 @@ import {
2
2
  createProviderPlugin,
3
3
  requireApiKey,
4
4
  upstreamError
5
- } from "./chunk-BUHY4IE6.js";
5
+ } from "./chunk-2DA2UI37.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-EBO6Q4NR.js";
9
- import "./chunk-GMHELPK3.js";
8
+ } from "./chunk-SBJMMSPA.js";
9
+ import "./chunk-Q44CYUSI.js";
10
10
  import {
11
11
  TBError,
12
12
  external_exports
13
- } from "./chunk-76YX7XSX.js";
13
+ } from "./chunk-TPGTA43F.js";
14
14
  import "./chunk-MLKGABMK.js";
15
15
 
16
16
  // ../plugins/src/cloudflare_dns/api.ts
@@ -2,14 +2,14 @@ import {
2
2
  createProviderPlugin,
3
3
  requireApiKey,
4
4
  upstreamError
5
- } from "./chunk-BUHY4IE6.js";
5
+ } from "./chunk-2DA2UI37.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-EBO6Q4NR.js";
9
- import "./chunk-GMHELPK3.js";
8
+ } from "./chunk-SBJMMSPA.js";
9
+ import "./chunk-Q44CYUSI.js";
10
10
  import {
11
11
  external_exports
12
- } from "./chunk-76YX7XSX.js";
12
+ } from "./chunk-TPGTA43F.js";
13
13
  import "./chunk-MLKGABMK.js";
14
14
 
15
15
  // ../plugins/src/cohere/api.ts
@@ -2,15 +2,15 @@ import {
2
2
  createProviderPlugin,
3
3
  requireCredential,
4
4
  upstreamError
5
- } from "./chunk-BUHY4IE6.js";
5
+ } from "./chunk-2DA2UI37.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-EBO6Q4NR.js";
9
- import "./chunk-GMHELPK3.js";
8
+ } from "./chunk-SBJMMSPA.js";
9
+ import "./chunk-Q44CYUSI.js";
10
10
  import {
11
11
  TBError,
12
12
  external_exports
13
- } from "./chunk-76YX7XSX.js";
13
+ } from "./chunk-TPGTA43F.js";
14
14
  import "./chunk-MLKGABMK.js";
15
15
 
16
16
  // ../plugins/src/confluence/api.ts
@@ -2,16 +2,16 @@ import {
2
2
  createProviderPlugin,
3
3
  requireApiKey,
4
4
  upstreamError
5
- } from "./chunk-BUHY4IE6.js";
5
+ } from "./chunk-2DA2UI37.js";
6
6
  import {
7
7
  assertPublicHttpUrl,
8
8
  guardedFetch
9
- } from "./chunk-EBO6Q4NR.js";
10
- import "./chunk-GMHELPK3.js";
9
+ } from "./chunk-SBJMMSPA.js";
10
+ import "./chunk-Q44CYUSI.js";
11
11
  import {
12
12
  TBError,
13
13
  external_exports
14
- } from "./chunk-76YX7XSX.js";
14
+ } from "./chunk-TPGTA43F.js";
15
15
  import "./chunk-MLKGABMK.js";
16
16
 
17
17
  // ../plugins/src/convertapi/schema.ts
@@ -2,14 +2,14 @@ import {
2
2
  createProviderPlugin,
3
3
  requireApiKey,
4
4
  upstreamError
5
- } from "./chunk-BUHY4IE6.js";
5
+ } from "./chunk-2DA2UI37.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-EBO6Q4NR.js";
9
- import "./chunk-GMHELPK3.js";
8
+ } from "./chunk-SBJMMSPA.js";
9
+ import "./chunk-Q44CYUSI.js";
10
10
  import {
11
11
  external_exports
12
- } from "./chunk-76YX7XSX.js";
12
+ } from "./chunk-TPGTA43F.js";
13
13
  import "./chunk-MLKGABMK.js";
14
14
 
15
15
  // ../plugins/src/currencyapi/api.ts
@@ -2,15 +2,15 @@ import {
2
2
  createProviderPlugin,
3
3
  requireApiKey,
4
4
  upstreamError
5
- } from "./chunk-BUHY4IE6.js";
5
+ } from "./chunk-2DA2UI37.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-EBO6Q4NR.js";
9
- import "./chunk-GMHELPK3.js";
8
+ } from "./chunk-SBJMMSPA.js";
9
+ import "./chunk-Q44CYUSI.js";
10
10
  import {
11
11
  TBError,
12
12
  external_exports
13
- } from "./chunk-76YX7XSX.js";
13
+ } from "./chunk-TPGTA43F.js";
14
14
  import "./chunk-MLKGABMK.js";
15
15
 
16
16
  // ../plugins/src/deepseek/api.ts
@@ -2,15 +2,15 @@ import {
2
2
  createProviderPlugin,
3
3
  requireApiKey,
4
4
  upstreamError
5
- } from "./chunk-BUHY4IE6.js";
5
+ } from "./chunk-2DA2UI37.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-EBO6Q4NR.js";
9
- import "./chunk-GMHELPK3.js";
8
+ } from "./chunk-SBJMMSPA.js";
9
+ import "./chunk-Q44CYUSI.js";
10
10
  import {
11
11
  TBError,
12
12
  external_exports
13
- } from "./chunk-76YX7XSX.js";
13
+ } from "./chunk-TPGTA43F.js";
14
14
  import "./chunk-MLKGABMK.js";
15
15
 
16
16
  // ../plugins/src/docker_hub/api.ts
@@ -2,15 +2,15 @@ import {
2
2
  createProviderPlugin,
3
3
  requireApiKey,
4
4
  upstreamError
5
- } from "./chunk-BUHY4IE6.js";
5
+ } from "./chunk-2DA2UI37.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-EBO6Q4NR.js";
9
- import "./chunk-GMHELPK3.js";
8
+ } from "./chunk-SBJMMSPA.js";
9
+ import "./chunk-Q44CYUSI.js";
10
10
  import {
11
11
  TBError,
12
12
  external_exports
13
- } from "./chunk-76YX7XSX.js";
13
+ } from "./chunk-TPGTA43F.js";
14
14
  import "./chunk-MLKGABMK.js";
15
15
 
16
16
  // ../plugins/src/dropbox/api.ts
@@ -2,15 +2,15 @@ import {
2
2
  createProviderPlugin,
3
3
  requireApiKey,
4
4
  upstreamError
5
- } from "./chunk-BUHY4IE6.js";
5
+ } from "./chunk-2DA2UI37.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-EBO6Q4NR.js";
9
- import "./chunk-GMHELPK3.js";
8
+ } from "./chunk-SBJMMSPA.js";
9
+ import "./chunk-Q44CYUSI.js";
10
10
  import {
11
11
  TBError,
12
12
  external_exports
13
- } from "./chunk-76YX7XSX.js";
13
+ } from "./chunk-TPGTA43F.js";
14
14
  import "./chunk-MLKGABMK.js";
15
15
 
16
16
  // ../plugins/src/dub/api.ts
@@ -2,15 +2,15 @@ import {
2
2
  createProviderPlugin,
3
3
  requireApiKey,
4
4
  upstreamError
5
- } from "./chunk-BUHY4IE6.js";
5
+ } from "./chunk-2DA2UI37.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-EBO6Q4NR.js";
9
- import "./chunk-GMHELPK3.js";
8
+ } from "./chunk-SBJMMSPA.js";
9
+ import "./chunk-Q44CYUSI.js";
10
10
  import {
11
11
  TBError,
12
12
  external_exports
13
- } from "./chunk-76YX7XSX.js";
13
+ } from "./chunk-TPGTA43F.js";
14
14
  import "./chunk-MLKGABMK.js";
15
15
 
16
16
  // ../plugins/src/e2b/api.ts