@piwitests/server 0.17.0 → 0.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{BcLXUmKT.js → 36cXPVrY.js} +1 -1
  3. package/.output/public/_nuxt/{CMB-NkFa.js → 87SGk1nu.js} +1 -1
  4. package/.output/public/_nuxt/{CWmQcueG.js → AjuKBlzz.js} +1 -1
  5. package/.output/public/_nuxt/{DAeYmPfX.js → B1CB30tg.js} +1 -1
  6. package/.output/public/_nuxt/{BU6xjw05.js → B6IHiVa1.js} +1 -1
  7. package/.output/public/_nuxt/{z7PmsnBG.js → B6rt3IcG.js} +1 -1
  8. package/.output/public/_nuxt/{BDcIWTTq.js → BAaSmp8J.js} +1 -1
  9. package/.output/public/_nuxt/{rw7Hdll3.js → BAkJhSAW.js} +1 -1
  10. package/.output/public/_nuxt/{L6HlmmEa.js → BCArQk0c.js} +1 -1
  11. package/.output/public/_nuxt/{D811X8KM.js → BEB2Mv6B.js} +1 -1
  12. package/.output/public/_nuxt/BFjmLXYo.js +8 -0
  13. package/.output/public/_nuxt/{CbuWynGG.js → BJltXwHg.js} +1 -1
  14. package/.output/public/_nuxt/{Dn6cGVYB.js → BKaU95es.js} +1 -1
  15. package/.output/public/_nuxt/{CHHqhAsw.js → BReNbog6.js} +1 -1
  16. package/.output/public/_nuxt/{yZ4LuI9d.js → BTYiG93l.js} +1 -1
  17. package/.output/public/_nuxt/{D7P0ML0H.js → BUMZHDRC.js} +1 -1
  18. package/.output/public/_nuxt/{US3YSX4T.js → BVDBIVAQ.js} +1 -1
  19. package/.output/public/_nuxt/{BgDEjrcz.js → B_aSGB8S.js} +1 -1
  20. package/.output/public/_nuxt/{Ce3tBrN7.js → BaDv5D7A.js} +1 -1
  21. package/.output/public/_nuxt/{BWFY2RuU.js → BdHdHyop.js} +1 -1
  22. package/.output/public/_nuxt/{jlBi8Byu.js → BfoG8R5a.js} +1 -1
  23. package/.output/public/_nuxt/{3QTvYrZp.js → Bi3i470l.js} +1 -1
  24. package/.output/public/_nuxt/Bi9DO8jm.js +1 -0
  25. package/.output/public/_nuxt/{PxPbRVF-.js → BiX7c2qU.js} +1 -1
  26. package/.output/public/_nuxt/{DwZiG9xH.js → BoC6qaRF.js} +4 -4
  27. package/.output/public/_nuxt/{C7nwFokE.js → BsDB_eCd.js} +1 -1
  28. package/.output/public/_nuxt/{cBj9fai9.js → BuuvTH9e.js} +1 -1
  29. package/.output/public/_nuxt/{DvC5Adg1.js → C11lmBd4.js} +1 -1
  30. package/.output/public/_nuxt/{Dx1oCMgy.js → C4AfzZER.js} +1 -1
  31. package/.output/public/_nuxt/{CYuWAvXE.js → C7ZVzS0K.js} +1 -1
  32. package/.output/public/_nuxt/{B6hPf4UR.js → C8cz5feG.js} +1 -1
  33. package/.output/public/_nuxt/{DjRhouSr.js → C9EpbPNU.js} +1 -1
  34. package/.output/public/_nuxt/{HCK35QD8.js → C9ahP7km.js} +1 -1
  35. package/.output/public/_nuxt/{8jZmK2De.js → CBEM3L1q.js} +1 -1
  36. package/.output/public/_nuxt/{sMFaPAAR.js → CCsl9MOZ.js} +1 -1
  37. package/.output/public/_nuxt/{DTH2lteW.js → CCw3Tx4S.js} +1 -1
  38. package/.output/public/_nuxt/{99tAfVF5.js → CGq9qR-0.js} +1 -1
  39. package/.output/public/_nuxt/{Dym66h3p.js → CLdGRzLL.js} +1 -1
  40. package/.output/public/_nuxt/{BRdhP5lm.js → CP0vUzbd.js} +1 -1
  41. package/.output/public/_nuxt/{D_TbJDHY.js → CPZ5wygb.js} +1 -1
  42. package/.output/public/_nuxt/{Bua_L6p4.js → CRcjGmf7.js} +1 -1
  43. package/.output/public/_nuxt/{DS9yGVFL.js → CRpbGS75.js} +1 -1
  44. package/.output/public/_nuxt/{DDPptydi.js → CTgM5Fke.js} +1 -1
  45. package/.output/public/_nuxt/{D_A6axXa.js → CU3W9YrI.js} +1 -1
  46. package/.output/public/_nuxt/{BwKwWgQe.js → CUDeMcEK.js} +1 -1
  47. package/.output/public/_nuxt/{DFM2jv9I.js → CYIR2GbL.js} +1 -1
  48. package/.output/public/_nuxt/{B1CUXGbl.js → Ccit_CX1.js} +1 -1
  49. package/.output/public/_nuxt/CiPH-swI.js +1 -0
  50. package/.output/public/_nuxt/{DRTxhZBV.js → ClIKZ4qY.js} +1 -1
  51. package/.output/public/_nuxt/{DvXvJzFP.js → ClVRQpP_.js} +1 -1
  52. package/.output/public/_nuxt/{CvtYJHkY.js → CmbjAoQu.js} +1 -1
  53. package/.output/public/_nuxt/Cx65B3c3.js +1 -0
  54. package/.output/public/_nuxt/{Cz2HhsB6.js → D1ttGJfs.js} +1 -1
  55. package/.output/public/_nuxt/{DtXREpk_.js → D3MWm6JP.js} +1 -1
  56. package/.output/public/_nuxt/{BrT_Sys2.js → D3SYPlEB.js} +28 -28
  57. package/.output/public/_nuxt/{Cf4h8qty.js → D4SFgXAf.js} +1 -1
  58. package/.output/public/_nuxt/{DCffDvxl.js → D51_cB9D.js} +1 -1
  59. package/.output/public/_nuxt/{QFMx1VKs.js → D8YZvjas.js} +1 -1
  60. package/.output/public/_nuxt/{BE8ykmwr.js → DB3ljns7.js} +1 -1
  61. package/.output/public/_nuxt/{CSAmL8XJ.js → DC51KKt4.js} +1 -1
  62. package/.output/public/_nuxt/{3QTorEhJ.js → DCMFuzDI.js} +1 -1
  63. package/.output/public/_nuxt/{CNULGfLp.js → DIA_NAIv.js} +1 -1
  64. package/.output/public/_nuxt/{COVRAesU.js → DM_YaJgJ.js} +1 -1
  65. package/.output/public/_nuxt/{DJHNEqb7.js → DOr_4nln.js} +2 -2
  66. package/.output/public/_nuxt/{BGZQONfm.js → DRE6Aqqp.js} +1 -1
  67. package/.output/public/_nuxt/{DPSOtRoz.js → DVgMaBxD.js} +1 -1
  68. package/.output/public/_nuxt/{Sgf5OLhm.js → DaewB_zT.js} +1 -1
  69. package/.output/public/_nuxt/{ClJkng9p.js → Db_-yjYg.js} +1 -1
  70. package/.output/public/_nuxt/{DxQq_L07.js → Dbg8z684.js} +1 -1
  71. package/.output/public/_nuxt/{qYFZH4Z8.js → DcfRfTaA.js} +1 -1
  72. package/.output/public/_nuxt/{csqspBeX.js → Dm1_3W9g.js} +1 -1
  73. package/.output/public/_nuxt/{Dz3Wbekz.js → DnThe2U0.js} +1 -1
  74. package/.output/public/_nuxt/{D0-HTQTD.js → Do6zIWQf.js} +1 -1
  75. package/.output/public/_nuxt/{CoKEjZX7.js → DoFSKAvY.js} +1 -1
  76. package/.output/public/_nuxt/{Bpha13F_.js → DoYgYLOd.js} +1 -1
  77. package/.output/public/_nuxt/{Dvc1aWpA.js → Doul3p1_.js} +1 -1
  78. package/.output/public/_nuxt/{Ba4_ydKG.js → DraETso1.js} +1 -1
  79. package/.output/public/_nuxt/{CxLN5Tmq.js → Dwp3GkV-.js} +1 -1
  80. package/.output/public/_nuxt/{-9tk1FrT.js → Dy4TloG3.js} +1 -1
  81. package/.output/public/_nuxt/{DT5rhzhJ.js → EltzgiyS.js} +1 -1
  82. package/.output/public/_nuxt/{D13ybpY3.js → HTQtMbWb.js} +1 -1
  83. package/.output/public/_nuxt/{Wfk1m0ni.js → KYucVFu7.js} +1 -1
  84. package/.output/public/_nuxt/TBDx0s9p.js +3 -0
  85. package/.output/public/_nuxt/{Bq0PQfQY.js → Tt5LX5Y-.js} +1 -1
  86. package/.output/public/_nuxt/{BxRsAYRS.js → Vnfkr1pJ.js} +1 -1
  87. package/.output/public/_nuxt/{Df3QtbpW.js → WAaPPk0g.js} +2 -2
  88. package/.output/public/_nuxt/builds/latest.json +1 -1
  89. package/.output/public/_nuxt/builds/meta/2f517ae9-c342-457e-b4c5-6301728179f5.json +1 -0
  90. package/.output/public/_nuxt/{CHIbdzqp.js → empGC_x-.js} +1 -1
  91. package/.output/public/_nuxt/entry.ChQMshd4.css +1 -0
  92. package/.output/public/_nuxt/{BciovqwK.js → l0QnzFNM.js} +1 -1
  93. package/.output/public/_nuxt/{73aPL7Ir.js → lowCGL2S.js} +1 -1
  94. package/.output/public/_nuxt/{B6w76fJT.js → mlAADjK3.js} +1 -1
  95. package/.output/public/_nuxt/{Ds2Y3oms.js → n-QWmQgc.js} +1 -1
  96. package/.output/public/_nuxt/{DpJrGwCr.js → oFIS9u6t.js} +1 -1
  97. package/.output/public/_nuxt/{BEsJE07U.js → oWY3I9uX.js} +1 -1
  98. package/.output/public/_nuxt/{lCkcEykv.js → q0DPzLKN.js} +1 -1
  99. package/.output/public/_nuxt/{r9WApUfF.js → quV6tp4n.js} +1 -1
  100. package/.output/public/_nuxt/{8xyZSRSO.js → riEUDnED.js} +1 -1
  101. package/.output/public/_nuxt/{ByoIgYX_.js → rm7OkgDG.js} +1 -1
  102. package/.output/public/_nuxt/uaqMzXqE.js +5 -0
  103. package/.output/public/_nuxt/{vzXhOO8R.js → va1mwSm9.js} +1 -1
  104. package/.output/public/_nuxt/{BoRJdCd4.js → wGpfdK6o.js} +1 -1
  105. package/.output/public/_nuxt/{za5M7BGh.js → wQZj69OY.js} +1 -1
  106. package/.output/public/_nuxt/wgcgHmRR.js +1 -0
  107. package/.output/public/sw.js +1 -1
  108. package/.output/server/chunks/build/{about-TuEZ9n1Q.mjs → about-CoJjvUwM.mjs} +119 -11
  109. package/.output/server/chunks/build/about-CoJjvUwM.mjs.map +1 -0
  110. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  111. package/.output/server/chunks/build/{docs-EXhN3sqC.mjs → docs-BN_x1OW3.mjs} +50 -6
  112. package/.output/server/chunks/build/{docs-EXhN3sqC.mjs.map → docs-BN_x1OW3.mjs.map} +1 -1
  113. package/.output/server/chunks/build/{mcp-CQ-21rwc.mjs → mcp-_o6cMS6m.mjs} +307 -225
  114. package/.output/server/chunks/build/mcp-_o6cMS6m.mjs.map +1 -0
  115. package/.output/server/chunks/build/server.mjs +3 -3
  116. package/.output/server/chunks/build/useTauri-lRT8zkLv.mjs +7 -0
  117. package/.output/server/chunks/build/useTauri-lRT8zkLv.mjs.map +1 -0
  118. package/.output/server/chunks/nitro/nitro.mjs +683 -690
  119. package/.output/server/package.json +1 -1
  120. package/package.json +1 -1
  121. package/.output/public/_nuxt/26ll_vBr.js +0 -1
  122. package/.output/public/_nuxt/B_QIrc7l.js +0 -1
  123. package/.output/public/_nuxt/CEuVRSr0.js +0 -3
  124. package/.output/public/_nuxt/Cl96oI21.js +0 -5
  125. package/.output/public/_nuxt/DATh_1DQ.js +0 -1
  126. package/.output/public/_nuxt/DUe6xuKQ.js +0 -1
  127. package/.output/public/_nuxt/DqsMiUoW.js +0 -2
  128. package/.output/public/_nuxt/Ds4Lb1vi.js +0 -7
  129. package/.output/public/_nuxt/builds/meta/05a2dd95-d1c1-4e3a-8625-ac6bfea83837.json +0 -1
  130. package/.output/public/_nuxt/entry.BaIGwMjT.css +0 -1
  131. package/.output/server/chunks/build/DesktopMcpCard-B4JuUTKj.mjs +0 -122
  132. package/.output/server/chunks/build/DesktopMcpCard-B4JuUTKj.mjs.map +0 -1
  133. package/.output/server/chunks/build/about-TuEZ9n1Q.mjs.map +0 -1
  134. package/.output/server/chunks/build/mcp-CQ-21rwc.mjs.map +0 -1
