@tool-bridge/server 0.1.1 → 0.3.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 (107) hide show
  1. package/dist/airtable-V6446SVY.js +792 -0
  2. package/dist/alt_text_generator_ai-HV7JZPDT.js +72 -0
  3. package/dist/amap-TTTVB6WS.js +755 -0
  4. package/dist/anthropic-JH3RA363.js +224 -0
  5. package/dist/apify-ETNN7ITU.js +262 -0
  6. package/dist/brave_search-3DDR2MMB.js +322 -0
  7. package/dist/chunk-CSJEZHQO.js +252 -0
  8. package/dist/chunk-JLTYA2B3.js +20121 -0
  9. package/dist/chunk-K7FVSFUX.js +333 -0
  10. package/dist/{chunk-MQEYFCJB.js → chunk-KGYJEEBI.js} +2770 -21574
  11. package/dist/circleci-MX3TX3HC.js +409 -0
  12. package/dist/clerk-MRPORVF4.js +1036 -0
  13. package/dist/cloudflare_dns-OWP7DD7L.js +605 -0
  14. package/dist/cohere-GPECP66S.js +197 -0
  15. package/dist/confluence-BN7LZ6BC.js +436 -0
  16. package/dist/convertapi-SBEOFOFQ.js +161 -0
  17. package/dist/currencyapi-P2YY7Y7P.js +306 -0
  18. package/dist/deepseek-MWB3NYIN.js +205 -0
  19. package/dist/docker_hub-3JSCIGQ3.js +946 -0
  20. package/dist/dropbox-RFIBDAXO.js +1308 -0
  21. package/dist/dub-YVP57ELQ.js +706 -0
  22. package/dist/e2b-NFSUHTZR.js +305 -0
  23. package/dist/exa-KTDY6IV3.js +360 -0
  24. package/dist/fal_ai-OCUENLNQ.js +405 -0
  25. package/dist/feishu-5CWBQ7E5.js +225 -0
  26. package/dist/feishu_custom_bot-ZJR22OK6.js +240 -0
  27. package/dist/figma-YULGANSA.js +798 -0
  28. package/dist/firehydrant-2V6YSYAP.js +573 -0
  29. package/dist/fixer-LTCDB3CJ.js +171 -0
  30. package/dist/fly-IXPKMAML.js +478 -0
  31. package/dist/front-KRFB4M5X.js +379 -0
  32. package/dist/geocodio-VVURKYHQ.js +236 -0
  33. package/dist/ghost-6J2RIOUB.js +341 -0
  34. package/dist/github-5Z6KQRYH.js +5410 -0
  35. package/dist/gmail-KU4NZ7VA.js +1894 -0
  36. package/dist/googlecalendar-X44DFFXG.js +2539 -0
  37. package/dist/googledocs-WSGLPKSF.js +1322 -0
  38. package/dist/grafana-4PKSSDXY.js +817 -0
  39. package/dist/graphhopper-DF65ZNGK.js +336 -0
  40. package/dist/index.d.ts +181 -2
  41. package/dist/index.js +2 -1
  42. package/dist/ip2proxy-UCAQ5P2J.js +118 -0
  43. package/dist/ipgeolocation_io-UX6FCA2S.js +333 -0
  44. package/dist/ipqualityscore-MKTRXIZJ.js +287 -0
  45. package/dist/jina_ai-MRHPCSV5.js +119 -0
  46. package/dist/jira-EG7ZPOIW.js +627 -0
  47. package/dist/langsmith-FNO3RCOZ.js +597 -0
  48. package/dist/lemlist-SN6BJHSG.js +298 -0
  49. package/dist/linear-H3VU4PSD.js +2163 -0
  50. package/dist/logsnag-OY2JJT2H.js +167 -0
  51. package/dist/main.js +246 -2
  52. package/dist/mattermost-C5SQ7PGD.js +320 -0
  53. package/dist/mem0-LMLE5BFC.js +567 -0
  54. package/dist/memos-UWFAMBZC.js +781 -0
  55. package/dist/metabase-SRYDSDJ6.js +365 -0
  56. package/dist/mistral_ai-YNIJ7VDM.js +1195 -0
  57. package/dist/mother_duck-CPGOFEXE.js +322 -0
  58. package/dist/ngrok-CDJFBSOM.js +375 -0
  59. package/dist/notes-DIVFH3P3.js +109 -0
  60. package/dist/notion-HGDKS4HK.js +945 -0
  61. package/dist/open_exchange_rates-COHHYJDD.js +216 -0
  62. package/dist/openai-4TRT66GW.js +795 -0
  63. package/dist/opengraph_io-YKVW4PXI.js +377 -0
  64. package/dist/openrouter-6CV7B7V5.js +444 -0
  65. package/dist/outline-YWDUK5F7.js +604 -0
  66. package/dist/paddle-MEU7HWDZ.js +464 -0
  67. package/dist/perplexity-MRQUDBIC.js +238 -0
  68. package/dist/pinecone-JI7X2TAF.js +599 -0
  69. package/dist/pipedrive-6JQPAW23.js +453 -0
  70. package/dist/polar-7BF56CMC.js +400 -0
  71. package/dist/posthog-YPU5ADEN.js +3462 -0
  72. package/dist/postmark-BEU5OFKU.js +441 -0
  73. package/dist/prerender-UT5GOOZH.js +180 -0
  74. package/dist/pubmed-3SGOE24Q.js +1052 -0
  75. package/dist/railway-CEK4GLRQ.js +452 -0
  76. package/dist/readwise-DXQUQU67.js +482 -0
  77. package/dist/render-7TGAU5AW.js +473 -0
  78. package/dist/replicate-VICFSQ5A.js +347 -0
  79. package/dist/resend-3E76WK3O.js +100 -0
  80. package/dist/rootly-36GY46BY.js +345 -0
  81. package/dist/scrapfly-VDVUYAHX.js +289 -0
  82. package/dist/scrapingbee-3KTPMAVY.js +247 -0
  83. package/dist/screenshot_fyi-LKG62C3J.js +116 -0
  84. package/dist/semantic_scholar-4WREECYO.js +626 -0
  85. package/dist/sentry-HUQTGXOV.js +1139 -0
  86. package/dist/shodan-SGRKU4KS.js +303 -0
  87. package/dist/shopify-YCZ4L5HT.js +620 -0
  88. package/dist/stripe-OEBKMELB.js +583 -0
  89. package/dist/supabase-I3DBY7L4.js +937 -0
  90. package/dist/tavily-B2YHCNRD.js +349 -0
  91. package/dist/telegram-2VYJELZX.js +1773 -0
  92. package/dist/telnyx-HHXD3CXL.js +237 -0
  93. package/dist/todoist-PHFDEEIS.js +672 -0
  94. package/dist/trello-WUSAK6YN.js +1091 -0
  95. package/dist/turso-FW56U2B3.js +432 -0
  96. package/dist/twilio-M5JI7XHA.js +321 -0
  97. package/dist/umami-HAYODRC4.js +411 -0
  98. package/dist/unsplash-EDPTNEHJ.js +364 -0
  99. package/dist/upstash_redis-GC2CLIWD.js +299 -0
  100. package/dist/uptimerobot-XMSNYLIT.js +481 -0
  101. package/dist/v2ex-KU4ECD65.js +672 -0
  102. package/dist/vercel-THPCEFHW.js +1096 -0
  103. package/dist/wolfram_alpha_api-WHHTH4GU.js +212 -0
  104. package/dist/wordpress-O6TQEQNF.js +822 -0
  105. package/dist/workos-A3VHHWI3.js +681 -0
  106. package/dist/zhihu-BJAI64YJ.js +273 -0
  107. package/package.json +5 -4
