@tool-bridge/server 0.20.0 → 0.21.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 (109) hide show
  1. package/dist/{airtable-ZNWHIJMO.js → airtable-DMJEEGJP.js} +19 -16
  2. package/dist/{alt_text_generator_ai-X7RMDDM5.js → alt_text_generator_ai-RELFQ5FV.js} +4 -4
  3. package/dist/{amap-3VER75VH.js → amap-YSYEACKQ.js} +4 -4
  4. package/dist/{anthropic-N7NTB3UC.js → anthropic-D5X5GSYE.js} +23 -25
  5. package/dist/{apify-JB5P5AJI.js → apify-5NVFU3IZ.js} +20 -19
  6. package/dist/{brave_search-USL5OOBS.js → brave_search-X557FMGO.js} +16 -14
  7. package/dist/chunk-JEWFX6Z6.js +71 -0
  8. package/dist/{chunk-RVUERWUZ.js → chunk-MDY7K5CX.js} +748 -788
  9. package/dist/{chunk-WIGQCP6O.js → chunk-MZCIPUNQ.js} +141 -176
  10. package/dist/{chunk-6X55ALDX.js → chunk-Q74GLIDK.js} +3 -3
  11. package/dist/{chunk-6ANLYNFB.js → chunk-QR4LK3HF.js} +1 -1
  12. package/dist/{chunk-3WL6EXYX.js → chunk-ZTTN6AJG.js} +1 -1
  13. package/dist/{circleci-LBGB25LP.js → circleci-3P3QTUX2.js} +20 -24
  14. package/dist/{clerk-6RX37CNZ.js → clerk-GNMZQ2MY.js} +22 -21
  15. package/dist/{cloudflare_dns-NQGW7FHV.js → cloudflare_dns-VWZH3ZTR.js} +21 -17
  16. package/dist/{cohere-XPC2NAEW.js → cohere-C7QVIIMG.js} +19 -17
  17. package/dist/{confluence-ZUG2LT5A.js → confluence-52I37IUT.js} +16 -11
  18. package/dist/{convertapi-ZLXKWV3L.js → convertapi-3TRJ3WEO.js} +3 -3
  19. package/dist/{currencyapi-T3A3HSOD.js → currencyapi-LWEANWVI.js} +23 -26
  20. package/dist/{deepseek-NJMOD23E.js → deepseek-5U24YG4P.js} +27 -17
  21. package/dist/{docker_hub-D2MQCSJ7.js → docker_hub-CMISLRSE.js} +4 -4
  22. package/dist/{dropbox-MI6U3SOT.js → dropbox-TW4QN6FT.js} +9 -8
  23. package/dist/{dub-P2BYBYV4.js → dub-EFXGI5UH.js} +22 -19
  24. package/dist/{e2b-BGKIAE54.js → e2b-PHM63OVF.js} +20 -20
  25. package/dist/{exa-EUY7VV4C.js → exa-DYOQWURR.js} +22 -25
  26. package/dist/{fal_ai-AAOG5FYJ.js → fal_ai-VJPMCNRH.js} +18 -17
  27. package/dist/{feishu-AN5IJYOW.js → feishu-TFIZXPIN.js} +2 -2
  28. package/dist/{feishu_custom_bot-BWGMNVXF.js → feishu_custom_bot-ADSE23KU.js} +3 -3
  29. package/dist/{figma-SJSWYCGD.js → figma-4AK47AYY.js} +21 -23
  30. package/dist/{firehydrant-MOXK2PST.js → firehydrant-RGPTW4EA.js} +15 -15
  31. package/dist/{fixer-ISIDUDZU.js → fixer-OAMF4DKP.js} +4 -4
  32. package/dist/{fly-U4KPSGBF.js → fly-YB4AQD4O.js} +20 -16
  33. package/dist/{front-ZHM2YX2E.js → front-6GTVYKUM.js} +20 -23
  34. package/dist/{geocodio-SVCCAXAV.js → geocodio-YRT4K25M.js} +4 -4
  35. package/dist/{ghost-INTR7FIY.js → ghost-JCW6UIP2.js} +4 -4
  36. package/dist/{github-T275VVWR.js → github-CEGVRMNX.js} +28 -27
  37. package/dist/{gmail-KSSPOE67.js → gmail-JCMJD55P.js} +17 -17
  38. package/dist/{googlecalendar-JB5RW27L.js → googlecalendar-2EAW4MNM.js} +16 -14
  39. package/dist/{googledocs-G522PUGW.js → googledocs-YNKKBM6Q.js} +3 -3
  40. package/dist/{grafana-44ZPIV5P.js → grafana-353VSGXN.js} +24 -25
  41. package/dist/{graphhopper-2MORXLOW.js → graphhopper-H3IVJNDS.js} +4 -4
  42. package/dist/index.d.ts +31 -30
  43. package/dist/index.js +3 -3
  44. package/dist/{ip2proxy-R4K4KEMI.js → ip2proxy-DBGRWH7S.js} +4 -4
  45. package/dist/{ipgeolocation_io-H4J55OGI.js → ipgeolocation_io-5I2BDVMG.js} +4 -4
  46. package/dist/{ipqualityscore-XGID4OHA.js → ipqualityscore-ILV7TQCV.js} +4 -4
  47. package/dist/{jina_ai-7ZVDOR3Z.js → jina_ai-L5BH455V.js} +20 -21
  48. package/dist/{jira-CTIYZTT3.js → jira-IGTILUZA.js} +20 -16
  49. package/dist/{langsmith-ISP567FS.js → langsmith-BYRX4AOF.js} +25 -25
  50. package/dist/{lemlist-OGKK272F.js → lemlist-ZGNYTIQO.js} +23 -24
  51. package/dist/{linear-6JX4E3JI.js → linear-HLGOWISN.js} +3 -3
  52. package/dist/{logsnag-BVB36ZCL.js → logsnag-5RGTMTU2.js} +20 -22
  53. package/dist/main.js +102 -102
  54. package/dist/{mattermost-UECVPZGY.js → mattermost-BONGXVC7.js} +21 -17
  55. package/dist/{mem0-EUA7S2OO.js → mem0-RUVNUPTE.js} +15 -15
  56. package/dist/{memos-BYSBJRWZ.js → memos-TED4HI54.js} +36 -32
  57. package/dist/{metabase-4JXZH3YG.js → metabase-ZHXHRHZK.js} +22 -18
  58. package/dist/{mistral_ai-2C5BTBKW.js → mistral_ai-NGP5SHU7.js} +24 -21
  59. package/dist/{mother_duck-ZGNNNR3X.js → mother_duck-TKVQM35M.js} +23 -19
  60. package/dist/{ngrok-NTPGMRXI.js → ngrok-BYCUJ7QV.js} +17 -22
  61. package/dist/{notes-KGYXX6N6.js → notes-KXRNNYDW.js} +1 -1
  62. package/dist/{notion-EX3X2G7G.js → notion-2ILYKJOO.js} +20 -17
  63. package/dist/{open_exchange_rates-2V2LIGPS.js → open_exchange_rates-JU4DC6HZ.js} +4 -4
  64. package/dist/{openai-KQFQPK7Z.js → openai-6SOT26ZK.js} +22 -16
  65. package/dist/{opengraph_io-B63SEYJY.js → opengraph_io-ZEFHV2OL.js} +4 -4
  66. package/dist/{openrouter-62A4H62Q.js → openrouter-R4P7JL5L.js} +19 -14
  67. package/dist/{outline-QC33XLCK.js → outline-VCTQ5V2X.js} +18 -20
  68. package/dist/{paddle-HDZG35Y7.js → paddle-AZOAKBJS.js} +17 -15
  69. package/dist/{perplexity-M7LOMJWA.js → perplexity-OMRLGVAT.js} +19 -23
  70. package/dist/{pinecone-Y7YCJRZM.js → pinecone-DI62W3ZX.js} +19 -24
  71. package/dist/{pipedrive-FLJA62UX.js → pipedrive-CW7HONYW.js} +22 -23
  72. package/dist/{polar-AE55Q425.js → polar-5DRGTXNR.js} +19 -17
  73. package/dist/{posthog-IAY5D3YW.js → posthog-3DTHFCKE.js} +29 -24
  74. package/dist/{postmark-NMKAXDXZ.js → postmark-ME2V2XXI.js} +19 -17
  75. package/dist/{prerender-CDJM7I7N.js → prerender-5EAY7GDM.js} +4 -4
  76. package/dist/{pubmed-N437ZJOR.js → pubmed-GRQUBGVA.js} +3 -3
  77. package/dist/{railway-NBWYXCUM.js → railway-FTM75TMX.js} +3 -3
  78. package/dist/{readwise-QRO3UC3R.js → readwise-IJQGV6IQ.js} +16 -15
  79. package/dist/{render-NEW7SROG.js → render-TMSPHRTY.js} +21 -20
  80. package/dist/{replicate-73YQLRTY.js → replicate-RJCMDB7H.js} +20 -21
  81. package/dist/{resend-R5BAZFHZ.js → resend-YYN22NIL.js} +15 -11
  82. package/dist/{rootly-5BLALPCS.js → rootly-7RXE4K7L.js} +19 -18
  83. package/dist/{scrapfly-EHFLNNUZ.js → scrapfly-ZJJ6XM4Q.js} +4 -4
  84. package/dist/{scrapingbee-UXLYS72S.js → scrapingbee-QNGEOD6D.js} +4 -4
  85. package/dist/{screenshot_fyi-KC3NLTJ6.js → screenshot_fyi-SPZAABVD.js} +4 -4
  86. package/dist/{semantic_scholar-SA5OIUWA.js → semantic_scholar-SDPVGDDI.js} +21 -20
  87. package/dist/{sentry-BAE3XLJN.js → sentry-SJ5NN4C4.js} +22 -19
  88. package/dist/{shodan-FJR6MKKW.js → shodan-YMGOY7KW.js} +4 -4
  89. package/dist/{shopify-7OA6SLN5.js → shopify-SU5ABP54.js} +23 -19
  90. package/dist/{stripe-MUWDZGGF.js → stripe-JAC425KE.js} +3 -3
  91. package/dist/{supabase-SWWGNWYR.js → supabase-GQ2OFVIL.js} +18 -17
  92. package/dist/{tavily-XQNJ5EDI.js → tavily-Y7MDA5CI.js} +20 -20
  93. package/dist/{telegram-RR6JPZOG.js → telegram-OIDT3ZLH.js} +4 -4
  94. package/dist/{telnyx-7PKXOWSO.js → telnyx-4JGMC3K7.js} +19 -19
  95. package/dist/{todoist-63X5IUJE.js → todoist-O7S2OUGX.js} +18 -17
  96. package/dist/{trello-MOG63DAI.js → trello-3LDE4TAQ.js} +4 -4
  97. package/dist/{turso-ENWTSHDL.js → turso-MUQ44KCA.js} +23 -30
  98. package/dist/{twilio-FDXUN7VX.js → twilio-VYF3HUU6.js} +3 -3
  99. package/dist/{umami-TM7PROWF.js → umami-SVQIK26J.js} +23 -28
  100. package/dist/{unsplash-NWXLKSOW.js → unsplash-333XYDCJ.js} +19 -18
  101. package/dist/{upstash_redis-CUTQ5L2N.js → upstash_redis-IUM2HDLU.js} +17 -13
  102. package/dist/{uptimerobot-NNO32M3I.js → uptimerobot-7ZRU2NJV.js} +3 -3
  103. package/dist/{v2ex-24KMSWS7.js → v2ex-AVSJCQPS.js} +35 -18
  104. package/dist/{vercel-B45LPF6I.js → vercel-J7RGXNSA.js} +21 -18
  105. package/dist/{wolfram_alpha_api-DKJWVR6G.js → wolfram_alpha_api-6CRVUZOJ.js} +4 -4
  106. package/dist/{wordpress-XYFSDZXY.js → wordpress-THOJLPKA.js} +21 -17
  107. package/dist/{workos-BEM7EPHM.js → workos-ENTGRWF2.js} +26 -27
  108. package/dist/{zhihu-CFHZ4NC7.js → zhihu-W2BXICTX.js} +21 -21
  109. package/package.json +5 -5
