@tool-bridge/server 0.7.0 → 0.10.1

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-SLT4UDB3.js} +4 -4
  2. package/dist/{alt_text_generator_ai-RMQPHK2Y.js → alt_text_generator_ai-HCFYQNEN.js} +4 -4
  3. package/dist/{amap-PRNZPQ34.js → amap-ZOOTZCI2.js} +4 -4
  4. package/dist/{anthropic-A76VIXR7.js → anthropic-IUWXKV76.js} +4 -4
  5. package/dist/{apify-2Q2CTLKE.js → apify-HQXUP3ZL.js} +4 -4
  6. package/dist/{brave_search-5YJJVPXH.js → brave_search-HG5PMEDZ.js} +4 -4
  7. package/dist/{chunk-76YX7XSX.js → chunk-AWXZMW6M.js} +246 -52
  8. package/dist/{chunk-7ASYWVYP.js → chunk-EMUJLM32.js} +599 -38
  9. package/dist/{chunk-EBO6Q4NR.js → chunk-THDEI7S7.js} +1 -1
  10. package/dist/{chunk-BUHY4IE6.js → chunk-V4VHC3Q6.js} +2 -2
  11. package/dist/{chunk-GMHELPK3.js → chunk-WIH5OHFG.js} +1 -1
  12. package/dist/{circleci-TDXP3CPQ.js → circleci-XA4GXPOT.js} +4 -4
  13. package/dist/{clerk-JRSGMXMS.js → clerk-MUAETUIY.js} +4 -4
  14. package/dist/{cloudflare_dns-G4CHNLO7.js → cloudflare_dns-BRYRH55W.js} +4 -4
  15. package/dist/{cohere-3KN27F2B.js → cohere-XKVGQJQH.js} +4 -4
  16. package/dist/{confluence-QV6J2PBV.js → confluence-SWP6UUEK.js} +4 -4
  17. package/dist/{convertapi-HETITAHL.js → convertapi-42FNXPAS.js} +4 -4
  18. package/dist/{currencyapi-647DEY6G.js → currencyapi-7IECLAKK.js} +4 -4
  19. package/dist/{deepseek-G63RUHM6.js → deepseek-VD3VY3D2.js} +4 -4
  20. package/dist/{docker_hub-RH72CRWO.js → docker_hub-YCEWCV5D.js} +4 -4
  21. package/dist/{dropbox-T4Y5KSZW.js → dropbox-KCAEQENT.js} +4 -4
  22. package/dist/{dub-ECKQT3DC.js → dub-AVLJI73G.js} +4 -4
  23. package/dist/{e2b-N5SRTPLF.js → e2b-NZPEKNY3.js} +4 -4
  24. package/dist/{exa-525ZDM7G.js → exa-MHHTRY4Y.js} +4 -4
  25. package/dist/{fal_ai-BFMVHAUW.js → fal_ai-VKVUKXE2.js} +4 -4
  26. package/dist/{feishu-NIDOD7EW.js → feishu-AFLX4VZX.js} +3 -3
  27. package/dist/{feishu_custom_bot-V5RGAIUH.js → feishu_custom_bot-S4XJYZVB.js} +4 -4
  28. package/dist/{figma-GH7TXJMP.js → figma-6LBMPYPL.js} +4 -4
  29. package/dist/{firehydrant-5T3UHAQM.js → firehydrant-JRAJ4CMG.js} +4 -4
  30. package/dist/{fixer-3RMJLMFO.js → fixer-BTWM3K4Z.js} +4 -4
  31. package/dist/{fly-NPHJC5MH.js → fly-FUY25D36.js} +4 -4
  32. package/dist/{front-PYGXJAQK.js → front-SFQD4V63.js} +4 -4
  33. package/dist/{geocodio-T6G3FVIF.js → geocodio-JZTFWKOE.js} +4 -4
  34. package/dist/{ghost-L3XIF4SJ.js → ghost-HNZTH6AR.js} +4 -4
  35. package/dist/{github-7YDUB6N6.js → github-3J6ZYHGY.js} +4 -4
  36. package/dist/{gmail-RY2ZDG3B.js → gmail-Y4GWZ2UJ.js} +4 -4
  37. package/dist/{googlecalendar-EHOFMXHE.js → googlecalendar-JK6B3ZCO.js} +4 -4
  38. package/dist/{googledocs-BA3OAMKA.js → googledocs-VERSNFGF.js} +4 -4
  39. package/dist/{grafana-PYZQ4CKI.js → grafana-WABWHNKT.js} +4 -4
  40. package/dist/{graphhopper-3P4YU45N.js → graphhopper-PWZOVQQF.js} +4 -4
  41. package/dist/index.d.ts +372 -28
  42. package/dist/index.js +14 -2
  43. package/dist/{ip2proxy-GQO6VF4P.js → ip2proxy-IJKSNZVR.js} +4 -4
  44. package/dist/{ipgeolocation_io-VOZU6E7H.js → ipgeolocation_io-I27LWP7M.js} +4 -4
  45. package/dist/{ipqualityscore-XDJ3TTMM.js → ipqualityscore-THLB64L6.js} +4 -4
  46. package/dist/{jina_ai-ELXPSTUJ.js → jina_ai-KHC4WQAK.js} +4 -4
  47. package/dist/{jira-INDXWO4I.js → jira-NAGZYZLK.js} +4 -4
  48. package/dist/{langsmith-PMCQBCIK.js → langsmith-5BZ4CAWL.js} +4 -4
  49. package/dist/{lemlist-VWZXIHJX.js → lemlist-4D5DLIWT.js} +4 -4
  50. package/dist/{linear-YXG4KZR4.js → linear-5A6IZTNW.js} +4 -4
  51. package/dist/{logsnag-XENBYHHK.js → logsnag-Q7CU4J7A.js} +4 -4
  52. package/dist/main.js +113 -106
  53. package/dist/{mattermost-BHVJP5MA.js → mattermost-36YSAHMQ.js} +4 -4
  54. package/dist/{mem0-7AP5UBJV.js → mem0-EVJ7KY5E.js} +4 -4
  55. package/dist/{memos-MNVRYSLG.js → memos-KDNZATPM.js} +4 -4
  56. package/dist/{metabase-NSXM7EID.js → metabase-MRBJG473.js} +4 -4
  57. package/dist/{mistral_ai-HXN625YX.js → mistral_ai-PDT25XCR.js} +4 -4
  58. package/dist/{mother_duck-46VQ3V3D.js → mother_duck-MN3OHZDF.js} +4 -4
  59. package/dist/{ngrok-BWCVMS3T.js → ngrok-PEGRSO2H.js} +4 -4
  60. package/dist/{notes-AVHKCFLU.js → notes-UUDL64JP.js} +2 -2
  61. package/dist/{notion-BSEN3KSU.js → notion-XRTFGM3Q.js} +4 -4
  62. package/dist/{open_exchange_rates-DWO4T5TF.js → open_exchange_rates-TLNDRZ54.js} +4 -4
  63. package/dist/{openai-HPZYRS3M.js → openai-EUDWNNU6.js} +4 -4
  64. package/dist/{opengraph_io-OLUAYD5P.js → opengraph_io-MKH5AUR3.js} +4 -4
  65. package/dist/{openrouter-4DQYZIG3.js → openrouter-YMGWGPI3.js} +4 -4
  66. package/dist/{outline-ZDNMKXZ6.js → outline-MTH7SZBU.js} +4 -4
  67. package/dist/{paddle-HCOOYW3F.js → paddle-PWSGQPO6.js} +4 -4
  68. package/dist/{perplexity-2GJJPDA7.js → perplexity-NBUHF5Z6.js} +4 -4
  69. package/dist/{pinecone-ZPOBKL5T.js → pinecone-5FVBDTET.js} +4 -4
  70. package/dist/{pipedrive-3WN2RFMB.js → pipedrive-IJUNMGFQ.js} +4 -4
  71. package/dist/{polar-DJFGBTXW.js → polar-L72J7ISM.js} +4 -4
  72. package/dist/{posthog-G4OXNEXP.js → posthog-4GDGMSSQ.js} +4 -4
  73. package/dist/{postmark-NJMGDQKO.js → postmark-25TFX6LC.js} +4 -4
  74. package/dist/{prerender-2TUPKRK5.js → prerender-ZY7S5S4R.js} +4 -4
  75. package/dist/{pubmed-CCXZZT34.js → pubmed-KCPFV76N.js} +4 -4
  76. package/dist/{railway-ZUUY5YYR.js → railway-IWOCVOXL.js} +4 -4
  77. package/dist/{readwise-PYSRGJ4J.js → readwise-JCN5J4ON.js} +4 -4
  78. package/dist/{render-SFA3EMGM.js → render-FUM4QWKI.js} +4 -4
  79. package/dist/{replicate-KGZHYBPK.js → replicate-V5VIAEYB.js} +4 -4
  80. package/dist/{resend-HENMZC5U.js → resend-F3XQOI24.js} +4 -4
  81. package/dist/{rootly-HV2PXIDP.js → rootly-XEDRHK66.js} +4 -4
  82. package/dist/{scrapfly-FOZFHUN3.js → scrapfly-PXDWBCOD.js} +4 -4
  83. package/dist/{scrapingbee-VHUMSO2J.js → scrapingbee-X5QCNZSS.js} +4 -4
  84. package/dist/{screenshot_fyi-FFDXAKHD.js → screenshot_fyi-V6CE6WQS.js} +4 -4
  85. package/dist/{semantic_scholar-GHO37BZF.js → semantic_scholar-NHEQ5J72.js} +4 -4
  86. package/dist/{sentry-MZVZW3YE.js → sentry-XDLPYMQI.js} +4 -4
  87. package/dist/{shodan-IDICOPGU.js → shodan-H2YTSK7R.js} +4 -4
  88. package/dist/{shopify-WQLO23JO.js → shopify-Q5YDMDAD.js} +4 -4
  89. package/dist/{stripe-XOAKLAKU.js → stripe-ZXSIKY6A.js} +4 -4
  90. package/dist/{supabase-6DKGSLST.js → supabase-TV2ZEVH5.js} +4 -4
  91. package/dist/{tavily-76QZGEHM.js → tavily-KKBMTUW6.js} +4 -4
  92. package/dist/{telegram-O536CLFR.js → telegram-JM4VE5FR.js} +4 -4
  93. package/dist/{telnyx-XOPYXF3K.js → telnyx-NOXAAP6B.js} +4 -4
  94. package/dist/{todoist-YXHVWPP3.js → todoist-ATYSMZ2W.js} +4 -4
  95. package/dist/{trello-WMTM3WA2.js → trello-BWRSV7VZ.js} +4 -4
  96. package/dist/{turso-CG7PR5HM.js → turso-P7Z4X5C5.js} +4 -4
  97. package/dist/{twilio-ZW4SD36D.js → twilio-YL7NUXCX.js} +4 -4
  98. package/dist/{umami-IJQ5VH77.js → umami-JPWFBAPI.js} +4 -4
  99. package/dist/{unsplash-JBQY7NKO.js → unsplash-CJBI3UGZ.js} +4 -4
  100. package/dist/{upstash_redis-2BAO776T.js → upstash_redis-J5IGSHWB.js} +4 -4
  101. package/dist/{uptimerobot-BRIHMPB3.js → uptimerobot-HEFFBT3N.js} +4 -4
  102. package/dist/{v2ex-HWIHF4HX.js → v2ex-MRYW7RM6.js} +4 -4
  103. package/dist/{vercel-MGMRY2DJ.js → vercel-RNY4ZRTH.js} +4 -4
  104. package/dist/{wolfram_alpha_api-JG6JD33L.js → wolfram_alpha_api-AF346YID.js} +4 -4
  105. package/dist/{wordpress-ZSYJERWV.js → wordpress-YWKGCQA5.js} +4 -4
  106. package/dist/{workos-QFEOSJAN.js → workos-Y7AORGEG.js} +4 -4
  107. package/dist/{zhihu-5RF7BBFV.js → zhihu-X4FAKOAQ.js} +4 -4
  108. package/package.json +8 -6