@@ -1,17 +1,16 @@
1
1
  import { _ as _sfc_main$1, a as _sfc_main$4 } from './DashboardNavbar-Bdp-OwTN.mjs';
2
2
  import { _ as _sfc_main$2 } from './Alert-Bp1Wz_sq.mjs';
3
- import { _ as __nuxt_component_5 } from './DesktopMcpCard-B4JuUTKj.mjs';
4
3
  import { _ as __nuxt_component_11 } from './SectionCard-COd9TuDq.mjs';
5
- import { l as useHead, o as _sfc_main$p, m as _sfc_main$k, r as useRuntimeConfig, L as useRequestEvent } from './server.mjs';
4
+ import { l as useHead, m as _sfc_main$k, o as _sfc_main$p, r as useRuntimeConfig, L as useRequestEvent } from './server.mjs';
6
5
  import { _ as _sfc_main$3 } from './Tabs-BV9XqjoO.mjs';
7
- import { _ as __nuxt_component_5$1 } from './CodeBlock-BGwNmJ8J.mjs';
8
- import { defineComponent, withAsyncContext, computed, withCtx, unref, createVNode, openBlock, createBlock, Fragment, renderList, toDisplayString, createTextVNode, createCommentVNode, useSSRContext } from 'vue';
9
- import { ssrRenderComponent, ssrRenderList, ssrInterpolate } from 'vue/server-renderer';
6
+ import { _ as __nuxt_component_5 } from './CodeBlock-BGwNmJ8J.mjs';
7
+ import { defineComponent, withAsyncContext, computed, withCtx, unref, createVNode, createTextVNode, openBlock, createBlock, toDisplayString, createCommentVNode, Fragment, renderList, useSSRContext } from 'vue';
8
+ import { ssrRenderComponent, ssrInterpolate, ssrRenderList } from 'vue/server-renderer';
10
9
  import { df as MCP_TOOL_DEFS, dg as getRequestURL } from '../nitro/nitro.mjs';
