@tool-bridge/server 0.5.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/dist/{airtable-7TFNLFIF.js → airtable-5W6SJMSM.js} +4 -4
  2. package/dist/{alt_text_generator_ai-VJSAHBJM.js → alt_text_generator_ai-YYVJM3RG.js} +4 -4
  3. package/dist/{amap-KZMUDGK6.js → amap-EREMQZHQ.js} +4 -4
  4. package/dist/{anthropic-C6FCUSY7.js → anthropic-53H7WGSE.js} +4 -4
  5. package/dist/{apify-MUCWNIWU.js → apify-CMRNU7VZ.js} +4 -4
  6. package/dist/{brave_search-NRVZ4ZNY.js → brave_search-AFZVZ3QK.js} +4 -4
  7. package/dist/{chunk-FHYFPPBZ.js → chunk-2DA2UI37.js} +2 -2
  8. package/dist/{chunk-B4ZA7EGO.js → chunk-Q44CYUSI.js} +1 -1
  9. package/dist/{chunk-3C3J36GT.js → chunk-Q7YHZ2SD.js} +683 -54
  10. package/dist/{chunk-7GP7DRES.js → chunk-SBJMMSPA.js} +1 -1
  11. package/dist/{chunk-7PM4FD5K.js → chunk-TPGTA43F.js} +291 -55
  12. package/dist/{circleci-QY36SZIM.js → circleci-JG7RV2RU.js} +4 -4
  13. package/dist/{clerk-ECH23XL5.js → clerk-U7OS5ALG.js} +4 -4
  14. package/dist/{cloudflare_dns-F6DN2F3X.js → cloudflare_dns-ADCTFMMI.js} +4 -4
  15. package/dist/{cohere-HD4XZOPJ.js → cohere-Z7ZEC2YV.js} +4 -4
  16. package/dist/{confluence-J4AZ2KYL.js → confluence-FT22JGYQ.js} +4 -4
  17. package/dist/{convertapi-BXBII5Z6.js → convertapi-UQQCWVWP.js} +4 -4
  18. package/dist/{currencyapi-HEEQ7EQJ.js → currencyapi-Y63O7JTP.js} +4 -4
  19. package/dist/{deepseek-RKRGIFPM.js → deepseek-7TSAMZJ6.js} +4 -4
  20. package/dist/{docker_hub-YFSTEZVP.js → docker_hub-AJYTVI25.js} +4 -4
  21. package/dist/{dropbox-VGK634PO.js → dropbox-CNGGNR5J.js} +4 -4
  22. package/dist/{dub-GEXD3XK6.js → dub-WTADKHA7.js} +4 -4
  23. package/dist/{e2b-LPTZQEDV.js → e2b-75EKXMN5.js} +4 -4
  24. package/dist/{exa-VJENLTKN.js → exa-OFLA5XND.js} +4 -4
  25. package/dist/{fal_ai-75O63LLP.js → fal_ai-5542HB7N.js} +4 -4
  26. package/dist/{feishu-FATBHGEJ.js → feishu-QQIZ7G24.js} +3 -3
  27. package/dist/{feishu_custom_bot-QFSYPOLI.js → feishu_custom_bot-EVDKIZCR.js} +4 -4
  28. package/dist/{figma-JED3Q56H.js → figma-ZEBDUMWI.js} +4 -4
  29. package/dist/{firehydrant-7JDKFJTB.js → firehydrant-CTBNY6FL.js} +4 -4
  30. package/dist/{fixer-ZI2JS5GU.js → fixer-ITDYMRBW.js} +4 -4
  31. package/dist/{fly-3RA7ETFP.js → fly-IBFMSAAO.js} +4 -4
  32. package/dist/{front-X2CJXBYS.js → front-AZQLLUJQ.js} +4 -4
  33. package/dist/{geocodio-C6NHG5UJ.js → geocodio-XHZHEWQW.js} +4 -4
  34. package/dist/{ghost-ZBFOMWQF.js → ghost-RTIKXD3T.js} +4 -4
  35. package/dist/{github-6QM2NIP4.js → github-WRJBJ5N7.js} +4 -4
  36. package/dist/{gmail-ST3MS32S.js → gmail-527RVDXV.js} +4 -4
  37. package/dist/{googlecalendar-SAUTUJ3Q.js → googlecalendar-WZJSK2MR.js} +4 -4
  38. package/dist/{googledocs-2SJKS2SC.js → googledocs-LFBVIHIK.js} +4 -4
  39. package/dist/{grafana-RP7DOS3A.js → grafana-3JEKO7NT.js} +4 -4
  40. package/dist/{graphhopper-XSDTLJTE.js → graphhopper-TOJN6K2Q.js} +4 -4
  41. package/dist/index.d.ts +400 -26
  42. package/dist/index.js +14 -2
  43. package/dist/{ip2proxy-IKV5IWUI.js → ip2proxy-KOA2JUNV.js} +4 -4
  44. package/dist/{ipgeolocation_io-NSUWUF5X.js → ipgeolocation_io-KNOQD7R7.js} +4 -4
  45. package/dist/{ipqualityscore-ZQKL3WLC.js → ipqualityscore-GF2MQKXI.js} +4 -4
  46. package/dist/{jina_ai-F4Y7V5AS.js → jina_ai-GB3CQPJ4.js} +4 -4
  47. package/dist/{jira-CYDY44ZO.js → jira-35XYV6G4.js} +4 -4
  48. package/dist/{langsmith-74JSSJNY.js → langsmith-W5234OE7.js} +4 -4
  49. package/dist/{lemlist-C3LKIPVN.js → lemlist-QB6W2G7N.js} +4 -4
  50. package/dist/{linear-YYGRHKJC.js → linear-MHBD6A7X.js} +4 -4
  51. package/dist/{logsnag-YBMDJ6DO.js → logsnag-RN57XIJS.js} +4 -4
  52. package/dist/main.js +113 -106
  53. package/dist/{mattermost-NDID4TAL.js → mattermost-QRXSZMZA.js} +4 -4
  54. package/dist/{mem0-ASBAEBWR.js → mem0-K63NN3LA.js} +4 -4
  55. package/dist/{memos-76I27HCW.js → memos-4IOUOFKH.js} +4 -4
  56. package/dist/{metabase-LCPIP2DL.js → metabase-IOE44EKL.js} +4 -4
  57. package/dist/{mistral_ai-YVBQ6QKO.js → mistral_ai-X7ASGV5I.js} +4 -4
  58. package/dist/{mother_duck-J2MPBIFO.js → mother_duck-CNN3QWQH.js} +4 -4
  59. package/dist/{ngrok-UJC2ORDH.js → ngrok-QNE4AHEH.js} +4 -4
  60. package/dist/{notes-6VWWD6RW.js → notes-Q6OLBS2L.js} +2 -2
  61. package/dist/{notion-6LBO2KHR.js → notion-ADDRQTCE.js} +4 -4
  62. package/dist/{open_exchange_rates-OGDH4ZBX.js → open_exchange_rates-WR5PJQTG.js} +4 -4
  63. package/dist/{openai-IKGD5M66.js → openai-UZBNNAAH.js} +4 -4
  64. package/dist/{opengraph_io-CIILQ7VK.js → opengraph_io-2JNEXCPJ.js} +4 -4
  65. package/dist/{openrouter-IYG5CPG5.js → openrouter-EF62BDIH.js} +4 -4
  66. package/dist/{outline-R2UMBY4M.js → outline-O4TIRWJT.js} +4 -4
  67. package/dist/{paddle-IYWA7DOV.js → paddle-SEFKNENH.js} +4 -4
  68. package/dist/{perplexity-3TGYQWHT.js → perplexity-FZYOIPDS.js} +4 -4
  69. package/dist/{pinecone-TEBOW4LJ.js → pinecone-EXDPYDY7.js} +4 -4
  70. package/dist/{pipedrive-ZXDY753U.js → pipedrive-EDO4C3AM.js} +4 -4
  71. package/dist/{polar-BVZV5A4O.js → polar-QJXHVFIP.js} +4 -4
  72. package/dist/{posthog-DXKAS4PJ.js → posthog-U6QEXJE2.js} +4 -4
  73. package/dist/{postmark-6RWFC3TD.js → postmark-PFZIWXMP.js} +4 -4
  74. package/dist/{prerender-YIXOTM3K.js → prerender-SK2AXNJY.js} +4 -4
  75. package/dist/{pubmed-2RHSZB4E.js → pubmed-CB7OJNBH.js} +4 -4
  76. package/dist/{railway-IF64BUE2.js → railway-BMMNQ6XH.js} +4 -4
  77. package/dist/{readwise-5XKQZNOM.js → readwise-YQY7O5QR.js} +4 -4
  78. package/dist/{render-Q2Z66LTA.js → render-7CRNEEJ3.js} +4 -4
  79. package/dist/{replicate-SOI65IJO.js → replicate-V6AX7WFC.js} +4 -4
  80. package/dist/{resend-O2BGONOO.js → resend-ZBH56UAQ.js} +4 -4
  81. package/dist/{rootly-WPQKTVU3.js → rootly-C4FIXIF7.js} +4 -4
  82. package/dist/{scrapfly-GLMBVNPG.js → scrapfly-UE434KD7.js} +4 -4
  83. package/dist/{scrapingbee-TUER54CY.js → scrapingbee-PQCNKALD.js} +4 -4
  84. package/dist/{screenshot_fyi-4J4W5EKY.js → screenshot_fyi-U6QGI6ZH.js} +4 -4
  85. package/dist/{semantic_scholar-4PITOANV.js → semantic_scholar-PSMUOG2W.js} +4 -4
  86. package/dist/{sentry-4WURPLIE.js → sentry-F5CNVQA2.js} +4 -4
  87. package/dist/{shodan-G3M3LFEW.js → shodan-NOWG7NV5.js} +4 -4
  88. package/dist/{shopify-72AIELMS.js → shopify-GGPLJIGC.js} +4 -4
  89. package/dist/{stripe-7C7XVPMU.js → stripe-72K2UMK3.js} +4 -4
  90. package/dist/{supabase-N4Y3YC23.js → supabase-H7NRCSAO.js} +4 -4
  91. package/dist/{tavily-GGLSWERP.js → tavily-ISP24QUX.js} +4 -4
  92. package/dist/{telegram-4RH36WYP.js → telegram-POII6NKE.js} +4 -4
  93. package/dist/{telnyx-I2KUITFV.js → telnyx-3D7TOVNA.js} +4 -4
  94. package/dist/{todoist-A3NX6X2Y.js → todoist-LKYPKRKB.js} +4 -4
  95. package/dist/{trello-2GJYN7GR.js → trello-WW74UYIQ.js} +4 -4
  96. package/dist/{turso-WKUXMTZ5.js → turso-SUFRHBHW.js} +4 -4
  97. package/dist/{twilio-SSXDBOK4.js → twilio-QB7PBL2B.js} +4 -4
  98. package/dist/{umami-SBDB4GXK.js → umami-CAHHP3SV.js} +4 -4
  99. package/dist/{unsplash-4AVC4ZGP.js → unsplash-ZCGEPHGQ.js} +4 -4
  100. package/dist/{upstash_redis-7XY3UHBO.js → upstash_redis-DZ4AKZWT.js} +4 -4
  101. package/dist/{uptimerobot-QVQP3QYG.js → uptimerobot-KVEQJGTZ.js} +4 -4
  102. package/dist/{v2ex-ASVTIKO7.js → v2ex-BCYYBPH7.js} +4 -4
  103. package/dist/{vercel-ZQXZCGWY.js → vercel-GH4G7EUS.js} +4 -4
  104. package/dist/{wolfram_alpha_api-RVBWQSEF.js → wolfram_alpha_api-XFG2MQBL.js} +4 -4
  105. package/dist/{wordpress-SOWKVNCX.js → wordpress-DZ2TVNAA.js} +4 -4
  106. package/dist/{workos-F45INANB.js → workos-EHUAGTGN.js} +4 -4
  107. package/dist/{zhihu-5VODAGAP.js → zhihu-OJJW3ZIH.js} +4 -4
  108. package/package.json +6 -4
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  TBError
3
- } from "./chunk-7PM4FD5K.js";
3
+ } from "./chunk-TPGTA43F.js";
4
4
 