@@ -2,15 +2,15 @@ import {
2
2
  createProviderPlugin,
3
3
  requireApiKey,
4
4
  upstreamError
5
- } from "./chunk-BUHY4IE6.js";
5
+ } from "./chunk-V4VHC3Q6.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-EBO6Q4NR.js";
9
- import "./chunk-GMHELPK3.js";
8
+ } from "./chunk-THDEI7S7.js";
9
+ import "./chunk-WIH5OHFG.js";
10
10
  import {
11
11
  TBError,
12
12
  external_exports
13
- } from "./chunk-76YX7XSX.js";
13
+ } from "./chunk-AWXZMW6M.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-BUHY4IE6.js";
5
+ } from "./chunk-V4VHC3Q6.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-EBO6Q4NR.js";
9
- import "./chunk-GMHELPK3.js";
8
+ } from "./chunk-THDEI7S7.js";
9
+ import "./chunk-WIH5OHFG.js";
10
10
  import {
11
11
  TBError,
12
12
  external_exports
13
- } from "./chunk-76YX7XSX.js";
13
+ } from "./chunk-AWXZMW6M.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-BUHY4IE6.js";
5
+ } from "./chunk-V4VHC3Q6.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-EBO6Q4NR.js";
9
- import "./chunk-GMHELPK3.js";
8
+ } from "./chunk-THDEI7S7.js";
9
+ import "./chunk-WIH5OHFG.js";
10
10
  import {
11
11
  TBError,
12
12
  external_exports
13
- } from "./chunk-76YX7XSX.js";
13
+ } from "./chunk-AWXZMW6M.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-BUHY4IE6.js";
5
+ } from "./chunk-V4VHC3Q6.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-EBO6Q4NR.js";
9
- import "./chunk-GMHELPK3.js";
8
+ } from "./chunk-THDEI7S7.js";
9
+ import "./chunk-WIH5OHFG.js";
10
10
  import {
11
11
  TBError,
12
12
  external_exports
13
- } from "./chunk-76YX7XSX.js";
13
+ } from "./chunk-AWXZMW6M.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-BUHY4IE6.js";
5
+ } from "./chunk-V4VHC3Q6.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-EBO6Q4NR.js";
9
- import "./chunk-GMHELPK3.js";
8
+ } from "./chunk-THDEI7S7.js";
9
+ import "./chunk-WIH5OHFG.js";
10
10
  import {
11
11
  TBError,
12
12
  external_exports
13
- } from "./chunk-76YX7XSX.js";
13
+ } from "./chunk-AWXZMW6M.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-BUHY4IE6.js";
5
+ } from "./chunk-V4VHC3Q6.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-EBO6Q4NR.js";
9
- import "./chunk-GMHELPK3.js";
8
+ } from "./chunk-THDEI7S7.js";
9
+ import "./chunk-WIH5OHFG.js";
10
10
  import {
11
11
  TBError,
12
12
  external_exports
13
- } from "./chunk-76YX7XSX.js";
13
+ } from "./chunk-AWXZMW6M.js";
14
14
  import "./chunk-MLKGABMK.js";
