@tool-bridge/server 0.20.0 → 0.21.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 (111) hide show
  1. package/dist/{airtable-ZNWHIJMO.js → airtable-LLZDFN7M.js} +19 -16
  2. package/dist/{alt_text_generator_ai-X7RMDDM5.js → alt_text_generator_ai-W7O34SNG.js} +4 -4
  3. package/dist/{amap-3VER75VH.js → amap-VOX4T2AW.js} +4 -4
  4. package/dist/{anthropic-N7NTB3UC.js → anthropic-G23NN3X5.js} +23 -25
  5. package/dist/{apify-JB5P5AJI.js → apify-Y3SS734K.js} +20 -19
  6. package/dist/{brave_search-USL5OOBS.js → brave_search-ZC7OAPSZ.js} +16 -14
  7. package/dist/{chunk-6ANLYNFB.js → chunk-ATK45BXV.js} +1 -1
  8. package/dist/{chunk-6X55ALDX.js → chunk-E6JCVKW6.js} +6 -5
  9. package/dist/{chunk-RVUERWUZ.js → chunk-KMTT3I6D.js} +768 -1048
  10. package/dist/chunk-R6P4XAE5.js +248 -0
  11. package/dist/{chunk-3WL6EXYX.js → chunk-U7B6DS2O.js} +1 -1
  12. package/dist/{chunk-WIGQCP6O.js → chunk-UZM2RXZH.js} +159 -182
  13. package/dist/chunk-XYBU3WZH.js +71 -0
  14. package/dist/{circleci-LBGB25LP.js → circleci-3BAX5FCG.js} +20 -24
  15. package/dist/{clerk-6RX37CNZ.js → clerk-6LEM6TNU.js} +22 -21
  16. package/dist/{cloudflare_dns-NQGW7FHV.js → cloudflare_dns-KINYTJUD.js} +21 -17
  17. package/dist/{cohere-XPC2NAEW.js → cohere-XCJ5AJ6B.js} +19 -17
  18. package/dist/{confluence-ZUG2LT5A.js → confluence-B3EWPZVE.js} +16 -11
  19. package/dist/{convertapi-ZLXKWV3L.js → convertapi-EUWSQYPF.js} +3 -3
  20. package/dist/{currencyapi-T3A3HSOD.js → currencyapi-KVTIK3GL.js} +23 -26
  21. package/dist/{deepseek-NJMOD23E.js → deepseek-PC5YGNC5.js} +27 -17
  22. package/dist/{docker_hub-D2MQCSJ7.js → docker_hub-C3MA5FU6.js} +4 -4
  23. package/dist/{dropbox-MI6U3SOT.js → dropbox-XBV7Z2IR.js} +9 -8
  24. package/dist/{dub-P2BYBYV4.js → dub-LDOFG3HC.js} +22 -19
  25. package/dist/{e2b-BGKIAE54.js → e2b-JMCPSVBW.js} +20 -20
  26. package/dist/{exa-EUY7VV4C.js → exa-RAK7O7RD.js} +22 -25
  27. package/dist/{fal_ai-AAOG5FYJ.js → fal_ai-23E7JPNT.js} +18 -17
  28. package/dist/feishu-7QRIDUV6.js +12019 -0
  29. package/dist/{feishu_custom_bot-BWGMNVXF.js → feishu_custom_bot-TJ4K7QNJ.js} +3 -3
  30. package/dist/{figma-SJSWYCGD.js → figma-E6IX5DTH.js} +21 -23
  31. package/dist/{firehydrant-MOXK2PST.js → firehydrant-ZBLPQREE.js} +15 -15
  32. package/dist/{fixer-ISIDUDZU.js → fixer-BWON27UO.js} +4 -4
  33. package/dist/{fly-U4KPSGBF.js → fly-ZH3HFCZJ.js} +20 -16
  34. package/dist/{front-ZHM2YX2E.js → front-QCGXYEDJ.js} +20 -23
  35. package/dist/{geocodio-SVCCAXAV.js → geocodio-YGNI7DA4.js} +4 -4
  36. package/dist/{ghost-INTR7FIY.js → ghost-EVSGKH2Q.js} +4 -4
  37. package/dist/{github-T275VVWR.js → github-MA2BGRCJ.js} +28 -27
  38. package/dist/{gmail-KSSPOE67.js → gmail-E5E6AADE.js} +17 -17
  39. package/dist/{googlecalendar-JB5RW27L.js → googlecalendar-BTLFPXTD.js} +22 -19
  40. package/dist/{googledocs-G522PUGW.js → googledocs-BUHL4J2H.js} +6 -5
  41. package/dist/{grafana-44ZPIV5P.js → grafana-GLU2DWF2.js} +24 -25
  42. package/dist/{graphhopper-2MORXLOW.js → graphhopper-WSMB3TCD.js} +4 -4
  43. package/dist/index.d.ts +31 -30
  44. package/dist/index.js +4 -3
  45. package/dist/{ip2proxy-R4K4KEMI.js → ip2proxy-EZ64Y4ZH.js} +4 -4
  46. package/dist/{ipgeolocation_io-H4J55OGI.js → ipgeolocation_io-AA7HAS22.js} +4 -4
  47. package/dist/{ipqualityscore-XGID4OHA.js → ipqualityscore-BHJXVTJT.js} +4 -4
  48. package/dist/{jina_ai-7ZVDOR3Z.js → jina_ai-EFBHTBXL.js} +20 -21
  49. package/dist/{jira-CTIYZTT3.js → jira-HQSHAA5K.js} +20 -16
  50. package/dist/{langsmith-ISP567FS.js → langsmith-5W6SCT6F.js} +25 -25
  51. package/dist/{lemlist-OGKK272F.js → lemlist-HJWH6UMK.js} +23 -24
  52. package/dist/{linear-6JX4E3JI.js → linear-K7RYFYAD.js} +6 -5
  53. package/dist/{logsnag-BVB36ZCL.js → logsnag-4KFOHL37.js} +20 -22
  54. package/dist/main.js +103 -102
  55. package/dist/{mattermost-UECVPZGY.js → mattermost-S2BRCWLQ.js} +21 -17
  56. package/dist/{mem0-EUA7S2OO.js → mem0-CAW43CIC.js} +15 -15
  57. package/dist/{memos-BYSBJRWZ.js → memos-TWEGPKFM.js} +39 -34
  58. package/dist/{metabase-4JXZH3YG.js → metabase-MMSEPCOF.js} +22 -18
  59. package/dist/{mistral_ai-2C5BTBKW.js → mistral_ai-64BGZQHP.js} +24 -21
  60. package/dist/{mother_duck-ZGNNNR3X.js → mother_duck-H7PCQNZ2.js} +23 -19
  61. package/dist/{ngrok-NTPGMRXI.js → ngrok-GQCUGZKJ.js} +17 -22
  62. package/dist/{notes-KGYXX6N6.js → notes-PFMKRO33.js} +1 -1
  63. package/dist/{notion-EX3X2G7G.js → notion-DQWZWP4N.js} +20 -17
  64. package/dist/{open_exchange_rates-2V2LIGPS.js → open_exchange_rates-QMMD735E.js} +4 -4
  65. package/dist/{openai-KQFQPK7Z.js → openai-W6PX32NZ.js} +22 -16
  66. package/dist/{opengraph_io-B63SEYJY.js → opengraph_io-HNDBXYNW.js} +4 -4
  67. package/dist/{openrouter-62A4H62Q.js → openrouter-JJYMEAUL.js} +19 -14
  68. package/dist/{outline-QC33XLCK.js → outline-MCBNQZYY.js} +18 -20
  69. package/dist/{paddle-HDZG35Y7.js → paddle-D2SKLUDN.js} +17 -15
  70. package/dist/{perplexity-M7LOMJWA.js → perplexity-XIFMKUAE.js} +19 -23
  71. package/dist/{pinecone-Y7YCJRZM.js → pinecone-HUFTALV2.js} +19 -24
  72. package/dist/{pipedrive-FLJA62UX.js → pipedrive-Y2O7QGFF.js} +22 -23
  73. package/dist/{polar-AE55Q425.js → polar-TYTOMOSR.js} +19 -17
  74. package/dist/{posthog-IAY5D3YW.js → posthog-43JAR3VW.js} +29 -24
  75. package/dist/{postmark-NMKAXDXZ.js → postmark-KL2QJYSG.js} +19 -17
  76. package/dist/{prerender-CDJM7I7N.js → prerender-MENYM2TY.js} +4 -4
  77. package/dist/{pubmed-N437ZJOR.js → pubmed-GOXUVVH5.js} +6 -5
  78. package/dist/{railway-NBWYXCUM.js → railway-V2SID4WV.js} +3 -3
  79. package/dist/{readwise-QRO3UC3R.js → readwise-CI4GIMMJ.js} +16 -15
  80. package/dist/{render-NEW7SROG.js → render-SUBJ6YRZ.js} +21 -20
  81. package/dist/{replicate-73YQLRTY.js → replicate-756MXPYX.js} +20 -21
  82. package/dist/{resend-R5BAZFHZ.js → resend-ZKH3BTBI.js} +15 -11
  83. package/dist/{rootly-5BLALPCS.js → rootly-CD2LJHPI.js} +19 -18
  84. package/dist/{scrapfly-EHFLNNUZ.js → scrapfly-NSRHFDIQ.js} +4 -4
  85. package/dist/{scrapingbee-UXLYS72S.js → scrapingbee-OQHLAVEY.js} +4 -4
  86. package/dist/{screenshot_fyi-KC3NLTJ6.js → screenshot_fyi-DVWG3AXC.js} +4 -4
  87. package/dist/{semantic_scholar-SA5OIUWA.js → semantic_scholar-T4A252KW.js} +21 -20
  88. package/dist/{sentry-BAE3XLJN.js → sentry-546MNDJG.js} +22 -19
  89. package/dist/{shodan-FJR6MKKW.js → shodan-C3OON3Z3.js} +4 -4
  90. package/dist/{shopify-7OA6SLN5.js → shopify-Y2HN2MCQ.js} +23 -19
  91. package/dist/{stripe-MUWDZGGF.js → stripe-VE3CD3AY.js} +3 -3
  92. package/dist/{supabase-SWWGNWYR.js → supabase-U2SL4D63.js} +18 -17
  93. package/dist/{tavily-XQNJ5EDI.js → tavily-KCZHK6HE.js} +20 -20
  94. package/dist/{telegram-RR6JPZOG.js → telegram-3URFBCMY.js} +4 -4
  95. package/dist/{telnyx-7PKXOWSO.js → telnyx-CXQ4EZUX.js} +19 -19
  96. package/dist/{todoist-63X5IUJE.js → todoist-HNPWNYTD.js} +18 -17
  97. package/dist/{trello-MOG63DAI.js → trello-3W2MIXRP.js} +4 -4
  98. package/dist/{turso-ENWTSHDL.js → turso-2EQF7C2Z.js} +23 -30
  99. package/dist/{twilio-FDXUN7VX.js → twilio-4PDBJKWX.js} +6 -5
  100. package/dist/{umami-TM7PROWF.js → umami-5REN7TGP.js} +23 -28
  101. package/dist/{unsplash-NWXLKSOW.js → unsplash-EIXL424F.js} +19 -18
  102. package/dist/{upstash_redis-CUTQ5L2N.js → upstash_redis-G4LQBYHA.js} +17 -13
  103. package/dist/{uptimerobot-NNO32M3I.js → uptimerobot-KNJ3EYLY.js} +3 -3
  104. package/dist/{v2ex-24KMSWS7.js → v2ex-RHJ234PZ.js} +35 -18
  105. package/dist/{vercel-B45LPF6I.js → vercel-AS6NCIC7.js} +21 -18
  106. package/dist/{wolfram_alpha_api-DKJWVR6G.js → wolfram_alpha_api-3G4PUJWB.js} +4 -4
  107. package/dist/{wordpress-XYFSDZXY.js → wordpress-KNDAAUV7.js} +21 -17
  108. package/dist/{workos-BEM7EPHM.js → workos-R6UITSJ7.js} +26 -27
  109. package/dist/{zhihu-CFHZ4NC7.js → zhihu-AGK4HILK.js} +21 -21
  110. package/package.json +5 -5
  111. package/dist/feishu-AN5IJYOW.js +0 -231