@@ -14609,6 +14609,20 @@ function canonicalizePath(path) {
14609
14609
  if (norm === "") return "";
14610
14610
  return norm.split("/").map((seg) => canonicalizeSegment(seg)).join("/");
14611
14611
  }
14612
+ function assertNoCollision(names, context) {
14613
+ const seen = /* @__PURE__ */ new Map();
14614
+ for (const name of names) {
14615
+ const lower = name.toLowerCase();
14616
+ const prev = seen.get(lower);
14617
+ if (prev !== void 0 && prev !== name) {
14618
+ throw new TBError(
14619
+ "invalid_argument",
14620
+ `${context}:\u6807\u8BC6\u7B26 '${prev}' \u4E0E '${name}' \u5C0F\u5199\u89C4\u8303\u5316\u540E\u51B2\u7A81`
14621
+ );
14622
+ }
14623
+ seen.set(lower, name);
14624
+ }
14625
+ }
14612
14626
  function segments(path) {
14613
14627
  const p = normalizePath(path);
14614
14628
  return p === "" ? [] : p.split("/");
@@ -14682,10 +14696,10 @@ function normalizeAnnotationPath(path) {
14682
14696
  return norm;
14683
14697
  }
14684
14698
  var AnnotationStore = class {
14699
+ store;
14685
14700
  constructor(store) {
14686
14701
  this.store = store;
14687
14702
  }
14688
- store;
14689
14703
  keyOf(path) {
14690
14704
  return KEY_ANNOTATION + path;
14691
14705
  }
@@ -14823,7 +14837,7 @@ var SYSTEM_AUTO = "system:auto";
14823
14837
  var RESERVED_ROOTS = ["system", "ui"];
14824
14838
 
14825
14839
  // ../core/src/auth/registerPath.ts
14826
- var segments3 = (path) => path.split("/").filter((s) => s.length > 0);
14840
+ var foldedSegments = (path) => segments(path).map((seg) => seg.toLowerCase());
14827
14841
  function isUnderPrefix(target, prefix) {
14828
14842
  if (prefix.length > target.length) return false;
14829
14843
  return prefix.every((seg, i) => seg === target[i]);
@@ -14834,7 +14848,7 @@ var deny = (message) => ({
14834
14848
  });
14835
14849
  function checkRegisterPath(input) {
14836
14850
  const { sk, targetPath, existing, reservedRoots = [] } = input;
14837
- const target = segments3(targetPath);
14851
+ const target = foldedSegments(targetPath);
14838
14852
  if (target.some((seg) => seg.startsWith("~"))) {
14839
14853
  return {
14840
14854
  allow: false,
@@ -14842,12 +14856,12 @@ function checkRegisterPath(input) {
14842
14856
  };
14843
14857
  }
14844
14858
  if (sk.registerPaths !== void 0) {
14845
- const ok = sk.registerPaths.some((p) => isUnderPrefix(target, segments3(p)));
14859
+ const ok = sk.registerPaths.some((p) => isUnderPrefix(target, foldedSegments(p)));
14846
14860
  if (!ok) {
14847
14861
  return deny(`path '${targetPath}' is outside declared registerPaths`);
14848
14862
  }
14849
14863
  } else {
14850
- const roots = /* @__PURE__ */ new Set([...RESERVED_ROOTS, ...reservedRoots]);
14864
+ const roots = /* @__PURE__ */ new Set([...RESERVED_ROOTS, ...reservedRoots.map((r) => r.toLowerCase())]);
14851
14865
  const head = target[0];
14852
14866
  if (head !== void 0 && roots.has(head)) {
14853
14867
  return deny(`cannot register under reserved root '${head}'`);
@@ -14907,6 +14921,10 @@ function base64urlEncode(bytes2) {
14907
14921
  }
14908
14922
  return out;
14909
14923
  }
14924
+ function base64Encode(bytes2) {
14925
+ const url2 = base64urlEncode(bytes2).replaceAll("-", "+").replaceAll("_", "/");
14926
+ return url2 + "=".repeat((4 - url2.length % 4) % 4);
14927
+ }
14910
14928
  function base64urlDecode(input) {
14911
14929
  if (input.length % 4 === 1 || !/^[A-Za-z0-9_-]*$/.test(input)) {
14912
14930
  throw new Error("base64urlDecode: malformed base64url input");
@@ -14926,6 +14944,12 @@ function base64urlDecode(input) {
14926
14944
  return new Uint8Array(bytes2);
14927
14945
  }
14928
14946
 
14947
+ // ../core/src/webGlobals.ts
14948
+ var g = globalThis;
14949
+ var crypto = g.crypto;
14950
+ var TextDecoder2 = g.TextDecoder;
14951
+ var TextEncoder = g.TextEncoder;
14952
+
14929
14953
  // ../core/src/omit.ts
14930
14954
  function omit2(obj, ...keys) {
14931
14955
  const rest = { ...obj };
@@ -15014,10 +15038,17 @@ var SKRegistryStore = class {
15014
15038
  const listOpts = { limit: clampLimit(opts?.limit) };
15015
15039
  if (opts?.cursor !== void 0) listOpts.cursor = opts.cursor;
15016
15040
  const page = await this.store.list(KEY_SK_ID, listOpts);
15041
+ const hashes = page.items.map(({ value }) => value).filter((value) => typeof value === "string");
15042
+ const records = /* @__PURE__ */ new Map();
15043
+ for (let i = 0; i < hashes.length; i += 100) {
15044
+ const chunk = await this.store.getMany(
15045
+ hashes.slice(i, i + 100).map((hash2) => KEY_SK_HASH + hash2)
15046
+ );
15047
+ for (const [key, value] of chunk) records.set(key, value);
15048
+ }
15017
15049
  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);
15050
+ for (const hash2 of hashes) {
15051
+ const rec = records.get(KEY_SK_HASH + hash2);
15021
15052
  if (rec) items.push(projectKey(rec));
15022
15053
  }
15023
15054
  return page.cursor !== void 0 ? { items, cursor: page.cursor } : { items };
@@ -15188,7 +15219,7 @@ var HtbpCommandRegistry = class {
15188
15219
  metadata = /* @__PURE__ */ new Map();
15189
15220
  operations = new OperationRegistry();
15190
15221
  register(name, spec, handler) {
15191
- const { h, returns, scope, ...operationSpec } = spec;
15222
+ const { h, hostOnly, returns, scope, ...operationSpec } = spec;
15192
15223
  this.operations.register(
15193
15224
  name,
15194
15225
  { ...operationSpec, description: h },
@@ -15196,6 +15227,7 @@ var HtbpCommandRegistry = class {
15196
15227
  );
15197
15228
  this.metadata.set(name, {
15198
15229
  scope,
15230
+ ...hostOnly !== void 0 ? { hostOnly } : {},
15199
15231
  ...returns !== void 0 ? { returns } : {}
15200
15232
  });
15201
15233
  return this;
@@ -15209,6 +15241,10 @@ var HtbpCommandRegistry = class {
15209
15241
  scopeFor(name) {
15210
15242
  return this.metadata.get(name)?.scope;
15211
15243
  }
15244
+ /** 该命令是否宿主专属扩展(见 {@link HtbpCommandSpec.hostOnly});未注册按 false。 */
15245
+ isHostOnly(name) {
15246
+ return this.metadata.get(name)?.hostOnly === true;
15247
+ }
15212
15248
  commandSpecs(nodePath) {
15213
15249
  return this.operations.list().map((operation) => {
15214
15250
  const metadata = this.metadata.get(operation.name);
@@ -15249,13 +15285,13 @@ var HtbpCommandRegistry = class {
15249
15285
 
15250
15286
  // ../core/src/builtin/commandRegistry.ts
15251
15287
  var BuiltinCommandRegistry = class extends HtbpCommandRegistry {
15288
+ moduleName;
15289
+ moduleDescription;
15252
15290
  constructor(moduleName, moduleDescription) {
15253
15291
  super();
15254
15292
  this.moduleName = moduleName;
15255
15293
  this.moduleDescription = moduleDescription;
15256
15294
  }
15257
- moduleName;
15258
- moduleDescription;
15259
15295
  help(nodePath) {
15260
15296
  return this.helpModel({
15261
15297
  path: nodePath,
@@ -15462,18 +15498,7 @@ function encodeForm(entries) {
15462
15498
  return [...entries].map(([key, value]) => `${encode3(key)}=${encode3(value)}`).join("&");
15463
15499
  }
15464
15500
  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;
15501
+ return base64Encode(Uint8Array.from(ascii, (char) => char.charCodeAt(0)));
15477
15502
  }
15478
15503
  function asRecord(value) {
15479
15504
  return typeof value === "object" && value !== null && !Array.isArray(value) ? value : void 0;
@@ -15664,6 +15689,8 @@ var contextCommands = new HtbpCommandRegistry().register(
15664
15689
  "create_upload",
15665
15690
  {
15666
15691
  h: "create a short-lived, path-scoped direct-upload grant; persist the returned uri, not url",
15692
+ // 宿主专属扩展:仅在底层具备直传签名能力时由宿主装配,不进基础动词表。
15693
+ hostOnly: true,
15667
15694
  inputSchema: external_exports.strictObject({
15668
15695
  path: external_exports.string().describe("target entry path inside the namespace"),
15669
15696
  contentType: external_exports.string().describe("media type signed into the PUT request"),
@@ -15687,14 +15714,14 @@ function contextScopeForCmd(command) {
15687
15714
  }
15688
15715
  function parseContextCmdArgs(command, args) {
15689
15716
  const normalized = command.toLowerCase();
15690
- if (!contextCommands.has(normalized) || normalized === "create_upload") {
15717
+ if (!contextCommands.has(normalized) || contextCommands.isHostOnly(normalized)) {
15691
15718
  throw new TBError("invalid_argument", `unknown cmd '${command}'`);
15692
15719
  }
15693
15720
  return contextCommands.parse(normalized, args);
15694
15721
  }
15695
15722
  async function dispatchContextCmd(provider, command, args) {
15696
15723
  const normalized = command.toLowerCase();
15697
- if (!contextCommands.has(normalized) || normalized === "create_upload") {
15724
+ if (!contextCommands.has(normalized) || contextCommands.isHostOnly(normalized)) {
15698
15725
  throw new TBError("invalid_argument", `unknown cmd '${command}'`);
15699
15726
  }
15700
15727
  const method = normalized;
@@ -15716,7 +15743,7 @@ async function dispatchContextUploadCmd(args, upload) {
15716
15743
  }
15717
15744
 
15718
15745
  // ../core/src/context/capabilities.ts
15719
- var CONTEXT_METHODS = contextCommands.names().filter((name) => name !== "create_upload");
15746
+ var CONTEXT_METHODS = contextCommands.names().filter((name) => !contextCommands.isHostOnly(name));
15720
15747
  var CONTEXT_WRITE_METHODS = CONTEXT_METHODS.filter((method) => contextCommands.scopeFor(method) === "write");
15721
15748
  function contextMethodsOf(provider) {
15722
15749
  const methods = /* @__PURE__ */ new Set();
@@ -16503,10 +16530,10 @@ function normalizeAllowHost(raw) {
16503
16530
  return host;
16504
16531
  }
16505
16532
  var RemoteAllowlistStore = class {
16533
+ store;
16506
16534
  constructor(store) {
16507
16535
  this.store = store;
16508
16536
  }
16509
- store;
16510
16537
  /** 读全部运行时条目(缺省/脏值 → 空数组);按 host 升序稳定输出。 */
16511
16538
  async list() {
16512
16539
  const raw = await this.store.get(KEY_REMOTE_ALLOWLIST);
@@ -16682,7 +16709,7 @@ function parseRecord(value) {
16682
16709
  try {
16683
16710
  if (typeof value !== "object" || value === null || Array.isArray(value)) throw new Error();
16684
16711
  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();
16712
+ 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
16713
  if (raw.leaseId === void 0 !== (raw.leaseUntil === void 0)) throw new Error();
16687
16714
  if (raw.leaseId !== void 0 && (!nonEmpty(raw.leaseId) || !finiteTimestamp(raw.leaseUntil))) {
16688
16715
  throw new Error();
@@ -16694,7 +16721,6 @@ function parseRecord(value) {
16694
16721
  v: 1,
16695
16722
  revision: raw.revision,
16696
16723
  operationId: raw.operationId,
16697
- commandId: raw.commandId,
16698
16724
  deviceId: raw.deviceId,
16699
16725
  deviceKeyId: raw.deviceKeyId,
16700
16726
  mountPath: raw.mountPath,
@@ -16832,7 +16858,7 @@ var DeviceMailboxCipher = class {
16832
16858
  await this.key(),
16833
16859
  ciphertext
16834
16860
  );
16835
- return JSON.parse(new TextDecoder().decode(plaintext));
16861
+ return JSON.parse(new TextDecoder2().decode(plaintext));
16836
16862
  } catch {
16837
16863
  throw new TBError("internal", "device mailbox data cannot be decrypted", { retryable: false });
16838
16864
  }
@@ -16904,7 +16930,6 @@ var DeviceMailboxService = class {
16904
16930
  summary(record2) {
16905
16931
  return {
16906
16932
  operationId: record2.operationId,
16907
- commandId: record2.commandId,
16908
16933
  deviceId: record2.deviceId,
16909
16934
  mountPath: record2.mountPath,
16910
16935
  targetPath: record2.targetPath,
@@ -17015,7 +17040,6 @@ var DeviceMailboxService = class {
17015
17040
  v: 1,
17016
17041
  revision: 1,
17017
17042
  operationId,
17018
- commandId: operationId,
17019
17043
  deviceId: input.deviceId,
17020
17044
  deviceKeyId: input.deviceKeyId,
17021
17045
  mountPath: input.mountPath,
@@ -17113,7 +17137,6 @@ var DeviceMailboxService = class {
17113
17137
  ...page.cursor === void 0 ? {} : { cursor: page.cursor },
17114
17138
  operation: {
17115
17139
  operationId: next.operationId,
17116
- commandId: next.commandId,
17117
17140
  targetPath: next.targetPath,
17118
17141
  path: next.path,
17119
17142
  arguments: payload.arguments,
@@ -17413,7 +17436,7 @@ var toolSearchRequestSchema = external_exports.strictObject({
17413
17436
  limit: external_exports.number().int().optional(),
17414
17437
  matching: external_exports.enum(["best", "all"]).optional(),
17415
17438
  minCoverage: external_exports.number().gt(0).max(1).optional(),
17416
- mode: external_exports.enum(["keyword", "semantic"]).optional(),
17439
+ mode: external_exports.enum(["keyword"]).optional(),
17417
17440
  pathPrefix: external_exports.string().optional()
17418
17441
  }).optional(),
17419
17442
  query: external_exports.string().trim().min(1)
@@ -17429,7 +17452,6 @@ var deviceOperationSummaryShape = {
17429
17452
  attempt: external_exports.number().int().nonnegative(),
17430
17453
  caller: deviceOperationCallerSchema,
17431
17454
  cancelRequestedAt: external_exports.iso.datetime({ offset: true }).optional(),
17432
- commandId: external_exports.string().min(1),
17433
17455
  createdAt: external_exports.iso.datetime({ offset: true }),
17434
17456
  deviceId: external_exports.string().min(1),
17435
17457
  executionMayHaveOccurred: external_exports.boolean(),
@@ -17474,7 +17496,6 @@ var deviceOperationClaimSchema = external_exports.object({
17474
17496
  attempt: external_exports.number().int().positive(),
17475
17497
  caller: deviceOperationCallerSchema,
17476
17498
  cancelRequestedAt: external_exports.iso.datetime({ offset: true }).optional(),
17477
- commandId: external_exports.string().min(1),
17478
17499
  createdAt: external_exports.iso.datetime({ offset: true }),
17479
17500
  expiresAt: external_exports.iso.datetime({ offset: true }),
17480
17501
  leaseId: external_exports.string().min(1),
@@ -17875,17 +17896,7 @@ function createSkModule(store, now) {
17875
17896
 
17876
17897
  // ../core/src/builtin/index.ts
17877
17898
  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;
17899
+ return (await registry2.subtree("")).length;
17889
17900
  }
17890
17901
  function createBuiltins(deps) {
17891
17902
  const now = deps.now ?? (() => (/* @__PURE__ */ new Date()).toISOString());
@@ -17934,7 +17945,7 @@ function contextHelpModel(node, opts = {}) {
17934
17945
  return contextCommands.helpModel(
17935
17946
  { path: node.path, kind: "context", description: node.description },
17936
17947
  (command) => {
17937
- if (command.name === "create_upload") return false;
17948
+ if (contextCommands.isHostOnly(command.name)) return false;
17938
17949
  if (opts.methods !== void 0 && !opts.methods.has(command.name)) return false;
17939
17950
  return opts.readOnly !== true || command.scope === "read";
17940
17951
  }
@@ -17964,7 +17975,7 @@ async function readStreamBytes(stream) {
17964
17975
  return out;
17965
17976
  }
17966
17977
  async function readStreamText(stream) {
17967
- return new TextDecoder().decode(await readStreamBytes(stream));
17978
+ return new TextDecoder2().decode(await readStreamBytes(stream));
17968
17979
  }
17969
17980
  function ownedBytes(view) {
17970
17981
  return view.buffer instanceof ArrayBuffer ? new Uint8Array(view.buffer, view.byteOffset, view.byteLength) : new Uint8Array(view);
@@ -18001,6 +18012,14 @@ function bytesToObjectStream(bytes2) {
18001
18012
  var DEFAULT_STORE_NAME = "default";
18002
18013
  var DEFAULT_STORE_DRIVER_KEY_ROOT = "__tool_bridge_internal__/store/v1";
18003
18014
 
18015
+ // ../core/src/context/contentType.ts
18016
+ function normalizeContentType(value, message) {
18017
+ if (typeof value !== "string" || value.trim() === "" || value.length > 255 || !value.includes("/") || /[\r\n\0]/.test(value)) {
18018
+ throw new TBError("invalid_argument", message);
18019
+ }
18020
+ return value.trim().toLowerCase();
18021
+ }
18022
+
18004
18023
  // ../core/src/context/path.ts
18005
18024
  function hasControlChar(s) {
18006
18025
  for (let i = 0; i < s.length; i++) {
@@ -18083,9 +18102,10 @@ async function createObjectContextUploadGrant(store, opts, input) {
18083
18102
  if (unknownKeys.length > 0) {
18084
18103
  throw new TBError("invalid_argument", `create_upload \u542B\u672A\u77E5\u5B57\u6BB5:${unknownKeys.join(",")}`);
18085
18104
  }
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
- }
18105
+ const contentType = normalizeContentType(
18106
+ input?.contentType,
18107
+ "create_upload \u9700\u8981\u5408\u6CD5\u7684 'contentType'"
18108
+ );
18089
18109
  const nsPath = normalizePath(opts.nsPath);
18090
18110
  const entryPath = normalizeEntryPath(input.path);
18091
18111
  const key = `${keyPrefixBare === "" ? "" : `${keyPrefixBare}/`}${entryPath}`;
@@ -18094,7 +18114,6 @@ async function createObjectContextUploadGrant(store, opts, input) {
18094
18114
  throw new TBError("unavailable", "\u5BF9\u8C61\u5B58\u50A8\u672A\u914D\u7F6E\u76F4\u4F20\u7B7E\u540D\u80FD\u529B", { retryable: false });
18095
18115
  }
18096
18116
  const ttlSec = assertPresignTtlSec(opts.uploadGrantTtlSec ?? PRESIGN_TTL_SEC_DEFAULT);
18097
- const contentType = input.contentType.trim();
18098
18117
  const expiresAt = new Date(Date.now() + ttlSec * 1e3).toISOString();
18099
18118
  const signed = await store.presignPut(key, ttlSec, {
18100
18119
  contentType,
@@ -18532,18 +18551,18 @@ function derivePresence(input) {
18532
18551
  var DEVICE_CALL_TIMEOUT_MS = 6e4;
18533
18552
  var DEVICE_REJECT_CLOSE_CODE = 1008;
18534
18553
  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
18554
  phase_ = "awaiting-hello";
18543
18555
  helloSeen = false;
18544
18556
  results = /* @__PURE__ */ new Map();
18545
18557
  pending = /* @__PURE__ */ new Map();
18546
18558
  timeoutMs;
18559
+ io;
18560
+ opts;
18561
+ constructor(io, opts) {
18562
+ this.io = io;
18563
+ this.opts = opts;
18564
+ this.timeoutMs = opts.timeoutMs ?? DEVICE_CALL_TIMEOUT_MS;
18565
+ }
18547
18566
  get phase() {
18548
18567
  return this.phase_;
18549
18568
  }
@@ -19356,12 +19375,6 @@ function normalizeTimestamp(value, field) {
19356
19375
  throw error51;
19357
19376
  }
19358
19377
  }
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
19378
  function normalizeChecksum(value) {
19366
19379
  if (value === void 0) return void 0;
19367
19380
  if (typeof value !== "object" || value === null || Array.isArray(value)) {
@@ -19378,7 +19391,7 @@ function normalizeChecksum(value) {
19378
19391
  return { algorithm: "sha256", value: digest };
19379
19392
  }
19380
19393
  function normalizeUploadInput(input) {
19381
- const contentType = normalizeContentType(input?.contentType);
19394
+ const contentType = normalizeContentType(input?.contentType, "contentType \u4E0D\u5408\u6CD5");
19382
19395
  let filename;
19383
19396
  if (input.filename !== void 0) {
19384
19397
  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 +19440,7 @@ function normalizeContentTypePattern(value) {
19427
19440
  const prefix = value.slice(0, -1);
19428
19441
  if (prefix.length > 1 && !/[\r\n\0]/.test(value)) return value.toLowerCase();
19429
19442
  }
19430
- return normalizeContentType(value);
19443
+ return normalizeContentType(value, "contentType \u4E0D\u5408\u6CD5");
19431
19444
  }
19432
19445
  function descriptorOf(object2) {
19433
19446
  if (object2.status !== "ready" || object2.readyAt === void 0 || object2.size === void 0) throw stateCorrupt("ready object");
@@ -19449,6 +19462,15 @@ function descriptorOf(object2) {
19449
19462
  };
19450
19463
  }
19451
19464
  var StoreService = class {
19465
+ maxObjectBytes;
19466
+ now;
19467
+ relayMaxBytes;
19468
+ shareTtlSec;
19469
+ tokenSecret;
19470
+ uploadTtlSec;
19471
+ cas;
19472
+ state;
19473
+ objects;
19452
19474
  constructor(state, objects, opts) {
19453
19475
  this.state = state;
19454
19476
  this.objects = objects;
@@ -19480,15 +19502,6 @@ var StoreService = class {
19480
19502
  "shareTtlSec"
19481
19503
  );
19482
19504
  }
19483
- state;
19484
- objects;
19485
- maxObjectBytes;
19486
- now;
19487
- relayMaxBytes;
19488
- shareTtlSec;
19489
- tokenSecret;
19490
- uploadTtlSec;
19491
- cas;
19492
19505
  /** 所有已存在记录的 CAS 共用 revision 期望,并拒绝错误的版本跃迁。 */
19493
19506
  async compareRecord(key, current, next) {
19494
19507
  if (next !== null && next.revision !== current.revision + 1)
@@ -20756,7 +20769,7 @@ function encodeCallContext(ctx) {
20756
20769
  function decodeCallContext(header) {
20757
20770
  let text;
20758
20771
  try {
20759
- text = new TextDecoder().decode(base64urlDecode(header));
20772
+ text = new TextDecoder2().decode(base64urlDecode(header));
20760
20773
  } catch {
20761
20774
  throw new TBError("invalid_argument", `${HEADER_TB_CONTEXT} \u975E\u6CD5 base64url`);
20762
20775
  }
@@ -21340,7 +21353,7 @@ async function decodeToolSearchCursor(cursor, query, mode, revision, secret, opt
21340
21353
  await cursorCryptoKey(secret),
21341
21354
  sealed.slice(12)
21342
21355
  );
21343
- value = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(new Uint8Array(plaintext)));
21356
+ value = JSON.parse(new TextDecoder2("utf-8", { fatal: true }).decode(new Uint8Array(plaintext)));
21344
21357
  } catch (error51) {
21345
21358
  if (error51 instanceof TBError) throw error51;
21346
21359
  throw new TBError("invalid_argument", "\u641C\u7D22 cursor \u683C\u5F0F\u975E\u6CD5");
@@ -21408,36 +21421,45 @@ var TOOL_SEARCH_INSERT_SQL = `
21408
21421
  INSERT INTO tb_search_tools_v5 (path, name, description, effect, feedback)
21409
21422
  VALUES (?, ?, ?, ?, ?)
21410
21423
  `;
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 = `
21424
+ function toolSearchFixedStatements(syntax) {
21425
+ const p = (index) => syntax.placeholder(index);
21426
+ const int2 = syntax.castInt ?? ((expr) => expr);
21427
+ return {
21428
+ bumpRevision: "UPDATE tb_search_meta_v5 SET revision = revision + 1 WHERE singleton = 1",
21429
+ completeRebuild: "UPDATE tb_search_meta_v5 SET seeded = 1, revision = revision + 1 WHERE singleton = 1",
21430
+ deleteAllSnapshots: "DELETE FROM tb_search_snapshots_v5",
21431
+ deleteAllTools: "DELETE FROM tb_search_tools_v5",
21432
+ deleteSnapshot: `DELETE FROM tb_search_snapshots_v5 WHERE path = ${p(1)}`,
21433
+ deleteSnapshotPrefix: `
21434
+ DELETE FROM tb_search_snapshots_v5
21435
+ WHERE path = ${p(1)} OR substr(path, 1, length(${p(2)}) + 1) = ${p(3)} || '/'
21436
+ `,
21437
+ deleteTools: `DELETE FROM tb_search_tools_v5 WHERE path = ${p(1)}`,
21438
+ deleteToolsPrefix: `
21439
+ DELETE FROM tb_search_tools_v5
21440
+ WHERE path = ${p(1)} OR substr(path, 1, length(${p(2)}) + 1) = ${p(3)} || '/'
21441
+ `,
21442
+ insertSnapshot: `INSERT INTO tb_search_snapshots_v5(path, digest) VALUES (${p(1)}, ${p(2)})`,
21443
+ meta: `SELECT ${int2("revision")} AS revision, ${int2("seeded")} AS seeded, cursor_secret FROM tb_search_meta_v5 WHERE singleton = 1`,
21444
+ // replace 的前置探测:一次拿到本 path 的 digest、是否残留 source 行、已用节点数。
21445
+ pathState: `
21415
21446
  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
21447
+ ${int2(`EXISTS(SELECT 1 FROM tb_search_tools_v5 WHERE path = ${p(1)})`)} AS has_tools,
21448
+ ${int2("(SELECT COUNT(*) FROM tb_search_snapshots_v5)")} AS path_count
21418
21449
  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 = `
21450
+ LEFT JOIN tb_search_snapshots_v5 AS snapshots ON snapshots.path = ${p(2)}
21451
+ `,
21452
+ present: `SELECT 1 AS present FROM tb_search_tools_v5 WHERE path = ${p(1)} LIMIT 1`,
21453
+ presentPrefix: `
21423
21454
  SELECT 1 AS present FROM tb_search_tools_v5
21424
- WHERE path = ? OR substr(path, 1, length(?) + 1) = ? || '/'
21455
+ WHERE path = ${p(1)} OR substr(path, 1, length(${p(2)}) + 1) = ${p(3)} || '/'
21425
21456
  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";
21457
+ `,
21458
+ snapshotDigests: "SELECT path, digest FROM tb_search_snapshots_v5 ORDER BY path"
21459
+ };
21460
+ }
21461
+ var SQLITE_FIXED_STATEMENTS = toolSearchFixedStatements({ placeholder: () => "?" });
21462
+ var TOOL_SEARCH_INSERT_SNAPSHOT_SQL = SQLITE_FIXED_STATEMENTS.insertSnapshot;
21441
21463
  function toolSearchEffectSql(effect) {
21442
21464
  switch (effect) {
21443
21465
  case "read":
@@ -21544,31 +21566,16 @@ var sqliteSearchDialect = {
21544
21566
  );
21545
21567
  },
21546
21568
  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
- }
21569
+ statements: SQLITE_FIXED_STATEMENTS
21563
21570
  };
21564
21571
  var SqlSearchIndex = class {
21572
+ capabilities = ["search"];
21573
+ dialect;
21574
+ driver;
21565
21575
  constructor(driver, dialect = sqliteSearchDialect) {
21566
21576
  this.driver = driver;
21567
21577
  this.dialect = dialect;
21568
21578
  }
21569
- driver;
21570
- capabilities = ["search"];
21571
- dialect;
21572
21579
  /** 容量 trigger 的 ABORT 在各驱动里错误形状不同,统一按标记串归一。 */
21573
21580
  async writeOrCapacity(statements) {
21574
21581
  try {
@@ -21788,7 +21795,11 @@ var PG_SEARCH_SCHEMA_STATEMENTS = [
21788
21795
  FOR EACH ROW EXECUTE FUNCTION tb_search_snapshots_v5_capacity()`
21789
21796
  ];
21790
21797
  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)";
21798
+ var PG_FIXED_STATEMENTS = toolSearchFixedStatements({
21799
+ castInt: (expr) => `${expr}::int`,
21800
+ placeholder: (index) => `$${index}`
21801
+ });
21802
+ var PG_SEARCH_INSERT_SNAPSHOT_SQL = PG_FIXED_STATEMENTS.insertSnapshot;
21792
21803
  function pgBulkInsertSql(table, columns, rows) {
21793
21804
  const tuples = [];
21794
21805
  for (let r = 0; r < rows; r++) {
@@ -21808,38 +21819,6 @@ var PG_SEARCH_TOOLS_COLUMNS = [
21808
21819
  var PG_SEARCH_SNAPSHOTS_TABLE = "tb_search_snapshots_v5";
21809
21820
  var PG_SEARCH_SNAPSHOTS_COLUMNS = ["path", "digest"];
21810
21821
  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
21822
  var pgSearchDialect = {
21844
21823
  candidateStatement: (query, limit, offset, rawConstraints) => {
21845
21824
  const constraints = normalizeToolSearchOptions(rawConstraints);
@@ -21857,22 +21836,7 @@ var pgSearchDialect = {
21857
21836
  );
21858
21837
  },
21859
21838
  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
- }
21839
+ statements: PG_FIXED_STATEMENTS
21876
21840
  };
21877
21841
 
21878
21842
  // ../core/src/secret/secretStore.ts
@@ -22004,7 +21968,7 @@ var SecretStoreImpl = class _SecretStoreImpl {
22004
21968
  await this.key(),
22005
21969
  ciphertext
22006
21970
  );
22007
- return new TextDecoder().decode(plaintext);
21971
+ return new TextDecoder2().decode(plaintext);
22008
21972
  }
22009
21973
  };
22010
21974
 
@@ -22509,7 +22473,7 @@ function rewriteRemotePath(nodePath, requestPath, baseUrl) {
22509
22473
  return rel === "" ? base : `${base}/${rel}`;
22510
22474
  }
22511
22475
  function hostOf(url2) {
22512
- const m = /^[a-zA-Z][a-zA-Z0-9+.-]*:\/\/([^/?#]*)/.exec(url2);
22476
+ const m = /^[a-zA-Z][a-zA-Z0-9+.-]*:\/\/([^/?#\\]*)/.exec(url2);
22513
22477
  if (m === null) return void 0;
22514
22478
  let authority = m[1] ?? "";
22515
22479
  const at = authority.lastIndexOf("@");
@@ -22608,10 +22572,10 @@ function byPath(a, b) {
22608
22572
  return a.path < b.path ? -1 : a.path > b.path ? 1 : 0;
22609
22573
  }
22610
22574
  var NodeRegistryStore = class {
22575
+ store;
22611
22576
  constructor(store) {
22612
22577
  this.store = store;
22613
22578
  }
22614
- store;
22615
22579
  keyOf(path) {
22616
22580
  return KEY_NODE + path;
22617
22581
  }
@@ -23265,6 +23229,7 @@ export {
23265
23229
  TBError,
23266
23230
  isTBError,
23267
23231
  normalizePath,
23232
+ assertNoCollision,
23268
23233
  validatePath,
23269
23234
  KEY_SK_HASH,
23270
23235
  KEY_SK_ID,