@@ -0,0 +1,817 @@
1
+ import {
2
+ assertPublicHttpUrl,
3
+ createProviderPlugin,
4
+ guardedFetch,
5
+ requireApiKey,
6
+ upstreamError
7
+ } from "./chunk-CSJEZHQO.js";
8
+ import "./chunk-K7FVSFUX.js";
9
+ import {
10
+ TBError,
11
+ external_exports
12
+ } from "./chunk-JLTYA2B3.js";
13
+ import "./chunk-MLKGABMK.js";
14
+
15
+ // ../plugins/src/grafana/api.ts
16
+ var SERVICE = "grafana";
17
+ var DEFAULT_NAMESPACE = "default";
18
+ var FOLDER_PARENT_ANNOTATION = "grafana.app/folder";
19
+ var DEFAULT_API_VERSION = "v1";
20
+ var API_VERSION_PREFERENCE = [DEFAULT_API_VERSION, "v1beta1", "v0alpha1"];
21
+ var API_GROUPS = {
22
+ dashboards: "dashboard.grafana.app",
23
+ folders: "folder.grafana.app"
24
+ };
25
+ var API_VERSION_CACHE_MAX = 256;
26
+ var apiVersionCache = /* @__PURE__ */ new Map();
27
+ function record(value) {
28
+ return typeof value === "object" && value !== null && !Array.isArray(value) ? value : void 0;
29
+ }
30
+ function text(value) {
31
+ if (typeof value !== "string") return void 0;
32
+ const trimmed = value.trim();
33
+ return trimmed === "" ? void 0 : trimmed;
34
+ }
35
+ function integer(value) {
36
+ return typeof value === "number" && Number.isInteger(value) ? value : void 0;
37
+ }
38
+ function boolean(value) {
39
+ return typeof value === "boolean" ? value : void 0;
40
+ }
41
+ function compact(input) {
42
+ return Object.fromEntries(
43
+ Object.entries(input).filter(([, value]) => value !== void 0)
44
+ );
45
+ }
46
+ function requireText(value, field) {
47
+ const result = text(value);
48
+ if (result === void 0) throw new TBError("invalid_argument", `${field} is required`);
49
+ return result;
50
+ }
51
+ function requireObject(value, field) {
52
+ const object = record(value);
53
+ if (object === void 0) throw new TBError("invalid_argument", `${field} object is required`);
54
+ return object;
55
+ }
56
+ function objectArray(value) {
57
+ if (!Array.isArray(value)) return [];
58
+ return value.flatMap((item) => {
59
+ const fields = record(item);
60
+ return fields === void 0 ? [] : [fields];
61
+ });
62
+ }
63
+ function stringArray(value) {
64
+ if (value === void 0) return void 0;
65
+ return value.flatMap((item) => {
66
+ const trimmed = text(item);
67
+ return trimmed === void 0 ? [] : [trimmed];
68
+ });
69
+ }
70
+ function configError(message) {
71
+ return new TBError("invalid_argument", `${SERVICE} \u7684 baseUrl ${message}`);
72
+ }
73
+ function resolveBaseUrl(ctx) {
74
+ const configured = ctx.config?.baseUrl;
75
+ if (configured !== void 0 && typeof configured !== "string") throw configError("\u5FC5\u987B\u662F\u5B57\u7B26\u4E32");
76
+ const candidate = text(configured);
77
+ if (candidate === void 0) {
78
+ throw configError(
79
+ "\u662F\u5FC5\u914D\u9879:\u7ED9\u6302\u8F7D\u8282\u70B9\u914D providerConfig.baseUrl \u6307\u5411\u4F60\u7684 Grafana \u5B9E\u4F8B(\u5982 https://your-stack.grafana.net)\u3002Grafana \u6CA1\u6709\u516C\u5171\u7F3A\u7701\u5730\u5740,\u62FF\u4E0D\u5230\u5B83\u65E0\u6CD5\u51FA\u7AD9"
80
+ );
81
+ }
82
+ let url;
83
+ try {
84
+ url = assertPublicHttpUrl(candidate);
85
+ } catch (error) {
86
+ const detail = error instanceof Error ? error.message : "\u4E0D\u53EF\u7528";
87
+ throw configError(
88
+ `\u4E0D\u53EF\u7528(${detail})\u3002\u81EA\u5EFA Grafana \u5FC5\u987B\u662F**\u516C\u7F51\u53EF\u8FBE**\u7684 https \u5730\u5740:\u63D2\u4EF6\u4E0E\u7F51\u5173\u540C\u8FDB\u7A0B,\u6307\u5411\u5185\u7F51\u6216\u4FDD\u7559\u5730\u5740\u4F1A\u88AB\u51FA\u7AD9\u6821\u9A8C\u62D2\u7EDD`
89
+ );
90
+ }
91
+ if (url.protocol !== "https:") throw configError("\u5FC5\u987B\u7528 https");
92
+ url.search = "";
93
+ url.hash = "";
94
+ return `${url.origin}${url.pathname.replace(/\/+$/, "")}`;
95
+ }
96
+ function resolveTarget(ctx) {
97
+ return { apiKey: requireApiKey(ctx, SERVICE), baseUrl: resolveBaseUrl(ctx) };
98
+ }
99
+ function errorMessage(payload, status, statusText) {
100
+ const direct = text(payload);
101
+ if (direct !== void 0) return direct;
102
+ const fields = record(payload);
103
+ const message = text(fields?.message) ?? text(fields?.error) ?? text(fields?.detail) ?? text(fields?.title);
104
+ return message ?? text(statusText) ?? `Grafana request failed with ${status}`;
105
+ }
106
+ function buildUrl(baseUrl, input) {
107
+ const url = new URL(input.path.replace(/^\/+/, ""), `${baseUrl}/`);
108
+ for (const [key, value] of Object.entries(input.query ?? {})) {
109
+ if (value !== void 0) url.searchParams.set(key, String(value));
110
+ }
111
+ for (const [key, values] of Object.entries(input.multiValueQuery ?? {})) {
112
+ for (const value of values ?? []) url.searchParams.append(key, value);
113
+ }
114
+ return url.toString();
115
+ }
116
+ function readPayload(body) {
117
+ if (body.trim() === "") return null;
118
+ try {
119
+ return JSON.parse(body);
120
+ } catch {
121
+ return body;
122
+ }
123
+ }
124
+ async function request(target, input) {
125
+ let response;
126
+ let payload;
127
+ try {
128
+ response = await guardedFetch(buildUrl(target.baseUrl, input), {
129
+ method: input.method,
130
+ headers: {
131
+ accept: "application/json",
132
+ authorization: `Bearer ${target.apiKey}`,
133
+ ...input.body === void 0 ? {} : { "content-type": "application/json" }
134
+ },
135
+ body: input.body === void 0 ? void 0 : JSON.stringify(input.body)
136
+ });
137
+ payload = readPayload(await response.text());
138
+ } catch (error) {
139
+ if (error instanceof TBError) throw error;
140
+ const detail = error instanceof Error ? error.message : "unknown network error";
141
+ throw upstreamError(502, `Grafana request failed: ${detail}`);
142
+ }
143
+ if (!response.ok) {
144
+ throw upstreamError(response.status, errorMessage(payload, response.status, response.statusText));
145
+ }
146
+ return payload;
147
+ }
148
+ function cacheApiVersion(key, version) {
149
+ apiVersionCache.delete(key);
150
+ if (apiVersionCache.size >= API_VERSION_CACHE_MAX) {
151
+ const oldest = apiVersionCache.keys().next().value;
152
+ if (oldest !== void 0) apiVersionCache.delete(oldest);
153
+ }
154
+ apiVersionCache.set(key, version);
155
+ }
156
+ async function resolveApiVersion(target, group) {
157
+ const key = `${target.baseUrl}|${group}`;
158
+ const cached = apiVersionCache.get(key);
159
+ if (cached !== void 0) return cached;
160
+ try {
161
+ const payload = await request(target, { method: "GET", path: `/apis/${group}` });
162
+ const served = new Set(objectArray(record(payload)?.versions).map((entry) => text(entry.version)).filter((version) => version !== void 0));
163
+ const match = API_VERSION_PREFERENCE.find((version) => served.has(version));
164
+ if (match !== void 0) {
165
+ cacheApiVersion(key, match);
166
+ return match;
167
+ }
168
+ } catch {
169
+ }
170
+ return DEFAULT_API_VERSION;
171
+ }
172
+ async function appPath(target, resource, namespace) {
173
+ const group = API_GROUPS[resource];
174
+ const version = await resolveApiVersion(target, group);
175
+ const ns = encodeURIComponent(text(namespace) ?? DEFAULT_NAMESPACE);
176
+ return `/apis/${group}/${version}/namespaces/${ns}/${resource}`;
177
+ }
178
+ async function appResourcePath(target, resource, namespace, uid) {
179
+ const collection = await appPath(target, resource, namespace);
180
+ return `${collection}/${encodeURIComponent(requireText(uid, "uid"))}`;
181
+ }
182
+ function resourceBody(input) {
183
+ return {
184
+ metadata: compact({
185
+ name: text(input.uid),
186
+ generateName: text(input.generateName),
187
+ resourceVersion: text(input.resourceVersion),
188
+ annotations: input.parent === void 0 ? void 0 : { [FOLDER_PARENT_ANNOTATION]: input.parent }
189
+ }),
190
+ spec: input.spec
191
+ };
192
+ }
193
+ function normalizeAppResource(value, parentKey) {
194
+ const fields = record(value) ?? {};
195
+ const metadata = record(fields.metadata) ?? {};
196
+ const spec = record(fields.spec) ?? {};
197
+ const annotations = record(metadata.annotations) ?? {};
198
+ return {
199
+ uid: text(metadata.name) ?? text(metadata.uid) ?? null,
200
+ title: text(spec.title) ?? null,
201
+ namespace: text(metadata.namespace) ?? null,
202
+ resourceVersion: text(metadata.resourceVersion) ?? null,
203
+ [parentKey]: text(annotations[FOLDER_PARENT_ANNOTATION]) ?? null,
204
+ raw: fields
205
+ };
206
+ }
207
+ function normalizeSearchItem(value) {
208
+ return {
209
+ ...value,
210
+ id: integer(value.id) ?? null,
211
+ uid: text(value.uid) ?? null,
212
+ title: text(value.title) ?? null,
213
+ type: text(value.type) ?? null,
214
+ url: text(value.url) ?? null,
215
+ isStarred: boolean(value.isStarred) ?? null
216
+ };
217
+ }
218
+ function normalizeDataSource(value) {
219
+ const fields = record(value) ?? {};
220
+ return {
221
+ ...fields,
222
+ id: integer(fields.id) ?? null,
223
+ uid: text(fields.uid) ?? null,
224
+ name: text(fields.name) ?? null,
225
+ type: text(fields.type) ?? null,
226
+ access: text(fields.access) ?? null,
227
+ url: text(fields.url) ?? null,
228
+ isDefault: boolean(fields.isDefault) ?? null,
229
+ readOnly: boolean(fields.readOnly) ?? null
230
+ };
231
+ }
232
+ function deleted(payload) {
233
+ return { deleted: true, raw: record(payload) ?? null };
234
+ }
235
+ function dataSourcePath(uid) {
236
+ return `/api/datasources/uid/${encodeURIComponent(requireText(uid, "uid"))}`;
237
+ }
238
+ async function listFolders(input, ctx) {
239
+ const target = resolveTarget(ctx);
240
+ const payload = await request(target, {
241
+ method: "GET",
242
+ path: await appPath(target, "folders", input.namespace),
243
+ // Kubernetes 风格的分页:游标叫 `continue`,入参里叫 `continueToken`。
244
+ query: compact({ limit: input.limit, continue: text(input.continueToken) })
245
+ });
246
+ const fields = record(payload) ?? {};
247
+ return {
248
+ folders: objectArray(fields.items).map((item) => normalizeAppResource(item, "parentUid")),
249
+ continueToken: text(record(fields.metadata)?.continue) ?? null,
250
+ raw: fields
251
+ };
252
+ }
253
+ async function getFolder(input, ctx) {
254
+ const target = resolveTarget(ctx);
255
+ const payload = await request(target, {
256
+ method: "GET",
257
+ path: await appResourcePath(target, "folders", input.namespace, input.uid)
258
+ });
259
+ return { folder: normalizeAppResource(payload, "parentUid") };
260
+ }
261
+ async function createFolder(input, ctx) {
262
+ const target = resolveTarget(ctx);
263
+ const payload = await request(target, {
264
+ method: "POST",
265
+ path: await appPath(target, "folders", input.namespace),
266
+ body: resourceBody({
267
+ uid: input.uid,
268
+ generateName: input.generateName,
269
+ parent: text(input.parentUid),
270
+ spec: { title: requireText(input.title, "title") }
271
+ })
272
+ });
273
+ return { folder: normalizeAppResource(payload, "parentUid") };
274
+ }
275
+ async function updateFolder(input, ctx) {
276
+ const target = resolveTarget(ctx);
277
+ const uid = requireText(input.uid, "uid");
278
+ const payload = await request(target, {
279
+ method: "PUT",
280
+ path: await appResourcePath(target, "folders", input.namespace, uid),
281
+ // 更新时 `metadata.name` 必须等于路径上的 uid,故拿它当兜底值。
282
+ body: resourceBody({
283
+ uid,
284
+ resourceVersion: input.resourceVersion,
285
+ parent: text(input.parentUid),
286
+ spec: { title: requireText(input.title, "title") }
287
+ })
288
+ });
289
+ return { folder: normalizeAppResource(payload, "parentUid") };
290
+ }
291
+ async function deleteFolder(input, ctx) {
292
+ const target = resolveTarget(ctx);
293
+ const payload = await request(target, {
294
+ method: "DELETE",
295
+ path: await appResourcePath(target, "folders", input.namespace, input.uid)
296
+ });
297
+ return deleted(payload);
298
+ }
299
+ async function searchDashboards(input, ctx) {
300
+ const payload = await request(resolveTarget(ctx), {
301
+ method: "GET",
302
+ path: "/api/search",
303
+ query: compact({
304
+ query: text(input.query),
305
+ type: text(input.type),
306
+ starred: input.starred,
307
+ limit: input.limit,
308
+ page: input.page
309
+ }),
310
+ multiValueQuery: {
311
+ tag: stringArray(input.tags),
312
+ dashboardUIDs: stringArray(input.dashboardUids),
313
+ folderUIDs: stringArray(input.folderUids)
314
+ }
315
+ });
316
+ const results = objectArray(payload);
317
+ return { results: results.map(normalizeSearchItem), raw: results };
318
+ }
319
+ async function getDashboard(input, ctx) {
320
+ const target = resolveTarget(ctx);
321
+ const payload = await request(target, {
322
+ method: "GET",
323
+ path: await appResourcePath(target, "dashboards", input.namespace, input.uid)
324
+ });
325
+ return { dashboard: normalizeAppResource(payload, "folderUid") };
326
+ }
327
+ async function createDashboard(input, ctx) {
328
+ const target = resolveTarget(ctx);
329
+ const payload = await request(target, {
330
+ method: "POST",
331
+ path: await appPath(target, "dashboards", input.namespace),
332
+ body: resourceBody({
333
+ uid: input.uid,
334
+ generateName: input.generateName,
335
+ parent: text(input.folderUid),
336
+ spec: requireObject(input.spec, "spec")
337
+ })
338
+ });
339
+ return { dashboard: normalizeAppResource(payload, "folderUid") };
340
+ }
341
+ async function updateDashboard(input, ctx) {
342
+ const target = resolveTarget(ctx);
343
+ const uid = requireText(input.uid, "uid");
344
+ const payload = await request(target, {
345
+ method: "PUT",
346
+ path: await appResourcePath(target, "dashboards", input.namespace, uid),
347
+ body: resourceBody({
348
+ uid,
349
+ resourceVersion: input.resourceVersion,
350
+ parent: text(input.folderUid),
351
+ spec: requireObject(input.spec, "spec")
352
+ })
353
+ });
354
+ return { dashboard: normalizeAppResource(payload, "folderUid") };
355
+ }
356
+ async function deleteDashboard(input, ctx) {
357
+ const target = resolveTarget(ctx);
358
+ const payload = await request(target, {
359
+ method: "DELETE",
360
+ path: await appResourcePath(target, "dashboards", input.namespace, input.uid)
361
+ });
362
+ return deleted(payload);
363
+ }
364
+ async function listDataSources(_input, ctx) {
365
+ const payload = await request(resolveTarget(ctx), { method: "GET", path: "/api/datasources" });
366
+ const records = objectArray(payload);
367
+ return { dataSources: records.map(normalizeDataSource), raw: records };
368
+ }
369
+ async function getDataSource(input, ctx) {
370
+ const payload = await request(resolveTarget(ctx), { method: "GET", path: dataSourcePath(input.uid) });
371
+ return { dataSource: normalizeDataSource(payload) };
372
+ }
373
+ async function createDataSource(input, ctx) {
374
+ const payload = await request(resolveTarget(ctx), {
375
+ method: "POST",
376
+ path: "/api/datasources",
377
+ body: requireObject(input.dataSource, "dataSource")
378
+ });
379
+ return {
380
+ dataSource: normalizeDataSource(record(payload)?.datasource ?? payload),
381
+ raw: record(payload) ?? {}
382
+ };
383
+ }
384
+ async function updateDataSource(input, ctx) {
385
+ const payload = await request(resolveTarget(ctx), {
386
+ method: "PUT",
387
+ path: dataSourcePath(input.uid),
388
+ body: requireObject(input.dataSource, "dataSource")
389
+ });
390
+ return {
391
+ dataSource: normalizeDataSource(record(payload)?.datasource ?? payload),
392
+ raw: record(payload) ?? {}
393
+ };
394
+ }
395
+ async function deleteDataSource(input, ctx) {
396
+ const payload = await request(resolveTarget(ctx), { method: "DELETE", path: dataSourcePath(input.uid) });
397
+ return deleted(payload);
398
+ }
399
+ async function listAlertRules(_input, ctx) {
400
+ const payload = await request(resolveTarget(ctx), { method: "GET", path: "/api/v1/provisioning/alert-rules" });
401
+ return { alertRules: objectArray(payload) };
402
+ }
403
+ async function getAlertRule(input, ctx) {
404
+ const uid = encodeURIComponent(requireText(input.uid, "uid"));
405
+ const payload = await request(resolveTarget(ctx), {
406
+ method: "GET",
407
+ path: `/api/v1/provisioning/alert-rules/${uid}`
408
+ });
409
+ return { alertRule: record(payload) ?? {} };
410
+ }
411
+ async function listAlertInstances(input, ctx) {
412
+ const payload = await request(resolveTarget(ctx), {
413
+ method: "GET",
414
+ // 内置 Alertmanager 的 v2 端点,与 App Platform 的版本协商无关。
415
+ path: "/api/alertmanager/grafana/api/v2/alerts",
416
+ query: compact({ active: input.active, silenced: input.silenced, inhibited: input.inhibited })
417
+ });
418
+ return { alertInstances: objectArray(payload) };
419
+ }
420
+ async function listContactPoints(_input, ctx) {
421
+ const payload = await request(resolveTarget(ctx), { method: "GET", path: "/api/v1/provisioning/contact-points" });
422
+ return { contactPoints: objectArray(payload) };
423
+ }
424
+
425
+ // ../plugins/src/grafana/schema.ts
426
+ var listFoldersInput = external_exports.strictObject({
427
+ namespace: external_exports.string().min(1).describe("The Grafana API namespace. Use default for the main organization.").optional(),
428
+ limit: external_exports.int().min(1).describe("Maximum number of folders to request.").optional(),
429
+ continueToken: external_exports.string().min(1).describe("The Grafana continue token from a previous folder list response.").optional()
430
+ }).describe("Input for listing Grafana folders.");
431
+ var listFoldersOutput = external_exports.strictObject({
432
+ folders: external_exports.array(external_exports.strictObject({
433
+ uid: external_exports.string().describe("The Grafana folder UID.").nullable().optional(),
434
+ title: external_exports.string().describe("The folder title.").nullable().optional(),
435
+ namespace: external_exports.string().describe("The namespace that owns the folder.").nullable().optional(),
436
+ resourceVersion: external_exports.string().describe("The folder resource version.").nullable().optional(),
437
+ parentUid: external_exports.string().describe("The parent folder UID when the folder is nested.").nullable().optional(),
438
+ raw: external_exports.looseObject({}).describe("The raw Grafana API object.").optional()
439
+ }).describe("A normalized Grafana folder.")).describe("Folders returned by Grafana.").optional(),
440
+ continueToken: external_exports.string().describe("The next Grafana continue token, or null on the last page.").nullable().optional(),
441
+ raw: external_exports.looseObject({}).describe("The raw Grafana API object.").optional()
442
+ }).describe("A page of Grafana folders.");
443
+ var getFolderInput = external_exports.strictObject({
444
+ uid: external_exports.string().min(1).describe("The Grafana folder UID."),
445
+ namespace: external_exports.string().min(1).describe("The Grafana API namespace. Use default for the main organization.").optional()
446
+ }).describe("Input for retrieving a Grafana folder.");
447
+ var getFolderOutput = external_exports.strictObject({
448
+ folder: external_exports.strictObject({
449
+ uid: external_exports.string().describe("The Grafana folder UID.").nullable().optional(),
450
+ title: external_exports.string().describe("The folder title.").nullable().optional(),
451
+ namespace: external_exports.string().describe("The namespace that owns the folder.").nullable().optional(),
452
+ resourceVersion: external_exports.string().describe("The folder resource version.").nullable().optional(),
453
+ parentUid: external_exports.string().describe("The parent folder UID when the folder is nested.").nullable().optional(),
454
+ raw: external_exports.looseObject({}).describe("The raw Grafana API object.").optional()
455
+ }).describe("A normalized Grafana folder.").optional()
456
+ }).describe("A Grafana folder response.");
457
+ var createFolderInput = external_exports.strictObject({
458
+ title: external_exports.string().min(1).describe("The new folder title."),
459
+ uid: external_exports.string().min(1).describe("Optional explicit Grafana folder UID.").optional(),
460
+ generateName: external_exports.string().min(1).describe("Optional UID prefix Grafana can use to generate a folder UID.").optional(),
461
+ parentUid: external_exports.string().min(1).describe("Optional parent folder UID for a nested folder.").optional(),
462
+ namespace: external_exports.string().min(1).describe("The Grafana API namespace. Use default for the main organization.").optional()
463
+ }).describe("Input for creating a Grafana folder.");
464
+ var createFolderOutput = external_exports.strictObject({
465
+ folder: external_exports.strictObject({
466
+ uid: external_exports.string().describe("The Grafana folder UID.").nullable().optional(),
467
+ title: external_exports.string().describe("The folder title.").nullable().optional(),
468
+ namespace: external_exports.string().describe("The namespace that owns the folder.").nullable().optional(),
469
+ resourceVersion: external_exports.string().describe("The folder resource version.").nullable().optional(),
470
+ parentUid: external_exports.string().describe("The parent folder UID when the folder is nested.").nullable().optional(),
471
+ raw: external_exports.looseObject({}).describe("The raw Grafana API object.").optional()
472
+ }).describe("A normalized Grafana folder.").optional()
473
+ }).describe("The created Grafana folder.");
474
+ var updateFolderInput = external_exports.strictObject({
475
+ uid: external_exports.string().min(1).describe("The Grafana folder UID."),
476
+ title: external_exports.string().min(1).describe("The updated folder title."),
477
+ parentUid: external_exports.string().min(1).describe("Optional parent folder UID for a nested folder.").optional(),
478
+ namespace: external_exports.string().min(1).describe("The Grafana API namespace. Use default for the main organization.").optional(),
479
+ resourceVersion: external_exports.string().min(1).describe("The current Grafana resource version when required by the instance.").optional()
480
+ }).describe("Input for updating a Grafana folder.");
481
+ var updateFolderOutput = external_exports.strictObject({
482
+ folder: external_exports.strictObject({
483
+ uid: external_exports.string().describe("The Grafana folder UID.").nullable().optional(),
484
+ title: external_exports.string().describe("The folder title.").nullable().optional(),
485
+ namespace: external_exports.string().describe("The namespace that owns the folder.").nullable().optional(),
486
+ resourceVersion: external_exports.string().describe("The folder resource version.").nullable().optional(),
487
+ parentUid: external_exports.string().describe("The parent folder UID when the folder is nested.").nullable().optional(),
488
+ raw: external_exports.looseObject({}).describe("The raw Grafana API object.").optional()
489
+ }).describe("A normalized Grafana folder.").optional()
490
+ }).describe("The updated Grafana folder.");
491
+ var deleteFolderInput = external_exports.strictObject({
492
+ uid: external_exports.string().min(1).describe("The Grafana folder UID."),
493
+ namespace: external_exports.string().min(1).describe("The Grafana API namespace. Use default for the main organization.").optional()
494
+ }).describe("Input for deleting a Grafana folder.");
495
+ var deleteFolderOutput = external_exports.strictObject({
496
+ deleted: external_exports.boolean().describe("Whether the connector completed the delete request.").optional(),
497
+ raw: external_exports.looseObject({}).describe("The raw Grafana API object.").nullable().optional()
498
+ }).describe("Grafana folder deletion result.");
499
+ var searchDashboardsInput = external_exports.strictObject({
500
+ query: external_exports.string().min(1).describe("Free-text search query.").optional(),
501
+ tags: external_exports.array(external_exports.string().min(1).describe("A dashboard tag.")).describe("Dashboard tags to search for.").optional(),
502
+ type: external_exports.enum(["dash-db", "dash-folder"]).describe("Restrict results to dashboards or folders.").optional(),
503
+ dashboardUids: external_exports.array(external_exports.string().min(1).describe("A dashboard UID.")).describe("Dashboard UIDs to search for.").optional(),
504
+ folderUids: external_exports.array(external_exports.string().min(1).describe("A folder UID.")).describe("Folder UIDs to search in.").optional(),
505
+ starred: external_exports.boolean().describe("Whether to return only starred dashboards.").optional(),
506
+ limit: external_exports.int().min(1).max(5e3).describe("Maximum number of search results to return.").optional(),
507
+ page: external_exports.int().min(1).describe("Search results page number. Numbering starts at 1.").optional()
508
+ }).describe("Input for searching Grafana folders and dashboards.");
509
+ var searchDashboardsOutput = external_exports.strictObject({
510
+ results: external_exports.array(external_exports.looseObject({
511
+ id: external_exports.int().describe("The numeric Grafana search result ID.").nullable(),
512
+ uid: external_exports.string().describe("The Grafana dashboard or folder UID.").nullable(),
513
+ title: external_exports.string().describe("The search result title.").nullable(),
514
+ type: external_exports.string().describe("The Grafana result type, such as dash-db or dash-folder.").nullable(),
515
+ url: external_exports.string().describe("The Grafana UI path for the result.").nullable(),
516
+ isStarred: external_exports.boolean().describe("Whether the dashboard is starred.").nullable()
517
+ }).describe("A Grafana folder or dashboard search result.")).describe("Search results returned by Grafana.").optional(),
518
+ raw: external_exports.array(external_exports.looseObject({}).describe("The raw Grafana API object.")).describe("Raw Grafana search result objects.").optional()
519
+ }).describe("Grafana folder and dashboard search results.");
520
+ var getDashboardInput = external_exports.strictObject({
521
+ uid: external_exports.string().min(1).describe("The Grafana dashboard UID."),
522
+ namespace: external_exports.string().min(1).describe("The Grafana API namespace. Use default for the main organization.").optional()
523
+ }).describe("Input for retrieving a Grafana dashboard.");
524
+ var getDashboardOutput = external_exports.strictObject({
525
+ dashboard: external_exports.strictObject({
526
+ uid: external_exports.string().describe("The dashboard UID.").nullable().optional(),
527
+ title: external_exports.string().describe("The dashboard title.").nullable().optional(),
528
+ namespace: external_exports.string().describe("The namespace that owns the dashboard.").nullable().optional(),
529
+ resourceVersion: external_exports.string().describe("The dashboard resource version.").nullable().optional(),
530
+ folderUid: external_exports.string().describe("The folder UID that contains the dashboard.").nullable().optional(),
531
+ raw: external_exports.looseObject({}).describe("The raw Grafana API object.").optional()
532
+ }).describe("A normalized Grafana dashboard resource.").optional()
533
+ }).describe("A Grafana dashboard response.");
534
+ var createDashboardInput = external_exports.strictObject({
535
+ uid: external_exports.string().min(1).describe("Optional explicit Grafana dashboard UID.").optional(),
536
+ generateName: external_exports.string().min(1).describe("Optional UID prefix Grafana can use to generate a dashboard UID.").optional(),
537
+ folderUid: external_exports.string().min(1).describe("Optional folder UID for the new dashboard.").optional(),
538
+ spec: external_exports.looseObject({}).describe("The Grafana dashboard spec JSON. This is forwarded to Grafana as the dashboard body."),
539
+ namespace: external_exports.string().min(1).describe("The Grafana API namespace. Use default for the main organization.").optional()
540
+ }).describe("Input for creating a Grafana dashboard.");
541
+ var createDashboardOutput = external_exports.strictObject({
542
+ dashboard: external_exports.strictObject({
543
+ uid: external_exports.string().describe("The dashboard UID.").nullable().optional(),
544
+ title: external_exports.string().describe("The dashboard title.").nullable().optional(),
545
+ namespace: external_exports.string().describe("The namespace that owns the dashboard.").nullable().optional(),
546
+ resourceVersion: external_exports.string().describe("The dashboard resource version.").nullable().optional(),
547
+ folderUid: external_exports.string().describe("The folder UID that contains the dashboard.").nullable().optional(),
548
+ raw: external_exports.looseObject({}).describe("The raw Grafana API object.").optional()
549
+ }).describe("A normalized Grafana dashboard resource.").optional()
550
+ }).describe("The created Grafana dashboard.");
551
+ var updateDashboardInput = external_exports.strictObject({
552
+ uid: external_exports.string().min(1).describe("The Grafana dashboard UID."),
553
+ folderUid: external_exports.string().min(1).describe("Optional folder UID for the dashboard.").optional(),
554
+ spec: external_exports.looseObject({}).describe("The Grafana dashboard spec JSON. This is forwarded to Grafana as the dashboard body."),
555
+ namespace: external_exports.string().min(1).describe("The Grafana API namespace. Use default for the main organization.").optional(),
556
+ resourceVersion: external_exports.string().min(1).describe("The current Grafana resource version when required by the instance.").optional()
557
+ }).describe("Input for updating a Grafana dashboard.");
558
+ var updateDashboardOutput = external_exports.strictObject({
559
+ dashboard: external_exports.strictObject({
560
+ uid: external_exports.string().describe("The dashboard UID.").nullable().optional(),
561
+ title: external_exports.string().describe("The dashboard title.").nullable().optional(),
562
+ namespace: external_exports.string().describe("The namespace that owns the dashboard.").nullable().optional(),
563
+ resourceVersion: external_exports.string().describe("The dashboard resource version.").nullable().optional(),
564
+ folderUid: external_exports.string().describe("The folder UID that contains the dashboard.").nullable().optional(),
565
+ raw: external_exports.looseObject({}).describe("The raw Grafana API object.").optional()
566
+ }).describe("A normalized Grafana dashboard resource.").optional()
567
+ }).describe("The updated Grafana dashboard.");
568
+ var deleteDashboardInput = external_exports.strictObject({
569
+ uid: external_exports.string().min(1).describe("The Grafana dashboard UID."),
570
+ namespace: external_exports.string().min(1).describe("The Grafana API namespace. Use default for the main organization.").optional()
571
+ }).describe("Input for deleting a Grafana dashboard.");
572
+ var deleteDashboardOutput = external_exports.strictObject({
573
+ deleted: external_exports.boolean().describe("Whether the connector completed the delete request.").optional(),
574
+ raw: external_exports.looseObject({}).describe("The raw Grafana API object.").nullable().optional()
575
+ }).describe("Grafana dashboard deletion result.");
576
+ var listDataSourcesInput = external_exports.strictObject({}).describe("No input is required to list Grafana data sources.");
577
+ var listDataSourcesOutput = external_exports.strictObject({
578
+ dataSources: external_exports.array(external_exports.looseObject({
579
+ id: external_exports.int().describe("The numeric Grafana data source ID.").nullable(),
580
+ uid: external_exports.string().describe("The Grafana data source UID.").nullable(),
581
+ name: external_exports.string().describe("The data source name.").nullable(),
582
+ type: external_exports.string().describe("The data source plugin type.").nullable(),
583
+ access: external_exports.string().describe("The data source access mode.").nullable(),
584
+ url: external_exports.string().describe("The data source URL when returned by Grafana.").nullable(),
585
+ isDefault: external_exports.boolean().describe("Whether this data source is the default.").nullable(),
586
+ readOnly: external_exports.boolean().describe("Whether this data source is read-only.").nullable()
587
+ }).describe("A Grafana data source record.")).describe("Data sources returned by Grafana.").optional(),
588
+ raw: external_exports.array(external_exports.looseObject({}).describe("The raw Grafana API object.")).describe("Raw Grafana data source objects.").optional()
589
+ }).describe("Grafana data sources.");
590
+ var getDataSourceInput = external_exports.strictObject({
591
+ uid: external_exports.string().min(1).describe("The Grafana data source UID.").optional()
592
+ }).describe("Input for retrieving a Grafana data source.");
593
+ var getDataSourceOutput = external_exports.strictObject({
594
+ dataSource: external_exports.looseObject({
595
+ id: external_exports.int().describe("The numeric Grafana data source ID.").nullable(),
596
+ uid: external_exports.string().describe("The Grafana data source UID.").nullable(),
597
+ name: external_exports.string().describe("The data source name.").nullable(),
598
+ type: external_exports.string().describe("The data source plugin type.").nullable(),
599
+ access: external_exports.string().describe("The data source access mode.").nullable(),
600
+ url: external_exports.string().describe("The data source URL when returned by Grafana.").nullable(),
601
+ isDefault: external_exports.boolean().describe("Whether this data source is the default.").nullable(),
602
+ readOnly: external_exports.boolean().describe("Whether this data source is read-only.").nullable()
603
+ }).describe("A Grafana data source record.").optional()
604
+ }).describe("A Grafana data source response.");
605
+ var createDataSourceInput = external_exports.strictObject({
606
+ dataSource: external_exports.looseObject({}).describe("The Grafana data source payload. Use official Grafana data source fields such as name, type, access, url, jsonData, and secureJsonData.").optional()
607
+ }).describe("Input for creating a Grafana data source.");
608
+ var createDataSourceOutput = external_exports.strictObject({
609
+ dataSource: external_exports.looseObject({
610
+ id: external_exports.int().describe("The numeric Grafana data source ID.").nullable(),
611
+ uid: external_exports.string().describe("The Grafana data source UID.").nullable(),
612
+ name: external_exports.string().describe("The data source name.").nullable(),
613
+ type: external_exports.string().describe("The data source plugin type.").nullable(),
614
+ access: external_exports.string().describe("The data source access mode.").nullable(),
615
+ url: external_exports.string().describe("The data source URL when returned by Grafana.").nullable(),
616
+ isDefault: external_exports.boolean().describe("Whether this data source is the default.").nullable(),
617
+ readOnly: external_exports.boolean().describe("Whether this data source is read-only.").nullable()
618
+ }).describe("A Grafana data source record.").optional(),
619
+ raw: external_exports.looseObject({}).describe("The raw Grafana API object.").optional()
620
+ }).describe("The created Grafana data source result.");
621
+ var updateDataSourceInput = external_exports.strictObject({
622
+ uid: external_exports.string().min(1).describe("The Grafana data source UID.").optional(),
623
+ dataSource: external_exports.looseObject({}).describe("The Grafana data source payload. Use official Grafana data source fields such as name, type, access, url, jsonData, and secureJsonData.").optional()
624
+ }).describe("Input for updating a Grafana data source.");
625
+ var updateDataSourceOutput = external_exports.strictObject({
626
+ dataSource: external_exports.looseObject({
627
+ id: external_exports.int().describe("The numeric Grafana data source ID.").nullable(),
628
+ uid: external_exports.string().describe("The Grafana data source UID.").nullable(),
629
+ name: external_exports.string().describe("The data source name.").nullable(),
630
+ type: external_exports.string().describe("The data source plugin type.").nullable(),
631
+ access: external_exports.string().describe("The data source access mode.").nullable(),
632
+ url: external_exports.string().describe("The data source URL when returned by Grafana.").nullable(),
633
+ isDefault: external_exports.boolean().describe("Whether this data source is the default.").nullable(),
634
+ readOnly: external_exports.boolean().describe("Whether this data source is read-only.").nullable()
635
+ }).describe("A Grafana data source record.").optional(),
636
+ raw: external_exports.looseObject({}).describe("The raw Grafana API object.").optional()
637
+ }).describe("The updated Grafana data source result.");
638
+ var deleteDataSourceInput = external_exports.strictObject({
639
+ uid: external_exports.string().min(1).describe("The Grafana data source UID.").optional()
640
+ }).describe("Input for deleting a Grafana data source.");
641
+ var deleteDataSourceOutput = external_exports.strictObject({
642
+ deleted: external_exports.boolean().describe("Whether the connector completed the delete request.").optional(),
643
+ raw: external_exports.looseObject({}).describe("The raw Grafana API object.").nullable().optional()
644
+ }).describe("Grafana data source deletion result.");
645
+ var listAlertRulesInput = external_exports.strictObject({}).describe("No input is required to list Grafana alert rules.");
646
+ var listAlertRulesOutput = external_exports.strictObject({
647
+ alertRules: external_exports.array(external_exports.looseObject({}).describe("A Grafana-managed alert rule.")).describe("Alert rules returned by Grafana.").optional()
648
+ }).describe("Grafana-managed alert rules.");
649
+ var getAlertRuleInput = external_exports.strictObject({
650
+ uid: external_exports.string().min(1).describe("The Grafana alert rule UID.")
651
+ }).describe("Input for retrieving a Grafana alert rule.");
652
+ var getAlertRuleOutput = external_exports.strictObject({
653
+ alertRule: external_exports.looseObject({}).describe("A Grafana-managed alert rule.").optional()
654
+ }).describe("A Grafana-managed alert rule.");
655
+ var listAlertInstancesInput = external_exports.strictObject({
656
+ active: external_exports.boolean().describe("Include active (firing) alert instances.").optional(),
657
+ silenced: external_exports.boolean().describe("Include silenced alert instances.").optional(),
658
+ inhibited: external_exports.boolean().describe("Include inhibited alert instances.").optional()
659
+ }).describe("Input for listing Grafana alert instances.");
660
+ var listAlertInstancesOutput = external_exports.strictObject({
661
+ alertInstances: external_exports.array(external_exports.looseObject({}).describe("A firing or pending Grafana alert instance.")).describe("Alert instances returned by Grafana.").optional()
662
+ }).describe("Grafana alert instances.");
663
+ var listContactPointsInput = external_exports.strictObject({}).describe("No input is required to list Grafana contact points.");
664
+ var listContactPointsOutput = external_exports.strictObject({
665
+ contactPoints: external_exports.array(external_exports.looseObject({}).describe("A Grafana notification contact point.")).describe("Contact points returned by Grafana.").optional()
666
+ }).describe("Grafana notification contact points.");
667
+ var grafanaActions = {
668
+ list_folders: {
669
+ description: "List Grafana folders in a namespace with optional pagination.",
670
+ effect: "read",
671
+ inputSchema: listFoldersInput,
672
+ outputSchema: external_exports.toJSONSchema(listFoldersOutput, { io: "output", unrepresentable: "any" })
673
+ },
674
+ get_folder: {
675
+ description: "Retrieve one Grafana folder by UID.",
676
+ effect: "read",
677
+ inputSchema: getFolderInput,
678
+ outputSchema: external_exports.toJSONSchema(getFolderOutput, { io: "output", unrepresentable: "any" })
679
+ },
680
+ create_folder: {
681
+ description: "Create a Grafana folder in a namespace.",
682
+ effect: "write",
683
+ inputSchema: createFolderInput,
684
+ outputSchema: external_exports.toJSONSchema(createFolderOutput, { io: "output", unrepresentable: "any" })
685
+ },
686
+ update_folder: {
687
+ description: "Update the title or parent folder for a Grafana folder.",
688
+ effect: "write",
689
+ inputSchema: updateFolderInput,
690
+ outputSchema: external_exports.toJSONSchema(updateFolderOutput, { io: "output", unrepresentable: "any" })
691
+ },
692
+ delete_folder: {
693
+ description: "Delete a Grafana folder by UID.",
694
+ effect: "destructive",
695
+ inputSchema: deleteFolderInput,
696
+ outputSchema: external_exports.toJSONSchema(deleteFolderOutput, { io: "output", unrepresentable: "any" })
697
+ },
698
+ search_dashboards: {
699
+ description: "Search Grafana folders and dashboards by query, tags, type, folder, and pagination.",
700
+ effect: "read",
701
+ inputSchema: searchDashboardsInput,
702
+ outputSchema: external_exports.toJSONSchema(searchDashboardsOutput, { io: "output", unrepresentable: "any" })
703
+ },
704
+ get_dashboard: {
705
+ description: "Retrieve one Grafana dashboard resource by UID.",
706
+ effect: "read",
707
+ inputSchema: getDashboardInput,
708
+ outputSchema: external_exports.toJSONSchema(getDashboardOutput, { io: "output", unrepresentable: "any" })
709
+ },
710
+ create_dashboard: {
711
+ description: "Create a Grafana dashboard resource in a namespace.",
712
+ effect: "write",
713
+ inputSchema: createDashboardInput,
714
+ outputSchema: external_exports.toJSONSchema(createDashboardOutput, { io: "output", unrepresentable: "any" })
715
+ },
716
+ update_dashboard: {
717
+ description: "Replace a Grafana dashboard resource by UID.",
718
+ effect: "write",
719
+ inputSchema: updateDashboardInput,
720
+ outputSchema: external_exports.toJSONSchema(updateDashboardOutput, { io: "output", unrepresentable: "any" })
721
+ },
722
+ delete_dashboard: {
723
+ description: "Delete a Grafana dashboard resource by UID.",
724
+ effect: "destructive",
725
+ inputSchema: deleteDashboardInput,
726
+ outputSchema: external_exports.toJSONSchema(deleteDashboardOutput, { io: "output", unrepresentable: "any" })
727
+ },
728
+ list_data_sources: {
729
+ description: "List Grafana data sources available to the service account token.",
730
+ effect: "read",
731
+ inputSchema: listDataSourcesInput,
732
+ outputSchema: external_exports.toJSONSchema(listDataSourcesOutput, { io: "output", unrepresentable: "any" })
733
+ },
734
+ get_data_source: {
735
+ description: "Retrieve one Grafana data source by UID.",
736
+ effect: "read",
737
+ inputSchema: getDataSourceInput,
738
+ outputSchema: external_exports.toJSONSchema(getDataSourceOutput, { io: "output", unrepresentable: "any" })
739
+ },
740
+ create_data_source: {
741
+ description: "Create a Grafana data source using a JSON payload accepted by Grafana.",
742
+ effect: "write",
743
+ inputSchema: createDataSourceInput,
744
+ outputSchema: external_exports.toJSONSchema(createDataSourceOutput, { io: "output", unrepresentable: "any" })
745
+ },
746
+ update_data_source: {
747
+ description: "Update a Grafana data source by UID using fields accepted by Grafana.",
748
+ effect: "write",
749
+ inputSchema: updateDataSourceInput,
750
+ outputSchema: external_exports.toJSONSchema(updateDataSourceOutput, { io: "output", unrepresentable: "any" })
751
+ },
752
+ delete_data_source: {
753
+ description: "Delete a Grafana data source by UID.",
754
+ effect: "destructive",
755
+ inputSchema: deleteDataSourceInput,
756
+ outputSchema: external_exports.toJSONSchema(deleteDataSourceOutput, { io: "output", unrepresentable: "any" })
757
+ },
758
+ list_alert_rules: {
759
+ description: "List all Grafana-managed alert rules via the provisioning API.",
760
+ effect: "read",
761
+ inputSchema: listAlertRulesInput,
762
+ outputSchema: external_exports.toJSONSchema(listAlertRulesOutput, { io: "output", unrepresentable: "any" })
763
+ },
764
+ get_alert_rule: {
765
+ description: "Retrieve one Grafana-managed alert rule by UID via the provisioning API.",
766
+ effect: "read",
767
+ inputSchema: getAlertRuleInput,
768
+ outputSchema: external_exports.toJSONSchema(getAlertRuleOutput, { io: "output", unrepresentable: "any" })
769
+ },
770
+ list_alert_instances: {
771
+ description: "List currently firing or pending Grafana alert instances from the built-in Alertmanager.",
772
+ effect: "read",
773
+ inputSchema: listAlertInstancesInput,
774
+ outputSchema: external_exports.toJSONSchema(listAlertInstancesOutput, { io: "output", unrepresentable: "any" })
775
+ },
776
+ list_contact_points: {
777
+ description: "List Grafana notification contact points via the provisioning API.",
778
+ effect: "read",
779
+ inputSchema: listContactPointsInput,
780
+ outputSchema: external_exports.toJSONSchema(listContactPointsOutput, { io: "output", unrepresentable: "any" })
781
+ }
782
+ };
783
+
784
+ // ../plugins/src/grafana/index.ts
785
+ function createGrafanaPlugin() {
786
+ return createProviderPlugin({
787
+ description: "Grafana",
788
+ actions: grafanaActions,
789
+ credentialProbe: "search_dashboards",
790
+ handlers: {
791
+ list_folders: listFolders,
792
+ get_folder: getFolder,
793
+ create_folder: createFolder,
794
+ update_folder: updateFolder,
795
+ delete_folder: deleteFolder,
796
+ search_dashboards: searchDashboards,
797
+ get_dashboard: getDashboard,
798
+ create_dashboard: createDashboard,
799
+ update_dashboard: updateDashboard,
800
+ delete_dashboard: deleteDashboard,
801
+ list_data_sources: listDataSources,
802
+ get_data_source: getDataSource,
803
+ create_data_source: createDataSource,
804
+ update_data_source: updateDataSource,
805
+ delete_data_source: deleteDataSource,
806
+ list_alert_rules: listAlertRules,
807
+ get_alert_rule: getAlertRule,
808
+ list_alert_instances: listAlertInstances,
809
+ list_contact_points: listContactPoints
810
+ }
811
+ });
812
+ }
813
+ var grafana_default = createGrafanaPlugin();
814
+ export {
815
+ createGrafanaPlugin,
816
+ grafana_default as default
817
+ };