15
15
 
16
16
  // ../plugins/src/brave_search/api.ts
@@ -14637,6 +14637,20 @@ var KEY_BOOTSTRAPPED = "sys:bootstrapped";
14637
14637
  var KEY_REMOTE_ALLOWLIST = "sys:remoteallowlist";
14638
14638
  var KEY_ANNOTATION = "annotation:";
14639
14639
  var KEY_FEEDBACK = "feedback:";
14640
+ var MAX_CODE_POINT = 1114111;
14641
+ var SURROGATE_START = 55296;
14642
+ var SURROGATE_END = 57343;
14643
+ function prefixUpperBound(prefix) {
14644
+ const points = [...prefix];
14645
+ for (let i = points.length - 1; i >= 0; i--) {
14646
+ const code = points[i]?.codePointAt(0);
14647
+ if (code === void 0 || code >= MAX_CODE_POINT) continue;
14648
+ let next = code + 1;
14649
+ if (next >= SURROGATE_START && next <= SURROGATE_END) next = SURROGATE_END + 1;
14650
+ return points.slice(0, i).join("") + String.fromCodePoint(next);
14651
+ }
14652
+ return void 0;
14653
+ }
14640
14654
 
14641
14655
  // ../core/src/annotation/store.ts
14642
14656
  var ANNOTATION_TEXT_MAX = 2e3;