5
5
  // ../plugins/src/_runtime/ipPolicy.ts
6
6
  function parseIpv4(value) {
@@ -14820,7 +14820,7 @@ function checkRegisterPath(input) {
14820
14820
  if (!checkScopes(sk.scopes, targetPath, "register")) {
14821
14821
  return deny(`no scope grants 'register' on '${targetPath}'`);
14822
14822
  }
14823
- if (existing && existing.registeredBy !== sk.id && existing.registeredBy !== SYSTEM_AUTO) {
14823
+ if (existing && existing.registeredBy !== sk.id && existing.registeredBy !== SYSTEM_AUTO && !checkScopes(sk.scopes, targetPath, "admin")) {
14824
14824
  return {
14825
14825
  allow: false,
14826
14826
  error: new TBError("conflict", `path '${targetPath}' is registered by another key`)
@@ -16362,7 +16362,7 @@ function registryCmds(nodePath) {
16362
16362
  name: "delete",
16363
16363
  method: "POST",
16364
16364
  path,
16365
- h: "unmount a node (and reclaim empty auto-created parents)",
16365
+ h: "unmount a node (and reclaim empty auto-created parents); a node registered by another key can only be removed by its registrar or by a key holding the 'admin' scope on that path",
16366
16366
  inputSchema: {
16367
16367
  type: "object",
16368
16368
  properties: { path: { type: "string", description: "exact tree path" } },
@@ -17255,6 +17255,7 @@ var deviceNodeCmdSchema = external_exports.object({
17255
17255
  name: external_exports.string().min(1),
17256
17256
  description: external_exports.string().optional(),
17257
17257
  inputSchema: external_exports.unknown().optional(),
17258
+ outputSchema: external_exports.unknown().optional(),
17258
17259
  effect: external_exports.string().optional(),
17259
17260
  confirm: external_exports.boolean().optional()
17260
17261
  }).passthrough();
@@ -17276,6 +17277,16 @@ var deviceExposeSchema = external_exports.object({
17276
17277
  nodes: external_exports.array(nodeInputSchema).optional()
17277
17278
  });
17278
17279
  var idSchema = external_exports.string().min(1);
17280
+ var deviceCallContextSchema = external_exports.object({
17281
+ caller: external_exports.object({
17282
+ keyId: external_exports.string().min(1),
17283
+ owner: external_exports.string().min(1),
17284
+ displayName: external_exports.string().optional()
17285
+ }).passthrough(),
17286
+ traceId: external_exports.string().min(1),
17287
+ createdAt: external_exports.string().min(1),
17288
+ expiresAt: external_exports.string().min(1)
17289
+ }).passthrough();
17279
17290
  var schemaByType = {
17280
17291
  hello: external_exports.object({
17281
17292
  type: external_exports.literal("hello"),
@@ -17290,7 +17301,8 @@ var schemaByType = {
17290
17301
  id: idSchema,
17291
17302
  path: external_exports.string(),
17292
17303
  tool: external_exports.string().min(1),
17293
- arguments: external_exports.record(external_exports.string(), external_exports.unknown())
17304
+ arguments: external_exports.record(external_exports.string(), external_exports.unknown()),
17305
+ context: deviceCallContextSchema.optional()
17294
17306
  }),
17295
17307
  result: external_exports.discriminatedUnion("ok", [
17296
17308
  external_exports.object({ type: external_exports.literal("result"), id: idSchema, ok: external_exports.literal(true), value: external_exports.unknown() }),
@@ -17385,13 +17397,33 @@ function deviceDirectoryHelpModel(node, children = []) {
17385
17397
  node: {
17386
17398
  path: node.path,
17387
17399
  kind: "directory",
17388
- description: `${node.description} (${node.online ? "online" : "offline"})`
17400
+ description: `${node.description} (${node.presence.state})`
17389
17401
  },
17390
17402
  cmds: [],
17391
17403
  children
17392
17404
  };
17393
17405
  }
17394
17406
 
17407
+ // ../core/src/device/presence.ts
17408
+ var PRESENCE_STALE_AFTER_MS = 9e4;
17409
+ function derivePresence(input) {
17410
+ const lastSeenAt = input.lastSeenAt;
17411
+ const base = lastSeenAt !== void 0 ? { lastSeenAt } : {};
17412
+ if (input.online !== true) {
17413
+ return { state: "offline", ...base };
17414
+ }
17415
+ if (lastSeenAt === void 0) {
17416
+ return { state: "stale", ...base };
17417
+ }
17418
+ const seenMs = Date.parse(lastSeenAt);
17419
+ const nowMs = Date.parse(input.now);
17420
+ if (!Number.isFinite(seenMs) || !Number.isFinite(nowMs)) {
17421
+ return { state: "stale", ...base };
17422
+ }
17423
+ const ttl = input.staleAfterMs ?? PRESENCE_STALE_AFTER_MS;
17424
+ return { state: nowMs - seenMs <= ttl ? "online" : "stale", ...base };
17425
+ }
17426
+
17395
17427
  // ../core/src/device/session.ts
17396
17428
  var DEVICE_CALL_TIMEOUT_MS = 6e4;
17397
17429
  var DEVICE_REJECT_CLOSE_CODE = 1008;
@@ -17499,7 +17531,9 @@ var DeviceGatewaySession = class {
17499
17531
  id: req.id,
17500
17532
  path: req.path,
17501
17533
  tool: req.tool,
17502
- arguments: req.arguments
17534
+ arguments: req.arguments,
17535
+ // undefined 经 JSON.stringify 丢弃:老网关不带 context 时帧形状不变。
17536
+ ...req.context !== void 0 ? { context: req.context } : {}
17503
17537
  });
17504
17538
  }
17505
17539
  /** 幂等表回放种子(DO 从 ctx.storage 恢复时用);已有同 id 结果则忽略。 */
@@ -17999,7 +18033,7 @@ async function buildTree(opts) {
17999
18033
  visited.add(entry.path);
18000
18034
  count++;
18001
18035
  const node = { path: entry.path, kind: entry.kind, description: entry.description };
18002
- if (entry.online !== void 0) node.online = entry.online;
18036
+ if (entry.presence !== void 0) node.presence = entry.presence;
18003
18037
  if (depthLeft <= 0) {
18004
18038
  if (opts.opaqueKinds?.has(entry.kind)) {
18005
18039
  node.truncated = true;
@@ -18023,7 +18057,7 @@ async function buildTree(opts) {
18023
18057
  description: kid.description,
18024
18058
  truncated: true
18025
18059
  };
18026
- if (kid.online !== void 0) cyc.online = kid.online;
18060
+ if (kid.presence !== void 0) cyc.presence = kid.presence;
18027
18061
  count++;
18028
18062
  children.push(cyc);
18029
18063
  continue;
@@ -18394,32 +18428,6 @@ function decodePluginCall(body) {
18394
18428
  return parsed.data;
18395
18429
  }
18396
18430
 
18397
- // ../core/src/search/shortTermSql.ts
18398
- function shortTermsSql(patterns) {
18399
- return `short_terms(pattern) AS (VALUES ${patterns.map(() => "(?)").join(", ")})`;
18400
- }
18401
- var SHORT_MATCH_SQL = `
18402
- NOT EXISTS (
18403
- SELECT 1 FROM short_terms
18404
- WHERE tools.name NOT LIKE pattern ESCAPE '!'
18405
- AND tools.description NOT LIKE pattern ESCAPE '!'
18406
- AND tools.feedback NOT LIKE pattern ESCAPE '!'
18407
- )
18408
- `;
18409
- var SHORT_SCORE_SQL = `
18410
- (
18411
- SELECT COALESCE(SUM(
18412
- CASE
18413
- WHEN tools.name LIKE pattern ESCAPE '!' THEN 10
18414
- WHEN tools.description LIKE pattern ESCAPE '!' THEN 3
18415
- WHEN tools.feedback LIKE pattern ESCAPE '!' THEN 1
18416
- ELSE 0
18417
- END
18418
- ), 0)
18419
- FROM short_terms
18420
- )
18421
- `;
18422
-
18423
18431
  // ../core/src/search/types.ts
18424
18432
  var TOOL_SEARCH_BATCH_LIMIT = 100;
18425
18433
  var TOOL_SEARCH_WORK_LIMIT = 400;
@@ -18604,6 +18612,13 @@ function likePattern(term) {
18604
18612
  const escaped = term.replaceAll("!", "!!").replaceAll("%", "!%").replaceAll("_", "!_");
18605
18613
  return `%${escaped}%`;
18606
18614
  }
18615
+ function toolSearchLikePatterns(query) {
18616
+ const terms = normalizeToolSearchQuery(query).split(/\s+/u);
18617
+ if (terms.length > TOOL_SEARCH_TERM_LIMIT) {
18618
+ throw new TBError("invalid_argument", `\u641C\u7D22 query \u6700\u591A ${TOOL_SEARCH_TERM_LIMIT} \u4E2A terms`);
18619
+ }
18620
+ return terms.map(likePattern);
18621
+ }
18607
18622
  function prepareToolSearchQuery(query) {
18608
18623
  const normalized = normalizeToolSearchQuery(query);
18609
18624
  const terms = normalized.split(/\s+/u);
@@ -18688,6 +18703,32 @@ async function decodeToolSearchCursor(cursor, query, mode, revision, secret) {
18688
18703
  return payload.o ?? 0;
18689
18704
  }
18690
18705
 
18706
+ // ../core/src/search/shortTermSql.ts
18707
+ function shortTermsSql(patterns) {
18708
+ return `short_terms(pattern) AS (VALUES ${patterns.map(() => "(?)").join(", ")})`;
18709
+ }
18710
+ var SHORT_MATCH_SQL = `
18711
+ NOT EXISTS (
18712
+ SELECT 1 FROM short_terms
18713
+ WHERE tools.name NOT LIKE pattern ESCAPE '!'
18714
+ AND tools.description NOT LIKE pattern ESCAPE '!'
18715
+ AND tools.feedback NOT LIKE pattern ESCAPE '!'
18716
+ )
18717
+ `;
18718
+ var SHORT_SCORE_SQL = `
18719
+ (
18720
+ SELECT COALESCE(SUM(
18721
+ CASE
18722
+ WHEN tools.name LIKE pattern ESCAPE '!' THEN 10
18723
+ WHEN tools.description LIKE pattern ESCAPE '!' THEN 3
18724
+ WHEN tools.feedback LIKE pattern ESCAPE '!' THEN 1
18725
+ ELSE 0
18726
+ END
18727
+ ), 0)
18728
+ FROM short_terms
18729
+ )
18730
+ `;
18731
+
18691
18732
  // ../core/src/search/sqlSearchIndex.ts
18692
18733
  var TOOL_SEARCH_SCHEMA_STATEMENTS = [
18693
18734
  `CREATE TABLE IF NOT EXISTS tb_search_tools_v3 (
@@ -18825,12 +18866,34 @@ function toolSearchCandidateStatement(prepared, limit, offset) {
18825
18866
  `
18826
18867
  };
18827
18868
  }
18869
+ var sqliteSearchDialect = {
18870
+ candidateStatement: (query, limit, offset) => toolSearchCandidateStatement(prepareToolSearchQuery(query), limit, offset),
18871
+ schemaStatements: TOOL_SEARCH_SCHEMA_STATEMENTS,
18872
+ statements: {
18873
+ bumpRevision: BUMP_REVISION_SQL,
18874
+ completeRebuild: COMPLETE_REBUILD_SQL,
18875
+ deleteAllSnapshots: DELETE_ALL_SNAPSHOTS_SQL,
18876
+ deleteAllTools: DELETE_ALL_TOOLS_SQL,
18877
+ deleteSnapshot: DELETE_SNAPSHOT_SQL,
18878
+ deleteSnapshotPrefix: DELETE_SNAPSHOT_PREFIX_SQL,
18879
+ deleteTools: DELETE_TOOLS_SQL,
18880
+ deleteToolsPrefix: DELETE_TOOLS_PREFIX_SQL,
18881
+ insertSnapshot: TOOL_SEARCH_INSERT_SNAPSHOT_SQL,
18882
+ meta: META_SQL,
18883
+ pathState: PATH_STATE_SQL,
18884
+ present: PRESENT_SQL,
18885
+ presentPrefix: PRESENT_PREFIX_SQL,
18886
+ snapshotDigests: SNAPSHOT_DIGESTS_SQL
18887
+ }
18888
+ };
18828
18889
  var SqlSearchIndex = class {
18829
- constructor(driver) {
18890
+ constructor(driver, dialect = sqliteSearchDialect) {
18830
18891
  this.driver = driver;
18892
+ this.dialect = dialect;
18831
18893
  }
18832
18894
  driver;
18833
18895
  capabilities = ["search"];
18896
+ dialect;
18834
18897
  /** 容量 trigger 的 ABORT 在各驱动里错误形状不同,统一按标记串归一。 */
18835
18898
  async writeOrCapacity(statements) {
18836
18899
  try {
@@ -18843,14 +18906,14 @@ var SqlSearchIndex = class {
18843
18906
  }
18844
18907
  }
18845
18908
  async meta() {
18846
- const row = await this.driver.first({ params: [], sql: META_SQL });
18909
+ const row = await this.driver.first({ params: [], sql: this.dialect.statements.meta });
18847
18910
  if (row === null) throw new TBError("internal", "\u5DE5\u5177\u641C\u7D22 meta \u7F3A\u5931");
18848
18911
  return row;
18849
18912
  }
18850
18913
  async snapshotDigests() {
18851
18914
  const rows = await this.driver.all({
18852
18915
  params: [],
18853
- sql: SNAPSHOT_DIGESTS_SQL
18916
+ sql: this.dialect.statements.snapshotDigests
18854
18917
  });
18855
18918
  return new Map(rows.map((row) => [row.path, row.digest]));
18856
18919
  }
@@ -18864,7 +18927,7 @@ var SqlSearchIndex = class {
18864
18927
  await this.driver.ensureSchema();
18865
18928
  const current = await this.driver.first({
18866
18929
  params: [canonical, canonical],
18867
- sql: PATH_STATE_SQL
18930
+ sql: this.dialect.statements.pathState
18868
18931
  });
18869
18932
  const digest = records.length === 0 ? null : toolSearchSnapshotDigest(records);
18870
18933
  if (current !== null && (digest !== null && current.digest === digest || digest === null && current.digest === null && current.has_tools === 0)) return;
@@ -18873,12 +18936,13 @@ var SqlSearchIndex = class {
18873
18936
  }
18874
18937
  const inserts = this.driver.insertRecords(records);
18875
18938
  this.driver.assertInsertBudget?.(inserts.length);
18939
+ const statements = this.dialect.statements;
18876
18940
  await this.writeOrCapacity([
18877
- { params: [canonical], sql: DELETE_TOOLS_SQL },
18941
+ { params: [canonical], sql: statements.deleteTools },
18878
18942
  ...inserts,
18879
- { params: [canonical], sql: DELETE_SNAPSHOT_SQL },
18880
- ...digest === null ? [] : [{ params: [canonical, digest], sql: TOOL_SEARCH_INSERT_SNAPSHOT_SQL }],
18881
- { params: [], sql: BUMP_REVISION_SQL }
18943
+ { params: [canonical], sql: statements.deleteSnapshot },
18944
+ ...digest === null ? [] : [{ params: [canonical, digest], sql: statements.insertSnapshot }],
18945
+ { params: [], sql: statements.bumpRevision }
18882
18946
  ]);
18883
18947
  }
18884
18948
  async remove(path) {
@@ -18886,13 +18950,14 @@ var SqlSearchIndex = class {
18886
18950
  await this.driver.ensureSchema();
18887
18951
  const current = await this.driver.first({
18888
18952
  params: [canonical],
18889
- sql: PRESENT_SQL
18953
+ sql: this.dialect.statements.present
18890
18954
  });
18891
18955
  if (current === null) return;
18956
+ const statements = this.dialect.statements;
18892
18957
  await this.driver.write([
18893
- { params: [canonical], sql: DELETE_TOOLS_SQL },
18894
- { params: [canonical], sql: DELETE_SNAPSHOT_SQL },
18895
- { params: [], sql: BUMP_REVISION_SQL }
18958
+ { params: [canonical], sql: statements.deleteTools },
18959
+ { params: [canonical], sql: statements.deleteSnapshot },
18960
+ { params: [], sql: statements.bumpRevision }
18896
18961
  ]);
18897
18962
  }
18898
18963
  async removePrefix(path) {
@@ -18901,13 +18966,14 @@ var SqlSearchIndex = class {
18901
18966
  const prefixParams = [canonical, canonical, canonical];
18902
18967
  const current = await this.driver.first({
18903
18968
  params: prefixParams,
18904
- sql: PRESENT_PREFIX_SQL
18969
+ sql: this.dialect.statements.presentPrefix
18905
18970
  });
18906
18971
  if (current === null) return;
18972
+ const statements = this.dialect.statements;
18907
18973
  await this.driver.write([
18908
- { params: prefixParams, sql: DELETE_TOOLS_PREFIX_SQL },
18909
- { params: prefixParams, sql: DELETE_SNAPSHOT_PREFIX_SQL },
18910
- { params: [], sql: BUMP_REVISION_SQL }
18974
+ { params: prefixParams, sql: statements.deleteToolsPrefix },
18975
+ { params: prefixParams, sql: statements.deleteSnapshotPrefix },
18976
+ { params: [], sql: statements.bumpRevision }
18911
18977
  ]);
18912
18978
  }
18913
18979
  async rebuild(documents) {
@@ -18921,12 +18987,13 @@ var SqlSearchIndex = class {
18921
18987
  const inserts = this.driver.insertRecords(records);
18922
18988
  const snapshots = this.driver.insertSnapshots(desired);
18923
18989
  this.driver.assertInsertBudget?.(inserts.length + snapshots.length);
18990
+ const statements = this.dialect.statements;
18924
18991
  await this.writeOrCapacity([
18925
- { params: [], sql: DELETE_ALL_TOOLS_SQL },
18926
- { params: [], sql: DELETE_ALL_SNAPSHOTS_SQL },
18992
+ { params: [], sql: statements.deleteAllTools },
18993
+ { params: [], sql: statements.deleteAllSnapshots },
18927
18994
  ...inserts,
18928
18995
  ...snapshots,
18929
- { params: [], sql: COMPLETE_REBUILD_SQL }
18996
+ { params: [], sql: statements.completeRebuild }
18930
18997
  ]);
18931
18998
  }
18932
18999
  async search(query, opts) {
@@ -18945,7 +19012,7 @@ var SqlSearchIndex = class {
18945
19012
  );
18946
19013
  const limit = Math.min(normalizeToolSearchLimit(opts?.limit), TOOL_SEARCH_BATCH_LIMIT);
18947
19014
  const rows = await this.driver.all(
18948
- toolSearchCandidateStatement(prepareToolSearchQuery(normalized), limit, offset)
19015
+ this.dialect.candidateStatement(normalized, limit, offset)
18949
19016
  );
18950
19017
  const hasMore = rows.length > limit;
18951
19018
  const page = hasMore ? rows.slice(0, limit) : rows;
@@ -18984,6 +19051,145 @@ var SqlSearchIndex = class {
18984
19051
  }
18985
19052
  };
18986
19053
 
19054
+ // ../core/src/search/pgSearchDialect.ts
19055
+ var PG_SEARCH_SCHEMA_STATEMENTS = [
19056
+ `CREATE TABLE IF NOT EXISTS tb_search_tools_v3 (
19057
+ id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
19058
+ path text NOT NULL,
19059
+ name text NOT NULL,
19060
+ description text NOT NULL DEFAULT '',
19061
+ feedback text NOT NULL DEFAULT '',
19062
+ UNIQUE(path, name)
19063
+ )`,
19064
+ // 这里**故意不建 trigram GIN 索引**。实测(4000 条记录 = 500 节点上限满载):
19065
+ // 候选查询是"三列 ILIKE 用 OR 连接 + LIMIT",规划器一律选 Seq Scan(整表仅 1 个
19066
+ // buffer),GIN 索引一次都没被使用;而它让插入从 13.7ms 涨到 75.8ms(5.5×)、表总大小
19067
+ // 从 1072 kB 涨到 7208 kB(6.7×),检索却仍是 0.50 vs 0.53ms —— 纯负担。
19068
+ // 索引记录数受 TOOL_SEARCH_AUDIT_NODE_LIMIT 硬顶约束,不会增长到需要索引的规模;
19069
+ // 若将来放宽该上限,应连同候选查询形状(拆成 UNION 或改单列检索列)一起重新评估。
19070
+ `CREATE TABLE IF NOT EXISTS tb_search_meta_v3 (
19071
+ singleton integer PRIMARY KEY CHECK (singleton = 1),
19072
+ revision bigint NOT NULL DEFAULT 0,
19073
+ seeded integer NOT NULL DEFAULT 0,
19074
+ cursor_secret text NOT NULL
19075
+ )`,
19076
+ // cursor_secret 需 64 hex(32 字节)。两个内置 gen_random_uuid() 去连字符正好 64
19077
+ // hex,避免依赖 pgcrypto 的 gen_random_bytes(自托管 PG 未必预装 pgcrypto)。
19078
+ `INSERT INTO tb_search_meta_v3(singleton, revision, seeded, cursor_secret)
19079
+ VALUES (
19080
+ 1, 0, 0,
19081
+ replace(gen_random_uuid()::text, '-', '') || replace(gen_random_uuid()::text, '-', '')
19082
+ )
19083
+ ON CONFLICT (singleton) DO NOTHING`,
19084
+ `CREATE TABLE IF NOT EXISTS tb_search_snapshots_v3 (
19085
+ path text PRIMARY KEY,
19086
+ digest text NOT NULL
19087
+ )`,
19088
+ `CREATE OR REPLACE FUNCTION tb_search_snapshots_v3_capacity()
19089
+ RETURNS trigger AS $$
19090
+ BEGIN
19091
+ IF (SELECT COUNT(*) FROM tb_search_snapshots_v3) >= ${TOOL_SEARCH_AUDIT_NODE_LIMIT} THEN
19092
+ RAISE EXCEPTION '${TOOL_SEARCH_CAPACITY_MARKER}';
19093
+ END IF;
19094
+ RETURN NEW;
19095
+ END;
19096
+ $$ LANGUAGE plpgsql`,
19097
+ `DROP TRIGGER IF EXISTS tb_search_snapshots_v3_capacity_trg ON tb_search_snapshots_v3`,
19098
+ `CREATE TRIGGER tb_search_snapshots_v3_capacity_trg
19099
+ BEFORE INSERT ON tb_search_snapshots_v3
19100
+ FOR EACH ROW EXECUTE FUNCTION tb_search_snapshots_v3_capacity()`
19101
+ ];
19102
+ var PG_SEARCH_WRITE_LOCK_KEY = 2069799624;
19103
+ var PG_SEARCH_INSERT_SNAPSHOT_SQL = "INSERT INTO tb_search_snapshots_v3(path, digest) VALUES ($1, $2)";
19104
+ function pgBulkInsertSql(table, columns, rows) {
19105
+ const tuples = [];
19106
+ for (let r = 0; r < rows; r++) {
19107
+ const placeholders = columns.map((_, c) => `$${r * columns.length + c + 1}`);
19108
+ tuples.push(`(${placeholders.join(", ")})`);
19109
+ }
19110
+ return `INSERT INTO ${table} (${columns.join(", ")}) VALUES ${tuples.join(", ")}`;
19111
+ }
19112
+ var PG_SEARCH_TOOLS_TABLE = "tb_search_tools_v3";
19113
+ var PG_SEARCH_TOOLS_COLUMNS = ["path", "name", "description", "feedback"];
19114
+ var PG_SEARCH_SNAPSHOTS_TABLE = "tb_search_snapshots_v3";
19115
+ var PG_SEARCH_SNAPSHOTS_COLUMNS = ["path", "digest"];
19116
+ var PG_SEARCH_INSERT_ROWS_MAX = 1e3;
19117
+ var META_SQL2 = `
19118
+ SELECT revision::int AS revision, seeded::int AS seeded, cursor_secret
19119
+ FROM tb_search_meta_v3 WHERE singleton = 1
19120
+ `;
19121
+ var SNAPSHOT_DIGESTS_SQL2 = "SELECT path, digest FROM tb_search_snapshots_v3 ORDER BY path";
19122
+ var PATH_STATE_SQL2 = `
19123
+ SELECT snapshots.digest,
19124
+ EXISTS(SELECT 1 FROM tb_search_tools_v3 WHERE path = $1)::int AS has_tools,
19125
+ (SELECT COUNT(*) FROM tb_search_snapshots_v3)::int AS path_count
19126
+ FROM (SELECT 1) AS singleton
19127
+ LEFT JOIN tb_search_snapshots_v3 AS snapshots ON snapshots.path = $2
19128
+ `;
19129
+ var PRESENT_SQL2 = "SELECT 1 AS present FROM tb_search_tools_v3 WHERE path = $1 LIMIT 1";
19130
+ var PRESENT_PREFIX_SQL2 = `
19131
+ SELECT 1 AS present FROM tb_search_tools_v3
19132
+ WHERE path = $1 OR substr(path, 1, length($2) + 1) = $3 || '/'
19133
+ LIMIT 1
19134
+ `;
19135
+ var DELETE_TOOLS_SQL2 = "DELETE FROM tb_search_tools_v3 WHERE path = $1";
19136
+ var DELETE_SNAPSHOT_SQL2 = "DELETE FROM tb_search_snapshots_v3 WHERE path = $1";
19137
+ var DELETE_TOOLS_PREFIX_SQL2 = `
19138
+ DELETE FROM tb_search_tools_v3
19139
+ WHERE path = $1 OR substr(path, 1, length($2) + 1) = $3 || '/'
19140
+ `;
19141
+ var DELETE_SNAPSHOT_PREFIX_SQL2 = `
19142
+ DELETE FROM tb_search_snapshots_v3
19143
+ WHERE path = $1 OR substr(path, 1, length($2) + 1) = $3 || '/'
19144
+ `;
19145
+ var DELETE_ALL_TOOLS_SQL2 = "DELETE FROM tb_search_tools_v3";
19146
+ var DELETE_ALL_SNAPSHOTS_SQL2 = "DELETE FROM tb_search_snapshots_v3";
19147
+ var BUMP_REVISION_SQL2 = "UPDATE tb_search_meta_v3 SET revision = revision + 1 WHERE singleton = 1";
19148
+ var COMPLETE_REBUILD_SQL2 = "UPDATE tb_search_meta_v3 SET seeded = 1, revision = revision + 1 WHERE singleton = 1";
19149
+ function pgCandidateStatement(query, limit, offset) {
19150
+ const patterns = toolSearchLikePatterns(query);
19151
+ const matchClauses = patterns.map((_, i) => {
19152
+ const p = `$${i + 1}`;
19153
+ return `(name ILIKE ${p} ESCAPE '!' OR description ILIKE ${p} ESCAPE '!' OR feedback ILIKE ${p} ESCAPE '!')`;
19154
+ });
19155
+ const scoreTerms = patterns.map((_, i) => {
19156
+ const p = `$${i + 1}`;
19157
+ return `CASE WHEN name ILIKE ${p} ESCAPE '!' THEN 10 WHEN description ILIKE ${p} ESCAPE '!' THEN 3 WHEN feedback ILIKE ${p} ESCAPE '!' THEN 1 ELSE 0 END`;
19158
+ });
19159
+ const limitParam = `$${patterns.length + 1}`;
19160
+ const offsetParam = `$${patterns.length + 2}`;
19161
+ return {
19162
+ params: [...patterns, limit + 1, offset],
19163
+ sql: `
19164
+ SELECT id, path, name, (${scoreTerms.join(" + ")}) AS score
19165
+ FROM tb_search_tools_v3
19166
+ WHERE ${matchClauses.join(" AND ")}
19167
+ ORDER BY score DESC, path, name
19168
+ LIMIT ${limitParam} OFFSET ${offsetParam}
19169
+ `
19170
+ };
19171
+ }
19172
+ var pgSearchDialect = {
19173
+ candidateStatement: pgCandidateStatement,
19174
+ schemaStatements: PG_SEARCH_SCHEMA_STATEMENTS,
19175
+ statements: {
19176
+ bumpRevision: BUMP_REVISION_SQL2,
19177
+ completeRebuild: COMPLETE_REBUILD_SQL2,
19178
+ deleteAllSnapshots: DELETE_ALL_SNAPSHOTS_SQL2,
19179
+ deleteAllTools: DELETE_ALL_TOOLS_SQL2,
19180
+ deleteSnapshot: DELETE_SNAPSHOT_SQL2,
19181
+ deleteSnapshotPrefix: DELETE_SNAPSHOT_PREFIX_SQL2,
19182
+ deleteTools: DELETE_TOOLS_SQL2,
19183
+ deleteToolsPrefix: DELETE_TOOLS_PREFIX_SQL2,
19184
+ insertSnapshot: PG_SEARCH_INSERT_SNAPSHOT_SQL,
19185
+ meta: META_SQL2,
19186
+ pathState: PATH_STATE_SQL2,
19187
+ present: PRESENT_SQL2,
19188
+ presentPrefix: PRESENT_PREFIX_SQL2,
19189
+ snapshotDigests: SNAPSHOT_DIGESTS_SQL2
19190
+ }
19191
+ };
19192
+
18987
19193
  // ../core/src/secret/secretStore.ts
18988
19194
  var AES_GCM_IV_BYTES = 12;
18989
19195
  var MASTER_KEY_BYTES = 32;
@@ -19913,6 +20119,7 @@ var NodeRegistryStore = class {
19913
20119
  ...node.config !== void 0 ? { config: node.config } : {},
19914
20120
  ...node.virtualize !== void 0 ? { virtualize: node.virtualize } : {},
19915
20121
  ...opts.online !== void 0 ? { online: opts.online } : {},
20122
+ ...opts.lastSeenAt !== void 0 ? { lastSeenAt: opts.lastSeenAt } : {},
19916
20123
  registeredBy,
19917
20124
  createdAt: existing?.createdAt ?? now,
19918
20125
  updatedAt: now
@@ -19941,15 +20148,34 @@ var NodeRegistryStore = class {
19941
20148
  await this.store.put(this.keyOf(norm), merged);
19942
20149
  return merged;
19943
20150
  }
19944
- /** 设备生命周期专用:只更新节点 online 状态,不存在 → not_found。 */
20151
+ /**
20152
+ * 设备生命周期专用:更新节点 online 状态,不存在 → not_found。
20153
+ * online 翻 true 时视为一次存活观察,同步把 `lastSeenAt` 刷到 now;翻 false 时保留原
20154
+ * `lastSeenAt`(用于展示"最后在线于")。
20155
+ */
19945
20156
  async setOnline(path, online, now) {
19946
20157
  const norm = normalizePath(path);
19947
20158
  const existing = await this.read(norm);
19948
20159
  if (!existing) throw new TBError("not_found", `\u8282\u70B9\u4E0D\u5B58\u5728:'${norm}'`);
19949
- const updated = { ...existing, online, updatedAt: now };
20160
+ const updated = {
20161
+ ...existing,
20162
+ online,
20163
+ ...online ? { lastSeenAt: now } : {},
20164
+ updatedAt: now
20165
+ };
19950
20166
  await this.store.put(this.keyOf(norm), updated);
19951
20167
  return updated;
19952
20168
  }
20169
+ /**
20170
+ * 设备心跳专用:只把 `lastSeenAt` 刷到 now,不改 online 也不动 updatedAt(心跳不是元数据变更,
20171
+ * 不该扰动 updatedAt 的语义)。节点不存在时静默返回——心跳晚于节点删除是正常竞态,不报错。
20172
+ */
20173
+ async touchSeen(path, now) {
20174
+ const norm = normalizePath(path);
20175
+ const existing = await this.read(norm);
20176
+ if (!existing) return;
20177
+ await this.store.put(this.keyOf(norm), { ...existing, lastSeenAt: now });
20178
+ }
19953
20179
  /**
19954
20180
  * 卸载;不存在 → not_found。删除后自底向上级联回收:
19955
20181
  * 仅回收 registeredBy=system:auto 且再无子节点的 directory,遇显式节点/仍有子节点即停。
@@ -20088,6 +20314,8 @@ export {
20088
20314
  deviceShellHelpModel,
20089
20315
  deviceFsHelpModel,
20090
20316
  deviceDirectoryHelpModel,
20317
+ derivePresence,
20318
+ DEVICE_CALL_TIMEOUT_MS,
20091
20319
  DeviceGatewaySession,
20092
20320
  FEEDBACK_HIDE_SCORE,
20093
20321
  selectFeedbackSearchText,
@@ -20129,6 +20357,14 @@ export {
20129
20357
  TOOL_SEARCH_INSERT_SQL,
20130
20358
  TOOL_SEARCH_INSERT_SNAPSHOT_SQL,
20131
20359
  SqlSearchIndex,
20360
+ PG_SEARCH_WRITE_LOCK_KEY,
20361
+ pgBulkInsertSql,
20362
+ PG_SEARCH_TOOLS_TABLE,
20363
+ PG_SEARCH_TOOLS_COLUMNS,
20364
+ PG_SEARCH_SNAPSHOTS_TABLE,
20365
+ PG_SEARCH_SNAPSHOTS_COLUMNS,
20366
+ PG_SEARCH_INSERT_ROWS_MAX,
20367
+ pgSearchDialect,
20132
20368
  SecretStoreImpl,
20133
20369
  SKILLHUB_CAPABILITIES,
20134
20370
  skillhubScopeForCmd,
@@ -2,15 +2,15 @@ import {
2
2
  createProviderPlugin,
3
3
  requireApiKey,
4
4
  upstreamError
5
- } from "./chunk-FHYFPPBZ.js";
5
+ } from "./chunk-2DA2UI37.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-7GP7DRES.js";
9
- import "./chunk-B4ZA7EGO.js";
8
+ } from "./chunk-SBJMMSPA.js";
9
+ import "./chunk-Q44CYUSI.js";
10
10
  import {
11
11
  TBError,
12
12
  external_exports
13
- } from "./chunk-7PM4FD5K.js";
13
+ } from "./chunk-TPGTA43F.js";
14
14
  import "./chunk-MLKGABMK.js";
15
15
 
16
16
  // ../plugins/src/circleci/api.ts
@@ -2,14 +2,14 @@ import {
2
2
  createProviderPlugin,
3
3
  requireApiKey,
4
4
  upstreamError
5
- } from "./chunk-FHYFPPBZ.js";
5
+ } from "./chunk-2DA2UI37.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-7GP7DRES.js";
9
- import "./chunk-B4ZA7EGO.js";
8
+ } from "./chunk-SBJMMSPA.js";
9
+ import "./chunk-Q44CYUSI.js";
10
10
  import {
11
11
  external_exports
12
- } from "./chunk-7PM4FD5K.js";
12
+ } from "./chunk-TPGTA43F.js";
13
13
  import "./chunk-MLKGABMK.js";
14
14
 
15
15
  // ../plugins/src/clerk/api.ts
@@ -2,15 +2,15 @@ import {
2
2
  createProviderPlugin,
3
3
  requireApiKey,
4
4
  upstreamError
5
- } from "./chunk-FHYFPPBZ.js";
5
+ } from "./chunk-2DA2UI37.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-7GP7DRES.js";
9
- import "./chunk-B4ZA7EGO.js";
8
+ } from "./chunk-SBJMMSPA.js";
9
+ import "./chunk-Q44CYUSI.js";
10
10
  import {
11
11
  TBError,
12
12
  external_exports
13
- } from "./chunk-7PM4FD5K.js";
13
+ } from "./chunk-TPGTA43F.js";
14
14
  import "./chunk-MLKGABMK.js";
15
15
 
16
16
  // ../plugins/src/cloudflare_dns/api.ts
@@ -2,14 +2,14 @@ import {
2
2
  createProviderPlugin,
3
3
  requireApiKey,
4
4
  upstreamError
5
- } from "./chunk-FHYFPPBZ.js";
5
+ } from "./chunk-2DA2UI37.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-7GP7DRES.js";
9
- import "./chunk-B4ZA7EGO.js";
8
+ } from "./chunk-SBJMMSPA.js";
9
+ import "./chunk-Q44CYUSI.js";
10
10
  import {
11
11
  external_exports
12
- } from "./chunk-7PM4FD5K.js";
12
+ } from "./chunk-TPGTA43F.js";
13
13
  import "./chunk-MLKGABMK.js";
14
14
 
15
15
  // ../plugins/src/cohere/api.ts
@@ -2,15 +2,15 @@ import {
2
2
  createProviderPlugin,
3
3
  requireCredential,
4
4
  upstreamError
5
- } from "./chunk-FHYFPPBZ.js";
5
+ } from "./chunk-2DA2UI37.js";
6
6
  import {
7
7
  guardedFetch
8
- } from "./chunk-7GP7DRES.js";
9
- import "./chunk-B4ZA7EGO.js";
8
+ } from "./chunk-SBJMMSPA.js";
9
+ import "./chunk-Q44CYUSI.js";
10
10
  import {
11
11
  TBError,
12
12
  external_exports
13
- } from "./chunk-7PM4FD5K.js";
13
+ } from "./chunk-TPGTA43F.js";
14
14
  import "./chunk-MLKGABMK.js";
15
15
 
16
16
  // ../plugins/src/confluence/api.ts
@@ -2,16 +2,16 @@ import {
2
2
  createProviderPlugin,
3
3
  requireApiKey,
4
4
  upstreamError
5
- } from "./chunk-FHYFPPBZ.js";
5
+ } from "./chunk-2DA2UI37.js";
6
6
  import {
7
7
  assertPublicHttpUrl,
8
8
  guardedFetch
9
- } from "./chunk-7GP7DRES.js";
10
- import "./chunk-B4ZA7EGO.js";
9
+ } from "./chunk-SBJMMSPA.js";
10
+ import "./chunk-Q44CYUSI.js";
11
11
  import {
12
12
  TBError,
13
13
  external_exports
14
- } from "./chunk-7PM4FD5K.js";
14
+ } from "./chunk-TPGTA43F.js";
15
15
  import "./chunk-MLKGABMK.js";
16
16
 
17
17
  // ../plugins/src/convertapi/schema.ts