11
10
  import { u as useIsDesktop } from './useIsDesktop-BS13spVj.mjs';
11
+ import { u as useCopy } from './useCopy-BQQKcwlq.mjs';
12
12
  import { u as useFetch } from './fetch-8kznMtBM.mjs';
13
13
  import './DashboardSidebarToggle-Ji6ADuqF.mjs';
14
- import './useCopy-BQQKcwlq.mjs';
15
14
  import './Card-BQP_oZkQ.mjs';
16
15
  import './HelpHint-YEMWtKu1.mjs';
17
16
  import './help-content-DmFnuhNu.mjs';
@@ -74,6 +73,7 @@ function useRequestURL(opts) {
74
73
  return getRequestURL(useRequestEvent(), opts);
75
74
  }
76
75
  }
76
+ const apiKeyPlaceholder = "pd_YOUR_API_KEY";
77
77
  const _sfc_main = /* @__PURE__ */ defineComponent({
78
78
  __name: "mcp",
79
79
  __ssrInlineRender: true,
@@ -82,15 +82,20 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
82
82
  const config = useRuntimeConfig();
83
83
  const isDemo = config.public.demoMode;
84
84
  const isDesktop = useIsDesktop();
85
+ const { copy } = useCopy();
85
86
  const { data: reporterConfig } = ([__temp, __restore] = withAsyncContext(() => useFetch(
86
87
  "/api/desktop/reporter-config",
87
- { immediate: isDesktop, default: () => null },
88
+ {
89
+ immediate: isDesktop,
90
+ default: () => null
91
+ },
88
92
  "$fdl6kilREP"
89
93
  /* nuxt-injected */
90
94
  )), __temp = await __temp, __restore(), __temp);
95
+ const bearerToken = computed(() => reporterConfig.value?.token ?? apiKeyPlaceholder);
91
96
  const requestUrl = useRequestURL();
92
97
  const mcpUrl = computed(() => {
93
- const base = config.public.siteUrl || requestUrl.origin;
98
+ const base = reporterConfig.value?.url ?? config.public.siteUrl ?? requestUrl.origin;
94
99
  return `${base}/mcp`;
95
100
  });
96
101
  useHead({ title: "MCP server — Piwi Dashboard" });
@@ -105,7 +110,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
105
110
  ];
106
111
  const claudeCodeSnippet = computed(
107
112
  () => `claude mcp add --transport http piwi ${mcpUrl.value} \\
108
- --header "Authorization: Bearer pd_YOUR_API_KEY"`
113
+ --header "Authorization: Bearer ${bearerToken.value}"`
109
114
  );
110
115
  const cursorSnippet = computed(
111
116
  () => JSON.stringify(
@@ -113,7 +118,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
113
118
  mcpServers: {
114
119
  piwi: {
115
120
  url: mcpUrl.value,
116
- headers: { Authorization: "Bearer pd_YOUR_API_KEY" }
121
+ headers: { Authorization: `Bearer ${bearerToken.value}` }
117
122
  }
118
123
  }
119
124
  },
@@ -128,7 +133,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
128
133
  piwi: {
129
134
  type: "http",
130
135
  url: mcpUrl.value,
131
- headers: { Authorization: "Bearer pd_YOUR_API_KEY" }
136
+ headers: { Authorization: `Bearer ${bearerToken.value}` }
132
137
  }
133
138
  }
134
139
  },
@@ -143,7 +148,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
143
148
  piwi: {
144
149
  type: "http",
145
150
  url: mcpUrl.value,
146
- headers: { Authorization: "Bearer pd_YOUR_API_KEY" }
151
+ headers: { Authorization: `Bearer ${bearerToken.value}` }
147
152
  }
148
153
  }
149
154
  },
@@ -153,7 +158,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
153
158
  );
154
159
  const geminiSnippet = computed(
155
160
  () => `gemini mcp add --transport http piwi ${mcpUrl.value} \\
156
- --header "Authorization: Bearer pd_YOUR_API_KEY"`
161
+ --header "Authorization: Bearer ${bearerToken.value}"`
157
162
  );
158
163
  const windsurfSnippet = computed(
159
164
  () => JSON.stringify(
@@ -161,7 +166,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
161
166
  mcpServers: {
162
167
  piwi: {
163
168
  serverUrl: mcpUrl.value,
164
- headers: { Authorization: "Bearer pd_YOUR_API_KEY" }
169
+ headers: { Authorization: `Bearer ${bearerToken.value}` }
165
170
  }
166
171
  }
167
172
  },
@@ -173,12 +178,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
173
178
  const _component_UDashboardPanel = _sfc_main$1;
174
179
  const _component_UDashboardNavbar = _sfc_main$4;
175
180
  const _component_UAlert = _sfc_main$2;
176
- const _component_DesktopMcpCard = __nuxt_component_5;
177
181
  const _component_SectionCard = __nuxt_component_11;
178
- const _component_UIcon = _sfc_main$p;
179
- const _component_UTabs = _sfc_main$3;
180
- const _component_CodeBlock = __nuxt_component_5$1;
181
182
  const _component_UButton = _sfc_main$k;
183
+ const _component_UTabs = _sfc_main$3;
184
+ const _component_CodeBlock = __nuxt_component_5;
185
+ const _component_UIcon = _sfc_main$p;
182
186
  _push(ssrRenderComponent(_component_UDashboardPanel, _attrs, {
183
187
  header: withCtx((_, _push2, _parent2, _scopeId) => {
184
188
  if (_push2) {
@@ -202,116 +206,6 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
202
206
  } else {
203
207
  _push2(`<!---->`);
204
208
  }
205
- if (unref(reporterConfig)) {
206
- _push2(ssrRenderComponent(_component_DesktopMcpCard, {
207
- url: unref(reporterConfig).url,
208
- token: unref(reporterConfig).token
209
- }, null, _parent2, _scopeId));
210
- } else {
211
- _push2(`<!---->`);
212
- }
213
- _push2(ssrRenderComponent(_component_SectionCard, {
214
- icon: "i-lucide-bot",
215
- title: "What it provides",
216
- help: "mcp.tools"
217
- }, {
218
- default: withCtx((_2, _push3, _parent3, _scopeId2) => {
219
- if (_push3) {
220
- _push3(`<div class="flex flex-col gap-1.5"${_scopeId2}><!--[-->`);
221
- ssrRenderList(unref(tools), (t) => {
222
- _push3(`<div class="flex items-start gap-3 px-3 py-2.5 rounded-md bg-elevated/50 border border-default hover:bg-elevated transition-colors"${_scopeId2}>`);
223
- _push3(ssrRenderComponent(_component_UIcon, {
224
- name: "i-lucide-wrench",
225
- class: "size-4 mt-0.5 shrink-0 text-primary"
226
- }, null, _parent3, _scopeId2));
227
- _push3(`<div class="min-w-0"${_scopeId2}><p class="text-sm font-mono font-semibold text-foreground"${_scopeId2}>${ssrInterpolate(t.name)}</p><p class="text-xs text-gray-500 dark:text-gray-400 mt-0.5"${_scopeId2}>${ssrInterpolate(t.description)}</p></div></div>`);
228
- });
229
- _push3(`<!--]--></div>`);
230
- } else {
231
- return [
232
- createVNode("div", { class: "flex flex-col gap-1.5" }, [
233
- (openBlock(true), createBlock(Fragment, null, renderList(unref(tools), (t) => {
234
- return openBlock(), createBlock("div", {
235
- key: t.name,
236
- class: "flex items-start gap-3 px-3 py-2.5 rounded-md bg-elevated/50 border border-default hover:bg-elevated transition-colors"
237
- }, [
238
- createVNode(_component_UIcon, {
239
- name: "i-lucide-wrench",
240
- class: "size-4 mt-0.5 shrink-0 text-primary"
241
- }),
242
- createVNode("div", { class: "min-w-0" }, [
243
- createVNode("p", { class: "text-sm font-mono font-semibold text-foreground" }, toDisplayString(t.name), 1),
244
- createVNode("p", { class: "text-xs text-gray-500 dark:text-gray-400 mt-0.5" }, toDisplayString(t.description), 1)
245
- ])
246
- ]);
247
- }), 128))
248
- ])
249
- ];
250
- }
251
- }),
252
- _: 1
253
- }, _parent2, _scopeId));
254
- _push2(ssrRenderComponent(_component_SectionCard, {
255
- icon: "i-lucide-key",
256
- title: "Authentication",
257
- help: "mcp.auth"
258
- }, {
259
- default: withCtx((_2, _push3, _parent3, _scopeId2) => {
260
- if (_push3) {
261
- _push3(`<div class="space-y-3 text-sm text-gray-600 dark:text-gray-400"${_scopeId2}><p${_scopeId2}> MCP requests are authenticated with the same API keys used by the REST API. API keys start with <code class="px-1 py-0.5 bg-muted rounded text-xs font-mono"${_scopeId2}>pd_</code>. </p>`);
262
- if (!unref(isDesktop)) {
263
- _push3(`<p${_scopeId2}> Generate a key in <strong${_scopeId2}>Settings → Users → [your account] → API keys</strong>, then replace <code class="px-1 py-0.5 bg-muted rounded text-xs font-mono"${_scopeId2}>pd_YOUR_API_KEY</code> in the snippets below. </p>`);
264
- } else {
265
- _push3(`<p${_scopeId2}> This app provides a local access token automatically — see <strong${_scopeId2}>Connect an AI assistant (MCP)</strong> above. Use it wherever the snippets show <code class="px-1 py-0.5 bg-muted rounded text-xs font-mono"${_scopeId2}>pd_YOUR_API_KEY</code>. </p>`);
266
- }
267
- if (!unref(isDesktop)) {
268
- _push3(`<p class="text-xs text-gray-400"${_scopeId2}> When authentication is disabled (<code class="font-mono"${_scopeId2}>PIWI_AUTH_ENABLED</code> not set), any request is accepted without a key. </p>`);
269
- } else {
270
- _push3(`<p class="text-xs text-gray-400"${_scopeId2}> This desktop app keeps sign-in off but still requires its own local access token on every request — use the token shown above as the <code class="font-mono"${_scopeId2}>Bearer</code> value. The endpoint is not open. </p>`);
271
- }
272
- _push3(`</div>`);
273
- } else {
274
- return [
275
- createVNode("div", { class: "space-y-3 text-sm text-gray-600 dark:text-gray-400" }, [
276
- createVNode("p", null, [
277
- createTextVNode(" MCP requests are authenticated with the same API keys used by the REST API. API keys start with "),
278
- createVNode("code", { class: "px-1 py-0.5 bg-muted rounded text-xs font-mono" }, "pd_"),
279
- createTextVNode(". ")
280
- ]),
281
- !unref(isDesktop) ? (openBlock(), createBlock("p", { key: 0 }, [
282
- createTextVNode(" Generate a key in "),
283
- createVNode("strong", null, "Settings → Users → [your account] → API keys"),
284
- createTextVNode(", then replace "),
285
- createVNode("code", { class: "px-1 py-0.5 bg-muted rounded text-xs font-mono" }, "pd_YOUR_API_KEY"),
286
- createTextVNode(" in the snippets below. ")
287
- ])) : (openBlock(), createBlock("p", { key: 1 }, [
288
- createTextVNode(" This app provides a local access token automatically — see "),
289
- createVNode("strong", null, "Connect an AI assistant (MCP)"),
290
- createTextVNode(" above. Use it wherever the snippets show "),
291
- createVNode("code", { class: "px-1 py-0.5 bg-muted rounded text-xs font-mono" }, "pd_YOUR_API_KEY"),
292
- createTextVNode(". ")
293
- ])),
294
- !unref(isDesktop) ? (openBlock(), createBlock("p", {
295
- key: 2,
296
- class: "text-xs text-gray-400"
297
- }, [
298
- createTextVNode(" When authentication is disabled ("),
299
- createVNode("code", { class: "font-mono" }, "PIWI_AUTH_ENABLED"),
300
- createTextVNode(" not set), any request is accepted without a key. ")
301
- ])) : (openBlock(), createBlock("p", {
302
- key: 3,
303
- class: "text-xs text-gray-400"
304
- }, [
305
- createTextVNode(" This desktop app keeps sign-in off but still requires its own local access token on every request — use the token shown above as the "),
306
- createVNode("code", { class: "font-mono" }, "Bearer"),
307
- createTextVNode(" value. The endpoint is not open. ")
308
- ]))
309
- ])
310
- ];
311
- }
312
- }),
313
- _: 1
314
- }, _parent2, _scopeId));
315
209
  _push2(ssrRenderComponent(_component_SectionCard, {
316
210
  icon: "i-lucide-settings-2",
317
211
  title: "Client setup",
@@ -319,13 +213,36 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
319
213
  }, {
320
214
  default: withCtx((_2, _push3, _parent3, _scopeId2) => {
321
215
  if (_push3) {
322
- _push3(`<p class="text-sm text-gray-500 dark:text-gray-400 mb-4"${_scopeId2}> Replace <code class="px-1 py-0.5 bg-muted rounded text-xs font-mono"${_scopeId2}>pd_YOUR_API_KEY</code> with `);
323
- if (unref(isDesktop)) {
324
- _push3(`<!--[-->this app&#39;s access token (shown above)<!--]-->`);
216
+ if (unref(reporterConfig)) {
217
+ _push3(`<div class="mb-4 space-y-3 rounded-md border border-default bg-elevated/50 p-3"${_scopeId2}><div class="space-y-1"${_scopeId2}><div class="text-xs text-muted"${_scopeId2}>MCP URL</div><div class="flex items-start gap-2"${_scopeId2}><code class="text-xs break-all flex-1"${_scopeId2}>${ssrInterpolate(unref(mcpUrl))}</code>`);
218
+ _push3(ssrRenderComponent(_component_UButton, {
219
+ icon: "i-lucide-copy",
220
+ color: "neutral",
221
+ variant: "ghost",
222
+ size: "xs",
223
+ "aria-label": "Copy MCP URL",
224
+ onClick: ($event) => unref(copy)(unref(mcpUrl), { toast: true })
225
+ }, null, _parent3, _scopeId2));
226
+ _push3(`</div></div><div class="space-y-1"${_scopeId2}><div class="text-xs text-muted"${_scopeId2}>Access token</div><div class="flex items-start gap-2"${_scopeId2}><code class="text-xs break-all flex-1"${_scopeId2}>${ssrInterpolate(unref(bearerToken))}</code>`);
227
+ _push3(ssrRenderComponent(_component_UButton, {
228
+ icon: "i-lucide-copy",
229
+ color: "neutral",
230
+ variant: "ghost",
231
+ size: "xs",
232
+ "aria-label": "Copy access token",
233
+ onClick: ($event) => unref(copy)(unref(bearerToken), { toast: true })
234
+ }, null, _parent3, _scopeId2));
235
+ _push3(`</div></div><p class="text-xs text-muted"${_scopeId2}> This app authenticates with a local access token even though sign-in is off — it is the <code class="font-mono"${_scopeId2}>Bearer</code> value, already filled into the snippets below. </p></div>`);
325
236
  } else {
326
- _push3(`<!--[-->your actual API key<!--]-->`);
237
+ _push3(`<!---->`);
327
238
  }
328
- _push3(`. The MCP URL shown below is auto-detected from your current browser origin. </p>`);
239
+ _push3(`<p class="text-sm text-gray-500 dark:text-gray-400 mb-4"${_scopeId2}>`);
240
+ if (unref(reporterConfig)) {
241
+ _push3(`<!--[-->Pick your client below — the URL and access token above are already baked into each snippet.<!--]-->`);
242
+ } else {
243
+ _push3(`<!--[-->Replace <code class="px-1 py-0.5 bg-muted rounded text-xs font-mono"${_scopeId2}>pd_YOUR_API_KEY</code> with your actual API key. The MCP URL shown in the snippets is auto-detected from your current browser origin.<!--]-->`);
244
+ }
245
+ _push3(`</p>`);
329
246
  _push3(ssrRenderComponent(_component_UTabs, {
330
247
  items: clientItems,
331
248
  ui: { list: "mb-4" }
@@ -493,16 +410,52 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
493
410
  }, _parent3, _scopeId2));
494
411
  } else {
495
412
  return [
413
+ unref(reporterConfig) ? (openBlock(), createBlock("div", {
414
+ key: 0,
415
+ class: "mb-4 space-y-3 rounded-md border border-default bg-elevated/50 p-3"
416
+ }, [
417
+ createVNode("div", { class: "space-y-1" }, [
418
+ createVNode("div", { class: "text-xs text-muted" }, "MCP URL"),
419
+ createVNode("div", { class: "flex items-start gap-2" }, [
420
+ createVNode("code", { class: "text-xs break-all flex-1" }, toDisplayString(unref(mcpUrl)), 1),
421
+ createVNode(_component_UButton, {
422
+ icon: "i-lucide-copy",
423
+ color: "neutral",
424
+ variant: "ghost",
425
+ size: "xs",
426
+ "aria-label": "Copy MCP URL",
427
+ onClick: ($event) => unref(copy)(unref(mcpUrl), { toast: true })
428
+ }, null, 8, ["onClick"])
429
+ ])
430
+ ]),
431
+ createVNode("div", { class: "space-y-1" }, [
432
+ createVNode("div", { class: "text-xs text-muted" }, "Access token"),
433
+ createVNode("div", { class: "flex items-start gap-2" }, [
434
+ createVNode("code", { class: "text-xs break-all flex-1" }, toDisplayString(unref(bearerToken)), 1),
435
+ createVNode(_component_UButton, {
436
+ icon: "i-lucide-copy",
437
+ color: "neutral",
438
+ variant: "ghost",
439
+ size: "xs",
440
+ "aria-label": "Copy access token",
441
+ onClick: ($event) => unref(copy)(unref(bearerToken), { toast: true })
442
+ }, null, 8, ["onClick"])
443
+ ])
444
+ ]),
445
+ createVNode("p", { class: "text-xs text-muted" }, [
446
+ createTextVNode(" This app authenticates with a local access token even though sign-in is off — it is the "),
447
+ createVNode("code", { class: "font-mono" }, "Bearer"),
448
+ createTextVNode(" value, already filled into the snippets below. ")
449
+ ])
450
+ ])) : createCommentVNode("", true),
496
451
  createVNode("p", { class: "text-sm text-gray-500 dark:text-gray-400 mb-4" }, [
497
- createTextVNode(" Replace "),
498
- createVNode("code", { class: "px-1 py-0.5 bg-muted rounded text-xs font-mono" }, "pd_YOUR_API_KEY"),
499
- createTextVNode(" with "),
500
- unref(isDesktop) ? (openBlock(), createBlock(Fragment, { key: 0 }, [
501
- createTextVNode("this app's access token (shown above)")
452
+ unref(reporterConfig) ? (openBlock(), createBlock(Fragment, { key: 0 }, [
453
+ createTextVNode("Pick your client below the URL and access token above are already baked into each snippet.")
502
454
  ], 64)) : (openBlock(), createBlock(Fragment, { key: 1 }, [
503
- createTextVNode("your actual API key")
504
- ], 64)),
505
- createTextVNode(". The MCP URL shown below is auto-detected from your current browser origin. ")
455
+ createTextVNode("Replace "),
456
+ createVNode("code", { class: "px-1 py-0.5 bg-muted rounded text-xs font-mono" }, "pd_YOUR_API_KEY"),
457
+ createTextVNode(" with your actual API key. The MCP URL shown in the snippets is auto-detected from your current browser origin.")
458
+ ], 64))
506
459
  ]),
507
460
  createVNode(_component_UTabs, {
508
461
  items: clientItems,
@@ -608,6 +561,106 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
608
561
  }),
609
562
  _: 1
610
563
  }, _parent2, _scopeId));
564
+ _push2(ssrRenderComponent(_component_SectionCard, {
565
+ icon: "i-lucide-bot",
566
+ title: "What it provides",
567
+ help: "mcp.tools"
568
+ }, {
569
+ default: withCtx((_2, _push3, _parent3, _scopeId2) => {
570
+ if (_push3) {
571
+ _push3(`<div class="flex flex-col gap-1.5"${_scopeId2}><!--[-->`);
572
+ ssrRenderList(unref(tools), (t) => {
573
+ _push3(`<div class="flex items-start gap-3 px-3 py-2.5 rounded-md bg-elevated/50 border border-default hover:bg-elevated transition-colors"${_scopeId2}>`);
574
+ _push3(ssrRenderComponent(_component_UIcon, {
575
+ name: "i-lucide-wrench",
576
+ class: "size-4 mt-0.5 shrink-0 text-primary"
577
+ }, null, _parent3, _scopeId2));
578
+ _push3(`<div class="min-w-0"${_scopeId2}><p class="text-sm font-mono font-semibold text-foreground"${_scopeId2}>${ssrInterpolate(t.name)}</p><p class="text-xs text-gray-500 dark:text-gray-400 mt-0.5"${_scopeId2}>${ssrInterpolate(t.description)}</p></div></div>`);
579
+ });
580
+ _push3(`<!--]--></div>`);
581
+ } else {
582
+ return [
583
+ createVNode("div", { class: "flex flex-col gap-1.5" }, [
584
+ (openBlock(true), createBlock(Fragment, null, renderList(unref(tools), (t) => {
585
+ return openBlock(), createBlock("div", {
586
+ key: t.name,
587
+ class: "flex items-start gap-3 px-3 py-2.5 rounded-md bg-elevated/50 border border-default hover:bg-elevated transition-colors"
588
+ }, [
589
+ createVNode(_component_UIcon, {
590
+ name: "i-lucide-wrench",
591
+ class: "size-4 mt-0.5 shrink-0 text-primary"
592
+ }),
593
+ createVNode("div", { class: "min-w-0" }, [
594
+ createVNode("p", { class: "text-sm font-mono font-semibold text-foreground" }, toDisplayString(t.name), 1),
595
+ createVNode("p", { class: "text-xs text-gray-500 dark:text-gray-400 mt-0.5" }, toDisplayString(t.description), 1)
596
+ ])
597
+ ]);
598
+ }), 128))
599
+ ])
600
+ ];
601
+ }
602
+ }),
603
+ _: 1
604
+ }, _parent2, _scopeId));
605
+ _push2(ssrRenderComponent(_component_SectionCard, {
606
+ icon: "i-lucide-key",
607
+ title: "Authentication",
608
+ help: "mcp.auth"
609
+ }, {
610
+ default: withCtx((_2, _push3, _parent3, _scopeId2) => {
611
+ if (_push3) {
612
+ _push3(`<div class="space-y-3 text-sm text-gray-600 dark:text-gray-400"${_scopeId2}><p${_scopeId2}> MCP requests are authenticated with the same API keys used by the REST API. API keys start with <code class="px-1 py-0.5 bg-muted rounded text-xs font-mono"${_scopeId2}>pd_</code>. </p>`);
613
+ if (!unref(isDesktop)) {
614
+ _push3(`<p${_scopeId2}> Generate a key in <strong${_scopeId2}>Settings → Users → [your account] → API keys</strong>, then replace <code class="px-1 py-0.5 bg-muted rounded text-xs font-mono"${_scopeId2}>pd_YOUR_API_KEY</code> in the snippets above. </p>`);
615
+ } else {
616
+ _push3(`<p${_scopeId2}> This app provides a local access token automatically — shown in <strong${_scopeId2}>Client setup</strong> above and already filled into every snippet, so there is nothing to replace. </p>`);
617
+ }
618
+ if (!unref(isDesktop)) {
619
+ _push3(`<p class="text-xs text-gray-400"${_scopeId2}> When authentication is disabled (<code class="font-mono"${_scopeId2}>PIWI_AUTH_ENABLED</code> not set), any request is accepted without a key. </p>`);
620
+ } else {
621
+ _push3(`<p class="text-xs text-gray-400"${_scopeId2}> This desktop app keeps sign-in off but still requires its own local access token on every request — it is the <code class="font-mono"${_scopeId2}>Bearer</code> value. The endpoint is not open. </p>`);
622
+ }
623
+ _push3(`</div>`);
624
+ } else {
625
+ return [
626
+ createVNode("div", { class: "space-y-3 text-sm text-gray-600 dark:text-gray-400" }, [
627
+ createVNode("p", null, [
628
+ createTextVNode(" MCP requests are authenticated with the same API keys used by the REST API. API keys start with "),
629
+ createVNode("code", { class: "px-1 py-0.5 bg-muted rounded text-xs font-mono" }, "pd_"),
630
+ createTextVNode(". ")
631
+ ]),
632
+ !unref(isDesktop) ? (openBlock(), createBlock("p", { key: 0 }, [
633
+ createTextVNode(" Generate a key in "),
634
+ createVNode("strong", null, "Settings → Users → [your account] → API keys"),
635
+ createTextVNode(", then replace "),
636
+ createVNode("code", { class: "px-1 py-0.5 bg-muted rounded text-xs font-mono" }, "pd_YOUR_API_KEY"),
637
+ createTextVNode(" in the snippets above. ")
638
+ ])) : (openBlock(), createBlock("p", { key: 1 }, [
639
+ createTextVNode(" This app provides a local access token automatically — shown in "),
640
+ createVNode("strong", null, "Client setup"),
641
+ createTextVNode(" above and already filled into every snippet, so there is nothing to replace. ")
642
+ ])),
643
+ !unref(isDesktop) ? (openBlock(), createBlock("p", {
644
+ key: 2,
645
+ class: "text-xs text-gray-400"
646
+ }, [
647
+ createTextVNode(" When authentication is disabled ("),
648
+ createVNode("code", { class: "font-mono" }, "PIWI_AUTH_ENABLED"),
649
+ createTextVNode(" not set), any request is accepted without a key. ")
650
+ ])) : (openBlock(), createBlock("p", {
651
+ key: 3,
652
+ class: "text-xs text-gray-400"
653
+ }, [
654
+ createTextVNode(" This desktop app keeps sign-in off but still requires its own local access token on every request — it is the "),
655
+ createVNode("code", { class: "font-mono" }, "Bearer"),
656
+ createTextVNode(" value. The endpoint is not open. ")
657
+ ]))
658
+ ])
659
+ ];
660
+ }
661
+ }),
662
+ _: 1
663
+ }, _parent2, _scopeId));
611
664
  _push2(ssrRenderComponent(_component_SectionCard, {
612
665
  icon: "i-lucide-link",
613
666
  title: "Server URL"
@@ -691,97 +744,58 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
691
744
  title: "Feature preview",
692
745
  description: "The MCP endpoint is not active in this demo — it requires a real Piwi backend. The tools and client setup shown below reflect what your own deployment exposes."
693
746
  })) : createCommentVNode("", true),
694
- unref(reporterConfig) ? (openBlock(), createBlock(_component_DesktopMcpCard, {
695
- key: 1,
696
- url: unref(reporterConfig).url,
697
- token: unref(reporterConfig).token
698
- }, null, 8, ["url", "token"])) : createCommentVNode("", true),
699
- createVNode(_component_SectionCard, {
700
- icon: "i-lucide-bot",
701
- title: "What it provides",
702
- help: "mcp.tools"
703
- }, {
704
- default: withCtx(() => [
705
- createVNode("div", { class: "flex flex-col gap-1.5" }, [
706
- (openBlock(true), createBlock(Fragment, null, renderList(unref(tools), (t) => {
707
- return openBlock(), createBlock("div", {
708
- key: t.name,
709
- class: "flex items-start gap-3 px-3 py-2.5 rounded-md bg-elevated/50 border border-default hover:bg-elevated transition-colors"
710
- }, [
711
- createVNode(_component_UIcon, {
712
- name: "i-lucide-wrench",
713
- class: "size-4 mt-0.5 shrink-0 text-primary"
714
- }),
715
- createVNode("div", { class: "min-w-0" }, [
716
- createVNode("p", { class: "text-sm font-mono font-semibold text-foreground" }, toDisplayString(t.name), 1),
717
- createVNode("p", { class: "text-xs text-gray-500 dark:text-gray-400 mt-0.5" }, toDisplayString(t.description), 1)
718
- ])
719
- ]);
720
- }), 128))
721
- ])
722
- ]),
723
- _: 1
724
- }),
725
- createVNode(_component_SectionCard, {
726
- icon: "i-lucide-key",
727
- title: "Authentication",
728
- help: "mcp.auth"
729
- }, {
730
- default: withCtx(() => [
731
- createVNode("div", { class: "space-y-3 text-sm text-gray-600 dark:text-gray-400" }, [
732
- createVNode("p", null, [
733
- createTextVNode(" MCP requests are authenticated with the same API keys used by the REST API. API keys start with "),
734
- createVNode("code", { class: "px-1 py-0.5 bg-muted rounded text-xs font-mono" }, "pd_"),
735
- createTextVNode(". ")
736
- ]),
737
- !unref(isDesktop) ? (openBlock(), createBlock("p", { key: 0 }, [
738
- createTextVNode(" Generate a key in "),
739
- createVNode("strong", null, "Settings → Users → [your account] → API keys"),
740
- createTextVNode(", then replace "),
741
- createVNode("code", { class: "px-1 py-0.5 bg-muted rounded text-xs font-mono" }, "pd_YOUR_API_KEY"),
742
- createTextVNode(" in the snippets below. ")
743
- ])) : (openBlock(), createBlock("p", { key: 1 }, [
744
- createTextVNode(" This app provides a local access token automatically — see "),
745
- createVNode("strong", null, "Connect an AI assistant (MCP)"),
746
- createTextVNode(" above. Use it wherever the snippets show "),
747
- createVNode("code", { class: "px-1 py-0.5 bg-muted rounded text-xs font-mono" }, "pd_YOUR_API_KEY"),
748
- createTextVNode(". ")
749
- ])),
750
- !unref(isDesktop) ? (openBlock(), createBlock("p", {
751
- key: 2,
752
- class: "text-xs text-gray-400"
753
- }, [
754
- createTextVNode(" When authentication is disabled ("),
755
- createVNode("code", { class: "font-mono" }, "PIWI_AUTH_ENABLED"),
756
- createTextVNode(" not set), any request is accepted without a key. ")
757
- ])) : (openBlock(), createBlock("p", {
758
- key: 3,
759
- class: "text-xs text-gray-400"
760
- }, [
761
- createTextVNode(" This desktop app keeps sign-in off but still requires its own local access token on every request — use the token shown above as the "),
762
- createVNode("code", { class: "font-mono" }, "Bearer"),
763
- createTextVNode(" value. The endpoint is not open. ")
764
- ]))
765
- ])
766
- ]),
767
- _: 1
768
- }),
769
747
  createVNode(_component_SectionCard, {
770
748
  icon: "i-lucide-settings-2",
771
749
  title: "Client setup",
772
750
  help: "mcp.client-setup"
773
751
  }, {
774
752
  default: withCtx(() => [
753
+ unref(reporterConfig) ? (openBlock(), createBlock("div", {
754
+ key: 0,
755
+ class: "mb-4 space-y-3 rounded-md border border-default bg-elevated/50 p-3"
756
+ }, [
757
+ createVNode("div", { class: "space-y-1" }, [
758
+ createVNode("div", { class: "text-xs text-muted" }, "MCP URL"),
759
+ createVNode("div", { class: "flex items-start gap-2" }, [
760
+ createVNode("code", { class: "text-xs break-all flex-1" }, toDisplayString(unref(mcpUrl)), 1),
761
+ createVNode(_component_UButton, {
762
+ icon: "i-lucide-copy",
763
+ color: "neutral",
764
+ variant: "ghost",
765
+ size: "xs",
766
+ "aria-label": "Copy MCP URL",
767
+ onClick: ($event) => unref(copy)(unref(mcpUrl), { toast: true })
768
+ }, null, 8, ["onClick"])
769
+ ])
770
+ ]),
771
+ createVNode("div", { class: "space-y-1" }, [
772
+ createVNode("div", { class: "text-xs text-muted" }, "Access token"),
773
+ createVNode("div", { class: "flex items-start gap-2" }, [
774
+ createVNode("code", { class: "text-xs break-all flex-1" }, toDisplayString(unref(bearerToken)), 1),
775
+ createVNode(_component_UButton, {
776
+ icon: "i-lucide-copy",
777
+ color: "neutral",
778
+ variant: "ghost",
779
+ size: "xs",
780
+ "aria-label": "Copy access token",
781
+ onClick: ($event) => unref(copy)(unref(bearerToken), { toast: true })
782
+ }, null, 8, ["onClick"])
783
+ ])
784
+ ]),
785
+ createVNode("p", { class: "text-xs text-muted" }, [
786
+ createTextVNode(" This app authenticates with a local access token even though sign-in is off — it is the "),
787
+ createVNode("code", { class: "font-mono" }, "Bearer"),
788
+ createTextVNode(" value, already filled into the snippets below. ")
789
+ ])
790
+ ])) : createCommentVNode("", true),
775
791
  createVNode("p", { class: "text-sm text-gray-500 dark:text-gray-400 mb-4" }, [
776
- createTextVNode(" Replace "),
777
- createVNode("code", { class: "px-1 py-0.5 bg-muted rounded text-xs font-mono" }, "pd_YOUR_API_KEY"),
778
- createTextVNode(" with "),
779
- unref(isDesktop) ? (openBlock(), createBlock(Fragment, { key: 0 }, [
780
- createTextVNode("this app's access token (shown above)")
792
+ unref(reporterConfig) ? (openBlock(), createBlock(Fragment, { key: 0 }, [
793
+ createTextVNode("Pick your client below the URL and access token above are already baked into each snippet.")
781
794
  ], 64)) : (openBlock(), createBlock(Fragment, { key: 1 }, [
782
- createTextVNode("your actual API key")
783
- ], 64)),
784
- createTextVNode(". The MCP URL shown below is auto-detected from your current browser origin. ")
795
+ createTextVNode("Replace "),
796
+ createVNode("code", { class: "px-1 py-0.5 bg-muted rounded text-xs font-mono" }, "pd_YOUR_API_KEY"),
797
+ createTextVNode(" with your actual API key. The MCP URL shown in the snippets is auto-detected from your current browser origin.")
798
+ ], 64))
785
799
  ]),
786
800
  createVNode(_component_UTabs, {
787
801
  items: clientItems,
@@ -885,6 +899,74 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
885
899
  ]),
886
900
  _: 1
887
901
  }),
902
+ createVNode(_component_SectionCard, {
903
+ icon: "i-lucide-bot",
904
+ title: "What it provides",
905
+ help: "mcp.tools"
906
+ }, {
907
+ default: withCtx(() => [
908
+ createVNode("div", { class: "flex flex-col gap-1.5" }, [
909
+ (openBlock(true), createBlock(Fragment, null, renderList(unref(tools), (t) => {
910
+ return openBlock(), createBlock("div", {
911
+ key: t.name,
912
+ class: "flex items-start gap-3 px-3 py-2.5 rounded-md bg-elevated/50 border border-default hover:bg-elevated transition-colors"
913
+ }, [
914
+ createVNode(_component_UIcon, {
915
+ name: "i-lucide-wrench",
916
+ class: "size-4 mt-0.5 shrink-0 text-primary"
917
+ }),
918
+ createVNode("div", { class: "min-w-0" }, [
919
+ createVNode("p", { class: "text-sm font-mono font-semibold text-foreground" }, toDisplayString(t.name), 1),
920
+ createVNode("p", { class: "text-xs text-gray-500 dark:text-gray-400 mt-0.5" }, toDisplayString(t.description), 1)
921
+ ])
922
+ ]);
923
+ }), 128))
924
+ ])
925
+ ]),
926
+ _: 1
927
+ }),
928
+ createVNode(_component_SectionCard, {
929
+ icon: "i-lucide-key",
930
+ title: "Authentication",
931
+ help: "mcp.auth"
932
+ }, {
933
+ default: withCtx(() => [
934
+ createVNode("div", { class: "space-y-3 text-sm text-gray-600 dark:text-gray-400" }, [
935
+ createVNode("p", null, [
936
+ createTextVNode(" MCP requests are authenticated with the same API keys used by the REST API. API keys start with "),
937
+ createVNode("code", { class: "px-1 py-0.5 bg-muted rounded text-xs font-mono" }, "pd_"),
938
+ createTextVNode(". ")
939
+ ]),
940
+ !unref(isDesktop) ? (openBlock(), createBlock("p", { key: 0 }, [
941
+ createTextVNode(" Generate a key in "),
942
+ createVNode("strong", null, "Settings → Users → [your account] → API keys"),
943
+ createTextVNode(", then replace "),
944
+ createVNode("code", { class: "px-1 py-0.5 bg-muted rounded text-xs font-mono" }, "pd_YOUR_API_KEY"),
945
+ createTextVNode(" in the snippets above. ")
946
+ ])) : (openBlock(), createBlock("p", { key: 1 }, [
947
+ createTextVNode(" This app provides a local access token automatically — shown in "),
948
+ createVNode("strong", null, "Client setup"),
949
+ createTextVNode(" above and already filled into every snippet, so there is nothing to replace. ")
950
+ ])),
951
+ !unref(isDesktop) ? (openBlock(), createBlock("p", {
952
+ key: 2,
953
+ class: "text-xs text-gray-400"
954
+ }, [
955
+ createTextVNode(" When authentication is disabled ("),
956
+ createVNode("code", { class: "font-mono" }, "PIWI_AUTH_ENABLED"),
957
+ createTextVNode(" not set), any request is accepted without a key. ")
958
+ ])) : (openBlock(), createBlock("p", {
959
+ key: 3,
960
+ class: "text-xs text-gray-400"
961
+ }, [
962
+ createTextVNode(" This desktop app keeps sign-in off but still requires its own local access token on every request — it is the "),
963
+ createVNode("code", { class: "font-mono" }, "Bearer"),
964
+ createTextVNode(" value. The endpoint is not open. ")
965
+ ]))
966
+ ])
967
+ ]),
968
+ _: 1
969
+ }),
888
970
  createVNode(_component_SectionCard, {
889
971
  icon: "i-lucide-link",
890
972
  title: "Server URL"
@@ -941,4 +1023,4 @@ _sfc_main.setup = (props, ctx) => {
941
1023
  };
942
1024
 
943
1025
  export { _sfc_main as default };
944
- //# sourceMappingURL=mcp-CQ-21rwc.mjs.map
1026
+ //# sourceMappingURL=mcp-_o6cMS6m.mjs.map