@@ -14820,7 +14834,7 @@ function checkRegisterPath(input) {
14820
14834
  if (!checkScopes(sk.scopes, targetPath, "register")) {
14821
14835
  return deny(`no scope grants 'register' on '${targetPath}'`);
14822
14836
  }
14823
- if (existing && existing.registeredBy !== sk.id && existing.registeredBy !== SYSTEM_AUTO) {
14837
+ if (existing && existing.registeredBy !== sk.id && existing.registeredBy !== SYSTEM_AUTO && !checkScopes(sk.scopes, targetPath, "admin")) {
14824
14838
  return {
14825
14839
  allow: false,
14826
14840
  error: new TBError("conflict", `path '${targetPath}' is registered by another key`)
@@ -16362,7 +16376,7 @@ function registryCmds(nodePath) {
16362
16376
  name: "delete",
16363
16377
  method: "POST",
16364
16378
  path,
16365
- h: "unmount a node (and reclaim empty auto-created parents)",
16379
+ 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
16380
  inputSchema: {
16367
16381
  type: "object",
16368
16382
  properties: { path: { type: "string", description: "exact tree path" } },
@@ -18428,32 +18442,6 @@ function decodePluginCall(body) {
18428
18442
  return parsed.data;
18429
18443
  }
18430
18444
 
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
18445
  // ../core/src/search/types.ts
18458
18446
  var TOOL_SEARCH_BATCH_LIMIT = 100;
18459
18447
  var TOOL_SEARCH_WORK_LIMIT = 400;
@@ -18638,6 +18626,13 @@ function likePattern(term) {
18638
18626
  const escaped = term.replaceAll("!", "!!").replaceAll("%", "!%").replaceAll("_", "!_");
18639
18627
  return `%${escaped}%`;
18640
18628
  }
18629
+ function toolSearchLikePatterns(query) {
18630
+ const terms = normalizeToolSearchQuery(query).split(/\s+/u);
18631
+ if (terms.length > TOOL_SEARCH_TERM_LIMIT) {
18632
+ throw new TBError("invalid_argument", `\u641C\u7D22 query \u6700\u591A ${TOOL_SEARCH_TERM_LIMIT} \u4E2A terms`);
18633
+ }
18634
+ return terms.map(likePattern);
18635
+ }
18641
18636
  function prepareToolSearchQuery(query) {
18642
18637
  const normalized = normalizeToolSearchQuery(query);
18643
18638
  const terms = normalized.split(/\s+/u);
@@ -18722,6 +18717,32 @@ async function decodeToolSearchCursor(cursor, query, mode, revision, secret) {
18722
18717
  return payload.o ?? 0;
18723
18718
  }
18724
18719
 
18720
+ // ../core/src/search/shortTermSql.ts
18721
+ function shortTermsSql(patterns) {
18722
+ return `short_terms(pattern) AS (VALUES ${patterns.map(() => "(?)").join(", ")})`;
18723
+ }
18724
+ var SHORT_MATCH_SQL = `
18725
+ NOT EXISTS (
18726
+ SELECT 1 FROM short_terms
18727
+ WHERE tools.name NOT LIKE pattern ESCAPE '!'
18728
+ AND tools.description NOT LIKE pattern ESCAPE '!'
18729
+ AND tools.feedback NOT LIKE pattern ESCAPE '!'
18730
+ )
18731
+ `;
18732
+ var SHORT_SCORE_SQL = `
18733
+ (
18734
+ SELECT COALESCE(SUM(
18735
+ CASE
18736
+ WHEN tools.name LIKE pattern ESCAPE '!' THEN 10
18737
+ WHEN tools.description LIKE pattern ESCAPE '!' THEN 3
18738
+ WHEN tools.feedback LIKE pattern ESCAPE '!' THEN 1
18739
+ ELSE 0
18740
+ END
18741
+ ), 0)
18742
+ FROM short_terms
18743
+ )
18744
+ `;
18745
+
18725
18746
  // ../core/src/search/sqlSearchIndex.ts
18726
18747
  var TOOL_SEARCH_SCHEMA_STATEMENTS = [
18727
18748
  `CREATE TABLE IF NOT EXISTS tb_search_tools_v3 (
@@ -18859,12 +18880,34 @@ function toolSearchCandidateStatement(prepared, limit, offset) {
18859
18880
  `
18860
18881
  };
18861
18882
  }
18883
+ var sqliteSearchDialect = {
18884
+ candidateStatement: (query, limit, offset) => toolSearchCandidateStatement(prepareToolSearchQuery(query), limit, offset),
18885
+ schemaStatements: TOOL_SEARCH_SCHEMA_STATEMENTS,
18886
+ statements: {
18887
+ bumpRevision: BUMP_REVISION_SQL,
18888
+ completeRebuild: COMPLETE_REBUILD_SQL,
18889
+ deleteAllSnapshots: DELETE_ALL_SNAPSHOTS_SQL,
18890
+ deleteAllTools: DELETE_ALL_TOOLS_SQL,
18891
+ deleteSnapshot: DELETE_SNAPSHOT_SQL,
18892
+ deleteSnapshotPrefix: DELETE_SNAPSHOT_PREFIX_SQL,
18893
+ deleteTools: DELETE_TOOLS_SQL,
18894
+ deleteToolsPrefix: DELETE_TOOLS_PREFIX_SQL,
18895
+ insertSnapshot: TOOL_SEARCH_INSERT_SNAPSHOT_SQL,
18896
+ meta: META_SQL,
18897
+ pathState: PATH_STATE_SQL,
18898
+ present: PRESENT_SQL,
18899
+ presentPrefix: PRESENT_PREFIX_SQL,
18900
+ snapshotDigests: SNAPSHOT_DIGESTS_SQL
18901
+ }
18902
+ };
18862
18903
  var SqlSearchIndex = class {
18863
- constructor(driver) {
18904
+ constructor(driver, dialect = sqliteSearchDialect) {
18864
18905
  this.driver = driver;
18906
+ this.dialect = dialect;
18865
18907
  }
18866
18908
  driver;
18867
18909
  capabilities = ["search"];
18910
+ dialect;
18868
18911
  /** 容量 trigger 的 ABORT 在各驱动里错误形状不同,统一按标记串归一。 */
18869
18912
  async writeOrCapacity(statements) {
18870
18913
  try {
@@ -18877,14 +18920,14 @@ var SqlSearchIndex = class {
18877
18920
  }
18878
18921
  }
18879
18922
  async meta() {
18880
- const row = await this.driver.first({ params: [], sql: META_SQL });
18923
+ const row = await this.driver.first({ params: [], sql: this.dialect.statements.meta });
18881
18924
  if (row === null) throw new TBError("internal", "\u5DE5\u5177\u641C\u7D22 meta \u7F3A\u5931");
18882
18925
  return row;
18883
18926
  }
18884
18927
  async snapshotDigests() {
18885
18928
  const rows = await this.driver.all({
18886
18929
  params: [],
18887
- sql: SNAPSHOT_DIGESTS_SQL
18930
+ sql: this.dialect.statements.snapshotDigests
18888
18931
  });
18889
18932
  return new Map(rows.map((row) => [row.path, row.digest]));
18890
18933
  }
@@ -18898,7 +18941,7 @@ var SqlSearchIndex = class {
18898
18941
  await this.driver.ensureSchema();
18899
18942
  const current = await this.driver.first({
18900
18943
  params: [canonical, canonical],
18901
- sql: PATH_STATE_SQL
18944
+ sql: this.dialect.statements.pathState
18902
18945
  });
18903
18946
  const digest = records.length === 0 ? null : toolSearchSnapshotDigest(records);
18904
18947
  if (current !== null && (digest !== null && current.digest === digest || digest === null && current.digest === null && current.has_tools === 0)) return;
@@ -18907,12 +18950,13 @@ var SqlSearchIndex = class {
18907
18950
  }
18908
18951
  const inserts = this.driver.insertRecords(records);
18909
18952
  this.driver.assertInsertBudget?.(inserts.length);
18953
+ const statements = this.dialect.statements;
18910
18954
  await this.writeOrCapacity([
18911
- { params: [canonical], sql: DELETE_TOOLS_SQL },
18955
+ { params: [canonical], sql: statements.deleteTools },
18912
18956
  ...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 }
18957
+ { params: [canonical], sql: statements.deleteSnapshot },
18958
+ ...digest === null ? [] : [{ params: [canonical, digest], sql: statements.insertSnapshot }],
18959
+ { params: [], sql: statements.bumpRevision }
18916
18960
  ]);
18917
18961
  }
18918
18962
  async remove(path) {
@@ -18920,13 +18964,14 @@ var SqlSearchIndex = class {
18920
18964
  await this.driver.ensureSchema();
18921
18965
  const current = await this.driver.first({
18922
18966
  params: [canonical],
18923
- sql: PRESENT_SQL
18967
+ sql: this.dialect.statements.present
18924
18968
  });
18925
18969
  if (current === null) return;
18970
+ const statements = this.dialect.statements;
18926
18971
  await this.driver.write([
18927
- { params: [canonical], sql: DELETE_TOOLS_SQL },
18928
- { params: [canonical], sql: DELETE_SNAPSHOT_SQL },
18929
- { params: [], sql: BUMP_REVISION_SQL }
18972
+ { params: [canonical], sql: statements.deleteTools },
18973
+ { params: [canonical], sql: statements.deleteSnapshot },
18974
+ { params: [], sql: statements.bumpRevision }
18930
18975
  ]);
18931
18976
  }
18932
18977
  async removePrefix(path) {
@@ -18935,13 +18980,14 @@ var SqlSearchIndex = class {
18935
18980
  const prefixParams = [canonical, canonical, canonical];
18936
18981
  const current = await this.driver.first({
18937
18982
  params: prefixParams,
18938
- sql: PRESENT_PREFIX_SQL
18983
+ sql: this.dialect.statements.presentPrefix
18939
18984
  });
18940
18985
  if (current === null) return;
18986
+ const statements = this.dialect.statements;
18941
18987
  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 }
18988
+ { params: prefixParams, sql: statements.deleteToolsPrefix },
18989
+ { params: prefixParams, sql: statements.deleteSnapshotPrefix },
18990
+ { params: [], sql: statements.bumpRevision }
18945
18991
  ]);
18946
18992
  }
18947
18993
  async rebuild(documents) {
@@ -18955,12 +19001,13 @@ var SqlSearchIndex = class {
18955
19001
  const inserts = this.driver.insertRecords(records);
18956
19002
  const snapshots = this.driver.insertSnapshots(desired);
18957
19003
  this.driver.assertInsertBudget?.(inserts.length + snapshots.length);
19004
+ const statements = this.dialect.statements;
18958
19005
  await this.writeOrCapacity([
18959
- { params: [], sql: DELETE_ALL_TOOLS_SQL },
18960
- { params: [], sql: DELETE_ALL_SNAPSHOTS_SQL },
19006
+ { params: [], sql: statements.deleteAllTools },
19007
+ { params: [], sql: statements.deleteAllSnapshots },
18961
19008
  ...inserts,
18962
19009
  ...snapshots,
18963
- { params: [], sql: COMPLETE_REBUILD_SQL }
19010
+ { params: [], sql: statements.completeRebuild }
18964
19011
  ]);
18965
19012
  }
18966
19013
  async search(query, opts) {
@@ -18979,7 +19026,7 @@ var SqlSearchIndex = class {
18979
19026
  );
18980
19027
  const limit = Math.min(normalizeToolSearchLimit(opts?.limit), TOOL_SEARCH_BATCH_LIMIT);
18981
19028
  const rows = await this.driver.all(
18982
- toolSearchCandidateStatement(prepareToolSearchQuery(normalized), limit, offset)
19029
+ this.dialect.candidateStatement(normalized, limit, offset)
18983
19030
  );
18984
19031
  const hasMore = rows.length > limit;
18985
19032
  const page = hasMore ? rows.slice(0, limit) : rows;
@@ -19018,6 +19065,145 @@ var SqlSearchIndex = class {
19018
19065
  }
19019
19066
  };
19020
19067
 
19068
+ // ../core/src/search/pgSearchDialect.ts
19069
+ var PG_SEARCH_SCHEMA_STATEMENTS = [
19070
+ `CREATE TABLE IF NOT EXISTS tb_search_tools_v3 (
19071
+ id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
19072
+ path text NOT NULL,
19073
+ name text NOT NULL,
19074
+ description text NOT NULL DEFAULT '',
19075
+ feedback text NOT NULL DEFAULT '',
19076
+ UNIQUE(path, name)
19077
+ )`,
19078
+ // 这里**故意不建 trigram GIN 索引**。实测(4000 条记录 = 500 节点上限满载):
19079
+ // 候选查询是"三列 ILIKE 用 OR 连接 + LIMIT",规划器一律选 Seq Scan(整表仅 1 个
19080
+ // buffer),GIN 索引一次都没被使用;而它让插入从 13.7ms 涨到 75.8ms(5.5×)、表总大小
19081
+ // 从 1072 kB 涨到 7208 kB(6.7×),检索却仍是 0.50 vs 0.53ms —— 纯负担。
19082
+ // 索引记录数受 TOOL_SEARCH_AUDIT_NODE_LIMIT 硬顶约束,不会增长到需要索引的规模;
19083
+ // 若将来放宽该上限,应连同候选查询形状(拆成 UNION 或改单列检索列)一起重新评估。
19084
+ `CREATE TABLE IF NOT EXISTS tb_search_meta_v3 (
19085
+ singleton integer PRIMARY KEY CHECK (singleton = 1),
19086
+ revision bigint NOT NULL DEFAULT 0,
19087
+ seeded integer NOT NULL DEFAULT 0,
19088
+ cursor_secret text NOT NULL
19089
+ )`,
19090
+ // cursor_secret 需 64 hex(32 字节)。两个内置 gen_random_uuid() 去连字符正好 64
19091
+ // hex,避免依赖 pgcrypto 的 gen_random_bytes(自托管 PG 未必预装 pgcrypto)。
19092
+ `INSERT INTO tb_search_meta_v3(singleton, revision, seeded, cursor_secret)
19093
+ VALUES (
19094
+ 1, 0, 0,
19095
+ replace(gen_random_uuid()::text, '-', '') || replace(gen_random_uuid()::text, '-', '')
19096
+ )
19097
+ ON CONFLICT (singleton) DO NOTHING`,
19098
+ `CREATE TABLE IF NOT EXISTS tb_search_snapshots_v3 (
19099
+ path text PRIMARY KEY,
19100
+ digest text NOT NULL
19101
+ )`,
19102
+ `CREATE OR REPLACE FUNCTION tb_search_snapshots_v3_capacity()
19103
+ RETURNS trigger AS $$
19104
+ BEGIN
19105
+ IF (SELECT COUNT(*) FROM tb_search_snapshots_v3) >= ${TOOL_SEARCH_AUDIT_NODE_LIMIT} THEN
19106
+ RAISE EXCEPTION '${TOOL_SEARCH_CAPACITY_MARKER}';
19107
+ END IF;
19108
+ RETURN NEW;
19109
+ END;
19110
+ $$ LANGUAGE plpgsql`,
19111
+ `DROP TRIGGER IF EXISTS tb_search_snapshots_v3_capacity_trg ON tb_search_snapshots_v3`,
19112
+ `CREATE TRIGGER tb_search_snapshots_v3_capacity_trg
19113
+ BEFORE INSERT ON tb_search_snapshots_v3
19114
+ FOR EACH ROW EXECUTE FUNCTION tb_search_snapshots_v3_capacity()`
19115
+ ];
19116
+ var PG_SEARCH_WRITE_LOCK_KEY = 2069799624;
19117
+ var PG_SEARCH_INSERT_SNAPSHOT_SQL = "INSERT INTO tb_search_snapshots_v3(path, digest) VALUES ($1, $2)";
19118
+ function pgBulkInsertSql(table, columns, rows) {
19119
+ const tuples = [];
19120
+ for (let r = 0; r < rows; r++) {
19121
+ const placeholders = columns.map((_, c) => `$${r * columns.length + c + 1}`);
19122
+ tuples.push(`(${placeholders.join(", ")})`);
19123
+ }
19124
+ return `INSERT INTO ${table} (${columns.join(", ")}) VALUES ${tuples.join(", ")}`;
19125
+ }
19126
+ var PG_SEARCH_TOOLS_TABLE = "tb_search_tools_v3";
19127
+ var PG_SEARCH_TOOLS_COLUMNS = ["path", "name", "description", "feedback"];
19128
+ var PG_SEARCH_SNAPSHOTS_TABLE = "tb_search_snapshots_v3";
19129
+ var PG_SEARCH_SNAPSHOTS_COLUMNS = ["path", "digest"];
19130
+ var PG_SEARCH_INSERT_ROWS_MAX = 1e3;
19131
+ var META_SQL2 = `
19132
+ SELECT revision::int AS revision, seeded::int AS seeded, cursor_secret
19133
+ FROM tb_search_meta_v3 WHERE singleton = 1
19134
+ `;
19135
+ var SNAPSHOT_DIGESTS_SQL2 = "SELECT path, digest FROM tb_search_snapshots_v3 ORDER BY path";
19136
+ var PATH_STATE_SQL2 = `
19137
+ SELECT snapshots.digest,
19138
+ EXISTS(SELECT 1 FROM tb_search_tools_v3 WHERE path = $1)::int AS has_tools,
19139
+ (SELECT COUNT(*) FROM tb_search_snapshots_v3)::int AS path_count
19140
+ FROM (SELECT 1) AS singleton
19141
+ LEFT JOIN tb_search_snapshots_v3 AS snapshots ON snapshots.path = $2
19142
+ `;
19143
+ var PRESENT_SQL2 = "SELECT 1 AS present FROM tb_search_tools_v3 WHERE path = $1 LIMIT 1";
19144
+ var PRESENT_PREFIX_SQL2 = `
19145
+ SELECT 1 AS present FROM tb_search_tools_v3
19146
+ WHERE path = $1 OR substr(path, 1, length($2) + 1) = $3 || '/'
19147
+ LIMIT 1
19148
+ `;
19149
+ var DELETE_TOOLS_SQL2 = "DELETE FROM tb_search_tools_v3 WHERE path = $1";
19150
+ var DELETE_SNAPSHOT_SQL2 = "DELETE FROM tb_search_snapshots_v3 WHERE path = $1";
19151
+ var DELETE_TOOLS_PREFIX_SQL2 = `
19152
+ DELETE FROM tb_search_tools_v3
19153
+ WHERE path = $1 OR substr(path, 1, length($2) + 1) = $3 || '/'
19154
+ `;
19155
+ var DELETE_SNAPSHOT_PREFIX_SQL2 = `
19156
+ DELETE FROM tb_search_snapshots_v3
19157
+ WHERE path = $1 OR substr(path, 1, length($2) + 1) = $3 || '/'
19158
+ `;
19159
+ var DELETE_ALL_TOOLS_SQL2 = "DELETE FROM tb_search_tools_v3";
19160
+ var DELETE_ALL_SNAPSHOTS_SQL2 = "DELETE FROM tb_search_snapshots_v3";
19161
+ var BUMP_REVISION_SQL2 = "UPDATE tb_search_meta_v3 SET revision = revision + 1 WHERE singleton = 1";
19162
+ var COMPLETE_REBUILD_SQL2 = "UPDATE tb_search_meta_v3 SET seeded = 1, revision = revision + 1 WHERE singleton = 1";
19163
+ function pgCandidateStatement(query, limit, offset) {
19164
+ const patterns = toolSearchLikePatterns(query);
19165
+ const matchClauses = patterns.map((_, i) => {
19166
+ const p = `$${i + 1}`;
19167
+ return `(name ILIKE ${p} ESCAPE '!' OR description ILIKE ${p} ESCAPE '!' OR feedback ILIKE ${p} ESCAPE '!')`;
19168
+ });
19169
+ const scoreTerms = patterns.map((_, i) => {
19170
+ const p = `$${i + 1}`;
19171
+ 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`;
19172
+ });
19173
+ const limitParam = `$${patterns.length + 1}`;
19174
+ const offsetParam = `$${patterns.length + 2}`;
19175
+ return {
19176
+ params: [...patterns, limit + 1, offset],
19177
+ sql: `
19178
+ SELECT id, path, name, (${scoreTerms.join(" + ")}) AS score
19179
+ FROM tb_search_tools_v3
19180
+ WHERE ${matchClauses.join(" AND ")}
19181
+ ORDER BY score DESC, path, name
19182
+ LIMIT ${limitParam} OFFSET ${offsetParam}
19183
+ `
19184
+ };
19185
+ }
19186
+ var pgSearchDialect = {
19187
+ candidateStatement: pgCandidateStatement,
19188
+ schemaStatements: PG_SEARCH_SCHEMA_STATEMENTS,
19189
+ statements: {
19190
+ bumpRevision: BUMP_REVISION_SQL2,
19191
+ completeRebuild: COMPLETE_REBUILD_SQL2,
19192
+ deleteAllSnapshots: DELETE_ALL_SNAPSHOTS_SQL2,
19193
+ deleteAllTools: DELETE_ALL_TOOLS_SQL2,
19194
+ deleteSnapshot: DELETE_SNAPSHOT_SQL2,
19195
+ deleteSnapshotPrefix: DELETE_SNAPSHOT_PREFIX_SQL2,
19196
+ deleteTools: DELETE_TOOLS_SQL2,
19197
+ deleteToolsPrefix: DELETE_TOOLS_PREFIX_SQL2,
19198
+ insertSnapshot: PG_SEARCH_INSERT_SNAPSHOT_SQL,
19199
+ meta: META_SQL2,
19200
+ pathState: PATH_STATE_SQL2,
19201
+ present: PRESENT_SQL2,
19202
+ presentPrefix: PRESENT_PREFIX_SQL2,
19203
+ snapshotDigests: SNAPSHOT_DIGESTS_SQL2
19204
+ }
19205
+ };
19206
+
19021
19207
  // ../core/src/secret/secretStore.ts
19022
19208
  var AES_GCM_IV_BYTES = 12;
19023
19209
  var MASTER_KEY_BYTES = 32;
@@ -19792,10 +19978,9 @@ var NodeRegistryStore = class {
19792
19978
  * 只扫子树(前缀限定),不再对全树做内存过滤——避免 children/hasChildren/subtree 的
19793
19979
  * O(N²)(每层各扫全树)。`opts.limit` 传给底层 `store.list` 以小步取(hasChildren 短路用)。
19794
19980
  *
19795
- * **Workers 子请求上限约束**:KvStateStore.list 对每个键各发一次 `get`,即翻页取到的每个
19796
- * 键消耗一次 Workers 子请求(免费套餐 50 / 付费 1000,含出站 fetch 与 KV 读)。故子树规模
19797
- * (含中间 directory)应远小于该上限——当前树规模小(节点数十级)可接受;规模变大后
19798
- * 需改 KV metadata 承载值(list 不再逐 get)或换 SQLite 宿主。
19981
+ * **Workers 查询预算约束**:D1StateStore.list 是单条 SQL 直接带值返回(ADR-001 迁 D1 后
19982
+ * 不再逐键 get),每页只花一次 D1 查询;但 Workers 单请求仍有查询/子请求预算,深翻页的
19983
+ * 页数应远小于预算——当前树规模小(节点数十级)可接受。
19799
19984
  */
19800
19985
  async scanPrefix(keyPrefix, opts) {
19801
19986
  const out = [];
@@ -20074,6 +20259,7 @@ export {
20074
20259
  KEY_PLUGIN,
20075
20260
  KEY_BOOTSTRAPPED,
20076
20261
  KEY_FEEDBACK,
20262
+ prefixUpperBound,
20077
20263
  AnnotationStore,
20078
20264
  checkScopes,
20079
20265
  check2 as check,
@@ -20185,6 +20371,14 @@ export {
20185
20371
  TOOL_SEARCH_INSERT_SQL,
20186
20372
  TOOL_SEARCH_INSERT_SNAPSHOT_SQL,
20187
20373
  SqlSearchIndex,
20374
+ PG_SEARCH_WRITE_LOCK_KEY,
20375
+ pgBulkInsertSql,
20376
+ PG_SEARCH_TOOLS_TABLE,
20377
+ PG_SEARCH_TOOLS_COLUMNS,
20378
+ PG_SEARCH_SNAPSHOTS_TABLE,
20379
+ PG_SEARCH_SNAPSHOTS_COLUMNS,
20380
+ PG_SEARCH_INSERT_ROWS_MAX,
20381
+ pgSearchDialect,
20188
20382
  SecretStoreImpl,
20189
20383
  SKILLHUB_CAPABILITIES,
20190
20384
  skillhubScopeForCmd,