@@ -30,6 +30,7 @@ var STATUS_OVERRIDES = /* @__PURE__ */ new Set([
30
30
  "permission_denied:401",
31
31
  "unavailable:501"
32
32
  ]);
33
+ var TB_ERROR_BRAND = /* @__PURE__ */ Symbol.for("tool-bridge.TBError.v1");
33
34
  var TBError = class _TBError extends Error {
34
35
  code;
35
36
  retryable;
@@ -37,6 +38,12 @@ var TBError = class _TBError extends Error {
37
38
  constructor(code, message, options = {}) {
38
39
  super(message);
39
40
  this.name = "TBError";
41
+ Object.defineProperty(this, TB_ERROR_BRAND, {
42
+ configurable: false,
43
+ enumerable: false,
44
+ value: true,
45
+ writable: false
46
+ });
40
47
  const retryable = options.retryable ?? false;
41
48
  if (retryable && !RETRYABLE_CODES.has(code)) {
42
49
  throw new Error(`TBError: retryable=true not allowed for code '${code}'`);
@@ -70,7 +77,10 @@ var TBError = class _TBError extends Error {
70
77
  }
71
78
  };
72
79
  function isTBError(value) {
73
- return value instanceof TBError;
80
+ if (typeof value !== "object" || value === null) return false;
81
+ if (value[TB_ERROR_BRAND] !== true) return false;
82
+ const candidate = value;
83
+ return typeof candidate.code === "string" && TB_ERROR_CODES.includes(candidate.code) && typeof candidate.message === "string" && typeof candidate.retryable === "boolean" && typeof candidate.httpStatus === "number" && typeof candidate.toJSON === "function";
74
84
  }
75
85
 
76
86
  // ../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
@@ -14609,6 +14619,20 @@ function canonicalizePath(path) {
14609
14619
  if (norm === "") return "";
14610
14620
  return norm.split("/").map((seg) => canonicalizeSegment(seg)).join("/");
14611
14621
  }
14622
+ function assertNoCollision(names, context) {
14623
+ const seen = /* @__PURE__ */ new Map();
14624
+ for (const name of names) {
14625
+ const lower = name.toLowerCase();
14626
+ const prev = seen.get(lower);
14627
+ if (prev !== void 0 && prev !== name) {
14628
+ throw new TBError(
14629
+ "invalid_argument",
14630
+ `${context}:\u6807\u8BC6\u7B26 '${prev}' \u4E0E '${name}' \u5C0F\u5199\u89C4\u8303\u5316\u540E\u51B2\u7A81`
14631
+ );
14632
+ }
14633
+ seen.set(lower, name);
14634
+ }
14635
+ }
14612
14636
  function segments(path) {
14613
14637
  const p = normalizePath(path);
14614
14638
  return p === "" ? [] : p.split("/");
@@ -14682,10 +14706,10 @@ function normalizeAnnotationPath(path) {
14682
14706
  return norm;
14683
14707
  }
14684
14708
  var AnnotationStore = class {
14709
+ store;
14685
14710
  constructor(store) {
14686
14711
  this.store = store;
14687
14712
  }
14688
- store;
14689
14713
  keyOf(path) {
14690
14714
  return KEY_ANNOTATION + path;
14691
14715
  }
@@ -14823,7 +14847,7 @@ var SYSTEM_AUTO = "system:auto";
14823
14847
  var RESERVED_ROOTS = ["system", "ui"];
14824
14848
 
14825
14849
  // ../core/src/auth/registerPath.ts
14826
- var segments3 = (path) => path.split("/").filter((s) => s.length > 0);
14850
+ var foldedSegments = (path) => segments(path).map((seg) => seg.toLowerCase());
14827
14851
  function isUnderPrefix(target, prefix) {
14828
14852
  if (prefix.length > target.length) return false;
14829
14853
  return prefix.every((seg, i) => seg === target[i]);
@@ -14834,7 +14858,7 @@ var deny = (message) => ({
14834
14858
  });
14835
14859
  function checkRegisterPath(input) {
14836
14860
  const { sk, targetPath, existing, reservedRoots = [] } = input;
14837
- const target = segments3(targetPath);
14861
+ const target = foldedSegments(targetPath);
14838
14862
  if (target.some((seg) => seg.startsWith("~"))) {
14839
14863
  return {
14840
14864
  allow: false,
@@ -14842,12 +14866,12 @@ function checkRegisterPath(input) {
14842
14866
  };
14843
14867
  }
14844
14868
  if (sk.registerPaths !== void 0) {
14845
- const ok = sk.registerPaths.some((p) => isUnderPrefix(target, segments3(p)));
14869
+ const ok = sk.registerPaths.some((p) => isUnderPrefix(target, foldedSegments(p)));
14846
14870
  if (!ok) {
14847
14871
  return deny(`path '${targetPath}' is outside declared registerPaths`);
14848
14872
  }
14849
14873
  } else {
14850
- const roots = /* @__PURE__ */ new Set([...RESERVED_ROOTS, ...reservedRoots]);
14874
+ const roots = /* @__PURE__ */ new Set([...RESERVED_ROOTS, ...reservedRoots.map((r) => r.toLowerCase())]);
14851
14875
  const head = target[0];
14852
14876
  if (head !== void 0 && roots.has(head)) {
14853
14877
  return deny(`cannot register under reserved root '${head}'`);
@@ -14907,6 +14931,10 @@ function base64urlEncode(bytes2) {
14907
14931
  }
14908
14932
  return out;
14909
14933
  }
14934
+ function base64Encode(bytes2) {
14935
+ const url2 = base64urlEncode(bytes2).replaceAll("-", "+").replaceAll("_", "/");
14936
+ return url2 + "=".repeat((4 - url2.length % 4) % 4);
14937
+ }
14910
14938
  function base64urlDecode(input) {
14911
14939
  if (input.length % 4 === 1 || !/^[A-Za-z0-9_-]*$/.test(input)) {
14912
14940
  throw new Error("base64urlDecode: malformed base64url input");
@@ -14926,6 +14954,12 @@ function base64urlDecode(input) {
14926
14954
  return new Uint8Array(bytes2);
14927
14955
  }
14928
14956
 
14957
+ // ../core/src/webGlobals.ts
14958
+ var g = globalThis;
14959
+ var crypto = g.crypto;
14960
+ var TextDecoder2 = g.TextDecoder;
14961
+ var TextEncoder = g.TextEncoder;
14962
+
14929
14963
  // ../core/src/omit.ts
14930
14964
  function omit2(obj, ...keys) {
14931
14965
  const rest = { ...obj };
@@ -15014,10 +15048,17 @@ var SKRegistryStore = class {
15014
15048
  const listOpts = { limit: clampLimit(opts?.limit) };
15015
15049
  if (opts?.cursor !== void 0) listOpts.cursor = opts.cursor;
15016
15050
  const page = await this.store.list(KEY_SK_ID, listOpts);
15051
+ const hashes = page.items.map(({ value }) => value).filter((value) => typeof value === "string");
15052
+ const records = /* @__PURE__ */ new Map();
15053
+ for (let i = 0; i < hashes.length; i += 100) {
15054
+ const chunk = await this.store.getMany(
15055
+ hashes.slice(i, i + 100).map((hash2) => KEY_SK_HASH + hash2)
15056
+ );
15057
+ for (const [key, value] of chunk) records.set(key, value);
15058
+ }
15017
15059
  const items = [];
15018
- for (const { value } of page.items) {
15019
- if (typeof value !== "string") continue;
15020
- const rec = await this.store.get(KEY_SK_HASH + value);
15060
+ for (const hash2 of hashes) {
15061
+ const rec = records.get(KEY_SK_HASH + hash2);
15021
15062
  if (rec) items.push(projectKey(rec));
15022
15063
  }
15023
15064
  return page.cursor !== void 0 ? { items, cursor: page.cursor } : { items };
@@ -15188,7 +15229,7 @@ var HtbpCommandRegistry = class {
15188
15229
  metadata = /* @__PURE__ */ new Map();
15189
15230
  operations = new OperationRegistry();
15190
15231
  register(name, spec, handler) {
15191
- const { h, returns, scope, ...operationSpec } = spec;
15232
+ const { h, hostOnly, returns, scope, ...operationSpec } = spec;
15192
15233
  this.operations.register(
15193
15234
  name,
15194
15235
  { ...operationSpec, description: h },
@@ -15196,6 +15237,7 @@ var HtbpCommandRegistry = class {
15196
15237
  );
15197
15238
  this.metadata.set(name, {
15198
15239
  scope,
15240
+ ...hostOnly !== void 0 ? { hostOnly } : {},
15199
15241
  ...returns !== void 0 ? { returns } : {}
15200
15242
  });
15201
15243
  return this;
@@ -15209,6 +15251,10 @@ var HtbpCommandRegistry = class {
15209
15251
  scopeFor(name) {
15210
15252
  return this.metadata.get(name)?.scope;
15211
15253
  }
15254
+ /** 该命令是否宿主专属扩展(见 {@link HtbpCommandSpec.hostOnly});未注册按 false。 */
15255
+ isHostOnly(name) {
15256
+ return this.metadata.get(name)?.hostOnly === true;
15257
+ }
15212
15258
  commandSpecs(nodePath) {
15213
15259
  return this.operations.list().map((operation) => {
15214
15260
  const metadata = this.metadata.get(operation.name);
@@ -15249,13 +15295,13 @@ var HtbpCommandRegistry = class {
15249
15295
 
15250
15296
  // ../core/src/builtin/commandRegistry.ts
15251
15297
  var BuiltinCommandRegistry = class extends HtbpCommandRegistry {
15298
+ moduleName;
15299
+ moduleDescription;
15252
15300
  constructor(moduleName, moduleDescription) {
15253
15301
  super();
15254
15302
  this.moduleName = moduleName;
15255
15303
  this.moduleDescription = moduleDescription;
15256
15304
  }
15257
- moduleName;
15258
- moduleDescription;
15259
15305
  help(nodePath) {
15260
15306
  return this.helpModel({
15261
15307
  path: nodePath,
@@ -15462,18 +15508,7 @@ function encodeForm(entries) {
15462
15508
  return [...entries].map(([key, value]) => `${encode3(key)}=${encode3(value)}`).join("&");
15463
15509
  }
15464
15510
  function base643(ascii) {
15465
- const table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
15466
- let out = "";
15467
- for (let i = 0; i < ascii.length; i += 3) {
15468
- const a = ascii.charCodeAt(i);
15469
- const b = i + 1 < ascii.length ? ascii.charCodeAt(i + 1) : Number.NaN;
15470
- const c = i + 2 < ascii.length ? ascii.charCodeAt(i + 2) : Number.NaN;
15471
- out += table[a >> 2];
15472
- out += table[(a & 3) << 4 | (Number.isNaN(b) ? 0 : b >> 4)];
15473
- out += Number.isNaN(b) ? "=" : table[(b & 15) << 2 | (Number.isNaN(c) ? 0 : c >> 6)];
15474
- out += Number.isNaN(c) ? "=" : table[c & 63];
15475
- }
15476
- return out;
15511
+ return base64Encode(Uint8Array.from(ascii, (char) => char.charCodeAt(0)));
15477
15512
  }
15478
15513
  function asRecord(value) {
15479
15514
  return typeof value === "object" && value !== null && !Array.isArray(value) ? value : void 0;
@@ -15664,6 +15699,8 @@ var contextCommands = new HtbpCommandRegistry().register(
15664
15699
  "create_upload",
15665
15700
  {
15666
15701
  h: "create a short-lived, path-scoped direct-upload grant; persist the returned uri, not url",
15702
+ // 宿主专属扩展:仅在底层具备直传签名能力时由宿主装配,不进基础动词表。
15703
+ hostOnly: true,
15667
15704
  inputSchema: external_exports.strictObject({
15668
15705
  path: external_exports.string().describe("target entry path inside the namespace"),
15669
15706
  contentType: external_exports.string().describe("media type signed into the PUT request"),
@@ -15687,14 +15724,14 @@ function contextScopeForCmd(command) {
15687
15724
  }
15688
15725
  function parseContextCmdArgs(command, args) {
15689
15726
  const normalized = command.toLowerCase();
15690
- if (!contextCommands.has(normalized) || normalized === "create_upload") {
15727
+ if (!contextCommands.has(normalized) || contextCommands.isHostOnly(normalized)) {
15691
15728
  throw new TBError("invalid_argument", `unknown cmd '${command}'`);
15692
15729
  }
15693
15730
  return contextCommands.parse(normalized, args);
15694
15731
  }
15695
15732
  async function dispatchContextCmd(provider, command, args) {
15696
15733
  const normalized = command.toLowerCase();
15697
- if (!contextCommands.has(normalized) || normalized === "create_upload") {
15734
+ if (!contextCommands.has(normalized) || contextCommands.isHostOnly(normalized)) {
15698
15735
  throw new TBError("invalid_argument", `unknown cmd '${command}'`);
15699
15736
  }
15700
15737
  const method = normalized;
@@ -15716,7 +15753,7 @@ async function dispatchContextUploadCmd(args, upload) {
15716
15753
  }
15717
15754
 
15718
15755
  // ../core/src/context/capabilities.ts
15719
- var CONTEXT_METHODS = contextCommands.names().filter((name) => name !== "create_upload");
15756
+ var CONTEXT_METHODS = contextCommands.names().filter((name) => !contextCommands.isHostOnly(name));
15720
15757
  var CONTEXT_WRITE_METHODS = CONTEXT_METHODS.filter((method) => contextCommands.scopeFor(method) === "write");
15721
15758
  function contextMethodsOf(provider) {
15722
15759
  const methods = /* @__PURE__ */ new Set();
@@ -16503,10 +16540,10 @@ function normalizeAllowHost(raw) {
16503
16540
  return host;
16504
16541
  }
16505
16542
  var RemoteAllowlistStore = class {
16543
+ store;
16506
16544
  constructor(store) {
16507
16545
  this.store = store;
16508
16546
  }
16509
- store;
16510
16547
  /** 读全部运行时条目(缺省/脏值 → 空数组);按 host 升序稳定输出。 */
16511
16548
  async list() {
16512
16549
  const raw = await this.store.get(KEY_REMOTE_ALLOWLIST);
@@ -16682,7 +16719,7 @@ function parseRecord(value) {
16682
16719
  try {
16683
16720
  if (typeof value !== "object" || value === null || Array.isArray(value)) throw new Error();
16684
16721
  const raw = value;
16685
- if (raw.v !== 1 || !Number.isSafeInteger(raw.revision) || raw.revision < 1 || !nonEmpty(raw.operationId) || raw.commandId !== raw.operationId || !nonEmpty(raw.deviceId) || !nonEmpty(raw.deviceKeyId) || !nonEmpty(raw.mountPath) || !nonEmpty(raw.targetPath) || !nonEmpty(raw.path) || !nonEmpty(raw.callerKeyId) || !nonEmpty(raw.callerOwner) || !nonEmpty(raw.traceId) || !finiteTimestamp(raw.createdAt) || !finiteTimestamp(raw.updatedAt) || !finiteTimestamp(raw.expiresAt) || !isState(raw.state) || !Number.isSafeInteger(raw.attempt) || raw.attempt < 0 || typeof raw.executionMayHaveOccurred !== "boolean") throw new Error();
16722
+ if (raw.v !== 1 || !Number.isSafeInteger(raw.revision) || raw.revision < 1 || !nonEmpty(raw.operationId) || !nonEmpty(raw.deviceId) || !nonEmpty(raw.deviceKeyId) || !nonEmpty(raw.mountPath) || !nonEmpty(raw.targetPath) || !nonEmpty(raw.path) || !nonEmpty(raw.callerKeyId) || !nonEmpty(raw.callerOwner) || !nonEmpty(raw.traceId) || !finiteTimestamp(raw.createdAt) || !finiteTimestamp(raw.updatedAt) || !finiteTimestamp(raw.expiresAt) || !isState(raw.state) || !Number.isSafeInteger(raw.attempt) || raw.attempt < 0 || typeof raw.executionMayHaveOccurred !== "boolean") throw new Error();
16686
16723
  if (raw.leaseId === void 0 !== (raw.leaseUntil === void 0)) throw new Error();
16687
16724
  if (raw.leaseId !== void 0 && (!nonEmpty(raw.leaseId) || !finiteTimestamp(raw.leaseUntil))) {
16688
16725
  throw new Error();
@@ -16694,7 +16731,6 @@ function parseRecord(value) {
16694
16731
  v: 1,
16695
16732
  revision: raw.revision,
16696
16733
  operationId: raw.operationId,
16697
- commandId: raw.commandId,
16698
16734
  deviceId: raw.deviceId,
16699
16735
  deviceKeyId: raw.deviceKeyId,
16700
16736
  mountPath: raw.mountPath,
@@ -16832,7 +16868,7 @@ var DeviceMailboxCipher = class {
16832
16868
  await this.key(),
16833
16869
  ciphertext
16834
16870
  );
16835
- return JSON.parse(new TextDecoder().decode(plaintext));
16871
+ return JSON.parse(new TextDecoder2().decode(plaintext));
16836
16872
  } catch {
16837
16873
  throw new TBError("internal", "device mailbox data cannot be decrypted", { retryable: false });
16838
16874
  }
@@ -16904,7 +16940,6 @@ var DeviceMailboxService = class {
16904
16940
  summary(record2) {
16905
16941
  return {
16906
16942
  operationId: record2.operationId,
16907
- commandId: record2.commandId,
16908
16943
  deviceId: record2.deviceId,
16909
16944
  mountPath: record2.mountPath,
16910
16945
  targetPath: record2.targetPath,
@@ -17015,7 +17050,6 @@ var DeviceMailboxService = class {
17015
17050
  v: 1,
17016
17051
  revision: 1,
17017
17052
  operationId,
17018
- commandId: operationId,
17019
17053
  deviceId: input.deviceId,
17020
17054
  deviceKeyId: input.deviceKeyId,
17021
17055
  mountPath: input.mountPath,
@@ -17113,7 +17147,6 @@ var DeviceMailboxService = class {
17113
17147
  ...page.cursor === void 0 ? {} : { cursor: page.cursor },
17114
17148
  operation: {
17115
17149
  operationId: next.operationId,
17116
- commandId: next.commandId,
17117
17150
  targetPath: next.targetPath,
17118
17151
  path: next.path,
17119
17152
  arguments: payload.arguments,
@@ -17413,7 +17446,7 @@ var toolSearchRequestSchema = external_exports.strictObject({
17413
17446
  limit: external_exports.number().int().optional(),
17414
17447
  matching: external_exports.enum(["best", "all"]).optional(),
17415
17448
  minCoverage: external_exports.number().gt(0).max(1).optional(),
17416
- mode: external_exports.enum(["keyword", "semantic"]).optional(),
17449
+ mode: external_exports.enum(["keyword"]).optional(),
17417
17450
  pathPrefix: external_exports.string().optional()
17418
17451
  }).optional(),
17419
17452
  query: external_exports.string().trim().min(1)
@@ -17429,7 +17462,6 @@ var deviceOperationSummaryShape = {
17429
17462
  attempt: external_exports.number().int().nonnegative(),
17430
17463
  caller: deviceOperationCallerSchema,
17431
17464
  cancelRequestedAt: external_exports.iso.datetime({ offset: true }).optional(),
17432
- commandId: external_exports.string().min(1),
17433
17465
  createdAt: external_exports.iso.datetime({ offset: true }),
17434
17466
  deviceId: external_exports.string().min(1),
17435
17467
  executionMayHaveOccurred: external_exports.boolean(),
@@ -17474,7 +17506,6 @@ var deviceOperationClaimSchema = external_exports.object({
17474
17506
  attempt: external_exports.number().int().positive(),
17475
17507
  caller: deviceOperationCallerSchema,
17476
17508
  cancelRequestedAt: external_exports.iso.datetime({ offset: true }).optional(),
17477
- commandId: external_exports.string().min(1),
17478
17509
  createdAt: external_exports.iso.datetime({ offset: true }),
17479
17510
  expiresAt: external_exports.iso.datetime({ offset: true }),
17480
17511
  leaseId: external_exports.string().min(1),
@@ -17875,17 +17906,7 @@ function createSkModule(store, now) {
17875
17906
 
17876
17907
  // ../core/src/builtin/index.ts
17877
17908
  async function countNodes(registry2) {
17878
- let count = 0;
17879
- let cursor;
17880
- do {
17881
- const page = await registry2.list(void 0, {
17882
- limit: LIST_LIMIT_MAX,
17883
- ...cursor !== void 0 ? { cursor } : {}
17884
- });
17885
- count += page.items.length;
17886
- cursor = page.cursor;
17887
- } while (cursor);
17888
- return count;
17909
+ return (await registry2.subtree("")).length;
17889
17910
  }
17890
17911
  function createBuiltins(deps) {
17891
17912
  const now = deps.now ?? (() => (/* @__PURE__ */ new Date()).toISOString());
@@ -17934,7 +17955,7 @@ function contextHelpModel(node, opts = {}) {
17934
17955
  return contextCommands.helpModel(
17935
17956
  { path: node.path, kind: "context", description: node.description },
17936
17957
  (command) => {
17937
- if (command.name === "create_upload") return false;
17958
+ if (contextCommands.isHostOnly(command.name)) return false;
17938
17959
  if (opts.methods !== void 0 && !opts.methods.has(command.name)) return false;
17939
17960
  return opts.readOnly !== true || command.scope === "read";
17940
17961
  }
@@ -17964,7 +17985,7 @@ async function readStreamBytes(stream) {
17964
17985
  return out;
17965
17986
  }
17966
17987
  async function readStreamText(stream) {
17967
- return new TextDecoder().decode(await readStreamBytes(stream));
17988
+ return new TextDecoder2().decode(await readStreamBytes(stream));
17968
17989
  }
17969
17990
  function ownedBytes(view) {
17970
17991
  return view.buffer instanceof ArrayBuffer ? new Uint8Array(view.buffer, view.byteOffset, view.byteLength) : new Uint8Array(view);
@@ -18001,6 +18022,14 @@ function bytesToObjectStream(bytes2) {
18001
18022
  var DEFAULT_STORE_NAME = "default";
18002
18023
  var DEFAULT_STORE_DRIVER_KEY_ROOT = "__tool_bridge_internal__/store/v1";
18003
18024
 
18025
+ // ../core/src/context/contentType.ts
18026
+ function normalizeContentType(value, message) {
18027
+ if (typeof value !== "string" || value.trim() === "" || value.length > 255 || !value.includes("/") || /[\r\n\0]/.test(value)) {
18028
+ throw new TBError("invalid_argument", message);
18029
+ }
18030
+ return value.trim().toLowerCase();
18031
+ }
18032
+
18004
18033
  // ../core/src/context/path.ts
18005
18034
  function hasControlChar(s) {
18006
18035
  for (let i = 0; i < s.length; i++) {
@@ -18083,9 +18112,10 @@ async function createObjectContextUploadGrant(store, opts, input) {
18083
18112
  if (unknownKeys.length > 0) {
18084
18113
  throw new TBError("invalid_argument", `create_upload \u542B\u672A\u77E5\u5B57\u6BB5:${unknownKeys.join(",")}`);
18085
18114
  }
18086
- if (typeof input?.contentType !== "string" || input.contentType.trim() === "" || input.contentType.length > 255 || !input.contentType.includes("/") || /[\r\n\0]/.test(input.contentType)) {
18087
- throw new TBError("invalid_argument", "create_upload \u9700\u8981\u5408\u6CD5\u7684 'contentType'");
18088
- }
18115
+ const contentType = normalizeContentType(
18116
+ input?.contentType,
18117
+ "create_upload \u9700\u8981\u5408\u6CD5\u7684 'contentType'"
18118
+ );
18089
18119
  const nsPath = normalizePath(opts.nsPath);
18090
18120
  const entryPath = normalizeEntryPath(input.path);
18091
18121
  const key = `${keyPrefixBare === "" ? "" : `${keyPrefixBare}/`}${entryPath}`;
@@ -18094,7 +18124,6 @@ async function createObjectContextUploadGrant(store, opts, input) {
18094
18124
  throw new TBError("unavailable", "\u5BF9\u8C61\u5B58\u50A8\u672A\u914D\u7F6E\u76F4\u4F20\u7B7E\u540D\u80FD\u529B", { retryable: false });
18095
18125
  }
18096
18126
  const ttlSec = assertPresignTtlSec(opts.uploadGrantTtlSec ?? PRESIGN_TTL_SEC_DEFAULT);
18097
- const contentType = input.contentType.trim();
18098
18127
  const expiresAt = new Date(Date.now() + ttlSec * 1e3).toISOString();
18099
18128
  const signed = await store.presignPut(key, ttlSec, {
18100
18129
  contentType,
@@ -18532,18 +18561,18 @@ function derivePresence(input) {
18532
18561
  var DEVICE_CALL_TIMEOUT_MS = 6e4;
18533
18562
  var DEVICE_REJECT_CLOSE_CODE = 1008;
18534
18563
  var DeviceGatewaySession = class {
18535
- constructor(io, opts) {
18536
- this.io = io;
18537
- this.opts = opts;
18538
- this.timeoutMs = opts.timeoutMs ?? DEVICE_CALL_TIMEOUT_MS;
18539
- }
18540
- io;
18541
- opts;
18542
18564
  phase_ = "awaiting-hello";
18543
18565
  helloSeen = false;
18544
18566
  results = /* @__PURE__ */ new Map();
18545
18567
  pending = /* @__PURE__ */ new Map();
18546
18568
  timeoutMs;
18569
+ io;
18570
+ opts;
18571
+ constructor(io, opts) {
18572
+ this.io = io;
18573
+ this.opts = opts;
18574
+ this.timeoutMs = opts.timeoutMs ?? DEVICE_CALL_TIMEOUT_MS;
18575
+ }
18547
18576
  get phase() {
18548
18577
  return this.phase_;
18549
18578
  }
@@ -19350,18 +19379,12 @@ function normalizeTimestamp(value, field) {
19350
19379
  try {
19351
19380
  return normalizeExpiresAt(value);
19352
19381
  } catch (error51) {
19353
- if (error51 instanceof TBError && error51.code === "invalid_argument") {
19382
+ if (isTBError(error51) && error51.code === "invalid_argument") {
19354
19383
  throw new TBError("invalid_argument", `${field} \u5FC5\u987B\u662F\u5E26\u65F6\u533A\u7684 ISO 8601 timestamp`);
19355
19384
  }
19356
19385
  throw error51;
19357
19386
  }
19358
19387
  }
19359
- function normalizeContentType(value) {
19360
- if (typeof value !== "string" || value.trim() === "" || value.length > 255 || !value.includes("/") || /[\r\n\0]/.test(value)) {
19361
- throw new TBError("invalid_argument", "contentType \u4E0D\u5408\u6CD5");
19362
- }
19363
- return value.trim().toLowerCase();
19364
- }
19365
19388
  function normalizeChecksum(value) {
19366
19389
  if (value === void 0) return void 0;
19367
19390
  if (typeof value !== "object" || value === null || Array.isArray(value)) {
@@ -19378,7 +19401,7 @@ function normalizeChecksum(value) {
19378
19401
  return { algorithm: "sha256", value: digest };
19379
19402
  }
19380
19403
  function normalizeUploadInput(input) {
19381
- const contentType = normalizeContentType(input?.contentType);
19404
+ const contentType = normalizeContentType(input?.contentType, "contentType \u4E0D\u5408\u6CD5");
19382
19405
  let filename;
19383
19406
  if (input.filename !== void 0) {
19384
19407
  if (typeof input.filename !== "string" || input.filename.trim() === "" || input.filename.length > 1024 || /[\r\n\0]/.test(input.filename)) throw new TBError("invalid_argument", "filename \u4E0D\u5408\u6CD5");
@@ -19427,7 +19450,7 @@ function normalizeContentTypePattern(value) {
19427
19450
  const prefix = value.slice(0, -1);
19428
19451
  if (prefix.length > 1 && !/[\r\n\0]/.test(value)) return value.toLowerCase();
19429
19452
  }
19430
- return normalizeContentType(value);
19453
+ return normalizeContentType(value, "contentType \u4E0D\u5408\u6CD5");
19431
19454
  }
19432
19455
  function descriptorOf(object2) {
19433
19456
  if (object2.status !== "ready" || object2.readyAt === void 0 || object2.size === void 0) throw stateCorrupt("ready object");
@@ -19449,6 +19472,15 @@ function descriptorOf(object2) {
19449
19472
  };
19450
19473
  }
19451
19474
  var StoreService = class {
19475
+ maxObjectBytes;
19476
+ now;
19477
+ relayMaxBytes;
19478
+ shareTtlSec;
19479
+ tokenSecret;
19480
+ uploadTtlSec;
19481
+ cas;
19482
+ state;
19483
+ objects;
19452
19484
  constructor(state, objects, opts) {
19453
19485
  this.state = state;
19454
19486
  this.objects = objects;
@@ -19480,15 +19512,6 @@ var StoreService = class {
19480
19512
  "shareTtlSec"
19481
19513
  );
19482
19514
  }
19483
- state;
19484
- objects;
19485
- maxObjectBytes;
19486
- now;
19487
- relayMaxBytes;
19488
- shareTtlSec;
19489
- tokenSecret;
19490
- uploadTtlSec;
19491
- cas;
19492
19515
  /** 所有已存在记录的 CAS 共用 revision 期望,并拒绝错误的版本跃迁。 */
19493
19516
  async compareRecord(key, current, next) {
19494
19517
  if (next !== null && next.revision !== current.revision + 1)
@@ -19625,12 +19648,12 @@ var StoreService = class {
19625
19648
  ifNoneMatch: "*"
19626
19649
  });
19627
19650
  } catch (error51) {
19628
- if (error51 instanceof TBError && error51.code === "conflict") {
19651
+ if (isTBError(error51) && error51.code === "conflict") {
19629
19652
  const existing = await this.objects.head(object2.driverKey);
19630
19653
  if (existing === null) throw error51;
19631
19654
  meta3 = existing;
19632
19655
  } else {
19633
- if (error51 instanceof TBError && error51.code === "rate_limited") {
19656
+ if (isTBError(error51) && error51.code === "rate_limited") {
19634
19657
  await this.objects.delete(object2.driverKey);
19635
19658
  await this.failUpload(session, object2);
19636
19659
  }
@@ -20756,7 +20779,7 @@ function encodeCallContext(ctx) {
20756
20779
  function decodeCallContext(header) {
20757
20780
  let text;
20758
20781
  try {
20759
- text = new TextDecoder().decode(base64urlDecode(header));
20782
+ text = new TextDecoder2().decode(base64urlDecode(header));
20760
20783
  } catch {
20761
20784
  throw new TBError("invalid_argument", `${HEADER_TB_CONTEXT} \u975E\u6CD5 base64url`);
20762
20785
  }
@@ -21340,9 +21363,9 @@ async function decodeToolSearchCursor(cursor, query, mode, revision, secret, opt
21340
21363
  await cursorCryptoKey(secret),
21341
21364
  sealed.slice(12)
21342
21365
  );
21343
- value = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(new Uint8Array(plaintext)));
21366
+ value = JSON.parse(new TextDecoder2("utf-8", { fatal: true }).decode(new Uint8Array(plaintext)));
21344
21367
  } catch (error51) {
21345
- if (error51 instanceof TBError) throw error51;
21368
+ if (isTBError(error51)) throw error51;
21346
21369
  throw new TBError("invalid_argument", "\u641C\u7D22 cursor \u683C\u5F0F\u975E\u6CD5");
21347
21370
  }
21348
21371
  if (typeof value !== "object" || value === null || Array.isArray(value)) {
@@ -21408,36 +21431,45 @@ var TOOL_SEARCH_INSERT_SQL = `
21408
21431
  INSERT INTO tb_search_tools_v5 (path, name, description, effect, feedback)
21409
21432
  VALUES (?, ?, ?, ?, ?)
21410
21433
  `;
21411
- var TOOL_SEARCH_INSERT_SNAPSHOT_SQL = "INSERT INTO tb_search_snapshots_v5(path, digest) VALUES (?, ?)";
21412
- var META_SQL = "SELECT revision, seeded, cursor_secret FROM tb_search_meta_v5 WHERE singleton = 1";
21413
- var SNAPSHOT_DIGESTS_SQL = "SELECT path, digest FROM tb_search_snapshots_v5 ORDER BY path";
21414
- var PATH_STATE_SQL = `
21434
+ function toolSearchFixedStatements(syntax) {
21435
+ const p = (index) => syntax.placeholder(index);
21436
+ const int2 = syntax.castInt ?? ((expr) => expr);
21437
+ return {
21438
+ bumpRevision: "UPDATE tb_search_meta_v5 SET revision = revision + 1 WHERE singleton = 1",
21439
+ completeRebuild: "UPDATE tb_search_meta_v5 SET seeded = 1, revision = revision + 1 WHERE singleton = 1",
21440
+ deleteAllSnapshots: "DELETE FROM tb_search_snapshots_v5",
21441
+ deleteAllTools: "DELETE FROM tb_search_tools_v5",
21442
+ deleteSnapshot: `DELETE FROM tb_search_snapshots_v5 WHERE path = ${p(1)}`,
21443
+ deleteSnapshotPrefix: `
21444
+ DELETE FROM tb_search_snapshots_v5
21445
+ WHERE path = ${p(1)} OR substr(path, 1, length(${p(2)}) + 1) = ${p(3)} || '/'
21446
+ `,
21447
+ deleteTools: `DELETE FROM tb_search_tools_v5 WHERE path = ${p(1)}`,
21448
+ deleteToolsPrefix: `
21449
+ DELETE FROM tb_search_tools_v5
21450
+ WHERE path = ${p(1)} OR substr(path, 1, length(${p(2)}) + 1) = ${p(3)} || '/'
21451
+ `,
21452
+ insertSnapshot: `INSERT INTO tb_search_snapshots_v5(path, digest) VALUES (${p(1)}, ${p(2)})`,
21453
+ meta: `SELECT ${int2("revision")} AS revision, ${int2("seeded")} AS seeded, cursor_secret FROM tb_search_meta_v5 WHERE singleton = 1`,
21454
+ // replace 的前置探测:一次拿到本 path 的 digest、是否残留 source 行、已用节点数。
21455
+ pathState: `
21415
21456
  SELECT snapshots.digest,
21416
- EXISTS(SELECT 1 FROM tb_search_tools_v5 WHERE path = ?) AS has_tools,
21417
- (SELECT COUNT(*) FROM tb_search_snapshots_v5) AS path_count
21457
+ ${int2(`EXISTS(SELECT 1 FROM tb_search_tools_v5 WHERE path = ${p(1)})`)} AS has_tools,
21458
+ ${int2("(SELECT COUNT(*) FROM tb_search_snapshots_v5)")} AS path_count
21418
21459
  FROM (SELECT 1) AS singleton
21419
- LEFT JOIN tb_search_snapshots_v5 AS snapshots ON snapshots.path = ?
21420
- `;
21421
- var PRESENT_SQL = "SELECT 1 AS present FROM tb_search_tools_v5 WHERE path = ? LIMIT 1";
21422
- var PRESENT_PREFIX_SQL = `
21460
+ LEFT JOIN tb_search_snapshots_v5 AS snapshots ON snapshots.path = ${p(2)}
21461
+ `,
21462
+ present: `SELECT 1 AS present FROM tb_search_tools_v5 WHERE path = ${p(1)} LIMIT 1`,
21463
+ presentPrefix: `
21423
21464
  SELECT 1 AS present FROM tb_search_tools_v5
21424
- WHERE path = ? OR substr(path, 1, length(?) + 1) = ? || '/'
21465
+ WHERE path = ${p(1)} OR substr(path, 1, length(${p(2)}) + 1) = ${p(3)} || '/'
21425
21466
  LIMIT 1
21426
- `;
21427
- var DELETE_TOOLS_SQL = "DELETE FROM tb_search_tools_v5 WHERE path = ?";
21428
- var DELETE_SNAPSHOT_SQL = "DELETE FROM tb_search_snapshots_v5 WHERE path = ?";
21429
- var DELETE_TOOLS_PREFIX_SQL = `
21430
- DELETE FROM tb_search_tools_v5
21431
- WHERE path = ? OR substr(path, 1, length(?) + 1) = ? || '/'
21432
- `;
21433
- var DELETE_SNAPSHOT_PREFIX_SQL = `
21434
- DELETE FROM tb_search_snapshots_v5
21435
- WHERE path = ? OR substr(path, 1, length(?) + 1) = ? || '/'
21436
- `;
21437
- var DELETE_ALL_TOOLS_SQL = "DELETE FROM tb_search_tools_v5";
21438
- var DELETE_ALL_SNAPSHOTS_SQL = "DELETE FROM tb_search_snapshots_v5";
21439
- var BUMP_REVISION_SQL = "UPDATE tb_search_meta_v5 SET revision = revision + 1 WHERE singleton = 1";
21440
- var COMPLETE_REBUILD_SQL = "UPDATE tb_search_meta_v5 SET seeded = 1, revision = revision + 1 WHERE singleton = 1";
21467
+ `,
21468
+ snapshotDigests: "SELECT path, digest FROM tb_search_snapshots_v5 ORDER BY path"
21469
+ };
21470
+ }
21471
+ var SQLITE_FIXED_STATEMENTS = toolSearchFixedStatements({ placeholder: () => "?" });
21472
+ var TOOL_SEARCH_INSERT_SNAPSHOT_SQL = SQLITE_FIXED_STATEMENTS.insertSnapshot;
21441
21473
  function toolSearchEffectSql(effect) {
21442
21474
  switch (effect) {
21443
21475
  case "read":
@@ -21544,31 +21576,16 @@ var sqliteSearchDialect = {
21544
21576
  );
21545
21577
  },
21546
21578
  schemaStatements: TOOL_SEARCH_SCHEMA_STATEMENTS,
21547
- statements: {
21548
- bumpRevision: BUMP_REVISION_SQL,
21549
- completeRebuild: COMPLETE_REBUILD_SQL,
21550
- deleteAllSnapshots: DELETE_ALL_SNAPSHOTS_SQL,
21551
- deleteAllTools: DELETE_ALL_TOOLS_SQL,
21552
- deleteSnapshot: DELETE_SNAPSHOT_SQL,
21553
- deleteSnapshotPrefix: DELETE_SNAPSHOT_PREFIX_SQL,
21554
- deleteTools: DELETE_TOOLS_SQL,
21555
- deleteToolsPrefix: DELETE_TOOLS_PREFIX_SQL,
21556
- insertSnapshot: TOOL_SEARCH_INSERT_SNAPSHOT_SQL,
21557
- meta: META_SQL,
21558
- pathState: PATH_STATE_SQL,
21559
- present: PRESENT_SQL,
21560
- presentPrefix: PRESENT_PREFIX_SQL,
21561
- snapshotDigests: SNAPSHOT_DIGESTS_SQL
21562
- }
21579
+ statements: SQLITE_FIXED_STATEMENTS
21563
21580
  };
21564
21581
  var SqlSearchIndex = class {
21582
+ capabilities = ["search"];
21583
+ dialect;
21584
+ driver;
21565
21585
  constructor(driver, dialect = sqliteSearchDialect) {
21566
21586
  this.driver = driver;
21567
21587
  this.dialect = dialect;
21568
21588
  }
21569
- driver;
21570
- capabilities = ["search"];
21571
- dialect;
21572
21589
  /** 容量 trigger 的 ABORT 在各驱动里错误形状不同,统一按标记串归一。 */
21573
21590
  async writeOrCapacity(statements) {
21574
21591
  try {
@@ -21788,7 +21805,11 @@ var PG_SEARCH_SCHEMA_STATEMENTS = [
21788
21805
  FOR EACH ROW EXECUTE FUNCTION tb_search_snapshots_v5_capacity()`
21789
21806
  ];
21790
21807
  var PG_SEARCH_WRITE_LOCK_KEY = 2069799624;
21791
- var PG_SEARCH_INSERT_SNAPSHOT_SQL = "INSERT INTO tb_search_snapshots_v5(path, digest) VALUES ($1, $2)";
21808
+ var PG_FIXED_STATEMENTS = toolSearchFixedStatements({
21809
+ castInt: (expr) => `${expr}::int`,
21810
+ placeholder: (index) => `$${index}`
21811
+ });
21812
+ var PG_SEARCH_INSERT_SNAPSHOT_SQL = PG_FIXED_STATEMENTS.insertSnapshot;
21792
21813
  function pgBulkInsertSql(table, columns, rows) {
21793
21814
  const tuples = [];
21794
21815
  for (let r = 0; r < rows; r++) {
@@ -21808,38 +21829,6 @@ var PG_SEARCH_TOOLS_COLUMNS = [
21808
21829
  var PG_SEARCH_SNAPSHOTS_TABLE = "tb_search_snapshots_v5";
21809
21830
  var PG_SEARCH_SNAPSHOTS_COLUMNS = ["path", "digest"];
21810
21831
  var PG_SEARCH_INSERT_ROWS_MAX = 1e3;
21811
- var META_SQL2 = `
21812
- SELECT revision::int AS revision, seeded::int AS seeded, cursor_secret
21813
- FROM tb_search_meta_v5 WHERE singleton = 1
21814
- `;
21815
- var SNAPSHOT_DIGESTS_SQL2 = "SELECT path, digest FROM tb_search_snapshots_v5 ORDER BY path";
21816
- var PATH_STATE_SQL2 = `
21817
- SELECT snapshots.digest,
21818
- EXISTS(SELECT 1 FROM tb_search_tools_v5 WHERE path = $1)::int AS has_tools,
21819
- (SELECT COUNT(*) FROM tb_search_snapshots_v5)::int AS path_count
21820
- FROM (SELECT 1) AS singleton
21821
- LEFT JOIN tb_search_snapshots_v5 AS snapshots ON snapshots.path = $2
21822
- `;
21823
- var PRESENT_SQL2 = "SELECT 1 AS present FROM tb_search_tools_v5 WHERE path = $1 LIMIT 1";
21824
- var PRESENT_PREFIX_SQL2 = `
21825
- SELECT 1 AS present FROM tb_search_tools_v5
21826
- WHERE path = $1 OR substr(path, 1, length($2) + 1) = $3 || '/'
21827
- LIMIT 1
21828
- `;
21829
- var DELETE_TOOLS_SQL2 = "DELETE FROM tb_search_tools_v5 WHERE path = $1";
21830
- var DELETE_SNAPSHOT_SQL2 = "DELETE FROM tb_search_snapshots_v5 WHERE path = $1";
21831
- var DELETE_TOOLS_PREFIX_SQL2 = `
21832
- DELETE FROM tb_search_tools_v5
21833
- WHERE path = $1 OR substr(path, 1, length($2) + 1) = $3 || '/'
21834
- `;
21835
- var DELETE_SNAPSHOT_PREFIX_SQL2 = `
21836
- DELETE FROM tb_search_snapshots_v5
21837
- WHERE path = $1 OR substr(path, 1, length($2) + 1) = $3 || '/'
21838
- `;
21839
- var DELETE_ALL_TOOLS_SQL2 = "DELETE FROM tb_search_tools_v5";
21840
- var DELETE_ALL_SNAPSHOTS_SQL2 = "DELETE FROM tb_search_snapshots_v5";
21841
- var BUMP_REVISION_SQL2 = "UPDATE tb_search_meta_v5 SET revision = revision + 1 WHERE singleton = 1";
21842
- var COMPLETE_REBUILD_SQL2 = "UPDATE tb_search_meta_v5 SET seeded = 1, revision = revision + 1 WHERE singleton = 1";
21843
21832
  var pgSearchDialect = {
21844
21833
  candidateStatement: (query, limit, offset, rawConstraints) => {
21845
21834
  const constraints = normalizeToolSearchOptions(rawConstraints);
@@ -21857,22 +21846,7 @@ var pgSearchDialect = {
21857
21846
  );
21858
21847
  },
21859
21848
  schemaStatements: PG_SEARCH_SCHEMA_STATEMENTS,
21860
- statements: {
21861
- bumpRevision: BUMP_REVISION_SQL2,
21862
- completeRebuild: COMPLETE_REBUILD_SQL2,
21863
- deleteAllSnapshots: DELETE_ALL_SNAPSHOTS_SQL2,
21864
- deleteAllTools: DELETE_ALL_TOOLS_SQL2,
21865
- deleteSnapshot: DELETE_SNAPSHOT_SQL2,
21866
- deleteSnapshotPrefix: DELETE_SNAPSHOT_PREFIX_SQL2,
21867
- deleteTools: DELETE_TOOLS_SQL2,
21868
- deleteToolsPrefix: DELETE_TOOLS_PREFIX_SQL2,
21869
- insertSnapshot: PG_SEARCH_INSERT_SNAPSHOT_SQL,
21870
- meta: META_SQL2,
21871
- pathState: PATH_STATE_SQL2,
21872
- present: PRESENT_SQL2,
21873
- presentPrefix: PRESENT_PREFIX_SQL2,
21874
- snapshotDigests: SNAPSHOT_DIGESTS_SQL2
21875
- }
21849
+ statements: PG_FIXED_STATEMENTS
21876
21850
  };
21877
21851
 
21878
21852
  // ../core/src/secret/secretStore.ts
@@ -22004,7 +21978,7 @@ var SecretStoreImpl = class _SecretStoreImpl {
22004
21978
  await this.key(),
22005
21979
  ciphertext
22006
21980
  );
22007
- return new TextDecoder().decode(plaintext);
21981
+ return new TextDecoder2().decode(plaintext);
22008
21982
  }
22009
21983
  };
22010
21984
 
@@ -22509,7 +22483,7 @@ function rewriteRemotePath(nodePath, requestPath, baseUrl) {
22509
22483
  return rel === "" ? base : `${base}/${rel}`;
22510
22484
  }
22511
22485
  function hostOf(url2) {
22512
- const m = /^[a-zA-Z][a-zA-Z0-9+.-]*:\/\/([^/?#]*)/.exec(url2);
22486
+ const m = /^[a-zA-Z][a-zA-Z0-9+.-]*:\/\/([^/?#\\]*)/.exec(url2);
22513
22487
  if (m === null) return void 0;
22514
22488
  let authority = m[1] ?? "";
22515
22489
  const at = authority.lastIndexOf("@");
@@ -22608,10 +22582,10 @@ function byPath(a, b) {
22608
22582
  return a.path < b.path ? -1 : a.path > b.path ? 1 : 0;
22609
22583
  }
22610
22584
  var NodeRegistryStore = class {
22585
+ store;
22611
22586
  constructor(store) {
22612
22587
  this.store = store;
22613
22588
  }
22614
- store;
22615
22589
  keyOf(path) {
22616
22590
  return KEY_NODE + path;
22617
22591
  }
@@ -23265,6 +23239,7 @@ export {
23265
23239
  TBError,
23266
23240
  isTBError,
23267
23241
  normalizePath,
23242
+ assertNoCollision,
23268
23243
  validatePath,
23269
23244
  KEY_SK_HASH,
23270
23245
  KEY_SK_ID,
@@ -23278,9 +23253,10 @@ export {
23278
23253
  checkRegisterPath,
23279
23254
  assertSecretRefUse,
23280
23255
  NEVER,
23256
+ safeParse,
23281
23257
  toJSONSchema,
23282
23258
  iso_exports,
23283
- safeParse2 as safeParse,
23259
+ safeParse2,
23284
23260
  string2 as string,
23285
23261
  email2 as email,
23286
23262
  url,
@@ -23300,6 +23276,7 @@ export {
23300
23276
  literal,
23301
23277
  optional,
23302
23278
  lazy,
23279
+ custom,
23303
23280
  preprocess,
23304
23281
  ZodIssueCode,
23305
23282
  coerce_exports,